[hdf5] 04/17: New upstream version 1.10.1+docs

Gilles Filippini pini at debian.org
Thu Dec 21 22:06:34 UTC 2017


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

pini pushed a commit to branch master
in repository hdf5.

commit 173f2a14e355464971e13898a156b2b030ffd453
Author: Gilles Filippini <pini at debian.org>
Date:   Tue Oct 3 23:50:13 2017 +0200

    New upstream version 1.10.1+docs
---
 ACKNOWLEDGMENTS                                    |    14 +-
 CMakeFilters.cmake                                 |    86 +-
 CMakeInstallation.cmake                            |   196 +-
 CMakeLists.txt                                     |   350 +-
 COPYING                                            |    18 +-
 COPYING_LBNL_HDF5                                  |    49 +
 CTestConfig.cmake                                  |    19 +-
 MANIFEST                                           |  1440 ++-
 Makefile                                           |    10 +-
 Makefile.am                                        |    10 +-
 Makefile.dist                                      |    10 +-
 Makefile.in                                        |    12 +-
 README.txt                                         |     2 +-
 UserMacros.cmake                                   |    18 +-
 acsite.m4                                          |    11 +-
 autogen.sh                                         |    10 +-
 bin/COPYING                                        |    11 +-
 bin/buildhdf5                                      |    10 +-
 bin/chkmanifest                                    |    40 +-
 bin/dependencies                                   |    10 +-
 bin/deploy                                         |    10 +-
 bin/distdep                                        |    10 +-
 bin/genparser                                      |    10 +-
 bin/h5vers                                         |   120 +-
 bin/iostats                                        |    10 +-
 bin/locate_sw                                      |    10 +-
 bin/make_err                                       |    20 +-
 bin/make_overflow                                  |    20 +-
 bin/make_vers                                      |    20 +-
 bin/mkdirs                                         |    10 +-
 bin/newer                                          |    10 +-
 bin/output_filter.sh                               |    25 +-
 bin/release                                        |   257 +-
 bin/restore.sh                                     |    65 +
 bin/snapshot                                       |   564 +-
 bin/trace                                          |   118 +-
 bin/yodconfigure                                   |    11 +-
 c++/CMakeLists.txt                                 |     8 +-
 c++/COPYING                                        |    11 +-
 c++/Makefile.am                                    |    10 +-
 c++/Makefile.in                                    |    21 +-
 c++/examples/CMakeLists.txt                        |    12 +-
 c++/examples/CMakeTests.cmake                      |    60 +-
 c++/examples/Makefile.am                           |    10 +-
 c++/examples/Makefile.in                           |    21 +-
 c++/examples/chunks.cpp                            |    26 +-
 c++/examples/compound.cpp                          |    26 +-
 c++/examples/create.cpp                            |    17 +-
 c++/examples/extend_ds.cpp                         |    24 +-
 c++/examples/h5group.cpp                           |    26 +-
 c++/examples/h5tutr_cmprss.cpp                     |    23 +-
 c++/examples/h5tutr_crtatt.cpp                     |    16 +-
 c++/examples/h5tutr_crtdat.cpp                     |    16 +-
 c++/examples/h5tutr_crtgrp.cpp                     |    23 +-
 c++/examples/h5tutr_crtgrpar.cpp                   |    23 +-
 c++/examples/h5tutr_crtgrpd.cpp                    |    23 +-
 c++/examples/h5tutr_extend.cpp                     |    23 +-
 c++/examples/h5tutr_rdwt.cpp                       |    16 +-
 c++/examples/h5tutr_subset.cpp                     |    23 +-
 c++/examples/readdata.cpp                          |    26 +-
 c++/examples/run-c++-ex.sh.in                      |    10 +-
 c++/examples/testh5c++.sh.in                       |    10 +-
 c++/examples/writedata.cpp                         |    26 +-
 c++/src/CMakeLists.txt                             |    18 +-
 c++/src/H5AbstractDs.cpp                           |   463 +-
 c++/src/H5AbstractDs.h                             |    88 +-
 c++/src/H5Alltypes.h                               |    12 +-
 c++/src/H5ArrayType.cpp                            |   263 +-
 c++/src/H5ArrayType.h                              |    68 +-
 c++/src/H5AtomType.cpp                             |   379 +-
 c++/src/H5AtomType.h                               |    84 +-
 c++/src/H5Attribute.cpp                            |   582 +-
 c++/src/H5Attribute.h                              |   131 +-
 c++/src/H5Classes.h                                |    66 +-
 c++/src/H5CommonFG.cpp                             |  1366 +-
 c++/src/H5CommonFG.h                               |   190 +-
 c++/src/H5CompType.cpp                             |   599 +-
 c++/src/H5CompType.h                               |   145 +-
 c++/src/H5Cpp.h                                    |    23 +-
 c++/src/H5CppDoc.h                                 |    28 +-
 c++/src/H5DataSet.cpp                              |   877 +-
 c++/src/H5DataSet.h                                |   142 +-
 c++/src/H5DataSpace.cpp                            |   828 +-
 c++/src/H5DataSpace.h                              |   177 +-
 c++/src/H5DataType.cpp                             |  1035 +-
 c++/src/H5DataType.h                               |   189 +-
 c++/src/H5DcreatProp.cpp                           |   987 +-
 c++/src/H5DcreatProp.h                             |   173 +-
 c++/src/H5DxferProp.cpp                            |   605 +-
 c++/src/H5DxferProp.h                              |   154 +-
 c++/src/H5EnumType.cpp                             |   373 +-
 c++/src/H5EnumType.h                               |    97 +-
 c++/src/H5Exception.cpp                            |   665 +-
 c++/src/H5Exception.h                              |   173 +-
 c++/src/H5FaccProp.cpp                             |   917 +-
 c++/src/H5FaccProp.h                               |   205 +-
 c++/src/H5FcreatProp.cpp                           |   393 +-
 c++/src/H5FcreatProp.h                             |   117 +-
 c++/src/H5File.cpp                                 |   783 +-
 c++/src/H5File.h                                   |   155 +-
 c++/src/H5FloatType.cpp                            |   419 +-
 c++/src/H5FloatType.h                              |    90 +-
 c++/src/H5Group.cpp                                |   273 +-
 c++/src/H5Group.h                                  |    92 +-
 c++/src/H5IdComponent.cpp                          |   445 +-
 c++/src/H5IdComponent.h                            |   132 +-
 c++/src/H5Include.h                                |    14 +-
 c++/src/H5IntType.cpp                              |   184 +-
 c++/src/H5IntType.h                                |    66 +-
 c++/src/H5LaccProp.cpp                             |   149 +
 c++/src/H5LaccProp.h                               |    72 +
 c++/src/H5Library.cpp                              |   243 +-
 c++/src/H5Library.h                                |    60 +-
 c++/src/H5Location.cpp                             |  2128 ++--
 c++/src/H5Location.h                               |   304 +-
 c++/src/H5Object.cpp                               |   376 +-
 c++/src/H5Object.h                                 |   139 +-
 c++/src/H5OcreatProp.cpp                           |   138 +-
 c++/src/H5OcreatProp.h                             |    67 +-
 c++/src/H5PredType.cpp                             |   471 +-
 c++/src/H5PredType.h                               |   348 +-
 c++/src/H5PropList.cpp                             |   850 +-
 c++/src/H5PropList.h                               |   171 +-
 c++/src/H5StrType.cpp                              |   347 +-
 c++/src/H5StrType.h                                |    80 +-
 c++/src/H5VarLenType.cpp                           |   110 +-
 c++/src/H5VarLenType.h                             |    56 +-
 c++/src/Makefile.am                                |    37 +-
 c++/src/Makefile.in                                |   120 +-
 c++/src/cpp_doc_config                             |     2 +-
 c++/src/h5c++.in                                   |    12 +-
 c++/src/header.html                                |    10 +-
 c++/test/CMakeLists.txt                            |    14 +-
 c++/test/CMakeTests.cmake                          |    55 +-
 c++/test/H5srcdir_str.h.in                         |    10 +-
 c++/test/Makefile.am                               |    12 +-
 c++/test/Makefile.in                               |    41 +-
 c++/test/dsets.cpp                                 |  1780 +--
 c++/test/h5cpputil.cpp                             |   187 +-
 c++/test/h5cpputil.h                               |    94 +-
 c++/test/tarray.cpp                                |   531 +-
 c++/test/tattr.cpp                                 |  2161 ++--
 c++/test/tcompound.cpp                             |  1021 +-
 c++/test/tdspl.cpp                                 |   160 +-
 c++/test/testhdf5.cpp                              |   126 +-
 c++/test/tfile.cpp                                 |   928 +-
 c++/test/tfilter.cpp                               |   128 +-
 c++/test/th5s.cpp                                  |   625 +-
 c++/test/th5s.h5                                   |   Bin 2049 -> 2049 bytes
 c++/test/titerate.cpp                              |   527 +
 c++/test/tlinks.cpp                                |   404 +-
 c++/test/tobject.cpp                               |   631 +-
 c++/test/trefer.cpp                                |  1099 +-
 c++/test/ttypes.cpp                                |   682 +-
 c++/test/tvlstr.cpp                                |  1086 +-
 config/BlankForm                                   |    10 +-
 config/COPYING                                     |    11 +-
 config/Makefile.am.blank                           |    10 +-
 config/apple                                       |    10 +-
 config/cce-fflags                                  |    10 +-
 config/cce-flags                                   |    10 +-
 config/cmake/CMakeFindJavaCommon.cmake             |    14 +-
 config/cmake/CTestCustom.cmake                     |    17 +
 config/cmake/CTestScript.cmake                     |   163 +
 config/cmake/ConfigureChecks.cmake                 |   113 +-
 config/cmake/ConversionTests.c                     |    11 +
 config/cmake/FindHDF5.cmake.in                     |    86 -
 config/cmake/FindHDFJAVA.cmake.in                  |    23 +-
 config/cmake/FindJNI.cmake                         |    59 +-
 config/cmake/H5cxx_config.h.in                     |    11 +
 config/cmake/H5pubconf.h.in                        |   120 +-
 config/cmake/HDF518_Examples.cmake.in              |   119 +-
 config/cmake/HDF5Macros.cmake                      |    35 +-
 config/cmake/HDF5UseFortran.cmake                  |   403 +-
 config/cmake/HDF5_Examples.cmake.in                |   248 +-
 config/cmake/HDF5_Examples_options.cmake           |    59 +
 config/cmake/HDF5_Process_Flex_Files.cmake         |    15 +-
 config/cmake/HDFCompilerFlags.cmake                |   211 +-
 config/cmake/README.txt.cmake.in                   |     4 +-
 config/cmake/UseJava.cmake                         |   188 +-
 config/cmake/UseJavaClassFilelist.cmake            |    15 +-
 config/cmake/UseJavaSymlinks.cmake                 |    15 +-
 config/cmake/UserMacros/Windows_MT.cmake           |    30 +-
 config/cmake/cacheinit.cmake                       |    19 +-
 config/cmake/hdf5-config-version.cmake.in          |    41 +-
 config/cmake/hdf5-config.cmake.in                  |    17 +-
 config/cmake/jrunTest.cmake                        |   190 +-
 config/cmake/mccacheinit.cmake                     |    21 +-
 config/cmake/scripts/CTestScript.cmake             |   405 +-
 config/cmake/scripts/HDF5config.cmake              |   416 +-
 config/cmake/scripts/HDF5options.cmake             |    52 +
 config/cmake/userblockTest.cmake                   |    45 +-
 config/cmake/vfdTest.cmake                         |    56 +-
 config/cmake_ext_mod/CheckTypeSize.cmake           |    35 +-
 config/cmake_ext_mod/ConfigureChecks.cmake         |   249 +-
 config/cmake_ext_mod/FindMPI.cmake                 |   101 +-
 config/cmake_ext_mod/FindSZIP.cmake                |    55 +-
 config/cmake_ext_mod/GetTimeOfDayTest.cpp          |    11 +
 config/cmake_ext_mod/HDFCXXTests.cpp               |    46 +
 config/cmake_ext_mod/HDFLibMacros.cmake            |    65 +-
 config/cmake_ext_mod/HDFMacros.cmake               |   193 +-
 config/cmake_ext_mod/HDFTests.c                    |    60 +-
 config/cmake_ext_mod/HDFUseFortran.cmake           |    34 +-
 config/cmake_ext_mod/grepTest.cmake                |    31 +-
 config/cmake_ext_mod/prunTest.cmake                |   145 -
 config/cmake_ext_mod/runTest.cmake                 |   229 +-
 config/commence.am                                 |    10 +-
 config/conclude.am                                 |    19 +-
 config/conclude_fc.am                              |    14 +-
 config/cygwin                                      |    22 +
 config/examples.am                                 |    10 +-
 config/freebsd                                     |    10 +-
 config/gnu-cxxflags                                |    20 +-
 config/gnu-fflags                                  |    10 +-
 config/gnu-flags                                   |   230 +-
 config/i386-pc-cygwin32                            |    31 -
 config/i686-pc-cygwin                              |   137 -
 config/ibm-aix                                     |    10 +-
 config/ibm-flags                                   |    10 +-
 config/intel-fflags                                |    10 +-
 config/intel-flags                                 |    30 +-
 config/linux-gnu                                   |    10 +-
 config/linux-gnuaout                               |    10 +-
 config/linux-gnulibc1                              |    11 +-
 config/linux-gnulibc2                              |    10 +-
 config/lt_vers.am                                  |    57 +-
 config/pgi-fflags                                  |    10 +-
 config/pgi-flags                                   |    10 +-
 config/site-specific/BlankForm                     |    10 +-
 config/solaris                                     |    10 +-
 config/x86_64-pc-cygwin                            |   138 -
 configure                                          |   908 +-
 configure.ac                                       |   402 +-
 examples/CMakeLists.txt                            |    12 +-
 examples/CMakeTests.cmake                          |   103 +-
 examples/Makefile.am                               |    10 +-
 examples/Makefile.in                               |    21 +-
 examples/h5_attribute.c                            |    10 +-
 examples/h5_chunk_read.c                           |    10 +-
 examples/h5_cmprss.c                               |    10 +-
 examples/h5_compound.c                             |    10 +-
 examples/h5_crtatt.c                               |    10 +-
 examples/h5_crtdat.c                               |    10 +-
 examples/h5_crtgrp.c                               |    10 +-
 examples/h5_crtgrpar.c                             |    10 +-
 examples/h5_crtgrpd.c                              |    10 +-
 examples/h5_drivers.c                              |    10 +-
 examples/h5_dtransform.c                           |    10 +-
 examples/h5_elink_unix2win.c                       |    10 +-
 examples/h5_extend.c                               |    10 +-
 examples/h5_extend_write.c                         |    10 +-
 examples/h5_extlink.c                              |    10 +-
 examples/h5_group.c                                |    10 +-
 examples/h5_interm_group.c                         |    10 +-
 examples/h5_mount.c                                |    10 +-
 examples/h5_rdwt.c                                 |    10 +-
 examples/h5_read.c                                 |    10 +-
 examples/h5_ref2reg.c                              |    10 +-
 examples/h5_reference.c                            |    10 +-
 examples/h5_select.c                               |    10 +-
 examples/h5_shared_mesg.c                          |    10 +-
 examples/h5_subset.c                               |    10 +-
 examples/h5_vds-eiger.c                            |    11 +
 examples/h5_vds-exc.c                              |    11 +
 examples/h5_vds-exclim.c                           |    11 +
 examples/h5_vds-percival-unlim-maxmin.c            |    11 +
 examples/h5_vds-percival-unlim.c                   |    11 +
 examples/h5_vds-percival.c                         |    11 +
 examples/h5_vds-simpleIO.c                         |    11 +
 examples/h5_vds.c                                  |    10 +-
 examples/h5_write.c                                |    10 +-
 examples/ph5example.c                              |    10 +-
 examples/run-all-ex.sh                             |    10 +-
 examples/run-c-ex.sh.in                            |    10 +-
 examples/testh5cc.sh.in                            |    10 +-
 fortran/CMakeLists.txt                             |    12 +-
 fortran/COPYING                                    |    11 +-
 fortran/Makefile.am                                |    10 +-
 fortran/Makefile.in                                |    21 +-
 fortran/examples/CMakeLists.txt                    |    16 +-
 fortran/examples/CMakeTests.cmake                  |    99 +-
 fortran/examples/Makefile.am                       |    10 +-
 fortran/examples/Makefile.in                       |    25 +-
 fortran/examples/compound.f90                      |    10 +-
 fortran/examples/compound_complex_fortran2003.f90  |    10 +-
 fortran/examples/compound_fortran2003.f90          |    10 +-
 fortran/examples/h5_cmprss.f90                     |    10 +-
 fortran/examples/h5_crtatt.f90                     |    10 +-
 fortran/examples/h5_crtdat.f90                     |    10 +-
 fortran/examples/h5_crtgrp.f90                     |    10 +-
 fortran/examples/h5_crtgrpar.f90                   |    10 +-
 fortran/examples/h5_crtgrpd.f90                    |    10 +-
 fortran/examples/h5_extend.f90                     |    10 +-
 fortran/examples/h5_rdwt.f90                       |    10 +-
 fortran/examples/h5_subset.f90                     |    10 +-
 fortran/examples/hyperslab.f90                     |    10 +-
 fortran/examples/mountexample.f90                  |    10 +-
 fortran/examples/nested_derived_type.f90           |    10 +-
 fortran/examples/ph5example.f90                    |    10 +-
 fortran/examples/refobjexample.f90                 |    10 +-
 fortran/examples/refregexample.f90                 |    10 +-
 fortran/examples/run-fortran-ex.sh.in              |    10 +-
 fortran/examples/rwdset_fortran2003.f90            |    10 +-
 fortran/examples/selectele.f90                     |    10 +-
 fortran/examples/testh5fc.sh.in                    |    10 +-
 fortran/src/CMakeLists.txt                         |   144 +-
 fortran/src/H5Af.c                                 |    10 +-
 fortran/src/H5Aff.F90                              |    10 +-
 fortran/src/H5Df.c                                 |    10 +-
 fortran/src/H5Dff.F90                              |    10 +-
 fortran/src/H5Ef.c                                 |    10 +-
 fortran/src/H5Eff.F90                              |    13 +-
 fortran/src/H5Ff.c                                 |    10 +-
 fortran/src/H5Fff.F90                              |    10 +-
 fortran/src/H5Gf.c                                 |    10 +-
 fortran/src/H5Gff.F90                              |    10 +-
 fortran/src/H5If.c                                 |    10 +-
 fortran/src/H5Iff.F90                              |    10 +-
 fortran/src/H5Lf.c                                 |    10 +-
 fortran/src/H5Lff.F90                              |    10 +-
 fortran/src/H5Of.c                                 |    10 +-
 fortran/src/H5Off.F90                              |    10 +-
 fortran/src/H5Pf.c                                 |    10 +-
 fortran/src/H5Pff.F90                              |    32 +-
 fortran/src/H5Rf.c                                 |    10 +-
 fortran/src/H5Rff.F90                              |    10 +-
 fortran/src/H5Sf.c                                 |   118 +-
 fortran/src/H5Sff.F90                              |    10 +-
 fortran/src/H5Tf.c                                 |    10 +-
 fortran/src/H5Tff.F90                              |    10 +-
 fortran/src/H5Zf.c                                 |    10 +-
 fortran/src/H5Zff.F90                              |    10 +-
 fortran/src/H5_buildiface.F90                      |    20 +-
 fortran/src/H5_f.c                                 |   293 +-
 fortran/src/H5_ff.F90                              |    54 +-
 fortran/src/H5config_f.inc.cmake                   |    11 +
 fortran/src/H5config_f.inc.in                      |    11 +
 fortran/src/H5f90.h                                |    10 +-
 fortran/src/H5f90global.F90                        |   105 +-
 fortran/src/H5f90i.h                               |    10 +-
 fortran/src/H5f90kit.c                             |    10 +-
 fortran/src/H5f90proto.h                           |    24 +-
 fortran/src/H5fort_type_defines.h.in               |    12 +
 fortran/src/H5fortkit.F90                          |    10 +-
 fortran/src/H5match_types.c                        |   179 +-
 fortran/src/HDF5.F90                               |    10 +-
 fortran/src/Makefile.am                            |    14 +-
 fortran/src/Makefile.in                            |    86 +-
 fortran/src/README                                 |   260 +-
 fortran/src/h5fc.in                                |    12 +-
 fortran/test/CMakeLists.txt                        |   124 +-
 fortran/test/CMakeTests.cmake                      |   135 +-
 fortran/test/H5_test_buildiface.F90                |    20 +-
 fortran/test/Makefile.am                           |    14 +-
 fortran/test/Makefile.in                           |    42 +-
 fortran/test/fflush1.F90                           |    10 +-
 fortran/test/fflush2.F90                           |    10 +-
 fortran/test/fortranlib_test.F90                   |    97 +-
 fortran/test/fortranlib_test_1_8.F90               |    10 +-
 fortran/test/fortranlib_test_F03.F90               |    12 +-
 fortran/test/t.c                                   |    10 +-
 fortran/test/t.h                                   |    10 +-
 fortran/test/tH5A.F90                              |    10 +-
 fortran/test/tH5A_1_8.F90                          |    10 +-
 fortran/test/tH5D.F90                              |    17 +-
 fortran/test/tH5E.F90                              |    10 +-
 fortran/test/tH5E_F03.F90                          |    10 +-
 fortran/test/tH5F.F90                              |    18 +-
 fortran/test/tH5F_F03.F90                          |    15 +-
 fortran/test/tH5G.F90                              |    10 +-
 fortran/test/tH5G_1_8.F90                          |    12 +-
 fortran/test/tH5I.F90                              |    10 +-
 fortran/test/tH5L_F03.F90                          |    10 +-
 fortran/test/tH5MISC_1_8.F90                       |    10 +-
 fortran/test/tH5O.F90                              |    10 +-
 fortran/test/tH5O_F03.F90                          |    10 +-
 fortran/test/tH5P.F90                              |    10 +-
 fortran/test/tH5P_F03.F90                          |    39 +-
 fortran/test/tH5R.F90                              |    10 +-
 fortran/test/tH5S.F90                              |    10 +-
 fortran/test/tH5Sselect.F90                        |    10 +-
 fortran/test/tH5T.F90                              |    12 +-
 fortran/test/tH5T_F03.F90                          |    91 +-
 fortran/test/tH5VL.F90                             |    10 +-
 fortran/test/tH5Z.F90                              |    10 +-
 fortran/test/tHDF5.F90                             |    10 +-
 fortran/test/tHDF5_1_8.F90                         |    10 +-
 fortran/test/tHDF5_F03.F90                         |    10 +-
 fortran/test/tf.F90                                |    17 +-
 fortran/testpar/CMakeLists.txt                     |    10 +-
 fortran/testpar/CMakeTests.cmake                   |    11 +
 fortran/testpar/Makefile.am                        |    10 +-
 fortran/testpar/Makefile.in                        |    25 +-
 fortran/testpar/hyper.f90                          |    10 +-
 fortran/testpar/mdset.f90                          |    10 +-
 fortran/testpar/ptest.f90                          |    10 +-
 hl/CMakeLists.txt                                  |    10 +-
 hl/COPYING                                         |    11 +-
 hl/Makefile.am                                     |    10 +-
 hl/Makefile.in                                     |    21 +-
 hl/c++/CMakeLists.txt                              |     6 +-
 hl/c++/COPYING                                     |    11 +-
 hl/c++/Makefile.am                                 |    10 +-
 hl/c++/Makefile.in                                 |    21 +-
 hl/c++/examples/CMakeLists.txt                     |     4 +-
 hl/c++/examples/CMakeTests.cmake                   |    28 +-
 hl/c++/examples/Makefile.am                        |    10 +-
 hl/c++/examples/Makefile.in                        |    21 +-
 hl/c++/examples/ptExampleFL.cpp                    |    27 +-
 hl/c++/examples/run-hlc++-ex.sh.in                 |    10 +-
 hl/c++/src/CMakeLists.txt                          |    20 +-
 hl/c++/src/H5PacketTable.cpp                       |    31 +-
 hl/c++/src/H5PacketTable.h                         |    20 +-
 hl/c++/src/Makefile.am                             |    10 +-
 hl/c++/src/Makefile.in                             |    78 +-
 hl/c++/test/CMakeLists.txt                         |     2 +-
 hl/c++/test/CMakeTests.cmake                       |    26 +-
 hl/c++/test/Makefile.am                            |    10 +-
 hl/c++/test/Makefile.in                            |    36 +-
 hl/c++/test/ptableTest.cpp                         |   374 +-
 hl/c++/test/ptableTest.h                           |    15 +-
 hl/examples/CMakeLists.txt                         |     6 +-
 hl/examples/CMakeTests.cmake                       |    52 +-
 hl/examples/Makefile.am                            |    10 +-
 hl/examples/Makefile.in                            |    21 +-
 hl/examples/ex_ds1.c                               |    10 +-
 hl/examples/ex_image1.c                            |    10 +-
 hl/examples/ex_image2.c                            |    10 +-
 hl/examples/ex_lite1.c                             |    10 +-
 hl/examples/ex_lite2.c                             |    10 +-
 hl/examples/ex_lite3.c                             |    10 +-
 hl/examples/ex_table_01.c                          |    10 +-
 hl/examples/ex_table_02.c                          |    10 +-
 hl/examples/ex_table_03.c                          |    10 +-
 hl/examples/ex_table_04.c                          |    10 +-
 hl/examples/ex_table_05.c                          |    10 +-
 hl/examples/ex_table_06.c                          |    10 +-
 hl/examples/ex_table_07.c                          |    10 +-
 hl/examples/ex_table_08.c                          |    10 +-
 hl/examples/ex_table_09.c                          |    10 +-
 hl/examples/ex_table_10.c                          |    10 +-
 hl/examples/ex_table_11.c                          |    10 +-
 hl/examples/ex_table_12.c                          |    10 +-
 hl/examples/pal_rgb.h                              |    10 +-
 hl/examples/ptExampleFL.c                          |    10 +-
 hl/examples/run-hl-ex.sh                           |    10 +-
 hl/examples/run-hlc-ex.sh.in                       |    10 +-
 hl/fortran/CMakeLists.txt                          |     6 +-
 hl/fortran/COPYING                                 |    11 +-
 hl/fortran/Makefile.am                             |    10 +-
 hl/fortran/Makefile.in                             |    21 +-
 hl/fortran/examples/CMakeLists.txt                 |     8 +-
 hl/fortran/examples/CMakeTests.cmake               |    28 +-
 hl/fortran/examples/Makefile.am                    |    10 +-
 hl/fortran/examples/Makefile.in                    |    25 +-
 hl/fortran/examples/ex_ds1.f90                     |    10 +-
 hl/fortran/examples/exlite.f90                     |    10 +-
 hl/fortran/examples/run-hlfortran-ex.sh.in         |    10 +-
 hl/fortran/src/CMakeLists.txt                      |   123 +-
 hl/fortran/src/H5DSfc.c                            |    10 +-
 hl/fortran/src/H5DSff.F90                          |    10 +-
 hl/fortran/src/H5HL_buildiface.F90                 |    30 +-
 hl/fortran/src/H5IMcc.c                            |    13 +-
 hl/fortran/src/H5IMcc.h                            |    10 +-
 hl/fortran/src/H5IMfc.c                            |    10 +-
 hl/fortran/src/H5IMff.F90                          |    10 +-
 hl/fortran/src/H5LTf90proto.h                      |    42 +-
 hl/fortran/src/H5LTfc.c                            |    14 +-
 hl/fortran/src/H5LTff.F90                          |    38 +-
 hl/fortran/src/H5TBfc.c                            |   286 +-
 hl/fortran/src/H5TBff.F90                          |   192 +-
 hl/fortran/src/Makefile.am                         |    12 +-
 hl/fortran/src/Makefile.in                         |    84 +-
 hl/fortran/src/hdf5_hl_fortrandll.def.in           |     4 +-
 hl/fortran/test/CMakeLists.txt                     |    18 +-
 hl/fortran/test/CMakeTests.cmake                   |   135 +-
 hl/fortran/test/Makefile.am                        |    41 +-
 hl/fortran/test/Makefile.in                        |   103 +-
 hl/fortran/test/tstds.F90                          |    94 +-
 hl/fortran/test/tstimage.F90                       |    64 +-
 hl/fortran/test/tstlite.F90                        |  3653 +++---
 hl/fortran/test/tsttable.F90                       |   326 +-
 hl/src/CMakeLists.txt                              |    16 +-
 hl/src/COPYING                                     |    11 +-
 hl/src/H5DO.c                                      |    51 +-
 hl/src/H5DOpublic.h                                |    10 +-
 hl/src/H5DS.c                                      |    10 +-
 hl/src/H5DSprivate.h                               |    10 +-
 hl/src/H5DSpublic.h                                |    10 +-
 hl/src/H5HLprivate2.h                              |    10 +-
 hl/src/H5IM.c                                      |    21 +-
 hl/src/H5IMprivate.h                               |    10 +-
 hl/src/H5IMpublic.h                                |    10 +-
 hl/src/H5LD.c                                      |    10 +-
 hl/src/H5LDprivate.h                               |    10 +-
 hl/src/H5LDpublic.h                                |    10 +-
 hl/src/H5LT.c                                      |    14 +-
 hl/src/H5LTanalyze.c                               |    10 +-
 hl/src/H5LTanalyze.l                               |    10 +-
 hl/src/H5LTparse.y                                 |    10 +-
 hl/src/H5LTprivate.h                               |    10 +-
 hl/src/H5LTpublic.h                                |    10 +-
 hl/src/H5PT.c                                      |    27 +-
 hl/src/H5PTprivate.h                               |    10 +-
 hl/src/H5PTpublic.h                                |    10 +-
 hl/src/H5TB.c                                      |    10 +-
 hl/src/H5TBprivate.h                               |    10 +-
 hl/src/H5TBpublic.h                                |    10 +-
 hl/src/Makefile.am                                 |    10 +-
 hl/src/Makefile.in                                 |    78 +-
 hl/src/hdf5_hl.h                                   |    10 +-
 hl/test/CMakeLists.txt                             |    12 +-
 hl/test/CMakeTests.cmake                           |    94 +-
 hl/test/COPYING                                    |    11 +-
 hl/test/H5srcdir_str.h.in                          |    10 +-
 hl/test/Makefile.am                                |    13 +-
 hl/test/Makefile.in                                |    39 +-
 hl/test/dectris_hl_perf.c                          |    10 +-
 hl/test/gen_test_ds.c                              |    10 +-
 hl/test/gen_test_ld.c                              |    15 +-
 hl/test/h5hltest.h                                 |    10 +-
 hl/test/pal_rgb.h                                  |    10 +-
 hl/test/test_ds.c                                  |    37 +-
 hl/test/test_dset_append.c                         |   109 +-
 hl/test/test_dset_opt.c                            |    11 +-
 hl/test/test_file_image.c                          |    10 +-
 hl/test/test_image.c                               |    65 +-
 hl/test/test_ld.c                                  |    10 +-
 hl/test/test_lite.c                                |    33 +-
 hl/test/test_packet.c                              |    52 +-
 hl/test/test_packet_vlen.c                         |   397 +-
 hl/test/test_table.c                               |    10 +-
 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/CMakeLists.txt                            |     2 +-
 hl/tools/COPYING                                   |    11 +-
 hl/tools/Makefile.am                               |    12 +-
 hl/tools/Makefile.in                               |    22 +-
 hl/tools/gif2h5/CMakeLists.txt                     |    24 +-
 hl/tools/gif2h5/CMakeTests.cmake                   |    40 +-
 hl/tools/gif2h5/Makefile.am                        |    10 +-
 hl/tools/gif2h5/Makefile.in                        |    36 +-
 hl/tools/gif2h5/decompress.c                       |    10 +-
 hl/tools/gif2h5/gif.h                              |    10 +-
 hl/tools/gif2h5/gif2hdf.c                          |    10 +-
 hl/tools/gif2h5/gif2mem.c                          |    10 +-
 hl/tools/gif2h5/gifread.c                          |    10 +-
 hl/tools/gif2h5/h52gifgentst.c                     |    18 +-
 hl/tools/gif2h5/h52giftest.sh.in                   |    10 +-
 hl/tools/gif2h5/hdf2gif.c                          |    20 +-
 hl/tools/gif2h5/hdfgifwr.c                         |    10 +-
 hl/tools/gif2h5/writehdf.c                         |    10 +-
 hl/tools/h5watch/CMakeLists.txt                    |    28 +-
 hl/tools/h5watch/CMakeTests.cmake                  |    77 +-
 hl/tools/h5watch/Makefile.am                       |    20 +-
 hl/tools/h5watch/Makefile.in                       |    68 +-
 hl/tools/h5watch/extend_dset.c                     |   620 +-
 hl/tools/h5watch/h5watch.c                         |   572 +-
 hl/tools/h5watch/h5watchgentest.c                  |   138 +-
 hl/tools/h5watch/swmr_check_compat_vfd.c           |    10 +-
 hl/tools/h5watch/testh5watch.sh.in                 |   177 +-
 hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl           |     5 -
 hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl           |     5 -
 hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl          |    10 +-
 hl/tools/testfiles/w-ext-cmpd-esc.ddl              |    12 +-
 hl/tools/testfiles/w-ext-cmpd-f1.ddl               |    10 +-
 hl/tools/testfiles/w-ext-cmpd-f2.ddl               |     5 -
 hl/tools/testfiles/w-ext-cmpd-ff3.ddl              |     8 -
 hl/tools/testfiles/w-ext-cmpd-label.ddl            |     8 -
 hl/tools/testfiles/w-ext-cmpd-two-f1.ddl           |    56 +-
 hl/tools/testfiles/w-ext-cmpd-two-f3.ddl           |    41 +-
 hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl          |    47 +-
 hl/tools/testfiles/w-ext-cmpd-two.ddl              |    66 +-
 hl/tools/testfiles/w-ext-cmpd.ddl                  |     6 -
 hl/tools/testfiles/w-ext-early.ddl                 |     9 +-
 hl/tools/testfiles/w-ext-late.ddl                  |     8 -
 hl/tools/testfiles/w-ext-one-d.ddl                 |     3 -
 hl/tools/testfiles/w-ext-one-simple.ddl            |     9 +-
 hl/tools/testfiles/w-ext-one.ddl                   |     5 -
 hl/tools/testfiles/w-ext-two-d.ddl                 |    18 +-
 hl/tools/testfiles/w-ext-two-width.ddl             |    42 +-
 hl/tools/testfiles/w-ext-two.ddl                   |    38 +-
 html/ADGuide.html                                  |     2 +-
 html/ADGuide/Changes.html                          |   240 +-
 html/ADGuide/Changes_1_8_x.html                    |   376 +
 ...hNote-HDF5-ImprovingCompressionPerformance.docx |   Bin 947458 -> 948657 bytes
 html/Advanced.html                                 |     6 +-
 html/Copyright.html                                |   134 +-
 html/FileFormatSpecChunkDiagram.jpg                |   Bin 0 -> 29237 bytes
 html/HL/H5LT/H5LDget_dset_dims.htm                 |    12 +-
 html/HL/H5LT/H5LDget_dset_elmts.htm                |    10 +-
 html/HL/H5LT/H5LDget_dset_type_size.htm            |    12 +-
 html/HL/HDF5Optimized/H5DOappend.htm               |    57 +-
 html/HL/RM_H5DS.html                               |     2 +-
 html/HL/RM_H5IM.html                               |     2 +-
 html/HL/RM_H5LT.html                               |    18 +-
 html/HL/RM_H5PT.html                               |    13 +-
 html/HL/RM_H5PT_c++.html                           |    64 +-
 html/HL/RM_H5TB.html                               |    19 +-
 html/HL/RM_HDF5Optimized.html                      |    22 +-
 html/RM/APICompatMacros.html                       |    14 +-
 html/RM/CollectiveCalls.html                       |     2 +-
 html/RM/H5A/H5Acreate2.htm                         |     6 +-
 html/RM/H5A/H5Aexists.htm                          |    15 +-
 html/RM/H5A/H5Aexists_by_name.htm                  |    15 +-
 html/RM/H5D/H5Dcreate2.htm                         |     5 +
 html/RM/H5D/H5Dflush.htm                           |    49 +-
 html/RM/H5D/H5Drefresh.htm                         |    48 +-
 html/RM/H5E/H5Eset_auto.htm                        |     3 +-
 html/RM/H5F/H5Fget_intent.htm                      |    20 +-
 html/RM/H5F/H5Fget_mdc_image_info.htm              |    88 +
 html/RM/H5F/H5Fget_mdc_logging_status.htm          |   147 +
 html/RM/H5F/H5Fget_metadata_read_retries_info.htm  |   415 -
 html/RM/H5F/H5Fget_metadata_read_retry_info.htm    |   415 +
 html/RM/H5F/H5Fget_obj_count.htm                   |     2 +-
 html/RM/H5F/H5Fget_page_buffering_stats.htm        |   171 +
 html/RM/H5F/H5Fis_hdf5.htm                         |    27 +-
 html/RM/H5F/H5Freset_page_buffering_stats.htm      |   127 +
 html/RM/H5F/H5Fstart_mdc_logging.htm               |    13 +-
 html/RM/H5F/H5Fstart_swmr_write.htm                |    49 +-
 html/RM/H5F/H5Fstop_mdc_logging.htm                |    14 +-
 html/RM/H5G/H5Gflush.htm                           |    49 +-
 html/RM/H5G/H5Grefresh.htm                         |    48 +-
 html/RM/H5I/H5Iis_valid.htm                        |    19 +-
 html/RM/H5I/H5Itype_exists.htm                     |    16 +-
 html/RM/H5L/H5Lis_registered.htm                   |    16 +-
 html/RM/H5O/H5Oare_mdc_flushes_disabled.htm        |    52 +-
 html/RM/H5O/H5Odecr_refcount.htm                   |     2 +-
 html/RM/H5O/H5Odisable_mdc_flushes.htm             |    52 +-
 html/RM/H5O/H5Oenable_mdc_flushes.htm              |    52 +-
 html/RM/H5O/H5Oexists_by_name.htm                  |    35 +-
 html/RM/H5O/H5Oflush.htm                           |    48 +-
 html/RM/H5O/H5Oincr_refcount.htm                   |     2 +-
 html/RM/H5O/H5Orefresh.htm                         |    49 +-
 html/RM/H5P/H5Pall_filters_avail.htm               |    21 +-
 html/RM/H5P/H5Pencode.htm                          |     4 +-
 html/RM/H5P/H5Pequal.htm                           |    24 +-
 html/RM/H5P/H5Pexist.htm                           |    25 +-
 html/RM/H5P/H5Pget_append_flush.htm                |    52 +-
 html/RM/H5P/H5Pget_char_encoding.htm               |     2 +-
 html/RM/H5P/H5Pget_chunk_cache.htm                 |     2 +-
 html/RM/H5P/H5Pget_chunk_opts.htm                  |   152 +
 html/RM/H5P/H5Pget_create_intermediate_group.htm   |     2 +-
 html/RM/H5P/H5Pget_driver_info.htm                 |     8 +-
 html/RM/H5P/H5Pget_evict_on_close.htm              |   145 +
 html/RM/H5P/H5Pget_file_image.htm                  |    15 -
 html/RM/H5P/H5Pget_file_space.htm                  |   270 -
 html/RM/H5P/H5Pget_file_space_page_size.htm        |   131 +
 html/RM/H5P/H5Pget_file_space_strategy.htm         |   164 +
 html/RM/H5P/H5Pget_mdc_config.htm                  |     8 +
 html/RM/H5P/H5Pget_mdc_image_config.htm            |   182 +
 html/RM/H5P/H5Pget_mdc_log_options.htm             |    13 +-
 html/RM/H5P/H5Pget_mdc_logging_status.htm          |   144 -
 html/RM/H5P/H5Pget_metadata_read_attempts.htm      |     4 +-
 html/RM/H5P/H5Pget_object_flush_cb.htm             |    50 +-
 html/RM/H5P/H5Pget_page_buffer_size.htm            |   153 +
 html/RM/H5P/H5Pisa_class.htm                       |    20 +-
 html/RM/H5P/H5Pset_alignment.htm                   |     5 +
 html/RM/H5P/H5Pset_append_flush.htm                |    54 +-
 html/RM/H5P/H5Pset_char_encoding.htm               |     2 +-
 html/RM/H5P/H5Pset_chunk_opts.htm                  |   234 +
 html/RM/H5P/H5Pset_create_intermediate_group.htm   |     2 +-
 html/RM/H5P/H5Pset_evict_on_close.htm              |   149 +
 html/RM/H5P/H5Pset_file_image.htm                  |    12 +-
 html/RM/H5P/H5Pset_file_image_callbacks.htm        |    19 +-
 html/RM/H5P/H5Pset_file_space.htm                  |   364 -
 html/RM/H5P/H5Pset_file_space_page_size.htm        |   137 +
 html/RM/H5P/H5Pset_file_space_strategy.htm         |   170 +
 html/RM/H5P/H5Pset_mdc_config.htm                  |    15 +-
 html/RM/H5P/H5Pset_mdc_image_config.htm            |   206 +
 html/RM/H5P/H5Pset_mdc_log_options.htm             |    13 +-
 html/RM/H5P/H5Pset_metadata_read_attempts.htm      |     4 +-
 html/RM/H5P/H5Pset_object_flush_cb.htm             |    51 +-
 html/RM/H5P/H5Pset_page_buffer_size.htm            |   171 +
 html/RM/H5S/H5Sextent_equal.htm                    |    30 +-
 html/RM/H5S/H5Sis_simple.htm                       |    20 +-
 html/RM/H5S/H5Sselect_valid.htm                    |    23 +-
 html/RM/H5T/H5Tcommitted.htm                       |    59 +-
 html/RM/H5T/H5Tcompiler_conv.htm                   |    13 +-
 html/RM/H5T/H5Tdetect_class.htm                    |    24 +-
 html/RM/H5T/H5Tequal.htm                           |    21 +-
 html/RM/H5T/H5Tflush.htm                           |    48 +-
 html/RM/H5T/H5Tis_variable_str.htm                 |    20 +-
 html/RM/H5T/H5Trefresh.htm                         |    48 +-
 html/RM/H5Z/H5Zfilter_avail.htm                    |    29 +-
 html/RM/PredefDTypes.html                          |     2 +-
 html/RM/RM_H5.html                                 |     2 +-
 html/RM/RM_H5A.html                                |     2 +-
 html/RM/RM_H5D.html                                |    44 +-
 html/RM/RM_H5E.html                                |     2 +-
 html/RM/RM_H5F.html                                |    45 +-
 html/RM/RM_H5Front.html                            |    17 +-
 html/RM/RM_H5G.html                                |    12 +-
 html/RM/RM_H5I.html                                |     2 +-
 html/RM/RM_H5L.html                                |     2 +-
 html/RM/RM_H5O.html                                |    33 +-
 html/RM/RM_H5P.html                                |   156 +-
 html/RM/RM_H5PL.html                               |     2 +-
 html/RM/RM_H5R.html                                |     2 +-
 html/RM/RM_H5S.html                                |     2 +-
 html/RM/RM_H5T.html                                |    14 +-
 html/RM/RM_H5Z.html                                |     2 +-
 html/RM/Tools.html                                 |    10 +-
 html/RM/Tools/h5clear.htm                          |    52 +-
 html/RM/Tools/h5dump.htm                           |     8 +
 html/RM/Tools/h5format_convert.htm                 |     4 +-
 html/RM/Tools/h5repack.htm                         |    56 +-
 html/RM/Tools/h5stat.htm                           |    11 +
 html/RM/Tools/h5watch.htm                          |    11 +-
 ...5-ImprovingIOPerformanceCompressedDatasets.docx |   Bin 0 -> 948777 bytes
 html/_topic/loc_id+name_obj.htm                    |   115 +-
 html/doc-info.html                                 |    12 +-
 html/ed_libs/Footer-THGonly.htm                    |     6 +-
 html/ed_libs/Footer-THGonly2.htm                   |     6 +-
 html/ed_libs/Footer-THGonly3.htm                   |     6 +-
 html/ed_libs/Footer.htm                            |     6 +-
 html/ed_libs/Footer2.htm                           |     6 +-
 html/ed_libs/Footer3.htm                           |     6 +-
 html/index.html                                    |   104 +-
 java/CMakeLists.txt                                |    32 +-
 java/COPYING                                       |    11 +-
 java/Makefile.am                                   |    10 +-
 java/Makefile.in                                   |    21 +-
 java/examples/CMakeLists.txt                       |     2 +-
 java/examples/Makefile.am                          |    10 +-
 java/examples/Makefile.in                          |    21 +-
 java/examples/datasets/CMakeLists.txt              |    46 +-
 java/examples/datasets/H5Ex_D_Alloc.java           |    10 +-
 java/examples/datasets/H5Ex_D_Checksum.java        |    10 +-
 java/examples/datasets/H5Ex_D_Chunk.java           |    15 +-
 java/examples/datasets/H5Ex_D_Compact.java         |    15 +-
 java/examples/datasets/H5Ex_D_External.java        |    10 +-
 java/examples/datasets/H5Ex_D_FillValue.java       |    10 +-
 java/examples/datasets/H5Ex_D_Gzip.java            |    10 +-
 java/examples/datasets/H5Ex_D_Hyperslab.java       |    10 +-
 java/examples/datasets/H5Ex_D_Nbit.java            |    10 +-
 java/examples/datasets/H5Ex_D_ReadWrite.java       |    10 +-
 java/examples/datasets/H5Ex_D_Shuffle.java         |    10 +-
 java/examples/datasets/H5Ex_D_Sofloat.java         |    10 +-
 java/examples/datasets/H5Ex_D_Soint.java           |    10 +-
 java/examples/datasets/H5Ex_D_Szip.java            |    10 +-
 java/examples/datasets/H5Ex_D_Transform.java       |    10 +-
 java/examples/datasets/H5Ex_D_UnlimitedAdd.java    |    10 +-
 java/examples/datasets/H5Ex_D_UnlimitedGzip.java   |    10 +-
 java/examples/datasets/H5Ex_D_UnlimitedMod.java    |    10 +-
 java/examples/datasets/Makefile.am                 |    10 +-
 java/examples/datasets/Makefile.in                 |    21 +-
 java/examples/datasets/runExample.sh.in            |    14 +-
 java/examples/datatypes/CMakeLists.txt             |    32 +-
 java/examples/datatypes/H5Ex_T_Array.java          |    10 +-
 java/examples/datatypes/H5Ex_T_ArrayAttribute.java |    10 +-
 java/examples/datatypes/H5Ex_T_Bit.java            |    10 +-
 java/examples/datatypes/H5Ex_T_BitAttribute.java   |    10 +-
 java/examples/datatypes/H5Ex_T_Commit.java         |    10 +-
 java/examples/datatypes/H5Ex_T_Compound.java       |    10 +-
 .../datatypes/H5Ex_T_CompoundAttribute.java        |    10 +-
 java/examples/datatypes/H5Ex_T_Float.java          |    10 +-
 java/examples/datatypes/H5Ex_T_FloatAttribute.java |    10 +-
 java/examples/datatypes/H5Ex_T_Integer.java        |    10 +-
 .../datatypes/H5Ex_T_IntegerAttribute.java         |    10 +-
 .../examples/datatypes/H5Ex_T_ObjectReference.java |    18 +-
 .../datatypes/H5Ex_T_ObjectReferenceAttribute.java |    18 +-
 java/examples/datatypes/H5Ex_T_Opaque.java         |    10 +-
 .../examples/datatypes/H5Ex_T_OpaqueAttribute.java |    10 +-
 java/examples/datatypes/H5Ex_T_String.java         |    10 +-
 .../examples/datatypes/H5Ex_T_StringAttribute.java |    10 +-
 java/examples/datatypes/H5Ex_T_VLString.java       |    10 +-
 java/examples/datatypes/Makefile.am                |    10 +-
 java/examples/datatypes/Makefile.in                |    21 +-
 java/examples/datatypes/runExample.sh.in           |    13 +-
 java/examples/groups/CMakeLists.txt                |    61 +-
 java/examples/groups/H5Ex_G_Compact.java           |    10 +-
 java/examples/groups/H5Ex_G_Corder.java            |    10 +-
 java/examples/groups/H5Ex_G_Create.java            |    10 +-
 java/examples/groups/H5Ex_G_Intermediate.java      |    10 +-
 java/examples/groups/H5Ex_G_Iterate.java           |    10 +-
 java/examples/groups/H5Ex_G_Phase.java             |    10 +-
 java/examples/groups/H5Ex_G_Traverse.java          |    10 +-
 java/examples/groups/H5Ex_G_Visit.java             |    10 +-
 java/examples/groups/Makefile.am                   |    10 +-
 java/examples/groups/Makefile.in                   |    21 +-
 java/examples/groups/runExample.sh.in              |    20 +-
 java/examples/intro/CMakeLists.txt                 |    34 +-
 java/examples/intro/H5_CreateAttribute.java        |    10 +-
 java/examples/intro/H5_CreateDataset.java          |    10 +-
 java/examples/intro/H5_CreateFile.java             |    10 +-
 java/examples/intro/H5_CreateGroup.java            |    10 +-
 .../intro/H5_CreateGroupAbsoluteRelative.java      |    10 +-
 java/examples/intro/H5_CreateGroupDataset.java     |    10 +-
 java/examples/intro/H5_ReadWrite.java              |    10 +-
 java/examples/intro/Makefile.am                    |    10 +-
 java/examples/intro/Makefile.in                    |    21 +-
 java/examples/intro/runExample.sh.in               |    13 +-
 .../examples.datatypes.H5Ex_T_ObjectReference.txt  |     4 +-
 ...s.datatypes.H5Ex_T_ObjectReferenceAttribute.txt |     4 +-
 java/src/CMakeLists.txt                            |     2 +-
 java/src/Makefile.am                               |    11 +-
 java/src/Makefile.in                               |    13 +-
 java/src/hdf/CMakeLists.txt                        |     2 +-
 java/src/hdf/hdf5lib/CMakeLists.txt                |    16 +-
 java/src/hdf/hdf5lib/H5.java                       |   327 +-
 java/src/hdf/hdf5lib/HDF5Constants.java            |    34 +-
 java/src/hdf/hdf5lib/HDF5GroupInfo.java            |    10 +-
 java/src/hdf/hdf5lib/HDFArray.java                 |    10 +-
 java/src/hdf/hdf5lib/HDFNativeData.java            |    10 +-
 java/src/hdf/hdf5lib/callbacks/Callbacks.java      |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java  |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java  |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5D_append_t.java   |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java  |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java    |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java     |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5L_iterate_cb.java |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java  |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5O_iterate_cb.java |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java  |    10 +-
 .../hdf5lib/callbacks/H5P_cls_close_func_cb.java   |    10 +-
 .../hdf5lib/callbacks/H5P_cls_close_func_t.java    |    10 +-
 .../hdf5lib/callbacks/H5P_cls_copy_func_cb.java    |    10 +-
 .../hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java |    10 +-
 .../hdf5lib/callbacks/H5P_cls_create_func_cb.java  |    10 +-
 .../hdf5lib/callbacks/H5P_cls_create_func_t.java   |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java |    10 +-
 java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java  |    10 +-
 .../hdf5lib/callbacks/H5P_prp_close_func_cb.java   |    10 +-
 .../hdf5lib/callbacks/H5P_prp_compare_func_cb.java |    10 +-
 .../hdf5lib/callbacks/H5P_prp_copy_func_cb.java    |    10 +-
 .../hdf5lib/callbacks/H5P_prp_create_func_cb.java  |    10 +-
 .../hdf5lib/callbacks/H5P_prp_delete_func_cb.java  |    10 +-
 .../hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java |    10 +-
 .../hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java |    10 +-
 .../hdf/hdf5lib/exceptions/HDF5AtomException.java  |    10 +-
 .../hdf5lib/exceptions/HDF5AttributeException.java |    10 +-
 .../hdf/hdf5lib/exceptions/HDF5BtreeException.java |    10 +-
 .../exceptions/HDF5DataFiltersException.java       |    10 +-
 .../exceptions/HDF5DataStorageException.java       |    10 +-
 .../exceptions/HDF5DatasetInterfaceException.java  |    10 +-
 .../HDF5DataspaceInterfaceException.java           |    10 +-
 .../exceptions/HDF5DatatypeInterfaceException.java |    10 +-
 java/src/hdf/hdf5lib/exceptions/HDF5Exception.java |    10 +-
 .../exceptions/HDF5ExternalFileListException.java  |    10 +-
 .../exceptions/HDF5FileInterfaceException.java     |    10 +-
 .../exceptions/HDF5FunctionArgumentException.java  |    10 +-
 .../exceptions/HDF5FunctionEntryExitException.java |    10 +-
 .../hdf/hdf5lib/exceptions/HDF5HeapException.java  |    10 +-
 .../exceptions/HDF5InternalErrorException.java     |    10 +-
 .../hdf/hdf5lib/exceptions/HDF5JavaException.java  |    10 +-
 .../hdf5lib/exceptions/HDF5LibraryException.java   |    10 +-
 .../exceptions/HDF5LowLevelIOException.java        |    10 +-
 .../exceptions/HDF5MetaDataCacheException.java     |    10 +-
 .../exceptions/HDF5ObjectHeaderException.java      |    10 +-
 .../HDF5PropertyListInterfaceException.java        |    10 +-
 .../hdf5lib/exceptions/HDF5ReferenceException.java |    10 +-
 .../HDF5ResourceUnavailableException.java          |    10 +-
 .../exceptions/HDF5SymbolTableException.java       |    10 +-
 .../hdf/hdf5lib/structs/H5AC_cache_config_t.java   |    10 +-
 java/src/hdf/hdf5lib/structs/H5A_info_t.java       |    10 +-
 java/src/hdf/hdf5lib/structs/H5E_error2_t.java     |    10 +-
 java/src/hdf/hdf5lib/structs/H5F_info2_t.java      |    10 +-
 java/src/hdf/hdf5lib/structs/H5G_info_t.java       |    10 +-
 java/src/hdf/hdf5lib/structs/H5L_info_t.java       |    10 +-
 java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java   |    10 +-
 java/src/hdf/hdf5lib/structs/H5O_info_t.java       |    10 +-
 java/src/hdf/hdf5lib/structs/H5_ih_info_t.java     |    10 +-
 java/src/jni/CMakeLists.txt                        |    14 +-
 java/src/jni/Makefile.am                           |    12 +-
 java/src/jni/Makefile.in                           |    80 +-
 java/src/jni/exceptionImp.c                        |    60 +-
 java/src/jni/exceptionImp.h                        |    23 +-
 java/src/jni/h5Constants.c                         |  1877 ++-
 java/src/jni/h5Imp.c                               |    36 +-
 java/src/jni/h5Imp.h                               |    34 +-
 java/src/jni/h5aImp.c                              |   436 +-
 java/src/jni/h5aImp.h                              |   101 +-
 java/src/jni/h5dImp.c                              |   436 +-
 java/src/jni/h5dImp.h                              |   133 +-
 java/src/jni/h5eImp.c                              |   107 +-
 java/src/jni/h5eImp.h                              |    61 +-
 java/src/jni/h5fImp.c                              |   158 +-
 java/src/jni/h5fImp.h                              |    85 +-
 java/src/jni/h5gImp.c                              |   174 +-
 java/src/jni/h5gImp.h                              |    40 +-
 java/src/jni/h5iImp.c                              |    95 +-
 java/src/jni/h5iImp.h                              |    63 +-
 java/src/jni/h5jni.h                               |   174 +-
 java/src/jni/h5lImp.c                              |   516 +-
 java/src/jni/h5lImp.h                              |   331 +-
 java/src/jni/h5oImp.c                              |   750 +-
 java/src/jni/h5oImp.h                              |   348 +-
 java/src/jni/h5pImp.c                              |  1468 ++-
 java/src/jni/h5pImp.h                              |   553 +-
 java/src/jni/h5plImp.c                             |   185 +-
 java/src/jni/h5plImp.h                             |    79 +-
 java/src/jni/h5rImp.c                              |    86 +-
 java/src/jni/h5rImp.h                              |    28 +-
 java/src/jni/h5sImp.c                              |   116 +-
 java/src/jni/h5sImp.h                              |   154 +-
 java/src/jni/h5tImp.c                              |   398 +-
 java/src/jni/h5tImp.h                              |   211 +-
 java/src/jni/h5util.c                              |   266 +-
 java/src/jni/h5util.h                              |    42 +-
 java/src/jni/h5zImp.c                              |    21 +-
 java/src/jni/h5zImp.h                              |    19 +-
 java/src/jni/nativeData.c                          |    75 +-
 java/src/jni/nativeData.h                          |    73 +-
 java/test/CMakeLists.txt                           |    46 +-
 java/test/JUnit-interface.txt                      |     7 +-
 java/test/Makefile.am                              |    10 +-
 java/test/Makefile.in                              |    21 +-
 java/test/TestAll.java                             |    10 +-
 java/test/TestH5.java                              |    16 +-
 java/test/TestH5A.java                             |    10 +-
 java/test/TestH5D.java                             |    10 +-
 java/test/TestH5Dparams.java                       |    10 +-
 java/test/TestH5Dplist.java                        |    10 +-
 java/test/TestH5E.java                             |    14 +-
 java/test/TestH5Edefault.java                      |    10 +-
 java/test/TestH5Eregister.java                     |    10 +-
 java/test/TestH5F.java                             |    10 +-
 java/test/TestH5Fbasic.java                        |    10 +-
 java/test/TestH5Fparams.java                       |    10 +-
 java/test/TestH5Fswmr.java                         |    10 +-
 java/test/TestH5G.java                             |    10 +-
 java/test/TestH5Gbasic.java                        |    10 +-
 java/test/TestH5Giterate.java                      |    10 +-
 java/test/TestH5Lbasic.java                        |    10 +-
 java/test/TestH5Lcreate.java                       |    10 +-
 java/test/TestH5Lparams.java                       |    10 +-
 java/test/TestH5Obasic.java                        |    10 +-
 java/test/TestH5Ocopy.java                         |    11 +-
 java/test/TestH5Ocreate.java                       |    10 +-
 java/test/TestH5Oparams.java                       |    10 +-
 java/test/TestH5P.java                             |    51 +-
 java/test/TestH5PData.java                         |    10 +-
 java/test/TestH5PL.java                            |   163 +-
 java/test/TestH5Pfapl.java                         |    10 +-
 java/test/TestH5Plist.java                         |    10 +-
 java/test/TestH5Pvirtual.java                      |    15 +-
 java/test/TestH5R.java                             |    10 +-
 java/test/TestH5S.java                             |    10 +-
 java/test/TestH5Sbasic.java                        |    10 +-
 java/test/TestH5T.java                             |    10 +-
 java/test/TestH5Tbasic.java                        |    10 +-
 java/test/TestH5Tparams.java                       |    10 +-
 java/test/TestH5Z.java                             |    10 +-
 java/test/junit.sh.in                              |    54 +-
 m4/aclocal_cxx.m4                                  |    78 +-
 m4/aclocal_fc.f90                                  |   149 +
 m4/aclocal_fc.m4                                   |   218 +-
 release_docs/COPYING                               |    11 +-
 release_docs/HISTORY-1_10.txt                      |  1367 ++
 release_docs/HISTORY-1_8.txt                       | 12344 +++++++++++++++++++
 release_docs/INSTALL                               |   306 +-
 release_docs/INSTALL_CMake.txt                     |   482 +-
 release_docs/INSTALL_parallel                      |    12 +
 release_docs/RELEASE.txt                           |   930 +-
 release_docs/USING_CMake_Examples.txt              |     6 +-
 release_docs/USING_HDF5_CMake.txt                  |   250 +-
 src/CMakeLists.txt                                 |   313 +-
 src/COPYING                                        |    11 +-
 src/H5.c                                           |    16 +-
 src/H5A.c                                          |    10 +-
 src/H5AC.c                                         |  1642 ++-
 src/H5ACdbg.c                                      |   492 +
 src/H5AClog.c                                      |   375 +-
 src/H5ACmodule.h                                   |    10 +-
 src/H5ACmpio.c                                     |   153 +-
 src/H5ACpkg.h                                      |    50 +-
 src/H5ACprivate.h                                  |   247 +-
 src/H5ACproxy_entry.c                              |   661 +
 src/H5ACpublic.h                                   |    71 +-
 src/H5Abtree2.c                                    |    10 +-
 src/H5Adense.c                                     |    28 +-
 src/H5Adeprec.c                                    |    10 +-
 src/H5Aint.c                                       |    59 +-
 src/H5Amodule.h                                    |    10 +-
 src/H5Apkg.h                                       |    10 +-
 src/H5Aprivate.h                                   |    10 +-
 src/H5Apublic.h                                    |    10 +-
 src/H5Atest.c                                      |    10 +-
 src/H5B.c                                          |    32 +-
 src/H5B2.c                                         |   114 +-
 src/H5B2cache.c                                    |   271 +-
 src/H5B2dbg.c                                      |    21 +-
 src/H5B2hdr.c                                      |    89 +-
 src/H5B2int.c                                      |  3739 +-----
 src/H5B2internal.c                                 |  1441 +++
 src/H5B2leaf.c                                     |  1063 ++
 src/H5B2module.h                                   |    10 +-
 src/H5B2pkg.h                                      |   109 +-
 src/H5B2private.h                                  |    19 +-
 src/H5B2public.h                                   |    10 +-
 src/H5B2stat.c                                     |    10 +-
 src/H5B2test.c                                     |    14 +-
 src/H5Bcache.c                                     |    88 +-
 src/H5Bdbg.c                                       |    10 +-
 src/H5Bmodule.h                                    |    10 +-
 src/H5Bpkg.h                                       |    14 +-
 src/H5Bprivate.h                                   |    10 +-
 src/H5Bpublic.h                                    |    10 +-
 src/H5C.c                                          |  9146 ++++++--------
 src/H5CS.c                                         |    12 +-
 src/H5CSprivate.h                                  |    10 +-
 src/H5Cdbg.c                                       |  1597 +++
 src/H5Cepoch.c                                     |   240 +
 src/H5Cimage.c                                     |  3569 ++++++
 src/H5Clog.c                                       |   368 +
 src/H5Cmodule.h                                    |    10 +-
 src/H5Cmpio.c                                      |  1460 ++-
 src/H5Cpkg.h                                       |  1344 +-
 src/H5Cprefetched.c                                |   350 +
 src/H5Cprivate.h                                   |  1374 ++-
 src/H5Cpublic.h                                    |    10 +-
 src/H5Cquery.c                                     |   484 +
 src/H5Ctag.c                                       |   907 ++
 src/H5Ctest.c                                      |   161 +
 src/H5D.c                                          |    64 +-
 src/H5Dbtree.c                                     |    10 +-
 src/H5Dbtree2.c                                    |    66 +-
 src/H5Dchunk.c                                     |   111 +-
 src/H5Dcompact.c                                   |    10 +-
 src/H5Dcontig.c                                    |    15 +-
 src/H5Ddbg.c                                       |    10 +-
 src/H5Ddeprec.c                                    |    10 +-
 src/H5Dearray.c                                    |    69 +-
 src/H5Defl.c                                       |    18 +-
 src/H5Dfarray.c                                    |   147 +-
 src/H5Dfill.c                                      |    35 +-
 src/H5Dint.c                                       |   360 +-
 src/H5Dio.c                                        |    59 +-
 src/H5Dlayout.c                                    |    14 +-
 src/H5Dmodule.h                                    |    10 +-
 src/H5Dmpio.c                                      |    10 +-
 src/H5Dnone.c                                      |    10 +-
 src/H5Doh.c                                        |    16 +-
 src/H5Dpkg.h                                       |    17 +-
 src/H5Dprivate.h                                   |    11 +-
 src/H5Dpublic.h                                    |    20 +-
 src/H5Dscatgath.c                                  |   343 +-
 src/H5Dselect.c                                    |    94 +-
 src/H5Dsingle.c                                    |    10 +-
 src/H5Dtest.c                                      |    51 +-
 src/H5Dvirtual.c                                   |    14 +-
 src/H5E.c                                          |    19 +-
 src/H5EA.c                                         |   448 +-
 src/H5EAcache.c                                    |   586 +-
 src/H5EAdbg.c                                      |    10 +-
 src/H5EAdblkpage.c                                 |    67 +-
 src/H5EAdblock.c                                   |    92 +-
 src/H5EAhdr.c                                      |    74 +-
 src/H5EAiblock.c                                   |    51 +-
 src/H5EAint.c                                      |    10 +-
 src/H5EAmodule.h                                   |    10 +-
 src/H5EApkg.h                                      |   122 +-
 src/H5EAprivate.h                                  |    28 +-
 src/H5EAsblock.c                                   |    77 +-
 src/H5EAstat.c                                     |    10 +-
 src/H5EAtest.c                                     |    10 +-
 src/H5Edefin.h                                     |    16 +-
 src/H5Edeprec.c                                    |    10 +-
 src/H5Einit.h                                      |    40 +-
 src/H5Eint.c                                       |    13 +-
 src/H5Emodule.h                                    |    10 +-
 src/H5Epkg.h                                       |    10 +-
 src/H5Eprivate.h                                   |    10 +-
 src/H5Epubgen.h                                    |    22 +-
 src/H5Epublic.h                                    |    10 +-
 src/H5Eterm.h                                      |    16 +-
 src/H5F.c                                          |   494 +-
 src/H5FA.c                                         |   347 +-
 src/H5FAcache.c                                    |   286 +-
 src/H5FAdbg.c                                      |    10 +-
 src/H5FAdblkpage.c                                 |    52 +-
 src/H5FAdblock.c                                   |    79 +-
 src/H5FAhdr.c                                      |    65 +-
 src/H5FAint.c                                      |    10 +-
 src/H5FAmodule.h                                   |    10 +-
 src/H5FApkg.h                                      |    73 +-
 src/H5FAprivate.h                                  |    12 +-
 src/H5FAstat.c                                     |    10 +-
 src/H5FAtest.c                                     |    10 +-
 src/H5FD.c                                         |    92 +-
 src/H5FDcore.c                                     |   160 +-
 src/H5FDcore.h                                     |    10 +-
 src/H5FDdirect.c                                   |    18 +-
 src/H5FDdirect.h                                   |    10 +-
 src/H5FDdrvr_module.h                              |    10 +-
 src/H5FDfamily.c                                   |   109 +-
 src/H5FDfamily.h                                   |    10 +-
 src/H5FDint.c                                      |    63 +-
 src/H5FDlog.c                                      |   175 +-
 src/H5FDlog.h                                      |    57 +-
 src/H5FDmodule.h                                   |    10 +-
 src/H5FDmpi.c                                      |    49 +-
 src/H5FDmpi.h                                      |    10 +-
 src/H5FDmpio.c                                     |    51 +-
 src/H5FDmpio.h                                     |    10 +-
 src/H5FDmulti.c                                    |   174 +-
 src/H5FDmulti.h                                    |    10 +-
 src/H5FDpkg.h                                      |    10 +-
 src/H5FDprivate.h                                  |    41 +-
 src/H5FDpublic.h                                   |    31 +-
 src/H5FDsec2.c                                     |    44 +-
 src/H5FDsec2.h                                     |    10 +-
 src/H5FDspace.c                                    |   119 +-
 src/H5FDstdio.c                                    |    71 +-
 src/H5FDstdio.h                                    |    10 +-
 src/H5FDtest.c                                     |    13 +-
 src/H5FDwindows.c                                  |    10 +-
 src/H5FDwindows.h                                  |    10 +-
 src/H5FL.c                                         |    28 +-
 src/H5FLmodule.h                                   |    10 +-
 src/H5FLprivate.h                                  |    22 +-
 src/H5FO.c                                         |    10 +-
 src/H5FOprivate.h                                  |    10 +-
 src/H5FS.c                                         |   161 +-
 src/H5FScache.c                                    |   227 +-
 src/H5FSdbg.c                                      |    10 +-
 src/H5FSint.c                                      |    10 +-
 src/H5FSmodule.h                                   |    10 +-
 src/H5FSpkg.h                                      |    36 +-
 src/H5FSprivate.h                                  |    39 +-
 src/H5FSpublic.h                                   |    10 +-
 src/H5FSsection.c                                  |   335 +-
 src/H5FSstat.c                                     |    12 +-
 src/H5FStest.c                                     |    10 +-
 src/H5Faccum.c                                     |   107 +-
 src/H5Fcwfs.c                                      |    10 +-
 src/H5Fdbg.c                                       |    10 +-
 src/H5Fdeprec.c                                    |    10 +-
 src/H5Fefc.c                                       |    18 +-
 src/H5Ffake.c                                      |    10 +-
 src/H5Fint.c                                       |   802 +-
 src/H5Fio.c                                        |   191 +-
 src/H5Fmodule.h                                    |    10 +-
 src/H5Fmount.c                                     |    24 +-
 src/H5Fmpi.c                                       |    36 +-
 src/H5Fpkg.h                                       |   129 +-
 src/H5Fprivate.h                                   |   153 +-
 src/H5Fpublic.h                                    |    30 +-
 src/H5Fquery.c                                     |   296 +-
 src/H5Fsfile.c                                     |    10 +-
 src/H5Fspace.c                                     |   224 +
 src/H5Fsuper.c                                     |   440 +-
 src/H5Fsuper_cache.c                               |   655 +-
 src/H5Ftest.c                                      |    44 +-
 src/H5G.c                                          |    14 +-
 src/H5Gbtree2.c                                    |    10 +-
 src/H5Gcache.c                                     |    61 +-
 src/H5Gcompact.c                                   |    10 +-
 src/H5Gdense.c                                     |    10 +-
 src/H5Gdeprec.c                                    |    10 +-
 src/H5Gent.c                                       |    12 +-
 src/H5Gint.c                                       |    44 +-
 src/H5Glink.c                                      |    10 +-
 src/H5Gloc.c                                       |    10 +-
 src/H5Gmodule.h                                    |    10 +-
 src/H5Gname.c                                      |    10 +-
 src/H5Gnode.c                                      |    12 +-
 src/H5Gobj.c                                       |    10 +-
 src/H5Goh.c                                        |    10 +-
 src/H5Gpkg.h                                       |    15 +-
 src/H5Gprivate.h                                   |    10 +-
 src/H5Gpublic.h                                    |    10 +-
 src/H5Groot.c                                      |    10 +-
 src/H5Gstab.c                                      |    14 +-
 src/H5Gtest.c                                      |    12 +-
 src/H5Gtraverse.c                                  |    12 +-
 src/H5HF.c                                         |    97 +-
 src/H5HFbtree2.c                                   |    10 +-
 src/H5HFcache.c                                    |  1516 +--
 src/H5HFdbg.c                                      |    10 +-
 src/H5HFdblock.c                                   |    14 +-
 src/H5HFdtable.c                                   |    10 +-
 src/H5HFhdr.c                                      |    10 +-
 src/H5HFhuge.c                                     |    12 +-
 src/H5HFiblock.c                                   |    17 +-
 src/H5HFint.c                                      |   146 -
 src/H5HFiter.c                                     |    10 +-
 src/H5HFman.c                                      |    10 +-
 src/H5HFmodule.h                                   |    10 +-
 src/H5HFpkg.h                                      |    41 +-
 src/H5HFprivate.h                                  |    12 +-
 src/H5HFpublic.h                                   |    10 +-
 src/H5HFsection.c                                  |    52 +-
 src/H5HFspace.c                                    |    10 +-
 src/H5HFstat.c                                     |    10 +-
 src/H5HFtest.c                                     |    10 +-
 src/H5HFtiny.c                                     |    10 +-
 src/H5HG.c                                         |    14 +-
 src/H5HGcache.c                                    |   376 +-
 src/H5HGdbg.c                                      |    10 +-
 src/H5HGmodule.h                                   |    10 +-
 src/H5HGpkg.h                                      |    13 +-
 src/H5HGprivate.h                                  |    10 +-
 src/H5HGpublic.h                                   |    10 +-
 src/H5HGquery.c                                    |    10 +-
 src/H5HL.c                                         |    50 +-
 src/H5HLcache.c                                    |   438 +-
 src/H5HLdbg.c                                      |    10 +-
 src/H5HLdblk.c                                     |    20 +-
 src/H5HLint.c                                      |    10 +-
 src/H5HLmodule.h                                   |    10 +-
 src/H5HLpkg.h                                      |    32 +-
 src/H5HLprfx.c                                     |    14 +-
 src/H5HLprivate.h                                  |    10 +-
 src/H5HLpublic.h                                   |    10 +-
 src/H5HP.c                                         |    13 +-
 src/H5HPprivate.h                                  |    10 +-
 src/H5I.c                                          |    12 +-
 src/H5Imodule.h                                    |    10 +-
 src/H5Ipkg.h                                       |    10 +-
 src/H5Iprivate.h                                   |    10 +-
 src/H5Ipublic.h                                    |    10 +-
 src/H5Itest.c                                      |    10 +-
 src/H5L.c                                          |    16 +-
 src/H5Lexternal.c                                  |    10 +-
 src/H5Lmodule.h                                    |    10 +-
 src/H5Lpkg.h                                       |    10 +-
 src/H5Lprivate.h                                   |    10 +-
 src/H5Lpublic.h                                    |    10 +-
 src/H5MF.c                                         |  3620 +++++-
 src/H5MFaggr.c                                     |   171 +-
 src/H5MFdbg.c                                      |   132 +-
 src/H5MFmodule.h                                   |    10 +-
 src/H5MFpkg.h                                      |    79 +-
 src/H5MFprivate.h                                  |    29 +-
 src/H5MFsection.c                                  |   724 +-
 src/H5MM.c                                         |    18 +-
 src/H5MMprivate.h                                  |    10 +-
 src/H5MMpublic.h                                   |    10 +-
 src/H5MP.c                                         |    10 +-
 src/H5MPmodule.h                                   |    10 +-
 src/H5MPpkg.h                                      |    10 +-
 src/H5MPprivate.h                                  |    10 +-
 src/H5MPtest.c                                     |    10 +-
 src/H5O.c                                          |   407 +-
 src/H5Oainfo.c                                     |    10 +-
 src/H5Oalloc.c                                     |   985 +-
 src/H5Oattr.c                                      |    28 +-
 src/H5Oattribute.c                                 |    20 +-
 src/H5Obogus.c                                     |    10 +-
 src/H5Obtreek.c                                    |    10 +-
 src/H5Ocache.c                                     |  1131 +-
 src/H5Ocache_image.c                               |   377 +
 src/H5Ochunk.c                                     |    76 +-
 src/H5Ocont.c                                      |    10 +-
 src/H5Ocopy.c                                      |    37 +-
 src/H5Odbg.c                                       |    12 +-
 src/H5Odrvinfo.c                                   |    10 +-
 src/H5Odtype.c                                     |   306 +-
 src/H5Oefl.c                                       |    10 +-
 src/H5Ofill.c                                      |    10 +-
 src/H5Oflush.c                                     |    88 +-
 src/H5Ofsinfo.c                                    |   202 +-
 src/H5Oginfo.c                                     |    10 +-
 src/H5Olayout.c                                    |    13 +-
 src/H5Olinfo.c                                     |    10 +-
 src/H5Olink.c                                      |    10 +-
 src/H5Omessage.c                                   |   164 +-
 src/H5Omodule.h                                    |    10 +-
 src/H5Omtime.c                                     |    10 +-
 src/H5Oname.c                                      |    10 +-
 src/H5Onull.c                                      |    10 +-
 src/H5Opkg.h                                       |   161 +-
 src/H5Opline.c                                     |    10 +-
 src/H5Oprivate.h                                   |    75 +-
 src/H5Oproxy.c                                     |   900 --
 src/H5Opublic.h                                    |    10 +-
 src/H5Orefcount.c                                  |    10 +-
 src/H5Osdspace.c                                   |    10 +-
 src/H5Oshared.c                                    |    10 +-
 src/H5Oshared.h                                    |    10 +-
 src/H5Oshmesg.c                                    |    10 +-
 src/H5Ostab.c                                      |    10 +-
 src/H5Otest.c                                      |   186 +-
 src/H5Ounknown.c                                   |    10 +-
 src/H5P.c                                          |    18 +-
 src/H5PB.c                                         |  1537 +++
 src/H5PBmodule.h                                   |    32 +
 src/H5PBpkg.h                                      |    58 +
 src/H5PBprivate.h                                  |   106 +
 src/H5PL.c                                         |   364 +-
 src/H5PLextern.h                                   |    10 +-
 src/H5PLmodule.h                                   |    10 +-
 src/H5PLpkg.h                                      |    48 +
 src/H5PLprivate.h                                  |    10 +-
 src/H5PLpublic.h                                   |    19 +-
 src/H5Pacpl.c                                      |    10 +-
 src/H5Pdapl.c                                      |    22 +-
 src/H5Pdcpl.c                                      |    24 +-
 src/H5Pdeprec.c                                    |   140 +-
 src/H5Pdxpl.c                                      |    17 +-
 src/H5Pencdec.c                                    |    10 +-
 src/H5Pfapl.c                                      |   513 +-
 src/H5Pfcpl.c                                      |   260 +-
 src/H5Pfmpl.c                                      |    10 +-
 src/H5Pgcpl.c                                      |    10 +-
 src/H5Pint.c                                       |    14 +-
 src/H5Plapl.c                                      |    10 +-
 src/H5Plcpl.c                                      |    10 +-
 src/H5Pmodule.h                                    |    10 +-
 src/H5Pocpl.c                                      |    10 +-
 src/H5Pocpypl.c                                    |    10 +-
 src/H5Ppkg.h                                       |    12 +-
 src/H5Pprivate.h                                   |    10 +-
 src/H5Ppublic.h                                    |    28 +-
 src/H5Pstrcpl.c                                    |    10 +-
 src/H5Ptest.c                                      |   102 +-
 src/H5R.c                                          |    10 +-
 src/H5RS.c                                         |    10 +-
 src/H5RSprivate.h                                  |    10 +-
 src/H5Rdeprec.c                                    |    10 +-
 src/H5Rmodule.h                                    |    10 +-
 src/H5Rpkg.h                                       |    10 +-
 src/H5Rprivate.h                                   |    10 +-
 src/H5Rpublic.h                                    |    10 +-
 src/H5S.c                                          |    14 +-
 src/H5SL.c                                         |    26 +-
 src/H5SLmodule.h                                   |    10 +-
 src/H5SLprivate.h                                  |    10 +-
 src/H5SM.c                                         |    22 +-
 src/H5SMbtree2.c                                   |    10 +-
 src/H5SMcache.c                                    |    84 +-
 src/H5SMmessage.c                                  |    10 +-
 src/H5SMmodule.h                                   |    10 +-
 src/H5SMpkg.h                                      |    12 +-
 src/H5SMprivate.h                                  |    10 +-
 src/H5SMtest.c                                     |    10 +-
 src/H5ST.c                                         |    44 +-
 src/H5STprivate.h                                  |    10 +-
 src/H5Sall.c                                       |    10 +-
 src/H5Sdbg.c                                       |    10 +-
 src/H5Shyper.c                                     |    70 +-
 src/H5Smodule.h                                    |    10 +-
 src/H5Smpio.c                                      |    10 +-
 src/H5Snone.c                                      |    10 +-
 src/H5Spkg.h                                       |    10 +-
 src/H5Spoint.c                                     |    20 +-
 src/H5Sprivate.h                                   |    14 +-
 src/H5Spublic.h                                    |    10 +-
 src/H5Sselect.c                                    |   121 +-
 src/H5Stest.c                                      |    10 +-
 src/H5T.c                                          |    69 +-
 src/H5TS.c                                         |    15 +-
 src/H5TSprivate.h                                  |    10 +-
 src/H5Tarray.c                                     |    10 +-
 src/H5Tbit.c                                       |    77 +-
 src/H5Tcommit.c                                    |    16 +-
 src/H5Tcompound.c                                  |    10 +-
 src/H5Tconv.c                                      |    18 +-
 src/H5Tcset.c                                      |    10 +-
 src/H5Tdbg.c                                       |    10 +-
 src/H5Tdeprec.c                                    |    10 +-
 src/H5Tenum.c                                      |    10 +-
 src/H5Tfields.c                                    |    10 +-
 src/H5Tfixed.c                                     |    10 +-
 src/H5Tfloat.c                                     |    10 +-
 src/H5Tmodule.h                                    |    10 +-
 src/H5Tnative.c                                    |    10 +-
 src/H5Toffset.c                                    |    10 +-
 src/H5Toh.c                                        |    10 +-
 src/H5Topaque.c                                    |    10 +-
 src/H5Torder.c                                     |    10 +-
 src/H5Tpad.c                                       |    10 +-
 src/H5Tpkg.h                                       |    14 +-
 src/H5Tprecis.c                                    |    10 +-
 src/H5Tprivate.h                                   |    12 +-
 src/H5Tpublic.h                                    |    10 +-
 src/H5Tstrpad.c                                    |    10 +-
 src/H5Tvisit.c                                     |    10 +-
 src/H5Tvlen.c                                      |    20 +-
 src/H5UC.c                                         |    10 +-
 src/H5UCprivate.h                                  |    10 +-
 src/H5VM.c                                         |    10 +-
 src/H5VMprivate.h                                  |    10 +-
 src/H5WB.c                                         |    10 +-
 src/H5WBprivate.h                                  |    10 +-
 src/H5Z.c                                          |    12 +-
 src/H5Zdeflate.c                                   |    10 +-
 src/H5Zfletcher32.c                                |    10 +-
 src/H5Zmodule.h                                    |    10 +-
 src/H5Znbit.c                                      |   923 +-
 src/H5Zpkg.h                                       |    10 +-
 src/H5Zprivate.h                                   |    10 +-
 src/H5Zpublic.h                                    |    10 +-
 src/H5Zscaleoffset.c                               |   221 +-
 src/H5Zshuffle.c                                   |    10 +-
 src/H5Zszip.c                                      |    12 +-
 src/H5Ztrans.c                                     |   151 +-
 src/H5api_adpt.h                                   |    10 +-
 src/H5checksum.c                                   |    10 +-
 src/H5config.h.in                                  |    24 +
 src/H5dbg.c                                        |    10 +-
 src/H5detect.c                                     |    22 +-
 src/H5err.txt                                      |    16 +-
 src/H5make_libsettings.c                           |    20 +-
 src/H5overflow.h                                   |    10 +-
 src/H5overflow.txt                                 |    10 +-
 src/H5private.h                                    |    81 +-
 src/H5public.h                                     |    35 +-
 src/H5system.c                                     |   204 +-
 src/H5timer.c                                      |    48 +-
 src/H5trace.c                                      |    47 +-
 src/H5vers.txt                                     |    10 +-
 src/H5version.h                                    |    10 +-
 src/H5win32defs.h                                  |    64 +-
 src/Makefile.am                                    |    37 +-
 src/Makefile.in                                    |   380 +-
 src/hdf5.h                                         |    10 +-
 test/CMakeLists.txt                                |   102 +-
 test/CMakeTests.cmake                              |   465 +-
 test/COPYING                                       |    11 +-
 test/H5srcdir.h                                    |    52 +-
 test/H5srcdir_str.h.in                             |    10 +-
 test/Makefile.am                                   |    74 +-
 test/Makefile.in                                   |   342 +-
 test/accum.c                                       |    69 +-
 test/accum_swmr_reader.c                           |    10 +-
 test/aggr.h5                                       |   Bin 0 -> 2448 bytes
 test/app_ref.c                                     |    10 +-
 test/atomic_reader.c                               |   318 +-
 test/atomic_writer.c                               |   215 +-
 test/bad_compound.h5                               |   Bin 2208 -> 2208 bytes
 test/big.c                                         |    18 +-
 test/bittests.c                                    |    76 +-
 test/btree2.c                                      |    10 +-
 test/cache.c                                       | 11251 +++++++++--------
 test/cache_api.c                                   |  1912 +--
 test/cache_common.c                                |  1625 +--
 test/cache_common.h                                |    88 +-
 test/cache_image.c                                 |  8081 ++++++++++++
 test/cache_logging.c                               |    11 +-
 test/cache_tagging.c                               |  1645 ++-
 test/chunk_info.c                                  |    10 +-
 test/cmpd_dset.c                                   |   252 +-
 test/cork.c                                        |  1563 ++-
 test/corrupt_stab_msg.h5                           |   Bin 2928 -> 2928 bytes
 test/cross_read.c                                  |   334 +-
 test/dangle.c                                      |    10 +-
 test/deflate.h5                                    |   Bin 6240 -> 6240 bytes
 test/dsets.c                                       |  1421 ++-
 test/dt_arith.c                                    |   196 +-
 test/dtransform.c                                  |    10 +-
 test/dtypes.c                                      |    30 +-
 test/dynlib1.c                                     |    10 +-
 test/dynlib2.c                                     |    10 +-
 test/dynlib3.c                                     |    10 +-
 test/dynlib4.c                                     |   102 +
 test/earray.c                                      |   310 +-
 test/efc.c                                         |   322 +-
 test/enc_dec_plist.c                               |    17 +-
 test/enc_dec_plist_cross_platform.c                |    10 +-
 test/enum.c                                        |    10 +-
 test/err_compat.c                                  |    10 +-
 test/error_test.c                                  |    20 +-
 test/evict_on_close.c                              |  1091 ++
 test/extend.c                                      |    12 +-
 test/external.c                                    |    14 +-
 test/family_v16_00000.h5                           |   Bin 5120 -> 5120 bytes
 test/farray.c                                      |    10 +-
 test/fheap.c                                       |   936 +-
 test/file_image.c                                  |    26 +-
 test/filespace_1_6.h5                              |   Bin 2448 -> 2448 bytes
 test/filespace_1_8.h5                              |   Bin 2448 -> 2544 bytes
 test/fill_old.h5                                   |   Bin 2560 -> 2560 bytes
 test/fillval.c                                     |    58 +-
 test/filter_fail.c                                 |    17 +-
 test/flush1.c                                      |   365 +-
 test/flush2.c                                      |   489 +-
 test/flushrefresh.c                                |   856 +-
 test/freespace.c                                   |   666 +-
 test/fsm_aggr_nopersist.h5                         |   Bin 0 -> 2448 bytes
 test/fsm_aggr_persist.h5                           |   Bin 0 -> 2565 bytes
 test/gen_bad_compound.c                            |    10 +-
 test/gen_bad_ohdr.c                                |    10 +-
 test/gen_bogus.c                                   |    10 +-
 test/gen_cross.c                                   |    18 +-
 test/gen_deflate.c                                 |   122 +-
 test/gen_file_image.c                              |    81 +-
 test/gen_filespace.c                               |   146 +-
 test/gen_filters.c                                 |    10 +-
 test/gen_idx.c                                     |   126 -
 test/gen_mergemsg.c                                |    10 +-
 test/gen_new_array.c                               |    10 +-
 test/gen_new_fill.c                                |    10 +-
 test/gen_new_group.c                               |    10 +-
 test/gen_new_mtime.c                               |    10 +-
 test/gen_new_super.c                               |    10 +-
 test/gen_noencoder.c                               |    10 +-
 test/gen_nullspace.c                               |    10 +-
 test/gen_old_array.c                               |    10 +-
 test/gen_old_group.c                               |    10 +-
 test/gen_old_layout.c                              |    10 +-
 test/gen_old_mtime.c                               |    10 +-
 test/gen_plist.c                                   |    38 +-
 test/gen_sizes_lheap.c                             |    10 +-
 test/gen_specmetaread.c                            |    10 +-
 test/gen_udlinks.c                                 |    10 +-
 test/genall5.c                                     |  3886 ++++++
 test/genall5.h                                     |    51 +
 test/getname.c                                     |    99 +-
 test/gheap.c                                       |   144 +-
 test/group_old.h5                                  |   Bin 1952 -> 1952 bytes
 .../testfiles => test}/h5fc_ext1_f.h5              |   Bin
 .../testfiles => test}/h5fc_ext1_i.h5              |   Bin
 .../testfiles => test}/h5fc_ext2_if.h5             |   Bin
 .../testfiles => test}/h5fc_ext2_sf.h5             |   Bin
 .../testfiles => test}/h5fc_ext3_isf.h5            |   Bin
 .../testfiles => test}/h5fc_ext_none.h5            |   Bin
 test/h5test.c                                      |   317 +-
 test/h5test.h                                      |    18 +-
 test/hyperslab.c                                   |    38 +-
 test/istore.c                                      |    26 +-
 test/lheap.c                                       |    26 +-
 test/links.c                                       |   322 +-
 test/links_env.c                                   |    22 +-
 test/mergemsg.h5                                   |   Bin 3472 -> 3472 bytes
 test/mf.c                                          |  5295 +++++---
 test/mount.c                                       |    10 +-
 test/mtime.c                                       |    12 +-
 test/multi_file_v16-s.h5                           |   Bin 2048 -> 2048 bytes
 test/noencoder.h5                                  |   Bin 8088 -> 8088 bytes
 test/none.h5                                       |   Bin 0 -> 1808 bytes
 test/ntypes.c                                      |    10 +-
 test/objcopy.c                                     |   454 +-
 test/ohdr.c                                        |   192 +-
 test/page_buffer.c                                 |  2206 ++++
 test/paged_nopersist.h5                            |   Bin 0 -> 8192 bytes
 test/paged_persist.h5                              |   Bin 0 -> 16384 bytes
 test/plugin.c                                      |   976 +-
 test/pool.c                                        |    12 +-
 test/reserved.c                                    |    10 +-
 test/set_extent.c                                  |   127 +-
 test/space_overflow.c                              |    10 +-
 test/stab.c                                        |    91 +-
 test/swmr.c                                        |  1276 +-
 test/swmr_addrem_writer.c                          |    33 +-
 test/swmr_check_compat_vfd.c                       |    10 +-
 test/swmr_common.c                                 |    14 +-
 test/swmr_common.h                                 |    10 +-
 test/swmr_generator.c                              |    69 +-
 test/swmr_reader.c                                 |   144 +-
 test/swmr_remove_reader.c                          |    10 +-
 test/swmr_remove_writer.c                          |    12 +-
 test/swmr_sparse_reader.c                          |    10 +-
 test/swmr_sparse_writer.c                          |    53 +-
 test/swmr_start_write.c                            |   228 +-
 test/swmr_writer.c                                 |   136 +-
 test/tarray.c                                      |    18 +-
 test/tarrold.h5                                    |   Bin 6032 -> 6032 bytes
 test/tattr.c                                       |    94 +-
 test/tcheck_version.c                              |    20 +-
 test/tchecksum.c                                   |    37 +-
 test/tconfig.c                                     |    20 +-
 test/tcoords.c                                     |    10 +-
 test/test_filters_be.h5                            |   Bin 5720 -> 5720 bytes
 test/test_filters_le.h5                            |   Bin 5720 -> 5720 bytes
 test/test_plugin.sh.in                             |    14 +-
 test/test_usecases.sh.in                           |    43 +-
 test/testcheck_version.sh.in                       |    10 +-
 test/testerror.sh.in                               |    10 +-
 test/testfiles/plist_files/dapl_32be               |   Bin 136 -> 186 bytes
 test/testfiles/plist_files/dapl_32le               |   Bin 136 -> 186 bytes
 test/testfiles/plist_files/dapl_64be               |   Bin 136 -> 186 bytes
 test/testfiles/plist_files/dapl_64le               |   Bin 136 -> 186 bytes
 test/testfiles/plist_files/def_dapl_32be           |   Bin 131 -> 181 bytes
 test/testfiles/plist_files/def_dapl_32le           |   Bin 131 -> 181 bytes
 test/testfiles/plist_files/def_dapl_64be           |   Bin 131 -> 181 bytes
 test/testfiles/plist_files/def_dapl_64le           |   Bin 131 -> 181 bytes
 test/testfiles/plist_files/def_dxpl_32be           |   Bin 225 -> 245 bytes
 test/testfiles/plist_files/def_dxpl_32le           |   Bin 225 -> 245 bytes
 test/testfiles/plist_files/def_dxpl_64be           |   Bin 225 -> 245 bytes
 test/testfiles/plist_files/def_dxpl_64le           |   Bin 225 -> 245 bytes
 test/testfiles/plist_files/def_fapl_32be           |   Bin 1460 -> 1520 bytes
 test/testfiles/plist_files/def_fapl_32le           |   Bin 1460 -> 1520 bytes
 test/testfiles/plist_files/def_fapl_64be           |   Bin 1460 -> 1520 bytes
 test/testfiles/plist_files/def_fapl_64le           |   Bin 1460 -> 1520 bytes
 test/testfiles/plist_files/def_fcpl_32be           |   Bin 412 -> 452 bytes
 test/testfiles/plist_files/def_fcpl_32le           |   Bin 412 -> 452 bytes
 test/testfiles/plist_files/def_fcpl_64be           |   Bin 412 -> 452 bytes
 test/testfiles/plist_files/def_fcpl_64le           |   Bin 412 -> 452 bytes
 test/testfiles/plist_files/dxpl_32be               |   Bin 229 -> 249 bytes
 test/testfiles/plist_files/dxpl_32le               |   Bin 229 -> 249 bytes
 test/testfiles/plist_files/dxpl_64be               |   Bin 229 -> 249 bytes
 test/testfiles/plist_files/dxpl_64le               |   Bin 229 -> 249 bytes
 test/testfiles/plist_files/fapl_32be               |   Bin 1462 -> 1522 bytes
 test/testfiles/plist_files/fapl_32le               |   Bin 1462 -> 1522 bytes
 test/testfiles/plist_files/fapl_64be               |   Bin 1462 -> 1522 bytes
 test/testfiles/plist_files/fapl_64le               |   Bin 1462 -> 1522 bytes
 test/testfiles/plist_files/fcpl_32be               |   Bin 413 -> 453 bytes
 test/testfiles/plist_files/fcpl_32le               |   Bin 413 -> 453 bytes
 test/testfiles/plist_files/fcpl_64be               |   Bin 413 -> 453 bytes
 test/testfiles/plist_files/fcpl_64le               |   Bin 413 -> 453 bytes
 test/testfiles/plist_files/lapl_32be               |   Bin 1565 -> 1625 bytes
 test/testfiles/plist_files/lapl_32le               |   Bin 1565 -> 1625 bytes
 test/testfiles/plist_files/lapl_64be               |   Bin 1565 -> 1625 bytes
 test/testfiles/plist_files/lapl_64le               |   Bin 1565 -> 1625 bytes
 test/testflushrefresh.sh.in                        |    51 +-
 test/testframe.c                                   |    75 +-
 test/testhdf5.c                                    |    13 +-
 test/testhdf5.h                                    |    10 +-
 test/testlibinfo.sh.in                             |    10 +-
 test/testlinks_env.sh.in                           |    10 +-
 test/testmeta.c                                    |    10 +-
 test/testswmr.sh.in                                |    97 +-
 test/testvdsswmr.sh.in                             |    41 +-
 test/tfile.c                                       |  2336 +++-
 test/tgenprop.c                                    |    16 +-
 test/th5o.c                                        |    76 +-
 test/th5s.c                                        |    30 +-
 test/th5s.h5                                       |   Bin 2049 -> 2049 bytes
 test/theap.c                                       |    60 +-
 test/tid.c                                         |    10 +-
 test/titerate.c                                    |    41 +-
 test/tlayouto.h5                                   |   Bin 1576 -> 1576 bytes
 test/tmeta.c                                       |    12 +-
 test/tmisc.c                                       |    36 +-
 test/tmtimen.h5                                    |   Bin 1576 -> 1576 bytes
 test/tmtimeo.h5                                    |   Bin 2052 -> 2052 bytes
 test/trefer.c                                      |    38 +-
 test/trefstr.c                                     |    10 +-
 test/tselect.c                                     |    42 +-
 test/tskiplist.c                                   |    64 +-
 test/tsohm.c                                       |    93 +-
 test/ttime.c                                       |    10 +-
 test/ttsafe.c                                      |    15 +-
 test/ttsafe.h                                      |    10 +-
 test/ttsafe_acreate.c                              |    14 +-
 test/ttsafe_cancel.c                               |    10 +-
 test/ttsafe_dcreate.c                              |    10 +-
 test/ttsafe_error.c                                |    10 +-
 test/ttst.c                                        |    15 +-
 test/tunicode.c                                    |    52 +-
 test/tvlstr.c                                      |    10 +-
 test/tvltypes.c                                    |   116 +-
 test/twriteorder.c                                 |    72 +-
 test/unlink.c                                      |    17 +-
 test/unregister.c                                  |    14 +-
 test/use.h                                         |    18 +-
 test/use_append_chunk.c                            |    36 +-
 test/use_append_mchunks.c                          |    18 +-
 test/use_common.c                                  |    43 +-
 test/use_disable_mdc_flushes.c                     |    25 +-
 test/vds.c                                         |    66 +-
 test/vds_swmr.h                                    |    10 +-
 test/vds_swmr_gen.c                                |    12 +-
 test/vds_swmr_reader.c                             |    14 +-
 test/vds_swmr_writer.c                             |    22 +-
 test/vfd.c                                         |   578 +-
 testpar/CMakeLists.txt                             |    10 +-
 testpar/CMakeTests.cmake                           |    33 +-
 testpar/COPYING                                    |    11 +-
 testpar/Makefile.am                                |    12 +-
 testpar/Makefile.in                                |    62 +-
 testpar/t_cache.c                                  |   250 +-
 testpar/t_cache_image.c                            |  4275 +++++++
 testpar/t_chunk_alloc.c                            |    10 +-
 testpar/t_coll_chunk.c                             |    10 +-
 testpar/t_dset.c                                   |    16 +-
 testpar/t_file.c                                   |   627 +-
 testpar/t_file_image.c                             |    16 +-
 testpar/t_filter_read.c                            |    21 +-
 testpar/t_init_term.c                              |    10 +-
 testpar/t_mdset.c                                  |   102 +-
 testpar/t_mpi.c                                    |    10 +-
 testpar/t_pflush1.c                                |    10 +-
 testpar/t_pflush2.c                                |    10 +-
 testpar/t_ph5basic.c                               |    10 +-
 testpar/t_prestart.c                               |    10 +-
 testpar/t_prop.c                                   |    10 +-
 testpar/t_pshutdown.c                              |    10 +-
 testpar/t_shapesame.c                              |    34 +-
 testpar/t_span_tree.c                              |    10 +-
 testpar/testpar.h                                  |    10 +-
 testpar/testphdf5.c                                |    26 +-
 testpar/testphdf5.h                                |    12 +-
 tools/CMakeLists.txt                               |    49 +-
 tools/COPYING                                      |    11 +-
 tools/Makefile.am                                  |    12 +-
 tools/Makefile.in                                  |    23 +-
 tools/h5copy/CMakeLists.txt                        |    50 -
 tools/h5copy/CMakeTests.cmake                      |   381 -
 tools/h5copy/Makefile.am                           |    50 -
 tools/h5copy/Makefile.in                           |  1492 ---
 tools/h5copy/h5copy.c                              |   510 -
 tools/h5copy/h5copygentest.c                       |   920 --
 tools/h5copy/testfiles/h5copy_extlinks_src.out.ls  |    43 -
 tools/h5copy/testfiles/h5copy_ref.out.ls           |    31 -
 tools/h5copy/testfiles/h5copytst.h5                |   Bin 30480 -> 0 bytes
 tools/h5copy/testfiles/h5copytst.out.ls            |   429 -
 tools/h5copy/testfiles/h5copytst_new.h5            |   Bin 15029 -> 0 bytes
 tools/h5copy/testh5copy.sh.in                      |   605 -
 tools/h5diff/CMakeLists.txt                        |    79 -
 tools/h5diff/CMakeTests.cmake                      |  1446 ---
 tools/h5diff/Makefile.am                           |    61 -
 tools/h5diff/Makefile.in                           |  1516 ---
 tools/h5diff/h5diff_common.c                       |   606 -
 tools/h5diff/h5diff_common.h                       |    36 -
 tools/h5diff/h5diff_main.c                         |   143 -
 tools/h5diff/h5diffgentest.c                       |  7400 -----------
 tools/h5diff/ph5diff_main.c                        |   329 -
 tools/h5diff/testfiles/h5diff_dset_idx1.h5         |   Bin 5974 -> 0 bytes
 tools/h5diff/testfiles/h5diff_dset_idx2.h5         |   Bin 2206 -> 0 bytes
 tools/h5diff/testfiles/h5diff_hyper1.h5            |   Bin 1052720 -> 0 bytes
 tools/h5diff/testfiles/h5diff_hyper2.h5            |   Bin 1052720 -> 0 bytes
 tools/h5diff/testfiles/h5diff_idx.txt              |    14 -
 tools/h5diff/testfiles/tmptest.he5                 |   Bin 4740424 -> 0 bytes
 tools/h5diff/testfiles/tmptest2.he5                |   Bin 4734280 -> 0 bytes
 tools/h5diff/testh5diff.sh.in                      |  1160 --
 tools/h5diff/testph5diff.sh.in                     |    64 -
 tools/h5dump/CMakeLists.txt                        |    63 -
 tools/h5dump/CMakeTests.cmake                      |  1465 ---
 tools/h5dump/CMakeTestsPBITS.cmake                 |   367 -
 tools/h5dump/CMakeTestsVDS.cmake                   |   266 -
 tools/h5dump/CMakeTestsXML.cmake                   |   434 -
 tools/h5dump/Makefile.am                           |    51 -
 tools/h5dump/Makefile.in                           |  1514 ---
 tools/h5dump/binread.c                             |    97 -
 tools/h5dump/h5dump.c                              |  1800 ---
 tools/h5dump/h5dump.h                              |   116 -
 tools/h5dump/h5dump_ddl.c                          |  2176 ----
 tools/h5dump/h5dump_ddl.h                          |    52 -
 tools/h5dump/h5dump_defines.h                      |    56 -
 tools/h5dump/h5dump_extern.h                       |   115 -
 tools/h5dump/h5dump_xml.c                          |  4584 -------
 tools/h5dump/h5dump_xml.h                          |    39 -
 tools/h5dump/h5dumpgentest.c                       |  9948 ---------------
 tools/h5dump/testh5dump.sh.in                      |  1339 --
 tools/h5dump/testh5dumppbits.sh.in                 |   598 -
 tools/h5dump/testh5dumpvds.sh.in                   |   523 -
 tools/h5dump/testh5dumpxml.sh.in                   |   388 -
 tools/h5format_convert/CMakeLists.txt              |    59 -
 tools/h5format_convert/CMakeTests.cmake            |   463 -
 tools/h5format_convert/Makefile.am                 |    49 -
 tools/h5format_convert/Makefile.in                 |  1502 ---
 tools/h5format_convert/h5fc_chk_idx.c              |   101 -
 tools/h5format_convert/h5fc_gentest.c              |   664 -
 tools/h5format_convert/h5format_convert.c          |   476 -
 tools/h5format_convert/testfiles/h5fc_edge_v3.h5   |   Bin 2526 -> 0 bytes
 tools/h5format_convert/testfiles/h5fc_ext1_f.ddl   |    58 -
 tools/h5format_convert/testfiles/h5fc_ext1_i.ddl   |    58 -
 tools/h5format_convert/testfiles/h5fc_ext1_s.ddl   |    58 -
 tools/h5format_convert/testfiles/h5fc_ext1_s.h5    |   Bin 6592 -> 0 bytes
 tools/h5format_convert/testfiles/h5fc_ext2_if.ddl  |    58 -
 tools/h5format_convert/testfiles/h5fc_ext2_is.ddl  |    58 -
 tools/h5format_convert/testfiles/h5fc_ext2_is.h5   |   Bin 6642 -> 0 bytes
 tools/h5format_convert/testfiles/h5fc_ext2_sf.ddl  |    58 -
 tools/h5format_convert/testfiles/h5fc_ext3_isf.ddl |    58 -
 tools/h5format_convert/testfiles/h5fc_non_v3.h5    |   Bin 6896 -> 0 bytes
 .../h5format_convert/testfiles/old_h5fc_ext1_f.ddl |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext1_f.h5  |   Bin 19987 -> 0 bytes
 .../h5format_convert/testfiles/old_h5fc_ext1_i.ddl |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext1_i.h5  |   Bin 32716 -> 0 bytes
 .../h5format_convert/testfiles/old_h5fc_ext1_s.ddl |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext1_s.h5  |   Bin 20032 -> 0 bytes
 .../testfiles/old_h5fc_ext2_if.ddl                 |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext2_if.h5 |   Bin 32720 -> 0 bytes
 .../testfiles/old_h5fc_ext2_is.ddl                 |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext2_is.h5 |   Bin 32872 -> 0 bytes
 .../testfiles/old_h5fc_ext2_sf.ddl                 |    58 -
 .../h5format_convert/testfiles/old_h5fc_ext2_sf.h5 |   Bin 18512 -> 0 bytes
 .../testfiles/old_h5fc_ext3_isf.ddl                |    58 -
 .../testfiles/old_h5fc_ext3_isf.h5                 |   Bin 32896 -> 0 bytes
 .../testfiles/old_h5fc_ext_none.h5                 |   Bin 19912 -> 0 bytes
 tools/h5format_convert/testh5fc.sh.in              |   527 -
 tools/h5import/CMakeLists.txt                      |    51 -
 tools/h5import/CMakeTests.cmake                    |   495 -
 tools/h5import/Makefile.am                         |    46 -
 tools/h5import/Makefile.in                         |  1488 ---
 tools/h5import/h5import.c                          |  4393 -------
 tools/h5import/h5import.h                          |   198 -
 tools/h5import/h5importtest.c                      |   371 -
 tools/h5import/h5importtestutil.sh.in              |   384 -
 tools/h5import/testfiles/binfp64.h5                |   Bin 10760 -> 0 bytes
 tools/h5import/testfiles/binin16.h5                |   Bin 10760 -> 0 bytes
 tools/h5import/testfiles/binin32.h5                |   Bin 9472 -> 0 bytes
 tools/h5import/testfiles/binin8.h5                 |   Bin 10760 -> 0 bytes
 tools/h5import/testfiles/binuin16.h5               |   Bin 10760 -> 0 bytes
 tools/h5import/testfiles/binuin32.h5               |   Bin 6384 -> 0 bytes
 tools/h5import/testfiles/txtfp32.h5                |   Bin 4192 -> 0 bytes
 tools/h5import/testfiles/txtfp64.h5                |   Bin 9784 -> 0 bytes
 tools/h5import/testfiles/txtin16.h5                |   Bin 9784 -> 0 bytes
 tools/h5import/testfiles/txtin32.h5                |   Bin 4192 -> 0 bytes
 tools/h5import/testfiles/txtin8.h5                 |   Bin 9784 -> 0 bytes
 tools/h5import/testfiles/txtuin16.h5               |   Bin 10240 -> 0 bytes
 tools/h5import/testfiles/txtuin32.h5               |   Bin 6240 -> 0 bytes
 tools/h5jam/CMakeLists.txt                         |    77 -
 tools/h5jam/CMakeTests.cmake                       |   428 -
 tools/h5jam/Makefile.am                            |    45 -
 tools/h5jam/Makefile.in                            |  1510 ---
 tools/h5jam/getub.c                                |   157 -
 tools/h5jam/h5jam.c                                |   558 -
 tools/h5jam/h5jamgentest.c                         |   384 -
 tools/h5jam/h5unjam.c                              |   409 -
 tools/h5jam/tellub.c                               |   196 -
 tools/h5jam/testh5jam.sh.in                        |   699 --
 tools/h5ls/CMakeLists.txt                          |    46 -
 tools/h5ls/CMakeTests.cmake                        |   409 -
 tools/h5ls/CMakeTestsVDS.cmake                     |   149 -
 tools/h5ls/Makefile.am                             |    40 -
 tools/h5ls/Makefile.in                             |  1456 ---
 tools/h5ls/h5ls.c                                  |  2941 -----
 tools/h5ls/testh5ls.sh.in                          |   435 -
 tools/h5ls/testh5lsvds.sh.in                       |   258 -
 tools/h5repack/CMakeLists.txt                      |    95 -
 tools/h5repack/CMakeTests.cmake                    |  1131 --
 tools/h5repack/Makefile.am                         |    78 -
 tools/h5repack/Makefile.in                         |  1604 ---
 tools/h5repack/dynlib_rpk.c                        |   109 -
 tools/h5repack/h5repack.c                          |   943 --
 tools/h5repack/h5repack.h                          |   243 -
 tools/h5repack/h5repack.sh.in                      |  1205 --
 tools/h5repack/h5repack_copy.c                     |  1677 ---
 tools/h5repack/h5repack_filters.c                  |   490 -
 tools/h5repack/h5repack_main.c                     |   619 -
 tools/h5repack/h5repack_opttable.c                 |   369 -
 tools/h5repack/h5repack_parse.c                    |   714 --
 tools/h5repack/h5repack_plugin.sh.in               |   264 -
 tools/h5repack/h5repack_refs.c                     |   881 --
 tools/h5repack/h5repack_verify.c                   |   702 --
 tools/h5repack/h5repacktst.c                       |  6884 -----------
 tools/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl  |    59 -
 .../testfiles/deflate_limit.h5repack_layout.h5.ddl |   130 -
 tools/h5repack/testfiles/h5repack-help.txt         |   122 -
 tools/h5repack/testfiles/h5repack_attr.h5          |   Bin 20056 -> 0 bytes
 tools/h5repack/testfiles/h5repack_attr_refs.h5     |   Bin 10112 -> 0 bytes
 tools/h5repack/testfiles/h5repack_deflate.h5       |   Bin 5962 -> 0 bytes
 tools/h5repack/testfiles/h5repack_early.h5         |   Bin 2067224 -> 0 bytes
 tools/h5repack/testfiles/h5repack_ext.h5           |   Bin 1464 -> 0 bytes
 tools/h5repack/testfiles/h5repack_fill.h5          |   Bin 2072 -> 0 bytes
 tools/h5repack/testfiles/h5repack_filters.h5       |   Bin 29744 -> 0 bytes
 tools/h5repack/testfiles/h5repack_fletcher.h5      |   Bin 7880 -> 0 bytes
 tools/h5repack/testfiles/h5repack_hlink.h5         |   Bin 6576 -> 0 bytes
 tools/h5repack/testfiles/h5repack_layout.h5        |   Bin 27280 -> 0 bytes
 .../testfiles/h5repack_layout.h5-plugin_test.ddl   |   158 -
 tools/h5repack/testfiles/h5repack_layout2.h5       |   Bin 6808 -> 0 bytes
 tools/h5repack/testfiles/h5repack_layout3.h5       |   Bin 491840 -> 0 bytes
 tools/h5repack/testfiles/h5repack_layouto.h5       |   Bin 1576 -> 0 bytes
 tools/h5repack/testfiles/h5repack_named_dtypes.h5  |   Bin 4304 -> 0 bytes
 tools/h5repack/testfiles/h5repack_nbit.h5          |   Bin 13776 -> 0 bytes
 tools/h5repack/testfiles/h5repack_objs.h5          |   Bin 19770 -> 0 bytes
 tools/h5repack/testfiles/h5repack_refs.h5          |   Bin 9472 -> 0 bytes
 tools/h5repack/testfiles/h5repack_shuffle.h5       |   Bin 7864 -> 0 bytes
 tools/h5repack/testfiles/h5repack_soffset.h5       |   Bin 11052 -> 0 bytes
 tools/h5repack/testfiles/h5repack_szip.h5          |   Bin 5588 -> 0 bytes
 tools/h5repack/testh5repack_detect_szip.c          |    62 -
 tools/h5stat/CMakeLists.txt                        |    53 -
 tools/h5stat/CMakeTests.cmake                      |   261 -
 tools/h5stat/Makefile.am                           |    55 -
 tools/h5stat/Makefile.in                           |  1538 ---
 tools/h5stat/h5stat.c                              |  1815 ---
 tools/h5stat/h5stat_gentest.c                      |   449 -
 tools/h5stat/testfiles/h5stat_filters.ddl          |    97 -
 tools/h5stat/testfiles/h5stat_filters.h5           |   Bin 46272 -> 0 bytes
 tools/h5stat/testfiles/h5stat_idx.ddl              |    93 -
 tools/h5stat/testfiles/h5stat_idx.h5               |   Bin 2206 -> 0 bytes
 tools/h5stat/testfiles/h5stat_links2.ddl           |   105 -
 tools/h5stat/testfiles/h5stat_newgrat.ddl          |    95 -
 tools/h5stat/testfiles/h5stat_newgrat.h5           |   Bin 6362168 -> 0 bytes
 tools/h5stat/testfiles/h5stat_numattrs1.ddl        |    17 -
 tools/h5stat/testfiles/h5stat_numattrs2.ddl        |   105 -
 tools/h5stat/testfiles/h5stat_tsohm.ddl            |    90 -
 tools/h5stat/testh5stat.sh.in                      |   318 -
 tools/lib/CMakeLists.txt                           |    16 +-
 tools/lib/Makefile.am                              |    10 +-
 tools/lib/Makefile.in                              |    36 +-
 tools/lib/h5diff.c                                 |   194 +-
 tools/lib/h5diff.h                                 |    10 +-
 tools/lib/h5diff_array.c                           |  3464 +++---
 tools/lib/h5diff_attr.c                            |   158 +-
 tools/lib/h5diff_dset.c                            |    13 +-
 tools/lib/h5diff_util.c                            |   110 +-
 tools/lib/h5tools.c                                |    99 +-
 tools/lib/h5tools.h                                |    43 +-
 tools/lib/h5tools_dump.c                           |   265 +-
 tools/lib/h5tools_dump.h                           |    10 +-
 tools/lib/h5tools_error.h                          |    10 +-
 tools/lib/h5tools_filters.c                        |    91 +-
 tools/lib/h5tools_ref.c                            |    12 +-
 tools/lib/h5tools_ref.h                            |    10 +-
 tools/lib/h5tools_str.c                            |   253 +-
 tools/lib/h5tools_str.h                            |    10 +-
 tools/lib/h5tools_type.c                           |    10 +-
 tools/lib/h5tools_utils.c                          |    40 +-
 tools/lib/h5tools_utils.h                          |    16 +-
 tools/lib/h5trav.c                                 |    18 +-
 tools/lib/h5trav.h                                 |    10 +-
 tools/lib/io_timer.c                               |    16 +-
 tools/lib/io_timer.h                               |    10 +-
 tools/lib/ph5diff.h                                |    10 +-
 tools/misc/CMakeLists.txt                          |   106 -
 tools/misc/CMakeTests.cmake                        |   360 -
 tools/misc/Makefile.am                             |    80 -
 tools/misc/Makefile.in                             |  1774 ---
 tools/misc/clear_open_chk.c                        |    74 -
 tools/misc/h5cc.in                                 |   401 -
 tools/misc/h5clear.c                               |   137 -
 tools/misc/h5clear_gentest.c                       |   174 -
 tools/misc/h5debug.c                               |   719 --
 tools/misc/h5mkgrp.c                               |   336 -
 tools/misc/h5perf_gentest.c                        |   598 -
 tools/misc/h5redeploy.in                           |   218 -
 tools/misc/h5repart.c                              |   512 -
 tools/misc/h5repart_gentest.c                      |   100 -
 tools/misc/repart_test.c                           |   165 -
 tools/misc/talign.c                                |   244 -
 tools/misc/testh5clear.sh.in                       |   130 -
 tools/misc/testh5mkgrp.sh.in                       |   325 -
 tools/misc/testh5repart.sh.in                      |   116 -
 tools/misc/vds/CMakeLists.txt                      |    28 -
 tools/misc/vds/Makefile.am                         |    38 -
 tools/misc/vds/Makefile.in                         |  1479 ---
 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/CMakeLists.txt                       |   126 -
 tools/perform/CMakeTests.cmake                     |    58 -
 tools/perform/COPYING                              |    16 -
 tools/perform/Makefile.am                          |    79 -
 tools/perform/Makefile.in                          |  1604 ---
 tools/perform/build_h5perf_alone.sh                |    28 -
 tools/perform/build_h5perf_serial_alone.sh         |    28 -
 tools/perform/chunk.c                              |   552 -
 tools/perform/gen_report.pl                        |   527 -
 tools/perform/iopipe.c                             |   503 -
 tools/perform/overhead.c                           |   413 -
 tools/perform/perf.c                               |   494 -
 tools/perform/perf_meta.c                          |   850 --
 tools/perform/pio_engine.c                         |  2683 ----
 tools/perform/pio_perf.c                           |  1695 ---
 tools/perform/pio_perf.h                           |   105 -
 tools/perform/pio_standalone.c                     |   282 -
 tools/perform/pio_standalone.h                     |   157 -
 tools/perform/sio_engine.c                         |  1315 --
 tools/perform/sio_perf.c                           |  1409 ---
 tools/perform/sio_perf.h                           |   104 -
 tools/perform/sio_standalone.c                     |   285 -
 tools/perform/sio_standalone.h                     |   516 -
 tools/perform/zip_perf.c                           |   644 -
 tools/src/CMakeLists.txt                           |    37 +
 tools/src/Makefile.am                              |    28 +
 tools/src/Makefile.in                              |  1433 +++
 tools/src/h5copy/CMakeLists.txt                    |    54 +
 tools/src/h5copy/Makefile.am                       |    38 +
 tools/src/h5copy/Makefile.in                       |  1467 +++
 tools/src/h5copy/h5copy.c                          |   532 +
 tools/src/h5diff/CMakeLists.txt                    |    84 +
 tools/src/h5diff/Makefile.am                       |    44 +
 tools/src/h5diff/Makefile.in                       |  1470 +++
 tools/src/h5diff/h5diff_common.c                   |   605 +
 tools/src/h5diff/h5diff_common.h                   |    34 +
 tools/src/h5diff/h5diff_main.c                     |   143 +
 tools/src/h5diff/ph5diff_main.c                    |   327 +
 tools/src/h5dump/CMakeLists.txt                    |    62 +
 tools/src/h5dump/Makefile.am                       |    36 +
 tools/src/h5dump/Makefile.in                       |  1457 +++
 tools/src/h5dump/h5dump.c                          |  1800 +++
 tools/src/h5dump/h5dump.h                          |   113 +
 tools/src/h5dump/h5dump_ddl.c                      |  2183 ++++
 tools/src/h5dump/h5dump_ddl.h                      |    50 +
 tools/src/h5dump/h5dump_defines.h                  |    54 +
 tools/src/h5dump/h5dump_extern.h                   |   112 +
 tools/src/h5dump/h5dump_xml.c                      |  4566 +++++++
 tools/src/h5dump/h5dump_xml.h                      |    37 +
 tools/src/h5format_convert/CMakeLists.txt          |    40 +
 tools/src/h5format_convert/Makefile.am             |    36 +
 tools/src/h5format_convert/Makefile.in             |  1493 +++
 tools/src/h5format_convert/h5format_convert.c      |   472 +
 tools/src/h5import/CMakeLists.txt                  |    41 +
 tools/src/h5import/Makefile.am                     |    33 +
 tools/src/h5import/Makefile.in                     |  1451 +++
 tools/src/h5import/h5import.c                      |  4391 +++++++
 tools/src/h5import/h5import.h                      |   196 +
 tools/src/h5jam/CMakeLists.txt                     |    50 +
 tools/src/h5jam/Makefile.am                        |    33 +
 tools/src/h5jam/Makefile.in                        |  1464 +++
 tools/src/h5jam/h5jam.c                            |   569 +
 tools/src/h5jam/h5unjam.c                          |   409 +
 tools/src/h5ls/CMakeLists.txt                      |    54 +
 tools/src/h5ls/Makefile.am                         |    33 +
 tools/src/h5ls/Makefile.in                         |  1451 +++
 tools/src/h5ls/h5ls.c                              |  2938 +++++
 tools/src/h5repack/CMakeLists.txt                  |    65 +
 tools/src/h5repack/Makefile.am                     |    45 +
 tools/src/h5repack/Makefile.in                     |  1494 +++
 tools/src/h5repack/h5repack.c                      |   938 ++
 tools/src/h5repack/h5repack.h                      |   249 +
 tools/src/h5repack/h5repack_copy.c                 |  1607 +++
 tools/src/h5repack/h5repack_filters.c              |   491 +
 tools/src/h5repack/h5repack_main.c                 |   686 ++
 tools/src/h5repack/h5repack_opttable.c             |   365 +
 tools/src/h5repack/h5repack_parse.c                |   615 +
 tools/src/h5repack/h5repack_refs.c                 |   875 ++
 tools/src/h5repack/h5repack_verify.c               |   714 ++
 tools/src/h5stat/CMakeLists.txt                    |    54 +
 tools/src/h5stat/Makefile.am                       |    37 +
 tools/src/h5stat/Makefile.in                       |  1494 +++
 tools/src/h5stat/h5stat.c                          |  1820 +++
 tools/src/misc/CMakeLists.txt                      |    76 +
 tools/src/misc/Makefile.am                         |    60 +
 tools/src/misc/Makefile.in                         |  1558 +++
 tools/src/misc/h5cc.in                             |   399 +
 tools/src/misc/h5clear.c                           |   270 +
 tools/src/misc/h5debug.c                           |   721 ++
 tools/src/misc/h5mkgrp.c                           |   331 +
 tools/src/misc/h5redeploy.in                       |   216 +
 tools/src/misc/h5repart.c                          |   508 +
 tools/test/CMakeLists.txt                          |    40 +
 tools/test/Makefile.am                             |    28 +
 tools/test/Makefile.in                             |  1433 +++
 tools/test/h5copy/CMakeLists.txt                   |    23 +
 tools/test/h5copy/CMakeTests.cmake                 |   434 +
 tools/test/h5copy/Makefile.am                      |    44 +
 tools/test/h5copy/Makefile.in                      |  1425 +++
 tools/test/h5copy/h5copygentest.c                  |  1002 ++
 .../h5copy/testfiles/h5copy_extlinks_src.h5        |   Bin
 .../h5copy/testfiles/h5copy_extlinks_src.out.ls    |    43 +
 .../h5copy/testfiles/h5copy_extlinks_trg.h5        |   Bin
 tools/{ => test}/h5copy/testfiles/h5copy_misc1.out |     0
 tools/{ => test}/h5copy/testfiles/h5copy_ref.h5    |   Bin
 tools/test/h5copy/testfiles/h5copy_ref.out.ls      |    31 +
 tools/test/h5copy/testfiles/h5copytst.h5           |   Bin 0 -> 15944 bytes
 tools/test/h5copy/testfiles/h5copytst.out.ls       |   429 +
 tools/test/h5copy/testfiles/h5copytst_new.h5       |   Bin 0 -> 31856 bytes
 .../h5copy/testfiles/h5copytst_new.out.ls          |     0
 tools/test/h5copy/testh5copy.sh.in                 |   618 +
 tools/test/h5diff/CMakeLists.txt                   |    50 +
 tools/test/h5diff/CMakeTests.cmake                 |  1495 +++
 tools/test/h5diff/Makefile.am                      |    71 +
 tools/test/h5diff/Makefile.in                      |  1511 +++
 tools/test/h5diff/dynlib_diff.c                    |    89 +
 tools/test/h5diff/h5diff_plugin.sh.in              |   313 +
 tools/test/h5diff/h5diffgentest.c                  |  7544 ++++++++++++
 .../h5diff/testfiles/compounds_array_vlen1.h5      |   Bin
 .../h5diff/testfiles/compounds_array_vlen2.h5      |   Bin
 tools/test/h5diff/testfiles/diff_strings1.h5       |   Bin 0 -> 4464 bytes
 tools/test/h5diff/testfiles/diff_strings2.h5       |   Bin 0 -> 4464 bytes
 tools/{ => test}/h5diff/testfiles/h5diff_10.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_100.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_101.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_101w.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_102.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_102w.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_103.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_103w.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_104.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_104w.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_11.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_12.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_13.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_14.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_15.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_16_1.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_16_2.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_16_3.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_17.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_171.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_172.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_18.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_18_1.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_19.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_20.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_200.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_201.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_202.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_203.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_204.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_205.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_206.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_207.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_208.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_21.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_22.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_220.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_221.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_222.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_223.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_224.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_23.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_24.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_25.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_26.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_27.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_28.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_30.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_300.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_400.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_401.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_402.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_403.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_404.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_405.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_406.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_407.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_408.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_409.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_410.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_411.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_412.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_413.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_414.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_415.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_416.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_417.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_418.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_419.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_420.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_421.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_422.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_423.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_424.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_425.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_450.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_451.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_452.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_453.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_454.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_455.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_456.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_457.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_458.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_459.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_465.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_466.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_467.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_468.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_469.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_471.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_472.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_473.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_474.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_475.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_480.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_481.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_482.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_483.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_484.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_485.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_486.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_487.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_50.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_500.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_501.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_502.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_503.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_504.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_505.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_506.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_507.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_508.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_509.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_51.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_510.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_511.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_512.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_513.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_514.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_515.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_516.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_517.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_518.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_52.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_53.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_530.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_54.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_540.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_55.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_56.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_57.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_58.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_59.txt    |     0
 tools/test/h5diff/testfiles/h5diff_60.txt          |    10 +
 tools/{ => test}/h5diff/testfiles/h5diff_600.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_601.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_603.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_604.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_605.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_606.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_607.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_608.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_609.txt   |     0
 tools/test/h5diff/testfiles/h5diff_61.txt          |    30 +
 tools/{ => test}/h5diff/testfiles/h5diff_610.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_612.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_613.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_614.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_615.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_616.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_617.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_618.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_619.txt   |     0
 tools/test/h5diff/testfiles/h5diff_62.txt          |    37 +
 tools/{ => test}/h5diff/testfiles/h5diff_621.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_622.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_623.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_624.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_625.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_626.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_627.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_628.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_629.txt   |     0
 tools/test/h5diff/testfiles/h5diff_63.txt          |    10 +
 tools/{ => test}/h5diff/testfiles/h5diff_630.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_631.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_640.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_641.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_642.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_643.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_644.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_645.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_646.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_70.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_700.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_701.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_702.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_703.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_704.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_705.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_706.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_707.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_708.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_709.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_710.txt   |     0
 tools/{ => test}/h5diff/testfiles/h5diff_80.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_90.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_attr1.h5  |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_attr2.h5  |   Bin
 .../h5diff/testfiles/h5diff_attr_v_level1.h5       |   Bin
 .../h5diff/testfiles/h5diff_attr_v_level2.h5       |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_basic1.h5 |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_basic2.h5 |   Bin
 .../h5diff/testfiles/h5diff_comp_vl_strs.h5        |   Bin
 .../h5diff/testfiles/h5diff_danglelinks1.h5        |   Bin
 .../h5diff/testfiles/h5diff_danglelinks2.h5        |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_dset1.h5  |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_dset2.h5  |   Bin
 .../h5diff/testfiles/h5diff_dset_zero_dim_size1.h5 |   Bin
 .../h5diff/testfiles/h5diff_dset_zero_dim_size2.h5 |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_dtypes.h5 |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_empty.h5  |   Bin
 .../h5diff/testfiles/h5diff_enum_invalid_values.h5 |   Bin
 .../h5diff/testfiles/h5diff_exclude1-1.h5          |   Bin
 .../h5diff/testfiles/h5diff_exclude1-2.h5          |   Bin
 .../h5diff/testfiles/h5diff_exclude2-1.h5          |   Bin
 .../h5diff/testfiles/h5diff_exclude2-2.h5          |   Bin
 .../h5diff/testfiles/h5diff_exclude3-1.h5          |   Bin
 .../h5diff/testfiles/h5diff_exclude3-2.h5          |   Bin
 .../h5diff/testfiles/h5diff_ext2softlink_src.h5    |   Bin
 .../h5diff/testfiles/h5diff_ext2softlink_trg.h5    |   Bin
 .../h5diff/testfiles/h5diff_extlink_src.h5         |   Bin
 .../h5diff/testfiles/h5diff_extlink_trg.h5         |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse1.h5        |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse2.h5        |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse_ext1.h5    |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5  |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5  |   Bin
 .../h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5  |   Bin
 tools/test/h5diff/testfiles/h5diff_hyper1.h5       |   Bin 0 -> 1052720 bytes
 tools/test/h5diff/testfiles/h5diff_hyper2.h5       |   Bin 0 -> 1052720 bytes
 .../h5diff/testfiles/h5diff_linked_softlink.h5     |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_links.h5  |   Bin
 .../h5diff/testfiles/h5diff_softlinks.h5           |   Bin
 tools/{ => test}/h5diff/testfiles/h5diff_tmp1.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_tmp2.txt  |     0
 tools/{ => test}/h5diff/testfiles/h5diff_types.h5  |   Bin
 tools/test/h5diff/testfiles/h5diff_ud.txt          |    11 +
 tools/test/h5diff/testfiles/h5diff_udfail.txt      |    12 +
 tools/{ => test}/h5diff/testfiles/h5diff_v1.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_v2.txt    |     0
 tools/{ => test}/h5diff/testfiles/h5diff_v3.txt    |     0
 .../h5diff/testfiles/non_comparables1.h5           |   Bin
 .../h5diff/testfiles/non_comparables2.h5           |   Bin
 .../h5diff/testfiles/tmpSingleSiteBethe.output.h5  |   Bin
 .../testfiles/tmpSingleSiteBethe.reference.h5      |   Bin
 tools/test/h5diff/testfiles/tmptest.he5            |   Bin 0 -> 4740424 bytes
 tools/test/h5diff/testfiles/tmptest2.he5           |   Bin 0 -> 4734280 bytes
 tools/test/h5diff/testfiles/tudfilter.h5           |   Bin 0 -> 4816 bytes
 tools/test/h5diff/testfiles/tudfilter2.h5          |   Bin 0 -> 4816 bytes
 tools/test/h5diff/testh5diff.sh.in                 |  1183 ++
 tools/test/h5diff/testph5diff.sh.in                |    62 +
 tools/test/h5dump/CMakeLists.txt                   |    56 +
 tools/test/h5dump/CMakeTests.cmake                 |  1468 +++
 tools/test/h5dump/CMakeTestsPBITS.cmake            |   351 +
 tools/test/h5dump/CMakeTestsVDS.cmake              |   244 +
 tools/test/h5dump/CMakeTestsXML.cmake              |   425 +
 tools/test/h5dump/Makefile.am                      |    58 +
 tools/test/h5dump/Makefile.in                      |  1517 +++
 tools/test/h5dump/binread.c                        |    95 +
 tools/test/h5dump/dynlib_dump.c                    |    89 +
 tools/{ => test}/h5dump/errfiles/filter_fail.err   |     0
 tools/{ => test}/h5dump/errfiles/non_existing.err  |     0
 tools/{ => test}/h5dump/errfiles/tall-1.err        |     0
 tools/{ => test}/h5dump/errfiles/tall-2A.err       |     0
 tools/{ => test}/h5dump/errfiles/tall-2A0.err      |     0
 tools/{ => test}/h5dump/errfiles/tall-2B.err       |     0
 tools/{ => test}/h5dump/errfiles/tarray1_big.err   |     0
 tools/{ => test}/h5dump/errfiles/tattr-3.err       |     0
 tools/{ => test}/h5dump/errfiles/tattrregR.err     |     0
 tools/{ => test}/h5dump/errfiles/tcomp-3.err       |     0
 tools/{ => test}/h5dump/errfiles/tdataregR.err     |     0
 tools/{ => test}/h5dump/errfiles/tdset-2.err       |     0
 .../{ => test}/h5dump/errfiles/texceedsubblock.err |     0
 .../{ => test}/h5dump/errfiles/texceedsubcount.err |     0
 .../{ => test}/h5dump/errfiles/texceedsubstart.err |     0
 .../h5dump/errfiles/texceedsubstride.err           |     0
 tools/{ => test}/h5dump/errfiles/textlink.err      |     0
 tools/{ => test}/h5dump/errfiles/textlinkfar.err   |     0
 tools/{ => test}/h5dump/errfiles/textlinksrc.err   |     0
 tools/{ => test}/h5dump/errfiles/tgroup-2.err      |     0
 .../errfiles/tnofilename-with-packed-bits.err      |     0
 tools/{ => test}/h5dump/errfiles/torderlinks1.err  |     0
 tools/{ => test}/h5dump/errfiles/torderlinks2.err  |     0
 .../h5dump/errfiles/tpbitsCharLengthExceeded.err   |     0
 .../h5dump/errfiles/tpbitsCharOffsetExceeded.err   |     0
 .../h5dump/errfiles/tpbitsIncomplete.err           |     0
 .../h5dump/errfiles/tpbitsIntLengthExceeded.err    |     0
 .../h5dump/errfiles/tpbitsIntOffsetExceeded.err    |     0
 .../h5dump/errfiles/tpbitsLengthExceeded.err       |     0
 .../h5dump/errfiles/tpbitsLengthPositive.err       |     0
 .../h5dump/errfiles/tpbitsLongLengthExceeded.err   |     0
 .../h5dump/errfiles/tpbitsLongOffsetExceeded.err   |     0
 .../h5dump/errfiles/tpbitsMaxExceeded.err          |     0
 .../h5dump/errfiles/tpbitsOffsetExceeded.err       |     0
 .../h5dump/errfiles/tpbitsOffsetNegative.err       |     0
 tools/{ => test}/h5dump/errfiles/tperror.err       |     0
 tools/{ => test}/h5dump/errfiles/tqmarkfile.err    |     0
 tools/{ => test}/h5dump/errfiles/tslink-D.err      |     0
 tools/test/h5dump/h5dump_plugin.sh.in              |   239 +
 tools/test/h5dump/h5dumpgentest.c                  | 10535 ++++++++++++++++
 tools/test/h5dump/testh5dump.sh.in                 |  1343 ++
 tools/test/h5dump/testh5dumppbits.sh.in            |   596 +
 tools/test/h5dump/testh5dumpvds.sh.in              |   521 +
 tools/test/h5dump/testh5dumpxml.sh.in              |   386 +
 tools/test/h5format_convert/CMakeLists.txt         |    28 +
 tools/test/h5format_convert/CMakeTests.cmake       |   471 +
 tools/test/h5format_convert/Makefile.am            |    43 +
 tools/test/h5format_convert/Makefile.in            |  1436 +++
 tools/test/h5format_convert/h5fc_chk_idx.c         |   101 +
 tools/test/h5format_convert/h5fc_gentest.c         |   805 ++
 .../h5format_convert/testfiles/h5fc_d_file.ddl     |     0
 .../h5format_convert/testfiles/h5fc_dname.ddl      |     0
 .../h5format_convert/testfiles/h5fc_edge_v3.h5     |   Bin 0 -> 2478 bytes
 .../h5format_convert/testfiles/h5fc_err_level.h5   |   Bin 0 -> 6236774 bytes
 .../h5format_convert/testfiles/h5fc_ext1_f.ddl     |    60 +
 .../test/h5format_convert/testfiles/h5fc_ext1_f.h5 |   Bin 0 -> 12288 bytes
 .../h5format_convert/testfiles/h5fc_ext1_i.ddl     |    60 +
 .../test/h5format_convert/testfiles/h5fc_ext1_i.h5 |   Bin 0 -> 7990 bytes
 .../h5format_convert/testfiles/h5fc_ext1_s.ddl     |    60 +
 .../test/h5format_convert/testfiles/h5fc_ext1_s.h5 |   Bin 0 -> 8167 bytes
 .../h5format_convert/testfiles/h5fc_ext2_if.ddl    |    60 +
 .../h5format_convert/testfiles/h5fc_ext2_if.h5     |   Bin 0 -> 8373 bytes
 .../h5format_convert/testfiles/h5fc_ext2_is.ddl    |    60 +
 .../h5format_convert/testfiles/h5fc_ext2_is.h5     |   Bin 0 -> 8186 bytes
 .../h5format_convert/testfiles/h5fc_ext2_sf.ddl    |    60 +
 .../h5format_convert/testfiles/h5fc_ext2_sf.h5     |   Bin 0 -> 8246 bytes
 .../h5format_convert/testfiles/h5fc_ext3_isf.ddl   |    60 +
 .../h5format_convert/testfiles/h5fc_ext3_isf.h5    |   Bin 0 -> 6642 bytes
 .../h5format_convert/testfiles/h5fc_ext_none.h5    |   Bin 0 -> 8014 bytes
 .../h5format_convert/testfiles/h5fc_help.ddl       |     0
 .../test/h5format_convert/testfiles/h5fc_non_v3.h5 |   Bin 0 -> 7010 bytes
 .../testfiles/h5fc_nonexistdset_file.ddl           |     0
 .../testfiles/h5fc_nonexistfile.ddl                |     0
 .../h5format_convert/testfiles/h5fc_nooption.ddl   |     0
 .../h5format_convert/testfiles/h5fc_v_all.ddl      |     0
 .../h5format_convert/testfiles/h5fc_v_bt1.ddl      |     0
 .../test/h5format_convert/testfiles/h5fc_v_err.ddl |    13 +
 .../h5format_convert/testfiles/h5fc_v_n_1d.ddl     |     0
 .../h5format_convert/testfiles/h5fc_v_n_all.ddl    |     0
 .../testfiles/h5fc_v_ndata_bt1.ddl                 |     0
 .../testfiles/h5fc_v_non_chunked.ddl               |     0
 .../h5format_convert/testfiles/old_h5fc_ext1_f.ddl |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext1_f.h5  |   Bin 0 -> 28672 bytes
 .../h5format_convert/testfiles/old_h5fc_ext1_i.ddl |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext1_i.h5  |   Bin 0 -> 32716 bytes
 .../h5format_convert/testfiles/old_h5fc_ext1_s.ddl |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext1_s.h5  |   Bin 0 -> 20032 bytes
 .../testfiles/old_h5fc_ext2_if.ddl                 |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext2_if.h5 |   Bin 0 -> 32984 bytes
 .../testfiles/old_h5fc_ext2_is.ddl                 |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext2_is.h5 |   Bin 0 -> 32872 bytes
 .../testfiles/old_h5fc_ext2_sf.ddl                 |    60 +
 .../h5format_convert/testfiles/old_h5fc_ext2_sf.h5 |   Bin 0 -> 20096 bytes
 .../testfiles/old_h5fc_ext3_isf.ddl                |    60 +
 .../testfiles/old_h5fc_ext3_isf.h5                 |   Bin 0 -> 31344 bytes
 .../testfiles/old_h5fc_ext_none.h5                 |   Bin 0 -> 19912 bytes
 tools/test/h5format_convert/testh5fc.sh.in         |   506 +
 tools/test/h5import/CMakeLists.txt                 |    18 +
 tools/test/h5import/CMakeTests.cmake               |   476 +
 tools/test/h5import/Makefile.am                    |    38 +
 tools/test/h5import/Makefile.in                    |  1421 +++
 tools/test/h5import/h5importtest.c                 |   369 +
 tools/test/h5import/h5importtestutil.sh.in         |   382 +
 tools/{ => test}/h5import/testfiles/binfp64.conf   |     0
 tools/test/h5import/testfiles/binfp64.h5           |   Bin 0 -> 10760 bytes
 tools/{ => test}/h5import/testfiles/binin16.conf   |     0
 tools/test/h5import/testfiles/binin16.h5           |   Bin 0 -> 10760 bytes
 tools/{ => test}/h5import/testfiles/binin32.conf   |     0
 tools/test/h5import/testfiles/binin32.h5           |   Bin 0 -> 9472 bytes
 tools/{ => test}/h5import/testfiles/binin8.conf    |     0
 tools/test/h5import/testfiles/binin8.h5            |   Bin 0 -> 10760 bytes
 tools/{ => test}/h5import/testfiles/binin8w.conf   |     0
 tools/{ => test}/h5import/testfiles/binin8w.h5     |   Bin
 tools/{ => test}/h5import/testfiles/binuin16.conf  |     0
 tools/test/h5import/testfiles/binuin16.h5          |   Bin 0 -> 10760 bytes
 tools/{ => test}/h5import/testfiles/binuin32.conf  |     0
 tools/test/h5import/testfiles/binuin32.h5          |   Bin 0 -> 6384 bytes
 .../{ => test}/h5import/testfiles/dbinfp64.h5.txt  |     0
 .../{ => test}/h5import/testfiles/dbinin16.h5.txt  |     0
 .../{ => test}/h5import/testfiles/dbinin32.h5.txt  |     0
 tools/{ => test}/h5import/testfiles/dbinin8.h5.txt |     0
 .../{ => test}/h5import/testfiles/dbinin8w.h5.txt  |     0
 .../{ => test}/h5import/testfiles/dbinuin16.h5.txt |     0
 .../{ => test}/h5import/testfiles/dbinuin32.h5.txt |     0
 tools/{ => test}/h5import/testfiles/dtxtstr.h5.txt |     0
 tools/{ => test}/h5import/testfiles/textpfe.conf   |     0
 tools/{ => test}/h5import/testfiles/textpfe.h5     |   Bin
 tools/{ => test}/h5import/testfiles/textpfe64.txt  |     0
 tools/{ => test}/h5import/testfiles/txtfp32.conf   |     0
 tools/test/h5import/testfiles/txtfp32.h5           |   Bin 0 -> 4192 bytes
 tools/{ => test}/h5import/testfiles/txtfp32.txt    |     0
 tools/{ => test}/h5import/testfiles/txtfp64.conf   |     0
 tools/test/h5import/testfiles/txtfp64.h5           |   Bin 0 -> 9784 bytes
 tools/{ => test}/h5import/testfiles/txtfp64.txt    |     0
 tools/{ => test}/h5import/testfiles/txtin16.conf   |     0
 tools/test/h5import/testfiles/txtin16.h5           |   Bin 0 -> 9784 bytes
 tools/{ => test}/h5import/testfiles/txtin16.txt    |     0
 tools/{ => test}/h5import/testfiles/txtin32.conf   |     0
 tools/test/h5import/testfiles/txtin32.h5           |   Bin 0 -> 4192 bytes
 tools/{ => test}/h5import/testfiles/txtin32.txt    |     0
 tools/{ => test}/h5import/testfiles/txtin8.conf    |     0
 tools/test/h5import/testfiles/txtin8.h5            |   Bin 0 -> 9784 bytes
 tools/{ => test}/h5import/testfiles/txtin8.txt     |     0
 tools/{ => test}/h5import/testfiles/txtstr.conf    |     0
 tools/{ => test}/h5import/testfiles/txtstr.h5      |   Bin
 tools/{ => test}/h5import/testfiles/txtstr.txt     |     0
 tools/{ => test}/h5import/testfiles/txtuin16.conf  |     0
 tools/test/h5import/testfiles/txtuin16.h5          |   Bin 0 -> 10240 bytes
 tools/{ => test}/h5import/testfiles/txtuin16.txt   |     0
 tools/{ => test}/h5import/testfiles/txtuin32.conf  |     0
 tools/test/h5import/testfiles/txtuin32.h5          |   Bin 0 -> 6240 bytes
 tools/{ => test}/h5import/testfiles/txtuin32.txt   |     0
 tools/test/h5jam/CMakeLists.txt                    |    34 +
 tools/test/h5jam/CMakeTests.cmake                  |   395 +
 tools/test/h5jam/Makefile.am                       |    38 +
 tools/test/h5jam/Makefile.in                       |  1430 +++
 tools/test/h5jam/getub.c                           |   155 +
 tools/test/h5jam/h5jamgentest.c                    |   387 +
 tools/test/h5jam/tellub.c                          |   194 +
 tools/{ => test}/h5jam/testfiles/h5jam-help.txt    |     0
 .../{ => test}/h5jam/testfiles/h5jam-ub-nohdf5.txt |     0
 tools/{ => test}/h5jam/testfiles/h5unjam-help.txt  |     0
 tools/{ => test}/h5jam/testfiles/tall.h5           |   Bin
 tools/{ => test}/h5jam/testfiles/twithub.h5        |   Bin
 tools/{ => test}/h5jam/testfiles/twithub513.h5     |   Bin
 tools/{ => test}/h5jam/testfiles/u10.txt           |     0
 tools/{ => test}/h5jam/testfiles/u511.txt          |     0
 tools/{ => test}/h5jam/testfiles/u512.txt          |     0
 tools/{ => test}/h5jam/testfiles/u513.txt          |     0
 tools/test/h5jam/testh5jam.sh.in                   |   697 ++
 tools/test/h5ls/CMakeLists.txt                     |    39 +
 tools/test/h5ls/CMakeTests.cmake                   |   457 +
 tools/test/h5ls/CMakeTestsVDS.cmake                |   148 +
 tools/test/h5ls/Makefile.am                        |    52 +
 tools/test/h5ls/Makefile.in                        |  1466 +++
 tools/test/h5ls/dynlib_ls.c                        |    89 +
 tools/test/h5ls/h5ls_plugin.sh.in                  |   251 +
 tools/test/h5ls/testh5ls.sh.in                     |   441 +
 tools/test/h5ls/testh5lsvds.sh.in                  |   256 +
 tools/test/h5repack/CMakeLists.txt                 |    79 +
 tools/test/h5repack/CMakeTests.cmake               |  1176 ++
 tools/test/h5repack/Makefile.am                    |    68 +
 tools/test/h5repack/Makefile.in                    |  1529 +++
 tools/test/h5repack/dynlib_rpk.c                   |    95 +
 tools/test/h5repack/dynlib_vrpk.c                  |   102 +
 tools/test/h5repack/h5repack.sh.in                 |  1263 ++
 tools/test/h5repack/h5repack_plugin.sh.in          |   274 +
 tools/test/h5repack/h5repacktst.c                  |  7187 +++++++++++
 .../testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl |     0
 .../testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl        |     0
 .../testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl      |     0
 .../h5repack/testfiles/4_vds.h5-vds_compa-v.ddl    |     0
 .../h5repack/testfiles/4_vds.h5-vds_conti-v.ddl    |    59 +
 tools/{ => test}/h5repack/testfiles/README         |     0
 .../testfiles/deflate_limit.h5repack_layout.h5.ddl |   130 +
 tools/test/h5repack/testfiles/h5repack-help.txt    |   136 +
 tools/{ => test}/h5repack/testfiles/h5repack.info  |     0
 tools/test/h5repack/testfiles/h5repack_attr.h5     |   Bin 0 -> 21856 bytes
 .../test/h5repack/testfiles/h5repack_attr_refs.h5  |   Bin 0 -> 10336 bytes
 tools/test/h5repack/testfiles/h5repack_deflate.h5  |   Bin 0 -> 6336 bytes
 tools/test/h5repack/testfiles/h5repack_early.h5    |   Bin 0 -> 3074224 bytes
 .../{ => test}/h5repack/testfiles/h5repack_ext.bin |   Bin
 tools/test/h5repack/testfiles/h5repack_ext.h5      |   Bin 0 -> 1464 bytes
 tools/test/h5repack/testfiles/h5repack_fill.h5     |   Bin 0 -> 2168 bytes
 tools/test/h5repack/testfiles/h5repack_filters.h5  |   Bin 0 -> 27604 bytes
 .../h5repack_filters.h5-gzip_verbose_filters.tst}  |     0
 tools/test/h5repack/testfiles/h5repack_fletcher.h5 |   Bin 0 -> 7232 bytes
 tools/test/h5repack/testfiles/h5repack_hlink.h5    |   Bin 0 -> 6544 bytes
 .../h5repack/testfiles/h5repack_layout.UD.h5       |   Bin
 .../h5repack_layout.UD.h5-plugin_none.ddl          |     0
 tools/test/h5repack/testfiles/h5repack_layout.h5   |   Bin 0 -> 29480 bytes
 ...h5repack_layout.h5-dset2_chunk_20x10-errstk.tst |    38 +
 .../testfiles/h5repack_layout.h5-plugin_test.ddl   |   158 +
 .../h5repack_layout.h5-plugin_version_test.ddl     |   158 +
 .../testfiles/h5repack_layout.h5-plugin_zero.tst   |     9 +
 .../h5repack/testfiles/h5repack_layout.h5.ddl      |     0
 tools/test/h5repack/testfiles/h5repack_layout2.h5  |   Bin 0 -> 6808 bytes
 tools/test/h5repack/testfiles/h5repack_layout3.h5  |   Bin 0 -> 491840 bytes
 tools/test/h5repack/testfiles/h5repack_layouto.h5  |   Bin 0 -> 1576 bytes
 .../h5repack/testfiles/h5repack_named_dtypes.h5    |   Bin 0 -> 4320 bytes
 tools/test/h5repack/testfiles/h5repack_nbit.h5     |   Bin 0 -> 13208 bytes
 .../testfiles/h5repack_nested_8bit_enum.h5         |   Bin
 .../h5repack_nested_8bit_enum_deflated.h5          |   Bin
 tools/test/h5repack/testfiles/h5repack_objs.h5     |   Bin 0 -> 19738 bytes
 tools/test/h5repack/testfiles/h5repack_refs.h5     |   Bin 0 -> 10336 bytes
 tools/test/h5repack/testfiles/h5repack_shuffle.h5  |   Bin 0 -> 7216 bytes
 tools/test/h5repack/testfiles/h5repack_soffset.h5  |   Bin 0 -> 12452 bytes
 tools/test/h5repack/testfiles/h5repack_szip.h5     |   Bin 0 -> 5588 bytes
 .../plugin_none.h5repack_layout.UD.h5.tst          |     0
 .../testfiles/plugin_test.h5repack_layout.h5.tst   |     0
 .../plugin_version_test.h5repack_layout.h5.tst     |    14 +
 tools/{ => test}/h5repack/testfiles/ublock.bin     |     0
 tools/test/h5repack/testh5repack_detect_szip.c     |    60 +
 tools/test/h5stat/CMakeLists.txt                   |    22 +
 tools/test/h5stat/CMakeTests.cmake                 |   248 +
 tools/test/h5stat/Makefile.am                      |    46 +
 tools/test/h5stat/Makefile.in                      |  1432 +++
 tools/test/h5stat/h5stat_gentest.c                 |   447 +
 tools/{ => test}/h5stat/testfiles/h5stat_dims1.ddl |     0
 tools/{ => test}/h5stat/testfiles/h5stat_dims2.ddl |     0
 .../h5stat/testfiles/h5stat_err1_dims.ddl          |     0
 .../h5stat/testfiles/h5stat_err1_links.ddl         |     0
 .../h5stat/testfiles/h5stat_err1_numattrs.ddl      |     0
 .../h5stat/testfiles/h5stat_err2_numattrs.ddl      |     0
 .../h5stat/testfiles/h5stat_filters-F.ddl          |     0
 .../h5stat/testfiles/h5stat_filters-UD.ddl         |     0
 .../h5stat/testfiles/h5stat_filters-UT.ddl         |     0
 .../h5stat/testfiles/h5stat_filters-d.ddl          |     0
 .../h5stat/testfiles/h5stat_filters-dT.ddl         |     0
 .../h5stat/testfiles/h5stat_filters-file.ddl       |     0
 .../h5stat/testfiles/h5stat_filters-g.ddl          |     0
 tools/test/h5stat/testfiles/h5stat_filters.ddl     |    99 +
 tools/test/h5stat/testfiles/h5stat_filters.h5      |   Bin 0 -> 46272 bytes
 tools/{ => test}/h5stat/testfiles/h5stat_help1.ddl |     0
 tools/{ => test}/h5stat/testfiles/h5stat_help2.ddl |     0
 tools/test/h5stat/testfiles/h5stat_idx.ddl         |    95 +
 tools/test/h5stat/testfiles/h5stat_idx.h5          |   Bin 0 -> 2158 bytes
 .../{ => test}/h5stat/testfiles/h5stat_links1.ddl  |     0
 tools/test/h5stat/testfiles/h5stat_links2.ddl      |   107 +
 .../{ => test}/h5stat/testfiles/h5stat_links3.ddl  |     0
 .../{ => test}/h5stat/testfiles/h5stat_links4.ddl  |     0
 .../{ => test}/h5stat/testfiles/h5stat_links5.ddl  |     0
 .../h5stat/testfiles/h5stat_newgrat-UA.ddl         |     0
 .../h5stat/testfiles/h5stat_newgrat-UG.ddl         |     0
 tools/test/h5stat/testfiles/h5stat_newgrat.ddl     |    97 +
 tools/test/h5stat/testfiles/h5stat_newgrat.h5      |   Bin 0 -> 6362235 bytes
 .../{ => test}/h5stat/testfiles/h5stat_nofile.ddl  |     0
 .../h5stat/testfiles/h5stat_notexist.ddl           |     0
 tools/test/h5stat/testfiles/h5stat_numattrs1.ddl   |    18 +
 tools/test/h5stat/testfiles/h5stat_numattrs2.ddl   |   107 +
 .../h5stat/testfiles/h5stat_numattrs3.ddl          |     0
 .../h5stat/testfiles/h5stat_numattrs4.ddl          |     0
 .../h5stat/testfiles/h5stat_threshold.h5           |   Bin
 tools/test/h5stat/testfiles/h5stat_tsohm.ddl       |    92 +
 tools/{ => test}/h5stat/testfiles/h5stat_tsohm.h5  |   Bin
 tools/test/h5stat/testh5stat.sh.in                 |   316 +
 tools/test/misc/CMakeLists.txt                     |    45 +
 tools/test/misc/CMakeTestsClear.cmake              |   264 +
 tools/test/misc/CMakeTestsMkgrp.cmake              |   199 +
 tools/test/misc/CMakeTestsRepart.cmake             |    96 +
 tools/test/misc/Makefile.am                        |    45 +
 tools/test/misc/Makefile.in                        |  1604 +++
 tools/test/misc/clear_open_chk.c                   |    71 +
 tools/test/misc/h5clear_gentest.c                  |   277 +
 tools/test/misc/h5perf_gentest.c                   |   609 +
 tools/test/misc/h5repart_gentest.c                 |    99 +
 tools/test/misc/repart_test.c                      |   163 +
 tools/test/misc/talign.c                           |   242 +
 tools/test/misc/testfiles/h5clear_log_v3.h5        |   Bin 0 -> 2048 bytes
 tools/test/misc/testfiles/h5clear_mdc_image.h5     |   Bin 0 -> 23467 bytes
 tools/test/misc/testfiles/h5clear_missing_file.ddl |    15 +
 tools/test/misc/testfiles/h5clear_no_mdc_image.ddl |     1 +
 tools/test/misc/testfiles/h5clear_open_fail.ddl    |     1 +
 tools/test/misc/testfiles/h5clear_sec2_v0.h5       |   Bin 0 -> 800 bytes
 tools/test/misc/testfiles/h5clear_sec2_v2.h5       |   Bin 0 -> 830 bytes
 tools/test/misc/testfiles/h5clear_sec2_v3.h5       |   Bin 0 -> 195 bytes
 tools/test/misc/testfiles/h5clear_usage.ddl        |    14 +
 tools/{ => test}/misc/testfiles/h5mkgrp_help.txt   |     0
 .../misc/testfiles/h5mkgrp_version.txt.in          |     0
 tools/test/misc/testfiles/latest_h5clear_log_v3.h5 |   Bin 0 -> 2048 bytes
 .../test/misc/testfiles/latest_h5clear_sec2_v3.h5  |   Bin 0 -> 195 bytes
 tools/test/misc/testfiles/mod_h5clear_mdc_image.h5 |   Bin 0 -> 22048 bytes
 tools/test/misc/testh5clear.sh.in                  |   338 +
 tools/test/misc/testh5mkgrp.sh.in                  |   320 +
 tools/test/misc/testh5repart.sh.in                 |   195 +
 tools/test/misc/vds/CMakeLists.txt                 |    28 +
 tools/test/misc/vds/Makefile.am                    |    36 +
 tools/test/misc/vds/Makefile.in                    |  1485 +++
 tools/test/misc/vds/UC_1.h                         |   119 +
 tools/test/misc/vds/UC_1_one_dim_gen.c             |   267 +
 tools/test/misc/vds/UC_2.h                         |   108 +
 tools/test/misc/vds/UC_2_two_dims_gen.c            |   268 +
 tools/test/misc/vds/UC_3.h                         |    72 +
 tools/test/misc/vds/UC_3_gaps_gen.c                |   253 +
 tools/test/misc/vds/UC_4.h                         |    84 +
 tools/test/misc/vds/UC_4_printf_gen.c              |   217 +
 tools/test/misc/vds/UC_5.h                         |    81 +
 tools/test/misc/vds/UC_5_stride_gen.c              |   241 +
 tools/test/misc/vds/UC_common.h                    |    39 +
 tools/test/perform/CMakeLists.txt                  |   124 +
 tools/test/perform/CMakeTests.cmake                |   156 +
 tools/test/perform/COPYING                         |    13 +
 tools/test/perform/Makefile.am                     |    77 +
 tools/test/perform/Makefile.in                     |  1610 +++
 tools/test/perform/build_h5perf_alone.sh           |    26 +
 tools/test/perform/build_h5perf_serial_alone.sh    |    26 +
 tools/test/perform/chunk.c                         |   548 +
 tools/test/perform/gen_report.pl                   |   525 +
 tools/test/perform/iopipe.c                        |   506 +
 tools/test/perform/overhead.c                      |   406 +
 tools/test/perform/perf.c                          |   492 +
 tools/test/perform/perf_meta.c                     |   848 ++
 tools/test/perform/pio_engine.c                    |  2680 ++++
 tools/test/perform/pio_perf.c                      |  1692 +++
 tools/test/perform/pio_perf.h                      |   102 +
 tools/test/perform/pio_standalone.c                |   279 +
 tools/test/perform/pio_standalone.h                |   528 +
 tools/test/perform/sio_engine.c                    |  1320 ++
 tools/test/perform/sio_perf.c                      |  1428 +++
 tools/test/perform/sio_perf.h                      |   104 +
 tools/test/perform/sio_standalone.c                |   283 +
 tools/test/perform/sio_standalone.h                |   544 +
 tools/test/perform/zip_perf.c                      |   642 +
 tools/testfiles/family_file00000.h5                |   Bin 1024 -> 1024 bytes
 tools/testfiles/file_space.ddl                     |     6 +-
 tools/testfiles/file_space.h5                      |   Bin 792 -> 808 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                         |     6 +-
 tools/testfiles/tboot2.ddl                         |     6 +-
 tools/testfiles/tboot2A.ddl                        |     6 +-
 tools/testfiles/tboot2B.ddl                        |     6 +-
 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/tcompound_complex2.ddl             |  1051 ++
 tools/testfiles/tcompound_complex2.h5              |   Bin 0 -> 21880 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 10562 -> 10562 bytes
 tools/testfiles/tempty.h5                          |   Bin 4304 -> 4304 bytes
 tools/testfiles/tenum.h5                           |   Bin 2128 -> 2128 bytes
 tools/testfiles/textlinksrc-nodangle-1.ls          |     4 +-
 tools/testfiles/tfamily00000.h5                    |   Bin 256 -> 256 bytes
 tools/testfiles/tfcontents2.h5                     |   Bin 792 -> 792 bytes
 tools/testfiles/tfvalues.h5                        |   Bin 9552 -> 9552 bytes
 tools/testfiles/tgroup-1.ls                        |     4 +-
 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/tudfilter.ddl                      |    30 +
 tools/testfiles/tudfilter.h5                       |   Bin 0 -> 4816 bytes
 tools/testfiles/tudfilter.ls                       |    16 +
 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/tvlenstr_array.ddl                 |    48 +
 tools/testfiles/tvlenstr_array.h5                  |   Bin 0 -> 6720 bytes
 tools/testfiles/tvms.h5                            |   Bin 2288 -> 2288 bytes
 2722 files changed, 280240 insertions(+), 196663 deletions(-)

diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS
index 59882ca..f1b5b45 100644
--- a/ACKNOWLEDGMENTS
+++ b/ACKNOWLEDGMENTS
@@ -1,14 +1,8 @@
-Acknowledgments
-----------------
+Acknowledgments - November 2010
+-------------------------------
 
-We would like to thank the following people who provided code contributions
-to the HDF5 1.10.0 and earlier releases:
-
-Steffen Kieß, for contributing code used to specify locations of the external
-files included in the 1.10.0 release. 
-
-Jason Newton, for contributing code used to improve the C/C++ Packet Table
-included in the 1.10.0 release.
+We would like to thank the following people who have contributed directly
+or indirectly to HDF5:
 
 Werner Benger, for contributing code used to add support for the Windows 
 Threading library included in the 1.8.6 release.
diff --git a/CMakeFilters.cmake b/CMakeFilters.cmake
index c2b81dc..9b66d95 100644
--- a/CMakeFilters.cmake
+++ b/CMakeFilters.cmake
@@ -1,25 +1,41 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 include (ExternalProject)
-#option (HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO SVN TGZ)" "NO")
+#option (HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO GIT SVN TGZ)" "NO")
 set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO SVN TGZ)")
-set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO SVN TGZ)
-if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
+if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
   option (ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" 1)
   option (SZIP_USE_EXTERNAL "Use External Library Building for SZIP" 1)
-  if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN")
+  if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT")
+    set (ZLIB_URL ${ZLIB_GIT_URL} CACHE STRING "Path to zlib git repository")
+    set (ZLIB_BRANCH ${ZLIB_GIT_BRANCH})
+    set (SZIP_URL ${SZIP_GIT_URL} CACHE STRING "Path to szip git repository")
+    set (SZIP_BRANCH ${SZIP_GIT_BRANCH})
+  elseif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN")
     set (ZLIB_URL ${ZLIB_SVN_URL} CACHE STRING "Path to zlib Subversion repository")
     set (SZIP_URL ${SZIP_SVN_URL} CACHE STRING "Path to szip Subversion repository")
   elseif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
     if (NOT TGZPATH)
       set (TGZPATH ${HDF5_SOURCE_DIR})
-    endif (NOT TGZPATH)
+    endif ()
     set (ZLIB_URL ${TGZPATH}/${ZLIB_TGZ_NAME})
     set (SZIP_URL ${TGZPATH}/${SZIP_TGZ_NAME})
-  else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN")
+  else ()
     set (ZLIB_USE_EXTERNAL 0)
     set (SZIP_USE_EXTERNAL 0)
-  endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN")
-endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option for ZLib support
@@ -34,9 +50,9 @@ if (HDF5_ENABLE_Z_LIB_SUPPORT)
         if (ZLIB_FOUND)
           set (LINK_LIBS ${LINK_LIBS} ${ZLIB_LIBRARIES})
           set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${ZLIB_LIBRARIES})
-        endif (ZLIB_FOUND)
-      endif (NOT ZLIB_FOUND)
-    endif (NOT ZLIB_USE_EXTERNAL)
+        endif ()
+      endif ()
+    endif ()
     if (ZLIB_FOUND)
       set (H5_HAVE_FILTER_DEFLATE 1)
       set (H5_HAVE_ZLIB_H 1)
@@ -44,33 +60,33 @@ if (HDF5_ENABLE_Z_LIB_SUPPORT)
       set (H5_ZLIB_HEADER "zlib.h")
       set (ZLIB_INCLUDE_DIR_GEN ${ZLIB_INCLUDE_DIR})
       set (ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR})
-    else (ZLIB_FOUND)
-      if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+    else ()
+      if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
         EXTERNAL_ZLIB_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
         set (H5_HAVE_FILTER_DEFLATE 1)
         set (H5_HAVE_ZLIB_H 1)
         set (H5_HAVE_LIBZ 1)
         message (STATUS "Filter ZLIB is built")
-      else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+      else ()
         message (FATAL_ERROR " ZLib is Required for ZLib support in HDF5")
-      endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
-    endif (ZLIB_FOUND)
-  else (NOT H5_ZLIB_HEADER)
+      endif ()
+    endif ()
+  else ()
     # This project is being called from within another and ZLib is already configured
     set (H5_HAVE_FILTER_DEFLATE 1)
     set (H5_HAVE_ZLIB_H 1)
     set (H5_HAVE_LIBZ 1)
-  endif (NOT H5_ZLIB_HEADER)
+  endif ()
   if (H5_HAVE_FILTER_DEFLATE)
     set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} DEFLATE")
-  endif (H5_HAVE_FILTER_DEFLATE)
-  if (BUILD_SHARED_LIBS) 
+  endif ()
+  if (BUILD_SHARED_LIBS)
     set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${ZLIB_SHARED_LIBRARY})
-  endif (BUILD_SHARED_LIBS) 
+  endif ()
   set (LINK_LIBS ${LINK_LIBS} ${ZLIB_STATIC_LIBRARY})
   INCLUDE_DIRECTORIES (${ZLIB_INCLUDE_DIRS})
   message (STATUS "Filter ZLIB is ON")
-endif (HDF5_ENABLE_Z_LIB_SUPPORT)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option for SzLib support
@@ -85,37 +101,37 @@ if (HDF5_ENABLE_SZIP_SUPPORT)
       if (SZIP_FOUND)
         set (LINK_LIBS ${LINK_LIBS} ${SZIP_LIBRARIES})
         set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${SZIP_LIBRARIES})
-      endif (SZIP_FOUND)
-    endif (NOT SZIP_FOUND)
-  endif (NOT SZIP_USE_EXTERNAL)
+      endif ()
+    endif ()
+  endif ()
   if (SZIP_FOUND)
     set (H5_HAVE_FILTER_SZIP 1)
     set (H5_HAVE_SZLIB_H 1)
     set (H5_HAVE_LIBSZ 1)
     set (SZIP_INCLUDE_DIR_GEN ${SZIP_INCLUDE_DIR})
     set (SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIRS} ${SZIP_INCLUDE_DIR})
-  else (SZIP_FOUND)
-    if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+  else ()
+    if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
       EXTERNAL_SZIP_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT} ${HDF5_ENABLE_SZIP_ENCODING})
       set (H5_HAVE_FILTER_SZIP 1)
       set (H5_HAVE_SZLIB_H 1)
       set (H5_HAVE_LIBSZ 1)
       message (STATUS "Filter SZIP is built")
-    else (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+    else ()
       message (FATAL_ERROR "SZIP is Required for SZIP support in HDF5")
-    endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
-  endif (SZIP_FOUND)
-  if (BUILD_SHARED_LIBS) 
+    endif ()
+  endif ()
+  if (BUILD_SHARED_LIBS)
     set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${SZIP_SHARED_LIBRARY})
-  endif (BUILD_SHARED_LIBS) 
+  endif ()
   set (LINK_LIBS ${LINK_LIBS} ${SZIP_STATIC_LIBRARY})
   INCLUDE_DIRECTORIES (${SZIP_INCLUDE_DIRS})
   message (STATUS "Filter SZIP is ON")
   if (H5_HAVE_FILTER_SZIP)
     set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} DECODE")
-  endif (H5_HAVE_FILTER_SZIP)
+  endif ()
   if (HDF5_ENABLE_SZIP_ENCODING)
     set (H5_HAVE_SZIP_ENCODER 1)
     set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} ENCODE")
-  endif (HDF5_ENABLE_SZIP_ENCODING)
-endif (HDF5_ENABLE_SZIP_SUPPORT)
+  endif ()
+endif ()
diff --git a/CMakeInstallation.cmake b/CMakeInstallation.cmake
index bb5f046..70638d6 100644
--- a/CMakeInstallation.cmake
+++ b/CMakeInstallation.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 include (CMakePackageConfigHelpers)
 
 #-----------------------------------------------------------------------------
@@ -8,9 +19,9 @@ if (WIN32)
   find_program (NSIS_EXECUTABLE NSIS.exe PATHS "$ENV{ProgramFiles}\\NSIS" "$ENV{ProgramFiles${PF_ENV_EXT}}\\NSIS")
   if(NOT CPACK_WIX_ROOT)
     file(TO_CMAKE_PATH "$ENV{WIX}" CPACK_WIX_ROOT)
-  endif()
+  endif ()
   find_program (WIX_EXECUTABLE candle  PATHS "${CPACK_WIX_ROOT}/bin")
-endif (WIN32)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -21,29 +32,33 @@ if (NOT HDF5_INSTALL_NO_DEVELOPMENT)
       DESTINATION ${HDF5_INSTALL_INCLUDE_DIR}
       COMPONENT headers
   )
-endif (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
 #-----------------------------------------------------------------------------
 if (NOT HDF5_EXTERNALLY_CONFIGURED)
-  install (
-      EXPORT ${HDF5_EXPORTED_TARGETS}
-      DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
-      FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
-      COMPONENT configinstall
-  )
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
-
-#-----------------------------------------------------------------------------
-# Export all exported targets to the build tree for use by parent project
-#-----------------------------------------------------------------------------
-if (NOT HDF5_EXTERNALLY_CONFIGURED)
-  export (
-      TARGETS ${HDF5_LIBRARIES_TO_EXPORT} ${HDF5_LIB_DEPENDENCIES}
-      FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
-  )
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+  if (HDF5_EXPORTED_TARGETS)
+    install (
+        EXPORT ${HDF5_EXPORTED_TARGETS}
+        DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
+        FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
+        NAMESPACE ${HDF5_PACKAGE}::
+        COMPONENT configinstall
+    )
+  endif ()
+
+  #-----------------------------------------------------------------------------
+  # Export all exported targets to the build tree for use by parent project
+  #-----------------------------------------------------------------------------
+  if (NOT HDF5_EXTERNALLY_CONFIGURED)
+    export (
+        TARGETS ${HDF5_LIBRARIES_TO_EXPORT} ${HDF5_LIB_DEPENDENCIES} ${HDF5_UTILS_TO_EXPORT}
+        FILE ${HDF5_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake
+        NAMESPACE ${HDF5_PACKAGE}::
+    )
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Set includes needed for build
@@ -75,21 +90,6 @@ configure_package_config_file (
 )
 
 #-----------------------------------------------------------------------------
-# Configure the FindHDF5.cmake file for the install directory
-#-----------------------------------------------------------------------------
-if (NOT HDF5_EXTERNALLY_CONFIGURED)
-  configure_file (
-      ${HDF_RESOURCES_DIR}/FindHDF5.cmake.in
-      ${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindHDF5${HDF_PACKAGE_EXT}.cmake @ONLY
-  )
-  install (
-      FILES ${HDF5_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindHDF5${HDF_PACKAGE_EXT}.cmake
-      DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
-      COMPONENT configinstall
-  )
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
-
-#-----------------------------------------------------------------------------
 # Configure the hdf5-config.cmake file for the install directory
 #-----------------------------------------------------------------------------
 set (INCLUDE_INSTALL_DIR ${HDF5_INSTALL_INCLUDE_DIR})
@@ -108,7 +108,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
       DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
       COMPONENT configinstall
   )
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Configure the hdf5-config-version .cmake file for the install directory
@@ -123,16 +123,16 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
       DESTINATION ${HDF5_INSTALL_CMAKE_DIR}
       COMPONENT configinstall
   )
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Configure the libhdf5.settings file for the lib info
 #-----------------------------------------------------------------------------
 if (H5_WORDS_BIGENDIAN)
   set (BYTESEX big-endian)
-else (H5_WORDS_BIGENDIAN)
+else ()
   set (BYTESEX little-endian)
-endif (H5_WORDS_BIGENDIAN)
+endif ()
 configure_file (
     ${HDF_RESOURCES_DIR}/libhdf5.settings.cmake.in
     ${HDF5_BINARY_DIR}/libhdf5.settings @ONLY
@@ -148,10 +148,10 @@ install (
 #-----------------------------------------------------------------------------
 #foreach (libs ${LINK_LIBS})
 #  set (LIBS "${LIBS} -l${libs}")
-#endforeach (libs ${LINK_LIBS})
+#endforeach ()
 #foreach (libs ${HDF5_LIBRARIES_TO_EXPORT})
 #  set (HDF5LIBS "${HDF5LIBS} -l${libs}")
-#endforeach (libs ${HDF5_LIBRARIES_TO_EXPORT})
+#endforeach ()
 #configure_file (
 #    ${HDF_RESOURCES_DIR}/libhdf5.pc.in
 #    ${HDF5_BINARY_DIR}/CMakeFiles/libhdf5.pc @ONLY
@@ -185,14 +185,26 @@ if (HDF5_PACK_EXAMPLES)
       USE_SOURCE_PERMISSIONS
       COMPONENT hdfdocuments
     )
-    install (
-        FILES
-            ${HDF5_SOURCE_DIR}/release_docs/USING_CMake_Examples.txt
-        DESTINATION ${HDF5_INSTALL_DATA_DIR}
-        COMPONENT hdfdocuments
-    )
-  endif (EXISTS "${HDF5_EXAMPLES_COMPRESSED_DIR}/${HDF5_EXAMPLES_COMPRESSED}")
-endif (HDF5_PACK_EXAMPLES)
+  endif ()
+  install (
+      FILES
+          ${HDF5_SOURCE_DIR}/release_docs/USING_CMake_Examples.txt
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      COMPONENT hdfdocuments
+  )
+  install (
+      FILES
+          ${HDF_RESOURCES_DIR}/CTestScript.cmake
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      COMPONENT hdfdocuments
+  )
+  install (
+      FILES
+          ${HDF_RESOURCES_DIR}/HDF5_Examples_options.cmake
+      DESTINATION ${HDF5_INSTALL_DATA_DIR}
+      COMPONENT hdfdocuments
+  )
+endif ()
 
 #-----------------------------------------------------------------------------
 # Configure the README.txt file for the binary package
@@ -204,7 +216,7 @@ HDF_README_PROPERTIES(HDF5_BUILD_FORTRAN)
 #-----------------------------------------------------------------------------
 if (WIN32)
   configure_file (${HDF5_SOURCE_DIR}/COPYING ${HDF5_BINARY_DIR}/COPYING.txt @ONLY)
-endif (WIN32)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Document File(s) to CMake Install
@@ -227,7 +239,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
           ${release_files}
           ${HDF5_SOURCE_DIR}/release_docs/USING_HDF5_VS.txt
       )
-    endif (WIN32)
+    endif ()
     if (HDF5_PACK_INSTALL_DOCS)
       set (release_files
           ${release_files}
@@ -240,40 +252,40 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
             ${release_files}
             ${HDF5_SOURCE_DIR}/release_docs/INSTALL_Windows.txt
         )
-      endif (WIN32)
+      endif ()
       if (CYGWIN)
         set (release_files
             ${release_files}
             ${HDF5_SOURCE_DIR}/release_docs/INSTALL_Cygwin.txt
         )
-      endif (CYGWIN)
+      endif ()
       if (HDF5_ENABLE_PARALLEL)
         set (release_files
             ${release_files}
             ${HDF5_SOURCE_DIR}/release_docs/INSTALL_parallel
         )
-      endif (HDF5_ENABLE_PARALLEL)
-    endif (HDF5_PACK_INSTALL_DOCS)
+      endif ()
+    endif ()
     install (
         FILES ${release_files}
         DESTINATION ${HDF5_INSTALL_DATA_DIR}
         COMPONENT hdfdocuments
     )
-  endif (EXISTS "${HDF5_SOURCE_DIR}/release_docs" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/release_docs")
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+  endif ()
+endif ()
 
 if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
   if (CMAKE_HOST_UNIX)
     set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/HDF_Group/${HDF5_PACKAGE_NAME}/${HDF5_PACKAGE_VERSION}"
       CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
-  else (CMAKE_HOST_UNIX)
+  else ()
     GetDefaultWindowsPrefixBase(CMAKE_GENERIC_PROGRAM_FILES)
     set (CMAKE_INSTALL_PREFIX
       "${CMAKE_GENERIC_PROGRAM_FILES}/HDF_Group/${HDF5_PACKAGE_NAME}/${HDF5_PACKAGE_VERSION}"
       CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
     set (CMAKE_GENERIC_PROGRAM_FILES)
-  endif (CMAKE_HOST_UNIX)
-endif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Set the cpack variables
@@ -283,9 +295,9 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
   set (CPACK_PACKAGE_NAME "${HDF5_PACKAGE_NAME}")
   if (CDASH_LOCAL)
     set (CPACK_PACKAGE_VERSION "${HDF5_PACKAGE_VERSION}")
-  else (CDASH_LOCAL)
+  else ()
     set (CPACK_PACKAGE_VERSION "${HDF5_PACKAGE_VERSION_STRING}")
-  endif (CDASH_LOCAL)
+  endif ()
   set (CPACK_PACKAGE_VERSION_MAJOR "${HDF5_PACKAGE_VERSION_MAJOR}")
   set (CPACK_PACKAGE_VERSION_MINOR "${HDF5_PACKAGE_VERSION_MINOR}")
   set (CPACK_PACKAGE_VERSION_PATCH "")
@@ -293,13 +305,13 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt")
     set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/COPYING")
     set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt")
-  endif (EXISTS "${HDF5_SOURCE_DIR}/release_docs")
+  endif ()
   set (CPACK_PACKAGE_RELOCATABLE TRUE)
   if (OVERRIDE_INSTALL_VERSION)
     set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${OVERRIDE_INSTALL_VERSION}")
-  else (OVERRIDE_INSTALL_VERSION)
+  else ()
     set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${CPACK_PACKAGE_VERSION}")
-  endif (OVERRIDE_INSTALL_VERSION)
+  endif ()
   set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}/hdf.bmp")
 
   set (CPACK_GENERATOR "TGZ")
@@ -308,7 +320,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
 
     if (NSIS_EXECUTABLE)
       list (APPEND CPACK_GENERATOR "NSIS")
-    endif (NSIS_EXECUTABLE)
+    endif ()
     # Installers for 32- vs. 64-bit CMake:
     #  - Root install directory (displayed to end user at installer-run time)
     #  - "NSIS package/display name" (text used in the installer GUI)
@@ -317,10 +329,10 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     if (CMAKE_CL_64)
       set (CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
       set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION} (Win64)")
-    else (CMAKE_CL_64)
+    else ()
       set (CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
       set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
-    endif (CMAKE_CL_64)
+    endif ()
     # set the install/unistall icon used for the installer itself
     # There is a bug in NSI that does not handle full unix paths properly.
     set (CPACK_NSIS_MUI_ICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.ico")
@@ -330,15 +342,15 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     set (CPACK_NSIS_DISPLAY_NAME "${CPACK_NSIS_PACKAGE_NAME}")
     if (OVERRIDE_INSTALL_VERSION)
       set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${OVERRIDE_INSTALL_VERSION}")
-    else (OVERRIDE_INSTALL_VERSION)
+    else ()
       set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${CPACK_PACKAGE_VERSION}")
-    endif (OVERRIDE_INSTALL_VERSION)
+    endif ()
     set (CPACK_NSIS_CONTACT "${HDF5_PACKAGE_BUGREPORT}")
     set (CPACK_NSIS_MODIFY_PATH ON)
 
     if (WIX_EXECUTABLE)
       list (APPEND CPACK_GENERATOR "WIX")
-    endif (WIX_EXECUTABLE)
+    endif ()
 #WiX variables
     set (CPACK_WIX_UNINSTALL "1")
 # .. variable:: CPACK_WIX_LICENSE_RTF
@@ -381,8 +393,9 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     set(CPACK_WIX_PROPERTY_ARPHELPLINK "${HDF5_PACKAGE_BUGREPORT}")
     if (BUILD_SHARED_LIBS)
       set(CPACK_WIX_PATCH_FILE "${HDF_RESOURCES_DIR}/patch.xml")
-    endif (BUILD_SHARED_LIBS)
+    endif ()
   elseif (APPLE)
+    list (APPEND CPACK_GENERATOR "STGZ")
     list (APPEND CPACK_GENERATOR "DragNDrop")
     set (CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE ON)
     set (CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}")
@@ -415,8 +428,8 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
           FILES ${HDF5_BINARY_DIR}/CMakeFiles/PkgInfo
           DESTINATION ..
       )
-    endif (HDF5_PACK_MACOSX_FRAMEWORK AND HDF5_BUILD_FRAMEWORKS)
-  else (WIN32)
+    endif ()
+  else ()
     list (APPEND CPACK_GENERATOR "STGZ")
     set (CPACK_PACKAGING_INSTALL_PREFIX "/${CPACK_PACKAGE_INSTALL_DIRECTORY}")
     set (CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE ON)
@@ -454,12 +467,12 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
     #-----------------------------------------------------------------------------
 #    configure_file ("${HDF5_RESOURCES_DIR}/hdf5.spec.in" "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_PACKAGE_NAME}.spec" @ONLY IMMEDIATE)
 #    set (CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_PACKAGE_NAME}.spec")
-  endif (WIN32)
+  endif ()
 
   # By default, do not warn when built on machines using only VS Express:
   if (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
     set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
-  endif (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
+  endif ()
   include (InstallRequiredSystemLibraries)
 
   set (CPACK_INSTALL_CMAKE_PROJECTS "${HDF5_BINARY_DIR};HDF5;ALL;/")
@@ -469,23 +482,23 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
       if (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
         if (WIN32)
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;ALL;/")
-        else (WIN32)
+        else ()
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;libraries;/")
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;headers;/")
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;configinstall;/")
-        endif (WIN32)
-      endif (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+        endif ()
+      endif ()
       if (SZIP_FOUND AND SZIP_USE_EXTERNAL)
         if (WIN32)
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;ALL;/")
-        else (WIN32)
+        else ()
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;libraries;/")
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;headers;/")
           set (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;configinstall;/")
-        endif (WIN32)
-      endif (SZIP_FOUND AND SZIP_USE_EXTERNAL)
-    endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
-  endif (HDF5_PACKAGE_EXTLIBS)
+        endif ()
+      endif ()
+    endif ()
+  endif ()
 
   include (CPack)
 
@@ -530,6 +543,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
   )
   cpack_add_component (configinstall
       DISPLAY_NAME "HDF5 CMake files"
+      HIDDEN
       DEPENDS libraries
       GROUP Development
       INSTALL_TYPES Full Developer User
@@ -548,7 +562,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
         GROUP Development
         INSTALL_TYPES Full Developer
     )
-  endif (HDF5_BUILD_FORTRAN)
+  endif ()
 
   if (HDF5_BUILD_CPP_LIB)
     cpack_add_component (cpplibraries
@@ -563,7 +577,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
         GROUP Development
         INSTALL_TYPES Full Developer
     )
-  endif (HDF5_BUILD_CPP_LIB)
+  endif ()
 
   if (HDF5_BUILD_TOOLS)
     cpack_add_component (toolsapplications
@@ -584,7 +598,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
         GROUP Development
         INSTALL_TYPES Full Developer
     )
-  endif (HDF5_BUILD_TOOLS)
+  endif ()
 
   if (HDF5_BUILD_HL_LIB)
     cpack_add_component (hllibraries
@@ -618,7 +632,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
           GROUP Development
           INSTALL_TYPES Full Developer
       )
-    endif (HDF5_BUILD_CPP_LIB)
+    endif ()
     if (HDF5_BUILD_FORTRAN)
       cpack_add_component (hlfortlibraries
           DISPLAY_NAME "HDF5 HL Fortran Libraries"
@@ -626,7 +640,7 @@ The HDF5 data model, file format, API, library, and tools are open and distribut
           GROUP Runtime
           INSTALL_TYPES Full Developer User
       )
-    endif (HDF5_BUILD_FORTRAN)
-  endif (HDF5_BUILD_HL_LIB)
+    endif ()
+  endif ()
 
-endif (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
+endif ()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9359084..ce91052 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5 C CXX)
 
 #-----------------------------------------------------------------------------
@@ -76,13 +76,13 @@ endif ()
 #     # Override the zlib header file
 #     if (VTK_USE_SYSTEM_ZLIB)
 #       set (H5_ZLIB_HEADER "zlib.h")
-#     else (VTK_USE_SYSTEM_ZLIB)
+#     else ()
 #       set (H5_ZLIB_HEADER "vtk_zlib.h")
 #       # Set vars that FindZlib would have set if used in sub project
 #       set (ZLIB_INCLUDE_DIRS "${VTK_ZLIB_INCLUDE_DIRS}")
 #       set (ZLIB_LIBRARIES vtkzlib)
-#     endif (VTK_USE_SYSTEM_ZLIB)
-#   endif (HDF5_ENABLE_Z_LIB_SUPPORT)
+#     endif ()
+#   endif ()
 #
 #   # Add the sub project
 #   add_subdirectory (Utilities/hdf5-1.8)
@@ -100,7 +100,7 @@ option (HDF5_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON)
 mark_as_advanced (HDF5_USE_FOLDERS)
 if (HDF5_USE_FOLDERS)
   set_property (GLOBAL PROPERTY USE_FOLDERS ON)
-endif (HDF5_USE_FOLDERS)
+endif ()
 option (HDF5_NO_PACKAGES "CPACK - Disable packaging" OFF)
 mark_as_advanced (HDF5_NO_PACKAGES)
 option (ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF)
@@ -188,8 +188,8 @@ set (HDF5_HL_SRC_DIR         ${HDF5_SOURCE_DIR}/hl)
 set (HDF5_HL_CPP_SRC_DIR     ${HDF5_SOURCE_DIR}/hl/c++)
 set (HDF5_HL_TOOLS_DIR       ${HDF5_SOURCE_DIR}/hl/tools)
 set (HDF5_TOOLS_DIR          ${HDF5_SOURCE_DIR}/tools)
-set (HDF5_TOOLS_SRC_DIR      ${HDF5_SOURCE_DIR}/tools)
-set (HDF5_PERFORM_SRC_DIR    ${HDF5_SOURCE_DIR}/tools/perform)
+set (HDF5_TOOLS_SRC_DIR      ${HDF5_SOURCE_DIR}/tools/src)
+set (HDF5_PERFORM_SRC_DIR    ${HDF5_SOURCE_DIR}/tools/src/perform)
 set (HDF5_F90_SRC_DIR        ${HDF5_SOURCE_DIR}/fortran)
 set (HDF5_JAVA_JNI_SRC_DIR         ${HDF5_SOURCE_DIR}/java/src/jni)
 set (HDF5_JAVA_HDF5_SRC_DIR        ${HDF5_SOURCE_DIR}/java/src/hdf)
@@ -201,48 +201,48 @@ set (HDF5_JAVA_LOGGING_SIMPLE_JAR  ${HDF5_SOURCE_DIR}/java/lib/ext/slf4j-simple-
 
 if (APPLE)
   option (HDF5_BUILD_FRAMEWORKS "TRUE to build as frameworks libraries, FALSE to build according to BUILD_SHARED_LIBS" FALSE)
-endif (APPLE)
+endif ()
 
 if (NOT HDF5_INSTALL_BIN_DIR)
   set (HDF5_INSTALL_BIN_DIR bin)
-endif (NOT HDF5_INSTALL_BIN_DIR)
+endif ()
 if (NOT HDF5_INSTALL_LIB_DIR)
   if (APPLE)
     if (HDF5_BUILD_FRAMEWORKS)
       set (HDF5_INSTALL_JAR_DIR ../Java)
-    else (HDF5_BUILD_FRAMEWORKS)
+    else ()
       set (HDF5_INSTALL_JAR_DIR lib)
-    endif (HDF5_BUILD_FRAMEWORKS)
+    endif ()
     set (HDF5_INSTALL_FMWK_DIR ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
-  else (APPLE)
+  else ()
     set (HDF5_INSTALL_JAR_DIR lib)
-  endif (APPLE)
+  endif ()
   set (HDF5_INSTALL_LIB_DIR lib)
-endif (NOT HDF5_INSTALL_LIB_DIR)
+endif ()
 if (NOT HDF5_INSTALL_INCLUDE_DIR)
   set (HDF5_INSTALL_INCLUDE_DIR include)
-endif (NOT HDF5_INSTALL_INCLUDE_DIR)
+endif ()
 if (NOT HDF5_INSTALL_DATA_DIR)
   if (NOT WIN32)
     if (APPLE)
       if (HDF5_BUILD_FRAMEWORKS)
         set (HDF5_INSTALL_EXTRA_DIR ../SharedSupport)
-      else (HDF5_BUILD_FRAMEWORKS)
+      else ()
         set (HDF5_INSTALL_EXTRA_DIR share)
-      endif (HDF5_BUILD_FRAMEWORKS)
+      endif ()
       set (HDF5_INSTALL_FWRK_DIR ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
-    endif (APPLE)
+    endif ()
     set (HDF5_INSTALL_DATA_DIR share)
     set (HDF5_INSTALL_CMAKE_DIR share/cmake)
-  else (NOT WIN32)
+  else ()
     set (HDF5_INSTALL_DATA_DIR ".")
     set (HDF5_INSTALL_CMAKE_DIR cmake)
-  endif (NOT WIN32)
-endif (NOT HDF5_INSTALL_DATA_DIR)
+  endif ()
+endif ()
 
-if(DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}")
+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}")
+endif ()
 
 #-----------------------------------------------------------------------------
 # parse the full version number from H5public.h and include in H5_VERS_INFO
@@ -268,75 +268,75 @@ string (REGEX REPLACE ".*LT_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
     "\\1" H5_SOVERS_MINOR ${_lt_vers_am_contents})
 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})
+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 MATCH ".*LT_TOOLS_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_TOOLS_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_TOOLS_SOVERS_EXISTS)
+if (H5_TOOLS_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_CXX_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_CXX_SOVERS_EXISTS)
+endif ()
+string (REGEX MATCH ".*LT_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_CXX_SOVERS_EXISTS ${_lt_vers_am_contents})
+if (H5_CXX_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_F_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_F_SOVERS_EXISTS)
+endif ()
+string (REGEX MATCH ".*LT_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_F_SOVERS_EXISTS ${_lt_vers_am_contents})
+if (H5_F_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_HL_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_HL_SOVERS_EXISTS)
+endif ()
+string (REGEX MATCH ".*LT_HL_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_SOVERS_EXISTS ${_lt_vers_am_contents})
+if (H5_HL_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_HL_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_CXX_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_HL_CXX_SOVERS_EXISTS)
+endif ()
+string (REGEX MATCH ".*LT_HL_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_CXX_SOVERS_EXISTS ${_lt_vers_am_contents})
+if (H5_HL_CXX_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_HL_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_F_SOVERS_EXISTS ${_lt_vers_am_contents})
-if(H5_HL_F_SOVERS_EXISTS)
+endif ()
+string (REGEX MATCH ".*LT_HL_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_HL_F_SOVERS_EXISTS ${_lt_vers_am_contents})
+if (H5_HL_F_SOVERS_EXISTS)
   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})
+  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}")
-endif()
-string (REGEX REPLACE ".*LT_JAVA_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_JAVA_SOVERS_EXISTS ${_lt_vers_am_contents})
+endif ()
+string (REGEX MATCH ".*LT_JAVA_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$" H5_JAVA_SOVERS_EXISTS ${_lt_vers_am_contents})
 if(H5_JAVA_SOVERS_EXISTS)
   string (REGEX REPLACE ".*LT_JAVA_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
       "\\1" H5_JAVA_SOVERS_INTERFACE ${_lt_vers_am_contents})
@@ -344,9 +344,9 @@ if(H5_JAVA_SOVERS_EXISTS)
       "\\1" H5_JAVA_SOVERS_MINOR ${_lt_vers_am_contents})
   string (REGEX REPLACE ".*LT_JAVA_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
       "\\1" H5_JAVA_SOVERS_RELEASE ${_lt_vers_am_contents})
-  MATH (EXPR H5_JAVA_SOVERS_MAJOR ${H5_JAVA_SOVERS_INTERFACE}-${H5_JAVA_SOVERS_RELEASE})
+  math (EXPR H5_JAVA_SOVERS_MAJOR ${H5_JAVA_SOVERS_INTERFACE}-${H5_JAVA_SOVERS_RELEASE})
   message (STATUS "SOVERSION_JAVA: ${H5_JAVA_SOVERS_MAJOR}.${H5_JAVA_SOVERS_RELEASE}.${H5_JAVA_SOVERS_MINOR}")
-endif()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Basic HDF5 stuff here
@@ -358,45 +358,45 @@ set (HDF5_PACKAGE_VERSION_MAJOR "${H5_VERS_MAJOR}.${H5_VERS_MINOR}")
 set (HDF5_PACKAGE_VERSION_MINOR "${H5_VERS_RELEASE}")
 if (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
   set (HDF5_PACKAGE_VERSION_STRING "${HDF5_PACKAGE_VERSION}-${H5_VERS_SUBRELEASE}")
-else (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
+else ()
   set (HDF5_PACKAGE_VERSION_STRING "${HDF5_PACKAGE_VERSION}")
-endif (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
+endif ()
 set (HDF5_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-if(H5_TOOLS_SOVERS_EXISTS)
+if (H5_TOOLS_SOVERS_EXISTS)
   set (HDF5_TOOLS_PACKAGE_SOVERSION "${H5_TOOLS_SOVERS_MAJOR}.${H5_TOOLS_SOVERS_RELEASE}.${H5_TOOLS_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_TOOLS_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_CXX_SOVERS_EXISTS)
+endif ()
+if (H5_CXX_SOVERS_EXISTS)
   set (HDF5_CXX_PACKAGE_SOVERSION "${H5_CXX_SOVERS_MAJOR}.${H5_CXX_SOVERS_RELEASE}.${H5_CXX_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_CXX_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_F_SOVERS_EXISTS)
+endif ()
+if (H5_F_SOVERS_EXISTS)
   set (HDF5_F_PACKAGE_SOVERSION "${H5_F_SOVERS_MAJOR}.${H5_F_SOVERS_RELEASE}.${H5_F_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_F_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_HL_SOVERS_EXISTS)
+endif ()
+if (H5_HL_SOVERS_EXISTS)
   set (HDF5_HL_PACKAGE_SOVERSION "${H5_HL_SOVERS_MAJOR}.${H5_HL_SOVERS_RELEASE}.${H5_HL_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_HL_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_HL_F_SOVERS_EXISTS)
+endif ()
+if (H5_HL_F_SOVERS_EXISTS)
   set (HDF5_HL_CXX_PACKAGE_SOVERSION "${H5_HL_CXX_SOVERS_MAJOR}.${H5_HL_CXX_SOVERS_RELEASE}.${H5_HL_CXX_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_HL_CXX_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_HL_F_SOVERS_EXISTS)
+endif ()
+if (H5_HL_F_SOVERS_EXISTS)
   set (HDF5_HL_F_PACKAGE_SOVERSION "${H5_HL_F_SOVERS_MAJOR}.${H5_HL_F_SOVERS_RELEASE}.${H5_HL_F_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_HL_F_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
-if(H5_JAVA_SOVERS_EXISTS)
+endif ()
+if (H5_JAVA_SOVERS_EXISTS)
   set (HDF5_PACKAGE_SOVERSION "${H5_JAVA_SOVERS_MAJOR}.${H5_JAVA_SOVERS_RELEASE}.${H5_JAVA_SOVERS_MINOR}")
-else()
+else ()
   set (HDF5_JAVA_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-endif()
+endif ()
 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")
@@ -427,16 +427,19 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
   )
   if (WIN32)
     set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE})
-  else (WIN32)
+    set (CMAKE_PDB_OUTPUT_DIRECTORY
+        ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all pdb files."
+    )
+  else ()
     set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
-  endif (WIN32)
-else (NOT HDF5_EXTERNALLY_CONFIGURED)
+  endif ()
+else ()
   # if we are externally configured, but the project uses old cmake scripts
   # this may not be set and utilities like H5detect will fail
   if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
     set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
-  endif (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Targets built within this project are exported at Install time for use
@@ -444,7 +447,7 @@ endif (NOT HDF5_EXTERNALLY_CONFIGURED)
 #-----------------------------------------------------------------------------
 if (NOT HDF5_EXPORTED_TARGETS)
   set (HDF5_EXPORTED_TARGETS "hdf5-targets")
-endif (NOT HDF5_EXPORTED_TARGETS)
+endif ()
 
 #-----------------------------------------------------------------------------
 # To include a library in the list exported by the project AT BUILD TIME,
@@ -452,6 +455,8 @@ endif (NOT HDF5_EXPORTED_TARGETS)
 # which include hdf5 as a sub-project within their build tree
 #-----------------------------------------------------------------------------
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "")
+set_global_variable (HDF5_UTILS_TO_EXPORT "")
+
 set (EXTERNAL_HEADER_LIST "")
 set (EXTERNAL_LIBRARY_LIST "")
 set (EXTERNAL_LIBRARYDLL_LIST "")
@@ -468,17 +473,17 @@ set (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
 #-----------------------------------------------------------------------------
 if (HDF5_BUILD_FRAMEWORKS AND NOT BUILD_SHARED_LIBS)
   set (BUILD_SHARED_LIBS ON CACHE BOOL "Build Shared Libraries")
-endif (HDF5_BUILD_FRAMEWORKS AND NOT BUILD_SHARED_LIBS)
+endif ()
 
 #-----------------------------------------------------------------------------
-# Option to Build Shared and Static libs, default is static
+# Option to Build Shared and Static libs, default is both
 #-----------------------------------------------------------------------------
 option (BUILD_SHARED_LIBS "Build Shared Libraries" ON)
 set (H5_ENABLE_SHARED_LIB NO)
 if (BUILD_SHARED_LIBS)
   set (H5_ENABLE_SHARED_LIB YES)
   set (LINK_SHARED_LIBS ${LINK_LIBS})
-endif (BUILD_SHARED_LIBS)
+endif ()
 set (H5_ENABLE_STATIC_LIB YES)
 set (CMAKE_POSITION_INDEPENDENT_CODE ON)
 
@@ -490,8 +495,8 @@ if (BUILD_STATIC_EXECS)
   if (NOT WIN32)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
-  endif (NOT WIN32)
-endif (BUILD_STATIC_EXECS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to use code coverage
@@ -501,7 +506,7 @@ if (HDF5_ENABLE_COVERAGE)
   set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
   set (LDFLAGS "${LDFLAGS} -fprofile-arcs -ftest-coverage")
-endif (HDF5_ENABLE_COVERAGE)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to indicate using dmalloc
@@ -510,7 +515,7 @@ endif (HDF5_ENABLE_COVERAGE)
 # if (HDF5_ENABLE_USING_DMALLOC)
 #   find_package (DMALLOC)
 #   set (H5_HAVE_DMALLOC DMALLOC_FOUND)
-# endif (HDF5_ENABLE_USING_DMALLOC)
+# endif ()
 
 #-----------------------------------------------------------------------------
 # Option to indicate using a memory checker
@@ -518,7 +523,7 @@ endif (HDF5_ENABLE_COVERAGE)
 option (HDF5_ENABLE_USING_MEMCHECKER "Indicate that a memory checker is used" OFF)
 if (HDF5_ENABLE_USING_MEMCHECKER)
   set (H5_USING_MEMCHECKER 1)
-endif (HDF5_ENABLE_USING_MEMCHECKER)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to indicate internal memory allocation sanity checks are enabled
@@ -526,7 +531,7 @@ endif (HDF5_ENABLE_USING_MEMCHECKER)
 option (HDF5_MEMORY_ALLOC_SANITY_CHECK "Indicate that internal memory allocation sanity checks are enabled" OFF)
 if (HDF5_MEMORY_ALLOC_SANITY_CHECK)
   set (H5_MEMORY_ALLOC_SANITY_CHECK 1)
-endif (HDF5_MEMORY_ALLOC_SANITY_CHECK)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to use deprecated public API symbols
@@ -534,9 +539,9 @@ endif (HDF5_MEMORY_ALLOC_SANITY_CHECK)
 option (HDF5_ENABLE_DEPRECATED_SYMBOLS "Enable deprecated public API symbols" ON)
 if (HDF5_ENABLE_DEPRECATED_SYMBOLS)
   set (H5_NO_DEPRECATED_SYMBOLS 0)
-else (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+else ()
   set (H5_NO_DEPRECATED_SYMBOLS 1)
-endif (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+endif ()
 
 #-----------------------------------------------------------------------------
 # When building utility executables that generate other (source) files :
@@ -551,24 +556,24 @@ if (WIN32)
     add_definitions (-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
     add_definitions (-D_CRT_SECURE_NO_WARNINGS)
     add_definitions (-D_CONSOLE)
-  endif (NOT CYGWIN)
-endif (WIN32)
+  endif ()
+endif ()
 
 if (MSVC)
   set (CMAKE_MFC_FLAG 0)
   set (WIN_COMPILE_FLAGS "")
   set (WIN_LINK_FLAGS "")
-endif (MSVC)
+endif ()
 
 set (MAKE_SYSTEM)
 if (CMAKE_BUILD_TOOL MATCHES "make")
   set (MAKE_SYSTEM 1)
-endif (CMAKE_BUILD_TOOL MATCHES "make")
+endif ()
 
 set (CFG_INIT "/${CMAKE_CFG_INTDIR}")
 if (MAKE_SYSTEM)
   set (CFG_INIT "")
-endif (MAKE_SYSTEM)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add some definitions for Debug Builds
@@ -580,19 +585,19 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
   # Enable tracing of the API
   if (HDF5_ENABLE_TRACE)
     add_definitions (-DH5_DEBUG_API )
-  endif (HDF5_ENABLE_TRACE)
+  endif ()
   # Enable instrumenting of the library's internal operations
   option (HDF5_ENABLE_INSTRUMENT "Instrument The library" OFF)
   if (HDF5_ENABLE_INSTRUMENT)
     set (H5_HAVE_INSTRUMENTED_LIBRARY 1)
-  endif (HDF5_ENABLE_INSTRUMENT)
+  endif ()
   mark_as_advanced (HDF5_ENABLE_INSTRUMENT)
-else (CMAKE_BUILD_TYPE MATCHES Debug)
+else ()
   add_definitions (-DNDEBUG)
   if (HDF5_ENABLE_TRACE)
     add_definitions (-DH5_DEBUG_API )
-  endif (HDF5_ENABLE_TRACE)
-endif (CMAKE_BUILD_TYPE MATCHES Debug)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to embed library info into executables
@@ -600,7 +605,7 @@ endif (CMAKE_BUILD_TYPE MATCHES Debug)
 option (HDF5_ENABLE_EMBEDDED_LIBINFO "embed library info into executables" ON)
 if (HDF5_ENABLE_EMBEDDED_LIBINFO)
   set (H5_HAVE_EMBEDDED_LIBINFO 1)
-endif (HDF5_ENABLE_EMBEDDED_LIBINFO)
+endif ()
 
 include (${HDF_RESOURCES_DIR}/HDFCompilerFlags.cmake)
 
@@ -625,10 +630,10 @@ if (HDF5_ENABLE_PARALLEL)
     # Used by Fortran + MPI
     CHECK_SYMBOL_EXISTS (MPI_Comm_c2f "${MPI_C_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Comm)
     CHECK_SYMBOL_EXISTS (MPI_Info_c2f "${MPI_C_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Info)
-  else (MPI_C_FOUND)
+  else ()
     message (STATUS "Parallel libraries not found")
-  endif (MPI_C_FOUND)
-endif (HDF5_ENABLE_PARALLEL)
+  endif ()
+endif ()
 
 # Parallel IO usage requires MPI to be Linked and Included
 if (H5_HAVE_PARALLEL)
@@ -636,8 +641,8 @@ if (H5_HAVE_PARALLEL)
   set (LINK_SHARED_LIBS ${LINK_SHARED_LIBS} ${MPI_C_LIBRARIES})
   if (MPI_C_LINK_FLAGS)
     set (CMAKE_EXE_LINKER_FLAGS "${MPI_C_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
-  endif (MPI_C_LINK_FLAGS)
-endif (H5_HAVE_PARALLEL)
+  endif ()
+endif ()
 
 set (DEFAULT_API_VERSION "v110")
 #-----------------------------------------------------------------------------
@@ -648,7 +653,7 @@ set (H5_USE_16_API_DEFAULT 0)
 if (HDF5_USE_16_API_DEFAULT)
   set (H5_USE_16_API_DEFAULT 1)
   set (DEFAULT_API_VERSION "v16")
-endif (HDF5_USE_16_API_DEFAULT)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to use 1.8.x API
@@ -658,7 +663,7 @@ 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)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Include user macros
@@ -679,13 +684,13 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
     set (HDF5_NO_PACKAGES OFF CACHE BOOL "CPACK - Disable packaging" FORCE)
     if (HDF5_ENABLE_Z_LIB_SUPPORT AND ZLIB_FOUND)
       PACKAGE_ZLIB_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
-    endif (HDF5_ENABLE_Z_LIB_SUPPORT AND ZLIB_FOUND)
+    endif ()
 
     if (HDF5_ENABLE_SZIP_SUPPORT AND SZIP_FOUND)
       PACKAGE_SZIP_LIBRARY (${HDF5_ALLOW_EXTERNAL_SUPPORT})
-    endif (HDF5_ENABLE_SZIP_SUPPORT AND SZIP_FOUND)
-  endif (HDF5_PACKAGE_EXTLIBS)
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+    endif ()
+  endif ()
+endif ()
 #-----------------------------------------------------------------------------
 # Option to use threadsafe
 #-----------------------------------------------------------------------------
@@ -697,45 +702,45 @@ if (HDF5_ENABLE_THREADSAFE)
   if (HDF5_ENABLE_PARALLEL)
     if (NOT ALLOW_UNSUPPORTED)
       message (FATAL_ERROR " **** parallel and thread-safety options are not supported **** ")
-    else (NOT ALLOW_UNSUPPORTED)
+    else ()
       message (STATUS " **** Allowing unsupported parallel and thread-safety options **** ")
-    endif (NOT ALLOW_UNSUPPORTED)
-  endif (HDF5_ENABLE_PARALLEL)
+    endif ()
+  endif ()
   if (HDF5_BUILD_FORTRAN)
     if (NOT ALLOW_UNSUPPORTED)
       message (FATAL_ERROR " **** Fortran and thread-safety options are not supported **** ")
-    else (NOT ALLOW_UNSUPPORTED)
+    else ()
       message (STATUS " **** Allowing unsupported Fortran and thread-safety options **** ")
-    endif (NOT ALLOW_UNSUPPORTED)
-  endif (HDF5_BUILD_FORTRAN)
+    endif ()
+  endif ()
   if (HDF5_BUILD_CPP_LIB)
     if (NOT ALLOW_UNSUPPORTED)
       message (FATAL_ERROR " **** C++ and thread-safety options are not supported **** ")
-    else (NOT ALLOW_UNSUPPORTED)
+    else ()
       message (STATUS " **** Allowing unsupported C++ and thread-safety options **** ")
-    endif (NOT ALLOW_UNSUPPORTED)
-  endif (HDF5_BUILD_CPP_LIB)
+    endif ()
+  endif ()
   if (HDF5_BUILD_HL_LIB)
     if (NOT ALLOW_UNSUPPORTED)
       message (FATAL_ERROR " **** HL and thread-safety options are not supported **** ")
-    else (NOT ALLOW_UNSUPPORTED)
+    else ()
       message (STATUS " **** Allowing unsupported HL and thread-safety options **** ")
-    endif (NOT ALLOW_UNSUPPORTED)
-  endif (HDF5_BUILD_HL_LIB)
+    endif ()
+  endif ()
   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)
+  else ()
     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 ()
+  endif ()
   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)
+  endif ()
+endif ()
 
 # -----------------------------------------------------------------------
 # wrapper script variables
@@ -748,20 +753,20 @@ endif (HDF5_ENABLE_THREADSAFE)
 #-----------------------------------------------------------------------------
 add_subdirectory (${HDF5_SOURCE_DIR}/src ${PROJECT_BINARY_DIR}/src)
 
-if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
   if (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
     ADD_DEPENDENCIES (${HDF5_LIB_TARGET} ZLIB)
     if (BUILD_SHARED_LIBS)
       add_dependencies (${HDF5_LIBSH_TARGET} ZLIB)
-    endif (BUILD_SHARED_LIBS)
-  endif (ZLIB_FOUND AND ZLIB_USE_EXTERNAL)
+    endif ()
+  endif ()
   if (SZIP_FOUND AND SZIP_USE_EXTERNAL)
     ADD_DEPENDENCIES (${HDF5_LIB_TARGET} SZIP)
     if (BUILD_SHARED_LIBS)
       add_dependencies (${HDF5_LIBSH_TARGET} SZIP)
-    endif (BUILD_SHARED_LIBS)
-  endif (SZIP_FOUND AND SZIP_USE_EXTERNAL)
-endif (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Dashboard and Testing Settings
@@ -778,7 +783,7 @@ if (BUILD_TESTING)
   if (HDF5_TEST_VFD)
     option (HDF5_TEST_FHEAP_VFD "Execute tests with different VFDs" ON)
     mark_as_advanced (HDF5_TEST_FHEAP_VFD)
-  endif (HDF5_TEST_VFD)
+  endif ()
 
   option (HDF_TEST_EXPRESS "Control testing framework (0-3)" "0")
   mark_as_advanced (HDF_TEST_EXPRESS)
@@ -793,14 +798,14 @@ if (BUILD_TESTING)
     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)
       add_subdirectory (${HDF5_SOURCE_DIR}/test      ${PROJECT_BINARY_DIR}/test)
-    endif (EXISTS "${HDF5_SOURCE_DIR}/test" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/test")
+    endif ()
     if (H5_HAVE_PARALLEL)
       if (EXISTS "${HDF5_SOURCE_DIR}/testpar" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/testpar")
         add_subdirectory (${HDF5_SOURCE_DIR}/testpar ${PROJECT_BINARY_DIR}/testpar)
-      endif (EXISTS "${HDF5_SOURCE_DIR}/testpar" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/testpar")
-    endif (H5_HAVE_PARALLEL)
-  endif (NOT HDF5_EXTERNALLY_CONFIGURED)
-endif (BUILD_TESTING)
+      endif ()
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build HDF5 Tools
@@ -809,8 +814,8 @@ if (EXISTS "${HDF5_SOURCE_DIR}/tools" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/tools
   option (HDF5_BUILD_TOOLS  "Build HDF5 Tools" ON)
   if (HDF5_BUILD_TOOLS)
     add_subdirectory (${HDF5_SOURCE_DIR}/tools ${PROJECT_BINARY_DIR}/tools)
-  endif (HDF5_BUILD_TOOLS)
-endif (EXISTS "${HDF5_SOURCE_DIR}/tools" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/tools")
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build examples
@@ -819,8 +824,8 @@ if (EXISTS "${HDF5_SOURCE_DIR}/examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/ex
   option (HDF5_BUILD_EXAMPLES  "Build HDF5 Library Examples" ON)
   if (HDF5_BUILD_EXAMPLES)
     add_subdirectory (${HDF5_SOURCE_DIR}/examples ${PROJECT_BINARY_DIR}/examples)
-  endif (HDF5_BUILD_EXAMPLES)
-endif (EXISTS "${HDF5_SOURCE_DIR}/examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/examples")
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build High Level API's
@@ -830,8 +835,8 @@ if (EXISTS "${HDF5_SOURCE_DIR}/hl" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl")
   if (HDF5_BUILD_HL_LIB)
     set (H5_INCLUDE_HL 1)
     add_subdirectory (${HDF5_SOURCE_DIR}/hl ${PROJECT_BINARY_DIR}/hl)
-  endif (HDF5_BUILD_HL_LIB)
-endif (EXISTS "${HDF5_SOURCE_DIR}/hl" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl")
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build Fortran bindings/tests/examples
@@ -849,10 +854,10 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for
       if (NOT ALLOW_UNSUPPORTED)
         message (STATUS " **** Shared FORTRAN libraries are unsupported **** ")
         set (SKIP_HDF5_FORTRAN_SHARED ON)
-      else (NOT ALLOW_UNSUPPORTED)
+      else ()
         message (STATUS " **** Allowing unsupported Fortran shared libraries **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (BUILD_SHARED_LIBS AND APPLE)
+      endif ()
+    endif ()
     option (HDF5_ENABLE_F2003 "Enable FORTRAN 2003 Standard" ON)
 
     include (${HDF_RESOURCES_EXT_DIR}/HDFUseFortran.cmake)
@@ -869,8 +874,17 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for
     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)
+      endif ()
+    endif ()
+
+    # Parallel IO usage requires MPI to be Linked and Included
+    if (H5_HAVE_PARALLEL)
+      set (LINK_Fortran_LIBS ${LINK_LIBS} ${MPI_Fortran_LIBRARIES})
+      set (LINK_Fortran_SHARED_LIBS ${LINK_SHARED_LIBS} ${MPI_Fortran_LIBRARIES})
+      if (MPI_Fortran_LINK_FLAGS)
+        set (CMAKE_Fortran_EXE_LINKER_FLAGS "${MPI_Fortran_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+      endif ()
+    endif ()
 
     # -----------------------------------------------------------------------
     # wrapper script variables
@@ -882,10 +896,10 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for
       if (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
         #-- Build the High Level Fortran source codes
         add_subdirectory (${HDF5_SOURCE_DIR}/hl/fortran ${PROJECT_BINARY_DIR}/hl/fortran)
-      endif (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
-    endif (HDF5_BUILD_HL_LIB)
-  endif (HDF5_BUILD_FORTRAN)
-endif (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/fortran")
+      endif ()
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build HDF5 C++ Library
@@ -897,22 +911,22 @@ if (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++")
     if (HDF5_ENABLE_PARALLEL)
       if (NOT ALLOW_UNSUPPORTED)
         message (FATAL_ERROR " **** Parallel and C++ options are mutually exclusive **** ")
-      else (NOT ALLOW_UNSUPPORTED)
+      else ()
         message (STATUS " **** Allowing unsupported Parallel and C++ options **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (HDF5_ENABLE_PARALLEL)
+      endif ()
+    endif ()
     if (CMAKE_NO_STD_NAMESPACE)
       set (H5_NO_STD 1)
-    endif (CMAKE_NO_STD_NAMESPACE)
+    endif ()
     add_subdirectory (${HDF5_SOURCE_DIR}/c++ ${PROJECT_BINARY_DIR}/c++)
     if (HDF5_BUILD_HL_LIB)
       if (EXISTS "${HDF5_SOURCE_DIR}/hl/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/c++")
         #-- Build the High Level Fortran source codes
         add_subdirectory (${HDF5_SOURCE_DIR}/hl/c++ ${PROJECT_BINARY_DIR}/hl/c++)
-      endif (EXISTS "${HDF5_SOURCE_DIR}/hl/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/c++")
-    endif (HDF5_BUILD_HL_LIB)
-  endif (HDF5_BUILD_CPP_LIB)
-endif (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++")
+      endif ()
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Check if Fortran's default real is double precision. If it is and HL is
@@ -921,8 +935,8 @@ endif (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++"
 if (HDF5_BUILD_FORTRAN AND HDF5_BUILD_HL_LIB)
   if (NOT FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
     message (FATAL_ERROR " **** Fortran high-level routines are not supported when the default REAL is DOUBLE PRECISION, use HDF5_BUILD_HL_LIB:BOOL=OFF **** ")
-  endif (NOT FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
-endif (HDF5_BUILD_FORTRAN AND HDF5_BUILD_HL_LIB)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to build HDF5 Java Library
@@ -931,8 +945,8 @@ if (EXISTS "${HDF5_SOURCE_DIR}/java" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/java")
   option (HDF5_BUILD_JAVA  "Build Java HDF5 Library" OFF)
   if (HDF5_BUILD_JAVA)
     add_subdirectory (${HDF5_SOURCE_DIR}/java ${PROJECT_BINARY_DIR}/java)
-  endif (HDF5_BUILD_JAVA)
-endif (EXISTS "${HDF5_SOURCE_DIR}/java" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/java")
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Generate the H5pubconf.h file containing user settings needed by compilation
diff --git a/COPYING b/COPYING
index 2166ced..3d3387c 100644
--- a/COPYING
+++ b/COPYING
@@ -1,13 +1,12 @@
-
 Copyright Notice and License Terms for 
 HDF5 (Hierarchical Data Format 5) Software Library and Utilities
 -----------------------------------------------------------------------------
 
 HDF5 (Hierarchical Data Format 5) Software Library and Utilities
-Copyright 2006-2016 by The HDF Group.
+Copyright (c) 2006, The HDF Group. 
 
 NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
-Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
+Copyright (c) 1998-2006, The Board of Trustees of the University of Illinois. 
 
 All rights reserved.
 
@@ -47,13 +46,21 @@ advised of the possibility of such damage.
 -----------------------------------------------------------------------------
 -----------------------------------------------------------------------------
 
+Limited portions of HDF5 were developed by Lawrence Berkeley National 
+Laboratory (LBNL). LBNL's Copyright Notice and Licensing Terms can be
+found here: COPYING_LBNL_HDF5 file in this directory or at 
+https://support.hdfgroup.org/ftp/HDF5/releases/COPYING_LBNL_HDF5. 
+
+-----------------------------------------------------------------------------
+-----------------------------------------------------------------------------
+
 Contributors:   National Center for Supercomputing Applications (NCSA) at 
 the University of Illinois, Fortner Software, Unidata Program Center (netCDF), 
 The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), 
 and Digital Equipment Corporation (DEC).
 
 -----------------------------------------------------------------------------
-
+ 
 Portions of HDF5 were developed with support from the Lawrence Berkeley 
 National Laboratory (LBNL) and the United States Department of Energy 
 under Prime Contract No. DE-AC02-05CH11231.
@@ -92,7 +99,8 @@ and/or accompanying materials:
 
 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.
+in HDF Products” (https://support.hdfgroup.org/doc_resource/SZIP/) for 
+further details.
 
 -----------------------------------------------------------------------------
 
diff --git a/COPYING_LBNL_HDF5 b/COPYING_LBNL_HDF5
new file mode 100644
index 0000000..16fba5d
--- /dev/null
+++ b/COPYING_LBNL_HDF5
@@ -0,0 +1,49 @@
+Copyright Notice and License Terms for
+HDF5 (Hierarchical Data Format 5) Software Library and Utilities
+-----------------------------------------------------------------------------
+
+HDF5 (Hierarchical Data Format 5)
+Copyright (c) 2016, The Regents of the University of California, through 
+Lawrence Berkeley National Laboratory (subject to receipt of any required 
+approvals from the U.S. Dept. of Energy).
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, 
+   this list of conditions, and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, 
+   this list of conditions, and the following disclaimer in the documentation 
+   and/or materials provided with the distribution.
+
+3. Neither the name of the University of California, Lawrence Berkeley 
+National Laboratory, U.S. Dept. of Energy nor the names of its contributors 
+may be used to endorse or promote products derived from this software without 
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
+THE POSSIBILITY OF SUCH DAMAGE.
+
+You are under no obligation whatsoever to provide any bug fixes, patches, 
+or upgrades to the features, functionality or performance of the source 
+code ("Enhancements") to anyone; however, if you choose to make your 
+Enhancements available either publicly, or directly to Lawrence Berkeley 
+National Laboratory, without imposing a separate written license agreement 
+for such Enhancements, then you hereby grant the following license: 
+a non-exclusive, royalty-free perpetual license to install, use, modify, 
+prepare derivative works, incorporate into other computer software, 
+distribute, and sublicense such enhancements or derivative works thereof, 
+in binary and source code form.
+
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index bd97834..ae78f95 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 ## This file should be placed in the root directory of your project.
 ## Then modify the CMakeLists.txt file in the root directory of your
 ## project to incorporate the testing dashboard.
@@ -9,15 +20,15 @@ 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_SITE "cdash-internal.hdfgroup.org")
   set (CTEST_DROP_LOCATION "/submit.php?project=HDF5110")
-else (CDASH_LOCAL)
+else ()
   set (CTEST_DROP_SITE "cdash.hdfgroup.org")
   set (CTEST_DROP_LOCATION "/submit.php?project=HDF5110")
-endif (CDASH_LOCAL)
+endif ()
 set (CTEST_DROP_SITE_CDASH TRUE)
 
-set (UPDATE_TYPE svn)
+set (UPDATE_TYPE git)
 set (VALGRIND_COMMAND "/usr/bin/valgrind")
 set (VALGRIND_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_MEMORYCHECK_COMMAND "/usr/bin/valgrind")
diff --git a/MANIFEST b/MANIFEST
index a3b879e..35d3c2e 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 #------------------------------------------------------------------------------
 # This is the list of files that are part of HDF5 source distribution.
@@ -20,10 +18,13 @@
 # in column one with a '#'.
 #------------------------------------------------------------------------------
 
-./.autom4te.cfg                 _DO_NOT_DISTRIBUTE_
+./.gitattributes       _DO_NOT_DISTRIBUTE_
+./.gitignore           _DO_NOT_DISTRIBUTE_
+./.autom4te.cfg        _DO_NOT_DISTRIBUTE_
 ./.h5chkright.ini      _DO_NOT_DISTRIBUTE_
 ./ACKNOWLEDGMENTS
 ./COPYING
+./COPYING_LBNL_HDF5
 ./MANIFEST
 ./Makefile.dist
 ./Makefile.am
@@ -34,6 +35,7 @@
 
 ./m4/aclocal_cxx.m4
 ./m4/aclocal_fc.m4
+./m4/aclocal_fc.f90
 ./m4/ax_check_class.m4
 ./m4/ax_check_classpath.m4
 ./m4/ax_check_java_home.m4
@@ -81,6 +83,7 @@
 ./bin/output_filter.sh
 ./bin/README        _DO_NOT_DISTRIBUTE_
 ./bin/release
+./bin/restore.sh
 ./bin/runtest        _DO_NOT_DISTRIBUTE_
 ./bin/snapshot
 ./bin/snapshot_version      _DO_NOT_DISTRIBUTE_
@@ -88,6 +91,10 @@
 ./bin/timekeeper      _DO_NOT_DISTRIBUTE_
 ./bin/trace
 ./bin/yodconfigure
+./bin/pkgscrpts/h5rmflags                  _DO_NOT_DISTRIBUTE_
+./bin/pkgscrpts/makeHDF5BinaryTarfiles.pl  _DO_NOT_DISTRIBUTE_
+./bin/pkgscrpts/makeInternalREADME.pl      _DO_NOT_DISTRIBUTE_
+./bin/pkgscrpts/makeOuterREADME.pl         _DO_NOT_DISTRIBUTE_
 
 ./config/COPYING
 ./config/BlankForm
@@ -102,8 +109,7 @@
 ./config/gnu-cxxflags
 ./config/gnu-fflags
 ./config/gnu-flags
-./config/i386-pc-cygwin32
-./config/i686-pc-cygwin
+./config/cygwin
 ./config/ibm-aix
 ./config/ibm-flags
 ./config/intel-fflags
@@ -117,7 +123,6 @@
 ./config/pgi-fflags
 ./config/pgi-flags
 ./config/solaris
-./config/x86_64-pc-cygwin
 
 ./config/site-specific/BlankForm
 
@@ -240,7 +245,6 @@
 ./fortran/src/HDF5.F90
 ./fortran/src/Makefile.am
 ./fortran/src/README
-./fortran/src/README_DEVELOPEMENT   _DO_NOT_DISTRIBUTE_
 ./fortran/src/h5fc.in
 ./fortran/src/hdf5_fortrandll.def.in
 
@@ -368,6 +372,8 @@
 ./c++/src/H5Include.h
 ./c++/src/H5IntType.cpp
 ./c++/src/H5IntType.h
+./c++/src/H5LaccProp.cpp
+./c++/src/H5LaccProp.h
 ./c++/src/H5Library.cpp
 ./c++/src/H5Library.h
 ./c++/src/H5Location.cpp
@@ -410,6 +416,7 @@
 ./c++/test/tfilter.cpp
 ./c++/test/th5s.cpp
 ./c++/test/th5s.h5
+./c++/test/titerate.cpp
 ./c++/test/tlinks.cpp
 ./c++/test/tobject.cpp
 ./c++/test/ttypes.cpp
@@ -424,6 +431,8 @@
 
 ./release_docs/COPYING
 ./release_docs/HISTORY-1_0-1_8_0_rc3.txt
+./release_docs/HISTORY-1_8.txt
+./release_docs/HISTORY-1_10.txt
 ./release_docs/HISTORY-1_8_0-1_10_0.txt
 ./release_docs/INSTALL
 ./release_docs/INSTALL_CMake.txt
@@ -464,12 +473,14 @@
 ./src/H5Aprivate.h
 ./src/H5Apublic.h
 ./src/H5AC.c
+./src/H5ACdbg.c
 ./src/H5AClog.c
 ./src/H5ACmodule.h
 ./src/H5ACmpio.c
 ./src/H5ACpkg.h
 ./src/H5ACprivate.h
 ./src/H5ACpublic.h
+./src/H5ACproxy_entry.c
 ./src/H5B.c
 ./src/H5Bcache.c
 ./src/H5Bdbg.c
@@ -482,6 +493,8 @@
 ./src/H5B2dbg.c
 ./src/H5B2hdr.c
 ./src/H5B2int.c
+./src/H5B2internal.c
+./src/H5B2leaf.c
 ./src/H5B2module.h
 ./src/H5B2pkg.h
 ./src/H5B2private.h
@@ -489,11 +502,19 @@
 ./src/H5B2stat.c
 ./src/H5B2test.c
 ./src/H5C.c
+./src/H5Cdbg.c
+./src/H5Cepoch.c
+./src/H5Cimage.c
+./src/H5Clog.c
 ./src/H5Cmodule.h
 ./src/H5Cmpio.c
 ./src/H5Cpkg.h
+./src/H5Cprefetched.c
 ./src/H5Cprivate.h
 ./src/H5Cpublic.h
+./src/H5Cquery.c
+./src/H5Ctag.c
+./src/H5Ctest.c
 ./src/H5CS.c
 ./src/H5CSprivate.h
 ./src/H5D.c
@@ -558,6 +579,7 @@
 ./src/H5Fmpi.c
 ./src/H5Fquery.c
 ./src/H5Fsfile.c
+./src/H5Fspace.c
 ./src/H5Fsuper.c
 ./src/H5Fsuper_cache.c
 ./src/H5Fpkg.h
@@ -652,7 +674,6 @@
 ./src/H5HFhdr.c
 ./src/H5HFhuge.c
 ./src/H5HFiblock.c
-./src/H5HFint.c
 ./src/H5HFiter.c
 ./src/H5HFman.c
 ./src/H5HFmodule.h
@@ -719,6 +740,7 @@
 ./src/H5Obogus.c
 ./src/H5Obtreek.c
 ./src/H5Ocache.c
+./src/H5Ocache_image.c
 ./src/H5Ochunk.c
 ./src/H5Ocont.c
 ./src/H5Ocopy.c
@@ -741,7 +763,6 @@
 ./src/H5Opkg.h
 ./src/H5Opline.c
 ./src/H5Oprivate.h
-./src/H5Oproxy.c
 ./src/H5Opublic.h
 ./src/H5Orefcount.c
 ./src/H5Osdspace.c
@@ -773,8 +794,13 @@
 ./src/H5Ppublic.h
 ./src/H5Pstrcpl.c
 ./src/H5Ptest.c
+./src/H5PB.c
+./src/H5PBmodule.h
+./src/H5PBpkg.h
+./src/H5PBprivate.h
 ./src/H5PL.c
 ./src/H5PLmodule.h
+./src/H5PLpkg.h
 ./src/H5PLprivate.h
 ./src/H5PLpublic.h
 ./src/H5PLextern.h
@@ -875,6 +901,7 @@
 ./test/SWMR_UseCase_UG.txt
 ./test/accum.c
 ./test/accum_swmr_reader.c
+./test/aggr.h5
 ./test/app_ref.c
 ./test/atomic_reader.c
 ./test/atomic_writer.c
@@ -891,6 +918,7 @@
 ./test/cache_api.c
 ./test/cache_common.c
 ./test/cache_common.h
+./test/cache_image.c
 ./test/cache_logging.c
 ./test/cache_tagging.c
 ./test/cmpd_dset.c
@@ -906,11 +934,13 @@
 ./test/dynlib1.c
 ./test/dynlib2.c
 ./test/dynlib3.c
+./test/dynlib4.c
 ./test/earray.c
 ./test/efc.c
 ./test/enc_dec_plist.c
 ./test/enc_dec_plist_cross_platform.c
 ./test/enum.c
+./test/evict_on_close.c
 ./test/extend.c
 ./test/external.c
 ./test/error_test.c
@@ -934,6 +964,10 @@
 ./test/flush1.c
 ./test/flush2.c
 ./test/flushrefresh.c
+./test/fsm_aggr_nopersist.h5
+./test/fsm_aggr_persist.h5
+./test/genall5.c
+./test/genall5.h
 ./test/gen_bad_ohdr.c
 ./test/gen_bad_compound.c
 ./test/gen_bogus.c
@@ -941,7 +975,6 @@
 ./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
 ./test/gen_new_fill.c
@@ -961,6 +994,12 @@
 ./test/getname.c
 ./test/gheap.c
 ./test/group_old.h5
+./test/h5fc_ext1_f.h5
+./test/h5fc_ext1_i.h5
+./test/h5fc_ext2_if.h5
+./test/h5fc_ext2_sf.h5
+./test/h5fc_ext3_isf.h5
+./test/h5fc_ext_none.h5
 ./test/h5test.c
 ./test/h5test.h
 ./test/hyperslab.c
@@ -977,9 +1016,13 @@
 ./test/multi_file_v16-r.h5
 ./test/multi_file_v16-s.h5
 ./test/noencoder.h5
+./test/none.h5
 ./test/ntypes.c
 ./test/ohdr.c
 ./test/objcopy.c
+./test/page_buffer.c
+./test/paged_nopersist.h5
+./test/paged_persist.h5
 ./test/plugin.c
 ./test/reserved.c
 ./test/pool.c
@@ -1178,6 +1221,7 @@
 ./testpar/COPYING
 ./testpar/Makefile.am
 ./testpar/t_cache.c
+./testpar/t_cache_image.c
 ./testpar/t_chunk_alloc.c
 ./testpar/t_coll_chunk.c
 ./testpar/t_dset.c
@@ -1201,170 +1245,187 @@
 
 ./tools/COPYING
 ./tools/Makefile.am
-
-./tools/h5dump/Makefile.am
-./tools/h5dump/h5dump.c
-./tools/h5dump/h5dump.h
-./tools/h5dump/h5dump_defines.h
-./tools/h5dump/h5dump_extern.h
-./tools/h5dump/h5dump_ddl.c
-./tools/h5dump/h5dump_ddl.h
-./tools/h5dump/h5dump_xml.c
-./tools/h5dump/h5dump_xml.h
-./tools/h5dump/h5dumpgentest.c
-./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/h5import.h
-./tools/h5import/h5import.c
-./tools/h5import/h5importtest.c
-./tools/h5import/h5importtestutil.sh.in
+./tools/src/Makefile.am
+./tools/test/Makefile.am
+
+./tools/src/h5dump/Makefile.am
+./tools/src/h5dump/h5dump.c
+./tools/src/h5dump/h5dump.h
+./tools/src/h5dump/h5dump_defines.h
+./tools/src/h5dump/h5dump_extern.h
+./tools/src/h5dump/h5dump_ddl.c
+./tools/src/h5dump/h5dump_ddl.h
+./tools/src/h5dump/h5dump_xml.c
+./tools/src/h5dump/h5dump_xml.h
+./tools/test/h5dump/Makefile.am
+./tools/test/h5dump/dynlib_dump.c
+./tools/test/h5dump/h5dumpgentest.c
+./tools/test/h5dump/h5dump_plugin.sh.in
+./tools/test/h5dump/testh5dump.sh.in
+./tools/test/h5dump/testh5dumppbits.sh.in
+./tools/test/h5dump/testh5dumpxml.sh.in
+./tools/test/h5dump/testh5dumpvds.sh.in
+./tools/test/h5dump/binread.c
+
+./tools/src/h5import/Makefile.am
+./tools/src/h5import/h5import.h
+./tools/src/h5import/h5import.c
+./tools/test/h5import/Makefile.am
+./tools/test/h5import/h5importtest.c
+./tools/test/h5import/h5importtestutil.sh.in
 
 # testfiles for h5import
-./tools/h5import/testfiles/binfp64.conf
-./tools/h5import/testfiles/binfp64.h5
-./tools/h5import/testfiles/binin16.conf
-./tools/h5import/testfiles/binin16.h5
-./tools/h5import/testfiles/binin32.conf
-./tools/h5import/testfiles/binin32.h5
-./tools/h5import/testfiles/binin8.conf
-./tools/h5import/testfiles/binin8.h5
-./tools/h5import/testfiles/binin8w.conf
-./tools/h5import/testfiles/binin8w.h5
-./tools/h5import/testfiles/binuin16.conf
-./tools/h5import/testfiles/binuin16.h5
-./tools/h5import/testfiles/binuin32.conf
-./tools/h5import/testfiles/binuin32.h5
-./tools/h5import/testfiles/textpfe.conf
-./tools/h5import/testfiles/textpfe.h5
-./tools/h5import/testfiles/textpfe64.txt
-./tools/h5import/testfiles/txtfp32.conf
-./tools/h5import/testfiles/txtfp32.h5
-./tools/h5import/testfiles/txtfp32.txt
-./tools/h5import/testfiles/txtfp64.conf
-./tools/h5import/testfiles/txtfp64.h5
-./tools/h5import/testfiles/txtfp64.txt
-./tools/h5import/testfiles/txtin16.conf
-./tools/h5import/testfiles/txtin16.h5
-./tools/h5import/testfiles/txtin16.txt
-./tools/h5import/testfiles/txtin32.conf
-./tools/h5import/testfiles/txtin32.h5
-./tools/h5import/testfiles/txtin32.txt
-./tools/h5import/testfiles/txtin8.conf
-./tools/h5import/testfiles/txtin8.h5
-./tools/h5import/testfiles/txtin8.txt
-./tools/h5import/testfiles/txtuin16.conf
-./tools/h5import/testfiles/txtuin16.h5
-./tools/h5import/testfiles/txtuin16.txt
-./tools/h5import/testfiles/txtuin32.conf
-./tools/h5import/testfiles/txtuin32.h5
-./tools/h5import/testfiles/txtuin32.txt
-./tools/h5import/testfiles/txtstr.conf
-./tools/h5import/testfiles/txtstr.h5
-./tools/h5import/testfiles/txtstr.txt
-./tools/h5import/testfiles/dbinfp64.h5.txt
-./tools/h5import/testfiles/dbinin8.h5.txt
-./tools/h5import/testfiles/dbinin8w.h5.txt
-./tools/h5import/testfiles/dbinin16.h5.txt
-./tools/h5import/testfiles/dbinin32.h5.txt
-./tools/h5import/testfiles/dbinuin16.h5.txt
-./tools/h5import/testfiles/dbinuin32.h5.txt
-./tools/h5import/testfiles/dtxtstr.h5.txt
+./tools/test/h5import/testfiles/binfp64.conf
+./tools/test/h5import/testfiles/binfp64.h5
+./tools/test/h5import/testfiles/binin16.conf
+./tools/test/h5import/testfiles/binin16.h5
+./tools/test/h5import/testfiles/binin32.conf
+./tools/test/h5import/testfiles/binin32.h5
+./tools/test/h5import/testfiles/binin8.conf
+./tools/test/h5import/testfiles/binin8.h5
+./tools/test/h5import/testfiles/binin8w.conf
+./tools/test/h5import/testfiles/binin8w.h5
+./tools/test/h5import/testfiles/binuin16.conf
+./tools/test/h5import/testfiles/binuin16.h5
+./tools/test/h5import/testfiles/binuin32.conf
+./tools/test/h5import/testfiles/binuin32.h5
+./tools/test/h5import/testfiles/textpfe.conf
+./tools/test/h5import/testfiles/textpfe.h5
+./tools/test/h5import/testfiles/textpfe64.txt
+./tools/test/h5import/testfiles/txtfp32.conf
+./tools/test/h5import/testfiles/txtfp32.h5
+./tools/test/h5import/testfiles/txtfp32.txt
+./tools/test/h5import/testfiles/txtfp64.conf
+./tools/test/h5import/testfiles/txtfp64.h5
+./tools/test/h5import/testfiles/txtfp64.txt
+./tools/test/h5import/testfiles/txtin16.conf
+./tools/test/h5import/testfiles/txtin16.h5
+./tools/test/h5import/testfiles/txtin16.txt
+./tools/test/h5import/testfiles/txtin32.conf
+./tools/test/h5import/testfiles/txtin32.h5
+./tools/test/h5import/testfiles/txtin32.txt
+./tools/test/h5import/testfiles/txtin8.conf
+./tools/test/h5import/testfiles/txtin8.h5
+./tools/test/h5import/testfiles/txtin8.txt
+./tools/test/h5import/testfiles/txtuin16.conf
+./tools/test/h5import/testfiles/txtuin16.h5
+./tools/test/h5import/testfiles/txtuin16.txt
+./tools/test/h5import/testfiles/txtuin32.conf
+./tools/test/h5import/testfiles/txtuin32.h5
+./tools/test/h5import/testfiles/txtuin32.txt
+./tools/test/h5import/testfiles/txtstr.conf
+./tools/test/h5import/testfiles/txtstr.h5
+./tools/test/h5import/testfiles/txtstr.txt
+./tools/test/h5import/testfiles/dbinfp64.h5.txt
+./tools/test/h5import/testfiles/dbinin8.h5.txt
+./tools/test/h5import/testfiles/dbinin8w.h5.txt
+./tools/test/h5import/testfiles/dbinin16.h5.txt
+./tools/test/h5import/testfiles/dbinin32.h5.txt
+./tools/test/h5import/testfiles/dbinuin16.h5.txt
+./tools/test/h5import/testfiles/dbinuin32.h5.txt
+./tools/test/h5import/testfiles/dtxtstr.h5.txt
 
 # h5diff sources
-./tools/h5diff/Makefile.am
-./tools/h5diff/h5diff_common.c
-./tools/h5diff/h5diff_common.h
-./tools/h5diff/h5diff_main.c
-./tools/h5diff/ph5diff_main.c
-./tools/h5diff/h5diffgentest.c
-./tools/h5diff/testh5diff.sh.in
-./tools/h5diff/testph5diff.sh.in
+./tools/src/h5diff/Makefile.am
+./tools/src/h5diff/h5diff_common.c
+./tools/src/h5diff/h5diff_common.h
+./tools/src/h5diff/h5diff_main.c
+./tools/src/h5diff/ph5diff_main.c
+./tools/test/h5diff/Makefile.am
+./tools/test/h5diff/dynlib_diff.c
+./tools/test/h5diff/h5diffgentest.c
+./tools/test/h5diff/h5diff_plugin.sh.in
+./tools/test/h5diff/testh5diff.sh.in
+./tools/test/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_edge_v3.h5
-./tools/h5format_convert/testfiles/h5fc_ext1_f.h5
-./tools/h5format_convert/testfiles/h5fc_ext1_i.h5
-./tools/h5format_convert/testfiles/h5fc_ext1_s.h5
-./tools/h5format_convert/testfiles/h5fc_ext2_if.h5
-./tools/h5format_convert/testfiles/h5fc_ext2_is.h5
-./tools/h5format_convert/testfiles/h5fc_ext2_sf.h5
-./tools/h5format_convert/testfiles/h5fc_ext3_isf.h5
-./tools/h5format_convert/testfiles/h5fc_ext_none.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext1_f.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext1_i.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext1_s.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext2_if.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext2_is.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext2_sf.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext3_isf.h5
-./tools/h5format_convert/testfiles/old_h5fc_ext_none.h5
-./tools/h5format_convert/testfiles/h5fc_ext1_f.ddl
-./tools/h5format_convert/testfiles/h5fc_ext1_i.ddl
-./tools/h5format_convert/testfiles/h5fc_ext1_s.ddl
-./tools/h5format_convert/testfiles/h5fc_ext2_if.ddl
-./tools/h5format_convert/testfiles/h5fc_ext2_is.ddl
-./tools/h5format_convert/testfiles/h5fc_ext2_sf.ddl
-./tools/h5format_convert/testfiles/h5fc_ext3_isf.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
-./tools/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
-./tools/h5format_convert/testh5fc.sh.in
+./tools/src/h5format_convert/Makefile.am
+./tools/src/h5format_convert/h5format_convert.c
+./tools/test/h5format_convert/Makefile.am
+./tools/test/h5format_convert/h5fc_chk_idx.c
+./tools/test/h5format_convert/h5fc_gentest.c
+./tools/test/h5format_convert/testfiles/h5fc_v_n_all.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_bt1.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_err.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
+./tools/test/h5format_convert/testfiles/h5fc_d_file.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
+./tools/test/h5format_convert/testfiles/h5fc_dname.ddl
+./tools/test/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
+./tools/test/h5format_convert/testfiles/h5fc_help.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_all.ddl
+./tools/test/h5format_convert/testfiles/h5fc_nooption.ddl
+./tools/test/h5format_convert/testfiles/h5fc_v_n_1d.ddl
+./tools/test/h5format_convert/testfiles/h5fc_nonexistfile.ddl
+./tools/test/h5format_convert/testfiles/h5fc_non_v3.h5
+./tools/test/h5format_convert/testfiles/h5fc_edge_v3.h5
+./tools/test/h5format_convert/testfiles/h5fc_err_level.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext1_f.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext1_i.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext1_s.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext2_if.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext2_is.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext2_sf.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext3_isf.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext_none.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.h5
+./tools/test/h5format_convert/testfiles/old_h5fc_ext_none.h5
+./tools/test/h5format_convert/testfiles/h5fc_ext1_f.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext1_i.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext1_s.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext2_if.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext2_is.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext2_sf.ddl
+./tools/test/h5format_convert/testfiles/h5fc_ext3_isf.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
+./tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
+./tools/test/h5format_convert/testh5fc.sh.in
 
 # h5repack sources
-./tools/h5repack/Makefile.am
-./tools/h5repack/dynlib_rpk.c
-./tools/h5repack/h5repack.sh.in
-./tools/h5repack/h5repack_plugin.sh.in
-./tools/h5repack/h5repack.c
-./tools/h5repack/h5repack.h
-./tools/h5repack/h5repack_copy.c
-./tools/h5repack/h5repack_refs.c
-./tools/h5repack/h5repack_filters.c
-./tools/h5repack/h5repack_main.c
-./tools/h5repack/h5repack_opttable.c
-./tools/h5repack/h5repack_parse.c
-./tools/h5repack/h5repack_verify.c
-./tools/h5repack/h5repacktst.c
-./tools/h5repack/testh5repack_detect_szip.c
+./tools/src/h5repack/Makefile.am
+./tools/src/h5repack/h5repack.c
+./tools/src/h5repack/h5repack.h
+./tools/src/h5repack/h5repack_copy.c
+./tools/src/h5repack/h5repack_refs.c
+./tools/src/h5repack/h5repack_filters.c
+./tools/src/h5repack/h5repack_main.c
+./tools/src/h5repack/h5repack_opttable.c
+./tools/src/h5repack/h5repack_parse.c
+./tools/src/h5repack/h5repack_verify.c
+./tools/test/h5repack/Makefile.am
+./tools/test/h5repack/dynlib_rpk.c
+./tools/test/h5repack/dynlib_vrpk.c
+./tools/test/h5repack/h5repack.sh.in
+./tools/test/h5repack/h5repack_plugin.sh.in
+./tools/test/h5repack/h5repacktst.c
+./tools/test/h5repack/testh5repack_detect_szip.c
 
 # h5ls sources
-./tools/h5ls/CMakeTestsVDS.cmake
-./tools/h5ls/Makefile.am
-./tools/h5ls/h5ls.c
-./tools/h5ls/testh5ls.sh.in
-./tools/h5ls/testh5lsvds.sh.in
+./tools/src/h5ls/Makefile.am
+./tools/src/h5ls/h5ls.c
+./tools/test/h5ls/Makefile.am
+./tools/test/h5ls/dynlib_ls.c
+./tools/test/h5ls/h5ls_plugin.sh.in
+./tools/test/h5ls/testh5ls.sh.in
+./tools/test/h5ls/testh5lsvds.sh.in
 
 # h5copy sources
-./tools/h5copy/testh5copy.sh.in
-./tools/h5copy/h5copy.c
-./tools/h5copy/h5copygentest.c
-./tools/h5copy/Makefile.am
+./tools/src/h5copy/Makefile.am
+./tools/src/h5copy/h5copy.c
+./tools/test/h5copy/Makefile.am
+./tools/test/h5copy/h5copygentest.c
+./tools/test/h5copy/testh5copy.sh.in
 
 
 ./tools/lib/Makefile.am
@@ -1393,81 +1454,95 @@
 ./tools/lib/io_timer.c
 ./tools/lib/io_timer.h
 
-./tools/misc/Makefile.am
-./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
-./tools/misc/h5repart.c
-./tools/misc/h5repart_gentest.c
-./tools/misc/repart_test.c
-./tools/misc/testh5mkgrp.sh.in
-./tools/misc/testh5repart.sh.in
-./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
+./tools/src/misc/Makefile.am
+./tools/src/misc/h5cc.in
+./tools/src/misc/h5clear.c
+./tools/src/misc/h5debug.c
+./tools/src/misc/h5mkgrp.c
+./tools/src/misc/h5redeploy.in
+./tools/src/misc/h5repart.c
+./tools/test/misc/Makefile.am
+./tools/test/misc/h5repart_gentest.c
+./tools/test/misc/repart_test.c
+./tools/test/misc/testh5mkgrp.sh.in
+./tools/test/misc/testh5repart.sh.in
+./tools/test/misc/talign.c
+./tools/test/misc/testfiles/h5clear_missing_file.ddl
+./tools/test/misc/testfiles/h5clear_no_mdc_image.ddl
+./tools/test/misc/testfiles/h5clear_open_fail.ddl
+./tools/test/misc/testfiles/h5clear_usage.ddl
+./tools/test/misc/testfiles/h5clear_log_v3.h5
+./tools/test/misc/testfiles/h5clear_mdc_image.h5
+./tools/test/misc/testfiles/h5clear_sec2_v0.h5
+./tools/test/misc/testfiles/h5clear_sec2_v2.h5
+./tools/test/misc/testfiles/h5clear_sec2_v3.h5
+./tools/test/misc/testfiles/latest_h5clear_log_v3.h5
+./tools/test/misc/testfiles/latest_h5clear_sec2_v3.h5
+./tools/test/misc/testfiles/mod_h5clear_mdc_image.h5
+./tools/test/misc/testfiles/h5mkgrp_help.txt
+./tools/test/misc/testfiles/h5mkgrp_version.txt.in
+./tools/test/misc/h5perf_gentest.c
+./tools/test/misc/vds/Makefile.am
+./tools/test/misc/vds/UC_1.h
+./tools/test/misc/vds/UC_1_one_dim_gen.c
+./tools/test/misc/vds/UC_2.h
+./tools/test/misc/vds/UC_2_two_dims_gen.c
+./tools/test/misc/vds/UC_3.h
+./tools/test/misc/vds/UC_3_gaps_gen.c
+./tools/test/misc/vds/UC_4.h
+./tools/test/misc/vds/UC_4_printf_gen.c
+./tools/test/misc/vds/UC_5.h
+./tools/test/misc/vds/UC_5_stride_gen.c
+./tools/test/misc/vds/UC_common.h
+./tools/test/misc/h5clear_gentest.c
+./tools/test/misc/clear_open_chk.c
+./tools/test/misc/testh5clear.sh.in
 
 # h5stat sources
-./tools/h5stat/Makefile.am
-./tools/h5stat/h5stat.c
+./tools/src/h5stat/Makefile.am
+./tools/src/h5stat/h5stat.c
 
 # h5stat test files
-./tools/h5stat/h5stat_gentest.c
-./tools/h5stat/testh5stat.sh.in
-./tools/h5stat/testfiles/h5stat_dims1.ddl
-./tools/h5stat/testfiles/h5stat_dims2.ddl
-./tools/h5stat/testfiles/h5stat_err1_dims.ddl
-./tools/h5stat/testfiles/h5stat_err1_links.ddl
-./tools/h5stat/testfiles/h5stat_err1_numattrs.ddl
-./tools/h5stat/testfiles/h5stat_err2_numattrs.ddl
-./tools/h5stat/testfiles/h5stat_filters.ddl
-./tools/h5stat/testfiles/h5stat_filters-d.ddl
-./tools/h5stat/testfiles/h5stat_filters-dT.ddl
-./tools/h5stat/testfiles/h5stat_filters-F.ddl
-./tools/h5stat/testfiles/h5stat_filters-file.ddl
-./tools/h5stat/testfiles/h5stat_filters-g.ddl
-./tools/h5stat/testfiles/h5stat_filters-UD.ddl
-./tools/h5stat/testfiles/h5stat_filters-UT.ddl
-./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
-./tools/h5stat/testfiles/h5stat_links4.ddl
-./tools/h5stat/testfiles/h5stat_links5.ddl
-./tools/h5stat/testfiles/h5stat_newgrat.ddl
-./tools/h5stat/testfiles/h5stat_newgrat-UA.ddl
-./tools/h5stat/testfiles/h5stat_newgrat-UG.ddl
-./tools/h5stat/testfiles/h5stat_newgrat.h5
-./tools/h5stat/testfiles/h5stat_nofile.ddl
-./tools/h5stat/testfiles/h5stat_notexist.ddl
-./tools/h5stat/testfiles/h5stat_numattrs1.ddl
-./tools/h5stat/testfiles/h5stat_numattrs2.ddl
-./tools/h5stat/testfiles/h5stat_numattrs3.ddl
-./tools/h5stat/testfiles/h5stat_numattrs4.ddl
-./tools/h5stat/testfiles/h5stat_threshold.h5
-./tools/h5stat/testfiles/h5stat_tsohm.ddl
-./tools/h5stat/testfiles/h5stat_tsohm.h5
+./tools/test/h5stat/Makefile.am
+./tools/test/h5stat/h5stat_gentest.c
+./tools/test/h5stat/testh5stat.sh.in
+./tools/test/h5stat/testfiles/h5stat_dims1.ddl
+./tools/test/h5stat/testfiles/h5stat_dims2.ddl
+./tools/test/h5stat/testfiles/h5stat_err1_dims.ddl
+./tools/test/h5stat/testfiles/h5stat_err1_links.ddl
+./tools/test/h5stat/testfiles/h5stat_err1_numattrs.ddl
+./tools/test/h5stat/testfiles/h5stat_err2_numattrs.ddl
+./tools/test/h5stat/testfiles/h5stat_filters.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-d.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-dT.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-F.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-file.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-g.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-UD.ddl
+./tools/test/h5stat/testfiles/h5stat_filters-UT.ddl
+./tools/test/h5stat/testfiles/h5stat_filters.h5
+./tools/test/h5stat/testfiles/h5stat_help1.ddl
+./tools/test/h5stat/testfiles/h5stat_help2.ddl
+./tools/test/h5stat/testfiles/h5stat_idx.h5
+./tools/test/h5stat/testfiles/h5stat_idx.ddl
+./tools/test/h5stat/testfiles/h5stat_links1.ddl
+./tools/test/h5stat/testfiles/h5stat_links2.ddl
+./tools/test/h5stat/testfiles/h5stat_links3.ddl
+./tools/test/h5stat/testfiles/h5stat_links4.ddl
+./tools/test/h5stat/testfiles/h5stat_links5.ddl
+./tools/test/h5stat/testfiles/h5stat_newgrat.ddl
+./tools/test/h5stat/testfiles/h5stat_newgrat-UA.ddl
+./tools/test/h5stat/testfiles/h5stat_newgrat-UG.ddl
+./tools/test/h5stat/testfiles/h5stat_newgrat.h5
+./tools/test/h5stat/testfiles/h5stat_nofile.ddl
+./tools/test/h5stat/testfiles/h5stat_notexist.ddl
+./tools/test/h5stat/testfiles/h5stat_numattrs1.ddl
+./tools/test/h5stat/testfiles/h5stat_numattrs2.ddl
+./tools/test/h5stat/testfiles/h5stat_numattrs3.ddl
+./tools/test/h5stat/testfiles/h5stat_numattrs4.ddl
+./tools/test/h5stat/testfiles/h5stat_threshold.h5
+./tools/test/h5stat/testfiles/h5stat_tsohm.ddl
+./tools/test/h5stat/testfiles/h5stat_tsohm.h5
 
 # h5dump test files
 ./tools/testfiles/charsets.h5
@@ -1581,6 +1656,8 @@
 ./tools/testfiles/tcompound.h5
 ./tools/testfiles/tcompound2.h5
 ./tools/testfiles/tcompound_complex.h5
+./tools/testfiles/tcompound_complex2.h5
+./tools/testfiles/tcompound_complex2.ddl
 ./tools/testfiles/tdatareg.h5
 ./tools/testfiles/tdatareg.ddl
 ./tools/testfiles/tdataregR.ddl
@@ -1591,7 +1668,6 @@
 ./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
@@ -1736,6 +1812,9 @@
 ./tools/testfiles/tstring2.ddl
 ./tools/testfiles/tstringe.ddl
 ./tools/testfiles/tszip.ddl
+./tools/testfiles/tudfilter.ddl
+./tools/testfiles/tudfilter.h5
+./tools/testfiles/tudfilter.ls
 ./tools/testfiles/tudlink.h5
 ./tools/testfiles/tudlink.h5.xml
 ./tools/testfiles/tudlink-1.ddl
@@ -1751,6 +1830,8 @@
 ./tools/testfiles/tvldtypes4.h5
 ./tools/testfiles/tvldtypes5.ddl
 ./tools/testfiles/tvldtypes5.h5
+./tools/testfiles/tvlenstr_array.ddl
+./tools/testfiles/tvlenstr_array.h5
 ./tools/testfiles/tvlstr.h5
 ./tools/testfiles/tvlstr.ddl
 ./tools/testfiles/tvms.ddl
@@ -1761,44 +1842,44 @@
 ./tools/testfiles/twithddlfile.exp
 
 # h5dump test error files
-./tools/h5dump/errfiles/filter_fail.err
-./tools/h5dump/errfiles/non_existing.err
-./tools/h5dump/errfiles/tall-1.err
-./tools/h5dump/errfiles/tall-2A.err
-./tools/h5dump/errfiles/tall-2A0.err
-./tools/h5dump/errfiles/tall-2B.err
-./tools/h5dump/errfiles/tarray1_big.err
-./tools/h5dump/errfiles/tattr-3.err
-./tools/h5dump/errfiles/tattrregR.err
-./tools/h5dump/errfiles/tcomp-3.err
-./tools/h5dump/errfiles/tdataregR.err
-./tools/h5dump/errfiles/tdset-2.err
-./tools/h5dump/errfiles/texceedsubblock.err
-./tools/h5dump/errfiles/texceedsubcount.err
-./tools/h5dump/errfiles/texceedsubstart.err
-./tools/h5dump/errfiles/texceedsubstride.err
-./tools/h5dump/errfiles/textlink.err
-./tools/h5dump/errfiles/textlinkfar.err
-./tools/h5dump/errfiles/textlinksrc.err
-./tools/h5dump/errfiles/tgroup-2.err
-./tools/h5dump/errfiles/tnofilename-with-packed-bits.err
-./tools/h5dump/errfiles/torderlinks1.err
-./tools/h5dump/errfiles/torderlinks2.err
-./tools/h5dump/errfiles/tpbitsCharLengthExceeded.err
-./tools/h5dump/errfiles/tpbitsCharOffsetExceeded.err
-./tools/h5dump/errfiles/tpbitsIncomplete.err
-./tools/h5dump/errfiles/tpbitsIntLengthExceeded.err
-./tools/h5dump/errfiles/tpbitsIntOffsetExceeded.err
-./tools/h5dump/errfiles/tpbitsLengthExceeded.err
-./tools/h5dump/errfiles/tpbitsLengthPositive.err
-./tools/h5dump/errfiles/tpbitsLongLengthExceeded.err
-./tools/h5dump/errfiles/tpbitsLongOffsetExceeded.err
-./tools/h5dump/errfiles/tpbitsMaxExceeded.err
-./tools/h5dump/errfiles/tpbitsOffsetExceeded.err
-./tools/h5dump/errfiles/tpbitsOffsetNegative.err
-./tools/h5dump/errfiles/tperror.err
-./tools/h5dump/errfiles/tqmarkfile.err
-./tools/h5dump/errfiles/tslink-D.err
+./tools/test/h5dump/errfiles/filter_fail.err
+./tools/test/h5dump/errfiles/non_existing.err
+./tools/test/h5dump/errfiles/tall-1.err
+./tools/test/h5dump/errfiles/tall-2A.err
+./tools/test/h5dump/errfiles/tall-2A0.err
+./tools/test/h5dump/errfiles/tall-2B.err
+./tools/test/h5dump/errfiles/tarray1_big.err
+./tools/test/h5dump/errfiles/tattr-3.err
+./tools/test/h5dump/errfiles/tattrregR.err
+./tools/test/h5dump/errfiles/tcomp-3.err
+./tools/test/h5dump/errfiles/tdataregR.err
+./tools/test/h5dump/errfiles/tdset-2.err
+./tools/test/h5dump/errfiles/texceedsubblock.err
+./tools/test/h5dump/errfiles/texceedsubcount.err
+./tools/test/h5dump/errfiles/texceedsubstart.err
+./tools/test/h5dump/errfiles/texceedsubstride.err
+./tools/test/h5dump/errfiles/textlink.err
+./tools/test/h5dump/errfiles/textlinkfar.err
+./tools/test/h5dump/errfiles/textlinksrc.err
+./tools/test/h5dump/errfiles/tgroup-2.err
+./tools/test/h5dump/errfiles/tnofilename-with-packed-bits.err
+./tools/test/h5dump/errfiles/torderlinks1.err
+./tools/test/h5dump/errfiles/torderlinks2.err
+./tools/test/h5dump/errfiles/tpbitsCharLengthExceeded.err
+./tools/test/h5dump/errfiles/tpbitsCharOffsetExceeded.err
+./tools/test/h5dump/errfiles/tpbitsIncomplete.err
+./tools/test/h5dump/errfiles/tpbitsIntLengthExceeded.err
+./tools/test/h5dump/errfiles/tpbitsIntOffsetExceeded.err
+./tools/test/h5dump/errfiles/tpbitsLengthExceeded.err
+./tools/test/h5dump/errfiles/tpbitsLengthPositive.err
+./tools/test/h5dump/errfiles/tpbitsLongLengthExceeded.err
+./tools/test/h5dump/errfiles/tpbitsLongOffsetExceeded.err
+./tools/test/h5dump/errfiles/tpbitsMaxExceeded.err
+./tools/test/h5dump/errfiles/tpbitsOffsetExceeded.err
+./tools/test/h5dump/errfiles/tpbitsOffsetNegative.err
+./tools/test/h5dump/errfiles/tperror.err
+./tools/test/h5dump/errfiles/tqmarkfile.err
+./tools/test/h5dump/errfiles/tslink-D.err
 
 # h5dump packed bits validation
 ./tools/testfiles/pbits/tnofilename-with-packed-bits.ddl
@@ -2069,322 +2150,334 @@
 
 
 #test files for h5diff
-./tools/h5diff/testfiles/h5diff_10.txt
-./tools/h5diff/testfiles/h5diff_11.txt
-./tools/h5diff/testfiles/h5diff_12.txt
-./tools/h5diff/testfiles/h5diff_13.txt
-./tools/h5diff/testfiles/h5diff_14.txt
-./tools/h5diff/testfiles/h5diff_15.txt
-./tools/h5diff/testfiles/h5diff_16_1.txt
-./tools/h5diff/testfiles/h5diff_16_2.txt
-./tools/h5diff/testfiles/h5diff_16_3.txt
-./tools/h5diff/testfiles/h5diff_17.txt
-./tools/h5diff/testfiles/h5diff_171.txt
-./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
-./tools/h5diff/testfiles/h5diff_23.txt
-./tools/h5diff/testfiles/h5diff_24.txt
-./tools/h5diff/testfiles/h5diff_25.txt
-./tools/h5diff/testfiles/h5diff_26.txt
-./tools/h5diff/testfiles/h5diff_27.txt
-./tools/h5diff/testfiles/h5diff_28.txt
-./tools/h5diff/testfiles/h5diff_30.txt
-./tools/h5diff/testfiles/h5diff_50.txt
-./tools/h5diff/testfiles/h5diff_51.txt
-./tools/h5diff/testfiles/h5diff_52.txt
-./tools/h5diff/testfiles/h5diff_53.txt
-./tools/h5diff/testfiles/h5diff_54.txt
-./tools/h5diff/testfiles/h5diff_55.txt
-./tools/h5diff/testfiles/h5diff_56.txt
-./tools/h5diff/testfiles/h5diff_57.txt
-./tools/h5diff/testfiles/h5diff_58.txt
-./tools/h5diff/testfiles/h5diff_59.txt
-./tools/h5diff/testfiles/h5diff_600.txt
-./tools/h5diff/testfiles/h5diff_601.txt
-./tools/h5diff/testfiles/h5diff_603.txt
-./tools/h5diff/testfiles/h5diff_604.txt
-./tools/h5diff/testfiles/h5diff_605.txt
-./tools/h5diff/testfiles/h5diff_606.txt
-./tools/h5diff/testfiles/h5diff_607.txt
-./tools/h5diff/testfiles/h5diff_608.txt
-./tools/h5diff/testfiles/h5diff_609.txt
-./tools/h5diff/testfiles/h5diff_610.txt
-./tools/h5diff/testfiles/h5diff_612.txt
-./tools/h5diff/testfiles/h5diff_613.txt
-./tools/h5diff/testfiles/h5diff_614.txt
-./tools/h5diff/testfiles/h5diff_615.txt
-./tools/h5diff/testfiles/h5diff_616.txt
-./tools/h5diff/testfiles/h5diff_617.txt
-./tools/h5diff/testfiles/h5diff_618.txt
-./tools/h5diff/testfiles/h5diff_619.txt
-./tools/h5diff/testfiles/h5diff_621.txt
-./tools/h5diff/testfiles/h5diff_622.txt
-./tools/h5diff/testfiles/h5diff_623.txt
-./tools/h5diff/testfiles/h5diff_624.txt
-./tools/h5diff/testfiles/h5diff_625.txt
-./tools/h5diff/testfiles/h5diff_626.txt
-./tools/h5diff/testfiles/h5diff_627.txt
-./tools/h5diff/testfiles/h5diff_628.txt
-./tools/h5diff/testfiles/h5diff_629.txt
-./tools/h5diff/testfiles/h5diff_630.txt
-./tools/h5diff/testfiles/h5diff_631.txt
-./tools/h5diff/testfiles/h5diff_640.txt
-./tools/h5diff/testfiles/h5diff_641.txt
-./tools/h5diff/testfiles/h5diff_642.txt
-./tools/h5diff/testfiles/h5diff_643.txt
-./tools/h5diff/testfiles/h5diff_644.txt
-./tools/h5diff/testfiles/h5diff_645.txt
-./tools/h5diff/testfiles/h5diff_646.txt
-./tools/h5diff/testfiles/h5diff_70.txt
-./tools/h5diff/testfiles/h5diff_700.txt
-./tools/h5diff/testfiles/h5diff_701.txt
-./tools/h5diff/testfiles/h5diff_702.txt
-./tools/h5diff/testfiles/h5diff_703.txt
-./tools/h5diff/testfiles/h5diff_704.txt
-./tools/h5diff/testfiles/h5diff_705.txt
-./tools/h5diff/testfiles/h5diff_706.txt
-./tools/h5diff/testfiles/h5diff_707.txt
-./tools/h5diff/testfiles/h5diff_708.txt
-./tools/h5diff/testfiles/h5diff_709.txt
-./tools/h5diff/testfiles/h5diff_710.txt
-./tools/h5diff/testfiles/h5diff_80.txt
-./tools/h5diff/testfiles/h5diff_90.txt
-./tools/h5diff/testfiles/h5diff_100.txt
-./tools/h5diff/testfiles/h5diff_101.txt
-./tools/h5diff/testfiles/h5diff_102.txt
-./tools/h5diff/testfiles/h5diff_103.txt
-./tools/h5diff/testfiles/h5diff_104.txt
+./tools/test/h5diff/testfiles/h5diff_10.txt
+./tools/test/h5diff/testfiles/h5diff_11.txt
+./tools/test/h5diff/testfiles/h5diff_12.txt
+./tools/test/h5diff/testfiles/h5diff_13.txt
+./tools/test/h5diff/testfiles/h5diff_14.txt
+./tools/test/h5diff/testfiles/h5diff_15.txt
+./tools/test/h5diff/testfiles/h5diff_16_1.txt
+./tools/test/h5diff/testfiles/h5diff_16_2.txt
+./tools/test/h5diff/testfiles/h5diff_16_3.txt
+./tools/test/h5diff/testfiles/h5diff_17.txt
+./tools/test/h5diff/testfiles/h5diff_171.txt
+./tools/test/h5diff/testfiles/h5diff_172.txt
+./tools/test/h5diff/testfiles/h5diff_18.txt
+./tools/test/h5diff/testfiles/h5diff_18_1.txt
+./tools/test/h5diff/testfiles/h5diff_19.txt
+./tools/test/h5diff/testfiles/h5diff_20.txt
+./tools/test/h5diff/testfiles/h5diff_21.txt
+./tools/test/h5diff/testfiles/h5diff_22.txt
+./tools/test/h5diff/testfiles/h5diff_23.txt
+./tools/test/h5diff/testfiles/h5diff_24.txt
+./tools/test/h5diff/testfiles/h5diff_25.txt
+./tools/test/h5diff/testfiles/h5diff_26.txt
+./tools/test/h5diff/testfiles/h5diff_27.txt
+./tools/test/h5diff/testfiles/h5diff_28.txt
+./tools/test/h5diff/testfiles/h5diff_30.txt
+./tools/test/h5diff/testfiles/h5diff_50.txt
+./tools/test/h5diff/testfiles/h5diff_51.txt
+./tools/test/h5diff/testfiles/h5diff_52.txt
+./tools/test/h5diff/testfiles/h5diff_53.txt
+./tools/test/h5diff/testfiles/h5diff_54.txt
+./tools/test/h5diff/testfiles/h5diff_55.txt
+./tools/test/h5diff/testfiles/h5diff_56.txt
+./tools/test/h5diff/testfiles/h5diff_57.txt
+./tools/test/h5diff/testfiles/h5diff_58.txt
+./tools/test/h5diff/testfiles/h5diff_59.txt
+./tools/test/h5diff/testfiles/h5diff_60.txt
+./tools/test/h5diff/testfiles/h5diff_61.txt
+./tools/test/h5diff/testfiles/h5diff_62.txt
+./tools/test/h5diff/testfiles/h5diff_63.txt
+./tools/test/h5diff/testfiles/h5diff_600.txt
+./tools/test/h5diff/testfiles/h5diff_601.txt
+./tools/test/h5diff/testfiles/h5diff_603.txt
+./tools/test/h5diff/testfiles/h5diff_604.txt
+./tools/test/h5diff/testfiles/h5diff_605.txt
+./tools/test/h5diff/testfiles/h5diff_606.txt
+./tools/test/h5diff/testfiles/h5diff_607.txt
+./tools/test/h5diff/testfiles/h5diff_608.txt
+./tools/test/h5diff/testfiles/h5diff_609.txt
+./tools/test/h5diff/testfiles/h5diff_610.txt
+./tools/test/h5diff/testfiles/h5diff_612.txt
+./tools/test/h5diff/testfiles/h5diff_613.txt
+./tools/test/h5diff/testfiles/h5diff_614.txt
+./tools/test/h5diff/testfiles/h5diff_615.txt
+./tools/test/h5diff/testfiles/h5diff_616.txt
+./tools/test/h5diff/testfiles/h5diff_617.txt
+./tools/test/h5diff/testfiles/h5diff_618.txt
+./tools/test/h5diff/testfiles/h5diff_619.txt
+./tools/test/h5diff/testfiles/h5diff_621.txt
+./tools/test/h5diff/testfiles/h5diff_622.txt
+./tools/test/h5diff/testfiles/h5diff_623.txt
+./tools/test/h5diff/testfiles/h5diff_624.txt
+./tools/test/h5diff/testfiles/h5diff_625.txt
+./tools/test/h5diff/testfiles/h5diff_626.txt
+./tools/test/h5diff/testfiles/h5diff_627.txt
+./tools/test/h5diff/testfiles/h5diff_628.txt
+./tools/test/h5diff/testfiles/h5diff_629.txt
+./tools/test/h5diff/testfiles/h5diff_630.txt
+./tools/test/h5diff/testfiles/h5diff_631.txt
+./tools/test/h5diff/testfiles/h5diff_640.txt
+./tools/test/h5diff/testfiles/h5diff_641.txt
+./tools/test/h5diff/testfiles/h5diff_642.txt
+./tools/test/h5diff/testfiles/h5diff_643.txt
+./tools/test/h5diff/testfiles/h5diff_644.txt
+./tools/test/h5diff/testfiles/h5diff_645.txt
+./tools/test/h5diff/testfiles/h5diff_646.txt
+./tools/test/h5diff/testfiles/h5diff_70.txt
+./tools/test/h5diff/testfiles/h5diff_700.txt
+./tools/test/h5diff/testfiles/h5diff_701.txt
+./tools/test/h5diff/testfiles/h5diff_702.txt
+./tools/test/h5diff/testfiles/h5diff_703.txt
+./tools/test/h5diff/testfiles/h5diff_704.txt
+./tools/test/h5diff/testfiles/h5diff_705.txt
+./tools/test/h5diff/testfiles/h5diff_706.txt
+./tools/test/h5diff/testfiles/h5diff_707.txt
+./tools/test/h5diff/testfiles/h5diff_708.txt
+./tools/test/h5diff/testfiles/h5diff_709.txt
+./tools/test/h5diff/testfiles/h5diff_710.txt
+./tools/test/h5diff/testfiles/h5diff_80.txt
+./tools/test/h5diff/testfiles/h5diff_90.txt
+./tools/test/h5diff/testfiles/h5diff_100.txt
+./tools/test/h5diff/testfiles/h5diff_101.txt
+./tools/test/h5diff/testfiles/h5diff_102.txt
+./tools/test/h5diff/testfiles/h5diff_103.txt
+./tools/test/h5diff/testfiles/h5diff_104.txt
 # w for Windows-specific
-./tools/h5diff/testfiles/h5diff_101w.txt
-./tools/h5diff/testfiles/h5diff_102w.txt
-./tools/h5diff/testfiles/h5diff_103w.txt
-./tools/h5diff/testfiles/h5diff_104w.txt
-./tools/h5diff/testfiles/h5diff_200.txt
-./tools/h5diff/testfiles/h5diff_201.txt
-./tools/h5diff/testfiles/h5diff_202.txt
-./tools/h5diff/testfiles/h5diff_203.txt
-./tools/h5diff/testfiles/h5diff_204.txt
-./tools/h5diff/testfiles/h5diff_205.txt
-./tools/h5diff/testfiles/h5diff_206.txt
-./tools/h5diff/testfiles/h5diff_207.txt
-./tools/h5diff/testfiles/h5diff_208.txt
-./tools/h5diff/testfiles/h5diff_220.txt
-./tools/h5diff/testfiles/h5diff_221.txt
-./tools/h5diff/testfiles/h5diff_222.txt
-./tools/h5diff/testfiles/h5diff_223.txt
-./tools/h5diff/testfiles/h5diff_224.txt
-./tools/h5diff/testfiles/h5diff_300.txt
-./tools/h5diff/testfiles/h5diff_400.txt
-./tools/h5diff/testfiles/h5diff_401.txt
-./tools/h5diff/testfiles/h5diff_402.txt
-./tools/h5diff/testfiles/h5diff_403.txt
-./tools/h5diff/testfiles/h5diff_404.txt
-./tools/h5diff/testfiles/h5diff_405.txt
-./tools/h5diff/testfiles/h5diff_406.txt
-./tools/h5diff/testfiles/h5diff_407.txt
-./tools/h5diff/testfiles/h5diff_408.txt
-./tools/h5diff/testfiles/h5diff_409.txt
-./tools/h5diff/testfiles/h5diff_410.txt
-./tools/h5diff/testfiles/h5diff_411.txt
-./tools/h5diff/testfiles/h5diff_412.txt
-./tools/h5diff/testfiles/h5diff_413.txt
-./tools/h5diff/testfiles/h5diff_414.txt
-./tools/h5diff/testfiles/h5diff_415.txt
-./tools/h5diff/testfiles/h5diff_416.txt
-./tools/h5diff/testfiles/h5diff_417.txt
-./tools/h5diff/testfiles/h5diff_418.txt
-./tools/h5diff/testfiles/h5diff_419.txt
-./tools/h5diff/testfiles/h5diff_420.txt
-./tools/h5diff/testfiles/h5diff_421.txt
-./tools/h5diff/testfiles/h5diff_422.txt
-./tools/h5diff/testfiles/h5diff_423.txt
-./tools/h5diff/testfiles/h5diff_424.txt
-./tools/h5diff/testfiles/h5diff_425.txt
-./tools/h5diff/testfiles/h5diff_450.txt
-./tools/h5diff/testfiles/h5diff_451.txt
-./tools/h5diff/testfiles/h5diff_452.txt
-./tools/h5diff/testfiles/h5diff_453.txt
-./tools/h5diff/testfiles/h5diff_454.txt
-./tools/h5diff/testfiles/h5diff_455.txt
-./tools/h5diff/testfiles/h5diff_456.txt
-./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
-./tools/h5diff/testfiles/h5diff_468.txt
-./tools/h5diff/testfiles/h5diff_469.txt
-./tools/h5diff/testfiles/h5diff_471.txt
-./tools/h5diff/testfiles/h5diff_472.txt
-./tools/h5diff/testfiles/h5diff_473.txt
-./tools/h5diff/testfiles/h5diff_474.txt
-./tools/h5diff/testfiles/h5diff_475.txt
-./tools/h5diff/testfiles/h5diff_480.txt
-./tools/h5diff/testfiles/h5diff_481.txt
-./tools/h5diff/testfiles/h5diff_482.txt
-./tools/h5diff/testfiles/h5diff_483.txt
-./tools/h5diff/testfiles/h5diff_484.txt
-./tools/h5diff/testfiles/h5diff_485.txt
-./tools/h5diff/testfiles/h5diff_486.txt
-./tools/h5diff/testfiles/h5diff_487.txt
-./tools/h5diff/testfiles/h5diff_500.txt
-./tools/h5diff/testfiles/h5diff_501.txt
-./tools/h5diff/testfiles/h5diff_502.txt
-./tools/h5diff/testfiles/h5diff_503.txt
-./tools/h5diff/testfiles/h5diff_504.txt
-./tools/h5diff/testfiles/h5diff_505.txt
-./tools/h5diff/testfiles/h5diff_506.txt
-./tools/h5diff/testfiles/h5diff_507.txt
-./tools/h5diff/testfiles/h5diff_508.txt
-./tools/h5diff/testfiles/h5diff_509.txt
-./tools/h5diff/testfiles/h5diff_510.txt
-./tools/h5diff/testfiles/h5diff_511.txt
-./tools/h5diff/testfiles/h5diff_512.txt
-./tools/h5diff/testfiles/h5diff_513.txt
-./tools/h5diff/testfiles/h5diff_514.txt
-./tools/h5diff/testfiles/h5diff_515.txt
-./tools/h5diff/testfiles/h5diff_516.txt
-./tools/h5diff/testfiles/h5diff_517.txt
-./tools/h5diff/testfiles/h5diff_518.txt
-./tools/h5diff/testfiles/h5diff_530.txt
-./tools/h5diff/testfiles/h5diff_540.txt
-
-./tools/h5diff/testfiles/h5diff_attr1.h5
-./tools/h5diff/testfiles/h5diff_attr2.h5
-./tools/h5diff/testfiles/h5diff_attr_v_level1.h5
-./tools/h5diff/testfiles/h5diff_attr_v_level2.h5
-./tools/h5diff/testfiles/h5diff_basic1.h5
-./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
-./tools/h5diff/testfiles/h5diff_hyper2.h5
-./tools/h5diff/testfiles/h5diff_types.h5
-./tools/h5diff/testfiles/h5diff_links.h5
-./tools/h5diff/testfiles/h5diff_ext2softlink_src.h5
-./tools/h5diff/testfiles/h5diff_ext2softlink_trg.h5
-./tools/h5diff/testfiles/h5diff_extlink_src.h5
-./tools/h5diff/testfiles/h5diff_extlink_trg.h5
-./tools/h5diff/testfiles/h5diff_linked_softlink.h5
-./tools/h5diff/testfiles/h5diff_softlinks.h5
-./tools/h5diff/testfiles/h5diff_danglelinks1.h5
-./tools/h5diff/testfiles/h5diff_danglelinks2.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse1.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse2.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
-./tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
-./tools/h5diff/testfiles/h5diff_exclude1-1.h5
-./tools/h5diff/testfiles/h5diff_exclude1-2.h5
-./tools/h5diff/testfiles/h5diff_exclude2-1.h5
-./tools/h5diff/testfiles/h5diff_exclude2-2.h5
-./tools/h5diff/testfiles/h5diff_exclude3-1.h5
-./tools/h5diff/testfiles/h5diff_exclude3-2.h5
-./tools/h5diff/testfiles/h5diff_comp_vl_strs.h5
-./tools/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5
-./tools/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5
-./tools/h5diff/testfiles/h5diff_enum_invalid_values.h5
-./tools/h5diff/testfiles/compounds_array_vlen1.h5
-./tools/h5diff/testfiles/compounds_array_vlen2.h5
-./tools/h5diff/testfiles/non_comparables1.h5
-./tools/h5diff/testfiles/non_comparables2.h5
-./tools/h5diff/testfiles/tmptest2.he5
-./tools/h5diff/testfiles/tmpSingleSiteBethe.reference.h5
-./tools/h5diff/testfiles/h5diff_tmp1.txt
-./tools/h5diff/testfiles/tmptest.he5
-./tools/h5diff/testfiles/h5diff_tmp2.txt
-./tools/h5diff/testfiles/tmpSingleSiteBethe.output.h5
+./tools/test/h5diff/testfiles/h5diff_101w.txt
+./tools/test/h5diff/testfiles/h5diff_102w.txt
+./tools/test/h5diff/testfiles/h5diff_103w.txt
+./tools/test/h5diff/testfiles/h5diff_104w.txt
+./tools/test/h5diff/testfiles/h5diff_200.txt
+./tools/test/h5diff/testfiles/h5diff_201.txt
+./tools/test/h5diff/testfiles/h5diff_202.txt
+./tools/test/h5diff/testfiles/h5diff_203.txt
+./tools/test/h5diff/testfiles/h5diff_204.txt
+./tools/test/h5diff/testfiles/h5diff_205.txt
+./tools/test/h5diff/testfiles/h5diff_206.txt
+./tools/test/h5diff/testfiles/h5diff_207.txt
+./tools/test/h5diff/testfiles/h5diff_208.txt
+./tools/test/h5diff/testfiles/h5diff_220.txt
+./tools/test/h5diff/testfiles/h5diff_221.txt
+./tools/test/h5diff/testfiles/h5diff_222.txt
+./tools/test/h5diff/testfiles/h5diff_223.txt
+./tools/test/h5diff/testfiles/h5diff_224.txt
+./tools/test/h5diff/testfiles/h5diff_300.txt
+./tools/test/h5diff/testfiles/h5diff_400.txt
+./tools/test/h5diff/testfiles/h5diff_401.txt
+./tools/test/h5diff/testfiles/h5diff_402.txt
+./tools/test/h5diff/testfiles/h5diff_403.txt
+./tools/test/h5diff/testfiles/h5diff_404.txt
+./tools/test/h5diff/testfiles/h5diff_405.txt
+./tools/test/h5diff/testfiles/h5diff_406.txt
+./tools/test/h5diff/testfiles/h5diff_407.txt
+./tools/test/h5diff/testfiles/h5diff_408.txt
+./tools/test/h5diff/testfiles/h5diff_409.txt
+./tools/test/h5diff/testfiles/h5diff_410.txt
+./tools/test/h5diff/testfiles/h5diff_411.txt
+./tools/test/h5diff/testfiles/h5diff_412.txt
+./tools/test/h5diff/testfiles/h5diff_413.txt
+./tools/test/h5diff/testfiles/h5diff_414.txt
+./tools/test/h5diff/testfiles/h5diff_415.txt
+./tools/test/h5diff/testfiles/h5diff_416.txt
+./tools/test/h5diff/testfiles/h5diff_417.txt
+./tools/test/h5diff/testfiles/h5diff_418.txt
+./tools/test/h5diff/testfiles/h5diff_419.txt
+./tools/test/h5diff/testfiles/h5diff_420.txt
+./tools/test/h5diff/testfiles/h5diff_421.txt
+./tools/test/h5diff/testfiles/h5diff_422.txt
+./tools/test/h5diff/testfiles/h5diff_423.txt
+./tools/test/h5diff/testfiles/h5diff_424.txt
+./tools/test/h5diff/testfiles/h5diff_425.txt
+./tools/test/h5diff/testfiles/h5diff_450.txt
+./tools/test/h5diff/testfiles/h5diff_451.txt
+./tools/test/h5diff/testfiles/h5diff_452.txt
+./tools/test/h5diff/testfiles/h5diff_453.txt
+./tools/test/h5diff/testfiles/h5diff_454.txt
+./tools/test/h5diff/testfiles/h5diff_455.txt
+./tools/test/h5diff/testfiles/h5diff_456.txt
+./tools/test/h5diff/testfiles/h5diff_457.txt
+./tools/test/h5diff/testfiles/h5diff_458.txt
+./tools/test/h5diff/testfiles/h5diff_459.txt
+./tools/test/h5diff/testfiles/h5diff_465.txt
+./tools/test/h5diff/testfiles/h5diff_466.txt
+./tools/test/h5diff/testfiles/h5diff_467.txt
+./tools/test/h5diff/testfiles/h5diff_468.txt
+./tools/test/h5diff/testfiles/h5diff_469.txt
+./tools/test/h5diff/testfiles/h5diff_471.txt
+./tools/test/h5diff/testfiles/h5diff_472.txt
+./tools/test/h5diff/testfiles/h5diff_473.txt
+./tools/test/h5diff/testfiles/h5diff_474.txt
+./tools/test/h5diff/testfiles/h5diff_475.txt
+./tools/test/h5diff/testfiles/h5diff_480.txt
+./tools/test/h5diff/testfiles/h5diff_481.txt
+./tools/test/h5diff/testfiles/h5diff_482.txt
+./tools/test/h5diff/testfiles/h5diff_483.txt
+./tools/test/h5diff/testfiles/h5diff_484.txt
+./tools/test/h5diff/testfiles/h5diff_485.txt
+./tools/test/h5diff/testfiles/h5diff_486.txt
+./tools/test/h5diff/testfiles/h5diff_487.txt
+./tools/test/h5diff/testfiles/h5diff_500.txt
+./tools/test/h5diff/testfiles/h5diff_501.txt
+./tools/test/h5diff/testfiles/h5diff_502.txt
+./tools/test/h5diff/testfiles/h5diff_503.txt
+./tools/test/h5diff/testfiles/h5diff_504.txt
+./tools/test/h5diff/testfiles/h5diff_505.txt
+./tools/test/h5diff/testfiles/h5diff_506.txt
+./tools/test/h5diff/testfiles/h5diff_507.txt
+./tools/test/h5diff/testfiles/h5diff_508.txt
+./tools/test/h5diff/testfiles/h5diff_509.txt
+./tools/test/h5diff/testfiles/h5diff_510.txt
+./tools/test/h5diff/testfiles/h5diff_511.txt
+./tools/test/h5diff/testfiles/h5diff_512.txt
+./tools/test/h5diff/testfiles/h5diff_513.txt
+./tools/test/h5diff/testfiles/h5diff_514.txt
+./tools/test/h5diff/testfiles/h5diff_515.txt
+./tools/test/h5diff/testfiles/h5diff_516.txt
+./tools/test/h5diff/testfiles/h5diff_517.txt
+./tools/test/h5diff/testfiles/h5diff_518.txt
+./tools/test/h5diff/testfiles/h5diff_530.txt
+./tools/test/h5diff/testfiles/h5diff_540.txt
+
+./tools/test/h5diff/testfiles/h5diff_attr1.h5
+./tools/test/h5diff/testfiles/h5diff_attr2.h5
+./tools/test/h5diff/testfiles/h5diff_attr_v_level1.h5
+./tools/test/h5diff/testfiles/h5diff_attr_v_level2.h5
+./tools/test/h5diff/testfiles/h5diff_basic1.h5
+./tools/test/h5diff/testfiles/h5diff_basic2.h5
+./tools/test/h5diff/testfiles/h5diff_dset1.h5
+./tools/test/h5diff/testfiles/h5diff_dset2.h5
+./tools/test/h5diff/testfiles/h5diff_dtypes.h5
+./tools/test/h5diff/testfiles/h5diff_empty.h5
+./tools/test/h5diff/testfiles/h5diff_hyper1.h5
+./tools/test/h5diff/testfiles/h5diff_hyper2.h5
+./tools/test/h5diff/testfiles/h5diff_types.h5
+./tools/test/h5diff/testfiles/h5diff_links.h5
+./tools/test/h5diff/testfiles/h5diff_ext2softlink_src.h5
+./tools/test/h5diff/testfiles/h5diff_ext2softlink_trg.h5
+./tools/test/h5diff/testfiles/h5diff_extlink_src.h5
+./tools/test/h5diff/testfiles/h5diff_extlink_trg.h5
+./tools/test/h5diff/testfiles/h5diff_linked_softlink.h5
+./tools/test/h5diff/testfiles/h5diff_softlinks.h5
+./tools/test/h5diff/testfiles/h5diff_danglelinks1.h5
+./tools/test/h5diff/testfiles/h5diff_danglelinks2.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse1.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse2.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
+./tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
+./tools/test/h5diff/testfiles/h5diff_exclude1-1.h5
+./tools/test/h5diff/testfiles/h5diff_exclude1-2.h5
+./tools/test/h5diff/testfiles/h5diff_exclude2-1.h5
+./tools/test/h5diff/testfiles/h5diff_exclude2-2.h5
+./tools/test/h5diff/testfiles/h5diff_exclude3-1.h5
+./tools/test/h5diff/testfiles/h5diff_exclude3-2.h5
+./tools/test/h5diff/testfiles/h5diff_comp_vl_strs.h5
+./tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5
+./tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5
+./tools/test/h5diff/testfiles/h5diff_enum_invalid_values.h5
+./tools/test/h5diff/testfiles/compounds_array_vlen1.h5
+./tools/test/h5diff/testfiles/compounds_array_vlen2.h5
+./tools/test/h5diff/testfiles/non_comparables1.h5
+./tools/test/h5diff/testfiles/non_comparables2.h5
+./tools/test/h5diff/testfiles/tmptest2.he5
+./tools/test/h5diff/testfiles/tmpSingleSiteBethe.reference.h5
+./tools/test/h5diff/testfiles/h5diff_tmp1.txt
+./tools/test/h5diff/testfiles/tmptest.he5
+./tools/test/h5diff/testfiles/h5diff_tmp2.txt
+./tools/test/h5diff/testfiles/tmpSingleSiteBethe.output.h5
+./tools/test/h5diff/testfiles/tudfilter.h5
+./tools/test/h5diff/testfiles/tudfilter2.h5
+./tools/test/h5diff/testfiles/h5diff_ud.txt
+./tools/test/h5diff/testfiles/h5diff_udfail.txt
+./tools/test/h5diff/testfiles/diff_strings1.h5
+./tools/test/h5diff/testfiles/diff_strings2.h5
 #vds
-./tools/h5diff/testfiles/h5diff_v1.txt
-./tools/h5diff/testfiles/h5diff_v2.txt
-./tools/h5diff/testfiles/h5diff_v3.txt
+./tools/test/h5diff/testfiles/h5diff_v1.txt
+./tools/test/h5diff/testfiles/h5diff_v2.txt
+./tools/test/h5diff/testfiles/h5diff_v3.txt
 
 #test files for h5repack
-./tools/h5repack/testfiles/README
-./tools/h5repack/testfiles/h5repack_attr.h5
-./tools/h5repack/testfiles/h5repack_attr_refs.h5
-./tools/h5repack/testfiles/h5repack_deflate.h5
-./tools/h5repack/testfiles/h5repack_early.h5
-./tools/h5repack/testfiles/h5repack_ext.bin
-./tools/h5repack/testfiles/h5repack_ext.h5
-./tools/h5repack/testfiles/h5repack_fill.h5
-./tools/h5repack/testfiles/h5repack_filters.h5
-./tools/h5repack/testfiles/h5repack_fletcher.h5
-./tools/h5repack/testfiles/h5repack_hlink.h5
-./tools/h5repack/testfiles/h5repack.info
-./tools/h5repack/testfiles/h5repack_layout.h5
-./tools/h5repack/testfiles/h5repack_layouto.h5
-./tools/h5repack/testfiles/h5repack_layout2.h5
-./tools/h5repack/testfiles/h5repack_layout3.h5
-./tools/h5repack/testfiles/h5repack_layout.UD.h5
-./tools/h5repack/testfiles/h5repack_named_dtypes.h5
-./tools/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5
-./tools/h5repack/testfiles/h5repack_nested_8bit_enum.h5
-./tools/h5repack/testfiles/h5repack_nbit.h5
-./tools/h5repack/testfiles/h5repack_objs.h5
-./tools/h5repack/testfiles/h5repack_refs.h5
-./tools/h5repack/testfiles/h5repack_shuffle.h5
-./tools/h5repack/testfiles/h5repack_soffset.h5
-./tools/h5repack/testfiles/h5repack_szip.h5
-./tools/h5repack/testfiles/ublock.bin
-./tools/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
-./tools/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst
-./tools/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst
-./tools/h5repack/testfiles/h5repack-help.txt
-./tools/h5repack/testfiles/h5repack_filters.h5.tst
-./tools/h5repack/testfiles/h5repack_layout.h5.ddl
-./tools/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
-./tools/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
-./tools/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
-./tools/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
-./tools/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
-./tools/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
-./tools/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl
+./tools/test/h5repack/testfiles/README
+./tools/test/h5repack/testfiles/h5repack_attr.h5
+./tools/test/h5repack/testfiles/h5repack_attr_refs.h5
+./tools/test/h5repack/testfiles/h5repack_deflate.h5
+./tools/test/h5repack/testfiles/h5repack_early.h5
+./tools/test/h5repack/testfiles/h5repack_ext.bin
+./tools/test/h5repack/testfiles/h5repack_ext.h5
+./tools/test/h5repack/testfiles/h5repack_fill.h5
+./tools/test/h5repack/testfiles/h5repack_filters.h5
+./tools/test/h5repack/testfiles/h5repack_fletcher.h5
+./tools/test/h5repack/testfiles/h5repack_hlink.h5
+./tools/test/h5repack/testfiles/h5repack.info
+./tools/test/h5repack/testfiles/h5repack_layout.h5
+./tools/test/h5repack/testfiles/h5repack_layouto.h5
+./tools/test/h5repack/testfiles/h5repack_layout2.h5
+./tools/test/h5repack/testfiles/h5repack_layout3.h5
+./tools/test/h5repack/testfiles/h5repack_layout.UD.h5
+./tools/test/h5repack/testfiles/h5repack_named_dtypes.h5
+./tools/test/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5
+./tools/test/h5repack/testfiles/h5repack_nested_8bit_enum.h5
+./tools/test/h5repack/testfiles/h5repack_nbit.h5
+./tools/test/h5repack/testfiles/h5repack_objs.h5
+./tools/test/h5repack/testfiles/h5repack_refs.h5
+./tools/test/h5repack/testfiles/h5repack_shuffle.h5
+./tools/test/h5repack/testfiles/h5repack_soffset.h5
+./tools/test/h5repack/testfiles/h5repack_szip.h5
+./tools/test/h5repack/testfiles/ublock.bin
+./tools/test/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
+./tools/test/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst
+./tools/test/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst
+./tools/test/h5repack/testfiles/plugin_version_test.h5repack_layout.h5.tst
+./tools/test/h5repack/testfiles/h5repack-help.txt
+./tools/test/h5repack/testfiles/h5repack_filters.h5-gzip_verbose_filters.tst
+./tools/test/h5repack/testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst
+./tools/test/h5repack/testfiles/h5repack_layout.h5.ddl
+./tools/test/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
+./tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
+./tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_version_test.ddl
+./tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_zero.tst
+./tools/test/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
+./tools/test/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
+./tools/test/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
+./tools/test/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
+./tools/test/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl
 
 # jam utility and tests
-./tools/h5jam/h5jam.c
-./tools/h5jam/h5unjam.c
-./tools/h5jam/Makefile.am
-./tools/h5jam/h5jamgentest.c
-./tools/h5jam/testh5jam.sh.in
-./tools/h5jam/tellub.c
-./tools/h5jam/getub.c
+./tools/src/h5jam/Makefile.am
+./tools/src/h5jam/h5jam.c
+./tools/src/h5jam/h5unjam.c
+./tools/test/h5jam/Makefile.am
+./tools/test/h5jam/h5jamgentest.c
+./tools/test/h5jam/testh5jam.sh.in
+./tools/test/h5jam/tellub.c
+./tools/test/h5jam/getub.c
 
 # test files for jam
-./tools/h5jam/testfiles/h5jam-help.txt
-./tools/h5jam/testfiles/h5unjam-help.txt
-./tools/h5jam/testfiles/tall.h5
-./tools/h5jam/testfiles/twithub.h5
-./tools/h5jam/testfiles/twithub513.h5
-./tools/h5jam/testfiles/u10.txt
-./tools/h5jam/testfiles/u511.txt
-./tools/h5jam/testfiles/u512.txt
-./tools/h5jam/testfiles/u513.txt
-./tools/h5jam/testfiles/h5jam-ub-nohdf5.txt
+./tools/test/h5jam/testfiles/h5jam-help.txt
+./tools/test/h5jam/testfiles/h5unjam-help.txt
+./tools/test/h5jam/testfiles/tall.h5
+./tools/test/h5jam/testfiles/twithub.h5
+./tools/test/h5jam/testfiles/twithub513.h5
+./tools/test/h5jam/testfiles/u10.txt
+./tools/test/h5jam/testfiles/u511.txt
+./tools/test/h5jam/testfiles/u512.txt
+./tools/test/h5jam/testfiles/u513.txt
+./tools/test/h5jam/testfiles/h5jam-ub-nohdf5.txt
 
 # test files for h5copy
-./tools/h5copy/testfiles/h5copytst.h5
-./tools/h5copy/testfiles/h5copytst.out.ls
-./tools/h5copy/testfiles/h5copy_ref.h5
-./tools/h5copy/testfiles/h5copy_ref.out.ls
-./tools/h5copy/testfiles/h5copy_extlinks_src.h5
-./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
+./tools/test/h5copy/testfiles/h5copytst.h5
+./tools/test/h5copy/testfiles/h5copytst.out.ls
+./tools/test/h5copy/testfiles/h5copy_ref.h5
+./tools/test/h5copy/testfiles/h5copy_ref.out.ls
+./tools/test/h5copy/testfiles/h5copy_extlinks_src.h5
+./tools/test/h5copy/testfiles/h5copy_extlinks_trg.h5
+./tools/test/h5copy/testfiles/h5copy_extlinks_src.out.ls
+./tools/test/h5copy/testfiles/h5copy_misc1.out
+./tools/test/h5copy/testfiles/h5copytst_new.h5
+./tools/test/h5copy/testfiles/h5copytst_new.out.ls
 
 # test files for h5mkgrp
 ./tools/testfiles/h5mkgrp_nested_p.ls
@@ -2400,27 +2493,27 @@
 ./tools/testfiles/h5mkgrp_single_p.ls
 ./tools/testfiles/h5mkgrp_single_l.ls
 
-./tools/perform/COPYING
-./tools/perform/Makefile.am
-./tools/perform/build_h5perf_alone.sh
-./tools/perform/build_h5perf_serial_alone.sh
-./tools/perform/chunk.c
-./tools/perform/gen_report.pl
-./tools/perform/iopipe.c
-./tools/perform/overhead.c
-./tools/perform/perf.c
-./tools/perform/perf_meta.c
-./tools/perform/pio_engine.c
-./tools/perform/pio_perf.c
-./tools/perform/pio_perf.h
-./tools/perform/pio_standalone.c
-./tools/perform/pio_standalone.h
-./tools/perform/sio_engine.c
-./tools/perform/sio_perf.c
-./tools/perform/sio_perf.h
-./tools/perform/sio_standalone.c
-./tools/perform/sio_standalone.h
-./tools/perform/zip_perf.c
+./tools/test/perform/COPYING
+./tools/test/perform/Makefile.am
+./tools/test/perform/build_h5perf_alone.sh
+./tools/test/perform/build_h5perf_serial_alone.sh
+./tools/test/perform/chunk.c
+./tools/test/perform/gen_report.pl
+./tools/test/perform/iopipe.c
+./tools/test/perform/overhead.c
+./tools/test/perform/perf.c
+./tools/test/perform/perf_meta.c
+./tools/test/perform/pio_engine.c
+./tools/test/perform/pio_perf.c
+./tools/test/perform/pio_perf.h
+./tools/test/perform/pio_standalone.c
+./tools/test/perform/pio_standalone.h
+./tools/test/perform/sio_engine.c
+./tools/test/perform/sio_perf.c
+./tools/test/perform/sio_perf.h
+./tools/test/perform/sio_standalone.c
+./tools/test/perform/sio_standalone.h
+./tools/test/perform/zip_perf.c
 
 # high level libraries
 ./hl/COPYING
@@ -2480,37 +2573,37 @@
 ./hl/src/H5TBpublic.h
 ./hl/src/hdf5_hl.h
 ./hl/test/COPYING
+./hl/test/H5srcdir_str.h.in
+./hl/test/Makefile.am
 ./hl/test/dectris_hl_perf.c
 ./hl/test/dsdata.txt
 ./hl/test/dslat.txt
 ./hl/test/dslon.txt
-./hl/test/dtype_file_readable.txt
 ./hl/test/dtype_file.txt
+./hl/test/dtype_file_readable.txt
 ./hl/test/earth.pal
 ./hl/test/gen_test_ds.c
 ./hl/test/gen_test_ld.c
 ./hl/test/h5hltest.h
-./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/test_ds_be.h5
 ./hl/test/test_ds.c
+./hl/test/test_ds_be.h5
+./hl/test/test_ds_le.h5
 ./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_be.h5
 ./hl/test/test_packet_vlen.c
 ./hl/test/test_table.c
+./hl/test/test_table_be.h5
 ./hl/test/test_table_cray.h5
 ./hl/test/test_table_le.h5
 ./hl/test/usa.wri
@@ -2579,7 +2672,6 @@
 ./hl/tools/testfiles/w-ext-two-width.ddl
 ./hl/tools/testfiles/w-help1.ddl
 
-#
 # hl fortran
 ./hl/fortran/COPYING
 ./hl/fortran/Makefile.am
@@ -2621,14 +2713,11 @@
 # java
 ./java/COPYING
 ./java/Makefile.am
-./java/Makefile.in
 ./java/CMakeLists.txt
 
 ./java/src/Makefile.am
-./java/src/Makefile.in
 ./java/src/CMakeLists.txt
 ./java/src/jni/Makefile.am
-./java/src/jni/Makefile.in
 ./java/src/jni/CMakeLists.txt
 ./java/src/jni/exceptionImp.c
 ./java/src/jni/exceptionImp.h
@@ -2744,11 +2833,9 @@
 ./java/src/hdf/hdf5lib/HDFNativeData.java
 
 ./java/examples/Makefile.am
-./java/examples/Makefile.in
 ./java/examples/CMakeLists.txt
 
 ./java/examples/intro/Makefile.am
-./java/examples/intro/Makefile.in
 ./java/examples/intro/CMakeLists.txt
 ./java/examples/intro/runExample.sh.in
 ./java/examples/intro/H5_CreateAttribute.java
@@ -2760,7 +2847,6 @@
 ./java/examples/intro/H5_ReadWrite.java
 
 ./java/examples/groups/Makefile.am
-./java/examples/groups/Makefile.in
 ./java/examples/groups/CMakeLists.txt
 ./java/examples/groups/runExample.sh.in
 ./java/examples/groups/H5Ex_G_Create.java
@@ -2775,7 +2861,6 @@
 ./java/examples/groups/h5ex_g_visit.h5
 
 ./java/examples/datasets/Makefile.am
-./java/examples/datasets/Makefile.in
 ./java/examples/datasets/CMakeLists.txt
 ./java/examples/datasets/runExample.sh.in
 ./java/examples/datasets/H5Ex_D_Alloc.java
@@ -2798,7 +2883,6 @@
 ./java/examples/datasets/H5Ex_D_Soint.java
 
 ./java/examples/datatypes/Makefile.am
-./java/examples/datatypes/Makefile.in
 ./java/examples/datatypes/CMakeLists.txt
 ./java/examples/datatypes/runExample.sh.in
 ./java/examples/datatypes/H5Ex_T_Array.java
@@ -2872,7 +2956,6 @@
 ./java/examples/testfiles/examples.datatypes.H5Ex_T_VLString.txt
 
 ./java/test/Makefile.am
-./java/test/Makefile.in
 ./java/test/CMakeLists.txt
 ./java/test/junit.sh.in
 ./java/test/JUnit-interface.txt
@@ -2929,7 +3012,6 @@
 ./config/cmake/ConfigureChecks.cmake
 ./config/cmake/CPack.Info.plist.in
 ./config/cmake/CTestCustom.cmake
-./config/cmake/FindHDF5.cmake.in
 ./config/cmake/FindHDFJAVA.cmake.in
 ./config/cmake/FindJNI.cmake
 ./config/cmake/H5cxx_config.h.in
@@ -2969,7 +3051,6 @@
 ./config/cmake_ext_mod/HDFUseFortran.cmake
 ./config/cmake_ext_mod/NSIS.InstallOptions.ini.in
 ./config/cmake_ext_mod/NSIS.template.in
-./config/cmake_ext_mod/prunTest.cmake
 ./config/cmake_ext_mod/runTest.cmake
 ./config/cmake_ext_mod/version.plist.in
 
@@ -3033,37 +3114,55 @@
 ./testpar/CMakeLists.txt
 ./testpar/CMakeTests.cmake
 ./tools/CMakeLists.txt
-./tools/h5copy/CMakeLists.txt
-./tools/h5copy/CMakeTests.cmake
-./tools/h5diff/CMakeLists.txt
-./tools/h5diff/CMakeTests.cmake
-./tools/h5dump/CMakeLists.txt
-./tools/h5dump/CMakeTests.cmake
-./tools/h5dump/CMakeTestsPBITS.cmake
-./tools/h5dump/CMakeTestsXML.cmake
-./tools/h5dump/CMakeTestsVDS.cmake
-./tools/h5format_convert/CMakeLists.txt
-./tools/h5format_convert/CMakeTests.cmake
-./tools/h5import/CMakeLists.txt
-./tools/h5import/CMakeTests.cmake
-./tools/h5jam/CMakeLists.txt
-./tools/h5jam/CMakeTests.cmake
-./tools/h5ls/CMakeLists.txt
-./tools/h5ls/CMakeTests.cmake
-./tools/h5repack/CMakeLists.txt
-./tools/h5repack/CMakeTests.cmake
-./tools/h5stat/CMakeLists.txt
-./tools/h5stat/CMakeTests.cmake
 ./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
+./tools/src/CMakeLists.txt
+./tools/test/CMakeLists.txt
+./tools/src/h5copy/CMakeLists.txt
+./tools/test/h5copy/CMakeLists.txt
+./tools/test/h5copy/CMakeTests.cmake
+./tools/src/h5diff/CMakeLists.txt
+./tools/test/h5diff/CMakeLists.txt
+./tools/test/h5diff/CMakeTests.cmake
+./tools/src/h5dump/CMakeLists.txt
+./tools/test/h5dump/CMakeLists.txt
+./tools/test/h5dump/CMakeTests.cmake
+./tools/test/h5dump/CMakeTestsPBITS.cmake
+./tools/test/h5dump/CMakeTestsXML.cmake
+./tools/test/h5dump/CMakeTestsVDS.cmake
+./tools/src/h5format_convert/CMakeLists.txt
+./tools/test/h5format_convert/CMakeLists.txt
+./tools/test/h5format_convert/CMakeTests.cmake
+./tools/src/h5import/CMakeLists.txt
+./tools/test/h5import/CMakeLists.txt
+./tools/test/h5import/CMakeTests.cmake
+./tools/src/h5jam/CMakeLists.txt
+./tools/test/h5jam/CMakeLists.txt
+./tools/test/h5jam/CMakeTests.cmake
+./tools/src/h5ls/CMakeLists.txt
+./tools/test/h5ls/CMakeLists.txt
+./tools/test/h5ls/CMakeTests.cmake
+./tools/test/h5ls/CMakeTestsVDS.cmake
+./tools/src/h5repack/CMakeLists.txt
+./tools/test/h5repack/CMakeLists.txt
+./tools/test/h5repack/CMakeTests.cmake
+./tools/src/h5stat/CMakeLists.txt
+./tools/test/h5stat/CMakeLists.txt
+./tools/test/h5stat/CMakeTests.cmake
+./tools/src/misc/CMakeLists.txt
+./tools/test/misc/CMakeLists.txt
+./tools/test/misc/CMakeTestsClear.cmake
+./tools/test/misc/CMakeTestsMkgrp.cmake
+./tools/test/misc/CMakeTestsRepart.cmake
+./tools/test/misc/vds/CMakeLists.txt
+./tools/test/perform/CMakeLists.txt
+./tools/test/perform/CMakeTests.cmake
 
 # CMake-specific User Scripts
+./config/cmake/CTestScript.cmake
+./config/cmake/HDF5_Examples_options.cmake
 ./config/cmake/scripts/CTestScript.cmake
 ./config/cmake/scripts/HDF5config.cmake
+./config/cmake/scripts/HDF5options.cmake
 
 # Files generated by autogen
 ./aclocal.m4
@@ -3101,6 +3200,15 @@
 ./hl/tools/gif2h5/Makefile.in
 ./hl/tools/h5watch/Makefile.in
 ./hl/tools/Makefile.in
+./java/examples/intro/Makefile.in
+./java/examples/datasets/Makefile.in
+./java/examples/datatypes/Makefile.in
+./java/examples/Makefile.in
+./java/examples/groups/Makefile.in
+./java/Makefile.in
+./java/test/Makefile.in
+./java/src/Makefile.in
+./java/src/jni/Makefile.in
 ./m4/libtool.m4
 ./m4/lt~obsolete.m4
 ./m4/ltoptions.m4
@@ -3117,17 +3225,29 @@
 ./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
+./tools/lib/Makefile.in
+./tools/src/Makefile.in
+./tools/src/h5copy/Makefile.in
+./tools/src/h5diff/Makefile.in
+./tools/src/h5dump/Makefile.in
+./tools/src/h5format_convert/Makefile.in
+./tools/src/h5import/Makefile.in
+./tools/src/h5jam/Makefile.in
+./tools/src/h5ls/Makefile.in
+./tools/src/h5repack/Makefile.in
+./tools/src/h5stat/Makefile.in
+./tools/src/misc/Makefile.in
+./tools/test/Makefile.in
+./tools/test/h5copy/Makefile.in
+./tools/test/h5diff/Makefile.in
+./tools/test/h5dump/Makefile.in
+./tools/test/h5format_convert/Makefile.in
+./tools/test/h5import/Makefile.in
+./tools/test/h5jam/Makefile.in
+./tools/test/h5ls/Makefile.in
+./tools/test/h5repack/Makefile.in
+./tools/test/h5stat/Makefile.in
+./tools/test/misc/Makefile.in
+./tools/test/misc/vds/Makefile.in
+./tools/test/perform/Makefile.in
diff --git a/Makefile b/Makefile
index e38af21..9edb476 100644
--- a/Makefile
+++ b/Makefile
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 # This Makefile is a stub (copied from Makefile.dist) which will run
 # configure and then invoke the same target in the new Makefile created
diff --git a/Makefile.am b/Makefile.am
index bbab346..e3e5e3d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/Makefile.dist b/Makefile.dist
index e38af21..9edb476 100644
--- a/Makefile.dist
+++ b/Makefile.dist
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 # This Makefile is a stub (copied from Makefile.dist) which will run
 # configure and then invoke the same target in the new Makefile created
diff --git a/Makefile.in b/Makefile.in
index 9a7cbed..108118f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
 # but does so in the correct order.  You can alternatively invoke make from
@@ -300,6 +298,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -421,6 +420,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
diff --git a/README.txt b/README.txt
index 4216633..b4fda46 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
-HDF5 version 1.10.0-patch1 released on 2016-05-18
+HDF5 version 1.10.1 released on 2017-04-27
 Please refer to the release_docs/INSTALL file for installation instructions.
 ------------------------------------------------------------------------------
 
diff --git a/UserMacros.cmake b/UserMacros.cmake
index 65ea5d4..c578c91 100644
--- a/UserMacros.cmake
+++ b/UserMacros.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 ########################################################
 #  Include file for user options
 ########################################################
@@ -7,16 +18,15 @@
 #-----------------------------------------------------------------------------
 # Option to Build with User Defined Values
 #-----------------------------------------------------------------------------
-MACRO (MACRO_USER_DEFINED_LIBS)
+macro (MACRO_USER_DEFINED_LIBS)
   set (USER_DEFINED_VALUE "FALSE")
-ENDMACRO (MACRO_USER_DEFINED_LIBS)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 option (BUILD_USER_DEFINED_LIBS "Build With User Defined Values" OFF)
 if (BUILD_USER_DEFINED_LIBS)
   MACRO_USER_DEFINED_LIBS ()
-endif (BUILD_USER_DEFINED_LIBS)
+endif ()
 #-----------------------------------------------------------------------------
 #------------------- E X A M P L E   E N D -----------------------------------
 #-----------------------------------------------------------------------------
- 
\ No newline at end of file
diff --git a/acsite.m4 b/acsite.m4
index b144962..9d04d1a 100644
--- a/acsite.m4
+++ b/acsite.m4
@@ -1,17 +1,16 @@
 dnl -------------------------------------------------------------------------
 dnl -------------------------------------------------------------------------
 dnl
+dnl Copyright by The HDF Group.
 dnl Copyright by the Board of Trustees of the University of Illinois.
 dnl All rights reserved.
 dnl
 dnl This file is part of HDF5.  The full HDF5 copyright notice, including
 dnl terms governing use, modification, and redistribution, is contained in
-dnl the files COPYING and Copyright.html.  COPYING can be found at the root
-dnl of the source code distribution tree; Copyright.html can be found at the
-dnl root level of an installed copy of the electronic HDF5 document set and
-dnl is linked from the top-level documents page.  It can also be found at
-dnl http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
-dnl access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu.
+dnl the COPYING file, which can be found at the root of the source code
+dnl dnl distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+dnl dnl If you do not have access to either file, you may request a copy from
+dnl dnl help at hdfgroup.org.
 dnl
 dnl Macros for HDF5 Fortran
 dnl
diff --git a/autogen.sh b/autogen.sh
index f3bd774..58d7e36 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -5,12 +5,10 @@
 #                                                                          
 # This file is part of HDF5. The full HDF5 copyright notice, including     
 # terms governing use, modification, and redistribution, is contained in   
-# the files COPYING and Copyright.html.  COPYING can be found at 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.           
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
diff --git a/bin/COPYING b/bin/COPYING
index 6903daf..6497ace 100755
--- a/bin/COPYING
+++ b/bin/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/bin/buildhdf5 b/bin/buildhdf5
index 3a4b0d3..064000a 100755
--- a/bin/buildhdf5
+++ b/bin/buildhdf5
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Build HDF5 library by doing configure, make, and tests.
 # Usage: See USAGE()
diff --git a/bin/chkmanifest b/bin/chkmanifest
index 701b6c4..95eb8f0 100755
--- a/bin/chkmanifest
+++ b/bin/chkmanifest
@@ -6,16 +6,14 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
-# 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
+# Check that all the files in MANIFEST exist and (if this is a
+# GIT checkout) that all the GIT-managed files appear in the
 # MANIFEST.
 # 
 
@@ -54,8 +52,8 @@ 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
+    echo "   running $AUTOGEN"
+    $AUTOGEN > $AUTOGEN_LOG 2>&1
     if [ $? -ne 0 ]; then
 	echo $AUTOGEN encountered error. Abort.
 	echo output from $AUTOGEN:
@@ -93,23 +91,23 @@ done
 # Get the list of files under version control and check that they are
 # present.
 #
-# First get a list of all the pending files with svn stat and
+# First get a list of all the pending files with git status and
 # check those.
-svn_stat=`svn stat -q`
-for file in $svn_stat; do
+git_stat=`git status -s`
+for file in $git_stat; do
 
-    # Newly added files are not listed by svn ls, which
+    # Newly added files are not listed by git ls-files, which
     # we check later.
 
     # The line listing new files starts with 'A'.
     letter=`echo $file | head -c 1`
     if [ "$letter" = "A" ]; then
-        # Convert the seven Subversion status columns to './' so it matches
+        # Convert the git status columns to './' so it matches
         # the manifest file name.
         #
         # There is a space between the status columns and file name, hence
-        # the '8' instead of '7'.
-        path=`echo $file | sed 's/^.\{8\}/\.\//g'`
+        # the '3'.
+        path=`echo $file | sed 's/^.\{3\}/\.\//g'`
         # Ignore directories
         if [ ! -d $path ]; then
             if (grep ^$path$ $MANIFEST >/dev/null); then
@@ -122,10 +120,10 @@ for file in $svn_stat; do
     fi
 done
 
-# Next check svn ls, which gets a list of all files that are
+# Next check git ls-files, which gets a list of all files that are
 # checked in.
-svn_ls=`svn ls -R`
-for file in $svn_ls; do
+git_ls=`git ls-files`
+for file in $git_ls; do
     path="./${file}"
     # Ignore directories
     if [ ! -d $path ]; then
@@ -142,7 +140,7 @@ done
 if [ "X$fail" = "Xyes" ]; then
     cat 1>&2 <<EOF
 The MANIFEST is out of date. Files marked with a minus sign (-) no
-longer exist; files marked with a plus sign (+) are SVN-managed but do
+longer exist; files marked with a plus sign (+) are GIT-managed but do
 not appear in the MANIFEST.  Please remedy the situation and try again.
 EOF
     exit 1
diff --git a/bin/dependencies b/bin/dependencies
index a82a3ee..82247da 100755
--- a/bin/dependencies
+++ b/bin/dependencies
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 my $depend_file;
 my $new_depend_file;
diff --git a/bin/deploy b/bin/deploy
index ef30d21..73f4b25 100755
--- a/bin/deploy
+++ b/bin/deploy
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Deploy the HDF5 binary.
 #
diff --git a/bin/distdep b/bin/distdep
index 0a22bd1..4643700 100755
--- a/bin/distdep
+++ b/bin/distdep
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Usage: $0 [<].depend
diff --git a/bin/genparser b/bin/genparser
index 71a8ae2..8cf6ec2 100755
--- a/bin/genparser
+++ b/bin/genparser
@@ -5,12 +5,10 @@
 #                                                                          
 # This file is part of HDF5. The full HDF5 copyright notice, including     
 # terms governing use, modification, and redistribution, is contained in   
-# the files COPYING and Copyright.html.  COPYING can be found at 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.           
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
diff --git a/bin/h5vers b/bin/h5vers
index e9df387..de88247 100755
--- a/bin/h5vers
+++ b/bin/h5vers
@@ -12,12 +12,10 @@ use strict;
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Robb Matzke <matzke at llnl.gov>
 # 17 July 1998
@@ -127,7 +125,7 @@ EOF
   exit 1;
 }
 
-# Parse arguments
+
 my ($verbose, $set, $inc, $file, $rc);
 my (@files) = ("H5public.h", "src/H5public.h", "../src/H5public.h");
 while ($_ = shift) {
@@ -160,9 +158,10 @@ die "mutually exclusive options given\n" if $set && $inc;
 
 # Determine file to use as H5public.h, README.txt,
 # release_docs/RELEASE.txt, configure.ac, windows/src/H5pubconf.h
-# and config/lt_vers.am. 
+# config/lt_vers.am and config/cmake/scripts/HDF5config.cmake. 
 # The README.txt, release_docs/RELEASE.txt, configure.ac, 
-# windows/src/H5pubconf.h, and config/lt_vers.am 
+# windows/src/H5pubconf.h, config/lt_vers.am and
+# config/cmake/scripts/HDF5config.cmake
 # files are always in the directory above H5public.h
 unless ($file) {
   for (@files) {
@@ -175,6 +174,10 @@ die "unable to read file: $file\n" unless -r $file;
 my $LT_VERS = $file;
 $LT_VERS =~ s/[^\/]*$/..\/config\/lt_vers.am/;
 die "unable to read file: $LT_VERS\n" unless -r $file;
+# config/cmake/scripts/HDF5config.cmake
+my $HDF5CONFIGCMAKE = $file;
+$HDF5CONFIGCMAKE =~ s/[^\/]*$/..\/config\/cmake\/scripts\/HDF5config.cmake/;
+die "unable to read file: $HDF5CONFIGCMAKE\n" unless -r $file;
 # README.txt
 my $README = $file;
 $README =~ s/[^\/]*$/..\/README.txt/;
@@ -191,6 +194,15 @@ die "unable to read file: $CONFIGURE\n" unless -r $file;
 my $CPP_DOC_CONFIG = $file;
 $CPP_DOC_CONFIG =~ s/[^\/]*$/..\/c++\/src\/cpp_doc_config/;
 die "unable to read file: $CPP_DOC_CONFIG\n"  unless -r $file;
+my $H5_JAVA = $file;
+$H5_JAVA =~ s/[^\/]*$/..\/java\/src\/hdf\/hdf5lib\/H5.java/;
+die "unable to read file: $H5_JAVA\n" unless -r $file;
+my $TESTH5_JAVA = $file;
+$TESTH5_JAVA =~ s/[^\/]*$/..\/java\/test\/TestH5.java/;
+die "unable to read file: $TESTH5_JAVA\n" unless -r $file;
+my $REPACK_LAYOUT_PLUGIN_VERSION = $file;
+$REPACK_LAYOUT_PLUGIN_VERSION =~ s/[^\/]*$/..\/tools\/test\/h5repack\/testfiles\/h5repack_layout.h5-plugin_version_test.ddl/;
+die "unable to read file: $REPACK_LAYOUT_PLUGIN_VERSION\n" unless -r $file;
 
 # Get the current version number.
 open FILE, $file or die "unable to open $file: $!\n";
@@ -239,7 +251,8 @@ if ($set) {
   $RELEASE = "";
   $CONFIGURE = "";
   $CPP_DOC_CONFIG = "";
-  $LT_VERS = "";        
+  $LT_VERS = "";       
+  $HDF5CONFIGCMAKE = "";
   @newver = @curver;
 }
 
@@ -321,20 +334,88 @@ 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 %s\"",
+  my $sub_rel_ver_str = (
+     $newver[3] eq "" 
+     ? sprintf("%s", "") 
+     : sprintf("%s", "-".$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");
-
+                               $sub_rel_ver_str);
   $data =~ s/PROJECT_NUMBER\s*=.*/PROJECT_NUMBER         = $version_string/;
 
   write_file($CPP_DOC_CONFIG, $data);  
 }
 
-# helper function to read the file for updating c++/src/cpp_doc_config file.
+# Update the config/cmake/scripts/HDF5config.cmake file
+if ($HDF5CONFIGCMAKE) {
+  my $data = read_file($HDF5CONFIGCMAKE);
+#  my $sub_rel_ver_str = "";
+  my $sub_rel_ver_str = (
+     $newver[3] eq "" 
+     ? sprintf("\"%s\"", "") 
+     : sprintf("\"%s\"", "-".$newver[3])
+     );
+  my $version_string = sprintf("\"%d.%d.%d\"", @newver[0,1,2]);
+
+  $data =~ s/set \(CTEST_SOURCE_VERSION .*\)/set \(CTEST_SOURCE_VERSION $version_string\)/;
+  $data =~ s/set \(CTEST_SOURCE_VERSEXT .*\)/set \(CTEST_SOURCE_VERSEXT $sub_rel_ver_str\)/;
+
+  write_file($HDF5CONFIGCMAKE, $data);  
+}
+
+# Update the java/src/hdf/hdf5lib/H5.java file
+if ($H5_JAVA) {
+  my $data = read_file($H5_JAVA);
+#  my $sub_rel_ver_str = "";
+  my $sub_rel_ver_str = (
+     $newver[3] eq ""
+     ? sprintf("\"%s\"", "")
+     : sprintf("\"%s\"", "-".$newver[3])
+     );
+  my $version_string1 = sprintf("%d.%d.%d", @newver[0,1,2]);
+  my $version_string2 = sprintf("%d, %d, %d", @newver[0,1,2]);
+
+  $data =~ s/\@version HDF5 .* <BR>/\@version HDF5 $version_string1 <BR>/;
+  $data =~ s/    public final static int LIB_VERSION\[\] = { \d*, \d*, \d* };/    public final static int LIB_VERSION[] = { $version_string2 };/;
+
+  write_file($H5_JAVA, $data);
+}
+
+# Update the java/test/TestH5.java file
+if ($TESTH5_JAVA) {
+  my $data = read_file($TESTH5_JAVA);
+#  my $sub_rel_ver_str = "";
+  my $sub_rel_ver_str = (
+     $newver[3] eq ""
+     ? sprintf("\"%s\"", "")
+     : sprintf("\"%s\"", "-".$newver[3])
+     );
+  my $version_string1 = sprintf("%d, %d, %d", @newver[0,1,2]);
+  my $version_string2 = sprintf("int majnum = %d, minnum = %d, relnum = %d", @newver[0,1,2]);
+
+  $data =~ s/        int libversion\[\] = { .* };/        int libversion\[\] = { $version_string1 };/;
+  $data =~ s/        int majnum = \d*, minnum = \d*, relnum = \d*;/        $version_string2;/;
+
+  write_file($TESTH5_JAVA, $data);
+}
+
+# Update the tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_version_test.ddl file
+if ($REPACK_LAYOUT_PLUGIN_VERSION) {
+  my $data = read_file($REPACK_LAYOUT_PLUGIN_VERSION);
+  my $version_string = sprintf("%d %d %d", @newver[0,1,2]);
+
+  $data =~ s/            PARAMS { 9 \d* \d* \d* }/            PARAMS { 9 $version_string }/g;
+
+  write_file($REPACK_LAYOUT_PLUGIN_VERSION, $data);
+}
+
+# helper function to read the file for updating c++/src/cpp_doc_config,
+# config/cmake/scripts/HDF5Config.cmake, and java files.
 # The version string in that file is not at the top, so the string replacement
 # is not for the first line, and reading/writing the entire file as one string
 # facilitates the substring replacement.
+#Presumably these will also work for resetting the version in HDF5config.cmake.
 sub read_file {
    my ($filename) = @_;
 
@@ -346,7 +427,8 @@ sub read_file {
     return $all;
 }
 
-# helper function to write the file for updating c++/src/cpp_doc_config file.
+# helper function to write the file for updating c++/src/cpp_doc_config, 
+# config/cmake/scripts/HDF5config.cmake and java files.
 sub write_file {
     my ($filename, $content) = @_;
 
@@ -381,12 +463,12 @@ sub gen_configure {
   $conf =~ /^(.*?)\/?configure.ac$/;
 
   if ($1) {
-    $rc = system("cd $1 && ./autogen.sh -p >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+    $rc = system("cd $1 && ./autogen.sh >/dev/null 2>/dev/null && rm -rf autom4te.cache");
   } else {
-    $rc = system("./autogen.sh -p >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+    $rc = system("./autogen.sh >/dev/null 2>/dev/null && rm -rf autom4te.cache");
   }
   if ($rc) {
-    printf("./autogen.sh -p failed with exit code %d. Aborted.\n", $rc);
+    printf("./autogen.sh failed with exit code %d. Aborted.\n", $rc);
     exit 1;
   }
 }
diff --git a/bin/iostats b/bin/iostats
index f57c0d0..f054b9c 100755
--- a/bin/iostats
+++ b/bin/iostats
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Usage: pipe the output of Linux's `strace' program into the stdin of
diff --git a/bin/locate_sw b/bin/locate_sw
index c9a7924..bab7bd2 100755
--- a/bin/locate_sw
+++ b/bin/locate_sw
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Try to locate the software as named in argument.
diff --git a/bin/make_err b/bin/make_err
index 1b39d53..bfe8861 100755
--- a/bin/make_err
+++ b/bin/make_err
@@ -9,12 +9,10 @@ $indent=4;
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Create error headers
@@ -38,12 +36,10 @@ sub print_copyright ($) {
     print $fh " *                                                                           *\n";
     print $fh " * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n";
     print $fh " * terms governing use, modification, and redistribution, is contained in    *\n";
-    print $fh " * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n";
-    print $fh " * of the source code distribution tree; Copyright.html can be found at the  *\n";
-    print $fh " * root level of an installed copy of the electronic HDF5 document set and   *\n";
-    print $fh " * is linked from the top-level documents page.  It can also be found at     *\n";
-    print $fh " * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n";
-    print $fh " * access to either file, you may request a copy from help\@hdfgroup.org.     *\n";
+    print $fh " * the COPYING file, which can be found at the root of the source code       *\n";
+    print $fh " * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n";
+    print $fh " * If you do not have access to either file, you may request a copy from     *\n";
+    print $fh " * help\@hdfgroup.org.                                                        *\n";
     print $fh " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n";
 }
 
diff --git a/bin/make_overflow b/bin/make_overflow
index ced486a..ccd640e 100755
--- a/bin/make_overflow
+++ b/bin/make_overflow
@@ -14,12 +14,10 @@ my @ctypes = ( () );
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Create assignment overflow #ifdefs
@@ -67,12 +65,10 @@ sub print_copyright ($) {
     print $fh " *                                                                           *\n";
     print $fh " * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n";
     print $fh " * terms governing use, modification, and redistribution, is contained in    *\n";
-    print $fh " * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n";
-    print $fh " * of the source code distribution tree; Copyright.html can be found at the  *\n";
-    print $fh " * root level of an installed copy of the electronic HDF5 document set and   *\n";
-    print $fh " * is linked from the top-level documents page.  It can also be found at     *\n";
-    print $fh " * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n";
-    print $fh " * access to either file, you may request a copy from help\@hdfgroup.org.     *\n";
+    print $fh " * the COPYING file, which can be found at the root of the source code       *\n";
+    print $fh " * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n";
+    print $fh " * If you do not have access to either file, you may request a copy from     *\n";
+    print $fh " * help\@hdfgroup.org.                                                        *\n";
     print $fh " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n";
 }
 
diff --git a/bin/make_vers b/bin/make_vers
index 0bc3b62..7e7fba1 100755
--- a/bin/make_vers
+++ b/bin/make_vers
@@ -23,12 +23,10 @@ $indent = 2;
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Create public symbol version headers
@@ -52,12 +50,10 @@ sub print_copyright ($) {
     print $fh " *                                                                           *\n";
     print $fh " * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n";
     print $fh " * terms governing use, modification, and redistribution, is contained in    *\n";
-    print $fh " * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n";
-    print $fh " * of the source code distribution tree; Copyright.html can be found at the  *\n";
-    print $fh " * root level of an installed copy of the electronic HDF5 document set and   *\n";
-    print $fh " * is linked from the top-level documents page.  It can also be found at     *\n";
-    print $fh " * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n";
-    print $fh " * access to either file, you may request a copy from help\@hdfgroup.org.     *\n";
+    print $fh " * the COPYING file, which can be found at the root of the source code       *\n";
+    print $fh " * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n";
+    print $fh " * If you do not have access to either file, you may request a copy from     *\n";
+    print $fh " * help\@hdfgroup.org.                                                        *\n";
     print $fh " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n";
 }
 
diff --git a/bin/mkdirs b/bin/mkdirs
index 694a754..43972b6 100755
--- a/bin/mkdirs
+++ b/bin/mkdirs
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # This is a small program which will create directories n-levels deep.
 # You just call it with something like:
diff --git a/bin/newer b/bin/newer
index 8ed9f87..8083cae 100755
--- a/bin/newer
+++ b/bin/newer
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Compare the modification time of file argument 1 against other file arguments.
 # Return true (0) if argument 1 is newer than all others, otherwise return
diff --git a/bin/output_filter.sh b/bin/output_filter.sh
index 58f1c48..fb59dfd 100644
--- a/bin/output_filter.sh
+++ b/bin/output_filter.sh
@@ -3,12 +3,10 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## If you do not have access to either file, you may request a copy from
+## help at hdfgroup.org.
 
 # This contains function definitions of output filtering.
 # This file should only be sourced in by another shell script.
@@ -17,6 +15,21 @@
 # Created Date: 2011/5/3
 
 
+# Comment added to address HDFFV-8270:
+# As I understand it, the purpose of this file is to remove extraneous messages 
+# that appear in stdout and stderr on some machines that have been tested outside 
+# of the HDF Group realm.  The purpose of this script is to filter those 
+# extraneous messages from stdout and stderr so that when the output files are
+# compared to the expected output, the extra messages will not cause failures in 
+# the tests.  The system messages in the comments below are out of date, meaning
+# I suppose that while the script code to filter messages on the system was 
+# correct correct when last used, the output in the comments doesn't match the
+# script code that follows.  I don't currently have access to any of these 
+# systems to see the current output and the effect of the script code. If using
+# this file in the future, please update the comments to match the scripts in use.
+# Larry Knox 2017/3/15
+
+
 # Some systems will dump some messages to stdout for various reasons.
 # Remove them from the stdout result file.
 # $1 is the file name of the file to be filtered.
diff --git a/bin/release b/bin/release
index 703916b..6b4aab7 100755
--- a/bin/release
+++ b/bin/release
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # Make a release of hdf5.
@@ -40,9 +38,12 @@
 USAGE()
 {
 cat << EOF
-Usage: $0 -d <dir> [-h] [--nocheck] [--private] <methods> ...
+Usage: $0 -d <dir> [--docver BRANCHNAME] [-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.
@@ -54,8 +55,13 @@ for compressing the resulting tar archive (if none are given then
 
     tar		-- use tar and don't do any compressing.
     gzip	-- use gzip with "-9" and append ".gz" to the output name.
+    cmake-tgz   -- create a tar file using the gzip default level with a build-unix.sh 
+                   command file and all other CMake files needed to build HDF5 source
+                   using CMake on unix machines.
     bzip2       -- use bzip2 with "-9" and append ".bz2" to the output name.
     zip		-- convert all text files to DOS style and form a zip file for Windows use.
+    cmake-zip   -- convert all text files to DOS style and create a zip file inluding cmake
+                   scripts and .bat files to build HDF5 source using CMake on Windows. 
     doc         -- produce the latest doc tree in addition to the archive.
 
 An md5 checksum is produced for each archive created and stored in the md5 file.
@@ -92,9 +98,9 @@ EOF
 # Modifications
 #
 # Steps:
-# 1. untar the tarball in a temporay directory;
+# 1. untar the tarball in a temporary directory;
 #    Note: do this in a temporary directory to avoid changing
-#    the original source directory which maybe around.
+#    the original source directory which may be around.
 # 2. convert all its text files to DOS (LF-CR) style;
 # 3. form a zip file which is usable by Windows users.
 #
@@ -111,7 +117,7 @@ tar2zip()
 	echo "usage: tar2zip <tarfilename> <zipfilename>"
 	return 1
     fi
-    ztmpdir=/tmp/tmpdir$$
+    ztmpdir=/tmp/ztmpdir$$
     mkdir -p $ztmpdir
     version=$1
     tarfile=$2
@@ -150,9 +156,180 @@ tar2zip()
     rm -rf $ztmpdir
 }
 
+# Function name: tar2cmakezip
+# Convert the release tarball to a Windows zipball with files to run CMake build.
+#
+# Programmer: Larry Knox
+# Creation date: 2017-02-20
+#
+# Modifications
+#
+# Steps:
+# 1. untar the tarball in a temporary directory;
+#    Note: do this in a temporary directory to avoid changing
+#    the original source directory which may be around.
+# 2. add build-unix.sh script.
+# 3. add SZIP.tar.gz, ZLib.tar.gz and cmake files to top level directory.
+# 4. create gzipped tar file with these contents:
+#        build-unix.sh          script
+#        hdf5-<version>         source code directory extracted from tar file
+#        CTestScript.cmake      cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        HDF5config.cmake       cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        HDF5options.cmake      cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        SZip.tar.gz            copied from /mnt/scr1/pre-release/hdf5/CMake
+#        ZLib.tar.gz            copied from /mnt/scr1/pre-release/hdf5/CMake
+
+
+# Parameters:
+# $1 version
+# $2 release tarball
+# $3 output zipball file name
+#
+# Returns 0 if successful; 1 otherwise
+#
+ # need function to create another temporary directory, extract the
+            # $tmpdir/$HDF5_VERS.tar into it, add (create) build-unix.sh,
+            # CTestScript.cmake, HDF5config.cmake, SZIP.tar.gz and ZLib.tar.gz,
+             # and then tar.gz it.
+tar2cmakezip()
+{
+    if [ $# -ne 3 ]; then
+	echo "usage: tar2cmakezip <tarfilename> <tgzfilename>"
+	return 1
+    fi
+    version=$1
+    tarfile=$2
+    zipfile=$3
+
+    cmziptmpdir=/tmp/cmziptmpdir$$
+    mkdir -p $cmziptmpdir/CMake-$version
+
+    # step 1: untar tarball in cmgztmpdir
+    (cd $cmziptmpdir/CMake-$version; tar xf -) < $tarfile
+    # sanity check
+    if [ ! -d $cmziptmpdir/CMake-$version/$version ]; then
+	echo "untar did not create $cmziptmpdir/CMake-$version/$version source dir"
+	# cleanup
+	rm -rf $cmziptmpdir
+	return 1
+    fi
+
+    # step 2: add batch file for building CMake on window
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2012-32.bat $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2012-64.bat $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2013-32.bat $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2013-64.bat $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2015-32.bat $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2015-64.bat $cmziptmpdir/CMake-$version
+
+    # step 3: add SZIP.tar.gz, ZLib.tar.gz and cmake files
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/SZip.tar.gz $cmziptmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/ZLib.tar.gz $cmziptmpdir/CMake-$version
+    cp $cmziptmpdir/CMake-$version/$version/config/cmake/scripts/CTestScript.cmake $cmziptmpdir/CMake-$version
+    cp $cmziptmpdir/CMake-$version/$version/config/cmake/scripts/HDF5config.cmake $cmziptmpdir/CMake-$version
+    cp $cmziptmpdir/CMake-$version/$version/config/cmake/scripts/HDF5options.cmake $cmziptmpdir/CMake-$version
+
+    # step 4: convert text files
+    # There maybe a simpler way to do this.
+    # options used in unix2dos:
+    # -k   Keep the date stamp 
+    # -q   quiet mode
+    # grep redirect output to /dev/null because -q or -s are not portable.
+    find $cmziptmpdir/CMake-$version/$version | \
+	while read inf; do \
+	    if file $inf | grep "$inf\: .*text" > /dev/null 2>&1 ; then \
+		unix2dos -q -k $inf; \
+	    fi\
+	done
+    # step 3: make zipball
+    # -9 maximum compression
+    # -y Store symbolic links as such in the zip archive
+    # -r recursive
+    # -q quiet
+    (cd $cmziptmpdir; zip -9 -y -r -q CMake-$version.zip *)
+    mv $cmziptmpdir/CMake-$version.zip $zipfile
+
+    # cleanup
+    rm -rf $cmziptmpdir
+}
+
+# Function name: tar2cmaketgz
+# Convert the release tarball to a Windows zipball with files to run CMake build.
+#
+# Programmer: Larry Knox
+# Creation date: 2017-02-20
+#
+# Modifications
+#
+# Steps:
+# 1. untar the tarball in a temporary directory;
+#    Note: do this in a temporary directory to avoid changing
+#    the original source directory which may be around.
+# 2. add build-unix.sh script.
+# 3. add SZIP.tar.gz, ZLib.tar.gz and cmake files to top level directory.
+# 4. create gzipped tar file with these contents:
+#        build-unix.sh          script
+#        hdf5-<version>         source code directory extracted from tar file
+#        CTestScript.cmake      cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        HDF5config.cmake       cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        HDF5options.cmake      cmake file copied from <hdf5 source code>/config/cmake/scripts
+#        SZip.tar.gz            copied from /mnt/scr1/pre-release/hdf5/CMake
+#        ZLib.tar.gz            copied from /mnt/scr1/pre-release/hdf5/CMake
+
+
+# Parameters:
+# $1 version
+# $2 release tarball
+# $3 output zipball file name
+#
+# Returns 0 if successful; 1 otherwise
+#
+ # need function to create another temporary directory, extract the
+            # $tmpdir/$HDF5_VERS.tar into it, add (create) build-unix.sh,
+            # CTestScript.cmake, HDF5config.cmake, SZIP.tar.gz and ZLib.tar.gz,
+             # and then tar.gz it.
+tar2cmaketgz()
+{
+    if [ $# -ne 3 ]; then
+	echo "usage: tar2cmaketgz <tarfilename> <tgzfilename>"
+	return 1
+    fi
+    version=$1
+    tarfile=$2
+    tgzfile=$3
+
+    cmgztmpdir=/tmp/cmgztmpdir$$
+    mkdir -p $cmgztmpdir/CMake-$version
+
+    # step 1: untar tarball in cmgztmpdir
+    (cd $cmgztmpdir/CMake-$version; tar xf -) < $tarfile
+    # sanity check
+    if [ ! -d $cmgztmpdir/CMake-$version/$version ]; then
+	echo "untar did not create $cmgztmpdir/$version source dir"
+	# cleanup
+	rm -rf $cmgztmpdir
+	return 1
+    fi
+
+
+    # step 2: add build-unix.sh script
+    (cd $cmgztmpdir/CMake-$version; echo "ctest -S HDF5config.cmake,BUILD_GENERATOR=Unix -C Release -V -O hdf5.log" > build-unix.sh; chmod 755 build-unix.sh)
+
+    # step 3: add SZIP.tar.gz, ZLib.tar.gz and cmake files
+    cp /mnt/scr1/pre-release/hdf5/CMake/SZip.tar.gz $cmgztmpdir/CMake-$version
+    cp /mnt/scr1/pre-release/hdf5/CMake/ZLib.tar.gz $cmgztmpdir/CMake-$version
+    cp $cmgztmpdir/CMake-$version/$version/config/cmake/scripts/CTestScript.cmake $cmgztmpdir/CMake-$version
+    cp $cmgztmpdir/CMake-$version/$version/config/cmake/scripts/HDF5config.cmake $cmgztmpdir/CMake-$version
+    cp $cmgztmpdir/CMake-$version/$version/config/cmake/scripts/HDF5options.cmake $cmgztmpdir/CMake-$version
+    tar czf $DEST/CMake-$HDF5_VERS.tar.gz -C $cmgztmpdir . || exit 1 
+                 
+    # cleanup
+    rm -rf $cmgztmpdir
+}
+
 # This command must be run at the top level of the hdf5 source directory.
 # Verify this requirement.
-if [ ! \( -f configure -a -f bin/release \) ]; then
+if [ ! \( -f configure.ac -a -f bin/release \) ]; then
     echo "$0 must be run at the top level of the hdf5 source directory"
     exit 1
 fi
@@ -168,8 +345,17 @@ release_date=`date +%F`
 today=`date +%Y%m%d`
 pmode='no'
 tmpdir="../#release_tmp.$$"	# tmp work directory
-DOC_URL=http://svn.hdfgroup.uiuc.edu/hdf5doc/trunk
+DOC_URL=https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5doc.git
 CPPLUS_RM_NAME=cpplus_RM
+MAINT_MODE_ENABLED=""
+
+# If maintainer mode is enabled in configure, it should be disabled for release,
+# and enabled again after release files have been created.  If already disabled
+# there's no need to do either.
+MAINT_MODE_ENABLED=`grep ^AM_MAINTAINER_MODE ./configure.ac | grep enable`
+if [ "${MAINT_MODE_ENABLED}" != "" ]; then
+    bin/switch_maint_mode -disable ./configure.ac
+fi
 
 # Restore previous Version information
 RESTORE_VERSION()
@@ -203,6 +389,10 @@ while [ -n "$1" ]; do
 	--private)
 	    pmode=yes
 	    ;;
+        --docver)
+            DOCVERSION=$1
+            shift
+            ;;
 	-*)
 	    echo "Unknown switch: $arg" 1>&2
 	    USAGE
@@ -240,6 +430,7 @@ if [ X$pmode = Xyes ]; then
     # (h5vers does not correctly handle just m.n.r-$today.)
     VERS=`echo $VERS | sed -e s/-.*//`-of$today
     echo Private release of $VERS
+else
     bin/h5vers -s $VERS
 fi
 
@@ -282,6 +473,11 @@ for f in README.txt release_docs/RELEASE.txt; do
     chmod 644 $f
 done
 
+# trunk is different than branches.
+if [ "${DOCVERSION}" ]; then
+    DOC_URL="$DOC_URL -b ${DOCVERSION}"
+fi
+
 # Create the tar file
 test "$verbose" && echo "   Running tar..." 1>&2
 ( \
@@ -304,6 +500,11 @@ for comp in $methods; do
 	    gzip -9 <$tmpdir/$HDF5_VERS.tar >$DEST/$HDF5_VERS.tar.gz
 	    (cd $DEST; md5sum $HDF5_VERS.tar.gz >> $MD5file) 
 	    ;;
+        cmake-tgz)
+	    test "$verbose" && echo "   Creating CMake tar.gz file..." 1>&2
+	    tar2cmaketgz $HDF5_VERS $tmpdir/$HDF5_VERS.tar $DEST/CMake-$HDF5_VERS.tar.gz 1>&2
+	    (cd $DEST; md5sum CMake-$HDF5_VERS.tar.gz >> $MD5file) 
+            ;;
 	bzip2)
 	    test "$verbose" && echo "   Running bzip2..." 1>&2
 	    bzip2 -9 <$tmpdir/$HDF5_VERS.tar >$DEST/$HDF5_VERS.tar.bz2
@@ -314,19 +515,27 @@ for comp in $methods; do
 	    tar2zip $HDF5_VERS $tmpdir/$HDF5_VERS.tar $DEST/$HDF5_VERS.zip 1>&2
 	    (cd $DEST; md5sum $HDF5_VERS.zip >> $MD5file) 
 	    ;;
+        cmake-zip)
+            test "$verbose" && echo "   Creating CMake-zip ball..." 1>&2
+            tar2cmakezip $HDF5_VERS $tmpdir/$HDF5_VERS.tar $DEST/CMake-$HDF5_VERS.zip 1>&2
+            (cd $DEST; md5sum CMake-$HDF5_VERS.zip >> $MD5file)
+            ;;
 	doc)
+            if [ "${DOCVERSION}" = "" ]; then
+                DOCVERSION=master
+            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
+	    # Check out docs from git repo
+	    (cd $tmpdir; git clone -q $DOC_URL ${DOCVERSION} > /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/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
+	    rm -rf $tmpdir/${DOCVERSION}/html/$CPPLUS_RM_NAME || exit 1
+	    mv c++/src/$CPPLUS_RM_NAME $tmpdir/${DOCVERSION}/html/$CPPLUS_RM_NAME || exit 1
+            # Compress the docs and move them to the release area
+	    mv $tmpdir/${DOCVERSION} $tmpdir/${HDF5_VERS}_docs || exit 1
+	    (cd $tmpdir && tar cf ${HDF5_VERS}_docs.tar ${HDF5_VERS}_docs) || exit 1
+	    mv $tmpdir/${HDF5_VERS}_docs.tar $DEST || exit 1
 	    ;;
 	*)
 	    echo "***Error*** Unknown method $comp"
@@ -335,6 +544,12 @@ for comp in $methods; do
     esac
 done
 
+# If AM_MAINTAINER_MODE was enabled before running this script
+# restore it to "enabled".
+if [ "${MAINT_MODE_ENABLED}" != "" ]; then
+    bin/switch_maint_mode -enable ./configure.ac
+fi
+
 # Copy the RELEASE.txt to the release area.
 cp release_docs/RELEASE.txt $DEST/$HDF5_VERS-RELEASE.txt
 
diff --git a/bin/restore.sh b/bin/restore.sh
new file mode 100755
index 0000000..60ac661
--- /dev/null
+++ b/bin/restore.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+# A script to clean up the action of autogen.sh
+#
+# If this script fails to clean up generated files on a particular
+# platform, please contact help at hdfgroup.org or comment on the forum.
+
+echo
+echo "*******************************"
+echo "* HDF5 autogen.sh undo script *"
+echo "*******************************"
+echo
+
+echo "Remove autom4te.cache directory"
+rm -rf autom4te.cache
+
+echo "Remove configure script"
+rm -f configure
+
+echo "Remove Makefile.in files"
+find . -type f -name 'Makefile.in' -exec rm {} \;
+
+echo "Remove files generated by libtoolize"
+rm -f bin/ltmain.sh
+rm -f m4/libtool.m4
+rm -f m4/ltoptions.m4
+rm -f m4/ltsugar.m4
+rm -f m4/ltversion.m4
+rm -f m4/lt~obsolete.m4
+
+echo "Remove files generated by automake"
+rm -f bin/compile
+rm -f bin/config.guess
+rm -f bin/config.sub
+rm -f bin/install-sh
+rm -f bin/missing
+rm -f bin/test-driver
+rm -f bin/depcomp
+
+echo "Remove files generated by bin/make_err"
+rm -f src/H5Epubgen.h
+rm -f src/H5Einit.h
+rm -f src/H5Eterm.h
+rm -f src/H5Edefin.h
+
+echo "Remove files generated by bin/make_vers"
+rm -f src/H5version.h
+
+echo "Remove files generated by bin/make_overflow"
+rm -f src/H5overflow.h
+
+echo "Remove remaining generated files"
+rm -f aclocal.m4
+
diff --git a/bin/snapshot b/bin/snapshot
index a496edd..5c78fc8 100755
--- a/bin/snapshot
+++ b/bin/snapshot
@@ -6,20 +6,19 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.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 should be run nightly from cron.  It checks out hdf5
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+
+# This script should be run nightly from cron.  It checks out the source 
 # from the source repository and compares it against the previous
 # snapshot.  If anything significant changed then a new snapshot is
 # created, the minor version number is incremented, and the change is
 # checked back into the source repository.
 #
 
+
 # function definitions
 TIMESTAMP()
 {
@@ -28,7 +27,7 @@ TIMESTAMP()
 
 EXIT_BANNER()
 {
-TIMESTAMP "Exit $PROGNAME with status=$?"
+    TIMESTAMP "Exit $PROGNAME with status=$?"
 }
 
 # Show current total disk usage.
@@ -38,11 +37,178 @@ DISKUSAGE()
     ( read x y; echo "Disk Usage=$x KB" )
 }
 
+# function provided for testing software downloaded as tar files.  A version of
+# this function that properly extracts the downloaded files can be provided in 
+# the snapshots-${sw}-overrides file.
+EXTRACT()
+{
+   echo "Error:  ${SWVERSION} is in source repository - does not need extraction."
+}
+
+# Standard procedure for checking out or updating source code from an hdfgroup
+# git repository.  Override the function for other repositories or procedures.
+SOURCE_CHECKOUT()
+{
+   if test -n $GIT_URL; then
+      if [ -n "$AUTOGEN" ]; then
+         echo "Creating fresh clone of $GIT_URL in $BASEDIR/current_src"
+         # Check out the current version from source repository.
+         (cd $BASEDIR; rm -rf current_src
+          if test -z $GIT_BRANCH; then
+             echo "Testing empty branch $GIT_BRANCH." 
+             git clone $GIT_URL current_src
+          else
+             echo "Testing branch $GIT_BRANCH." 
+             git clone $GIT_URL -b $GIT_BRANCH current_src
+          fi
+          ) || exit 1
+      else
+         echo "Creating fresh clone of $GIT_URL in $BASEDIR/current"
+         # Check out the current version from source repository.
+         (cd $BASEDIR; rm -rf current
+          if test -n $GIT_BRANCH; then
+             git clone $GIT_URL -b $GIT_BRANCH current
+          else
+             git clone $GIT_URL current
+          fi ) || exit 1
+      fi
+   else
+      echo "Warning!  Source directory ("current") is not checked out from git."
+   fi
+}
+
+# Standard procedure for running the configure command in a build (test)
+# directory
+RUNCONFIGURE()
+{
+    if [ "${CURRENT}" != "${TESTDIR}" -a "$CPSRC" = "yes" ]; then
+        echo "Copying source files to ${TESTDIR}."
+        cp -pr ${CURRENT}/* ${TESTDIR}
+        cd ${TESTDIR}
+        ./${CONFIGURE}
+    elif [ -n "${AUTOGEN}" ]; then
+        ${CURRENTSRC}/${CONFIGURE}
+    else 
+        ${CURRENT}/${CONFIGURE} 
+    fi
+}
+
+# Sometimes "make distclean" doesn't adequately remove files from the previous
+# build.  If a build (test) directory was used, its contents can be entirely 
+# deleted to provide a clean start.  If the test is building in the source 
+# directory, the contents can't be deleted, so run "make distclean".
+DISTCLEAN()
+{
+    if [ "${srcdir}" = "yes" -a -n "${SRCDIRNAME}" -a -d ${BASEDIR}/TestDir/${SRCDIRNAME} ]; then
+        echo "Remove contents of $SRCDIRNAME.\n"
+        rm -rf ${BASEDIR}/TestDir/${SRCDIRNAME}/*
+    else
+       echo "$MAKE distclean"
+       (cd ${TESTDIR} && ${MAKE} distclean)
+    fi
+}
+
+# Several of the software packages tested do not support make check-install.
+# Those that support it should have a version of this function in their 
+# override with the following lines:
+#     TIMESTAMP "check-install $1" 
+#     ${MAKE} check-install $1
+CHECKINSTALL()
+{
+    echo "check-install is not supported for ${SWVERSION}"
+}
+
+# Function for hdf4 and hdf5 to override to check in changes after snapshot.
+# Safety measure to avoid unintended checkins to other repositories.
+COMMITSNAPSHOT()
+{
+    echo "original hdf5 script committed code changes back into git."
+}
+
+DISPLAYUSAGE()
+{
+    set -
+    cat <<EOF
+Usage: $PROGNAME [all] [checkout] [ftp <URL> [diff] [test] [srcdir] [release] [help]
+	[clean] [distclean] [echo] [deploy <dir>] [deploydir <dir>]
+	[zlib <zlib_path>] [releasedir <dir>] [srcdirname <dir>] [check-vfd]
+	[exec <command>] [module-load <module-list>] [op-configure <option>] 
+        [--<option>]
+    all:      Run all commands (checkout, test & release)
+              [Default is all]
+    checkout: Run source checkout
+    diff:     Run diff on current and previous versions.  Exit 0 if
+              no significant differences are found.  Otherwise, non-zero.
+    deploy:   deploy binary to directory <dir>
+    deploydir: use <dir> as the default directory for deployment
+    test:     Run test
+    release:  Run release
+    clean:    Run make clean
+    distclean:Run make distclean
+    echo:     Turn on echo mode (set -x)
+    setenv <name> <value>:
+              Set environment variable <name> to <value>.
+    setenvN <N> <name> <value> ...:
+	      Set environment variable with <N> values.
+	      E.g., setenvN 3 x a b c is same as setenv x="a b c".
+    srcdir:   Use srcdir option (does not imply other commands)
+              "snapshot srcdir" is equivalent to "snapshot srcdir all"
+              "snapshot srcdir checkout" is equivalent to "snapshot checkout"
+    srcdirname <dir>:
+              Use <dir> as the srcdir testing directory if srcdir is choosen.
+              If <dir> starts with '-', it is append to the default name
+              E.g., "snapshot srcdir srcdirname -xx" uses hostname-xx
+              [Default is hostname]
+    help:     Print this message
+    echo:     Turn on shell echo
+    zlib <zlib_path>:
+              Use <zlib_path> as the ZLIB locations
+              [Default is $ZLIB_default]
+    releasedir <dir>:
+              Use <dir> as the release directory
+              [Default is $ReleaseDir_default]
+    check-vfd:
+	      Run make check-vfd instead of just make check.
+    exttest <testscript>;
+              Run testscript;
+    exec <command>:
+              Run <command>;
+    module-load <module-list>:
+              Load modules in comma-separated <module-list>;
+    op-configure <option>:
+              Pass <option> to the configure command
+              E.g., "snapshot op-configure --enable-parallel"
+                  configures for parallel mode
+    --<option>:
+              Pass --<option> to the configure command
+              E.g., "snapshot --enable-parallel"
+                  configures for parallel mode
+EOF
+    exit $errcode
+}
 
 # MAIN
 # SGI /bin/sh replaces $0 as function name if used in a function.
 # Set the name here to avoid that ambiguity and better style too.
 PROGNAME=$0
+SNAPSHOTNAME=
+HDFREPOS=
+DOCVERSION=""
+MODULELIST=""
+
+if [ -f bin/snapshot_params ]; then
+   . bin/snapshot_params
+   echo "Added snapshot_params."
+fi
+if [ -z "$SWVER" -a -f bin/snapshot_version ]
+then
+   . bin/snapshot_version
+   echo "Added snapshot_version."
+fi
+if [ -n ${HDFREPOS} -a -f  bin/snapshot-${HDFREPOS}-overrides ]; then
+   . bin/snapshot-${HDFREPOS}-overrides
+   echo "Added snapshot-${HDFREPOS}-overrides."
+fi 
 
 echo "====================================="
 echo "$PROGNAME $*"
@@ -51,7 +217,7 @@ TIMESTAMP MAIN
 uname -a
 
 # setup exit banner message
-trap EXIT_BANNER 0
+trap EXIT_BANNER 0 1 2 9 15
 
 # Dump environment variables before option parsing
 echo ===Dumping environment variables before option parsing ===
@@ -67,8 +233,14 @@ ReleaseDir_default=release_dir
 ZLIB_default=
 ZLIB=$ZLIB_default
 
-# What compression methods to use? 
-METHODS="gzip zip bzip2 doc"
+# What compression methods to use? (md5 does checksum).  Doc was apparently 
+# added as a compression method to create a separate tarfile containing the
+# documentation files for v 1.8 and above.
+if [ "${SWVERSION}" = "hdf5_1_6" ]; then
+    METHODS="gzip bzip2 md5"
+else
+    METHODS="gzip bzip2 doc"
+fi
 
 # Use User's MAKE if set.  Else use generic make.
 MAKE=${MAKE:-make}
@@ -81,15 +253,38 @@ CHECKVAL=check
 cmd="all"
 test_opt=""
 errcode=0
+AUTOGEN=""
+EXTTEST=""
+EXEC_CMD_ARG=""
 while [ $# -gt 0 ] ; do
     case "$1" in
 	all)	
 	    cmd="all"
 	    ;;
+        checkout-autogen)
+            cmdcheckout="checkout"
+            AUTOGEN="autogen"
+            cmd=""
+            ;;
 	checkout)
 	    cmdcheckout="checkout"
 	    cmd=""
 	    ;;
+        ftp)
+            echo "Setting ftp flags in snapshot script"
+            cmdcheckout="checkout"
+            cmdftp="ftp"
+            cmd=""
+            shift
+	    if [ $# -lt 1 ]; then
+		echo "URL missing"
+		errcode=1
+		cmd="help"
+		break
+	    fi
+            ftp_url="$1"
+            echo "ftp_url is $ftp_url"
+            ;;
 	diff)
 	    cmddiff="diff"
 	    cmd=""
@@ -164,6 +359,10 @@ while [ $# -gt 0 ] ; do
 	    cmdrel="release"
 	    cmd=""
 	    ;;
+        autogen-release)
+            cmdrel="autogen-release"
+            cmd=""
+            ;;
 	clean | distclean)
 	    cmdclean="$1"
 	    cmd=""
@@ -196,12 +395,43 @@ while [ $# -gt 0 ] ; do
 	    fi
 	    ReleaseDir="$1"
 	    ;;
+        exttest)
+            shift
+	    if [ $# -lt 1 ]; then
+		echo "exttest script name missing"
+		errcode=1
+		cmd="help"
+		break
+	    fi
+	    cmd=""
+            EXTTEST="$1"
+            ;;
+        exec)
+            shift
+	    if [ $# -lt 1 ]; then
+		echo "exec command name missing"
+		errcode=1
+		cmd="help"
+		break
+	    fi
+	    cmd=""
+            EXEC_CMD_ARG="$@"
+	    # exit the parsing while loop since all arguments have been consummed.
+	    break
+            ;;
 	check-vfd)
 	    CHECKVAL=check-vfd
 	    ;;
-	yodconfigure)
-	    YODCONFIGURE=yes
-	    ;;
+        module-load)
+            shift
+            if [ $# -lt 1 ]; then
+                echo "missing module list to load"
+                errcode=1
+                cmd="help"
+                break
+            fi 
+            MODULELIST="$1"
+            ;;
 	--*)
 	    OP_CONFIGURE="$OP_CONFIGURE $1"
 	    ;;
@@ -225,87 +455,39 @@ while [ $# -gt 0 ] ; do
     shift
 done
 
+if [ -n "$MODULELIST" ]; then
+   . ~/.bashrc
+   module use /opt/pkgs/modules/all
+   # load module command will take a space separated list of modules.
+   # If we have a comma separated list, convert ',' to ' '.
+   MODULELIST="$( echo -e "$MODULELIST" | tr  ',' ' '  )"  
+   module load $MODULELIST
+fi
+
 # Dump environment variables after option parsing
 echo ===Dumping environment variables after option parsing ===
 printenv | sort
 echo ===Done Dumping environment variables after option parsing ===
 
 if [ "$cmd" = help ]; then
-    set -
-    cat <<EOF
-Usage: $PROGNAME [all] [checkout] [diff] [test] [srcdir] [release] [help]
-	[clean] [distclean] [echo] [deploy <dir>] [deploydir <dir>]
-	[zlib <zlib_path>] [releasedir <dir>] [srcdirname <dir>] [check-vfd]
-	[op-configure <option>] [--<option>]
-    all:      Run all commands (checkout, test & release)
-              [Default is all]
-    checkout: Run source checkout
-    diff:     Run diff on current and previous versions.  Exit 0 if
-              no significant differences are found.  Otherwise, non-zero.
-    deploy:   deploy binary to directory <dir>
-    deploydir: use <dir> as the default directory for deployment
-    test:     Run test
-    release:  Run release
-    clean:    Run make clean
-    distclean:Run make distclean
-    echo:     Turn on echo mode (set -x)
-    setenv <name> <value>:
-              Set environment variable <name> to <value>.
-    setenvN <N> <name> <value> ...:
-	      Set environment variable with <N> values.
-	      E.g., setenvN 3 x a b c is same as setenv x="a b c".
-    srcdir:   Use srcdir option (does not imply other commands)
-              "snapshot srcdir" is equivalent to "snapshot srcdir all"
-              "snapshot srcdir checkout" is equivalent to "snapshot checkout"
-    srcdirname <dir>:
-              Use <dir> as the srcdir testing directory if srcdir is choosen.
-              If <dir> starts with '-', it is append to the default name
-              E.g., "snapshot srcdir srcdirname -xx" uses hostname-xx
-              [Default is hostname]
-    help:     Print this message
-    echo:     Turn on shell echo
-    zlib <zlib_path>:
-              Use <zlib_path> as the ZLIB locations
-              [Default is $ZLIB_default]
-    releasedir <dir>:
-              Use <dir> as the release directory
-              [Default is $ReleaseDir_default]
-    check-vfd:
-	      Run make check-vfd instead of just make check.
-    op-configure <option>:
-              Pass <option> to the configure command
-              E.g., "snapshot op-configure --enable-parallel"
-                  configures for parallel mode
-    --<option>:
-              Pass --<option> to the configure command
-              E.g., "snapshot --enable-parallel"
-                  configures for parallel mode
-EOF
-    exit $errcode
+   DISPLAYUSAGE
 fi
 
 # Setup the proper configure option (--with-zlib) to use zlib library
 # provide ZLIB is non-empty.
 ZLIB=${ZLIB:+"--with-zlib="$ZLIB}
-if [ -n "$YODCONFIGURE" ]; then
-    cp configure configure.yod
-    bin/yodconfigure configure.yod
-    CONFIGURE="./configure.yod"
-else
-    CONFIGURE="./configure"
+# Adding --prefix as a configure option will put the path to the deploy 
+# directory in the initial libhdf5*.la files
+if [ -n "$DEPLOYDIRNAME" ]; then
+   OP_CONFIGURE="$OP_CONFIGURE --prefix=${deploydir}/${DEPLOYDIRNAME}"
 fi
-CONFIGURE="$CONFIGURE $ZLIB $OP_CONFIGURE"
+CONFIGURE="configure $OP_CONFIGURE"
+# echo "Configure command is $CONFIGURE"
 
 # Execute the requests
 snapshot=yes
 
-if [ -f bin/snapshot_version ]; then
-    . bin/snapshot_version
-else
-    H5VERSION=hdf5
-fi
-
-BASEDIR=${HOME}/snapshots-${H5VERSION}
+BASEDIR=${HOME}/snapshots-${SNAPSHOTNAME}
 if [ ! -d ${BASEDIR} ]; then
     echo "BASEDIR ($BASEDIR) does not exist"
     exit 1
@@ -315,11 +497,6 @@ CURRENT=${BASEDIR}/current
 PREVIOUS=${BASEDIR}/previous
 ReleaseDir=${ReleaseDir:=${BASEDIR}/${ReleaseDir_default}}
 HOSTNAME=`hostname | cut -f1 -d.`	# no domain part
-if [ $H5VERSION != hdf5 ]; then
-    SVNVERSION="hdf5/branches/$H5VERSION"
-else
-    SVNVERSION=hdf5/trunk		# use the default (trunk) version
-fi
 
 # Try finding a version of diff that supports the -I option too.
 DIFF=diff
@@ -333,19 +510,48 @@ done
 #=============================
 if [ "$cmd" = "all" -o -n "$cmdcheckout" ]; then
     TIMESTAMP "checkout"
-    # If there is a Makefile in ${CURRENT}, the last test done in it
-    # has not been distclean'ed.  They would interfere with other
-    # --srcdir build since make considers the files in ${CURRENT}
-    # take precedence over files in its own build-directory.  Run
-    # a "make distclean" to clean them all out.  This is not really
-    # part of the "checkout" functions but this is the most convenient
-    # spot to do the distclean.  We will also continue the checkout process
-    # regardless of the return code of distclean.
-    ( cd ${CURRENT}; test -f Makefile && ${MAKE} distclean)
-
-    SVNROOT=http://svn.hdfgroup.uiuc.edu
-    # Check out the current version from source repository.
-    (cd $BASEDIR; svn -q co ${SVNROOT}/${SVNVERSION} current ) || exit 1
+    # ${BASEDIR}/bin is now updated from git by EveningMaint or DailyMaint
+    # to avoid updating the scripts in ${BASEDIR}/bin while they are running.
+
+    if [ -z "$AUTOGEN" ]; then
+        # If there is a Makefile in ${CURRENT}, the last test done in it
+        # has not been distclean'ed.  They would interfere with other
+        # --srcdir build since make considers the files in ${CURRENT}
+        # take precedence over files in its own build-directory.  Run
+        # a "make distclean" to clean them all out.  This is not really
+        # part of the "checkout" functions but this is the most convenient
+        # spot to do the distclean.  We will also continue the checkout process
+        # regardless of the return code of distclean.
+        ( cd ${CURRENT}; test -f Makefile && ${MAKE} distclean)
+    fi
+    # echo "cmdftp is $cmdftp;  ftp_url is $ftp_url"
+    if [ -n "$cmdftp" ]; then
+        echo "Get the NetCDF4 source from their ftp server."
+        echo "Command executed is: 2>&1 wget -N $ftp_url" 
+        cd ${BASEDIR};
+        WGET_OUTPUT="`2>&1 wget -N $ftp_url`"
+        errcode=$?
+        if [[ $errcode -ne 0 ]]; then
+            exit $errcode
+        fi
+
+        if [ $? -ne 0 ];then
+            echo $0: "$WGET_OUTPUT" Exiting.
+            exit 1
+        fi
+
+        # echo "Wget output was $WGET_OUTPUT"
+
+        if echo "$WGET_OUTPUT" | fgrep 'not retrieving' &> /dev/null
+        then
+            echo "Snapshot unchanged"
+        else
+            echo "New snapshot downloaded"
+            EXTRACT
+        fi
+    else
+        SOURCE_CHECKOUT
+    fi
 fi # Do source checkout
 
 
@@ -353,7 +559,7 @@ fi # Do source checkout
 # Run Test the HDF5 library
 #=============================
 if [ "$cmd" = "all" -o -n "$cmdtest" -o -n "$cmddiff" ]; then
-    TIMESTAMP "diff"
+    TIMESTAMP "Run Tests"
     # setup if srcdir is used.
     if [ -z "$srcdir" ]; then
 	TESTDIR=${CURRENT}
@@ -369,10 +575,15 @@ if [ "$cmd" = "all" -o -n "$cmdtest" -o -n "$cmddiff" ]; then
 	esac
 	TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
 	test -d ${TESTDIR} || mkdir ${TESTDIR}
+        # set TESTDIR to use the direct path to the local test directory
+        # rather than the path through ${BASEDIR}.
+        cd ${TESTDIR}
+        TESTDIR=`pwd -P`
+        cd ${CURRENT}
     fi
     # Make sure current version exists and is clean
     if [ -d ${TESTDIR} ]; then
-	(cd ${TESTDIR} && ${MAKE} distclean)
+        DISTCLEAN    
     else
 	errcode=$?
         snapshot=no
@@ -382,12 +593,17 @@ if [ "$cmd" = "all" -o -n "$cmdtest" -o -n "$cmddiff" ]; then
     # Compare it with the previous version.  Compare only files listed in
     # the MANIFEST plus the MANIFEST itself.
     if [ -d ${PREVIOUS} ]; then
-	if (${DIFF} -c ${PREVIOUS}/MANIFEST ${CURRENT}/MANIFEST); then
+        if [ -z "${AUTOGEN}" ]; then
+            CURRENTSRC=${CURRENT}
+        else
+            CURRENTSRC=${BASEDIR}/current_src
+        fi
+	if (${DIFF} -c ${PREVIOUS}/MANIFEST ${CURRENTSRC}/MANIFEST); then
 	    snapshot=no
-	    for src in `grep '^\.' ${CURRENT}/MANIFEST|expand|cut -f1 -d' '`; do
+	    for src in `grep '^\.' ${CURRENTSRC}/MANIFEST|expand|cut -f1 -d' '`; do
 		if ${DIFF} -I H5_VERS_RELEASE -I " released on " \
 		    -I " currently under development" \
-		    ${PREVIOUS}/$src ${CURRENT}/$src
+		    ${PREVIOUS}/$src ${CURRENTSRC}/$src
 		then
 		    :	#continue
 		else
@@ -408,44 +624,123 @@ if [ "$cmd" = "all" -o -n "$cmdtest" -o -n "$cmddiff" ]; then
 	fi
     fi
 
+    #=============================
+    # Execute command if defined
+    #=============================
+    #echo BEFORE EXEC command
+    #echo EXEC_CMD_ARG=${EXEC_CMD_ARG}
+    
+    if [ -n "$EXEC_CMD_ARG" ]; then
+        TIMESTAMP ${EXEC_CMD_ARG}
+        TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
+        test -d ${TESTDIR} || mkdir ${TESTDIR}
+	if cd ${TESTDIR}; then
+	    # clean up the directory before executing the command
+	    # Do we need to clean first?
+	    # rm -rf *
+	    #
+	    # If EXEC_CMD_ARG starts with a '/', it has an absolute path, else it is
+	    # relative to the BASEDIR.
+	    case "$EXEC_CMD_ARG" in
+	    /*)
+                ${EXEC_CMD_ARG}
+		;;
+	    *)
+                ${BASEDIR}/${EXEC_CMD_ARG}
+		;;
+	    esac
+	    errcode=$?
+	else
+	    echo "${TESTDIR} not accessible"
+	    errcode=1
+	fi
+	# exit snapshot since nothing else to do, for now.
+        exit $errcode
+    fi
+
     # Build, run tests and install procedures
-    if [ "$snapshot" = "yes" ]; then
+    if [ "$snapshot" = "yes" ] && [ "$NOMAKE" != "yes" ]; then
+        FAIL_SECTION="" 
+        if [ -f ${TESTDIR}/failsection ]; then
+            rm ${TESTDIR}/failsection
+        fi
 	if (cd ${TESTDIR} && \
-	    TIMESTAMP "configure" && \
-	    ${srcdir:+${CURRENT}/}${CONFIGURE} && \
-	    TIMESTAMP "make" && \
+	    TIMESTAMP "configure" && echo "configure" > ${TESTDIR}/failsection && \
+	    RUNCONFIGURE && \
+            sleep 2 && \
+	    TIMESTAMP "make" && echo "make" > ${TESTDIR}/failsection && \
 	    ${MAKE} && DISKUSAGE \
-	    TIMESTAMP ${CHECKVAL} && \
+	    TIMESTAMP ${CHECKVAL} && echo "make check" > ${TESTDIR}/failsection &&  \
 	    ${MAKE} ${CHECKVAL} && DISKUSAGE \
-	    TIMESTAMP "install" && \
-	    ${MAKE} install-all && DISKUSAGE \
-	    TIMESTAMP "check-install" && \
-	    ${MAKE} check-install && DISKUSAGE \
-	    TIMESTAMP "uninstall" && \
-	    ${MAKE} uninstall-all && DISKUSAGE); then
+	    TIMESTAMP "install" && echo "make install" > ${TESTDIR}/failsection && \
+	    ${MAKE} install && DISKUSAGE \
+            TIMESTAMP "check-install" && echo "make check-install" > ${TESTDIR}/failsection && \
+	    CHECKINSTALL && DISKUSAGE \
+	    TIMESTAMP "uninstall" && echo "make uninstall" > ${TESTDIR}/failsection && \
+	    ${MAKE} uninstall && DISKUSAGE); then
 	    :
 	else
 	    errcode=$?
+            FAIL_SECTION=`cat ${TESTDIR}/failsection`
+            echo "Failed running ${FAIL_SECTION}"
 	    snapshot=no
 	    exit $errcode
 	fi
+    elif [ $CPSRC ]; then
+           cp -pr ${CURRENT}/* ${TESTDIR}
+    else 
+        cmdclean=""
     fi
 fi # Test the HDF5 library
 
+# Run external test if configured
 
 #=============================
+#=============================
+#if [ -d "$CURRENT" ]; then
+if [ "$EXTTEST" != "" ]; then
+    TIMESTAMP ${EXTTEST}
+    TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
+    test -d ${TESTDIR} || mkdir ${TESTDIR}
+    cd ${TESTDIR}
+    sleep 1
+    TIMESTAMP $pwd
+    ls
+    ${BASEDIR}/${EXTTEST}
+    errcode=$?
+    exit $errcode
+fi
+ 
+#=============================
 # Run deployment if requested.
 #=============================
 if [ -n "$DEPLOYDIRNAME" ]; then
+    # The daily tests deploy to .../hdf5/... or .../hdf4/... except on cobalt where the
+    # deploy directory is in .../HDF5/...  lc will take care of this.  If hdf4 or hdf5
+    # either upper or lower case isn't in the path, RELEASE.txt won't be found unless
+    # it is in $CURRENT. 
+    POS4=`perl -e "print index(lc(\"${deploydir}/${DEPLOYDIRNAME}\"), 'hdf4')"`
+    POS5=`perl -e "print index(lc(\"${deploydir}/${DEPLOYDIRNAME}\"), 'hdf5')"`
+    if [ "${POS4}" -ge "0" ]; then
+        RELEASE_TXT_LOC="release_notes"
+    elif [ "${POS5}" -ge "0" ]; then
+        RELEASE_TXT_LOC="release_docs"
+    else
+        RELEASE_TXT_LOC=""
+    fi
+ 
     if [ "$snapshot" = "yes" ]; then
 	TIMESTAMP "deploy"
         if (cd ${TESTDIR} &&
-            ${CURRENT}/bin/deploy ${deploydir}/${DEPLOYDIRNAME} && \
+            ${BASEDIR}/bin/deploy ${deploydir}/${DEPLOYDIRNAME} && \
             TIMESTAMP "clean" && \
             ${MAKE} clean && \
             TIMESTAMP "check-install prefix=${deploydir}/${DEPLOYDIRNAME}" && \
-            ${MAKE} check-install prefix=${deploydir}/${DEPLOYDIRNAME}); then
-	    :	#continue
+            CHECKINSTALL prefix=${deploydir}/${DEPLOYDIRNAME}); then
+                cd ${CURRENT}  
+                cp ${RELEASE_TXT_LOC}/RELEASE.txt ${deploydir}/${DEPLOYDIRNAME} 
+                cp COPYING ${deploydir}/${DEPLOYDIRNAME}
+	    #:	#continue
 	else
 	    errcode=$?
 	    exit $errcode
@@ -460,24 +755,41 @@ fi # Deploy
 if [ "$cmd" = "all" -o -n "$cmdrel" ]; then
     if [ "$snapshot" = "yes" ]; then
 	TIMESTAMP "release"
-	(cd ${CURRENT} && ${MAKE} distclean)
+        DISTCLEAN
 	(
 	    # Turn on exit on error in the sub-shell so that it does not
 	    # commit source if errors encounter here.
 	    set -e
-	    cd ${CURRENT}
-	    RELEASE_VERSION="`perl bin/h5vers -v`"
-	    echo "Making snapshot release ($RELEASE_VERSION) to ${ReleaseDir}..."
-	    bin/release -d $ReleaseDir $METHODS
-	    perl bin/h5vers -i
-	    svn -q commit -m "Snapshot $RELEASE_VERSION"
+            if [ "$cmdrel" = "autogen-release" ]; then
+                cd ${BASEDIR}/current_src
+            else
+	        cd ${CURRENT}
+            fi
+            if [ "$HDFREPOS" = "hdf4" ]; then
+	        RELEASE_VERSION="`perl bin/h4vers -v`"
+	        echo "Making snapshot release ($RELEASE_VERSION) to ${ReleaseDir}..."
+	        bin/release -d $ReleaseDir $METHODS
+	        perl bin/h4vers -i
+            elif [ "$HDFREPOS" = "hdf5" ]; then
+	        RELEASE_VERSION="`perl bin/h5vers -v`"
+	        echo "Making snapshot release ($RELEASE_VERSION) to ${ReleaseDir}..."
+                if [ "${DOCVERSION}" ]; then
+	            bin/release -d $ReleaseDir --docver ${DOCVERSION} $METHODS
+                else
+	            bin/release -d $ReleaseDir $METHODS
+                fi
+	        perl bin/h5vers -i
+            else
+                echo "need real release steps.  For now, only move current version to previous"
+            fi
+            COMMITSNAPSHOT
 	)
 	errcode=$?
     fi
 
     # Replace the previous version with the current version.
     # Should check if the errcode of the release process but there
-    # are other failures after release was done (e.g. h5vers or svn failures)
+    # are other failures after release was done (e.g. h5vers or git failures)
     # that should allow the replacement to occure.
     rm -rf ${PREVIOUS}
     mv ${CURRENT} ${PREVIOUS}
@@ -487,7 +799,7 @@ fi #Release snapshot
 #=============================
 # Clean the test area.  Default is no clean.
 #=============================
-if [ -n "$cmdclean" ]; then
+if [ -n "$cmdclean" ] && [ "$NOMAKE" != "yes" ]; then
     TIMESTAMP "clean"
     # setup if srcdir is used.
     if [ -z "$srcdir" ]; then
diff --git a/bin/trace b/bin/trace
index 05d3186..4467814 100755
--- a/bin/trace
+++ b/bin/trace
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 ##
 require 5.003;
 $Source = "";
@@ -32,10 +30,10 @@ $Source = "";
                "hbool_t"                    => "b",
                "double"                     => "d",
                "H5D_alloc_time_t"           => "Da",
-	       "H5FD_mpio_collective_opt_t" => "Dc",
+               "H5FD_mpio_collective_opt_t" => "Dc",
                "H5D_fill_time_t"            => "Df",
                "H5D_fill_value_t"           => "DF",
-	       "H5FD_mpio_chunk_opt_t"      => "Dh",
+               "H5FD_mpio_chunk_opt_t"      => "Dh",
                "H5D_mpio_actual_io_mode_t"  => "Di",
                "H5D_chunk_index_t"          => "Dk",
                "H5D_layout_t"               => "Dl",
@@ -47,17 +45,19 @@ $Source = "";
                "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",
+               "H5E_type_t"                 => "Et",
+               "H5F_close_degree_t"         => "Fd",
+               "H5F_fspace_strategy_t"      => "Ff",
+               "H5F_file_space_type_t"      => "Ff",
+               "H5F_mem_t"                  => "Fm",
                "H5F_scope_t"                => "Fs",
-	       "H5F_libver_t"               => "Fv",
+               "H5F_fspace_type_t"          => "Ft",
+               "H5F_libver_t"               => "Fv",
                "H5G_obj_t"                  => "Go",
                "H5G_stat_t"                 => "Gs",
-	       "hsize_t"                    => "h",
+               "hsize_t"                    => "h",
                "hssize_t"                   => "Hs",
-	       "H5E_major_t"                => "i",
+               "H5E_major_t"                => "i",
                "H5E_minor_t"                => "i",
                "H5_iter_order_t"            => "Io",
                "H5_index_t"                 => "Ii",
@@ -68,15 +68,15 @@ $Source = "";
                "unsigned int"               => "Iu",
                "uint32_t"                   => "Iu",
                "H5I_type_t"                 => "It",
-	       "H5G_link_t"                 => "Ll", #Same as H5L_type_t now
-	       "H5L_type_t"                 => "Ll",
+               "H5G_link_t"                 => "Ll", #Same as H5L_type_t now
+               "H5L_type_t"                 => "Ll",
                "MPI_Comm"                   => "Mc",
                "MPI_Info"                   => "Mi",
                "H5FD_mem_t"                 => "Mt",
                "off_t"                      => "o",
                "H5O_type_t"                 => "Ot",
                "H5P_class_t"                => "p",
-	       "hobj_ref_t"		    => "r",
+               "hobj_ref_t"		    => "r",
                "H5R_type_t"                 => "Rt",
                "char"                       => "s",
                "unsigned char"              => "s",
@@ -98,10 +98,11 @@ $Source = "";
                "void"                       => "x",
                "FILE"                       => "x",
                "H5A_operator_t"             => "x",
-	       "H5A_operator1_t"            => "x",
-	       "H5A_operator2_t"            => "x",
-	       "H5A_info_t"                 => "x",
+               "H5A_operator1_t"            => "x",
+               "H5A_operator2_t"            => "x",
+               "H5A_info_t"                 => "x",
                "H5AC_cache_config_t"        => "x",
+               "H5AC_cache_image_config_t"  => "x",
                "H5D_append_cb_t"            => "x",
                "H5D_gather_func_t"          => "x",
                "H5D_operator_t"             => "x",
@@ -113,23 +114,23 @@ $Source = "";
                "H5E_walk1_t"                => "x",
                "H5E_walk2_t"                => "x",
                "H5F_flush_cb_t"             => "x",
-	       "H5F_info1_t"                => "x",
-	       "H5F_info2_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",
                "H5FD_file_image_callbacks_t" => "x",
                "H5G_iterate_t"              => "x",
-	       "H5G_info_t"                 => "x",
-	       "H5I_free_t"                 => "x",
-                "H5I_search_func_t"         => "x",
-                "H5L_class_t"                => "x",
+               "H5G_info_t"                 => "x",
+               "H5I_free_t"                 => "x",
+               "H5I_search_func_t"         => "x",
+               "H5L_class_t"                => "x",
                "H5L_elink_traverse_t"       => "x",
                "H5L_iterate_t"              => "x",
                "H5MM_allocate_t"            => "x",
                "H5MM_free_t"                => "x",
-	       "H5O_info_t"                 => "x",
+               "H5O_info_t"                 => "x",
                "H5O_iterate_t"              => "x",
                "H5O_mcdt_search_cb_t"       => "x",
                "H5P_cls_create_func_t"      => "x",
@@ -239,34 +240,34 @@ sub rewrite_func ($$$$$) {
         next;
       }
       unless ($arg=~/^(([a-z_A-Z]\w*\s+)+\**)
-	      ([a-z_A-Z]\w*)(\[.*?\])?
-	      (\s*\/\*\s*(in|out|in_out)\s*\*\/)?\s*$/x) {
-	errmesg $file, $name, "unable to parse \`$arg\'";
-	goto error;
+              ([a-z_A-Z]\w*)(\[.*?\])?
+              (\s*\/\*\s*(in|out|in_out)\s*\*\/)?\s*$/x) {
+        errmesg $file, $name, "unable to parse \`$arg\'";
+        goto error;
       } else {
-	my ($atype, $aname, $array, $adir) = ($1, $3, $4, $6);
-	$names{$aname} = $argno++;
-	$adir ||= "in";
-	$atype =~ s/\s+$//;
-	push @arg_name, $aname;
+        my ($atype, $aname, $array, $adir) = ($1, $3, $4, $6);
+        $names{$aname} = $argno++;
+        $adir ||= "in";
+        $atype =~ s/\s+$//;
+        push @arg_name, $aname;
 
-	if ($adir eq "out") {
-	  push @arg_str, "x";
-	} else {
-	  if (defined $array) {
-	    $atype .= "*";
-	    if ($array =~ /^\[\/\*([a-z_A-Z]\w*)\*\/\]$/) {
-	      my $asize = $1;
-	      if (exists $names{$asize}) {
-		$atype .= '[a' . $names{$asize} . ']';
-	      } else {
-		warn "bad array size: $asize";
-		$atype .= "*";
-	      }
-	    }
-	  }
-	  push @arg_str, argstring $file, $name, $atype;
-	}
+        if ($adir eq "out") {
+          push @arg_str, "x";
+        } else {
+          if (defined $array) {
+            $atype .= "*";
+            if ($array =~ /^\[\/\*([a-z_A-Z]\w*)\*\/\]$/) {
+              my $asize = $1;
+              if (exists $names{$asize}) {
+                $atype .= '[a' . $names{$asize} . ']';
+              } else {
+                warn "bad array size: $asize";
+                $atype .= "*";
+              }
+            }
+          }
+          push @arg_str, argstring $file, $name, $atype;
+        }
       }
     }
     $trace = "H5TRACE" . scalar(@arg_str) . "(\"$rettype\", \"";
@@ -274,11 +275,11 @@ sub rewrite_func ($$$$$) {
     my $len = 4 + length $trace;
     for (@arg_name) {
       if ($len + length >= 77) {
-	$trace .= ",\n             $_";
-	$len = 13 + length;
+        $trace .= ",\n             $_";
+        $len = 13 + length;
       } else {
-	$trace .= ", $_";
-	$len += 1 + length;
+        $trace .= ", $_";
+        $len += 1 + length;
       }
     }
     $trace .= ");\n";
@@ -339,4 +340,3 @@ for $file (@ARGV) {
 }
 
 printf "Finished processing HDF5 API calls\n"
-
diff --git a/bin/yodconfigure b/bin/yodconfigure
index 2bc67e2..44d7d99 100755
--- a/bin/yodconfigure
+++ b/bin/yodconfigure
@@ -1,16 +1,15 @@
 #!/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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Fix configure file so that it can launch configure testing executable
 # via the proper launching command, e.g., yod.  (Thus the name yodconfigure
diff --git a/c++/CMakeLists.txt b/c++/CMakeLists.txt
index 6f288a0..c9c4815 100644
--- a/c++/CMakeLists.txt
+++ b/c++/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_CPP)
 
 #-----------------------------------------------------------------------------
@@ -25,7 +25,7 @@ INCLUDE_DIRECTORIES (${HDF5_BINARY_DIR})
 if (H5_HAVE_PARALLEL)
   add_definitions ("-DMPICH_SKIP_MPICXX")
   add_definitions ("-DMPICH_IGNORE_CXX_SEEK")
-endif (H5_HAVE_PARALLEL)
+endif ()
 
 add_subdirectory (${HDF5_CPP_SOURCE_DIR}/src ${HDF5_CPP_BINARY_DIR}/src)
 
@@ -34,11 +34,11 @@ add_subdirectory (${HDF5_CPP_SOURCE_DIR}/src ${HDF5_CPP_BINARY_DIR}/src)
 #-----------------------------------------------------------------------------
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_CPP_SOURCE_DIR}/examples ${HDF5_CPP_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Build the CPP unit tests
 #-----------------------------------------------------------------------------
 if (BUILD_TESTING)
   add_subdirectory (${HDF5_CPP_SOURCE_DIR}/test ${HDF5_CPP_BINARY_DIR}/test)
-endif (BUILD_TESTING)
+endif ()
diff --git a/c++/COPYING b/c++/COPYING
index 6903daf..6497ace 100644
--- a/c++/COPYING
+++ b/c++/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/c++/Makefile.am b/c++/Makefile.am
index 416060a..94fbefc 100644
--- a/c++/Makefile.am
+++ b/c++/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/c++/Makefile.in b/c++/Makefile.in
index da57627..e6cde0a 100644
--- a/c++/Makefile.in
+++ b/c++/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Top-level HDF5-C++ Makefile(.in)
 # 
@@ -461,6 +459,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -582,6 +581,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -730,18 +730,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 @BUILD_CXX_CONDITIONAL_TRUE at SUBDIRS = src test
 DIST_SUBDIRS = src test examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1243,6 +1245,7 @@ check-clean ::
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1250,7 +1253,7 @@ 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)
+lib dyn 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                           \
diff --git a/c++/examples/CMakeLists.txt b/c++/examples/CMakeLists.txt
index cfcdd8d..e5b0b4a 100644
--- a/c++/examples/CMakeLists.txt
+++ b/c++/examples/CMakeLists.txt
@@ -1,11 +1,11 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_CPP_EXAMPLES)
+
 # --------------------------------------------------------------------
 # Notes: When creating examples they should be prefixed
 # with "cpp_ex_". This allows for easier filtering of the examples.
 # --------------------------------------------------------------------
 
-PROJECT (HDF5_CPP_EXAMPLES)
-
 #-----------------------------------------------------------------------------
 # Define examples
 #-----------------------------------------------------------------------------
@@ -38,7 +38,7 @@ foreach (example ${examples})
   TARGET_C_PROPERTIES (cpp_ex_${example} STATIC " " " ")
   target_link_libraries (cpp_ex_${example} ${HDF5_CPP_LIB_TARGET} ${HDF5_LIB_TARGET})
   set_target_properties (cpp_ex_${example} PROPERTIES FOLDER examples/cpp)
-endforeach (example ${examples})
+endforeach ()
 
 foreach (example ${tutr_examples})
   add_executable (cpp_ex_${example} ${HDF5_CPP_EXAMPLES_SOURCE_DIR}/${example}.cpp)
@@ -46,8 +46,8 @@ foreach (example ${tutr_examples})
   TARGET_C_PROPERTIES (cpp_ex_${example} STATIC " " " ")
   target_link_libraries (cpp_ex_${example} ${HDF5_CPP_LIB_TARGET} ${HDF5_LIB_TARGET})
   set_target_properties (cpp_ex_${example} PROPERTIES FOLDER examples/cpp)
-endforeach (example ${tutr_examples})
+endforeach ()
 
 if (BUILD_TESTING)
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
diff --git a/c++/examples/CMakeTests.cmake b/c++/examples/CMakeTests.cmake
index 4db8c68..264a7e7 100644
--- a/c++/examples/CMakeTests.cmake
+++ b/c++/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -8,7 +19,7 @@
   add_test (
       NAME CPP_ex-clear-objects
       COMMAND    ${CMAKE_COMMAND}
-          -E remove 
+          -E remove
           Group.h5
           SDS.h5
           SDScompound.h5
@@ -17,16 +28,29 @@
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (CPP_ex-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "CPP_ex-clear-objects")
 
   foreach (example ${examples})
-    add_test (NAME CPP_ex_${example} COMMAND $<TARGET_FILE:cpp_ex_${example}>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME CPP_ex_${example} COMMAND $<TARGET_FILE:cpp_ex_${example}>)
+    else ()
+      add_test (NAME CPP_ex_${example} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:cpp_ex_${example}>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=cpp_ex_${example}.txt"
+          #-D "TEST_REFERENCE=cpp_ex_${example}.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (CPP_ex_${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "CPP_ex_${example}")
-  endforeach (example ${examples})
+  endforeach ()
 #the following dependicies are handled by the order of the files
 #  SET_TESTS_PROPERTIES(CPP_ex_readdata PROPERTIES DEPENDS CPP_ex_create)
 #  SET_TESTS_PROPERTIES(CPP_ex_chunks PROPERTIES DEPENDS CPP_ex_extend_ds)
@@ -34,7 +58,7 @@
   add_test (
       NAME CPP_ex_tutr-clear-objects
       COMMAND    ${CMAKE_COMMAND}
-          -E remove 
+          -E remove
           h5tutr_cmprss.h5
           h5tutr_dset.h5
           h5tutr_extend.h5
@@ -44,18 +68,30 @@
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (CPP_ex_tutr-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "CPP_ex_tutr-clear-objects")
-  
+
   foreach (example ${tutr_examples})
-    add_test (NAME CPP_ex_${example} COMMAND $<TARGET_FILE:cpp_ex_${example}>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME CPP_ex_${example} COMMAND $<TARGET_FILE:cpp_ex_${example}>)
+    else ()
+      add_test (NAME CPP_ex_${example} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:cpp_ex_${example}>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=cpp_ex_${example}.txt"
+          #-D "TEST_REFERENCE=cpp_ex_${example}.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (CPP_ex_${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "CPP_ex_${example}")
-  endforeach (example ${tutr_examples})
+  endforeach ()
 #the following dependicies are handled by the order of the files
 #  SET_TESTS_PROPERTIES(CPP_ex_h5tutr_crtatt PROPERTIES DEPENDS CPP_ex_h5tutr_crtdat)
 #  SET_TESTS_PROPERTIES(CPP_ex_h5tutr_rdwt PROPERTIES DEPENDS CPP_ex_h5tutr_crtdat)
 #  SET_TESTS_PROPERTIES(CPP_ex_h5tutr_crtgrpd PROPERTIES DEPENDS CPP_ex_h5tutr_crtgrpar)
-  
\ No newline at end of file
diff --git a/c++/examples/Makefile.am b/c++/examples/Makefile.am
index 2408217..51ab8e3 100644
--- a/c++/examples/Makefile.am
+++ b/c++/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/c++/examples/Makefile.in b/c++/examples/Makefile.in
index 4c18cad..f09a46f 100644
--- a/c++/examples/Makefile.in
+++ b/c++/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Examples Makefile(.in)
 #
@@ -409,6 +407,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -530,6 +529,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -711,18 +711,20 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1197,6 +1199,7 @@ installcheck-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1204,7 +1207,7 @@ 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)
+lib dyn 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                           \
diff --git a/c++/examples/chunks.cpp b/c++/examples/chunks.cpp
index 286934a..836c86d 100644
--- a/c++/examples/chunks.cpp
+++ b/c++/examples/chunks.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -23,20 +21,12 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "SDSextendible.h5" );
 const H5std_string DATASET_NAME( "ExtendibleArray" );
diff --git a/c++/examples/compound.cpp b/c++/examples/compound.cpp
index dfc5d81..2636d8e 100644
--- a/c++/examples/compound.cpp
+++ b/c++/examples/compound.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -24,20 +22,12 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "SDScompound.h5" );
 const H5std_string DATASET_NAME( "ArrayOfStructures" );
diff --git a/c++/examples/create.cpp b/c++/examples/create.cpp
index b4cc768..d4500f9 100644
--- a/c++/examples/create.cpp
+++ b/c++/examples/create.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -22,13 +20,10 @@
 #else
 #include <iostream>
 #endif
-#include <string>
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME( "SDS.h5" );
 const H5std_string	DATASET_NAME( "IntArray" );
diff --git a/c++/examples/extend_ds.cpp b/c++/examples/extend_ds.cpp
index 2723263..0ecad1f 100644
--- a/c++/examples/extend_ds.cpp
+++ b/c++/examples/extend_ds.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -27,18 +25,12 @@
 #endif
 #include <string>
 
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "SDSextendible.h5" );
 const H5std_string DATASET_NAME( "ExtendibleArray" );
diff --git a/c++/examples/h5group.cpp b/c++/examples/h5group.cpp
index a5137bc..3e3ab4d 100644
--- a/c++/examples/h5group.cpp
+++ b/c++/examples/h5group.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -27,20 +25,12 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "Group.h5" );
 const int	   RANK = 2;
diff --git a/c++/examples/h5tutr_cmprss.cpp b/c++/examples/h5tutr_cmprss.cpp
index e9c87f1..ee2c544 100644
--- a/c++/examples/h5tutr_cmprss.cpp
+++ b/c++/examples/h5tutr_cmprss.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME("h5tutr_cmprss.h5");
 const H5std_string	DATASET_NAME("Compressed_Data");
diff --git a/c++/examples/h5tutr_crtatt.cpp b/c++/examples/h5tutr_crtatt.cpp
index df8ca5a..db34353 100644
--- a/c++/examples/h5tutr_crtatt.cpp
+++ b/c++/examples/h5tutr_crtatt.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,12 +18,8 @@
 
 #include <iostream>
 #include <string>
-
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME( "h5tutr_dset.h5" );
 const H5std_string	DATASET_NAME( "dset" );
diff --git a/c++/examples/h5tutr_crtdat.cpp b/c++/examples/h5tutr_crtdat.cpp
index c767f72..e36a215 100644
--- a/c++/examples/h5tutr_crtdat.cpp
+++ b/c++/examples/h5tutr_crtdat.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,12 +18,8 @@
 
 #include <iostream>
 #include <string>
-
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME("h5tutr_dset.h5");
 const H5std_string	DATASET_NAME("dset");
diff --git a/c++/examples/h5tutr_crtgrp.cpp b/c++/examples/h5tutr_crtgrp.cpp
index 3db4e72..5462cbf 100644
--- a/c++/examples/h5tutr_crtgrp.cpp
+++ b/c++/examples/h5tutr_crtgrp.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME("h5tutr_group.h5");
 
diff --git a/c++/examples/h5tutr_crtgrpar.cpp b/c++/examples/h5tutr_crtgrpar.cpp
index f6e031f..93bd08d 100644
--- a/c++/examples/h5tutr_crtgrpar.cpp
+++ b/c++/examples/h5tutr_crtgrpar.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME("h5tutr_groups.h5");
 
diff --git a/c++/examples/h5tutr_crtgrpd.cpp b/c++/examples/h5tutr_crtgrpd.cpp
index f0bde52..96805a7 100644
--- a/c++/examples/h5tutr_crtgrpd.cpp
+++ b/c++/examples/h5tutr_crtgrpd.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#ifndef H5_NO_STD
-     using std::cout;
-     using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME("h5tutr_groups.h5");
 const H5std_string DATASET_NAME1("/MyGroup/dset1");
diff --git a/c++/examples/h5tutr_extend.cpp b/c++/examples/h5tutr_extend.cpp
index 432ca5e..703068a 100644
--- a/c++/examples/h5tutr_extend.cpp
+++ b/c++/examples/h5tutr_extend.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-     using namespace H5;
-#ifndef H5_NO_STD
-     using std::cout;
-     using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME("h5tutr_extend.h5");
 const H5std_string	DATASETNAME("ExtendibleArray");
diff --git a/c++/examples/h5tutr_rdwt.cpp b/c++/examples/h5tutr_rdwt.cpp
index 68c28ca..5ab7ccc 100644
--- a/c++/examples/h5tutr_rdwt.cpp
+++ b/c++/examples/h5tutr_rdwt.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,12 +18,8 @@
 
 #include <iostream>
 #include <string>
-
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME("h5tutr_dset.h5");
 const H5std_string	DATASET_NAME("dset");
diff --git a/c++/examples/h5tutr_subset.cpp b/c++/examples/h5tutr_subset.cpp
index ad52747..9ba2104 100644
--- a/c++/examples/h5tutr_subset.cpp
+++ b/c++/examples/h5tutr_subset.cpp
@@ -5,12 +5,10 @@
  *	                                                                     *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have	     *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,17 +17,12 @@
  */
 
 #include <iostream>
-#include <string>
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-     using namespace H5;
-#ifndef H5_NO_STD
-     using std::cout;
-     using std::endl;
-#endif  // H5_NO_STD
-#endif
+using namespace H5;
 
 const H5std_string	FILE_NAME("h5tutr_subset.h5");
 const H5std_string	DATASET_NAME("IntArray");
diff --git a/c++/examples/readdata.cpp b/c++/examples/readdata.cpp
index b615a40..fd88776 100644
--- a/c++/examples/readdata.cpp
+++ b/c++/examples/readdata.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 //
@@ -24,20 +22,12 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "SDS.h5" );
 const H5std_string DATASET_NAME( "IntArray" );
diff --git a/c++/examples/run-c++-ex.sh.in b/c++/examples/run-c++-ex.sh.in
index eae2782..f0d3e93 100644
--- a/c++/examples/run-c++-ex.sh.in
+++ b/c++/examples/run-c++-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-c++-ex.sh
diff --git a/c++/examples/testh5c++.sh.in b/c++/examples/testh5c++.sh.in
index 40d503f..42cb0df 100644
--- a/c++/examples/testh5c++.sh.in
+++ b/c++/examples/testh5c++.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for the h5c++ compiler tool
 # Created: Albert Cheng, 2007/3/14
diff --git a/c++/examples/writedata.cpp b/c++/examples/writedata.cpp
index 496c5d1..e14e578 100644
--- a/c++/examples/writedata.cpp
+++ b/c++/examples/writedata.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -27,20 +25,12 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cout;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cout;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+using namespace H5;
 
 const H5std_string FILE_NAME( "Select.h5" );
 const H5std_string DATASET_NAME( "Matrix in file" );
diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt
index 1a182e3..b147cfa 100644
--- a/c++/src/CMakeLists.txt
+++ b/c++/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_CPP_SRC)
 
 #-----------------------------------------------------------------------------
@@ -11,7 +11,7 @@ configure_file (${HDF_RESOURCES_DIR}/H5cxx_config.h.in
 #-----------------------------------------------------------------------------
 # Define cpp Library
 #-----------------------------------------------------------------------------
-set (CPP_SRCS
+set (CPP_SOURCES
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5AbstractDs.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5ArrayType.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5AtomType.cpp
@@ -32,6 +32,7 @@ set (CPP_SRCS
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Group.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5IdComponent.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5IntType.cpp
+    ${HDF5_CPP_SRC_SOURCE_DIR}/H5LaccProp.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Library.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Location.cpp
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Object.cpp
@@ -68,6 +69,7 @@ set (CPP_HDRS
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5IdComponent.h
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Include.h
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5IntType.h
+    ${HDF5_CPP_SRC_SOURCE_DIR}/H5LaccProp.h
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Library.h
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Location.h
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5Object.h
@@ -78,7 +80,7 @@ set (CPP_HDRS
     ${HDF5_CPP_SRC_SOURCE_DIR}/H5VarLenType.h
 )
 
-add_library (${HDF5_CPP_LIB_TARGET} STATIC ${CPP_SRCS} ${CPP_HDRS})
+add_library (${HDF5_CPP_LIB_TARGET} STATIC ${CPP_SOURCES} ${CPP_HDRS})
 TARGET_C_PROPERTIES (${HDF5_CPP_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_CPP_LIB_TARGET} ${HDF5_LIB_TARGET})
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_CPP_LIB_TARGET}")
@@ -90,7 +92,7 @@ set_target_properties (${HDF5_CPP_LIB_TARGET} PROPERTIES
 set (install_targets ${HDF5_CPP_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_CPP_LIBSH_TARGET} SHARED ${CPP_SRCS} ${CPP_HDRS})
+  add_library (${HDF5_CPP_LIBSH_TARGET} SHARED ${CPP_SOURCES} ${CPP_HDRS})
   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}")
@@ -102,7 +104,7 @@ if (BUILD_SHARED_LIBS)
       INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
   )
   set (install_targets ${install_targets} ${HDF5_CPP_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -122,7 +124,8 @@ install (
 if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS)
     INSTALL_TARGET_PDB (${HDF5_CPP_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} cpplibraries)
-  endif (BUILD_SHARED_LIBS)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_CPP_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} cpplibraries)
 
   install (
       TARGETS
@@ -133,5 +136,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT cpplibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT cpplibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT cpplibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/c++/src/H5AbstractDs.cpp b/c++/src/H5AbstractDs.cpp
index 8d88c53..b900b90 100644
--- a/c++/src/H5AbstractDs.cpp
+++ b/c++/src/H5AbstractDs.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,29 +17,31 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5AbstractDs.h"
-#include "H5DataSpace.h"
+#include "H5FaccProp.h"
+#include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
+#include "H5DataSpace.h"
+#include "H5AbstractDs.h"
 #include "H5Alltypes.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs default constructor
-///\brief	Default constructor
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs default constructor
+///\brief       Default constructor
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 AbstractDs::AbstractDs(){}
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs default constructor
-///\brief	Creates an AbstractDs instance using an existing id.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs default constructor
+///\brief       Creates an AbstractDs instance using an existing id.
+// Programmer   Binh-Minh Ribler - 2000
 //
 // *** Deprecation warning ***
 // This constructor is no longer appropriate because the data member "id" had
@@ -52,279 +52,276 @@ AbstractDs::AbstractDs(){}
 // Mar 2016 -BMR, AbstractDs::AbstractDs(const hid_t ds_id){}
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getTypeClass
-///\brief	Returns the class of the datatype that is used by this
-///		object, which can be a dataset or an attribute.
-///\return	Datatype class identifier
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getTypeClass
+///\brief       Returns the class of the datatype that is used by this
+///             object, which can be a dataset or an attribute.
+///\return      Datatype class identifier
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5T_class_t AbstractDs::getTypeClass() const
 {
-   // Gets the datatype used by this dataset or attribute.
-   // p_get_type calls either H5Dget_type or H5Aget_type depending on
-   // which object invokes getTypeClass
-   hid_t datatype_id;
-   try {
-      datatype_id = p_get_type();  // returned value is already validated
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getTypeClass", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getTypeClass", E.getDetailMsg());
-   }
+    // Gets the datatype used by this dataset or attribute.
+    // p_get_type calls either H5Dget_type or H5Aget_type depending on
+    // which object invokes getTypeClass
+    hid_t datatype_id;
+    try {
+        datatype_id = p_get_type();  // returned value is already validated
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getTypeClass", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getTypeClass", E.getDetailMsg());
+    }
 
-   // Gets the class of the datatype and validate it before returning
-   H5T_class_t type_class = H5Tget_class(datatype_id);
+    // Gets the class of the datatype and validate it before returning
+    H5T_class_t type_class = H5Tget_class(datatype_id);
 
-   // Close temporary datatype_id
-   herr_t ret_value = H5Tclose(datatype_id);
-   if (ret_value < 0)
-   {
-      if (fromClass() == "DataSet")
-	 throw DataTypeIException("DataSet::getTypeClass", "H5Tclose failed");
-      else if (fromClass() == "Attribute")
-	 throw DataTypeIException("Attribute::getTypeClass", "H5Tclose failed");
-   }
+    // Close temporary datatype_id
+    herr_t ret_value = H5Tclose(datatype_id);
+    if (ret_value < 0)
+    {
+        if (fromClass() == "DataSet")
+            throw DataTypeIException("DataSet::getTypeClass", "H5Tclose failed");
+        else if (fromClass() == "Attribute")
+            throw DataTypeIException("Attribute::getTypeClass", "H5Tclose failed");
+    }
 
-   // Check on the returned type_class
-   if (type_class == H5T_NO_CLASS)
-   {
-      if (fromClass() == "DataSet")
-	 throw DataTypeIException("DataSet::getTypeClass", "H5Tget_class returns H5T_NO_CLASS");
-      else if (fromClass() == "Attribute")
-	 throw DataTypeIException("Attribute::getTypeClass", "H5Tget_class returns H5T_NO_CLASS");
-   }
-   return(type_class);
+    // Check on the returned type_class
+    if (type_class == H5T_NO_CLASS)
+    {
+        if (fromClass() == "DataSet")
+            throw DataTypeIException("DataSet::getTypeClass", "H5Tget_class returns H5T_NO_CLASS");
+        else if (fromClass() == "Attribute")
+            throw DataTypeIException("Attribute::getTypeClass", "H5Tget_class returns H5T_NO_CLASS");
+    }
+    return(type_class);
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getDataType
-///\brief	Returns the generic datatype of this abstract dataset, which
-///		can be a dataset or an attribute.
-///\return	DataType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getDataType
+///\brief       Returns the generic datatype of this abstract dataset, which
+///             can be a dataset or an attribute.
+///\return      DataType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataType AbstractDs::getDataType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getDataType.  Then, create and
-   // return the DataType object
-   try {
-	DataType datatype;
-	f_DataType_setId(&datatype, p_get_type());
-	return(datatype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getDataType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getDataType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getDataType.  Then, create and
+    // return the DataType object
+    try {
+        DataType datatype;
+        f_DataType_setId(&datatype, p_get_type());
+        return(datatype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getDataType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getDataType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getArrayType
-///\brief	Returns the array datatype of this abstract dataset which
-///		can be a dataset or an attribute.
-///\return	ArrayType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    AbstractDs::getArrayType
+///\brief       Returns the array datatype of this abstract dataset which
+///             can be a dataset or an attribute.
+///\return      ArrayType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
 ArrayType AbstractDs::getArrayType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getArrayType.  Then, create and
-   // return the ArrayType object
-   try {
-	// Create ArrayType and set values this way to work around the
-	// problem described in the JIRA issue HDFFV-7947
-	ArrayType arraytype;
-	f_DataType_setId(&arraytype, p_get_type());
-	arraytype.setArrayInfo();
-	return(arraytype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getArrayType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getArrayType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getArrayType.  Then, create and
+    // return the ArrayType object
+    try {
+        // Create ArrayType and set values this way to work around the
+        // problem described in the JIRA issue HDFFV-7947
+        ArrayType arraytype;
+        f_DataType_setId(&arraytype, p_get_type());
+        return(arraytype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getArrayType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getArrayType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getCompType
-///\brief	Returns the compound datatype of this abstract dataset which
-///		can be a dataset or an attribute.
-///\return	CompType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getCompType
+///\brief       Returns the compound datatype of this abstract dataset which
+///             can be a dataset or an attribute.
+///\return      CompType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 CompType AbstractDs::getCompType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getCompType.  Then, create and
-   // return the CompType object
-   try {
-	CompType comptype;
-	f_DataType_setId(&comptype, p_get_type());
-	return(comptype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getCompType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getCompType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getCompType.  Then, create and
+    // return the CompType object
+    try {
+        CompType comptype;
+        f_DataType_setId(&comptype, p_get_type());
+        return(comptype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getCompType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getCompType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getEnumType
-///\brief	Returns the enumeration datatype of this abstract dataset which
-///		can be a dataset or an attribute.
-///\return	EnumType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getEnumType
+///\brief       Returns the enumeration datatype of this abstract dataset which
+///             can be a dataset or an attribute.
+///\return      EnumType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 EnumType AbstractDs::getEnumType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getEnumType.  Then, create and
-   // return the EnumType object
-   try {
-	EnumType enumtype;
-	f_DataType_setId(&enumtype, p_get_type());
-	return(enumtype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getEnumType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getEnumType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getEnumType.  Then, create and
+    // return the EnumType object
+    try {
+        EnumType enumtype;
+        f_DataType_setId(&enumtype, p_get_type());
+        return(enumtype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getEnumType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getEnumType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getIntType
-///\brief	Returns the integer datatype of this abstract dataset which
-///		can be a dataset or an attribute.
-///\return	IntType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getIntType
+///\brief       Returns the integer datatype of this abstract dataset which
+///             can be a dataset or an attribute.
+///\return      IntType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 IntType AbstractDs::getIntType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getIntType.  Then, create and
-   // return the IntType object
-   try {
-	IntType inttype;
-	f_DataType_setId(&inttype, p_get_type());
-	return(inttype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getIntType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getIntType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getIntType.  Then, create and
+    // return the IntType object
+    try {
+        IntType inttype;
+        f_DataType_setId(&inttype, p_get_type());
+        return(inttype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getIntType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getIntType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getFloatType
-///\brief	Returns the floating-point datatype of this abstract dataset,
-///		which can be a dataset or an attribute.
-///\return	FloatType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getFloatType
+///\brief       Returns the floating-point datatype of this abstract dataset,
+///             which can be a dataset or an attribute.
+///\return      FloatType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FloatType AbstractDs::getFloatType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getFloatType.  Then, create and
-   // return the FloatType object
-   try {
-	FloatType floatype;
-	f_DataType_setId(&floatype, p_get_type());
-	return(floatype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getFloatType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getFloatType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getFloatType.  Then, create and
+    // return the FloatType object
+    try {
+        FloatType floatype;
+        f_DataType_setId(&floatype, p_get_type());
+        return(floatype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getFloatType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getFloatType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getStrType
-///\brief	Returns the string datatype of this abstract dataset which
-///		can be a dataset or an attribute.
-///\return	StrType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs::getStrType
+///\brief       Returns the string datatype of this abstract dataset which
+///             can be a dataset or an attribute.
+///\return      StrType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 StrType AbstractDs::getStrType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getStrType.  Then, create and
-   // return the StrType object
-   try {
-	StrType strtype;
-	f_DataType_setId(&strtype, p_get_type());
-	return(strtype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getStrType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getStrType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getStrType.  Then, create and
+    // return the StrType object
+    try {
+        StrType strtype;
+        f_DataType_setId(&strtype, p_get_type());
+        return(strtype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getStrType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getStrType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs::getVarLenType
-///\brief	Returns the floating-point datatype of this abstract dataset,
-///		which can be a dataset or an attribute.
-///\return	VarLenType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    AbstractDs::getVarLenType
+///\brief       Returns the floating-point datatype of this abstract dataset,
+///             which can be a dataset or an attribute.
+///\return      VarLenType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
 VarLenType AbstractDs::getVarLenType() const
 {
-   // Gets the id of the datatype used by this dataset or attribute using
-   // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
-   // depending on which object invokes getVarLenType.  Then, create and
-   // return the VarLenType object
-   try {
-	VarLenType varlentype;
-	f_DataType_setId(&varlentype, p_get_type());
-	return(varlentype);
-   }
-   catch (DataSetIException E) {
-      throw DataTypeIException("DataSet::getVarLenType", E.getDetailMsg());
-   }
-   catch (AttributeIException E) {
-      throw DataTypeIException("Attribute::getVarLenType", E.getDetailMsg());
-   }
+    // Gets the id of the datatype used by this dataset or attribute using
+    // p_get_type.  p_get_type calls either H5Dget_type or H5Aget_type
+    // depending on which object invokes getVarLenType.  Then, create and
+    // return the VarLenType object
+    try {
+        VarLenType varlentype;
+        f_DataType_setId(&varlentype, p_get_type());
+        return(varlentype);
+    }
+    catch (DataSetIException& E) {
+        throw DataTypeIException("DataSet::getVarLenType", E.getDetailMsg());
+    }
+    catch (AttributeIException& E) {
+        throw DataTypeIException("Attribute::getVarLenType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AbstractDs destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AbstractDs destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 AbstractDs::~AbstractDs() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5AbstractDs.h b/c++/src/H5AbstractDs.h
index 6975d6f..73a18b8 100644
--- a/c++/src/H5AbstractDs.h
+++ b/c++/src/H5AbstractDs.h
@@ -6,20 +6,16 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __AbstractDs_H
 #define __AbstractDs_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 class ArrayType;
 class CompType;
@@ -39,44 +35,44 @@ class DataSpace;
 */
 class H5_DLLCPP AbstractDs {
    public:
-	// Gets a copy the datatype of that this abstract dataset uses.
-	// Note that this datatype is a generic one and can only be accessed
-	// via generic member functions, i.e., member functions belong
-	// to DataType.  To get specific datatype, i.e. EnumType, FloatType,
-	// etc..., use the specific functions, that follow, instead.
-	DataType getDataType() const;
+        // Gets a copy the datatype of that this abstract dataset uses.
+        // Note that this datatype is a generic one and can only be accessed
+        // via generic member functions, i.e., member functions belong
+        // to DataType.  To get specific datatype, i.e. EnumType, FloatType,
+        // etc..., use the specific functions, that follow, instead.
+        DataType getDataType() const;
 
-	// Gets a copy of the specific datatype of this abstract dataset.
-	ArrayType getArrayType() const;
-	CompType getCompType() const;
-	EnumType getEnumType() const;
-	IntType getIntType() const;
-	FloatType getFloatType() const;
-	StrType getStrType() const;
-	VarLenType getVarLenType() const;
+        // Gets a copy of the specific datatype of this abstract dataset.
+        ArrayType getArrayType() const;
+        CompType getCompType() const;
+        EnumType getEnumType() const;
+        IntType getIntType() const;
+        FloatType getFloatType() const;
+        StrType getStrType() const;
+        VarLenType getVarLenType() const;
 
-	///\brief Gets the size in memory of this abstract dataset.
-	virtual size_t getInMemDataSize() const = 0;
+        ///\brief Gets the size in memory of this abstract dataset.
+        virtual size_t getInMemDataSize() const = 0;
 
-	///\brief Gets the dataspace of this abstract dataset - pure virtual.
-	virtual DataSpace getSpace() const = 0;
+        ///\brief Gets the dataspace of this abstract dataset - pure virtual.
+        virtual DataSpace getSpace() const = 0;
 
-	// Gets the class of the datatype that is used by this abstract
-	// dataset.
-	H5T_class_t getTypeClass() const;
+        // Gets the class of the datatype that is used by this abstract
+        // dataset.
+        H5T_class_t getTypeClass() const;
 
-	///\brief Returns the amount of storage size required - pure virtual.
-	virtual hsize_t getStorageSize() const = 0;
+        ///\brief Returns the amount of storage size required - pure virtual.
+        virtual hsize_t getStorageSize() const = 0;
 
-	// Returns this class name - pure virtual.
-	virtual H5std_string fromClass() const = 0;
+        // Returns this class name - pure virtual.
+        virtual H5std_string fromClass() const = 0;
 
-	// Destructor
-	virtual ~AbstractDs();
+        // Destructor
+        virtual ~AbstractDs();
 
    protected:
-	// Default constructor
-	AbstractDs();
+        // Default constructor
+        AbstractDs();
 
         // *** Deprecation warning ***
         // The following two constructors are no longer appropriate after the
@@ -85,16 +81,16 @@ class H5_DLLCPP AbstractDs {
         // other will be removed from 1.10 release, and then from 1.8 if its
         // removal does not raise any problems in two 1.10 releases.
 
-	// Mar 2016 -BMR, AbstractDs(const hid_t h5_id);
+        // Mar 2016 -BMR, AbstractDs(const hid_t h5_id);
 
-	// Copy constructor
-	// AbstractDs( const AbstractDs& original );
+        // Copy constructor
+        // AbstractDs( const AbstractDs& original );
 
    private:
-	// This member function is implemented by DataSet and Attribute - pure virtual.
-	virtual hid_t p_get_type() const = 0;
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+        // This member function is implemented by DataSet and Attribute - pure virtual.
+        virtual hid_t p_get_type() const = 0;
+
+}; // end of AbstractDs
+} // namespace H5
+
 #endif // __AbstractDs_H
diff --git a/c++/src/H5Alltypes.h b/c++/src/H5Alltypes.h
index b1d792d..d67f3fe 100644
--- a/c++/src/H5Alltypes.h
+++ b/c++/src/H5Alltypes.h
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 // This header file simply serves as a container to hold the
@@ -24,6 +22,6 @@
 #include "H5IntType.h"
 #include "H5FloatType.h"
 #include "H5StrType.h"
-#include "H5CompType.h"
 #include "H5ArrayType.h"
 #include "H5VarLenType.h"
+#include "H5CompType.h"
diff --git a/c++/src/H5ArrayType.cpp b/c++/src/H5ArrayType.cpp
index 9731a13..9d4a973 100644
--- a/c++/src/H5ArrayType.cpp
+++ b/c++/src/H5ArrayType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,87 +17,108 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5ArrayType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType default constructor
-///\brief	Default constructor: Creates a stub ArrayType
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType default constructor
+///\brief       Default constructor: Creates a stub ArrayType
+// Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
-ArrayType::ArrayType() : DataType(), rank(-1), dimensions(NULL) {}
+ArrayType::ArrayType() : DataType() {}
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType overloaded constructor
-///\brief	Creates an ArrayType object using an existing id.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType overloaded constructor
+///\brief       Creates an ArrayType object using an existing id.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
-ArrayType::ArrayType( const hid_t existing_id ) : DataType( existing_id )
-{
-    setArrayInfo();
-}
+ArrayType::ArrayType(const hid_t existing_id) : DataType(existing_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType copy constructor
-///\brief	Copy constructor: makes a copy of the original ArrayType object.
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType copy constructor
+///\brief       Copy constructor: makes a copy of the original ArrayType object.
+// Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
-ArrayType::ArrayType( const ArrayType& original ) : DataType( original ), rank(original.rank)
-{
-    // Allocate space then copy the dimensions from the original array
-    dimensions = new hsize_t[rank];
-    for (int i = 0; i < rank; i++)
-	dimensions[i] = original.dimensions[i];
-}
+ArrayType::ArrayType(const ArrayType& original) : DataType(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType overloaded constructor
-///\brief	Creates a new array data type based on the specified
-///		\a base_type.
-///\param	base_type - IN: Existing datatype
-///\param	ndims     - IN: Rank of the array, [0..H5S_MAX_RANK]
-///\param	dims      - IN: Size of each array dimension
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType overloaded constructor
+///\brief       Creates a new array data type based on the specified
+///             \a base_type.
+///\param       base_type - IN: Existing datatype
+///\param       ndims     - IN: Rank of the array, [0..H5S_MAX_RANK]
+///\param       dims      - IN: Size of each array dimension
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
 ArrayType::ArrayType(const DataType& base_type, int ndims, const hsize_t* dims) : DataType()
 {
     // Call C API to create an array data type
     hid_t new_type_id = H5Tarray_create2(base_type.getId(), ndims, dims);
     if (new_type_id < 0)
-	throw DataTypeIException("ArrayType constructor", "H5Tarray_create2 failed");
+        throw DataTypeIException("ArrayType constructor", "H5Tarray_create2 failed");
 
-    // Set the id and rank for this object
+    // Set the id for this object
     id = new_type_id;
-    rank = ndims;
+}
 
-    // Allocate space then set the dimensions as provided by caller
-    dimensions = new hsize_t[rank];
-    for (int i = 0; i < rank; i++)
-	dimensions[i] = dims[i];
+//--------------------------------------------------------------------------
+// Function:    ArrayType overloaded constructor
+///\brief       Creates an ArrayType instance by opening an HDF5 array datatype
+///             given its name, provided as a C character string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Array type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openArrayType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+ArrayType::ArrayType(const H5Location& loc, const char *dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name);
+}
+
+//--------------------------------------------------------------------------
+// Function:    ArrayType overloaded constructor
+///\brief       Creates an ArrayType instance by opening an HDF5 array datatype
+///             given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Array type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openArrayType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+ArrayType::ArrayType(const H5Location& loc, const H5std_string& dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType::operator=
-///\brief	Assignment operator
-///\param	rhs - IN: Reference to the existing array datatype
-///\return	Reference to ArrayType instance
-///\exception	H5::DataTypeIException
-///		std::bad_alloc
+// Function:    ArrayType::operator=
+///\brief       Assignment operator
+///\param       rhs - IN: Reference to the existing array datatype
+///\return      Reference to ArrayType instance
+///\exception   H5::DataTypeIException
 // Description
-// 		Closes the id on the lhs object first with setId, then copies
-//		each data member from the rhs object.
-// Programmer	Binh-Minh Ribler - Mar 2016
+//              Closes the id on the lhs object first with setId, then copies
+//              each data member from the rhs object. (Issue HDFFV-9562)
+// Programmer   Binh-Minh Ribler - Mar 2016
 // Modification
 //--------------------------------------------------------------------------
 ArrayType& ArrayType::operator=(const ArrayType& rhs)
@@ -112,130 +131,62 @@ ArrayType& ArrayType::operator=(const ArrayType& rhs)
             // Note: a = b, so there are two objects with the same hdf5 id
             // that's why incRefCount is needed, and it is called by setId
         }
-        catch (Exception close_error) {
+        catch (Exception& close_error) {
             throw DataTypeIException(inMemFunc("operator="), close_error.getDetailMsg());
         }
-
-	// Copy the rank of the rhs array
-	rank = rhs.rank;
-
-	// Allocate space then copy the dimensions from the rhs array
-	dimensions = new hsize_t[rank];
-	for (int i = 0; i < rank; i++)
-	    dimensions[i] = rhs.dimensions[i];
     }
     return(*this);
 }
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType::setArrayInfo
-///\brief	Retrieves the rank and dimensions from the array datatype
-///		and store the info in this ArrayType object.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - January 2016
+// Function:    ArrayType::getArrayNDims
+///\brief       Returns the number of dimensions for an array datatype.
+///\return      Number of dimensions
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May 2004
+// Modification
+//      Apr, 2016
+//              Became const.
 //--------------------------------------------------------------------------
-void ArrayType::setArrayInfo()
+int ArrayType::getArrayNDims() const
 {
     // Get the rank of the array type specified by id from the C API
     int ndims = H5Tget_array_ndims(id);
     if (ndims < 0)
     {
-	throw DataTypeIException("ArrayType::setArrayInfo", "H5Tget_array_ndims failed");
-    }
-
-    // Get the dimensions from the C API
-    hsize_t* dims;
-    dims = new hsize_t[ndims];
-    if (dims != NULL)
-    {
-	// Get the dimensions
-	ndims = H5Tget_array_dims2(id, dims);
-	if (ndims < 0)
-	    throw DataTypeIException("ArrayType::setArrayInfo", "H5Tget_array_dims2 failed");
-
-	// Store the array's info in memory
-	rank = ndims;
-	dimensions = new hsize_t[rank];
-	for (int i = 0; i < rank; i++)
-	    dimensions[i] = dims[i];
-	delete []dims;
+        throw DataTypeIException("ArrayType::getArrayNDims", "H5Tget_array_ndims failed");
     }
-} // setArrayInfo
-
-//--------------------------------------------------------------------------
-// Function:	ArrayType::getArrayNDims
-///\brief	Returns the number of dimensions for an array datatype.
-///\return	Number of dimensions
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May 2004
-// Modification
-//		Modified to use setArrayInfo().
-//		If rank is positive, return rank
-//		If rank is invalid but object has a valid identifier, obtain the
-//		  rank and dimensions, store them in the object, and return rank
-//		Otherwise, i.e., rank is invalid and object doesn't have a
-//		  valid identifier, throw an exception
-//--------------------------------------------------------------------------
-int ArrayType::getArrayNDims()
-{
-    // Validate the id first, this object could be a default object
-    if (!p_valid_id(id))
-	throw DataTypeIException("ArrayType::getArrayNDims", "ArrayType object is not a valid array type.");
 
-    // If the array's info has not been stored, i.e. "rank" still has its
-    // initial value, -1, and "dimensions" is still NULL, retrieve rank and
-    // dimensions via the C API and store them in this ArrayType object.
-    if (rank < 0 && dimensions == NULL)
-	setArrayInfo();
-
-    return(rank);
+    return(ndims);
 }
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType::getArrayDims
-///\brief	Retrieves the size of all dimensions of an array datatype.
-///\param	dims - OUT: Sizes of dimensions
-///\return	Number of dimensions
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType::getArrayDims
+///\brief       Retrieves the size of all dimensions of an array datatype.
+///\param       dims - OUT: Sizes of dimensions
+///\return      Number of dimensions
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May 2004
 // Modification
-//	Jan, 2016
-//		Modified to use setArrayInfo().
-//		If the array information has not been stored, retrieve rank and
-//		dimensions of the array type identified by "id" via the C API.
-//		Copy "dimensions" to the user's buffer
+//      Apr, 2016
+//              Became const.
 //--------------------------------------------------------------------------
-int ArrayType::getArrayDims(hsize_t* dims)
+int ArrayType::getArrayDims(hsize_t* dims) const
 {
-    // Validate the id first, this object could be a default object
-    if (!p_valid_id(id))
-	throw DataTypeIException("ArrayType::getArrayDims", "ArrayType object is not a valid array type.");
-
-    // If the array's info has not been stored, i.e. "rank" still has its
-    // initial value, -1, and "dimensions" is still NULL, retrieve rank and
-    // dimensions via the C API and store them in this ArrayType object.
-    if (rank < 0 && dimensions == NULL)
-	setArrayInfo();
-
-    // Copy what's in "dimensions" to user's buffer "dims"
-    for (int i = 0; i < rank; i++)
-	dims[i] = dimensions[i];
+    // Get the dimensions
+    int ndims = H5Tget_array_dims2(id, dims);
+    if (ndims < 0)
+        throw DataTypeIException("ArrayType::getArrayDims", "H5Tget_array_dims2 failed");
 
-    return(rank);
+    // Return the number of dimensions
+    return(ndims);
 }
 
 //--------------------------------------------------------------------------
-// Function:	ArrayType destructor
-///\brief	Properly terminates access to this array datatype.
-// Programmer	Binh-Minh Ribler - May 2004
+// Function:    ArrayType destructor
+///\brief       Properly terminates access to this array datatype.
+// Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
-ArrayType::~ArrayType()
-{
-   // Free allocated memory
-   if (dimensions != NULL)
-      delete []dimensions;
-}
+ArrayType::~ArrayType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5ArrayType.h b/c++/src/H5ArrayType.h
index ddbb5e2..669bdf3 100644
--- a/c++/src/H5ArrayType.h
+++ b/c++/src/H5ArrayType.h
@@ -6,63 +6,59 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5ArrayType_H
 #define __H5ArrayType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class ArrayType
     \brief Class ArrayType inherits from DataType and provides wrappers for
      the HDF5's Array Datatypes.
 */
+//  Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP ArrayType : public DataType {
    public:
-	// Constructor that creates a new array data type based on the
-	// specified base type.
-	ArrayType(const DataType& base_type, int ndims, const hsize_t* dims);
+        // Constructor that creates a new array data type based on the
+        // specified base type.
+        ArrayType(const DataType& base_type, int ndims, const hsize_t* dims);
 
-	// Assignment operator
-	ArrayType& operator=(const ArrayType& rhs);
+        // Assignment operator
+        ArrayType& operator=(const ArrayType& rhs);
 
-	// Stores the rank and dimensions in memory.
-	void setArrayInfo();
+        // Constructors that open an array datatype, given a location.
+        ArrayType(const H5Location& loc, const char* name);
+        ArrayType(const H5Location& loc, const H5std_string& name);
 
-	// Returns the number of dimensions of this array datatype.
-	int getArrayNDims();
+        // Returns the number of dimensions of this array datatype.
+        int getArrayNDims() const;
+        //int getArrayNDims(); // removed 1.8.18 and 1.10.1
 
-	// Returns the sizes of dimensions of this array datatype.
-	int getArrayDims(hsize_t* dims);
+        // Returns the sizes of dimensions of this array datatype.
+        int getArrayDims(hsize_t* dims) const;
+        //int getArrayDims(hsize_t* dims); // removed 1.8.18 and 1.10.1
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("ArrayType"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("ArrayType"); }
 
-	// Copy constructor: makes copy of the original object.
-	ArrayType( const ArrayType& original );
+        // Copy constructor: makes copy of the original object.
+        ArrayType(const ArrayType& original);
 
-	// Constructor that takes an existing id
-	ArrayType( const hid_t existing_id );
+        // Constructor that takes an existing id
+        ArrayType(const hid_t existing_id);
 
-	// Noop destructor
-	virtual ~ArrayType();
+        // Noop destructor
+        virtual ~ArrayType();
 
-	// Default constructor
-	ArrayType();
+        // Default constructor
+        ArrayType();
+
+}; // end of ArrayType
+} // namespace H5
 
-   private:
-	int rank;		// Rank of the array
-	hsize_t* dimensions;	// Sizes of the array dimensions
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5ArrayType_H
diff --git a/c++/src/H5AtomType.cpp b/c++/src/H5AtomType.cpp
index 90c2ae3..9fe7608 100644
--- a/c++/src/H5AtomType.cpp
+++ b/c++/src/H5AtomType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,282 +17,279 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AtomType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	AtomType default constructor [protected]
-// Purpose	Default constructor: creates a stub atomic datatype.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType default constructor [protected]
+// Purpose      Default constructor: creates a stub atomic datatype.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 AtomType::AtomType() : DataType() {}
 
 //--------------------------------------------------------------------------
-// Function:	AtomType overloaded constructor [protected]
-// Purpose	Creates an AtomType object using an existing id.
-// Parameter	existing_id - IN: Id of an existing datatype
-// Exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType overloaded constructor [protected]
+// Purpose      Creates an AtomType object using an existing id.
+// Parameter    existing_id - IN: Id of an existing datatype
+// Exception    H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-AtomType::AtomType( const hid_t existing_id ) : DataType( existing_id ) {}
+AtomType::AtomType(const hid_t existing_id) : DataType(existing_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	AtomType copy constructor
-///\brief	Copy constructor: makes a copy of the original AtomType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType copy constructor
+///\brief       Copy constructor: makes a copy of the original AtomType object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-AtomType::AtomType( const AtomType& original ) : DataType( original ) {}
+AtomType::AtomType(const AtomType& original) : DataType(original) {}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::setSize
-///\brief	Sets the total size for an atomic datatype.
-///\param	size - IN: Size to set
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType::setSize
+///\brief       Sets the total size for an atomic datatype.
+///\param       size - IN: Size to set
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::setSize( size_t size ) const
+void AtomType::setSize(size_t size) const
 {
-   // Call C routine H5Tset_size to set the total size
-   herr_t ret_value = H5Tset_size( id, size );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setSize"), "H5Tset_size failed");
-   }
+    // Call C routine H5Tset_size to set the total size
+    herr_t ret_value = H5Tset_size(id, size);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setSize"), "H5Tset_size failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::getOrder
-///\brief	Returns the byte order of an atomic datatype.
-///\return	Byte order, which can be:
-///		\li \c H5T_ORDER_LE
-///		\li \c H5T_ORDER_BE
-///		\li \c H5T_ORDER_VAX
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    AtomType::getOrder
+///\brief       Returns the byte order of an atomic datatype.
+///\return      Byte order, which can be:
+///             \li \c H5T_ORDER_LE
+///             \li \c H5T_ORDER_BE
+///             \li \c H5T_ORDER_VAX
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Mar, 2005
 //--------------------------------------------------------------------------
 H5T_order_t AtomType::getOrder() const
 {
-   // Call C routine to get the byte ordering
-   H5T_order_t type_order = H5Tget_order( id );
+    // Call C routine to get the byte ordering
+    H5T_order_t type_order = H5Tget_order(id);
 
-   // return a byte order constant if successful
-   if( type_order == H5T_ORDER_ERROR )
-   {
-      throw DataTypeIException(inMemFunc("getOrder"),
-		"H5Tget_order returns H5T_ORDER_ERROR");
-   }
-   return( type_order );
+    // return a byte order constant if successful
+    if (type_order == H5T_ORDER_ERROR)
+    {
+        throw DataTypeIException(inMemFunc("getOrder"),
+             "H5Tget_order returns H5T_ORDER_ERROR");
+    }
+   return(type_order);
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::getOrder
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes a reference to a \c H5std_string for the buffer that
-///		provide the text description of the returned byte order.
-///		The text description can be either of the following:
-///		"Little endian byte ordering (0)";
-///		"Big endian byte ordering (1)";
-///		"VAX mixed byte ordering (2)";
-///\param	order_string - OUT: Text description of the returned byte order
-///\return	Byte order, which can be:
-///		\li \c H5T_ORDER_LE
-///		\li \c H5T_ORDER_BE
-///		\li \c H5T_ORDER_VAX
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType::getOrder
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes a reference to a \c H5std_string for the buffer that
+///             provide the text description of the returned byte order.
+///             The text description can be either of the following:
+///             "Little endian byte ordering (0)";
+///             "Big endian byte ordering (1)";
+///             "VAX mixed byte ordering (2)";
+///\param       order_string - OUT: Text description of the returned byte order
+///\return      Byte order, which can be:
+///             \li \c H5T_ORDER_LE
+///             \li \c H5T_ORDER_BE
+///             \li \c H5T_ORDER_VAX
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5T_order_t AtomType::getOrder( H5std_string& order_string ) const
+H5T_order_t AtomType::getOrder(H5std_string& order_string) const
 {
-   // Call the overloaded to get the type order without text
-   H5T_order_t type_order = getOrder();
+    // Call the overloaded to get the type order without text
+    H5T_order_t type_order = getOrder();
 
-   // Then provide the text and return the type order
-   if( type_order == H5T_ORDER_LE )
-      order_string = "Little endian byte ordering (0)";
-   else if( type_order == H5T_ORDER_BE )
-      order_string = "Big endian byte ordering (1)";
-   else if( type_order == H5T_ORDER_VAX )
-      order_string = "VAX mixed byte ordering (2)";
-   return( type_order );
+    // Then provide the text and return the type order
+    if (type_order == H5T_ORDER_LE)
+        order_string = "Little endian byte ordering (0)";
+    else if (type_order == H5T_ORDER_BE)
+        order_string = "Big endian byte ordering (1)";
+    else if (type_order == H5T_ORDER_VAX)
+        order_string = "VAX mixed byte ordering (2)";
+    return(type_order);
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::setOrder
-///\brief	Sets the byte ordering of an atomic datatype.
-///\param	order - IN: Byte ordering constant, which can be:
-///		\li \c H5T_ORDER_LE
-///		\li \c H5T_ORDER_BE
-///		\li \c H5T_ORDER_VAX
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType::setOrder
+///\brief       Sets the byte ordering of an atomic datatype.
+///\param       order - IN: Byte ordering constant, which can be:
+///             \li \c H5T_ORDER_LE
+///             \li \c H5T_ORDER_BE
+///             \li \c H5T_ORDER_VAX
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::setOrder( H5T_order_t order ) const
+void AtomType::setOrder(H5T_order_t order) const
 {
-   // Call C routine to set the byte ordering
-   herr_t ret_value = H5Tset_order( id, order );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setOrder"), "H5Tset_order failed");
-   }
+    // Call C routine to set the byte ordering
+    herr_t ret_value = H5Tset_order(id, order);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setOrder"), "H5Tset_order failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::getPrecision
-///\brief	Returns the precision of an atomic datatype.
-///\return	Number of significant bits
-///\exception	H5::DataTypeIException
+// Function:    AtomType::getPrecision
+///\brief       Returns the precision of an atomic datatype.
+///\return      Number of significant bits
+///\exception   H5::DataTypeIException
 ///\par Description
-///		The precision is the number of significant bits which,
-///		unless padding is present, is 8 times larger than the
-///		value returned by \c DataType::getSize().
-// Programmer	Binh-Minh Ribler - 2000
+///             The precision is the number of significant bits which,
+///             unless padding is present, is 8 times larger than the
+///             value returned by \c DataType::getSize().
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 size_t AtomType::getPrecision() const
 {
-   size_t num_signi_bits = H5Tget_precision( id );  // C routine
+    size_t num_signi_bits = H5Tget_precision(id);  // C routine
 
-   // returns number of significant bits if successful
-   if( num_signi_bits == 0 )
-   {
-      throw DataTypeIException(inMemFunc("getPrecision"),
-		"H5Tget_precision returns invalid number of significant bits");
-   }
-   return( num_signi_bits );
+    // returns number of significant bits if successful
+    if (num_signi_bits == 0)
+    {
+        throw DataTypeIException(inMemFunc("getPrecision"),
+             "H5Tget_precision returns invalid number of significant bits");
+    }
+    return(num_signi_bits);
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::setPrecision
-///\brief	Sets the precision of an atomic datatype.
-///\param	precision - IN: Number of bits of precision
-///\exception	H5::DataTypeIException
+// Function:    AtomType::setPrecision
+///\brief       Sets the precision of an atomic datatype.
+///\param       precision - IN: Number of bits of precision
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For information, please see C layer Reference Manuat at:
+///             For information, please see C layer Reference Manuat at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5T.html#Datatype-SetPrecision
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::setPrecision( size_t precision ) const
+void AtomType::setPrecision(size_t precision) const
 {
-   // Call C routine to set the datatype precision
-   herr_t ret_value = H5Tset_precision( id, precision );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setPrecision"), "H5Tset_precision failed");
-   }
+    // Call C routine to set the datatype precision
+    herr_t ret_value = H5Tset_precision(id, precision);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setPrecision"), "H5Tset_precision failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::getOffset
-///\brief	Retrieves the bit offset of the first significant bit.
-///\return	Offset value
-///\exception	H5::DataTypeIException
+// Function:    AtomType::getOffset
+///\brief       Retrieves the bit offset of the first significant bit.
+///\return      Offset value
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For information, please see C layer Reference Manuat at:
+///             For information, please see C layer Reference Manuat at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5T.html#Datatype-GetOffset
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		12/05/00: due to C API change
-//			- return type changed from size_t to int
-//			- offset = -1 when failure occurs vs. 0
+//              12/05/00: due to C API change
+//                  - return type changed from size_t to int
+//                  - offset = -1 when failure occurs vs. 0
 //--------------------------------------------------------------------------
 int AtomType::getOffset() const
 {
-   int offset = H5Tget_offset( id );  // C routine
+    int offset = H5Tget_offset(id);  // C routine
 
-   // returns a non-negative offset value if successful
-   if( offset == -1 )
-   {
-      throw DataTypeIException(inMemFunc("getOffset"),
-		"H5Tget_offset returns a negative offset value");
-   }
-   return( offset );
+    // returns a non-negative offset value if successful
+    if (offset == -1)
+    {
+        throw DataTypeIException(inMemFunc("getOffset"),
+             "H5Tget_offset returns a negative offset value");
+    }
+    return(offset);
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::setOffset
-///\brief	Sets the bit offset of the first significant bit.
-///\param	offset - IN: Offset of first significant bit
-///\exception	H5::DataTypeIException
+// Function:    AtomType::setOffset
+///\brief       Sets the bit offset of the first significant bit.
+///\param       offset - IN: Offset of first significant bit
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For information, please see C layer Reference Manuat at:
+///             For information, please see C layer Reference Manuat at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5T.html#Datatype-SetOffset
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::setOffset( size_t offset ) const
+void AtomType::setOffset(size_t offset) const
 {
-   // Call C routine to set the bit offset
-   herr_t ret_value = H5Tset_offset( id, offset );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setOffset"), "H5Tset_offset failed");
-   }
+    // Call C routine to set the bit offset
+    herr_t ret_value = H5Tset_offset(id, offset);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setOffset"), "H5Tset_offset failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::getPad
-///\brief	Retrieves the padding type of the least and most-significant
-///		bit padding.
-///\param	lsb - OUT: Least-significant bit padding type
-///\param	msb - OUT: Most-significant bit padding type
-///\exception	H5::DataTypeIException
+// Function:    AtomType::getPad
+///\brief       Retrieves the padding type of the least and most-significant
+///             bit padding.
+///\param       lsb - OUT: Least-significant bit padding type
+///\param       msb - OUT: Most-significant bit padding type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		Possible values for \a lsb and \a msb include:
-///		\li \c H5T_PAD_ZERO (0) - Set background to zeros.
-///		\li \c H5T_PAD_ONE (1) - Set background to ones.
-///		\li \c H5T_PAD_BACKGROUND (2) - Leave background alone.
-// Programmer	Binh-Minh Ribler - 2000
+///             Possible values for \a lsb and \a msb include:
+///             \li \c H5T_PAD_ZERO (0) - Set background to zeros.
+///             \li \c H5T_PAD_ONE (1) - Set background to ones.
+///             \li \c H5T_PAD_BACKGROUND (2) - Leave background alone.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::getPad( H5T_pad_t& lsb, H5T_pad_t& msb ) const
+void AtomType::getPad(H5T_pad_t& lsb, H5T_pad_t& msb) const
 {
-   // Call C routine to get the padding type
-   herr_t ret_value = H5Tget_pad( id, &lsb, &msb );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("getPad"), "H5Tget_pad failed");
-   }
+    // Call C routine to get the padding type
+    herr_t ret_value = H5Tget_pad(id, &lsb, &msb);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("getPad"), "H5Tget_pad failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	AtomType::setPad
-///\brief	Sets the least and most-significant bits padding types.
-///\param	lsb - IN: Least-significant bit padding type
-///\param	msb - IN: Most-significant bit padding type
-///\exception	H5::DataTypeIException
+// Function:    AtomType::setPad
+///\brief       Sets the least and most-significant bits padding types.
+///\param       lsb - IN: Least-significant bit padding type
+///\param       msb - IN: Most-significant bit padding type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		Valid values for \a lsb and \a msb include:
-///		\li \c H5T_PAD_ZERO (0) - Set background to zeros.
-///		\li \c H5T_PAD_ONE (1) - Set background to ones.
-///		\li \c H5T_PAD_BACKGROUND (2) - Leave background alone.
-// Programmer	Binh-Minh Ribler - 2000
+///             Valid values for \a lsb and \a msb include:
+///             \li \c H5T_PAD_ZERO (0) - Set background to zeros.
+///             \li \c H5T_PAD_ONE (1) - Set background to ones.
+///             \li \c H5T_PAD_BACKGROUND (2) - Leave background alone.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void AtomType::setPad( H5T_pad_t lsb, H5T_pad_t msb ) const
+void AtomType::setPad(H5T_pad_t lsb, H5T_pad_t msb) const
 {
-   // Call C routine to set the padding type
-   herr_t ret_value = H5Tset_pad( id, lsb, msb );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setPad"), "H5Tset_pad failed");
-   }
+    // Call C routine to set the padding type
+    herr_t ret_value = H5Tset_pad(id, lsb, msb);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setPad"), "H5Tset_pad failed");
+    }
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	AtomType destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    AtomType destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 AtomType::~AtomType() {}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5AtomType.h b/c++/src/H5AtomType.h
index 792312a..da3df5b 100644
--- a/c++/src/H5AtomType.h
+++ b/c++/src/H5AtomType.h
@@ -6,80 +6,74 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5AtomType_H
 #define __H5AtomType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class AtomType
     \brief AtomType is a base class, inherited by IntType, FloatType,
      StrType, and PredType.
-
-    AtomType provides operations on HDF5 atomic datatypes.  It also inherits
-    from DataType.
 */
+// Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP AtomType : public DataType {
    public:
-	// Returns the byte order of an atomic datatype.
-	H5T_order_t getOrder() const;
-	H5T_order_t getOrder( H5std_string& order_string ) const;
+        // Returns the byte order of an atomic datatype.
+        H5T_order_t getOrder() const;
+        H5T_order_t getOrder(H5std_string& order_string) const;
 
-	// Sets the byte ordering of an atomic datatype.
-	void setOrder( H5T_order_t order ) const;
+        // Sets the byte ordering of an atomic datatype.
+        void setOrder(H5T_order_t order) const;
 
-	// Retrieves the bit offset of the first significant bit.
-	// 12/05/00 - changed return type to int from size_t - C API
-	int getOffset() const;
+        // Retrieves the bit offset of the first significant bit.
+        // 12/05/00 - changed return type to int from size_t - C API
+        int getOffset() const;
 
-	// Sets the bit offset of the first significant bit.
-	void setOffset( size_t offset ) const;
+        // Sets the bit offset of the first significant bit.
+        void setOffset(size_t offset) const;
 
-	// Retrieves the padding type of the least and most-significant bit padding.
-	void getPad( H5T_pad_t& lsb, H5T_pad_t& msb ) const;
+        // Retrieves the padding type of the least and most-significant bit padding.
+        void getPad(H5T_pad_t& lsb, H5T_pad_t& msb) const;
 
-	// Sets the least and most-significant bits padding types
-	void setPad( H5T_pad_t lsb, H5T_pad_t msb ) const;
+        // Sets the least and most-significant bits padding types
+        void setPad(H5T_pad_t lsb, H5T_pad_t msb) const;
 
-	// Returns the precision of an atomic datatype.
-	size_t getPrecision() const;
+        // Returns the precision of an atomic datatype.
+        size_t getPrecision() const;
 
-	// Sets the precision of an atomic datatype.
-	void setPrecision( size_t precision ) const;
+        // Sets the precision of an atomic datatype.
+        void setPrecision(size_t precision) const;
 
-	// Sets the total size for an atomic datatype.
-	void setSize( size_t size ) const;
+        // Sets the total size for an atomic datatype.
+        void setSize(size_t size) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("AtomType"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("AtomType"); }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Copy constructor - makes copy of the original object
-	AtomType( const AtomType& original );
+        // Copy constructor - makes copy of the original object
+        AtomType(const AtomType& original);
 
-	// Noop destructor
-	virtual ~AtomType();
+        // Noop destructor
+        virtual ~AtomType();
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    protected:
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Default constructor
-	AtomType();
+        // Default constructor
+        AtomType();
 
-	// Constructor that takes an existing id
-	AtomType( const hid_t existing_id );
+        // Constructor that takes an existing id
+        AtomType(const hid_t existing_id);
 #endif // DOXYGEN_SHOULD_SKIP_THIS
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+
+}; // end of AtomType
+} // namespace H5
+
 #endif // __H5AtomType_H
diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp
index 34489fa..cbf3029 100644
--- a/c++/src/H5Attribute.cpp
+++ b/c++/src/H5Attribute.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -20,89 +18,85 @@
 #endif
 #include <string>
 
+#include "H5private.h"             // for HDfree
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5AbstractDs.h"
 #include "H5FaccProp.h"
 #include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
+#include "H5AbstractDs.h"
 #include "H5DataType.h"
 #include "H5DataSpace.h"
-#include "H5File.h"
 #include "H5Attribute.h"
-#include "H5private.h"		// for HDfree
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
 class H5_DLLCPP H5Object;  // forward declaration for UserData4Aiterate
 
 //--------------------------------------------------------------------------
-// Function:	Attribute default constructor
-///\brief	Default constructor: Creates a stub attribute
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    Attribute default constructor
+///\brief       Default constructor: Creates a stub attribute
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
-Attribute::Attribute() : AbstractDs(), IdComponent(), id(H5I_INVALID_HID) {}
+Attribute::Attribute() : AbstractDs(), H5Location(), id(H5I_INVALID_HID) {}
 
 //--------------------------------------------------------------------------
-// Function:	Attribute copy constructor
-///\brief	Copy constructor: makes a copy of the original Attribute object.
-///\param	original  - IN: Original Attribute object to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute copy constructor
+///\brief       Copy constructor: makes a copy of the original Attribute object.
+///\param       original  - IN: Original Attribute object to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-Attribute::Attribute(const Attribute& original) : AbstractDs(), IdComponent(), id(original.id)
+Attribute::Attribute(const Attribute& original) : AbstractDs(), H5Location(), id(original.id)
 {
     incRefCount(); // increment number of references to this id
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute overloaded constructor
-///\brief	Creates an Attribute object using the id of an existing
-///		attribute.
-///\param	existing_id - IN: Id of an existing attribute
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute overloaded constructor
+///\brief       Creates an Attribute object using the id of an existing
+///             attribute.
+///\param       existing_id - IN: Id of an existing attribute
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-Attribute::Attribute(const hid_t existing_id) : AbstractDs(), IdComponent(), id(existing_id)
+Attribute::Attribute(const hid_t existing_id) : AbstractDs(), H5Location(), id(existing_id)
 {
     incRefCount(); // increment number of references to this id
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::write
-///\brief	Writes data to this attribute.
-///\param	mem_type  - IN: Attribute datatype (in memory)
-///\param	buf       - IN: Data to be written
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute::write
+///\brief       Writes data to this attribute.
+///\param       mem_type  - IN: Attribute datatype (in memory)
+///\param       buf       - IN: Data to be written
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void Attribute::write( const DataType& mem_type, const void *buf ) const
+void Attribute::write(const DataType& mem_type, const void *buf) const
 {
-   herr_t ret_value = H5Awrite( id, mem_type.getId(), buf );
-   if( ret_value < 0 )
-   {
-      throw AttributeIException("Attribute::write", "H5Awrite failed");
-   }
+   herr_t ret_value = H5Awrite(id, mem_type.getId(), buf);
+   if (ret_value < 0)
+    {
+        throw AttributeIException("Attribute::write", "H5Awrite failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::write
-///\brief	This is an overloaded member function, provided for convenience.
-///		It writes a \a H5std_string to this attribute.
-///\param	mem_type  - IN: Attribute datatype (in memory)
-///\param	strg      - IN: Data to be written
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Apr, 2003
+// Function:    Attribute::write
+///\brief       This is an overloaded member function, provided for convenience.
+///             It writes a \a H5std_string to this attribute.
+///\param       mem_type  - IN: Attribute datatype (in memory)
+///\param       strg      - IN: Data to be written
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Apr, 2003
 //--------------------------------------------------------------------------
 void Attribute::write(const DataType& mem_type, const H5std_string& strg) const
 {
@@ -111,7 +105,7 @@ void Attribute::write(const DataType& mem_type, const H5std_string& strg) const
     htri_t is_variable_len = H5Tis_variable_str(mem_type.getId());
     if (is_variable_len < 0)
     {
-	throw AttributeIException("Attribute::write", "H5Tis_variable_str failed");
+        throw AttributeIException("Attribute::write", "H5Tis_variable_str failed");
     }
     // Convert string to C-string
     const char* strg_C;
@@ -121,55 +115,55 @@ void Attribute::write(const DataType& mem_type, const H5std_string& strg) const
     // Pass string in differently depends on variable or fixed length
     if (!is_variable_len)
     {
-	ret_value = H5Awrite(id, mem_type.getId(), strg_C);
+        ret_value = H5Awrite(id, mem_type.getId(), strg_C);
     }
     else
     {
-	// passing third argument by address
-	ret_value = H5Awrite(id, mem_type.getId(), &strg_C);
+        // passing third argument by address
+        ret_value = H5Awrite(id, mem_type.getId(), &strg_C);
     }
     if (ret_value < 0)
     {
-	throw AttributeIException("Attribute::write", "H5Awrite failed");
+        throw AttributeIException("Attribute::write", "H5Awrite failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::read
-///\brief	Reads data from this attribute.
-///\param	mem_type -  IN: Attribute datatype (in memory)
-///\param	buf      - OUT: Buffer for read data
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute::read
+///\brief       Reads data from this attribute.
+///\param       mem_type -  IN: Attribute datatype (in memory)
+///\param       buf      - OUT: Buffer for read data
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void Attribute::read( const DataType& mem_type, void *buf ) const
+void Attribute::read(const DataType& mem_type, void *buf) const
 {
-   herr_t ret_value = H5Aread( id, mem_type.getId(), buf );
-   if( ret_value < 0 )
-   {
-      throw AttributeIException("Attribute::read", "H5Aread failed");
-   }
+   herr_t ret_value = H5Aread(id, mem_type.getId(), buf);
+   if (ret_value < 0)
+    {
+        throw AttributeIException("Attribute::read", "H5Aread failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::read
-///\brief	This is an overloaded member function, provided for convenience.
-///		It reads a \a H5std_string from this attribute.
-///\param	mem_type  - IN: Attribute datatype (in memory)
-///\param	strg      - IN: Buffer for read string
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Apr, 2003
+// Function:    Attribute::read
+///\brief       This is an overloaded member function, provided for convenience.
+///             It reads a \a H5std_string from this attribute.
+///\param       mem_type  - IN: Attribute datatype (in memory)
+///\param       strg      - IN: Buffer for read string
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Apr, 2003
 // Modification
-//	Mar 2008
-//		Corrected a misunderstanding that H5Aread would allocate
-//		space for the buffer.  Obtained the attribute size and
-//		allocated memory properly. -BMR
-//	Apr 2009
-//		Used getInMemDataSize to get attribute data size. -BMR
-//	Jul 2009
-//		Divided into specific private functions for fixed- and
-//		variable-len string data: p_read_fixed_len and
-//		p_read_variable_len.  This should improve readability. -BMR
+//      Mar 2008
+//              Corrected a misunderstanding that H5Aread would allocate
+//              space for the buffer.  Obtained the attribute size and
+//              allocated memory properly. -BMR
+//      Apr 2009
+//              Used getInMemDataSize to get attribute data size. -BMR
+//      Jul 2009
+//              Divided into specific private functions for fixed- and
+//              variable-len string data: p_read_fixed_len and
+//              p_read_variable_len.  This should improve readability. -BMR
 //--------------------------------------------------------------------------
 void Attribute::read(const DataType& mem_type, H5std_string& strg) const
 {
@@ -192,11 +186,11 @@ void Attribute::read(const DataType& mem_type, H5std_string& strg) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getInMemDataSize
-///\brief	Gets the size in memory of the attribute's data.
-///\return	Size of data (in memory)
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Apr 2009
+// Function:    Attribute::getInMemDataSize
+///\brief       Gets the size in memory of the attribute's data.
+///\return      Size of data (in memory)
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Apr 2009
 //--------------------------------------------------------------------------
 size_t Attribute::getInMemDataSize() const
 {
@@ -204,9 +198,9 @@ size_t Attribute::getInMemDataSize() const
 
     // Get the data type of this attribute
     hid_t mem_type_id = H5Aget_type(id);
-    if( mem_type_id < 0 )
+    if (mem_type_id < 0)
     {
-	throw AttributeIException(func, "H5Aget_type failed");
+        throw AttributeIException(func, "H5Aget_type failed");
     }
 
     // Get the data type's size by first getting its native type then getting
@@ -214,22 +208,22 @@ size_t Attribute::getInMemDataSize() const
     hid_t native_type = H5Tget_native_type(mem_type_id, H5T_DIR_DEFAULT);
     if (native_type < 0)
     {
-	throw AttributeIException(func, "H5Tget_native_type failed");
+        throw AttributeIException(func, "H5Tget_native_type failed");
     }
     size_t type_size = H5Tget_size(native_type);
     if (type_size == 0)
     {
-	throw AttributeIException(func, "H5Tget_size failed");
+        throw AttributeIException(func, "H5Tget_size failed");
     }
 
     // Close the native type and the datatype of this attribute.
     if (H5Tclose(native_type) < 0)
     {
-	throw DataSetIException(func, "H5Tclose(native_type) failed");
+        throw DataSetIException(func, "H5Tclose(native_type) failed");
     }
     if (H5Tclose(mem_type_id) < 0)
     {
-	throw DataSetIException(func, "H5Tclose(mem_type_id) failed");
+        throw DataSetIException(func, "H5Tclose(mem_type_id) failed");
     }
 
     // Get number of elements of the attribute by first getting its dataspace
@@ -237,18 +231,18 @@ size_t Attribute::getInMemDataSize() const
     hid_t space_id = H5Aget_space(id);
     if (space_id < 0)
     {
-	throw AttributeIException(func, "H5Aget_space failed");
+        throw AttributeIException(func, "H5Aget_space failed");
     }
     hssize_t num_elements = H5Sget_simple_extent_npoints(space_id);
     if (num_elements < 0)
     {
-	throw AttributeIException(func, "H5Sget_simple_extent_npoints failed");
+        throw AttributeIException(func, "H5Sget_simple_extent_npoints failed");
     }
 
     // Close the dataspace
     if (H5Sclose(space_id) < 0)
     {
-	throw DataSetIException(func, "H5Sclose failed");
+        throw DataSetIException(func, "H5Sclose failed");
     }
 
     // Calculate and return the size of the data
@@ -257,63 +251,46 @@ size_t Attribute::getInMemDataSize() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getSpace
-///\brief	Gets a copy of the dataspace for this attribute.
-///\return	Dataspace instance
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute::getSpace
+///\brief       Gets a copy of the dataspace for this attribute.
+///\return      Dataspace instance
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSpace Attribute::getSpace() const
 {
    // Calls C function H5Aget_space to get the id of the dataspace
-   hid_t dataspace_id = H5Aget_space( id );
+   hid_t dataspace_id = H5Aget_space(id);
 
    // If the dataspace id is valid, create and return the DataSpace object
-   if( dataspace_id > 0 )
-   {
-	DataSpace dataspace;
-	f_DataSpace_setId(&dataspace, dataspace_id);
-	return(dataspace);
-   }
+   if (dataspace_id > 0)
+    {
+        DataSpace dataspace;
+        f_DataSpace_setId(&dataspace, dataspace_id);
+        return(dataspace);
+    }
    else
-   {
-      throw AttributeIException("Attribute::getSpace", "H5Aget_space failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	Attribute::getFileName
-///\brief	Gets the name of the file, in which this attribute belongs.
-///\return	File name
-///\exception	H5::IdComponentException
-// Programmer	Binh-Minh Ribler - Jul, 2004
-//--------------------------------------------------------------------------
-H5std_string Attribute::getFileName() const
-{
-   try {
-      return(p_get_file_name());
-   }
-   catch (IdComponentException E) {
-      throw FileIException("Attribute::getFileName", E.getDetailMsg());
-   }
+    {
+        throw AttributeIException("Attribute::getSpace", "H5Aget_space failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getName
-///\brief	Gets the name of this attribute, returning its length.
-///\param	attr_name - OUT: Buffer for the name string as char*
-///\param	buf_size  -  IN: Length of the buffer, default to 0
-///\return	Actual length of the attribute name
-///\exception	H5::AttributeIException
+// Function:    Attribute::getName
+///\brief       Gets the name of this attribute, returning its length.
+///\param       attr_name - OUT: Buffer for the name string as char*
+///\param       buf_size  -  IN: Length of the buffer, default to 0
+///\return      Actual length of the attribute name
+///\exception   H5::AttributeIException
 ///\par Description
-///		This function retrieves \a buf_size chars of the attribute's
-///		name including null termination.  Thus, if the actual length
-///		of the name is more than buf_size-1, the retrieved name will
-///		be truncated to accommodate the null terminator.
-///		To get length of the attribute's name for buffer allocation,
-///		an application can call this function passing in NULL for the
-///		first argument and ignore the second argument.
-// Programmer	Binh-Minh Ribler - Mar, 2014
+///             This function retrieves \a buf_size chars of the attribute's
+///             name including null termination.  Thus, if the actual length
+///             of the name is more than buf_size-1, the retrieved name will
+///             be truncated to accommodate the null terminator.
+///             To get length of the attribute's name for buffer allocation,
+///             an application can call this function passing in NULL for the
+///             first argument and ignore the second argument.
+// Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 ssize_t Attribute::getName(char* attr_name, size_t buf_size) const
 {
@@ -323,41 +300,41 @@ ssize_t Attribute::getName(char* attr_name, size_t buf_size) const
     // If H5Aget_name returns a negative value, raise an exception
     if (name_size < 0)
     {
-	throw AttributeIException("Attribute::getName", "H5Aget_name failed");
+        throw AttributeIException("Attribute::getName", "H5Aget_name failed");
     }
     else if (name_size == 0)
     {
-	throw AttributeIException("Attribute::getName", "Attribute must have a name, name length is 0");
+        throw AttributeIException("Attribute::getName", "Attribute must have a name, name length is 0");
     }
     // Return length of the name
     return(name_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getName
-///\brief	Returns the name of this attribute as an \a H5std_string.
-///\return	Name of the attribute
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    Attribute::getName
+///\brief       Returns the name of this attribute as an \a H5std_string.
+///\return      Name of the attribute
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - May, 2004
 // Modification
-//	Mar 2014 - BMR
-//		Revised to use the modified getName() above
+//      Mar 2014 - BMR
+//              Revised to use the modified getName() above
 //--------------------------------------------------------------------------
 H5std_string Attribute::getName() const
 {
     H5std_string attr_name(""); // attribute name to return
 
     // Preliminary call to get the size of the attribute name
-    ssize_t name_size = H5Aget_name(id, (size_t)0, NULL);
+    ssize_t name_size = H5Aget_name(id, static_cast<size_t>(0), NULL);
 
     // If H5Aget_name failed, throw exception
     if (name_size < 0)
     {
-	throw AttributeIException("Attribute::getName", "H5Aget_name failed");
+        throw AttributeIException("Attribute::getName", "H5Aget_name failed");
     }
     else if (name_size == 0)
     {
-	throw AttributeIException("Attribute::getName", "Attribute must have a name, name length is 0");
+        throw AttributeIException("Attribute::getName", "Attribute must have a name, name length is 0");
     }
     // Attribute's name exists, retrieve it
     else if (name_size > 0)
@@ -380,44 +357,44 @@ H5std_string Attribute::getName() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getName
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an integer
-///		specifying a desired length to be retrieved of the name.
-///\return	Name (or part of name) of the attribute
-///\param	len  -  IN: Desired length of the name
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute::getName
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an integer
+///             specifying a desired length to be retrieved of the name.
+///\return      Name (or part of name) of the attribute
+///\param       len  -  IN: Desired length of the name
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	Mar 2014 - BMR
-//		Revised to use the new getName() below
+//      Mar 2014 - BMR
+//              Revised to use the new getName() below
 //--------------------------------------------------------------------------
 H5std_string Attribute::getName(size_t len) const
 {
     H5std_string attr_name;
     ssize_t name_size = getName(attr_name, len);
     if (name_size < 0)
-	return("");
+        return("");
     else
-	return(attr_name);
+        return(attr_name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getName
-///\brief	Gets the name of this attribute, returning its length.
-///\param	attr_name - OUT: Buffer for the name string as \a H5std_string
-///\param	len  -  IN: Desired length of the name, default to 0
-///\return	Actual length of the attribute name
-///\exception	H5::AttributeIException
+// Function:    Attribute::getName
+///\brief       Gets the name of this attribute, returning its length.
+///\param       attr_name - OUT: Buffer for the name string as \a H5std_string
+///\param       len  -  IN: Desired length of the name, default to 0
+///\return      Actual length of the attribute name
+///\exception   H5::AttributeIException
 ///\par Description
-///		This function retrieves the attribute's name as a string.  The
-///		buf_size can specify a specific length or default to 0, in
-///		which case the entire name will be retrieved.
-// Programmer	Binh-Minh Ribler - Nov, 2001
+///             This function retrieves the attribute's name as a string.  The
+///             buf_size can specify a specific length or default to 0, in
+///             which case the entire name will be retrieved.
+// Programmer   Binh-Minh Ribler - Nov, 2001
 // Modification
-//	Mar 2014 - BMR
-//		Added to replace getName(size_t, H5std_string&) so that it'll
-//		allow the argument "len" to be skipped.
+//      Mar 2014 - BMR
+//              Added to replace getName(size_t, H5std_string&) so that it'll
+//              allow the argument "len" to be skipped.
 //--------------------------------------------------------------------------
 ssize_t Attribute::getName(H5std_string& attr_name, size_t len) const
 {
@@ -427,7 +404,7 @@ ssize_t Attribute::getName(H5std_string& attr_name, size_t len) const
     if (len == 0)
     {
         attr_name = getName();
-	name_size = attr_name.length();
+        name_size = attr_name.length();
     }
     // If length is provided, get that number of characters in name
     else
@@ -451,32 +428,33 @@ ssize_t Attribute::getName(H5std_string& attr_name, size_t len) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getName
-// Purpose	This function is replaced by the previous function, which
-//		provides more convenient prototype.  It will be removed
-//		in future release.
-// Param	len  -  IN: Desired length of the name
-// Param	attr_name - OUT: Buffer for the name string
-// Return	Actual length of the attribute name
-// Exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Nov, 2001
+// Function:    Attribute::getName
+// Purpose      This function is replaced by the previous function, which
+//              provides more convenient prototype.  It will be removed
+//              in future release.
+// Param        len  -  IN: Desired length of the name
+// Param        attr_name - OUT: Buffer for the name string
+// Return       Actual length of the attribute name
+// Exception    H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Nov, 2001
 // Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-ssize_t Attribute::getName( size_t len, H5std_string& attr_name ) const
-{
-    return (getName(attr_name, len));
-}
+//ssize_t Attribute::getName(size_t len, H5std_string& attr_name) const
+//{
+//    return (getName(attr_name, len));
+//}
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::getStorageSize
-///\brief	Returns the amount of storage size required for this attribute.
-///\return	Size of the storage or 0, for no data
-///\exception	H5::AttributeIException
-// Note:	H5Dget_storage_size returns 0 when there is no data.  This
-//		function should have no failure. (from SLU)
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    Attribute::getStorageSize
+///\brief       Returns the amount of storage size required for this attribute.
+///\return      Size of the storage or 0, for no data
+///\exception   H5::AttributeIException
+// Note:        H5Dget_storage_size returns 0 when there is no data.  This
+//              function should have no failure. (from SLU)
+// Programmer   Binh-Minh Ribler - Mar, 2005
 //--------------------------------------------------------------------------
 hsize_t Attribute::getStorageSize() const
 {
@@ -485,40 +463,20 @@ hsize_t Attribute::getStorageSize() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::flush
-///\brief	Flushes all buffers associated with a file specified by
-///		this attribute, to disk.
-///\param	scope - IN: Specifies the scope of the flushing action,
-///		which can be either of these values:
-///		\li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file
-///		\li \c H5F_SCOPE_LOCAL - Flushes only the specified file
-///\exception	H5::AttributeIException
-///\par Description
-///		This attribute is used to identify the file to be flushed.
-// Programmer	Binh-Minh Ribler - 2012
-// Modification
-//	Sep 2012 - BMR
-//		Duplicated from H5Location
-//--------------------------------------------------------------------------
-void Attribute::flush(H5F_scope_t scope) const
-{
-   herr_t ret_value = H5Fflush(getId(), scope);
-   if( ret_value < 0 )
-   {
-      throw AttributeIException("Attribute::flush", "H5Fflush failed");
-   }
-}
-
-//--------------------------------------------------------------------------
 // Function:    Attribute::getId
-///\brief	Get the id of this attribute
-///\return	Attribute identifier
+///\brief       Get the id of this attribute
+///\return      Attribute identifier
 // Description:
-//		Class hierarchy is revised to address bugzilla 1068.  Class
-//		AbstractDS and Attribute are moved out of H5Object.  In
-//		addition, member IdComponent::id is moved into subclasses, and
-//		IdComponent::getId now becomes pure virtual function.
+//              Class hierarchy is revised to address bugzilla 1068.  Class
+//              AbstractDS and Attribute are moved out of H5Object.  In
+//              addition, member IdComponent::id is moved into subclasses, and
+//              IdComponent::getId now becomes pure virtual function.
 // Programmer   Binh-Minh Ribler - May, 2008
+// Modification
+//      Aug 2016 - BMR
+//              Note that Attribute is now inheriting from H5Location, because
+//              an attribute id can be used to specify a location in HDF5
+//              library.
 //--------------------------------------------------------------------------
 hid_t Attribute::getId() const
 {
@@ -526,36 +484,36 @@ hid_t Attribute::getId() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::p_get_type (private)
-// Purpose	Gets the datatype of this attribute.
-// Return	Id of the datatype
-// Exception	H5::AttributeIException
+// Function:    Attribute::p_get_type (private)
+// Purpose      Gets the datatype of this attribute.
+// Return       Id of the datatype
+// Exception    H5::AttributeIException
 // Description
-// 		This private function is used in AbstractDs.
-// Programmer	Binh-Minh Ribler - 2000
+//              This private function is used in AbstractDs.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hid_t Attribute::p_get_type() const
 {
-   hid_t type_id = H5Aget_type( id );
-   if( type_id > 0 )
-      return( type_id );
-   else
-   {
-      throw AttributeIException("", "H5Aget_type failed");
-   }
+    hid_t type_id = H5Aget_type(id);
+    if (type_id > 0)
+        return(type_id);
+    else
+    {
+        throw AttributeIException("", "H5Aget_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::p_read_fixed_len (private)
-// brief	Reads a fixed length \a H5std_string from an attribute.
-// param	mem_type  - IN: Attribute datatype (in memory)
-// param	strg      - IN: Buffer for read string
-// exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Jul, 2009
+// Function:    Attribute::p_read_fixed_len (private)
+// brief       Reads a fixed length \a H5std_string from an attribute.
+// param       mem_type  - IN: Attribute datatype (in memory)
+// param       strg      - IN: Buffer for read string
+// exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Jul, 2009
 // Modification
-//	Jul 2009
-//		Separated the fixed length case from the original
-//		Attribute::read
+//      Jul 2009
+//              Separated the fixed length case from the original
+//              Attribute::read
 //--------------------------------------------------------------------------
 void Attribute::p_read_fixed_len(const DataType& mem_type, H5std_string& strg) const
 {
@@ -567,31 +525,31 @@ void Attribute::p_read_fixed_len(const DataType& mem_type, H5std_string& strg) c
     // If there is data, allocate buffer and read it.
     if (attr_size > 0)
     {
-	char *strg_C = new char[attr_size+1];
-	herr_t ret_value = H5Aread(id, mem_type.getId(), strg_C);
-	if( ret_value < 0 )
-	{
-	    delete []strg_C;	// de-allocate for fixed-len string
-	    throw AttributeIException("Attribute::read", "H5Aread failed");
-	}
-	// Get string from the C char* and release resource allocated locally
-	strg_C[attr_size] = '\0';
-	strg = strg_C;
-	delete []strg_C;
+        char *strg_C = new char[attr_size+1];
+        herr_t ret_value = H5Aread(id, mem_type.getId(), strg_C);
+        if (ret_value < 0)
+        {
+            delete []strg_C;        // de-allocate for fixed-len string
+            throw AttributeIException("Attribute::read", "H5Aread failed");
+        }
+        // Get string from the C char* and release resource allocated locally
+        strg_C[attr_size] = '\0';
+        strg = strg_C;
+        delete []strg_C;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::p_read_variable_len (private)
-// brief	Reads a variable length \a H5std_string from an attribute.
-// param	mem_type  - IN: Attribute datatype (in memory)
-// param	strg      - IN: Buffer for read string
-// exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Jul, 2009
+// Function:    Attribute::p_read_variable_len (private)
+// brief       Reads a variable length \a H5std_string from an attribute.
+// param       mem_type  - IN: Attribute datatype (in memory)
+// param       strg      - IN: Buffer for read string
+// exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Jul, 2009
 // Modification
-//	Jul 2009
-//		Separated the variable length case from the original
-//		Attribute::read. -BMR
+//        Jul 2009
+//              Separated the variable length case from the original
+//              Attribute::read. -BMR
 //--------------------------------------------------------------------------
 void Attribute::p_read_variable_len(const DataType& mem_type, H5std_string& strg) const
 {
@@ -601,9 +559,9 @@ void Attribute::p_read_variable_len(const DataType& mem_type, H5std_string& strg
     // Read attribute, no allocation for variable-len string; C library will
     herr_t ret_value = H5Aread(id, mem_type.getId(), &strg_C);
 
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw AttributeIException("Attribute::read", "H5Aread failed");
+        throw AttributeIException("Attribute::read", "H5Aread failed");
     }
 
     // Get string from the C char* and release resource allocated by C API
@@ -617,68 +575,66 @@ void Attribute::p_read_variable_len(const DataType& mem_type, H5std_string& strg
 ///\brief       Sets the identifier of this object to a new value.
 ///
 ///\exception   H5::IdComponentException when the attempt to close the HDF5
-///		object fails
+///             object fails
 // Description:
-//		The underlaying reference counting in the C library ensures
-//		that the current valid id of this object is properly closed.
-//		Then the object's id is reset to the new id.
+//              The underlaying reference counting in the C library ensures
+//              that the current valid id of this object is properly closed.
+//              Then the object's id is reset to the new id.
 // Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Attribute::p_setId(const hid_t new_id)
 {
     // handling references to this old id
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	throw AttributeIException("Attribute::p_setId", close_error.getDetailMsg());
+    catch (Exception& close_error) {
+        throw AttributeIException("Attribute::p_setId", close_error.getDetailMsg());
     }
-   // reset object's id to the given id
-   id = new_id;
+    // reset object's id to the given id
+    id = new_id;
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	Attribute::close
-///\brief	Closes this attribute.
+// Function:    Attribute::close
+///\brief       Closes this attribute.
 ///
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void Attribute::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Aclose(id);
-	if( ret_value < 0 )
-	{
-	    throw AttributeIException("Attribute::close", "H5Aclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Aclose(id);
+        if (ret_value < 0)
+        {
+            throw AttributeIException("Attribute::close", "H5Aclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Attribute destructor
-///\brief	Properly terminates access to this attribute.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Attribute destructor
+///\brief       Properly terminates access to this attribute.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 Attribute::~Attribute()
 {
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	cerr << "Attribute::~Attribute - " << close_error.getDetailMsg() << endl;
+    catch (Exception& close_error) {
+        cerr << "Attribute::~Attribute - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h
index f5ee4a9..823947e 100644
--- a/c++/src/H5Attribute.h
+++ b/c++/src/H5Attribute.h
@@ -6,116 +6,99 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Attribute_H
 #define __H5Attribute_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class Attribute
     \brief Class Attribute operates on HDF5 attributes.
 
     An attribute has many characteristics similar to a dataset, thus both
     Attribute and DataSet are derivatives of AbstractDs.  Attribute also
-    inherits from IdComponent because an attribute is an HDF5 component that
-    is identified by an identifier.
+    inherits from H5Location because an attribute can be used to specify
+    a location.
 */
-class H5_DLLCPP Attribute : public AbstractDs, public IdComponent {
+//  Inheritance: multiple H5Location/AbstractDs -> IdComponent
+class H5_DLLCPP Attribute : public AbstractDs, public H5Location {
    public:
 
-	// Copy constructor: makes a copy of an existing Attribute object.
-	Attribute( const Attribute& original );
+        // Copy constructor: makes a copy of an existing Attribute object.
+        Attribute(const Attribute& original);
 
-	// Default constructor
-	Attribute();
+        // Default constructor
+        Attribute();
 
-	// Creates a copy of an existing attribute using the attribute id
-	Attribute( const hid_t attr_id );
+        // Creates a copy of an existing attribute using the attribute id
+        Attribute(const hid_t attr_id);
 
-	// Closes this attribute.
-	virtual void close();
+        // Closes this attribute.
+        virtual void close();
 
-	// Gets the name of the file, in which this attribute belongs.
-	H5std_string getFileName() const;
+        // Gets the name of this attribute.
+        ssize_t getName(char* attr_name, size_t buf_size = 0) const;
+        H5std_string getName(size_t len) const;
+        H5std_string getName() const;
+        ssize_t getName(H5std_string& attr_name, size_t len = 0) const;
+        // The overloaded function below is replaced by the one above and it
+        // is kept for backward compatibility purpose.
+        ssize_t getName(size_t buf_size, H5std_string& attr_name) const;
 
-	// Gets the name of this attribute.
-	ssize_t getName(char* attr_name, size_t buf_size = 0) const;
-	H5std_string getName(size_t len) const;
-	H5std_string getName() const;
-	ssize_t getName(H5std_string& attr_name, size_t len = 0) const;
-	// The overloaded function below is replaced by the one above and it
-	// is kept for backward compatibility purpose.
-	ssize_t getName( size_t buf_size, H5std_string& attr_name ) const;
+        // Gets a copy of the dataspace for this attribute.
+        virtual DataSpace getSpace() const;
 
-	// Gets a copy of the dataspace for this attribute.
-	virtual DataSpace getSpace() const;
+        // Returns the amount of storage size required for this attribute.
+        virtual hsize_t getStorageSize() const;
 
-	// Returns the amount of storage size required for this attribute.
-	virtual hsize_t getStorageSize() const;
+        // Returns the in memory size of this attribute's data.
+        virtual size_t getInMemDataSize() const;
 
-	// Returns the in memory size of this attribute's data.
-	virtual size_t getInMemDataSize() const;
+        // Reads data from this attribute.
+        void read(const DataType& mem_type, void *buf) const;
+        void read(const DataType& mem_type, H5std_string& strg) const;
 
-	// Reads data from this attribute.
-	void read( const DataType& mem_type, void *buf ) const;
-	void read( const DataType& mem_type, H5std_string& strg ) const;
+        // Writes data to this attribute.
+        void write(const DataType& mem_type, const void *buf) const;
+        void write(const DataType& mem_type, const H5std_string& strg) const;
 
-	// Writes data to this attribute.
-	void write(const DataType& mem_type, const void *buf ) const;
-	void write(const DataType& mem_type, const H5std_string& strg ) const;
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("Attribute"); }
 
-	// Flushes all buffers associated with the file specified by this
-	// attribute to disk.
-	void flush( H5F_scope_t scope ) const;
+        // Gets the attribute id.
+        virtual hid_t getId() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("Attribute"); }
-
-	// Gets the attribute id.
-	virtual hid_t getId() const;
-
-	// Destructor: properly terminates access to this attribute.
-	virtual ~Attribute();
+        // Destructor: properly terminates access to this attribute.
+        virtual ~Attribute();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
    protected:
-	// Sets the attribute id.
-	virtual void p_setId(const hid_t new_id);
+        // Sets the attribute id.
+        virtual void p_setId(const hid_t new_id);
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	hid_t id;	// HDF5 attribute id
-
-	// This function contains the common code that is used by
-	// getTypeClass and various API functions getXxxType
-	// defined in AbstractDs for generic datatype and specific
-	// sub-types
-	virtual hid_t p_get_type() const;
+        hid_t id;        // HDF5 attribute id
 
-	// Reads variable or fixed len strings from this attribute.
-	void p_read_variable_len(const DataType& mem_type, H5std_string& strg) const;
-	void p_read_fixed_len(const DataType& mem_type, H5std_string& strg) const;
+        // This function contains the common code that is used by
+        // getTypeClass and various API functions getXxxType
+        // defined in AbstractDs for generic datatype and specific
+        // sub-types
+        virtual hid_t p_get_type() const;
 
-	// do not inherit H5Object::iterateAttrs
-	int iterateAttrs() { return 0; }
+        // Reads variable or fixed len strings from this attribute.
+        void p_read_variable_len(const DataType& mem_type, H5std_string& strg) const;
+        void p_read_fixed_len(const DataType& mem_type, H5std_string& strg) const;
 
-	// do not inherit H5Object::renameAttr
-	void renameAttr() {}
+        // Friend function to set Attribute id.  For library use only.
+        friend void f_Attribute_setId(Attribute* attr, hid_t new_id);
 
-	// Friend function to set Attribute id.  For library use only.
-	friend void f_Attribute_setId(Attribute* attr, hid_t new_id);
+}; // end of Attribute
+} // namespace H5
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5Attribute_H
diff --git a/c++/src/H5Classes.h b/c++/src/H5Classes.h
index de7cf4a..f0f6359 100644
--- a/c++/src/H5Classes.h
+++ b/c++/src/H5Classes.h
@@ -6,47 +6,41 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Classes_H
 #define __H5Classes_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
-	class Exception;
-	class IdComponent;
-	class H5Location;
-	class H5Object;
-	class PropList;
-	class FileCreatPropList;
-	class FileAccPropList;
-	class DSetCreatPropList;
-	class DSetMemXferPropList;
-	class DTypePropList;
-	class DataType;
-	class DataSpace;
-	class AtomType;
-	class PredType;
-	class EnumType;
-	class IntType;
-	class FloatType;
-	class StrType;
-	class CompType;
-	//class RefType;
-	class AbstractDs;
-	class DataSet;
-	class Group;
-	class H5File;
-	class Attribute;
-	class H5Library;
-#ifndef H5_NO_NAMESPACE
+        class Exception;
+        class IdComponent;
+        class H5Location;
+        class H5Object;
+        class PropList;
+        class FileCreatPropList;
+        class FileAccPropList;
+        class LinkAccPropList;
+        class DSetCreatPropList;
+        class DSetMemXferPropList;
+        class DTypePropList;
+        class DataType;
+        class DataSpace;
+        class AtomType;
+        class PredType;
+        class EnumType;
+        class IntType;
+        class FloatType;
+        class StrType;
+        class CompType;
+        class AbstractDs;
+        class DataSet;
+        class Group;
+        class H5File;
+        class Attribute;
+        class H5Library;
 }
-#endif
 #endif // __H5Classes_H
diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp
index 339af54..baa52a2 100644
--- a/c++/src/H5CommonFG.cpp
+++ b/c++/src/H5CommonFG.cpp
@@ -5,34 +5,30 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
 #include "H5Include.h"
+#include "H5private.h"             // for HDstrcpy
 #include "H5Exception.h"
 #include "H5IdComponent.h"
+#include "H5DataSpace.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5FaccProp.h"
-#include "H5FcreatProp.h"
-#include "H5OcreatProp.h"
 #include "H5DxferProp.h"
+#include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
-#include "H5Group.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
+#include "H5Alltypes.h"
 #include "H5AbstractDs.h"
-#include "H5DataSpace.h"
 #include "H5DataSet.h"
-#include "H5File.h"
-#include "H5Alltypes.h"
-#include "H5private.h"		// for HDstrcpy
+#include "H5CommonFG.h"
 
 // There are a few comments that are common to most of the functions
 // defined in this file so they are listed here.
@@ -47,1233 +43,320 @@
 //   GroupIException.
 // December 2000
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-using namespace std;
-#endif
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::createGroup
-///\brief	Creates a new group at this location which can be a file
-///		or another group.
-///\param	name  - IN: Name of the group to create
-///\param	size_hint - IN: Indicates the number of bytes to reserve for
-///		the names that will appear in the group
-///\return	Group instance
-///\exception	H5::FileIException or H5::GroupIException
-///\par Description
-///		The optional \a size_hint specifies how much file space to
-///		reserve for storing the names that will appear in this new
-///		group. If a non-positive value is provided for the \a size_hint
-///		then a default size is chosen.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-     Group CommonFG::createGroup( const char* name, size_t size_hint ) const
-{
-    // Group creation property list for size hint
-    hid_t gcpl_id = 0;
-
-    // Set the local heap size hint
-    if (size_hint > 0)
-    {
-       // If the creation of the property list failed, throw an exception
-       if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
-          throwException("createGroup", "H5Pcreate failed");
-
-       if (H5Pset_local_heap_size_hint(gcpl_id, size_hint) < 0) {
-          H5Pclose(gcpl_id);
-          throwException("createGroup", "H5Pset_local_heap_size_hint failed");
-       }
-    }
-
-   // Call C routine H5Gcreate2 to create the named group, giving the
-   // location id which can be a file id or a group id
-   hid_t group_id = H5Gcreate2( getLocId(), name, H5P_DEFAULT, gcpl_id, H5P_DEFAULT );
-
-   // Close the group creation property list, if necessary
-   if(gcpl_id > 0)
-       H5Pclose(gcpl_id);
-
-   // If the creation of the group failed, throw an exception
-   if( group_id < 0 )
-      throwException("createGroup", "H5Gcreate2 failed");
-
-   // No failure, create and return the Group object
-   Group group;
-    CommonFG *ptr = &group;
-    ptr->p_setId(group_id);
-   return( group );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::createGroup
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Group CommonFG::createGroup( const H5std_string& name, size_t size_hint ) const
-{
-   return( createGroup( name.c_str(), size_hint ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openGroup
-///\brief	Opens an existing group in a location which can be a file
-///		or another group.
-///\param	name  - IN: Name of the group to open
-///\return	Group instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Group CommonFG::openGroup( const char* name ) const
-{
-   // Call C routine H5Gopen2 to open the named group, giving the
-   // location id which can be a file id or a group id
-   hid_t group_id = H5Gopen2( getLocId(), name, H5P_DEFAULT );
-
-   // If the opening of the group failed, throw an exception
-   if( group_id < 0 )
-      throwException("openGroup", "H5Gopen2 failed");
-
-   // No failure, create and return the Group object
-   Group group;
-    CommonFG *ptr = &group;
-    ptr->p_setId(group_id);
-   return( group );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openGroup
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Group CommonFG::openGroup( const H5std_string& name ) const
-{
-   return( openGroup( name.c_str() ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::createDataSet
-///\brief	Creates a new dataset at this location.
-///\param	name  - IN: Name of the dataset to create
-///\param	data_type - IN: Datatype of the dataset
-///\param	data_space - IN: Dataspace for the dataset
-///\param	create_plist - IN: Creation properly list for the dataset
-///\return	DataSet instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataSet CommonFG::createDataSet( const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) const
-{
-   // Obtain identifiers for C API
-   hid_t type_id = data_type.getId();
-   hid_t space_id = data_space.getId();
-   hid_t create_plist_id = create_plist.getId();
-
-   // Call C routine H5Dcreate2 to create the named dataset
-   hid_t dataset_id = H5Dcreate2( getLocId(), name, type_id, space_id, H5P_DEFAULT, create_plist_id, H5P_DEFAULT );
-
-   // If the creation of the dataset failed, throw an exception
-   if( dataset_id < 0 )
-      throwException("createDataSet", "H5Dcreate2 failed");
-
-   // No failure, create and return the DataSet object
-   DataSet dataset;
-   f_DataSet_setId(&dataset, dataset_id);
-   return( dataset );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::createDataSet
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataSet CommonFG::createDataSet( const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) const
-{
-   return( createDataSet( name.c_str(), data_type, data_space, create_plist ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openDataSet
-///\brief	Opens an existing dataset at this location.
-///\param	name  - IN: Name of the dataset to open
-///\return	DataSet instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataSet CommonFG::openDataSet( const char* name ) const
-{
-   // Call C function H5Dopen2 to open the specified dataset, giving
-   // the location id and the dataset's name
-   hid_t dataset_id = H5Dopen2( getLocId(), name, H5P_DEFAULT );
-
-   // If the dataset's opening failed, throw an exception
-   if(dataset_id < 0)
-      throwException("openDataSet", "H5Dopen2 failed");
-
-   // No failure, create and return the DataSet object
-   DataSet dataset;
-   f_DataSet_setId(&dataset, dataset_id);
-   return( dataset );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openDataSet
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataSet CommonFG::openDataSet( const H5std_string& name ) const
-{
-   return( openDataSet( name.c_str() ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::link
-///\brief	Creates a link of the specified type from \a new_name to
-///		\a curr_name.
-///\param	link_type  - IN: Link type; possible values are
-///		\li \c H5G_LINK_HARD
-///		\li \c H5G_LINK_SOFT
-///\param	curr_name - IN: Name of the existing object if link is a hard
-///		link; can be anything for the soft link
-///\param	new_name - IN: New name for the object
-///\exception	H5::FileIException or H5::GroupIException
-///\par Description
-///		Note that both names are interpreted relative to the
-///		specified location.
-///		For information on creating hard link and soft link, please
-///		refer to the C layer Reference Manual at:
-/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateHard and
-/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateSoft
-// Programmer	Binh-Minh Ribler - 2000
-// Modification
-//	2007: QAK modified to use H5L APIs - BMR
-//--------------------------------------------------------------------------
-void CommonFG::link( H5L_type_t link_type, const char* curr_name, const char* new_name ) const
-{
-    herr_t ret_value = -1;
-
-    switch(link_type) {
-        case H5L_TYPE_HARD:
-            ret_value = H5Lcreate_hard( getLocId(), curr_name, H5L_SAME_LOC, new_name, H5P_DEFAULT, H5P_DEFAULT );
-            break;
-
-        case H5L_TYPE_SOFT:
-            ret_value = H5Lcreate_soft( curr_name, getLocId(), new_name, H5P_DEFAULT, H5P_DEFAULT );
-            break;
-
-	case H5L_TYPE_ERROR:
-	case H5L_TYPE_EXTERNAL:
-	case H5L_TYPE_MAX:
-        default:
-            throwException("link", "unknown link type");
-            break;
-    } /* end switch */
-
-   if( ret_value < 0 )
-      throwException("link", "creating link failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::link
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a curr_name and \a new_name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::link( H5L_type_t link_type, const H5std_string& curr_name, const H5std_string& new_name ) const
-{
-   link( link_type, curr_name.c_str(), new_name.c_str() );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::unlink
-///\brief	Removes the specified name at this location.
-///\param	name  - IN: Name of the object to be removed
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-// Modification
-//	2007: QAK modified to use H5L APIs - BMR
-//--------------------------------------------------------------------------
-void CommonFG::unlink( const char* name ) const
-{
-   herr_t ret_value = H5Ldelete( getLocId(), name, H5P_DEFAULT );
-   if( ret_value < 0 )
-      throwException("unlink", "H5Ldelete failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::unlink
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::unlink( const H5std_string& name ) const
-{
-   unlink( name.c_str() );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::move
-///\brief	Renames an object at this location.
-///\param	src - IN: Object's original name
-///\param	dst - IN: Object's new name
-///\exception	H5::FileIException or H5::GroupIException
-///\note
-///		Exercise care in moving groups as it is possible to render
-///		data in a file inaccessible with Group::move. Please refer
-///		to the Group Interface in the HDF5 User's Guide for details at:
-/// https://www.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FGroups%2FHDF5_Groups.htm
-// Programmer	Binh-Minh Ribler - 2000
-// Modification
-//	2007: QAK modified to use H5L APIs - BMR
-//--------------------------------------------------------------------------
-void CommonFG::move( const char* src, const char* dst ) const
-{
-   herr_t ret_value = H5Lmove( getLocId(), src, H5L_SAME_LOC, dst, H5P_DEFAULT, H5P_DEFAULT );
-   if( ret_value < 0 )
-      throwException("move", "H5Lmove failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::move
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a src and \a dst.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::move( const H5std_string& src, const H5std_string& dst ) const
-{
-   move( src.c_str(), dst.c_str() );
-}
-
-#ifndef H5_NO_DEPRECATED_SYMBOLS
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjinfo
-///\brief	Returns information about an object.
-///\param	name  - IN: Name of the object
-///\param	follow_link - IN: Link flag
-///\param	statbuf - OUT: Buffer to return information about the object
-///\exception	H5::FileIException or H5::GroupIException
-///\par Description
-///		For more information, please refer to the C layer Reference
-///		Manual at:
-/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5G.html#Group-GetObjinfo
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& statbuf ) const
-{
-   herr_t ret_value = H5Gget_objinfo( getLocId(), name, follow_link, &statbuf );
-   if( ret_value < 0 )
-      throwException("getObjinfo", "H5Gget_objinfo failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjinfo
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::getObjinfo( const H5std_string& name, hbool_t follow_link, H5G_stat_t& statbuf ) const
-{
-   getObjinfo( name.c_str(), follow_link, statbuf );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjinfo
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above functions in that it doesn't have
-///		the paramemter \a follow_link.
-// Programmer	Binh-Minh Ribler - Nov, 2005
-// Note: need to modify to use H5Oget_info and H5Lget_info - BMR
-//--------------------------------------------------------------------------
-void CommonFG::getObjinfo( const char* name, H5G_stat_t& statbuf ) const
-{
-   herr_t ret_value = H5Gget_objinfo( getLocId(), name, 0, &statbuf );
-   if( ret_value < 0 )
-      throwException("getObjinfo", "H5Gget_objinfo failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjinfo
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - Nov, 2005
-//--------------------------------------------------------------------------
-void CommonFG::getObjinfo( const H5std_string& name, H5G_stat_t& statbuf ) const
-{
-   getObjinfo( name.c_str(), statbuf );
-}
-#endif /* H5_NO_DEPRECATED_SYMBOLS */
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getLinkval
-///\brief	Returns the name of the object that the symbolic link points to.
-///\param	name  - IN: Symbolic link to the object
-///\param	size - IN: Maximum number of characters of value to be returned
-///\return	Name of the object
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-H5std_string CommonFG::getLinkval( const char* name, size_t size ) const
-{
-    H5L_info_t linkinfo;
-    char *value_C;	// value in C string
-    size_t val_size = size;
-    H5std_string value = "";
-    herr_t ret_value;
-
-    // if user doesn't provide buffer size, determine it
-    if (size == 0)
-    {
-	ret_value = H5Lget_info(getLocId(), name, &linkinfo, H5P_DEFAULT);
-	if( ret_value < 0 )
-	    throwException("getLinkval", "H5Lget_info to find buffer size failed");
-
-	val_size = linkinfo.u.val_size;
-    }
-
-    // if link has value, retrieve the value, otherwise, return null string
-    if (val_size > 0)
-    {
-	value_C = new char[val_size+1];  // temporary C-string for C API
-	HDmemset(value_C, 0, val_size+1); // clear buffer
-
-	ret_value = H5Lget_val(getLocId(), name, value_C, val_size, H5P_DEFAULT);
-	if( ret_value < 0 )
-	{
-	    delete []value_C;
-	    throwException("getLinkval", "H5Lget_val failed");
-	}
-
-	value = H5std_string(value_C);
-	delete []value_C;
-    }
-    return(value);
-}
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::getLinkval
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openDataType
+///\brief       Opens the named generic datatype at this location.
+///\param       name  - IN: Name of the datatype to open
+///\return      DataType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5std_string CommonFG::getLinkval( const H5std_string& name, size_t size ) const
+DataType CommonFG::openDataType(const char* name) const
 {
-   return( getLinkval( name.c_str(), size ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::mount
-///\brief	Mounts the file \a child onto this group.
-///\param	name  - IN: Name of the group
-///\param	child - IN: File to mount
-///\param	plist - IN: Property list to use
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2014 (original 2000)
-//--------------------------------------------------------------------------
-void CommonFG::mount(const char* name, const H5File& child, const PropList& plist ) const
-{
-   // Obtain identifiers for C API
-   hid_t plist_id = plist.getId();
-   hid_t child_id = child.getId();
-
-   // Call C routine H5Fmount to do the mouting
-   herr_t ret_value = H5Fmount( getLocId(), name, child_id, plist_id );
-
-   // Raise exception if H5Fmount returns negative value
-   if( ret_value < 0 )
-      throwException("mount", "H5Fmount failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::mount
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param	name  - IN: Name of the group
-// Param	child - IN: File to mount
-// Param	plist - IN: Property list to use
-// Exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-// Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-void CommonFG::mount(const char* name, H5File& child, PropList& plist) const
-{
-   mount(name, child, plist);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::mount
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes an \c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::mount(const H5std_string& name, const H5File& child, const PropList& plist) const
-{
-   mount(name.c_str(), child, plist);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::mount
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Programmer	Binh-Minh Ribler - 2014
-// Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-void CommonFG::mount(const H5std_string& name, H5File& child, PropList& plist) const
-{
-   mount(name.c_str(), child, plist);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::unmount
-///\brief	Unmounts the specified file.
-///\param	name  - IN: Name of the file to unmount
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::unmount( const char* name ) const
-{
-   // Call C routine H5Fmount to do the mouting
-   herr_t ret_value = H5Funmount( getLocId(), name );
-
-   // Raise exception if H5Funmount returns negative value
-   if( ret_value < 0 )
-      throwException("unmount", "H5Funmount failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::unmount
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void CommonFG::unmount( const H5std_string& name ) const
-{
-   unmount( name.c_str() );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openDataType
-///\brief	Opens the named generic datatype at this location.
-///\param	name  - IN: Name of the datatype to open
-///\return	DataType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataType CommonFG::openDataType( const char* name ) const
-{
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
-
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openDataType", "H5Topen2 failed");
-
-   // No failure, create and return the DataType object
-   DataType data_type;
-   f_DataType_setId(&data_type, type_id);
-   return(data_type);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openDataType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-DataType CommonFG::openDataType( const H5std_string& name ) const
-{
-   return( openDataType( name.c_str()) );
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openArrayType
-///\brief	Opens the named array datatype at this location.
-///\param	name  - IN: Name of the array datatype to open
-///\return	ArrayType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
-//--------------------------------------------------------------------------
-ArrayType CommonFG::openArrayType( const char* name ) const
-{
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openArrayType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openDataType", "H5Topen2 failed");
 
-   // No failure, create and return the ArrayType object
-   ArrayType array_type;
-   f_DataType_setId(&array_type, type_id);
-   return(array_type);
+    // No failure, create and return the DataType object
+    DataType data_type;
+    f_DataType_setId(&data_type, type_id);
+    return(data_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openArrayType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    CommonFG::openDataType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-ArrayType CommonFG::openArrayType( const H5std_string& name ) const
+DataType CommonFG::openDataType(const H5std_string& name) const
 {
-   return( openArrayType( name.c_str()) );
+    return(openDataType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openCompType
-///\brief	Opens the named compound datatype at this location.
-///\param	name  - IN: Name of the compound datatype to open
-///\return	CompType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openArrayType
+///\brief       Opens the named array datatype at this location.
+///\param       name  - IN: Name of the array datatype to open
+///\return      ArrayType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-CompType CommonFG::openCompType( const char* name ) const
+ArrayType CommonFG::openArrayType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openCompType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openArrayType", "H5Topen2 failed");
 
-   // No failure, create and return the CompType object
-   CompType comp_type;
-   f_DataType_setId(&comp_type, type_id);
-   return(comp_type);
+    // No failure, create and return the ArrayType object
+    ArrayType array_type;
+    f_DataType_setId(&array_type, type_id);
+    return(array_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openCompType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openArrayType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-CompType CommonFG::openCompType( const H5std_string& name ) const
+ArrayType CommonFG::openArrayType(const H5std_string& name) const
 {
-   return( openCompType( name.c_str()) );
+    return(openArrayType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openEnumType
-///\brief	Opens the named enumeration datatype at this location.
-///\param	name  - IN: Name of the enumeration datatype to open
-///\return	EnumType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openCompType
+///\brief       Opens the named compound datatype at this location.
+///\param       name  - IN: Name of the compound datatype to open
+///\return      CompType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType CommonFG::openEnumType( const char* name ) const
+CompType CommonFG::openCompType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openEnumType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openCompType", "H5Topen2 failed");
 
-   // No failure, create and return the EnumType object
-   EnumType enum_type;
-   f_DataType_setId(&enum_type, type_id);
-   return(enum_type);
+    // No failure, create and return the CompType object
+    CompType comp_type;
+    f_DataType_setId(&comp_type, type_id);
+    return(comp_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openEnumType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openCompType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType CommonFG::openEnumType( const H5std_string& name ) const
+CompType CommonFG::openCompType(const H5std_string& name) const
 {
-   return( openEnumType( name.c_str()) );
+    return(openCompType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openIntType
-///\brief	Opens the named integer datatype at this location.
-///\param	name  - IN: Name of the integer datatype to open
-///\return	IntType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openEnumType
+///\brief       Opens the named enumeration datatype at this location.
+///\param       name  - IN: Name of the enumeration datatype to open
+///\return      EnumType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType CommonFG::openIntType( const char* name ) const
+EnumType CommonFG::openEnumType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openIntType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openEnumType", "H5Topen2 failed");
 
-   // No failure, create and return the IntType object
-   IntType int_type;
-   f_DataType_setId(&int_type, type_id);
-   return(int_type);
+    // No failure, create and return the EnumType object
+    EnumType enum_type;
+    f_DataType_setId(&enum_type, type_id);
+    return(enum_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openIntType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openEnumType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType CommonFG::openIntType( const H5std_string& name ) const
+EnumType CommonFG::openEnumType(const H5std_string& name) const
 {
-   return( openIntType( name.c_str()) );
+    return(openEnumType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openFloatType
-///\brief	Opens the named floating-point datatype at this location.
-///\param	name  - IN: Name of the floating-point datatype to open
-///\return	FloatType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openIntType
+///\brief       Opens the named integer datatype at this location.
+///\param       name  - IN: Name of the integer datatype to open
+///\return      IntType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType CommonFG::openFloatType( const char* name ) const
+IntType CommonFG::openIntType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openFloatType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openIntType", "H5Topen2 failed");
 
-   // No failure, create and return the FloatType object
-   FloatType float_type;
-   f_DataType_setId(&float_type, type_id);
-   return(float_type);
+    // No failure, create and return the IntType object
+    IntType int_type;
+    f_DataType_setId(&int_type, type_id);
+    return(int_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openFloatType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openIntType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType CommonFG::openFloatType( const H5std_string& name ) const
+IntType CommonFG::openIntType(const H5std_string& name) const
 {
-   return( openFloatType( name.c_str()) );
+    return(openIntType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openStrType
-///\brief	Opens the named string datatype at this location.
-///\param	name  - IN: Name of the string datatype to open
-///\return	StrType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openFloatType
+///\brief       Opens the named floating-point datatype at this location.
+///\param       name  - IN: Name of the floating-point datatype to open
+///\return      FloatType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType CommonFG::openStrType( const char* name ) const
+FloatType CommonFG::openFloatType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openStrType", "H5Topen2 failed");
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openFloatType", "H5Topen2 failed");
 
-   // No failure, create and return the StrType object
-   StrType str_type;
-   f_DataType_setId(&str_type, type_id);
-   return(str_type);
+    // No failure, create and return the FloatType object
+    FloatType float_type;
+    f_DataType_setId(&float_type, type_id);
+    return(float_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openStrType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openFloatType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType CommonFG::openStrType( const H5std_string& name ) const
+FloatType CommonFG::openFloatType(const H5std_string& name) const
 {
-   return( openStrType( name.c_str()) );
+    return(openFloatType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::openVarLenType
-///\brief	Opens the named variable length datatype at this location.
-///\param	name  - IN: Name of the variable length datatype to open
-///\return	VarLenType instance
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    CommonFG::openStrType
+///\brief       Opens the named string datatype at this location.
+///\param       name  - IN: Name of the string datatype to open
+///\return      StrType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-VarLenType CommonFG::openVarLenType( const char* name ) const
+StrType CommonFG::openStrType(const char* name) const
 {
-   // Call C function H5Topen2 to open the named datatype in this group,
-   // given either the file or group id
-   hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-   // If the datatype's opening failed, throw an exception
-   if( type_id < 0 )
-      throwException("openVarLenType", "H5Topen2 failed");
-
-   // No failure, create and return the VarLenType object
-   VarLenType varlen_type;
-   f_DataType_setId(&varlen_type, type_id);
-   return(varlen_type);
-}
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openStrType", "H5Topen2 failed");
 
-//--------------------------------------------------------------------------
-// Function:	CommonFG::openVarLenType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - Jul, 2005
-//--------------------------------------------------------------------------
-VarLenType CommonFG::openVarLenType( const H5std_string& name ) const
-{
-   return( openVarLenType( name.c_str()) );
+    // No failure, create and return the StrType object
+    StrType str_type;
+    f_DataType_setId(&str_type, type_id);
+    return(str_type);
 }
 
-#ifndef H5_NO_DEPRECATED_SYMBOLS
 //--------------------------------------------------------------------------
-// Function:	CommonFG::iterateElems
-///\brief	Iterates a user's function over the entries of a group.
-///\param	name    - IN    : Name of group to iterate over
-///\param	idx     - IN/OUT: Starting (IN) and ending (OUT) entry indices
-///\param	op      - IN    : User's function to operate on each entry
-///\param	op_data - IN/OUT: Data associated with the operation
-///\return	The return value of the first operator that returns non-zero,
-///		or zero if all members were processed with no operator
-///		returning non-zero.
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openStrType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-int CommonFG::iterateElems( const char* name, int *idx, H5G_iterate_t op , void* op_data )
+StrType CommonFG::openStrType(const H5std_string& name) const
 {
-   int ret_value = H5Giterate( getLocId(), name, idx, op, op_data );
-   if( ret_value < 0 )
-   {
-      throwException("iterateElems", "H5Giterate failed");
-   }
-   return( ret_value );
+    return(openStrType(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::iterateElems
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG::openVarLenType
+///\brief       Opens the named variable length datatype at this location.
+///\param       name  - IN: Name of the variable length datatype to open
+///\return      VarLenType instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-int CommonFG::iterateElems( const H5std_string& name, int *idx, H5G_iterate_t op , void* op_data )
+VarLenType CommonFG::openVarLenType(const char* name) const
 {
-   return( iterateElems( name.c_str(), idx, op, op_data ));
-}
-#endif /* H5_NO_DEPRECATED_SYMBOLS */
+    // Call C function H5Topen2 to open the named datatype in this group,
+    // given either the file or group id
+    hid_t type_id = H5Topen2(getLocId(), name, H5P_DEFAULT);
 
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getNumObjs
-///\brief	Returns the number of objects in this group.
-///\return	Number of objects
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - January, 2003
-//--------------------------------------------------------------------------
-hsize_t CommonFG::getNumObjs() const
-{
-   H5G_info_t 		ginfo;                  /* Group information */
+    // If the datatype's opening failed, throw an exception
+    if (type_id < 0)
+        throwException("openVarLenType", "H5Topen2 failed");
 
-   herr_t ret_value = H5Gget_info(getLocId(), &ginfo);
-   if(ret_value < 0)
-      throwException("getNumObjs", "H5Gget_info failed");
-   return (ginfo.nlinks);
+    // No failure, create and return the VarLenType object
+    VarLenType varlen_type;
+    f_DataType_setId(&varlen_type, type_id);
+    return(varlen_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG::getObjnameByIdx
-///\brief	Returns the name of an object in this group, given the
-///		object's index.
-///\param	idx  -     IN: Transient index of the object
-///\return	Object name
-///\exception	H5::FileIException or H5::GroupIException
-///\par Description
-///		The value of idx can be any nonnegative number less than the
-///		total number of objects in the group, which is returned by
-///		the function \c CommonFG::getNumObjs.  Note that this is a
-///		transient index; thus, an object may have a different index
-///		each time the group is opened.
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    CommonFG::openVarLenType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-H5std_string CommonFG::getObjnameByIdx(hsize_t idx) const
+VarLenType CommonFG::openVarLenType(const H5std_string& name) const
 {
-    // call H5Lget_name_by_idx with name as NULL to get its length
-    ssize_t name_len = H5Lget_name_by_idx(getLocId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, NULL, 0, H5P_DEFAULT);
-    if(name_len < 0)
-      throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
-
-    // now, allocate C buffer to get the name
-    char* name_C = new char[name_len+1];
-    HDmemset(name_C, 0, name_len+1); // clear buffer
-
-    name_len = H5Lget_name_by_idx(getLocId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, name_C, name_len+1, H5P_DEFAULT);
-
-    if (name_len < 0)
-    {
-	delete []name_C;
-	throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
-    }
-
-    // clean up and return the string
-    H5std_string name = H5std_string(name_C);
-    delete []name_C;
-    return (name);
+    return(openVarLenType(name.c_str()));
 }
 
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjnameByIdx
-///\brief	Retrieves the name of an object in this group, given the
-///		object's index.
-///\param	idx  -     IN: Transient index of the object
-///\param	name - IN/OUT: Retrieved name of the object
-///\param	size -     IN: Length to retrieve
-///\return	Actual size of the object name or 0, if object has no name
-///\exception	H5::FileIException or H5::GroupIException
-///\par Description
-///		The value of idx can be any nonnegative number less than the
-///		total number of objects in the group, which is returned by
-///		the function \c CommonFG::getNumObjs.  Note that this is a
-///		transient index; thus, an object may have a different index
-///		each time the group is opened.
-// Programmer	Binh-Minh Ribler - January, 2003
-//--------------------------------------------------------------------------
-ssize_t CommonFG::getObjnameByIdx(hsize_t idx, char* name, size_t size) const
-{
-   ssize_t name_len = H5Lget_name_by_idx(getLocId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, name, size, H5P_DEFAULT);
-   if(name_len < 0)
-      throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
-
-   return (name_len);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjnameByIdx
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - January, 2003
-//--------------------------------------------------------------------------
-ssize_t CommonFG::getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size) const
-{
-   char* name_C = new char[size+1]; // temporary C-string for object name
-   HDmemset(name_C, 0, size+1); // clear buffer
-
-   // call overloaded function to get the name
-   ssize_t name_len = getObjnameByIdx(idx, name_C, size+1);
-   if(name_len < 0)
-   {
-      delete []name_C;
-      throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
-   }
-
-   // clean up and return the string
-   name = H5std_string(name_C);
-   delete []name_C;
-   return (name_len);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::childObjType
-///\brief	Returns the type of an object in this file/group, given the
-///		object's name.
-///\param	objname - IN: Name of the object
-///\return	Object type, which can have the following values for group,
-///		dataset, and named datatype
-///		\li \c H5O_TYPE_GROUP
-///		\li \c H5O_TYPE_DATASET
-///		\li \c H5O_TYPE_NAMED_DATATYPE
-///		Refer to the C API documentation for more details:
-///		http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
-///\exception	H5::FileIException or H5::GroupIException
-///		Exception will be thrown when:
-///		- an error returned by the C API
-///		- object type is not one of the valid values above
-// Programmer	Binh-Minh Ribler - April, 2014
-//--------------------------------------------------------------------------
-H5O_type_t CommonFG::childObjType(const char* objname) const
-{
-    H5O_info_t objinfo;
-    H5O_type_t objtype = H5O_TYPE_UNKNOWN;
-
-    // Use C API to get information of the object
-    herr_t ret_value = H5Oget_info_by_name(getLocId(), objname, &objinfo, H5P_DEFAULT);
-
-    // Throw exception if C API returns failure
-    if (ret_value < 0)
-	throwException("childObjType", "H5Oget_info_by_name failed");
-    // Return a valid type or throw an exception for unknown type
-    else
-      switch (objinfo.type)
-      {
-	case H5O_TYPE_GROUP:
-	case H5O_TYPE_DATASET:
-	case H5O_TYPE_NAMED_DATATYPE:
-	    objtype = objinfo.type;
-	    break;
-	case H5O_TYPE_UNKNOWN:
-	case H5O_TYPE_NTYPES:
-	default:
-	    throwException("childObjType", "Unknown type of object");
-      }
-    return(objtype);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::childObjType
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes an \a H5std_string for the object's name.
-///\brief	Returns the type of an object in this group, given the
-///		object's name.
-///\param	objname - IN: Name of the object (H5std_string&)
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - April, 2014
-//--------------------------------------------------------------------------
-H5O_type_t CommonFG::childObjType(const H5std_string& objname) const
-{
-    // Use overloaded function
-    H5O_type_t objtype = childObjType(objname.c_str());
-    return(objtype);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::childObjType
-///\brief	Returns the type of an object in this file/group, given the
-///		object's index and its type and order.
-///\param	index - IN: Position of the object
-///\param	index_type - IN: Type of the index, default to H5_INDEX_NAME
-///\param	order - IN: Traversing order, default to H5_ITER_INC
-///\param	objname - IN: Name of the object, default to "."
-///\return	Object type, which can have the following values for group,
-///		dataset, and named datatype
-///		\li \c H5O_TYPE_GROUP
-///		\li \c H5O_TYPE_DATASET
-///		\li \c H5O_TYPE_NAMED_DATATYPE
-///		Refer to the C API documentation for more details:
-///		http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
-///\exception	H5::FileIException or H5::GroupIException
-///		Exception will be thrown when:
-///		- an error returned by the C API
-///		- object type is not one of the valid values above
-// Developer's Notes:
-//	- this overload uses H5Oget_info_by_idx instead of H5Oget_info_by_name
-//	  like the previous childObjType()
-//	- index is the required argument so, first
-//	- objname is last because it's more likely the location is already
-//	  fully specified
-//	- Leave property list out for now because C API is not using it, it
-//	  can be added later when needed.
-// Programmer	Binh-Minh Ribler - April, 2014
-//--------------------------------------------------------------------------
-H5O_type_t CommonFG::childObjType(hsize_t index, H5_index_t index_type, H5_iter_order_t order, const char* objname) const
-{
-    herr_t ret_value;
-    H5O_info_t objinfo;
-    H5O_type_t objtype = H5O_TYPE_UNKNOWN;
-
-    // Use C API to get information of the object
-    ret_value = H5Oget_info_by_idx(getLocId(), objname, index_type, order, index, &objinfo, H5P_DEFAULT);
-
-    // Throw exception if C API returns failure
-    if (ret_value < 0)
-	throwException("childObjType", "H5Oget_info_by_idx failed");
-    // Return a valid type or throw an exception for unknown type
-    else
-      switch (objinfo.type)
-      {
-	case H5O_TYPE_GROUP:
-	case H5O_TYPE_DATASET:
-	case H5O_TYPE_NAMED_DATATYPE:
-	    objtype = objinfo.type;
-	    break;
-	case H5O_TYPE_UNKNOWN:
-	case H5O_TYPE_NTYPES:
-	default:
-	    throwException("childObjType", "Unknown type of object");
-      }
-    return(objtype);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::childObjVersion
-///\brief	Returns the object header version of an object in this file/group,
-///		given the object's name.
-///\param	objname - IN: Name of the object
-///\return	Object version, which can have the following values:
-///		\li \c H5O_VERSION_1
-///		\li \c H5O_VERSION_2
-///\exception	H5::FileIException or H5::GroupIException
-///		Exception will be thrown when:
-///		- an error returned by the C API
-///		- version number is not one of the valid values above
-// Programmer	Binh-Minh Ribler - April, 2014
-//--------------------------------------------------------------------------
-unsigned CommonFG::childObjVersion(const char* objname) const
-{
-    H5O_info_t objinfo;
-    unsigned version = 0;
-
-    // Use C API to get information of the object
-    herr_t ret_value = H5Oget_info_by_name(getLocId(), objname, &objinfo, H5P_DEFAULT);
-
-    // Throw exception if C API returns failure
-    if (ret_value < 0)
-	throwException("childObjVersion", "H5Oget_info_by_name failed");
-    // Return a valid version or throw an exception for invalid value
-    else
-    {
-	version = objinfo.hdr.version;
-	if (version != H5O_VERSION_1 && version != H5O_VERSION_2)
-	    throwException("childObjVersion", "Invalid version for object");
-    }
-    return(version);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::childObjVersion
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes an \a H5std_string for the object's name.
-///\brief	Returns the type of an object in this group, given the
-///		object's name.
-///\param	objname - IN: Name of the object (H5std_string&)
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - April, 2014
-//--------------------------------------------------------------------------
-unsigned CommonFG::childObjVersion(const H5std_string& objname) const
-{
-    // Use overloaded function
-    unsigned version = childObjVersion(objname.c_str());
-    return(version);
-}
-
-#ifndef H5_NO_DEPRECATED_SYMBOLS
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	CommonFG::getObjTypeByIdx
-///\brief	Returns the type of an object in this group, given the
-///		object's index.
-///\param	idx - IN: Transient index of the object
-///\return	Object type
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - January, 2003
-//--------------------------------------------------------------------------
-H5G_obj_t CommonFG::getObjTypeByIdx(hsize_t idx) const
-{
-   H5G_obj_t obj_type = H5Gget_objtype_by_idx(getLocId(), idx);
-   if (obj_type == H5G_UNKNOWN)
-      throwException("getObjTypeByIdx", "H5Gget_objtype_by_idx failed");
-
-   return (obj_type);
-}
-
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjTypeByIdx
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function because it also provides
-///		the returned object type in text (char*)
-///\param	idx       - IN: Transient index of the object
-///\param	type_name - OUT: Object type in text
-///\return	Object type
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - May, 2010
-// Modification
-//		Modified to use the other function. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-H5G_obj_t CommonFG::getObjTypeByIdx(hsize_t idx, char* type_name) const
-{
-    H5std_string stype_name(type_name);
-    return(getObjTypeByIdx(idx, stype_name));
-}
-//--------------------------------------------------------------------------
-// Function:	CommonFG::getObjTypeByIdx
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function because it also provides
-///		the returned object type in text (H5std_string&)
-///\param	idx       - IN: Transient index of the object
-///\param	type_name - OUT: Object type in text
-///\return	Object type
-///\exception	H5::FileIException or H5::GroupIException
-// Programmer	Binh-Minh Ribler - January, 2003
-//--------------------------------------------------------------------------
-H5G_obj_t CommonFG::getObjTypeByIdx(hsize_t idx, H5std_string& type_name) const
-{
-    H5G_obj_t obj_type = H5Gget_objtype_by_idx(getLocId(), idx);
-    switch (obj_type)
-    {
-        case H5G_LINK: type_name = H5std_string("symbolic link"); break;
-        case H5G_GROUP: type_name = H5std_string("group"); break;
-        case H5G_DATASET: type_name = H5std_string("dataset"); break;
-        case H5G_TYPE: type_name = H5std_string("datatype"); break;
-        case H5G_UNKNOWN:
-	case H5G_UDLINK:
-	case H5G_RESERVED_5:
-	case H5G_RESERVED_6:
-	case H5G_RESERVED_7:
-        default:
-           throwException("getObjTypeByIdx", "H5Gget_objtype_by_idx failed");
-    }
-    return (obj_type);
-}
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
-#endif /* H5_NO_DEPRECATED_SYMBOLS */
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-//--------------------------------------------------------------------------
-// Function:	CommonFG default constructor
-///\brief	Default constructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG default constructor
+///\brief       Default constructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 CommonFG::CommonFG() {}
 
 //--------------------------------------------------------------------------
-// Function:	CommonFG destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CommonFG destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 CommonFG::~CommonFG() {}
 
 //--------------------------------------------------------------------------
-// Function:	f_DataType_setId - friend
-// Purpose:	This function is friend to class H5::DataType so that it
-//		can set DataType::id in order to work around a problem
-//		described in the JIRA issue HDFFV-7947.
-//		Applications shouldn't need to use it.
+// Function:    f_DataType_setId - friend
+// Purpose:     This function is friend to class H5::DataType so that it
+//              can set DataType::id in order to work around a problem
+//              described in the JIRA issue HDFFV-7947.
+//              Applications shouldn't need to use it.
 // param        dtype   - IN/OUT: DataType object to be changed
 // param        new_id - IN: New id to set
-// Programmer	Binh-Minh Ribler - 2015
+// Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
 void f_DataType_setId(DataType* dtype, hid_t new_id)
 {
@@ -1281,14 +364,14 @@ void f_DataType_setId(DataType* dtype, hid_t new_id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	f_DataSet_setId - friend
-// Purpose:	This function is friend to class H5::DataSet so that it
-//		can set DataSet::id in order to work around a problem
-//		described in the JIRA issue HDFFV-7947.
-//		Applications shouldn't need to use it.
+// Function:    f_DataSet_setId - friend
+// Purpose:     This function is friend to class H5::DataSet so that it
+//              can set DataSet::id in order to work around a problem
+//              described in the JIRA issue HDFFV-7947.
+//              Applications shouldn't need to use it.
 // param        dset   - IN/OUT: DataSet object to be changed
 // param        new_id - IN: New id to set
-// Programmer	Binh-Minh Ribler - 2015
+// Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
 void f_DataSet_setId(DataSet* dset, hid_t new_id)
 {
@@ -1297,7 +380,4 @@ void f_DataSet_setId(DataSet* dset, hid_t new_id)
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
-
+} // end namespace
diff --git a/c++/src/H5CommonFG.h b/c++/src/H5CommonFG.h
index d36d78c..dbcf520 100644
--- a/c++/src/H5CommonFG.h
+++ b/c++/src/H5CommonFG.h
@@ -6,20 +6,16 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __CommonFG_H
 #define __CommonFG_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 // Class forwarding
 class Group;
@@ -28,153 +24,65 @@ class ArrayType;
 class VarLenType;
 
 /*! \class CommonFG
-    \brief \a CommonFG is an abstract base class of H5File and H5Group.
-
-    It provides common operations of H5File and H5Group.
+    \brief CommonFG will be deprecated in future releases.
+    In 1.10.1, most member functions are moved to H5Location.
 */
 class H5_DLLCPP CommonFG {
    public:
-	// Creates a new group at this location which can be a file
-	// or another group.
-	Group createGroup(const char* name, size_t size_hint = 0) const;
-	Group createGroup(const H5std_string& name, size_t size_hint = 0) const;
-
-	// Opens an existing group in a location which can be a file
-	// or another group.
-	Group openGroup(const char* name) const;
-	Group openGroup(const H5std_string& name) const;
-
-	// Creates a new dataset at this location.
-	DataSet createDataSet(const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT) const;
-	DataSet createDataSet(const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT) const;
-
-	// Opens an existing dataset at this location.
-	DataSet openDataSet(const char* name) const;
-	DataSet openDataSet(const H5std_string& name) const;
-
-	// Returns the value of a symbolic link.
-	H5std_string getLinkval(const char* link_name, size_t size=0) const;
-	H5std_string getLinkval(const H5std_string& link_name, size_t size=0) const;
-
-	// Returns the number of objects in this group.
-	hsize_t getNumObjs() const;
-
-	// Retrieves the name of an object in this group, given the
-	// object's index.
-	H5std_string getObjnameByIdx(hsize_t idx) const;
-	ssize_t getObjnameByIdx(hsize_t idx, char* name, size_t size) const;
-	ssize_t getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size) const;
-
-	// Retrieves the type of an object in this file or group, given the
-	// object's name
-	H5O_type_t childObjType(const H5std_string& objname) const;
-	H5O_type_t childObjType(const char* objname) const;
-	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=".") const;
-
-	// Returns the object header version of an object in this file or group,
-	// given the object's name.
-	unsigned childObjVersion(const char* objname) const;
-	unsigned childObjVersion(const H5std_string& objname) const;
-
-#ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Returns the type of an object in this group, given the
-	// object's index.
-	H5G_obj_t getObjTypeByIdx(hsize_t idx) const;
-	H5G_obj_t getObjTypeByIdx(hsize_t idx, char* type_name) const;
-	H5G_obj_t getObjTypeByIdx(hsize_t idx, H5std_string& type_name) const;
-
-	// Returns information about an HDF5 object, given by its name,
-	// at this location.
-	void getObjinfo(const char* name, hbool_t follow_link, H5G_stat_t& statbuf) const;
-	void getObjinfo(const H5std_string& name, hbool_t follow_link, H5G_stat_t& statbuf) const;
-	void getObjinfo(const char* name, H5G_stat_t& statbuf) const;
-	void getObjinfo(const H5std_string& name, H5G_stat_t& statbuf) const;
-
-	// Iterates over the elements of this group - not implemented in
-	// C++ style yet.
-	int iterateElems(const char* name, int *idx, H5G_iterate_t op, void *op_data);
-	int iterateElems(const H5std_string& name, int *idx, H5G_iterate_t op, void *op_data);
-#endif /* H5_NO_DEPRECATED_SYMBOLS */
-
-	// Creates a link of the specified type from new_name to current_name;
-	// both names are interpreted relative to the specified location id.
-	void link(H5L_type_t link_type, const char* curr_name, const char* new_name) const;
-	void link(H5L_type_t link_type, const H5std_string& curr_name, const H5std_string& new_name) const;
-
-	// Removes the specified name at this location.
-	void unlink(const char* name) const;
-	void unlink(const H5std_string& name) const;
-
-	// Mounts the file 'child' onto this location.
-	void mount(const char* name, const H5File& child, const PropList& plist) const;
-	void mount(const char* name, H5File& child, PropList& plist) const; // backward compatibility
-	void mount(const H5std_string& name, const H5File& child, const PropList& plist) const;
-	void mount(const H5std_string& name, H5File& child, PropList& plist) const; // backward compatibility
-
-	// Unmounts the file named 'name' from this parent location.
-	void unmount(const char* name) const;
-	void unmount(const H5std_string& name) const;
-
-	// Renames an object at this location.
-	void move(const char* src, const char* dst) const;
-	void move(const H5std_string& src, const H5std_string& dst) const;
-
-	// Opens a generic named datatype in this location.
-	DataType openDataType(const char* name) const;
-	DataType openDataType(const H5std_string& name) const;
-
-	// Opens a named array datatype in this location.
-	ArrayType openArrayType(const char* name) const;
-	ArrayType openArrayType(const H5std_string& name) const;
-
-	// Opens a named compound datatype in this location.
-	CompType openCompType(const char* name) const;
-	CompType openCompType(const H5std_string& name) const;
-
-	// Opens a named enumeration datatype in this location.
-	EnumType openEnumType(const char* name) const;
-	EnumType openEnumType(const H5std_string& name) const;
-
-	// Opens a named integer datatype in this location.
-	IntType openIntType(const char* name) const;
-	IntType openIntType(const H5std_string& name) const;
-
-	// Opens a named floating-point datatype in this location.
-	FloatType openFloatType(const char* name) const;
-	FloatType openFloatType(const H5std_string& name) const;
-
-	// Opens a named string datatype in this location.
-	StrType openStrType(const char* name) const;
-	StrType openStrType(const H5std_string& name) const;
-
-	// Opens a named variable length datatype in this location.
-	VarLenType openVarLenType(const char* name) const;
-	VarLenType openVarLenType(const H5std_string& name) const;
+        // Opens a generic named datatype in this location.
+        DataType openDataType(const char* name) const;
+        DataType openDataType(const H5std_string& name) const;
+
+        // Opens a named array datatype in this location.
+        ArrayType openArrayType(const char* name) const;
+        ArrayType openArrayType(const H5std_string& name) const;
+
+        // Opens a named compound datatype in this location.
+        CompType openCompType(const char* name) const;
+        CompType openCompType(const H5std_string& name) const;
+
+        // Opens a named enumeration datatype in this location.
+        EnumType openEnumType(const char* name) const;
+        EnumType openEnumType(const H5std_string& name) const;
+
+        // Opens a named integer datatype in this location.
+        IntType openIntType(const char* name) const;
+        IntType openIntType(const H5std_string& name) const;
+
+        // Opens a named floating-point datatype in this location.
+        FloatType openFloatType(const char* name) const;
+        FloatType openFloatType(const H5std_string& name) const;
+
+        // Opens a named string datatype in this location.
+        StrType openStrType(const char* name) const;
+        StrType openStrType(const H5std_string& name) const;
+
+        // Opens a named variable length datatype in this location.
+        VarLenType openVarLenType(const char* name) const;
+        VarLenType openVarLenType(const H5std_string& name) const;
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	/// For subclasses, H5File and Group, to return the correct
-	/// object id, i.e. file or group id.
-	virtual hid_t getLocId() const = 0;
+        /// For subclasses, H5File and Group, to return the correct
+        /// object id, i.e. file or group id.
+        virtual hid_t getLocId() const = 0;
 
 
-	/// For subclasses, H5File and Group, to throw appropriate exception.
-	virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const = 0;
+        /// For subclasses, H5File and Group, to throw appropriate exception.
+        virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const = 0;
 
-	// Default constructor.
-	CommonFG();
+        // Default constructor.
+        CommonFG();
 
-	// Noop destructor.
-	virtual ~CommonFG();
+        // Noop destructor.
+        virtual ~CommonFG();
 
     protected:
-	virtual void p_setId(const hid_t new_id) = 0;
+        virtual void p_setId(const hid_t new_id) = 0;
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-}; // end of CommonFG declaration
+}; // end of CommonFG
+} // namespace H5
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __CommonFG_H
 
diff --git a/c++/src/H5CompType.cpp b/c++/src/H5CompType.cpp
index 82575d6..f7862c9 100644
--- a/c++/src/H5CompType.cpp
+++ b/c++/src/H5CompType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,183 +17,219 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5Alltypes.h"
 #include "H5AbstractDs.h"
-#include "H5DxferProp.h"
 #include "H5DataSpace.h"
 #include "H5DataSet.h"
-#include "H5private.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	CompType default constructor
-///\brief	Default constructor: Creates a stub compound datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType default constructor
+///\brief       Default constructor: Creates a stub compound datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 CompType::CompType() : DataType() {}
 
 //--------------------------------------------------------------------------
-// Function:	CompType copy constructor
-///\brief	Copy constructor: makes copy of the original CompType object
-///\param	original - IN: Original CompType instance
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType copy constructor
+///\brief       Copy constructor: makes copy of the original CompType object
+///\param       original - IN: Original CompType instance
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-CompType::CompType( const CompType& original ) : DataType( original ) {}
+CompType::CompType(const CompType& original) : DataType(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	CompType overloaded constructor
-///\brief	Creates a CompType object using the id of an existing datatype.
-///\param	existing_id - IN: Id of an existing compound datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType overloaded constructor
+///\brief       Creates a CompType object using the id of an existing datatype.
+///\param       existing_id - IN: Id of an existing compound datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-CompType::CompType( const hid_t existing_id ) : DataType( existing_id ) {}
+CompType::CompType(const hid_t existing_id) : DataType(existing_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	CompType overloaded constructor
-///\brief	Creates an empty compound datatype given a size, in bytes.
-///\param	size - IN: Number of bytes in the datatype to create
-///\exception	H5::DataTypeIException
+// Function:    CompType overloaded constructor
+///\brief       Creates an empty compound datatype given a size, in bytes.
+///\param       size - IN: Number of bytes in the datatype to create
+///\exception   H5::DataTypeIException
 // Description
-// 		The DataType constructor calls the C API H5Tcreate to create
-// 		the compound datatype.
-// Programmer	Binh-Minh Ribler - 2000
+//              The DataType constructor calls the C API H5Tcreate to create
+//              the compound datatype.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-CompType::CompType( size_t size ) : DataType( H5T_COMPOUND, size ) {}
+CompType::CompType(size_t size) : DataType(H5T_COMPOUND, size) {}
 
 //--------------------------------------------------------------------------
-// Function:	CompType overloaded constructor
-///\brief	Gets the compound datatype of the specified dataset.
-///\param	dataset - IN: Dataset that this enum datatype associates with
-///\return	CompType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType overloaded constructor
+///\brief       Gets the compound datatype of the specified dataset.
+///\param       dataset - IN: Dataset that this enum datatype associates with
+///\return      CompType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-CompType::CompType( const DataSet& dataset ) : DataType()
+CompType::CompType(const DataSet& dataset) : DataType()
 {
-   // Calls C function H5Dget_type to get the id of the datatype
-   id = H5Dget_type( dataset.getId() );
-
-   // If the datatype id is invalid, throw exception
-   if( id < 0 )
-   {
-      throw DataSetIException("CompType constructor", "H5Dget_type failed");
-   }
+    // Calls C function H5Dget_type to get the id of the datatype
+    id = H5Dget_type(dataset.getId());
+
+    // If the datatype id is invalid, throw exception
+    if (id < 0)
+    {
+        throw DataSetIException("CompType constructor", "H5Dget_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getNmembers
-///\brief	Returns the number of members in this compound datatype.
-///\return	Number of members
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType overloaded constructor
+///\brief       Creates an CompType instance by opening an HDF5 compound
+///             given its name, provided as a C character string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Compound type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openCompType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+CompType::CompType(const H5Location& loc, const char *dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name);
+}
+
+//--------------------------------------------------------------------------
+// Function:    CompType overloaded constructor
+///\brief       Creates an CompType instance by opening an HDF5 compound
+///             datatype given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Compound type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openCompType(const H5Location&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+CompType::CompType(const H5Location& loc, const H5std_string& dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    CompType::getNmembers
+///\brief       Returns the number of members in this compound datatype.
+///\return      Number of members
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 int CompType::getNmembers() const
 {
-   int num_members = H5Tget_nmembers( id );
-   if( num_members < 0 )
-   {
-      throw DataTypeIException("CompType::getNmembers",
-		"H5Tget_nmembers returns negative number of members");
-   }
-   return( num_members );
+    int num_members = H5Tget_nmembers(id);
+    if (num_members < 0)
+    {
+        throw DataTypeIException("CompType::getNmembers",
+            "H5Tget_nmembers returns negative number of members");
+    }
+    return(num_members);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberName
-///\brief	Returns the name of a member in this compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	Name of member
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberName
+///\brief       Returns the name of a member in this compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      Name of member
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5std_string CompType::getMemberName( unsigned member_num ) const
+H5std_string CompType::getMemberName(unsigned member_num) const
 {
-    char* member_name_C = H5Tget_member_name( id, member_num );
-    if( member_name_C == NULL )  // NULL means failure
+    char* member_name_C = H5Tget_member_name(id, member_num);
+    if (member_name_C == NULL)  // NULL means failure
     {
-	throw DataTypeIException("CompType::getMemberName",
-		"H5Tget_member_name returns NULL for member name");
+        throw DataTypeIException("CompType::getMemberName",
+             "H5Tget_member_name returns NULL for member name");
     }
     H5std_string member_name = H5std_string(member_name_C); // convert C string to string
     H5free_memory(member_name_C); // free the C string
-    return( member_name ); // return the member name string
+    return(member_name); // return the member name string
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberIndex
-///\brief	Returns the index of a member in this compound datatype.
-///\param	name - IN: Name of the member
-///\return	Index of member
-///\exception	H5::DataTypeIException
+// Function:    CompType::getMemberIndex
+///\brief       Returns the index of a member in this compound datatype.
+///\param       name - IN: Name of the member
+///\return      Index of member
+///\exception   H5::DataTypeIException
 ///\par Description
-///		Members are stored in no particular order with numbers 0
-///		through N-1, where N is the value returned by the member
-///		function \c CompType::getNmembers.
-// Programmer	Binh-Minh Ribler - May 16, 2002
+///             Members are stored in no particular order with numbers 0
+///             through N-1, where N is the value returned by the member
+///             function \c CompType::getNmembers.
+// Programmer   Binh-Minh Ribler - May 16, 2002
 //--------------------------------------------------------------------------
 int CompType::getMemberIndex(const char* name) const
 {
-   int member_index = H5Tget_member_index(id, name);
-   if( member_index < 0 )
-   {
-      throw DataTypeIException("CompType::getMemberIndex",
-		"H5Tget_member_index returns negative value");
-   }
-   return( member_index );
+    int member_index = H5Tget_member_index(id, name);
+    if (member_index < 0)
+    {
+        throw DataTypeIException("CompType::getMemberIndex",
+             "H5Tget_member_index returns negative value");
+    }
+    return(member_index);
 }
 int CompType::getMemberIndex(const H5std_string& name) const
 {
-   return(getMemberIndex(name.c_str()));
+    return(getMemberIndex(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberOffset
-///\brief	Returns the byte offset of the beginning of a member with
-///		respect to the beginning of the compound data type datum.
-///\param	member_num - IN: Zero-based index of the member
-///\return	Byte offset
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberOffset
+///\brief       Returns the byte offset of the beginning of a member with
+///             respect to the beginning of the compound data type datum.
+///\param       member_num - IN: Zero-based index of the member
+///\return      Byte offset
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 // Description
-///		Members are stored in no particular order with numbers 0
-///		through N-1, where N is the value returned by the member
-///		function \c CompType::getNmembers.
+///             Members are stored in no particular order with numbers 0
+///             through N-1, where N is the value returned by the member
+///             function \c CompType::getNmembers.
 //
-//		Note that byte offset being returned as 0 doesn't indicate
-//		a failure. (According to Quincey)
+//              Note that byte offset being returned as 0 doesn't indicate
+//              a failure. (According to Quincey)
 //--------------------------------------------------------------------------
-size_t CompType::getMemberOffset( unsigned member_num ) const
+size_t CompType::getMemberOffset(unsigned member_num) const
 {
-   size_t offset = H5Tget_member_offset( id, member_num );
-   return( offset );
+    size_t offset = H5Tget_member_offset(id, member_num);
+    return(offset);
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberClass
-///\brief	Gets the type class of the specified member.
-///\param	member_num - IN: Zero-based index of the member
-///\return	Type class of the member
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberClass
+///\brief       Gets the type class of the specified member.
+///\param       member_num - IN: Zero-based index of the member
+///\return      Type class of the member
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Modified to use H5Tget_member_class instead. - Jul, 2005
+//              Modified to use H5Tget_member_class instead. - Jul, 2005
 //--------------------------------------------------------------------------
-H5T_class_t CompType::getMemberClass( unsigned member_num ) const
+H5T_class_t CompType::getMemberClass(unsigned member_num) const
 {
-   H5T_class_t member_class = H5Tget_member_class(id, member_num);
-   if( member_class == H5T_NO_CLASS )
-   {
-      throw DataTypeIException("CompType::getMemberClass",
-		"H5Tget_member_class returns H5T_NO_CLASS");
-   }
-   return(member_class);
+    H5T_class_t member_class = H5Tget_member_class(id, member_num);
+    if (member_class == H5T_NO_CLASS)
+    {
+        throw DataTypeIException("CompType::getMemberClass",
+             "H5Tget_member_class returns H5T_NO_CLASS");
+    }
+    return(member_class);
 }
 
 // This private member function calls the C API to get the identifier
@@ -204,185 +238,184 @@ H5T_class_t CompType::getMemberClass( unsigned member_num ) const
 // the sub-types.
 hid_t CompType::p_get_member_type(unsigned member_num) const
 {
-   // get the id of the specified member first
-   hid_t member_type_id = H5Tget_member_type( id, member_num );
-   if( member_type_id > 0 )
-      return( member_type_id );
-   else
-   {
-      // p_get_member_type is private, caller will catch this exception
-      // then throw another with appropriate API name
-      throw DataTypeIException("", "H5Tget_member_type failed");
-   }
+    // get the id of the specified member first
+    hid_t member_type_id = H5Tget_member_type(id, member_num);
+    if (member_type_id > 0)
+        return(member_type_id);
+    else
+    {
+        // p_get_member_type is private, caller will catch this exception
+        // then throw another with appropriate API name
+        throw DataTypeIException("", "H5Tget_member_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberDataType
-///\brief	Returns the generic datatype of the specified member in this
-///		compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	DataType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberDataType
+///\brief       Returns the generic datatype of the specified member in this
+///             compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      DataType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DataType CompType::getMemberDataType( unsigned member_num ) const
+DataType CompType::getMemberDataType(unsigned member_num) const
 {
-   try {
-	DataType datatype;
-	f_DataType_setId(&datatype, p_get_member_type(member_num));
-	return(datatype);
-   }
-   catch (DataTypeIException E) {
-	throw DataTypeIException("CompType::getMemberDataType", E.getDetailMsg());
-   }
+    try {
+        DataType datatype;
+        f_DataType_setId(&datatype, p_get_member_type(member_num));
+        return(datatype);
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberDataType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberArrayType
-///\brief	Returns the array datatype of the specified member in this
-///		compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	ArrayType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    CompType::getMemberArrayType
+///\brief       Returns the array datatype of the specified member in this
+///             compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      ArrayType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-ArrayType CompType::getMemberArrayType( unsigned member_num ) const
+ArrayType CompType::getMemberArrayType(unsigned member_num) const
 {
-   try {
-	ArrayType arraytype;
-	f_DataType_setId(&arraytype, p_get_member_type(member_num));
-	arraytype.setArrayInfo();
-	return(arraytype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberArrayType", E.getDetailMsg());
-   }
+    try {
+        ArrayType arraytype(p_get_member_type(member_num));
+        f_DataType_setId(&arraytype, p_get_member_type(member_num));
+        return(arraytype);
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberArrayType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberCompType
-///\brief	Returns the compound datatype of the specified member in this
-///		compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	CompType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberCompType
+///\brief       Returns the compound datatype of the specified member in this
+///             compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      CompType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-CompType CompType::getMemberCompType( unsigned member_num ) const
+CompType CompType::getMemberCompType(unsigned member_num) const
 {
    try {
       CompType comptype(p_get_member_type(member_num));
-	f_DataType_setId(&comptype, p_get_member_type(member_num));
+        f_DataType_setId(&comptype, p_get_member_type(member_num));
       return(comptype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberCompType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberCompType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberEnumType
-///\brief	Returns the enumeration datatype of the specified member in
-///		this compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	EnumType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberEnumType
+///\brief       Returns the enumeration datatype of the specified member in
+///             this compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      EnumType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType CompType::getMemberEnumType( unsigned member_num ) const
+EnumType CompType::getMemberEnumType(unsigned member_num) const
 {
    try {
       EnumType enumtype(p_get_member_type(member_num));
-	f_DataType_setId(&enumtype, p_get_member_type(member_num));
+        f_DataType_setId(&enumtype, p_get_member_type(member_num));
       return(enumtype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberEnumType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberEnumType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberIntType
-///\brief	Returns the integer datatype of the specified member in this
-///		compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	IntType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberIntType
+///\brief       Returns the integer datatype of the specified member in this
+///             compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      IntType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType CompType::getMemberIntType( unsigned member_num ) const
+IntType CompType::getMemberIntType(unsigned member_num) const
 {
    try {
       IntType inttype(p_get_member_type(member_num));
-	f_DataType_setId(&inttype, p_get_member_type(member_num));
+        f_DataType_setId(&inttype, p_get_member_type(member_num));
       return(inttype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberIntType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberIntType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberFloatType
-///\brief	Returns the floating-point datatype of the specified member
-///		in this compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	FloatType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberFloatType
+///\brief       Returns the floating-point datatype of the specified member
+///             in this compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      FloatType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType CompType::getMemberFloatType( unsigned member_num ) const
+FloatType CompType::getMemberFloatType(unsigned member_num) const
 {
    try {
       FloatType floatype(p_get_member_type(member_num));
-	f_DataType_setId(&floatype, p_get_member_type(member_num));
+        f_DataType_setId(&floatype, p_get_member_type(member_num));
       return(floatype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberFloatType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberFloatType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberStrType
-///\brief	Returns the string datatype of the specified member in this
-///		compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	StrType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::getMemberStrType
+///\brief       Returns the string datatype of the specified member in this
+///             compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      StrType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType CompType::getMemberStrType( unsigned member_num ) const
+StrType CompType::getMemberStrType(unsigned member_num) const
 {
    try {
       StrType strtype(p_get_member_type(member_num));
-	f_DataType_setId(&strtype, p_get_member_type(member_num));
+        f_DataType_setId(&strtype, p_get_member_type(member_num));
       return(strtype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberStrType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberStrType", E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::getMemberVarLenType
-///\brief	Returns the variable length datatype of the specified member
-///		in this compound datatype.
-///\param	member_num - IN: Zero-based index of the member
-///\return	VarLenType instance
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    CompType::getMemberVarLenType
+///\brief       Returns the variable length datatype of the specified member
+///             in this compound datatype.
+///\param       member_num - IN: Zero-based index of the member
+///\return      VarLenType instance
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-VarLenType CompType::getMemberVarLenType( unsigned member_num ) const
+VarLenType CompType::getMemberVarLenType(unsigned member_num) const
 {
    try {
       VarLenType varlentype(p_get_member_type(member_num));
-	f_DataType_setId(&varlentype, p_get_member_type(member_num));
+        f_DataType_setId(&varlentype, p_get_member_type(member_num));
       return(varlentype);
-   }
-   catch (DataTypeIException E) {
-      throw DataTypeIException("CompType::getMemberVarLenType", E.getDetailMsg());
-   }
+    }
+    catch (DataTypeIException& E) {
+        throw DataTypeIException("CompType::getMemberVarLenType", E.getDetailMsg());
+    }
 }
 
 /* old style of getMemberType - using overloads; new style above
@@ -391,27 +424,27 @@ VarLenType CompType::getMemberVarLenType( unsigned member_num ) const
    May, 2004: These should be reconsidered to provide more convenience.
 // Returns the datatype of the specified member in this compound datatype.
 // Several overloading of getMemberType are for different datatypes
-void CompType::getMemberType( unsigned member_num, EnumType& enumtype ) const
+void CompType::getMemberType(unsigned member_num, EnumType& enumtype) const
 {
    p_get_member_type(member_num, enumtype);
 }
 
-void CompType::getMemberType( unsigned member_num, CompType& comptype ) const
+void CompType::getMemberType(unsigned member_num, CompType& comptype) const
 {
    p_get_member_type(member_num, comptype);
 }
 
-void CompType::getMemberType( unsigned member_num, IntType& inttype ) const
+void CompType::getMemberType(unsigned member_num, IntType& inttype) const
 {
    p_get_member_type(member_num, inttype);
 }
 
-void CompType::getMemberType( unsigned member_num, FloatType& floatype ) const
+void CompType::getMemberType(unsigned member_num, FloatType& floatype) const
 {
    p_get_member_type(member_num, floatype);
 }
 
-void CompType::getMemberType( unsigned member_num, StrType& strtype ) const
+void CompType::getMemberType(unsigned member_num, StrType& strtype) const
 {
    p_get_member_type(member_num, strtype);
 }
@@ -419,55 +452,55 @@ void CompType::getMemberType( unsigned member_num, StrType& strtype ) const
 */
 
 //--------------------------------------------------------------------------
-// Function:	CompType::insertMember
-///\brief	Inserts a new member to this compound datatype.
-///\param	name - IN: Name of the new member
-///\param	offset - IN: Offset in memory structure of the field to insert
-///\param	new_member - IN: New member to be inserted
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    CompType::insertMember
+///\brief       Inserts a new member to this compound datatype.
+///\param       name - IN: Name of the new member
+///\param       offset - IN: Offset in memory structure of the field to insert
+///\param       new_member - IN: New member to be inserted
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void CompType::insertMember( const H5std_string& name, size_t offset, const DataType& new_member ) const
+void CompType::insertMember(const H5std_string& name, size_t offset, const DataType& new_member) const
 {
-   // Convert string to C-string
-   const char* name_C;
-   name_C = name.c_str();  // name_C refers to the contents of name as a C-str
-
-   hid_t new_member_id = new_member.getId();  // get new_member id for C API
-
-   // Call C routine H5Tinsert to add the new member
-   herr_t ret_value = H5Tinsert( id, name_C, offset, new_member_id );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("CompType::insertMember", "H5Tinsert failed");
-   }
+    // Convert string to C-string
+    const char* name_C;
+    name_C = name.c_str();  // name_C refers to the contents of name as a C-str
+
+    hid_t new_member_id = new_member.getId();  // get new_member id for C API
+
+    // Call C routine H5Tinsert to add the new member
+    herr_t ret_value = H5Tinsert(id, name_C, offset, new_member_id);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("CompType::insertMember", "H5Tinsert failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::pack
-///\brief	Recursively removes padding from within a compound datatype.
+// Function:    CompType::pack
+///\brief       Recursively removes padding from within a compound datatype.
 ///
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void CompType::pack() const
 {
-   // Calls C routine H5Tpack to remove padding
-   herr_t ret_value = H5Tpack( id );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("CompType::pack", "H5Tpack failed");
-   }
+    // Calls C routine H5Tpack to remove padding
+    herr_t ret_value = H5Tpack(id);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("CompType::pack", "H5Tpack failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	CompType::setSize
-///\brief	Sets the total size for this compound datatype.
-///\param	size - IN: Size to set
-///\exception	H5::DataTypeIException
+// Function:    CompType::setSize
+///\brief       Sets the total size for this compound datatype.
+///\param       size - IN: Size to set
+///\exception   H5::DataTypeIException
 // Note
-//	H5Tset_size works on atom datatypes and compound datatypes only
-// Programmer	Binh-Minh Ribler - 2014
+//      H5Tset_size works on atom datatypes and compound datatypes only
+// Programmer   Binh-Minh Ribler - 2014
 //--------------------------------------------------------------------------
 void CompType::setSize(size_t size) const
 {
@@ -475,7 +508,7 @@ void CompType::setSize(size_t size) const
     herr_t ret_value = H5Tset_size(id, size);
     if (ret_value < 0)
     {
-	throw DataTypeIException("CompType::setSize", "H5Tset_size failed");
+        throw DataTypeIException("CompType::setSize", "H5Tset_size failed");
     }
 }
 
@@ -486,6 +519,4 @@ void CompType::setSize(size_t size) const
 //--------------------------------------------------------------------------
 CompType::~CompType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5CompType.h b/c++/src/H5CompType.h
index bd6d76c..e2a6b34 100644
--- a/c++/src/H5CompType.h
+++ b/c++/src/H5CompType.h
@@ -6,113 +6,114 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5CompType_H
 #define __H5CompType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class CompType
     \brief CompType is a derivative of a DataType and operates on HDF5
     compound datatypes.
 */
+//  Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP CompType : public DataType {
    public:
-	// Default constructor
-	CompType();
+        // Default constructor
+        CompType();
 
-	// Creates a compound datatype using an existing id
-	CompType( const hid_t existing_id );
+        // Creates a compound datatype using an existing id
+        CompType(const hid_t existing_id);
 
-	// Creates a new compound datatype, given the type's size
-	CompType( size_t size ); // H5Tcreate
+        // Creates a new compound datatype, given the type's size
+        CompType(size_t size); // H5Tcreate
 
-	// Gets the compound datatype of the specified dataset
-	CompType( const DataSet& dataset );  // H5Dget_type
+        // Gets the compound datatype of the specified dataset
+        CompType(const DataSet& dataset);  // H5Dget_type
 
-	// Copy constructor - makes a copy of original object
-	CompType( const CompType& original );
+        // Copy constructor - makes a copy of original object
+        CompType(const CompType& original);
 
-	// Returns the type class of the specified member of this compound
-	// datatype.  It provides to the user a way of knowing what type
-	// to create another datatype of the same class
-	H5T_class_t getMemberClass( unsigned member_num ) const;
+        // Constructors that open a compound datatype, given a location.
+        CompType(const H5Location& loc, const char* name);
+        CompType(const H5Location& loc, const H5std_string& name);
 
-	// Returns the index of a member in this compound data type.
-	int getMemberIndex(const char* name) const;
-	int getMemberIndex(const H5std_string& name) const;
+        // Returns the type class of the specified member of this compound
+        // datatype.  It provides to the user a way of knowing what type
+        // to create another datatype of the same class
+        H5T_class_t getMemberClass(unsigned member_num) const;
 
-	// Returns the offset of a member of this compound datatype.
-	size_t getMemberOffset( unsigned memb_no ) const;
+        // Returns the index of a member in this compound data type.
+        int getMemberIndex(const char* name) const;
+        int getMemberIndex(const H5std_string& name) const;
 
-	// Returns the name of a member of this compound datatype.
-	H5std_string getMemberName( unsigned member_num ) const;
+        // Returns the offset of a member of this compound datatype.
+        size_t getMemberOffset(unsigned memb_no) const;
 
-	// Returns the generic datatype of the specified member in
-	// this compound datatype.
-	DataType getMemberDataType( unsigned member_num ) const;
+        // Returns the name of a member of this compound datatype.
+        H5std_string getMemberName(unsigned member_num) const;
 
-	// Returns the array datatype of the specified member in
-	// this compound datatype.
-	ArrayType getMemberArrayType( unsigned member_num ) const;
+        // Returns the generic datatype of the specified member in
+        // this compound datatype.
+        DataType getMemberDataType(unsigned member_num) const;
 
-	// Returns the compound datatype of the specified member in
-	// this compound datatype.
-	CompType getMemberCompType( unsigned member_num ) const;
+        // Returns the array datatype of the specified member in
+        // this compound datatype.
+        ArrayType getMemberArrayType(unsigned member_num) const;
 
-	// Returns the enumeration datatype of the specified member in
-	// this compound datatype.
-	EnumType getMemberEnumType( unsigned member_num ) const;
+        // Returns the compound datatype of the specified member in
+        // this compound datatype.
+        CompType getMemberCompType(unsigned member_num) const;
 
-	// Returns the integer datatype of the specified member in
-	// this compound datatype.
-	IntType getMemberIntType( unsigned member_num ) const;
+        // Returns the enumeration datatype of the specified member in
+        // this compound datatype.
+        EnumType getMemberEnumType(unsigned member_num) const;
 
-	// Returns the floating-point datatype of the specified member in
-	// this compound datatype.
-	FloatType getMemberFloatType( unsigned member_num ) const;
+        // Returns the integer datatype of the specified member in
+        // this compound datatype.
+        IntType getMemberIntType(unsigned member_num) const;
 
-	// Returns the string datatype of the specified member in
-	// this compound datatype.
-	StrType getMemberStrType( unsigned member_num ) const;
+        // Returns the floating-point datatype of the specified member in
+        // this compound datatype.
+        FloatType getMemberFloatType(unsigned member_num) const;
 
-	// Returns the variable length datatype of the specified member in
-	// this compound datatype.
-	VarLenType getMemberVarLenType( unsigned member_num ) const;
+        // Returns the string datatype of the specified member in
+        // this compound datatype.
+        StrType getMemberStrType(unsigned member_num) const;
 
-	// Returns the number of members in this compound datatype.
-	int getNmembers() const;
+        // Returns the variable length datatype of the specified member in
+        // this compound datatype.
+        VarLenType getMemberVarLenType(unsigned member_num) const;
 
-	// Adds a new member to this compound datatype.
-	void insertMember( const H5std_string& name, size_t offset, const DataType& new_member ) const;
+        // Returns the number of members in this compound datatype.
+        int getNmembers() const;
 
-	// Recursively removes padding from within this compound datatype.
-	void pack() const;
+        // Adds a new member to this compound datatype.
+        void insertMember(const H5std_string& name, size_t offset, const DataType& new_member) const;
 
-	// Sets the total size for this compound datatype.
-	void setSize(size_t size) const;
+        // Recursively removes padding from within this compound datatype.
+        void pack() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("CompType"); }
+        // Sets the total size for this compound datatype.
+        void setSize(size_t size) const;
 
-	// Noop destructor.
-	virtual ~CompType();
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("CompType"); }
+
+        // Noop destructor.
+        virtual ~CompType();
 
    private:
-	// Contains common code that is used by the member functions
-	// getMemberXxxType
-	hid_t p_get_member_type(unsigned member_num) const;
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+        // Contains common code that is used by the member functions
+        // getMemberXxxType
+        hid_t p_get_member_type(unsigned member_num) const;
+
+}; // end of CompType
+} // namespace H5
+
 #endif // __H5CompType_H
diff --git a/c++/src/H5Cpp.h b/c++/src/H5Cpp.h
index 4e82ee3..09914e8 100644
--- a/c++/src/H5Cpp.h
+++ b/c++/src/H5Cpp.h
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Cpp_H
@@ -22,17 +20,17 @@
 #include "H5IdComponent.h"
 #include "H5DataSpace.h"
 #include "H5PropList.h"
+#include "H5FaccProp.h"
+#include "H5FcreatProp.h"
+#include "H5OcreatProp.h"
+#include "H5DcreatProp.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
 #include "H5Location.h"
 #include "H5Object.h"
 #include "H5AbstractDs.h"
 #include "H5Attribute.h"
-#include "H5OcreatProp.h"
-#include "H5DcreatProp.h"
-#include "H5CommonFG.h"
 #include "H5DataType.h"
-#include "H5DxferProp.h"
-#include "H5FaccProp.h"
-#include "H5FcreatProp.h"
 #include "H5AtomType.h"
 #include "H5PredType.h"
 #include "H5EnumType.h"
@@ -43,6 +41,7 @@
 #include "H5ArrayType.h"
 #include "H5VarLenType.h"
 #include "H5DataSet.h"
+#include "H5CommonFG.h"
 #include "H5Group.h"
 #include "H5File.h"
 #include "H5Library.h"
diff --git a/c++/src/H5CppDoc.h b/c++/src/H5CppDoc.h
index 2420586..543f49b 100644
--- a/c++/src/H5CppDoc.h
+++ b/c++/src/H5CppDoc.h
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5CppDoc_H
@@ -67,34 +65,34 @@
  * <br />
  */
 
-///	This example shows how to create datasets.
+///        This example shows how to create datasets.
 ///\par
 ///\example     create.cpp
 
 ///\par
-///	This example shows how to write datasets.
+///        This example shows how to write datasets.
 ///\example     writedata.cpp
 
 ///\par
-///	This example shows how to read datasets.
+///        This example shows how to read datasets.
 ///\example     readdata.cpp
 
 ///\par
-///	This example shows how to create a compound datatype,
-///	write an array which has the compound datatype to the file,
-///	and read back fields' subsets.
+///        This example shows how to create a compound datatype,
+///        write an array which has the compound datatype to the file,
+///        and read back fields' subsets.
 ///\example     compound.cpp
 
 ///\par
-///	This example shows how to work with extendible datasets.
+///        This example shows how to work with extendible datasets.
 ///\example     extend_ds.cpp
 
 ///\par
-///	This example shows how to read data from a chunked dataset.
+///        This example shows how to read data from a chunked dataset.
 ///\example     chunks.cpp
 
 ///\par
-///	This example shows how to work with groups.
+///        This example shows how to work with groups.
 ///\example     h5group.cpp
 
 #endif // __H5CppDoc_H
diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp
index 7305347..dd2fd21 100644
--- a/c++/src/H5DataSet.cpp
+++ b/c++/src/H5DataSet.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -20,52 +18,47 @@
 #endif
 #include <string>
 
+#include "H5private.h"             // for HDfree
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5PropList.h"
+#include "H5FaccProp.h"
+#include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DxferProp.h"
 #include "H5DcreatProp.h"
-#include "H5FaccProp.h"
-#include "H5FcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5DataSpace.h"
 #include "H5AbstractDs.h"
-#include "H5File.h"
 #include "H5Attribute.h"
 #include "H5DataSet.h"
-#include "H5private.h"		// for HDfree
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
 //--------------------------------------------------------------------------
-// Function:	DataSet default constructor
-///\brief	Default constructor: creates a stub DataSet.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet default constructor
+///\brief       Default constructor: creates a stub DataSet.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSet::DataSet() : H5Object(), AbstractDs(), id(H5I_INVALID_HID) {}
 
 //--------------------------------------------------------------------------
-// Function:	DataSet overloaded constructor
-///\brief	Creates an DataSet object using the id of an existing dataset.
-///\param	existing_id - IN: Id of an existing dataset
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet overloaded constructor
+///\brief       Creates an DataSet object using the id of an existing dataset.
+///\param       existing_id - IN: Id of an existing dataset
+// Programmer   Binh-Minh Ribler - 2000
 // Description
-//		incRefCount() is needed here to prevent the id from being closed
-//		prematurely.  That is, when application uses the id of an
-//		existing DataSet object to create another DataSet object.  So,
-//		when one of those objects is deleted, the id will be closed if
-//		the reference counter is only 1.
+//              incRefCount() is needed here to prevent the id from being closed
+//              prematurely.  That is, when application uses the id of an
+//              existing DataSet object to create another DataSet object.  So,
+//              when one of those objects is deleted, the id will be closed if
+//              the reference counter is only 1.
 //--------------------------------------------------------------------------
 DataSet::DataSet(const hid_t existing_id) : H5Object(), AbstractDs(), id(existing_id)
 {
@@ -73,10 +66,10 @@ DataSet::DataSet(const hid_t existing_id) : H5Object(), AbstractDs(), id(existin
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet copy constructor
-///\brief	Copy constructor: makes a copy of the original DataSet object.
-///\param	original - IN: DataSet instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet copy constructor
+///\brief       Copy constructor: makes a copy of the original DataSet object.
+///\param       original - IN: DataSet instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs(), id(original.id)
 {
@@ -84,22 +77,22 @@ DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs(), id(origina
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 location, creates a
-///		DataSet object
-///\param	loc - IN: Dataset reference object is in or location of
-///			  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
+// Function:    DataSet overload constructor - dereference
+///\brief       Given a reference, ref, to an hdf5 location, creates a
+///             DataSet object
+///\param       loc - IN: Dataset reference object is in or location of
+///                       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
-///		is a datatype that has been named by DataType::commit.
-// Programmer	Binh-Minh Ribler - Oct, 2006
+///             \c loc can be DataSet, Group, H5File, or named DataType, that
+///             is a datatype that has been named by DataType::commit.
+// Programmer   Binh-Minh Ribler - Oct, 2006
 // Modification
-//	Jul, 2008
-//		Added for application convenience.
+//      Jul, 2008
+//              Added for application convenience.
 //--------------------------------------------------------------------------
 DataSet::DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), AbstractDs(), id(H5I_INVALID_HID)
 {
@@ -107,18 +100,18 @@ DataSet::DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type, co
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 attribute, creates a
-///		DataSet object
-///\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
+// Function:    DataSet overload constructor - dereference
+///\brief       Given a reference, ref, to an hdf5 attribute, creates a
+///             DataSet object
+///\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.
+//      Jul, 2008
+//              Added for application convenience.
 //--------------------------------------------------------------------------
 DataSet::DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), AbstractDs(), id(H5I_INVALID_HID)
 {
@@ -126,26 +119,26 @@ DataSet::DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type, co
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getSpace
-///\brief	Gets a copy of the dataspace of this dataset.
-///\return	DataSpace instance
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getSpace
+///\brief       Gets a copy of the dataspace of this dataset.
+///\return      DataSpace instance
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSpace DataSet::getSpace() const
 {
-   // Calls C function H5Dget_space to get the id of the dataspace
-   hid_t dataspace_id = H5Dget_space( id );
-
-   // If the dataspace id is invalid, throw an exception
-   if( dataspace_id < 0 )
-   {
-      throw DataSetIException("DataSet::getSpace", "H5Dget_space failed");
-   }
-   //create dataspace object using the existing id then return the object
-   DataSpace data_space;
-   f_DataSpace_setId(&data_space, dataspace_id);
-   return( data_space );
+    // Calls C function H5Dget_space to get the id of the dataspace
+    hid_t dataspace_id = H5Dget_space(id);
+
+    // If the dataspace id is invalid, throw an exception
+    if (dataspace_id < 0)
+    {
+        throw DataSetIException("DataSet::getSpace", "H5Dget_space failed");
+    }
+    //create dataspace object using the existing id then return the object
+    DataSpace data_space;
+    f_DataSpace_setId(&data_space, dataspace_id);
+    return(data_space);
 }
 
 // This private member function calls the C API to get the identifier
@@ -153,57 +146,57 @@ DataSpace DataSet::getSpace() const
 // by the various AbstractDs functions to get the specific datatype.
 hid_t DataSet::p_get_type() const
 {
-   hid_t type_id = H5Dget_type( id );
-   if( type_id > 0 )
-      return( type_id );
-   else
-   {
-      throw DataSetIException("", "H5Dget_type failed");
-   }
+    hid_t type_id = H5Dget_type(id);
+    if (type_id > 0)
+        return(type_id);
+    else
+    {
+        throw DataSetIException("", "H5Dget_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getCreatePlist
-///\brief	Gets the dataset creation property list.
-///\return	DSetCreatPropList instance
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getCreatePlist
+///\brief       Gets the dataset creation property list.
+///\return      DSetCreatPropList instance
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetCreatPropList DataSet::getCreatePlist() const
 {
-   hid_t create_plist_id = H5Dget_create_plist( id );
-   if( create_plist_id < 0 )
-   {
-      throw DataSetIException("DataSet::getCreatePlist", "H5Dget_create_plist failed");
-   }
-
-   // create and return the DSetCreatPropList object
-   DSetCreatPropList create_plist;
-   f_PropList_setId(&create_plist, create_plist_id);
-   return(create_plist);
+    hid_t create_plist_id = H5Dget_create_plist(id);
+    if (create_plist_id < 0)
+    {
+        throw DataSetIException("DataSet::getCreatePlist", "H5Dget_create_plist failed");
+    }
+
+    // create and return the DSetCreatPropList object
+    DSetCreatPropList create_plist;
+    f_PropList_setId(&create_plist, create_plist_id);
+    return(create_plist);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getStorageSize
-///\brief	Returns the amount of storage required for a dataset.
-///\return	Size of the storage or 0, for no data
-///\exception	H5::DataSetIException
-// Note:	H5Dget_storage_size returns 0 when there is no data.  This
-//		function should have no failure. (from SLU)
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    DataSet::getStorageSize
+///\brief       Returns the amount of storage required for a dataset.
+///\return      Size of the storage or 0, for no data
+///\exception   H5::DataSetIException
+// Note:        H5Dget_storage_size returns 0 when there is no data.  This
+//              function should have no failure. (from SLU)
+// Programmer   Binh-Minh Ribler - Mar, 2005
 //--------------------------------------------------------------------------
 hsize_t DataSet::getStorageSize() const
 {
-   hsize_t storage_size = H5Dget_storage_size(id);
-   return(storage_size);
+    hsize_t storage_size = H5Dget_storage_size(id);
+    return(storage_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getInMemDataSize
-///\brief	Gets the size in memory of the dataset's data.
-///\return	Size of data (in memory)
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - Apr 2009
+// Function:    DataSet::getInMemDataSize
+///\brief       Gets the size in memory of the dataset's data.
+///\return      Size of data (in memory)
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - Apr 2009
 //--------------------------------------------------------------------------
 size_t DataSet::getInMemDataSize() const
 {
@@ -211,9 +204,9 @@ size_t DataSet::getInMemDataSize() const
 
     // Get the data type of this dataset
     hid_t mem_type_id = H5Dget_type(id);
-    if( mem_type_id < 0 )
+    if (mem_type_id < 0)
     {
-	throw DataSetIException(func, "H5Dget_type failed");
+        throw DataSetIException(func, "H5Dget_type failed");
     }
 
     // Get the data type's size by first getting its native type then getting
@@ -221,22 +214,22 @@ size_t DataSet::getInMemDataSize() const
     hid_t native_type = H5Tget_native_type(mem_type_id, H5T_DIR_DEFAULT);
     if (native_type < 0)
     {
-	throw DataSetIException(func, "H5Tget_native_type failed");
+        throw DataSetIException(func, "H5Tget_native_type failed");
     }
     size_t type_size = H5Tget_size(native_type);
     if (type_size == 0)
     {
-	throw DataSetIException(func, "H5Tget_size failed");
+        throw DataSetIException(func, "H5Tget_size failed");
     }
 
     // Close the native type and the datatype of this dataset.
     if (H5Tclose(native_type) < 0)
     {
-	throw DataSetIException(func, "H5Tclose(native_type) failed");
+        throw DataSetIException(func, "H5Tclose(native_type) failed");
     }
     if (H5Tclose(mem_type_id) < 0)
     {
-	throw DataSetIException(func, "H5Tclose(mem_type_id) failed");
+        throw DataSetIException(func, "H5Tclose(mem_type_id) failed");
     }
 
     // Get number of elements of the dataset by first getting its dataspace,
@@ -244,18 +237,18 @@ size_t DataSet::getInMemDataSize() const
     hid_t space_id = H5Dget_space(id);
     if (space_id < 0)
     {
-	throw DataSetIException(func, "H5Dget_space failed");
+        throw DataSetIException(func, "H5Dget_space failed");
     }
     hssize_t num_elements = H5Sget_simple_extent_npoints(space_id);
     if (num_elements < 0)
     {
-	throw DataSetIException(func, "H5Sget_simple_extent_npoints failed");
+        throw DataSetIException(func, "H5Sget_simple_extent_npoints failed");
     }
 
     // Close the dataspace
     if (H5Sclose(space_id) < 0)
     {
-	throw DataSetIException(func, "H5Sclose failed");
+        throw DataSetIException(func, "H5Sclose failed");
     }
 
     // Calculate and return the size of the data
@@ -264,181 +257,184 @@ size_t DataSet::getInMemDataSize() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getOffset
-///\brief	Returns the address of this dataset in the file.
-///\return	Address of dataset
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getOffset
+///\brief       Returns the address of this dataset in the file.
+///\return      Address of dataset
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 haddr_t DataSet::getOffset() const
 {
-   haddr_t ds_addr; // for address of dataset
-
-   ds_addr = H5Dget_offset(id);
-   if( ds_addr == HADDR_UNDEF )
-   {
-      throw DataSetIException("DataSet::getOffset", "H5Dget_offset returned HADDR_UNDEF");
-   }
-   return(ds_addr);
+    haddr_t ds_addr; // for address of dataset
+
+    ds_addr = H5Dget_offset(id);
+    if (ds_addr == HADDR_UNDEF)
+    {
+        throw DataSetIException("DataSet::getOffset", "H5Dget_offset returned HADDR_UNDEF");
+    }
+    return(ds_addr);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getSpaceStatus
-///\brief	Determines whether space has been allocated for a dataset.
-///\param	status - OUT: Space allocation status
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getSpaceStatus
+///\brief       Determines whether space has been allocated for a dataset.
+///\param       status - OUT: Space allocation status
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSet::getSpaceStatus(H5D_space_status_t& status) const
 {
-   herr_t ret_value = H5Dget_space_status(id, &status);
-   if( ret_value < 0 )
-   {
-      throw DataSetIException("DataSet::getSpaceStatus", "H5Dget_space_status failed");
-   }
+    herr_t ret_value = H5Dget_space_status(id, &status);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::getSpaceStatus", "H5Dget_space_status failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getVlenBufSize
-///\brief	Returns the number of bytes required to store VL data.
-///\return	Amount of storage
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getVlenBufSize
+///\brief       Returns the number of bytes required to store VL data.
+///\param       type - IN: Datatype, which is the datatype for the buffer
+///\param       space - IN: Selection for the memory buffer
+///\return      Amount of storage
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-hsize_t DataSet::getVlenBufSize(const DataType& type, const DataSpace& space ) const
+hsize_t DataSet::getVlenBufSize(const DataType& type, const DataSpace& space) const
 {
-   // Obtain identifiers for C API
-   hid_t type_id = type.getId();
-   hid_t space_id = space.getId();
-
-   hsize_t size; // for amount of storage
-
-   herr_t ret_value = H5Dvlen_get_buf_size( id, type_id, space_id, &size );
-   if( ret_value < 0 )
-   {
-      throw DataSetIException("DataSet::getVlenBufSize", "H5Dvlen_get_buf_size failed");
-   }
-   return( size );
+    // Obtain identifiers for C API
+    hid_t type_id = type.getId();
+    hid_t space_id = space.getId();
+
+    hsize_t size; // for amount of storage
+
+    herr_t ret_value = H5Dvlen_get_buf_size(id, type_id, space_id, &size);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::getVlenBufSize", "H5Dvlen_get_buf_size failed");
+    }
+    return(size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::getVlenBufSize
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Return	Amount of storage
-// Exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::getVlenBufSize
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Return       Amount of storage
+// Exception    H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
+//--------------------------------------------------------------------------
+//hsize_t DataSet::getVlenBufSize(DataType& type, DataSpace& space) const
+//{
+//    return(getVlenBufSize(type, space));
+//}
+
+//--------------------------------------------------------------------------
+// Function:    DataSet::vlenReclaim
+///\brief       Reclaims VL datatype memory buffers.
+///\param       type - IN: Datatype, which is the datatype stored in the buffer
+///\param       space - IN: Selection for the memory buffer to free the
+///             VL datatypes within
+///\param       xfer_plist - IN: Property list used to create the buffer
+///\param       buf - IN: Pointer to the buffer to be reclaimed
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-hsize_t DataSet::getVlenBufSize( DataType& type, DataSpace& space ) const
+void DataSet::vlenReclaim(const DataType& type, const DataSpace& space, const DSetMemXferPropList& xfer_plist, void* buf)
 {
-    return(getVlenBufSize(type, space));
-}
+    // Obtain identifiers for C API
+    hid_t type_id = type.getId();
+    hid_t space_id = space.getId();
+    hid_t xfer_plist_id = xfer_plist.getId();
 
-//--------------------------------------------------------------------------
-// Function:	DataSet::vlenReclaim
-///\brief	Reclaims VL datatype memory buffers.
-///\param	type - IN: Datatype, which is the datatype stored in the buffer
-///\param	space - IN: Selection for the memory buffer to free the
-///		VL datatypes within
-///\param	xfer_plist - IN: Property list used to create the buffer
-///\param	buf - IN: Pointer to the buffer to be reclaimed
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DataSet::vlenReclaim(const DataType& type, const DataSpace& space, const DSetMemXferPropList& xfer_plist, void* buf )
-{
-   // Obtain identifiers for C API
-   hid_t type_id = type.getId();
-   hid_t space_id = space.getId();
-   hid_t xfer_plist_id = xfer_plist.getId();
-
-   herr_t ret_value = H5Dvlen_reclaim( type_id, space_id, xfer_plist_id, buf );
-   if( ret_value < 0 )
-   {
-      throw DataSetIException("DataSet::vlenReclaim", "H5Dvlen_reclaim failed");
-   }
+    herr_t ret_value = H5Dvlen_reclaim(type_id, space_id, xfer_plist_id, buf);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::vlenReclaim", "H5Dvlen_reclaim failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::vlenReclaim
-///\brief	Reclaims VL datatype memory buffers.
-///\param	type - IN: Datatype, which is the datatype stored in the buffer
-///\param	space - IN: Selection for the memory buffer to free the
-///		VL datatypes within
-///\param	xfer_plist - IN: Property list used to create the buffer
-///\param	buf - IN: Pointer to the buffer to be reclaimed
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::vlenReclaim
+///\brief       Reclaims VL datatype memory buffers.
+///\param       type - IN: Datatype, which is the datatype stored in the buffer
+///\param       space - IN: Selection for the memory buffer to free the
+///             VL datatypes within
+///\param       xfer_plist - IN: Property list used to create the buffer
+///\param       buf - IN: Pointer to the buffer to be reclaimed
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //\parDescription
-//		This function has better prototype for the users than the
-//		other, which might be removed at some point. BMR - 2006/12/20
+//              This function has better prototype for the users than the
+//              other, which might be removed at some point. BMR - 2006/12/20
 //--------------------------------------------------------------------------
 void DataSet::vlenReclaim(void* buf, const DataType& type, const DataSpace& space, const DSetMemXferPropList& xfer_plist)
 {
-   // Obtain identifiers for C API
-   hid_t type_id = type.getId();
-   hid_t space_id = space.getId();
-   hid_t xfer_plist_id = xfer_plist.getId();
-
-   herr_t ret_value = H5Dvlen_reclaim(type_id, space_id, xfer_plist_id, buf);
-   if (ret_value < 0)
-   {
-      throw DataSetIException("DataSet::vlenReclaim", "H5Dvlen_reclaim failed");
-   }
+    // Obtain identifiers for C API
+    hid_t type_id = type.getId();
+    hid_t space_id = space.getId();
+    hid_t xfer_plist_id = xfer_plist.getId();
+
+    herr_t ret_value = H5Dvlen_reclaim(type_id, space_id, xfer_plist_id, buf);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::vlenReclaim", "H5Dvlen_reclaim failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::read
-///\brief	Reads raw data from the specified dataset.
-///\param	buf - IN: Buffer for read data
-///\param	mem_type - IN: Memory datatype
-///\param	mem_space - IN: Memory dataspace
-///\param	file_space - IN: Dataset's dataspace in the file
-///\param	xfer_plist - IN: Transfer property list for this I/O operation
-///\exception	H5::DataSetIException
+// Function:    DataSet::read
+///\brief       Reads raw data from the specified dataset.
+///\param       buf - IN: Buffer for read data
+///\param       mem_type - IN: Memory datatype
+///\param       mem_space - IN: Memory dataspace
+///\param       file_space - IN: Dataset's dataspace in the file
+///\param       xfer_plist - IN: Transfer property list for this I/O operation
+///\exception   H5::DataSetIException
 ///\par Description
-///		This function reads raw data from this dataset into the
-///		buffer \a buf, converting from file datatype and dataspace
-///		to memory datatype \a mem_type and dataspace \a mem_space.
-// Programmer	Binh-Minh Ribler - 2000
+///             This function reads raw data from this dataset into the
+///             buffer \a buf, converting from file datatype and dataspace
+///             to memory datatype \a mem_type and dataspace \a mem_space.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSet::read( void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const
+void DataSet::read(void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist) const
 {
-   // Obtain identifiers for C API
-   hid_t mem_type_id = mem_type.getId();
-   hid_t mem_space_id = mem_space.getId();
-   hid_t file_space_id = file_space.getId();
-   hid_t xfer_plist_id = xfer_plist.getId();
-
-   herr_t ret_value = H5Dread( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf );
-   if( ret_value < 0 )
-   {
-      throw DataSetIException("DataSet::read", "H5Dread failed");
-   }
+    // Obtain identifiers for C API
+    hid_t mem_type_id = mem_type.getId();
+    hid_t mem_space_id = mem_space.getId();
+    hid_t file_space_id = file_space.getId();
+    hid_t xfer_plist_id = xfer_plist.getId();
+
+    herr_t ret_value = H5Dread(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::read", "H5Dread failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::read
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes a reference to a \c H5std_string for the buffer.
-///\param	strg - IN: Buffer for read data string
-///\param	mem_type - IN: Memory datatype
-///\param	mem_space - IN: Memory dataspace
-///\param	file_space - IN: Dataset's dataspace in the file
-///\param	xfer_plist - IN: Transfer property list for this I/O operation
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::read
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes a reference to a \c H5std_string for the buffer.
+///\param       strg - IN: Buffer for read data string
+///\param       mem_type - IN: Memory datatype
+///\param       mem_space - IN: Memory dataspace
+///\param       file_space - IN: Dataset's dataspace in the file
+///\param       xfer_plist - IN: Transfer property list for this I/O operation
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	Jul 2009
-//		Follow the change to Attribute::read and use the following
-//		private functions to read datasets with fixed- and
-//		variable-length string:
-//			DataSet::p_read_fixed_len and
-//			DataSet::p_read_variable_len
+//      Jul 2009
+//              Follow the change to Attribute::read and use the following
+//              private functions to read datasets with fixed- and
+//              variable-length string:
+//                  DataSet::p_read_fixed_len and
+//                  DataSet::p_read_variable_len
 //--------------------------------------------------------------------------
 void DataSet::read(H5std_string& strg, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist) const
 {
@@ -467,47 +463,47 @@ void DataSet::read(H5std_string& strg, const DataType& mem_type, const DataSpace
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::write
-///\brief	Writes raw data from an application buffer to a dataset.
-///\param	buf - IN: Buffer containing data to be written
-///\param	mem_type - IN: Memory datatype
-///\param	mem_space - IN: Memory dataspace
-///\param	file_space - IN: Dataset's dataspace in the file
-///\param	xfer_plist - IN: Transfer property list for this I/O operation
-///\exception	H5::DataSetIException
+// Function:    DataSet::write
+///\brief       Writes raw data from an application buffer to a dataset.
+///\param       buf - IN: Buffer containing data to be written
+///\param       mem_type - IN: Memory datatype
+///\param       mem_space - IN: Memory dataspace
+///\param       file_space - IN: Dataset's dataspace in the file
+///\param       xfer_plist - IN: Transfer property list for this I/O operation
+///\exception   H5::DataSetIException
 ///\par Description
-///		This function writes raw data from an application buffer
-///		\a buf to a dataset, converting from memory datatype
-///		\a mem_type and dataspace \a mem_space to file datatype
-///		and dataspace.
-// Programmer	Binh-Minh Ribler - 2000
+///             This function writes raw data from an application buffer
+///             \a buf to a dataset, converting from memory datatype
+///             \a mem_type and dataspace \a mem_space to file datatype
+///             and dataspace.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSet::write( const void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const
+void DataSet::write(const void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist) const
 {
-   // Obtain identifiers for C API
-   hid_t mem_type_id = mem_type.getId();
-   hid_t mem_space_id = mem_space.getId();
-   hid_t file_space_id = file_space.getId();
-   hid_t xfer_plist_id = xfer_plist.getId();
-
-   herr_t ret_value = H5Dwrite( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf );
-   if( ret_value < 0 )
-   {
-      throw DataSetIException("DataSet::write", "H5Dwrite failed");
-   }
+    // Obtain identifiers for C API
+    hid_t mem_type_id = mem_type.getId();
+    hid_t mem_space_id = mem_space.getId();
+    hid_t file_space_id = file_space.getId();
+    hid_t xfer_plist_id = xfer_plist.getId();
+
+    herr_t ret_value = H5Dwrite(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);
+    if (ret_value < 0)
+    {
+        throw DataSetIException("DataSet::write", "H5Dwrite failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::write
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes a reference to a \c H5std_string for the buffer.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::write
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes a reference to a \c H5std_string for the buffer.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	Jul 2009
-//		Modified to pass the buffer into H5Dwrite properly depending
-//		whether the dataset has variable- or fixed-length string.
+//      Jul 2009
+//              Modified to pass the buffer into H5Dwrite properly depending
+//              whether the dataset has variable- or fixed-length string.
 //--------------------------------------------------------------------------
-void DataSet::write( const H5std_string& strg, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const
+void DataSet::write(const H5std_string& strg, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist) const
 {
     // Check if this attribute has variable-len string or fixed-len string and
     // proceed appropriately.
@@ -517,11 +513,11 @@ void DataSet::write( const H5std_string& strg, const DataType& mem_type, const D
         throw DataSetIException("DataSet::write", "H5Tis_variable_str failed");
     }
 
-   // Obtain identifiers for C API
-   hid_t mem_type_id = mem_type.getId();
-   hid_t mem_space_id = mem_space.getId();
-   hid_t file_space_id = file_space.getId();
-   hid_t xfer_plist_id = xfer_plist.getId();
+    // Obtain identifiers for C API
+    hid_t mem_type_id = mem_type.getId();
+    hid_t mem_space_id = mem_space.getId();
+    hid_t file_space_id = file_space.getId();
+    hid_t xfer_plist_id = xfer_plist.getId();
 
     // Convert string to C-string
     const char* strg_C;
@@ -531,12 +527,12 @@ void DataSet::write( const H5std_string& strg, const DataType& mem_type, const D
     // Pass string in differently depends on variable or fixed length
     if (!is_variable_len)
     {
-        ret_value = H5Dwrite( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, strg_C );
+        ret_value = H5Dwrite(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, strg_C);
     }
     else
     {
         // passing string argument by address
-        ret_value = H5Dwrite( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, &strg_C );
+        ret_value = H5Dwrite(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, &strg_C);
     }
     if (ret_value < 0)
     {
@@ -545,67 +541,66 @@ void DataSet::write( const H5std_string& strg, const DataType& mem_type, const D
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::iterateElems
-///\brief	Iterates over all selected elements in a dataspace.
-///\param	buf - IN/OUT: Pointer to the buffer in memory containing the
-///		elements to iterate over
-///\param	type - IN: Datatype for the elements stored in \a buf
-///\param	space - IN: Dataspace for \a buf. Also contains the selection
-///		to iterate over.
-///\param	op - IN: Function pointer to the routine to be called for
-///		each element in \a buf iterated over
-///\param	op_data - IN/OUT: Pointer to any user-defined data associated
-///		with the operation
-///\exception	H5::DataSetIException
-///\note	This function may not work correctly yet - it's still
-///		under development.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-int DataSet::iterateElems( void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data )
+// Function:    DataSet::iterateElems
+///\brief       Iterates over all selected elements in a dataspace.
+///\param       buf - IN/OUT: Pointer to the buffer in memory containing the
+///             elements to iterate over
+///\param       type - IN: Datatype for the elements stored in \a buf
+///\param       space - IN: Dataspace for \a buf. Also contains the selection
+///             to iterate over.
+///\param       op - IN: Function pointer to the routine to be called for
+///             each element in \a buf iterated over
+///\param       op_data - IN/OUT: Pointer to any user-defined data associated
+///             with the operation
+///\exception   H5::DataSetIException
+///\note        This function may not work correctly yet - it's still
+///             under development.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+int DataSet::iterateElems(void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data)
 {
-   // Obtain identifiers for C API
-   hid_t type_id = type.getId();
-   hid_t space_id = space.getId();
-   herr_t ret_value = H5Diterate( buf, type_id, space_id, op, op_data );
-   if( ret_value >= 0 )
-      return( ret_value );
-   else  // raise exception when H5Diterate returns a negative value
-   {
-      throw DataSetIException("DataSet::iterateElems", "H5Diterate failed");
-   }
+    // Obtain identifiers for C API
+    hid_t type_id = type.getId();
+    hid_t space_id = space.getId();
+    herr_t ret_value = H5Diterate(buf, type_id, space_id, op, op_data);
+    if (ret_value >= 0)
+        return(ret_value);
+    else  // raise exception when H5Diterate returns a negative value
+    {
+        throw DataSetIException("DataSet::iterateElems", "H5Diterate failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::extend
-///\brief	Extends a dataset with unlimited dimension.
-///\param	size - IN: Array containing the new magnitude of each dimension
-///\exception	H5::DataSetIException
+// Function:    DataSet::extend
+///\brief       Extends a dataset with unlimited dimension.
+///\param       size - IN: Array containing the new magnitude of each dimension
+///\exception   H5::DataSetIException
 ///\par Description
-///		For more information, please see the Description section in
-///		C layer Reference Manual at:
+///             For more information, please see the Description section in
+///             C layer Reference Manual at:
 ///\par
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5D.html#Dataset-Extend
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSet::extend( const hsize_t* size ) const
+void DataSet::extend(const hsize_t* size) const
 {
-   herr_t ret_value = H5Dset_extent( id, size );
-   if( ret_value < 0 )  // raise exception when H5Dset_extent returns a neg value
-      throw DataSetIException("DataSet::extend", "H5Dset_extent failed");
+    herr_t ret_value = H5Dset_extent(id, size);
+    if (ret_value < 0)  // raise exception when H5Dset_extent returns a neg value
+        throw DataSetIException("DataSet::extend", "H5Dset_extent failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::fillMemBuf
-///\brief	Fills a selection in memory with a value.
-///\param	fill - IN: Pointer to fill value to use - default NULL
-///\param	fill_type - IN: Datatype of the fill value
-///\param	buf - IN/OUT: Memory buffer to fill selection within
-///\param	buf_type - IN: Datatype of the elements in buffer
-///\param	space - IN: Dataspace describing memory buffer & containing selection to use
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2014
+// Function:    DataSet::fillMemBuf
+///\brief       Fills a selection in memory with a value.
+///\param       fill - IN: Pointer to fill value to use - default NULL
+///\param       fill_type - IN: Datatype of the fill value
+///\param       buf - IN/OUT: Memory buffer to fill selection within
+///\param       buf_type - IN: Datatype of the elements in buffer
+///\param       space - IN: Dataspace describing memory buffer & containing selection to use
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2014
 // Modification
-//		Used the non-const version.
 //--------------------------------------------------------------------------
 void DataSet::fillMemBuf(const void *fill, const DataType& fill_type, void *buf, const DataType& buf_type, const DataSpace& space) const
 {
@@ -613,76 +608,78 @@ void DataSet::fillMemBuf(const void *fill, const DataType& fill_type, void *buf,
     hid_t buf_type_id = buf_type.getId();
     hid_t space_id = space.getId();
     herr_t ret_value = H5Dfill(fill, fill_type_id, buf, buf_type_id, space_id);
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw DataSetIException("DataSet::fillMemBuf", "H5Dfill failed");
+        throw DataSetIException("DataSet::fillMemBuf", "H5Dfill failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::fillMemBuf
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param 	fill - IN: Pointer to fill value to use - default NULL
-// Param 	fill_type - IN: Datatype of the fill value
-// Param 	buf - IN/OUT: Memory buffer to fill selection within
-// Param 	buf_type - IN: Datatype of the elements in buffer
-// Param 	space - IN: Dataspace describing memory buffer & containing selection to use
-// Exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::fillMemBuf
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Param        fill - IN: Pointer to fill value to use - default NULL
+// Param        fill_type - IN: Datatype of the fill value
+// Param        buf - IN/OUT: Memory buffer to fill selection within
+// Param        buf_type - IN: Datatype of the elements in buffer
+// Param        space - IN: Dataspace describing memory buffer & containing selection to use
+// Exception    H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-void DataSet::fillMemBuf(const void *fill, DataType& fill_type, void *buf, DataType& buf_type, DataSpace& space)
-{
-    fillMemBuf(fill, (const DataType)fill_type, buf, (const DataType)buf_type, (const DataSpace)space);
-}
+//void DataSet::fillMemBuf(const void *fill, DataType& fill_type, void *buf, DataType& buf_type, DataSpace& space)
+//{
+//    fillMemBuf(fill, (const DataType)fill_type, buf, (const DataType)buf_type, (const DataSpace)space);
+//}
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::fillMemBuf
-///\brief	Fills a selection in memory with 0.
-///\param	buf - IN/OUT: Memory buffer to fill selection within
-///\param	buf_type - IN: Datatype of the elements in buffer
-///\param	space - IN: Dataspace describing memory buffer & containing selection to use
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet::fillMemBuf
+///\brief       Fills a selection in memory with 0.
+///\param       buf - IN/OUT: Memory buffer to fill selection within
+///\param       buf_type - IN: Datatype of the elements in buffer
+///\param       space - IN: Dataspace describing memory buffer & containing selection to use
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSet::fillMemBuf(void *buf, const DataType& buf_type, const DataSpace& space) const
 {
     hid_t buf_type_id = buf_type.getId();
     hid_t space_id = space.getId();
     herr_t ret_value = H5Dfill(NULL, buf_type_id, buf, buf_type_id, space_id);
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw DataSetIException("DataSet::fillMemBuf", "H5Dfill failed");
+        throw DataSetIException("DataSet::fillMemBuf", "H5Dfill failed");
     }
 }
 
 //--------------------------------------------------------------------------
 // Function:    DataSet::fillMemBuf
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
 // Param        buf - IN/OUT: Memory buffer to fill selection within
 // Param        buf_type - IN: Datatype of the elements in buffer
 // Param        space - IN: Dataspace describing memory buffer & containing selection to use
-// Exception	H5::DataSetIException
+// Exception    H5::DataSetIException
 // Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-void DataSet::fillMemBuf(void *buf, DataType& buf_type, DataSpace& space)
-{
-    fillMemBuf(buf, (const DataType)buf_type, (const DataSpace)space);
-}
+//void DataSet::fillMemBuf(void *buf, DataType& buf_type, DataSpace& space)
+//{
+//    fillMemBuf(buf, (const DataType)buf_type, (const DataSpace)space);
+//}
 
 //--------------------------------------------------------------------------
 // Function:    DataSet::getId
-///\brief	Get the id of this dataset.
-///\return	DataSet identifier
+///\brief       Get the id of this dataset.
+///\return      DataSet identifier
 // Description:
 //              Class hierarchy is revised to address bugzilla 1068.  Class
 //              AbstractDs and Attribute are moved out of H5Object.  In
@@ -692,19 +689,19 @@ void DataSet::fillMemBuf(void *buf, DataType& buf_type, DataSpace& space)
 //--------------------------------------------------------------------------
 hid_t DataSet::getId() const
 {
-   return(id);
+    return(id);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::p_read_fixed_len (private)
-// brief	Reads a fixed length \a H5std_string from a dataset.
-// param	mem_type  - IN: DataSet datatype (in memory)
-// param	strg      - IN: Buffer for read string
-// exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - Jul, 2009
+// Function:    DataSet::p_read_fixed_len (private)
+// brief       Reads a fixed length \a H5std_string from a dataset.
+// param       mem_type  - IN: DataSet datatype (in memory)
+// param       strg      - IN: Buffer for read string
+// exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - Jul, 2009
 // Modification
-//	Jul 2009
-//		Added in follow to the change in Attribute::read
+//      Jul 2009
+//              Added in follow to the change in Attribute::read
 //--------------------------------------------------------------------------
 void DataSet::p_read_fixed_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const
 {
@@ -716,33 +713,33 @@ void DataSet::p_read_fixed_len(const hid_t mem_type_id, const hid_t mem_space_id
     // If there is data, allocate buffer and read it.
     if (data_size > 0)
     {
-	char *strg_C = new char [data_size+1];
-	HDmemset(strg_C, 0, data_size+1); // clear buffer
+        char *strg_C = new char [data_size+1];
+        HDmemset(strg_C, 0, data_size+1); // clear buffer
 
-	herr_t ret_value = H5Dread(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, strg_C);
+        herr_t ret_value = H5Dread(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, strg_C);
 
-	if( ret_value < 0 )
-	{
-	    delete []strg_C;	// de-allocate for fixed-len string
-	    throw DataSetIException("DataSet::read", "H5Dread failed for fixed length string");
-	}
+        if (ret_value < 0)
+        {
+            delete []strg_C;    // de-allocate for fixed-len string
+            throw DataSetIException("DataSet::read", "H5Dread failed for fixed length string");
+        }
 
-	// Get string from the C char* and release resource allocated locally
-	strg = strg_C;
-	delete []strg_C;
+        // Get string from the C char* and release resource allocated locally
+        strg = strg_C;
+        delete []strg_C;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::p_read_variable_len (private)
-// brief	Reads a variable length \a H5std_string from an dataset.
-// param	mem_type  - IN: DataSet datatype (in memory)
-// param	strg      - IN: Buffer for read string
-// exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - Jul, 2009
+// Function:    DataSet::p_read_variable_len (private)
+// brief       Reads a variable length \a H5std_string from an dataset.
+// param       mem_type  - IN: DataSet datatype (in memory)
+// param       strg      - IN: Buffer for read string
+// exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - Jul, 2009
 // Modification
-//	Jul 2009
-//		Added in follow to the change in Attribute::read
+//      Jul 2009
+//              Added in follow to the change in Attribute::read
 //--------------------------------------------------------------------------
 void DataSet::p_read_variable_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const
 {
@@ -752,9 +749,9 @@ void DataSet::p_read_variable_len(const hid_t mem_type_id, const hid_t mem_space
     // Read dataset, no allocation for variable-len string; C library will
     herr_t ret_value = H5Dread(id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, &strg_C);
 
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw DataSetIException("DataSet::read", "H5Dread failed for variable length string");
+        throw DataSetIException("DataSet::read", "H5Dread failed for variable length string");
     }
 
     // Get string from the C char* and release resource allocated by C API
@@ -781,7 +778,7 @@ void DataSet::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw DataSetIException(inMemFunc("p_setId"), close_error.getDetailMsg());
     }
    // reset object's id to the given id
@@ -806,46 +803,44 @@ void f_PropList_setId(PropList* plist, hid_t new_id)
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	DataSet::close
-///\brief	Closes this dataset.
+// Function:    DataSet::close
+///\brief       Closes this dataset.
 ///
-///\exception	H5::DataSetIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::DataSetIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void DataSet::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Dclose( id );
-	if( ret_value < 0 )
-	{
-	    throw DataSetIException("DataSet::close", "H5Dclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Dclose(id);
+        if (ret_value < 0)
+        {
+            throw DataSetIException("DataSet::close", "H5Dclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSet destructor
-///\brief	Properly terminates access to this dataset.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSet destructor
+///\brief       Properly terminates access to this dataset.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 DataSet::~DataSet()
 {
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	cerr << "DataSet::~DataSet - " << close_error.getDetailMsg() << endl;
+    catch (Exception& close_error) {
+        cerr << "DataSet::~DataSet - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h
index b2544a2..9a52412 100644
--- a/c++/src/H5DataSet.h
+++ b/c++/src/H5DataSet.h
@@ -6,107 +6,104 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5DataSet_H
 #define __H5DataSet_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class DataSet
     \brief Class DataSet operates on HDF5 datasets.
 
-    An datasets has many characteristics similar to an attribute, thus both
+    A dataset has many characteristics similar to an attribute, thus both
     Attribute and DataSet are derivatives of AbstractDs.  DataSet also
     inherits from H5Object because a dataset is an HDF5 object.
 */
+//  Inheritance: multiple H5Object/AbstractDs -> H5Location -> IdComponent
 class H5_DLLCPP DataSet : public H5Object, public AbstractDs {
    public:
 
-	// Close this dataset.
-	virtual void close();
+        // Close this dataset.
+        virtual void close();
 
-	// Extends the dataset with unlimited dimension.
-	void extend( const hsize_t* size ) const;
+        // Extends the dataset with unlimited dimension.
+        void extend(const hsize_t* size) const;
 
-	// Fills a selection in memory with a value
-	void fillMemBuf(const void *fill, const DataType& fill_type, void *buf, const DataType& buf_type, const DataSpace& space) const;
-	void fillMemBuf(const void *fill, DataType& fill_type, void *buf, DataType& buf_type, DataSpace& space); // kept for backward compatibility
+        // Fills a selection in memory with a value
+        void fillMemBuf(const void *fill, const DataType& fill_type, void *buf, const DataType& buf_type, const DataSpace& space) const;
+        //void fillMemBuf(const void *fill, DataType& fill_type, void *buf, DataType& buf_type, DataSpace& space); // removed from 1.8.18 and 1.10.1
 
-	// Fills a selection in memory with zero
-	void fillMemBuf(void *buf, const DataType& buf_type, const DataSpace& space) const;
-	void fillMemBuf(void *buf, DataType& buf_type, DataSpace& space); // kept for backward compatibility
+        // Fills a selection in memory with zero
+        void fillMemBuf(void *buf, const DataType& buf_type, const DataSpace& space) const;
+        //void fillMemBuf(void *buf, DataType& buf_type, DataSpace& space); // removed from 1.8.18 and 1.10.1
 
-	// Gets the creation property list of this dataset.
-	DSetCreatPropList getCreatePlist() const;
+        // Gets the creation property list of this dataset.
+        DSetCreatPropList getCreatePlist() const;
 
-	// Returns the address of this dataset in the file.
-	haddr_t getOffset() const;
+        // Returns the address of this dataset in the file.
+        haddr_t getOffset() const;
 
-	// Gets the dataspace of this dataset.
-	virtual DataSpace getSpace() const;
+        // Gets the dataspace of this dataset.
+        virtual DataSpace getSpace() const;
 
-	// Determines whether space has been allocated for a dataset.
-	void getSpaceStatus(H5D_space_status_t& status) const;
+        // Determines whether space has been allocated for a dataset.
+        void getSpaceStatus(H5D_space_status_t& status) const;
 
-	// Returns the amount of storage size required for this dataset.
-	virtual hsize_t getStorageSize() const;
+        // Returns the amount of storage size required for this dataset.
+        virtual hsize_t getStorageSize() const;
 
-	// Returns the in memory size of this attribute's data.
-	virtual size_t getInMemDataSize() const;
+        // Returns the in memory size of this attribute's data.
+        virtual size_t getInMemDataSize() const;
 
-	// Returns the number of bytes required to store VL data.
-	hsize_t getVlenBufSize(const DataType& type, const DataSpace& space ) const;
-	hsize_t getVlenBufSize(DataType& type, DataSpace& space) const; // kept for backward compatibility
+        // Returns the number of bytes required to store VL data.
+        hsize_t getVlenBufSize(const DataType& type, const DataSpace& space) const;
+        //hsize_t getVlenBufSize(DataType& type, DataSpace& space) const; // removed from 1.8.18 and 1.10.1
 
-	// Reclaims VL datatype memory buffers.
-	static void vlenReclaim(const DataType& type, const DataSpace& space, const DSetMemXferPropList& xfer_plist, void* buf );
-	static void vlenReclaim(void *buf, const DataType& type, const DataSpace& space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT);
+        // Reclaims VL datatype memory buffers.
+        static void vlenReclaim(const DataType& type, const DataSpace& space, const DSetMemXferPropList& xfer_plist, void* buf);
+        static void vlenReclaim(void *buf, const DataType& type, const DataSpace& space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT);
 
-	// Reads the data of this dataset and stores it in the provided buffer.
-	// The memory and file dataspaces and the transferring property list
-	// can be defaults.
-	void read( void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const;
-        void read( H5std_string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const;
+        // Reads the data of this dataset and stores it in the provided buffer.
+        // The memory and file dataspaces and the transferring property list
+        // can be defaults.
+        void read(void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT) const;
+        void read(H5std_string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT) const;
 
-	// Writes the buffered data to this dataset.
-	// The memory and file dataspaces and the transferring property list
-	// can be defaults.
-	void write( const void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const;
-        void write( const H5std_string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const;
+        // Writes the buffered data to this dataset.
+        // The memory and file dataspaces and the transferring property list
+        // can be defaults.
+        void write(const void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT) const;
+        void write(const H5std_string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT) const;
 
-	// Iterates the selected elements in the specified dataspace - not implemented in C++ style yet
-        int iterateElems( void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data = NULL );
+        // Iterates the selected elements in the specified dataspace - not implemented in C++ style yet
+        int iterateElems(void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data = NULL);
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("DataSet"); }
+        ///\brief Returns this class name.
+        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, const PropList& plist = PropList::DEFAULT);
-	DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+        // Creates a dataset by way of dereference.
+        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();
+        // Default constructor.
+        DataSet();
 
-	// Copy constructor.
-	DataSet( const DataSet& original );
+        // Copy constructor.
+        DataSet(const DataSet& original);
 
-	// Creates a copy of an existing DataSet using its id.
-	DataSet(const hid_t existing_id);
+        // Creates a copy of an existing DataSet using its id.
+        DataSet(const hid_t existing_id);
 
         // Gets the dataset id.
         virtual hid_t getId() const;
 
-	// Destructor: properly terminates access to this dataset.
-	virtual ~DataSet();
+        // Destructor: properly terminates access to this dataset.
+        virtual ~DataSet();
 
    protected:
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -115,23 +112,22 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs {
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	hid_t id;       // HDF5 dataset id
+        hid_t id;       // HDF5 dataset id
 
         // This function contains the common code that is used by
         // getTypeClass and various API functions getXxxType
         // defined in AbstractDs for generic datatype and specific
         // sub-types
-	virtual hid_t p_get_type() const;
+        virtual hid_t p_get_type() const;
 
-	// Reads variable or fixed len strings from this dataset.
-	void p_read_fixed_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const;
-	void p_read_variable_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const;
+        // Reads variable or fixed len strings from this dataset.
+        void p_read_fixed_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const;
+        void p_read_variable_len(const hid_t mem_type_id, const hid_t mem_space_id, const hid_t file_space_id, const hid_t xfer_plist_id, H5std_string& strg) const;
 
-	// Friend function to set DataSet id.  For library use only.
-	friend void f_DataSet_setId(DataSet* dset, hid_t new_id);
+        // Friend function to set DataSet id.  For library use only.
+        friend void f_DataSet_setId(DataSet* dset, hid_t new_id);
+
+}; // end of DataSet
+} // namespace H5
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5DataSet_H
diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp
index 690f328..49b8ea3 100644
--- a/c++/src/H5DataSpace.cpp
+++ b/c++/src/H5DataSpace.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -25,13 +23,9 @@
 #include "H5IdComponent.h"
 #include "H5DataSpace.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -42,14 +36,14 @@ namespace H5 {
 DataSpace* DataSpace::ALL_ = 0;
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getConstant
-//		Creates a DataSpace object representing the HDF5 constant
-//		H5S_ALL, pointed to by DataSpace::ALL_
-// Exception	H5::DataSpaceIException
+// Function:    DataSpace::getConstant
+//              Creates a DataSpace object representing the HDF5 constant
+//              H5S_ALL, pointed to by DataSpace::ALL_
+// Exception    H5::DataSpaceIException
 // Description
-//		If DataSpace::ALL_ already points to an allocated object, throw
-//		a DataSpaceIException.  This scenario should not happen.
-// Programmer	Binh-Minh Ribler - 2015
+//              If DataSpace::ALL_ already points to an allocated object, throw
+//              a DataSpaceIException.  This scenario should not happen.
+// Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
 DataSpace* DataSpace::getConstant()
 {
@@ -82,55 +76,55 @@ void DataSpace::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose	Constant for default dataspace.
+// Purpose      Constant for default dataspace.
 //--------------------------------------------------------------------------
 const DataSpace& DataSpace::ALL = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace constructor
-///\brief	Creates a new dataspace given a dataspace type.
-///\param	type - IN: Type of the dataspace to be created, which
-///		currently can be either \c H5S_SCALAR or \c H5S_SIMPLE;
-///		default to \c H5S_SCALAR.
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace constructor
+///\brief       Creates a new dataspace given a dataspace type.
+///\param       type - IN: Type of the dataspace to be created, which
+///             currently can be either \c H5S_SCALAR or \c H5S_SIMPLE;
+///             default to \c H5S_SCALAR.
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSpace::DataSpace(H5S_class_t type) : IdComponent()
 {
-   id = H5Screate( type );
-   if( id < 0 )
-   {
-      throw DataSpaceIException("DataSpace constructor", "H5Screate failed");
-   }
+    id = H5Screate(type);
+    if (id < 0)
+    {
+        throw DataSpaceIException("DataSpace constructor", "H5Screate failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace overloaded constructor
-///\brief	Creates a new simple dataspace.
-///\param	rank - IN: Number of dimensions of dataspace.
-///\param	dims - IN: An array of the size of each dimension.
-///\param	maxdims - IN: An array of the maximum size of each dimension.
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace overloaded constructor
+///\brief       Creates a new simple dataspace.
+///\param       rank - IN: Number of dimensions of dataspace.
+///\param       dims - IN: An array of the size of each dimension.
+///\param       maxdims - IN: An array of the maximum size of each dimension.
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : IdComponent()
+DataSpace::DataSpace(int rank, const hsize_t * dims, const hsize_t * maxdims) : IdComponent()
 {
-   id = H5Screate_simple( rank, dims, maxdims );
-   if( id < 0 )
-   {
-      throw DataSpaceIException("DataSpace constructor", "H5Screate_simple failed");
-   }
+    id = H5Screate_simple(rank, dims, maxdims);
+    if (id < 0)
+    {
+        throw DataSpaceIException("DataSpace constructor", "H5Screate_simple failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace overloaded constructor
-///\brief	Creates a DataSpace object using the id of an existing
-///		dataspace.
-///\param	existing_id - IN: Id of an existing dataspace
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace overloaded constructor
+///\brief       Creates a DataSpace object using the id of an existing
+///             dataspace.
+///\param       existing_id - IN: Id of an existing dataspace
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSpace::DataSpace(const hid_t existing_id) : IdComponent(), id(existing_id)
 {
@@ -138,10 +132,10 @@ DataSpace::DataSpace(const hid_t existing_id) : IdComponent(), id(existing_id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace copy constructor
-///\brief	Copy constructor: makes a copy of the original DataSpace object.
-///\param	original - IN: DataSpace object to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace copy constructor
+///\brief       Copy constructor: makes a copy of the original DataSpace object.
+///\param       original - IN: DataSpace object to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataSpace::DataSpace(const DataSpace& original) : IdComponent(), id(original.id)
 {
@@ -149,48 +143,48 @@ DataSpace::DataSpace(const DataSpace& original) : IdComponent(), id(original.id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::copy
-///\brief	Makes a copy of an existing dataspace.
-///\param	like_space  - IN: Dataspace to be copied
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::copy
+///\brief       Makes a copy of an existing dataspace.
+///\param       like_space  - IN: Dataspace to be copied
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
-//--------------------------------------------------------------------------
-void DataSpace::copy( const DataSpace& like_space )
-{
-   // If this object has an hdf5 valid id, close it
-   if( id != H5S_ALL ) {
-      try {
-         close();
-      }
-      catch (Exception close_error) {
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
+//--------------------------------------------------------------------------
+void DataSpace::copy(const DataSpace& like_space)
+{
+    // If this object has an hdf5 valid id, close it
+    if (id != H5S_ALL) {
+        try {
+            close();
+        }
+        catch (Exception& close_error) {
          throw DataSpaceIException("DataSpace::copy", close_error.getDetailMsg());
-      }
-   }  // end if
+        }
+    }  // end if
 
-   // call C routine to copy the dataspace
-   id = H5Scopy( like_space.getId() );
+    // call C routine to copy the dataspace
+    id = H5Scopy(like_space.getId());
 
-   if( id < 0 )
-      throw DataSpaceIException("DataSpace::copy", "H5Scopy failed");
+    if (id < 0)
+        throw DataSpaceIException("DataSpace::copy", "H5Scopy failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::operator=
-///\brief	Assignment operator.
-///\param	rhs - IN: Reference to the existing dataspace
-///\return	Reference to DataSpace instance
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::operator=
+///\brief       Assignment operator.
+///\param       rhs - IN: Reference to the existing dataspace
+///\return      Reference to DataSpace instance
+///\exception   H5::DataSpaceIException
 // Description
-//		Makes a copy of the type on the right hand side and stores
-//		the new id in the left hand side object.
-// Programmer	Binh-Minh Ribler - 2000
+//              Makes a copy of the type on the right hand side and stores
+//              the new id in the left hand side object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DataSpace& DataSpace::operator=( const DataSpace& rhs )
+DataSpace& DataSpace::operator=(const DataSpace& rhs)
 {
     if (this != &rhs)
         copy(rhs);
@@ -198,434 +192,434 @@ DataSpace& DataSpace::operator=( const DataSpace& rhs )
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::isSimple
-///\brief	Determines whether this dataspace is a simple dataspace.
-///\return	\c true if the dataspace is a simple dataspace, and \c false,
-///		otherwise
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::isSimple
+///\brief       Determines whether this dataspace is a simple dataspace.
+///\return      \c true if the dataspace is a simple dataspace, and \c false,
+///             otherwise
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 bool DataSpace::isSimple () const
 {
-   htri_t simple = H5Sis_simple( id );
-   if( simple > 0 )
-      return true;
-   else if( simple == 0 )
-      return false;
-   else
-   {
-      throw DataSpaceIException("DataSpace::isSimple",
-		"H5Sis_simple returns negative value");
-   }
+    htri_t simple = H5Sis_simple(id);
+    if (simple > 0)
+        return true;
+    else if (simple == 0)
+        return false;
+    else
+    {
+        throw DataSpaceIException("DataSpace::isSimple",
+            "H5Sis_simple returns negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::offsetSimple
-///\brief	Sets the offset of this simple dataspace.
-///\param	offset  - IN: Offset to position the selection at
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::offsetSimple
+///\brief       Sets the offset of this simple dataspace.
+///\param       offset  - IN: Offset to position the selection at
+///\exception   H5::DataSpaceIException
 ///\par Description
-///		This function creates an offset for the selection within
-///		an extent, allowing the same shaped selection to be moved
-///		to different locations within a dataspace without requiring
-///		it to be re-defined.
-// Programmer	Binh-Minh Ribler - 2000
+///             This function creates an offset for the selection within
+///             an extent, allowing the same shaped selection to be moved
+///             to different locations within a dataspace without requiring
+///             it to be re-defined.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::offsetSimple ( const hssize_t* offset ) const
+void DataSpace::offsetSimple (const hssize_t* offset) const
 {
-   herr_t ret_value = H5Soffset_simple( id, offset );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::offsetSimple", "H5Soffset_simple failed");
-   }
+    herr_t ret_value = H5Soffset_simple(id, offset);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::offsetSimple", "H5Soffset_simple failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSimpleExtentDims
-///\brief	Retrieves dataspace dimension size and maximum size.
-///\param	dims  - IN: Name of the new member
-///\param	maxdims - IN: Pointer to the value of the new member
-///\return	Number of dimensions, the same value as returned by
-///		\c DataSpace::getSimpleExtentNdims()
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSimpleExtentDims
+///\brief       Retrieves dataspace dimension size and maximum size.
+///\param       dims  - IN: Name of the new member
+///\param       maxdims - IN: Pointer to the value of the new member
+///\return      Number of dimensions, the same value as returned by
+///             \c DataSpace::getSimpleExtentNdims()
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-int DataSpace::getSimpleExtentDims ( hsize_t *dims, hsize_t *maxdims ) const
+int DataSpace::getSimpleExtentDims (hsize_t *dims, hsize_t *maxdims) const
 {
-   int ndims = H5Sget_simple_extent_dims( id, dims, maxdims );
-   if( ndims < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSimpleExtentDims",
-		"H5Sget_simple_extent_dims returns negative number of dimensions");
-   }
-   return( ndims );
+    int ndims = H5Sget_simple_extent_dims(id, dims, maxdims);
+    if (ndims < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSimpleExtentDims",
+            "H5Sget_simple_extent_dims returns negative number of dimensions");
+    }
+    return(ndims);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSimpleExtentNdims
-///\brief	Returns the dimensionality of a dataspace.
-///\return	Number of dimensions
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSimpleExtentNdims
+///\brief       Returns the dimensionality of a dataspace.
+///\return      Number of dimensions
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 int DataSpace::getSimpleExtentNdims () const
 {
-   int ndims = H5Sget_simple_extent_ndims( id );
-   if( ndims < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSimpleExtentNdims",
-		"H5Sget_simple_extent_ndims returns negative value for dimensionality of the dataspace");
-   }
-   return( ndims );
+    int ndims = H5Sget_simple_extent_ndims(id);
+    if (ndims < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSimpleExtentNdims",
+            "H5Sget_simple_extent_ndims returns negative value for dimensionality of the dataspace");
+    }
+    return(ndims);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSimpleExtentNpoints
-///\brief	Returns the number of elements in a dataspace.
-///\return	Number of elements
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::getSimpleExtentNpoints
+///\brief       Returns the number of elements in a dataspace.
+///\return      Number of elements
+///\exception   H5::DataSpaceIException
 // Modification
-//		12/05/00: due to C API change
-//			return type hssize_t vs. hsize_t
-//			num_elements = -1 when failure occurs vs. 0
-// Programmer	Binh-Minh Ribler - 2000
+//              12/05/00: due to C API change
+//                      return type hssize_t vs. hsize_t
+//                      num_elements = -1 when failure occurs vs. 0
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hssize_t DataSpace::getSimpleExtentNpoints () const
 {
-   hssize_t num_elements = H5Sget_simple_extent_npoints( id );
-
-   if( num_elements > -1 )
-      return( num_elements );
-   else
-   {
-      throw DataSpaceIException("DataSpace::getSimpleExtentNpoints",
-	"H5Sget_simple_extent_npoints returns negative value for the number of elements in the dataspace");
-   }
+    hssize_t num_elements = H5Sget_simple_extent_npoints(id);
+    if (num_elements > -1)
+        return(num_elements);
+    else
+    {
+        throw DataSpaceIException("DataSpace::getSimpleExtentNpoints",
+        "H5Sget_simple_extent_npoints returns negative value for the number of elements in the dataspace");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSimpleExtentType
-///\brief	Returns the current class of a dataspace.
-///\return	Class of the dataspace
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSimpleExtentType
+///\brief       Returns the current class of a dataspace.
+///\return      Class of the dataspace
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5S_class_t DataSpace::getSimpleExtentType () const
 {
-   H5S_class_t class_name = H5Sget_simple_extent_type( id );
-   if( class_name == H5S_NO_CLASS )
-   {
-      throw DataSpaceIException("DataSpace::getSimpleExtentType",
-		"H5Sget_simple_extent_type returns H5S_NO_CLASS");
-   }
-   return( class_name );
+    H5S_class_t class_name = H5Sget_simple_extent_type(id);
+    if (class_name == H5S_NO_CLASS)
+    {
+        throw DataSpaceIException("DataSpace::getSimpleExtentType",
+            "H5Sget_simple_extent_type returns H5S_NO_CLASS");
+    }
+    return(class_name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::extentCopy
-///\brief	Copies the extent of a dataspace.
-///\param	dest_space  - IN: Dataspace to copy from
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::extentCopy
+///\brief       Copies the extent of a dataspace.
+///\param       dest_space  - IN: Dataspace to copy from
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSpace::extentCopy (const DataSpace& dest_space) const
 {
-   hid_t dest_space_id = dest_space.getId();
-   herr_t ret_value = H5Sextent_copy( dest_space_id, id );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::extentCopy", "H5Sextent_copy failed");
-   }
+    hid_t dest_space_id = dest_space.getId();
+    herr_t ret_value = H5Sextent_copy(dest_space_id, id);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::extentCopy", "H5Sextent_copy failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::extentCopy
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const.  This wrapper will be removed in future release.
-// Param	dest_space  - IN: Dataspace to copy from
-// Exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::extentCopy
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const.  This wrapper will be removed in future release.
+// Param        dest_space  - IN: Dataspace to copy from
+// Exception    H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Modified to call its replacement. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-void DataSpace::extentCopy( DataSpace& dest_space ) const
-{
-    extentCopy(dest_space);
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataSpace::setExtentSimple
-///\brief	Sets or resets the size of an existing dataspace.
-///\param	rank  - IN: Rank of the dataspace
-///\param	current_size - IN: Array containing current size of dataspace
-///\param	maximum_size - IN: Array containing maximum size of dataspace
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
+//--------------------------------------------------------------------------
+//void DataSpace::extentCopy(DataSpace& dest_space) const
+//{
+//    extentCopy(dest_space);
+//}
+
+//--------------------------------------------------------------------------
+// Function:    DataSpace::setExtentSimple
+///\brief       Sets or resets the size of an existing dataspace.
+///\param       rank  - IN: Rank of the dataspace
+///\param       current_size - IN: Array containing current size of dataspace
+///\param       maximum_size - IN: Array containing maximum size of dataspace
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::setExtentSimple( int rank, const hsize_t *current_size, const hsize_t *maximum_size ) const
+void DataSpace::setExtentSimple(int rank, const hsize_t *current_size, const hsize_t *maximum_size) const
 {
-   herr_t ret_value;
-   ret_value = H5Sset_extent_simple( id, rank, current_size, maximum_size );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::setExtentSimple", "H5Sset_extent_simple failed");
-   }
+    herr_t ret_value;
+    ret_value = H5Sset_extent_simple(id, rank, current_size, maximum_size);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::setExtentSimple", "H5Sset_extent_simple failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::setExtentNone
-///\brief	Removes the extent from a dataspace.
+// Function:    DataSpace::setExtentNone
+///\brief       Removes the extent from a dataspace.
 ///
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSpace::setExtentNone () const
 {
-   herr_t ret_value = H5Sset_extent_none( id );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::setExtentNone", "H5Sset_extent_none failed");
-   }
+    herr_t ret_value = H5Sset_extent_none(id);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::setExtentNone", "H5Sset_extent_none failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectNpoints
-///\brief	Returns the number of elements in a dataspace selection.
-///\return	Number of elements
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSelectNpoints
+///\brief       Returns the number of elements in a dataspace selection.
+///\return      Number of elements
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hssize_t DataSpace::getSelectNpoints () const
 {
-   hssize_t num_elements = H5Sget_select_npoints( id );
-   if( num_elements < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectNpoints",
-		"H5Sget_select_npoints returns negative value for number of elements in the dataspace selection");
-   }
-   return( num_elements );
+    hssize_t num_elements = H5Sget_select_npoints(id);
+    if (num_elements < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectNpoints",
+            "H5Sget_select_npoints returns negative value for number of elements in the dataspace selection");
+    }
+    return(num_elements);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectHyperNblocks
-///\brief	Returns number of hyperslab blocks.
-///\return	Number of hyperslab blocks
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSelectHyperNblocks
+///\brief       Returns number of hyperslab blocks.
+///\return      Number of hyperslab blocks
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hssize_t DataSpace::getSelectHyperNblocks () const
 {
-   hssize_t num_blocks = H5Sget_select_hyper_nblocks( id );
-   if( num_blocks < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectHyperNblocks",
-		"H5Sget_select_hyper_nblocks returns negative value for the number of hyperslab blocks");
-   }
-   return( num_blocks );
+    hssize_t num_blocks = H5Sget_select_hyper_nblocks(id);
+    if (num_blocks < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectHyperNblocks",
+            "H5Sget_select_hyper_nblocks returns negative value for the number of hyperslab blocks");
+    }
+    return(num_blocks);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectHyperBlocklist
-///\brief	Gets the list of hyperslab blocks currently selected
-///\param	startblock  - IN: Hyperslab block to start with
-///\param	numblocks - IN: Number of hyperslab blocks to get
-///\param	buf - IN: List of hyperslab blocks selected
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSelectHyperBlocklist
+///\brief       Gets the list of hyperslab blocks currently selected
+///\param       startblock  - IN: Hyperslab block to start with
+///\param       numblocks - IN: Number of hyperslab blocks to get
+///\param       buf - IN: List of hyperslab blocks selected
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::getSelectHyperBlocklist( hsize_t startblock, hsize_t numblocks, hsize_t *buf ) const
+void DataSpace::getSelectHyperBlocklist(hsize_t startblock, hsize_t numblocks, hsize_t *buf) const
 {
-   herr_t ret_value;
-   ret_value = H5Sget_select_hyper_blocklist( id, startblock, numblocks, buf );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectHyperBlocklist",
-		"H5Sget_select_hyper_blocklist failed");
-   }
+    herr_t ret_value;
+    ret_value = H5Sget_select_hyper_blocklist(id, startblock, numblocks, buf);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectHyperBlocklist",
+            "H5Sget_select_hyper_blocklist failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectElemNpoints
-///\brief	Returns the number of element points in the current selection.
-///\return	Number of element points
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::getSelectElemNpoints
+///\brief       Returns the number of element points in the current selection.
+///\return      Number of element points
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hssize_t DataSpace::getSelectElemNpoints () const
 {
-   hssize_t num_points = H5Sget_select_elem_npoints( id );
-   if( num_points < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectElemNpoints",
-		"H5Sget_select_elem_npoints failed");
-   }
-   return( num_points );
+    hssize_t num_points = H5Sget_select_elem_npoints(id);
+    if (num_points < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectElemNpoints",
+            "H5Sget_select_elem_npoints failed");
+    }
+    return(num_points);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectElemPointlist
-///\brief	Gets the list of element points currently selected
-///\param	startpoint  - IN: Element point to start with
-///\param	numpoints - IN: Number of element points to get
-///\param	buf - IN: List of element points selected
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::getSelectElemPointlist
+///\brief       Gets the list of element points currently selected
+///\param       startpoint  - IN: Element point to start with
+///\param       numpoints - IN: Number of element points to get
+///\param       buf - IN: List of element points selected
+///\exception   H5::DataSpaceIException
 ///\par Description
-///		For more information, please refer to the C layer Reference
-///		Manual at:
+///             For more information, please refer to the C layer Reference
+///             Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5S.html#Dataspace-SelectElemPointList
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::getSelectElemPointlist ( hsize_t startpoint, hsize_t numpoints, hsize_t *buf ) const
+void DataSpace::getSelectElemPointlist (hsize_t startpoint, hsize_t numpoints, hsize_t *buf) const
 {
-   herr_t ret_value;
-   ret_value = H5Sget_select_elem_pointlist( id, startpoint, numpoints, buf );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectElemPointlist",
-		"H5Sget_select_elem_pointlist failed");
-   }
+    herr_t ret_value;
+    ret_value = H5Sget_select_elem_pointlist(id, startpoint, numpoints, buf);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectElemPointlist",
+            "H5Sget_select_elem_pointlist failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::getSelectBounds
-///\brief	Gets the bounding box containing the current selection.
-///\param	start  - IN: Starting coordinates of the bounding box
-///\param	end - IN: Ending coordinates of the bounding box, i.e.,
-///		the coordinates of the diagonally opposite corner
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::getSelectBounds
+///\brief       Gets the bounding box containing the current selection.
+///\param       start  - IN: Starting coordinates of the bounding box
+///\param       end - IN: Ending coordinates of the bounding box, i.e.,
+///             the coordinates of the diagonally opposite corner
+///\exception   H5::DataSpaceIException
 ///\par Description
-///		For more information, please refer to the C layer Reference
-///		Manual at:
+///             For more information, please refer to the C layer Reference
+///             Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5S.html#Dataspace-SelectBounds
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::getSelectBounds ( hsize_t* start, hsize_t* end ) const
+void DataSpace::getSelectBounds (hsize_t* start, hsize_t* end) const
 {
-   herr_t ret_value = H5Sget_select_bounds( id, start, end );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::getSelectBounds",
-		"H5Sget_select_bounds failed");
-   }
+    herr_t ret_value = H5Sget_select_bounds(id, start, end);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::getSelectBounds",
+            "H5Sget_select_bounds failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::selectElements
-///\brief	Selects array elements to be included in the selection for
-///		this dataspace.
-///\param	op  - IN: Operator specifying how the new selection is to be
-///		combined with the existing selection for the dataspace
-///\param	num_elements  - IN: Number of elements to be selected
-///\param	coord  - IN: A 2-dimensional array of 0-based values
-///		specifying the coordinates of the elements being selected
-///\exception	H5::DataSpaceIException
+// Function:    DataSpace::selectElements
+///\brief       Selects array elements to be included in the selection for
+///             this dataspace.
+///\param       op  - IN: Operator specifying how the new selection is to be
+///             combined with the existing selection for the dataspace
+///\param       num_elements  - IN: Number of elements to be selected
+///\param       coord  - IN: A 2-dimensional array of 0-based values
+///             specifying the coordinates of the elements being selected
+///\exception   H5::DataSpaceIException
 ///\par Description
-///		For more information, please refer to the C layer Reference
-///		Manual at:
+///             For more information, please refer to the C layer Reference
+///             Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5S.html#Dataspace-SelectElements
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::selectElements ( H5S_seloper_t op, const size_t num_elements, const hsize_t *coord) const
+void DataSpace::selectElements (H5S_seloper_t op, const size_t num_elements, const hsize_t *coord) const
 {
-   herr_t ret_value;
-   ret_value = H5Sselect_elements( id, op, num_elements, coord );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::selectElements",
-		"H5Sselect_elements failed");
-   }
+    herr_t ret_value;
+    ret_value = H5Sselect_elements(id, op, num_elements, coord);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::selectElements",
+            "H5Sselect_elements failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::selectAll
-///\brief	Selects the entire dataspace.
+// Function:    DataSpace::selectAll
+///\brief       Selects the entire dataspace.
 ///
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSpace::selectAll () const
 {
-   herr_t ret_value = H5Sselect_all( id );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::selectAll", "H5Sselect_all failed");
-   }
+    herr_t ret_value = H5Sselect_all(id);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::selectAll", "H5Sselect_all failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::selectNone
-///\brief	Resets the selection region to include no elements.
+// Function:    DataSpace::selectNone
+///\brief       Resets the selection region to include no elements.
 ///
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataSpace::selectNone () const
 {
-  herr_t ret_value = H5Sselect_none( id );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::selectNone",
-		"H5Sselect_none failed");
-   }
+    herr_t ret_value = H5Sselect_none(id);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::selectNone",
+            "H5Sselect_none failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::selectValid
-///\brief	Verifies that the selection is within the extent of the
-///		dataspace.
-///\return	\c true if the selection is within the extent of the
-///		dataspace, and \c false, otherwise
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace::selectValid
+///\brief       Verifies that the selection is within the extent of the
+///             dataspace.
+///\return      \c true if the selection is within the extent of the
+///             dataspace, and \c false, otherwise
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 bool DataSpace::selectValid () const
 {
-  htri_t ret_value = H5Sselect_valid( id );
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else
-   {
-      throw DataSpaceIException("DataSpace::selectValid",
-		"H5Sselect_valid returns negative value");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataSpace::selectHyperslab
-///\brief	Selects a hyperslab region to add to the current selected region.
-///\param	op - IN: Operation to perform on current selection
-///\param	count - IN: Number of blocks included in the hyperslab
-///\param	start - IN: Offset of the start of hyperslab
-///\param	stride - IN: Hyperslab stride - default to \c NULL
-///\param	block - IN: Size of block in the hyperslab - default to \c NULL
-///\exception	H5::DataSpaceIException
+    htri_t ret_value = H5Sselect_valid(id);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else
+    {
+        throw DataSpaceIException("DataSpace::selectValid",
+            "H5Sselect_valid returns negative value");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataSpace::selectHyperslab
+///\brief       Selects a hyperslab region to add to the current selected region.
+///\param       op - IN: Operation to perform on current selection
+///\param       count - IN: Number of blocks included in the hyperslab
+///\param       start - IN: Offset of the start of hyperslab
+///\param       stride - IN: Hyperslab stride - default to \c NULL
+///\param       block - IN: Size of block in the hyperslab - default to \c NULL
+///\exception   H5::DataSpaceIException
 ///\par Description
-///		For more information, please refer to the C layer Reference
-///		Manual at:
+///             For more information, please refer to the C layer Reference
+///             Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5S.html#Dataspace-SelectHyperslab
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataSpace::selectHyperslab( H5S_seloper_t op, const hsize_t *count, const hsize_t *start, const hsize_t *stride, const hsize_t *block ) const
+void DataSpace::selectHyperslab(H5S_seloper_t op, const hsize_t *count, const hsize_t *start, const hsize_t *stride, const hsize_t *block) const
 {
-   herr_t ret_value;
-   ret_value = H5Sselect_hyperslab( id, op, start, stride, count, block );
-   if( ret_value < 0 )
-   {
-      throw DataSpaceIException("DataSpace::selectHyperslab",
-		"H5Sselect_hyperslab failed");
-   }
+    herr_t ret_value;
+    ret_value = H5Sselect_hyperslab(id, op, start, stride, count, block);
+    if (ret_value < 0)
+    {
+        throw DataSpaceIException("DataSpace::selectHyperslab",
+            "H5Sselect_hyperslab failed");
+    }
 }
 
 //--------------------------------------------------------------------------
 // Function:    DataSpace::getId
-///\brief	Get the id of this dataspace
-///\return	Dataspace identifier
+///\brief       Get the id of this dataspace
+///\return      Dataspace identifier
 // Modification:
-//	May 2008 - BMR
+//      May 2008 - BMR
 //              Class hierarchy is revised to address bugzilla 1068.  Class
 //              AbstractDS and Attribute are moved out of H5Object.  In
 //              addition, member IdComponent::id is moved into subclasses, and
@@ -634,7 +628,7 @@ void DataSpace::selectHyperslab( H5S_seloper_t op, const hsize_t *count, const h
 //--------------------------------------------------------------------------
 hid_t DataSpace::getId() const
 {
-   return(id);
+    return(id);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -656,55 +650,53 @@ void DataSpace::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw DataSpaceIException(inMemFunc("p_setId"), close_error.getDetailMsg());
     }
-   // reset object's id to the given id
-   id = new_id;
+    // reset object's id to the given id
+    id = new_id;
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace::close
-///\brief	Closes this dataspace.
+// Function:    DataSpace::close
+///\brief       Closes this dataspace.
 ///
-///\exception	H5::DataSpaceIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::DataSpaceIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void DataSpace::close()
 {
     // check if id is a valid hdf5 object id before trying to close it
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Sclose(id);
-	if( ret_value < 0 )
-	{
-	    throw DataSpaceIException("DataSpace::close", "H5Sclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Sclose(id);
+        if (ret_value < 0)
+        {
+            throw DataSpaceIException("DataSpace::close", "H5Sclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataSpace destructor
-///\brief	Properly terminates access to this dataspace.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataSpace destructor
+///\brief       Properly terminates access to this dataspace.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 DataSpace::~DataSpace()
 {
     try {
-	close();
-    } catch (Exception close_error) {
-	cerr << "DataSpace::~DataSpace - " << close_error.getDetailMsg() << endl;
+        close();
+    } catch (Exception& close_error) {
+        cerr << "DataSpace::~DataSpace - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5DataSpace.h b/c++/src/H5DataSpace.h
index 4cbe62c..9bb203c 100644
--- a/c++/src/H5DataSpace.h
+++ b/c++/src/H5DataSpace.h
@@ -6,148 +6,147 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5DataSpace_H
 #define __H5DataSpace_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class DataSpace operates on HDF5 dataspaces.
+/*! \class DataSpace
+    \brief Class DataSpace inherits from IdComponent and provides wrappers for
+     the HDF5's dataspaces.
+*/
 class H5_DLLCPP DataSpace : public IdComponent {
    public:
-	///\brief Default DataSpace objects
-	static const DataSpace& ALL;
+        ///\brief Default DataSpace objects
+        static const DataSpace& ALL;
 
-	// Creates a dataspace object given the space type
-	DataSpace(H5S_class_t type = H5S_SCALAR);
+        // Creates a dataspace object given the space type
+        DataSpace(H5S_class_t type = H5S_SCALAR);
 
-	// Creates a simple dataspace
-	DataSpace(int rank, const hsize_t * dims, const hsize_t * maxdims = NULL);
+        // Creates a simple dataspace
+        DataSpace(int rank, const hsize_t * dims, const hsize_t * maxdims = NULL);
 
-	// Creates a DataSpace object using an existing dataspace id.
-	DataSpace(const hid_t space_id);
+        // Creates a DataSpace object using an existing dataspace id.
+        DataSpace(const hid_t space_id);
 
-	// Copy constructor: makes a copy of the original DataSpace object.
-	DataSpace(const DataSpace& original);
+        // Copy constructor: makes a copy of the original DataSpace object.
+        DataSpace(const DataSpace& original);
 
-	// Assignment operator
-	DataSpace& operator=( const DataSpace& rhs );
+        // Assignment operator
+        DataSpace& operator=(const DataSpace& rhs);
 
-	// Closes this dataspace.
-	virtual void close();
+        // Closes this dataspace.
+        virtual void close();
 
-	// Makes copy of an existing dataspace.
-	void copy(const DataSpace& like_space);
+        // Makes copy of an existing dataspace.
+        void copy(const DataSpace& like_space);
 
-	// Copies the extent of this dataspace.
-	void extentCopy(const DataSpace& dest_space) const;
-	// Kept for backward compatibility only.
-	void extentCopy(DataSpace& dest_space) const;
+        // Copies the extent of this dataspace.
+        void extentCopy(const DataSpace& dest_space) const;
+        // removed from 1.8.18 and 1.10.1
+        //void extentCopy(DataSpace& dest_space) const;
 
-	// Gets the bounding box containing the current selection.
-	void getSelectBounds( hsize_t* start, hsize_t* end ) const;
+        // Gets the bounding box containing the current selection.
+        void getSelectBounds(hsize_t* start, hsize_t* end) const;
 
-	// Gets the number of element points in the current selection.
-	hssize_t getSelectElemNpoints() const;
+        // Gets the number of element points in the current selection.
+        hssize_t getSelectElemNpoints() const;
 
-	// Retrieves the list of element points currently selected.
-	void getSelectElemPointlist( hsize_t startpoint, hsize_t numpoints, hsize_t *buf ) const;
+        // Retrieves the list of element points currently selected.
+        void getSelectElemPointlist(hsize_t startpoint, hsize_t numpoints, hsize_t *buf) const;
 
-	// Gets the list of hyperslab blocks currently selected.
-	void getSelectHyperBlocklist( hsize_t startblock, hsize_t numblocks, hsize_t *buf ) const;
+        // Gets the list of hyperslab blocks currently selected.
+        void getSelectHyperBlocklist(hsize_t startblock, hsize_t numblocks, hsize_t *buf) const;
 
-	// Get number of hyperslab blocks.
-	hssize_t getSelectHyperNblocks() const;
+        // Get number of hyperslab blocks.
+        hssize_t getSelectHyperNblocks() const;
 
-	// Gets the number of elements in this dataspace selection.
-	hssize_t getSelectNpoints() const;
+        // Gets the number of elements in this dataspace selection.
+        hssize_t getSelectNpoints() const;
 
-	// Retrieves dataspace dimension size and maximum size.
-	int getSimpleExtentDims( hsize_t *dims, hsize_t *maxdims = NULL ) const;
+        // Retrieves dataspace dimension size and maximum size.
+        int getSimpleExtentDims(hsize_t *dims, hsize_t *maxdims = NULL) const;
 
-	// Gets the dimensionality of this dataspace.
-	int getSimpleExtentNdims() const;
+        // Gets the dimensionality of this dataspace.
+        int getSimpleExtentNdims() const;
 
-	// Gets the number of elements in this dataspace.
-	// 12/05/00 - changed return type to hssize_t from hsize_t - C API
-	hssize_t getSimpleExtentNpoints() const;
+        // Gets the number of elements in this dataspace.
+        // 12/05/00 - changed return type to hssize_t from hsize_t - C API
+        hssize_t getSimpleExtentNpoints() const;
 
-	// Gets the current class of this dataspace.
-	H5S_class_t getSimpleExtentType() const;
+        // Gets the current class of this dataspace.
+        H5S_class_t getSimpleExtentType() const;
 
-	// Determines if this dataspace is a simple one.
-	bool isSimple() const;
+        // Determines if this dataspace is a simple one.
+        bool isSimple() const;
 
-	// Sets the offset of this simple dataspace.
-	void offsetSimple( const hssize_t* offset ) const;
+        // Sets the offset of this simple dataspace.
+        void offsetSimple(const hssize_t* offset) const;
 
-	// Selects the entire dataspace.
-	void selectAll() const;
+        // Selects the entire dataspace.
+        void selectAll() const;
 
-	// Selects array elements to be included in the selection for
-	// this dataspace.
-	void selectElements( H5S_seloper_t op, const size_t num_elements, const hsize_t *coord) const;
+        // Selects array elements to be included in the selection for
+        // this dataspace.
+        void selectElements(H5S_seloper_t op, const size_t num_elements, const hsize_t *coord) const;
 
-	// Selects a hyperslab region to add to the current selected region.
-	void selectHyperslab( H5S_seloper_t op, const hsize_t *count, const hsize_t *start, const hsize_t *stride = NULL, const hsize_t *block = NULL ) const;
+        // Selects a hyperslab region to add to the current selected region.
+        void selectHyperslab(H5S_seloper_t op, const hsize_t *count, const hsize_t *start, const hsize_t *stride = NULL, const hsize_t *block = NULL) const;
 
-	// Resets the selection region to include no elements.
-	void selectNone() const;
+        // Resets the selection region to include no elements.
+        void selectNone() const;
 
-	// Verifies that the selection is within the extent of the dataspace.
-	bool selectValid() const;
+        // Verifies that the selection is within the extent of the dataspace.
+        bool selectValid() const;
 
-	// Removes the extent from this dataspace.
-	void setExtentNone() const;
+        // Removes the extent from this dataspace.
+        void setExtentNone() const;
 
-	// Sets or resets the size of this dataspace.
-	void setExtentSimple( int rank, const hsize_t *current_size, const hsize_t *maximum_size = NULL ) const;
+        // Sets or resets the size of this dataspace.
+        void setExtentSimple(int rank, const hsize_t *current_size, const hsize_t *maximum_size = NULL) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("DataSpace"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("DataSpace"); }
 
-	// Gets the dataspace id.
-	virtual hid_t getId() const;
+        // Gets the dataspace id.
+        virtual hid_t getId() const;
 
-	// Deletes the global constant
-	static void deleteConstants();
+        // Deletes the global constant
+        static void deleteConstants();
 
-	// Destructor: properly terminates access to this dataspace.
-	virtual ~DataSpace();
+        // Destructor: properly terminates access to this dataspace.
+        virtual ~DataSpace();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
    protected:
-	// Sets the dataspace id.
-	virtual void p_setId(const hid_t new_id);
+        // Sets the dataspace id.
+        virtual void p_setId(const hid_t new_id);
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	hid_t id;       // HDF5 dataspace id
+        hid_t id;       // HDF5 dataspace id
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
-	static DataSpace* ALL_;
+        static DataSpace* ALL_;
 
-	// Creates the global constant
-	static DataSpace* getConstant();
+        // Creates the global constant
+        static DataSpace* getConstant();
 
-	// Friend function to set DataSpace id.  For library use only.
-	friend void f_DataSpace_setId(DataSpace *dspace, hid_t new_id);
+        // Friend function to set DataSpace id.  For library use only.
+        friend void f_DataSpace_setId(DataSpace *dspace, hid_t new_id);
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+
+}; // end of DataSpace
+} // namespace H5
+
 #endif // __H5DataSpace_H
diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp
index 3e5ad0f..57f9361 100644
--- a/c++/src/H5DataType.cpp
+++ b/c++/src/H5DataType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -23,51 +21,47 @@
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
-#include "H5PropList.h"
 #include "H5DataSpace.h"
-#include "H5Object.h"
+#include "H5PropList.h"
 #include "H5FaccProp.h"
 #include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
 #include "H5DxferProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AtomType.h"
 #include "H5PredType.h"
 #include "H5private.h"
 #include "H5AbstractDs.h"
 #include "H5DataSet.h"
-#include "H5File.h"
 #include "H5Attribute.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
 //--------------------------------------------------------------------------
-// Function:	DataType default constructor
-///\brief	Default constructor: Creates a stub datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType default constructor
+///\brief       Default constructor: Creates a stub datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataType::DataType() : H5Object(), id(H5I_INVALID_HID) {}
 
 //--------------------------------------------------------------------------
-// Function:	DataType overloaded constructor
-///\brief	Creates a datatype using an existing datatype's id
-///\param	existing_id - IN: Id of the existing datatype
+// Function:    DataType overloaded constructor
+///\brief       Creates a datatype using an existing datatype's id
+///\param       existing_id - IN: Id of the existing datatype
 // Description
-//		Constructor creates a copy of an existing DataType using
-//		its id.
-// Programmer	Binh-Minh Ribler - 2000
+//              Constructor creates a copy of an existing DataType using
+//              its id.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	Dec, 2005
-//		Removed second argument, "predefined", after changing to the
-//		new ref counting mechanism that relies on C's ref counting.
+//        Dec, 2005
+//              Removed second argument, "predefined", after changing to the
+//              new ref counting mechanism that relies on C's ref counting.
 //--------------------------------------------------------------------------
 DataType::DataType(const hid_t existing_id) : H5Object(), id(existing_id)
 {
@@ -75,36 +69,36 @@ DataType::DataType(const hid_t existing_id) : H5Object(), id(existing_id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType overloaded constructor
-///\brief	Creates a object given its class and size
-///\param	type_class - IN: Class of datatype to create
-///\param	size       - IN: Number of bytes in the datatype to create
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType overloaded constructor
+///\brief       Creates a object given its class and size
+///\param       type_class - IN: Class of datatype to create
+///\param       size       - IN: Number of bytes in the datatype to create
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object()
+DataType::DataType(const H5T_class_t type_class, size_t size) : H5Object()
 {
-   // Call C routine to create the new datatype
-   id = H5Tcreate( type_class, size );
-   if( id < 0 )
-   {
-      throw DataTypeIException("DataType constructor", "H5Tcreate failed");
-   }
+    // Call C routine to create the new datatype
+    id = H5Tcreate(type_class, size);
+    if (id < 0)
+    {
+        throw DataTypeIException("DataType constructor", "H5Tcreate failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 group, creates a
-///		DataType object
+// Function:    DataType overload constructor - dereference
+///\brief       Given a reference, ref, to an hdf5 group, creates a
+///             DataType object
 ///\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
+///\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.
+//        Jul, 2008
+//              Added for application convenience.
 //--------------------------------------------------------------------------
 DataType::DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object()
 {
@@ -112,28 +106,29 @@ DataType::DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type,
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 group, creates a
-///		DataType object
-///\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
+// Function:    DataType overload constructor - dereference
+// brief       Given a reference, ref, to an hdf5 group, creates a
+//             DataType object
+// 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.
+//        Jul, 2008
+//              Added for application convenience.
 //--------------------------------------------------------------------------
-DataType::DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), id(H5I_INVALID_HID)
+ /* 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, plist, "constructor - by dereference");
 }
+ */ 
 
 //--------------------------------------------------------------------------
-// Function:	DataType copy constructor
-///\brief	Copy constructor: makes a copy of the original DataType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType copy constructor
+///\brief       Copy constructor: makes a copy of the original DataType object
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataType::DataType(const DataType& original) : H5Object(), id(original.id)
 {
@@ -147,544 +142,609 @@ DataType::DataType(const DataType& original) : H5Object(), id(original.id)
 ///\exception   H5::DataTypeIException
 // Programmer   Binh-Minh Ribler - 2015
 // Description
-//		Copying the type so that when a predefined type is passed in,
-//		a copy of it is made, not just a duplicate of the HDF5 id.
-//		Note: calling DataType::copy will invoke DataType::close()
-//		unnecessarily and will produce undefined behavior.
-//		-BMR, Apr 2015
+//              Copying the type so that when a predefined type is passed in,
+//              a copy of it is made, not just a duplicate of the HDF5 id.
+//              Note: calling DataType::copy will invoke DataType::close()
+//              unnecessarily and will produce undefined behavior.
+//              -BMR, Apr 2015
 //--------------------------------------------------------------------------
 DataType::DataType(const PredType& pred_type) : H5Object()
 {
-    // call C routine to copy the datatype
-    id = H5Tcopy( pred_type.getId() );
+    // Call C routine to copy the datatype
+    id = H5Tcopy(pred_type.getId());
     if (id < 0)
-	throw DataTypeIException("DataType constructor", "H5Tcopy failed");
+        throw DataTypeIException("DataType constructor", "H5Tcopy failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::copy
-///\brief	Copies an existing datatype to this datatype object
-///\param	like_type - IN: Datatype to be copied
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType overloaded constructor
+///\brief       Creates a DataType instance by opening an HDF5 datatype given
+///             its name as a char*.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Datatype name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openDataType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+DataType::DataType(const H5Location& loc, const char *dtype_name) : H5Object()
+{
+    id = p_opentype(loc, dtype_name);
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType overloaded constructor
+///\brief       Creates a DataType instance by opening an HDF5 datatype given
+///             its name as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Datatype name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openDataType(const H5std_string&) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+DataType::DataType(const H5Location& loc, const H5std_string& dtype_name) : H5Object()
+{
+    id = p_opentype(loc, dtype_name.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::copy
+///\brief       Copies an existing datatype to this datatype object
+///\param       like_type - IN: Datatype to be copied
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
-void DataType::copy( const DataType& like_type )
+void DataType::copy(const DataType& like_type)
 {
     // close the current data type before copying like_type to this object
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	throw DataTypeIException(inMemFunc("copy"), close_error.getDetailMsg());
+    catch (Exception& close_error) {
+        throw DataTypeIException(inMemFunc("copy"), close_error.getDetailMsg());
     }
 
     // call C routine to copy the datatype
-    id = H5Tcopy( like_type.getId() );
-    if( id < 0 )
-	throw DataTypeIException(inMemFunc("copy"), "H5Tcopy failed");
+    id = H5Tcopy(like_type.getId());
+    if (id < 0)
+        throw DataTypeIException(inMemFunc("copy"), "H5Tcopy failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::copy
-///\brief	Copies the datatype of the given dataset to this datatype object
-///\param	dset - IN: Dataset
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jan, 2007
+// Function:    DataType::copy
+///\brief       Copies the datatype of the given dataset to this datatype object
+///\param       dset - IN: Dataset
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jan, 2007
 ///\par Description
-///		The resulted dataset will be transient and modifiable.
+///             The resulted dataset will be transient and modifiable.
 //--------------------------------------------------------------------------
 void DataType::copy(const DataSet& dset)
 {
     // close the current data type before copying dset's datatype to this object
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	throw DataTypeIException(inMemFunc("copy"), close_error.getDetailMsg());
+    catch (Exception& close_error) {
+        throw DataTypeIException(inMemFunc("copy"), close_error.getDetailMsg());
     }
 
     // call C routine to copy the datatype
-    id = H5Tcopy( dset.getId() );
-    if( id < 0 )
-	throw DataTypeIException(inMemFunc("copy"), "H5Tcopy failed");
+    id = H5Tcopy(dset.getId());
+    if (id < 0)
+        throw DataTypeIException(inMemFunc("copy"), "H5Tcopy failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::operator=
-///\brief	Assignment operator
-///\param	rhs - IN: Reference to the existing datatype
-///\return	Reference to DataType instance
-///\exception	H5::DataTypeIException
+// Function:    DataType::operator=
+///\brief       Assignment operator
+///\param       rhs - IN: Reference to the existing datatype
+///\return      Reference to DataType instance
+///\exception   H5::DataTypeIException
 // Description
-// 		Makes a copy of the type on the right hand side and stores
-//		the new id in the left hand side object.
-// Programmer	Binh-Minh Ribler - 2000
+//              Makes a copy of the type on the right hand side and stores
+//              the new id in the left hand side object.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Changed operator= to simply copy the id of rhs instead of
-//		calling H5Tcopy because, when the operator= is invoked, a
-//		different datatype id is created and it won't have the same
-//		characteristics as the original one, specifically, if the
-//		rhs represents a named datatype, "this" would still be a
-//		transient datatype.
-//		BMR - Mar, 2015
+//              Changed operator= to simply copy the id of rhs instead of
+//              calling H5Tcopy because, when the operator= is invoked, a
+//              different datatype id is created and it won't have the same
+//              characteristics as the original one, specifically, if the
+//              rhs represents a named datatype, "this" would still be a
+//              transient datatype.
+//              BMR - Mar, 2015
 //--------------------------------------------------------------------------
-DataType& DataType::operator=( const DataType& rhs )
+DataType& DataType::operator=(const DataType& rhs)
 {
     if (this != &rhs)
     {
-	setId(rhs.id);
+        setId(rhs.id);
     }
     return(*this);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::operator==
-///\brief	Compares this DataType against the given one to determines
-///		whether the two objects refer to the same actual datatype.
-///\param	compared_type - IN: Reference to the datatype to compare
-///\return	true if the datatypes are equal, and false, otherwise.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::operator==
+///\brief       Compares this DataType against the given one to determines
+///             whether the two objects refer to the same actual datatype.
+///\param       compared_type - IN: Reference to the datatype to compare
+///\return      true if the datatypes are equal, and false, otherwise.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-bool DataType::operator==(const DataType& compared_type ) const
+bool DataType::operator==(const DataType& compared_type) const
 {
-   // Call C routine H5Tequal to determines whether two datatype
-   // identifiers refer to the same datatype
-   htri_t ret_value = H5Tequal( id, compared_type.getId() );
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else
-   {
-      throw DataTypeIException(inMemFunc("operator=="), "H5Tequal returns negative value");
-   }
+    // Call C routine H5Tequal to determines whether two datatype
+    // identifiers refer to the same datatype
+    htri_t ret_value = H5Tequal(id, compared_type.getId());
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else
+    {
+        throw DataTypeIException(inMemFunc("operator=="), "H5Tequal returns negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::p_commit (private)
-//\brief	Commits a transient datatype to a file, creating a new
-//		named datatype
-//\param	loc_id - IN: The id of either a file, group, dataset, named
-//			 datatype, or attribute.
-//\param	name - IN: Name of the datatype
-//\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::p_commit (private)
+//\brief        Commits a transient datatype to a file, creating a new
+//              named datatype
+//\param        loc_id - IN: The id of either a file, group, dataset, named
+//                           datatype, or attribute.
+//\param        name - IN: Name of the datatype
+//\exception    H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification:
-//		Copied from DataType::commit and made into private function
-//		to be commonly used by several overloads of DataType::commit.
-//		BMR - Jan, 2007
+//              Copied from DataType::commit and made into private function
+//              to be commonly used by several overloads of DataType::commit.
+//              BMR - Jan, 2007
 //--------------------------------------------------------------------------
 void DataType::p_commit(hid_t loc_id, const char* name)
 {
-   // Call C routine to commit the transient datatype
-   herr_t ret_value = H5Tcommit2(loc_id, name, id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-   if( ret_value < 0 )
-      throw DataTypeIException(inMemFunc("p_commit"), "H5Tcommit2 failed");
+    // Call C routine to commit the transient datatype
+    herr_t ret_value = H5Tcommit2(loc_id, name, id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (ret_value < 0)
+        throw DataTypeIException(inMemFunc("p_commit"), "H5Tcommit2 failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::commit
-///\brief	Commits a transient datatype to a file, creating a new
-///		named datatype
-///\param	loc - IN: A location (file, dataset, datatype, or group)
-///\param	name - IN: Name of the datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jan, 2007
+// Function:    DataType::commit
+///\brief       Commits a transient datatype to a file, creating a new
+///             named datatype
+///\param       loc - IN: A location (file, dataset, datatype, or group)
+///\param       name - IN: Name of the datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jan, 2007
 //--------------------------------------------------------------------------
 void DataType::commit(const H5Location& loc, const char* name)
 {
-   p_commit(loc.getId(), name);
+    p_commit(loc.getId(), name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::commit
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param	loc - IN: A location (file, dataset, datatype, or group)
-// Param 	name - IN: Name of the datatype
-// Exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jan, 2007
+// Function:    DataType::commit
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Param        loc - IN: A location (file, dataset, datatype, or group)
+// Param        name - IN: Name of the datatype
+// Exception    H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jan, 2007
 // Modification
-//		Planned for removal. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Planned for removal. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-void DataType::commit(H5Location& loc, const char* name)
-{
-   p_commit(loc.getId(), name);
-}
+//void DataType::commit(H5Location& loc, const char* name)
+//{
+//   p_commit(loc.getId(), name);
+//}
 
 //--------------------------------------------------------------------------
-// Function:	DataType::commit
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of the
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::commit
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of the
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataType::commit(const H5Location& loc, const H5std_string& name)
 {
-   p_commit(loc.getId(), name.c_str());
+    p_commit(loc.getId(), name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::commit
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param 	loc - IN: A location (file, dataset, datatype, or group)
-// Param 	name - IN: Name of the datatype
-// Exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Jan, 2007
+// Function:    DataType::commit
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Param        loc - IN: A location (file, dataset, datatype, or group)
+// Param        name - IN: Name of the datatype
+// Exception    H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Jan, 2007
 // Modification
-//		Planned for removal. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+//              Planned for removal. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
+//--------------------------------------------------------------------------
+//void DataType::commit(H5Location& loc, const H5std_string& name)
+//{
+//   p_commit(loc.getId(), name.c_str());
+//}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::committed
+///\brief       Determines whether a datatype is a named type or a
+///             transient type.
+///\return      \c true if the datatype is a named type, and \c false,
+///             otherwise.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::commit(H5Location& loc, const H5std_string& name)
+bool DataType::committed() const
 {
-   p_commit(loc.getId(), name.c_str());
+    // Call C function to determine if a datatype is a named one
+    htri_t is_committed = H5Tcommitted(id);
+    if (is_committed > 0)
+        return true;
+    else if (is_committed == 0)
+        return false;
+    else
+    {
+        throw DataTypeIException(inMemFunc("committed"), "H5Tcommitted return negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::committed
-///\brief	Determines whether a datatype is a named type or a
-///		transient type.
-///\return	\c true if the datatype is a named type, and \c false,
-///		otherwise.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::find
+///\brief       Finds a conversion function that can handle a conversion
+///             from this datatype to the specified datatype, \a dest.
+///\param       dest   - IN: Destination datatype
+///\param       pcdata - IN: Pointer to type conversion data
+///\return      Pointer to a suitable conversion function
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-bool DataType::committed() const
+H5T_conv_t DataType::find(const DataType& dest, H5T_cdata_t **pcdata) const
+{
+    // Call C routine to find the conversion function
+    H5T_conv_t func = H5Tfind(id, dest.getId(), pcdata);
+    if (func == NULL)
+    {
+        throw DataTypeIException(inMemFunc("find"), "H5Tfind returns a NULL function");
+    }
+    return(func);
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::convert
+///\brief       Converts data from this datatype to the specified datatypes.
+///\param       dest       - IN: Destination datatype
+///\param       nelmts     - IN: Size of array \a buf
+///\param       buf        - IN/OUT: Array containing pre- and post-conversion
+///                            values
+///\param       background - IN: Optional backgroud buffer
+///\param       plist - IN: Property list - default to PropList::DEFAULT
+///\return      Pointer to a suitable conversion function
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DataType::convert(const DataType& dest, size_t nelmts, void *buf, void *background, const PropList& plist) const
 {
-   // Call C function to determine if a datatype is a named one
-   htri_t is_committed = H5Tcommitted( id );
-   if (is_committed > 0)
-      return true;
-   else if (is_committed == 0)
-      return false;
-   else
-   {
-      throw DataTypeIException(inMemFunc("committed"), "H5Tcommitted return negative value");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataType::find
-///\brief	Finds a conversion function that can handle a conversion
-///		from this datatype to the specified datatype, \a dest.
-///\param	dest   - IN: Destination datatype
-///\param	pcdata - IN: Pointer to type conversion data
-///\return	Pointer to a suitable conversion function
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-H5T_conv_t DataType::find( const DataType& dest, H5T_cdata_t **pcdata ) const
-{
-   // Call C routine to find the conversion function
-   H5T_conv_t func = H5Tfind( id, dest.getId(), pcdata );
-   if( func == NULL )
-   {
-      throw DataTypeIException(inMemFunc("find"), "H5Tfind returns a NULL function");
-   }
-   return( func );
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataType::convert
-///\brief	Converts data from this datatype to the specified datatypes.
-///\param	dest       - IN: Destination datatype
-///\param	nelmts     - IN: Size of array \a buf
-///\param	buf        - IN/OUT: Array containing pre- and post-conversion
-///				values
-///\param	background - IN: Optional backgroud buffer
-///\param	plist - IN: Property list - default to PropList::DEFAULT
-///\return	Pointer to a suitable conversion function
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DataType::convert( const DataType& dest, size_t nelmts, void *buf, void *background, const PropList& plist ) const
-{
-   // Get identifiers for C API
-   hid_t dest_id = dest.getId();
-   hid_t plist_id = plist.getId();
-
-   // Call C routine H5Tconvert to convert the data
-   herr_t ret_value;
-   ret_value = H5Tconvert( id, dest_id, nelmts, buf, background, plist_id );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("convert"), "H5Tconvert failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataType::lock
-///\brief	Locks a datatype, making it read-only and non-destructible.
+    // Get identifiers for C API
+    hid_t dest_id = dest.getId();
+    hid_t plist_id = plist.getId();
+
+    // Call C routine H5Tconvert to convert the data
+    herr_t ret_value;
+    ret_value = H5Tconvert(id, dest_id, nelmts, buf, background, plist_id);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("convert"), "H5Tconvert failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::lock
+///\brief       Locks a datatype, making it read-only and non-destructible.
 ///
-///\exception	H5::DataTypeIException
+///\exception   H5::DataTypeIException
 ///\par Descrition
-///		This is normally done by the library for predefined data
-///		types so the application doesn't inadvertently change or
-///		delete a predefined type.
+///             This is normally done by the library for predefined data
+///             types so the application doesn't inadvertently change or
+///             delete a predefined type.
 ///
-///		Once a data type is locked it can never be unlocked unless
-///		the entire library is closed.
-// Programmer	Binh-Minh Ribler - 2000
+///             Once a data type is locked it can never be unlocked unless
+///             the entire library is closed.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DataType::lock() const
 {
-   // Call C routine to lock the datatype
-   herr_t ret_value = H5Tlock( id );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("lock"), "H5Tlock failed");
-   }
+    // Call C routine to lock the datatype
+    herr_t ret_value = H5Tlock(id);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("lock"), "H5Tlock failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::getClass
-///\brief	Returns the datatype class identifier.
-///\return	Datatype class identifier
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::getClass
+///\brief       Returns the datatype class identifier.
+///\return      Datatype class identifier
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5T_class_t DataType::getClass() const
 {
-   H5T_class_t type_class = H5Tget_class( id );
+    H5T_class_t type_class = H5Tget_class(id);
 
-   // Return datatype class identifier if successful
-   if( type_class == H5T_NO_CLASS )
-   {
-      throw DataTypeIException(inMemFunc("getClass"), "H5Tget_class returns H5T_NO_CLASS");
-   }
-   return( type_class );
+    // Return datatype class identifier if successful
+    if (type_class == H5T_NO_CLASS)
+    {
+        throw DataTypeIException(inMemFunc("getClass"), "H5Tget_class returns H5T_NO_CLASS");
+    }
+    return(type_class);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::getSize
-///\brief	Returns the size of a datatype.
-///\return	Datatype size in bytes
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::getSize
+///\brief       Returns the size of a datatype.
+///\return      Datatype size in bytes
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 size_t DataType::getSize() const
 {
-   // Call C routine to get the datatype size
-   size_t type_size = H5Tget_size( id );
-   if( type_size <= 0 ) // valid data types are never zero size
-   {
-      throw DataTypeIException(inMemFunc("getSize"), "H5Tget_size returns invalid datatype size");
-   }
-   return( type_size );
+    // Call C routine to get the datatype size
+    size_t type_size = H5Tget_size(id);
+    if (type_size <= 0)    // valid data types are never zero size
+    {
+        throw DataTypeIException(inMemFunc("getSize"), "H5Tget_size returns invalid datatype size");
+    }
+    return(type_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::getSuper
-///\brief	Returns the base datatype from which a datatype is derived.
-///\return	DataType object
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::getSuper
+///\brief       Returns the base datatype from which a datatype is derived.
+///\return      DataType object
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DataType DataType::getSuper() const
 {
-   // Call C routine to get the base datatype from which the specified
-   // datatype is derived.
-   hid_t base_type_id = H5Tget_super( id );
-
-   // If H5Tget_super returns a valid datatype id, create and return
-   // the base type, otherwise, raise exception
-   if( base_type_id > 0 )
-   {
-	DataType base_type;
-	base_type.p_setId(base_type_id);
-	return(base_type);
-   }
-   else
-   {
-      throw DataTypeIException(inMemFunc("getSuper"), "H5Tget_super failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	DataType::registerFunc
-///\brief	Registers the specified conversion function.
-///\param	pers - IN: Conversion option
-///			\li \c H5T_PERS_HARD for hard conversion functions
-///			\li \c H5T_PERS_SOFT for soft conversion functions.
-///\param	name - IN: Name displayed in diagnostic output.
-///\param	dest - IN: Destination datatype.
-///\param	func - IN: Function to convert between source and
-///		destination datatypes.
-///\exception	H5::DataTypeIException
+    // Call C routine to get the base datatype from which the specified
+    // datatype is derived.
+    hid_t base_type_id = H5Tget_super(id);
+
+    // If H5Tget_super returns a valid datatype id, create and return
+    // the base type, otherwise, raise exception
+    if (base_type_id > 0)
+    {
+        DataType base_type;
+        base_type.p_setId(base_type_id);
+        return(base_type);
+    }
+    else
+    {
+        throw DataTypeIException(inMemFunc("getSuper"), "H5Tget_super failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::registerFunc
+///\brief       Registers the specified conversion function.
+///\param       pers - IN: Conversion option
+///                     \li \c H5T_PERS_HARD for hard conversion functions
+///                     \li \c H5T_PERS_SOFT for soft conversion functions.
+///\param       name - IN: Name displayed in diagnostic output.
+///\param       dest - IN: Destination datatype.
+///\param       func - IN: Function to convert between source and
+///             destination datatypes.
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For more information, please see:
+///             For more information, please see:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5T.html#Datatype-Register
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::registerFunc( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const
+void DataType::registerFunc(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func) const
 {
-   hid_t dest_id = dest.getId();  // get id of the destination datatype
+    hid_t dest_id = dest.getId();  // get id of the destination datatype
 
-   // Call C routine H5Tregister to register the conversion function
-   herr_t ret_value = H5Tregister( pers, name, id, dest_id, func );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("registerFunc"), "H5Tregister failed");
-   }
+    // Call C routine H5Tregister to register the conversion function
+    herr_t ret_value = H5Tregister(pers, name, id, dest_id, func);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("registerFunc"), "H5Tregister failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::registerFunc
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of the
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::registerFunc
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of the
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::registerFunc( H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func ) const
+void DataType::registerFunc(H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func) const
 {
-   registerFunc( pers, name.c_str(), dest, func );
+    registerFunc(pers, name.c_str(), dest, func);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::unregister
-///\brief	Removes a conversion function from all conversion paths.
-///\param	pers - IN: Conversion option
-///			\li \c H5T_PERS_HARD for hard conversion functions
-///			\li \c H5T_PERS_SOFT for soft conversion functions.
-///\param	name - IN: Name displayed in diagnostic output.
-///\param	dest - IN: Destination datatype.
-///\param	func - IN: Function to convert between source and
-///		destination datatypes.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::unregister
+///\brief       Removes a conversion function from all conversion paths.
+///\param       pers - IN: Conversion option
+///                     \li \c H5T_PERS_HARD for hard conversion functions
+///                     \li \c H5T_PERS_SOFT for soft conversion functions.
+///\param       name - IN: Name displayed in diagnostic output.
+///\param       dest - IN: Destination datatype.
+///\param       func - IN: Function to convert between source and
+///             destination datatypes.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::unregister( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const
+void DataType::unregister(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func) const
 {
-   hid_t dest_id = dest.getId();  // get id of the dest datatype for C API
+    hid_t dest_id = dest.getId();  // get id of the dest datatype for C API
 
-   // Call C routine H5Tunregister to remove the conversion function
-   herr_t ret_value = H5Tunregister( pers, name, id, dest_id, func );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("unregister"), "H5Tunregister failed");
-   }
+    // Call C routine H5Tunregister to remove the conversion function
+    herr_t ret_value = H5Tunregister(pers, name, id, dest_id, func);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("unregister"), "H5Tunregister failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::unregister
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of the
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::unregister
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of the
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::unregister( H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func ) const
+void DataType::unregister(H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func) const
 {
-   unregister( pers, name.c_str(), dest, func );
+    unregister(pers, name.c_str(), dest, func);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::setTag
-///\brief	Tags an opaque datatype.
-///\param	tag - IN: Descriptive ASCII string with which the opaque
-///		datatype is to be tagged.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::setTag
+///\brief       Tags an opaque datatype.
+///\param       tag - IN: Descriptive ASCII string with which the opaque
+///             datatype is to be tagged.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::setTag( const char* tag ) const
+void DataType::setTag(const char* tag) const
 {
-   // Call C routine H5Tset_tag to tag an opaque datatype.
-   herr_t ret_value = H5Tset_tag( id, tag );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException(inMemFunc("setTag"), "H5Tset_tag failed");
-   }
+    // Call C routine H5Tset_tag to tag an opaque datatype.
+    herr_t ret_value = H5Tset_tag(id, tag);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException(inMemFunc("setTag"), "H5Tset_tag failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::setTag
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of the
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::setTag
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of the
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DataType::setTag( const H5std_string& tag ) const
+void DataType::setTag(const H5std_string& tag) const
 {
-   setTag( tag.c_str());
+    setTag(tag.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::getTag
-///\brief	Gets the tag associated with an opaque datatype.
-///\return	Tag associated with the opaque datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType::getTag
+///\brief       Gets the tag associated with an opaque datatype.
+///\return      Tag associated with the opaque datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5std_string DataType::getTag() const
 {
-    char* tag_Cstr = H5Tget_tag( id );
+    char* tag_Cstr = H5Tget_tag(id);
 
     // if the tag C-string returned is not NULL, convert it to C++ string
     // and return it, otherwise, raise an exception
-    if( tag_Cstr != NULL )
+    if (tag_Cstr != NULL)
     {
-	H5std_string tag = H5std_string(tag_Cstr); // C string to string object
-	H5free_memory(tag_Cstr); // free the C string
-	return (tag); // return the tag
+        H5std_string tag = H5std_string(tag_Cstr); // C string to string object
+        H5free_memory(tag_Cstr); // free the C string
+        return (tag); // return the tag
     }
     else
     {
-	throw DataTypeIException(inMemFunc("getTag"), "H5Tget_tag returns NULL for tag");
+        throw DataTypeIException(inMemFunc("getTag"), "H5Tget_tag returns NULL for tag");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::detectClass
-///\brief	Checks whether a datatype contains (or is) a certain type of
-///		datatype.
-///\return	true if this datatype contains or is the specified type,
-///		and false, otherwise.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    DataType::detectClass
+///\brief       Checks whether a datatype contains (or is) a certain type of
+///             datatype.
+///\return      true if this datatype contains or is the specified type,
+///             and false, otherwise.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 bool DataType::detectClass(H5T_class_t cls) const
 {
-   htri_t ret_value = H5Tdetect_class(id, cls);
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else
-   {
-      throw DataTypeIException(inMemFunc("detectClass"),
-				"H5Tdetect_class returns negative value");
-   }
+    htri_t ret_value = H5Tdetect_class(id, cls);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else
+    {
+        throw DataTypeIException(inMemFunc("detectClass"),
+            "H5Tdetect_class returns negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType::isVariableStr
-///\brief	Check whether this datatype is a variable-length string.
-///\return	true if this datatype is a variable-length string, and
-///		false, otherwise.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    DataType::isVariableStr
+///\brief       Check whether this datatype is a variable-length string.
+///\return      true if this datatype is a variable-length string, and
+///             false, otherwise.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 bool DataType::isVariableStr() const
 {
-   htri_t is_varlen_str = H5Tis_variable_str(id);
-   if( is_varlen_str == 1 )
-      return true;
-   else if( is_varlen_str == 0 )
-      return false;
-   else
-   {
-      throw DataTypeIException(inMemFunc("isVariableStr"),
-				"H5Tis_variable_str returns negative value");
-   }
+    htri_t is_varlen_str = H5Tis_variable_str(id);
+    if (is_varlen_str == 1)
+        return true;
+    else if (is_varlen_str == 0)
+        return false;
+    else
+    {
+        throw DataTypeIException(inMemFunc("isVariableStr"),
+            "H5Tis_variable_str returns negative value");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DataType::getCreatePlist
+///\brief       Returns a copy of the property list, which is for datatype
+///             creation.
+///\return      A property list object
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - March, 2017
+// Description
+//              Currently, there is no datatype creation property list class
+//              in the C++ API because there is no associated functionality.
+//--------------------------------------------------------------------------
+PropList DataType::getCreatePlist() const
+{
+    hid_t create_plist_id = H5Tget_create_plist(id);
+    if (create_plist_id < 0)
+    {
+        throw DataTypeIException(inMemFunc("getCreatePlist"),
+            "H5Tget_create_plist returns negative value");
+    }
+    // create and return the DSetCreatPropList object
+    PropList create_plist;
+    f_PropList_setId(&create_plist, create_plist_id);
+    return(create_plist);
 }
 
 //--------------------------------------------------------------------------
@@ -701,11 +761,31 @@ bool DataType::isVariableStr() const
 //--------------------------------------------------------------------------
 hid_t DataType::getId() const
 {
-   return(id);
+    return(id);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
+// Function:    DataType::p_opentype (private)
+///\brief       Opens an HDF5 datatype given its name
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Datatype name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              This function was introduced in 1.10.1 to be used by the new
+//              XxxType constructors that open a datatype. -BMR, Dec 2016
+//--------------------------------------------------------------------------
+hid_t DataType::p_opentype(const H5Location& loc, const char *dtype_name) const
+{
+    // Call C function to open the named datatype at this location
+    hid_t ret_value = H5Topen2(loc.getId(), dtype_name, H5P_DEFAULT);
+    if (ret_value < 0)
+        throw DataTypeIException("DataType constructor", "H5Topen2 failed");
+    return(ret_value);
+}
+
+//--------------------------------------------------------------------------
 // Function:    DataType::p_setId
 ///\brief       Sets the identifier of this object to a new value.
 ///
@@ -723,63 +803,62 @@ void DataType::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw DataTypeIException(inMemFunc("p_setId"), close_error.getDetailMsg());
     }
-   // reset object's id to the given id
-   id = new_id;
+    // reset object's id to the given id
+    id = new_id;
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	DataType::close
-///\brief	Closes the datatype if it is not a predefined type.
+// Function:    DataType::close
+///\brief       Closes the datatype if it is not a predefined type.
 ///
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void DataType::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Tclose(id);
-	if( ret_value < 0 )
-	{
-	    throw DataTypeIException(inMemFunc("close"), "H5Tclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Tclose(id);
+        if (ret_value < 0)
+        {
+            throw DataTypeIException(inMemFunc("close"), "H5Tclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DataType destructor
-///\brief	Properly terminates access to this datatype.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DataType destructor
+///\brief       Properly terminates access to this datatype.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		  library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		  handle the reference counting - BMR, Jun 1, 2006
-//		- Added the use of H5CPP_EXITED to terminate the HDF5 library
-//		  and elimiate previous memory leaks.  See comments in the
-//		  header file "H5PredType.h" for details. - BMR, Mar 30, 2012
-//		- Major re-implementation of the global constants was done
-//		  to avoid relying on the order of the creation and deletion
-//		  of the global constants.  Hence, H5CPP_EXITED was removed.
-//		  See Design Notes in "H5PredType.cpp" for details.
-//		  - BMR, Sep 30, 2015
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//                library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//                handle the reference counting - BMR, Jun 1, 2006
+//              - Added the use of H5CPP_EXITED to terminate the HDF5 library
+//                and elimiate previous memory leaks.  See comments in the
+//                header file "H5PredType.h" for details. - BMR, Mar 30, 2012
+//              - Major re-implementation of the global constants was done
+//                to avoid relying on the order of the creation and deletion
+//                of the global constants.  Hence, H5CPP_EXITED was removed.
+//                See Design Notes in "H5PredType.cpp" for details.
+//                - BMR, Sep 30, 2015
 //--------------------------------------------------------------------------
 DataType::~DataType()
 {
     try
     {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	cerr << inMemFunc("~DataType - ") << close_error.getDetailMsg() << endl;
+    catch (Exception& close_error) {
+        cerr << inMemFunc("~DataType - ") << close_error.getDetailMsg() << endl;
     }
 }
-#ifndef H5_NO_NAMESPACE
+
 } // end namespace
-#endif
diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h
index 5705b83..ba83d37 100644
--- a/c++/src/H5DataType.h
+++ b/c++/src/H5DataType.h
@@ -6,145 +6,154 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-// Class DataType inherits from H5Object and has several subclasses for
-// specific HDF5 data types.
-
 #ifndef __H5DataType_H
 #define __H5DataType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class DataType
     \brief Class DataType provides generic operations on HDF5 datatypes.
 
     DataType inherits from H5Object because a named datatype is an HDF5
-    object and is a base class of ArrayType, AtomType, CompType, EnumType,
+    object, and is a base class of ArrayType, AtomType, CompType, EnumType,
     and VarLenType.
 */
+//  Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP DataType : public H5Object {
    public:
-	// Creates a datatype given its class and size
-	DataType( const H5T_class_t type_class, size_t size );
+        // Creates a datatype given its class and size
+        DataType(const H5T_class_t type_class, size_t size);
+
+        // Copy constructor: makes a copy of the original object
+        DataType(const DataType& original);
 
-	// Copy constructor: makes a copy of the original object
-	DataType( const DataType& original );
+        // Creates a copy of a predefined type
+        DataType(const PredType& pred_type);
 
-	// Creates a copy of a predefined type
-	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, const PropList& plist = PropList::DEFAULT);
+//        DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
-	// Creates a datatype by way of dereference.
-	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();
 
-	// Closes this datatype.
-	virtual void close();
+        // Copies an existing datatype to this datatype object.
+        void copy(const DataType& like_type);
 
-	// Copies an existing datatype to this datatype object.
-	void copy(const DataType& like_type);
+        // Copies the datatype of dset to this datatype object.
+        void copy(const DataSet& dset);
 
-	// Copies the datatype of dset to this datatype object.
-	void copy(const DataSet& dset);
+        // Returns the datatype class identifier.
+        H5T_class_t getClass() const;
 
-	// Returns the datatype class identifier.
-	H5T_class_t getClass() const;
+        // Commits a transient datatype to a file; this datatype becomes
+        // a named datatype which can be accessed from the location.
+        void commit(const H5Location& loc, const char* name);
+        void commit(const H5Location& loc, const H5std_string& name);
 
-	// Commits a transient datatype to a file; this datatype becomes
-	// a named datatype which can be accessed from the location.
-	void commit(const H5Location& loc, const char* name);
-	void commit(const H5Location& loc, const H5std_string& name);
-	// These two overloaded functions are kept for backward compatibility
-	// only; they missed the const.
-	void commit(H5Location& loc, const char* name);
-	void commit(H5Location& loc, const H5std_string& name);
+        // These two overloaded functions are kept for backward compatibility
+        // only; they missed the const - removed from 1.8.18 and 1.10.1
+        //void commit(H5Location& loc, const char* name);
+        //void commit(H5Location& loc, const H5std_string& name);
 
-	// Determines whether this datatype is a named datatype or
-	// a transient datatype.
-	bool committed() const;
+        // Determines whether this datatype is a named datatype or
+        // a transient datatype.
+        bool committed() const;
 
         // Finds a conversion function that can handle the conversion
         // this datatype to the given datatype, dest.
-	H5T_conv_t find( const DataType& dest, H5T_cdata_t **pcdata ) const;
+        H5T_conv_t find(const DataType& dest, H5T_cdata_t **pcdata) const;
+
+        // Converts data from between specified datatypes.
+        void convert(const DataType& dest, size_t nelmts, void *buf, void *background, const PropList& plist=PropList::DEFAULT) const;
+
+        // Assignment operator
+        DataType& operator=(const DataType& rhs);
+
+        // Determines whether two datatypes are the same.
+        bool operator==(const DataType& compared_type) const;
 
-	// Converts data from between specified datatypes.
-	void convert( const DataType& dest, size_t nelmts, void *buf, void *background, const PropList& plist=PropList::DEFAULT) const;
+        // Locks a datatype.
+        void lock() const;
 
-	// Assignment operator
-	DataType& operator=( const DataType& rhs );
+        // Returns the size of a datatype.
+        size_t getSize() const;
 
-	// Determines whether two datatypes are the same.
-	bool operator==(const DataType& compared_type ) const;
+        // Returns the base datatype from which a datatype is derived.
+        // Note: not quite right for specific types yet???
+        DataType getSuper() const;
 
-	// Locks a datatype.
-	void lock() const;
+        // Registers a conversion function.
+        void registerFunc(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func) const;
+        void registerFunc(H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func) const;
 
-	// Returns the size of a datatype.
-	size_t getSize() const;
+        // Removes a conversion function from all conversion paths.
+        void unregister(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func) const;
+        void unregister(H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func) const;
 
-	// Returns the base datatype from which a datatype is derived.
-	// Note: not quite right for specific types yet???
-	DataType getSuper() const;
+        // Tags an opaque datatype.
+        void setTag(const char* tag) const;
+        void setTag(const H5std_string& tag) const;
 
-	// Registers a conversion function.
-	void registerFunc(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const;
-	void registerFunc(H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func ) const;
+        // Gets the tag associated with an opaque datatype.
+        H5std_string getTag() const;
 
-	// Removes a conversion function from all conversion paths.
-	void unregister( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const;
-	void unregister( H5T_pers_t pers, const H5std_string& name, const DataType& dest, H5T_conv_t func ) const;
+        // Checks whether this datatype contains (or is) a certain type class.
+        bool detectClass(H5T_class_t cls) const;
 
-	// Tags an opaque datatype.
-	void setTag( const char* tag ) const;
-	void setTag( const H5std_string& tag ) const;
+        // Checks whether this datatype is a variable-length string.
+        bool isVariableStr() const;
 
-	// Gets the tag associated with an opaque datatype.
-	H5std_string getTag() const;
+        // Returns a copy of the creation property list of a datatype.
+        PropList getCreatePlist() const;
 
-	// Checks whether this datatype contains (or is) a certain type class.
-	bool detectClass(H5T_class_t cls) const;
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("DataType"); }
 
-	// Checks whether this datatype is a variable-length string.
-	bool isVariableStr() const;
+// From CommonFG then H5Location
+        // Constructors to open a generic named datatype at a given location.
+        DataType(const H5Location& loc, const char* name);
+        DataType(const H5Location& loc, const H5std_string& name);
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("DataType"); }
+// End of From CommonFG then H5Location
 
-	// Creates a copy of an existing DataType using its id
-	DataType( const hid_t type_id );
+        // Creates a copy of an existing DataType using its id
+        DataType(const hid_t type_id);
 
-	// Default constructor
-	DataType();
+        // Default constructor
+        DataType();
 
-	// Gets the datatype id.
-	virtual hid_t getId() const;
+        // Gets the datatype id.
+        virtual hid_t getId() const;
 
-	// Destructor: properly terminates access to this datatype.
-	virtual ~DataType();
+        // Destructor: properly terminates access to this datatype.
+        virtual ~DataType();
 
    protected:
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	hid_t id;	// HDF5 datatype id
+        hid_t id;    // HDF5 datatype id
+
+        // Sets the datatype id.
+        virtual void p_setId(const hid_t new_id);
+
+        // Opens a datatype and returns the id.
+        hid_t p_opentype(const H5Location& loc, const char* dtype_name) const;
 
-	// Sets the datatype id.
-	virtual void p_setId(const hid_t new_id);
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	// Friend function to set DataType id.  For library use only.
-	friend void f_DataType_setId(DataType* dtype, hid_t new_id);
-
-	void p_commit(hid_t loc_id, const char* name);
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+        // Friend function to set DataType id.  For library use only.
+        friend void f_DataType_setId(DataType* dtype, hid_t new_id);
+
+        void p_commit(hid_t loc_id, const char* name);
+
+}; // end of DataType
+} // namespace H5
+
 #endif // __H5DataType_H
diff --git a/c++/src/H5DcreatProp.cpp b/c++/src/H5DcreatProp.cpp
index 60cf0fc..67e4a1c 100644
--- a/c++/src/H5DcreatProp.cpp
+++ b/c++/src/H5DcreatProp.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -18,16 +16,16 @@
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
+#include "H5DataSpace.h"
 #include "H5PropList.h"
 #include "H5OcreatProp.h"
-#include "H5Object.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -41,7 +39,7 @@ DSetCreatPropList* DSetCreatPropList::DEFAULT_ = 0;
 // Function:    DSetCreatPropList::getConstant
 // Purpose:     Creates a DSetCreatPropList object representing the HDF5
 //              constant H5P_DATASET_CREATE, pointed to by
-//		DSetCreatPropList::DEFAULT_
+//              DSetCreatPropList::DEFAULT_
 // exception    H5::PropListIException
 // Description
 //              If DSetCreatPropList::DEFAULT_ already points to an allocated
@@ -81,650 +79,719 @@ void DSetCreatPropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose	Constant for dataset creation default property
+// Purpose      Constant for dataset creation default property
 //--------------------------------------------------------------------------
 const DSetCreatPropList& DSetCreatPropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList default constructor
-///\brief	Default constructor: creates a stub dataset creation property list
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList default constructor
+///\brief       Default constructor: creates a stub dataset creation property list
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetCreatPropList::DSetCreatPropList() : ObjCreatPropList(H5P_DATASET_CREATE) {}
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList copy constructor
-///\brief	Copy constructor: makes a copy of the original
-///		DSetCreatPropList object
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList copy constructor
+///\brief       Copy constructor: makes a copy of the original
+///             DSetCreatPropList object
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DSetCreatPropList::DSetCreatPropList( const DSetCreatPropList& orig ) : ObjCreatPropList(orig) {}
+DSetCreatPropList::DSetCreatPropList(const DSetCreatPropList& orig) : ObjCreatPropList(orig) {}
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList overloaded constructor
-///\brief	Creates a DSetCreatPropList object using the id of an
-///		existing dataset creation property list.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList overloaded constructor
+///\brief       Creates a DSetCreatPropList object using the id of an
+///             existing dataset creation property list.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetCreatPropList::DSetCreatPropList(const hid_t plist_id) : ObjCreatPropList(plist_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setChunk
-///\brief	Sets the size of the chunks used to store a chunked layout
-///		dataset.
-///\param	ndims - IN: Number of dimensions of each chunk
-///\param	dim   - IN: Array containing the size of each chunk
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setChunk
+///\brief       Sets the size of the chunks used to store a chunked layout
+///             dataset.
+///\param       ndims - IN: Number of dimensions of each chunk
+///\param       dim   - IN: Array containing the size of each chunk
+///\exception   H5::PropListIException
 ///\par Description
-///		The \a ndims parameter currently must have the same value as
-///		the rank of the dataset.  The values of the \a dim array
-///		define the size of the chunks to store the dataset's raw
-///		data.  As a side-effect, the layout of the dataset will be
-///		changed to \c H5D_CHUNKED, if it is not so already.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::setChunk( int ndims, const hsize_t* dim ) const
+///             The \a ndims parameter currently must have the same value as
+///             the rank of the dataset.  The values of the \a dim array
+///             define the size of the chunks to store the dataset's raw
+///             data.  As a side-effect, the layout of the dataset will be
+///             changed to \c H5D_CHUNKED, if it is not so already.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setChunk(int ndims, const hsize_t* dim) const
 {
-   herr_t ret_value = H5Pset_chunk( id, ndims, dim );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setChunk", "H5Pset_chunk failed");
-   }
+    herr_t ret_value = H5Pset_chunk(id, ndims, dim);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setChunk", "H5Pset_chunk failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getChunk
-///\brief	Retrieves the size of the chunks used to store a chunked
-///		layout dataset.
-///\param	max_ndims - IN: Size of \a dim array
-///\param	dim      - OUT: Array to store the chunk dimensions
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList::getChunk
+///\brief       Retrieves the size of the chunks used to store a chunked
+///             layout dataset.
+///\param       max_ndims - IN: Size of \a dim array
+///\param       dim      - OUT: Array to store the chunk dimensions
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-int DSetCreatPropList::getChunk( int max_ndims, hsize_t* dim ) const
+int DSetCreatPropList::getChunk(int max_ndims, hsize_t* dim) const
 {
-   int chunk_size = H5Pget_chunk( id, max_ndims, dim );
-   if( chunk_size < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getChunk",
-		"H5Pget_chunk returns negative chunk size");
-   }
-   return( chunk_size );
+    int chunk_size = H5Pget_chunk(id, max_ndims, dim);
+    if (chunk_size < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getChunk",
+            "H5Pget_chunk returns negative chunk size");
+    }
+    return(chunk_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setLayout
-///\brief	Sets the type of storage used store the raw data for a dataset.
-///\param	layout - IN: Type of storage layout for raw data
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setLayout
+///\brief       Sets the type of storage used store the raw data for a dataset.
+///\param       layout - IN: Type of storage layout for raw data
+///\exception   H5::PropListIException
 ///\par Description
-///		For information on valid layout types, please refer to
+///             For information on valid layout types, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLayout
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetCreatPropList::setLayout(H5D_layout_t layout) const
 {
-   herr_t ret_value = H5Pset_layout( id, layout );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setLayout",
-		"H5Pset_layout failed");
-   }
+    herr_t ret_value = H5Pset_layout(id, layout);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setLayout",
+            "H5Pset_layout failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getLayout
-///\brief	Retrieves the layout type of this property list
-///\return	Layout type, which can be:
-///		\li \c H5D_COMPACT - raw data is stored in the object
-///		                header in the file.
-///		\li \c H5D_CONTIGUOUS - raw data is stored separately from the
-///		                object header in one contiguous chunk in
-///		                the file.
-///		\li \c H5D_CHUNKED - raw data is stored separately from the
-///		                object header in chunks in separate locations
-///		                in the file.
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getLayout
+///\brief       Retrieves the layout type of this property list
+///\return      Layout type, which can be:
+///             \li \c H5D_COMPACT - raw data is stored in the object
+///                             header in the file.
+///             \li \c H5D_CONTIGUOUS - raw data is stored separately from the
+///                             object header in one contiguous chunk in
+///                             the file.
+///             \li \c H5D_CHUNKED - raw data is stored separately from the
+///                             object header in chunks in separate locations
+///                             in the file.
+///\exception   H5::PropListIException
 ///\par Description
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5D_layout_t DSetCreatPropList::getLayout() const
 {
-   H5D_layout_t layout = H5Pget_layout( id );
-   if( layout == H5D_LAYOUT_ERROR )
-   {
-      throw PropListIException("DSetCreatPropList::getLayout",
-		"H5Pget_layout returns H5D_LAYOUT_ERROR");
-   }
-   return( layout );
+    H5D_layout_t layout = H5Pget_layout(id);
+    if (layout == H5D_LAYOUT_ERROR)
+    {
+        throw PropListIException("DSetCreatPropList::getLayout",
+            "H5Pget_layout returns H5D_LAYOUT_ERROR");
+    }
+    return(layout);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setDeflate
-///\brief	Sets compression method and compression level
-///\param	level - IN: Compression level, should [0..9], inclusive
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setDeflate
+///\brief       Sets compression method and compression level
+///\param       level - IN: Compression level, should [0..9], inclusive
+///\exception   H5::PropListIException
 ///\par Description
-///		The function sets the compression method for this property
-///		list to \c H5D_COMPRESS_DEFLATE and the compression level to
-///		\a level. Lower compression levels are faster but result in
-///		less compression.
-// Programmer	Binh-Minh Ribler - 2000
+///             The function sets the compression method for this property
+///             list to \c H5D_COMPRESS_DEFLATE and the compression level to
+///             \a level. Lower compression levels are faster but result in
+///             less compression.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetCreatPropList::setDeflate( int level ) const
+void DSetCreatPropList::setDeflate(int level) const
 {
-   herr_t ret_value = H5Pset_deflate( id, level );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setDeflate",
-		"H5Pset_deflate failed");
-   }
+    herr_t ret_value = H5Pset_deflate(id, level);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setDeflate",
+            "H5Pset_deflate failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setSzip
-///\brief	Sets up for the use of the SZIP compression filter.
-///\param	options_mask     - IN: A bit-mask conveying the desired SZIP
-///			options.  Valid values are H5_SZIP_EC_OPTION_MASK
-///			and H5_SZIP_NN_OPTION_MASK.
-///\param	pixels_per_block - IN: Number of pixels or data elements in
-///			each data block.
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setSzip
+///\brief       Sets up for the use of the SZIP compression filter.
+///\param       options_mask     - IN: A bit-mask conveying the desired SZIP
+///                     options.  Valid values are H5_SZIP_EC_OPTION_MASK
+///                     and H5_SZIP_NN_OPTION_MASK.
+///\param       pixels_per_block - IN: Number of pixels or data elements in
+///                     each data block.
+///\exception   H5::PropListIException
 ///\par Description
-///		The associate C function sets an SZIP compression filter,
-///		H5Z_FILTER_SZIP, for a dataset.  For more information about
-///		SZIP and usage, please refer to the C layer Reference
-///		Manual at:
+///             The associate C function sets an SZIP compression filter,
+///             H5Z_FILTER_SZIP, for a dataset.  For more information about
+///             SZIP and usage, please refer to the C layer Reference
+///             Manual at:
 /// http://hdfgroup.org/HDF5/doc/RM_H5P.html#Property-SetSzip
-// Programmer	Binh-Minh Ribler - Jan, 2007
+// Programmer   Binh-Minh Ribler - Jan, 2007
 //--------------------------------------------------------------------------
 void DSetCreatPropList::setSzip(unsigned int options_mask, unsigned int pixels_per_block) const
 {
     herr_t ret_value = H5Pset_szip(id, options_mask, pixels_per_block);
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw PropListIException("DSetCreatPropList::setSzip",
-		"H5Pset_szip failed");
+        throw PropListIException("DSetCreatPropList::setSzip",
+            "H5Pset_szip failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setFillValue
-///\brief	Sets a dataset fill value
-///\param	fvalue_type - IN: Data type for the value passed via \a value
-///\param	value - IN: Pointer to buffer containing the fill value
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setNbit
+///\brief       Sets up for the use of the Nbit compression filter.
+///\exception   H5::PropListIException
 ///\par Description
-///		The datatype may differ from that of the dataset, but it must
-///		be one that the HDF5 library is able to convert \a value to
-///		the dataset datatype when the dataset is created.
-///		The default fill value is 0 (zero,) which is interpreted
-///		according to the actual dataset datatype.
+///             The associate C function sets an Nbit compression filter,
+///             H5Z_FILTER_NBIT, for a dataset.  For more information about
+///             Nbit compression, please refer to the C layer Reference
+///             Manual at:
+/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-setNbit
+// Programmer   Binh-Minh Ribler - Apr, 2016
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setNbit() const
+{
+    herr_t ret_value = H5Pset_nbit(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setNbit",
+            "H5Pset_nbit failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DSetCreatPropList::setFillValue
+///\brief       Sets a dataset fill value
+///\param       fvalue_type - IN: Data type for the value passed via \a value
+///\param       value - IN: Pointer to buffer containing the fill value
+///\exception   H5::PropListIException
+///\par Description
+///             The datatype may differ from that of the dataset, but it must
+///             be one that the HDF5 library is able to convert \a value to
+///             the dataset datatype when the dataset is created.
+///             The default fill value is 0 (zero,) which is interpreted
+///             according to the actual dataset datatype.
 ///\par
-///		For information on setting fill value, please refer to the
-///		C layer Reference Manual at:
+///             For information on setting fill value, please refer to the
+///             C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFillValue
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetCreatPropList::setFillValue( const DataType& fvalue_type, const void* value ) const
+void DSetCreatPropList::setFillValue(const DataType& fvalue_type, const void* value) const
 {
-   herr_t ret_value = H5Pset_fill_value( id, fvalue_type.getId(), value );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setFillValue",
+    herr_t ret_value = H5Pset_fill_value(id, fvalue_type.getId(), value);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setFillValue",
                 "H5Pset_fill_value failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getFillValue
-///\brief	Retrieves a dataset fill value
-///\param	fvalue_type - IN: Data type for the value passed via \a value
-///\param	value - OUT: Pointer to buffer to hold the retrieved fill value
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getFillValue
+///\brief       Retrieves a dataset fill value
+///\param       fvalue_type - IN: Data type for the value passed via \a value
+///\param       value - OUT: Pointer to buffer to hold the retrieved fill value
+///\exception   H5::PropListIException
 ///\par Description
-///		The fill value is returned through \a value pointer
-///		and the memory is allocated by the caller.  The fill
-///		value will be converted from its current data type to the
-///		specified by \a fvalue_type.
-// Programmer	Binh-Minh Ribler - 2000
+///             The fill value is returned through \a value pointer
+///             and the memory is allocated by the caller.  The fill
+///             value will be converted from its current data type to the
+///             specified by \a fvalue_type.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetCreatPropList::getFillValue( const DataType& fvalue_type, void* value ) const
+void DSetCreatPropList::getFillValue(const DataType& fvalue_type, void* value) const
 {
-   herr_t ret_value = H5Pget_fill_value( id, fvalue_type.getId(), value );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getFillValue",
+    herr_t ret_value = H5Pget_fill_value(id, fvalue_type.getId(), value);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getFillValue",
                 "H5Pget_fill_value failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::isFillValueDefined
-///\brief	Check if fill value has been defined for this property
+// Function:    DSetCreatPropList::isFillValueDefined
+///\brief       Check if fill value has been defined for this property
 ///\return
-///		\li \c H5D_FILL_VALUE_UNDEFINED    =0,
-///		\li \c H5D_FILL_VALUE_DEFAULT      =1,
-///		\li \c H5D_FILL_VALUE_USER_DEFINED =2
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+///             \li \c H5D_FILL_VALUE_UNDEFINED    =0,
+///             \li \c H5D_FILL_VALUE_DEFAULT      =1,
+///             \li \c H5D_FILL_VALUE_USER_DEFINED =2
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5D_fill_value_t DSetCreatPropList::isFillValueDefined()
+H5D_fill_value_t DSetCreatPropList::isFillValueDefined() const
 {
-   H5D_fill_value_t status;
-   herr_t ret_value = H5Pfill_value_defined(id, &status);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::isFillValueDefined",
+    H5D_fill_value_t status;
+    herr_t ret_value = H5Pfill_value_defined(id, &status);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::isFillValueDefined",
                 "H5Pfill_value_defined returned H5D_FILL_VALUE_ERROR (-1)");
-   }
-   else
-      return (status);
+    }
+    else
+        return (status);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setFilter
-///\brief	Adds a filter to the filter pipeline
-///\param	filter_id - IN: Filter to add
-///\param	flags     - IN: Specifies general properties of the filter
-///\param	cd_nelmts - IN: Number of elements in cd_values
-///\param	cd_values - IN: Auxiliary data for the filter
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setFilter
+///\brief       Adds a filter to the filter pipeline
+///\param       filter_id - IN: Filter to add
+///\param       flags     - IN: Specifies general properties of the filter
+///\param       cd_nelmts - IN: Number of elements in cd_values
+///\param       cd_values - IN: Auxiliary data for the filter
+///\exception   H5::PropListIException
 ///\par Description
-///		The \a flags argument is a bit vector of the field:
-///		\c H5Z_FLAG_OPTIONAL(0x0001)
+///             The \a flags argument is a bit vector of the field:
+///             \c H5Z_FLAG_OPTIONAL(0x0001)
 ///\par
-///		If this bit is set then the filter is optional.  If the filter
-///		fails during a \c DataSet::write() operation then the filter
-///		is just excluded from the pipeline for the chunk for which it
-///		failed; the filter will not participate in the pipeline
-///		during a \c DataSet::read() of the chunk.  If this bit is clear
-///		and the filter fails then the entire I/O operation fails.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::setFilter( H5Z_filter_t filter_id, unsigned int flags,
-	size_t cd_nelmts, const unsigned int cd_values[] ) const
+///             If this bit is set then the filter is optional.  If the filter
+///             fails during a \c DataSet::write() operation then the filter
+///             is just excluded from the pipeline for the chunk for which it
+///             failed; the filter will not participate in the pipeline
+///             during a \c DataSet::read() of the chunk.  If this bit is clear
+///             and the filter fails then the entire I/O operation fails.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setFilter(H5Z_filter_t filter_id, unsigned int flags,
+        size_t cd_nelmts, const unsigned int cd_values[]) const
 {
-   herr_t ret_value = H5Pset_filter( id, filter_id, flags, cd_nelmts, cd_values );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setFilter",
+    herr_t ret_value = H5Pset_filter(id, filter_id, flags, cd_nelmts, cd_values);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setFilter",
                 "H5Pset_filter failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::removeFilter
-///\brief	Removes one or more filters
-///\param	filter_id - IN: Filter to remove
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::removeFilter
+///\brief       Removes one or more filters
+///\param       filter_id - IN: Filter to remove
+///\exception   H5::PropListIException
 ///\par Description
-///		Deletes a filter from the dataset creation property list;
-///		deletes all filters if \a filter_id is \c H5Z_FILTER_NONE.
-// Programmer	Binh-Minh Ribler - 2000
+///             Deletes a filter from the dataset creation property list;
+///             deletes all filters if \a filter_id is \c H5Z_FILTER_NONE.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetCreatPropList::removeFilter(H5Z_filter_t filter_id) const
 {
-   herr_t ret_value = H5Premove_filter( id, filter_id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::removeFilter",
+    herr_t ret_value = H5Premove_filter(id, filter_id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::removeFilter",
                 "H5Premove_filter failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getNfilters
-///\brief	Returns the number of filters in the pipeline
-///\return	Number of filters
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList::getNfilters
+///\brief       Returns the number of filters in the pipeline
+///\return      Number of filters
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 int DSetCreatPropList::getNfilters() const
 {
-   int num_filters = H5Pget_nfilters( id );
-   if( num_filters < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getNfilters",
+    int num_filters = H5Pget_nfilters(id);
+    if (num_filters < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getNfilters",
                 "H5Pget_nfilters returned negative number of filters");
-   }
-   else
-      return( num_filters );
+    }
+    else
+        return(num_filters);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getFilter
-///\brief	Returns information about a filter in a pipeline
-///\param	filter_number  - IN: Filter to get, range [0..N-1], where
-///				     N is returned by H5Pget_nfilters()
-///\param	flags         - OUT: General properties of the filter
-///\param	cd_nelmts  - IN/OUT: Number of elements in \a cd_values /Number
-///				     of values defined by the filter
-///\param	cd_values     - OUT: Array to hold the data; allocated by the user
-///\param	namelen       - IN: Length of \a name
-///\param	name          - OUT: Name of the filter
-///\param	filter_config - OUT: Flags indicating whether filter can encode/decode
-///\return	Filter id
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getFilter
+///\brief       Returns information about a filter in a pipeline
+///\param       filter_number  - IN: Filter to get, range [0..N-1], where
+///                                  N is returned by H5Pget_nfilters()
+///\param       flags         - OUT: General properties of the filter
+///\param       cd_nelmts  - IN/OUT: Number of elements in \a cd_values /Number
+///                                  of values defined by the filter
+///\param       cd_values     - OUT: Array to hold the data; allocated by the user
+///\param       namelen       - IN: Length of \a name
+///\param       name          - OUT: Name of the filter
+///\param       filter_config - OUT: Flags indicating whether filter can encode/decode
+///\return      Filter id
+///\exception   H5::PropListIException
 ///\par Description
-///		Failure occurs when \a filter_number is out of range.
-//		Note: the first argument was mistakenly typed as int instead
-//		of unsigned int, but for backward compatibility, it cannot be
-//		changed. -BMR (2014/04/15)
+///             Failure occurs when \a filter_number is out of range.
+//              Note: the first argument was mistakenly typed as int instead
+//              of unsigned int, but for backward compatibility, it cannot be
+//              changed. -BMR (2014/04/15)
 //--------------------------------------------------------------------------
 H5Z_filter_t DSetCreatPropList::getFilter(int filter_number,
-	unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values,
-	size_t namelen, char name[], unsigned int& filter_config) const
+        unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values,
+        size_t namelen, char name[], unsigned int& filter_config) const
 {
-   H5Z_filter_t filter_id;
-   filter_id = H5Pget_filter2(id, filter_number, &flags, &cd_nelmts,
-				cd_values, namelen, name, &filter_config);
-   if( filter_id == H5Z_FILTER_ERROR )
-      throw PropListIException("DSetCreatPropList::getFilter",
+    H5Z_filter_t filter_id;
+    filter_id = H5Pget_filter2(id, filter_number, &flags, &cd_nelmts,
+                                  cd_values, namelen, name, &filter_config);
+    if (filter_id == H5Z_FILTER_ERROR)
+        throw PropListIException("DSetCreatPropList::getFilter",
                 "H5Pget_filter2 returned H5Z_FILTER_ERROR");
-   else
-      return(filter_id);
+    else
+        return(filter_id);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getFilterById
-///\brief	Returns information about a filter in a pipeline given the
-///		filter id
-///\param	filter_id -      IN: Filter to get
-///\param	flags     -     OUT: General properties of the filter
-///\param	cd_nelmts -  IN/OUT: Number of elements in \a cd_values /Number
-///				     of values defined by the filter
-///\param	cd_values -     OUT: Array to hold the data; allocated by the user
-///\param	namelen   -      IN: Length of \a name
-///\param	name      -     OUT: Name of the filter
-///\param	filter_config - OUT: Flags indicating whether filter can encode/decode
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList::getFilterById
+///\brief       Returns information about a filter in a pipeline given the
+///             filter id
+///\param       filter_id -      IN: Filter to get
+///\param       flags     -     OUT: General properties of the filter
+///\param       cd_nelmts -  IN/OUT: Number of elements in \a cd_values /Number
+///                                  of values defined by the filter
+///\param       cd_values -     OUT: Array to hold the data; allocated by the user
+///\param       namelen   -      IN: Length of \a name
+///\param       name      -     OUT: Name of the filter
+///\param       filter_config - OUT: Flags indicating whether filter can encode/decode
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetCreatPropList::getFilterById(H5Z_filter_t filter_id,
-	unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values,
-	size_t namelen, char name[], unsigned int &filter_config) const
+        unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values,
+        size_t namelen, char name[], unsigned int &filter_config) const
 {
-   herr_t ret_value = H5Pget_filter_by_id2(id, filter_id, &flags, &cd_nelmts,
-				cd_values, namelen, name, &filter_config);
-   if (ret_value < 0)
-      throw PropListIException("DSetCreatPropList::getFilterById",
+    herr_t ret_value = H5Pget_filter_by_id2(id, filter_id, &flags, &cd_nelmts,
+                                  cd_values, namelen, name, &filter_config);
+    if (ret_value < 0)
+        throw PropListIException("DSetCreatPropList::getFilterById",
                 "H5Pget_filter_by_id2 failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::modifyFilter
-///\brief	Modifies the specified filter
-///\param	filter_id -  IN: Filter to get
-///\param	flags     - OUT: General properties of the filter
-///\param	cd_nelmts -  IN: Number of elements in \a cd_values
-///		        \n  OUT: Number of values defined by the filter
-///\param	cd_values - OUT: Array to hold the data; allocated by the user
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::modifyFilter
+///\brief       Modifies the specified filter
+///\param       filter_id -  IN: Filter to get
+///\param       flags     - OUT: General properties of the filter
+///\param       cd_nelmts -  IN: Number of elements in \a cd_values
+///                     \n  OUT: Number of values defined by the filter
+///\param       cd_values - OUT: Array to hold the data; allocated by the user
+///\exception   H5::PropListIException
 ///\par Description
-///		The \a flags argument is a bit vector of the field:
-///		\c H5Z_FLAG_OPTIONAL(0x0001)
+///             The \a flags argument is a bit vector of the field:
+///             \c H5Z_FLAG_OPTIONAL(0x0001)
 ///\par
-///		If this bit is set then the filter is optional.  If the filter
-///		fails during a DataSet::write() operation then the filter
-///		is just excluded from the pipeline for the chunk for which it
-///		failed; the filter will not participate in the pipeline
-///		during a DataSet::read() of the chunk.  If this bit is clear
-///		and the filter fails then the entire I/O operation fails.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::modifyFilter( H5Z_filter_t filter_id, unsigned int
-	flags, size_t cd_nelmts, const unsigned int cd_values[] ) const
+///             If this bit is set then the filter is optional.  If the filter
+///             fails during a DataSet::write() operation then the filter
+///             is just excluded from the pipeline for the chunk for which it
+///             failed; the filter will not participate in the pipeline
+///             during a DataSet::read() of the chunk.  If this bit is clear
+///             and the filter fails then the entire I/O operation fails.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::modifyFilter(H5Z_filter_t filter_id, unsigned int
+        flags, size_t cd_nelmts, const unsigned int cd_values[]) const
 {
-   herr_t ret_value = H5Pmodify_filter(id, filter_id, flags, cd_nelmts, cd_values);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::modifyFilter",
+    herr_t ret_value = H5Pmodify_filter(id, filter_id, flags, cd_nelmts, cd_values);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::modifyFilter",
                 "H5Pmodify_filter failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::allFiltersAvail
-///\brief	Queries whether all the filters set in this property list
-///		are available currently.
-///\return	true if all filters available, and false if one or more
-///		filters not currently available
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList::allFiltersAvail
+///\brief       Queries whether all the filters set in this property list
+///             are available currently.
+///\return      true if all filters available, and false if one or more
+///             filters not currently available
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-bool DSetCreatPropList::allFiltersAvail()
+bool DSetCreatPropList::allFiltersAvail() const
 {
-   htri_t ret_value = H5Pall_filters_avail(id);
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else // Raise exception when H5Pall_filters_avail returns a negative value
-   {
-      throw PropListIException("DSetCreatPropList::allFiltersAvail", "H5Pall_filters_avail returned negative value");
-   }
+    htri_t ret_value = H5Pall_filters_avail(id);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Pall_filters_avail returns a negative value
+    {
+        throw PropListIException("DSetCreatPropList::allFiltersAvail", "H5Pall_filters_avail returned negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setShuffle
-///\brief	Sets method of the shuffle filter
+// Function:    DSetCreatPropList::setShuffle
+///\brief       Sets method of the shuffle filter
 ///
-///\exception	H5::PropListIException
+///\exception   H5::PropListIException
 ///\par Description
-///		Please refer to the Reference Manual of \c H5Pset_shuffle for
-///		details.
+///             Please refer to the Reference Manual of \c H5Pset_shuffle for
+///             details.
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetShuffle
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetCreatPropList::setShuffle() const
 {
-   herr_t ret_value = H5Pset_shuffle(id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setShuffle",
+    herr_t ret_value = H5Pset_shuffle(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setShuffle",
                 "H5Pset_shuffle failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getAllocTime
-///\brief	Get space allocation time for this property.
-///\return	Space allocation time.
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getAllocTime
+///\brief       Get space allocation time for this property.
+///\return      Space allocation time.
+///\exception   H5::PropListIException
 ///\par Description
-///		The values of space allocation time can be one of the
-///		followings:
-///		\li \c H5D_ALLOC_TIME_DEFAULT
-///		\li \c H5D_ALLOC_TIME_EARLY
-///		\li \c H5D_ALLOC_TIME_LATE
-///		\li \c H5D_ALLOC_TIME_INCR
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-H5D_alloc_time_t DSetCreatPropList::getAllocTime()
+///             The values of space allocation time can be one of the
+///             followings:
+///             \li \c H5D_ALLOC_TIME_DEFAULT
+///             \li \c H5D_ALLOC_TIME_EARLY
+///             \li \c H5D_ALLOC_TIME_LATE
+///             \li \c H5D_ALLOC_TIME_INCR
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+H5D_alloc_time_t DSetCreatPropList::getAllocTime() const
 {
-   H5D_alloc_time_t alloc_time;
-   herr_t ret_value = H5Pget_alloc_time(id, &alloc_time);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getAllocTime",
+    H5D_alloc_time_t alloc_time;
+    herr_t ret_value = H5Pget_alloc_time(id, &alloc_time);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getAllocTime",
                 "H5Pget_alloc_time failed");
-   }
-   else
-      return (alloc_time);
+    }
+    else
+        return (alloc_time);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getFillTime
-///\brief	Gets fill value writing time.
-///\return	Fill value writing time
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getFillTime
+///\brief       Gets fill value writing time.
+///\return      Fill value writing time
+///\exception   H5::PropListIException
 ///\par Description
-///		Valid values for fill value writing time include
-///		\li \c H5D_FILL_TIME_NEVER
-///		\li \c H5D_FILL_TIME_ALLOC.
-// Programmer	Binh-Minh Ribler - 2000
+///             Valid values for fill value writing time include
+///             \li \c H5D_FILL_TIME_NEVER
+///             \li \c H5D_FILL_TIME_ALLOC.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5D_fill_time_t DSetCreatPropList::getFillTime()
+H5D_fill_time_t DSetCreatPropList::getFillTime() const
 {
-   H5D_fill_time_t fill_time;
-   herr_t ret_value = H5Pget_fill_time(id, &fill_time);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getFillTime",
+    H5D_fill_time_t fill_time;
+    herr_t ret_value = H5Pget_fill_time(id, &fill_time);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getFillTime",
                 "H5Pget_fill_time failed");
-   }
-   else
-      return (fill_time);
+    }
+    else
+        return (fill_time);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setAllocTime
-///\brief	Sets space allocation time for dataset during creation.
-///\param	alloc_time -  IN: Allocation time
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setAllocTime
+///\brief       Sets space allocation time for dataset during creation.
+///\param       alloc_time -  IN: Allocation time
+///\exception   H5::PropListIException
 ///\par Description
-///		Valid values for space allocation time include:
-///		\li \c H5D_ALLOC_TIME_DEFAULT
-///		\li \c H5D_ALLOC_TIME_EARLY
-///		\li \c H5D_ALLOC_TIME_LATE
-///		\li \c H5D_ALLOC_TIME_INCR
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::setAllocTime(H5D_alloc_time_t alloc_time)
+///             Valid values for space allocation time include:
+///             \li \c H5D_ALLOC_TIME_DEFAULT
+///             \li \c H5D_ALLOC_TIME_EARLY
+///             \li \c H5D_ALLOC_TIME_LATE
+///             \li \c H5D_ALLOC_TIME_INCR
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setAllocTime(H5D_alloc_time_t alloc_time) const
 {
-   herr_t ret_value = H5Pset_alloc_time(id, alloc_time);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setAllocTime",
+    herr_t ret_value = H5Pset_alloc_time(id, alloc_time);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setAllocTime",
                 "H5Pset_alloc_time failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setFillTime
-///\brief	Sets fill value writing time for dataset.
-///\return	Fill value writing time
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setFillTime
+///\brief       Sets fill value writing time for dataset.
+///\return      Fill value writing time
+///\exception   H5::PropListIException
 ///\par Description
-///		Valid values for fill value writing time include
-///		\li \c H5D_FILL_TIME_NEVER
-///		\li \c H5D_FILL_TIME_ALLOC.
-// Programmer	Binh-Minh Ribler - 2000
+///             Valid values for fill value writing time include
+///             \li \c H5D_FILL_TIME_NEVER
+///             \li \c H5D_FILL_TIME_ALLOC.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetCreatPropList::setFillTime(H5D_fill_time_t fill_time)
+void DSetCreatPropList::setFillTime(H5D_fill_time_t fill_time) const
 {
-   herr_t ret_value = H5Pset_fill_time(id, fill_time);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setFillTime",
+    herr_t ret_value = H5Pset_fill_time(id, fill_time);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setFillTime",
                 "H5Pset_fill_time failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setFletcher32
-///\brief	Sets Fletcher32 checksum of EDC for this property list.
+// Function:    DSetCreatPropList::setFletcher32
+///\brief       Sets Fletcher32 checksum of EDC for this property list.
 ///
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetCreatPropList::setFletcher32() const
 {
-   herr_t ret_value = H5Pset_fletcher32(id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setFletcher32",
+    herr_t ret_value = H5Pset_fletcher32(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setFletcher32",
                 "H5Pset_fletcher32 failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::setExternal
-///\brief	Adds an external file to the list of external files
-///\param	name   - IN: Name of the external file
-///\param	offset - IN: Location where the data starts in the file
-///\param	size   - IN: Number of bytes reserved in the file for the data
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::setExternal
+///\brief       Adds an external file to the list of external files
+///\param       name   - IN: Name of the external file
+///\param       offset - IN: Location where the data starts in the file
+///\param       size   - IN: Number of bytes reserved in the file for the data
+///\exception   H5::PropListIException
 ///\par Description
-///		If a dataset is splitted across multiple files then the files
-///		should be defined in order. The total size of the dataset is
-///		the sum of the \a size arguments for all the external files.  If
-///		the total size is larger than the size of a dataset then the
-///		dataset can be extended (provided the data space also allows
-///		the extending).
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::setExternal( const char* name, off_t offset, hsize_t size ) const
+///             If a dataset is splitted across multiple files then the files
+///             should be defined in order. The total size of the dataset is
+///             the sum of the \a size arguments for all the external files.  If
+///             the total size is larger than the size of a dataset then the
+///             dataset can be extended (provided the data space also allows
+///             the extending).
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setExternal(const char* name, off_t offset, hsize_t size) const
 {
-   herr_t ret_value = H5Pset_external( id, name, offset, size );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::setExternal",
+    herr_t ret_value = H5Pset_external(id, name, offset, size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setExternal",
                 "H5Pset_external failed");
-   }
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getExternalCount
-///\brief	Returns the number of external files for a dataset
-///\return	Number of external files
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetCreatPropList::getExternalCount
+///\brief       Returns the number of external files for a dataset
+///\return      Number of external files
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 int DSetCreatPropList::getExternalCount() const
 {
-   int num_ext_files = H5Pget_external_count( id );
-   if( num_ext_files < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getExternalCount",
+    int num_ext_files = H5Pget_external_count(id);
+    if (num_ext_files < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getExternalCount",
                 "H5Pget_external_count returns negative number of external files");
-   }
-   else
-      return( num_ext_files );
+    }
+    else
+        return(num_ext_files);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList::getExternal
-///\brief	Returns information about an external file
-///\param	idx    - IN: Index of the external file, ranges [0-(N-1)] and
-///		                returned by getExternalCount()
-///\param	name_size - IN: Maximum length of \a name
-///\param	name   - OUT: Name of the external file
-///\param	offset - OUT: Location to return an offset value
-///\param	size   - OUT: Location to return the size of the external file data
-///\exception	H5::PropListIException
+// Function:    DSetCreatPropList::getExternal
+///\brief       Returns information about an external file
+///\param       idx    - IN: Index of the external file, ranges [0-(N-1)] and
+///                             returned by getExternalCount()
+///\param       name_size - IN: Maximum length of \a name
+///\param       name   - OUT: Name of the external file
+///\param       offset - OUT: Location to return an offset value
+///\param       size   - OUT: Location to return the size of the external file data
+///\exception   H5::PropListIException
 ///\par Description
-///		The parameter \a idx ranges [0..N-1] where N is returned by
-///		getExternalCount().  At most \a name_size characters are copied
-///		into the name array. If the external file name is longer than
-///		name_size with the null terminator, the return value is not
-///		null terminated (similar to strncpy()).
-///		If \a name_size is zero or \a name is a null pointer, the
-///		external file name will not be returned.  If \a offset or
-///		\a size are null pointers then the corresponding information
-///		will not be returned.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void DSetCreatPropList::getExternal( unsigned idx, size_t name_size, char* name, off_t& offset, hsize_t& size ) const
+///             The parameter \a idx ranges [0..N-1] where N is returned by
+///             getExternalCount().  At most \a name_size characters are copied
+///             into the name array. If the external file name is longer than
+///             name_size with the null terminator, the return value is not
+///             null terminated (similar to strncpy()).
+///             If \a name_size is zero or \a name is a null pointer, the
+///             external file name will not be returned.  If \a offset or
+///             \a size are null pointers then the corresponding information
+///             will not be returned.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void DSetCreatPropList::getExternal(unsigned idx, size_t name_size, char* name, off_t& offset, hsize_t& size) const
 {
-   herr_t ret_value = H5Pget_external( id, idx, name_size, name, &offset, &size );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetCreatPropList::getExternal",
+    herr_t ret_value = H5Pget_external(id, idx, name_size, name, &offset, &size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::getExternal",
                 "H5Pget_external failed");
-   }
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DSetCreatPropList::setVirtual
+///\brief       Maps elements of a virtual dataset to elements of the source
+///             dataset.
+///\param       vspace     - IN: Dataspace the virtual dataset, possibly an
+///                             unlimited selection
+///\param       src_fname  - IN: Name of the HDF5 file where the source dataset
+///                             is located (\a char*)
+///\param       src_dsname - IN: Path to the dataset in the file specified by
+///                             \a src_file_name (\a char*)
+///\param       sspace     - IN: Dataspace with a selection applied, possibly
+///                             an unlimited selection
+///\exception   H5::PropListIException
+///\par Description
+/// https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetVirtual
+// Programmer   Binh-Minh Ribler - Mar, 2017
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setVirtual(const DataSpace& vspace, const char *src_fname, const char *src_dsname, const DataSpace& sspace) const
+{
+    herr_t ret_value = H5Pset_virtual(id, vspace.getId(), src_fname, src_dsname, sspace.getId());
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetCreatPropList::setVirtual",
+            "H5Pset_virtual failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    DSetCreatPropList::setVirtual
+///\brief       Maps elements of a virtual dataset to elements of the source
+///             dataset.
+///\param       vspace     - IN: Dataspace the virtual dataset, possibly an
+///                             unlimited selection
+///\param       src_fname  - IN: Name of the HDF5 file where the source dataset
+///                             is located (\a H5std_string)
+///\param       src_dsname - IN: Path to the dataset in the file specified by
+///                             \a src_file_name (\a H5std_string)
+///\param       sspace     - IN: Dataspace with a selection applied, possibly
+///                             an unlimited selection
+///\exception   H5::PropListIException
+///\par Description
+/// https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetVirtual
+// Programmer   Binh-Minh Ribler - Mar, 2017
+//--------------------------------------------------------------------------
+void DSetCreatPropList::setVirtual(const DataSpace& vspace, const H5std_string src_fname, const H5std_string src_dsname, const DataSpace& sspace) const
+{
+    setVirtual(vspace, src_fname.c_str(), src_dsname.c_str(), sspace);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetCreatPropList destructor
-///\brief	Noop destructor.
+// Function:    DSetCreatPropList destructor
+///\brief       Noop destructor.
 // Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DSetCreatPropList::~DSetCreatPropList () {}
+DSetCreatPropList::~DSetCreatPropList() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5DcreatProp.h b/c++/src/H5DcreatProp.h
index 792956a..89318e8 100644
--- a/c++/src/H5DcreatProp.h
+++ b/c++/src/H5DcreatProp.h
@@ -6,126 +6,131 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-// Class DSetCreatPropList represents the HDF5 dataset creation property list
-// and inherits from PropList.
-
 #ifndef __H5DSCreatPropList_H
 #define __H5DSCreatPropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
+
+// Class forwarding
+class DataType;
+class DataSpace;
 
 /*! \class DSetCreatPropList
-    \brief Class DSetCreatPropList represents the dataset creation property
-    list.
+    \brief Class DSetCreatPropList inherits from ObjCreatPropList and provides
+    wrappers for the HDF5 dataset creation property functions.
 */
+//  Inheritance: ObjCreatPropList -> PropList -> IdComponent
 class H5_DLLCPP DSetCreatPropList : public ObjCreatPropList {
    public:
-	///\brief Default dataset creation property list.
-	static const DSetCreatPropList& DEFAULT;
+        ///\brief Default dataset creation property list.
+        static const DSetCreatPropList& DEFAULT;
+
+        // Creates a dataset creation property list.
+        DSetCreatPropList();
 
-	// Creates a dataset creation property list.
-	DSetCreatPropList();
+        // Queries whether all the filters set in this property list are
+        // available currently.
+        bool allFiltersAvail() const;
 
-	// Queries whether all the filters set in this property list are
-	// available currently.
-	bool allFiltersAvail();
+        // Get space allocation time for this property.
+        H5D_alloc_time_t getAllocTime() const;
 
-	// Get space allocation time for this property.
-	H5D_alloc_time_t getAllocTime();
+        // Set space allocation time for dataset during creation.
+        void setAllocTime(H5D_alloc_time_t alloc_time) const;
 
-	// Set space allocation time for dataset during creation.
-	void setAllocTime(H5D_alloc_time_t alloc_time);
+        // Retrieves the size of the chunks used to store a chunked layout dataset.
+        int getChunk(int max_ndims, hsize_t* dim) const;
 
-	// Retrieves the size of the chunks used to store a chunked layout dataset.
-	int getChunk( int max_ndims, hsize_t* dim ) const;
+        // Sets the size of the chunks used to store a chunked layout dataset.
+        void setChunk(int ndims, const hsize_t* dim) const;
 
-	// Sets the size of the chunks used to store a chunked layout dataset.
-	void setChunk( int ndims, const hsize_t* dim ) const;
+        // Returns information about an external file.
+        void getExternal(unsigned idx, size_t name_size, char* name, off_t& offset, hsize_t& size) const;
 
-	// Returns information about an external file.
-	void getExternal( unsigned idx, size_t name_size, char* name, off_t& offset, hsize_t& size ) const;
+        // Returns the number of external files for a dataset.
+        int getExternalCount() const;
 
-	// Returns the number of external files for a dataset.
-	int getExternalCount() const;
+        // Gets fill value writing time.
+        H5D_fill_time_t getFillTime() const;
 
-	// Gets fill value writing time.
-	H5D_fill_time_t getFillTime();
+        // Sets fill value writing time for dataset.
+        void setFillTime(H5D_fill_time_t fill_time) const;
 
-	// Sets fill value writing time for dataset.
-	void setFillTime(H5D_fill_time_t fill_time);
+        // Retrieves a dataset fill value.
+        void getFillValue(const DataType& fvalue_type, void* value) const;
 
-	// Retrieves a dataset fill value.
-	void getFillValue( const DataType& fvalue_type, void* value ) const;
+        // Sets a dataset fill value.
+        void setFillValue(const DataType& fvalue_type, const void* value) const;
 
-	// Sets a dataset fill value.
-	void setFillValue( const DataType& fvalue_type, const void* value ) const;
+        // Returns information about a filter in a pipeline.
+        H5Z_filter_t getFilter(int filter_number, unsigned int& flags, size_t& cd_nelmts, unsigned int* cd_values, size_t namelen, char name[], unsigned int &filter_config) const;
 
-	// Returns information about a filter in a pipeline.
-	H5Z_filter_t getFilter(int filter_number, unsigned int& flags, size_t& cd_nelmts, unsigned int* cd_values, size_t namelen, char name[], unsigned int &filter_config) const;
+        // Returns information about a filter in a pipeline given the filter id.
+        void getFilterById(H5Z_filter_t filter_id, unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values, size_t namelen, char name[], unsigned int &filter_config) const;
 
-	// Returns information about a filter in a pipeline given the filter id.
-	void getFilterById(H5Z_filter_t filter_id, unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values, size_t namelen, char name[], unsigned int &filter_config) const;
+        // Gets the layout of the raw data storage of the data that uses this
+        // property list.
+        H5D_layout_t getLayout() const;
 
-	// Gets the layout of the raw data storage of the data that uses this
-	// property list.
-	H5D_layout_t getLayout() const;
+        // Sets the type of storage used to store the raw data for the
+        // dataset that uses this property list.
+        void setLayout(H5D_layout_t layout) const;
 
-	// Sets the type of storage used to store the raw data for the
-	// dataset that uses this property list.
-	void setLayout(H5D_layout_t layout) const;
+        // Returns the number of filters in the pipeline.
+        int getNfilters() const;
 
-	// Returns the number of filters in the pipeline.
-	int getNfilters() const;
+        // Checks if fill value has been defined for this property.
+        H5D_fill_value_t isFillValueDefined() const;
 
-	// Checks if fill value has been defined for this property.
-	H5D_fill_value_t isFillValueDefined();
+        // Modifies the specified filter.
+        void modifyFilter(H5Z_filter_t filter_id, unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[]) const;
 
-	// Modifies the specified filter.
-	void modifyFilter( H5Z_filter_t filter_id, unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[] ) const;
+        // Remove one or all filters from the filter pipeline.
+        void removeFilter(H5Z_filter_t filter_id) const;
 
-	// Remove one or all filters from the filter pipeline.
-	void removeFilter( H5Z_filter_t filter_id) const;
+        // Sets compression method and compression level.
+        void setDeflate(int level) const;
 
-	// Sets compression method and compression level.
-	void setDeflate( int level ) const;
+        // Adds an external file to the list of external files.
+        void setExternal(const char* name, off_t offset, hsize_t size) const;
 
-	// Adds an external file to the list of external files.
-	void setExternal( const char* name, off_t offset, hsize_t size ) const;
+        // Adds a filter to the filter pipeline.
+        void setFilter(H5Z_filter_t filter, unsigned int flags = 0, size_t cd_nelmts = 0, const unsigned int cd_values[] = NULL) const;
 
-	// Adds a filter to the filter pipeline.
-	void setFilter( H5Z_filter_t filter, unsigned int flags = 0, size_t cd_nelmts = 0, const unsigned int cd_values[] = NULL) const;
+        // Sets Fletcher32 checksum of EDC for this property list.
+        void setFletcher32() const;
 
-	// Sets Fletcher32 checksum of EDC for this property list.
-	void setFletcher32() const;
+        // Sets method of the shuffle filter.
+        void setShuffle() const;
 
-	// Sets method of the shuffle filter.
-	void setShuffle() const;
+        // Sets SZIP compression method.
+        void setSzip(unsigned int options_mask, unsigned int pixels_per_block) const;
 
-	// Sets SZIP compression method.
-	void setSzip(unsigned int options_mask, unsigned int pixels_per_block) const;
+        // Sets N-bit compression method.
+        void setNbit() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("DSetCreatPropList"); }
+        // Maps elements of a virtual dataset to elements of the source dataset.
+        void setVirtual(const DataSpace& vspace, const char *src_fname, const char *src_dsname, const DataSpace& sspace) const;
+        void setVirtual(const DataSpace& vspace, const H5std_string src_fname, const H5std_string src_dsname, const DataSpace& sspace) const;
 
-	// Copy constructor: creates a copy of a DSetCreatPropList object.
-	DSetCreatPropList(const DSetCreatPropList& orig);
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("DSetCreatPropList"); }
 
-	// Creates a copy of an existing dataset creation property list
-	// using the property list id.
-	DSetCreatPropList(const hid_t plist_id);
+        // Copy constructor: creates a copy of a DSetCreatPropList object.
+        DSetCreatPropList(const DSetCreatPropList& orig);
 
-	// Noop destructor.
-	virtual ~DSetCreatPropList();
+        // Creates a copy of an existing dataset creation property list
+        // using the property list id.
+        DSetCreatPropList(const hid_t plist_id);
+
+        // Noop destructor.
+        virtual ~DSetCreatPropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
@@ -133,14 +138,14 @@ class H5_DLLCPP DSetCreatPropList : public ObjCreatPropList {
         static void deleteConstants();
 
     private:
-	static DSetCreatPropList* DEFAULT_;
+        static DSetCreatPropList* DEFAULT_;
 
         // Creates the global constant, should only be used by the library
         static DSetCreatPropList* getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+
+}; // end of DSetCreatPropList
+} // namespace H5
+
 #endif // __H5DSCreatPropList_H
diff --git a/c++/src/H5DxferProp.cpp b/c++/src/H5DxferProp.cpp
index 49bbfe6..4c767cb 100644
--- a/c++/src/H5DxferProp.cpp
+++ b/c++/src/H5DxferProp.cpp
@@ -5,26 +5,22 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
 #include "H5DxferProp.h"
-#include "H5private.h"		// for HDmemset
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -38,7 +34,7 @@ DSetMemXferPropList* DSetMemXferPropList::DEFAULT_ = 0;
 // Function:    DSetMemXferPropList::getConstant
 //              Creates a DSetMemXferPropList object representing the HDF5
 //              constant H5P_DATASET_XFER, pointed to by
-//		DSetMemXferPropList::DEFAULT_
+//              DSetMemXferPropList::DEFAULT_
 // exception    H5::PropListIException
 // Description
 //              If DSetMemXferPropList::DEFAULT_ already points to an allocated
@@ -78,25 +74,25 @@ void DSetMemXferPropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose	Constant for default dataset memory and transfer property list.
+// Purpose      Constant for default dataset memory and transfer property list.
 //--------------------------------------------------------------------------
 const DSetMemXferPropList& DSetMemXferPropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function	DSetMemXferPropList default constructor
-///\brief	Default constructor: creates a stub dataset memory and
-///		transfer property list object.
-// Programmer:	Binh-Minh Ribler - 2000
+// Function     DSetMemXferPropList default constructor
+///\brief       Default constructor: creates a stub dataset memory and
+///             transfer property list object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetMemXferPropList::DSetMemXferPropList() : PropList(H5P_DATASET_XFER) {}
 
 //--------------------------------------------------------------------------
-// Function	DSetMemXferPropList constructor
-///\brief	Creates a dataset transfer property list with transform
-///		expression.
-// Programmer:	Binh-Minh Ribler - 2000
+// Function     DSetMemXferPropList constructor
+///\brief       Creates a dataset transfer property list with transform
+///             expression.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetMemXferPropList::DSetMemXferPropList(const char* exp) : PropList(H5P_DATASET_XFER)
 {
@@ -104,165 +100,164 @@ DSetMemXferPropList::DSetMemXferPropList(const char* exp) : PropList(H5P_DATASET
 }
 
 //--------------------------------------------------------------------------
-// Function	DSetMemXferPropList copy constructor
-///\brief	Copy constructor: makes a copy of the original
-///		DSetMemXferPropList object
-///\param	original - IN: Original dataset memory and transfer property
-///				list object to copy
-// Programmer:	Binh-Minh Ribler - 2000
+// Function     DSetMemXferPropList copy constructor
+///\brief       Copy constructor: makes a copy of the original
+///             DSetMemXferPropList object
+///\param       original - IN: Original dataset memory and transfer property
+///                            list object to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-DSetMemXferPropList::DSetMemXferPropList(const DSetMemXferPropList& original ) : PropList( original ) {}
+DSetMemXferPropList::DSetMemXferPropList(const DSetMemXferPropList& original) : PropList(original ) {}
 
 //--------------------------------------------------------------------------
-// Function	DSetMemXferPropList overloaded constructor
-///\brief	Creates a DSetMemXferPropList object using the id of an
-///		existing DSetMemXferPropList.
-///\param	plist_id - IN: Id of an existing dataset memory and transfer
-///				property list
-// Programmer:	Binh-Minh Ribler - 2000
+// Function     DSetMemXferPropList overloaded constructor
+///\brief       Creates a DSetMemXferPropList object using the id of an
+///             existing DSetMemXferPropList.
+///\param       plist_id - IN: Id of an existing dataset memory and transfer
+///                            property list
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetMemXferPropList::DSetMemXferPropList(const hid_t plist_id) : PropList(plist_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setBuffer
-///\brief	Sets type conversion and background buffers.
-///\param	size  - IN: Size, in bytes, of the type conversion and background buffers
-///\param	tconv - IN: Pointer to application-allocated type conversion buffer
-///\param	bkg   - IN: Pointer to application-allocated background buffer
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::setBuffer
+///\brief       Sets type conversion and background buffers.
+///\param       size  - IN: Size, in bytes, of the type conversion and background buffers
+///\param       tconv - IN: Pointer to application-allocated type conversion buffer
+///\param       bkg   - IN: Pointer to application-allocated background buffer
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setBuffer( size_t size, void* tconv, void* bkg ) const
+void DSetMemXferPropList::setBuffer(size_t size, void* tconv, void* bkg) const
 {
-   herr_t ret_value = H5Pset_buffer( id, size, tconv, bkg );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setBuffer",
-		"H5Pset_buffer failed");
-   }
+    herr_t ret_value = H5Pset_buffer(id, size, tconv, bkg);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setBuffer",
+            "H5Pset_buffer failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getBuffer
-///\brief	Reads buffer settings.
-///\param	tconv - IN: Pointer to application-allocated type conversion buffer
-///\param	bkg   - IN: Pointer to application-allocated background buffer
-///\return	Buffer size, in bytes
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::getBuffer
+///\brief       Reads buffer settings.
+///\param       tconv - OUT: Pointer to application-allocated type conversion buf
+///\param       bkg   - OUT: Pointer to application-allocated background buffer
+///\return      Buffer size, in bytes
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-
-size_t DSetMemXferPropList::getBuffer( void** tconv, void** bkg ) const
+size_t DSetMemXferPropList::getBuffer(void** tconv, void** bkg) const
 {
-   size_t buffer_size = H5Pget_buffer( id, tconv, bkg );
-   if( buffer_size == 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::getBuffer",
-		"H5Pget_buffer returned 0 for buffer size - failure");
-   }
-   return( buffer_size );
+    size_t buffer_size = H5Pget_buffer(id, tconv, bkg);
+    if(buffer_size == 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getBuffer",
+            "H5Pget_buffer returned 0 for buffer size - failure");
+    }
+    return(buffer_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setPreserve
-///\brief	Sets the dataset transfer property list status to true or false.
-///\param	status - IN: Status to set, true or false
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::setPreserve
+///\brief       Sets the dataset transfer property list status to true or false.
+///\param       status - IN: Status to set, true or false
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setPreserve( bool status ) const
+void DSetMemXferPropList::setPreserve(bool status) const
 {
-   herr_t ret_value = H5Pset_preserve( id, (hbool_t) status );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setPreserve",
-		"H5Pset_preserve failed");
-   }
+    herr_t ret_value = H5Pset_preserve(id, (hbool_t) status);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setPreserve",
+            "H5Pset_preserve failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getPreserve
-///\brief	Checks status of the dataset transfer property list.
-///\return	Status of the dataset transfer property list
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::getPreserve
+///\brief       Checks status of the dataset transfer property list.
+///\return      Status of the dataset transfer property list
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 bool DSetMemXferPropList::getPreserve() const
 {
-   int ret_value = H5Pget_preserve( id );
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else
-   {
-      throw PropListIException("DSetMemXferPropList::getPreserve",
-		"H5Pget_preserve returned negative value for status");
-   }
+    int ret_value = H5Pget_preserve(id);
+    if(ret_value > 0)
+        return true;
+    else if(ret_value == 0)
+        return false;
+    else
+    {
+        throw PropListIException("DSetMemXferPropList::getPreserve",
+            "H5Pget_preserve returned negative value for status");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setBtreeRatios
-///\brief	Sets B-tree split ratios for a dataset transfer property list.
-///\param	left   - IN: B-tree split ratio for left-most nodes
-///\param	middle - IN: B-tree split ratio for right-most nodes and lone nodes
-///\param	right  - IN: B-tree split ratio for all other nodes
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::setBtreeRatios
+///\brief       Sets B-tree split ratios for a dataset transfer property list.
+///\param       left   - IN: B-tree split ratio for left-most nodes
+///\param       middle - IN: B-tree split ratio for right-most nodes and lone nodes
+///\param       right  - IN: B-tree split ratio for all other nodes
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setBtreeRatios( double left, double middle, double right ) const
+void DSetMemXferPropList::setBtreeRatios(double left, double middle, double right) const
 {
-   herr_t ret_value = H5Pset_btree_ratios( id, left, middle, right );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setBtreeRatios",
-		"H5Pset_btree_ratios failed");
-   }
+    herr_t ret_value = H5Pset_btree_ratios(id, left, middle, right);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setBtreeRatios",
+            "H5Pset_btree_ratios failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getBtreeRatios
-///\brief	Gets B-tree split ratios for a dataset transfer property list.
-///\param	left   - OUT: B-tree split ratio for left-most nodes
-///\param	middle - OUT: B-tree split ratio for right-most nodes and lone nodes
-///\param	right  - OUT: B-tree split ratio for all other nodes
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::getBtreeRatios
+///\brief       Gets B-tree split ratios for a dataset transfer property list.
+///\param       left   - OUT: B-tree split ratio for left-most nodes
+///\param       middle - OUT: B-tree split ratio for right-most nodes and lone nodes
+///\param       right  - OUT: B-tree split ratio for all other nodes
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::getBtreeRatios( double& left, double& middle, double& right ) const
+void DSetMemXferPropList::getBtreeRatios(double& left, double& middle, double& right) const
 {
-   herr_t ret_value = H5Pget_btree_ratios( id, &left, &middle, &right );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::getBtreeRatios",
-		"H5Pget_btree_ratios failed");
-   }
+    herr_t ret_value = H5Pget_btree_ratios(id, &left, &middle, &right);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getBtreeRatios",
+            "H5Pget_btree_ratios failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setDataTransform
-///\brief	Sets data transform expression.
-///\param	expression - IN: null-terminated data transform expression (char*)
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - Mar, 2014
+// Function:    DSetMemXferPropList::setDataTransform
+///\brief       Sets data transform expression.
+///\param       expression - IN: null-terminated data transform expression (char*)
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 void DSetMemXferPropList::setDataTransform(const char* expression) const
 {
-   herr_t ret_value = H5Pset_data_transform( id, expression);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setDataTransform",
-		"H5Pset_data_transform failed");
-   }
+    herr_t ret_value = H5Pset_data_transform(id, expression);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setDataTransform",
+            "H5Pset_data_transform failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setDataTransform
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes a reference to a \c H5std_string for the expression.
-///\param	expression - IN: H5std_string data transform expression
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - Mar, 2014
+// Function:    DSetMemXferPropList::setDataTransform
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes a reference to a \c H5std_string for the expression.
+///\param       expression - IN: H5std_string data transform expression
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 void DSetMemXferPropList::setDataTransform(const H5std_string& expression) const
 {
@@ -270,13 +265,13 @@ void DSetMemXferPropList::setDataTransform(const H5std_string& expression) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getDataTransform
-///\brief	Sets data transform expression.
-///\param	exp - OUT: buffer for data transform expression (char*)
-///\param	buf_size   - IN: size of buffer for expression, including the
-///				 null terminator
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - Mar, 2014
+// Function:    DSetMemXferPropList::getDataTransform
+///\brief       Sets data transform expression.
+///\param       exp - OUT: buffer for data transform expression (char*)
+///\param       buf_size   - IN: size of buffer for expression, including the
+///                              null terminator
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 ssize_t DSetMemXferPropList::getDataTransform(char* exp, size_t buf_size) const
 {
@@ -288,8 +283,8 @@ ssize_t DSetMemXferPropList::getDataTransform(char* exp, size_t buf_size) const
     // H5Pget_data_transform returns a negative value, raise an exception
     if (exp_len < 0)
     {
-	throw PropListIException("DSetMemXferPropList::getDataTransform",
-		"H5Pget_data_transform failed");
+        throw PropListIException("DSetMemXferPropList::getDataTransform",
+            "H5Pget_data_transform failed");
     }
 
     // H5Pget_data_transform will put a null terminator at the end of the
@@ -301,11 +296,11 @@ ssize_t DSetMemXferPropList::getDataTransform(char* exp, size_t buf_size) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getDataTransform
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes no parameter and returns a \c H5std_string for the expression.
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - Mar, 2014
+// Function:    DSetMemXferPropList::getDataTransform
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes no parameter and returns a \c H5std_string for the expression.
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 H5std_string DSetMemXferPropList::getDataTransform() const
 {
@@ -343,230 +338,228 @@ H5std_string DSetMemXferPropList::getDataTransform() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getTypeConvCB
-///\brief	Sets an exception handling callback for datatype conversion
-///		for a dataset transfer property list.
-///\param	op        - IN: User's function
-///\param	user_data - IN: User's data
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Function:    DSetMemXferPropList::getTypeConvCB
+///\brief       Sets an exception handling callback for datatype conversion
+///             for a dataset transfer property list.
+///\param       op        - IN: User's function
+///\param       user_data - IN: User's data
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setTypeConvCB( H5T_conv_except_func_t op, void *user_data) const
+void DSetMemXferPropList::setTypeConvCB(H5T_conv_except_func_t op, void *user_data) const
 {
-   herr_t ret_value = H5Pset_type_conv_cb( id, op, user_data);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setTypeConvCB",
-		"H5Pset_type_conv_cb failed");
-   }
+    herr_t ret_value = H5Pset_type_conv_cb(id, op, user_data);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setTypeConvCB",
+            "H5Pset_type_conv_cb failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getTypeConvCB
-///\brief	Gets the exception handling callback function and data.
-///\param	op        - IN: Retrieved user function
-///\param	user_data - IN: Retrieved user data
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Function:    DSetMemXferPropList::getTypeConvCB
+///\brief       Gets the exception handling callback function and data.
+///\param       op        - IN: Retrieved user function
+///\param       user_data - IN: Retrieved user data
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::getTypeConvCB( H5T_conv_except_func_t *op, void **user_data) const
+void DSetMemXferPropList::getTypeConvCB(H5T_conv_except_func_t *op, void **user_data) const
 {
-   herr_t ret_value = H5Pget_type_conv_cb( id, op, user_data);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::getTypeConvCB",
-		"H5Pget_type_conv_cb failed");
-   }
+    herr_t ret_value = H5Pget_type_conv_cb(id, op, user_data);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getTypeConvCB",
+            "H5Pget_type_conv_cb failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setVlenMemManager
-///\brief	Sets the memory manager for variable-length datatype allocation.
-///\param	alloc_func - IN: User's allocate routine
-///\param	alloc_info - IN: User's allocation parameters
-///\param	free_func  - IN: User's free routine
-///\param	free_info  - IN: User's free parameters
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::setVlenMemManager
+///\brief       Sets the memory manager for variable-length datatype allocation.
+///\param       alloc_func - IN: User's allocate routine
+///\param       alloc_info - IN: User's allocation parameters
+///\param       free_func  - IN: User's free routine
+///\param       free_info  - IN: User's free parameters
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setVlenMemManager( H5MM_allocate_t alloc_func, void* alloc_info, H5MM_free_t free_func, void* free_info ) const
+void DSetMemXferPropList::setVlenMemManager(H5MM_allocate_t alloc_func, void* alloc_info, H5MM_free_t free_func, void* free_info) const
 {
-   herr_t ret_value = H5Pset_vlen_mem_manager( id, alloc_func, alloc_info,
-						free_func, free_info );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::setVlenMemManager",
-		"H5Pset_vlen_mem_manager failed");
-   }
+    herr_t ret_value = H5Pset_vlen_mem_manager(id, alloc_func, alloc_info,
+                                                free_func, free_info);
+    if(ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setVlenMemManager",
+            "H5Pset_vlen_mem_manager failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setVlenMemManager
-///\brief	Sets the memory manager for variable-length datatype
-///		allocation - system \c malloc and \c free will be used.
+// Function:    DSetMemXferPropList::setVlenMemManager
+///\brief       Sets the memory manager for variable-length datatype
+///             allocation - system \c malloc and \c free will be used.
 ///
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void DSetMemXferPropList::setVlenMemManager() const
 {
-   setVlenMemManager( NULL, NULL, NULL, NULL );
+   setVlenMemManager(NULL, NULL, NULL, NULL);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getVlenMemManager
-///\brief	Gets the memory manager for variable-length datatype allocation
-///\param	alloc_func - OUT: User's allocate routine
-///\param	alloc_info - OUT: User's allocation parameters
-///\param	free_func  - OUT: User's free routine
-///\param	free_info  - OUT: User's free parameters
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList::getVlenMemManager
+///\brief       Gets the memory manager for variable-length datatype allocation
+///\param       alloc_func - OUT: User's allocate routine
+///\param       alloc_info - OUT: User's allocation parameters
+///\param       free_func  - OUT: User's free routine
+///\param       free_info  - OUT: User's free parameters
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::getVlenMemManager( H5MM_allocate_t& alloc_func, void** alloc_info, H5MM_free_t& free_func, void** free_info ) const
+void DSetMemXferPropList::getVlenMemManager(H5MM_allocate_t& alloc_func, void** alloc_info, H5MM_free_t& free_func, void** free_info) const
 {
-   herr_t ret_value = H5Pget_vlen_mem_manager( id, &alloc_func, alloc_info, &free_func, free_info );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("DSetMemXferPropList::getVlenMemManager",
-		"H5Pget_vlen_mem_manager failed");
-   }
+    herr_t ret_value = H5Pget_vlen_mem_manager(id, &alloc_func, alloc_info, &free_func, free_info);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getVlenMemManager",
+            "H5Pget_vlen_mem_manager failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setSmallDataBlockSize
-///\brief	Sets the size of a contiguous block reserved for small data.
-///\param	size - IN: Maximum size, in bytes, of the small data block.
-///\exception	H5::PropListIException
+// Function:    DSetMemXferPropList::setSmallDataBlockSize
+///\brief       Sets the size of a contiguous block reserved for small data.
+///\param       size - IN: Maximum size, in bytes, of the small data block.
+///\exception   H5::PropListIException
 ///\par Description
-///		For detail, please refer to the C layer Reference Manual at:
+///             For detail, please refer to the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSmallData
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setSmallDataBlockSize(hsize_t size)
+void DSetMemXferPropList::setSmallDataBlockSize(hsize_t size) const
 {
-   herr_t ret_value = H5Pset_small_data_block_size(id, size);
-   if (ret_value < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::setSmallDataBlockSize",
-		"H5Pset_small_data_block_size failed");
-   }
+    herr_t ret_value = H5Pset_small_data_block_size(id, size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setSmallDataBlockSize",
+            "H5Pset_small_data_block_size failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getSmallDataBlockSize
-///\brief	Returns the current small data block size setting.
-///\return	Size of the small data block, in bytes
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Function:    DSetMemXferPropList::getSmallDataBlockSize
+///\brief       Returns the current small data block size setting.
+///\return      Size of the small data block, in bytes
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-hsize_t DSetMemXferPropList::getSmallDataBlockSize()
+hsize_t DSetMemXferPropList::getSmallDataBlockSize() const
 {
-   hsize_t size;
-   herr_t ret_value = H5Pget_small_data_block_size(id, &size);
-   if (ret_value < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::getSmallDataBlockSize",
-		"H5Pget_small_data_block_size failed");
-   }
-   return(size);
+    hsize_t size;
+    herr_t ret_value = H5Pget_small_data_block_size(id, &size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getSmallDataBlockSize",
+            "H5Pget_small_data_block_size failed");
+    }
+    return(size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setHyperVectorSize
-///\brief	Sets number of I/O vectors to be read/written in hyperslab I/O.
+// Function:    DSetMemXferPropList::setHyperVectorSize
+///\brief       Sets number of I/O vectors to be read/written in hyperslab I/O.
 ///
-///\exception	H5::PropListIException
+///\exception   H5::PropListIException
 ///\par Description
-///		For information, please refer to the C layer Reference
-///		Manual at:
+///             For information, please refer to the C layer Reference
+///             Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetHyperVectorSize
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setHyperVectorSize(size_t vector_size)
+void DSetMemXferPropList::setHyperVectorSize(size_t vector_size) const
 {
-   herr_t ret_value = H5Pset_hyper_vector_size(id, vector_size);
-   if (ret_value < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::setHyperVectorSize",
-		"H5Pset_hyper_vector_size failed");
-   }
+    herr_t ret_value = H5Pset_hyper_vector_size(id, vector_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setHyperVectorSize",
+            "H5Pset_hyper_vector_size failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getHyperVectorSize
-///\brief	Returns the number of I/O vectors to be read/written in
-///		hyperslab I/O.
-///\return	Number of I/O vectors
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Function:    DSetMemXferPropList::getHyperVectorSize
+///\brief       Returns the number of I/O vectors to be read/written in
+///             hyperslab I/O.
+///\return      Number of I/O vectors
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-size_t DSetMemXferPropList::getHyperVectorSize()
+size_t DSetMemXferPropList::getHyperVectorSize() const
 {
-   size_t vector_size;
-   herr_t ret_value = H5Pget_hyper_vector_size(id, &vector_size);
-   if (ret_value < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::getHyperVectorSize",
-		"H5Pget_hyper_vector_size failed");
-   }
-   return(vector_size);
+    size_t vector_size;
+    herr_t ret_value = H5Pget_hyper_vector_size(id, &vector_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getHyperVectorSize",
+            "H5Pget_hyper_vector_size failed");
+    }
+    return(vector_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::setEDCCheck
-///\brief	Enables or disables error-detecting for a dataset reading
-///		process.
-///\param	check - IN: Specifies whether error detection is enabled or
-///				disabled
-///\exception	H5::PropListIException
+// Function:    DSetMemXferPropList::setEDCCheck
+///\brief       Enables or disables error-detecting for a dataset reading
+///             process.
+///\param       check - IN: Specifies whether error detection is enabled or
+///                         disabled
+///\exception   H5::PropListIException
 ///\par Description
-///		The error detection algorithm used is the algorithm previously
-///		specified in the corresponding dataset creation property
-///		list.  This function does not affect the use of error
-///		detection in the writing process.
+///             The error detection algorithm used is the algorithm previously
+///             specified in the corresponding dataset creation property
+///             list.  This function does not affect the use of error
+///             detection in the writing process.
 ///\par
-///		Valid values are as follows:
-///		\li \c H5Z_ENABLE_EDC   (default)
-///		\li \c H5Z_DISABLE_EDC
-// Programmer:	Binh-Minh Ribler - April, 2004
+///             Valid values are as follows:
+///             \li \c H5Z_ENABLE_EDC   (default)
+///             \li \c H5Z_DISABLE_EDC
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void DSetMemXferPropList::setEDCCheck(H5Z_EDC_t check)
+void DSetMemXferPropList::setEDCCheck(H5Z_EDC_t check) const
 {
-   herr_t ret_value = H5Pset_edc_check(id, check);
-   if (ret_value < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::setEDCCheck",
-		"H5Pset_edc_check failed");
-   }
+    herr_t ret_value = H5Pset_edc_check(id, check);
+    if (ret_value < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::setEDCCheck",
+            "H5Pset_edc_check failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList::getEDCCheck
-///\brief	Determines whether error-detection is enabled for dataset reads.
-///\return	\c H5Z_ENABLE_EDC or \c H5Z_DISABLE_EDC
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - April, 2004
+// Function:    DSetMemXferPropList::getEDCCheck
+///\brief       Determines whether error-detection is enabled for dataset reads.
+///\return      \c H5Z_ENABLE_EDC or \c H5Z_DISABLE_EDC
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-H5Z_EDC_t DSetMemXferPropList::getEDCCheck()
+H5Z_EDC_t DSetMemXferPropList::getEDCCheck() const
 {
-   H5Z_EDC_t check = H5Pget_edc_check(id);
-   if (check < 0)
-   {
-      throw PropListIException("DSetMemXferPropList::getEDCCheck",
-		"H5Pget_edc_check failed");
-   }
-   return(check);
+    H5Z_EDC_t check = H5Pget_edc_check(id);
+    if (check < 0)
+    {
+        throw PropListIException("DSetMemXferPropList::getEDCCheck",
+            "H5Pget_edc_check failed");
+    }
+    return(check);
 }
 
 //--------------------------------------------------------------------------
-// Function:	DSetMemXferPropList destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    DSetMemXferPropList destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 DSetMemXferPropList::~DSetMemXferPropList() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
 
diff --git a/c++/src/H5DxferProp.h b/c++/src/H5DxferProp.h
index 52a9a48..75205cf 100644
--- a/c++/src/H5DxferProp.h
+++ b/c++/src/H5DxferProp.h
@@ -6,117 +6,111 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-// Class DSetMemXferPropList represents the HDF5 dataset transfer property list
-// and inherits from PropList.
-
 #ifndef __H5DSetMemXferPropList_H
 #define __H5DSetMemXferPropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class DSetMemXferPropList
-    \brief Class DSetMemXferPropList represents the dataset memory and
-    transfer property list.
+    \brief Class DSetCreatPropList inherits from PropList and provides
+    wrappers for the HDF5 dataset memory and transfer property list.
 */
+//  Inheritance: PropList -> IdComponent
 class H5_DLLCPP DSetMemXferPropList : public PropList {
    public:
-	///\brief Default dataset memory and transfer property list.
-	static const DSetMemXferPropList& DEFAULT;
+        ///\brief Default dataset memory and transfer property list.
+        static const DSetMemXferPropList& DEFAULT;
 
-	// Creates a dataset memory and transfer property list.
-	DSetMemXferPropList();
+        // Creates a dataset memory and transfer property list.
+        DSetMemXferPropList();
 
-	// Creates a dataset transform property list.
-	DSetMemXferPropList(const char* expression);
+        // Creates a dataset transform property list.
+        DSetMemXferPropList(const char* expression);
 
-	// Sets type conversion and background buffers.
-	void setBuffer( size_t size, void* tconv, void* bkg ) const;
+        // Sets type conversion and background buffers.
+        void setBuffer(size_t size, void* tconv, void* bkg) const;
 
-	// Reads buffer settings.
-	size_t getBuffer( void** tconv, void** bkg ) const;
+        // Reads buffer settings.
+        size_t getBuffer(void** tconv, void** bkg) const;
 
-	// Sets B-tree split ratios for a dataset transfer property list.
-	void setBtreeRatios( double left, double middle, double right ) const;
+        // Sets B-tree split ratios for a dataset transfer property list.
+        void setBtreeRatios(double left, double middle, double right) const;
 
-	// Gets B-tree split ratios for a dataset transfer property list.
-	void getBtreeRatios( double& left, double& middle, double& right ) const;
+        // Gets B-tree split ratios for a dataset transfer property list.
+        void getBtreeRatios(double& left, double& middle, double& right) const;
 
-	// Sets data transform expression.
-	void setDataTransform(const char* expression) const;
-	void setDataTransform(const H5std_string& expression) const;
+        // Sets data transform expression.
+        void setDataTransform(const char* expression) const;
+        void setDataTransform(const H5std_string& expression) const;
 
-	// Gets data transform expression.
-	ssize_t getDataTransform(char* exp, size_t buf_size=0) const;
-	H5std_string getDataTransform() const;
+        // Gets data transform expression.
+        ssize_t getDataTransform(char* exp, size_t buf_size=0) const;
+        H5std_string getDataTransform() const;
 
-	// Sets the dataset transfer property list status to TRUE or FALSE.
-	void setPreserve( bool status ) const;
+        // Sets the dataset transfer property list status to TRUE or FALSE.
+        void setPreserve(bool status) const;
 
-	// Checks status of the dataset transfer property list.
-	bool getPreserve() const;
+        // Checks status of the dataset transfer property list.
+        bool getPreserve() const;
 
-	// Sets an exception handling callback for datatype conversion.
-	void setTypeConvCB( H5T_conv_except_func_t op, void *user_data) const;
+        // Sets an exception handling callback for datatype conversion.
+        void setTypeConvCB(H5T_conv_except_func_t op, void *user_data) const;
 
-	// Gets the exception handling callback for datatype conversion.
-	void getTypeConvCB( H5T_conv_except_func_t *op, void **user_data) const;
+        // Gets the exception handling callback for datatype conversion.
+        void getTypeConvCB(H5T_conv_except_func_t *op, void **user_data) const;
 
-	// Sets the memory manager for variable-length datatype
-	// allocation in H5Dread and H5Dvlen_reclaim.
-	void setVlenMemManager( H5MM_allocate_t alloc, void* alloc_info,
-				H5MM_free_t free, void* free_info ) const;
+        // Sets the memory manager for variable-length datatype
+        // allocation in H5Dread and H5Dvlen_reclaim.
+        void setVlenMemManager(H5MM_allocate_t alloc, void* alloc_info,
+                               H5MM_free_t free, void* free_info) const;
 
-	// alloc and free are set to NULL, indicating that system
-	// malloc and free are to be used.
-	void setVlenMemManager() const;
+        // alloc and free are set to NULL, indicating that system
+        // malloc and free are to be used.
+        void setVlenMemManager() const;
 
-	// Gets the memory manager for variable-length datatype
-	// allocation in H5Dread and H5Tvlen_reclaim.
-	void getVlenMemManager( H5MM_allocate_t& alloc, void** alloc_info,
-				H5MM_free_t& free, void** free_info ) const;
+        // Gets the memory manager for variable-length datatype
+        // allocation in H5Dread and H5Tvlen_reclaim.
+        void getVlenMemManager(H5MM_allocate_t& alloc, void** alloc_info,
+                               H5MM_free_t& free, void** free_info) const;
 
-	// Sets the size of a contiguous block reserved for small data.
-	void setSmallDataBlockSize(hsize_t size);
+        // Sets the size of a contiguous block reserved for small data.
+        void setSmallDataBlockSize(hsize_t size) const;
 
-	// Returns the current small data block size setting.
-	hsize_t getSmallDataBlockSize();
+        // Returns the current small data block size setting.
+        hsize_t getSmallDataBlockSize() const;
 
-	// Sets number of I/O vectors to be read/written in hyperslab I/O.
-	void setHyperVectorSize(size_t vector_size);
+        // Sets number of I/O vectors to be read/written in hyperslab I/O.
+        void setHyperVectorSize(size_t vector_size) const;
 
-	// Returns the number of I/O vectors to be read/written in
-	// hyperslab I/O.
-	size_t getHyperVectorSize();
+        // Returns the number of I/O vectors to be read/written in
+        // hyperslab I/O.
+        size_t getHyperVectorSize() const;
 
-	// Enables or disables error-detecting for a dataset reading
-	// process.
-	void setEDCCheck(H5Z_EDC_t check);
+        // Enables or disables error-detecting for a dataset reading
+        // process.
+        void setEDCCheck(H5Z_EDC_t check) const;
 
-	// Determines whether error-detection is enabled for dataset reads.
-	H5Z_EDC_t getEDCCheck();
+        // Determines whether error-detection is enabled for dataset reads.
+        H5Z_EDC_t getEDCCheck() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("DSetMemXferPropList"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("DSetMemXferPropList"); }
 
-	// Copy constructor: makes a copy of a DSetMemXferPropList object.
-	DSetMemXferPropList(const DSetMemXferPropList& orig);
+        // Copy constructor: makes a copy of a DSetMemXferPropList object.
+        DSetMemXferPropList(const DSetMemXferPropList& orig);
 
-	// Creates a copy of an existing dataset memory and transfer
-	// property list using the property list id.
-	DSetMemXferPropList(const hid_t plist_id);
+        // Creates a copy of an existing dataset memory and transfer
+        // property list using the property list id.
+        DSetMemXferPropList(const hid_t plist_id);
 
-	// Noop destructor
-	virtual ~DSetMemXferPropList();
+        // Noop destructor
+        virtual ~DSetMemXferPropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
@@ -124,14 +118,14 @@ class H5_DLLCPP DSetMemXferPropList : public PropList {
         static void deleteConstants();
 
     private:
-	static DSetMemXferPropList* DEFAULT_;
+        static DSetMemXferPropList* DEFAULT_;
 
         // Creates the global constant, should only be used by the library
         static DSetMemXferPropList* getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+
+}; // end of DSetMemXferPropList
+} // namespace H5
+
 #endif // __H5DSetMemXferPropList_H
diff --git a/c++/src/H5EnumType.cpp b/c++/src/H5EnumType.cpp
index b096a36..a96239c 100644
--- a/c++/src/H5EnumType.cpp
+++ b/c++/src/H5EnumType.cpp
@@ -5,227 +5,262 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5AbstractDs.h"
-#include "H5DxferProp.h"
-#include "H5DataSpace.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5DataSpace.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
+#include "H5AbstractDs.h"
 #include "H5DataType.h"
 #include "H5DataSet.h"
 #include "H5AtomType.h"
 #include "H5IntType.h"
 #include "H5EnumType.h"
-#include "H5private.h"			// for HDmemset
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	EnumType default constructor
-///\brief	Default constructor: Creates a stub datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType default constructor
+///\brief       Default constructor: Creates a stub datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 EnumType::EnumType() : DataType() {}
 
 //--------------------------------------------------------------------------
-// Function:	EnumType overloaded constructor
-///\brief	Creates an EnumType object using the id of an existing datatype.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType overloaded constructor
+///\brief       Creates an EnumType object using the id of an existing datatype.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType::EnumType( const hid_t existing_id ) : DataType( existing_id ) {}
+EnumType::EnumType(const hid_t existing_id) : DataType( existing_id ) {}
 
 //--------------------------------------------------------------------------
-// Function:	EnumType copy constructor
-///\brief	Copy constructor: makes a copy of the original EnumType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType copy constructor
+///\brief       Copy constructor: makes a copy of the original EnumType object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType::EnumType( const EnumType& original ) : DataType( original ) {}
+EnumType::EnumType(const EnumType& original) : DataType( original ) {}
 
 //--------------------------------------------------------------------------
-// Function:	EnumType overloaded constructor
-///\brief	Creates an empty enumeration datatype given a size, in bytes.
-///\param	size - IN: Number of bytes in the datatype to create
-///\exception	H5::DataTypeIException
+// Function:    EnumType overloaded constructor
+///\brief       Creates an empty enumeration datatype given a size, in bytes.
+///\param       size - IN: Number of bytes in the datatype to create
+///\exception   H5::DataTypeIException
 // Description
-// 		The DataType constructor calls the C API H5Tcreate to create
-// 		the enum datatype.
-// Programmer	Binh-Minh Ribler - 2000
+//              The DataType constructor calls the C API H5Tcreate to create
+//              the enum datatype.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+EnumType::EnumType(size_t size) : DataType( H5T_ENUM, size ) {}
+
 //--------------------------------------------------------------------------
-EnumType::EnumType( size_t size ) : DataType( H5T_ENUM, size ) {}
+// Function:    EnumType overloaded constructor
+///\brief       Gets the enum datatype of the specified dataset.
+///\param       dataset - IN: Dataset that this enum datatype associates with
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+EnumType::EnumType(const DataSet& dataset) : DataType()
+{
+    // Calls C function H5Dget_type to get the id of the datatype
+    id = H5Dget_type(dataset.getId());
+
+    // If the datatype id is not valid, throw an exception
+    if (id < 0)
+    {
+        throw DataSetIException("EnumType constructor", "H5Dget_type failed");
+    }
+}
 
 //--------------------------------------------------------------------------
-// Function:	EnumType overloaded constructor
-///\brief	Gets the enum datatype of the specified dataset.
-///\param	dataset - IN: Dataset that this enum datatype associates with
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType overloaded constructor
+///\brief       Creates a new enum datatype based on an integer datatype.
+///\param       data_type - IN: Base datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-EnumType::EnumType( const DataSet& dataset ) : DataType()
+EnumType::EnumType(const IntType& data_type) : DataType()
 {
-   // Calls C function H5Dget_type to get the id of the datatype
-   id = H5Dget_type( dataset.getId() );
+    // Calls C function H5Tenum_create to get the id of the datatype
+    id = H5Tenum_create(data_type.getId());
 
-   // If the datatype id is not valid, throw an exception
-   if( id < 0 )
-   {
-      throw DataSetIException("EnumType constructor", "H5Dget_type failed");
-   }
+    // If the datatype id is not valid, throw an exception
+    if (id < 0)
+    {
+        throw DataSetIException("EnumType constructor", "H5Tenum_create failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType overloaded constructor
-///\brief	Creates a new enum datatype based on an integer datatype.
-///\param	data_type - IN: Base datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType overloaded constructor
+///\brief       Creates an EnumType instance by opening an HDF5 enum datatype
+///             given its name, provided as a C character string.
+///\param       dtype_name - IN: Enum datatype name
+///\param       loc        - IN: Location of the type
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openEnumType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
 //--------------------------------------------------------------------------
-EnumType::EnumType( const IntType& data_type ) : DataType()
+EnumType::EnumType(const H5Location& loc, const char *dtype_name) : DataType()
 {
-   // Calls C function H5Tenum_create to get the id of the datatype
-   id = H5Tenum_create( data_type.getId() );
+    id = p_opentype(loc, dtype_name);
+}
 
-   // If the datatype id is not valid, throw an exception
-   if( id < 0 )
-   {
-      throw DataSetIException("EnumType constructor", "H5Tenum_create failed");
-   }
+//--------------------------------------------------------------------------
+// Function:    EnumType overloaded constructor
+///\brief       Creates an EnumType instance by opening an HDF5 enum datatype
+///             given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Enum datatype name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openEnumType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+EnumType::EnumType(const H5Location& loc, const H5std_string& dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::insert
-///\brief	Inserts a new member to this enumeration datatype.
-///\param	name  - IN: Name of the new member
-///\param	value - IN: Pointer to the value of the new member
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::insert
+///\brief       Inserts a new member to this enumeration datatype.
+///\param       name  - IN: Name of the new member
+///\param       value - IN: Pointer to the value of the new member
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void EnumType::insert( const char* name, void *value ) const
+void EnumType::insert(const char* name, void *value) const
 {
-   // Calls C routine H5Tenum_insert to insert the new enum datatype member.
-   herr_t ret_value = H5Tenum_insert( id, name, value );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("EnumType::insert", "H5Tenum_insert failed");
-   }
+    // Calls C routine H5Tenum_insert to insert the new enum datatype member.
+    herr_t ret_value = H5Tenum_insert(id, name, value);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("EnumType::insert", "H5Tenum_insert failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::insert
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::insert
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void EnumType::insert( const H5std_string& name, void *value ) const
+void EnumType::insert(const H5std_string& name, void *value) const
 {
-    insert( name.c_str(), value );
+    insert(name.c_str(), value);
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::nameOf
-///\brief	Returns the symbol name corresponding to a specified member
-///		of this enumeration datatype.
-///\param	value - IN: Pointer to the value of the enum datatype
-///\param	size  - IN: Size for the name
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::nameOf
+///\brief       Returns the symbol name corresponding to a specified member
+///             of this enumeration datatype.
+///\param       value - IN: Pointer to the value of the enum datatype
+///\param       size  - IN: Size for the name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5std_string EnumType::nameOf( void *value, size_t size ) const
+H5std_string EnumType::nameOf(void *value, size_t size) const
 {
-   char* name_C = new char[size+1];  // temporary C-string for C API
-   HDmemset(name_C, 0, size+1); // clear buffer
+    char* name_C = new char[size+1];  // temporary C-string for C API
+    HDmemset(name_C, 0, size+1); // clear buffer
 
-   // Calls C routine H5Tenum_nameof to get the name of the specified enum type
-   herr_t ret_value = H5Tenum_nameof( id, value, name_C, size );
+    // Calls C routine H5Tenum_nameof to get the name of the specified enum type
+    herr_t ret_value = H5Tenum_nameof(id, value, name_C, size);
 
-   // If H5Tenum_nameof returns a negative value, raise an exception,
-   if( ret_value < 0 )
-   {
+    // If H5Tenum_nameof returns a negative value, raise an exception,
+    if (ret_value < 0)
+    {
       delete []name_C;
-      throw DataTypeIException("EnumType::nameOf", "H5Tenum_nameof failed");
-   }
-   // otherwise, create the string to hold the datatype name and return it
-   H5std_string name(name_C);
-   delete []name_C;
-   return( name );
+        throw DataTypeIException("EnumType::nameOf", "H5Tenum_nameof failed");
+    }
+    // otherwise, create the string to hold the datatype name and return it
+    H5std_string name(name_C);
+    delete []name_C;
+    return(name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::valueOf
-///\brief	Retrieves the value corresponding to a member of this
-///		enumeration datatype, given the member's name.
-///\param	name  -  IN: Name of the queried member
-///\param	value - OUT: Pointer to the retrieved value
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::valueOf
+///\brief       Retrieves the value corresponding to a member of this
+///             enumeration datatype, given the member's name.
+///\param       name  -  IN: Name of the queried member
+///\param       value - OUT: Pointer to the retrieved value
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void EnumType::valueOf( const char* name, void *value ) const
+void EnumType::valueOf(const char* name, void *value) const
 {
-   // Calls C routine H5Tenum_valueof to get the enum datatype value
-   herr_t ret_value = H5Tenum_valueof( id, name, value );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("EnumType::valueOf", "H5Tenum_valueof failed");
-   }
+    // Calls C routine H5Tenum_valueof to get the enum datatype value
+    herr_t ret_value = H5Tenum_valueof(id, name, value);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("EnumType::valueOf", "H5Tenum_valueof failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::valueOf
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of
-///		argument \a name.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::valueOf
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of
+///             argument \a name.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void EnumType::valueOf( const H5std_string& name, void *value ) const
+void EnumType::valueOf(const H5std_string& name, void *value) const
 {
-    valueOf( name.c_str(), value );
+    valueOf(name.c_str(), value);
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::getMemberIndex
-///\brief	Returns the index of a member in this enumeration datatype.
-///\param	name - IN: Name of the queried member
-///\return	Index of the member if it exists.  Index will have the value
-///		between 0 and \c N-1, where \c N is the value returned by the
-///		member function \c EnumType::getNmembers.
-///\exception	H5::DataTypeIException
+// Function:    EnumType::getMemberIndex
+///\brief       Returns the index of a member in this enumeration datatype.
+///\param       name - IN: Name of the queried member
+///\return      Index of the member if it exists.  Index will have the value
+///             between 0 and \c N-1, where \c N is the value returned by the
+///             member function \c EnumType::getNmembers.
+///\exception   H5::DataTypeIException
 // Programmer   Binh-Minh Ribler - May 16, 2002
 //--------------------------------------------------------------------------
 int EnumType::getMemberIndex(const char *name) const
 {
-   int member_index = H5Tget_member_index(id, name);
-   if( member_index < 0 )
-   {
-      throw DataTypeIException("EnumType::getMemberIndex",
+    int member_index = H5Tget_member_index(id, name);
+    if (member_index < 0)
+    {
+        throw DataTypeIException("EnumType::getMemberIndex",
                 "H5Tget_member_index returns negative value");
-   }
-   return( member_index );
+    }
+    return(member_index);
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::getMemberIndex
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in the type of
-///		argument \a name.
+// Function:    EnumType::getMemberIndex
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in the type of
+///             argument \a name.
 // Programmer   Binh-Minh Ribler - May 16, 2002
 //--------------------------------------------------------------------------
 int EnumType::getMemberIndex(const H5std_string& name) const
@@ -234,49 +269,47 @@ int EnumType::getMemberIndex(const H5std_string& name) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::getNmembers
-///\brief	Returns the number of members in this enumeration datatype.
-///\return	Number of members
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    EnumType::getNmembers
+///\brief       Returns the number of members in this enumeration datatype.
+///\return      Number of members
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 int EnumType::getNmembers() const
 {
-   int num_members = H5Tget_nmembers( id );
-   if( num_members < 0 )
-   {
-      throw DataTypeIException("EnumType::getNmembers",
+    int num_members = H5Tget_nmembers(id);
+    if (num_members < 0)
+    {
+        throw DataTypeIException("EnumType::getNmembers",
                 "H5Tget_nmembers returns negative number of members");
-   }
-   return( num_members );
+    }
+    return(num_members);
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType::getMemberValue
-///\brief	Retrieves the value of a member in this enumeration datatype,
-///		given the member's index.
-///\param	memb_no - IN: Index of the queried member
-///\param	value   - OUT: Pointer to the retrieved value
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType::getMemberValue
+///\brief       Retrieves the value of a member in this enumeration datatype,
+///             given the member's index.
+///\param       memb_no - IN: Index of the queried member
+///\param       value   - OUT: Pointer to the retrieved value
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void EnumType::getMemberValue( unsigned memb_no, void *value ) const
+void EnumType::getMemberValue(unsigned memb_no, void *value) const
 {
-   // Call C routine H5Tget_member_value to get the datatype member's value
-   hid_t ret_value = H5Tget_member_value( id, memb_no, value );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("EnumType::getMemberValue", "H5Tget_member_value failed");
-   }
+    // Call C routine H5Tget_member_value to get the datatype member's value
+    hid_t ret_value = H5Tget_member_value(id, memb_no, value);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("EnumType::getMemberValue", "H5Tget_member_value failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	EnumType destructor
-///\brief	Properly terminates access to this enum datatype.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    EnumType destructor
+///\brief       Properly terminates access to this enum datatype.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 EnumType::~EnumType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5EnumType.h b/c++/src/H5EnumType.h
index fe36e8b..8b98c93 100644
--- a/c++/src/H5EnumType.h
+++ b/c++/src/H5EnumType.h
@@ -6,73 +6,76 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5EnumType_H
 #define __H5EnumType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class EnumType operates on HDF5 enum datatypes.
+/*! \class EnumType
+    \brief EnumType is derived from a DataType and operates on HDF5
+    enum datatypes.
+*/
+//  Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP EnumType : public DataType {
-
    public:
-	// Creates an empty enumeration datatype based on a native signed
-	// integer type, whose size is given by size.
-	EnumType( size_t size );
+        // Creates an empty enumeration datatype based on a native signed
+        // integer type, whose size is given by size.
+        EnumType(size_t size);
+
+        // Gets the enum datatype of the specified dataset
+        EnumType(const DataSet& dataset);  // H5Dget_type
+
+        // Creates a new enum datatype based on an integer datatype
+        EnumType(const IntType& data_type);  // H5Tenum_create
+
+        // Constructors that open an enum datatype, given a location.
+        EnumType(const H5Location& loc, const char* name);
+        EnumType(const H5Location& loc, const H5std_string& name);
 
-	// Gets the enum datatype of the specified dataset
-	EnumType( const DataSet& dataset );  // H5Dget_type
+        // Returns the number of members in this enumeration datatype.
+        int getNmembers () const;
 
-	// Creates a new enum datatype based on an integer datatype
-	EnumType( const IntType& data_type );  // H5Tenum_create
+        // Returns the index of a member in this enumeration data type.
+        int getMemberIndex(const char* name) const;
+        int getMemberIndex(const H5std_string& name) const;
 
-	// Returns the number of members in this enumeration datatype.
-	int getNmembers () const;
+        // Returns the value of an enumeration datatype member
+        void getMemberValue(unsigned memb_no, void *value) const;
 
-	// Returns the index of a member in this enumeration data type.
-	int getMemberIndex(const char* name) const;
-	int getMemberIndex(const H5std_string& name) const;
+        // Inserts a new member to this enumeration type.
+        void insert(const char* name, void *value) const;
+        void insert(const H5std_string& name, void *value) const;
 
-	// Returns the value of an enumeration datatype member
-	void getMemberValue( unsigned memb_no, void *value ) const;
+        // Returns the symbol name corresponding to a specified member
+        // of this enumeration datatype.
+        H5std_string nameOf(void *value, size_t size) const;
 
-	// Inserts a new member to this enumeration type.
-	void insert( const char* name, void *value ) const;
-	void insert( const H5std_string& name, void *value ) const;
+        // Returns the value corresponding to a specified member of this
+        // enumeration datatype.
+        void valueOf(const char* name, void *value) const;
+        void valueOf(const H5std_string& name, void *value) const;
 
-	// Returns the symbol name corresponding to a specified member
-	// of this enumeration datatype.
-	H5std_string nameOf( void *value, size_t size ) const;
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("EnumType"); }
 
-	// Returns the value corresponding to a specified member of this
-	// enumeration datatype.
-	void valueOf( const char* name, void *value ) const;
-	void valueOf( const H5std_string& name, void *value ) const;
+        // Default constructor
+        EnumType();
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("EnumType"); }
+        // Creates an enumeration datatype using an existing id
+        EnumType(const hid_t existing_id);
 
-	// Default constructor
-	EnumType();
+        // Copy constructor: makes a copy of the original EnumType object.
+        EnumType(const EnumType& original);
 
-	// Creates an enumeration datatype using an existing id
-	EnumType( const hid_t existing_id );
+        virtual ~EnumType();
 
-	// Copy constructor: makes a copy of the original EnumType object.
-	EnumType( const EnumType& original );
+}; // end of EnumType
+} // namespace H5
 
-	virtual ~EnumType();
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5EnumType_H
diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp
index 270b232..c9a1323 100644
--- a/c++/src/H5Exception.cpp
+++ b/c++/src/H5Exception.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -18,214 +16,212 @@
 #include "H5Include.h"
 #include "H5Exception.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 const char Exception::DEFAULT_MSG[] = "No detailed information provided";
 
 //--------------------------------------------------------------------------
-// Function:	Exception default constructor
-///\brief	Default constructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception default constructor
+///\brief       Default constructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Exception::Exception() : detail_message(""), func_name("") {}
 
 //--------------------------------------------------------------------------
-// Function:	Exception overloaded constructor
-///\brief	Creates an exception with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception overloaded constructor
+///\brief       Creates an exception with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Exception::Exception(const H5std_string& func, const H5std_string& message) : detail_message(message), func_name(func) {}
 
 //--------------------------------------------------------------------------
-// Function:	Exception copy constructor
-///\brief	Copy constructor: makes a copy of the original Exception object.
-///\param	orig - IN: Exception instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception copy constructor
+///\brief       Copy constructor: makes a copy of the original Exception object.
+///\param       orig - IN: Exception instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-Exception::Exception( const Exception& orig ) : detail_message(orig.detail_message), func_name(orig.func_name) {}
+Exception::Exception(const Exception& orig) : detail_message(orig.detail_message), func_name(orig.func_name) {}
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getMajorString
-///\brief	Returns a text string that describes the error
-///		specified by a major error number.
-///\param	err_major - IN: Major error number
-///\return	Major error string
+// Function:    Exception::getMajorString
+///\brief       Returns a text string that describes the error
+///             specified by a major error number.
+///\param       err_major - IN: Major error number
+///\return      Major error string
 ///\par Description
-///		In the failure case, the string "Invalid major error number"
-///		will be returned.
-// Programmer	Binh-Minh Ribler - 2000
+///             In the failure case, the string "Invalid major error number"
+///             will be returned.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5std_string Exception::getMajorString( hid_t err_major ) const
+H5std_string Exception::getMajorString(hid_t err_major) const
 {
-   // Preliminary call to H5Eget_msg() to get the length of the message
-   ssize_t mesg_size = H5Eget_msg(err_major, NULL, NULL, 0);
-
-   // If H5Eget_msg() returns a negative value, raise an exception,
-   if( mesg_size < 0 )
-      throw IdComponentException("Exception::getMajorString",
-				"H5Eget_msg failed");
-
-   // Call H5Eget_msg again to get the actual message
-   char* mesg_C = new char[mesg_size+1];  // temporary C-string for C API
-   mesg_size = H5Eget_msg(err_major, NULL, mesg_C, mesg_size+1);
-
-   // Check for failure again
-   if( mesg_size < 0 )
-   {
-      delete []mesg_C;
-      throw IdComponentException("Exception::getMajorString",
-				"H5Eget_msg failed");
-   }
-
-   // Convert the C error description and return
-   H5std_string major_str(mesg_C);
-   delete []mesg_C;
-   return( major_str );
+    // Preliminary call to H5Eget_msg() to get the length of the message
+    ssize_t mesg_size = H5Eget_msg(err_major, NULL, NULL, 0);
+ 
+    // If H5Eget_msg() returns a negative value, raise an exception,
+    if (mesg_size < 0)
+        throw IdComponentException("Exception::getMajorString",
+            "H5Eget_msg failed");
+
+    // Call H5Eget_msg again to get the actual message
+    char* mesg_C = new char[mesg_size+1];  // temporary C-string for C API
+    mesg_size = H5Eget_msg(err_major, NULL, mesg_C, mesg_size+1);
+
+    // Check for failure again
+    if (mesg_size < 0)
+    {
+        delete []mesg_C;
+        throw IdComponentException("Exception::getMajorString",
+            "H5Eget_msg failed");
+    }
+
+    // Convert the C error description and return
+    H5std_string major_str(mesg_C);
+    delete []mesg_C;
+    return(major_str);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getMinorString
-///\brief	Returns a text string that describes the error
-///		specified by a minor error number.
-///\param	err_minor - IN: Minor error number
-///\return	Minor error string
+// Function:    Exception::getMinorString
+///\brief       Returns a text string that describes the error
+///             specified by a minor error number.
+///\param       err_minor - IN: Minor error number
+///\return      Minor error string
 ///\par Description
-///		In the failure case, the string "Invalid minor error number"
-///		will be returned.
-// Programmer	Binh-Minh Ribler - 2000
+///             In the failure case, the string "Invalid minor error number"
+///             will be returned.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5std_string Exception::getMinorString( hid_t err_minor ) const
+H5std_string Exception::getMinorString(hid_t err_minor) const
 {
-   // Preliminary call to H5Eget_msg() to get the length of the message
-   ssize_t mesg_size = H5Eget_msg(err_minor, NULL, NULL, 0);
-
-   // If H5Eget_msg() returns a negative value, raise an exception,
-   if( mesg_size < 0 )
-      throw IdComponentException("Exception::getMinorString",
-				"H5Eget_msg failed");
-
-   // Call H5Eget_msg again to get the actual message
-   char* mesg_C = new char[mesg_size+1];  // temporary C-string for C API
-   mesg_size = H5Eget_msg(err_minor, NULL, mesg_C, mesg_size+1);
-
-   // Check for failure again
-   if( mesg_size < 0 )
-   {
-      delete []mesg_C;
-      throw IdComponentException("Exception::getMinorString",
-				"H5Eget_msg failed");
-   }
-
-   // Convert the C error description and return
-   H5std_string minor_str(mesg_C);
-   delete []mesg_C;
-   return( minor_str );
+    // Preliminary call to H5Eget_msg() to get the length of the message
+    ssize_t mesg_size = H5Eget_msg(err_minor, NULL, NULL, 0);
+
+    // If H5Eget_msg() returns a negative value, raise an exception,
+    if (mesg_size < 0)
+        throw IdComponentException("Exception::getMinorString",
+            "H5Eget_msg failed");
+
+    // Call H5Eget_msg again to get the actual message
+    char* mesg_C = new char[mesg_size+1];  // temporary C-string for C API
+    mesg_size = H5Eget_msg(err_minor, NULL, mesg_C, mesg_size+1);
+
+    // Check for failure again
+    if (mesg_size < 0)
+    {
+        delete []mesg_C;
+        throw IdComponentException("Exception::getMinorString",
+            "H5Eget_msg failed");
+    }
+
+    // Convert the C error description and return
+    H5std_string minor_str(mesg_C);
+    delete []mesg_C;
+    return(minor_str);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::setAutoPrint
-///\brief	Turns on the automatic error printing.
-///\param	func        - IN: Function to be called upon an error condition
-///\param	client_data - IN: Data passed to the error function
+// Function:    Exception::setAutoPrint
+///\brief       Turns on the automatic error printing.
+///\param       func        - IN: Function to be called upon an error condition
+///\param       client_data - IN: Data passed to the error function
 ///\par Description
-///		When the library is first initialized the auto printing
-///		function, \a func, is set to the C API \c H5Eprint and
-///		\a client_data is the standard error stream pointer, \c stderr.
-///		Automatic stack traversal is always in the \c H5E_WALK_DOWNWARD
-///		direction.
+///             When the library is first initialized the auto printing
+///             function, \a func, is set to the C API \c H5Eprint and
+///             \a client_data is the standard error stream pointer, \c stderr.
+///             Automatic stack traversal is always in the \c H5E_WALK_DOWNWARD
+///             direction.
 ///\par
-///		Users are encouraged to write their own more specific error
-///		handlers
-// Programmer	Binh-Minh Ribler - 2000
+///             Users are encouraged to write their own more specific error
+///             handlers
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void Exception::setAutoPrint( H5E_auto2_t& func, void* client_data )
+void Exception::setAutoPrint(H5E_auto2_t& func, void* client_data)
 {
-   // calls the C API routine H5Eset_auto to set the auto printing to
-   // the specified function.
-   herr_t ret_value = H5Eset_auto2( H5E_DEFAULT, func, client_data );
-   if( ret_value < 0 )
-      throw Exception( "Exception::setAutoPrint", "H5Eset_auto failed" );
+    // calls the C API routine H5Eset_auto to set the auto printing to
+    // the specified function.
+    herr_t ret_value = H5Eset_auto2(H5E_DEFAULT, func, client_data);
+    if (ret_value < 0)
+        throw Exception("Exception::setAutoPrint", "H5Eset_auto failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::dontPrint
-///\brief	Turns off the automatic error printing from the C library.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::dontPrint
+///\brief       Turns off the automatic error printing from the C library.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Exception::dontPrint()
 {
-   // calls the C API routine H5Eset_auto with NULL parameters to turn
-   // off the automatic error printing.
-   herr_t ret_value = H5Eset_auto2( H5E_DEFAULT, NULL, NULL );
-   if( ret_value < 0 )
-      throw Exception( "Exception::dontPrint", "H5Eset_auto failed" );
+    // calls the C API routine H5Eset_auto with NULL parameters to turn
+    // off the automatic error printing.
+    herr_t ret_value = H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+    if (ret_value < 0)
+        throw Exception("Exception::dontPrint", "H5Eset_auto failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getAutoPrint
-///\brief	Retrieves the current settings for the automatic error
-///		stack traversal function and its data.
-///\param	func        - OUT: Current setting for the function to be
-///					called upon an error condition
-///\param	client_data - OUT: Current setting for the data passed to
-///					the error function
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::getAutoPrint
+///\brief       Retrieves the current settings for the automatic error
+///             stack traversal function and its data.
+///\param       func        - OUT: Current setting for the function to be
+///                                called upon an error condition
+///\param       client_data - OUT: Current setting for the data passed to
+///                                the error function
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void Exception::getAutoPrint( H5E_auto2_t& func, void** client_data )
+void Exception::getAutoPrint(H5E_auto2_t& func, void** client_data)
 {
-   // calls the C API routine H5Eget_auto to get the current setting of
-   // the automatic error printing
-   herr_t ret_value = H5Eget_auto2( H5E_DEFAULT, &func, client_data );
-   if( ret_value < 0 )
-      throw Exception( "Exception::getAutoPrint", "H5Eget_auto failed" );
+    // calls the C API routine H5Eget_auto to get the current setting of
+    // the automatic error printing
+    herr_t ret_value = H5Eget_auto2(H5E_DEFAULT, &func, client_data);
+    if (ret_value < 0)
+        throw Exception("Exception::getAutoPrint", "H5Eget_auto failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::clearErrorStack
-///\brief	Clears the error stack for the current thread.
+// Function:    Exception::clearErrorStack
+///\brief       Clears the error stack for the current thread.
 ///\par Description
-///		The stack is also cleared whenever a C API function is
-///		called, with certain exceptions (for instance, \c H5Eprint).
-// Programmer	Binh-Minh Ribler - 2000
+///             The stack is also cleared whenever a C API function is
+///             called, with certain exceptions (for instance, \c H5Eprint).
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Exception::clearErrorStack()
 {
-   // calls the C API routine H5Eclear to clear the error stack
-   herr_t ret_value = H5Eclear2(H5E_DEFAULT);
-   if( ret_value < 0 )
-      throw Exception( "Exception::clearErrorStack", "H5Eclear failed" );
+    // calls the C API routine H5Eclear to clear the error stack
+    herr_t ret_value = H5Eclear2(H5E_DEFAULT);
+    if (ret_value < 0)
+        throw Exception("Exception::clearErrorStack", "H5Eclear failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::walkErrorStack
-///\brief	Walks the error stack for the current thread, calling the
-///		specified function.
-///\param	direction - IN: Direction in which the error stack is to be walked
-///\param	func - IN: Function to be called for each error encountered
-///\param	client_data - IN: Data passed to the error function
+// Function:    Exception::walkErrorStack
+///\brief       Walks the error stack for the current thread, calling the
+///             specified function.
+///\param       direction - IN: Direction in which the error stack is to be walked
+///\param       func - IN: Function to be called for each error encountered
+///\param       client_data - IN: Data passed to the error function
 ///\par Description
-///		Valid values for \a direction include:
-///		\li \c H5E_WALK_UPWARD - begin with the most specific error
-///		        and end at the API
-///		\li \c H5E_WALK_DOWNWARD - begin at the API and end at the
-///		        inner-most function where the error was first detected
+///             Valid values for \a direction include:
+///             \li \c H5E_WALK_UPWARD - begin with the most specific error
+///                     and end at the API
+///             \li \c H5E_WALK_DOWNWARD - begin at the API and end at the
+///                     inner-most function where the error was first detected
 ///\par
-///		The function specified by \a func will be called for each
-///		error in the error stack.  The \c H5E_walk_t prototype is as
-///		follows:
+///             The function specified by \a func will be called for each
+///             error in the error stack.  The \c H5E_walk_t prototype is as
+///             follows:
 ///\code
 /// typedef herr_t (*H5E_walk_t)(int n, H5E_error_t *err_desc, void *client_data)
 ///     int n - Indexed position of the error in the stack; it begins at zero
-///		regardless of stack traversal direction
+///             regardless of stack traversal direction
 ///     H5E_error_t *err_desc - Pointer to a data structure describing the
-///		error.  This structure is listed below.
+///             error.  This structure is listed below.
 ///     void *client_data - Pointer to client data in the format expected by
-///		the user-defined function.
+///             the user-defined function.
 ///\endcode
 ///\par
 ///     Data structure to describe the error:
@@ -240,86 +236,87 @@ void Exception::clearErrorStack()
 ///     const char  *desc;          //optional supplied description
 /// } H5E_error2_t;
 ///\endcode
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void Exception::walkErrorStack( H5E_direction_t direction, H5E_walk2_t func, void* client_data )
+void Exception::walkErrorStack(H5E_direction_t direction, H5E_walk2_t func, void* client_data)
 {
-   // calls the C API routine H5Ewalk to walk the error stack
-   herr_t ret_value = H5Ewalk2( H5E_DEFAULT, direction, func, client_data );
-   if( ret_value < 0 )
-      throw Exception( "Exception::walkErrorStack", "H5Ewalk failed" );
+    // calls the C API routine H5Ewalk to walk the error stack
+    herr_t ret_value = H5Ewalk2(H5E_DEFAULT, direction, func, client_data);
+    if (ret_value < 0)
+        throw Exception("Exception::walkErrorStack", "H5Ewalk failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getDetailMsg
-///\brief	Returns the detailed message set at the time the exception
-///		is thrown.
-///\return	Text message - \c H5std_string
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::getDetailMsg
+///\brief       Returns the detailed message set at the time the exception
+///             is thrown.
+///\return      Text message - \c H5std_string
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5std_string Exception::getDetailMsg() const
 {
-   return(detail_message);
+    return(detail_message);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getCDetailMsg
-///\brief	Returns the detailed message set at the time the exception
-///		is thrown.
-///\return	Text message - \c char pointer
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::getCDetailMsg
+///\brief       Returns the detailed message set at the time the exception
+///             is thrown.
+///\return      Text message - \c char pointer
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 const char* Exception::getCDetailMsg() const
 {
-   return(detail_message.c_str());
+    return(detail_message.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getFuncName
-///\brief	Returns the name of the function, where the exception is thrown.
-///\return	Text message - \c H5std_string
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::getFuncName
+///\brief       Returns the name of the function, where the exception is thrown.
+///\return      Text message - \c H5std_string
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5std_string Exception::getFuncName() const
 {
-   return(func_name);
+    return(func_name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::getCFuncName
-///\brief	Returns the name of the function, where the exception is thrown.
-///\return	Text message - \c char pointer
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::getCFuncName
+///\brief       Returns the name of the function, where the exception is thrown.
+///\return      Text message - \c char pointer
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 const char* Exception::getCFuncName() const
 {
-   return(func_name.c_str());
+    return(func_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::printErrorStack (static)
-///\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 - 2000
+// Function:    Exception::printErrorStack (static)
+///\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 - 2000
 //--------------------------------------------------------------------------
 void Exception::printErrorStack(FILE* stream, hid_t err_stack)
 {
     herr_t ret_value = H5Eprint2(err_stack, stream);
-    if( ret_value < 0 )
-	throw Exception( "Printing error stack", "H5Eprint2 failed" );
+    if (ret_value < 0)
+        throw Exception("Printing error stack", "H5Eprint2 failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception::printError
-///\brief	Prints the error stack in a default manner.  This member
-///		function is replaced by the static function printErrorStack
-///		and will be removed from the next major release.
-///\param	stream - IN: File pointer
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception::printError
+// Purpose:     Prints the error stack in a default manner.  This member
+//              function is replaced by the static function printErrorStack
+//              and will be removed from the next major release.
+// Parameter    stream - IN: File pointer
+// Programmer   Binh-Minh Ribler - 2000
 // Description:
-//		This function can be removed in next major release.
-//		-BMR, 2014/04/24
+//              This function can be removed in next major release.
+//              -BMR, 2014/04/24
+//              Removed from documentation. -BMR, 2016/03/23
 //--------------------------------------------------------------------------
 void Exception::printError(FILE* stream) const
 {
@@ -327,264 +324,286 @@ void Exception::printError(FILE* stream) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Exception destructor
-///\brief	Noop destructor
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Exception destructor
+///\brief       Noop destructor
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Exception::~Exception() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	FileIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    FileIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	FileIException default constructor
-///\brief	Default constructor.
+// Function:    FileIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 FileIException::FileIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	FileIException overloaded constructor
-///\brief	Creates a FileIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    FileIException overloaded constructor
+///\brief       Creates a FileIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 FileIException::FileIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	FileIException destructor
-///\brief	Noop destructor.
+// Function:    FileIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 FileIException::~FileIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	GroupIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	GroupIException default constructor
-///\brief	Default constructor.
+// Function:    GroupIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 GroupIException::GroupIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	GroupIException overloaded constructor
-///\brief	Creates a GroupIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    GroupIException overloaded constructor
+///\brief       Creates a GroupIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 GroupIException::GroupIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	GroupIException destructor
-///\brief	Noop destructor.
+// Function:    GroupIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 GroupIException::~GroupIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	DataSpaceIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    DataSpaceIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	DataSpaceIException default constructor
-///\brief	Default constructor.
+// Function:    DataSpaceIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 DataSpaceIException::DataSpaceIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	DataSpaceIException overloaded constructor
-///\brief	Creates a DataSpaceIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    DataSpaceIException overloaded constructor
+///\brief       Creates a DataSpaceIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 DataSpaceIException::DataSpaceIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	DataSpaceIException destructor
-///\brief	Noop destructor.
+// Function:    DataSpaceIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 DataSpaceIException::~DataSpaceIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	DataTypeIException default constructor
-///\brief	Default constructor.
+// Function:    DataTypeIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 DataTypeIException::DataTypeIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	DataTypeIException overloaded constructor
-///\brief	Creates a DataTypeIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    DataTypeIException overloaded constructor
+///\brief       Creates a DataTypeIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 DataTypeIException::DataTypeIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	DataTypeIException destructor
-///\brief	Noop destructor.
+// Function:    DataTypeIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 DataTypeIException::~DataTypeIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    ObjHeaderIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	PropListIException default constructor
-///\brief	Default constructor.
+// Function:    ObjHeaderIException default constructor
+///\brief       Default constructor.
+//--------------------------------------------------------------------------
+ObjHeaderIException::ObjHeaderIException():Exception(){}
+//--------------------------------------------------------------------------
+// Function:    ObjHeaderIException overloaded constructor
+///\brief       Creates an ObjHeaderIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
+//--------------------------------------------------------------------------
+ObjHeaderIException::ObjHeaderIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
+//--------------------------------------------------------------------------
+// Function:    ObjHeaderIException destructor
+///\brief       Noop destructor.
+//--------------------------------------------------------------------------
+ObjHeaderIException::~ObjHeaderIException() throw() {}
+
+//--------------------------------------------------------------------------
+// Subclass:    PropListIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+//--------------------------------------------------------------------------
+// Function:    PropListIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 PropListIException::PropListIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	PropListIException overloaded constructor
-///\brief	Creates a PropListIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    PropListIException overloaded constructor
+///\brief       Creates a PropListIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 PropListIException::PropListIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	PropListIException destructor
-///\brief	Noop destructor.
+// Function:    PropListIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 PropListIException::~PropListIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	DataSetIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    DataSetIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	DataSetIException default constructor
-///\brief	Default constructor.
+// Function:    DataSetIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 DataSetIException::DataSetIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	DataSetIException overloaded constructor
-///\brief	Creates a DataSetIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    DataSetIException overloaded constructor
+///\brief       Creates a DataSetIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 DataSetIException::DataSetIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	DataSetIException destructor
-///\brief	Noop destructor.
+// Function:    DataSetIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 DataSetIException::~DataSetIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	AttributeIException default constructor
-///\brief	Default constructor.
+// Function:    AttributeIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 AttributeIException::AttributeIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	AttributeIException overloaded constructor
-///\brief	Creates an AttributeIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    AttributeIException overloaded constructor
+///\brief       Creates an AttributeIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 AttributeIException::AttributeIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	AttributeIException destructor
-///\brief	Noop destructor.
+// Function:    AttributeIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 AttributeIException::~AttributeIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	ReferenceException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    ReferenceException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	ReferenceException default constructor
-///\brief	Default constructor.
+// Function:    ReferenceException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 ReferenceException::ReferenceException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	ReferenceException overloaded constructor
-///\brief	Creates a ReferenceException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    ReferenceException overloaded constructor
+///\brief       Creates a ReferenceException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 ReferenceException::ReferenceException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	ReferenceException destructor
-///\brief	Noop destructor.
+// Function:    ReferenceException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 ReferenceException::~ReferenceException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	LibraryIException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    LibraryIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	LibraryIException default constructor
-///\brief	Default constructor.
+// Function:    LibraryIException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 LibraryIException::LibraryIException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	LibraryIException overloaded constructor
-///\brief	Creates a LibraryIException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    LibraryIException overloaded constructor
+///\brief       Creates a LibraryIException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 LibraryIException::LibraryIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	LibraryIException destructor
-///\brief	Noop destructor.
+// Function:    LibraryIException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 LibraryIException::~LibraryIException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	LocationException
-// Programmer	Binh-Minh Ribler - 2014
+// Subclass:    LocationException
+// Programmer   Binh-Minh Ribler - 2014
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	LocationException default constructor
-///\brief	Default constructor.
+// Function:    LocationException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 LocationException::LocationException():Exception(){}
 //--------------------------------------------------------------------------
-// Function:	LocationException overloaded constructor
-///\brief	Creates a LocationException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    LocationException overloaded constructor
+///\brief       Creates a LocationException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 LocationException::LocationException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	LocationException destructor
-///\brief	Noop destructor.
+// Function:    LocationException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 LocationException::~LocationException() throw() {}
 
 //--------------------------------------------------------------------------
-// Subclass:	IdComponentException
-// Programmer	Binh-Minh Ribler - 2000
+// Subclass:    IdComponentException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------
-// Function:	IdComponentException default constructor
-///\brief	Default constructor.
+// Function:    IdComponentException default constructor
+///\brief       Default constructor.
 //--------------------------------------------------------------------------
 IdComponentException::IdComponentException(): Exception() {}
 //--------------------------------------------------------------------------
-// Function:	IdComponentException overloaded constructor
-///\brief	Creates a IdComponentException with the name of the function,
-///		in which the failure occurs, and an optional detailed message.
-///\param	func - IN: Name of the function where failure occurs
-///\param	message   - IN: Message on the failure
+// Function:    IdComponentException overloaded constructor
+///\brief       Creates a IdComponentException with the name of the function,
+///             in which the failure occurs, and an optional detailed message.
+///\param       func - IN: Name of the function where failure occurs
+///\param       message   - IN: Message on the failure
 //--------------------------------------------------------------------------
 IdComponentException::IdComponentException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {}
 //--------------------------------------------------------------------------
-// Function:	IdComponentException destructor
-///\brief	Noop destructor.
+// Function:    IdComponentException destructor
+///\brief       Noop destructor.
 //--------------------------------------------------------------------------
 IdComponentException::~IdComponentException() throw() {}
-#ifndef H5_NO_NAMESPACE
+
 } // end namespace
-#endif
diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h
index d49c19a..2cc2dd6 100644
--- a/c++/src/H5Exception.h
+++ b/c++/src/H5Exception.h
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Exception_H
@@ -19,14 +17,12 @@
 
 #include <string>
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
 #ifdef H5_NO_STD
     #define H5std_string ::string
 #else
     #define H5std_string std::string
 #endif
-#endif
 
 /*! \class Exception
     \brief Exception provides wrappers of HDF5 error handling functions.
@@ -35,144 +31,149 @@ namespace H5 {
 */
 class H5_DLLCPP Exception {
    public:
-	// Creates an exception with a function name where the failure occurs
-	// and an optional detailed message
-	Exception(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        // Creates an exception with a function name where the failure occurs
+        // and an optional detailed message
+        Exception(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
 
-	// Returns a character string that describes the error specified by
-	// a major error number.
-	H5std_string getMajorString( hid_t err_major_id ) const;
+        // Returns a character string that describes the error specified by
+        // a major error number.
+        H5std_string getMajorString(hid_t err_major_id) const;
 
-	// Returns a character string that describes the error specified by
-	// a minor error number.
-	H5std_string getMinorString( hid_t err_minor_id ) const;
+        // Returns a character string that describes the error specified by
+        // a minor error number.
+        H5std_string getMinorString(hid_t err_minor_id) const;
 
-	// Returns the detailed message set at the time the exception is thrown
-	H5std_string getDetailMsg() const;
-	const char* getCDetailMsg() const;	// C string of detailed message
-	H5std_string getFuncName() const;	// function name as a string object
-	const char* getCFuncName() const;	// function name as a char string
+        // Returns the detailed message set at the time the exception is thrown
+        H5std_string getDetailMsg() const;
+        const char* getCDetailMsg() const;   // C string of detailed message
+        H5std_string getFuncName() const;    // function name as a string object
+        const char* getCFuncName() const;    // function name as a char string
 
-	// Turns on the automatic error printing.
-	static void setAutoPrint( H5E_auto2_t& func, void* client_data);
+        // Turns on the automatic error printing.
+        static void setAutoPrint(H5E_auto2_t& func, void* client_data);
 
-	// Turns off the automatic error printing.
-	static void dontPrint();
+        // Turns off the automatic error printing.
+        static void dontPrint();
 
-	// Retrieves the current settings for the automatic error stack
-	// traversal function and its data.
-	static void getAutoPrint( H5E_auto2_t& func, void** client_data);
+        // Retrieves the current settings for the automatic error stack
+        // traversal function and its data.
+        static void getAutoPrint(H5E_auto2_t& func, void** client_data);
 
-	// Clears the error stack for the current thread.
-	static void clearErrorStack();
+        // Clears the error stack for the current thread.
+        static void clearErrorStack();
 
-	// Walks the error stack for the current thread, calling the
-	// specified function.
-	static void walkErrorStack( H5E_direction_t direction,
-				H5E_walk2_t func, void* client_data);
+        // Walks the error stack for the current thread, calling the
+        // specified function.
+        static void walkErrorStack(H5E_direction_t direction,
+                                   H5E_walk2_t func, void* client_data);
 
-	// Prints the error stack in a default manner.
-	static void printErrorStack(FILE* stream = stderr,
-				    hid_t err_stack = H5E_DEFAULT); // Static
-	virtual void printError(FILE* stream = NULL) const;
+        // Prints the error stack in a default manner.
+        static void printErrorStack(FILE* stream = stderr,
+                                    hid_t err_stack = H5E_DEFAULT);
+        virtual void printError(FILE* stream = NULL) const;
 
-	// Default constructor
-	Exception();
+        // Default constructor
+        Exception();
 
-	// copy constructor
-	Exception( const Exception& orig);
+        // copy constructor
+        Exception(const Exception& orig);
 
-	// virtual Destructor
-	virtual ~Exception() throw();
+        // virtual Destructor
+        virtual ~Exception() throw();
 
    protected:
-	// Default value for detail_message
-	static const char DEFAULT_MSG[];
+        // Default value for detail_message
+        static const char DEFAULT_MSG[];
 
    private:
-	H5std_string detail_message;
-	H5std_string func_name;
+        H5std_string detail_message;
+        H5std_string func_name;
 };
 
 class H5_DLLCPP FileIException : public Exception {
    public:
-	FileIException( const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	FileIException();
-	virtual ~FileIException() throw();
+        FileIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        FileIException();
+        virtual ~FileIException() throw();
 };
 
 class H5_DLLCPP GroupIException : public Exception {
    public:
-	GroupIException( const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	GroupIException();
-	virtual ~GroupIException() throw();
+        GroupIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        GroupIException();
+        virtual ~GroupIException() throw();
 };
 
 class H5_DLLCPP DataSpaceIException : public Exception {
    public:
-	DataSpaceIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	DataSpaceIException();
-	virtual ~DataSpaceIException() throw();
+        DataSpaceIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        DataSpaceIException();
+        virtual ~DataSpaceIException() throw();
 };
 
 class H5_DLLCPP DataTypeIException : public Exception {
    public:
-	DataTypeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	DataTypeIException();
-	virtual ~DataTypeIException() throw();
+        DataTypeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        DataTypeIException();
+        virtual ~DataTypeIException() throw();
+};
+
+class H5_DLLCPP ObjHeaderIException : public Exception {
+   public:
+        ObjHeaderIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        ObjHeaderIException();
+        virtual ~ObjHeaderIException() throw();
 };
 
 class H5_DLLCPP PropListIException : public Exception {
    public:
-	PropListIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	PropListIException();
-	virtual ~PropListIException() throw();
+        PropListIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        PropListIException();
+        virtual ~PropListIException() throw();
 };
 
 class H5_DLLCPP DataSetIException : public Exception {
    public:
-	DataSetIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	DataSetIException();
-	virtual ~DataSetIException() throw();
+        DataSetIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        DataSetIException();
+        virtual ~DataSetIException() throw();
 };
 
 class H5_DLLCPP AttributeIException : public Exception {
    public:
-	AttributeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	AttributeIException();
-	virtual ~AttributeIException() throw();
+        AttributeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        AttributeIException();
+        virtual ~AttributeIException() throw();
 };
 
 class H5_DLLCPP ReferenceException : public Exception {
    public:
-	ReferenceException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	ReferenceException();
-	virtual ~ReferenceException() throw();
+        ReferenceException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        ReferenceException();
+        virtual ~ReferenceException() throw();
 };
 
 class H5_DLLCPP LibraryIException : public Exception {
    public:
-	LibraryIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	LibraryIException();
-	virtual ~LibraryIException() throw();
+        LibraryIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        LibraryIException();
+        virtual ~LibraryIException() throw();
 };
 
 class H5_DLLCPP LocationException : public Exception {
    public:
-	LocationException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	LocationException();
-	virtual ~LocationException() throw();
+        LocationException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        LocationException();
+        virtual ~LocationException() throw();
 };
 
 class H5_DLLCPP IdComponentException : public Exception {
    public:
-	IdComponentException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
-	IdComponentException();
-	virtual ~IdComponentException() throw();
-};
+        IdComponentException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG);
+        IdComponentException();
+        virtual ~IdComponentException() throw();
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of IdComponentException
+} // namespace H5
 
 #endif // __H5Exception_H
diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp
index c284500..b414294 100644
--- a/c++/src/H5FaccProp.cpp
+++ b/c++/src/H5FaccProp.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -21,9 +19,7 @@
 #include "H5PropList.h"
 #include "H5FaccProp.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -65,7 +61,7 @@ FileAccPropList* FileAccPropList::getConstant()
 
 //--------------------------------------------------------------------------
 // Function:    FileAccPropList::deleteConstants
-// Purpose:     Deletes the constant object that FileAccPropList::DEFAULT_
+// Purpose     Deletes the constant object that FileAccPropList::DEFAULT_
 //              points to.
 // exception    H5::PropListIException
 // Programmer   Binh-Minh Ribler - 2015
@@ -77,310 +73,271 @@ void FileAccPropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose:	Constant for default property
+// Purpose     Constant for default property
 //--------------------------------------------------------------------------
 const FileAccPropList& FileAccPropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	Default Constructor
-///\brief	Creates a file access property list
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    Default Constructor
+///\brief       Creates a file access property list
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FileAccPropList::FileAccPropList() : PropList( H5P_FILE_ACCESS ) {}
+FileAccPropList::FileAccPropList() : PropList(H5P_FILE_ACCESS) {}
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList copy constructor
-///\brief	Copy Constructor: makes a copy of the original
-///\param	original - IN: FileAccPropList instance to copy
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    FileAccPropList copy constructor
+///\brief       Copy Constructor: makes a copy of the original
+///\param       original - IN: FileAccPropList instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileAccPropList::FileAccPropList(const FileAccPropList& original) : PropList(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList overloaded constructor
-///\brief	Creates a file access property list using the id of an
-///		existing one.
-// Programmer:  Binh-Minh Ribler - 2000
+// Function:    FileAccPropList overloaded constructor
+///\brief       Creates a file access property list using the id of an
+///             existing one.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileAccPropList::FileAccPropList(const hid_t plist_id) : PropList(plist_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setStdio
-///\brief	Modifies this property list to use the \c H5FD_STDIO driver.
+// Function:    FileAccPropList::setStdio
+///\brief       Modifies this property list to use the \c H5FD_STDIO driver.
 ///
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setStdio() const
 {
-   herr_t ret_value = H5Pset_fapl_stdio(id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setStdio", "H5Pset_fapl_stdio failed");
-   }
+    herr_t ret_value = H5Pset_fapl_stdio(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setStdio", "H5Pset_fapl_stdio failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getDriver
-///\brief	Return the ID of the low-level file driver.
-///\return	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 the file driver remains registered.
-///		Valid driver identifiers can be found at:
+// Function:    FileAccPropList::getDriver
+///\brief       Return the ID of the low-level file driver.
+///\return      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 the file driver remains registered.
+///             Valid driver identifiers can be found at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetDriver
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 hid_t FileAccPropList::getDriver() const
 {
-   hid_t driver = H5Pget_driver(id);
-   if (driver < 0)
-   {
-      throw PropListIException("FileAccPropList::getDriver", "H5Pget_driver failed");
-   }
+    hid_t driver = H5Pget_driver(id);
+    if (driver < 0)
+    {
+        throw PropListIException("FileAccPropList::getDriver", "H5Pget_driver failed");
+    }
    return(driver);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setDriver
-///\brief	Set file driver for this property list.
-///\param	new_driver_id   - IN: File driver
-///\param	new_driver_info - IN: Struct containing the driver-specific properites
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setDriver
+///\brief       Set file driver for this property list.
+///\param       new_driver_id   - IN: File driver
+///\param       new_driver_info - IN: Struct containing the driver-specific properites
+///\exception   H5::PropListIException
 ///\par Description
-///		For a list of valid driver identifiers, please see the C
-///		layer Reference Manual at:
+///             For a list of valid driver identifiers, please see the C
+///             layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDriver
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setDriver(hid_t new_driver_id, const void *new_driver_info) const
 {
-   herr_t ret_value = H5Pset_driver(id, new_driver_id, new_driver_info);
-   if (ret_value < 0)
-   {
-      throw PropListIException("FileAccPropList::setDriver", "H5Pset_driver failed");
-   }
+    herr_t ret_value = H5Pset_driver(id, new_driver_id, new_driver_info);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setDriver", "H5Pset_driver failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setFamilyOffset
-///\brief	Sets offset for family driver.
-///\param	offset - IN: offset value
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::setFamilyOffset
+///\brief       Sets offset for family driver.
+///\param       offset - IN: offset value
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setFamilyOffset(hsize_t offset) const
 {
-   herr_t ret_value = H5Pset_family_offset(id, offset);
-   if (ret_value < 0)
-   {
-      throw PropListIException("FileAccPropList::setFamilyOffset", "H5Pset_family_offset failed");
-   }
+    herr_t ret_value = H5Pset_family_offset(id, offset);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setFamilyOffset", "H5Pset_family_offset failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getFamilyOffset
-///\brief	Get offset for family driver.
-///\return	Offset for family driver
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getFamilyOffset
+///\brief       Get offset for family driver.
+///\return      Offset for family driver
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 hsize_t FileAccPropList::getFamilyOffset() const
 {
-   hsize_t offset;
-   herr_t ret_value = H5Pget_family_offset(id, &offset);
-   if (ret_value < 0)
-   {
-      throw PropListIException("FileAccPropList::getFamilyOffset", "H5Pget_family_offset failed");
-   }
+    hsize_t offset;
+    herr_t ret_value = H5Pget_family_offset(id, &offset);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getFamilyOffset", "H5Pget_family_offset failed");
+    }
    return(offset);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setCore
-///\brief	Modifies this file access property list to use the \c H5FD_CORE
-///		driver.
-///\param	increment - IN: Specifies how much memory to increase each
-///				time more memory is needed, in bytes
-///\param	backing_store - IN: Indicating whether to write the file
-///				contents to disk when the file is closed
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setCore
+///\brief       Modifies this file access property list to use the \c H5FD_CORE
+///             driver.
+///\param       increment - IN: Specifies how much memory to increase each
+///                             time more memory is needed, in bytes
+///\param       backing_store - IN: Indicating whether to write the file
+///                                 contents to disk when the file is closed
+///\exception   H5::PropListIException
 ///\par Description
-///		For more details on the use of \c H5FD_CORE driver, please
-///		refer to
+///             For more details on the use of \c H5FD_CORE driver, please
+///             refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplCore
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setCore (size_t increment, hbool_t backing_store) const
 {
-   herr_t ret_value = H5Pset_fapl_core (id, increment, backing_store);
-   if (ret_value < 0)
-   {
-      throw PropListIException ("FileAccPropList::setCore", "H5Pset_fapl_core failed");
-   }
+    herr_t ret_value = H5Pset_fapl_core (id, increment, backing_store);
+    if (ret_value < 0)
+    {
+        throw PropListIException ("FileAccPropList::setCore", "H5Pset_fapl_core failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getCore
-///\brief	Queries core file driver properties.
-///\param	increment - OUT: Size of memory increment, in bytes
-///\param	backing_store - OUT: Indicating whether to write the file
-///				contents to disk when the file is closed
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getCore
+///\brief       Queries core file driver properties.
+///\param       increment - OUT: Size of memory increment, in bytes
+///\param       backing_store - OUT: Indicating whether to write the file
+///                                  contents to disk when the file is closed
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::getCore (size_t& increment, hbool_t& backing_store) const
 {
-   herr_t ret_value = H5Pget_fapl_core(id, &increment, &backing_store);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getCore", "H5Pget_fapl_core failed");
-   }
+    herr_t ret_value = H5Pget_fapl_core(id, &increment, &backing_store);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getCore", "H5Pget_fapl_core failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setFamily
-///\brief	Sets this file access property list to use the family driver.
-///\param	memb_size  - IN: Size in bytes of each file member
-///\param	memb_plist - IN: File access property list to be used for
-///					each family member
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setFamily
+///\brief       Sets this file access property list to use the family driver.
+///\param       memb_size  - IN: Size in bytes of each file member
+///\param       memb_plist - IN: File access property list to be used for
+///                              each family member
+///\exception   H5::PropListIException
 ///\par Description
-///		Note that \a memb_size is used only when creating a new file.
-// Programmer:  Binh-Minh Ribler - April, 2004
+///             Note that \a memb_size is used only when creating a new file.
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void FileAccPropList::setFamily( hsize_t memb_size, const FileAccPropList& memb_plist ) const
+void FileAccPropList::setFamily(hsize_t memb_size, const FileAccPropList& memb_plist) const
 {
-   herr_t ret_value = H5Pset_fapl_family (id, memb_size, memb_plist.getId() );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setFamily", "H5Pset_fapl_family failed");
-   }
+    herr_t ret_value = H5Pset_fapl_family (id, memb_size, memb_plist.getId());
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setFamily", "H5Pset_fapl_family failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getFamily
-///\brief	Returns information about the family file access property
-///		list.
-///\param	memb_size  - OUT: Size in bytes of each file member
-///\param	memb_plist - OUT: Retrieved file access property list for each
-///				  file member
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getFamily
+///\brief       Returns information about the family file access property
+///             list.
+///\param       memb_size  - OUT: Size in bytes of each file member
+///\param       memb_plist - OUT: Retrieved file access property list for each
+///                               file member
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::getFamily(hsize_t& memb_size, FileAccPropList& memb_plist) const
 {
-   hid_t memb_plist_id;
-   herr_t ret_value = H5Pget_fapl_family( id, &memb_size, &memb_plist_id );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed");
-   }
-   memb_plist.p_setId(memb_plist_id);
+    hid_t memb_plist_id;
+    herr_t ret_value = H5Pget_fapl_family(id, &memb_size, &memb_plist_id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed");
+    }
+    memb_plist.p_setId(memb_plist_id);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getFamily
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in what arguments it
-///		accepts and its return value.
-///\param	memb_size  - OUT: Size in bytes of each file member
-///\return	The file access property list for each file member
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getFamily
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts and its return value.
+///\param       memb_size  - OUT: Size in bytes of each file member
+///\return      The file access property list for each file member
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 FileAccPropList FileAccPropList::getFamily(hsize_t& memb_size) const
 {
-   hid_t memb_plist_id;
-   herr_t ret_value = H5Pget_fapl_family( id, &memb_size, &memb_plist_id );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed");
-   }
-   FileAccPropList memb_plist(memb_plist_id);
-   return(memb_plist);
-}
-
-//--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSplit
-///\brief	Emulates the old split file driver, which stored meta data
-///		in one file and raw data in another file.
-///\param	meta_plist  - IN: File access plist for the metadata file
-///\param	raw_plist   - IN: File access plist for the raw data file
-///\param	meta_ext    - IN: Metadata filename extension as \c char*
-///\param	raw_ext     - IN: Raw data filename extension as \c char*
-///\exception	H5::PropListIException
-///\par Description
-///		Temporary - For information, please refer to:
-/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplSplit
-// Programmer:  Binh-Minh Ribler - April, 2004
-//--------------------------------------------------------------------------
-void FileAccPropList::setSplit(const FileAccPropList& meta_plist, const FileAccPropList& raw_plist, const char* meta_ext, const char* raw_ext ) const
-{
-   hid_t meta_pid = meta_plist.getId();
-   hid_t raw_pid = raw_plist.getId();
-   herr_t ret_value = H5Pset_fapl_split( id, meta_ext, meta_pid, raw_ext, raw_pid );
-   if( ret_value < 0 )
-{
-      throw PropListIException("FileAccPropList::setSplit", "H5Pset_fapl_split failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSplit
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param 	meta_plist  - IN: File access plist for the metadata file
-// Param 	raw_plist   - IN: File access plist for the raw data file
-// Param 	meta_ext    - IN: Metadata filename extension as \c char*
-// Param 	raw_ext     - IN: Raw data filename extension as \c char*
-// Exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
-// Modification
-//		Planned for removal. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-void FileAccPropList::setSplit(FileAccPropList& meta_plist, FileAccPropList& raw_plist, const char* meta_ext, const char* raw_ext ) const
-{
-    setSplit(meta_plist, raw_plist, meta_ext, raw_ext);
+    hid_t memb_plist_id;
+    herr_t ret_value = H5Pget_fapl_family(id, &memb_size, &memb_plist_id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed");
+    }
+    FileAccPropList memb_plist(memb_plist_id);
+    return(memb_plist);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSplit
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes character arguments as \c H5std_string.
-///\param	meta_plist  - IN: File access plist for the metadata file
-///\param	raw_plist   - IN: File access plist for the raw data file
-///\param	meta_ext    - IN: Metadata filename extension as \c H5std_string
-///\param	raw_ext     - IN: Raw data filename extension as \c H5std_string
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::setSplit
+///\brief       Emulates the old split file driver, which stored meta data
+///             in one file and raw data in another file.
+///\param       meta_plist  - IN: File access plist for the metadata file
+///\param       raw_plist   - IN: File access plist for the raw data file
+///\param       meta_ext    - IN: Metadata filename extension as \c char*
+///\param       raw_ext     - IN: Raw data filename extension as \c char*
+///\exception   H5::PropListIException
+///\par Description
+///             Temporary - For information, please refer to:
+/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplSplit
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void FileAccPropList::setSplit(const FileAccPropList& meta_plist, const FileAccPropList& raw_plist, const H5std_string& meta_ext, const H5std_string& raw_ext ) const
+void FileAccPropList::setSplit(const FileAccPropList& meta_plist, const FileAccPropList& raw_plist, const char* meta_ext, const char* raw_ext) const
 {
-   setSplit( meta_plist, raw_plist, meta_ext.c_str(), raw_ext.c_str() );
+    hid_t meta_pid = meta_plist.getId();
+    hid_t raw_pid = raw_plist.getId();
+    herr_t ret_value = H5Pset_fapl_split(id, meta_ext, meta_pid, raw_ext, raw_pid);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setSplit", "H5Pset_fapl_split failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSplit
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param 	meta_plist  - IN: File access plist for the metadata file
-// Param 	raw_plist   - IN: File access plist for the raw data file
-// Param 	meta_ext    - IN: Metadata filename extension as \c char*
-// Param 	raw_ext     - IN: Raw data filename extension as \c char*
-// Exception	H5::PropListIException
-// Modification
-//		Planned for removal. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
+// Function:    FileAccPropList::setSplit
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes character arguments as \c H5std_string.
+///\param       meta_plist  - IN: File access plist for the metadata file
+///\param       raw_plist   - IN: File access plist for the raw data file
+///\param       meta_ext    - IN: Metadata filename extension as \c H5std_string
+///\param       raw_ext     - IN: Raw data filename extension as \c H5std_string
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void FileAccPropList::setSplit(FileAccPropList& meta_plist, FileAccPropList& raw_plist, const H5std_string& meta_ext, const H5std_string& raw_ext ) const
+void FileAccPropList::setSplit(const FileAccPropList& meta_plist, const FileAccPropList& raw_plist, const H5std_string& meta_ext, const H5std_string& raw_ext) const
 {
-   setSplit(meta_plist, raw_plist, meta_ext.c_str(), raw_ext.c_str() );
+    setSplit(meta_plist, raw_plist, meta_ext.c_str(), raw_ext.c_str());
 }
 
 // Stream Virtual File Driver had been removed from the main library.
@@ -388,405 +345,403 @@ void FileAccPropList::setSplit(FileAccPropList& meta_plist, FileAccPropList& raw
 // -BMR, March, 2012
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getSieveBufSize
-///\brief	Returns the current settings for the data sieve buffer size
-///		property from this property list.
-///\return	Data sieve buffer size, in bytes
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getSieveBufSize
+///\brief       Returns the current settings for the data sieve buffer size
+///             property from this property list.
+///\return      Data sieve buffer size, in bytes
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 size_t FileAccPropList::getSieveBufSize() const
 {
-   size_t bufsize;
-   herr_t ret_value = H5Pget_sieve_buf_size(id, &bufsize);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getSieveBufSize", "H5Pget_sieve_buf_size failed");
-   }
-   return(bufsize);
+    size_t bufsize;
+    herr_t ret_value = H5Pget_sieve_buf_size(id, &bufsize);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getSieveBufSize", "H5Pget_sieve_buf_size failed");
+    }
+    return(bufsize);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSieveBufSize
-///\brief	Sets the maximum size of the data sieve buffer.
-///\param	bufsize - IN: Maximum size, in bytes, of data sieve buffer
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setSieveBufSize
+///\brief       Sets the maximum size of the data sieve buffer.
+///\param       bufsize - IN: Maximum size, in bytes, of data sieve buffer
+///\exception   H5::PropListIException
 ///\par Description
-///		For detail on data sieving, please refer to
+///             For detail on data sieving, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSieveBufSize
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setSieveBufSize(size_t bufsize) const
 {
-   herr_t ret_value = H5Pset_sieve_buf_size(id, bufsize);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getSieveBufSize", "H5Pget_sieve_buf_size failed");
-   }
+    herr_t ret_value = H5Pset_sieve_buf_size(id, bufsize);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getSieveBufSize", "H5Pget_sieve_buf_size failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setMetaBlockSize
-///\brief	Sets the minimum size of metadata block allocations.
-///\param	block_size - IN: Minimum size, in bytes, of metadata
-///		block allocations
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setMetaBlockSize
+///\brief       Sets the minimum size of metadata block allocations.
+///\param       block_size - IN: Minimum size, in bytes, of metadata
+///             block allocations
+///\exception   H5::PropListIException
 ///\par Description
-///		For more detail, please see the C layer Reference Manual at:
+///             For more detail, please see the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMetaBlockSize
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setMetaBlockSize(hsize_t &block_size) const
 {
-   herr_t ret_value = H5Pset_meta_block_size(id, block_size);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setMetaBlockSize", "H5Pset_meta_block_size failed");
-   }
+    herr_t ret_value = H5Pset_meta_block_size(id, block_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setMetaBlockSize", "H5Pset_meta_block_size failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getMetaBlockSize
-///\brief	Returns the current metadata block size setting.
-///\return	Metadata block size
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getMetaBlockSize
+///\brief       Returns the current metadata block size setting.
+///\return      Metadata block size
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 hsize_t FileAccPropList::getMetaBlockSize() const
 {
-   hsize_t block_size;
-   herr_t ret_value = H5Pget_meta_block_size(id, &block_size);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getMetaBlockSize", "H5Pget_meta_block_size failed");
-   }
-   return(block_size);
+    hsize_t block_size;
+    herr_t ret_value = H5Pget_meta_block_size(id, &block_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getMetaBlockSize", "H5Pget_meta_block_size failed");
+    }
+    return(block_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setLog
-///\brief	Modifies this file access property list to use the logging
-///		driver.
-///\param	logfile  - IN: Name of the log file
-///\param	flags    - IN: Flags specifying the types of logging activity
-///\param	buf_size - IN: Size of the logging buffer
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setLog
+///\brief       Modifies this file access property list to use the logging
+///             driver.
+///\param       logfile  - IN: Name of the log file
+///\param       flags    - IN: Flags specifying the types of logging activity
+///\param       buf_size - IN: Size of the logging buffer
+///\exception   H5::PropListIException
 ///\par Description
-///		For detail on \a flags, please refer to
+///             For detail on \a flags, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplLog
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setLog(const char *logfile, unsigned flags, size_t buf_size) const
 {
-   herr_t ret_value = H5Pset_fapl_log(id, logfile, flags, buf_size);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setLog", "H5Pset_fapl_log failed");
-   }
+    herr_t ret_value = H5Pset_fapl_log(id, logfile, flags, buf_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setLog", "H5Pset_fapl_log failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setLog
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in what arguments it
-///		accepts.
-///\param	logfile  - IN: Name of the log file - string
-///\param	flags    - IN: Flags specifying the types of logging activity
-///\param	buf_size - IN: Size of the logging buffer
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::setLog
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       logfile  - IN: Name of the log file - string
+///\param       flags    - IN: Flags specifying the types of logging activity
+///\param       buf_size - IN: Size of the logging buffer
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setLog(const H5std_string& logfile, unsigned flags, size_t buf_size) const
 {
-   setLog(logfile.c_str(), flags, buf_size);
+    setLog(logfile.c_str(), flags, buf_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setSec2
-///\brief	Modifies this file access property list to use the sec2
-///		driver.
+// Function:    FileAccPropList::setSec2
+///\brief       Modifies this file access property list to use the sec2
+///             driver.
 ///
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setSec2() const
 {
-   herr_t ret_value = H5Pset_fapl_sec2(id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setSec2", "H5Pset_fapl_sec2 failed");
-   }
+    herr_t ret_value = H5Pset_fapl_sec2(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setSec2", "H5Pset_fapl_sec2 failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setAlignment
-///\brief	Sets the alignment properties of this property list.
-///\param	threshold - IN: Threshold value for file object size
-///\param	alignment - IN: Alignment value
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setAlignment
+///\brief       Sets the alignment properties of this property list.
+///\param       threshold - IN: Threshold value for file object size
+///\param       alignment - IN: Alignment value
+///\exception   H5::PropListIException
 ///\par Description
-///		The parameter \a threshold must have a non-negative value.
-///		Note that setting the threshold value to 0 (zero) has the
-///		effect of a special case, forcing everything to be aligned.
-///		The parameter \a alignment must have a positive value.
+///             The parameter \a threshold must have a non-negative value.
+///             Note that setting the threshold value to 0 (zero) has the
+///             effect of a special case, forcing everything to be aligned.
+///             The parameter \a alignment must have a positive value.
 ///
-///		For detail on \a setting alignment, please refer to
+///             For detail on \a setting alignment, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAlignment
-// Programmer:	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileAccPropList::setAlignment( hsize_t threshold, hsize_t alignment ) const
+void FileAccPropList::setAlignment(hsize_t threshold, hsize_t alignment) const
 {
-   herr_t ret_value = H5Pset_alignment( id, threshold, alignment );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setAlignment", "H5Pset_alignment failed");
-   }
+    herr_t ret_value = H5Pset_alignment(id, threshold, alignment);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setAlignment", "H5Pset_alignment failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getAlignment
-///\brief	Returns the current settings for alignment properties from
-///		this property list.
-///\param	threshold - OUT: Retrieved threshold value for file object size
-///\param	alignment - OUT: Retrieved alignment value
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    FileAccPropList::getAlignment
+///\brief       Returns the current settings for alignment properties from
+///             this property list.
+///\param       threshold - OUT: Retrieved threshold value for file object size
+///\param       alignment - OUT: Retrieved alignment value
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileAccPropList::getAlignment( hsize_t &threshold, hsize_t &alignment ) const
+void FileAccPropList::getAlignment(hsize_t &threshold, hsize_t &alignment) const
 {
-   herr_t ret_value = H5Pget_alignment( id, &threshold, &alignment );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getAlignment", "H5Pget_alignment failed");
-   }
+    herr_t ret_value = H5Pget_alignment(id, &threshold, &alignment);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getAlignment", "H5Pget_alignment failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setMultiType
-///\brief	Sets data type for \c MULTI driver.
-///\param	dtype - IN: Type of data
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setMultiType
+///\brief       Sets data type for \c MULTI driver.
+///\param       dtype - IN: Type of data
+///\exception   H5::PropListIException
 ///\par Description
-///		More details and valid values for \a dtype can be found at:
+///             More details and valid values for \a dtype can be found at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMultiType
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void FileAccPropList::setMultiType(H5FD_mem_t dtype) const
 {
-   herr_t ret_value = H5Pset_multi_type(id, dtype);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setMultiType", "H5Pset_multi_type failed");
-   }
+    herr_t ret_value = H5Pset_multi_type(id, dtype);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setMultiType", "H5Pset_multi_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getMultiType
-///\brief	Returns the data type property for \c MULTI driver.
-///\return	The data type property
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::getMultiType
+///\brief       Returns the data type property for \c MULTI driver.
+///\return      The data type property
+///\exception   H5::PropListIException
 ///\par Description
-///		More details and possible returned values can be found at:
+///             More details and possible returned values can be found at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetMultiType
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 H5FD_mem_t FileAccPropList::getMultiType() const
 {
-   H5FD_mem_t dtype;
-   herr_t ret_value = H5Pget_multi_type(id, &dtype);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getMultiType", "H5Pget_multi_type failed");
-   }
-   return(dtype);
+    H5FD_mem_t dtype;
+    herr_t ret_value = H5Pget_multi_type(id, &dtype);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getMultiType", "H5Pget_multi_type failed");
+    }
+    return(dtype);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setCache
-///\brief	Sets the meta data cache and raw data chunk cache parameters.
-///\param	mdc_nelmts - IN: Number of elements in the meta data cache
-///\param	rdcc_nelmts - IN: Number of elements in the raw data chunk cache
-///\param	rdcc_nbytes - IN: Total size of the raw data chunk cache, in bytes
-///\param	rdcc_w0 - IN: Preemption policy
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setCache
+///\brief       Sets the meta data cache and raw data chunk cache parameters.
+///\param       mdc_nelmts - IN: Number of elements in the meta data cache
+///\param       rdcc_nelmts - IN: Number of elements in the raw data chunk cache
+///\param       rdcc_nbytes - IN: Total size of the raw data chunk cache, in bytes
+///\param       rdcc_w0 - IN: Preemption policy
+///\exception   H5::PropListIException
 ///\par Description
-///		The argument \a rdcc_w0 should hold a value between 0 and 1
-///		inclusive.  This value indicates how much chunks that have
-///		been fully read are favored for preemption. A value of zero
-///		means fully read 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.
-// Programmer:	Binh-Minh Ribler - 2000
+///             The argument \a rdcc_w0 should hold a value between 0 and 1
+///             inclusive.  This value indicates how much chunks that have
+///             been fully read are favored for preemption. A value of zero
+///             means fully read 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.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileAccPropList::setCache( int mdc_nelmts, size_t rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0 ) const
+void FileAccPropList::setCache(int mdc_nelmts, size_t rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0) const
 {
-   herr_t ret_value = H5Pset_cache( id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0 );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setCache", "H5Pset_cache failed");
-   }
+    herr_t ret_value = H5Pset_cache(id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setCache", "H5Pset_cache failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getCache
-///\brief	Queries the meta data cache and raw data chunk cache parameters.
-///\param	mdc_nelmts  - OUT: Number of elements in the meta data cache
-///\param	rdcc_nelmts - OUT: Number of elements in the raw data chunk cache
-///\param	rdcc_nbytes - OUT: Total size of the raw data chunk cache, in bytes
-///\param	rdcc_w0 - OUT: Preemption policy
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    FileAccPropList::getCache
+///\brief       Queries the meta data cache and raw data chunk cache parameters.
+///\param       mdc_nelmts  - OUT: Number of elements in the meta data cache
+///\param       rdcc_nelmts - OUT: Number of elements in the raw data chunk cache
+///\param       rdcc_nbytes - OUT: Total size of the raw data chunk cache, in bytes
+///\param       rdcc_w0 - OUT: Preemption policy
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileAccPropList::getCache( int& mdc_nelmts, size_t& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0 ) const
+void FileAccPropList::getCache(int& mdc_nelmts, size_t& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0) const
 {
-   herr_t ret_value = H5Pget_cache( id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0 );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getCache", "H5Pget_cache failed");
-   }
+    herr_t ret_value = H5Pget_cache(id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getCache", "H5Pget_cache failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setFcloseDegree
-///\brief	Sets the degree for the file close behavior.
-///\param	degree - IN:
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::setFcloseDegree
+///\brief       Sets the degree for the file close behavior.
+///\param       degree - IN:
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-void FileAccPropList::setFcloseDegree(H5F_close_degree_t degree)
+void FileAccPropList::setFcloseDegree(H5F_close_degree_t degree) const
 {
-   herr_t ret_value = H5Pset_fclose_degree(id, degree);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setFcloseDegree", "H5Pset_fclose_degree failed");
-   }
+    herr_t ret_value = H5Pset_fclose_degree(id, degree);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setFcloseDegree", "H5Pset_fclose_degree failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getFcloseDegree
-///\brief	Returns the degree for the file close behavior.
-///\return	The degree for the file close behavior
-///\exception	H5::PropListIException
-// Programmer:  Binh-Minh Ribler - April, 2004
+// Function:    FileAccPropList::getFcloseDegree
+///\brief       Returns the degree for the file close behavior.
+///\return      The degree for the file close behavior
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-H5F_close_degree_t FileAccPropList::getFcloseDegree()
+H5F_close_degree_t FileAccPropList::getFcloseDegree() const
 {
-   H5F_close_degree_t degree;
-   herr_t ret_value = H5Pget_fclose_degree(id, &degree);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getFcloseDegree", "H5Pget_fclose_degree failed");
-   }
-   return(degree);
+    H5F_close_degree_t degree;
+    herr_t ret_value = H5Pget_fclose_degree(id, &degree);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getFcloseDegree", "H5Pget_fclose_degree failed");
+    }
+    return(degree);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setGcReferences
-///\brief	Sets garbage collecting references flag.
-///\param	gc_ref - IN: Flag setting reference garbage collection to
-///				on (1) or off (0).
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setGcReferences
+///\brief       Sets garbage collecting references flag.
+///\param       gc_ref - IN: Flag setting reference garbage collection to
+///                          on (1) or off (0).
+///\exception   H5::PropListIException
 ///\par Description
-///		For detail on \a fapl, please refer to
+///             For detail on \a fapl, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetGCReferences
-// Programmer:	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileAccPropList::setGcReferences( unsigned gc_ref ) const
+void FileAccPropList::setGcReferences(unsigned gc_ref) const
 {
-   herr_t ret_value = H5Pset_gc_references( id, gc_ref );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::setGcReferences", "H5Pset_gc_references failed");
-   }
+    herr_t ret_value = H5Pset_gc_references(id, gc_ref);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::setGcReferences", "H5Pset_gc_references failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getGcReferences
-///\brief	Returns the garbage collecting references setting.
-///\return	Garbage collecting references setting, 0 (off) or 1 (on)
-///\exception	H5::PropListIException
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    FileAccPropList::getGcReferences
+///\brief       Returns the garbage collecting references setting.
+///\return      Garbage collecting references setting, 0 (off) or 1 (on)
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 unsigned FileAccPropList::getGcReferences() const
 {
-   unsigned gc_ref;
+    unsigned gc_ref;
 
-   // the name of this routine will be changed to H5Pget_gc_references???
-   herr_t ret_value = H5Pget_gc_references( id, &gc_ref );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileAccPropList::getGcReferences", "H5Pget_gc_references failed");
-   }
-   return( gc_ref );
+    // the name of this routine will be changed to H5Pget_gc_references???
+    herr_t ret_value = H5Pget_gc_references(id, &gc_ref);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileAccPropList::getGcReferences", "H5Pget_gc_references failed");
+    }
+    return(gc_ref);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::setLibverBounds
-///\brief	Sets bounds on versions of library format to be used when creating
-///		or writing objects.
-///\param	libver_low  - IN: Earliest version of the library that will be
-///				  used for creating or writing objects
-///\param	libver_high - IN: Latest version of the library that will be
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::setLibverBounds
+///\brief       Sets bounds on versions of library format to be used when creating
+///             or writing objects.
+///\param       libver_low  - IN: Earliest version of the library that will be
+///                               used for creating or writing objects
+///\param       libver_high - IN: Latest version of the library that will be
+///\exception   H5::PropListIException
 ///\par Description
-///		Valid values of \a libver_low are as follows:
-///		\li \c H5F_LIBVER_EARLIEST   (Default)
-///		\li \c H5F_LIBVER_18
-///		\li \c H5F_LIBVER_LATEST
+///             Valid values of \a libver_low are as follows:
+///             \li \c H5F_LIBVER_EARLIEST   (Default)
+///             \li \c H5F_LIBVER_18
+///             \li \c H5F_LIBVER_LATEST
 ///
-///		Valid values of \a libver_high are as follows:
-///		\li \c H5F_LIBVER_18
-///		\li \c H5F_LIBVER_LATEST   (Default)
+///             Valid values of \a libver_high are as follows:
+///             \li \c H5F_LIBVER_18
+///             \li \c H5F_LIBVER_LATEST   (Default)
 ///
-///		For more details, please refer to
+///             For more details, please refer to
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLibverBounds
-// Programmer:  Binh-Minh Ribler - March, 2015
+// Programmer   Binh-Minh Ribler - March, 2015
 //--------------------------------------------------------------------------
 void FileAccPropList::setLibverBounds(H5F_libver_t libver_low, H5F_libver_t libver_high) const
 {
     herr_t ret_value = H5Pset_libver_bounds(id, libver_low, libver_high);
     if (ret_value < 0)
     {
-	throw PropListIException("FileAccPropList::setLibverBounds", "H5Pset_libver_bounds failed");
+        throw PropListIException("FileAccPropList::setLibverBounds", "H5Pset_libver_bounds failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList::getLibverBounds
-///\brief	Gets the current settings for the library version format bounds
-///		from a file access property list.
-///\param	libver_low  - OUT: Earliest version of the library that will be
-///				   used for creating or writing objects
-///\param	libver_high - OUT: Latest version of the library that will be
-///				   used for creating or writing objects
-///\exception	H5::PropListIException
+// Function:    FileAccPropList::getLibverBounds
+///\brief       Gets the current settings for the library version format bounds
+///             from a file access property list.
+///\param       libver_low  - OUT: Earliest version of the library that will be
+///                                used for creating or writing objects
+///\param       libver_high - OUT: Latest version of the library that will be
+///                                used for creating or writing objects
+///\exception   H5::PropListIException
 ///\par Description
-///		On success, the argument \a libver_low can have the following
-///		values:
-///		\li \c H5F_LIBVER_EARLIEST
-///		\li \c H5F_LIBVER_18
-///		\li \c H5F_LIBVER_LATEST
+///             On success, the argument \a libver_low can have the following
+///             values:
+///             \li \c H5F_LIBVER_EARLIEST
+///             \li \c H5F_LIBVER_18
+///             \li \c H5F_LIBVER_LATEST
 ///
-///		and \a libver_high:
-///		\li \c H5F_LIBVER_18
-///		\li \c H5F_LIBVER_LATEST
-// Programmer:  Binh-Minh Ribler - March, 2015
+///             and \a libver_high:
+///             \li \c H5F_LIBVER_18
+///             \li \c H5F_LIBVER_LATEST
+// Programmer   Binh-Minh Ribler - March, 2015
 //--------------------------------------------------------------------------
 void FileAccPropList::getLibverBounds(H5F_libver_t& libver_low, H5F_libver_t& libver_high) const
 {
     herr_t ret_value = H5Pget_libver_bounds(id, &libver_low, &libver_high);
-    if( ret_value < 0 )
+    if (ret_value < 0)
     {
-	throw PropListIException("FileAccPropList::getLibverBounds", "H5Pget_libver_bounds failed");
+        throw PropListIException("FileAccPropList::getLibverBounds", "H5Pget_libver_bounds failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileAccPropList destructor
-///\brief	Noop destructor
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileAccPropList destructor
+///\brief       Noop destructor
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileAccPropList::~FileAccPropList() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5FaccProp.h b/c++/src/H5FaccProp.h
index b214447..1df8fc8 100644
--- a/c++/src/H5FaccProp.h
+++ b/c++/src/H5FaccProp.h
@@ -6,149 +6,145 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-// Class FileAccPropList represents the HDF5 file access property list and
-// inherits from DataType.
-
 #ifndef __H5FileAccPropList_H
 #define __H5FileAccPropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class FileAccPropList represents the HDF5 file access property list.
+/*! \class FileAccPropList
+    \brief Class FileAccPropList inherits from PropList and provides
+    wrappers for the HDF5 file access property list.
+*/
+//  Inheritance: PropList -> IdComponent
 class H5_DLLCPP FileAccPropList : public PropList {
    public:
-	///\brief Default file access property list.
-	static const FileAccPropList& DEFAULT;
+        ///\brief Default file access property list.
+        static const FileAccPropList& DEFAULT;
+
+        // Creates a file access property list.
+        FileAccPropList();
 
-	// Creates a file access property list.
-	FileAccPropList();
+        // Modifies this property list to use the H5FD_STDIO driver
+        void setStdio() const;
 
-	// Modifies this property list to use the H5FD_STDIO driver
-	void setStdio() const;
+        // Set file driver for this property list
+        void setDriver(hid_t new_driver_id, const void *new_driver_info) const;
 
-	// Set file driver for this property list
-	void setDriver(hid_t new_driver_id, const void *new_driver_info) const;
+        // Returns a low-level file driver identifier.
+        hid_t getDriver() const;
 
-	// Returns a low-level file driver identifier.
-	hid_t getDriver() const;
+        // Sets offset for family driver.
+        void setFamilyOffset(hsize_t offset) const;
 
-	// Sets offset for family driver.
-	void setFamilyOffset(hsize_t offset) const;
+        // Gets offset for family driver.
+        hsize_t getFamilyOffset() const;
 
-	// Gets offset for family driver.
-	hsize_t getFamilyOffset() const;
+        // Modifies this file access property list to use the sec2 driver.
+        void setSec2() const;
 
-	// Modifies this file access property list to use the sec2 driver.
-	void setSec2() const;
+        // Modifies this file access property list to use the H5FD_CORE
+        // driver.
+        void setCore (size_t increment, hbool_t backing_store) const;
 
-	// Modifies this file access property list to use the H5FD_CORE
-	// driver.
-	void setCore (size_t increment, hbool_t backing_store) const;
+        // Queries H5FD_CORE driver properties.
+        void getCore (size_t& increment, hbool_t& backing_store) const;
 
-	// Queries H5FD_CORE driver properties.
-	void getCore (size_t& increment, hbool_t& backing_store) const;
+        // Sets this file access properties list to the family driver.
+        void setFamily(hsize_t memb_size, const FileAccPropList& memb_plist) const;
 
-	// Sets this file access properties list to the family driver.
-	void setFamily( hsize_t memb_size, const FileAccPropList& memb_plist ) const;
+        // Returns information about the family file access property list.
+        void getFamily(hsize_t& memb_size, FileAccPropList& memb_plist) const;
+        FileAccPropList getFamily(hsize_t& memb_size) const;
 
-	// Returns information about the family file access property list.
-	void getFamily(hsize_t& memb_size, FileAccPropList& memb_plist) const;
-	FileAccPropList getFamily(hsize_t& memb_size) const;
+        // Emulates the old split file driver,
+        void setSplit(const FileAccPropList& meta_plist,
+                      const FileAccPropList& raw_plist,
+                      const char* meta_ext = ".meta",
+                      const char* raw_ext = ".raw") const;
+        void setSplit(const FileAccPropList& meta_plist,
+                      const FileAccPropList& raw_plist,
+                      const H5std_string& meta_ext = ".meta",
+                      const H5std_string& raw_ext = ".raw") const;
 
-	// Emulates the old split file driver,
-	void setSplit(const FileAccPropList& meta_plist,
-		      const FileAccPropList& raw_plist,
-		      const char* meta_ext = ".meta",
-		      const char* raw_ext = ".raw" ) const;
-	void setSplit(const FileAccPropList& meta_plist,
-		      const FileAccPropList& raw_plist,
-		      const H5std_string& meta_ext = ".meta",
-		      const H5std_string& raw_ext = ".raw") const;
-	// These two overloaded functions are kept for backward compatibility
-	// only; they missed the const's and will be removed in future release.
-	void setSplit(FileAccPropList& meta_plist, FileAccPropList& raw_plist,
-	     const char* meta_ext=".meta", const char* raw_ext=".raw") const;
-	void setSplit(FileAccPropList& meta_plist, FileAccPropList& raw_plist,
-	     const H5std_string& meta_ext=".meta",
-	     const H5std_string& raw_ext=".raw") const;
+        // Sets the maximum size of the data sieve buffer.
+        void setSieveBufSize(size_t bufsize) const;
 
-	// Sets the maximum size of the data sieve buffer.
-	void setSieveBufSize(size_t bufsize) const;
+        // Returns the current settings for the data sieve buffer size
+        // property
+        size_t getSieveBufSize() const;
 
-	// Returns the current settings for the data sieve buffer size
-	// property
-	size_t getSieveBufSize() const;
+        // Sets the minimum size of metadata block allocations.
+        void setMetaBlockSize(hsize_t &block_size) const;
 
-	// Sets the minimum size of metadata block allocations.
-	void setMetaBlockSize(hsize_t &block_size) const;
+        // Returns the current metadata block size setting.
+        hsize_t getMetaBlockSize() const;
 
-	// Returns the current metadata block size setting.
-	hsize_t getMetaBlockSize() const;
+        // Modifies this file access property list to use the logging driver.
+        void setLog(const char *logfile, unsigned flags, size_t buf_size) const;
+        void setLog(const H5std_string& logfile, unsigned flags, size_t buf_size) const;
 
-	// Modifies this file access property list to use the logging driver.
-	void setLog(const char *logfile, unsigned flags, size_t buf_size) const;
-	void setLog(const H5std_string& logfile, unsigned flags, size_t buf_size) const;
+        // Sets alignment properties of this file access property list
+        void setAlignment(hsize_t threshold = 1, hsize_t alignment = 1) const;
 
-	// Sets alignment properties of this file access property list
-	void setAlignment( hsize_t threshold = 1, hsize_t alignment = 1 ) const;
+        // Retrieves the current settings for alignment properties from
+        // this property list.
+        void getAlignment(hsize_t& threshold, hsize_t& alignment) const;
 
-	// Retrieves the current settings for alignment properties from
-	// this property list.
-	void getAlignment( hsize_t& threshold, hsize_t& alignment ) const;
+        // Sets data type for multi driver.
+        void setMultiType(H5FD_mem_t dtype) const;
 
-	// Sets data type for multi driver.
-	void setMultiType(H5FD_mem_t dtype) const;
+        // Returns the data type property for MULTI driver.
+        H5FD_mem_t getMultiType() const;
 
-	// Returns the data type property for MULTI driver.
-	H5FD_mem_t getMultiType() const;
+        // Sets the meta data cache and raw data chunk cache parameters.
+        void setCache(int mdc_nelmts, size_t rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0) const;
 
-	// Sets the meta data cache and raw data chunk cache parameters.
-	void setCache( int mdc_nelmts, size_t rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0 ) const;
+        // Queries the meta data cache and raw data chunk cache parameters.
+        void getCache(int& mdc_nelmts, size_t& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0) const;
 
-	// Queries the meta data cache and raw data chunk cache parameters.
-	void getCache( int& mdc_nelmts, size_t& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0 ) const;
+        // Sets the degree for the file close behavior.
+        void setFcloseDegree(H5F_close_degree_t degree) const;
 
-	// Sets the degree for the file close behavior.
-	void setFcloseDegree(H5F_close_degree_t degree);
+        // Returns the degree for the file close behavior.
+        H5F_close_degree_t getFcloseDegree() const;
 
-	// Returns the degree for the file close behavior.
-	H5F_close_degree_t getFcloseDegree();
+        // Sets file access property list to use the H5FD_DIRECT driver.
+        void setFileAccDirect(size_t boundary, size_t block_size, size_t cbuf_size) const;
 
-	// Sets garbage collecting references flag.
-	void setGcReferences( unsigned gc_ref = 0 ) const;
+        // Retrieves information about the direct file access property list.
+        void getFileAccDirect(size_t &boundary, size_t &block_size, size_t &cbuf_size) const;
 
-	// Returns garbage collecting references setting.
-	unsigned getGcReferences() const;
+        // Sets garbage collecting references flag.
+        void setGcReferences(unsigned gc_ref = 0) const;
 
-	// Sets bounds on versions of library format to be used when creating
-	// or writing objects.
-	void setLibverBounds(H5F_libver_t libver_low, H5F_libver_t libver_high) const;
+        // Returns garbage collecting references setting.
+        unsigned getGcReferences() const;
 
-	// Gets the current settings for the library version format bounds.
-	void getLibverBounds(H5F_libver_t& libver_low, H5F_libver_t& libver_high) const;
+        // Sets bounds on versions of library format to be used when creating
+        // or writing objects.
+        void setLibverBounds(H5F_libver_t libver_low, H5F_libver_t libver_high) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("FileAccPropList"); }
+        // Gets the current settings for the library version format bounds.
+        void getLibverBounds(H5F_libver_t& libver_low, H5F_libver_t& libver_high) const;
 
-	// Copy constructor: creates a copy of a FileAccPropList object.
-	FileAccPropList( const FileAccPropList& original );
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("FileAccPropList"); }
 
-	// Creates a copy of an existing file access property list
-	// using the property list id.
-	FileAccPropList (const hid_t plist_id);
+        // Copy constructor: creates a copy of a FileAccPropList object.
+        FileAccPropList(const FileAccPropList& original);
 
-	// Noop destructor
-	virtual ~FileAccPropList();
+        // Creates a copy of an existing file access property list
+        // using the property list id.
+        FileAccPropList (const hid_t plist_id);
+
+        // Noop destructor
+        virtual ~FileAccPropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
@@ -163,8 +159,7 @@ class H5_DLLCPP FileAccPropList : public PropList {
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of FileAccPropList
+} // namespace H5
+
 #endif // __H5FileAccPropList_H
diff --git a/c++/src/H5FcreatProp.cpp b/c++/src/H5FcreatProp.cpp
index af51677..9674c0a 100644
--- a/c++/src/H5FcreatProp.cpp
+++ b/c++/src/H5FcreatProp.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -21,9 +19,7 @@
 #include "H5PropList.h"
 #include "H5FcreatProp.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -35,7 +31,7 @@ FileCreatPropList* FileCreatPropList::DEFAULT_ = 0;
 
 //--------------------------------------------------------------------------
 // Function:    FileCreatPropList::getConstant
-// Purpose:     Creates a FileCreatPropList object representing the HDF5
+// Purpose      Creates a FileCreatPropList object representing the HDF5
 //              constant H5P_FILE_ACCESS, pointed to by FileCreatPropList::DEFAULT_
 // exception    H5::PropListIException
 // Description
@@ -64,7 +60,7 @@ FileCreatPropList* FileCreatPropList::getConstant()
 
 //--------------------------------------------------------------------------
 // Function:    FileCreatPropList::deleteConstants
-// Purpose:     Deletes the constant object that FileCreatPropList::DEFAULT_
+// Purpose      Deletes the constant object that FileCreatPropList::DEFAULT_
 //              points to.
 // Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
@@ -75,234 +71,317 @@ void FileCreatPropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose	Constant for default property
+// Purpose      Constant for default property
 //--------------------------------------------------------------------------
 const FileCreatPropList& FileCreatPropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList default constructor
-///\brief	Default constructor: Creates a file create property list
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileCreatPropList default constructor
+///\brief       Default constructor: Creates a file create property list
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FileCreatPropList::FileCreatPropList() : PropList( H5P_FILE_CREATE ) {}
+FileCreatPropList::FileCreatPropList() : PropList(H5P_FILE_CREATE) {}
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList copy constructor
-///\brief	Copy constructor: makes a copy of the original
-///		FileCreatPropList object.
-///\param	original - IN: FileCreatPropList instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileCreatPropList copy constructor
+///\brief       Copy constructor: makes a copy of the original
+///             FileCreatPropList object.
+///\param       original - IN: FileCreatPropList instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FileCreatPropList::FileCreatPropList( const FileCreatPropList& original ) : PropList( original ) {}
+FileCreatPropList::FileCreatPropList(const FileCreatPropList& original) : PropList( original ) {}
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList overloaded constructor
-///\brief	Creates a file creation property list using the id of an
-///		existing one.
-///\param	plist_id - IN: FileCreatPropList id to use
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileCreatPropList overloaded constructor
+///\brief       Creates a file creation property list using the id of an
+///             existing one.
+///\param       plist_id - IN: FileCreatPropList id to use
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 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.
-///\param	super    - OUT: The file super block.
-///\param	freelist - OUT: The global free list.
-///\param	stab     - OUT: The root symbol table entry.
-///\param	shhdr    - OUT: Shared object headers.
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::getVersion
+///\brief       Retrieves version information for various parts of a file.
+///\param       super    - OUT: The file super block.
+///\param       freelist - OUT: The global free list.
+///\param       stab     - OUT: The root symbol table entry.
+///\param       shhdr    - OUT: Shared object headers.
+///\exception   H5::PropListIException
 ///\par Description
-///		Any (or even all) of the output arguments can be null pointers.
-// Programmer	Binh-Minh Ribler - 2000
+///             Any (or even all) of the output arguments can be null pointers.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void FileCreatPropList::getVersion(unsigned& super, unsigned& freelist, unsigned& stab, unsigned& shhdr) const
 {
-   herr_t ret_value = H5Pget_version( id, &super, &freelist, &stab, &shhdr );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::getVersion",
-		"H5Pget_version failed");
-   }
+    herr_t ret_value = H5Pget_version(id, &super, &freelist, &stab, &shhdr);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getVersion",
+            "H5Pget_version failed");
+    }
 }
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::setUserblock
-///\brief	Sets the user block size field of this file creation property list.
-///\param	size - IN: User block size to be set, in bytes
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::setUserblock
+///\brief       Sets the user block size field of this file creation property list.
+///\param       size - IN: User block size to be set, in bytes
+///\exception   H5::PropListIException
 ///\par Description
-///		The default user block size is 0; it may be set to any power
-///		of 2 equal to 512 or greater (512, 1024, 2048, etc.)
-// Programmer	Binh-Minh Ribler - 2000
+///             The default user block size is 0; it may be set to any power
+///             of 2 equal to 512 or greater (512, 1024, 2048, etc.)
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::setUserblock( hsize_t size ) const
+void FileCreatPropList::setUserblock(hsize_t size) const
 {
-   herr_t ret_value = H5Pset_userblock( id, size);
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::setUserblock",
-		"H5Pset_userblock failed");
-   }
+    herr_t ret_value = H5Pset_userblock(id, size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setUserblock",
+            "H5Pset_userblock failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::getUserblock
-///\brief	Returns the user block size of this file creation property list.
-///\return	User block size
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileCreatPropList::getUserblock
+///\brief       Returns the user block size of this file creation property list.
+///\return      User block size
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 hsize_t FileCreatPropList::getUserblock() const
 {
-   hsize_t userblock_size;
-   herr_t ret_value = H5Pget_userblock( id, &userblock_size );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::getUserblock",
-		"H5Pget_userblock failed");
-   }
-   return( userblock_size );
+    hsize_t userblock_size;
+    herr_t ret_value = H5Pget_userblock(id, &userblock_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getUserblock",
+            "H5Pget_userblock failed");
+    }
+    return(userblock_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::setSizes
-///\brief	Sets the byte size of the offsets and lengths used to
-///		address objects in an HDF5 file.
-///\param	sizeof_addr - IN: Size of an object offset in bytes
-///\param	sizeof_size - IN: Size of an object length in bytes.
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::setSizes
+///\brief       Sets the byte size of the offsets and lengths used to
+///             address objects in an HDF5 file.
+///\param       sizeof_addr - IN: Size of an object offset in bytes
+///\param       sizeof_size - IN: Size of an object length in bytes.
+///\exception   H5::PropListIException
 ///\par Description
-///		For information on setting sizes, please refer to the
-///		C layer Reference Manual at:
+///             For information on setting sizes, please refer to the
+///             C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSizes
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::setSizes( size_t sizeof_addr, size_t sizeof_size ) const
+void FileCreatPropList::setSizes(size_t sizeof_addr, size_t sizeof_size) const
 {
-   herr_t ret_value = H5Pset_sizes( id, sizeof_addr, sizeof_size );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::setSizes",
-		"H5Pset_sizes failed");
-   }
+    herr_t ret_value = H5Pset_sizes(id, sizeof_addr, sizeof_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setSizes",
+            "H5Pset_sizes failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::getSizes
-///\brief	Retrieves the size of the offsets and lengths used in an
-///		HDF5 file.
+// Function:    FileCreatPropList::getSizes
+///\brief       Retrieves the size of the offsets and lengths used in an
+///             HDF5 file.
 ///
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::getSizes( size_t& sizeof_addr, size_t& sizeof_size ) const
+void FileCreatPropList::getSizes(size_t& sizeof_addr, size_t& sizeof_size) const
 {
-   herr_t ret_value = H5Pget_sizes( id, &sizeof_addr, &sizeof_size );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::getSizes",
-		"H5Pget_sizes failed");
-   }
+    herr_t ret_value = H5Pget_sizes(id, &sizeof_addr, &sizeof_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getSizes",
+            "H5Pget_sizes failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::setSymk
-///\brief	Sets the size of parameters used to control the symbol table
-///		nodes.
-///\param	ik - IN: Symbol table tree rank
-///\param	lk - IN: Symbol table node size
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::setSymk
+///\brief       Sets the size of parameters used to control the symbol table
+///             nodes.
+///\param       ik - IN: Symbol table tree rank
+///\param       lk - IN: Symbol table node size
+///\exception   H5::PropListIException
 ///\par Description
-///		For information, please see the C layer Reference Manual at:
+///             For information, please see the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSymK
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::setSymk( unsigned ik, unsigned lk ) const
+void FileCreatPropList::setSymk(unsigned ik, unsigned lk) const
 {
-   herr_t ret_value = H5Pset_sym_k( id, ik, lk );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::setSymk",
-		"H5Pset_sym_k failed");
-   }
+    herr_t ret_value = H5Pset_sym_k(id, ik, lk);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setSymk",
+            "H5Pset_sym_k failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::getSymk
-///\brief	Retrieves the size of the symbol table B-tree 1/2 rank and
-///		the symbol table leaf node 1/2 size.
+// Function:    FileCreatPropList::getSymk
+///\brief       Retrieves the size of the symbol table B-tree 1/2 rank and
+///             the symbol table leaf node 1/2 size.
 ///
-///\exception	H5::PropListIException
+///\exception   H5::PropListIException
 ///\par Description
-///		For information, please see
+///             For information, please see
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSymK
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::getSymk( unsigned& ik, unsigned& lk ) const
+void FileCreatPropList::getSymk(unsigned& ik, unsigned& lk) const
 {
-   herr_t ret_value = H5Pget_sym_k( id, &ik, &lk );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::getSymk",
-		"H5Pget_sym_k failed");
-   }
+    herr_t ret_value = H5Pget_sym_k(id, &ik, &lk);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getSymk",
+            "H5Pget_sym_k failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::setIstorek
-///\brief	Sets the size of the parameter used to control the B-trees
-///		for indexing chunked datasets.
-///\param	ik - IN: 1/2 rank of chunked storage B-tree
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::setIstorek
+///\brief       Sets the size of the parameter used to control the B-trees
+///             for indexing chunked datasets.
+///\param       ik - IN: 1/2 rank of chunked storage B-tree
+///\exception   H5::PropListIException
 ///\par Description
-///		For information, please see the C layer Reference Manual at:
+///             For information, please see the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetIstoreK
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FileCreatPropList::setIstorek( unsigned ik ) const
+void FileCreatPropList::setIstorek(unsigned ik) const
 {
-   herr_t ret_value = H5Pset_istore_k( id, ik );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::setIstorek",
-		"H5Pset_istore_k failed");
-   }
+    herr_t ret_value = H5Pset_istore_k(id, ik);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setIstorek",
+            "H5Pset_istore_k failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList::getIstorek
-///\brief	Returns the 1/2 rank of an indexed storage B-tree.
-///\return	1/2 rank of chunked storage B-tree
-///\exception	H5::PropListIException
+// Function:    FileCreatPropList::getIstorek
+///\brief       Returns the 1/2 rank of an indexed storage B-tree.
+///\return      1/2 rank of chunked storage B-tree
+///\exception   H5::PropListIException
 ///\par Description
-///		For information, please see
+///             For information, please see
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetIstoreK
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 unsigned FileCreatPropList::getIstorek() const
 {
-   unsigned ik;
-   herr_t ret_value = H5Pget_istore_k( id, &ik );
-   if( ret_value < 0 )
-   {
-      throw PropListIException("FileCreatPropList::getIstorek",
-		"H5Pget_istore_k failed");
-   }
-   return( ik );
+    unsigned ik;
+    herr_t ret_value = H5Pget_istore_k(id, &ik);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getIstorek",
+            "H5Pget_istore_k failed");
+    }
+    return(ik);
+}
+
+//--------------------------------------------------------------------------
+// Function:    FileCreatPropList::setFileSpaceStrategy
+///\brief       Sets the strategy and the threshold value that the library
+///             will employ in managing file space.
+///\param       strategy  - IN: Strategy for file space management
+///\param       persist   - IN: Whether to persist free-space
+///\param       threshold - IN: Free-space section threshold. The library
+///             default is 1, which is to track all free-space sections.
+///\exception   H5::PropListIException
+///\par Description
+///             If the given strategy is zero, the property will not be
+///             changed and the existing strategy will be retained.
+///             If the given threshold value is zero, the property will not be
+///             changed and the existing threshold will be retained.
+///             For information, please see the C layer Reference Manual at:
+/// https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFileSpace
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+void FileCreatPropList::setFileSpaceStrategy(H5F_fspace_strategy_t strategy, hbool_t persist, hsize_t threshold) const
+{
+    herr_t ret_value = H5Pset_file_space_strategy(id, strategy, persist, threshold);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setFileSpaceStrategy",
+            "H5Pset_file_space_strategy failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    FileCreatPropList::getFileSpaceStrategy
+///\brief       Retrieves the strategy, persist, and threshold that the library
+///             uses in managing file space.
+///\param       strategy  - OUT: Strategy for file space management
+///\param       persist   - OUT: Whether to persist free-space
+///\param       threshold - OUT: Free-space section threshold
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+void FileCreatPropList::getFileSpaceStrategy(H5F_fspace_strategy_t& strategy, hbool_t& persist, hsize_t& threshold) const
+{
+    herr_t ret_value = H5Pget_file_space_strategy(id, &strategy, &persist, &threshold);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getFileSpaceStrategy",
+            "H5Pget_file_space_strategy failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    FileCreatPropList::setFileSpacePagesize
+///\brief       Sets the file space page size for paged aggregation.
+///\param       fsp_psize - IN: Filespace's page size
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+void FileCreatPropList::setFileSpacePagesize(hsize_t fsp_psize) const
+{
+    herr_t ret_value = H5Pset_file_space_page_size(id, fsp_psize);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::setFileSpacePagesize",
+            "H5Pset_file_space_page_size failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    FileCreatPropList::getFileSpacePagesize
+///\brief       Returns the file space page size for aggregating small
+///             metadata or raw data.
+///\return      File space page size
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+hsize_t FileCreatPropList::getFileSpacePagesize() const
+{
+    hsize_t fsp_psize = 0;
+    herr_t ret_value = H5Pget_file_space_page_size(id, &fsp_psize);
+    if (ret_value < 0)
+    {
+        throw PropListIException("FileCreatPropList::getFileSpacePagesize",
+            "H5Pget_file_space_page_size failed");
+    }
+    return(fsp_psize);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FileCreatPropList destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FileCreatPropList destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileCreatPropList::~FileCreatPropList() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5FcreatProp.h b/c++/src/H5FcreatProp.h
index 5d81078..31a944c 100644
--- a/c++/src/H5FcreatProp.h
+++ b/c++/src/H5FcreatProp.h
@@ -6,90 +6,103 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5FileCreatPropList_H
 #define __H5FileCreatPropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class FileCreatPropList represents the HDF5 file create property list.
+/*! \class FileCreatPropList
+    \brief Class FileCreatPropList inherits from PropList and provides
+    wrappers for the HDF5 file create property list.
+*/
+//  Inheritance: PropList -> IdComponent
 class H5_DLLCPP FileCreatPropList : public PropList {
    public:
-	///\brief Default file creation property list.
-	static const FileCreatPropList& DEFAULT;
+        ///\brief Default file creation property list.
+        static const FileCreatPropList& DEFAULT;
 
-	// Creates a file create property list.
-	FileCreatPropList();
+        // 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;
+        // 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;
+        // Sets the userblock size field of a file creation property list.
+        void setUserblock(hsize_t size) const;
 
-	// Gets the size of a user block in this file creation property list.
-	hsize_t getUserblock() const;
+        // Gets the size of a user block in this file creation property list.
+        hsize_t getUserblock() const;
 
-	// Retrieves the size-of address and size quantities stored in a
-	// file according to this file creation property list.
-	void getSizes( size_t& sizeof_addr, size_t& sizeof_size ) const;
+        // Retrieves the size-of address and size quantities stored in a
+        // file according to this file creation property list.
+        void getSizes(size_t& sizeof_addr, size_t& sizeof_size) const;
 
-	// Sets file size-of addresses and sizes.
-	void setSizes( size_t sizeof_addr = 4, size_t sizeof_size = 4 ) const;
+        // Sets file size-of addresses and sizes.
+        void setSizes(size_t sizeof_addr = 4, size_t sizeof_size = 4) const;
 
-	// Retrieves the size of the symbol table B-tree 1/2 rank and the
-	// symbol table leaf node 1/2 size.
-	void getSymk( unsigned& int_nodes_k, unsigned& leaf_nodes_k ) const;
+        // Retrieves the size of the symbol table B-tree 1/2 rank and the
+        // symbol table leaf node 1/2 size.
+        void getSymk(unsigned& int_nodes_k, unsigned& leaf_nodes_k) const;
 
-	// Sets the size of parameters used to control the symbol table nodes.
-	void setSymk( unsigned int_nodes_k, unsigned leaf_nodes_k ) const;
+        // Sets the size of parameters used to control the symbol table nodes.
+        void setSymk(unsigned int_nodes_k, unsigned leaf_nodes_k) const;
 
-	// Returns the 1/2 rank of an indexed storage B-tree.
-	unsigned getIstorek() const;
+        // Returns the 1/2 rank of an indexed storage B-tree.
+        unsigned getIstorek() const;
 
-	// Sets the size of parameter used to control the B-trees for
-	// indexing chunked datasets.
-	void setIstorek( unsigned ik ) const;
+        // Sets the size of parameter used to control the B-trees for
+        // indexing chunked datasets.
+        void setIstorek(unsigned ik) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("FileCreatPropList"); }
+        // Sets the strategy and the threshold value that the library will
+        // will employ in managing file space.
+        void setFileSpaceStrategy(H5F_fspace_strategy_t strategy, hbool_t persist, hsize_t threshold) const;
 
-	// Copy constructor: creates a copy of a FileCreatPropList object.
-	FileCreatPropList(const FileCreatPropList& orig);
+        // Returns the strategy that the library uses in managing file space.
+        void getFileSpaceStrategy(H5F_fspace_strategy_t& strategy, hbool_t& persist, hsize_t& threshold) const;
 
-	// Creates a copy of an existing file create property list
-	// using the property list id.
-	FileCreatPropList (const hid_t plist_id);
+        // Sets the file space page size for paged aggregation.
+        void setFileSpacePagesize(hsize_t fsp_psize) const;
 
-	// Noop destructor
-	virtual ~FileCreatPropList();
+        // Returns the threshold value that the library uses in tracking free
+        // space sections.
+        hsize_t getFileSpacePagesize() const;
+
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass() const { return("FileCreatPropList"); }
+
+        // Copy constructor: creates a copy of a FileCreatPropList object.
+        FileCreatPropList(const FileCreatPropList& orig);
+
+        // Creates a copy of an existing file create property list
+        // using the property list id.
+        FileCreatPropList(const hid_t plist_id);
+
+        // Noop destructor
+        virtual ~FileCreatPropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
-	// Deletes the global constant, should only be used by the library
-	static void deleteConstants();
+        // Deletes the global constant, should only be used by the library
+        static void deleteConstants();
 
     private:
-	static FileCreatPropList* DEFAULT_;
+        static FileCreatPropList* DEFAULT_;
 
-	// Creates the global constant, should only be used by the library
-	static FileCreatPropList* getConstant();
+        // Creates the global constant, should only be used by the library
+        static FileCreatPropList* getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of FileCreatPropList
+} // namespace H5
+
 #endif // __H5FileCreatPropList_H
diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp
index 67dda34..3a0b54d 100644
--- a/c++/src/H5File.cpp
+++ b/c++/src/H5File.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -24,12 +22,14 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5FaccProp.h"
 #include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DxferProp.h"
 #include "H5DcreatProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5CommonFG.h"
 #include "H5Group.h"
 #include "H5AbstractDs.h"
@@ -38,83 +38,79 @@
 #include "H5File.h"
 #include "H5Alltypes.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
     using std::cerr;
     using std::endl;
-#endif  // H5_NO_STD
-#endif
 
 //--------------------------------------------------------------------------
-// Function	H5File default constructor
-///\brief	Default constructor: creates a stub H5File object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function     H5File default constructor
+///\brief       Default constructor: creates a stub H5File object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5File::H5File() : H5Location(), CommonFG(), id(H5I_INVALID_HID) {}
+H5File::H5File() : Group(), id(H5I_INVALID_HID) {}
 
 //--------------------------------------------------------------------------
-// Function:	H5File overloaded constructor
-///\brief	Creates or opens an HDF5 file depending on the parameter flags.
-///\param	name         - IN: Name of the file
-///\param	flags        - IN: File access flags
-///\param	create_plist - IN: File creation property list, used when
-///		modifying default file meta-data.  Default to
-///		FileCreatPropList::DEFAULT
-///\param	access_plist - IN: File access property list.  Default to
-///		FileAccPropList::DEFAULT
+// Function:    H5File overloaded constructor
+///\brief       Creates or opens an HDF5 file depending on the parameter flags.
+///\param       name         - IN: Name of the file
+///\param       flags        - IN: File access flags
+///\param       create_plist - IN: File creation property list, used when
+///             modifying default file meta-data.  Default to
+///             FileCreatPropList::DEFAULT
+///\param       access_plist - IN: File access property list.  Default to
+///             FileAccPropList::DEFAULT
 ///\par Description
-///		Valid values of \a flags include:
-///		\li \c H5F_ACC_TRUNC - Truncate file, if it already exists,
-///				       erasing all data previously stored in
-///				       the file.
-///		\li \c H5F_ACC_EXCL - Fail if file already exists.
-///			\c H5F_ACC_TRUNC and \c H5F_ACC_EXCL are mutually exclusive
-///		\li \c H5F_ACC_RDONLY - Open file as read-only, if it already
-///					exists, and fail, otherwise
-///		\li \c H5F_ACC_RDWR - Open file for read/write, if it already
-///					exists, and fail, otherwise
+///             Valid values of \a flags include:
+///             \li \c H5F_ACC_TRUNC - Truncate file, if it already exists,
+///                             erasing all data previously stored in
+///                             the file.
+///             \li \c H5F_ACC_EXCL - Fail if file already exists.
+///                 \c H5F_ACC_TRUNC and \c H5F_ACC_EXCL are mutually exclusive
+///             \li \c H5F_ACC_RDONLY - Open file as read-only, if it already
+///                             exists, and fail, otherwise
+///             \li \c H5F_ACC_RDWR - Open file for read/write, if it already
+///                             exists, and fail, otherwise
 ///\par
-///		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:
+///             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:
 /// 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
-// Programmer	Binh-Minh Ribler - 2000
+// 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
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5File::H5File( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) : H5Location(), CommonFG(), id(H5I_INVALID_HID)
+H5File::H5File(const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist) : Group(), id(H5I_INVALID_HID)
 {
     try {
-	p_get_file(name, flags, create_plist, access_plist);
-    } catch (FileIException open_file) {
-	throw open_file;
+        p_get_file(name, flags, create_plist, access_plist);
+    } catch (FileIException& open_file) {
+        throw open_file;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File overloaded constructor
-///\brief	This is another overloaded constructor.  It differs from the
-///		above constructor only in the type of the \a name argument.
-///\param	name - IN: Name of the file - \c H5std_string
-///\param	flags - IN: File access flags
-///\param	create_plist - IN: File creation property list, used when
-///		modifying default file meta-data.  Default to
-///		FileCreatPropList::DEFAULT
-///\param	access_plist - IN: File access property list.  Default to
-///		FileAccPropList::DEFAULT
-// 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
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-H5File::H5File( const H5std_string& name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) : H5Location(), CommonFG(), id(H5I_INVALID_HID)
+// Function:    H5File overloaded constructor
+///\brief       This is another overloaded constructor.  It differs from the
+///             above constructor only in the type of the \a name argument.
+///\param       name - IN: Name of the file - \c H5std_string
+///\param       flags - IN: File access flags
+///\param       create_plist - IN: File creation property list, used when
+///             modifying default file meta-data.  Default to
+///             FileCreatPropList::DEFAULT
+///\param       access_plist - IN: File access property list.  Default to
+///             FileAccPropList::DEFAULT
+// 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
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+H5File::H5File(const H5std_string& name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist) : Group(), id(H5I_INVALID_HID)
 {
     try {
-	p_get_file(name.c_str(), flags, create_plist, access_plist);
-    } catch (FileIException open_file) {
-	throw open_file;
+        p_get_file(name.c_str(), flags, create_plist, access_plist);
+    } catch (FileIException& open_file) {
+        throw open_file;
     }
 }
 
@@ -122,51 +118,51 @@ H5File::H5File( const H5std_string& name, unsigned int flags, const FileCreatPro
 //--------------------------------------------------------------------------
 // This function is private and contains common code between the
 // constructors taking a string or a char*
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- removed H5F_ACC_CREAT because H5Fcreate will fail with
-//		H5F_ACC_CREAT. - BMR, Sep 17, 2014
+//              - removed H5F_ACC_CREAT because H5Fcreate will fail with
+//              H5F_ACC_CREAT. - BMR, Sep 17, 2014
 //--------------------------------------------------------------------------
 void H5File::p_get_file(const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist)
 {
     // These bits only set for creation, so if any of them are set,
     // create the file.
-    if( flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC))
+    if (flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC))
     {
-	hid_t create_plist_id = create_plist.getId();
-	hid_t access_plist_id = access_plist.getId();
-	id = H5Fcreate( name, flags, create_plist_id, access_plist_id );
-	if( id < 0 )  // throw an exception when open/create fail
-	{
-	    throw FileIException("H5File constructor", "H5Fcreate failed");
-	}
+        hid_t create_plist_id = create_plist.getId();
+        hid_t access_plist_id = access_plist.getId();
+        id = H5Fcreate(name, flags, create_plist_id, access_plist_id);
+        if (id < 0)  // throw an exception when open/create fail
+        {
+            throw FileIException("H5File constructor", "H5Fcreate failed");
+        }
     }
     // Open the file if none of the bits above are set.
     else
     {
-	hid_t access_plist_id = access_plist.getId();
-	id = H5Fopen( name, flags, access_plist_id );
-	if( id < 0 )  // throw an exception when open/create fail
-	{
-	    throw FileIException("H5File constructor", "H5Fopen failed");
-	}
+        hid_t access_plist_id = access_plist.getId();
+        id = H5Fopen(name, flags, access_plist_id);
+        if (id < 0)  // throw an exception when open/create fail
+        {
+            throw FileIException("H5File constructor", "H5Fopen failed");
+        }
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File overloaded constructor
-///\brief	Creates an H5File object using an existing file id.
-///\param	existing_id - IN: Id of an existing file
-// Programmer	Binh-Minh Ribler - 2015
+// Function:    H5File overloaded constructor
+///\brief       Creates an H5File object using an existing file id.
+///\param       existing_id - IN: Id of an existing file
+// Programmer   Binh-Minh Ribler - 2015
 // Description
-//	Mar 29, 2015
-//		Added in responding to a request from user Jason Newton.
-//		However, it is not recommended to use the private member "id"
-//		in applications.  Unlike other situations, where similar
-//		constructor is needed by the library in order to return
-//		an object, H5File doesn't need it. -BMR (HDFFV-8766 partially)
-//--------------------------------------------------------------------------
-H5File::H5File(hid_t existing_id) : H5Location(), CommonFG()
+//      Mar 29, 2015
+//              Added in responding to a request from user Jason Newton.
+//              However, it is not recommended to use the private member "id"
+//              in applications.  Unlike other situations, where similar
+//              constructor is needed by the library in order to return
+//              an object, H5File doesn't need it. -BMR (HDFFV-8766 partially)
+//--------------------------------------------------------------------------
+H5File::H5File(hid_t existing_id) : Group()
 {
     id = existing_id;
     incRefCount(); // increment number of references to this id
@@ -175,77 +171,77 @@ H5File::H5File(hid_t existing_id) : H5Location(), CommonFG()
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5File copy constructor
-///\brief	Copy constructor: makes a copy of the original
-///		H5File object.
-///\param	original - IN: H5File instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File copy constructor
+///\brief       Copy constructor: makes a copy of the original
+///             H5File object.
+///\param       original - IN: H5File instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5File::H5File(const H5File& original) : H5Location(), CommonFG()
+H5File::H5File(const H5File& original) : Group()
 {
     id = original.getId();
     incRefCount(); // increment number of references to this id
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::isHdf5 (static)
-///\brief	Determines whether a file in HDF5 format. (Static)
-///\param	name - IN: Name of the file
-///\return	true if the file is in HDF5 format, and false, otherwise
-///\exception	H5::FileIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File::isHdf5 (static)
+///\brief       Determines whether a file in HDF5 format. (Static)
+///\param       name - IN: Name of the file
+///\return      true if the file is in HDF5 format, and false, otherwise
+///\exception   H5::FileIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 bool H5File::isHdf5(const char* name)
 {
-   // Calls C routine H5Fis_hdf5 to determine whether the file is in
-   // HDF5 format.  It returns positive value, 0, or negative value
-   htri_t ret_value = H5Fis_hdf5( name );
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else // Raise exception when H5Fis_hdf5 returns a negative value
-   {
-      throw FileIException("H5File::isHdf5", "H5Fis_hdf5 returned negative value");
-   }
+    // Calls C routine H5Fis_hdf5 to determine whether the file is in
+    // HDF5 format.  It returns positive value, 0, or negative value
+    htri_t ret_value = H5Fis_hdf5(name);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Fis_hdf5 returns a negative value
+    {
+        throw FileIException("H5File::isHdf5", "H5Fis_hdf5 returned negative value");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::isHdf5 (static)
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes an \c H5std_string for \a name. (Static)
-///\param	name - IN: Name of the file - \c H5std_string
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File::isHdf5 (static)
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes an \c H5std_string for \a name. (Static)
+///\param       name - IN: Name of the file - \c H5std_string
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-bool H5File::isHdf5(const H5std_string& name )
+bool H5File::isHdf5(const H5std_string& name)
 {
-   return( isHdf5( name.c_str()) );
+   return(isHdf5( name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	openFile
-///\brief	Opens an HDF5 file
-///\param	name         - IN: Name of the file
-///\param	flags        - IN: File access flags
-///\param	access_plist - IN: File access property list.  Default to
-///		FileAccPropList::DEFAULT
+// Function:    openFile
+///\brief       Opens an HDF5 file
+///\param       name         - IN: Name of the file
+///\param       flags        - IN: File access flags
+///\param       access_plist - IN: File access property list.  Default to
+///             FileAccPropList::DEFAULT
 ///\par Description
-///		Valid values of \a flags include:
-///		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.
+///             Valid values of \a flags include:
+///             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
+///             H5F_ACC_RDONLY: Open with read only access. - default
 ///
-// Programmer	Binh-Minh Ribler - Oct, 2005
+// Programmer   Binh-Minh Ribler - Oct, 2005
 //--------------------------------------------------------------------------
 void H5File::openFile(const char* name, unsigned int flags, const FileAccPropList& access_plist)
 {
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw FileIException("H5File::openFile", close_error.getDetailMsg());
     }
 
@@ -253,19 +249,19 @@ void H5File::openFile(const char* name, unsigned int flags, const FileAccPropLis
     id = H5Fopen (name, flags, access_plist_id);
     if (id < 0)  // throw an exception when open fails
     {
-	throw FileIException("H5File::openFile", "H5Fopen failed");
+        throw FileIException("H5File::openFile", "H5Fopen failed");
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::openFile
-///\brief	This is an overloaded member function, provided for convenience.
-///		It takes an \c H5std_string for \a name.
-///\param	name         - IN: Name of the file - \c H5std_string
-///\param	flags        - IN: File access flags
-///\param	access_plist - IN: File access property list.  Default to
-///		FileAccPropList::DEFAULT
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File::openFile
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes an \c H5std_string for \a name.
+///\param       name         - IN: Name of the file - \c H5std_string
+///\param       flags        - IN: File access flags
+///\param       access_plist - IN: File access property list.  Default to
+///             FileAccPropList::DEFAULT
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5File::openFile(const H5std_string& name, unsigned int flags, const FileAccPropList& access_plist)
 {
@@ -273,154 +269,173 @@ void H5File::openFile(const H5std_string& name, unsigned int flags, const FileAc
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::reOpen
-///\brief	Reopens this file.
+// Function:    H5File::reOpen
+///\brief       Reopens this file.
 ///
-///\exception	H5::FileIException
+///\exception   H5::FileIException
 // Description
-//		If this object has represented another HDF5 file, the previous
-//		HDF5 file need to be closed first.
-// Programmer	Binh-Minh Ribler - 2000
+//              If this object has represented another HDF5 file, the previous
+//              HDF5 file need to be closed first.
+// Programmer   Binh-Minh Ribler - 2000
 // Note:        This wrapper doesn't seem right regarding the 'id' and should
 //              be investigated.  BMR - 2/20/2005
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Feb 20, 2005
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Feb 20, 2005
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 void H5File::reOpen()
 {
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw FileIException("H5File::reOpen", close_error.getDetailMsg());
     }
 
-   // call C routine to reopen the file - Note: not sure about this,
-   // which id to be the parameter when closing?
-   id = H5Freopen( id );
-   if( id < 0 ) // Raise exception when H5Freopen returns a neg value
-      throw FileIException("H5File::reOpen", "H5Freopen failed");
+    // call C routine to reopen the file - Note: not sure about this,
+    // which id to be the parameter when closing?
+    id = H5Freopen(id);
+    if (id < 0) // Raise exception when H5Freopen returns a neg value
+        throw FileIException("H5File::reOpen", "H5Freopen failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getCreatePlist
-///\brief	Returns the creation property list of this file
-///\return	FileCreatPropList object
-///\exception	H5::FileIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File::getCreatePlist
+///\brief       Returns the creation property list of this file
+///\return      FileCreatPropList object
+///\exception   H5::FileIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileCreatPropList H5File::getCreatePlist() const
 {
-   hid_t create_plist_id = H5Fget_create_plist( id );
-
-   // if H5Fget_create_plist returns a valid id, create and return
-   // the FileCreatPropList object for this property list
-   if( create_plist_id > 0 )
-   {
-      FileCreatPropList create_plist( create_plist_id );
-      return( create_plist );
-   }
-   else
-   {
-      throw FileIException("H5File::getCreatePlist", "H5Fget_create_plist failed");
-   }
+    hid_t create_plist_id = H5Fget_create_plist(id);
+
+    // if H5Fget_create_plist returns a valid id, create and return
+    // the FileCreatPropList object for this property list
+    if (create_plist_id > 0)
+    {
+      FileCreatPropList create_plist(create_plist_id);
+      return(create_plist);
+    }
+    else
+    {
+        throw FileIException("H5File::getCreatePlist", "H5Fget_create_plist failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getAccessPlist
-///\brief	Returns the access property list of this file
-///\return	FileAccPropList object
-///\exception	H5::FileIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File::getAccessPlist
+///\brief       Returns the access property list of this file
+///\return      FileAccPropList object
+///\exception   H5::FileIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FileAccPropList H5File::getAccessPlist() const
 {
-   hid_t access_plist_id = H5Fget_access_plist( id );
+    hid_t access_plist_id = H5Fget_access_plist(id);
 
-   // if H5Fget_access_plist returns a valid id, create and return
-   // the FileAccPropList object for this property list
-   if( access_plist_id > 0 )
-   {
-      FileAccPropList access_plist( access_plist_id );
+    // if H5Fget_access_plist returns a valid id, create and return
+    // the FileAccPropList object for this property list
+    if (access_plist_id > 0)
+    {
+      FileAccPropList access_plist(access_plist_id);
       return access_plist;
-   }
-   else // Raise an exception
-   {
-      throw FileIException("H5File::getAccessPlist", "H5Fget_access_plist failed");
-   }
+    }
+    else // Raise an exception
+    {
+        throw FileIException("H5File::getAccessPlist", "H5Fget_access_plist failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getFreeSpace
-///\brief	Returns the amount of free space in the file.
-///\return	Amount of free space
-///\exception	H5::FileIException
+// Function:    H5File::getFileInfo
+///\brief       Retrieves the general information of this file.
+///
+///\exception   H5::FileIException
+///\par Description
+///             The retrieved information may include information about
+///             superblock extension, free space management, and shared object
+// Programmer   Binh-Minh Ribler - February 2017
+//--------------------------------------------------------------------------
+void H5File::getFileInfo(H5F_info2_t& file_info) const
+{
+    herr_t ret_value = H5Fget_info2(id, &file_info);
+    if (ret_value < 0)
+    {
+        throw FileIException("H5File::getFileInfo", "H5Fget_info2 failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5File::getFreeSpace
+///\brief       Returns the amount of free space in the file.
+///\return      Amount of free space
+///\exception   H5::FileIException
 // Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
 hssize_t H5File::getFreeSpace() const
 {
-   hssize_t free_space = H5Fget_freespace(id);
-   if( free_space < 0 )
-   {
-      throw FileIException("H5File::getFreeSpace", "H5Fget_freespace failed");
-   }
-   return (free_space);
+    hssize_t free_space = H5Fget_freespace(id);
+    if (free_space < 0)
+    {
+        throw FileIException("H5File::getFreeSpace", "H5Fget_freespace failed");
+    }
+    return (free_space);
 }
 
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getObjCount
-///\brief	Returns the number of opened object IDs (files, datasets,
-///		groups and datatypes) in the same file.
-///\param	types - Type of object to retrieve the count
-///\return	Number of opened object IDs
-///\exception	H5::FileIException
+// Function:    H5File::getObjCount
+///\brief       Returns the number of opened object IDs (files, datasets,
+///             groups and datatypes) in the same file.
+///\param       types - Type of object to retrieve the count
+///\return      Number of opened object IDs
+///\exception   H5::FileIException
 ///\par Description
-///		The valid values for \a types include:
-///		\li \c H5F_OBJ_FILE	- Files only
-///		\li \c H5F_OBJ_DATASET	- Datasets only
-///		\li \c H5F_OBJ_GROUP	- Groups only
-///		\li \c H5F_OBJ_DATATYPE	- Named datatypes only
-///		\li \c H5F_OBJ_ATTR	- Attributes only
-///		\li \c H5F_OBJ_ALL    - All of the above, i.e., \c H5F_OBJ_FILE
-///					| \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP
-///					| \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR
+///             The valid values for \a types include:
+///             \li \c H5F_OBJ_FILE     - Files only
+///             \li \c H5F_OBJ_DATASET  - Datasets only
+///             \li \c H5F_OBJ_GROUP    - Groups only
+///             \li \c H5F_OBJ_DATATYPE - Named datatypes only
+///             \li \c H5F_OBJ_ATTR     - Attributes only
+///             \li \c H5F_OBJ_ALL    - All of the above, i.e., \c H5F_OBJ_FILE
+///                         | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP
+///                         | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR
 ///\par
 /// Multiple object types can be combined with the logical OR operator (|).
 // Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
 ssize_t H5File::getObjCount(unsigned types) const
 {
-   ssize_t num_objs = H5Fget_obj_count(id, types);
-   if( num_objs < 0 )
-   {
-      throw FileIException("H5File::getObjCount", "H5Fget_obj_count failed");
-   }
-   return (num_objs);
+    ssize_t num_objs = H5Fget_obj_count(id, types);
+    if (num_objs < 0)
+    {
+        throw FileIException("H5File::getObjCount", "H5Fget_obj_count failed");
+    }
+    return (num_objs);
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getObjIDs
-///\brief	Retrieves a list of opened object IDs (files, datasets,
-///		groups and datatypes) in the same file.
-///\param	types    - Type of object to retrieve the count
-///\param	max_objs - Maximum number of object identifiers to place
-///			   into obj_id_list.
-///\param	oid_list - List of open object identifiers
-///\exception	H5::FileIException
+// Function:    H5File::getObjIDs
+///\brief       Retrieves a list of opened object IDs (files, datasets,
+///             groups and datatypes) in the same file.
+///\param       types    - Type of object to retrieve the count
+///\param       max_objs - Maximum number of object identifiers to place
+///                        into obj_id_list.
+///\param       oid_list - List of open object identifiers
+///\exception   H5::FileIException
 ///\par Description
-///		The valid values for \a types include:
-///		\li \c H5F_OBJ_FILE	- Files only
-///		\li \c H5F_OBJ_DATASET	- Datasets only
-///		\li \c H5F_OBJ_GROUP	- Groups only
-///		\li \c H5F_OBJ_DATATYPE	- Named datatypes only
-///		\li \c H5F_OBJ_ATTR	- Attributes only
-///		\li \c H5F_OBJ_ALL    - All of the above, i.e., \c H5F_OBJ_FILE
-///					| \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP
-///					| \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR
+///             The valid values for \a types include:
+///             \li \c H5F_OBJ_FILE - Files only
+///             \li \c H5F_OBJ_DATASET - Datasets only
+///             \li \c H5F_OBJ_GROUP - Groups only
+///             \li \c H5F_OBJ_DATATYPE - Named datatypes only
+///             \li \c H5F_OBJ_ATTR - Attributes only
+///             \li \c H5F_OBJ_ALL    - All of the above, i.e., \c H5F_OBJ_FILE
+///                     | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP
+///                     | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR
 ///\par
 /// Multiple object types can be combined with the logical OR operator (|).
 //
@@ -429,156 +444,161 @@ ssize_t H5File::getObjCount(unsigned types) const
 //--------------------------------------------------------------------------
 void H5File::getObjIDs(unsigned types, size_t max_objs, hid_t *oid_list) const
 {
-   ssize_t ret_value = H5Fget_obj_ids(id, types, max_objs, oid_list);
-   if( ret_value < 0 )
-   {
-      throw FileIException("H5File::getObjIDs", "H5Fget_obj_ids failed");
-   }
+    ssize_t ret_value = H5Fget_obj_ids(id, types, max_objs, oid_list);
+    if (ret_value < 0)
+    {
+        throw FileIException("H5File::getObjIDs", "H5Fget_obj_ids failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getVFDHandle
-///\brief	Returns the pointer to the file handle of the low-level file
-///		driver.
-///\param	fapl        - File access property list
-///\param	file_handle - Pointer to the file handle being used by
-///			      the low-level virtual file driver
-///\exception	H5::FileIException
+// Function:    H5File::getVFDHandle
+///\brief       Returns the pointer to the file handle of the low-level file
+///             driver.
+///\param       fapl        - File access property list
+///\param       file_handle - Pointer to the file handle being used by
+///                           the low-level virtual file driver
+///\exception   H5::FileIException
 ///\par Description
-///		For the \c FAMILY or \c MULTI drivers, \a fapl should be
-///		defined through the property list functions:
-///		\c FileAccPropList::setFamilyOffset for the \c FAMILY driver
-///		and \c FileAccPropList::setMultiType for the \c MULTI driver.
+///             For the \c FAMILY or \c MULTI drivers, \a fapl should be
+///             defined through the property list functions:
+///             \c FileAccPropList::setFamilyOffset for the \c FAMILY driver
+///             and \c FileAccPropList::setMultiType for the \c MULTI driver.
 ///
-///		The obtained file handle is dynamic and is valid only while
-///		the file remains open; it will be invalid if the file is
-///		closed and reopened or opened during a subsequent session.
+///             The obtained file handle is dynamic and is valid only while
+///             the file remains open; it will be invalid if the file is
+///             closed and reopened or opened during a subsequent session.
 // Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
 void H5File::getVFDHandle(const FileAccPropList& fapl, void **file_handle) const
 {
-   hid_t fapl_id = fapl.getId();
-   herr_t ret_value = H5Fget_vfd_handle(id, fapl_id, file_handle);
-   if( ret_value < 0 )
-   {
-      throw FileIException("H5File::getVFDHandle", "H5Fget_vfd_handle failed");
-   }
+    hid_t fapl_id = fapl.getId();
+    herr_t ret_value = H5Fget_vfd_handle(id, fapl_id, file_handle);
+    if (ret_value < 0)
+    {
+        throw FileIException("H5File::getVFDHandle", "H5Fget_vfd_handle failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getVFDHandle
-// Purpose	This is an overloaded member function, kept for backward
-//		compatibility.  It differs from the above function in that it
-//		misses const's.  This wrapper will be removed in future release.
-// Param 	fapl        - File access property list
-// Param 	file_handle - Pointer to the file handle being used by
-//			      the low-level virtual file driver
-// Exception	H5::FileIException
+// Function:    H5File::getVFDHandle
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Param        fapl        - File access property list
+// Param        file_handle - Pointer to the file handle being used by
+//                            the low-level virtual file driver
+// Exception    H5::FileIException
 // Programmer   Binh-Minh Ribler - May 2004
 // Modification
-//		Planned for removal. -BMR, 2014/04/16
-//		Removed from documentation. -BMR, 2016/03/07
-//--------------------------------------------------------------------------
-void H5File::getVFDHandle(FileAccPropList& fapl, void **file_handle) const
-{
-    getVFDHandle((const FileAccPropList)fapl, file_handle);
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5File::getVFDHandle
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function only in what arguments it
-///		accepts.
-///\param	file_handle - Pointer to the file handle being used by
-///			      the low-level virtual file driver
-///\exception	H5::FileIException
+//              Planned for removal. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
+//--------------------------------------------------------------------------
+//void H5File::getVFDHandle(FileAccPropList& fapl, void **file_handle) const
+//{
+//    getVFDHandle((const FileAccPropList)fapl, file_handle);
+//}
+
+//--------------------------------------------------------------------------
+// Function:    H5File::getVFDHandle
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       file_handle - Pointer to the file handle being used by
+///                     the low-level virtual file driver
+///\exception   H5::FileIException
 // Programmer   Binh-Minh Ribler - May 2004
 //--------------------------------------------------------------------------
 void H5File::getVFDHandle(void **file_handle) const
 {
-   herr_t ret_value = H5Fget_vfd_handle(id, H5P_DEFAULT, file_handle);
-   if( ret_value < 0 )
-   {
-      throw FileIException("H5File::getVFDHandle", "H5Fget_vfd_handle failed");
-   }
+    herr_t ret_value = H5Fget_vfd_handle(id, H5P_DEFAULT, file_handle);
+    if (ret_value < 0)
+    {
+        throw FileIException("H5File::getVFDHandle", "H5Fget_vfd_handle failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getFileSize
-///\brief	Returns the file size of the HDF5 file.
-///\return	File size
-///\exception	H5::FileIException
+// Function:    H5File::getFileSize
+///\brief       Returns the file size of the HDF5 file.
+///\return      File size
+///\exception   H5::FileIException
 ///\par Description
-///		This function is called after an existing file is opened in
-///		order to learn the true size of the underlying file.
+///             This function is called after an existing file is opened in
+///             order to learn the true size of the underlying file.
 // Programmer   Raymond Lu - June 24, 2004
 //--------------------------------------------------------------------------
 hsize_t H5File::getFileSize() const
 {
-   hsize_t file_size;
-   herr_t ret_value = H5Fget_filesize(id, &file_size);
-   if (ret_value < 0)
-   {
-      throw FileIException("H5File::getFileSize", "H5Fget_filesize failed");
-   }
-   return (file_size);
+    hsize_t file_size;
+    herr_t ret_value = H5Fget_filesize(id, &file_size);
+    if (ret_value < 0)
+    {
+        throw FileIException("H5File::getFileSize", "H5Fget_filesize failed");
+    }
+    return (file_size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getId
-///\brief	Get the id of this file
-///\return	File identifier
-// Modification:
-//	May 2008 - BMR
-//		Class hierarchy is revised to address bugzilla 1068.  Class
-//		AbstractDS and Attribute are moved out of H5Object.  In
-//		addition, member IdComponent::id is moved into subclasses, and
-//		IdComponent::getId now becomes pure virtual function.
-// Programmer	Binh-Minh Ribler - May, 2008
+// Function:    H5File::getId
+///\brief       Get the id of this file
+///\return      File identifier
+// Modification
+//      May 2008 - BMR
+//              Class hierarchy is revised to address bugzilla 1068.  Class
+//              AbstractDS and Attribute are moved out of H5Object.  In
+//              addition, member IdComponent::id is moved into subclasses, and
+//              IdComponent::getId now becomes pure virtual function.
+// Programmer   Binh-Minh Ribler - May, 2008
 //--------------------------------------------------------------------------
 hid_t H5File::getId() const
 {
-   return(id);
+    return(id);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	H5File::reopen
-// Purpose:	Reopens this file.
-// Exception	H5::FileIException
+// Function:    H5File::reopen
+// Purpose      Reopens this file.
+// Exception    H5::FileIException
 // Description
-//		This function is replaced by the above function reOpen.
-// Programmer	Binh-Minh Ribler - 2000
+//              This function is replaced by the above function reOpen.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5File::reopen()
 {
-   H5File::reOpen();
+    H5File::reOpen();
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::getLocId
-// Purpose:	Get the id of this file
+// Function:    H5File::getLocId
+// Purpose      Get the id of this file
 // Description
-//		This function is a redefinition of CommonFG::getLocId.  It
-//		is used by CommonFG member functions to get the file id.
-// Programmer	Binh-Minh Ribler - 2000
+//              This function is a redefinition of CommonFG::getLocId.  It
+//              is used by CommonFG member functions to get the file id.
+// Programmer   Binh-Minh Ribler - 2000
+// Deprecated:
+//      Aug 18, 2016 -BMR
+//              After HDFFV-9920, the Group's methods can use getId() and
+//              getLocId() is kept for backward compatibility.
 //--------------------------------------------------------------------------
 hid_t H5File::getLocId() const
 {
-   return( getId() );
+    return(getId());
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::p_setId (protected)
-///\brief	Sets the identifier of this object to a new value.
+// Function:    H5File::p_setId (protected)
+///\brief       Sets the identifier of this object to a new value.
 ///
-///\exception	H5::IdComponentException when the attempt to close the HDF5
-///		object fails
-// Description:
-//		The underlaying reference counting in the C library ensures
-//		that the current valid id of this object is properly closed.
-//		Then the object's id is reset to the new id.
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::IdComponentException when the attempt to close the HDF5
+///             object fails
+// Description
+//              The underlaying reference counting in the C library ensures
+//              that the current valid id of this object is properly closed.
+//              Then the object's id is reset to the new id.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5File::p_setId(const hid_t new_id)
 {
@@ -586,75 +606,72 @@ void H5File::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception E) {
+    catch (Exception& E) {
         throw FileIException("H5File::p_setId", E.getDetailMsg());
     }
-   // reset object's id to the given id
-   id = new_id;
+    // reset object's id to the given id
+    id = new_id;
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5File::close
-///\brief	Closes this HDF5 file.
+// Function:    H5File::close
+///\brief       Closes this HDF5 file.
 ///
-///\exception	H5::FileIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::FileIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void H5File::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Fclose( id );
-	if( ret_value < 0 )
-	{
-	    throw FileIException("H5File::close", "H5Fclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Fclose(id);
+        if (ret_value < 0)
+        {
+            throw FileIException("H5File::close", "H5Fclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File::throwException
-///\brief	Throws file exception - initially implemented for CommonFG
-///\param	func_name - Name of the function where failure occurs
-///\param	msg       - Message describing the failure
-///\exception	H5::FileIException
+// Function:    H5File::throwException
+///\brief       Throws file exception - initially implemented for CommonFG
+///\param       func_name - Name of the function where failure occurs
+///\param       msg       - Message describing the failure
+///\exception   H5::FileIException
 // Description
-// 		This function is used in CommonFG implementation so that
-//		proper exception can be thrown for file or group.  The
-//		argument func_name is a member of CommonFG and "H5File::"
-//		will be inserted to indicate the function called is an
-//		implementation of H5File.
-// Programmer	Binh-Minh Ribler - 2000
+//              This function is also used in H5Location implementation so that
+//              proper exception can be thrown for file or group.  The
+//              "H5File::" will be inserted to indicate the function called is
+//              an implementation of H5File.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5File::throwException(const H5std_string& func_name, const H5std_string& msg) const
 {
-   H5std_string full_name = func_name;
-   full_name.insert(0, "H5File::");
-   throw FileIException(full_name, msg);
+    H5std_string full_name = func_name;
+    full_name.insert(0, "H5File::");
+    throw FileIException(full_name, msg);
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5File destructor
-///\brief	Properly terminates access to this file.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5File destructor
+///\brief       Properly terminates access to this file.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Feb 20, 2005
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Feb 20, 2005
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 H5File::~H5File()
 {
     try {
-	close();
-    } catch (Exception close_error) {
-	cerr << "H5File::~H5File - " << close_error.getDetailMsg() << endl;
+        close();
+    } catch (Exception& close_error) {
+        cerr << "H5File::~H5File - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5File.h b/c++/src/H5File.h
index 939ac8e..214feb0 100644
--- a/c++/src/H5File.h
+++ b/c++/src/H5File.h
@@ -6,122 +6,121 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5File_H
 #define __H5File_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class H5File
-    \brief Class H5File represents an HDF5 file.
-
-    It inherits from H5Location and CommonFG.
+    \brief Class H5File represents an HDF5 file and inherits from class Group
+    as file is a root group.
 */
-class H5_DLLCPP H5File : public H5Location, public CommonFG {
+//  Inheritance: Group -> CommonFG/H5Object -> H5Location -> IdComponent
+class H5_DLLCPP H5File : public Group {
    public:
-	// Creates or opens an HDF5 file.
-	H5File( const char* name, unsigned int flags,
-	   const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT,
-	   const FileAccPropList& access_plist = FileAccPropList::DEFAULT );
-	H5File( const H5std_string& name, unsigned int flags,
-	   const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT,
-	   const FileAccPropList& access_plist = FileAccPropList::DEFAULT );
+        // Creates or opens an HDF5 file.
+        H5File(const char* name, unsigned int flags,
+           const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT,
+           const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
+        H5File(const H5std_string& name, unsigned int flags,
+           const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT,
+           const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
 
-	// Open the file
-	void openFile(const H5std_string& name, unsigned int flags,
-	    const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
-	void openFile(const char* name, unsigned int flags,
-	    const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
+        // Open the file
+        void openFile(const H5std_string& name, unsigned int flags,
+            const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
+        void openFile(const char* name, unsigned int flags,
+            const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
 
-	// Close this file.
-	virtual void close();
+        // Close this file.
+        virtual void close();
 
-	// Gets the access property list of this file.
-	FileAccPropList getAccessPlist() const;
+        // Gets the access property list of this file.
+        FileAccPropList getAccessPlist() const;
 
-	// Gets the creation property list of this file.
-	FileCreatPropList getCreatePlist() const;
+        // Gets the creation property list of this file.
+        FileCreatPropList getCreatePlist() const;
 
-	// Retrieves the file size of an opened file.
-	hsize_t getFileSize() const;
+        // Gets general information about this file.
+        void getFileInfo(H5F_info2_t& file_info) const;
 
-	// Returns the amount of free space in the file.
-	hssize_t getFreeSpace() const;
+        // Returns the amount of free space in the file.
+        hssize_t getFreeSpace() const;
 
-	// Returns the number of opened object IDs (files, datasets, groups
-	// and datatypes) in the same file.
-	ssize_t getObjCount(unsigned types = H5F_OBJ_ALL) const;
+        // Returns the number of opened object IDs (files, datasets, groups
+        // and datatypes) in the same file.
+        ssize_t getObjCount(unsigned types = H5F_OBJ_ALL) const;
 
-	// Retrieves a list of opened object IDs (files, datasets, groups
-	// and datatypes) in the same file.
-	void getObjIDs(unsigned types, size_t max_objs, hid_t *oid_list) const;
+        // Retrieves a list of opened object IDs (files, datasets, groups
+        // and datatypes) in the same file.
+        void getObjIDs(unsigned types, size_t max_objs, hid_t *oid_list) const;
 
-	// Returns the pointer to the file handle of the low-level file driver.
-	void getVFDHandle(void **file_handle) const;
-	void getVFDHandle(const FileAccPropList& fapl, void **file_handle) const;
-	void getVFDHandle(FileAccPropList& fapl, void **file_handle) const; // kept for backward compatibility
+        // Returns the pointer to the file handle of the low-level file driver.
+        void getVFDHandle(void **file_handle) const;
+        void getVFDHandle(const FileAccPropList& fapl, void **file_handle) const;
+        //void getVFDHandle(FileAccPropList& fapl, void **file_handle) const; // removed from 1.8.18 and 1.10.1
 
-	// Determines if a file, specified by its name, is in HDF5 format
-	static bool isHdf5(const char* name );
-	static bool isHdf5(const H5std_string& name );
+        // Returns the file size of the HDF5 file.
+        hsize_t getFileSize() const;
 
-	// Reopens this file.
-	void reOpen();	// added for better name
+        // Determines if a file, specified by its name, is in HDF5 format
+        static bool isHdf5(const char* name);
+        static bool isHdf5(const H5std_string& name);
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-	void reopen();  // obsolete in favor of reOpen()
+        // Reopens this file.
+        void reOpen();  // added for better name
 
-	// Gets the file id
-	virtual hid_t getLocId() const;
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+        void reopen();  // obsolete in favor of reOpen()
 
-	// Creates an H5File using an existing file id.  Not recommended
-	// in applications.
-	H5File(hid_t existing_id);
+        // Creates an H5File using an existing file id.  Not recommended
+        // in applications.
+        H5File(hid_t existing_id);
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("H5File"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("H5File"); }
 
-	// Throw file exception.
-	virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const;
+        // Throw file exception.
+        virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const;
 
-	// Default constructor
-	H5File();
+        // For CommonFG to get the file id.
+        virtual hid_t getLocId() const;
 
-	// Copy constructor: makes a copy of the original H5File object.
-	H5File(const H5File& original);
+        // Default constructor
+        H5File();
 
-	// Gets the HDF5 file id.
-	virtual hid_t getId() const;
+        // Copy constructor: makes a copy of the original H5File object.
+        H5File(const H5File& original);
 
-	// H5File destructor.
-	virtual ~H5File();
+        // Gets the HDF5 file id.
+        virtual hid_t getId() const;
+
+        // H5File destructor.
+        virtual ~H5File();
 
    protected:
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Sets the HDF5 file id.
-	virtual void p_setId(const hid_t new_id);
+        // Sets the HDF5 file id.
+        virtual void p_setId(const hid_t new_id);
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	hid_t id;	// HDF5 file id
+        hid_t id;  // HDF5 file id
+
+        // This function is private and contains common code between the
+        // constructors taking a string or a char*
+        void p_get_file(const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist);
 
-	// This function is private and contains common code between the
-	// constructors taking a string or a char*
-	void p_get_file( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist );
+}; // end of H5File
+} // namespace H5
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5File_H
+
diff --git a/c++/src/H5FloatType.cpp b/c++/src/H5FloatType.cpp
index cdf9872..6bb3fd6 100644
--- a/c++/src/H5FloatType.cpp
+++ b/c++/src/H5FloatType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,272 +17,307 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AbstractDs.h"
-#include "H5DxferProp.h"
 #include "H5DataSpace.h"
 #include "H5AtomType.h"
 #include "H5FloatType.h"
 #include "H5DataSet.h"
 #include "H5PredType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	FloatType default constructor
-///\brief	Default constructor: Creates a stub floating-point datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType default constructor
+///\brief       Default constructor: Creates a stub floating-point datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FloatType::FloatType() {}
 
 //--------------------------------------------------------------------------
-// Function:	FloatType overloaded constructor
-///\brief	Creates a floating-point datatype using a predefined type.
-///\param	pred_type - IN: Predefined datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType overloaded constructor
+///\brief       Creates a floating-point datatype using a predefined type.
+///\param       pred_type - IN: Predefined datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType::FloatType( const PredType& pred_type ) : AtomType()
+FloatType::FloatType(const PredType& pred_type) : AtomType()
 {
-   // use DataType::copy to make a copy of this predefined type
-   copy( pred_type );
+    // use DataType::copy to make a copy of this predefined type
+    copy(pred_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType overloaded constructor
-///\brief	Creates an FloatType object using the id of an existing
-///		datatype.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType overloaded constructor
+///\brief       Creates an FloatType object using the id of an existing
+///             datatype.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType::FloatType( const hid_t existing_id ) : AtomType( existing_id ) {}
+FloatType::FloatType(const hid_t existing_id) : AtomType( existing_id ) {}
 
 //--------------------------------------------------------------------------
-// Function:	FloatType copy constructor
-///\brief	Copy constructor: makes a copy of the original FloatType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType copy constructor
+///\brief       Copy constructor: makes a copy of the original FloatType object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-FloatType::FloatType( const FloatType&  original ) : AtomType( original ){}
+FloatType::FloatType(const FloatType&  original) : AtomType( original ){}
+
+//--------------------------------------------------------------------------
+// Function:    EnumType overloaded constructor
+///\brief       Gets the floating-point datatype of the specified dataset
+///\param       dataset - IN: Dataset that this floating-point datatype
+///             associates with
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+FloatType::FloatType(const DataSet& dataset) : AtomType()
+{
+    // Calls C function H5Dget_type to get the id of the datatype
+    id = H5Dget_type(dataset.getId());
+
+    if (id < 0)
+    {
+        throw DataSetIException("FloatType constructor", "H5Dget_type failed");
+    }
+}
 
 //--------------------------------------------------------------------------
-// Function:	EnumType overloaded constructor
-///\brief	Gets the floating-point datatype of the specified dataset
-///\param	dataset - IN: Dataset that this floating-point datatype
-///		associates with
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType overloaded constructor
+///\brief       Creates an FloatType instance by opening an HDF5 float datatype
+///             given its name, provided as a C character string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Float type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openFloatType(const char*)
+//              to improve usability.
+//              -BMR, Dec 2016
 //--------------------------------------------------------------------------
-FloatType::FloatType( const DataSet& dataset ) : AtomType()
+FloatType::FloatType(const H5Location& loc, const char *dtype_name) : AtomType()
 {
-   // Calls C function H5Dget_type to get the id of the datatype
-   id = H5Dget_type( dataset.getId() );
+    id = p_opentype(loc, dtype_name);
+}
 
-   if( id < 0 )
-   {
-      throw DataSetIException("FloatType constructor", "H5Dget_type failed");
-   }
+//--------------------------------------------------------------------------
+// Function:    FloatType overloaded constructor
+///\brief       Creates an FloatType instance by opening an HDF5 float datatype
+///             given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Float type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openFloatType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+FloatType::FloatType(const H5Location& loc, const H5std_string& dtype_name) : AtomType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::getFields
-///\brief	Retrieves floating point datatype bit field information.
-///\param	spos  - OUT: Retrieved floating-point sign bit
-///\param	epos  - OUT: Retrieved exponent bit-position
-///\param	esize - OUT: Retrieved size of exponent, in bits
-///\param	mpos  - OUT: Retrieved mantissa bit-position
-///\param	msize - OUT: Retrieved size of mantissa, in bits
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void FloatType::getFields( size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize ) const
+// Function:    FloatType::getFields
+///\brief       Retrieves floating point datatype bit field information.
+///\param       spos  - OUT: Retrieved floating-point sign bit
+///\param       epos  - OUT: Retrieved exponent bit-position
+///\param       esize - OUT: Retrieved size of exponent, in bits
+///\param       mpos  - OUT: Retrieved mantissa bit-position
+///\param       msize - OUT: Retrieved size of mantissa, in bits
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void FloatType::getFields(size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize) const
 {
-   herr_t ret_value = H5Tget_fields( id, &spos, &epos, &esize, &mpos, &msize );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("FloatType::getFields", "H5Tget_fields failed");
-   }
+    herr_t ret_value = H5Tget_fields(id, &spos, &epos, &esize, &mpos, &msize);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("FloatType::getFields", "H5Tget_fields failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::setFields
-///\brief	Sets locations and sizes of floating point bit fields.
-///\param	spos  - OUT: Sign position, i.e., the bit offset of the
-///		floating-point sign bit.
-///\param	epos  - OUT: Exponent bit position
-///\param	esize - OUT: Size of exponent, in bits
-///\param	mpos  - OUT: Mantissa bit-position
-///\param	msize - OUT: Size of mantissa, in bits
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void FloatType::setFields( size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize ) const
+// Function:    FloatType::setFields
+///\brief       Sets locations and sizes of floating point bit fields.
+///\param       spos  - OUT: Sign position, i.e., the bit offset of the
+///             floating-point sign bit.
+///\param       epos  - OUT: Exponent bit position
+///\param       esize - OUT: Size of exponent, in bits
+///\param       mpos  - OUT: Mantissa bit-position
+///\param       msize - OUT: Size of mantissa, in bits
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void FloatType::setFields(size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize) const
 {
-   herr_t ret_value = H5Tset_fields( id, spos, epos, esize, mpos, msize );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("FloatType::setFields", "H5Tset_fields failed");
-   }
+    herr_t ret_value = H5Tset_fields(id, spos, epos, esize, mpos, msize);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("FloatType::setFields", "H5Tset_fields failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::getEbias
-///\brief	Retrieves the exponent bias of a floating-point type.
-///\return	Exponent bias
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType::getEbias
+///\brief       Retrieves the exponent bias of a floating-point type.
+///\return      Exponent bias
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 size_t FloatType::getEbias() const
 {
-   size_t ebias = H5Tget_ebias( id );
-   // Returns the bias if successful
-   if( ebias == 0 )
-   {
-      throw DataTypeIException("FloatType::getEbias", "H5Tget_ebias failed - returned exponent bias as 0");
-   }
-   return( ebias );
+    size_t ebias = H5Tget_ebias(id);
+    // Returns the bias if successful
+    if (ebias == 0)
+    {
+        throw DataTypeIException("FloatType::getEbias", "H5Tget_ebias failed - returned exponent bias as 0");
+    }
+    return(ebias);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::setEbias
-///\brief	Sets the exponent bias of a floating-point type.
-///\param	ebias - Exponent bias value
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType::setEbias
+///\brief       Sets the exponent bias of a floating-point type.
+///\param       ebias - Exponent bias value
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FloatType::setEbias( size_t ebias ) const
+void FloatType::setEbias(size_t ebias) const
 {
-   herr_t ret_value = H5Tset_ebias( id, ebias );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("FloatType::setEbias", "H5Tset_ebias failed");
-   }
+    herr_t ret_value = H5Tset_ebias(id, ebias);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("FloatType::setEbias", "H5Tset_ebias failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::getNorm
-///\brief	Retrieves mantissa normalization of a floating-point datatype.
-///\param	norm_string - OUT: Text string of the normalization type
-///\return	Valid normalization type, which can be:
-///		\li \c H5T_NORM_IMPLIED (0) - MSB of mantissa is not stored
-///		\li \c H5T_NORM_MSBSET (1) - MSB of mantissa is always 1
-///		\li \c H5T_NORM_NONE (2) - Mantissa is not normalized
-///\exception	H5::DataTypeIException
+// Function:    FloatType::getNorm
+///\brief       Retrieves mantissa normalization of a floating-point datatype.
+///\param       norm_string - OUT: Text string of the normalization type
+///\return      Valid normalization type, which can be:
+///             \li \c H5T_NORM_IMPLIED (0) - MSB of mantissa is not stored
+///             \li \c H5T_NORM_MSBSET (1) - MSB of mantissa is always 1
+///             \li \c H5T_NORM_NONE (2) - Mantissa is not normalized
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For your convenience, this function also provides the text
-///		string of the returned normalization type, via parameter
-///		\a norm_string.
-// Programmer	Binh-Minh Ribler - 2000
+///             For your convenience, this function also provides the text
+///             string of the returned normalization type, via parameter
+///             \a norm_string.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5T_norm_t FloatType::getNorm( H5std_string& norm_string ) const
+H5T_norm_t FloatType::getNorm(H5std_string& norm_string) const
 {
-   H5T_norm_t norm = H5Tget_norm( id );  // C routine
-   // Returns a valid normalization type if successful
-   if( norm == H5T_NORM_ERROR )
-   {
-      throw DataTypeIException("FloatType::getNorm", "H5Tget_norm failed - returned H5T_NORM_ERROR");
-   }
-   if( norm == H5T_NORM_IMPLIED )
-      norm_string = "H5T_NORM_IMPLIED (0)";
-   else if( norm == H5T_NORM_MSBSET )
-      norm_string = "H5T_NORM_MSBSET (1)";
-   else if( norm == H5T_NORM_NONE )
-      norm_string = "H5T_NORM_NONE (2)";
-   return( norm );
+    H5T_norm_t norm = H5Tget_norm(id);  // C routine
+    // Returns a valid normalization type if successful
+    if (norm == H5T_NORM_ERROR)
+    {
+        throw DataTypeIException("FloatType::getNorm", "H5Tget_norm failed - returned H5T_NORM_ERROR");
+    }
+    if (norm == H5T_NORM_IMPLIED)
+        norm_string = "H5T_NORM_IMPLIED (0)";
+    else if (norm == H5T_NORM_MSBSET)
+        norm_string = "H5T_NORM_MSBSET (1)";
+    else if (norm == H5T_NORM_NONE)
+        norm_string = "H5T_NORM_NONE (2)";
+    return(norm);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::setNorm
-///\brief	Sets the mantissa normalization of a floating-point datatype.
-///\param	norm - IN: Mantissa normalization type
-///\exception	H5::DataTypeIException
+// Function:    FloatType::setNorm
+///\brief       Sets the mantissa normalization of a floating-point datatype.
+///\param       norm - IN: Mantissa normalization type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		Valid values for normalization type include:
-///		\li \c H5T_NORM_IMPLIED (0) - MSB of mantissa is not stored
-///		\li \c H5T_NORM_MSBSET (1) - MSB of mantissa is always 1
-///		\li \c H5T_NORM_NONE (2) - Mantissa is not normalized
-// Programmer	Binh-Minh Ribler - 2000
+///             Valid values for normalization type include:
+///             \li \c H5T_NORM_IMPLIED (0) - MSB of mantissa is not stored
+///             \li \c H5T_NORM_MSBSET (1) - MSB of mantissa is always 1
+///             \li \c H5T_NORM_NONE (2) - Mantissa is not normalized
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FloatType::setNorm( H5T_norm_t norm ) const
+void FloatType::setNorm(H5T_norm_t norm) const
 {
-   herr_t ret_value = H5Tset_norm( id, norm );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("FloatType::setNorm", "H5Tset_norm failed");
-   }
+    herr_t ret_value = H5Tset_norm(id, norm);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("FloatType::setNorm", "H5Tset_norm failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::getInpad
-///\brief	Retrieves the internal padding type for unused bits in
-///		this floating-point datatypes.
-///\return	Internal padding type, which can be:
-///		\li \c H5T_PAD_ZERO (0) - Set background to zeros
-///		\li \c H5T_PAD_ONE (1) - Set background to ones
-///		\li \c H5T_PAD_BACKGROUND (2) - Leave background alone
-///\exception	H5::DataTypeIException
+// Function:    FloatType::getInpad
+///\brief       Retrieves the internal padding type for unused bits in
+///             this floating-point datatypes.
+///\return      Internal padding type, which can be:
+///             \li \c H5T_PAD_ZERO (0) - Set background to zeros
+///             \li \c H5T_PAD_ONE (1) - Set background to ones
+///             \li \c H5T_PAD_BACKGROUND (2) - Leave background alone
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For your convenience, this function also provides the text
-///		string of the returned internal padding type, via parameter
-///		\a pad_string.
-// Programmer	Binh-Minh Ribler - 2000
+///             For your convenience, this function also provides the text
+///             string of the returned internal padding type, via parameter
+///             \a pad_string.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5T_pad_t FloatType::getInpad( H5std_string& pad_string ) const
+H5T_pad_t FloatType::getInpad(H5std_string& pad_string) const
 {
-   H5T_pad_t pad_type = H5Tget_inpad( id );
-   // Returns a valid padding type if successful
-   if( pad_type == H5T_PAD_ERROR )
-   {
-      throw DataTypeIException("FloatType::getInpad", "H5Tget_inpad failed - returned H5T_PAD_ERROR");
-   }
-   if( pad_type == H5T_PAD_ZERO )
-      pad_string = "H5T_PAD_ZERO (0)";
-   else if( pad_type == H5T_PAD_ONE )
-      pad_string = "H5T_PAD_ONE (1)";
-   else if( pad_type == H5T_PAD_BACKGROUND )
-      pad_string = "H5T_PAD_BACKGROUD (2)";
-   return( pad_type );
+    H5T_pad_t pad_type = H5Tget_inpad(id);
+    // Returns a valid padding type if successful
+    if (pad_type == H5T_PAD_ERROR)
+    {
+        throw DataTypeIException("FloatType::getInpad", "H5Tget_inpad failed - returned H5T_PAD_ERROR");
+    }
+    if (pad_type == H5T_PAD_ZERO)
+        pad_string = "H5T_PAD_ZERO (0)";
+    else if (pad_type == H5T_PAD_ONE)
+        pad_string = "H5T_PAD_ONE (1)";
+    else if (pad_type == H5T_PAD_BACKGROUND)
+        pad_string = "H5T_PAD_BACKGROUD (2)";
+    return(pad_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType::setInpad
-///\brief	Fills unused internal floating point bits.
-///\param	inpad - IN: Internal padding type
-///\exception	H5::DataTypeIException
+// Function:    FloatType::setInpad
+///\brief       Fills unused internal floating point bits.
+///\param       inpad - IN: Internal padding type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		If any internal bits of a floating point type are unused
-///		(that is, those significant bits which are not part of the
-///		sign, exponent, or mantissa), then they will be filled
-///		according to the padding value provided by \a inpad.
+///             If any internal bits of a floating point type are unused
+///             (that is, those significant bits which are not part of the
+///             sign, exponent, or mantissa), then they will be filled
+///             according to the padding value provided by \a inpad.
 ///\par
-///		Valid values for normalization type include:
-///		\li \c H5T_PAD_ZERO (0) - Set background to zeros
-///		\li \c H5T_PAD_ONE (1) - Set background to ones
-///		\li \c H5T_PAD_BACKGROUND (2) - Leave background alone
-// Programmer	Binh-Minh Ribler - 2000
+///             Valid values for normalization type include:
+///             \li \c H5T_PAD_ZERO (0) - Set background to zeros
+///             \li \c H5T_PAD_ONE (1) - Set background to ones
+///             \li \c H5T_PAD_BACKGROUND (2) - Leave background alone
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void FloatType::setInpad( H5T_pad_t inpad ) const
+void FloatType::setInpad(H5T_pad_t inpad) const
 {
-   herr_t ret_value = H5Tset_inpad( id, inpad );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("FloatType::setInpad", "H5Tset_inpad failed");
-   }
+    herr_t ret_value = H5Tset_inpad(id, inpad);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("FloatType::setInpad", "H5Tset_inpad failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	FloatType destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    FloatType destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 FloatType::~FloatType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5FloatType.h b/c++/src/H5FloatType.h
index e88093e..b301286 100644
--- a/c++/src/H5FloatType.h
+++ b/c++/src/H5FloatType.h
@@ -6,70 +6,74 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5FloatType_H
 #define __H5FloatType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class FloatType operates on HDF5 floating point datatype.
+/*! \class FloatType
+    \brief FloatType is a derivative of a DataType and operates on HDF5
+    floating point datatype.
+*/
+//  Inheritance: AtomType -> DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP FloatType : public AtomType {
    public:
-	// Creates a floating-point type using a predefined type.
-	FloatType( const PredType& pred_type );
+        // Creates a floating-point type using a predefined type.
+        FloatType(const PredType& pred_type);
 
-	// Gets the floating-point datatype of the specified dataset.
-	FloatType( const DataSet& dataset );
+        // Gets the floating-point datatype of the specified dataset.
+        FloatType(const DataSet& dataset);
 
-	// Retrieves the exponent bias of a floating-point type.
-	size_t getEbias() const;
+        // Constructors that open an HDF5 float datatype, given a location.
+        FloatType(const H5Location& loc, const char* name);
+        FloatType(const H5Location& loc, const H5std_string& name);
 
-	// Sets the exponent bias of a floating-point type.
-	void setEbias( size_t ebias ) const;
+        // Retrieves the exponent bias of a floating-point type.
+        size_t getEbias() const;
 
-	// Retrieves floating point datatype bit field information.
-	void getFields( size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize ) const;
+        // Sets the exponent bias of a floating-point type.
+        void setEbias(size_t ebias) const;
 
-	// Sets locations and sizes of floating point bit fields.
-	void setFields( size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize ) const;
+        // Retrieves floating point datatype bit field information.
+        void getFields(size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize) const;
 
-	// Retrieves the internal padding type for unused bits in floating-point datatypes.
-	H5T_pad_t getInpad( H5std_string& pad_string ) const;
+        // Sets locations and sizes of floating point bit fields.
+        void setFields(size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize) const;
 
-	// Fills unused internal floating point bits.
-	void setInpad( H5T_pad_t inpad ) const;
+        // Retrieves the internal padding type for unused bits in floating-point datatypes.
+        H5T_pad_t getInpad(H5std_string& pad_string) const;
 
-	// Retrieves mantissa normalization of a floating-point datatype.
-	H5T_norm_t getNorm( H5std_string& norm_string ) const;
+        // Fills unused internal floating point bits.
+        void setInpad(H5T_pad_t inpad) const;
 
-	// Sets the mantissa normalization of a floating-point datatype.
-	void setNorm( H5T_norm_t norm ) const;
+        // Retrieves mantissa normalization of a floating-point datatype.
+        H5T_norm_t getNorm(H5std_string& norm_string) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("FloatType"); }
+        // Sets the mantissa normalization of a floating-point datatype.
+        void setNorm(H5T_norm_t norm) const;
 
-	// Default constructor
-	FloatType();
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("FloatType"); }
 
-	// Creates a floating-point datatype using an existing id.
-	FloatType( const hid_t existing_id );
+        // Default constructor
+        FloatType();
 
-	// Copy constructor: makes a copy of the original FloatType object.
-	FloatType( const FloatType& original );
+        // Creates a floating-point datatype using an existing id.
+        FloatType(const hid_t existing_id);
+
+        // Copy constructor: makes a copy of the original FloatType object.
+        FloatType(const FloatType& original);
+
+        // Noop destructor.
+        virtual ~FloatType();
+
+}; // end of FloatType
+} // namespace H5
 
-	// Noop destructor.
-	virtual ~FloatType();
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5FloatType_H
diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp
index f9aabcb..97bedee 100644
--- a/c++/src/H5Group.cpp
+++ b/c++/src/H5Group.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -24,13 +22,15 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
-#include "H5AbstractDs.h"
 #include "H5FaccProp.h"
 #include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
 #include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
+#include "H5AbstractDs.h"
 #include "H5DataSpace.h"
 #include "H5DataSet.h"
 #include "H5CommonFG.h"
@@ -39,26 +39,22 @@
 #include "H5File.h"
 #include "H5Alltypes.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
     using std::cerr;
     using std::endl;
-#endif  // H5_NO_STD
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	Group default constructor
-///\brief	Default constructor: creates a stub Group.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Group default constructor
+///\brief       Default constructor: creates a stub Group.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Group::Group() : H5Object(), CommonFG(), id(H5I_INVALID_HID) {}
 
 //--------------------------------------------------------------------------
-// Function:	Group copy constructor
-///\brief	Copy constructor: makes a copy of the original Group object.
-///\param	original - IN: Original group to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Group copy constructor
+///\brief       Copy constructor: makes a copy of the original Group object.
+///\param       original - IN: Original group to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Group::Group(const Group& original) : H5Object(), CommonFG(), id(original.id)
 {
@@ -66,21 +62,98 @@ Group::Group(const Group& original) : H5Object(), CommonFG(), id(original.id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group::getLocId
-///\brief	Returns the id of this group.
-///\return	Id of this group
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Group::getObjId
+///\brief       Opens an object via object header.
+///\param       obj_name - IN: Path to the object
+///\param       plist    - IN: Access property list for the link pointing to
+///                            the object
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             This function opens an object in a group or file, using
+///             H5Oopen.  Thus, an object can be opened without knowing
+///             the object's type.
+// Programmer   Binh-Minh Ribler - March, 2017
+//--------------------------------------------------------------------------
+hid_t Group::getObjId(const char* obj_name, const PropList& plist) const
+{
+    hid_t ret_value = H5Oopen(getId(), obj_name, plist.getId());
+    if (ret_value < 0)
+    {
+        throwException("Group::getObjId", "H5Oopen failed");
+    }
+    return(ret_value);
+}
+
+//--------------------------------------------------------------------------
+// Function:    Group::getObjId
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes a reference to a \c H5std_string for the object's name.
+///\param       obj_name - IN: Path to the object
+///\param       plist    - IN: Access property list for the link pointing to
+///                            the object
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - March, 2017
+//--------------------------------------------------------------------------
+hid_t Group::getObjId(const H5std_string& obj_name, const PropList& plist) const
+{
+    return(getObjId(obj_name.c_str(), plist));
+}
+
+//--------------------------------------------------------------------------
+// Function:    Group::closeObjId
+///\brief       Closes an object, which was opened with Group::getObjId
+///
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - March, 2017
+//--------------------------------------------------------------------------
+void Group::closeObjId(hid_t obj_id) const
+{
+    herr_t ret_value = H5Oclose(obj_id);
+    if (ret_value < 0)
+    {
+        throwException("Group::closeObjId", "H5Oclose failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    Group::getNumObjs
+///\brief       Returns the number of objects in this group.
+///\return      Number of objects
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - January, 2003
+//--------------------------------------------------------------------------
+hsize_t Group::getNumObjs() const
+{
+    H5G_info_t ginfo;      // Group information
+
+    herr_t ret_value = H5Gget_info(getId(), &ginfo);
+    if(ret_value < 0)
+        throwException("getNumObjs", "H5Gget_info failed");
+    return (ginfo.nlinks);
+}
+
+//--------------------------------------------------------------------------
+// Function:    Group::getLocId
+// Purpose:     Get the id of this group
+// Programmer   Binh-Minh Ribler - 2000
+// Description
+//              This function is a redefinition of CommonFG::getLocId.  It
+//              is used by CommonFG member functions to get the file id.
+// Deprecated:
+//      Aug 18, 2016 -BMR
+//              After HDFFV-9920, the Group's methods can use getId() and
+//              getLocId() is kept for backward compatibility.
 //--------------------------------------------------------------------------
 hid_t Group::getLocId() const
 {
-   return( getId() );
+    return(getId());
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group overloaded constructor
-///\brief	Creates a Group object using the id of an existing group.
-///\param	existing_id - IN: Id of an existing group
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Group overloaded constructor
+///\brief       Creates a Group object using the id of an existing group.
+///\param       existing_id - IN: Id of an existing group
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 Group::Group(const hid_t existing_id) : H5Object(), CommonFG(), id(existing_id)
 {
@@ -88,17 +161,17 @@ Group::Group(const hid_t existing_id) : H5Object(), CommonFG(), id(existing_id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 group, creates a Group object
-///\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
+// Function:    Group overload constructor - dereference
+///\brief       Given a reference, ref, to an hdf5 group, creates a Group object
+///\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
+///             \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, const PropList& plist) : H5Object(), CommonFG(), id(H5I_INVALID_HID)
 {
@@ -106,35 +179,40 @@ Group::Group(const H5Location& loc, const void* ref, H5R_type_t ref_type, const
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group overload constructor - dereference
-///\brief	Given a reference, ref, to an hdf5 group, creates a Group object
-///\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
+// Function:    Group overload constructor - dereference
+// brief        Given a reference, ref, to an hdf5 group, creates a Group objec
+// param        attr - IN: Specifying location where the referenced object is i
+// 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
+//      Mar, 2017
+//              Removed in 1.10.1 because H5Location is Attribute's baseclass
+//              now. -BMR
 //--------------------------------------------------------------------------
-Group::Group(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), CommonFG(), id(H5I_INVALID_HID)
+/* Group::Group(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, plist, "constructor - by dereference");
 }
+ */ 
 
 //--------------------------------------------------------------------------
 // Function:    Group::getId
-///\brief	Get the id of this group
-///\return	Group identifier
+///\brief       Get the id of this group
+///\return      Group identifier
 // Modification:
 //      May 2008 - BMR
-//		Class hierarchy is revised to address bugzilla 1068.  Class
-//		AbstractDS and Attribute are moved out of H5Object.  In
-//		addition, member IdComponent::id is moved into subclasses, and
-//		IdComponent::getId now becomes pure virtual function.
+//              Class hierarchy is revised to address bugzilla 1068.  Class
+//              AbstractDS and Attribute are moved out of H5Object.  In
+//              addition, member IdComponent::id is moved into subclasses, and
+//              IdComponent::getId now becomes pure virtual function.
 // Programmer   Binh-Minh Ribler - May, 2008
 //--------------------------------------------------------------------------
 hid_t Group::getId() const
 {
-   return(id);
+    return(id);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -143,11 +221,11 @@ hid_t Group::getId() const
 ///\brief       Sets the identifier of this object to a new value.
 ///
 ///\exception   H5::IdComponentException when the attempt to close the HDF5
-///		object fails
+///             object fails
 // Description:
-//		The underlaying reference counting in the C library ensures
-//		that the current valid id of this object is properly closed.
-//		Then the object's id is reset to the new id.
+//              The underlaying reference counting in the C library ensures
+//              that the current valid id of this object is properly closed.
+//              Then the object's id is reset to the new id.
 // Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Group::p_setId(const hid_t new_id)
@@ -156,76 +234,73 @@ void Group::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception close_error) {
-        throw GroupIException("Group::p_setId", close_error.getDetailMsg());
+    catch (Exception& close_error) {
+        throwException("Group::p_setId", close_error.getDetailMsg());
     }
-   // reset object's id to the given id
-   id = new_id;
+    // reset object's id to the given id
+    id = new_id;
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	Group::close
-///\brief	Closes this group.
+// Function:    Group::close
+///\brief       Closes this group.
 ///
-///\exception	H5::GroupIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::GroupIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void Group::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Gclose( id );
-	if( ret_value < 0 )
-	{
-	    throw GroupIException("Group::close", "H5Gclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Gclose(id);
+        if (ret_value < 0)
+        {
+            throwException("Group::close", "H5Gclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group::throwException
-///\brief	Throws H5::GroupIException.
-///\param	func_name - Name of the function where failure occurs
-///\param	msg       - Message describing the failure
-///\exception	H5::GroupIException
+// Function:    Group::throwException
+///\brief       Throws H5::GroupIException.
+///\param       func_name - Name of the function where failure occurs
+///\param       msg       - Message describing the failure
+///\exception   H5::GroupIException
 // Description
-//		This function is used in CommonFG implementation so that
-//		proper exception can be thrown for file or group.  The
-//		argument func_name is a member of CommonFG and "Group::"
-//		will be inserted to indicate the function called is an
-//		implementation of Group.
-// Programmer	Binh-Minh Ribler - 2000
+//              This function is also used in H5Location's methods so that
+//              proper exception can be thrown for file or group.  The
+//              "Group::" will be inserted to indicate the function called is
+//              an implementation of Group.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Group::throwException(const H5std_string& func_name, const H5std_string& msg) const
 {
-   H5std_string full_name = func_name;
-   full_name.insert(0, "Group::");
-   throw GroupIException(full_name, msg);
+    H5std_string full_name = func_name;
+    full_name.insert(0, "Group::");
+    throw GroupIException(full_name, msg);
 }
 
 //--------------------------------------------------------------------------
-// Function:	Group destructor
-///\brief	Properly terminates access to this group.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Group destructor
+///\brief       Properly terminates access to this group.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Feb 20, 2005
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Feb 20, 2005
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 Group::~Group()
 {
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	cerr << "Group::~Group - " << close_error.getDetailMsg() << endl;
+    catch (Exception& close_error) {
+        cerr << "Group::~Group - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h
index 1bd9882..2e13270 100644
--- a/c++/src/H5Group.h
+++ b/c++/src/H5Group.h
@@ -6,69 +6,79 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#ifndef __H5Group_H
-#define __H5Group_H
+#ifndef __Group_H
+#define __Group_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class Group
     \brief Class Group represents an HDF5 group.
-
-    It inherits many operations from H5Location and CommonFG.
 */
+// Class forwarding
+class ArrayType;
+class VarLenType;
+
+//  Inheritance: CommonFG/H5Object -> IdComponent
 class H5_DLLCPP Group : public H5Object, public CommonFG {
    public:
-	// Close this group.
-	virtual void close();
+        // Close this group.
+        virtual void close();
+
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("Group"); }
+
+        // Throw group exception.
+        virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("Group"); }
+        // for CommonFG to get the file id.
+        virtual hid_t getLocId() const;
 
-	// Throw group exception.
-	virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const;
+        // Creates a group by way of dereference.
+        Group(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+        // Removed in 1.10.1, because H5Location is baseclass
+//        Group(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
-	// for CommonFG to get the file id.
-	virtual hid_t getLocId() const;
+        // Opens an object within a group or a file, i.e., root group.
+        hid_t getObjId(const char* name, const PropList& plist = PropList::DEFAULT) const;
+        hid_t getObjId(const H5std_string& name, const PropList& plist = PropList::DEFAULT) const;
 
-	// Creates a group by way of dereference.
-	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);
+        // Closes an object opened by getObjId().
+        void closeObjId(hid_t obj_id) const;
 
-	// default constructor
-	Group();
+        // Returns the number of objects in this group.
+        hsize_t getNumObjs() const;
 
-	// Copy constructor: makes a copy of the original object
-	Group(const Group& original);
+        // default constructor
+        Group();
 
-	// Gets the group id.
-	virtual hid_t getId() const;
+        // Copy constructor: makes a copy of the original object
+        Group(const Group& original);
 
-	// Destructor
-	virtual ~Group();
+        // Gets the group id.
+        virtual hid_t getId() const;
 
-	// Creates a copy of an existing group using its id.
-	Group( const hid_t group_id );
+        // Destructor
+        virtual ~Group();
+
+        // Creates a copy of an existing group using its id.
+        Group(const hid_t group_id);
 
    protected:
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Sets the group id.
-	virtual void p_setId(const hid_t new_id);
+        // Sets the group id.
+        virtual void p_setId(const hid_t new_id);
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
    private:
-	hid_t id;	// HDF5 group id
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
-#endif // __H5Group_H
+        hid_t id;    // HDF5 group id
+
+}; // end of Group
+} // namespace H5
+
+#endif // __Group_H
diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp
index 60735f0..f9a08cd 100644
--- a/c++/src/H5IdComponent.cpp
+++ b/c++/src/H5IdComponent.cpp
@@ -5,27 +5,24 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5Library.h"
 #include "H5IdComponent.h"
 #include "H5DataSpace.h"
-#include "H5private.h"			// for HDmemset
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This flag indicates whether H5Library::initH5cpp has been called to register
 // the terminating functions with atexit()
 bool IdComponent::H5cppinit = false;
@@ -34,39 +31,24 @@ 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
-///\brief 	Creates an IdComponent object using the id of an existing
-///		object. - Obsolete, will be removed in 1.8.17
-// Param	h5_id - IN: Id of an existing object
-// Exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//
-// *** Deprecation warning ***
-// This constructor is no longer appropriate because the data member "id" had
-// been moved to the sub-classes.  It will be removed in 1.10 release.  If its
-// removal does not raise any problems in 1.10, it will be removed from 1.8 in
-// subsequent releases.
-//--------------------------------------------------------------------------
-IdComponent::IdComponent(const hid_t h5_id) {}
-
-//--------------------------------------------------------------------------
-// Function:	IdComponent::incRefCount
-///\brief	Increment reference counter for a given id.
-// Programmer	Binh-Minh Ribler - May 2005
+// Function:    IdComponent::incRefCount
+///\brief       Increment reference counter for a given id.
+// Programmer   Binh-Minh Ribler - May 2005
 //--------------------------------------------------------------------------
 void IdComponent::incRefCount(const hid_t obj_id) const
 {
     if (p_valid_id(obj_id))
-	if (H5Iinc_ref(obj_id) < 0)
-	    throw IdComponentException(inMemFunc("incRefCount"), "incrementing object ref count failed");
+        if (H5Iinc_ref(obj_id) < 0)
+            throw IdComponentException(inMemFunc("incRefCount"), "incrementing object ref count failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::incRefCount
-///\brief	Increment reference counter for the id of this object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IdComponent::incRefCount
+///\brief       Increment reference counter for the id of this object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void IdComponent::incRefCount() const
 {
@@ -74,31 +56,31 @@ void IdComponent::incRefCount() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::decRefCount
-///\brief	Decrement reference counter for a given id.
-// Programmer	Binh-Minh Ribler - May 2005
+// Function:    IdComponent::decRefCount
+///\brief       Decrement reference counter for a given id.
+// Programmer   Binh-Minh Ribler - May 2005
 // Modification:
-//		Added the check for ref counter to give a little more info
-//		on why H5Idec_ref fails in some cases - BMR 5/19/2005
+//              Added the check for ref counter to give a little more info
+//              on why H5Idec_ref fails in some cases - BMR 5/19/2005
 //--------------------------------------------------------------------------
 void IdComponent::decRefCount(const hid_t obj_id) const
 {
     if (p_valid_id(obj_id))
-	if (H5Idec_ref(obj_id) < 0)
-	{
-	    if (H5Iget_ref(obj_id) <= 0)
-		throw IdComponentException(inMemFunc("decRefCount"),
-					"object ref count is 0 or negative");
-	    else
-		throw IdComponentException(inMemFunc("decRefCount"),
-					"decrementing object ref count failed");
-	}
+        if (H5Idec_ref(obj_id) < 0)
+        {
+            if (H5Iget_ref(obj_id) <= 0)
+                throw IdComponentException(inMemFunc("decRefCount"),
+                               "object ref count is 0 or negative");
+            else
+                throw IdComponentException(inMemFunc("decRefCount"),
+                               "decrementing object ref count failed");
+        }
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::decRefCount
-///\brief	Decrement reference counter for the id of this object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IdComponent::decRefCount
+///\brief       Decrement reference counter for the id of this object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void IdComponent::decRefCount() const
 {
@@ -106,28 +88,28 @@ void IdComponent::decRefCount() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::getCounter
-///\brief	Returns the reference counter for a given id.
-///\return	Reference count
-// Programmer	Binh-Minh Ribler - May 2005
+// Function:    IdComponent::getCounter
+///\brief       Returns the reference counter for a given id.
+///\return      Reference count
+// Programmer   Binh-Minh Ribler - May 2005
 //--------------------------------------------------------------------------
 int IdComponent::getCounter(const hid_t obj_id) const
 {
     int counter = 0;
     if (p_valid_id(obj_id))
     {
-	counter = H5Iget_ref(obj_id);
-	if (counter < 0)
-	    throw IdComponentException(inMemFunc("incRefCount"), "getting object ref count failed - negative");
+        counter = H5Iget_ref(obj_id);
+        if (counter < 0)
+            throw IdComponentException(inMemFunc("incRefCount"), "getting object ref count failed - negative");
     }
     return (counter);
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::getCounter
-///\brief	Returns the reference counter for the id of this object.
-///\return	Reference count
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IdComponent::getCounter
+///\brief       Returns the reference counter for the id of this object.
+///\return      Reference count
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 int IdComponent::getCounter() const
 {
@@ -135,43 +117,43 @@ int IdComponent::getCounter() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	getHDFObjType (static)
-///\brief	Given an id, returns the type of the object.
-///\return	a valid HDF object type, which may be one of the following:
-///		\li \c H5I_FILE
-///		\li \c H5I_GROUP
-///		\li \c H5I_DATATYPE
-///		\li \c H5I_DATASPACE
-///		\li \c H5I_DATASET
-///		\li \c H5I_ATTR
-///		\li or \c H5I_BADID, if no valid type can be determined or the
-///				input object id is invalid.
+// Function:    getHDFObjType (static)
+///\brief       Given an id, returns the type of the object.
+///\return      a valid HDF object type, which may be one of the following:
+///             \li \c H5I_FILE
+///             \li \c H5I_GROUP
+///             \li \c H5I_DATATYPE
+///             \li \c H5I_DATASPACE
+///             \li \c H5I_DATASET
+///             \li \c H5I_ATTR
+///             \li or \c H5I_BADID, if no valid type can be determined or the
+///                         input object id is invalid.
 // Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
 H5I_type_t IdComponent::getHDFObjType(const hid_t obj_id)
 {
     if (obj_id <= 0)
-	return H5I_BADID; // invalid
+        return H5I_BADID; // invalid
     H5I_type_t id_type = H5Iget_type(obj_id);
     if (id_type <= H5I_BADID || id_type >= H5I_NTYPES)
-	return H5I_BADID; // invalid
+        return H5I_BADID; // invalid
     else
-	return id_type; // valid type
+        return id_type; // valid type
 }
 
 //--------------------------------------------------------------------------
-// Function:	getHDFObjType
-///\brief	Returns the type of the object.  It is an overloaded function
-///		of the above function.
-///\return	a valid HDF object type, which may be one of the following:
-///		\li \c H5I_FILE
-///		\li \c H5I_GROUP
-///		\li \c H5I_DATATYPE
-///		\li \c H5I_DATASPACE
-///		\li \c H5I_DATASET
-///		\li \c H5I_ATTR
-///		\li or \c H5I_BADID, if no valid type can be determined or the
-///				input object id is invalid.
+// Function:    getHDFObjType
+///\brief       Returns the type of the object.  It is an overloaded function
+///             of the above function.
+///\return      a valid HDF object type, which may be one of the following:
+///             \li \c H5I_FILE
+///             \li \c H5I_GROUP
+///             \li \c H5I_DATATYPE
+///             \li \c H5I_DATASPACE
+///             \li \c H5I_DATASET
+///             \li \c H5I_ATTR
+///             \li or \c H5I_BADID, if no valid type can be determined or the
+///                         input object id is invalid.
 // Programmer   Binh-Minh Ribler - Mar, 2014
 //--------------------------------------------------------------------------
 H5I_type_t IdComponent::getHDFObjType() const
@@ -180,74 +162,161 @@ H5I_type_t IdComponent::getHDFObjType() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::operator=
-///\brief	Assignment operator.
-///\param	rhs - IN: Reference to the existing object
-///\return	Reference to IdComponent instance
-///\exception	H5::IdComponentException when attempt to close the HDF5
-///		object fails
+// Function:    getNumMembers (static)
+///\brief       Returns the number of members of the given type.
+///\return      Number of members
+///\par Description
+///             If there is no member of the given type, getNumMembers will
+///             return 0.  Valid types are:
+///             \li \c H5I_FILE (= 1)
+///             \li \c H5I_GROUP
+///             \li \c H5I_DATATYPE
+///             \li \c H5I_DATASPACE
+///             \li \c H5I_DATASET
+///             \li \c H5I_ATTR
+///             \li \c H5I_REFERENCE
+///             \li \c H5I_VFL
+///             \li \c H5I_GENPROP_CLS
+///             \li \c H5I_GENPROP_LST
+///             \li \c H5I_ERROR_CLASS
+///             \li \c H5I_ERROR_MSG
+///             \li \c H5I_ERROR_STACK
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+hsize_t IdComponent::getNumMembers(H5I_type_t type)
+{
+    hsize_t nmembers = 0;
+    herr_t ret_value = H5Inmembers(type, &nmembers);
+    if (ret_value < 0)
+        throw IdComponentException("getNumMembers", "H5Inmembers failed");
+    else
+        return(nmembers);
+}
+
+//--------------------------------------------------------------------------
+// Function:    isValid (static)
+///\brief       Checks if the given ID is valid.
+///\return      true if the given identifier is valid, and false, otherwise.
+///\par Description
+///             A valid ID is one that is in use and has an application
+///             reference count of at least 1.
+// Programmer   Binh-Minh Ribler - Mar 1, 2017
+//--------------------------------------------------------------------------
+bool IdComponent::isValid(hid_t an_id)
+{
+    // Call C function
+    htri_t ret_value = H5Iis_valid(an_id);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Iis_valid returns a negative value
+        throw IdComponentException("isValid", "H5Iis_valid failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    typeExists (static)
+///\brief       Queries if a given type is currently registered with the
+///             library.
+///\return      true if the given type exists, and false, otherwise.
+///\par Description
+///             Valid types are:
+///             \li \c H5I_FILE (= 1)
+///             \li \c H5I_GROUP
+///             \li \c H5I_DATATYPE
+///             \li \c H5I_DATASPACE
+///             \li \c H5I_DATASET
+///             \li \c H5I_ATTR
+///             \li \c H5I_REFERENCE
+///             \li \c H5I_VFL
+///             \li \c H5I_GENPROP_CLS
+///             \li \c H5I_GENPROP_LST
+///             \li \c H5I_ERROR_CLASS
+///             \li \c H5I_ERROR_MSG
+///             \li \c H5I_ERROR_STACK
+// Programmer   Binh-Minh Ribler - Feb, 2017
+//--------------------------------------------------------------------------
+bool IdComponent::typeExists(H5I_type_t type)
+{
+    // Call C function
+    htri_t ret_value = H5Itype_exists(type);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Itype_exists returns a negative value
+        throw IdComponentException("typeExists", "H5Itype_exists failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    IdComponent::operator=
+///\brief       Assignment operator.
+///\param       rhs - IN: Reference to the existing object
+///\return      Reference to IdComponent instance
+///\exception   H5::IdComponentException when attempt to close the HDF5
+///             object fails
 // Description
-//		First, close the current valid id of this object.  Then
-//		copy the id from rhs to this object, and increment the
-//		reference counter of the id to indicate that another object
-//		is referencing that id.
+//              First, close the current valid id of this object.  Then
+//              copy the id from rhs to this object, and increment the
+//              reference counter of the id to indicate that another object
+//              is referencing that id.
 // Modification
-//	2010/5/9 - BMR
-//		Removed close() and incRefCount() because setId/p_setId takes
-//		care of close() and setId takes care incRefCount().
-// Programmer	Binh-Minh Ribler - 2000
+//        2010/5/9 - BMR
+//              Removed close() and incRefCount() because setId/p_setId takes
+//              care of close() and setId takes care incRefCount().
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IdComponent& IdComponent::operator=( const IdComponent& rhs )
+IdComponent& IdComponent::operator=(const IdComponent& rhs)
 {
     if (this != &rhs)
     {
-	// handling references to this id
-  	try {
-	    setId(rhs.getId());
-	    // Note: a = b, so there are two objects with the same hdf5 id
-	    // that's why incRefCount is needed, and it is called by setId
-	}
-	catch (Exception close_error) {
-	    throw FileIException(inMemFunc("operator="), close_error.getDetailMsg());
-	}
+        // handling references to this id
+        try {
+            setId(rhs.getId());
+            // Note: a = b, so there are two objects with the same hdf5 id
+            // that's why incRefCount is needed, and it is called by setId
+        }
+        catch (Exception& close_error) {
+            throw FileIException(inMemFunc("operator="), close_error.getDetailMsg());
+        }
     }
     return *this;
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::setId
-///\brief	Sets the identifier of this object to a new value.
-///\param	new_id - IN: New identifier to be set to
-///\exception	H5::IdComponentException when the attempt to close the HDF5
-///		object fails
+// Function:    IdComponent::setId
+///\brief       Sets the identifier of this object to a new value.
+///\param       new_id - IN: New identifier to be set to
+///\exception   H5::IdComponentException when the attempt to close the HDF5
+///             object fails
 // Description:
-//		p_setId ensures that the current valid id of this object is
-//		properly closed before resetting the object's id to the new id.
-// Programmer	Binh-Minh Ribler - 2000
+//              p_setId ensures that the current valid id of this object is
+//              properly closed before resetting the object's id to the new id.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	2008/7/23 - BMR
-//		Changed all subclasses' setId to p_setId and put back setId
-//		here.  p_setId is used in the library where the id provided
-//		by a C API passed on to user's application in the form of a
-//		C++ API object, which will be destroyed properly, and so
-//		p_setId does not call incRefCount.  On the other hand, the
-//		public version setId is used by other applications, in which
-//		the id passed to setId is that of another C++ API object, so
-//		setId must call incRefCount.
+//        2008/7/23 - BMR
+//              Changed all subclasses' setId to p_setId and put back setId
+//              here.  p_setId is used in the library where the id provided
+//              by a C API passed on to user's application in the form of a
+//              C++ API object, which will be destroyed properly, and so
+//              p_setId does not call incRefCount.  On the other hand, the
+//              public version setId is used by other applications, in which
+//              the id passed to setId is that of another C++ API object, so
+//              setId must call incRefCount.
 //--------------------------------------------------------------------------
 void IdComponent::setId(const hid_t new_id)
 {
-   // set to new_id
-   p_setId(new_id);
+    // set to new_id
+    p_setId(new_id);
 
-   // increment the reference counter of the new id
-   incRefCount();
+    // increment the reference counter of the new id
+    incRefCount();
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IdComponent destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 IdComponent::~IdComponent() {}
 
@@ -258,29 +327,29 @@ IdComponent::~IdComponent() {}
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	IdComponent::inMemFunc
-///\brief	Makes and returns string "<class-name>::<func_name>"
-///\param	func_name - Name of the function where failure occurs
+// Function:    IdComponent::inMemFunc
+///\brief       Makes and returns string "<class-name>::<func_name>"
+///\param       func_name - Name of the function where failure occurs
 // Description
-///		Concatenates the class name of this object with the
-///		passed-in function name to create a string that indicates
-///		where the failure occurs.  The class-name is provided by
-///		fromClass().  This string will be used by a base class when
-///		an exception is thrown.
-// Programmer	Binh-Minh Ribler - Aug 6, 2005
+///             Concatenates the class name of this object with the
+///             passed-in function name to create a string that indicates
+///             where the failure occurs.  The class-name is provided by
+///             fromClass().  This string will be used by a base class when
+///             an exception is thrown.
+// Programmer   Binh-Minh Ribler - Aug 6, 2005
 //--------------------------------------------------------------------------
 H5std_string IdComponent::inMemFunc(const char* func_name) const
 {
-   H5std_string full_name = func_name;
-   full_name.insert(0, "::");
-   full_name.insert(0, fromClass());
-   return (full_name);
+    H5std_string full_name = func_name;
+    full_name.insert(0, "::");
+    full_name.insert(0, fromClass());
+    return (full_name);
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent default constructor - private
-///\brief	Default constructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IdComponent default constructor - private
+///\brief       Default constructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 IdComponent::IdComponent()
 {
@@ -294,45 +363,45 @@ IdComponent::IdComponent()
 }
 
 //--------------------------------------------------------------------------
-// Function:	IdComponent::p_get_file_name (protected)
-// Purpose:	Gets the name of the file, in which this object belongs.
-// Exception:	H5::IdComponentException
+// Function:    IdComponent::p_get_file_name (protected)
+// Purpose      Gets the name of the file, in which this object belongs.
+// Exception:   H5::IdComponentException
 // Description:
-// 		This function is protected so that the user applications can
-// 		only have access to its code via allowable classes, namely,
-// 		Attribute and H5Location subclasses.
-// Programmer	Binh-Minh Ribler - Jul, 2004
+//              This function is protected so that the user applications can
+//              only have access to its code via allowable classes, namely,
+//              Attribute and H5Location subclasses.
+// Programmer   Binh-Minh Ribler - Jul, 2004
 //--------------------------------------------------------------------------
 H5std_string IdComponent::p_get_file_name() const
 {
-   hid_t temp_id = getId();
+    hid_t temp_id = getId();
 
-   // Preliminary call to H5Fget_name to get the length of the file name
-   ssize_t name_size = H5Fget_name(temp_id, NULL, 0);
+    // Preliminary call to H5Fget_name to get the length of the file name
+    ssize_t name_size = H5Fget_name(temp_id, NULL, 0);
 
-   // If H5Aget_name returns a negative value, raise an exception,
-   if( name_size < 0 )
-   {
-      throw IdComponentException("", "H5Fget_name failed");
-   }
+    // If H5Aget_name returns a negative value, raise an exception,
+    if (name_size < 0)
+    {
+        throw IdComponentException("", "H5Fget_name failed");
+    }
 
-   // Call H5Fget_name again to get the actual file name
-   char* name_C = new char[name_size+1];  // temporary C-string for C API
-   HDmemset(name_C, 0, name_size+1); // clear buffer
+    // Call H5Fget_name again to get the actual file name
+    char* name_C = new char[name_size+1];  // temporary C-string for C API
+    HDmemset(name_C, 0, name_size+1); // clear buffer
 
-   name_size = H5Fget_name(temp_id, name_C, name_size+1);
+    name_size = H5Fget_name(temp_id, name_C, name_size+1);
 
-   // Check for failure again
-   if( name_size < 0 )
-   {
+    // Check for failure again
+    if (name_size < 0)
+    {
       delete []name_C;
-      throw IdComponentException("", "H5Fget_name failed");
-   }
+        throw IdComponentException("", "H5Fget_name failed");
+    }
 
-   // Convert the C file name and return
-   H5std_string file_name(name_C);
-   delete []name_C;
-   return(file_name);
+    // Convert the C file name and return
+    H5std_string file_name(name_C);
+    delete []name_C;
+    return(file_name);
 }
 
 //
@@ -340,22 +409,22 @@ H5std_string IdComponent::p_get_file_name() const
 //
 
 //--------------------------------------------------------------------------
-// Function:	p_valid_id
-// Purpose:	Verifies that the given id is a valid id so it can be passed
-//		into an H5I C function.
-// Return	true if id is valid, false, otherwise
-// Programmer	Binh-Minh Ribler - May, 2005
+// Function:    p_valid_id
+// Purpose      Verifies that the given id is a valid id so it can be passed
+//              into an H5I C function.
+// Return       true if id is valid, false, otherwise
+// Programmer   Binh-Minh Ribler - May, 2005
 //--------------------------------------------------------------------------
 bool IdComponent::p_valid_id(const hid_t obj_id)
 {
     if (obj_id <= 0)
-	return false;
+        return false;
 
     H5I_type_t id_type = H5Iget_type(obj_id);
     if (id_type <= H5I_BADID || id_type >= H5I_NTYPES)
-	return false;
+        return false;
     else
-	return true;
+        return true;
 }
 
 // Notes about IdComponent::id
@@ -368,6 +437,4 @@ bool IdComponent::p_valid_id(const hid_t obj_id)
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
 }
-#endif
diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h
index 61c8bd6..baf939e 100644
--- a/c++/src/H5IdComponent.h
+++ b/c++/src/H5IdComponent.h
@@ -6,24 +6,17 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __IdComponent_H
 #define __IdComponent_H
 
-// IdComponent represents an HDF5 object that has an identifier.
-
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-class DataSpace;
 /*! \class IdComponent
     \brief Class IdComponent provides wrappers of the C functions that
      operate on an HDF5 identifier.
@@ -34,93 +27,100 @@ class DataSpace;
 class H5_DLLCPP IdComponent {
     public:
 
-	// Increment reference counter.
-	void incRefCount(const hid_t obj_id) const;
-	void incRefCount() const;
+        // Increment reference counter.
+        void incRefCount(const hid_t obj_id) const;
+        void incRefCount() const;
+
+        // Decrement reference counter.
+        void decRefCount(const hid_t obj_id) const;
+        void decRefCount() const;
+
+        // Get the reference counter to this identifier.
+        int getCounter(const hid_t obj_id) const;
+        int getCounter() const;
+
+        // Returns an HDF5 object type, given the object id.
+        static H5I_type_t getHDFObjType(const hid_t obj_id);
 
-	// Decrement reference counter.
-	void decRefCount(const hid_t obj_id) const;
-	void decRefCount() const;
+        // Returns an HDF5 object type of this object.
+        H5I_type_t getHDFObjType() const;
 
-	// Get the reference counter to this identifier.
-	int getCounter(const hid_t obj_id) const;
-	int getCounter() const;
+        // Returns the number of members in a type.
+        static hsize_t getNumMembers(H5I_type_t type);
 
-	// Returns an HDF5 object type, given the object id.
-	static H5I_type_t getHDFObjType(const hid_t obj_id);
+        // Checks if the given ID is valid.
+        static bool isValid(hid_t an_id);
 
-	// Returns an HDF5 object type of this object.
-	H5I_type_t getHDFObjType() const;
+        // Determines if an type exists.
+        static bool typeExists(H5I_type_t type);
 
-	// Assignment operator.
-	IdComponent& operator=( const IdComponent& rhs );
+        // Assignment operator.
+        IdComponent& operator=(const IdComponent& rhs);
 
-	// Sets the identifier of this object to a new value.
-	void setId(const hid_t new_id);
+        // Sets the identifier of this object to a new value.
+        void setId(const hid_t new_id);
 
-	// *** Deprecation warning ***
-	// The following two constructors are no longer appropriate after the
-	// data member "id" had been moved to the sub-classes.
-	// The copy constructor is a noop and is removed in 1.8.15 and the
-	// other will be removed from 1.10 release, and then from 1.8 if its
-	// removal does not raise any problems in two 1.10 releases.
+        // *** Deprecation warning ***
+        // The following two constructors are no longer appropriate after the
+        // data member "id" had been moved to the sub-classes.
+        // The copy constructor is a noop and is removed in 1.8.15 and the
+        // other will be removed from 1.10 release, and then from 1.8 if its
+        // removal does not raise any problems in two 1.10 releases.
 
-	// Creates an object to hold an HDF5 identifier.
-	IdComponent( const hid_t h5_id );
+        // Creates an object to hold an HDF5 identifier.
+        // IdComponent(const hid_t h5_id); - removed from 1.10.1
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
-	// Copy constructor: makes copy of the original IdComponent object.
-	// IdComponent( const IdComponent& original ); - removed from 1.8.15
+        // Copy constructor: makes copy of the original IdComponent object.
+        // IdComponent(const IdComponent& original); - removed from 1.8.15
 
-	// Gets the identifier of this object.
-	virtual hid_t getId () const = 0;
+        // Gets the identifier of this object.
+        virtual hid_t getId () const = 0;
 
-	// Pure virtual function for there are various H5*close for the
-	// subclasses.
-	virtual void close() = 0;
+        // Pure virtual function for there are various H5*close for the
+        // subclasses.
+        virtual void close() = 0;
 
-	// Makes and returns the string "<class-name>::<func_name>";
-	// <class-name> is returned by fromClass().
-	H5std_string inMemFunc(const char* func_name) const;
+        // Makes and returns the string "<class-name>::<func_name>";
+        // <class-name> is returned by fromClass().
+        H5std_string inMemFunc(const char* func_name) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass() const { return("IdComponent");}
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass() const { return("IdComponent");}
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-	// Destructor
-	virtual ~IdComponent();
+        // Destructor
+        virtual ~IdComponent();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
     protected:
-	// Default constructor.
-	IdComponent();
+        // Default constructor.
+        IdComponent();
 
-	// Gets the name of the file, in which an HDF5 object belongs.
-	H5std_string p_get_file_name() const;
+        // Gets the name of the file, in which an HDF5 object belongs.
+        H5std_string p_get_file_name() const;
 
-	// Verifies that the given id is valid.
-	static bool p_valid_id(const hid_t obj_id);
+        // Verifies that the given id is valid.
+        static bool p_valid_id(const hid_t obj_id);
 
-	// Sets the identifier of this object to a new value. - this one
-	// doesn't increment reference count
-	virtual void p_setId(const hid_t new_id) = 0;
+        // Sets the identifier of this object to a new value. - this one
+        // doesn't increment reference count
+        virtual void p_setId(const hid_t new_id) = 0;
 
-	// This flag is used to decide whether H5dont_atexit should be called
-	static bool H5dontAtexit_called;
+        // This flag is used to decide whether H5dont_atexit should be called
+        static bool H5dontAtexit_called;
 
     private:
-	// This flag indicates whether H5Library::initH5cpp has been called
-	// to register various terminating functions with atexit()
+        // This flag indicates whether H5Library::initH5cpp has been called
+        // to register various terminating functions with atexit()
         static bool H5cppinit;
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 }; // end class IdComponent
+} // namespace H5
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __IdComponent_H
diff --git a/c++/src/H5Include.h b/c++/src/H5Include.h
index 1e0e952..a180430 100644
--- a/c++/src/H5Include.h
+++ b/c++/src/H5Include.h
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <hdf5.h>
@@ -33,10 +31,10 @@ const bool  true  = 1;
 // so re-define them here for now.
 
 /* Initial version of the object header format */
-#define H5O_VERSION_1	1
+#define H5O_VERSION_1    1
 
 /* Revised version - leaves out reserved bytes and alignment padding, and adds
  *      magic number as prefix and checksum as suffix for all chunks.
  */
-#define H5O_VERSION_2	2
+#define H5O_VERSION_2    2
 
diff --git a/c++/src/H5IntType.cpp b/c++/src/H5IntType.cpp
index 5719eed..fb7e476 100644
--- a/c++/src/H5IntType.cpp
+++ b/c++/src/H5IntType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,123 +17,157 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AbstractDs.h"
-#include "H5DxferProp.h"
 #include "H5DataSpace.h"
 #include "H5AtomType.h"
 #include "H5IntType.h"
 #include "H5DataSet.h"
 #include "H5PredType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
-
 
 //--------------------------------------------------------------------------
-// Function:	IntType default constructor
-///\brief	Default constructor: Creates a stub integer datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType default constructor
+///\brief       Default constructor: Creates a stub integer datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 IntType::IntType() {}
 
 //--------------------------------------------------------------------------
-// Function:	IntType copy constructor
-///\brief	Copy constructor: makes a copy of the original IntType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType copy constructor
+///\brief       Copy constructor: makes a copy of the original IntType object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType::IntType( const IntType& original ) : AtomType( original ) {}
+IntType::IntType(const IntType& original) : AtomType( original ) {}
 
 //--------------------------------------------------------------------------
-// Function:	IntType overloaded constructor
-///\brief	Creates a integer type using a predefined type
-///\param	pred_type - IN: Predefined datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType overloaded constructor
+///\brief       Creates a integer type using a predefined type
+///\param       pred_type - IN: Predefined datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType::IntType( const PredType& pred_type ) : AtomType()
+IntType::IntType(const PredType& pred_type) : AtomType()
 {
-   // use DataType::copy to make a copy of this predefined type
-   copy( pred_type );
+    // use DataType::copy to make a copy of this predefined type
+    copy(pred_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	IntType overloaded constructor
-///\brief	Creates an integer datatype using the id of an existing
-///		datatype.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType overloaded constructor
+///\brief       Creates an integer datatype using the id of an existing
+///             datatype.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-IntType::IntType( const hid_t existing_id ) : AtomType( existing_id ) {}
+IntType::IntType(const hid_t existing_id) : AtomType( existing_id ) {}
 
 //--------------------------------------------------------------------------
-// Function:	IntType overloaded constructor
-///\brief	Gets the integer datatype of the specified dataset.
-///\param	dataset - IN: Dataset that this integer datatype associates with
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType overloaded constructor
+///\brief       Gets the integer datatype of the specified dataset.
+///\param       dataset - IN: Dataset that this integer datatype associates with
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+IntType::IntType(const DataSet& dataset) : AtomType()
+{
+    // Calls C function H5Dget_type to get the id of the datatype
+    id = H5Dget_type(dataset.getId());
+ 
+    if (id < 0)
+    {
+        throw DataSetIException("IntType constructor", "H5Dget_type failed");
+    }
+}
+
 //--------------------------------------------------------------------------
-IntType::IntType( const DataSet& dataset ) : AtomType()
+// Function:    IntType overloaded constructor
+///\brief       Creates a IntType instance by opening an HDF5 integer datatype
+///             given its name as a char*.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Integer type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openIntType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+IntType::IntType(const H5Location& loc, const char *dtype_name) : AtomType()
 {
-   // Calls C function H5Dget_type to get the id of the datatype
-   id = H5Dget_type( dataset.getId() );
+    id = p_opentype(loc, dtype_name);
+}
 
-   if( id < 0 )
-   {
-      throw DataSetIException("IntType constructor", "H5Dget_type failed");
-   }
+//--------------------------------------------------------------------------
+// Function:    IntType overloaded constructor
+///\brief       Creates a IntType instance by opening an HDF5 integer datatype
+///             given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Integer type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openArrayType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+IntType::IntType(const H5Location& loc, const H5std_string& dtype_name) : AtomType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	IntType::getSign
-///\brief	Retrieves the sign type for an integer type.
-///\return	Valid sign type
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType::getSign
+///\brief       Retrieves the sign type for an integer type.
+///\return      Valid sign type
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5T_sign_t IntType::getSign() const
 {
-   H5T_sign_t type_sign = H5Tget_sign( id );  // C routine
+    H5T_sign_t type_sign = H5Tget_sign(id);  // C routine
 
-   // Returns a valid sign type if no errors
-   if( type_sign == H5T_SGN_ERROR )
-   {
-      throw DataTypeIException("IntType::getSign",
-		"H5Tget_sign failed - returned H5T_SGN_ERROR for the sign type");
-   }
-   return( type_sign );
+    // Returns a valid sign type if no errors
+    if (type_sign == H5T_SGN_ERROR)
+    {
+        throw DataTypeIException("IntType::getSign",
+            "H5Tget_sign failed - returned H5T_SGN_ERROR for the sign type");
+    }
+    return(type_sign);
 }
 
 //--------------------------------------------------------------------------
-// Function:	IntType::getSign
-///\brief	Sets the sign property for an integer type.
-///\param	sign - IN: Sign type
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType::getSign
+///\brief       Sets the sign property for an integer type.
+///\param       sign - IN: Sign type
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void IntType::setSign( H5T_sign_t sign ) const
+void IntType::setSign(H5T_sign_t sign) const
 {
-   // Call C routine to set the sign property
-   herr_t ret_value = H5Tset_sign( id, sign );
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("IntType::setSign", "H5Tset_sign failed");
-   }
+    // Call C routine to set the sign property
+    herr_t ret_value = H5Tset_sign(id, sign);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("IntType::setSign", "H5Tset_sign failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	IntType destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    IntType destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 IntType::~IntType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5IntType.h b/c++/src/H5IntType.h
index e28f5c2..a61f89f 100644
--- a/c++/src/H5IntType.h
+++ b/c++/src/H5IntType.h
@@ -6,52 +6,56 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5IntType_H
 #define __H5IntType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class IntType operates on HDF5 integer datatype.
+/*! \class IntType
+    \brief IntType is derived from a DataType and operates on HDF5
+    integer datatype.
+*/
+//  Inheritance: AtomType -> DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP IntType : public AtomType {
    public:
-	// Creates an integer type using a predefined type
-	IntType(const PredType& pred_type);
+        // Creates an integer type using a predefined type
+        IntType(const PredType& pred_type);
 
-	// Gets the integer datatype of the specified dataset
-	IntType(const DataSet& dataset);
+        // Gets the integer datatype of the specified dataset
+        IntType(const DataSet& dataset);
 
-	// Retrieves the sign type for an integer type
-	H5T_sign_t getSign() const;
+        // Constructors that open an HDF5 integer datatype, given a location.
+        IntType(const H5Location& loc, const char* name);
+        IntType(const H5Location& loc, const H5std_string& name);
 
-	// Sets the sign proprety for an integer type.
-	void setSign( H5T_sign_t sign ) const;
+        // Retrieves the sign type for an integer type
+        H5T_sign_t getSign() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("IntType"); }
+        // Sets the sign proprety for an integer type.
+        void setSign(H5T_sign_t sign) const;
 
-	// Default constructor
-	IntType();
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("IntType"); }
 
-	// Creates a integer datatype using an existing id
-	IntType(const hid_t existing_id);
+        // Default constructor
+        IntType();
 
-	// Copy constructor: makes copy of IntType object
-	IntType(const IntType& original);
+        // Creates a integer datatype using an existing id
+        IntType(const hid_t existing_id);
+
+        // Copy constructor: makes copy of IntType object
+        IntType(const IntType& original);
+
+        // Noop destructor.
+        virtual ~IntType();
+
+}; // end of IntType
+} // namespace H5
 
-	// Noop destructor.
-	virtual ~IntType();
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5IntType_H
diff --git a/c++/src/H5LaccProp.cpp b/c++/src/H5LaccProp.cpp
new file mode 100644
index 0000000..1267286
--- /dev/null
+++ b/c++/src/H5LaccProp.cpp
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <string>
+
+#include "H5Include.h"
+#include "H5Exception.h"
+#include "H5IdComponent.h"
+#include "H5PropList.h"
+#include "H5LaccProp.h"
+
+namespace H5 {
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+// This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
+// the order of creation and deletion of the global constants.  See Design Notes
+// in "H5PredType.cpp" for information.
+
+// Initialize a pointer for the constant
+LinkAccPropList* LinkAccPropList::DEFAULT_ = 0;
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList::getConstant
+//              Creates a LinkAccPropList object representing the HDF5 constant
+//              H5P_LINK_ACCESS, pointed to by LinkAccPropList::DEFAULT_
+// exception    H5::PropListIException
+// Description
+//              If LinkAccPropList::DEFAULT_ already points to an allocated
+//              object, throw a PropListIException.  This scenario should not
+//              happen.
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+LinkAccPropList* LinkAccPropList::getConstant()
+{
+    // Tell the C library not to clean up, H5Library::termH5cpp will call
+    // H5close - more dependency if use H5Library::dontAtExit()
+    if (!IdComponent::H5dontAtexit_called)
+     {
+        (void) H5dont_atexit();
+        IdComponent::H5dontAtexit_called = true;
+    }
+
+    // If the constant pointer is not allocated, allocate it. Otherwise,
+    // throw because it shouldn't be.
+    if (DEFAULT_ == 0)
+        DEFAULT_ = new LinkAccPropList(H5P_LINK_ACCESS);
+    else
+        throw PropListIException("LinkAccPropList::getConstant", "LinkAccPropList::getConstant is being invoked on an allocated DEFAULT_");
+    return(DEFAULT_);
+}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList::deleteConstants
+// Purpose:     Deletes the constant object that LinkAccPropList::DEFAULT_
+//              points to.
+// exception    H5::PropListIException
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+void LinkAccPropList::deleteConstants()
+{
+    if (DEFAULT_ != 0)
+        delete DEFAULT_;
+}
+
+//--------------------------------------------------------------------------
+// Purpose:     Constant for default property
+//--------------------------------------------------------------------------
+const LinkAccPropList& LinkAccPropList::DEFAULT = *getConstant();
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+//--------------------------------------------------------------------------
+// Function:    Default Constructor
+///\brief       Creates a file access property list
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+LinkAccPropList::LinkAccPropList() : PropList(H5P_LINK_ACCESS) {}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList copy constructor
+///\brief       Copy Constructor: makes a copy of the original
+///\param       original - IN: LinkAccPropList instance to copy
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+LinkAccPropList::LinkAccPropList(const LinkAccPropList& original) : PropList(original) {}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList overloaded constructor
+///\brief       Creates a file access property list using the id of an
+///             existing one.
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+LinkAccPropList::LinkAccPropList(const hid_t plist_id) : PropList(plist_id) {}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList::setNumLinks
+///\brief       Set the number of soft or user-defined link traversals allowed
+///             before the library assumes it has found a cycle and aborts the
+///             traversal.
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - March 1, 2017
+//--------------------------------------------------------------------------
+void LinkAccPropList::setNumLinks(size_t nlinks) const
+{
+    herr_t ret_value = H5Pset_nlinks(id, nlinks);
+    // Throw exception if H5Pset_nlinks returns failure
+    if (ret_value < 0)
+    {
+        throw PropListIException("setNumLinks", "H5Pset_nlinks failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList::getNumLinks
+///\brief       Gets the number of soft or user-defined links that can be
+///             traversed before a failure occurs.
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - March 1, 2017
+//--------------------------------------------------------------------------
+size_t LinkAccPropList::getNumLinks() const
+{
+    size_t nlinks = 0;
+    herr_t ret_value = H5Pget_nlinks(id, &nlinks);
+    // Throw exception if H5Pget_nlinks returns failure
+    if (ret_value < 0)
+    {
+        throw PropListIException("getNumLinks", "H5Pget_nlinks failed");
+    }
+    return(nlinks);
+}
+
+//--------------------------------------------------------------------------
+// Function:    LinkAccPropList destructor
+///\brief       Noop destructor
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+LinkAccPropList::~LinkAccPropList() {}
+
+} // end namespace
diff --git a/c++/src/H5LaccProp.h b/c++/src/H5LaccProp.h
new file mode 100644
index 0000000..829a88c
--- /dev/null
+++ b/c++/src/H5LaccProp.h
@@ -0,0 +1,72 @@
+// C++ informative line for the emacs editor: -*- C++ -*-
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+// Class LinkAccPropList represents the HDF5 file access property list and
+// inherits from DataType.
+
+#ifndef __H5LinkAccPropList_H
+#define __H5LinkAccPropList_H
+
+namespace H5 {
+
+/*! \class LinkAccPropList
+    \brief Class LinkAccPropList inherits from PropList and provides
+    wrappers for the HDF5 file access property list.
+*/
+//  Inheritance: PropList -> IdComponent
+class H5_DLLCPP LinkAccPropList : public PropList {
+   public:
+        ///\brief Default file access property list.
+        static const LinkAccPropList& DEFAULT;
+
+        // Creates a file access property list.
+        LinkAccPropList();
+
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("LinkAccPropList"); }
+
+        // Copy constructor: creates a copy of a LinkAccPropList object.
+        LinkAccPropList(const LinkAccPropList& original);
+
+        // Creates a copy of an existing file access property list
+        // using the property list id.
+        LinkAccPropList (const hid_t plist_id);
+
+        // Sets the number of soft or user-defined links that can be
+        // traversed before a failure occurs.
+        void setNumLinks(size_t nlinks) const;
+
+        // Gets the number of soft or user-defined link traversals allowed
+        size_t getNumLinks() const;
+
+        // Noop destructor
+        virtual ~LinkAccPropList();
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+        // Deletes the global constant, should only be used by the library
+        static void deleteConstants();
+
+    private:
+        static LinkAccPropList* DEFAULT_;
+
+        // Creates the global constant, should only be used by the library
+        static LinkAccPropList* getConstant();
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+}; // end of LinkAccPropList
+} // namespace H5
+
+#endif // __H5LinkAccPropList_H
diff --git a/c++/src/H5Library.cpp b/c++/src/H5Library.cpp
index be80fe4..9293622 100644
--- a/c++/src/H5Library.cpp
+++ b/c++/src/H5Library.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -25,147 +23,140 @@
 #include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DxferProp.h"
+#include "H5DcreatProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
 #include "H5Object.h"
 #include "H5DataType.h"
-#include "H5DcreatProp.h"
 #include "H5AtomType.h"
 #include "H5PredType.h"
 #include "H5DataSpace.h"
 #include "H5Library.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-// This static variable is unused, will be removed in future releases.
-bool H5Library::need_cleanup = false;
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::open (static)
-///\brief	Initializes the HDF5 library.
+// Function:    H5Library::open (static)
+///\brief       Initializes the HDF5 library.
 ///
-///\exception	H5::LibraryIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::LibraryIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5Library::open()
 {
-   herr_t ret_value = H5open();
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::open", "H5open failed");
-   }
+    herr_t ret_value = H5open();
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::open", "H5open failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::close (static)
-///\brief	Flushes all data to disk, closes files, and cleans up memory.
+// Function:    H5Library::close (static)
+///\brief       Flushes all data to disk, closes files, and cleans up memory.
 ///
-///\exception	H5::LibraryIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::LibraryIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5Library::close()
 {
-   herr_t ret_value = H5close();
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::close", "H5close failed");
-   }
+    herr_t ret_value = H5close();
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::close", "H5close failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::dontAtExit (static)
-///\brief	Instructs library not to install the C \c atexit cleanup routine
+// Function:    H5Library::dontAtExit (static)
+///\brief       Instructs library not to install the C \c atexit cleanup routine
 ///
-///\exception	H5::LibraryIException
-// Programmer	Binh-Minh Ribler - 2000
+///\exception   H5::LibraryIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Removed the check for failure returned from H5dont_atexit.
-//		will be fixed to not fail (HDFFV-9540)
+//              Removed the check for failure returned from H5dont_atexit.
+//              will be fixed to not fail (HDFFV-9540)
 //--------------------------------------------------------------------------
 void H5Library::dontAtExit()
 {
-   herr_t ret_value = H5dont_atexit();
+   (void)H5dont_atexit();
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::getLibVersion (static)
-///\brief	Returns the HDF library release number.
-///\param	majnum - OUT: Major version of the library
-///\param	minnum - OUT: Minor version of the library
-///\param	relnum - OUT: Release number of the library
-///\exception	H5::LibraryIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Library::getLibVersion (static)
+///\brief       Returns the HDF library release number.
+///\param       majnum - OUT: Major version of the library
+///\param       minnum - OUT: Minor version of the library
+///\param       relnum - OUT: Release number of the library
+///\exception   H5::LibraryIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void H5Library::getLibVersion( unsigned& majnum, unsigned& minnum, unsigned& relnum )
+void H5Library::getLibVersion(unsigned& majnum, unsigned& minnum, unsigned& relnum)
 {
-   herr_t ret_value = H5get_libversion( &majnum, &minnum, &relnum );
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::getLibVersion", "H5get_libversion failed");
-   }
+    herr_t ret_value = H5get_libversion(&majnum, &minnum, &relnum);
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::getLibVersion", "H5get_libversion failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::checkVersion (static)
-///\brief	Verifies that the arguments match the version numbers
-///		compiled into the library
-///\param	majnum - IN: Major version of the library
-///\param	minnum - IN: Minor version of the library
-///\param	relnum - IN: Release number of the library
-///\exception	H5::LibraryIException
+// Function:    H5Library::checkVersion (static)
+///\brief       Verifies that the arguments match the version numbers
+///             compiled into the library
+///\param       majnum - IN: Major version of the library
+///\param       minnum - IN: Minor version of the library
+///\param       relnum - IN: Release number of the library
+///\exception   H5::LibraryIException
 ///\par Description
-///		For information about library version, please refer to
-///		the C layer Reference Manual at:
+///             For information about library version, please refer to
+///             the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5.html#Library-VersCheck
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5Library::checkVersion(unsigned majnum, unsigned minnum, unsigned relnum)
 {
-   herr_t ret_value = H5check_version(majnum, minnum, relnum);
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::checkVersion", "H5check_version failed");
-   }
+    herr_t ret_value = H5check_version(majnum, minnum, relnum);
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::checkVersion", "H5check_version failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::garbageCollect (static)
-///\brief	Walks through all the garbage collection routines for the
-///		library, which are supposed to free any unused memory they
-///		have allocated.
+// Function:    H5Library::garbageCollect (static)
+///\brief       Walks through all the garbage collection routines for the
+///             library, which are supposed to free any unused memory they
+///             have allocated.
 ///
-///\exception	H5::LibraryIException
+///\exception   H5::LibraryIException
 ///\par Description
-///		It is not required that H5Library::garbageCollect be called
-///		at any particular time; it is only necessary in certain
-///		situations, such as when the application has performed actions
-///		that cause the library to allocate many objects. The
-///		application should call H5Library::garbageCollect if it
-///		eventually releases those objects and wants to reduce the
-///		memory used by the library from the peak usage required.
+///             It is not required that H5Library::garbageCollect be called
+///             at any particular time; it is only necessary in certain
+///             situations, such as when the application has performed actions
+///             that cause the library to allocate many objects. The
+///             application should call H5Library::garbageCollect if it
+///             eventually releases those objects and wants to reduce the
+///             memory used by the library from the peak usage required.
 ///\par
-///		The library automatically garbage collects all the free
-///		lists when the application ends.
-// Programmer	Binh-Minh Ribler - May, 2004
+///             The library automatically garbage collects all the free
+///             lists when the application ends.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Library::garbageCollect()
 {
-   herr_t ret_value = H5garbage_collect();
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::garbageCollect", "H5garbage_collect failed");
-   }
+    herr_t ret_value = H5garbage_collect();
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::garbageCollect", "H5garbage_collect failed");
+    }
 }
 
 //--------------------------------------------------------------------------
 // Function:    H5Library::initH5cpp (static)
 ///\brief       Initializes C++ library and registers terminating functions at
-///		exit.  Only for the library functions, not for user-defined
-///		functions.
+///             exit.  Only for the library functions, not for user-defined
+///             functions.
 // Description
 //              initH5cpp registers the following functions with std::atexit():
 //                      termH5cpp() - calls H5close() after all cleanup in
@@ -193,23 +184,27 @@ void H5Library::initH5cpp()
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating PropList::deleteConstants failed");
 
-     ret_value = std::atexit(FileAccPropList::deleteConstants);
+    ret_value = std::atexit(LinkAccPropList::deleteConstants);
+    if (ret_value != 0)
+        throw LibraryIException("H5Library::initH5cpp", "Registrating LinkAccPropList::deleteConstants failed");
+
+    ret_value = std::atexit(FileAccPropList::deleteConstants);
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating FileAccPropList::deleteConstants failed");
 
-     ret_value = std::atexit(FileCreatPropList::deleteConstants);
+    ret_value = std::atexit(FileCreatPropList::deleteConstants);
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating FileCreatPropList::deleteConstants failed");
 
-     ret_value = std::atexit(DSetMemXferPropList::deleteConstants);
+    ret_value = std::atexit(DSetMemXferPropList::deleteConstants);
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating DSetMemXferPropList::deleteConstants failed");
 
-     ret_value = std::atexit(DSetCreatPropList::deleteConstants);
+    ret_value = std::atexit(DSetCreatPropList::deleteConstants);
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating DSetCreatPropList::deleteConstants failed");
 
-     ret_value = std::atexit(ObjCreatPropList::deleteConstants);
+    ret_value = std::atexit(ObjCreatPropList::deleteConstants);
     if (ret_value != 0)
         throw LibraryIException("H5Library::initH5cpp", "Registrating ObjCreatPropList::deleteConstants failed");
 
@@ -234,39 +229,47 @@ void H5Library::termH5cpp()
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Library::setFreeListLimits (static)
-///\brief	Sets limits on the different kinds of free lists.
-///\param	reg_global_lim - IN: Limit on all "regular" free list memory used
-///\param	reg_list_lim   - IN: Limit on memory used in each "regular" free list
-///\param	arr_global_lim - IN: Limit on all "array" free list memory used
-///\param	arr_list_lim   - IN: Limit on memory used in each "array" free list
-///\param	blk_global_lim - IN: Limit on all "block" free list memory used
-///\param	blk_list_lim   - IN: Limit on memory used in each "block" free list
-///\exception	H5::LibraryIException
+// Function:    H5Library::setFreeListLimits (static)
+///\brief       Sets limits on the different kinds of free lists.
+///\param       reg_global_lim - IN: Limit on all "regular" free list memory used
+///\param       reg_list_lim   - IN: Limit on memory used in each "regular" free list
+///\param       arr_global_lim - IN: Limit on all "array" free list memory used
+///\param       arr_list_lim   - IN: Limit on memory used in each "array" free list
+///\param       blk_global_lim - IN: Limit on all "block" free list memory used
+///\param       blk_list_lim   - IN: Limit on memory used in each "block" free list
+///\exception   H5::LibraryIException
 ///\par Description
-///		Setting a value of -1 for a limit means no limit of that type.
-///		For more information on free list limits, please refer to C
-///		layer Reference Manual at:
+///             Setting a value of -1 for a limit means no limit of that type.
+///             For more information on free list limits, please refer to C
+///             layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5.html#Library-SetFreeListLimits
-// Programmer	Binh-Minh Ribler - May, 2004
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Library::setFreeListLimits(int reg_global_lim, int reg_list_lim,
-	int arr_global_lim, int arr_list_lim, int blk_global_lim,
-	int blk_list_lim)
+        int arr_global_lim, int arr_list_lim, int blk_global_lim,
+        int blk_list_lim)
 {
-   herr_t ret_value = H5set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim, blk_list_lim);
-   if( ret_value < 0 )
-   {
-      throw LibraryIException("H5Library::setFreeListLimits", "H5set_free_list_limits failed");
-   }
+    herr_t ret_value = H5set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim, blk_list_lim);
+    if (ret_value < 0)
+    {
+        throw LibraryIException("H5Library::setFreeListLimits", "H5set_free_list_limits failed");
+    }
 }
 
-// Default constructor - private
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+//--------------------------------------------------------------------------
+// Function:    H5Library default constructor - private
+///\brief       Default constructor: Creates a stub H5Library object
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
 H5Library::H5Library(){}
 
-// Destructor - private
+//--------------------------------------------------------------------------
+// Function:    H5Library destructor
+///\brief       Noop destructor
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
 H5Library::~H5Library(){}
+#endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5Library.h b/c++/src/H5Library.h
index 336f9c8..9b4150e 100644
--- a/c++/src/H5Library.h
+++ b/c++/src/H5Library.h
@@ -6,20 +6,16 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Library_H
 #define __H5Library_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class H5Library
     \brief Class H5Library operates the HDF5 library globably.
@@ -29,37 +25,32 @@ namespace H5 {
 */
 class H5_DLLCPP H5Library {
    public:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-        static bool need_cleanup; // indicates if H5close should be called
-                             // - unused, will be removed in future releases.
-#endif // DOXYGEN_SHOULD_SKIP_THIS
+        // Initializes the HDF5 library.
+        static void open();
 
-	// Initializes the HDF5 library.
-	static void open();
+        // Flushes all data to disk, closes files, and cleans up memory.
+        static void close();
 
-	// Flushes all data to disk, closes files, and cleans up memory.
-	static void close();
+        // Instructs library not to install atexit cleanup routine
+        static void dontAtExit();
 
-	// Instructs library not to install atexit cleanup routine
-	static void dontAtExit();
+        // Returns the HDF library release number.
+        static void getLibVersion(unsigned& majnum, unsigned& minnum, unsigned& relnum);
 
-	// Returns the HDF library release number.
-	static void getLibVersion( unsigned& majnum, unsigned& minnum, unsigned& relnum );
+        // Verifies that the arguments match the version numbers compiled
+        // into the library
+        static void checkVersion(unsigned majnum, unsigned minnum, unsigned relnum);
 
-	// Verifies that the arguments match the version numbers compiled
-	// into the library
-	static void checkVersion( unsigned majnum, unsigned minnum, unsigned relnum );
+        // Walks through all the garbage collection routines for the library,
+        // which are supposed to free any unused memory they have allocated.
+        static void garbageCollect();
 
-	// Walks through all the garbage collection routines for the library,
-	// which are supposed to free any unused memory they have allocated.
-	static void garbageCollect();
-
-	// Sets limits on the different kinds of free lists.
-	static void setFreeListLimits(int reg_global_lim, int reg_list_lim, int
-	arr_global_lim, int arr_list_lim, int blk_global_lim, int blk_list_lim);
+        // Sets limits on the different kinds of free lists.
+        static void setFreeListLimits(int reg_global_lim, int reg_list_lim, int
+        arr_global_lim, int arr_list_lim, int blk_global_lim, int blk_list_lim);
 
         // Initializes C++ library and registers terminating functions at exit.
-	// Only for the library functions, not for user-defined functions.
+        // Only for the library functions, not for user-defined functions.
         static void initH5cpp(void);
 
         // Sends request for terminating the HDF5 library.
@@ -76,8 +67,7 @@ class H5_DLLCPP H5Library {
         ~H5Library();
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of H5Library
+} // namespace H5
+
 #endif // __H5Library_H
diff --git a/c++/src/H5Location.cpp b/c++/src/H5Location.cpp
index e2b68ae..b2fa75d 100644
--- a/c++/src/H5Location.cpp
+++ b/c++/src/H5Location.cpp
@@ -5,84 +5,66 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
+#include "H5DataSpace.h"
 #include "H5PropList.h"
-#include "H5Location.h"
-#include "H5Object.h"
+#include "H5FaccProp.h"
+#include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
 #include "H5DxferProp.h"
-#include "H5FaccProp.h"
-#include "H5FcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
-#include "H5DataSpace.h"
 #include "H5AbstractDs.h"
-#include "H5File.h"
 #include "H5DataSet.h"
-#include "H5Attribute.h"
-#include "H5private.h"		// for HDmemset
+#include "H5CommonFG.h"
+#include "H5Group.h"
+#include "H5File.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-// userAttrOpWrpr simply interfaces between the user's function and the
-// C library function H5Aiterate2; used to resolve the different prototype
-// problem.  May be moved to Iterator later.
-extern "C" herr_t userAttrOpWrpr(hid_t loc_id, const char *attr_name,
-    const H5A_info_t *ainfo, void *op_data)
-{
-   H5std_string s_attr_name = H5std_string( attr_name );
-#ifdef NO_STATIC_CAST
-   UserData4Aiterate* myData = (UserData4Aiterate *) op_data;
-#else
-   UserData4Aiterate* myData = reinterpret_cast<UserData4Aiterate *> (op_data);
-#endif
-   myData->op( *myData->location, s_attr_name, myData->opData );
-   return 0;
-}
-
 //--------------------------------------------------------------------------
-// Function:	H5Location default constructor (protected)
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Location default constructor (protected)
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5Location::H5Location() : IdComponent() {}
 
 //--------------------------------------------------------------------------
-// Function:	H5Location overloaded constructor (protected)
-// Purpose	Creates an H5Location object using the id of an existing HDF5
-//		object.
-// Parameters	object_id - IN: Id of an existing HDF5 object
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Location overloaded constructor (protected)
+// Purpose      Creates an H5Location object using the id of an existing HDF5
+//              object.
+// Parameters   object_id - IN: Id of an existing HDF5 object
+// Programmer   Binh-Minh Ribler - 2000
 
 // *** Deprecation warning ***
 // This constructor is no longer appropriate because the data member "id" had
 // been moved to the sub-classes.  It will be removed in 1.10 release.  If its
 // removal does not raise any problems in 1.10, it will be removed from 1.8 in
 // subsequent releases.
+// Removed in 1.10.1 - Aug 2016
 //--------------------------------------------------------------------------
-H5Location::H5Location(const hid_t object_id) : IdComponent() {}
+// H5Location::H5Location(const hid_t object_id) : IdComponent() {}
 
 //--------------------------------------------------------------------------
-// Function:	H5Location copy constructor
-// Purpose:	This noop copy constructor is removed as a result of the data
-//		member "id" being moved down to sub-classes. (Mar 2015)
-///\param	original - IN: H5Location instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Location copy constructor
+// Purpose      This noop copy constructor is removed as a result of the data
+//              member "id" being moved down to sub-classes. (Mar 2015)
+///\param       original - IN: H5Location instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //
 // *** Deprecation warning ***
 // This constructor is no longer appropriate because the data member "id" had
@@ -94,414 +76,192 @@ H5Location::H5Location(const hid_t object_id) : IdComponent() {}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::createAttribute
-///\brief	Creates an attribute for a group, dataset, or named datatype.
-///\param	name - IN: Name of the attribute
-///\param	data_type - IN: Datatype for the attribute
-///\param	data_space - IN: Dataspace for the attribute - only simple
-///		dataspaces are allowed at this time
-///\param	create_plist - IN: Creation property list - default to
-///		PropList::DEFAULT
-///\return	Attribute instance
-///\exception	H5::AttributeIException
-///\par Description
-///		The attribute name specified in \a name must be unique.
-///		Attempting to create an attribute with the same name as an
-///		existing attribute will raise an exception, leaving the
-///		pre-existing attribute intact. To overwrite an existing
-///		attribute with a new attribute of the same name, first
-///		delete the existing one with \c H5Location::removeAttr, then
-///		recreate it with this function.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Attribute H5Location::createAttribute( const char* name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist ) const
-{
-   hid_t type_id = data_type.getId();
-   hid_t space_id = data_space.getId();
-   hid_t plist_id = create_plist.getId();
-   hid_t attr_id = H5Acreate2(getId(), name, type_id, space_id, plist_id, H5P_DEFAULT );
-
-   // If the attribute id is valid, create and return the Attribute object
-   if( attr_id > 0 )
-   {
-	Attribute attr;
-	f_Attribute_setId(&attr, attr_id);
-	return( attr );
-   }
-   else
-      throw AttributeIException(inMemFunc("createAttribute"), "H5Acreate2 failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::createAttribute
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes
-///		a reference to an \c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Attribute H5Location::createAttribute( const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist ) const
-{
-   return( createAttribute( name.c_str(), data_type, data_space, create_plist ));
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::openAttribute
-///\brief	Opens an attribute given its name.
-///\param	name - IN: Name of the attribute
-///\return	Attribute instance
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Attribute H5Location::openAttribute( const char* name ) const
-{
-   hid_t attr_id = H5Aopen(getId(), name, H5P_DEFAULT);
-   if( attr_id > 0 )
-   {
-	Attribute attr;
-	f_Attribute_setId(&attr, attr_id);
-	return( attr );
-   }
-   else
-   {
-      throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::openAttribute
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes
-///		a reference to an \c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Attribute H5Location::openAttribute( const H5std_string& name ) const
-{
-   return( openAttribute( name.c_str()) );
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::openAttribute
-///\brief	Opens an attribute given its index.
-///\param	idx - IN: Index of the attribute, a 0-based, non-negative integer
-///\return	Attribute instance
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-Attribute H5Location::openAttribute( const unsigned int idx ) const
-{
-   hid_t attr_id = H5Aopen_by_idx(getId(), ".", H5_INDEX_CRT_ORDER,
-		H5_ITER_INC, static_cast<hsize_t>(idx), H5P_DEFAULT, H5P_DEFAULT);
-   if( attr_id > 0 )
-   {
-	Attribute attr;
-	f_Attribute_setId(&attr, attr_id);
-	return(attr);
-   }
-   else
-   {
-	throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen_by_idx failed");
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::iterateAttrs
-///\brief	Iterates a user's function over all the attributes of an H5
-///		object, which may be a group, dataset or named datatype.
-///\param	user_op - IN: User's function to operate on each attribute
-///\param	_idx - IN/OUT: Starting (IN) and ending (OUT) attribute indices
-///\param	op_data - IN: User's data to pass to user's operator function
-///\return	Returned value of the last operator if it was non-zero, or
-///		zero if all attributes were processed
-///\exception	H5::AttributeIException
-///\par Description
-///		The signature of user_op is
-///		void (*)(H5::H5Location&, H5std_string, void*).
-///		For information, please refer to the C layer Reference Manual
-///		at:
-/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5A.html#Annot-Iterate
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-int H5Location::iterateAttrs( attr_operator_t user_op, unsigned *_idx, void *op_data )
-{
-   // store the user's function and data
-   UserData4Aiterate* userData = new UserData4Aiterate;
-   userData->opData = op_data;
-   userData->op = user_op;
-   userData->location = this;
-
-   // call the C library routine H5Aiterate2 to iterate the attributes
-   hsize_t idx = _idx ? (hsize_t)*_idx : 0;
-   int ret_value = H5Aiterate2(getId(), H5_INDEX_NAME, H5_ITER_INC, &idx,
-			userAttrOpWrpr, reinterpret_cast<void *>(userData));
-
-   // release memory
-   delete userData;
-
-   if( ret_value >= 0 ) {
-      /* Pass back update index value to calling code */
-      if (_idx)
-	 *_idx = static_cast<unsigned>(idx);
-
-      return( ret_value );
-   }
-   else  // raise exception when H5Aiterate returns a negative value
-      throw AttributeIException(inMemFunc("iterateAttrs"), "H5Aiterate2 failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::getNumAttrs
-///\brief	Returns the number of attributes attached to this HDF5 object.
-///\return	Number of attributes
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-int H5Location::getNumAttrs() const
-{
-   H5O_info_t oinfo;    /* Object info */
-
-   if(H5Oget_info(getId(), &oinfo) < 0)
-      throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed");
-   else
-      return(static_cast<int>(oinfo.num_attrs));
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::attrExists
-///\brief	Checks whether the named attribute exists at this location.
-///\param	name - IN: Name of the attribute to be queried
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2013
-//--------------------------------------------------------------------------
-bool H5Location::attrExists(const char* name) const
-{
-   // Call C routine H5Aexists to determine whether an attribute exists
-   // at this location, which could be specified by a file, group, dataset,
-   // or named datatype.
-   herr_t ret_value = H5Aexists(getId(), name);
-   if( ret_value > 0 )
-      return true;
-   else if(ret_value == 0)
-      return false;
-   else // Raise exception when H5Aexists returns a negative value
-      throw AttributeIException(inMemFunc("attrExists"), "H5Aexists failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::attrExists
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes
-///		a reference to an \c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-bool H5Location::attrExists(const H5std_string& name) const
-{
-   return(attrExists(name.c_str()));
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::removeAttr
-///\brief	Removes the named attribute from this object.
-///\param	name - IN: Name of the attribute to be removed
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void H5Location::removeAttr( const char* name ) const
-{
-   herr_t ret_value = H5Adelete(getId(), name);
-   if( ret_value < 0 )
-      throw AttributeIException(inMemFunc("removeAttr"), "H5Adelete failed");
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::removeAttr
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes
-///		a reference to an \c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void H5Location::removeAttr( const H5std_string& name ) const
-{
-   removeAttr( name.c_str() );
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::renameAttr
-///\brief	Renames the named attribute from this object.
-///\param	oldname - IN: Name of the attribute to be renamed
-///\param	newname - IN: New name ame of the attribute
-///\exception	H5::AttributeIException
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    H5Location::exists
+///\brief       Checks if a link of a given name exists in a location
+///\param       name - IN: Searched name
+///\param       lapl - IN: Link access property list
+///\exception   H5::LocationException
+// Programmer   Binh-Minh Ribler - Nov, 2016
+// Modification
 //--------------------------------------------------------------------------
-void H5Location::renameAttr(const char* oldname, const char* newname) const
+bool H5Location::exists(const char* name, const LinkAccPropList& lapl) const
 {
-   herr_t ret_value = H5Arename(getId(), oldname, newname);
-   if (ret_value < 0)
-      throw AttributeIException(inMemFunc("renameAttr"), "H5Arename failed");
+    htri_t ret_value = H5Lexists(getId(), name, lapl.getId());
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Lexists returns a negative value
+    {
+        throwException("exists", "H5Lexists failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::renameAttr
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes
-///		a reference to an \c H5std_string for the names.
-// Programmer	Binh-Minh Ribler - Mar, 2005
+// Function:    H5Location::exists
+///\brief       Checks if a link of a given name exists in a location
+///\param       name - IN: Searched name
+///\param       lapl - IN: Link access property list
+///\exception   H5::LocationException
+// Programmer   Binh-Minh Ribler - Dec, 2016
+// Modification
 //--------------------------------------------------------------------------
-void H5Location::renameAttr(const H5std_string& oldname, const H5std_string& newname) const
+bool H5Location::exists(const H5std_string& name, const LinkAccPropList& lapl) const
 {
-   renameAttr (oldname.c_str(), newname.c_str());
+    return(exists(name.c_str(), lapl));
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::flush
-///\brief	Flushes all buffers associated with a location to disk.
-///\param	scope - IN: Specifies the scope of the flushing action,
-///		which can be either of these values:
-///		\li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file
-///		\li \c H5F_SCOPE_LOCAL - Flushes only the specified file
-///\exception	H5::Exception
+// Function:    H5Location::flush
+///\brief       Flushes all buffers associated with a location to disk.
+///\param       scope - IN: Specifies the scope of the flushing action,
+///             which can be either of these values:
+///             \li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file
+///             \li \c H5F_SCOPE_LOCAL - Flushes only the specified file
+///\exception   H5::Exception
 ///\par Description
-///		This location is used to identify the file to be flushed.
-// Programmer	Binh-Minh Ribler - 2012
+///             This location is used to identify the file to be flushed.
+// Programmer   Binh-Minh Ribler - 2012
 // Modification
-//	Sep 2012 - BMR
-//		Moved from H5File/H5Object
+//        Sep 2012 - BMR
+//              Moved from H5File/H5Object
 //--------------------------------------------------------------------------
 void H5Location::flush(H5F_scope_t scope) const
 {
-   herr_t ret_value = H5Fflush(getId(), scope);
-   if( ret_value < 0 )
-   {
-      throw LocationException(inMemFunc("flush"), "H5Fflush failed");
-   }
+    herr_t ret_value = H5Fflush(getId(), scope);
+    if (ret_value < 0)
+    {
+        throw LocationException(inMemFunc("flush"), "H5Fflush failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::getFileName
-///\brief	Gets the name of the file, in which this HDF5 object belongs.
-///\return	File name
-///\exception	H5::LocationException
-// Programmer	Binh-Minh Ribler - Jul, 2004
+// Function:    H5Location::getFileName
+///\brief       Gets the name of the file, in which this HDF5 object belongs.
+///\return      File name
+///\exception   H5::LocationException
+// Programmer   Binh-Minh Ribler - Jul, 2004
 //--------------------------------------------------------------------------
 H5std_string H5Location::getFileName() const
 {
-   try {
+    try {
       return(p_get_file_name());
-   }
-   catch (LocationException E) {
-      throw FileIException(inMemFunc("getFileName"), E.getDetailMsg());
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::setComment
-///\brief	Sets or resets the comment for an object specified by its name.
-///\param	name  - IN: Name of the object
-///\param	comment - IN: New comment
-///\exception	H5::LocationException
-///\par	Description
-///		If \a comment is an empty string or a null pointer, the comment
-///		message is removed from the object.
-///		Comments should be relatively short, null-terminated, ASCII
-///		strings.  They can be attached to any object that has an
-///		object header, e.g., data sets, groups, named data types,
-///		and data spaces, but not symbolic links.
-// Programmer	Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
+    }
+    catch (LocationException& E) {
+        throw FileIException(inMemFunc("getFileName"), E.getDetailMsg());
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::setComment
+///\brief       Sets or resets the comment for an object specified by its name.
+///\param       name  - IN: Name of the object
+///\param       comment - IN: New comment
+///\exception   H5::LocationException
+///\par Description
+///             If \a comment is an empty string or a null pointer, the comment
+///             message is removed from the object.
+///             Comments should be relatively short, null-terminated, ASCII
+///             strings.  They can be attached to any object that has an
+///             object header, e.g., data sets, groups, named data types,
+///             and data spaces, but not symbolic links.
+// Programmer   Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
 // Modification
-//	2007: QAK modified to use H5O APIs; however the first parameter is
-//		no longer just file or group, this function should be moved
-//		to another class to accommodate attribute, dataset, and named
-//		datatype. - BMR
+//      2007: QAK modified to use H5O APIs; however the first parameter is
+//              no longer just file or group, this function should be moved
+//              to another class to accommodate attribute, dataset, and named
+//              datatype. - BMR
 //--------------------------------------------------------------------------
 void H5Location::setComment(const char* name, const char* comment) const
 {
-   herr_t ret_value = H5Oset_comment_by_name(getId(), name, comment, H5P_DEFAULT);
-   if( ret_value < 0 )
-      throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed");
+    herr_t ret_value = H5Oset_comment_by_name(getId(), name, comment, H5P_DEFAULT);
+    if (ret_value < 0)
+        throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::setComment
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name and \a comment.
-// Programmer	Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
+// Function:    H5Location::setComment
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name and \a comment.
+// Programmer   Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
 //--------------------------------------------------------------------------
 void H5Location::setComment(const H5std_string& name, const H5std_string& comment) const
 {
-   setComment(name.c_str(), comment.c_str());
+    setComment(name.c_str(), comment.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::setComment
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it doesn't take
-///		an object name.
-// Programmer	Binh-Minh Ribler - Sep 2013
+// Function:    H5Location::setComment
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it doesn't take
+///             an object name.
+// Programmer   Binh-Minh Ribler - Sep 2013
 // Modification
 //--------------------------------------------------------------------------
 void H5Location::setComment(const char* comment) const
 {
-   herr_t ret_value = H5Oset_comment_by_name(getId(), ".", comment, H5P_DEFAULT);
-   if( ret_value < 0 )
-      throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed");
+    herr_t ret_value = H5Oset_comment_by_name(getId(), ".", comment, H5P_DEFAULT);
+    if (ret_value < 0)
+        throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::setComment
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a comment.
-// Programmer	Binh-Minh Ribler - Sep 2013
+// Function:    H5Location::setComment
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a comment.
+// Programmer   Binh-Minh Ribler - Sep 2013
 //--------------------------------------------------------------------------
 void H5Location::setComment(const H5std_string& comment) const
 {
-   setComment(comment.c_str());
+    setComment(comment.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::removeComment
-///\brief	Removes the comment from an object specified by its name.
-///\param	name  - IN: Name of the object
-///\exception	H5::LocationException
-// Programmer	Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013)
-//	2007: QAK modified to use H5O APIs; however the first parameter is
-//		no longer just file or group, this function should be moved
-//		to another class to accommodate attribute, dataset, and named
-//		datatype. - BMR
+// Function:    H5Location::removeComment
+///\brief       Removes the comment from an object specified by its name.
+///\param       name  - IN: Name of the object
+///\exception   H5::LocationException
+// Programmer   Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013)
+//      2007: QAK modified to use H5O APIs; however the first parameter is
+//              no longer just file or group, this function should be moved
+//              to another class to accommodate attribute, dataset, and named
+//              datatype. - BMR
 //--------------------------------------------------------------------------
 void H5Location::removeComment(const char* name) const
 {
-   herr_t ret_value = H5Oset_comment_by_name(getId(), name, NULL, H5P_DEFAULT);
-   if( ret_value < 0 )
-      throw LocationException(inMemFunc("removeComment"), "H5Oset_comment_by_name failed");
+    herr_t ret_value = H5Oset_comment_by_name(getId(), name, NULL, H5P_DEFAULT);
+    if (ret_value < 0)
+        throw LocationException(inMemFunc("removeComment"), "H5Oset_comment_by_name failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::removeComment
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013)
+// Function:    H5Location::removeComment
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013)
 //--------------------------------------------------------------------------
 void H5Location::removeComment(const H5std_string& name) const
 {
-   removeComment (name.c_str());
+    removeComment (name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::getComment
-///\brief	Retrieves the comment for this location, returning its length.
-///\param	name     - IN: Name of the object
-///\param	buf_size - IN: Length of the comment to retrieve
-///\param	comment  - OUT: Retrieved comment
-///\return	Actual length of the comment
-///\exception	H5::LocationException
+// Function:    H5Location::getComment
+///\brief       Retrieves the comment for this location, returning its length.
+///\param       name     - IN: Name of the object
+///\param       buf_size - IN: Length of the comment to retrieve
+///\param       comment  - OUT: Retrieved comment
+///\return      Actual length of the comment
+///\exception   H5::LocationException
 ///\par Description
-///		This function retrieves \a buf_size characters of the comment
-///		including the null terminator.  Thus, if the actual length
-///		of the comment is more than buf_size-1, the retrieved comment
-///		will be truncated to accommodate the null terminator.
-// Programmer	Binh-Minh Ribler - Mar 2014
+///             This function retrieves \a buf_size characters of the comment
+///             including the null terminator.  Thus, if the actual length
+///             of the comment is more than buf_size-1, the retrieved comment
+///             will be truncated to accommodate the null terminator.
+// Programmer   Binh-Minh Ribler - Mar 2014
 //--------------------------------------------------------------------------
 ssize_t H5Location::getComment(const char* name, size_t buf_size, char* comment) const
 {
@@ -512,27 +272,27 @@ ssize_t H5Location::getComment(const char* name, size_t buf_size, char* comment)
 
     // If H5Oget_comment_by_name returns a negative value, raise an exception
     if (comment_len < 0)
-    {
+     {
         throw LocationException("H5Location::getComment", "H5Oget_comment_by_name failed");
     }
     // If the comment is longer than the provided buffer size, the C library
     // will not null terminate it
     if (static_cast<size_t>(comment_len) >= buf_size)
-	comment[buf_size-1] = '\0';
+        comment[buf_size-1] = '\0';
 
     // Return the actual comment length, which might be different from buf_size
     return(comment_len);
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::getComment
-///\brief	Returns the comment as \a string for this location,
-///		returning its length.
-///\param	name     - IN: Name of the object
-///\param	buf_size - IN: Length of the comment to retrieve, default to 0
-///\return	Comment string
-///\exception	H5::LocationException
-// Programmer	Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
+// Function:    H5Location::getComment
+///\brief       Returns the comment as \a string for this location,
+///             returning its length.
+///\param       name     - IN: Name of the object
+///\param       buf_size - IN: Length of the comment to retrieve, default to 0
+///\return      Comment string
+///\exception   H5::LocationException
+// Programmer   Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
 //--------------------------------------------------------------------------
 H5std_string H5Location::getComment(const char* name, size_t buf_size) const
 {
@@ -545,36 +305,36 @@ H5std_string H5Location::getComment(const char* name, size_t buf_size) const
 
     // If H5Oget_comment_by_name returns a negative value, raise an exception
     if (comment_len < 0)
-    {
+     {
         throw LocationException("H5Location::getComment", "H5Oget_comment_by_name failed");
     }
 
     // If comment exists, calls C routine again to get it
     else if (comment_len > 0)
-    {
-	size_t tmp_len = buf_size;
-
-	// If buffer size is not provided, use comment length
-	if (tmp_len == 0)
-	    tmp_len = comment_len;
-
-	// Temporary buffer for char* comment
-	char* comment_C = new char[tmp_len+1];
-	HDmemset(comment_C, 0, tmp_len+1); // clear buffer
-
-	// Used overloaded function
-	ssize_t comment_len = getComment(name, tmp_len+1, comment_C);
-	if (comment_len < 0)
-	{
-	    delete []comment_C;
-	    throw LocationException("H5Location::getComment", "H5Oget_comment_by_name failed");
-	}
-
-	// Convert the C comment to return
-	comment = comment_C;
-
-	// Clean up resource
-	delete []comment_C;
+     {
+        size_t tmp_len = buf_size;
+
+        // If buffer size is not provided, use comment length
+        if (tmp_len == 0)
+            tmp_len = comment_len;
+
+        // Temporary buffer for char* comment
+        char* comment_C = new char[tmp_len+1];
+        HDmemset(comment_C, 0, tmp_len+1); // clear buffer
+
+        // Used overloaded function
+        ssize_t temp_len = getComment(name, tmp_len+1, comment_C);
+        if (temp_len < 0)
+        {
+            delete []comment_C;
+            throw LocationException("H5Location::getComment", "H5Oget_comment_by_name failed");
+        }
+
+        // Convert the C comment to return
+        comment = comment_C;
+
+        // Clean up resource
+        delete []comment_C;
     }
 
     // Return the string comment
@@ -582,11 +342,11 @@ H5std_string H5Location::getComment(const char* name, size_t buf_size) const
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::getComment
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-// Programmer	Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
+// Function:    H5Location::getComment
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013)
 //--------------------------------------------------------------------------
 H5std_string H5Location::getComment(const H5std_string& name, size_t buf_size) const
 {
@@ -595,380 +355,1332 @@ H5std_string H5Location::getComment(const H5std_string& name, size_t buf_size) c
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::p_reference (protected)
-// Purpose	Creates a reference to an HDF5 object or a dataset region.
+// Function:    H5Location::p_reference (protected)
+// Purpose      Creates a reference to an HDF5 object or a dataset region.
 // Parameters
-//		name - IN: Name of the object to be referenced
-//		dataspace - IN: Dataspace with selection
-//		ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION
-// Exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+//              name - IN: Name of the object to be referenced
+//              dataspace - IN: Dataspace with selection
+//              ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION
+// Exception    H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Location::p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const
 {
-   herr_t ret_value = H5Rcreate(ref, getId(), name, ref_type, space_id);
-   if (ret_value < 0)
-   {
-      throw ReferenceException(inMemFunc("reference"), "H5Rcreate failed");
-   }
+    herr_t ret_value = H5Rcreate(ref, getId(), name, ref_type, space_id);
+    if (ret_value < 0)
+    {
+        throw ReferenceException(inMemFunc("reference"), "H5Rcreate failed");
+    }
 }
 
+//--------------------------------------------------------------------------
+// Function:    H5Location::p_dereference (protected)
+// Purpose      Dereference a ref into an hdf5 object.
+// Parameters
+//              loc_id - IN: An hdf5 identifier specifying the location of the
+//                          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 PropList& plist, const char* from_func)
+{
+    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");
+    }
+
+    return(temp_id);
+}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::reference
-///\brief	Creates a reference to an HDF5 object or a dataset region.
-///\param	ref - IN: Reference pointer
-///\param	name - IN: Name of the object to be referenced
-///\param	dataspace - IN: Dataspace with selection
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT         - Reference is an object reference.
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region
-///			reference. (default)
-///\exception	H5::ReferenceException
-///\note	This method is more suitable for a dataset region reference.
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::reference
+///\brief       Creates a reference to an HDF5 object or a dataset region.
+///\param       ref - IN: Reference pointer
+///\param       name - IN: Name of the object to be referenced
+///\param       dataspace - IN: Dataspace with selection
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT         - Reference is an object reference.
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region
+///                     reference. (default)
+///\exception   H5::ReferenceException
+///\note        This method is more suitable for a dataset region reference.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Location::reference(void* ref, const char* name, const DataSpace& dataspace, H5R_type_t ref_type) const
 {
-   try {
-      p_reference(ref, name, dataspace.getId(), ref_type);
-   }
-   catch (ReferenceException E) {
-      throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
-   }
-}
-
-//--------------------------------------------------------------------------
-// Function:	H5Location::reference
-///\brief	This is an overloaded member function, provided for convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for \a name.
-///\param	ref - IN: Reference pointer
-///\param	name - IN: Name of the object to be referenced
-///\param	dataspace - IN: Dataspace with selection
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT         - Reference is an object reference.
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region
-///			reference. (default)
-///\exception	H5::ReferenceException
-///\note	This method is more suitable for a dataset region reference.
-// Programmer	Binh-Minh Ribler - May, 2004
+    try {
+        p_reference(ref, name, dataspace.getId(), ref_type);
+    }
+    catch (ReferenceException& E) {
+        throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::reference
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+///\param       ref - IN: Reference pointer
+///\param       name - IN: Name of the object to be referenced
+///\param       dataspace - IN: Dataspace with selection
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT         - Reference is an object reference.
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region
+///                     reference. (default)
+///\exception   H5::ReferenceException
+///\note        This method is more suitable for a dataset region reference.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Location::reference(void* ref, const H5std_string& name, const DataSpace& dataspace, H5R_type_t ref_type) const
 {
-   try {
-      p_reference(ref, name.c_str(), dataspace.getId(), ref_type);
-   }
-   catch (ReferenceException E) {
-      throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
-   }
+    try {
+        p_reference(ref, name.c_str(), dataspace.getId(), ref_type);
+    }
+    catch (ReferenceException& E) {
+        throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::reference
-///\brief	This is an overloaded function, provided for your convenience.
-///		It differs from the above function in that it does not take
-///		a DataSpace object and the reference type must be specified.
-///\param	ref - IN: Reference pointer
-///\param	name - IN: Name of the object to be referenced
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT         - Reference is an object reference (default)
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region
-///\exception	H5::ReferenceException
-///\note	This method is more suitable for an object reference.
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::reference
+///\brief       This is an overloaded function, provided for your convenience.
+///             It differs from the above function in that it does not take
+///             a DataSpace object and the reference type must be specified.
+///\param       ref - IN: Reference pointer
+///\param       name - IN: Name of the object to be referenced
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT         - Reference is an object reference (default)
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region
+///\exception   H5::ReferenceException
+///\note        This method is more suitable for an object reference.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Location::reference(void* ref, const char* name, H5R_type_t ref_type) const
 {
-   try {
-      p_reference(ref, name, -1, ref_type);
-   }
-   catch (ReferenceException E) {
-      throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
-   }
+    try {
+        p_reference(ref, name, -1, ref_type);
+    }
+    catch (ReferenceException& E) {
+        throw ReferenceException(inMemFunc("reference"), E.getDetailMsg());
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::reference
-///\brief	This is an overloaded function, provided for your convenience.
-///		It differs from the above function in that it takes an
-///		\c H5std_string for the object's name.
-///\param	ref - IN: Reference pointer
-///\param	name - IN: Name of the object to be referenced - \c H5std_string
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT         - Reference is an object reference (default)
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region
-///\note	This method is more suitable for an object reference.
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::reference
+///\brief       This is an overloaded function, provided for your convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for the object's name.
+///\param       ref - IN: Reference pointer
+///\param       name - IN: Name of the object to be referenced - \c H5std_string
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT         - Reference is an object reference (default)
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region
+///\note        This method is more suitable for an object reference.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 void H5Location::reference(void* ref, const H5std_string& name, H5R_type_t ref_type) const
 {
    reference(ref, name.c_str(), ref_type);
 }
 
+//--------------------------------------------------------------------------
+// Function:    H5Location::dereference
+///\brief       Dereferences a reference into an HDF5 object, given an HDF5 object.
+///\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, const PropList& plist)
+{
+    p_setId(p_dereference(loc.getId(), ref, ref_type, plist, "dereference"));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::dereference
+// brief        Dereferences a reference into an HDF5 object, given an attribute.
+// 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
+//      Mar, 2017
+//              Removed in 1.10.1 because H5Location is Attribute's baseclass
+//              now. -BMR
+//--------------------------------------------------------------------------
+ /* 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, plist, "dereference"));
+}
+ */ 
+
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getRefObjType
+///\brief       Retrieves the type of object that an object reference points to.
+///\param       ref      - IN: Reference to query
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT         - Reference is an object reference.
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region reference.
+///\return      An object type, which can be one of the following:
+///             \li \c H5O_TYPE_UNKNOWN - Unknown object type (-1)
+///             \li \c H5O_TYPE_GROUP   - Object is a group
+///             \li \c H5O_TYPE_DATASET - Object is a dataset
+///             \li \c H5O_TYPE_NAMED_DATATYPE - Object is a named datatype
+///             \li \c H5O_TYPE_NTYPES  - Number of different object types
+///\exception   H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
+//--------------------------------------------------------------------------
+H5O_type_t H5Location::getRefObjType(void *ref, H5R_type_t ref_type) const
+{
+    try {
+      return(p_get_ref_obj_type(ref, ref_type));
+    }
+    catch (ReferenceException& E) {
+        throw ReferenceException(inMemFunc("getRefObjType"), E.getDetailMsg());
+    }
+}
+
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	H5Location::p_dereference (protected)
-// Purpose	Dereference a ref into an hdf5 object.
+// Function:    H5Location::p_get_ref_obj_type (protected)
+// Purpose      Retrieves the type of object that an object reference points to.
 // Parameters
-//		loc_id - IN: An hdf5 identifier specifying the location of the
-//			 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
+//              ref      - IN: Reference to query
+//              ref_type - IN: Type of reference to query
+// Return       An object type, which can be one of the following:
+//                      H5O_TYPE_UNKNOWN        - Unknown object type (-1)
+//                      H5O_TYPE_GROUP          - Object is a group
+//                      H5O_TYPE_DATASET        - Object is a dataset
+//                      H5O_TYPE_NAMED_DATATYPE - Object is a named datatype
+//                      H5O_TYPE_NTYPES         - Number of object types
+// Exception    H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
+//--------------------------------------------------------------------------
+H5O_type_t H5Location::p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const
+{
+    H5O_type_t obj_type = H5O_TYPE_UNKNOWN;
+    herr_t ret_value = H5Rget_obj_type2(getId(), ref_type, ref, &obj_type);
+    if (ret_value < 0)
+    {
+        throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 failed");
+    }
+    if (obj_type == H5O_TYPE_UNKNOWN || obj_type >= H5O_TYPE_NTYPES)
+    {
+        throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 returned invalid type");
+    }
+    return(obj_type);
+}
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getRegion
+///\brief       Retrieves a dataspace with the region pointed to selected.
+///\param       ref      - IN: Reference to get region of
+///\param       ref_type - IN: Type of reference to get region of - default
+//                             to H5R_DATASET_REGION
+///\return      DataSpace object
+///\exception   H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
 // Modification
-//	May 2008 - BMR
-//		Moved from IdComponent.
+//      Mar 29, 2015
+//              Used friend function to set id for DataSpace instead of the
+//              existing id constructor or the setId method to avoid incrementing
+//              ref count, as a work-around for a problem described in the JIRA
+//              issue HDFFV-7947. -BMR
 //--------------------------------------------------------------------------
-hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const PropList& plist, const char* from_func)
+DataSpace H5Location::getRegion(void *ref, H5R_type_t ref_type) const
+{
+    hid_t space_id = H5Rget_region(getId(), ref_type, ref);
+    if (space_id < 0)
+    {
+        throw ReferenceException(inMemFunc("getRegion"), "H5Rget_region failed");
+    }
+    try {
+        DataSpace dataspace;
+        f_DataSpace_setId(&dataspace, space_id);
+        return(dataspace);
+    }
+    catch (DataSpaceIException& E) {
+        throw ReferenceException(inMemFunc("getRegion"), E.getDetailMsg());
+    }
+}
+
+
+// From H5CommonFG.cpp
+// Notes with "***Updated" are new and for Group.cpp
+// Original notes are from December 2000
+//
+// There are a few comments that are common to most of the functions
+// defined in this file so they are listed here.
+// - getLocId is called by all functions, that call a C API, to get
+//   the location id, which can be either a file id or a group id.
+//   This function is pure virtual and it's up to H5File and Group
+//   to call the right getId() - although, as the structure of the
+//   library at this time, getId() is basically the IdComponent::getId()
+//   ***Updated: after the classes are rearranged (HDFFV-9920), functions
+//               in CommonFG are moved to Group, and they can call getId()
+//               instead of getLocId().  getLocId() is kept for backward
+//               compatibility on user applications.  Aug 18, 2016 -BMR
+//   ***Updated: Moving to Group was a mistake, now to H5Location
+//               Aug 24, 2016 -BMR
+// - when a failure returned by the C API, the functions will call
+//   throwException, which is a pure virtual function and is implemented
+//   by H5File to throw a FileIException and by Group to throw a
+//   GroupIException.
+//   ***Updated: after HDFFV-9920, methods in classes H5Location and Group
+//   use throwException to distinguish the FileIException and GroupIException.
+//   CommonFG is no longer used in the library.  Aug 18, 2016 -BMR
+//   ***Note: following the changes in HDFFV-9920, some of the methods could
+//   throw different exceptions, but for backward-compatibility, throwException
+//   is kept in those methods as well. Sep 17, 2016 -BMR
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::createGroup
+///\brief       Creates a new group at this location which can be a file
+///             or another group.
+///\param       name  - IN: Name of the group to create
+///\param       size_hint - IN: Indicates the number of bytes to reserve for
+///             the names that will appear in the group
+///\return      Group instance
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             The optional \a size_hint specifies how much file space to
+///             reserve for storing the names that will appear in this new
+///             group. If a non-positive value is provided for the \a size_hint
+///             then a default size is chosen.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Group H5Location::createGroup(const char* name, size_t size_hint) const
+{
+    // Group creation property list for size hint
+    hid_t gcpl_id = 0;
+
+    // Set the local heap size hint
+    if (size_hint > 0)
+     {
+       // If the creation of the property list failed, throw an exception
+       if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+          throwException("createGroup", "H5Pcreate failed");
+
+       if (H5Pset_local_heap_size_hint(gcpl_id, size_hint) < 0) {
+          H5Pclose(gcpl_id);
+          throwException("createGroup", "H5Pset_local_heap_size_hint failed");
+       }
+    }
+
+    // Call C routine H5Gcreate2 to create the named group, giving the
+    // location id which can be a file id or a group id
+    hid_t group_id = H5Gcreate2(getId(), name, H5P_DEFAULT, gcpl_id, H5P_DEFAULT);
+
+    // Close the group creation property list, if necessary
+    if(gcpl_id > 0)
+       H5Pclose(gcpl_id);
+
+    // If the creation of the group failed, throw an exception
+    if (group_id < 0)
+        throwException("createGroup", "H5Gcreate2 failed");
+
+    // No failure, create and return the Group object
+    Group group;
+    //group.p_setId(group_id);
+    H5Location *ptr = &group;
+    ptr->p_setId(group_id);
+    return(group);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::createGroup
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Group H5Location::createGroup(const H5std_string& name, size_t size_hint) const
 {
-   hid_t plist_id;
-   if (p_valid_id(plist.getId()))
-	plist_id = plist.getId();
-   else
-	plist_id = H5P_DEFAULT;
+    return(createGroup( name.c_str(), size_hint));
+}
 
-   hid_t temp_id = H5Rdereference2(loc_id, plist_id, ref_type, ref);
-   if (temp_id < 0)
-   {
-      throw ReferenceException(inMemFunc(from_func), "H5Rdereference failed");
-   }
+//--------------------------------------------------------------------------
+// Function:    H5Location::openGroup
+///\brief       Opens an existing group in a location which can be a file
+///             or another group.
+///\param       name  - IN: Name of the group to open
+///\return      Group instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Group H5Location::openGroup(const char* name) const
+{
+    // Call C routine H5Gopen2 to open the named group, giving the
+    // location id which can be a file id or a group id
+    hid_t group_id = H5Gopen2(getId(), name, H5P_DEFAULT);
+
+    // If the opening of the group failed, throw an exception
+    if (group_id < 0)
+        throwException("openGroup", "H5Gopen2 failed");
+
+    // No failure, create and return the Group object
+    Group group;
+    //group.p_setId(group_id);
+    H5Location *ptr = &group;
+    ptr->p_setId(group_id);
+    return(group);
+}
 
-   return(temp_id);
+//--------------------------------------------------------------------------
+// Function:    H5Location::openGroup
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Group H5Location::openGroup(const H5std_string& name) const
+{
+    return(openGroup( name.c_str()));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::createDataSet
+///\brief       Creates a new dataset at this location.
+///\param       name  - IN: Name of the dataset to create
+///\param       data_type - IN: Datatype of the dataset
+///\param       data_space - IN: Dataspace for the dataset
+///\param       create_plist - IN: Creation properly list for the dataset
+///\return      DataSet instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+DataSet H5Location::createDataSet(const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist) const
+{
+   // Obtain identifiers for C API
+    hid_t type_id = data_type.getId();
+    hid_t space_id = data_space.getId();
+    hid_t create_plist_id = create_plist.getId();
+
+    // Call C routine H5Dcreate2 to create the named dataset
+    hid_t dataset_id = H5Dcreate2(getId(), name, type_id, space_id, H5P_DEFAULT, create_plist_id, H5P_DEFAULT);
+
+    // If the creation of the dataset failed, throw an exception
+    if (dataset_id < 0)
+        throwException("createDataSet", "H5Dcreate2 failed");
+
+    // No failure, create and return the DataSet object
+    DataSet dataset;
+    f_DataSet_setId(&dataset, dataset_id);
+    return(dataset);
 }
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::dereference
-///\brief	Dereferences a reference into an HDF5 object, given an HDF5 object.
-///\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
+// Function:    H5Location::createDataSet
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+DataSet H5Location::createDataSet(const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist) const
+{
+    return(createDataSet(name.c_str(), data_type, data_space, create_plist));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::openDataSet
+///\brief       Opens an existing dataset at this location.
+///\param       name  - IN: Name of the dataset to open
+///\return      DataSet instance
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+DataSet H5Location::openDataSet(const char* name) const
+{
+    // Call C function H5Dopen2 to open the specified dataset, giving
+    // the location id and the dataset's name
+    hid_t dataset_id = H5Dopen2(getId(), name, H5P_DEFAULT);
+
+    // If the dataset's opening failed, throw an exception
+    if(dataset_id < 0)
+        throwException("openDataSet", "H5Dopen2 failed");
+
+    // No failure, create and return the DataSet object
+    DataSet dataset;
+    f_DataSet_setId(&dataset, dataset_id);
+    return(dataset);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::openDataSet
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+DataSet H5Location::openDataSet(const H5std_string& name) const
+{
+    return(openDataSet( name.c_str()));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::link
+///\brief       Creates a link of the specified type from \a new_name to
+///             \a curr_name.
+///\param       link_type  - IN: Link type; possible values are
+///             \li \c H5G_LINK_HARD
+///             \li \c H5G_LINK_SOFT
+///\param       curr_name - IN: Name of the existing object if link is a hard
+///             link; can be anything for the soft link
+///\param       new_name - IN: New name for the object
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             Note that both names are interpreted relative to the
+///             specified location.
+///             For information on creating hard link and soft link, please
+///             refer to the C layer Reference Manual at:
+/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateHard and
+/// http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-CreateSoft
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	May, 2008
-//		Corrected missing parameters. - BMR
+//        2007: QAK modified to use H5L APIs - BMR
 //--------------------------------------------------------------------------
-void H5Location::dereference(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist)
+void H5Location::link(H5L_type_t link_type, const char* curr_name, const char* new_name) const
+{
+    herr_t ret_value = -1;
+
+    switch(link_type) {
+        case H5L_TYPE_HARD:
+            ret_value = H5Lcreate_hard(getId(), curr_name, H5L_SAME_LOC, new_name, H5P_DEFAULT, H5P_DEFAULT);
+            break;
+
+        case H5L_TYPE_SOFT:
+            ret_value = H5Lcreate_soft(curr_name,getId(), new_name, H5P_DEFAULT, H5P_DEFAULT);
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_EXTERNAL:
+        case H5L_TYPE_MAX:
+        default:
+            throwException("link", "unknown link type");
+            break;
+    } /* end switch */
+
+   if (ret_value < 0)
+        throwException("link", "creating link failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::link
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a curr_name and \a new_name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::link(H5L_type_t link_type, const H5std_string& curr_name, const H5std_string& new_name) const
 {
-   p_setId(p_dereference(loc.getId(), ref, ref_type, plist, "dereference"));
+    link(link_type, curr_name.c_str(), new_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::dereference
-///\brief	Dereferences a reference into an HDF5 object, given an attribute.
-///\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
+// Function:    H5Location::unlink
+///\brief       Removes the specified name at this location.
+///\param       name  - IN: Name of the object to be removed
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	May, 2008
-//		Corrected missing parameters. - BMR
+//      2007: QAK modified to use H5L APIs - BMR
 //--------------------------------------------------------------------------
-void H5Location::dereference(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist)
+void H5Location::unlink(const char* name) const
 {
-   p_setId(p_dereference(attr.getId(), ref, ref_type, plist, "dereference"));
+    herr_t ret_value = H5Ldelete(getId(), name, H5P_DEFAULT);
+    if (ret_value < 0)
+        throwException("unlink", "H5Ldelete failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::unlink
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::unlink(const H5std_string& name) const
+{
+    unlink(name.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::move
+///\brief       Renames an object at this location.
+///\param       src - IN: Object's original name
+///\param       dst - IN: Object's new name
+///\exception   H5::FileIException or H5::GroupIException
+///\note
+///             Exercise care in moving groups as it is possible to render
+///             data in a file inaccessible with H5Location::move. Please refer
+///             to the Group Interface in the HDF5 User's Guide for details at:
+/// https://www.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FGroups%2FHDF5_Groups.htm
+// Programmer   Binh-Minh Ribler - 2000
+// Modification
+//        2007: QAK modified to use H5L APIs - BMR
+//--------------------------------------------------------------------------
+void H5Location::move(const char* src, const char* dst) const
+{
+    herr_t ret_value = H5Lmove(getId(), src, H5L_SAME_LOC, dst, H5P_DEFAULT, H5P_DEFAULT);
+    if (ret_value < 0)
+        throwException("move", "H5Lmove failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::move
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a src and \a dst.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::move(const H5std_string& src, const H5std_string& dst) const
+{
+    move(src.c_str(), dst.c_str());
 }
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 //--------------------------------------------------------------------------
-// Function:	H5Location::getObjType
-///\brief	Retrieves the type of object that an object reference points to.
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT - Reference is an object reference.
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region reference.
-///\param	ref      - IN: Reference to query
-///\return	An object type, which can be one of the following:
-///		\li \c H5G_UNKNOWN  - A failure occurs. (-1)
-///		\li \c H5G_GROUP  - Object is a group.
-///		\li \c H5G_DATASET - Object is a dataset.
-///		\li \c H5G_TYPE Object - is a named datatype
-///		\li \c H5G_LINK  - Object is a symbolic link.
-///		\li \c H5G_UDLINK  - Object is a user-defined link.
-///\exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::getObjinfo
+///\brief       Returns information about an object.
+///\param       name  - IN: Name of the object
+///\param       follow_link - IN: Link flag
+///\param       statbuf - OUT: Buffer to return information about the object
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             For more information, please refer to the C layer Reference
+///             Manual at:
+/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5G.html#Group-GetObjinfo
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::getObjinfo(const char* name, hbool_t follow_link, H5G_stat_t& statbuf) const
+{
+    herr_t ret_value = H5Gget_objinfo(getId(), name, follow_link, &statbuf);
+    if (ret_value < 0)
+        throwException("getObjinfo", "H5Gget_objinfo failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjinfo
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::getObjinfo(const H5std_string& name, hbool_t follow_link, H5G_stat_t& statbuf) const
+{
+    getObjinfo(name.c_str(), follow_link, statbuf);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjinfo
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above functions in that it doesn't have
+///             the paramemter \a follow_link.
+// Programmer   Binh-Minh Ribler - Nov, 2005
+// Note: need to modify to use H5Oget_info and H5Lget_info - BMR
+//--------------------------------------------------------------------------
+void H5Location::getObjinfo(const char* name, H5G_stat_t& statbuf) const
+{
+    herr_t ret_value = H5Gget_objinfo(getId(), name, 0, &statbuf);
+    if (ret_value < 0)
+        throwException("getObjinfo", "H5Gget_objinfo failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjinfo
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - Nov, 2005
+//--------------------------------------------------------------------------
+void H5Location::getObjinfo(const H5std_string& name, H5G_stat_t& statbuf) const
+{
+    getObjinfo(name.c_str(), statbuf);
+}
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getLinkval
+///\brief       Returns the name of the object that the symbolic link points to.
+///\param       name  - IN: Symbolic link to the object
+///\param       size - IN: Maximum number of characters of value to be returned
+///\return      Name of the object
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+H5std_string H5Location::getLinkval(const char* name, size_t size) const
+{
+    H5L_info_t linkinfo;
+    char *value_C;        // value in C string
+    size_t val_size = size;
+    H5std_string value = "";
+    herr_t ret_value;
+
+    // if user doesn't provide buffer size, determine it
+    if (size == 0)
+    {
+        ret_value = H5Lget_info(getId(), name, &linkinfo, H5P_DEFAULT);
+        if (ret_value < 0)
+            throwException("getLinkval", "H5Lget_info to find buffer size failed");
+
+        val_size = linkinfo.u.val_size;
+    }
+
+    // if link has value, retrieve the value, otherwise, return null string
+    if (val_size > 0)
+    {
+        value_C = new char[val_size+1];  // temporary C-string for C API
+        HDmemset(value_C, 0, val_size+1); // clear buffer
+
+        ret_value = H5Lget_val(getId(), name, value_C, val_size, H5P_DEFAULT);
+        if (ret_value < 0)
+        {
+            delete []value_C;
+            throwException("getLinkval", "H5Lget_val failed");
+        }
+
+        value = H5std_string(value_C);
+        delete []value_C;
+    }
+    return(value);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::getLinkval
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+H5std_string H5Location::getLinkval(const H5std_string& name, size_t size) const
+{
+    return(getLinkval( name.c_str(), size));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::mount
+///\brief       Mounts the file \a child onto this group.
+///\param       name  - IN: Name of the group
+///\param       child - IN: File to mount
+///\param       plist - IN: Property list to use
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2014 (original 2000)
+//--------------------------------------------------------------------------
+void H5Location::mount(const char* name, const H5File& child, const PropList& plist) const
+{
+    // Obtain identifiers for C API
+    hid_t plist_id = plist.getId();
+    hid_t child_id = child.getId();
+
+    // Call C routine H5Fmount to do the mouting
+    herr_t ret_value = H5Fmount(getId(), name, child_id, plist_id);
+
+    // Raise exception if H5Fmount returns negative value
+    if (ret_value < 0)
+        throwException("mount", "H5Fmount failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::mount
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Param        name  - IN: Name of the group
+// Param        child - IN: File to mount
+// Param        plist - IN: Property list to use
+// Exception    H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//	Sep 2012: Moved up from H5File, Group, DataSet, and DataType
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-H5G_obj_t H5Location::getObjType(void *ref, H5R_type_t ref_type) const
+//void H5Location::mount(const char* name, H5File& child, PropList& plist) const
+//{
+//   mount(name, child, plist);
+//}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::mount
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes an \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::mount(const H5std_string& name, const H5File& child, const PropList& plist) const
 {
-   try {
-      return(p_get_obj_type(ref, ref_type));
-   }
-   catch (ReferenceException E) {
-      throw ReferenceException(inMemFunc("getObjType"), E.getDetailMsg());
-   }
+    mount(name.c_str(), child, plist);
 }
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	H5Location::p_get_obj_type (protected)
-// Purpose	Retrieves the type of object that an object reference points to.
-// Parameters
-//		ref      - IN: Reference to query
-//		ref_type - IN: Type of reference to query
-// Return	An object type, which can be one of the following:
-//			H5G_UNKNOWN \tFailure occurs (-1)
-//			H5G_GROUP \tObject is a group.
-//			H5G_DATASET \tObject is a dataset.
-//			H5G_TYPE Object \tis a named datatype.
-//			H5G_LINK \tObject is a symbolic link.
-//			H5G_UDLINK \tObject is a user-defined link.
-// Exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::mount
+// Purpose      This is an overloaded member function, kept for backward
+//              compatibility.  It differs from the above function in that it
+//              misses const's.  This wrapper will be removed in future release.
+// Programmer   Binh-Minh Ribler - 2014
+// Modification
+//              Modified to call its replacement. -BMR, 2014/04/16
+//              Removed from documentation. -BMR, 2016/03/07 1.8.17 and 1.10.0
+//              Removed from code. -BMR, 2016/08/11 1.8.18 and 1.10.1
 //--------------------------------------------------------------------------
-H5G_obj_t H5Location::p_get_obj_type(void *ref, H5R_type_t ref_type) const
+//void H5Location::mount(const H5std_string& name, H5File& child, PropList& plist) const
+//{
+//   mount(name.c_str(), child, plist);
+//}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::unmount
+///\brief       Unmounts the specified file.
+///\param       name  - IN: Name of the file to unmount
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::unmount(const char* name) const
 {
-   H5G_obj_t obj_type = H5Rget_obj_type1(getId(), ref_type, ref);
+    // Call C routine H5Fmount to do the mouting
+    herr_t ret_value = H5Funmount(getId(), name);
 
-   if (obj_type == H5G_UNKNOWN)
-   {
-      throw ReferenceException(inMemFunc("getObjType"), "H5Rget_obj_type1 failed");
-   }
-   return(obj_type);
+    // Raise exception if H5Funmount returns negative value
+    if (ret_value < 0)
+        throwException("unmount", "H5Funmount failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::unmount
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::unmount(const H5std_string& name) const
+{
+    unmount(name.c_str());
+}
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+//--------------------------------------------------------------------------
+// Function:    H5Location::iterateElems
+///\brief       Iterates a user's function over the entries of a group.
+///\param       name    - IN    : Name of group to iterate over
+///\param       idx     - IN/OUT: Starting (IN) and ending (OUT) entry indices
+///\param       op      - IN    : User's function to operate on each entry
+///\param       op_data - IN/OUT: Data associated with the operation
+///\return      The return value of the first operator that returns non-zero,
+///             or zero if all members were processed with no operator
+///             returning non-zero.
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+int H5Location::iterateElems(const char* name, int *idx, H5G_iterate_t op , void* op_data)
+{
+    int ret_value = H5Giterate(getId(), name, idx, op, op_data);
+    if (ret_value < 0)
+    {
+        throwException("iterateElems", "H5Giterate failed");
+    }
+    return(ret_value);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::iterateElems
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+int H5Location::iterateElems(const H5std_string& name, int *idx, H5G_iterate_t op , void* op_data)
+{
+    return(iterateElems( name.c_str(), idx, op, op_data));
 }
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 //--------------------------------------------------------------------------
-// Function:	H5Location::getRefObjType
-///\brief	Retrieves the type of object that an object reference points to.
-///\param	ref      - IN: Reference to query
-///\param	ref_type - IN: Type of reference to query, valid values are:
-///		\li \c H5R_OBJECT         - Reference is an object reference.
-///		\li \c H5R_DATASET_REGION - Reference is a dataset region reference.
-///\return	An object type, which can be one of the following:
-///		\li \c H5O_TYPE_UNKNOWN	- Unknown object type (-1)
-///		\li \c H5O_TYPE_GROUP	- Object is a group
-///		\li \c H5O_TYPE_DATASET	- Object is a dataset
-///		\li \c H5O_TYPE_NAMED_DATATYPE - Object is a named datatype
-///		\li \c H5O_TYPE_NTYPES	- Number of different object types
-///\exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::getNumAttrs
+///\brief       Returns the number of attributes attached to this HDF5 object.
+///\return      Number of attributes
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-H5O_type_t H5Location::getRefObjType(void *ref, H5R_type_t ref_type) const
+int H5Location::getNumAttrs() const
 {
-   try {
-      return(p_get_ref_obj_type(ref, ref_type));
-   }
-   catch (ReferenceException E) {
-      throw ReferenceException(inMemFunc("getRefObjType"), E.getDetailMsg());
-   }
+    H5O_info_t oinfo;    /* Object info */
+
+    if(H5Oget_info(getId(), &oinfo) < 0)
+        throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed");
+    else
+        return(static_cast<int>(oinfo.num_attrs));
 }
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	H5Location::p_get_ref_obj_type (protected)
-// Purpose	Retrieves the type of object that an object reference points to.
-// Parameters
-//		ref      - IN: Reference to query
-//		ref_type - IN: Type of reference to query
-// Return	An object type, which can be one of the following:
-//			H5O_TYPE_UNKNOWN	- Unknown object type (-1)
-//			H5O_TYPE_GROUP		- Object is a group
-//			H5O_TYPE_DATASET	- Object is a dataset
-//			H5O_TYPE_NAMED_DATATYPE - Object is a named datatype
-//			H5O_TYPE_NTYPES		- Number of object types
-// Exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::getObjnameByIdx
+///\brief       Returns the name of an object in this group, given the
+///             object's index.
+///\param       idx  -     IN: Transient index of the object
+///\return      Object name
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             The value of idx can be any nonnegative number less than the
+///             total number of objects in the group, which is returned by
+///             the function \c H5Location::getNumObjs.  Note that this is a
+///             transient index; thus, an object may have a different index
+///             each time the group is opened.
+// Programmer   Binh-Minh Ribler - Mar, 2005
+//--------------------------------------------------------------------------
+H5std_string H5Location::getObjnameByIdx(hsize_t idx) const
+{
+    // call H5Lget_name_by_idx with name as NULL to get its length
+    ssize_t name_len = H5Lget_name_by_idx(getId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, NULL, 0, H5P_DEFAULT);
+    if(name_len < 0)
+        throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
+
+    // now, allocate C buffer to get the name
+    char* name_C = new char[name_len+1];
+    HDmemset(name_C, 0, name_len+1); // clear buffer
+
+    name_len = H5Lget_name_by_idx(getId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, name_C, name_len+1, H5P_DEFAULT);
+
+    if (name_len < 0)
+    {
+        delete []name_C;
+        throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
+    }
+
+    // clean up and return the string
+    H5std_string name = H5std_string(name_C);
+    delete []name_C;
+    return (name);
+}
+
 //--------------------------------------------------------------------------
-H5O_type_t H5Location::p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const
+// Function:    H5Location::getObjnameByIdx
+///\brief       Retrieves the name of an object in this group, given the
+///             object's index.
+///\param       idx  -     IN: Transient index of the object
+///\param       name - IN/OUT: Retrieved name of the object
+///\param       size -     IN: Length to retrieve
+///\return      Actual size of the object name or 0, if object has no name
+///\exception   H5::FileIException or H5::GroupIException
+///\par Description
+///             The value of idx can be any nonnegative number less than the
+///             total number of objects in the group, which is returned by
+///             the function \c H5Location::getNumObjs.  Note that this is a
+///             transient index; thus, an object may have a different index
+///             each time the group is opened.
+// Programmer   Binh-Minh Ribler - January, 2003
+//--------------------------------------------------------------------------
+ssize_t H5Location::getObjnameByIdx(hsize_t idx, char* name, size_t size) const
 {
-   H5O_type_t obj_type = H5O_TYPE_UNKNOWN;
-   herr_t ret_value = H5Rget_obj_type2(getId(), ref_type, ref, &obj_type);
-   if (ret_value < 0)
-   {
-      throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 failed");
-   }
-   if (obj_type == H5O_TYPE_UNKNOWN || obj_type >= H5O_TYPE_NTYPES)
-   {
-      throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 returned invalid type");
-   }
-   return(obj_type);
+    ssize_t name_len = H5Lget_name_by_idx(getId(), ".", H5_INDEX_NAME, H5_ITER_INC, idx, name, size, H5P_DEFAULT);
+    if(name_len < 0)
+        throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
+
+    return (name_len);
 }
 
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjnameByIdx
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes an
+///             \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - January, 2003
+//--------------------------------------------------------------------------
+ssize_t H5Location::getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size) const
+{
+    char* name_C = new char[size+1]; // temporary C-string for object name
+    HDmemset(name_C, 0, size+1); // clear buffer
+
+    // call overloaded function to get the name
+    ssize_t name_len = getObjnameByIdx(idx, name_C, size+1);
+    if(name_len < 0)
+    {
+      delete []name_C;
+        throwException("getObjnameByIdx", "H5Lget_name_by_idx failed");
+    }
+
+    // clean up and return the string
+    name = H5std_string(name_C);
+    delete []name_C;
+    return (name_len);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::childObjType
+///\brief       Returns the type of an object in this file/group, given the
+///             object's name.
+///\param       objname - IN: Name of the object
+///\return      Object type, which can have the following values for group,
+///             dataset, and named datatype
+///             \li \c H5O_TYPE_GROUP
+///             \li \c H5O_TYPE_DATASET
+///             \li \c H5O_TYPE_NAMED_DATATYPE
+///             Refer to the C API documentation for more details:
+///             http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
+///\exception   H5::FileIException or H5::GroupIException
+///             Exception will be thrown when:
+///             - an error returned by the C API
+///             - object type is not one of the valid values above
+// Programmer   Binh-Minh Ribler - April, 2014
+//--------------------------------------------------------------------------
+H5O_type_t H5Location::childObjType(const char* objname) const
+{
+    H5O_info_t objinfo;
+    H5O_type_t objtype = H5O_TYPE_UNKNOWN;
+
+    // Use C API to get information of the object
+    herr_t ret_value = H5Oget_info_by_name(getId(), objname, &objinfo, H5P_DEFAULT);
+
+    // Throw exception if C API returns failure
+    if (ret_value < 0)
+        throwException("childObjType", "H5Oget_info_by_name failed");
+    // Return a valid type or throw an exception for unknown type
+    else
+        switch (objinfo.type)
+        {
+          case H5O_TYPE_GROUP:
+          case H5O_TYPE_DATASET:
+          case H5O_TYPE_NAMED_DATATYPE:
+              objtype = objinfo.type;
+              break;
+          case H5O_TYPE_UNKNOWN:
+          case H5O_TYPE_NTYPES:
+          default:
+              throwException("childObjType", "Unknown type of object");
+        }
+    return(objtype);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::childObjType
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes an \a H5std_string for the object's name.
+///\brief       Returns the type of an object in this group, given the
+///             object's name.
+///\param       objname - IN: Name of the object (H5std_string&)
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - April, 2014
+//--------------------------------------------------------------------------
+H5O_type_t H5Location::childObjType(const H5std_string& objname) const
+{
+    // Use overloaded function
+    H5O_type_t objtype = childObjType(objname.c_str());
+    return(objtype);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::childObjType
+///\brief       Returns the type of an object in this file/group, given the
+///             object's index and its type and order.
+///\param       index - IN: Position of the object
+///\param       index_type - IN: Type of the index, default to H5_INDEX_NAME
+///\param       order - IN: Traversing order, default to H5_ITER_INC
+///\param       objname - IN: Name of the object, default to "."
+///\return      Object type, which can have the following values for group,
+///             dataset, and named datatype
+///             \li \c H5O_TYPE_GROUP
+///             \li \c H5O_TYPE_DATASET
+///             \li \c H5O_TYPE_NAMED_DATATYPE
+///             Refer to the C API documentation for more details:
+///             http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
+///\exception   H5::FileIException or H5::GroupIException
+///             Exception will be thrown when:
+///             - an error returned by the C API
+///             - object type is not one of the valid values above
+// Developer's Notes:
+//      - this overload uses H5Oget_info_by_idx instead of H5Oget_info_by_name
+//        like the previous childObjType()
+//      - index is the required argument so, first
+//      - objname is last because it's more likely the location is already
+//        fully specified
+//      - Leave property list out for now because C API is not using it, it
+//        can be added later when needed.
+// Programmer   Binh-Minh Ribler - April, 2014
+//--------------------------------------------------------------------------
+H5O_type_t H5Location::childObjType(hsize_t index, H5_index_t index_type, H5_iter_order_t order, const char* objname) const
+{
+    herr_t ret_value;
+    H5O_info_t objinfo;
+    H5O_type_t objtype = H5O_TYPE_UNKNOWN;
+
+    // Use C API to get information of the object
+    ret_value = H5Oget_info_by_idx(getId(), objname, index_type, order, index, &objinfo, H5P_DEFAULT);
+
+    // Throw exception if C API returns failure
+    if (ret_value < 0)
+        throwException("childObjType", "H5Oget_info_by_idx failed");
+    // Return a valid type or throw an exception for unknown type
+    else
+        switch (objinfo.type)
+        {
+          case H5O_TYPE_GROUP:
+          case H5O_TYPE_DATASET:
+          case H5O_TYPE_NAMED_DATATYPE:
+              objtype = objinfo.type;
+              break;
+          case H5O_TYPE_UNKNOWN:
+          case H5O_TYPE_NTYPES:
+          default:
+              throwException("childObjType", "Unknown type of object");
+        }
+    return(objtype);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::childObjVersion
+///\brief       Returns the object header version of an object in this file/group,
+///             given the object's name.
+///\param       objname - IN: Name of the object
+///\return      Object version, which can have the following values:
+///             \li \c H5O_VERSION_1
+///             \li \c H5O_VERSION_2
+///\exception   H5::FileIException or H5::GroupIException
+///             Exception will be thrown when:
+///             - an error returned by the C API
+///             - version number is not one of the valid values above
+// Programmer   Binh-Minh Ribler - April, 2014
+//--------------------------------------------------------------------------
+unsigned H5Location::childObjVersion(const char* objname) const
+{
+    H5O_info_t objinfo;
+    unsigned version = 0;
+
+    // Use C API to get information of the object
+    herr_t ret_value = H5Oget_info_by_name(getId(), objname, &objinfo, H5P_DEFAULT);
+
+    // Throw exception if C API returns failure
+    if (ret_value < 0)
+        throwException("childObjVersion", "H5Oget_info_by_name failed");
+    // Return a valid version or throw an exception for invalid value
+    else
+    {
+        version = objinfo.hdr.version;
+        if (version != H5O_VERSION_1 && version != H5O_VERSION_2)
+            throwException("childObjVersion", "Invalid version for object");
+    }
+    return(version);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Location::childObjVersion
+///\brief       This is an overloaded member function, provided for convenience.
+///             It takes an \a H5std_string for the object's name.
+///\brief       Returns the type of an object in this group, given the
+///             object's name.
+///\param       objname - IN: Name of the object (H5std_string&)
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - April, 2014
+//--------------------------------------------------------------------------
+unsigned H5Location::childObjVersion(const H5std_string& objname) const
+{
+    // Use overloaded function
+    unsigned version = childObjVersion(objname.c_str());
+    return(version);
+}
 
+#ifndef H5_NO_DEPRECATED_SYMBOLS
 //--------------------------------------------------------------------------
-// Function:	H5Location::getRegion
-///\brief	Retrieves a dataspace with the region pointed to selected.
-///\param	ref	 - IN: Reference to get region of
-///\param	ref_type - IN: Type of reference to get region of - default
-//				to H5R_DATASET_REGION
-///\return	DataSpace object
-///\exception	H5::ReferenceException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    H5Location::getObjType
+///\brief       Retrieves the type of object that an object reference points to.
+///\param       ref_type - IN: Type of reference to query, valid values are:
+///             \li \c H5R_OBJECT - Reference is an object reference.
+///             \li \c H5R_DATASET_REGION - Reference is a dataset region reference.
+///\param       ref      - IN: Reference to query
+///\return      An object type, which can be one of the following:
+///             \li \c H5G_UNKNOWN  - A failure occurs. (-1)
+///             \li \c H5G_GROUP  - Object is a group.
+///             \li \c H5G_DATASET - Object is a dataset.
+///             \li \c H5G_TYPE Object - is a named datatype
+///             \li \c H5G_LINK  - Object is a symbolic link.
+///             \li \c H5G_UDLINK  - Object is a user-defined link.
+///\exception   H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
 // Modification
-//	Mar 29, 2015
-//		Used friend function to set id for DataSpace instead of the
-//		existing id constructor or the setId method to avoid incrementing
-//		ref count, as a work-around for a problem described in the JIRA
-//		issue HDFFV-7947. -BMR
+//      Sep 2012: Moved up from H5File, Group, DataSet, and DataType
 //--------------------------------------------------------------------------
-DataSpace H5Location::getRegion(void *ref, H5R_type_t ref_type) const
+H5G_obj_t H5Location::getObjType(void *ref, H5R_type_t ref_type) const
 {
-   hid_t space_id = H5Rget_region(getId(), ref_type, ref);
-   if (space_id < 0)
-   {
-      throw ReferenceException(inMemFunc("getRegion"), "H5Rget_region failed");
-   }
-   try {
-	DataSpace dataspace;
-	f_DataSpace_setId(&dataspace, space_id);
-	return(dataspace);
-   }
-   catch (DataSpaceIException E) {
-      throw ReferenceException(inMemFunc("getRegion"), E.getDetailMsg());
-   }
+    try {
+        return(p_get_obj_type(ref, ref_type));
+    }
+    catch (ReferenceException& E) {
+        throw ReferenceException(inMemFunc("getObjType"), E.getDetailMsg());
+    }
 }
 
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjTypeByIdx
+///\brief       Returns the type of an object in this group, given the
+///             object's index.
+///\param       idx - IN: Transient index of the object
+///\return      Object type
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - January, 2003
+//--------------------------------------------------------------------------
+H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx) const
+{
+   H5G_obj_t obj_type = H5Gget_objtype_by_idx(getId(), idx);
+   if (obj_type == H5G_UNKNOWN)
+        throwException("getObjTypeByIdx", "H5Gget_objtype_by_idx failed");
+
+   return (obj_type);
+}
 
 //--------------------------------------------------------------------------
-// Function:	H5Location destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Location::getObjTypeByIdx
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function because it also provides
+///             the returned object type in text (char*)
+///\param       idx       - IN: Transient index of the object
+///\param       type_name - OUT: Object type in text
+///\return      Object type
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - May, 2010
+// Modification
+//              Modified to use the other function. -BMR, 2016/03/07
 //--------------------------------------------------------------------------
-H5Location::~H5Location() {}
+H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx, char* type_name) const
+{
+    H5std_string stype_name(type_name);
+    return(getObjTypeByIdx(idx, stype_name));
+}
+//--------------------------------------------------------------------------
+// Function:    H5Location::getObjTypeByIdx
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function because it also provides
+///             the returned object type in text (H5std_string&)
+///\param       idx       - IN: Transient index of the object
+///\param       type_name - OUT: Object type in text
+///\return      Object type
+///\exception   H5::FileIException or H5::GroupIException
+// Programmer   Binh-Minh Ribler - January, 2003
+//--------------------------------------------------------------------------
+H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx, H5std_string& type_name) const
+{
+    H5G_obj_t obj_type = H5Gget_objtype_by_idx(getId(), idx);
+    switch (obj_type)
+    {
+      case H5G_LINK: type_name = H5std_string("symbolic link"); break;
+      case H5G_GROUP: type_name = H5std_string("group"); break;
+      case H5G_DATASET: type_name = H5std_string("dataset"); break;
+      case H5G_TYPE: type_name = H5std_string("datatype"); break;
+      case H5G_UNKNOWN:
+      case H5G_UDLINK:
+      case H5G_RESERVED_5:
+      case H5G_RESERVED_6:
+      case H5G_RESERVED_7:
+      default:
+          throwException("getObjTypeByIdx", "H5Gget_objtype_by_idx failed");
+    }
+    return (obj_type);
+}
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	f_Attribute_setId - friend
-// Purpose:	This function is friend to class H5::Attribute so that it
-//		can set Attribute::id in order to work around a problem
-//		described in the JIRA issue HDFFV-7947.
-//		Applications shouldn't need to use it.
-// param	attr   - IN/OUT: Attribute object to be changed
-// param	new_id - IN: New id to set
-// Programmer	Binh-Minh Ribler - 2015
+// Function:    H5Location::p_get_obj_type (protected)
+// Purpose      Retrieves the type of object that an object reference points to.
+// Parameters
+//              ref      - IN: Reference to query
+//              ref_type - IN: Type of reference to query
+// Return       An object type, which can be one of the following:
+//                      H5G_UNKNOWN \tFailure occurs (-1)
+//                      H5G_GROUP \tObject is a group.
+//                      H5G_DATASET \tObject is a dataset.
+//                      H5G_TYPE Object \tis a named datatype.
+//                      H5G_LINK \tObject is a symbolic link.
+//                      H5G_UDLINK \tObject is a user-defined link.
+// Exception    H5::ReferenceException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
-void f_Attribute_setId(Attribute* attr, hid_t new_id)
+H5G_obj_t H5Location::p_get_obj_type(void *ref, H5R_type_t ref_type) const
 {
-    attr->p_setId(new_id);
+   H5G_obj_t obj_type = H5Rget_obj_type1(getId(), ref_type, ref);
+   if (obj_type == H5G_UNKNOWN)
+    {
+        throw ReferenceException(inMemFunc("getObjType"), "H5Rget_obj_type1 failed");
+    }
+   return(obj_type);
+}
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+#endif // H5_NO_DEPRECATED_SYMBOLS
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+//--------------------------------------------------------------------------
+// Function:    H5Location::throwException
+///\brief       Invokes subclass' throwException
+///\param       func_name - Name of the function where failure occurs
+///\param       msg       - Message describing the failure
+///\exception   H5::GroupIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Location::throwException(const H5std_string& func_name, const H5std_string& msg) const
+{
+    throwException(func_name, msg);
 }
 
 //--------------------------------------------------------------------------
-// Function:	f_DataSpace_setId - friend
-// Purpose:	This function is friend to class H5::DataSpace so that it can
-//		can set DataSpace::id in order to work around a problem
-//		described in the JIRA issue HDFFV-7947.
-//		Applications shouldn't need to use it.
-// param	dspace   - IN/OUT: DataSpace object to be changed
-// param	new_id - IN: New id to set
-// Programmer	Binh-Minh Ribler - 2015
+// Function:    f_DataSet_setId - friend
+// Modification:
+//              Moved to H5CommonFG.cpp after the rearrangement of classes
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+
+// end of From H5CommonFG.cpp
+
+//--------------------------------------------------------------------------
+// Function:    f_Attribute_setId - friend
+// Modification:
+//              Moved to H5Object.cpp after the rearrangement of classes
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Function:    f_DataSpace_setId - friend
+// Purpose      This function is friend to class H5::DataSpace so that it can
+//              can set DataSpace::id in order to work around a problem
+//              described in the JIRA issue HDFFV-7947.
+//              Applications shouldn't need to use it.
+// param        dspace   - IN/OUT: DataSpace object to be changed
+// param        new_id - IN: New id to set
+// Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
 void f_DataSpace_setId(DataSpace* dspace, hid_t new_id)
 {
     dspace->p_setId(new_id);
 }
 
+//--------------------------------------------------------------------------
+// Function:    H5Location destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+H5Location::~H5Location() {}
+
 #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 9e4ec05..f49b3c1 100644
--- a/c++/src/H5Location.h
+++ b/c++/src/H5Location.h
@@ -6,176 +6,220 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Location_H
 #define __H5Location_H
 
-#include "H5Classes.h"		// constains forward class declarations
+#include "H5Classes.h"        // constains forward class declarations
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
-
-class H5_DLLCPP H5Location;  // forward declaration for UserData4Aiterate
-
-// Define the operator function pointer for H5Aiterate().
-typedef void (*attr_operator_t)( H5Location& loc/*in*/,
-                                 const H5std_string attr_name/*in*/,
-                                 void *operator_data/*in,out*/);
-
-//! User data for attribute iteration
-class UserData4Aiterate {
-   public:
-	attr_operator_t op;
-	void* opData;
-	H5Location* location;
-};
 
 /*! \class H5Location
     \brief H5Location is an abstract base class, added in version 1.8.12.
 
     It provides a collection of wrappers for the C functions that take a
     location identifier to specify the HDF5 object.  The location identifier
-    can be either file, group, dataset, or named datatype.
+    can be either file, group, dataset, attribute, or named datatype.
+    Wrappers for H5A functions stay in H5Object.
 */
-// Most of these methods were in H5Object but are now moved here because
-// a location can be a file, group, dataset, or named datatype. -BMR, 2013-10-1
+// Class forwarding
+class ArrayType;
+class LinkAccPropList;
+class VarLenType;
+
+//  Inheritance: IdComponent
 class H5_DLLCPP H5Location : public IdComponent {
    public:
-	// Creates an attribute for the specified object at this location
-	// PropList is currently not used, so always be default.
-	Attribute createAttribute( const char* name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT ) const;
-	Attribute createAttribute( const H5std_string& name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT ) const;
+        // Checks if a link of a given name exists in a location
+        bool exists(const char* name, const LinkAccPropList& lapl = LinkAccPropList::DEFAULT) const;
+        bool exists(const H5std_string& name, const LinkAccPropList& lapl = LinkAccPropList::DEFAULT) const;
 
-	// Given its name, opens the attribute that belongs to an object at
-	// this location.
-	Attribute openAttribute( const char* name ) const;
-	Attribute openAttribute( const H5std_string& name ) const;
+        // Flushes all buffers associated with this location to disk.
+        void flush(H5F_scope_t scope) const;
 
-	// Given its index, opens the attribute that belongs to an object at
-	// this location.
-	Attribute openAttribute( const unsigned int idx ) const;
+        // Gets the name of the file, specified by this location.
+        H5std_string getFileName() const;
 
-	// Flushes all buffers associated with this location to disk.
-	void flush( H5F_scope_t scope ) const;
-
-	// Gets the name of the file, specified by this location.
-	H5std_string getFileName() const;
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+        // Retrieves the type of object that an object reference points to.
+        H5G_obj_t getObjType(void *ref, H5R_type_t ref_type = H5R_OBJECT) const;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Determines the number of attributes at this location.
-	int getNumAttrs() const;
+        // Retrieves the type of object that an object reference points to.
+        H5O_type_t getRefObjType(void *ref, H5R_type_t ref_type = H5R_OBJECT) const;
+        // Note: getRefObjType deprecates getObjType, but getObjType's name is
+        // misleading, so getRefObjType is used in the new function instead.
+
+        // Sets the comment for an HDF5 object specified by its name.
+        void setComment(const char* name, const char* comment) const;
+        void setComment(const H5std_string& name, const H5std_string& comment) const;
+        void setComment(const char* comment) const;
+        void setComment(const H5std_string& comment) const;
+
+        // Retrieves comment for the HDF5 object specified by its name.
+        ssize_t getComment(const char* name, size_t buf_size, char* comment) const;
+        H5std_string getComment(const char* name, size_t buf_size=0) const;
+        H5std_string getComment(const H5std_string& name, size_t buf_size=0) const;
+
+        // Removes the comment for the HDF5 object specified by its name.
+        void removeComment(const char* name) const;
+        void removeComment(const H5std_string& name) const;
+
+        // Creates a reference to a named object or to a dataset region
+        // 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,
+                        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;
+        void reference(void* ref, const H5std_string& name, const DataSpace& dataspace,
+                        H5R_type_t ref_type = H5R_DATASET_REGION) const;
+
+        // 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, const PropList& plist = PropList::DEFAULT);
+        // Removed in 1.10.1, because H5Location is baseclass
+        //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;
+
+// From CommonFG
+        // Creates a new group at this location which can be a file
+        // or another group.
+        Group createGroup(const char* name, size_t size_hint = 0) const;
+        Group createGroup(const H5std_string& name, size_t size_hint = 0) const;
+
+        // Opens an existing group in a location which can be a file
+        // or another group.
+        Group openGroup(const char* name) const;
+        Group openGroup(const H5std_string& name) const;
+
+        // Creates a new dataset in this group.
+        DataSet createDataSet(const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT) const;
+        DataSet createDataSet(const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT) const;
+
+        // Opens an existing dataset at this location.
+        DataSet openDataSet(const char* name) const;
+        DataSet openDataSet(const H5std_string& name) const;
+
+        // Returns the value of a symbolic link.
+        H5std_string getLinkval(const char* link_name, size_t size=0) const;
+        H5std_string getLinkval(const H5std_string& link_name, size_t size=0) const;
+
+        // Determines the number of attributes belong to this object.
+        int getNumAttrs() const;
+
+        // Retrieves the name of an object in this group, given the
+        // object's index.
+        H5std_string getObjnameByIdx(hsize_t idx) const;
+        ssize_t getObjnameByIdx(hsize_t idx, char* name, size_t size) const;
+        ssize_t getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size) const;
+
+        // Retrieves the type of an object in this file or group, given the
+        // object's name
+        H5O_type_t childObjType(const H5std_string& objname) const;
+        H5O_type_t childObjType(const char* objname) const;
+        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=".") const;
+
+        // Returns the object header version of an object in this file or group,
+        // given the object's name.
+        unsigned childObjVersion(const char* objname) const;
+        unsigned childObjVersion(const H5std_string& objname) const;
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Retrieves the type of object that an object reference points to.
-	H5G_obj_t getObjType(void *ref, H5R_type_t ref_type = H5R_OBJECT) const;
+        // Returns the type of an object in this group, given the
+        // object's index.
+        H5G_obj_t getObjTypeByIdx(hsize_t idx) const;
+        H5G_obj_t getObjTypeByIdx(hsize_t idx, char* type_name) const;
+        H5G_obj_t getObjTypeByIdx(hsize_t idx, H5std_string& type_name) const;
+
+        // Returns information about an HDF5 object, given by its name,
+        // at this location.
+        void getObjinfo(const char* name, hbool_t follow_link, H5G_stat_t& statbuf) const;
+        void getObjinfo(const H5std_string& name, hbool_t follow_link, H5G_stat_t& statbuf) const;
+        void getObjinfo(const char* name, H5G_stat_t& statbuf) const;
+        void getObjinfo(const H5std_string& name, H5G_stat_t& statbuf) const;
+
+        // Iterates over the elements of this group - not implemented in
+        // C++ style yet.
+        int iterateElems(const char* name, int *idx, H5G_iterate_t op, void *op_data);
+        int iterateElems(const H5std_string& name, int *idx, H5G_iterate_t op, void *op_data);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Retrieves the type of object that an object reference points to.
-	H5O_type_t getRefObjType(void *ref, H5R_type_t ref_type = H5R_OBJECT) const;
-	// Note: getRefObjType deprecates getObjType, but getObjType's name is
-	// misleading, so getRefObjType is used in the new function instead.
-
-	// Iterate user's function over the attributes at this location.
-	int iterateAttrs(attr_operator_t user_op, unsigned* idx = NULL, void* op_data = NULL);
-
-	// Checks whether the named attribute exists at this location.
-	bool attrExists(const char* name) const;
-	bool attrExists(const H5std_string& name) const;
-
-	// Renames the named attribute to a new name.
-	void renameAttr(const char* oldname, const char* newname) const;
-	void renameAttr(const H5std_string& oldname, const H5std_string& newname) const;
-
-	// Removes the named attribute from this location.
-	void removeAttr(const char* name) const;
-	void removeAttr(const H5std_string& name) const;
-
-	// Sets the comment for an HDF5 object specified by its name.
-	void setComment(const char* name, const char* comment) const;
-	void setComment(const H5std_string& name, const H5std_string& comment) const;
-	void setComment(const char* comment) const;
-	void setComment(const H5std_string& comment) const;
-
-	// Retrieves comment for the HDF5 object specified by its name.
-	ssize_t getComment(const char* name, size_t buf_size, char* comment) const;
-	H5std_string getComment(const char* name, size_t buf_size=0) const;
-	H5std_string getComment(const H5std_string& name, size_t buf_size=0) const;
-
-	// Removes the comment for the HDF5 object specified by its name.
-	void removeComment(const char* name) const;
-	void removeComment(const H5std_string& name) const;
-
-	// Creates a reference to a named object or to a dataset region
-	// 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,
-			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;
-	void reference(void* ref, const H5std_string& name, const DataSpace& dataspace,
-			H5R_type_t ref_type = H5R_DATASET_REGION) const;
-
-	// 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, 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;
-
-	///\brief Returns an identifier. (pure virtual)
-	virtual hid_t getId() const = 0;
+        // Creates a link of the specified type from new_name to current_name;
+        // both names are interpreted relative to the specified location id.
+        void link(H5L_type_t link_type, const char* curr_name, const char* new_name) const;
+        void link(H5L_type_t link_type, const H5std_string& curr_name, const H5std_string& new_name) const;
 
-   protected:
-	// Default constructor
-	H5Location();
+        // Removes the specified name at this location.
+        void unlink(const char* name) const;
+        void unlink(const H5std_string& name) const;
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
+        // Mounts the file 'child' onto this location.
+        void mount(const char* name, const H5File& child, const PropList& plist) const;
+        //void mount(const char* name, H5File& child, PropList& plist) const; // removed from 1.8.18 and 1.10.1
+        void mount(const H5std_string& name, const H5File& child, const PropList& plist) const;
+        //void mount(const H5std_string& name, H5File& child, PropList& plist) const; // removed from 1.8.18 and 1.10.1
+
+        // Unmounts the file named 'name' from this parent location.
+        void unmount(const char* name) const;
+        void unmount(const H5std_string& name) const;
+
+        // Renames an object at this location.
+        void move(const char* src, const char* dst) const;
+        void move(const H5std_string& src, const H5std_string& dst) const;
+
+// end From CommonFG
 
-	// *** Deprecation warning ***
-	// The following two constructors are no longer appropriate after the
-	// data member "id" had been moved to the sub-classes.
-	// The copy constructor is a noop and is removed in 1.8.15 and the
-	// other will be removed from 1.10 release, and then from 1.8 if its
-	// removal does not raise any problems in two 1.10 releases.
+        /// For subclasses, H5File and Group, to throw appropriate exception.
+        virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const;
+
+        // Default constructor
+        H5Location();
+
+   protected:
+#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.
+        // The copy constructor is a noop and is removed in 1.8.15 and the
+        // other will be removed from 1.10 release, and then from 1.8 if its
+        // removal does not raise any problems in two 1.10 releases.
 
-	// Creates a copy of an existing object giving the location id.
-	H5Location(const hid_t loc_id);
+        // Creates a copy of an existing object giving the location id.
+        H5Location(const hid_t loc_id);
 
-	// Creates a reference to an HDF5 object or a dataset region.
-	void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const;
+        // Creates a reference to an HDF5 object or a dataset region.
+        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 PropList& plist, const char* from_func);
+        // Dereferences a ref into an HDF5 id.
+        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.
-	H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const;
+        // Retrieves the type of object that an object reference points to.
+        H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const;
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Retrieves the type of object that an object reference points to.
-	H5O_type_t p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const;
+        // Retrieves the type of object that an object reference points to.
+        H5O_type_t p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const;
 
         // Sets the identifier of this object to a new value. - this one
         // doesn't increment reference count
-        virtual void p_setId(const hid_t new_id) = 0;
+        //virtual void p_setId(const hid_t new_id);
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-	// Noop destructor.
-	virtual ~H5Location();
+        // Noop destructor.
+        virtual ~H5Location();
 
-}; /* end class H5Location */
+}; // end of H5Location
+} // namespace H5
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5Location_H
diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp
index 3cce9fe..7beee71 100644
--- a/c++/src/H5Object.cpp
+++ b/c++/src/H5Object.cpp
@@ -5,66 +5,78 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
+#include "H5FaccProp.h"
+#include "H5FcreatProp.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
 #include "H5DxferProp.h"
-#include "H5FaccProp.h"
-#include "H5FcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5DataSpace.h"
 #include "H5AbstractDs.h"
+#include "H5CommonFG.h"
+#include "H5Group.h"
 #include "H5File.h"
 #include "H5DataSet.h"
 #include "H5Attribute.h"
-#include "H5private.h"		// for HDmemset
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
+// userAttrOpWrpr simply interfaces between the user's function and the
+// C library function H5Aiterate2; used to resolve the different prototype
+// problem.  May be moved to Iterator later.
+extern "C" herr_t userAttrOpWrpr(hid_t loc_id, const char *attr_name,
+    const H5A_info_t *ainfo, void *op_data)
+{
+   H5std_string s_attr_name = H5std_string(attr_name);
+   UserData4Aiterate* myData = reinterpret_cast<UserData4Aiterate *> (op_data);
+   myData->op(*myData->location, s_attr_name, myData->opData);
+   return 0;
+}
+
 //--------------------------------------------------------------------------
-// Function:	H5Object default constructor (protected)
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Object default constructor (protected)
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5Object::H5Object() : H5Location() {}
 
 //--------------------------------------------------------------------------
-// Function:	H5Object overloaded constructor (protected)
-// Purpose	Creates an H5Object object using the id of an existing HDF5
-// 		object.
-// Parameters	object_id - IN: Id of an existing HDF5 object
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Object overloaded constructor (protected)
+// Purpose      Creates an H5Object object using the id of an existing HDF5
+//              object.
+// Parameters   object_id - IN: Id of an existing HDF5 object
+// Programmer   Binh-Minh Ribler - 2000
 // *** Deprecation warning ***
 // This constructor is no longer appropriate because the data member "id" had
 // been moved to the sub-classes.  It will be removed in 1.10 release.  If its
 // removal does not raise any problems in 1.10, it will be removed from 1.8 in
 // subsequent releases.
+// Removed in 1.10.1 - Aug 2016
 //--------------------------------------------------------------------------
-H5Object::H5Object(const hid_t object_id) : H5Location() {}
+//H5Object::H5Object(const hid_t object_id) : H5Location() {}
 
 //--------------------------------------------------------------------------
-// Function:	H5Object copy constructor
-///\brief	Copy constructor: makes a copy of the original H5Object
-///		instance.
-///\param	original - IN: H5Object instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Object copy constructor
+///\brief       Copy constructor: makes a copy of the original H5Object
+///             instance.
+///\param       original - IN: H5Object instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 // *** Deprecation warning ***
 // This constructor is no longer appropriate because the data member "id" had
 // been moved to the sub-classes.  It is removed from 1.8.15 because it is
@@ -73,6 +85,295 @@ H5Object::H5Object(const hid_t object_id) : H5Location() {}
 // H5Object::H5Object(const H5Object& original) : H5Location() {}
 
 //--------------------------------------------------------------------------
+// Function:    f_Attribute_setId - friend
+// Purpose:     This function is friend to class H5::Attribute so that it
+//              can set Attribute::id in order to work around a problem
+//              described in the JIRA issue HDFFV-7947.
+//              Applications shouldn't need to use it.
+// param        attr   - IN/OUT: Attribute object to be changed
+// param        new_id - IN: New id to set
+// Programmer   Binh-Minh Ribler - 2015
+//--------------------------------------------------------------------------
+void f_Attribute_setId(Attribute* attr, hid_t new_id)
+{
+    attr->p_setId(new_id);
+}
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::createAttribute
+///\brief       Creates an attribute for a group, dataset, or named datatype.
+///\param       name - IN: Name of the attribute
+///\param       data_type - IN: Datatype for the attribute
+///\param       data_space - IN: Dataspace for the attribute - only simple
+///             dataspaces are allowed at this time
+///\param       create_plist - IN: Creation property list - default to
+///             PropList::DEFAULT
+///\return      Attribute instance
+///\exception   H5::AttributeIException
+///\par Description
+///             The attribute name specified in \a name must be unique.
+///             Attempting to create an attribute with the same name as an
+///             existing attribute will raise an exception, leaving the
+///             pre-existing attribute intact. To overwrite an existing
+///             attribute with a new attribute of the same name, first
+///             delete the existing one with \c H5Object::removeAttr, then
+///             recreate it with this function.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Attribute H5Object::createAttribute(const char* name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist) const
+{
+    hid_t type_id = data_type.getId();
+    hid_t space_id = data_space.getId();
+    hid_t plist_id = create_plist.getId();
+    hid_t attr_id = H5Acreate2(getId(), name, type_id, space_id, plist_id, H5P_DEFAULT);
+
+    // If the attribute id is valid, create and return the Attribute object
+    if (attr_id > 0)
+    {
+        Attribute attr;
+        f_Attribute_setId(&attr, attr_id);
+        return(attr);
+    }
+    else
+        throw AttributeIException(inMemFunc("createAttribute"), "H5Acreate2 failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::createAttribute
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes
+///             a reference to an \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Attribute H5Object::createAttribute(const H5std_string& name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist) const
+{
+    return(createAttribute( name.c_str(), data_type, data_space, create_plist));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::openAttribute
+///\brief       Opens an attribute given its name.
+///\param       name - IN: Name of the attribute
+///\return      Attribute instance
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Attribute H5Object::openAttribute(const char* name) const
+{
+    hid_t attr_id = H5Aopen(getId(), name, H5P_DEFAULT);
+    if (attr_id > 0)
+    {
+        Attribute attr;
+        f_Attribute_setId(&attr, attr_id);
+        return(attr);
+    }
+    else
+    {
+        throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::openAttribute
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes
+///             a reference to an \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Attribute H5Object::openAttribute(const H5std_string& name) const
+{
+    return(openAttribute( name.c_str()));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::openAttribute
+///\brief       Opens an attribute given its index.
+///\param       idx - IN: Index of the attribute, a 0-based, non-negative integer
+///\return      Attribute instance
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+Attribute H5Object::openAttribute(const unsigned int idx) const
+{
+    hid_t attr_id = H5Aopen_by_idx(getId(), ".", H5_INDEX_CRT_ORDER,
+              H5_ITER_INC, static_cast<hsize_t>(idx), H5P_DEFAULT, H5P_DEFAULT);
+    if (attr_id > 0)
+    {
+        Attribute attr;
+        f_Attribute_setId(&attr, attr_id);
+        return(attr);
+    }
+    else
+    {
+        throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen_by_idx failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::iterateAttrs
+///\brief       Iterates a user's function over all the attributes of an H5
+///             object, which may be a group, dataset or named datatype.
+///\param       user_op - IN: User's function to operate on each attribute
+///\param       _idx - IN/OUT: Starting (IN) and ending (OUT) attribute indices
+///\param       op_data - IN: User's data to pass to user's operator function
+///\return      Returned value of the last operator if it was non-zero, or
+///             zero if all attributes were processed
+///\exception   H5::AttributeIException
+///\par Description
+///             The signature of user_op is
+///             void (*)(H5::H5Location&, H5std_string, void*).
+///             For information, please refer to the C layer Reference Manual
+///             at:
+/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5A.html#Annot-Iterate
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+int H5Object::iterateAttrs(attr_operator_t user_op, unsigned *_idx, void *op_data)
+{
+    // store the user's function and data
+    UserData4Aiterate* userData = new UserData4Aiterate;
+    userData->opData = op_data;
+    userData->op = user_op;
+    userData->location = this;
+
+    // call the C library routine H5Aiterate2 to iterate the attributes
+    hsize_t idx = _idx ? static_cast<hsize_t>(*_idx) : 0;
+    int ret_value = H5Aiterate2(getId(), H5_INDEX_NAME, H5_ITER_INC, &idx,
+                         userAttrOpWrpr, reinterpret_cast<void *>(userData));
+
+    // release memory
+    delete userData;
+
+    if (ret_value >= 0) {
+        /* Pass back update index value to calling code */
+        if (_idx)
+            *_idx = static_cast<unsigned>(idx);
+        return(ret_value);
+    }
+    else  // raise exception when H5Aiterate returns a negative value
+        throw AttributeIException(inMemFunc("iterateAttrs"), "H5Aiterate2 failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::objVersion
+///\brief       Returns the header version of this HDF5 object.
+///\return      Object version, which can have the following values:
+///             \li \c H5O_VERSION_1
+///             \li \c H5O_VERSION_2
+///\exception   H5::ObjHeaderIException
+///             Exception will be thrown when:
+///             - an error returned by the C API
+///             - version number is not one of the valid values above
+// Programmer   Binh-Minh Ribler - December, 2016
+//--------------------------------------------------------------------------
+unsigned H5Object::objVersion() const
+{
+    H5O_info_t objinfo;
+    unsigned version = 0;
+
+    // Use C API to get information of the object
+    herr_t ret_value = H5Oget_info(getId(), &objinfo);
+
+    // Throw exception if C API returns failure
+    if (ret_value < 0)
+        throw Exception(inMemFunc("objVersion"), "H5Oget_info failed");
+    // Return a valid version or throw an exception for invalid value
+    else
+    {
+        version = objinfo.hdr.version;
+        if (version != H5O_VERSION_1 && version != H5O_VERSION_2)
+            throw ObjHeaderIException("objVersion", "Invalid version for object");
+    }
+    return(version);
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::attrExists
+///\brief       Checks whether the named attribute exists at this location.
+///\param       name - IN: Name of the attribute to be queried
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2013
+//--------------------------------------------------------------------------
+bool H5Object::attrExists(const char* name) const
+{
+    // Call C routine H5Aexists to determine whether an attribute exists
+    // at this location, which could be specified by a file, group, dataset,
+    // or named datatype.
+    herr_t ret_value = H5Aexists(getId(), name);
+    if (ret_value > 0)
+        return true;
+    else if(ret_value == 0)
+        return false;
+    else // Raise exception when H5Aexists returns a negative value
+        throw AttributeIException(inMemFunc("attrExists"), "H5Aexists failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::attrExists
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes
+///             a reference to an \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+bool H5Object::attrExists(const H5std_string& name) const
+{
+    return(attrExists(name.c_str()));
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::removeAttr
+///\brief       Removes the named attribute from this object.
+///\param       name - IN: Name of the attribute to be removed
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Object::removeAttr(const char* name) const
+{
+    herr_t ret_value = H5Adelete(getId(), name);
+    if (ret_value < 0)
+        throw AttributeIException(inMemFunc("removeAttr"), "H5Adelete failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::removeAttr
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes
+///             a reference to an \c H5std_string for \a name.
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void H5Object::removeAttr(const H5std_string& name) const
+{
+    removeAttr(name.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::renameAttr
+///\brief       Renames the named attribute from this object.
+///\param       oldname - IN: Name of the attribute to be renamed
+///\param       newname - IN: New name ame of the attribute
+///\exception   H5::AttributeIException
+// Programmer   Binh-Minh Ribler - Mar, 2005
+//--------------------------------------------------------------------------
+void H5Object::renameAttr(const char* oldname, const char* newname) const
+{
+    herr_t ret_value = H5Arename(getId(), oldname, newname);
+    if (ret_value < 0)
+        throw AttributeIException(inMemFunc("renameAttr"), "H5Arename failed");
+}
+
+//--------------------------------------------------------------------------
+// Function:    H5Object::renameAttr
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function in that it takes
+///             a reference to an \c H5std_string for the names.
+// Programmer   Binh-Minh Ribler - Mar, 2005
+//--------------------------------------------------------------------------
+void H5Object::renameAttr(const H5std_string& oldname, const H5std_string& newname) const
+{
+    renameAttr (oldname.c_str(), newname.c_str());
+}
+
+//--------------------------------------------------------------------------
 // Function:    getObjName
 ///\brief       Given an id, returns the type of the object.
 ///\return      The name of the object
@@ -85,11 +386,11 @@ ssize_t H5Object::getObjName(char *obj_name, size_t buf_size) const
 
     // If H5Iget_name returns a negative value, raise an exception
     if (name_size < 0)
-    {
+     {
         throw Exception(inMemFunc("getObjName"), "H5Iget_name failed");
     }
     else if (name_size == 0)
-    {
+     {
         throw Exception(inMemFunc("getObjName"), "Object must have a name, but name length is 0");
     }
     // Return length of the name
@@ -113,16 +414,16 @@ H5std_string H5Object::getObjName() const
 
     // If H5Iget_name failed, throw exception
     if (name_size < 0)
-    {
+     {
         throw Exception(inMemFunc("getObjName"), "H5Iget_name failed");
     }
     else if (name_size == 0)
-    {
+     {
         throw Exception(inMemFunc("getObjName"), "Object must have a name, but name length is 0");
     }
     // Object's name exists, retrieve it
     else if (name_size > 0)
-    {
+     {
         char* name_C = new char[name_size+1];  // temporary C-string
         HDmemset(name_C, 0, name_size+1); // clear buffer
 
@@ -158,13 +459,13 @@ ssize_t H5Object::getObjName(H5std_string& obj_name, size_t len) const
 
     // If no length is provided, get the entire object name
     if (len == 0)
-    {
+     {
         obj_name = getObjName();
         name_size = obj_name.length();
     }
     // If length is provided, get that number of characters in name
     else
-    {
+     {
         char* name_C = new char[len+1];  // temporary C-string
         HDmemset(name_C, 0, len+1); // clear buffer
 
@@ -183,14 +484,13 @@ ssize_t H5Object::getObjName(H5std_string& obj_name, size_t len) const
     return(name_size);
 }
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	H5Object destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    H5Object destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5Object::~H5Object() {}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h
index f8ac792..f8877ee 100644
--- a/c++/src/H5Object.h
+++ b/c++/src/H5Object.h
@@ -6,59 +6,103 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5Object_H
 #define __H5Object_H
 
-#include "H5Location.h"
-#include "H5Classes.h"		// constains forward class declarations
-
-// H5Object is a baseclass.  It has these subclasses:
-// Group, DataSet, and DataType.
-// DataType, in turn, has several specific datatypes as subclasses.
-// Modification:
-//	Sept 18, 2012: Added class H5Location in between IdComponent and
-//		H5Object.  An H5File now inherits from H5Location.  All HDF5
-//		wrappers in H5Object are moved up to H5Location.  H5Object
-//		is left mostly empty for future wrappers that are only for
-//		group, dataset, and named datatype.  Note that the reason for
-//		adding H5Location instead of simply moving H5File to be under
-//		H5Object is H5File is not an HDF5 object, and renaming H5Object
-//		to H5Location will risk breaking user applications.
-//		-BMR
-//	Apr 2, 2014: Added wrapper getObjName for H5Iget_name 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class H5Object
     \brief Class H5Object is a bridge between H5Location and DataSet, DataType,
      and Group.
-
-    All the wrappers in H5Object were moved to H5Location.
 */
+/*
+    Modification:
+        Sept 18, 2012: Added class H5Location in between IdComponent and
+                H5Object.  An H5File now inherits from H5Location.  All HDF5
+                wrappers in H5Object are moved up to H5Location.  H5Object
+                is left mostly empty for future wrappers that are only for
+                group, dataset, and named datatype.  Note that the reason for
+                adding H5Location instead of simply moving H5File to be under
+                H5Object is H5File is not an HDF5 object, and renaming H5Object
+                to H5Location will risk breaking user applications.
+                -BMR
+        Apr 2, 2014: Added wrapper getObjName for H5Iget_name 
+        Sep 21, 2016: Rearranging classes (HDFFV-9920) moved H5A wrappers back
+                into H5Object.  This way, C functions that takes attribute id
+                can be in H5Location and those that cannot take attribute id
+                can be in H5Object.
+*/
+// Class forwarding
+class H5Object;
+class Attribute;
+
+// Define the operator function pointer for H5Aiterate().
+typedef void (*attr_operator_t)(H5Object& loc/*in*/,
+                                 const H5std_string attr_name/*in*/,
+                                 void *operator_data/*in,out*/);
+
+// User data for attribute iteration
+class UserData4Aiterate {
+    public:
+        attr_operator_t op;
+        void* opData;
+        H5Object* location;
+};
+
+//  Inheritance: H5Location -> IdComponent
 class H5_DLLCPP H5Object : public H5Location {
    public:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Gets the name of this HDF5 object, i.e., Group, DataSet, or
-	// DataType.
-	ssize_t getObjName(char *obj_name, size_t buf_size = 0) const;
-	ssize_t getObjName(H5std_string& obj_name, size_t len = 0) const;
-	H5std_string getObjName() const;
+        // Creates an attribute for the specified object
+        // PropList is currently not used, so always be default.
+        Attribute createAttribute(const char* name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT) const;
+        Attribute createAttribute(const H5std_string& name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT) const;
+
+        // Given its name, opens the attribute that belongs to an object at
+        // this location.
+        Attribute openAttribute(const char* name) const;
+        Attribute openAttribute(const H5std_string& name) const;
+
+        // Given its index, opens the attribute that belongs to an object at
+        // this location.
+        Attribute openAttribute(const unsigned int idx) const;
+
+        // Iterate user's function over the attributes of this object.
+        int iterateAttrs(attr_operator_t user_op, unsigned* idx = NULL, void* op_data = NULL);
 
-	// Noop destructor.
-	virtual ~H5Object();
+        // Returns the object header version of an object
+        unsigned objVersion() const;
+
+        // Checks whether the named attribute exists for this object.
+        bool attrExists(const char* name) const;
+        bool attrExists(const H5std_string& name) const;
+
+        // Renames the named attribute to a new name.
+        void renameAttr(const char* oldname, const char* newname) const;
+        void renameAttr(const H5std_string& oldname, const H5std_string& newname) const;
+
+        // Removes the named attribute from this object.
+        void removeAttr(const char* name) const;
+        void removeAttr(const H5std_string& name) const;
+
+        // Returns an identifier.
+        virtual hid_t getId() const = 0;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+        // Gets the name of this HDF5 object, i.e., Group, DataSet, or
+        // DataType.  These should have const but are retiring anyway.
+        ssize_t getObjName(char *obj_name, size_t buf_size = 0) const;
+        ssize_t getObjName(H5std_string& obj_name, size_t len = 0) const;
+        H5std_string getObjName() const;
 
    protected:
-	// Default constructor
-	H5Object();
+        // Default constructor
+        H5Object();
 
         // *** Deprecation warning ***
         // The following two constructors are no longer appropriate after the
@@ -67,17 +111,22 @@ class H5_DLLCPP H5Object : public H5Location {
         // other will be removed from 1.10 release, and then from 1.8 if its
         // removal does not raise any problems in two 1.10 releases.
 
-	// Creates a copy of an existing object giving the object id
-	H5Object( const hid_t object_id );
+        // Creates a copy of an existing object giving the object id
+        H5Object(const hid_t object_id);
+
+        // Copy constructor: makes copy of an H5Object object.
+        // H5Object(const H5Object& original);
+
+        // Sets the identifier of this object to a new value. - this one
+        // doesn't increment reference count
+        virtual void p_setId(const hid_t new_id) = 0;
 
-	// Copy constructor: makes copy of an H5Object object.
-	// H5Object(const H5Object& original);
+        // Noop destructor.
+        virtual ~H5Object();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-}; /* end class H5Object */
+}; // end of H5Object
+} // namespace H5
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5Object_H
diff --git a/c++/src/H5OcreatProp.cpp b/c++/src/H5OcreatProp.cpp
index 635ffe9..ec6c08e 100644
--- a/c++/src/H5OcreatProp.cpp
+++ b/c++/src/H5OcreatProp.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,12 +17,9 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5FaccProp.h"
 #include "H5OcreatProp.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -78,49 +73,49 @@ void ObjCreatPropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose:	Constant for default property
+// Purpose:     Constant for default property
 //--------------------------------------------------------------------------
 const ObjCreatPropList& ObjCreatPropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	Default Constructor
-///\brief	Creates a file access property list
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    Default Constructor
+///\brief       Creates a file access property list
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 ObjCreatPropList::ObjCreatPropList() : PropList(H5P_OBJECT_CREATE) {}
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList copy constructor
-///\brief	Copy Constructor: makes a copy of the original
-///\param	original - IN: ObjCreatPropList instance to copy
-// Programmer:	Binh-Minh Ribler - 2000
+// Function:    ObjCreatPropList copy constructor
+///\brief       Copy Constructor: makes a copy of the original
+///\param       original - IN: ObjCreatPropList instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 ObjCreatPropList::ObjCreatPropList(const ObjCreatPropList& original) : PropList(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList overloaded constructor
-///\brief	Creates a file access property list using the id of an
-///		existing one.
-// Programmer:  Binh-Minh Ribler - 2000
+// Function:    ObjCreatPropList overloaded constructor
+///\brief       Creates a file access property list using the id of an
+///             existing one.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 ObjCreatPropList::ObjCreatPropList(const hid_t plist_id) : PropList(plist_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList::setAttrPhaseChange
-///\brief	Sets attribute storage phase change thresholds.
-///\param	max_compact - IN: Maximum number of attributes to be stored in
-///				  compact storage.  Default to 8
-///\param	min_dense   - IN: Minimum number of attributes to be stored in
-///				  dense storage.  Default to 6
-///\exception	H5::PropListIException
+// Function:    ObjCreatPropList::setAttrPhaseChange
+///\brief       Sets attribute storage phase change thresholds.
+///\param       max_compact - IN: Maximum number of attributes to be stored in
+///                               compact storage.  Default to 8
+///\param       min_dense   - IN: Minimum number of attributes to be stored in
+///                               dense storage.  Default to 6
+///\exception   H5::PropListIException
 ///\par Description
-///		If \c max_compact is set to 0, dense storage will be used.
-///		For more detail about on attribute storage, please refer to the
-///		C layer Reference Manual at:
+///             If \c max_compact is set to 0, dense storage will be used.
+///             For more detail about on attribute storage, please refer to the
+///             C layer Reference Manual at:
 /// https://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrPhaseChange
-// Programmer:  Binh-Minh Ribler - September 2015
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 void ObjCreatPropList::setAttrPhaseChange(unsigned max_compact, unsigned min_dense) const
 {
@@ -132,19 +127,19 @@ void ObjCreatPropList::setAttrPhaseChange(unsigned max_compact, unsigned min_den
 }
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList::getAttrPhaseChange
-///\brief	Gets attribute storage phase change thresholds.
-///\param	max_compact - OUT: Maximum number of attributes to be stored in
-///				  compact storage.
-///\param	min_dense   - OUT: Minimum number of attributes to be stored in
-///				  dense storage.
-///\exception	H5::PropListIException
+// Function:    ObjCreatPropList::getAttrPhaseChange
+///\brief       Gets attribute storage phase change thresholds.
+///\param       max_compact - OUT: Maximum number of attributes to be stored in
+///                               compact storage.
+///\param       min_dense   - OUT: Minimum number of attributes to be stored in
+///                               dense storage.
+///\exception   H5::PropListIException
 ///\par Description
-///		If \c max_compact is set to 0, dense storage will be used.
-///		For more detail about on attribute storage, please refer to the
-///		C layer Reference Manual at:
+///             If \c max_compact is set to 0, dense storage will be used.
+///             For more detail about on attribute storage, please refer to the
+///             C layer Reference Manual at:
 /// https://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAttrPhaseChange
-// Programmer:  Binh-Minh Ribler - September 2015
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 void ObjCreatPropList::getAttrPhaseChange(unsigned& max_compact, unsigned& min_dense) const
 {
@@ -157,23 +152,23 @@ void ObjCreatPropList::getAttrPhaseChange(unsigned& max_compact, unsigned& min_d
 }
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList::setAttrCrtOrder
-///\brief	Sets tracking and indexing of attribute creation order.
-///\param	crt_order_flags  - IN: Flags specifying whether to track and
-///			index attribute creation order.  Default: No flag set
-///\exception	H5::PropListIException
+// Function:    ObjCreatPropList::setAttrCrtOrder
+///\brief       Set the flags for creation order of attributes on an object
+///\param       crt_order_flags  - IN: Flags specifying whether to track and
+///                     index attribute creation order.  Default: No flag set
+///\exception   H5::PropListIException
 ///\par Description
-///		Valid flags are:
-///		\li \c H5P_CRT_ORDER_TRACKED - Attribute creation order is tracked
-///		\li \c H5P_CRT_ORDER_INDEXED - Attribute creation order is
-///				 indexed (requires H5P_CRT_ORDER_TRACKED).
-///		When no flag is set, attribute creation order is neither
-///		tracked not indexed.  Note that HDF5 currently provides no
-///		mechanism to turn on attribute creation order tracking at object
-///		creation time and to build the index later.
-///		The C layer Reference Manual at can be found at:
+///             Valid flags are:
+///             \li \c H5P_CRT_ORDER_TRACKED - Attribute creation order is tracked
+///             \li \c H5P_CRT_ORDER_INDEXED - Attribute creation order is
+///                              indexed (requires H5P_CRT_ORDER_TRACKED).
+///             When no flag is set, attribute creation order is neither
+///             tracked not indexed.  Note that HDF5 currently provides no
+///             mechanism to turn on attribute creation order tracking at object
+///             creation time and to build the index later.
+///             The C layer Reference Manual at can be found at:
 /// https://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrCreationOrder
-// Programmer:  Binh-Minh Ribler - September 2015
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 void ObjCreatPropList::setAttrCrtOrder(unsigned crt_order_flags) const
 {
@@ -185,18 +180,17 @@ 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
+// Function:    ObjCreatPropList::getAttrCrtOrder
+///\brief       Returns the flags indicating creation order is tracked/indexed
+///             for attributes on an object.
+///\return      The flags
+///\exception   H5::PropListIException
 ///\par Description
-///		When no flag is set, i.e. crt_order_flags = 0, attribute
-///		creation order is neither tracked not indexed.
-///		The C layer Reference Manual at can be found at:
+///             When no flag is set, i.e. crt_order_flags = 0, attribute
+///             creation order is neither tracked not indexed.
+///             The C layer Reference Manual at can be found at:
 /// https://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAttrCreationOrder
-// Programmer:  Binh-Minh Ribler - September 2015
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 unsigned ObjCreatPropList::getAttrCrtOrder() const
 {
@@ -211,12 +205,10 @@ unsigned ObjCreatPropList::getAttrCrtOrder() const
 }
 
 //--------------------------------------------------------------------------
-// Function:	ObjCreatPropList destructor
-///\brief	Noop destructor
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    ObjCreatPropList destructor
+///\brief       Noop destructor
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 ObjCreatPropList::~ObjCreatPropList() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5OcreatProp.h b/c++/src/H5OcreatProp.h
index 0fda34d..d1eae86 100644
--- a/c++/src/H5OcreatProp.h
+++ b/c++/src/H5OcreatProp.h
@@ -6,55 +6,55 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5ObjCreatPropList_H
 #define __H5ObjCreatPropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class ObjCreatPropList represents the HDF5 object creation property list.
+/*! \class ObjCreatPropList
+    \brief Class ObjCreatPropList inherits from PropList and provides
+    wrappers for the HDF5 object create property list.
+*/
+//  Inheritance: PropList -> IdComponent
 class H5_DLLCPP ObjCreatPropList : public PropList {
    public:
-	///\brief Default object creation property list.
-	static const ObjCreatPropList& DEFAULT;
+        ///\brief Default object creation property list.
+        static const ObjCreatPropList& DEFAULT;
 
-	// Creates a object creation property list.
-	ObjCreatPropList();
+        // Creates a object creation property list.
+        ObjCreatPropList();
 
-	// Sets attribute storage phase change thresholds.
-	void setAttrPhaseChange(unsigned max_compact = 8, unsigned min_dense = 6) const;
+        // Sets attribute storage phase change thresholds.
+        void setAttrPhaseChange(unsigned max_compact = 8, unsigned min_dense = 6) const;
 
-	// Gets attribute storage phase change thresholds.
-	void getAttrPhaseChange(unsigned& max_compact, unsigned& min_dense) const;
+        // Gets attribute storage phase change thresholds.
+        void getAttrPhaseChange(unsigned& max_compact, unsigned& min_dense) const;
 
-	// Sets tracking and indexing of attribute creation order.
-	void setAttrCrtOrder(unsigned crt_order_flags) const;
+        // Sets tracking and indexing of attribute creation order.
+        void setAttrCrtOrder(unsigned crt_order_flags) const;
 
-	// Gets tracking and indexing settings for attribute creation order.
-	unsigned getAttrCrtOrder() const;
+        // Gets tracking and indexing settings for attribute creation order.
+        unsigned getAttrCrtOrder() const;
 
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("ObjCreatPropList"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("ObjCreatPropList"); }
 
-	// Copy constructor: creates a copy of a ObjCreatPropList object.
-	ObjCreatPropList( const ObjCreatPropList& original );
+        // Copy constructor: creates a copy of a ObjCreatPropList object.
+        ObjCreatPropList(const ObjCreatPropList& original);
 
-	// Creates a copy of an existing object creation property list
-	// using the property list id.
-	ObjCreatPropList (const hid_t plist_id);
+        // Creates a copy of an existing object creation property list
+        // using the property list id.
+        ObjCreatPropList (const hid_t plist_id);
 
-	// Noop destructor
-	virtual ~ObjCreatPropList();
+        // Noop destructor
+        virtual ~ObjCreatPropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
@@ -69,8 +69,7 @@ class H5_DLLCPP ObjCreatPropList : public PropList {
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of ObjCreatPropList
+} // namespace H5
+
 #endif // __H5ObjCreatPropList_H
diff --git a/c++/src/H5PredType.cpp b/c++/src/H5PredType.cpp
index fb29f1e..53d525c 100644
--- a/c++/src/H5PredType.cpp
+++ b/c++/src/H5PredType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,25 +17,27 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
+#include "H5OcreatProp.h"
+#include "H5DcreatProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
 #include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AtomType.h"
 #include "H5PredType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 //--------------------------------------------------------------------------
-// Function:	PredType overloaded constructor
-///\brief	Creates a PredType object using the id of an existing
-///		predefined datatype.
-///\param	predtype_id - IN: Id of a predefined datatype
+// Function:    PredType overloaded constructor
+///\brief       Creates a PredType object using the id of an existing
+///             predefined datatype.
+///\param       predtype_id - IN: Id of a predefined datatype
 // Description
-// 		This constructor creates a PredType object by copying
-//		the provided HDF5 predefined datatype.
-// Programmer	Binh-Minh Ribler - 2000
+//              This constructor creates a PredType object by copying
+//              the provided HDF5 predefined datatype.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PredType::PredType(const hid_t predtype_id) : AtomType(predtype_id)
 {
@@ -45,69 +45,69 @@ PredType::PredType(const hid_t predtype_id) : AtomType(predtype_id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	PredType default constructor
-///\brief	Default constructor: Creates a stub predefined datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PredType default constructor
+///\brief       Default constructor: Creates a stub predefined datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PredType::PredType() : AtomType() {}
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	PredType copy constructor
-///\brief	Copy constructor: makes a copy of the original PredType object.
-///\param	original - IN: PredType instance to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PredType copy constructor
+///\brief       Copy constructor: makes a copy of the original PredType object.
+///\param       original - IN: PredType instance to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PredType::PredType(const PredType& original) : AtomType(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	PredType::operator=
-///\brief	Assignment operator.
-///\param	rhs - IN: Reference to the predefined datatype
-///\return	Reference to PredType instance
-///\exception	H5::DataTypeIException
+// Function:    PredType::operator=
+///\brief       Assignment operator.
+///\param       rhs - IN: Reference to the predefined datatype
+///\return      Reference to PredType instance
+///\exception   H5::DataTypeIException
 // Description
-//		Makes a copy of the type on the right hand side and stores
-//		the new id in the left hand side object.
-// Programmer	Binh-Minh Ribler - 2000
+//              Makes a copy of the type on the right hand side and stores
+//              the new id in the left hand side object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-PredType& PredType::operator=( const PredType& rhs )
+PredType& PredType::operator=(const PredType& rhs)
 {
     if (this != &rhs)
-	copy(rhs);
+        copy(rhs);
     return(*this);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // These dummy functions do not inherit from DataType - they'll
 // throw an DataTypeIException if invoked.
-void PredType::commit(H5Location& loc, const char* name )
+void PredType::commit(H5Location& loc, const char* name)
 {
-   throw DataTypeIException("PredType::commit", "Error: Attempted to commit a predefined datatype.  Invalid operation!" );
+    throw DataTypeIException("PredType::commit", "Error: Attempted to commit a predefined datatype.  Invalid operation!");
 }
 
-void PredType::commit(H5Location& loc, const H5std_string& name )
+void PredType::commit(H5Location& loc, const H5std_string& name)
 {
-   commit( loc, name.c_str());
+    commit(loc, name.c_str());
 }
 
 bool PredType::committed()
 {
-   throw DataTypeIException("PredType::committed", "Error: Attempting to check for commit status on a predefined datatype." );
+    throw DataTypeIException("PredType::committed", "Error: Attempting to check for commit status on a predefined datatype.");
 }
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 // Default destructor
 //--------------------------------------------------------------------------
-// Function:	PredType destructor
-///\brief	Noop destructor.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PredType destructor
+///\brief       Noop destructor.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PredType::~PredType() {}
 
 /*****************************************************************************
-	The following section is regarding the global constants PredType,
-	DataSpace, and PropList.
+        The following section is regarding the global constants PredType,
+        DataSpace, and PropList.
 
  *****************************************************************************/
 
@@ -290,18 +290,18 @@ PredType* PredType::NATIVE_UINT_FAST64_;
 #endif /* H5_SIZEOF_UINT_FAST64_T */
 
 //--------------------------------------------------------------------------
-// Function:	PredType::getPredTypes
-// Purpose:	Returns the dummy PredType constant object pointer
-// Return:	PredType object pointer
+// Function:    PredType::getPredTypes
+// Purpose      Returns the dummy PredType constant object pointer
+// Return:      PredType object pointer
 // Description
-//		If the dummy constant PREDTYPE_CONST_ is not allocated yet,
-//		call makePredTypes() to allocate all of the PredType constants.
-//		Otherwise, just simply return the object pointer PREDTYPE_CONST_.
+//              If the dummy constant PREDTYPE_CONST_ is not allocated yet,
+//              call makePredTypes() to allocate all of the PredType constants.
+//              Otherwise, just simply return the object pointer PREDTYPE_CONST_.
 //
-//		Note that, there is a similar function to getPredTypes() in
-//		other classes, that have global constants, is called getConstant().
+//              Note that, there is a similar function to getPredTypes() in
+//              other classes, that have global constants, is called getConstant().
 //
-// Programmer	Binh-Minh Ribler - September 2015
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 PredType* PredType::getPredTypes()
 {
@@ -316,16 +316,16 @@ PredType* PredType::getPredTypes()
     // If the dummy constant pointer is not allocated, allocate all PredType
     // constant pointers.  Otherwise, throw because it shouldn't be.
     if (PREDTYPE_CONST_ == 0)
-	makePredTypes();
+        makePredTypes();
     else
-	throw H5::DataTypeIException("PredType::getPredTypes", "PredType::getPredTypes is being invoked on an allocated PREDTYPE_CONST_");
+        throw H5::DataTypeIException("PredType::getPredTypes", "PredType::getPredTypes is being invoked on an allocated PREDTYPE_CONST_");
     return PREDTYPE_CONST_;
 }
 
 //--------------------------------------------------------------------------
-// Function:	PredType::makePredTypes
-// Purpose:	Allocate all PredType constants.
-// Programmer	Binh-Minh Ribler - September 2015
+// Function:    PredType::makePredTypes
+// Purpose      Allocate all PredType constants.
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 void PredType::makePredTypes()
 {
@@ -513,9 +513,9 @@ void PredType::makePredTypes()
 
 
 //--------------------------------------------------------------------------
-// Function:	PredType::deleteConstants
-// Purpose:	Deletes all PredType constant pointers.
-// Programmer	Binh-Minh Ribler - September 2015
+// Function:    PredType::deleteConstants
+// Purpose      Deletes all PredType constant pointers.
+// Programmer   Binh-Minh Ribler - September 2015
 //--------------------------------------------------------------------------
 void PredType::deleteConstants()
 {
@@ -886,211 +886,208 @@ const PredType& PredType::NATIVE_UINT_FAST64 = *NATIVE_UINT_FAST64_;
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
 
 /***************************************************************************
-				Design Note
-				===========
+                                Design Note
+                                ===========
 
 September 2015:
 
-	The C++ library has several types of global constants from different
-	classes, such as PropList, PredType, DataSpace, etc...  Previously,
-	these global constants were declared statically and the C++ library used
-	a constant, called PredType::AtExit, to detect when all the global
-	contants are destroyed then close the C library (H5close).  This method
-	relied on the order of the constants being created and destroyed and
-	that PredType constants be the last to be destroyed.  In September
-	2015, it was recognized that the order in which the global constants were
-	created and destroyed was actually undefined, thus can be different
-	between different compilers.  This resulted in failure when compilers
-	destroy PredType constants before others because when PredType::AtExit
-	was destroyed, the C library was closed, so when the constants of other
-	classes such as PropList or DataSpace were being deleted, the C library
-	would not be available.
-
-	These are the classes that have global constants:
-		+ PredType
-		+ DataSpace
-		+ PropList (and its subclasses below)
-		+ FileAccPropList
-		+ FileCreatPropList
-		+ DSetMemXferPropList
-		+ DSetCreatPropList
-	
-
-	The new method includes these main points:
-
-	- The C++ library uses dynamically allocated constants to have the
-	  control in which order the global constants are created/destroyed.
-
-	- The previous static constants are changed to be the references to
-	  the dynamically allocated constants to avoid impact on applications.
-
-	- The first time an IdComponent default constructor is invoked, it
-	  will call the function H5Library::initH5cpp which registers the
-	  terminating functions from each class that has the global constants
-	  so that these functions can destroy those constants at the exit of the
-	  application.  IdComponent is a baseclass of any object class that has
-	  an identifier, such as Group, DataSet, DataType,...  The classes which
-	  have the global constants are all derived from IdComponent.
-
-	- At the normal termination of the application, each registered function
-	  for each constant type will delete all the allocated constants in
-	  that type class, then a different terminating function, which was also
-	  registered with atexit() by initH5cpp, will call H5close to close the
-	  C library.
-
-	The following list presents the differences between the old and new
-	methods and the changes implemented for the new method.
-
-	1.  The following items are added to class H5Library:
-		// Private instance to be created by H5Library only
-		static H5Library* instance;
-
-		// Returns a singleton H5Library to initialize the global
-		// constants, invoked in IdComponent default constructor
-		static H5Library* getInstance(); // public
-
-		// Registers cleanup and terminating functions with atexit(),
-		// called in IdComponent default constructor
-		static void initH5cpp(void); // public
-
-		// Calls H5close to terminate the library, registered with
-		// atexit(), as the last thing to be done.
-		static void termH5cpp(void); // public
-
-	2.  The following shows the differences between the old and new methods
-	    for allocating the PredType constants.  There are more than 100
-	    constants, but only one is shown here for examples.
-
-	Old Method:
-	----------
-		// Declaration of the constant - in "H5PredType.h"
-		static const PredType NATIVE_INT;
-
-		// Definition of the constant - in "H5PredType.cpp"
-		const PredType PredType::NATIVE_INT(H5T_NATIVE_INT);
-
-	New Method:
-	----------
-		// Declare pointer for a constant - in "H5PredType.h"
-		static PredType* NATIVE_INT_; // "H5PredType.h"
-
-		// Change previous constant to reference - in "H5PredType.h"
-		static const PredType& NATIVE_INT;
-
-		// The assignment of the first static constant, named
-		// PREDTYPE_CONST, calls makePredTypes() which allocates the
-		// dynamic memory for every PredType constant.
-
-		// Creates a dynamic PredType object representing a C constant
-		// - in makePredTypes()
-		NATIVE_INT_ = new PredType(H5T_NATIVE_INT);
-
-		// Assign the constant reference to the dynamic object
-		// - in "H5PredType.cpp"
-		const PredType& PredType::NATIVE_INT = *NATIVE_INT_;
-
-	    Functions added to class PredType:
-
-		// Creates the constants
-		static void makePredTypes(); // private
-
-		// Calls makePredTypes to create the constants and returns
-		// the dummy constant PREDTYPE_CONST;
-		static PredType* getPredTypes(); // private
-
-		// Deletes the constants
-		static void deleteConstants(); // public
-
-	3.  This section shows the differences between the old and new methods
-	for allocating the DataSpace constant, DataSpace::ALL.
+        The C++ library has several types of global constants from different
+        classes, such as PropList, PredType, DataSpace, etc...  Previously,
+        these global constants were declared statically and the C++ library used
+        a constant, called PredType::AtExit, to detect when all the global
+        contants are destroyed then close the C library (H5close).  This method
+        relied on the order of the constants being created and destroyed and
+        that PredType constants be the last to be destroyed.  In September
+        2015, it was recognized that the order in which the global constants were
+        created and destroyed was actually undefined, thus can be different
+        between different compilers.  This resulted in failure when compilers
+        destroy PredType constants before others because when PredType::AtExit
+        was destroyed, the C library was closed, so when the constants of other
+        classes such as PropList or DataSpace were being deleted, the C library
+        would not be available.
+
+        These are the classes that have global constants:
+                + PredType
+                + DataSpace
+                + PropList (and its subclasses below)
+                + FileAccPropList
+                + FileCreatPropList
+                + DSetMemXferPropList
+                + DSetCreatPropList
+
+        The new method includes these main points:
+
+        - The C++ library uses dynamically allocated constants to have the
+          control in which order the global constants are created/destroyed.
+
+        - The previous static constants are changed to be the references to
+          the dynamically allocated constants to avoid impact on applications.
+
+        - The first time an IdComponent default constructor is invoked, it
+          will call the function H5Library::initH5cpp which registers the
+          terminating functions from each class that has the global constants
+          so that these functions can destroy those constants at the exit of the
+          application.  IdComponent is a baseclass of any object class that has
+          an identifier, such as Group, DataSet, DataType,...  The classes which
+          have the global constants are all derived from IdComponent.
+
+        - At the normal termination of the application, each registered function
+          for each constant type will delete all the allocated constants in
+          that type class, then a different terminating function, which was also
+          registered with atexit() by initH5cpp, will call H5close to close the
+          C library.
+
+        The following list presents the differences between the old and new
+        methods and the changes implemented for the new method.
+
+        1.  The following items are added to class H5Library:
+                // Private instance to be created by H5Library only
+                static H5Library* instance;
+
+                // Returns a singleton H5Library to initialize the global
+                // constants, invoked in IdComponent default constructor
+                static H5Library* getInstance(); // public
+
+                // Registers cleanup and terminating functions with atexit(),
+                // called in IdComponent default constructor
+                static void initH5cpp(void); // public
+
+                // Calls H5close to terminate the library, registered with
+                // atexit(), as the last thing to be done.
+                static void termH5cpp(void); // public
+
+        2.  The following shows the differences between the old and new methods
+            for allocating the PredType constants.  There are more than 100
+            constants, but only one is shown here for examples.
+
+        Old Method:
+        ----------
+                // Declaration of the constant - in "H5PredType.h"
+                static const PredType NATIVE_INT;
+
+                // Definition of the constant - in "H5PredType.cpp"
+                const PredType PredType::NATIVE_INT(H5T_NATIVE_INT);
+
+        New Method:
+        ----------
+                // Declare pointer for a constant - in "H5PredType.h"
+                static PredType* NATIVE_INT_; // "H5PredType.h"
+
+                // Change previous constant to reference - in "H5PredType.h"
+                static const PredType& NATIVE_INT;
+
+                // The assignment of the first static constant, named
+                // PREDTYPE_CONST, calls makePredTypes() which allocates the
+                // dynamic memory for every PredType constant.
+
+                // Creates a dynamic PredType object representing a C constant
+                // - in makePredTypes()
+                NATIVE_INT_ = new PredType(H5T_NATIVE_INT);
+
+                // Assign the constant reference to the dynamic object
+                // - in "H5PredType.cpp"
+                const PredType& PredType::NATIVE_INT = *NATIVE_INT_;
+
+            Functions added to class PredType:
+
+                // Creates the constants
+                static void makePredTypes(); // private
+
+                // Calls makePredTypes to create the constants and returns
+                // the dummy constant PREDTYPE_CONST;
+                static PredType* getPredTypes(); // private
+
+                // Deletes the constants
+                static void deleteConstants(); // public
+
+        3.  This section shows the differences between the old and new methods
+            for allocating the DataSpace constant, DataSpace::ALL.
 
-	Old Method:
-	----------
-		// Declaration of the constant - in "H5DataSpace.h"
-		static const DataSpace ALL;
+        Old Method:
+        ----------
+                // Declaration of the constant - in "H5DataSpace.h"
+                static const DataSpace ALL;
 
-		// Definition of the constant - in "H5DataSpace.cpp"
-		const DataSpace DataSpace::ALL(H5S_ALL);
+                // Definition of the constant - in "H5DataSpace.cpp"
+                const DataSpace DataSpace::ALL(H5S_ALL);
 
-	New Method:
-	----------
-		// Declare pointer for a constant - in "H5DataSpace.h"
-		static DataSpace* ALL_; // "H5DataSpace.h"
+        New Method:
+        ----------
+                // Declare pointer for a constant - in "H5DataSpace.h"
+                static DataSpace* ALL_; // "H5DataSpace.h"
 
-		// Change previous constant to reference - in "H5DataSpace.h"
-		static const DataSpace& ALL;
+                // Change previous constant to reference - in "H5DataSpace.h"
+                static const DataSpace& ALL;
 
-		// Creates a dynamic DataSpace object representing the C constant
-		// - in "H5DataSpace.cpp"
-		ALL_ = new DataSpace(H5S_ALL);
+                // Creates a dynamic DataSpace object representing the C constant
+                // - in "H5DataSpace.cpp"
+                ALL_ = new DataSpace(H5S_ALL);
 
-		// Assign the constant reference to the dynamic object
-		// - in "H5DataSpace.cpp"
-		const DataSpace& DataSpace::ALL = *ALL_;
+                // Assign the constant reference to the dynamic object
+                // - in "H5DataSpace.cpp"
+                const DataSpace& DataSpace::ALL = *ALL_;
 
-	    Functions added to class DataSpace:
+            Functions added to class DataSpace:
 
-		// Creates the constant
-		static DataSpace* getConstant(); // private
+                // Creates the constant
+                static DataSpace* getConstant(); // private
 
-		// Deletes the constant
-		static void deleteConstants(); // public
+                // Deletes the constant
+                static void deleteConstants(); // public
 
-	4.  This section shows the differences between the old and new methods
-	for allocating the following constants
-		- PropList constant, PropList::DEFAULT.
-		- DSetCreatPropList constant, DSetCreatPropList::DEFAULT.
-		- DSetMemXferPropList constant, DSetMemXferPropList::DEFAULT.
-		- FileCreatPropList constant, FileCreatPropList::DEFAULT.
-		- FileAccPropList constant, FileAccPropList::DEFAULT.
+        4.  This section shows the differences between the old and new methods
+            for allocating the following constants
+                - PropList constant, PropList::DEFAULT.
+                - DSetCreatPropList constant, DSetCreatPropList::DEFAULT.
+                - DSetMemXferPropList constant, DSetMemXferPropList::DEFAULT.
+                - FileCreatPropList constant, FileCreatPropList::DEFAULT.
+                - FileAccPropList constant, FileAccPropList::DEFAULT.
 
-	    For these constants, the library has the same changes, except the
-	    class names and the HDF5 corresponding constants. Only the items
-	    of PropList are listed, and "PropList" can be replaced by any of
-	    DSetCreatPropList, DSetMemXferPropList, FileCreatPropList,
-	    FileAccPropList for those classes.  The HDF5 C constant "H5P_DEFAULT"
-	    can be replaced by any of these respectively: H5P_DATASET_CREATE,
-	    H5P_DATASET_XFER, H5P_FILE_CREATE, and H5P_FILE_ACCESS.
+            For these constants, the library has the same changes, except the
+            class names and the HDF5 corresponding constants. Only the items
+            of PropList are listed, and "PropList" can be replaced by any of
+            DSetCreatPropList, DSetMemXferPropList, FileCreatPropList,
+            FileAccPropList for those classes.  The HDF5 C constant "H5P_DEFAULT"
+            can be replaced by any of these respectively: H5P_DATASET_CREATE,
+            H5P_DATASET_XFER, H5P_FILE_CREATE, and H5P_FILE_ACCESS.
 
-	Old Method:
-	----------
-		// Declaration of the constant - in "H5PropList.h"
-		static const PropList DEFAULT;
+        Old Method:
+        ----------
+                // Declaration of the constant - in "H5PropList.h"
+                static const PropList DEFAULT;
 
-		// Definition of the constant - in "H5PropList.cpp"
-		const PropList PropList::DEFAULT(H5P_DEFAULT);
+                // Definition of the constant - in "H5PropList.cpp"
+                const PropList PropList::DEFAULT(H5P_DEFAULT);
 
-	New Method:
-	----------
-		// Declare pointer for a constant - in "H5PropList.h"
-		static PropList* DEFAULT_; // "H5PropList.h"
+        New Method:
+        ----------
+                // Declare pointer for a constant - in "H5PropList.h"
+                static PropList* DEFAULT_; // "H5PropList.h"
 
-		// Change previous constant to reference - in "H5PropList.h"
-		static const PropList& DEFAULT;
+                // Change previous constant to reference - in "H5PropList.h"
+                static const PropList& DEFAULT;
 
-		// Creates a dynamic PropList object representing the C constant
-		// - in "H5PropList.cpp"
-		DEFAULT_ = new PropList(H5P_DEFAULT);
+                // Creates a dynamic PropList object representing the C constant
+                // - in "H5PropList.cpp"
+                DEFAULT_ = new PropList(H5P_DEFAULT);
 
-		// Assign the constant reference to the dynamic object
-		// - in "H5PropList.cpp"
-		const PropList& PropList::DEFAULT = *DEFAULT_;
+                // Assign the constant reference to the dynamic object
+                // - in "H5PropList.cpp"
+                const PropList& PropList::DEFAULT = *DEFAULT_;
 
-	    Functions added to class PropList:
+            Functions added to class PropList:
 
-		// Creates the constant
-		static PropList* getConstant(); // private
+                // Creates the constant
+                static PropList* getConstant(); // private
 
-		// Deletes the constants
-		static void deleteConstants(); // public
+                // Deletes the constants
+                static void deleteConstants(); // public
 
-	    The same functions are added to the subclasses of PropList instead of
-	    using PropList's because of the class types and in favor of clarity.
+            The same functions are added to the subclasses of PropList instead of
+            using PropList's because of the class types and in favor of clarity.
 
 ****************************************************************************/
 
diff --git a/c++/src/H5PredType.h b/c++/src/H5PredType.h
index f560765..c631fb9 100644
--- a/c++/src/H5PredType.h
+++ b/c++/src/H5PredType.h
@@ -6,20 +6,16 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5PredType_H
 #define __H5PredType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 /*! \class PredType
     \brief Class PredType holds the definition of all the HDF5 predefined
@@ -28,209 +24,210 @@ namespace H5 {
     These types can only be made copy of, not created by H5Tcreate or
     closed by H5Tclose.  They are treated as constants.
 */
+//  Inheritance: AtomType -> DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP PredType : public AtomType {
    public:
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("PredType"); }
-
-	// Makes a copy of the predefined type and stores the new
-	// id in the left hand side object.
-	PredType& operator=( const PredType& rhs );
-
-	// Copy constructor - makes copy of the original object
-	PredType( const PredType& original );
-
-	// Noop destructor
-	virtual ~PredType();
-
-	/*! \brief This dummy function do not inherit from DataType - it will
-	    throw a DataTypeIException if invoked.
-	*/
-	void commit(H5Location& loc, const H5std_string& name );
-	/*! \brief This dummy function do not inherit from DataType - it will
-	    throw a DataTypeIException if invoked.
-	*/
-	void commit(H5Location& loc, const char* name );
-	/*! \brief This dummy function do not inherit from DataType - it will
-	    throw a DataTypeIException if invoked.
-	*/
-	bool committed();
-
-	///\brief PredType constants
-	static const PredType& STD_I8BE;
-	static const PredType& STD_I8LE;
-	static const PredType& STD_I16BE;
-	static const PredType& STD_I16LE;
-	static const PredType& STD_I32BE;
-	static const PredType& STD_I32LE;
-	static const PredType& STD_I64BE;
-	static const PredType& STD_I64LE;
-	static const PredType& STD_U8BE;
-	static const PredType& STD_U8LE;
-	static const PredType& STD_U16BE;
-	static const PredType& STD_U16LE;
-	static const PredType& STD_U32BE;
-	static const PredType& STD_U32LE;
-	static const PredType& STD_U64BE;
-	static const PredType& STD_U64LE;
-	static const PredType& STD_B8BE;
-	static const PredType& STD_B8LE;
-	static const PredType& STD_B16BE;
-	static const PredType& STD_B16LE;
-	static const PredType& STD_B32BE;
-	static const PredType& STD_B32LE;
-	static const PredType& STD_B64BE;
-	static const PredType& STD_B64LE;
-	static const PredType& STD_REF_OBJ;
-	static const PredType& STD_REF_DSETREG;
-
-	static const PredType& C_S1;
-	static const PredType& FORTRAN_S1;
-
-	static const PredType& IEEE_F32BE;
-	static const PredType& IEEE_F32LE;
-	static const PredType& IEEE_F64BE;
-	static const PredType& IEEE_F64LE;
-
-	static const PredType& UNIX_D32BE;
-	static const PredType& UNIX_D32LE;
-	static const PredType& UNIX_D64BE;
-	static const PredType& UNIX_D64LE;
-
-	static const PredType& INTEL_I8;
-	static const PredType& INTEL_I16;
-	static const PredType& INTEL_I32;
-	static const PredType& INTEL_I64;
-	static const PredType& INTEL_U8;
-	static const PredType& INTEL_U16;
-	static const PredType& INTEL_U32;
-	static const PredType& INTEL_U64;
-	static const PredType& INTEL_B8;
-	static const PredType& INTEL_B16;
-	static const PredType& INTEL_B32;
-	static const PredType& INTEL_B64;
-	static const PredType& INTEL_F32;
-	static const PredType& INTEL_F64;
-
-	static const PredType& ALPHA_I8;
-	static const PredType& ALPHA_I16;
-	static const PredType& ALPHA_I32;
-	static const PredType& ALPHA_I64;
-	static const PredType& ALPHA_U8;
-	static const PredType& ALPHA_U16;
-	static const PredType& ALPHA_U32;
-	static const PredType& ALPHA_U64;
-	static const PredType& ALPHA_B8;
-	static const PredType& ALPHA_B16;
-	static const PredType& ALPHA_B32;
-	static const PredType& ALPHA_B64;
-	static const PredType& ALPHA_F32;
-	static const PredType& ALPHA_F64;
-
-	static const PredType& MIPS_I8;
-	static const PredType& MIPS_I16;
-	static const PredType& MIPS_I32;
-	static const PredType& MIPS_I64;
-	static const PredType& MIPS_U8;
-	static const PredType& MIPS_U16;
-	static const PredType& MIPS_U32;
-	static const PredType& MIPS_U64;
-	static const PredType& MIPS_B8;
-	static const PredType& MIPS_B16;
-	static const PredType& MIPS_B32;
-	static const PredType& MIPS_B64;
-	static const PredType& MIPS_F32;
-	static const PredType& MIPS_F64;
-
-	static const PredType& NATIVE_CHAR;
-	static const PredType& NATIVE_SCHAR;
-	static const PredType& NATIVE_UCHAR;
-	static const PredType& NATIVE_SHORT;
-	static const PredType& NATIVE_USHORT;
-	static const PredType& NATIVE_INT;
-	static const PredType& NATIVE_UINT;
-	static const PredType& NATIVE_LONG;
-	static const PredType& NATIVE_ULONG;
-	static const PredType& NATIVE_LLONG;
-	static const PredType& NATIVE_ULLONG;
-	static const PredType& NATIVE_FLOAT;
-	static const PredType& NATIVE_DOUBLE;
-	static const PredType& NATIVE_LDOUBLE;
-	static const PredType& NATIVE_B8;
-	static const PredType& NATIVE_B16;
-	static const PredType& NATIVE_B32;
-	static const PredType& NATIVE_B64;
-	static const PredType& NATIVE_OPAQUE;
-	static const PredType& NATIVE_HSIZE;
-	static const PredType& NATIVE_HSSIZE;
-	static const PredType& NATIVE_HERR;
-	static const PredType& NATIVE_HBOOL;
-
-	static const PredType& NATIVE_INT8;
-	static const PredType& NATIVE_UINT8;
-	static const PredType& NATIVE_INT16;
-	static const PredType& NATIVE_UINT16;
-	static const PredType& NATIVE_INT32;
-	static const PredType& NATIVE_UINT32;
-	static const PredType& NATIVE_INT64;
-	static const PredType& NATIVE_UINT64;
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("PredType"); }
+
+        // Makes a copy of the predefined type and stores the new
+        // id in the left hand side object.
+        PredType& operator=(const PredType& rhs);
+
+        // Copy constructor - makes copy of the original object
+        PredType(const PredType& original);
+
+        // Noop destructor
+        virtual ~PredType();
+
+        /*! \brief This dummy function do not inherit from DataType - it will
+            throw a DataTypeIException if invoked.
+        */
+        void commit(H5Location& loc, const H5std_string& name);
+        /*! \brief This dummy function do not inherit from DataType - it will
+            throw a DataTypeIException if invoked.
+        */
+        void commit(H5Location& loc, const char* name);
+        /*! \brief This dummy function do not inherit from DataType - it will
+            throw a DataTypeIException if invoked.
+        */
+        bool committed();
+
+        ///\brief PredType constants
+        static const PredType& STD_I8BE;
+        static const PredType& STD_I8LE;
+        static const PredType& STD_I16BE;
+        static const PredType& STD_I16LE;
+        static const PredType& STD_I32BE;
+        static const PredType& STD_I32LE;
+        static const PredType& STD_I64BE;
+        static const PredType& STD_I64LE;
+        static const PredType& STD_U8BE;
+        static const PredType& STD_U8LE;
+        static const PredType& STD_U16BE;
+        static const PredType& STD_U16LE;
+        static const PredType& STD_U32BE;
+        static const PredType& STD_U32LE;
+        static const PredType& STD_U64BE;
+        static const PredType& STD_U64LE;
+        static const PredType& STD_B8BE;
+        static const PredType& STD_B8LE;
+        static const PredType& STD_B16BE;
+        static const PredType& STD_B16LE;
+        static const PredType& STD_B32BE;
+        static const PredType& STD_B32LE;
+        static const PredType& STD_B64BE;
+        static const PredType& STD_B64LE;
+        static const PredType& STD_REF_OBJ;
+        static const PredType& STD_REF_DSETREG;
+
+        static const PredType& C_S1;
+        static const PredType& FORTRAN_S1;
+
+        static const PredType& IEEE_F32BE;
+        static const PredType& IEEE_F32LE;
+        static const PredType& IEEE_F64BE;
+        static const PredType& IEEE_F64LE;
+
+        static const PredType& UNIX_D32BE;
+        static const PredType& UNIX_D32LE;
+        static const PredType& UNIX_D64BE;
+        static const PredType& UNIX_D64LE;
+
+        static const PredType& INTEL_I8;
+        static const PredType& INTEL_I16;
+        static const PredType& INTEL_I32;
+        static const PredType& INTEL_I64;
+        static const PredType& INTEL_U8;
+        static const PredType& INTEL_U16;
+        static const PredType& INTEL_U32;
+        static const PredType& INTEL_U64;
+        static const PredType& INTEL_B8;
+        static const PredType& INTEL_B16;
+        static const PredType& INTEL_B32;
+        static const PredType& INTEL_B64;
+        static const PredType& INTEL_F32;
+        static const PredType& INTEL_F64;
+
+        static const PredType& ALPHA_I8;
+        static const PredType& ALPHA_I16;
+        static const PredType& ALPHA_I32;
+        static const PredType& ALPHA_I64;
+        static const PredType& ALPHA_U8;
+        static const PredType& ALPHA_U16;
+        static const PredType& ALPHA_U32;
+        static const PredType& ALPHA_U64;
+        static const PredType& ALPHA_B8;
+        static const PredType& ALPHA_B16;
+        static const PredType& ALPHA_B32;
+        static const PredType& ALPHA_B64;
+        static const PredType& ALPHA_F32;
+        static const PredType& ALPHA_F64;
+
+        static const PredType& MIPS_I8;
+        static const PredType& MIPS_I16;
+        static const PredType& MIPS_I32;
+        static const PredType& MIPS_I64;
+        static const PredType& MIPS_U8;
+        static const PredType& MIPS_U16;
+        static const PredType& MIPS_U32;
+        static const PredType& MIPS_U64;
+        static const PredType& MIPS_B8;
+        static const PredType& MIPS_B16;
+        static const PredType& MIPS_B32;
+        static const PredType& MIPS_B64;
+        static const PredType& MIPS_F32;
+        static const PredType& MIPS_F64;
+
+        static const PredType& NATIVE_CHAR;
+        static const PredType& NATIVE_SCHAR;
+        static const PredType& NATIVE_UCHAR;
+        static const PredType& NATIVE_SHORT;
+        static const PredType& NATIVE_USHORT;
+        static const PredType& NATIVE_INT;
+        static const PredType& NATIVE_UINT;
+        static const PredType& NATIVE_LONG;
+        static const PredType& NATIVE_ULONG;
+        static const PredType& NATIVE_LLONG;
+        static const PredType& NATIVE_ULLONG;
+        static const PredType& NATIVE_FLOAT;
+        static const PredType& NATIVE_DOUBLE;
+        static const PredType& NATIVE_LDOUBLE;
+        static const PredType& NATIVE_B8;
+        static const PredType& NATIVE_B16;
+        static const PredType& NATIVE_B32;
+        static const PredType& NATIVE_B64;
+        static const PredType& NATIVE_OPAQUE;
+        static const PredType& NATIVE_HSIZE;
+        static const PredType& NATIVE_HSSIZE;
+        static const PredType& NATIVE_HERR;
+        static const PredType& NATIVE_HBOOL;
+
+        static const PredType& NATIVE_INT8;
+        static const PredType& NATIVE_UINT8;
+        static const PredType& NATIVE_INT16;
+        static const PredType& NATIVE_UINT16;
+        static const PredType& NATIVE_INT32;
+        static const PredType& NATIVE_UINT32;
+        static const PredType& NATIVE_INT64;
+        static const PredType& NATIVE_UINT64;
 
 // LEAST types
 #if H5_SIZEOF_INT_LEAST8_T != 0
-	static const PredType& NATIVE_INT_LEAST8;
+        static const PredType& NATIVE_INT_LEAST8;
 #endif /* H5_SIZEOF_INT_LEAST8_T */
 #if H5_SIZEOF_UINT_LEAST8_T != 0
-	static const PredType& NATIVE_UINT_LEAST8;
+        static const PredType& NATIVE_UINT_LEAST8;
 #endif /* H5_SIZEOF_UINT_LEAST8_T */
 
 #if H5_SIZEOF_INT_LEAST16_T != 0
-	static const PredType& NATIVE_INT_LEAST16;
+        static const PredType& NATIVE_INT_LEAST16;
 #endif /* H5_SIZEOF_INT_LEAST16_T */
 #if H5_SIZEOF_UINT_LEAST16_T != 0
-	static const PredType& NATIVE_UINT_LEAST16;
+        static const PredType& NATIVE_UINT_LEAST16;
 #endif /* H5_SIZEOF_UINT_LEAST16_T */
 
 #if H5_SIZEOF_INT_LEAST32_T != 0
-	static const PredType& NATIVE_INT_LEAST32;
+        static const PredType& NATIVE_INT_LEAST32;
 #endif /* H5_SIZEOF_INT_LEAST32_T */
 #if H5_SIZEOF_UINT_LEAST32_T != 0
-	static const PredType& NATIVE_UINT_LEAST32;
+        static const PredType& NATIVE_UINT_LEAST32;
 #endif /* H5_SIZEOF_UINT_LEAST32_T */
 
 #if H5_SIZEOF_INT_LEAST64_T != 0
-	static const PredType& NATIVE_INT_LEAST64;
+        static const PredType& NATIVE_INT_LEAST64;
 #endif /* H5_SIZEOF_INT_LEAST64_T */
 #if H5_SIZEOF_UINT_LEAST64_T != 0
-	static const PredType& NATIVE_UINT_LEAST64;
+        static const PredType& NATIVE_UINT_LEAST64;
 #endif /* H5_SIZEOF_UINT_LEAST64_T */
 
 // FAST types
 #if H5_SIZEOF_INT_FAST8_T != 0
-	static const PredType& NATIVE_INT_FAST8;
+        static const PredType& NATIVE_INT_FAST8;
 #endif /* H5_SIZEOF_INT_FAST8_T */
 #if H5_SIZEOF_UINT_FAST8_T != 0
-	static const PredType& NATIVE_UINT_FAST8;
+        static const PredType& NATIVE_UINT_FAST8;
 #endif /* H5_SIZEOF_UINT_FAST8_T */
 
 #if H5_SIZEOF_INT_FAST16_T != 0
-	static const PredType& NATIVE_INT_FAST16;
+        static const PredType& NATIVE_INT_FAST16;
 #endif /* H5_SIZEOF_INT_FAST16_T */
 #if H5_SIZEOF_UINT_FAST16_T != 0
-	static const PredType& NATIVE_UINT_FAST16;
+        static const PredType& NATIVE_UINT_FAST16;
 #endif /* H5_SIZEOF_UINT_FAST16_T */
 
 #if H5_SIZEOF_INT_FAST32_T != 0
-	static const PredType& NATIVE_INT_FAST32;
+        static const PredType& NATIVE_INT_FAST32;
 #endif /* H5_SIZEOF_INT_FAST32_T */
 #if H5_SIZEOF_UINT_FAST32_T != 0
-	static const PredType& NATIVE_UINT_FAST32;
+        static const PredType& NATIVE_UINT_FAST32;
 #endif /* H5_SIZEOF_UINT_FAST32_T */
 
 #if H5_SIZEOF_INT_FAST64_T != 0
-	static const PredType& NATIVE_INT_FAST64;
+        static const PredType& NATIVE_INT_FAST64;
 #endif /* H5_SIZEOF_INT_FAST64_T */
 #if H5_SIZEOF_UINT_FAST64_T != 0
-	static const PredType& NATIVE_UINT_FAST64;
+        static const PredType& NATIVE_UINT_FAST64;
 #endif /* H5_SIZEOF_UINT_FAST64_T */
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -242,11 +239,11 @@ class H5_DLLCPP PredType : public AtomType {
         static const PredType& PREDTYPE_CONST; // dummy constant
 
    protected:
-	// Default constructor
-	PredType();
+        // Default constructor
+        PredType();
 
-	// Creates a pre-defined type using an HDF5 pre-defined constant
-	PredType( const hid_t predtype_id );  // used by the library only
+        // Creates a pre-defined type using an HDF5 pre-defined constant
+        PredType(const hid_t predtype_id);  // used by the library only
 
    private:
         // Activates the creation of the PredType global constants
@@ -438,8 +435,7 @@ class H5_DLLCPP PredType : public AtomType {
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of PredType
+} // namespace H5
+
 #endif // __H5PredType_H
diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp
index b954191..dd7b21a 100644
--- a/c++/src/H5PropList.cpp
+++ b/c++/src/H5PropList.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
@@ -21,20 +19,16 @@
 
 #include <string>
 
+#include "H5private.h"        // for HDmemset
 #include "H5Include.h"
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5private.h"		// for HDfree
 
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#ifndef H5_NO_STD
     using std::cerr;
     using std::endl;
-#endif  // H5_NO_STD
-#endif
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 // This DOXYGEN_SHOULD_SKIP_THIS block is a work-around approach to control
@@ -46,7 +40,7 @@ PropList* PropList::DEFAULT_ = 0;
 
 //--------------------------------------------------------------------------
 // Function:    PropList::getConstant
-// Purpose:     Creates a PropList object representing the HDF5 constant
+// Purpose      Creates a PropList object representing the HDF5 constant
 //              H5P_DEFAULT, pointed to by PropList::DEFAULT_.
 // Exception    H5::PropListIException
 // Description
@@ -75,7 +69,7 @@ PropList* PropList::getConstant()
 
 //--------------------------------------------------------------------------
 // Function:    PropList::deleteConstants
-// Purpose:     Deletes the constant object that PropList::DEFAULT_ points to.
+// Purpose      Deletes the constant object that PropList::DEFAULT_ points to.
 // Programmer   Binh-Minh Ribler - 2015
 //--------------------------------------------------------------------------
 void PropList::deleteConstants()
@@ -85,24 +79,24 @@ void PropList::deleteConstants()
 }
 
 //--------------------------------------------------------------------------
-// Purpose	Constant for default property.
+// Purpose      Constant for default property.
 //--------------------------------------------------------------------------
 const PropList& PropList::DEFAULT = *getConstant();
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function	Default constructor
-///\brief	Default constructor: creates a stub property list object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    Default constructor
+///\brief       Default constructor: creates a stub property list object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PropList::PropList() : IdComponent(), id(H5P_DEFAULT) {}
 
 //--------------------------------------------------------------------------
-// Function:	PropList copy constructor
-///\brief	Copy constructor
-///\param	original - IN: The original property list to copy
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PropList copy constructor
+///\brief       Copy constructor
+///\param       original - IN: The original property list to copy
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 PropList::PropList(const PropList& original) : IdComponent(), id(original.id)
 {
@@ -110,166 +104,166 @@ PropList::PropList(const PropList& original) : IdComponent(), id(original.id)
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList overloaded constructor
-///\brief	Creates a property list using the id of an existing property.
-///\param	plist_id - IN: Id of the existing property list
-///\exception	H5::PropListIException
+// Function:    PropList overloaded constructor
+///\brief       Creates a property list using the id of an existing property.
+///\param       plist_id - IN: Id of the existing property list
+///\exception   H5::PropListIException
 // Description
-//		This function creates a new property list if a property
-//		class is provided or makes a copy of a property list if one
-//		is given.  If the given id is anything else, then set this
-//		property's id to H5P_DEFAULT.
-// Programmer	Binh-Minh Ribler - 2000
+//              This function creates a new property list if a property
+//              class is provided or makes a copy of a property list if one
+//              is given.  If the given id is anything else, then set this
+//              property's id to H5P_DEFAULT.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-PropList::PropList( const hid_t plist_id ) : IdComponent()
+PropList::PropList(const hid_t plist_id) : IdComponent()
 {
     if (plist_id <= 0)
-	id = H5P_DEFAULT;
+        id = H5P_DEFAULT;
 
     H5I_type_t id_type = H5Iget_type(plist_id);
     switch (id_type) {
-	case H5I_GENPROP_CLS:
-	  // call C routine to create a new property from the given prop class
-	  id = H5Pcreate(plist_id);
-	  if( id < 0 )
-	  {
-	      throw PropListIException("PropList constructor", "H5Pcreate failed");
-	  }
-	  break;
-	case H5I_GENPROP_LST:
-	  // call C routine to make a copy of the given property list
-	  id = H5Pcopy(plist_id);
-	  if( id < 0 )
-	  {
-	      throw PropListIException("PropList constructor", "H5Pcopy failed");
-	  }
-	  break;
-	default:
-	  id = H5P_DEFAULT;
-	  break;
+        case H5I_GENPROP_CLS:
+          // call C routine to create a new property from the given prop class
+          id = H5Pcreate(plist_id);
+          if (id < 0)
+          {
+              throw PropListIException("PropList constructor", "H5Pcreate failed");
+          }
+          break;
+        case H5I_GENPROP_LST:
+          // call C routine to make a copy of the given property list
+          id = H5Pcopy(plist_id);
+          if (id < 0)
+          {
+              throw PropListIException("PropList constructor", "H5Pcopy failed");
+          }
+          break;
+        default:
+          id = H5P_DEFAULT;
+          break;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::copy
-///\brief	Makes a copy of an existing property list.
-///\param	like_plist - IN: Reference to the existing property list
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PropList::copy
+///\brief       Makes a copy of an existing property list.
+///\param       like_plist - IN: Reference to the existing property list
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
-void PropList::copy( const PropList& like_plist )
+void PropList::copy(const PropList& like_plist)
 {
     // If this object is representing an hdf5 object, close it before
     // copying like_plist to it
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	throw PropListIException(inMemFunc("copy"), close_error.getDetailMsg());
+    catch (Exception& close_error) {
+        throw PropListIException(inMemFunc("copy"), close_error.getDetailMsg());
     }
 
     // call C routine to copy the property list
-    id = H5Pcopy( like_plist.getId() );
-    if( id < 0 )
-	throw PropListIException(inMemFunc("copy"), "H5Pcopy failed");
+    id = H5Pcopy(like_plist.getId());
+    if (id < 0)
+        throw PropListIException(inMemFunc("copy"), "H5Pcopy failed");
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::operator=
-///\brief	Assignment operator.
-///\param	rhs - IN: Reference to the existing property list
-///\return	Reference to PropList instance
-///\exception	H5::PropListIException
+// Function:    PropList::operator=
+///\brief       Assignment operator.
+///\param       rhs - IN: Reference to the existing property list
+///\return      Reference to PropList instance
+///\exception   H5::PropListIException
 // Description
-//		Makes a copy of the property list on the right hand side
-//		and stores the new id in the left hand side object.
-// Programmer	Binh-Minh Ribler - 2000
+//              Makes a copy of the property list on the right hand side
+//              and stores the new id in the left hand side object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-PropList& PropList::operator=( const PropList& rhs )
+PropList& PropList::operator=(const PropList& rhs)
 {
     if (this != &rhs)
-	copy(rhs);
+        copy(rhs);
     return(*this);
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::copyProp
-///\brief	Copies a property from this property list or class to another
-///\param	dest - IN: Destination property list or class
-///\param	name - IN: Name of the property to copy - \c char pointer
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    PropList::copyProp
+///\brief       Copies a property from this property list or class to another
+///\param       dest - IN: Destination property list or class
+///\param       name - IN: Name of the property to copy - \c char pointer
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
 void PropList::copyProp(PropList& dest, const char *name) const
 {
-   hid_t dst_id = dest.getId();
-   herr_t ret_value = H5Pcopy_prop(dst_id, id, name);
-   if( ret_value < 0 )
-   {
-      throw PropListIException(inMemFunc("copyProp"), "H5Pcopy_prop failed");
-   }
+    hid_t dst_id = dest.getId();
+    herr_t ret_value = H5Pcopy_prop(dst_id, id, name);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("copyProp"), "H5Pcopy_prop failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::copyProp
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	dest - IN: Destination property list or class
-///\param	name - IN: Name of the property to copy - \c H5std_string
-// Programmer	Binh-Minh Ribler - Jul, 2005
+// Function:    PropList::copyProp
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       dest - IN: Destination property list or class
+///\param       name - IN: Name of the property to copy - \c H5std_string
+// Programmer   Binh-Minh Ribler - Jul, 2005
 //--------------------------------------------------------------------------
-void PropList::copyProp( PropList& dest, const H5std_string& name ) const
+void PropList::copyProp(PropList& dest, const H5std_string& name) const
 {
-   copyProp( dest, name.c_str());
+    copyProp(dest, name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::copyProp
-///\brief	Copies a property from one list or class to another - Obsolete
-///\param	dest - IN: Destination property list or class
-///\param	src  - IN: Source property list or class
-///\param	name - IN: Name of the property to copy - \c char pointer
-///\note	This member function will be removed in the next release
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PropList::copyProp
+///\brief       Copies a property from one list or class to another - Obsolete
+///\param       dest - IN: Destination property list or class
+///\param       src  - IN: Source property list or class
+///\param       name - IN: Name of the property to copy - \c char pointer
+///\note        This member function will be removed in the next release
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void PropList::copyProp( PropList& dest, PropList& src, const char *name ) const
+void PropList::copyProp(PropList& dest, PropList& src, const char *name) const
 {
-   hid_t dst_id = dest.getId();
-   hid_t src_id = src.getId();
-   herr_t ret_value = H5Pcopy_prop(dst_id, src_id, name);
-   if( ret_value < 0 )
-   {
-      throw PropListIException(inMemFunc("copyProp"), "H5Pcopy_prop failed");
-   }
+    hid_t dst_id = dest.getId();
+    hid_t src_id = src.getId();
+    herr_t ret_value = H5Pcopy_prop(dst_id, src_id, name);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("copyProp"), "H5Pcopy_prop failed");
+    }
 
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::copyProp
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts. - Obsolete
-///\param	dest - IN: Destination property list or class
-///\param	src  - IN: Source property list or class
-///\param	name - IN: Name of the property to copy - \c H5std_string
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PropList::copyProp
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts. - Obsolete
+///\param       dest - IN: Destination property list or class
+///\param       src  - IN: Source property list or class
+///\param       name - IN: Name of the property to copy - \c H5std_string
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void PropList::copyProp( PropList& dest, PropList& src, const H5std_string& name ) const
+void PropList::copyProp(PropList& dest, PropList& src, const H5std_string& name) const
 {
-   copyProp( dest, src, name.c_str());
+    copyProp(dest, src, name.c_str());
 }
 
 //--------------------------------------------------------------------------
 // Function:    PropList::getId
-///\brief	Get the id of this property list
-///\return	Property list identifier
+///\brief       Get the id of this property list
+///\return      Property list identifier
 // Description:
 //              Class hierarchy is revised to address bugzilla 1068.  Class
 //              AbstractDS and Attribute are moved out of H5Object.  In
@@ -279,7 +273,7 @@ void PropList::copyProp( PropList& dest, PropList& src, const H5std_string& name
 //--------------------------------------------------------------------------
 hid_t PropList::getId() const
 {
-   return(id);
+    return(id);
 }
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -301,7 +295,7 @@ void PropList::p_setId(const hid_t new_id)
     try {
         close();
     }
-    catch (Exception close_error) {
+    catch (Exception& close_error) {
         throw PropListIException(inMemFunc("p_setId"), close_error.getDetailMsg());
     }
    // reset object's id to the given id
@@ -311,447 +305,501 @@ void PropList::p_setId(const hid_t new_id)
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
-// Function:	PropList::close
-///\brief	Closes the property list if it is not a default one.
+// Function:    PropList::close
+///\brief       Closes the property list if it is not a default one.
 ///
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - Mar 9, 2005
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - Mar 9, 2005
 //--------------------------------------------------------------------------
 void PropList::close()
 {
     if (p_valid_id(id))
     {
-	herr_t ret_value = H5Pclose( id );
-	if( ret_value < 0 )
-	{
-	    throw PropListIException(inMemFunc("close"), "H5Pclose failed");
-	}
-	// reset the id
-	id = H5I_INVALID_HID;
+        herr_t ret_value = H5Pclose(id);
+        if (ret_value < 0)
+        {
+            throw PropListIException(inMemFunc("close"), "H5Pclose failed");
+        }
+        // reset the id
+        id = H5I_INVALID_HID;
     }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::getClass
-///\brief	Returns the class of this property list, i.e. \c H5P_FILE_CREATE...
-///\return	The property list class if it is not equal to \c H5P_ROOT
-///\exception	H5::PropListIException
-// Programmer	Binh-Minh Ribler - April, 2004
+// Function:    PropList::getClass
+///\brief       Returns the class of this property list, i.e. \c H5P_FILE_CREATE...
+///\return      The property list class if it is not equal to \c H5P_ROOT
+///\exception   H5::PropListIException
+// Programmer   Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 hid_t PropList::getClass() const
 {
-   hid_t plist_class = H5Pget_class( id );
-   if( plist_class == H5P_ROOT )
-   {
-      throw PropListIException(inMemFunc("getClass"),
-		"H5Pget_class failed - returned H5P_ROOT");
-   }
-   return( plist_class );
+    hid_t plist_class = H5Pget_class(id);
+    if (plist_class == H5P_ROOT)
+    {
+        throw PropListIException(inMemFunc("getClass"),
+            "H5Pget_class failed - returned H5P_ROOT");
+    }
+   return(plist_class);
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::propExist
-///\brief	Query the existance of a property in a property object.
-///\param	name - IN: Name of property to check for - \c char pointer
-///\return	true if the property exists in the property object, and
-///		false, otherwise.
-///\exception	H5::PropListIException
+// Function:    PropList::propExist
+///\brief       Queries the existence of a property in a property object.
+///\param       name - IN: Name of property to check for - \c char pointer
+///\return      true if the property exists in the property object, and
+///             false, otherwise.
+///\exception   H5::PropListIException
 ///\par Description
-///		This routine checks if a property exists within a property
-///		list or class.
+///             This routine checks if a property exists within a property
+///             list or class.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-bool PropList::propExist(const char* name ) const
-{
-   // Calls C routine H5Pexist to determine whether a property exists
-   // within a property list or class.  It returns a positive value, 0,
-   // or a negative value
-   htri_t ret_value = H5Pexist(id, name);
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else // Raise exception when H5Pexist returns a negative value
-   {
-      throw PropListIException(inMemFunc("propExist"), "H5Pexist failed");
-   }
-}
-//--------------------------------------------------------------------------
-// Function:	PropList::propExist
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name - IN: Name of property to check for - \c H5std_string
+bool PropList::propExist(const char* name) const
+{
+    // Calls C routine H5Pexist to determine whether a property exists
+    // within a property list or class.  It returns a positive value, 0,
+    // or a negative value
+    htri_t ret_value = H5Pexist(id, name);
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Pexist returns a negative value
+    {
+        throw PropListIException(inMemFunc("propExist"), "H5Pexist failed");
+    }
+}
+//--------------------------------------------------------------------------
+// Function:    PropList::propExist
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name - IN: Name of property to check for - \c H5std_string
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
-bool PropList::propExist(const H5std_string& name ) const
+bool PropList::propExist(const H5std_string& name) const
 {
-   return( propExist( name.c_str()) );
+    return(propExist( name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::closeClass
-///\brief	Close a property list class.
+// Function:    PropList::closeClass
+///\brief       Close a property list class.
 ///
-///\exception	H5::PropListIException
+///\exception   H5::PropListIException
 ///\par Description
-///		Releases memory and detaches a class from the property
-///		list class hierarchy.
+///             Releases memory and detaches a class from the property
+///             list class hierarchy.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::closeClass() const
 {
-   herr_t ret_value = H5Pclose_class(id);
-   if( ret_value < 0 )
-   {
-      throw PropListIException(inMemFunc("closeClass"), "H5Pclose_class failed");
-   }
+    herr_t ret_value = H5Pclose_class(id);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("closeClass"), "H5Pclose_class failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::getProperty
-///\brief	Query the value of a property in a property list.
-///\param	name -   IN: Name of property to query - \c char pointer
-///\param	value - OUT: Pointer to the buffer for the property value
-///\exception	H5::PropListIException
+// Function:    PropList::getProperty
+///\brief       Query the value of a property in a property list.
+///\param       name -   IN: Name of property to query - \c char pointer
+///\param       value - OUT: Pointer to the buffer for the property value
+///\exception   H5::PropListIException
 ///\par Description
-///		Retrieves a copy of the value for a property in a property
-///		list.  The property name must exist or this routine will
-///		throw an exception.
+///             Retrieves a copy of the value for a property in a property
+///             list.  The property name must exist or this routine will
+///             throw an exception.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::getProperty(const char* name, void* value) const
 {
-   herr_t ret_value = H5Pget(id, name, value);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("getProperty"), "H5Pget failed");
-   }
+    herr_t ret_value = H5Pget(id, name, value);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("getProperty"), "H5Pget failed");
+    }
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::getProperty
-///\brief	This is an overloaded member function, provided for convenience.
-///   		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name -  IN: Name of property to query - \c char pointer
-///\return	The property that is a \c H5std_string.
-///\exception	H5::PropListIException
+// Function:    PropList::getProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name -  IN: Name of property to query - \c char pointer
+///\return      The property that is a \c H5std_string.
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 H5std_string PropList::getProperty(const char* name) const
 {
-   // Get property size first
-   size_t size = getPropSize(name);
+    // Get property size first
+    size_t size = getPropSize(name);
 
-   // Allocate buffer then get the property
-   char* prop_strg_C = new char[size+1];  // temporary C-string for C API
-   HDmemset(prop_strg_C, 0, size+1); // clear buffer
+    // Allocate buffer then get the property
+    char* prop_strg_C = new char[size+1];  // temporary C-string for C API
+    HDmemset(prop_strg_C, 0, size+1); // clear buffer
 
-   herr_t ret_value = H5Pget(id, name, prop_strg_C); // call C API
+    herr_t ret_value = H5Pget(id, name, prop_strg_C); // call C API
 
-   // Throw exception if H5Pget returns failure
-   if (ret_value < 0)
-   {
+    // Throw exception if H5Pget returns failure
+    if (ret_value < 0)
+    {
       delete []prop_strg_C;
-      throw PropListIException(inMemFunc("getProperty"), "H5Pget failed");
-   }
+        throw PropListIException(inMemFunc("getProperty"), "H5Pget failed");
+    }
 
-   // Return propety value as a string after deleting temp C-string
-   H5std_string prop_strg(prop_strg_C);
-   delete []prop_strg_C;
-   return (prop_strg);
+    // Return propety value as a string after deleting temp C-string
+    H5std_string prop_strg(prop_strg_C);
+    delete []prop_strg_C;
+    return (prop_strg);
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::getProperty
-///\brief	This is an overloaded member function, provided for convenience.
-///   		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name -   IN: Name of property to query - \c H5std_string
-///\param	value - OUT: Pointer to the buffer for the property value
+// Function:    PropList::getProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name -   IN: Name of property to query - \c H5std_string
+///\param       value - OUT: Pointer to the buffer for the property value
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::getProperty(const H5std_string& name, void* value) const
 {
-   getProperty(name.c_str(), value);
+    getProperty(name.c_str(), value);
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::getProperty
-///\brief	This is an overloaded member function, provided for convenience.
-///   		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name -  IN: Name of property to query - \c H5std_string
-///\return	The property that is a \c H5std_string.
+// Function:    PropList::getProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name -  IN: Name of property to query - \c H5std_string
+///\return      The property that is a \c H5std_string.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 H5std_string PropList::getProperty(const H5std_string& name) const
 {
-   return (getProperty(name.c_str()));
+    return (getProperty(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::getPropSize
-///\brief	Query the size of a property in a property list or class.
-///\param	name - IN: Name of property to query
-///\return	Size of the property
-///\exception	H5::PropListIException
+// Function:    PropList::getPropSize
+///\brief       Query the size of a property in a property list or class.
+///\param       name - IN: Name of property to query
+///\return      Size of the property
+///\exception   H5::PropListIException
 ///\par Description
-///		This routine retrieves the size of a property's value
-///		in bytes.  Zero-sized properties are allowed and the return
-///		value will be of 0.  This function works for both property
-///		lists and classes.
+///             This routine retrieves the size of a property's value
+///             in bytes.  Zero-sized properties are allowed and the return
+///             value will be of 0.  This function works for both property
+///             lists and classes.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 size_t PropList::getPropSize(const char *name) const
 {
-   size_t prop_size;
-   herr_t ret_value = H5Pget_size(id, name, &prop_size);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("getPropSize"), "H5Pget_size failed");
-   }
-   return(prop_size);
+    size_t prop_size;
+    herr_t ret_value = H5Pget_size(id, name, &prop_size);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("getPropSize"), "H5Pget_size failed");
+    }
+    return(prop_size);
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::getPropSize
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name - IN: Name of property to query - \c H5std_string
+// Function:    PropList::getPropSize
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name - IN: Name of property to query - \c H5std_string
 ///
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 size_t PropList::getPropSize(const H5std_string& name) const
 {
-   return (getPropSize(name.c_str()));
+    return (getPropSize(name.c_str()));
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::getClassName
-///\brief	Return the name of a generic property list class.
-///\return	A string containing the class name, if success, otherwise,
-///		a NULL string.
+// Function:    PropList::getClassName
+///\brief       Return the name of a generic property list class.
+///\return      A string containing the class name, if success, otherwise,
+///             a NULL string.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 H5std_string PropList::getClassName() const
 {
-   char* temp_str;
-   temp_str = H5Pget_class_name(id); // this API specified that temp_str must
-				     // be freed.
-
-   if (temp_str != NULL)
-   {
-      H5std_string class_name(temp_str);
-      H5free_memory(temp_str);
-      return(class_name);
-   }
-   else
-      return 0;
+    char* temp_str;
+    temp_str = H5Pget_class_name(id);
+    if (temp_str != NULL)
+    {
+        H5std_string class_name(temp_str);
+        H5free_memory(temp_str);
+        return(class_name);
+    }
+    else
+        return 0;
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::getNumProps
-///\brief	Returns the number of properties in this property list or class.
-///\return	Size of the property.
-///\exception	H5::PropListIException
+// Function:    PropList::getNumProps
+///\brief       Returns the number of properties in this property list or class.
+///\return      Size of the property.
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 size_t PropList::getNumProps() const
 {
-   size_t nprops;
-   herr_t ret_value = H5Pget_nprops (id, &nprops);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("getNumProps"), "H5Pget_nprops failed");
-   }
-   return (nprops);
+    size_t nprops;
+    herr_t ret_value = H5Pget_nprops (id, &nprops);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("getNumProps"), "H5Pget_nprops failed");
+    }
+    return (nprops);
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::setProperty
-///\brief	Set a property's value in a property list.
-///\param	name  - IN: Name of property to set - \c char pointer
-///\param	value - IN: Void pointer to the value for the property
-///\exception	H5::PropListIException
+// Function:    PropList::setProperty
+///\brief       Set a property's value in a property list.
+///\param       name  - IN: Name of property to set - \c char pointer
+///\param       value - IN: Void pointer to the value for the property
+///\exception   H5::PropListIException
+// Description
+//              Revision svn r29815 changed 'value' to const, hence, deprecated
+//              the non-const setProperty.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
+void PropList::setProperty(const char* name, const void* value) const
+{
+    herr_t ret_value = H5Pset(id, name, value);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("setProperty"), "H5Pset failed");
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    PropList::setProperty
+///\brief       Deprecated due to missing const in prototype. (1.10.1)
+// Programmer:  Binh-Minh Ribler - March, 2017
+// Modification
+//              Planned for removal. -BMR, 2017/03/17 1.10.1
+//--------------------------------------------------------------------------
 void PropList::setProperty(const char* name, void* value) const
 {
-   herr_t ret_value = H5Pset(id, name, value);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("setProperty"), "H5Pset failed");
-   }
+    herr_t ret_value = H5Pset(id, name, value);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("setProperty"), "H5Pset failed");
+    }
 }
+
 //--------------------------------------------------------------------------
-// Function:	PropList::setProperty
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name    - IN: Name of property to set - \c char pointer
-///\param	charptr - IN: Char pointer to the value for the property
+// Function:    PropList::setProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name    - IN: Name of property to set - \c char pointer
+///\param       charptr - IN: Char pointer to the value for the property
+// Description
+//              Revision svn r29815 changed 'value' to const, hence, deprecated
+//              the non-const setProperty.
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::setProperty(const char* name, const char* charptr) const
 {
-   herr_t ret_value = H5Pset(id, name, (void*)charptr);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("setProperty"), "H5Pset failed");
-   }
+    herr_t ret_value = H5Pset(id, name, (const void*)charptr);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("setProperty"), "H5Pset failed");
+    }
 }
 //--------------------------------------------------------------------------
-// Function:	PropList::setProperty
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name - IN: Name of property to set - \c char pointer
-///\param	strg - IN: Value for the property is a \c H5std_string
+// Function:    PropList::setProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name - IN: Name of property to set - \c char pointer
+///\param       strg - IN: Value for the property is a \c H5std_string
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
+void PropList::setProperty(const char* name, const H5std_string& strg) const
+{
+    setProperty(name, strg.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    PropList::setProperty
+///\brief       Deprecated due to missing const in prototype. (1.10.1)
+// Programmer:  Binh-Minh Ribler - March, 2017
+// Modification
+//              Planned for removal. -BMR, 2017/03/17 1.10.1
+//--------------------------------------------------------------------------
 void PropList::setProperty(const char* name, H5std_string& strg) const
 {
-   setProperty(name, strg.c_str());
+    setProperty(name, strg.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::setProperty
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name  - IN: Name of property to set - \c H5std_string
-///\param	value - IN: Void pointer to the value for the property
+// Function:    PropList::setProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name  - IN: Name of property to set - \c H5std_string
+///\param       value - IN: Void pointer to the value for the property
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
+void PropList::setProperty(const H5std_string& name, const void* value) const
+{
+    setProperty(name.c_str(), value);
+}
+
+//--------------------------------------------------------------------------
+// Function:    PropList::setProperty
+///\brief       Deprecated due to missing const in prototype. (1.10.1)
+// Programmer:  Binh-Minh Ribler - March, 2017
+// Modification
+//              Planned for removal. -BMR, 2017/03/17 1.10.1
+//--------------------------------------------------------------------------
 void PropList::setProperty(const H5std_string& name, void* value) const
 {
-   setProperty(name.c_str(), value);
+    setProperty(name.c_str(), value);
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::setProperty
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name - IN: Name of property to set - \c H5std_string
-///\param	strg - IN: Value for the property is a \c H5std_string
+// Function:    PropList::setProperty
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name - IN: Name of property to set - \c H5std_string
+///\param       strg - IN: Value for the property is a \c H5std_string
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
+void PropList::setProperty(const H5std_string& name, const H5std_string& strg) const
+{
+    setProperty(name.c_str(), strg.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    PropList::setProperty
+///\brief       Deprecated due to missing const in prototype. (1.10.1)
+// Programmer:  Binh-Minh Ribler - March, 2017
+// Modification
+//              Planned for removal. -BMR, 2017/03/17 1.10.1
+//--------------------------------------------------------------------------
 void PropList::setProperty(const H5std_string& name, H5std_string& strg) const
 {
-   setProperty(name.c_str(), strg.c_str());
+    setProperty(name.c_str(), strg.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::isAClass
-///\brief	Determines whether a property list is a certain class.
-///\param	prop_class - IN: Property class to query
-///\return	true if the property list is a member of the property list
-///		class, and false, otherwise.
-///\exception	H5::PropListIException
+// Function:    PropList::isAClass
+///\brief       Determines whether a property list is a certain class.
+///\param       prop_class - IN: Property class to query
+///\return      true if the property list is a member of the property list
+///             class, and false, otherwise.
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 bool PropList::isAClass(const PropList& prop_class) const
 {
-   htri_t ret_value = H5Pisa_class(id, prop_class.getId());
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else // Raise exception when H5Pisa_class returns a negative value
-   {
-      throw PropListIException(inMemFunc("isAClass"), "H5Pisa_class failed");
-   }
-
+    htri_t ret_value = H5Pisa_class(id, prop_class.getId());
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Pisa_class returns a negative value
+    {
+        throw PropListIException(inMemFunc("isAClass"), "H5Pisa_class failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::removeProp
-///\brief	Removes a property from a property list.
-///\param	name - IN: Name of property to remove - \c char pointer
-///\exception	H5::PropListIException
+// Function:    PropList::removeProp
+///\brief       Removes a property from a property list.
+///\param       name - IN: Name of property to remove - \c char pointer
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::removeProp(const char *name) const
 {
-   herr_t ret_value = H5Premove(id, name);
-   if (ret_value < 0)
-   {
-      throw PropListIException(inMemFunc("removeProp"), "H5Premove failed");
-   }
+    herr_t ret_value = H5Premove(id, name);
+    if (ret_value < 0)
+    {
+        throw PropListIException(inMemFunc("removeProp"), "H5Premove failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::removeProp
-///\brief	This is an overloaded member function, provided for convenience.
-/// 		It differs from the above function only in what arguments it
-///		accepts.
-///\param	name - IN: Name of property to remove - \c H5std_string
+// Function:    PropList::removeProp
+///\brief       This is an overloaded member function, provided for convenience.
+///             It differs from the above function only in what arguments it
+///             accepts.
+///\param       name - IN: Name of property to remove - \c H5std_string
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 void PropList::removeProp(const H5std_string& name) const
 {
-   removeProp(name.c_str());
+    removeProp(name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::operator==
-///\brief	Compares this property list or class against the given list or class.
-///\param	rhs - IN: Reference to the property list to compare
-///\return	true if the property lists or classes are equal, and
-///		false, otherwise.
-///\exception	H5::PropListIException
+// Function:    PropList::operator==
+///\brief       Compares this property list or class against the given list or class.
+///\param       rhs - IN: Reference to the property list to compare
+///\return      true if the property lists or classes are equal, and
+///             false, otherwise.
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 bool PropList::operator==(const PropList& rhs) const
 {
-   htri_t ret_value = H5Pequal(id, rhs.getId());
-   if( ret_value > 0 )
-      return true;
-   else if( ret_value == 0 )
-      return false;
-   else // Raise exception when H5Pequal returns a negative value
-   {
-      throw PropListIException(inMemFunc("operator=="), "H5Pequal failed");
-   }
+    htri_t ret_value = H5Pequal(id, rhs.getId());
+    if (ret_value > 0)
+        return true;
+    else if (ret_value == 0)
+        return false;
+    else // Raise exception when H5Pequal returns a negative value
+    {
+        throw PropListIException(inMemFunc("operator=="), "H5Pequal failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList::getClassParent
-///\brief	Returns the parent class of a generic property class
-///\return	The parent class of a property class
-///\exception	H5::PropListIException
+// Function:    PropList::getClassParent
+///\brief       Returns the parent class of a generic property class
+///\return      The parent class of a property class
+///\exception   H5::PropListIException
 // Programmer:  Binh-Minh Ribler - April, 2004
 //--------------------------------------------------------------------------
 PropList PropList::getClassParent() const
 {
-   hid_t class_id = H5Pget_class_parent(id);
-   if (class_id < 0)
-   {
-      throw PropListIException(inMemFunc("getClassParent"), "H5Pget_class_parent failed");
-   }
-   PropList pclass(class_id);
-   return(pclass);
+    hid_t class_id = H5Pget_class_parent(id);
+    if (class_id < 0)
+    {
+        throw PropListIException(inMemFunc("getClassParent"), "H5Pget_class_parent failed");
+    }
+    PropList pclass(class_id);
+    return(pclass);
 }
 
 //--------------------------------------------------------------------------
-// Function:	PropList destructor
-///\brief	Properly terminates access to this property list.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    PropList destructor
+///\brief       Properly terminates access to this property list.
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		- Replaced resetIdComponent() with decRefCount() to use C
-//		library ID reference counting mechanism - BMR, Jun 1, 2004
-//		- Replaced decRefCount with close() to let the C library
-//		handle the reference counting - BMR, Jun 1, 2006
+//              - Replaced resetIdComponent() with decRefCount() to use C
+//              library ID reference counting mechanism - BMR, Jun 1, 2004
+//              - Replaced decRefCount with close() to let the C library
+//              handle the reference counting - BMR, Jun 1, 2006
 //--------------------------------------------------------------------------
 PropList::~PropList()
 {
     try {
-	close();
+        close();
     }
-    catch (Exception close_error) {
-	cerr << "PropList::~PropList - " << close_error.getDetailMsg() << endl;
+    catch (Exception& close_error) {
+        cerr << "PropList::~PropList - " << close_error.getDetailMsg() << endl;
     }
 }
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5PropList.h b/c++/src/H5PropList.h
index 7f6ee31..3ef365a 100644
--- a/c++/src/H5PropList.h
+++ b/c++/src/H5PropList.h
@@ -6,134 +6,137 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5PropList_H
 #define __H5PropList_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class PropList provides operations for generic property lists.
+/*! \class PropList
+    \brief Class PropList inherits from IdComponent and provides wrappers for
+    the HDF5 generic property list.
+*/
 class H5_DLLCPP PropList : public IdComponent {
    public:
-	///\brief Default property list
+        ///\brief Default property list
         static const PropList& DEFAULT;
 
-	// Creates a property list of a given type or creates a copy of an
-	// existing property list giving the property list id.
-	PropList(const hid_t plist_id);
+        // Creates a property list of a given type or creates a copy of an
+        // existing property list giving the property list id.
+        PropList(const hid_t plist_id);
 
-	// Make a copy of the given property list using assignment statement
-	PropList& operator=( const PropList& rhs );
+        // Make a copy of the given property list using assignment statement
+        PropList& operator=(const PropList& rhs);
 
-	// Compares this property list or class against the given list or class.
-	bool operator==(const PropList& rhs) const;
+        // Compares this property list or class against the given list or class.
+        bool operator==(const PropList& rhs) const;
 
-	// Close this property list.
-	virtual void close();
+        // Close this property list.
+        virtual void close();
 
-	// Close a property list class.
-	void closeClass() const;
+        // Close a property list class.
+        void closeClass() const;
 
-	// Makes a copy of the given property list.
-	void copy( const PropList& like_plist );
+        // Makes a copy of the given property list.
+        void copy(const PropList& like_plist);
 
-	// Copies a property from this property list or class to another
-	void copyProp( PropList& dest, const char* name) const;
-	void copyProp( PropList& dest, const H5std_string& name) const;
+        // Copies a property from this property list or class to another
+        void copyProp(PropList& dest, const char* name) const;
+        void copyProp(PropList& dest, const H5std_string& name) const;
 
-	// Copies a property from one property list or property class to another
-	void copyProp( PropList& dest, PropList& src, const char* name) const;
-	void copyProp( PropList& dest, PropList& src, const H5std_string& name) const;
+        // Copies a property from one property list or property class to another
+        void copyProp(PropList& dest, PropList& src, const char* name) const;
+        void copyProp(PropList& dest, PropList& src, const H5std_string& name) const;
 
-	// Gets the class of this property list, i.e. H5P_FILE_CREATE,
-	// H5P_FILE_ACCESS, ...
-	hid_t getClass() const;
+        // Gets the class of this property list, i.e. H5P_FILE_CREATE,
+        // H5P_FILE_ACCESS, ...
+        hid_t getClass() const;
 
-	// Return the name of a generic property list class.
-	H5std_string getClassName() const;
+        // Return the name of a generic property list class.
+        H5std_string getClassName() const;
 
-	// Returns the parent class of a generic property class.
-	PropList getClassParent() const;
+        // Returns the parent class of a generic property class.
+        PropList getClassParent() const;
 
-	// Returns the number of properties in this property list or class.
-	size_t getNumProps() const;
+        // Returns the number of properties in this property list or class.
+        size_t getNumProps() const;
 
-	// Query the value of a property in a property list.
-	void getProperty(const char* name, void* value) const;
-	void getProperty(const H5std_string& name, void* value) const;
-	H5std_string getProperty(const char* name) const;
-	H5std_string getProperty(const H5std_string& name) const;
+        // Query the value of a property in a property list.
+        void getProperty(const char* name, void* value) const;
+        void getProperty(const H5std_string& name, void* value) const;
+        H5std_string getProperty(const char* name) const;
+        H5std_string getProperty(const H5std_string& name) const;
 
-	// Set a property's value in a property list.
-	void setProperty(const char* name, void* value) const;
-	void setProperty(const char* name, const char* charptr) const;
-	void setProperty(const char* name, H5std_string& strg) const;
-	void setProperty(const H5std_string& name, void* value) const;
-	void setProperty(const H5std_string& name, H5std_string& strg) const;
+        // Set a property's value in a property list.
+        void setProperty(const char* name, const char* charptr) const;
+        void setProperty(const char* name, const void* value) const;
+        void setProperty(const char* name, const H5std_string& strg) const;
+        void setProperty(const H5std_string& name, const void* value) const;
+        void setProperty(const H5std_string& name, const H5std_string& strg) const;
+        // Deprecated after 1.10.1, missing const
+        void setProperty(const char* name, void* value) const;
+        void setProperty(const char* name, H5std_string& strg) const;
+        void setProperty(const H5std_string& name, void* value) const;
+        void setProperty(const H5std_string& name, H5std_string& strg) const;
 
-	// Query the size of a property in a property list or class.
-	size_t getPropSize(const char *name) const;
-	size_t getPropSize(const H5std_string& name) const;
+        // Query the size of a property in a property list or class.
+        size_t getPropSize(const char *name) const;
+        size_t getPropSize(const H5std_string& name) const;
 
-	// Determines whether a property list is a certain class.
-	bool isAClass(const PropList& prop_class) const;
+        // Determines whether a property list is a certain class.
+        bool isAClass(const PropList& prop_class) const;
 
-	/// Query the existance of a property in a property object.
-	bool propExist(const char* name) const;
-	bool propExist(const H5std_string& name) const;
+        /// Query the existance of a property in a property object.
+        bool propExist(const char* name) const;
+        bool propExist(const H5std_string& name) const;
 
-	// Removes a property from a property list.
-	void removeProp(const char *name) const;
-	void removeProp(const H5std_string& name) const;
+        // Removes a property from a property list.
+        void removeProp(const char *name) const;
+        void removeProp(const H5std_string& name) const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("PropList"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("PropList"); }
 
-	// Default constructor: creates a stub PropList object.
-	PropList();
+        // Default constructor: creates a stub PropList object.
+        PropList();
 
-	// Copy constructor: creates a copy of a PropList object.
-	PropList(const PropList& original);
+        // Copy constructor: creates a copy of a PropList object.
+        PropList(const PropList& original);
 
-	// Gets the property list id.
-	virtual hid_t getId() const;
+        // Gets the property list id.
+        virtual hid_t getId() const;
 
-	// Destructor: properly terminates access to this property list.
-	virtual ~PropList();
+        // Destructor: properly terminates access to this property list.
+        virtual ~PropList();
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
-	// Deletes the PropList global constant
-	static void deleteConstants();
+        // Deletes the PropList global constant
+        static void deleteConstants();
 
     protected:
-	hid_t id;	// HDF5 property list id
+        hid_t id;    // HDF5 property list id
 
-	// Sets the property list id.
-	virtual void p_setId(const hid_t new_id);
+        // Sets the property list id.
+        virtual void p_setId(const hid_t new_id);
 
     private:
-	static PropList* DEFAULT_;
+        static PropList* DEFAULT_;
 
-	// Dynamically allocates the PropList global constant
-	static PropList* getConstant();
+        // Dynamically allocates the PropList global constant
+        static PropList* getConstant();
 
-	// Friend function to set PropList id.  For library use only.
-	friend void f_PropList_setId(PropList* plist, hid_t new_id);
+        // Friend function to set PropList id.  For library use only.
+        friend void f_PropList_setId(PropList* plist, hid_t new_id);
 
 #endif // DOXYGEN_SHOULD_SKIP_THIS
-};
 
-#ifndef H5_NO_NAMESPACE
-}
-#endif
+}; // end of PropList
+} // namespace H5
+
 #endif  // __H5PropList_H
diff --git a/c++/src/H5StrType.cpp b/c++/src/H5StrType.cpp
index 3cfa342..d5fb744 100644
--- a/c++/src/H5StrType.cpp
+++ b/c++/src/H5StrType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,234 +17,267 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5DxferProp.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5AtomType.h"
 #include "H5AbstractDs.h"
-#include "H5DxferProp.h"
 #include "H5DataSpace.h"
 #include "H5StrType.h"
 #include "H5DataSet.h"
 #include "H5PredType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
 //--------------------------------------------------------------------------
-// Function:	StrType default constructor
-///\brief	Default constructor: Creates a stub string datatype
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType default constructor
+///\brief       Default constructor: Creates a stub string datatype
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 StrType::StrType() : AtomType() {}
 
 //--------------------------------------------------------------------------
-// Function:	StrType overloaded constructor
-///\brief	Creates a string datatype using a predefined type.
-///\param	pred_type - IN: Predefined datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType overloaded constructor
+///\brief       Creates a string datatype using a predefined type.
+///\param       pred_type - IN: Predefined datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType::StrType( const PredType& pred_type ) : AtomType()
+StrType::StrType(const PredType& pred_type) : AtomType()
 {
-   // use DataType::copy to make a copy of this predefined type
-   copy( pred_type );
+    // use DataType::copy to make a copy of this predefined type
+    copy(pred_type);
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType overloaded constructor
-// Purpose	Creates a string datatype with a specified length
-// Param 	pred_type - IN: String predefined type to replicate.
-// Param 	size	  - IN: Length of the new string type
-// Exception	H5::DataTypeIException
+// Function:    StrType overloaded constructor
+// Purpose      Creates a string datatype with a specified length
+// Param        pred_type - IN: String predefined type to replicate.
+// Param        size     - IN: Length of the new string type
+// Exception    H5::DataTypeIException
 // Description
-// 		The 1st argument could have been skipped, but this
-// 		constructor will collide with the one that takes an
-// 		existing id.
+//              The 1st argument could have been skipped, but this
+//              constructor will collide with the one that takes an
+//              existing id.
 //
-//		Update: replacing the 1st argument with a dummy 0 to
-//		avoid the clashing problem, that doesn't eliminate the
-//		the 1st argument but it's simpler for the user to type
-//		a '0' than PredType::C_S1.  - Dec 2, 2005
+//              Update: replacing the 1st argument with a dummy 0 to
+//              avoid the clashing problem, that doesn't eliminate the
+//              the 1st argument but it's simpler for the user to type
+//              a '0' than PredType::C_S1.  - Dec 2, 2005
 // Note
-//		The use of this constructor can be shortened by using
-//		its overloaded below as StrType(0, size).
-// Programmer	Binh-Minh Ribler - 2000
+//              The use of this constructor can be shortened by using
+//              its overloaded below as StrType(0, size).
+// Programmer   Binh-Minh Ribler - 2000
 // Modification
-//		Planned for removal. -BMR, 2005/12/02
-//		Removed from documentation. -BMR, 2016/03/07
+//              Planned for removal. -BMR, 2005/12/02
+//              Removed from documentation. -BMR, 2016/03/07
 //--------------------------------------------------------------------------
-StrType::StrType( const PredType& pred_type, const size_t& size ) : AtomType()
+StrType::StrType(const PredType& pred_type, const size_t& size) : AtomType()
 {
-   // use DataType::copy to make a copy of the string predefined type
-   // then set its length
-   copy(pred_type);
-   setSize(size);
+    // use DataType::copy to make a copy of the string predefined type
+    // then set its length
+    copy(pred_type);
+    setSize(size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType overloaded constructor
-///\brief	Creates a string datatype with a specified length
-///\param	dummy - IN: To simplify calling the previous constructor
-///			and avoid prototype clash with another constructor
-///\param	size  - IN: Length of the new string type
-///\exception	H5::DataTypeIException
+// Function:    StrType overloaded constructor
+///\brief       Creates a string datatype with a specified length
+///\param       dummy - IN: To simplify calling the previous constructor
+///                         and avoid prototype clash with another constructor
+///\param       size  - IN: Length of the new string type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		The 1st argument is just a dummy to simplify calling the
-///		previous constructor, such as:
-///		StrType atype(0, size) instead of
-///		StrType atype(PredType::C_S1, size)
+///             The 1st argument is just a dummy to simplify calling the
+///             previous constructor, such as:
+///             StrType atype(0, size) instead of
+///             StrType atype(PredType::C_S1, size)
 // Note
-//		This constructor replaced the previous one.
-// Programmer	Binh-Minh Ribler - Nov 28, 2005
+//              This constructor replaced the previous one.
+// Programmer   Binh-Minh Ribler - Nov 28, 2005
 //--------------------------------------------------------------------------
-StrType::StrType( const int dummy, const size_t& size ) : AtomType()
+StrType::StrType(const int dummy, const size_t& size) : AtomType()
 {
-   // use DataType::copy to make a copy of the string predefined type
-   // then set its length
-   copy(PredType::C_S1);
-   setSize(size);
+    // use DataType::copy to make a copy of the string predefined type
+    // then set its length
+    copy(PredType::C_S1);
+    setSize(size);
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType overloaded constructor
-///\brief	Creates an StrType object using the id of an existing datatype.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType overloaded constructor
+///\brief       Creates an StrType object using the id of an existing datatype.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType::StrType( const hid_t existing_id ) : AtomType( existing_id ) {}
+StrType::StrType(const hid_t existing_id) : AtomType( existing_id ) {}
 
 //--------------------------------------------------------------------------
-// Function:	StrType copy constructor
-///\brief	Copy constructor: makes a copy of the original StrType object.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType copy constructor
+///\brief       Copy constructor: makes a copy of the original StrType object.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType::StrType( const StrType& original ) : AtomType ( original ) {}
+StrType::StrType(const StrType& original) : AtomType ( original ) {}
 
 //--------------------------------------------------------------------------
-// Function:	StrType overloaded constructor
-///\brief	Gets the string datatype of the specified dataset
-///\param	dataset - IN: Dataset that this string datatype associates with
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType overloaded constructor
+///\brief       Gets the string datatype of the specified dataset
+///\param       dataset - IN: Dataset that this string datatype associates with
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-StrType::StrType( const DataSet& dataset ) : AtomType ()
+StrType::StrType(const DataSet& dataset) : AtomType ()
 {
-   // Calls C function H5Dget_type to get the id of the datatype
-   id = H5Dget_type( dataset.getId() );
+    // Calls C function H5Dget_type to get the id of the datatype
+    id = H5Dget_type(dataset.getId());
 
-   if( id < 0 )
-   {
-      throw DataSetIException("StrType constructor", "H5Dget_type failed");
-   }
+    if (id < 0)
+    {
+        throw DataSetIException("StrType constructor", "H5Dget_type failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType::getCset
-///\brief	Retrieves the character set type of this string datatype.
-///\return	Character set type, which can be:
-///		\li \c H5T_CSET_ASCII (0) - Character set is US ASCII.
+// Function:    StrType overloaded constructor
+///\brief       Creates an StrType instance by opening an HDF5 string datatype
+///             given its name, provided as a C character string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: String type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openStrType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+StrType::StrType(const H5Location& loc, const char *dtype_name) : AtomType()
+{
+    id = p_opentype(loc, dtype_name);
+}
+
+//--------------------------------------------------------------------------
+// Function:    StrType overloaded constructor
+///\brief       Creates an StrType instance by opening an HDF5 string datatype
+///             given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: String type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openStrType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+StrType::StrType(const H5Location& loc, const H5std_string& dtype_name) : AtomType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
+}
+
+//--------------------------------------------------------------------------
+// Function:    StrType::getCset
+///\brief       Retrieves the character set type of this string datatype.
+///\return      Character set type, which can be:
+///             \li \c H5T_CSET_ASCII (0) - Character set is US ASCII.
 ///\note
-///	ASCII and UTF-8 Unicode are the only currently supported character
-///	encodings. Extended ASCII encodings (for example, ISO 8859) are not
-///	supported. This encoding policy is not enforced by the HDF5 Library.
-///	Using encodings other than ASCII and UTF-8 can lead to compatibility
-///	and usability problems. See the C API entry H5Pset_char_encoding for
-///	more information.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+///     ASCII and UTF-8 Unicode are the only currently supported character
+///     encodings. Extended ASCII encodings (for example, ISO 8859) are not
+///     supported. This encoding policy is not enforced by the HDF5 Library.
+///     Using encodings other than ASCII and UTF-8 can lead to compatibility
+///     and usability problems. See the C API entry H5Pset_char_encoding for
+///     more information.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5T_cset_t StrType::getCset() const
 {
-   H5T_cset_t cset = H5Tget_cset( id );
-
-   // Returns a valid character set type if successful
-   if( cset == H5T_CSET_ERROR )
-   {
-      throw DataTypeIException("StrType::getCset", "H5Tget_cset failed");
-   }
-   return( cset );
+    H5T_cset_t cset = H5Tget_cset(id);
+
+    // Returns a valid character set type if successful
+    if (cset == H5T_CSET_ERROR)
+    {
+        throw DataTypeIException("StrType::getCset", "H5Tget_cset failed");
+    }
+    return(cset);
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType::setCset
-///\brief	Sets character set to be used.
-///\param	cset - IN: character set type, which can be:
-///		\li \c H5T_CSET_ASCII (0) - Character set is US ASCII.
+// Function:    StrType::setCset
+///\brief       Sets character set to be used.
+///\param       cset - IN: character set type, which can be:
+///             \li \c H5T_CSET_ASCII (0) - Character set is US ASCII.
 ///\note
-///	ASCII and UTF-8 Unicode are the only currently supported character
-///	encodings. Extended ASCII encodings (for example, ISO 8859) are not
-///	supported. This encoding policy is not enforced by the HDF5 Library.
-///	Using encodings other than ASCII and UTF-8 can lead to compatibility
-///	and usability problems. See the C API entry H5Pset_char_encoding for
-///	more information.
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
-//--------------------------------------------------------------------------
-void StrType::setCset( H5T_cset_t cset ) const
+///     ASCII and UTF-8 Unicode are the only currently supported character
+///     encodings. Extended ASCII encodings (for example, ISO 8859) are not
+///     supported. This encoding policy is not enforced by the HDF5 Library.
+///     Using encodings other than ASCII and UTF-8 can lead to compatibility
+///     and usability problems. See the C API entry H5Pset_char_encoding for
+///     more information.
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
+//--------------------------------------------------------------------------
+void StrType::setCset(H5T_cset_t cset) const
 {
-   herr_t ret_value = H5Tset_cset( id, cset );
-
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("StrType::setCset", "H5Tset_cset failed");
-   }
+    herr_t ret_value = H5Tset_cset(id, cset);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("StrType::setCset", "H5Tset_cset failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType::getStrpad
-///\brief	Retrieves the storage mechanism for of this string datatype.
-///\return	String storage mechanism, which can be:
-///		\li \c H5T_STR_NULLTERM (0) - Null terminate (as C does)
-///		\li \c H5T_STR_NULLPAD (0) - Pad with zeros
-///		\li \c H5T_STR_SPACEPAD (0) - pad with spaces (as FORTRAN does)
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType::getStrpad
+///\brief       Retrieves the storage mechanism for of this string datatype.
+///\return      String storage mechanism, which can be:
+///             \li \c H5T_STR_NULLTERM (0) - Null terminate (as C does)
+///             \li \c H5T_STR_NULLPAD (0) - Pad with zeros
+///             \li \c H5T_STR_SPACEPAD (0) - pad with spaces (as FORTRAN does)
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5T_str_t StrType::getStrpad() const
 {
-   H5T_str_t strpad = H5Tget_strpad( id );
-
-   // Returns a valid string padding type if successful
-   if( strpad == H5T_STR_ERROR )
-   {
-      throw DataTypeIException("StrType::getStrpad",
-		"H5Tget_strpad failed - returned H5T_STR_ERROR");
-   }
-   return( strpad );
+    H5T_str_t strpad = H5Tget_strpad(id);
+
+    // Returns a valid string padding type if successful
+    if (strpad == H5T_STR_ERROR)
+    {
+        throw DataTypeIException("StrType::getStrpad",
+            "H5Tget_strpad failed - returned H5T_STR_ERROR");
+    }
+    return(strpad);
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType::setStrpad
-///\brief	Defines the storage mechanism for this string datatype.
-///\param	strpad - IN: String padding type
-///\exception	H5::DataTypeIException
+// Function:    StrType::setStrpad
+///\brief       Defines the storage mechanism for this string datatype.
+///\param       strpad - IN: String padding type
+///\exception   H5::DataTypeIException
 ///\par Description
-///		For detail, please refer to the C layer Reference Manual at:
+///             For detail, please refer to the C layer Reference Manual at:
 /// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5T.html#Datatype-SetStrpad
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
-void StrType::setStrpad( H5T_str_t strpad ) const
+void StrType::setStrpad(H5T_str_t strpad) const
 {
-   herr_t ret_value = H5Tset_strpad( id, strpad );
-
-   if( ret_value < 0 )
-   {
-      throw DataTypeIException("StrType::setStrpad", "H5Tset_strpad failed");
-   }
+    herr_t ret_value = H5Tset_strpad(id, strpad);
+    if (ret_value < 0)
+    {
+        throw DataTypeIException("StrType::setStrpad", "H5Tset_strpad failed");
+    }
 }
 
 //--------------------------------------------------------------------------
-// Function:	StrType destructor
-///\brief	Properly terminates access to this string datatype.
-// Programmer	Binh-Minh Ribler - 2000
+// Function:    StrType destructor
+///\brief       Properly terminates access to this string datatype.
+// Programmer   Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 StrType::~StrType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5StrType.h b/c++/src/H5StrType.h
index 8b3a773..cc850fe 100644
--- a/c++/src/H5StrType.h
+++ b/c++/src/H5StrType.h
@@ -6,64 +6,68 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5StrType_H
 #define __H5StrType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! Class StrType operates on HDF5 string datatypes.
+/*! \class StrType
+    \brief StrType is derived from a DataType and operates on HDF5
+    string datatype.
+*/
+//  Inheritance: AtomType -> DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP StrType : public AtomType {
    public:
-	// Creates a string type using a predefined type
-	StrType(const PredType& pred_type);
+        // Creates a string type using a predefined type
+        StrType(const PredType& pred_type);
 
-	// Creates a string type with specified length - may be obsolete
-	StrType(const PredType& pred_type, const size_t& size);
+        // Creates a string type with specified length - may be obsolete
+        StrType(const PredType& pred_type, const size_t& size);
 
-	// Creates a string type with specified length
-	StrType(const int dummy, const size_t& size);
+        // Creates a string type with specified length
+        StrType(const int dummy, const size_t& size);
 
         // Gets the string datatype of the specified dataset
-	StrType(const DataSet& dataset);
+        StrType(const DataSet& dataset);
 
-	// Retrieves the character set type of this string datatype.
-	H5T_cset_t getCset() const;
+        // Constructors that open an HDF5 string datatype, given a location.
+        StrType(const H5Location& loc, const char* name);
+        StrType(const H5Location& loc, const H5std_string& name);
 
-	// Sets character set to be used.
-	void setCset(H5T_cset_t cset) const;
+        // Retrieves the character set type of this string datatype.
+        H5T_cset_t getCset() const;
 
-	// Retrieves the string padding method for this string datatype.
-	H5T_str_t getStrpad() const;
+        // Sets character set to be used.
+        void setCset(H5T_cset_t cset) const;
 
-	// Defines the storage mechanism for character strings.
-	void setStrpad(H5T_str_t strpad) const;
+        // Retrieves the string padding method for this string datatype.
+        H5T_str_t getStrpad() const;
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("StrType"); }
+        // Defines the storage mechanism for character strings.
+        void setStrpad(H5T_str_t strpad) const;
 
-	// default constructor
-	StrType();
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("StrType"); }
 
-	// Creates a string datatype using an existing id
-	StrType(const hid_t existing_id);
+        // default constructor
+        StrType();
 
-	// Copy constructor - makes a copy of the original object
-	StrType(const StrType& original);
+        // Creates a string datatype using an existing id
+        StrType(const hid_t existing_id);
+
+        // Copy constructor - makes a copy of the original object
+        StrType(const StrType& original);
+
+        // Noop destructor.
+        virtual ~StrType();
+
+}; // end of StrType
+} // namespace H5
 
-	// Noop destructor.
-	virtual ~StrType();
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5StrType_H
diff --git a/c++/src/H5VarLenType.cpp b/c++/src/H5VarLenType.cpp
index 2fab1f3..22e1a66 100644
--- a/c++/src/H5VarLenType.cpp
+++ b/c++/src/H5VarLenType.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string>
@@ -19,68 +17,102 @@
 #include "H5Exception.h"
 #include "H5IdComponent.h"
 #include "H5PropList.h"
-#include "H5Object.h"
 #include "H5OcreatProp.h"
 #include "H5DcreatProp.h"
-#include "H5CommonFG.h"
+#include "H5LaccProp.h"
+#include "H5Location.h"
+#include "H5Object.h"
 #include "H5DataType.h"
 #include "H5VarLenType.h"
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
-
 
 //--------------------------------------------------------------------------
-// Function:	VarLenType default constructor
-///\brief	Default constructor: Creates a stub variable-length datatype.
+// Function:    VarLenType default constructor
+///\brief       Default constructor: Creates a stub variable-length datatype.
 //--------------------------------------------------------------------------
 VarLenType::VarLenType() : DataType() {}
 
 //--------------------------------------------------------------------------
-// Function:	VarLenType overloaded constructor
-///\brief	Creates an VarLenType object using an existing id.
-///\param	existing_id - IN: Id of an existing datatype
-///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    VarLenType overloaded constructor
+///\brief       Creates an VarLenType object using an existing id.
+///\param       existing_id - IN: Id of an existing datatype
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 VarLenType::VarLenType(const hid_t existing_id) : DataType(existing_id) {}
 
 //--------------------------------------------------------------------------
-// Function:	VarLenType copy constructor
-///\brief	Copy constructor: makes a copy of the original VarLenType object.
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    VarLenType copy constructor
+///\brief       Copy constructor: makes a copy of the original VarLenType object.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 VarLenType::VarLenType(const VarLenType& original) : DataType(original) {}
 
 //--------------------------------------------------------------------------
-// Function:	VarLenType overloaded constructor
-///\brief	Creates a new variable-length datatype based on the specified
-///		\a base_type.
-///\param	base_type - IN: Pointer to existing datatype
-///\exception	H5::DataTypeIException
+// Function:    VarLenType overloaded constructor
+///\brief       Creates a new variable-length datatype based on the specified
+///             \a base_type.
+///\param       base_type - IN: Pointer to existing datatype
+///\exception   H5::DataTypeIException
 // Description
-//		DataType passed by pointer to avoid clashing with copy
-//		constructor.
-// Programmer	Binh-Minh Ribler - May, 2004
+//              DataType passed by pointer to avoid clashing with copy
+//              constructor.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 VarLenType::VarLenType(const DataType* base_type) : DataType()
 {
-   id = H5Tvlen_create(base_type->getId());
-   if (id < 0)
-   {
-      throw DataTypeIException("VarLenType constructor",
+    id = H5Tvlen_create(base_type->getId());
+    if (id < 0)
+    {
+        throw DataTypeIException("VarLenType constructor",
                 "H5Tvlen_create returns negative value");
-   }
+    }
+}
+
+//--------------------------------------------------------------------------
+// Function:    VarLenType overloaded constructor
+///\brief       Creates an VarLenType instance by opening an HDF5 variable
+///             length datatype given its name, provided as a C char*.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Variable length type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openVarLenType(const char*) to
+//              improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+VarLenType::VarLenType(const H5Location& loc, const char *dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name);
+}
+
+//--------------------------------------------------------------------------
+// Function:    VarLenType overloaded constructor
+///\brief       Creates an VarLenType instance by opening an HDF5 variable
+///             length datatype given its name, provided as an \c H5std_string.
+///\param       loc        - IN: Location of the type
+///\param       dtype_name - IN: Variable length type name
+///\exception   H5::DataTypeIException
+// Programmer   Binh-Minh Ribler - Dec 2016
+// Description
+//              In 1.10.1, this constructor was introduced and may replace the
+//              existing function CommonFG::openVarLenType(const H5std_string&)
+//              to improve usability.
+//              -BMR, Dec 2016
+//--------------------------------------------------------------------------
+VarLenType::VarLenType(const H5Location& loc, const H5std_string& dtype_name) : DataType()
+{
+    id = p_opentype(loc, dtype_name.c_str());
 }
 
 //--------------------------------------------------------------------------
-// Function:	VarLenType destructor
-///\brief	Properly terminates access to this datatype.
-// Programmer	Binh-Minh Ribler - May, 2004
+// Function:    VarLenType destructor
+///\brief       Properly terminates access to this datatype.
+// Programmer   Binh-Minh Ribler - May, 2004
 //--------------------------------------------------------------------------
 VarLenType::~VarLenType() {}
 
-#ifndef H5_NO_NAMESPACE
 } // end namespace
-#endif
diff --git a/c++/src/H5VarLenType.h b/c++/src/H5VarLenType.h
index 672b3db..7793cba 100644
--- a/c++/src/H5VarLenType.h
+++ b/c++/src/H5VarLenType.h
@@ -6,44 +6,48 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef __H5VarLenType_H
 #define __H5VarLenType_H
 
-#ifndef H5_NO_NAMESPACE
 namespace H5 {
-#endif
 
-//! VarLenType operates on the HDF5 C's Variable-length Datatypes.
+/*! \class VarLenType
+    \brief VarLenType is derived from a DataType and operates on HDF5
+    C's Variable-length Datatypes.
+*/
+//  Inheritance: DataType -> H5Object -> H5Location -> IdComponent
 class H5_DLLCPP VarLenType : public DataType {
    public:
-	// Constructor that creates a variable-length datatype based
-	// on the specified base type.
-	VarLenType(const DataType* base_type);
+        // Constructor that creates a variable-length datatype based
+        // on the specified base type.
+        VarLenType(const DataType* base_type);
 
-	///\brief Returns this class name.
-	virtual H5std_string fromClass () const { return("VarLenType"); }
+        ///\brief Returns this class name.
+        virtual H5std_string fromClass () const { return("VarLenType"); }
 
-	// Copy constructor: makes copy of the original object.
-	VarLenType( const VarLenType& original );
+        // Copy constructor: makes copy of the original object.
+        VarLenType(const VarLenType& original);
 
-	// Constructor that takes an existing id
-	VarLenType( const hid_t existing_id );
+        // Constructor that takes an existing id
+        VarLenType(const hid_t existing_id);
 
-	// Noop destructor
-	virtual ~VarLenType();
+        // Constructors that open a variable-length datatype, given a location.
+        VarLenType(const H5Location& loc, const char* name);
+        VarLenType(const H5Location& loc, const H5std_string& name);
+
+        // Noop destructor
+        virtual ~VarLenType();
+
+        // Default constructor
+        VarLenType();
+
+}; // end of VarLenType
+} // namespace H5
 
-	// Default constructor
-	VarLenType();
-};
-#ifndef H5_NO_NAMESPACE
-}
-#endif
 #endif // __H5VarLenType_H
diff --git a/c++/src/Makefile.am b/c++/src/Makefile.am
index 6cd4768..efe17dc 100644
--- a/c++/src/Makefile.am
+++ b/c++/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -33,25 +31,28 @@ libhdf5_cpp_la_LDFLAGS= -version-info $(LT_CXX_VERS_INTERFACE):$(LT_CXX_VERS_REV
 bin_SCRIPTS=h5c++
 
 # Source files for the library
-libhdf5_cpp_la_SOURCES=H5Exception.cpp H5IdComponent.cpp H5Library.cpp        \
-        H5Attribute.cpp H5Location.cpp H5Object.cpp H5PropList.cpp	      \
-	H5FaccProp.cpp H5FcreatProp.cpp H5DcreatProp.cpp H5DxferProp.cpp      \
-	H5OcreatProp.cpp H5DataType.cpp H5DataSpace.cpp H5AbstractDs.cpp          \
-	H5AtomType.cpp H5PredType.cpp H5EnumType.cpp H5IntType.cpp            \
-	H5FloatType.cpp H5StrType.cpp H5ArrayType.cpp H5VarLenType.cpp        \
-	H5CompType.cpp H5DataSet.cpp H5CommonFG.cpp H5Group.cpp H5File.cpp
+libhdf5_cpp_la_SOURCES=H5Exception.cpp H5IdComponent.cpp	\
+	H5DataSpace.cpp H5PropList.cpp H5Library.cpp		\
+	H5FaccProp.cpp H5FcreatProp.cpp H5LaccProp.cpp		\
+	H5DxferProp.cpp H5DcreatProp.cpp H5Location.cpp		\
+	H5AbstractDs.cpp H5Attribute.cpp H5Object.cpp		\
+	H5OcreatProp.cpp H5DataType.cpp H5AtomType.cpp		\
+	H5PredType.cpp H5EnumType.cpp H5IntType.cpp		\
+	H5FloatType.cpp H5StrType.cpp H5ArrayType.cpp		\
+	H5VarLenType.cpp H5CompType.cpp H5DataSet.cpp		\
+	H5CommonFG.cpp H5Group.cpp H5File.cpp
 
 # HDF5 C++ library depends on HDF5 Library.
 libhdf5_cpp_la_LIBADD=$(LIBHDF5)
 
 # Public headers
 include_HEADERS=H5Cpp.h H5AbstractDs.h H5AtomType.h H5Attribute.h H5Classes.h \
-        H5CommonFG.h H5CompType.h H5DataSet.h H5DataSpace.h H5DataType.h      \
-        H5OcreatProp.h H5DcreatProp.h H5DxferProp.h H5EnumType.h              \
+	H5CommonFG.h H5CompType.h H5DataSet.h H5DataSpace.h H5DataType.h      \
+	H5OcreatProp.h H5DcreatProp.h H5DxferProp.h H5EnumType.h              \
 	H5Exception.h H5FaccProp.h H5FcreatProp.h H5File.h H5FloatType.h      \
-	H5Group.h H5IdComponent.h H5Include.h H5IntType.h H5Library.h         \
-	H5Location.h H5Object.h H5PredType.h H5PropList.h H5StrType.h         \
-	H5CppDoc.h H5ArrayType.h H5VarLenType.h      
+	H5Group.h H5IdComponent.h H5Include.h H5IntType.h H5LaccProp.h        \
+	H5Library.h H5Location.h H5Object.h H5PredType.h H5PropList.h         \
+	H5StrType.h H5CppDoc.h H5ArrayType.h H5VarLenType.h
 
 # h5c++ and libhdf5.settings are generated during configure.  Remove only when
 # distclean.
diff --git a/c++/src/Makefile.in b/c++/src/Makefile.in
index cdd0756..900dd75 100644
--- a/c++/src/Makefile.in
+++ b/c++/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-C++ Makefile(.in)
 #
@@ -169,13 +167,13 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5_cpp_la_DEPENDENCIES = $(LIBHDF5)
 am_libhdf5_cpp_la_OBJECTS = H5Exception.lo H5IdComponent.lo \
-	H5Library.lo H5Attribute.lo H5Location.lo H5Object.lo \
-	H5PropList.lo H5FaccProp.lo H5FcreatProp.lo H5DcreatProp.lo \
-	H5DxferProp.lo H5OcreatProp.lo H5DataType.lo H5DataSpace.lo \
-	H5AbstractDs.lo H5AtomType.lo H5PredType.lo H5EnumType.lo \
-	H5IntType.lo H5FloatType.lo H5StrType.lo H5ArrayType.lo \
-	H5VarLenType.lo H5CompType.lo H5DataSet.lo H5CommonFG.lo \
-	H5Group.lo H5File.lo
+	H5DataSpace.lo H5PropList.lo H5Library.lo H5FaccProp.lo \
+	H5FcreatProp.lo H5LaccProp.lo H5DxferProp.lo H5DcreatProp.lo \
+	H5Location.lo H5AbstractDs.lo H5Attribute.lo H5Object.lo \
+	H5OcreatProp.lo H5DataType.lo H5AtomType.lo H5PredType.lo \
+	H5EnumType.lo H5IntType.lo H5FloatType.lo H5StrType.lo \
+	H5ArrayType.lo H5VarLenType.lo H5CompType.lo H5DataSet.lo \
+	H5CommonFG.lo H5Group.lo H5File.lo
 libhdf5_cpp_la_OBJECTS = $(am_libhdf5_cpp_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -474,6 +472,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -595,6 +594,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -740,32 +740,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -778,13 +773,16 @@ libhdf5_cpp_la_LDFLAGS = -version-info $(LT_CXX_VERS_INTERFACE):$(LT_CXX_VERS_RE
 bin_SCRIPTS = h5c++
 
 # Source files for the library
-libhdf5_cpp_la_SOURCES = H5Exception.cpp H5IdComponent.cpp H5Library.cpp        \
-        H5Attribute.cpp H5Location.cpp H5Object.cpp H5PropList.cpp	      \
-	H5FaccProp.cpp H5FcreatProp.cpp H5DcreatProp.cpp H5DxferProp.cpp      \
-	H5OcreatProp.cpp H5DataType.cpp H5DataSpace.cpp H5AbstractDs.cpp          \
-	H5AtomType.cpp H5PredType.cpp H5EnumType.cpp H5IntType.cpp            \
-	H5FloatType.cpp H5StrType.cpp H5ArrayType.cpp H5VarLenType.cpp        \
-	H5CompType.cpp H5DataSet.cpp H5CommonFG.cpp H5Group.cpp H5File.cpp
+libhdf5_cpp_la_SOURCES = H5Exception.cpp H5IdComponent.cpp	\
+	H5DataSpace.cpp H5PropList.cpp H5Library.cpp		\
+	H5FaccProp.cpp H5FcreatProp.cpp H5LaccProp.cpp		\
+	H5DxferProp.cpp H5DcreatProp.cpp H5Location.cpp		\
+	H5AbstractDs.cpp H5Attribute.cpp H5Object.cpp		\
+	H5OcreatProp.cpp H5DataType.cpp H5AtomType.cpp		\
+	H5PredType.cpp H5EnumType.cpp H5IntType.cpp		\
+	H5FloatType.cpp H5StrType.cpp H5ArrayType.cpp		\
+	H5VarLenType.cpp H5CompType.cpp H5DataSet.cpp		\
+	H5CommonFG.cpp H5Group.cpp H5File.cpp
 
 
 # HDF5 C++ library depends on HDF5 Library.
@@ -792,12 +790,12 @@ libhdf5_cpp_la_LIBADD = $(LIBHDF5)
 
 # Public headers
 include_HEADERS = H5Cpp.h H5AbstractDs.h H5AtomType.h H5Attribute.h H5Classes.h \
-        H5CommonFG.h H5CompType.h H5DataSet.h H5DataSpace.h H5DataType.h      \
-        H5OcreatProp.h H5DcreatProp.h H5DxferProp.h H5EnumType.h              \
+	H5CommonFG.h H5CompType.h H5DataSet.h H5DataSpace.h H5DataType.h      \
+	H5OcreatProp.h H5DcreatProp.h H5DxferProp.h H5EnumType.h              \
 	H5Exception.h H5FaccProp.h H5FcreatProp.h H5File.h H5FloatType.h      \
-	H5Group.h H5IdComponent.h H5Include.h H5IntType.h H5Library.h         \
-	H5Location.h H5Object.h H5PredType.h H5PropList.h H5StrType.h         \
-	H5CppDoc.h H5ArrayType.h H5VarLenType.h      
+	H5Group.h H5IdComponent.h H5Include.h H5IntType.h H5LaccProp.h        \
+	H5Library.h H5Location.h H5Object.h H5PredType.h H5PropList.h         \
+	H5StrType.h H5CppDoc.h H5ArrayType.h H5VarLenType.h
 
 
 # h5c++ and libhdf5.settings are generated during configure.  Remove only when
@@ -807,18 +805,20 @@ DISTCLEANFILES = h5c++ libhdf5.settings
 # Mark this directory as part of the C++ API
 CXX_API = yes
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -962,6 +962,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Group.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5IdComponent.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5IntType.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LaccProp.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Library.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Location.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Object.Plo at am__quote@
@@ -972,22 +973,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5VarLenType.Plo at am__quote@
 
 .cpp.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cpp.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cpp.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
@@ -1394,19 +1398,6 @@ uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # Some C++ compilers/linkers (PGI?) create a directory named "ii_files" that
 # holds *.ii files, which are template entity instantiations.
 # This entire directory should be cleaned.
@@ -1417,6 +1408,7 @@ mostlyclean-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1424,7 +1416,7 @@ 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)
+lib dyn 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                           \
diff --git a/c++/src/cpp_doc_config b/c++/src/cpp_doc_config
index 69807eb..ad019d0 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.10.0-patch1 currently under development"
+PROJECT_NUMBER         = "1.10.1"
 
 # 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++/src/h5c++.in b/c++/src/h5c++.in
index 069842a..00502d9 100644
--- a/c++/src/h5c++.in
+++ b/c++/src/h5c++.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 ############################################################################
@@ -205,7 +203,7 @@ for arg in $@ ; do
       compile_args="$compile_args $arg"
 
       if test "x$do_link" = "xyes" -a -n "$output_file"; then
-        compile_args="$compile_args -o $outputfile"
+        compile_args="$compile_args -o $output_file"
       fi
 
       do_link="no"
diff --git a/c++/src/header.html b/c++/src/header.html
index c3018d7..cb42565 100644
--- a/c++/src/header.html
+++ b/c++/src/header.html
@@ -12,12 +12,10 @@ xmlns="http://www.w3.org/TR/REC-html40">
   *                                                                           *
   * This file is part of HDF5.  The full HDF5 copyright notice, including     *
   * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * the COPYING file, which can be found at the root of the source code       *
+  * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+  * If you do not have access to either file, you may request a copy from     *
+  * help at hdfgroup.org.                                                        *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
 
diff --git a/c++/test/CMakeLists.txt b/c++/test/CMakeLists.txt
index 4bebeac..65815f9 100644
--- a/c++/test/CMakeLists.txt
+++ b/c++/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_CPP_TEST)
 # --------------------------------------------------------------------
 # Notes: When creating unit test executables they should be prefixed
@@ -11,7 +11,7 @@ PROJECT (HDF5_CPP_TEST)
 #-----------------------------------------------------------------------------
 # Define Sources
 #-----------------------------------------------------------------------------
-set (CPP_TEST_SRCS
+set (CPP_TEST_SOURCES
     ${HDF5_CPP_TEST_SOURCE_DIR}/testhdf5.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/tarray.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/tattr.cpp
@@ -20,6 +20,7 @@ set (CPP_TEST_SRCS
     ${HDF5_CPP_TEST_SOURCE_DIR}/tfile.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/tfilter.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/th5s.cpp
+    ${HDF5_CPP_TEST_SOURCE_DIR}/titerate.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/tlinks.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/tobject.cpp
     ${HDF5_CPP_TEST_SOURCE_DIR}/trefer.cpp
@@ -35,7 +36,7 @@ set (CPP_TEST_SRCS
 set (srcdir ${CMAKE_CURRENT_SOURCE_DIR})
 configure_file (${HDF5_CPP_TEST_SOURCE_DIR}/H5srcdir_str.h.in H5srcdir_str.h  @ONLY)
 
-add_executable (cpp_testhdf5 ${CPP_TEST_SRCS} )
+add_executable (cpp_testhdf5 ${CPP_TEST_SOURCES} )
 TARGET_NAMING (cpp_testhdf5 STATIC)
 TARGET_C_PROPERTIES (cpp_testhdf5 STATIC " " " ")
 target_link_libraries (cpp_testhdf5
@@ -48,11 +49,4 @@ set_target_properties (cpp_testhdf5 PROPERTIES
     INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
 )
 
-add_custom_command (
-    TARGET     cpp_testhdf5
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${HDF5_CPP_TEST_SOURCE_DIR}/th5s.h5 ${PROJECT_BINARY_DIR}/th5s.h5
-)
-
 include (CMakeTests.cmake)
diff --git a/c++/test/CMakeTests.cmake b/c++/test/CMakeTests.cmake
index c725f69..6de801e 100644
--- a/c++/test/CMakeTests.cmake
+++ b/c++/test/CMakeTests.cmake
@@ -1,3 +1,16 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+HDFTEST_COPY_FILE("${HDF5_CPP_TEST_SOURCE_DIR}/th5s.h5" "${PROJECT_BINARY_DIR}/th5s.h5" "cpp_testhdf5_files")
+add_custom_target(cpp_testhdf5_files ALL COMMENT "Copying files needed by cpp_testhdf5 tests" DEPENDS ${cpp_testhdf5_files_list})
 
 ##############################################################################
 ##############################################################################
@@ -8,16 +21,30 @@
 add_test (
     NAME CPP_testhdf5-clear-objects
     COMMAND    ${CMAKE_COMMAND}
-        -E remove 
+        -E remove
             tattr_basic.h5
             tattr_compound.h5
             tattr_dtype.h5
             tattr_multi.h5
             tattr_scalar.h5
             tfattrs.h5
+            titerate.h5
 )
 
-add_test (NAME CPP_testhdf5 COMMAND $<TARGET_FILE:cpp_testhdf5>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME CPP_testhdf5 COMMAND $<TARGET_FILE:cpp_testhdf5>)
+else ()
+  add_test (NAME CPP_testhdf5 COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:cpp_testhdf5>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=cpp_testhdf5.txt"
+      #-D "TEST_REFERENCE=cpp_testhdf5.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (CPP_testhdf5 PROPERTIES DEPENDS CPP_testhdf5-clear-objects)
 
 if (HDF5_TEST_VFD)
@@ -30,43 +57,45 @@ if (HDF5_TEST_VFD)
       multi
       family
   )
-  
+
   if (DIRECT_VFD)
     set (VFD_LIST ${VFD_LIST} direct)
-  endif (DIRECT_VFD)
+  endif ()
 
-  MACRO (ADD_VFD_TEST vfdname resultcode)
+  macro (ADD_VFD_TEST vfdname resultcode)
     if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/${vfdname}")
       add_test (
           NAME CPP_VFD-${vfdname}-cpp_testhdf5-clear-objects
           COMMAND    ${CMAKE_COMMAND}
-              -E remove 
+              -E remove
                   tattr_basic.h5
                   tattr_compound.h5
                   tattr_dtype.h5
                   tattr_multi.h5
                   tattr_scalar.h5
                   tfattrs.h5
+                  titerate.h5
       )
       add_test (
-        NAME CPP_VFD-${vfdname}-cpp_testhdf5 
+        NAME CPP_VFD-${vfdname}-cpp_testhdf5
         COMMAND "${CMAKE_COMMAND}"
             -D "TEST_PROGRAM=$<TARGET_FILE:cpp_testhdf5>"
             -D "TEST_ARGS:STRING="
             -D "TEST_VFD:STRING=${vfdname}"
             -D "TEST_EXPECT=${resultcode}"
             -D "TEST_OUTPUT=cpp_testhdf5"
-            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/${vfdname}"
             -P "${HDF_RESOURCES_DIR}/vfdTest.cmake"
       )
       set_tests_properties (CPP_VFD-${vfdname}-cpp_testhdf5 PROPERTIES DEPENDS CPP_VFD-${vfdname}-cpp_testhdf5-clear-objects)
       set_tests_properties (CPP_VFD-${vfdname}-cpp_testhdf5 PROPERTIES TIMEOUT 30)
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_VFD_TEST)
-  
+    endif ()
+  endmacro ()
+
   # Run test with different Virtual File Driver
   foreach (vfd ${VFD_LIST})
     ADD_VFD_TEST (${vfd} 0)
-  endforeach (vfd ${VFD_LIST})
+  endforeach ()
 
-endif (HDF5_TEST_VFD)
+endif ()
diff --git a/c++/test/H5srcdir_str.h.in b/c++/test/H5srcdir_str.h.in
index d472124..bab1df3 100644
--- a/c++/test/H5srcdir_str.h.in
+++ b/c++/test/H5srcdir_str.h.in
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* If you are reading this file and it has a '.h' suffix, it was automatically
diff --git a/c++/test/Makefile.am b/c++/test/Makefile.am
index 07fe533..0fc17fc 100644
--- a/c++/test/Makefile.am
+++ b/c++/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -34,7 +32,7 @@ LDADD=$(LIBH5TEST) $(LIBH5CPP) $(LIBHDF5)
 testhdf5_SOURCES=testhdf5.cpp dsets.cpp tattr.cpp tarray.cpp	\
 	tcompound.cpp tdspl.cpp tfile.cpp tfilter.cpp th5s.cpp	\
 	tlinks.cpp tobject.cpp trefer.cpp ttypes.cpp tvlstr.cpp	\
-	h5cpputil.cpp
+	titerate.cpp h5cpputil.cpp
 
 # Tell conclude.am that these are C++ tests.
 CXX_API=yes
diff --git a/c++/test/Makefile.in b/c++/test/Makefile.in
index 89a9b39..92e6eab 100644
--- a/c++/test/Makefile.in
+++ b/c++/test/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-C++ Makefile(.in)
 #
@@ -140,7 +138,7 @@ am_testhdf5_OBJECTS = testhdf5.$(OBJEXT) dsets.$(OBJEXT) \
 	tdspl.$(OBJEXT) tfile.$(OBJEXT) tfilter.$(OBJEXT) \
 	th5s.$(OBJEXT) tlinks.$(OBJEXT) tobject.$(OBJEXT) \
 	trefer.$(OBJEXT) ttypes.$(OBJEXT) tvlstr.$(OBJEXT) \
-	h5cpputil.$(OBJEXT)
+	titerate.$(OBJEXT) h5cpputil.$(OBJEXT)
 testhdf5_OBJECTS = $(am_testhdf5_OBJECTS)
 testhdf5_LDADD = $(LDADD)
 testhdf5_DEPENDENCIES = $(LIBH5TEST) $(LIBH5CPP) $(LIBHDF5)
@@ -464,6 +462,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -585,6 +584,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -743,24 +743,26 @@ LDADD = $(LIBH5TEST) $(LIBH5CPP) $(LIBHDF5)
 testhdf5_SOURCES = testhdf5.cpp dsets.cpp tattr.cpp tarray.cpp	\
 	tcompound.cpp tdspl.cpp tfile.cpp tfilter.cpp th5s.cpp	\
 	tlinks.cpp tobject.cpp trefer.cpp ttypes.cpp tvlstr.cpp	\
-	h5cpputil.cpp
+	titerate.cpp h5cpputil.cpp
 
 
 # Tell conclude.am that these are C++ tests.
 CXX_API = yes
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -834,6 +836,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tfile.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tfilter.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/th5s.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/titerate.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tlinks.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tobject.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/trefer.Po at am__quote@
@@ -841,22 +844,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tvlstr.Po at am__quote@
 
 .cpp.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cpp.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cpp.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
@@ -1251,6 +1257,7 @@ mostlyclean-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1258,7 +1265,7 @@ 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)
+lib dyn 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                           \
diff --git a/c++/test/dsets.cpp b/c++/test/dsets.cpp
index 60e875c..a765fb1 100644
--- a/c++/test/dsets.cpp
+++ b/c++/test/dsets.cpp
@@ -5,23 +5,21 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
    FILE
    dsets.cpp - HDF5 C++ testing the functionalities associated with the
-	       C dataset interface (H5D)
+               C dataset interface (H5D)
 
    EXTERNAL ROUTINES/VARIABLES:
      These routines are in the test directory of the C library:
-	h5_reset() -- in h5test.c, resets the library by closing it
-	h5_fileaccess() -- in h5test.c, returns a file access template
+        h5_reset() -- in h5test.c, resets the library by closing it
+        h5_fileaccess() -- in h5test.c, returns a file access template
 
  ***************************************************************************/
 
@@ -30,31 +28,24 @@
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
-
-#include "H5Cpp.h"	// C++ API header file
+using std::cerr;
+using std::endl;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+#include <string>
+#include "H5Cpp.h"        // C++ API header file
+using namespace H5;
 
-#include "h5cpputil.h"	// C++ utilility header file
+#include "h5test.h"
+#include "h5cpputil.h"    // C++ utilility header file
 
-const H5std_string	FILE1("dataset.h5");
-const H5std_string	DSET_DEFAULT_NAME("default");
-const H5std_string	DSET_DEFAULT_NAME_PATH("/default");
-const H5std_string	DSET_CHUNKED_NAME("chunked");
-const H5std_string	DSET_SIMPLE_IO_NAME("simple_io");
-const H5std_string	DSET_TCONV_NAME	("tconv");
-const H5std_string	DSET_COMPRESS_NAME("compressed");
-const H5std_string	DSET_BOGUS_NAME	("bogus");
+const H5std_string    FILE1("dataset.h5");
+const H5std_string    DSET_DEFAULT_NAME("default");
+const H5std_string    DSET_DEFAULT_NAME_PATH("/default");
+const H5std_string    DSET_CHUNKED_NAME("chunked");
+const H5std_string    DSET_SIMPLE_IO_NAME("simple_io");
+const H5std_string    DSET_TCONV_NAME("tconv");
+const H5std_string    DSET_COMPRESS_NAME("compressed");
+const H5std_string    DSET_BOGUS_NAME("bogus");
 
 /* Temporary filter IDs used for testing */
 const int H5Z_FILTER_BOGUS = 305;
@@ -63,17 +54,18 @@ static size_t filter_bogus(unsigned int flags, size_t cd_nelmts,
     const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
 // H5_ATTR_UNUSED variables caused warning, but taking them out caused failure.
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_create
+ * Function:    test_create
  *
- * Purpose:	Attempts to create a dataset.
+ * Purpose      Attempts to create a dataset.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Friday, January 5, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Friday, January 5, 2001
  *
  * Modifications:
  *
@@ -82,129 +74,130 @@ static size_t filter_bogus(unsigned int flags, size_t cd_nelmts,
 static herr_t
 test_create( H5File& file)
 {
-    SUBTEST("create, open, close");
+    SUBTEST("Create, open, close");
 
     // Setting this to NULL for cleaning up in failure situations
     DataSet *dataset = NULL;
     try {
-	// Create a data space
-	hsize_t     dims[2];
-	dims[0] = 256;
-	dims[1] = 512;
-	DataSpace space (2, dims, NULL);
-
-	// Create a dataset using the default dataset creation properties.
-	// We're not sure what they are, so we won't check.
-	dataset = new DataSet (file.createDataSet
-		(DSET_DEFAULT_NAME, PredType::NATIVE_DOUBLE, space));
-
-
-	// Add a comment to the dataset
-	file.setComment (DSET_DEFAULT_NAME, "This is a dataset");
-
-	// Close the dataset
-	delete dataset;
-	dataset = NULL;
-
-	// Try creating a dataset that already exists.  This should fail since a
-	// dataset can only be created once.  If an exception is not thrown for
-	// this action by createDataSet, then throw an invalid action exception.
-	try {
-	    dataset = new DataSet (file.createDataSet
-			(DSET_DEFAULT_NAME, PredType::NATIVE_DOUBLE, space));
-
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
-	}
-	catch (FileIException E)	// catching invalid creating dataset
-	{} // do nothing, exception expected
-
-	// Open the dataset we created above and then close it.  This is one
-	// way to open an existing dataset for accessing.
-	dataset = new DataSet (file.openDataSet (DSET_DEFAULT_NAME));
-
-	// Get and verify the name of this dataset, using
-	// H5std_string getObjName()
-	H5std_string ds_name = dataset->getObjName();
-	verify_val(ds_name, DSET_DEFAULT_NAME_PATH, "DataSet::getObjName", __LINE__, __FILE__);
-
-	// Get and verify the comment from this dataset, using
-	// H5std_string getComment(const H5std_string& name, <buf_size=0, by default>)
-	H5std_string comment = file.getComment(DSET_DEFAULT_NAME);
-	verify_val(comment, "This is a dataset", "DataSet::getComment", __LINE__, __FILE__);
-
-	// Close the dataset when accessing is completed
-	delete dataset;
-
-	// This is another way to open an existing dataset for accessing.
-	DataSet another_dataset(file.openDataSet (DSET_DEFAULT_NAME));
-
-	// Try opening a non-existent dataset.  This should fail so if an
-	// exception is not thrown for this action by openDataSet, then
-	// display failure information and throw an exception.
-	try {
-	    dataset = new DataSet (file.openDataSet( "does_not_exist" ));
-
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("H5File::openDataSet", "Attempted to open a non-existent dataset");
-	}
-	catch (FileIException E ) // catching creating non-existent dataset
-	{} // do nothing, exception expected
-
-	// Create a new dataset that uses chunked storage instead of the default
-	// layout.
-	DSetCreatPropList create_parms;
-	hsize_t     csize[2];
-	csize[0] = 5;
-	csize[1] = 100;
-	create_parms.setChunk( 2, csize );
-
-	dataset = new DataSet (file.createDataSet
-		(DSET_CHUNKED_NAME, PredType::NATIVE_DOUBLE, space, create_parms));
-	// Note: this one has no error message in C when failure occurs?
-
-	// clean up and return with success
-	delete dataset;
-
-	PASSED();
-	return 0;
-    }	// outer most try block
-
-    catch (InvalidActionException E)
+        // Create a data space
+        hsize_t     dims[2];
+        dims[0] = 256;
+        dims[1] = 512;
+        DataSpace space (2, dims, NULL);
+
+        // Create a dataset using the default dataset creation properties.
+        // We're not sure what they are, so we won't check.
+        dataset = new DataSet (file.createDataSet
+                (DSET_DEFAULT_NAME, PredType::NATIVE_DOUBLE, space));
+
+
+        // Add a comment to the dataset
+        file.setComment (DSET_DEFAULT_NAME, "This is a dataset");
+
+        // Close the dataset
+        delete dataset;
+        dataset = NULL;
+
+        // Try creating a dataset that already exists.  This should fail since a
+        // dataset can only be created once.  If an exception is not thrown for
+        // this action by createDataSet, then throw an invalid action exception.
+        try {
+            dataset = new DataSet (file.createDataSet
+                          (DSET_DEFAULT_NAME, PredType::NATIVE_DOUBLE, space));
+
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
+        }
+        catch (FileIException& E)        // catching invalid creating dataset
+        {} // do nothing, exception expected
+
+        // Open the dataset we created above and then close it.  This is one
+        // way to open an existing dataset for accessing.
+        dataset = new DataSet (file.openDataSet (DSET_DEFAULT_NAME));
+
+        // Get and verify the name of this dataset, using
+        // H5std_string getObjName()
+        H5std_string ds_name = dataset->getObjName();
+        verify_val(ds_name, DSET_DEFAULT_NAME_PATH, "DataSet::getObjName", __LINE__, __FILE__);
+
+        // Get and verify the comment from this dataset, using
+        // H5std_string getComment(const H5std_string& name, <buf_size=0, by default>)
+        H5std_string comment = file.getComment(DSET_DEFAULT_NAME);
+        verify_val(comment, "This is a dataset", "DataSet::getComment", __LINE__, __FILE__);
+
+        // Close the dataset when accessing is completed
+        delete dataset;
+
+        // This is another way to open an existing dataset for accessing.
+        DataSet another_dataset(file.openDataSet (DSET_DEFAULT_NAME));
+
+        // Try opening a non-existent dataset.  This should fail so if an
+        // exception is not thrown for this action by openDataSet, then
+        // display failure information and throw an exception.
+        try {
+            dataset = new DataSet (file.openDataSet( "does_not_exist" ));
+
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("H5File::openDataSet", "Attempted to open a non-existent dataset");
+        }
+        catch (FileIException& E ) // catching creating non-existent dataset
+        {} // do nothing, exception expected
+
+        // Create a new dataset that uses chunked storage instead of the default
+        // layout.
+        DSetCreatPropList create_parms;
+        hsize_t     csize[2];
+        csize[0] = 5;
+        csize[1] = 100;
+        create_parms.setChunk( 2, csize );
+
+        dataset = new DataSet (file.createDataSet(DSET_CHUNKED_NAME,
+                               PredType::NATIVE_DOUBLE, space, create_parms));
+        // Note: this one has no error message in C when failure occurs?
+
+        // clean up and return with success
+        delete dataset;
+
+        PASSED();
+        return 0;
+    }        // outer most try block
+
+    catch (InvalidActionException& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
 
-	// clean up and return with failure
-	if (dataset != NULL)
-	    delete dataset;
-	return -1;
+        // clean up and return with failure
+        if (dataset != NULL)
+            delete dataset;
+        return -1;
     }
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_create", __LINE__, __FILE__);
+        issue_fail_msg("test_create", __LINE__, __FILE__);
 
-	// clean up and return with failure
-	if (dataset != NULL)
-	    delete dataset;
-	return -1;
+        // clean up and return with failure
+        if (dataset != NULL)
+            delete dataset;
+        return -1;
     }
 }   // test_create
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_simple_io
+ * Function:    test_simple_io
  *
- * Purpose:	Tests simple I/O.  That is, reading and writing a complete
- *		multi-dimensional array without data type or data space
- *		conversions, without compression, and stored contiguously.
+ * Purpose      Tests simple I/O.  That is, reading and writing a complete
+ *              multi-dimensional array without data type or data space
+ *              conversions, without compression, and stored contiguously.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Friday, January 5, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Friday, January 5, 2001
  *
  * Modifications:
  *
@@ -214,82 +207,83 @@ static herr_t
 test_simple_io( H5File& file)
 {
 
-    SUBTEST("simple I/O");
+    SUBTEST("Simple I/O");
 
-    int	points[100][200];
-    int	check[100][200];
-    int		i, j, n;
+    int        points[100][200];
+    int        check[100][200];
+    int i, j, n;
 
     // Initialize the dataset
     for (i = n = 0; i < 100; i++)
     {
-	for (j = 0; j < 200; j++) {
-	    points[i][j] = n++;
-	}
+        for (j = 0; j < 200; j++) {
+            points[i][j] = n++;
+        }
     }
 
     char* tconv_buf = new char [1000];
     try
     {
-	// Create the data space
-	hsize_t	dims[2];
-	dims[0] = 100;
-	dims[1] = 200;
-	DataSpace space (2, dims, NULL);
-
-	// Create a small conversion buffer to test strip mining
-	DSetMemXferPropList xfer;
-
-	xfer.setBuffer (1000, tconv_buf, NULL);
-
-	// Create the dataset
-	DataSet dataset (file.createDataSet (DSET_SIMPLE_IO_NAME, PredType::NATIVE_INT, space));
-
-	// Write the data to the dataset
-	dataset.write(reinterpret_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Read the dataset back
-	dataset.read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i = 0; i < 100; i++)
-	    for (j = 0; j < 200; j++)
-	    {
-		int status = check_values (i, j, points[i][j], check[i][j]);
-		if (status == -1)
-		    throw Exception("DataSet::read");
-	    }
-
-	// clean up and return with success
-	delete [] tconv_buf;
-	PASSED();
-	return 0;
+        // Create the data space
+        hsize_t dims[2];
+        dims[0] = 100;
+        dims[1] = 200;
+        DataSpace space (2, dims, NULL);
+
+        // Create a small conversion buffer to test strip mining
+        DSetMemXferPropList xfer;
+
+        xfer.setBuffer (1000, tconv_buf, NULL);
+
+        // Create the dataset
+        DataSet dataset (file.createDataSet (DSET_SIMPLE_IO_NAME, PredType::NATIVE_INT, space));
+
+        // Write the data to the dataset
+        dataset.write(static_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Read the dataset back
+        dataset.read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i = 0; i < 100; i++)
+            for (j = 0; j < 200; j++)
+            {
+                int status = check_values (i, j, points[i][j], check[i][j]);
+                if (status == -1)
+                    throw Exception("DataSet::read");
+            }
+
+        // clean up and return with success
+        delete [] tconv_buf;
+        PASSED();
+        return 0;
     }  // end try
 
     // catch all dataset, space, plist exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
 
-	// clean up and return with failure
-	if (tconv_buf)
-	    delete [] tconv_buf;
-	return -1;
+        // clean up and return with failure
+        if (tconv_buf)
+            delete [] tconv_buf;
+        return -1;
     }
 }   // test_simple_io
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_datasize
+ * Function:    test_datasize
  *
- * Purpose:	Tests DataSet::getInMemDataSize().  
+ * Purpose      Tests DataSet::getInMemDataSize().  
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
- *		Thursday, March 22, 2012
+ * Programmer   Binh-Minh Ribler
+ *              Thursday, March 22, 2012
  *
  * Modifications:
  *
@@ -301,158 +295,159 @@ test_datasize(FileAccPropList &fapl)
     SUBTEST("DataSet::getInMemDataSize()");
     try
     {
-	// Open FILE1.
-	H5File file(FILE1, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
-
-	// Open dataset DSET_SIMPLE_IO_NAME.
-	DataSet dset = file.openDataSet (DSET_SIMPLE_IO_NAME);
-
-	// Get the dataset's dataspace to calculate the size for verification.
-	DataSpace space(dset.getSpace());
-
-	// Get the dimension sizes.
-	hsize_t dims[2];
-	int n_dims = space.getSimpleExtentDims(dims);
-	if (n_dims < 0)
-	{
-	    throw Exception("test_compression", "DataSpace::getSimpleExtentDims() failed");
-	}
-
-	// Calculate the supposed size.  Size of each value is int (4), from
-	// test_simple_io.
-	size_t expected_size = 4 * dims[0] * dims[1];
-
-	// getInMemDataSize() returns the in memory size of the data.
-	size_t ds_size = dset.getInMemDataSize();
-
-	// Verify the data size.
-	if (ds_size != expected_size)
-	{
-	    H5_FAILED();
-	    cerr << " Expected data size = " << expected_size;
-	    cerr << " but dset.getInMemDataSize() returned " << ds_size << endl;
-	    throw Exception("test_compression", "Failed in testing DataSet::getInMemDataSize()");
-	}
-
-	PASSED();
-	return 0;
+        // Open FILE1.
+        H5File file(FILE1, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
+
+        // Open dataset DSET_SIMPLE_IO_NAME.
+        DataSet dset = file.openDataSet (DSET_SIMPLE_IO_NAME);
+
+        // Get the dataset's dataspace to calculate the size for verification.
+        DataSpace space(dset.getSpace());
+
+        // Get the dimension sizes.
+        hsize_t dims[2];
+        int n_dims = space.getSimpleExtentDims(dims);
+        if (n_dims < 0)
+        {
+            throw Exception("test_compression", "DataSpace::getSimpleExtentDims() failed");
+        }
+
+        // Calculate the supposed size.  Size of each value is int (4), from
+        // test_simple_io.
+        size_t expected_size = 4 * dims[0] * dims[1];
+
+        // getInMemDataSize() returns the in memory size of the data.
+        size_t ds_size = dset.getInMemDataSize();
+
+        // Verify the data size.
+        if (ds_size != expected_size)
+        {
+            H5_FAILED();
+            cerr << " Expected data size = " << expected_size;
+            cerr << " but dset.getInMemDataSize() returned " << ds_size << endl;
+            throw Exception("test_compression", "Failed in testing DataSet::getInMemDataSize()");
+        }
+
+        PASSED();
+        return 0;
     }  // end try
 
     // catch all dataset, space, plist exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
 
-	return -1;
+        return -1;
     }
 }   // test_datasize
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_tconv
+ * Function:    test_tconv
  *
- * Purpose:	Test some simple data type conversion stuff.
+ * Purpose      Test some simple data type conversion stuff.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Friday, January 5, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Friday, January 5, 2001
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_tconv( H5File& file)
+test_tconv(H5File& file)
 {
     // Prepare buffers for input/output
-    char	*out=NULL, *in=NULL;
+    char        *out=NULL, *in=NULL;
     out = new char [4*1000000];
     // assert (out); - should use exception handler for new - BMR
     in = new char [4*1000000];
     //assert (in);
 
-    SUBTEST("data type conversion");
+    SUBTEST("Data type conversion");
 
     // Initialize the dataset
     for (int i = 0; i < 1000000; i++) {
-	out[i*4+0] = 0x11;
-	out[i*4+1] = 0x22;
-	out[i*4+2] = 0x33;
-	out[i*4+3] = 0x44;
+        out[i*4+0] = 0x11;
+        out[i*4+1] = 0x22;
+        out[i*4+2] = 0x33;
+        out[i*4+3] = 0x44;
     }
 
     try
     {
-	// Create the data space
-	hsize_t	dims[1];
-	dims[0] = 1000000;
-	DataSpace space (1, dims, NULL);
-
-	// Create the data set
-	DataSet dataset (file.createDataSet (DSET_TCONV_NAME, PredType::STD_I32LE, space));
-
-	// Write the data to the dataset
-	dataset.write (reinterpret_cast<void*>(out), PredType::STD_I32LE);
-
-	// Read data with byte order conversion
-	dataset.read (reinterpret_cast<void*>(in), PredType::STD_I32BE);
-
-	// Check
-	for (int i = 0; i < 1000000; i++) {
-	    if (in[4*i+0]!=out[4*i+3] ||
-		in[4*i+1]!=out[4*i+2] ||
-		in[4*i+2]!=out[4*i+1] ||
-		in[4*i+3]!=out[4*i+0])
-	    {
-		throw Exception("DataSet::read", "Read with byte order conversion failed");
-	    }
-	}
-
-	// clean up and return with success
-	delete [] out;
-	delete [] in;
-	PASSED();
-	return 0;
+        // Create the data space
+        hsize_t dims[1];
+        dims[0] = 1000000;
+        DataSpace space (1, dims, NULL);
+
+        // Create the data set
+        DataSet dataset (file.createDataSet (DSET_TCONV_NAME, PredType::STD_I32LE, space));
+
+        // Write the data to the dataset
+        dataset.write (static_cast<void*>(out), PredType::STD_I32LE);
+
+        // Read data with byte order conversion
+        dataset.read (static_cast<void*>(in), PredType::STD_I32BE);
+
+        // Check
+        for (int i = 0; i < 1000000; i++) {
+            if (in[4*i+0]!=out[4*i+3] ||
+                in[4*i+1]!=out[4*i+2] ||
+                in[4*i+2]!=out[4*i+1] ||
+                in[4*i+3]!=out[4*i+0])
+            {
+                throw Exception("DataSet::read", "Read with byte order conversion failed");
+            }
+        }
+
+        // clean up and return with success
+        delete [] out;
+        delete [] in;
+        PASSED();
+        return 0;
     }  // end try
 
     // catch all dataset and space exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
 
-	// clean up and return with failure
-	delete [] out;
-	delete [] in;
-	return -1;
+        // clean up and return with failure
+        delete [] out;
+        delete [] in;
+        return -1;
     }
 }   // test_tconv
 
 /* This message derives from H5Z */
 const H5Z_class2_t H5Z_BOGUS[1] = {{
-    H5Z_CLASS_T_VERS,		/* H5Z_class_t version number   */
-    H5Z_FILTER_BOGUS,		/* Filter id number		*/
-    1, 1,			/* Encode and decode enabled    */
-    "bogus",			/* Filter name for debugging	*/
+    H5Z_CLASS_T_VERS,           /* H5Z_class_t version number   */
+    H5Z_FILTER_BOGUS,           /* Filter id number             */
+    1, 1,                       /* Encode and decode enabled    */
+    "bogus",                    /* Filter name for debugging        */
     NULL,                       /* The "can apply" callback     */
     NULL,                       /* The "set local" callback     */
-    (H5Z_func_t)filter_bogus,   /* The actual filter function	*/
+    (H5Z_func_t)filter_bogus,   /* The actual filter function        */
 }};
 
 /*-------------------------------------------------------------------------
- * Function:	bogus
+ * Function:    bogus
  *
- * Purpose:	A bogus compression method that doesn't do anything.
+ * Purpose      A bogus compression method that doesn't do anything.
  *
- * Return:	Success:	Data chunk size
+ * Return       Success: Data chunk size
  *
- *		Failure:	0
+ *              Failure: 0
  *
- * Programmer:	Robb Matzke
- *		Tuesday, April 21, 1998
+ * Programmer   Robb Matzke
+ *              Tuesday, April 21, 1998
  *
  * Modifications:
  *
@@ -467,20 +462,21 @@ filter_bogus(unsigned int flags, size_t cd_nelmts,
     return nbytes;
 }
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_compression
+ * Function:    test_compression
  *
- * Purpose:	Tests dataset compression. If compression is requested when
- *		it hasn't been compiled into the library (such as when
- *		updating an existing compressed dataset) then data is sent to
- *		the file uncompressed but no errors are returned.
+ * Purpose      Tests dataset compression. If compression is requested when
+ *              it hasn't been compiled into the library (such as when
+ *              updating an existing compressed dataset) then data is sent to
+ *              the file uncompressed but no errors are returned.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Friday, January 5, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Friday, January 5, 2001
  *
  * Modifications:
  *
@@ -490,282 +486,400 @@ static herr_t
 test_compression(H5File& file)
 {
 #ifndef H5_HAVE_FILTER_DEFLATE
-    const char		*not_supported;
+    const char *not_supported;
     not_supported = "    Deflate compression is not enabled.";
 #endif /* H5_HAVE_FILTER_DEFLATE */
-    int		points[100][200];
-    int		check[100][200];
-    hsize_t	i, j, n;
+    int points[100][200];
+    int check[100][200];
+    hsize_t        i, j, n;
 
     // Initialize the dataset
     for (i = n = 0; i < 100; i++)
     {
-	for (j = 0; j < 200; j++) {
-	    points[i][j] = static_cast<int>(n++);
-	}
+        for (j = 0; j < 200; j++) {
+            points[i][j] = static_cast<int>(n++);
+        }
     }
+
     char* tconv_buf = new char [1000];
     DataSet* dataset = NULL;
     try
     {
-	const hsize_t	size[2] = {100, 200};
-	// Create the data space
-	DataSpace space1(2, size, NULL);
+        const hsize_t size[2] = {100, 200};
+        // Create the data space
+        DataSpace space1(2, size, NULL);
 
-	// Create a small conversion buffer to test strip mining
-	DSetMemXferPropList xfer;
+        // Create a small conversion buffer to test strip mining
+        DSetMemXferPropList xfer;
 
-	xfer.setBuffer (1000, tconv_buf, NULL);
+        xfer.setBuffer (1000, tconv_buf, NULL);
 
-	// Use chunked storage with compression
-	DSetCreatPropList dscreatplist;
+        // Use chunked storage with compression
+        DSetCreatPropList dscreatplist;
 
-	const hsize_t	chunk_size[2] = {2, 25};
-	dscreatplist.setChunk (2, chunk_size);
-	dscreatplist.setDeflate (6);
+        const hsize_t chunk_size[2] = {2, 25};
+        dscreatplist.setChunk (2, chunk_size);
+        dscreatplist.setDeflate (6);
 
 #ifdef H5_HAVE_FILTER_DEFLATE
-	SUBTEST("Compression (setup)");
-
-	// Create the dataset
-	dataset = new DataSet (file.createDataSet
-	    (DSET_COMPRESS_NAME, PredType::NATIVE_INT, space1, dscreatplist));
-
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* STEP 1: Read uninitialized data.  It should be zero.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (uninitialized read)");
-
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	for (i=0; i<size[0]; i++) {
-	    for (j=0; j<size[1]; j++) {
-		if (0!=check[i][j]) {
-		    H5_FAILED();
-		    cerr << "    Read a non-zero value." << endl;
-		    cerr << "    At index " << static_cast<unsigned long>(i) << "," <<
-		   static_cast<unsigned long>(j) << endl;
-		    throw Exception("test_compression", "Failed in uninitialized read");
-		}
-	    }
-	}
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* STEP 2: Test compression by setting up a chunked dataset and writing
-	* to it.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (write)");
-
-	for (i=n=0; i<size[0]; i++)
-	{
-	    for (j=0; j<size[1]; j++)
-	    {
-		points[i][j] = static_cast<int>(n++);
-	    }
-	}
-
-	dataset->write (reinterpret_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* STEP 3: Try to read the data we just wrote.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (read)");
-
-	// Read the dataset back
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i = 0; i < size[0]; i++)
-	    for (j = 0; j < size[1]; j++)
-	    {
-		int status = check_values (i, j, points[i][j], check[i][j]);
-		if (status == -1)
-		    throw Exception("test_compression", "Failed in read");
-	    }
-
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* STEP 4: Write new data over the top of the old data.  The new data is
-	* random thus not very compressible, and will cause the chunks to move
-	* around as they grow.  We only change values for the left half of the
-	* dataset although we rewrite the whole thing.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (modify)");
-
-	for (i=0; i<size[0]; i++)
-	{
-	    for (j=0; j<size[1]/2; j++)
-	    {
-	    	points[i][j] = rand ();
-	    }
-	}
-	dataset->write (reinterpret_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Read the dataset back and check it
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i = 0; i < size[0]; i++)
-	    for (j = 0; j < size[1]; j++)
-	    {
-		int status = check_values (i, j, points[i][j], check[i][j]);
-		if (status == -1)
-		    throw Exception("test_compression", "Failed in modify");
-	    }
-
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* STEP 5: Close the dataset and then open it and read it again.  This
-	* insures that the compression message is picked up properly from the
-	* object header.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (re-open)");
-
-	// close this dataset to reuse the var
-	delete dataset;
-
-	dataset = new DataSet (file.openDataSet (DSET_COMPRESS_NAME));
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i = 0; i < size[0]; i++)
-	    for (j = 0; j < size[1]; j++)
-	    {
-		int status = check_values (i, j, points[i][j], check[i][j]);
-		if (status == -1)
-		    throw Exception("test_compression", "Failed in re-open");
-	    }
-
-	PASSED();
-
-
-	/*----------------------------------------------------------------------
-	* STEP 6: Test partial I/O by writing to and then reading from a
-	* hyperslab of the dataset.  The hyperslab does not line up on chunk
-	* boundaries (we know that case already works from above tests).
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (partial I/O)");
-
-	const hsize_t	hs_size[2] = {4, 50};
-	const hsize_t	hs_offset[2] = {7, 30};
-	for (i = 0; i < hs_size[0]; i++) {
-	    for (j = 0; j < hs_size[1]; j++) {
-		points[hs_offset[0]+i][hs_offset[1]+j] = rand ();
-	    }
-	}
-	space1.selectHyperslab( H5S_SELECT_SET, hs_size, hs_offset );
-	dataset->write (reinterpret_cast<void*>(points), PredType::NATIVE_INT, space1, space1, xfer);
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, space1, space1, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i=0; i<hs_size[0]; i++) {
-	for (j=0; j<hs_size[1]; j++) {
-	    if (points[hs_offset[0]+i][hs_offset[1]+j] !=
-		check[hs_offset[0]+i][hs_offset[1]+j]) {
-		H5_FAILED();
-		cerr << "    Read different values than written.\n" << endl;
-		cerr << "    At index " << static_cast<unsigned long>((hs_offset[0]+i)) <<
-		   "," << static_cast<unsigned long>((hs_offset[1]+j)) << endl;
-
-		cerr << "    At original: " << static_cast<int>(points[hs_offset[0]+i][hs_offset[1]+j]) << endl;
-		cerr << "    At returned: " << static_cast<int>(check[hs_offset[0]+i][hs_offset[1]+j]) << endl;
-		throw Exception("test_compression", "Failed in partial I/O");
-	    }
-	} // for j
-	} // for i
-
-	delete dataset;
-	dataset = NULL;
-
-	PASSED();
+        SUBTEST("Compression (setup)");
+
+        // Create the dataset
+        dataset = new DataSet (file.createDataSet
+            (DSET_COMPRESS_NAME, PredType::NATIVE_INT, space1, dscreatplist));
+
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * STEP 1: Read uninitialized data.  It should be zero.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (uninitialized read)");
+
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        for (i=0; i<size[0]; i++) {
+            for (j=0; j<size[1]; j++) {
+                if (0!=check[i][j]) {
+                    H5_FAILED();
+                    cerr << "    Read a non-zero value." << endl;
+                    cerr << "    At index " << static_cast<unsigned long>(i)
+                         << "," << static_cast<unsigned long>(j) << endl;
+                    throw Exception("test_compression", "Failed in uninitialized read");
+                }
+            }
+        }
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * STEP 2: Test compression by setting up a chunked dataset and writing
+        * to it.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (write)");
+
+        for (i=n=0; i<size[0]; i++)
+        {
+            for (j=0; j<size[1]; j++)
+            {
+                points[i][j] = static_cast<int>(n++);
+            }
+        }
+
+        dataset->write (static_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * STEP 3: Try to read the data we just wrote.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (read)");
+
+        // Read the dataset back
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                int status = check_values (i, j, points[i][j], check[i][j]);
+                if (status == -1)
+                    throw Exception("test_compression", "Failed in read");
+            }
+
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * STEP 4: Write new data over the top of the old data.  The new data is
+        * random thus not very compressible, and will cause the chunks to move
+        * around as they grow.  We only change values for the left half of the
+        * dataset although we rewrite the whole thing.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (modify)");
+
+        for (i=0; i<size[0]; i++)
+        {
+            for (j=0; j<size[1]/2; j++)
+            {
+                    points[i][j] = rand ();
+            }
+        }
+        dataset->write (static_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Read the dataset back and check it
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                int status = check_values (i, j, points[i][j], check[i][j]);
+                if (status == -1)
+                    throw Exception("test_compression", "Failed in modify");
+            }
+
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * STEP 5: Close the dataset and then open it and read it again.  This
+        * insures that the compression message is picked up properly from the
+        * object header.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (re-open)");
+
+        // close this dataset to reuse the var
+        delete dataset;
+
+        dataset = new DataSet (file.openDataSet (DSET_COMPRESS_NAME));
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                int status = check_values (i, j, points[i][j], check[i][j]);
+                if (status == -1)
+                    throw Exception("test_compression", "Failed in re-open");
+            }
+
+        PASSED();
+
+
+        /*----------------------------------------------------------------------
+        * STEP 6: Test partial I/O by writing to and then reading from a
+        * hyperslab of the dataset.  The hyperslab does not line up on chunk
+        * boundaries (we know that case already works from above tests).
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (partial I/O)");
+
+        const hsize_t hs_size[2] = {4, 50};
+        const hsize_t hs_offset[2] = {7, 30};
+        for (i = 0; i < hs_size[0]; i++) {
+            for (j = 0; j < hs_size[1]; j++) {
+                points[hs_offset[0]+i][hs_offset[1]+j] = rand ();
+            }
+        }
+        space1.selectHyperslab( H5S_SELECT_SET, hs_size, hs_offset );
+        dataset->write (static_cast<void*>(points), PredType::NATIVE_INT, space1, space1, xfer);
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, space1, space1, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i=0; i<hs_size[0]; i++) {
+        for (j=0; j<hs_size[1]; j++) {
+            if (points[hs_offset[0]+i][hs_offset[1]+j] !=
+                check[hs_offset[0]+i][hs_offset[1]+j]) {
+                H5_FAILED();
+                cerr << "    Read different values than written.\n" << endl;
+                cerr << "    At index " << static_cast<unsigned long>((hs_offset[0]+i)) <<
+                    "," << static_cast<unsigned long>((hs_offset[1]+j)) << endl;
+
+                cerr << "    At original: " << static_cast<int>(points[hs_offset[0]+i][hs_offset[1]+j]) << endl;
+                cerr << "    At returned: " << static_cast<int>(check[hs_offset[0]+i][hs_offset[1]+j]) << endl;
+                throw Exception("test_compression", "Failed in partial I/O");
+            }
+        } // for j
+        } // for i
+
+        delete dataset;
+        dataset = NULL;
+
+        PASSED();
 
 #else
-	SUBTEST("deflate filter");
-	SKIPPED();
-	cerr << not_supported << endl;
+        SUBTEST("deflate filter");
+        SKIPPED();
+        cerr << not_supported << endl;
 #endif
 
-	/*----------------------------------------------------------------------
-	* STEP 7: Register an application-defined compression method and use it
-	* to write and then read the dataset.
-	*----------------------------------------------------------------------
-	*/
-	SUBTEST("Compression (app-defined method)");
+        /*----------------------------------------------------------------------
+        * STEP 7: Register an application-defined compression method and use it
+        * to write and then read the dataset.
+        *----------------------------------------------------------------------
+        */
+        SUBTEST("Compression (app-defined method)");
 
         if (H5Zregister (H5Z_BOGUS)<0)
-		throw Exception("test_compression", "Failed in app-defined method");
-	if (H5Pset_filter (dscreatplist.getId(), H5Z_FILTER_BOGUS, 0, 0, NULL)<0)
-	    throw Exception("test_compression", "Failed in app-defined method");
-	dscreatplist.setFilter (H5Z_FILTER_BOGUS, 0, 0, NULL);
-
-	DataSpace space2 (2, size, NULL);
-	dataset = new DataSet (file.createDataSet (DSET_BOGUS_NAME, PredType::NATIVE_INT, space2, dscreatplist));
-
-	dataset->write (reinterpret_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-	dataset->read (reinterpret_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
-
-	// Check that the values read are the same as the values written
-	for (i = 0; i < size[0]; i++)
-	    for (j = 0; j < size[1]; j++)
-	    {
-		int status = check_values (i, j, points[i][j], check[i][j]);
-		if (status == -1)
-		    throw Exception("test_compression", "Failed in app-defined method");
-	    }
-
-	PASSED();
-
-	/*----------------------------------------------------------------------
-	* Cleanup
-	*----------------------------------------------------------------------
-	*/
-	delete dataset;
-	delete [] tconv_buf;
-	return 0;
+                throw Exception("test_compression", "Failed in app-defined method");
+        if (H5Pset_filter (dscreatplist.getId(), H5Z_FILTER_BOGUS, 0, 0, NULL)<0)
+            throw Exception("test_compression", "Failed in app-defined method");
+        dscreatplist.setFilter (H5Z_FILTER_BOGUS, 0, 0, NULL);
+
+        DataSpace space2 (2, size, NULL);
+        dataset = new DataSet (file.createDataSet (DSET_BOGUS_NAME, PredType::NATIVE_INT, space2, dscreatplist));
+
+        dataset->write (static_cast<void*>(points), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+        dataset->read (static_cast<void*>(check), PredType::NATIVE_INT, DataSpace::ALL, DataSpace::ALL, xfer);
+
+        // Check that the values read are the same as the values written
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                int status = check_values (i, j, points[i][j], check[i][j]);
+                if (status == -1)
+                    throw Exception("test_compression", "Failed in app-defined method");
+            }
+
+        PASSED();
+
+        /*----------------------------------------------------------------------
+        * Cleanup
+        *----------------------------------------------------------------------
+        */
+        delete dataset;
+        delete [] tconv_buf;
+        return 0;
     } // end try
 
     // catch all dataset, file, space, and plist exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
-
-	// clean up and return with failure
-	if (dataset != NULL)
-	    delete dataset;
-	if (tconv_buf)
-	    delete [] tconv_buf;
-	return -1;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+
+        // clean up and return with failure
+        if (dataset != NULL)
+            delete dataset;
+        if (tconv_buf)
+            delete [] tconv_buf;
+        return -1;
     }
 }   // test_compression
 
+

+/*-------------------------------------------------------------------------
+ * Function:    test_nbit_methods
+ *
+ * Purpose      Tests setting nbit compression methods.
+ *
+ * Return       Success: 0
+ *
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Friday, April 22, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+const H5std_string        DSET_NBIT_NAME("nbit_dataset");
+const hsize_t DIM1 = 2;
+const hsize_t DIM2 = 5;
+static herr_t test_nbit_compression(H5File& file)
+{
+    typedef struct {
+        int i;
+        char c;
+        short s;
+    } s1_t;
+
+    const hsize_t size[2] = {DIM1, DIM2};
+    const hsize_t chunk_size[2] = {DIM1, DIM2};
+    s1_t          orig_data[DIM1][DIM2];
+    s1_t          new_data[DIM1][DIM2];
+    hsize_t       i, j;
+
+    SUBTEST("N-bit compression (setup)");
+
+    try
+    {
+        // Define datatypes of members of compound datatype
+        IntType i_type(PredType::NATIVE_INT);
+        IntType c_type(PredType::NATIVE_CHAR);
+        IntType s_type(PredType::NATIVE_SHORT);
+
+        // Create a dataset compound datatype
+        CompType cmpd(sizeof(s1_t));
+        cmpd.insertMember("i", HOFFSET(s1_t, i), i_type);
+        cmpd.insertMember("c", HOFFSET(s1_t, c), c_type);
+        cmpd.insertMember("s", HOFFSET(s1_t, s), s_type);
+
+        // Create a memory compound datatype
+        CompType mem_cmpd(sizeof(s1_t));
+        mem_cmpd.insertMember("i", HOFFSET(s1_t, i), i_type);
+        mem_cmpd.insertMember("c", HOFFSET(s1_t, c), c_type);
+        mem_cmpd.insertMember("s", HOFFSET(s1_t, s), s_type);
+
+        // Set order of dataset compound datatype
+        //cmpd.setOrder(H5T_ORDER_BE); only for atomic type?
+
+        // Create the data space
+        DataSpace space(2, size);
+
+        // Use nbit filter
+        DSetCreatPropList dscreat;
+        dscreat.setChunk(2, chunk_size);
+        dscreat.setNbit();
+
+        // Create the dataset
+        DataSet dataset(file.createDataSet(DSET_NBIT_NAME, cmpd, space, dscreat));
+
+        // Initialize data, assuming size of long long >= size of member datatypes
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                orig_data[i][j].i = static_cast<int>(i * j);
+                orig_data[i][j].c = static_cast<char>('a' + i);
+                orig_data[i][j].s = static_cast<short>(i + j);
+
+                // Some even-numbered integer values are negative
+                if ((i*size[1]+j+1)%2 == 0) {
+                    orig_data[i][j].i = -orig_data[i][j].i;
+                    orig_data[i][j].s = static_cast<short>(-orig_data[i][j].s);
+                }
+            }
+
+        // Write to the dataset
+        dataset.write(static_cast<void*>(orig_data), mem_cmpd);
+
+        // Read the dataset back */
+        dataset.read(static_cast<void*>(new_data), mem_cmpd);
+
+        // Check that the values read are the same as the values written.
+        for (i = 0; i < size[0]; i++)
+            for (j = 0; j < size[1]; j++)
+            {
+                if((new_data[i][j].i != orig_data[i][j].i) ||
+                   (new_data[i][j].c != orig_data[i][j].c) ||
+                   (new_data[i][j].s != orig_data[i][j].s))
+                {
+                    H5_FAILED();
+                    printf("    Read different values than written.\n");
+                    printf("    At index %lu,%lu\n", static_cast<unsigned long>(i), static_cast<unsigned long>(j));
+                }
+            }
+
+        PASSED();
+        return 0;
+    } // end try block
+
+    // catch all dataset, file, space, and plist exceptions
+    catch (Exception& E)
+    {
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+
+        return -1;
+    }
+} // test_nbit_compression
+
+

 /*-------------------------------------------------------------------------
- * Function:	test_multiopen
+ * Function:    test_multiopen
  *
- * Purpose:	Tests that a bug no longer exists.  If a dataset is opened
- *		twice and one of the handles is used to extend the dataset,
- *		then the other handle should return the new size when
- *		queried.
+ * Purpose      Tests that a bug no longer exists.  If a dataset is opened
+ *              twice and one of the handles is used to extend the dataset,
+ *              then the other handle should return the new size when
+ *              queried.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Saturday, February 17, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Saturday, February 17, 2001
  *
  * Modifications:
  *
@@ -780,73 +894,75 @@ test_multiopen (H5File& file)
     DataSpace* space = NULL;
     try {
 
-	// Create a dataset creation property list
-	DSetCreatPropList dcpl;
+        // Create a dataset creation property list
+        DSetCreatPropList dcpl;
 
-	// Set chunk size to given size
-	hsize_t		cur_size[1] = {10};
-	dcpl.setChunk (1, cur_size);
+        // Set chunk size to given size
+        hsize_t cur_size[1] = {10};
+        dcpl.setChunk (1, cur_size);
 
-	// Create a simple data space with unlimited size
-	static hsize_t	max_size[1] = {H5S_UNLIMITED};
-	space = new DataSpace (1, cur_size, max_size);
+        // Create a simple data space with unlimited size
+        hsize_t max_size[1] = {H5S_UNLIMITED};
+        space = new DataSpace (1, cur_size, max_size);
 
-	// Create first dataset
-	DataSet dset1 = file.createDataSet ("multiopen", PredType::NATIVE_INT, *space, dcpl);
+        // Create first dataset
+        DataSet dset1 = file.createDataSet ("multiopen", PredType::NATIVE_INT, *space, dcpl);
 
-	// Open again the first dataset from the file to another DataSet object.
-	DataSet dset2 = file.openDataSet ("multiopen");
+        // Open again the first dataset from the file to another DataSet object.
+        DataSet dset2 = file.openDataSet ("multiopen");
 
-	// Relieve the dataspace
-	delete space;
-	space = NULL;
+        // Relieve the dataspace
+        delete space;
+        space = NULL;
 
-	// Extend the dimensionality of the first dataset
-	cur_size[0] = 20;
-	dset1.extend (cur_size);
+        // Extend the dimensionality of the first dataset
+        cur_size[0] = 20;
+        dset1.extend (cur_size);
 
-	// Get the size from the second handle
-	space = new DataSpace (dset2.getSpace());
+        // Get the size from the second handle
+        space = new DataSpace (dset2.getSpace());
 
-	hsize_t		tmp_size[1];
-	space->getSimpleExtentDims (tmp_size);
-	if (cur_size[0]!=tmp_size[0])
-	{
-	    cerr << "    Got " << static_cast<int>(tmp_size[0]) << " instead of "
-		    << static_cast<int>(cur_size[0]) << "!" << endl;
-	    throw Exception("test_multiopen", "Failed in multi-open with extending");
-	}
+        hsize_t tmp_size[1];
+        space->getSimpleExtentDims (tmp_size);
+        if (cur_size[0]!=tmp_size[0])
+        {
+            cerr << "    Got " << static_cast<int>(tmp_size[0])
+                 << " instead of " << static_cast<int>(cur_size[0]) 
+                 << "!" << endl;
+            throw Exception("test_multiopen", "Failed in multi-open with extending");
+        }
 
-	// clean up and return with success
-	delete space;
-	PASSED();
-	return 0;
+        // clean up and return with success
+        delete space;
+        PASSED();
+        return 0;
     } // end try block
 
     // catch all dataset, file, space, and plist exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	cerr << " FAILED" << endl;
-	cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+        cerr << " FAILED" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
 
-	// clean up and return with failure
-	if (space != NULL)
-	    delete space;
-	return -1;
+        // clean up and return with failure
+        if (space != NULL)
+            delete space;
+        return -1;
     }
 }   // test_multiopen
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_types
+ * Function:    test_types
  *
- * Purpose:	Test various types - should be moved to dtypes.cpp
+ * Purpose      Test various types - should be moved to dtypes.cpp
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		February 17, 2001
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              February 17, 2001
  *
  * Modifications:
  *
@@ -857,236 +973,320 @@ test_types(H5File& file)
 {
     SUBTEST("Various datatypes");
 
-    size_t		i;
+    size_t i;
     DataSet* dset = NULL;
     try {
 
-	// Create a group in the file that was passed in from the caller
-	Group grp = file.createGroup ("typetests");
-
-	/* bitfield_1 */
-	unsigned char	buf[32];
-	hsize_t nelmts = sizeof(buf);
-	DataType type;
-	try { // block of bitfield_1
-	    // test copying a predefined type
-	    type.copy (PredType::STD_B8LE);
-
-	    // Test copying a user-defined type using DataType::copy
-	    DataType copied_type;
-	    copied_type.copy(type);
-
-	    // Test copying a user-defined type using DataType::operator=
-	    DataType another_copied_type;
-	    another_copied_type = type;
-
-	    // Test copying a user-defined int type using DataType::operator=
-	    IntType orig_int(PredType::STD_B8LE);
-	    DataType generic_type;
-	    generic_type = orig_int;
-
-	    // Test copying an integer predefined type
-	    IntType new_int_type(PredType::STD_B8LE);
-
-	    // Test copying an int predefined type using DataType::operator=
-	    IntType another_int_type;
-	    another_int_type = new_int_type;
-
-	    DataSpace space (1, &nelmts);
-	    dset = new DataSet(grp.createDataSet("bitfield_1", type, space));
-
-	    // Fill buffer
-	    for (i=0; i<sizeof buf; i++)
-	    	buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
-
-	    // Write data from buf using all default dataspaces and property list
-	    dset->write (buf, type);
-
-	    // no failure in bitfield_1, close this dataset
-	    delete dset;
-	} // end try block of bitfield_1
-
-	// catch exceptions thrown in try block of bitfield_1
-	catch (Exception E)
-	{
-	    cerr << " FAILED" << endl;
-	    cerr << "    <<<  " << "bitfield_1: " << E.getFuncName()
-		 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
-	    if (dset != NULL)
-		delete dset;
-	    return -1;
-	}
-
-	/* bitfield_2 */
-	nelmts = sizeof(buf)/2;
-	try { // bitfield_2 block
-	    type.copy (PredType::STD_B16LE);
-	    DataSpace space (1, &nelmts);
-	    dset = new DataSet(grp.createDataSet("bitfield_2", type, space));
-
-	    // Fill buffer
-	    for (i=0; i<sizeof(buf); i++)
-		buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
-
-	    // Write data from buf using all default dataspaces and property
-	    // list; if writing fails, deallocate dset and return.
-	    dset->write (buf, type);
-
-	    // no failure in bitfield_2, close this dataset and reset for
-	    // variable reuse
-	    delete dset;
-	    dset = NULL;
-	} // end try block of bitfield_2
-
-	// catch exceptions thrown in try block of bitfield_2
-	catch (Exception E) {
-	    cerr << " FAILED" << endl;
-	    cerr << "    <<<  " << "bitfield_2: " << E.getFuncName()
-		 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
-	    if (dset != NULL)
-		delete dset;
-	    throw E; // propagate the exception
-	}
-
-	/* opaque_1 */
-	DataType* optype = NULL;
-	try { // opaque_1 block
-	    optype = new DataType(H5T_OPAQUE, 1);
-	    nelmts = sizeof(buf);
-	    DataSpace space (1, &nelmts);
-	    optype->setTag ("testing 1-byte opaque type");
-	    dset = new DataSet(grp.createDataSet("opaque_1", *optype, space));
-
-	    // Fill buffer
-	    for (i=0; i<sizeof buf; i++)
-		buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
-
-	    // Write data from buf using all default dataspaces and property
-	    // list; if writing fails, deallocate dset and return.
-	    dset->write (buf, *optype);
-
-	    // no failure in opaque_1
-	    delete dset; dset = NULL;
-	    delete optype; optype = NULL;
-	} // end try block of opaque_1
-
-	// catch exceptions thrown in try block of opaque_1
-	catch (Exception E) {
-	    cerr << " FAILED" << endl;
-	    cerr << "    <<<  " << "opaque_1: " << E.getFuncName()
-		 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
-	    if (dset != NULL)
-		delete dset;
-	    if (optype != NULL)
-		delete optype;
-	    throw E; // propagate the exception
-	}
-
-	/* opaque_2 */
-	try { // block opaque_2
-	    nelmts = sizeof(buf)/4;
-	    DataSpace space (1, &nelmts);
-	    optype = new DataType(H5T_OPAQUE, 4);
-	    optype->setTag ("testing 4-byte opaque type");
-	    dset = new DataSet(grp.createDataSet("opaque_2", *optype, space));
-
-	    // Fill buffer
-	    for (i=0; i<sizeof(buf); i++)
-		buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
-
-	    // Write data from buf using all default dataspaces and property
-	    // list; if writing fails, deallocate dset and return.
-	    dset->write (buf, *optype);
-
-	    // no failure in opaque_1
-	    delete dset; dset = NULL;
-	    delete optype; optype = NULL;
-	} //end try block of opaque_2
-
-	// catch exceptions thrown in try block of opaque_2
-	catch (Exception E) {
-	    cerr << " FAILED" << endl;
-	    cerr << "    <<<  " << "opaque_2: " << E.getFuncName()
-		 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
-	    if (dset != NULL)
-		delete dset;
-	    if (optype != NULL)
-		delete optype;
-	    throw E; // propagate the exception
-	}
-
-	PASSED();
-	return 0;
+        // Create a group in the file that was passed in from the caller
+        Group grp = file.createGroup ("typetests");
+
+        /* bitfield_1 */
+        unsigned char buf[32];
+        hsize_t nelmts = sizeof(buf);
+        DataType type;
+        try { // block of bitfield_1
+            // test copying a predefined type
+            type.copy (PredType::STD_B8LE);
+
+            // Test copying a user-defined type using DataType::copy
+            DataType copied_type;
+            copied_type.copy(type);
+
+            // Test copying a user-defined type using DataType::operator=
+            DataType another_copied_type;
+            another_copied_type = type;
+
+            // Test copying a user-defined int type using DataType::operator=
+            IntType orig_int(PredType::STD_B8LE);
+            DataType generic_type;
+            generic_type = orig_int;
+
+            // Test copying an integer predefined type
+            IntType new_int_type(PredType::STD_B8LE);
+
+            // Test copying an int predefined type using DataType::operator=
+            IntType another_int_type;
+            another_int_type = new_int_type;
+
+            DataSpace space (1, &nelmts);
+            dset = new DataSet(grp.createDataSet("bitfield_1", type, space));
+
+            // Fill buffer
+            for (i=0; i<sizeof buf; i++)
+                    buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
+
+            // Write data from buf using all default dataspaces and property list
+            dset->write (buf, type);
+
+            // no failure in bitfield_1, close this dataset
+            delete dset;
+        } // end try block of bitfield_1
+
+        // catch exceptions thrown in try block of bitfield_1
+        catch (Exception& E)
+        {
+            cerr << " FAILED" << endl;
+            cerr << "    <<<  " << "bitfield_1: " << E.getFuncName()
+                 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
+            if (dset != NULL)
+                delete dset;
+            return -1;
+        }
+
+        /* bitfield_2 */
+        nelmts = sizeof(buf)/2;
+        try { // bitfield_2 block
+            type.copy (PredType::STD_B16LE);
+            DataSpace space (1, &nelmts);
+            dset = new DataSet(grp.createDataSet("bitfield_2", type, space));
+
+            // Fill buffer
+            for (i=0; i<sizeof(buf); i++)
+                buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
+
+            // Write data from buf using all default dataspaces and property
+            // list; if writing fails, deallocate dset and return.
+            dset->write (buf, type);
+
+            // no failure in bitfield_2, close this dataset and reset for
+            // variable reuse
+            delete dset;
+            dset = NULL;
+        } // end try block of bitfield_2
+
+        // catch exceptions thrown in try block of bitfield_2
+        catch (Exception& E)
+        {
+            cerr << " FAILED" << endl;
+            cerr << "    <<<  " << "bitfield_2: " << E.getFuncName()
+                 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
+            if (dset != NULL)
+                delete dset;
+            throw E; // propagate the exception
+        }
+
+        /* opaque_1 */
+        DataType* optype = NULL;
+        try { // opaque_1 block
+            optype = new DataType(H5T_OPAQUE, 1);
+            nelmts = sizeof(buf);
+            DataSpace space (1, &nelmts);
+            optype->setTag ("testing 1-byte opaque type");
+            dset = new DataSet(grp.createDataSet("opaque_1", *optype, space));
+
+            // Fill buffer
+            for (i=0; i<sizeof buf; i++)
+                buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
+
+            // Write data from buf using all default dataspaces and property
+            // list; if writing fails, deallocate dset and return.
+            dset->write (buf, *optype);
+
+            // no failure in opaque_1
+            delete dset; dset = NULL;
+            delete optype; optype = NULL;
+        } // end try block of opaque_1
+
+        // catch exceptions thrown in try block of opaque_1
+        catch (Exception& E)
+        {
+            cerr << " FAILED" << endl;
+            cerr << "    <<<  " << "opaque_1: " << E.getFuncName()
+                 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
+            if (dset != NULL)
+                delete dset;
+            if (optype != NULL)
+                delete optype;
+            throw E; // propagate the exception
+        }
+
+        /* opaque_2 */
+        try { // block opaque_2
+            nelmts = sizeof(buf)/4;
+            DataSpace space (1, &nelmts);
+            optype = new DataType(H5T_OPAQUE, 4);
+            optype->setTag ("testing 4-byte opaque type");
+            dset = new DataSet(grp.createDataSet("opaque_2", *optype, space));
+
+            // Fill buffer
+            for (i=0; i<sizeof(buf); i++)
+                buf[i] = static_cast<unsigned char>(0xff) ^ static_cast<unsigned char>(i);
+
+            // Write data from buf using all default dataspaces and property
+            // list; if writing fails, deallocate dset and return.
+            dset->write (buf, *optype);
+
+            // no failure in opaque_1
+            delete dset; dset = NULL;
+            delete optype; optype = NULL;
+        } //end try block of opaque_2
+
+        // catch exceptions thrown in try block of opaque_2
+        catch (Exception& E)
+        {
+            cerr << " FAILED" << endl;
+            cerr << "    <<<  " << "opaque_2: " << E.getFuncName()
+                 << " - " << E.getDetailMsg() << "  >>>" << endl << endl;
+            if (dset != NULL)
+                delete dset;
+            if (optype != NULL)
+                delete optype;
+            throw E; // propagate the exception
+        }
+
+        PASSED();
+        return 0;
     } // end top try block
 
-    catch (Exception E)
+    catch (Exception& E)
     {
-	return -1;
+        return -1;
     }
 }   // test_types
 
+

 /*-------------------------------------------------------------------------
- * Function:	test_dset
+ * Function:    test_virtual
  *
- * Purpose:	Tests the dataset interface (H5D)
+ * Purpose:     Tests fixed, unlimited, and printf selections in the same
+ *              VDS
  *
- * Return:	Success: 0
+ * Return:      Success:        0
  *
- *		Failure: -1
+ *              Failure:        number of errors
  *
- * Programmer:	Binh-Minh Ribler (using C version)
- *		Friday, January 5, 2001
+ * Programmer:  Binh-Minh Ribler
+ *              Friday, March 10, 2017
  *
  * Modifications:
- *	Nov 12, 01:
- *		- moved h5_cleanup to outside of try block because
- *		  dataset.h5 cannot be removed until "file" is out of
- *		  scope and dataset.h5 is closed.
- *	Feb 20, 05:
- *		- cleanup_dsets took care of the cleanup now.
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
+const int RANK = 2;
+static herr_t
+test_virtual()
+{
+    SUBTEST("DSetCreatPropList::setVirtual");
+
+    try {
+        // Create DCPLs
+        DSetCreatPropList dcpl;
+        DSetCreatPropList srcdcpl;
+
+        // Set fill value
+        char *fill = NULL;
+        dcpl.setFillValue(PredType::NATIVE_INT, &fill);
+
+        // Set chunk dimensions
+        hsize_t cdims[RANK];
+        cdims[0] = 2;
+        cdims[1] = 2;
+        srcdcpl.setChunk(RANK, cdims);
+
+        // Create memory space
+        hsize_t mdims[RANK];
+        mdims[0] = 10;
+        mdims[1] = 10;
+        DataSpace memspace(RANK, mdims);
+
+        // Get the current layout, should be default, H5D_CONTIGUOUS
+        H5D_layout_t layout = dcpl.getLayout();
+        verify_val(layout, H5D_CONTIGUOUS, "DSetCreatPropList::getLayout", __LINE__, __FILE__);
+
+        // Create fixed mapping
+        hsize_t dims[RANK];
+        dims[0] = 6;
+        dims[1] = 6;
+        DataSpace vspace(RANK, dims, mdims);
+
+        hsize_t start[RANK];       // Hyperslab start
+        hsize_t count[RANK];       // Hyperslab count
+        start[0] = start[1] = 3;
+        count[0] = count[1] = 3;
+        vspace.selectHyperslab(H5S_SELECT_SET, count, start);
+
+        DataSpace srcspace(RANK, count);
+
+        H5std_string src_file = "src_file_map.h5";
+        H5std_string src_dset = "src_dset_fixed";
+        dcpl.setVirtual(vspace, src_file, src_dset, srcspace);
+
+        // Get and verify the new layout
+        layout = dcpl.getLayout();
+        verify_val(layout, H5D_VIRTUAL, "DSetCreatPropList::getLayout", __LINE__, __FILE__);
+
+        PASSED();
+        return 0;
+    } // end top try block
+
+    catch (Exception& E)
+    {
+        return -1;
+    }
+} // test_virtual
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_dset
+ *
+ * Purpose      Tests the dataset interface (H5D)
+ *
+ * Return       Success: 0
+ *
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              Friday, January 5, 2001
+ *
+ * Modifications:
+ *        Nov 12, 01:
+ *              - moved h5_cleanup to outside of try block because
+ *                dataset.h5 cannot be removed until "file" is out of
+ *                scope and dataset.h5 is closed.
+ *        Feb 20, 05:
+ *              - cleanup_dsets took care of the cleanup now.
+ *
+ *-------------------------------------------------------------------------
+ */
 extern "C"
-#endif
 void test_dset()
 {
-    hid_t	fapl_id;
+    hid_t fapl_id;
     fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
-
-    int		nerrors=0;	// keep track of number of failures occurr
+    int nerrors=0; // keep track of number of failures occur
 
     try
     {
-	// Use the file access template id to create a file access prop.
-	// list object to pass in H5File::H5File
-	FileAccPropList fapl(fapl_id);
+        // Use the file access template id to create a file access prop.
+        // list object to pass in H5File::H5File
+        FileAccPropList fapl(fapl_id);
 
-	H5File file(FILE1, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
+        H5File file(FILE1, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
 
-	// Cause the library to emit initial messages
-	Group grp = file.createGroup( "emit diagnostics", 0);
-	grp.setComment("Causes diagnostic messages to be emitted");
+        // Cause the library to emit initial messages
+        Group grp = file.createGroup( "emit diagnostics", 0);
+        grp.setComment("Causes diagnostic messages to be emitted");
 
-	nerrors += test_create(file) < 0 ? 1:0;
-	nerrors += test_simple_io(file) < 0 ? 1:0;
-	nerrors += test_tconv(file) < 0 ? 1:0;
-	nerrors += test_compression(file) < 0 ? 1:0;
-	nerrors += test_multiopen (file) < 0 ? 1:0;
-	nerrors += test_types(file) < 0 ? 1:0;
+        nerrors += test_create(file) < 0 ? 1:0;
+        nerrors += test_simple_io(file) < 0 ? 1:0;
+        nerrors += test_tconv(file) < 0 ? 1:0;
+        nerrors += test_compression(file) < 0 ? 1:0;
+        nerrors += test_nbit_compression(file) < 0 ? 1:0;
+        nerrors += test_multiopen (file) < 0 ? 1:0;
+        nerrors += test_types(file) < 0 ? 1:0;
+        nerrors += test_virtual() < 0 ? 1:0;
 
-	// Close group "emit diagnostics".
-	grp.close();
+        // Close group "emit diagnostics".
+        grp.close();
 
-	// Close the file before testing data size.
-	file.close();
+        // Close the file before testing data size.
+        file.close();
 
-	nerrors += test_datasize(fapl) <0 ? 1:0;
+        nerrors += test_datasize(fapl) <0 ? 1:0;
     }
-    catch (Exception E)
+    catch (Exception& E)
     {
-	test_report(nerrors, H5std_string(" Dataset"));
+        test_report(nerrors, H5std_string(" Dataset"));
     }
 
     // Clean up data file
@@ -1096,19 +1296,17 @@ void test_dset()
 /*-------------------------------------------------------------------------
  * Function:    cleanup_dsets
  *
- * Purpose:     Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:      none
+ * Return       none
  *
- * Programmer:  (use C version)
+ * Programmer   (use C version)
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_dsets()
 {
     HDremove(FILE1.c_str());
diff --git a/c++/test/h5cpputil.cpp b/c++/test/h5cpputil.cpp
index 9bbb183..f0c403c 100644
--- a/c++/test/h5cpputil.cpp
+++ b/c++/test/h5cpputil.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -26,38 +24,29 @@
 #else
 #include <iostream>
 #endif
-#include <string>
+using std::cerr;
+using std::endl;
 
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
 #include "h5test.h"
-#include "H5Cpp.h"
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
-#include "h5cpputil.h"
+#include "h5cpputil.h"  // C++ utilility header file
 
-

 /*-------------------------------------------------------------------------
- * Function:	test_report
+ * Function:    test_report
  *
- * Purpose:	Prints out the number of errors for the tests indicated
- * 		by 'testname,' if there were any failures occurred.  If
- * 		no failure, test_report prints out the tests passed message.
+ * Purpose      Prints out the number of errors for the tests indicated
+ *              by 'testname,' if there were any failures occurred.  If
+ *              no failure, test_report prints out the tests passed message.
  *
- * Return:	if any failure has occurred:	1
+ * Return       if any failure has occurred: 1
  *
- *		if no failure occurs:	0
+ *              if no failure occurs: 0
  *
- * Programmer:	Binh-Minh Ribler (using C code segment for reporting tests)
- *		Friday, February 6, 2001
+ * Programmer   Binh-Minh Ribler (using C code segment for reporting tests)
+ *              Friday, February 6, 2001
  *
  * Modifications:
  *
@@ -68,12 +57,12 @@ int test_report( int nerrors, const H5std_string& testname )
    if (nerrors)
    {
       nerrors = MAX(1, nerrors);
-	if (1 == nerrors)
-	    cerr << "***** " << nerrors << testname
-					<< " TEST FAILED! *****" << endl;
-	else
-	    cerr << "***** " << nerrors << testname
-					<< " TESTS FAILED! *****" << endl;
+        if (1 == nerrors)
+            cerr << "***** " << nerrors << testname
+                 << " TEST FAILED! *****" << endl;
+        else
+            cerr << "***** " << nerrors << testname
+                 << " TESTS FAILED! *****" << endl;
       return 1;
    }
    else
@@ -84,68 +73,68 @@ int test_report( int nerrors, const H5std_string& testname )
 }
 
 /*-------------------------------------------------------------------------
- * Function:	issue_fail_msg
+ * Function:    issue_fail_msg
  *
- * Purpose:	Displays that a function has failed with its location.
+ * Purpose      Displays that a function has failed with its location.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (copied and modified macro CHECK from C)
- *		Monday, December 20, 2004
+ * Programmer   Binh-Minh Ribler (copied and modified macro CHECK from C)
+ *              Monday, December 20, 2004
  *
  *-------------------------------------------------------------------------
  */
 void issue_fail_msg(const char* where, int line, const char* file_name,
-		    const char* message)
+                    const char* message)
 {
-    //if (GetTestVerbosity()>=VERBO_HI)
+    if (GetTestVerbosity()>=VERBO_HI)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << ">>> FAILED in " << where << " at line " << line
              << " in " << file_name << " - " << message << endl << endl;
     }
 }
 
 /*-------------------------------------------------------------------------
- * Function:	issue_fail_msg
+ * Function:    issue_fail_msg
  *
- * Purpose:	Displays that a function has failed with its location.
+ * Purpose      Displays that a function has failed with its location.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (copied and modified macro CHECK from C)
- *		Monday, December 20, 2004
+ * Programmer   Binh-Minh Ribler (copied and modified macro CHECK from C)
+ *              Monday, December 20, 2004
  *
  *-------------------------------------------------------------------------
  */
 void issue_fail_msg(const char* where, int line, const char* file_name,
-		    const char* func_name, const char* message)
+                    const char* func_name, const char* message)
 {
-    //if (GetTestVerbosity()>=VERBO_HI)
+    if (GetTestVerbosity()>=VERBO_HI)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << ">>> FAILED in " << where << ": " << func_name << endl <<
-		"    at line " << line << " in " << file_name << endl <<
-		"    C library detail: " << message << endl << endl;
+                "    at line " << line << " in " << file_name << endl <<
+                "    C library detail: " << message << endl << endl;
     }
 }
 
 /*-------------------------------------------------------------------------
- * Function:	check_values
+ * Function:    check_values
  *
- * Purpose:	Checks a read value against the written value.  If they are
- *		different, the function will print out a message and the
- *		different values.  This function is made to reuse the code
- *		segment that is used in various places throughout
- *		the test code.  Where the C version of this code segment
- *		"goto error," this function will return -1.
+ * Purpose      Checks a read value against the written value.  If they are
+ *              different, the function will print out a message and the
+ *              different values.  This function is made to reuse the code
+ *              segment that is used in various places throughout
+ *              the test code.  Where the C version of this code segment
+ *              "goto error," this function will return -1.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler (using C code segment for checking values)
- *		Friday, February 6, 2001
+ * Programmer   Binh-Minh Ribler (using C code segment for checking values)
+ *              Friday, February 6, 2001
  *
  * Modifications:
  *
@@ -155,27 +144,53 @@ int check_values (hsize_t i, hsize_t j, int apoint, int acheck)
 {
     if (apoint != acheck)
     {
-	cerr << "    Read different values than written.\n" << endl;
-	cerr << "    At index " << (unsigned long)i << "," <<
-   	(unsigned long)j << endl;
-	return -1;
+        cerr << "    Read different values than written.\n" << endl;
+        cerr << "    At index " << static_cast<unsigned long>(i) << "," <<
+           static_cast<unsigned long>(j) << endl;
+        return -1;
     }
     return 0;
 } // check_values
 
 /*-------------------------------------------------------------------------
- * Function:	verify_val (const char*, const char*,...)
+ * Function:    check_values
+ *
+ * Purpose      Checks a char string pointer for NULL.  If it is NULL,
+ *              the function will print out a message
+ *
+ * Return       Success: 0
+ *
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler (using C code segment for checking values)
+ *              Friday, September 16, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+void check_values(const char *value, const char* msg, int line, const char* file_name)
+{
+    if (value == NULL)
+    {
+        cerr << endl;
+        cerr << "*** ERROR: " << msg << ", at line " << line << endl;
+        IncTestNumErrs();
+        throw TestFailedException(file_name, msg);
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    verify_val (const char*, const char*,...)
  *
- * Purpose:	Compares two character strings.  If they are
- *		different, the function will print out a message and the
- *		different values.
+ * Purpose      Compares two character strings.  If they are
+ *              different, the function will print out a message and the
+ *              different values.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
- *		May 2, 2010
+ * Programmer   Binh-Minh Ribler
+ *              May 2, 2010
  *
  * Modifications:
  *
@@ -208,14 +223,14 @@ InvalidActionException::InvalidActionException():Exception(){}
 //--------------------------------------------------------------------------
 // Function:    InvalidActionException overloaded constructor
 //
-// Purpose:	Creates an InvalidActionException with the name of the function,
+// Purpose      Creates an InvalidActionException with the name of the function,
 //              which the failure should have occurred but didn't, and a
-//		message explaining why it should fail.
+//              message explaining why it should fail.
 // Parameters
-//		func_name - IN: Name of the function where failure should occur
-//		message   - IN: Message
+//              func    - IN: Name of the function where failure should occur
+//              message - IN: Message
 //--------------------------------------------------------------------------
-InvalidActionException::InvalidActionException(const H5std_string func_name, const H5std_string message) : Exception(func_name, message) {}
+InvalidActionException::InvalidActionException(const H5std_string func, const H5std_string message) : Exception(func, message) {}
 
 //--------------------------------------------------------------------------
 // Function:    InvalidActionException destructor
@@ -230,14 +245,14 @@ TestFailedException::TestFailedException():Exception(){}
 //--------------------------------------------------------------------------
 // Function:    TestFailedException overloaded constructor
 //
-// Purpose:	Creates an TestFailedException with the name of the function,
+// Purpose      Creates an TestFailedException with the name of the function,
 //              which the failure should have occurred but didn't, and a
-//		message explaining why it should fail.
+//              message explaining why it should fail.
 // Parameters
-//		func_name - IN: Name of the function where failure should occur
-//		message   - IN: Message
+//              func    - IN: Name of the function where failure should occur
+//              message - IN: Message
 //--------------------------------------------------------------------------
-TestFailedException::TestFailedException(const H5std_string func_name, const H5std_string message) : Exception(func_name, message) {}
+TestFailedException::TestFailedException(const H5std_string func, const H5std_string message) : Exception(func, message) {}
 
 //--------------------------------------------------------------------------
 // Function:    TestFailedException destructor
diff --git a/c++/test/h5cpputil.h b/c++/test/h5cpputil.h
index b615194..18fd44f 100644
--- a/c++/test/h5cpputil.h
+++ b/c++/test/h5cpputil.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -26,40 +24,38 @@
 
 #include "h5test.h"
 
-#ifndef H5_NO_NAMESPACE
 using namespace H5;
-#endif
-
-#ifndef H5_NO_STD
 using std::cerr;
 using std::endl;
-#endif
 
 #define MESSAGE(V,A) {if (HDGetTestVerbosity()>(V)) print_func A;}
 #define SUBTEST(TEST) {printf("   Subtest: %-52s",TEST); fflush(stdout);}
 
 int check_values (hsize_t i, hsize_t j, int apoint, int acheck);
+void check_values(const char *value, const char* msg, int line, const char* file_name);
 int test_report (int, const H5std_string&);
 void issue_fail_msg(const char* where, int line, const char* file_name,
-		    const char* message="");
+                    const char* message="");
 void issue_fail_msg(const char* where, int line, const char* file_name,
-		    const char* func_name, const char* message);
+                    const char* func_name, const char* message);
 
 class InvalidActionException : public Exception {
    public:
-	InvalidActionException(const H5std_string func_name, const H5std_string message = DEFAULT_MSG);
-	InvalidActionException();
-	virtual ~InvalidActionException() throw();
+        InvalidActionException(const H5std_string func_name, const H5std_string message = DEFAULT_MSG);
+        InvalidActionException();
+        virtual ~InvalidActionException() throw();
 };
 
 class TestFailedException : public Exception {
    public:
-	TestFailedException(const H5std_string func_name, const H5std_string message = DEFAULT_MSG);
-	TestFailedException();
-	virtual ~TestFailedException() throw();
+        TestFailedException(const H5std_string func_name, const H5std_string message = DEFAULT_MSG);
+        TestFailedException();
+        virtual ~TestFailedException() throw();
 };
 
 // Overloaded/Template functions to verify values and display proper info
+
+// Verifies 
 void verify_val(const char* x, const char* value, const char* where, int line, const char* file_name);
 
 template <class Type1, class Type2>
@@ -67,18 +63,18 @@ template <class Type1, class Type2>
 {
     if (GetTestVerbosity()>=VERBO_HI)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "   Call to routine: " << where << " at line " << line
-	     << " in " << file_name <<  " had value " << x << endl;
+             << " in " << file_name <<  " had value " << x << endl;
     }
     if (x != value)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "*** UNEXPECTED VALUE from " << where << " should be "
-	     << value << ", but is " << x << " at line " << line
-	     << " in " << file_name << endl;
-	IncTestNumErrs();
-	throw TestFailedException(where, "");
+             << value << ", but is " << x << " at line " << line
+             << " in " << file_name << endl;
+        IncTestNumErrs();
+        throw TestFailedException(where, "");
     }
 }
 
@@ -87,12 +83,12 @@ template <class Type1, class Type2>
 {
     if (x != value)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "*** UNEXPECTED VALUE: " << file_name << ":line " << line
-	     << ":" << msg << " different: " << x << ", should be " << value
-	     << endl;
-	IncTestNumErrs();
-	throw TestFailedException(file_name, msg);
+             << ": " << msg << " different: " << x << ", should be " << value
+             << endl;
+        IncTestNumErrs();
+        throw TestFailedException(file_name, msg);
     }
 }
 
@@ -101,17 +97,17 @@ template <class Type1, class Type2>
 {
     if (GetTestVerbosity()>=VERBO_HI)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "   Call to routine: " << where << " at line " << line
-	     << " in " << file_name <<  " had value " << x << endl;
+             << " in " << file_name <<  " had value " << x << endl;
     }
     if (x == value)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "*** UNEXPECTED VALUE from " << where << " should not be "
-	     << value << " at line " << line << " in " << file_name << endl;
-	IncTestNumErrs();
-	throw TestFailedException(where, "");
+             << value << " at line " << line << " in " << file_name << endl;
+        IncTestNumErrs();
+        throw TestFailedException(where, "");
     }
 }
 
@@ -120,13 +116,26 @@ template <class Type1, class Type2>
 {
     if (x == value)
     {
-	cerr << endl;
+        cerr << endl;
         cerr << "*** Function " << msg << " FAILED at line " << line << endl;
-	IncTestNumErrs();
-	throw TestFailedException(file_name, msg);
+        IncTestNumErrs();
+        throw TestFailedException(file_name, msg);
     }
 }
 
+template <class Type1, class Type2>
+    void verify_val(Type1 x, Type2 value, float epsilon, const char* msg, int line, const char* file_name)
+{
+    if (x == value)
+    {
+        cerr << endl;
+        cerr << "*** UNEXPECTED FLOAT VALUE: " << file_name << ":line " << line
+             << ": " << msg << " different: " << x << ", should be " << value
+             << " (epsilon=" << epsilon << ")" << endl;
+        IncTestNumErrs();
+        throw TestFailedException(file_name, msg);
+    }
+}
 
 /* Prototypes for the test routines */
 #ifdef __cplusplus
@@ -140,6 +149,7 @@ void test_file();
 void test_filters();
 void test_links();
 void test_h5s();
+void test_iterate();
 void test_object();
 void test_reference();
 void test_types();
@@ -154,8 +164,9 @@ void cleanup_dsproplist();
 void cleanup_dsets();
 void cleanup_file();
 void cleanup_filters();
-void cleanup_links();
 void cleanup_h5s();
+void cleanup_iterate();
+void cleanup_links();
 void cleanup_object();
 void cleanup_reference();
 void cleanup_types();
@@ -169,7 +180,6 @@ void cleanup_vlstrings();
 void cleanup_select(void);
 void cleanup_time(void);
 void cleanup_vltypes(void);
-void cleanup_iterate(void);
 void cleanup_array(void);
 void cleanup_genprop(void);
 void cleanup_misc(void);
diff --git a/c++/test/tarray.cpp b/c++/test/tarray.cpp
index a6cbae4..a1de9c5 100644
--- a/c++/test/tarray.cpp
+++ b/c++/test/tarray.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,30 +16,23 @@
    tarray.cpp - HDF5 C++ testing the array datatype functionality
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 const H5std_string    FILENAME("tarray.h5");
+const H5std_string    ARRAYTYPE_NAME("/Array type 1");
 const int SPACE1_RANK = 1;
 const hsize_t SPACE1_DIM1 = 4;
 const int ARRAY1_RANK = 1;
@@ -60,12 +51,12 @@ typedef enum int_t {
 /*-------------------------------------------------------------------------
  * Function:    test_array_compound_array
  *
- * Purpose:     Tests 1-D array of compound datatypes (with array fields)
+ * Purpose      Tests 1-D array of compound datatypes (with array fields)
  *
- * Return:      None.
+ * Return       None.
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		January, 2016
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              January, 2016
  *
  * Modifications:
  *
@@ -83,7 +74,7 @@ static void test_array_compound_array()
     hsize_t sdims1[] = {SPACE1_DIM1};
     hsize_t tdims1[] = {ARRAY1_DIM1};
     int     nmemb;      // Number of compound members
-    int     ii;		// counting variables
+    int     ii;         // counting variables
     hsize_t idxi, idxj, idxk; // dimension indicing variables
     H5T_class_t mclass; // Datatype class for field
 
@@ -92,184 +83,197 @@ static void test_array_compound_array()
         for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) {
             wdata[idxi][idxj].i = idxi * 10 + idxj;
             for(idxk = 0; idxk < ARRAY1_DIM1; idxk++)
-	    {
+            {
                 float temp = idxi * 10.0 + idxj * 2.5 + idxk;
                 wdata[idxi][idxj].f[idxk] = temp;
-	    }
+            }
         } // end for
 
     try {
-	// Create File
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
+        // Create File
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
+
+        // Create dataspace for datasets
+        DataSpace space(SPACE1_RANK, sdims1, NULL);
+
+        /*
+         * Create an array datatype of compounds, arrtype.  Each compound
+         * datatype, comptype, contains an integer and an array of floats,
+         * arrfltype.
+         */
+
+        // Create a compound datatype
+        CompType comptype(sizeof(s1_t));
 
-	// Create dataspace for datasets
-	DataSpace space(SPACE1_RANK, sdims1, NULL);
+        // Insert integer field
+        comptype.insertMember("i", HOFFSET(s1_t, i), PredType::NATIVE_INT);
 
-	/*
-	 * Create an array datatype of compounds, arrtype.  Each compound
-	 * datatype, comptype, contains an integer and an array of floats,
-	 * arrfltype.
-	 */
+        // Create an array of floats datatype
+        ArrayType arrfltype(PredType::NATIVE_FLOAT, ARRAY1_RANK, tdims1);
 
-	// Create a compound datatype
-	CompType comptype(sizeof(s1_t));
+        // Insert float array field
+        comptype.insertMember("f", HOFFSET(s1_t, f), arrfltype);
 
-	// Insert integer field
-	comptype.insertMember("i", HOFFSET(s1_t, i), PredType::NATIVE_INT);
+        // Close array of floats field datatype
+        arrfltype.close();
 
-	// Create an array of floats datatype
-	ArrayType arrfltype(PredType::NATIVE_FLOAT, ARRAY1_RANK, tdims1);
+        // Create an array datatype of the compound datatype
+        ArrayType arrtype(comptype, ARRAY1_RANK, tdims1);
 
-	// Insert float array field
-	comptype.insertMember("f", HOFFSET(s1_t, f), arrfltype);
+        // Close compound datatype comptype
+        comptype.close();
 
-	// Close array of floats field datatype
-	arrfltype.close();
+        // Create a dataset
+        DataSet dataset = file1.createDataSet("Dataset1", arrtype, space);
 
-	// Create an array datatype of the compound datatype
-	ArrayType arrtype(comptype, ARRAY1_RANK, tdims1);
+        // Write dataset to disk
+        dataset.write(wdata, arrtype);
 
-	// Close compound datatype comptype
-	comptype.close();
+        // Test opening ArrayType with opening constructor (Dec 2016)
 
-	// Create a dataset
-	DataSet dataset = file1.createDataSet("Dataset1", arrtype, space);
-	dataset = file1.openDataSet("Dataset1");
+        // Commit the arrtype to give it a name
+        arrtype.commit(file1, ARRAYTYPE_NAME);
 
-	// Write dataset to disk
-	dataset.write(wdata, arrtype);
+        // Close it, then re-open with the opening constructor
+        arrtype.close();
+        ArrayType named_type(file1, ARRAYTYPE_NAME);
 
-	// Close all
-	dataset.close();
-	arrtype.close();
-	space.close();
-	file1.close();
+        // Get and verify the type's name
+        H5std_string type_name = named_type.getObjName();
+        verify_val(type_name, ARRAYTYPE_NAME, "DataType::getObjName tests constructor", __LINE__, __FILE__);
+        named_type.close();
 
-	// Re-open file
-	file1.openFile(FILENAME, H5F_ACC_RDONLY);
+        // Close all
+        dataset.close();
+        space.close();
+        file1.close();
 
-	// Open the dataset
-	dataset = file1.openDataSet("Dataset1");
+        // Re-open file
+        file1.openFile(FILENAME, H5F_ACC_RDONLY);
 
-	/*
-	 * Check the datatype array of compounds
-	 */
+        // Open the dataset
+        dataset = file1.openDataSet("Dataset1");
 
-	// Verify that it is an array of compounds
-	DataType dstype = dataset.getDataType();
-	mclass = dstype.getClass();
-	verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__);
+        /*
+         * Check the datatype array of compounds
+         */
 
-	dstype.close();
+        // Verify that it is an array of compounds
+        DataType dstype = dataset.getDataType();
+        mclass = dstype.getClass();
+        verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__);
 
-	// Get the array datatype to check
-	ArrayType atype_check = dataset.getArrayType();
+        dstype.close();
 
-	// Check the array rank
-	int ndims = atype_check.getArrayNDims();
-	verify_val(ndims, ARRAY1_RANK, "atype_check.getArrayNDims", __LINE__, __FILE__);
+        // Get the array datatype to check
+        ArrayType atype_check = dataset.getArrayType();
 
-	// Get the array dimensions
-	hsize_t rdims1[H5S_MAX_RANK];
-	atype_check.getArrayDims(rdims1);
+        // Check the array rank
+        int ndims = atype_check.getArrayNDims();
+        verify_val(ndims, ARRAY1_RANK, "atype_check.getArrayNDims", __LINE__, __FILE__);
 
-	// Check the array dimensions
-	for (ii =0; ii <ndims; ii++)
-	    if (rdims1[ii]!=tdims1[ii]) {
-		TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=z%d\n", ii, rdims1[ii], ii, tdims1[ii]);
+        // Get the array dimensions
+        hsize_t rdims1[H5S_MAX_RANK];
+        atype_check.getArrayDims(rdims1);
+
+        // Check the array dimensions
+        for (ii =0; ii <ndims; ii++)
+            if (rdims1[ii]!=tdims1[ii]) {
+                TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=z%d\n", ii, rdims1[ii], ii, tdims1[ii]);
             continue;
         } // end if
 
-	// Test ArrayType::ArrayType(const hid_t existing_id)
-	ArrayType new_arrtype(atype_check.getId());
+        // Test ArrayType::ArrayType(const hid_t existing_id)
+        ArrayType new_arrtype(atype_check.getId());
 
-	// Check the array rank
-	ndims = new_arrtype.getArrayNDims();
-	verify_val(ndims, ARRAY1_RANK, "new_arrtype.getArrayNDims", __LINE__, __FILE__);
+        // Check the array rank
+        ndims = new_arrtype.getArrayNDims();
+        verify_val(ndims, ARRAY1_RANK, "new_arrtype.getArrayNDims", __LINE__, __FILE__);
 
-	// Get the array dimensions
-	new_arrtype.getArrayDims(rdims1);
+        // Get the array dimensions
+        new_arrtype.getArrayDims(rdims1);
 
-	// Check the array dimensions
-	for (ii = 0; ii < ndims; ii++)
-	    if (rdims1[ii] != tdims1[ii]) {
-		TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=%zd\n", ii, rdims1[ii], ii, tdims1[ii]);
+        // Check the array dimensions
+        for (ii = 0; ii < ndims; ii++)
+            if (rdims1[ii] != tdims1[ii]) {
+                TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=%zd\n", ii, rdims1[ii], ii, tdims1[ii]);
             continue;
         } // end if
 
-	/*
-	 * Check the compound datatype and the array of floats datatype
-	 * in the compound.
-	 */
-	// Get the compound datatype, which is the base datatype of the
-	// array datatype atype_check.
-	DataType base_type = atype_check.getSuper();
-	mclass = base_type.getClass();
-	verify_val(mclass==H5T_COMPOUND, true, "atype_check.getClass", __LINE__, __FILE__);
-
-	// Verify the compound datatype info
-	CompType ctype_check(base_type.getId());
-	base_type.close();
-	
-	// Check the number of members
-	nmemb = ctype_check.getNmembers();
-	verify_val(nmemb, 2, "ctype_check.getNmembers", __LINE__, __FILE__);
-
-	// Check the 2nd field's name
-	H5std_string field2_name = ctype_check.getMemberName(1);
-	if (HDstrcmp(field2_name.c_str(),"f") != 0)
-	    TestErrPrintf("Compound field name doesn't match!, field2_name=%s\n",field2_name.c_str());
-
-	// Get the 2nd field's datatype
-	DataType f2_type = ctype_check.getMemberDataType(1);
-
-	// Get the 2nd field's class, this 2nd field should have an array type
-	mclass = f2_type.getClass();
-	verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__);
-	f2_type.close();
-
-	// Get the 2nd field, array of floats datatype, to check
-	ArrayType f2_atype_check = ctype_check.getMemberArrayType(1);
-
-	// Check the array rank
-	ndims = f2_atype_check.getArrayNDims();
-	verify_val(ndims, ARRAY1_RANK, "f2_atype_check.getArrayNDims", __LINE__, __FILE__);
-
-	// Get the array dimensions
-	HDmemset(rdims1, 0, H5S_MAX_RANK);
-	f2_atype_check.getArrayDims(rdims1);
-
-	// Check the array dimensions
-	for (ii = 0; ii < ndims; ii++)
-	    if (rdims1[ii] != tdims1[ii]) {
-		TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=%zd\n", ii, rdims1[ii], ii, tdims1[ii]);
-		continue;
-	    } // end if
-
-	// Close done datatypes
-	f2_atype_check.close();
-	ctype_check.close();
-
-	// Read dataset from disk
-	dataset.read(rdata, atype_check);
-
-	// Compare data read in
-	for (idxi = 0; idxi < SPACE1_DIM1; idxi++) {
-	    for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) {
-		if (wdata[idxi][idxj].i != rdata[idxi][idxj].i) {
-		    TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].i=%d, rdata[%d][%d].i=%d\n",idxi,idxj,wdata[idxi][idxj].i,idxi,idxj,rdata[idxi][idxj].i);
-		    continue;
-		} // end if
-	    } // end for
-	} // end for
-
-	// Close all
-	atype_check.close();
-	dataset.close();
-	file1.close();
+        /*
+         * Check the compound datatype and the array of floats datatype
+         * in the compound.
+         */
+        // Get the compound datatype, which is the base datatype of the
+        // array datatype atype_check.
+        DataType base_type = atype_check.getSuper();
+        mclass = base_type.getClass();
+        verify_val(mclass==H5T_COMPOUND, true, "atype_check.getClass", __LINE__, __FILE__);
+
+        // Verify the compound datatype info
+        CompType ctype_check(base_type.getId());
+        base_type.close();
+        
+        // Check the number of members
+        nmemb = ctype_check.getNmembers();
+        verify_val(nmemb, 2, "ctype_check.getNmembers", __LINE__, __FILE__);
+
+        // Check the 2nd field's name
+        H5std_string field2_name = ctype_check.getMemberName(1);
+        if (HDstrcmp(field2_name.c_str(),"f") != 0)
+            TestErrPrintf("Compound field name doesn't match!, field2_name=%s\n",field2_name.c_str());
+
+        // Get the 2nd field's datatype
+        DataType f2_type = ctype_check.getMemberDataType(1);
+
+        // Get the 2nd field's class, this 2nd field should have an array type
+        mclass = f2_type.getClass();
+        verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__);
+        f2_type.close();
+
+        // Get the 2nd field, array of floats datatype, to check
+        ArrayType f2_atype_check = ctype_check.getMemberArrayType(1);
+
+        // Check the array rank
+        ndims = f2_atype_check.getArrayNDims();
+        verify_val(ndims, ARRAY1_RANK, "f2_atype_check.getArrayNDims", __LINE__, __FILE__);
+
+        // Get the array dimensions
+        HDmemset(rdims1, 0, H5S_MAX_RANK);
+        f2_atype_check.getArrayDims(rdims1);
+
+        // Check the array dimensions
+        for (ii = 0; ii < ndims; ii++)
+            if (rdims1[ii] != tdims1[ii]) {
+                TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=%zd\n", ii, rdims1[ii], ii, tdims1[ii]);
+                continue;
+            } // end if
+
+        // Close done datatypes
+        f2_atype_check.close();
+        ctype_check.close();
+
+        // Read dataset from disk
+        dataset.read(rdata, atype_check);
+
+        // Compare data read in
+        for (idxi = 0; idxi < SPACE1_DIM1; idxi++) {
+            for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) {
+                if (wdata[idxi][idxj].i != rdata[idxi][idxj].i) {
+                    TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].i=%d, rdata[%d][%d].i=%d\n",idxi,idxj,wdata[idxi][idxj].i,idxi,idxj,rdata[idxi][idxj].i);
+                    continue;
+                } // end if
+            } // end for
+        } // end for
+
+        // Close all
+        atype_check.close();
+        dataset.close();
+        file1.close();
         PASSED();
     }   // end of try block
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_array_compound_array", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -279,15 +283,15 @@ static void test_array_compound_array()
 /*-------------------------------------------------------------------------
  * Function:    test_array_assignment
  *
- * Purpose:     Tests the operator=
+ * Purpose      Tests the operator=
  *
- * Return:      None.
+ * Return       None.
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		March, 2016
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              March, 2016
  *
  * Description:
- *		Used user's sample code in HDFFV-9562
+ *              Used user's sample code in HDFFV-9562
  *
  * Modifications:
  *
@@ -311,52 +315,174 @@ static void test_array_assignment()
     SUBTEST("ArrayType::operator=");
 
     try {
-	// Create File
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
+        // Create File
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
 
-	// Create dataspace for datasets
-	DataSpace space(SPACE1_RANK, sdims1, NULL);
+        // Create dataspace for datasets
+        DataSpace space(SPACE1_RANK, sdims1, NULL);
 
-	/*
-	 * Create an array datatype of compounds, arrtype.  Each compound
-	 * datatype, comptype, contains an integer and an array of floats,
-	 * arrfltype.
-	 */
+        /*
+         * Create an array datatype of compounds, arrtype.  Each compound
+         * datatype, comptype, contains an integer and an array of floats,
+         * arrfltype.
+         */
 
-	// Create a compound datatype
-	CompType comptype(static_cast<size_t>(24));
+        // Create a compound datatype
+        CompType comptype(static_cast<size_t>(24));
 
-	// Insert integer field
-	comptype.insertMember("i", 0, PredType::NATIVE_INT);
+        // Insert integer field
+        comptype.insertMember("i", 0, PredType::NATIVE_INT);
 
-	// Insert float array field
-	comptype.insertMember("a", 4, getArr());
+        // Insert float array field
+        comptype.insertMember("a", 4, getArr());
 
-	// Create a dataset
-	DataSet dataset = file1.createDataSet("Dataset1", comptype, space);
+        // Create a dataset
+        DataSet dataset = file1.createDataSet("Dataset1", comptype, space);
 
-	// Close all
-	dataset.close();
-	comptype.close();
-	space.close();
-	file1.close();
+        // Close all
+        dataset.close();
+        comptype.close();
+        space.close();
+        file1.close();
 
         PASSED();
     }   // end of try block
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_array_assignment", __LINE__, __FILE__, E.getCDetailMsg());
     }
 } // end test_array_assignment()
 
 

+/*-------------------------------------------------------------------------
+ * Function:    test_array_info
+ *
+ * Purpose      Tests getting array information using the const methods.
+ *
+ * Return       None.
+ *
+ * Programmer   Binh-Minh Ribler
+ *              April, 2016
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_array_info()
+{
+    SUBTEST("ArrayType Const Methods");
+    typedef struct {        // Typedef for compound datatype */
+        int i;
+        float f[ARRAY1_DIM1];
+    } s1_t;
+    s1_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   // Information to write
+    s1_t rdata[SPACE1_DIM1][ARRAY1_DIM1];   // Information read in
+    hsize_t sdims1[] = {SPACE1_DIM1};
+    hsize_t tdims1[] = {ARRAY1_DIM1};
+    int     nmemb;      // Number of compound members
+    int     ii;         // counting variables
+    hsize_t idxi, idxj, idxk; // dimension indicing variables
+    H5T_class_t mclass; // Datatype class for field
+
+    // Initialize array data to write
+    for (idxi =0; idxi < SPACE1_DIM1; idxi++)
+        for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) {
+            wdata[idxi][idxj].i = idxi * 10 + idxj;
+            for(idxk = 0; idxk < ARRAY1_DIM1; idxk++)
+            {
+                float temp = idxi * 10.0 + idxj * 2.5 + idxk;
+                wdata[idxi][idxj].f[idxk] = temp;
+            }
+        } // end for
+
+    try {
+        // Create File
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
+
+        // Create dataspace for datasets
+        DataSpace space(SPACE1_RANK, sdims1, NULL);
+
+        /*
+         * Create some array datatypes, then close the file.
+         */
+
+        // Create an array of floats datatype
+        ArrayType arrfltype(PredType::NATIVE_FLOAT, ARRAY1_RANK, tdims1);
+
+        // Create an array datatype of the compound datatype
+        ArrayType arrtype(PredType::NATIVE_UINT, ARRAY1_RANK, tdims1);
+
+        // Create a dataset
+        DataSet dataset = file1.createDataSet("Dataset1", arrtype, space);
+
+        // Write dataset to disk
+        dataset.write(wdata, arrtype);
+
+        // Close array of floats field datatype
+        arrfltype.close();
+
+        // Close all
+        dataset.close();
+        arrtype.close();
+        space.close();
+        file1.close();
+
+        // Re-open file
+        file1.openFile(FILENAME, H5F_ACC_RDONLY);
+
+        // Open the dataset
+        dataset = file1.openDataSet("Dataset1");
+
+        /*
+         * Check the datatype array of compounds
+         */
+
+        // Verify that it is an array of compounds
+        DataType dstype = dataset.getDataType();
+        mclass = dstype.getClass();
+        verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__);
+
+        dstype.close();
+
+        { // Let atype_check go out of scope
+        // Get the array datatype, declared as const
+        const ArrayType atype_check = dataset.getArrayType();
+
+        // Check the array rank with the const method
+        int ndims = atype_check.getArrayNDims();
+        verify_val(ndims, ARRAY1_RANK, "atype_check.getArrayNDims", __LINE__, __FILE__);
+
+        // Get the array dimensions with the const method
+        hsize_t rdims1[H5S_MAX_RANK];
+        atype_check.getArrayDims(rdims1);
+
+        // Check the array dimensions
+        for (ii =0; ii <ndims; ii++)
+            if (rdims1[ii]!=tdims1[ii]) {
+                TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%zd, tdims1[%d]=z%d\n", ii, rdims1[ii], ii, tdims1[ii]);
+            continue;
+        } // end if
+        }
+
+        // Close all
+        dataset.close();
+        file1.close();
+        PASSED();
+    }   // end of try block
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_array_info", __LINE__, __FILE__, E.getCDetailMsg());
+    }
+
+} // end test_array_info()
+
+

 /****************************************************************
 **
 **  test_array(): Main datatypes testing routine.
 **
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_array()
 {
     // Output message about test being performed
@@ -368,26 +494,27 @@ void test_array()
     // Test operator= (HDFFV-9562)
     test_array_assignment();
 
+    // Test const functions (HDFFV-9725)
+    test_array_info();
+
 }   // test_array()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_array
+ * Function:    cleanup_array
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		January, 2016
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              January, 2016
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_array()
 {
     HDremove(FILENAME.c_str());
diff --git a/c++/test/tattr.cpp b/c++/test/tattr.cpp
index 936ee63..d1a0d67 100644
--- a/c++/test/tattr.cpp
+++ b/c++/test/tattr.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -19,37 +17,29 @@
         C attribute interface (H5A)
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
-
-#include "H5Cpp.h"	// C++ API header file
+using std::cerr;
+using std::endl;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#include "h5cpputil.h"	// C++ utilility header file
+#include "h5test.h"
+#include "h5cpputil.h"  // C++ utilility header file
 
-const H5std_string	FILE_BASIC("tattr_basic.h5");
-const H5std_string	FILE_COMPOUND("tattr_compound.h5");
-const H5std_string	FILE_SCALAR("tattr_scalar.h5");
-const H5std_string	FILE_MULTI("tattr_multi.h5");
-const H5std_string	FILE_DTYPE("tattr_dtype.h5");
-const H5std_string	ATTR_TMP_NAME("temp_attr_name");
-const H5std_string	FATTR_TMP_NAME("temp_fattr_name");
-const size_t		ATTR_MAX_DIMS = 7;
+const H5std_string FILE_BASIC("tattr_basic.h5");
+const H5std_string FILE_COMPOUND("tattr_compound.h5");
+const H5std_string FILE_SCALAR("tattr_scalar.h5");
+const H5std_string FILE_MULTI("tattr_multi.h5");
+const H5std_string FILE_DTYPE("tattr_dtype.h5");
+const H5std_string ATTR_TMP_NAME("temp_attr_name");
+const H5std_string FATTR_TMP_NAME("temp_fattr_name");
+const size_t ATTR_MAX_DIMS = 7;
 
 /* 3-D dataset with fixed dimensions */
 const int SPACE1_RANK = 3;
@@ -105,7 +95,7 @@ struct attr4_struct {
 
 const H5std_string ATTR5_NAME("Attr5");
 const int ATTR5_RANK = 0;
-float attr_data5 = (float)-5.123;    	// Test data for 5th attribute
+float attr_data5 = (float)-5.123;     // Test data for 5th attribute
 
 /* Info for another attribute */
 const H5std_string ATTR1A_NAME("Attr1_a");
@@ -129,116 +119,117 @@ static void test_attr_basic_write()
     SUBTEST("Basic Attribute Writing Functions");
 
     try {
-	// Create file
-	H5File fid1 (FILE_BASIC, H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1 (FILE_BASIC, H5F_ACC_TRUNC);
 
-	// Create dataspace for dataset
-	DataSpace ds_space (SPACE1_RANK, dims1);
+        // Create dataspace for dataset
+        DataSpace ds_space (SPACE1_RANK, dims1);
 
-	/*
-	 *		Test attribute with dataset
-	 */
+        /*
+         *                Test attribute with dataset
+         */
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space);
 
-	// Create dataspace for attribute
-	DataSpace att_space (ATTR1_RANK, dims2);
+        // Create dataspace for attribute
+        DataSpace att_space (ATTR1_RANK, dims2);
 
-	// Create a file attribute
-	Attribute file_attr2 = fid1.createAttribute (FATTR1_NAME, PredType::NATIVE_INT, att_space);
+        // Create a file attribute
+        Attribute file_attr2 = fid1.createAttribute (FATTR1_NAME, PredType::NATIVE_INT, att_space);
 
-	// Create a file attribute
-	Attribute file_attr1 = fid1.createAttribute (FATTR2_NAME, PredType::NATIVE_INT, att_space);
+        // Create a file attribute
+        Attribute file_attr1 = fid1.createAttribute (FATTR2_NAME, PredType::NATIVE_INT, att_space);
 
-	// Create an attribute for the dataset
-	Attribute ds_attr1 = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
+        // Create an attribute for the dataset
+        Attribute ds_attr1 = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
 
-	// Try creating an attribute that already exists.  This should fail
-	// since two attributes cannot have the same name.  If an exception
-	// is not thrown for this action by createAttribute, then throw an
-	// invalid action exception.
-	try {
-	    Attribute invalid_attr = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
+        // Try creating an attribute that already exists.  This should fail
+        // since two attributes cannot have the same name.  If an exception
+        // is not thrown for this action by createAttribute, then throw an
+        // invalid action exception.
+        try {
+            Attribute invalid_attr = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
 
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
-	}
-	catch (AttributeIException E) // catching invalid creating attribute
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
+        }
+        catch (AttributeIException& E) // catching invalid creating attribute
         {} // do nothing, exception expected
 
-	// Write attribute information
-	ds_attr1.write (PredType::NATIVE_INT, attr_data1);
+        // Write attribute information
+        ds_attr1.write (PredType::NATIVE_INT, attr_data1);
 
-	// Read attribute information immediately, without closing attribute
-	ds_attr1.read (PredType::NATIVE_INT, read_data1);
+        // Read attribute information immediately, without closing attribute
+        ds_attr1.read (PredType::NATIVE_INT, read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
-	    if(attr_data1[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
+            if(attr_data1[i]!=read_data1[i])
+                TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
 
-	// Create two more attributes for this dataset, but only write to one.
-	Attribute ds_attr2 = dataset.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, att_space);
-	Attribute ds_attr3 = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_INT, att_space);
+        // Create two more attributes for this dataset, but only write to one.
+        Attribute ds_attr2 = dataset.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, att_space);
+        Attribute ds_attr3 = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_INT, att_space);
 
-	// Write attribute information
-	ds_attr2.write (PredType::NATIVE_INT, attr_data1a);
+        // Write attribute information
+        ds_attr2.write (PredType::NATIVE_INT, attr_data1a);
 
-	// Read attribute information immediately, without closing attribute
-	ds_attr2.read (PredType::NATIVE_INT, read_data1);
+        // Read attribute information immediately, without closing attribute
+        ds_attr2.read (PredType::NATIVE_INT, read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
-	    if(attr_data1a[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1a[i],i,read_data1[i]);
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
+            if(attr_data1a[i]!=read_data1[i])
+                TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1a[i],i,read_data1[i]);
 
-	// Close both attributes
-	ds_attr1.close();
-	ds_attr2.close();
-	ds_attr3.close();
+        // Close both attributes
+        ds_attr1.close();
+        ds_attr2.close();
+        ds_attr3.close();
 
-	/*
-	 *		Test attribute with group
-	 */
+        /*
+         *                Test attribute with group
+         */
 
-	// Create group in file fid1
-	Group group = fid1.createGroup (GROUP1_NAME);
+        // Create group in file fid1
+        Group group = fid1.createGroup (GROUP1_NAME);
 
-	// Create dataspace for attribute
-	DataSpace sid3(ATTR2_RANK, dims3);
+        // Create dataspace for attribute
+        DataSpace sid3(ATTR2_RANK, dims3);
 
-	// Create an attribute for the group
-	Attribute gr_attr = group.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, sid3);
+        // Create an attribute for the group
+        Attribute gr_attr = group.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, sid3);
 
-	// Check storage size for attribute
-	hsize_t attr_size = gr_attr.getStorageSize();
-	verify_val((long)attr_size, (long)(ATTR2_DIM1*ATTR2_DIM2*sizeof(int)),
-			"Attribute::getStorageSize",__LINE__,__FILE__);
+        // Check storage size for attribute
+        hsize_t attr_size = gr_attr.getStorageSize();
+        verify_val((long)attr_size, (long)(ATTR2_DIM1*ATTR2_DIM2*sizeof(int)),
+                "Attribute::getStorageSize",__LINE__,__FILE__);
 
-	// Try to create the same attribute again (should fail)
-	try {
-	    Attribute invalid_attr = group.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, sid3);
+        // Try to create the same attribute again (should fail)
+        try {
+            Attribute invalid_attr = group.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, sid3);
             // continuation here, that means no exception has been thrown
             throw InvalidActionException("H5Group::createAttribute",
-			"Attempting to create an existing attribute");
-	}
-        catch (AttributeIException E) // catching invalid creating attribute
+                "Attempting to create an existing attribute");
+        }
+        catch (AttributeIException& E) // catching invalid creating attribute
         {} // do nothing, exception expected
 
-	// Write attribute information
-	gr_attr.write (PredType::NATIVE_INT, attr_data2);
+        // Write attribute information
+        gr_attr.write (PredType::NATIVE_INT, attr_data2);
 
-	// Check storage size for attribute
-	attr_size = gr_attr.getStorageSize();
-	verify_val((long)attr_size, (long)(ATTR2_DIM1*ATTR2_DIM2*sizeof(int)),
-			"Attribute::getStorageSize",  __LINE__, __FILE__);
+        // Check storage size for attribute
+        attr_size = gr_attr.getStorageSize();
+        verify_val((long)attr_size, (long)(ATTR2_DIM1*ATTR2_DIM2*sizeof(int)),
+                "Attribute::getStorageSize",  __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_basic_write()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_basic_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_basic_write()
 
@@ -255,14 +246,14 @@ static void test_attr_basic_write()
 **  B. ssize_t Attribute::getName(H5std_string& attr_name, size_t buf_size)
 **    1. With buffer smaller than the actual name
 **    2. Same test but with retiring overloaded function
-**	ssize_t Attribute::getName(size_t buf_size, H5std_string& attr_name)
+**        ssize_t Attribute::getName(size_t buf_size, H5std_string& attr_name)
 **
 **  C. H5std_string Attribute::getName()
 **
 **  D. H5std_string Attribute::getName(size_t len)
 **
 **  E. ssize_t Attribute::getName(H5std_string& attr_name, size_t buf_size)
-**	With buffer size equals the name's length, i.e., buf_size=0
+**        With buffer size equals the name's length, i.e., buf_size=0
 **
 ****************************************************************/
 static void test_attr_getname()
@@ -271,108 +262,109 @@ static void test_attr_getname()
     SUBTEST("Testing all overloads of Attribute::getName");
 
     try {
-	//
-	// Open the file FILE_BASIC and test getName with its attribute
-	//
-
-	// Open file
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
-
-	// Check for existence of attribute FATTR1_NAME
-	bool attr_exists = fid1.attrExists(FATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
-
-	// Open attribute 
-	Attribute fattr1(fid1.openAttribute(FATTR1_NAME));
-
-	// A. Get attribute name with
-	// ssize_t Attribute::getName(char* attr_name, size_t buf_size)
-	// using different buffer sizes and verify against FATTR1_NAME (3 cases)
-
-	// 1. With arbitrary buf_size that is larger than the name size
-	size_t buf_size = FATTR1_NAME.length() + 10;
-	char* fattr1_name = new char[buf_size+1];
-	HDmemset(fattr1_name, 0, buf_size+1);
-	ssize_t name_size = 0; // actual length of attribute name
-	name_size = fattr1.getName(fattr1_name, buf_size+1);
-	CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
-	verify_val((size_t)name_size, FATTR1_NAME.length(), "Attribute::getName", __LINE__, __FILE__);
-	verify_val((const char*)fattr1_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
-	delete []fattr1_name;
-
-	// 2. With arbitrary buf_size that is smaller than the name's length.
-	// Let's try 4 first characters in the name.
-	buf_size = 4;
-	char short_name[5] = "File"; // to verify the read name
-	fattr1_name = new char[buf_size+1];
-	HDmemset(fattr1_name, 0, buf_size+1);
-	name_size = fattr1.getName(fattr1_name, buf_size+1);
-	CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
-	verify_val((size_t)name_size, FATTR1_NAME.size(), "Attribute::getName", __LINE__, __FILE__);
-	verify_val((const char*)fattr1_name, (const char*)short_name, "Attribute::getName", __LINE__, __FILE__);
-	delete []fattr1_name;
-
-	// 3. With a buf_size that equals the name's length.
-	buf_size = FATTR1_NAME.length();
-	fattr1_name = new char[buf_size+1];
-	HDmemset(fattr1_name, 0, buf_size+1);
-	name_size = fattr1.getName(fattr1_name, buf_size+1);
-	CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
-	verify_val(fattr1_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
-	delete []fattr1_name;
-
-	// B. Get attribute name with
-	// ssize_t Attribute::getName(H5std_string& attr_name, size_t buf_size)
-	// using buffer smaller than the actual name
-	buf_size = 4;
-	H5std_string fattr1_name2;
-	name_size = fattr1.getName(fattr1_name2, buf_size);
-	verify_val(fattr1_name2, "File", "Attribute::getName", __LINE__, __FILE__);
-
-	// Same test as above, but with deprecated overloaded function
-	// ssize_t Attribute::getName(size_t buf_size, H5std_string& attr_name)
-	// using buffer smaller than the actual name
-	H5std_string fattr1_name2a;
-	name_size = fattr1.getName(fattr1_name2a, buf_size);
-	verify_val(fattr1_name2a, "File", "Attribute::getName", __LINE__, __FILE__);
-
-	// C. Get file attribute's name with
-	// H5std_string Attribute::getName()
-	H5std_string fattr1_name3 = fattr1.getName();
-	verify_val(fattr1_name3, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
-
-	//
-	// D. Test getName getting part of an attribute's name using
-	// H5std_string Attribute::getName(len)
-	//
-
-	// Open dataset DSET1_NAME
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
-
-	// Check for existence of attribute
-	attr_exists = dataset.attrExists(ATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
-
-	// Open attribute
-	Attribute attr1(dataset.openAttribute(ATTR1_NAME));
-
-	size_t len = 4;
-	H5std_string dattr_name1 = attr1.getName(len);
-	verify_val(dattr_name1, "Attr", "Attribute::getName", __LINE__, __FILE__);
-
-	// E. Get dataset's attribute name with
-	// H5std_string Attribute::getName(H5std_string attr_name, buf_size=0)
-	H5std_string dattr_name2;
-	name_size = attr1.getName(dattr_name2);
-	verify_val(dattr_name2, ATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
-
-	PASSED();
+        //
+        // Open the file FILE_BASIC and test getName with its attribute
+        //
+
+        // Open file
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+
+        // Check for existence of attribute FATTR1_NAME
+        bool attr_exists = fid1.attrExists(FATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+
+        // Open attribute 
+        Attribute fattr1(fid1.openAttribute(FATTR1_NAME));
+
+        // A. Get attribute name with
+        // ssize_t Attribute::getName(char* attr_name, size_t buf_size)
+        // using different buffer sizes and verify against FATTR1_NAME (3 cases)
+
+        // 1. With arbitrary buf_size that is larger than the name size
+        size_t buf_size = FATTR1_NAME.length() + 10;
+        char* fattr1_name = new char[buf_size+1];
+        HDmemset(fattr1_name, 0, buf_size+1);
+        ssize_t name_size = 0; // actual length of attribute name
+        name_size = fattr1.getName(fattr1_name, buf_size+1);
+        CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
+        verify_val((size_t)name_size, FATTR1_NAME.length(), "Attribute::getName", __LINE__, __FILE__);
+        verify_val((const char*)fattr1_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+        delete []fattr1_name;
+
+        // 2. With arbitrary buf_size that is smaller than the name's length.
+        // Let's try 4 first characters in the name.
+        buf_size = 4;
+        char short_name[5] = "File"; // to verify the read name
+        fattr1_name = new char[buf_size+1];
+        HDmemset(fattr1_name, 0, buf_size+1);
+        name_size = fattr1.getName(fattr1_name, buf_size+1);
+        CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
+        verify_val((size_t)name_size, FATTR1_NAME.size(), "Attribute::getName", __LINE__, __FILE__);
+        verify_val((const char*)fattr1_name, (const char*)short_name, "Attribute::getName", __LINE__, __FILE__);
+        delete []fattr1_name;
+
+        // 3. With a buf_size that equals the name's length.
+        buf_size = FATTR1_NAME.length();
+        fattr1_name = new char[buf_size+1];
+        HDmemset(fattr1_name, 0, buf_size+1);
+        name_size = fattr1.getName(fattr1_name, buf_size+1);
+        CHECK(name_size, FAIL, "Attribute::getName", __LINE__, __FILE__);
+        verify_val(fattr1_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+        delete []fattr1_name;
+
+        // B. Get attribute name with
+        // ssize_t Attribute::getName(H5std_string& attr_name, size_t buf_size)
+        // using buffer smaller than the actual name
+        buf_size = 4;
+        H5std_string fattr1_name2;
+        name_size = fattr1.getName(fattr1_name2, buf_size);
+        verify_val(fattr1_name2, "File", "Attribute::getName", __LINE__, __FILE__);
+
+        // Same test as above, but with deprecated overloaded function
+        // ssize_t Attribute::getName(size_t buf_size, H5std_string& attr_name)
+        // using buffer smaller than the actual name
+        H5std_string fattr1_name2a;
+        name_size = fattr1.getName(fattr1_name2a, buf_size);
+        verify_val(fattr1_name2a, "File", "Attribute::getName", __LINE__, __FILE__);
+
+        // C. Get file attribute's name with
+        // H5std_string Attribute::getName()
+        H5std_string fattr1_name3 = fattr1.getName();
+        verify_val(fattr1_name3, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+
+        //
+        // D. Test getName getting part of an attribute's name using
+        // H5std_string Attribute::getName(len)
+        //
+
+        // Open dataset DSET1_NAME
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
+
+        // Check for existence of attribute
+        attr_exists = dataset.attrExists(ATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+
+        // Open attribute
+        Attribute attr1(dataset.openAttribute(ATTR1_NAME));
+
+        size_t len = 4;
+        H5std_string dattr_name1 = attr1.getName(len);
+        verify_val(dattr_name1, "Attr", "Attribute::getName", __LINE__, __FILE__);
+
+        // E. Get dataset's attribute name with
+        // H5std_string Attribute::getName(H5std_string attr_name, buf_size=0)
+        H5std_string dattr_name2;
+        name_size = attr1.getName(dattr_name2);
+        verify_val(dattr_name2, ATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_getname()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_getname()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_getname()
 
@@ -390,99 +382,100 @@ static void test_attr_rename()
     SUBTEST("Checking for Existence and Renaming Attribute");
 
     try {
-	// Open file
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
 
-	// Check and rename attribute belonging to a file
+        // Check and rename attribute belonging to a file
 
-	// Check for existence of attribute
-	bool attr_exists = fid1.attrExists(FATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+        // Check for existence of attribute
+        bool attr_exists = fid1.attrExists(FATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
 
-	// Change attribute name
-	fid1.renameAttr(FATTR1_NAME, FATTR_TMP_NAME);
+        // Change attribute name
+        fid1.renameAttr(FATTR1_NAME, FATTR_TMP_NAME);
 
-	// Open attribute again
-	Attribute fattr1(fid1.openAttribute(FATTR_TMP_NAME));
+        // Open attribute again
+        Attribute fattr1(fid1.openAttribute(FATTR_TMP_NAME));
 
-	// Verify new attribute name
-	H5std_string fattr_name = fattr1.getName();
-	verify_val(fattr_name, FATTR_TMP_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify new attribute name
+        H5std_string fattr_name = fattr1.getName();
+        verify_val(fattr_name, FATTR_TMP_NAME, "Attribute::getName", __LINE__, __FILE__);
 
-	int num_attrs = fid1.getNumAttrs();
-	verify_val(num_attrs, 2, "Attribute::getNumAttrs", __LINE__, __FILE__);
+        int num_attrs = fid1.getNumAttrs();
+        verify_val(num_attrs, 2, "Attribute::getNumAttrs", __LINE__, __FILE__);
 
-	// Change first file attribute back to the original name
-	fid1.renameAttr(FATTR_TMP_NAME, FATTR1_NAME);
+        // Change first file attribute back to the original name
+        fid1.renameAttr(FATTR_TMP_NAME, FATTR1_NAME);
 
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Check and rename attribute belonging to a dataset
+        // Check and rename attribute belonging to a dataset
 
-	// Check for existence of attribute
-	attr_exists = dataset.attrExists(ATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+        // Check for existence of attribute
+        attr_exists = dataset.attrExists(ATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
 
-	// Change attribute name
-	dataset.renameAttr(ATTR1_NAME, ATTR_TMP_NAME);
+        // Change attribute name
+        dataset.renameAttr(ATTR1_NAME, ATTR_TMP_NAME);
 
-	// Open attribute again
-	Attribute attr1(dataset.openAttribute(ATTR_TMP_NAME));
+        // Open attribute again
+        Attribute attr1(dataset.openAttribute(ATTR_TMP_NAME));
 
-	// Verify new attribute name
-	H5std_string attr_name = attr1.getName();
-	verify_val(attr_name, ATTR_TMP_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify new attribute name
+        H5std_string attr_name = attr1.getName();
+        verify_val(attr_name, ATTR_TMP_NAME, "Attribute::getName", __LINE__, __FILE__);
 
-	// Read attribute information immediately, without closing attribute
-	attr1.read (PredType::NATIVE_INT, read_data1);
+        // Read attribute information immediately, without closing attribute
+        attr1.read (PredType::NATIVE_INT, read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
-	    if(attr_data1[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
+            if(attr_data1[i]!=read_data1[i])
+                TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
 
-	// Close attribute
-    	attr1.close();
+        // Close attribute
+            attr1.close();
 
-	// Check for existence of second attribute
-	attr_exists = dataset.attrExists(ATTR2_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+        // Check for existence of second attribute
+        attr_exists = dataset.attrExists(ATTR2_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
 
-	// Open the second attribute
-	Attribute attr2(dataset.openAttribute(ATTR2_NAME));
+        // Open the second attribute
+        Attribute attr2(dataset.openAttribute(ATTR2_NAME));
 
-	// Verify second attribute name
-	H5std_string attr2_name = attr2.getName();
-	verify_val(attr2_name, ATTR2_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify second attribute name
+        H5std_string attr2_name = attr2.getName();
+        verify_val(attr2_name, ATTR2_NAME, "Attribute::getName", __LINE__, __FILE__);
 
-	// Read attribute information immediately, without closing attribute
-	attr2.read (PredType::NATIVE_INT, read_data1);
+        // Read attribute information immediately, without closing attribute
+        attr2.read (PredType::NATIVE_INT, read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
-	    if(attr_data1a[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1a[i],i,read_data1[i]);
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
+            if(attr_data1a[i]!=read_data1[i])
+                TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1a[i],i,read_data1[i]);
 
-	// Close attribute
-	attr2.close();
+        // Close attribute
+        attr2.close();
 
-	// Change first attribute back to the original name
-	dataset.renameAttr(ATTR_TMP_NAME, ATTR1_NAME);
+        // Change first attribute back to the original name
+        dataset.renameAttr(ATTR_TMP_NAME, ATTR1_NAME);
 
-	// Check for existence of attribute after renaming
-	attr_exists = dataset.attrExists(ATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
+        // Check for existence of attribute after renaming
+        attr_exists = dataset.attrExists(ATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "Attribute should exist but does not");
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_rename()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_rename()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_rename()
 
@@ -499,58 +492,59 @@ static void test_attr_basic_read()
     SUBTEST("Basic Attribute Reading Functions");
 
     try {
-	// Open file
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
 
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Verify the correct number of attributes
-	int num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        int num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open an attribute for the dataset
-	Attribute ds_attr=dataset.openAttribute(ATTR1_NAME);
+        // Open an attribute for the dataset
+        Attribute ds_attr=dataset.openAttribute(ATTR1_NAME);
 
-	// Read attribute information
-	int read_data1[ATTR1_DIM1]={0}; // Buffer for reading 1st attribute
-	ds_attr.read(PredType::NATIVE_INT, &read_data1);
+        // Read attribute information
+        int read_data1[ATTR1_DIM1]={0}; // Buffer for reading 1st attribute
+        ds_attr.read(PredType::NATIVE_INT, &read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
             if(attr_data1[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
+                TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
 
-	/*
-	 *		Test attribute with group
-	 */
-	// Open the group
-	Group group = fid1.openGroup(GROUP1_NAME);
+        /*
+         *                Test attribute with group
+         */
+        // Open the group
+        Group group = fid1.openGroup(GROUP1_NAME);
 
-	// Verify the correct number of attributes
-	num_attrs = group.getNumAttrs();
-	verify_val(num_attrs, 1, "H5Group::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        num_attrs = group.getNumAttrs();
+        verify_val(num_attrs, 1, "H5Group::getNumAttrs", __LINE__, __FILE__);
 
-	// Open an attribute for the group
-	Attribute gr_attr = group.openAttribute(ATTR2_NAME);
+        // Open an attribute for the group
+        Attribute gr_attr = group.openAttribute(ATTR2_NAME);
 
-	// Buffer for reading 2nd attribute
-	int read_data2[ATTR2_DIM1][ATTR2_DIM2]={{0}};
+        // Buffer for reading 2nd attribute
+        int read_data2[ATTR2_DIM1][ATTR2_DIM2]={{0}};
 
-	// Read attribute information
-	gr_attr.read(PredType::NATIVE_INT, read_data2);
+        // Read attribute information
+        gr_attr.read(PredType::NATIVE_INT, read_data2);
 
-	// Verify values read in
-	for(i=0; i<ATTR2_DIM1; i++)
+        // Verify values read in
+        for(i=0; i<ATTR2_DIM1; i++)
             for(j=0; j<ATTR2_DIM2; j++)
-        	if(attr_data2[i][j]!=read_data2[i][j]) {
-		    TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n",__LINE__, i,j,attr_data2[i][j],i,j,read_data2[i][j]);
-		}
-	PASSED();
+                if(attr_data2[i][j]!=read_data2[i][j]) {
+                    TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n",__LINE__, i,j,attr_data2[i][j],i,j,read_data2[i][j]);
+                }
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_basic_read()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_basic_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_basic_read()
 
@@ -562,54 +556,55 @@ static void test_attr_basic_read()
 static void test_attr_compound_write()
 {
 
-	// Output message about test being performed
+        // Output message about test being performed
     SUBTEST("Multiple Attribute Functions");
 
     try {
-	// Create file
-	H5File fid1(FILE_COMPOUND.c_str(), H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1(FILE_COMPOUND.c_str(), H5F_ACC_TRUNC);
 
-	// Create dataspace for dataset
-	hsize_t		dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
-	DataSpace sid1(SPACE1_RANK, dims1);
+        // Create dataspace for dataset
+        hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
+        DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR,sid1);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR,sid1);
 
-	// Create the attribute datatype.
-	CompType comp_type(sizeof(struct attr4_struct));
+        // Create the attribute datatype.
+        CompType comp_type(sizeof(struct attr4_struct));
 
-	attr4_field1_off = HOFFSET(struct attr4_struct, i);
-	comp_type.insertMember(ATTR4_FIELDNAME1, attr4_field1_off, PredType::NATIVE_INT);
+        attr4_field1_off = HOFFSET(struct attr4_struct, i);
+        comp_type.insertMember(ATTR4_FIELDNAME1, attr4_field1_off, PredType::NATIVE_INT);
 
-	attr4_field2_off = HOFFSET(struct attr4_struct, d);
-	comp_type.insertMember(ATTR4_FIELDNAME2, attr4_field2_off, PredType::NATIVE_DOUBLE);
+        attr4_field2_off = HOFFSET(struct attr4_struct, d);
+        comp_type.insertMember(ATTR4_FIELDNAME2, attr4_field2_off, PredType::NATIVE_DOUBLE);
 
-	attr4_field3_off = HOFFSET(struct attr4_struct, c);
-	comp_type.insertMember(ATTR4_FIELDNAME3, attr4_field3_off, PredType::NATIVE_SCHAR);
+        attr4_field3_off = HOFFSET(struct attr4_struct, c);
+        comp_type.insertMember(ATTR4_FIELDNAME3, attr4_field3_off, PredType::NATIVE_SCHAR);
 
-	// Create dataspace for 1st attribute
-	hsize_t		dims2[] = {ATTR4_DIM1,ATTR4_DIM2};
-	DataSpace sid2(ATTR4_RANK, dims2);
+        // Create dataspace for 1st attribute
+        hsize_t dims2[] = {ATTR4_DIM1,ATTR4_DIM2};
+        DataSpace sid2(ATTR4_RANK, dims2);
 
-	// Create complex attribute for the dataset
-	Attribute attr = dataset.createAttribute(ATTR4_NAME, comp_type, sid2);
+        // Create complex attribute for the dataset
+        Attribute attr = dataset.createAttribute(ATTR4_NAME, comp_type, sid2);
 
-	// Try to create the same attribute again (should fail)
-	try {
-	    Attribute invalid_attr = dataset.createAttribute (ATTR4_NAME, comp_type, sid2);
-	}
-        catch (AttributeIException E) // catching invalid creating attribute
+        // Try to create the same attribute again (should fail)
+        try {
+            Attribute invalid_attr = dataset.createAttribute (ATTR4_NAME, comp_type, sid2);
+        }
+        catch (AttributeIException& E) // catching invalid creating attribute
         {} // do nothing, exception expected
 
-	// Write complex attribute data
-	attr.write(comp_type, attr_data4);
+        // Write complex attribute data
+        attr.write(comp_type, attr_data4);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_compound_write()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_compound_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_compound_write()
 
@@ -620,7 +615,7 @@ static void test_attr_compound_write()
 ****************************************************************/
 static void test_attr_compound_read()
 {
-    hsize_t dims[ATTR_MAX_DIMS];	// Attribute dimensions
+    hsize_t dims[ATTR_MAX_DIMS];        // Attribute dimensions
     size_t      size;   // Attribute datatype size as stored in file
     size_t      offset; // Attribute datatype field offset
     struct attr4_struct read_data4[ATTR4_DIM1][ATTR4_DIM2]; // Buffer for reading 4th attribute
@@ -629,137 +624,139 @@ static void test_attr_compound_read()
     SUBTEST("Basic Attribute Functions");
 
     try {
-	// Open file
-	H5File fid1(FILE_COMPOUND, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(FILE_COMPOUND, H5F_ACC_RDWR);
 
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Verify the correct number of attributes
-	int num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        int num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open 1st attribute for the dataset
-	Attribute attr = dataset.openAttribute((unsigned)0);
+        // Open 1st attribute for the dataset
+        Attribute attr = dataset.openAttribute((unsigned)0);
 
-	/* Verify Dataspace */
+        /* Verify Dataspace */
 
-	// Get the dataspace of the attribute
-	DataSpace space = attr.getSpace();
+        // Get the dataspace of the attribute
+        DataSpace space = attr.getSpace();
 
-	// Get the rank of the dataspace and verify it
-	int rank = space.getSimpleExtentNdims();
-	verify_val(rank, ATTR4_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the rank of the dataspace and verify it
+        int rank = space.getSimpleExtentNdims();
+        verify_val(rank, ATTR4_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	// Get the dims of the dataspace and verify them
-	int ndims = space.getSimpleExtentDims(dims);
-	verify_val(ndims, ATTR4_RANK, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        // Get the dims of the dataspace and verify them
+        int ndims = space.getSimpleExtentDims(dims);
+        verify_val(ndims, ATTR4_RANK, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
         verify_val((long)dims[0], (long)ATTR4_DIM1, "DataSpace::getSimpleExtentDims",__LINE__, __FILE__);
         verify_val((long)dims[1], (long)ATTR4_DIM2, "DataSpace::getSimpleExtentDims",__LINE__, __FILE__);
 
-	// Get the class of the datatype that is used by attr
-	H5T_class_t type_class = attr.getTypeClass();
+        // Get the class of the datatype that is used by attr
+        H5T_class_t type_class = attr.getTypeClass();
 
-	// Verify that the type is of compound datatype
-	verify_val(type_class, H5T_COMPOUND, "Attribute::getTypeClass", __LINE__, __FILE__);
+        // Verify that the type is of compound datatype
+        verify_val(type_class, H5T_COMPOUND, "Attribute::getTypeClass", __LINE__, __FILE__);
 
-	// Get the compound datatype
-	CompType datatype = attr.getCompType();
+        // Get the compound datatype
+        CompType datatype = attr.getCompType();
 
-	// Verify the number of fields in the datatype, which must be 3
-	int fields = datatype.getNmembers();
-	verify_val(fields, 3, "CompType::getNmembers", __LINE__, __FILE__);
+        // Verify the number of fields in the datatype, which must be 3
+        int fields = datatype.getNmembers();
+        verify_val(fields, 3, "CompType::getNmembers", __LINE__, __FILE__);
 
-	// Verify that the fields have the same names as when the type
-	// was created
-	int j;
-	for(j=0; j<fields; j++)
-	{
-	    H5std_string fieldname = datatype.getMemberName(j);
-	    if(!((fieldname == ATTR4_FIELDNAME1) ||
-		(fieldname == ATTR4_FIELDNAME2) ||
-		(fieldname == ATTR4_FIELDNAME3)))
+        // Verify that the fields have the same names as when the type
+        // was created
+        int j;
+        for(j=0; j<fields; j++)
+        {
+            H5std_string fieldname = datatype.getMemberName(j);
+            if(!((fieldname == ATTR4_FIELDNAME1) ||
+                 (fieldname == ATTR4_FIELDNAME2) ||
+                 (fieldname == ATTR4_FIELDNAME3)))
             TestErrPrintf("%d:invalid field name for field #%d: %s\n",__LINE__,j,fieldname.c_str());
-	} /* end for */
-
-	offset = datatype.getMemberOffset(0);
-	verify_val(offset, attr4_field1_off, "DataType::getMemberOffset", __LINE__, __FILE__);
-
-	offset = datatype.getMemberOffset(1);
-	verify_val(offset, attr4_field2_off, "DataType::getMemberOffset", __LINE__, __FILE__);
-
-	offset = datatype.getMemberOffset(2);
-	verify_val(offset, attr4_field3_off, "DataType::getMemberOffset", __LINE__, __FILE__);
-
-	/* Verify each field's type, class & size */
-
-	// Get and verify the type class of the first member
-	type_class = datatype.getMemberClass(0);
-	verify_val(type_class, H5T_INTEGER, "DataType::getMemberClass", __LINE__, __FILE__);
-	// Get and verify the order of this member's type
-	IntType i_type = datatype.getMemberIntType(0);
-	H5T_order_t order = i_type.getOrder();
-	verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
-
-	// Get and verify the size of this member's type
-	size = i_type.getSize();
-	verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
-
-	// Get and verify class, order, and size of the second member's type
-	type_class = datatype.getMemberClass(1);
-	verify_val(type_class, H5T_FLOAT, "DataType::getMemberClass", __LINE__, __FILE__);
-	FloatType f_type = datatype.getMemberFloatType(1);
-	order = f_type.getOrder();
-	verify_val(order, PredType::NATIVE_DOUBLE.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
-	size = f_type.getSize();
-	verify_val(size, PredType::NATIVE_DOUBLE.getSize(), "DataType::getSize", __LINE__, __FILE__);
-
-	// Get and verify class, order, and size of the third member's type
-	type_class = datatype.getMemberClass(2);
-	verify_val(type_class, H5T_INTEGER, "DataType::getMemberClass", __LINE__, __FILE__);
-	// Note: H5T_INTEGER is correct here!
-
-	StrType s_type = datatype.getMemberStrType(2);
-	order = s_type.getOrder();
-	verify_val(order, PredType::NATIVE_SCHAR.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
-	size = s_type.getSize();
-	verify_val(size, PredType::NATIVE_SCHAR.getSize(), "DataType::getSize", __LINE__, __FILE__);
-
-	// Read attribute information
-	attr.read(datatype, read_data4);
-
-	// Verify values read in
-	hsize_t ii, jj;
-	for(ii=0; ii<ATTR4_DIM1; ii++)
-	    for(jj=0; jj<ATTR4_DIM2; jj++)
-		if(HDmemcmp(&attr_data4[ii][jj],&read_data4[ii][jj],sizeof(struct attr4_struct))) {
-		    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].i=%d, read_data4[%d][%d].i=%d\n",__LINE__,ii,jj,attr_data4[ii][jj].i,ii,jj,read_data4[ii][jj].i);
-		    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].d=%f, read_data4[%d][%d].d=%f\n",__LINE__,ii,jj,attr_data4[ii][jj].d,ii,jj,read_data4[ii][jj].d);
-		    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].c=%c, read_data4[%d][%d].c=%c\n",__LINE__,ii,jj,attr_data4[ii][jj].c,ii,jj,read_data4[ii][jj].c);
+        } /* end for */
+
+        offset = datatype.getMemberOffset(0);
+        verify_val(offset, attr4_field1_off, "DataType::getMemberOffset", __LINE__, __FILE__);
+
+        offset = datatype.getMemberOffset(1);
+        verify_val(offset, attr4_field2_off, "DataType::getMemberOffset", __LINE__, __FILE__);
+
+        offset = datatype.getMemberOffset(2);
+        verify_val(offset, attr4_field3_off, "DataType::getMemberOffset", __LINE__, __FILE__);
+
+        /* Verify each field's type, class & size */
+
+        // Get and verify the type class of the first member
+        type_class = datatype.getMemberClass(0);
+        verify_val(type_class, H5T_INTEGER, "DataType::getMemberClass", __LINE__, __FILE__);
+        // Get and verify the order of this member's type
+        IntType i_type = datatype.getMemberIntType(0);
+        H5T_order_t order = i_type.getOrder();
+        verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+
+        // Get and verify the size of this member's type
+        size = i_type.getSize();
+        verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
+
+        // Get and verify class, order, and size of the second member's type
+        type_class = datatype.getMemberClass(1);
+        verify_val(type_class, H5T_FLOAT, "DataType::getMemberClass", __LINE__, __FILE__);
+        FloatType f_type = datatype.getMemberFloatType(1);
+        order = f_type.getOrder();
+        verify_val(order, PredType::NATIVE_DOUBLE.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+        size = f_type.getSize();
+        verify_val(size, PredType::NATIVE_DOUBLE.getSize(), "DataType::getSize", __LINE__, __FILE__);
+
+        // Get and verify class, order, and size of the third member's type
+        type_class = datatype.getMemberClass(2);
+        verify_val(type_class, H5T_INTEGER, "DataType::getMemberClass", __LINE__, __FILE__);
+        // Note: H5T_INTEGER is correct here!
+
+        StrType s_type = datatype.getMemberStrType(2);
+        order = s_type.getOrder();
+        verify_val(order, PredType::NATIVE_SCHAR.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+        size = s_type.getSize();
+        verify_val(size, PredType::NATIVE_SCHAR.getSize(), "DataType::getSize", __LINE__, __FILE__);
+
+        // Read attribute information
+        attr.read(datatype, read_data4);
+
+        // Verify values read in
+        hsize_t ii, jj;
+        for(ii=0; ii<ATTR4_DIM1; ii++)
+            for(jj=0; jj<ATTR4_DIM2; jj++)
+                if(HDmemcmp(&attr_data4[ii][jj],&read_data4[ii][jj],sizeof(struct attr4_struct))) {
+                    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].i=%d, read_data4[%d][%d].i=%d\n",__LINE__,ii,jj,attr_data4[ii][jj].i,ii,jj,read_data4[ii][jj].i);
+                    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].d=%f, read_data4[%d][%d].d=%f\n",__LINE__,ii,jj,attr_data4[ii][jj].d,ii,jj,read_data4[ii][jj].d);
+                    TestErrPrintf("%d:attribute data different: attr_data4[%d][%d].c=%c, read_data4[%d][%d].c=%c\n",__LINE__,ii,jj,attr_data4[ii][jj].c,ii,jj,read_data4[ii][jj].c);
              } /* end if */
 
-	// Verify name
-	H5std_string attr_name = attr.getName();
-	verify_val(attr_name, ATTR4_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify name
+        H5std_string attr_name = attr.getName();
+        verify_val(attr_name, ATTR4_NAME, "Attribute::getName", __LINE__, __FILE__);
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_compound_read()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_compound_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     try
     {
-	// Now, try truncating the file to make sure reference counting is good.
-	// If any references to ids in the previous block are left unterminated,
-	// the truncating will fail, because the file will not be closed in
-	// the file.close() above.
-	H5File file1(FILE_COMPOUND, H5F_ACC_TRUNC);
+        // Now, try truncating the file to make sure reference counting is good.
+        // If any references to ids in the previous block are left unterminated,
+        // the truncating will fail, because the file will not be closed in
+        // the file.close() above.
+        H5File file1(FILE_COMPOUND, H5F_ACC_TRUNC);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (FileIException E) {
-	issue_fail_msg("test_attr_compound_read()", __LINE__, __FILE__, "Unable to truncate file, possibly because some objects are left opened");
+    catch (FileIException& E)
+    {
+        issue_fail_msg("test_attr_compound_read()", __LINE__, __FILE__, "Unable to truncate file, possibly because some objects are left opened");
     }
 }   // test_attr_compound_read()
 
@@ -774,46 +771,47 @@ static void test_attr_scalar_write()
     SUBTEST("Basic Scalar Attribute Writing Functions");
 
     try {
-	// Create file
-	H5File fid1(FILE_SCALAR, H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1(FILE_SCALAR, H5F_ACC_TRUNC);
 
-	// Create dataspace for dataset
-	hsize_t	dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
-	DataSpace sid1(SPACE1_RANK, dims1);
+        // Create dataspace for dataset
+        hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
+        DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR,sid1);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR,sid1);
 
-	// Close dataset's dataspace
-	sid1.close();
+        // Close dataset's dataspace
+        sid1.close();
 
-	// Create dataspace for attribute
-	DataSpace att_space(ATTR5_RANK, NULL);
+        // Create dataspace for attribute
+        DataSpace att_space(ATTR5_RANK, NULL);
 
-	// Create an attribute for the dataset
-	Attribute ds_attr = dataset.createAttribute (ATTR5_NAME, PredType::NATIVE_FLOAT, att_space);
+        // Create an attribute for the dataset
+        Attribute ds_attr = dataset.createAttribute (ATTR5_NAME, PredType::NATIVE_FLOAT, att_space);
 
-	// Try creating an attribute that already exists.  This should fail
-	// since two attributes cannot have the same name.  If an exception
-	// is not thrown for this action by createAttribute, then throw an
-	// invalid action exception.
-	try {
-	    Attribute invalid_attr = dataset.createAttribute (ATTR5_NAME, PredType::NATIVE_FLOAT, att_space);
+        // Try creating an attribute that already exists.  This should fail
+        // since two attributes cannot have the same name.  If an exception
+        // is not thrown for this action by createAttribute, then throw an
+        // invalid action exception.
+        try {
+            Attribute invalid_attr = dataset.createAttribute (ATTR5_NAME, PredType::NATIVE_FLOAT, att_space);
 
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
-	}
-	catch (AttributeIException E) // catching invalid creating attribute
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("H5File::createDataSet", "Library allowed overwrite of existing dataset");
+        }
+        catch (AttributeIException& E) // catching invalid creating attribute
         {} // do nothing, exception expected
 
-	// Write attribute information
-	ds_attr.write (PredType::NATIVE_FLOAT, &attr_data5);
+        // Write attribute information
+        ds_attr.write (PredType::NATIVE_FLOAT, &attr_data5);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_scalar_write()
 
@@ -822,42 +820,47 @@ static void test_attr_scalar_write()
 **  test_attr_scalar_read(): Test scalar attribute reading functionality.
 **
 ****************************************************************/
+/* Epsilon for floating-point comparisons */
+#define FP_EPSILON 0.000001F
+
 static void test_attr_scalar_read()
 {
     // Output message about test being performed
     SUBTEST("Basic Scalar Attribute Reading Functions");
 
     try {
-	// Open file
-	H5File fid1(FILE_SCALAR, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(FILE_SCALAR, H5F_ACC_RDWR);
 
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Verify the correct number of attributes
-	int num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        int num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open an attribute for the dataset
-	Attribute ds_attr=dataset.openAttribute(ATTR5_NAME);
+        // Open an attribute for the dataset
+        Attribute ds_attr=dataset.openAttribute(ATTR5_NAME);
 
-	// Read attribute information
-	float read_data2=0.0;  // Buffer for reading 1st attribute
-	ds_attr.read(PredType::NATIVE_FLOAT,&read_data2);
-	verify_val(read_data2, attr_data5, "Attribute::read", __LINE__, __FILE__);
+        // Read attribute information
+        float read_data2=0.0;  // Buffer for reading 1st attribute
+        ds_attr.read(PredType::NATIVE_FLOAT,&read_data2);
+        if (HDfabs(read_data2 - attr_data5) > FP_EPSILON)
+            verify_val(read_data2, attr_data5, FP_EPSILON, "Attribute::read", __LINE__, __FILE__);
 
-	// Get the dataspace of the attribute
-	DataSpace att_space = ds_attr.getSpace();
+        // Get the dataspace of the attribute
+        DataSpace att_space = ds_attr.getSpace();
 
-	// Make certain the dataspace is scalar
-	H5S_class_t space_type = att_space.getSimpleExtentType();
-	verify_val(space_type, H5S_SCALAR, "DataSpace::getSimpleExtentType", __LINE__, __FILE__);
+        // Make certain the dataspace is scalar
+        H5S_class_t space_type = att_space.getSimpleExtentType();
+        verify_val(space_type, H5S_SCALAR, "DataSpace::getSimpleExtentType", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_scalar_read()
 
@@ -872,64 +875,65 @@ static void test_attr_mult_write()
     SUBTEST("Multiple Attribute Writing Functions");
 
     try {
-	// Create file
-	H5File fid1 (FILE_MULTI, H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1 (FILE_MULTI, H5F_ACC_TRUNC);
 
-	// Create dataspace for dataset
-	hsize_t	dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
-	DataSpace ds_space (SPACE1_RANK, dims1);
+        // Create dataspace for dataset
+        hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
+        DataSpace ds_space (SPACE1_RANK, dims1);
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space);
 
-	// Create dataspace for 1st attribute
-	hsize_t	dims2[] = {ATTR1_DIM1};
-	DataSpace att_space (ATTR1_RANK, dims2);
+        // Create dataspace for 1st attribute
+        hsize_t dims2[] = {ATTR1_DIM1};
+        DataSpace att_space (ATTR1_RANK, dims2);
 
-	// Create 1st attribute for the dataset
-	Attribute ds_attr = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
+        // Create 1st attribute for the dataset
+        Attribute ds_attr = dataset.createAttribute (ATTR1_NAME, PredType::NATIVE_INT, att_space);
 
-	// Write attribute information
-	ds_attr.write (PredType::NATIVE_INT, attr_data1);
+        // Write attribute information
+        ds_attr.write (PredType::NATIVE_INT, attr_data1);
 
-	// Create dataspace for 2nd attribute
-	hsize_t	dims3[] = {ATTR2_DIM1,ATTR2_DIM2};
-	DataSpace att2_space (ATTR2_RANK, dims3);
+        // Create dataspace for 2nd attribute
+        hsize_t dims3[] = {ATTR2_DIM1,ATTR2_DIM2};
+        DataSpace att2_space (ATTR2_RANK, dims3);
 
-	// Create 2nd attribute for the dataset
-	Attribute ds_attr2 = dataset.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, att2_space);
+        // Create 2nd attribute for the dataset
+        Attribute ds_attr2 = dataset.createAttribute (ATTR2_NAME, PredType::NATIVE_INT, att2_space);
 
-	// Write 2nd attribute information
-	ds_attr2.write (PredType::NATIVE_INT, attr_data2);
+        // Write 2nd attribute information
+        ds_attr2.write (PredType::NATIVE_INT, attr_data2);
 
-	// Create dataspace for 3rd attribute
-	hsize_t	dims4[] = {ATTR3_DIM1,ATTR3_DIM2,ATTR3_DIM3};
-	DataSpace att3_space (ATTR3_RANK, dims4);
+        // Create dataspace for 3rd attribute
+        hsize_t dims4[] = {ATTR3_DIM1,ATTR3_DIM2,ATTR3_DIM3};
+        DataSpace att3_space (ATTR3_RANK, dims4);
 
-	// Create 3rd attribute for the dataset
-	Attribute ds_attr3 = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_DOUBLE, att3_space);
+        // Create 3rd attribute for the dataset
+        Attribute ds_attr3 = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_DOUBLE, att3_space);
 
-	// Try creating an attribute that already exists.  This should fail
-	// since two attributes cannot have the same name.  If an exception
-	// is not thrown for this action by createAttribute, then throw an
-	// invalid action exception.
-	try {
-	    Attribute invalid_attr = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_DOUBLE, att3_space);
+        // Try creating an attribute that already exists.  This should fail
+        // since two attributes cannot have the same name.  If an exception
+        // is not thrown for this action by createAttribute, then throw an
+        // invalid action exception.
+        try {
+            Attribute invalid_attr = dataset.createAttribute (ATTR3_NAME, PredType::NATIVE_DOUBLE, att3_space);
 
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("DataSet::createAttribute", "Attempting to create a duplicate attribute");
-	}
-	catch (AttributeIException E) // catching invalid creating attribute
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("DataSet::createAttribute", "Attempting to create a duplicate attribute");
+        }
+        catch (AttributeIException& E) // catching invalid creating attribute
         {} // do nothing, exception expected
 
-	// Write 3rd attribute information
-	ds_attr3.write (PredType::NATIVE_DOUBLE, attr_data3);
+        // Write 3rd attribute information
+        ds_attr3.write (PredType::NATIVE_DOUBLE, attr_data3);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_mult_write()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_mult_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_mult_write()
 
@@ -945,39 +949,39 @@ static void test_attr_mult_read()
     double  read_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3]={{{0}}}; // Buffer for reading 3rd attribute
     hsize_t i,j,k;
 
-	// Output message about test being performed
+        // Output message about test being performed
     SUBTEST("Multiple Attribute Reading Functions");
 
     try {
-	// Open file
-	H5File fid1(FILE_MULTI, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(FILE_MULTI, H5F_ACC_RDWR);
 
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Verify the correct number of attributes
-	int num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        int num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open 1st attribute for the dataset
-	Attribute attr = dataset.openAttribute((unsigned)0);
+        // Open 1st attribute for the dataset
+        Attribute attr = dataset.openAttribute((unsigned)0);
 
-	/* Verify Dataspace */
+        /* Verify Dataspace */
 
-	// Get the dataspace of the attribute
-	DataSpace space = attr.getSpace();
+        // Get the dataspace of the attribute
+        DataSpace space = attr.getSpace();
 
-	// Get the rank of the dataspace and verify it
-	int rank = space.getSimpleExtentNdims();
-	verify_val(rank, ATTR1_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the rank of the dataspace and verify it
+        int rank = space.getSimpleExtentNdims();
+        verify_val(rank, ATTR1_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	// Get the dims of the dataspace and verify them
-	hsize_t dims[ATTR_MAX_DIMS];    // Attribute dimensions
-	int ndims = space.getSimpleExtentDims(dims);
-	if ((long)dims[0] != (long)ATTR1_DIM1)
-	    TestErrPrintf("%d:attribute dimensions different: dims[0]=%d, should be %d\n",__LINE__,(int)dims[0],ATTR1_DIM1);
+        // Get the dims of the dataspace and verify them
+        hsize_t dims[ATTR_MAX_DIMS];    // Attribute dimensions
+        int ndims = space.getSimpleExtentDims(dims);
+        if ((long)dims[0] != (long)ATTR1_DIM1)
+            TestErrPrintf("%d:attribute dimensions different: dims[0]=%d, should be %d\n",__LINE__,(int)dims[0],ATTR1_DIM1);
 
-	/* Verify Datatype */
+        /* Verify Datatype */
 
         // Get the class of the datatype that is used by attr
         H5T_class_t type_class = attr.getTypeClass();
@@ -985,51 +989,51 @@ static void test_attr_mult_read()
         // Verify that the type is of integer datatype
         verify_val(type_class, H5T_INTEGER, "Attribute::getTypeClass", __LINE__, __FILE__);
 
-    	// Get the integer datatype
+            // Get the integer datatype
         IntType i_type1 = attr.getIntType();
 
-	// Get and verify the order of this type
-	H5T_order_t order = i_type1.getOrder();
-	verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+        // Get and verify the order of this type
+        H5T_order_t order = i_type1.getOrder();
+        verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
 
-	// Get and verify the size of this type
-	size_t size = i_type1.getSize();
-	verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
+        // Get and verify the size of this type
+        size_t size = i_type1.getSize();
+        verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
 
-	// Read attribute information
-	attr.read(PredType::NATIVE_INT, read_data1);
+        // Read attribute information
+        attr.read(PredType::NATIVE_INT, read_data1);
 
-	// Verify values read in
-	for(i=0; i<ATTR1_DIM1; i++)
-	    if(attr_data1[i]!=read_data1[i])
-		TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
+        // Verify values read in
+        for(i=0; i<ATTR1_DIM1; i++)
+            if(attr_data1[i]!=read_data1[i])
+                TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d,read_data1[%d]=%d\n",__LINE__,i,attr_data1[i],i,read_data1[i]);
 
-	// Verify Name
-	H5std_string attr_name = attr.getName();
-	verify_val(attr_name, ATTR1_NAME, "DataType::getName", __LINE__, __FILE__);
+        // Verify Name
+        H5std_string attr_name = attr.getName();
+        verify_val(attr_name, ATTR1_NAME, "DataType::getName", __LINE__, __FILE__);
 
-	attr.close();
-	space.close();
+        attr.close();
+        space.close();
 
-	// Open 2nd attribute for the dataset
-	attr = dataset.openAttribute((unsigned)1);
+        // Open 2nd attribute for the dataset
+        attr = dataset.openAttribute((unsigned)1);
 
-	/* Verify Dataspace */
+        /* Verify Dataspace */
 
-	// Get the dataspace of the attribute
-	space = attr.getSpace();
+        // Get the dataspace of the attribute
+        space = attr.getSpace();
 
-	// Get the rank of the dataspace and verify it
-	rank = space.getSimpleExtentNdims();
-	verify_val(rank, ATTR2_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the rank of the dataspace and verify it
+        rank = space.getSimpleExtentNdims();
+        verify_val(rank, ATTR2_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	// Get the dims of the dataspace and verify them
-	ndims = space.getSimpleExtentDims(dims);
+        // Get the dims of the dataspace and verify them
+        ndims = space.getSimpleExtentDims(dims);
 
         verify_val((long)dims[0], (long)ATTR2_DIM1, "DataSpace::getSimpleExtentDims",__LINE__, __FILE__);
         verify_val((long)dims[1], (long)ATTR2_DIM2, "DataSpace::getSimpleExtentDims",__LINE__, __FILE__);
 
-	/* Verify Datatype */
+        /* Verify Datatype */
 
         // Get the class of the datatype that is used by attr
         type_class = attr.getTypeClass();
@@ -1037,52 +1041,52 @@ static void test_attr_mult_read()
         // Verify that the type is of integer datatype
         verify_val(type_class, H5T_INTEGER, "Attribute::getTypeClass", __LINE__, __FILE__);
 
-    	// Get the integer datatype
+            // Get the integer datatype
         IntType i_type2 = attr.getIntType();
 
-	// Get and verify the order of this type
-	order = i_type2.getOrder();
-	verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+        // Get and verify the order of this type
+        order = i_type2.getOrder();
+        verify_val(order, PredType::NATIVE_INT.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
 
-	// Get and verify the size of this type
-	size = i_type2.getSize();
-	verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
+        // Get and verify the size of this type
+        size = i_type2.getSize();
+        verify_val(size, PredType::NATIVE_INT.getSize(), "DataType::getSize", __LINE__, __FILE__);
 
-	// Read attribute information
-	attr.read(PredType::NATIVE_INT, read_data2);
-	//attr.read(i_type, read_data2);
+        // Read attribute information
+        attr.read(PredType::NATIVE_INT, read_data2);
+        //attr.read(i_type, read_data2);
 
-	// Verify values read in
-	for(i=0; i<ATTR2_DIM1; i++)
-	  for(j=0; j<ATTR2_DIM2; j++)
+        // Verify values read in
+        for(i=0; i<ATTR2_DIM1; i++)
+          for(j=0; j<ATTR2_DIM2; j++)
             if(attr_data2[i][j]!=read_data2[i][j])
                 TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n",__LINE__,i,j,attr_data2[i][j],i,j,read_data2[i][j]);
 
-	// Verify Name
-	attr_name = attr.getName();
-	verify_val(attr_name, ATTR2_NAME, "DataType::getName", __LINE__, __FILE__);
-	attr.close();
-	space.close();
+        // Verify Name
+        attr_name = attr.getName();
+        verify_val(attr_name, ATTR2_NAME, "DataType::getName", __LINE__, __FILE__);
+        attr.close();
+        space.close();
 
-	// Open 3rd attribute for the dataset
-	attr = dataset.openAttribute((unsigned)2);
+        // Open 3rd attribute for the dataset
+        attr = dataset.openAttribute((unsigned)2);
 
-	/* Verify Dataspace */
+        /* Verify Dataspace */
 
-	// Get the dataspace of the attribute
-	space = attr.getSpace();
+        // Get the dataspace of the attribute
+        space = attr.getSpace();
 
-	// Get the rank of the dataspace and verify it
-	rank = space.getSimpleExtentNdims();
-	verify_val(rank, ATTR3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the rank of the dataspace and verify it
+        rank = space.getSimpleExtentNdims();
+        verify_val(rank, ATTR3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	// Get the dims of the dataspace and verify them
-	ndims = space.getSimpleExtentDims(dims);
-	verify_val((long)dims[0],(long)ATTR3_DIM1,"attribute dimensions",__FILE__,__LINE__);
-	verify_val((long)dims[1],(long)ATTR3_DIM2,"attribute dimensions",__FILE__,__LINE__);
-	verify_val((long)dims[2],(long)ATTR3_DIM3,"attribute dimensions",__FILE__,__LINE__);
+        // Get the dims of the dataspace and verify them
+        ndims = space.getSimpleExtentDims(dims);
+        verify_val((long)dims[0],(long)ATTR3_DIM1,"attribute dimensions",__FILE__,__LINE__);
+        verify_val((long)dims[1],(long)ATTR3_DIM2,"attribute dimensions",__FILE__,__LINE__);
+        verify_val((long)dims[2],(long)ATTR3_DIM3,"attribute dimensions",__FILE__,__LINE__);
 
-	/* Verify Datatype */
+        /* Verify Datatype */
 
         // Get the class of the datatype that is used by attr
         type_class = attr.getTypeClass();
@@ -1090,43 +1094,44 @@ static void test_attr_mult_read()
         // Verify that the type is of compound datatype
         verify_val(type_class, H5T_FLOAT, "Attribute::getTypeClass", __LINE__, __FILE__);
 
-    	// Get the double datatype
+            // Get the double datatype
         FloatType f_type = attr.getFloatType();
 
-	// Get and verify the order of this type
-	order = f_type.getOrder();
-	verify_val(order, PredType::NATIVE_DOUBLE.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
+        // Get and verify the order of this type
+        order = f_type.getOrder();
+        verify_val(order, PredType::NATIVE_DOUBLE.getOrder(), "DataType::getOrder", __LINE__, __FILE__);
 
-	// Get and verify the size of this type
-	size = f_type.getSize();
-	verify_val(size, PredType::NATIVE_DOUBLE.getSize(), "DataType::getSize", __LINE__, __FILE__);
+        // Get and verify the size of this type
+        size = f_type.getSize();
+        verify_val(size, PredType::NATIVE_DOUBLE.getSize(), "DataType::getSize", __LINE__, __FILE__);
 
-	// Read attribute information
-	attr.read(PredType::NATIVE_DOUBLE, read_data3);
+        // Read attribute information
+        attr.read(PredType::NATIVE_DOUBLE, read_data3);
 
-	// Verify values read in
-	for(i=0; i<ATTR3_DIM1; i++)
-	    for(j=0; j<ATTR3_DIM2; j++)
-		for(k=0; k<ATTR3_DIM3; k++)
-		    if(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 values read in
+        for(i=0; i<ATTR3_DIM1; i++)
+            for(j=0; j<ATTR3_DIM2; j++)
+                for(k=0; k<ATTR3_DIM3; k++)
+                    if(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
-	attr_name = attr.getName();
-	verify_val(attr_name, ATTR3_NAME, "DataType::getName", __LINE__, __FILE__);
+        // Verify Name
+        attr_name = attr.getName();
+        verify_val(attr_name, ATTR3_NAME, "DataType::getName", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_mult_read()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_mult_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_mult_read()
 
 /****************************************************************
 **
 **  test_attr_delete(): Test deleting attribute from different
-**			hdf5 objects.
+**                      hdf5 objects.
 **
 ****************************************************************/
 static void test_attr_delete()
@@ -1137,112 +1142,113 @@ static void test_attr_delete()
     SUBTEST("Removing Attribute Function");
 
     try {
-	// Open file.
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
-
-	// Get the number of file attributes
-	int num_attrs = fid1.getNumAttrs();
-	verify_val(num_attrs, 2, "H5File::getNumAttrs", __LINE__, __FILE__);
-
-	// Delete the second file attribute
-	fid1.removeAttr(FATTR2_NAME);
-
-	// Get the number of file attributes
-	num_attrs = fid1.getNumAttrs();
-	verify_val(num_attrs, 1, "H5File::getNumAttrs", __LINE__, __FILE__);
-
-	// Verify the name of the only file attribute left
-	Attribute fattr = fid1.openAttribute((unsigned)0);
-	H5std_string attr_name = fattr.getName();
-	verify_val(attr_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
-	fattr.close();
-	
-	// Test deleting non-existing attribute
-
-	// Open the dataset
-	DataSet dataset = fid1.openDataSet(DSET1_NAME);
-
-	// Verify the correct number of attributes
-	num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
-
-	// Try to delete bogus attribute, should fail
-	try {
-	    dataset.removeAttr("Bogus");
-
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("DataSet::removeAttr", "Attempting to remove non-existing attribute");
-	}
-	catch (AttributeIException E) // catching invalid removing attribute
+        // Open file.
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+
+        // Get the number of file attributes
+        int num_attrs = fid1.getNumAttrs();
+        verify_val(num_attrs, 2, "H5File::getNumAttrs", __LINE__, __FILE__);
+
+        // Delete the second file attribute
+        fid1.removeAttr(FATTR2_NAME);
+
+        // Get the number of file attributes
+        num_attrs = fid1.getNumAttrs();
+        verify_val(num_attrs, 1, "H5File::getNumAttrs", __LINE__, __FILE__);
+
+        // Verify the name of the only file attribute left
+        Attribute fattr = fid1.openAttribute((unsigned)0);
+        attr_name = fattr.getName();
+        verify_val(attr_name, FATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+        fattr.close();
+        
+        // Test deleting non-existing attribute
+
+        // Open the dataset
+        DataSet dataset = fid1.openDataSet(DSET1_NAME);
+
+        // Verify the correct number of attributes
+        num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
+
+        // Try to delete bogus attribute, should fail
+        try {
+            dataset.removeAttr("Bogus");
+
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("DataSet::removeAttr", "Attempting to remove non-existing attribute");
+        }
+        catch (AttributeIException& E) // catching invalid removing attribute
         {} // do nothing, exception expected
 
-	// Test deleting dataset's attributes
+        // Test deleting dataset's attributes
 
-	// Verify the correct number of attributes
-	num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 3, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Delete middle (2nd) attribute
-	dataset.removeAttr(ATTR2_NAME);
+        // Delete middle (2nd) attribute
+        dataset.removeAttr(ATTR2_NAME);
 
-	// Verify the correct number of attributes
-	num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 2, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 2, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open 1st attribute for the dataset
-	Attribute attr = dataset.openAttribute((unsigned)0);
+        // Open 1st attribute for the dataset
+        Attribute attr = dataset.openAttribute((unsigned)0);
 
-	// Verify Name
-	attr_name = attr.getName();
-	verify_val(attr_name, ATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify Name
+        attr_name = attr.getName();
+        verify_val(attr_name, ATTR1_NAME, "Attribute::getName", __LINE__, __FILE__);
 
-	// Close attribute
-	attr.close();
+        // Close attribute
+        attr.close();
 
-	// Open last (formally 3rd) attribute for the dataset
-	attr = dataset.openAttribute((unsigned)1);
+        // Open last (formally 3rd) attribute for the dataset
+        attr = dataset.openAttribute((unsigned)1);
 
-	// Verify Name
-	attr_name = attr.getName();
-	verify_val(attr_name, ATTR3_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Verify Name
+        attr_name = attr.getName();
+        verify_val(attr_name, ATTR3_NAME, "Attribute::getName", __LINE__, __FILE__);
 
-	attr.close();
+        attr.close();
 
-	// Delete first attribute
-	dataset.removeAttr(ATTR1_NAME);
+        // Delete first attribute
+        dataset.removeAttr(ATTR1_NAME);
 
-	// Verify the correct number of attributes
-	num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 1, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	// Open the only attribute for the dataset (formally 3rd)
-	attr = dataset.openAttribute((unsigned)0);
+        // Open the only attribute for the dataset (formally 3rd)
+        attr = dataset.openAttribute((unsigned)0);
 
-	// Verify Name
-	attr_name = attr.getName();
-	verify_val(attr_name, ATTR3_NAME, "Attribute::getName", __LINE__, __FILE__);
-	// Close attribute
-	attr.close();
+        // Verify Name
+        attr_name = attr.getName();
+        verify_val(attr_name, ATTR3_NAME, "Attribute::getName", __LINE__, __FILE__);
+        // Close attribute
+        attr.close();
 
-	// Delete first attribute
-	dataset.removeAttr(ATTR3_NAME);
+        // Delete first attribute
+        dataset.removeAttr(ATTR3_NAME);
 
-	// Verify the correct number of attributes
-	num_attrs = dataset.getNumAttrs();
-	verify_val(num_attrs, 0, "DataSet::getNumAttrs", __LINE__, __FILE__);
+        // Verify the correct number of attributes
+        num_attrs = dataset.getNumAttrs();
+        verify_val(num_attrs, 0, "DataSet::getNumAttrs", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_delete()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_delete()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_delete()
 
 /****************************************************************
 **
 **  test_attr_dtype_shared(): Test code for using shared datatypes
-**				in attributes.
+**                            in attributes.
 **
 ****************************************************************/
 static void test_attr_dtype_shared()
@@ -1258,141 +1264,142 @@ static void test_attr_dtype_shared()
     SUBTEST("Shared Datatypes with Attributes");
 
     try {
-	// Create a file
-	H5File fid1(FILE_DTYPE, H5F_ACC_TRUNC);
+        // Create a file
+        H5File fid1(FILE_DTYPE, H5F_ACC_TRUNC);
 
-	// Close file
-	fid1.close();
+        // Close file
+        fid1.close();
 
-	// Get size of file
-	h5_stat_size_t empty_filesize;       // Size of empty file
-	empty_filesize = h5_get_file_size(FILE_DTYPE.c_str(), H5P_DEFAULT);
-	if (empty_filesize < 0)
+        // Get size of file
+        h5_stat_size_t empty_filesize;       // Size of empty file
+        empty_filesize = h5_get_file_size(FILE_DTYPE.c_str(), H5P_DEFAULT);
+        if (empty_filesize < 0)
             TestErrPrintf("Line %d: file size wrong!\n", __LINE__);
 
-	// Open the file again
-	fid1.openFile(FILE_DTYPE, H5F_ACC_RDWR);
+        // Open the file again
+        fid1.openFile(FILE_DTYPE, H5F_ACC_RDWR);
 
-	// Enclosing to work around the issue of unused variables and/or
-	// objects created by copy constructors stay around until end of
-	// scope, causing incorrect number of ref counts.
-	{ // First enclosed block
+        // Enclosing to work around the issue of unused variables and/or
+        // objects created by copy constructors stay around until end of
+        // scope, causing incorrect number of ref counts.
+        { // First enclosed block
 
-	// Create a datatype to commit and use
-	IntType dtype(PredType::NATIVE_INT);
+        // Create a datatype to commit and use
+        IntType dtype(PredType::NATIVE_INT);
 
-	// Commit datatype to file
-	dtype.commit(fid1, TYPE1_NAME);
+        // Commit datatype to file
+        dtype.commit(fid1, TYPE1_NAME);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 1, "DataType::getObjinfo", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 1, "DataType::getObjinfo", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Create dataspace for dataset
-	DataSpace dspace;
+        // Create dataspace for dataset
+        DataSpace dspace;
 
-	DataSet dset = fid1.createDataSet(DSET1_NAME, dtype, dspace);
+        DataSet dset = fid1.createDataSet(DSET1_NAME, dtype, dspace);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 2, "H5File::getObjinfo", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 2, "H5File::getObjinfo", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Create attribute on dataset
-	Attribute attr = dset.createAttribute(ATTR1_NAME,dtype,dspace);
+        // Create attribute on dataset
+        Attribute attr = dset.createAttribute(ATTR1_NAME,dtype,dspace);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 3, "DataSet::getObjinfo", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 3, "DataSet::getObjinfo", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
         // Close attribute
         attr.close();
 
-	// Delete attribute
-	dset.removeAttr(ATTR1_NAME);
+        // Delete attribute
+        dset.removeAttr(ATTR1_NAME);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 2, "DataSet::getObjinfo after DataSet::removeAttr", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 2, "DataSet::getObjinfo after DataSet::removeAttr", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
         // Create attribute on dataset
         attr = dset.createAttribute(ATTR1_NAME,dtype,dspace);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 3, "DataSet::createAttribute", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 3, "DataSet::createAttribute", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Write data into the attribute
-	attr.write(PredType::NATIVE_INT,&data);
+        // Write data into the attribute
+        attr.write(PredType::NATIVE_INT,&data);
 
-	// Close attribute, dataset, dataspace, datatype, and file
-	attr.close();
-	dset.close();
-	dspace.close();
-	dtype.close();
-	} // end of first enclosing
+        // Close attribute, dataset, dataspace, datatype, and file
+        attr.close();
+        dset.close();
+        dspace.close();
+        dtype.close();
+        } // end of first enclosing
 
-	fid1.close();
+        fid1.close();
 
-	// Open the file again
-	fid1.openFile(FILE_DTYPE, H5F_ACC_RDWR);
+        // Open the file again
+        fid1.openFile(FILE_DTYPE, H5F_ACC_RDWR);
 
-	{ // Second enclosed block...
+        { // Second enclosed block...
 
-	// Open dataset
-	DataSet *dset2 = new DataSet (fid1.openDataSet(DSET1_NAME));
+        // Open dataset
+        DataSet *dset2 = new DataSet (fid1.openDataSet(DSET1_NAME));
 
-	// Open attribute
-	Attribute *attr2 = new Attribute (dset2->openAttribute(ATTR1_NAME));
+        // Open attribute
+        Attribute *attr2 = new Attribute (dset2->openAttribute(ATTR1_NAME));
 
-	// Read data from the attribute
-	attr2->read(PredType::NATIVE_INT, &rdata);
-	verify_val(data, rdata, "Attribute::read", __LINE__, __FILE__);
+        // Read data from the attribute
+        attr2->read(PredType::NATIVE_INT, &rdata);
+        verify_val(data, rdata, "Attribute::read", __LINE__, __FILE__);
 
-	// Close attribute and dataset
-	delete attr2;
-	delete dset2;
+        // Close attribute and dataset
+        delete attr2;
+        delete dset2;
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 3, "DataSet::openAttribute", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 3, "DataSet::openAttribute", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
-	} // end of second enclosing
+        } // end of second enclosing
 
-	// Unlink the dataset
-	fid1.unlink(DSET1_NAME);
+        // Unlink the dataset
+        fid1.unlink(DSET1_NAME);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-	// Check reference count on named datatype
-	fid1.getObjinfo(TYPE1_NAME, statbuf);
-	verify_val((int)statbuf.nlink, 1, "H5File::unlink", __LINE__, __FILE__);
+        // Check reference count on named datatype
+        fid1.getObjinfo(TYPE1_NAME, statbuf);
+        verify_val((int)statbuf.nlink, 1, "H5File::unlink", __LINE__, __FILE__);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-	// Unlink the named datatype
-	fid1.unlink(TYPE1_NAME);
+        // Unlink the named datatype
+        fid1.unlink(TYPE1_NAME);
 
-	// Close file
-	fid1.close();
+        // Close file
+        fid1.close();
 
-	// Check size of file
-	filesize = h5_get_file_size(FILE_DTYPE.c_str(), H5P_DEFAULT);
-	verify_val((long)filesize, (long)empty_filesize, "Checking file size", __LINE__, __FILE__);
+        // Check size of file
+        filesize = h5_get_file_size(FILE_DTYPE.c_str(), H5P_DEFAULT);
+        verify_val((long)filesize, (long)empty_filesize, "Checking file size", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     }   // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_dtype_shared()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_dtype_shared()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_dtype_shared()
 
@@ -1415,115 +1422,116 @@ static void test_string_attr()
     SUBTEST("I/O on FL and VL String Attributes");
 
     try {
-	// Create file
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
-
-	//
-	// Fixed-lenth string attributes
-	//
-	// Create a fixed-length string datatype to refer to.
-	StrType fls_type(0, ATTR_LEN);
-
-	// Open the root group.
-	Group root = fid1.openGroup("/");
-
-	// Create dataspace for the attribute.
-	DataSpace att_space (H5S_SCALAR);
-
-	/* Test Attribute::write(...,const void *buf) with Fixed len string */
-
-	// Create an attribute for the root group.
-	Attribute gr_flattr1 = root.createAttribute(ATTR1_FL_STR_NAME, fls_type, att_space);
-
-	// Write data to the attribute.
-	gr_flattr1.write(fls_type, ATTRSTR_DATA.c_str());
-
-	/* Test Attribute::write(...,const H5std_string& strg) with FL string */
-
-	// Create an attribute for the root group.
-	Attribute gr_flattr2 = root.createAttribute(ATTR2_FL_STR_NAME, fls_type, att_space);
-
-	// Write data to the attribute.
-	gr_flattr2.write(fls_type, ATTRSTR_DATA);
-
-	/* Test Attribute::read(...,void *buf) with FL string */
-
-	// Read and verify the attribute string as a string of chars.
-	char flstring_att_check[ATTR_LEN];
-	gr_flattr1.read(fls_type, flstring_att_check);
-	if(HDstrcmp(flstring_att_check, ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), flstring_att_check);
-
-	// Read and verify the attribute string as a string of chars; buffer
-	// is dynamically allocated.
-	size_t attr_size = gr_flattr1.getInMemDataSize();
-	char *fl_dyn_string_att_check;
-	fl_dyn_string_att_check = new char[attr_size+1];
-	gr_flattr1.read(fls_type, fl_dyn_string_att_check);
-	if(HDstrcmp(fl_dyn_string_att_check, ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), fl_dyn_string_att_check);
-	delete []fl_dyn_string_att_check;
-
-	/* Test Attribute::read(...,H5std_string& strg) with FL string */
-
-	// Read and verify the attribute string as an std::string.
-	H5std_string read_flstr1;
-	gr_flattr1.read(fls_type, read_flstr1);
-	if (read_flstr1 != ATTRSTR_DATA)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_flstr1=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_flstr1.c_str());
-
-	// Read and verify the attribute string as a string of chars.
-	HDstrcpy(flstring_att_check, "");
-	gr_flattr2.read(fls_type, flstring_att_check);
-	if(HDstrcmp(flstring_att_check, ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), flstring_att_check);
-
-	/* Test Attribute::read(...,H5std_string& strg) with FL string */
-
-	// Read and verify the attribute string as an std::string.
-	H5std_string read_flstr2;
-	gr_flattr2.read(fls_type, read_flstr2);
-	if (read_flstr2 != ATTRSTR_DATA)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_flstr2=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_flstr2.c_str());
-
-	//
-	// Variable-lenth string attributes
-	//
-	// Create a variable length string datatype to refer to.
-	StrType vls_type(0, H5T_VARIABLE);
-
-	// Create an attribute for the root group.
-	Attribute gr_vlattr = root.createAttribute(ATTR_VL_STR_NAME, vls_type, att_space);
-
-	// Write data to the attribute.
-	gr_vlattr.write(vls_type, ATTRSTR_DATA);
-
-	/* Test Attribute::read(...,void *buf) with Variable len string */
-	// Read and verify the attribute string as a string of chars.
-	char *string_att_check;
-	gr_vlattr.read(vls_type, &string_att_check);
-	if(HDstrcmp(string_att_check, ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,string_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), string_att_check);
-	HDfree(string_att_check);
-
-	/* Test Attribute::read(...,H5std_string& strg) with VL string */
-	// Read and verify the attribute string as an std::string.
-	H5std_string read_str;
-	gr_vlattr.read(vls_type, read_str);
-	if (read_str != ATTRSTR_DATA)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_str=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_str.c_str());
-	PASSED();
+        // Create file
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+
+        //
+        // Fixed-lenth string attributes
+        //
+        // Create a fixed-length string datatype to refer to.
+        StrType fls_type(0, ATTR_LEN);
+
+        // Open the root group.
+        Group root = fid1.openGroup("/");
+
+        // Create dataspace for the attribute.
+        DataSpace att_space (H5S_SCALAR);
+
+        /* Test Attribute::write(...,const void *buf) with Fixed len string */
+
+        // Create an attribute for the root group.
+        Attribute gr_flattr1 = root.createAttribute(ATTR1_FL_STR_NAME, fls_type, att_space);
+
+        // Write data to the attribute.
+        gr_flattr1.write(fls_type, ATTRSTR_DATA.c_str());
+
+        /* Test Attribute::write(...,const H5std_string& strg) with FL string */
+
+        // Create an attribute for the root group.
+        Attribute gr_flattr2 = root.createAttribute(ATTR2_FL_STR_NAME, fls_type, att_space);
+
+        // Write data to the attribute.
+        gr_flattr2.write(fls_type, ATTRSTR_DATA);
+
+        /* Test Attribute::read(...,void *buf) with FL string */
+
+        // Read and verify the attribute string as a string of chars.
+        char flstring_att_check[ATTR_LEN];
+        gr_flattr1.read(fls_type, flstring_att_check);
+        if(HDstrcmp(flstring_att_check, ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), flstring_att_check);
+
+        // Read and verify the attribute string as a string of chars; buffer
+        // is dynamically allocated.
+        size_t attr_size = gr_flattr1.getInMemDataSize();
+        char *fl_dyn_string_att_check;
+        fl_dyn_string_att_check = new char[attr_size+1];
+        gr_flattr1.read(fls_type, fl_dyn_string_att_check);
+        if(HDstrcmp(fl_dyn_string_att_check, ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), fl_dyn_string_att_check);
+        delete []fl_dyn_string_att_check;
+
+        /* Test Attribute::read(...,H5std_string& strg) with FL string */
+
+        // Read and verify the attribute string as an std::string.
+        H5std_string read_flstr1;
+        gr_flattr1.read(fls_type, read_flstr1);
+        if (read_flstr1 != ATTRSTR_DATA)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_flstr1=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_flstr1.c_str());
+
+        // Read and verify the attribute string as a string of chars.
+        HDstrcpy(flstring_att_check, "");
+        gr_flattr2.read(fls_type, flstring_att_check);
+        if(HDstrcmp(flstring_att_check, ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,flstring_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), flstring_att_check);
+
+        /* Test Attribute::read(...,H5std_string& strg) with FL string */
+
+        // Read and verify the attribute string as an std::string.
+        H5std_string read_flstr2;
+        gr_flattr2.read(fls_type, read_flstr2);
+        if (read_flstr2 != ATTRSTR_DATA)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_flstr2=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_flstr2.c_str());
+
+        //
+        // Variable-lenth string attributes
+        //
+        // Create a variable length string datatype to refer to.
+        StrType vls_type(0, H5T_VARIABLE);
+
+        // Create an attribute for the root group.
+        Attribute gr_vlattr = root.createAttribute(ATTR_VL_STR_NAME, vls_type, att_space);
+
+        // Write data to the attribute.
+        gr_vlattr.write(vls_type, ATTRSTR_DATA);
+
+        /* Test Attribute::read(...,void *buf) with Variable len string */
+        // Read and verify the attribute string as a string of chars.
+        char *string_att_check;
+        gr_vlattr.read(vls_type, &string_att_check);
+        if(HDstrcmp(string_att_check, ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,string_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), string_att_check);
+        HDfree(string_att_check);
+
+        /* Test Attribute::read(...,H5std_string& strg) with VL string */
+        // Read and verify the attribute string as an std::string.
+        H5std_string read_str;
+        gr_vlattr.read(vls_type, read_str);
+        if (read_str != ATTRSTR_DATA)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_str=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_str.c_str());
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_string_attr()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_string_attr()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_string_attr()
 
 /****************************************************************
 **
 **  test_attr_exists(): Test checking for attribute existence.
-**	(additional attrExists tests are in test_attr_rename())
+**        (additional attrExists tests are in test_attr_rename())
 **
 ****************************************************************/
 static void test_attr_exists()
@@ -1532,38 +1540,40 @@ static void test_attr_exists()
     SUBTEST("Check Attribute Existence");
 
     try {
-	// Open file.
-	H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
+        // Open file.
+        H5File fid1(FILE_BASIC, H5F_ACC_RDWR);
 
-	// Open the root group.
-	Group root = fid1.openGroup("/");
+        // Open the root group.
+        Group root = fid1.openGroup("/");
 
-	// Check for existence of attribute
-	bool attr_exists = fid1.attrExists(ATTR1_FL_STR_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "fid1, ATTR1_FL_STR_NAMEAttribute should exist but does not");
+        // Check for existence of attribute
+        bool attr_exists = fid1.attrExists(ATTR1_FL_STR_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "fid1, ATTR1_FL_STR_NAMEAttribute should exist but does not");
 
-	// Check for existence of attribute
-	attr_exists = fid1.attrExists(FATTR1_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "fid1,FATTR2_NAMEAttribute should exist but does not");
+        // Check for existence of attribute
+        attr_exists = fid1.attrExists(FATTR1_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "fid1,FATTR2_NAMEAttribute should exist but does not");
 
-	// Open a group.
-	Group group = fid1.openGroup(GROUP1_NAME);
+        // Open a group.
+        Group group = fid1.openGroup(GROUP1_NAME);
 
-	// Check for existence of attribute
-	attr_exists = group.attrExists(ATTR2_NAME);
-	if (attr_exists == false)
-	    throw InvalidActionException("H5File::attrExists", "group, ATTR2_NAMEAttribute should exist but does not");
+        // Check for existence of attribute
+        attr_exists = group.attrExists(ATTR2_NAME);
+        if (attr_exists == false)
+            throw InvalidActionException("H5File::attrExists", "group, ATTR2_NAMEAttribute should exist but does not");
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (InvalidActionException E) {
-	issue_fail_msg("test_attr_exists()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (InvalidActionException& E)
+    {
+        issue_fail_msg("test_attr_exists()", __LINE__, __FILE__, E.getCDetailMsg());
     }
-    catch (Exception E) {
-	issue_fail_msg("test_attr_exists()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_exists()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_exists()
 
@@ -1579,99 +1589,100 @@ const unsigned MAX_COMPACT_DEF = 8;
 const unsigned MIN_DENSE_DEF = 6;
 
 static void test_attr_dense_create(FileCreatPropList& fcpl,
-				   FileAccPropList& fapl)
+                                   FileAccPropList& fapl)
 {
     // Output message about test being performed
     SUBTEST("Dense Attribute Storage Creation");
 
     try {
-	// Create file
-	H5File fid1 (FILE_CRTPROPS, H5F_ACC_TRUNC, fcpl, fapl);
+        // Create file
+        H5File fid1 (FILE_CRTPROPS, H5F_ACC_TRUNC, fcpl, fapl);
 
-	// Close file
-	fid1.close();
+        // Close file
+        fid1.close();
 
-	// Get size of file
-	h5_stat_size_t empty_filesize;       // Size of empty file
-	empty_filesize = h5_get_file_size(FILE_CRTPROPS.c_str(), fapl.getId());
-	if (empty_filesize < 0)
+        // Get size of file
+        h5_stat_size_t empty_filesize;       // Size of empty file
+        empty_filesize = h5_get_file_size(FILE_CRTPROPS.c_str(), fapl.getId());
+        if (empty_filesize < 0)
             TestErrPrintf("Line %d: file size wrong!\n", __LINE__);
 
-	// Re-open file
-	fid1.openFile(FILE_CRTPROPS, H5F_ACC_RDWR, fapl);
+        // Re-open file
+        fid1.openFile(FILE_CRTPROPS, H5F_ACC_RDWR, fapl);
 
-	// Create dataspace for dataset
-	DataSpace ds_space(H5S_SCALAR);
+        // Create dataspace for dataset
+        DataSpace ds_space(H5S_SCALAR);
 
-	//  Create dataset creation property list.
-	DSetCreatPropList dcpl;
+        //  Create dataset creation property list.
+        DSetCreatPropList dcpl;
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space, dcpl);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space, dcpl);
 
-	unsigned max_compact = 0, min_dense = 0;
+        unsigned max_compact = 0, min_dense = 0;
 
-	// Retrieve limits for compact/dense attribute storage
-	dcpl.getAttrPhaseChange(max_compact, min_dense);
-	verify_val(max_compact, MAX_COMPACT_DEF, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
-	verify_val(min_dense, MIN_DENSE_DEF, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
+        // Retrieve limits for compact/dense attribute storage
+        dcpl.getAttrPhaseChange(max_compact, min_dense);
+        verify_val(max_compact, MAX_COMPACT_DEF, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
+        verify_val(min_dense, MIN_DENSE_DEF, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
 
-	// Set new compact/dense attribute storage limits to some random numbers
-	dcpl.setAttrPhaseChange(7, 5);
+        // Set new compact/dense attribute storage limits to some random numbers
+        dcpl.setAttrPhaseChange(7, 5);
 
-	// Retrieve limits for compact/dense attribute storage and verify them
-	dcpl.getAttrPhaseChange(max_compact, min_dense);
-	verify_val(max_compact, 7, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
-	verify_val(min_dense, 5, "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
+        // Retrieve limits for compact/dense attribute storage and verify them
+        dcpl.getAttrPhaseChange(max_compact, min_dense);
+        verify_val(max_compact, static_cast<unsigned>(7), "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
+        verify_val(min_dense, static_cast<unsigned>(5), "DSetCreatPropList::getAttrPhaseChange",__LINE__,__FILE__);
 
-	// Close property list
-	dcpl.close();
+        // Close property list
+        dcpl.close();
 
-	// H5O_is_attr_dense_test - un-usable
+        // H5O_is_attr_dense_test - un-usable
 
-	// Add attributes, until just before converting to dense storage
-	char attr_name[NAME_BUF_SIZE];
-	unsigned attr_num;
-	for (attr_num = 0; attr_num < max_compact; attr_num++)
-	{
-	    // Create attribute
-	    sprintf(attr_name, "attr %02u", attr_num);
-	    Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
+        // Add attributes, until just before converting to dense storage
+        char attr_name[NAME_BUF_SIZE];
+        unsigned attr_num;
+        for (attr_num = 0; attr_num < max_compact; attr_num++)
+        {
+            // Create attribute
+            sprintf(attr_name, "attr %02u", attr_num);
+            Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
 
-	    // Write data to the attribute
-	    attr.write(PredType::NATIVE_UINT, &attr_num);
-	} // end for
+            // Write data to the attribute
+            attr.write(PredType::NATIVE_UINT, &attr_num);
+        } // end for
 
-	// H5O_is_attr_dense_test - un-usable
+        // H5O_is_attr_dense_test - un-usable
 
-	{ // Add one more attribute, to push into "dense" storage
+        { // Add one more attribute, to push into "dense" storage
 
-	    // Create another attribute
-	    sprintf(attr_name, "attr %02u", attr_num);
-	    Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
+            // Create another attribute
+            sprintf(attr_name, "attr %02u", attr_num);
+            Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
 
-	    // Write data to the attribute
-	    attr.write(PredType::NATIVE_UINT, &attr_num);
-	}
+            // Write data to the attribute
+            attr.write(PredType::NATIVE_UINT, &attr_num);
+        }
 
-	// Attempt to add attribute again, which should fail
-	try
-	{
-	    // Create another attribute
-	    sprintf(attr_name, "attr %02u", attr_num);
-	    Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
+        // Attempt to add attribute again, which should fail
+        try
+        {
+            // Create another attribute
+            sprintf(attr_name, "attr %02u", attr_num);
+            Attribute attr = dataset.createAttribute(attr_name, PredType::NATIVE_UINT, ds_space);
 
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("DataSet::createAttribute", "Maximum number of attributes has been reached");
-	}
-	catch (AttributeIException E) // catching invalid action
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("DataSet::createAttribute", "Maximum number of attributes has been reached");
+        }
+        catch (AttributeIException& E) // catching invalid action
         {} // do nothing, exception expected
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_dense_create()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_dense_create()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_dense_create()
 
@@ -1682,80 +1693,81 @@ static void test_attr_dense_create(FileCreatPropList& fcpl,
 **
 ****************************************************************/
 static void test_attr_corder_create_basic(FileCreatPropList& fcpl,
-				   FileAccPropList& fapl)
+                                   FileAccPropList& fapl)
 {
     // Output message about test being performed
     SUBTEST("Basic Code for Attributes with Creation Order Info");
 
     try {
-	// Create file
-	H5File fid1 (FILE_CRTPROPS, H5F_ACC_TRUNC, fcpl, fapl);
-
-	//  Create dataset creation property list.
-	DSetCreatPropList dcpl;
-
-	// Get creation order indexing on object
-	unsigned crt_order_flags = 0;
-	crt_order_flags = dcpl.getAttrCrtOrder();
-	verify_val(crt_order_flags, 0, "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
-
-	// Setting invalid combination of a attribute order creation order
-	// indexing on should fail
-	try {
-	    dcpl.setAttrCrtOrder(H5P_CRT_ORDER_INDEXED);
-
-	    // continuation here, that means no exception has been thrown
-	    throw InvalidActionException("DSetCreatPropList::getAttrCrtOrder", "Indexing cannot be set alone, order tracking is required");
-	}
-	catch (PropListIException E) // catching invalid action
+        // Create file
+        H5File fid1 (FILE_CRTPROPS, H5F_ACC_TRUNC, fcpl, fapl);
+
+        //  Create dataset creation property list.
+        DSetCreatPropList dcpl;
+
+        // Get creation order indexing on object
+        unsigned crt_order_flags = 0;
+        crt_order_flags = dcpl.getAttrCrtOrder();
+        verify_val(crt_order_flags, (unsigned)0, "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
+
+        // Setting invalid combination of a attribute order creation order
+        // indexing on should fail
+        try {
+            dcpl.setAttrCrtOrder(H5P_CRT_ORDER_INDEXED);
+
+            // continuation here, that means no exception has been thrown
+            throw InvalidActionException("DSetCreatPropList::getAttrCrtOrder", "Indexing cannot be set alone, order tracking is required");
+        }
+        catch (PropListIException& E) // catching invalid action
         {} // do nothing, exception expected
 
-	// Set attribute creation order tracking & indexing for object then
-	// verify them
-	dcpl.setAttrCrtOrder(H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED);
-	crt_order_flags = dcpl.getAttrCrtOrder();
-	verify_val(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
+        // Set attribute creation order tracking & indexing for object then
+        // verify them
+        dcpl.setAttrCrtOrder(H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED);
+        crt_order_flags = dcpl.getAttrCrtOrder();
+        verify_val(crt_order_flags, (unsigned)(H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
 
-	// Create dataspace for dataset
-	DataSpace ds_space(H5S_SCALAR);
+        // Create dataspace for dataset
+        DataSpace ds_space(H5S_SCALAR);
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space, dcpl);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet(DSET1_NAME, PredType::NATIVE_UCHAR, ds_space, dcpl);
 
-	// Close dataspace
-	ds_space.close();
+        // Close dataspace
+        ds_space.close();
 
-	// Check on dataset's attribute storage status.
-	// NOTE: Wrappers not available yet (H5O_is_attr_empty_test
-	// and H5O_is_attr_dense_test)
+        // Check on dataset's attribute storage status.
+        // NOTE: Wrappers not available yet (H5O_is_attr_empty_test
+        // and H5O_is_attr_dense_test)
 
-	// Close dataset
-	dataset.close();
+        // Close dataset
+        dataset.close();
 
-	// Close property list
-	dcpl.close();
+        // Close property list
+        dcpl.close();
 
-	// Close file
-	fid1.close();
+        // Close file
+        fid1.close();
 
-	// Re-open file
-	fid1.openFile(FILE_CRTPROPS, H5F_ACC_RDWR, fapl);
+        // Re-open file
+        fid1.openFile(FILE_CRTPROPS, H5F_ACC_RDWR, fapl);
 
-	// Open dataset created previously
-	dataset = fid1.openDataSet(DSET1_NAME);
+        // Open dataset created previously
+        dataset = fid1.openDataSet(DSET1_NAME);
 
-	// Retrieve dataset creation property list for the dataset
-	dcpl = dataset.getCreatePlist();
+        // Retrieve dataset creation property list for the dataset
+        dcpl = dataset.getCreatePlist();
 
-	// Query the attribute creation properties
-	crt_order_flags = dcpl.getAttrCrtOrder();
-	verify_val(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
+        // Query the attribute creation properties
+        crt_order_flags = dcpl.getAttrCrtOrder();
+        verify_val(crt_order_flags, (unsigned)(H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "DSetCreatPropList::getAttrCrtOrder",__LINE__,__FILE__);
 
-	PASSED();
+        PASSED();
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr_corder_create_basic()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr_corder_create_basic()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr_corder_create_basic()
 
@@ -1764,9 +1776,7 @@ static void test_attr_corder_create_basic(FileCreatPropList& fcpl,
 **  test_attr(): Main attribute testing routine.
 **
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_attr()
 {
     // Output message about test being performed
@@ -1802,69 +1812,68 @@ void test_attr()
             // Set the file access proplist for the type of format
             if (new_format)
             {
-	    MESSAGE(7, ("testing with new file format\n"));
-	    curr_fapl = fapl_new;
+                MESSAGE(7, ("testing with new file format\n"));
+                curr_fapl = fapl_new;
             }
             else
             {
-	    MESSAGE(7, ("testing with old file format\n"));
-	    curr_fapl = fapl;
+                MESSAGE(7, ("testing with old file format\n"));
+                curr_fapl = fapl;
             }
 
-            test_attr_basic_write();	// Test basic H5A writing code
-            test_attr_getname();	// Test overloads of Attribute::getName
-            test_attr_rename();		// Test renaming attribute
-            test_attr_basic_read(); 	// Test basic H5A reading code
+            test_attr_basic_write();    // Test basic H5A writing code
+            test_attr_getname();        // Test overloads of Attribute::getName
+            test_attr_rename();         // Test renaming attribute
+            test_attr_basic_read();     // Test basic H5A reading code
 
-            test_attr_compound_write();	// Test complex datatype H5A writing code
-            test_attr_compound_read();	// Test complex datatype H5A reading code
+            test_attr_compound_write(); // Test complex datatype H5A writing code
+            test_attr_compound_read();  // Test complex datatype H5A reading code
 
-            test_attr_scalar_write();	// Test scalar dataspace H5A writing code
-            test_attr_scalar_read();	// Test scalar dataspace H5A reading code
+            test_attr_scalar_write();   // Test scalar dataspace H5A writing code
+            test_attr_scalar_read();    // Test scalar dataspace H5A reading code
 
-            test_attr_mult_write();	// Test writing multiple attributes
-            test_attr_mult_read();	// Test reading multiple attributes
-            test_attr_delete();		// Test deleting attributes
+            test_attr_mult_write();     // Test writing multiple attributes
+            test_attr_mult_read();      // Test reading multiple attributes
+            test_attr_delete();         // Test deleting attributes
 
-            test_attr_dtype_shared();	// Test using shared datatypes in attributes
+            test_attr_dtype_shared();   // Test using shared datatypes in attributes
 
-            test_string_attr();		// Test read/write string attribute
-            test_attr_exists();		// Test H5Location::attrExists
+            test_string_attr();         // Test read/write string attribute
+            test_attr_exists();         // Test H5Location::attrExists
 
             // Test with new format
             if (new_format)
             {
-		// Test dense attribute storage creation
+                // Test dense attribute storage creation
                 test_attr_dense_create(fcpl, curr_fapl);
 
-		// Test create objects with attribute creation info
+                // Test create objects with attribute creation info
                 test_attr_corder_create_basic(fcpl, curr_fapl);
             }
         } // end for
     } // end try block
 
-    catch (Exception E) {
-	issue_fail_msg("test_attr()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_attr()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_attr()
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_attr
+ * Function     cleanup_attr
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Albert Cheng
+ * Programmer   Albert Cheng
  *              July 2, 1998
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_attr()
 {
     HDremove(FILE_BASIC.c_str());
diff --git a/c++/test/tcompound.cpp b/c++/test/tcompound.cpp
index dbf2f0c..3af78c5 100644
--- a/c++/test/tcompound.cpp
+++ b/c++/test/tcompound.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,31 +16,23 @@
    tcompound.cpp - HDF5 C++ testing the compound data type functionality
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 /* Number of elements in each test */
-#define NTESTELEM	100000
+#define NTESTELEM 100000
 
 typedef struct complex_t {
     double                  re;
@@ -53,11 +43,11 @@ typedef struct complex_t {
 /*-------------------------------------------------------------------------
  * Function:    test_compound_1
  *
- * Purpose:     Tests various things about compound data types.
+ * Purpose      Tests various things about compound data types.
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              January, 2007
  *
  * Modifications:
@@ -69,32 +59,32 @@ static void test_compound_1()
     // Output message about test being performed
     SUBTEST("Compound Data Types");
     try {
-	// Create an empty compound datatype
-	CompType complex_type(sizeof(complex_t));
+        // Create an empty compound datatype
+        CompType complex_type(sizeof(complex_t));
 
-	// Add a couple of fields
-	complex_type.insertMember("real", HOFFSET(complex_t, re), PredType::NATIVE_DOUBLE);
-	complex_type.insertMember("imaginary", HOFFSET(complex_t, im), PredType::NATIVE_DOUBLE);
-	PASSED();
+        // Add a couple of fields
+        complex_type.insertMember("real", HOFFSET(complex_t, re), PredType::NATIVE_DOUBLE);
+        complex_type.insertMember("imaginary", HOFFSET(complex_t, im), PredType::NATIVE_DOUBLE);
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_1 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_compound_1()
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_2
+ * Function:    test_compound_2
  *
- * Purpose:	Tests a compound type conversion where the source and
- *		destination are the same except for the order of the
- *		elements.
+ * Purpose      Tests a compound type conversion where the source and
+ *              destination are the same except for the order of the
+ *              elements.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              January, 2007
  *
  * Modifications:
@@ -104,104 +94,104 @@ cerr << "test_compound_1 in catch" << endl;
 static void test_compound_2()
 {
     typedef struct {
-	int a, b, c[4], d, e;
+        int a, b, c[4], d, e;
     } src_typ_t;
     typedef struct {
-	int e, d, c[4], b, a;
+        int e, d, c[4], b, a;
     } dst_typ_t;
 
-    src_typ_t	  *s_ptr;
-    dst_typ_t	  *d_ptr;
-    const int	   nelmts = NTESTELEM;
+    src_typ_t *s_ptr;
+    dst_typ_t *d_ptr;
+    const int nelmts = NTESTELEM;
     const hsize_t  four = 4;
-    int		   i;
+    int i;
     unsigned char *buf = NULL, *orig = NULL, *bkg = NULL;
     ArrayType *array_dt = NULL;
 
     // Output message about test being performed
     SUBTEST("Compound Element Reordering");
     try {
-	// Sizes should be the same, but be careful just in case
-	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;
-	    s_ptr->b    = i*8+1;
-	    s_ptr->c[0] = i*8+2;
-	    s_ptr->c[1] = i*8+3;
-	    s_ptr->c[2] = i*8+4;
-	    s_ptr->c[3] = i*8+5;
-	    s_ptr->d    = i*8+6;
-	    s_ptr->e    = i*8+7;
-	}
-	memcpy(buf, orig, nelmts*sizeof(src_typ_t));
-
-	// Build hdf5 datatypes
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType st(sizeof(src_typ_t));
-	st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
-	st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
-	st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
-	st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
-	st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
+        // Sizes should be the same, but be careful just in case
+        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;
+            s_ptr->b    = i*8+1;
+            s_ptr->c[0] = i*8+2;
+            s_ptr->c[1] = i*8+3;
+            s_ptr->c[2] = i*8+4;
+            s_ptr->c[3] = i*8+5;
+            s_ptr->d    = i*8+6;
+            s_ptr->e    = i*8+7;
+        }
+        memcpy(buf, orig, nelmts*sizeof(src_typ_t));
+
+        // Build hdf5 datatypes
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType st(sizeof(src_typ_t));
+        st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
+        st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
+        st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
+        st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
+        st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
         delete array_dt;
 
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType dt(sizeof(dst_typ_t));
-	dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
-	dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_INT);
-	dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
-	dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_INT);
-	dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
-
-	// Perform the conversion
-	st.convert(dt, (size_t)nelmts, buf, bkg);
-
-	// Compare results
-	for (i=0; i<nelmts; i++) {
-	    s_ptr = ((src_typ_t*)orig) + i;
-	    d_ptr = ((dst_typ_t*)buf)  + i;
-	    if (s_ptr->a    != d_ptr->a    ||
-		s_ptr->b    != d_ptr->b    ||
-		s_ptr->c[0] != d_ptr->c[0] ||
-		s_ptr->c[1] != d_ptr->c[1] ||
-		s_ptr->c[2] != d_ptr->c[2] ||
-		s_ptr->c[3] != d_ptr->c[3] ||
-		s_ptr->d    != d_ptr->d    ||
-		s_ptr->e    != d_ptr->e) {
-		H5_FAILED();
-		cerr << "    i=" << i << endl;
-		cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
-		     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
-		     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
-		     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
-		cerr << "    dst={a=" << s_ptr->a << ", b=" << s_ptr->b
-		     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
-		     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
-		     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
-	    }
-    	}
-	// Release resources
-	HDfree(buf);
-	HDfree(bkg);
-	HDfree(orig);
-	s_ptr = NULL;
-	d_ptr = NULL;
-	st.close();
-	dt.close();
-	PASSED();
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType dt(sizeof(dst_typ_t));
+        dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
+        dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_INT);
+        dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
+        dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_INT);
+        dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
+
+        // Perform the conversion
+        st.convert(dt, (size_t)nelmts, buf, bkg);
+
+        // Compare results
+        for (i=0; i<nelmts; i++) {
+            s_ptr = ((src_typ_t*)orig) + i;
+            d_ptr = ((dst_typ_t*)buf)  + i;
+            if (s_ptr->a    != d_ptr->a    ||
+                s_ptr->b    != d_ptr->b    ||
+                s_ptr->c[0] != d_ptr->c[0] ||
+                s_ptr->c[1] != d_ptr->c[1] ||
+                s_ptr->c[2] != d_ptr->c[2] ||
+                s_ptr->c[3] != d_ptr->c[3] ||
+                s_ptr->d    != d_ptr->d    ||
+                s_ptr->e    != d_ptr->e) {
+                H5_FAILED();
+                cerr << "    i=" << i << endl;
+                cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
+                     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
+                     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
+                     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
+                cerr << "    dst={a=" << s_ptr->a << ", b=" << s_ptr->b
+                     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
+                     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
+                     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
+            }
+            }
+        // Release resources
+        HDfree(buf);
+        HDfree(bkg);
+        HDfree(orig);
+        s_ptr = NULL;
+        d_ptr = NULL;
+        st.close();
+        dt.close();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_2 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -211,15 +201,15 @@ cerr << "test_compound_2 in catch" << endl;
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_3
+ * Function:    test_compound_3
  *
- * Purpose:	Tests compound conversions where the source and destination
- *		are the same except the destination is missing a couple
- *		members which appear in the source.
+ * Purpose      Tests compound conversions where the source and destination
+ *              are the same except the destination is missing a couple
+ *              members which appear in the source.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              January, 2007
  *
  * Modifications:
@@ -229,16 +219,16 @@ cerr << "test_compound_2 in catch" << endl;
 static void test_compound_3()
 {
     typedef struct {
-	int a, b, c[4], d, e;
+        int a, b, c[4], d, e;
     } src_typ_t;
     typedef struct {
-	int a,    c[4],    e;
+        int a,    c[4],    e;
     } dst_typ_t;
 
-    src_typ_t	  *s_ptr;
-    dst_typ_t 	  *d_ptr;
-    int		   i;
-    const int	   nelmts = NTESTELEM;
+    src_typ_t *s_ptr;
+    dst_typ_t  *d_ptr;
+    int i;
+    const int nelmts = NTESTELEM;
     const hsize_t  four = 4;
     unsigned char *buf = NULL, *orig = NULL, *bkg = NULL;
     ArrayType* array_dt = NULL;
@@ -246,85 +236,85 @@ static void test_compound_3()
     // Output message about test being performed
     SUBTEST("Compound Datatype Subset Conversions");
     try {
-	/* Initialize */
-	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;
-	    s_ptr->b    = i*8+1;
-	    s_ptr->c[0] = i*8+2;
-	    s_ptr->c[1] = i*8+3;
-	    s_ptr->c[2] = i*8+4;
-	    s_ptr->c[3] = i*8+5;
-	    s_ptr->d    = i*8+6;
-	    s_ptr->e    = i*8+7;
-	}
-	memcpy(buf, orig, nelmts*sizeof(src_typ_t));
-
-	/* Build hdf5 datatypes */
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType st(sizeof(src_typ_t));
-	st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
-	st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
-	st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
-	st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
-	st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
+        /* Initialize */
+        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;
+            s_ptr->b    = i*8+1;
+            s_ptr->c[0] = i*8+2;
+            s_ptr->c[1] = i*8+3;
+            s_ptr->c[2] = i*8+4;
+            s_ptr->c[3] = i*8+5;
+            s_ptr->d    = i*8+6;
+            s_ptr->e    = i*8+7;
+        }
+        memcpy(buf, orig, nelmts*sizeof(src_typ_t));
+
+        /* Build hdf5 datatypes */
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType st(sizeof(src_typ_t));
+        st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
+        st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
+        st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
+        st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
+        st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
         delete array_dt;
 
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType dt(sizeof(dst_typ_t));
-	dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
-	dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
-	dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
-
-	/* Perform the conversion */
-	st.convert(dt, (size_t)nelmts, buf, bkg);
-
-	/* Compare results */
-	for (i=0; i<nelmts; i++) {
-	    s_ptr = ((src_typ_t*)orig) + i;
-	    d_ptr = ((dst_typ_t*)buf)  + i;
-	    if (s_ptr->a    != d_ptr->a    ||
-		s_ptr->c[0] != d_ptr->c[0] ||
-		s_ptr->c[1] != d_ptr->c[1] ||
-		s_ptr->c[2] != d_ptr->c[2] ||
-		s_ptr->c[3] != d_ptr->c[3] ||
-		s_ptr->e    != d_ptr->e) {
-		H5_FAILED();
-		cerr << "    i=" << i << endl;
-		cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
-		     << ", c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
-		     << s_ptr->c[2] << "," << s_ptr->c[3] << "], d="
-		     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
-		cerr << "    dst={a=" << d_ptr->a
-		     << ", c=[" << d_ptr->c[0] << "," << d_ptr->c[1] << ","
-		     << d_ptr->c[2] << "," << d_ptr->c[3] << "], e="
-		     << d_ptr->e << "}" << endl;
-	    } // if
-	} // for
-
-	/* Release resources */
-	HDfree(buf);
-	HDfree(bkg);
-	HDfree(orig);
-	s_ptr = NULL;
-	d_ptr = NULL;
-	st.close();
-	dt.close();
-	PASSED();
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType dt(sizeof(dst_typ_t));
+        dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
+        dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
+        dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
+
+        /* Perform the conversion */
+        st.convert(dt, (size_t)nelmts, buf, bkg);
+
+        /* Compare results */
+        for (i=0; i<nelmts; i++) {
+            s_ptr = ((src_typ_t*)orig) + i;
+            d_ptr = ((dst_typ_t*)buf)  + i;
+            if (s_ptr->a    != d_ptr->a    ||
+                s_ptr->c[0] != d_ptr->c[0] ||
+                s_ptr->c[1] != d_ptr->c[1] ||
+                s_ptr->c[2] != d_ptr->c[2] ||
+                s_ptr->c[3] != d_ptr->c[3] ||
+                s_ptr->e    != d_ptr->e) {
+                H5_FAILED();
+                cerr << "    i=" << i << endl;
+                cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
+                     << ", c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
+                     << s_ptr->c[2] << "," << s_ptr->c[3] << "], d="
+                     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
+                cerr << "    dst={a=" << d_ptr->a
+                     << ", c=[" << d_ptr->c[0] << "," << d_ptr->c[1] << ","
+                     << d_ptr->c[2] << "," << d_ptr->c[3] << "], e="
+                     << d_ptr->e << "}" << endl;
+            } // if
+        } // for
+
+        /* Release resources */
+        HDfree(buf);
+        HDfree(bkg);
+        HDfree(orig);
+        s_ptr = NULL;
+        d_ptr = NULL;
+        st.close();
+        dt.close();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_3 in catch" << endl;
-	issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     if(array_dt)
@@ -333,16 +323,16 @@ cerr << "test_compound_3 in catch" << endl;
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_4
+ * Function:    test_compound_4
  *
- * Purpose:	Tests compound conversions when the destination has the same
- *		fields as the source but one or more of the fields are
- *		smaller.
+ * Purpose      Tests compound conversions when the destination has the same
+ *              fields as the source but one or more of the fields are
+ *              smaller.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -352,20 +342,20 @@ static void test_compound_4()
 {
 
     typedef struct {
-	int a, b, c[4], d, e;
+        int a, b, c[4], d, e;
     } src_typ_t;
 
     typedef struct {
-	short b;
-	int a, c[4];
-	short d;
-	int e;
+        short b;
+        int a, c[4];
+        short d;
+        int e;
     } dst_typ_t;
 
-    src_typ_t	  *s_ptr;
-    dst_typ_t	  *d_ptr;
-    int		   i;
-    const int	   nelmts = NTESTELEM;
+    src_typ_t *s_ptr;
+    dst_typ_t *d_ptr;
+    int i;
+    const int nelmts = NTESTELEM;
     const hsize_t  four = 4;
     unsigned char *buf = NULL, *orig = NULL, *bkg = NULL;
     ArrayType* array_dt = NULL;
@@ -373,89 +363,89 @@ static void test_compound_4()
     // Output message about test being performed
     SUBTEST("Compound Element Shrinking & Reordering");
     try {
-	/* Sizes should be the same, but be careful just in case */
-	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;
-	    s_ptr->b    = (i*8+1) & 0x7fff;
-	    s_ptr->c[0] = i*8+2;
-	    s_ptr->c[1] = i*8+3;
-	    s_ptr->c[2] = i*8+4;
-	    s_ptr->c[3] = i*8+5;
-	    s_ptr->d	    = (i*8+6) & 0x7fff;
-	    s_ptr->e    = i*8+7;
-	}
-	memcpy(buf, orig, nelmts*sizeof(src_typ_t));
-
-	/* Build hdf5 datatypes */
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType st(sizeof(src_typ_t));
-	st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
-	st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
-	st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
-	st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
-	st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
+        /* Sizes should be the same, but be careful just in case */
+        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;
+            s_ptr->b    = (i*8+1) & 0x7fff;
+            s_ptr->c[0] = i*8+2;
+            s_ptr->c[1] = i*8+3;
+            s_ptr->c[2] = i*8+4;
+            s_ptr->c[3] = i*8+5;
+            s_ptr->d    = (i*8+6) & 0x7fff;
+            s_ptr->e    = i*8+7;
+        }
+        memcpy(buf, orig, nelmts*sizeof(src_typ_t));
+
+        /* Build hdf5 datatypes */
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType st(sizeof(src_typ_t));
+        st.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
+        st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_INT);
+        st.insertMember("c", HOFFSET(src_typ_t, c), *array_dt);
+        st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_INT);
+        st.insertMember("e", HOFFSET(src_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
         delete array_dt;
 
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
-
-	// Create an empty compound datatype
-	CompType dt(sizeof(dst_typ_t));
-	dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
-	dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_SHORT);
-	dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
-	dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_SHORT);
-	dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
-	array_dt->close();
-
-	/* Perform the conversion */
-	st.convert(dt, (size_t)nelmts, buf, bkg);
-
-	/* Compare results */
-	for (i=0; i<nelmts; i++) {
-	    s_ptr = ((src_typ_t*)orig) + i;
-	    d_ptr = ((dst_typ_t*)buf)  + i;
-	    if (s_ptr->a    != d_ptr->a    ||
-		s_ptr->b    != d_ptr->b    ||
-		s_ptr->c[0] != d_ptr->c[0] ||
-		s_ptr->c[1] != d_ptr->c[1] ||
-		s_ptr->c[2] != d_ptr->c[2] ||
-		s_ptr->c[3] != d_ptr->c[3] ||
-		s_ptr->d    != d_ptr->d    ||
-		s_ptr->e    != d_ptr->e)
-	    {
-		H5_FAILED();
-		cerr << "    i=" << i << endl;
-		cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
-		     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
-		     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
-		     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
-		cerr << "    dst={a=" << d_ptr->a << ", b=" << d_ptr->b
-		     << "c=[" << d_ptr->c[0] << "," << d_ptr->c[1] << ","
-		     << d_ptr->c[2] << "," << d_ptr->c[3] << ", d="
-		     << d_ptr->d << ", e=" << d_ptr->e << "}" << endl;
-	    } // if
-	} // for
-
-	/* Release resources */
-	HDfree(buf);
-	HDfree(bkg);
-	HDfree(orig);
-	s_ptr = NULL;
-	d_ptr = NULL;
-	st.close();
-	dt.close();
-	PASSED();
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, &four);
+
+        // Create an empty compound datatype
+        CompType dt(sizeof(dst_typ_t));
+        dt.insertMember("a", HOFFSET(dst_typ_t, a), PredType::NATIVE_INT);
+        dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_SHORT);
+        dt.insertMember("c", HOFFSET(dst_typ_t, c), *array_dt);
+        dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_SHORT);
+        dt.insertMember("e", HOFFSET(dst_typ_t, e), PredType::NATIVE_INT);
+        array_dt->close();
+
+        /* Perform the conversion */
+        st.convert(dt, (size_t)nelmts, buf, bkg);
+
+        /* Compare results */
+        for (i=0; i<nelmts; i++) {
+            s_ptr = ((src_typ_t*)orig) + i;
+            d_ptr = ((dst_typ_t*)buf)  + i;
+            if (s_ptr->a    != d_ptr->a    ||
+                s_ptr->b    != d_ptr->b    ||
+                s_ptr->c[0] != d_ptr->c[0] ||
+                s_ptr->c[1] != d_ptr->c[1] ||
+                s_ptr->c[2] != d_ptr->c[2] ||
+                s_ptr->c[3] != d_ptr->c[3] ||
+                s_ptr->d    != d_ptr->d    ||
+                s_ptr->e    != d_ptr->e)
+            {
+                H5_FAILED();
+                cerr << "    i=" << i << endl;
+                cerr << "    src={a=" << s_ptr->a << ", b=" << s_ptr->b
+                     << "c=[" << s_ptr->c[0] << "," << s_ptr->c[1] << ","
+                     << s_ptr->c[2] << "," << s_ptr->c[3] << ", d="
+                     << s_ptr->d << ", e=" << s_ptr->e << "}" << endl;
+                cerr << "    dst={a=" << d_ptr->a << ", b=" << d_ptr->b
+                     << "c=[" << d_ptr->c[0] << "," << d_ptr->c[1] << ","
+                     << d_ptr->c[2] << "," << d_ptr->c[3] << ", d="
+                     << d_ptr->d << ", e=" << d_ptr->e << "}" << endl;
+            } // if
+        } // for
+
+        /* Release resources */
+        HDfree(buf);
+        HDfree(bkg);
+        HDfree(orig);
+        s_ptr = NULL;
+        d_ptr = NULL;
+        st.close();
+        dt.close();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_4 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -465,17 +455,17 @@ cerr << "test_compound_4 in catch" << endl;
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_5
+ * Function:    test_compound_5
  *
- * Purpose:	Many versions of HDF5 have a bug in the optimized compound
+ * Purpose      Many versions of HDF5 have a bug in the optimized compound
  *              datatype conversion function, H5T_conv_struct_opt(), which
  *              is triggered when the top-level type contains a struct
  *              which must undergo a conversion.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -507,59 +497,59 @@ static void test_compound_5()
     SUBTEST("Optimized Struct Converter");
     try {
 
-	/* Build datatypes */
-	array_dt = new ArrayType(PredType::NATIVE_SHORT, 1, dims);
-	CompType short_array(4*sizeof(short));
-	short_array.insertMember("_", 0, *array_dt);
-	array_dt->close();
+        /* Build datatypes */
+        array_dt = new ArrayType(PredType::NATIVE_SHORT, 1, dims);
+        CompType short_array(4*sizeof(short));
+        short_array.insertMember("_", 0, *array_dt);
+        array_dt->close();
         delete array_dt;
 
-	CompType int_array(4*sizeof(int));
-	array_dt = new ArrayType(PredType::NATIVE_INT, 1, dims);
-	int_array.insertMember("_", 0, *array_dt);
-	array_dt->close();
-
-	StrType strg(PredType::C_S1, 16);
-	CompType src_type(sizeof(src_typ_t));
-	src_type.insertMember("name", HOFFSET(src_typ_t, name), strg);
-	src_type.insertMember("tdim", HOFFSET(src_typ_t, tdim), PredType::NATIVE_SHORT);
-	src_type.insertMember("coll_ids", HOFFSET(src_typ_t, coll_ids), short_array);
-
-	CompType dst_type(sizeof(dst_typ_t));
-	dst_type.insertMember("name", HOFFSET(dst_typ_t, name), strg);
-	dst_type.insertMember("tdim", HOFFSET(dst_typ_t, tdim), PredType::NATIVE_SHORT);
-	dst_type.insertMember("coll_ids", HOFFSET(dst_typ_t, coll_ids), int_array);
-
-	/* Convert data */
-	memcpy(buf, src, sizeof(src));
-	src_type.convert(dst_type, (size_t)2, buf, bkg);
-	dst = (dst_typ_t*)buf;
-
-	/* Cleanup */
-	src_type.close();
-	dst_type.close();
-	strg.close();
-	short_array.close();
-	int_array.close();
-
-	/* Check results */
-	if (memcmp(src[1].name, dst[1].name, sizeof(src[1].name)) ||
-	    src[1].tdim!=dst[1].tdim ||
-	    src[1].coll_ids[0]!=dst[1].coll_ids[0] ||
-	    src[1].coll_ids[1]!=dst[1].coll_ids[1] ||
-	    src[1].coll_ids[2]!=dst[1].coll_ids[2] ||
-	    src[1].coll_ids[3]!=dst[1].coll_ids[3])
-	{ H5_FAILED(); }
-
-	/* Free memory buffers */
-	HDfree(buf);
-	HDfree(bkg);
-	dst = NULL;
-	PASSED();
+        CompType int_array(4*sizeof(int));
+        array_dt = new ArrayType(PredType::NATIVE_INT, 1, dims);
+        int_array.insertMember("_", 0, *array_dt);
+        array_dt->close();
+
+        StrType strg(PredType::C_S1, 16);
+        CompType src_type(sizeof(src_typ_t));
+        src_type.insertMember("name", HOFFSET(src_typ_t, name), strg);
+        src_type.insertMember("tdim", HOFFSET(src_typ_t, tdim), PredType::NATIVE_SHORT);
+        src_type.insertMember("coll_ids", HOFFSET(src_typ_t, coll_ids), short_array);
+
+        CompType dst_type(sizeof(dst_typ_t));
+        dst_type.insertMember("name", HOFFSET(dst_typ_t, name), strg);
+        dst_type.insertMember("tdim", HOFFSET(dst_typ_t, tdim), PredType::NATIVE_SHORT);
+        dst_type.insertMember("coll_ids", HOFFSET(dst_typ_t, coll_ids), int_array);
+
+        /* Convert data */
+        memcpy(buf, src, sizeof(src));
+        src_type.convert(dst_type, (size_t)2, buf, bkg);
+        dst = (dst_typ_t*)buf;
+
+        /* Cleanup */
+        src_type.close();
+        dst_type.close();
+        strg.close();
+        short_array.close();
+        int_array.close();
+
+        /* Check results */
+        if (memcmp(src[1].name, dst[1].name, sizeof(src[1].name)) ||
+            src[1].tdim!=dst[1].tdim ||
+            src[1].coll_ids[0]!=dst[1].coll_ids[0] ||
+            src[1].coll_ids[1]!=dst[1].coll_ids[1] ||
+            src[1].coll_ids[2]!=dst[1].coll_ids[2] ||
+            src[1].coll_ids[3]!=dst[1].coll_ids[3])
+        { H5_FAILED(); }
+
+        /* Free memory buffers */
+        HDfree(buf);
+        HDfree(bkg);
+        dst = NULL;
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_5 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -569,16 +559,16 @@ cerr << "test_compound_5 in catch" << endl;
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_6
+ * Function:    test_compound_6
  *
- * Purpose:	Tests compound conversions when the destination has the same
- *		fields as the source but one or more of the fields are
- *		larger.
+ * Purpose      Tests compound conversions when the destination has the same
+ *              fields as the source but one or more of the fields are
+ *              larger.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -587,90 +577,90 @@ cerr << "test_compound_5 in catch" << endl;
 static void test_compound_6()
 {
     typedef struct {
-	short b;
-	short d;
+        short b;
+        short d;
     } src_typ_t;
 
     typedef struct {
-	long b;
-	long d;
+        long b;
+        long d;
     } dst_typ_t;
 
-    src_typ_t	  *s_ptr;
-    dst_typ_t	  *d_ptr;
-    int		   i;
-    const int	   nelmts = NTESTELEM;
+    src_typ_t *s_ptr;
+    dst_typ_t *d_ptr;
+    int i;
+    const int nelmts = NTESTELEM;
     unsigned char *buf=NULL, *orig=NULL, *bkg=NULL;
 
     // Output message about test being performed
     SUBTEST("Compound Element Growing");
     try {
-	/* Sizes should be the same, but be careful just in case */
-	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;
-	    s_ptr->d    = (i*8+6) & 0x7fff;
-	}
-	memcpy(buf, orig, nelmts*sizeof(src_typ_t));
-
-	/* Build hdf5 datatypes */
-	CompType st(sizeof(src_typ_t));
-	st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_SHORT);
-	st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_SHORT);
-
-	CompType dt(sizeof(dst_typ_t));
-	dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_LONG);
-	dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_LONG);
-
-	/* Perform the conversion */
-	st.convert(dt, (size_t)nelmts, buf, bkg);
-
-	/* Compare results */
-	for (i=0; i<nelmts; i++) {
-	    s_ptr = ((src_typ_t*)orig) + i;
-	    d_ptr = ((dst_typ_t*)buf)  + i;
-	    if (s_ptr->b    != d_ptr->b    ||
-		s_ptr->d    != d_ptr->d)
-	    {
-		H5_FAILED();
-		cerr << "    i=" << i << endl;
-		cerr << "    src={b=" << s_ptr->b << ", d=" << s_ptr->d
-		     << "}" << endl;
-		cerr << "    dst={b=" << d_ptr->b << ", d=" << d_ptr->d
-		     << "}" << endl;
-	    } // if
-	} // for
-
-	/* Release resources */
-	HDfree(buf);
-	HDfree(bkg);
-	HDfree(orig);
-	s_ptr = NULL;
-	d_ptr = NULL;
-	st.close();
-	dt.close();
-	PASSED();
+        /* Sizes should be the same, but be careful just in case */
+        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;
+            s_ptr->d    = (i*8+6) & 0x7fff;
+        }
+        memcpy(buf, orig, nelmts*sizeof(src_typ_t));
+
+        /* Build hdf5 datatypes */
+        CompType st(sizeof(src_typ_t));
+        st.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_SHORT);
+        st.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_SHORT);
+
+        CompType dt(sizeof(dst_typ_t));
+        dt.insertMember("b", HOFFSET(dst_typ_t, b), PredType::NATIVE_LONG);
+        dt.insertMember("d", HOFFSET(dst_typ_t, d), PredType::NATIVE_LONG);
+
+        /* Perform the conversion */
+        st.convert(dt, (size_t)nelmts, buf, bkg);
+
+        /* Compare results */
+        for (i=0; i<nelmts; i++) {
+            s_ptr = ((src_typ_t*)orig) + i;
+            d_ptr = ((dst_typ_t*)buf)  + i;
+            if (s_ptr->b    != d_ptr->b    ||
+                s_ptr->d    != d_ptr->d)
+            {
+                H5_FAILED();
+                cerr << "    i=" << i << endl;
+                cerr << "    src={b=" << s_ptr->b << ", d=" << s_ptr->d
+                     << "}" << endl;
+                cerr << "    dst={b=" << d_ptr->b << ", d=" << d_ptr->d
+                     << "}" << endl;
+            } // if
+        } // for
+
+        /* Release resources */
+        HDfree(buf);
+        HDfree(bkg);
+        HDfree(orig);
+        s_ptr = NULL;
+        d_ptr = NULL;
+        st.close();
+        dt.close();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_6 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_compound_6()
 
 /*-------------------------------------------------------------------------
- * Function:	test_compound_7
+ * Function:    test_compound_7
  *
- * Purpose:	Tests inserting fields into compound datatypes when the field
- *		overlaps the end of the compound datatype.
+ * Purpose      Tests inserting fields into compound datatypes when the field
+ *              overlaps the end of the compound datatype.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -679,63 +669,63 @@ cerr << "test_compound_6 in catch" << endl;
 static void test_compound_7()
 {
     typedef struct {
-	int a;
-	float b;
-	long c;
+        int a;
+        float b;
+        long c;
     } s1_typ_t;
 
     typedef struct {
-	int a;
-	float b;
-	long c;
-	double d;
+        int a;
+        float b;
+        long c;
+        double d;
     } s2_typ_t;
 
     // Output message about test being performed
     SUBTEST("Compound Element Insertion");
     try {
-	CompType tid1(sizeof(s1_typ_t));
+        CompType tid1(sizeof(s1_typ_t));
 
-	tid1.insertMember("a", HOFFSET(s1_typ_t,a),PredType::NATIVE_INT);
-	tid1.insertMember("b", HOFFSET(s1_typ_t,b),PredType::NATIVE_FLOAT);
-	tid1.insertMember("c", HOFFSET(s1_typ_t,c),PredType::NATIVE_LONG);
+        tid1.insertMember("a", HOFFSET(s1_typ_t,a),PredType::NATIVE_INT);
+        tid1.insertMember("b", HOFFSET(s1_typ_t,b),PredType::NATIVE_FLOAT);
+        tid1.insertMember("c", HOFFSET(s1_typ_t,c),PredType::NATIVE_LONG);
 
-	size_t type_size = tid1.getSize();
-	verify_val(type_size, sizeof(s1_typ_t), "DataType::getSize", __LINE__, __FILE__);
+        size_t type_size = tid1.getSize();
+        verify_val(type_size, sizeof(s1_typ_t), "DataType::getSize", __LINE__, __FILE__);
 
-	CompType tid2;
-	tid2.copy(tid1);
+        CompType tid2;
+        tid2.copy(tid1);
 
-	type_size = tid2.getSize();
-	verify_val_noteq(type_size, sizeof(s2_typ_t), "DataType::getSize", __LINE__, __FILE__);
+        type_size = tid2.getSize();
+        verify_val_noteq(type_size, sizeof(s2_typ_t), "DataType::getSize", __LINE__, __FILE__);
 
-	/* Should not be able to insert field past end of compound datatype */
-	try {
-	    tid2.insertMember("d", HOFFSET(s2_typ_t, d), PredType::NATIVE_DOUBLE);
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("CompType::insertMember", "Attempted to insert field past end of compound data type.");
-	} catch (DataTypeIException err) {}
+        /* Should not be able to insert field past end of compound datatype */
+        try {
+            tid2.insertMember("d", HOFFSET(s2_typ_t, d), PredType::NATIVE_DOUBLE);
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("CompType::insertMember", "Attempted to insert field past end of compound data type.");
+        } catch (DataTypeIException& err) {}
 
-	/* Release resources */
-	tid1.close();
-	tid2.close();
-	PASSED();
+        /* Release resources */
+        tid1.close();
+        tid2.close();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
-cerr << "test_compound_7 in catch" << endl;
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_compound_7()
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound_set_size
+ * Function:    test_compound_set_size
  *
- * Purpose:	Tests member function setSize() on compound datatype
+ * Purpose      Tests member function setSize() on compound datatype
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use partial C version test_ooo_order)
+ * Programmer   Binh-Minh Ribler (use partial C version test_ooo_order)
  *              March, 2014
  *
  * Modifications:
@@ -746,7 +736,7 @@ const H5std_string COMPFILE("tcompound_types.h5");
 static void test_compound_set_size()
 {
     typedef struct {
-	int a, b, c[4], d, e;
+        int a, b, c[4], d, e;
     } src_typ_t;
 
     // Output message about test being performed
@@ -763,107 +753,104 @@ static void test_compound_set_size()
         dtype.insertMember("c", HOFFSET(src_typ_t, c), PredType::NATIVE_LONG);
         dtype.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_DOUBLE);
 
-	// Verify that the compound is not packed
-	// bool packed = dtype.packed(); // not until C library provides API
-	// verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
+        // Verify that the compound is not packed
+        // bool packed = dtype.packed(); // not until C library provides API
+        // verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
 
-	dtype.commit(file, "dtype");
+        dtype.commit(file, "dtype");
 
-	// Close the type and file
-	dtype.close();
-	file.close();
+        // Close the type and file
+        dtype.close();
+        file.close();
 
-	// Open the file for read/write
-	file.openFile(COMPFILE, H5F_ACC_RDWR);
+        // Open the file for read/write
+        file.openFile(COMPFILE, H5F_ACC_RDWR);
 
-	// Open the data type "dtype"
-	CompType dtype_tmp = file.openCompType("dtype");
+        // Open the data type "dtype"
+        CompType dtype_tmp = file.openCompType("dtype");
 
-	// Make a copy of the data type
-	dtype.copy(dtype_tmp);
+        // Make a copy of the data type
+        dtype.copy(dtype_tmp);
 
-	// Verify that the compound is not packed
-	// packed = dtype_tmp.packed(); // not until C library provides API
-	// verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
+        // Verify that the compound is not packed
+        // packed = dtype_tmp.packed(); // not until C library provides API
+        // verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
 
-	// Expand the type, and verify that it became unpacked
-	dtype.setSize((size_t)33);
-	// packed = dtype.packed(); // not until C library provides API
-	// verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
+        // Expand the type, and verify that it became unpacked
+        dtype.setSize((size_t)33);
+        // packed = dtype.packed(); // not until C library provides API
+        // verify_val(packed, FALSE, "DataType::packed", __LINE__, __FILE__);
 
-	// Verify setSize() actually set size
-	size_t new_size = dtype.getSize();
-	verify_val(new_size, (size_t)33, "DataType::getSize", __LINE__, __FILE__);
+        // Verify setSize() actually set size
+        size_t new_size = dtype.getSize();
+        verify_val(new_size, (size_t)33, "DataType::getSize", __LINE__, __FILE__);
 
-	// Shrink the type, and verify that it became packed
-	dtype.setSize((size_t)32);
-	// packed = dtype.packed(); // not until C library provides API
-	// verify_val(packed, TRUE, "DataType::packed", __LINE__, __FILE__);
+        // Shrink the type, and verify that it became packed
+        dtype.setSize((size_t)32);
+        // packed = dtype.packed(); // not until C library provides API
+        // verify_val(packed, TRUE, "DataType::packed", __LINE__, __FILE__);
 
-	// Verify setSize() actually set size again
-	new_size = dtype.getSize();
-	verify_val(new_size, (size_t)32, "DataType::getSize", __LINE__, __FILE__);
+        // Verify setSize() actually set size again
+        new_size = dtype.getSize();
+        verify_val(new_size, (size_t)32, "DataType::getSize", __LINE__, __FILE__);
 
-	/* Close types and file */
-	dtype_tmp.close();
-	dtype.close();
-	file.close();
+        /* Close types and file */
+        dtype_tmp.close();
+        dtype.close();
+        file.close();
 
-	PASSED();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_compound_set_size()
 

 /*-------------------------------------------------------------------------
- * Function:	test_compound
+ * Function:    test_compound
  *
- * Purpose:	Main compound datatype testing routine
+ * Purpose      Main compound datatype testing routine
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler
- *		January 2007
+ * Programmer   Binh-Minh Ribler
+ *              January 2007
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_compound()
 {
     // Output message about test being performed
     MESSAGE(5, ("Testing Compound Data Type operations\n"));
 
-    test_compound_1();	// various things about compound data types
-    test_compound_2();	// compound element reordering
-    test_compound_3();	// compound datatype subset conversions
-    test_compound_4();	// compound element shrinking & reordering
-    test_compound_5();	// optimized struct converter
-    test_compound_6();	// compound element growing
-    test_compound_7();	// compound element insertion
-    test_compound_set_size();	// set size on compound data types
+    test_compound_1();  // various things about compound data types
+    test_compound_2();  // compound element reordering
+    test_compound_3();  // compound datatype subset conversions
+    test_compound_4();  // compound element shrinking & reordering
+    test_compound_5();  // optimized struct converter
+    test_compound_6();  // compound element growing
+    test_compound_7();  // compound element insertion
+    test_compound_set_size();  // set size on compound data types
 }   // test_compound()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_compound
+ * Function:    cleanup_compound
  *
- * Purpose:	Cleanup temporary test files - nothing at this time.
+ * Purpose      Cleanup temporary test files - nothing at this time.
  *
- * Return:	none
+ * Return       none
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_compound()
 {
     HDremove(COMPFILE.c_str());
diff --git a/c++/test/tdspl.cpp b/c++/test/tdspl.cpp
index 5c1d953..4aaa93a 100644
--- a/c++/test/tdspl.cpp
+++ b/c++/test/tdspl.cpp
@@ -5,41 +5,31 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
    FILE
    tdspl.cpp - HDF5 C++ testing the dataset memory and transfer property
-		list functionality
+               list functionality
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 const H5std_string FILENAME("tdatatransform.h5");
@@ -53,69 +43,70 @@ static void test_transfplist()
 
     SUBTEST("DSetMemXferPropList::set/getDataTransform()");
     try {
-	// Create various data set prop lists and set data transform expression.
-	DSetMemXferPropList dxpl_c_to_f(c_to_f);
-
-	DSetMemXferPropList dxpl_simple;
-	dxpl_simple.setDataTransform(simple);
-
-	DSetMemXferPropList dxpl_utrans_inv;
-	dxpl_utrans_inv.setDataTransform(utrans_inv);
-
-	//
-	// Make a copy of one of those prop lists then read the data transform
-	// expression and verify that it's the same as the original.
-	//
-
-	// Copy the prop list.
-	DSetMemXferPropList dxpl_c_to_f_copy;
-	dxpl_c_to_f_copy.copy(dxpl_c_to_f);
-
-	// Find out the length of the transform expression, allocate the buffer
-	// for it, then read and verify the expression from the copied plist
-	ssize_t tran_len = dxpl_c_to_f_copy.getDataTransform(NULL);
-	char *c_to_f_read = (char *)HDmalloc(tran_len+1);
-	HDmemset(c_to_f_read, 0, tran_len+1);
-	dxpl_c_to_f_copy.getDataTransform(c_to_f_read, tran_len+1);
-	verify_val((const char*)c_to_f_read, (const char*)c_to_f,
-		"DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
-	HDfree(c_to_f_read);
-
-	//
-	// Read the expression of each of the prop lists and verify the read
-	// expression
-	//
-
-	// Get and verify the expression with:
-	// ssize_t getDataTransform(char* exp, const size_t buf_size [default=0])
-	tran_len =  dxpl_c_to_f.getDataTransform(NULL);
-	c_to_f_read = (char *)HDmalloc(tran_len+1);
-	HDmemset(c_to_f_read, 0, tran_len+1);
-	dxpl_c_to_f.getDataTransform(c_to_f_read, tran_len+1);
-	verify_val((const char*)c_to_f_read, (const char*)c_to_f,
-		"DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
-	HDfree(c_to_f_read);
-
-	// Get and verify the expression with:
-	// H5std_string DSetMemXferPropList::getDataTransform()
-	H5std_string simple_read = dxpl_simple.getDataTransform();
-	verify_val((const char*)simple_read.c_str(), (const char*)simple,
-		"DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
-
-	// Get and verify the expression with:
-	// ssize_t getDataTransform(char* exp, const size_t buf_size)
-	tran_len = dxpl_utrans_inv.getDataTransform(NULL, 0);
-	char *utrans_inv_read = (char *)HDmalloc(tran_len+1);
-	HDmemset(utrans_inv_read, 0, tran_len+1);
-	dxpl_utrans_inv.getDataTransform(utrans_inv_read, tran_len+1);
-	verify_val((const char*)utrans_inv_read, (const char*)utrans_inv,
-		"DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
-	HDfree(utrans_inv_read);
-
-	PASSED();
+        // Create various data set prop lists and set data transform expression.
+        DSetMemXferPropList dxpl_c_to_f(c_to_f);
+
+        DSetMemXferPropList dxpl_simple;
+        dxpl_simple.setDataTransform(simple);
+
+        DSetMemXferPropList dxpl_utrans_inv;
+        dxpl_utrans_inv.setDataTransform(utrans_inv);
+
+        //
+        // Make a copy of one of those prop lists then read the data transform
+        // expression and verify that it's the same as the original.
+        //
+
+        // Copy the prop list.
+        DSetMemXferPropList dxpl_c_to_f_copy;
+        dxpl_c_to_f_copy.copy(dxpl_c_to_f);
+
+        // Find out the length of the transform expression, allocate the buffer
+        // for it, then read and verify the expression from the copied plist
+        ssize_t tran_len = dxpl_c_to_f_copy.getDataTransform(NULL);
+        char *c_to_f_read = (char *)HDmalloc(tran_len+1);
+        HDmemset(c_to_f_read, 0, tran_len+1);
+        dxpl_c_to_f_copy.getDataTransform(c_to_f_read, tran_len+1);
+        verify_val((const char*)c_to_f_read, (const char*)c_to_f,
+                "DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
+        HDfree(c_to_f_read);
+
+        //
+        // Read the expression of each of the prop lists and verify the read
+        // expression
+        //
+
+        // Get and verify the expression with:
+        // ssize_t getDataTransform(char* exp, const size_t buf_size [default=0])
+        tran_len =  dxpl_c_to_f.getDataTransform(NULL);
+        c_to_f_read = (char *)HDmalloc(tran_len+1);
+        HDmemset(c_to_f_read, 0, tran_len+1);
+        dxpl_c_to_f.getDataTransform(c_to_f_read, tran_len+1);
+        verify_val((const char*)c_to_f_read, (const char*)c_to_f,
+                "DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
+        HDfree(c_to_f_read);
+
+        // Get and verify the expression with:
+        // H5std_string DSetMemXferPropList::getDataTransform()
+        H5std_string simple_read = dxpl_simple.getDataTransform();
+        verify_val((const char*)simple_read.c_str(), (const char*)simple,
+                "DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
+
+        // Get and verify the expression with:
+        // ssize_t getDataTransform(char* exp, const size_t buf_size)
+        tran_len = dxpl_utrans_inv.getDataTransform(NULL, 0);
+        char *utrans_inv_read = (char *)HDmalloc(tran_len+1);
+        HDmemset(utrans_inv_read, 0, tran_len+1);
+        dxpl_utrans_inv.getDataTransform(utrans_inv_read, tran_len+1);
+        verify_val((const char*)utrans_inv_read, (const char*)utrans_inv,
+                "DSetMemXferPropList::getDataTransform", __LINE__, __FILE__);
+        HDfree(utrans_inv_read);
+
+        PASSED();
     }
-    catch (Exception E) {
-	issue_fail_msg("test_transfplist", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_transfplist", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }
 
@@ -125,9 +116,7 @@ static void test_transfplist()
 **  test_dsproplist(): Main dataset property list testing routine.
 **
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_dsproplist()
 {
     // Output message about test being performed
@@ -137,10 +126,7 @@ void test_dsproplist()
 
 }   // test_dsproplist()
 
-
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_dsproplist()
 {
     HDremove(FILENAME.c_str());
diff --git a/c++/test/testhdf5.cpp b/c++/test/testhdf5.cpp
index b29c6fb..a2a0867 100644
--- a/c++/test/testhdf5.cpp
+++ b/c++/test/testhdf5.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -28,40 +26,31 @@
    base functionality testing.
 
    EXTERNAL ROUTINES/VARIABLES:
-	TestInit(...) -- Initialize testing framework
-	TestInfo(...) -- Print test info
-	AddTest(...)  -- Setup a test function and add it to the list of tests
-	TestParseCmdLine(...) -- Parse command line arguments
-	PerformTests() -- Perform requested testing
-	GetTestSummary() -- Retrieve Summary request value
-	TestSummary() -- Display test summary
-	GetTestCleanup() -- Retrieve Cleanup request value
-	TestCleanup() -- Clean up files from testing
-	GetTestNumErrs() -- Retrieve the number of testing errors
+        TestInit(...) -- Initialize testing framework
+        TestInfo(...) -- Print test info
+        AddTest(...)  -- Setup a test function and add it to the list of tests
+        TestParseCmdLine(...) -- Parse command line arguments
+        PerformTests() -- Perform requested testing
+        GetTestSummary() -- Retrieve Summary request value
+        TestSummary() -- Display test summary
+        GetTestCleanup() -- Retrieve Cleanup request value
+        TestCleanup() -- Clean up files from testing
+        GetTestNumErrs() -- Retrieve the number of testing errors
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
-#include "h5test.h"	// C test header file
-#include "H5Cpp.h"	// C++ API header file
-
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif  /* !H5_NO_NAMESPACE */
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 int
@@ -69,48 +58,50 @@ main(int argc, char *argv[])
 {
     try
     {
-	// Turn of the auto-printing when failure occurs so that we can
-	// handle the errors appropriately since sometime failures are
-	// caused deliberately and expected.
-	Exception::dontPrint();
-	/* Initialize testing framework */
-	TestInit(argv[0], NULL, NULL);
-
-	// testing file creation and opening in tfile.cpp
-	AddTest("tfile", test_file, cleanup_file, "File I/O Operations", NULL);
-	// testing dataset functionalities in dset.cpp
-	AddTest("dsets", test_dset, cleanup_dsets, "Dataset I/O Operations", NULL);
-	// testing dataspace functionalities in th5s.cpp
-	AddTest("th5s",  test_h5s,  cleanup_h5s,  "Dataspaces", NULL);
-	// testing attribute functionalities in tattr.cpp
-	AddTest("tattr", test_attr, cleanup_attr,  "Attributes", NULL);
-	// testing object functionalities in tobject.cpp
-	AddTest("tobject", test_object, cleanup_object,  "Objects", NULL);
-	// testing reference functionalities in trefer.cpp
-	AddTest("trefer", test_reference, cleanup_reference,  "References", NULL);
-	// testing variable-length strings in tvlstr.cpp
-	AddTest("tvlstr", test_vlstrings, cleanup_vlstrings,  "Variable-Length Strings", NULL);
-	AddTest("ttypes", test_types, cleanup_types,  "Generic Data Types", NULL);
-	AddTest("tarray", test_array, cleanup_array,  "Array Datatypes", NULL);
-	AddTest("tcompound", test_compound, cleanup_compound,  "Compound Data Types", NULL);
-	AddTest("tdspl", test_dsproplist, cleanup_dsproplist,  "Dataset Property List", NULL);
-	AddTest("tfilter", test_filters, cleanup_filters,  "Various Filters", NULL);
-	AddTest("tlinks", test_links, cleanup_links,  "Various Links", NULL);
+        // Turn of the auto-printing when failure occurs so that we can
+        // handle the errors appropriately since sometime failures are
+        // caused deliberately and expected.
+        Exception::dontPrint();
+        /* Initialize testing framework */
+        TestInit(argv[0], NULL, NULL);
+
+        // testing file creation and opening in tfile.cpp
+        AddTest("tfile", test_file, cleanup_file, "File I/O Operations", NULL);
+        // testing dataset functionalities in dset.cpp
+        AddTest("dsets", test_dset, cleanup_dsets, "Dataset I/O Operations", NULL);
+        // testing dataspace functionalities in th5s.cpp
+        AddTest("th5s",  test_h5s,  cleanup_h5s,  "Dataspaces", NULL);
+        // testing attribute functionalities in tattr.cpp
+        AddTest("tattr", test_attr, cleanup_attr,  "Attributes", NULL);
+        // testing object functionalities in tobject.cpp
+        AddTest("tobject", test_object, cleanup_object,  "Objects", NULL);
+        // testing reference functionalities in trefer.cpp
+        AddTest("trefer", test_reference, cleanup_reference,  "References", NULL);
+        // testing variable-length strings in tvlstr.cpp
+        AddTest("tvlstr", test_vlstrings, cleanup_vlstrings,  "Variable-Length Strings", NULL);
+        AddTest("ttypes", test_types, cleanup_types,  "Generic Data Types", NULL);
+        AddTest("tarray", test_array, cleanup_array,  "Array Datatypes", NULL);
+        AddTest("tcompound", test_compound, cleanup_compound,  "Compound Data Types", NULL);
+        AddTest("tdspl", test_dsproplist, cleanup_dsproplist,  "Dataset Property List", NULL);
+        AddTest("tfilter", test_filters, cleanup_filters,  "Various Filters", NULL);
+        AddTest("tlinks", test_links, cleanup_links,  "Various Links", NULL);
 /* Comment out tests that are not done yet. - BMR, Feb 2001
-	AddTest("select", test_select, cleanup_select,  "Selections", NULL);
-	AddTest("time", test_time, cleanup_time,  "Time Datatypes", NULL);
-	AddTest("vltypes", test_vltypes, cleanup_vltypes,  "Variable-Length Datatypes", NULL);
-	AddTest("iterate", test_iterate, cleanup_iterate,  "Group & Attribute Iteration", NULL);
-	AddTest("genprop", test_genprop, cleanup_genprop,  "Generic Properties", NULL);
-	AddTest("id", test_ids, NULL,  "User-Created Identifiers", NULL);
+        AddTest("select", test_select, cleanup_select,  "Selections", NULL);
+        AddTest("time", test_time, cleanup_time,  "Time Datatypes", NULL);
+        AddTest("vltypes", test_vltypes, cleanup_vltypes,  "Variable-Length Datatypes", NULL);
+*/
+        AddTest("iterate", test_iterate, cleanup_iterate,  "Group & Attribute Iteration", NULL);
+/*
+        AddTest("genprop", test_genprop, cleanup_genprop,  "Generic Properties", NULL);
+        AddTest("id", test_ids, NULL,  "User-Created Identifiers", NULL);
 
 Comment out tests that are not done yet */
 
 /* Tentative - BMR 2007/1/12
-	AddTest("enum", test_enum, cleanup_enum,  "Enum Data Types", NULL);
+        AddTest("enum", test_enum, cleanup_enum,  "Enum Data Types", NULL);
 */
     }
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("Tests failed", __LINE__, __FILE__, E.getCDetailMsg());
     }
@@ -132,6 +123,9 @@ Comment out tests that are not done yet */
     if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP"))
         TestCleanup();
 
+    /* Release test infrastructure */
+    TestShutdown();
+
     return (GetTestNumErrs());
 }
 
diff --git a/c++/test/tfile.cpp b/c++/test/tfile.cpp
index 6871f06..51682a3 100644
--- a/c++/test/tfile.cpp
+++ b/c++/test/tfile.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -22,28 +20,20 @@
         h5_fileaccess() -- in h5test.c, returns a file access template
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
-
-#include "H5Cpp.h"	// C++ API header file
+using std::cerr;
+using std::endl;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#include "h5cpputil.h"	// C++ utilility header file
+#include "h5test.h"
+#include "h5cpputil.h"  // C++ utilility header file
 
 const hsize_t F1_USERBLOCK_SIZE = (hsize_t)0;
 const size_t F1_OFFSET_SIZE = sizeof(haddr_t);
@@ -57,6 +47,7 @@ const size_t F2_OFFSET_SIZE = 8;
 const size_t F2_LENGTH_SIZE = 8;
 const unsigned F2_SYM_LEAF_K  = 8;
 const unsigned F2_SYM_INTERN_K = 32;
+const unsigned F2_ISTORE = 64;
 const H5std_string    FILE2("tfile2.h5");
 
 const hsize_t F3_USERBLOCK_SIZE = (hsize_t)0;
@@ -73,20 +64,20 @@ const H5std_string    FILE4("tfile4.h5");
 /*-------------------------------------------------------------------------
  * Function:    test_file_create
  *
- * Purpose:     Test file and template creations
+ * Purpose      Test file and template creations
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              January, 2001
  *
  * Modifications:
- *	January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hsize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *        January, 2005: C tests' macro VERIFY casts values to 'long' for all
+ *                     cases.  Since there are no operator<< for 'long long'
+ *                     or int64 in VS C++ ostream, I casted the hsize_t values
+ *                     passed to verify_val to 'long' as well.  If problems
+ *                     arises later, this will have to be specificly handled
+ *                     with a special routine.
  *
  *-------------------------------------------------------------------------
  */
@@ -105,83 +96,83 @@ static void test_file_create()
     // Setting this to NULL for cleaning up in failure situations
     H5File* file1 = NULL;
     try {
-	// Create file FILE1
-	file1 = new H5File (FILE1, H5F_ACC_EXCL);
-
-	// 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
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File constructor", "Attempted to create an existing file.");
-	}
-	catch( FileIException E ) // catch truncating existing file
-	{} // do nothing, FAIL expected
-
-	// Close file1
-	delete file1;
-	file1 = NULL;
-
-	// Try again with H5F_ACC_EXCL. This should fail because the file
-	// already exists from the previous steps.
-	try {
-	    H5File file2(FILE1, H5F_ACC_EXCL);  // should throw E
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File constructor", "File already exists.");
-	}
-	catch( FileIException E ) // catching creating existing file
-	{} // do nothing, FAIL expected
-
-    	// Test create with H5F_ACC_TRUNC. This will truncate the existing file.
-	file1 = new H5File (FILE1, H5F_ACC_TRUNC);
-
-	// Try to create first file again. This should fail because file1
-	// is the same file and is currently open.
-    	try {
-	    H5File file2 (FILE1, H5F_ACC_TRUNC);   // should throw E
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File constructor", "H5F_ACC_TRUNC attempt on an opened file.");
-	}
-	catch( FileIException E ) // catching truncating opened file
-	{} // do nothing, FAIL expected
-
-     	// Try with H5F_ACC_EXCL. This should fail too because the file already
-     	// exists.
-    	try {
-	    H5File file3 (FILE1, H5F_ACC_EXCL);  // should throw E
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File constructor", "H5F_ACC_EXCL attempt on an existing file.");
-    	}
-	catch( FileIException E ) // catching H5F_ACC_EXCL on existing file
-	{} // do nothing, FAIL expected
-
-    	// Get the file-creation template
-	FileCreatPropList tmpl1 = file1->getCreatePlist();
-
-	hsize_t ublock = tmpl1.getUserblock();
-	verify_val((long)ublock, (long)F1_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
-
-    	size_t  parm1, parm2;		// file-creation parameters
-	tmpl1.getSizes( parm1, parm2);
-	verify_val(parm1, F1_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
-	verify_val(parm2, F1_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        // Create file FILE1
+        file1 = new H5File (FILE1, H5F_ACC_EXCL);
+
+        // 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
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File constructor", "Attempted to create an existing file.");
+        }
+        catch (FileIException& E) // catch truncating existing file
+        {} // do nothing, FAIL expected
+
+        // Close file1
+        delete file1;
+        file1 = NULL;
+
+        // Try again with H5F_ACC_EXCL. This should fail because the file
+        // already exists from the previous steps.
+        try {
+            H5File file2(FILE1, H5F_ACC_EXCL);  // should throw E
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File constructor", "File already exists.");
+        }
+        catch (FileIException& E) // catching creating existing file
+        {} // do nothing, FAIL expected
+
+            // Test create with H5F_ACC_TRUNC. This will truncate the existing file.
+        file1 = new H5File (FILE1, H5F_ACC_TRUNC);
+
+        // Try to create first file again. This should fail because file1
+        // is the same file and is currently open.
+            try {
+            H5File file2 (FILE1, H5F_ACC_TRUNC);   // should throw E
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File constructor", "H5F_ACC_TRUNC attempt on an opened file.");
+        }
+        catch (FileIException& E) // catching truncating opened file
+        {} // do nothing, FAIL expected
+
+             // Try with H5F_ACC_EXCL. This should fail too because the file already
+             // exists.
+            try {
+            H5File file3 (FILE1, H5F_ACC_EXCL);  // should throw E
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File constructor", "H5F_ACC_EXCL attempt on an existing file.");
+            }
+        catch (FileIException& E) // catching H5F_ACC_EXCL on existing file
+        {} // do nothing, FAIL expected
+
+            // Get the file-creation template
+        FileCreatPropList tmpl1 = file1->getCreatePlist();
+
+        hsize_t ublock = tmpl1.getUserblock();
+        verify_val((long)ublock, (long)F1_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
+
+            size_t  parm1, parm2;                // file-creation parameters
+        tmpl1.getSizes( parm1, parm2);
+        verify_val(parm1, F1_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        verify_val(parm2, F1_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
 
         unsigned  iparm1,iparm2;        // file-creation parameters
         tmpl1.getSymk( iparm1, iparm2);
         verify_val(iparm1, F1_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
         verify_val(iparm2, F1_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
 
-	// tmpl1 is automatically closed; if error occurs, it'll be
-	// caught in the catch block
+        // tmpl1 is automatically closed; if error occurs, it'll be
+        // caught in the catch block
 
-	// Close first file
-	delete file1;
+        // Close first file
+        delete file1;
     }
-    catch (InvalidActionException E)
+    catch (InvalidActionException& E)
     {
         cerr << " *FAILED*" << endl;
         cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
@@ -189,9 +180,9 @@ static void test_file_create()
             delete file1;
     }
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
         if (file1 != NULL) // clean up
             delete file1;
     }
@@ -200,79 +191,79 @@ static void test_file_create()
     FileCreatPropList* tmpl1 = NULL;
     try
     {
-    	// Create a new file with a non-standard file-creation template
-	tmpl1 = new FileCreatPropList;
+            // Create a new file with a non-standard file-creation template
+        tmpl1 = new FileCreatPropList;
 
-    	// Set the new file-creation parameters
-	tmpl1->setUserblock (F2_USERBLOCK_SIZE);
-	tmpl1->setSizes( F2_OFFSET_SIZE, F2_LENGTH_SIZE );
-	tmpl1->setSymk( F2_SYM_INTERN_K, F2_SYM_LEAF_K );
+            // Set the new file-creation parameters
+        tmpl1->setUserblock (F2_USERBLOCK_SIZE);
+        tmpl1->setSizes( F2_OFFSET_SIZE, F2_LENGTH_SIZE );
+        tmpl1->setSymk( F2_SYM_INTERN_K, F2_SYM_LEAF_K );
 
-     	// Try to create second file, with non-standard file-creation template
-     	// params.
-	H5File file2( FILE2, H5F_ACC_TRUNC, *tmpl1 );
+             // Try to create second file, with non-standard file-creation template
+             // params.
+        H5File file2( FILE2, H5F_ACC_TRUNC, *tmpl1 );
 
-    	// Release file-creation template
-	delete tmpl1;
-	tmpl1 = NULL;
+            // Release file-creation template
+        delete tmpl1;
+        tmpl1 = NULL;
 
-	// Get the file-creation template
-	tmpl1 = new FileCreatPropList (file2.getCreatePlist());
+        // Get the file-creation template
+        tmpl1 = new FileCreatPropList (file2.getCreatePlist());
 
-	// Get the file-creation parameters
-	hsize_t ublock = tmpl1->getUserblock();
-	verify_val((long)ublock, (long)F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
+        // Get the file-creation parameters
+        hsize_t ublock = tmpl1->getUserblock();
+        verify_val((long)ublock, (long)F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
 
-    	size_t  parm1, parm2;		// file-creation parameters
-	tmpl1->getSizes( parm1, parm2);
-	verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
-	verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        size_t parm1, parm2; // file-creation parameters
+        tmpl1->getSizes( parm1, parm2);
+        verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
 
-        unsigned  iparm1,iparm2;	// file-creation parameters
+        unsigned  iparm1,iparm2;        // file-creation parameters
         tmpl1->getSymk( iparm1, iparm2);
         verify_val(iparm1, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
         verify_val(iparm2, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
 
-	// Clone the file-creation template
-	FileCreatPropList tmpl2;
-	tmpl2.copy (*tmpl1);
+        // Clone the file-creation template
+        FileCreatPropList tmpl2;
+        tmpl2.copy (*tmpl1);
 
-	// Release file-creation template
-	delete tmpl1;
-	tmpl1 = NULL;
+        // Release file-creation template
+        delete tmpl1;
+        tmpl1 = NULL;
 
-	// Set the new file-creation parameter
-	tmpl2.setUserblock( F3_USERBLOCK_SIZE );
+        // Set the new file-creation parameter
+        tmpl2.setUserblock( F3_USERBLOCK_SIZE );
 
-	// Try to create second file, with non-standard file-creation template
-	// params
-	H5File file3( FILE3, H5F_ACC_TRUNC, tmpl2 );
+        // Try to create second file, with non-standard file-creation template
+        // params
+        H5File file3( FILE3, H5F_ACC_TRUNC, tmpl2 );
 
-	// Get the file-creation template
-	tmpl1 = new FileCreatPropList (file3.getCreatePlist());
+        // Get the file-creation template
+        tmpl1 = new FileCreatPropList (file3.getCreatePlist());
 
-	// Get the file-creation parameters
-	ublock = tmpl1->getUserblock();
-	verify_val((long)ublock, (long)F3_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
+        // Get the file-creation parameters
+        ublock = tmpl1->getUserblock();
+        verify_val((long)ublock, (long)F3_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
 
-	tmpl1->getSizes( parm1, parm2);
-	verify_val(parm1, F3_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
-	verify_val(parm2, F3_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        tmpl1->getSizes( parm1, parm2);
+        verify_val(parm1, F3_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        verify_val(parm2, F3_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
 
-    	tmpl1->getSymk( iparm1, iparm2);
-	verify_val(iparm1, F3_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
-	verify_val(iparm2, F3_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
+            tmpl1->getSymk( iparm1, iparm2);
+        verify_val(iparm1, F3_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
+        verify_val(iparm2, F3_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
 
-	// Release file-creation template
-	delete tmpl1;
-	PASSED();
+        // Release file-creation template
+        delete tmpl1;
+        PASSED();
     }
     // catch all exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
-	if (tmpl1 != NULL)  // clean up
-	    delete tmpl1;
+        issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
+        if (tmpl1 != NULL)  // clean up
+            delete tmpl1;
     }
 }   // test_file_create()
 
@@ -280,20 +271,20 @@ static void test_file_create()
 /*-------------------------------------------------------------------------
  * Function:    test_file_open
  *
- * Purpose:     Test file accesses
+ * Purpose      Test file accesses
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              January, 2001
  *
  * Modifications:
- *	January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hsize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *        January, 2005: C tests' macro VERIFY casts values to 'long' for all
+ *                     cases.  Since there are no operator<< for 'long long'
+ *                     or int64 in VS C++ ostream, I casted the hsize_t values
+ *                     passed to verify_val to 'long' as well.  If problems
+ *                     arises later, this will have to be specificly handled
+ *                     with a special routine.
  *
  *-------------------------------------------------------------------------
  */
@@ -304,56 +295,57 @@ static void test_file_open()
 
     try {
 
-	// Open first file
-	H5File file1 (FILE2, H5F_ACC_RDWR );
+        // Open first file
+        H5File file1 (FILE2, H5F_ACC_RDWR );
 
-	// Get the file-creation template
-	FileCreatPropList tmpl1 = file1.getCreatePlist();
+        // Get the file-creation template
+        FileCreatPropList tmpl1 = file1.getCreatePlist();
 
-	// Get the file-creation parameters
-	hsize_t ublock = tmpl1.getUserblock();
-	verify_val((long)ublock, (long)F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
+        // Get the file-creation parameters
+        hsize_t ublock = tmpl1.getUserblock();
+        verify_val((long)ublock, (long)F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
 
-    	size_t  parm1, parm2;		// file-creation parameters
-	tmpl1.getSizes( parm1, parm2);
-	verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
-	verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        size_t  parm1, parm2;  // file-creation parameters
+        tmpl1.getSizes( parm1, parm2);
+        verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
 
         unsigned  iparm1,iparm2;       // file-creation parameters
         tmpl1.getSymk( iparm1, iparm2);
         verify_val(iparm1, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
         verify_val(iparm2, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
 
-	// Test H5File constructor with existing file id
-	H5File file2(file1.getId());
-	file1.close();
+        // Test H5File constructor with existing file id
+        H5File file2(file1.getId());
+        file1.close();
 
-	// Try truncating the file, and it should fail because the file is
-	// still opened with file2.
-    	try {
-	    H5File file3 (FILE2, H5F_ACC_TRUNC);  // should throw E
+        // Try truncating the file, and it should fail because the file is
+        // still opened with file2.
+            try {
+            H5File file3 (FILE2, H5F_ACC_TRUNC);  // should throw E
 
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File constructor", "Attempt truncating an opened file.");
-    	}
-	catch( FileIException E ) // catching H5F_ACC_TRUNC on opened file
-	{} // do nothing, FAIL expected
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File constructor", "Attempt truncating an opened file.");
+            }
+        catch (FileIException& E) // catching H5F_ACC_TRUNC on opened file
+        {} // do nothing, FAIL expected
 
-	// Now, really close the file.
-	file2.close();
+        // Now, really close the file.
+        file2.close();
 
-	// Truncating should succeed now.
-	H5File file3(FILE2, H5F_ACC_TRUNC);
+        // Truncating should succeed now.
+        H5File file3(FILE2, H5F_ACC_TRUNC);
 
-	// Opening another file to file3 object, FILE2 should be closed, so
-	// the next attempt to truncate FILE2 should succeed.
-	file3.openFile(FILE1, H5F_ACC_RDONLY);
-	H5File file4(FILE2, H5F_ACC_TRUNC);
+        // Opening another file to file3 object, FILE2 should be closed, so
+        // the next attempt to truncate FILE2 should succeed.
+        file3.openFile(FILE1, H5F_ACC_RDONLY);
+        H5File file4(FILE2, H5F_ACC_TRUNC);
 
-	PASSED();
+        PASSED();
     }   // end of try block
 
-    catch( Exception E ) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_file_open()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_file_open()
@@ -362,11 +354,11 @@ static void test_file_open()
 /*-------------------------------------------------------------------------
  * Function:    test_file_size
  *
- * Purpose:     Test file size.
+ * Purpose      Test file size.
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Raymond Lu
+ * Programmer   Raymond Lu
  *              June, 2004
  *
  * Modifications:
@@ -378,7 +370,7 @@ static void test_file_size()
     // Output message about test being performed
     SUBTEST("File Size");
 
-    hid_t	fapl_id;
+    hid_t        fapl_id;
     fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
 
     try {
@@ -386,13 +378,13 @@ static void test_file_size()
         // list object to pass in H5File::H5File
         FileAccPropList fapl(fapl_id);
 
-    	// Set to sec2 driver.  Do we want to test other file drivers?
+            // Set to sec2 driver.  Do we want to test other file drivers?
         // They're not tested in C++.
         // File drivers seem not implemented.
-	// fapl.setSec2();
+        // fapl.setSec2();
 
         // Create a file
-	H5File file4( FILE4, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
+        H5File file4( FILE4, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
 
         // Get file size
         hsize_t file_size = file4.getFileSize();
@@ -401,22 +393,25 @@ static void test_file_size()
         if (file_size < 1*KB || file_size > 4*KB)
             issue_fail_msg("test_file_size()", __LINE__, __FILE__, "getFileSize() returned unreasonable value");
 
-	// Get the amount of free space in the file
-	hssize_t free_space = file4.getFreeSpace();
+        // Get the amount of free space in the file
+        hssize_t free_space = file4.getFreeSpace();
 
-	// Check if it's reasonable.  It's 0 now.
-	if (free_space < 0 || free_space > 4*KB)
-	    issue_fail_msg("test_file_size()", __LINE__, __FILE__, "getFreeSpace returned unreasonable value");
+        // Check if it's reasonable.  It's 0 now.
+        if (free_space < 0 || free_space > 4*KB)
+            issue_fail_msg("test_file_size()", __LINE__, __FILE__, "getFreeSpace returned unreasonable value");
 
-	PASSED();
+        PASSED();
     }   // end of try block
 
-    catch( Exception E ) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_file_size()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     // use C test utility routine to close property list.
-    H5Pclose(fapl_id);
+    herr_t ret = H5Pclose(fapl_id);
+    if (ret < 0)
+        issue_fail_msg("test_file_size()", __LINE__, __FILE__, "H5Pclose failed");
 
 }   // test_file_size()
 
@@ -424,25 +419,25 @@ static void test_file_size()
 /*-------------------------------------------------------------------------
  * Function:    test_file_name
  *
- * Purpose:     Test getting file's name.
+ * Purpose      Test getting file's name.
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler
+ * Programmer   Binh-Minh Ribler
  *              July, 2004
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-const int	RANK = 2;
-const int	NX = 4;
-const int	NY = 5;
-const H5std_string	GROUPNAME ("group");
-const H5std_string	DSETNAME ("dataset");
-const H5std_string	DATTRNAME ("dataset attribute");
-const H5std_string	FATTRNAME ("file attribute");
-const H5std_string	DTYPENAME ("compound");
+const int        RANK = 2;
+const int        NX = 4;
+const int        NY = 5;
+const H5std_string        GROUPNAME ("group");
+const H5std_string        DSETNAME ("dataset");
+const H5std_string        DATTRNAME ("dataset attribute");
+const H5std_string        FATTRNAME ("file attribute");
+const H5std_string        DTYPENAME ("compound");
 
 // Compound datatype
 typedef struct s1_t {
@@ -458,69 +453,67 @@ static void test_file_name()
     H5std_string file_name;
     try {
         // Create a file using default properties.
-	H5File file4(FILE4, H5F_ACC_TRUNC);
+        H5File file4(FILE4, H5F_ACC_TRUNC);
 
         // Get file name from the file instance.
         file_name = file4.getFileName();
-	verify_val(file_name, FILE4, "H5File::getFileName", __LINE__, __FILE__);
+        verify_val(file_name, FILE4, "H5File::getFileName", __LINE__, __FILE__);
 
-	// Create a group in the root group.
-	Group group(file4.createGroup(GROUPNAME, 0));
+        // Create a group in the root group.
+        Group group(file4.createGroup(GROUPNAME, 0));
 
-	// Get and verify file name via a group.
-	file_name = group.getFileName();
-	verify_val(file_name, FILE4, "Group::getFileName", __LINE__, __FILE__);
+        // Get and verify file name via a group.
+        file_name = group.getFileName();
+        verify_val(file_name, FILE4, "Group::getFileName", __LINE__, __FILE__);
 
-	// Create the data space.
-	hsize_t dims[RANK] = {NX, NY};
-	DataSpace space(RANK, dims);
+        // Create the data space.
+        hsize_t dims[RANK] = {NX, NY};
+        DataSpace space(RANK, dims);
 
-	// Create a new dataset.
-	DataSet dataset(file4.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
+        // Create a new dataset.
+        DataSet dataset(file4.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
 
-	// Get and verify file name via a dataset.
-	file_name = dataset.getFileName();
-	verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
+        // Get and verify file name via a dataset.
+        file_name = dataset.getFileName();
+        verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
 
-	// Create an attribute for the dataset.
-	Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
+        // Create an attribute for the dataset.
+        Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
 
-	// Get and verify file name via an attribute.
-	file_name = attr.getFileName();
-	verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
+        // Get and verify file name via an attribute.
+        file_name = attr.getFileName();
+        verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
 
-	// Create a compound datatype.
-	CompType comp_type (sizeof(s1_t));
+        // Create a compound datatype.
+        CompType comp_type (sizeof(s1_t));
 
-	// Insert fields.
-	comp_type.insertMember("a", HOFFSET(s1_t, a), PredType::NATIVE_INT);
-	comp_type.insertMember("b", HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);
+        // Insert fields.
+        comp_type.insertMember("a", HOFFSET(s1_t, a), PredType::NATIVE_INT);
+        comp_type.insertMember("b", HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);
 
-	// Save it on file.
-	comp_type.commit(file4, DTYPENAME);
+        // Save it on file.
+        comp_type.commit(file4, DTYPENAME);
 
-	// Get and verify file name via a committed datatype.
-	comp_type.getFileName();
-	verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__);
-	PASSED();
+        // Get and verify file name via a committed datatype.
+        comp_type.getFileName();
+        verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__);
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_file_name()", __LINE__, __FILE__, E.getCDetailMsg());
     }
-
 }   // test_file_name()
 
 

-#define NUM_OBJS	4
-#define NUM_ATTRS	3
-const int	RANK1 = 1;
-const int	ATTR1_DIM1 = 3;
-const H5std_string	FILE5("tfattrs.h5");
-const H5std_string	FATTR1_NAME ("file attribute 1");
-const H5std_string	FATTR2_NAME ("file attribute 2");
-int fattr_data[ATTR1_DIM1]={512,-234,98123}; /* Test data for file attribute */
-int dattr_data[ATTR1_DIM1]={256,-123,1000}; /* Test data for dataset attribute */
+const int        RANK1 = 1;
+const int        ATTR1_DIM1 = 3;
+const H5std_string        FILE5("tfattrs.h5");
+const H5std_string        FATTR1_NAME ("file attribute 1");
+const H5std_string        FATTR2_NAME ("file attribute 2");
+int fattr_data[ATTR1_DIM1]={512,-234,98123}; // Test data for file attribute
+int dattr_data[ATTR1_DIM1]={256,-123,1000}; // Test data for dataset attribute
 
 static void test_file_attribute()
 {
@@ -533,118 +526,120 @@ static void test_file_attribute()
     H5std_string file_name;
     try {
         // Create a file using default properties.
-	H5File file5(FILE5, H5F_ACC_TRUNC);
+        H5File file5(FILE5, H5F_ACC_TRUNC);
 
-	// Create the data space
-	hsize_t dims[RANK1] = {ATTR1_DIM1};
-	DataSpace space(RANK1, dims);
+        // Create the data space
+        hsize_t dims[RANK1] = {ATTR1_DIM1};
+        DataSpace space(RANK1, dims);
 
-	// Create two attributes for the file
-	Attribute fattr1(file5.createAttribute(FATTR1_NAME, PredType::NATIVE_FLOAT, space));
-	Attribute fattr2(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
+        // Create two attributes for the file
+        Attribute fattr1(file5.createAttribute(FATTR1_NAME, PredType::NATIVE_FLOAT, space));
+        Attribute fattr2(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
 
-	fattr2.write(PredType::NATIVE_INT, fattr_data);
+        fattr2.write(PredType::NATIVE_INT, fattr_data);
 
-	try {
-	    // Try to create the same attribute again (should fail)
-	    Attribute fattr_dup(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File createAttribute", "Attempted to create an existing attribute.");
-	}
-	catch( AttributeIException E ) // catch creating existing attribute
-	{} // do nothing, FAIL expected
+        try {
+            // Try to create the same attribute again (should fail)
+            Attribute fattr_dup(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File createAttribute", "Attempted to create an existing attribute.");
+        }
+        catch (AttributeIException& E) // catch creating existing attribute
+        {} // do nothing, FAIL expected
 
-	// Create a new dataset
-	DataSet dataset(file5.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
+        // Create a new dataset
+        DataSet dataset(file5.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
 
-	// Create an attribute for the dataset
-	Attribute dattr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
+        // Create an attribute for the dataset
+        Attribute dattr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
 
-	// Write data to the second file attribute
-	dattr.write(PredType::NATIVE_INT, dattr_data);
+        // Write data to the second file attribute
+        dattr.write(PredType::NATIVE_INT, dattr_data);
 
-	// Test flushing out the data from the attribute object
+        // Test flushing out the data from the attribute object
         dattr.flush(H5F_SCOPE_GLOBAL);
 
-	// Get and verify the number of all objects in the file
-	// Current: 1 file, 2 file attr, 1 ds, and 1 ds attr.
-	ssize_t num_objs = file5.getObjCount(H5F_OBJ_ALL);
-	verify_val(num_objs, 5, "H5File::getObjCount", __LINE__, __FILE__);
-
-	num_objs = file5.getObjCount(H5F_OBJ_GROUP);
-	verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_GROUP)", __LINE__, __FILE__);
-	num_objs = file5.getObjCount(H5F_OBJ_DATASET);
-	verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_DATASET)", __LINE__, __FILE__);
-	num_objs = file5.getObjCount(H5F_OBJ_ATTR);
-	verify_val(num_objs, 3, "H5File::getObjCount(H5F_OBJ_ATTR)", __LINE__, __FILE__);
-	num_objs = file5.getObjCount(H5F_OBJ_DATATYPE);
-	verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_DATATYPE)", __LINE__, __FILE__);
-	num_objs = file5.getObjCount(H5F_OBJ_FILE);
-	verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_FILE)", __LINE__, __FILE__);
-	
-	// Get the file name using the attributes
-	H5std_string fname = fattr1.getFileName();
-	verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
-
-	fname.clear();
-	fname = dattr.getFileName();
-	verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
-
-	// Get the class of a file attribute's datatype
-	H5T_class_t atclass = fattr1.getTypeClass();
-	verify_val(atclass, H5T_FLOAT, "Attribute::getTypeClass()", __LINE__, __FILE__);
-
-	// Get and verify the number of attributes attached to a file
-	int n_attrs = file5.getNumAttrs();
-	verify_val(n_attrs, 2, "H5File::getNumAttrs()", __LINE__, __FILE__);
-
-	// Get and verify the number of attributes attached to a dataset
-	n_attrs = 0;
-	n_attrs = dataset.getNumAttrs();
-	verify_val(n_attrs, 1, "DataSet::getNumAttrs()", __LINE__, __FILE__);
-
-	// Read back attribute's data
-	HDmemset(rdata, 0, sizeof(rdata));
+        // Get and verify the number of all objects in the file
+        // Current: 1 file, 2 file attr, 1 ds, and 1 ds attr.
+        ssize_t num_objs = file5.getObjCount(H5F_OBJ_ALL);
+        verify_val(num_objs, 5, "H5File::getObjCount", __LINE__, __FILE__);
+
+        num_objs = file5.getObjCount(H5F_OBJ_GROUP);
+        verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_GROUP)", __LINE__, __FILE__);
+        num_objs = file5.getObjCount(H5F_OBJ_DATASET);
+        verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_DATASET)", __LINE__, __FILE__);
+        num_objs = file5.getObjCount(H5F_OBJ_ATTR);
+        verify_val(num_objs, 3, "H5File::getObjCount(H5F_OBJ_ATTR)", __LINE__, __FILE__);
+        num_objs = file5.getObjCount(H5F_OBJ_DATATYPE);
+        verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_DATATYPE)", __LINE__, __FILE__);
+        num_objs = file5.getObjCount(H5F_OBJ_FILE);
+        verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_FILE)", __LINE__, __FILE__);
+        
+        // Get the file name using the attributes
+        H5std_string fname = fattr1.getFileName();
+        verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
+
+        fname.clear();
+        fname = dattr.getFileName();
+        verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
+
+        // Get the class of a file attribute's datatype
+        H5T_class_t atclass = fattr1.getTypeClass();
+        verify_val(atclass, H5T_FLOAT, "Attribute::getTypeClass()", __LINE__, __FILE__);
+
+        // Get and verify the number of attributes attached to a file
+        int n_attrs = file5.getNumAttrs();
+        verify_val(n_attrs, 2, "H5File::getNumAttrs()", __LINE__, __FILE__);
+
+        // Get and verify the number of attributes attached to a dataset
+        n_attrs = 0;
+        n_attrs = dataset.getNumAttrs();
+        verify_val(n_attrs, 1, "DataSet::getNumAttrs()", __LINE__, __FILE__);
+
+        // Read back attribute's data
+        HDmemset(rdata, 0, sizeof(rdata));
         dattr.read(PredType::NATIVE_INT, rdata);
         /* Check results */
         for (i = 0; i < ATTR1_DIM1; i++) {
             if (rdata[i] != dattr_data[i]) {
                 H5_FAILED();
-		cerr << endl;
+                cerr << endl;
                 cerr << "element [" << i << "] is " << rdata[i] <<
-			"but should have been " << dattr_data[i] << endl;
+                        "but should have been " << dattr_data[i] << endl;
                 }
             }
-	PASSED();
+        PASSED();
     }   // end of try block
 
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_file_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_file_attribute()
+
 

-const H5std_string	FILE6("tfile5.h5");
-const H5std_string	ROOTGROUP("/");
-const H5std_string	GROUP1("/G1");
-const H5std_string	SUBGROUP3("/G1/G3");
+const H5std_string        FILE6("tfile5.h5");
+const H5std_string        ROOTGROUP("/");
+const H5std_string        GROUP1("/G1");
+const H5std_string        SUBGROUP3("/G1/G3");
 
 /*-------------------------------------------------------------------------
- * Function:	test_libver_bounds_real
+ * Function:    test_libver_bounds_real
  *
- * Purpose:	Verify that a file created and modified with the
- *		specified libver bounds has the specified object header
- *		versions for the right objects.
+ * Purpose      Verify that a file created and modified with the
+ *              specified libver bounds has the specified object header
+ *              versions for the right objects.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		March, 2015
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              March, 2015
  *
  *-------------------------------------------------------------------------
  */
 static void test_libver_bounds_real(
-		H5F_libver_t libver_create, unsigned oh_vers_create,
-		H5F_libver_t libver_mod, unsigned oh_vers_mod)
+                H5F_libver_t libver_create, unsigned oh_vers_create,
+                H5F_libver_t libver_mod, unsigned oh_vers_mod)
 {
     try {
 
@@ -680,8 +675,8 @@ static void test_libver_bounds_real(
      */
     Group group = file.createGroup(GROUP1);
 
-    obj_version = file.childObjVersion(GROUP1);
-    verify_val(obj_version, oh_vers_mod, "H5File::childObjVersion", __LINE__, __FILE__);
+    obj_version = group.objVersion();
+    verify_val(obj_version, oh_vers_mod, "Group::objVersion", __LINE__, __FILE__);
 
     group.close(); // close "/G1"
 
@@ -691,8 +686,8 @@ static void test_libver_bounds_real(
      */
     group = file.createGroup(SUBGROUP3);
 
-    obj_version = group.childObjVersion(SUBGROUP3);
-    verify_val(obj_version, oh_vers_mod, "H5File::childObjVersion", __LINE__, __FILE__);
+    obj_version = group.objVersion();
+    verify_val(obj_version, oh_vers_mod, "Group::objVersion", __LINE__, __FILE__);
 
     group.close(); // close "/G1/G3"
 
@@ -705,7 +700,8 @@ static void test_libver_bounds_real(
     // Everything should be closed as they go out of scope
     }   // end of try block
 
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_libver_bounds_real()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -715,12 +711,12 @@ static void test_libver_bounds_real(
  *
  * Function:    test_libver_bounds
  *
- * Purpose:     Verify that a file created and modified with various
- *		libver bounds is handled correctly.
+ * Purpose      Verify that a file created and modified with various
+ *              libver bounds is handled correctly.
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              March 2015
  *
  *-------------------------------------------------------------------------
@@ -737,44 +733,245 @@ static void test_libver_bounds()
 } /* end test_libver_bounds() */
 

 /*-------------------------------------------------------------------------
+ * Function:        test_commonfg
+ *
+ * Purpose      Verify that H5File works as a root group.
+ *
+ * Return       None
+ *
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              March, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_commonfg()
+{
+    // Output message about test being performed
+    SUBTEST("Root group");
+
+    try {
+        // Create a file using default properties.
+        H5File file4(FILE4, H5F_ACC_TRUNC);
+
+        // Try opening the root group.
+        Group rootgroup(file4.openGroup(ROOTGROUP));
+
+        // Create a group in the root group.
+        Group group(rootgroup.createGroup(GROUPNAME, 0));
+
+        // Create the data space.
+        hsize_t dims[RANK] = {NX, NY};
+        DataSpace space(RANK, dims);
+
+        // Create a new dataset.
+        DataSet dataset(group.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
+
+        // Get and verify file name via a dataset.
+        H5std_string file_name = dataset.getFileName();
+        verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
+
+        // Create an attribute for the dataset.
+        Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
+
+        // Get and verify file name via an attribute.
+        file_name = attr.getFileName();
+        verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
+
+        // Create an attribute for the file via root group.
+        Attribute rootg_attr(rootgroup.createAttribute(FATTRNAME, PredType::NATIVE_INT, space));
+
+        // Get and verify file name via an attribute.
+        file_name = attr.getFileName();
+        verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
+
+        PASSED();
+    }   // end of try block
+
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_commonfg()", __LINE__, __FILE__, E.getCDetailMsg());
+    }
+
+} /* end test_commonfg() */
+

+const H5std_string        FILE7("tfile7.h5");
+
+/*-------------------------------------------------------------------------
+ * Function:    test_file_info
+ *
+ * Purpose      Verify that various properties in a file creation property
+ *              lists are stored correctly in the file and can be retrieved
+ *              when the file is re-opened.
+ *
+ * Return       None
+ *
+ * Programmer   Binh-Minh Ribler
+ *              February, 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+const hsize_t FSP_SIZE_DEF = 4096;
+const hsize_t FSP_SIZE512 = 512;
+static void test_file_info()
+{
+    // Output message about test being performed
+    SUBTEST("File general information");
+
+    hsize_t out_threshold = 0;  // Free space section threshold to get
+    hbool_t out_persist = FALSE;// Persist free-space read
+    // File space handling strategy
+    H5F_fspace_strategy_t out_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+
+    try {
+        // Create a file using default properties.
+        H5File tempfile(FILE7, H5F_ACC_TRUNC);
+
+        // Get the file's version information.
+        H5F_info2_t finfo;
+        tempfile.getFileInfo(finfo);
+        verify_val(finfo.super.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.free.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.sohm.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+
+        // Close the file.
+        tempfile.close();
+
+        // Create file creation property list.
+        FileCreatPropList fcpl;
+
+        // Retrieve file space information.
+        fcpl.getFileSpaceStrategy(out_strategy, out_persist, out_threshold);
+
+        // Verify file space information.
+        verify_val(out_strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(out_persist, FALSE, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(out_threshold, 1, "H5File::getFileInfo", __LINE__, __FILE__);
+
+        /* Retrieve file space page size */
+        hsize_t out_fsp_psize = fcpl.getFileSpacePagesize();
+        verify_val(out_fsp_psize, FSP_SIZE_DEF, "FileCreatPropList::getFileSpacePagesize", __LINE__, __FILE__);
+
+        // Set various file information.
+        fcpl.setUserblock(F2_USERBLOCK_SIZE);
+        fcpl.setSizes(F2_OFFSET_SIZE, F2_LENGTH_SIZE);
+        fcpl.setSymk(F2_SYM_INTERN_K, F2_SYM_LEAF_K);
+        fcpl.setIstorek(F2_ISTORE);
+
+        hsize_t threshold = 5;      // Free space section threshold to set
+        hbool_t persist = TRUE;     // Persist free-space to set
+        H5F_fspace_strategy_t strategy = H5F_FSPACE_STRATEGY_PAGE;
+
+        fcpl.setFileSpaceStrategy(strategy, persist, threshold);
+        fcpl.setFileSpacePagesize(FSP_SIZE512);
+
+        // Creating a file with the non-default file creation property list
+        // should create a version 1 superblock
+
+        // Create file with custom file creation property list.
+        H5File file7(FILE7, H5F_ACC_TRUNC, fcpl);
+
+        // Close the file creation property list.
+        fcpl.close();
+
+        // Get the file's version information.
+        file7.getFileInfo(finfo);
+        verify_val(finfo.super.version, 2, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.free.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.sohm.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+
+        // Close the file.
+        file7.close();
+
+        // Re-open the file.
+        file7.openFile(FILE7, H5F_ACC_RDONLY);
+
+        // Get the file's creation property list.
+        FileCreatPropList fcpl2 = file7.getCreatePlist();
+
+        // Get the file's version information.
+        file7.getFileInfo(finfo);
+        verify_val(finfo.super.version, 2, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.free.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+        verify_val(finfo.sohm.version, 0, "H5File::getFileInfo", __LINE__, __FILE__);
+
+        // Retrieve the property values & check them.
+        hsize_t userblock = fcpl2.getUserblock();
+        verify_val(userblock, F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
+
+        size_t off_size = 0, len_size = 0;
+        fcpl2.getSizes(off_size, len_size);
+        verify_val(off_size, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+        verify_val(len_size, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
+
+        unsigned sym_ik = 0, sym_lk = 0;
+        fcpl2.getSymk(sym_ik, sym_lk);
+        verify_val(sym_ik, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
+        verify_val(sym_lk, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
+
+        unsigned istore_ik = fcpl2.getIstorek();
+        verify_val(istore_ik, F2_ISTORE, "FileCreatPropList::getIstorek", __LINE__, __FILE__);
+
+    /*  ret=H5Pget_shared_mesg_nindexes(fcpl2,&nindexes);
+    CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes");
+    VERIFY(nindexes, MISC11_NINDEXES, "H5Pget_shared_mesg_nindexes");
+ */ 
+
+        // Get and verify the file space info from the creation property list */
+        fcpl2.getFileSpaceStrategy(out_strategy, out_persist, out_threshold);
+        verify_val(out_strategy, strategy, "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
+        verify_val(out_persist, persist, "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
+        verify_val(out_threshold, threshold, "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
+
+        out_fsp_psize = fcpl2.getFileSpacePagesize();
+        verify_val(out_fsp_psize, FSP_SIZE512, "FileCreatPropList::getFileSpacePagesize", __LINE__, __FILE__);
+
+        PASSED();
+    }   // end of try block
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_filespace_info()", __LINE__, __FILE__, E.getCDetailMsg());
+    }
+}  /* test_file_info() */
+

+/*-------------------------------------------------------------------------
  * Function:    test_file
  *
- * Purpose:     Main file testing routine
+ * Purpose      Main file testing routine
  *
- * Return:      None
+ * Return       None
  *
- * Programmer:  Binh-Minh Ribler (use C version)
+ * Programmer   Binh-Minh Ribler (use C version)
  *              January 2001
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_file()
 {
     // Output message about test being performed
     MESSAGE(5, ("Testing File I/O Operations\n"));
 
-    test_file_create();	// Test file creation (also creation templates)
-    test_file_open();	// Test file opening
-    test_file_size();	// Test file size
-    test_file_name();	// Test getting file's name
-    test_file_attribute();	// Test file attribute feature
-    test_libver_bounds();	// Test format version
+    test_file_create();      // Test file creation (also creation templates)
+    test_file_open();        // Test file opening
+    test_file_size();        // Test file size
+    test_file_name();        // Test getting file's name
+    test_file_attribute();   // Test file attribute feature
+    test_libver_bounds();    // Test format version
+    test_commonfg();         // Test H5File as a root group
+    test_file_info();        // Test various file info
 }   // test_file()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_file
+ * Function:    cleanup_file
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:  (use C version)
+ * Programmer   (use C version)
  *
  * Modifications:
  *
@@ -791,4 +988,5 @@ void cleanup_file()
     HDremove(FILE4.c_str());
     HDremove(FILE5.c_str());
     HDremove(FILE6.c_str());
+    HDremove(FILE7.c_str());
 }   // cleanup_file
diff --git a/c++/test/tfilter.cpp b/c++/test/tfilter.cpp
index ff3901d..5de6590 100644
--- a/c++/test/tfilter.cpp
+++ b/c++/test/tfilter.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,38 +16,30 @@
    tfilter.cpp - HDF5 C++ testing various filters and their combination.
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
-#define DSET_DIM1	  100
-#define DSET_DIM2	  200
+#define DSET_DIM1 100
+#define DSET_DIM2 200
 #define FILTER_CHUNK_DIM1 2
 #define FILTER_CHUNK_DIM2 25
 
 // will do this function later or use it as guideline - BMR - 2007/01/26
 #if 0
 static herr_t test_filter_internal(hid_t fid, const char *name, hid_t dcpl,
-		int if_fletcher32, int corrupted, hsize_t *dset_size)
+                int if_fletcher32, int corrupted, hsize_t *dset_size)
 {
     cerr << "do nothing right now" << endl;
     return(0);
@@ -66,25 +56,25 @@ static size_t filter_bogus(unsigned int flags, size_t cd_nelmts,
 static size_t filter_bogus(size_t nbytes);
 /* This message derives from H5Z */
 const H5Z_class2_t H5Z_BOGUS[1] = {{
-    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
-    H5Z_FILTER_BOGUS,           /* Filter id number             */
-    1, 1,               /* Encoding and decoding enabled */
-    "bogus",                    /* Filter name for debugging    */
-    NULL,                       /* The "can apply" callback     */
-    NULL,                       /* The "set local" callback     */
+    H5Z_CLASS_T_VERS,  /* H5Z_class_t version */
+    H5Z_FILTER_BOGUS,  /* Filter id number             */
+    1, 1,              /* Encoding and decoding enabled */
+    "bogus",           /* Filter name for debugging    */
+    NULL,              /* The "can apply" callback     */
+    NULL,              /* The "set local" callback     */
     (H5Z_func_t)filter_bogus,   /* The actual filter function   */
 }};
 
 /*-------------------------------------------------------------------------
  * Function:    filter_bogus
  *
- * Purpose:     A bogus compression method that doesn't do anything.
+ * Purpose      A bogus compression method that doesn't do anything.
  *
- * Return:      Success:        Data chunk size
+ * Return       Success: Data chunk size
  *
- *              Failure:        0
+ *              Failure: 0
  *
- * Programmer:  Robb Matzke
+ * Programmer   Robb Matzke
  *              Tuesday, April 21, 1998
  *
  * Modifications:
@@ -103,17 +93,17 @@ filter_bogus(size_t nbytes)
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_null_filter
+ * Function:    test_null_filter
  *
- * Purpose:	Test null I/O filter by itself.
+ * Purpose      Test null I/O filter by itself.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version, from dsets.c/test_filters)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version, from dsets.c/test_filters)
+ *              January, 2007
  *
  * Modifications:
- *		Note: H5Z interface is not implemented yet.
+ *              Note: H5Z interface is not implemented yet.
  *
  *-------------------------------------------------------------------------
  */
@@ -126,46 +116,46 @@ static void test_null_filter()
     // Output message about test being performed
     SUBTEST("'Null' filter");
     try {
-	//hsize_t  null_size;          // Size of dataset with null filter
+        //hsize_t  null_size;          // Size of dataset with null filter
 
-	// Prepare dataset create property list
-	DSetCreatPropList dsplist;
-	dsplist.setChunk(2, chunk_size);
+        // Prepare dataset create property list
+        DSetCreatPropList dsplist;
+        dsplist.setChunk(2, chunk_size);
 
-	if (H5Zregister (H5Z_BOGUS)<0)
+        if (H5Zregister (H5Z_BOGUS)<0)
             throw Exception("test_null_filter", "H5Zregister failed");
 
-	// Set some pretent filter
-	dsplist.setFilter(H5Z_FILTER_BOGUS);
+        // Set some pretent filter
+        dsplist.setFilter(H5Z_FILTER_BOGUS);
 
-	// this function is just a stub right now; will work on it later - BMR
-	//if(test_filter_internal(file,DSET_BOGUS_NAME,dc,DISABLE_FLETCHER32,DATA_NOT_CORRUPTED,&null_size)<0)
+        // this function is just a stub right now; will work on it later - BMR
+        //if(test_filter_internal(file,DSET_BOGUS_NAME,dc,DISABLE_FLETCHER32,DATA_NOT_CORRUPTED,&null_size)<0)
         //  throw Exception("test_null_filter", "test_filter_internal failed");
 
-	// Close objects.
-	dsplist.close();
-	PASSED();
+        // Close objects.
+        dsplist.close();
+        PASSED();
     } // end of try
 
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("test_null_filter()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }  // test_null_filter
 
 /*-------------------------------------------------------------------------
- * Function:	test_szip_filter
+ * Function:    test_szip_filter
  *
- * Purpose:	Test SZIP filter by itself.
+ * Purpose      Test SZIP filter by itself.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (partly from dsets.c/test_filters)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (partly from dsets.c/test_filters)
+ *              January, 2007
  *
  * Modifications:
- *		Note: H5Z interface is not implemented yet.
+ *              Note: H5Z interface is not implemented yet.
  *
  *-------------------------------------------------------------------------
  */
@@ -232,7 +222,7 @@ static void test_szip_filter(H5File& file1)
         } // end of try
 
         // catch all other exceptions
-        catch (Exception E)
+        catch (Exception& E)
         {
             issue_fail_msg("test_szip_filter()", __LINE__, __FILE__, E.getCDetailMsg());
         }
@@ -240,7 +230,7 @@ static void test_szip_filter(H5File& file1)
         delete[] tconv_buf;
     } // if szip presents
     else {
-	SKIPPED();
+        SKIPPED();
     }
 
 #else /* H5_HAVE_FILTER_SZIP */
@@ -258,9 +248,7 @@ static void test_szip_filter(H5File& file1)
 **
 ****************************************************************/
 const H5std_string      FILE1("tfilters.h5");
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_filters()
 {
     // Output message about test being performed
@@ -276,33 +264,31 @@ void test_filters()
 
         H5File file1(FILE1, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
 
-	// Test basic VL string datatype
-	test_null_filter();
-	test_szip_filter(file1);
+        // Test basic VL string datatype
+        test_null_filter();
+        test_szip_filter(file1);
     }
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("test_filters()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_filters()
 
 /*-------------------------------------------------------------------------
- * Function:	cleanup_filters
+ * Function:    cleanup_filters
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Quincey Koziol
+ * Programmer   Quincey Koziol
  *              September 10, 1999
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_filters()
 {
     HDremove(FILE1.c_str());
diff --git a/c++/test/th5s.cpp b/c++/test/th5s.cpp
index b7a39b4..e99ce99 100644
--- a/c++/test/th5s.cpp
+++ b/c++/test/th5s.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -21,29 +19,21 @@
    EXTERNAL ROUTINES/VARIABLES:
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
-
-#include "H5Cpp.h"	// C++ API header file
+using std::cerr;
+using std::endl;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#include "h5cpputil.h"	// C++ utilility header file
-#include "H5srcdir.h"	// srcdir querying header file
+#include "h5test.h"
+#include "h5cpputil.h"  // C++ utilility header file
+#include "H5srcdir.h"   // srcdir querying header file
 
 const H5std_string    TESTFILE("th5s.h5");
 const H5std_string    DATAFILE("th5s1.h5");
@@ -94,132 +84,131 @@ int space5_data = 7;
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_basic
+ * Function:    test_h5s_basic
  *
- * Purpose:	Test basic H5S (dataspace) code
+ * Purpose      Test basic H5S (dataspace) code
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *     April 12, 2011: Raymond Lu
- *                     Starting from the 1.8.7 release, we allow dimension
- *                     size to be zero.  So I took out the test against it.
+ *              Starting from the 1.8.7 release, we allow dimension
+ *              size to be zero.  So I took out the test against it.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_basic()
 {
-    hsize_t		dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
-    hsize_t		dims2[] = {SPACE2_DIM1, SPACE2_DIM2, SPACE2_DIM3,
-				   SPACE2_DIM4};
-    hsize_t		dims3[H5S_MAX_RANK+1];
-    hsize_t		tmax[4];
+    hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
+    hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2, SPACE2_DIM3, SPACE2_DIM4};
+    hsize_t dims3[H5S_MAX_RANK+1];
+    hsize_t tmax[4];
 
     // Output message about test being performed
     SUBTEST("Dataspace Manipulation");
 
     try {
-	// Create simple dataspace sid1
-	DataSpace sid1 (SPACE1_RANK, dims1 );
-
-	// Get simple extent npoints of the dataspace sid1 and verify it
-	hssize_t	n;	 	// Number of dataspace elements
-	n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, (long)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3),
-	   "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
-
-	// Get the logical rank of dataspace sid1 and verify it
-	int	rank;		// Logical rank of dataspace
-	rank = sid1.getSimpleExtentNdims();
-	verify_val(rank, SPACE1_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
-
-	// Retrieves dimension size of dataspace sid1 and verify it
-	int ndims;		// Number of dimensions
-	hsize_t	tdims[4];	// Dimension array to test with
-	ndims = sid1.getSimpleExtentDims( tdims );
-	verify_val(ndims, SPACE1_RANK, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
-	verify_val(HDmemcmp(tdims, dims1, SPACE1_RANK * sizeof(unsigned)), 0,
-	   "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
-
-	// Create simple dataspace sid2
-	hsize_t	max2[] = {SPACE2_MAX1, SPACE2_MAX2, SPACE2_MAX3, SPACE2_MAX4};
-	DataSpace sid2 (SPACE2_RANK, dims2, max2);
-
-	// Get simple extent npoints of dataspace sid2 and verify it
-	n = sid2.getSimpleExtentNpoints();
-	verify_val((long)n, (long)(SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4),
-	   "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
-
-	// Get the logical rank of dataspace sid2 and verify it
-	rank = sid2.getSimpleExtentNdims();
-	verify_val(rank, SPACE2_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
-
-	// Retrieves dimension size and max size of dataspace sid2 and
-	// verify them
-	ndims = sid2.getSimpleExtentDims( tdims, tmax );
-	verify_val(HDmemcmp(tdims, dims2, SPACE2_RANK * sizeof(unsigned)), 0,
-	   "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
-	verify_val(HDmemcmp(tmax, max2, SPACE2_RANK * sizeof(unsigned)), 0,
-	   "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
-
-	// Check to be sure we can't create a simple data space that has too
-	// many dimensions.
-	try {
-	    DataSpace manydims_ds(H5S_MAX_RANK+1, dims3, NULL);
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("DataSpace constructor", "Library allowed overwrite of existing dataset");
-	}
-	catch( DataSpaceIException E ) // Simple data space with too many dims
-	{} // do nothing, exception expected
+        // Create simple dataspace sid1
+        DataSpace sid1 (SPACE1_RANK, dims1 );
+
+        // Get simple extent npoints of the dataspace sid1 and verify it
+        hssize_t n; // Number of dataspace elements
+        n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, (long)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3),
+            "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+
+        // Get the logical rank of dataspace sid1 and verify it
+        int rank; // Logical rank of dataspace
+        rank = sid1.getSimpleExtentNdims();
+        verify_val(rank, SPACE1_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+
+        // Retrieves dimension size of dataspace sid1 and verify it
+        int ndims; // Number of dimensions
+        hsize_t tdims[4]; // Dimension array to test with
+        ndims = sid1.getSimpleExtentDims( tdims );
+        verify_val(ndims, SPACE1_RANK, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        verify_val(HDmemcmp(tdims, dims1, SPACE1_RANK * sizeof(unsigned)), 0,
+            "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+
+        // Create simple dataspace sid2
+        hsize_t max2[] = {SPACE2_MAX1, SPACE2_MAX2, SPACE2_MAX3, SPACE2_MAX4};
+        DataSpace sid2 (SPACE2_RANK, dims2, max2);
+
+        // Get simple extent npoints of dataspace sid2 and verify it
+        n = sid2.getSimpleExtentNpoints();
+        verify_val((long)n, (long)(SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4),
+            "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+
+        // Get the logical rank of dataspace sid2 and verify it
+        rank = sid2.getSimpleExtentNdims();
+        verify_val(rank, SPACE2_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+
+        // Retrieves dimension size and max size of dataspace sid2 and
+        // verify them
+        ndims = sid2.getSimpleExtentDims( tdims, tmax );
+        verify_val(HDmemcmp(tdims, dims2, SPACE2_RANK * sizeof(unsigned)), 0,
+            "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        verify_val(HDmemcmp(tmax, max2, SPACE2_RANK * sizeof(unsigned)), 0,
+            "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+
+        // Check to be sure we can't create a simple data space that has too
+        // many dimensions.
+        try {
+            DataSpace manydims_ds(H5S_MAX_RANK+1, dims3, NULL);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("DataSpace constructor", "Library allowed overwrite of existing dataset");
+        }
+        catch (DataSpaceIException& E) // Simple data space with too many dims
+        {} // do nothing, exception expected
 
        /*
-	* Try reading a file that has been prepared that has a dataset with a
-	* higher dimensionality than what the library can handle.
-	*
-	* If this test fails and the H5S_MAX_RANK variable has changed, follow
-	* the instructions in space_overflow.c for regenating the th5s.h5 file.
-	*/
-	char *tmp_str = new char[TESTFILE.length()+1];
-	strcpy(tmp_str, TESTFILE.c_str());
-	const char *testfile = H5_get_srcdir_filename(tmp_str);
-	delete []tmp_str;
-
-	// Create file
-	H5File fid1(testfile, H5F_ACC_RDONLY);
-
-	// Try to open the dataset that has higher dimensionality than
-	// what the library can handle and this operation should fail.
-	try {
-	    DataSet dset1 = fid1.openDataSet( "dset" );
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5File::openDataSet", "Opening a dataset with higher dimensionality than what the library can handle");
-	}
-	catch( FileIException E ) // catching higher dimensionality dataset
-	{} // do nothing, exception expected
+        * Try reading a file that has been prepared that has a dataset with a
+        * higher dimensionality than what the library can handle.
+        *
+        * If this test fails and the H5S_MAX_RANK variable has changed, follow
+        * the instructions in space_overflow.c for regenating the th5s.h5 file.
+        */
+        char *tmp_str = new char[TESTFILE.length()+1];
+        strcpy(tmp_str, TESTFILE.c_str());
+        const char *testfile = H5_get_srcdir_filename(tmp_str);
+        delete []tmp_str;
+
+        // Create file
+        H5File fid1(testfile, H5F_ACC_RDONLY);
+
+        // Try to open the dataset that has higher dimensionality than
+        // what the library can handle and this operation should fail.
+        try {
+            DataSet dset1 = fid1.openDataSet( "dset" );
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5File::openDataSet", "Opening a dataset with higher dimensionality than what the library can handle");
+        }
+        catch (FileIException& E) // catching higher dimensionality dataset
+        {} // do nothing, exception expected
 
     // CHECK_I(ret, "H5Fclose");  // leave this here, later, fake a failure
-		// in the p_close see how this will handle it. - BMR
+    // in the p_close see how this will handle it. - BMR
 
-	PASSED();
-    }	// end of try block
+        PASSED();
+    }        // end of try block
 
-    catch (InvalidActionException E)
+    catch (InvalidActionException& E)
     {
         cerr << " FAILED" << endl;
         cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
     }
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("test_h5s_basic()", __LINE__, __FILE__, E.getCDetailMsg());
     }
@@ -227,22 +216,22 @@ static void test_h5s_basic()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_scalar_write
+ * Function:    test_h5s_scalar_write
  *
- * Purpose:	Test scalar H5S (dataspace) writing code
+ * Purpose      Test scalar H5S (dataspace) writing code
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_scalar_write()
@@ -251,124 +240,124 @@ static void test_h5s_scalar_write()
     SUBTEST("Scalar Dataspace Writing");
 
     try {
-	// Create file
-	H5File fid1(DATAFILE, H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1(DATAFILE, H5F_ACC_TRUNC);
 
-	// Create scalar dataspace
-	DataSpace sid1(SPACE3_RANK, NULL);
+        // Create scalar dataspace
+        DataSpace sid1(SPACE3_RANK, NULL);
 
-	//n = H5Sget_simple_extent_npoints(sid1);
-	hssize_t	n;	 	// Number of dataspace elements
-	n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+        //n = H5Sget_simple_extent_npoints(sid1);
+        hssize_t n; // Number of dataspace elements
+        n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
 
-	int	rank;		// Logical rank of dataspace
-	rank = sid1.getSimpleExtentNdims();
-	verify_val(rank, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        int rank; // Logical rank of dataspace
+        rank = sid1.getSimpleExtentNdims();
+        verify_val(rank, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	// Retrieves dimension size of dataspace sid1 and verify it
-	int ndims;		// Number of dimensions
-	hsize_t	tdims[4];	// Dimension array to test with
-	ndims = sid1.getSimpleExtentDims( tdims );
-	verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        // Retrieves dimension size of dataspace sid1 and verify it
+        int ndims; // Number of dimensions
+        hsize_t tdims[4]; // Dimension array to test with
+        ndims = sid1.getSimpleExtentDims( tdims );
+        verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
 
-	// Verify extent type
-	H5S_class_t ext_type;   // Extent type
-	ext_type = sid1.getSimpleExtentType();
-	verify_val(ext_type, H5S_SCALAR, "DataSpace::getSimpleExtentType", __LINE__, __FILE__);
+        // Verify extent type
+        H5S_class_t ext_type; // Extent type
+        ext_type = sid1.getSimpleExtentType();
+        verify_val(ext_type, H5S_SCALAR, "DataSpace::getSimpleExtentType", __LINE__, __FILE__);
 
-	// Create and write a dataset
-	DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT,sid1);
-	dataset.write(&space3_data, PredType::NATIVE_UINT);
+        // Create and write a dataset
+        DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT,sid1);
+        dataset.write(&space3_data, PredType::NATIVE_UINT);
 
-	PASSED();
+        PASSED();
     } // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_h5s_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_h5s_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_h5s_scalar_write()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_scalar_read
+ * Function:    test_h5s_scalar_read
  *
- * Purpose:	Test scalar H5S (dataspace) reading code
+ * Purpose      Test scalar H5S (dataspace) reading code
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_scalar_read()
 {
-    hsize_t		tdims[4];	// Dimension array to test with
+    hsize_t tdims[4]; // Dimension array to test with
 
     // Output message about test being performed
     SUBTEST("Scalar Dataspace Reading");
 
     try {
-	// Open file
-	H5File fid1(DATAFILE, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(DATAFILE, H5F_ACC_RDWR);
 
-	// Create a dataset
-	DataSet dataset = fid1.openDataSet("Dataset1");
+        // Create a dataset
+        DataSet dataset = fid1.openDataSet("Dataset1");
 
-	DataSpace sid1 = dataset.getSpace();
+        DataSpace sid1 = dataset.getSpace();
 
-	// Get the number of dataspace elements
-	hssize_t n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+        // Get the number of dataspace elements
+        hssize_t n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
 
-	// Get the logical rank of the dataspace
-	int ndims = sid1.getSimpleExtentNdims();
-	verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the logical rank of the dataspace
+        int ndims = sid1.getSimpleExtentNdims();
+        verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	ndims = sid1.getSimpleExtentDims(tdims);
-	verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        ndims = sid1.getSimpleExtentDims(tdims);
+        verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
 
-	// Read data back and verify it
-	unsigned      	rdata;      	// Scalar data read in
-	dataset.read(&rdata, PredType::NATIVE_UINT);
-	verify_val(rdata, space3_data, "DataSet::read", __LINE__, __FILE__);
+        // Read data back and verify it
+        unsigned rdata; // Scalar data read in
+        dataset.read(&rdata, PredType::NATIVE_UINT);
+        verify_val(rdata, space3_data, "DataSet::read", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     }   // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	// all the exceptions caused by negative returned values by C APIs
-	issue_fail_msg("test_h5s_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
+        // all the exceptions caused by negative returned values by C APIs
+        issue_fail_msg("test_h5s_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
 }   // test_h5s_scalar_read()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_null
+ * Function:    test_h5s_null
  *
- * Purpose:	Test null H5S (dataspace) code
+ * Purpose      Test null H5S (dataspace) code
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Raymond Lu (using C version)
+ * Programmer   Raymond Lu (using C version)
  *              May 18, 2004
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_null()
@@ -377,53 +366,53 @@ static void test_h5s_null()
     SUBTEST("Null Dataspace Writing");
 
     try {
-	// Create file
-	H5File fid1(DATAFILE, H5F_ACC_TRUNC);
+        // Create file
+        H5File fid1(DATAFILE, H5F_ACC_TRUNC);
 
-	// Create scalar dataspace
-	DataSpace sid1(H5S_NULL);
+        // Create scalar dataspace
+        DataSpace sid1(H5S_NULL);
 
-	hssize_t	n;	 	// Number of dataspace elements
-	n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, 0, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+        hssize_t n; // Number of dataspace elements
+        n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, 0, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
 
-	// Create a dataset
-	DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT,sid1);
+        // Create a dataset
+        DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT,sid1);
 
         // Try to write nothing to the dataset
-	dataset.write(&space5_data, PredType::NATIVE_INT);
+        dataset.write(&space5_data, PredType::NATIVE_INT);
 
         // Read the data.  Make sure no change to the buffer
-	dataset.read(&space5_data, PredType::NATIVE_INT);
-	verify_val(space5_data, 7, "DataSet::read", __LINE__, __FILE__);
+        dataset.read(&space5_data, PredType::NATIVE_INT);
+        verify_val(space5_data, 7, "DataSet::read", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_h5s_null()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_h5s_null()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_h5s_null()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_compound_scalar_write
+ * Function:    test_h5s_compound_scalar_write
  *
- * Purpose:	Test scalar H5S (dataspace) writing for compound
- *		datatypes
+ * Purpose      Test scalar H5S (dataspace) writing for compound
+ *              datatypes
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_compound_scalar_write()
@@ -432,174 +421,170 @@ static void test_h5s_compound_scalar_write()
     SUBTEST("Compound Dataspace Writing");
 
     try {
-	// Create file
-	H5File fid1(DATAFILE, H5F_ACC_TRUNC);
-
-	// Create the compound datatype.
-	CompType tid1(sizeof(struct space4_struct));
-	space4_field1_off=HOFFSET(struct space4_struct, c1);
-	tid1.insertMember(SPACE4_FIELDNAME1, space4_field1_off,
-		    PredType::NATIVE_SCHAR);
-	space4_field2_off=HOFFSET(struct space4_struct, u);
-	tid1.insertMember(SPACE4_FIELDNAME2, space4_field2_off,
-		    PredType::NATIVE_UINT);
-	space4_field3_off=HOFFSET(struct space4_struct, f);
-	tid1.insertMember(SPACE4_FIELDNAME3, space4_field3_off,
-		    PredType::NATIVE_FLOAT);
-	space4_field4_off=HOFFSET(struct space4_struct, c2);
-	tid1.insertMember(SPACE4_FIELDNAME4, space4_field4_off,
-		    PredType::NATIVE_SCHAR);
-
-	// Create scalar dataspace
-	DataSpace sid1(SPACE3_RANK, NULL);
-
-	// Get the number of dataspace elements
-	hssize_t n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
-
-	// Get the logical rank of the dataspace
-	int ndims = sid1.getSimpleExtentNdims();
-	verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
-
-	hsize_t		tdims[4];	// Dimension array to test with
-	ndims = sid1.getSimpleExtentDims(tdims);
-	verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
-
-	// Create and write a dataset
-	DataSet dataset = fid1.createDataSet("Dataset1", tid1, sid1);
-	dataset.write(&space4_data, tid1);
-
-	PASSED();
-    }	// end of try block
-    catch (Exception E)
+        // Create file
+        H5File fid1(DATAFILE, H5F_ACC_TRUNC);
+
+        // Create the compound datatype.
+        CompType tid1(sizeof(struct space4_struct));
+        space4_field1_off=HOFFSET(struct space4_struct, c1);
+        tid1.insertMember(SPACE4_FIELDNAME1, space4_field1_off,
+                    PredType::NATIVE_SCHAR);
+        space4_field2_off=HOFFSET(struct space4_struct, u);
+        tid1.insertMember(SPACE4_FIELDNAME2, space4_field2_off,
+                    PredType::NATIVE_UINT);
+        space4_field3_off=HOFFSET(struct space4_struct, f);
+        tid1.insertMember(SPACE4_FIELDNAME3, space4_field3_off,
+                    PredType::NATIVE_FLOAT);
+        space4_field4_off=HOFFSET(struct space4_struct, c2);
+        tid1.insertMember(SPACE4_FIELDNAME4, space4_field4_off,
+                    PredType::NATIVE_SCHAR);
+
+        // Create scalar dataspace
+        DataSpace sid1(SPACE3_RANK, NULL);
+
+        // Get the number of dataspace elements
+        hssize_t n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+
+        // Get the logical rank of the dataspace
+        int ndims = sid1.getSimpleExtentNdims();
+        verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+
+        hsize_t tdims[4]; // Dimension array to test with
+        ndims = sid1.getSimpleExtentDims(tdims);
+        verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+
+        // Create and write a dataset
+        DataSet dataset = fid1.createDataSet("Dataset1", tid1, sid1);
+        dataset.write(&space4_data, tid1);
+
+        PASSED();
+    }        // end of try block
+    catch (Exception& E)
     {
-	// all the exceptions caused by negative returned values by C APIs
-	issue_fail_msg("test_h5s_compound_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
+        // all the exceptions caused by negative returned values by C APIs
+        issue_fail_msg("test_h5s_compound_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_h5s_compound_scalar_write()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s_compound_scalar_read
+ * Function:    test_h5s_compound_scalar_read
  *
- * Purpose:	Test scalar H5S (dataspace) reading for compound
- *		datatypes
+ * Purpose      Test scalar H5S (dataspace) reading for compound
+ *              datatypes
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *      January, 2005: C tests' macro VERIFY casts values to 'long' for all
- *		       cases.  Since there are no operator<< for 'long long'
- *		       or int64 in VS C++ ostream, I casted the hssize_t values
- *		       passed to verify_val to 'long' as well.  If problems
- *		       arises later, this will have to be specificly handled
- *		       with a special routine.
+ *              cases.  Since there are no operator<< for 'long long'
+ *              or int64 in VS C++ ostream, I casted the hssize_t values
+ *              passed to verify_val to 'long' as well.  If problems
+ *              arises later, this will have to be specificly handled
+ *              with a special routine.
  *-------------------------------------------------------------------------
  */
 static void test_h5s_compound_scalar_read()
 {
-    hsize_t		tdims[4];	// Dimension array to test with
+    hsize_t tdims[4]; // Dimension array to test with
 
     // Output message about test being performed
     SUBTEST("Compound Dataspace Reading");
     try {
-	// Open file
-	H5File fid1(DATAFILE, H5F_ACC_RDWR);
+        // Open file
+        H5File fid1(DATAFILE, H5F_ACC_RDWR);
 
-	// Create a dataset
-	DataSet dataset = fid1.openDataSet("Dataset1");
+        // Create a dataset
+        DataSet dataset = fid1.openDataSet("Dataset1");
 
-	DataSpace sid1 = dataset.getSpace();
+        DataSpace sid1 = dataset.getSpace();
 
-	// Get the number of dataspace elements
-	hssize_t n = sid1.getSimpleExtentNpoints();
-	verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+        // Get the number of dataspace elements
+        hssize_t n = sid1.getSimpleExtentNpoints();
+        verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
 
-	// Get the logical rank of the dataspace
-	int ndims = sid1.getSimpleExtentNdims();
-	verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
+        // Get the logical rank of the dataspace
+        int ndims = sid1.getSimpleExtentNdims();
+        verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
 
-	ndims = sid1.getSimpleExtentDims(tdims);
-	verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
+        ndims = sid1.getSimpleExtentDims(tdims);
+        verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
 
-	// Get the datatype of this dataset.
-	CompType type(dataset);
+        // Get the datatype of this dataset.
+        CompType type(dataset);
 
-	struct space4_struct rdata; 	// Scalar data read in
-	dataset.read(&rdata, type);
+        struct space4_struct rdata; // Scalar data read in
+        dataset.read(&rdata, type);
 
-	// Verify read data
-	if(HDmemcmp(&space4_data,&rdata,sizeof(struct space4_struct)))
-	{
+        // Verify read data
+        if(HDmemcmp(&space4_data,&rdata,sizeof(struct space4_struct)))
+        {
             cerr << "scalar data different: space4_data.c1="
-		<< space4_data.c1 << ", read_data4.c1=" << rdata.c1 << endl;
+                 << space4_data.c1 << ", read_data4.c1=" << rdata.c1 << endl;
             cerr << "scalar data different: space4_data.u="
-		<< space4_data.u << ", read_data4.u=" << rdata.u << endl;
+                 << space4_data.u << ", read_data4.u=" << rdata.u << endl;
             cerr << "scalar data different: space4_data.f="
-		<< space4_data.f << ", read_data4.f=" << rdata.f << endl;
+                 << space4_data.f << ", read_data4.f=" << rdata.f << endl;
             TestErrPrintf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n",
-		space4_data.c1, rdata.c2);
-	} // end if
-	PASSED();
+                 space4_data.c1, rdata.c2);
+        } // end if
+        PASSED();
     }   // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	// all the exceptions caused by negative returned values by C APIs
-	issue_fail_msg("test_h5s_compound_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
+        // all the exceptions caused by negative returned values by C APIs
+        issue_fail_msg("test_h5s_compound_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_h5s_compound_scalar_read()
 
 /*-------------------------------------------------------------------------
  *
- * Function:	test_h5s
+ * Function:    test_h5s
  *
- * Purpose:	Main dataspace testing routine
+ * Purpose      Main dataspace testing routine
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler (using C version)
+ * Programmer   Binh-Minh Ribler (using C version)
  *              Mar 2001
  *
  * Modifications:
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_h5s()
 {
     // Output message about test being performed
     MESSAGE(5, ("Testing Dataspaces\n"));
 
-    test_h5s_basic();		// Test basic H5S code
-    test_h5s_scalar_write();	// Test scalar H5S writing code
-    test_h5s_scalar_read();	// Test scalar H5S reading code
-    test_h5s_null();		// Test null H5S code
-    test_h5s_compound_scalar_write();	// Test compound datatype scalar H5S writing code
-    test_h5s_compound_scalar_read();	// Test compound datatype scalar H5S reading code
+    test_h5s_basic();           // Test basic H5S code
+    test_h5s_scalar_write();    // Test scalar H5S writing code
+    test_h5s_scalar_read();     // Test scalar H5S reading code
+    test_h5s_null();            // Test null H5S code
+    test_h5s_compound_scalar_write();  // Test compound datatype scalar H5S writing code
+    test_h5s_compound_scalar_read();   // Test compound datatype scalar H5S reading code
 }   // test_h5s()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_h5s
+ * Function:    cleanup_h5s
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Albert Cheng
+ * Programmer   Albert Cheng
  *              July 2, 1998
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_h5s()
 {
     HDremove(DATAFILE.c_str());
diff --git a/c++/test/th5s.h5 b/c++/test/th5s.h5
index bc2b666..7a0bfb3 100644
Binary files a/c++/test/th5s.h5 and b/c++/test/th5s.h5 differ
diff --git a/c++/test/titerate.cpp b/c++/test/titerate.cpp
new file mode 100644
index 0000000..f75d92e
--- /dev/null
+++ b/c++/test/titerate.cpp
@@ -0,0 +1,527 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*****************************************************************************
+   FILE
+   titerate.cpp - HDF5 C++ testing iterate related functionality
+
+ ***************************************************************************/
+#ifdef OLD_HEADER_FILENAME
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+using std::cerr;
+using std::endl;
+
+#include <string>
+#include "H5Cpp.h"      // C++ API header file
+using namespace H5;
+
+#include "h5test.h"
+#include "h5cpputil.h"  // C++ utilility header file
+
+/* Number of datasets for group iteration test */
+#define NDATASETS 50
+
+/* Number of attributes for attribute iteration test */
+//#define NATTR 50
+
+/* Number of groups for second group iteration test */
+//#define ITER_NGROUPS 150
+
+/* General maximum length of names used */
+#define NAMELEN     80
+
+/* 1-D dataset with fixed dimensions */
+//#define SPACE1_RANK     1
+//#define SPACE1_DIM1     4
+
+const H5std_string        FILE_ITERATE("titerate.h5");
+const H5std_string        GROUP1("Top Group");
+const H5std_string        GROUP1_PATH("/Top Group");
+const H5std_string        GROUP1_1("Sub-Group 1.1");
+const H5std_string        GROUP1_1_PATH("/Top Group/Sub-Group 1.1");
+const H5std_string        GROUP1_2("Sub-Group 1.2");
+const H5std_string        GROUP1_2_PATH("/Top Group/Sub-Group 1.2");
+const H5std_string        DSET_DEFAULT_NAME("default");
+const H5std_string        DSET_IN_FILE("Dataset in File");
+const H5std_string        DSET_IN_FILE_PATH("/Dataset in File");
+const H5std_string        DSET_IN_GRP1("Dataset in Group 1");
+const H5std_string        DSET_IN_GRP1_PATH("/Top Group/Dataset in Group 1");
+const H5std_string        DSET_IN_GRP1_2("Dataset in Group 1.2");
+const H5std_string        DSET_IN_GRP1_2_PATH("/Top Group/Sub-Group 1.2/Dataset in Group 1.2");
+
+typedef enum {
+    RET_ZERO,
+    RET_TWO,
+    RET_CHANGE,
+    RET_CHANGE2
+} iter_enum;
+
+/* Custom group iteration callback data */
+typedef struct {
+    char name[NAMELEN];     /* The name of the object */
+    H5O_type_t type;        /* The type of the object */
+    iter_enum command;      /* The type of return value */
+} iter_info;
+
+int iter_strcmp(const void *s1, const void *s2);
+
+/****************************************************************
+**
+**  iter_strcmp(): String comparison routine for qsort
+**
+****************************************************************/
+int iter_strcmp(const void *s1, const void *s2)
+{
+    return(HDstrcmp(*(const char * const *)s1,*(const char * const *)s2));
+}
+
+/****************************************************************
+**
+**  liter_cb(): Custom link iteration callback routine.
+**
+****************************************************************/
+static herr_t
+liter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info_t H5_ATTR_UNUSED *link_info,
+    void *op_data)
+{
+    iter_info *info = (iter_info *)op_data;
+    static int count = 0;
+    static int count2 = 0;
+
+    HDstrcpy(info->name, name);
+
+    switch(info->command) {
+        case RET_ZERO:
+            return(0);
+
+        case RET_TWO:
+            return(2);
+
+        case RET_CHANGE:
+            count++;
+            return(count > 10 ? 1 : 0);
+
+        case RET_CHANGE2:
+            count2++;
+            return(count2 > 10 ? 1 : 0);
+
+        default:
+            printf("invalid iteration command");
+            return(-1);
+    } /* end switch */
+} /* end liter_cb() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_iter_group
+ *
+ * Purpose      Tests group iteration
+ *
+ * Return       Success: 0
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Friday, September 9, 2016
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_iter_group(FileAccPropList& fapl)
+{
+    int i;                  /* counting variable */
+    hsize_t idx;            /* Index in the group */
+    char name[NAMELEN];     /* temporary name buffer */
+    char *lnames[NDATASETS + 2];/* Names of the links created */
+    iter_info info;         /* Custom iteration information */
+    herr_t ret;             /* Generic return value */
+
+    /* Output message about test being performed */
+    SUBTEST("Group Iteration");
+
+    /* Create the test file with the datasets */
+    try {
+        // Create file
+        H5File file(FILE_ITERATE, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
+
+        /* Test iterating over empty group */
+        info.command = RET_ZERO;
+        idx = 0;
+        ret = H5Literate(file.getId(), H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info);
+        verify_val(ret, SUCCEED, "H5Literate", __LINE__, __FILE__);
+
+        DataType datatype(PredType::NATIVE_INT);
+
+        // Create a scalar file space
+        DataSpace filespace;
+
+        for (i=0; i< NDATASETS; i++)
+        {
+        sprintf(name, "Dataset %d", i);
+
+        // Create a dataset in the file
+        DataSet dataset = file.createDataSet(name, datatype, filespace);
+
+        /* Keep a copy of the dataset names */
+        lnames[i] = HDstrdup(name);
+        check_values(lnames[i], "HDstrdup returns NULL", __LINE__, __FILE__);
+
+        } /* end for */
+
+        /* Create a group and named datatype under root group for testing */
+        Group grp(file.createGroup(GROUP1, 0));
+        lnames[NDATASETS] = HDstrdup("grp");
+        check_values(lnames[NDATASETS], "HDstrdup returns NULL", __LINE__, __FILE__);
+
+        datatype.commit(file, "dtype");
+        lnames[NDATASETS + 1] = HDstrdup("dtype");
+        check_values(lnames[NDATASETS], "HDstrdup returns NULL", __LINE__, __FILE__);
+
+        /* Sort the dataset names */
+        HDqsort(lnames, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp);
+
+
+        /* Iterate through the datasets in the root group in various ways */
+
+        // Open data file to read
+        file.openFile(FILE_ITERATE, H5F_ACC_RDONLY, fapl);
+
+        // Open the root group
+        Group root_group(file.openGroup("/"));
+
+        // Get the number of object in the root group
+        hsize_t nobjs = root_group.getNumObjs();
+        verify_val(nobjs, (hsize_t)(NDATASETS + 2), "H5Gget_info", __LINE__, __FILE__);
+
+        H5std_string obj_name;
+        for (i = 0; i < nobjs; i++)
+        {
+            //H5O_info_t oinfo;               /* Object info */
+
+            obj_name = root_group.getObjnameByIdx(i);
+        //ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
+
+        //oinfo = root_group.childObjType((hsize_t)i, H5_INDEX_NAME, H5_ITER_INC,  ".");
+        //ret = H5Oget_info_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, H5P_DEFAULT);
+        } /* end for */
+
+        // Attempted to iterate with invalid index, should fail
+        try {
+            obj_name = root_group.getObjnameByIdx(NDATASETS + 3);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("Group::getObjnameByIdx", "Attempt to iterate with invalid index");
+        }
+        catch (GroupIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+
+        // Attempted to iterate with negative index, should fail
+        try {
+            info.command = RET_ZERO;
+            idx = (hsize_t)-1;
+            obj_name = root_group.getObjnameByIdx(idx);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("Group::getObjnameByIdx", "Attempt to iterate with negative index");
+        }
+        catch (FileIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+        catch (GroupIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+
+        /* Test skipping exactly as many entries as in the group */
+        try {
+            info.command = RET_ZERO;
+            idx = NDATASETS + 2;
+            obj_name = root_group.getObjnameByIdx(idx);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("Group::getObjnameByIdx", "Attempt to iterate with negative index");
+        }
+        catch (FileIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+        catch (GroupIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+
+        /* Test skipping more entries than are in the group */
+        try {
+            info.command = RET_ZERO;
+            idx = NDATASETS + 3;
+            obj_name = root_group.getObjnameByIdx(idx);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("Group::getObjnameByIdx", "Attempt to iterate with negative index");
+        }
+        catch (FileIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+        catch (GroupIException& invalid_action) // invalid index
+        {} // do nothing, exception expected
+
+        /* Free the dataset names */
+        for(i = 0; i< (NDATASETS + 2); i++)
+            HDfree(lnames[i]);
+
+        // Everything will be closed as they go out of scope
+
+        PASSED();
+    }        // try block
+
+    // catch all other exceptions
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_iter_group", __LINE__, __FILE__);
+    }
+
+#if 0
+    /* Test all objects in group, when callback always returns 0 */
+    info.command = RET_ZERO;
+    idx = 0;
+    if((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0)
+        TestErrPrintf("Group iteration function didn't return zero correctly!\n");
+
+    /* Test all objects in group, when callback always returns 1 */
+    /* This also tests the "restarting" ability, because the index changes */
+    info.command = RET_TWO;
+    i = 0;
+    idx = 0;
+    while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) {
+        /* Verify return value from iterator gets propagated correctly */
+        verify_val(ret, 2, "H5Literate", __LINE__, __FILE__);
+
+        /* Increment the number of times "2" is returned */
+        i++;
+
+        /* Verify that the index is the correct value */
+        verify_val(idx, (hsize_t)i, "H5Literate", __LINE__, __FILE__);
+        if(idx > (NDATASETS + 2))
+            TestErrPrintf("Group iteration function walked too far!\n");
+
+        /* Verify that the correct name is retrieved */
+        if(HDstrcmp(info.name, lnames[(size_t)(idx - 1)]) != 0)
+            TestErrPrintf("Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]);
+    } /* end while */
+    verify_val(ret, -1, "H5Literate", __LINE__, __FILE__);
+
+    if(i != (NDATASETS + 2))
+        TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", __LINE__);
+
+    /* Test all objects in group, when callback changes return value */
+    /* This also tests the "restarting" ability, because the index changes */
+    info.command = new_format ? RET_CHANGE2 : RET_CHANGE;
+    i = 0;
+    idx = 0;
+    while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) >= 0) {
+        /* Verify return value from iterator gets propagated correctly */
+        verify_val(ret, 1, "H5Literate", __LINE__, __FILE__);
+
+        /* Increment the number of times "1" is returned */
+        i++;
+
+        /* Verify that the index is the correct value */
+        verify_val(idx, (hsize_t)(i + 10), "H5Literate", __LINE__, __FILE__);
+        if(idx > (NDATASETS + 2))
+            TestErrPrintf("Group iteration function walked too far!\n");
+
+        /* Verify that the correct name is retrieved */
+        if(HDstrcmp(info.name, lnames[(size_t)(idx - 1)]) != 0)
+            TestErrPrintf("Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]);
+    } /* end while */
+    verify_val(ret, -1, "H5Literate", __LINE__, __FILE__);
+
+    if(i != 42 || idx != 52)
+        TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", __LINE__);
+
+    ret = H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+
+#endif
+} /* test_iter_group() */
+
+
+/****************************************************************
+**
+**  printelems(): Open an attribute and verify that it has a 
+**                the correct name
+**
+****************************************************************/
+const H5std_string FILE_NAME("titerate.h5");
+const H5std_string GRP_NAME("/Group_A");
+const H5std_string FDATASET_NAME("file dset");
+const H5std_string GDATASET_NAME("group dset");
+const H5std_string ATTR_NAME("Units");
+const H5std_string FATTR_NAME("F attr");
+const H5std_string GATTR_NAME("G attr");
+const int DIM1 = 2;
+void printelems(const Group& group, const H5std_string& dsname, const H5std_string& atname)
+{
+    try
+    {
+        DataSet d1(group.openDataSet(dsname));
+        DataSpace s1 = d1.getSpace();
+        s1.close();
+        d1.close();
+
+        unsigned idx = 0;
+        Attribute a1(group.openAttribute(idx));
+        H5std_string aname = a1.getName();
+        verify_val(aname, atname, "printelems", __LINE__, __FILE__);
+
+        a1.close();
+  }
+   // catch failure caused by the DataSpace operations
+   catch( DataSpaceIException error )
+   {
+        error.printError();
+   }
+
+   // catch failure caused by the Group operations
+   catch( GroupIException error )
+   {
+        error.printError();
+   }
+
+   // catch failure caused by the DataSet operations
+   catch( DataSetIException error )
+   {
+        error.printError();
+   }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    test_HDFFV_9920
+ *
+ * Purpose      Tests the fix for HDFFV-9920
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Friday, September 9, 2016
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_HDFFV_9920()
+{
+   int attr_data[2] = { 100, 200};
+   hsize_t dims[1] = { DIM1 };
+   
+   try
+   {
+        // Create a new file and a group in it
+        H5File file( FILE_NAME, H5F_ACC_TRUNC );
+
+        Group gr1(file.createGroup(GRP_NAME));
+
+        // Create the data space for the attribute.
+        DataSpace dspace = DataSpace (1, dims );
+
+        DataSet fds = file.createDataSet(FDATASET_NAME, PredType::STD_I32BE, dspace);
+        DataSet gds = gr1.createDataSet(GDATASET_NAME, PredType::STD_I32BE, dspace);
+
+        // Create a file attribute and a group attribute. 
+        Attribute fa1 = file.createAttribute(FATTR_NAME, PredType::STD_I32BE, 
+                                                  dspace);
+        Attribute ga1 = gr1.createAttribute(GATTR_NAME, PredType::STD_I32BE, 
+                                                  dspace);
+     
+        // Write the attribute data. 
+        fa1.write( PredType::NATIVE_INT, attr_data);
+        ga1.write( PredType::NATIVE_INT, attr_data);
+
+        fa1.close();
+        ga1.close();
+        fds.close();
+        gds.close();
+
+        // Verify the attributes have correct names.
+        printelems(file, FDATASET_NAME, FATTR_NAME);
+        printelems(gr1, GDATASET_NAME, GATTR_NAME);
+
+   }  // end of try block
+
+   // catch failure caused by the H5File operations
+   catch( DataSpaceIException error )
+   {
+        error.printError();
+   }
+
+   // catch failure caused by the H5File operations
+   catch( AttributeIException error )
+   {
+        error.printError();
+   }
+
+   // catch failure caused by the H5File operations
+   catch( FileIException error )
+   {
+        error.printError();
+   }
+
+   // catch failure caused by the DataSet operations
+   catch( DataSetIException error )
+   {
+        error.printError();
+   }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    test_iterate
+ *
+ * Purpose      Tests iterate functionality
+ *
+ * Return       Success: 0
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Tuesday, September 6, 2016
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+extern "C"
+void test_iterate()
+{
+    // Output message about test being performed
+    MESSAGE(5, ("Testing Iterate Feature\n"));
+
+    // Create access property with latest library version.
+    FileAccPropList fapl;
+    fapl.setLibverBounds(H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+
+    test_iter_group(fapl);    // Test iterating groups
+    test_HDFFV_9920();        // Test the fix of HDFFV-9920
+    //test_iter_attr(fapl);   // Test iterating attributes
+
+}   // test_iterate
+
+/*-------------------------------------------------------------------------
+ * Function:    cleanup_iterate
+ *
+ * Purpose      Cleanup temporary test files
+ *
+ * Return       none
+ *
+ * Programmer   (use C version)
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+extern "C"
+void cleanup_iterate()
+{
+    HDremove(FILE_ITERATE.c_str());
+} // cleanup_iterate
diff --git a/c++/test/tlinks.cpp b/c++/test/tlinks.cpp
index 57738d7..dc592b3 100644
--- a/c++/test/tlinks.cpp
+++ b/c++/test/tlinks.cpp
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,28 +16,20 @@
         C link interface (H5L)
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
-#include "h5cpputil.h"  // C++ test utilility header file
+#include "h5test.h"
+#include "h5cpputil.h"  // C++ utilility header file
 
 // A lot of the definition inherited from C test links.c is left here until
 // the H5L API is implemented and tests are completed - BMR 10/19/2009
@@ -51,9 +41,9 @@
 //#define H5G_TESTING
 
 //#include "h5test.h"
-//#include "H5Gpkg.h"		/* Groups 				*/
-//#include "H5Iprivate.h"		/* IDs			  		*/
-//#include "H5Lprivate.h"         /* Links                                */
+//#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"
@@ -72,39 +62,39 @@ const char *FILENAME[] = {
     "links6",  /* 9 */
     "links7",  /* 10 */
     "links8",  /* 11 */
-    "extlinks0",	/* 12: main files */
-    "tmp/extlinks0",	/* 13: */
-    "extlinks1",	/* 14: target files */
-    "tmp/extlinks1",	/* 15: */
-    "extlinks2",	/* 16: */
-    "tmp/extlinks2",	/* 17: */
-    "extlinks3",	/* 18: */
-    "tmp/extlinks3",	/* 19: */
-    "extlinks4",	/* 20: */
-    "tmp/extlinks4",	/* 21: */
-    "extlinks5",	/* 22: */
-    "tmp/extlinks6",	/* 23: */
-    "extlinks7",	/* 24: */
-    "tmp/extlinks7",	/* 25: */
-    "tmp/extlinks8",	/* 26: */
-    "extlinks9",	/* 27: */
-    "tmp/extlinks9",	/* 28: */
-    "extlinks10",	/* 29: */ /* TESTS for windows */
-    "tmp/extlinks10",	/* 30: */
-    "tmp/extlinks11",	/* 31: */
-    "tmp/extlinks12",	/* 32: */
-    "extlinks13",	/* 33: */
-    "tmp/extlinks13",	/* 34: */
-    "tmp/extlinks14",	/* 35: */
-    "tmp/extlinks15",	/* 36: */
-    "extlinks16A",	/* 37: */ /* TESTS for H5P_set_elink_fapl */
-    "extlinks16B",	/* 38: */
-    "extlinks17",	/* 39: */
-    "extlinks18A",	/* 40: */
-    "extlinks18B",	/* 41: */
-    "extlinks19A",	/* 42: */
-    "extlinks19B",	/* 43: */
-    "extlinks20",	/* 44: */
+    "extlinks0",        /* 12: main files */
+    "tmp/extlinks0",    /* 13: */
+    "extlinks1",        /* 14: target files */
+    "tmp/extlinks1",    /* 15: */
+    "extlinks2",        /* 16: */
+    "tmp/extlinks2",    /* 17: */
+    "extlinks3",        /* 18: */
+    "tmp/extlinks3",    /* 19: */
+    "extlinks4",        /* 20: */
+    "tmp/extlinks4",    /* 21: */
+    "extlinks5",        /* 22: */
+    "tmp/extlinks6",    /* 23: */
+    "extlinks7",        /* 24: */
+    "tmp/extlinks7",    /* 25: */
+    "tmp/extlinks8",    /* 26: */
+    "extlinks9",        /* 27: */
+    "tmp/extlinks9",    /* 28: */
+    "extlinks10",       /* 29: */ /* TESTS for windows */
+    "tmp/extlinks10",   /* 30: */
+    "tmp/extlinks11",   /* 31: */
+    "tmp/extlinks12",   /* 32: */
+    "extlinks13",       /* 33: */
+    "tmp/extlinks13",   /* 34: */
+    "tmp/extlinks14",   /* 35: */
+    "tmp/extlinks15",   /* 36: */
+    "extlinks16A",      /* 37: */ /* TESTS for H5P_set_elink_fapl */
+    "extlinks16B",      /* 38: */
+    "extlinks17",       /* 39: */
+    "extlinks18A",      /* 40: */
+    "extlinks18B",      /* 41: */
+    "extlinks19A",      /* 42: */
+    "extlinks19B",      /* 43: */
+    "extlinks20",       /* 44: */
     NULL
 };
 
@@ -112,12 +102,12 @@ const char *FILENAME[] = {
 
 #define TMPDIR          "tmp"
 
-#define FAMILY_SIZE	1024
+#define FAMILY_SIZE     1024
 #define CORE_INCREMENT  1024
-#define NUM400		400
+#define NUM400          400
 
 /* do not do check_all_closed() for "ext*" files and "tmp/ext*" */
-#define EXTSTOP		12
+#define EXTSTOP         12
 
 #define LINK_BUF_SIZE   1024
 #define NAME_BUF_SIZE   1024
@@ -150,11 +140,8 @@ const char *FILENAME[] = {
 #define H5L_DIM2 100
 
 /* Creation order macros */
-#define CORDER_GROUP_NAME       "corder_group"
 #define CORDER_SOFT_GROUP_NAME  "corder_soft_group"
 #define CORDER_NLINKS               18
-#define CORDER_ITER_STOP            3
-#define CORDER_EST_ENTRY_LEN        9
 
 /* Timestamp macros */
 #define TIMESTAMP_GROUP_1       "timestamp1"
@@ -331,16 +318,16 @@ static const char *FILENAME[] = {
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_basic_links
+ * Function:    test_basic_links
  *
- * Purpose:	Test building a file with assorted links.
+ * Purpose      Test building a file with assorted links.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	-1
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
- *		October 16, 2009
+ * Programmer   Binh-Minh Ribler
+ *              October 16, 2009
  *
  * Modifications:
  *
@@ -348,124 +335,171 @@ static const char *FILENAME[] = {
  */
 static void test_basic_links(hid_t fapl_id, hbool_t new_format)
 {
-    hsize_t	        size[1] = {1};
-    char		filename[NAME_BUF_SIZE];
+    hsize_t size[1] = {1};
+    char filename[NAME_BUF_SIZE];
 
     // Use the file access template id to create a file access prop. list.
     FileAccPropList fapl(fapl_id);
 
     try
     {
-	if(new_format)
-	    SUBTEST("Link creation (w/new group format)")
-	else
-	    SUBTEST("Link creation")
+        if(new_format)
+            SUBTEST("Link creation (w/new group format)")
+        else
+            SUBTEST("Link creation")
 
-	h5_fixname(FILENAME[0], fapl_id, filename, sizeof filename);
-	H5File file(filename, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
+        h5_fixname(FILENAME[0], fapl_id, filename, sizeof filename);
+        H5File file(filename, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
 
-	// Create simple dataspace
-	DataSpace scalar (1, size, size);
+        // Create simple dataspace
+        DataSpace scalar (1, size, size);
 
-	// Create a group then close it by letting the object go out of scope
-	{
-	    Group group(file.createGroup("grp1", 0));
-	}
+        // Create a group then close it by letting the object go out of scope
+        {
+            Group group(file.createGroup("grp1", 0));
+        }
 
-	// Create a dataset then close it by letting the object go out of scope
-	{
-	    DataSet dset1(file.createDataSet("dset1", PredType::NATIVE_INT, scalar));
-	}
+        // Create a dataset then close it by letting the object go out of scope
+        {
+            DataSet dset1(file.createDataSet("dset1", PredType::NATIVE_INT, scalar));
+        }
 
-	hid_t file_id = file.getId();
+        hid_t file_id = file.getId();
 
-	// Because these are not implemented in the C++ API yet, they are
-	// used so CommonFG::getLinkval can be tested.
-	// Create a hard link
-	if(H5Lcreate_hard(
-		file_id, "dset1", H5L_SAME_LOC, "grp1/hard1",
-		H5P_DEFAULT, H5P_DEFAULT) < 0)
-	    throw Exception("test_basic_links", "H5Lcreate_hard failed");
+        // Because these are not implemented in the C++ API yet, they are
+        // used so CommonFG::getLinkval can be tested.
+        // Create a hard link
+        if(H5Lcreate_hard(
+                file_id, "dset1", H5L_SAME_LOC, "grp1/hard1",
+                H5P_DEFAULT, H5P_DEFAULT) < 0)
+            throw Exception("test_basic_links", "H5Lcreate_hard failed");
 
-	// Create a symbolic link
-	if(H5Lcreate_soft(
-		"/dset1", file_id, "grp1/soft", H5P_DEFAULT, H5P_DEFAULT) < 0)
-	    throw Exception("test_basic_links", "H5Lcreate_soft failed");
+        // Create a symbolic link
+        if(H5Lcreate_soft(
+                "/dset1", file_id, "grp1/soft", H5P_DEFAULT, H5P_DEFAULT) < 0)
+            throw Exception("test_basic_links", "H5Lcreate_soft failed");
 
-	// Create a symbolic link to something that doesn't exist
-	if(H5Lcreate_soft(
-		"foobar", file_id, "grp1/dangle", H5P_DEFAULT, H5P_DEFAULT) < 0)
-	    throw Exception("test_basic_links", "H5Lcreate_soft failed");
+        // Create a symbolic link to something that doesn't exist
+        if(H5Lcreate_soft(
+                "foobar", file_id, "grp1/dangle", H5P_DEFAULT, H5P_DEFAULT) < 0)
+            throw Exception("test_basic_links", "H5Lcreate_soft failed");
 
-	// Create a recursive symbolic link
-	if(H5Lcreate_soft(
-		"/grp1/recursive", file_id, "/grp1/recursive",
-		H5P_DEFAULT, H5P_DEFAULT) < 0)
-	    throw Exception("test_basic_links", "H5Lcreate_soft failed");
+        // Create a recursive symbolic link
+        if(H5Lcreate_soft(
+                "/grp1/recursive", file_id, "/grp1/recursive",
+                H5P_DEFAULT, H5P_DEFAULT) < 0)
+            throw Exception("test_basic_links", "H5Lcreate_soft failed");
 
-	// Verify link values before closing the file
+        // Verify link values before closing the file
 
-	H5std_string softlink_val = file.getLinkval("grp1/soft");
-	verify_val(softlink_val, "/dset1", "H5File::getLinkval grp1/soft", __LINE__, __FILE__);
+        H5std_string softlink_val = file.getLinkval("grp1/soft");
+        verify_val(softlink_val, "/dset1", "H5File::getLinkval grp1/soft", __LINE__, __FILE__);
 
-	H5std_string dngllink_val = file.getLinkval("grp1/dangle");
-	verify_val(dngllink_val, "foobar", "H5File::getLinkval grp1/dangle", __LINE__, __FILE__);
+        H5std_string dngllink_val = file.getLinkval("grp1/dangle");
+        verify_val(dngllink_val, "foobar", "H5File::getLinkval grp1/dangle", __LINE__, __FILE__);
 
-	H5std_string reclink_val = file.getLinkval("grp1/recursive");
-	verify_val(reclink_val, "/grp1/recursive", "H5File::getLinkval grp1/recursive", __LINE__, __FILE__);
+        H5std_string reclink_val = file.getLinkval("grp1/recursive");
+        verify_val(reclink_val, "/grp1/recursive", "H5File::getLinkval grp1/recursive", __LINE__, __FILE__);
 
     } // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_basic_links()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_basic_links()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     // Open the file and check on the links in it
     try
     {
-	// Open the file above
-	H5File file(filename, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
+        // Open the file above
+        H5File file(filename, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
 
-	// Verify link existence
-	if(H5Lexists(file.getId(), "dset1", H5P_DEFAULT) != TRUE)
-	    throw InvalidActionException("H5Lexists", "dset1 doesn't exist");
-	if(H5Lexists(file.getId(), "grp1/soft", H5P_DEFAULT) != TRUE)
-	    throw InvalidActionException("H5Lexists", "grp1/soft doesn't exist");
+        // Verify link existence
+        if(file.exists("dset1", LinkAccPropList::DEFAULT) != TRUE)
+            throw InvalidActionException("H5File::exists", "dset1 doesn't exist");
+        if(file.exists("grp1/soft", LinkAccPropList::DEFAULT) != TRUE)
+            throw InvalidActionException("H5File::exists", "grp1/soft doesn't exist");
 
-	// Verify link values
-	H5std_string softlink_val = file.getLinkval("grp1/soft");
-	verify_val(softlink_val, "/dset1", "H5File::getLinkval grp1/soft", __LINE__, __FILE__);
+        // Verify link values
+        H5std_string softlink_val = file.getLinkval("grp1/soft");
+        verify_val(softlink_val, "/dset1", "H5File::getLinkval grp1/soft", __LINE__, __FILE__);
 
-	H5std_string reclink_val = file.getLinkval("grp1/recursive");
-	verify_val(reclink_val, "/grp1/recursive", "H5File::getLinkval grp1/recursive", __LINE__, __FILE__);
+        H5std_string reclink_val = file.getLinkval("grp1/recursive");
+        verify_val(reclink_val, "/grp1/recursive", "H5File::getLinkval grp1/recursive", __LINE__, __FILE__);
 
-	PASSED();
+        PASSED();
     } // end of try block
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_basic_links()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_basic_links()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_links
+ * Function:    test_num_links
+ *
+ * Purpose      Test setting and getting limit of number of links
  *
- * Purpose:	Test links
+ * Return       Success: 0
  *
- * Return:	None
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
+ * Programmer   Binh-Minh Ribler
+ *              October 16, 2009
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_num_links(hid_t fapl_id, hbool_t new_format)
+{
+    char filename[NAME_BUF_SIZE];
+
+    if(new_format)
+        SUBTEST("Setting number of links (w/new group format)")
+    else
+        SUBTEST("Setting number of links")
+
+    try
+    {
+        // Use the file access template id to create a file access prop. list.
+        FileAccPropList fapl(fapl_id);
+
+        h5_fixname(FILENAME[0], fapl_id, filename, sizeof filename);
+        H5File file(filename, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
+
+        LinkAccPropList lapl;
+        size_t nlinks = 5;
+        lapl.setNumLinks(nlinks);
+
+        // Read it back and verify
+        size_t read_nlinks = lapl.getNumLinks();
+        verify_val(read_nlinks, nlinks, "LinkAccPropList::setNumLinks", __LINE__, __FILE__);
+
+        PASSED();
+    } // end of try block
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_num_links()", __LINE__, __FILE__, E.getCDetailMsg());
+    }
+} // test_num_links
+

+/*-------------------------------------------------------------------------
+ * Function:    test_links
+ *
+ * Purpose      Test links
+ *
+ * Return       None
+ *
+ * Programmer   Binh-Minh Ribler
  *              October 16, 2009
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_links()
 {
-    hid_t	fapl_id, fapl2_id;    /* File access property lists */
+    hid_t        fapl_id, fapl2_id;    /* File access property lists */
     unsigned new_format;     /* Whether to use the new format or not */
     const char  *envval;
 
@@ -479,40 +513,40 @@ void test_links()
     MESSAGE(5, ("Testing Various Links\n"));
     try
     {
-	/* Copy the file access property list */
-	if((fapl2_id = H5Pcopy(fapl_id)) < 0)
-	    throw Exception("test_links", "H5Pcopy failed");
-
-	/* Set the "use the latest version of the format" bounds for creating objects in the file */
-	if(H5Pset_libver_bounds(fapl2_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-	throw Exception("test_links", "H5Pset_libver_bounds failed");
-
-	/* Loop over using new group format */
-	for(new_format = FALSE; new_format <= TRUE; new_format++)
-	{
-	    hid_t my_fapl_id;
-
-	    /* Check for FAPL to use */
-	    if(new_format)
-		my_fapl_id = fapl2_id;
-	    else
-		my_fapl_id = fapl_id;
-
-	    /* General tests... (on both old & new format groups */
-	    // FileAccPropList may be passed in instead of fapl id
-	    test_basic_links(my_fapl_id, new_format);
+        /* Copy the file access property list */
+        if((fapl2_id = H5Pcopy(fapl_id)) < 0)
+            throw Exception("test_links", "H5Pcopy failed");
+
+        /* Set the "use the latest version of the format" bounds for creating objects in the file */
+        if(H5Pset_libver_bounds(fapl2_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        throw Exception("test_links", "H5Pset_libver_bounds failed");
+
+        /* Loop over using new group format */
+        for(new_format = FALSE; new_format <= TRUE; new_format++)
+        {
+            hid_t my_fapl_id;
+
+            /* Check for FAPL to use */
+            if(new_format)
+                my_fapl_id = fapl2_id;
+            else
+                my_fapl_id = fapl_id;
+
+            /* General tests... (on both old & new format groups */
+            // FileAccPropList may be passed in instead of fapl id
+            test_basic_links(my_fapl_id, new_format);
 #if 0
 // these tests are from the C test links.c and left here for future
 // implementation of H5L API
-	nerrors += test_basic_links(fapl_id, new_format) < 0 ? 1 : 0;
-	nerrors += cklinks(my_fapl, new_format) < 0 ? 1 : 0;
-	nerrors += new_links(my_fapl, new_format) < 0 ? 1 : 0;
-	nerrors += ck_new_links(my_fapl, new_format) < 0 ? 1 : 0;
-	nerrors += long_links(my_fapl, new_format) < 0 ? 1 : 0;
-	nerrors += toomany(my_fapl, new_format) < 0 ? 1 : 0;
-
-	/* Test new H5L link creation routine */
-	nerrors += test_lcpl(my_fapl, new_format);
+        nerrors += test_basic_links(fapl_id, new_format) < 0 ? 1 : 0;
+        nerrors += cklinks(my_fapl, new_format) < 0 ? 1 : 0;
+        nerrors += new_links(my_fapl, new_format) < 0 ? 1 : 0;
+        nerrors += ck_new_links(my_fapl, new_format) < 0 ? 1 : 0;
+        nerrors += long_links(my_fapl, new_format) < 0 ? 1 : 0;
+        nerrors += toomany(my_fapl, new_format) < 0 ? 1 : 0;
+
+        /* Test new H5L link creation routine */
+        nerrors += test_lcpl(my_fapl, new_format);
         nerrors += test_move(my_fapl, new_format);
         nerrors += test_copy(my_fapl, new_format);
         nerrors += test_move_preserves(my_fapl, new_format);
@@ -589,7 +623,7 @@ void test_links()
         /* do not do this for files used by external link tests */
         nerrors += check_all_closed(my_fapl, new_format, EXTSTOP) < 0 ? 1 : 0;
 #endif // 0
-	} /* end for */
+        } /* end for */
 
 #if 0
     /* New group revision feature tests */
@@ -619,41 +653,39 @@ void test_links()
     nerrors += group_info_old(fapl) < 0 ? 1 : 0;
 
 #endif
-	/* Close 2nd FAPL */
-	H5Pclose(fapl2_id);
+        /* Close 2nd FAPL */
+        H5Pclose(fapl2_id);
 
-	h5_clean_files(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
-	* routine will delete its own file. */
-	/* nerrors += external_reset_register() < 0 ? 1 : 0;
+        /* 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
+        * routine will delete its own file. */
+        /* nerrors += external_reset_register() < 0 ? 1 : 0;
  */
     }
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_links()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_links()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
 }
 
 /*-------------------------------------------------------------------------
- * Function:	cleanup_links
+ * Function:    cleanup_links
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Binh-Minh Ribler
- *		October 16, 2009
+ * Programmer   Binh-Minh Ribler
+ *              October 16, 2009
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_links()
 {
     HDremove(FILENAME[0]);
diff --git a/c++/test/tobject.cpp b/c++/test/tobject.cpp
index 2381ec2..0cb4e28 100644
--- a/c++/test/tobject.cpp
+++ b/c++/test/tobject.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,54 +16,55 @@
    tobject.cpp - HDF5 C++ testing object related functionality
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
-const H5std_string	FILE_OBJECTS("tobjects.h5");
-const H5std_string	GROUP1("Top Group");
-const H5std_string	GROUP1_PATH("/Top Group");
-const H5std_string	GROUP1_1("Sub-Group 1.1");
-const H5std_string	GROUP1_1_PATH("/Top Group/Sub-Group 1.1");
-const H5std_string	GROUP1_2("Sub-Group 1.2");
-const H5std_string	GROUP1_2_PATH("/Top Group/Sub-Group 1.2");
-const H5std_string	DSET_DEFAULT_NAME("default");
-const H5std_string	DSET_IN_FILE("Dataset in File");
-const H5std_string	DSET_IN_FILE_PATH("/Dataset in File");
-const H5std_string	DSET_IN_GRP1("Dataset in Group 1");
-const H5std_string	DSET_IN_GRP1_PATH("/Top Group/Dataset in Group 1");
-const H5std_string	DSET_IN_GRP1_2("Dataset in Group 1.2");
-const H5std_string	DSET_IN_GRP1_2_PATH("/Top Group/Sub-Group 1.2/Dataset in Group 1.2");
+const H5std_string        FILE_OBJECTS("tobjects.h5");
+const H5std_string        FILE_OBJHDR("tobject_header.h5");
+const H5std_string        GROUP1("Top Group");
+const H5std_string        GROUP1_PATH("/Top Group");
+const H5std_string        GROUP1_1("Sub-Group 1.1");
+const H5std_string        GROUP1_1_PATH("/Top Group/Sub-Group 1.1");
+const H5std_string        GROUP1_2("Sub-Group 1.2");
+const H5std_string        GROUP1_2_PATH("/Top Group/Sub-Group 1.2");
+const H5std_string        DSET_DEFAULT_NAME("default");
+const H5std_string        DSET_IN_FILE("Dataset in File");
+const H5std_string        DSET_IN_FILE_PATH("/Dataset in File");
+const H5std_string        DSET_IN_GRP1("Dataset_in_Group_1");
+const H5std_string        DSET_IN_GRP1_PATH("/Top Group/Dataset_in_Group_1");
+const H5std_string        DSET_IN_GRP1_2("Dataset_in_Group_1.2");
+const H5std_string        DSET_IN_GRP1_2_PATH("/Top Group/Sub-Group 1.2/Dataset_in_Group_1.2");
 
 /*-------------------------------------------------------------------------
- * Function:	test_get_objname
+ * Function:    test_get_objname
+ *
+ * Purpose      Tests getting object name of groups and datasets.
  *
- * Purpose:	Tests getting object name of groups and datasets.
+ * Description:
+ *        File structure:
+ *              GROUP1
+ *                  GROUP1_1
+ *                  GROUP1_2
+ *                      DSET_IN_GRP1_2
+ *                  DSET_IN_GRP1
+ *              DSET_IN_FILE
  *
- * Return:	Success:	0
- *		Failure:	-1
  *
- * Programmer:	Binh-Minh Ribler
- *		Friday, March 4, 2014
+ * Return       Success: 0
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Friday, March 4, 2014
  *
  * Modifications:
  *
@@ -76,94 +75,170 @@ static void test_get_objname()
     SUBTEST("H5Object::getObjName on Groups and Datasets");
 
     try {
-	// Create file
-	H5File file(FILE_OBJECTS, H5F_ACC_TRUNC);
+        // Create file
+        H5File file(FILE_OBJECTS, H5F_ACC_TRUNC);
 
-	// Create a top group and 2 subgroups
-	Group grp1 = file.createGroup(GROUP1, 0);
-	Group grp1_1 = grp1.createGroup(GROUP1_1, 0);
-	Group grp1_2 = grp1.createGroup(GROUP1_2, 0);
+        // Create a top group and 2 subgroups
+        Group grp1 = file.createGroup(GROUP1, 0);
+        Group grp1_1 = grp1.createGroup(GROUP1_1, 0);
+        Group grp1_2 = grp1.createGroup(GROUP1_2, 0);
 
-	// Get part of the group's name, random length using
-	// ssize_t getObjName(char* comment, size_t buf_size)
+        // Get part of the group's name, random length using
+        // ssize_t getObjName(char* comment, size_t buf_size)
 
-	// Get the length of the group's name first
-	ssize_t name_len = grp1.getObjName(NULL);
+        // Get the length of the group's name first
+        ssize_t name_len = grp1.getObjName(NULL);
 
-	// Random length is 4
-	if (name_len > 4)
-	{
-	    char* grp1_name = new char[5];
-	    name_len = grp1.getObjName(grp1_name, 5);
-	    verify_val((const char*)grp1_name, "/Top", "Group::getObjName", __LINE__, __FILE__);
-	    delete []grp1_name;
-	}
+        // Random length is 4
+        if (name_len > 4)
+        {
+            char* grp1_name = new char[5];
+            name_len = grp1.getObjName(grp1_name, 5);
+            verify_val((const char*)grp1_name, "/Top", "Group::getObjName", __LINE__, __FILE__);
+            delete []grp1_name;
+        }
 
-	// Create a data space
-	hsize_t     dims[2];
-	dims[0] = 2;
-	dims[1] = 5;
-	DataSpace space (2, dims, NULL);
+        // Create a data space
+        hsize_t     dims[2];
+        dims[0] = 2;
+        dims[1] = 5;
+        DataSpace space (2, dims, NULL);
 
-	// Create a dataset in the file
-	DataSet dsinfile = file.createDataSet(DSET_IN_FILE,
-			 PredType::NATIVE_DOUBLE, space);
+        // Create a dataset in the file
+        DataSet dsinfile = file.createDataSet(DSET_IN_FILE,
+                           PredType::NATIVE_DOUBLE, space);
 
-	// Create a dataset in the group
-	DataSet dsingrp = grp1.createDataSet(DSET_IN_GRP1,
-			 PredType::NATIVE_INT, space);
+        // Create a dataset in the group
+        DataSet dsingrp = grp1.createDataSet(DSET_IN_GRP1,
+                           PredType::NATIVE_INT, space);
 
-	// Get and verify the name of each dataset, using
-	// H5std_string getObjName() and
-	// ssize_t getObjName(H5std_string& obj_name, size_t len = 0)
-	H5std_string ds_name = dsinfile.getObjName();
-	verify_val(ds_name, DSET_IN_FILE_PATH, "DataSet::getObjName", __LINE__, __FILE__);
+        // Get and verify the name of each dataset, using
+        // H5std_string getObjName() and
+        // ssize_t getObjName(H5std_string& obj_name, size_t len = 0)
+        H5std_string ds_name = dsinfile.getObjName();
+        verify_val(ds_name, DSET_IN_FILE_PATH, "DataSet::getObjName", __LINE__, __FILE__);
 
-	name_len = dsingrp.getObjName(ds_name); // default len
-	verify_val(ds_name, DSET_IN_GRP1_PATH, "DataSet::getObjName", __LINE__, __FILE__);
+        name_len = dsingrp.getObjName(ds_name); // default len
+        verify_val(ds_name, DSET_IN_GRP1_PATH, "DataSet::getObjName", __LINE__, __FILE__);
 
-	// Close dataset
-	dsingrp.close();
+        // Close dataset
+        dsingrp.close();
 
-	// Create a dataset in sub-group 1.2
-	dsingrp = grp1_2.createDataSet(DSET_IN_GRP1_2, PredType::NATIVE_INT, space);
+        // Create a dataset in sub-group 1.2
+        dsingrp = grp1_2.createDataSet(DSET_IN_GRP1_2, PredType::NATIVE_INT, space);
 
-	// Get and verify the name of the dataset that belongs to subgroup
-	// 1.2, using H5std_string getObjName()
-	ds_name = dsingrp.getObjName();
-	verify_val(ds_name, DSET_IN_GRP1_2_PATH, "DataSet::getObjName", __LINE__, __FILE__);
+        // Get and verify the name of the dataset that belongs to subgroup
+        // 1.2, using H5std_string getObjName()
+        ds_name = dsingrp.getObjName();
+        verify_val(ds_name, DSET_IN_GRP1_2_PATH, "DataSet::getObjName", __LINE__, __FILE__);
 
-	// Close dataset
-	dsingrp.close();
+        // Close dataset
+        dsingrp.close();
 
-	// Reopen that same dataset then check the name again with another
-	// overload: ssize_t getObjName(H5std_string& obj_name, size_t len = 0)
-	dsingrp = grp1_2.openDataSet(DSET_IN_GRP1_2);
-	name_len = dsingrp.getObjName(ds_name);
-	verify_val(ds_name, DSET_IN_GRP1_2_PATH, "DataSet::getObjName", __LINE__, __FILE__);
+        // Reopen that same dataset then check the name again with another
+        // overload: ssize_t getObjName(H5std_string& obj_name, size_t len = 0)
+        dsingrp = grp1_2.openDataSet(DSET_IN_GRP1_2);
+        name_len = dsingrp.getObjName(ds_name);
+        verify_val(ds_name, DSET_IN_GRP1_2_PATH, "DataSet::getObjName", __LINE__, __FILE__);
 
-	// Everything will be closed as they go out of scope
+        // Everything will be closed as they go out of scope
 
-	PASSED();
-    }	// try block
+        PASSED();
+    }        // try block
 
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_get_objname", __LINE__, __FILE__);
+        issue_fail_msg("test_get_objname", __LINE__, __FILE__);
     }
 }   // test_get_objname
 
 /*-------------------------------------------------------------------------
- * Function:	test_get_objname_ontypes
+ * Function:    test_existance
+ *
+ * Purpose      Tests getting object name of groups and datasets.
+ *
+ * Description:
+ *        File structure:
+ *              GROUP1
+ *                  GROUP1_1
+ *                  GROUP1_2
+ *                      DSET_IN_GRP1_2
+ *                  DSET_IN_GRP1
+ *              DSET_IN_FILE
+ *
+ *
+ * Return       Success: 0
+ *              Failure: -1
+ *
+ * Programmer   Binh-Minh Ribler
+ *              Friday, March 4, 2014
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void test_existance()
+{
+    SUBTEST("H5File::exists and Group::exists");
+
+    try {
+        // Open file
+        H5File file(FILE_OBJECTS, H5F_ACC_RDONLY);
+
+        // Check if GROUP1 exists in the file
+        bool exists = file.exists(GROUP1);
+
+        // Open GROUP1
+        Group grp1 = file.openGroup(GROUP1);
+
+        // Check if GROUP1_1 and GROUP1_2 exist in GROUP1
+        exists = grp1.exists(GROUP1_1);
+        verify_val(exists, TRUE, "Group::exists GROUP1_1", __LINE__, __FILE__);
+        exists = grp1.exists(GROUP1_2);
+        verify_val(exists, TRUE, "Group::exists GROUP1_2", __LINE__, __FILE__);
+
+        // Check if DSET_IN_GRP1 exists in GROUP1
+        exists = grp1.exists(DSET_IN_GRP1);
+        verify_val(exists, TRUE, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__);
+
+        // Open GROUP1_2
+        Group grp1_2 = grp1.openGroup(GROUP1_2);
+
+        // Check if DSET_IN_GRP1_2 exists in GROUP1_2
+        exists = grp1_2.exists(DSET_IN_GRP1_2);
+        verify_val(exists, TRUE, "Group::exists DSET_IN_GRP1_2", __LINE__, __FILE__);
+
+        // Check if a dataset exists given dataset as location with full path name
+        DataSet dset1 = file.openDataSet(DSET_IN_FILE);
+        exists = dset1.exists("/Top Group/Dataset_in_Group_1");
+        verify_val(exists, TRUE, "Group::exists given dataset with full path name", __LINE__, __FILE__);
+
+        exists = grp1_2.exists(DSET_IN_GRP1);
+        verify_val(exists, FALSE, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__);
+
+        // Everything will be closed as they go out of scope
+
+        PASSED();
+    }        // try block
+
+    // catch all other exceptions
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_existance", __LINE__, __FILE__);
+    }
+}   // test_existance
+
+/*-------------------------------------------------------------------------
+ * Function:    test_get_objname_ontypes
  *
- * Purpose:	Test getting object name from various committed types.
+ * Purpose      Test getting object name from various committed types.
  *
- * Return:	Success:	0
- *		Failure:	-1
+ * Return       Success: 0
+ *              Failure: -1
  *
- * Programmer:  Binh-Minh Ribler
- *		March 4, 2014
+ * Programmer   Binh-Minh Ribler
+ *              March 4, 2014
  *
  * Modifications:
  *
@@ -174,81 +249,97 @@ static void test_get_objname_ontypes()
     SUBTEST("H5Object::getObjName on Committed Datatypes");
 
     try {
-	// Create a file with default prop lists
-	H5File file(FILE_OBJECTS, H5F_ACC_RDWR);
-
-	// Create a group
-	Group grp = file.createGroup ("typetests");
-
-	// Create a datatype and save it
-	IntType inttype(PredType::STD_B8LE);
-	inttype.commit(file, "INT type of STD_B8LE");
-
-	// Close the type then open it again to test getting its name
-	inttype.close();
-	inttype = file.openIntType("INT type of STD_B8LE");
-
-	// Get and verify its name
-	H5std_string inttype_name = inttype.getObjName();
-	verify_val(inttype_name, "/INT type of STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
-
-	// Make copy of a predefined type and save it
-	DataType dtype(PredType::STD_B8LE);
-	dtype.commit(file, "STD_B8LE");
-
-	// Close the data type and file
-	dtype.close();
-	file.close();
-
-	// Re-open the file and the data type to test getting its name
-	file.openFile(FILE_OBJECTS, H5F_ACC_RDWR);
-	dtype = file.openDataType("STD_B8LE");
-
-	// Get and verify its name
-	H5std_string type_name = dtype.getObjName();
-	verify_val(type_name, "/STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
-
-	// Test getting type's name from copied type
-	DataType copied_type;
-	copied_type.copy(dtype);
-	copied_type.commit(file, "copy of STD_B8LE");
-	type_name = copied_type.getObjName();
-	verify_val(type_name, "/copy of STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
-
-	// Test copying an integer predefined type
-	IntType new_int_type(PredType::NATIVE_INT);
-
-	// Name this datatype
-	new_int_type.commit(grp, "IntType NATIVE_INT");
-	ssize_t name_len = new_int_type.getObjName(type_name); // default len
-	verify_val(name_len, (ssize_t)HDstrlen("/typetests/IntType NATIVE_INT"), "DataType::getObjName", __LINE__, __FILE__);
-	verify_val(type_name, "/typetests/IntType NATIVE_INT", "DataType::getObjName", __LINE__, __FILE__);
-
-	// Close everything or they can be closed when objects go out of scope
-	dtype.close();
-	copied_type.close();
-	new_int_type.close();
-	grp.close();
-
-	PASSED();
+        // Create a file with default prop lists
+        H5File file(FILE_OBJECTS, H5F_ACC_RDWR);
+
+        // Create a group
+        Group grp = file.createGroup ("typetests");
+
+        // Create a datatype and save it
+        IntType inttype(PredType::STD_B8LE);
+        inttype.commit(file, "INT type of STD_B8LE");
+
+        // Close the type then open it again to test getting its name
+        inttype.close();
+        inttype = file.openIntType("INT type of STD_B8LE"); // deprecated
+
+        // Get and verify its name
+        H5std_string inttype_name = inttype.getObjName();
+        verify_val(inttype_name, "/INT type of STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Close the type then open it again to test getting its name, but
+        // with the constructor this time
+        inttype.close();
+        IntType std_b8le(file, "INT type of STD_B8LE");
+
+        // Get and verify its name
+        H5std_string std_b8le_name = std_b8le.getObjName();
+        verify_val(std_b8le_name, "/INT type of STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Make copy of a predefined type and save it
+        DataType dtype(PredType::STD_B8LE);
+        dtype.commit(file, "STD_B8LE");
+
+        // Close the data type and file
+        dtype.close();
+        file.close();
+
+        // Re-open the file and the data type to test getting its name
+        file.openFile(FILE_OBJECTS, H5F_ACC_RDWR);
+        dtype = file.openDataType("STD_B8LE"); // deprecated
+
+        // Get and verify its name
+        H5std_string type_name = dtype.getObjName();
+        verify_val(type_name, "/STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Close the type and open it again with the constructor then test
+        // getting its name
+        dtype.close();
+        DataType dtype2(file, "STD_B8LE");
+        type_name = dtype2.getObjName();
+        verify_val(type_name, "/STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Test getting type's name from copied type
+        DataType copied_type;
+        copied_type.copy(dtype2);
+        copied_type.commit(file, "copy of STD_B8LE");
+        type_name = copied_type.getObjName();
+        verify_val(type_name, "/copy of STD_B8LE", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Test copying an integer predefined type
+        IntType new_int_type(PredType::NATIVE_INT);
+
+        // Name this datatype
+        new_int_type.commit(grp, "IntType NATIVE_INT");
+        ssize_t name_len = new_int_type.getObjName(type_name); // default len
+        verify_val(name_len, (ssize_t)HDstrlen("/typetests/IntType NATIVE_INT"), "DataType::getObjName", __LINE__, __FILE__);
+        verify_val(type_name, "/typetests/IntType NATIVE_INT", "DataType::getObjName", __LINE__, __FILE__);
+
+        // Close everything or they can be closed when objects go out of scope
+        dtype2.close();
+        copied_type.close();
+        new_int_type.close();
+        grp.close();
+
+        PASSED();
     } // end top try block
 
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_get_objname_ontypes", __LINE__, __FILE__);
+        issue_fail_msg("test_get_objname_ontypes", __LINE__, __FILE__);
     }
 }   // test_get_objname_ontypes
 
 /*-------------------------------------------------------------------------
- * Function:	test_get_objtype
+ * Function:    test_get_objtype
  *
- * Purpose:	Tests getting object type
+ * Purpose      Tests getting object type
  *
- * Return:	Success:	0
- *		Failure:	-1
+ * Return       Success: 0
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
- *		Friday, March 4, 2014
+ * Programmer   Binh-Minh Ribler
+ *              Friday, March 4, 2014
  *
  * Modifications:
  *
@@ -259,97 +350,215 @@ static void test_get_objtype()
     SUBTEST("H5File::childObjType and H5Group::childObjType");
 
     try {
-	// Open file
-	H5File file(FILE_OBJECTS, H5F_ACC_RDWR);
+        // Open file
+        H5File file(FILE_OBJECTS, H5F_ACC_RDWR);
 
-	// Open the top group
-	Group grp1 = file.openGroup(GROUP1);
+        // Open the top group
+        Group grp1 = file.openGroup(GROUP1);
 
-	// Create a datatype and save it
-	DataType dtype(PredType::STD_I32LE);
-	dtype.commit(grp1, "STD_I32LE");
+        // Create a datatype and save it
+        DataType dtype(PredType::STD_I32LE);
+        dtype.commit(grp1, "STD_I32LE");
 
-	// Get and verify object type with
-	// H5O_type_t childObjType(const H5std_string& objname)
-	H5O_type_t objtype = file.childObjType(DSET_IN_FILE);
-	verify_val(objtype, H5O_TYPE_DATASET, "DataSet::childObjType", __LINE__, __FILE__);
+        // Get and verify object type with
+        // H5O_type_t childObjType(const H5std_string& objname)
+        H5O_type_t objtype = file.childObjType(DSET_IN_FILE);
+        verify_val(objtype, H5O_TYPE_DATASET, "DataSet::childObjType", __LINE__, __FILE__);
 
-	// Get and verify object type with
-	// H5O_type_t childObjType(const char* objname)
-	objtype = grp1.childObjType(GROUP1_1.c_str());
-	verify_val(objtype, H5O_TYPE_GROUP, "DataSet::childObjType", __LINE__, __FILE__);
+        // Get and verify object type with
+        // H5O_type_t childObjType(const char* objname)
+        objtype = grp1.childObjType(GROUP1_1.c_str());
+        verify_val(objtype, H5O_TYPE_GROUP, "DataSet::childObjType", __LINE__, __FILE__);
 
-	// Get and verify object type with
-	// H5O_type_t childObjType(hsize_t index, H5_index_t index_type,
-	// H5_iter_order_t order, const char* objname=".")
-	objtype = grp1.childObjType((hsize_t)1, H5_INDEX_NAME, H5_ITER_INC);
-	verify_val(objtype, H5O_TYPE_NAMED_DATATYPE, "DataSet::childObjType", __LINE__, __FILE__);
+        // Get and verify object type with
+        // H5O_type_t childObjType(hsize_t index, H5_index_t index_type,
+        // H5_iter_order_t order, const char* objname=".")
+        objtype = grp1.childObjType((hsize_t)1, H5_INDEX_NAME, H5_ITER_INC);
+        verify_val(objtype, H5O_TYPE_NAMED_DATATYPE, "DataSet::childObjType", __LINE__, __FILE__);
 
-	// Get and verify object type with
-	// 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=".")
-	objtype = grp1.childObjType((hsize_t)2);
-	verify_val(objtype, H5O_TYPE_GROUP, "DataSet::childObjType", __LINE__, __FILE__);
+        // Get and verify object type with
+        // 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=".")
+        objtype = grp1.childObjType((hsize_t)2);
+        verify_val(objtype, H5O_TYPE_GROUP, "DataSet::childObjType", __LINE__, __FILE__);
 
-	// Everything will be closed as they go out of scope
+        // Everything will be closed as they go out of scope
 
-	PASSED();
-    }	// try block
+        PASSED();
+    }        // try block
 
     // catch all other exceptions
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_get_objtype", __LINE__, __FILE__);
+        issue_fail_msg("test_get_objtype", __LINE__, __FILE__);
     }
 }   // test_get_objtype
+

+/*-------------------------------------------------------------------------
+ * Function:    test_open_object_header
+ *
+ * Purpose      Test Group::getObjId function.
+ *
+ * Return       None
+ *
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              March, 2017
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+const H5std_string GROUPNAME("group");
+const H5std_string DTYPENAME("group/datatype");
+const H5std_string DTYPENAME_INGRP("datatype");
+const H5std_string DSETNAME("dataset");
+#define RANK 2
+#define DIM0 5
+#define DIM1 10
+static void test_open_object_header()
+{
+    hsize_t     dims[2];
+    H5G_info_t  ginfo;                      /* Group info struct */
 
+    // Output message about test being performed
+    SUBTEST("Group::getObjId");
+
+    try {
+        // Create file FILE1
+        H5File file1(FILE_OBJHDR, H5F_ACC_TRUNC);
+        /* Create a group, dataset, and committed datatype within the file */
+
+        // Create a group in the root group
+        Group grp(file1.createGroup(GROUPNAME));
+        grp.close();
+
+        // Commit the type inside the file
+        IntType dtype(PredType::NATIVE_INT);
+        dtype.commit(file1, DTYPENAME);
+        dtype.close();
+
+        // Create a new dataset
+        dims[0] = DIM0;
+        dims[1] = DIM1;
+        DataSpace dspace(RANK, dims);
+        DataSet dset(file1.createDataSet(DSETNAME, PredType::NATIVE_INT, dspace));
+
+        // Close dataset and dataspace
+        dset.close();
+        dspace.close();
+
+        // Now make sure that getObjId can open all three types of objects
+        hid_t obj_grp = file1.getObjId(GROUPNAME);
+        hid_t obj_dtype = file1.getObjId(DTYPENAME);
+        hid_t obj_dset = file1.getObjId(DSETNAME);
+
+        // Make sure that each is the right kind of ID
+        H5I_type_t id_type = IdComponent::getHDFObjType(obj_grp);
+        verify_val(id_type, H5I_GROUP, "H5Iget_type for group ID", __LINE__, __FILE__);
+        id_type = IdComponent::getHDFObjType(obj_dtype);
+        verify_val(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID", __LINE__, __FILE__);
+        id_type = IdComponent::getHDFObjType(obj_dset);
+        verify_val(id_type, H5I_DATASET, "H5Iget_type for dataset ID", __LINE__, __FILE__);
+
+        /* Do something more complex with each of the IDs to make sure */
+
+        Group grp2(obj_grp);
+        hsize_t num_objs = grp2.getNumObjs();
+        verify_val(num_objs, 1, "H5Gget_info", __LINE__, __FILE__);
+        // There should be one object, the datatype
+
+        // Close datatype object opened from the file
+        file1.closeObjId(obj_dtype);
+
+        dset.setId(obj_dset);
+        dspace = dset.getSpace();
+        bool is_simple = dspace.isSimple();
+        dspace.close();
+
+        // Open datatype object from the group
+        obj_dtype = grp2.getObjId(DTYPENAME_INGRP);
+
+        dtype.setId(obj_dtype);
+        H5T_class_t type_class = dtype.getClass();
+        verify_val(type_class, H5T_INTEGER, "H5Tget_class", __LINE__, __FILE__);
+        dtype.close();
+
+        // Close datatype object
+        grp2.closeObjId(obj_dtype);
+
+        // Close the group object
+        file1.closeObjId(obj_grp);
+
+        // Try doing something with group, the ID should still work
+        num_objs = grp2.getNumObjs();
+        verify_val(num_objs, 1, "H5Gget_info", __LINE__, __FILE__);
+
+        // Close the cloned group
+        grp2.close();
+
+        PASSED();
+    }   // end of try block
+    // catch invalid action exception
+    catch (InvalidActionException& E)
+    {
+        cerr << " in InvalidActionException" << endl;
+        cerr << " *FAILED*" << endl;
+        cerr << "    <<<  " << E.getDetailMsg() << "  >>>" << endl << endl;
+    }
+    // catch all other exceptions
+    catch (Exception& E)
+    {
+        cerr << " in Exception" << endl;
+        issue_fail_msg("test_file_name()", __LINE__, __FILE__, E.getCDetailMsg());
+    }
+} /* test_open_object_header() */
+

 /*-------------------------------------------------------------------------
- * Function:	test_objects
+ * Function:    test_objects
  *
- * Purpose:	Tests HDF5 object related functionality
+ * Purpose      Tests HDF5 object related functionality
  *
- * Return:	Success: 0
- *		Failure: -1
+ * Return       Success: 0
+ *              Failure: -1
  *
- * Programmer:	Binh-Minh Ribler
- *		Friday, Mar 4, 2014
+ * Programmer   Binh-Minh Ribler
+ *              Friday, Mar 4, 2014
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_object()
 {
     // Output message about test being performed
     MESSAGE(5, ("Testing Object Functions\n"));
 
     test_get_objname();    // Test get object name from groups/datasets
-    test_get_objname_ontypes();	// Test get object name from types
+    test_existance();      // Test check for object existance
+    test_get_objname_ontypes();        // Test get object name from types
     test_get_objtype();    // Test get object type
+    test_open_object_header();    // Test object header functions (H5O)
 
 }   // test_objects
 
 /*-------------------------------------------------------------------------
  * Function:    cleanup_objects
  *
- * Purpose:     Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:      none
+ * Return       none
  *
- * Programmer:  (use C version)
+ * Programmer   (use C version)
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_object()
 {
     HDremove(FILE_OBJECTS.c_str());
+    HDremove(FILE_OBJHDR.c_str());
 } // cleanup_objects
diff --git a/c++/test/trefer.cpp b/c++/test/trefer.cpp
index 9d072be..9074154 100644
--- a/c++/test/trefer.cpp
+++ b/c++/test/trefer.cpp
@@ -5,34 +5,31 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
    FILE
    trefer.cpp - HDF5 C++ testing the functionalities associated with the C
-		Reference interface (H5R)
+                Reference interface (H5R)
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 const H5std_string      FILE1("trefer1.h5");
@@ -80,99 +77,100 @@ test_reference_params(void)
 
     H5File* file1 = NULL;
     try {
-	hobj_ref_t *wbuf,      // buffer to write to disk
-		   *rbuf,      // buffer read from disk
-		   *tbuf;      // temp. buffer read from disk
+        hobj_ref_t *wbuf,      // buffer to write to disk
+                   *rbuf,      // buffer read from disk
+                   *tbuf;      // temp. buffer read from disk
 
-	// Allocate write & read buffers
-	int temp_size = MAX(sizeof(unsigned),sizeof(hobj_ref_t));
-	wbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
-	rbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
-	tbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        // Allocate write & read buffers
+        int temp_size = MAX(sizeof(unsigned),sizeof(hobj_ref_t));
+        wbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        rbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        tbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
 
         // Create file FILE1
         file1 = new H5File (FILE1, H5F_ACC_TRUNC);
 
-	// Create dataspace for datasets
-	hsize_t	dims1[] = {SPACE1_DIM1};
-	DataSpace sid1(SPACE1_RANK, dims1);
-
-	// Create a group
-	Group group = file1->createGroup("Group1");
-
-	// Set group's comment
- 	group.setComment(".", write_comment);
-
-	// Create a dataset (inside /Group1)
-	DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
-
-	unsigned *tu32;      // Temporary pointer to uint32 data
-	int i;
-	for (tu32=(unsigned *)wbuf, i=0; i<SPACE1_DIM1; i++)
-	    *tu32++=i*3; // from C test
-
-	// Write selection to disk
-	dataset.write(wbuf, PredType::NATIVE_UINT);
-
-	// Close Dataset
-	dataset.close();
-
-	// Create another dataset (inside /Group1)
-	dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
-
-	// Close Dataset
-	dataset.close();
-
-	// Create a datatype to refer to
-	CompType dtype1(sizeof(s1_t));
-
-	// Insert fields
-	dtype1.insertMember(MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
-	dtype1.insertMember(MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_INT);
-	dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
-
-	// Save datatype for later
-	dtype1.commit(group, "Datatype1");
-
-	// Close datatype and group
-	dtype1.close();
-	group.close();
-
-	// Create a dataset
-	dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
-
-	/* Test parameters to H5Location::reference */
-	try {
-	    file1->reference(NULL, "/Group1/Dataset1");
-	} catch (ReferenceException E) {} // We expect this to fail
-	try {
-	    file1->reference(&wbuf[0], NULL);
-	} catch (ReferenceException E) {} // We expect this to fail
-	try {
-	    file1->reference(&wbuf[0], "");
-	} catch (ReferenceException E) {} // We expect this to fail
-	try {
-	    file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_MAXTYPE);
-	} catch (ReferenceException E) {} // We expect this to fail
-	try {
-	    file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_DATASET_REGION);
-	} catch (ReferenceException E) {} // We expect this to fail
-
-	// Close resources
-	dataset.close();
-	file1->close();
-	// Let sid1 go out of scope
-
-	// Free memory buffers
-	HDfree(wbuf);
-	HDfree(rbuf);
-	HDfree(tbuf);
-
-	PASSED();
+        // Create dataspace for datasets
+        hsize_t dims1[] = {SPACE1_DIM1};
+        DataSpace sid1(SPACE1_RANK, dims1);
+
+        // Create a group
+        Group group = file1->createGroup("Group1");
+
+        // Set group's comment
+        group.setComment(".", write_comment);
+
+        // Create a dataset (inside /Group1)
+        DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
+
+        unsigned *tu32;      // Temporary pointer to uint32 data
+        int i;
+        for (tu32=(unsigned *)wbuf, i=0; i<SPACE1_DIM1; i++)
+            *tu32++=i*3; // from C test
+
+        // Write selection to disk
+        dataset.write(wbuf, PredType::NATIVE_UINT);
+
+        // Close Dataset
+        dataset.close();
+
+        // Create another dataset (inside /Group1)
+        dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
+
+        // Close Dataset
+        dataset.close();
+
+        // Create a datatype to refer to
+        CompType dtype1(sizeof(s1_t));
+
+        // Insert fields
+        dtype1.insertMember(MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
+        dtype1.insertMember(MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_INT);
+        dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
+
+        // Save datatype for later
+        dtype1.commit(group, "Datatype1");
+
+        // Close datatype and group
+        dtype1.close();
+        group.close();
+
+        // Create a dataset
+        dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
+
+        /* Test parameters to H5Location::reference */
+        try {
+            file1->reference(NULL, "/Group1/Dataset1");
+        } catch (ReferenceException& E) {} // We expect this to fail
+        try {
+            file1->reference(&wbuf[0], NULL);
+        } catch (ReferenceException& E) {} // We expect this to fail
+        try {
+            file1->reference(&wbuf[0], "");
+        } catch (ReferenceException& E) {} // We expect this to fail
+        try {
+            file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_MAXTYPE);
+        } catch (ReferenceException& E) {} // We expect this to fail
+        try {
+            file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_DATASET_REGION);
+        } catch (ReferenceException& E) {} // We expect this to fail
+
+        // Close resources
+        dataset.close();
+        file1->close();
+        // Let sid1 go out of scope
+
+        // Free memory buffers
+        HDfree(wbuf);
+        HDfree(rbuf);
+        HDfree(tbuf);
+
+        PASSED();
     } // end try
-    catch (Exception E) {
-	issue_fail_msg("test_reference_param()",__LINE__,__FILE__,
-			E.getCFuncName(), E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_reference_param()",__LINE__,__FILE__,
+                        E.getCFuncName(), E.getCDetailMsg());
     }
 
     if(file1)
@@ -182,7 +180,7 @@ test_reference_params(void)
 /****************************************************************
 **
 **  test_reference_obj(): Test basic object reference functions
-**			  to various kinds of objects
+**                        to various kinds of objects
 **
 ****************************************************************/
 static void test_reference_obj(void)
@@ -195,175 +193,176 @@ static void test_reference_obj(void)
 
     H5File* file1 = NULL;
     try {
-	hobj_ref_t *wbuf,      // buffer to write to disk
-		   *rbuf,      // buffer read from disk
-		   *tbuf;      // temp. buffer read from disk
+        hobj_ref_t *wbuf,      // buffer to write to disk
+                   *rbuf,      // buffer read from disk
+                   *tbuf;      // temp. buffer read from disk
 
-	// Allocate write & read buffers
-	int temp_size = MAX(sizeof(unsigned),sizeof(hobj_ref_t));
-	wbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
-	rbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
-	tbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        // Allocate write & read buffers
+        int temp_size = MAX(sizeof(unsigned),sizeof(hobj_ref_t));
+        wbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        rbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+        tbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
 
         // Create file FILE1
         file1 = new H5File (FILE1, H5F_ACC_TRUNC);
 
-	// Create dataspace for datasets
-	hsize_t	dims1[] = {SPACE1_DIM1};
-	DataSpace sid1(SPACE1_RANK, dims1);
+        // Create dataspace for datasets
+        hsize_t dims1[] = {SPACE1_DIM1};
+        DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create dataset access property list
-	PropList dapl(H5P_DATASET_ACCESS);
+        // Create dataset access property list
+        PropList dapl(H5P_DATASET_ACCESS);
 
-	// Create a group
-	Group group = file1->createGroup("Group1");
+        // Create a group
+        Group group = file1->createGroup("Group1");
 
-	// Set group's comment
-	group.setComment(".", write_comment);
+        // Set group's comment
+        group.setComment(".", write_comment);
 
-	// Create a dataset (inside /Group1)
-	DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
+        // Create a dataset (inside /Group1)
+        DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
 
-	unsigned *tu32;      // Temporary pointer to uint32 data
-	for (tu32 = (unsigned *)wbuf, i = 0; i < SPACE1_DIM1; i++)
-	    *tu32++=i*3; // from C test
+        unsigned *tu32;      // Temporary pointer to uint32 data
+        for (tu32 = (unsigned *)wbuf, i = 0; i < SPACE1_DIM1; i++)
+            *tu32++=i*3; // from C test
 
-	// Write selection to disk
-	dataset.write(wbuf, PredType::NATIVE_UINT);
+        // Write selection to disk
+        dataset.write(wbuf, PredType::NATIVE_UINT);
 
-	// Close Dataset
-	dataset.close();
+        // Close Dataset
+        dataset.close();
 
-	// Create another dataset (inside /Group1)
-	dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
+        // Create another dataset (inside /Group1)
+        dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
 
-	// Close Dataset
-	dataset.close();
+        // Close Dataset
+        dataset.close();
 
-	// Create a datatype to refer to
-	CompType dtype1(sizeof(s1_t));
+        // Create a datatype to refer to
+        CompType dtype1(sizeof(s1_t));
 
-	// Insert fields
-	dtype1.insertMember(MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
-	dtype1.insertMember(MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_INT);
-	dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
+        // Insert fields
+        dtype1.insertMember(MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
+        dtype1.insertMember(MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_INT);
+        dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
 
-	// Save datatype for later
-	dtype1.commit(group, "Datatype1");
+        // Save datatype for later
+        dtype1.commit(group, "Datatype1");
 
-	// Close datatype and group
-	dtype1.close();
-	group.close();
+        // Close datatype and group
+        dtype1.close();
+        group.close();
 
-	// Create a dataset
-	dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
+        // Create a dataset
+        dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
 
-	// Create reference to dataset and test getRefObjType
-	file1->reference(&wbuf[0], "/Group1/Dataset1");
-	H5O_type_t refobj_type = dataset.getRefObjType(&wbuf[0], H5R_OBJECT);
-	verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Create reference to dataset and test getRefObjType
+        file1->reference(&wbuf[0], "/Group1/Dataset1");
+        H5O_type_t refobj_type = dataset.getRefObjType(&wbuf[0], H5R_OBJECT);
+        verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	// Create reference to dataset and test getRefObjType
-	file1->reference(&wbuf[1], "/Group1/Dataset2");
-	refobj_type = dataset.getRefObjType(&wbuf[1], H5R_OBJECT);
-	verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Create reference to dataset and test getRefObjType
+        file1->reference(&wbuf[1], "/Group1/Dataset2");
+        refobj_type = dataset.getRefObjType(&wbuf[1], H5R_OBJECT);
+        verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	// Create reference to group
-	file1->reference(&wbuf[2], "/Group1");
-	refobj_type = dataset.getRefObjType(&wbuf[2], H5R_OBJECT);
-	verify_val(refobj_type, H5O_TYPE_GROUP, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Create reference to group
+        file1->reference(&wbuf[2], "/Group1");
+        refobj_type = dataset.getRefObjType(&wbuf[2], H5R_OBJECT);
+        verify_val(refobj_type, H5O_TYPE_GROUP, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	// Create reference to named datatype
-	file1->reference(&wbuf[3], "/Group1/Datatype1");
-	refobj_type = dataset.getRefObjType(&wbuf[3], H5R_OBJECT);
-	verify_val(refobj_type, H5O_TYPE_NAMED_DATATYPE, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Create reference to named datatype
+        file1->reference(&wbuf[3], "/Group1/Datatype1");
+        refobj_type = dataset.getRefObjType(&wbuf[3], H5R_OBJECT);
+        verify_val(refobj_type, H5O_TYPE_NAMED_DATATYPE, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	// Write selection to disk
-	dataset.write(wbuf, PredType::STD_REF_OBJ);
+        // Write selection to disk
+        dataset.write(wbuf, PredType::STD_REF_OBJ);
 
-	// Close disk dataspace, dataset, and file
-	sid1.close();
-	dataset.close();
-	delete file1;
+        // Close disk dataspace, dataset, and file
+        sid1.close();
+        dataset.close();
+        delete file1;
 
-	// Re-open the file
-	file1 = new H5File(FILE1, H5F_ACC_RDWR);
+        // Re-open the file
+        file1 = new H5File(FILE1, H5F_ACC_RDWR);
 
-	// Open the dataset
-	dataset = file1->openDataSet("/Dataset3");
+        // Open the dataset
+        dataset = file1->openDataSet("/Dataset3");
 
-	// Read selection from disk
-	dataset.read(rbuf, PredType::STD_REF_OBJ);
+        // 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, dapl);
+        // Dereference dataset object by ctor, from the location where
+        // 'dataset' is located
+        DataSet dset2(dataset, &rbuf[0], H5R_OBJECT, dapl);
 
-	// Check information in the referenced dataset
-	sid1 = dset2.getSpace();
-	hssize_t n_elements = sid1.getSimpleExtentNpoints();
-	verify_val((long)n_elements, 4, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+        // Check information in the referenced dataset
+        sid1 = dset2.getSpace();
+        hssize_t n_elements = sid1.getSimpleExtentNpoints();
+        verify_val((long)n_elements, 4, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
 
-	// Read from disk
-	dset2.read(tbuf, PredType::NATIVE_UINT);
+        // Read from disk
+        dset2.read(tbuf, PredType::NATIVE_UINT);
 
-	for(tu32 = (unsigned *)tbuf, i = 0; i < SPACE1_DIM1; i++, tu32++)
-	   verify_val(*tu32, (uint32_t)(i*3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+        for(tu32 = (unsigned *)tbuf, i = 0; i < SPACE1_DIM1; i++, tu32++)
+            verify_val(*tu32, (uint32_t)(i*3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
 
-	// Close dereferenced dataset
-	dset2.close();
+        // Close dereferenced dataset
+        dset2.close();
 
-	// Dereference group object from the location where 'dataset' is located
-	group.dereference(dataset, &rbuf[2]);
+        // Dereference group object from the location where 'dataset' is located
+        group.dereference(dataset, &rbuf[2]);
 
-	// Get group's comment using
-	// H5std_string getComment(const char* name, <buf_size=0 by default>)
-	H5std_string read_comment1 = group.getComment(".", 10);
-	verify_val(read_comment1.c_str(), write_comment, "Group::getComment",__LINE__,__FILE__);
+        // Get group's comment using
+        // H5std_string getComment(const char* name, <buf_size=0 by default>)
+        H5std_string read_comment1 = group.getComment(".", 10);
+        verify_val(read_comment1.c_str(), write_comment, "Group::getComment",__LINE__,__FILE__);
 
-	// Test with the old default value
-	read_comment1 = group.getComment(".", 256);
-	verify_val(read_comment1.c_str(), write_comment, "Group::getComment",__LINE__,__FILE__);
+        // Test with the old default value
+        read_comment1 = group.getComment(".", 256);
+        verify_val(read_comment1.c_str(), write_comment, "Group::getComment",__LINE__,__FILE__);
 
-	// Test that getComment handles failures gracefully, using
-	// H5std_string getComment(const char* name, <buf_size=0 by default>)
-	try {
-	    H5std_string read_comment_tmp = group.getComment(NULL);
-	}
-	catch (Exception E) {} // We expect this to fail
+        // Test that getComment handles failures gracefully, using
+        // H5std_string getComment(const char* name, <buf_size=0 by default>)
+        try {
+            H5std_string read_comment_tmp = group.getComment(NULL);
+        }
+        catch (Exception& E) {} // We expect this to fail
 
-	// Close group
-	group.close();
+        // Close group
+        group.close();
 
-	/*
-	 * Verify correct referenced datatype
-	 */
-	// Open datatype object
-	dtype1.dereference(dataset, &rbuf[3]);
+        /*
+         * Verify correct referenced datatype
+         */
+        // Open datatype object
+        dtype1.dereference(dataset, &rbuf[3]);
 
-	// Verify correct datatype
+        // Verify correct datatype
         H5T_class_t tclass;
 
         tclass = dtype1.getClass();
-	verify_val(tclass, H5T_COMPOUND, "DataType::getClass",__LINE__,__FILE__);
-	int n_members = dtype1.getNmembers();
+        verify_val(tclass, H5T_COMPOUND, "DataType::getClass",__LINE__,__FILE__);
+        int n_members = dtype1.getNmembers();
         verify_val(n_members, 3, "CompType::getNmembers",__LINE__,__FILE__);
 
-	// Close all objects and file
-	dtype1.close();
-	dataset.close();
-	file1->close();
+        // Close all objects and file
+        dtype1.close();
+        dataset.close();
+        file1->close();
 
-	// Free allocated buffers
-	HDfree(wbuf);
-	HDfree(rbuf);
-	HDfree(tbuf);
+        // Free allocated buffers
+        HDfree(wbuf);
+        HDfree(rbuf);
+        HDfree(tbuf);
 
-	PASSED();
+        PASSED();
     } // end try
-    catch (Exception E) {
-	issue_fail_msg("test_reference_obj()",__LINE__,__FILE__,
-			E.getCFuncName(), E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_reference_obj()",__LINE__,__FILE__,
+                        E.getCFuncName(), E.getCDetailMsg());
     }
 
     if(file1)
@@ -375,7 +374,7 @@ static void test_reference_obj(void)
 **
 **  test_reference_group(): Test object reference functionality
 **      Tests for correct behavior of various routines on
-**	dereferenced group
+**        dereferenced group
 **
 ****************************************************************/
 #define GROUPNAME       "/group"
@@ -388,8 +387,8 @@ static void test_reference_obj(void)
 static void
 test_reference_group(void)
 {
-    hobj_ref_t wref;	/* Reference to write */
-    hobj_ref_t rref;	/* Reference to read */
+    hobj_ref_t wref;        /* Reference to write */
+    hobj_ref_t rref;        /* Reference to read */
     const  H5std_string write_comment="Foo!"; // Comments for group
 
     // Output message about test being performed
@@ -397,101 +396,102 @@ test_reference_group(void)
 
     H5File* file1 = NULL;
     try {
-	/*
-	 * Create file with a group and a dataset containing an object
-	 *  reference to the group
-	 */
+        /*
+         * Create file with a group and a dataset containing an object
+         *  reference to the group
+         */
 
         // Create file FILE1
         file1 = new H5File (FILE1, H5F_ACC_TRUNC);
 
-	// Create scalar dataspace
-	DataSpace sid1;
+        // Create scalar dataspace
+        DataSpace sid1;
 
-	// Create a group
-	Group group = file1->createGroup(GROUPNAME);
+        // Create a group
+        Group group = file1->createGroup(GROUPNAME);
 
-	/* Create nested groups */
-	Group group2 = group.createGroup(GROUPNAME2);
-	group2.close();
-	group2 = group.createGroup(GROUPNAME3);
-	group2.close();
+        /* Create nested groups */
+        Group group2 = group.createGroup(GROUPNAME2);
+        group2.close();
+        group2 = group.createGroup(GROUPNAME3);
+        group2.close();
 
-	// Create bottom dataset
-	DataSet dset1 = group.createDataSet(DSETNAME2, PredType::NATIVE_INT, sid1);
-	dset1.close();
+        // Create bottom dataset
+        DataSet dset1 = group.createDataSet(DSETNAME2, PredType::NATIVE_INT, sid1);
+        dset1.close();
 
-	// Close group 1
-	group.close();
+        // Close group 1
+        group.close();
 
-	// Create dataset
-	DataSet dset2 = file1->createDataSet(DSETNAME, PredType::STD_REF_OBJ, sid1);
+        // Create dataset
+        DataSet dset2 = file1->createDataSet(DSETNAME, PredType::STD_REF_OBJ, sid1);
 
-	file1->reference(&wref, GROUPNAME);
+        file1->reference(&wref, GROUPNAME);
 
-	// Write selection to disk
-	dset2.write(&wref, PredType::STD_REF_OBJ);
+        // Write selection to disk
+        dset2.write(&wref, PredType::STD_REF_OBJ);
 
-	// Close resources
-	dset2.close();
-	sid1.close();
-	file1->close();
+        // Close resources
+        dset2.close();
+        sid1.close();
+        file1->close();
 
-	/*
-	 * Re-open the file and test deferencing group
-	 */
+        /*
+         * Re-open the file and test deferencing group
+         */
 
-	// Re-open file
+        // Re-open file
         file1->openFile(FILE1, H5F_ACC_RDWR);
 
-	// Re-open dataset
-	dset1 = file1->openDataSet(DSETNAME);
+        // Re-open dataset
+        dset1 = file1->openDataSet(DSETNAME);
 
-	// Read in the reference
-	dset1.read(&rref, PredType::STD_REF_OBJ);
+        // Read in the reference
+        dset1.read(&rref, PredType::STD_REF_OBJ);
 
-	// Dereference to get the group
-	Group refgroup(dset1, &rref);
+        // Dereference to get the group
+        Group refgroup(dset1, &rref);
 
-	// Dereference group object the other way
-	group.dereference(dset1, &rref);
+        // Dereference group object the other way
+        group.dereference(dset1, &rref);
 
-	/*
-	 * Various queries on the group opened
-	 */
+        /*
+         * Various queries on the group opened
+         */
 
-	// Check number of objects in the group dereferenced by constructor
-	hsize_t nobjs = refgroup.getNumObjs();
-	verify_val(nobjs, (hsize_t)3, "H5Group::getNumObjs",__LINE__,__FILE__);
+        // Check number of objects in the group dereferenced by constructor
+        hsize_t nobjs = refgroup.getNumObjs();
+        verify_val(nobjs, (hsize_t)3, "H5Group::getNumObjs",__LINE__,__FILE__);
 
-	// Check number of objects in the group dereferenced by ::reference
-	nobjs = group.getNumObjs();
-	verify_val(nobjs, (hsize_t)3, "H5Group::getNumObjs",__LINE__,__FILE__);
+        // Check number of objects in the group dereferenced by ::reference
+        nobjs = group.getNumObjs();
+        verify_val(nobjs, (hsize_t)3, "H5Group::getNumObjs",__LINE__,__FILE__);
 
-	// Check getting file name given the group dereferenced via constructor
-	H5std_string fname = refgroup.getFileName();
-	verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
+        // Check getting file name given the group dereferenced via constructor
+        H5std_string fname = refgroup.getFileName();
+        verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
     
-	// Check getting file name given the group dereferenced by ::reference
-	fname = group.getFileName();
-	verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
-
-	// Unlink one of the objects in the dereferenced group, and re-check
-	refgroup.unlink(GROUPNAME2);
-	nobjs = refgroup.getNumObjs();
-	verify_val(nobjs, (hsize_t)2, "H5Group::getNumObjs",__LINE__,__FILE__);
-
-	// Close resources
-	group.close();
-	refgroup.close();
-	dset1.close();
-	file1->close();
-
-	PASSED();
+        // Check getting file name given the group dereferenced by ::reference
+        fname = group.getFileName();
+        verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
+
+        // Unlink one of the objects in the dereferenced group, and re-check
+        refgroup.unlink(GROUPNAME2);
+        nobjs = refgroup.getNumObjs();
+        verify_val(nobjs, (hsize_t)2, "H5Group::getNumObjs",__LINE__,__FILE__);
+
+        // Close resources
+        group.close();
+        refgroup.close();
+        dset1.close();
+        file1->close();
+
+        PASSED();
     } // end try
-    catch (Exception E) {
-	issue_fail_msg("test_reference_group()",__LINE__,__FILE__,
-			E.getCFuncName(), E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_reference_group()",__LINE__,__FILE__,
+                        E.getCFuncName(), E.getCDetailMsg());
     }
 
     if(file1)
@@ -507,282 +507,283 @@ test_reference_group(void)
 static void
 test_reference_region_1D(void)
 {
-    hsize_t	start[SPACE3_RANK];     /* Starting location of hyperslab */
-    hsize_t	stride[SPACE3_RANK];    /* Stride of hyperslab */
-    hsize_t	count[SPACE3_RANK];     /* Element count of hyperslab */
-    hsize_t	block[SPACE3_RANK];     /* Block size of hyperslab */
-    hsize_t	coord1[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */
+    hsize_t        start[SPACE3_RANK];     /* Starting location of hyperslab */
+    hsize_t        stride[SPACE3_RANK];    /* Stride of hyperslab */
+    hsize_t        count[SPACE3_RANK];     /* Element count of hyperslab */
+    hsize_t        block[SPACE3_RANK];     /* Block size of hyperslab */
+    hsize_t        coord1[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */
     hsize_t *   coords;                 /* Coordinate buffer */
-    hsize_t	low[SPACE3_RANK];       /* Selection bounds */
-    hsize_t	high[SPACE3_RANK];      /* Selection bounds */
+    hsize_t        low[SPACE3_RANK];       /* Selection bounds */
+    hsize_t        high[SPACE3_RANK];      /* Selection bounds */
     int         i;      /* counting variables */
 
     // Output message about test being performed
     SUBTEST("1-D Dataset Region Reference Functions");
 
     try {
-	hdset_reg_ref_t *wbuf,	// buffer to write to disk
-		   *rbuf;	// buffer read from disk
-	uint8_t    *dwbuf,	// Buffer for writing numeric data to disk
-		   *drbuf;	// Buffer for reading numeric data from disk
+        hdset_reg_ref_t *wbuf,   // buffer to write to disk
+                   *rbuf;        // buffer read from disk
+        uint8_t    *dwbuf,       // Buffer for writing numeric data to disk
+                   *drbuf;       // Buffer for reading numeric data from disk
 
-	// Allocate write & read buffers
-	wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
-	rbuf = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t) * SPACE1_DIM1);
-	dwbuf = (uint8_t *)HDmalloc(sizeof(uint8_t) * SPACE3_DIM1);
-	drbuf = (uint8_t *)HDcalloc(sizeof(uint8_t), (size_t)SPACE3_DIM1);
+        // Allocate write & read buffers
+        wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
+        rbuf = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t) * SPACE1_DIM1);
+        dwbuf = (uint8_t *)HDmalloc(sizeof(uint8_t) * SPACE3_DIM1);
+        drbuf = (uint8_t *)HDcalloc(sizeof(uint8_t), (size_t)SPACE3_DIM1);
 
         // Create file FILE1
         H5File file1(FILE2, H5F_ACC_TRUNC);
 
-	// Create dataspace for datasets
-	hsize_t	dims3[] = {SPACE3_DIM1};
-	DataSpace sid3(SPACE3_RANK, dims3);
+        // Create dataspace for datasets
+        hsize_t dims3[] = {SPACE3_DIM1};
+        DataSpace sid3(SPACE3_RANK, dims3);
 
-	// Create dataset access property list
-	PropList dapl(H5P_DATASET_ACCESS);
+        // Create dataset access property list
+        PropList dapl(H5P_DATASET_ACCESS);
 
-	// Create a dataset
-	DataSet dset3 = file1.createDataSet(DSET2_NAME, PredType::STD_U8LE, sid3);
+        // Create a dataset
+        DataSet dset3 = file1.createDataSet(DSET2_NAME, PredType::STD_U8LE, sid3);
 
-	uint8_t *tu8;      // Temporary pointer to uint8 data
-	for (tu8 = dwbuf, i = 0; i < SPACE3_DIM1; i++)
-	    *tu8++ = i * 3; // from C test
+        uint8_t *tu8;      // Temporary pointer to uint8 data
+        for (tu8 = dwbuf, i = 0; i < SPACE3_DIM1; i++)
+            *tu8++ = i * 3; // from C test
 
-	// Write selection to disk
-	dset3.write(dwbuf, PredType::STD_U8LE);
+        // Write selection to disk
+        dset3.write(dwbuf, PredType::STD_U8LE);
 
-	// Close Dataset
-	dset3.close();
+        // Close Dataset
+        dset3.close();
 
-	// Create dataspace for datasets
-	hsize_t	dims1[] = {SPACE1_DIM1};
-	DataSpace sid1(SPACE1_RANK, dims1);
+        // Create dataspace for datasets
+        hsize_t dims1[] = {SPACE1_DIM1};
+        DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create a dataset
-	DataSet dset1 = file1.createDataSet(DSET1_NAME, PredType::STD_REF_DSETREG, sid1);
+        // Create a dataset
+        DataSet dset1 = file1.createDataSet(DSET1_NAME, PredType::STD_REF_DSETREG, sid1);
 
-	/*
-	 * Create references and prepare for testing
-	 */
+        /*
+         * Create references and prepare for testing
+         */
 
-	/* Select 15 2x1 hyperslabs for first reference */
-	start[0] = 2;
-	stride[0] = 5;
-	count[0] = 15;
-	block[0] = 2;
+        /* Select 15 2x1 hyperslabs for first reference */
+        start[0] = 2;
+        stride[0] = 5;
+        count[0] = 15;
+        block[0] = 2;
 
-	// Select a hyperslab region to add to the current selected region
-	sid3.selectHyperslab(H5S_SELECT_SET, count, start, stride, block);
+        // Select a hyperslab region to add to the current selected region
+        sid3.selectHyperslab(H5S_SELECT_SET, count, start, stride, block);
 
-	// Get and verify the number of elements in a dataspace selection
-	hssize_t nelms = sid3.getSelectNpoints();
-	verify_val(nelms, 30, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Get and verify the number of elements in a dataspace selection
+        hssize_t nelms = sid3.getSelectNpoints();
+        verify_val(nelms, 30, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	// Store first dataset region
-	file1.reference(&wbuf[0], "/Dataset2", sid3);
+        // Store first dataset region
+        file1.reference(&wbuf[0], "/Dataset2", sid3);
 
-	// Get and verify object type
-	H5O_type_t obj_type = dset1.getRefObjType(&wbuf[0], H5R_DATASET_REGION);
-	verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+        // Get and verify object type
+        H5O_type_t obj_type = dset1.getRefObjType(&wbuf[0], H5R_DATASET_REGION);
+        verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
 
-	/* Select sequence of ten points for second reference */
-	coord1[0][0] = 16;
-	coord1[1][0] = 22;
-	coord1[2][0] = 38;
-	coord1[3][0] = 41;
-	coord1[4][0] = 52;
-	coord1[5][0] = 63;
-	coord1[6][0] = 70;
-	coord1[7][0] = 89;
-	coord1[8][0] = 97;
-	coord1[9][0] = 3;
-
-	// Selects array elements to be included in the selection for sid3
-	sid3.selectElements(H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1);
-
-	// Get and verify the number of elements in a dataspace selection
-	nelms = sid3.getSelectNpoints();
-	verify_val(nelms, 10, "DataSet::getRefObjType",__LINE__,__FILE__);
-
-	// Store first dataset region
-	file1.reference(&wbuf[1], "/Dataset2", sid3);
-
-	// Write selection to disk
-	dset1.write(wbuf, PredType::STD_REF_DSETREG);
-
-	// Close disk dataspace, dataset, and file
-	sid1.close();
-	dset1.close();
-	sid3.close();
-	file1.close();
-
-	/*
-	 * Testing various dereference functions
-	 */
-
-	// Re-open the file
-	file1.openFile(FILE2, H5F_ACC_RDWR);
-
-	// Open the dataset
-	dset1 = file1.openDataSet("/Dataset1");
-
-	// Read selection from disk
-	dset1.read(rbuf, PredType::STD_REF_DSETREG);
-
-	{ // Test DataSet::dereference
-	    dset3.dereference(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
-
-	    // Get and verify object type
-	    obj_type = dset1.getRefObjType(&rbuf[0], H5R_DATASET_REGION);
-	    verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
-
-	    // Get dataspace of dset3 the verify number of elements
-	    sid1 = dset3.getSpace();
-	    nelms = sid1.getSimpleExtentNpoints();
-	    verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
-	} // End of test DataSet::dereference
-
-	{ // 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, dapl);
-
-	    // Get dataspace of newds then verify number of elements
-	    sid1 = newds.getSpace();
-	    nelms = sid1.getSimpleExtentNpoints();
-	    verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
-
-	    // Close objects for this mini test
-	    newds.close();
-	    sid1.close();
-	} // End of test DataSet constructor -by dereference
-
-	// Read from disk
-	dset3.read(drbuf, PredType::STD_U8LE);
-
-	for(tu8 = (uint8_t *)drbuf, i = 0; i < SPACE3_DIM1; i++, tu8++)
-	   verify_val(*tu8, (uint8_t)(i * 3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
-
-	/*
-	 * Test getting the referenced region
-	 */
-
-	// Get region
-	DataSpace reg_sp = dset1.getRegion(&rbuf[0]);
-
-	// Get and verify number of elements in a dataspace selection
-	nelms = reg_sp.getSelectNpoints();
-	verify_val((long)nelms, 30, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
-
-	// Get and verify number of hyperslab blocks
-	nelms = reg_sp.getSelectHyperNblocks();
-	verify_val((long)nelms, 15, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
-
-	/* Allocate space for the hyperslab blocks */
-	coords = (hsize_t *)HDmalloc(nelms * SPACE3_RANK * sizeof(hsize_t) * 2);
-
-	// Get the list of hyperslab blocks currently selected
-	reg_sp.getSelectHyperBlocklist((hsize_t)0, (hsize_t)nelms, coords);
-
-	// Verify values in the list
-	verify_val(coords[0], (hsize_t)2, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[1], (hsize_t)3, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[2], (hsize_t)7, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[3], (hsize_t)8, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[4],(hsize_t)12, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[5],(hsize_t)13, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[6],(hsize_t)17, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[7],(hsize_t)18, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[8],(hsize_t)22, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[9],(hsize_t)23, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[10],(hsize_t)27, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[11],(hsize_t)28, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[12],(hsize_t)32, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[13],(hsize_t)33, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[14],(hsize_t)37, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[15],(hsize_t)38, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[16],(hsize_t)42, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[17],(hsize_t)43, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[18],(hsize_t)47, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[19],(hsize_t)48, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[20],(hsize_t)52, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[21],(hsize_t)53, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[22],(hsize_t)57, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[23],(hsize_t)58, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[24],(hsize_t)62, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[25],(hsize_t)63, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[26],(hsize_t)67, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[27],(hsize_t)68, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[28],(hsize_t)72, "Hyperslab Coordinates",__LINE__,__FILE__);
-	verify_val(coords[29],(hsize_t)73, "Hyperslab Coordinates",__LINE__,__FILE__);
-
-	HDfree(coords);
-
-	// Check boundaries
-	reg_sp.getSelectBounds(low, high);
-	verify_val(low[0],(hsize_t)2, "DataSpace::getSelectBounds",__LINE__,__FILE__);
-	verify_val(high[0],(hsize_t)73, "DataSpace::getSelectBounds",__LINE__,__FILE__);
-
-	/* Close region space */
-	reg_sp.close();
-
-	/*
-	 * Another test on getting the referenced region
-	 */
-
-	// Get region
-	DataSpace elm_sp = dset1.getRegion(&rbuf[1]);
-
-	// Get and verify number of element points in the current selection
-	hssize_t nelmspts = elm_sp.getSelectElemNpoints();
-	verify_val((long)nelmspts, 10, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
-
-	/* Allocate space for the hyperslab blocks */
-	coords = (hsize_t *)HDmalloc(nelmspts * SPACE3_RANK * sizeof(hsize_t));
-
-	// Get the list of element points currently selected
-	elm_sp.getSelectElemPointlist((hsize_t)0, (hsize_t)nelmspts, coords);
-
-	// Verify points
-	verify_val(coords[0], coord1[0][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[1], coord1[1][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[2], coord1[2][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[3], coord1[3][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[4], coord1[4][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[5], coord1[5][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[6], coord1[6][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[7], coord1[7][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[8], coord1[8][0], "Element Coordinates",__LINE__,__FILE__);
-	verify_val(coords[9], coord1[9][0], "Element Coordinates",__LINE__,__FILE__);
-
-	HDfree(coords);
-
-	// Check boundaries
-	elm_sp.getSelectBounds(low, high);
-	verify_val(low[0],(hsize_t)3, "DataSpace::getSelectBounds",__LINE__,__FILE__);
-	verify_val(high[0],(hsize_t)97, "DataSpace::getSelectBounds",__LINE__,__FILE__);
-
-	// Close element space
-	elm_sp.close();
-
-	// Close resources
-	sid1.close();
-	dset3.close();
-	dset1.close();
-	file1.close();
-
-	// Free memory buffers
-	HDfree(wbuf);
-	HDfree(rbuf);
-	HDfree(dwbuf);
-	HDfree(drbuf);
-
-	PASSED();
+        /* Select sequence of ten points for second reference */
+        coord1[0][0] = 16;
+        coord1[1][0] = 22;
+        coord1[2][0] = 38;
+        coord1[3][0] = 41;
+        coord1[4][0] = 52;
+        coord1[5][0] = 63;
+        coord1[6][0] = 70;
+        coord1[7][0] = 89;
+        coord1[8][0] = 97;
+        coord1[9][0] = 3;
+
+        // Selects array elements to be included in the selection for sid3
+        sid3.selectElements(H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1);
+
+        // Get and verify the number of elements in a dataspace selection
+        nelms = sid3.getSelectNpoints();
+        verify_val(nelms, 10, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+        // Store first dataset region
+        file1.reference(&wbuf[1], "/Dataset2", sid3);
+
+        // Write selection to disk
+        dset1.write(wbuf, PredType::STD_REF_DSETREG);
+
+        // Close disk dataspace, dataset, and file
+        sid1.close();
+        dset1.close();
+        sid3.close();
+        file1.close();
+
+        /*
+         * Testing various dereference functions
+         */
+
+        // Re-open the file
+        file1.openFile(FILE2, H5F_ACC_RDWR);
+
+        // Open the dataset
+        dset1 = file1.openDataSet("/Dataset1");
+
+        // Read selection from disk
+        dset1.read(rbuf, PredType::STD_REF_DSETREG);
+
+        { // Test DataSet::dereference
+            dset3.dereference(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
+
+            // Get and verify object type
+            obj_type = dset1.getRefObjType(&rbuf[0], H5R_DATASET_REGION);
+            verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+            // Get dataspace of dset3 the verify number of elements
+            sid1 = dset3.getSpace();
+            nelms = sid1.getSimpleExtentNpoints();
+            verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+        } // End of test DataSet::dereference
+
+        { // 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, dapl);
+
+            // Get dataspace of newds then verify number of elements
+            sid1 = newds.getSpace();
+            nelms = sid1.getSimpleExtentNpoints();
+            verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+
+            // Close objects for this mini test
+            newds.close();
+            sid1.close();
+        } // End of test DataSet constructor -by dereference
+
+        // Read from disk
+        dset3.read(drbuf, PredType::STD_U8LE);
+
+        for(tu8 = (uint8_t *)drbuf, i = 0; i < SPACE3_DIM1; i++, tu8++)
+            verify_val(*tu8, (uint8_t)(i * 3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+
+        /*
+         * Test getting the referenced region
+         */
+
+        // Get region
+        DataSpace reg_sp = dset1.getRegion(&rbuf[0]);
+
+        // Get and verify number of elements in a dataspace selection
+        nelms = reg_sp.getSelectNpoints();
+        verify_val((long)nelms, 30, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+        // Get and verify number of hyperslab blocks
+        nelms = reg_sp.getSelectHyperNblocks();
+        verify_val((long)nelms, 15, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+        /* Allocate space for the hyperslab blocks */
+        coords = (hsize_t *)HDmalloc(nelms * SPACE3_RANK * sizeof(hsize_t) * 2);
+
+        // Get the list of hyperslab blocks currently selected
+        reg_sp.getSelectHyperBlocklist((hsize_t)0, (hsize_t)nelms, coords);
+
+        // Verify values in the list
+        verify_val(coords[0], (hsize_t)2, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[1], (hsize_t)3, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[2], (hsize_t)7, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[3], (hsize_t)8, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[4],(hsize_t)12, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[5],(hsize_t)13, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[6],(hsize_t)17, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[7],(hsize_t)18, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[8],(hsize_t)22, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[9],(hsize_t)23, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[10],(hsize_t)27, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[11],(hsize_t)28, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[12],(hsize_t)32, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[13],(hsize_t)33, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[14],(hsize_t)37, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[15],(hsize_t)38, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[16],(hsize_t)42, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[17],(hsize_t)43, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[18],(hsize_t)47, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[19],(hsize_t)48, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[20],(hsize_t)52, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[21],(hsize_t)53, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[22],(hsize_t)57, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[23],(hsize_t)58, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[24],(hsize_t)62, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[25],(hsize_t)63, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[26],(hsize_t)67, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[27],(hsize_t)68, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[28],(hsize_t)72, "Hyperslab Coordinates",__LINE__,__FILE__);
+        verify_val(coords[29],(hsize_t)73, "Hyperslab Coordinates",__LINE__,__FILE__);
+
+        HDfree(coords);
+
+        // Check boundaries
+        reg_sp.getSelectBounds(low, high);
+        verify_val(low[0],(hsize_t)2, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+        verify_val(high[0],(hsize_t)73, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+
+        /* Close region space */
+        reg_sp.close();
+
+        /*
+         * Another test on getting the referenced region
+         */
+
+        // Get region
+        DataSpace elm_sp = dset1.getRegion(&rbuf[1]);
+
+        // Get and verify number of element points in the current selection
+        hssize_t nelmspts = elm_sp.getSelectElemNpoints();
+        verify_val((long)nelmspts, 10, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+        /* Allocate space for the hyperslab blocks */
+        coords = (hsize_t *)HDmalloc(nelmspts * SPACE3_RANK * sizeof(hsize_t));
+
+        // Get the list of element points currently selected
+        elm_sp.getSelectElemPointlist((hsize_t)0, (hsize_t)nelmspts, coords);
+
+        // Verify points
+        verify_val(coords[0], coord1[0][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[1], coord1[1][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[2], coord1[2][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[3], coord1[3][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[4], coord1[4][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[5], coord1[5][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[6], coord1[6][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[7], coord1[7][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[8], coord1[8][0], "Element Coordinates",__LINE__,__FILE__);
+        verify_val(coords[9], coord1[9][0], "Element Coordinates",__LINE__,__FILE__);
+
+        HDfree(coords);
+
+        // Check boundaries
+        elm_sp.getSelectBounds(low, high);
+        verify_val(low[0],(hsize_t)3, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+        verify_val(high[0],(hsize_t)97, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+
+        // Close element space
+        elm_sp.close();
+
+        // Close resources
+        sid1.close();
+        dset3.close();
+        dset1.close();
+        file1.close();
+
+        // Free memory buffers
+        HDfree(wbuf);
+        HDfree(rbuf);
+        HDfree(dwbuf);
+        HDfree(drbuf);
+
+        PASSED();
     } // end try
-    catch (Exception E) {
-	issue_fail_msg("test_reference_region_1D()",__LINE__,__FILE__,
-			E.getCFuncName(), E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_reference_region_1D()",__LINE__,__FILE__,
+                        E.getCFuncName(), E.getCDetailMsg());
     }
 }   /* test_reference_region_1D() */
 
@@ -804,9 +805,7 @@ static void test_reference_compat(void)
 **  test_reference(): Main reference testing routine.
 **
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_reference(void)
 {
     // Output message about test being performed
@@ -822,13 +821,11 @@ void test_reference(void)
 
 

 /****************************************************************
-** Function:	cleanup_reference
-** Purpose:	Cleanup temporary test files
-** Return:	none
+** Function:    cleanup_reference
+** Purpose      Cleanup temporary test files
+** Return       none
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_reference(void)
 {
     HDremove(FILE1.c_str());
diff --git a/c++/test/ttypes.cpp b/c++/test/ttypes.cpp
index 971a06f..f76f780 100644
--- a/c++/test/ttypes.cpp
+++ b/c++/test/ttypes.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -18,34 +16,26 @@
    ttypes.cpp - HDF5 C++ testing the general datatype functionality
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 /*
  * Offset from alinged memory returned by malloc().  This can be used to test
  * that type conversions handle non-aligned buffers correctly.
  */
-#define ALIGNMENT	1
+#define ALIGNMENT        1
 
 /*
  * Define if you want to test alignment code on a machine that doesn't
@@ -78,7 +68,7 @@ const char *FILENAME[] = {
  * endian.  If local variable `endian' is H5T_ORDER_BE then the result will
  * be I, otherwise the result will be Z-(I+1).
  */
-#define ENDIAN(Z,I)	(H5T_ORDER_BE==endian?(I):(Z)-((I)+1))
+#define ENDIAN(Z,I)        (H5T_ORDER_BE==endian?(I):(Z)-((I)+1))
 
 
 typedef enum flt_t {
@@ -94,12 +84,12 @@ typedef enum int_t {
 /*-------------------------------------------------------------------------
  * Function:    test_classes
  *
- * Purpose:     Test type classes
+ * Purpose      Test type classes
  *
- * Return:      None.
+ * Return       None.
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -109,37 +99,38 @@ static void test_classes()
 {
     SUBTEST("PredType::getClass()");
     try {
-	// maybe later, int curr_nerrors = GetTestNumErrs();
-
-	// PredType::NATIVE_INT should be in H5T_INTEGER class
-	H5T_class_t tcls = PredType::NATIVE_INT.getClass();
-	if (H5T_INTEGER!=tcls) {
-	    puts("    Invalid type class for H5T_NATIVE_INT");
-	}
-
-	// PredType::NATIVE_DOUBLE should be in H5T_FLOAT class
-	tcls = PredType::NATIVE_DOUBLE.getClass();
-	if (H5T_FLOAT!=tcls) {
-	verify_val(tcls, H5T_FLOAT, "test_class: invalid type class for NATIVE_DOUBLE -", __LINE__, __FILE__);
-	}
-	PASSED();
+        // maybe later, int curr_nerrors = GetTestNumErrs();
+
+        // PredType::NATIVE_INT should be in H5T_INTEGER class
+        H5T_class_t tcls = PredType::NATIVE_INT.getClass();
+        if (H5T_INTEGER!=tcls) {
+            puts("    Invalid type class for H5T_NATIVE_INT");
+        }
+
+        // PredType::NATIVE_DOUBLE should be in H5T_FLOAT class
+        tcls = PredType::NATIVE_DOUBLE.getClass();
+        if (H5T_FLOAT!=tcls) {
+        verify_val(tcls, H5T_FLOAT, "test_class: invalid type class for NATIVE_DOUBLE -", __LINE__, __FILE__);
+        }
+        PASSED();
     }   // end of try block
-    catch (Exception E) {
-	issue_fail_msg("test_classes", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_classes", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }
 

 /*-------------------------------------------------------------------------
  * Function:    test_copy
  *
- * Purpose:     Test datatype copy functionality
+ * Purpose      Test datatype copy functionality
  *
- * Return:      Success:        0
+ * Return       Success: 0
  *
- *              Failure:        number of errors
+ *              Failure: number of errors
  *
- * Programmer:  Binh-Minh Ribler (using C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (using C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -150,21 +141,21 @@ static void test_copy()
 
     SUBTEST("DataType::copy() and DataType::operator=");
     try {
-	// Test copying from a predefined datatype using DataType::operator=
-	DataType assigned_type;
-	assigned_type = PredType::NATIVE_SHORT;
+        // Test copying from a predefined datatype using DataType::operator=
+        DataType assigned_type;
+        assigned_type = PredType::NATIVE_SHORT;
 
         // Test copying a predefined type using DataType::copy
-	DataType copied_type;
+        DataType copied_type;
         copied_type.copy (PredType::STD_B8LE);
 
-	// Test copying a user-defined type using DataType::operator=
-	DataType assigned_usertype;
-	assigned_usertype = copied_type;
+        // Test copying a user-defined type using DataType::operator=
+        DataType assigned_usertype;
+        assigned_usertype = copied_type;
 
-	// Test copying from a user-defined datatype using DataType::copy
-	DataType copied_usertype;
-	copied_usertype.copy(copied_type);
+        // Test copying from a user-defined datatype using DataType::copy
+        DataType copied_usertype;
+        copied_usertype.copy(copied_type);
 
         // Test copying a user-defined int type using DataType::operator=
         IntType orig_int(PredType::STD_B8LE);
@@ -178,25 +169,26 @@ static void test_copy()
         IntType another_int_type;
         another_int_type = new_int_type;
 
-	PASSED();
+        PASSED();
     }
-    catch (Exception E) {
-	issue_fail_msg("test_copy", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_copy", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_query
+ * Function:    test_query
  *
- * Purpose:	Tests query functions of compound and enumeration types.
+ * Purpose      Tests query functions of compound and enumeration types.
  *
- * Return:	Success: 	0
+ * Return       Success: 0
  *
- *		Failure:	number of errors
+ *              Failure: number of errors
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -209,105 +201,128 @@ const H5std_string EnumT_NAME("Enum_type");
 static void test_query()
 {
     typedef struct {
-	int    a;
-	float  b;
-	long   c;
-	double d;
+        int    a;
+        float  b;
+        long   c;
+        double d;
     } src_typ_t;
-    short	enum_val;
+    short        enum_val;
 
     // Output message about test being performed
     SUBTEST("Query functions of compound and enumeration types");
     try
     {
-	// Create File
-	H5File file(FILENAME[2], H5F_ACC_TRUNC);
-
-	// Create a compound datatype
-	CompType tid1(sizeof(src_typ_t));
-
-	tid1.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
-	tid1.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_FLOAT);
-	tid1.insertMember("c", HOFFSET(src_typ_t, c), PredType::NATIVE_LONG);
-	tid1.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_DOUBLE);
-
-	// Create a enumerate datatype
-	EnumType tid2(sizeof(short));
-
-	tid2.insert("RED", (enum_val=0,&enum_val));
-	tid2.insert("GREEN", (enum_val=1,&enum_val));
-	tid2.insert("BLUE", (enum_val=2,&enum_val));
-	tid2.insert("ORANGE", (enum_val=3,&enum_val));
-	tid2.insert("YELLOW", (enum_val=4,&enum_val));
-
-	// Query member number and member index by name, for compound type
-	int nmembs = tid1.getNmembers();
-	verify_val(nmembs, 4, "CompType::getNmembers()", __LINE__, __FILE__);
-
-	int index = tid1.getMemberIndex("c");
-	verify_val(index, 2, "CompType::getMemberIndex()", __LINE__, __FILE__);
-
-	// Query member number and member index by name, for enumeration type.
-	nmembs = tid2.getNmembers();
-	verify_val(nmembs, 5, "EnumType::getNmembers()", __LINE__, __FILE__);
-
-	index = tid2.getMemberIndex("ORANGE");
-	verify_val(index, 3, "EnumType::getMemberIndex()", __LINE__, __FILE__);
-
-	// Commit compound datatype and close it
-	tid1.commit(file, CompT_NAME);
-	tid1.close();
-
-	// Commit enumeration datatype and close it
-	tid2.commit(file, EnumT_NAME);
-	tid2.close();
-
-	// Open the datatypes for query
-	tid1 = file.openCompType(CompT_NAME);
-	tid2 = file.openEnumType(EnumT_NAME);
-
-	// Query member number and member index by name, for compound type
-	nmembs = tid1.getNmembers();
-	verify_val(nmembs, 4, "CompType::getNmembers()", __LINE__, __FILE__);
-	index = tid1.getMemberIndex("c");
-	verify_val(index, 2, "CompType::getMemberIndex()", __LINE__, __FILE__);
-
-	// Query member number and member index by name, for enumeration type
-	nmembs = tid2.getNmembers();
-	verify_val(nmembs, 5, "EnumType::getNmembers()", __LINE__, __FILE__);
-	index = tid2.getMemberIndex("ORANGE");
-	verify_val(index, 3, "EnumType::getMemberIndex()", __LINE__, __FILE__);
-
-	// Close datatypes and file
-	tid1.close();
-	tid2.close();
-	file.close();
-
-	// Try truncating the file to make sure reference counting is good.
-	// If any references to ids of tid1 and tid2 are left unterminated,
-	// the truncating will fail, because the file will not be closed in
-	// the file.close() above.
-	H5File file1(FILENAME[2], H5F_ACC_TRUNC);
-
-	PASSED();
+        // Create File
+        H5File file(FILENAME[2], H5F_ACC_TRUNC);
+
+        // Create a compound datatype
+        CompType tid1(sizeof(src_typ_t));
+
+        tid1.insertMember("a", HOFFSET(src_typ_t, a), PredType::NATIVE_INT);
+        tid1.insertMember("b", HOFFSET(src_typ_t, b), PredType::NATIVE_FLOAT);
+        tid1.insertMember("c", HOFFSET(src_typ_t, c), PredType::NATIVE_LONG);
+        tid1.insertMember("d", HOFFSET(src_typ_t, d), PredType::NATIVE_DOUBLE);
+
+        // Create a enumerate datatype
+        EnumType tid2(sizeof(short));
+
+        tid2.insert("RED", (enum_val=0,&enum_val));
+        tid2.insert("GREEN", (enum_val=1,&enum_val));
+        tid2.insert("BLUE", (enum_val=2,&enum_val));
+        tid2.insert("ORANGE", (enum_val=3,&enum_val));
+        tid2.insert("YELLOW", (enum_val=4,&enum_val));
+
+        // Query member number and member index by name, for compound type
+        int nmembs = tid1.getNmembers();
+        verify_val(nmembs, 4, "CompType::getNmembers()", __LINE__, __FILE__);
+
+        int index = tid1.getMemberIndex("c");
+        verify_val(index, 2, "CompType::getMemberIndex()", __LINE__, __FILE__);
+
+        // Query member number and member index by name, for enumeration type.
+        nmembs = tid2.getNmembers();
+        verify_val(nmembs, 5, "EnumType::getNmembers()", __LINE__, __FILE__);
+
+        index = tid2.getMemberIndex("ORANGE");
+        verify_val(index, 3, "EnumType::getMemberIndex()", __LINE__, __FILE__);
+
+        // Commit compound datatype, and test getting the datatype creation
+        // prop list, then close it
+        tid1.commit(file, CompT_NAME);
+        PropList tcpl = tid1.getCreatePlist();
+        if (!IdComponent::isValid(tcpl.getId()))
+        {
+            // Throw an invalid action exception
+            throw InvalidActionException("H5Object::createAttribute", "Datatype creation property list is not valid");
+        }
+        tcpl.close();
+        tid1.close();
+
+        // Commit enumeration datatype, and test getting the datatype creation
+        // prop list, then close it
+        tid2.commit(file, EnumT_NAME);
+        tcpl = tid2.getCreatePlist();
+        if (!IdComponent::isValid(tcpl.getId()))
+        {
+            // Throw an invalid action exception
+            throw InvalidActionException("H5Object::createAttribute", "Datatype creation property list is not valid");
+        }
+        tcpl.close();
+        tid2.close();
+
+        // Open the datatypes for query.  Testing both ways
+
+        tid1 = file.openCompType(CompT_NAME);
+        tid1.close();
+        tid2 = file.openEnumType(EnumT_NAME);
+        tid2.close();
+
+        CompType comptype(file, CompT_NAME);
+        EnumType enumtype(file, EnumT_NAME);
+
+        // Query member number and member index by name, for compound type
+        nmembs = comptype.getNmembers();
+        verify_val(nmembs, 4, "CompType::getNmembers()", __LINE__, __FILE__);
+        index = comptype.getMemberIndex("c");
+        verify_val(index, 2, "CompType::getMemberIndex()", __LINE__, __FILE__);
+
+        // Query member number and member index by name, for enumeration type
+        nmembs = enumtype.getNmembers();
+        verify_val(nmembs, 5, "EnumType::getNmembers()", __LINE__, __FILE__);
+        index = enumtype.getMemberIndex("ORANGE");
+        verify_val(index, 3, "EnumType::getMemberIndex()", __LINE__, __FILE__);
+
+        // Close datatypes and file
+        comptype.close();
+        enumtype.close();
+        file.close();
+
+        // Try truncating the file to make sure reference counting is good.
+        // If any references to ids of the accessed types are left unterminated,
+        // the truncating will fail, because the file will not be closed in
+        // the file.close() above.
+        H5File file1(FILENAME[2], H5F_ACC_TRUNC);
+
+        PASSED();
     }   // end of try block
-    catch (Exception E) {
-	issue_fail_msg("test_query", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_query", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_query
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_transient
+ * Function:    test_transient
  *
- * Purpose:	Tests transient datatypes.
+ * Purpose      Tests transient datatypes.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	number of errors
+ *              Failure: number of errors
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -316,76 +331,77 @@ static void test_query()
 const char* filename1 = "dtypes1.h5";
 static void test_transient ()
 {
-    static hsize_t	ds_size[2] = {10, 20};
+    static hsize_t        ds_size[2] = {10, 20};
 
     SUBTEST("Transient datatypes");
     try {
 
-	// Create the file and the dataspace.
-	H5File file(filename1, H5F_ACC_TRUNC);
-	DataSpace space(2, ds_size, ds_size);
-
-	// Copying a predefined type results in a modifiable copy
-	IntType type(PredType::NATIVE_INT);
-	type.setPrecision(256);
-
-	// It should not be possible to create an attribute for a transient type
-	try {
-	    Attribute attr(type.createAttribute("attr1", PredType::NATIVE_INT, space));
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("H5Object::createAttribute", "Attempted to commit a predefined datatype.");
-	} catch (AttributeIException err) {}  // do nothing, failure expected
-
-	// Create a dataset from a transient datatype
-	// type.close(); - put trace in H5Tclose to make sure it's closed
-	type.copy(PredType::NATIVE_INT);
-	DataSet dset(file.createDataSet("dset1", type, space));
-
-	// The type returned from a dataset should not be modifiable
-	IntType itype(dset);
-	try {
-	    itype.setPrecision(256);
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("PredType::setPrecision", "Dataset datatypes should not be modifiable!");
-	} catch (DataTypeIException err) {}
-	itype.close();
-
-	// Get a copy of the dataset's datatype by applying DataType::copy()
-	// to the dataset. The resulted datatype should be modifiable.
-	itype.copy(dset);
-	itype.setPrecision(256);
-	itype.close();
-
-	// Close the dataset and reopen it, testing that its type is still
-	// read-only.  (Note that a copy of it is modifiable.)
-	dset.close();
-	dset = file.openDataSet("dset1");
-
-	// Close objects and file.
-	dset.close();
-	file.close();
-	type.close();
-	space.close();
-	PASSED();
+        // Create the file and the dataspace.
+        H5File file(filename1, H5F_ACC_TRUNC);
+        DataSpace space(2, ds_size, ds_size);
+
+        // Copying a predefined type results in a modifiable copy
+        IntType type(PredType::NATIVE_INT);
+        type.setPrecision(256);
+
+        // It should not be possible to create an attribute for a transient type
+        try {
+            Attribute attr(type.createAttribute("attr1", PredType::NATIVE_INT, space));
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("H5Object::createAttribute", "Attempted to commit a predefined datatype.");
+        } catch (AttributeIException& err) {}  // do nothing, failure expected
+
+        // Create a dataset from a transient datatype
+        // type.close(); - put trace in H5Tclose to make sure it's closed
+        type.copy(PredType::NATIVE_INT);
+        DataSet dset(file.createDataSet("dset1", type, space));
+
+        // The type returned from a dataset should not be modifiable
+        IntType itype(dset);
+        try {
+            itype.setPrecision(256);
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("PredType::setPrecision", "Dataset datatypes should not be modifiable!");
+        } catch (DataTypeIException& err) {}
+        itype.close();
+
+        // Get a copy of the dataset's datatype by applying DataType::copy()
+        // to the dataset. The resulted datatype should be modifiable.
+        itype.copy(dset);
+        itype.setPrecision(256);
+        itype.close();
+
+        // Close the dataset and reopen it, testing that its type is still
+        // read-only.  (Note that a copy of it is modifiable.)
+        dset.close();
+        dset = file.openDataSet("dset1");
+
+        // Close objects and file.
+        dset.close();
+        file.close();
+        type.close();
+        space.close();
+        PASSED();
     }   // end of try block
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_transient", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_transient
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_named
+ * Function:    test_named
  *
- * Purpose:	Tests named datatypes.
+ * Purpose      Tests named datatypes.
  *
- * Return:	Success:	0
+ * Return       Success: 0
  *
- *		Failure:	number of errors
+ *              Failure: number of errors
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  * Modifications:
  *
@@ -394,142 +410,144 @@ static void test_transient ()
 const H5std_string filename2("dtypes2.h5");
 static void test_named ()
 {
-    static hsize_t	ds_size[2] = {10, 20};
-    hsize_t		i;
-    unsigned 		attr_data[10][20];
-    DataType           *ds_type = NULL;
+    static hsize_t ds_size[2] = {10, 20};
+    hsize_t i;
+    unsigned attr_data[10][20];
+    DataType *ds_type = NULL;
 
     SUBTEST("Named datatypes");
     try {
-	// Create the file.
-	H5File file(filename2, H5F_ACC_TRUNC);
+        // Create the file.
+        H5File file(filename2, H5F_ACC_TRUNC);
 
-	// Create a simple dataspace.
-	DataSpace space(2, ds_size, ds_size);
+        // Create a simple dataspace.
+        DataSpace space(2, ds_size, ds_size);
 
-	// Predefined types cannot be committed.
-	try {
-	    PredType nativeint(PredType::NATIVE_INT);
-	    nativeint.commit(file, "test_named_1 (should not exist)");
+        // Predefined types cannot be committed.
+        try {
+            PredType nativeint(PredType::NATIVE_INT);
+            nativeint.commit(file, "test_named_1 (should not exist)");
 
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("PredType::commit", "Attempted to commit a predefined datatype.");
-	} catch (DataTypeIException err) {}
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("PredType::commit", "Attempted to commit a predefined datatype.");
+        } catch (DataTypeIException& err) {}
 
-	// Copy a predefined datatype and commit the copy.
+        // Copy a predefined datatype and commit the copy.
         IntType itype(PredType::NATIVE_INT);
         itype.commit(file, "native-int");
 
-	// Test commit passing in const H5File& for prototype with const
-	try
-	{
-	    // Create random char type
-	    IntType atype(PredType::NATIVE_UCHAR);
-
-	    // Creating group, declared as const
-	    const Group const_grp = file.createGroup("GR as loc");
-
-	    // Commit type passing in const group; compilation would fail if
-	    // no matching prototype
-	    atype.commit(const_grp, "random uchar");
-	}   // end of try block
-	catch (Exception E) {
-	    issue_fail_msg("test_named", __LINE__, __FILE__, "Commit at const group");
-	}
-
-	// Check that it is committed.
-	if (itype.committed() == false)
-	    cerr << "IntType::committed() returned false" << endl;
-
-	// We should not be able to modify a type after it has been committed.
-	try {
-	    itype.setPrecision(256);	// attempt an invalid action...
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("IntType::setPrecision", "Attempted to modify a committed datatype.");
-	} catch (DataTypeIException err) {}
-
-	// We should not be able to re-commit a committed type
-	try {
-	    itype.commit(file, "test_named_2 (should not exist)");
-
-	    // Should FAIL but didn't, so throw an invalid action exception
-	    throw InvalidActionException("IntType::commit", "Attempted to re-commit a committed datatype.");
-	} catch (DataTypeIException err) {} // do nothing, failure expected
-
-	// It should be possible to define an attribute for the named type
-	Attribute attr1 = itype.createAttribute("attr1", PredType::NATIVE_UCHAR, space);
-	for (i=0; i<ds_size[0]*ds_size[1]; i++)
-	    attr_data[0][i] = (int)i;/*tricky*/
-	attr1.write(PredType::NATIVE_UINT, attr_data);
-	attr1.close();
-
-	// Copying a committed type should result in a transient type which is
-	// not locked.
-	IntType trans_type;
-	trans_type.copy(itype);
-	bool iscommitted = trans_type.committed();
-	verify_val(iscommitted, 0, "DataType::committed() - Copying a named type should result in a transient type!", __LINE__, __FILE__);
-	trans_type.setPrecision(256);
-	trans_type.close();
-
-	// Close the committed type and reopen it.  It should be a named type.
-	itype.close();
-	itype = file.openIntType("native-int");
-	iscommitted = itype.committed();
-	if (!iscommitted)
-	    throw InvalidActionException("IntType::committed()", "Opened named types should be named types!");
-
-	// Create a dataset that uses the named type, then get the dataset's
-	// datatype and make sure it's a named type.
-	DataSet dset = file.createDataSet("dset1", itype, space);
-	ds_type = new DataType(dset.getDataType());
-	iscommitted = ds_type->committed();
-	if (!iscommitted)
-	    throw InvalidActionException("IntType::committed()", "Dataset type should be named type!");
-	dset.close();
-	ds_type->close();
+        // Test commit passing in const H5File& for prototype with const
+        try
+        {
+            // Create random char type
+            IntType atype(PredType::NATIVE_UCHAR);
+
+            // Creating group, declared as const
+            const Group const_grp = file.createGroup("GR as loc");
+
+            // Commit type passing in const group; compilation would fail if
+            // no matching prototype
+            atype.commit(const_grp, "random uchar");
+        }   // end of try block
+        catch (Exception& E)
+        {
+            issue_fail_msg("test_named", __LINE__, __FILE__, "Commit at const group");
+        }
+
+        // Check that it is committed.
+        if (itype.committed() == false)
+            cerr << "IntType::committed() returned false" << endl;
+
+        // We should not be able to modify a type after it has been committed.
+        try {
+            itype.setPrecision(256);        // attempt an invalid action...
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("IntType::setPrecision", "Attempted to modify a committed datatype.");
+        } catch (DataTypeIException& err) {}
+
+        // We should not be able to re-commit a committed type
+        try {
+            itype.commit(file, "test_named_2 (should not exist)");
+
+            // Should FAIL but didn't, so throw an invalid action exception
+            throw InvalidActionException("IntType::commit", "Attempted to re-commit a committed datatype.");
+        } catch (DataTypeIException& err) {} // do nothing, failure expected
+
+        // It should be possible to define an attribute for the named type
+        Attribute attr1 = itype.createAttribute("attr1", PredType::NATIVE_UCHAR, space);
+        for (i=0; i<ds_size[0]*ds_size[1]; i++)
+            attr_data[0][i] = (int)i;/*tricky*/
+        attr1.write(PredType::NATIVE_UINT, attr_data);
+        attr1.close();
+
+        // Copying a committed type should result in a transient type which is
+        // not locked.
+        IntType trans_type;
+        trans_type.copy(itype);
+        bool iscommitted = trans_type.committed();
+        verify_val(iscommitted, 0, "DataType::committed() - Copying a named type should result in a transient type!", __LINE__, __FILE__);
+        trans_type.setPrecision(256);
+        trans_type.close();
+
+        // Close the committed type and reopen it.  It should be a named type.
+        itype.close();
+        itype = file.openIntType("native-int");
+        iscommitted = itype.committed();
+        if (!iscommitted)
+            throw InvalidActionException("IntType::committed()", "Opened named types should be named types!");
+
+        // Create a dataset that uses the named type, then get the dataset's
+        // datatype and make sure it's a named type.
+        DataSet dset = file.createDataSet("dset1", itype, space);
+        ds_type = new DataType(dset.getDataType());
+        iscommitted = ds_type->committed();
+        if (!iscommitted)
+            throw InvalidActionException("IntType::committed()", "Dataset type should be named type!");
+        dset.close();
+        ds_type->close();
         delete ds_type;
 
-	// Reopen the dataset and its type, then make sure the type is
-	// a named type.
-	dset = file.openDataSet("dset1");
-	ds_type = new DataType(dset.getDataType());
-	iscommitted = ds_type->committed();
-	if (!iscommitted)
-	    throw InvalidActionException("IntType::committed()", "Dataset type should be named type!");
-
-	// Close the dataset and create another with the type returned from
-	// the first dataset.
-	dset.close();
-	dset = file.createDataSet("dset2", *ds_type, space);
-	ds_type->close();
-	dset.close();
+        // Reopen the dataset and its type, then make sure the type is
+        // a named type.
+        dset = file.openDataSet("dset1");
+        ds_type = new DataType(dset.getDataType());
+        iscommitted = ds_type->committed();
+        if (!iscommitted)
+            throw InvalidActionException("IntType::committed()", "Dataset type should be named type!");
+
+        // Close the dataset and create another with the type returned from
+        // the first dataset.
+        dset.close();
+        dset = file.createDataSet("dset2", *ds_type, space);
+        ds_type->close();
+        dset.close();
         delete ds_type;
 
-	// Reopen the second dataset and make sure the type is shared
-	dset = file.openDataSet("dset2");
-	ds_type = new DataType(dset.getDataType());
-	iscommitted = ds_type->committed();
-	if (!iscommitted)
-	    throw InvalidActionException("DataType::iscommitted()", "Dataset type should be named type!");
-	ds_type->close();
-
-	// Get the dataset datatype by applying DataType::copy() to the
-	// dataset. The resulted datatype should be modifiable.
-	IntType copied_type;
-	copied_type.copy(dset);
-	copied_type.setPrecision(256);
-	copied_type.close();
-
-	// Clean up
-	dset.close();
-	itype.close();
-	space.close();
-	file.close();
-	PASSED();
+        // Reopen the second dataset and make sure the type is shared
+        dset = file.openDataSet("dset2");
+        ds_type = new DataType(dset.getDataType());
+        iscommitted = ds_type->committed();
+        if (!iscommitted)
+            throw InvalidActionException("DataType::iscommitted()", "Dataset type should be named type!");
+        ds_type->close();
+
+        // Get the dataset datatype by applying DataType::copy() to the
+        // dataset. The resulted datatype should be modifiable.
+        IntType copied_type;
+        copied_type.copy(dset);
+        copied_type.setPrecision(256);
+        copied_type.close();
+
+        // Clean up
+        dset.close();
+        itype.close();
+        space.close();
+        file.close();
+        PASSED();
     }   // end of try block
-    catch (Exception E) {
+    catch (Exception& E)
+    {
         issue_fail_msg("test_named", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
@@ -543,9 +561,7 @@ static void test_named ()
 **  test_types(): Main datatypes testing routine.
 **
 ****************************************************************/
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_types()
 {
     // Output message about test being performed
@@ -562,24 +578,22 @@ void test_types()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_types
+ * Function:    cleanup_types
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Quincey Koziol
- *		September 10, 1999
+ * Programmer   Quincey Koziol
+ *              September 10, 1999
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_types()
 {
     for (int i = 0; i < 3; i++)
-	HDremove(FILENAME[i]);
+        HDremove(FILENAME[i]);
 }  // cleanup_types
diff --git a/c++/test/tvlstr.cpp b/c++/test/tvlstr.cpp
index 7c81a8e..d5fea07 100644
--- a/c++/test/tvlstr.cpp
+++ b/c++/test/tvlstr.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*****************************************************************************
@@ -20,27 +18,19 @@
    EXTERNAL ROUTINES/VARIABLES:
 
  ***************************************************************************/
-
 #ifdef OLD_HEADER_FILENAME
 #include <iostream.h>
 #else
 #include <iostream>
 #endif
-#include <string>
-
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
-    using std::cerr;
-    using std::endl;
-#endif  // H5_NO_STD
-#endif
+using std::cerr;
+using std::endl;
 
+#include <string>
 #include "H5Cpp.h"      // C++ API header file
+using namespace H5;
 
-#ifndef H5_NO_NAMESPACE
-    using namespace H5;
-#endif
-
+#include "h5test.h"
 #include "h5cpputil.h"  // C++ utilility header file
 
 // Data file used in most test functions
@@ -53,9 +43,9 @@ const hsize_t SPACE1_DIM1 = 4;
 /****************************************************************
 **
 **  test_vlstr_alloc_custom(): Test VL datatype custom memory
-**	allocation routines.  This routine just uses malloc to
-**	allocate the memory and increments the amount of memory
-**	allocated.  It is passed into setVlenMemManager.
+**        allocation routines.  This routine just uses malloc to
+**        allocate the memory and increments the amount of memory
+**        allocated.  It is passed into setVlenMemManager.
 **
 **  Note: exact copy from the C version.
 **  (Not used now)
@@ -63,9 +53,9 @@ const hsize_t SPACE1_DIM1 = 4;
 #if 0 // not used now
 static void *test_vlstr_alloc_custom(size_t size, void *info)
 {
-    void *ret_value=NULL;	// Pointer to return
+    void *ret_value=NULL;        // Pointer to return
     size_t *mem_used=(size_t *)info;  // Get the pointer to the memory used
-    size_t extra;		// Extra space needed
+    size_t extra;                // Extra space needed
 
     /*
      *  This weird contortion is required on the DEC Alpha to keep the
@@ -75,8 +65,8 @@ static void *test_vlstr_alloc_custom(size_t size, void *info)
     extra=MAX(sizeof(void *),sizeof(size_t));
 
     if((ret_value=HDmalloc(extra+size))!=NULL) {
-	*(size_t *)ret_value=size;
-	*mem_used+=size;
+        *(size_t *)ret_value=size;
+        *mem_used+=size;
     } // end if
     ret_value = ((unsigned char *)ret_value) + extra;
 
@@ -87,9 +77,9 @@ static void *test_vlstr_alloc_custom(size_t size, void *info)
 /****************************************************************
 **
 **  test_vlstr_free_custom(): Test VL datatype custom memory
-**	allocation routines.  This routine just uses free to
-**	release the memory and decrements the amount of memory
-**	allocated.  It is passed into setVlenMemManager.
+**        allocation routines.  This routine just uses free to
+**        release the memory and decrements the amount of memory
+**        allocated.  It is passed into setVlenMemManager.
 **
 **  Note: exact copy from the C version.
 **  (Not used now)
@@ -99,7 +89,7 @@ static void test_vlstr_free_custom(void *_mem, void *info)
 {
     unsigned char *mem;
     size_t *mem_used=(size_t *)info;  // Get the pointer to the memory used
-    size_t extra;		// Extra space needed
+    size_t extra;                     // Extra space needed
 
     /*
      *  This weird contortion is required on the DEC Alpha to keep the
@@ -117,14 +107,14 @@ static void test_vlstr_free_custom(void *_mem, void *info)
 #endif
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstring_dataset
+ * Function:    test_vlstring_dataset
  *
- * Purpose:	Test writing/reading VL strings on datasets.
+ * Purpose      Test writing/reading VL strings on datasets.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -144,88 +134,89 @@ static void test_vlstring_dataset()
     SUBTEST("VL String on Datasets");
 
     try {
-	// Open the file
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
+        // Open the file
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
 
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
 
-	// Open the root group.
-	Group root = file1.openGroup("/");
+        // Open the root group.
+        Group root = file1.openGroup("/");
 
-	// Create dataspace for the dataset.
-	DataSpace ds_space (H5S_SCALAR);
+        // Create dataspace for the dataset.
+        DataSpace ds_space (H5S_SCALAR);
 
-	// Create an dataset in the root group.
-	DataSet dset1 = root.createDataSet(DSET1_NAME, vlst, ds_space);
+        // Create an dataset in the root group.
+        DataSet dset1 = root.createDataSet(DSET1_NAME, vlst, ds_space);
 
-	// Write data to the dataset.
-	dset1.write(DSET1_DATA, vlst);
+        // Write data to the dataset.
+        dset1.write(DSET1_DATA, vlst);
 
-	// Read and verify the dataset string as a string of chars.
-	dset1.read(&string_ds_check, vlst);
-	if(HDstrcmp(string_ds_check, DSET1_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: DSET1_DATA=%s,string_ds_check=%s\n",__LINE__, DSET1_DATA.c_str(), string_ds_check);
+        // Read and verify the dataset string as a string of chars.
+        dset1.read(&string_ds_check, vlst);
+        if(HDstrcmp(string_ds_check, DSET1_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: DSET1_DATA=%s,string_ds_check=%s\n",__LINE__, DSET1_DATA.c_str(), string_ds_check);
 
-	HDfree(string_ds_check);  // note: no need for std::string test
+        HDfree(string_ds_check);  // note: no need for std::string test
         string_ds_check = NULL;
 
-	// Read and verify the dataset string as an std::string.
-	H5std_string read_str;
-	dset1.read(read_str, vlst);
-	if (read_str != DSET1_DATA)
-	    TestErrPrintf("Line %d: Attribute data different: DSET1_DATA=%s,read_str=%s\n",__LINE__, DSET1_DATA.c_str(), read_str.c_str());
+        // Read and verify the dataset string as an std::string.
+        H5std_string read_str;
+        dset1.read(read_str, vlst);
+        if (read_str != DSET1_DATA)
+            TestErrPrintf("Line %d: Attribute data different: DSET1_DATA=%s,read_str=%s\n",__LINE__, DSET1_DATA.c_str(), read_str.c_str());
 
-	// Close the dataset.
-	dset1.close();
+        // Close the dataset.
+        dset1.close();
 
-	// Test scalar type dataset with 1 value.
-	dset1 = root.createDataSet("test_scalar_small", vlst, ds_space);
+        // Test scalar type dataset with 1 value.
+        dset1 = root.createDataSet("test_scalar_small", vlst, ds_space);
 
-	dynstring_ds_write = (char*)HDcalloc(1, sizeof(char));
-	HDmemset(dynstring_ds_write, 'A', 1);
+        dynstring_ds_write = (char*)HDcalloc(1, sizeof(char));
+        HDmemset(dynstring_ds_write, 'A', 1);
 
-	// Write data to the dataset, then read it back.
-	dset1.write(&dynstring_ds_write, vlst);
-	dset1.read(&string_ds_check, vlst);
+        // Write data to the dataset, then read it back.
+        dset1.write(&dynstring_ds_write, vlst);
+        dset1.read(&string_ds_check, vlst);
 
-	// Verify data read.
-	if(HDstrcmp(string_ds_check,dynstring_ds_write)!=0)
-	    TestErrPrintf("VL string datasets don't match!, dynstring_ds_write=%s, string_ds_check=%s\n",dynstring_ds_write,string_ds_check);
-	HDfree(string_ds_check);
+        // Verify data read.
+        if(HDstrcmp(string_ds_check,dynstring_ds_write)!=0)
+            TestErrPrintf("VL string datasets don't match!, dynstring_ds_write=%s, string_ds_check=%s\n",dynstring_ds_write,string_ds_check);
+        HDfree(string_ds_check);
         string_ds_check = NULL;
-	dset1.close();
+        dset1.close();
 
-	// Open dataset DSET1_NAME again.
-	dset1 = root.openDataSet(DSET1_NAME);
+        // Open dataset DSET1_NAME again.
+        dset1 = root.openDataSet(DSET1_NAME);
 
-	// Close dataset and file
-	dset1.close();
-	file1.close();
+        // Close dataset and file
+        dset1.close();
+        file1.close();
 
-	PASSED();
+        PASSED();
     } // end try block
 
     // Catch all exceptions.
-    catch (Exception E) {
-	issue_fail_msg("test_vlstring_dataset()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_vlstring_dataset()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     if(dynstring_ds_write)
         HDfree(dynstring_ds_write);
     if(string_ds_check)
-	HDfree(string_ds_check);
+        HDfree(string_ds_check);
 }   // test_vlstring_dataset()
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstring_array_dataset
+ * Function:    test_vlstring_array_dataset
  *
- * Purpose:	Test writing/reading VL string array to/from datasets.
+ * Purpose      Test writing/reading VL string array to/from datasets.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler
- *		July, 2009
+ * Programmer   Binh-Minh Ribler
+ *              July, 2009
  *
  *-------------------------------------------------------------------------
  */
@@ -242,89 +233,89 @@ static void test_vlstring_array_dataset()
     H5File* file1 = NULL;
     try {
         // Create file.
-	file1 = new H5File(FILENAME, H5F_ACC_RDWR);
+        file1 = new H5File(FILENAME, H5F_ACC_RDWR);
 
         // Create dataspace for datasets.
         hsize_t dims1[] = {SPACE1_DIM1};
         DataSpace ds_space(SPACE1_RANK, dims1);
 
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
-
-	// Create and write a dataset.
-	DataSet dataset(file1->createDataSet(DSSTRARR_NAME, vlst, ds_space));
-	dataset.write(string_ds_array, vlst);
-
-	// Read and verify the dataset using strings of chars as buffer.
-	// Note: reading by array of H5std_string doesn't work yet.
-	char *string_ds_check[SPACE1_DIM1];
-	dataset.read(string_ds_check, vlst);
-
-	hsize_t ii;
-	for (ii = 0; ii < SPACE1_DIM1; ii++)
-	{
-	    if(HDstrcmp(string_ds_check[ii], string_ds_array[ii])!=0)
-		TestErrPrintf("Line %d: Dataset data different: written=%s,read=%s\n",__LINE__, string_ds_array[ii], string_ds_check[ii]);
-
-	    HDfree(string_ds_check[ii]);
-	}
-
-	// Close objects that are no longer needed.
-	dataset.close();
-	ds_space.close();
-
-	//
-	// Test with scalar data space.
-	//
-
-	// Create H5S_SCALAR data space.
-	DataSpace scalar_space;
-
-	// Create and write another dataset.
-	DataSet dataset2(file1->createDataSet("Dataset2", vlst, scalar_space));
-	char *wdata2 = (char*)HDcalloc(65534, sizeof(char));
-	HDmemset(wdata2, 'A', 65533);
-	dataset2.write(&wdata2, vlst);
-
-	char *rdata2;
-	dataset2.read(&rdata2, vlst);
-	if (HDstrcmp(wdata2, rdata2)!=0)
-	    TestErrPrintf("Line %d: Dataset data different: written=%s,read=%s\n",__LINE__, wdata2, rdata2);
-
-	// Release resources from second dataset operation.
-	scalar_space.close();
-	dataset2.close();
-	HDfree(wdata2);
-	HDfree(rdata2);
-
-	// Close objects and file.
-	dataset2.close();
-	vlst.close();
-	file1->close();
-
-	PASSED();
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
+
+        // Create and write a dataset.
+        DataSet dataset(file1->createDataSet(DSSTRARR_NAME, vlst, ds_space));
+        dataset.write(string_ds_array, vlst);
+
+        // Read and verify the dataset using strings of chars as buffer.
+        // Note: reading by array of H5std_string doesn't work yet.
+        char *string_ds_check[SPACE1_DIM1];
+        dataset.read(string_ds_check, vlst);
+
+        hsize_t ii;
+        for (ii = 0; ii < SPACE1_DIM1; ii++)
+        {
+            if(HDstrcmp(string_ds_check[ii], string_ds_array[ii])!=0)
+            TestErrPrintf("Line %d: Dataset data different: written=%s,read=%s\n",__LINE__, string_ds_array[ii], string_ds_check[ii]);
+
+            HDfree(string_ds_check[ii]);
+        }
+
+        // Close objects that are no longer needed.
+        dataset.close();
+        ds_space.close();
+
+        //
+        // Test with scalar data space.
+        //
+
+        // Create H5S_SCALAR data space.
+        DataSpace scalar_space;
+
+        // Create and write another dataset.
+        DataSet dataset2(file1->createDataSet("Dataset2", vlst, scalar_space));
+        char *wdata2 = (char*)HDcalloc(65534, sizeof(char));
+        HDmemset(wdata2, 'A', 65533);
+        dataset2.write(&wdata2, vlst);
+
+        char *rdata2;
+        dataset2.read(&rdata2, vlst);
+        if (HDstrcmp(wdata2, rdata2)!=0)
+            TestErrPrintf("Line %d: Dataset data different: written=%s,read=%s\n",__LINE__, wdata2, rdata2);
+
+        // Release resources from second dataset operation.
+        scalar_space.close();
+        dataset2.close();
+        HDfree(wdata2);
+        HDfree(rdata2);
+
+        // Close objects and file.
+        dataset2.close();
+        vlst.close();
+        file1->close();
+
+        PASSED();
     } // end try
 
     // Catch all exceptions.
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_vlstring_array_dataset()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_vlstring_array_dataset()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     if(file1)
-	delete file1;
+        delete file1;
 } // end test_vlstring_array_dataset()
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstrings_special
+ * Function:    test_vlstrings_special
  *
- * Purpose:	Test VL string code for special string cases, nil and
- *		zero-sized.
+ * Purpose      Test VL string code for special string cases, nil and
+ *              zero-sized.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -338,110 +329,113 @@ static void test_vlstrings_special()
     SUBTEST("Special VL Strings");
 
     try {
-	// Create file.
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
+        // Create file.
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
 
         // Create dataspace for datasets.
         hsize_t dims1[] = {SPACE1_DIM1};
         DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
-
-	// Create a dataset.
-	DataSet dataset(file1.createDataSet("Dataset3", vlst, sid1));
-
-	// Read from the dataset before writing data.
-	dataset.read(rdata, vlst);
-
-	// Check data read in.
-	hsize_t ii;      	// counting variable
-	for (ii=0; ii<SPACE1_DIM1; ii++)
-	    if(rdata[ii]!=NULL)
-		TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
-
-	// Write dataset to disk, then read it back.
-	dataset.write(wdata, vlst);
-	dataset.read(rdata, vlst);
-
-	// Compare data read in.
-	for (ii = 0; ii < SPACE1_DIM1; ii++) {
-	    size_t wlen = HDstrlen(wdata[ii]);
-	    size_t rlen = HDstrlen(rdata[ii]);
-	    if(wlen != rlen) {
-		TestErrPrintf("VL data lengths don't match!, strlen(wdata[%d])=%u, strlen(rdata[%d])=%u\n", (int)ii, (unsigned)wlen, (int)ii, (unsigned)rlen);
-		continue;
-	    } // end if
-	    if(HDstrcmp(wdata[ii],rdata[ii]) != 0) {
-		TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", (int)ii, wdata[ii], (int)ii, rdata[ii]);
-		continue;
-	    } // end if
-	} // end for
-
-	// Reclaim the read VL data.
-	DataSet::vlenReclaim((void *)rdata, vlst, sid1);
-
-	// Close Dataset.
-	dataset.close();
-
-	/*
-	 * Create another dataset to test nil strings.
-	 */
-
-	// Create the property list and set the fill value for the second
-	// dataset.
-	DSetCreatPropList dcpl;
-	char *fill = NULL;	// Fill value
-	dcpl.setFillValue(vlst, &fill);
-	dataset = file1.createDataSet("Dataset4", vlst, sid1, dcpl);
-
-	// Close dataset creation property list.
-	dcpl.close();
-
-	// Read from dataset before writing data.
-	dataset.read(rdata, vlst);
-
-	// Check data read in.
-	for (ii=0; ii<SPACE1_DIM1; ii++)
-	  if(rdata[ii]!=NULL)
-	    TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
-
-	// Try to write nil strings to disk.
-	dataset.write(wdata2, vlst);
-
-	// Read nil strings back from disk.
-	dataset.read(rdata, vlst);
-
-	// Check data read in.
-	for (ii=0; ii<SPACE1_DIM1; ii++)
-	  if(rdata[ii]!=NULL)
-	    TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
-
-	// Close objects and file.
-	dataset.close();
-	vlst.close();
-	sid1.close();
-	file1.close();
-
-	PASSED();
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
+
+        // Create a dataset.
+        DataSet dataset(file1.createDataSet("Dataset3", vlst, sid1));
+
+        // Read from the dataset before writing data.
+        dataset.read(rdata, vlst);
+
+        // Check data read in.
+        hsize_t ii; // counting variable
+        for (ii=0; ii<SPACE1_DIM1; ii++)
+            if(rdata[ii]!=NULL)
+                TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
+
+        // Write dataset to disk, then read it back.
+        dataset.write(wdata, vlst);
+        dataset.read(rdata, vlst);
+
+        // Compare data read in.
+        for (ii = 0; ii < SPACE1_DIM1; ii++)
+        {
+            size_t wlen = HDstrlen(wdata[ii]);
+            size_t rlen = HDstrlen(rdata[ii]);
+            if(wlen != rlen)
+            {
+                TestErrPrintf("VL data lengths don't match!, strlen(wdata[%d])=%u, strlen(rdata[%d])=%u\n", (int)ii, (unsigned)wlen, (int)ii, (unsigned)rlen);
+                continue;
+            } // end if
+            if(HDstrcmp(wdata[ii],rdata[ii]) != 0)
+            {
+                TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", (int)ii, wdata[ii], (int)ii, rdata[ii]);
+                continue;
+            } // end if
+        } // end for
+
+        // Reclaim the read VL data.
+        DataSet::vlenReclaim((void *)rdata, vlst, sid1);
+
+        // Close Dataset.
+        dataset.close();
+
+        /*
+         * Create another dataset to test nil strings.
+         */
+
+        // Create the property list and set the fill value for the second
+        // dataset.
+        DSetCreatPropList dcpl;
+        char *fill = NULL;  // Fill value
+        dcpl.setFillValue(vlst, &fill);
+        dataset = file1.createDataSet("Dataset4", vlst, sid1, dcpl);
+
+        // Close dataset creation property list.
+        dcpl.close();
+
+        // Read from dataset before writing data.
+        dataset.read(rdata, vlst);
+
+        // Check data read in.
+        for (ii=0; ii<SPACE1_DIM1; ii++)
+            if(rdata[ii]!=NULL)
+                TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
+
+        // Try to write nil strings to disk.
+        dataset.write(wdata2, vlst);
+
+        // Read nil strings back from disk.
+        dataset.read(rdata, vlst);
+
+        // Check data read in.
+        for (ii=0; ii<SPACE1_DIM1; ii++)
+            if(rdata[ii]!=NULL)
+                TestErrPrintf("VL doesn't match!, rdata[%d]=%p\n",(int)ii,rdata[ii]);
+
+        // Close objects and file.
+        dataset.close();
+        vlst.close();
+        sid1.close();
+        file1.close();
+
+        PASSED();
     } // end try
 
     // Catch all exceptions.
-    catch (Exception E)
+    catch (Exception& E)
     {
-	issue_fail_msg("test_vlstrings_special()", __LINE__, __FILE__, E.getCDetailMsg());
+        issue_fail_msg("test_vlstrings_special()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 } // test_vlstrings_special
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstring_type
+ * Function:    test_vlstring_type
  *
- * Purpose:	Test if VL string is treated as string.
+ * Purpose      Test if VL string is treated as string.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -453,84 +447,88 @@ static void test_vlstring_type()
 
     H5File* file1 = NULL;
     try {
-	// Open file.
-	file1 = new H5File(FILENAME, H5F_ACC_RDWR);
+        // Open file.
+        file1 = new H5File(FILENAME, H5F_ACC_RDWR);
+
+        // Create a datatype to refer to.
+        StrType vlst(PredType::C_S1);
 
-	// Create a datatype to refer to.
-	StrType vlst(PredType::C_S1);
+        // Change padding and verify it.
+        vlst.setStrpad(H5T_STR_NULLPAD);
+        H5T_str_t pad = vlst.getStrpad();
+        verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
 
-	// Change padding and verify it.
-	vlst.setStrpad(H5T_STR_NULLPAD);
-	H5T_str_t pad = vlst.getStrpad();
-	verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
+        // Convert to variable-length string.
+        vlst.setSize(H5T_VARIABLE);
 
-	// Convert to variable-length string.
-	vlst.setSize(H5T_VARIABLE);
+        // Check if datatype is VL string.
+        H5T_class_t type_class = vlst.getClass();
+        verify_val(type_class, H5T_STRING, "DataType::getClass", __LINE__, __FILE__);
+        bool is_variable_str = vlst.isVariableStr();
+        verify_val(is_variable_str, true, "DataType::isVariableStr", __LINE__, __FILE__);
 
-	// Check if datatype is VL string.
-	H5T_class_t type_class = vlst.getClass();
-	verify_val(type_class, H5T_STRING, "DataType::getClass", __LINE__, __FILE__);
-	bool is_variable_str = vlst.isVariableStr();
-	verify_val(is_variable_str, true, "DataType::isVariableStr", __LINE__, __FILE__);
+        // Check default character set and padding.
+        H5T_cset_t cset = vlst.getCset();
+        verify_val(cset, H5T_CSET_ASCII, "StrType::getCset", __LINE__, __FILE__);
+        pad = vlst.getStrpad();
+        verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
 
-	// Check default character set and padding.
-	H5T_cset_t cset = vlst.getCset();
-	verify_val(cset, H5T_CSET_ASCII, "StrType::getCset", __LINE__, __FILE__);
-	pad = vlst.getStrpad();
-	verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
+        // Commit variable-length string datatype to storage.
+        vlst.commit(*file1, VLSTR_TYPE);
 
-	// Commit variable-length string datatype to storage.
-	vlst.commit(*file1, VLSTR_TYPE);
+        // Close datatype.
+        vlst.close();
 
-	// Close datatype.
-	vlst.close();
+        // Try opening datatype again.
+        vlst = file1->openStrType(VLSTR_TYPE); // deprecated
 
-	// Try opening datatype again.
-	vlst = file1->openStrType(VLSTR_TYPE);
+        // Close again and reopen with constructor.
+        vlst.close();
+        StrType vlst1(*file1, VLSTR_TYPE);
 
-	// Close datatype and file.
-	vlst.close();
-	file1->close();
+        // Close datatype and file.
+        vlst1.close();
+        file1->close();
         delete file1;
 
-	// Open file.
-	file1 = new H5File(FILENAME, H5F_ACC_RDWR);
+        // Open file.
+        file1 = new H5File(FILENAME, H5F_ACC_RDWR);
 
-	// Open the variable-length string datatype just created
-	vlst = file1->openStrType(VLSTR_TYPE);
+        // Open the variable-length string datatype just created
+        StrType vlst2(*file1, VLSTR_TYPE);
 
-	// Verify character set and padding
-	cset = vlst.getCset();
-	verify_val(cset, H5T_CSET_ASCII, "StrType::getCset", __LINE__, __FILE__);
-	pad = vlst.getStrpad();
-	verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
+        // Verify character set and padding
+        cset = vlst2.getCset();
+        verify_val(cset, H5T_CSET_ASCII, "StrType::getCset", __LINE__, __FILE__);
+        pad = vlst2.getStrpad();
+        verify_val(pad, H5T_STR_NULLPAD, "StrType::getStrpad", __LINE__, __FILE__);
 
-	// Close datatype and file
-	vlst.close();
-	file1->close();
+        // Close datatype and file
+        vlst2.close();
+        file1->close();
 
-	PASSED();
+        PASSED();
     } // end try block
 
     // Catch all exceptions.
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("test_vlstring_type()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 
     if(file1)
-	delete file1;
+        delete file1;
 } // end test_vlstring_type()
 
 /*-------------------------------------------------------------------------
- * Function:	test_compact_vlstring
+ * Function:    test_compact_vlstring
  *
- * Purpose:	Test storing VL strings in compact datasets.
+ * Purpose      Test storing VL strings in compact datasets.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -540,73 +538,73 @@ static void test_compact_vlstring()
     SUBTEST("VL Strings on Compact Dataset");
 
     try {
-	// Create file
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
+        // Create file
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
 
-	// Create dataspace for datasets
+        // Create dataspace for datasets
         hsize_t dims1[] = {SPACE1_DIM1};
         DataSpace sid1(SPACE1_RANK, dims1);
 
-	// Create a datatype to refer to
-	StrType vlst(0, H5T_VARIABLE);
-
-	// Create dataset create property list and set layout
-	DSetCreatPropList plist;
-	plist.setLayout(H5D_COMPACT);
-
-	// Create a dataset
-	DataSet dataset(file1.createDataSet("Dataset5", vlst, sid1, plist));
-
-	// Write dataset to disk
-	const char *wdata[SPACE1_DIM1] = {"one", "two", "three", "four"};
-	dataset.write(wdata, vlst);
-
-	// Read dataset from disk
-	char *rdata[SPACE1_DIM1];   // Information read in
-	dataset.read(rdata, vlst);
-
-	// Compare data read in
-	hsize_t i;
-	for (i=0; i<SPACE1_DIM1; i++) {
-	    if (HDstrlen(wdata[i])!=strlen(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]));
-		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]);
-		continue;
-	    } // end if
-	} // end for
-
-	// Reclaim the read VL data
-	DataSet::vlenReclaim((void *)rdata, vlst, sid1);
-
-	// Close objects and file
-	dataset.close();
-	vlst.close();
-	sid1.close();
-	plist.close();
-	file1.close();
-
-	PASSED();
+        // Create a datatype to refer to
+        StrType vlst(0, H5T_VARIABLE);
+
+        // Create dataset create property list and set layout
+        DSetCreatPropList plist;
+        plist.setLayout(H5D_COMPACT);
+
+        // Create a dataset
+        DataSet dataset(file1.createDataSet("Dataset5", vlst, sid1, plist));
+
+        // Write dataset to disk
+        const char *wdata[SPACE1_DIM1] = {"one", "two", "three", "four"};
+        dataset.write(wdata, vlst);
+
+        // Read dataset from disk
+        char *rdata[SPACE1_DIM1];   // Information read in
+        dataset.read(rdata, vlst);
+
+        // Compare data read in
+        hsize_t i;
+        for (i=0; i<SPACE1_DIM1; i++) {
+            if (HDstrlen(wdata[i])!=strlen(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]));
+                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]);
+                continue;
+            } // end if
+        } // end for
+
+        // Reclaim the read VL data
+        DataSet::vlenReclaim((void *)rdata, vlst, sid1);
+
+        // Close objects and file
+        dataset.close();
+        vlst.close();
+        sid1.close();
+        plist.close();
+        file1.close();
+
+        PASSED();
     } // end try
 
     // Catch all exceptions.
-    catch (Exception E)
+    catch (Exception& E)
     {
         issue_fail_msg("test_compact_vlstrings()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_compact_vlstrings
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstring_attribute
+ * Function:    test_vlstring_attribute
  *
- * Purpose:	Test writing/reading VL strings on attributes.
+ * Purpose      Test writing/reading VL strings on attributes.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -623,80 +621,81 @@ static void test_vlstring_attribute()
     SUBTEST("VL String on Attributes");
 
     try {
-	// Open the file
-	H5File file1(FILENAME, H5F_ACC_RDWR);
+        // Open the file
+        H5File file1(FILENAME, H5F_ACC_RDWR);
 
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
 
-	// Open the root group.
-	Group root = file1.openGroup("/");
+        // Open the root group.
+        Group root = file1.openGroup("/");
 
-	// Create dataspace for the attribute.
-	DataSpace att_space (H5S_SCALAR);
+        // Create dataspace for the attribute.
+        DataSpace att_space (H5S_SCALAR);
 
-	// Create an attribute for the root group.
-	Attribute gr_attr = root.createAttribute(ATTRSTR_NAME, vlst, att_space);
+        // Create an attribute for the root group.
+        Attribute gr_attr = root.createAttribute(ATTRSTR_NAME, vlst, att_space);
 
-	// Write data to the attribute.
-	gr_attr.write(vlst, ATTRSTR_DATA);
+        // Write data to the attribute.
+        gr_attr.write(vlst, ATTRSTR_DATA);
 
-	// Read and verify the attribute string as a string of chars.
-	char *string_att_check;
-	gr_attr.read(vlst, &string_att_check);
-	if(HDstrcmp(string_att_check, ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,string_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), string_att_check);
+        // Read and verify the attribute string as a string of chars.
+        char *string_att_check;
+        gr_attr.read(vlst, &string_att_check);
+        if(HDstrcmp(string_att_check, ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,string_att_check=%s\n",__LINE__, ATTRSTR_DATA.c_str(), string_att_check);
 
-	HDfree(string_att_check);  // note: no need for std::string test
+        HDfree(string_att_check);  // note: no need for std::string test
 
-	// Read and verify the attribute string as an std::string.
-	H5std_string read_str;
-	gr_attr.read(vlst, read_str);
-	if (read_str != ATTRSTR_DATA)
-	    TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_str=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_str.c_str());
+        // Read and verify the attribute string as an std::string.
+        H5std_string read_str;
+        gr_attr.read(vlst, read_str);
+        if (read_str != ATTRSTR_DATA)
+            TestErrPrintf("Line %d: Attribute data different: ATTRSTR_DATA=%s,read_str=%s\n",__LINE__, ATTRSTR_DATA.c_str(), read_str.c_str());
 
-	// Close group's attribute.
-	gr_attr.close();
+        // Close group's attribute.
+        gr_attr.close();
 
-	// Test creating a "large" sized string attribute
-	gr_attr = root.createAttribute("test_scalar_large", vlst, att_space);
+        // Test creating a "large" sized string attribute
+        gr_attr = root.createAttribute("test_scalar_large", vlst, att_space);
 
-	string_att_write = (char*)HDcalloc(8192, sizeof(char));
-	HDmemset(string_att_write, 'A', 8191);
+        string_att_write = (char*)HDcalloc(8192, sizeof(char));
+        HDmemset(string_att_write, 'A', 8191);
 
-	// Write data to the attribute, then read it back.
-	gr_attr.write(vlst, &string_att_write);
-	gr_attr.read(vlst, &string_att_check);
+        // Write data to the attribute, then read it back.
+        gr_attr.write(vlst, &string_att_write);
+        gr_attr.read(vlst, &string_att_check);
 
-	// Verify data read.
-	if(HDstrcmp(string_att_check,string_att_write)!=0)
-	    TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n",string_att_write,string_att_check);
+        // Verify data read.
+        if(HDstrcmp(string_att_check,string_att_write)!=0)
+            TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n",string_att_write,string_att_check);
 
-	// Release resources.
-	HDfree(string_att_check);
-	HDfree(string_att_write);
-	gr_attr.close();
-	file1.close();
+        // Release resources.
+        HDfree(string_att_check);
+        HDfree(string_att_write);
+        gr_attr.close();
+        file1.close();
 
-	PASSED();
+        PASSED();
     } // end try block
 
     // Catch all exceptions.
-    catch (Exception E) {
-	issue_fail_msg("test_vlstring_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_vlstring_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_vlstring_attribute()
 
 #if 0
 /*-------------------------------------------------------------------------
- * Function:	test_read_vl_string_attribute
+ * Function:    test_read_vl_string_attribute
  *
- * Purpose:	Test reading VL strings from attributes.
+ * Purpose      Test reading VL strings from attributes.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -707,57 +706,58 @@ static void test_read_vl_string_attribute()
     SUBTEST("reading VL String as attributes");
 
     try {
-	// Open file
-	H5File file1(FILENAME, H5F_ACC_RDONLY);
-
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
-
-	// Open the root group and its attribute named ATTRSTR_NAME.
-	Group root = file1.openGroup("/");
-	Attribute att = root.openAttribute(ATTRSTR_NAME);
-
-	// Test reading "normal" sized string attribute
-	char *string_att_check;
-	att.read(vlst, &string_att_check);
-	if(HDstrcmp(string_att_check,ATTRSTR_DATA.c_str())!=0)
-	    TestErrPrintf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n",ATTRSTR_DATA.c_str(),string_att_check);
-	HDfree(string_att_check);
-	att.close();
-
-	// Test reading "large" sized string attribute
-	att = root.openAttribute("test_scalar_large");
-	att.read(vlst, &string_att_check);
-	if(HDstrcmp(string_att_check,string_att_write)!=0)
-	    TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n",string_att_write,string_att_check);
-	HDfree(string_att_check);
-	HDfree(string_att_write);   // Free string allocated in test_write_vl_string_attribute
-
-	// Close objects and file.
-	att.close();
-	vlst.close();
-	root.close();
-	file1.close();
-
-	PASSED();
+        // Open file
+        H5File file1(FILENAME, H5F_ACC_RDONLY);
+
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
+
+        // Open the root group and its attribute named ATTRSTR_NAME.
+        Group root = file1.openGroup("/");
+        Attribute att = root.openAttribute(ATTRSTR_NAME);
+
+        // Test reading "normal" sized string attribute
+        char *string_att_check;
+        att.read(vlst, &string_att_check);
+        if(HDstrcmp(string_att_check,ATTRSTR_DATA.c_str())!=0)
+            TestErrPrintf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n",ATTRSTR_DATA.c_str(),string_att_check);
+        HDfree(string_att_check);
+        att.close();
+
+        // Test reading "large" sized string attribute
+        att = root.openAttribute("test_scalar_large");
+        att.read(vlst, &string_att_check);
+        if(HDstrcmp(string_att_check,string_att_write)!=0)
+            TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n",string_att_write,string_att_check);
+        HDfree(string_att_check);
+        HDfree(string_att_write);   // Free string allocated in test_write_vl_string_attribute
+
+        // Close objects and file.
+        att.close();
+        vlst.close();
+        root.close();
+        file1.close();
+
+        PASSED();
     } // end try
 
     // Catch all exceptions.
-    catch (Exception E) {
-	issue_fail_msg("test_read_vl_string_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_read_vl_string_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 } // test_read_vl_string_attribute
 #endif // 2013: need to verify before adding to test
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstring_array_attribute
+ * Function:    test_vlstring_array_attribute
  *
- * Purpose:	Test writing/reading VL string array to/from attributes.
+ * Purpose      Test writing/reading VL string array to/from attributes.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler
- *		July, 2009
+ * Programmer   Binh-Minh Ribler
+ *              July, 2009
  *
  *-------------------------------------------------------------------------
  */
@@ -773,104 +773,105 @@ static void test_vlstring_array_attribute()
     SUBTEST("VL String Array on Attributes");
 
     try {
-	// Open the file
-	H5File file1(FILENAME, H5F_ACC_RDWR);
+        // Open the file
+        H5File file1(FILENAME, H5F_ACC_RDWR);
 
-	// Create a datatype to refer to.
-	StrType vlst(0, H5T_VARIABLE);
+        // Create a datatype to refer to.
+        StrType vlst(0, H5T_VARIABLE);
 
-	// Open the root group.
-	Group root = file1.openGroup("/");
+        // Open the root group.
+        Group root = file1.openGroup("/");
 
         // Create dataspace for datasets.
         hsize_t dims1[] = {SPACE1_DIM1};
         DataSpace att_space(SPACE1_RANK, dims1);
 
-	// Create an attribute for the root group.
-	Attribute gr_attr = root.createAttribute(ATTRSTRARR_NAME, vlst, att_space);
+        // Create an attribute for the root group.
+        Attribute gr_attr = root.createAttribute(ATTRSTRARR_NAME, vlst, att_space);
 
-	// Write data to the attribute.
-	gr_attr.write(vlst, string_att_array);
+        // Write data to the attribute.
+        gr_attr.write(vlst, string_att_array);
 
-	// Read and verify the attribute string as a string of chars.
-	// Note: reading by array of H5std_string doesn't work yet.
-	char *string_att_check[SPACE1_DIM1];
-	gr_attr.read(vlst, &string_att_check);
+        // Read and verify the attribute string as a string of chars.
+        // Note: reading by array of H5std_string doesn't work yet.
+        char *string_att_check[SPACE1_DIM1];
+        gr_attr.read(vlst, &string_att_check);
 
-	hsize_t ii;
-	for (ii = 0; ii < SPACE1_DIM1; ii++)
-	{
-	    if(HDstrcmp(string_att_check[ii], string_att_array[ii])!=0)
-		TestErrPrintf("Line %d: Attribute data different: written=%s,read=%s\n",__LINE__, string_att_check[ii], string_att_check[ii]);
+        hsize_t ii;
+        for (ii = 0; ii < SPACE1_DIM1; ii++)
+        {
+            if(HDstrcmp(string_att_check[ii], string_att_array[ii])!=0)
+                TestErrPrintf("Line %d: Attribute data different: written=%s,read=%s\n",__LINE__, string_att_check[ii], string_att_check[ii]);
 
-	    HDfree(string_att_check[ii]);  // note: no need for std::string test
-	}
+            HDfree(string_att_check[ii]);  // note: no need for std::string test
+        }
 
-	// Close group's attribute.
-	gr_attr.close();
-	file1.close();
+        // Close group's attribute.
+        gr_attr.close();
+        file1.close();
 
-	PASSED();
+        PASSED();
     } // end try block
 
     // Catch all exceptions.
-    catch (Exception E) {
-	issue_fail_msg("test_vlstring_array_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_vlstring_array_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 }   // test_vlstring_array_attribute()
 
 /* Helper routine for test_vl_rewrite() */
 static void write_scalar_dset(H5File& file, DataType& type, DataSpace& space,
-				char *name, char *data)
+                              char *name, char *data)
 {
     DataSet dset;
     try {
-	dset = file.createDataSet(name, type, space);
-	dset.write(&data, type, space, space);
-	dset.close();
+        dset = file.createDataSet(name, type, space);
+        dset.write(&data, type, space, space);
+        dset.close();
     } // end try
-    catch (FileIException ferr) {
-	throw;
+    catch (FileIException& ferr) {
+        throw;
     }
-    catch (DataSetIException derr) {
-	throw;
+    catch (DataSetIException& derr) {
+        throw;
     }
 }
 
 /* Helper routine for test_vl_rewrite() */
 static void read_scalar_dset(H5File& file, DataType& type, DataSpace& space,
-				char *name, char *data)
+                             char *name, char *data)
 {
     char *data_read;
     DataSet dset;
     try {
-	dset = file.openDataSet(name);
-	dset.read(&data_read, type, space, space);
-	dset.close();
+        dset = file.openDataSet(name);
+        dset.read(&data_read, type, space, space);
+        dset.close();
 
-	if(HDstrcmp(data, data_read))
-	    TestErrPrintf("Expected %s for dataset %s but read %s\n", data, name, data_read);
+        if(HDstrcmp(data, data_read))
+            TestErrPrintf("Expected %s for dataset %s but read %s\n", data, name, data_read);
 
-	HDfree(data_read);
+        HDfree(data_read);
     } // end try
-    catch (FileIException ferr) {
-	throw;
+    catch (FileIException& ferr) {
+        throw;
     }
-    catch (DataSetIException derr) {
-	throw;
+    catch (DataSetIException& derr) {
+        throw;
     }
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_vl_rewrite
+ * Function:    test_vl_rewrite
  *
- * Purpose:	Test I/O on VL strings when many objects in the file
- *		have been linked/unlinked.
+ * Purpose      Test I/O on VL strings when many objects in the file
+ *              have been linked/unlinked.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler (use C version)
- *		January, 2007
+ * Programmer   Binh-Minh Ribler (use C version)
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
@@ -882,80 +883,79 @@ static void test_vl_rewrite()
     SUBTEST("I/O on VL strings with link/unlink");
 
     try {
-	// Create the files.
-	H5File file1(FILENAME, H5F_ACC_TRUNC);
-	H5File file2(FILENAME2, H5F_ACC_TRUNC);
-
-	// Create the VL string datatype.
-	StrType type(0, H5T_VARIABLE);
-
-	// Create dataspace for the attribute.
-	DataSpace space (H5S_SCALAR);
-
-	// Create in file 1.
-	int i;
-	char name[256]; 	// Buffer for names & data
-	for (i=0; i<REWRITE_NDATASETS; i++) {
-	    sprintf(name, "/set_%d", i);
-	    write_scalar_dset(file1, type, space, name, name);
-	}
-
-	// Effectively copy data from file 1 to 2.
-	for (i=0; i<REWRITE_NDATASETS; i++) {
-	    sprintf(name, "/set_%d", i);
-	    read_scalar_dset(file1, type, space, name, name);
-	    write_scalar_dset(file2, type, space, name, name);
-	}
-
-	// Read back from file 2.
-	for (i=0; i<REWRITE_NDATASETS; i++) {
-	    sprintf(name, "/set_%d", i);
-	    read_scalar_dset(file2, type, space, name, name);
-	}
-
-	// Remove from file 2.
-	for (i=0; i<REWRITE_NDATASETS; i++) {
-	    sprintf(name, "/set_%d", i);
-	    file2.unlink(name);
-	}
-
-	// Effectively copy from file 1 to file 2.
-	for (i=0; i<REWRITE_NDATASETS; i++) {
-	    sprintf(name, "/set_%d", i);
-	    read_scalar_dset(file1, type, space, name, name);
-	    write_scalar_dset(file2, type, space, name, name);
-	}
-
-	// Close objects and file.
-	type.close();
-	space.close();
-	file1.close();
-	file2.close();
-
-	PASSED();
+        // Create the files.
+        H5File file1(FILENAME, H5F_ACC_TRUNC);
+        H5File file2(FILENAME2, H5F_ACC_TRUNC);
+
+        // Create the VL string datatype.
+        StrType type(0, H5T_VARIABLE);
+
+        // Create dataspace for the attribute.
+        DataSpace space (H5S_SCALAR);
+
+        // Create in file 1.
+        int i;
+        char name[256]; // Buffer for names & data
+        for (i=0; i<REWRITE_NDATASETS; i++) {
+            sprintf(name, "/set_%d", i);
+            write_scalar_dset(file1, type, space, name, name);
+        }
+
+        // Effectively copy data from file 1 to 2.
+        for (i=0; i<REWRITE_NDATASETS; i++) {
+            sprintf(name, "/set_%d", i);
+            read_scalar_dset(file1, type, space, name, name);
+            write_scalar_dset(file2, type, space, name, name);
+        }
+
+        // Read back from file 2.
+        for (i=0; i<REWRITE_NDATASETS; i++) {
+            sprintf(name, "/set_%d", i);
+            read_scalar_dset(file2, type, space, name, name);
+        }
+
+        // Remove from file 2.
+        for (i=0; i<REWRITE_NDATASETS; i++) {
+            sprintf(name, "/set_%d", i);
+            file2.unlink(name);
+        }
+
+        // Effectively copy from file 1 to file 2.
+        for (i=0; i<REWRITE_NDATASETS; i++) {
+            sprintf(name, "/set_%d", i);
+            read_scalar_dset(file1, type, space, name, name);
+            write_scalar_dset(file2, type, space, name, name);
+        }
+
+        // Close objects and file.
+        type.close();
+        space.close();
+        file1.close();
+        file2.close();
+
+        PASSED();
     } // end try
 
     // Catch all exceptions.
-    catch (Exception E) {
-	issue_fail_msg("test_vl_rewrite()", __LINE__, __FILE__, E.getCDetailMsg());
+    catch (Exception& E)
+    {
+        issue_fail_msg("test_vl_rewrite()", __LINE__, __FILE__, E.getCDetailMsg());
     }
 } // end test_vl_rewrite()
 
 /*-------------------------------------------------------------------------
- * Function:	test_vlstrings
+ * Function:    test_vlstrings
  *
- * Purpose:	VL string testing main routine.
+ * Purpose      VL string testing main routine.
  *
- * Return:	None
+ * Return       None
  *
- * Programmer:	Binh-Minh Ribler
- *		January, 2007
+ * Programmer   Binh-Minh Ribler
+ *              January, 2007
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void test_vlstrings()
 {
     // Output message about test being performed
@@ -982,22 +982,20 @@ void test_vlstrings()
 
 

 /*-------------------------------------------------------------------------
- * Function:	cleanup_vlstrings
+ * Function:    cleanup_vlstrings
  *
- * Purpose:	Cleanup temporary test files
+ * Purpose      Cleanup temporary test files
  *
- * Return:	none
+ * Return       none
  *
- * Programmer:	Quincey Koziol
+ * Programmer   Quincey Koziol
  *              September 10, 1999
  *
  * Modifications:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef __cplusplus
 extern "C"
-#endif
 void cleanup_vlstrings()
 {
     HDremove(FILENAME.c_str());
diff --git a/config/BlankForm b/config/BlankForm
index 31116bf..a452f92 100644
--- a/config/BlankForm
+++ b/config/BlankForm
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/COPYING b/config/COPYING
index 6903daf..6497ace 100644
--- a/config/COPYING
+++ b/config/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/config/Makefile.am.blank b/config/Makefile.am.blank
index a54c734..b01735b 100644
--- a/config/Makefile.am.blank
+++ b/config/Makefile.am.blank
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 ##
 ## Makefile.am
diff --git a/config/apple b/config/apple
index 5203695..0b15dfe 100644
--- a/config/apple
+++ b/config/apple
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/cce-fflags b/config/cce-fflags
index 233f9ff..9a1c685 100644
--- a/config/cce-fflags
+++ b/config/cce-fflags
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/cce-flags b/config/cce-flags
index 8f3b2dc..acab73c 100644
--- a/config/cce-flags
+++ b/config/cce-flags
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/cmake/CMakeFindJavaCommon.cmake b/config/cmake/CMakeFindJavaCommon.cmake
index fcf0389..fe6ee82 100644
--- a/config/cmake/CMakeFindJavaCommon.cmake
+++ b/config/cmake/CMakeFindJavaCommon.cmake
@@ -17,25 +17,25 @@ set(_JAVA_HOME "")
 if(JAVA_HOME AND IS_DIRECTORY "${JAVA_HOME}")
   set(_JAVA_HOME "${JAVA_HOME}")
   set(_JAVA_HOME_EXPLICIT 1)
-else()
+else ()
   set(_ENV_JAVA_HOME "")
   if(DEFINED ENV{JAVA_HOME})
     file(TO_CMAKE_PATH "$ENV{JAVA_HOME}" _ENV_JAVA_HOME)
-  endif()
+  endif ()
   if(_ENV_JAVA_HOME AND IS_DIRECTORY "${_ENV_JAVA_HOME}")
     set(_JAVA_HOME "${_ENV_JAVA_HOME}")
     set(_JAVA_HOME_EXPLICIT 1)
-  else()
+  else ()
     set(_CMD_JAVA_HOME "")
     if(APPLE AND EXISTS /usr/libexec/java_home)
       execute_process(COMMAND /usr/libexec/java_home
         OUTPUT_VARIABLE _CMD_JAVA_HOME OUTPUT_STRIP_TRAILING_WHITESPACE)
-    endif()
+    endif ()
     if(_CMD_JAVA_HOME AND IS_DIRECTORY "${_CMD_JAVA_HOME}")
       set(_JAVA_HOME "${_CMD_JAVA_HOME}")
       set(_JAVA_HOME_EXPLICIT 0)
-    endif()
+    endif ()
     unset(_CMD_JAVA_HOME)
-  endif()
+  endif ()
   unset(_ENV_JAVA_HOME)
-endif()
+endif ()
diff --git a/config/cmake/CTestCustom.cmake b/config/cmake/CTestCustom.cmake
index b8d8106..7aff076 100644
--- a/config/cmake/CTestCustom.cmake
+++ b/config/cmake/CTestCustom.cmake
@@ -1,4 +1,20 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 set (CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 3000)
+# Allow full output to go to CDash set to 0
+SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 50000)
+SET(CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE 50000)
+# WARNING!  This could be a lot of output and could overwhelm CDash and the
+# MySQL DB so this might not be a good idea!
 
 set (CTEST_CUSTOM_WARNING_EXCEPTION
     ${CTEST_CUSTOM_WARNING_EXCEPTION}
@@ -214,6 +230,7 @@ set (CTEST_CUSTOM_MEMCHECK_IGNORE
     H5REPACK_VERIFY_LAYOUT_ALL-layout_long_switches     #uses grepTest.cmake
     H5REPACK_VERIFY_LAYOUT_ALL-layout_short_switches    #uses grepTest.cmake
     H5REPACK-plugin
+    H5REPACK_CMP-plugin_zero
     ######### tools/h5stat #########
     H5STAT-clearall-objects
     ######### tools/misc #########
diff --git a/config/cmake/CTestScript.cmake b/config/cmake/CTestScript.cmake
new file mode 100755
index 0000000..a3779d6
--- /dev/null
+++ b/config/cmake/CTestScript.cmake
@@ -0,0 +1,163 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+cmake_minimum_required (VERSION 3.2.2 FATAL_ERROR)
+########################################################
+# For any comments please contact cdashhelp at hdfgroup.org
+#
+########################################################
+# -----------------------------------------------------------
+# -- Get environment
+# -----------------------------------------------------------
+if (NOT SITE_OS_NAME)
+  ## machine name not provided - attempt to discover with uname
+  ## -- 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 (osname -s)
+  getuname (osrel  -r)
+  getuname (cpu    -m)
+  message (STATUS "Dashboard script uname output: ${osname}-${osrel}-${cpu}\n")
+
+  set (CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}")
+  if (SITE_BUILDNAME_SUFFIX)
+    set (CTEST_BUILD_NAME  "${SITE_BUILDNAME_SUFFIX}-${CTEST_BUILD_NAME}")
+  endif ()
+  set (BUILD_OPTIONS "${ADD_BUILD_OPTIONS}")
+else ()
+  ## machine name provided
+  ## --------------------------
+  if (CMAKE_HOST_UNIX)
+    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_OS_BITS}-${SITE_COMPILER_NAME}-${SITE_COMPILER_VERSION}")
+  else ()
+    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_COMPILER_NAME}")
+  endif ()
+  if (SITE_BUILDNAME_SUFFIX)
+    set(CTEST_BUILD_NAME "${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX}")
+  endif ()
+  set (BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
+endif ()
+
+#-----------------------------------------------------------------------------
+# 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} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
+  endif ()
+
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
+endif ()
+
+#-----------------------------------------------------------------------------
+set (NEED_REPOSITORY_CHECKOUT 0)
+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_DASHBOARD_ROOT}\\${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_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}")
+    message (FATAL_ERROR "error: extract of ${CTEST_USE_TAR_SOURCE} failed")
+  endif ()
+endif ()
+
+#-----------------------------------------------------------------------------
+## 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 ()
+
+#-----------------------------------------------------------------------------
+# Initialize the CTEST commands
+#------------------------------
+set (CTEST_CONFIGURE_COMMAND
+    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${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
+  ## -- LOCAL_SUBMIT reports to CDash server
+  ## --------------------------
+  ctest_start (Experimental)
+  ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
+  if (LOCAL_SUBMIT)
+    ctest_submit (PARTS Configure Notes)
+  endif ()
+  if (${res} LESS 0 OR ${res} GREATER 0)
+    file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Configure: ${res}\n")
+  endif ()
+
+  ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND RETURN_VALUE res NUMBER_ERRORS errval)
+  if (LOCAL_SUBMIT)
+    ctest_submit (PARTS Build)
+  endif ()
+  if (${res} LESS 0 OR ${res} GREATER 0 OR ${errval} GREATER 0)
+    file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed ${errval} Build: ${res}\n")
+  endif ()
+
+  ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+  if (LOCAL_SUBMIT)
+    ctest_submit (PARTS Test)
+  endif()
+  if (${res} LESS 0 OR ${res} GREATER 0)
+    file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Tests: ${res}\n")
+  endif ()
+  if (${res} LESS 0 OR ${res} GREATER 0)
+    message (FATAL_ERROR "tests FAILED")
+  endif ()
+#-----------------------------------------------------------------------------
diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake
index ec0aecf..0848e66 100644
--- a/config/cmake/ConfigureChecks.cmake
+++ b/config/cmake/ConfigureChecks.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-----------------------------------------------------------------------------
 # Include all the necessary files for macros
 #-----------------------------------------------------------------------------
@@ -6,7 +17,7 @@ include (${HDF_RESOURCES_EXT_DIR}/ConfigureChecks.cmake)
 
 if (HDF5_ENABLE_USING_MEMCHECKER)
   set (H5_USING_MEMCHECKER 1)
-endif (HDF5_ENABLE_USING_MEMCHECKER)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option for --enable-strict-format-checks
@@ -14,7 +25,7 @@ endif (HDF5_ENABLE_USING_MEMCHECKER)
 option (HDF5_STRICT_FORMAT_CHECKS "Whether to perform strict file format checks" OFF)
 if (HDF5_STRICT_FORMAT_CHECKS)
   set (H5_STRICT_FORMAT_CHECKS 1)
-endif (HDF5_STRICT_FORMAT_CHECKS)
+endif ()
 MARK_AS_ADVANCED (HDF5_STRICT_FORMAT_CHECKS)
 
 #-----------------------------------------------------------------------------
@@ -23,7 +34,7 @@ MARK_AS_ADVANCED (HDF5_STRICT_FORMAT_CHECKS)
 option (HDF5_METADATA_TRACE_FILE "Enable metadata trace file collection" OFF)
 if (HDF5_METADATA_TRACE_FILE)
   set (H5_METADATA_TRACE_FILE 1)
-endif (HDF5_METADATA_TRACE_FILE)
+endif ()
 MARK_AS_ADVANCED (HDF5_METADATA_TRACE_FILE)
 
 # ----------------------------------------------------------------------
@@ -35,7 +46,7 @@ MARK_AS_ADVANCED (HDF5_METADATA_TRACE_FILE)
 option (HDF5_WANT_DATA_ACCURACY "IF data accuracy is guaranteed during data conversions" ON)
 if (HDF5_WANT_DATA_ACCURACY)
   set (H5_WANT_DATA_ACCURACY 1)
-endif (HDF5_WANT_DATA_ACCURACY)
+endif ()
 MARK_AS_ADVANCED (HDF5_WANT_DATA_ACCURACY)
 
 # ----------------------------------------------------------------------
@@ -47,7 +58,7 @@ MARK_AS_ADVANCED (HDF5_WANT_DATA_ACCURACY)
 option (HDF5_WANT_DCONV_EXCEPTION "exception handling functions is checked during data conversions" ON)
 if (HDF5_WANT_DCONV_EXCEPTION)
   set (H5_WANT_DCONV_EXCEPTION 1)
-endif (HDF5_WANT_DCONV_EXCEPTION)
+endif ()
 MARK_AS_ADVANCED (HDF5_WANT_DCONV_EXCEPTION)
 
 # ----------------------------------------------------------------------
@@ -56,7 +67,7 @@ MARK_AS_ADVANCED (HDF5_WANT_DCONV_EXCEPTION)
 option (HDF5_ENABLE_CODESTACK "Enable the function stack tracing (for developer debugging)." OFF)
 if (HDF5_ENABLE_CODESTACK)
   set (H5_HAVE_CODESTACK 1)
-endif (HDF5_ENABLE_CODESTACK)
+endif ()
 MARK_AS_ADVANCED (HDF5_ENABLE_CODESTACK)
 
 #-----------------------------------------------------------------------------
@@ -65,7 +76,7 @@ MARK_AS_ADVANCED (HDF5_ENABLE_CODESTACK)
 option (HDF5_ENABLE_HSIZET "Enable datasets larger than memory" ON)
 if (HDF5_ENABLE_HSIZET)
   set (${HDF_PREFIX}_HAVE_LARGE_HSIZET 1)
-endif (HDF5_ENABLE_HSIZET)
+endif ()
 
 # so far we have no check for this
 set (H5_HAVE_TMPFILE 1)
@@ -79,10 +90,10 @@ set (H5_DEFAULT_VFD H5FD_SEC2)
 if (NOT DEFINED "H5_DEFAULT_PLUGINDIR")
   if (WINDOWS)
     set (H5_DEFAULT_PLUGINDIR "%ALLUSERSPROFILE%\\\\hdf5\\\\lib\\\\plugin")
-  else (WINDOWS)
+  else ()
     set (H5_DEFAULT_PLUGINDIR "/usr/local/hdf5/lib/plugin")
-  endif (WINDOWS)
-endif (NOT DEFINED "H5_DEFAULT_PLUGINDIR")
+  endif ()
+endif ()
 
 if (WINDOWS)
   set (H5_HAVE_WINDOWS 1)
@@ -91,7 +102,7 @@ if (WINDOWS)
   # that is, "drive-letter:\" (e.g. "C:") or "drive-letter:/" (e.g. "C:/").
   # (This flag should be _unset_ for all machines, except for Windows)
   set (H5_HAVE_WINDOW_PATH 1)
-endif (WINDOWS)
+endif ()
 
 # ----------------------------------------------------------------------
 # END of WINDOWS Hard code Values
@@ -101,9 +112,9 @@ CHECK_FUNCTION_EXISTS (difftime          H5_HAVE_DIFFTIME)
 
 # Find the library containing clock_gettime()
 if (NOT WINDOWS)
-  CHECK_FUNCTION_EXISTS(clock_gettime CLOCK_GETTIME_IN_LIBC)
-  CHECK_LIBRARY_EXISTS(rt clock_gettime "" CLOCK_GETTIME_IN_LIBRT)
-  CHECK_LIBRARY_EXISTS(posix4 clock_gettime "" CLOCK_GETTIME_IN_LIBPOSIX4)
+  CHECK_FUNCTION_EXISTS (clock_gettime CLOCK_GETTIME_IN_LIBC)
+  CHECK_LIBRARY_EXISTS (rt clock_gettime "" CLOCK_GETTIME_IN_LIBRT)
+  CHECK_LIBRARY_EXISTS (posix4 clock_gettime "" CLOCK_GETTIME_IN_LIBPOSIX4)
   if (CLOCK_GETTIME_IN_LIBC)
     set (H5_HAVE_CLOCK_GETTIME 1)
   elseif (CLOCK_GETTIME_IN_LIBRT)
@@ -112,8 +123,8 @@ if (NOT WINDOWS)
   elseif (CLOCK_GETTIME_IN_LIBPOSIX4)
     set (H5_HAVE_CLOCK_GETTIME 1)
     list (APPEND LINK_LIBS posix4)
-  endif (CLOCK_GETTIME_IN_LIBC)
-endif (NOT WINDOWS)
+  endif ()
+endif ()
 #-----------------------------------------------------------------------------
 
 #-----------------------------------------------------------------------------
@@ -131,43 +142,43 @@ if (NOT WINDOWS)
         OUTPUT_VARIABLE OUTPUT
     )
     if (TEST_DIRECT_VFD_WORKS_COMPILE)
-      if (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
+      if (TEST_DIRECT_VFD_WORKS_RUN MATCHES 0)
         HDF_FUNCTION_TEST (HAVE_DIRECT)
         set (CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
         add_definitions ("-D_GNU_SOURCE")
-      else (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
+      else ()
         set (TEST_DIRECT_VFD_WORKS "" CACHE INTERNAL ${msg})
         message (STATUS "${msg}... no")
         file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
               "Test TEST_DIRECT_VFD_WORKS Run failed with the following output and exit code:\n ${OUTPUT}\n"
         )
-      endif (TEST_DIRECT_VFD_WORKS_RUN  MATCHES 0)
-    else (TEST_DIRECT_VFD_WORKS_COMPILE )
+      endif ()
+    else ()
       set (TEST_DIRECT_VFD_WORKS "" CACHE INTERNAL ${msg})
       message (STATUS "${msg}... no")
       file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
           "Test TEST_DIRECT_VFD_WORKS Compile failed with the following output:\n ${OUTPUT}\n"
       )
-    endif (TEST_DIRECT_VFD_WORKS_COMPILE)
-  endif (HDF5_ENABLE_DIRECT_VFD)
-endif (NOT WINDOWS)
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # 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})
+if (${HAVE_SIZEOF___FLOAT128})
+  set (H5_HAVE_FLOAT128 1)
+else ()
+  set (H5_HAVE_FLOAT128 0)
+  set (SIZEOF___FLOAT128 0)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Macro to determine the various conversion capabilities
 #-----------------------------------------------------------------------------
-MACRO (H5ConversionTests TEST msg)
+macro (H5ConversionTests TEST msg)
   if ("${TEST}" MATCHES "^${TEST}$")
    # message (STATUS "===> ${TEST}")
     TRY_RUN (${TEST}_RUN   ${TEST}_COMPILE
@@ -177,41 +188,41 @@ MACRO (H5ConversionTests TEST msg)
         OUTPUT_VARIABLE OUTPUT
     )
     if (${TEST}_COMPILE)
-      if (${TEST}_RUN  MATCHES 0)
+      if (${TEST}_RUN MATCHES 0)
         set (${TEST} 1 CACHE INTERNAL ${msg})
         message (STATUS "${msg}... yes")
-      else (${TEST}_RUN  MATCHES 0)
+      else ()
         set (${TEST} "" CACHE INTERNAL ${msg})
         message (STATUS "${msg}... no")
         file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
               "Test ${TEST} Run failed with the following output and exit code:\n ${OUTPUT}\n"
         )
-      endif (${TEST}_RUN  MATCHES 0)
-    else (${TEST}_COMPILE )
+      endif ()
+    else ()
       set (${TEST} "" CACHE INTERNAL ${msg})
       message (STATUS "${msg}... no")
       file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
           "Test ${TEST} Compile failed with the following output:\n ${OUTPUT}\n"
       )
-    endif (${TEST}_COMPILE)
+    endif ()
 
-  endif ("${TEST}" MATCHES "^${TEST}$")
-ENDMACRO (H5ConversionTests)
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Macro to make some of the conversion tests easier to write/read
 #-----------------------------------------------------------------------------
-MACRO (H5MiscConversionTest  VAR TEST msg)
+macro (H5MiscConversionTest VAR TEST msg)
   if ("${TEST}" MATCHES "^${TEST}$")
     if (${VAR})
       set (${TEST} 1 CACHE INTERNAL ${msg})
       message (STATUS "${msg}... yes")
-    else (${VAR})
+    else ()
       set (${TEST} "" CACHE INTERNAL ${msg})
       message (STATUS "${msg}... no")
-    endif (${VAR})
-  endif ("${TEST}" MATCHES "^${TEST}$")
-ENDMACRO (H5MiscConversionTest)
+    endif ()
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Check various conversion capabilities
@@ -219,9 +230,9 @@ ENDMACRO (H5MiscConversionTest)
 
 # ----------------------------------------------------------------------
 # 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.
@@ -229,10 +240,10 @@ ENDMACRO (H5MiscConversionTest)
 H5ConversionTests (H5_LDOUBLE_TO_LONG_SPECIAL  "Checking IF your system converts long double to (unsigned) long values with special algorithm")
 # ----------------------------------------------------------------------
 # 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.
 #
 H5ConversionTests (H5_LONG_TO_LDOUBLE_SPECIAL "Checking IF your system can convert (unsigned) long to long double values with special algorithm")
@@ -261,7 +272,7 @@ H5ConversionTests (H5_NO_ALIGNMENT_RESTRICTIONS "Checking IF alignment restricti
 
 # -----------------------------------------------------------------------
 # wrapper script variables
-# 
+#
 set (prefix ${CMAKE_INSTALL_PREFIX})
 set (exec_prefix "\${prefix}")
 set (libdir "${exec_prefix}/lib")
@@ -272,4 +283,4 @@ set (CXX ${CMAKE_CXX_COMPILER})
 set (FC ${CMAKE_Fortran_COMPILER})
 foreach (LINK_LIB ${LINK_LIBS})
   set (LIBS "${LIBS} -l${LINK_LIB}")
-endforeach (LINK_LIB ${LINK_LIBS})
+endforeach ()
diff --git a/config/cmake/ConversionTests.c b/config/cmake/ConversionTests.c
index b8946a8..082dbd4 100644
--- a/config/cmake/ConversionTests.c
+++ b/config/cmake/ConversionTests.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #ifdef H5_LDOUBLE_TO_LONG_SPECIAL_TEST
 
 #include <string.h>
diff --git a/config/cmake/FindHDF5.cmake.in b/config/cmake/FindHDF5.cmake.in
deleted file mode 100644
index fbc49f1..0000000
--- a/config/cmake/FindHDF5.cmake.in
+++ /dev/null
@@ -1,86 +0,0 @@
-#
-# To be used by projects that make use of Cmakeified hdf5- at HDF5_PACKAGE_VERSION@
-#
-
-#
-# Find the HDF5 includes and get all installed hdf5 library settings from
-# HDF5-config.cmake file : Requires a CMake compatible hdf5-1.8.5 or later 
-# for this feature to work. The following vars are set if hdf5 is found.
-#
-# HDF5_FOUND               - True if found, otherwise all other vars are undefined
-# HDF5_INCLUDE_DIR         - The include dir for main *.h files
-# HDF5_FORTRAN_INCLUDE_DIR - The include dir for fortran modules and headers
-# HDF5_VERSION_STRING      - full version (e.g. @HDF5_PACKAGE_VERSION@)
-# HDF5_VERSION_MAJOR       - major part of version (e.g. @HDF5_PACKAGE_VERSION_MAJOR@)
-# HDF5_VERSION_MINOR       - minor part (e.g. @HDF5_PACKAGE_VERSION_MINOR@)
-# 
-# The following boolean vars will be defined
-# HDF5_ENABLE_PARALLEL  - 1 if HDF5 parallel supported
-# HDF5_BUILD_FORTRAN    - 1 if HDF5 was compiled with fortran on
-# HDF5_BUILD_CPP_LIB    - 1 if HDF5 was compiled with cpp on
-# HDF5_BUILD_TOOLS      - 1 if HDF5 was compiled with tools on
-# HDF5_BUILD_HL_LIB     - 1 if HDF5 was compiled with high level on
-# HDF5_BUILD_HL_CPP_LIB - 1 if HDF5 was compiled with high level and cpp on
-# 
-# Target names that are valid (depending on enabled options)
-# will be the following
-#
-# hdf5              : HDF5 C library
-# hdf5_tools        : the tools library
-# hdf5_f90cstub     : used by Fortran to C interface
-# hdf5_fortran      : Fortran HDF5 library
-# hdf5_cpp          : HDF5 cpp interface library
-# hdf5_hl           : High Level library
-# hdf5_hl_f90cstub  : used by Fortran to C interface to High Level library
-# hdf5_hl_fortran   : Fortran High Level library
-# hdf5_hl_cpp       : High Level cpp interface library
-# 
-# To aid in finding HDF5 as part of a subproject set
-# HDF5_ROOT_DIR_HINT to the location where @HDF5_PACKAGE@@HDF_PACKAGE_EXT at -config.cmake lies
-
-include (SelectLibraryConfigurations)
-include (FindPackageHandleStandardArgs)
-
-# The HINTS option should only be used for values computed from the system.
-set (_HDF5_HINTS
-    $ENV{HOME}/.local
-    $ENV{HDF5_ROOT}
-    $ENV{HDF5_ROOT_DIR_HINT}
-)
-# Hard-coded guesses should still go in PATHS. This ensures that the user
-# environment can always override hard guesses.
-set (_HDF5_PATHS
-    $ENV{HOME}/.local
-    $ENV{HDF5_ROOT}
-    $ENV{HDF5_ROOT_DIR_HINT}
-    /usr/lib/@HDF5_PACKAGE@
-    /usr/share/@HDF5_PACKAGE@
-    /usr/local/@HDF5_PACKAGE@
-    /usr/local/@HDF5_PACKAGE@/share
-)
-
-FIND_PATH (HDF5_ROOT_DIR "@HDF5_PACKAGE@@HDF_PACKAGE_EXT at -config.cmake"
-    HINTS ${_HDF5_HINTS}
-    PATHS ${_HDF5_PATHS}
-    PATH_SUFFIXES
-        cmake/@HDF5_PACKAGE@
-        lib/cmake/@HDF5_PACKAGE@
-        share/cmake/@HDF5_PACKAGE@
-)
-
-FIND_PATH (HDF5_INCLUDE_DIRS "H5public.h"
-    HINTS ${_HDF5_HINTS}
-    PATHS ${_HDF5_PATHS}
-    PATH_SUFFIXES
-        include
-        Include
-)
-
-# For backwards compatibility we set HDF5_INCLUDE_DIR to the value of
-# HDF5_INCLUDE_DIRS
-set ( HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIRS}" )
-
-if (HDF5_INCLUDE_DIR)
-  set (HDF5_FOUND "YES")
-  include (${HDF5_ROOT_DIR}/@HDF5_PACKAGE@@HDF_PACKAGE_EXT at -config.cmake)
-endif (HDF5_INCLUDE_DIR)
diff --git a/config/cmake/FindHDFJAVA.cmake.in b/config/cmake/FindHDFJAVA.cmake.in
index b822280..ed2b8c2 100644
--- a/config/cmake/FindHDFJAVA.cmake.in
+++ b/config/cmake/FindHDFJAVA.cmake.in
@@ -1,21 +1,32 @@
 #
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+#
 # To be used by projects that make use of CMakeified hdf-java
 #
 
 #
 # Find the HDFJAVA includes and get all installed hdf-java library settings from
-# HDFJAVA-config.cmake file : Requires a CMake compatible hdf-java- at HDFJAVA_PACKAGE_VERSION@ or later 
+# HDFJAVA-config.cmake file : Requires a CMake compatible hdf-java- at HDFJAVA_PACKAGE_VERSION@ or later
 # for this feature to work. The following vars are set if hdf-java is found.
 #
 # HDFJAVA_FOUND               - True if found, otherwise all other vars are undefined
 # HDFJAVA_VERSION_STRING      - full version (e.g. @HDFJAVA_PACKAGE_VERSION@)
 # HDFJAVA_VERSION_MAJOR       - major part of version (e.g. @HDFJAVA_PACKAGE_VERSION_MAJOR@)
 # HDFJAVA_VERSION_MINOR       - minor part (e.g. @HDFJAVA_PACKAGE_VERSION_MINOR@)
-# 
+#
 # Target names that are valid (depending on enabled options)
 # will be the following
 #
-# 
+#
 # To aid in finding HDFJAVA as part of a subproject set
 # HDFJAVA_ROOT_DIR_HINT to the location where @HDFJAVA_PACKAGE@@HDF_PACKAGE_EXT at -config.cmake lies
 
@@ -60,9 +71,9 @@ if (HDFJAVA_ROOT_DIR)
   set (HDFJAVA_FOUND "YES")
   INCLUDE (${HDFJAVA_ROOT_DIR}/@HDFJAVA_PACKAGE@@HDF_PACKAGE_EXT at -config.cmake)
   set (HDFJAVA_LIBRARIES "${HDFJAVA_LIBRARY}")
-  set (HDFJAVA_INCLUDE_DIRS 
+  set (HDFJAVA_INCLUDE_DIRS
         ${HDFJAVA_LIBRARY}/jarhdf- at HDFJAVA_PACKAGE_VERSION@.jar
         ${HDFJAVA_LIBRARY}/jarhdf5- at HDFJAVA_PACKAGE_VERSION@.jar
   )
-  
-endif (HDFJAVA_ROOT_DIR)
+
+endif ()
diff --git a/config/cmake/FindJNI.cmake b/config/cmake/FindJNI.cmake
index 440a988..c82d308 100644
--- a/config/cmake/FindJNI.cmake
+++ b/config/cmake/FindJNI.cmake
@@ -1,3 +1,5 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
 #.rst:
 # FindJNI
 # -------
@@ -22,19 +24,6 @@
 #   JAVA_INCLUDE_PATH2    = the include path to jni_md.h
 #   JAVA_AWT_INCLUDE_PATH = the include path to jawt.h
 
-#=============================================================================
-# Copyright 2001-2009 Kitware, Inc.
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
 # Expand {libarch} occurences to java_libarch subdirectory(-ies) and set ${_var}
 macro(java_append_library_directories _var)
     # Determine java arch-specific library subdir
@@ -53,7 +42,7 @@ macro(java_append_library_directories _var)
         set(_java_libarch "alpha")
     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
         # Subdir is "arm" for both big-endian (arm) and little-endian (armel).
-        set(_java_libarch "arm")
+        set(_java_libarch "arm" "aarch32")
     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
         # mips* machines are bi-endian mostly so processor does not tell
         # endianess of the underlying system.
@@ -63,7 +52,7 @@ macro(java_append_library_directories _var)
     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
         set(_java_libarch "ppc64" "ppc")
     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
-        set(_java_libarch "ppc")
+        set(_java_libarch "ppc" "ppc64")
     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
         # Both flavours can run on the same processor
         set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9")
@@ -92,10 +81,14 @@ macro(java_append_library_directories _var)
         if(_path MATCHES "{libarch}")
             foreach(_libarch ${_java_libarch})
                 string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
-                list(APPEND ${_var} "${_newpath}")
+                if(EXISTS ${_newpath})
+                    list(APPEND ${_var} "${_newpath}")
+                endif()
             endforeach()
         else()
-            list(APPEND ${_var} "${_path}")
+            if(EXISTS ${_path})
+                list(APPEND ${_var} "${_path}")
+            endif()
         endif()
     endforeach()
 endmacro()
@@ -144,7 +137,6 @@ JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
   /usr/lib/java/jre/lib/{libarch}
   /usr/lib64/java/jre/lib/{libarch}
   /usr/lib/jvm/jre/lib/{libarch}
-  /usr/lib64/jvm/jre/lib/{libarch}
   /usr/local/lib/java/jre/lib/{libarch}
   /usr/local/share/java/jre/lib/{libarch}
   /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
@@ -154,13 +146,18 @@ JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
   /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
   /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch}       # can this one be removed according to #8821 ? Alex
   /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
-  /usr/lib/jvm/java-7-openjdk/jre/lib/{libarch}
-  /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch}
   /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch}        # fedora
   # Debian specific paths for default JVM
   /usr/lib/jvm/default-java/jre/lib/{libarch}
   /usr/lib/jvm/default-java/jre/lib
   /usr/lib/jvm/default-java/lib
+  # Arch Linux specific paths for default JVM
+  /usr/lib/jvm/default/jre/lib/{libarch}
+  /usr/lib/jvm/default/lib/{libarch}
+  # Ubuntu specific paths for default JVM
+  /usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
+  /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
+  /usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
   # OpenBSD specific paths for default JVM
   /usr/local/jdk-1.7.0/jre/lib/{libarch}
   /usr/local/jre-1.7.0/lib/{libarch}
@@ -191,6 +188,9 @@ list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
+)
+
+JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
   ${_JAVA_HOME}/include
   /usr/include
   /usr/java/include
@@ -199,22 +199,24 @@ list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
   /usr/lib64/java/include
   /usr/local/lib/java/include
   /usr/lib/jvm/java/include
-  /usr/lib64/jvm/java/include
   /usr/lib/jvm/java-6-sun/include
   /usr/lib/jvm/java-1.5.0-sun/include
   /usr/lib/jvm/java-6-sun-1.6.0.00/include       # can this one be removed according to #8821 ? Alex
   /usr/lib/jvm/java-6-openjdk/include
   /usr/lib/jvm/java-7-openjdk/include
-  /usr/lib/jvm/java-7-openjdk-i386/include
-  /usr/lib/jvm/java-7-openjdk-amd64/include
   /usr/lib64/jvm/java-7-openjdk/include
   /usr/lib64/jvm/java-7-openjdk-amd64/include
+  /usr/lib/jvm/java-8-openjdk-{libarch}/include  # ubuntu 15.10
+  /usr/lib/jvm/java-7-openjdk-{libarch}/include  # ubuntu 15.10
+  /usr/lib/jvm/java-6-openjdk-{libarch}/include  # ubuntu 15.10
   /usr/local/share/java/include
   /usr/lib/j2sdk1.4-sun/include
   /usr/lib/j2sdk1.5-sun/include
   /opt/sun-jdk-1.5.0.04/include
   # Debian specific path for default JVM
   /usr/lib/jvm/default-java/include
+  # Arch specific path for default JVM
+  /usr/lib/jvm/default/include
   # OpenBSD specific path for default JVM
   /usr/local/jdk-1.7.0/include
   /usr/local/jdk-1.6.0/include
@@ -290,7 +292,8 @@ find_path(JAVA_INCLUDE_PATH jni.h
   ${JAVA_AWT_INCLUDE_DIRECTORIES}
 )
 
-find_path(JAVA_INCLUDE_PATH2 jni_md.h
+find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
+  PATHS
   ${JAVA_INCLUDE_PATH}
   ${JAVA_INCLUDE_PATH}/darwin
   ${JAVA_INCLUDE_PATH}/win32
@@ -300,6 +303,7 @@ find_path(JAVA_INCLUDE_PATH2 jni_md.h
   ${JAVA_INCLUDE_PATH}/solaris
   ${JAVA_INCLUDE_PATH}/hp-ux
   ${JAVA_INCLUDE_PATH}/alpha
+  ${JAVA_INCLUDE_PATH}/aix
 )
 
 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
@@ -316,8 +320,11 @@ endif()
 
 #include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
 INCLUDE (FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI  DEFAULT_MSG  JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY
-                                                    JAVA_INCLUDE_PATH  JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI  DEFAULT_MSG  JAVA_AWT_LIBRARY
+                                                    JAVA_JVM_LIBRARY
+                                                    JAVA_INCLUDE_PATH
+                                                    JAVA_INCLUDE_PATH2
+                                                    JAVA_AWT_INCLUDE_PATH)
 
 mark_as_advanced(
   JAVA_AWT_LIBRARY
diff --git a/config/cmake/H5cxx_config.h.in b/config/cmake/H5cxx_config.h.in
index c4e1c03..82e85c6 100644
--- a/config/cmake/H5cxx_config.h.in
+++ b/config/cmake/H5cxx_config.h.in
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /* src/H5cxx_config.h.in Created manually. */
 
 /* Define if offsetof extension is present */
diff --git a/config/cmake/H5pubconf.h.in b/config/cmake/H5pubconf.h.in
index 31c5afb..8c01dba 100644
--- a/config/cmake/H5pubconf.h.in
+++ b/config/cmake/H5pubconf.h.in
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /* H5pubconf.h  Generated By CMake during the configuration */
 
 #ifndef H5_CONFIG_H_
@@ -41,17 +52,41 @@
 /* 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 Fortran C_LONG_DOUBLE is different from C_DOUBLE */
+#cmakedefine H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE @H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
 
 /* 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 if we have Fortran intrinsic C_SIZEOF */
+#cmakedefine H5_FORTRAN_HAVE_C_SIZEOF @H5_FORTRAN_HAVE_C_SIZEOF@
+
+/* Define if we have Fortran intrinsic SIZEOF */
+#cmakedefine H5_FORTRAN_HAVE_SIZEOF @H5_FORTRAN_HAVE_SIZEOF@
+
+/* Define if we have Fortran intrinsic STORAGE_SIZE */
+#cmakedefine H5_FORTRAN_HAVE_STORAGE_SIZE @H5_FORTRAN_HAVE_STORAGE_SIZE@
+
+/* Determine the size of C long double */
+#cmakedefine H5_FORTRAN_SIZEOF_LONG_DOUBLE @H5_FORTRAN_SIZEOF_LONG_DOUBLE@
+
+/* Define Fortran compiler ID */
+#cmakedefine H5_Fortran_COMPILER_ID @H5_Fortran_COMPILER_ID@
+
+/* Define valid Fortran INTEGER KINDs */
+#cmakedefine H5_H5CONFIG_F_IKIND @H5_HH5_H5CONFIG_F_NUM_RKIND5CONFIG_F_IKIND@
+
+/* Define number of valid Fortran INTEGER KINDs */
+#cmakedefine H5_H5CONFIG_F_NUM_IKIND @H5_H5CONFIG_F_NUM_IKIND@
+
+/* Define number of valid Fortran REAL KINDs */
+#cmakedefine H5_H5CONFIG_F_NUM_RKIND @H5_H5CONFIG_F_NUM_RKIND@
+
+/* Define valid Fortran REAL KINDs */
+#cmakedefine H5_H5CONFIG_F_RKIND @H5_H5CONFIG_F_RKIND@
+
+/* Define valid Fortran REAL KINDs Sizeof */
+#cmakedefine H5_H5CONFIG_F_RKIND_SIZEOF @H5_H5CONFIG_F_RKIND_SIZEOF@
 
 /* Define to 1 if you have the `alarm' function. */
 #cmakedefine H5_HAVE_ALARM @H5_HAVE_ALARM@
@@ -81,7 +116,7 @@
 /* Define to 1 if you have the `difftime' function. */
 #cmakedefine H5_HAVE_DIFFTIME @H5_HAVE_DIFFTIME@
 
-/* Define if the direct I/O virtual file driver should be compiled */
+/* Define if the direct I/O virtual file driver (VFD) should be compiled */
 #cmakedefine H5_HAVE_DIRECT @H5_HAVE_DIRECT@
 
 /* Define to 1 if you have the <dirent.h> header file. */
@@ -108,6 +143,9 @@
 /* Define if support for szip filter is enabled */
 #cmakedefine H5_HAVE_FILTER_SZIP @H5_HAVE_FILTER_SZIP@
 
+/* Determine if __float128 is available */
+#cmakedefine H5_HAVE_FLOAT128 @H5_HAVE_FLOAT128@
+
 /* Define to 1 if you have the `flock' function. */
 #cmakedefine H5_HAVE_FLOCK @H5_HAVE_FLOCK@
 
@@ -162,7 +200,7 @@
 /* Define if the compiler understands inline */
 #cmakedefine H5_HAVE_INLINE @H5_HAVE_INLINE@
 
-/* Define if library will contain instrumentation to detect correct
+/* Define if parallel library will contain instrumentation to detect correct
    optimization operation */
 #cmakedefine H5_HAVE_INSTRUMENTED_LIBRARY @H5_HAVE_INSTRUMENTED_LIBRARY@
 
@@ -199,9 +237,21 @@
 /* Define to 1 if you have the `z' library (-lz). */
 #cmakedefine H5_HAVE_LIBZ @H5_HAVE_LIBZ@
 
+/* Define to 1 if you have the `llround' function. */
+#cmakedefine H5_HAVE_LLROUND @H5_HAVE_LLROUND@
+
+/* Define to 1 if you have the `llroundf' function. */
+#cmakedefine H5_HAVE_LLROUNDF @H5_HAVE_LLROUNDF@
+
 /* Define to 1 if you have the `longjmp' function. */
 #cmakedefine H5_HAVE_LONGJMP @H5_HAVE_LONGJMP@
 
+/* Define to 1 if you have the `lround' function. */
+#cmakedefine H5_HAVE_LROUND @H5_HAVE_LROUND@
+
+/* Define to 1 if you have the `lroundf' function. */
+#cmakedefine H5_HAVE_LROUNDF @H5_HAVE_LROUNDF@
+
 /* Define to 1 if you have the `lseek64' function. */
 #cmakedefine H5_HAVE_LSEEK64 @H5_HAVE_LSEEK64@
 
@@ -232,8 +282,8 @@
 /* Define to 1 if you have the <pthread.h> header file. */
 #cmakedefine H5_HAVE_PTHREAD_H @H5_HAVE_PTHREAD_H@
 
-/* Define to 1 if you have the 'InitOnceExecuteOnce' function. */
-#cmakedefine H5_HAVE_WIN_THREADS @H5_HAVE_WIN_THREADS@
+/* Define to 1 if you have the <quadmath.h> header file. */
+#cmakedefine H5_HAVE_QUADMATH_H @H5_HAVE_QUADMATH_H@
 
 /* Define to 1 if you have the `random' function. */
 #cmakedefine H5_HAVE_RANDOM @H5_HAVE_RANDOM@
@@ -241,6 +291,12 @@
 /* Define to 1 if you have the `rand_r' function. */
 #cmakedefine H5_HAVE_RAND_R @H5_HAVE_RAND_R@
 
+/* Define to 1 if you have the `round' function. */
+#cmakedefine H5_HAVE_ROUND @H5_HAVE_ROUND@
+
+/* Define to 1 if you have the `roundf' function. */
+#cmakedefine H5_HAVE_ROUNDF @H5_HAVE_ROUNDF@
+
 /* Define to 1 if you have the `setjmp' function. */
 #cmakedefine H5_HAVE_SETJMP @H5_HAVE_SETJMP@
 
@@ -274,6 +330,9 @@
 /* Define if `struct stat' has the `st_blocks' field */
 #cmakedefine H5_HAVE_STAT_ST_BLOCKS @H5_HAVE_STAT_ST_BLOCKS@
 
+/* Define to 1 if you have the <stdbool.h> header file. */
+#cmakedefine H5_HAVE_STDBOOL_H @H5_HAVE_STDBOOL_H@
+
 /* Define to 1 if you have the <stddef.h> header file. */
 #cmakedefine H5_HAVE_STDDEF_H @H5_HAVE_STDDEF_H@
 
@@ -289,6 +348,12 @@
 /* Define to 1 if you have the `strdup' function. */
 #cmakedefine H5_HAVE_STRDUP @H5_HAVE_STRDUP@
 
+/* Define to 1 if you have the `strtoll' function. */
+#cmakedefine H5_HAVE_STRTOLL @H5_HAVE_STRTOLL@
+
+/* Define to 1 if you have the `strtoull' function. */
+#cmakedefine H5_HAVE_STRTOULL @H5_HAVE_STRTOULL@
+
 /* Define to 1 if you have the <strings.h> header file. */
 #cmakedefine H5_HAVE_STRINGS_H @H5_HAVE_STRINGS_H@
 
@@ -307,6 +372,9 @@
 /* Define to 1 if you have the `system' function. */
 #cmakedefine H5_HAVE_SYSTEM @H5_HAVE_SYSTEM@
 
+/* Define to 1 if you have the <sys/file.h> header file. */
+#cmakedefine H5_HAVE_SYS_FILE_H @H5_HAVE_SYS_FILE_H@
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #cmakedefine H5_HAVE_SYS_IOCTL_H @H5_HAVE_SYS_IOCTL_H@
 
@@ -361,6 +429,9 @@
 /* Define to 1 if you have the `waitpid' function. */
 #cmakedefine H5_HAVE_WAITPID @H5_HAVE_WAITPID@
 
+/* Define to 1 if you have the 'InitOnceExecuteOnce' function. */
+#cmakedefine H5_HAVE_WIN_THREADS @H5_HAVE_WIN_THREADS@
+
 /* Define if your system has window style path name. */
 #cmakedefine H5_HAVE_WINDOW_PATH @H5_HAVE_WINDOW_PATH@
 
@@ -401,10 +472,12 @@
    with special algorithm. */
 #cmakedefine H5_LONG_TO_LDOUBLE_SPECIAL @H5_LONG_TO_LDOUBLE_SPECIAL@
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
 #cmakedefine H5_LT_OBJDIR @H5_LT_OBJDIR@
 
+/* Define to enable internal memory allocation sanity checking. */
+/* #cmakedefine H5_MEMORY_ALLOC_SANITY_CHECK @H5_MEMORY_ALLOC_SANITY_CHECK@ ** Define in CMakeLists.txt */
+
 /* Define if the metadata trace file code is to be compiled in */
 #cmakedefine H5_METADATA_TRACE_FILE @H5_METADATA_TRACE_FILE@
 
@@ -435,9 +508,18 @@
 /* Define to the version of this package. */
 #define H5_PACKAGE_VERSION "@HDF5_PACKAGE_VERSION_STRING@"
 
+/* Determine the maximum decimal precision in C */
+#define H5_PAC_C_MAX_REAL_PRECISION @H5_PAC_C_MAX_REAL_PRECISION@
+
+/* Define Fortran Maximum Real Decimal Precision */
+#cmakedefine H5_PAC_FC_MAX_REAL_PRECISION @H5_PAC_FC_MAX_REAL_PRECISION@
+
 /* Width for printf() for type `long long' or `__int64', use `ll' */
 #cmakedefine H5_PRINTF_LL_WIDTH @H5_PRINTF_LL_WIDTH@
 
+/* The size of `bool', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_BOOL @H5_SIZEOF_BOOL@
+
 /* The size of `char', as computed by sizeof. */
 #cmakedefine H5_SIZEOF_CHAR @H5_SIZEOF_CHAR@
 
@@ -571,14 +653,14 @@
 /* The size of `unsigned', as computed by sizeof. */
 #cmakedefine H5_SIZEOF_UNSIGNED @H5_SIZEOF_UNSIGNED@
 
-/* The size of `__int64', as computed by sizeof. */
-#define H5_SIZEOF___INT64 @H5_SIZEOF___INT64@
+/* The size of `_Quad', as computed by sizeof. */
+#define H5_SIZEOF__QUAD @H5_SIZEOF__QUAD@
 
-/* Define to 1 if you have the <stdbool.h> header file. */
-#cmakedefine H5_HAVE_STDBOOL_H @H5_HAVE_STDBOOL_H@
+/* The size of `__float128', as computed by sizeof. */
+#define H5_SIZEOF___FLOAT128 @H5_SIZEOF___FLOAT128@
 
-/* The size of `bool', as computed by sizeof. */
-#cmakedefine H5_SIZEOF_BOOL @H5_SIZEOF_BOOL@
+/* The size of `__int64', as computed by sizeof. */
+#define H5_SIZEOF___INT64 @H5_SIZEOF___INT64@
 
 /* Define to 1 if you have the ANSI C header files. */
 #cmakedefine H5_STDC_HEADERS @H5_STDC_HEADERS@
diff --git a/config/cmake/HDF518_Examples.cmake.in b/config/cmake/HDF518_Examples.cmake.in
index 135dcfc..33d3a40 100644
--- a/config/cmake/HDF518_Examples.cmake.in
+++ b/config/cmake/HDF518_Examples.cmake.in
@@ -1,4 +1,15 @@
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+cmake_minimum_required(VERSION 3.2.2 FATAL_ERROR)
 ###############################################################################################################
 # This script will build and run the examples from a folder
 # Execute from a command line:
@@ -10,9 +21,9 @@ set(CTEST_DASHBOARD_ROOT ${CTEST_SCRIPT_DIRECTORY})
 
 # handle input parameters to script.
 #INSTALLDIR - HDF5-1.8 root folder
-#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
 #CTEST_SOURCE_NAME - name of source folder; HDF4Examples
-#STATIC_LIBRARIES - Default is YES
+#STATIC_ONLY - 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)
@@ -23,49 +34,61 @@ if(DEFINED CTEST_SCRIPT_ARG)
     foreach(current_var ${script_args})
         if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
             set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
-        endif()
-    endforeach()
-endif()
+        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()
+endif ()
+if(NOT DEFINED CTEST_CONFIGURATION_TYPE)
+    set(CTEST_CONFIGURATION_TYPE "Release")
+endif ()
 if(NOT DEFINED CTEST_SOURCE_NAME)
     set(CTEST_SOURCE_NAME "HDF5Examples")
-endif()
-if(NOT DEFINED STATIC_LIBRARIES)
-    set(STATICLIBRARIES "YES")
-else(NOT DEFINED STATIC_LIBRARIES)
-    set(STATICLIBRARIES "NO")
-endif()
+endif ()
+if(NOT DEFINED STATIC_ONLY)
+    set(STATICONLYLIBRARIES "YES")
+else(NOT DEFINED STATIC_ONLY)
+    set(STATICONLYLIBRARIES "NO")
+endif ()
 if(NOT DEFINED FORTRAN_LIBRARIES)
     set(FORTRANLIBRARIES "NO")
 else(NOT DEFINED FORTRAN_LIBRARIES)
     set(FORTRANLIBRARIES "YES")
-endif()
+endif ()
+if(NOT DEFINED HDF_LOCAL)
+    set(CDASH_LOCAL "NO")
+else(NOT HDF_LOCAL)
+    set(CDASH_LOCAL "YES")
+endif ()
+if(NOT DEFINED CTEST_SITE)
+    set(CTEST_SITE "local")
+endif ()
+if(NOT DEFINED CTEST_BUILD_NAME)
+    set(CTEST_BUILD_NAME "examples")
+endif ()
+set(BUILD_OPTIONS "${BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
 
 #TAR_SOURCE - name of tarfile
 #if(NOT DEFINED TAR_SOURCE)
 #  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.2.1-Source")
-#endif()
+#endif ()
 
 ###############################################################################################################
 #     Adjust the following SET Commands as needed
 ###############################################################################################################
 if(WIN32)
-  if(${STATICLIBRARIES})
+  if(${STATICONLYLIBRARIES})
     set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
-  endif()
+  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})
+  if(${STATICONLYLIBRARIES})
     set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
-  endif()
+  endif ()
   set(ENV{HDF5_DIR} "${INSTALLDIR}/share/cmake")
   set(ENV{LD_LIBRARY_PATH} "${INSTALLDIR}/lib")
   set(CTEST_BINARY_NAME ${CTEST_SOURCE_NAME}/build)
@@ -73,10 +96,13 @@ else(WIN32)
   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} -DHDF_BUILD_FORTRAN:BOOL=ON")
+else ()
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+endif ()
+if(${CDASH_LOCAL})
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCDASH_LOCAL:BOOL=ON")
+endif ()
 set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HDF_PACKAGE_EXT@")
 
 ###############################################################################################################
@@ -96,11 +122,11 @@ if(APPLE)
   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()
+  else ()
     set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
-  endif()
+  endif ()
   set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
-endif()
+endif ()
 
 #-----------------------------------------------------------------------------
 set(CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
@@ -111,16 +137,16 @@ if(CTEST_USE_TAR_SOURCE)
   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()
+  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()
+  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 ()
 endif(CTEST_USE_TAR_SOURCE)
 
 #-----------------------------------------------------------------------------
@@ -139,11 +165,11 @@ ProcessorCount(N)
 if(NOT N EQUAL 0)
   if(NOT WIN32)
     set(CTEST_BUILD_FLAGS -j${N})
-  endif()
+  endif ()
   set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
-endif()
+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}\""
+    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
 )
 
 #-----------------------------------------------------------------------------
@@ -156,21 +182,30 @@ ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
 ## NORMAL process
 ## --------------------------
 ctest_start (Experimental)
-ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}")
+ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
+if(${res} LESS 0 OR ${res} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Configure: ${res}\n")
+endif ()
 if(LOCAL_SUBMIT)
   ctest_submit (PARTS Configure Notes)
-endif()
-ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
+endif ()
+ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND APPEND RETURN_VALUE res NUMBER_ERRORS errval)
+if(${res} LESS 0 OR ${res} GREATER 0 OR ${errval} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed ${errval} Build: ${res}\n")
+endif ()
 if(LOCAL_SUBMIT)
   ctest_submit (PARTS Build)
-endif()
+endif ()
 ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+if(${res} LESS 0 OR ${res} GREATER 0)
+  file(APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Tests: ${res}\n")
+endif ()
 if(LOCAL_SUBMIT)
   ctest_submit (PARTS Test)
-endif()
-if(res GREATER 0)
+endif ()
+if(${res} LESS 0 OR ${res} GREATER 0)
   message (FATAL_ERROR "tests FAILED")
-endif()
+endif ()
 #-----------------------------------------------------------------------------
 ##############################################################################################################
 message(STATUS "DONE")
\ No newline at end of file
diff --git a/config/cmake/HDF5Macros.cmake b/config/cmake/HDF5Macros.cmake
index d88e672..f08349e 100644
--- a/config/cmake/HDF5Macros.cmake
+++ b/config/cmake/HDF5Macros.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-------------------------------------------------------------------------------
 macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
   set (LIB_OUT_NAME "${libname}")
@@ -5,21 +16,21 @@ macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
   if (${libtype} MATCHES "SHARED")
     if (ARGN)
       set (PACKAGE_SOVERSION ${ARGN})
-    else (ARGN)
+    else ()
       set (PACKAGE_SOVERSION ${HDF5_PACKAGE_SOVERSION})
-    endif (ARGN)
+    endif ()
     if (WIN32)
       set (LIBHDF_VERSION ${HDF5_PACKAGE_VERSION_MAJOR})
-    else (WIN32)
+    else ()
       set (LIBHDF_VERSION ${HDF5_PACKAGE_VERSION})
-    endif (WIN32)
+    endif ()
     set_target_properties (${libtarget} PROPERTIES VERSION ${LIBHDF_VERSION})
     if (WIN32)
         set (${LIB_OUT_NAME} "${LIB_OUT_NAME}-${PACKAGE_SOVERSION}")
-    else (WIN32)
+    else ()
         set_target_properties (${libtarget} PROPERTIES SOVERSION ${PACKAGE_SOVERSION})
-    endif (WIN32)
-  endif (${libtype} MATCHES "SHARED")
+    endif ()
+  endif ()
   HDF_SET_LIB_OPTIONS (${libtarget} ${LIB_OUT_NAME} ${libtype})
 
   #-- Apple Specific install_name for libraries
@@ -31,7 +42,7 @@ macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
           INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
           BUILD_WITH_INSTALL_RPATH ${HDF5_BUILD_WITH_INSTALL_NAME}
       )
-    endif (HDF5_BUILD_WITH_INSTALL_NAME)
+    endif ()
     if (HDF5_BUILD_FRAMEWORKS)
       if (${libtype} MATCHES "SHARED")
         # adapt target to build frameworks instead of dylibs
@@ -42,8 +53,8 @@ macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
             MACOSX_FRAMEWORK_IDENTIFIER org.hdfgroup.${libtarget}
             MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${HDF5_PACKAGE_VERSION_MAJOR}
             MACOSX_FRAMEWORK_BUNDLE_VERSION ${HDF5_PACKAGE_VERSION_MAJOR})
-      endif (${libtype} MATCHES "SHARED")
-    endif (HDF5_BUILD_FRAMEWORKS)
-  endif (APPLE)
+      endif ()
+    endif ()
+  endif ()
 
-endmacro (H5_SET_LIB_OPTIONS)
+endmacro ()
diff --git a/config/cmake/HDF5UseFortran.cmake b/config/cmake/HDF5UseFortran.cmake
index 75bd17c..3152aaa 100644
--- a/config/cmake/HDF5UseFortran.cmake
+++ b/config/cmake/HDF5UseFortran.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ## Check for non-standard extenstion quadmath.h
 
@@ -7,7 +18,7 @@ if (${C_HAVE_QUADMATH})
   set(HAVE_QUADMATH 1)
 else ()
   set(HAVE_QUADMATH 0)
-endif()
+endif ()
 
 #
 # This file provides functions for HDF5 specific Fortran support.
@@ -18,16 +29,16 @@ 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}) 
+macro (FORTRAN_RUN FUNCTION CODE RUN_RESULT_VAR1 COMPILE_RESULT_VAR RETURN)
+#
+#  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)
+    else ()
       set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
     file (WRITE
         ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler1.f90
         "${CODE}"
@@ -39,10 +50,8 @@ MACRO (FORTRAN_RUN FUNCTION CODE RUN_RESULT_VAR1 COMPILE_RESULT_VAR RETURN)
         RUN_OUTPUT_VARIABLE OUTPUT
     )
 
-	
-
     set(${RETURN} ${OUTPUT})
-	
+
     #message ( "Test result1 ${RETURN} ")
     #message ( "Test result3 ${RESULT} ")
     #message ( "Test result2 ${CMAKE_MATCH_0} ")
@@ -67,138 +76,64 @@ MACRO (FORTRAN_RUN FUNCTION CODE RUN_RESULT_VAR1 COMPILE_RESULT_VAR RETURN)
           "${OUTPUT}\n\n")
       endif ()
     endif ()
-#  endif (NOT DEFINED ${RUN_RESULT_VAR})
-ENDMACRO (FORTRAN_RUN)
+#  endif ()
+endmacro ()
+
+# Read source line beginning at the line matching Input:"START" and ending at the line matching Input:"END"
+macro (READ_SOURCE START END RETURN)
+  file (READ "${HDF5_SOURCE_DIR}/m4/aclocal_fc.f90" CODE)
+  string (REGEX MATCH "${START}[\\\t\\\n\\\r[].+]*${END}" CODE ${CODE})
+  set (RETURN "${CODE}")
+endmacro ()
 
 #-----------------------------------------------------------------------------
 #  Check to see C_LONG_DOUBLE is available
+
+READ_SOURCE("PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE" "END PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE" CODE)
 CHECK_FORTRAN_FEATURE(c_long_double
-  "
-       PROGRAM main
-         USE ISO_C_BINDING
-         REAL(KIND=C_LONG_DOUBLE) :: d
-       END PROGRAM
-  "
+  "${CODE}"
   FORTRAN_HAVE_C_LONG_DOUBLE
 )
+
 if (${FORTRAN_HAVE_C_LONG_DOUBLE})
-  set(FORTRAN_HAVE_C_LONG_DOUBLE 1)
+  set (FORTRAN_HAVE_C_LONG_DOUBLE 1)
 else ()
-  set(FORTRAN_HAVE_C_LONG_DOUBLE 0)
-endif()
+  set (FORTRAN_HAVE_C_LONG_DOUBLE 0)
+endif ()
 
 # Check to see C_LONG_DOUBLE is different from C_DOUBLE
 
+READ_SOURCE("MODULE type_mod" "END PROGRAM PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE" CODE)
 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
-  "
+  "${CODE}"
   FORTRAN_C_LONG_DOUBLE_IS_UNIQUE
 )
 if (${FORTRAN_C_LONG_DOUBLE_IS_UNIQUE})
-  set(FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 1)
+  set (FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 1)
 else ()
-  set(FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 0)
-endif()
+  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)
+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 ()
   message (FATAL_ERROR "Fortran compiler requires either intrinsic functions SIZEOF or STORAGE_SIZE")
-endif(FORTRAN_HAVE_STORAGE_SIZE)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Determine the available KINDs for REALs and INTEGERs
 #-----------------------------------------------------------------------------
 
-FORTRAN_RUN("REAL and INTEGER KINDs"
-  "      
-         PROGRAM main
-           IMPLICIT NONE
-           INTEGER :: ik, jk, k, max_decimal_prec
-           INTEGER :: num_rkinds = 1, num_ikinds = 1
-           INTEGER, DIMENSION(1:10) :: list_ikinds = -1
-           INTEGER, DIMENSION(1:10) :: list_rkinds = -1
-
-           ! Find integer KINDs
-           list_ikinds(num_ikinds)=SELECTED_INT_KIND(1)
-           DO ik = 2, 36
-              k = SELECTED_INT_KIND(ik)
-              IF(k.LT.0) EXIT
-              IF(k.GT.list_ikinds(num_ikinds))THEN
-                 num_ikinds = num_ikinds + 1
-                 list_ikinds(num_ikinds) = k
-              ENDIF
-           ENDDO
-
-           DO k = 1, num_ikinds
-              WRITE(*,'(I0)', ADVANCE='NO') list_ikinds(k)
-              IF(k.NE.num_ikinds)THEN
-                 WRITE(*,'(A)',ADVANCE='NO') ','
-              ELSE
-                 WRITE(*,'()')
-              ENDIF
-           ENDDO
-
-           ! Find real KINDs
-           list_rkinds(num_rkinds)=SELECTED_REAL_KIND(1)
-           max_decimal_prec = 1
-
-           prec: DO ik = 2, 36
-              exp: DO jk = 1, 17000
-                 k = SELECTED_REAL_KIND(ik,jk)
-                 IF(k.LT.0) EXIT exp
-                 IF(k.GT.list_rkinds(num_rkinds))THEN
-                    num_rkinds = num_rkinds + 1
-                    list_rkinds(num_rkinds) = k
-                 ENDIF
-                 max_decimal_prec = ik
-              ENDDO exp
-           ENDDO prec
-
-           DO k = 1, num_rkinds
-              WRITE(*,'(I0)', ADVANCE='NO') list_rkinds(k)
-              IF(k.NE.num_rkinds)THEN
-                 WRITE(*,'(A)',ADVANCE='NO') ','
-              ELSE
-                 WRITE(*,'()')
-              ENDIF
-           ENDDO
-
-           WRITE(*,'(I0)') max_decimal_prec
-           WRITE(*,'(I0)') num_ikinds
-           WRITE(*,'(I0)') num_rkinds
-    
-         END PROGRAM main
-  "
+READ_SOURCE ("PROGRAM FC_AVAIL_KINDS" "END PROGRAM FC_AVAIL_KINDS" CODE)
+FORTRAN_RUN ("REAL and INTEGER KINDs"
+  "${CODE}"
   XX
   YY
   PROG_OUTPUT
@@ -210,22 +145,37 @@ FORTRAN_RUN("REAL and INTEGER KINDs"
 # dnl    -- LINE 4 --  number of valid integer kinds
 # dnl    -- LINE 5 --  number of valid real kinds
 
+file (READ "${CMAKE_BINARY_DIR}/pac_fconftest.out" PROG_OUTPUT)
 # Convert the string to a list of strings by replacing the carriage return with a semicolon
-string(REGEX REPLACE "\n" ";" PROG_OUTPUT "${PROG_OUTPUT}")
+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)
+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}\}")
+# If the lists are empty then something went wrong.
+if (NOT pac_validIntKinds)
+    message (FATAL_ERROR "Failed to find available INTEGER KINDs for Fortran")
+endif ()
+if (NOT pac_validRealKinds)
+    message (FATAL_ERROR "Failed to find available REAL KINDs for Fortran")
+endif ()
+if (NOT H5_PAC_FC_MAX_REAL_PRECISION)
+    message (FATAL_ERROR "No output from Fortran decimal precision program")
+endif ()
 
-list(GET PROG_OUTPUT 3 NUM_IKIND)
-list(GET PROG_OUTPUT 4 NUM_RKIND)
+set (PAC_FC_ALL_INTEGER_KINDS "\{${pac_validIntKinds}\}")
+set (PAC_FC_ALL_REAL_KINDS "\{${pac_validRealKinds}\}")
 
-set(H5CONFIG_F_NUM_IKIND "INTEGER, PARAMETER :: num_ikinds = ${NUM_IKIND}")
-set(H5CONFIG_F_IKIND "INTEGER, DIMENSION(1:num_ikinds) :: ikind = (/${pac_validIntKinds}/)")
+list (GET PROG_OUTPUT 3 NUM_IKIND)
+list (GET PROG_OUTPUT 4 NUM_RKIND)
 
+set (PAC_FORTRAN_NUM_INTEGER_KINDS "${NUM_IKIND}")
+
+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 "....NUMBER OF INTEGER KINDS FOUND ${PAC_FORTRAN_NUM_INTEGER_KINDS}")
 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}")
@@ -236,10 +186,10 @@ message (STATUS "....MAX DECIMAL PRECISION ${H5_PAC_FC_MAX_REAL_PRECISION}")
 # **********
 # INTEGERS
 # **********
-string(REGEX REPLACE "," ";" VAR "${pac_validIntKinds}")
+string (REGEX REPLACE "," ";" VAR "${pac_validIntKinds}")
 
-foreach( KIND ${VAR} )
-  set(PROG_SRC 
+foreach (KIND ${VAR} )
+  set (PROG_SRC
     "
         PROGRAM main
         USE ISO_C_BINDING
@@ -254,32 +204,36 @@ foreach( KIND ${VAR} )
   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)
+  string (REGEX REPLACE "\n" "" PROG_OUTPUT1 "${PROG_OUTPUT1}")
+  set (pack_int_sizeof "${pack_int_sizeof} ${PROG_OUTPUT1},")
+endforeach ()
+
+if (pack_int_sizeof STREQUAL "")
+   message (FATAL_ERROR "Failed to find available INTEGER KINDs for Fortran")
+endif ()
 
+string (STRIP ${pack_int_sizeof} pack_int_sizeof)
 
 #Remove trailing comma
-string(REGEX REPLACE ",$" "" pack_int_sizeof "${pack_int_sizeof}")
+string (REGEX REPLACE ",$" "" pack_int_sizeof "${pack_int_sizeof}")
 #Remove spaces
-string(REGEX REPLACE " " "" pack_int_sizeof "${pack_int_sizeof}")
+string (REGEX REPLACE " " "" pack_int_sizeof "${pack_int_sizeof}")
 
-set(PAC_FC_ALL_INTEGER_KINDS_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}")
+message (STATUS "....FOUND SIZEOF for INTEGER KINDs ${PAC_FC_ALL_INTEGER_KINDS_SIZEOF}")
 # **********
 # REALS
 # **********
-string(REGEX REPLACE "," ";" VAR "${pac_validRealKinds}")
+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)
+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 
+foreach (KIND ${VAR} )
+  set (PROG_SRC
     "
         PROGRAM main
         USE ISO_C_BINDING
@@ -289,37 +243,42 @@ foreach( KIND ${VAR} )
         END
      "
   )
-  FORTRAN_RUN("REAL KIND SIZEOF" ${PROG_SRC}
+  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 (REGEX REPLACE "\n" "" PROG_OUTPUT1 "${PROG_OUTPUT1}")
+  set (pack_real_sizeof "${pack_real_sizeof} ${PROG_OUTPUT1},")
+endforeach ()
+
+if (pack_int_sizeof STREQUAL "")
+   message (FATAL_ERROR "Failed to find available REAL KINDs for Fortran")
+endif ()
+
 string(STRIP ${pack_real_sizeof} pack_real_sizeof)
 
 #Remove trailing comma
-string(REGEX REPLACE ",$" "" pack_real_sizeof "${pack_real_sizeof}")
+string (REGEX REPLACE ",$" "" pack_real_sizeof "${pack_real_sizeof}")
 #Remove spaces
-string(REGEX REPLACE " " "" pack_real_sizeof "${pack_real_sizeof}")
+string (REGEX REPLACE " " "" pack_real_sizeof "${pack_real_sizeof}")
 
-set(H5CONFIG_F_RKIND_SIZEOF "INTEGER, DIMENSION(1:num_rkinds) :: rkind_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}\}")
+message (STATUS "....FOUND SIZEOF for REAL KINDs \{${pack_real_sizeof}\}")
 
-set(PAC_FC_ALL_REAL_KINDS_SIZEOF "\{${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)
+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"
+FORTRAN_RUN ("SIZEOF NATIVE KINDs"
   "
        PROGRAM main
           USE ISO_C_BINDING
@@ -328,9 +287,9 @@ FORTRAN_RUN("SIZEOF NATIVE KINDs"
           REAL b
           DOUBLE PRECISION c
           WRITE(*,*) ${FC_SIZEOF_A}
-	  WRITE(*,*) kind(a)
-	  WRITE(*,*) ${FC_SIZEOF_B}
-	  WRITE(*,*) kind(b)
+    WRITE(*,*) kind(a)
+    WRITE(*,*) ${FC_SIZEOF_B}
+    WRITE(*,*) kind(b)
           WRITE(*,*) ${FC_SIZEOF_C}
           WRITE(*,*) kind(c)
        END
@@ -348,43 +307,63 @@ FORTRAN_RUN("SIZEOF NATIVE KINDs"
 # 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}")
+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)
+
+if (NOT PAC_FORTRAN_NATIVE_INTEGER_SIZEOF)
+   message (FATAL_ERROR "Failed to find SIZEOF NATIVE INTEGER KINDs for Fortran")
+endif ()
+if (NOT PAC_FORTRAN_NATIVE_REAL_SIZEOF)
+   message (FATAL_ERROR "Failed to find SIZEOF NATIVE REAL KINDs for Fortran")
+endif ()
+if (NOT PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF)
+   message (FATAL_ERROR "Failed to find SIZEOF NATIVE DOUBLE KINDs for Fortran")
+endif ()
+if (NOT PAC_FORTRAN_NATIVE_INTEGER_KIND)
+   message (FATAL_ERROR "Failed to find KIND of NATIVE INTEGER for Fortran")
+endif ()
+if (NOT PAC_FORTRAN_NATIVE_REAL_KIND)
+   message (FATAL_ERROR "Failed to find KIND of NATIVE REAL for Fortran")
+endif ()
+if (NOT PAC_FORTRAN_NATIVE_DOUBLE_KIND)
+   message (FATAL_ERROR "Failed to find KIND of NATIVE DOUBLE for Fortran")
+endif ()
 
-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})
+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 "
+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))
+     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 ()
 
-set(H5CONFIG_F_NUM_RKIND "INTEGER, PARAMETER :: num_rkinds = ${NUM_RKIND}")
+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})
+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}/)")
+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)
 
@@ -392,14 +371,14 @@ 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)
+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)
+    else ()
       set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
     file (WRITE
         ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCCompiler1.c
         ${CODE}
@@ -411,8 +390,8 @@ MACRO (C_RUN FUNCTION CODE RETURN)
         RUN_OUTPUT_VARIABLE OUTPUT
     )
 
-    set(${RETURN} ${OUTPUT})
-	
+    set (${RETURN} ${OUTPUT})
+
     #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
     #message ( "Test COMPILE_RESULT_VAR ${COMPILE_RESULT_VAR} ")
     #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
@@ -436,10 +415,10 @@ MACRO (C_RUN FUNCTION CODE RETURN)
       endif ()
     else ()
         message (FATAL_ERROR "Compilation of C ${FUNCTION} - Failed")
-    endif()
-ENDMACRO (C_RUN)
+    endif ()
+endmacro ()
 
-set(PROG_SRC 
+set (PROG_SRC
     "
 #include <float.h>
 #include <stdio.h>
@@ -457,7 +436,7 @@ set(PROG_SRC
 #define C_FLT128_DIG 0
 #endif
 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#define C_LDBL_DIG DECIMAL_DIG 
+#define C_LDBL_DIG DECIMAL_DIG
 #else
 #define C_LDBL_DIG LDBL_DIG
 #endif
@@ -466,33 +445,33 @@ set(PROG_SRC
        return 1\\\;
    }
      "
-  )
+)
 
-C_RUN("maximum decimal precision for C" ${PROG_SRC} PROG_OUTPUT)
+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}")
+string (REGEX REPLACE "\n" ";" PROG_OUTPUT "${PROG_OUTPUT}")
 
-list(GET PROG_OUTPUT 0 LDBL_DIG)
-list(GET PROG_OUTPUT 1 FLT128_DIG)
+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})
+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()
+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)
+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)
+  set (HAVE_Fortran_INTEGER_SIZEOF_16 1)
 endif ()
diff --git a/config/cmake/HDF5_Examples.cmake.in b/config/cmake/HDF5_Examples.cmake.in
index 3dce88e..6918bb3 100644
--- a/config/cmake/HDF5_Examples.cmake.in
+++ b/config/cmake/HDF5_Examples.cmake.in
@@ -1,187 +1,103 @@
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+cmake_minimum_required(VERSION 3.2.2 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})
+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
-#JAVA_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")
-else(NOT DEFINED STATIC_LIBRARIES)
-    set(STATICLIBRARIES "NO")
-endif()
-if(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "NO")
-else(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "YES")
-endif()
-if(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "NO")
-else(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "YES")
-endif()
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
+#CTEST_SOURCE_NAME - name of source folder; HDF5Examples
+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 ()
+
+###################################################################
+### Following Line is one of [Release, RelWithDebInfo, Debug] #####
+set (CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}")
+if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
+  set (CTEST_CONFIGURATION_TYPE "Release")
+endif ()
+set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCTEST_CONFIGURATION_TYPE:STRING=${CTEST_CONFIGURATION_TYPE}")
+##################################################################
+
+if (NOT DEFINED INSTALLDIR)
+  set (INSTALLDIR "@CMAKE_INSTALL_PREFIX@")
+endif ()
+
+if (NOT DEFINED CTEST_SOURCE_NAME)
+  set (CTEST_SOURCE_NAME "HDF5Examples")
+endif ()
+
+if (NOT DEFINED HDF_LOCAL)
+  set (CDASH_LOCAL "NO")
+else ()
+  set (CDASH_LOCAL "YES")
+endif ()
+if(NOT DEFINED CTEST_SITE)
+  set (CTEST_SITE "local")
+endif ()
+if (NOT DEFINED CTEST_BUILD_NAME)
+  set (CTEST_BUILD_NAME "examples")
+endif ()
+set (BUILD_OPTIONS "${BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
 
 #TAR_SOURCE - name of tarfile
-#if(NOT DEFINED TAR_SOURCE)
-#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.10.1-Source")
-#endif()
+#if (NOT DEFINED TAR_SOURCE)
+#  set (CTEST_USE_TAR_SOURCE "HDF5Examples-1.10.5-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(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
-else()
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
-endif()
-if(${JAVALIBRARIES})
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=ON")
-else()
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=OFF")
-endif()
-set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HDF_PACKAGE_EXT@")
+if (WIN32)
+  set (SITE_OS_NAME "Windows")
+  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 ()
+  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 ()
+if (${CDASH_LOCAL})
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DCDASH_LOCAL:BOOL=ON")
+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})
+if (WIN32)
+  include (${CTEST_SCRIPT_DIRECTORY}\\HDF5_Examples_options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
 else ()
-  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+  include (${CTEST_SCRIPT_DIRECTORY}/HDF5_Examples_options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
 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_Examples_options.cmake b/config/cmake/HDF5_Examples_options.cmake
new file mode 100755
index 0000000..386e99c
--- /dev/null
+++ b/config/cmake/HDF5_Examples_options.cmake
@@ -0,0 +1,59 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+#############################################################################################
+####  Change default configuration of options in config/cmake/cacheinit.cmake file        ###
+####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")                 ###
+####  DEFAULT:                                                                            ###
+####         BUILD_SHARED_LIBS:BOOL=OFF                                                   ###
+####         HDF_BUILD_C:BOOL=ON                                                          ###
+####         HDF_BUILD_CXX:BOOL=OFF                                                       ###
+####         HDF_BUILD_FORTRAN:BOOL=OFF                                                   ###
+####         HDF_BUILD_JAVA:BOOL=OFF                                                      ###
+####         BUILD_TESTING:BOOL=OFF                                                       ###
+####         HDF_ENABLE_PARALLEL:BOOL=OFF                                                 ###
+####         HDF_ENABLE_THREADSAFE:BOOL=OFF                                               ###
+#############################################################################################
+
+### uncomment/comment and change the following lines for other configuration options
+### build with shared libraries
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=ON")
+
+#############################################################################################
+####      languages       ####
+### disable C builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_C:BOOL=OFF")
+
+### enable C++ builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_CXX:BOOL=ON")
+
+### enable Fortran builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
+
+### enable JAVA builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=ON")
+
+#############################################################################################
+### enable parallel program builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_ENABLE_PARALLEL:BOOL=ON")
+
+
+#############################################################################################
+### enable threadsafe program builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_ENABLE_THREADSAFE:BOOL=ON")
+
+
+#############################################################################################
+### enable test program builds, requires reference files in testfiles subdirectory
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_TESTING:BOOL=ON")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCOMPARE_TESTING:BOOL=ON")
+
+#############################################################################################
diff --git a/config/cmake/HDF5_Process_Flex_Files.cmake b/config/cmake/HDF5_Process_Flex_Files.cmake
index 2306e93..2595c39 100644
--- a/config/cmake/HDF5_Process_Flex_Files.cmake
+++ b/config/cmake/HDF5_Process_Flex_Files.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # post process flex/bison files
 
 message (STATUS "File: ${GEN_DIR} ${FILE_PARSE} ${FILE_ANALYZE}")
@@ -49,7 +60,7 @@ if (FILE_PARSE)
     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)
+endif ()
 
 if (FILE_ANALYZE)
   # Add code that disables warnings in the flex/bison-generated code.
@@ -81,4 +92,4 @@ if (FILE_ANALYZE)
     ")
     file (APPEND ${FILE_ANALYZE} "${TEST_STREAM}")
     message (STATUS "processed pragma in ${FILE_ANALYZE}")
-endif (FILE_ANALYZE)
+endif ()
diff --git a/config/cmake/HDFCompilerFlags.cmake b/config/cmake/HDFCompilerFlags.cmake
index 665db32..5f71f33 100644
--- a/config/cmake/HDFCompilerFlags.cmake
+++ b/config/cmake/HDFCompilerFlags.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-----------------------------------------------------------------------------
 # Compiler specific flags : Shouldn't there be compiler tests for these
 #-----------------------------------------------------------------------------
@@ -12,21 +23,21 @@ if (CMAKE_COMPILER_IS_GNUCC)
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0)
       set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstdarg-opt")
     endif ()
-  endif (CMAKE_BUILD_TYPE MATCHES Debug)
-endif (CMAKE_COMPILER_IS_GNUCC)
-if (CMAKE_COMPILER_IS_GNUCXX)
+  endif ()
+endif ()
+if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_LOADED)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
     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)
+  else ()
     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 ()
-  endif (CMAKE_BUILD_TYPE MATCHES Debug)
-endif (CMAKE_COMPILER_IS_GNUCXX)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to disable compiler warnings
@@ -41,22 +52,22 @@ if (HDF5_DISABLE_COMPILER_WARNINGS)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /w")
     string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w")
-  endif (MSVC)
+  endif ()
   if (WIN32)
     add_definitions (-D_CRT_SECURE_NO_WARNINGS)
-  endif (WIN32)
+  endif ()
   # Borland uses -w- to suppress warnings.
   if (BORLAND)
     set (HDF5_WARNINGS_BLOCKED 1)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
-  endif (BORLAND)
+  endif ()
 
   # Most compilers use -w to suppress warnings.
   if (NOT HDF5_WARNINGS_BLOCKED)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
-  endif (NOT HDF5_WARNINGS_BLOCKED)
-endif (HDF5_DISABLE_COMPILER_WARNINGS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # CDash is configured to only allow 3000 warnings, so
@@ -64,10 +75,22 @@ endif (HDF5_DISABLE_COMPILER_WARNINGS)
 #-----------------------------------------------------------------------------
 if (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
   if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
-    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline")
-  else (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+    set (CMAKE_C_FLAGS_5 "${CMAKE_C_FLAGS_5} -Wcast-qual")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs")
+  else ()
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -erroff=%none -DBSD_COMP")
-  endif (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+  endif ()
+
+    #-----------------------------------------------------------------------------
+    # Option to allow the user to enable developer warnings
+    #-----------------------------------------------------------------------------
+    option (HDF5_ENABLE_DEV_WARNINGS "Enable HDF5 developer group warnings" OFF)
+    if (HDF5_ENABLE_DEV_WARNINGS)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winline -Waggregate-return")
+    else ()
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter -Wno-inline -Wno-aggregate-return")
+    endif ()
+
     # Append warning flags
     # Don't use the '-Wtraditional' flag, we're way past having K&R C code
     # set (H5_CFLAGS "${H5_CFLAGS} -Wtraditional")
@@ -83,75 +106,102 @@ if (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
     set (H5_CFLAGS1 "${H5_CFLAGS1} -Wfloat-equal -Wmissing-format-attribute")
 
     # Append warning flags from gcc-3.2* case
-    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wmissing-noreturn -Wpacked -Wdisabled-optimization")
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wpacked -Wdisabled-optimization")
+    if (HDF5_ENABLE_DEV_WARNINGS)
+      set (H5_CFLAGS1 "${H5_CFLAGS1} -Wmissing-noreturn")
+    else ()
+      set (H5_CFLAGS1 "${H5_CFLAGS1} -Wno-missing-noreturn")
+    endif ()
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
-    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wformat=2")
-
-    # The "unreachable code" warning appears to be reliable now...
-    # (this warning was removed in gcc 4.5+)
-    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
-      set (H5_CFLAGS1 "${H5_CFLAGS1} -Wunreachable-code")
-    endif()
+    set (H5_CFLAGS1_5 "${H5_CFLAGS1_5} -Wformat=2")
 
     # Append warning flags from gcc-3.3* case
     set (H5_CFLAGS1 "${H5_CFLAGS1} -Wendif-labels")
 
     # Append warning flags from gcc-3.4* case
-    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch")
+    set (H5_CFLAGS1 "${H5_CFLAGS1} -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch")
 
     # Append more extra warning flags that only gcc4.0+ know about
     set (H5_CFLAGS2 "${H5_CFLAGS2} -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros")
 
     # Append more extra warning flags that only gcc 4.1+ know about
-    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wunsafe-loop-optimizations -Wc++-compat")
+    set (H5_CFLAGS2_5 "${H5_CFLAGS2_5} -Wunsafe-loop-optimizations")
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wc++-compat")
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wstrict-overflow")
+    set (H5_CFLAGS2_5 "${H5_CFLAGS2_5} -Wstrict-overflow")
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wno-strict-overflow")
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
     # Technically, variable-length arrays are part of the C99 standard, but
     #   we should approach them a bit cautiously... -QAK
-    set (H5_CFLAGS3 "${H5_CFLAGS3} -Wlogical-op -Wlarger-than=2048 -Wvla")
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wlogical-op -Wlarger-than=2048 -Wvla")
 
     # Append more extra warning flags that only gcc 4.4+ know about
-    set (H5_CFLAGS4 "${H5_CFLAGS4} -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat")
+    set (H5_CFLAGS2 "${H5_CFLAGS2} -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat")
 
     # Append more extra warning flags that only gcc 4.5+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5)
-      set (H5_CFLAGS4 "${H5_CFLAGS4} -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants")
-    endif()
+      set (H5_CFLAGS2_5 "${H5_CFLAGS2_5} -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants")
+      set (H5_CFLAGS2 "${H5_CFLAGS2} -Wjump-misses-init -Wunsuffixed-float-constants")
+    endif ()
 
     # Append more extra warning flags that only gcc 4.6+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6)
-      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines")
-    endif()
+      set (H5_CFLAGS2 "${H5_CFLAGS2} -Wdouble-promotion -Wtrampolines")
+      if (HDF5_ENABLE_DEV_WARNINGS)
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wsuggest-attribute=const")
+      else ()
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wno-suggest-attribute=const")
+      endif ()
+    endif ()
+
+    # The "unreachable code" warning appears to be reliable now...
+    # (this warning was removed in gcc 4.5+)
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
+      set (H5_CFLAGS2 "${H5_CFLAGS2} -Wunreachable-code")
+    endif ()
 
     # Append more extra warning flags that only gcc 4.7+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
-      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn")
-    endif()
+      set (H5_CFLAGS2 "${H5_CFLAGS2} -Wstack-usage=8192 -Wvector-operation-performance")
+      if (HDF5_ENABLE_DEV_WARNINGS)
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn")
+      else ()
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn")
+      endif ()
+    endif ()
 
     # Append more extra warning flags that only gcc 4.8+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8)
-      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wsuggest-attribute=format")
-    endif()
+      if (HDF5_ENABLE_DEV_WARNINGS)
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wsuggest-attribute=format")
+      else ()
+        set (H5_CFLAGS2 "${H5_CFLAGS2} -Wno-suggest-attribute=format")
+      endif ()
+    endif ()
 
     # Append more extra warning flags that only gcc 4.9+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9)
-      set (H5_CFLAGS5 "${H5_CFLAGS5} -Wdate-time -Wopenmp-simd")
-    endif()
+      set (H5_CFLAGS2 "${H5_CFLAGS2} -Wdate-time -Wopenmp-simd")
+    endif ()
 
     # (There was no release of gcc 5.0)
 
     # Append more extra warning flags that only gcc 5.1+ know about
     if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.1)
-      set (H5_CFLAGS6 "${H5_CFLAGS6} -Warray-bounds=2 -Wc99-c11-compat")
-    endif()
+      set (H5_CFLAGS3 "${H5_CFLAGS3} -Warray-bounds=2 -Wc99-c11-compat")
+    endif ()
+
+    # Append more extra warning flags that only gcc 6.x+ know about
+    if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.0)
+      set (H5_CFLAGS4 "${H5_CFLAGS4} -Wnull-dereference -Wunused-const-variable -Wduplicated-cond -Whsa")
+    endif ()
 
-endif (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable all warnings
@@ -159,16 +209,23 @@ endif (NOT MSVC AND CMAKE_COMPILER_IS_GNUCC)
 option (HDF5_ENABLE_ALL_WARNINGS "Enable all warnings" OFF)
 if (HDF5_ENABLE_ALL_WARNINGS)
   if (MSVC)
-    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall")
-    string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall")
-  else (MSVC)
+    if (HDF5_ENABLE_DEV_WARNINGS)
+      string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall /wd4668")
+      string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall /wd4668")
+    else ()
+      string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
+      string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+    endif ()
+  else ()
     if (CMAKE_COMPILER_IS_GNUCC)
-      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic ${H5_CFLAGS1} ${H5_CFLAGS2} ${H5_CFLAGS3} ${H5_CFLAGS4}")
-    endif (CMAKE_COMPILER_IS_GNUCC)
-  endif (MSVC)
-endif (HDF5_ENABLE_ALL_WARNINGS)
+      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic ${H5_CFLAGS1} ${H5_CFLAGS2}")
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable warnings by groups
@@ -180,12 +237,12 @@ if (HDF5_ENABLE_GROUPZERO_WARNINGS)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W1")
     string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W1")
-  else (MSVC)
+  else ()
     if (CMAKE_COMPILER_IS_GNUCC)
       set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic")
-    endif (CMAKE_COMPILER_IS_GNUCC)
-  endif (MSVC)
-endif (HDF5_ENABLE_GROUPZERO_WARNINGS)
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable warnings by groups
@@ -197,10 +254,10 @@ if (HDF5_ENABLE_GROUPONE_WARNINGS)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W2")
     string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2")
-  else (MSVC)
+  else ()
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS1}")
-  endif (MSVC)
-endif (HDF5_ENABLE_GROUPONE_WARNINGS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable warnings by groups
@@ -212,10 +269,10 @@ if (HDF5_ENABLE_GROUPTWO_WARNINGS)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
     string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
-  else (MSVC)
+  else ()
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS2}")
-  endif (MSVC)
-endif (HDF5_ENABLE_GROUPTWO_WARNINGS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable warnings by groups
@@ -227,10 +284,10 @@ if (HDF5_ENABLE_GROUPTHREE_WARNINGS)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
     string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
-  else (MSVC)
+  else ()
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS3}")
-  endif (MSVC)
-endif (HDF5_ENABLE_GROUPTHREE_WARNINGS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Option to allow the user to enable warnings by groups
@@ -239,28 +296,8 @@ option (HDF5_ENABLE_GROUPFOUR_WARNINGS "Enable group four warnings" OFF)
 if (HDF5_ENABLE_GROUPFOUR_WARNINGS)
   if (NOT MSVC)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS4}")
-  endif (NOT MSVC)
-endif (HDF5_ENABLE_GROUPFOUR_WARNINGS)
-
-#-----------------------------------------------------------------------------
-# Option to allow the user to enable warnings by groups
-#-----------------------------------------------------------------------------
-option (HDF5_ENABLE_GROUPFIVE_WARNINGS "Enable group five warnings" OFF)
-if (HDF5_ENABLE_GROUPFIVE_WARNINGS)
-  if (NOT MSVC)
-    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS5}")
-  endif (NOT MSVC)
-endif (HDF5_ENABLE_GROUPFIVE_WARNINGS)
-
-#-----------------------------------------------------------------------------
-# Option to allow the user to enable warnings by groups
-#-----------------------------------------------------------------------------
-option (HDF5_ENABLE_GROUPSIX_WARNINGS "Enable group six warnings" OFF)
-if (HDF5_ENABLE_GROUPSIX_WARNINGS)
-  if (NOT MSVC)
-    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${H5_CFLAGS6}")
-  endif (NOT MSVC)
-endif (HDF5_ENABLE_GROUPSIX_WARNINGS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # This is in here to help some of the GCC based IDES like Eclipse
@@ -268,7 +305,7 @@ endif (HDF5_ENABLE_GROUPSIX_WARNINGS)
 #-----------------------------------------------------------------------------
 if (CMAKE_COMPILER_IS_GNUCC)
   set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")
-endif (CMAKE_COMPILER_IS_GNUCC)
-if (CMAKE_COMPILER_IS_GNUCXX)
+endif ()
+if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_LOADED)
   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
-endif (CMAKE_COMPILER_IS_GNUCXX)
+endif ()
diff --git a/config/cmake/README.txt.cmake.in b/config/cmake/README.txt.cmake.in
index 4c4ffd5..1d6ef45 100644
--- a/config/cmake/README.txt.cmake.in
+++ b/config/cmake/README.txt.cmake.in
@@ -40,10 +40,10 @@ To test the installation with the examples;
     The default installation folder is defined as "@CMAKE_INSTALL_PREFIX@".
         It can be changed with the INSTALLDIR script option.
     The default ctest configuration is defined as "Release". It can be changed
-        with the CTEST_BUILD_CONFIGURATION script option. Note that this must
+        with the CTEST_CONFIGURATION_TYPE script option. Note that this must
         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".
+        Shared libraries can be used with the STATICONLYLIBRARIES script option set to "NO".
     Other options can be changed by editing the HDF5_Examples.cmake file.
 
     If the defaults are okay, execute from this directory:
diff --git a/config/cmake/UseJava.cmake b/config/cmake/UseJava.cmake
index 9b2b1e0..3e74d4f 100644
--- a/config/cmake/UseJava.cmake
+++ b/config/cmake/UseJava.cmake
@@ -1,3 +1,5 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
 #.rst:
 # UseJava
 # -------
@@ -169,7 +171,7 @@
 #
 # ::
 #
-#    The add_jar() functions sets some target properties. You can get these
+#    The add_jar() function sets some target properties. You can get these
 #    properties with the
 #       get_property(TARGET <target_name> PROPERTY <propery_name>)
 #    command.
@@ -217,6 +219,19 @@
 # This command installs the TARGET_NAME files to the given DESTINATION.
 # It should be called in the same scope as add_jar() or it will fail.
 #
+# Target Properties:
+#
+# ::
+#
+#    The install_jar() function sets the INSTALL_DESTINATION target property
+#    on jars so installed. This property holds the DESTINATION as described
+#    above, and is used by install_jar_exports(). You can get this property
+#    with the
+#       get_property(TARGET <target_name> PROPERTY INSTALL_DESTINATION)
+#    command.
+#
+#
+#
 # ::
 #
 #  install_jni_symlink(target_name destination)
@@ -228,6 +243,24 @@
 #
 # ::
 #
+#  install_jar_exports(TARGETS jar1 [jar2 ...]
+#                      FILE export_filename
+#                      DESTINATION destination [COMPONENT component])
+#
+# This command installs a target export file export_filename for the named jar
+# targets to the given DESTINATION. Its function is similar to that of
+# install(EXPORTS).
+#
+# ::
+#
+#  export_jars(TARGETS jar1 [jar2 ...]
+#              FILE export_filename)
+#
+# This command writes a target export file export_filename for the named jar
+# targets. Its function is similar to that of export().
+#
+# ::
+#
 #  create_javadoc(<VAR>
 #                 PACKAGES pkg1 [pkg2 ...]
 #                 [SOURCEPATH <sourcepath>]
@@ -324,7 +357,7 @@
 # that allow your Java and C code to interact.
 #
 # There are two main signatures for create_javah.  The first signature
-# returns generated files throught variable specified by GENERATED_FILES option:
+# returns generated files through variable specified by GENERATED_FILES option:
 #
 # ::
 #
@@ -369,34 +402,41 @@
 #    Sets the directory where the header files will be generated. Same behavior as option
 #    '-d' of javah tool. If not specified, ${CMAKE_CURRENT_BINARY_DIR} is used as output directory.
 
-#=============================================================================
-# Copyright 2013 OpenGamma Ltd. <graham at opengamma.com>
-# Copyright 2010-2011 Andreas schneider <asn at redhat.com>
-# Copyright 2010-2013 Kitware, Inc.
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
 include(CMakeParseArguments)
 
 function (__java_copy_file src dest comment)
     add_custom_command(
         OUTPUT  ${dest}
-        COMMAND cmake -E copy_if_different
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different
         ARGS    ${src}
                 ${dest}
         DEPENDS ${src}
         COMMENT ${comment})
 endfunction ()
 
+function(__java_lcat VAR)
+    foreach(_line ${ARGN})
+        set(${VAR} "${${VAR}}${_line}\n")
+    endforeach()
+
+    set(${VAR} "${${VAR}}" PARENT_SCOPE)
+endfunction()
+
+function(__java_export_jar VAR TARGET PATH)
+    get_target_property(_jarpath ${TARGET} JAR_FILE)
+    get_filename_component(_jarname ${_jarpath} NAME)
+    __java_lcat(${VAR}
+      "# Create imported target ${TARGET}"
+      "add_custom_target(${TARGET})"
+      "set_target_properties(${TARGET} PROPERTIES"
+      "  JAR_FILE \"${PATH}/${_jarname}\")"
+      ""
+    )
+    set(${VAR} "${${VAR}}" PARENT_SCOPE)
+endfunction()
+
 # define helper scripts
+set(_JAVA_EXPORT_TARGETS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/javaTargets.cmake.in)
 set(_JAVA_CLASS_FILELIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaClassFilelist.cmake)
 set(_JAVA_SYMLINK_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaSymlinks.cmake)
 
@@ -435,6 +475,8 @@ function(add_jar _TARGET_NAME)
 
     if (NOT DEFINED _add_jar_OUTPUT_DIR)
         set(_add_jar_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
+    else()
+        get_filename_component(_add_jar_OUTPUT_DIR ${_add_jar_OUTPUT_DIR} ABSOLUTE)
     endif()
 
     if (_add_jar_ENTRY_POINT)
@@ -554,11 +596,6 @@ function(add_jar _TARGET_NAME)
         endif ()
     endforeach()
 
-    # create an empty java_class_filelist
-    if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist)
-        file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
-    endif()
-
     if (_JAVA_COMPILE_FILES OR _JAVA_COMPILE_FILELISTS)
         set (_JAVA_SOURCES_FILELISTS)
 
@@ -598,6 +635,11 @@ function(add_jar _TARGET_NAME)
             DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
         )
+    else ()
+        # create an empty java_class_filelist
+        if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist)
+            file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
+        endif()
     endif ()
 
     # create the jar file
@@ -716,6 +758,13 @@ function(INSTALL_JAR _TARGET_NAME)
         PROPERTY
             INSTALL_FILES
     )
+    set_property(
+        TARGET
+            ${_TARGET_NAME}
+        PROPERTY
+            INSTALL_DESTINATION
+            ${_DESTINATION}
+    )
 
     if (__FILES)
         install(
@@ -1201,7 +1250,7 @@ function(create_javadoc _target)
             else ()
                 set(_overview ${_overview}:${_path})
             endif ()
-        endforeach()
+        endforeach ()
         set(_javadoc_options ${_javadoc_options} -overview ${_overview})
     endif ()
 
@@ -1348,3 +1397,94 @@ function (create_javah)
       set (${_create_javah_GENERATED_FILES} ${_output_files} PARENT_SCOPE)
     endif()
 endfunction()
+
+function(export_jars)
+    # Parse and validate arguments
+    cmake_parse_arguments(_export_jars
+      ""
+      "FILE"
+      "TARGETS"
+      ${ARGN}
+    )
+    if (NOT _export_jars_FILE)
+      message(SEND_ERROR "export_jars: FILE must be specified.")
+    endif()
+    if (NOT _export_jars_TARGETS)
+      message(SEND_ERROR "export_jars: TARGETS must be specified.")
+    endif()
+
+    # Set content of generated exports file
+    string(REPLACE ";" " " __targets__ "${_export_jars_TARGETS}")
+    set(__targetdefs__ "")
+    foreach(_target ${_export_jars_TARGETS})
+        get_target_property(_jarpath ${_target} JAR_FILE)
+        get_filename_component(_jarpath ${_jarpath} PATH)
+        __java_export_jar(__targetdefs__ ${_target} "${_jarpath}")
+    endforeach()
+
+    # Generate exports file
+    configure_file(
+      ${_JAVA_EXPORT_TARGETS_SCRIPT}
+      ${_export_jars_FILE}
+      @ONLY
+    )
+endfunction()
+
+function(install_jar_exports)
+    # Parse and validate arguments
+    cmake_parse_arguments(_install_jar_exports
+      ""
+      "FILE;DESTINATION;COMPONENT"
+      "TARGETS"
+      ${ARGN}
+    )
+    if (NOT _install_jar_exports_FILE)
+      message(SEND_ERROR "install_jar_exports: FILE must be specified.")
+    endif()
+    if (NOT _install_jar_exports_DESTINATION)
+      message(SEND_ERROR "install_jar_exports: DESTINATION must be specified.")
+    endif()
+    if (NOT _install_jar_exports_TARGETS)
+      message(SEND_ERROR "install_jar_exports: TARGETS must be specified.")
+    endif()
+
+    if (_install_jar_exports_COMPONENT)
+      set (_COMPONENT COMPONENT ${_install_jar_exports_COMPONENT})
+    endif()
+
+    # Determine relative path from installed export file to install prefix
+    if(IS_ABSOLUTE ${_install_jar_exports_DESTINATION})
+      file(RELATIVE_PATH _relpath
+        ${_install_jar_exports_DESTINATION}
+        ${CMAKE_INSTALL_PREFIX}
+      )
+    else()
+      file(RELATIVE_PATH _relpath
+        ${CMAKE_INSTALL_PREFIX}/${_install_jar_exports_DESTINATION}
+        ${CMAKE_INSTALL_PREFIX}
+      )
+    endif()
+
+    # Set up unique location for generated exports file
+    string(SHA256 _hash "${_install_jar_exports_DESTINATION}")
+    set(_tmpdir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/JavaExports/${_hash})
+
+    # Set content of generated exports file
+    string(REPLACE ";" " " __targets__ "${_install_jar_exports_TARGETS}")
+    set(__targetdefs__ "set(_prefix \${CMAKE_CURRENT_LIST_DIR}/${_relpath})\n\n")
+    foreach(_target ${_install_jar_exports_TARGETS})
+        get_target_property(_dir ${_target} INSTALL_DESTINATION)
+        __java_export_jar(__targetdefs__ ${_target} "\${_prefix}/${_dir}")
+    endforeach()
+    __java_lcat(__targetdefs__ "\nunset(_prefix)")
+
+    # Generate and install exports file
+    configure_file(
+      ${_JAVA_EXPORT_TARGETS_SCRIPT}
+      ${_tmpdir}/${_install_jar_exports_FILE}
+      @ONLY
+    )
+    install(FILES ${_tmpdir}/${_install_jar_exports_FILE}
+            DESTINATION ${_install_jar_exports_DESTINATION}
+            ${_COMPONENT})
+endfunction()
diff --git a/config/cmake/UseJavaClassFilelist.cmake b/config/cmake/UseJavaClassFilelist.cmake
index e8e6f01..4420550 100644
--- a/config/cmake/UseJavaClassFilelist.cmake
+++ b/config/cmake/UseJavaClassFilelist.cmake
@@ -1,3 +1,5 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
 #.rst:
 # UseJavaClassFilelist
 # --------------------
@@ -10,19 +12,6 @@
 # a jar file.  This avoids including cmake files which get created in
 # the binary directory.
 
-#=============================================================================
-# Copyright 2010-2011 Andreas schneider <asn at redhat.com>
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
 if (CMAKE_JAVA_CLASS_OUTPUT_PATH)
     if (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}")
 
diff --git a/config/cmake/UseJavaSymlinks.cmake b/config/cmake/UseJavaSymlinks.cmake
index 90ffdd5..cd73348 100644
--- a/config/cmake/UseJavaSymlinks.cmake
+++ b/config/cmake/UseJavaSymlinks.cmake
@@ -1,3 +1,5 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
 #.rst:
 # UseJavaSymlinks
 # ---------------
@@ -8,19 +10,6 @@
 #
 # Helper script for UseJava.cmake
 
-#=============================================================================
-# Copyright 2010-2011 Andreas schneider <asn at redhat.com>
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
 if (UNIX AND _JAVA_TARGET_OUTPUT_LINK)
     if (_JAVA_TARGET_OUTPUT_NAME)
         find_program(LN_EXECUTABLE
diff --git a/config/cmake/UserMacros/Windows_MT.cmake b/config/cmake/UserMacros/Windows_MT.cmake
index a54f22c..b6cc513 100644
--- a/config/cmake/UserMacros/Windows_MT.cmake
+++ b/config/cmake/UserMacros/Windows_MT.cmake
@@ -1,16 +1,27 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 ########################################################
 #  Include file for user options
 ########################################################
 
 # To use this option, copy both the macro and option code
-# into the root UserMacros.cmake file. 
+# into the root UserMacros.cmake file.
 # OR add an include to the root UserMacros.cmake file:
 # INCLUDE(path_to_file/WINDOWS_MT.cmake)
 
 #-----------------------------------------------------------------------------
 # Option to Build with Static CRT libraries on Windows
 #-------------------------------------------------------------------------------
-MACRO (TARGET_STATIC_CRT_FLAGS)
+macro (TARGET_STATIC_CRT_FLAGS)
   if (MSVC AND NOT BUILD_SHARED_LIBS)
     foreach (flag_var
         CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
@@ -19,23 +30,22 @@ MACRO (TARGET_STATIC_CRT_FLAGS)
         CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
       if (${flag_var} MATCHES "/MD")
         string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
-      endif (${flag_var} MATCHES "/MD")
-    endforeach (flag_var)
+      endif ()
+    endforeach ()
     foreach (flag_var
         CMAKE_Fortran_FLAGS CMAKE_Fortran_FLAGS_DEBUG CMAKE_Fortran_FLAGS_RELEASE
         CMAKE_Fortran_FLAGS_MINSIZEREL CMAKE_Fortran_FLAGS_RELWITHDEBINFO)
       if (${flag_var} MATCHES "/libs:dll")
         string (REGEX REPLACE "/libs:dll" "/libs:static" ${flag_var} "${${flag_var}}")
-      endif (${flag_var} MATCHES "/libs:dll")
-    endforeach (flag_var)
+      endif ()
+    endforeach ()
     set (WIN_COMPILE_FLAGS "")
     set (WIN_LINK_FLAGS "/NODEFAULTLIB:MSVCRT")
-  endif (MSVC AND NOT BUILD_SHARED_LIBS)
-ENDMACRO (TARGET_STATIC_CRT_FLAGS)
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 option (BUILD_STATIC_CRT_LIBS "Build With Static CRT Libraries" OFF)
 if (BUILD_STATIC_CRT_LIBS)
   TARGET_STATIC_CRT_FLAGS ()
-endif (BUILD_STATIC_CRT_LIBS)
- 
\ No newline at end of file
+endif ()
diff --git a/config/cmake/cacheinit.cmake b/config/cmake/cacheinit.cmake
index 1ff381a..04a648b 100644
--- a/config/cmake/cacheinit.cmake
+++ b/config/cmake/cacheinit.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # This is the CMakeCache file.
 
 ########################
@@ -22,7 +33,7 @@ set (HDF5_ENABLE_SZIP_ENCODING ON CACHE BOOL "Use SZip Encoding" FORCE)
 
 set (HDF5_ENABLE_HSIZET ON CACHE BOOL "Enable datasets larger than memory" FORCE)
 
-set (HDF5_ENABLE_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
+set (ALLOW_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
 
 set (HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable deprecated public API symbols" FORCE)
 
@@ -42,6 +53,8 @@ set (HDF5_MEMORY_ALLOC_SANITY_CHECK OFF CACHE BOOL "Indicate that internal memor
 
 set (HDF5_DISABLE_COMPILER_WARNINGS OFF CACHE BOOL "Disable compiler warnings" FORCE)
 
+set (HDF5_ENABLE_ALL_WARNINGS ON CACHE BOOL "Enable all warnings" FORCE)
+
 set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs." FORCE)
 
 set (HDF5_USE_16_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.6.x API by default" FORCE)
@@ -56,8 +69,8 @@ set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libr
 
 set (HDF5_NO_PACKAGES OFF CACHE BOOL "CPACK - Disable packaging" FORCE)
 
-set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO SVN TGZ)" FORCE)
-set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO SVN TGZ)
+set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO GIT SVN TGZ)" FORCE)
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
 
 set (ZLIB_TGZ_NAME "ZLib.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE)
 
diff --git a/config/cmake/hdf5-config-version.cmake.in b/config/cmake/hdf5-config-version.cmake.in
index 5911fa7..8e16725 100644
--- a/config/cmake/hdf5-config-version.cmake.in
+++ b/config/cmake/hdf5-config-version.cmake.in
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-----------------------------------------------------------------------------
 # HDF5 Version file for install directory
 #-----------------------------------------------------------------------------
@@ -12,36 +23,36 @@ set (PACKAGE_VERSION "@HDF5_VERSION_STRING@")
 
 if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" )
   set(PACKAGE_VERSION_COMPATIBLE FALSE)
-else()
+else ()
   if ("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "@H5_VERS_MAJOR@")
-    
+
     # exact match for version @H5_VERS_MAJOR at .@H5_VERS_MINOR@
     if ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
-    
+
       # compatible with any version @H5_VERS_MAJOR at .@H5_VERS_MINOR at .x
-      set (PACKAGE_VERSION_COMPATIBLE TRUE) 
-        
+      set (PACKAGE_VERSION_COMPATIBLE TRUE)
+
       if ("${PACKAGE_FIND_VERSION_PATCH}" STREQUAL "@H5_VERS_RELEASE@")
         set (PACKAGE_VERSION_EXACT TRUE)
-   
+
         if ("${PACKAGE_FIND_VERSION_TWEAK}" STREQUAL "@H5_VERS_SUBRELEASE@")
           # not using this yet
-        endif ("${PACKAGE_FIND_VERSION_TWEAK}" STREQUAL "@H5_VERS_SUBRELEASE@")
-      endif ("${PACKAGE_FIND_VERSION_PATCH}" STREQUAL "@H5_VERS_RELEASE@")
-    else ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
-      set (PACKAGE_VERSION_COMPATIBLE FALSE) 
-    endif ("${PACKAGE_FIND_VERSION_MINOR}" STREQUAL "@H5_VERS_MINOR@")
-  endif ("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "@H5_VERS_MAJOR@")
-endif()
+        endif ()
+      endif ()
+    else ()
+      set (PACKAGE_VERSION_COMPATIBLE FALSE)
+    endif ()
+  endif ()
+endif ()
 
 # if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
 if("${CMAKE_SIZEOF_VOID_P}"  STREQUAL ""  OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "")
    return()
-endif()
+endif ()
 
 # check that the installed version has the same 32/64bit-ness as the one which is currently searching:
 if(NOT "${CMAKE_SIZEOF_VOID_P}" STREQUAL "@CMAKE_SIZEOF_VOID_P@")
   math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8")
   set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
   set(PACKAGE_VERSION_UNSUITABLE TRUE)
-endif()
+endif ()
diff --git a/config/cmake/hdf5-config.cmake.in b/config/cmake/hdf5-config.cmake.in
index 3f95d76..c54391f 100644
--- a/config/cmake/hdf5-config.cmake.in
+++ b/config/cmake/hdf5-config.cmake.in
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-----------------------------------------------------------------------------
 # HDF5 Config file for compiling against hdf5 build/install directory
 #-----------------------------------------------------------------------------
@@ -50,7 +61,7 @@ if (${HDF5_PACKAGE_NAME}_BUILD_JAVA)
   )
   set (${HDF5_PACKAGE_NAME}_JAVA_LIBRARY "@PACKAGE_CURRENT_BUILD_DIR@/lib")
   set (${HDF5_PACKAGE_NAME}_JAVA_LIBRARIES "${${HDF5_PACKAGE_NAME}_JAVA_LIBRARY}")
-endif()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Directories
@@ -157,12 +168,12 @@ foreach (libtype IN LISTS ${HDF5_PACKAGE_NAME}_LIB_TYPE)
         else ()
           set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 1)
           string(TOUPPER ${HDF5_PACKAGE_NAME}_${comp}_${libtype}_LIBRARY COMP_LIBRARY)
-          set (${COMP_LIBRARY} ${${COMP_LIBRARY}} ${hdf5_comp2}-${libtype} ${hdf5_comp}-${libtype})
+          set (${COMP_LIBRARY} ${${COMP_LIBRARY}} @HDF5_PACKAGE@::${hdf5_comp2}-${libtype} @HDF5_PACKAGE@::${hdf5_comp}-${libtype})
         endif ()
       else ()
         set (${HDF5_PACKAGE_NAME}_${libtype}_${comp}_FOUND 1)
         string(TOUPPER ${HDF5_PACKAGE_NAME}_${comp}_${libtype}_LIBRARY COMP_LIBRARY)
-        set (${COMP_LIBRARY} ${${COMP_LIBRARY}} ${hdf5_comp}-${libtype})
+        set (${COMP_LIBRARY} ${${COMP_LIBRARY}} @HDF5_PACKAGE@::${hdf5_comp}-${libtype})
       endif ()
     endif ()
   endforeach ()
diff --git a/config/cmake/jrunTest.cmake b/config/cmake/jrunTest.cmake
index 59f4c7b..7af0590 100644
--- a/config/cmake/jrunTest.cmake
+++ b/config/cmake/jrunTest.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # runTest.cmake executes a command and captures the output in a file. File is then compared
 # against a reference file. Exit status of command can also be compared.
 cmake_policy(SET CMP0007 NEW)
@@ -5,44 +16,53 @@ cmake_policy(SET CMP0007 NEW)
 # arguments checking
 if (NOT TEST_TESTER)
   message (FATAL_ERROR "Require TEST_TESTER to be defined")
-endif (NOT TEST_TESTER)
+endif ()
 if (NOT TEST_PROGRAM)
   message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
-endif (NOT TEST_PROGRAM)
+endif ()
 if (NOT TEST_LIBRARY_DIRECTORY)
   message (STATUS "Require TEST_LIBRARY_DIRECTORY to be defined")
-endif (NOT TEST_LIBRARY_DIRECTORY)
+endif ()
 if (NOT TEST_FOLDER)
   message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
+endif ()
 if (NOT TEST_OUTPUT)
   message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
-endif (NOT TEST_OUTPUT)
+endif ()
 if (NOT TEST_CLASSPATH)
   message (STATUS "Require TEST_CLASSPATH to be defined")
-endif (NOT TEST_CLASSPATH)
+endif ()
 if (NOT TEST_REFERENCE)
   message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
-endif (NOT TEST_REFERENCE)
+endif ()
 
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT})
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT})
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+endif ()
+
+# if there is not an error reference file add the error output to the stdout file
 if (NOT TEST_ERRREF)
   if (NOT SKIP_APPEND)
     # append error file since skip was not defined
     set (ERROR_APPEND 1)
-  endif(NOT SKIP_APPEND)
-endif (NOT TEST_ERRREF)
+  endif ()
+endif ()
 
 if (NOT TEST_LOG_LEVEL)
   set (LOG_LEVEL "info")
-else (NOT TEST_LOG_LEVEL)
+else ()
   set (LOG_LEVEL "${TEST_LOG_LEVEL}")
-endif (NOT TEST_LOG_LEVEL)
+endif ()
 
 message (STATUS "COMMAND: ${TEST_TESTER} -Xmx1024M -Dorg.slf4j.simpleLogger.defaultLog=${LOG_LEVEL} -Djava.library.path=\"${TEST_LIBRARY_DIRECTORY}\" -cp \"${TEST_CLASSPATH}\" ${TEST_ARGS} ${TEST_PROGRAM} ${ARGN}")
 
 if (WIN32 AND NOT MINGW)
   set (ENV{PATH} "$ENV{PATH}\\;${TEST_LIBRARY_DIRECTORY}")
-endif (WIN32 AND NOT MINGW)
+endif ()
 
 # run the test program, capture the stdout/stderr and the result var
 execute_process (
@@ -60,29 +80,31 @@ execute_process (
 
 message (STATUS "COMMAND Result: ${TEST_RESULT}")
 
+# if the .err file exists and ERRROR_APPEND is enabled
 if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
   if (TEST_MASK_FILE)
     STRING(REGEX REPLACE "CurrentDir is [^\n]+\n" "CurrentDir is (dir name)\n" TEST_STREAM "${TEST_STREAM}")
-  endif (TEST_MASK_FILE)
+  endif ()
 
   if (NOT ERROR_APPEND)
     # append error output to the stdout output file
     file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}")
-  else (NOT ERROR_APPEND)
+  else ()
     # write back to original .err file
     file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-  endif (NOT ERROR_APPEND)
-endif (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  endif ()
+endif ()
 
+# if the output file or the .err file needs to mask out error stack info
 if (TEST_MASK_ERROR)
   if (NOT TEST_ERRREF)
     # the error stack has been appended to the output file
     file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  else (NOT TEST_ERRREF)
+  else ()
     # the error stack remains in the .err file
     file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
-  endif (NOT TEST_ERRREF)
+  endif ()
   string (REGEX REPLACE "Time:[^\n]+\n" "Time:  XXXX\n" TEST_STREAM "${TEST_STREAM}")
   string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}")
   string (REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}")
@@ -94,16 +116,16 @@ if (TEST_MASK_ERROR)
   # write back the changes to the original files
   if (NOT TEST_ERRREF)
     file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-  else (NOT TEST_ERRREF)
+  else ()
     file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}")
-  endif (NOT TEST_ERRREF)
-endif (TEST_MASK_ERROR)
+  endif ()
+endif ()
 
 # if the return value is !=0 bail out
 if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
   message (STATUS "ERROR OUTPUT: ${TEST_STREAM}")
   message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != 0.\n${TEST_ERROR}")
-endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+endif ()
 
 message (STATUS "COMMAND Error: ${TEST_ERROR}")
 
@@ -112,7 +134,7 @@ if (NOT TEST_SKIP_COMPARE)
   if (WIN32 AND NOT MINGW)
     file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
     file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}")
-  endif (WIN32 AND NOT MINGW)
+  endif ()
 
   # now compare the output with the reference
   execute_process (
@@ -120,42 +142,49 @@ if (NOT TEST_SKIP_COMPARE)
       RESULT_VARIABLE TEST_RESULT
   )
   if (NOT ${TEST_RESULT} STREQUAL 0)
-  set (TEST_RESULT 0)
-  file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
-  list (LENGTH test_act len_act)
-  file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref)
-  list (LENGTH test_ref len_ref)
-  if (NOT ${len_act} STREQUAL "0")
-    MATH (EXPR _FP_LEN "${len_ref} - 1")
-    foreach (line RANGE 0 ${_FP_LEN})
-      list (GET test_act ${line} str_act)
-      list (GET test_ref ${line} str_ref)
-      if (NOT "${str_act}" STREQUAL "${str_ref}")
-        if (NOT "${str_act}" STREQUAL "")
-          set (TEST_RESULT 1)
-          message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
-         endif (NOT "${str_act}" STREQUAL "")
-      endif (NOT "${str_act}" STREQUAL "${str_ref}")
-    endforeach (line RANGE 0 ${_FP_LEN})
-  endif (NOT ${len_act} STREQUAL "0")
-  if (NOT ${len_act} STREQUAL ${len_ref})
-    set (TEST_RESULT 1)
-  endif (NOT ${len_act} STREQUAL ${len_ref})
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
+    set (TEST_RESULT 0)
+    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
+    list (LENGTH test_act len_act)
+    file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref)
+    list (LENGTH test_ref len_ref)
+    if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+      math (EXPR _FP_LEN "${len_ref} - 1")
+      foreach (line RANGE 0 ${_FP_LEN})
+        list (GET test_act ${line} str_act)
+        list (GET test_ref ${line} str_ref)
+        if (NOT "${str_act}" STREQUAL "${str_ref}")
+          if (NOT "${str_act}" STREQUAL "")
+            set (TEST_RESULT 1)
+            message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+          endif ()
+        endif ()
+      endforeach ()
+    else ()
+      if (${len_act} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty")
+      endif ()
+      if (${len_ref} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty")
+      endif ()
+    endif ()
+    if (NOT ${len_act} STREQUAL ${len_ref})
+      set (TEST_RESULT 1)
+    endif ()
+  endif ()
 
   message (STATUS "COMPARE Result: ${TEST_RESULT}")
 
   # again, if return value is !=0 scream and shout
   if (NOT ${TEST_RESULT} STREQUAL 0)
     message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}")
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
+  endif ()
 
   # now compare the .err file with the error reference, if supplied
   if (TEST_ERRREF)
     if (WIN32 AND NOT MINGW)
       file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM)
       file (WRITE ${TEST_FOLDER}/${TEST_ERRREF} "${TEST_STREAM}")
-    endif (WIN32 AND NOT MINGW)
+    endif ()
 
     # now compare the error output with the error reference
     execute_process (
@@ -163,38 +192,45 @@ if (NOT TEST_SKIP_COMPARE)
         RESULT_VARIABLE TEST_RESULT
     )
     if (NOT ${TEST_RESULT} STREQUAL 0)
-    set (TEST_RESULT 0)
-    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act)
-    list (LENGTH test_act len_act)
-    file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref)
-    list (LENGTH test_ref len_ref)
-    MATH (EXPR _FP_LEN "${len_ref} - 1")
-    if (NOT ${len_act} STREQUAL "0")
-      MATH (EXPR _FP_LEN "${len_ref} - 1")
-      foreach (line RANGE 0 ${_FP_LEN})
-        list (GET test_act ${line} str_act)
-        list (GET test_ref ${line} str_ref)
-        if (NOT "${str_act}" STREQUAL "${str_ref}")
-          if (NOT "${str_act}" STREQUAL "")
-            set (TEST_RESULT 1)
-            message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
-           endif (NOT "${str_act}" STREQUAL "")
-        endif (NOT "${str_act}" STREQUAL "${str_ref}")
-      endforeach (line RANGE 0 ${_FP_LEN})
-    endif (NOT ${len_act} STREQUAL "0")
-    if (NOT ${len_act} STREQUAL ${len_ref})
-      set (TEST_RESULT 1)
-    endif (NOT ${len_act} STREQUAL ${len_ref})
-    endif (NOT ${TEST_RESULT} STREQUAL 0)
+      set (TEST_RESULT 0)
+      file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act)
+      list (LENGTH test_act len_act)
+      file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref)
+      list (LENGTH test_ref len_ref)
+      math (EXPR _FP_LEN "${len_ref} - 1")
+      if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+        math (EXPR _FP_LEN "${len_ref} - 1")
+        foreach (line RANGE 0 ${_FP_LEN})
+          list (GET test_act ${line} str_act)
+          list (GET test_ref ${line} str_ref)
+          if (NOT "${str_act}" STREQUAL "${str_ref}")
+            if (NOT "${str_act}" STREQUAL "")
+              set (TEST_RESULT 1)
+              message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+            endif ()
+          endif ()
+        endforeach ()
+      else ()
+        if (${len_act} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty")
+        endif ()
+        if (${len_ref} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty")
+        endif ()
+      endif()
+      if (NOT ${len_act} STREQUAL ${len_ref})
+        set (TEST_RESULT 1)
+      endif ()
+    endif ()
 
     message (STATUS "COMPARE Result: ${TEST_RESULT}")
 
     # again, if return value is !=0 scream and shout
     if (NOT ${TEST_RESULT} STREQUAL 0)
       message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}")
-    endif (NOT ${TEST_RESULT} STREQUAL 0)
-  endif (TEST_ERRREF)
-endif (NOT TEST_SKIP_COMPARE)
+    endif ()
+  endif ()
+endif ()
 
 if (TEST_GREP_COMPARE)
   # now grep the output with the reference
@@ -205,7 +241,7 @@ if (TEST_GREP_COMPARE)
   string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_RESULT)
   if (${TEST_RESULT} STREQUAL "0")
     message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}")
-  endif (${TEST_RESULT} STREQUAL "0")
+  endif ()
 
   string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM})
   if (${TEST_EXPECT} STREQUAL "1")
@@ -213,9 +249,9 @@ if (TEST_GREP_COMPARE)
     string (LENGTH "${TEST_MATCH}" TEST_RESULT)
     if (NOT ${TEST_RESULT} STREQUAL "0")
       message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}")
-    endif (NOT ${TEST_RESULT} STREQUAL "0")
-  endif (${TEST_EXPECT} STREQUAL "0")
-endif (TEST_GREP_COMPARE)
+    endif ()
+  endif ()
+endif ()
 
 # everything went fine...
 message ("${TEST_PROGRAM} Passed")
diff --git a/config/cmake/mccacheinit.cmake b/config/cmake/mccacheinit.cmake
index 261cb92..1f60a01 100644
--- a/config/cmake/mccacheinit.cmake
+++ b/config/cmake/mccacheinit.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # This is the CMakeCache file.
 
 ########################
@@ -6,7 +17,7 @@
 
 set (CMAKE_INSTALL_FRAMEWORK_PREFIX "Library/Frameworks" CACHE STRING "Frameworks installation directory" FORCE)
 
-set (HDF5_GENERATE_HEADERS OFF CACHE BOOL "Rebuild Generated Files" FORCE)
+set (HDF5_GENERATE_HEADERS ON CACHE BOOL "Rebuild Generated Files" FORCE)
 
 set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries" FORCE)
 
@@ -34,7 +45,7 @@ set (HDF5_ENABLE_SZIP_ENCODING ON CACHE BOOL "Use SZip Encoding" FORCE)
 
 set (HDF5_ENABLE_HSIZET ON CACHE BOOL "Enable datasets larger than memory" FORCE)
 
-set (HDF5_ENABLE_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
+set (ALLOW_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
 
 set (HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable deprecated public API symbols" FORCE)
 
@@ -66,8 +77,8 @@ set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libr
 
 set (HDF5_NO_PACKAGES ON CACHE BOOL "CPACK - Disable packaging" FORCE)
 
-set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO SVN TGZ)" FORCE)
-set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO SVN TGZ)
+set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO GIT SVN TGZ)" FORCE)
+set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
 
 set (ZLIB_TGZ_NAME "ZLib.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE)
 
@@ -75,7 +86,7 @@ set (SZIP_TGZ_NAME "SZip.tar.gz" CACHE STRING "Use SZip from compressed file" FO
 
 set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Debug" FORCE)
 
-set (CTEST_BUILD_CONFIGURATION "Debug" CACHE STRING "Build Debug" FORCE)
+set (CTEST_CONFIGURATION_TYPE "Debug" CACHE STRING "Build Debug" FORCE)
 
 set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE)
 
diff --git a/config/cmake/scripts/CTestScript.cmake b/config/cmake/scripts/CTestScript.cmake
index 403eedd..3cb9a5e 100755
--- a/config/cmake/scripts/CTestScript.cmake
+++ b/config/cmake/scripts/CTestScript.cmake
@@ -1,4 +1,15 @@
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+cmake_minimum_required (VERSION 3.2.2 FATAL_ERROR)
 ########################################################
 # This dashboard is maintained by The HDF Group
 # For any comments please contact cdashhelp at hdfgroup.org
@@ -7,240 +18,224 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 # -----------------------------------------------------------
 # -- Get environment
 # -----------------------------------------------------------
-if(NOT SITE_OS_NAME)
+if (NOT SITE_OS_NAME)
   ## machine name not provided - attempt to discover with uname
   ## -- 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)
+  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(osname -s)
-  getuname(osrel  -r)
-  getuname(cpu    -m)
-  message(STATUS "Dashboard script uname output: ${osname}-${osrel}-${cpu}\n")
+  getuname (osname -s)
+  getuname (osrel  -r)
+  getuname (cpu    -m)
+  message (STATUS "Dashboard script uname output: ${osname}-${osrel}-${cpu}\n")
 
-  set(CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}")
-  if(USE_AUTOTOOLS)
-    set(CTEST_BUILD_NAME  "AT-${CTEST_BUILD_NAME}")
-  endif()
-  if(SITE_BUILDNAME_SUFFIX)
-    set(CTEST_BUILD_NAME  "${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX}")
-  endif()
-  set(BUILD_OPTIONS "${ADD_BUILD_OPTIONS}")
-else(NOT SITE_OS_NAME)
+  set (CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}")
+  if (SITE_BUILDNAME_SUFFIX)
+    set (CTEST_BUILD_NAME  "${SITE_BUILDNAME_SUFFIX}-${CTEST_BUILD_NAME}")
+  endif ()
+  set (BUILD_OPTIONS "${ADD_BUILD_OPTIONS}")
+else ()
   ## machine name provided
   ## --------------------------
-  if(CMAKE_HOST_UNIX)
-    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_OS_BITS}-${SITE_COMPILER_NAME}-${SITE_COMPILER_VERSION}")
-  else()
-    set(CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_COMPILER_NAME}")
-  endif()
-  if(SITE_BUILDNAME_SUFFIX)
-    set(CTEST_BUILD_NAME ${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX})
-  endif()
-  set(BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
-endif(NOT SITE_OS_NAME)
+  if (CMAKE_HOST_UNIX)
+    set (CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_OS_BITS}-${SITE_COMPILER_NAME}-${SITE_COMPILER_VERSION}")
+  else ()
+    set (CTEST_BUILD_NAME "${SITE_OS_NAME}-${SITE_OS_VERSION}-${SITE_COMPILER_NAME}")
+  endif ()
+  if (SITE_BUILDNAME_SUFFIX)
+    set (CTEST_BUILD_NAME "${CTEST_BUILD_NAME}-${SITE_BUILDNAME_SUFFIX}")
+  endif ()
+  set (BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
+endif ()
 
 #-----------------------------------------------------------------------------
 # MAC machines need special option
 #-----------------------------------------------------------------------------
-if(APPLE)
+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}")
+  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(NOT NO_MAC_FORTRAN)
-    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
-  endif(NOT NO_MAC_FORTRAN)
+  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} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
+  endif ()
 
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
-endif(APPLE)
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
+endif ()
 
 #-----------------------------------------------------------------------------
-set(NEED_REPOSITORY_CHECKOUT 0)
-set(CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
-if(CTEST_USE_TAR_SOURCE)
+set (NEED_REPOSITORY_CHECKOUT 0)
+set (CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
+if (CTEST_USE_TAR_SOURCE)
   ## Uncompress source if tar file provided
   ## --------------------------
-  if(WIN32)
-    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} x ${CTEST_DASHBOARD_ROOT}\\${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_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}")
-    message(FATAL_ERROR "error: extract of ${CTEST_USE_TAR_SOURCE} failed")
-  endif()
+  if (WIN32)
+    message (STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} x ${CTEST_DASHBOARD_ROOT}\\${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_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 ()
 
-  file(RENAME ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE} ${CTEST_SOURCE_DIRECTORY})
-  set(LOCAL_SKIP_UPDATE "TRUE")
-else(CTEST_USE_TAR_SOURCE)
-  if(LOCAL_UPDATE)
-    if(CTEST_USE_GIT_SOURCE)
-      find_program(CTEST_GIT_COMMAND NAMES git git.cmd)
-      set(CTEST_GIT_UPDATE_OPTIONS)
+  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_USE_TAR_SOURCE} failed")
+  endif ()
 
-      if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
-        set(NEED_REPOSITORY_CHECKOUT 1)
-      endif()
+  file (RENAME ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE} ${CTEST_SOURCE_DIRECTORY})
+  set (LOCAL_SKIP_UPDATE "TRUE")
+else ()
+  if (LOCAL_UPDATE)
+    if (CTEST_USE_GIT_SOURCE)
+      find_program (CTEST_GIT_COMMAND NAMES git git.cmd)
+      set (CTEST_GIT_UPDATE_OPTIONS)
 
-       if(${NEED_REPOSITORY_CHECKOUT})
-        if(REPOSITORY_BRANCH)
-          set(GITUpdateOptions "clone \"${REPOSITORY_URL}\" --branch  \"${REPOSITORY_BRANCH}\" \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
-        else()
-          set(GITUpdateOptions "clone \"${REPOSITORY_URL}\" \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
-        endif()
-        set(CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} ${GITUpdateOptions}")
-      else()
-        set(GITUpdateOptions "pull")
-      endif()
-      set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
-    else(CTEST_USE_GIT_SOURCE)
+      if (NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
+        set (NEED_REPOSITORY_CHECKOUT 1)
+      endif ()
+
+      if (${NEED_REPOSITORY_CHECKOUT})
+        if (REPOSITORY_BRANCH)
+          set (CTEST_GIT_options "clone \"${REPOSITORY_URL}\" --branch  \"${REPOSITORY_BRANCH}\" --single-branch \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
+        else ()
+          set (CTEST_GIT_options "clone \"${REPOSITORY_URL}\" \"${CTEST_SOURCE_DIRECTORY}\" --recurse-submodules")
+        endif ()
+        set (CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} ${CTEST_GIT_options}")
+      else ()
+        set (CTEST_GIT_options "pull")
+      endif ()
+      set (CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
+    else ()
       ## --------------------------
       ## use subversion to get source
       #-----------------------------------------------------------------------------
       ## cygwin does not handle the find_package() call
       ## --------------------------
-      set(CTEST_UPDATE_COMMAND "SVNCommand")
-      if(NOT SITE_CYGWIN})
+      set (CTEST_UPDATE_COMMAND "SVNCommand")
+      if (NOT SITE_CYGWIN})
         find_package (Subversion)
-        set(CTEST_SVN_COMMAND "${Subversion_SVN_EXECUTABLE}")
-        set(CTEST_UPDATE_COMMAND "${Subversion_SVN_EXECUTABLE}")
-      else()
-        set(CTEST_SVN_COMMAND "/usr/bin/svn")
-        set(CTEST_UPDATE_COMMAND "/usr/bin/svn")
-      endif()
+        set (CTEST_SVN_COMMAND "${Subversion_SVN_EXECUTABLE}")
+        set (CTEST_UPDATE_COMMAND "${Subversion_SVN_EXECUTABLE}")
+      else ()
+        set (CTEST_SVN_COMMAND "/usr/bin/svn")
+        set (CTEST_UPDATE_COMMAND "/usr/bin/svn")
+      endif ()
 
-      if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
-        set(NEED_REPOSITORY_CHECKOUT 1)
-      endif()
+      if (NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
+        set (NEED_REPOSITORY_CHECKOUT 1)
+      endif ()
 
-      if(NOT CTEST_REPO_VERSION)
-        set(CTEST_REPO_VERSION "HEAD")
-      endif()
-      if(${NEED_REPOSITORY_CHECKOUT})
-        set(CTEST_CHECKOUT_COMMAND
-            "${CTEST_SVN_COMMAND} co ${REPOSITORY_URL} \"${CTEST_SOURCE_DIRECTORY}\" -r ${CTEST_REPO_VERSION}")
-      else(${NEED_REPOSITORY_CHECKOUT})
-        if(CTEST_REPO_VERSION)
-          set(CTEST_SVN_UPDATE_OPTIONS "-r ${CTEST_REPO_VERSION}")
-        endif()
-      endif(${NEED_REPOSITORY_CHECKOUT})
-    endif(CTEST_USE_GIT_SOURCE)
-  endif(LOCAL_UPDATE)
-endif(CTEST_USE_TAR_SOURCE)
+      if (NOT CTEST_REPO_VERSION)
+        set (CTEST_REPO_VERSION "HEAD")
+      endif ()
+      if (${NEED_REPOSITORY_CHECKOUT})
+        set (CTEST_CHECKOUT_COMMAND
+            "\"${CTEST_SVN_COMMAND}\" co ${REPOSITORY_URL} \"${CTEST_SOURCE_DIRECTORY}\" -r ${CTEST_REPO_VERSION}")
+      else ()
+        if (CTEST_REPO_VERSION)
+          set (CTEST_SVN_UPDATE_OPTIONS "-r ${CTEST_REPO_VERSION}")
+        endif ()
+      endif ()
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 ## Clear the build directory
 ## --------------------------
-set(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
-if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}")
-  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
-else()
-  ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
-endif()
+set (CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
+if (NOT EXISTS "${CTEST_BINARY_DIRECTORY}")
+  file (MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+else ()
+  ctest_empty_binary_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()
+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 ()
 
 #-----------------------------------------------------------------------------
 # Send the main script as a note.
-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()
- 
+list (APPEND CTEST_NOTES_FILES
+    "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
+    "${CMAKE_CURRENT_LIST_FILE}"
+    "${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake"
+)
+
 #-----------------------------------------------------------------------------
 # Check for required variables.
 # --------------------------
-foreach(req
+foreach (req
     CTEST_CMAKE_GENERATOR
     CTEST_SITE
     CTEST_BUILD_NAME
   )
-  if(NOT DEFINED ${req})
-    message(FATAL_ERROR "The containing script must set ${req}")
-  endif()
-endforeach(req)
+  if (NOT DEFINED ${req})
+    message (FATAL_ERROR "The containing script must set ${req}")
+  endif ()
+endforeach ()
 
 #-----------------------------------------------------------------------------
 # Initialize the CTEST commands
 #------------------------------
-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()
+if(CMAKE_GENERATOR_TOOLSET)
+  set(CTEST_CONFIGURE_TOOLSET  "-T${CMAKE_GENERATOR_TOOLSET}")
+else ()
+  set(CTEST_CONFIGURE_TOOLSET  "")
 endif()
- 
+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_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_CONFIGURE_TOOLSET}\" \"${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_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_CONFIGURE_TOOLSET}\" \"${CTEST_SOURCE_DIRECTORY}\""
+  )
+endif ()
+
 #-----------------------------------------------------------------------------
 ## -- set output to english
-set($ENV{LC_MESSAGES}  "en_EN")
+set ($ENV{LC_MESSAGES}  "en_EN")
 
 # Print summary information.
-foreach(v
+foreach (v
     CTEST_SITE
     CTEST_BUILD_NAME
     CTEST_SOURCE_DIRECTORY
     CTEST_BINARY_DIRECTORY
     CTEST_CMAKE_GENERATOR
-    CTEST_BUILD_CONFIGURATION
+    CTEST_CONFIGURATION_TYPE
     CTEST_GIT_COMMAND
     CTEST_CHECKOUT_COMMAND
     CTEST_CONFIGURE_COMMAND
     CTEST_SCRIPT_DIRECTORY
     CTEST_USE_LAUNCHERS
   )
-  set(vars "${vars}  ${v}=[${${v}}]\n")
-endforeach(v)
-message(STATUS "Dashboard script configuration:\n${vars}\n")
+  set (vars "${vars}  ${v}=[${${v}}]\n")
+endforeach ()
+message (STATUS "Dashboard script configuration:\n${vars}\n")
 
 #-----------------------------------------------------------------------------
 #-----------------------------------------------------------------------------
@@ -252,57 +247,63 @@ message(STATUS "Dashboard script configuration:\n${vars}\n")
   ## -- LOCAL_COVERAGE_TEST executes code coverage process
   ## --------------------------
   ctest_start (${MODEL} TRACK ${MODEL})
-  if(LOCAL_UPDATE)
+  if (LOCAL_UPDATE)
     ctest_update (SOURCE "${CTEST_SOURCE_DIRECTORY}")
-  endif()
-  configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+  endif ()
+  configure_file (${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
   ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
-  ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}")
-  if(LOCAL_SUBMIT)
+  ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
+  if (LOCAL_SUBMIT)
     ctest_submit (PARTS Update Configure Notes)
-  endif()
+  endif ()
+  if (${res} LESS 0 OR ${res} GREATER 0)
+    file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Configure: ${res}\n")
+  endif ()
 
-  ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
-  if(LOCAL_SUBMIT)
+  ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND RETURN_VALUE res NUMBER_ERRORS errval)
+  if (LOCAL_SUBMIT)
     ctest_submit (PARTS Build)
-  endif()
+  endif ()
+  if (${res} LESS 0 OR ${res} GREATER 0 OR ${errval} GREATER 0)
+    file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed ${errval} Build: ${res}\n")
+  endif ()
 
-  if(NOT LOCAL_SKIP_TEST)
-    if(NOT LOCAL_MEMCHECK_TEST)
+  if (NOT LOCAL_SKIP_TEST)
+    if (NOT LOCAL_MEMCHECK_TEST)
       ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
-      if(LOCAL_SUBMIT)
+      if (LOCAL_SUBMIT)
         ctest_submit (PARTS Test)
-      endif()
-      if(res GREATER 0)
-        message(FATAL_ERROR "Failed tests: ${res}\n")
-      endif()
-    else()
+      endif ()
+      if (${res} LESS 0 OR ${res} GREATER 0)
+        file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed Tests: ${res}\n")
+      endif ()
+    else ()
       ctest_memcheck (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args})
-      if(LOCAL_SUBMIT)
+      if (LOCAL_SUBMIT)
         ctest_submit (PARTS MemCheck)
-      endif(LOCAL_SUBMIT)
-    endif()
-    if(LOCAL_COVERAGE_TEST)
+      endif ()
+    endif ()
+    if (LOCAL_COVERAGE_TEST)
       ctest_coverage (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
-      if(LOCAL_SUBMIT)
+      if (LOCAL_SUBMIT)
         ctest_submit (PARTS Coverage)
-      endif()
-    endif()
-  endif(NOT LOCAL_SKIP_TEST)
+      endif ()
+    endif ()
+  endif ()
 
-  if(NOT LOCAL_MEMCHECK_TEST AND NOT LOCAL_NO_PACKAGE)
+  if (NOT LOCAL_MEMCHECK_TEST AND NOT LOCAL_NO_PACKAGE AND NOT LOCAL_SKIP_BUILD)
     ##-----------------------------------------------
     ## Package the product
     ##-----------------------------------------------
-    execute_process(COMMAND cpack -C ${CTEST_BUILD_CONFIGURATION} -V
+    execute_process (COMMAND cpack -C ${CTEST_CONFIGURATION_TYPE} -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}")
-    if(cpackResult GREATER 0)
-      message (FATAL_ERROR "Failed packaging: ${cpackResult}\n")
-    endif()
-  endif(NOT LOCAL_MEMCHECK_TEST AND NOT LOCAL_NO_PACKAGE)
+    file (WRITE ${CTEST_BINARY_DIRECTORY}/cpack.log "${cpackLog.err}" "${cpackLog}")
+    if (cpackResult GREATER 0)
+      file (APPEND ${CTEST_SCRIPT_DIRECTORY}/FailedCTest.txt "Failed packaging: ${cpackResult}:${cpackLog.err} \n")
+    endif ()
+  endif ()
 #-----------------------------------------------------------------------------
diff --git a/config/cmake/scripts/HDF5config.cmake b/config/cmake/scripts/HDF5config.cmake
index 1503f6c..eed87bf 100755
--- a/config/cmake/scripts/HDF5config.cmake
+++ b/config/cmake/scripts/HDF5config.cmake
@@ -1,10 +1,21 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #############################################################################################
 ### ${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 hdf5.log          ###
+### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201264 -C Release -VV -O hdf5.log         ###
 #############################################################################################
 
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+cmake_minimum_required (VERSION 3.2.2 FATAL_ERROR)
 ############################################################################
 # Usage:
 #     ctest -S HDF5config.cmake,OPTION=VALUE -C Release -VV -O test.log
@@ -19,256 +30,261 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 #            VS201264 * Visual Studio 11 2012 Win64
 #
 #     INSTALLDIR  -  root folder where hdf5 is installed
-#     CTEST_BUILD_CONFIGURATION  - Release, Debug, etc
+#     CTEST_CONFIGURATION_TYPE  - Release, Debug, etc
 #     CTEST_SOURCE_NAME  -  source folder
-#     STATIC_LIBRARIES  -  Build/use static libraries
+#     STATIC_ONLY  -  Build/use static libraries
 #     FORTRAN_LIBRARIES -  Build/use fortran libraries
 #     JAVA_LIBRARIES -  Build/use java libraries
 #     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
 ##############################################################################
 
-set(CTEST_SOURCE_VERSION 1.10.0)
-set(CTEST_SOURCE_VERSEXT "-pre1")
+set (CTEST_SOURCE_VERSION "1.10.1")
+set (CTEST_SOURCE_VERSEXT "")
 
 ##############################################################################
 # handle input parameters to script.
 #BUILD_GENERATOR - which CMake generator to use, required
 #INSTALLDIR - HDF5-1.10.0 root folder
-#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
 #CTEST_SOURCE_NAME - name of source folder; HDF5-1.10.0
-#STATIC_LIBRARIES - Default is YES
+#STATIC_ONLY - Default is YES
 #FORTRAN_LIBRARIES - Default is NO
 #JAVA_LIBRARIES - Default is NO
 #NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
-if(DEFINED CTEST_SCRIPT_ARG)
+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})
+    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()
+            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 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")
-else()
-    set(STATICLIBRARIES "NO")
-endif()
-if(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "NO")
-else()
-    set(FORTRANLIBRARIES "YES")
-endif()
-if(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "NO")
-else()
-    set(JAVALIBRARIES "YES")
-endif()
+###################################################################
+### Following Line is one of [Release, RelWithDebInfo, Debug] #####
+set (CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}")
+###################################################################
+
+if (NOT DEFINED INSTALLDIR)
+  if (WIN32)
+    set (INSTALLDIR "C:/Program Files/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
+  else ()
+    set (INSTALLDIR "${CTEST_SCRIPT_DIRECTORY}/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
+  endif ()
+endif ()
+if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
+  set (CTEST_CONFIGURATION_TYPE "Release")
+endif ()
+if (NOT DEFINED CTEST_SOURCE_NAME)
+  set (CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+endif ()
+if (NOT DEFINED STATIC_ONLY)
+  set (STATICONLYLIBRARIES "YES")
+else ()
+  set (STATICONLYLIBRARIES "NO")
+endif ()
+if (NOT DEFINED FORTRAN_LIBRARIES)
+  set (FORTRANLIBRARIES "NO")
+else ()
+  set(FORTRANLIBRARIES "YES")
+endif ()
+if (NOT DEFINED JAVA_LIBRARIES)
+  set (JAVALIBRARIES "NO")
+else ()
+  set (JAVALIBRARIES "YES")
+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()
+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()
+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 (CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
+else ()
+  set (CTEST_CMAKE_GENERATOR "Unix Makefiles")
 ##  Set the following to unique id your computer  ##
-  if(APPLE)
-    set(CTEST_SITE "MAC.XXXX")
-  else()
-    set(CTEST_SITE "LINUX.XXXX")
-  endif()
-endif()
+  if (APPLE)
+    set (CTEST_SITE "MAC.XXXX")
+  else ()
+    set (CTEST_SITE "LINUX.XXXX")
+  endif ()
+  if (APPLE)
+    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}")
+    set (CTEST_USE_LAUNCHERS        1)
+    set (RR_WARNINGS_COMMON "-Wno-format-nonliteral -Wno-cast-align -Wno-unused -Wno-unused-variable -Wno-unused-function -Wno-self-assign -Wno-unused-parameter -Wno-sign-compare")
+    set (RR_WARNINGS_C "${RR_WARNINGS_COMMON} -Wno-deprecated-declarations -Wno-uninitialized")
+    set (RR_WARNINGS_CXX "${RR_WARNINGS_COMMON} -Woverloaded-virtual -Wshadow -Wwrite-strings -Wc++11-compat")
+    set (RR_FLAGS_COMMON "-g -O0 -fstack-protector-all -D_FORTIFY_SOURCE=2")
+    set (RR_FLAGS_C "${RR_FLAGS_COMMON}")
+    set (RR_FLAGS_CXX "${RR_FLAGS_COMMON}")
+    set (ENV{CFLAGS} "${RR_WARNINGS_C} ${RR_FLAGS_C}")
+    set (ENV{CXXFLAGS} "${RR_WARNINGS_CXX} ${RR_FLAGS_CXX}")
+  endif ()
+endif ()
 ###################################################################
 
 ###################################################################
 #########       Following is for submission to CDash   ############
 ###################################################################
-set(MODEL "Experimental")
+set (MODEL "Experimental")
 ###################################################################
 
 ###################################################################
 #####       Following controls CDash submission               #####
-#set(LOCAL_SUBMIT "TRUE")
+#set (LOCAL_SUBMIT "TRUE")
 #####       Following controls test process                   #####
-#set(LOCAL_SKIP_TEST "TRUE")
-#set(LOCAL_MEMCHECK_TEST "TRUE")
-#set(LOCAL_COVERAGE_TEST "TRUE")
+#set (LOCAL_SKIP_TEST "TRUE")
+#set (LOCAL_MEMCHECK_TEST "TRUE")
+#set (LOCAL_COVERAGE_TEST "TRUE")
 #####       Following controls cpack command                  #####
-#set(LOCAL_NO_PACKAGE "TRUE")
+#set (LOCAL_NO_PACKAGE "TRUE")
 #####       Following controls source update                  #####
-#set(LOCAL_UPDATE "TRUE")
-set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/trunk")
+#set (LOCAL_UPDATE "TRUE")
+set (REPOSITORY_URL "https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5.git")
+set (REPOSITORY_BRANCH "develop")
+
 #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")
+if (${STATICONLYLIBRARIES})
+  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()
+  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()
+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 ()
 ####      java       ####
-if(${JAVALIBRARIES})
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON")
-else()
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA: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")
+if (${JAVALIBRARIES})
+  set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON")
+else ()
+  set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF")
+endif ()
 
 ### change install prefix
-set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH=${INSTALLDIR}")
+set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH=${INSTALLDIR}")
+set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCTEST_CONFIGURATION_TYPE:STRING=$ENV{CMAKE_CONFIG_TYPE}")
 
 ###################################################################
 
-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()
+if (WIN32)
+  set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}")
+  include (${CTEST_SCRIPT_DIRECTORY}\\HDF5options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+else ()
+  set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+  include (${CTEST_SCRIPT_DIRECTORY}/HDF5options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
+  if (APPLE)
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+  else ()
+    if (CYGWIN)
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+    else ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+    endif ()
+  endif ()
+endif ()
diff --git a/config/cmake/scripts/HDF5options.cmake b/config/cmake/scripts/HDF5options.cmake
new file mode 100755
index 0000000..b090434
--- /dev/null
+++ b/config/cmake/scripts/HDF5options.cmake
@@ -0,0 +1,52 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+#############################################################################################
+####  Change default configuration of options in config/cmake/cacheinit.cmake file        ###
+####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")                 ###
+#############################################################################################
+
+### uncomment/comment and change the following lines for other configuration options
+
+#############################################################################################
+####      alternate toolsets       ####
+#set(CMAKE_GENERATOR_TOOLSET "Intel C++ Compiler 17.0")
+
+#############################################################################################
+####      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 git
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=GIT")
+### 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 zlib building
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF")
+### disable ext szip building
+#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")
+
+#############################################################################################
+### 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)
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACKAGE_EXTLIBS:BOOL=ON")
+
+#############################################################################################
diff --git a/config/cmake/userblockTest.cmake b/config/cmake/userblockTest.cmake
index 0775cbe..9af7e5b 100644
--- a/config/cmake/userblockTest.cmake
+++ b/config/cmake/userblockTest.cmake
@@ -1,31 +1,42 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # userblockTest.cmake executes a command and captures the output in a file. File is then compared
 # against a reference file. Exit status of command can also be compared.
 
 # arguments checking
 if (NOT TEST_PROGRAM)
   message (FATAL_ERROR "Require TEST_PROGRAM tellub to be defined")
-endif (NOT TEST_PROGRAM)
+endif ()
 if (NOT TEST_GET_PROGRAM)
   message (FATAL_ERROR "Require TEST_GET_PROGRAM getub to be defined")
-endif (NOT TEST_GET_PROGRAM)
+endif ()
 if (NOT TEST_FOLDER)
   message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
+endif ()
 if (NOT TEST_HFILE)
   message (FATAL_ERROR "Require TEST_HFILE the hdf file to be defined")
-endif (NOT TEST_HFILE)
+endif ()
 if (NOT TEST_UFILE)
   message (FATAL_ERROR "Require TEST_UFILE the ub file to be defined")
-endif (NOT TEST_UFILE)
+endif ()
 if (NOT TEST_CHECKUB)
   message (STATUS "Require TEST_CHECKUB - YES or NO - to be defined")
-endif (NOT TEST_CHECKUB)
+endif ()
 #if (NOT TEST_EXPECT)
 #  message (STATUS "Require TEST_EXPECT to be defined")
-#endif (NOT TEST_EXPECT)
+#endif ()
 #if (NOT TEST_OFILE)
 #  message (FATAL_ERROR "Require TEST_OFILE the original hdf file to be defined")
-#endif (NOT TEST_OFILE)
+#endif ()
 
 set (TEST_U_STRING_LEN 0)
 set (TEST_O_STRING_LEN 0)
@@ -53,11 +64,11 @@ if (TEST_CHECKUB STREQUAL "YES")
     )
     if (NOT ${TEST_RESULT} STREQUAL "0")
       message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} ${TEST_OFILE} is: ${TEST_ERROR}")
-    endif (NOT ${TEST_RESULT} STREQUAL "0")
+    endif ()
     file (READ ${TEST_HFILE}.len.txt TEST_O_STRING_LEN)
-  endif (TEST_OFILE)
+  endif ()
 
-  MATH( EXPR TEST_STRING_SIZE "${TEST_U_STRING_LEN} + ${TEST_O_STRING_LEN}" )
+  math( EXPR TEST_STRING_SIZE "${TEST_U_STRING_LEN} + ${TEST_O_STRING_LEN}" )
 
   if (NOT TEST_O_STRING_LEN STREQUAL "0")
     #$JAM_BIN/getub -c $s2 $origfile > $cmpfile
@@ -73,10 +84,10 @@ if (TEST_CHECKUB STREQUAL "YES")
     #cat $ufile >> $cmpfile
     file (STRINGS ${TEST_UFILE} TEST_STREAM NEWLINE_CONSUME)
     file (APPEND ${TEST_HFILE}-ub.cmp "${TEST_STREAM}")
-  else (NOT TEST_O_STRING_LEN STREQUAL "0")
+  else ()
     file (STRINGS ${TEST_UFILE} TEST_STREAM NEWLINE_CONSUME)
     file (WRITE ${TEST_HFILE}-ub.cmp ${TEST_STREAM})
-  endif (NOT TEST_O_STRING_LEN STREQUAL "0")
+  endif ()
 
   #$JAM_BIN/getub -c $size $hfile > $tfile
   EXECUTE_PROCESS (
@@ -99,8 +110,8 @@ if (TEST_CHECKUB STREQUAL "YES")
   # if the return value is !=${TEST_EXPECT} bail out
   if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
     message (FATAL_ERROR "Failed: The output of ${TEST_HFILE}-ub did not match ${TEST_HFILE}.\n${TEST_ERROR}")
-  endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
-else (TEST_CHECKUB STREQUAL "YES")
+  endif ()
+else ()
     # call 'ubsize' to get the size of the user block
     #ubsize=`$JAM_BIN/tellub $hfile`
     EXECUTE_PROCESS (
@@ -112,8 +123,8 @@ else (TEST_CHECKUB STREQUAL "YES")
     )
   if (NOT TEST_H_STRING_LEN STREQUAL "0")
     message (FATAL_ERROR "Failed: The output of ${TEST_HFILE} was NOT empty")
-  endif (NOT TEST_H_STRING_LEN STREQUAL "0")
-endif (TEST_CHECKUB STREQUAL "YES")
+  endif ()
+endif ()
 
 # everything went fine...
 message ("Passed: The output of CHECK matched expectation")
diff --git a/config/cmake/vfdTest.cmake b/config/cmake/vfdTest.cmake
index 10f0a7b..67a2566 100644
--- a/config/cmake/vfdTest.cmake
+++ b/config/cmake/vfdTest.cmake
@@ -1,32 +1,50 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # vfdTest.cmake executes a command and captures the output in a file. Command uses specified VFD.
 # Exit status of command can also be compared.
 
 # arguments checking
 if (NOT TEST_PROGRAM)
   message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
-endif (NOT TEST_PROGRAM)
-#if (NOT TEST_ARGS)
-#  message (STATUS "Require TEST_ARGS to be defined")
-#endif (NOT TEST_ARGS)
-#if (NOT TEST_EXPECT)
-#  message (STATUS "Require TEST_EXPECT to be defined")
-#endif (NOT TEST_EXPECT)
+endif ()
 if (NOT TEST_FOLDER)
   message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
+endif ()
 if (NOT TEST_VFD)
   message (FATAL_ERROR "Require TEST_VFD to be defined")
-endif (NOT TEST_VFD)
+endif ()
 
-set (ERROR_APPEND 1)
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT})
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT})
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+endif ()
+
+# if there is not an error reference file add the error output to the stdout file
+if (NOT TEST_ERRREF)
+  set (ERROR_APPEND 1)
+endif ()
 
 message (STATUS "USING ${TEST_VFD} ON COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
 
 set (ENV{HDF5_DRIVER} "${TEST_VFD}")
+
 # run the test program, capture the stdout/stderr and the result var
-EXECUTE_PROCESS (
+execute_process (
     COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
     WORKING_DIRECTORY ${TEST_FOLDER}
+    RESULT_VARIABLE TEST_RESULT
     OUTPUT_FILE ${TEST_OUTPUT}_${TEST_VFD}.out
     ERROR_FILE ${TEST_OUTPUT}_${TEST_VFD}.err
     OUTPUT_VARIABLE TEST_OUT
@@ -35,16 +53,24 @@ EXECUTE_PROCESS (
 
 message (STATUS "COMMAND Result: ${TEST_RESULT}")
 
+# if the .err file exists and ERRROR_APPEND is enabled
 if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err TEST_STREAM)
   file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.out "${TEST_STREAM}")
-endif (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.err)
+endif ()
 
 # if the return value is !=${TEST_EXPECT} bail out
 if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
-  message ( FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
-endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+  if (NOT TEST_NOERRDISPLAY)
+    if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.out)
+      file (READ ${TEST_FOLDER}/${TEST_OUTPUT}_${TEST_VFD}.out TEST_STREAM)
+	  message (STATUS "Output USING ${TEST_VFD}:\n${TEST_STREAM}")
+	endif ()
+  endif ()
+  message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
+endif ()
+
+message (STATUS "COMMAND Error: ${TEST_ERROR}")
 
 # everything went fine...
 message ("Passed: The ${TEST_PROGRAM} program used vfd ${TEST_VFD}")
-
diff --git a/config/cmake_ext_mod/CheckTypeSize.cmake b/config/cmake_ext_mod/CheckTypeSize.cmake
index 5095a27..c14c2f2 100644
--- a/config/cmake_ext_mod/CheckTypeSize.cmake
+++ b/config/cmake_ext_mod/CheckTypeSize.cmake
@@ -1,4 +1,15 @@
 #
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+#
 # Check if the type exists and determine size of type.  if the type
 # exists, the size will be stored to the variable.
 #
@@ -7,24 +18,24 @@
 # HAVE_${VARIABLE} - does the variable exists or not
 #
 
-MACRO (HDF_CHECK_TYPE_SIZE TYPE VARIABLE)
+macro (HDF_CHECK_TYPE_SIZE TYPE VARIABLE)
   set (CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 1)
   if ("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
-    set (MACRO_CHECK_TYPE_SIZE_FLAGS 
+    set (MACRO_CHECK_TYPE_SIZE_FLAGS
         "-DCHECK_TYPE_SIZE_TYPE=\"${TYPE}\" ${CMAKE_REQUIRED_FLAGS}"
     )
     foreach (def HAVE_SYS_TYPES_H HAVE_STDINT_H HAVE_STDDEF_H HAVE_INTTYPES_H)
       if ("${def}")
         set (MACRO_CHECK_TYPE_SIZE_FLAGS "${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
-      endif ("${def}")
-    endforeach (def)
+      endif ()
+    endforeach ()
 
     message (STATUS "Check size of ${TYPE}")
     if (CMAKE_REQUIRED_LIBRARIES)
-      set (CHECK_TYPE_SIZE_ADD_LIBRARIES 
+      set (CHECK_TYPE_SIZE_ADD_LIBRARIES
           "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}"
       )
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
     try_run (${VARIABLE} HAVE_${VARIABLE}
         ${CMAKE_BINARY_DIR}
         ${HDF_RESOURCES_EXT_DIR}/CheckTypeSize.c
@@ -35,16 +46,16 @@ MACRO (HDF_CHECK_TYPE_SIZE TYPE VARIABLE)
     if (HAVE_${VARIABLE})
       message (STATUS "Check size of ${TYPE} - done")
       file (APPEND
-          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeOutput.log 
+          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeOutput.log
           "Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n"
       )
-    else (HAVE_${VARIABLE})
+    else ()
       message (STATUS "Check size of ${TYPE} - failed")
       file (APPEND
-          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log 
+          ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
           "Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\n\n"
       )
-    endif (HAVE_${VARIABLE})
-  endif ("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
+    endif ()
+  endif ()
   set (CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS)
-ENDMACRO (HDF_CHECK_TYPE_SIZE)
+endmacro ()
diff --git a/config/cmake_ext_mod/ConfigureChecks.cmake b/config/cmake_ext_mod/ConfigureChecks.cmake
index cfda66b..56d45f9 100644
--- a/config/cmake_ext_mod/ConfigureChecks.cmake
+++ b/config/cmake_ext_mod/ConfigureChecks.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-----------------------------------------------------------------------------
 # Include all the necessary files for macros
 #-----------------------------------------------------------------------------
@@ -11,9 +22,9 @@ include (${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
 include (${CMAKE_ROOT}/Modules/CheckVariableExists.cmake)
 include (${CMAKE_ROOT}/Modules/CheckFortranFunctionExists.cmake)
 include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
-if(CMAKE_CXX_COMPILER)
+if (CMAKE_CXX_COMPILER AND CMAKE_CXX_COMPILER_LOADED)
   include (${CMAKE_ROOT}/Modules/TestForSTDNamespace.cmake)
-endif(CMAKE_CXX_COMPILER)
+endif ()
 
 #-----------------------------------------------------------------------------
 # APPLE/Darwin setup
@@ -28,29 +39,29 @@ if (APPLE)
     "variable has been set to a blank value which will build the default architecture for this system.")
   endif ()
   set (${HDF_PREFIX}_AC_APPLE_UNIVERSAL_BUILD 0)
-endif (APPLE)
+endif ()
 
 # Check for Darwin (not just Apple - we also want to catch OpenDarwin)
 if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
     set (${HDF_PREFIX}_HAVE_DARWIN 1)
-endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+endif ()
 
 # Check for Solaris
 if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
     set (${HDF_PREFIX}_HAVE_SOLARIS 1)
-endif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+endif ()
 
 #-----------------------------------------------------------------------------
 # This MACRO checks IF the symbol exists in the library and IF it
 # does, it appends library to the list.
 #-----------------------------------------------------------------------------
 set (LINK_LIBS "")
-MACRO (CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE)
+macro (CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE)
   CHECK_LIBRARY_EXISTS ("${LIBRARY};${LINK_LIBS}" ${SYMBOL} "" ${VARIABLE})
   if (${VARIABLE})
     set (LINK_LIBS ${LINK_LIBS} ${LIBRARY})
-  endif (${VARIABLE})
-ENDMACRO (CHECK_LIBRARY_EXISTS_CONCAT)
+  endif ()
+endmacro ()
 
 # ----------------------------------------------------------------------
 # WINDOWS Hard code Values
@@ -62,7 +73,7 @@ if (WIN32)
     set (${HDF_PREFIX}_HAVE_MINGW 1)
     set (WINDOWS 1) # MinGW tries to imitate Windows
     set (CMAKE_REQUIRED_FLAGS "-DWIN32_LEAN_AND_MEAN=1 -DNOGDI=1")
-  endif (MINGW)
+  endif ()
   set (${HDF_PREFIX}_HAVE_WIN32_API 1)
   set (CMAKE_REQUIRED_LIBRARIES "ws2_32.lib;wsock32.lib")
   if (NOT UNIX AND NOT MINGW)
@@ -70,9 +81,9 @@ if (WIN32)
     set (CMAKE_REQUIRED_FLAGS "/DWIN32_LEAN_AND_MEAN=1 /DNOGDI=1")
     if (MSVC)
       set (${HDF_PREFIX}_HAVE_VISUAL_STUDIO 1)
-    endif (MSVC)
-  endif (NOT UNIX AND NOT MINGW)
-endif (WIN32)
+    endif ()
+  endif ()
+endif ()
 
 if (WINDOWS)
   set (${HDF_PREFIX}_HAVE_STDDEF_H 1)
@@ -84,20 +95,20 @@ if (WINDOWS)
   set (${HDF_PREFIX}_HAVE_LONGJMP 1)
   if (NOT MINGW)
     set (${HDF_PREFIX}_HAVE_GETHOSTNAME 1)
-  endif (NOT MINGW)
+  endif ()
   if (NOT UNIX AND NOT CYGWIN AND NOT MINGW)
     set (${HDF_PREFIX}_HAVE_GETCONSOLESCREENBUFFERINFO 1)
-  endif (NOT UNIX AND NOT CYGWIN AND NOT MINGW)
+  endif ()
   set (${HDF_PREFIX}_HAVE_FUNCTION 1)
   set (${HDF_PREFIX}_GETTIMEOFDAY_GIVES_TZ 1)
   set (${HDF_PREFIX}_HAVE_TIMEZONE 1)
   set (${HDF_PREFIX}_HAVE_GETTIMEOFDAY 1)
   if (MINGW)
     set (${HDF_PREFIX}_HAVE_WINSOCK2_H 1)
-  endif (MINGW)
+  endif ()
   set (${HDF_PREFIX}_HAVE_LIBWS2_32 1)
   set (${HDF_PREFIX}_HAVE_LIBWSOCK32 1)
-endif (WINDOWS)
+endif ()
 
 # ----------------------------------------------------------------------
 # END of WINDOWS Hard code Values
@@ -105,7 +116,7 @@ endif (WINDOWS)
 
 if (CYGWIN)
   set (${HDF_PREFIX}_HAVE_LSEEK64 0)
-endif (CYGWIN)
+endif ()
 
 #-----------------------------------------------------------------------------
 #  Check for the math library "m"
@@ -115,7 +126,7 @@ if (NOT WINDOWS)
   CHECK_LIBRARY_EXISTS_CONCAT ("dl" dlopen     ${HDF_PREFIX}_HAVE_LIBDL)
   CHECK_LIBRARY_EXISTS_CONCAT ("ws2_32" WSAStartup  ${HDF_PREFIX}_HAVE_LIBWS2_32)
   CHECK_LIBRARY_EXISTS_CONCAT ("wsock32" gethostbyname ${HDF_PREFIX}_HAVE_LIBWSOCK32)
-endif (NOT WINDOWS)
+endif ()
 
 # UCB (BSD) compatibility library
 CHECK_LIBRARY_EXISTS_CONCAT ("ucb"    gethostname  ${HDF_PREFIX}_HAVE_LIBUCB)
@@ -126,20 +137,20 @@ set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LINK_LIBS})
 set (USE_INCLUDES "")
 if (WINDOWS)
   set (USE_INCLUDES ${USE_INCLUDES} "windows.h")
-endif (WINDOWS)
+endif ()
 
 if (NOT WINDOWS)
   TEST_BIG_ENDIAN (${HDF_PREFIX}_WORDS_BIGENDIAN)
-endif (NOT WINDOWS)
+endif ()
 
 # For other specific tests, use this MACRO.
-MACRO (HDF_FUNCTION_TEST OTHER_TEST)
+macro (HDF_FUNCTION_TEST OTHER_TEST)
   if ("${HDF_PREFIX}_${OTHER_TEST}" MATCHES "^${HDF_PREFIX}_${OTHER_TEST}$")
     set (MACRO_CHECK_FUNCTION_DEFINITIONS "-D${OTHER_TEST} ${CMAKE_REQUIRED_FLAGS}")
     set (OTHER_TEST_ADD_LIBRARIES)
     if (CMAKE_REQUIRED_LIBRARIES)
       set (OTHER_TEST_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
 
     foreach (def
         HAVE_SYS_TIME_H
@@ -149,14 +160,14 @@ MACRO (HDF_FUNCTION_TEST OTHER_TEST)
     )
       if ("${${HDF_PREFIX}_${def}}")
         set (MACRO_CHECK_FUNCTION_DEFINITIONS "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D${def}")
-      endif ("${${HDF_PREFIX}_${def}}")
-    endforeach (def)
+      endif ()
+    endforeach ()
 
     if (LARGEFILE)
       set (MACRO_CHECK_FUNCTION_DEFINITIONS
           "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
       )
-    endif (LARGEFILE)
+    endif ()
 
     #message (STATUS "Performing ${OTHER_TEST}")
     TRY_COMPILE (${OTHER_TEST}
@@ -169,16 +180,16 @@ MACRO (HDF_FUNCTION_TEST OTHER_TEST)
     if (${OTHER_TEST})
       set (${HDF_PREFIX}_${OTHER_TEST} 1 CACHE INTERNAL "Other test ${FUNCTION}")
       message (STATUS "Performing Other Test ${OTHER_TEST} - Success")
-    else (${OTHER_TEST})
+    else ()
       message (STATUS "Performing Other Test ${OTHER_TEST} - Failed")
       set (${HDF_PREFIX}_${OTHER_TEST} "" CACHE INTERNAL "Other test ${FUNCTION}")
       file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
           "Performing Other Test ${OTHER_TEST} failed with the following output:\n"
           "${OUTPUT}\n"
       )
-    endif (${OTHER_TEST})
-  endif ("${HDF_PREFIX}_${OTHER_TEST}" MATCHES "^${HDF_PREFIX}_${OTHER_TEST}$")
-ENDMACRO (HDF_FUNCTION_TEST)
+    endif ()
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Check for these functions before the time headers are checked
@@ -188,28 +199,29 @@ HDF_FUNCTION_TEST (STDC_HEADERS)
 #-----------------------------------------------------------------------------
 # Check IF header file exists and add it to the list.
 #-----------------------------------------------------------------------------
-MACRO (CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE)
+macro (CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE)
   CHECK_INCLUDE_FILES ("${USE_INCLUDES};${FILE}" ${VARIABLE})
   if (${VARIABLE})
     set (USE_INCLUDES ${USE_INCLUDES} ${FILE})
-  endif (${VARIABLE})
-ENDMACRO (CHECK_INCLUDE_FILE_CONCAT)
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 #  Check for the existence of certain header files
 #-----------------------------------------------------------------------------
-CHECK_INCLUDE_FILE_CONCAT ("sys/resource.h"  ${HDF_PREFIX}_HAVE_SYS_RESOURCE_H)
-CHECK_INCLUDE_FILE_CONCAT ("sys/time.h"      ${HDF_PREFIX}_HAVE_SYS_TIME_H)
-CHECK_INCLUDE_FILE_CONCAT ("unistd.h"        ${HDF_PREFIX}_HAVE_UNISTD_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/file.h"      ${HDF_PREFIX}_HAVE_SYS_FILE_H)
 CHECK_INCLUDE_FILE_CONCAT ("sys/ioctl.h"     ${HDF_PREFIX}_HAVE_SYS_IOCTL_H)
-CHECK_INCLUDE_FILE_CONCAT ("sys/stat.h"      ${HDF_PREFIX}_HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/resource.h"  ${HDF_PREFIX}_HAVE_SYS_RESOURCE_H)
 CHECK_INCLUDE_FILE_CONCAT ("sys/socket.h"    ${HDF_PREFIX}_HAVE_SYS_SOCKET_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/stat.h"      ${HDF_PREFIX}_HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE_CONCAT ("sys/time.h"      ${HDF_PREFIX}_HAVE_SYS_TIME_H)
 CHECK_INCLUDE_FILE_CONCAT ("sys/types.h"     ${HDF_PREFIX}_HAVE_SYS_TYPES_H)
-CHECK_INCLUDE_FILE_CONCAT ("stddef.h"        ${HDF_PREFIX}_HAVE_STDDEF_H)
-CHECK_INCLUDE_FILE_CONCAT ("setjmp.h"        ${HDF_PREFIX}_HAVE_SETJMP_H)
 CHECK_INCLUDE_FILE_CONCAT ("features.h"      ${HDF_PREFIX}_HAVE_FEATURES_H)
 CHECK_INCLUDE_FILE_CONCAT ("dirent.h"        ${HDF_PREFIX}_HAVE_DIRENT_H)
+CHECK_INCLUDE_FILE_CONCAT ("setjmp.h"        ${HDF_PREFIX}_HAVE_SETJMP_H)
+CHECK_INCLUDE_FILE_CONCAT ("stddef.h"        ${HDF_PREFIX}_HAVE_STDDEF_H)
 CHECK_INCLUDE_FILE_CONCAT ("stdint.h"        ${HDF_PREFIX}_HAVE_STDINT_H)
+CHECK_INCLUDE_FILE_CONCAT ("unistd.h"        ${HDF_PREFIX}_HAVE_UNISTD_H)
 
 # IF the c compiler found stdint, check the C++ as well. On some systems this
 # file will be found by C but not C++, only do this test IF the C++ compiler
@@ -219,8 +231,8 @@ if (${HDF_PREFIX}_HAVE_STDINT_H AND CMAKE_CXX_COMPILER_LOADED)
   if (NOT ${HDF_PREFIX}_HAVE_STDINT_H_CXX)
     set (${HDF_PREFIX}_HAVE_STDINT_H "" CACHE INTERNAL "Have includes HAVE_STDINT_H")
     set (USE_INCLUDES ${USE_INCLUDES} "stdint.h")
-  endif (NOT ${HDF_PREFIX}_HAVE_STDINT_H_CXX)
-endif (${HDF_PREFIX}_HAVE_STDINT_H AND CMAKE_CXX_COMPILER_LOADED)
+  endif ()
+endif ()
 
 # Darwin
 CHECK_INCLUDE_FILE_CONCAT ("mach/mach_time.h" ${HDF_PREFIX}_HAVE_MACH_MACH_TIME_H)
@@ -229,16 +241,16 @@ CHECK_INCLUDE_FILE_CONCAT ("mach/mach_time.h" ${HDF_PREFIX}_HAVE_MACH_MACH_TIME_
 CHECK_INCLUDE_FILE_CONCAT ("io.h"            ${HDF_PREFIX}_HAVE_IO_H)
 if (NOT CYGWIN)
   CHECK_INCLUDE_FILE_CONCAT ("winsock2.h"      ${HDF_PREFIX}_HAVE_WINSOCK2_H)
-endif (NOT CYGWIN)
+endif ()
 CHECK_INCLUDE_FILE_CONCAT ("sys/timeb.h"     ${HDF_PREFIX}_HAVE_SYS_TIMEB_H)
 
 if (CMAKE_SYSTEM_NAME MATCHES "OSF")
   CHECK_INCLUDE_FILE_CONCAT ("sys/sysinfo.h" ${HDF_PREFIX}_HAVE_SYS_SYSINFO_H)
   CHECK_INCLUDE_FILE_CONCAT ("sys/proc.h"    ${HDF_PREFIX}_HAVE_SYS_PROC_H)
-else (CMAKE_SYSTEM_NAME MATCHES "OSF")
+else ()
   set (${HDF_PREFIX}_HAVE_SYS_SYSINFO_H "" CACHE INTERNAL "" FORCE)
   set (${HDF_PREFIX}_HAVE_SYS_PROC_H    "" CACHE INTERNAL "" FORCE)
-endif (CMAKE_SYSTEM_NAME MATCHES "OSF")
+endif ()
 
 CHECK_INCLUDE_FILE_CONCAT ("globus/common.h" ${HDF_PREFIX}_HAVE_GLOBUS_COMMON_H)
 CHECK_INCLUDE_FILE_CONCAT ("pdb.h"           ${HDF_PREFIX}_HAVE_PDB_H)
@@ -295,29 +307,29 @@ if (NOT WINDOWS)
     # 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)
+      if (TEST_LFS_WORKS_RUN MATCHES 0)
         set (TEST_LFS_WORKS 1 CACHE INTERNAL ${msg})
         set (LARGEFILE 1)
         set (HDF_EXTRA_FLAGS ${HDF_EXTRA_FLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE)
         message (STATUS "${msg}... yes")
-      else (TEST_LFS_WORKS_RUN  MATCHES 0)
+      else ()
         set (TEST_LFS_WORKS "" CACHE INTERNAL ${msg})
         message (STATUS "${msg}... no")
         file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
               "Test TEST_LFS_WORKS Run failed with the following output and exit code:\n ${OUTPUT}\n"
         )
-      endif (TEST_LFS_WORKS_RUN  MATCHES 0)
-    else (TEST_LFS_WORKS_COMPILE )
+      endif ()
+    else ()
       set (TEST_LFS_WORKS "" CACHE INTERNAL ${msg})
       message (STATUS "${msg}... no")
       file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
           "Test TEST_LFS_WORKS Compile failed with the following output:\n ${OUTPUT}\n"
       )
-    endif (TEST_LFS_WORKS_COMPILE)
-  endif (HDF_ENABLE_LARGE_FILE)
+    endif ()
+  endif ()
   set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${HDF_EXTRA_FLAGS})
-  endif (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN)
-endif (NOT WINDOWS)
+  endif ()
+endif ()
 
 add_definitions (${HDF_EXTRA_FLAGS})
 
@@ -331,7 +343,7 @@ if (NOT WINDOWS OR MINGW)
     CHECK_FUNCTION_EXISTS (fseeko64           ${HDF_PREFIX}_HAVE_FSEEKO64)
     CHECK_FUNCTION_EXISTS (ftello64           ${HDF_PREFIX}_HAVE_FTELLO64)
     CHECK_FUNCTION_EXISTS (ftruncate64        ${HDF_PREFIX}_HAVE_FTRUNCATE64)
-  endif (${HDF_PREFIX}_HAVE_OFF64_T)
+  endif ()
 
   CHECK_FUNCTION_EXISTS (fseeko               ${HDF_PREFIX}_HAVE_FSEEKO)
   CHECK_FUNCTION_EXISTS (ftello               ${HDF_PREFIX}_HAVE_FTELLO)
@@ -340,13 +352,13 @@ if (NOT WINDOWS OR MINGW)
   if (HAVE_STAT64_STRUCT)
     CHECK_FUNCTION_EXISTS (fstat64            ${HDF_PREFIX}_HAVE_FSTAT64)
     CHECK_FUNCTION_EXISTS (stat64             ${HDF_PREFIX}_HAVE_STAT64)
-  endif (HAVE_STAT64_STRUCT)
-endif (NOT WINDOWS OR MINGW)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 #  Check the size in bytes of all the int and float types
 #-----------------------------------------------------------------------------
-MACRO (HDF_CHECK_TYPE_SIZE type var)
+macro (HDF_CHECK_TYPE_SIZE type var)
   set (aType ${type})
   set (aVar  ${var})
 #  message (STATUS "Checking size of ${aType} and storing into ${aVar}")
@@ -354,8 +366,8 @@ MACRO (HDF_CHECK_TYPE_SIZE type var)
   if (NOT ${aVar})
     set (${aVar} 0 CACHE INTERNAL "SizeOf for ${aType}")
 #    message (STATUS "Size of ${aType} was NOT Found")
-  endif (NOT ${aVar})
-ENDMACRO (HDF_CHECK_TYPE_SIZE)
+  endif ()
+endmacro ()
 
 HDF_CHECK_TYPE_SIZE (char           ${HDF_PREFIX}_SIZEOF_CHAR)
 HDF_CHECK_TYPE_SIZE (short          ${HDF_PREFIX}_SIZEOF_SHORT)
@@ -363,12 +375,12 @@ HDF_CHECK_TYPE_SIZE (int            ${HDF_PREFIX}_SIZEOF_INT)
 HDF_CHECK_TYPE_SIZE (unsigned       ${HDF_PREFIX}_SIZEOF_UNSIGNED)
 if (NOT APPLE)
   HDF_CHECK_TYPE_SIZE (long         ${HDF_PREFIX}_SIZEOF_LONG)
-endif (NOT APPLE)
+endif ()
 HDF_CHECK_TYPE_SIZE ("long long"    ${HDF_PREFIX}_SIZEOF_LONG_LONG)
 HDF_CHECK_TYPE_SIZE (__int64        ${HDF_PREFIX}_SIZEOF___INT64)
 if (NOT ${HDF_PREFIX}_SIZEOF___INT64)
   set (${HDF_PREFIX}_SIZEOF___INT64 0)
-endif (NOT ${HDF_PREFIX}_SIZEOF___INT64)
+endif ()
 
 HDF_CHECK_TYPE_SIZE (float          ${HDF_PREFIX}_SIZEOF_FLOAT)
 HDF_CHECK_TYPE_SIZE (double         ${HDF_PREFIX}_SIZEOF_DOUBLE)
@@ -407,17 +419,17 @@ if (NOT APPLE)
   HDF_CHECK_TYPE_SIZE (ssize_t      ${HDF_PREFIX}_SIZEOF_SSIZE_T)
   if (NOT ${HDF_PREFIX}_SIZEOF_SSIZE_T)
     set (${HDF_PREFIX}_SIZEOF_SSIZE_T 0)
-  endif (NOT ${HDF_PREFIX}_SIZEOF_SSIZE_T)
+  endif ()
   if (NOT WINDOWS)
     HDF_CHECK_TYPE_SIZE (ptrdiff_t    ${HDF_PREFIX}_SIZEOF_PTRDIFF_T)
-  endif (NOT WINDOWS)
-endif (NOT APPLE)
+  endif ()
+endif ()
 
 HDF_CHECK_TYPE_SIZE (off_t          ${HDF_PREFIX}_SIZEOF_OFF_T)
 HDF_CHECK_TYPE_SIZE (off64_t        ${HDF_PREFIX}_SIZEOF_OFF64_T)
 if (NOT ${HDF_PREFIX}_SIZEOF_OFF64_T)
   set (${HDF_PREFIX}_SIZEOF_OFF64_T 0)
-endif (NOT ${HDF_PREFIX}_SIZEOF_OFF64_T)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Extra C99 types
@@ -428,9 +440,9 @@ CHECK_INCLUDE_FILE_CONCAT (stdbool.h    ${HDF_PREFIX}_HAVE_STDBOOL_H)
 if (HAVE_STDBOOL_H)
   set (CMAKE_EXTRA_INCLUDE_FILES stdbool.h)
   HDF_CHECK_TYPE_SIZE (bool         ${HDF_PREFIX}_SIZEOF_BOOL)
-else (HAVE_STDBOOL_H)
+else ()
   HDF_CHECK_TYPE_SIZE (_Bool        ${HDF_PREFIX}_SIZEOF_BOOL)
-endif (HAVE_STDBOOL_H)
+endif ()
 
 if (NOT WINDOWS)
   #-----------------------------------------------------------------------------
@@ -459,11 +471,11 @@ if (NOT WINDOWS)
       HAVE_STRUCT_TM_TM_ZONE
   )
     HDF_FUNCTION_TEST (${test})
-  endforeach (test)
+  endforeach ()
   if (NOT CYGWIN AND NOT MINGW)
       HDF_FUNCTION_TEST (HAVE_TIMEZONE)
 #      HDF_FUNCTION_TEST (HAVE_STAT_ST_BLOCKS)
-  endif (NOT CYGWIN AND NOT MINGW)
+  endif ()
 
   # ----------------------------------------------------------------------
   # Does the struct stat have the st_blocks field?  This field is not Posix.
@@ -481,10 +493,17 @@ if (NOT WINDOWS)
   CHECK_FUNCTION_EXISTS (_scrsize          ${HDF_PREFIX}_HAVE__SCRSIZE)
   if (NOT CYGWIN AND NOT MINGW)
     CHECK_FUNCTION_EXISTS (GetConsoleScreenBufferInfo    ${HDF_PREFIX}_HAVE_GETCONSOLESCREENBUFFERINFO)
-  endif (NOT CYGWIN AND NOT MINGW)
+  endif ()
   CHECK_SYMBOL_EXISTS (TIOCGWINSZ "sys/ioctl.h" ${HDF_PREFIX}_HAVE_TIOCGWINSZ)
   CHECK_SYMBOL_EXISTS (TIOCGETD   "sys/ioctl.h" ${HDF_PREFIX}_HAVE_TIOCGETD)
-endif (NOT WINDOWS)
+
+  # ----------------------------------------------------------------------
+  # cygwin user credentials are different then on linux
+  #
+  if (NOT CYGWIN AND NOT MINGW)
+    CHECK_FUNCTION_EXISTS (getpwuid        ${HDF_PREFIX}_HAVE_GETPWUID)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Check for some functions that are used
@@ -497,12 +516,17 @@ CHECK_FUNCTION_EXISTS (frexpf            ${HDF_PREFIX}_HAVE_FREXPF)
 CHECK_FUNCTION_EXISTS (frexpl            ${HDF_PREFIX}_HAVE_FREXPL)
 
 CHECK_FUNCTION_EXISTS (gethostname       ${HDF_PREFIX}_HAVE_GETHOSTNAME)
-CHECK_FUNCTION_EXISTS (getpwuid          ${HDF_PREFIX}_HAVE_GETPWUID)
 CHECK_FUNCTION_EXISTS (getrusage         ${HDF_PREFIX}_HAVE_GETRUSAGE)
+CHECK_FUNCTION_EXISTS (llround           ${HDF_PREFIX}_HAVE_LLROUND)
+CHECK_FUNCTION_EXISTS (llroundf          ${HDF_PREFIX}_HAVE_LLROUNDF)
+CHECK_FUNCTION_EXISTS (lround            ${HDF_PREFIX}_HAVE_LROUND)
+CHECK_FUNCTION_EXISTS (lroundf           ${HDF_PREFIX}_HAVE_LROUNDF)
 CHECK_FUNCTION_EXISTS (lstat             ${HDF_PREFIX}_HAVE_LSTAT)
 
 CHECK_FUNCTION_EXISTS (rand_r            ${HDF_PREFIX}_HAVE_RAND_R)
 CHECK_FUNCTION_EXISTS (random            ${HDF_PREFIX}_HAVE_RANDOM)
+CHECK_FUNCTION_EXISTS (round             ${HDF_PREFIX}_HAVE_ROUND)
+CHECK_FUNCTION_EXISTS (roundf            ${HDF_PREFIX}_HAVE_ROUNDF)
 CHECK_FUNCTION_EXISTS (setsysinfo        ${HDF_PREFIX}_HAVE_SETSYSINFO)
 
 CHECK_FUNCTION_EXISTS (signal            ${HDF_PREFIX}_HAVE_SIGNAL)
@@ -515,6 +539,8 @@ CHECK_FUNCTION_EXISTS (sigprocmask       ${HDF_PREFIX}_HAVE_SIGPROCMASK)
 CHECK_FUNCTION_EXISTS (snprintf          ${HDF_PREFIX}_HAVE_SNPRINTF)
 CHECK_FUNCTION_EXISTS (srandom           ${HDF_PREFIX}_HAVE_SRANDOM)
 CHECK_FUNCTION_EXISTS (strdup            ${HDF_PREFIX}_HAVE_STRDUP)
+CHECK_FUNCTION_EXISTS (strtoll           ${HDF_PREFIX}_HAVE_STRTOLL)
+CHECK_FUNCTION_EXISTS (strtoull          ${HDF_PREFIX}_HAVE_STRTOULL)
 CHECK_FUNCTION_EXISTS (symlink           ${HDF_PREFIX}_HAVE_SYMLINK)
 CHECK_FUNCTION_EXISTS (system            ${HDF_PREFIX}_HAVE_SYSTEM)
 
@@ -527,8 +553,8 @@ CHECK_FUNCTION_EXISTS (vsnprintf         ${HDF_PREFIX}_HAVE_VSNPRINTF)
 if (NOT WINDOWS)
   if (${HDF_PREFIX}_HAVE_VSNPRINTF)
     HDF_FUNCTION_TEST (VSNPRINTF_WORKS)
-  endif (${HDF_PREFIX}_HAVE_VSNPRINTF)
-endif (NOT WINDOWS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # sigsetjmp is special; may actually be a macro
@@ -538,9 +564,9 @@ if (NOT ${HDF_PREFIX}_HAVE_SIGSETJMP)
     CHECK_SYMBOL_EXISTS (sigsetjmp "setjmp.h" ${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
     if (${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
       set (${HDF_PREFIX}_HAVE_SIGSETJMP 1)
-    endif (${HDF_PREFIX}_HAVE_MACRO_SIGSETJMP)
-  endif (${HDF_PREFIX}_HAVE_SETJMP_H)
-endif (NOT ${HDF_PREFIX}_HAVE_SIGSETJMP)
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Check a bunch of other functions
@@ -554,37 +580,37 @@ if (NOT WINDOWS)
       HAVE_C99_DESIGNATED_INITIALIZER
       SYSTEM_SCOPE_THREADS
       HAVE_SOCKLEN_T
-      CXX_HAVE_OFFSETOF
   )
     HDF_FUNCTION_TEST (${test})
-  endforeach (test)
-endif (NOT WINDOWS)
+  endforeach ()
+endif ()
 
 # For other CXX specific tests, use this MACRO.
-MACRO (HDF_CXX_FUNCTION_TEST OTHER_TEST)
+macro (HDF_CXX_FUNCTION_TEST OTHER_TEST)
   if ("${OTHER_TEST}" MATCHES "^${OTHER_TEST}$")
     set (MACRO_CHECK_FUNCTION_DEFINITIONS "-D${OTHER_TEST} ${CMAKE_REQUIRED_FLAGS}")
     set (OTHER_TEST_ADD_LIBRARIES)
     if (CMAKE_REQUIRED_LIBRARIES)
       set (OTHER_TEST_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
 
     foreach (def
         HAVE_SYS_TIME_H
         HAVE_UNISTD_H
         HAVE_SYS_TYPES_H
         HAVE_SYS_SOCKET_H
+        HAVE_SYS_FILE_H
     )
       if ("${${HDF_PREFIX}_${def}}")
         set (MACRO_CHECK_FUNCTION_DEFINITIONS "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D${def}")
-      endif ("${${HDF_PREFIX}_${def}}")
-    endforeach (def)
+      endif ()
+    endforeach ()
 
     if (LARGEFILE)
       set (MACRO_CHECK_FUNCTION_DEFINITIONS
           "${MACRO_CHECK_FUNCTION_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
       )
-    endif (LARGEFILE)
+    endif ()
 
     #message (STATUS "Performing ${OTHER_TEST}")
     TRY_COMPILE (${OTHER_TEST}
@@ -597,16 +623,16 @@ MACRO (HDF_CXX_FUNCTION_TEST OTHER_TEST)
     if (${OTHER_TEST} EQUAL 0)
       set (${OTHER_TEST} 1 CACHE INTERNAL "CXX test ${FUNCTION}")
       message (STATUS "Performing CXX Test ${OTHER_TEST} - Success")
-    else (${OTHER_TEST} EQUAL 0)
+    else ()
       message (STATUS "Performing CXX Test ${OTHER_TEST} - Failed")
       set (${OTHER_TEST} "" CACHE INTERNAL "CXX test ${FUNCTION}")
       file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
           "Performing CXX Test ${OTHER_TEST} failed with the following output:\n"
           "${OUTPUT}\n"
       )
-    endif (${OTHER_TEST} EQUAL 0)
-  endif ("${OTHER_TEST}" MATCHES "^${OTHER_TEST}$")
-ENDMACRO (HDF_CXX_FUNCTION_TEST)
+    endif ()
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Check a bunch of cxx functions
@@ -618,10 +644,11 @@ if (CMAKE_CXX_COMPILER_LOADED)
       ${HDF_PREFIX}_NO_STD
       BOOL_NOTDEFINED
       NO_STATIC_CAST
+      CXX_HAVE_OFFSETOF
   )
     HDF_CXX_FUNCTION_TEST (${test})
-  endforeach (test)
-endif (CMAKE_CXX_COMPILER_LOADED)
+  endforeach ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Check if InitOnceExecuteOnce is available
@@ -634,21 +661,21 @@ if (WINDOWS)
       set (CMAKE_REQUIRED_DEFINITIONS
           "${CURRENT_TEST_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE"
       )
-    endif (LARGEFILE)
+    endif ()
     set (MACRO_CHECK_FUNCTION_DEFINITIONS
       "-DHAVE_IOEO ${CMAKE_REQUIRED_FLAGS}")
     if (CMAKE_REQUIRED_LIBRARIES)
       set (CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES
         "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
-    else (CMAKE_REQUIRED_LIBRARIES)
+    else ()
       set (CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES)
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
     if (CMAKE_REQUIRED_INCLUDES)
       set (CHECK_C_SOURCE_COMPILES_ADD_INCLUDES
         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
-    else (CMAKE_REQUIRED_INCLUDES)
+    else ()
       set (CHECK_C_SOURCE_COMPILES_ADD_INCLUDES)
-    endif (CMAKE_REQUIRED_INCLUDES)
+    endif ()
 
     TRY_RUN(HAVE_IOEO_EXITCODE HAVE_IOEO_COMPILED
       ${CMAKE_BINARY_DIR}
@@ -662,7 +689,7 @@ if (WINDOWS)
     # if it did not compile make the return value fail code of 1
     if (NOT HAVE_IOEO_COMPILED)
       set (HAVE_IOEO_EXITCODE 1)
-    endif (NOT HAVE_IOEO_COMPILED)
+    endif ()
     # if the return value was 0 then it worked
     if ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
       set (${HDF_PREFIX}_HAVE_IOEO 1 CACHE INTERNAL "Test InitOnceExecuteOnce")
@@ -671,22 +698,22 @@ if (WINDOWS)
         "Performing C SOURCE FILE Test InitOnceExecuteOnce succeded with the following output:\n"
         "${OUTPUT}\n"
         "Return value: ${HAVE_IOEO}\n")
-    else ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
+    else ()
       if (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
         set (${HDF_PREFIX}_HAVE_IOEO "${HAVE_IOEO_EXITCODE}")
-      else (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+      else ()
         set (${HDF_PREFIX}_HAVE_IOEO "" CACHE INTERNAL "Test InitOnceExecuteOnce")
-      endif (CMAKE_CROSSCOMPILING AND "${HAVE_IOEO_EXITCODE}" MATCHES  "FAILED_TO_RUN")
+      endif ()
 
       message (STATUS "Performing Test InitOnceExecuteOnce - Failed")
       file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
         "Performing InitOnceExecuteOnce Test  failed with the following output:\n"
         "${OUTPUT}\n"
         "Return value: ${HAVE_IOEO_EXITCODE}\n")
-    endif ("${HAVE_IOEO_EXITCODE}" EQUAL 0)
-  endif ("${${HDF_PREFIX}_HAVE_IOEO}" MATCHES "^${${HDF_PREFIX}_HAVE_IOEO}$")
-  endif (NOT HDF_NO_IOEO_TEST)
-endif (WINDOWS)
+    endif ()
+  endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Determine how 'inline' is used
@@ -694,7 +721,7 @@ endif (WINDOWS)
 foreach (inline_test inline __inline__ __inline)
   string (TOUPPER ${inline_test} INLINE_TEST_MACRO)
   HDF_FUNCTION_TEST (HAVE_${INLINE_TEST_MACRO})
-endforeach (inline_test)
+endforeach ()
 
 #-----------------------------------------------------------------------------
 # Check how to print a Long Long integer
@@ -705,7 +732,7 @@ if (NOT ${HDF_PREFIX}_PRINTF_LL_WIDTH OR ${HDF_PREFIX}_PRINTF_LL_WIDTH MATCHES "
   set (CURRENT_TEST_DEFINITIONS "-DPRINTF_LL_WIDTH")
   if (${HDF_PREFIX}_SIZEOF_LONG_LONG)
     set (CURRENT_TEST_DEFINITIONS "${CURRENT_TEST_DEFINITIONS} -DHAVE_LONG_LONG")
-  endif (${HDF_PREFIX}_SIZEOF_LONG_LONG)
+  endif ()
   TRY_RUN (${HDF_PREFIX}_PRINTF_LL_TEST_RUN   ${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE
       ${CMAKE_BINARY_DIR}
       ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
@@ -717,24 +744,24 @@ if (NOT ${HDF_PREFIX}_PRINTF_LL_WIDTH OR ${HDF_PREFIX}_PRINTF_LL_WIDTH MATCHES "
       string(REGEX REPLACE ".*PRINTF_LL_WIDTH=\\[(.*)\\].*" "\\1" ${HDF_PREFIX}_PRINTF_LL "${OUTPUT}")
       set (${HDF_PREFIX}_PRINTF_LL_WIDTH "\"${${HDF_PREFIX}_PRINTF_LL}\"" CACHE INTERNAL "Width for printf for type `long long' or `__int64', us. `ll")
       set (PRINT_LL_FOUND 1)
-    else (${HDF_PREFIX}_PRINTF_LL_TEST_RUN MATCHES 0)
+    else ()
       message ("Width test failed with result: ${${HDF_PREFIX}_PRINTF_LL_TEST_RUN}")
-    endif (${HDF_PREFIX}_PRINTF_LL_TEST_RUN MATCHES 0)
-  else (${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE)
+    endif ()
+  else ()
     file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
         "Test ${HDF_PREFIX}_PRINTF_LL_WIDTH failed with the following output:\n ${OUTPUT}\n"
     )
-  endif (${HDF_PREFIX}_PRINTF_LL_TEST_COMPILE)
+  endif ()
 
   if (PRINT_LL_FOUND)
     message (STATUS "Checking for appropriate format for 64 bit long: found ${${HDF_PREFIX}_PRINTF_LL_WIDTH}")
-  else (PRINT_LL_FOUND)
+  else ()
     message (STATUS "Checking for appropriate format for 64 bit long: not found")
     set (${HDF_PREFIX}_PRINTF_LL_WIDTH "\"unknown\"" CACHE INTERNAL
         "Width for printf for type `long long' or `__int64', us. `ll"
     )
-  endif (PRINT_LL_FOUND)
-endif (NOT ${HDF_PREFIX}_PRINTF_LL_WIDTH OR ${HDF_PREFIX}_PRINTF_LL_WIDTH MATCHES "unknown")
+  endif ()
+endif ()
 
 # ----------------------------------------------------------------------
 # Set the flag to indicate that the machine can handle converting
diff --git a/config/cmake_ext_mod/FindMPI.cmake b/config/cmake_ext_mod/FindMPI.cmake
index 1c9a2e3..ff1ead2 100644
--- a/config/cmake_ext_mod/FindMPI.cmake
+++ b/config/cmake_ext_mod/FindMPI.cmake
@@ -1,3 +1,5 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See https://cmake.org/licensing for details.
+
 #.rst:
 # FindMPI
 # -------
@@ -11,7 +13,8 @@
 # of them have somewhat different include paths, libraries to link
 # against, etc., and this module tries to smooth out those differences.
 #
-# === Variables ===
+# Variables
+# ^^^^^^^^^
 #
 # This module will set the following variables per language in your
 # project, where <lang> is one of C, CXX, or Fortran:
@@ -37,11 +40,12 @@
 #                               before the executable to run.
 #    MPIEXEC_POSTFLAGS          Flags to pass to MPIEXEC after other flags
 #
-# === Usage ===
+# Usage
+# ^^^^^
 #
 # To use this module, simply call FindMPI from a CMakeLists.txt file, or
-# run find_package(MPI), then run CMake.  If you are happy with the
-# auto- detected configuration for your language, then you're done.  If
+# run ``find_package(MPI)``, then run CMake.  If you are happy with the
+# auto-detected configuration for your language, then you're done.  If
 # not, you have two options:
 #
 # ::
@@ -55,24 +59,25 @@
 #       listed above, but these two are required.  This will circumvent
 #       autodetection entirely.
 #
-# When configuration is successful, MPI_<lang>_COMPILER will be set to
-# the compiler wrapper for <lang>, if it was found.  MPI_<lang>_FOUND
+# When configuration is successful, ``MPI_<lang>_COMPILER`` will be set to
+# the compiler wrapper for <lang>, if it was found.  ``MPI_<lang>_FOUND``
 # and other variables above will be set if any MPI implementation was
 # found for <lang>, regardless of whether a compiler was found.
 #
-# When using MPIEXEC to execute MPI applications, you should typically
-# use all of the MPIEXEC flags as follows:
+# When using ``MPIEXEC`` to execute MPI applications, you should typically
+# use all of the ``MPIEXEC`` flags as follows:
 #
 # ::
 #
 #    ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} PROCS
 #      ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS
 #
-# where PROCS is the number of processors on which to execute the
-# program, EXECUTABLE is the MPI program, and ARGS are the arguments to
+# where ``PROCS`` is the number of processors on which to execute the
+# program, ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to
 # pass to the MPI program.
 #
-# === Backward Compatibility ===
+# Backward Compatibility
+# ^^^^^^^^^^^^^^^^^^^^^^
 #
 # For backward compatibility with older versions of FindMPI, these
 # variables are set, but deprecated:
@@ -83,22 +88,7 @@
 #    MPI_COMPILE_FLAGS   MPI_INCLUDE_PATH    MPI_EXTRA_LIBRARY
 #    MPI_LINK_FLAGS      MPI_LIBRARIES
 #
-# In new projects, please use the MPI_<lang>_XXX equivalents.
-
-#=============================================================================
-# Copyright 2001-2011 Kitware, Inc.
-# Copyright 2010-2011 Todd Gamblin tgamblin at llnl.gov
-# Copyright 2001-2009 Dave Partyka
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
+# In new projects, please use the ``MPI_<lang>_XXX`` equivalents.
 
 # include this to handle the QUIETLY and REQUIRED arguments
 include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
@@ -124,9 +114,10 @@ include(GetPrerequisites)
 #
 
 # Start out with the generic MPI compiler names, as these are most commonly used.
-set(_MPI_C_COMPILER_NAMES                  mpicc    mpcc      mpicc_r mpcc_r)
+set(_MPI_C_COMPILER_NAMES                  mpicc    mpcc      mpicc_r mpcc_r  mpicc.bat)
 set(_MPI_CXX_COMPILER_NAMES                mpicxx   mpiCC     mpcxx   mpCC    mpic++   mpc++
-                                           mpicxx_r mpiCC_r   mpcxx_r mpCC_r  mpic++_r mpc++_r)
+                                           mpicxx_r mpiCC_r   mpcxx_r mpCC_r  mpic++_r mpc++_r
+                                           mpicxx.bat)
 set(_MPI_Fortran_COMPILER_NAMES            mpif95   mpif95_r  mpf95   mpf95_r
                                            mpif90   mpif90_r  mpf90   mpf90_r
                                            mpif77   mpif77_r  mpf77   mpf77_r)
@@ -138,9 +129,9 @@ set(_MPI_GNU_Fortran_COMPILER_NAMES        mpigfortran mpgfortran mpigfortran_r
                                            mpig77 mpig77_r mpg77 mpg77_r)
 
 # Intel MPI compiler names
-set(_MPI_Intel_C_COMPILER_NAMES            mpiicc)
-set(_MPI_Intel_CXX_COMPILER_NAMES          mpiicpc  mpiicxx mpiic++ mpiiCC)
-set(_MPI_Intel_Fortran_COMPILER_NAMES      mpiifort mpiif95 mpiif90 mpiif77)
+set(_MPI_Intel_C_COMPILER_NAMES            mpiicc   mpiicc.bat)
+set(_MPI_Intel_CXX_COMPILER_NAMES          mpiicpc  mpiicxx mpiic++ mpiiCC  mpiicpc.bat)
+set(_MPI_Intel_Fortran_COMPILER_NAMES      mpiifort mpiif95 mpiif90 mpiif77 mpiifort.bat)
 
 # PGI compiler names
 set(_MPI_PGI_C_COMPILER_NAMES              mpipgcc mppgcc)
@@ -204,7 +195,7 @@ function (_mpi_check_compiler compiler options cmdvar resvar)
   # Intel MPI 5.0.1 will return a zero return code even when the
   # argument to the MPI compiler wrapper is unknown.  Attempt to
   # catch this case.
-  if("${cmdline}" MATCHES "undefined reference")
+  if(cmdline MATCHES "undefined reference" OR cmdline MATCHES "unrecognized")
     set(success 255 )
   endif()
   set(${cmdvar} "${cmdline}" PARENT_SCOPE)
@@ -324,6 +315,7 @@ function (interrogate_mpi_compiler lang try_libs)
         set(MPI_COMPILE_FLAGS_WORK)
 
         foreach(FLAG ${MPI_ALL_COMPILE_FLAGS})
+          string(REGEX REPLACE "^ " "" FLAG ${FLAG})
           if (MPI_COMPILE_FLAGS_WORK)
             set(MPI_COMPILE_FLAGS_WORK "${MPI_COMPILE_FLAGS_WORK} ${FLAG}")
           else()
@@ -333,9 +325,13 @@ function (interrogate_mpi_compiler lang try_libs)
 
         # Extract include paths from compile command line
         string(REGEX MATCHALL "(^| )-I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}")
+        set(MPI_INCLUDE_PATH_WORK)
+
         foreach(IPATH ${MPI_ALL_INCLUDE_PATHS})
           string(REGEX REPLACE "^ ?-I" "" IPATH ${IPATH})
           string(REPLACE "//" "/" IPATH ${IPATH})
+          string(REPLACE "\"" "" IPATH ${IPATH})
+          file(TO_CMAKE_PATH "${IPATH}" IPATH)
           list(APPEND MPI_INCLUDE_PATH_WORK ${IPATH})
         endforeach()
 
@@ -355,10 +351,10 @@ function (interrogate_mpi_compiler lang try_libs)
         endif()
 
         # Extract linker paths from the link command line
-        string(REGEX MATCHALL "(^| |-Wl,)-L([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}")
+        string(REGEX MATCHALL "(^| |-Wl,)(-L|/LIBPATH:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}")
         set(MPI_LINK_PATH)
         foreach(LPATH ${MPI_ALL_LINK_PATHS})
-          string(REGEX REPLACE "^(| |-Wl,)-L" "" LPATH ${LPATH})
+          string(REGEX REPLACE "^(| |-Wl,)(-L|/LIBPATH:)" "" LPATH ${LPATH})
           string(REPLACE "//" "/" LPATH ${LPATH})
           list(APPEND MPI_LINK_PATH ${LPATH})
         endforeach()
@@ -373,6 +369,7 @@ function (interrogate_mpi_compiler lang try_libs)
         string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}")
         set(MPI_LINK_FLAGS_WORK)
         foreach(FLAG ${MPI_ALL_LINK_FLAGS})
+          string(REGEX REPLACE "^ " "" FLAG ${FLAG})
           if (MPI_LINK_FLAGS_WORK)
             set(MPI_LINK_FLAGS_WORK "${MPI_LINK_FLAGS_WORK} ${FLAG}")
           else()
@@ -383,20 +380,30 @@ function (interrogate_mpi_compiler lang try_libs)
         # Extract the set of libraries to link against from the link command
         # line
         string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}")
+        if(WIN32)
+          # The intel wrappers on windows link against static versions of the MPI libraries.
+          # The static libraries are simply listed on the command line without -l.
+          # For instance: " icl ... impi.lib "
+          string(REGEX MATCHALL "(^| )([^\" ]+)\\.lib" tmp "${MPI_LINK_CMDLINE}")
+          list(APPEND MPI_LIBNAMES ${tmp})
+        endif()
 
         # add the compiler implicit directories because some compilers
         # such as the intel compiler have libraries that show up
         # in the showme list that can only be found in the implicit
         # link directories of the compiler.
         if (DEFINED CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES)
-          set(MPI_LINK_PATH
-            "${MPI_LINK_PATH};${CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES}")
+          set(MPI_LINK_PATH "${MPI_LINK_PATH};${CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES}")
         endif ()
 
         # Determine full path names for all of the libraries that one needs
         # to link against in an MPI program
         foreach(LIB ${MPI_LIBNAMES})
           string(REGEX REPLACE "^ ?-l" "" LIB ${LIB})
+          if(WIN32)
+            string(REGEX REPLACE "\\.lib$" "" LIB ${LIB})
+          endif()
+          string(STRIP ${LIB} LIB)
           # MPI_LIB is cached by find_library, but we don't want that.  Clear it first.
           set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
           find_library(MPI_LIB NAMES ${LIB} HINTS ${MPI_LINK_PATH})
@@ -461,11 +468,11 @@ function (interrogate_mpi_compiler lang try_libs)
         set(MPI_HEADER_PATH "MPI_HEADER_PATH-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
         find_path(MPI_HEADER_PATH mpifptr.h
           HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}
-          PATH_SUFFIXES include include/${MS_MPI_ARCH_DIR} include/${MS_MPI_ARCH_DIR2} Inc Inc/${MS_MPI_ARCH_DIR} Inc/${MS_MPI_ARCH_DIR2})
+          PATH_SUFFIXES include Include include/${MS_MPI_ARCH_DIR} Include/${MS_MPI_ARCH_DIR2} Include/${MS_MPI_ARCH_DIR} include/${MS_MPI_ARCH_DIR2} Inc Inc/${MS_MPI_ARCH_DIR} Inc/${MS_MPI_ARCH_DIR2})
         if (MPI_INCLUDE_PATH_WORK AND MPI_HEADER_PATH)
           list(APPEND MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})
-        endif()
-        
+        endif ()
+
         set(MPI_LIB "MPI_LIB-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
         find_library(MPI_LIB
           NAMES         fmpi fmpich fmpich2 fmpich2g msmpifec msmpifmc
@@ -473,8 +480,8 @@ function (interrogate_mpi_compiler lang try_libs)
           PATH_SUFFIXES lib lib/${MS_MPI_ARCH_DIR} Lib Lib/${MS_MPI_ARCH_DIR})
         if (MPI_LIBRARIES_WORK AND MPI_LIB)
           list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})
-        endif()
-      endif()
+        endif ()
+      endif ()
 
       if (NOT MPI_LIBRARIES_WORK)
         set(MPI_LIBRARIES_WORK "MPI_${lang}_LIBRARIES-NOTFOUND")
@@ -597,14 +604,13 @@ foreach (lang C CXX Fortran)
   if (CMAKE_${lang}_COMPILER_WORKS)
     # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler.
     if (MPI_${lang}_COMPILER)
-      is_file_executable(MPI_${lang}_COMPILER MPI_COMPILER_IS_EXECUTABLE)
-      if (NOT MPI_COMPILER_IS_EXECUTABLE)
+      if (NOT IS_ABSOLUTE "${MPI_${lang}_COMPILER}")
         # Get rid of our default list of names and just search for the name the user wants.
         set(_MPI_${lang}_COMPILER_NAMES ${MPI_${lang}_COMPILER})
         set(MPI_${lang}_COMPILER "MPI_${lang}_COMPILER-NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
-        # If the user specifies a compiler, we don't want to try to search libraries either.
-        set(try_libs FALSE)
       endif()
+      # If the user specifies a compiler, we don't want to try to search libraries either.
+      set(try_libs FALSE)
     else()
       set(try_libs TRUE)
     endif()
@@ -624,6 +630,9 @@ foreach (lang C CXX Fortran)
       try_regular_compiler(${lang} regular_compiler_worked)
     endif()
 
+    # add fortran mpi module path if ENV VAR exists
+    set (MPI_${lang}_INCLUDE_PATH "${MPI_${lang}_INCLUDE_PATH};$ENV{MPI_FORTRAN_MOD_DIR}")
+
     set(MPI_${lang}_FIND_QUIETLY ${MPI_FIND_QUIETLY})
     set(MPI_${lang}_FIND_REQUIRED ${MPI_FIND_REQUIRED})
     set(MPI_${lang}_FIND_VERSION ${MPI_FIND_VERSION})
diff --git a/config/cmake_ext_mod/FindSZIP.cmake b/config/cmake_ext_mod/FindSZIP.cmake
index 5f0f031..699be85 100644
--- a/config/cmake_ext_mod/FindSZIP.cmake
+++ b/config/cmake_ext_mod/FindSZIP.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 # - Find SZIP library
 # - Derived from the FindTiff.cmake that is included with cmake
@@ -24,7 +35,7 @@
 # made to remove references to Qt and make this file more generally applicable
 #########################################################################
 
-MACRO (SZIP_ADJUST_LIB_VARS basename)
+macro (SZIP_ADJUST_LIB_VARS basename)
   if (${basename}_INCLUDE_DIR)
 
     # if only the release version was found, set the debug variable also to the release version
@@ -32,38 +43,37 @@ MACRO (SZIP_ADJUST_LIB_VARS basename)
       set (${basename}_LIBRARY_DEBUG ${${basename}_LIBRARY_RELEASE})
       set (${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE})
       set (${basename}_LIBRARIES     ${${basename}_LIBRARY_RELEASE})
-    endif (${basename}_LIBRARY_RELEASE AND NOT ${basename}_LIBRARY_DEBUG)
+    endif ()
 
     # if only the debug version was found, set the release variable also to the debug version
     if (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
       set (${basename}_LIBRARY_RELEASE ${${basename}_LIBRARY_DEBUG})
       set (${basename}_LIBRARY         ${${basename}_LIBRARY_DEBUG})
       set (${basename}_LIBRARIES       ${${basename}_LIBRARY_DEBUG})
-    endif (${basename}_LIBRARY_DEBUG AND NOT ${basename}_LIBRARY_RELEASE)
+    endif ()
     if (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
       # if the generator supports configuration types then set
       # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
       if (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
         set (${basename}_LIBRARY       optimized ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
-      else (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+      else ()
         # if there are no configuration types and CMAKE_BUILD_TYPE has no value
         # then just use the release libraries
         set (${basename}_LIBRARY       ${${basename}_LIBRARY_RELEASE} )
-      endif (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+      endif ()
       set (${basename}_LIBRARIES       optimized ${${basename}_LIBRARY_RELEASE} debug ${${basename}_LIBRARY_DEBUG})
-    endif (${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE)
+    endif ()
 
     set (${basename}_LIBRARY ${${basename}_LIBRARY} CACHE FILEPATH "The ${basename} library")
 
     if (${basename}_LIBRARY)
       set (${basename}_FOUND 1)
-    endif (${basename}_LIBRARY)
-
-  endif (${basename}_INCLUDE_DIR )
+    endif ()
+  endif ()
 
   # Make variables changeble to the advanced user
   MARK_AS_ADVANCED (${basename}_LIBRARY ${basename}_LIBRARY_RELEASE ${basename}_LIBRARY_DEBUG ${basename}_INCLUDE_DIR )
-ENDMACRO (SZIP_ADJUST_LIB_VARS)
+endmacro ()
 
 
 # Look for the header file.
@@ -93,10 +103,10 @@ FIND_PATH (SZIP_INCLUDE_DIR
 if (WIN32)
     set (SZIP_SEARCH_DEBUG_NAMES "sz_d;libsz_d")
     set (SZIP_SEARCH_RELEASE_NAMES "sz;libsz;libszip")
-else (WIN32)
+else ()
     set (SZIP_SEARCH_DEBUG_NAMES "sz_d")
     set (SZIP_SEARCH_RELEASE_NAMES "sz;szip")
-endif (WIN32)
+endif ()
 
 # Look for the library.
 FIND_LIBRARY (SZIP_LIBRARY_DEBUG
@@ -120,16 +130,15 @@ if (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
   if (SZIP_LIBRARY_DEBUG)
     get_filename_component (SZIP_LIBRARY_PATH ${SZIP_LIBRARY_DEBUG} PATH)
     set (SZIP_LIB_DIR  ${SZIP_LIBRARY_PATH})
-  elseif (SZIP_LIBRARY_RELEASE)
+  elseif ()
     get_filename_component (SZIP_LIBRARY_PATH ${SZIP_LIBRARY_RELEASE} PATH)
     set (SZIP_LIB_DIR  ${SZIP_LIBRARY_PATH})
-  endif (SZIP_LIBRARY_DEBUG)
-
-else (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
+  endif ()
+else ()
   set (SZIP_FOUND 0)
   set (SZIP_LIBRARIES)
   set (SZIP_INCLUDE_DIRS)
-endif (SZIP_INCLUDE_DIR AND SZIP_LIBRARY)
+endif ()
 
 # Report the results.
 if (NOT SZIP_FOUND)
@@ -138,12 +147,12 @@ if (NOT SZIP_FOUND)
   )
   if (NOT SZIP_FIND_QUIETLY)
     message (STATUS "${SZIP_DIR_MESSAGE}")
-  else (NOT SZIP_FIND_QUIETLY)
+  else ()
     if (SZIP_FIND_REQUIRED)
       message (FATAL_ERROR "SZip was NOT found and is Required by this project")
-    endif (SZIP_FIND_REQUIRED)
-  endif (NOT SZIP_FIND_QUIETLY)
-endif (NOT SZIP_FOUND)
+    endif ()
+  endif ()
+endif ()
 
 if (SZIP_FOUND)
   include (CheckSymbolExists)
@@ -161,7 +170,7 @@ if (SZIP_FOUND)
   set (CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})
   #
   #############################################
-endif (SZIP_FOUND)
+endif ()
 
 if (FIND_SZIP_DEBUG)
   message (STATUS "SZIP_INCLUDE_DIR: ${SZIP_INCLUDE_DIR}")
@@ -169,4 +178,4 @@ if (FIND_SZIP_DEBUG)
   message (STATUS "SZIP_LIBRARY_DEBUG: ${SZIP_LIBRARY_DEBUG}")
   message (STATUS "SZIP_LIBRARY_RELEASE: ${SZIP_LIBRARY_RELEASE}")
   message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
-endif (FIND_SZIP_DEBUG)
+endif ()
diff --git a/config/cmake_ext_mod/GetTimeOfDayTest.cpp b/config/cmake_ext_mod/GetTimeOfDayTest.cpp
index 3b5bf60..5fd7c04 100644
--- a/config/cmake_ext_mod/GetTimeOfDayTest.cpp
+++ b/config/cmake_ext_mod/GetTimeOfDayTest.cpp
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #if defined (TRY_SYS_TIME_H)
 #include <sys/time.h>
 /* #include <time.h> */
diff --git a/config/cmake_ext_mod/HDFCXXTests.cpp b/config/cmake_ext_mod/HDFCXXTests.cpp
index 6b47421..1b98092 100644
--- a/config/cmake_ext_mod/HDFCXXTests.cpp
+++ b/config/cmake_ext_mod/HDFCXXTests.cpp
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifdef OLD_HEADER_FILENAME
 
@@ -54,3 +65,38 @@ int main(void) {
 }
 
 #endif
+
+#ifdef CXX_HAVE_OFFSETOF
+
+#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;
+}
+
+#endif
diff --git a/config/cmake_ext_mod/HDFLibMacros.cmake b/config/cmake_ext_mod/HDFLibMacros.cmake
index 3f91405..f2e03d7 100644
--- a/config/cmake_ext_mod/HDFLibMacros.cmake
+++ b/config/cmake_ext_mod/HDFLibMacros.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-------------------------------------------------------------------------------
 macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
   # May need to build JPEG with PIC on x64 machines with gcc
@@ -17,11 +28,13 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
     )
   elseif (${compress_type} MATCHES "GIT")
     EXTERNALPROJECT_ADD (JPEG
         GIT_REPOSITORY ${JPEG_URL}
+        GIT_TAG ${JPEG_BRANCH}
         INSTALL_COMMAND ""
         CMAKE_ARGS
             -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
@@ -32,6 +45,7 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
     )
   elseif (${compress_type} MATCHES "TGZ")
@@ -48,9 +62,10 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${jpeg_pic}
     )
-  endif (${compress_type} MATCHES "SVN")
+  endif ()
   externalproject_get_property (JPEG BINARY_DIR SOURCE_DIR)
 
 ##include (${BINARY_DIR}/${JPEG_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
@@ -67,13 +82,13 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type jpeg_pic)
     add_dependencies (JPEG jpeg-shared)
     set (JPEG_SHARED_LIBRARY "jpeg-shared")
     set (JPEG_LIBRARIES ${JPEG_LIBRARIES} ${JPEG_shared_LIBRARY})
-  endif (BUILD_SHARED_LIBS)
+  endif ()
 
   set (JPEG_INCLUDE_DIR_GEN "${BINARY_DIR}")
   set (JPEG_INCLUDE_DIR "${SOURCE_DIR}/src")
   set (JPEG_FOUND 1)
   set (JPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIR_GEN} ${JPEG_INCLUDE_DIR})
-endmacro (EXTERNAL_JPEG_LIBRARY)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (PACKAGE_JPEG_LIBRARY compress_type)
@@ -82,10 +97,10 @@ macro (PACKAGE_JPEG_LIBRARY compress_type)
       COMMENT "Copying ${JPEG_INCLUDE_DIR_GEN}/jconfig.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
   )
   set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/jconfig.h)
-  if (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
     add_dependencies (JPEG-GenHeader-Copy JPEG)
-  endif (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
-endmacro (PACKAGE_JPEG_LIBRARY)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
@@ -103,13 +118,14 @@ macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
             -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
     )
   elseif (${compress_type} MATCHES "GIT")
     EXTERNALPROJECT_ADD (SZIP
         GIT_REPOSITORY ${SZIP_URL}
-        # [SVN_REVISION rev]
+        GIT_TAG ${SZIP_BRANCH}
         INSTALL_COMMAND ""
         CMAKE_ARGS
             -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
@@ -120,6 +136,7 @@ macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
             -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
     )
@@ -137,10 +154,11 @@ macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
             -DSZIP_ENABLE_ENCODING:BOOL=${encoding}
     )
-  endif (${compress_type} MATCHES "SVN")
+  endif ()
   externalproject_get_property (SZIP BINARY_DIR SOURCE_DIR)
 
 ##include (${BINARY_DIR}/${SZIP_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
@@ -157,13 +175,13 @@ macro (EXTERNAL_SZIP_LIBRARY compress_type encoding)
     add_dependencies (SZIP szip-shared)
     set (SZIP_SHARED_LIBRARY "szip-shared")
     set (SZIP_LIBRARIES ${SZIP_LIBRARIES} ${SZIP_shared_LIBRARY})
-  endif (BUILD_SHARED_LIBS)
+  endif ()
 
   set (SZIP_INCLUDE_DIR_GEN "${BINARY_DIR}")
   set (SZIP_INCLUDE_DIR "${SOURCE_DIR}/src")
   set (SZIP_FOUND 1)
   set (SZIP_INCLUDE_DIRS ${SZIP_INCLUDE_DIR_GEN} ${SZIP_INCLUDE_DIR})
-endmacro (EXTERNAL_SZIP_LIBRARY)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (PACKAGE_SZIP_LIBRARY compress_type)
@@ -172,10 +190,10 @@ macro (PACKAGE_SZIP_LIBRARY compress_type)
       COMMENT "Copying ${SZIP_INCLUDE_DIR_GEN}/SZconfig.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
   )
   set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/SZconfig.h)
-  if (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
     add_dependencies (SZIP-GenHeader-Copy SZIP)
-  endif (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
-endmacro (PACKAGE_SZIP_LIBRARY)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (EXTERNAL_ZLIB_LIBRARY compress_type)
@@ -193,12 +211,13 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
     )
   elseif (${compress_type} MATCHES "GIT")
     EXTERNALPROJECT_ADD (ZLIB
         GIT_REPOSITORY ${ZLIB_URL}
-        # [SVN_REVISION rev]
+        GIT_TAG ${ZLIB_BRANCH}
         INSTALL_COMMAND ""
         CMAKE_ARGS
             -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
@@ -209,6 +228,7 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
     )
   elseif (${compress_type} MATCHES "TGZ")
@@ -225,16 +245,17 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type)
             -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
             -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
             -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+            -DCMAKE_PDB_OUTPUT_DIRECTORY:PATH=${CMAKE_PDB_OUTPUT_DIRECTORY}
             -DCMAKE_ANSI_CFLAGS:STRING=${CMAKE_ANSI_CFLAGS}
     )
-  endif (${compress_type} MATCHES "SVN")
+  endif ()
   externalproject_get_property (ZLIB BINARY_DIR SOURCE_DIR)
 
   if (WIN32)
     set (ZLIB_LIB_NAME "zlib")
-  else (WIN32)
+  else ()
     set (ZLIB_LIB_NAME "z")
-  endif (WIN32)
+  endif ()
 ##include (${BINARY_DIR}/${ZLIB_PACKAGE_NAME}${HDF_PACKAGE_EXT}-targets.cmake)
 # Create imported target zlib-static
   add_library(zlib-static STATIC IMPORTED)
@@ -249,13 +270,13 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type)
     add_dependencies (ZLIB zlib-shared)
     set (ZLIB_SHARED_LIBRARY "zlib-shared")
     set (ZLIB_LIBRARIES ${ZLIB_LIBRARIES} ${ZLIB_SHARED_LIBRARY})
-  endif (BUILD_SHARED_LIBS)
+  endif ()
 
   set (ZLIB_INCLUDE_DIR_GEN "${BINARY_DIR}")
   set (ZLIB_INCLUDE_DIR "${SOURCE_DIR}")
   set (ZLIB_FOUND 1)
   set (ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR_GEN} ${ZLIB_INCLUDE_DIR})
-endmacro (EXTERNAL_ZLIB_LIBRARY)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (PACKAGE_ZLIB_LIBRARY compress_type)
@@ -264,7 +285,7 @@ macro (PACKAGE_ZLIB_LIBRARY compress_type)
       COMMENT "Copying ${ZLIB_INCLUDE_DIR_GEN}/zconf.h to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
   )
   set (EXTERNAL_HEADER_LIST ${EXTERNAL_HEADER_LIST} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/zconf.h)
-  if (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
+  if (${compress_type} MATCHES "GIT" OR ${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
     add_dependencies (ZLIB-GenHeader-Copy ZLIB)
-  endif (${compress_type} MATCHES "SVN" OR ${compress_type} MATCHES "TGZ")
-endmacro (PACKAGE_ZLIB_LIBRARY)
+  endif ()
+endmacro ()
diff --git a/config/cmake_ext_mod/HDFMacros.cmake b/config/cmake_ext_mod/HDFMacros.cmake
index b2c4997..48f57e6 100644
--- a/config/cmake_ext_mod/HDFMacros.cmake
+++ b/config/cmake_ext_mod/HDFMacros.cmake
@@ -1,7 +1,18 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 #-------------------------------------------------------------------------------
 macro (SET_GLOBAL_VARIABLE name value)
   set (${name} ${value} CACHE INTERNAL "Used to pass variables between directories" FORCE)
-endmacro (SET_GLOBAL_VARIABLE)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (IDE_GENERATED_PROPERTIES SOURCE_PATH HEADERS SOURCES)
@@ -14,7 +25,7 @@ macro (IDE_GENERATED_PROPERTIES SOURCE_PATH HEADERS SOURCES)
   #set_property (SOURCE ${HEADERS}
   #       PROPERTY MACOSX_PACKAGE_LOCATION Headers/${NAME}
   #)
-endmacro (IDE_GENERATED_PROPERTIES)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (IDE_SOURCE_PROPERTIES SOURCE_PATH HEADERS SOURCES)
@@ -31,45 +42,49 @@ macro (IDE_SOURCE_PROPERTIES SOURCE_PATH HEADERS SOURCES)
   #set_property (SOURCE ${HEADERS}
   #       PROPERTY MACOSX_PACKAGE_LOCATION Headers/${NAME}
   #)
-endmacro (IDE_SOURCE_PROPERTIES)
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (TARGET_NAMING libtarget libtype)
   if (${libtype} MATCHES "SHARED")
     set_target_properties (${libtarget} PROPERTIES OUTPUT_NAME "${libtarget}${ARGN}")
-  endif (${libtype} MATCHES "SHARED")
-endmacro (TARGET_NAMING)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (INSTALL_TARGET_PDB libtarget targetdestination targetcomponent)
   if (WIN32 AND MSVC)
-    get_target_property (target_name ${libtarget} OUTPUT_NAME_RELWITHDEBINFO)
+    get_target_property (target_type ${libtarget} TYPE)
+    if (${libtype} MATCHES "SHARED")
+      set (targetfilename $<TARGET_PDB_FILE:${libtarget}>)
+    else ()
+      get_property (target_name TARGET ${libtarget} PROPERTY OUTPUT_NAME_RELWITHDEBINFO)
+      set (targetfilename $<TARGET_FILE_DIR:${libtarget}>/${target_name}.pdb)
+    endif ()
     install (
       FILES
-          ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${target_name}.pdb
+          ${targetfilename}
       DESTINATION
           ${targetdestination}
       CONFIGURATIONS RelWithDebInfo
       COMPONENT ${targetcomponent}
   )
-  endif (WIN32 AND MSVC)
-endmacro (INSTALL_TARGET_PDB)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (INSTALL_PROGRAM_PDB progtarget targetdestination targetcomponent)
   if (WIN32 AND MSVC)
-    get_target_property (target_name ${progtarget} OUTPUT_NAME_RELWITHDEBINFO)
-    get_target_property (target_prefix ${progtarget} PREFIX)
     install (
       FILES
-          ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${target_prefix}${target_name}.pdb
+          $<TARGET_PDB_FILE:${progtarget}>
       DESTINATION
           ${targetdestination}
       CONFIGURATIONS RelWithDebInfo
       COMPONENT ${targetcomponent}
   )
-  endif (WIN32 AND MSVC)
-endmacro (INSTALL_PROGRAM_PDB)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (HDF_SET_LIB_OPTIONS libtarget libname libtype)
@@ -77,19 +92,19 @@ macro (HDF_SET_LIB_OPTIONS libtarget libname libtype)
     if (WIN32)
       set (LIB_RELEASE_NAME "${libname}")
       set (LIB_DEBUG_NAME "${libname}_D")
-    else (WIN32)
+    else ()
       set (LIB_RELEASE_NAME "${libname}")
       set (LIB_DEBUG_NAME "${libname}_debug")
-    endif (WIN32)
-  else (${libtype} MATCHES "SHARED")
+    endif ()
+  else ()
     if (WIN32)
       set (LIB_RELEASE_NAME "lib${libname}")
       set (LIB_DEBUG_NAME "lib${libname}_D")
-    else (WIN32)
+    else ()
       set (LIB_RELEASE_NAME "${libname}")
       set (LIB_DEBUG_NAME "${libname}_debug")
-    endif (WIN32)
-  endif (${libtype} MATCHES "SHARED")
+    endif ()
+  endif ()
 
   set_target_properties (${libtarget}
       PROPERTIES
@@ -98,6 +113,18 @@ macro (HDF_SET_LIB_OPTIONS libtarget libname libtype)
       OUTPUT_NAME_MINSIZEREL     ${LIB_RELEASE_NAME}
       OUTPUT_NAME_RELWITHDEBINFO ${LIB_RELEASE_NAME}
   )
+  if (${libtype} MATCHES "STATIC")
+    if (WIN32)
+      set_target_properties (${libtarget}
+          PROPERTIES
+          COMPILE_PDB_NAME_DEBUG          ${LIB_DEBUG_NAME}
+          COMPILE_PDB_NAME_RELEASE        ${LIB_RELEASE_NAME}
+          COMPILE_PDB_NAME_MINSIZEREL     ${LIB_RELEASE_NAME}
+          COMPILE_PDB_NAME_RELWITHDEBINFO ${LIB_RELEASE_NAME}
+          COMPILE_PDB_OUTPUT_DIRECTORY    "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
+      )
+    endif ()
+  endif ()
 
   #----- Use MSVC Naming conventions for Shared Libraries
   if (MINGW AND ${libtype} MATCHES "SHARED")
@@ -107,9 +134,8 @@ macro (HDF_SET_LIB_OPTIONS libtarget libname libtype)
         IMPORT_PREFIX ""
         PREFIX ""
     )
-  endif (MINGW AND ${libtype} MATCHES "SHARED")
-
-endmacro (HDF_SET_LIB_OPTIONS)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (HDF_IMPORT_SET_LIB_OPTIONS libtarget libname libtype libversion)
@@ -117,12 +143,12 @@ macro (HDF_IMPORT_SET_LIB_OPTIONS libtarget libname libtype libversion)
 
   if (${importtype} MATCHES "IMPORT")
     set (importprefix "${CMAKE_STATIC_LIBRARY_PREFIX}")
-  endif (${importtype} MATCHES "IMPORT")
+  endif ()
   if (${CMAKE_BUILD_TYPE} MATCHES "Debug")
     set (IMPORT_LIB_NAME ${LIB_DEBUG_NAME})
-  else (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+  else ()
     set (IMPORT_LIB_NAME ${LIB_RELEASE_NAME})
-  endif (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+  endif ()
 
   if (${libtype} MATCHES "SHARED")
     if (WIN32)
@@ -131,91 +157,74 @@ macro (HDF_IMPORT_SET_LIB_OPTIONS libtarget libname libtype libversion)
             IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${IMPORT_LIB_NAME}.lib"
             IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
         )
-      else (MINGW)
+      else ()
         set_target_properties (${libtarget} PROPERTIES
             IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}"
             IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
-         )
-      endif (MINGW)
-    else (WIN32)
+        )
+      endif ()
+    else ()
       if (CYGWIN)
         set_target_properties (${libtarget} PROPERTIES
             IMPORTED_IMPLIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}"
             IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_IMPORT_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
         )
-      else (CYGWIN)
+      else ()
         set_target_properties (${libtarget} PROPERTIES
             IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
             IMPORTED_SONAME "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}.${libversion}"
             SOVERSION "${libversion}"
         )
-      endif (CYGWIN)
-    endif (WIN32)
-  else (${libtype} MATCHES "SHARED")
+      endif ()
+    endif ()
+  else ()
     if (WIN32 AND NOT MINGW)
       set_target_properties (${libtarget} PROPERTIES
           IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${IMPORT_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
           IMPORTED_LINK_INTERFACE_LANGUAGES "C"
       )
-    else (WIN32 AND NOT MINGW)
+    else ()
       set_target_properties (${libtarget} PROPERTIES
           IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_STATIC_LIBRARY_PREFIX}${IMPORT_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
           IMPORTED_LINK_INTERFACE_LANGUAGES "C"
       )
-    endif (WIN32 AND NOT MINGW)
-  endif (${libtype} MATCHES "SHARED")
-
-endmacro (HDF_IMPORT_SET_LIB_OPTIONS)
+    endif ()
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (TARGET_C_PROPERTIES wintarget libtype addcompileflags addlinkflags)
   if (MSVC)
     TARGET_MSVC_PROPERTIES (${wintarget} ${libtype} "${addcompileflags} ${WIN_COMPILE_FLAGS}" "${addlinkflags} ${WIN_LINK_FLAGS}")
-  else (MSVC)
-    set_target_properties (${wintarget}
-        PROPERTIES
-            COMPILE_FLAGS "${addcompileflags}"
-            LINK_FLAGS "${addlinkflags}"
-    )
-  endif (MSVC)
-endmacro (TARGET_C_PROPERTIES)
+  else ()
+    set_target_properties (${wintarget} PROPERTIES COMPILE_FLAGS "${addcompileflags}" LINK_FLAGS "${addlinkflags}")
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (TARGET_MSVC_PROPERTIES wintarget libtype addcompileflags addlinkflags)
   if (MSVC)
-    set_target_properties (${wintarget}
-        PROPERTIES
-            COMPILE_FLAGS "${addcompileflags}"
-            LINK_FLAGS "${addlinkflags}"
-    )
-  endif (MSVC)
-endmacro (TARGET_MSVC_PROPERTIES)
+    set_target_properties (${wintarget} PROPERTIES COMPILE_FLAGS "${addcompileflags}" LINK_FLAGS "${addlinkflags}")
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (TARGET_FORTRAN_PROPERTIES forttarget libtype addcompileflags addlinkflags)
   if (WIN32)
     TARGET_FORTRAN_WIN_PROPERTIES (${forttarget} ${libtype} "${addcompileflags} ${WIN_COMPILE_FLAGS}" "${addlinkflags} ${WIN_LINK_FLAGS}")
-  endif (WIN32)
-endmacro (TARGET_FORTRAN_PROPERTIES)
+  endif ()
+endmacro ()
 
 #-------------------------------------------------------------------------------
 macro (TARGET_FORTRAN_WIN_PROPERTIES forttarget libtype addcompileflags addlinkflags)
   if (MSVC)
     if (${libtype} MATCHES "SHARED")
-      set_target_properties (${forttarget}
-          PROPERTIES
-              COMPILE_FLAGS "/dll ${addcompileflags}"
-              LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}"
-      )
-    else (${libtype} MATCHES "SHARED")
-      set_target_properties (${forttarget}
-          PROPERTIES
-              COMPILE_FLAGS "${addcompileflags}"
-              LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}"
-      )
-    endif (${libtype} MATCHES "SHARED")
-  endif (MSVC)
-endmacro (TARGET_FORTRAN_WIN_PROPERTIES)
+      set_target_properties (${forttarget} PROPERTIES COMPILE_FLAGS "/dll ${addcompileflags}" LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}")
+    else ()
+      set_target_properties (${forttarget} PROPERTIES COMPILE_FLAGS "${addcompileflags}" LINK_FLAGS "/SUBSYSTEM:CONSOLE ${addlinkflags}")
+    endif ()
+  endif ()
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Configure the README.txt file for the binary package
@@ -228,54 +237,66 @@ macro (HDF_README_PROPERTIES target_fortran)
     set (BINARY_INSTALL_ENDING "msi")
     if (CMAKE_CL_64)
       set (BINARY_SYSTEM_NAME "win64")
-    else (CMAKE_CL_64)
+    else ()
       set (BINARY_SYSTEM_NAME "win32")
-    endif (CMAKE_CL_64)
+    endif ()
     if (${CMAKE_SYSTEM_VERSION} MATCHES "6.1")
       set (BINARY_PLATFORM "${BINARY_PLATFORM} 7")
     elseif (${CMAKE_SYSTEM_VERSION} MATCHES "6.2")
       set (BINARY_PLATFORM "${BINARY_PLATFORM} 8")
     elseif (${CMAKE_SYSTEM_VERSION} MATCHES "6.3")
       set (BINARY_PLATFORM "${BINARY_PLATFORM} 10")
-    endif (${CMAKE_SYSTEM_VERSION} MATCHES "6.1")
+    endif ()
     set (BINARY_PLATFORM "${BINARY_PLATFORM} ${MSVC_C_ARCHITECTURE_ID}")
-    if (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+    if (${CMAKE_C_COMPILER_VERSION} MATCHES "^16.*")
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2010")
-    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "15.*")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "^15.*")
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2008")
-    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "17.*")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "^17.*")
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2012")
-    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "18.*")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "^18.*")
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2013")
-    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "19.*")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "^19.*")
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2015")
-    else (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+    elseif (${CMAKE_C_COMPILER_VERSION} MATCHES "^20.*")
+      set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO 2017")
+    else ()
       set (BINARY_PLATFORM "${BINARY_PLATFORM}, using VISUAL STUDIO ${CMAKE_C_COMPILER_VERSION}")
-    endif (${CMAKE_C_COMPILER_VERSION} MATCHES "16.*")
+    endif ()
   elseif (APPLE)
     set (BINARY_EXAMPLE_ENDING "tar.gz")
     set (BINARY_INSTALL_ENDING "dmg")
     set (BINARY_PLATFORM "${BINARY_PLATFORM} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
     set (BINARY_PLATFORM "${BINARY_PLATFORM}, using ${CMAKE_C_COMPILER_ID} C ${CMAKE_C_COMPILER_VERSION}")
-  else (WIN32)
+  else ()
     set (BINARY_EXAMPLE_ENDING "tar.gz")
     set (BINARY_INSTALL_ENDING "sh")
     set (BINARY_PLATFORM "${BINARY_PLATFORM} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
     set (BINARY_PLATFORM "${BINARY_PLATFORM}, using ${CMAKE_C_COMPILER_ID} C ${CMAKE_C_COMPILER_VERSION}")
-  endif (WIN32)
+  endif ()
 
   if (target_fortran)
     set (BINARY_PLATFORM "${BINARY_PLATFORM} / ${CMAKE_Fortran_COMPILER_ID} Fortran")
-  endif (target_fortran)
+  endif ()
 
   if (BUILD_SHARED_LIBS)
     set (LIB_TYPE "Static and Shared")
-  else (BUILD_SHARED_LIBS)
+  else ()
     set (LIB_TYPE "Static")
-  endif (BUILD_SHARED_LIBS)
+  endif ()
 
   configure_file (
       ${HDF_RESOURCES_DIR}/README.txt.cmake.in
       ${CMAKE_BINARY_DIR}/README.txt @ONLY
   )
-endmacro (HDF_README_PROPERTIES)
+endmacro ()
+
+macro (HDFTEST_COPY_FILE src dest target)
+    add_custom_command(
+        OUTPUT  "${dest}"
+        COMMAND "${CMAKE_COMMAND}"
+        ARGS     -E copy_if_different "${src}" "${dest}"
+        DEPENDS "${src}"
+    )
+    list (APPEND ${target}_list "${dest}")
+endmacro ()
diff --git a/config/cmake_ext_mod/HDFTests.c b/config/cmake_ext_mod/HDFTests.c
index 8478d1b..60ac744 100644
--- a/config/cmake_ext_mod/HDFTests.c
+++ b/config/cmake_ext_mod/HDFTests.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #define SIMPLE_TEST(x) int main(){ x; return 0; }
 
 #ifdef HAVE_C99_DESIGNATED_INITIALIZER
@@ -389,55 +400,20 @@ int main(void)
 }
 #endif
 
-#ifdef CXX_HAVE_OFFSETOF
-
-#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;
-}
-
-#endif
-
 #ifdef HAVE_IOEO
 
 #include <windows.h>
 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
 int main ()
 {
-	PGNSI pGNSI;
-	pGNSI = (PGNSI) GetProcAddress(
-      GetModuleHandle(TEXT("kernel32.dll")), 
+    PGNSI pGNSI;
+    pGNSI = (PGNSI) GetProcAddress(
+      GetModuleHandle(TEXT("kernel32.dll")),
       "InitOnceExecuteOnce");
-	if(NULL == pGNSI)
-		return 1;
-	else
-		return 0;
+    if(NULL == pGNSI)
+        return 1;
+    else
+        return 0;
 }
 
 #endif /* HAVE_IOEO */
diff --git a/config/cmake_ext_mod/HDFUseFortran.cmake b/config/cmake_ext_mod/HDFUseFortran.cmake
index 275f2ea..7bf4d81 100644
--- a/config/cmake_ext_mod/HDFUseFortran.cmake
+++ b/config/cmake_ext_mod/HDFUseFortran.cmake
@@ -1,4 +1,15 @@
 #
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+#
 # This file provides functions for Fortran support.
 #
 #-------------------------------------------------------------------------------
@@ -26,14 +37,14 @@ set (H5_FC_FUNC_ "H5_FC_FUNC_(name,NAME) ${CMAKE_MATCH_1}")
 # The provided CMake Fortran macros don't provide a general check function
 # so this one is used for a sizeof test.
 #-----------------------------------------------------------------------------
-MACRO (CHECK_FORTRAN_FEATURE FUNCTION CODE VARIABLE)
+macro (CHECK_FORTRAN_FEATURE FUNCTION CODE VARIABLE)
     message (STATUS "Testing Fortran ${FUNCTION}")
     if (CMAKE_REQUIRED_LIBRARIES)
       set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
           "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
-    else (CMAKE_REQUIRED_LIBRARIES)
+    else ()
       set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
-    endif (CMAKE_REQUIRED_LIBRARIES)
+    endif ()
     file (WRITE
         ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f90
         "${CODE}"
@@ -63,8 +74,7 @@ MACRO (CHECK_FORTRAN_FEATURE FUNCTION CODE VARIABLE)
           "Determining if the Fortran ${FUNCTION} exists failed with the following output:\n"
           "${OUTPUT}\n\n")
     endif ()
-
-ENDMACRO (CHECK_FORTRAN_FEATURE)
+endmacro ()
 
 #-----------------------------------------------------------------------------
 # Configure Checks which require Fortran compilation must go in here
@@ -75,7 +85,7 @@ ENDMACRO (CHECK_FORTRAN_FEATURE)
 #-----------------------------------------------------------------------------
 
 # Check for Non-standard extension intrinsic function SIZEOF
-set(FORTRAN_HAVE_SIZEOF FALSE)
+set (FORTRAN_HAVE_SIZEOF FALSE)
 CHECK_FORTRAN_FEATURE(sizeof
   "
        PROGRAM main
@@ -86,7 +96,7 @@ CHECK_FORTRAN_FEATURE(sizeof
 )
 
 # Check for F2008 standard intrinsic function C_SIZEOF
-set(FORTRAN_HAVE_C_SIZEOF FALSE)
+set (FORTRAN_HAVE_C_SIZEOF FALSE)
 CHECK_FORTRAN_FEATURE(c_sizeof
   "
        PROGRAM main
@@ -112,7 +122,7 @@ CHECK_FORTRAN_FEATURE(storage_size
 )
 
 # Check for F2008 standard intrinsic module "ISO_FORTRAN_ENV"
-set(HAVE_ISO_FORTRAN_ENV FALSE)
+set (HAVE_ISO_FORTRAN_ENV FALSE)
 CHECK_FORTRAN_FEATURE(ISO_FORTRAN_ENV
   "
        PROGRAM main
@@ -122,7 +132,7 @@ CHECK_FORTRAN_FEATURE(ISO_FORTRAN_ENV
   HAVE_ISO_FORTRAN_ENV
 )
 
-set(FORTRAN_DEFAULT_REAL_NOT_DOUBLE FALSE)
+set (FORTRAN_DEFAULT_REAL_NOT_DOUBLE FALSE)
 CHECK_FORTRAN_FEATURE(RealIsNotDouble
   "
        MODULE type_mod
@@ -152,7 +162,7 @@ CHECK_FORTRAN_FEATURE(RealIsNotDouble
 #-----------------------------------------------------------------------------
 # Checks if the ISO_C_BINDING module meets all the requirements
 #-----------------------------------------------------------------------------
-set(FORTRAN_HAVE_ISO_C_BINDING FALSE)
+set (FORTRAN_HAVE_ISO_C_BINDING FALSE)
 CHECK_FORTRAN_FEATURE(iso_c_binding
   "
        PROGRAM main
@@ -175,5 +185,5 @@ if (CMAKE_Fortran_COMPILER MATCHES ifort)
     if (WIN32)
         set (CMAKE_Fortran_FLAGS_DEBUG "/debug:full /dbglibs " CACHE "flags" STRING FORCE)
         set (CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE "flags" STRING FORCE)
-    endif (WIN32)
-endif (CMAKE_Fortran_COMPILER MATCHES ifort)
+    endif ()
+endif ()
diff --git a/config/cmake_ext_mod/grepTest.cmake b/config/cmake_ext_mod/grepTest.cmake
index a090057..5b0e8fd 100644
--- a/config/cmake_ext_mod/grepTest.cmake
+++ b/config/cmake_ext_mod/grepTest.cmake
@@ -1,28 +1,39 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # grepTest.cmake executes a command and captures the output in a file. File is then compared
 # against a reference file. Exit status of command can also be compared.
 
 # arguments checking
 if (NOT TEST_PROGRAM)
   message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
-endif (NOT TEST_PROGRAM)
+endif ()
 #if (NOT TEST_ARGS)
 #  message (STATUS "Require TEST_ARGS to be defined")
-#endif (NOT TEST_ARGS)
+#endif ()
 if (NOT TEST_FOLDER)
   message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
+endif ()
 if (NOT TEST_OUTPUT)
   message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
-endif (NOT TEST_OUTPUT)
+endif ()
 #if (NOT TEST_EXPECT)
 #  message (STATUS "Require TEST_EXPECT to be defined")
-#endif (NOT TEST_EXPECT)
+#endif ()
 if (NOT TEST_FILTER)
   message (STATUS "Require TEST_FILTER to be defined")
-endif (NOT TEST_FILTER)
+endif ()
 if (NOT TEST_REFERENCE)
   message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
-endif (NOT TEST_REFERENCE)
+endif ()
 
 message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
 
@@ -48,7 +59,7 @@ string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM})
 string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_RESULT)
 if (${TEST_RESULT} STREQUAL "0")
   message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}")
-endif (${TEST_RESULT} STREQUAL "0")
+endif ()
 
 string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM})
 if (${TEST_EXPECT} STREQUAL "1")
@@ -56,8 +67,8 @@ if (${TEST_EXPECT} STREQUAL "1")
   string (LENGTH "${TEST_MATCH}" TEST_RESULT)
   if (NOT ${TEST_RESULT} STREQUAL "0")
     message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}")
-  endif (NOT ${TEST_RESULT} STREQUAL "0")
-endif (${TEST_EXPECT} STREQUAL "1")
+  endif ()
+endif ()
 
 # everything went fine...
 message ("Passed: The output of ${TEST_PROGRAM} matched")
diff --git a/config/cmake_ext_mod/prunTest.cmake b/config/cmake_ext_mod/prunTest.cmake
deleted file mode 100644
index 38ecb7e..0000000
--- a/config/cmake_ext_mod/prunTest.cmake
+++ /dev/null
@@ -1,145 +0,0 @@
-# runTest.cmake executes a command and captures the output in a file. File is then compared
-# against a reference file. Exit status of command can also be compared.
-cmake_policy(SET CMP0007 NEW)
-
-# arguments checking
-if (NOT TEST_PROGRAM)
-  message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
-endif (NOT TEST_PROGRAM)
-#if (NOT TEST_ARGS)
-#  message (STATUS "Require TEST_ARGS to be defined")
-#endif (NOT TEST_ARGS)
-if (NOT TEST_FOLDER)
-  message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
-if (NOT TEST_OUTPUT)
-  message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
-endif (NOT TEST_OUTPUT)
-#if (NOT TEST_EXPECT)
-#  message (STATUS "Require TEST_EXPECT to be defined")
-#endif (NOT TEST_EXPECT)
-#if (NOT TEST_FILTER)
-#  message (STATUS "Require TEST_FILTER to be defined")
-#endif (NOT TEST_FILTER)
-if (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
-  message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
-endif (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
-
-set (ERROR_APPEND 1)
-
-message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
-
-if (TEST_ENV_VAR)
-  set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}")
-endif (TEST_ENV_VAR)
-
-# run the test program, capture the stdout/stderr and the result var
-EXECUTE_PROCESS (
-    COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
-    WORKING_DIRECTORY ${TEST_FOLDER}
-    RESULT_VARIABLE TEST_RESULT
-    OUTPUT_FILE ${TEST_OUTPUT}
-    ERROR_FILE ${TEST_OUTPUT}.err
-    OUTPUT_VARIABLE TEST_OUT
-    ERROR_VARIABLE TEST_ERROR
-)
-
-message (STATUS "COMMAND Result: ${TEST_RESULT}")
-
-file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
-file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
-
-if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
-  file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
-  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
-
-if (TEST_APPEND)
-  file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_ERROR}\n")
-endif (TEST_APPEND)
-
-message (STATUS "COMMAND Error: ${TEST_ERROR}")
-
-if (TEST_MASK)
-  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  STRING(REGEX REPLACE "Storage:[^\n]+\n" "Storage:   <details removed for portability>\n" TEST_STREAM "${TEST_STREAM}")
-  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_MASK)
-
-if (TEST_MASK_MOD)
-  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  STRING(REGEX REPLACE "Modified:[^\n]+\n" "Modified:  XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}")
-  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_MASK_MOD)
-
-if (TEST_MASK_ERROR)
-  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  STRING(REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE " line [0-9]*" " line (number)" TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE "v[1-9]*[.][0-9]*[.]" "version (number)." TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE "H5Eget_auto[1-2]*" "H5Eget_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
-  STRING(REGEX REPLACE "H5Eset_auto[1-2]*" "H5Eset_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}")
-  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_MASK_ERROR)
-
-if (TEST_FILTER)
-  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  STRING(REGEX REPLACE "${TEST_FILTER}" "" TEST_STREAM "${TEST_STREAM}")
-  file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_FILTER)
-
-#if (TEST_REF_FILTER)
-#  message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}")
-#  file (READ ${TEST_FOLDER}/P_${TEST_REFERENCE} TEST_STREAM)
-#  STRING(REGEX REPLACE "${TEST_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}")
-#  file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
-#endif (TEST_REF_FILTER)
-
-if (NOT TEST_SKIP_COMPARE)
-  if (WIN32 AND NOT MINGW)
-    file (READ ${TEST_FOLDER}/P_${TEST_REFERENCE} TEST_STREAM)
-    file (WRITE ${TEST_FOLDER}/P_${TEST_REFERENCE} "${TEST_STREAM}")
-  endif (WIN32 AND NOT MINGW)
-
-  # now compare the output with the reference
-  EXECUTE_PROCESS (
-      COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/P_${TEST_REFERENCE}
-      RESULT_VARIABLE TEST_RESULT
-  )
-  if (NOT ${TEST_RESULT} STREQUAL 0)
-  set (TEST_RESULT 0)
-  file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
-  LIST (LENGTH test_act len_act)
-  file (STRINGS ${TEST_FOLDER}/P_${TEST_REFERENCE} test_ref)
-  LIST (LENGTH test_ref len_ref)
-  if (NOT ${len_act} STREQUAL "0")
-    MATH (EXPR _FP_LEN "${len_ref} - 1")
-    foreach (line RANGE 0 ${_FP_LEN})
-      LIST (GET test_act ${line} str_act)
-      LIST (GET test_ref ${line} str_ref)
-      if (NOT "${str_act}" STREQUAL "${str_ref}")
-        if (NOT "${str_act}" STREQUAL "")
-          set (TEST_RESULT 1)
-          message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
-         endif (NOT "${str_act}" STREQUAL "")
-      endif (NOT "${str_act}" STREQUAL "${str_ref}")
-    endforeach (line RANGE 0 ${_FP_LEN})
-  endif (NOT ${len_act} STREQUAL "0")
-  if (NOT ${len_act} STREQUAL ${len_ref})
-    set (TEST_RESULT 1)
-  endif (NOT ${len_act} STREQUAL ${len_ref})
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
-
-  message (STATUS "COMPARE Result: ${TEST_RESULT}")
-
-  # again, if return value is !=0 scream and shout
-  if (NOT ${TEST_RESULT} STREQUAL 0)
-    message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match P_${TEST_REFERENCE}")
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
-endif (NOT TEST_SKIP_COMPARE)
-
-# everything went fine...
-message ("Passed: The output of ${TEST_PROGRAM} matches P_${TEST_REFERENCE}")
-
diff --git a/config/cmake_ext_mod/runTest.cmake b/config/cmake_ext_mod/runTest.cmake
index 21a65e6..3a02614 100644
--- a/config/cmake_ext_mod/runTest.cmake
+++ b/config/cmake_ext_mod/runTest.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 # runTest.cmake executes a command and captures the output in a file. File is then compared
 # against a reference file. Exit status of command can also be compared.
 cmake_policy(SET CMP0007 NEW)
@@ -5,36 +16,46 @@ cmake_policy(SET CMP0007 NEW)
 # arguments checking
 if (NOT TEST_PROGRAM)
   message (FATAL_ERROR "Require TEST_PROGRAM to be defined")
-endif (NOT TEST_PROGRAM)
-#if (NOT TEST_ARGS)
-#  message (STATUS "Require TEST_ARGS to be defined")
-#endif (NOT TEST_ARGS)
+endif ()
 if (NOT TEST_FOLDER)
   message ( FATAL_ERROR "Require TEST_FOLDER to be defined")
-endif (NOT TEST_FOLDER)
+endif ()
 if (NOT TEST_OUTPUT)
   message (FATAL_ERROR "Require TEST_OUTPUT to be defined")
-endif (NOT TEST_OUTPUT)
+endif ()
 if (NOT TEST_EXPECT)
   message (STATUS "Require TEST_EXPECT to be defined")
-endif (NOT TEST_EXPECT)
-#if (NOT TEST_FILTER)
-#  message (STATUS "Require TEST_FILTER to be defined")
-#endif (NOT TEST_FILTER)
+endif ()
 if (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
   message (FATAL_ERROR "Require TEST_REFERENCE to be defined")
-endif (NOT TEST_SKIP_COMPARE AND NOT TEST_REFERENCE)
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT})
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT})
+endif ()
+
+if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+  file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+endif ()
 
 # if there is not an error reference file add the error output to the stdout file
 if (NOT TEST_ERRREF)
   set (ERROR_APPEND 1)
-endif (NOT TEST_ERRREF)
+endif ()
 
 message (STATUS "COMMAND: ${TEST_PROGRAM} ${TEST_ARGS}")
 
+if (TEST_LIBRARY_DIRECTORY)
+  if (WIN32 AND NOT MINGW)
+    set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}")
+  else ()
+    set (ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}")
+  endif ()
+endif ()
+
 if (TEST_ENV_VAR)
   set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}")
-endif (TEST_ENV_VAR)
+endif ()
 
 if (NOT TEST_INPUT)
   # run the test program, capture the stdout/stderr and the result var
@@ -47,7 +68,7 @@ if (NOT TEST_INPUT)
       OUTPUT_VARIABLE TEST_OUT
       ERROR_VARIABLE TEST_ERROR
   )
-else (NOT TEST_INPUT)
+else ()
   # run the test program with stdin, capture the stdout/stderr and the result var
   execute_process (
       COMMAND ${TEST_PROGRAM} ${TEST_ARGS}
@@ -59,7 +80,17 @@ else (NOT TEST_INPUT)
       OUTPUT_VARIABLE TEST_OUT
       ERROR_VARIABLE TEST_ERROR
   )
-endif (NOT TEST_INPUT)
+endif ()
+
+if (TEST_REGEX)
+  # TEST_REGEX should always be matched
+  file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+  string (REGEX MATCH "${TEST_REGEX}" REGEX_MATCH ${TEST_STREAM})
+  string (COMPARE EQUAL "${REGEX_MATCH}" "${TEST_MATCH}" REGEX_RESULT)
+  if (${REGEX_RESULT} STREQUAL "0")
+    message (STATUS "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_MATCH}")
+  endif ()
+endif ()
 
 message (STATUS "COMMAND Result: ${TEST_RESULT}")
 
@@ -67,33 +98,39 @@ message (STATUS "COMMAND Result: ${TEST_RESULT}")
 if (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM)
   file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (ERROR_APPEND AND EXISTS ${TEST_FOLDER}/${TEST_OUTPUT}.err)
+endif ()
 
 # append the test result status with a predefined text
 if (TEST_APPEND)
   file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n")
-endif (TEST_APPEND)
+endif ()
 
 # if the return value is !=${TEST_EXPECT} bail out
 if (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
-  message ( FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
-endif (NOT ${TEST_RESULT} STREQUAL ${TEST_EXPECT})
+  if (NOT TEST_NOERRDISPLAY)
+    if (EXISTS ${TEST_FOLDER}/${TEST_OUTPUT})
+      file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
+      message (STATUS "Output :\n${TEST_STREAM}")
+    endif ()
+  endif ()
+  message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}")
+endif ()
 
 message (STATUS "COMMAND Error: ${TEST_ERROR}")
 
 # if the output file needs Storage text removed
 if (TEST_MASK)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-   string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:   <details removed for portability>\n" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:   <details removed for portability>\n" TEST_STREAM "${TEST_STREAM}")
   file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_MASK)
+endif ()
 
 # if the output file needs Modified text removed
 if (TEST_MASK_MOD)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
    string (REGEX REPLACE "Modified:[^\n]+\n" "Modified:  XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}")
   file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_MASK_MOD)
+endif ()
 
 # if the output file or the .err file needs to mask out error stack info
 if (TEST_MASK_ERROR)
@@ -117,64 +154,89 @@ if (TEST_MASK_ERROR)
   else ()
     file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}")
   endif ()
-endif (TEST_MASK_ERROR)
+endif ()
 
 # remove text from the output file
 if (TEST_FILTER)
   file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM)
-  string (REGEX REPLACE "${TEST_FILTER}" "" TEST_STREAM "${TEST_STREAM}")
+  string (REGEX REPLACE "${TEST_FILTER}" "${TEST_FILTER_REPLACE}" TEST_STREAM "${TEST_STREAM}")
   file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}")
-endif (TEST_FILTER)
+endif ()
+
+if (TEST_REF_FILTER)
+  #message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}")
+  file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
+  STRING(REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}")
+  file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}")
+endif ()
 
 # compare output files to references unless this must be skipped
 if (NOT TEST_SKIP_COMPARE)
   if (WIN32 AND NOT MINGW)
     file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM)
     file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}")
-  endif (WIN32 AND NOT MINGW)
+  endif ()
+
+  if (NOT TEST_SORT_COMPARE)
+    # now compare the output with the reference
+    execute_process (
+        COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE}
+        RESULT_VARIABLE TEST_RESULT
+    )
+  else ()
+    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1)
+    file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2)
+    list (SORT v1)
+    list (SORT v2)
+    if (NOT v1 STREQUAL v2)
+      set(TEST_RESULT 1)
+    endif ()
+  endif ()
 
-  # now compare the output with the reference
-  execute_process (
-      COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE}
-      RESULT_VARIABLE TEST_RESULT
-  )
   if (NOT ${TEST_RESULT} STREQUAL 0)
-  set (TEST_RESULT 0)
-  file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
-  list (LENGTH test_act len_act)
-  file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref)
-  list (LENGTH test_ref len_ref)
-  if (NOT ${len_act} STREQUAL "0")
-    math (EXPR _FP_LEN "${len_ref} - 1")
-    foreach (line RANGE 0 ${_FP_LEN})
-      list (GET test_act ${line} str_act)
-      list (GET test_ref ${line} str_ref)
-      if (NOT "${str_act}" STREQUAL "${str_ref}")
-        if (NOT "${str_act}" STREQUAL "")
-          set (TEST_RESULT 1)
-          message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
-         endif (NOT "${str_act}" STREQUAL "")
-      endif (NOT "${str_act}" STREQUAL "${str_ref}")
-    endforeach (line RANGE 0 ${_FP_LEN})
-  endif (NOT ${len_act} STREQUAL "0")
-  if (NOT ${len_act} STREQUAL ${len_ref})
-    set (TEST_RESULT 1)
-  endif (NOT ${len_act} STREQUAL ${len_ref})
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
+    set (TEST_RESULT 0)
+    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act)
+    list (LENGTH test_act len_act)
+    file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref)
+    list (LENGTH test_ref len_ref)
+    if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+      math (EXPR _FP_LEN "${len_ref} - 1")
+      foreach (line RANGE 0 ${_FP_LEN})
+        list (GET test_act ${line} str_act)
+        list (GET test_ref ${line} str_ref)
+        if (NOT "${str_act}" STREQUAL "${str_ref}")
+          if (NOT "${str_act}" STREQUAL "")
+            set (TEST_RESULT 1)
+            message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+          endif ()
+        endif ()
+      endforeach ()
+    else ()
+      if (${len_act} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty")
+      endif ()
+      if (${len_ref} STREQUAL "0")
+        message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty")
+      endif ()
+    endif ()
+    if (NOT ${len_act} STREQUAL ${len_ref})
+      set (TEST_RESULT 1)
+    endif ()
+  endif ()
 
   message (STATUS "COMPARE Result: ${TEST_RESULT}")
 
   # again, if return value is !=0 scream and shout
   if (NOT ${TEST_RESULT} STREQUAL 0)
     message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}")
-  endif (NOT ${TEST_RESULT} STREQUAL 0)
+  endif ()
 
   # now compare the .err file with the error reference, if supplied
   if (TEST_ERRREF)
     if (WIN32 AND NOT MINGW)
       file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM)
       file (WRITE ${TEST_FOLDER}/${TEST_ERRREF} "${TEST_STREAM}")
-    endif (WIN32 AND NOT MINGW)
+    endif ()
 
     # now compare the error output with the error reference
     execute_process (
@@ -182,38 +244,45 @@ if (NOT TEST_SKIP_COMPARE)
         RESULT_VARIABLE TEST_RESULT
     )
     if (NOT ${TEST_RESULT} STREQUAL 0)
-    set (TEST_RESULT 0)
-    file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act)
-    list (LENGTH test_act len_act)
-    file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref)
-    list (LENGTH test_ref len_ref)
-    math (EXPR _FP_LEN "${len_ref} - 1")
-    if (NOT ${len_act} STREQUAL "0")
+      set (TEST_RESULT 0)
+      file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act)
+      list (LENGTH test_act len_act)
+      file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref)
+      list (LENGTH test_ref len_ref)
       math (EXPR _FP_LEN "${len_ref} - 1")
-      foreach (line RANGE 0 ${_FP_LEN})
-        list (GET test_act ${line} str_act)
-        list (GET test_ref ${line} str_ref)
-        if (NOT "${str_act}" STREQUAL "${str_ref}")
-          if (NOT "${str_act}" STREQUAL "")
-            set (TEST_RESULT 1)
-            message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
-           endif (NOT "${str_act}" STREQUAL "")
-        endif (NOT "${str_act}" STREQUAL "${str_ref}")
-      endforeach (line RANGE 0 ${_FP_LEN})
-    endif (NOT ${len_act} STREQUAL "0")
-    if (NOT ${len_act} STREQUAL ${len_ref})
-      set (TEST_RESULT 1)
-    endif (NOT ${len_act} STREQUAL ${len_ref})
-    endif (NOT ${TEST_RESULT} STREQUAL 0)
+      if (NOT ${len_act} STREQUAL "0" AND NOT ${len_ref} STREQUAL "0")
+        math (EXPR _FP_LEN "${len_ref} - 1")
+        foreach (line RANGE 0 ${_FP_LEN})
+          list (GET test_act ${line} str_act)
+          list (GET test_ref ${line} str_ref)
+          if (NOT "${str_act}" STREQUAL "${str_ref}")
+            if (NOT "${str_act}" STREQUAL "")
+              set (TEST_RESULT 1)
+              message ("line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n")
+             endif ()
+          endif ()
+        endforeach ()
+      else ()
+        if (${len_act} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty")
+        endif ()
+        if (${len_ref} STREQUAL "0")
+          message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty")
+        endif ()
+      endif ()
+      if (NOT ${len_act} STREQUAL ${len_ref})
+        set (TEST_RESULT 1)
+      endif ()
+    endif ()
 
     message (STATUS "COMPARE Result: ${TEST_RESULT}")
 
     # again, if return value is !=0 scream and shout
     if (NOT ${TEST_RESULT} STREQUAL 0)
       message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}")
-    endif (NOT ${TEST_RESULT} STREQUAL 0)
-  endif (TEST_ERRREF)
-endif (NOT TEST_SKIP_COMPARE)
+    endif ()
+  endif ()
+endif ()
 
 # everything went fine...
 message ("Passed: The output of ${TEST_PROGRAM} matches ${TEST_REFERENCE}")
diff --git a/config/commence.am b/config/commence.am
index 1a26a85..5fe21a6 100644
--- a/config/commence.am
+++ b/config/commence.am
@@ -7,12 +7,10 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## If you do not have access to either file, you may request a copy from
+## help at hdfgroup.org.
 
 
 ## Textually included in the beginning of every HDF5 Makefile.am
diff --git a/config/conclude.am b/config/conclude.am
index 1ba56fb..55b805a 100644
--- a/config/conclude.am
+++ b/config/conclude.am
@@ -7,28 +7,28 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## 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 most HDF5 Makefiles.am.
 ## Contains build rules.
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
 TESTS = $(TEST_PROG) $(TEST_SCRIPT) $(EXTRA_TEST) 
+dyndir=$(libdir)
 
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
@@ -36,6 +36,7 @@ AM_SH_LOG_FLAGS =
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -43,7 +44,7 @@ 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)
+lib dyn 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                           \
diff --git a/config/conclude_fc.am b/config/conclude_fc.am
index d9e7b56..15d04a7 100644
--- a/config/conclude_fc.am
+++ b/config/conclude_fc.am
@@ -7,12 +7,10 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## 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.
@@ -26,8 +24,8 @@ LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=co
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 include $(top_srcdir)/config/conclude.am
diff --git a/config/cygwin b/config/cygwin
new file mode 100644
index 0000000..6ead871
--- /dev/null
+++ b/config/cygwin
@@ -0,0 +1,22 @@
+#              -*- shell-script -*-
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+
+
+# This file is part of the HDF5 build script.  It is processed shortly
+# after configure starts and defines, among other things, flags for
+# the various compile modes.
+#
+# See BlankForm in this directory for details.
+
+# Use the linux-gnulibc1 file.
+. $srcdir/config/linux-gnulibc1
diff --git a/config/examples.am b/config/examples.am
index 8597a16..247dfa8 100644
--- a/config/examples.am
+++ b/config/examples.am
@@ -7,12 +7,10 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## If you do not have access to either file, you may request a copy from
+## help at hdfgroup.org.
 
 ## Textually included near the end of HDF5 Makefiles in example directories.
 ## Contains boilerplate for building, installing, and cleaning example
diff --git a/config/freebsd b/config/freebsd
index e42ca60..936c29f 100644
--- a/config/freebsd
+++ b/config/freebsd
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/gnu-cxxflags b/config/gnu-cxxflags
index 52f46dd..e0f2999 100644
--- a/config/gnu-cxxflags
+++ b/config/gnu-cxxflags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
@@ -94,7 +92,7 @@ case "$cxx_vendor-$cxx_version" in
     esac
 
     # General (copied from H5_CFLAGS)
-    H5_CXXFLAGS="$H5_CXXFLAGS $arch -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wredundant-decls -Winline"
+    H5_CXXFLAGS="$H5_CXXFLAGS $arch -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wredundant-decls -Winline"
 
     # C++-specific
     H5_CXXFLAGS="$H5_CXXFLAGS -Wsign-promo -Woverloaded-virtual -Wold-style-cast -Weffc++ -Wreorder -Wnon-virtual-dtor -Wctor-dtor-privacy -Wabi"
@@ -105,7 +103,7 @@ case "$cxx_vendor-$cxx_version" in
       g++-[34].*)
         PROD_CXXFLAGS=
         ;;
-      g++-5.*)
+      g++-[56].*)
         PROD_CXXFLAGS="-fstdarg-opt"
         ;;
       *)
@@ -117,7 +115,7 @@ case "$cxx_vendor-$cxx_version" in
     # NDEBUG is handled explicitly by the configure script
     # -g is hanled by the symbols flags
     case "$cxx_vendor-$cxx_version" in
-      g++-5.*)
+      g++-[56].*)
         DEBUG_CXXFLAGS="-ftrapv -fno-common"
         ;;
       *)
@@ -138,7 +136,7 @@ case "$cxx_vendor-$cxx_version" in
         HIGH_OPT_CXXFLAGS="-O3"
         DEBUG_OPT_CXXFLAGS=
         ;;
-      g++-5.*)
+      g++-[56].*)
         HIGH_OPT_CXXFLAGS="-O3"
         DEBUG_OPT_CXXFLAGS="-Og"
         ;;
@@ -163,7 +161,7 @@ case "$cxx_vendor-$cxx_version" in
 # Closer to the g++ 5.2 release, we should check for additional flags to
 # include and break it out into it's own section, like the other versions
 # below. -QAK
-  g++-5*)
+  g++-[56]*)
 
     # Append warning flags from gcc-3* case
     H5_CXXFLAGS="$H5_CXXFLAGS -Wfloat-equal -Wmissing-format-attribute"
diff --git a/config/gnu-fflags b/config/gnu-fflags
index 4585735..e92e054 100644
--- a/config/gnu-fflags
+++ b/config/gnu-fflags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/gnu-flags b/config/gnu-flags
index 87aef3a..44ed480 100644
--- a/config/gnu-flags
+++ b/config/gnu-flags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
@@ -94,7 +92,7 @@ case "$cc_vendor-$cc_version" in
     esac
 
     # General
-    H5_CFLAGS="$H5_CFLAGS $arch -std=c99 -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline"
+    H5_CFLAGS="$H5_CFLAGS $arch -std=c99 -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs"
 
     # Production
     # NDEBUG is handled explicitly by the configure script
@@ -102,7 +100,7 @@ case "$cc_vendor-$cc_version" in
       gcc-[34].*)
         PROD_CFLAGS=
         ;;
-      gcc-5.*)
+      gcc-[56].*)
         PROD_CFLAGS="-fstdarg-opt"
         ;;
       *)
@@ -116,7 +114,7 @@ case "$cc_vendor-$cc_version" in
     # NDEBUG is handled explicitly by the configure script
     # -g is hanled by the symbols flags
     case "$cc_vendor-$cc_version" in
-      gcc-5.*)
+      gcc-[56].*)
         DEBUG_CFLAGS="-ftrapv -fno-common"
         ;;
       *)
@@ -125,6 +123,10 @@ case "$cc_vendor-$cc_version" in
     esac
     #DEBUG_CFLAGS="-fsanitize=undefined"
 
+    # Developer warnings (suggestions from gcc, not code problems)
+    DEVELOPER_WARNING_CFLAGS="-Winline -Waggregate-return"
+    NO_DEVELOPER_WARNING_CFLAGS="-Wno-inline -Wno-aggregate-return"
+
     # Symbols
     NO_SYMBOLS_CFLAGS="-s"
     SYMBOLS_CFLAGS="-g"
@@ -138,7 +140,7 @@ case "$cc_vendor-$cc_version" in
         HIGH_OPT_CFLAGS="-O3"
         DEBUG_OPT_CFLAGS=
         ;;
-      gcc-5.*)
+      gcc-[56].*)
         HIGH_OPT_CFLAGS="-O3"
         DEBUG_OPT_CFLAGS="-Og"
         ;;
@@ -164,10 +166,10 @@ esac
 # the information from the previous version and adding modifications to that.
 case "$cc_vendor-$cc_version" in
 
-# Closer to the gcc 5.2 release, we should check for additional flags to
+# When the gcc 7.x release is out, we should check for additional flags to
 # include and break it out into it's own section, like the other versions
 # below. -QAK
-  gcc-5*)
+  gcc-6*)
     # Append warning flags
     # Don't use the '-Wtraditional' flag, we're way past having K&R C code
     # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
@@ -183,7 +185,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -205,10 +209,10 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
 
     # Append more extra warning flags that only gcc 4.1+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat -Wnormalized"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -223,20 +227,104 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
 
     # Append more extra warning flags that only gcc 4.6+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
 
     # Append more extra warning flags that only gcc 4.7+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn"
 
     # Append more extra warning flags that only gcc 4.8+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=format"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=format"
 
     # Append more extra warning flags that only gcc 4.9+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdate-time -Wopenmp-simd"
+    H5_CFLAGS="$H5_CFLAGS -Wdate-time"
+
+    # Append more extra warning flags that only gcc 5.x+ know about
+    H5_CFLAGS="$H5_CFLAGS -Warray-bounds=2 -Wc99-c11-compat"
+
+    # Append more extra warning flags that only gcc 6.x+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wnull-dereference -Wunused-const-variable -Wduplicated-cond -Whsa"
+    ;;
+
+  gcc-5*)
+    # Append warning flags
+    # Don't use the '-Wtraditional' flag, we're way past having K&R C code
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional"
+    # Don't use the '-Wtraditional-conversion' flag, there's too many warnings
+    #  from GCC's assert macro
+    # H5_CFLAGS="$H5_CFLAGS -Wtraditional-conversion"
+
+    # Append warning flags from gcc-3* case
+    # (don't use -Wpadded flag for normal builds, many of the warnings its
+    #   issuing can't be fixed and they are making it hard to detect other,
+    #   more important warnings)
+    #H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute -Wpadded"
+    H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
+
+    # Append warning flags from gcc-3.2* case
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
+
+    # Enable more format checking flags, beyond the basic -Wformat included
+    # in -Wall
+    H5_CFLAGS="$H5_CFLAGS -Wformat=2"
+
+    # The "unreachable code" warning appears to be reliable now...
+    H5_CFLAGS="$H5_CFLAGS -Wunreachable-code"
+
+    # Append warning flags from gcc-3.3* case
+    H5_CFLAGS="$H5_CFLAGS -Wendif-labels"
+
+    # Append warning flags from gcc-3.4* case
+    H5_CFLAGS="$H5_CFLAGS -Wdeclaration-after-statement -Wold-style-definition -Winvalid-pch"
+
+    # Replace old -W flag with new -Wextra flag
+    H5_CFLAGS="`echo $H5_CFLAGS | sed -e 's/-W\ /-Wextra\ /g'`"
+
+    # Append more extra warning flags that only gcc4.0+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wvariadic-macros -Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wunused-macros"
+
+    # Append more extra warning flags that only gcc 4.1+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat -Wnormalized"
+
+    # Append more extra warning flags that only gcc 4.2+ know about
+    # (none, or incorporated in -Wall / -Wextra now)
+
+    # Append more extra warning flags that only gcc 4.3+ know about
+    #
+    # Technically, variable-length arrays are part of the C99 standard, but
+    #   we should approach them a bit cautiously... -QAK
+    H5_CFLAGS="$H5_CFLAGS -Wlogical-op -Wlarger-than=2048 -Wvla"
 
-    # (There was no release of gcc 5.0)
+    # Append more extra warning flags that only gcc 4.4+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wsync-nand -Wframe-larger-than=16384 -Wpacked-bitfield-compat"
+
+    # Append more extra warning flags that only gcc 4.5+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
+
+    # Append more extra warning flags that only gcc 4.6+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
+
+    # Append more extra warning flags that only gcc 4.7+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn"
 
-    # Append more extra warning flags that only gcc 5.1+ know about
+    # Append more extra warning flags that only gcc 4.8+ know about
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=format"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=format"
+
+    # Append more extra warning flags that only gcc 4.9+ know about
+    H5_CFLAGS="$H5_CFLAGS -Wdate-time"
+
+    # Append more extra warning flags that only gcc 5.x+ know about
     H5_CFLAGS="$H5_CFLAGS -Warray-bounds=2 -Wc99-c11-compat"
     ;;
 
@@ -256,7 +344,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -281,7 +371,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -296,16 +386,21 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
 
     # Append more extra warning flags that only gcc 4.6+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
 
     # Append more extra warning flags that only gcc 4.7+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn"
 
     # Append more extra warning flags that only gcc 4.8+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=format"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=format"
 
     # Append more extra warning flags that only gcc 4.9+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdate-time -Wopenmp-simd"
+    H5_CFLAGS="$H5_CFLAGS -Wdate-time"
     ;;
 
   gcc-4.8*)
@@ -324,7 +419,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -349,7 +446,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -364,13 +461,18 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init"
 
     # Append more extra warning flags that only gcc 4.6+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
 
     # Append more extra warning flags that only gcc 4.7+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn"
 
     # Append more extra warning flags that only gcc 4.8+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wsuggest-attribute=format"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=format"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=format"
     ;;
 
   gcc-4.7*)
@@ -389,7 +491,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -415,7 +519,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -430,10 +534,14 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
 
     # Append more extra warning flags that only gcc 4.6+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
 
     # Append more extra warning flags that only gcc 4.7+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    H5_CFLAGS="$H5_CFLAGS -Wstack-usage=8192 -Wvector-operation-performance"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=pure -Wno-suggest-attribute=noreturn"
     ;;
 
   gcc-4.6*)
@@ -448,7 +556,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -474,7 +584,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -489,7 +599,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-aliasing -Wstrict-overflow=5 -Wjump-misses-init -Wunsuffixed-float-constants"
 
     # Append more extra warning flags that only gcc 4.6+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wsuggest-attribute=const -Wtrampolines"
+    H5_CFLAGS="$H5_CFLAGS -Wdouble-promotion -Wtrampolines"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wsuggest-attribute=const"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-suggest-attribute=const"
     ;;
 
   gcc-4.5*)
@@ -504,7 +616,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -530,7 +644,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wunsafe-loop-optimizations -Wc++-compat"
 
     # Append more extra warning flags that only gcc 4.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
+    # (none, or incorporated in -Wall / -Wextra now)
 
     # Append more extra warning flags that only gcc 4.3+ know about
     #
@@ -557,7 +671,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -606,7 +722,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -652,7 +770,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -680,7 +800,7 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wstrict-overflow"
     ;;
 
-  gcc-4.1.*)
+  gcc-4.1*)
     # Disable warnings about using 'long long' type
     H5_CFLAGS="$H5_CFLAGS -Wno-long-long"
 
@@ -692,7 +812,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # Enable more format checking flags, beyond the basic -Wformat included
     # in -Wall
@@ -729,7 +851,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # The "format=2" warning generates too many warnings about valid
     # usage in the library.
@@ -763,7 +887,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # The "format=2" warning generates too many warnings about valid
     # usage in the library.
@@ -794,7 +920,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append warning flags from gcc-3.2* case
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # The "format=2" warning generates too many warnings about valid
     # usage in the library.
@@ -819,7 +947,9 @@ case "$cc_vendor-$cc_version" in
     H5_CFLAGS="$H5_CFLAGS -Wfloat-equal -Wmissing-format-attribute"
 
     # Append more extra warning flags that only gcc3.2+ know about
-    H5_CFLAGS="$H5_CFLAGS -Wmissing-noreturn -Wpacked -Wdisabled-optimization"
+    H5_CFLAGS="$H5_CFLAGS -Wpacked -Wdisabled-optimization"
+    DEVELOPER_WARNING_CFLAGS="$DEVELOPER_WARNING_CFLAGS -Wmissing-noreturn"
+    NO_DEVELOPER_WARNING_CFLAGS="$NO_DEVELOPER_WARNING_CFLAGS -Wno-missing-noreturn"
 
     # The "format=2" warning generates too many warnings about valid
     # usage in the library.
diff --git a/config/i386-pc-cygwin32 b/config/i386-pc-cygwin32
deleted file mode 100644
index 93a8d29..0000000
--- a/config/i386-pc-cygwin32
+++ /dev/null
@@ -1,31 +0,0 @@
-#							-*- shell-script -*-
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.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 part of the HDF5 build script.  It is processed shortly
-# after configure starts and defines, among other things, flags for
-# the various compile modes.
-#
-# See BlankForm in this directory for details.
-
-# The default compiler is `gcc'.
-if test "X-" =  "X-$CC"; then
-  CC=gcc
-  CC_BASENAME=gcc
-  LD=ld
-fi
-
-# Figure out compiler flags
-. $srcdir/config/gnu-flags
diff --git a/config/i686-pc-cygwin b/config/i686-pc-cygwin
deleted file mode 100644
index 7355e4a..0000000
--- a/config/i686-pc-cygwin
+++ /dev/null
@@ -1,137 +0,0 @@
-#              -*- shell-script -*-
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.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 part of the HDF5 build script.  It is processed shortly
-# after configure starts and defines, among other things, flags for
-# the various compile modes.
-#
-# See BlankForm in this directory for details.
-
-# The default compiler is `gcc'.
-if test -z "$CC"; then
-   CC=gcc
-   CC_BASENAME=gcc
-fi
-
-# Figure out GNU C compiler flags
-. $srcdir/config/gnu-flags
-
-# Figure out PGI C compiler flags
-. $srcdir/config/pgi-flags
-
-# Figure out Intel C compiler flags
-. $srcdir/config/intel-flags
-
-# The default Fortran 90 compiler
-if test "X-" = "X-$FC"; then
-    case $CC_BASENAME in
-        gcc*)
-            FC=gfortran
-            FCLIBS=-lgcc
-            FC_BASENAME=gfortran
-            ;;
-        pgcc*)
-            FC=pgf90
-            FC_BASENAME=pgf90
-            ;;
-        icc*)
-            FC=ifort
-            FC_BASENAME=ifort
-            ;;
-        mpicc*)
-            FC=mpif90
-            FC_BASENAME=mpif90
-            ;;
-    esac
-else
-    case $FC in
-        # The PGI and Intel compilers are automatically detected below
-        ifc*|ifort*|pgf90*)
-            ;;
-        gfortran)
-            FCLIBS=-lgcc
-            ;;
-        g95)
-            FCLIBS=-lgcc
-            ;;
-        *)
-            # Figure out which compiler we are using: pgf90 or Absoft f95
-            RM='rm -f'
-            tmpfile=/tmp/cmpver.$$
-            $FC -V >$tmpfile
-            if test -s "$tmpfile"; then 
-                if( grep -s 'Absoft' $tmpfile > /dev/null) then
-                    FC_BASENAME=f95
-                fi 
-                if( grep -s 'pgf90' $tmpfile > /dev/null) then
-                    FC_BASENAME=pgf90
-                fi 
-            fi
-            $RM $tmpfile
-            ;;
-    esac
-fi
-
-# Figure out PGI F90 compiler flags
-. $srcdir/config/pgi-fflags
-
-# Figure out Intel F90 compiler flags
-. $srcdir/config/intel-fflags
-
-case $FC_BASENAME in
-    #
-    # Absoft compiler
-    #
-    f95)
-        # Set required flag for compiling C stubs
-        H5_CFLAGS="$H5_CFLAGS -DH5_ABSOFT" 
-
-        F9XSUFFIXFLAG=""
-# We force compiler to use upper case for external names 
-# (just in case since this should be a default EIP)
-        H5_FCFLAGS="$H5_FCFLAGS -YEXT_NAMES=UCS"
-        FSEARCH_DIRS=""
-
-        # Production
-        PROD_FCFLAGS=
-
-        # Debug
-        DEBUG_FCFLAGS=
-
-        # Symbols
-        SYMBOLS_FCFLAGS="-g"
-        NO_SYMBOLS_FCFLAGS="-s"
-
-        # Profiling
-        PROFILE_FCFLAGS="-pg"
-
-        # Optimization
-        HIGH_OPT_FCFLAGS="-O"
-        DEBUG_OPT_FCFLAGS=
-        NO_OPT_FCFLAGS=
-
-        f9x_flags_set=yes
-        ;;
-
-esac  
-
-# The default C++ compiler
-
-# The default compiler is `g++'.
-if test -z "$CXX"; then
-  CXX=g++
-  CXX_BASENAME=g++
-fi
diff --git a/config/ibm-aix b/config/ibm-aix
index ef052fb..805ec34 100644
--- a/config/ibm-aix
+++ b/config/ibm-aix
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 # Configuration file for building on the IBM AIX platforms.
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/ibm-flags b/config/ibm-flags
index 412817c..881b81c 100644
--- a/config/ibm-flags
+++ b/config/ibm-flags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/intel-fflags b/config/intel-fflags
index db9543e..8b1110e 100644
--- a/config/intel-fflags
+++ b/config/intel-fflags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/intel-flags b/config/intel-flags
index fe7b06d..dad210c 100644
--- a/config/intel-flags
+++ b/config/intel-flags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
@@ -68,7 +66,7 @@ if test "X-icc" = "X-$cc_vendor"; then
 
     # General
     # Default to C99 standard.
-    H5_CFLAGS="${H5_CFLAGS:--std=c99 $arch} -Wcheck -Wall"
+    H5_CFLAGS="$H5_CFLAGS $arch -std=c99 -Wcheck -Wall"
 
     # Production
     PROD_CFLAGS=
@@ -79,14 +77,14 @@ if test "X-icc" = "X-$cc_vendor"; then
 
     # Symbols
     SYMBOLS_CFLAGS="-g"
-    NO_SYMBOLS_CFLAGS=
+    NO_SYMBOLS_CFLAGS="-Wl,-s"
 
     # Profiling
     # Use this for profiling with gprof
     PROFILE_CFLAGS="-p"
 
     # Optimization
-    HIGH_OPT_CFLAGS="-O"
+    HIGH_OPT_CFLAGS="-O3"
     DEBUG_OPT_CFLAGS="-O0"
     NO_OPT_CFLAGS="-O0"
 
@@ -101,17 +99,17 @@ fi
 # the information from the previous version and adding modifications to that.
 # The default at the bottom will apply if no earlier version matches.
 case "$cc_vendor-$cc_version" in
+    icc-1[5-6]*)
+        H5_CFLAGS="$H5_CFLAGS -Wcomment -Wdeprecated -Wextra-tokens -Wformat -Wformat-security -Wmain -Wmissing-declarations -Wmissing-prototypes -Wp64 -Wpointer-arith -Wreturn-type -Wshadow -Wstrict-prototypes -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-variable -Wwrite-strings"
+        ;;
     icc-10*)
-        PROD_CFLAGS="-O1 -Wl,-s"
+        HIGH_OPT_CFLAGS="-O1"
         ;;
     icc-8.0*)
-	# v8.0 -O3 infinite loops when compiling test/tselect.c. Use -O2.
-	PROD_CFLAGS="-O2 -Wl,-s"
-	;;
+        # v8.0 -O3 infinite loops when compiling test/tselect.c. Use -O2.
+        HIGH_OPT_CFLAGS="-O2"
+        ;;
     icc-*)
-        # -s became obsolete; we also fixed bugs that allow us to enable higher level
-        # of optimization starting with 1.8.7
-        PROD_CFLAGS="-O3"
         ;;
 esac
 
diff --git a/config/linux-gnu b/config/linux-gnu
index 912a93b..243b087 100644
--- a/config/linux-gnu
+++ b/config/linux-gnu
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This is the same as linux-gnulibc1
diff --git a/config/linux-gnuaout b/config/linux-gnuaout
index 912a93b..243b087 100644
--- a/config/linux-gnuaout
+++ b/config/linux-gnuaout
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This is the same as linux-gnulibc1
diff --git a/config/linux-gnulibc1 b/config/linux-gnulibc1
index 5bea816..1785e0e 100644
--- a/config/linux-gnulibc1
+++ b/config/linux-gnulibc1
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
@@ -171,6 +169,7 @@ case $CC in
     *mpicc*)
         cc_version_info=`$CC $CCFLAGS $H5_CCFLAGS -v 2>&1 | grep 'version' |\
             sed 's/^[a-z0-9]* for //' |\
+            sed 's/\"/\\\"/g' |\
             sed 's/^\([a-z]* \)/ built with \1/1'`
         cc_version_info=`echo $cc_version_info`
         ;; 
diff --git a/config/linux-gnulibc2 b/config/linux-gnulibc2
index 76526b8..01a0d20 100644
--- a/config/linux-gnulibc2
+++ b/config/linux-gnulibc2
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/lt_vers.am b/config/lt_vers.am
index 74739bc..1bacd1b 100644
--- a/config/lt_vers.am
+++ b/config/lt_vers.am
@@ -7,19 +7,17 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## If you do not have access to either file, you may request a copy from
+## help at hdfgroup.org.
 ##
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+## Add libtool shared library version numbers to the HDF5 library
+## See libtool versioning documentation online.
+## After making changes, run bin/reconfigure to update other configure related
+## files like Makefile.in.
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
 
 ## If the API changes *at all*, increment LT_VERS_INTERFACE and
@@ -41,46 +39,31 @@ LT_VERS_AGE = 0
 ## the effects of the H5_V1_x_COMPAT flag.
 ##
 ## Version numbers for wrapper shared library files.
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
 
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
 
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
 
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 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.
-
-
-
diff --git a/config/pgi-fflags b/config/pgi-fflags
index 08dfe6e..46f861d 100644
--- a/config/pgi-fflags
+++ b/config/pgi-fflags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/pgi-flags b/config/pgi-flags
index f6878e6..52828c1 100644
--- a/config/pgi-flags
+++ b/config/pgi-flags
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file should be sourced into configure if the compiler is the
diff --git a/config/site-specific/BlankForm b/config/site-specific/BlankForm
index c31383c..03d421c 100644
--- a/config/site-specific/BlankForm
+++ b/config/site-specific/BlankForm
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script. It is processed shortly
diff --git a/config/solaris b/config/solaris
index 72d7423..656fee1 100644
--- a/config/solaris
+++ b/config/solaris
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 # This file is part of the HDF5 build script.  It is processed shortly
diff --git a/config/x86_64-pc-cygwin b/config/x86_64-pc-cygwin
deleted file mode 100644
index 210aa2b..0000000
--- a/config/x86_64-pc-cygwin
+++ /dev/null
@@ -1,138 +0,0 @@
-#              -*- shell-script -*-
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.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 part of the HDF5 build script.  It is processed shortly
-# after configure starts and defines, among other things, flags for
-# the various compile modes.
-#
-# See BlankForm in this directory for details.
-
-# The default compiler is `gcc'.
-if test -z "$CC"; then
-   CC=gcc
-   CC_BASENAME=gcc
-fi
-
-# Figure out GNU C compiler flags
-. $srcdir/config/gnu-flags
-
-# Figure out PGI C compiler flags
-. $srcdir/config/pgi-flags
-
-# Figure out Intel C compiler flags
-. $srcdir/config/intel-flags
-
-# The default Fortran 90 compiler
-if test "X-" = "X-$FC"; then
-    case $CC_BASENAME in
-        gcc*)
-            FC=gfortran
-            FCLIBS=-lgcc
-            FC_BASENAME=gfortran
-            ;;
-        pgcc*)
-            FC=pgf90
-            FC_BASENAME=pgf90
-            ;;
-        icc*)
-            FC=ifort
-            FC_BASENAME=ifort
-            ;;
-        mpicc*)
-            FC=mpif90
-            FC_BASENAME=mpif90
-            ;;
-    esac
-else
-    case $FC in
-        # The PGI and Intel compilers are automatically detected below
-        ifc*|ifort*|pgf90*)
-            ;;
-        gfortran)
-            FCLIBS=-lgcc
-            ;;
-        g95)
-            FCLIBS=-lgcc
-            ;;
-        *)
-            # Figure out which compiler we are using: pgf90 or Absoft f95
-            RM='rm -f'
-            tmpfile=/tmp/cmpver.$$
-            $FC -V >$tmpfile
-            if test -s "$tmpfile"; then 
-                if( grep -s 'Absoft' $tmpfile > /dev/null) then
-                    FC_BASENAME=f95
-                fi 
-                if( grep -s 'pgf90' $tmpfile > /dev/null) then
-                    FC_BASENAME=pgf90
-                fi 
-            fi
-            $RM $tmpfile
-            ;;
-    esac
-fi
-
-# Figure out PGI F90 compiler flags
-. $srcdir/config/pgi-fflags
-
-# Figure out Intel F90 compiler flags
-. $srcdir/config/intel-fflags
-
-case $FC_BASENAME in
-    #
-    # Absoft compiler
-    #
-    f95)
-        # Set required flag for compiling C stubs
-        H5_CFLAGS="$H5_CFLAGS -DH5_ABSOFT" 
-
-        F9XSUFFIXFLAG=""
-# We force compiler to use upper case for external names 
-# (just in case since this should be a default EIP)
-        H5_FCFLAGS="$H5_FCFLAGS -YEXT_NAMES=UCS"
-        FSEARCH_DIRS=""
-
-        # Production
-        PROD_FCFLAGS=
-
-        # Debug
-        DEBUG_FCFLAGS=
-
-        # Symbols
-        SYMBOLS_FCFLAGS="-g"
-        NO_SYMBOLS_FCFLAGS="-s"
-
-        # Profiling
-        PROFILE_FCFLAGS="-pg"
-
-        # Optimization
-        HIGH_OPT_FCFLAGS="-O"
-        DEBUG_OPT_FCFLAGS=
-        NO_OPT_FCFLAGS=
-
-        f9x_flags_set=yes
-        ;;
-
-esac  
-
-# The default C++ compiler
-
-# The default compiler is `g++'.
-if test -z "$CXX"; then
-  CXX=g++
-  CXX_BASENAME=g++
-fi
-
diff --git a/configure b/configure
index 59bd48f..770ca07 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 # 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.10.0-patch1.
+# Generated by GNU Autoconf 2.69 for HDF5 1.10.1.
 #
 # Report bugs to <help at hdfgroup.org>.
 #
@@ -591,8 +591,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='HDF5'
 PACKAGE_TARNAME='hdf5'
-PACKAGE_VERSION='1.10.0-patch1'
-PACKAGE_STRING='HDF5 1.10.0-patch1'
+PACKAGE_VERSION='1.10.1'
+PACKAGE_STRING='HDF5 1.10.1'
 PACKAGE_BUGREPORT='help at hdfgroup.org'
 PACKAGE_URL=''
 
@@ -684,6 +684,7 @@ CODESTACK
 INTERNAL_DEBUG_OUTPUT
 OPTIMIZATION
 PROFILING
+DEV_WARNINGS
 ASSERTS
 SYMBOLS
 HAVE_PTHREAD
@@ -773,6 +774,7 @@ PAC_FORTRAN_NATIVE_INTEGER_KIND
 PAC_FC_ALL_INTEGER_KINDS_SIZEOF
 PAC_FC_ALL_REAL_KINDS_SIZEOF
 PAC_FC_ALL_INTEGER_KINDS
+PAC_FORTRAN_NUM_INTEGER_KINDS
 PAC_FC_MAX_REAL_PRECISION
 PAC_FC_ALL_REAL_KINDS
 FCLIBS
@@ -945,6 +947,7 @@ enable_debug
 enable_production
 enable_symbols
 enable_asserts
+enable_developer_warnings
 enable_profiling
 enable_optimization
 enable_internal_debug
@@ -1522,7 +1525,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.10.0-patch1 to adapt to many kinds of systems.
+\`configure' configures HDF5 1.10.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1592,7 +1595,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of HDF5 1.10.0-patch1:";;
+     short | recursive ) echo "Configuration of HDF5 1.10.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1648,6 +1651,11 @@ Optional Features:
                           controls assertions. This is independent of the
                           build mode and presence of debugging symbols.
                           [default=yes if debug build, otherwise no]
+  --enable-developer-warnings
+                          Determines whether developer warnings will be
+                          emitted. These are usually performance suggestions
+                          (e.g. -Wsuggest-attribute) and do not flag poor code
+                          quality. [default=no]
   --enable-profiling=(yes|no|<custom>)
                           Enable profiling flags (e.g.: -pg). This can be set
                           independently from the build mode. The custom
@@ -1844,7 +1852,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-HDF5 configure 1.10.0-patch1
+HDF5 configure 1.10.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2372,10 +2380,10 @@ fi
 
 } # ac_fn_fc_try_compile
 
-# ac_fn_fc_try_link LINENO
-# ------------------------
+# ac_fn_c_try_link LINENO
+# -----------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_fc_try_link ()
+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
@@ -2395,7 +2403,7 @@ $as_echo "$ac_try_echo"; } >&5
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
-	 test -z "$ac_fc_werror_flag" ||
+	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
 	 test "$cross_compiling" = yes ||
@@ -2416,12 +2424,12 @@ fi
   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
 
-# ac_fn_c_try_link LINENO
-# -----------------------
+# ac_fn_fc_try_link LINENO
+# ------------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
+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
@@ -2441,7 +2449,7 @@ $as_echo "$ac_try_echo"; } >&5
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
+	 test -z "$ac_fc_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
 	 test "$cross_compiling" = yes ||
@@ -2462,7 +2470,7 @@ fi
   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
 
 # ac_fn_fc_try_run LINENO
 # -----------------------
@@ -2759,7 +2767,7 @@ 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-patch1, which was
+It was created by HDF5 $as_me 1.10.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3631,7 +3639,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='hdf5'
- VERSION='1.10.0-patch1'
+ VERSION='1.10.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3762,7 +3770,7 @@ else
   AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
 fi
 AM_BACKSLASH='\'
-
+ # use silent rules where available - automake 1.11
 
 ## AM_MAINTAINER_MODE turns off "rebuild rules" that contain dependencies
 ## for Makefiles, configure, src/H5config.h, etc. If AM_MAINTAINER_MODE
@@ -3775,9 +3783,6 @@ AM_BACKSLASH='\'
 ##
 ## 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; }
@@ -4106,6 +4111,7 @@ $as_echo "no" >&6; }
   test "$hname_tmp" = "$hname" && break
 done
 
+
 ## ----------------------------------------------------------------------
 ## Determine build mode (debug, production, clean).
 ## This has to be done early since the build mode is referred to
@@ -6388,8 +6394,7 @@ else
 	        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;}
+                as_fn_error $? "No output from C decimal precision program!" "$LINENO" 5
             fi
             rm -f pac_Cconftest.out
 
@@ -7061,34 +7066,22 @@ ac_compiler_gnu=$ac_cv_fc_compiler_gnu
   ## Checking if the compiler supports the required Fortran 2003 features and
   ## stopping if it does not.
 
+   HAVE_F2003_REQUIREMENTS="no"
    { $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
-
-
-        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
+   TEST_SRC="`sed -n '/PROG_FC_HAVE_F2003_REQUIREMENTS/,/END PROGRAM PROG_FC_HAVE_F2003_REQUIREMENTS/p' $srcdir/m4/aclocal_fc.f90`"
+   cat > conftest.$ac_ext <<_ACEOF
+$TEST_SRC
 _ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
+if ac_fn_fc_try_compile "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-        HAVE_F2003_REQUIREMENTS=yes
+            HAVE_F2003_REQUIREMENTS="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
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 
   if test "X$HAVE_F2003_REQUIREMENTS" = "Xno"; then
@@ -7785,12 +7778,9 @@ ac_compiler_gnu=$ac_cv_fc_compiler_gnu
   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; }
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_SIZEOF/,/END PROGRAM PROG_FC_SIZEOF/p' $srcdir/m4/aclocal_fc.f90`"
   cat > conftest.$ac_ext <<_ACEOF
-
-   PROGRAM main
-     i = sizeof(x)
-   END PROGRAM
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -7809,15 +7799,9 @@ rm -f core conftest.err conftest.$ac_objext \
   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; }
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_C_SIZEOF/,/END PROGRAM PROG_FC_C_SIZEOF/p' $srcdir/m4/aclocal_fc.f90`"
   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
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -7836,14 +7820,9 @@ rm -f core conftest.err conftest.$ac_objext \
   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; }
+  TEST_SRC="`sed -ne '/PROGRAM PROG_FC_STORAGE_SIZE/,/END PROGRAM PROG_FC_STORAGE_SIZE/p' $srcdir/m4/aclocal_fc.f90`"
   cat > conftest.$ac_ext <<_ACEOF
-
-   PROGRAM main
-     INTEGER :: a
-     INTEGER :: result
-     result = STORAGE_SIZE(a)
-   END PROGRAM
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -7879,12 +7858,9 @@ rm -f core conftest.err conftest.$ac_objext \
   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; }
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_ISO_FORTRAN_ENV/,/END PROGRAM PROG_FC_ISO_FORTRAN_ENV/p' $srcdir/m4/aclocal_fc.f90`"
   cat > conftest.$ac_ext <<_ACEOF
-
-   PROGRAM main
-     USE, INTRINSIC :: ISO_FORTRAN_ENV
-   END PROGRAM
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -7905,7 +7881,7 @@ ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest
 ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
 rm -f pac_fconftest.out
-
+TEST_SRC="`sed -n '/PROGRAM FC_AVAIL_KINDS/,/END PROGRAM FC_AVAIL_KINDS/p' $srcdir/m4/aclocal_fc.f90`"
 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;}
@@ -7913,68 +7889,7 @@ 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, jk, k, max_decimal_prec
-      INTEGER :: num_rkinds = 1, num_ikinds = 1
-      INTEGER, DIMENSION(1:10) :: list_ikinds = -1
-      INTEGER, DIMENSION(1:10) :: list_rkinds = -1
-
-      OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
-
-      ! Find integer KINDs
-      list_ikinds(num_ikinds)=SELECTED_INT_KIND(1)
-      DO ik = 2, 36
-         k = SELECTED_INT_KIND(ik)
-         IF(k.LT.0) EXIT
-         IF(k.GT.list_ikinds(num_ikinds))THEN
-            num_ikinds = num_ikinds + 1
-            list_ikinds(num_ikinds) = k
-         ENDIF
-      ENDDO
-
-      DO k = 1, num_ikinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_ikinds(k)
-         IF(k.NE.num_ikinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-      ! Find real KINDs
-      list_rkinds(num_rkinds)=SELECTED_REAL_KIND(1)
-      max_decimal_prec = 1
-
-      prec: DO ik = 2, 36
-         exp: DO jk = 1, 17000
-            k = SELECTED_REAL_KIND(ik,jk)
-            IF(k.LT.0) EXIT exp
-            IF(k.GT.list_rkinds(num_rkinds))THEN
-               num_rkinds = num_rkinds + 1
-               list_rkinds(num_rkinds) = k
-            ENDIF
-            max_decimal_prec = ik
-         ENDDO exp
-      ENDDO prec
-
-      DO k = 1, num_rkinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_rkinds(k)
-         IF(k.NE.num_rkinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-     WRITE(8,'(I0)') max_decimal_prec
-     WRITE(8,'(I0)') num_ikinds
-     WRITE(8,'(I0)') num_rkinds
-    END PROGRAM main
-
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_run "$LINENO"; then :
 
@@ -7993,7 +7908,8 @@ _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`"
+        PAC_FORTRAN_NUM_INTEGER_KINDS="`sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `echo $PAC_FORTRAN_NUM_INTEGER_KINDS`"
 	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`/)"
@@ -8019,6 +7935,10 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Number of Fortran INTEGER KINDs" >&5
+$as_echo_n "checking for Number of Fortran INTEGER KINDs... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FORTRAN_NUM_INTEGER_KINDS" >&5
+$as_echo "$PAC_FORTRAN_NUM_INTEGER_KINDS" >&6; }
         { $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
@@ -8034,8 +7954,7 @@ $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;}
+        as_fn_error $? "No output from Fortran test program!" "$LINENO" 5
     fi
     rm -f pac_fconftest.out
 
@@ -8043,8 +7962,7 @@ 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;}
+    as_fn_error $? "Failed to run Fortran program to determine available KINDs" "$LINENO" 5
 
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -8080,11 +7998,11 @@ rm -f pac_fconftest.out
                 DOUBLE PRECISION c
                 OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
                 WRITE(8,*) $FC_SIZEOF_A
-	        WRITE(8,*) kind(a)
+	        WRITE(8,*) KIND(a)
 	        WRITE(8,*) $FC_SIZEOF_B
-	        WRITE(8,*) kind(b)
+	        WRITE(8,*) KIND(b)
                 WRITE(8,*) $FC_SIZEOF_C
-                WRITE(8,*) kind(c)
+                WRITE(8,*) KIND(c)
                 CLOSE(8)
                 END
 
@@ -8098,22 +8016,20 @@ else
   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`"
+                PAC_FORTRAN_NATIVE_INTEGER_SIZEOF="`sed -n '1p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_INTEGER_KIND="`sed -n '2p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_SIZEOF="`sed -n '3p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_KIND="`sed -n '4p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF="`sed -n '5p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_KIND="`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;}
+                as_fn_error $? "No output from Fortran test program!" "$LINENO" 5
             fi
             rm -f pac_fconftest.out
 
 else
 
-            { $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;}
+            as_fn_error $? "Fortran program fails to build or run!" "$LINENO" 5
 
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -8137,7 +8053,7 @@ ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest
 ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
 rm -f pac_fconftest.out
-
+TEST_SRC="`sed -n '/PROGRAM FC_AVAIL_KINDS/,/END PROGRAM FC_AVAIL_KINDS/p' $srcdir/m4/aclocal_fc.f90`"
 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;}
@@ -8145,68 +8061,7 @@ 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, jk, k, max_decimal_prec
-      INTEGER :: num_rkinds = 1, num_ikinds = 1
-      INTEGER, DIMENSION(1:10) :: list_ikinds = -1
-      INTEGER, DIMENSION(1:10) :: list_rkinds = -1
-
-      OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
-
-      ! Find integer KINDs
-      list_ikinds(num_ikinds)=SELECTED_INT_KIND(1)
-      DO ik = 2, 36
-         k = SELECTED_INT_KIND(ik)
-         IF(k.LT.0) EXIT
-         IF(k.GT.list_ikinds(num_ikinds))THEN
-            num_ikinds = num_ikinds + 1
-            list_ikinds(num_ikinds) = k
-         ENDIF
-      ENDDO
-
-      DO k = 1, num_ikinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_ikinds(k)
-         IF(k.NE.num_ikinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-      ! Find real KINDs
-      list_rkinds(num_rkinds)=SELECTED_REAL_KIND(1)
-      max_decimal_prec = 1
-
-      prec: DO ik = 2, 36
-         exp: DO jk = 1, 17000
-            k = SELECTED_REAL_KIND(ik,jk)
-            IF(k.LT.0) EXIT exp
-            IF(k.GT.list_rkinds(num_rkinds))THEN
-               num_rkinds = num_rkinds + 1
-               list_rkinds(num_rkinds) = k
-            ENDIF
-            max_decimal_prec = ik
-         ENDDO exp
-      ENDDO prec
-
-      DO k = 1, num_rkinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_rkinds(k)
-         IF(k.NE.num_rkinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-     WRITE(8,'(I0)') max_decimal_prec
-     WRITE(8,'(I0)') num_ikinds
-     WRITE(8,'(I0)') num_rkinds
-    END PROGRAM main
-
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_run "$LINENO"; then :
 
@@ -8225,7 +8080,8 @@ _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`"
+        PAC_FORTRAN_NUM_INTEGER_KINDS="`sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `echo $PAC_FORTRAN_NUM_INTEGER_KINDS`"
 	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`/)"
@@ -8251,6 +8107,10 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Number of Fortran INTEGER KINDs" >&5
+$as_echo_n "checking for Number of Fortran INTEGER KINDs... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FORTRAN_NUM_INTEGER_KINDS" >&5
+$as_echo "$PAC_FORTRAN_NUM_INTEGER_KINDS" >&6; }
         { $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
@@ -8266,8 +8126,7 @@ $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;}
+        as_fn_error $? "No output from Fortran test program!" "$LINENO" 5
     fi
     rm -f pac_fconftest.out
 
@@ -8275,8 +8134,7 @@ 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;}
+    as_fn_error $? "Failed to run Fortran program to determine available KINDs" "$LINENO" 5
 
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -8329,15 +8187,13 @@ else
                 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;}
+                as_fn_error $? "No output from Fortran test program!" "$LINENO" 5
             fi
             rm -f pac_fconftest.out
 
 else
 
-            { $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;}
+            as_fn_error $? "Fortran program fails to build or run!" "$LINENO" 5
 
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -8391,15 +8247,13 @@ else
                 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;}
+                as_fn_error $? "No output from Fortran test program!" "$LINENO" 5
             fi
             rm -f pac_fconftest.out
 
 else
 
-            { $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;}
+            as_fn_error $? "Fortran program fails to build or run!" "$LINENO" 5
 
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -8438,6 +8292,7 @@ ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
 
 
+
   Fortran_COMPILER_ID=none
 
 cat >>confdefs.h <<_ACEOF
@@ -8481,13 +8336,10 @@ $as_echo "#define FORTRAN_HAVE_SIZEOF 1" >>confdefs.h
   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; }
+  TEST_SRC=""
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE/,/END PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE/p' $srcdir/m4/aclocal_fc.f90`"
   cat > conftest.$ac_ext <<_ACEOF
-
-   PROGRAM main
-     USE ISO_C_BINDING
-     REAL(KIND=C_LONG_DOUBLE) :: d
-   END PROGRAM
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -8516,32 +8368,9 @@ $as_echo "#define FORTRAN_HAVE_C_LONG_DOUBLE 1" >>confdefs.h
   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; }
-
+  TEST_SRC="`sed -n '/MODULE type_mod/,/END PROGRAM PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE/p' $srcdir/m4/aclocal_fc.f90`"
   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
-
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_compile "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -9218,13 +9047,11 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
   { $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; }
+  TEST_SRC="`(echo \"#define OLD_HEADER_FILENAME 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
+
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-#include <iostream>
-
-int main(void) { return 0; }
-
+$TEST_SRC
 _ACEOF
 if ac_fn_cxx_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -9243,19 +9070,11 @@ rm -f core conftest.err conftest.$ac_objext \
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX can handle namespaces" >&5
 $as_echo_n "checking if $CXX can handle namespaces... " >&6; }
+  TEST_SRC="`(echo \"#define HDF_NO_NAMESPACE 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
+
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-namespace H5 {
-int fnord;
-}
-
-int main(void) {
-   using namespace H5;
-   fnord = 37;
-   return 0;
-}
-
+$TEST_SRC
 _ACEOF
 if ac_fn_cxx_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -9263,88 +9082,57 @@ $as_echo "yes" >&6; }
 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"
+     CXXFLAGS="${CXXFLAGS} -DHDF_NO_NAMESPACE"
+     AM_CXXFLAGS="${AM_CXXFLAGS} -DHDF_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>
-
-#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 C++ can handle static cast
 
-    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)
+  { $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; }
+  TEST_SRC="`(echo \"#define NO_STATIC_CAST 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
 
-  ;
-  return 0;
-}
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$TEST_SRC
 _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; }
+    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 C++ can handle static cast
+  ## Checking if C++ has offsetof extension,
+  ## note: this test has to be the last of the C++ tests because it sets a definition
+  ## which would be used in the other tests, causing them to fail.
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX has offsetof extension" >&5
+$as_echo_n "checking if $CXX has offsetof extension... " >&6; }
+  TEST_SRC="`(echo \"#define CXX_HAVE_OFFSETOF 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
 
-  { $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;
-}
-
+$TEST_SRC
 _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; }
-    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
@@ -9777,7 +9565,7 @@ else
 JAVA_TEST=Test.java
 CLASS_TEST=Test.class
 cat << \EOF > $JAVA_TEST
-/* #line 9780 "configure" */
+/* #line 9568 "configure" */
 public class Test {
 }
 EOF
@@ -9952,7 +9740,7 @@ EOF
 if $UUDECODE Test.uue; then
         ac_cv_prog_uudecode_base64=yes
 else
-        echo "configure: 9955: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+        echo "configure: 9743: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
         echo "configure: failed file was:" >&5
         cat Test.uue >&5
         ac_cv_prog_uudecode_base64=no
@@ -10069,7 +9857,7 @@ else
 JAVA_TEST=Test.java
 CLASS_TEST=Test.class
 cat << \EOF > $JAVA_TEST
-/* #line 10072 "configure" */
+/* #line 9860 "configure" */
 public class Test {
 }
 EOF
@@ -10104,7 +9892,7 @@ JAVA_TEST=Test.java
 CLASS_TEST=Test.class
 TEST=Test
 cat << \EOF > $JAVA_TEST
-/* [#]line 10107 "configure" */
+/* [#]line 9895 "configure" */
 public class Test {
 public static void main (String args[]) {
         System.exit (0);
@@ -10534,7 +10322,7 @@ EOF
                 if $UUDECODE Test.uue; then
                         :
                 else
-                        echo "configure: 10537: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+                        echo "configure: 10325: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
                         echo "configure: failed file was:" >&5
                         cat Test.uue >&5
                         ac_cv_prog_uudecode_base64=no
@@ -10554,7 +10342,7 @@ EOF
 else
 
 cat << \EOF > Test.java
-/* #line 10557 "configure" */
+/* #line 10345 "configure" */
 import junit.textui.TestRunner;
 public class Test {
 
@@ -28339,12 +28127,13 @@ case "`uname`" in
   CYGWIN*)
     ;;
   *)
-    for ac_func in GetConsoleScreenBufferInfo
+    for ac_func in GetConsoleScreenBufferInfo getpwuid
 do :
-  ac_fn_c_check_func "$LINENO" "GetConsoleScreenBufferInfo" "ac_cv_func_GetConsoleScreenBufferInfo"
-if test "x$ac_cv_func_GetConsoleScreenBufferInfo" = xyes; then :
+  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 HAVE_GETCONSOLESCREENBUFFERINFO 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -28583,7 +28372,7 @@ _ACEOF
 fi
 done
 
-for ac_func in frexpl gethostname getpwuid getrusage gettimeofday
+for ac_func in frexpl gethostname 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"
@@ -28631,6 +28420,18 @@ _ACEOF
 fi
 done
 
+for ac_func in strtoll strtoull
+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
+
 for ac_func in tmpfile asprintf vasprintf vsnprintf waitpid
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
@@ -28643,6 +28444,18 @@ _ACEOF
 fi
 done
 
+for ac_func in roundf lroundf llroundf round lround llround
+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
+
 
 ## ----------------------------------------------------------------------
 ## Check compiler characteristics
@@ -29108,6 +28921,47 @@ $as_echo "no" >&6; }
 esac
 
 ## ----------------------------------------------------------------------
+## Check if developer warnings should be turned on
+## These are warnings that provide suggestions like gcc's -Wsuggest-attribute.
+## They do not indicate code problems.
+##
+## Note that developers don't need to build with these regularly. They
+## are just handy to check once in a while (before releases, etc.).
+##
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking enable developer warnings" >&5
+$as_echo_n "checking enable developer warnings... " >&6; }
+# Check whether --enable-developer-warnings was given.
+if test "${enable_developer_warnings+set}" = set; then :
+  enableval=$enable_developer_warnings; DEV_WARNINGS=$enableval
+fi
+
+
+## Set default
+if test "X-$DEV_WARNINGS" = X- ; then
+  DEV_WARNINGS=no
+fi
+
+## Allow this variable to be substituted in
+## other files (src/libhdf5.settings.in, etc.)
+
+
+case "X-$DEV_WARNINGS" in
+  X-yes)
+    H5_CFLAGS="$H5_CFLAGS $DEVELOPER_WARNING_CFLAGS"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    ;;
+  X-no)
+    H5_CFLAGS="$H5_CFLAGS $NO_DEVELOPER_WARNING_CFLAGS"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  *)
+    as_fn_error $? "Unrecognized value: $DEV_WARNINGS" "$LINENO" 5
+    ;;
+esac
+
+## ----------------------------------------------------------------------
 ## Check if the compiler should use profiling flags/settings
 ##
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking profiling" >&5
@@ -29645,17 +29499,11 @@ 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
 
-
+      TEST_SRC="`sed -n '/PROGRAM FC_MPI_CHECK/,/END PROGRAM FC_MPI_CHECK/p' $srcdir/m4/aclocal_fc.f90`"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a simple MPI-IO Fortran program can be linked" >&5
 $as_echo_n "checking whether a simple MPI-IO Fortran program can be linked... " >&6; }
       cat > conftest.$ac_ext <<_ACEOF
-
-          PROGRAM main
-          INCLUDE 'mpif.h'
-          INTEGER :: comm, amode, info, fh, ierror
-          CHARACTER(LEN=1) :: filename
-          CALL MPI_File_open( comm, filename, amode, info, fh, ierror)
-          END
+$TEST_SRC
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -30318,6 +30166,12 @@ esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if using special algorithm to convert long double to (unsigned) long values" >&5
 $as_echo_n "checking if using special algorithm to convert long double to (unsigned) long values... " >&6; }
 
+## NOTE: Place all configure test programs into cmake's source file, then use a preprocessor directive
+## to select the proper test program. This is done by echoing the #define and cat'ing the cmake
+## source file. (HDFFV-9467)
+
+TEST_SRC="`(echo \"#define H5_LDOUBLE_TO_LONG_SPECIAL_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_ldouble_to_long_special=${hdf5_cv_ldouble_to_long_special=no}
 else
@@ -30332,73 +30186,7 @@ See \`config.log' for more details" "$LINENO" 5; }
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-                #include <string.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 ()
-{
-
-                long double         ld = 20041683600089727.779961L;
-                long                ll;
-                unsigned long       ull;
-                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
-                     * 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. */
-                    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 &&
-                        s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
-
-                        /* Assign the hexadecimal value of long double type. */
-                        s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
-                        s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
-                        s[8]=0xbf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
-                        s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
-
-                        memcpy(&ld, s, 16);
-
-                        ll = (long)ld;
-                        memcpy(s2, &ll, 8);
-
-                        /* The library's algorithm converts it to 0x 00 47 33 ce 17 af 22 82
-                         * and gets wrong value 20041683600089730 on the IBM Power6 Linux.
-                         * But the IBM Power6 Linux converts it to 0x00 47 33 ce 17 af 22 7f
-                         * and gets the correct value 20041683600089727.  It uses some special
-                         * algorithm.  We're going to define the macro and skip the test until
-                         * we can figure out how they do it. */
-                        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;
-
-                        ull = (unsigned long)ld;
-                        memcpy(s2, &ull, 8);
-
-                        /* The unsigned long is the same as signed long. */
-                        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);
-
-  ;
-  return 0;
-}
+$TEST_SRC
 
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
@@ -30436,6 +30224,8 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if using special algorithm to convert (unsigned) long to long double values" >&5
 $as_echo_n "checking if using special algorithm to convert (unsigned) long to long double values... " >&6; }
 
+TEST_SRC="`(echo \"#define H5_LONG_TO_LDOUBLE_SPECIAL_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_long_to_ldouble_special=${hdf5_cv_long_to_ldouble_special=no}
 else
@@ -30450,76 +30240,7 @@ See \`config.log' for more details" "$LINENO" 5; }
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-                #include <string.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 ()
-{
-
-                long double         ld;
-                long                ll;
-                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) {
-                    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;
-                }
-
-                if(flag==1 && sizeof(long)==8) {
-                    ll = 0x003fffffffffffffL;
-                    ld = (long double)ll;
-                    memcpy(s, &ld, 16);
-                    /* The library converts the value to 0x434fffffffffffff8000000000000000.
-                     * In decimal it is 18014398509481982.000000, one value short of the original.
-                     * The IBM Power6 Linux converts it to 0x4350000000000000bff0000000000000.
-                     * The value is correct in decimal. It uses some special
-                     * algorithm.  We're going to define the macro and skip the test until
-                     * we can figure out how they do it. */
-                    if(s[0]==0x43 && s[1]==0x50 && s[2]==0x00 && s[3]==0x00 &&
-                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
-                        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;
-                    memcpy(s, &ld, 16);
-                    /* Use a different value from signed long to test. The problem is the same
-                     * for both long and unsigned long. The value is 18446744073709551615.
-                     * The library converts the value to 0x43effffffffffffffe000000000000000.
-                     * In decimal it's 18446744073709548544.000000, very different from the original.
-                     * The IBM Power6 Linux converts it to 0x43f0000000000000bff0000000000000.
-                     * The value is correct in decimal. It uses some special
-                     * algorithm.  We're going to define the macro and skip the test until
-                     * we can figure out how they do it. */
-                    if(s[0]==0x43 && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
-                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
-                        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);
-
-  ;
-  return 0;
-}
+$TEST_SRC
 
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
@@ -30560,6 +30281,8 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if correctly converting long double to (unsigned) long long values" >&5
 $as_echo_n "checking if correctly converting long double to (unsigned) long long values... " >&6; }
 
+TEST_SRC="`(echo \"#define H5_LDOUBLE_TO_LLONG_ACCURATE_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_ldouble_to_llong_accurate=${hdf5_cv_ldouble_to_llong_accurate=no}
 else
@@ -30574,44 +30297,7 @@ See \`config.log' for more details" "$LINENO" 5; }
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-        int main(void)
-        {
-            long double         ld = 20041683600089727.779961L;
-            long long           ll;
-            unsigned long long  ull;
-            unsigned char       s[16];
-            int                 ret = 0;
-
-            if(sizeof(long double) == 16) {
-                /*make sure the long double type is the same as the failing type
-                 *which 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. */
-                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 &&
-                    s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
-
-                    /*slightly adjust the bit sequence (s[8]=0xdf).  The converted
-                     *values will go wild on Mac OS 10.4 and IRIX64 6.5.*/
-                    s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
-                    s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
-                    s[8]=0xdf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
-                    s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
-
-                    memcpy(&ld, s, 16);
-                    ll = (long long)ld;
-                    ull = (unsigned long long)ld;
-
-                    if(ll != 20041683600089728 || ull != 20041683600089728)
-                        ret = 1;
-                }
-            }
-    done:
-            exit(ret);
-        }
-
+$TEST_SRC
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
   hdf5_cv_ldouble_to_llong_accurate=yes
@@ -30649,6 +30335,8 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if correctly converting (unsigned) long long to long double values" >&5
 $as_echo_n "checking if correctly converting (unsigned) long long to long double values... " >&6; }
 
+TEST_SRC="`(echo \"#define H5_LLONG_TO_LDOUBLE_CORRECT_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_llong_to_ldouble_correct=${hdf5_cv_llong_to_ldouble_correct=no}
 else
@@ -30663,48 +30351,7 @@ See \`config.log' for more details" "$LINENO" 5; }
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-        int main(void)
-        {
-            long double         ld;
-            long long           ll;
-            unsigned long long  ull;
-            unsigned char       s[16];
-            int                 flag=0, ret=0;
-
-            /*Determine if long double has 16 byte in size, 11 bit exponent, and
-             *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;
-            }
-
-            if(flag==1 && sizeof(long long)==8) {
-                ll = 0x01ffffffffffffffLL;
-                ld = (long double)ll;
-                memcpy(s, &ld, 16);
-                /*Check if the bit sequence is as supposed to be*/
-                if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
-                    s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
-                    s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
-                    ret = 1;
-            }
-            if(flag==1 && sizeof(unsigned long long)==8) {
-                ull = 0x01ffffffffffffffULL;
-                ld = (long double)ull;
-                memcpy(s, &ld, 16);
-                if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
-                    s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
-                    s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
-                    ret = 1;
-            }
-    done:
-            exit(ret);
-        }
-
+$TEST_SRC
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
   hdf5_cv_llong_to_ldouble_correct=yes
@@ -31045,6 +30692,9 @@ $as_echo "no" >&6; }
 ##
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if alignment restrictions are strictly enforced" >&5
 $as_echo_n "checking if alignment restrictions are strictly enforced... " >&6; }
+
+TEST_SRC="`(echo \"#define H5_NO_ALIGNMENT_RESTRICTIONS_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test "$cross_compiling" = yes; then :
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown, assuming yes" >&5
@@ -31054,54 +30704,7 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-
-        #include <stdlib.h>
-        #include <string.h>
-
-        typedef struct {
-            size_t len;
-            void *p;
-        } hvl_t;
-
-#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 *chp = "beefs";
-        char **chpp = malloc (2 * sizeof (char *));
-        char **chpp2;
-        hvl_t vl = { 12345, (void *) chp };
-        hvl_t *vlp;
-        hvl_t *vlp2;
-
-        memcpy ((void *) ((char *) chpp + 1), &chp, sizeof (char *));
-        chpp2 = (char **) ((char *) chpp + 1);
-        if (strcmp (*chpp2, chp)) {
-            free (chpp);
-            return 1;
-        }
-        free (chpp);
-
-        vlp = malloc (2 * sizeof (hvl_t));
-        memcpy ((void *) ((char *) vlp + 1), &vl, sizeof (hvl_t));
-        vlp2 = (hvl_t *) ((char *) vlp + 1);
-        if (vlp2->len != vl.len || vlp2->p != vl.p) {
-            free (vlp);
-            return 1;
-        }
-        free (vlp);
-
-  ;
-  return 0;
-}
+    $TEST_SRC
 
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
@@ -31621,7 +31224,7 @@ Usage: $0 [OPTIONS]
 Report bugs to <bug-libtool at gnu.org>."
 
 lt_cl_version="\
-HDF5 config.lt 1.10.0-patch1
+HDF5 config.lt 1.10.1
 configured by $0, generated by GNU Autoconf 2.69.
 
 Copyright (C) 2011 Free Software Foundation, Inc.
@@ -33059,7 +32662,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/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 [...]
+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/lib/Makefile tools/src/Makefile tools/src/h5dump/Makefile tools/src/h5import/Makefile tools/src/h5diff/Makefile tools/src/h5jam/Makefile tools/src/h5repa [...]
 
 
 ac_config_commands="$ac_config_commands .classes"
@@ -33648,7 +33251,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.10.0-patch1, which was
+This file was extended by HDF5 $as_me 1.10.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -33714,7 +33317,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.10.0-patch1
+HDF5 config.status 1.10.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -34338,38 +33941,53 @@ do
     "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" ;;
-    "tools/h5diff/testh5diff.sh") CONFIG_FILES="$CONFIG_FILES tools/h5diff/testh5diff.sh" ;;
-    "tools/h5diff/testph5diff.sh") CONFIG_FILES="$CONFIG_FILES tools/h5diff/testph5diff.sh" ;;
-    "tools/h5jam/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5jam/Makefile" ;;
-    "tools/h5jam/testh5jam.sh") CONFIG_FILES="$CONFIG_FILES tools/h5jam/testh5jam.sh" ;;
-    "tools/h5repack/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5repack/Makefile" ;;
-    "tools/h5repack/h5repack.sh") CONFIG_FILES="$CONFIG_FILES tools/h5repack/h5repack.sh" ;;
-    "tools/h5repack/h5repack_plugin.sh") CONFIG_FILES="$CONFIG_FILES tools/h5repack/h5repack_plugin.sh" ;;
-    "tools/h5ls/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5ls/Makefile" ;;
-    "tools/h5copy/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5copy/Makefile" ;;
-    "tools/h5copy/testh5copy.sh") CONFIG_FILES="$CONFIG_FILES tools/h5copy/testh5copy.sh" ;;
     "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" ;;
+    "tools/src/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/Makefile" ;;
+    "tools/src/h5dump/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5dump/Makefile" ;;
+    "tools/src/h5import/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5import/Makefile" ;;
+    "tools/src/h5diff/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5diff/Makefile" ;;
+    "tools/src/h5jam/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5jam/Makefile" ;;
+    "tools/src/h5repack/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5repack/Makefile" ;;
+    "tools/src/h5ls/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5ls/Makefile" ;;
+    "tools/src/h5copy/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5copy/Makefile" ;;
+    "tools/src/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/misc/Makefile" ;;
+    "tools/src/misc/h5cc") CONFIG_FILES="$CONFIG_FILES tools/src/misc/h5cc" ;;
+    "tools/src/h5stat/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5stat/Makefile" ;;
+    "tools/test/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/Makefile" ;;
+    "tools/test/h5dump/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/Makefile" ;;
+    "tools/test/h5dump/h5dump_plugin.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/h5dump_plugin.sh" ;;
+    "tools/test/h5dump/testh5dump.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/testh5dump.sh" ;;
+    "tools/test/h5dump/testh5dumppbits.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/testh5dumppbits.sh" ;;
+    "tools/test/h5dump/testh5dumpvds.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/testh5dumpvds.sh" ;;
+    "tools/test/h5dump/testh5dumpxml.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5dump/testh5dumpxml.sh" ;;
+    "tools/test/h5ls/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5ls/Makefile" ;;
+    "tools/test/h5ls/h5ls_plugin.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5ls/h5ls_plugin.sh" ;;
+    "tools/test/h5ls/testh5ls.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5ls/testh5ls.sh" ;;
+    "tools/test/h5ls/testh5lsvds.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5ls/testh5lsvds.sh" ;;
+    "tools/test/h5import/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5import/Makefile" ;;
+    "tools/test/h5import/h5importtestutil.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5import/h5importtestutil.sh" ;;
+    "tools/test/h5diff/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5diff/Makefile" ;;
+    "tools/test/h5diff/h5diff_plugin.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5diff/h5diff_plugin.sh" ;;
+    "tools/test/h5diff/testh5diff.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5diff/testh5diff.sh" ;;
+    "tools/test/h5diff/testph5diff.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5diff/testph5diff.sh" ;;
+    "tools/src/h5format_convert/Makefile") CONFIG_FILES="$CONFIG_FILES tools/src/h5format_convert/Makefile" ;;
+    "tools/test/h5format_convert/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5format_convert/Makefile" ;;
+    "tools/test/h5format_convert/testh5fc.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5format_convert/testh5fc.sh" ;;
+    "tools/test/h5jam/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5jam/Makefile" ;;
+    "tools/test/h5jam/testh5jam.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5jam/testh5jam.sh" ;;
+    "tools/test/h5repack/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5repack/Makefile" ;;
+    "tools/test/h5repack/h5repack.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5repack/h5repack.sh" ;;
+    "tools/test/h5repack/h5repack_plugin.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5repack/h5repack_plugin.sh" ;;
+    "tools/test/h5copy/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5copy/Makefile" ;;
+    "tools/test/h5copy/testh5copy.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5copy/testh5copy.sh" ;;
+    "tools/test/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/misc/Makefile" ;;
+    "tools/test/misc/testh5clear.sh") CONFIG_FILES="$CONFIG_FILES tools/test/misc/testh5clear.sh" ;;
+    "tools/test/misc/testh5mkgrp.sh") CONFIG_FILES="$CONFIG_FILES tools/test/misc/testh5mkgrp.sh" ;;
+    "tools/test/misc/testh5repart.sh") CONFIG_FILES="$CONFIG_FILES tools/test/misc/testh5repart.sh" ;;
+    "tools/test/misc/vds/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/misc/vds/Makefile" ;;
+    "tools/test/h5stat/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/h5stat/Makefile" ;;
+    "tools/test/h5stat/testh5stat.sh") CONFIG_FILES="$CONFIG_FILES tools/test/h5stat/testh5stat.sh" ;;
+    "tools/test/perform/Makefile") CONFIG_FILES="$CONFIG_FILES tools/test/perform/Makefile" ;;
     "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
     "examples/run-c-ex.sh") CONFIG_FILES="$CONFIG_FILES examples/run-c-ex.sh" ;;
     "examples/testh5cc.sh") CONFIG_FILES="$CONFIG_FILES examples/testh5cc.sh" ;;
@@ -36034,7 +35652,7 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
 
-chmod 755 tools/misc/h5cc
+chmod 755 tools/src/misc/h5cc
 
 if test "X$HDF_FORTRAN" = "Xyes"; then
   chmod 755 fortran/src/h5fc
diff --git a/configure.ac b/configure.ac
index 3f5f79b..cf841ac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,12 +6,10 @@
 ##
 ## This file is part of HDF5.  The full HDF5 copyright notice, including
 ## terms governing use, modification, and redistribution, is contained in
-## the files COPYING and Copyright.html.  COPYING can be found at the root
-## of the source code distribution tree; Copyright.html can be found at the
-## root level of an installed copy of the electronic HDF5 document set and
-## is linked from the top-level documents page.  It can also be found at
-## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-## access to either file, you may request a copy from help at hdfgroup.org.
+## the COPYING file, which can be found at the root of the source code
+## distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+## If you do not have access to either file, you may request a copy from
+## help at hdfgroup.org.
 
 ## ----------------------------------------------------------------------
 ## Initialize configure.
@@ -26,7 +24,7 @@ AC_PREREQ([2.69])
 ## NOTE: Do not forget to change the version number here when we do a
 ## release!!!
 ##
-AC_INIT([HDF5], [1.10.0-patch1], [help at hdfgroup.org])
+AC_INIT([HDF5], [1.10.1], [help at hdfgroup.org])
 
 AC_CONFIG_SRCDIR([src/H5.c])
 AC_CONFIG_HEADERS([src/H5config.h])
@@ -36,8 +34,8 @@ AC_CONFIG_MACRO_DIR([m4])
 
 ## AM_INIT_AUTOMAKE takes a list of options that should be applied to
 ## every Makefile.am when automake is run.
-AM_INIT_AUTOMAKE([foreign])
-AM_SILENT_RULES([yes])
+AM_INIT_AUTOMAKE([foreign subdir-objects])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) # use silent rules where available - automake 1.11
 
 ## AM_MAINTAINER_MODE turns off "rebuild rules" that contain dependencies
 ## for Makefiles, configure, src/H5config.h, etc. If AM_MAINTAINER_MODE
@@ -50,9 +48,6 @@ AM_SILENT_RULES([yes])
 ##
 ## 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([disable])
 
 ## ----------------------------------------------------------------------
@@ -284,6 +279,7 @@ while test -n "$hname"; do
   test "$hname_tmp" = "$hname" && break
 done
 
+
 ## ----------------------------------------------------------------------
 ## Determine build mode (debug, production, clean).
 ## This has to be done early since the build mode is referred to
@@ -553,6 +549,7 @@ if test "X$HDF_FORTRAN" = "Xyes"; then
 
   AC_SUBST([PAC_FC_ALL_REAL_KINDS])
   AC_SUBST([PAC_FC_MAX_REAL_PRECISION])
+  AC_SUBST([PAC_FORTRAN_NUM_INTEGER_KINDS])
   AC_SUBST([PAC_FC_ALL_INTEGER_KINDS])
   AC_SUBST([PAC_FC_ALL_REAL_KINDS_SIZEOF])
   AC_SUBST([PAC_FC_ALL_INTEGER_KINDS_SIZEOF])
@@ -697,12 +694,14 @@ if test "X$HDF_CXX" = "Xyes"; then
   ## Checking if C++ can handle namespaces
   PAC_PROG_CXX_NAMESPACE
 
-  ## Checking if C++ has offsetof extension
-  PAC_PROG_CXX_OFFSETOF
-
   ## if C++ can handle static cast
   PAC_PROG_CXX_STATIC_CAST
 
+  ## Checking if C++ has offsetof extension,
+  ## note: this test has to be the last of the C++ tests because it sets a definition
+  ## which would be used in the other tests, causing them to fail.
+  PAC_PROG_CXX_OFFSETOF
+
 else
   AC_MSG_RESULT([no])
   CXX="no"
@@ -1801,7 +1800,7 @@ case "`uname`" in
   CYGWIN*)
     ;;
   *)
-    AC_CHECK_FUNCS([GetConsoleScreenBufferInfo])
+    AC_CHECK_FUNCS([GetConsoleScreenBufferInfo getpwuid])
     ;;
 esac
 AC_CHECK_FUNCS([_scrsize ioctl])
@@ -1846,11 +1845,13 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 ##       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 fcntl flock fork frexpf])
-AC_CHECK_FUNCS([frexpl gethostname getpwuid getrusage gettimeofday])
+AC_CHECK_FUNCS([frexpl gethostname 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])
+AC_CHECK_FUNCS([strtoll strtoull])
 AC_CHECK_FUNCS([tmpfile asprintf vasprintf vsnprintf waitpid])
+AC_CHECK_FUNCS([roundf lroundf llroundf round lround llround])
 
 ## ----------------------------------------------------------------------
 ## Check compiler characteristics
@@ -2053,6 +2054,48 @@ case "X-$ASSERTS" in
 esac
 
 ## ----------------------------------------------------------------------
+## Check if developer warnings should be turned on
+## These are warnings that provide suggestions like gcc's -Wsuggest-attribute.
+## They do not indicate code problems.
+##
+## Note that developers don't need to build with these regularly. They
+## are just handy to check once in a while (before releases, etc.).
+##
+AC_MSG_CHECKING([enable developer warnings])
+AC_ARG_ENABLE([developer-warnings],
+              [AS_HELP_STRING([--enable-developer-warnings],
+                              [Determines whether developer warnings will be
+                               emitted. These are usually performance suggestions
+                               (e.g. -Wsuggest-attribute) and do not flag poor code
+                               quality.
+                               [default=no]
+                               ])],
+              [DEV_WARNINGS=$enableval])
+
+## Set default
+if test "X-$DEV_WARNINGS" = X- ; then
+  DEV_WARNINGS=no
+fi
+
+## Allow this variable to be substituted in
+## other files (src/libhdf5.settings.in, etc.)
+AC_SUBST([DEV_WARNINGS])
+
+case "X-$DEV_WARNINGS" in
+  X-yes)
+    H5_CFLAGS="$H5_CFLAGS $DEVELOPER_WARNING_CFLAGS"
+    AC_MSG_RESULT([yes])
+    ;;
+  X-no)
+    H5_CFLAGS="$H5_CFLAGS $NO_DEVELOPER_WARNING_CFLAGS"
+    AC_MSG_RESULT([no])
+    ;;
+  *)
+    AC_MSG_ERROR([Unrecognized value: $DEV_WARNINGS])
+    ;;
+esac
+
+## ----------------------------------------------------------------------
 ## Check if the compiler should use profiling flags/settings
 ##
 AC_MSG_CHECKING([profiling])
@@ -2796,63 +2839,18 @@ esac
 ##
 AC_MSG_CHECKING([if using special algorithm to convert long double to (unsigned) long values])
 
+## NOTE: Place all configure test programs into cmake's source file, then use a preprocessor directive
+## to select the proper test program. This is done by echoing the #define and cat'ing the cmake
+## source file. (HDFFV-9467)
+
+TEST_SRC="`(echo \"#define H5_LDOUBLE_TO_LONG_SPECIAL_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_ldouble_to_long_special=${hdf5_cv_ldouble_to_long_special=no}
 else
    AC_CACHE_VAL([hdf5_cv_ldouble_to_long_special],
         [AC_RUN_IFELSE(
-            [AC_LANG_PROGRAM([
-                #include <string.h>
-            ],[[
-                long double         ld = 20041683600089727.779961L;
-                long                ll;
-                unsigned long       ull;
-                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
-                     * 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. */
-                    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 &&
-                        s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
-
-                        /* Assign the hexadecimal value of long double type. */
-                        s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
-                        s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
-                        s[8]=0xbf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
-                        s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
-
-                        memcpy(&ld, s, 16);
-
-                        ll = (long)ld;
-                        memcpy(s2, &ll, 8);
-
-                        /* The library's algorithm converts it to 0x 00 47 33 ce 17 af 22 82
-                         * and gets wrong value 20041683600089730 on the IBM Power6 Linux.
-                         * But the IBM Power6 Linux converts it to 0x00 47 33 ce 17 af 22 7f
-                         * and gets the correct value 20041683600089727.  It uses some special
-                         * algorithm.  We're going to define the macro and skip the test until
-                         * we can figure out how they do it. */
-                        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;
-
-                        ull = (unsigned long)ld;
-                        memcpy(s2, &ull, 8);
-
-                        /* The unsigned long is the same as signed long. */
-                        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);
-        ]])]
+            [AC_LANG_SOURCE([$TEST_SRC])]
     , [hdf5_cv_ldouble_to_long_special=yes], [hdf5_cv_ldouble_to_long_special=no],)])
 fi
 
@@ -2874,66 +2872,14 @@ fi
 ##
 AC_MSG_CHECKING([if using special algorithm to convert (unsigned) long to long double values])
 
+TEST_SRC="`(echo \"#define H5_LONG_TO_LDOUBLE_SPECIAL_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_long_to_ldouble_special=${hdf5_cv_long_to_ldouble_special=no}
 else
    AC_CACHE_VAL([hdf5_cv_long_to_ldouble_special],
         [AC_RUN_IFELSE(
-            [AC_LANG_PROGRAM([
-                #include <string.h>
-            ],[[
-                long double         ld;
-                long                ll;
-                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) {
-                    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;
-                }
-
-                if(flag==1 && sizeof(long)==8) {
-                    ll = 0x003fffffffffffffL;
-                    ld = (long double)ll;
-                    memcpy(s, &ld, 16);
-                    /* The library converts the value to 0x434fffffffffffff8000000000000000.
-                     * In decimal it is 18014398509481982.000000, one value short of the original.
-                     * The IBM Power6 Linux converts it to 0x4350000000000000bff0000000000000.
-                     * The value is correct in decimal. It uses some special
-                     * algorithm.  We're going to define the macro and skip the test until
-                     * we can figure out how they do it. */
-                    if(s[0]==0x43 && s[1]==0x50 && s[2]==0x00 && s[3]==0x00 &&
-                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
-                        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;
-                    memcpy(s, &ld, 16);
-                    /* Use a different value from signed long to test. The problem is the same
-                     * for both long and unsigned long. The value is 18446744073709551615.
-                     * The library converts the value to 0x43effffffffffffffe000000000000000.
-                     * In decimal it's 18446744073709548544.000000, very different from the original.
-                     * The IBM Power6 Linux converts it to 0x43f0000000000000bff0000000000000.
-                     * The value is correct in decimal. It uses some special
-                     * algorithm.  We're going to define the macro and skip the test until
-                     * we can figure out how they do it. */
-                    if(s[0]==0x43 && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
-                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00 &&
-                        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);
-        ]])]
+            [AC_LANG_SOURCE([$TEST_SRC])]
     , [hdf5_cv_long_to_ldouble_special=yes], [hdf5_cv_long_to_ldouble_special=no],)])
 fi
 
@@ -2958,48 +2904,14 @@ fi
 ##
 AC_MSG_CHECKING([if correctly converting long double to (unsigned) long long values])
 
+TEST_SRC="`(echo \"#define H5_LDOUBLE_TO_LLONG_ACCURATE_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 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_RUN_IFELSE([AC_LANG_SOURCE([[
-        int main(void)
-        {
-            long double         ld = 20041683600089727.779961L;
-            long long           ll;
-            unsigned long long  ull;
-            unsigned char       s[16];
-            int                 ret = 0;
-
-            if(sizeof(long double) == 16) {
-                /*make sure the long double type is the same as the failing type
-                 *which 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. */
-                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 &&
-                    s[8]==0xbf && s[9]==0xcc && s[10]==0x2a && s[11]==0x3c) {
-
-                    /*slightly adjust the bit sequence (s[8]=0xdf).  The converted
-                     *values will go wild on Mac OS 10.4 and IRIX64 6.5.*/
-                    s[0]=0x43; s[1]=0x51; s[2]=0xcc; s[3]=0xf3;
-                    s[4]=0x85; s[5]=0xeb; s[6]=0xc8; s[7]=0xa0;
-                    s[8]=0xdf; s[9]=0xcc; s[10]=0x2a; s[11]=0x3c;
-                    s[12]=0x3d; s[13]=0x85; s[14]=0x56; s[15]=0x20;
-
-                    memcpy(&ld, s, 16);
-                    ll = (long long)ld;
-                    ull = (unsigned long long)ld;
-
-                    if(ll != 20041683600089728 || ull != 20041683600089728)
-                        ret = 1;
-                }
-            }
-    done:
-            exit(ret);
-        }
-        ]])], [hdf5_cv_ldouble_to_llong_accurate=yes], [hdf5_cv_ldouble_to_llong_accurate=no],[])])
+        [AC_RUN_IFELSE([AC_LANG_SOURCE([$TEST_SRC])],
+        [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
@@ -3021,52 +2933,14 @@ fi
 ##
 AC_MSG_CHECKING([if correctly converting (unsigned) long long to long double values])
 
+TEST_SRC="`(echo \"#define H5_LLONG_TO_LDOUBLE_CORRECT_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 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_RUN_IFELSE([AC_LANG_SOURCE([[
-        int main(void)
-        {
-            long double         ld;
-            long long           ll;
-            unsigned long long  ull;
-            unsigned char       s[16];
-            int                 flag=0, ret=0;
-
-            /*Determine if long double has 16 byte in size, 11 bit exponent, and
-             *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;
-            }
-
-            if(flag==1 && sizeof(long long)==8) {
-                ll = 0x01ffffffffffffffLL;
-                ld = (long double)ll;
-                memcpy(s, &ld, 16);
-                /*Check if the bit sequence is as supposed to be*/
-                if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
-                    s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
-                    s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
-                    ret = 1;
-            }
-            if(flag==1 && sizeof(unsigned long long)==8) {
-                ull = 0x01ffffffffffffffULL;
-                ld = (long double)ull;
-                memcpy(s, &ld, 16);
-                if(s[0]!=0x43 || s[1]!=0x7f || s[2]!=0xff || s[3]!=0xff ||
-                    s[4]!=0xff || s[5]!=0xff || s[6]!=0xff || s[7]!=0xff ||
-                    s[8]!=0xf0 || s[9]!=0x00 || s[10]!=0x00 || s[11]!=0x00)
-                    ret = 1;
-            }
-    done:
-            exit(ret);
-        }
-        ]])],[hdf5_cv_llong_to_ldouble_correct=yes], [hdf5_cv_llong_to_ldouble_correct=no],[])])
+        [AC_RUN_IFELSE([AC_LANG_SOURCE([$TEST_SRC])],
+        [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
@@ -3360,40 +3234,11 @@ AC_ARG_ENABLE([embedded-libinfo],
 ## Check if pointer alignments are enforced
 ##
 AC_MSG_CHECKING([if alignment restrictions are strictly enforced])
+
+TEST_SRC="`(echo \"#define H5_NO_ALIGNMENT_RESTRICTIONS_TEST 1\"; cat $srcdir/config/cmake/ConversionTests.c)`"
+
 AC_RUN_IFELSE([
-    AC_LANG_PROGRAM([
-        #include <stdlib.h>
-        #include <string.h>
-
-        typedef struct {
-            size_t len;
-            void *p;
-        } hvl_t;
-        ], [
-        char *chp = "beefs";
-        char **chpp = malloc (2 * sizeof (char *));
-        char **chpp2;
-        hvl_t vl = { 12345, (void *) chp };
-        hvl_t *vlp;
-        hvl_t *vlp2;
-
-        memcpy ((void *) ((char *) chpp + 1), &chp, sizeof (char *));
-        chpp2 = (char **) ((char *) chpp + 1);
-        if (strcmp (*chpp2, chp)) {
-            free (chpp);
-            return 1;
-        }
-        free (chpp);
-
-        vlp = malloc (2 * sizeof (hvl_t));
-        memcpy ((void *) ((char *) vlp + 1), &vl, sizeof (hvl_t));
-        vlp2 = (hvl_t *) ((char *) vlp + 1);
-        if (vlp2->len != vl.len || vlp2->p != vl.p) {
-            free (vlp);
-            return 1;
-        }
-        free (vlp);
-    ])
+    AC_LANG_SOURCE([$TEST_SRC])
     ], [
     AC_DEFINE([NO_ALIGNMENT_RESTRICTIONS], [1], [Define if we can violate pointer alignment restrictions])
     AC_MSG_RESULT([no])
@@ -3513,7 +3358,7 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  test/Makefile
                  test/testcheck_version.sh
                  test/testerror.sh
-		        test/testflushrefresh.sh
+                 test/testflushrefresh.sh
                  test/H5srcdir_str.h
                  test/testlibinfo.sh
                  test/testlinks_env.sh
@@ -3523,38 +3368,53 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  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
-                 tools/h5diff/testh5diff.sh
-                 tools/h5diff/testph5diff.sh
-                 tools/h5jam/Makefile
-                 tools/h5jam/testh5jam.sh
-                 tools/h5repack/Makefile
-                 tools/h5repack/h5repack.sh
-                 tools/h5repack/h5repack_plugin.sh
-                 tools/h5ls/Makefile
-                 tools/h5copy/Makefile
-                 tools/h5copy/testh5copy.sh
                  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
+                 tools/src/Makefile
+                 tools/src/h5dump/Makefile
+                 tools/src/h5import/Makefile
+                 tools/src/h5diff/Makefile
+                 tools/src/h5jam/Makefile
+                 tools/src/h5repack/Makefile
+                 tools/src/h5ls/Makefile
+                 tools/src/h5copy/Makefile
+                 tools/src/misc/Makefile
+                 tools/src/misc/h5cc
+                 tools/src/h5stat/Makefile
+                 tools/test/Makefile
+                 tools/test/h5dump/Makefile
+                 tools/test/h5dump/h5dump_plugin.sh
+                 tools/test/h5dump/testh5dump.sh
+                 tools/test/h5dump/testh5dumppbits.sh
+                 tools/test/h5dump/testh5dumpvds.sh
+                 tools/test/h5dump/testh5dumpxml.sh
+                 tools/test/h5ls/Makefile
+                 tools/test/h5ls/h5ls_plugin.sh
+                 tools/test/h5ls/testh5ls.sh
+                 tools/test/h5ls/testh5lsvds.sh
+                 tools/test/h5import/Makefile
+                 tools/test/h5import/h5importtestutil.sh
+                 tools/test/h5diff/Makefile
+                 tools/test/h5diff/h5diff_plugin.sh
+                 tools/test/h5diff/testh5diff.sh
+                 tools/test/h5diff/testph5diff.sh
+                 tools/src/h5format_convert/Makefile
+                 tools/test/h5format_convert/Makefile
+                 tools/test/h5format_convert/testh5fc.sh
+                 tools/test/h5jam/Makefile
+                 tools/test/h5jam/testh5jam.sh
+                 tools/test/h5repack/Makefile
+                 tools/test/h5repack/h5repack.sh
+                 tools/test/h5repack/h5repack_plugin.sh
+                 tools/test/h5copy/Makefile
+                 tools/test/h5copy/testh5copy.sh
+                 tools/test/misc/Makefile
+                 tools/test/misc/testh5clear.sh
+                 tools/test/misc/testh5mkgrp.sh
+                 tools/test/misc/testh5repart.sh
+                 tools/test/misc/vds/Makefile
+                 tools/test/h5stat/Makefile
+                 tools/test/h5stat/testh5stat.sh
+                 tools/test/perform/Makefile
                  examples/Makefile
                  examples/run-c-ex.sh
                  examples/testh5cc.sh
@@ -3596,7 +3456,7 @@ 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/Makefile
                  hl/tools/h5watch/testh5watch.sh
                  hl/examples/Makefile
                  hl/examples/run-hlc-ex.sh
@@ -3620,7 +3480,7 @@ AC_CONFIG_COMMANDS([.classes], [], [$MKDIR_P java/src/.classes;
 
 AC_OUTPUT
 
-chmod 755 tools/misc/h5cc
+chmod 755 tools/src/misc/h5cc
 
 if test "X$HDF_FORTRAN" = "Xyes"; then
   chmod 755 fortran/src/h5fc
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 8849ce7..d8eb1a2 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_EXAMPLES)
 
 #-----------------------------------------------------------------------------
@@ -56,8 +56,8 @@ foreach (example ${examples})
     TARGET_C_PROPERTIES (${example}-shared SHARED " " " ")
     target_link_libraries (${example}-shared ${HDF5_LIBSH_TARGET})
     set_target_properties (${example}-shared PROPERTIES FOLDER examples)
-  endif (BUILD_SHARED_LIBS)
-endforeach (example ${examples})
+  endif ()
+endforeach ()
 
 if (H5_HAVE_PARALLEL)
   add_executable (ph5example ${HDF5_EXAMPLES_SOURCE_DIR}/ph5example.c)
@@ -71,9 +71,9 @@ if (H5_HAVE_PARALLEL)
     TARGET_C_PROPERTIES (ph5example-shared SHARED " " " ")
     target_link_libraries (ph5example-shared ${HDF5_LIBSH_TARGET})
     set_target_properties (ph5example-shared PROPERTIES FOLDER examples)
-  endif (BUILD_SHARED_LIBS)
-endif (H5_HAVE_PARALLEL)
+  endif ()
+endif ()
 
 if (BUILD_TESTING)
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
diff --git a/examples/CMakeTests.cmake b/examples/CMakeTests.cmake
index 4a4728e..dd4766a 100644
--- a/examples/CMakeTests.cmake
+++ b/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -8,19 +19,19 @@
   if (BUILD_SHARED_LIBS)
     file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/H5EX-shared")
     file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/H5EX-shared/red ${PROJECT_BINARY_DIR}/H5EX-shared/blue ${PROJECT_BINARY_DIR}/H5EX-shared/u2w)
-  endif (BUILD_SHARED_LIBS)
+  endif ()
 
   # Remove any output file left over from previous test run
   add_test (
       NAME EXAMPLES-clear-objects
       COMMAND    ${CMAKE_COMMAND}
-          -E remove 
+          -E remove
           Attributes.h5
           btrees_file.h5
           cmprss.h5
           default_file.h5
           dset.h5
-          extend.h5 
+          extend.h5
           extlink_prefix_source.h5
           extlink_source.h5
           extlink_target.h5
@@ -62,29 +73,42 @@
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (EXAMPLES-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "EXAMPLES-clear-objects")
 
   foreach (example ${examples})
-    add_test (NAME EXAMPLES-${example} COMMAND $<TARGET_FILE:${example}>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME EXAMPLES-${example} COMMAND $<TARGET_FILE:${example}>)
+    else ()
+      add_test (NAME EXAMPLES-${example} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:${example}>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=${example}.txt"
+          #-D "TEST_REFERENCE=${example}.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (EXAMPLES-${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "EXAMPLES-${example}")
-  endforeach (example ${examples})
+  endforeach ()
 
   if (BUILD_SHARED_LIBS)
     # Remove any output file left over from previous test run
     add_test (
         NAME EXAMPLES-shared-clear-objects
         COMMAND    ${CMAKE_COMMAND}
-            -E remove 
+            -E remove
             Attributes.h5
             btrees_file.h5
             cmprss.h5
             default_file.h5
             dset.h5
-            extend.h5 
+            extend.h5
             extlink_prefix_source.h5
             extlink_source.h5
             extlink_target.h5
@@ -128,32 +152,71 @@
     )
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (EXAMPLES-shared-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "EXAMPLES-shared-clear-objects")
 
     foreach (example ${examples})
-      add_test (NAME EXAMPLES-shared-${example} COMMAND $<TARGET_FILE:${example}-shared>)
+      if (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (NAME EXAMPLES-shared-${example} COMMAND $<TARGET_FILE:${example}-shared>)
+      else ()
+        add_test (NAME EXAMPLES-shared-${example} COMMAND "${CMAKE_COMMAND}"
+            -D "TEST_PROGRAM=$<TARGET_FILE:${example}>"
+            -D "TEST_ARGS:STRING="
+            -D "TEST_EXPECT=0"
+            -D "TEST_SKIP_COMPARE=TRUE"
+            -D "TEST_OUTPUT=${example}.txt"
+            #-D "TEST_REFERENCE=${example}.out"
+            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/H5EX-shared"
+            -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
       set_tests_properties (EXAMPLES-shared-${example} PROPERTIES WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/H5EX-shared)
       if (NOT "${last_test}" STREQUAL "")
         set_tests_properties (EXAMPLES-shared-${example} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
+      endif ()
       set (last_test "EXAMPLES-shared-${example}")
-    endforeach (example ${examples})
-  endif (BUILD_SHARED_LIBS)
+    endforeach ()
+  endif ()
 
 ### Windows pops up a modal permission dialog on this test
   if (H5_HAVE_PARALLEL AND NOT WIN32)
-    add_test (NAME EXAMPLES-ph5example COMMAND $<TARGET_FILE:ph5example>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME EXAMPLES-ph5example COMMAND $<TARGET_FILE:ph5example>)
+    else ()
+      add_test (NAME EXAMPLES-ph5example COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:ph5example>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=ph5example.txt"
+          #-D "TEST_REFERENCE=ph5example.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (EXAMPLES-ph5example PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "EXAMPLES-ph5example")
     if (BUILD_SHARED_LIBS)
-      add_test (NAME EXAMPLES-shared-ph5example COMMAND $<TARGET_FILE:ph5example-shared>)
+      if (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (NAME EXAMPLES-shared-ph5example COMMAND $<TARGET_FILE:ph5example-shared>)
+      else ()
+        add_test (NAME EXAMPLES-shared-ph5example COMMAND "${CMAKE_COMMAND}"
+            -D "TEST_PROGRAM=$<TARGET_FILE:ph5example-shared>"
+            -D "TEST_ARGS:STRING="
+            -D "TEST_EXPECT=0"
+            -D "TEST_SKIP_COMPARE=TRUE"
+            -D "TEST_OUTPUT=ph5example-shared.txt"
+            #-D "TEST_REFERENCE=ph5example-shared.out"
+            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/H5EX-shared"
+            -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
       set_tests_properties (EXAMPLES-shared-ph5example PROPERTIES WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/H5EX-shared)
       if (NOT "${last_test}" STREQUAL "")
         set_tests_properties (EXAMPLES-shared-ph5example PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
+      endif ()
       set (last_test "EXAMPLES-shared-ph5example")
-    endif (BUILD_SHARED_LIBS)
-  endif (H5_HAVE_PARALLEL AND NOT WIN32)
+    endif ()
+  endif ()
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 883b99d..8c6540f 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 965675a..b335568 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Examples Makefile(.in)
 #
@@ -409,6 +407,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -530,6 +529,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -726,18 +726,20 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1239,6 +1241,7 @@ installcheck-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1246,7 +1249,7 @@ 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)
+lib dyn 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                           \
diff --git a/examples/h5_attribute.c b/examples/h5_attribute.c
index 0ea0153..335f9c2 100644
--- a/examples/h5_attribute.c
+++ b/examples/h5_attribute.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_chunk_read.c b/examples/h5_chunk_read.c
index 98b0bb4..c3455f4 100644
--- a/examples/h5_chunk_read.c
+++ b/examples/h5_chunk_read.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_cmprss.c b/examples/h5_cmprss.c
index 8d365a3..ebc7712 100644
--- a/examples/h5_cmprss.c
+++ b/examples/h5_cmprss.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* 
diff --git a/examples/h5_compound.c b/examples/h5_compound.c
index 3fca2a5..b3b3a4a 100644
--- a/examples/h5_compound.c
+++ b/examples/h5_compound.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_crtatt.c b/examples/h5_crtatt.c
index 5e1378c..ade17ba 100644
--- a/examples/h5_crtatt.c
+++ b/examples/h5_crtatt.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_crtdat.c b/examples/h5_crtdat.c
index f9327e7..4a876d2 100644
--- a/examples/h5_crtdat.c
+++ b/examples/h5_crtdat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_crtgrp.c b/examples/h5_crtgrp.c
index a626ed8..89bddce 100644
--- a/examples/h5_crtgrp.c
+++ b/examples/h5_crtgrp.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_crtgrpar.c b/examples/h5_crtgrpar.c
index e8cf7c3..6f8c6e8 100644
--- a/examples/h5_crtgrpar.c
+++ b/examples/h5_crtgrpar.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_crtgrpd.c b/examples/h5_crtgrpd.c
index d6a320b..35c4389 100644
--- a/examples/h5_crtgrpd.c
+++ b/examples/h5_crtgrpd.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_drivers.c b/examples/h5_drivers.c
index 7245794..43c1fc7 100644
--- a/examples/h5_drivers.c
+++ b/examples/h5_drivers.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_dtransform.c b/examples/h5_dtransform.c
index 71ec10a..0b718ad 100644
--- a/examples/h5_dtransform.c
+++ b/examples/h5_dtransform.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_elink_unix2win.c b/examples/h5_elink_unix2win.c
index 9c0918c..df52015 100644
--- a/examples/h5_elink_unix2win.c
+++ b/examples/h5_elink_unix2win.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* This program demonstrates how to translate an external link created on
diff --git a/examples/h5_extend.c b/examples/h5_extend.c
index 105e553..6e3cff2 100644
--- a/examples/h5_extend.c
+++ b/examples/h5_extend.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_extend_write.c b/examples/h5_extend_write.c
index 56bd025..f3f6077 100644
--- a/examples/h5_extend_write.c
+++ b/examples/h5_extend_write.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_extlink.c b/examples/h5_extlink.c
index e8a24b8..ba632f5 100644
--- a/examples/h5_extlink.c
+++ b/examples/h5_extlink.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* This program demonstrates how to create and use "external links" in
diff --git a/examples/h5_group.c b/examples/h5_group.c
index 6b73210..8e89165 100644
--- a/examples/h5_group.c
+++ b/examples/h5_group.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_interm_group.c b/examples/h5_interm_group.c
index bd9c7c4..6507fd1 100644
--- a/examples/h5_interm_group.c
+++ b/examples/h5_interm_group.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_mount.c b/examples/h5_mount.c
index 6da71a1..a2e16c5 100644
--- a/examples/h5_mount.c
+++ b/examples/h5_mount.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_rdwt.c b/examples/h5_rdwt.c
index 0e290ca..6cd7f0f 100644
--- a/examples/h5_rdwt.c
+++ b/examples/h5_rdwt.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* 
diff --git a/examples/h5_read.c b/examples/h5_read.c
index 6fe75be..7fd8ad4 100644
--- a/examples/h5_read.c
+++ b/examples/h5_read.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_ref2reg.c b/examples/h5_ref2reg.c
index c4e8d3d..dc2964c 100644
--- a/examples/h5_ref2reg.c
+++ b/examples/h5_ref2reg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
     This program shows how to create, store and dereference references
diff --git a/examples/h5_reference.c b/examples/h5_reference.c
index 38e6146..32a5f59 100644
--- a/examples/h5_reference.c
+++ b/examples/h5_reference.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
  /*
diff --git a/examples/h5_select.c b/examples/h5_select.c
index ceb9c2c..bbc877c 100644
--- a/examples/h5_select.c
+++ b/examples/h5_select.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_shared_mesg.c b/examples/h5_shared_mesg.c
index 0c7f2f0..4e1f92a 100644
--- a/examples/h5_shared_mesg.c
+++ b/examples/h5_shared_mesg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/h5_subset.c b/examples/h5_subset.c
index 66872ea..904d3f8 100644
--- a/examples/h5_subset.c
+++ b/examples/h5_subset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* 
diff --git a/examples/h5_vds-eiger.c b/examples/h5_vds-eiger.c
index ea22243..13b5d93 100644
--- a/examples/h5_vds-eiger.c
+++ b/examples/h5_vds-eiger.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-exc.c b/examples/h5_vds-exc.c
index 039cdb8..aaf1fa8 100644
--- a/examples/h5_vds-exc.c
+++ b/examples/h5_vds-exc.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-exclim.c b/examples/h5_vds-exclim.c
index 4933471..fea096a 100644
--- a/examples/h5_vds-exclim.c
+++ b/examples/h5_vds-exclim.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-percival-unlim-maxmin.c b/examples/h5_vds-percival-unlim-maxmin.c
index a6eecfb..0273bbc 100644
--- a/examples/h5_vds-percival-unlim-maxmin.c
+++ b/examples/h5_vds-percival-unlim-maxmin.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-percival-unlim.c b/examples/h5_vds-percival-unlim.c
index 2496c37..f6a5f50 100644
--- a/examples/h5_vds-percival-unlim.c
+++ b/examples/h5_vds-percival-unlim.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-percival.c b/examples/h5_vds-percival.c
index 757bb69..11a974b 100644
--- a/examples/h5_vds-percival.c
+++ b/examples/h5_vds-percival.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 the virtual dataset.
diff --git a/examples/h5_vds-simpleIO.c b/examples/h5_vds-simpleIO.c
index 6b12dc2..56fa72b 100644
--- a/examples/h5_vds-simpleIO.c
+++ b/examples/h5_vds-simpleIO.c
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 I/O
diff --git a/examples/h5_vds.c b/examples/h5_vds.c
index 1e502c6..76b849a 100644
--- a/examples/h5_vds.c
+++ b/examples/h5_vds.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/examples/h5_write.c b/examples/h5_write.c
index 93d40ea..1a7cfe7 100644
--- a/examples/h5_write.c
+++ b/examples/h5_write.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/ph5example.c b/examples/ph5example.c
index 7a41db2..d718479 100644
--- a/examples/ph5example.c
+++ b/examples/ph5example.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/examples/run-all-ex.sh b/examples/run-all-ex.sh
index 4ff2c55..878e0f8 100755
--- a/examples/run-all-ex.sh
+++ b/examples/run-all-ex.sh
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hl-ex.sh
diff --git a/examples/run-c-ex.sh.in b/examples/run-c-ex.sh.in
index 1661344..4d5d594 100644
--- a/examples/run-c-ex.sh.in
+++ b/examples/run-c-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-c-ex.sh
diff --git a/examples/testh5cc.sh.in b/examples/testh5cc.sh.in
index d3f1cfc..800d4d4 100644
--- a/examples/testh5cc.sh.in
+++ b/examples/testh5cc.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for the h5cc compiler tool
 # Created: Albert Cheng, 2007/4/11
diff --git a/fortran/CMakeLists.txt b/fortran/CMakeLists.txt
index c725047..f7179cf 100644
--- a/fortran/CMakeLists.txt
+++ b/fortran/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_F90 C CXX Fortran)
 
 if (H5_HAVE_PARALLEL)
@@ -6,8 +6,8 @@ if (H5_HAVE_PARALLEL)
   set (LINK_LIBS ${LINK_LIBS} ${MPI_Fortran_LIBRARIES})
   if (MPI_Fortran_LINK_FLAGS)
     set (CMAKE_EXE_LINKER_FLAGS "${MPI_Fortran_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
-  endif (MPI_Fortran_LINK_FLAGS)
-endif (H5_HAVE_PARALLEL)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Traverse source subdirectory
@@ -19,7 +19,7 @@ add_subdirectory (${HDF5_F90_SOURCE_DIR}/src ${HDF5_F90_BINARY_DIR}/src)
 #-----------------------------------------------------------------------------
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_F90_SOURCE_DIR}/examples ${HDF5_F90_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Testing
@@ -28,5 +28,5 @@ if (BUILD_TESTING)
   add_subdirectory (${HDF5_F90_SOURCE_DIR}/test ${HDF5_F90_BINARY_DIR}/test)
   if (MPI_Fortran_FOUND)
     add_subdirectory (${HDF5_F90_SOURCE_DIR}/testpar ${HDF5_F90_BINARY_DIR}/testpar)
-  endif (MPI_Fortran_FOUND)
-endif (BUILD_TESTING)
+  endif ()
+endif ()
diff --git a/fortran/COPYING b/fortran/COPYING
index 6903daf..6497ace 100644
--- a/fortran/COPYING
+++ b/fortran/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/fortran/Makefile.am b/fortran/Makefile.am
index 9ddd6dd..38084b9 100644
--- a/fortran/Makefile.am
+++ b/fortran/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # This makefile mostly just reinvokes make in the various subdirectories
 # but does so in the correct order.  You can alternatively invoke make from
diff --git a/fortran/Makefile.in b/fortran/Makefile.in
index d15a251..4504d79 100644
--- a/fortran/Makefile.in
+++ b/fortran/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # This makefile mostly just reinvokes make in the various subdirectories
 # but does so in the correct order.  You can alternatively invoke make from
@@ -465,6 +463,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -586,6 +585,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -739,18 +739,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # All directories that have Makefiles
 DIST_SUBDIRS = src test testpar examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1252,6 +1254,7 @@ check-clean ::
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1259,7 +1262,7 @@ 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)
+lib dyn 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                           \
diff --git a/fortran/examples/CMakeLists.txt b/fortran/examples/CMakeLists.txt
index aad5f33..a5c3422 100644
--- a/fortran/examples/CMakeLists.txt
+++ b/fortran/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_F90_EXAMPLES C CXX Fortran)
 # --------------------------------------------------------------------
 # Notes: When creating examples they should be prefixed
@@ -66,8 +66,8 @@ foreach (example ${examples})
         FOLDER examples/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
     )
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endforeach (example ${examples})
+  endif ()
+endforeach ()
 
 foreach (example ${F2003_examples})
   add_executable (f03_ex_${example} ${HDF5_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
@@ -97,8 +97,8 @@ foreach (example ${F2003_examples})
         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 ()
+endforeach ()
 
 if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
   add_executable (f90_ex_ph5example ${HDF5_F90_EXAMPLES_SOURCE_DIR}/ph5example.f90)
@@ -130,9 +130,9 @@ if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
         FOLDER examples/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
     )
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
+  endif ()
+endif ()
 
 if (BUILD_TESTING)
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
diff --git a/fortran/examples/CMakeTests.cmake b/fortran/examples/CMakeTests.cmake
index 34230c8..3403571 100644
--- a/fortran/examples/CMakeTests.cmake
+++ b/fortran/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -28,7 +39,7 @@
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (f90_ex-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "f90_ex-clear-objects")
   if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     add_test (
@@ -53,45 +64,97 @@
     )
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (f90_ex-shared-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "f90_ex-shared-clear-objects")
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
 
 foreach (example ${examples})
-  add_test (NAME f90_ex_${example} COMMAND $<TARGET_FILE:f90_ex_${example}>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME f90_ex_${example} COMMAND $<TARGET_FILE:f90_ex_${example}>)
+  else ()
+    add_test (NAME f90_ex_${example} COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:f90_ex_${example}>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=f90_ex_${example}.txt"
+        #-D "TEST_REFERENCE=f90_ex_${example}.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (f90_ex_${example} PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "f90_ex_${example}")
   if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_test (NAME f90_ex-shared_${example} COMMAND $<TARGET_FILE:f90_ex_${example}-shared>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME f90_ex-shared_${example} COMMAND $<TARGET_FILE:f90_ex_${example}-shared>)
+    else ()
+      add_test (NAME f90_ex-shared_${example} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:f90_ex_${example}-shared>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=f90_ex_${example}-shared.txt"
+          #-D "TEST_REFERENCE=f90_ex_${example}-shared.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (f90_ex-shared_${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "f90_ex-shared_${example}")
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endforeach (example ${examples})
+  endif ()
+endforeach ()
 
 if (HDF5_ENABLE_F2003)
   foreach (example ${F2003_examples})
-    add_test (NAME f03_ex_${example} COMMAND $<TARGET_FILE:f03_ex_${example}>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME f03_ex_${example} COMMAND $<TARGET_FILE:f03_ex_${example}>)
+    else ()
+      add_test (NAME f03_ex_${example} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:f03_ex_${example}>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=f03_ex_${example}.txt"
+          #-D "TEST_REFERENCE=f03_ex_${example}.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (f03_ex_${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "f03_ex_${example}")
     if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-      add_test (NAME f03_ex-shared_${example} COMMAND $<TARGET_FILE:f03_ex_${example}-shared>)
+      if (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (NAME f03_ex-shared_${example} COMMAND $<TARGET_FILE:f03_ex_${example}-shared>)
+      else ()
+        add_test (NAME f03_ex-shared_${example} COMMAND "${CMAKE_COMMAND}"
+            -D "TEST_PROGRAM=$<TARGET_FILE:f03_ex_${example}-shared>"
+            -D "TEST_ARGS:STRING="
+            -D "TEST_EXPECT=0"
+            -D "TEST_SKIP_COMPARE=TRUE"
+            -D "TEST_OUTPUT=f03_ex_${example}-shared.txt"
+            #-D "TEST_REFERENCE=f03_ex_${example}-shared.out"
+            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+            -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
       if (NOT "${last_test}" STREQUAL "")
         set_tests_properties (f03_ex-shared_${example} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
+      endif ()
       set (last_test "f03_ex-shared_${example}")
-    endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  endforeach (example ${F2003_examples})
-endif (HDF5_ENABLE_F2003)
+    endif ()
+  endforeach ()
+endif ()
 
 if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
   add_test (NAME f90_ex_ph5example COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:f90_ex_ph5example>)
   if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     add_test (NAME f90_ex-shared_ph5example COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:f90_ex_ph5example>)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
+  endif ()
+endif ()
diff --git a/fortran/examples/Makefile.am b/fortran/examples/Makefile.am
index 5a3b09e..db85c09 100644
--- a/fortran/examples/Makefile.am
+++ b/fortran/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/fortran/examples/Makefile.in b/fortran/examples/Makefile.in
index 5ee3ad2..c2aa640 100644
--- a/fortran/examples/Makefile.in
+++ b/fortran/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-Fortran Examples Makefile(.in)
 #
@@ -414,6 +412,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -535,6 +534,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -726,18 +726,20 @@ 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1221,12 +1223,13 @@ installcheck-local:
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1234,7 +1237,7 @@ 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)
+lib dyn 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                           \
diff --git a/fortran/examples/compound.f90 b/fortran/examples/compound.f90
index 2005f41..f5e91d6 100644
--- a/fortran/examples/compound.f90
+++ b/fortran/examples/compound.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/compound_complex_fortran2003.f90 b/fortran/examples/compound_complex_fortran2003.f90
index 19671f7..6d0f291 100644
--- a/fortran/examples/compound_complex_fortran2003.f90
+++ b/fortran/examples/compound_complex_fortran2003.f90
@@ -5,12 +5,10 @@
 !                                                                           *
 ! This file is part of HDF5.  The full HDF5 copyright notice, including     *
 ! terms governing use, modification, and redistribution, is contained in    *
-! the files COPYING and Copyright.html.  COPYING can be found at the root   *
-! of the source code distribution tree; Copyright.html can be found at the  *
-! root level of an installed copy of the electronic HDF5 document set and   *
-! is linked from the top-level documents page.  It can also be found at     *
-! http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
-! access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu. *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example shows how to create an array of a compound datatype which 
diff --git a/fortran/examples/compound_fortran2003.f90 b/fortran/examples/compound_fortran2003.f90
index a55d1a6..0168177 100644
--- a/fortran/examples/compound_fortran2003.f90
+++ b/fortran/examples/compound_fortran2003.f90
@@ -5,12 +5,10 @@
 !                                                                           *
 ! This file is part of HDF5.  The full HDF5 copyright notice, including     *
 ! terms governing use, modification, and redistribution, is contained in    *
-! the files COPYING and Copyright.html.  COPYING can be found at the root   *
-! of the source code distribution tree; Copyright.html can be found at the  *
-! root level of an installed copy of the electronic HDF5 document set and   *
-! is linked from the top-level documents page.  It can also be found at     *
-! http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
-! access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu. *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example shows how to create a compound data type,
diff --git a/fortran/examples/h5_cmprss.f90 b/fortran/examples/h5_cmprss.f90
index 9ab28f7..61dd7b0 100644
--- a/fortran/examples/h5_cmprss.f90
+++ b/fortran/examples/h5_cmprss.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 ! 
 !  This example illustrates how to create a compressed dataset.
diff --git a/fortran/examples/h5_crtatt.f90 b/fortran/examples/h5_crtatt.f90
index 79bc576..7e287c6 100644
--- a/fortran/examples/h5_crtatt.f90
+++ b/fortran/examples/h5_crtatt.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example shows how to create and write a dataset attribute.
diff --git a/fortran/examples/h5_crtdat.f90 b/fortran/examples/h5_crtdat.f90
index 6e4c3a4..dce4408 100644
--- a/fortran/examples/h5_crtdat.f90
+++ b/fortran/examples/h5_crtdat.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/h5_crtgrp.f90 b/fortran/examples/h5_crtgrp.f90
index 278d175..12f07e7 100644
--- a/fortran/examples/h5_crtgrp.f90
+++ b/fortran/examples/h5_crtgrp.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/h5_crtgrpar.f90 b/fortran/examples/h5_crtgrpar.f90
index 4ef008a..341b648 100644
--- a/fortran/examples/h5_crtgrpar.f90
+++ b/fortran/examples/h5_crtgrpar.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/h5_crtgrpd.f90 b/fortran/examples/h5_crtgrpd.f90
index d35f03d..41c1f53 100644
--- a/fortran/examples/h5_crtgrpd.f90
+++ b/fortran/examples/h5_crtgrpd.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/h5_extend.f90 b/fortran/examples/h5_extend.f90
index 315d84f..20b91ff 100644
--- a/fortran/examples/h5_extend.f90
+++ b/fortran/examples/h5_extend.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example extends an HDF5 dataset. It is used in the HDF5 Tutorial.
diff --git a/fortran/examples/h5_rdwt.f90 b/fortran/examples/h5_rdwt.f90
index ba05b2f..2fbd85d 100644
--- a/fortran/examples/h5_rdwt.f90
+++ b/fortran/examples/h5_rdwt.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/h5_subset.f90 b/fortran/examples/h5_subset.f90
index 6cb8f7a..ab33c86 100644
--- a/fortran/examples/h5_subset.f90
+++ b/fortran/examples/h5_subset.f90
@@ -5,12 +5,10 @@
 !                                                                           *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including    *
 !  terms governing use, modification, and redistribution, is contained in   *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root  *
-!  of the source code distribution tree; Copyright.html can be found at the *
-!  root level of an installed copy of the electronic HDF5 document set and  *
-!  is linked from the top-level documents page.  It can also be found at    *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have         *
-!  access to either file, you may request a copy from help at hdfgroup.org.    *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example shows how to write and read a hyperslab.  
diff --git a/fortran/examples/hyperslab.f90 b/fortran/examples/hyperslab.f90
index 7823ff6..d340161 100644
--- a/fortran/examples/hyperslab.f90
+++ b/fortran/examples/hyperslab.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/mountexample.f90 b/fortran/examples/mountexample.f90
index 5bdec2a..4a2821d 100644
--- a/fortran/examples/mountexample.f90
+++ b/fortran/examples/mountexample.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/nested_derived_type.f90 b/fortran/examples/nested_derived_type.f90
index 65e7e75..68354ac 100644
--- a/fortran/examples/nested_derived_type.f90
+++ b/fortran/examples/nested_derived_type.f90
@@ -5,12 +5,10 @@
 !                                                                           *
 ! This file is part of HDF5.  The full HDF5 copyright notice, including     *
 ! terms governing use, modification, and redistribution, is contained in    *
-! the files COPYING and Copyright.html.  COPYING can be found at the root   *
-! of the source code distribution tree; Copyright.html can be found at the  *
-! root level of an installed copy of the electronic HDF5 document set and   *
-! is linked from the top-level documents page.  It can also be found at     *
-! http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
-! access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu. *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! This example shows how to create a nested compound data type,
diff --git a/fortran/examples/ph5example.f90 b/fortran/examples/ph5example.f90
index a0db200..9d4281e 100644
--- a/fortran/examples/ph5example.f90
+++ b/fortran/examples/ph5example.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! Fortran parallel example.  Copied from Tutorial's example program of
diff --git a/fortran/examples/refobjexample.f90 b/fortran/examples/refobjexample.f90
index c8622a7..d017598 100644
--- a/fortran/examples/refobjexample.f90
+++ b/fortran/examples/refobjexample.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/refregexample.f90 b/fortran/examples/refregexample.f90
index 68fbd24..ab45598 100644
--- a/fortran/examples/refregexample.f90
+++ b/fortran/examples/refregexample.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/run-fortran-ex.sh.in b/fortran/examples/run-fortran-ex.sh.in
index a4d4550..cace1ae 100644
--- a/fortran/examples/run-fortran-ex.sh.in
+++ b/fortran/examples/run-fortran-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hlfortran-ex.sh
diff --git a/fortran/examples/rwdset_fortran2003.f90 b/fortran/examples/rwdset_fortran2003.f90
index 682676f..36ebf0d 100644
--- a/fortran/examples/rwdset_fortran2003.f90
+++ b/fortran/examples/rwdset_fortran2003.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 !
 !
diff --git a/fortran/examples/selectele.f90 b/fortran/examples/selectele.f90
index dcd2379..4281ea6 100644
--- a/fortran/examples/selectele.f90
+++ b/fortran/examples/selectele.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/fortran/examples/testh5fc.sh.in b/fortran/examples/testh5fc.sh.in
index cd3b86e..f384909 100644
--- a/fortran/examples/testh5fc.sh.in
+++ b/fortran/examples/testh5fc.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for the h5fc compiler tool
 # Created: Albert Cheng, 2007/3/14
diff --git a/fortran/src/CMakeLists.txt b/fortran/src/CMakeLists.txt
index 8ebbbd0..6d51feb 100644
--- a/fortran/src/CMakeLists.txt
+++ b/fortran/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_F90_SRC C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -8,16 +8,16 @@ if (WIN32)
     if (MSVC)
       if (NOT H5_HAVE_PARALLEL)
         set (H5_NOPAREXP ";")
-      endif (NOT H5_HAVE_PARALLEL)
+      endif ()
       if (NOT HDF5_ENABLE_F2003)
         set (H5_NOF03EXP ";")
-      else (NOT HDF5_ENABLE_F2003)
+      else ()
         set (H5_F03EXP ";")
-      endif (NOT HDF5_ENABLE_F2003)
+      endif ()
       configure_file (${HDF5_F90_SRC_SOURCE_DIR}/hdf5_fortrandll.def.in ${HDF5_F90_SRC_BINARY_DIR}/hdf5_fortrandll.def @ONLY)
-    endif (MSVC)
-  endif (BUILD_SHARED_LIBS)
-endif (WIN32)
+    endif ()
+  endif ()
+endif ()
 
 # configure for Fortran preprocessor
 
@@ -25,12 +25,12 @@ endif (WIN32)
 set (CMAKE_H5_HAVE_PARALLEL 0)
 if (H5_HAVE_PARALLEL)
   set (CMAKE_H5_HAVE_PARALLEL 1)
-endif (H5_HAVE_PARALLEL)
+endif ()
 
 set (CMAKE_H5_HAVE_FLOAT128 0)
 if (HAVE_FLOAT128)
   set (CMAKE_H5_HAVE_FLOAT128 1)
-endif(HAVE_FLOAT128)
+endif ()
 
 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)
@@ -53,29 +53,30 @@ if (WIN32 AND MSVC)
         PROPERTIES
             COMPILE_FLAGS "/MT"
     )
-  endif (BUILD_SHARED_LIBS)
+  endif ()
   set_target_properties (H5_buildiface
       PROPERTIES
           LINK_FLAGS "/SUBSYSTEM:CONSOLE"
   )
-endif (WIN32 AND MSVC)
+endif ()
 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)
+  file (MAKE_DIRECTORY "${HDF5_F90_BINARY_DIR}/shared")
   if (WIN32)
-    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/\${BUILD_TYPE})
-  else (WIN32)
+    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/${CMAKE_BUILD_TYPE})
+  else ()
     set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
-  endif (WIN32)
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
+endif ()
 if (WIN32)
-  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/\${BUILD_TYPE})
-else (WIN32)
+  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/${CMAKE_BUILD_TYPE})
+else ()
   set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
-endif (WIN32)
+endif ()
 
 INCLUDE_DIRECTORIES (${HDF5_F90_BINARY_DIR} ${CMAKE_Fortran_MODULE_DIRECTORY})
 
@@ -92,11 +93,13 @@ add_custom_command (
     WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
     DEPENDS H5match_types
 )
+set_source_files_properties (${HDF5_F90_BINARY_DIR}/H5f90i_gen.h PROPERTIES GENERATED TRUE)
+set_source_files_properties (${HDF5_F90_BINARY_DIR}/H5fortran_types.F90 PROPERTIES GENERATED TRUE)
 
 #-----------------------------------------------------------------------------
 # f90CStub lib
 #-----------------------------------------------------------------------------
-set (f90CStub_C_SRCS
+set (f90CStub_C_SOURCES
     # normal distribution
     ${HDF5_F90_SRC_SOURCE_DIR}/H5f90kit.c
     ${HDF5_F90_SRC_SOURCE_DIR}/H5_f.c
@@ -114,15 +117,14 @@ set (f90CStub_C_SRCS
     ${HDF5_F90_SRC_SOURCE_DIR}/H5Tf.c
     ${HDF5_F90_SRC_SOURCE_DIR}/H5Zf.c
 )
-
-set_source_files_properties (${f90CStub_C_SRCS} PROPERTIES LANGUAGE C)
+set_source_files_properties (${f90CStub_C_SOURCES} PROPERTIES LANGUAGE C)
 
 set (f90CStub_C_HDRS
     # generated files
     ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h
 )
 
-add_library (${HDF5_F90_C_LIB_TARGET} STATIC ${f90CStub_C_SRCS} ${f90CStub_C_HDRS})
+add_library (${HDF5_F90_C_LIB_TARGET} STATIC ${f90CStub_C_SOURCES} ${f90CStub_C_HDRS})
 TARGET_C_PROPERTIES (${HDF5_F90_C_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_F90_C_LIB_TARGET} ${HDF5_LIB_TARGET} ${LINK_LIBS})
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_F90_C_LIB_TARGET}")
@@ -135,7 +137,7 @@ set_target_properties (${HDF5_F90_C_LIB_TARGET} PROPERTIES
 set (install_targets ${HDF5_F90_C_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_library (${HDF5_F90_C_LIBSH_TARGET} SHARED ${f90CStub_C_SRCS} ${f90CStub_C_HDRS})
+  add_library (${HDF5_F90_C_LIBSH_TARGET} SHARED ${f90CStub_C_SOURCES} ${f90CStub_C_HDRS})
   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}")
@@ -148,17 +150,45 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
   )
   set (install_targets ${install_targets} ${HDF5_F90_C_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-
-set_source_files_properties (${HDF5_F90_BINARY_DIR}/H5_gen.F90 PROPERTIES GENERATED TRUE)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Fortran Modules
 #-----------------------------------------------------------------------------
-set (f90_F_BASE_SRCS
-    # generated files
-    ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90
+set (f90_F_GEN_SOURCES
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Aff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Dff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Pff.F90
+)
+set (CMD $<TARGET_FILE:H5_buildiface>)
+add_custom_command (
+    OUTPUT ${HDF5_F90_BINARY_DIR}/H5_gen.F90
+    COMMAND ${CMD}
+    WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
+    DEPENDS ${f90_F_GEN_SOURCES}
+    COMMENT "Generating the H5_gen.F90 file"
+)
+add_custom_target (H5gen ALL
+    DEPENDS ${HDF5_F90_BINARY_DIR}/H5_gen.F90
+)
+set_source_files_properties (${HDF5_F90_BINARY_DIR}/H5_gen.F90 PROPERTIES GENERATED TRUE)
+
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  set (CMDSH $<TARGET_FILE:H5_buildiface>)
+  add_custom_command (
+      OUTPUT ${HDF5_F90_BINARY_DIR}/shared/H5_gen.F90
+      COMMAND ${CMDSH}
+      WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/shared
+      DEPENDS ${f90_F_GEN_SOURCES}
+      COMMENT "Generating the H5_gen.F90 shared file"
+  )
+  add_custom_target (H5genSH ALL
+      DEPENDS ${HDF5_F90_BINARY_DIR}/shared/H5_gen.F90
+  )
+  set_source_files_properties (${HDF5_F90_BINARY_DIR}/shared/H5_gen.F90 PROPERTIES GENERATED TRUE)
+endif ()
 
+set (f90_F_BASE_SOURCES
     # normal distribution
     ${HDF5_F90_SRC_SOURCE_DIR}/H5f90global.F90
     ${HDF5_F90_SRC_SOURCE_DIR}/H5fortkit.F90
@@ -178,8 +208,11 @@ set (f90_F_BASE_SRCS
     ${HDF5_F90_SRC_SOURCE_DIR}/H5Zff.F90
 )
 
-set (f90_F_SRCS
-    ${f90_F_BASE_SRCS}
+set (f90_F_SOURCES
+    # generated file
+    ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90
+
+    ${f90_F_BASE_SOURCES}
 
     # generated file
     ${HDF5_F90_BINARY_DIR}/H5_gen.F90
@@ -187,27 +220,31 @@ set (f90_F_SRCS
     # normal distribution
     ${HDF5_F90_SRC_SOURCE_DIR}/HDF5.F90
 )
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  set (f90_F_SOURCES_SHARED
+      # generated file
+      ${HDF5_F90_BINARY_DIR}/H5fortran_types.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}
-)
+      ${f90_F_BASE_SOURCES}
 
-set_source_files_properties (${f90_F_SRCS} PROPERTIES LANGUAGE Fortran)
+     # generated file
+      ${HDF5_F90_BINARY_DIR}/shared/H5_gen.F90
+
+      # normal distribution
+      ${HDF5_F90_SRC_SOURCE_DIR}/HDF5.F90
+  )
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Main fortran library
 #-----------------------------------------------------------------------------
-add_library (${HDF5_F90_LIB_TARGET} STATIC ${f90_F_SRCS})
+add_library (${HDF5_F90_LIB_TARGET} STATIC ${f90_F_SOURCES})
 set (SHARED_LINK_FLAGS " ")
 TARGET_FORTRAN_PROPERTIES (${HDF5_F90_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_F90_LIB_TARGET} ${HDF5_F90_C_LIB_TARGET} ${HDF5_LIB_TARGET})
 if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
   target_link_libraries (${HDF5_F90_LIB_TARGET} ${MPI_Fortran_LIBRARIES})
-endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
+endif ()
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_F90_LIB_TARGET}")
 H5_SET_LIB_OPTIONS (${HDF5_F90_LIB_TARGET} ${HDF5_F90_LIB_NAME} STATIC)
 set_target_properties (${HDF5_F90_LIB_TARGET} PROPERTIES
@@ -220,20 +257,21 @@ if (WIN32)
   set_property (TARGET ${HDF5_F90_LIB_TARGET}
       APPEND PROPERTY COMPILE_DEFINITIONS "HDF5F90_WINDOWS"
   )
-endif (WIN32)
+endif ()
 set (install_targets ${install_targets} ${HDF5_F90_LIB_TARGET})
+add_dependencies(${HDF5_F90_LIB_TARGET} H5gen)
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_library (${HDF5_F90_LIBSH_TARGET} SHARED ${f90_F_SRCS})
+  add_library (${HDF5_F90_LIBSH_TARGET} SHARED ${f90_F_SOURCES_SHARED})
   set (SHARED_LINK_FLAGS " ")
   if (WIN32 AND MSVC)
     set (SHARED_LINK_FLAGS "/DLL /DEF:${HDF5_F90_SRC_BINARY_DIR}/hdf5_fortrandll.def")
-  endif (WIN32 AND MSVC)
+  endif ()
   TARGET_FORTRAN_PROPERTIES (${HDF5_F90_LIBSH_TARGET} SHARED " " ${SHARED_LINK_FLAGS})
   target_link_libraries (${HDF5_F90_LIBSH_TARGET} ${HDF5_F90_C_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
     target_link_libraries (${HDF5_F90_LIBSH_TARGET} ${MPI_Fortran_LIBRARIES})
-  endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
+  endif ()
   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})
   set_target_properties (${HDF5_F90_LIBSH_TARGET} PROPERTIES
@@ -248,9 +286,10 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     set_property (TARGET ${HDF5_F90_LIBSH_TARGET}
       APPEND PROPERTY COMPILE_DEFINITIONS "BUILD_HDF5_DLL;HDF5F90_WINDOWS"
     )
-  endif (WIN32)
+  endif ()
   set (install_targets ${install_targets} ${HDF5_F90_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  add_dependencies(${HDF5_F90_LIBSH_TARGET} H5genSH)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -271,6 +310,7 @@ install (
 set (mod_files
     ${MOD_BUILD_DIR}/h5fortran_types.mod
     ${MOD_BUILD_DIR}/hdf5.mod
+    ${MOD_BUILD_DIR}/h5fortkit.mod
     ${MOD_BUILD_DIR}/h5global.mod
     ${MOD_BUILD_DIR}/h5a.mod
     ${MOD_BUILD_DIR}/h5d.mod
@@ -301,6 +341,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   set (modsh_files
       ${MODSH_BUILD_DIR}/h5fortran_types.mod
       ${MODSH_BUILD_DIR}/hdf5.mod
+      ${MODSH_BUILD_DIR}/h5fortkit.mod
       ${MODSH_BUILD_DIR}/h5global.mod
       ${MODSH_BUILD_DIR}/h5a.mod
       ${MODSH_BUILD_DIR}/h5d.mod
@@ -326,7 +367,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       COMPONENT
           fortheaders
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
@@ -335,7 +376,9 @@ if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     INSTALL_TARGET_PDB (${HDF5_F90_C_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} fortlibraries)
     #INSTALL_TARGET_PDB (${HDF5_F90_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} fortlibraries)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_F90_C_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} fortlibraries)
+  #INSTALL_TARGET_PDB (${HDF5_F90_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} fortlibraries)
 
   install (
       TARGETS
@@ -346,5 +389,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT fortlibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT fortlibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT fortlibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/fortran/src/H5Af.c b/fortran/src/H5Af.c
index 8f012cf..23dd936 100644
--- a/fortran/src/H5Af.c
+++ b/fortran/src/H5Af.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Aff.F90 b/fortran/src/H5Aff.F90
index 132bf41..827b803 100644
--- a/fortran/src/H5Aff.F90
+++ b/fortran/src/H5Aff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Df.c b/fortran/src/H5Df.c
index 57b4d4d..588ea9f 100644
--- a/fortran/src/H5Df.c
+++ b/fortran/src/H5Df.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Dff.F90 b/fortran/src/H5Dff.F90
index cb0b292..3915f72 100644
--- a/fortran/src/H5Dff.F90
+++ b/fortran/src/H5Dff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Ef.c b/fortran/src/H5Ef.c
index 4b1d4c9..0a2f2a3 100644
--- a/fortran/src/H5Ef.c
+++ b/fortran/src/H5Ef.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Eff.F90 b/fortran/src/H5Eff.F90
index 7a0b15b..fcd08ff 100644
--- a/fortran/src/H5Eff.F90
+++ b/fortran/src/H5Eff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
@@ -141,8 +139,9 @@ CONTAINS
        INTEGER FUNCTION h5eprint_c2()  BIND(C,NAME='h5eprint_c2')
        END FUNCTION h5eprint_c2
     END INTERFACE
-    namelen = LEN(NAME)
+
     IF (PRESENT(name)) THEN
+       namelen = LEN(NAME)
        hdferr = h5eprint_c1(name, namelen)
     ELSE
        hdferr = h5eprint_c2()
diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c
index c1cdb91..2d5f6ed 100644
--- a/fortran/src/H5Ff.c
+++ b/fortran/src/H5Ff.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Fff.F90 b/fortran/src/H5Fff.F90
index 165fba0..a3bef37 100644
--- a/fortran/src/H5Fff.F90
+++ b/fortran/src/H5Fff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Gf.c b/fortran/src/H5Gf.c
index b9c44bb..720bd49 100644
--- a/fortran/src/H5Gf.c
+++ b/fortran/src/H5Gf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Gff.F90 b/fortran/src/H5Gff.F90
index 30076a4..0684508 100644
--- a/fortran/src/H5Gff.F90
+++ b/fortran/src/H5Gff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5If.c b/fortran/src/H5If.c
index fdab0b6..8222817 100644
--- a/fortran/src/H5If.c
+++ b/fortran/src/H5If.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Iff.F90 b/fortran/src/H5Iff.F90
index c91a8aa..351dd4b 100644
--- a/fortran/src/H5Iff.F90
+++ b/fortran/src/H5Iff.F90
@@ -17,12 +17,10 @@
 !  *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 !  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Lf.c b/fortran/src/H5Lf.c
index 0d3aac2..32de037 100644
--- a/fortran/src/H5Lf.c
+++ b/fortran/src/H5Lf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Lff.F90 b/fortran/src/H5Lff.F90
index bc91072..d5bb1d1 100644
--- a/fortran/src/H5Lff.F90
+++ b/fortran/src/H5Lff.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Of.c b/fortran/src/H5Of.c
index 9e3ddc4..7d065a5 100644
--- a/fortran/src/H5Of.c
+++ b/fortran/src/H5Of.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Off.F90 b/fortran/src/H5Off.F90
index 8d4fb16..243ec29 100644
--- a/fortran/src/H5Off.F90
+++ b/fortran/src/H5Off.F90
@@ -18,12 +18,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Pf.c b/fortran/src/H5Pf.c
index 3989512..a114e8b 100644
--- a/fortran/src/H5Pf.c
+++ b/fortran/src/H5Pf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Pff.F90 b/fortran/src/H5Pff.F90
index e052ea0..b69d4d0 100644
--- a/fortran/src/H5Pff.F90
+++ b/fortran/src/H5Pff.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
@@ -6260,11 +6258,11 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
     INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
                                           ! of fillvalue datatype
                                           ! (in memory)
-    CHARACTER, INTENT(IN), TARGET :: fillvalue ! Fillvalue
+    CHARACTER(LEN=1), INTENT(IN), TARGET :: fillvalue ! Fillvalue
     INTEGER, INTENT(OUT) :: hdferr             ! Error code
     TYPE(C_PTR) :: f_ptr                       ! C address
 
-    f_ptr = C_LOC(fillvalue)
+    f_ptr = C_LOC(fillvalue(1:1))
     hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
 
   END SUBROUTINE h5pset_fill_value_char
@@ -6275,7 +6273,7 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
     INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
                                           ! of fillvalue datatype
                                           ! (in memory)
-    CHARACTER, INTENT(OUT) :: fillvalue   ! Fillvalue
+    CHARACTER(LEN=*), INTENT(OUT) :: fillvalue   ! Fillvalue
     INTEGER, INTENT(OUT) :: hdferr        ! Error code
 
     INTEGER :: i
@@ -6286,7 +6284,7 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
     ! 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)
+    chr_len = LEN(fillvalue(1:1))
     ALLOCATE(chr(1:chr_len), STAT=hdferr)
     IF (hdferr .NE. 0) THEN
        hdferr = -1
@@ -6397,18 +6395,18 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
 !!  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
+!!    TYPE(C_PTR)                 :: 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
+    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)                 :: fillvalue ! Fillvalue
+    INTEGER       , INTENT(OUT) :: hdferr    ! Error code
 
     hdferr = h5pget_fill_value_c(prp_id, type_id, fillvalue)
 
diff --git a/fortran/src/H5Rf.c b/fortran/src/H5Rf.c
index 9cd9950..6a3181f 100644
--- a/fortran/src/H5Rf.c
+++ b/fortran/src/H5Rf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Rff.F90 b/fortran/src/H5Rff.F90
index 7ba91c4..6d6371b 100644
--- a/fortran/src/H5Rff.F90
+++ b/fortran/src/H5Rff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Sf.c b/fortran/src/H5Sf.c
index 67427a7..2eae0d9 100644
--- a/fortran/src/H5Sf.c
+++ b/fortran/src/H5Sf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
@@ -30,9 +28,9 @@
  * PURPOSE
  *  Call H5Screate_simple to create a dataspace
  * INPUTS
- *  rank - number of dimensions of dataspace
- *  dims - array of the size of each dimension
-                maxdims - an array of the maximum 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
  * RETURNS
@@ -110,7 +108,7 @@ h5sclose_c ( hid_t_f *space_id )
  * INPUTS
  *  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
  * AUTHOR
@@ -142,7 +140,7 @@ h5screate_c ( int_f *classtype, hid_t_f *space_id )
  * PURPOSE
  *  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
  * RETURNS
@@ -179,10 +177,10 @@ h5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id)
  *  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
+ *                the current dataspace selection
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -217,10 +215,10 @@ h5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks)
  *  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
+ *                the current dataspace selection
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -259,10 +257,10 @@ h5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points)
  *  blocks are inserted, the buffer
  *  will contain only as many blocks as fit.
  * INPUTS
- *  space_id - identifier of the dataspace
+ *  space_id   - identifier of the dataspace
  *  startblock - Hyperslab block to start with
  *  num_blocks -  number of hyperslab blocks in
- *  the current dataspace selection
+ *                the current dataspace selection
  * OUTPUTS
  *  buf - List of hyperslab blocks selected
  * RETURNS
@@ -312,9 +310,9 @@ h5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f *startblock,
   for (i=0; i < c_num_blocks; i++) {
     for (j=0; j < rank; j++) {
       for (k=0; k < rank; k++) {
-	int t= (m + rank - k - 1);
-	buf[n] = (hsize_t_f)c_buf[t]+1;
-	n = n + 1;
+        int t= (m + rank - k - 1);
+        buf[n] = (hsize_t_f)c_buf[t]+1;
+        n = n + 1;
       }
       m = m + rank;
     }
@@ -336,8 +334,8 @@ h5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f *startblock,
  *  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
+ *  end   -  Ending coordinates of the bounding box,
+ *           i.e., the coordinates of the diagonally opposite corne
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -390,9 +388,9 @@ done:
  *  points are inserted, the buffer
  *  will contain only as many points as fit.
  * INPUTS
- *  space_id - identifier of the dataspace
+ *  space_id   - identifier of the dataspace
  *  startpoint - Element point to start with
- *  numpoints -  Number of element points to get
+ *  numpoints  -  Number of element points to get
  * OUTPUTS
  *  buf - List of element points selected
  * RETURNS
@@ -516,8 +514,8 @@ h5sselect_none_c ( hid_t_f *space_id )
  * INPUTS
  *  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
  * AUTHOR
@@ -552,7 +550,7 @@ h5sselect_valid_c ( hid_t_f *space_id , int_f *flag )
  * INPUTS
  *  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
  * AUTHOR
@@ -587,7 +585,7 @@ h5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints )
  * INPUTS
  *  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
  * AUTHOR
@@ -655,7 +653,7 @@ h5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims )
  *  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:
  *              H5S_SCALAR_F (0), H5S_SIMPLE_F (1), H5S_NULL_F (2)
@@ -697,7 +695,7 @@ h5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype)
  *  dataspace
  * INPUTS
  *  space_id - identifier of the dataspace
- *  offset - offset array
+ *  offset   - offset array
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -743,8 +741,8 @@ done:
  *  Call H5Sset_extent_simple to set or reset size of
  *  existing  dataspace
  * INPUTS
- *  space_id - identifier of the dataspace
- *  rank - dataspace rank
+ *  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
@@ -791,7 +789,7 @@ done:
  * INPUTS
  *  space_id - identifier of the dataspace
  * OUTPUTS
- *  dims - array with the dimension sizes
+ *  dims    - array with the dimension sizes
  *  maxdims - aray with maximum sizes of dimensions
  * RETURNS
  *  number of dataspace dimensions (rank) on success, -1 on failure
@@ -845,8 +843,8 @@ done:
  * INPUTS
  *  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
  * AUTHOR
@@ -879,7 +877,7 @@ h5sis_simple_c ( hid_t_f *space_id , int_f *flag )
  * PURPOSE
  *  Call H5Sextent_copy to copy an extent of dataspace
  * INPUTS
- *  dest_space_id - identifier of the destination dataspace
+ *  dest_space_id   - identifier of the destination dataspace
  *  source_space_id - identifier of the source dataspace
  * RETURNS
  *  0 on success, -1 on failure
@@ -945,12 +943,12 @@ h5sset_extent_none_c ( hid_t_f *space_id )
  * INPUTS
  *  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
+ *             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
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -1006,10 +1004,10 @@ done:
  * 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
+ *  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
  * RETURNS
@@ -1087,10 +1085,10 @@ DONE:
  *  Call H5Scombine_ select
  * INPUTS
  *  space1_id - identifier of the first dataspace
- *  operator - defines how the new selection is combined
+ *  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
  * AUTHOR
@@ -1199,12 +1197,12 @@ h5sget_select_type_c ( hid_t_f *space_id , int_f *type)
  * PURPOSE
  *  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
- *              H5S_SELECT_SET_F (0)
+ *  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
+ *  coord     - arrays with the elements coordinates
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -1238,7 +1236,7 @@ h5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements,  hsiz
   if(!c_coord) return ret_value;
   for (i=0; i< (size_t)*nelements; i++) {
       for (j = 0; j < rank; j++) {
-	c_coord[(size_t)j+i*(size_t)rank] = (hsize_t)coord[(size_t)j + i*(size_t)rank];
+        c_coord[(size_t)j+i*(size_t)rank] = (hsize_t)coord[(size_t)j + i*(size_t)rank];
       }
   }
 
@@ -1255,12 +1253,9 @@ h5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements,  hsiz
  * PURPOSE
  *  Call H5Sdecode
  * INPUTS
- *
- *		buf     - Buffer for the data space object to be decoded.
+ *  buf    - Buffer for the data space object to be decoded.
  * OUTPUTS
- *
  *  obj_id  - Object_id (non-negative)
- *
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -1301,9 +1296,8 @@ h5sdecode_c ( _fcd buf, hid_t_f *obj_id )
  * PURPOSE
  *  Call H5Sencode
  * INPUTS
- *
  *  obj_id - Identifier of the object to be encoded.
- *		 buf - Buffer for the object to be encoded into.
+ *  buf    - Buffer for the object to be encoded into.
  *  nalloc - The size of the allocated buffer.
  * RETURNS
  *  0 on success, -1 on failure
@@ -1370,11 +1364,9 @@ h5sencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
  * PURPOSE
  *  Call H5Sextent_equal
  * INPUTS
- *
- *		space1_id - First dataspace identifier.
+ *  space1_id - First dataspace identifier.
  *  space2_id - Second dataspace identifier.
  * OUTPUTS
- *
  *  equal - TRUE if equal, FALSE if unequal.
  * RETURNS
  *  0 on success, -1 on failure
diff --git a/fortran/src/H5Sff.F90 b/fortran/src/H5Sff.F90
index cb1388e..3434fba 100644
--- a/fortran/src/H5Sff.F90
+++ b/fortran/src/H5Sff.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Tf.c b/fortran/src/H5Tf.c
index 9928d0a..c40abae 100644
--- a/fortran/src/H5Tf.c
+++ b/fortran/src/H5Tf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Tff.F90 b/fortran/src/H5Tff.F90
index 6b8f896..b63c61d 100644
--- a/fortran/src/H5Tff.F90
+++ b/fortran/src/H5Tff.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/src/H5Zf.c b/fortran/src/H5Zf.c
index a8cf1c2..7afafd5 100644
--- a/fortran/src/H5Zf.c
+++ b/fortran/src/H5Zf.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5Zff.F90 b/fortran/src/H5Zff.F90
index 0259959..848f047 100644
--- a/fortran/src/H5Zff.F90
+++ b/fortran/src/H5Zff.F90
@@ -14,12 +14,10 @@
 !                                                                              *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including       *
 !  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 !  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES!
diff --git a/fortran/src/H5_buildiface.F90 b/fortran/src/H5_buildiface.F90
index 4b00d80..d4ebdd3 100644
--- a/fortran/src/H5_buildiface.F90
+++ b/fortran/src/H5_buildiface.F90
@@ -33,12 +33,10 @@
 !                                                                              *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including       *
 !  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  the COPYING file, which can be found at the root of the source code         *
+!  distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.    *
+!  If you do not have access to either file, you may request a copy from       *
+!  help at hdfgroup.org.                                                          *
 !  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! AUTHOR
@@ -124,12 +122,10 @@ PROGRAM H5_buildiface
 '!                                                                             *',&
 '!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
 '!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'!   the COPYING file, which can be found at the root of the source code       *',&
+'!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *',&
+'!   If you do not have access to either file, you may request a copy from     *',&
+'!   help at hdfgroup.org.                                                        *',&
 '! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
 '!',&
 '! AUTHOR',&
diff --git a/fortran/src/H5_f.c b/fortran/src/H5_f.c
index d7b952d..352ffab 100644
--- a/fortran/src/H5_f.c
+++ b/fortran/src/H5_f.c
@@ -10,12 +10,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
@@ -23,6 +21,10 @@
 
 #include "H5f90.h"
 #include "H5fort_type_defines.h"
+
+int IntKinds_SizeOf[] = H5_FORTRAN_INTEGER_KINDS_SIZEOF;
+
+
 /****if* H5_f/h5init_types_c
  * NAME
  *  h5init_types_c
@@ -30,16 +32,16 @@
  *  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
+ *          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
+ *                 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
@@ -55,173 +57,116 @@ 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;
+    int i;
+
+    /* Fortran INTEGER may not be the same as C; do all checking to find
+       an appropriate size
+    */
+
+    /*
+     * Find the HDF5 type of the Fortran Integer KIND.
+     */
+
+    /* Initialized INTEGER KIND types to default to native integer */
+    for(i=0;i<5;i++) {
+      if ((types[i] = (hid_t_f)H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+    }
+
+    for(i=0;i<H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+      if ( IntKinds_SizeOf[i] == sizeof(char)) {
+	if ((types[i] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
+      } /*end if */
+      else if ( IntKinds_SizeOf[i] == sizeof(short)) {
+	if ((types[i] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
+      } /*end if */
+      else if ( IntKinds_SizeOf[i] == sizeof(int)) {
+	if ((types[i] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
+      } /*end if */
+      else if ( IntKinds_SizeOf[i] == sizeof(long long)) {
+	if ((types[i] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
+      } /*end if */
+      else {
+	if ((types[i] = (hid_t_f)H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+	if ( H5Tset_precision (types[i], 128) < 0) return ret_value;
+      } /*end else */
+
+    }
 
-/* Fortran INTEGER may not be the same as C; do all checking to find
-   an appropriate size
-*/
     if (sizeof(int_f) == sizeof(int)) {
-    if ((types[0] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
+      if ((types[5] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
     } /*end if */
     else if (sizeof(int_f) == sizeof(long)) {
-    if ((types[0] = (hid_t_f)H5Tcopy(H5T_NATIVE_LONG)) < 0) return ret_value;
+      if ((types[5] = (hid_t_f)H5Tcopy(H5T_NATIVE_LONG)) < 0) return ret_value;
     } /*end if */
     else
-    if (sizeof(int_f) == sizeof(long long)) {
-    if ((types[0] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
+      if (sizeof(int_f) == sizeof(long long)) {
+	if ((types[5] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
     } /*end else */
-
+    
     /* Find appropriate size to store Fortran REAL */
     if(sizeof(real_f)==sizeof(float)) {
-        if ((types[1] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
+      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /* end if */
     else if(sizeof(real_f)==sizeof(double)){
-        if ((types[1] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     } /* end if */
 #if H5_SIZEOF_LONG_DOUBLE!=0
     else if (sizeof(real_f) == sizeof(long double)) {
-        if ((types[1] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
+      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     } /* end else */
 #endif
 
     /* Find appropriate size to store Fortran DOUBLE */
     if(sizeof(double_f)==sizeof(double)) {
-       if ((types[2] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+       if ((types[7] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     }/*end if */
 #if H5_SIZEOF_LONG_DOUBLE!=0
     else if(sizeof(double_f)==sizeof(long double)) {
-       if ((types[2] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
+       if ((types[7] = (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;
+      if ((types[7] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[7], 128) < 0) return ret_value;
     }/*end else */
 #endif
 
-/*
-    if ((types[3] = H5Tcopy(H5T_NATIVE_UINT8)) < 0) return ret_value;
-*/
     if ((c_type_id = H5Tcopy(H5T_FORTRAN_S1)) < 0) return ret_value;
     tmp_val = 1;
     if(H5Tset_size(c_type_id, tmp_val) < 0) return ret_value;
     if(H5Tset_strpad(c_type_id, H5T_STR_SPACEPAD) < 0) return ret_value;
-    types[3] = (hid_t_f)c_type_id;
+    types[8] = (hid_t_f)c_type_id;
 
-/*
-    if ((types[3] = H5Tcopy(H5T_C_S1)) < 0) return ret_value;
-    if(H5Tset_strpad(types[3],H5T_STR_NULLTERM) < 0) return ret_value;
-    if(H5Tset_size(types[3],1) < 0) return ret_value;
-*/
-
-
-/*    if ((types[3] = H5Tcopy(H5T_STD_I8BE)) < 0) return ret_value;
-*/
-    if ((types[4] = (hid_t_f)H5Tcopy(H5T_STD_REF_OBJ)) < 0) return ret_value;
-    if ((types[5] = (hid_t_f)H5Tcopy(H5T_STD_REF_DSETREG)) < 0) return ret_value;
-    /*
-     * FIND H5T_NATIVE_INTEGER_1
-     */
-    if (sizeof(int_1_f) == sizeof(char)) {
-      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_1_f) == sizeof(short)) {
-      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_1_f) == sizeof(int)) {
-      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;
-    } /*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
-     */
-    if (sizeof(int_2_f) == sizeof(char)) {
-      if ((types[7] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_2_f) == sizeof(short)) {
-      if ((types[7] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_2_f) == sizeof(int)) {
-      if ((types[7] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
-    } /*end if */
-    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
-     */
-    if (sizeof(int_4_f) == sizeof(char)) {
-      if ((types[8] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_4_f) == sizeof(short)) {
-      if ((types[8] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_4_f) == sizeof(int)) {
-      if ((types[8] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
-    } /*end if */
-    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
-     */
-    if (sizeof(int_8_f) == sizeof(char)) {
-      if ((types[9] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_8_f) == sizeof(short)) {
-      if ((types[9] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
-    } /*end if */
-    else if (sizeof(int_8_f) == sizeof(int)) {
-      if ((types[9] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
-    } /*end if */
-    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 */
+    if ((types[9] = (hid_t_f)H5Tcopy(H5T_STD_REF_OBJ)) < 0) return ret_value;
+    if ((types[10] = (hid_t_f)H5Tcopy(H5T_STD_REF_DSETREG)) < 0) return ret_value;
 
     /*
      * FIND H5T_NATIVE_REAL_C_FLOAT
      */
     if (sizeof(real_C_FLOAT_f) == sizeof(float)) {
-      if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
+      if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
     else if (sizeof(real_C_FLOAT_f) == sizeof(double)) {
-      if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+      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_C_FLOAT_f) == sizeof(long double)) {
-	if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
+	if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     } /*end else */
 #endif
     /*
      * FIND H5T_NATIVE_REAL_C_DOUBLE
      */
     if (sizeof(real_C_DOUBLE_f) == sizeof(float)) {
-      if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
+      if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
     else if (sizeof(real_C_DOUBLE_f) == sizeof(double)) {
-      if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+      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_C_DOUBLE_f) == sizeof(long double)) {
-	if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
+	if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     } /*end else */
 #endif
     /*
@@ -229,67 +174,44 @@ h5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertypes
      */
 #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;
+      if ((types[13] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
     else if (sizeof(real_C_LONG_DOUBLE_f) == sizeof(double)) {
-      if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+      if ((types[13] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     } /*end if */
 # 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;
+	if ((types[13] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
       }
       else {
-	if ((types[12] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
-	if ( H5Tset_precision (types[12], 128) < 0) return ret_value;
+	if ((types[13] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+	if ( H5Tset_precision (types[13], 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;
+    if ((types[13] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+    if ( H5Tset_precision (types[13], 64) < 0) return ret_value;
 # endif
 #else
-    if ((types[12] = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
+    if ((types[13] = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
 #endif
     /*
      * FIND H5T_NATIVE_B_8
      */
-    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 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
+    if ((types[14] = (hid_t_f)H5Tcopy(H5T_NATIVE_B8))  < 0) return ret_value;
+    if ((types[15] = (hid_t_f)H5Tcopy(H5T_NATIVE_B16)) < 0) return ret_value;
+    if ((types[16] = (hid_t_f)H5Tcopy(H5T_NATIVE_B32)) < 0) return ret_value;
+    if ((types[17] = (hid_t_f)H5Tcopy(H5T_NATIVE_B64)) < 0) return ret_value;
 
-     /*
+    /*
      * 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;
     if ((floatingtypes[2] = (hid_t_f)H5Tcopy(H5T_IEEE_F64BE)) < 0) return ret_value;
@@ -410,6 +332,7 @@ h5close_types_c( hid_t_f * types, int_f *lentypes,
  *  h5p_flags_int   - H5P interface flags of type integer
  *  h5r_flags       - H5R interface flags
  *  h5s_flags       - H5S interface flags
+ *  h5s_hid_flags   - H5S interface flags of type hid_t
  *  h5s_hsize_flags - H5S interface flags of type hsize_t
  *  h5t_flags       - H5T interface flags
  *  h5z_flags       - H5Z interface flags
@@ -432,6 +355,8 @@ h5close_types_c( hid_t_f * types, int_f *lentypes,
  *           MSB, July 9, 2009
  *  Added type h5d_flags of type size_t
  *           MSB, Feb. 28, 2014
+ *  Added type h5s_hid_flags of type hid_t
+ *           MSB, Oct. 10, 2016
  * SOURCE
  */
 int_f
@@ -439,8 +364,9 @@ 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,
+                hid_t_f *h5p_flags, int_f *h5p_flags_int, int_f *h5r_flags, 
+                int_f *h5s_flags, hid_t_f *h5s_hid_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)
 /******/
 {
@@ -669,29 +595,32 @@ h5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
 /*
  *  H5S flags
  */
+      
+      h5s_hid_flags[0] = (hid_t_f)H5S_ALL;
+
+      h5s_hsize_flags[0] = (hsize_t_f)H5S_UNLIMITED;
+
       h5s_flags[0] = (int_f)H5S_SCALAR;
       h5s_flags[1] = (int_f)H5S_SIMPLE;
       h5s_flags[2] = (int_f)H5S_NULL;
       h5s_flags[3] = (int_f)H5S_SELECT_SET;
       h5s_flags[4] = (int_f)H5S_SELECT_OR;
-      h5s_flags[5] = (int_f)H5S_ALL;
-
-      h5s_flags[6] = (int_f)H5S_SELECT_NOOP;
-      h5s_flags[7] = (int_f)H5S_SELECT_AND;
-      h5s_flags[8] = (int_f)H5S_SELECT_XOR;
-      h5s_flags[9] = (int_f)H5S_SELECT_NOTB;
-      h5s_flags[10] = (int_f)H5S_SELECT_NOTA;
-      h5s_flags[11] = (int_f)H5S_SELECT_APPEND;
-      h5s_flags[12] = (int_f)H5S_SELECT_PREPEND;
-      h5s_flags[13] = (int_f)H5S_SELECT_INVALID;
-
-      h5s_flags[14] = (int_f)H5S_SEL_ERROR;
-      h5s_flags[15] = (int_f)H5S_SEL_NONE;
-      h5s_flags[16] = (int_f)H5S_SEL_POINTS;
-      h5s_flags[17] = (int_f)H5S_SEL_HYPERSLABS;
-      h5s_flags[18] = (int_f)H5S_SEL_ALL;
 
-      h5s_hsize_flags[0] = (hsize_t_f)H5S_UNLIMITED;
+      h5s_flags[5] = (int_f)H5S_SELECT_NOOP;
+      h5s_flags[6] = (int_f)H5S_SELECT_AND;
+      h5s_flags[7] = (int_f)H5S_SELECT_XOR;
+      h5s_flags[8] = (int_f)H5S_SELECT_NOTB;
+      h5s_flags[9] = (int_f)H5S_SELECT_NOTA;
+
+      h5s_flags[10] = (int_f)H5S_SELECT_APPEND;
+      h5s_flags[11] = (int_f)H5S_SELECT_PREPEND;
+      h5s_flags[12] = (int_f)H5S_SELECT_INVALID;
+      h5s_flags[13] = (int_f)H5S_SEL_ERROR;
+      h5s_flags[14] = (int_f)H5S_SEL_NONE;
+
+      h5s_flags[15] = (int_f)H5S_SEL_POINTS;
+      h5s_flags[16] = (int_f)H5S_SEL_HYPERSLABS;
+      h5s_flags[17] = (int_f)H5S_SEL_ALL;
 
 /*
  *  H5T flags
diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90
index 169864f..ef89d2f 100644
--- a/fortran/src/H5_ff.F90
+++ b/fortran/src/H5_ff.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
@@ -102,6 +100,7 @@ CONTAINS
             i_H5P_flags_int, &
             i_H5R_flags, &
             i_H5S_flags, &
+            i_H5S_hid_flags, &
             i_H5S_hsize_flags, &
             i_H5T_flags, &
             i_H5Z_flags, &
@@ -114,7 +113,7 @@ CONTAINS
               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, &
+              H5R_FLAGS_LEN, H5S_FLAGS_LEN, H5S_HID_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)
@@ -132,6 +131,7 @@ CONTAINS
          INTEGER i_H5P_flags_int(H5P_FLAGS_INT_LEN)
          INTEGER i_H5R_flags(H5R_FLAGS_LEN)
          INTEGER i_H5S_flags(H5S_FLAGS_LEN)
+         INTEGER(HID_T) i_H5S_hid_flags(H5S_HID_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)
@@ -163,6 +163,7 @@ CONTAINS
          H5P_flags_int, &
          H5R_flags, &
          H5S_flags, &
+         H5S_hid_flags, &
          H5S_hsize_flags, &
          H5T_flags, &
          H5Z_flags, &
@@ -379,27 +380,23 @@ CONTAINS
     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
-    
-
+    INTEGER :: i
 !*****
+
+!#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+!    ! (1) The array index assumes INTEGER*16 the last integer in the series, and
+!    ! (2) it should map to INTEGER*16 on most modern processors
+!    H5T_NATIVE_INTEGER_KIND(H5_FORTRAN_NUM_INTEGER_KINDS)=SELECTED_INT_KIND(36)
+!#endif
+
+    h5_type = -1
     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
+       do_kind: DO i = 1, H5_FORTRAN_NUM_INTEGER_KINDS
+          IF(ikind.EQ.Fortran_INTEGER_AVAIL_KINDS(i))THEN
+             h5_type = H5T_NATIVE_INTEGER_KIND(i)
+             EXIT do_kind
+          ENDIF
+       END DO do_kind
     ELSE IF(flag.EQ.H5_REAL_KIND)THEN
        IF(ikind.EQ.KIND(1.0_C_FLOAT))THEN
           h5_type = H5T_NATIVE_REAL_C_FLOAT
@@ -409,14 +406,11 @@ CONTAINS
        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_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
diff --git a/fortran/src/H5config_f.inc.cmake b/fortran/src/H5config_f.inc.cmake
index f0b3472..f85db6c 100644
--- a/fortran/src/H5config_f.inc.cmake
+++ b/fortran/src/H5config_f.inc.cmake
@@ -1,3 +1,14 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   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 COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 ! fortran/src/H5config_f.inc. Generated from fortran/src/H5config_f.inc.in by configure
 
 ! Define if we have parallel support
diff --git a/fortran/src/H5config_f.inc.in b/fortran/src/H5config_f.inc.in
index 9f094d2..8921493 100644
--- a/fortran/src/H5config_f.inc.in
+++ b/fortran/src/H5config_f.inc.in
@@ -1,3 +1,14 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   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 COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 ! 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
diff --git a/fortran/src/H5f90.h b/fortran/src/H5f90.h
index 7082d1d..eabe3d0 100644
--- a/fortran/src/H5f90.h
+++ b/fortran/src/H5f90.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/fortran/src/H5f90global.F90 b/fortran/src/H5f90global.F90
index af0a000..dd2b171 100644
--- a/fortran/src/H5f90global.F90
+++ b/fortran/src/H5f90global.F90
@@ -28,12 +28,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! AUTHOR
@@ -85,11 +83,7 @@ MODULE H5GLOBAL
   ! 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, &
+  INTEGER(HID_T) :: H5T_NATIVE_REAL_C_FLOAT, &
        H5T_NATIVE_REAL_C_DOUBLE, &
        H5T_NATIVE_REAL_C_LONG_DOUBLE, &
        H5T_NATIVE_INTEGER, &
@@ -115,8 +109,11 @@ MODULE H5GLOBAL
        H5T_STD_U16BE,   &
        H5T_STD_U16LE,   &
        H5T_STD_U32BE
-       
-  INTEGER(HID_T) :: H5T_NATIVE_INTEGER_16 ! NEED IFDEF -MSB-
+
+  INTEGER, PARAMETER :: NUM_NATIVE_INTEGER_KIND = 5
+  ! INTEGER*1, INTEGER*2, INTEGER*4, INTEGER*8, INTEGER*16
+  INTEGER(HID_T), DIMENSION(1:NUM_NATIVE_INTEGER_KIND) :: H5T_NATIVE_INTEGER_KIND
+
   INTEGER(HID_T) :: H5T_NATIVE_FLOAT_128 ! NEED IFDEF -MSB-
 
 ! NOTE: Splitting the line since the Fortran 95 standard limits the number of 
@@ -144,24 +141,24 @@ MODULE H5GLOBAL
 
 
   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(1), H5T_NATIVE_INTEGER_KIND(1))
+  EQUIVALENCE (predef_types(2), H5T_NATIVE_INTEGER_KIND(2))
+  EQUIVALENCE (predef_types(3), H5T_NATIVE_INTEGER_KIND(3))
+  EQUIVALENCE (predef_types(4), H5T_NATIVE_INTEGER_KIND(4))
+  EQUIVALENCE (predef_types(5), H5T_NATIVE_INTEGER_KIND(5))
+  EQUIVALENCE (predef_types(6), H5T_NATIVE_INTEGER)
+  EQUIVALENCE (predef_types(7), H5T_NATIVE_REAL)
+  EQUIVALENCE (predef_types(8), H5T_NATIVE_DOUBLE)
+  EQUIVALENCE (predef_types(9), H5T_NATIVE_CHARACTER)
+  EQUIVALENCE (predef_types(10), H5T_STD_REF_OBJ)
+  EQUIVALENCE (predef_types(11), H5T_STD_REF_DSETREG)
+  EQUIVALENCE (predef_types(12), H5T_NATIVE_REAL_C_FLOAT)
+  EQUIVALENCE (predef_types(13), H5T_NATIVE_REAL_C_DOUBLE)
+  EQUIVALENCE (predef_types(14), H5T_NATIVE_REAL_C_LONG_DOUBLE)
+  EQUIVALENCE (predef_types(15), H5T_NATIVE_B8 )
+  EQUIVALENCE (predef_types(16), H5T_NATIVE_B16)
+  EQUIVALENCE (predef_types(17), H5T_NATIVE_B32)
+  EQUIVALENCE (predef_types(18), H5T_NATIVE_B64)
   EQUIVALENCE (predef_types(19), H5T_NATIVE_FLOAT_128)   ! ADDED NEW TYPE -MSB-
 
   INTEGER(HID_T), DIMENSION(FLOATING_TYPES_LEN) :: floating_types
@@ -748,25 +745,29 @@ MODULE H5GLOBAL
   !
   ! H5S flags declaration
   !
-  INTEGER, PARAMETER :: H5S_FLAGS_LEN = 19
+  INTEGER, PARAMETER :: H5S_FLAGS_LEN = 18
   INTEGER :: H5S_flags(H5S_FLAGS_LEN)
   INTEGER, PARAMETER :: H5S_HSIZE_FLAGS_LEN = 1
   INTEGER(HSIZE_T) H5S_hsize_flags(H5S_HSIZE_FLAGS_LEN)
+  INTEGER, PARAMETER :: H5S_HID_FLAGS_LEN = 1
+  INTEGER(HSIZE_T) H5S_hid_flags(H5S_HID_FLAGS_LEN)
   !DEC$if defined(BUILD_HDF5_DLL)
   !DEC$ATTRIBUTES DLLEXPORT :: /H5S_FLAGS/
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5S_HID_FLAGS/
   !DEC$ATTRIBUTES DLLEXPORT :: /H5S_HSIZE_FLAGS/
   !DEC$endif
   COMMON /H5S_FLAGS/ H5S_flags
+  COMMON /H5S_HID_FLAGS/ H5S_hid_flags
   COMMON /H5S_HSIZE_FLAGS/ H5S_hsize_flags
 
   INTEGER(HSIZE_T) :: H5S_UNLIMITED_F
 
+  INTEGER(HID_T) :: H5S_ALL_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
@@ -784,29 +785,31 @@ MODULE H5GLOBAL
   INTEGER :: H5S_SEL_HYPERSLABS_F
   INTEGER :: H5S_SEL_ALL_F
 
+  EQUIVALENCE(H5S_hid_flags(1), H5S_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)
+
+  EQUIVALENCE(H5S_flags(6), H5S_SELECT_NOOP_F)
+  EQUIVALENCE(H5S_flags(7), H5S_SELECT_AND_F)
+  EQUIVALENCE(H5S_flags(8), H5S_SELECT_XOR_F)
+  EQUIVALENCE(H5S_flags(9), H5S_SELECT_NOTB_F)
+  EQUIVALENCE(H5S_flags(10), H5S_SELECT_NOTA_F)
+
+  EQUIVALENCE(H5S_flags(11), H5S_SELECT_APPEND_F)
+  EQUIVALENCE(H5S_flags(12), H5S_SELECT_PREPEND_F)
+  EQUIVALENCE(H5S_flags(13), H5S_SELECT_INVALID_F)
+  EQUIVALENCE(H5S_flags(14), H5S_SEL_ERROR_F)
+  EQUIVALENCE(H5S_flags(15), H5S_SEL_NONE_F)
+
+  EQUIVALENCE(H5S_flags(16), H5S_SEL_POINTS_F)
+  EQUIVALENCE(H5S_flags(17), H5S_SEL_HYPERSLABS_F)
+  EQUIVALENCE(H5S_flags(18), H5S_SEL_ALL_F)
 
   !
   ! H5T flags declaration
diff --git a/fortran/src/H5f90i.h b/fortran/src/H5f90i.h
index f3c0160..7d066cd 100644
--- a/fortran/src/H5f90i.h
+++ b/fortran/src/H5f90i.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/fortran/src/H5f90kit.c b/fortran/src/H5f90kit.c
index c6c874f..6e8c793 100644
--- a/fortran/src/H5f90kit.c
+++ b/fortran/src/H5f90kit.c
@@ -13,12 +13,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/src/H5f90proto.h b/fortran/src/H5f90proto.h
index f8b4564..46ef8ef 100644
--- a/fortran/src/H5f90proto.h
+++ b/fortran/src/H5f90proto.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -525,12 +523,14 @@ 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 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, hid_t_f *h5s_hid_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);
diff --git a/fortran/src/H5fort_type_defines.h.in b/fortran/src/H5fort_type_defines.h.in
index 0e14e86..b6a35f9 100644
--- a/fortran/src/H5fort_type_defines.h.in
+++ b/fortran/src/H5fort_type_defines.h.in
@@ -1,3 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /* If you are reading this file and it has a '.h' suffix, it was automatically
  * generated from the '.in' version.  Make changes there.
  */
@@ -7,6 +18,7 @@
 #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_NUM_INTEGER_KINDS @PAC_FORTRAN_NUM_INTEGER_KINDS@
 #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@
diff --git a/fortran/src/H5fortkit.F90 b/fortran/src/H5fortkit.F90
index 3062c28..f5eba8a 100644
--- a/fortran/src/H5fortkit.F90
+++ b/fortran/src/H5fortkit.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c
index 98128db..7e0b7e8 100644
--- a/fortran/src/H5match_types.c
+++ b/fortran/src/H5match_types.c
@@ -19,12 +19,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
@@ -51,7 +49,8 @@ FILE * fort_header;
 /* Prototypes for the write routines */
 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 writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int kind);
+void writeToCFileOnly(const char* c_typedef, const char* fortran_type, const char* c_type, int size);
 void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, const char* kind);
 
 static void
@@ -65,12 +64,10 @@ initCfile(void)
  *                                                                           *\n\
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
  * terms governing use, modification, and redistribution, is contained in    *\n\
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
- * of the source code distribution tree; Copyright.html can be found at the  *\n\
- * root level of an installed copy of the electronic HDF5 document set and   *\n\
- * is linked from the top-level documents page.  It can also be found at     *\n\
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
- * access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+ * the COPYING file, which can be found at the root of the source code       *\n\
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n\
+ * If you do not have access to either file, you may request a copy from     *\n\
+ * help at hdfgroup.org.                                                        *\n\
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\
 \n\n\
 #ifndef _H5f90i_gen_H\n\
@@ -92,15 +89,13 @@ initFfile(void)
 !                                                                             *\n\
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
 !   terms governing use, modification, and redistribution, is contained in    *\n\
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
-!   of the source code distribution tree; Copyright.html can be found at the  *\n\
-!   root level of an installed copy of the electronic HDF5 document set and   *\n\
-!   is linked from the top-level documents page.  It can also be found at     *\n\
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
-!   access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+!   the COPYING file, which can be found at the root of the source code       *\n\
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n\
+!   If you do not have access to either file, you may request a copy from     *\n\
+!   help at hdfgroup.org.                                                        *\n\
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
 !\n!\n\
-! This file is automatically generated and contains HDF5 Fortran90 type definitions.\n!\n\
+! This file is automatically generated by H5match_types.c and contains HDF5 Fortran90 type definitions.\n!\n\
        MODULE H5FORTRAN_TYPES\n\
          USE ISO_C_BINDING\n\
          !\n\
@@ -135,10 +130,10 @@ void writeTypedefDefault(const char* c_typedef, int 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,  int kind)
+void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, 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);
+  fprintf(c_header, "typedef c_%s_%d %s;\n", c_typedef, kind, c_type);
 }
 void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, const char* kind)
 {
@@ -147,9 +142,7 @@ void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char
 }
 int main(void)
 {
-  int FoundIntSize[10];
-  int FoundIntSizeKind[10];
-  int i, j,flag;
+  int i;
   char chrA[32],chrB[32];
 
   int IntKinds[] = H5_FORTRAN_INTEGER_KINDS;
@@ -158,7 +151,7 @@ int main(void)
   int RealKinds_SizeOf[] = H5_FORTRAN_REAL_KINDS_SIZEOF;
   char Real_C_TYPES[10][32];
   
-  int H5_FORTRAN_NUM_INTEGER_KINDS;
+  int FORTRAN_NUM_INTEGER_KINDS=H5_FORTRAN_NUM_INTEGER_KINDS;
   int H5_FORTRAN_NUM_REAL_KINDS;
   int found_long_double = 0;
 
@@ -172,10 +165,13 @@ int main(void)
 
   /* (a) define c_int_x */
 
-  H5_FORTRAN_NUM_INTEGER_KINDS = (int)(sizeof(IntKinds)/sizeof(IntKinds[0]));
+  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++) {
+  fprintf(fort_header,"        INTEGER, PARAMETER :: H5_FORTRAN_NUM_INTEGER_KINDS = %d\n", FORTRAN_NUM_INTEGER_KINDS);
+
+
+  for(i=0;i< FORTRAN_NUM_INTEGER_KINDS;i++) {
     if(sizeof(long long) == IntKinds_SizeOf[i])
       writeTypedef("int", "long long", IntKinds[i]);
     else if(sizeof(long) == IntKinds[i])
@@ -256,122 +252,78 @@ int main(void)
   fprintf(c_header, "\n");
 
   /* haddr_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("int","HADDR_T", "haddr_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for haddr_t */
       return -1;
   }
 
   /* hsize_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for hsize_t */
       return -1;
   }
 
   /* hssize_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("int","HSSIZE_T", "hssize_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for hssize_t */
       return -1;
   }
 
   /* off_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("int","OFF_T", "off_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for off_t */
       return -1;
   }
 
   /* size_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("size_t","SIZE_T", "size_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for size_t */
       return -1;
   }
 
   /* int */
-  writeToFiles("int","Fortran_INTEGER", "int_f", H5_FORTRAN_NATIVE_INTEGER_SIZEOF, H5_FORTRAN_NATIVE_INTEGER_KIND);
+  writeToFiles("int","Fortran_INTEGER", "int_f", H5_FORTRAN_NATIVE_INTEGER_KIND);
 
   /* int_1, int_2, int_4, int_8 */
 
-/* Defined different KINDs of integers:                       */
-/* if the integer kind is not available then we assign        */
-/* it a value of the next larger one, but if the next         */
-/* higher one is not available we assigned it the next lowest */
-
+/* Defined different KINDs of integers */
 
-  FoundIntSize[0] = -1;
-  FoundIntSize[1] = -1;
-  FoundIntSize[2] = -1;
-  FoundIntSize[3] = -1;
-  FoundIntSize[4] = -1;
+  fprintf(fort_header,"        INTEGER, DIMENSION(1:%d), PARAMETER :: Fortran_INTEGER_AVAIL_KINDS = (/", FORTRAN_NUM_INTEGER_KINDS);
   
-  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<H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
-      if( FoundIntSize[i] > 0) /* Found the integer type */
-	{
-	  sprintf(chrA, "Fortran_INTEGER_%d", FoundIntSize[i]);
-	  sprintf(chrB, "int_%d_f", FoundIntSize[i]);
-	  writeToFiles("int",chrA, chrB, FoundIntSize[i], FoundIntSizeKind[i]);
-	}
-      else  /* Did not find the integer type */
-	{
-	  flag = 0; /* flag indicating if found the next highest */
-	  for(j=i+1;j<4;j++)  /* search for next highest */
-	    {
-	      if( FoundIntSize[j] > 0) /* Found the next highest */
-		{
-		  sprintf(chrA, "Fortran_INTEGER_%d", (-1)*FoundIntSize[i]);
-		  sprintf(chrB, "int_%d_f", (-1)*FoundIntSize[i]);
-		  writeToFiles("int",chrA, chrB, FoundIntSize[j], FoundIntSizeKind[j]);
-		  flag = 1;
-		  break;
-		}
-	    }
-	  if(flag == 0) /* No higher one found, so find next lowest */
-	    {
-	      for(j=2;j>-1;j--)  /* Search for next lowest */
-		{
-		  if( FoundIntSize[j] > 0) /* Found the next lowest */
-		    {
-		      sprintf(chrA, "Fortran_INTEGER_%d", (-1)*FoundIntSize[i]);
-		      sprintf(chrB, "int_%d_f", (-1)*FoundIntSize[i]);
-		      writeToFiles("int",chrA, chrB, FoundIntSize[j], FoundIntSizeKind[j]);
-		      flag = 1;
-		      break;
-		    }
-		}
-	    }
-	  if(flag == 0) /* No higher or lower one found, indicating an error */
-	     return -1;
-	}
+  for(i=0;i<FORTRAN_NUM_INTEGER_KINDS;i++) {
+    fprintf(fort_header,"%d",(int)IntKinds[i]);
+    if(i==FORTRAN_NUM_INTEGER_KINDS-1) {
+      fprintf(fort_header,"/)\n");
+    } else {
+      fprintf(fort_header,",");
     }
+    
+  }
 
   /* real_4, real_8, real_16 */
 
@@ -384,27 +336,29 @@ int main(void)
     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]);
+      writeToFiles("float",chrA, chrB, RealKinds[i]);
     }
   }
 
   /* hid_t */
-  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+  for(i=0;i< 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]);
+      writeToFiles("int","HID_T", "hid_t_f", IntKinds[i]);
       break;
     }
-    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+    if(i == (FORTRAN_NUM_INTEGER_KINDS-1) )
       /* Error: couldn't find a size for hid_t */
       return -1;
   }
-
   /* real_f */
-  if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(long double))
+#if H5_FORTRAN_HAVE_C_LONG_DOUBLE!=0
+  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))
+  } else
+#endif
+  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))
+  } 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 */
@@ -422,20 +376,23 @@ int main(void)
   }
 
   /* double_f */
-  if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(long double))
+#if H5_FORTRAN_HAVE_C_LONG_DOUBLE!=0
+  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))
+  } else
+#endif
+  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))
+  } 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");
+      writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "Fortran_REAL_C_FLOAT128");
     }
 #else
   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");
+      writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "Fortran_REAL_C_FLOAT128");
     }
 #endif
   else {
diff --git a/fortran/src/HDF5.F90 b/fortran/src/HDF5.F90
index cbe4c83..0370224 100644
--- a/fortran/src/HDF5.F90
+++ b/fortran/src/HDF5.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/src/Makefile.am b/fortran/src/Makefile.am
index a271666..a863a67 100644
--- a/fortran/src/Makefile.am
+++ b/fortran/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -57,9 +55,9 @@ libhdf5_fortran_la_LIBADD=$(LIBHDF5)
 # Remove it only when distclean.
 DISTCLEANFILES=h5fc
 
-# H5fortran_types.F90 and H5f90i.h are automatically generaed by
+# H5fortran_types.F90 and H5f90i.h are automatically generated by
 # H5match_types, and must be cleaned explicitly.
-MOSTLYCLEANFILES=H5fortran_types.F90 H5f90i_gen.h
+MOSTLYCLEANFILES=H5fortran_types.F90 H5f90i_gen.h H5_gen.F90
 
 # Fortran module files can have different extensions and different names
 # (e.g., different capitalizations) on different platforms.  Write rules
diff --git a/fortran/src/Makefile.in b/fortran/src/Makefile.in
index 1fe40e3..3113f11 100644
--- a/fortran/src/Makefile.in
+++ b/fortran/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Fortran Library Makefile(.in)
 #
@@ -502,6 +500,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -623,6 +622,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -768,32 +768,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -821,9 +816,9 @@ libhdf5_fortran_la_LIBADD = $(LIBHDF5)
 # Remove it only when distclean.
 DISTCLEANFILES = h5fc
 
-# H5fortran_types.F90 and H5f90i.h are automatically generaed by
+# H5fortran_types.F90 and H5f90i.h are automatically generated by
 # H5match_types, and must be cleaned explicitly.
-MOSTLYCLEANFILES = H5fortran_types.F90 H5f90i_gen.h
+MOSTLYCLEANFILES = H5fortran_types.F90 H5f90i_gen.h H5_gen.F90
 @BUILD_PARALLEL_CONDITIONAL_FALSE at H5FC_NAME = h5fc
 
 # Custom rule for installing h5fc, since it will be named h5pfc if hdf5
@@ -844,18 +839,20 @@ 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -999,22 +996,25 @@ distclean-compile:
 	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
 
 .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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1404,19 +1404,6 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # Fortran module files can have different extensions and different names
 # (e.g., different capitalizations) on different platforms.  Write rules
 # for them explicitly rather than trying to teach automake about them.
@@ -1490,12 +1477,13 @@ HDF5.lo:             $(srcdir)/HDF5.F90 H5f90global.lo H5_ff.lo H5Aff.lo  \
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1503,7 +1491,7 @@ 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)
+lib dyn 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                           \
diff --git a/fortran/src/README b/fortran/src/README
index 7af5df3..a258e07 100644
--- a/fortran/src/README
+++ b/fortran/src/README
@@ -1,122 +1,18 @@
+===================================
+README for the Fortran APIs to HDF5
+===================================
 
-          README for the FORTRAN90 Prototype APIs to HDF5
-
-
-This distribution contains the HDF5 FORTRAN90 APIs source code (prototype) 
-based on the HDF5 1.2.2 release (ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current), 
-tests and examples.
-
-This prototype supports a selected subset of the HDF5 Library functionality. 
-A complete list of the Fortran subroutines can be found in the HDF5 
-Reference Manual provided with this release.
-Check the online documentation at http://hdf.ncsa.uiuc.edu/HDF5/doc (select 
-the "HDF5 Fortran90 Docs" link at the bottom of the left-hand column) or 
-H5_F90.R1.2.2.RefMan.tar at ftp://hdf.ncsa.uiuc.edu/HDF5/fortran .
-
-Changes since last release (October 1999)
-=========================================
-* Support for Linux 
-* Support for parallel features (tested on O2K platform only)
-* Most of the functions from the H5R, H5P, H5T, H5E and H5I interfaces were 
-  implemented. See Reference Manual for complete list. The new functions  
-  include support for object and dataset region references, and for 
-  compound datatypes.
-* This prototype supports more predefined types. See list below in 
-  the "About the Fortran APIs" section.
-* This prototype supports T3E and T3E with mpt 1.3. One has to modify
-  H5Dff.f90, H5Aff.f90, H5Pff.f90 to comment lines with the module procedures for
-  double precision datatypes. See source code.
-
-Supported platforms
-===================
-The FORTRAN90 APIs provided here are known to work with the
-following platforms and compilers:
-
-     *  SunOS 5.6  with  WorkshopCompilers 4.2 Fortran 90 1.2
-     *  SunOS 5.7  with  WorkshopCompilers 5.0 Fortran 90 2.0 
-     *  OSF1 V4.0  with  Digital Fortran 90 4.1 
-     *  Linux RedHat 6.1, Kernel 2.2.12 with PGF90
-     *  T3E with Cray Fortran: Version 3.4.0.0
-            with mpt 1.3
-
-Compilation
-===========
-
-1. Install HDF5 Release 1.2.2 on your system
-   (ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current).  If you are using a
-   binary distribution provided by the HDF group, make sure that a GZIP 
-   library is installed on your system. If you do not have a GZIP library,
-   you may copy it from the HDF FTP server.
-
-2. In the src directory copy H5fortran_types.f90_<system> to 
-   H5fortran_types.f90, where <system> is one of the following:
-
-     solaris
-     digunix
-     linux
-
-   Example: On Digital Unix systems use the following command
-            cp H5fortran_types.f90_digunix H5fortran_types.f90
-
-3. Edit Makefile_<system >in the src/, test/ and examples/ directories
-   to specify the locations of the HDF5 C Library, the GZIP Library, and the 
-   corresponding include files on your system.
-
-4. In the src directory, run make to create the HDF5 FORTRAN90 library 
-   hdf5_fortran.a
-             make -f Makefile_<system>
-             
-   Example: On Solaris run
-            make -f Makefile_solaris
-
-   The Fortran library hdf5_fortran.a will be created.
-
-5. In the test directory, build tests by running  
-            make -f Makefile_<system>
-   This command will build fortranlib_test, fflush1 and fflush2 executables.
-   Run those executables to make sure that the library works on your system.
-
-6. In the examples directory, run
-            make -f Makefile_<system>
-   to build the following examples:
-   
-   fileexample       - creates an HDF5 file
-   dsetexample       - creates an empty dataset of integers
-   rwdsetexample     - writes and reads to the dataset created by dsetexample
-   groupexample      - creates a group in the file
-   grpsexample       - creates groups using absolute and relative names
-   grpdsetexample    - creates datasets in the groups
-   hyperslabexample  - writes and reads a hyperslab
-   selectele         - writes element selections
-   attrexample       - creates and writes a dataset attribute
-   compound          - creates, writes and reads one dim array of structures
-   mountexample      - shows how to use mounting files to access a dataset
-   refobjexample     - creates and stores references to the objects
-   refregexample     - creates and stores references to the dataset regions
-
-   The script run_example.sh runs the examples in the appropriate order. 
-
-   Use the HDF5 utility, h5dump, to see the content of the created HDF5 files.
-
-7. Install the HDF5 Reference Manual (in HTML format).  The manual
-   can be found in the Unix tar file H5_F90.R1.2.2.RefMan.tar
-   on the ftp server and is served over the Web from
-   http://hdf.ncsa.uiuc.edu/HDF5/doc/ (select the "HDF5 Fortran90 Docs" 
-   link at the bottom of the left-hand column).
-
-
-8. Send bug reports and comments to hdfhelp at ncsa.uiuc.edu
-
-User's Guide Notes
-+++++++++++++++++++
+This directory contains Fortran APIs for HDF5 Library functionality.
+A complete list of implemented Fortran subroutines can be found in the HDF5 
+Reference Manual.
 
 About the source code organization
 ==================================
 
 The Fortran APIs are organized in modules parallel to the HDF5 Interfaces.
-Each module is in a separate file with the name H5*ff.f.  Corresponding C
+Each module is in a separate file with the name H5*ff.F90.  Corresponding C
 stubs are in the H5*f.c files.  For example, the Fortran File APIs are in 
-the file H5Fff.f and the corresponding C stubs are in the file H5Ff.c. 
+the file H5Fff.F90 and the corresponding C stubs are in the file H5Ff.c. 
 
 Each module contains Fortran definitions of the constants, interfaces to 
 the subroutines if needed, and the subroutines themselves.  
@@ -124,31 +20,29 @@ the subroutines if needed, and the subroutines themselves.
 Users must use constant names in their programs instead of the numerical 
 values, as the numerical values are subject to change without notice. 
 
-About the Fortran APIs 
-=======================
+Quick overview of the Fortran APIs 
+==============================================
+ 
+*  An in-depth description of each Fortran API and its parameters can 
+   be found in the HDF5 Reference Manual.
 
 *  The Fortran APIs come in the form of Fortran subroutines.
 
 *  Each Fortran subroutine name is derived from the corresponding C function
    name by adding "_f" to the name.  For example, the name of the C function 
    to create an HDF5 file is H5Fcreate;  the corresponding Fortran subroutine 
-   is h5fcreate_f. 
-
-*  A description of each Fortran subroutine and its parameters can be found 
-   following the description of the corresponding C function in the 
-   Reference Manual provided with this release.  The manual can be found in 
-   the Unix tar file H5_F90.R1.2.2.tar in this directory and
-   is served over the Web from http://hdf.ncsa.uiuc.edu/HDF5/doc/ (select 
-   the "HDF5 Fortran90 Docs" link at the bottom of the left-hand column).
+   is h5fcreate_f.
 
-*  The parameter list for each Fortran subroutine has two more parameters
-   than the corresponding C function.  These additional parameters hold 
+*  The parameter list for each Fortran subroutine usually has two more parameters
+   than the corresponding C function.  These additional parameters typically hold 
    the return value and an error code.  The order of the Fortran subroutine 
-   parameters may differ from the order of the C function parameters. 
-   The Fortran subroutine parameters are listed in the following order: 
+   parameters may differ from the order of the C function parameters.
+ 
+   The Fortran subroutine parameters are usually listed in the following order: 
       -- required input parameters,
       -- output parameters, including return value and error code, and 
-      -- optional input parameters.
+         optional input parameters.
+
    For example, the C function to create a dataset has the following 
    prototype:
 
@@ -158,72 +52,35 @@ About the Fortran APIs
    
    The corresponding Fortran subroutine has the following form:
    
-       SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, 
-             hdferr, creation_prp)
-  
+       SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, &
+       hdferr, dset_creation_prp, link_creation_prp, dset_access_prop)
+
    The first four parameters of the Fortran subroutine correspond to the 
    C function parameters.  The fifth parameter dset_id is an output 
    parameter and contains a valid dataset identifier if the value of the 
-   sixth output parameter hdferr indicates successful completion. 
+   sixth output parameter, hdferr, indicates successful completion. 
    (Error code descriptions are provided with the subroutine descriptions 
-   in the Reference Manual.)  The seventh input parameter creation_prp 
-   is optional, and may be omitted when the default creation property 
-   list is used.
-   (XXX: Update this! - QAK)
-
-*  Parameters to the Fortran subroutines have one of the following 
-   predefined datatypes (see the file H5fortran_types.f90 for KIND 
-   definitions):
+   in the Reference Manual.)  The last three input parameters are optional 
+   and may be omitted, resulting in default values being used.
+
+*  Parameters to the Fortran subroutines typically include 
+   predefined datatypes (see the build-time generated file 
+   H5fortran_types.F90 for a complete listing):
    
         INTEGER(HID_T)      compares with hid_t type in HDF5 C APIs
         INTEGER(HSIZE_T)    compares with hsize_t in HDF5 C APIs
         INTEGER(HSSIZE_T)   compares with hssize_t in HDF5 C APIs
         INTEGER(SIZE_T)     compares with the C size_t type
+
    These integer types usually correspond to 4 or 8 byte integers, 
-   depending on the FORTRAN90 compiler and corresponding HDF5 
+   depending on the Fortran compiler and corresponding HDF5 
    C library definitions.
    
-   The H5R module defines two types: 
-        TYPE(HOBJ_REF_T_F)  compares to the hobj_ref_t in HDF5 C API
-        TYPE(HDSET_REG_REF_T_F) compares to hdset_reg_ref_t in HDF5 C API
-   These types are represented by character arrays now. 
-   The internal representation can be changed in the future.
-
-*  Each Fortran application must call the h5init_types subroutine to 
+*  Each Fortran application must call the h5open_f subroutine to 
    initialize the Fortran predefined datatypes before calling the HDF5 Fortran 
-   subroutines.  The application must call the h5close_types subroutine 
-   after all calls to the HDF5 Fortran Library. 
-
-*  The following predefined types are implemented in this prototype: 
-
-                                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
-                                H5T_STD_U32LE
-                                H5T_STD_U64BE
-                                H5T_STD_U64LE
-                                
-    
+   subroutines.  The application should call the h5close_f subroutine 
+   after all calls to the HDF5 Fortran Library.
+
 *  When a C application reads data stored from a Fortran program, the data 
    will appear to be transposed due to the difference in the C - Fortran 
    storage order.  For example, if Fortran writes a 4x6 two-dimensional dataset 
@@ -233,6 +90,45 @@ About the Fortran APIs
  
 *  Fortran indices are 1 based.
 
-*  Compound datatype datasets can be written or read by atomic fields only.
+============================
+FOR DEVELOPERS
+============================
+
+Procedure to add a new function
+----------------------------------
+
+(1) Edit the fortran/src/H5*ff.F90 file
+(2) Edit the fortran/src/H5*f.c file
+(3) Edit the fortran/src/H5f90proto.h file
+(4) Add the new function to fortran/src/hdf5_fortrandll.def.in
+
+Procedure for passing C variables to Fortran
+---------------------------------------------
+
+(1) Find the C struct name you are interested in: 
+	(a) src/H5public.h if it is a generic type, i.e. H5_*
+            or
+        (b) src/H5*public.h if is a specific type, i.e. H5*_ 
+                            
+(2) Put that structure into an array that will be passed to fortran in:
+        (a) fortran/src/H5_f.c (add to nh5init_flags_c subroutine)
+        (b) edit fortran/src/H5f90proto.h and edit nh5init_flags_c interface call
+                         
+(3) Edit the function call in fortran/src/H5_ff.F90
+        (a) edit the call:  FUNCTION h5init_flags_c 
+        (b) edit h5init_flags_c call in h5open_f to match the number of arguments passing
+                             
+(4) add the size of the array and array to fortran/src/H5f90global.F90 
+         - must match the size found it H5_f.c
+
+NOTE: To just add a default C value argument, do steps (2a) and (4) 
+
+
+Procedure for adding a new file to the repository
+--------------------------------------------------
+
+Add the name of the file to the: 
+    (1) Makefile.am located in the same directory as the newfile
+    (2) CMakeLists.txt located in the same directory as the newfile
+    (3) MANIFEST located in the top level directory
 
-Not all of the APIs provided with this prototype have been fully tested. 
diff --git a/fortran/src/h5fc.in b/fortran/src/h5fc.in
index 6e2c9d3..47642c9 100644
--- a/fortran/src/h5fc.in
+++ b/fortran/src/h5fc.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 ############################################################################
@@ -182,7 +180,7 @@ for arg in $@ ; do
       compile_args="$compile_args $arg"
 
       if test "x$do_link" = "xyes" -a -n "$output_file"; then
-        compile_args="$compile_args -o $outputfile"
+        compile_args="$compile_args -o $output_file"
       fi
 
       do_link="no"
diff --git a/fortran/test/CMakeLists.txt b/fortran/test/CMakeLists.txt
index 005a5c8..1661a10 100644
--- a/fortran/test/CMakeLists.txt
+++ b/fortran/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_FORTRAN_TESTS C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -21,24 +21,30 @@ if (WIN32 AND MSVC)
         PROPERTIES
             COMPILE_FLAGS "/MT"
     )
-  endif (BUILD_SHARED_LIBS)
+  endif ()
   set_target_properties (H5_test_buildiface
       PROPERTIES
           LINK_FLAGS "/SUBSYSTEM:CONSOLE"
   )
-endif (WIN32 AND MSVC)
+endif ()
 set_target_properties (H5_test_buildiface PROPERTIES
     LINKER_LANGUAGE Fortran
     Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}
 )
 
-if (NOT SKIP_HDF5_FORTRAN_SHARED)
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  file (MAKE_DIRECTORY "${HDF5_F90_BINARY_DIR}/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)
+    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/${CMAKE_BUILD_TYPE})
+  else ()
+    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
+  endif ()
+endif ()
+if (WIN32)
+  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/${CMAKE_BUILD_TYPE})
+else ()
+  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
+endif ()
 
 INCLUDE_DIRECTORIES (${CMAKE_Fortran_MODULE_DIRECTORY} ${MOD_BUILD_DIR})
 
@@ -73,31 +79,56 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
       INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-
-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)
+endif ()
 
 set (CMD $<TARGET_FILE:H5_test_buildiface>)
-add_custom_target (H5testgen ALL
+add_custom_command (
+    OUTPUT ${HDF5_F90_BINARY_DIR}/tf_gen.F90
     COMMAND ${CMD}
-#v3.2    BYPRODUCT ${HDF5_F90_BINARY_DIR}/tf_gen.F90
     WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
     DEPENDS H5_test_buildiface
+    COMMENT "Generating the tf_gen.F90 file"
 )
+add_custom_target (H5testgen ALL
+    DEPENDS ${HDF5_F90_BINARY_DIR}/tf_gen.F90
+)
+set_source_files_properties (${HDF5_F90_BINARY_DIR}/tf_gen.F90 PROPERTIES GENERATED TRUE)
+
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  set (CMDSH $<TARGET_FILE:H5_test_buildiface>)
+  add_custom_command (
+      OUTPUT ${HDF5_F90_BINARY_DIR}/shared/tf_gen.F90
+      COMMAND ${CMDSH}
+      WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/shared
+      DEPENDS H5_test_buildiface
+      COMMENT "Generating the tf_gen.F90 shared file"
+  )
+  add_custom_target (H5testgenSH ALL
+      DEPENDS ${HDF5_F90_BINARY_DIR}/shared/tf_gen.F90
+  )
+  set_source_files_properties (${HDF5_F90_BINARY_DIR}/shared/tf_gen.F90 PROPERTIES GENERATED TRUE)
+endif ()
+
+set (HDF5_F90_TF_SOURCES
+    # generated files
+    ${HDF5_F90_BINARY_DIR}/tf_gen.F90
 
-add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC tf.F90 ${HDF5_F90_TF_SRCS})
+    # normal distribution
+    tf.F90
+)
+set_source_files_properties (${HDF5_F90_TF_SOURCES} PROPERTIES LANGUAGE Fortran)
 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)
+  set (HDF5_F90_TF_SOURCES_SHARED
+      # generated file
+      ${HDF5_F90_BINARY_DIR}/shared/tf_gen.F90
+
+      # normal distribution
+      tf.F90
+  )
+  set_source_files_properties (${HDF5_F90_TF_SOURCES_SHARED} PROPERTIES LANGUAGE Fortran)
+endif ()
 
+add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC ${HDF5_F90_TF_SOURCES})
 TARGET_FORTRAN_PROPERTIES (${HDF5_F90_TEST_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_F90_TEST_LIB_TARGET}
     ${HDF5_F90_C_TEST_LIB_TARGET}
@@ -116,12 +147,15 @@ if (WIN32)
   set_property (TARGET ${HDF5_F90_TEST_LIB_TARGET} APPEND PROPERTY
         COMPILE_DEFINITIONS "HDF5F90_WINDOWS"
     )
-endif (WIN32)
+endif ()
+add_dependencies(${HDF5_F90_TEST_LIB_TARGET} H5testgen)
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  add_library (${HDF5_F90_TEST_LIBSH_TARGET} SHARED ${HDF5_F90_TF_SOURCES_SHARED})
   set (SHARED_LINK_FLAGS " ")
   if (WIN32 AND MSVC)
     set (SHARED_LINK_FLAGS "/DLL")
-  endif (WIN32 AND MSVC)
+  endif ()
   TARGET_FORTRAN_PROPERTIES (${HDF5_F90_TEST_LIBSH_TARGET} SHARED " " ${SHARED_LINK_FLAGS})
   target_link_libraries (${HDF5_F90_TEST_LIBSH_TARGET}
       ${HDF5_F90_C_TEST_LIBSH_TARGET}
@@ -142,8 +176,9 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     set_property (TARGET ${HDF5_F90_TEST_LIBSH_TARGET} APPEND PROPERTY
         COMPILE_DEFINITIONS "BUILD_HDF5_TEST_DLL;HDF5F90_WINDOWS"
     )
-  endif (WIN32)
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
+  add_dependencies(${HDF5_F90_TEST_LIBSH_TARGET} H5testgenSH)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Tests
@@ -176,7 +211,7 @@ target_link_libraries (testhdf5_fortran
 )
 if (WIN32 AND MSVC)
   target_link_libraries (testhdf5_fortran "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (testhdf5_fortran PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (testhdf5_fortran PROPERTIES
     LINKER_LANGUAGE Fortran
@@ -212,7 +247,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   if (WIN32 AND MSVC)
     target_link_libraries (testhdf5_fortran-shared "ws2_32.lib")
-  endif (WIN32 AND MSVC)
+  endif ()
   target_include_directories (testhdf5_fortran-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (testhdf5_fortran-shared PROPERTIES
         LINKER_LANGUAGE Fortran
@@ -220,7 +255,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         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)
+endif ()
 
 #-- Adding test for testhdf5_fortran_1_8
 add_executable (testhdf5_fortran_1_8
@@ -240,7 +275,7 @@ target_link_libraries (testhdf5_fortran_1_8
 )
 if (WIN32 AND MSVC)
   target_link_libraries (testhdf5_fortran_1_8 "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (testhdf5_fortran_1_8 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (testhdf5_fortran_1_8 PROPERTIES
     LINKER_LANGUAGE Fortran
@@ -267,7 +302,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   if (WIN32 AND MSVC)
     target_link_libraries (testhdf5_fortran_1_8-shared "ws2_32.lib")
-  endif (WIN32 AND MSVC)
+  endif ()
   target_include_directories (testhdf5_fortran_1_8-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (testhdf5_fortran_1_8-shared PROPERTIES
         LINKER_LANGUAGE Fortran
@@ -275,7 +310,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         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)
+endif ()
 
 #-- Adding test for fortranlib_test_F03
 add_executable (fortranlib_test_F03
@@ -297,7 +332,7 @@ target_link_libraries (fortranlib_test_F03
 )
 if (WIN32 AND MSVC)
   target_link_libraries (fortranlib_test_F03 "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (fortranlib_test_F03 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (fortranlib_test_F03 PROPERTIES
     LINKER_LANGUAGE Fortran
@@ -326,7 +361,8 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   if (WIN32 AND MSVC)
     target_link_libraries (fortranlib_test_F03-shared "ws2_32.lib")
-  endif (WIN32 AND MSVC)
+  endif ()
+
   target_include_directories (fortranlib_test_F03-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (fortranlib_test_F03-shared PROPERTIES
       LINKER_LANGUAGE Fortran
@@ -334,7 +370,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
   add_dependencies (fortranlib_test_F03-shared ${HDF5_F90_TEST_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-- Adding test for fflush1
 add_executable (fflush1 fflush1.F90)
@@ -347,7 +383,7 @@ target_link_libraries (fflush1
 )
 if (WIN32 AND MSVC)
   target_link_libraries (fflush1 "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (fflush1 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (fflush1 PROPERTIES
     LINKER_LANGUAGE Fortran
@@ -367,7 +403,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   if (WIN32 AND MSVC)
     target_link_libraries (fflush1-shared "ws2_32.lib")
-  endif (WIN32 AND MSVC)
+  endif ()
   target_include_directories (fflush1-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (fflush1-shared PROPERTIES
         LINKER_LANGUAGE Fortran
@@ -375,7 +411,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         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)
+endif ()
 
 #-- Adding test for fflush2
 add_executable (fflush2 fflush2.F90)
@@ -388,7 +424,7 @@ target_link_libraries (fflush2
 )
 if (WIN32 AND MSVC)
   target_link_libraries (fflush2 "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (fflush2 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (fflush2 PROPERTIES
     LINKER_LANGUAGE Fortran
@@ -408,7 +444,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   if (WIN32 AND MSVC)
     target_link_libraries (fflush2-shared "ws2_32.lib")
-  endif (WIN32 AND MSVC)
+  endif ()
   target_include_directories (fflush2-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (fflush2-shared PROPERTIES
         LINKER_LANGUAGE Fortran
@@ -416,6 +452,6 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         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)
+endif ()
 
 include (CMakeTests.cmake)
diff --git a/fortran/test/CMakeTests.cmake b/fortran/test/CMakeTests.cmake
index e91e820..e171e7c 100644
--- a/fortran/test/CMakeTests.cmake
+++ b/fortran/test/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -6,7 +17,7 @@
 ##############################################################################
 if (BUILD_SHARED_LIBS)
   file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/fshared")
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 # Remove any output file left over from previous test run
 add_test (
@@ -49,24 +60,69 @@ add_test (
 )
 if (NOT "${last_test}" STREQUAL "")
   set_tests_properties (FORTRAN_testhdf5-clear-objects PROPERTIES DEPENDS ${last_test})
-endif (NOT "${last_test}" STREQUAL "")
+endif ()
 set (last_test "FORTRAN_testhdf5-clear-objects")
 
-add_test (NAME FORTRAN_testhdf5_fortran COMMAND $<TARGET_FILE:testhdf5_fortran>)
-set_tests_properties (FORTRAN_testhdf5_fortran PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME FORTRAN_testhdf5_fortran COMMAND $<TARGET_FILE:testhdf5_fortran>)
+else ()
+  add_test (NAME FORTRAN_testhdf5_fortran COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5_fortran>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_REGEX= 0 error.s."
+      -D "TEST_MATCH= 0 error(s)"
+      -D "TEST_OUTPUT=testhdf5_fortran.txt"
+      #-D "TEST_REFERENCE=testhdf5_fortran.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+#set_tests_properties (FORTRAN_testhdf5_fortran PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
 set_tests_properties (FORTRAN_testhdf5_fortran PROPERTIES DEPENDS FORTRAN_testhdf5-clear-objects)
 
 #-- Adding test for testhdf5_fortran_1_8
-add_test (NAME FORTRAN_testhdf5_fortran_1_8 COMMAND $<TARGET_FILE:testhdf5_fortran_1_8>)
-set_tests_properties (FORTRAN_testhdf5_fortran_1_8 PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME FORTRAN_testhdf5_fortran_1_8 COMMAND $<TARGET_FILE:testhdf5_fortran_1_8>)
+else ()
+  add_test (NAME FORTRAN_testhdf5_fortran_1_8 COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5_fortran_1_8>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_REGEX= 0 error.s."
+      -D "TEST_MATCH= 0 error(s)"
+      -D "TEST_OUTPUT=testhdf5_fortran_1_8.txt"
+      #-D "TEST_REFERENCE=testhdf5_fortran_1_8.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+#set_tests_properties (FORTRAN_testhdf5_fortran_1_8 PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
 set_tests_properties (FORTRAN_testhdf5_fortran_1_8 PROPERTIES DEPENDS FORTRAN_testhdf5_fortran)
 
 #-- Adding test for fortranlib_test_F03
 if (HDF5_ENABLE_F2003)
-  add_test (NAME FORTRAN_fortranlib_test_F03 COMMAND $<TARGET_FILE:fortranlib_test_F03>)
-  set_tests_properties (FORTRAN_fortranlib_test_F03 PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME FORTRAN_fortranlib_test_F03 COMMAND $<TARGET_FILE:fortranlib_test_F03>)
+  else ()
+    add_test (NAME FORTRAN_fortranlib_test_F03 COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:fortranlib_test_F03>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_REGEX= 0 error.s."
+        -D "TEST_MATCH= 0 error(s)"
+        -D "TEST_OUTPUT=fortranlib_test_F03.txt"
+        #-D "TEST_REFERENCE=fortranlib_test_F03.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
+#  set_tests_properties (FORTRAN_fortranlib_test_F03 PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
   set_tests_properties (FORTRAN_fortranlib_test_F03 PROPERTIES DEPENDS FORTRAN_testhdf5_fortran_1_8)
-endif (HDF5_ENABLE_F2003)
+endif ()
 
 #-- Adding test for fflush1
 add_test (NAME FORTRAN_fflush1 COMMAND $<TARGET_FILE:fflush1>)
@@ -119,21 +175,66 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
   set_tests_properties (FORTRAN_testhdf5-shared-clear-objects PROPERTIES DEPENDS FORTRAN_testhdf5-clear-objects)
 
-  add_test (NAME FORTRAN_testhdf5_fortran-shared COMMAND $<TARGET_FILE:testhdf5_fortran-shared>)
-  set_tests_properties (FORTRAN_testhdf5_fortran-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME FORTRAN_testhdf5_fortran-shared COMMAND $<TARGET_FILE:testhdf5_fortran-shared>)
+  else ()
+    add_test (NAME FORTRAN_testhdf5_fortran-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5_fortran-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_REGEX= 0 error.s."
+        -D "TEST_MATCH= 0 error(s)"
+        -D "TEST_OUTPUT=testhdf5_fortran.txt"
+        #-D "TEST_REFERENCE=testhdf5_fortran.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/fshared"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
+#  set_tests_properties (FORTRAN_testhdf5_fortran-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
   set_tests_properties (FORTRAN_testhdf5_fortran-shared PROPERTIES DEPENDS "FORTRAN_testhdf5_fortran;FORTRAN_testhdf5-shared-clear-objects")
 
   #-- Adding test for testhdf5_fortran_1_8
-  add_test (NAME FORTRAN_testhdf5_fortran_1_8-shared COMMAND $<TARGET_FILE:testhdf5_fortran_1_8-shared>)
-  set_tests_properties (FORTRAN_testhdf5_fortran_1_8-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME FORTRAN_testhdf5_fortran_1_8-shared COMMAND $<TARGET_FILE:testhdf5_fortran_1_8-shared>)
+  else ()
+    add_test (NAME FORTRAN_testhdf5_fortran_1_8-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5_fortran_1_8-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_REGEX= 0 error.s."
+        -D "TEST_MATCH= 0 error(s)"
+        -D "TEST_OUTPUT=testhdf5_fortran_1_8.txt"
+        #-D "TEST_REFERENCE=testhdf5_fortran_1_8.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/fshared"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
+#  set_tests_properties (FORTRAN_testhdf5_fortran_1_8-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
   set_tests_properties (FORTRAN_testhdf5_fortran_1_8-shared PROPERTIES DEPENDS FORTRAN_testhdf5_fortran_1_8)
 
   #-- Adding test for fortranlib_test_F03
   if (HDF5_ENABLE_F2003)
-    add_test (NAME FORTRAN_fortranlib_test_F03-shared COMMAND $<TARGET_FILE:fortranlib_test_F03-shared>)
-    set_tests_properties (FORTRAN_fortranlib_test_F03-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME FORTRAN_fortranlib_test_F03-shared COMMAND $<TARGET_FILE:fortranlib_test_F03-shared>)
+    else ()
+      add_test (NAME FORTRAN_fortranlib_test_F03-shared COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:fortranlib_test_F03-shared>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_REGEX= 0 error.s."
+          -D "TEST_MATCH= 0 error(s)"
+          -D "TEST_OUTPUT=fortranlib_test_F03.txt"
+          #-D "TEST_REFERENCE=fortranlib_test_F03.out"
+          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/fshared"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+#    set_tests_properties (FORTRAN_fortranlib_test_F03-shared PROPERTIES PASS_REGULAR_EXPRESSION "[ ]*0 error.s")
     set_tests_properties (FORTRAN_fortranlib_test_F03-shared PROPERTIES DEPENDS FORTRAN_fortranlib_test_F03)
-  endif (HDF5_ENABLE_F2003)
+  endif ()
 
   #-- Adding test for fflush1
   add_test (NAME FORTRAN_fflush1-shared COMMAND $<TARGET_FILE:fflush1-shared>)
@@ -142,4 +243,4 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   #-- Adding test for fflush2
   add_test (NAME FORTRAN_fflush2-shared COMMAND $<TARGET_FILE:fflush2-shared>)
   set_tests_properties (FORTRAN_fflush2-shared PROPERTIES DEPENDS FORTRAN_fflush1-shared)
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
diff --git a/fortran/test/H5_test_buildiface.F90 b/fortran/test/H5_test_buildiface.F90
index 8b27a96..636ded4 100644
--- a/fortran/test/H5_test_buildiface.F90
+++ b/fortran/test/H5_test_buildiface.F90
@@ -33,12 +33,10 @@
 !                                                                              *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including       *
 !  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  the COPYING file, which can be found at the root of the source code         *
+!  distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.    *
+!  If you do not have access to either file, you may request a copy from       *
+!  help at hdfgroup.org.                                                          *
 !  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! AUTHOR
@@ -82,12 +80,10 @@ PROGRAM H5_test_buildiface
 '!                                                                             *',&
 '!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
 '!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'!   the COPYING file, which can be found at the root of the source code       *',&
+'!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *',&
+'!   If you do not have access to either file, you may request a copy from     *',&
+'!   help at hdfgroup.org.                                                        *',&
 '! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
 '!',&
 '! AUTHOR',&
diff --git a/fortran/test/Makefile.am b/fortran/test/Makefile.am
index 60f9f53..8613cf9 100644
--- a/fortran/test/Makefile.am
+++ b/fortran/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -92,10 +90,10 @@ tf_gen.F90: H5_test_buildiface$(EXEEXT)
 
 H5_test_buildiface_SOURCES = H5_test_buildiface.F90
 
-# The build of the H5_test_buildiface does depend on any libraries, so set it 
+# The build of the H5_test_buildiface does not depend on any libraries, so set it 
 # to nothing.
 
-H5_test_buildiface_LDADD = 
+H5_test_buildiface_LDADD =
 
 # fflush2 depends on files created by fflush1
 fflush2.chkexe_: fflush1.chkexe_
diff --git a/fortran/test/Makefile.in b/fortran/test/Makefile.in
index d30051c..da98cd1 100644
--- a/fortran/test/Makefile.in
+++ b/fortran/test/Makefile.in
@@ -513,6 +513,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -634,6 +635,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -812,24 +814,26 @@ FORTRAN_API = yes
 # 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 
+# The build of the H5_test_buildiface does not 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -943,22 +947,25 @@ distclean-compile:
 	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
 
 .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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1371,12 +1378,10 @@ uninstall-am:
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-Fortran test/Makefile(.in)
 #
@@ -1416,12 +1421,13 @@ fflush2.chkexe_: fflush1.chkexe_
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1429,7 +1435,7 @@ 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)
+lib dyn 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                           \
diff --git a/fortran/test/fflush1.F90 b/fortran/test/fflush1.F90
index ca2550f..bd1f551 100644
--- a/fortran/test/fflush1.F90
+++ b/fortran/test/fflush1.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/fflush2.F90 b/fortran/test/fflush2.F90
index 4230832..278f73d 100644
--- a/fortran/test/fflush2.F90
+++ b/fortran/test/fflush2.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/fortranlib_test.F90 b/fortran/test/fortranlib_test.F90
index 2f88c45..94b084e 100644
--- a/fortran/test/fortranlib_test.F90
+++ b/fortran/test/fortranlib_test.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
@@ -62,10 +60,10 @@ PROGRAM fortranlibtest
   ENDIF
   WRITE(*,*)
 
-!     CALL h5check_version_f(1,4,4,total_error)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing FILE Interface                   '
-!     write(*,*) '========================================='
+!      CALL h5check_version_f(1,4,4,total_error)
+!      '========================================='
+!      'Testing FILE Interface                   '
+!      '========================================='
 
   ret_total_error = 0
   CALL mountingtest(cleanup, ret_total_error)
@@ -83,10 +81,10 @@ PROGRAM fortranlibtest
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing DATASET Interface                '
+!      '========================================='
 
   ret_total_error = 0
   CALL datasettest(cleanup, ret_total_error)
@@ -96,25 +94,22 @@ PROGRAM fortranlibtest
   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
+  CALL test_userblock_offset(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Dataset offset with user block', total_error)
 
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing DATASPACE Interface             '
-!     write(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing DATASPACE Interface             '
+!      '========================================='
 
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing REFERENCE Interface              '
+!      '========================================='
 
   ret_total_error = 0
   CALL refobjtest(cleanup, ret_total_error)
@@ -124,10 +119,10 @@ PROGRAM fortranlibtest
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing selection functionalities        '
+!      '========================================='
 
   ret_total_error = 0
   CALL test_basic_select(cleanup, ret_total_error)
@@ -154,10 +149,10 @@ PROGRAM fortranlibtest
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing DATATYPE interface               '
+!      '========================================='
   ret_total_error = 0
   CALL basic_data_type_test(ret_total_error)
   CALL write_test_status(ret_total_error, ' Basic datatype test', total_error)
@@ -174,10 +169,10 @@ PROGRAM fortranlibtest
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing PROPERTY interface               '
+!      '========================================='
 
   ret_total_error = 0
   CALL external_test(cleanup, ret_total_error)
@@ -191,19 +186,19 @@ PROGRAM fortranlibtest
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing ATTRIBUTE interface              '
+!      '========================================='
 
   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(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing IDENTIFIER interface             '
+!      '========================================='
 
   ret_total_error = 0
   CALL identifier_test(cleanup, ret_total_error)
@@ -222,10 +217,10 @@ PROGRAM fortranlibtest
      CALL write_test_status(ret_total_error, ' SZIP filter test', total_error)
   ENDIF
 
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing GROUP interface             '
-!     write(*,*) '========================================='
+!     
+!      '========================================='
+!      'Testing GROUP interface                  '
+!      '========================================='
 
   ret_total_error = 0
   CALL group_test(cleanup, ret_total_error)
diff --git a/fortran/test/fortranlib_test_1_8.F90 b/fortran/test/fortranlib_test_1_8.F90
index 320d661..850cab9 100644
--- a/fortran/test/fortranlib_test_1_8.F90
+++ b/fortran/test/fortranlib_test_1_8.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/fortranlib_test_F03.F90 b/fortran/test/fortranlib_test_F03.F90
index 070cd73..ae12dba 100644
--- a/fortran/test/fortranlib_test_F03.F90
+++ b/fortran/test/fortranlib_test_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
@@ -131,7 +129,7 @@ PROGRAM fortranlibtest_F03
 
   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)
+  CALL write_test_status(ret_total_error, ' Testing Partial I/O of Array Fields in Compound Datatype Functionality', total_error)
 
   ret_total_error = 0
   CALL test_genprop_class_callback(ret_total_error)
diff --git a/fortran/test/t.c b/fortran/test/t.c
index fe69143..107e8d5 100644
--- a/fortran/test/t.c
+++ b/fortran/test/t.c
@@ -14,12 +14,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  ******
diff --git a/fortran/test/t.h b/fortran/test/t.h
index 738aa59..81d2b5d 100644
--- a/fortran/test/t.h
+++ b/fortran/test/t.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/fortran/test/tH5A.F90 b/fortran/test/tH5A.F90
index 5b814fa..1e6fdeb 100644
--- a/fortran/test/tH5A.F90
+++ b/fortran/test/tH5A.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5A_1_8.F90 b/fortran/test/tH5A_1_8.F90
index c70e288..f2f11aa 100644
--- a/fortran/test/tH5A_1_8.F90
+++ b/fortran/test/tH5A_1_8.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5D.F90 b/fortran/test/tH5D.F90
index 849f5eb..7001b98 100644
--- a/fortran/test/tH5D.F90
+++ b/fortran/test/tH5D.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
@@ -529,7 +527,7 @@ CONTAINS
 
     INTEGER(hid_t) :: file, fcpl, dataset, space
     INTEGER :: i, j, n, ios
-    INTEGER(hsize_t), DIMENSION(1:2) ::	dims
+    INTEGER(hsize_t), DIMENSION(1:2) :: dims
     INTEGER(haddr_t) :: offset
     INTEGER, DIMENSION(1:dset_dim1,1:dset_dim2), TARGET :: rdata, data_in
     INTEGER :: error
@@ -622,6 +620,11 @@ CONTAINS
     END DO
 
     CLOSE(10)
+
+    IF(cleanup) CALL h5_cleanup_f(fix_filename, H5P_DEFAULT_F, error)
+    CALL check("h5_cleanup_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_userblock_offset
 
diff --git a/fortran/test/tH5E.F90 b/fortran/test/tH5E.F90
index 10ecaf6..3cda6e1 100644
--- a/fortran/test/tH5E.F90
+++ b/fortran/test/tH5E.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/test/tH5E_F03.F90 b/fortran/test/tH5E_F03.F90
index 63e70a3..1878966 100644
--- a/fortran/test/tH5E_F03.F90
+++ b/fortran/test/tH5E_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! USES
diff --git a/fortran/test/tH5F.F90 b/fortran/test/tH5F.F90
index 020d2c8..d91ee9c 100644
--- a/fortran/test/tH5F.F90
+++ b/fortran/test/tH5F.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
@@ -590,7 +588,7 @@ CONTAINS
           LOGICAL        :: flag
           INTEGER(SIZE_T) :: obj_count, obj_countf
           INTEGER(HID_T), ALLOCATABLE, DIMENSION(:) :: obj_ids
-          INTEGER        :: i
+          INTEGER(SIZE_T) :: i
 
           CALL h5eset_auto_f(0, error)
 
@@ -729,7 +727,7 @@ CONTAINS
 
           CALL h5fget_freespace_f(fid, free_space, error)
                CALL check("h5fget_freespace_f",error,total_error)
-               if(error .eq.0 .and. free_space .ne. 0) then
+               if(error .eq.0 .and. free_space .ne. 1248) then
                  total_error = total_error + 1
                  write(*,*) "1: Wrong amount of free space reported, ", free_space
                endif
@@ -745,7 +743,7 @@ CONTAINS
           ! Check the free space now
           CALL h5fget_freespace_f(fid, free_space, error)
                CALL check("h5fget_freespace_f",error,total_error)
-               if(error .eq.0 .and. free_space .ne. 0) then
+               if(error .eq.0 .and. free_space .ne. 216) then
                  total_error = total_error + 1
                  write(*,*) "2: Wrong amount of free space reported, ", free_space
                endif
@@ -757,7 +755,7 @@ CONTAINS
           ! Check the free space now
           CALL h5fget_freespace_f(fid, free_space, error)
                CALL check("h5fget_freespace_f",error,total_error)
-               if(error .eq.0 .and. free_space .ne. 0) then
+               if(error .eq.0 .and. free_space .ne. 1248) then
                  total_error = total_error + 1
                  write(*,*) "3: Wrong amount of free space reported, ", free_space
                endif
diff --git a/fortran/test/tH5F_F03.F90 b/fortran/test/tH5F_F03.F90
index e70c1aa..8cc6b83 100644
--- a/fortran/test/tH5F_F03.F90
+++ b/fortran/test/tH5F_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
@@ -57,7 +55,8 @@ SUBROUTINE test_get_file_image(total_error)
   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 :: file_sz
+  INTEGER(size_t) :: i
   INTEGER(hid_t) :: file_id = -1  ! File identifier
   INTEGER(hid_t) :: dset_id = -1  ! Dataset identifier
   INTEGER(hid_t) :: space_id = -1 ! Dataspace identifier
@@ -92,7 +91,7 @@ SUBROUTINE test_get_file_image(total_error)
 
   ! Write some data to the data set 
   DO i = 1, 100
-     data(i) = i
+     data(i) = INT(i)
   ENDDO
   
   f_ptr = C_LOC(data(1))
diff --git a/fortran/test/tH5G.F90 b/fortran/test/tH5G.F90
index 2ba174c..0b6cc1a 100644
--- a/fortran/test/tH5G.F90
+++ b/fortran/test/tH5G.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5G_1_8.F90 b/fortran/test/tH5G_1_8.F90
index ddc3736..d3be525 100644
--- a/fortran/test/tH5G_1_8.F90
+++ b/fortran/test/tH5G_1_8.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
@@ -1383,7 +1381,7 @@ END SUBROUTINE delete_by_idx
 ! * 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
+! * Note:	 This routine assumes that the links have been inserted in the
 ! *              group in alphabetical order.
 ! *
 ! * Return:      Success:        0
diff --git a/fortran/test/tH5I.F90 b/fortran/test/tH5I.F90
index 97c48c6..5ce37fd 100644
--- a/fortran/test/tH5I.F90
+++ b/fortran/test/tH5I.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5L_F03.F90 b/fortran/test/tH5L_F03.F90
index 40afdbc..bdb5c55 100644
--- a/fortran/test/tH5L_F03.F90
+++ b/fortran/test/tH5L_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! USES
diff --git a/fortran/test/tH5MISC_1_8.F90 b/fortran/test/tH5MISC_1_8.F90
index ba3f095..79fbf3e 100644
--- a/fortran/test/tH5MISC_1_8.F90
+++ b/fortran/test/tH5MISC_1_8.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/tH5O.F90 b/fortran/test/tH5O.F90
index 51e1d64..fa3787e 100644
--- a/fortran/test/tH5O.F90
+++ b/fortran/test/tH5O.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5O_F03.F90 b/fortran/test/tH5O_F03.F90
index 834308b..44c4bff 100644
--- a/fortran/test/tH5O_F03.F90
+++ b/fortran/test/tH5O_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/tH5P.F90 b/fortran/test/tH5P.F90
index 39d8c1e..563926b 100644
--- a/fortran/test/tH5P.F90
+++ b/fortran/test/tH5P.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5P_F03.F90 b/fortran/test/tH5P_F03.F90
index 18af36b..69d493b 100644
--- a/fortran/test/tH5P_F03.F90
+++ b/fortran/test/tH5P_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! USES
@@ -431,8 +429,6 @@ SUBROUTINE test_h5p_file_image(total_error)
   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
@@ -520,7 +516,7 @@ SUBROUTINE external_test_offset(cleanup,total_error)
   ! Write the data to external files directly
   DO i = 1, 4
      DO j = 1, 25
-        part(j) = (i-1)*25+(j-1)
+        part(j) = INT((i-1_size_t)*25_size_t+(j-1_size_t))
      ENDDO
      WRITE(ichr1,'(I1.1)') i
      filename = "extern_"//ichr1//"a.raw"
@@ -640,16 +636,13 @@ SUBROUTINE test_vds(total_error)
 
   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
-
   CHARACTER(LEN=6), PARAMETER ::  VFILENAME="vds.h5"
   CHARACTER(LEN=3), PARAMETER :: DATASET="VDS"
-  INTEGER :: VDSDIM0
-  INTEGER, PARAMETER :: VDSDIM1 = 10
-  INTEGER, PARAMETER :: VDSDIM2 = 15 
+  INTEGER(hsize_t) :: VDSDIM0
+  INTEGER(hsize_t), PARAMETER :: VDSDIM1 = 10
+  INTEGER(hsize_t), PARAMETER :: VDSDIM2 = 15 
 
-  INTEGER :: DIM0
+  INTEGER(hsize_t) :: DIM0
   INTEGER, PARAMETER :: DIM0_1= 4  ! Initial size of the source datasets
   INTEGER, PARAMETER :: DIM1 = 10 
   INTEGER, PARAMETER :: DIM2 = 15 
@@ -663,7 +656,8 @@ SUBROUTINE test_vds(total_error)
   INTEGER(hid_t) :: vfile, file, src_space, mem_space, vspace, vdset, dset !Handles
   INTEGER(hid_t) :: dcpl, dapl
   INTEGER :: error
-  INTEGER(hsize_t), DIMENSION(1:3) :: vdsdims = (/4*DIM0_1, VDSDIM1, VDSDIM2/), &
+  INTEGER(hsize_t), DIMENSION(1:3) :: &
+       vdsdims = (/4_hsize_t*INT(DIM0_1,hsize_t), VDSDIM1, VDSDIM2/), &
                  vdsdims_max, &
                  dims = (/DIM0_1, DIM1, DIM2/), &
                  memdims = (/DIM0_1, DIM1, DIM2/), &
@@ -682,6 +676,7 @@ SUBROUTINE test_vds(total_error)
   INTEGER(hsize_t), DIMENSION(1:3,1:PLANE_STRIDE) :: start_correct
 
   INTEGER :: i, j
+  INTEGER(size_t) :: i_sz 
   INTEGER :: layout                     ! Storage layout
   INTEGER(size_t) :: num_map            ! Number of mappings 
   INTEGER(size_t) :: len                ! Length of the string also a RETURN value 
@@ -713,7 +708,7 @@ SUBROUTINE test_vds(total_error)
   VDSDIM0 = H5S_UNLIMITED_F
   DIM0 = H5S_UNLIMITED_F
   vdsdims_max = (/VDSDIM0, VDSDIM1, VDSDIM2/)
-  dims_max = (/DIM0, DIM1, DIM2/)
+  dims_max = (/INT(DIM0,hsize_t), INT(DIM1,hsize_t), INT(DIM2,hsize_t)/)
 
   !
   ! Create source files and datasets. 
@@ -951,8 +946,8 @@ SUBROUTINE test_vds(total_error)
   ! 
   ! Get mapping parameters for each mapping.
   !
-  DO i = 1, num_map
-     CALL H5Pget_virtual_vspace_f(dcpl, INT(i-1,size_t), vspace, error)
+  DO i_sz = 1, num_map
+     CALL H5Pget_virtual_vspace_f(dcpl, INT(i_sz-1,size_t), vspace, error)
      CALL check("H5Pget_virtual_vspace_f", error, total_error)
 
      CALL h5sget_select_type_f(vspace, s_type, error)
@@ -965,7 +960,7 @@ SUBROUTINE test_vds(total_error)
            CALL H5Sget_regular_hyperslab_f(vspace, start_out, stride_out, count_out, block_out, error)
            CALL check("H5Sget_regular_hyperslab_f", error, total_error)
            DO j = 1, 3
-              IF(start_out(j).NE.start_correct(j,i) .OR. &
+              IF(start_out(j).NE.start_correct(j,i_sz) .OR. &
                    stride_out(j).NE.stride(j).OR. &
                    count_out(j).NE.src_count(j))THEN
                  total_error = total_error + 1
@@ -1032,7 +1027,7 @@ SUBROUTINE test_vds(total_error)
         total_error = total_error + 1
      ENDIF
 
-     CALL h5pget_virtual_srcspace_f(dcpl, INT(i-1,size_t), space_out, error)
+     CALL h5pget_virtual_srcspace_f(dcpl, i_sz - 1_size_t, space_out, error)
      CALL check("H5Pget_virtual_srcspace_f", error, total_error)
 
      CALL h5sget_select_type_f(space_out, type1, error)
diff --git a/fortran/test/tH5R.F90 b/fortran/test/tH5R.F90
index ef392b4..f7cccfa 100644
--- a/fortran/test/tH5R.F90
+++ b/fortran/test/tH5R.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/test/tH5S.F90 b/fortran/test/tH5S.F90
index 7223772..a4f5f4a 100644
--- a/fortran/test/tH5S.F90
+++ b/fortran/test/tH5S.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/test/tH5Sselect.F90 b/fortran/test/tH5Sselect.F90
index aeb80e9..8415bce 100644
--- a/fortran/test/tH5Sselect.F90
+++ b/fortran/test/tH5Sselect.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! NOTES
diff --git a/fortran/test/tH5T.F90 b/fortran/test/tH5T.F90
index efbceea..a986ba6 100644
--- a/fortran/test/tH5T.F90
+++ b/fortran/test/tH5T.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
@@ -490,7 +488,7 @@ CONTAINS
      !
      ! Read part of the dataset
      !
-     CALL h5dread_f(dset_id, dt1_id, char_member_out, data_dims, error)
+     CALL h5dread_f(dset_id, dt1_id, char_member_out, data_dims, error, H5S_ALL_F, H5S_ALL_F, H5P_DEFAULT_F)
      CALL check("h5dread_f", error, total_error)
          do i = 1, dimsize
             if (char_member_out(i) .ne. char_member(i)) then
diff --git a/fortran/test/tH5T_F03.F90 b/fortran/test/tH5T_F03.F90
index d50b76d..800e84b 100644
--- a/fortran/test/tH5T_F03.F90
+++ b/fortran/test/tH5T_F03.F90
@@ -15,12 +15,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
@@ -66,6 +64,7 @@ SUBROUTINE test_array_compound_atomic(total_error)
   CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray1.h5"
 
   TYPE s1_t
+     SEQUENCE
      INTEGER :: i
      REAL :: f
   END TYPE s1_t
@@ -248,7 +247,7 @@ SUBROUTINE test_array_compound_atomic(total_error)
   ! Read dataset from disk 
 
   f_ptr = C_LOC(rdata(1,1))
-  CALL H5Dread_f(dataset, tid1, f_ptr, error)
+  CALL H5Dread_f(dataset, tid1, f_ptr, error, H5S_ALL_F, H5S_ALL_F, H5P_DEFAULT_F)
   CALL check("H5Dread_f", error, total_error)
 
   ! Compare data read in 
@@ -298,7 +297,8 @@ END SUBROUTINE test_array_compound_atomic
     INTEGER, PARAMETER :: SPACE1_DIM1 = 4
     CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray2.h5"
 
-    TYPE st_t_struct !  Typedef for compound datatype 
+    TYPE st_t_struct !  Typedef for compound datatype
+       SEQUENCE
        INTEGER :: i
        REAL, DIMENSION(1:ARRAY2_DIM1) :: f
        CHARACTER(LEN=2), DIMENSION(1:ARRAY2_DIM1) :: c
@@ -614,15 +614,10 @@ END SUBROUTINE test_array_compound_atomic
              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
+             CALL VERIFY("h5dread_f",wdata(i,j)%f(k),rdata(i,j)%f(k),total_error)
+             IF(total_error.NE.0) PRINT*,'ERROR: Wrong real array data is read back by H5Dread_f'
+             CALL VERIFY("h5dread_f",wdata(i,j)%c(k),rdata(i,j)%c(k),total_error) 
+             IF(total_error.NE.0) PRINT*,'ERROR: Wrong character array data is read back by H5Dread_f'
           ENDDO
        ENDDO
     ENDDO
@@ -1054,12 +1049,12 @@ END SUBROUTINE test_array_compound_atomic
     ! 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
+       dset_data_i1(i)  = HUGE(0_int_kind_1)-INT(i,int_kind_1)
+       dset_data_i4(i)  = HUGE(0_int_kind_4)-INT(i,int_kind_4)
+       dset_data_i8(i)  = HUGE(0_int_kind_8)-INT(i,int_kind_8)
+       dset_data_i16(i) = HUGE(0_int_kind_16)-INT(i,int_kind_16)
 #if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
-       dset_data_i32(i) = HUGE(0_int_kind_32)-i
+       dset_data_i32(i) = HUGE(0_int_kind_32)-INT(i,int_kind_32)
 #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)
@@ -1149,33 +1144,33 @@ END SUBROUTINE test_array_compound_atomic
   !
   ! 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)
+    f_ptr = C_LOC(data_out_i1(1))
     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)
+    f_ptr = C_LOC(data_out_i4(1))
     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)
+    f_ptr = C_LOC(data_out_i8(1))
     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)
+    f_ptr = C_LOC(data_out_i16(1))
     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)
+    f_ptr = C_LOC(data_out_i32(1))
     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)
+    f_ptr = C_LOC(data_out_r(1))
     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)
+    f_ptr = C_LOC(data_out_r7(1))
     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)
+    f_ptr = C_LOC(data_out_r15(1))
     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)
+    f_ptr = C_LOC(data_out_r31(1))
     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
@@ -1548,7 +1543,7 @@ SUBROUTINE t_bit(total_error)
   INTEGER :: A, B, C, D
   INTEGER :: Aw, Bw, Cw, Dw
   INTEGER :: i, j
-  INTEGER, PARAMETER :: hex =  Z'00000003'
+  INTEGER, PARAMETER :: hex =  INT(Z'00000003')
   TYPE(C_PTR) :: f_ptr
   INTEGER :: error     ! Error flag
   !
@@ -2005,7 +2000,7 @@ SUBROUTINE t_regref(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 h5dwrite_f(dset2, H5T_NATIVE_INTEGER_KIND(1), f_ptr, error)
   CALL check("h5dwrite_f",error, total_error)
   !
   ! Create reference to a list of elements in dset2.
@@ -2117,7 +2112,7 @@ SUBROUTINE t_regref(total_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 h5dread_f( dset2, H5T_NATIVE_INTEGER_KIND(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)
 
@@ -2181,13 +2176,13 @@ SUBROUTINE t_vlen(total_error)
   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
+  DO i=1, INT(wdata(1)%len)
+     ptr(1)%data(i) = INT(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
+  DO i = 3, INT(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))
@@ -2273,7 +2268,7 @@ SUBROUTINE t_vlen(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
+     DO j = 1, INT(rdata(i)%len)
         CALL VERIFY("t_vlen", ptr_r(j), ptr(i)%data(j), total_error)
      ENDDO
   ENDDO
@@ -2891,33 +2886,23 @@ SUBROUTINE setup_buffer(data_in, line_lengths, char_type)
   
   CHARACTER(len=10), DIMENSION(:) :: data_in
   INTEGER(size_t), DIMENSION(:) :: line_lengths
-  INTEGER, DIMENSION(1:3) :: letters
-  CHARACTER(LEN=3) :: lets
+  CHARACTER(LEN=3) :: lets = 'abc'
   CHARACTER(KIND=C_CHAR,LEN=*) :: char_type
-  CHARACTER(KIND=C_CHAR,LEN=1) :: char_tmp
-  INTEGER :: i, j, n, ff
+  INTEGER :: i, j, n
 
-  ! 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
+        data_in(i:i) = char_type(1:1)
      ELSE
-        WRITE(char_tmp,'(A1)') letters(j)
-        data_in(i:i) = char_tmp
+        data_in(i:i) = lets(j:j)
      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
+  data_in(n:n) =  char_type(1:1)
   line_lengths(n) = 1
   
 END SUBROUTINE setup_buffer
diff --git a/fortran/test/tH5VL.F90 b/fortran/test/tH5VL.F90
index 834fbde..7ef9c19 100644
--- a/fortran/test/tH5VL.F90
+++ b/fortran/test/tH5VL.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tH5Z.F90 b/fortran/test/tH5Z.F90
index 4201960..0fd7b1b 100644
--- a/fortran/test/tH5Z.F90
+++ b/fortran/test/tH5Z.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
diff --git a/fortran/test/tHDF5.F90 b/fortran/test/tHDF5.F90
index e9e0892..459b74f 100644
--- a/fortran/test/tHDF5.F90
+++ b/fortran/test/tHDF5.F90
@@ -17,12 +17,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/tHDF5_1_8.F90 b/fortran/test/tHDF5_1_8.F90
index 6a3f74b..7e1f862 100644
--- a/fortran/test/tHDF5_1_8.F90
+++ b/fortran/test/tHDF5_1_8.F90
@@ -18,12 +18,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/tHDF5_F03.F90 b/fortran/test/tHDF5_F03.F90
index b3b1885..96959d8 100644
--- a/fortran/test/tHDF5_F03.F90
+++ b/fortran/test/tHDF5_F03.F90
@@ -18,12 +18,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !*****
diff --git a/fortran/test/tf.F90 b/fortran/test/tf.F90
index e9baf43..4df53bd 100644
--- a/fortran/test/tf.F90
+++ b/fortran/test/tf.F90
@@ -14,12 +14,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! CONTAINS SUBROUTINES
@@ -40,7 +38,8 @@ MODULE TH5_MISC
   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
+  TYPE :: comp_datatype
+    SEQUENCE
     REAL :: a
     INTEGER :: x
     DOUBLE PRECISION :: y
@@ -336,8 +335,8 @@ CONTAINS
     IMPLICIT NONE
     TYPE(comp_datatype), INTENT(in) :: a
 
-#ifdef H5_FORTRAN_HAVE_C_SIZEOF
-    H5_SIZEOF_CMPD = C_SIZEOF(a)
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+    H5_SIZEOF_CMPD = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
 #else
     H5_SIZEOF_CMPD = SIZEOF(a)
 #endif
diff --git a/fortran/testpar/CMakeLists.txt b/fortran/testpar/CMakeLists.txt
index 4f21419..909cbaf 100644
--- a/fortran/testpar/CMakeLists.txt
+++ b/fortran/testpar/CMakeLists.txt
@@ -1,10 +1,10 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_FORTRAN_TESTPAR C CXX Fortran)
 
 #-----------------------------------------------------------------------------
 # Setup include Directories
 #-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_F90_BINARY_DIR} ${HDF5_F90_SRC_DIR}/src)
+INCLUDE_DIRECTORIES (${MPI_Fortran_INCLUDE_PATH} ${HDF5_F90_BINARY_DIR} ${HDF5_F90_SRC_DIR}/src)
 
 #-----------------------------------------------------------------------------
 # Add Tests
@@ -18,15 +18,15 @@ add_executable (parallel_test
 )
 TARGET_NAMING (parallel_test STATIC)
 TARGET_FORTRAN_PROPERTIES (parallel_test STATIC " " " ")
-target_link_libraries (parallel_test 
+target_link_libraries (parallel_test
     ${HDF5_F90_TEST_LIB_TARGET}
     ${HDF5_F90_LIB_TARGET}
     ${HDF5_LIB_TARGET}
-    ${MPI_Fortran_LIBRARIES}
+    ${LINK_Fortran_LIBS}
 )
 if (WIN32 AND MSVC)
   target_link_libraries (parallel_test "ws2_32.lib")
-endif (WIN32 AND MSVC)
+endif ()
 target_include_directories (parallel_test PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (parallel_test PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (parallel_test PROPERTIES FOLDER test/fortran)
diff --git a/fortran/testpar/CMakeTests.cmake b/fortran/testpar/CMakeTests.cmake
index 61085e6..5736256 100644
--- a/fortran/testpar/CMakeTests.cmake
+++ b/fortran/testpar/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
diff --git a/fortran/testpar/Makefile.am b/fortran/testpar/Makefile.am
index 380f475..e597a84 100644
--- a/fortran/testpar/Makefile.am
+++ b/fortran/testpar/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/fortran/testpar/Makefile.in b/fortran/testpar/Makefile.in
index 9a8f26d..5721c5f 100644
--- a/fortran/testpar/Makefile.in
+++ b/fortran/testpar/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Fortran Parallel Library Test Makefile(.in)
 #
@@ -466,6 +464,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -587,6 +586,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -749,18 +749,20 @@ 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1201,12 +1203,13 @@ help:
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1214,7 +1217,7 @@ 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)
+lib dyn 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                           \
diff --git a/fortran/testpar/hyper.f90 b/fortran/testpar/hyper.f90
index 28c0b53..22f641d 100644
--- a/fortran/testpar/hyper.f90
+++ b/fortran/testpar/hyper.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
 
diff --git a/fortran/testpar/mdset.f90 b/fortran/testpar/mdset.f90
index 7fe431b..70d2939 100644
--- a/fortran/testpar/mdset.f90
+++ b/fortran/testpar/mdset.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
 
diff --git a/fortran/testpar/ptest.f90 b/fortran/testpar/ptest.f90
index 82dcc09..14ac3b2 100644
--- a/fortran/testpar/ptest.f90
+++ b/fortran/testpar/ptest.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
 !
diff --git a/hl/CMakeLists.txt b/hl/CMakeLists.txt
index bed8291..a47e023 100644
--- a/hl/CMakeLists.txt
+++ b/hl/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL C CXX)
 
 #-----------------------------------------------------------------------------
@@ -17,16 +17,16 @@ add_subdirectory (${HDF5_HL_SOURCE_DIR}/src ${HDF5_HL_BINARY_DIR}/src)
 #-- Build the High level Tools
 if (HDF5_BUILD_TOOLS)
   add_subdirectory (${HDF5_HL_SOURCE_DIR}/tools ${HDF5_HL_BINARY_DIR}/tools)
-endif (HDF5_BUILD_TOOLS)
+endif ()
 
 #-- Add High Level Examples
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_HL_SOURCE_DIR}/examples ${HDF5_HL_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 #-- Build the Unit testing if requested
 if (NOT HDF5_EXTERNALLY_CONFIGURED)
   if (BUILD_TESTING)
     add_subdirectory (${HDF5_HL_SOURCE_DIR}/test ${HDF5_HL_BINARY_DIR}/test)
-  endif (BUILD_TESTING)
-endif (NOT HDF5_EXTERNALLY_CONFIGURED)
+  endif ()
+endif ()
diff --git a/hl/COPYING b/hl/COPYING
index 6903daf..6497ace 100644
--- a/hl/COPYING
+++ b/hl/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/Makefile.am b/hl/Makefile.am
index 9f31719..aee1f86 100644
--- a/hl/Makefile.am
+++ b/hl/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
diff --git a/hl/Makefile.in b/hl/Makefile.in
index 36dde48..600983f 100644
--- a/hl/Makefile.in
+++ b/hl/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -465,6 +463,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -586,6 +585,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -736,18 +736,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 @BUILD_HDF5_HL_CONDITIONAL_TRUE at SUBDIRS = src test tools $(CXX_DIR) $(FORTRAN_DIR)
 DIST_SUBDIRS = src test tools c++ fortran examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1253,6 +1255,7 @@ build-check-clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1260,7 +1263,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/c++/CMakeLists.txt b/hl/c++/CMakeLists.txt
index 36f4c30..91bfa14 100644
--- a/hl/c++/CMakeLists.txt
+++ b/hl/c++/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_CPP)
 
 #-----------------------------------------------------------------------------
@@ -11,7 +11,7 @@ add_subdirectory (${HDF5_HL_CPP_SOURCE_DIR}/src ${HDF5_HL_CPP_BINARY_DIR}/src)
 # --------------------------------------------------------------------
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_HL_CPP_SOURCE_DIR}/examples ${HDF5_HL_CPP_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 # --------------------------------------------------------------------
 # Add in the unit tests for the packet table c++ wrapper
@@ -19,4 +19,4 @@ endif (HDF5_BUILD_EXAMPLES)
 
 if (BUILD_TESTING)
   add_subdirectory (${HDF5_HL_CPP_SOURCE_DIR}/test ${HDF5_HL_CPP_BINARY_DIR}/test)
-endif (BUILD_TESTING)
+endif ()
diff --git a/hl/c++/COPYING b/hl/c++/COPYING
index 6903daf..6497ace 100644
--- a/hl/c++/COPYING
+++ b/hl/c++/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/c++/Makefile.am b/hl/c++/Makefile.am
index 80445f7..1968bf5 100644
--- a/hl/c++/Makefile.am
+++ b/hl/c++/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/c++/Makefile.in b/hl/c++/Makefile.in
index 299ac9a..30ce6b4 100644
--- a/hl/c++/Makefile.in
+++ b/hl/c++/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # High-Level API C++ Makefile(.in)
 # 
@@ -461,6 +459,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -582,6 +581,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -730,18 +730,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 SUBDIRS = src test
 DIST_SUBDIRS = src test examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1243,6 +1245,7 @@ check-clean ::
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1250,7 +1253,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/c++/examples/CMakeLists.txt b/hl/c++/examples/CMakeLists.txt
index 77a50bf..33ad1e5 100644
--- a/hl/c++/examples/CMakeLists.txt
+++ b/hl/c++/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_CPP_EXAMPLES)
 
 #-----------------------------------------------------------------------------
@@ -23,4 +23,4 @@ set_target_properties (ptExampleFL PROPERTIES FOLDER examples/hl/cpp)
 
 if (BUILD_TESTING)
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
diff --git a/hl/c++/examples/CMakeTests.cmake b/hl/c++/examples/CMakeTests.cmake
index bac9fdf..103ec2b 100644
--- a/hl/c++/examples/CMakeTests.cmake
+++ b/hl/c++/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -8,9 +19,22 @@
 add_test (
     NAME HL_CPP_ex_ptExampleFL-clear-objects
     COMMAND    ${CMAKE_COMMAND}
-        -E remove 
+        -E remove
             PTcppexampleFL.h5
 )
 
-add_test (NAME HL_CPP_ex_ptExampleFL COMMAND $<TARGET_FILE:ptExampleFL>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME HL_CPP_ex_ptExampleFL COMMAND $<TARGET_FILE:ptExampleFL>)
+else ()
+  add_test (NAME HL_CPP_ex_ptExampleFL COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:ptExampleFL>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=ptExampleFL.txt"
+      #-D "TEST_REFERENCE=ptExampleFL.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (HL_CPP_ex_ptExampleFL PROPERTIES DEPENDS HL_CPP_ex_ptExampleFL-clear-objects)
diff --git a/hl/c++/examples/Makefile.am b/hl/c++/examples/Makefile.am
index 7202a96..ce719f5 100644
--- a/hl/c++/examples/Makefile.am
+++ b/hl/c++/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/c++/examples/Makefile.in b/hl/c++/examples/Makefile.in
index 0946c0f..db09144 100644
--- a/hl/c++/examples/Makefile.in
+++ b/hl/c++/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Examples Makefile(.in)
 #
@@ -408,6 +406,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -529,6 +528,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -700,18 +700,20 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1161,6 +1163,7 @@ installcheck-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1168,7 +1171,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/c++/examples/ptExampleFL.cpp b/hl/c++/examples/ptExampleFL.cpp
index 3ce2217..26cbf09 100644
--- a/hl/c++/examples/ptExampleFL.cpp
+++ b/hl/c++/examples/ptExampleFL.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5PacketTable.h"
@@ -24,10 +22,14 @@
  *-------------------------------------------------------------------------
  */
 
+const char* FILE_NAME("PTcppexampleFL.h5");
+const char* PT_NAME("/examplePacketTable");
+
 int main(void)
 {
     herr_t err;     /* Return value from function calls */
     hid_t fileID;   /* HDF5 identifier for file */
+    hid_t plistID;  /* HDF5 identifier for property list to use compression */
     hsize_t count;  /* Number of records in table */
     int x;          /* Temporary counter variable */
 
@@ -43,12 +45,19 @@ int main(void)
     }
 
     /* Create a new HDF5 file */
-    fileID = H5Fcreate("PTcppexampleFL.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    fileID = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     if(fileID <0)
         fprintf(stderr, "Couldn't create file.\n");
 
-    /* Create a fixed-length packet table with compression level 5. */
-    FL_PacketTable ptable(fileID, "/examplePacketTable", H5T_NATIVE_INT, 100, 5);
+    /* Prepare property list to set compression, randomly use deflate
+       with compression level 5. */
+    plistID = H5Pcreate(H5P_DATASET_CREATE);
+    err = H5Pset_deflate(plistID, 5);
+    if(err < 0)
+        fprintf(stderr, "Error setting compression level.");
+
+    /* Create a fixed-length packet table. */
+    FL_PacketTable ptable(fileID, plistID, PT_NAME, H5T_NATIVE_INT, 100);
     if(! ptable.IsValid())
         fprintf(stderr, "Unable to create packet table.");
 
diff --git a/hl/c++/examples/run-hlc++-ex.sh.in b/hl/c++/examples/run-hlc++-ex.sh.in
index 5aa1032..9539724 100644
--- a/hl/c++/examples/run-hlc++-ex.sh.in
+++ b/hl/c++/examples/run-hlc++-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hlc++-ex.sh
diff --git a/hl/c++/src/CMakeLists.txt b/hl/c++/src/CMakeLists.txt
index 425a2fe..38604cd 100644
--- a/hl/c++/src/CMakeLists.txt
+++ b/hl/c++/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_CPP_SRC)
 
 #-----------------------------------------------------------------------------
@@ -7,10 +7,10 @@ PROJECT (HDF5_HL_CPP_SRC)
 INCLUDE_DIRECTORIES (${HDF5_HL_SRC_DIR}/src)
 INCLUDE_DIRECTORIES (${HDF5_HL_CPP_SRC_SOURCE_DIR})
 
-set (HDF5_HL_CPP_SRCS ${HDF5_HL_CPP_SRC_SOURCE_DIR}/H5PacketTable.cpp)
+set (HDF5_HL_CPP_SOURCES ${HDF5_HL_CPP_SRC_SOURCE_DIR}/H5PacketTable.cpp)
 set (HDF5_HL_CPP_HDRS ${HDF5_HL_CPP_SRC_SOURCE_DIR}/H5PacketTable.h)
 
-add_library (${HDF5_HL_CPP_LIB_TARGET} STATIC ${HDF5_HL_CPP_SRCS})
+add_library (${HDF5_HL_CPP_LIB_TARGET} STATIC ${HDF5_HL_CPP_SOURCES})
 TARGET_C_PROPERTIES (${HDF5_HL_CPP_LIB_TARGET} STATIC " " " ")
 target_link_libraries (
     ${HDF5_HL_CPP_LIB_TARGET}
@@ -26,7 +26,7 @@ set_target_properties (${HDF5_HL_CPP_LIB_TARGET} PROPERTIES
 set (install_targets ${HDF5_HL_CPP_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_HL_CPP_LIBSH_TARGET} SHARED ${HDF5_HL_CPP_SRCS})
+  add_library (${HDF5_HL_CPP_LIBSH_TARGET} SHARED ${HDF5_HL_CPP_SOURCES})
   TARGET_C_PROPERTIES (${HDF5_HL_CPP_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (
       ${HDF5_HL_CPP_LIBSH_TARGET}
@@ -42,10 +42,10 @@ if (BUILD_SHARED_LIBS)
       INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
   )
   set (install_targets ${install_targets} ${HDF5_HL_CPP_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 #-----------------------------------------------------------------------------
-# Add file(s) to CMake Install 
+# Add file(s) to CMake Install
 #-----------------------------------------------------------------------------
 install (
     FILES
@@ -62,8 +62,9 @@ install (
 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)
-  
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_HL_CPP_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} hlcpplibraries)
+
   install (
       TARGETS
           ${install_targets}
@@ -73,5 +74,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT hlcpplibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hlcpplibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT hlcpplibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/hl/c++/src/H5PacketTable.cpp b/hl/c++/src/H5PacketTable.cpp
index 50e11f6..544df0b 100644
--- a/hl/c++/src/H5PacketTable.cpp
+++ b/hl/c++/src/H5PacketTable.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Packet Table wrapper classes
@@ -130,7 +128,7 @@
 
     /* GetDatatype
      * Returns the datatype identifier used by the packet table, on success,
-     * or FAIL, on failure.
+     * or H5I_INVALID_HID, on failure.
      * Note: it is best to avoid using this identifier in applications, unless
      * the desired functionality cannot be performed via the packet table ID.
      */
@@ -141,7 +139,7 @@
 
     /* GetDataset
      * Returns the dataset identifier associated with the packet table, on
-     * success, or FAIL, on failure.
+     * success, or H5I_INVALID_HID, on failure.
      * Note: it is best to avoid using this identifier in applications, unless
      * the desired functionality cannot be performed via the packet table ID.
      */
@@ -172,9 +170,22 @@
      * the property list to specify compression, the name of the packet table,
      * the ID of the datatype, and the size of a memory chunk used in chunking.
      */
-    FL_PacketTable::FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize)
+    FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize, hid_t plistID)
     {
-        table_id = H5PTcreate(fileID, name, dtypeID, chunkSize, plist_id);
+        table_id = H5PTcreate(fileID, name, dtypeID, chunkSize, plistID);
+    }
+
+    /* Constructor - deprecated
+     * Creates a packet table to store either fixed- or variable-length packets.
+     * Takes the ID of the file the packet table will be created in, the ID of
+     * the property list to specify compression, the name of the packet table,
+     * the ID of the datatype, and the size of a memory chunk used in chunking.
+     * Note: The above constructor has a better prototype, which allows default
+     * values to be used.  This constructor was only released in 1.10.0.
+     */
+    FL_PacketTable::FL_PacketTable(hid_t fileID, hid_t plistID, const char* name, hid_t dtypeID, hsize_t chunkSize)
+    {
+        table_id = H5PTcreate(fileID, name, dtypeID, chunkSize, plistID);
     }
 
     /* Constructor
diff --git a/hl/c++/src/H5PacketTable.h b/hl/c++/src/H5PacketTable.h
index bdd669d..2665984 100644
--- a/hl/c++/src/H5PacketTable.h
+++ b/hl/c++/src/H5PacketTable.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Packet Table wrapper classes
@@ -139,17 +137,19 @@ public:
      * the property list to specify compression, the name of the packet table,
      * the ID of the datatype, and the size of a memory chunk used in chunking.
      */
-    FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize);
+    FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize = 0, hid_t plistID = H5P_DEFAULT);
 
-    /* Constructor
+    /* Constructors - deprecated
      * Creates a packet table in which to store fixed length packets.
      * Takes the ID of the file the packet table will be created in, the name of
      * the packet table, the ID of the datatype of the set, the size
      * of a memory chunk used in chunking, and the desired compression level
      * (0-9, or -1 for no compression).
-     * Note: this overload will be deprecated in favor of the constructor above.
+     * Note: these overloaded constructors will be deprecated in favor of the
+     * constructor above.
      */
-    FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1);
+    FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize);
+    FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression = 0);
 
     /* "Open" Constructor
      * Opens an existing fixed-length packet table.
diff --git a/hl/c++/src/Makefile.am b/hl/c++/src/Makefile.am
index c78f5fa..363ba3b 100644
--- a/hl/c++/src/Makefile.am
+++ b/hl/c++/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/c++/src/Makefile.in b/hl/c++/src/Makefile.in
index e5d733a..3153ec3 100644
--- a/hl/c++/src/Makefile.in
+++ b/hl/c++/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-C++ Makefile(.in)
 #
@@ -464,6 +462,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -585,6 +584,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -730,32 +730,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -776,18 +771,20 @@ libhdf5_hl_cpp_la_LIBADD = $(LIBH5_HL) $(LIBH5CPP)
 # Public headers
 include_HEADERS = H5PacketTable.h
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -877,22 +874,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5PacketTable.Plo at am__quote@
 
 .cpp.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cpp.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cpp.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
@@ -1295,21 +1295,9 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1317,7 +1305,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/c++/test/CMakeLists.txt b/hl/c++/test/CMakeLists.txt
index de5b363..a2f9429 100644
--- a/hl/c++/test/CMakeLists.txt
+++ b/hl/c++/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_CPP_TEST)
 
 #-----------------------------------------------------------------------------
diff --git a/hl/c++/test/CMakeTests.cmake b/hl/c++/test/CMakeTests.cmake
index e36b5aa..785abca 100644
--- a/hl/c++/test/CMakeTests.cmake
+++ b/hl/c++/test/CMakeTests.cmake
@@ -1,8 +1,32 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
 ###           T E S T I N G                                                ###
 ##############################################################################
 ##############################################################################
-  
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
   add_test (NAME HL_CPP_ptableTest COMMAND $<TARGET_FILE:hl_ptableTest>)
+else ()
+  add_test (NAME HL_CPP_ptableTest COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:hl_ptableTest>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=hl_ptableTest.txt"
+      #-D "TEST_REFERENCE=hl_ptableTest.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
diff --git a/hl/c++/test/Makefile.am b/hl/c++/test/Makefile.am
index c835843..7031c34 100644
--- a/hl/c++/test/Makefile.am
+++ b/hl/c++/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/c++/test/Makefile.in b/hl/c++/test/Makefile.in
index 84f76ee..47f9bf4 100644
--- a/hl/c++/test/Makefile.in
+++ b/hl/c++/test/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-C++ Makefile(.in)
 #
@@ -461,6 +459,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -582,6 +581,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -739,18 +739,20 @@ ptableTest_SOURCES = ptableTest.cpp
 # Tell conclude.am that these are C++ tests.
 CXX_API = yes
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -815,22 +817,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ptableTest.Po at am__quote@
 
 .cpp.o:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cpp.obj:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cpp.lo:
- at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
@@ -1217,6 +1222,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1224,7 +1230,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp
index ff99285..340912e 100644
--- a/hl/c++/test/ptableTest.cpp
+++ b/hl/c++/test/ptableTest.cpp
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* ptableTest.cpp */
@@ -38,23 +36,22 @@ int main(void)
     }
     else {
 
-            num_errors += BasicTest();
+	num_errors += BasicTest();
 
-            num_errors += TestCompoundDatatype();
+	num_errors += TestCompoundDatatype();
 
-            num_errors += TestGetPacket();
+	num_errors += TestGetPacket();
 
-            num_errors += TestGetNext();
+	num_errors += TestGetNext();
 
-            num_errors += TestCompress();
+	num_errors += TestCompress();
 
-            num_errors += TestErrors();
+	num_errors += TestErrors();
 
-            num_errors += SystemTest();
+	num_errors += SystemTest();
 
-#ifdef VLPT_REMOVED
-            num_errors += VariableLengthTest();
-#endif /* VLPT_REMOVED */
+	/* Test data corruption in packed structs */
+	num_errors += TestHDFFV_9758();
 
         /* Terminate access to the file. */
         err = H5Fclose(fileID);
@@ -88,19 +85,19 @@ int BasicTest()
 
     FL_PacketTable wrapper(fileID, H5P_DEFAULT, BASICTEST_PT, H5T_NATIVE_INT, 1);
     if(! wrapper.IsValid())
-      goto out;
+      goto error;
 
     /* Ensure initial count is zero */
     count = wrapper.GetPacketCount(error);
     if(count != 0 || error != 0)
-      goto out;
+      goto error;
 
     myRecord = 1;
 
     /* add some records test */
     err = wrapper.AppendPacket(&myRecord);
     if(err < 0)
-        goto out;
+        goto error;
 
     myRecord = 2;
 
@@ -109,26 +106,26 @@ int BasicTest()
     /* get number of records test */
     count = wrapper.GetPacketCount();
     if(count != 2)
-      goto out;
+      goto error;
 
     /* get records test */
     err = wrapper.GetPacket(0, &myRecord);
     if(err < 0)
-      goto out;
+      goto error;
 
     if(myRecord != 1)
-      goto out;
+      goto error;
 
     err = wrapper.GetPacket(1, &myRecord);
     if(err < 0)
-      goto out;
+      goto error;
     if(myRecord != 2)
-      goto out;
+      goto error;
 
     PASSED();
     return 0;
 
-out:
+error:
     H5_FAILED();
     return 1;
 }
@@ -160,7 +157,7 @@ int TestCompoundDatatype()
     FL_PacketTable wrapper(fileID, H5P_DEFAULT, CMPDTEST_PT, dtypeID, 1);
 
     if(! wrapper.IsValid())
-      goto out;
+      goto error;
 
     compoundType first;
     first.a = 1;
@@ -172,7 +169,7 @@ int TestCompoundDatatype()
 
     count = wrapper.GetPacketCount(error);
     if(count != 1)
-      goto out;
+      goto error;
 
     first.a = first.b = first.c = 0;
     first.e = 0;
@@ -181,16 +178,16 @@ int TestCompoundDatatype()
     wrapper.GetPacket(0, &first);
 
     if(first.a != 1)
-      goto out;
+      goto error;
     if(first.e != 5)
-      goto out;
+      goto error;
 
     PASSED();
 
     H5Tclose(dtypeID);
     return 0;
 
-out:
+error:
 
     H5E_BEGIN_TRY {
         H5Tclose(dtypeID);
@@ -215,7 +212,7 @@ int TestGetNext()
     FL_PacketTable wrapper(fileID, H5P_DEFAULT, GETNEXT_PT, H5T_NATIVE_INT, 500);
 
     if(! wrapper.IsValid())
-      goto out;
+      goto error;
 
     /* Append 5 records to the dataset */
     for(record = 1; record < 6; record++)
@@ -226,40 +223,40 @@ int TestGetNext()
     {
         wrapper.GetNextPacket(&record);
         if(record != i)
-          goto out;
+          goto error;
     }
 
     /* Reset the index and check that it worked */
     wrapper.ResetIndex();
-    if(wrapper.GetIndex(error) != 0) goto out;
-    if(error < 0) goto out;
+    if(wrapper.GetIndex(error) != 0) goto error;
+    if(error < 0) goto error;
 
     /* Ensure that we can interate through the records and get the right ones */
     for(i = 1; i < 6; i++)
     {
         error = wrapper.GetNextPacket(&record);
         if(record != i || error <0)
-          goto out;
+          goto error;
     }
 
     wrapper.SetIndex(1);
-    if(wrapper.GetIndex(error) != 1) goto out;
-    if(error < 0) goto out;
+    if(wrapper.GetIndex(error) != 1) goto error;
+    if(error < 0) goto error;
 
     /* Ensure we can get multiple records with our index pointer */
     wrapper.GetNextPackets(2, records);
     if(records[0] != 2 || records[1] != 3)
-      goto out;
+      goto error;
 
     /* Ensure our pointer was updated correctly */
     wrapper.GetNextPacket(&record);
     if(record != 4)
-      goto out;
+      goto error;
 
     PASSED();
     return 0;
 
-out:
+error:
     H5_FAILED();
     return 1;
 }
@@ -279,7 +276,7 @@ int TestCompress()
 	dscreatplist.setDeflate(6);
 
         /* Create packet table with compression. */
-        FL_PacketTable wrapper(fileID, dscreatplist.getId(), COMPRESS_PT, H5T_NATIVE_CHAR, 100);
+        FL_PacketTable wrapper(fileID, COMPRESS_PT, H5T_NATIVE_CHAR, 100, dscreatplist.getId());
 
 	/* Close the property list */
 	dscreatplist.close();
@@ -320,11 +317,12 @@ int TestGetPacket()
     int i;
     TESTING("GetPacket")
 
-    /* Create a dataset.  Explicitly specify no compression */
-    FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTGETPT, H5T_NATIVE_INT, 1);
+    /* Create a dataset.  Does not need to specify property list because
+       there is no compression. */
+    FL_PacketTable wrapper(fileID, PT_TESTGETPT, H5T_NATIVE_INT, 1);
 
     if(! wrapper.IsValid())
-      goto out;
+      goto error;
 
     /* Append 5 records to the dataset */
     for(record = 1; record < 6; record++)
@@ -333,20 +331,20 @@ int TestGetPacket()
     /* Ensure that the records were written properly */
     wrapper.GetPacket(1, &record);
     if(record != 2)
-      goto out;
+      goto error;
 
     /* Ensure that we can retrieve multiple records */
     wrapper.GetPackets(1, 3, theRecs);
     for(i = 0; i < 3; i++)
     {
         if(theRecs[i] != i+2)
-          goto out;
+          goto error;
     }
 
     PASSED();
     return 0;
 
-out:
+error:
     H5_FAILED();
     return 1;
 }
@@ -358,10 +356,10 @@ int TestErrors()
     TESTING("error conditions")
 
     /* Create a dataset */
-    FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTERROR, H5T_NATIVE_INT, 1);
+    FL_PacketTable wrapper(fileID, PT_TESTERROR, H5T_NATIVE_INT, 1);
 
     if(! wrapper.IsValid())
-      goto out;
+      goto error;
 
     int record;
     int records[3];
@@ -372,92 +370,92 @@ int TestErrors()
         wrapper.AppendPacket(&record);
 
     /* Try to confuse functions with bad indexes */
-    error = wrapper.GetPacket( (unsigned) -1, &record);
+    error = wrapper.GetPacket(static_cast<unsigned>(-1), &record);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPacket(4, &record);
     if(error >= 0)
-      goto out;
-    error = wrapper.GetPacket((unsigned) -250, &record);
+      goto error;
+    error = wrapper.GetPacket(static_cast<unsigned>(-250), &record);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPacket(3000, &record);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPacket(1, &record);
     if(error < 0)
-      goto out;
+      goto error;
 
-    error = wrapper.GetPackets((unsigned) -1, 1, records);
+    error = wrapper.GetPackets(static_cast<unsigned>(-1), 1, records);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(2, 4, records);
     if(error >= 0)
-      goto out;
-    error = wrapper.GetPackets((unsigned) -60, (unsigned) -62, records);
+      goto error;
+    error = wrapper.GetPackets(static_cast<unsigned>(-60), static_cast<unsigned>(-62), records);
      if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(10, 12, records);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(0, 2, records);
     if(error < 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(2, 0, records);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(1, 1, records);
     if(error < 0)
-      goto out;
+      goto error;
     error = wrapper.GetPackets(1, 3, records);
     if(error < 0)
-      goto out;
+      goto error;
 
     wrapper.ResetIndex();
-    error = wrapper.SetIndex((unsigned) -1);
+    error = wrapper.SetIndex(static_cast<unsigned>(-1));
     if(error >= 0)
-      goto out;
-    if(wrapper.GetIndex(error) != 0) goto out;
-    if(error < 0) goto out;
+      goto error;
+    if(wrapper.GetIndex(error) != 0) goto error;
+    if(error < 0) goto error;
     error = wrapper.GetNextPacket(&record);
     if(error < 0)
-      goto out;
+      goto error;
     if(record != 1)
-      goto out;
-    if(wrapper.GetIndex(error) != 1) goto out;
-    if(error < 0) goto out;
+      goto error;
+    if(wrapper.GetIndex(error) != 1) goto error;
+    if(error < 0) goto error;
     error = wrapper.SetIndex(20);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetNextPacket(&record);
     if(error < 0)
-      goto out;
+      goto error;
     if(record != 2)
-      goto out;
+      goto error;
     wrapper.SetIndex(3);
     error = wrapper.GetNextPacket(&record);
     if(error < 0)
-      goto out;
+      goto error;
     if(record != 4)
-      goto out;
-    if(wrapper.GetIndex(error) != 4) goto out;
-    if(error < 0) goto out;
+      goto error;
+    if(wrapper.GetIndex(error) != 4) goto error;
+    if(error < 0) goto error;
     error = wrapper.GetNextPacket(&record);
     if(error >= 0)
-      goto out;
+      goto error;
 
     wrapper.ResetIndex();
     error = wrapper.GetNextPackets(10, records);
     if(error >= 0)
-      goto out;
+      goto error;
     error = wrapper.GetNextPackets(0, records);
     if(error < 0)
-      goto out;
+      goto error;
 
     PASSED();
     return 0;
 
-out:
+error:
     H5_FAILED();
     return 1;
 }
@@ -480,7 +478,7 @@ int SystemTest()
         int e;
     } compoundType;
 
-    dtypeID1 = H5Tcreate( H5T_COMPOUND, sizeof(compoundType));
+    dtypeID1 = H5Tcreate(H5T_COMPOUND, sizeof(compoundType));
 
     H5Tinsert(dtypeID1, "abbey", HOFFSET( compoundType, a ), H5T_NATIVE_SHORT);
     H5Tinsert(dtypeID1, "bert", HOFFSET( compoundType, b ), H5T_NATIVE_SHORT);
@@ -493,7 +491,7 @@ int SystemTest()
         compoundType g;
     } cType2;
 
-    dtypeID2 = H5Tcreate ( H5T_COMPOUND, sizeof(cType2));
+    dtypeID2 = H5Tcreate(H5T_COMPOUND, sizeof(cType2));
 
     H5Tinsert(dtypeID2, "f", HOFFSET( cType2, f ), H5T_NATIVE_CHAR);
     H5Tinsert(dtypeID2, "g", HOFFSET( cType2, g ), dtypeID1);
@@ -505,21 +503,21 @@ int SystemTest()
     ct2[0].g.c = 0;
     ct2[0].g.e = 3000;
 
-    /* Create the packet table datasets.  Make one of them compressed. */
-    FL_PacketTable wrapper1(fileID, H5P_DEFAULT, PT_SYSTEMTST1, dtypeID1, 1);
+    /* Create the packet table datasets.  One used a deprecated constructor */
+    FL_PacketTable wrapper1(fileID, PT_SYSTEMTST1, dtypeID1, 1);
     FL_PacketTable wrapper2(fileID, H5P_DEFAULT, PT_SYSTEMTST2, dtypeID2, 1);
 
     if(! wrapper1.IsValid())
-      goto out;
+      goto error;
     if(! wrapper2.IsValid())
-      goto out;
+      goto error;
 
     /* Write and read packets, ensure that nothing is unusual */
     wrapper2.AppendPacket(ct2);
 
     count = wrapper1.GetPacketCount();
     if(count != 0)
-      goto out;
+      goto error;
 
     compoundType ct1[10];
     ct1[0].a = 31;
@@ -536,13 +534,13 @@ int SystemTest()
     wrapper1.ResetIndex();
     wrapper1.GetNextPacket(&ct1[1]);
     wrapper2.GetPacket(1, &ct2[2]);
-    if(wrapper1.GetIndex(error) != 1) goto out;
-    if(error < 0) goto out;
-    if(wrapper2.GetIndex(error) != 0) goto out;
-    if(error < 0) goto out;
+    if(wrapper1.GetIndex(error) != 1) goto error;
+    if(error < 0) goto error;
+    if(wrapper2.GetIndex(error) != 0) goto error;
+    if(error < 0) goto error;
 
     if(ct1[1].b != ct2[2].g.b)
-      goto out;
+      goto error;
 
     H5Tclose(dtypeID1);
     H5Tclose(dtypeID2);
@@ -550,8 +548,7 @@ int SystemTest()
     PASSED();
     return 0;
 
-out:
-
+error:
     H5E_BEGIN_TRY {
         H5Tclose(dtypeID1);
         H5Tclose(dtypeID2);
@@ -561,73 +558,136 @@ out:
     return 1;
 }
 
-#ifdef VLPT_REMOVED
-int VariableLengthTest(void)
+/*-------------------------------------------------------------------------
+ * TestHDFFV_9758(): Test that a packet table with compound datatype which
+ *	contains string type can be created and written correctly. (HDFFV-9758)
+ *
+ * Notes:
+ *	Previously, data of the field that follows the string was read back
+ *	as garbage when #pragma pack(1) is used.
+ * 2016/10/20 -BMR
+ *      Updated:
+ *		#pragma pack(1) caused failure on Emu because Sparc cannot
+ *		access misaligned data.  Changed it to pack() to do the
+ *		default alignment.
+ * 2016/10/25 -BMR
+ *-------------------------------------------------------------------------
+ */
+#pragma pack()  // default alignment
+const char* ABHI_PT("/abhiTest");
+const hsize_t NUM_PACKETS = 5;
+const int STRING_LENGTH = 19; // including terminating NULL
+int TestHDFFV_9758()
 {
-    long test_long;
-    short test_short;
-    hvl_t read_buf;
-    VL_PacketTable* test_VLPT;
-    PacketTable* new_pt;
-
-    TESTING("variable-length packet tables")
-
-    /* Create a variable length table */
-    test_VLPT = new VL_PacketTable(fileID, "/VariableLengthTest", 1);
-
-    /* Verify that the creation succeeded */
-    if(! test_VLPT->IsValid())
-      goto out;
-
-    /* Append some packets */
-    test_short = 9;
-    test_VLPT->AppendPacket(&test_short, sizeof(short));
-    test_long = 16;
-    test_VLPT->AppendPacket(&test_long, sizeof(long));
-
-    /* Read them back and make sure they are correct */
-    test_VLPT->GetNextPackets(1, &read_buf);
-
-    if(read_buf.len != sizeof(short))
-      goto out;
-    if(*(short *)(read_buf.p) != test_short)
-      goto out;
-
-    /* Free the memory used by the read */
-    test_VLPT->FreeReadbuff(1, &read_buf);
-
-    /* Read the second record */
-    test_VLPT->GetNextPackets(1, &read_buf);
-
-    if(read_buf.len != sizeof(long))
-      goto out;
-    if(*(long *)(read_buf.p) != test_long)
-      goto out;
-
-    /* Free the memory used by the read */
-    test_VLPT->FreeReadbuff(1, &read_buf);
-
-    /* Close the packet table */
-    delete test_VLPT;
+    hid_t strtype;
+    hid_t compound_type;
+    herr_t err;
+    struct s1_t
+    {
+        int a;
+        float b;
+        double c;
+        char d[STRING_LENGTH]; // null terminated string
+        int e;
+    };
 
-    /* Reopen the packet table and verify that it is variable length */
-    new_pt = new PacketTable(fileID, "/VariableLengthTest");
+    s1_t s1[NUM_PACKETS];
+    
+    for (hsize_t i = 0; i < NUM_PACKETS; i++)
+    {
+        s1[i].a = i;
+        s1[i].b = 1.f * static_cast<float>(i * i);
+        s1[i].c = 1. / (i + 1);
+        sprintf(s1[i].d, "string%d", (int)i);
+        s1[i].e = 100+i;
+    }
 
-    /* Verify that the open succeeded */
-    if(! new_pt->IsValid())
-      goto out;
+    TESTING("data corruption in packed structs (HDFFV-9758)")
+
+    // Build a compound datatype
+    compound_type = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+    if (compound_type < 0)
+	goto error;
+    
+    err = H5Tinsert(compound_type, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT);
+    if (err < 0)
+	goto error;
+    err = H5Tinsert(compound_type, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+    if (err < 0)
+	goto error;
+    err = H5Tinsert(compound_type, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+    if (err < 0)
+	goto error;
+
+    strtype = H5Tcopy (H5T_C_S1);
+    if (compound_type < 0)
+	goto error;
+    err = H5Tset_size (strtype, STRING_LENGTH); /* create string */
+    if (err < 0)
+	goto error;
+    err = H5Tinsert(compound_type, "d_name", HOFFSET(s1_t, d), strtype);
+    if (err < 0)
+	goto error;
+    err = H5Tinsert(compound_type, "e_name", HOFFSET(s1_t, e), H5T_NATIVE_INT);
+    if (err < 0)
+	goto error;
+
+    { // so ptable will go out of scope before PASSED
+
+    // Create a packet table
+    FL_PacketTable ptable(fileID, "/examplePacketTable", compound_type, 1);
+    if (!ptable.IsValid())
+	goto error;
+
+    // Add packets to the table
+    for (size_t i = 0; i < NUM_PACKETS; i++)
+    {
+	/* Appends one packet at the current position */
+        err = ptable.AppendPacket(s1 + i);
+        if (err < 0) goto error;
+    }
 
-    if(new_pt->IsVariableLength() != 1)
-      goto out;
+    // Check packet count
+    const hsize_t count = ptable.GetPacketCount(err);
+    if (err < 0)
+	goto error;
+  
+    if (count != NUM_PACKETS)
+    {
+	std::cerr
+        << "Number of packets in packet table should be " << NUM_PACKETS
+        << " but is " << count << endl;
+    }
 
-    /* Close the packet table */
-    delete new_pt;
+    // Read and verify the data
+    ptable.ResetIndex();
+    for (size_t i = 0; i < NUM_PACKETS; i++)
+    {
+	s1_t s2;
+	memset(&s2, 0, sizeof(s1_t));
+	err = ptable.GetNextPacket(&s2);
+	if (err < 0)
+	    goto error;
+
+	if (s2.a != s1[i].a || s2.e != s1[i].e)
+	    goto error;
+	else if (HDstrcmp(s2.d, s1[i].d))
+	    goto error;
+    }
+    } // end of ptable block
 
     PASSED();
     return 0;
 
-out:
+error:
+
+    H5E_BEGIN_TRY {
+        H5Tclose(strtype);
+        H5Tclose(compound_type);
+        H5Fclose(fileID);
+    } H5E_END_TRY;
+
     H5_FAILED();
     return 1;
 }
-#endif /* VLPT_REMOVED */
+
diff --git a/hl/c++/test/ptableTest.h b/hl/c++/test/ptableTest.h
index d351e34..8af7bff 100644
--- a/hl/c++/test/ptableTest.h
+++ b/hl/c++/test/ptableTest.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Test header for Packet Table C++ wrapper API */
@@ -52,7 +50,8 @@ int TestGetPacket(void);
    Test for unusual interactions between multiple packet tables. */
 int SystemTest(void);
 
-/* Test the variable length dataset functionality */
-int VariableLengthTest(void);
+/* Create a packet table with compound type, which has a string type.  Verify
+   that data was written and read correctly. */
+int TestHDFFV_9758(void);
 
 #endif /* PTABLETEST */
diff --git a/hl/examples/CMakeLists.txt b/hl/examples/CMakeLists.txt
index f5e6f5e..1144e0f 100644
--- a/hl/examples/CMakeLists.txt
+++ b/hl/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_EXAMPLES )
 
 #-----------------------------------------------------------------------------
@@ -32,10 +32,10 @@ foreach (example ${examples})
   TARGET_C_PROPERTIES (hl_ex_${example} STATIC " " " ")
   target_link_libraries (hl_ex_${example} ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET})
   set_target_properties (hl_ex_${example} PROPERTIES FOLDER examples/hl)
-endforeach (example ${examples})
+endforeach ()
 
 if (BUILD_TESTING)
 
   include (CMakeTests.cmake)
 
-endif (BUILD_TESTING)
+endif ()
diff --git a/hl/examples/CMakeTests.cmake b/hl/examples/CMakeTests.cmake
index 8cf74d9..166fa7c 100644
--- a/hl/examples/CMakeTests.cmake
+++ b/hl/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -11,21 +22,15 @@ set (HDF5_TEST_FILES
 )
 
 foreach (h5_file ${HDF5_TEST_FILES})
-  set (dest "${PROJECT_BINARY_DIR}/${h5_file}")
-  #message (STATUS " Copying ${h5_file}")
-  add_custom_command (
-      TARGET     hl_ex_ex_ds1
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/${h5_file} ${dest}
-  )
-endforeach (h5_file ${HDF5_TEST_FILES})
+  HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "hl_ex_ex_ds1_files")
+endforeach ()
+add_custom_target(hl_ex_ex_ds1_files ALL COMMENT "Copying files needed by hl_ex_ex_ds1 tests" DEPENDS ${hl_ex_ex_ds1_files_list})
 
   # Remove any output file left over from previous test run
   add_test (
       NAME HL_ex-clear-objects
       COMMAND    ${CMAKE_COMMAND}
-          -E remove 
+          -E remove
     ex_lite1.h5
     ex_lite2.h5
     ex_lite3.h5
@@ -48,13 +53,26 @@ endforeach (h5_file ${HDF5_TEST_FILES})
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (HL_ex-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "HL_ex-clear-objects")
 
 foreach (example ${examples})
-  add_test (NAME HL_ex_${example} COMMAND $<TARGET_FILE:hl_ex_${example}>)
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (HL_ex_${example} PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "HL_ex_${example}")
-endforeach (example ${examples})
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_ex_${example} COMMAND $<TARGET_FILE:hl_ex_${example}>)
+  else ()
+    add_test (NAME HL_ex_${example} COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_ex_${example}>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_ex_${example}.txt"
+        #-D "TEST_REFERENCE=hl_ex_${example}.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (HL_ex_${example} PROPERTIES DEPENDS ${last_test})
+  endif ()
+  set (last_test "HL_ex_${example}")
+endforeach ()
diff --git a/hl/examples/Makefile.am b/hl/examples/Makefile.am
index ba200ed..29e1a48 100644
--- a/hl/examples/Makefile.am
+++ b/hl/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/examples/Makefile.in b/hl/examples/Makefile.in
index ad4dcd9..58e963e 100644
--- a/hl/examples/Makefile.in
+++ b/hl/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Examples Makefile(.in)
 #
@@ -408,6 +406,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -529,6 +528,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -715,18 +715,20 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1200,6 +1202,7 @@ installcheck-local:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1207,7 +1210,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/examples/ex_ds1.c b/hl/examples/ex_ds1.c
index 8b7e530..1e0c592 100644
--- a/hl/examples/ex_ds1.c
+++ b/hl/examples/ex_ds1.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_image1.c b/hl/examples/ex_image1.c
index 18ad903..56a175d 100644
--- a/hl/examples/ex_image1.c
+++ b/hl/examples/ex_image1.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_image2.c b/hl/examples/ex_image2.c
index b57f1b7..5abf723 100644
--- a/hl/examples/ex_image2.c
+++ b/hl/examples/ex_image2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_lite1.c b/hl/examples/ex_lite1.c
index 446c803..89f60dc 100644
--- a/hl/examples/ex_lite1.c
+++ b/hl/examples/ex_lite1.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/hl/examples/ex_lite2.c b/hl/examples/ex_lite2.c
index a696a20..261fc73 100644
--- a/hl/examples/ex_lite2.c
+++ b/hl/examples/ex_lite2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_lite3.c b/hl/examples/ex_lite3.c
index f409ea4..420cbcb 100644
--- a/hl/examples/ex_lite3.c
+++ b/hl/examples/ex_lite3.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_01.c b/hl/examples/ex_table_01.c
index 1d381ae..f1d0266 100644
--- a/hl/examples/ex_table_01.c
+++ b/hl/examples/ex_table_01.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_02.c b/hl/examples/ex_table_02.c
index 129f87d..923f810 100644
--- a/hl/examples/ex_table_02.c
+++ b/hl/examples/ex_table_02.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_03.c b/hl/examples/ex_table_03.c
index c9f94ce..76a9eae 100644
--- a/hl/examples/ex_table_03.c
+++ b/hl/examples/ex_table_03.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/hl/examples/ex_table_04.c b/hl/examples/ex_table_04.c
index 01f2869..203114c 100644
--- a/hl/examples/ex_table_04.c
+++ b/hl/examples/ex_table_04.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_05.c b/hl/examples/ex_table_05.c
index 7ed1fec..b43d635 100644
--- a/hl/examples/ex_table_05.c
+++ b/hl/examples/ex_table_05.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/hl/examples/ex_table_06.c b/hl/examples/ex_table_06.c
index 081347e..0397e83 100644
--- a/hl/examples/ex_table_06.c
+++ b/hl/examples/ex_table_06.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_07.c b/hl/examples/ex_table_07.c
index 3be788f..d9ea444 100644
--- a/hl/examples/ex_table_07.c
+++ b/hl/examples/ex_table_07.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/ex_table_08.c b/hl/examples/ex_table_08.c
index 5d3659f..a45520d 100644
--- a/hl/examples/ex_table_08.c
+++ b/hl/examples/ex_table_08.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5_hl.h"
diff --git a/hl/examples/ex_table_09.c b/hl/examples/ex_table_09.c
index a4ef611..a9f5f11 100644
--- a/hl/examples/ex_table_09.c
+++ b/hl/examples/ex_table_09.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5_hl.h"
diff --git a/hl/examples/ex_table_10.c b/hl/examples/ex_table_10.c
index 059c7ea..8c4d8ae 100644
--- a/hl/examples/ex_table_10.c
+++ b/hl/examples/ex_table_10.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5_hl.h"
diff --git a/hl/examples/ex_table_11.c b/hl/examples/ex_table_11.c
index 687568c..d6215cb 100644
--- a/hl/examples/ex_table_11.c
+++ b/hl/examples/ex_table_11.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5_hl.h"
diff --git a/hl/examples/ex_table_12.c b/hl/examples/ex_table_12.c
index 125b8be..f287c29 100644
--- a/hl/examples/ex_table_12.c
+++ b/hl/examples/ex_table_12.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
diff --git a/hl/examples/pal_rgb.h b/hl/examples/pal_rgb.h
index 606137e..f3905b3 100644
--- a/hl/examples/pal_rgb.h
+++ b/hl/examples/pal_rgb.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 const unsigned char pal_rgb[256*3] = {255,255,255,
diff --git a/hl/examples/ptExampleFL.c b/hl/examples/ptExampleFL.c
index 37b5035..ba7a3a0 100644
--- a/hl/examples/ptExampleFL.c
+++ b/hl/examples/ptExampleFL.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5_hl.h"
diff --git a/hl/examples/run-hl-ex.sh b/hl/examples/run-hl-ex.sh
index 5fa97c0..6f736cc 100755
--- a/hl/examples/run-hl-ex.sh
+++ b/hl/examples/run-hl-ex.sh
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hl-ex.sh
diff --git a/hl/examples/run-hlc-ex.sh.in b/hl/examples/run-hlc-ex.sh.in
index d897a02..b12955f 100644
--- a/hl/examples/run-hlc-ex.sh.in
+++ b/hl/examples/run-hlc-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hlc-ex.sh
diff --git a/hl/fortran/CMakeLists.txt b/hl/fortran/CMakeLists.txt
index 892169c..c651ce9 100644
--- a/hl/fortran/CMakeLists.txt
+++ b/hl/fortran/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_F90 C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -11,11 +11,11 @@ add_subdirectory (${HDF5_HL_F90_SOURCE_DIR}/src ${HDF5_HL_F90_BINARY_DIR}/src)
 #-----------------------------------------------------------------------------
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_HL_F90_SOURCE_DIR}/examples ${HDF5_HL_F90_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Testing
 #-----------------------------------------------------------------------------
 if (BUILD_TESTING)
   add_subdirectory (${HDF5_HL_F90_SOURCE_DIR}/test ${HDF5_HL_F90_BINARY_DIR}/test)
-endif (BUILD_TESTING)
+endif ()
diff --git a/hl/fortran/COPYING b/hl/fortran/COPYING
index 6903daf..6497ace 100644
--- a/hl/fortran/COPYING
+++ b/hl/fortran/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/fortran/Makefile.am b/hl/fortran/Makefile.am
index 646de26..ad18a21 100644
--- a/hl/fortran/Makefile.am
+++ b/hl/fortran/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
diff --git a/hl/fortran/Makefile.in b/hl/fortran/Makefile.in
index f5f09da..932089b 100644
--- a/hl/fortran/Makefile.in
+++ b/hl/fortran/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -465,6 +463,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -586,6 +585,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -734,18 +734,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 SUBDIRS = src test
 DIST_SUBDIRS = src test examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1247,6 +1249,7 @@ check-clean ::
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1254,7 +1257,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/fortran/examples/CMakeLists.txt b/hl/fortran/examples/CMakeLists.txt
index 87838a0..dfe6102 100644
--- a/hl/fortran/examples/CMakeLists.txt
+++ b/hl/fortran/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_F90_EXAMPLES C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -18,7 +18,7 @@ foreach (example ${examples})
   add_executable (hl_f90_ex_${example} ${HDF5_HL_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
   TARGET_NAMING (hl_f90_ex_${example} STATIC)
   TARGET_FORTRAN_PROPERTIES (hl_f90_ex_${example} STATIC " " " ")
-  target_link_libraries (hl_f90_ex_${example} 
+  target_link_libraries (hl_f90_ex_${example}
       ${HDF5_HL_F90_LIB_TARGET}
       ${HDF5_F90_LIB_TARGET}
       ${HDF5_LIB_TARGET}
@@ -27,10 +27,10 @@ foreach (example ${examples})
   set_target_properties (hl_f90_ex_${example} PROPERTIES LINKER_LANGUAGE Fortran)
   set_target_properties (hl_f90_ex_${example} PROPERTIES FOLDER examples/hl/fortran)
 
-endforeach (example ${examples})
+endforeach ()
 
 if (BUILD_TESTING)
 
   include (CMakeTests.cmake)
 
-endif (BUILD_TESTING)
+endif ()
diff --git a/hl/fortran/examples/CMakeTests.cmake b/hl/fortran/examples/CMakeTests.cmake
index 2c10295..91cb56b 100644
--- a/hl/fortran/examples/CMakeTests.cmake
+++ b/hl/fortran/examples/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -16,6 +27,19 @@ add_test (
 
 
 foreach (example ${examples})
-  add_test (NAME HL_FORTRAN_f90_ex_${example} COMMAND $<TARGET_FILE:hl_f90_ex_${example}>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_FORTRAN_f90_ex_${example} COMMAND $<TARGET_FILE:hl_f90_ex_${example}>)
+  else ()
+    add_test (NAME HL_FORTRAN_f90_ex_${example} COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_ex_${example}>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_f90_ex_${example}.txt"
+        #-D "TEST_REFERENCE=hl_f90_ex_${example}.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (HL_FORTRAN_f90_ex_${example} PROPERTIES DEPENDS HL_FORTRAN_f90_ex-clear-objects)
-endforeach (example ${examples})
+endforeach ()
diff --git a/hl/fortran/examples/Makefile.am b/hl/fortran/examples/Makefile.am
index 997da73..6709fb7 100644
--- a/hl/fortran/examples/Makefile.am
+++ b/hl/fortran/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/fortran/examples/Makefile.in b/hl/fortran/examples/Makefile.in
index 39f140c..2f9ba6e 100644
--- a/hl/fortran/examples/Makefile.in
+++ b/hl/fortran/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5-Fortran Examples Makefile(.in)
 #
@@ -414,6 +412,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -535,6 +534,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -715,18 +715,20 @@ 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1172,12 +1174,13 @@ installcheck-local:
 
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1185,7 +1188,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/fortran/examples/ex_ds1.f90 b/hl/fortran/examples/ex_ds1.f90
index d77f8e0..14e2b0c 100644
--- a/hl/fortran/examples/ex_ds1.f90
+++ b/hl/fortran/examples/ex_ds1.f90
@@ -5,12 +5,10 @@
 ! *                                                                           *
 ! * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 ! * terms governing use, modification, and redistribution, is contained in    *
-! * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-! * of the source code distribution tree; Copyright.html can be found at the  *
-! * root level of an installed copy of the electronic HDF5 document set and   *
-! * is linked from the top-level documents page.  It can also be found at     *
-! * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-! * access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 PROGRAM example_ds
 
diff --git a/hl/fortran/examples/exlite.f90 b/hl/fortran/examples/exlite.f90
index 916bcb9..90a33fd 100644
--- a/hl/fortran/examples/exlite.f90
+++ b/hl/fortran/examples/exlite.f90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
 !
diff --git a/hl/fortran/examples/run-hlfortran-ex.sh.in b/hl/fortran/examples/run-hlfortran-ex.sh.in
index 12f9fec..c8f41f8 100644
--- a/hl/fortran/examples/run-hlfortran-ex.sh.in
+++ b/hl/fortran/examples/run-hlfortran-ex.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 #  This file:  run-hlfortran-ex.sh
diff --git a/hl/fortran/src/CMakeLists.txt b/hl/fortran/src/CMakeLists.txt
index a566314..345a739 100644
--- a/hl/fortran/src/CMakeLists.txt
+++ b/hl/fortran/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT(HDF5_HL_F90_SRC C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -7,9 +7,9 @@ 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)
+    endif ()
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Generate the H5LT and H5TB REAL APIs
@@ -25,29 +25,30 @@ if (WIN32 AND MSVC)
         PROPERTIES
             COMPILE_FLAGS "/MT"
     )
-  endif (BUILD_SHARED_LIBS)
+  endif ()
   set_target_properties (H5HL_buildiface
       PROPERTIES
           LINK_FLAGS "/SUBSYSTEM:CONSOLE"
   )
-endif (WIN32 AND MSVC)
+endif ()
 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)
+  file (MAKE_DIRECTORY "${HDF5_HL_F90_SRC_BINARY_DIR}/shared")
   if (WIN32)
-    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/\${BUILD_TYPE})
-  else (WIN32)
+    set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/${CMAKE_BUILD_TYPE})
+  else ()
     set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
-  endif (WIN32)
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
+endif ()
 if (WIN32)
-  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/\${BUILD_TYPE})
-else (WIN32)
+  set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/${CMAKE_BUILD_TYPE})
+else ()
   set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
-endif (WIN32)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Setup include Directories
@@ -63,18 +64,18 @@ INCLUDE_DIRECTORIES (
 #-----------------------------------------------------------------------------
 # hl_f90CStub lib
 #-----------------------------------------------------------------------------
-set (HDF5_HL_F90_C_SRCS
+set (HDF5_HL_F90_C_SOURCES
     ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5DSfc.c
     ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5LTfc.c
     ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5IMfc.c
     ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5IMcc.c
     ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5TBfc.c
 )
-set_source_files_properties (${HDF5_HL_F90_C_SRCS} PROPERTIES LANGUAGE C)
+set_source_files_properties (${HDF5_HL_F90_C_SOURCES} PROPERTIES LANGUAGE C)
 
 set (HDF5_HL_F90_HEADERS ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5LTf90proto.h)
 
-add_library (${HDF5_HL_F90_C_LIB_TARGET} STATIC ${HDF5_HL_F90_C_SRCS} ${HDF5_HL_F90_HEADERS})
+add_library (${HDF5_HL_F90_C_LIB_TARGET} STATIC ${HDF5_HL_F90_C_SOURCES} ${HDF5_HL_F90_HEADERS})
 TARGET_C_PROPERTIES (${HDF5_HL_F90_C_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_HL_F90_C_LIB_TARGET} ${HDF5_F90_C_LIB_TARGET} ${HDF5_HL_LIB_TARGET})
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_C_LIB_TARGET}")
@@ -87,7 +88,7 @@ set_target_properties (${HDF5_HL_F90_C_LIB_TARGET} PROPERTIES
 set (install_targets ${HDF5_HL_F90_C_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_library (${HDF5_HL_F90_C_LIBSH_TARGET} SHARED ${HDF5_HL_F90_C_SRCS} ${HDF5_HL_F90_HEADERS})
+  add_library (${HDF5_HL_F90_C_LIBSH_TARGET} SHARED ${HDF5_HL_F90_C_SOURCES} ${HDF5_HL_F90_HEADERS})
   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}")
@@ -100,43 +101,74 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       INTERFACE_COMPILE_DEFINITIONS H5_BUILT_AS_DYNAMIC_LIB=1
   )
   set (install_targets ${install_targets} ${HDF5_HL_F90_C_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Fortran Modules
 #-----------------------------------------------------------------------------
-set (HDF5_HL_F90_F_BASE_SRCS
+set (HDF5_HL_F90_F_BASE_SOURCES
     ${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_F_BASE_SRCS}
 
-     # generated files
-     ${HDF5_HL_F90_SRC_BINARY_DIR}/H5LTff_gen.F90
-     ${HDF5_HL_F90_SRC_BINARY_DIR}/H5TBff_gen.F90
+set (CMD $<TARGET_FILE:H5HL_buildiface>)
+add_custom_command (
+    OUTPUT ${HDF5_HL_F90_SRC_BINARY_DIR}/H5LTff_gen.F90 ${HDF5_HL_F90_SRC_BINARY_DIR}/H5TBff_gen.F90
+    COMMAND ${CMD}
+    WORKING_DIRECTORY ${HDF5_HL_F90_SRC_BINARY_DIR}
+    DEPENDS ${HDF5_HL_F90_F_BASE_SOURCES}
+    COMMENT "Generating the H5LTff_gen.F90, H5TBff_gen.F90 files"
+)
+add_custom_target (H5HLgen ALL
+    DEPENDS ${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
 )
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  set (CMDSH $<TARGET_FILE:H5HL_buildiface>)
+  add_custom_command (
+      OUTPUT ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5LTff_gen.F90 ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5TBff_gen.F90
+      COMMAND ${CMD}
+      WORKING_DIRECTORY ${HDF5_HL_F90_SRC_BINARY_DIR}/shared
+      DEPENDS ${HDF5_HL_F90_F_BASE_SOURCES}
+      COMMENT "Generating the H5LTff_gen.F90, H5TBff_gen.F90 shared files"
+  )
+  add_custom_target (H5HLgenSH ALL
+      DEPENDS ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5LTff_gen.F90 ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5TBff_gen.F90
+  )
+  set_source_files_properties (
+      ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5LTff_gen.F90
+      ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5TBff_gen.F90
+      PROPERTIES GENERATED TRUE
+  )
+endif ()
 
-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}
+set (HDF5_HL_F90_F_SOURCES
+    ${HDF5_HL_F90_F_BASE_SOURCES}
+
+    # 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_SOURCES} PROPERTIES LANGUAGE Fortran)
+
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  set (HDF5_HL_F90_F_SOURCES_SHARED
+      ${HDF5_HL_F90_F_BASE_SOURCES}
+
+      # generated files
+      ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5LTff_gen.F90
+      ${HDF5_HL_F90_SRC_BINARY_DIR}/shared/H5TBff_gen.F90
+  )
+  set_source_files_properties (${HDF5_HL_F90_F_SOURCES_SHARED} PROPERTIES LANGUAGE Fortran)
+endif ()
 
-add_library (${HDF5_HL_F90_LIB_TARGET} STATIC ${HDF5_HL_F90_F_SRCS})
+add_library (${HDF5_HL_F90_LIB_TARGET} STATIC ${HDF5_HL_F90_F_SOURCES})
 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})
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_LIB_TARGET}")
@@ -151,15 +183,16 @@ if (WIN32)
   set_property (TARGET ${HDF5_HL_F90_LIB_TARGET}
       APPEND PROPERTY COMPILE_DEFINITIONS "HDF5F90_WINDOWS"
   )
-endif (WIN32)
+endif ()
 set (install_targets ${install_targets} ${HDF5_HL_F90_LIB_TARGET})
+add_dependencies(${HDF5_HL_F90_LIB_TARGET} H5HLgen)
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_library (${HDF5_HL_F90_LIBSH_TARGET} SHARED ${HDF5_HL_F90_F_SRCS})
+  add_library (${HDF5_HL_F90_LIBSH_TARGET} SHARED ${HDF5_HL_F90_F_SOURCES_SHARED})
   set (SHARED_LINK_FLAGS " ")
   if (WIN32 AND MSVC)
     set (SHARED_LINK_FLAGS "/DLL /DEF:${HDF5_HL_F90_SRC_BINARY_DIR}/hdf5_hl_fortrandll.def")
-  endif (WIN32 AND MSVC)
+  endif ()
   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}")
@@ -175,9 +208,10 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     set_property (TARGET ${HDF5_HL_F90_LIBSH_TARGET}
         APPEND PROPERTY COMPILE_DEFINITIONS "BUILD_HDF5_HL_DLL;HDF5F90_WINDOWS"
     )
-  endif (WIN32)
+  endif ()
   set (install_targets ${install_targets} ${HDF5_HL_F90_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  add_dependencies(${HDF5_HL_F90_LIBSH_TARGET} H5HLgenSH)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -219,7 +253,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       COMPONENT
           fortheaders
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
@@ -228,7 +262,9 @@ if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     INSTALL_TARGET_PDB (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} hlfortlibraries)
     #INSTALL_TARGET_PDB (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} hlfortlibraries)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_HL_F90_C_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} hlfortlibraries)
+  #INSTALL_TARGET_PDB (${HDF5_HL_F90_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} hlfortlibraries)
 
   install (
       TARGETS
@@ -239,5 +275,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT hlfortlibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hlfortlibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT hlfortlibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/hl/fortran/src/H5DSfc.c b/hl/fortran/src/H5DSfc.c
index af054e0..0bb594d 100644
--- a/hl/fortran/src/H5DSfc.c
+++ b/hl/fortran/src/H5DSfc.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* This files contains C stubs for H5D Fortran APIs */
diff --git a/hl/fortran/src/H5DSff.F90 b/hl/fortran/src/H5DSff.F90
index 00cf4d8..4f0d040 100644
--- a/hl/fortran/src/H5DSff.F90
+++ b/hl/fortran/src/H5DSff.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/hl/fortran/src/H5HL_buildiface.F90 b/hl/fortran/src/H5HL_buildiface.F90
index 15897c3..dda8d56 100644
--- a/hl/fortran/src/H5HL_buildiface.F90
+++ b/hl/fortran/src/H5HL_buildiface.F90
@@ -33,12 +33,10 @@
 !                                                                              *
 !  This file is part of HDF5.  The full HDF5 copyright notice, including       *
 !  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  the COPYING file, which can be found at the root of the source code         *
+!  distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.    *
+!  If you do not have access to either file, you may request a copy from       *
+!  help at hdfgroup.org.                                                          *
 !  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 ! AUTHOR
@@ -114,12 +112,10 @@ PROGRAM H5HL_buildiface
 '!                                                                             *',&
 '!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
 '!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'!   the COPYING file, which can be found at the root of the source code       *',&
+'!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *',&
+'!   If you do not have access to either file, you may request a copy from     *',&
+'!   help at hdfgroup.org.                                                        *',&
 '! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
 '!',&
 '! AUTHOR',&
@@ -584,12 +580,10 @@ PROGRAM H5HL_buildiface
 '!                                                                             *',&
 '!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
 '!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'!   the COPYING file, which can be found at the root of the source code       *',&
+'!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *',&
+'!   If you do not have access to either file, you may request a copy from     *',&
+'!   help at hdfgroup.org.                                                        *',&
 '! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
 '!',&
 '! AUTHOR',&
diff --git a/hl/fortran/src/H5IMcc.c b/hl/fortran/src/H5IMcc.c
index ae58fab..c6e4b1b 100644
--- a/hl/fortran/src/H5IMcc.c
+++ b/hl/fortran/src/H5IMcc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5IMcc.h"
@@ -314,7 +312,6 @@ out:
  *  the FORTRAN interface where the image buffer is defined as type "integer"
  *
  *  based on HDF5 Image and Palette Specification
- *  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
  *
  * Modifications:
  *
@@ -408,7 +405,6 @@ herr_t H5IMmake_palettef(hid_t loc_id,
  *  the FORTRAN interface where the image buffer is defined as type "integer"
  *
  *  based on HDF5 Image and Palette Specification
- *  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
  *
  * Modifications:
  *
@@ -451,7 +447,6 @@ herr_t H5IMget_palettef(hid_t loc_id,
  *
  * Comments:
  *  based on HDF5 Image and Palette Specification
- *  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
  *
  * Modifications:
  *
diff --git a/hl/fortran/src/H5IMcc.h b/hl/fortran/src/H5IMcc.h
index 0b8a345..a65669d 100644
--- a/hl/fortran/src/H5IMcc.h
+++ b/hl/fortran/src/H5IMcc.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5IMCC_H
diff --git a/hl/fortran/src/H5IMfc.c b/hl/fortran/src/H5IMfc.c
index 7ad50d6..cafd623 100644
--- a/hl/fortran/src/H5IMfc.c
+++ b/hl/fortran/src/H5IMfc.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* This files contains C stubs for H5D Fortran APIs */
diff --git a/hl/fortran/src/H5IMff.F90 b/hl/fortran/src/H5IMff.F90
index 4408dda..6646828 100644
--- a/hl/fortran/src/H5IMff.F90
+++ b/hl/fortran/src/H5IMff.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
diff --git a/hl/fortran/src/H5LTf90proto.h b/hl/fortran/src/H5LTf90proto.h
index 20d043e..35b08a1 100644
--- a/hl/fortran/src/H5LTf90proto.h
+++ b/hl/fortran/src/H5LTf90proto.h
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -311,6 +309,38 @@ h5tbmake_table_c(size_t_f *namelen1,
 
 HDF5_HL_F90CSTUBDLL
 int_f
+h5tbread_table_c(hid_t_f *loc_id,
+                  _fcd name,
+                  size_t_f *namelen,
+		  hsize_t_f *nfields,
+                  size_t_f *dst_size,
+                  size_t_f *dst_offset,
+                  size_t_f *dst_sizes,
+		 void *dst_buf);
+
+
+HDF5_HL_F90CSTUBDLL
+int_f
+h5tbmake_table_ptr_c(size_t_f *namelen1,
+		     _fcd name1,
+		     hid_t_f *loc_id,
+		     size_t_f *namelen,
+		     _fcd name,
+		     hsize_t_f *nfields,
+		     hsize_t_f *nrecords,
+		     size_t_f *type_size,
+		     size_t_f *field_offset,
+		     hid_t_f *field_types,
+		     hsize_t_f *chunk_size,
+		     void *fill_data,
+		     int_f *compress,
+		     size_t_f *char_len_field_names, /* field_names lenghts */
+		     size_t_f *max_char_size_field_names, /* char len of fields */
+		     char *field_names, /* field_names */
+		     void *data);
+
+HDF5_HL_F90CSTUBDLL
+int_f
 h5tbwrite_field_name_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
diff --git a/hl/fortran/src/H5LTfc.c b/hl/fortran/src/H5LTfc.c
index 3a94664..0f8a58f 100644
--- a/hl/fortran/src/H5LTfc.c
+++ b/hl/fortran/src/H5LTfc.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* This files contains C stubs for H5D Fortran APIs */
@@ -327,8 +325,10 @@ h5ltset_attribute_c(hid_t_f *loc_id,
         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);
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
       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);
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
       else
         goto done;
     } else if ( HDstrncmp(dtype,"R",1) == 0 ) {
@@ -420,8 +420,10 @@ h5ltget_attribute_c(hid_t_f *loc_id,
 	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);
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
       else if ((size_t)*sizeof_val == sizeof(long long))
 	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_LLONG,buf);
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
       else
         goto done;
     } else if ( HDstrncmp(dtype,"R",1) == 0 ) {
diff --git a/hl/fortran/src/H5LTff.F90 b/hl/fortran/src/H5LTff.F90
index d36d92c..80f6ac5 100644
--- a/hl/fortran/src/H5LTff.F90
+++ b/hl/fortran/src/H5LTff.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
@@ -110,7 +108,7 @@ MODULE H5LT_CONST
        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
+       INTEGER(size_t), INTENT(in) :: SizeOf_buf                     ! Sizeof the buf data type
      END FUNCTION h5ltget_attribute_c
   END INTERFACE
 
@@ -1059,14 +1057,16 @@ CONTAINS
     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           !
+    CHARACTER(LEN=*), INTENT(in) :: buf_type           ! valid data types are:
+                                                       !   CHARACTER, INTEGER or REAL
+                                                       !   NOTE: only the first character matters and is case insensitive 
     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 
+    INTEGER(size_t),  INTENT(in) :: SizeOf_buf_type    ! size of buf's data type 
+    INTEGER, INTENT(out) :: errcode                    ! error code
 
-    CHARACTER(KIND=C_CHAR) :: buf_type_uppercase  
-    INTEGER(size_t) :: SizeOf_buf_type
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length 
+    CHARACTER(KIND=C_CHAR) :: buf_type_uppercase 
 
     namelen = LEN(dset_name)
     attrlen = LEN(attr_name)
@@ -1316,13 +1316,15 @@ CONTAINS
     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
+    TYPE(C_PTR) :: buf                                 ! data buffer
+    CHARACTER(LEN=*), INTENT(in) :: buf_type           ! valid data types are:
+                                                       ! CHARACTER, INTEGER or REAL
+                                                       ! NOTE: only the first character matters and is case insensitive
+    INTEGER(size_t), INTENT(in) :: SizeOf_buf_type     ! size of buf's data type
+    INTEGER, INTENT(out) :: errcode                    ! error code 
     INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! attr length
     CHARACTER(KIND=C_CHAR) :: buf_type_uppercase
-    INTEGER(size_t) :: SizeOf_buf_type
 
     namelen = LEN(dset_name)
     attrlen = LEN(attr_name)
diff --git a/hl/fortran/src/H5TBfc.c b/hl/fortran/src/H5TBfc.c
index 99a7800..c0d053f 100644
--- a/hl/fortran/src/H5TBfc.c
+++ b/hl/fortran/src/H5TBfc.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <math.h>
@@ -37,21 +35,12 @@
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbmake_table_c(size_t_f *namelen1,
-                  _fcd name1,
-                  hid_t_f *loc_id,
-                  size_t_f *namelen,
-                  _fcd name,
-                  hsize_t_f *nfields,
-                  hsize_t_f *nrecords,
-                  size_t_f *type_size,
-                  size_t_f *field_offset,
-                  hid_t_f *field_types,
-                  hsize_t_f *chunk_size,
-                  int_f *compress,
-                  size_t_f *char_len_field_names, /* field_names lenghts */
-                  size_t_f *max_char_size_field_names, /* char len of fields */
-                  char *field_names)            /* field_names */
+h5tbmake_table_c(size_t_f *namelen1, _fcd name1, hid_t_f *loc_id, size_t_f *namelen, _fcd name,
+		 hsize_t_f *nfields, hsize_t_f *nrecords, size_t_f *type_size, size_t_f *field_offset,
+		 hid_t_f *field_types, hsize_t_f *chunk_size, int_f *compress,
+		 size_t_f *char_len_field_names, /* field_names lenghts */
+		 size_t_f *max_char_size_field_names, /* char len of fields */
+		 char *field_names)            /* field_names */
 {
     char *c_name = NULL;
     char *c_name1 = NULL;
@@ -101,7 +90,6 @@ h5tbmake_table_c(size_t_f *namelen1,
             HGOTO_DONE(FAIL)
         HDmemcpy(c_field_names[i], tmp_p, (size_t)char_len_field_names[i]);
         c_field_names[i][char_len_field_names[i]] = '\0';
-
         tmp_p = tmp_p + *max_char_size_field_names;
     } /* end for */
 
@@ -136,6 +124,177 @@ done:
 } /* end h5tbmake_table_c() */
 
 /*-------------------------------------------------------------------------
+* Function: h5tbmake_table_ptr_c
+*
+* Purpose: Call H5TBmake_table using F2003 features
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: M. Scot Breitenfeld
+*
+* Date: Sept. 10, 2015
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
+int_f
+h5tbmake_table_ptr_c(size_t_f *namelen1, _fcd name1, hid_t_f *loc_id, size_t_f *namelen,
+		     _fcd name, hsize_t_f *nfields, hsize_t_f *nrecords, size_t_f *type_size,
+		     size_t_f *field_offset, hid_t_f *field_types, hsize_t_f *chunk_size,
+		     void *fill_data, int_f *compress, 
+		     size_t_f *char_len_field_names, /* field_names lenghts */
+		     size_t_f *max_char_size_field_names, /* char len of fields */
+		     char *field_names,
+		     void *data)            /* field_names */
+{
+    char *c_name = NULL;
+    char *c_name1 = NULL;
+    hsize_t num_elem;
+    hsize_t i;
+    hsize_t c_nfields = (hsize_t)*nfields;
+    size_t *c_field_offset = NULL;
+    hid_t *c_field_types = NULL;
+    char **c_field_names = NULL;
+    char *tmp = NULL, *tmp_p;
+    int_f ret_value = 0;
+
+    num_elem = (hsize_t)*nfields;
+
+    /*
+     * convert FORTRAN name to C name
+     */
+    if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
+        HGOTO_DONE(FAIL)
+    if(NULL == (c_name1 = (char *)HD5f2cstring(name1, (size_t)*namelen1)))
+        HGOTO_DONE(FAIL)
+    if(NULL == (c_field_offset = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+        HGOTO_DONE(FAIL)
+    if(NULL == (c_field_types = (hid_t *)HDmalloc(sizeof(hid_t) * (size_t)c_nfields)))
+        HGOTO_DONE(FAIL)
+
+    for(i = 0; i < num_elem; i++) {
+      c_field_offset[i] = (size_t)field_offset[i];
+        c_field_types[i] = field_types[i];
+    } /* end for */
+
+    /*
+     * allocate array of character pointers
+     */
+    if(NULL == (c_field_names = (char **)HDcalloc((size_t)num_elem, sizeof(char *))))
+        HGOTO_DONE(FAIL)
+
+    /* copy data to long C string */
+    if(NULL == (tmp = (char *)HD5f2cstring(field_names, (size_t)*(max_char_size_field_names)*(size_t)num_elem)))
+        HGOTO_DONE(FAIL)
+    /*
+     * move data from temorary buffer
+     */
+    tmp_p = tmp;
+    for(i = 0; i < num_elem; i++) {
+        if(NULL == (c_field_names[i] = (char *)HDmalloc((size_t)char_len_field_names[i] + 1)))
+            HGOTO_DONE(FAIL)
+        HDmemcpy(c_field_names[i], tmp_p, (size_t)char_len_field_names[i]);
+        c_field_names[i][char_len_field_names[i]] = '\0';
+        tmp_p = tmp_p + *max_char_size_field_names;
+    } /* end for */
+
+    /*
+     * call H5TBmake_table function.
+     */
+    if(H5TBmake_table(c_name1, (hid_t)*loc_id, c_name, c_nfields, (hsize_t)*nrecords,
+            (size_t)*type_size, (const char **)c_field_names, c_field_offset, c_field_types,
+            (hsize_t)*chunk_size, fill_data, *compress, data) < 0)
+        HGOTO_DONE(FAIL)
+
+done:
+    if(c_name)
+        HDfree(c_name);
+    if(c_name1)
+        HDfree(c_name1);
+    if(c_field_names) {
+        for(i = 0; i < num_elem; i++) {
+            if(c_field_names[i])
+                HDfree(c_field_names[i]);
+        } /* end for */
+        HDfree(c_field_names);
+    } /* end if */
+    if(tmp)
+        HDfree(tmp);
+    if(c_field_offset)
+        HDfree(c_field_offset);
+    if(c_field_types)
+        HDfree(c_field_types);
+
+    return ret_value;
+} /* end h5tbmake_table_c() */
+
+
+/*-------------------------------------------------------------------------
+* Function: h5tbread_table_c
+*
+* Purpose: Call H5TBread_table using F2003 features 
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: M. Scot Breitenfeld
+*
+* Date: Sept. 14, 2015
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
+int_f
+h5tbread_table_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hsize_t_f *nfields,
+		 size_t_f *dst_size, size_t_f *dst_offset, size_t_f *dst_sizes, void *dst_buf)
+{
+    char *c_name = NULL;
+    size_t *c_dst_offset = NULL;
+    size_t *c_dst_sizes = NULL;
+    hsize_t c_nfields = (hsize_t)*nfields;
+    int_f ret_value = 0;
+    hsize_t i;
+
+    /*
+     * convert FORTRAN name to C name
+     */
+    if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
+        HGOTO_DONE(FAIL)
+	  
+    if(NULL == (c_dst_offset = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+        HGOTO_DONE(FAIL)
+    if(NULL == (c_dst_sizes = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+        HGOTO_DONE(FAIL)
+
+    for(i = 0; i < c_nfields; i++) {
+      c_dst_offset[i] = (size_t)dst_offset[i];
+      c_dst_sizes[i] = (size_t)dst_sizes[i];
+    } /* end for */	  
+
+    /*
+     * call H5TBread_table function.
+     */
+    if(H5TBread_table( (hid_t)*loc_id, c_name, (size_t)*dst_size, c_dst_offset,
+		       c_dst_sizes, dst_buf) < 0)
+        HGOTO_DONE(FAIL)
+
+done:
+    if(c_name)
+        HDfree(c_name);
+
+    if(c_dst_offset)
+        HDfree(c_dst_offset);
+    if(c_dst_sizes)
+        HDfree(c_dst_sizes);
+
+    return ret_value;
+} /* end h5tbmake_table_c() */
+
+
+
+
+/*-------------------------------------------------------------------------
 * Function: h5tbwrite_field_name_c
 *
 * Purpose: Call H5TBwrite_fields_name
@@ -151,15 +310,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbwrite_field_name_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)
+h5tbwrite_field_name_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)
 {
     char   *c_name = NULL;
     char   *c_name1 = NULL;
@@ -207,15 +359,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbread_field_name_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)
+h5tbread_field_name_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)
 {
     char   *c_name = NULL;
     char   *c_name1 = NULL;
@@ -262,14 +407,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbwrite_field_index_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)
+h5tbwrite_field_index_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)
 {
     char   *c_name =  NULL;
     size_t  c_type_size  = *type_size;
@@ -313,14 +452,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbread_field_index_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)
+h5tbread_field_index_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)
 {
     char   *c_name = NULL;
     size_t  c_type_size  = *type_size;
@@ -363,14 +496,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbinsert_field_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)
+h5tbinsert_field_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)
 {
     char   *c_name = NULL;
     char   *c_name1 = NULL;
@@ -416,11 +543,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbdelete_field_c(hid_t_f *loc_id,
-                    size_t_f *namelen,
-                    _fcd name,
-                    size_t_f *namelen1,
-                    _fcd field_name)
+h5tbdelete_field_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name,
+		   size_t_f *namelen1, _fcd field_name)
 {
     char   *c_name = NULL;
     char   *c_name1 = NULL;
@@ -465,11 +589,8 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbget_table_info_c(hid_t_f *loc_id,
-                      size_t_f *namelen,
-                      _fcd name,
-                      hsize_t_f *nfields,
-                      hsize_t_f *nrecords)
+h5tbget_table_info_c(hid_t_f *loc_id, size_t_f *namelen,
+		     _fcd name, hsize_t_f *nfields, hsize_t_f *nrecords)
 {
     char   *c_name = NULL;
     hsize_t c_nfields;
@@ -515,17 +636,12 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-h5tbget_field_info_c(hid_t_f *loc_id,
-                      size_t_f *namelen,
-                      _fcd name,
-                      hsize_t_f *nfields,
-                      size_t_f *field_sizes,
-                      size_t_f *field_offsets,
-                      size_t_f *type_size,
-                      size_t_f *namelen2,       /* field_names lenghts */
-                      size_t_f *lenmax,         /* character len max */
-                      _fcd field_names,      /* field_names */
-                      size_t_f *maxlen_out)
+h5tbget_field_info_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, hsize_t_f *nfields,
+		     size_t_f *field_sizes, size_t_f *field_offsets, size_t_f *type_size,
+		     size_t_f *namelen2,       /* field_names lenghts */
+		     size_t_f *lenmax,         /* character len max */
+		     _fcd field_names,      /* field_names */
+		     size_t_f *maxlen_out)
 
 {
     char   *c_name = NULL;
diff --git a/hl/fortran/src/H5TBff.F90 b/hl/fortran/src/H5TBff.F90
index 448d607..2575b24 100644
--- a/hl/fortran/src/H5TBff.F90
+++ b/hl/fortran/src/H5TBff.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
@@ -63,6 +61,11 @@ MODULE h5tb_CONST
      MODULE PROCEDURE h5tbinsert_field_f_string
   END INTERFACE
 
+  INTERFACE h5tbmake_table_f
+     MODULE PROCEDURE h5tbmake_table_f90
+     MODULE PROCEDURE h5tbmake_table_ptr_f
+  END INTERFACE
+
   INTERFACE
      INTEGER FUNCTION h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
           start,nrecords,type_size,buf) &
@@ -163,7 +166,7 @@ MODULE h5tb_CONST
 CONTAINS
 
 !-------------------------------------------------------------------------
-! Function: h5tbmake_table_f
+! Function: h5tbmake_table_f90
 !
 ! Purpose: Make a table
 !
@@ -179,7 +182,7 @@ CONTAINS
 !
 !-------------------------------------------------------------------------
 
-  SUBROUTINE h5tbmake_table_f(table_title,&
+  SUBROUTINE h5tbmake_table_f90(table_title,&
        loc_id,&
        dset_name,&
        nfields,&
@@ -259,23 +262,162 @@ CONTAINS
     
     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
+    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_f90
+
+  SUBROUTINE h5tbmake_table_ptr_f(table_title,&
+       loc_id,&
+       dset_name,&
+       nfields,&
+       nrecords,&
+       type_size,&
+       field_names,&
+       field_offset,&
+       field_types,&
+       chunk_size,&
+       fill_data,&
+       compress,&
+       data,&
+       errcode )
+
+    USE ISO_C_BINDING
+    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
+    TYPE(C_PTR), INTENT(in) :: fill_data                             ! Fill values data
+    INTEGER,          INTENT(in) :: compress                         ! compress
+    TYPE(C_PTR), INTENT(in) :: data                                  ! Buffer with data to be written to the table
+    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_ptr_c(namelen1,&
+            table_title,&
+            loc_id,&
+            namelen,&
+            dset_name,&
+            nfields,&
+            nrecords,&
+            type_size,&
+            field_offset,&
+            field_types,&
+            chunk_size,&
+            fill_data,&
+            compress,&
+            char_len_field_names,&
+            max_char_size_field_names,&
+            field_names,&
+            data) &
+            BIND(C,NAME='h5tbmake_table_ptr_c')
+         IMPORT :: C_CHAR, C_PTR
+         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
+         TYPE(C_PTR), INTENT(in), VALUE :: fill_data                      ! Fill values data
+         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
+         TYPE(C_PTR), INTENT(in), VALUE :: data
+       END FUNCTION h5tbmake_table_ptr_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_ptr_c(namelen1, table_title, loc_id, namelen, dset_name, nfields, nrecords,&
+         type_size, field_offset, field_types, chunk_size, fill_data, compress, char_len_field_names, &
+         max_char_size_field_names, field_names, data)
+
+  END SUBROUTINE h5tbmake_table_ptr_f
+
+  SUBROUTINE h5tbread_table_f(loc_id, table_name, nfields, dst_size, dst_offset, &
+       dst_sizes, dst_buf, errcode)
+
+    USE ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                            ! An array containing the sizes of the fields
+    CHARACTER(LEN=*), INTENT(in) :: table_name                        ! The name of the dataset to read
+    INTEGER(hsize_t), INTENT(in) :: nfields                           ! number of fields
+    INTEGER(size_t),  INTENT(in) :: dst_size                          ! The size of the structure type
+    INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: dst_offset  ! An array containing the offsets of the fields
+    INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: dst_sizes   ! An array containing the sizes of the fields
+    TYPE(C_PTR)                                        :: dst_buf     ! Buffer with data !! do not use INTENT, causes NAG
+                                                                      ! to segfault in C APIs
+    INTEGER :: errcode                                                ! error code
+
+    INTEGER(size_t) :: namelen                                        ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5tbread_table_c(loc_id,&
+            table_name,&
+            namelen,&
+            nfields,&
+            dst_size,&
+            dst_offset, &
+            dst_sizes, &
+            dst_buf) &
+            BIND(C,NAME='h5tbread_table_c')
+         IMPORT :: C_PTR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                    ! file or group identifier
+         CHARACTER(LEN=1), INTENT(in) :: table_name                ! name of the dataset
+         INTEGER(hsize_t), INTENT(in) :: nfields 
+         INTEGER(size_t),  INTENT(in) :: dst_size                  ! type size
+         INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: dst_offset  ! An array containing the sizes of the fields
+         INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: dst_sizes   ! An array containing the sizes of the fields
+         INTEGER(size_t) :: namelen                                ! name length
+         TYPE(C_PTR), VALUE :: dst_buf
+
+       END FUNCTION h5tbread_table_c
+    END INTERFACE
+ 
+    namelen = LEN(table_name)
+
+    errcode = h5tbread_table_c(loc_id,&
+         table_name,&
+         namelen, &
+         nfields, &
+         dst_size,&
+         dst_offset, &
+         dst_sizes, &
+         dst_buf)
+
+
+  END SUBROUTINE h5tbread_table_f
 
 !-------------------------------------------------------------------------
 ! Function: h5tbwrite_field_name_f_int
diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am
index 571ca45..a495e22 100644
--- a/hl/fortran/src/Makefile.am
+++ b/hl/fortran/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 ##
 ## Makefile.am
@@ -86,8 +84,6 @@ H5LTff_gen.F90: 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.
 
diff --git a/hl/fortran/src/Makefile.in b/hl/fortran/src/Makefile.in
index 6294ae8..311d8da 100644
--- a/hl/fortran/src/Makefile.in
+++ b/hl/fortran/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 #
 # HDF5 High-Level Fortran Makefile(.in)
@@ -492,6 +490,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -613,6 +612,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -758,32 +758,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -807,26 +802,26 @@ libhdf5hl_fortran_la_SOURCES = H5DSfc.c H5LTfc.c H5IMfc.c H5IMcc.c H5TBfc.c \
 # 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -939,22 +934,25 @@ distclean-compile:
 	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
 
 .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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1339,19 +1337,6 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # Fortran module files can have different extensions and different names
 # (e.g., different capitalizations) on different platforms.  Write rules
 # for them explicitly rather than trying to teach automake about them.
@@ -1395,12 +1380,13 @@ 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) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1408,7 +1394,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/fortran/src/hdf5_hl_fortrandll.def.in b/hl/fortran/src/hdf5_hl_fortrandll.def.in
index 9a1231a..b48cae3 100644
--- a/hl/fortran/src/hdf5_hl_fortrandll.def.in
+++ b/hl/fortran/src/hdf5_hl_fortrandll.def.in
@@ -72,7 +72,9 @@ 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_H5TBREAD_TABLE_F
+H5TB_CONST_mp_H5TBMAKE_TABLE_F90
+H5TB_CONST_mp_H5TBMAKE_TABLE_PTR_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
diff --git a/hl/fortran/test/CMakeLists.txt b/hl/fortran/test/CMakeLists.txt
index fc703dc..3138173 100644
--- a/hl/fortran/test/CMakeLists.txt
+++ b/hl/fortran/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_FORTRAN_TESTS C CXX Fortran)
 
 #-----------------------------------------------------------------------------
@@ -25,13 +25,13 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/hl/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-- Adding test for hl_f90_tstlite
 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})
+target_link_libraries (hl_f90_tstlite ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET} ${HDF5_F90_TEST_LIB_TARGET})
 target_include_directories (hl_f90_tstlite PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (hl_f90_tstlite PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tstlite PROPERTIES FOLDER test/hl/fortran)
@@ -39,14 +39,14 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   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})
+  target_link_libraries (hl_f90_tstlite-shared ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET} ${HDF5_F90_TEST_LIBSH_TARGET})
   target_include_directories (hl_f90_tstlite-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (hl_f90_tstlite-shared PROPERTIES
         LINKER_LANGUAGE Fortran
         FOLDER test/hl/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-- Adding test for hl_f90_tstimage
 add_executable (hl_f90_tstimage tstimage.F90)
@@ -67,13 +67,13 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/hl/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 #-- Adding test for hl_f90_tsttable
 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})
+target_link_libraries (hl_f90_tsttable ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET} ${HDF5_F90_TEST_LIB_TARGET})
 target_include_directories (hl_f90_tsttable PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 set_target_properties (hl_f90_tsttable PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tsttable PROPERTIES FOLDER test/hl/fortran)
@@ -81,13 +81,13 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   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})
+  target_link_libraries (hl_f90_tsttable-shared ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET} ${HDF5_F90_TEST_LIBSH_TARGET})
   target_include_directories (hl_f90_tsttable-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (hl_f90_tsttable-shared PROPERTIES
         LINKER_LANGUAGE Fortran
         FOLDER test/hl/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
 
 include (CMakeTests.cmake)
diff --git a/hl/fortran/test/CMakeTests.cmake b/hl/fortran/test/CMakeTests.cmake
index 499e255..90cc3a3 100644
--- a/hl/fortran/test/CMakeTests.cmake
+++ b/hl/fortran/test/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -17,19 +28,72 @@ add_test (
         dsetf5.h5
         f1img.h5
         f1tab.h5
+        f2tab.h5
         tstds.h5
 )
 
-add_test (NAME HL_FORTRAN_f90_tstds COMMAND $<TARGET_FILE:hl_f90_tstds>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME HL_FORTRAN_f90_tstds COMMAND $<TARGET_FILE:hl_f90_tstds>)
+else ()
+  add_test (NAME HL_FORTRAN_f90_tstds COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstds>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=hl_f90_tstds.txt"
+      #-D "TEST_REFERENCE=hl_f90_tstds.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (HL_FORTRAN_f90_tstds PROPERTIES DEPENDS HL_FORTRAN_test-clear-objects)
 
-add_test (NAME HL_FORTRAN_f90_tstlite COMMAND $<TARGET_FILE:hl_f90_tstlite>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME HL_FORTRAN_f90_tstlite COMMAND $<TARGET_FILE:hl_f90_tstlite>)
+else ()
+  add_test (NAME HL_FORTRAN_f90_tstlite COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstlite>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=hl_f90_tstlite.txt"
+      #-D "TEST_REFERENCE=hl_f90_tstlite.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (HL_FORTRAN_f90_tstlite PROPERTIES DEPENDS HL_FORTRAN_test-clear-objects)
 
-add_test (NAME HL_FORTRAN_f90_tstimage COMMAND $<TARGET_FILE:hl_f90_tstimage>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME HL_FORTRAN_f90_tstimage COMMAND $<TARGET_FILE:hl_f90_tstimage>)
+else ()
+  add_test (NAME HL_FORTRAN_f90_tstimage COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstimage>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=hl_f90_tstimage.txt"
+      #-D "TEST_REFERENCE=hl_f90_tstimage.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (HL_FORTRAN_f90_tstimage PROPERTIES DEPENDS HL_FORTRAN_test-clear-objects)
 
-add_test (NAME HL_FORTRAN_f90_tsttable COMMAND $<TARGET_FILE:hl_f90_tsttable>)
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME HL_FORTRAN_f90_tsttable COMMAND $<TARGET_FILE:hl_f90_tsttable>)
+else ()
+  add_test (NAME HL_FORTRAN_f90_tsttable COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tsttable>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=hl_f90_tsttable.txt"
+      #-D "TEST_REFERENCE=hl_f90_tsttable.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
 set_tests_properties (HL_FORTRAN_f90_tsttable PROPERTIES DEPENDS HL_FORTRAN_test-clear-objects)
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
@@ -44,21 +108,74 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
           dsetf5.h5
           f1img.h5
           f1tab.h5
+          f2tab.h5
           tstds.h5
   )
   set_tests_properties (HL_FORTRAN_test-shared-clear-objects
       PROPERTIES DEPENDS "HL_FORTRAN_f90_tsttable;HL_FORTRAN_f90_tstimage;HL_FORTRAN_f90_tstlite;HL_FORTRAN_f90_tstds"
   )
 
-  add_test (NAME HL_FORTRAN_f90_tstds-shared COMMAND $<TARGET_FILE:hl_f90_tstds-shared>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_FORTRAN_f90_tstds-shared COMMAND $<TARGET_FILE:hl_f90_tstds-shared>)
+  else ()
+    add_test (NAME HL_FORTRAN_f90_tstds-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstds-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_f90_tstds-shared.txt"
+        #-D "TEST_REFERENCE=hl_f90_tstds-shared.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (HL_FORTRAN_f90_tstds-shared PROPERTIES DEPENDS HL_FORTRAN_test-shared-clear-objects)
 
-  add_test (NAME HL_FORTRAN_f90_tstlite-shared COMMAND $<TARGET_FILE:hl_f90_tstlite-shared>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_FORTRAN_f90_tstlite-shared COMMAND $<TARGET_FILE:hl_f90_tstlite-shared>)
+  else ()
+    add_test (NAME HL_FORTRAN_f90_tstlite-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstlite-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_f90_tstlite-shared.txt"
+        #-D "TEST_REFERENCE=hl_f90_tstlite-shared.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (HL_FORTRAN_f90_tstlite-shared PROPERTIES DEPENDS HL_FORTRAN_test-shared-clear-objects)
 
-  add_test (NAME HL_FORTRAN_f90_tstimage-shared COMMAND $<TARGET_FILE:hl_f90_tstimage-shared>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_FORTRAN_f90_tstimage-shared COMMAND $<TARGET_FILE:hl_f90_tstimage-shared>)
+  else ()
+    add_test (NAME HL_FORTRAN_f90_tstimage-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tstimage-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_f90_tstimage-shared.txt"
+        #-D "TEST_REFERENCE=hl_f90_tstimage-shared.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (HL_FORTRAN_f90_tstimage-shared PROPERTIES DEPENDS HL_FORTRAN_test-shared-clear-objects)
 
-  add_test (NAME HL_FORTRAN_f90_tsttable-shared COMMAND $<TARGET_FILE:hl_f90_tsttable-shared>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_FORTRAN_f90_tsttable-shared COMMAND $<TARGET_FILE:hl_f90_tsttable-shared>)
+  else ()
+    add_test (NAME HL_FORTRAN_f90_tsttable-shared COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_f90_tsttable-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_f90_tsttable-shared.txt"
+        #-D "TEST_REFERENCE=hl_f90_tsttable-shared.out"
+        -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (HL_FORTRAN_f90_tsttable-shared PROPERTIES DEPENDS HL_FORTRAN_test-shared-clear-objects)
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endif ()
diff --git a/hl/fortran/test/Makefile.am b/hl/fortran/test/Makefile.am
index ca49817..ba672aa 100644
--- a/hl/fortran/test/Makefile.am
+++ b/hl/fortran/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 ##
 ## Makefile.am
@@ -22,7 +20,7 @@
 include $(top_srcdir)/config/commence.am
 
 AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/hl/src
-AM_FCFLAGS+=-I$(top_builddir)/fortran/src -I$(top_builddir)/hl/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
+AM_FCFLAGS+=-I$(top_builddir)/fortran/src -I$(top_builddir)/hl/fortran/src -I$(top_builddir)/fortran/test $(F9XMODFLAG)$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/test $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # need to make sure the Fortran programs link against the static version
@@ -36,7 +34,9 @@ endif
 TEST_PROG=tstds tstlite tstimage tsttable
 check_PROGRAMS=$(TEST_PROG)
 
-LDADD= $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5)
+LIBOBJS=$(top_builddir)/fortran/test/tf_gen.o
+
+LDADD=$(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5) 
 
 # Source files for the programs
 tstds_SOURCES=tstds.F90
@@ -45,7 +45,30 @@ tstimage_SOURCES=tstimage.F90
 tsttable_SOURCES=tsttable.F90
 
 # Temporary files.
-CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f1tab.h5 tstds.h5
+CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f[1-2]tab.h5 tstds.h5
+
+# Fortran module files can have different extensions and different names
+# (e.g., different capitalizations) on different platforms.  Write rules
+# for them explicitly rather than trying to teach automake about them.
+# They should be installed as headers and removed during clean.
+maintainer-clean-local: clean-local
+distclean-local: clean-local
+clean-local:
+	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
+	  $(RM) *.$(F9XMODEXT); \
+	fi
+
+install-data-local:
+	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
+	  $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(DESTDIR)$(includedir)/. ; \
+	fi
+
+uninstall-local:
+	@if test -n "$(F9XMODEXT)" -a "X$(F9XMODEXT)" != "Xo"; then      \
+	  if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(DESTDIR)$(includedir)/HDF5.$(F9XMODEXT)"; then \
+	    set -x; $(RM) $(includedir)/*.$(F9XMODEXT);                 \
+	  fi;                                                           \
+	fi
 
 # Mark this directory as part of the Fortran API (this affects output
 # from tests in conclude.am)
diff --git a/hl/fortran/test/Makefile.in b/hl/fortran/test/Makefile.in
index e30836c..6782406 100644
--- a/hl/fortran/test/Makefile.in
+++ b/hl/fortran/test/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 #
 # HDF5 High-Level Fortran Makefile(.in)
@@ -148,7 +146,8 @@ am__EXEEXT_1 = tstds$(EXEEXT) tstlite$(EXEEXT) tstimage$(EXEEXT) \
 am_tstds_OBJECTS = tstds.$(OBJEXT)
 tstds_OBJECTS = $(am_tstds_OBJECTS)
 tstds_LDADD = $(LDADD)
-tstds_DEPENDENCIES = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) $(LIBHDF5)
+tstds_DEPENDENCIES = $(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) \
+	$(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
@@ -156,15 +155,18 @@ am__v_lt_1 =
 am_tstimage_OBJECTS = tstimage.$(OBJEXT)
 tstimage_OBJECTS = $(am_tstimage_OBJECTS)
 tstimage_LDADD = $(LDADD)
-tstimage_DEPENDENCIES = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) $(LIBHDF5)
+tstimage_DEPENDENCIES = $(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) \
+	$(LIBHDF5)
 am_tstlite_OBJECTS = tstlite.$(OBJEXT)
 tstlite_OBJECTS = $(am_tstlite_OBJECTS)
 tstlite_LDADD = $(LDADD)
-tstlite_DEPENDENCIES = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) $(LIBHDF5)
+tstlite_DEPENDENCIES = $(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) \
+	$(LIBHDF5)
 am_tsttable_OBJECTS = tsttable.$(OBJEXT)
 tsttable_OBJECTS = $(am_tsttable_OBJECTS)
 tsttable_LDADD = $(LDADD)
-tsttable_DEPENDENCIES = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) $(LIBHDF5)
+tsttable_DEPENDENCIES = $(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) \
+	$(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
@@ -441,7 +443,9 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
 	-I$(top_builddir)/hl/fortran/src \
+	-I$(top_builddir)/fortran/test \
 	$(F9XMODFLAG)$(top_builddir)/fortran/src \
+	$(F9XMODFLAG)$(top_builddir)/fortran/test \
 	$(F9XMODFLAG)$(top_builddir)/hl/fortran/src
 AM_JAVACFLAGS = @AM_JAVACFLAGS@
 AM_JAVAFLAGS = @AM_JAVAFLAGS@
@@ -475,6 +479,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -553,7 +558,7 @@ JNIFLAGS = @JNIFLAGS@
 JUNIT = @JUNIT@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
+LIBOBJS = $(top_builddir)/fortran/test/tf_gen.o
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
@@ -596,6 +601,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -743,11 +749,11 @@ TRACE = perl $(top_srcdir)/bin/trace
 
 # Temporary files.
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 dsetf[1-5].h5 \
-	f1img.h5 f1tab.h5 tstds.h5
+	f1img.h5 f[1-2]tab.h5 tstds.h5
 
 # Our main target, the test programs
 TEST_PROG = tstds tstlite tstimage tsttable
-LDADD = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5)
+LDADD = $(LIBOBJS) $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5) 
 
 # Source files for the programs
 tstds_SOURCES = tstds.F90
@@ -761,18 +767,20 @@ 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.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1154,13 +1162,13 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
 	mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
+	distclean-local distclean-tags
 
 dvi: dvi-am
 
@@ -1174,7 +1182,7 @@ info: info-am
 
 info-am:
 
-install-data-am:
+install-data-am: install-data-local
 
 install-dvi: install-dvi-am
 
@@ -1204,7 +1212,8 @@ installcheck-am:
 
 maintainer-clean: maintainer-clean-am
 	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+	maintainer-clean-local
 
 mostlyclean: mostlyclean-am
 
@@ -1219,23 +1228,25 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am:
+uninstall-am: 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-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
+	clean-local 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-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 uninstall-local
 
 .PRECIOUS: Makefile
 
@@ -1251,14 +1262,38 @@ uninstall-am:
 help:
 	@$(top_srcdir)/bin/makehelp
 
+# Fortran module files can have different extensions and different names
+# (e.g., different capitalizations) on different platforms.  Write rules
+# for them explicitly rather than trying to teach automake about them.
+# They should be installed as headers and removed during clean.
+maintainer-clean-local: clean-local
+distclean-local: clean-local
+clean-local:
+	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
+	  $(RM) *.$(F9XMODEXT); \
+	fi
+
+install-data-local:
+	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
+	  $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(DESTDIR)$(includedir)/. ; \
+	fi
+
+uninstall-local:
+	@if test -n "$(F9XMODEXT)" -a "X$(F9XMODEXT)" != "Xo"; then      \
+	  if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(DESTDIR)$(includedir)/HDF5.$(F9XMODEXT)"; then \
+	    set -x; $(RM) $(includedir)/*.$(F9XMODEXT);                 \
+	  fi;                                                           \
+	fi
+
 # Treat all .f90 and .F90 files as preprocessed Fortran.
 .f90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 .F90.o:
-	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+	$(PPFCCOMPILE) -c -o $@ $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1266,7 +1301,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/fortran/test/tstds.F90 b/hl/fortran/test/tstds.F90
index cbf6c38..387f524 100644
--- a/hl/fortran/test/tstds.F90
+++ b/hl/fortran/test/tstds.F90
@@ -5,32 +5,64 @@
 ! *                                                                           *
 ! * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 ! * terms governing use, modification, and redistribution, is contained in    *
-! * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-! * of the source code distribution tree; Copyright.html can be found at the  *
-! * root level of an installed copy of the electronic HDF5 document set and   *
-! * is linked from the top-level documents page.  It can also be found at     *
-! * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-! * access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-PROGRAM test_ds
+
+MODULE TSTDS
+
+CONTAINS
+
+!-------------------------------------------------------------------------
+! test_begin
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_begin(string)
+  CHARACTER(LEN=*), INTENT(IN) :: string
+  WRITE(*, fmt = '(A)', advance = 'no') ADJUSTL(string)
+END SUBROUTINE test_begin
+
+!-------------------------------------------------------------------------
+! passed/failed
+!-------------------------------------------------------------------------
+SUBROUTINE write_test_status( test_result)
+
+! Writes the results of the tests
 
   IMPLICIT NONE
 
-  INTEGER :: err
+  INTEGER, INTENT(IN) :: test_result  ! negative,   failed
+                                      ! 0       ,   passed
 
-  CALL test_testds(err)
+! Controls the output style for reporting test results
 
-  IF(err.LT.0)THEN
-     WRITE(*,'(5X,A)') "DIMENSION SCALES TEST *FAILED*"
+  CHARACTER(LEN=8) :: error_string
+  CHARACTER(LEN=8), PARAMETER :: success = ' PASSED '
+  CHARACTER(LEN=8), PARAMETER :: failure = '*FAILED*'
+
+  error_string = failure
+  IF (test_result .EQ.  0) THEN
+     error_string = success
   ENDIF
+  
+  WRITE(*, fmt = '(T34, A)') error_string
 
-END PROGRAM test_ds
+END SUBROUTINE write_test_status
+
+END MODULE TSTDS
+
+MODULE TSTDS_TESTS
+
+CONTAINS
 
 SUBROUTINE test_testds(err)
 
   USE HDF5
   USE H5LT
   USE H5DS
+  USE TSTDS ! module for testing dataset support routines
 
   IMPLICIT NONE
 
@@ -44,7 +76,6 @@ SUBROUTINE test_testds(err)
 
   CHARACTER(LEN=6), PARAMETER :: DSET_NAME = "Mydata"
   CHARACTER(LEN=5), PARAMETER :: DS_1_NAME = "Yaxis"
-  CHARACTER(LEN=5), PARAMETER :: DS_1_NAME_A = "Yaxiz"
   CHARACTER(LEN=5), PARAMETER :: DS_2_NAME = "Xaxis"
 
 
@@ -316,38 +347,21 @@ SUBROUTINE test_testds(err)
 
 END SUBROUTINE test_testds
 
-!-------------------------------------------------------------------------
-! test_begin
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_begin(string)
-  CHARACTER(LEN=*), INTENT(IN) :: string
-  WRITE(*, fmt = '(A)', advance = 'no') ADJUSTL(string)
-END SUBROUTINE test_begin
+END MODULE TSTDS_TESTS
 
-!-------------------------------------------------------------------------
-! passed/failed
-!-------------------------------------------------------------------------
-SUBROUTINE write_test_status( test_result)
-
-! Writes the results of the tests
+PROGRAM test_ds
 
+  USE TSTDS_TESTS ! module for testing dataset routines
+  
   IMPLICIT NONE
 
-  INTEGER, INTENT(IN) :: test_result  ! negative,   failed
-                                      ! 0       ,   passed
-
-! Controls the output style for reporting test results
+  INTEGER :: err
 
-  CHARACTER(LEN=8) :: error_string
-  CHARACTER(LEN=8), PARAMETER :: success = ' PASSED '
-  CHARACTER(LEN=8), PARAMETER :: failure = '*FAILED*'
+  CALL test_testds(err)
 
-  error_string = failure
-  IF (test_result .EQ.  0) THEN
-     error_string = success
+  IF(err.LT.0)THEN
+     WRITE(*,'(5X,A)') "DIMENSION SCALES TEST *FAILED*"
   ENDIF
-  
-  WRITE(*, fmt = '(T34, A)') error_string
 
-END SUBROUTINE write_test_status
+END PROGRAM test_ds
+
diff --git a/hl/fortran/test/tstimage.F90 b/hl/fortran/test/tstimage.F90
index 0bff6b2..d6bd1e2 100644
--- a/hl/fortran/test/tstimage.F90
+++ b/hl/fortran/test/tstimage.F90
@@ -5,24 +5,44 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   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 image_test
+MODULE TSTIMAGE
 
-call make_image1()
+CONTAINS
 
-end program image_test
+!-------------------------------------------------------------------------
+! 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
+
+END MODULE TSTIMAGE
+
+
+MODULE TSTIMAGE_TESTS
 
+CONTAINS
 
 !-------------------------------------------------------------------------
 ! make_image1
@@ -32,6 +52,7 @@ subroutine make_image1()
 
 use h5im ! module of H5IM
 use hdf5 ! module of HDF5 library
+USE TSTIMAGE ! module for testing image support routines
 
 implicit none
 
@@ -320,20 +341,17 @@ call h5close_f(errcode)
 !
 end subroutine make_image1
 
-!-------------------------------------------------------------------------
-! test_begin
-!-------------------------------------------------------------------------
+END MODULE TSTIMAGE_TESTS
 
-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
-!-------------------------------------------------------------------------
+program image_test
+
+USE TSTIMAGE_TESTS ! module for testing dataset routines
+
+IMPLICIT NONE
+
+call make_image1()
+
+end program image_test
+
 
-subroutine passed()
-write(*, fmt = '(6a)')  'PASSED'
-end subroutine passed
diff --git a/hl/fortran/test/tstlite.F90 b/hl/fortran/test/tstlite.F90
index 081e61e..673807b 100644
--- a/hl/fortran/test/tstlite.F90
+++ b/hl/fortran/test/tstlite.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
@@ -18,1818 +16,1904 @@
 !
 #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()
+MODULE TSTLITE
 
-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
-  
+  USE TH5_MISC_GEN
   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)
+
+CONTAINS
 
   !-------------------------------------------------------------------------
-  ! H5T_NATIVE_INTEGER
+  ! test_begin
   !-------------------------------------------------------------------------
 
-  !
-  ! 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
+  SUBROUTINE test_begin(string)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: string
+    WRITE(*, fmt = '(14a)', advance = 'no') string
+    WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
+  END SUBROUTINE test_begin
 
   !-------------------------------------------------------------------------
-  ! H5T_NATIVE_REAL
+  ! passed
   !-------------------------------------------------------------------------
 
-  !
-  ! 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
+  SUBROUTINE passed()
+    IMPLICIT NONE
+    WRITE(*, fmt = '(6a)')  'PASSED'
+  END SUBROUTINE passed
 
-  !-------------------------------------------------------------------------
-  ! H5T_NATIVE_DOUBLE
-  !-------------------------------------------------------------------------
+END MODULE TSTLITE
 
-  !
-  ! 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()
+MODULE TSTLITE_TESTS
 
   USE, INTRINSIC :: ISO_C_BINDING
-  USE H5LT ! module of H5LT
-  USE HDF5 ! module of HDF5 library
-
+  USE H5LT    ! module of H5LT
+  USE HDF5    ! module of HDF5 library
+  USE TSTLITE ! module for testing lite support routines
   IMPLICIT NONE
 
+CONTAINS
 
-  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
+  ! test_dataset1D
   !-------------------------------------------------------------------------
 
-  !
-  ! 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
+  SUBROUTINE test_dataset1D()
+
+    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
+       CALL VERIFY("h5ltread_dataset_f",buf1(i), bufr1(i), errcode)
+       IF (errcode .NE.0 ) 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
+       CALL VERIFY("h5ltread_dataset_f",buf2(i), bufr2(i), errcode)
+       IF (errcode .NE.0 ) 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
+       CALL VERIFY("h5ltread_dataset_f",buf3(i), bufr3(i), errcode)
+       IF (errcode .NE.0 ) 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
 
   !-------------------------------------------------------------------------
-  ! H5T_NATIVE_INT 2D buffer
+  ! test_dataset2D
   !-------------------------------------------------------------------------
 
-  !
-  ! 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
-  !-------------------------------------------------------------------------
+  SUBROUTINE test_dataset2D()
+
+    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)
+          CALL VERIFY("h5ltread_dataset_f",buf3(i,j), buf3r(i,j), errcode)
+          IF (errcode .NE.0 ) 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)
+          CALL VERIFY("h5ltread_dataset_f", buf4(i,j), buf4r(i,j), errcode)
+          IF (errcode .NE.0 ) 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
 
-  !
-  ! 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
+  ! test_dataset3D
   !-------------------------------------------------------------------------
 
-  !
-  ! 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
+  SUBROUTINE test_dataset3D()
+
+    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
-  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
+    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
+    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)
+    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)
+             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
-  !-------------------------------------------------------------------------
+             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)
+             CALL VERIFY("h5ltread_dataset_f",buf3(i,j,k), buf3r(i,j,k), errcode)
+             IF (errcode .NE.0 ) 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)
+             CALL VERIFY("h5ltread_dataset_f", buf4(i,j,k), buf4r(i,j,k), errcode)
+             IF (errcode .NE.0 ) 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
+    ! (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
-  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)   ')
+    !
+    ! Close the file.
+    !
+    CALL h5fclose_f(file_id, errcode)
 
-  !
-  ! write dataset.
-  !
-  CALL h5ltmake_dataset_int_f(file_id, dsetname2, rank, dims, buf2, errcode)
+    !
+    ! Close FORTRAN predefined datatypes.
+    !
+    CALL h5close_f(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
+    CALL passed()
+    !
+    ! end function.
+    !
+  END SUBROUTINE test_dataset3D
 
   !-------------------------------------------------------------------------
-  ! test h5ltget_dataset_info_f function
+  ! test_datasetND
   !-------------------------------------------------------------------------
 
-  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
+  SUBROUTINE test_datasetND(rank)
+
+    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
+    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
+                   CALL VERIFY("h5ltread_dataset_f",rbuf_4(i,j,k,l), rbufr_4(i,j,k,l), errcode)
+                   IF (errcode .NE.0 ) 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
+                      CALL VERIFY("h5ltread_dataset_f",rbuf_5(i,j,k,l,m), rbufr_5(i,j,k,l,m), errcode)
+                      IF (errcode .NE.0 ) 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
+                         CALL VERIFY("h5ltread_dataset_f",rbuf_6(i,j,k,l,m,n), rbufr_6(i,j,k,l,m,n), errcode)
+                         IF (errcode .NE.0 ) 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
+                            CALL VERIFY("h5ltread_dataset_f",rbuf_7(i,j,k,l,m,n,o), rbufr_7(i,j,k,l,m,n,o), errcode)
+                            IF (errcode .NE.0 ) 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
+                   CALL VERIFY("h5ltread_dataset_f",dbuf_4(i,j,k,l), dbufr_4(i,j,k,l), errcode)
+                   IF (errcode .NE.0 ) 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
+                      CALL VERIFY("h5ltread_dataset_f",dbuf_5(i,j,k,l,m), dbufr_5(i,j,k,l,m), errcode)
+                      IF (errcode .NE.0 ) 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
+                         CALL VERIFY("h5ltread_dataset_f",dbuf_6(i,j,k,l,m,n), dbufr_6(i,j,k,l,m,n), errcode)
+                         IF (errcode .NE.0 ) 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
+                            CALL VERIFY("h5ltread_dataset_f",dbuf_7(i,j,k,l,m,n,o), dbufr_7(i,j,k,l,m,n,o), errcode)
+                            IF (errcode .NE.0 ) 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
 
 
   !-------------------------------------------------------------------------
-  ! int
+  ! test_datasets
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Set/Get attributes int         ')
-
-
-  !
-  ! write attribute.
-  !
-  CALL h5ltset_attribute_int_f(file_id,dsetname1,attrname2,buf2,size,errcode)
+  SUBROUTINE test_datasets()
+
+    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
+    INTEGER, PARAMETER :: LEN0 = 3
+    INTEGER, PARAMETER :: LEN1 = 12
+    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
+    CHARACTER(LEN=5), PARAMETER :: dsetname6 = "dset6"   ! 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(SIZE_T)  :: i_sz, j_sz                       ! 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
+
+    ! 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_vl = (/2/)
+    INTEGER, DIMENSION(:), POINTER :: ptr_r
+    INTEGER(HID_T) :: type_id 
+
+    !
+    ! 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
+
+    !
+    ! 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_sz=1, wdata(1)%len
+       ptr(1)%data(i_sz) = INT(wdata(1)%len) - INT(i_sz) + 1 ! 3 2 1
+    ENDDO
+    wdata(1)%p = C_LOC(ptr(1)%data(1))
+
+    ptr(2)%data(1:2) = 1
+    DO i_sz = 3, wdata(2)%len
+       ptr(2)%data(i_sz) = ptr(2)%data(i_sz-1_size_t) + ptr(2)%data(i_sz-2_size_t) ! (1 1 2 3 5 8 etc.)
+    ENDDO
+    wdata(2)%p = C_LOC(ptr(2)%data(1))
+
+    !-------------------------------------------------------------------------
+    ! 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
+       CALL VERIFY("h5ltread_dataset_f", buf3(i), bufr3(i), errcode)
+       IF (errcode .NE.0 ) 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
+       CALL VERIFY("h5ltread_dataset_double_f", buf4(i), bufr4(i), errcode)
+       IF (errcode .NE.0 ) 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()
+
+
+    !-------------------------------------------------------------------------
+    ! variable-length dataset
+    !-------------------------------------------------------------------------
+    CALL test_begin(' Make/Read datasets (vl)        ')
+    !
+    ! Create variable-length datatype.
+    !
+    CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, type_id, errcode)
+
+    f_ptr = C_LOC(wdata(1))
+    CALL h5ltmake_dataset_f(file_id, dsetname6, 1, dims_vl, type_id, f_ptr, errcode)
+
+    ! Read the variable-length datatype
+    f_ptr = C_LOC(rdata(1))
+    CALL h5ltread_dataset_f(file_id, dsetname6, type_id, f_ptr, errcode)
+
+    DO i = 1, INT(dims_vl(1))
+       CALL c_f_pointer(rdata(i)%p, ptr_r, [rdata(i)%len] )
+       DO j_sz = 1, rdata(i)%len
+          CALL VERIFY("h5ltread_dataset_f", ptr_r(j_sz), ptr(i)%data(j_sz), errcode)
+          IF (errcode .NE.0 ) THEN
+             PRINT *, 'Writing/Reading variable-length dataset failed'
+             STOP
+          ENDIF
+       ENDDO
+    ENDDO
+
+    CALL H5Tclose_f(type_id, errcode)
+    DEALLOCATE(ptr)
+
+    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
+
+    CALL passed()
+
+    !
+    ! Close the file.
+    !
+    CALL h5fclose_f(file_id, errcode)
+    !
+    ! Close FORTRAN predefined datatypes.
+    !
+    CALL h5close_f(errcode)
+
+    !
+    ! end function.
+    !
+  END SUBROUTINE test_datasets
 
-  !
-  ! 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
+  ! test_attributes
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Set/Get attributes float       ')
-
-
-  !
-  ! write attribute.
-  !
+  SUBROUTINE test_attributes()
+
+    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 :: 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)
+    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))
+    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.
-  !
+    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)
+    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))
+    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)
+    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
+    !
+    ! compare read and write buffers.
+    !
+    DO i = 1, DIM1
+       CALL VERIFY("h5ltget_attribute_f",buf3(i), bufr3(i), errcode)
+       IF (errcode .NE.0 ) THEN
+          PRINT *, 'read buffer differs from write buffer'
+          PRINT *,  bufr3(i), ' and ',   buf3(i)
+          STOP
+       ENDIF
+    END DO
 
-  CALL passed()
+    CALL passed()
 
-  !-------------------------------------------------------------------------
-  ! double
-  !-------------------------------------------------------------------------
+    !-------------------------------------------------------------------------
+    ! 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)
+    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))
+    SizeOf_buf_type = SIZEOF(buf4(1))
 #endif
 
-  IF(SizeOf_buf_type.LT.16)THEN ! MSB can't handle 16 byte reals
+    IF(SizeOf_buf_type.LT.16)THEN ! MSB can't handle 16 byte reals
 
-     CALL test_begin(' Set/Get attributes double      ')
+       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)
+       !
+       ! 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)
+       !  CALL h5ltset_attribute_double_f(file_id,dsetname1,attrname4,buf4, size, errcode)
 
-     !
-     ! read attribute.
-     !
+       !
+       ! 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)
+       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))
+       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 **
-  !
+       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
+          CALL VERIFY("h5ltget_attribute_f",buf4(i), bufr4(i), errcode)
+          IF (errcode .NE.0 ) 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)
 !!$
@@ -1858,65 +1942,68 @@ SUBROUTINE test_attributes()
 
 !!$  CALL h5fclose_f(file_id1,  errcode)
 
-  CALL passed()
+    CALL passed()
 
-  !-------------------------------------------------------------------------
-  ! get attribute rank
-  !-------------------------------------------------------------------------
+    !-------------------------------------------------------------------------
+    ! get attribute rank
+    !-------------------------------------------------------------------------
 
-  CALL test_begin(' Get attribute rank/info        ')
+    CALL test_begin(' Get attribute rank/info        ')
 
 
-  CALL h5ltget_attribute_ndims_f(file_id,dsetname1,attrname2,rankr,errcode)
+    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
+    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)
+    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
+    !
+    ! 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)
+    !
+    ! 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
+    CALL passed()
+    !
+    ! end function.
+    !
+  END SUBROUTINE test_attributes
+
+END MODULE TSTLITE_TESTS
+
+PROGRAM lite_test
+
+  USE TSTLITE_TESTS ! module for testing lite routines
+  IMPLICIT NONE
 
-!-------------------------------------------------------------------------
-! test_begin
-!-------------------------------------------------------------------------
+  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()
 
-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
+END PROGRAM lite_test
 
-!-------------------------------------------------------------------------
-! passed
-!-------------------------------------------------------------------------
 
-SUBROUTINE passed()
-  WRITE(*, fmt = '(6a)')  'PASSED'
-END SUBROUTINE passed
diff --git a/hl/fortran/test/tsttable.F90 b/hl/fortran/test/tsttable.F90
index 74029a5..38cfa86 100644
--- a/hl/fortran/test/tsttable.F90
+++ b/hl/fortran/test/tsttable.F90
@@ -5,12 +5,10 @@
 !                                                                             *
 !   This file is part of HDF5.  The full HDF5 copyright notice, including     *
 !   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
+!   the COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 !
 !
@@ -18,12 +16,36 @@
 !
 #include <H5config_f.inc>
 
-PROGRAM table_test
+MODULE TSTTABLE
 
-  CALL test_table1()
+CONTAINS
 
-END PROGRAM table_test
+!-------------------------------------------------------------------------
+! test_begin
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_begin(string)
+  CHARACTER(LEN=*), INTENT(IN) :: string
+  WRITE(*, fmt = '(A)', ADVANCE = 'no') string
+END SUBROUTINE test_begin
+
+!-------------------------------------------------------------------------
+! passed
+!-------------------------------------------------------------------------
+
+SUBROUTINE passed()
+  WRITE(*, fmt = '(T12,A6)')  'PASSED'
+END SUBROUTINE passed
 
+END MODULE TSTTABLE
+
+
+MODULE TSTTABLE_TESTS
+
+  USE TH5_MISC_GEN
+  IMPLICIT NONE
+
+CONTAINS
 
 !-------------------------------------------------------------------------
 ! test_table1
@@ -33,15 +55,16 @@ SUBROUTINE test_table1()
 
   USE H5TB ! module of H5TB
   USE HDF5 ! module of HDF5 library
+  USE TSTTABLE ! module for testing table support routines
 
   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
+  CHARACTER(LEN=9),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
@@ -74,6 +97,7 @@ SUBROUTINE test_table1()
   INTEGER :: Cs_sizeof_double = H5_SIZEOF_DOUBLE          ! C's sizeof double
   INTEGER :: SIZEOF_X
   LOGICAL :: Exclude_double
+  CHARACTER(LEN=62) :: test_txt
 
   ! Find size of DOUBLE PRECISION
 #ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
@@ -100,11 +124,6 @@ SUBROUTINE test_table1()
   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)
@@ -164,7 +183,8 @@ SUBROUTINE test_table1()
   ! make table
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Make table                     ')
+  test_txt = "Make table"
+  CALL test_begin(test_txt)
 
   CALL h5tbmake_table_f(dsetname1,&
        file_id,&
@@ -186,7 +206,8 @@ SUBROUTINE test_table1()
   ! write field
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Read/Write field by name       ')
+  test_txt = "Read/Write field by name"
+  CALL test_begin(test_txt)
 
   CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
        bufs,errcode)
@@ -263,7 +284,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
      DO i = 1, nrecords
-        IF ( bufrr(i) .NE. bufr(i) ) THEN
+       CALL VERIFY("h5tbread_field_name_f", bufrr(i), bufr(i), errcode)
+       IF (errcode .NE.0 ) THEN
            PRINT *, 'read buffer differs from write buffer'
            PRINT *,  bufrr(i), ' and ',   bufr(i)
            STOP
@@ -278,7 +300,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
      DO i = 1, nrecords
-        IF ( bufdr(i) .NE. bufd(i) ) THEN
+        CALL VERIFY("h5tbread_field_name_f", bufdr(i), bufd(i), errcode)
+        IF (errcode .NE.0 ) THEN
            PRINT *, 'read buffer differs from write buffer'
            PRINT *,  bufdr(i), ' and ',   bufd(i)
            STOP
@@ -295,7 +318,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
   DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
+     CALL VERIFY("h5tbread_field_name_f", bufrr(i), bufr(i), errcode)
+     IF (errcode .NE.0 ) THEN
         PRINT *, 'read buffer differs from write buffer'
         PRINT *,  bufrr(i), ' and ',   bufr(i)
         STOP
@@ -309,7 +333,8 @@ SUBROUTINE test_table1()
   ! write field
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Read/Write field by index      ')
+  test_txt = "Read/Write field by index"
+  CALL test_begin(test_txt)
 
   CALL h5tbwrite_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
        bufs,errcode)
@@ -341,7 +366,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
   DO i = 1, nrecords
-     IF ( bufsr(i) .NE. bufs(i) ) THEN
+     CALL VERIFY("h5tbread_field_index_f", bufsr(i), bufs(i), errcode)
+     IF (errcode .NE.0 ) THEN
         PRINT *, 'read buffer differs from write buffer'
         PRINT *,  bufsr(i), ' and ',   bufs(i)
         STOP
@@ -355,7 +381,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
   DO i = 1, nrecords
-     IF ( bufir(i) .NE. bufi(i) ) THEN
+     CALL VERIFY("h5tbread_field_index_f", bufir(i), bufi(i), errcode)
+     IF (errcode .NE.0 ) THEN
         PRINT *, 'read buffer differs from write buffer'
         PRINT *,  bufir(i), ' and ',   bufi(i)
         STOP
@@ -369,7 +396,8 @@ SUBROUTINE test_table1()
      ! compare read and write buffers.
      !
      DO i = 1, nrecords
-        IF ( bufrr(i) .NE. bufr(i) ) THEN
+        CALL VERIFY("h5tbread_field_index_f", bufrr(i), bufr(i), errcode)
+        IF (errcode .NE.0 ) THEN
            PRINT *, 'read buffer differs from write buffer'
            PRINT *,  bufrr(i), ' and ',   bufr(i)
            STOP
@@ -383,7 +411,8 @@ SUBROUTINE test_table1()
      ! compare read and write buffers.
      !
      DO i = 1, nrecords
-        IF ( bufdr(i) .NE. bufd(i) ) THEN
+        CALL VERIFY("h5tbread_field_index_f", bufdr(i), bufd(i), errcode)
+        IF (errcode .NE.0 ) THEN
            PRINT *, 'read buffer differs from write buffer'
            PRINT *,  bufdr(i), ' and ',   bufd(i)
            STOP
@@ -398,7 +427,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
   DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
+     CALL VERIFY("h5tbread_field_index_f", bufrr(i), bufr(i), errcode)
+     IF (errcode .NE.0 ) THEN
         PRINT *, 'read buffer differs from write buffer'
         PRINT *,  bufrr(i), ' and ',   bufr(i)
         STOP
@@ -413,8 +443,8 @@ SUBROUTINE test_table1()
   ! Insert field
   ! we insert a field callsed "field5" with the same type and buffer as field 4 (Real)
   !-------------------------------------------------------------------------
-
-  CALL test_begin(' Insert field                   ')
+  test_txt = "Insert field"
+  CALL test_begin(test_txt)
 
   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,&
@@ -423,7 +453,8 @@ SUBROUTINE test_table1()
   ! compare read and write buffers.
   !
   DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
+     CALL VERIFY("h5tbread_field_index_f", bufrr(i), bufr(i), errcode)
+     IF (errcode .NE.0 ) THEN
         PRINT *, 'read buffer differs from write buffer'
         PRINT *,  bufrr(i), ' and ',   bufr(i)
         STOP
@@ -437,7 +468,8 @@ SUBROUTINE test_table1()
   ! Delete field
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Delete field                   ')
+  test_txt = "Delete field"
+  CALL test_begin(test_txt)
 
   CALL h5tbdelete_field_f(file_id,dsetname1,"field4abc",errcode)
 
@@ -448,7 +480,8 @@ SUBROUTINE test_table1()
   ! Gets the number of records and fields
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Get table info                 ')
+  test_txt = "Get table info"
+  CALL test_begin(test_txt)
 
   CALL h5tbget_table_info_f(file_id,dsetname1,nfieldsr,nrecordsr,errcode )
 
@@ -463,7 +496,8 @@ SUBROUTINE test_table1()
   ! Get information about fields
   !-------------------------------------------------------------------------
 
-  CALL test_begin(' Get fields info                ')
+  test_txt = "Get fields info"
+  CALL test_begin(test_txt)
 
   CALL h5tbget_field_info_f(file_id, dsetname1, nfields, field_namesr, field_sizesr,&
        field_offsetr, type_sizeout, errcode, maxlen )
@@ -472,7 +506,6 @@ SUBROUTINE test_table1()
      WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: RETURN ERROR")')
      STOP
   ENDIF
-
   ! "field4abc" was deleted and "field5" was added.
   field_names(4) = "field5"
 
@@ -503,32 +536,221 @@ SUBROUTINE test_table1()
   CALL h5fclose_f(file_id, errcode)
 
   !
-  ! Close FORTRAN predefined datatypes.
-  !
-  CALL h5close_f(errcode)
-
-  !
   ! end function.
   !
 END SUBROUTINE test_table1
 
-
 !-------------------------------------------------------------------------
-! test_begin
+! test_table2
+! Tests F2003 versions of H5TBread_table_f and H5TBmake_table_f
 !-------------------------------------------------------------------------
 
-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
+SUBROUTINE test_table2()
 
-!-------------------------------------------------------------------------
-! passed
-!-------------------------------------------------------------------------
+  USE H5TB ! module of H5TB
+  USE HDF5 ! module of HDF5 library
+  USE TSTTABLE ! module for testing table support routines
 
-SUBROUTINE passed()
-  WRITE(*, fmt = '(6a)')  'PASSED'
-END SUBROUTINE passed
+  IMPLICIT NONE
+  
+  INTEGER, PARAMETER :: i8 = SELECTED_INT_KIND(9)   !should map to INTEGER*4 on most modern processors
+  INTEGER, PARAMETER :: i16 = SELECTED_INT_KIND(9) ! (18) !should map to INTEGER*8 on most modern processors
+  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
+
+  TYPE particle_t
+     SEQUENCE
+     CHARACTER(LEN=11) :: name
+     INTEGER(KIND=i8) :: lati
+     INTEGER(KIND=i16) :: long
+     REAL(KIND=sp) :: pressure
+     REAL(KIND=dp) :: temperature
+  END TYPE particle_t
+
+  INTEGER(HSIZE_T), PARAMETER :: nfields  = 5            ! nfields
+  INTEGER(HSIZE_T), PARAMETER :: nrecords = 8            ! nrecords
+
+  CHARACTER(len=8), PARAMETER :: filename = "f2tab.h5"   ! File name
+  CHARACTER(LEN=5), PARAMETER :: table_name = "tabel"    ! table name
+  CHARACTER(LEN=10), PARAMETER :: table_name_fill = "tabel_fill"    ! table name
+
+  ! Define field information
+  CHARACTER(LEN=11), DIMENSION(1:NFIELDS), PARAMETER :: field_names = (/&
+       "Name       ", &
+       "Latitude   ", &
+       "Longitude  ", &
+       "Pressure   ", &
+       "Temperature"  &
+       /)
+
+  INTEGER(hid_t), DIMENSION(1:nfields) :: field_type
+  INTEGER(hid_t) :: string_type
+  INTEGER(hid_t) :: file_id
+  INTEGER(hsize_t), PARAMETER :: chunk_size = 10
+  TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: fill_data
+  INTEGER :: compress
+  INTEGER :: i
+  INTEGER(SIZE_T) :: dst_size
+  TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: dst_buf
+  INTEGER(SIZE_T), DIMENSION(1:nfields) :: dst_offset
+  INTEGER(SIZE_T), DIMENSION(1:nfields) :: dst_sizes
+  TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: p_data
+  TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: r_data
+
+  TYPE(C_PTR) :: f_ptr1, f_ptr2, f_ptr3
+
+  INTEGER :: errcode
+  CHARACTER(LEN=62) :: test_txt
+
+  test_txt = "Testing H5TBread_table_f and H5TBmake_table_f (F2003)"
+  CALL test_begin(test_txt)
+
+  
+  ! Define an array of Particles
+  p_data(1:nrecords) = (/ &
+       particle_t("zero       ",0_i8,0_i16,0.0_sp,0.0_dp),     &
+       particle_t("one        ",10_i8,10_i16,10.0_sp,10.0_dp),  &
+       particle_t("two        ",20_i8,20_i16,20.0_sp,20.0_dp),  &
+       particle_t("three      ",30_i8,30_i16,30.0_sp,30.0_dp),&
+       particle_t("four       ",40_i8,40_i16,40.0_sp,40.0_dp), &
+       particle_t("five       ",50_i8,50_i16,50.0_sp,50.0_dp), &
+       particle_t("six        ",60_i8,60_i16,60.0_sp,60.0_dp),  &
+       particle_t("seven      ",70_i8,70_i16,70.0_sp,70.0_dp) &
+       /)
+
+  fill_data(1:nrecords) = particle_t("no data",-1_i8, -2_i16, -99.0_sp, -100.0_dp)
+
+  compress = 0
+  dst_size = H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(2)))
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+  dst_sizes(1:nfields) = (/ &
+       storage_size(dst_buf(1)%name)/storage_size(c_char_'a'), &
+       storage_size(dst_buf(1)%lati)/storage_size(c_char_'a'), &
+       storage_size(dst_buf(1)%long)/storage_size(c_char_'a'), &
+       storage_size(dst_buf(1)%pressure)/storage_size(c_char_'a'), &
+       storage_size(dst_buf(1)%temperature)/storage_size(c_char_'a') &
+       /)
+#else
+  dst_sizes(1:nfields) = (/ &
+       sizeof(dst_buf(1)%name), &
+       sizeof(dst_buf(1)%lati), &
+       sizeof(dst_buf(1)%long), &
+       sizeof(dst_buf(1)%pressure), &
+       sizeof(dst_buf(1)%temperature) &
+       /)
+#endif
+
+  dst_offset(1:nfields) = (/ & 
+       H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%name(1:1))), &
+       H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%lati)), &
+       H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%long)), &
+       H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%pressure)), &
+       H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%temperature)) &
+       /)
+
+  ! Initialize field_type
+  CALL H5Tcopy_f(H5T_FORTRAN_S1, string_type, errcode)
+  CALL H5Tset_size_f(string_type, INT(11,size_t), errcode)
+
+  field_type(1:5) = (/ &
+       string_type,&
+       h5kind_to_type(KIND(dst_buf(1)%lati), H5_INTEGER_KIND),&
+       h5kind_to_type(KIND(dst_buf(1)%long), H5_INTEGER_KIND),&
+       h5kind_to_type(KIND(dst_buf(1)%pressure), H5_REAL_KIND),&
+       h5kind_to_type(KIND(dst_buf(1)%temperature), H5_REAL_KIND) &
+       /)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  ! Check setting the fill values
+
+  f_ptr1 = C_NULL_PTR
+  f_ptr2 = C_LOC(fill_data(1)%name(1:1))
+  CALL h5tbmake_table_f("Table Title Fill", file_id, table_name_fill, nfields, nrecords, &
+       dst_size, field_names, dst_offset, field_type, &
+       chunk_size, f_ptr2, compress, f_ptr1, errcode )
+
+  f_ptr3 = C_LOC(r_data(1)%name(1:1))
+  CALL h5tbread_table_f(file_id, table_name_fill, nfields, dst_size, dst_offset, dst_sizes, f_ptr3, errcode)
+
+  DO i = 1, nfields
+     CALL VERIFY("h5tbread_table_f", r_data(i)%name, fill_data(i)%name, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%lati, fill_data(i)%lati, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%long, fill_data(i)%long, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%pressure, fill_data(i)%pressure, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%temperature, fill_data(i)%temperature, errcode)
+     IF (errcode .NE.0 ) THEN
+        PRINT*,'H5TBmake/read_table_f --filled-- FAILED'
+        STOP
+     ENDIF
+  ENDDO
+
+  ! Check setting the table values
+
+  f_ptr1 = C_LOC(p_data(1)%name(1:1))
+  f_ptr2 = C_NULL_PTR
+  
+  CALL h5tbmake_table_f("Table Title",file_id, table_name, nfields, nrecords, &
+       dst_size, field_names, dst_offset, field_type, &
+       chunk_size, f_ptr2, compress, f_ptr1, errcode )
+
+  f_ptr3 = C_LOC(r_data(1)%name(1:1))
+  CALL h5tbread_table_f(file_id, table_name, nfields, dst_size, dst_offset, dst_sizes, f_ptr3, errcode)
+
+  DO i = 1, nfields
+     CALL VERIFY("h5tbread_table_f", r_data(i)%name, p_data(i)%name, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%lati, p_data(i)%lati, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%long, p_data(i)%long, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%pressure, p_data(i)%pressure, errcode)
+     CALL VERIFY("h5tbread_table_f", r_data(i)%temperature, p_data(i)%temperature, errcode)
+     IF (errcode .NE.0 ) THEN
+        PRINT*,'H5TBmake/read_table_f FAILED'
+        STOP
+     ENDIF
+  ENDDO
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! end
+  !-------------------------------------------------------------------------
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+END SUBROUTINE test_table2
+
+END MODULE TSTTABLE_TESTS
+
+
+PROGRAM table_test
+
+  USE H5TB ! module of H5TB
+  USE HDF5 ! module of HDF5 library
+  USE TSTTABLE_TESTS ! module for testing table routines
+
+  IMPLICIT NONE
+  INTEGER :: errcode = 0
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  CALL test_table1()
+  CALL test_table2()
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+END PROGRAM table_test
 
 
diff --git a/hl/src/CMakeLists.txt b/hl/src/CMakeLists.txt
index 872e42d..86472fb 100644
--- a/hl/src/CMakeLists.txt
+++ b/hl/src/CMakeLists.txt
@@ -1,10 +1,10 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_SRC)
 
 #-----------------------------------------------------------------------------
 # List Source files
 #-----------------------------------------------------------------------------
-set (HL_SRCS
+set (HL_SOURCES
     ${HDF5_HL_SRC_SOURCE_DIR}/H5DO.c
     ${HDF5_HL_SRC_SOURCE_DIR}/H5DS.c
     ${HDF5_HL_SRC_SOURCE_DIR}/H5IM.c
@@ -29,7 +29,7 @@ set (HL_HEADERS
     ${HDF5_HL_SRC_SOURCE_DIR}/hdf5_hl.h
 )
 
-add_library (${HDF5_HL_LIB_TARGET} STATIC ${HL_SRCS} ${HL_HEADERS})
+add_library (${HDF5_HL_LIB_TARGET} STATIC ${HL_SOURCES} ${HL_HEADERS})
 TARGET_C_PROPERTIES (${HDF5_HL_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET})
 H5_SET_LIB_OPTIONS (${HDF5_HL_LIB_TARGET} ${HDF5_HL_LIB_NAME} STATIC)
@@ -41,7 +41,7 @@ set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF
 set (install_targets ${HDF5_HL_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_HL_LIBSH_TARGET} SHARED ${HL_SRCS} ${HL_HEADERS})
+  add_library (${HDF5_HL_LIBSH_TARGET} SHARED ${HL_SOURCES} ${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})
@@ -53,7 +53,7 @@ if (BUILD_SHARED_LIBS)
   )
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_LIBSH_TARGET}")
   set (install_targets ${install_targets} ${HDF5_HL_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -73,7 +73,8 @@ install (
 if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS)
     INSTALL_TARGET_PDB (${HDF5_HL_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} hllibraries)
-  endif (BUILD_SHARED_LIBS)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_HL_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} hllibraries)
 
   install (
       TARGETS
@@ -84,5 +85,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT hllibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hllibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT hllibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/hl/src/COPYING b/hl/src/COPYING
index 6903daf..6497ace 100644
--- a/hl/src/COPYING
+++ b/hl/src/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/src/H5DO.c b/hl/src/H5DO.c
index bfadfaa..8db6768 100644
--- a/hl/src/H5DO.c
+++ b/hl/src/H5DO.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string.h>
@@ -165,7 +163,7 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
         created_dxpl = TRUE;
     } /* end if */
     else if(TRUE != H5Pisa_class(dxpl_id, H5P_DATASET_XFER))
-	    goto done;
+	goto done;
 
     /* Get the dataspace of the dataset */
     if(FAIL == (space_id = H5Dget_space(dset_id)))
@@ -219,7 +217,8 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
     nelmts = (hsize_t)snelmts;
 
     /* create a memory space */
-    mem_space_id = H5Screate_simple(1, &nelmts, NULL);
+    if(FAIL == (mem_space_id = H5Screate_simple(1, &nelmts, NULL)))
+	goto done;
 
     /* Write the data */
     if(H5Dwrite(dset_id, memtype, mem_space_id, new_space_id, dxpl_id, buf) < 0)
@@ -237,24 +236,24 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
 	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;
+    if(boundary[axis] != 0) {
+
+	/* 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 */
     } /* end if */
 
     /* Indicate success */
diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h
index 1e5eb7a..ce0d32e 100644
--- a/hl/src/H5DOpublic.h
+++ b/hl/src/H5DOpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5DOpublic_H
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c
index de6e66c..527c92b 100644
--- a/hl/src/H5DS.c
+++ b/hl/src/H5DS.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <assert.h>
diff --git a/hl/src/H5DSprivate.h b/hl/src/H5DSprivate.h
index 39c3e74..9d20d48 100644
--- a/hl/src/H5DSprivate.h
+++ b/hl/src/H5DSprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5DSprivate_H
diff --git a/hl/src/H5DSpublic.h b/hl/src/H5DSpublic.h
index 85923f8..615122c 100644
--- a/hl/src/H5DSpublic.h
+++ b/hl/src/H5DSpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5DSpublic_H
diff --git a/hl/src/H5HLprivate2.h b/hl/src/H5HLprivate2.h
index 1b67c70..45591e8 100644
--- a/hl/src/H5HLprivate2.h
+++ b/hl/src/H5HLprivate2.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5HLprivate2_H
diff --git a/hl/src/H5IM.c b/hl/src/H5IM.c
index 6d08f02..a4818b8 100644
--- a/hl/src/H5IM.c
+++ b/hl/src/H5IM.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5IMprivate.h"
@@ -31,7 +29,6 @@
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -86,7 +83,6 @@ herr_t H5IMmake_image_8bit( hid_t loc_id,
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Interlace Mode Dimensions in the Dataspace
 * INTERLACE_PIXEL [height][width][pixel components]
@@ -240,7 +236,6 @@ herr_t H5IM_find_palette( hid_t loc_id )
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -422,7 +417,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -473,7 +467,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -530,7 +523,6 @@ herr_t H5IMmake_palette( hid_t loc_id,
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 *  An image (dataset) within an HDF5 file may optionally specify an array of
 *  palettes to be viewed with. The dataset will have an attribute
@@ -708,7 +700,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -901,7 +892,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -1018,7 +1008,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -1126,7 +1115,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
@@ -1231,7 +1219,6 @@ out:
 *
 * Comments:
 *  based on HDF5 Image and Palette Specification
-*  http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
 *
 * Modifications:
 *
diff --git a/hl/src/H5IMprivate.h b/hl/src/H5IMprivate.h
index 0cb37cc..6776c9d 100644
--- a/hl/src/H5IMprivate.h
+++ b/hl/src/H5IMprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5IMprivate_H
diff --git a/hl/src/H5IMpublic.h b/hl/src/H5IMpublic.h
index 6833f02..a95e439 100644
--- a/hl/src/H5IMpublic.h
+++ b/hl/src/H5IMpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5IMpublic_H
diff --git a/hl/src/H5LD.c b/hl/src/H5LD.c
index 4abd740..1669a30 100644
--- a/hl/src/H5LD.c
+++ b/hl/src/H5LD.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <string.h>
diff --git a/hl/src/H5LDprivate.h b/hl/src/H5LDprivate.h
index 13e0710..b52928b 100644
--- a/hl/src/H5LDprivate.h
+++ b/hl/src/H5LDprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5LDprivate_H
diff --git a/hl/src/H5LDpublic.h b/hl/src/H5LDpublic.h
index 4844d42..e2bb745 100644
--- a/hl/src/H5LDpublic.h
+++ b/hl/src/H5LDpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5LDpublic_H
diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c
index 107e238..0074d02 100644
--- a/hl/src/H5LT.c
+++ b/hl/src/H5LT.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <assert.h>
@@ -894,8 +892,8 @@ hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_size, unsigned flags)
     /* set allocation increment to a percentage of the supplied buffer size, or
      * a pre-defined minimum increment value, whichever is larger
      */
-    if ((buf_prcnt * buf_size) > min_incr)
-        alloc_incr = (size_t)(buf_prcnt * buf_size);
+    if ((size_t)(buf_prcnt * (double)buf_size) > min_incr)
+        alloc_incr = (size_t)(buf_prcnt * (double)buf_size);
     else
         alloc_incr = min_incr;
 
diff --git a/hl/src/H5LTanalyze.c b/hl/src/H5LTanalyze.c
index 022e24f..b6a7f58 100644
--- a/hl/src/H5LTanalyze.c
+++ b/hl/src/H5LTanalyze.c
@@ -883,12 +883,10 @@ char *H5LTyytext;
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /* NOTE!
  *
diff --git a/hl/src/H5LTanalyze.l b/hl/src/H5LTanalyze.l
index a0c4f42..b9b492e 100644
--- a/hl/src/H5LTanalyze.l
+++ b/hl/src/H5LTanalyze.l
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* NOTE!
diff --git a/hl/src/H5LTparse.y b/hl/src/H5LTparse.y
index 80dcc42..66a8556 100644
--- a/hl/src/H5LTparse.y
+++ b/hl/src/H5LTparse.y
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* NOTE!
diff --git a/hl/src/H5LTprivate.h b/hl/src/H5LTprivate.h
index 98ac06e..01c5ee6 100644
--- a/hl/src/H5LTprivate.h
+++ b/hl/src/H5LTprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5LTprivate_H
diff --git a/hl/src/H5LTpublic.h b/hl/src/H5LTpublic.h
index 929c6bd..47be98a 100644
--- a/hl/src/H5LTpublic.h
+++ b/hl/src/H5LTpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5LTpublic_H
diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c
index e2d6a3d..07d8bfb 100644
--- a/hl/src/H5PT.c
+++ b/hl/src/H5PT.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
@@ -141,10 +139,9 @@ hid_t H5PTcreate(hid_t loc_id,
   if(H5Pclose(plistcopy_id) < 0)
     goto error;
 
-  if((table->type_id = H5Tcopy(dtype_id)) < 0)
-    goto error;
-
-  if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
+  /* Make a copy of caller's datatype and save it in the table structure.
+     It will be closed when the table is closed */
+   if((table->type_id = H5Tcopy(dtype_id)) < 0)
     goto error;
 
   H5PT_create_index(table);
@@ -262,12 +259,11 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
   if(H5Pclose(plist_id) < 0)
     goto error;
 
+  /* Make a copy of caller's datatype and save it in the table structure.
+     It will be closed when the table is closed */
   if((table->type_id = H5Tcopy(dtype_id)) < 0)
     goto error;
 
-  if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
-    goto error;
-
   H5PT_create_index(table);
   table->size = 0;
 
@@ -355,8 +351,9 @@ hid_t H5PTopen( hid_t loc_id,
   if((type_id = H5Dget_type(table->dset_id)) < 0)
     goto error;
 
-  /* Get the table's native datatype */
-  if((table->type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND)) < 0)
+  /* Make a copy of the datatype obtained and save it in the table structure.
+     It will be closed when the table is closed */
+   if((table->type_id = H5Tcopy(type_id)) < 0)
     goto error;
 
   /* Close the disk datatype */
diff --git a/hl/src/H5PTprivate.h b/hl/src/H5PTprivate.h
index adc2fa9..eec9df7 100644
--- a/hl/src/H5PTprivate.h
+++ b/hl/src/H5PTprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5PTprivate_H
diff --git a/hl/src/H5PTpublic.h b/hl/src/H5PTpublic.h
index 420275a..8a12c8c 100644
--- a/hl/src/H5PTpublic.h
+++ b/hl/src/H5PTpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5PTpublic_H
diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c
index bcd3339..a4bcbd4 100644
--- a/hl/src/H5TB.c
+++ b/hl/src/H5TB.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
diff --git a/hl/src/H5TBprivate.h b/hl/src/H5TBprivate.h
index e2b668d..17306fb 100644
--- a/hl/src/H5TBprivate.h
+++ b/hl/src/H5TBprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5TBprivate_H
diff --git a/hl/src/H5TBpublic.h b/hl/src/H5TBpublic.h
index 874ef20..56aa915 100644
--- a/hl/src/H5TBpublic.h
+++ b/hl/src/H5TBpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _H5TBpublic_H
diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am
index fef3450..4ef1f5f 100644
--- a/hl/src/Makefile.am
+++ b/hl/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/src/Makefile.in b/hl/src/Makefile.in
index 0907d3f..8ecf093 100644
--- a/hl/src/Makefile.in
+++ b/hl/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 High-Level Library Makefile(.in)
 #
@@ -463,6 +461,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -584,6 +583,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -729,32 +729,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -774,18 +769,20 @@ 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 H5LDpublic.h
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -883,22 +880,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5TB.Plo 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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1301,21 +1301,9 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1323,7 +1311,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/src/hdf5_hl.h b/hl/src/hdf5_hl.h
index f55aa04..3a7b8ee 100644
--- a/hl/src/hdf5_hl.h
+++ b/hl/src/hdf5_hl.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/test/CMakeLists.txt b/hl/test/CMakeLists.txt
index 42a175f..8845505 100644
--- a/hl/test/CMakeLists.txt
+++ b/hl/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_TEST)
 # --------------------------------------------------------------------
 # Notes: When creating unit test executables they should be prefixed
@@ -14,8 +14,8 @@ PROJECT (HDF5_HL_TEST)
 set (srcdir ${CMAKE_CURRENT_SOURCE_DIR})
 configure_file (${HDF5_HL_TEST_SOURCE_DIR}/H5srcdir_str.h.in H5srcdir_str.h  @ONLY)
 
-INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})
-INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
+include_directories (${CMAKE_CURRENT_BINARY_DIR})
+include_directories (${HDF5_TEST_SRC_DIR})
 
 # --------------------------------------------------------------------
 #  Macro used to add a unit test
@@ -30,7 +30,7 @@ MACRO (HL_ADD_EXE hl_name)
       ${HDF5_LIB_TARGET}
   )
   set_target_properties (hl_${hl_name} PROPERTIES FOLDER test/hl)
-ENDMACRO (HL_ADD_EXE)
+ENDMACRO ()
 
 MACRO (HL_ADD_SHEXE hl_name)
   add_executable (hl_${hl_name} ${hl_name}.c)
@@ -42,7 +42,7 @@ MACRO (HL_ADD_SHEXE hl_name)
       ${HDF5_LIBSH_TARGET}
   )
   set_target_properties (hl_${hl_name} PROPERTIES FOLDER test/hl)
-ENDMACRO (HL_ADD_SHEXE)
+ENDMACRO ()
 
 HL_ADD_EXE (test_lite)
 HL_ADD_EXE (test_image)
@@ -88,6 +88,6 @@ if (HDF5_BUILD_GENERATORS)
       ${HDF5_LIB_TARGET}
   )
   set_target_properties (hl_gen_test_ld PROPERTIES FOLDER test/hl/gen)
-endif (HDF5_BUILD_GENERATORS)
+endif ()
 
 include (CMakeTests.cmake)
diff --git a/hl/test/CMakeTests.cmake b/hl/test/CMakeTests.cmake
index 95eca4b..e5eb58e 100644
--- a/hl/test/CMakeTests.cmake
+++ b/hl/test/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -5,33 +16,58 @@
 ##############################################################################
 ##############################################################################
 
+set (HL_REFERENCE_TEST_FILES
+    dtype_file.txt
+    image8.txt
+    sepia.pal
+    earth.pal
+    image24pixel.txt
+    image24plane.txt
+    usa.wri
+    test_table_be.h5
+    test_table_cray.h5
+    test_table_le.h5
+    dsdata.txt
+    dslat.txt
+    dslon.txt
+    test_ds_be.h5
+    test_ds_le.h5
+    test_ld.h5
+)
+
+# --------------------------------------------------------------------
+#-- Copy the necessary files.
+# --------------------------------------------------------------------
+foreach (h5_file ${HL_REFERENCE_TEST_FILES})
+  HDFTEST_COPY_FILE("${HDF5_HL_TEST_SOURCE_DIR}/${h5_file}" "${HDF5_HL_TEST_BINARY_DIR}/${h5_file}" "hl_test_files")
+endforeach ()
+add_custom_target(hl_test_files ALL COMMENT "Copying files needed by hl_test tests" DEPENDS ${hl_test_files_list})
+
 # --------------------------------------------------------------------
 #  Macro used to add a unit test
 # --------------------------------------------------------------------
-MACRO (HL_ADD_TEST hl_name files)
-  add_test (NAME HL_${hl_name} COMMAND $<TARGET_FILE:hl_${hl_name}>)
+macro (HL_ADD_TEST hl_name)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME HL_${hl_name} COMMAND $<TARGET_FILE:hl_${hl_name}>)
+  else ()
+    add_test (NAME HL_${hl_name} COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:hl_${hl_name}>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=hl_${hl_name}.txt"
+        #-D "TEST_REFERENCE=hl_${hl_name}.out"
+        -D "TEST_FOLDER=${HDF5_HL_TEST_BINARY_DIR}"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (HL_${hl_name} PROPERTIES DEPENDS ${last_test}
       ENVIRONMENT "srcdir=${HDF5_HL_TEST_BINARY_DIR}"
       WORKING_DIRECTORY ${HDF5_HL_TEST_BINARY_DIR}
     )
-  endif (NOT "${last_test}" STREQUAL "")
-
-  # --------------------------------------------------------------------
-  #-- Copy the necessary files.
-  # --------------------------------------------------------------------
-  foreach (h5_file ${files})
-    set (dest "${HDF5_HL_TEST_BINARY_DIR}/${h5_file}")
-    #message (STATUS " Copying HL Test File ${h5_file} to ${dest}")
-    add_custom_command (
-        TARGET     hl_${hl_name}
-        PRE_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_HL_TEST_SOURCE_DIR}/${h5_file} ${dest}
-    )
-
-  endforeach (h5_file ${HL_REFERENCE_TEST_FILES})
-ENDMACRO (HL_ADD_TEST)
+  endif ()
+endmacro ()
 
 # Remove any output file left over from previous test run
 add_test (
@@ -70,16 +106,16 @@ add_test (
 )
 if (NOT "${last_test}" STREQUAL "")
   set_tests_properties (HL_test-clear-objects PROPERTIES DEPENDS ${last_test})
-endif (NOT "${last_test}" STREQUAL "")
+endif ()
 set (last_test "HL_test-clear-objects")
 
-HL_add_test (test_lite "dtype_file.txt")
-HL_add_test (test_image "image8.txt;sepia.pal;earth.pal;image24pixel.txt;image24plane.txt;usa.wri")
-HL_add_test (test_file_image "")
-HL_add_test (test_table "test_table_be.h5;test_table_cray.h5;test_table_le.h5")
-HL_add_test (test_ds "dsdata.txt;dslat.txt;dslon.txt;test_ds_be.h5;test_ds_le.h5")
-HL_add_test (test_packet "")
-HL_add_test (test_dset_opt "")
-HL_add_test (test_ld "test_ld.h5")
-HL_add_test (test_dset_append "")
+HL_add_test (test_lite )
+HL_add_test (test_image)
+HL_add_test (test_file_image)
+HL_add_test (test_table)
+HL_add_test (test_ds)
+HL_add_test (test_packet)
+HL_add_test (test_dset_opt)
+HL_add_test (test_ld)
+HL_add_test (test_dset_append)
 
diff --git a/hl/test/COPYING b/hl/test/COPYING
index 6903daf..6497ace 100644
--- a/hl/test/COPYING
+++ b/hl/test/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/test/H5srcdir_str.h.in b/hl/test/H5srcdir_str.h.in
index d472124..bab1df3 100644
--- a/hl/test/H5srcdir_str.h.in
+++ b/hl/test/H5srcdir_str.h.in
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* If you are reading this file and it has a '.h' suffix, it was automatically
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index 3f21218..e16550f 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -4,12 +4,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 #
 ## Makefile.am
@@ -47,7 +45,8 @@ 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_append.h5
+	test_packet_table_vlen.h5 testfl_packet_table_vlen.h5		\
+	test_dectris.h5 test_append.h5
 
 # Sources for test_packet executable
 test_packet_SOURCES=test_packet.c test_packet_vlen.c
diff --git a/hl/test/Makefile.in b/hl/test/Makefile.in
index 4b9190a..f80ce50 100644
--- a/hl/test/Makefile.in
+++ b/hl/test/Makefile.in
@@ -20,12 +20,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 #
 #
@@ -515,6 +513,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -636,6 +635,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -786,7 +786,8 @@ 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_append.h5
+	test_detach.h5 test_packet_table_vlen.h5 \
+	testfl_packet_table_vlen.h5 test_dectris.h5 test_append.h5
 
 # The tests depend on the hdf5, hdf5 test,  and hdf5_hl libraries
 LDADD = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
@@ -807,18 +808,20 @@ BUILD_ALL_PROGS = gen_test_ds gen_test_ld
 # Sources for test_packet executable
 test_packet_SOURCES = test_packet.c test_packet_vlen.c
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -945,22 +948,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_table.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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1404,6 +1410,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1411,7 +1418,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/test/dectris_hl_perf.c b/hl/test/dectris_hl_perf.c
index 008bd92..13cfac8 100644
--- a/hl/test/dectris_hl_perf.c
+++ b/hl/test/dectris_hl_perf.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/test/gen_test_ds.c b/hl/test/gen_test_ds.c
index 2fc8140..f8f1d39 100644
--- a/hl/test/gen_test_ds.c
+++ b/hl/test/gen_test_ds.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/test/gen_test_ld.c b/hl/test/gen_test_ld.c
index 1313d2a..d717a47 100644
--- a/hl/test/gen_test_ld.c
+++ b/hl/test/gen_test_ld.c
@@ -1,9 +1,16 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #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--                                   
diff --git a/hl/test/h5hltest.h b/hl/test/h5hltest.h
index 9a5e702..f368b8e 100644
--- a/hl/test/h5hltest.h
+++ b/hl/test/h5hltest.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/test/pal_rgb.h b/hl/test/pal_rgb.h
index 9610258..4b22bea 100644
--- a/hl/test/pal_rgb.h
+++ b/hl/test/pal_rgb.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 const unsigned char pal_rgb[256*3] = {255,255,255,
diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c
index 7b6fb82..91f1505 100644
--- a/hl/test/test_ds.c
+++ b/hl/test/test_ds.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
@@ -389,7 +387,7 @@ herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx, int
     int     rank = 4;
     int     rankds = 1;
     hsize_t dims[4]  = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE,DIM4_SIZE};
-    long    buf[DIM1_SIZE*DIM2_SIZE*DIM3_SIZE*DIM4_SIZE];
+    long    *buf;
     hsize_t s1_dim[1]  = {DIM1_SIZE};
     hsize_t s2_dim[1]  = {DIM2_SIZE};
     hsize_t s3_dim[1]  = {DIM3_SIZE};
@@ -409,6 +407,10 @@ herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx, int
     long    s43_wbuf[DIM4_SIZE] = {180,180};
     long    s44_wbuf[DIM4_SIZE] = {280,280};
 
+    /* Allocate buffer */
+    if(NULL == (buf = (long *)HDmalloc(sizeof(long) * DIM1_SIZE * DIM2_SIZE * DIM3_SIZE * DIM4_SIZE)))
+         return FAIL;
+
     /* make a dataset */
     if(H5LTmake_dataset_long(fid, dsname, rank, dims, buf) >= 0) {
         if(fulldims==0) {
@@ -444,6 +446,9 @@ herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx, int
      }
      else
          return FAIL;
+
+    HDfree(buf);
+
     return SUCCEED;
 }
 
@@ -4870,8 +4875,16 @@ static int read_data( const char* fname,
     }
 
     for(i=0, nelms=1; i < ndims; i++) {
-        fscanf( f, "%s %u", str, &j);
-        fscanf( f, "%d",&n );
+        if(fscanf( f, "%s %u", str, &j) && HDferror(f)) {
+            printf( "fscanf error in file %s\n", data_file );
+            HDfclose(f);
+            return -1;
+        } /* end if */
+        if(fscanf( f, "%d",&n ) < 0 && HDferror(f)) {
+            printf( "fscanf error in file %s\n", data_file );
+            HDfclose(f);
+            return -1;
+        } /* end if */
         dims[i] = (hsize_t)n;
         nelms *= (size_t)n;
     }
@@ -4885,7 +4898,11 @@ static int read_data( const char* fname,
     }
 
     for(j = 0; j < nelms; j++) {
-        fscanf( f, "%f",&val );
+        if(fscanf( f, "%f",&val ) < 0 && HDferror(f)) {
+            printf( "fscanf error in file %s\n", data_file );
+            HDfclose(f);
+            return -1;
+        } /* end if */
         (*buf)[j] = val;
     }
     HDfclose(f);
diff --git a/hl/test/test_dset_append.c b/hl/test/test_dset_append.c
index 0f193d9..d890481 100644
--- a/hl/test/test_dset_append.c
+++ b/hl/test/test_dset_append.c
@@ -5,18 +5,15 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
 
@@ -28,6 +25,7 @@
 #endif
 
 #define FILE		"test_append.h5"
+#define DNAME_NOTSET	"dataset_notset"
 #define DNAME_UNLIM	"dataset_unlim"
 #define DNAME_LESS	"dataset_less"
 #define DNAME_VARY	"dataset_vary"
@@ -36,6 +34,101 @@
 #define DBUGNAME1	"dataset_bug1"
 #define DBUGNAME2	"dataset_bug2"
 
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_notset
+ *
+ * Purpose:	Verify that H5DOappend works properly with default dapl.
+ *		That is, H5Pset_append_flush() is not used to set boundary
+ *		and callback in dapl.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Aug 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_notset(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 ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};			/* Current dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, 20};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};		/* Chunk dimension sizes */
+    int lbuf[10];			/* The data buffers */
+    int i, j;				/* Local index variables */
+    h5_stat_t  sb1, sb2;		/* File info */
+
+    TESTING("Append flush with H5DOappend()--append rows with default dapl");
+
+    /* 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 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;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_NOTSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+	FAIL_STACK_ERROR;
+
+    /* Append 6 rows to the dataset */
+    for(i = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++)
+	    lbuf[j] = (i * 10) + (j + 1);
+	/* Append without boundary, callback and flush */
+	if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)1, H5T_NATIVE_INT, lbuf) < 0)
+	    FAIL_STACK_ERROR;
+    } /* end for */
+
+    /* File size when not flushed */
+    if(HDstat(FILE, &sb1) < 0)
+	TEST_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* File size after flushing */
+    if(HDstat(FILE, &sb2) < 0)
+	TEST_ERROR;
+
+    /* File size before flushing should be less */
+    if(sb1.st_size > sb2.st_size) 
+	TEST_ERROR;
+
+    /* Closing */
+    if(H5Sclose(sid) < 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(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_notset() */
+
 /* The callback function for the object flush property */
 static herr_t
 flush_func(hid_t H5_ATTR_UNUSED obj_id, void *_udata)
@@ -1151,6 +1244,8 @@ int main(void)
     if((fid = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
 	FAIL_STACK_ERROR;
 
+    nerrors += test_dataset_append_notset(fid);
+
     nerrors += test_dataset_append_rows(fid);
 
     flush_ct = 0;	/* Reset flush counter */
diff --git a/hl/test/test_dset_opt.c b/hl/test/test_dset_opt.c
index c1e369e..03c467a 100644
--- a/hl/test/test_dset_opt.c
+++ b/hl/test/test_dset_opt.c
@@ -5,18 +5,15 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
 
diff --git a/hl/test/test_file_image.c b/hl/test/test_file_image.c
index 6ff5bf4..a98642c 100644
--- a/hl/test/test_file_image.c
+++ b/hl/test/test_file_image.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5hltest.h"
diff --git a/hl/test/test_image.c b/hl/test/test_image.c
index 8ba0083..c30b572 100644
--- a/hl/test/test_image.c
+++ b/hl/test/test_image.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <limits.h>
@@ -603,8 +601,14 @@ static int test_generate(void)
     */
 
 
-    fscanf( f, "%d %d %d", &imax, &jmax, &kmax );
-    fscanf( f, "%f %f %f", &valex, &xmin, &xmax );
+    if(fscanf( f, "%d %d %d", &imax, &jmax, &kmax ) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+    if(fscanf( f, "%f %f %f", &valex, &xmin, &xmax ) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
 
     /* Sanity check on scanned-in values */
     if(imax < 1 || jmax < 1 || kmax < 1)
@@ -633,7 +637,10 @@ static int test_generate(void)
 
     for ( i = 0; i < n_elements; i++ )
     {
-        fscanf( f, "%f ", &value );
+        if(fscanf( f, "%f ", &value ) < 0 && HDferror(f)) {
+            printf( "fscanf error in file %s.\n", data_file );
+            goto out;
+        } /* end if */
         data[i] = value;
     }
     HDfclose(f);
@@ -794,12 +801,35 @@ static int read_data(const char* fname, /*IN*/
         goto out;
     }
 
-    fscanf(f, "%s", str);
-    fscanf(f, "%d", &color_planes);
-    fscanf(f, "%s", str);
-    fscanf(f, "%d", &h);
-    fscanf(f, "%s", str);
-    fscanf(f, "%d", &w);
+    if(fscanf(f, "%s", str) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+
+    if(fscanf(f, "%d", &color_planes) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+
+    if(fscanf(f, "%s", str) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+ 
+    if(fscanf(f, "%d", &h) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+
+    if(fscanf(f, "%s", str) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
+
+    if(fscanf(f, "%d", &w) < 0 && HDferror(f)) {
+        printf( "fscanf error in file %s.\n", data_file );
+        goto out;
+    } /* end if */
 
     /* Check product for overflow */
     if(w < 1 || h < 1 || color_planes < 1)
@@ -830,7 +860,10 @@ static int read_data(const char* fname, /*IN*/
 
     /* Read data elements */
     for(i = 0; i < n_elements; i++) {
-        fscanf(f, "%d",&n);
+        if(fscanf(f, "%d", &n) < 0 && HDferror(f)) {
+            printf( "fscanf error in file %s.\n", data_file );
+            goto out;
+        } /* end if */
         image_data[i] = (unsigned char)n;
     } /* end for */
 
diff --git a/hl/test/test_ld.c b/hl/test/test_ld.c
index df721e6..12a226a 100644
--- a/hl/test/test_ld.c
+++ b/hl/test/test_ld.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
diff --git a/hl/test/test_lite.c b/hl/test/test_lite.c
index f3258d6..763fdb5 100644
--- a/hl/test/test_lite.c
+++ b/hl/test/test_lite.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
@@ -2066,6 +2064,15 @@ static int test_valid_path(void)
   /**************************************
    * CHECK ABSOLUTE PATHS 
    **************************************/
+
+  if( (path_valid = H5LTpath_valid(file_id, "/", TRUE)) != TRUE) {
+    goto out;
+  }
+
+  if( (path_valid = H5LTpath_valid(file_id, "/", FALSE)) != TRUE) {
+    goto out;
+  }
+
   if( (path_valid = H5LTpath_valid(file_id, "/G1", TRUE)) != TRUE) {
     goto out;
   }
@@ -2112,6 +2119,20 @@ static int test_valid_path(void)
    * CHECK RELATIVE PATHS 
    ***************************************/
 
+  if( (group = H5Gopen2(file_id, "/", H5P_DEFAULT)) < 0)
+    goto out;
+  
+  if( (path_valid = H5LTpath_valid(group, "/", TRUE)) != TRUE) {
+    goto out;
+  }
+
+  if( (path_valid = H5LTpath_valid(group, "/", FALSE)) != TRUE) {
+    goto out;
+  }
+
+  if(H5Gclose(group)<0)
+    goto out;
+
   if( (group = H5Gopen2(file_id, "/G1", H5P_DEFAULT)) < 0)
     goto out;
 
diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c
index e2ca2b5..7003b26 100644
--- a/hl/test/test_packet.c
+++ b/hl/test/test_packet.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
@@ -95,8 +93,10 @@ make_particle_type(void)
   return FAIL;
 
  /* Insert fields. */
- string_type = H5Tcopy( H5T_C_S1 );
- H5Tset_size( string_type, (size_t)16 );
+ if ((string_type = H5Tcopy(H5T_C_S1)) < 0)
+     return FAIL;
+ if (H5Tset_size(string_type, (size_t)16) < 0)
+     return FAIL;
 
  if ( H5Tinsert(type_id, "Name", HOFFSET(particle_t, name) , string_type ) < 0 )
      return FAIL;
@@ -133,8 +133,10 @@ static int create_hl_table(hid_t fid)
     herr_t     status;
 
     /* Initialize the field field_type */
-    string_type = H5Tcopy( H5T_C_S1 );
-    H5Tset_size( string_type, (size_t)16 );
+    if ((string_type = H5Tcopy(H5T_C_S1)) < 0)
+        return FAIL;
+    if (H5Tset_size(string_type, (size_t)16) < 0)
+        return FAIL;
     field_type[0] = string_type;
     field_type[1] = H5T_NATIVE_INT;
     field_type[2] = H5T_NATIVE_INT;
@@ -152,12 +154,14 @@ static int create_hl_table(hid_t fid)
                         field_names, part_offset, field_type,
                         chunk_size, fill_data, compress, testPart  );
 
-if(status<0)
-  return FAIL;
-else
-  return SUCCEED;
-}
+  if (H5Tclose(string_type) < 0)
+    return FAIL;
 
+  if(status<0)
+    return FAIL;
+  else
+    return SUCCEED;
+}
 
 
 /*-------------------------------------------------------------------------
@@ -183,7 +187,8 @@ static int test_create_close(hid_t fid)
 
     /* Create the table */
     table = H5PTcreate_fl(fid, PT_NAME, part_t, (hsize_t)100, -1);
-    H5Tclose(part_t);
+    if (H5Tclose(part_t) < 0)
+	goto error;
     if( H5PTis_valid(table) < 0)
 	goto error;
     if( H5PTis_varlen(table) != 0)
@@ -248,7 +253,7 @@ static int test_append(hid_t fid)
 {
     herr_t err;
     hid_t table;
-    hsize_t count;
+    hsize_t count = 0;
 
     TESTING("H5PTappend");
 
@@ -458,7 +463,8 @@ static int    test_big_table(hid_t fid)
 
     /* Create a new table */
     table = H5PTcreate_fl(fid, "Packet Test Dataset2", part_t, (hsize_t)33, -1);
-    H5Tclose(part_t);
+    if (H5Tclose(part_t) < 0)
+        goto error;
     if( H5PTis_valid(table) < 0)
         goto error;
 
@@ -536,7 +542,8 @@ static int    test_opaque(hid_t fid)
 
     /* Create a new table */
     table = H5PTcreate_fl(fid, "Packet Test Dataset3", part_t, (hsize_t)100, -1);
-    H5Tclose(part_t);
+    if( H5Tclose(part_t) < 0)
+        goto error;
     if( H5PTis_valid(table) < 0)
         goto error;
 
@@ -743,9 +750,9 @@ static int test_rw_nonnative_dt(hid_t fid)
  /* Create a fixed-length packet table within the file */
  /* This table's "packets" will be simple integers and it will use no compression */
  if(H5Tget_order(H5T_NATIVE_INT) == H5T_ORDER_LE) {
-   ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32BE, (hsize_t)100, -1);
+   ptable = H5PTcreate(fid, "Packet Test Dataset, Non-native", H5T_STD_I32BE, (hsize_t)100, H5P_DEFAULT);
  } else {
-   ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, -1);
+   ptable = H5PTcreate(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, H5P_DEFAULT);
  }
  if(ptable == H5I_INVALID_HID)
         goto error;
@@ -973,7 +980,8 @@ int main(void)
         status = 1;
 
     /* Close the file */
-    H5Fclose(fid);
+    if (H5Fclose(fid) < 0)
+	status = 1;
 
     return status;
 }
diff --git a/hl/test/test_packet_vlen.c b/hl/test/test_packet_vlen.c
index b3b2fce..35bd43a 100644
--- a/hl/test/test_packet_vlen.c
+++ b/hl/test/test_packet_vlen.c
@@ -1,16 +1,13 @@
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
  * All rights reserved.                                                      *
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5hltest.h"
@@ -29,7 +26,6 @@
 #define PT_COMP_VLEN "Dataset with Compound Type of VL types"
 #define PT_VLEN_VLEN "Dataset with VL of VL types"
 #define PT_FIXED_LEN "Fixed-length Packet Table"
-#define SPACE3_RANK     1
 #define L1_INCM         16
 #define L2_INCM         8
 #define NAME_BUF_SIZE   80
@@ -61,7 +57,7 @@ static int test_VLof_atomic(void)
     hid_t   ptable=H5I_INVALID_HID;	/* Packet table identifier */
     hid_t   vltype=H5I_INVALID_HID;	/* Variable length datatype */
     hsize_t count;		/* Number of records in the table */
-    int     ii, jj;		/* Loop variables */
+    unsigned uu, vv;		/* Loop variables */
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     char    msg[80];		/* For error message */
@@ -70,15 +66,15 @@ static int test_VLof_atomic(void)
     TESTING3("        with vlen of atomic");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(unsigned int));
-        if (writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(unsigned int));
+        if (writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].len = ii+1;
-        for (jj=0; jj<(ii+1); jj++)
-	    ((unsigned int *)writeBuf[ii].p)[jj] = ii * 10 + jj;
+        writeBuf[uu].len = uu + 1;
+        for (vv = 0; vv < (uu + 1); vv++)
+	    ((unsigned int *)writeBuf[uu].p)[vv] = uu * 10 + vv;
     } /* end for */
 
     /* Open the file */
@@ -120,12 +116,12 @@ static int test_VLof_atomic(void)
     if (ret < 0)
 	goto error;
 
-    for (ii = 0; ii < NRECORDS; ii++)
-        for (jj=0; jj<(ii+1); jj++)
+    for (uu = 0; uu < NRECORDS; uu++)
+        for (vv = 0; vv < (uu + 1); vv++)
         {
-	    if (((unsigned int *)readBuf[ii].p)[jj] != ((unsigned int *)writeBuf[ii].p)[jj]) {
-		printf("Packet %d's value should be %d\n", ii, ((unsigned int *)writeBuf[ii].p)[jj]);
-		printf("Packet %d's value in readBuf is %d\n", ii, ((unsigned int *)readBuf[ii].p)[jj]);
+	    if (((unsigned int *)readBuf[uu].p)[vv] != ((unsigned int *)writeBuf[uu].p)[vv]) {
+		printf("Packet %u's value should be %d\n", uu, ((unsigned int *)writeBuf[uu].p)[vv]);
+		printf("Packet %u's value in readBuf is %d\n", uu, ((unsigned int *)readBuf[uu].p)[vv]);
 	    }
         }
 
@@ -150,6 +146,7 @@ static int test_VLof_atomic(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vltype > 0) H5Tclose(vltype);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -169,7 +166,7 @@ static int test_VLof_comptype(void)
 {
     /* Struct that the VL sequences are composed of */
     typedef struct {
-        int i;
+        unsigned u;
         float f;
     } VLcomp_t;
     hid_t   fid=H5I_INVALID_HID;	/* Test file identifier */
@@ -179,23 +176,23 @@ static int test_VLof_comptype(void)
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     hsize_t count;		/* Number of records in the table */
-    int     ii, jj;		/* Loop variables */
+    unsigned uu, vv;		/* Loop variables */
     char    msg[80];		/* For error message */
     herr_t ret;
 
     TESTING3("        with vlen of compound datatypes");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(VLcomp_t));
-        if(writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(VLcomp_t));
+        if(writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].len = ii+1;
-        for (jj=0; jj<(ii+1); jj++) {
-            ((VLcomp_t *)writeBuf[ii].p)[jj].i = ii+jj;
-            ((VLcomp_t *)writeBuf[ii].p)[jj].f = (float)((ii+jj)/3.0F);
+        writeBuf[uu].len = uu + 1;
+        for (vv = 0; vv < (uu + 1); vv++) {
+            ((VLcomp_t *)writeBuf[uu].p)[vv].u = uu + vv;
+            ((VLcomp_t *)writeBuf[uu].p)[vv].f = (float)(uu + vv) / 3.0F;
           } /* end for */
     } /* end for */
 
@@ -210,7 +207,7 @@ static int test_VLof_comptype(void)
 	goto error;
 
     /* Insert fields */
-    ret = H5Tinsert(cmptype, "i", HOFFSET(VLcomp_t, i), H5T_NATIVE_INT);
+    ret = H5Tinsert(cmptype, "u", HOFFSET(VLcomp_t, u), H5T_NATIVE_UINT);
     if (ret < 0)
 	goto error;
     ret = H5Tinsert(cmptype, "f", HOFFSET(VLcomp_t, f), H5T_NATIVE_FLOAT);
@@ -229,7 +226,9 @@ static int test_VLof_comptype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release the datatypes */
+    if (H5Tclose(cmptype) < 0)
+	goto error;
     if (H5Tclose(vltype) < 0)
 	goto error;
 
@@ -252,15 +251,15 @@ static int test_VLof_comptype(void)
 	goto error;
 
     /* Compare data read in */
-    for (ii = 0; ii < NRECORDS; ii++) {
-        if (writeBuf[ii].len != readBuf[ii].len) {
-            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].len=%d, readBuf[%d].len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].len,(int)ii,(int)readBuf[ii].len);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        if (writeBuf[uu].len != readBuf[uu].len) {
+            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%u].len=%d, readBuf[%u].len=%d\n", __LINE__, uu, (int)writeBuf[uu].len, uu, (int)readBuf[uu].len);
 	    continue;
 	} /* write len != read len */
 
-        for (jj=0; jj<(ii+1); jj++) {
-            if (((unsigned int *)writeBuf[ii].p)[jj] != ((unsigned int *)readBuf[ii].p)[jj] ) {
-                fprintf(stderr, "VL data values don't match!, writeBuf[ii].p[%d]=%d, readBuf[ii].p[%d]=%d\n",(int)jj, (int)((unsigned int *)writeBuf[ii].p)[jj], (int)jj, (int)((unsigned int *)readBuf[ii].p)[jj]);
+        for (vv = 0; vv < (uu + 1); vv++) {
+            if (((unsigned int *)writeBuf[uu].p)[vv] != ((unsigned int *)readBuf[uu].p)[vv] ) {
+                fprintf(stderr, "VL data values don't match!, writeBuf[uu].p[%d]=%d, readBuf[uu].p[%d]=%d\n", vv, (int)((unsigned int *)writeBuf[uu].p)[vv], vv, (int)((unsigned int *)readBuf[uu].p)[vv]);
                 continue;
 	    } /* write value != read value */
 	}
@@ -287,6 +286,8 @@ static int test_VLof_comptype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (cmptype > 0) H5Tclose(cmptype);
+    if (vltype > 0) H5Tclose(vltype);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -307,48 +308,46 @@ static int test_compound_VL_VLtype(void)
 {
     /* Struct that the VL sequences are composed of */
     typedef struct {
-        int i;
+        unsigned u;
         float f;
 	hvl_t v;
     } compVLVL_t;
     hid_t   fid=H5I_INVALID_HID;	/* Test file identifier */
-    hid_t   space=H5I_INVALID_HID;	/* Dataspace identifier */
     hid_t   ptable=H5I_INVALID_HID;	/* Packet table identifier */
     hid_t   vlatomic=H5I_INVALID_HID;	/* Variable length datatype */
     hid_t   vlofvl=H5I_INVALID_HID;	/* Variable length datatype */
     hid_t   comp_vlvl=H5I_INVALID_HID;	/* ID of a compound datatype containing 
 					   a VL of VL of atomic datatype */
-    hsize_t dims1[] = {NRECORDS};
     hsize_t count;		/* Number of records in the table */
     compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */
     compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */
     hvl_t   *t1, *t2;
-    int  ii, jj, kk;		/* Loop variables */
+    unsigned uu, vv, ww;	/* Loop variables */
     char    msg[80];		/* For error message */
     herr_t  ret;		/* Returned status from a callee */
 
     TESTING3("        with compound datatype containing vlen datatype");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].i = ii*10;
-        writeBuf[ii].f = (float)((ii*20)/3.0F);
-        writeBuf[ii].v.p = HDmalloc((ii+L1_INCM)*sizeof(hvl_t));
-        if (writeBuf[ii].v.p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].u = uu * 10;
+        writeBuf[uu].f = (float)(uu * 20) / 3.0F;
+        writeBuf[uu].v.p = HDmalloc((uu + L1_INCM) * sizeof(hvl_t));
+        if (writeBuf[uu].v.p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].v.len=ii+L1_INCM;
-        for (t1=(hvl_t *)((writeBuf[ii].v).p), jj=0; jj<(ii+L1_INCM); jj++, t1++)
+        writeBuf[uu].v.len = uu + L1_INCM;
+        for (t1 = (hvl_t *)((writeBuf[uu].v).p), vv = 0; vv < (uu + L1_INCM); vv++, t1++)
 	{
-            t1->p = HDmalloc((jj+L2_INCM)*sizeof(unsigned int));
+            t1->p = HDmalloc((vv + L2_INCM) * sizeof(unsigned int));
 	    if (t1->p == NULL) {
-		fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+		fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
 		goto error;
 	    }
-            t1->len = jj+L2_INCM;
-            for (kk=0; kk<jj+L2_INCM; kk++)
-                ((unsigned int*)t1->p)[kk] = ii*100 + jj*10 + kk;
+            t1->len = vv + L2_INCM;
+            for (ww = 0; ww < vv + L2_INCM; ww++)
+                ((unsigned int *)t1->p)[ww] = uu * 100 + vv * 10 + ww;
         }
     } /* end for */
 
@@ -357,11 +356,6 @@ static int test_compound_VL_VLtype(void)
     if (fid < 0)
 	goto error;
 
-    /* Create dataspace for datasets */
-    space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
-    if (space < 0)
-	goto error;
-
     /* Create a VL datatype of an atomic type */
     vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
     if (vlatomic < 0)
@@ -378,7 +372,7 @@ static int test_compound_VL_VLtype(void)
 	goto error;
 
     /* Insert fields: atomic, atomic, vlen */
-    ret = H5Tinsert(comp_vlvl, "i", HOFFSET(compVLVL_t, i), H5T_NATIVE_INT);
+    ret = H5Tinsert(comp_vlvl, "u", HOFFSET(compVLVL_t, u), H5T_NATIVE_UINT);
     if (ret < 0)
 	goto error;
     ret = H5Tinsert(comp_vlvl, "f", HOFFSET(compVLVL_t, f), H5T_NATIVE_FLOAT);
@@ -395,7 +389,11 @@ static int test_compound_VL_VLtype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release datatypes */
+    if (H5Tclose(vlatomic) < 0)
+	goto error;
+    if (H5Tclose(vlofvl) < 0)
+	goto error;
     if (H5Tclose(comp_vlvl) < 0)
 	goto error;
 
@@ -418,29 +416,29 @@ static int test_compound_VL_VLtype(void)
 	goto error;
 
     /* Compare data read in */
-    for (ii = 0; ii < NRECORDS; ii++) {
-        if (writeBuf[ii].i != readBuf[ii].i) {
-            fprintf(stderr, "Integer components don't match!, writeBuf[%d].i=%d, readBuf[%d].i=%d\n",(int)ii,(int)writeBuf[ii].i,(int)ii,(int)readBuf[ii].i);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        if (writeBuf[uu].u != readBuf[uu].u) {
+            fprintf(stderr, "Integer components don't match!, writeBuf[%u].u=%u, readBuf[%u].u=%u\n", uu, writeBuf[uu].u, uu, readBuf[uu].u);
             continue;
         } /* end if */
-        if (!H5_FLT_ABS_EQUAL(writeBuf[ii].f,readBuf[ii].f)) {
-            fprintf(stderr, "Float components don't match!, writeBuf[%d].f=%f, readBuf[%d].f=%f\n",(int)ii,(double)writeBuf[ii].f,(int)ii,(double)readBuf[ii].f);
+        if (!H5_FLT_ABS_EQUAL(writeBuf[uu].f,readBuf[uu].f)) {
+            fprintf(stderr, "Float components don't match!, writeBuf[%u].f=%f, readBuf[%u].f=%f\n", uu, (double)writeBuf[uu].f, uu, (double)readBuf[uu].f);
             continue;
         } /* end if */
 
-        if (writeBuf[ii].v.len != readBuf[ii].v.len) {
-            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%d, readBuf[%d].v.len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].v.len,(int)ii,(int)readBuf[ii].v.len);
+        if (writeBuf[uu].v.len != readBuf[uu].v.len) {
+            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%zu, readBuf[%d].v.len=%zu\n", __LINE__, uu, writeBuf[uu].v.len, uu, readBuf[uu].v.len);
             continue;
         } /* end if */
 
-        for (t1=(hvl_t *)(writeBuf[ii].v.p), t2=(hvl_t *)(readBuf[ii].v.p), jj=0; (size_t)jj<readBuf[ii].v.len; jj++, t1++, t2++) {
+        for (t1 = (hvl_t *)(writeBuf[uu].v.p), t2 = (hvl_t *)(readBuf[uu].v.p), vv = 0; (size_t)vv < readBuf[uu].v.len; vv++, t1++, t2++) {
             if (t1->len != t2->len) {
-                fprintf(stderr, "%d: VL data length don't match!, ii=%d, jj=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)ii,(int)jj,(int)t1->len,(int)t2->len);
+                fprintf(stderr, "%d: VL data length don't match!, uu=%u, vv=%u, t1->len=%zu, t2->len=%zu\n", __LINE__, uu, vv, t1->len, t2->len);
                 continue;
             } /* end if */
-            for (kk=0; (size_t)kk<t2->len; kk++) {
-                if (((unsigned int *)t1->p)[kk] != ((unsigned int *)t2->p)[kk] ) {
-                    fprintf(stderr, "VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n",(int)kk, (int)((unsigned int *)t1->p)[kk], (int)kk, (int)((unsigned int *)t2->p)[kk]);
+            for (ww = 0; (size_t)ww < t2->len; ww++) {
+                if (((unsigned int *)t1->p)[ww] != ((unsigned int *)t2->p)[ww] ) {
+                    fprintf(stderr, "VL data values don't match!, t1->p[%u]=%u, t2->p[%u]=%u\n", ww, ((unsigned int *)t1->p)[ww], ww, ((unsigned int *)t2->p)[ww]);
                     continue;
                 } /* end if */
             } /* end for */
@@ -460,12 +458,6 @@ static int test_compound_VL_VLtype(void)
     if (ret < 0)
 	goto error;
 
-    /* Release datatypes */
-    if (H5Tclose(vlatomic) < 0)
-	goto error;
-    if (H5Tclose(vlofvl) < 0)
-	goto error;
-
     /* Close the file */
     if (H5Fclose(fid) < 0)
 	goto error;
@@ -474,6 +466,9 @@ static int test_compound_VL_VLtype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vlatomic > 0) H5Tclose(vlatomic);
+    if (vlofvl > 0) H5Tclose(vlofvl);
+    if (comp_vlvl > 0) H5Tclose(comp_vlvl);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -498,7 +493,7 @@ static int test_VLof_VLtype(void)
     hid_t   vlofvl=H5I_INVALID_HID;	/* VL datatype of VL datatypes */
     hsize_t count;		/* Number of records in the table */
     hvl_t   *t1;		/* pointer to advance */
-    int     ii, jj, kk;		/* Loop variables */
+    unsigned uu, vv, ww;	/* Loop variables */
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     char    msg[80];		/* For error message */
@@ -507,23 +502,23 @@ static int test_VLof_VLtype(void)
     TESTING3("        with vlen datatype of vlen datatype");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii< NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(hvl_t));
-        if (writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(hvl_t));
+        if (writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
         } /* end if */
-        writeBuf[ii].len = ii+1;
-        for (t1=(hvl_t *)(writeBuf[ii].p), jj=0; jj<(ii+1); jj++, t1++)
+        writeBuf[uu].len = uu + 1;
+        for (t1=(hvl_t *)(writeBuf[uu].p), vv = 0; vv < (uu + 1); vv++, t1++)
 	{
-            t1->p = HDmalloc((jj+1)*sizeof(unsigned int));
+            t1->p = HDmalloc((vv + 1) * sizeof(unsigned int));
 	    if (t1->p == NULL) {
-		fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+		fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
 		goto error;
 	    }
-            t1->len = jj+1;
-            for (kk=0; kk<(jj+1); kk++)
-                ((unsigned int *)t1->p)[kk] = ii*100+jj*10+kk;
+            t1->len = vv * 1;
+            for (ww = 0; ww < (vv * 1); ww++)
+                ((unsigned int *)t1->p)[ww] = uu * 100 + vv * 10 + ww;
         } /* end for */
     } /* end for */
 
@@ -548,7 +543,9 @@ static int test_VLof_VLtype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release datatypes */
+    if (H5Tclose(vlatomic) < 0)
+	goto error;
     if (H5Tclose(vlofvl) < 0)
 	goto error;
 
@@ -591,6 +588,8 @@ static int test_VLof_VLtype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vlatomic > 0) H5Tclose(vlatomic);
+    if (vlofvl > 0) H5Tclose(vlofvl);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -772,6 +771,10 @@ static int adding_attribute(hid_t fid, const char *table_name, const char *attr_
     if (H5Aclose(attr_id) < 0)
 	goto error;
 
+    /* Close the dataspace */
+    if (H5Sclose(space_id) < 0)
+	goto error;
+
     /* Close the packet table */
     if (H5PTclose(ptable) < 0)
 	goto error;
@@ -779,6 +782,8 @@ static int adding_attribute(hid_t fid, const char *table_name, const char *attr_
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (attr_id > 0) H5Aclose(attr_id);
+    if (space_id > 0) H5Sclose(space_id);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     return ret;
 } /* adding_attribute */
@@ -793,19 +798,12 @@ error: /* An error has occurred.  Clean up and exit. */
 static herr_t verify_attribute(hid_t fid, const char *table_name, const char *attr_name)
 {
     hid_t ptable=H5I_INVALID_HID;	/* Packet table identifier */
-    hid_t space_id=H5I_INVALID_HID;	/* Dataspace for the attribute */
     hid_t attr_id=H5I_INVALID_HID;	/* Attribute identifier */
     hid_t dset_id=H5I_INVALID_HID;	/* Dataset associated with the pt */
-    hsize_t dims[] = {ATTR_DIM};	/* Dimensions for dataspace */
     int read_data[ATTR_DIM];		/* Output buffer */
     int ii;
     herr_t ret = FAIL;		/* Returned status from a callee */
 
-    /* Create dataspace for attribute */
-    space_id = H5Screate_simple(ATTR_RANK, dims, NULL);
-    if (space_id < 0)
-	goto error;
-
     /* Open the named packet table */
     ptable = H5PTopen(fid, table_name);
     if (ptable < 0)
@@ -908,7 +906,7 @@ static int test_attributes(void)
     return(ret);
 
 error: /* An error has occurred.  Clean up and exit. */
-    H5Fclose(fid);
+    if (fid > 0) H5Fclose(fid);
     H5_FAILED();
     return FAIL;
 } /* test_attributes */
@@ -930,9 +928,8 @@ error: /* An error has occurred.  Clean up and exit. */
  * 2016/01/27 -BMR
  *-------------------------------------------------------------------------
  */
-static herr_t verify_accessors(const char *table_name, herr_t expected_value)
+static herr_t verify_accessors(hid_t fid, const char *table_name, herr_t expected_value)
 {
-    hid_t fid=H5I_INVALID_HID;		/* File identifier */
     hid_t ptable=H5I_INVALID_HID;	/* Packet table identifier */
     hid_t dset_id=H5I_INVALID_HID;	/* Dataset associated with the pt */
     hid_t dtype_id=H5I_INVALID_HID;	/* Dataset identifier */
@@ -941,11 +938,6 @@ static herr_t verify_accessors(const char *table_name, herr_t expected_value)
     herr_t  is_varlen = 0;
     herr_t ret = FAIL;		/* Returned status from a callee */
 
-    /* Open the file. */
-    fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
-    if (fid < 0)
-	goto error;
-
     /* Open the named packet table. */
     ptable = H5PTopen(fid, table_name);
     if (ptable < 0)
@@ -959,6 +951,8 @@ static herr_t verify_accessors(const char *table_name, herr_t expected_value)
     /* Check if the packet table's name matches its associated dataset's. */
     *buf = '\0';
     name_size = H5Iget_name(dset_id, (char*)buf, NAME_BUF_SIZE);
+    if (name_size < 0)
+	goto error;
     VERIFY(HDstrcmp(buf, table_name), "Names of dataset and packet table don't match");
 
     /* Get the packet table's datatype ID */
@@ -992,7 +986,8 @@ static herr_t verify_accessors(const char *table_name, herr_t expected_value)
 
 error: /* An error has occurred.  Clean up and exit. */
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
-    return ret;
+    H5_FAILED();
+    return FAIL;
 } /* verify_accessors */
 
 /*-------------------------------------------------------------------------
@@ -1008,7 +1003,6 @@ error: /* An error has occurred.  Clean up and exit. */
 static int test_accessors(void)
 {
     hid_t fid=H5I_INVALID_HID;		/* File identifier */
-    hid_t ptable=H5I_INVALID_HID;	/* File identifier */
     herr_t ret = FAIL;		/* Returned status from a callee */
 
     TESTING("accessor functions");
@@ -1018,11 +1012,11 @@ static int test_accessors(void)
     if (fid < 0)
 	goto error;
 
-    ret = verify_accessors(PT_VLEN_ATOMIC, TRUE);
+    ret = verify_accessors(fid, PT_VLEN_ATOMIC, TRUE);
     if (ret < 0)
 	goto error;
 
-    ret = verify_accessors(PT_FIXED_LEN, FALSE);
+    ret = verify_accessors(fid, PT_FIXED_LEN, FALSE);
     if (ret < 0)
 	goto error;
 
@@ -1034,7 +1028,6 @@ static int test_accessors(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
-    if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5_FAILED();
     return FAIL;
@@ -1060,7 +1053,7 @@ static int testfl_VLof_atomic(void)
     hid_t   ptable=H5I_INVALID_HID;	/* Packet table identifier */
     hid_t   vltype=H5I_INVALID_HID;	/* Variable length datatype */
     hsize_t count;		/* Number of records in the table */
-    int     ii, jj;		/* Loop variables */
+    unsigned uu, vv;		/* Loop variables */
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     char    msg[80];		/* For error message */
@@ -1069,15 +1062,15 @@ static int testfl_VLof_atomic(void)
     TESTING3("        with vlen of atomic");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(unsigned int));
-        if (writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(unsigned int));
+        if (writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].len = ii+1;
-        for (jj=0; jj<(ii+1); jj++)
-	    ((unsigned int *)writeBuf[ii].p)[jj] = ii * 10 + jj;
+        writeBuf[uu].len = uu + 1;
+        for (vv = 0; vv < (uu + 1); vv++)
+	    ((unsigned int *)writeBuf[uu].p)[vv] = uu * 10 + vv;
     } /* end for */
 
     /* Open the file */
@@ -1119,12 +1112,12 @@ static int testfl_VLof_atomic(void)
     if (ret < 0)
 	goto error;
 
-    for (ii = 0; ii < NRECORDS; ii++)
-        for (jj=0; jj<(ii+1); jj++)
+    for (uu = 0; uu < NRECORDS; uu++)
+        for (vv = 0; vv < (uu + 1); vv++)
         {
-	    if (((unsigned int *)readBuf[ii].p)[jj] != ((unsigned int *)writeBuf[ii].p)[jj]) {
-		printf("Packet %d's value should be %d\n", ii, ((unsigned int *)writeBuf[ii].p)[jj]);
-		printf("Packet %d's value in readBuf is %d\n", ii, ((unsigned int *)readBuf[ii].p)[jj]);
+	    if (((unsigned int *)readBuf[uu].p)[vv] != ((unsigned int *)writeBuf[uu].p)[vv]) {
+		printf("Packet %d's value should be %d\n", uu, ((unsigned int *)writeBuf[uu].p)[vv]);
+		printf("Packet %d's value in readBuf is %d\n", uu, ((unsigned int *)readBuf[uu].p)[vv]);
 	    }
         }
 
@@ -1149,6 +1142,7 @@ static int testfl_VLof_atomic(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vltype > 0) H5Tclose(vltype);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -1168,7 +1162,7 @@ static int testfl_VLof_comptype(void)
 {
     /* Struct that the VL sequences are composed of */
     typedef struct {
-        int i;
+        unsigned u;
         float f;
     } VLcomp_t;
     hid_t   fid=H5I_INVALID_HID;	/* Test file identifier */
@@ -1178,23 +1172,23 @@ static int testfl_VLof_comptype(void)
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     hsize_t count;		/* Number of records in the table */
-    int     ii, jj;		/* Loop variables */
+    unsigned uu, vv;		/* Loop variables */
     char    msg[80];		/* For error message */
     herr_t ret;
 
     TESTING3("        with vlen of compound datatypes");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(VLcomp_t));
-        if(writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(VLcomp_t));
+        if(writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].len = ii+1;
-        for (jj=0; jj<(ii+1); jj++) {
-            ((VLcomp_t *)writeBuf[ii].p)[jj].i = ii+jj;
-            ((VLcomp_t *)writeBuf[ii].p)[jj].f = (float)((ii+jj)/3.0F);
+        writeBuf[uu].len = uu + 1;
+        for (vv = 0; vv < (uu + 1); vv++) {
+            ((VLcomp_t *)writeBuf[uu].p)[vv].u = uu + vv;
+            ((VLcomp_t *)writeBuf[uu].p)[vv].f = (float)(uu + vv) / 3.0F;
           } /* end for */
     } /* end for */
 
@@ -1209,7 +1203,7 @@ static int testfl_VLof_comptype(void)
 	goto error;
 
     /* Insert fields */
-    ret = H5Tinsert(cmptype, "i", HOFFSET(VLcomp_t, i), H5T_NATIVE_INT);
+    ret = H5Tinsert(cmptype, "u", HOFFSET(VLcomp_t, u), H5T_NATIVE_UINT);
     if (ret < 0)
 	goto error;
     ret = H5Tinsert(cmptype, "f", HOFFSET(VLcomp_t, f), H5T_NATIVE_FLOAT);
@@ -1228,7 +1222,9 @@ static int testfl_VLof_comptype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release the datatypes */
+    if (H5Tclose(cmptype) < 0)
+	goto error;
     if (H5Tclose(vltype) < 0)
 	goto error;
 
@@ -1251,15 +1247,15 @@ static int testfl_VLof_comptype(void)
 	goto error;
 
     /* Compare data read in */
-    for (ii = 0; ii < NRECORDS; ii++) {
-        if (writeBuf[ii].len != readBuf[ii].len) {
-            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].len=%d, readBuf[%d].len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].len,(int)ii,(int)readBuf[ii].len);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        if (writeBuf[uu].len != readBuf[uu].len) {
+            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%u].len=%zu, readBuf[%u].len=%zu\n",__LINE__, uu, writeBuf[uu].len, uu, readBuf[uu].len);
 	    continue;
 	} /* write len != read len */
 
-        for (jj=0; jj<(ii+1); jj++) {
-            if (((unsigned int *)writeBuf[ii].p)[jj] != ((unsigned int *)readBuf[ii].p)[jj] ) {
-                fprintf(stderr, "VL data values don't match!, writeBuf[ii].p[%d]=%d, readBuf[ii].p[%d]=%d\n",(int)jj, (int)((unsigned int *)writeBuf[ii].p)[jj], (int)jj, (int)((unsigned int *)readBuf[ii].p)[jj]);
+        for (vv = 0; vv < (uu + 1); vv++) {
+            if (((unsigned int *)writeBuf[uu].p)[vv] != ((unsigned int *)readBuf[uu].p)[vv] ) {
+                fprintf(stderr, "VL data values don't match!, writeBuf[uu].p[%u]=%u, readBuf[uu].p[%u]=%u\n", vv, ((unsigned int *)writeBuf[uu].p)[vv], vv, ((unsigned int *)readBuf[uu].p)[vv]);
                 continue;
 	    } /* write value != read value */
 	}
@@ -1286,6 +1282,8 @@ static int testfl_VLof_comptype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (cmptype > 0) H5Tclose(cmptype);
+    if (vltype > 0) H5Tclose(vltype);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -1306,48 +1304,46 @@ static int testfl_compound_VL_VLtype(void)
 {
     /* Struct that the VL sequences are composed of */
     typedef struct {
-        int i;
+        unsigned u;
         float f;
 	hvl_t v;
     } compVLVL_t;
     hid_t   fid=H5I_INVALID_HID;	/* Test file identifier */
-    hid_t   space=H5I_INVALID_HID;	/* Dataspace identifier */
     hid_t   ptable=H5I_INVALID_HID;	/* Packet table identifier */
     hid_t   vlatomic=H5I_INVALID_HID;	/* Variable length datatype */
     hid_t   vlofvl=H5I_INVALID_HID;	/* Variable length datatype */
     hid_t   comp_vlvl=H5I_INVALID_HID;	/* ID of a compound datatype containing 
 					   a VL of VL of atomic datatype */
-    hsize_t dims1[] = {NRECORDS};
     hsize_t count;		/* Number of records in the table */
     compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */
     compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */
     hvl_t   *t1, *t2;
-    int  ii, jj, kk;		/* Loop variables */
+    unsigned uu, vv, ww;	/* Loop variables */
     char    msg[80];		/* For error message */
     herr_t  ret;		/* Returned status from a callee */
 
     TESTING3("        with compound datatype containing vlen datatype");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii<NRECORDS; ii++) {
-        writeBuf[ii].i = ii*10;
-        writeBuf[ii].f = (float)((ii*20)/3.0F);
-        writeBuf[ii].v.p = HDmalloc((ii+L1_INCM)*sizeof(hvl_t));
-        if (writeBuf[ii].v.p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].u = uu * 10;
+        writeBuf[uu].f = (float)(uu * 20) / 3.0F;
+        writeBuf[uu].v.p = HDmalloc((uu + L1_INCM) * sizeof(hvl_t));
+        if (writeBuf[uu].v.p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
 	}
-        writeBuf[ii].v.len=ii+L1_INCM;
-        for (t1=(hvl_t *)((writeBuf[ii].v).p), jj=0; jj<(ii+L1_INCM); jj++, t1++)
+        writeBuf[uu].v.len = uu + L1_INCM;
+        for (t1 = (hvl_t *)((writeBuf[uu].v).p), vv = 0; vv < (uu + L1_INCM); vv++, t1++)
 	{
-            t1->p = HDmalloc((jj+L2_INCM)*sizeof(unsigned int));
+            t1->p = HDmalloc((vv + L2_INCM) * sizeof(unsigned int));
 	    if (t1->p == NULL) {
-		fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+		fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
 		goto error;
 	    }
-            t1->len = jj+L2_INCM;
-            for (kk=0; kk<jj+L2_INCM; kk++)
-                ((unsigned int*)t1->p)[kk] = ii*100 + jj*10 + kk;
+            t1->len = vv + L2_INCM;
+            for (ww = 0; ww < vv + L2_INCM; ww++)
+                ((unsigned int*)t1->p)[ww] = uu * 100 + vv * 10 + ww;
         }
     } /* end for */
 
@@ -1356,11 +1352,6 @@ static int testfl_compound_VL_VLtype(void)
     if (fid < 0)
 	goto error;
 
-    /* Create dataspace for datasets */
-    space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
-    if (space < 0)
-	goto error;
-
     /* Create a VL datatype of an atomic type */
     vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
     if (vlatomic < 0)
@@ -1377,7 +1368,7 @@ static int testfl_compound_VL_VLtype(void)
 	goto error;
 
     /* Insert fields: atomic, atomic, vlen */
-    ret = H5Tinsert(comp_vlvl, "i", HOFFSET(compVLVL_t, i), H5T_NATIVE_INT);
+    ret = H5Tinsert(comp_vlvl, "u", HOFFSET(compVLVL_t, u), H5T_NATIVE_UINT);
     if (ret < 0)
 	goto error;
     ret = H5Tinsert(comp_vlvl, "f", HOFFSET(compVLVL_t, f), H5T_NATIVE_FLOAT);
@@ -1394,7 +1385,11 @@ static int testfl_compound_VL_VLtype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release datatypes */
+    if (H5Tclose(vlatomic) < 0)
+	goto error;
+    if (H5Tclose(vlofvl) < 0)
+	goto error;
     if (H5Tclose(comp_vlvl) < 0)
 	goto error;
 
@@ -1417,29 +1412,29 @@ static int testfl_compound_VL_VLtype(void)
 	goto error;
 
     /* Compare data read in */
-    for (ii = 0; ii < NRECORDS; ii++) {
-        if (writeBuf[ii].i != readBuf[ii].i) {
-            fprintf(stderr, "Integer components don't match!, writeBuf[%d].i=%d, readBuf[%d].i=%d\n",(int)ii,(int)writeBuf[ii].i,(int)ii,(int)readBuf[ii].i);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        if (writeBuf[uu].u != readBuf[uu].u) {
+            fprintf(stderr, "Integer components don't match!, writeBuf[%u].u=%u, readBuf[%u].u=%u\n", uu, writeBuf[uu].u, uu, readBuf[uu].u);
             continue;
         } /* end if */
-        if (!H5_FLT_ABS_EQUAL(writeBuf[ii].f,readBuf[ii].f)) {
-            fprintf(stderr, "Float components don't match!, writeBuf[%d].f=%f, readBuf[%d].f=%f\n",(int)ii,(double)writeBuf[ii].f,(int)ii,(double)readBuf[ii].f);
+        if (!H5_FLT_ABS_EQUAL(writeBuf[uu].f, readBuf[uu].f)) {
+            fprintf(stderr, "Float components don't match!, writeBuf[%u].f=%f, readBuf[%u].f=%f\n", uu, (double)writeBuf[uu].f, uu, (double)readBuf[uu].f);
             continue;
         } /* end if */
 
-        if (writeBuf[ii].v.len != readBuf[ii].v.len) {
-            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%d, readBuf[%d].v.len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].v.len,(int)ii,(int)readBuf[ii].v.len);
+        if (writeBuf[uu].v.len != readBuf[uu].v.len) {
+            fprintf(stderr, "%d: VL data length don't match!, writeBuf[%u].v.len=%zu, readBuf[%u].v.len=%zu\n", __LINE__, uu, writeBuf[uu].v.len, uu, readBuf[uu].v.len);
             continue;
         } /* end if */
 
-        for (t1=(hvl_t *)(writeBuf[ii].v.p), t2=(hvl_t *)(readBuf[ii].v.p), jj=0; (size_t)jj<readBuf[ii].v.len; jj++, t1++, t2++) {
+        for (t1 = (hvl_t *)(writeBuf[uu].v.p), t2 = (hvl_t *)(readBuf[uu].v.p), vv = 0; (size_t)vv < readBuf[uu].v.len; vv++, t1++, t2++) {
             if (t1->len != t2->len) {
-                fprintf(stderr, "%d: VL data length don't match!, ii=%d, jj=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)ii,(int)jj,(int)t1->len,(int)t2->len);
+                fprintf(stderr, "%d: VL data length don't match!, uu=%u, vv=%u, t1->len=%zu, t2->len=%zu\n", __LINE__, uu, vv, t1->len, t2->len);
                 continue;
             } /* end if */
-            for (kk=0; (size_t)kk<t2->len; kk++) {
-                if (((unsigned int *)t1->p)[kk] != ((unsigned int *)t2->p)[kk] ) {
-                    fprintf(stderr, "VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n",(int)kk, (int)((unsigned int *)t1->p)[kk], (int)kk, (int)((unsigned int *)t2->p)[kk]);
+            for (ww = 0; (size_t)ww < t2->len; ww++) {
+                if (((unsigned int *)t1->p)[ww] != ((unsigned int *)t2->p)[ww] ) {
+                    fprintf(stderr, "VL data values don't match!, t1->p[%u]=%u, t2->p[%u]=%u\n", ww, ((unsigned int *)t1->p)[ww], ww, ((unsigned int *)t2->p)[ww]);
                     continue;
                 } /* end if */
             } /* end for */
@@ -1459,12 +1454,6 @@ static int testfl_compound_VL_VLtype(void)
     if (ret < 0)
 	goto error;
 
-    /* Release datatypes */
-    if (H5Tclose(vlatomic) < 0)
-	goto error;
-    if (H5Tclose(vlofvl) < 0)
-	goto error;
-
     /* Close the file */
     if (H5Fclose(fid) < 0)
 	goto error;
@@ -1473,6 +1462,9 @@ static int testfl_compound_VL_VLtype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vlatomic > 0) H5Tclose(vlatomic);
+    if (vlofvl > 0) H5Tclose(vlofvl);
+    if (comp_vlvl > 0) H5Tclose(comp_vlvl);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -1497,7 +1489,7 @@ static int testfl_VLof_VLtype(void)
     hid_t   vlofvl=H5I_INVALID_HID;	/* VL datatype of VL datatypes */
     hsize_t count;		/* Number of records in the table */
     hvl_t   *t1;		/* pointer to advance */
-    int     ii, jj, kk;		/* Loop variables */
+    unsigned uu, vv, ww;	/* Loop variables */
     hvl_t   writeBuf[NRECORDS];	/* Buffer to hold data to be written */
     hvl_t   readBuf[NRECORDS];	/* Buffer to hold read data */
     char    msg[80];		/* For error message */
@@ -1506,23 +1498,23 @@ static int testfl_VLof_VLtype(void)
     TESTING3("        with vlen datatype of vlen datatype");
 
     /* Allocate and initialize VL data to write (copied from C test) */
-    for (ii=0; ii< NRECORDS; ii++) {
-        writeBuf[ii].p = HDmalloc((ii+1)*sizeof(hvl_t));
-        if (writeBuf[ii].p == NULL) {
-            fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+    for (uu = 0; uu < NRECORDS; uu++) {
+        writeBuf[uu].p = HDmalloc((uu + 1) * sizeof(hvl_t));
+        if (writeBuf[uu].p == NULL) {
+            fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
             goto error;
         } /* end if */
-        writeBuf[ii].len = ii+1;
-        for (t1=(hvl_t *)(writeBuf[ii].p), jj=0; jj<(ii+1); jj++, t1++)
+        writeBuf[uu].len = uu + 1;
+        for (t1 = (hvl_t *)(writeBuf[uu].p), vv = 0; vv < (uu + 1); vv++, t1++)
 	{
-            t1->p = HDmalloc((jj+1)*sizeof(unsigned int));
+            t1->p = HDmalloc((vv + 1) * sizeof(unsigned int));
 	    if (t1->p == NULL) {
-		fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+		fprintf(stderr, "Cannot allocate memory for VL data! uu=%u\n", uu);
 		goto error;
 	    }
-            t1->len = jj+1;
-            for (kk=0; kk<(jj+1); kk++)
-                ((unsigned int *)t1->p)[kk] = ii*100+jj*10+kk;
+            t1->len = vv + 1;
+            for (ww = 0; ww < (vv + 1); ww++)
+                ((unsigned int *)t1->p)[ww] = uu * 100 + vv * 10 + ww;
         } /* end for */
     } /* end for */
 
@@ -1547,7 +1539,9 @@ static int testfl_VLof_VLtype(void)
     if (ptable == H5I_INVALID_HID)
 	goto error;
 
-    /* Close the vlen datatype */
+    /* Release datatypes */
+    if (H5Tclose(vlatomic) < 0)
+	goto error;
     if (H5Tclose(vlofvl) < 0)
 	goto error;
 
@@ -1590,6 +1584,8 @@ static int testfl_VLof_VLtype(void)
     return SUCCEED;
 
 error: /* An error has occurred.  Clean up and exit. */
+    if (vlatomic > 0) H5Tclose(vlatomic);
+    if (vlofvl > 0) H5Tclose(vlofvl);
     if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
     if (fid > 0) H5Fclose(fid);
     H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
@@ -1653,7 +1649,6 @@ int test_packet_table_with_varlen(void)
     if (test_accessors() < 0)
 	status = FAIL;
 
-
 /**************************************************************************
 	Calling test functions for deprecated function H5PTcreate_fl
 	Mar 2016, -BMR
diff --git a/hl/test/test_table.c b/hl/test/test_table.c
index c9c3c19..0215697 100644
--- a/hl/test/test_table.c
+++ b/hl/test/test_table.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
diff --git a/hl/test/test_table_be.h5 b/hl/test/test_table_be.h5
index 970018e..3639695 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 1fcd75b..d22dce3 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 ee5b532..6c330fd 100644
Binary files a/hl/test/test_table_le.h5 and b/hl/test/test_table_le.h5 differ
diff --git a/hl/tools/CMakeLists.txt b/hl/tools/CMakeLists.txt
index 8384b59..9536517 100644
--- a/hl/tools/CMakeLists.txt
+++ b/hl/tools/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_TOOLS C CXX)
 
 add_subdirectory (${HDF5_HL_TOOLS_SOURCE_DIR}/gif2h5 ${HDF5_HL_TOOLS_BINARY_DIR}/gif2h5)
diff --git a/hl/tools/COPYING b/hl/tools/COPYING
index 6903daf..6497ace 100644
--- a/hl/tools/COPYING
+++ b/hl/tools/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/hl/tools/Makefile.am b/hl/tools/Makefile.am
index 7fab05f..5d814df 100644
--- a/hl/tools/Makefile.am
+++ b/hl/tools/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -21,8 +19,6 @@
 
 include $(top_srcdir)/config/commence.am
 
-CONFIG=ordered
-
 # All subdirectories
 SUBDIRS=gif2h5 h5watch
 
diff --git a/hl/tools/Makefile.in b/hl/tools/Makefile.in
index 0c2dd4a..8fbd45b 100644
--- a/hl/tools/Makefile.in
+++ b/hl/tools/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tools HDF5 Makefile(.in)
 #
@@ -462,6 +460,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -583,6 +582,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -728,23 +728,24 @@ 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 h5watch
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1230,6 +1231,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1237,7 +1239,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/tools/gif2h5/CMakeLists.txt b/hl/tools/gif2h5/CMakeLists.txt
index 3a55501..9d7a406 100644
--- a/hl/tools/gif2h5/CMakeLists.txt
+++ b/hl/tools/gif2h5/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_TOOLS_GIF2H5)
 
 #-----------------------------------------------------------------------------
@@ -22,6 +22,7 @@ TARGET_NAMING (gif2h5 STATIC)
 TARGET_C_PROPERTIES (gif2h5 STATIC " " " ")
 target_link_libraries (gif2h5 ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
 set_target_properties (gif2h5 PROPERTIES FOLDER tools/hl)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};gif2h5")
 
 #-- Add h52gif program
 set (hdf2gif_SOURCES
@@ -33,6 +34,7 @@ TARGET_NAMING (h52gif STATIC)
 TARGET_C_PROPERTIES (h52gif STATIC " " " ")
 target_link_libraries (h52gif ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
 set_target_properties (h52gif PROPERTIES FOLDER tools/hl)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h52gif")
 
 if (BUILD_TESTING)
   # --------------------------------------------------------------------
@@ -48,17 +50,21 @@ if (BUILD_TESTING)
       set_target_properties (hl_h52gifgentest PROPERTIES FOLDER generator/tools/hl)
 
 #      add_test (NAME hl_h52gifgentest COMMAND $<TARGET_FILE:hl_h52gifgentest>)
-  endif (HDF5_BUILD_GENERATORS)
+  endif ()
 
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
 #-----------------------------------------------------------------------------
-install (
-    TARGETS
-        gif2h5
-        h52gif
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hltoolsapplications
-)
+if (HDF5_EXPORTED_TARGETS)
+  install (
+      TARGETS
+          gif2h5
+          h52gif
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hltoolsapplications
+  )
+endif ()
diff --git a/hl/tools/gif2h5/CMakeTests.cmake b/hl/tools/gif2h5/CMakeTests.cmake
index 832d2df..61c004e 100644
--- a/hl/tools/gif2h5/CMakeTests.cmake
+++ b/hl/tools/gif2h5/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -11,27 +22,10 @@ file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
 #
 # copy test files from source to build dir
 #
-
-add_custom_command (
-    TARGET     gif2h5
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/image1.gif ${PROJECT_BINARY_DIR}/testfiles/image1.gif
-)
-
-add_custom_command (
-    TARGET     h52gif
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/h52giftst.h5 ${PROJECT_BINARY_DIR}/testfiles/h52giftst.h5
-)
-
-add_custom_command (
-    TARGET     h52gif
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/ex_image2.h5 ${PROJECT_BINARY_DIR}/testfiles/ex_image2.h5
-)
+HDFTEST_COPY_FILE("${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/image1.gif" "${PROJECT_BINARY_DIR}/testfiles/image1.gif" "gif2h5_files")
+HDFTEST_COPY_FILE("${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/h52giftst.h5" "${PROJECT_BINARY_DIR}/testfiles/h52giftst.h5" "gif2h5_files")
+HDFTEST_COPY_FILE("${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/testfiles/ex_image2.h5" "${PROJECT_BINARY_DIR}/testfiles/ex_image2.h5" "gif2h5_files")
+add_custom_target(gif2h5_files ALL COMMENT "Copying files needed by gif2h5 tests" DEPENDS ${gif2h5_files_list})
 
 # Remove any output file left over from previous test run
 add_test (
@@ -45,14 +39,18 @@ add_test (
 )
 
 add_test (NAME HL_TOOLS_gif2h5 COMMAND $<TARGET_FILE:gif2h5> testfiles/image1.gif image1.h5)
+set_tests_properties (HL_TOOLS_gif2h5 PROPERTIES DEPENDS HL_TOOLS-clear-objects)
 
 add_test (NAME HL_TOOLS_h52gif COMMAND $<TARGET_FILE:h52gif> testfiles/h52giftst.h5 image1.gif -i image)
+set_tests_properties (HL_TOOLS_h52gif PROPERTIES DEPENDS HL_TOOLS-clear-objects)
 
 add_test (NAME HL_TOOLS_h52gif_none COMMAND $<TARGET_FILE:h52gif> testfiles/h52giftst.h5 image.gif -i nosuch_image)
 set_tests_properties (HL_TOOLS_h52gif_none PROPERTIES WILL_FAIL "true")
+set_tests_properties (HL_TOOLS_h52gif_none PROPERTIES DEPENDS HL_TOOLS-clear-objects)
 
 #add_test (NAME HL_TOOLS_h52gifpal COMMAND $<TARGET_FILE:h52gif> testfiles/h52giftst.h5 image.gif -i palette)
 #set_tests_properties (HL_TOOLS_h52gifpal PROPERTIES WILL_FAIL "true")
 
 add_test (NAME HL_TOOLS_h52gif24bits COMMAND $<TARGET_FILE:h52gif> testfiles/ex_image2.h5 image24.gif -i image24bitpixel)
 set_tests_properties (HL_TOOLS_h52gif24bits PROPERTIES WILL_FAIL "true")
+set_tests_properties (HL_TOOLS_h52gif24bits PROPERTIES DEPENDS HL_TOOLS-clear-objects)
diff --git a/hl/tools/gif2h5/Makefile.am b/hl/tools/gif2h5/Makefile.am
index c82485e..d30d66a 100644
--- a/hl/tools/gif2h5/Makefile.am
+++ b/hl/tools/gif2h5/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/hl/tools/gif2h5/Makefile.in b/hl/tools/gif2h5/Makefile.in
index 8163fe3..b950a06 100644
--- a/hl/tools/gif2h5/Makefile.in
+++ b/hl/tools/gif2h5/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Makefile(.in)
 #
@@ -476,6 +474,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -597,6 +596,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -758,18 +758,20 @@ h52gifgentst_SOURCES = h52gifgentst.c
 # library.
 LDADD = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -900,22 +902,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writehdf.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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1300,6 +1305,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1307,7 +1313,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/tools/gif2h5/decompress.c b/hl/tools/gif2h5/decompress.c
index ef2d78a..453db12 100644
--- a/hl/tools/gif2h5/decompress.c
+++ b/hl/tools/gif2h5/decompress.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/hl/tools/gif2h5/gif.h b/hl/tools/gif2h5/gif.h
index f34a111..ed1cc81 100644
--- a/hl/tools/gif2h5/gif.h
+++ b/hl/tools/gif2h5/gif.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/tools/gif2h5/gif2hdf.c b/hl/tools/gif2h5/gif2hdf.c
index 8a9e971..2e06d34 100644
--- a/hl/tools/gif2h5/gif2hdf.c
+++ b/hl/tools/gif2h5/gif2hdf.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #include <string.h>
 #include <stdio.h>
diff --git a/hl/tools/gif2h5/gif2mem.c b/hl/tools/gif2h5/gif2mem.c
index 456a32d..40b5583 100644
--- a/hl/tools/gif2h5/gif2mem.c
+++ b/hl/tools/gif2h5/gif2mem.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/tools/gif2h5/gifread.c b/hl/tools/gif2h5/gifread.c
index 2b4c129..948e112 100644
--- a/hl/tools/gif2h5/gifread.c
+++ b/hl/tools/gif2h5/gifread.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/hl/tools/gif2h5/h52gifgentst.c b/hl/tools/gif2h5/h52gifgentst.c
index 3433d0a..655563c 100644
--- a/hl/tools/gif2h5/h52gifgentst.c
+++ b/hl/tools/gif2h5/h52gifgentst.c
@@ -5,14 +5,13 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "hdf5.h"
@@ -49,12 +48,15 @@ int main(void)
 {
     hid_t         fid;
     int           i, j, n, space;
-    unsigned char buf [ WIDTH*HEIGHT ];
+    unsigned char *buf;
     unsigned char pal[ PAL_ENTRIES * 3 ];        /* palette array */
     hsize_t       pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */
     hsize_t       width  = WIDTH;
     hsize_t       height = HEIGHT;
 
+    /* Allocate buffer */
+    if(NULL == (buf = (unsigned char *)malloc(WIDTH * HEIGHT)))
+        return EXIT_FAILURE;
 
     /* create a file  */
     if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
@@ -99,6 +101,8 @@ int main(void)
     if(H5Fclose(fid)<0)
         return EXIT_FAILURE;
 
+    free(buf);
+
     return EXIT_SUCCESS;
 }
 
diff --git a/hl/tools/gif2h5/h52giftest.sh.in b/hl/tools/gif2h5/h52giftest.sh.in
index 90931f2..5643e30 100644
--- a/hl/tools/gif2h5/h52giftest.sh.in
+++ b/hl/tools/gif2h5/h52giftest.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF Utilities Test script
 
diff --git a/hl/tools/gif2h5/hdf2gif.c b/hl/tools/gif2h5/hdf2gif.c
index e03d5c4..ae63e92 100644
--- a/hl/tools/gif2h5/hdf2gif.c
+++ b/hl/tools/gif2h5/hdf2gif.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdio.h>
@@ -48,6 +46,8 @@ FILE *fpGif = NULL;
 int main(int argc , char **argv)
 {
     BYTE *Image;
+    void *edata;
+    H5E_auto2_t func;
 
     /* compression structs */
     CHAR *HDFName = NULL;
@@ -73,6 +73,10 @@ int main(int argc , char **argv)
     char *image_name = NULL;
     int idx;
 
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
     /* Initialize h5tools lib */
     h5tools_init();
 
@@ -330,6 +334,8 @@ int main(int argc , char **argv)
     if (image_name != NULL)
         free(image_name);
 
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
     return EXIT_SUCCESS;
 
 
@@ -340,5 +346,7 @@ out:
     if (image_name != NULL)
         free(image_name);
 
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
     return EXIT_FAILURE;
 }
diff --git a/hl/tools/gif2h5/hdfgifwr.c b/hl/tools/gif2h5/hdfgifwr.c
index 4c52f4c..6f5ab58 100644
--- a/hl/tools/gif2h5/hdfgifwr.c
+++ b/hl/tools/gif2h5/hdfgifwr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/hl/tools/gif2h5/writehdf.c b/hl/tools/gif2h5/writehdf.c
index b4cca67..b656c36 100644
--- a/hl/tools/gif2h5/writehdf.c
+++ b/hl/tools/gif2h5/writehdf.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/hl/tools/h5watch/CMakeLists.txt b/hl/tools/h5watch/CMakeLists.txt
index e3a7e9d..fde40e3 100644
--- a/hl/tools/h5watch/CMakeLists.txt
+++ b/hl/tools/h5watch/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_HL_TOOLS_H5WATCH)
 
 #-----------------------------------------------------------------------------
@@ -9,9 +9,9 @@ set (H5WATCH_SOURCES
 )
 
 #-- Add h5watch program
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
-INCLUDE_DIRECTORIES (${HDF5_HL_TOOLS_DIR}/src)
-INCLUDE_DIRECTORIES (${HDF5_HL_TOOLS_H5WATCH_SOURCE_DIR})
+include_directories (${HDF5_TOOLS_DIR}/lib)
+include_directories (${HDF5_HL_TOOLS_DIR}/src)
+include_directories (${HDF5_HL_TOOLS_H5WATCH_SOURCE_DIR})
 
 add_executable (h5watch ${H5WATCH_SOURCES})
 TARGET_NAMING (h5watch STATIC)
@@ -20,6 +20,8 @@ target_link_libraries (h5watch ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_T
 set_target_properties (h5watch PROPERTIES FOLDER tools/hl)
 
 if (BUILD_TESTING)
+  include_directories (${HDF5_TEST_SRC_DIR})
+  include_directories(${HDF5_HL_SRC_DIR}/test)
   #-- Add swmr_check_compat_vfd program
   set (hl_swmr_check_compat_vfd_SOURCES
       ${HDF5_HL_TOOLS_H5WATCH_SOURCE_DIR}/swmr_check_compat_vfd.c
@@ -37,7 +39,7 @@ if (BUILD_TESTING)
   add_executable (extend_dset ${extend_dset_SOURCES})
   TARGET_NAMING (extend_dset STATIC)
   TARGET_C_PROPERTIES (extend_dset STATIC " " " ")
-  target_link_libraries (extend_dset ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  target_link_libraries (extend_dset ${HDF5_HL_LIB_TARGET} ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
   set_target_properties (extend_dset PROPERTIES FOLDER tools/hl)
 
   add_executable (h5watchgentest ${HDF5_HL_TOOLS_H5WATCH_SOURCE_DIR}/h5watchgentest.c)
@@ -47,13 +49,17 @@ if (BUILD_TESTING)
   set_target_properties (h5watchgentest PROPERTIES FOLDER generator/tools/hl)
 
   include (CMakeTests.cmake)
-endif (BUILD_TESTING)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
 #-----------------------------------------------------------------------------
-install (
-    TARGETS
-        h5watch
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hltoolsapplications
-)
+if (HDF5_EXPORTED_TARGETS)
+  install (
+      TARGETS
+          h5watch
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hltoolsapplications
+  )
+endif ()
diff --git a/hl/tools/h5watch/CMakeTests.cmake b/hl/tools/h5watch/CMakeTests.cmake
index 3242a72..35e7829 100644
--- a/hl/tools/h5watch/CMakeTests.cmake
+++ b/hl/tools/h5watch/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -56,7 +67,7 @@ foreach (h5watch_file ${H5WATCH_TEST_FILES})
       COMMAND    ${CMAKE_COMMAND}
       ARGS       -E copy_if_different ${HDF5_HL_TOOLS_DIR}/testfiles/${h5watch_file} ${dest}
   )
-endforeach (h5watch_file ${H5WATCH_TEST_FILES})
+endforeach ()
 
 ##############################################################################
 ##############################################################################
@@ -64,21 +75,9 @@ endforeach (h5watch_file ${H5WATCH_TEST_FILES})
 ##############################################################################
 ##############################################################################
 
-  MACRO (ADD_H5_TEST resultfile resultcode)
+  macro (ADD_H5_TEST resultfile resultcode)
     if (NOT HDF5_ENABLE_USING_MEMCHECKER)
       add_test (
-          NAME H5WATCH_ARGS-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-                  ${resultfile}.out
-                  ${resultfile}.out.err
-      )
-      set_tests_properties (H5WATCH_ARGS-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5WATCH_ARGS-${resultfile}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      set (last_test "H5WATCH_ARGS-${resultfile}-clearall-objects")
-      add_test (
           NAME H5WATCH_ARGS-h5watch-${resultfile}
           COMMAND "${CMAKE_COMMAND}"
               -D "TEST_PROGRAM=$<TARGET_FILE:h5watch>"
@@ -89,20 +88,18 @@ endforeach (h5watch_file ${H5WATCH_TEST_FILES})
               -D "TEST_REFERENCE=${resultfile}.ddl"
               -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
       )
-      set_tests_properties (H5WATCH_ARGS-h5watch-${resultfile} PROPERTIES DEPENDS H5WATCH_ARGS-${resultfile}-clear-objects)
-      set (last_test "H5WATCH_ARGS-${resultfile}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST resultfile resultcode resultoption)
+      set_tests_properties (H5WATCH_ARGS-h5watch-${resultfile} PROPERTIES DEPENDS ${last_test})
+      set (last_test "H5WATCH_ARGS-h5watch-${resultfile}")
+    endif ()
+  endmacro ()
 
-  MACRO (ADD_H5_WATCH resultfile resultcode)
+  macro (ADD_H5_WATCH resultfile resultcode)
     if (NOT HDF5_ENABLE_USING_MEMCHECKER)
       add_test (
           NAME H5WATCH-${resultfile}-clear-objects
           COMMAND    ${CMAKE_COMMAND}
               -E remove
                   ${resultfile}.h5
-                  ${resultfile}.out
-                  ${resultfile}.out.err
       )
       set_tests_properties (H5WATCH-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
       add_test (
@@ -117,8 +114,8 @@ endforeach (h5watch_file ${H5WATCH_TEST_FILES})
               -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
       )
       set_tests_properties (H5WATCH-${resultfile} PROPERTIES DEPENDS H5WATCH-${resultfile}-clear-objects)
-    endif (NOTHDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_WATCH resultfile resultcode)
+    endif ()
+  endmacro ()
 
 ##############################################################################
 ##############################################################################
@@ -130,7 +127,7 @@ endforeach (h5watch_file ${H5WATCH_TEST_FILES})
 # supports SWMR.
 set (SWMR_INCOMPAT ${hl_swmr_check_compat_vfd})
 
-IF (NOT SWMR_INCOMPAT)
+if (NOT SWMR_INCOMPAT)
 # Remove any output file left over from previous test run
   add_test (
     NAME H5WATCH-clearall-objects
@@ -140,7 +137,7 @@ IF (NOT SWMR_INCOMPAT)
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (H5WATCH-clearall-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "H5WATCH-clearall-objects")
 
 #################################################################################################
@@ -169,23 +166,23 @@ IF (NOT SWMR_INCOMPAT)
   set (last_test "H5WATCH-h5watchgentest")
 
 # Test on --help options
-  ADD_H5_TEST(w-help1 0 --help)
+  ADD_H5_TEST (w-help1 0 --help)
 #
 # Tests on expected failures
-  ADD_H5_TEST(w-err-dset1 1 WATCH.h5)
-  ADD_H5_TEST(w-err-dset2 1 WATCH.h5/group/DSET_CMPD)
-  ADD_H5_TEST(w-err-dset-none 1 WATCH.h5/DSET_NONE)
-  ADD_H5_TEST(w-err-dset-nomax 1 WATCH.h5/DSET_NOMAX)
-  ADD_H5_TEST(w-err-file 1 ../WATCH.h5/DSET_CMPD)
-  ADD_H5_TEST(w-err-width 1 --width=-8 WATCH.h5/DSET_ONE)
-  ADD_H5_TEST(w-err-poll 1 --polling=-8 WATCH.h5/DSET_ONE)
-  ADD_H5_TEST(w-err-poll0 1 --polling=0 WATCH.h5/DSET_ONE)
+  ADD_H5_TEST (w-err-dset1 1 WATCH.h5)
+  ADD_H5_TEST (w-err-dset2 1 WATCH.h5/group/DSET_CMPD)
+  ADD_H5_TEST (w-err-dset-none 1 WATCH.h5/DSET_NONE)
+  ADD_H5_TEST (w-err-dset-nomax 1 WATCH.h5/DSET_NOMAX)
+  ADD_H5_TEST (w-err-file 1 ../WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-width 1 --width=-8 WATCH.h5/DSET_ONE)
+  ADD_H5_TEST (w-err-poll 1 --polling=-8 WATCH.h5/DSET_ONE)
+  ADD_H5_TEST (w-err-poll0 1 --polling=0 WATCH.h5/DSET_ONE)
 #
 # Tests on invalid field names via --fields option for a compound typed dataset: DSET_CMPD
-  ADD_H5_TEST(w-err-cmpd1 1 --fields=fieldx WATCH.h5/DSET_CMPD)
-  ADD_H5_TEST(w-err-cmpd2 1 --fields=field1,field2. WATCH.h5/DSET_CMPD)
-  ADD_H5_TEST(w-err-cmpd3 1 --fields=field1,field2, WATCH.h5/DSET_CMPD)
-  ADD_H5_TEST(w-err-cmpd4 1 --fields=field1,field2.b.k WATCH.h5/DSET_CMPD)
-  ADD_H5_TEST(w-err-cmpd5 1 --fields=field1 --fields=field2.b.k WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-cmpd1 1 --fields=fieldx WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-cmpd2 1 --fields=field1,field2. WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-cmpd3 1 --fields=field1,field2, WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-cmpd4 1 --fields=field1,field2.b.k WATCH.h5/DSET_CMPD)
+  ADD_H5_TEST (w-err-cmpd5 1 --fields=field1 --fields=field2.b.k WATCH.h5/DSET_CMPD)
 #
-ENDIF (NOT SWMR_INCOMPAT)
+endif ()
diff --git a/hl/tools/h5watch/Makefile.am b/hl/tools/h5watch/Makefile.am
index a5891ef..c60fceb 100644
--- a/hl/tools/h5watch/Makefile.am
+++ b/hl/tools/h5watch/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -21,7 +19,7 @@
 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
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src -I$(top_srcdir)/hl/test
 
 # These are our main targets, the tools
 TEST_SCRIPT=testh5watch.sh
@@ -37,6 +35,14 @@ 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)
+
+# Add extend_dset specific preprocessor flags here
+# (add the main test subdirectory to the include file path)
+extend_dset_CPPFLAGS=$(AM_CPPFLAGS) -I$(top_srcdir)/test
+# Add extend_dset specific library flags here
+# (add the main test library to the list of libraries)
+extend_dset_LDADD=$(LDADD) $(LIBH5TEST) $(LIBHDF5)
+
 #
 CHECK_CLEANFILES+=*.h5
 DISTCLEANFILES=testh5watch.sh
diff --git a/hl/tools/h5watch/Makefile.in b/hl/tools/h5watch/Makefile.in
index 05fd313..3f91984 100644
--- a/hl/tools/h5watch/Makefile.in
+++ b/hl/tools/h5watch/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Makefile(.in)
 #
@@ -140,9 +138,8 @@ 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)
+extend_dset_OBJECTS = extend_dset-extend_dset.$(OBJEXT)
+extend_dset_DEPENDENCIES = $(LDADD) $(LIBH5TEST) $(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
@@ -443,7 +440,8 @@ 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
+	-I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src \
+	-I$(top_srcdir)/hl/test
 AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
@@ -479,6 +477,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -600,6 +599,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -744,6 +744,7 @@ 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
 
@@ -758,20 +759,29 @@ 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)
+
+# Add extend_dset specific preprocessor flags here
+# (add the main test subdirectory to the include file path)
+extend_dset_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/test
+# Add extend_dset specific library flags here
+# (add the main test library to the list of libraries)
+extend_dset_LDADD = $(LDADD) $(LIBH5TEST) $(LIBHDF5)
 DISTCLEANFILES = testh5watch.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -896,32 +906,49 @@ mostlyclean-compile:
 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)/extend_dset-extend_dset.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5watch.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5watchgentest.Po at am__quote@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+extend_dset-extend_dset.o: extend_dset.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(extend_dset_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT extend_dset-extend_dset.o -MD -MP -MF $(DEPDIR)/extend_dset-extend_dset.Tpo -c -o extend_dset-extend_dset.o `test -f 'extend_dset.c' || echo '$(srcdir)/'`extend_dset.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/extend_dset-extend_dset.Tpo $(DEPDIR)/extend_dset-extend_dset.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='extend_dset.c' object='extend_dset-extend_dset.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(extend_dset_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o extend_dset-extend_dset.o `test -f 'extend_dset.c' || echo '$(srcdir)/'`extend_dset.c
+
+extend_dset-extend_dset.obj: extend_dset.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(extend_dset_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT extend_dset-extend_dset.obj -MD -MP -MF $(DEPDIR)/extend_dset-extend_dset.Tpo -c -o extend_dset-extend_dset.obj `if test -f 'extend_dset.c'; then $(CYGPATH_W) 'extend_dset.c'; else $(CYGPATH_W) '$(srcdir)/extend_dset.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/extend_dset-extend_dset.Tpo $(DEPDIR)/extend_dset-extend_dset.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='extend_dset.c' object='extend_dset-extend_dset.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(extend_dset_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o extend_dset-extend_dset.obj `if test -f 'extend_dset.c'; then $(CYGPATH_W) 'extend_dset.c'; else $(CYGPATH_W) '$(srcdir)/extend_dset.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -1303,6 +1330,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1310,7 +1338,7 @@ 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)
+lib dyn 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                           \
diff --git a/hl/tools/h5watch/extend_dset.c b/hl/tools/h5watch/extend_dset.c
index 67d738b..957db10 100644
--- a/hl/tools/h5watch/extend_dset.c
+++ b/hl/tools/h5watch/extend_dset.c
@@ -5,35 +5,13 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#include "H5HLprivate2.h"
-
-#ifdef H5_STDC_HEADERS
-#   include <assert.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#   include <string.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-
-#if defined(H5_TIME_WITH_SYS_TIME)
-#   include <sys/time.h>
-#   include <time.h>
-#elif defined(H5_HAVE_SYS_TIME_H)
-#   include <sys/time.h>
-#else
-#   include <time.h>
-#endif
+#include "h5hltest.h"
 
 /*
  * Extending datasets in WATCH.h5 generated by h5watchgentest.c
@@ -50,35 +28,12 @@
 #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);
+static herr_t extend_dset_two(const char *file, char *dname, int action1, int action2);
+static herr_t extend_dset_one(const char *file, char *dname, int action);
 
 
 /* Data structures for datasets with compound data type */
@@ -107,396 +62,363 @@ typedef struct set_t {
 } 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}
+ * Extending a two-dimensional dataset by action1 and action2.
+ *        --action1 and action2 can be a positive # or negative # or 0.
+ *  
  ***********************************************************************
  */
-static int
-extend_dset_two(const char *file, char *dname)
+static herr_t
+extend_dset_two(const char *file, char *dname, int action1, int action2)
 {
-    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) */
+    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 = NULL;       /* buffer for storing retrieved elements (integer)  */
+    set_t *cbuf = NULL;     /* buffer for storing retrieved elemnets (compound) */
+
+    /* Allocate memory */
+    if(NULL == (ibuf = (int *)HDcalloc(TEST_BUF_SIZE, sizeof(int))))
+        goto error;
+    if(NULL == (cbuf = (set_t *)HDcalloc(TEST_BUF_SIZE, sizeof(set_t))))
+        goto error;
 
     /* Create a copy of file access property list */
     if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
-        return -1;
+        goto error;
 
     /* Set to use the latest library format */
     if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-        return -1;
+        goto error;
 
     /* Open the file and dataset with SWMR write */
     if((fid = H5Fopen(file, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
-	goto done;
+        goto error;
 
     if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
-	goto done;
+        goto error;
 
     /* Send message to the test script to start "h5watch" */
-    send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     if((sid = H5Dget_space(did)) < 0)
-	goto done;
+        goto error;
 
     if((ndims = H5Sget_simple_extent_ndims(sid)) < 0)
-	goto done;
+        goto error;
 
     /* Get the size of the dataset's datatype */
     if((dtype_size = H5LDget_dset_type_size(did, NULL)) == 0)
-	goto done;
+        goto error;
 
     /* Get the dataset's data type */
     if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
-	goto done;
+        goto error;
 
     /* 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++) {
+    if(h5_wait_message(READER_MESSAGE) < 0)
+        goto error;
 
-	/* sleep to emulate about 2 seconds of application operation */
+    /* sleep to emulate about 2 seconds of application operation */
     HDsleep(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 */
+    /* Get current dimension sizes */
+    if(H5LDget_dset_dims(did, cur_dims) < 0)
+        goto error;
+
+    /* Set up the new extended dimension sizes  */
+    ext_dims[0] = cur_dims[0] + (hsize_t)action1;
+    ext_dims[1] = cur_dims[1] + (hsize_t)action2;
+
+    /* Extend the dataset */
+    if(H5Dset_extent(did, ext_dims) < 0)
+        goto error;
+
+    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, TEST_BUF_SIZE * sizeof(set_t));
+        for(j = 0; j < num_elmts; j++) {
+            cbuf[j].field1 = action1;
+            cbuf[j].field2.a = action1;
+            cbuf[j].field2.c = action1;
+            cbuf[j].field2.b.a = action1;
+            cbuf[j].field2.b.b = action1;
+            cbuf[j].field2.b.c = action1;
+            cbuf[j].field3 = action1;
+            cbuf[j].field4.a = action1;
+            cbuf[j].field4.b = action1;
+        } /* end for */
+
+       /* Write to the dataset */
+        if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, cbuf) < 0)
+            goto error;
+
+    } else { /* Integer type */
+        HDmemset(ibuf, 0, TEST_BUF_SIZE * sizeof(int));
+        for(j = 0; j < num_elmts; j++)
+            ibuf[j] = action1;
+
+        /* Write to the dataset */
+        if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf) < 0)
+            goto error;
+    } /* end if-else */
+
+    if(H5Dflush(did) < 0)
+        goto error;
 
     /* 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;
+    if(H5Tclose(dtid) < 0) goto error;
+    if(H5Dclose(did) < 0) goto error;
+    if(H5Pclose(fapl) < 0) goto error;
+    if(H5Fclose(fid) < 0) goto error;
 
-    return(SUCCEED);
+    if(ibuf) HDfree(ibuf);
+    if(cbuf) HDfree(cbuf);
 
-done:
+    return SUCCEED;
+
+error:
     H5E_BEGIN_TRY
         H5Tclose(dtid);
         H5Dclose(did);
-	H5Pclose(fapl);
-	H5Fclose(fid);
+        H5Pclose(fapl);
+        H5Fclose(fid);
     H5E_END_TRY
 
-    return(FAIL);
+    if(ibuf)
+        HDfree(ibuf);
+    if(cbuf)
+        HDfree(cbuf);
+
+    return FAIL;
 
-} /* extend_dset_two() */
+} /* end 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
+ * Extending a one-dimensional dataset by action:
+ *        --action can be a positive # or negative # or 0.
  *
  ***********************************************************************
  */
-static int
-extend_dset_one(const char *file, char *dname)
+static herr_t
+extend_dset_one(const char *file, char *dname, int action)
 {
-    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 */
+    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                             */
+    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                   */
+    int *ibuf = NULL;       /* buffer for storing retrieved elements (integer)  */
+    set_t *cbuf = NULL;     /* buffer for storing retrieved elemnets (compound) */
+
+    /* Allocate memory */
+    if(NULL == (ibuf = (int *)HDcalloc(TEST_BUF_SIZE, sizeof(int))))
+        goto error;
+    if(NULL == (cbuf = (set_t *)HDcalloc(TEST_BUF_SIZE, sizeof(set_t))))
+        goto error;
 
     /* Create a copy of file access property list */
     if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
-        return -1;
+        goto error;
+
     /* Set to use the latest library format */
     if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-        return -1;
+        goto error;
 
     /* Open the file and dataset with SWMR write */
     if((fid = H5Fopen(file, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
-	goto done;
+        goto error;
 
     /* Send message to the test script to start "h5watch" */
-    send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
-	goto done;
+        goto error;
 
     /* Get size of the dataset's datatype */
     if((dtype_size = H5LDget_dset_type_size(did, NULL)) == 0)
-	goto done;
+        goto error;
 
     /* Get dataset's datatype */
     if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
-	goto done;
+        goto error;
 
     /* Wait for message from the test script to start extending dataset */
-    wait_message(READER_MESSAGE);
+    if(h5_wait_message(READER_MESSAGE) < 0)
+        goto error;
 
-    /* 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 to emulate about 2 seconds of application operation */
     HDsleep(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 */
+    /* Get current dimension sizes */
+    if(H5LDget_dset_dims(did, cur_dims) < 0)
+        goto error;
+
+    /* Set up the new extended dimension sizes  */
+    ext_dims[0] = cur_dims[0] + (hsize_t)action;
+
+    /* Extend the dataset */
+    if(H5Dset_extent(did, ext_dims) < 0)
+        goto error;
+
+    /* Write to the new appended region of the dataset */
+    if(action > 0) {
+
+        /* Select the extended region */
+        offset[0] = cur_dims[0];
+        count[0] = (hsize_t)action;
+        if((sid = H5Dget_space(did)) < 0)
+            goto error;
+        if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+            goto error;
+
+        /* Set up memory space and get dataset's datatype */
+        if((mid = H5Screate_simple(1, count, NULL)) < 0)
+            goto error;
+
+        /* Initialize data for the extended region of the dataset */
+        /* Compound type */
+        if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
+
+            HDmemset(cbuf, 0, TEST_BUF_SIZE * sizeof(set_t));
+            for(j = 0; j < (unsigned)action; 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 error;
+        } else { /* Integer type */
+
+            HDmemset(ibuf, 0, TEST_BUF_SIZE * sizeof(int));
+            for(j = 0; j < (unsigned)action; j++)
+                ibuf[j] = (int)j;
+
+            /* Write to the extended region of the dataset */
+            if(H5Dwrite(did, dtid, mid, sid, H5P_DEFAULT, ibuf) < 0)
+                goto error;
+        } /* end if-else */
+
+        /* Closing */
+        if(H5Sclose(sid) < 0) goto error;
+        if(H5Sclose(mid) < 0) goto error;
+    } /* end if */
+
+    if(H5Dflush(did) < 0)
+        goto error;
 
     /* 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;
+    if(H5Tclose(dtid) < 0) goto error;
+    if(H5Dclose(did) < 0) goto error;
+    if(H5Pclose(fapl) < 0) goto error;
+    if(H5Fclose(fid) < 0) goto error;
+
+    if(ibuf) HDfree(ibuf);
+    if(cbuf) HDfree(cbuf);
 
-    return(SUCCEED);
+    return SUCCEED;
 
-done:
+error:
     H5E_BEGIN_TRY
-	H5Sclose(sid);
-	H5Sclose(mid);
+        H5Sclose(sid);
+        H5Sclose(mid);
         H5Tclose(dtid);
         H5Dclose(did);
-	H5Pclose(fapl);
-	H5Fclose(fid);
+        H5Pclose(fapl);
+        H5Fclose(fid);
     H5E_END_TRY
 
-    return(FAIL);
-} /* extend_dset_one() */
+    if(ibuf)
+        HDfree(ibuf);
+    if(cbuf)
+        HDfree(cbuf);
 
-/* Usage: extend_dset xx.h5 dname */
+    return FAIL;
+} /* end extend_dset_one() */
+
+
+/*
+ ***********************************************************************
+ *
+ * Usage: extend_dset xx.h5 dname action1 action2
+ *        --action1 and action2 can be a positive # or negative # or 0.
+ *
+ ***********************************************************************
+ */
 int
 main(int argc, const char *argv[])
 {
     char *dname = NULL;
     char *fname = NULL;
+    int action1, action2;
 
-    if(argc != 3) {
-	fprintf(stderr, "Should have file name and dataset name to be extended...\n");
-	goto done;
-    }
+    if(argc != 5) {
+        HDfprintf(stderr, "Should have file name, dataset name, and the extended amount...\n");
+        goto error;
+    } /* end if */
 
     /* Get the dataset name to be extended */
-    fname = strdup(argv[1]);
-    dname = strdup(argv[2]);
+    fname = HDstrdup(argv[1]);
+    dname = HDstrdup(argv[2]);
+    action1 = HDatoi(argv[3]);
+    action2 = HDatoi(argv[4]);
 
     if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
-	if(extend_dset_one(fname, dname) < 0) 
-	    goto done;
+        if(extend_dset_one(fname, dname, action1) < 0)
+            goto error;
     } 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;
+              !HDstrcmp(dname, DSET_ALLOC_LATE) || 
+              !HDstrcmp(dname, DSET_ALLOC_EARLY)) {
+        if(extend_dset_one(fname, dname, action1) < 0)
+            goto error;
+    } else if(!HDstrcmp(dname, DSET_TWO) || 
+              !HDstrcmp(dname, DSET_CMPD_TWO)) {
+        if(extend_dset_two(fname, dname, action1, action2) < 0)
+            goto error;
     } 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() */
+        HDfprintf(stdout, "Dataset cannot be extended...\n");
+        goto error;
+    } /* end if-else */
+
+    HDexit(EXIT_SUCCESS);
+
+error:
+    if(dname)
+        HDfree(dname);
+    if(fname)
+        HDfree(fname);
+    HDexit(EXIT_FAILURE);
+} /* end main() */
diff --git a/hl/tools/h5watch/h5watch.c b/hl/tools/h5watch/h5watch.c
index ac2f6de..11514b0 100644
--- a/hl/tools/h5watch/h5watch.c
+++ b/hl/tools/h5watch/h5watch.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5tools.h"
@@ -20,29 +18,31 @@
 /*
  * 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 */
+#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 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" */
+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 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 hbool_t g_display_hex = FALSE;       /* display data in hexadecimal format : LATER */
+static hbool_t g_user_interrupt = FALSE;    /* Flag to indicate that user interrupted execution */
 
 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,
@@ -108,9 +108,9 @@ static struct long_options l_opts[] = {
  * 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).
+ *          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
  *
@@ -140,11 +140,11 @@ doprint(hid_t did, hsize_t *start, hsize_t *block, int rank)
 
     /* 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];
-    }
+        subset.stride.data[i] = 1;
+        subset.count.data[i] = 1;
+        subset.start.data[i] = start[i];
+        subset.block.data[i] = block[i];
+    } /* end for */
 
     HDmemset(&ctx, 0, sizeof(ctx));
 
@@ -167,10 +167,11 @@ doprint(hid_t did, hsize_t *start, hsize_t *block, int rank)
         info.cmpd_suf = "";
         info.cmpd_sep = " ";
 
-	/* The "fields" selected by the user */
-	info.cmpd_listv = (const struct H5LD_memb_t **)g_listv;
+        /* The "fields" selected by the user */
+        info.cmpd_listv = (const struct H5LD_memb_t * const *)g_listv;
 
-        if(g_label) info.cmpd_name = "%s=";
+        if(g_label)
+            info.cmpd_name = "%s=";
 
         info.elmt_suf1 = " ";
         info.str_locale = ESCAPE_HTML;
@@ -180,19 +181,20 @@ doprint(hid_t did, hsize_t *start, hsize_t *block, int rank)
         if(!g_display_width) {
             info.line_ncols = 65535;
             info.line_per_line = 1;
-        }
+        } /* end if */
         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=";
+        /* The "fields" selected by the user */
+        info.cmpd_listv = (const struct H5LD_memb_t * const *)g_listv;
+        if(g_label)
+            info.cmpd_name = "%s=";
         info.line_pre  = "        %s ";
         info.line_cont = "        %s  ";
         info.str_repeat = 8;
-    }
+    } /* end else */
 
     /* Floating point types should display full precision */
     sprintf(fmt_float, "%%1.%dg", FLT_DIG);
@@ -215,33 +217,33 @@ doprint(hid_t did, hsize_t *start, hsize_t *block, int rank)
         /* Print all data in hexadecimal format if the `-x' or `--hexdump'
          * command line switch was given. */
         info.raw = TRUE;
-    } 
+    } /* end if */
 
     /* Print the values. */
     if((ret_value = h5tools_dump_dset(stdout, &info, &ctx, did, &subset)) < 0)
-	error_msg("unable to print data\n");
+        error_msg("unable to print data\n");
 
     HDfprintf(stdout, "\n");
 
-    return(ret_value);
+    return ret_value;
 
-} /* doprint() */
+} /* end 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
+ *           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
  *
@@ -250,24 +252,24 @@ 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)
 {
-    int i;	/* Local index variable */
-    int ind; 	/* Index for the current rank */
-    herr_t ret_value = SUCCEED;	/* Return value */
+    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;
-	}
-    }
+        /* 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;
+        } /* end for */
+    } /* end if */
 
     /* this dimension remains the same or shrinking */
     if(cur_dims[ind] <= prev_dims[ind])
-	goto done;
+        goto done;
 
     /* select first the slice for the faster changing dimension */
     /* select later the whole slice for the slower changing dimension */
@@ -277,27 +279,27 @@ slicendump(hid_t did, hsize_t *prev_dims, hsize_t *cur_dims, hsize_t *start, hsi
     for(i = ind + 1; i < rank; i++){
         start[i] = 0;
         block[i] = cur_dims[i];
-    }
+    } /* end for */
 
     /* Print the appended data */
     ret_value = doprint(did, start, block, rank);
 
 done:
-    return(ret_value);
-} /* slicendump() */
+    return ret_value;
+} /* end 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
+ *              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
+ *              Negative on failure: dataset cannot be monitored
  *
  * Programmer:  Vailin Choi; August 2010
  *
@@ -318,94 +320,98 @@ monitor_dataset(hid_t fid, char *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;
+        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;
+        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;
+        error_msg("unable to get dimensions sizes for \"%s\"\n", dsetname);
+        ret_value = FAIL;
+        goto done;
     }
+    HDfflush(stdout);
 
-    while(1) {
+    /* Loop until an error occurs or the user interrupts execution */
+    while(!g_user_interrupt) {
 
-	/* Refreshes the dataset */
-	if(H5Drefresh(did) < 0) {
-	    ret_value = FAIL;
-	    goto done;
-	}
+        /* 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;
-	}
+        /* 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);
-	}
+        /* 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));
+        /* Save the current dimension sizes */
+        HDmemcpy(prev_dims, cur_dims, (size_t)ndims * sizeof(hsize_t));
 
-	/* Sleep before next monitor */
+        /* Sleep before next monitor */
         HDsleep(g_polling_interval);
     } /* end while */
 
+    HDfflush(stdout);
+
 done:
     /* Closing */
     H5E_BEGIN_TRY
-	H5Dclose(did);
+        H5Dclose(did);
     H5E_END_TRY
 
     return(ret_value);
@@ -415,7 +421,7 @@ done:
  * Function:  process_cmpd_fields
  *
  * Purpose: To check whether the fields selected in "g_list_of_fields"
- *	    are valid fields associated with the dataset.
+ *          are valid fields associated with the dataset.
  *
  * Return: 0 on success; negative on failure
  *
@@ -426,39 +432,39 @@ done:
 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 */
+    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;
+        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");
+        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;		
+        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");
+        error_msg("error in duplicating g_list_of_fields\n");
         ret_value = FAIL;
-	goto done;		
+        goto done;		
     }
 
     /* Estimate the number of comma-separated fields in "g_list of_fields" */
@@ -466,15 +472,15 @@ process_cmpd_fields(hid_t fid, char *dsetname)
 
     /* 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");
+        error_msg("error in allocating memory for H5LD_memb_t\n");
         ret_value = FAIL;
-	goto done;		
+        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;
+        error_msg("error in processing <list_of_fields>\n");
+        ret_value = FAIL;
         goto done;
     }
 
@@ -482,9 +488,9 @@ process_cmpd_fields(hid_t fid, char *dsetname)
 done:
     /* Closing */
     H5E_BEGIN_TRY
-	H5Tclose(dtid);
-	H5Tclose(tid);
-	H5Dclose(did);
+        H5Tclose(dtid);
+        H5Tclose(tid);
+        H5Dclose(did);
     H5E_END_TRY
     return(ret_value);
 } /* process_cmpd_fields() */
@@ -494,15 +500,13 @@ done:
  * Function:    check_dataset
  *
  * Purpose:     To check whether a dataset can be monitored:
- 		  A chunked dataset with unlimited or max. dimension setting
+ *              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
+ *              Negative on failure: dataset cannot be monitored
  *
  * Programmer:  Vailin Choi; August 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -527,9 +531,9 @@ check_dataset(hid_t fid, char *dsetname)
 
     /* 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;
+        error_msg("unable to open dataset \"%s\"\n", dsetname);
+        ret_value = FAIL;
+        goto done;
     }
 
     /* Get dataset's creation property list */
@@ -556,28 +560,28 @@ check_dataset(hid_t fid, char *dsetname)
 
     /* 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;
+        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;
+        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;
+        unlim_max_dims = TRUE;
 	    break;
 	}
 
     if(!unlim_max_dims) {
-	error_msg("\"%s\" should have unlimited or max. dimension setting\n", dsetname);
-	ret_value = FAIL;
+        error_msg("\"%s\" should have unlimited or max. dimension setting\n", dsetname);
+        ret_value = FAIL;
     }
 
 done: 
@@ -585,9 +589,9 @@ done:
 
     /* Closing */
     H5E_BEGIN_TRY
-	H5Sclose(sid);
-	H5Pclose(dcp);
-	H5Dclose(did);
+        H5Sclose(sid);
+        H5Pclose(dcp);
+        H5Dclose(did);
     H5E_END_TRY
 
     return(ret_value);
@@ -603,7 +607,6 @@ done:
  *
  * Programmer:  Vailin Choi; August 2010
  *
- * Modifications:
  *
  *-------------------------------------------------------------------------
  */
@@ -625,7 +628,6 @@ leave(int ret)
  *
  * Programmer:  Vailin Choi; August 2010
  *
- * Modifications:
  *-------------------------------------------------------------------------
  */
 static void 
@@ -681,8 +683,6 @@ usage(const char *prog)
  *
  * Programmer:  Vailin Choi; August 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static void
@@ -702,7 +702,7 @@ parse_command_line(int argc, const char *argv[])
         switch ((char)opt) {
         case '?':
         case 'h': /* --help */
-	    usage(h5tools_getprogname());
+            usage(h5tools_getprogname());
             leave(EXIT_SUCCESS);
 
         case 'V': /* --version */
@@ -711,63 +711,63 @@ parse_command_line(int argc, const char *argv[])
             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);
-	    }
+            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;
+            g_monitor_size_only = TRUE;
             break;
 
         case 'S': /* --simple */
-	    g_simple_output = TRUE;
+            g_simple_output = TRUE;
             break;
 	
-	case 'l': /* --label */
-	    g_label = TRUE;
+        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;
+            /* 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);
-	    }
+            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());
+            usage(h5tools_getprogname());
             leave(EXIT_FAILURE);
         }
     }
@@ -776,7 +776,7 @@ parse_command_line(int argc, const char *argv[])
     /* check for object to be processed */
     if (argc <= opt_ind) {
         error_msg("missing dataset name\n");
-	usage(h5tools_getprogname());
+        usage(h5tools_getprogname());
         leave(EXIT_FAILURE);
     }
 } /* parse_command_line() */
@@ -786,7 +786,7 @@ parse_command_line(int argc, const char *argv[])
  * Function:    catch_signal
  *
  * Purpose:     The signal handler to catch the signals:
- *		SIGTERM and SIGINT and exit from h5watch
+ *              SIGTERM and SIGINT and set flag to get out of the main loop
  *
  * Return:      No return
  *
@@ -796,9 +796,8 @@ parse_command_line(int argc, const char *argv[])
  */
 static void catch_signal(int H5_ATTR_UNUSED signo)
 {
-    /* Exit from h5watch */
-    leave(EXIT_SUCCESS);
-
+    /* Set the flag to get out of the main loop */
+    g_user_interrupt = TRUE;
 } /* catch_signal() */
 
 
@@ -817,14 +816,14 @@ static void catch_signal(int H5_ATTR_UNUSED signo)
 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;
+    char        drivername[50];     /* VFD name */
+    char        *fname = NULL;      /* File name */
+    char        *dname = NULL;      /* Dataset name */
+    void        *edata;             /* Error reporting */
+    H5E_auto2_t func;               /* Error reporting */
+    char        *x;                 /* Temporary string pointer */
+    hid_t       fid = -1;           /* File ID */
+    hid_t       fapl = -1;          /* File access property list */
 
     /* Set up tool name and exit status */
     h5tools_setprogname(PROGRAMNAME);
@@ -839,14 +838,14 @@ main(int argc, const char *argv[])
 
     /* 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);
+        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);
+        leave(EXIT_FAILURE);
     }
 
     /* parse command line options */
@@ -854,7 +853,7 @@ main(int argc, const char *argv[])
 
     if(argc <= opt_ind) {
         error_msg("missing dataset name\n");
-	usage(h5tools_getprogname());
+        usage(h5tools_getprogname());
         leave(EXIT_FAILURE);
     }
 
@@ -874,9 +873,9 @@ main(int argc, const char *argv[])
      * 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);
+        error_msg("memory allocation failed (file %s:line %d)\n",
+                   __FILE__, __LINE__);
+        h5tools_setstatus(EXIT_FAILURE);
     }
 
     /* Create a copy of file access property list */
@@ -888,83 +887,84 @@ main(int argc, const char *argv[])
         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 */
+        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);
+        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);
+        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);
-	}
+        *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);
+        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);
+        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);
+        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);
+        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
index e616cbf..c5b76de 100644
--- a/hl/tools/h5watch/h5watchgentest.c
+++ b/hl/tools/h5watch/h5watchgentest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
@@ -91,7 +89,7 @@ typedef struct set_t {
  *
  **************************************************************************************
  */
-static int
+static herr_t
 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 */
@@ -102,42 +100,42 @@ generate_dset(hid_t fid, const char *dname, int ndims, hsize_t *dims, hsize_t *m
 
     /* Create the dataspace */
     if((sid = H5Screate_simple(ndims, dims, maxdims)) < 0)
-	goto done;
+        goto done;
 
     /* Set up dataset's creation properties */
     if(!HDstrcmp(dname, DSET_NONE))
-	dcpl = H5P_DEFAULT;
+        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((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;
+        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;
-    }
+        if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+            goto done;
+    } /* end if-else */
 
     /* Create the dataset */
     if((did = H5Dcreate2(fid, dname, dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-	goto done;
+        goto done;
 
     /* Write to the dataset */
     if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
-	goto done;
+        goto done;
 
     /* Closing */
     if(H5Pclose(dcpl) < 0) goto done;
     if(H5Sclose(sid) < 0) goto done;
     if(H5Dclose(did) < 0) goto done;
 
-    return(SUCCEED);
+    return SUCCEED;
 
 done:
     H5E_BEGIN_TRY
@@ -146,8 +144,8 @@ done:
 	H5Dclose(did);
     H5E_END_TRY
 
-    return(FAIL);
-} /* generate_dset() */
+    return FAIL;
+} /* end generate_dset() */
 
 int
 main(void)
@@ -170,14 +168,14 @@ main(void)
 
     /* Create a copy of file access property list */
     if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
-        return -1;
+        HDexit(EXIT_FAILURE);
     /* Set to use the latest library format */
     if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-        return -1;
+        HDexit(EXIT_FAILURE);
 
     /* Create a file with the latest format */
     if((fid = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
-	goto done;
+        HDexit(EXIT_FAILURE);
 
     /* Initialization for one-dimensional dataset */
     cur_dims[0] = ONE_DIMS0;
@@ -187,15 +185,15 @@ main(void)
 
     /* 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;
+        goto done;
     if(generate_dset(fid, DSET_NONE, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
-	goto done;
+        goto done;
     if(generate_dset(fid, DSET_NOMAX, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
-	goto done;
+        goto done;
     if(generate_dset(fid, DSET_ALLOC_LATE, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
-	goto done;
+        goto done;
     if(generate_dset(fid, DSET_ALLOC_EARLY, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
-	goto done;
+        goto done;
 
     /* Initialization for two-dimensional dataset */
     cur2_dims[0] = TWO_DIMS0;
@@ -208,13 +206,13 @@ main(void)
 
     /* Generate DSET_TWO */
     if(generate_dset(fid, DSET_TWO, 2, cur2_dims, max2_dims, H5T_NATIVE_INT, two_data) < 0)
-	goto done;
+        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++) {
+    for(i = 0; i < ONE_DIMS0; i++) {
         one_cbuf[i].field1 = 1;
         one_cbuf[i].field2.a = 2;
         one_cbuf[i].field2.c = 4;
@@ -224,78 +222,78 @@ main(void)
         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;
+        goto done;
     if(H5Tinsert(sub22_tid, "a", HOFFSET(sub22_t, a), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub22_tid, "b", HOFFSET(sub22_t, b), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub22_tid, "c", HOFFSET(sub22_t, c), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
 
     if((sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub2_tid, "a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub2_tid, "b", HOFFSET(sub2_t, b), sub22_tid) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub2_tid, "c", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
 
     if((sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub4_tid, "a", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(sub4_tid, "b", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
 
     if((set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(set_tid, "field1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(set_tid, "field2", HOFFSET(set_t, field2), sub2_tid) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(set_tid, "field3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(set_tid, "field4", HOFFSET(set_t, field4), sub4_tid) < 0)
-	goto done;
+        goto done;
 
     /* Create the compound type with escape/separator characters */
     if((esc_sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_sub2_tid, ".a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_sub2_tid, ",b", HOFFSET(sub2_t, b), sub22_tid) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_sub2_tid, "\\K", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
 
     if((esc_sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_sub4_tid, "a.", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_sub4_tid, "b,", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
 
     if((esc_set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_set_tid, "field,1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_set_tid, "field2.", HOFFSET(set_t, field2), esc_sub2_tid) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_set_tid, "field\\3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
-	goto done;
+        goto done;
     if(H5Tinsert(esc_set_tid, "field4,", HOFFSET(set_t, field4), esc_sub4_tid) < 0)
-	goto done;
+        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;
+        goto done;
     if(generate_dset(fid, DSET_CMPD_ESC, 1, cur_dims, max_dims, esc_set_tid, one_cbuf) < 0)
-	goto done;
+        goto done;
 
     /* Initialization for two-dimensional compound typed dataset */
     cur2_dims[0] = TWO_DIMS0;
@@ -303,7 +301,7 @@ main(void)
     max2_dims[0] = MAX_TWO_DIMS0;
     max2_dims[0] = MAX_TWO_DIMS1;
 
-    for (i = 0; i < (TWO_DIMS0 * TWO_DIMS1); i++) {
+    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;
@@ -313,11 +311,11 @@ main(void)
         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;
+        goto done;
 
     /* Closing */
     if(H5Tclose(sub22_tid) < 0) goto done;
diff --git a/hl/tools/h5watch/swmr_check_compat_vfd.c b/hl/tools/h5watch/swmr_check_compat_vfd.c
index 87b87c4..7d11a73 100644
--- a/hl/tools/h5watch/swmr_check_compat_vfd.c
+++ b/hl/tools/h5watch/swmr_check_compat_vfd.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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
diff --git a/hl/tools/h5watch/testh5watch.sh.in b/hl/tools/h5watch/testh5watch.sh.in
index 89fbf95..05e66bf 100644
--- a/hl/tools/h5watch/testh5watch.sh.in
+++ b/hl/tools/h5watch/testh5watch.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for the h5watch tool
 #
@@ -30,6 +28,10 @@ if [[ $rc != 0 ]] ; then
     exit 0
 fi
 
+#echo "h5watch tests are skipped temporarily."
+#echo
+#exit 0
+
 H5WATCH=h5watch               	# The tool name
 H5WATCH_BIN=`pwd`/$H5WATCH    	# The path of H5WATCH
 EXTEND_DSET=extend_dset 	# Routine to extend the dataset when watching
@@ -42,6 +44,7 @@ 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
+TRY_MAX=10                      # Try running the test again 
 #
 # 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
@@ -114,29 +117,30 @@ TOOLTEST() {
     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
+        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
 }
+
 #
 #
 #
@@ -146,8 +150,13 @@ TOOLTEST() {
 #       $1 -- the specified dataset to watch and to extend
 #       $2 -- the options to h5watch (can be NULL)
 #       $3 -- expected output from watching the object
+#       $4 -- action 1
+#       $5 -- action 2
 #
 TEST_WATCH() {
+try=0
+while [ $try -lt $TRY_MAX ] ;
+do
     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
@@ -161,7 +170,7 @@ TEST_WATCH() {
     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_BIN $TESTFILE $1 $4 $5&                     # Extend the dataset; put in background
     extend_pid=$!                                       # Get "extend" process ID
     #
     # Wait for message from "extend_dset" process to start h5watch--
@@ -174,10 +183,10 @@ TEST_WATCH() {
     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:
+        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
+            rm $WRITER_MESSAGE                      #       remove the message file
+            break                                   #       get out of the while loop
         fi
     done;
     #
@@ -203,7 +212,7 @@ TEST_WATCH() {
         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
+        wait $watch_pid					                # Wait for "h5watch" process to complete
         #
         if [ $extend_exit -ne 0 ]; then                 # Error returned from "extend" process
             $ECHO "*FAILED*"
@@ -216,13 +225,21 @@ TEST_WATCH() {
                 $ECHO ""
             fi
         elif $CMP $expect $actual; then                 # Compare actual output with expected output
+            try=$TRY_MAX
             $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/^/    /'
+            try="`expr $try + 1`"
+            if [ $try -lt $TRY_MAX ]; then
+                $ECHO "*RETRY"
+                rm -f $actual
+                rm -f $TESTFILE
+            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
         fi
         #
@@ -232,45 +249,45 @@ TEST_WATCH() {
             rm -f $actual
         fi
     fi
+done;
 }
-
 ##############################################################################
 ##############################################################################
-###			  T H E   T E S T S                                ###
+###                     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			#
-#											 	#
+#                                                                                               #
+# 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							#
-#												#
+#                                                                                               #
+# 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
@@ -315,13 +332,13 @@ $GEN_TEST_BIN
 #       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
+TEST_WATCH DSET_ONE '' w-ext-one.ddl 3 0            #Increase
+TEST_WATCH DSET_ALLOC_EARLY '' w-ext-early.ddl -1 0 #Decrease
+TEST_WATCH DSET_ALLOC_LATE '' w-ext-late.ddl 0 0    #Same
+TEST_WATCH DSET_CMPD '' w-ext-cmpd.ddl 3 0          #Increase
+TEST_WATCH DSET_CMPD_ESC '' w-ext-cmpd-esc.ddl -1 0 #Decrease
+TEST_WATCH DSET_TWO '' w-ext-two.ddl 2 2            #Increase, Increase
+TEST_WATCH DSET_CMPD_TWO '' w-ext-cmpd-two.ddl 2 -9 #Increase, Decrease
 #
 echo "DONE WITH 2nd SET OF TESTS"
 #
@@ -335,25 +352,25 @@ echo "DONE WITH 2nd SET OF TESTS"
 #       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_WATCH DSET_CMPD --fields=field1,field2 w-ext-cmpd-f1.ddl -9 0                  #Decrease
+TEST_WATCH DSET_CMPD --fields=field2.b,field4 w-ext-cmpd-f2.ddl 3 0                 #Increase
+TEST_WATCH DSET_CMPD '--fields=field2.b.a --fields=field2.c' w-ext-cmpd-ff3.ddl 0 0 #Same
 #
 #
 #       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_WATCH DSET_CMPD_TWO --fields=field1,field2 w-ext-cmpd-two-f1.ddl   2 0                 #Increase, Same
+TEST_WATCH DSET_CMPD_TWO '--fields=field2.b --fields=field4' w-ext-cmpd-two-ff2.ddl -1 2    #Decrease, Increase
+TEST_WATCH DSET_CMPD_TWO --fields=field2.b.a,field2.c w-ext-cmpd-two-f3.ddl -1 -3           #Decrease, Decrease
 #
 #
 #       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
+TEST_WATCH DSET_CMPD_ESC '--fields=field\,1,field2\.' w-ext-cmpd-esc-f1.ddl 3 0                 #Increase
+TEST_WATCH DSET_CMPD_ESC '--fields=field2\..\,b --fields=field4\,' w-ext-cmpd-esc-ff2.ddl -1 0  #Decrease
+TEST_WATCH DSET_CMPD_ESC '--fields=field2\..\,b.a,field2\..\\K' w-ext-cmpd-esc-f3.ddl 3 0       #Increase
 #
 #
 echo "DONE WITH 3rd SET OF TESTS"
@@ -372,11 +389,11 @@ echo "DONE WITH 3rd SET OF TESTS"
 #       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
+TEST_WATCH DSET_ONE --dim w-ext-one-d.ddl 3 0           #Increase
+TEST_WATCH DSET_TWO --dim w-ext-two-d.ddl -2 0          #Decrease, Same
+TEST_WATCH DSET_TWO --width=30 w-ext-two-width.ddl 0 2  #Same, Increase
+TEST_WATCH DSET_CMPD --label w-ext-cmpd-label.ddl 3 0   #Increase
+TEST_WATCH DSET_ONE --simple w-ext-one-simple.ddl 2 0   #I
 #
 echo "DONE WITH 4th SET OF TESTS"
 #
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl b/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
index d85594d..09255cc 100644
--- a/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
@@ -4,8 +4,3 @@ 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
index ab6c294..00ed390 100644
--- a/hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl
@@ -3,8 +3,3 @@ 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
index 039cbf3..9b9a971 100644
--- a/hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl
@@ -1,11 +1,3 @@
 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}}
+dimension 0: 10->9 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc.ddl b/hl/tools/testfiles/w-ext-cmpd-esc.ddl
index 900b3f2..9b9a971 100644
--- a/hl/tools/testfiles/w-ext-cmpd-esc.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-esc.ddl
@@ -1,13 +1,3 @@
 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}}
+dimension 0: 10->9 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-f1.ddl b/hl/tools/testfiles/w-ext-cmpd-f1.ddl
index 7e0a066..029e4db 100644
--- a/hl/tools/testfiles/w-ext-cmpd-f1.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-f1.ddl
@@ -1,11 +1,3 @@
 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}}
+dimension 0: 10->1 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-f2.ddl b/hl/tools/testfiles/w-ext-cmpd-f2.ddl
index ea69222..362cc94 100644
--- a/hl/tools/testfiles/w-ext-cmpd-f2.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-f2.ddl
@@ -4,8 +4,3 @@ 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
index 84e2919..6a54b97 100644
--- a/hl/tools/testfiles/w-ext-cmpd-ff3.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-ff3.ddl
@@ -1,10 +1,2 @@
 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
index 84534ea..394d5a6 100644
--- a/hl/tools/testfiles/w-ext-cmpd-label.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-label.ddl
@@ -8,11 +8,3 @@ dimension 0: 10->13 (increases)
         (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
index 49abde9..9b4c235 100644
--- a/hl/tools/testfiles/w-ext-cmpd-two-f1.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-two-f1.ddl
@@ -1,47 +1,15 @@
 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)
+dimension 1: 10->10 (unchanged)
+    Data:
+        (4,0) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (4,2) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (4,4) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (4,6) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (4,8) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (5,0) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (5,2) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (5,4) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (5,6) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}},
+        (5,8) {2, {2, {2, 2, 2}, 2}}, {2, {2, {2, 2, 2}, 2}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl b/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
index 0878f35..94b5c99 100644
--- a/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
@@ -1,41 +1,4 @@
 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)
+dimension 0: 4->3 (decreases)
+dimension 1: 10->7 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl b/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
index 669547e..482da31 100644
--- a/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
@@ -1,47 +1,8 @@
 Opened "TEST.h5" with sec2 driver.
 Monitoring dataset /DSET_CMPD_TWO...
-dimension 0: 4->6 (increases)
+dimension 0: 4->3 (decreases)
 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)
+        (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}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-two.ddl b/hl/tools/testfiles/w-ext-cmpd-two.ddl
index a461226..57ffc2c 100644
--- a/hl/tools/testfiles/w-ext-cmpd-two.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd-two.ddl
@@ -1,67 +1,7 @@
 Opened "TEST.h5" with sec2 driver.
 Monitoring dataset /DSET_CMPD_TWO...
 dimension 0: 4->6 (increases)
-dimension 1: 10->12 (increases)
+dimension 1: 10->1 (decreases)
     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)
+        (4,0) {2, {2, {2, 2, 2}, 2}, 2, {2, 2}},
+        (5,0) {2, {2, {2, 2, 2}, 2}, 2, {2, 2}}
diff --git a/hl/tools/testfiles/w-ext-cmpd.ddl b/hl/tools/testfiles/w-ext-cmpd.ddl
index 7e64a14..aac5be3 100644
--- a/hl/tools/testfiles/w-ext-cmpd.ddl
+++ b/hl/tools/testfiles/w-ext-cmpd.ddl
@@ -5,9 +5,3 @@ dimension 0: 10->13 (increases)
         (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
index 1d963d7..bb72104 100644
--- a/hl/tools/testfiles/w-ext-early.ddl
+++ b/hl/tools/testfiles/w-ext-early.ddl
@@ -1,10 +1,3 @@
 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
+dimension 0: 10->9 (decreases)
diff --git a/hl/tools/testfiles/w-ext-late.ddl b/hl/tools/testfiles/w-ext-late.ddl
index f3a7cf2..a6f8265 100644
--- a/hl/tools/testfiles/w-ext-late.ddl
+++ b/hl/tools/testfiles/w-ext-late.ddl
@@ -1,10 +1,2 @@
 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
index 249ff95..673370a 100644
--- a/hl/tools/testfiles/w-ext-one-d.ddl
+++ b/hl/tools/testfiles/w-ext-one-d.ddl
@@ -1,6 +1,3 @@
 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
index 3bf0ef5..5df9dff 100644
--- a/hl/tools/testfiles/w-ext-one-simple.ddl
+++ b/hl/tools/testfiles/w-ext-one-simple.ddl
@@ -1,13 +1,6 @@
 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)
+dimension 0: 10->12 (increases)
     Data:
         0 
         1
diff --git a/hl/tools/testfiles/w-ext-one.ddl b/hl/tools/testfiles/w-ext-one.ddl
index c4e75eb..9604020 100644
--- a/hl/tools/testfiles/w-ext-one.ddl
+++ b/hl/tools/testfiles/w-ext-one.ddl
@@ -3,8 +3,3 @@ 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
index b71a9a6..5c7af0a 100644
--- a/hl/tools/testfiles/w-ext-two-d.ddl
+++ b/hl/tools/testfiles/w-ext-two-d.ddl
@@ -1,18 +1,4 @@
 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)
+dimension 0: 4->2 (decreases)
+dimension 1: 10->10 (unchanged)
diff --git a/hl/tools/testfiles/w-ext-two-width.ddl b/hl/tools/testfiles/w-ext-two-width.ddl
index 52903de..9f09fde 100644
--- a/hl/tools/testfiles/w-ext-two-width.ddl
+++ b/hl/tools/testfiles/w-ext-two-width.ddl
@@ -1,41 +1,9 @@
 Opened "TEST.h5" with sec2 driver.
 Monitoring dataset /DSET_TWO...
-dimension 0: 4->6 (increases)
+dimension 0: 4->4 (unchanged)
 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)
+        (0,10) 0, 0
+        (1,10) 0, 0
+        (2,10) 0, 0
+        (3,10) 0, 0
diff --git a/hl/tools/testfiles/w-ext-two.ddl b/hl/tools/testfiles/w-ext-two.ddl
index 31df8d5..28ff075 100644
--- a/hl/tools/testfiles/w-ext-two.ddl
+++ b/hl/tools/testfiles/w-ext-two.ddl
@@ -3,35 +3,9 @@ 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)
+        (0,10) 2, 2
+        (1,10) 2, 2
+        (2,10) 2, 2
+        (3,10) 2, 2
+        (4,0) 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+        (5,0) 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
diff --git a/html/ADGuide.html b/html/ADGuide.html
index b7cd86a..b07d1d6 100644
--- a/html/ADGuide.html
+++ b/html/ADGuide.html
@@ -100,7 +100,7 @@
       <tr><td colspan="3"> </td></tr>
 
       <tr><td valign="top">
-      <a href="https://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.0/src/hdf5-1.10.0-RELEASE.txt" 
+      <a href="http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/RELEASE.txt" 
       target="ExtWin">RELEASE.txt</a>
         </td><td></td><td valign="top">
           Technical notes regarding the current release of the HDF5 Library* 
diff --git a/html/ADGuide/Changes.html b/html/ADGuide/Changes.html
index 5fbe86e..56d97cc 100755
--- a/html/ADGuide/Changes.html
+++ b/html/ADGuide/Changes.html
@@ -19,7 +19,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://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * http://support.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
@@ -71,7 +71,7 @@ a maintenance developer needs to be aware of:
     <li>Certain types of changes in configuration or build processes 
 </ul></p>
 
-<p>Bugfixes and performance enhancements in the C library 
+<p>Bug fixes and performance enhancements in the C library 
 are automatically picked up by the C++, Fortran, and Java libraries.  
 
 <p>The release notes also list changes made to the library, but these 
@@ -86,26 +86,25 @@ directory of the distributed HDF5 source code.</p>
 <table>
 
 <tr><td style="padding-right:10px">
-    <a href="http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/RELEASE.txt" 
+    <a href="https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/RELEASE.txt" 
     target="ExtWin"><code>RELEASE.txt</code></a></td>
     <td style="padding-right:10px">Technical notes regarding the current release 
     of the HDF5 Library 
     </td></tr>
 
 <tr><td style="padding-right:10px">
-    <a href="http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/HISTORY-1_8.txt" 
-    target="ExtWin"><code>HISTORY-1_8.txt</code></a></td>
-    <td style="padding-right:10px">Technical notes for 1.8.x 
-    releases of the HDF5 Library by release
+    <a href="https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/HISTORY-1_8_0-1_10_0.txt" 
+    target="ExtWin"><code>HISTORY-1_8_0-1_10_0.txt</code></a></td>
+    <td style="padding-right:10px">Development history between the HDF5-1.8.0 and HDF5-1.10.0 releases
     </td></tr>
 
 <tr valign="top"><td style="padding-right:10px">
-    <a href="http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/HISTORY-1_0-1_8_0_rc3.txt" 
+    <a href="https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/HISTORY-1_0-1_8_0_rc3.txt" 
     target="ExtWin"><code>HISTORY-1_0-1_8_0_rc3.txt</code></a>
     <br >
     <code>                         </code></td>
-    <td style="padding-right:10px">Technical notes for releases prior 
-    to the 1.8.0 release of the HDF5 Library by release
+    <td style="padding-right:10px">Technical notes starting with HDF5-1.0.0 and ending with HDF5-1.8.0-rc3
+    (the state of the code prior to the HDF5-1.8.0 release)
     </td></tr>
 
 </table>
@@ -241,10 +240,214 @@ in the transition from HDF5 Release 1.10.0 to Release 1.10.1.
 
  END MASK ---- MATERIAL FOR 1.10.1--MATERIAL FOR 1.10.1--MATERIAL FOR 1.10.1 -->
 
+<a name="1101">
+<h2>Release 1.10.1 (current release) versus Release 1.10.0 (and 1.10.0-patch1)</h2>
+</a>
+<dir>
+This section lists interface-level changes and other user-visible changes in behavior
+in the transition from HDF5 Release 1.10.0 (and HDF5-1.10.0-patch1) to Release 1.10.1.
+
+    <h3>New Features</h3>
+       <dir>
+        <dl>
+           <dt>Several new features are introduced in HDF5 Release 1.10.1.
+             <dd>Metadata Cache Image</dd> 
+             <dd>Metadata Cache Evict on Close</dd> 
+             <dd>Paged Aggregation</dd>
+             <dd>Page Buffering</dd>
+           </dt>
+         </dl>
+      </dir>
+
+     <h3>New Features, including associated C Functions</h3>
+        <dir>
+          <dl>
+            <dt>The following features are described and documented in 
+               <a href="/HDF5/docNewFeatures/">New Features in HDF5 Release 1.10</a>. Each new feature
+               in 1.10.1 is listed below along with the associated C functions:
+                </dt>
+            <p />
+            <dt><a href="/HDF5/docNewFeatures/index.html#mci">Metadata Cache Image</a>:
+              <br /> 
+              
+             <dd>
+
+              <!-- start nested table -->
+              <table>
+                <tr valign="top">
+                  <td>
+                    <code>H5Pget_mdc_image_config</code>
+                                 
+                  </td> 
+                 <td>
+                  Retrieves the metadata cache image configuration values for a file access property list. 
+                  </td>
+               </tr>
+
+                <tr valign="top">
+                  <td>
+                  <code>H5Pset_mdc_image_config</code>
+                  </td>
+                 <td>
+                   Sets the metadata cache image option for a file access property list.  
+                  </td>
+                </tr> 
+
+                <tr valign="top">
+                  <td>
+                    <code>H5Fget_mdc_image_info</code>
+                                 
+                  </td> 
+                 <td>
+                  Gets information about a metadata cache image if it exists. 
+                  </td>
+               </tr>
+
+              </table>
+             <!-- end nested table -->
+             </dd>
+
+            <p />
+            <dt><a href="/HDF5/docNewFeatures/index.html#mcec">Metadata Cache Evict on Close</a>:
+              <br /> 
+            </dt>
 
+             <dd>
+
+              <!-- start nested table -->
+              <table>
+                <tr valign="top">
+                  <td>
+                  <code>H5Pget_evict_on_close</code>
+                                         
+                  </td> 
+                 <td>
+                  Retrieves the property list setting that determines whether an HDF5 object will be evicted from 
+                  the library's metadata cache when it is closed.
+                  </td>
+               </tr>
+                <tr valign="top">
+                  <td>
+                  <code>H5Pset_evict_on_close</code>
+                  </td> 
+                 <td>
+                  Controls the library's behavior of evicting metadata associated with a closed object.  
+                  </td>
+               </tr>
+             </table>
+             <!-- end nested table -->
+             </dd>
+
+           <p />
+           <dt><a href="/HDF5/docNewFeatures/index.html#pagg">Paged Aggregation</a>:          
+            <br /> 
+            </dt>
 
-<a name="11001">
-<h2>Release 1.10.0 of March 2016 (current release) versus Release 1.8.16</h2>
+             <dd>
+
+              <!-- start nested table -->
+              <table>
+                <tr valign="top">
+                  <td>
+                  <code>H5Pget_file_space_page_size</code>
+                       
+                  </td>
+                 <td>
+                 Retrieves the file space page size for a file creation property list.
+                  </td>
+               </tr>
+
+                <tr valign="top">
+                  <td>
+                  <code>H5Pset_file_space_page_size</code>
+                  </td>
+                 <td>
+                  Sets the file space page size (used with paged aggregation) for a file creation property list.  
+                  </td>
+               </tr>
+
+
+              <tr valign="top">
+                <td>
+                  <code>H5Pget_file_space_strategy</code>
+                       
+                </td>
+                <td>
+                  Retrieves the file space handling strategy for a file creation property list. 
+                </td>
+               </tr>
+
+                <tr valign="top">
+                 <td>
+                    <code>H5Pset_file_space_strategy</code>
+                  </td>
+                 <td>
+                    Sets the file space allocation strategy for a file creation property list.  
+                  </td>
+               </tr>
+             </table>
+
+             <!-- end nested table -->
+           </dd>
+ <p />
+           <dt><a href="/HDF5/docNewFeatures/index.html#pbuf">Page Buffering</a>:
+            <br /> 
+            </dt>
+
+             <dd>
+
+              <!-- start nested table -->
+              <table>
+                <tr valign="top">
+                  <td>
+                  <code>H5Pget_page_buffer_size </code>
+                                
+                  </td>
+                 <td>
+                  Retrieves the maximum size for the page buffer and the minimum percentage for metadata and 
+                  raw data pages. 
+                  </td>
+                </tr>
+
+                <tr valign="top">
+                  <td>
+                  <code>H5Pset_page_buffer_size </code>
+                  </td>
+                 <td>
+                  Sets the maximum size for the page buffer and the minimum percentage for metadata and raw data pages. 
+                  </td>
+                </tr>
+
+            
+                <tr valign="top">
+                  <td>
+                  <code>H5Fget_page_buffering_stats</code>
+                  </td>
+                 <td>
+                  Retrieves statistics about page access when it is enabled. 
+                  </td>
+                </tr>
+
+                <tr valign="top">
+                  <td>
+                  <code>H5Freset_page_buffering_stats</code>
+                  </td>
+                 <td>
+                  Resets the page buffer statistics. 
+                  </td>
+                </tr>
+
+              </table>
+             <!-- end nested table -->
+            </dd>
+
+        </dl>
+       </dir>
+</dir>
+
+
+<a name="1100">
+<h2>Release 1.10.0 of March 2016  versus Release 1.8.16</h2>
 </a>
 <dir>
 
@@ -278,7 +481,7 @@ in the transition from HDF5 Release 1.8.16 to Release 1.10.0.
     <h3>New Features and Feature Sets</h3>
         <dir>
         <dl>    
-            <dt>Several new features are introduced in HDF5 Relesase 1.10.0.
+            <dt>Several new features are introduced in HDF5 Release 1.10.0.
             <dd>Single-Writer / Multiple-Reader or SWMR
                 </dd>
             <dd>Collective Metadata I/O
@@ -1169,12 +1372,12 @@ in the transition from HDF5 Release 1.8.16 to Release 1.10.0.
 
 
 <tr>
-    <td valign="top" width="25%">
+    <td valign="top">
 <!--<a href="VDS/H5Pset_layout.htm">-->
     <code>H5Pset_layout</code></a>
     <br />
     <code>h5pset_layout_f</code></td>
-    <td valign="top" width="75%">
+    <td>
     Specifies the layout to be used for a dataset.
     <br />
     Virtual dataset, <code>H5D_VIRTUAL</code>, has been added 
@@ -1183,12 +1386,12 @@ in the transition from HDF5 Release 1.8.16 to Release 1.10.0.
 
 
 <tr>
-    <td valign="top" width="25%">
+    <td">
 <!--<a href="VDS/H5Pget_layout.htm">-->
     <code>H5Pget_layout</code></a>
     <br />
     <code>h5pget_layout_f</code></td>
-    <td valign="top" width="75%">
+    <td>
     Retrieves the layout in use for a dataset.
     <br />
     Virtual dataset, <code>H5D_VIRTUAL</code>, has been added 
@@ -2307,7 +2510,6 @@ Release to Release for HDF5 Releases 1.4.0 through 1.6.10</a>”.
 </td></tr>
 </table>
 </center>
-<hr>
 <!-- #EndLibraryItem -->
 
 
@@ -2316,7 +2518,7 @@ Release to Release for HDF5 Releases 1.4.0 through 1.6.10</a>”.
 <!-- Created: Spring 1999 -->
 <!-- hhmts start -->
 <hr />
-Last modified: 8 April 2016
+Last modified: March 2017 
 <!-- hhmts end -->
 <br />
 <br />
diff --git a/html/ADGuide/Changes_1_8_x.html b/html/ADGuide/Changes_1_8_x.html
index 49fd551..c5dee32 100644
--- a/html/ADGuide/Changes_1_8_x.html
+++ b/html/ADGuide/Changes_1_8_x.html
@@ -102,6 +102,382 @@ and discussions of various compatibility issues.
 <br />
 
 
+<a name="1818">
+<h2>Release 1.8.18 of November 2016 versus Release 1.8.17</h2>
+</a>
+<dir>
+
+This section lists interface-level changes and 
+other user-visible changes in behavior 
+in the transition from HDF5 Release 1.8.17 to Release 1.8.18.
+
+    <h3>New and Changed Functions, Classes, Subroutines, Wrappers, 
+        and Macros</h3>
+        <dir>
+        <dl>    
+            <dt><strong>In the C Interface (main library)</strong>
+            <dt>None.</dt> 
+            <p />
+
+            <dt><strong>In the C++ Interface (main library wrappers)</strong>
+            <dt>The macro <code>H5_NO_NAMESPACE</code> was deprecated.</dt>
+            <br />
+            <dt>
+            <dt>New member functions added to provide <code>const</code> versions:
+                </dt>
+                <dd><code>DSetCreatPropList::allFiltersAvail() const</code></dd>
+                <dd><code>DSetCreatPropList::getAllocTime () const</code></dd>
+                <dd><code>DSetCreatPropList::getFillTime () const</code></dd>
+                <dd><code>DSetCreatPropList::isFillValueDefined () const</code></dd>
+                <dd><code>DSetCreatPropList::setAllocTime (H5D_alloc_time_t alloc_time) const</code></dd>
+                <dd><code>DSetCreatPropList::setFillTime (H5D_fill_time_t fill_time) const</code></dd>
+                <dd><code>DSetMemXferPropList::getEDCCheck () const</code></dd>
+                <dd><code>DSetMemXferPropList::getHyperVectorSize () const</code></dd>
+                <dd><code>DSetMemXferPropList::getSmallDataBlockSize () const</code></dd>
+                <dd><code>DSetMemXferPropList::setEDCCheck (H5Z_EDC_t check) const</code></dd>
+                <dd><code>DSetMemXferPropList::setHyperVectorSize (size_t vector_size) const</code></dd>
+                <dd><code>DSetMemXferPropList::setSmallDataBlockSize (hsize_t size) const</code></dd>
+                <dd><code>FileAccPropList::getFcloseDegree () const</code></dd>
+                <dd><code>FileAccPropList::setFcloseDegree (H5F_close_degree_t degree) const</code></dd>
+            </dt>
+
+ <br />
+
+            <dt>The following member functions were removed:</dt>
+            <dd><code>ArrayType::getArrayDims (hsize_t* dims)</code></dd>
+            <dd><code>ArrayType::getArrayNDims ()</code></dd>
+
+            <dd><code>DataType::commit (H5Location& loc, char const* name)</code></dd>
+            <dd><code>DataType::commit (H5Location& loc, std::string const& name)</code></dd>
+            <dd><code>DSetCreatPropList::allFiltersAvail ()</code></dd>
+            <dd><code>DSetCreatPropList::getAllocTime ()</code></dd>
+            <dd><code>DSetCreatPropList::getFillTime ()</code></dd>
+            <dd><code>DSetCreatPropList::isFillValueDefined ()</code></dd>
+            <dd><code>DSetCreatPropList::setAllocTime (H5D_alloc_time_t alloc_time)</code></dd>
+            <dd><code>DSetCreatPropList::setFillTime (H5D_fill_time_t fill_time)</code></dd>
+
+            <dd><code>DSetMemXferPropList::getEDCCheck ()</code></dd>
+            <dd><code>DSetMemXferPropList::getHyperVectorSize ()</code></dd>
+            <dd><code>DSetMemXferPropList::getSmallDataBlockSize ()</code></dd>
+            <dd><code>DSetMemXferPropList::setEDCCheck (H5Z_EDC_t check)</code></dd>
+            <dd><code>DSetMemXferPropList::setHyperVectorSize (size_t vector_size)</code></dd>
+            <dd><code>DSetMemXferPropList::setSmallDataBlockSize (hsize_t size)</code></dd>
+
+            <dd><code>FileAccPropList::getFcloseDegree ()</code></dd>
+            <dd><code>FileAccPropList::setFcloseDegree (H5F_close_degree_t degree)</code></dd>
+            
+            <dd><code>H5Location::H5Location [in-charge] (hid_t const loc_id)</code></dd>
+            <dd><code>H5Location::H5Location [not-in-charge] (hid_t const loc_id)</code></dd>
+
+            <dd><code>H5Object::H5Object [in-charge] (hid_t const object_id)</code></dd>
+            <dd><code>H5Object::H5Object [not-in-charge] (hid_t const object_id)</code></dd>
+
+            <dd><code>CommonFG::mount (char const* name, H5File& child, PropList& plist) const</code></dd>
+            <dd><code>DataSet::getVlenBufSize (DataType& type, DataSpace& space) const</code></dd>
+            <dd><code>DataType::commit (H5Location& loc, char const* name)</code></dd>
+            <dd><code>DataType::commit (H5Location& loc, std::string const& name) </code></dd>
+
+               
+
+            </dl>    
+            <font color="brown"><i>
+            </i></font>
+
+        </dl>    
+        </dir>
+
+
+    <h3>Compatibility Notes and Report and Comments</h3>
+        <dir>
+        <dl>    
+            <dt><strong>Compatibility report for Release 1.8.18 versus 
+                Release 1.8.17</strong>
+                </dt>
+                <dd>
+                    The following interface compatibility report
+                    provides a full list of the changed symbols:
+                    <p />
+                    <a href="Compatibility_Report/CR_1.8.18.html">API
+                    compatibility report for the HDF5 Library
+                    between 1.8.17 and 1.8.18 versions on x86_64 </a>
+
+                </dd>
+        </dl>    
+        </dir>
+
+</dir>
+
+
+<br /> 
+<br />
+
+ 
+<a name="1817">
+<h2>Release 1.8.17 of May 2016  versus Release 1.8.16</h2>
+</a>
+<dir>
+
+This section lists interface-level changes and 
+other user-visible changes in behavior 
+in the transition from HDF5 Release 1.8.16 to Release 1.8.17.
+
+    <h3>New and Changed Functions, Classes, Subroutines, Wrappers, 
+        and Macros</h3>
+        <dir>
+        <dl>    
+            <dt><strong>In the C Interface (main library)</strong>
+                </dt>
+
+            <dt>The following new C functions and environment variable 
+                enable setting a relative path for raw data files 
+                associated with datasets using external storage:
+                <dir><table border="0">
+                     <tr valign="top">
+                         <td>Functions:</td>
+                         <td><a href="../RM/RM_H5P.html#Property-SetEfilePrefix">
+                             <code>H5Pset_efile_prefix</code></a>
+                             <br />
+                             <a href="../RM/RM_H5P.html#Property-GetEfilePrefix">
+                             <code>H5Pget_efile_prefix</code></a>
+                             <br /> 
+                         </td></tr>
+                     <tr valign="middle">
+                         <td>Environment variable:   </td>
+                         <td><a href="../RM/RM_H5P.html#Property-SetEfilePrefix">
+                             <code>HDF5_EXTFILE_PREFIX</code></a>
+                         </td></tr>
+                     </table>
+                </dir>
+                </dt>
+
+
+
+            <p />
+            <dt><strong>In the C High-Level Interface</strong>
+                </dt>
+
+            <dt>The following new functions have been added in the
+                Packet Table (H5PT) high-level interface:
+                <dir><code>H5PTcreate</code>
+                    <br>
+                    <code>H5PTget_dataset</code>
+                    <br>
+                    <code>H5PTget_type</code>
+                </dir> 
+                </dt> 
+            <dt><code>H5PTcreate</code> replaces <code>H5PTcreate_fl</code>,
+                which is deprecated and may be removed in a future release.
+                </dt>
+            <p />
+            <dt>The following functions were previously removed from the 
+                library distribution but are once again publicly available.
+                </dt>
+                <dir><dl>
+                <dt>Reinstated in its original form:
+                <dir><code>H5PTis_varlen</code>
+                </dir>
+                </dt>
+                <dt>An updated form of <code>H5PTfree_vlen_readbuff</code>
+                reinstated as: 
+                <dir><code>H5PTfree_vlen_buff</code>
+                </dir>
+                </dt>
+                </dl></dir>
+
+
+
+            <p />
+            <dt><strong>In the C++ Interface (main library wrappers)</strong>
+                </dt>
+
+            <dt>New member function added in <code>DSetCreatPropList</code>:
+                </dt>
+
+                <dd><code>DSetCreatPropList::setNbit()</code>
+                    was added to set up N-bit compression for a dataset.
+                    </dd>
+
+
+            <p />
+            <dt>New overloaded <code>const</code> member functions added in 
+                <code>ArrayType</code>:
+                </dt>
+
+                <dd>The following functions were added to provide const versions; 
+                    the non-const versions have been marked deprecated.
+                    <pre>
+    ArrayType::getArrayNDims() const
+    ArrayType::getArrayDims() const
+                    </pre>
+                    
+            <dt>The datamembers <code>ArrayType::rank</code>
+                and <code>ArrayType::dimensions</code> have been removed. 
+                This is an implementation detail and should not affect 
+                applications.
+                </dt>
+
+
+
+            <p />
+            <dt><strong>In the C++ High-Level Interface</strong>
+                </dt>
+
+            <dt>New constructor added in <code>FL_PacketTable</code>:
+                </dt>
+
+                <dd>An overloaded constructor has been added to 
+                    <code>FL_PacketTable</code>. The function now takes 
+                    a property list identifier to provide flexibility 
+                    on creation properties such as compression.
+                    <pre>
+    FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID,
+                   hsize_t chunkSize = 0, hid_t plistID = H5P_DEFAULT)
+                    </pre>
+                </dd>
+
+
+            <dt>New member functions added in <code>PacketTable</code>:
+                </dt>
+
+                <dd>Two accessor wrappers were added to class 
+                    <code>PacketTable</code>.
+                    <dir>
+                    <p />
+                    <code>PacketTable::GetDataset()</code> returns the 
+                    identifier of the dataset associated with the 
+                    packet table.
+                    <p />
+                    <code>PacketTable::GetDatatype()</code> returns the 
+                    identifier of the datatype that the packet table uses.
+                    </dir>
+                </dd>
+
+
+            <dt>New member functions added with a <code>char*</code> 
+                argument:
+                </dt>
+
+                <dd>Overloaded functions have been added to provide a 
+                    <code>const char*</code> argument.
+                    The existing versions of these functions will be 
+                    deprecated in future releases. 
+                    <p />
+                    This also removes the following warning:
+                    <pre>
+    deprecated conversion from string constant to "char*" [-Wwrite-strings]
+                    </pre>
+                </dd>
+
+
+            <dt>Ifdef blocks removed:
+                </dt>
+
+                <dd>The <code>#ifdef VLPT_REMOVED</code> blocks have been 
+                    removed from the packet table library source code 
+                    except for the following functions:
+                    <p />
+                    <code>VL_PacketTable::IsVariableLength()</code>
+                    was moved to <code>PacketTable</code>.
+                    <p />
+                    <code>VL_PacketTable::FreeReadBuff()</code>
+                    is now <code>PacketTable::FreeBuff()</code>.
+                </dd>
+
+
+
+        </dl>    
+        </dir>
+
+
+    <h3>Compatibility Notes and Report</h3>
+        <dir>
+        <dl>    
+<!--
+            <dt><strong>Notes (there aren't always any):</strong>
+                </dt>
+                <dd><Notes>
+                    <p />
+                </dd>
+-->
+
+            <dt><strong>Changed shared library interface version 
+                numbers (<code>soname</code>)</strong>
+                </dt>
+                <dd>
+                    For HDF5 Release 1.8.17, the shared object version numbers 
+                    have changed as follows.
+                    <dir>
+                    <table width="100%" border="0">
+                    <tr valign="bottom" align="left">
+                      <th>Library</td>
+                      <th>Release<br />1.8.16     </td>
+                      <th>Release<br />1.8.17     </td>
+                      <th>Reason for Change</td>
+                    </tr>
+                    <tr valign="top" align="left">
+                      <td>HDF5 C Library</td>
+                      <td>10.1.0</td>
+                      <td>10.2.0</td>
+                      <td>Added APIs</td>
+                    </tr>
+                    <tr valign="top" align="left">
+                      <td>HDF5 High-level C Library  </td>
+                      <td>10.0.2</td>
+                      <td>10.1.0</td>
+                      <td>Added APIs</td>
+                    </tr>
+                    <tr valign="top" align="left">
+                      <td>C++ Library</td>
+                      <td>11.0.0</td>
+                      <td>12.0.0</td>
+                      <td>Changes in existing APIs</td>
+                    </tr>
+                    <tr valign="top" align="left">
+                      <td>High-level C++ Library</td>
+                      <td>11.0.0</td>
+                      <td>11.1.0</td>
+                      <td>Added APIs</td>
+                    </tr>
+                    <tr valign="top" align="left">
+                      <td>All others</td>
+                      <td>10.0.2</td>
+                      <td>10.0.3</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.17 versus 
+                Release 1.8.16</strong>
+                </dt>
+                <dd>
+                    The following interface compatibility report 
+                    provides a full list of the changed symbols:
+                    <p />
+                    <a href="Compatibility_Report/CR_1.8.17.html">API 
+                    compatibility report for the HDF5 Library 
+                    between 1.8.16 and 1.8.17 versions on 
+                    x86</a>
+                </dd>
+
+
+        </dl>
+        </dir>
+
+
+
+
+
+    <br />
+</dir>
+
+
+</dir>
+
+
 
 
 <a name="1816">
diff --git a/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx b/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx
index 1ed1cbd..8686028 100644
Binary files a/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx and b/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx differ
diff --git a/html/Advanced.html b/html/Advanced.html
index 720e1d6..608768a 100644
--- a/html/Advanced.html
+++ b/html/Advanced.html
@@ -200,6 +200,7 @@
           <hr color="green" size="1"/>
           </td></tr>
 
+<!--
       <tr><td valign="top"><a href="Advanced/FileSpaceManagement/FileSpaceManagement.pdf">
           HDF5 File Space</a>
           <br />   
@@ -211,6 +212,7 @@
           <b>??????? Unreleased development work. Not for 1.8 release 
           yet if ever. ???????</b>
         </td></tr>
+-->
 
       <tr><td colspan="3"> </td></tr>
 
@@ -337,11 +339,11 @@
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem --><address>
+<!-- #EndLibraryItem -->
 
 <?php include("./ed_libs/Footer.htm"); ?>
 
-Last modified:  16 September 2015
+Last modified: March 2017 
 
 
 </body>
diff --git a/html/Copyright.html b/html/Copyright.html
index 181d3fa..10dd9bb 100644
--- a/html/Copyright.html
+++ b/html/Copyright.html
@@ -9,143 +9,15 @@
 <body bgcolor="#FFFFFF">
 <!-- NEW PAGE -->
 
-
-<hr>               
-
-<h3>Copyright Notice and License Terms for
-<br>
-HDF5 (Hierarchical Data Format 5) Software Library and Utilities</h3>
-<hr>               
-<p>
-
-
-HDF5 (Hierarchical Data Format 5) Software Library and Utilities
-<br>
-Copyright 2006-2016 by The HDF Group.
-<p>
-NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
-<br>
-Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
-<p>
-<strong>All rights reserved.</strong>
-<p>
-
-<p>
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted for any purpose (including commercial purposes) 
-provided that the following conditions are met:
-
-<p>
-<ol>
-<li>
-Redistributions of source code must retain the above copyright notice, 
-this list of conditions, and the following disclaimer.
-
-<li>
-Redistributions in binary form must reproduce the above copyright notice, 
-this list of conditions, and the following disclaimer in the documentation 
-and/or materials provided with the distribution.
-
-<li>
-In addition, redistributions of modified forms of the source or binary code 
-must carry prominent notices stating that the original code was changed and 
-the date of the change.
-
-<li>
-All publications or advertising materials mentioning features or use of this 
-software are asked, but not required, to acknowledge that it was developed 
-by The HDF Group and by the National Center for Supercomputing Applications 
-at the University of Illinois at Urbana-Champaign and credit the contributors.
-
-<li>
-Neither the name of The HDF Group, the name of the University, nor the name 
-of any Contributor may be used to endorse or promote products derived from 
-this software without specific prior written permission from The HDF Group, 
-the University, or the Contributor, respectively.
-</ol>
-
-<p>
-<b>DISCLAIMER:</b>
-THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS 
-"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.  
-In no event shall The HDF Group or the Contributors be liable for any damages 
-suffered by the users arising out of the use of this software, even if advised 
-of the possibility of such damage. 
-
-
-<hr>
-<hr>
-
-<p>
-Contributors:   National Center for Supercomputing Applications  (NCSA) at 
-the University of Illinois, Fortner Software, Unidata Program Center (netCDF), 
-The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), 
-and Digital Equipment Corporation (DEC).
-
-<hr>
-
-<p>
-Portions of HDF5 were developed with support from the Lawrence Berkeley 
-National Laboratory (LBNL) and the United States Department of Energy 
-under Prime Contract No. DE-AC02-05CH11231.
-
-<hr>
-
-<p>
-Portions of HDF5 were developed with support from the University of 
-California, Lawrence Livermore National Laboratory (UC LLNL). 
-The following statement applies to those portions of the product and must 
-be retained in any redistribution of source code, binaries, documentation, 
-and/or accompanying materials:
-<dir>
-        This work was partially produced at the University of California, 
-        Lawrence Livermore National Laboratory (UC LLNL) under contract 
-        no. W-7405-ENG-48 (Contract 48) between the U.S. Department of 
-        Energy (DOE) and The Regents of the University of California 
-        (University) for the operation of UC LLNL.
-	<p>
-	<b>DISCLAIMER:</b>
-        This work was prepared as an account of work sponsored by an agency 
-        of the United States Government. Neither the United States Government 
-        nor the University of California nor any of their employees, makes 
-        any warranty, express or implied, or assumes any liability or 
-        responsibility for the accuracy, completeness, or usefulness of any 
-        information, apparatus, product, or process disclosed, or represents 
-        that its use would not infringe privately- owned rights. Reference 
-        herein to any specific commercial products, process, or service by 
-        trade name, trademark, manufacturer, or otherwise, does not 
-        necessarily constitute or imply its endorsement, recommendation, or 
-        favoring by the United States Government or the University of 
-        California. The views and 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.
-</dir>
-
 <hr>
+See the <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">COPYING</a> file for the HDF5 
+Copyright Notice and Licensing Terms. This file can also be found in the top
+directory of the HDF5 source code.
 
-<p>
-HDF5 is available with the SZIP compression library but SZIP is 
-<font size="+1"><i>not</i></font> part of HDF5 and has separate 
-copyright and license terms.  See
-“<a href="http://www.hdfgroup.org/doc_resource/SZIP/">Szip 
-Compression in HDF Products</a>” 
-(<code>www.hdfgroup.org/doc_resource/SZIP/</code>) 
-for further details.
 
 
 <hr>
 
-<!--    DO NOT EDIT THE FOLLOWING 8 LINES;                           -->
-<!--    THEY ARE AUTOMATICALLY UPDATED BY DOCUMENTATION SOFTWARE.    -->
-
-<?php include("./ed_libs/Footer.htm"); ?>
-
-<SCRIPT LANGUAGE="JAVASCRIPT">
-<!--
-document.writeln("Last modified: 16 April 2014")
--->
-</SCRIPT>
 
 
 </body>
diff --git a/html/FileFormatSpecChunkDiagram.jpg b/html/FileFormatSpecChunkDiagram.jpg
new file mode 100644
index 0000000..03fd90a
Binary files /dev/null and b/html/FileFormatSpecChunkDiagram.jpg differ
diff --git a/html/HL/H5LT/H5LDget_dset_dims.htm b/html/HL/H5LT/H5LDget_dset_dims.htm
index 10b73ad..5c940eb 100644
--- a/html/HL/H5LT/H5LDget_dset_dims.htm
+++ b/html/HL/H5LT/H5LDget_dset_dims.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 8 December 2015
+    Last modified: 25 May 2016
     </i></font></div></dt>
     <br />
 
@@ -76,7 +76,7 @@
 
 <dt><strong>Example Usage:</strong></dt>
     <dd>
-    See the examples in <a href="H5LDget_dset_elmts.htm">
+    See the examples in <a href="#H5LDget_dset_elmts">
     <code>H5LDget_dset_elmts</code></a> for the usage of this routine.
     </dd>
     <br />
@@ -88,10 +88,10 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5LDget_dset_type_size.htm">H5LDget_dset_type_size</a></li>
-      <li><a href="H5LDget_dset_dims.htm">H5LDget_dset_dims</a></li>
-      <li><a href="H5LDget_dset_elmts.htm">H5LDget_dset_elmts</a></li>
-      <li><a href="h5watch.htm">h5watch</a></li>
+      <li><a href="#H5LDget_dset_type_size">H5LDget_dset_type_size</a></li>
+      <li><a href="#H5LDget_dset_dims">H5LDget_dset_dims</a></li>
+      <li><a href="#H5LDget_dset_elmts">H5LDget_dset_elmts</a></li>
+      <li><a href="../RM/Tools.html#Tools-Watch">h5watch</a></li>
     </ul>
     <br />
 
diff --git a/html/HL/H5LT/H5LDget_dset_elmts.htm b/html/HL/H5LT/H5LDget_dset_elmts.htm
index c43a57c..4be6989 100644
--- a/html/HL/H5LT/H5LDget_dset_elmts.htm
+++ b/html/HL/H5LT/H5LDget_dset_elmts.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 8 December 2015
+    Last modified: 25 May 2016
     </i></font></div></dt>
     <br />
 
@@ -258,10 +258,10 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-<li><a href="H5LDget_dset_type_size.htm">H5LDget_dset_type_size</a></li>
-<li><a href="H5LDget_dset_dims.htm">H5LDget_dset_dims</a></li>
-<li><a href="H5LDget_dset_elmts.htm">H5LDget_dset_elmts</a></li>
-<li><a href="h5watch.htm">h5watch</a></li>
+<li><a href="#H5LDget_dset_type_size">H5LDget_dset_type_size</a></li>
+<li><a href="#H5LDget_dset_dims">H5LDget_dset_dims</a></li>
+<li><a href="#H5LDget_dset_elmts">H5LDget_dset_elmts</a></li>
+<li><a href="../RM/Tools.html#Tools-Watch">h5watch</a></li>
     </ul>
     <br />
 
diff --git a/html/HL/H5LT/H5LDget_dset_type_size.htm b/html/HL/H5LT/H5LDget_dset_type_size.htm
index 2cb5b92..91852e2 100644
--- a/html/HL/H5LT/H5LDget_dset_type_size.htm
+++ b/html/HL/H5LT/H5LDget_dset_type_size.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 8 December 2015
+    Last modified: 25 May 2016
     </i></font></div></dt>
     <br />
 
@@ -86,7 +86,7 @@
 <dt><strong>Example Usage:</strong></dt>
     <dd>
     See the examples in 
-    <a href="H5LDget_dset_elmts.htm"><code>H5LDget_dset_elmts</code></a>
+    <a href="#H5LDget_dset_elmts"><code>H5LDget_dset_elmts</code></a>
     for the usage of this routine.
     </dd>
     <br />
@@ -97,10 +97,10 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5LDget_dset_type_size.htm">H5LDget_dset_type_size</a></li>
-      <li><a href="H5LDget_dset_dims.htm">H5LDget_dset_dims</a></li>
-      <li><a href="H5LDget_dset_elmts.htm">H5LDget_dset_elmts</a></li>
-      <li><a href="h5watch.htm">h5watch</a></li>
+      <li><a href="#H5LDget_dset_type_size">H5LDget_dset_type_size</a></li>
+      <li><a href="#H5LDget_dset_dims">H5LDget_dset_dims</a></li>
+      <li><a href="#H5LDget_dset_elmts">H5LDget_dset_elmts</a></li>
+      <li><a href="../RM/Tools.html#Tools-Watch">h5watch</a></li>
     </ul>
     <br />
 
diff --git a/html/HL/HDF5Optimized/H5DOappend.htm b/html/HL/HDF5Optimized/H5DOappend.htm
index 9574d37..23aec6e 100644
--- a/html/HL/HDF5Optimized/H5DOappend.htm
+++ b/html/HL/HDF5Optimized/H5DOappend.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 9 December 2015
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -110,7 +110,8 @@
 
 <dt><strong>Example Usage:</strong></dt> 
     <dd>
-    See the example in the entry for the <a href="H5Pset_append_flush.htm"> 
+    See the example in the entry for the 
+    <a href="../RM/RM_H5P.html#Property-SetAppendFlush"> 
     <code>H5Pset_append_flush</code> </a> API. The example illustrates the 
     usage of <code>H5DOappend</code> to append to a dataset. 
     </dd>
@@ -122,44 +123,48 @@
     <br />
 
 <dt><strong>See Also:</strong></dt>
-
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
+    <br />
 
 
 
 
-<br />
-
-
 <dt><strong>History:</strong></dt>
 <dd><table width="90%">
     <tr>
diff --git a/html/HL/RM_H5DS.html b/html/HL/RM_H5DS.html
index c80dcf5..13d861e 100755
--- a/html/HL/RM_H5DS.html
+++ b/html/HL/RM_H5DS.html
@@ -878,7 +878,7 @@ In the
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 10 February 2013 <br> \
+  Last modified:  February 2014 <br> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_H5IM.html b/html/HL/RM_H5IM.html
index f29f881..341cb83 100755
--- a/html/HL/RM_H5IM.html
+++ b/html/HL/RM_H5IM.html
@@ -990,7 +990,7 @@ In the
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 16 October 2015<br> \
+  Last modified: February 2017<br> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_H5LT.html b/html/HL/RM_H5LT.html
index 4ff2af4..f2f2e00 100755
--- a/html/HL/RM_H5LT.html
+++ b/html/HL/RM_H5LT.html
@@ -156,6 +156,12 @@ certain sets of features in the existing APIs. This version of the API has two s
           <li><a href="#H5LTget_dataset_ndims">H5LTget_dataset_ndims</a></li>
           <li><a href="#H5LTget_dataset_info">H5LTget_dataset_info</a></li>
         </ul>
+        <p align="left"><i>Dataset watch functions</i></p>
+        <ul>
+          <li><a href="#H5LDget_dset_type_size">H5LDget_dset_type_size</a></li>
+          <li><a href="#H5LDget_dset_dims">H5LDget_dset_dims</a></li>
+          <li><a href="#H5LDget_dset_elmts">H5LDget_dset_elmts</a></li>
+        </ul>
 <!--
         <p align="left"><i>General dataset functions</i></p>
         <ul>
@@ -2601,7 +2607,7 @@ end subroutine h5ltset_attribute_double_f
     
       <pre>
 subroutine h5ltset_attribute_f(loc_id, dset_name, attr_name, &
-                                      buf, SizeOf_buf_type, size, errcode )
+                                      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 
@@ -3612,6 +3618,14 @@ end subroutine h5ltget_attribute_info_f
     otherwise returns a negative value.
 </dl>
   
+<!-- INCLUDE H5LD FUNCTIONS. These are used by h5watch. -->
+
+<?php include("H5LT/H5LDget_dset_type_size.htm"); ?>
+<?php include("H5LT/H5LDget_dset_dims.htm"); ?>
+<?php include("H5LT/H5LDget_dset_elmts.htm"); ?>
+
+<!-- END H5LD FUNCTIONS. -->
+
 
 <!-- HEADER RIGHT " " -->
   
@@ -3673,7 +3687,7 @@ In the
 <!--
 document.writeln('\
 <address> \
-  Last modified: 11 May 2016<br> \
+  Last modified: February 2017<br> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_H5PT.html b/html/HL/RM_H5PT.html
index 469fa0d..2134e66 100755
--- a/html/HL/RM_H5PT.html
+++ b/html/HL/RM_H5PT.html
@@ -125,7 +125,7 @@ The following functions are part of the HDF5 Packet Table API.  </p>
       <p align="left"><i>Creation and Opening</i>
       <ul>
         <li><a href="#H5PTcreate">H5PTcreate</a></li>
-        <li><a href="#H5PTcreate_fl">H5PTcreate_fl</a></li>
+        <li><a href="#H5PTcreate_fl"><em>H5PTcreate_fl</em></a> *</li> 
 <!--    <li><a href="#H5PTcreate_vl">H5PTcreate_vl</a></li>               -->
         <li><a href="#H5PTopen">H5PTopen</a></li>
         <li><a href="#H5PTclose">H5PTclose</a></li>
@@ -165,6 +165,9 @@ The following functions are part of the HDF5 Packet Table API.  </p>
     </td>
   </tr>
 </table>
+<p>
+* Deprecated
+</p>
 
 
 
@@ -269,6 +272,12 @@ The following functions are part of the HDF5 Packet Table API.  </p>
     If <code>dtype_id</code> specifies a compound datatype, 
     one or more fields in that compound type may be variable-length.
 
+    <p>
+    Please note that <code>H5PTcreate_fl</code> has been deprecated.
+    <a href="#H5PTcreate"><code>H5PTcreate</code></a> should be used instead.
+    </p>
+   
+
   <dt><strong>Parameters:</strong> </dt>
 
     <dl>
@@ -968,7 +977,7 @@ In the
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 9 May 2016 <br> \
+  Last modified: February 2017 <br> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_H5PT_c++.html b/html/HL/RM_H5PT_c++.html
index 385bc14..d6a269f 100755
--- a/html/HL/RM_H5PT_c++.html
+++ b/html/HL/RM_H5PT_c++.html
@@ -480,6 +480,58 @@ In the
     “Create” Constructor</dt>
   <dt><strong>Signature:</strong></dt>
     <dd><code>FL_PacketTable(hid_t fileID, const char* ptname, 
+        hid_t dtypeID, hsize_t chunkSize, hid_t plistID)</code></dd>
+  <dt><strong>Purpose:</strong></dt>
+    <dd>Creates a new packet table for storing fixed-length or 
+        variable-length packets.</dd>
+  <dt><strong>Description:</strong></dt>
+    <dd>This constructor creates and opens a packet table, named 
+        <code>ptname</code>, in the file specified by <code>fileID</code>. 
+        Packets will be of the datatype specified by <code>dtypeID</code>. 
+        The packet table uses HDF5 chunked storage to allow it to 
+        grow. The chunk size can be specified by <code>chunkSize</code>. 
+        The chunk size affects performance, so it should be determined 
+        with care when performance is important. Compression can be 
+        set via the dataset creation property list, specified by 
+        <code>plistID</code>.</dd>
+  <dt><strong>Parameters:</strong></dt>
+    <dl>
+    <dt><code>hid_t fileID</code></dt>
+    <dd>IN: Identifier of the file or group to create the table within.</dd> 
+    <dt><code>const char * ptname</code></dt> 
+    <dd>IN: The name of the packet table to create.</dd> 
+    <dt><code>hid_t dtypeID</code></dt> 
+    <dd>IN: The datatype of a packet.</dd> 
+    <dt><code>hsize_t chunkSize</code></dt> 
+    <dd>IN: Desired chunk size; defaults to 0.</dd>
+    <dt><code>hid_t plistID</code></dt> 
+    <dd>IN: Identifier of the creation property list; defaults to 
+        <code>H5P_DEFAULT</code>.</dd>
+    </dl>
+  <dt><strong>History:</strong></dt>
+    <dd>
+    <table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong></td>
+          <td valign="top" align="left" width="90%">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">1.10.1 and 1.8.17    </td>
+          <td valign="top">Function revised.</td>
+        </tr>
+        </table>
+    </dd>
+  </dl>
+  
+  <br />
+  <hr />
+  <dl>
+  <dt style="background-color: #CCCCFF"><strong>Name:</strong> 
+    “Create” Constructor (deprecated in 1.10.1)</dt>
+  <dt><strong>Signature:</strong></dt>
+    <dd><code>FL_PacketTable(hid_t fileID, const char* ptname, 
         hid_t dtypeID, hsize_t chunkSize)</code></dd>
   <dt><strong>Purpose:</strong></dt>
     <dd>Creates a new packet table for storing fixed-length or 
@@ -512,20 +564,16 @@ In the
           <td valign="top" align="left" width="90%">
             <strong>Change</strong></td>
         </tr>
-<!--        <tr>
-          <td valign="top">1.10.1
-          ??????? comment out this row in 1.10.0 version of the doc 
-          ???????
-          </td>
+        <tr>
+          <td valign="top">1.10.1</td>
           <td valign="top">Function deprecated.</td>
         </tr>
--->
 <!-- 
 Comment out the 1.10.1 row above in the 1.10.0 version of the doc.
 -->
         <tr>
           <td valign="top">1.10.0</td>
-          <td valign="top">Function revised.</td>
+          <td valign="top">Function revised. Not available in 1.8.x.</td>
         </tr>
         </table>
     </dd>
@@ -791,7 +839,7 @@ In the
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 5 May 2016 <br /> \
+  Last modified: February 2017 <br /> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_H5TB.html b/html/HL/RM_H5TB.html
index a6aaa5d..e6c8e60 100755
--- a/html/HL/RM_H5TB.html
+++ b/html/HL/RM_H5TB.html
@@ -186,6 +186,7 @@ function only creates the table, it does not write data to it.</p>
     <td width="50%" valign="top">
       <p align="left"><i>Retrieval</i>
       <ul>
+        <li><a href="#H5TBread_table">h5tbread_table_f</a></li>
         <li><a href="#H5TBread_fields_name">h5tbread_field_name_f</a></li>
         <li><a href="#H5TBread_fields_index">h5tbread_field_index_f</a></li>
       </ul>
@@ -644,6 +645,22 @@ end subroutine h5tbwrite_field_index_f
 
   <dt><strong>Returns:</strong> </dt>
   <dd>Returns a non-negative value if successful; otherwise returns a negative value. </dd>
+  <dt><strong>Fortran Interface:</strong>   h5tbread_table_f</dt>
+    <dd>
+
+      <pre>
+subroutine h5tbread_table_f(loc_id, table_name, nfields, dst_size, dst_offset, &
+                             dst_sizes, dst_buf, errcode)
+
+    integer(HID_T),   intent(IN) :: loc_id                            ! An array containing the sizes of the fields
+    character(LEN=*), intent(IN) :: table_name                        ! The name of the dataset to read
+    integer(HSIZE_T), intent(IN) :: nfields                           ! number of fields
+    integer(SIZE_T),  intent(IN) :: dst_size                          ! The size of the structure type
+    integer(SIZE_T),  dimension(1:nfields), intent(IN) :: dst_offset  ! An array containing the offsets of the fields
+    integer(SIZE_T),  dimension(1:nfields), intent(IN) :: dst_sizes   ! An array containing the sizes of the fields
+    type(C_PTR), intent(out) :: dst_buf                               ! Buffer with data
+    integer :: errcode                                                ! error code
+      </pre>
 </dl>
 
 <!-- NEW PAGE -->
@@ -1215,7 +1232,7 @@ end subroutine h5tbdelete_field_f
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 20 October 2011<br> \
+  Last modified: February 2017<br> \
 </address> \
 ');
 -->
diff --git a/html/HL/RM_HDF5Optimized.html b/html/HL/RM_HDF5Optimized.html
index 81a5972..ae0bf1c 100755
--- a/html/HL/RM_HDF5Optimized.html
+++ b/html/HL/RM_HDF5Optimized.html
@@ -118,22 +118,23 @@ and are available any time the HDF5 High-level Library is available.
       <ul>
         <li><a href="#H5DOwrite_chunk">H5DOwrite_chunk</a></li>
       </ul>
-<!--
-          <p align="left"><i>Fabricated Category</i>
+    </td>
+
+    <td width="50%" valign="top">
+      <p align="left"><i>Dataset Append Operation</i>
       <ul>
-        <li><a href="#H5OOfunction">H5OOfunction</a></li>
+        <li><a href="#H5DOappend">H5DOappend</a></li>
       </ul>
--->
     </td>
-    <td width="50%" valign="top">
-     
+
 <!--
+    <td width="50%" valign="top">
       <p align="left"><i>Fabricated Category</i>
       <ul>
         <li><a href="#H5OOfabrication">H5OOfabrication</a></li>
       </ul>
--->
     </td>
+-->
   </tr>
 </table>
 
@@ -430,6 +431,11 @@ if(H5Dread(dataset, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT,
 
 </dl>
 
+<!-- INCLUDE ADDITIONAL H5DO FUNCTIONS.  -->
+
+<?php include("HDF5Optimized/H5DOappend.htm"); ?>
+
+<!-- END ADDITIONAL H5DO FUNCTIONS. -->
 
   
 <hr> 
@@ -440,7 +446,7 @@ if(H5Dread(dataset, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT,
 <!--
 document.writeln(' \
 <address> \
-  Last modified: 28 February 2013<br> \
+  Last modified:  February 2016<br> \
 </address> \
 ');
 -->
diff --git a/html/RM/APICompatMacros.html b/html/RM/APICompatMacros.html
index acd8834..91c6aa6 100644
--- a/html/RM/APICompatMacros.html
+++ b/html/RM/APICompatMacros.html
@@ -93,18 +93,18 @@ HDF5 Release 1.10.x  to take advantage of the latest library
 features and enhancements.
 
 <h3>Compatibility Issues</h3>
-HDF5 Release 1.10.0 is a major update of the HDF5 Library. 
+HDF5 Release 1.10 is a major update of the HDF5 Library. 
 Certain compatibility issues must be considered when migrating 
 applications from an earlier major release series, such as 1.8.x or 1.6.x,
 to a HDF5 1.10.x release.
 <p>
 This document, “<cite>API Compatibility Macros in HDF5</cite>,” 
-describes the approach taken by The HDF Group in HDF5 Release 1.10.0 to 
+describes the approach taken by The HDF Group in HDF5 Release 1.10 to 
 help existing users of HDF5 address compatibility issues in the HDF5 API. 
 A companion document,
 <a href="/HDF5/docNewFeatures/index.html"><cite>New Features in 
-HDF5 Release 1.10.0</cite></a>, discusses 
-    features introduced in HDF5 Release 1.10.0 and 
+HDF5 Release 1.10</cite></a>, discusses 
+    features introduced in HDF5 Release 1.10 and 
     the HDF5 API calls associated with those features. 
 <!--
 The companion document,
@@ -125,7 +125,7 @@ To allow existing applications to continue to compile and run properly,
 all versions of these functions have been retained in the later
 releases of the HDF5 Library.
 <p>
-HDF5 Release 1.10.0 includes a number of new features that offer
+HDF5 Release 1.10 includes a number of new features that offer
 users of HDF5 substantial performance improvements and expanded
 capabilities.  Some of these features can only be accessed via 
 revised API calls.   Given the scope of the changes, and recognizing
@@ -160,7 +160,7 @@ and can be particularly helpful in situations such as these:
 <!-- NEW PAGE -->
 <h3>Understanding and Using the Macros</h3>
 
-As part of HDF5 Release 1.10.0, two functions that existed in 
+As part of HDF5 Release 1.10, two functions that existed in 
 previous versions of the library were updated with new calling
 parameters and given new names. 
 The updated versions of the functions have a ‘2’ at the end of the 
@@ -1003,7 +1003,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 16 March 2016");
+document.writeln("Last modified:  March 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/CollectiveCalls.html b/html/RM/CollectiveCalls.html
index 2937554..084892d 100644
--- a/html/RM/CollectiveCalls.html
+++ b/html/RM/CollectiveCalls.html
@@ -1977,7 +1977,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 8 May 2013");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 </body>
diff --git a/html/RM/H5A/H5Acreate2.htm b/html/RM/H5A/H5Acreate2.htm
index 963ab1b..fc7708b 100644
--- a/html/RM/H5A/H5Acreate2.htm
+++ b/html/RM/H5A/H5Acreate2.htm
@@ -64,10 +64,8 @@
       “<a href="RM_H5T.html#CreateVLString">Creating 
       variable-length string datatypes</a>.” 
       <p>
-      The attribute creation and access property lists are currently unused, 
-      but will be used in the future for optional attribute creation 
-      and access properties.  
-      These property lists should currently be <code>H5P_DEFAULT</code>.
+      The access property list is currently unused, but will be used in the future.
+      This property list should currently be <code>H5P_DEFAULT</code>.
       <p>
       The attribute identifier returned by this function must be released 
       with <a href="#Annot-Close"><code>H5Aclose</code></a> 
diff --git a/html/RM/H5A/H5Aexists.htm b/html/RM/H5A/H5Aexists.htm
index 744611c..9896d60 100644
--- a/html/RM/H5A/H5Aexists.htm
+++ b/html/RM/H5A/H5Aexists.htm
@@ -22,6 +22,10 @@
 <!-- HEADER RIGHT "H5Aexists" -->
 <hr>
 <dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Annot-Exists">H5Aexists</a>
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Aexists</code>(
@@ -54,10 +58,13 @@
     </table>
   <p>
   <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>, 
-        or <code>0</code> (zero), for <code>FALSE</code>. 
-        <br>
-        Otherwise returns a negative value.
+    <dd>
+        Returns a positive value if <code>attr_name</code> exists.
+        <br />
+        Returns 0 if <code>attr_name</code> does not exist.
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
   <p>
   <dt><strong>Fortran90 Interface:</strong> h5aexists_f
     <dd>
diff --git a/html/RM/H5A/H5Aexists_by_name.htm b/html/RM/H5A/H5Aexists_by_name.htm
index ef42a42..cac635b 100644
--- a/html/RM/H5A/H5Aexists_by_name.htm
+++ b/html/RM/H5A/H5Aexists_by_name.htm
@@ -22,6 +22,10 @@
 <!-- HEADER RIGHT "H5Aexists_by_name" -->
 <hr>
 <dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Annot-ExistsByName">H5Aexists_by_name</a>
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Aexists_by_name</code>(
@@ -87,10 +91,13 @@
     </table>
   <p>
   <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>, 
-        or <code>0</code> (zero), for <code>FALSE</code>. 
-        <br>
-        Otherwise returns a negative value.
+    <dd>
+        Returns a positive value if <code>attr_name</code> exists.
+        <br />
+        Returns 0 if <code>attr_name</code> does not exist.
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
   <p>
   <dt><strong>Fortran90 Interface:</strong> h5aexists_by_name_f
     <dd>
diff --git a/html/RM/H5D/H5Dcreate2.htm b/html/RM/H5D/H5Dcreate2.htm
index 86b50c8..8072cfd 100644
--- a/html/RM/H5D/H5Dcreate2.htm
+++ b/html/RM/H5D/H5Dcreate2.htm
@@ -72,6 +72,11 @@
         and “<a href="RM_H5T.html#CreateVLString">Creating 
         variable-length string datatypes</a>.” 
         <p>
+	If <code>dtype_id</code> is a committed datatype, and if the file location
+	associated with the committed datatype is different from the file location
+	where the dataset will be created, the datatype is copied and converted to a
+	transient type.
+        <p>
         The link creation property list, <code>lcpl_id</code>,
         governs creation of the link(s) by which the new dataset
         is accessed and the creation of any intermediate groups that 
diff --git a/html/RM/H5D/H5Dflush.htm b/html/RM/H5D/H5Dflush.htm
index 8a2c741..2a09172 100644
--- a/html/RM/H5D/H5Dflush.htm
+++ b/html/RM/H5D/H5Dflush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -73,35 +73,44 @@
     <dd>None</dd>
     <br />
 
+
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5D/H5Drefresh.htm b/html/RM/H5D/H5Drefresh.htm
index b9d0b29..f575b6f 100644
--- a/html/RM/H5D/H5Drefresh.htm
+++ b/html/RM/H5D/H5Drefresh.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -73,33 +73,41 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5E/H5Eset_auto.htm b/html/RM/H5E/H5Eset_auto.htm
index e8e3872..379fa3c 100644
--- a/html/RM/H5E/H5Eset_auto.htm
+++ b/html/RM/H5E/H5Eset_auto.htm
@@ -42,8 +42,7 @@
 
 <p>
 <dt><strong>Purpose:</strong>
-    <dd>Returns settings for automatic error stack
-        traversal function and its data.  
+    <dd> Turns automatic error printing on or off.
 
 <p>
 <dt><strong>Description:</strong>
diff --git a/html/RM/H5F/H5Fget_intent.htm b/html/RM/H5F/H5Fget_intent.htm
index fc337f9..b9b4e42 100644
--- a/html/RM/H5F/H5Fget_intent.htm
+++ b/html/RM/H5F/H5Fget_intent.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 12 March 2014
+    Last modified: 1 June 2016
     </i></font></div></dt>
     <br />
 
@@ -58,20 +58,20 @@
 
     <dir>
     <table width="100%">
-      <tr>
-        <td width="15%"><code>H5F_ACC_RDWR</code></td>
+      <tr valign="top">
+        <td width="15%"><code>H5F_ACC_RDWR</code> </td>
         <td width="85%">File was opened with read/write access.</td></tr>
-      <tr>
-        <td><code>H5F_ACC_RDONLY</code></td>
+      <tr valign="top">
+        <td><code>H5F_ACC_RDONLY</code> </td>
         <td>File was opened with read-only access.</td></tr>
-      <tr>
-        <td><code>H5F_ACC_SWMR_WRITE</code></td>
+      <tr valign="top">
+        <td><code>H5F_ACC_SWMR_WRITE  </code> </td>
         <td>File was opened with read/write access for a 
         single-writer/multiple-reader (SWMR) scenario. Note that the 
         writer process must also open the file with the 
-        <code>H5F_ACC_RDWR</code> flag. 
-      <tr>
-        <td><code>H5F_ACC_SWMR_READ</code></td>
+        <code>H5F_ACC_RDWR</code> flag. </td></tr>
+      <tr valign="top">
+        <td><code>H5F_ACC_SWMR_READ</code> </td>
         <td>File was opened with read-only access for a 
         single-writer/multiple-reader (SWMR) scenario. Note that the 
         reader process must also open the file with the 
diff --git a/html/RM/H5F/H5Fget_mdc_image_info.htm b/html/RM/H5F/H5Fget_mdc_image_info.htm
new file mode 100644
index 0000000..31f8720
--- /dev/null
+++ b/html/RM/H5F/H5Fget_mdc_image_info.htm
@@ -0,0 +1,88 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.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_mdc_image_info" -->
+<hr>
+<dl>
+<dt><strong>Name:</strong> <a name="File-GetMdcImageInfo">H5Fget_mdc_image_info</a>
+<dt><strong>Signature:</strong>
+    <dd><em>herr_t</em> <code>H5Fget_mdc_image_info</code>(<em>hid_t</em> 
+      <code>file_id</code>, 
+      <em>haddr_t</em> <code>*image_addr</code>,
+      <em>hsize_t</em> <code>*image_len</code>)
+<dt><strong>Purpose:</strong>
+
+    <dd>Obtain information about a cache image if it exists.</dd>
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Fget_mdc_image_info</code> returns information about a cache
+    image if it exists.
+    <p>
+    When an HDF5 file is opened in Read/Write mode, any metadata cache image will be 
+    read and deleted from the file on the first metadata cache access (or, if 
+    persistent  free  space  managers  are  enabled,  on  the  first  file space
+    allocation / deallocation, or read of free space manager status, whichever comes 
+    first).  
+    <p>Thus, if the file is opened Read/Write, <code>H5Fget_mdc_image_info</code> should 
+    be called immediately after file open and before any other operation. If 
+    <code>H5Fget_mdc_image_info</code> is called after the cache image is loaded, it 
+    will correctly report that no cache image exists, as the image will have already been 
+    read and deleted from the file.  In the Read Only case, the function may be called at any
+    time, as any cache image will not be deleted from the file.
+    </dd>
+   
+
+<dt><strong>Parameters:</strong>
+    <ul><table>
+        <tr>
+            <td valign="top"><em>hid_t</em> <code>file_id    </code></td>
+            <td valign="top">IN: Identifier of the target file.</td></tr>
+        <tr>
+            <td valign="top"><em>haddr_t</em> <code>*image_addr    </code></td>
+            <td valign="top">OUT: Offset of the cache image if it exists, or <code>HADDR_UNDEF</code> if it does not.</td></tr>
+        <tr>
+            <td valign="top"><em>hsize_t</em> <code>*image_len    </code></td>
+            <td valign="top">OUT: Length of the cache image if it exists, or <code>0</code> if it does not.</td></tr>
+
+            </tr>
+
+    </table></ul>
+<dt><strong>Returns:</strong>
+  <dd>Returns a non-negative value if successful; otherwise returns a negative value.
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+
diff --git a/html/RM/H5F/H5Fget_mdc_logging_status.htm b/html/RM/H5F/H5Fget_mdc_logging_status.htm
new file mode 100644
index 0000000..7c64ab6
--- /dev/null
+++ b/html/RM/H5F/H5Fget_mdc_logging_status.htm
@@ -0,0 +1,147 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Fget_mdc_logging_status" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified: 18 March 2014
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong></dt>
+    <dd><code><em>herr_t</em> H5Fget_mdc_logging_status(
+              <em>hid_t</em> file_id, 
+              <em>hbool_t</em> *is_enabled, 
+              <em>hbool_t</em> *is_currently_logging
+        )</code></dd>
+    <br />
+
+<dt><strong>Purpose:</strong></dt>
+    <dd>Gets the current metadata cache logging status.</dd>
+    <br />
+
+<dt><strong>Description:</strong></dt>
+    <dd>The metadata cache is a central part of the HDF5 library 
+    through which all <em>file metadata</em> reads and writes take 
+    place. File metadata is normally invisible to the user and is used 
+    by the library for purposes such as locating and indexing data. 
+    File metadata should not be confused with <em>user metadata</em>, 
+    which consists of attributes created by users and attached to 
+    HDF5 objects such as datasets via H5A API calls. 
+    
+    <p>Due to the complexity of the cache, a trace/logging feature has 
+    been created that can be used by HDF5 developers for debugging and 
+    performance analysis. The functions that control this functionality 
+    will normally be of use to a very limited number of developers 
+    outside of The HDF Group. The functions have been documented to help 
+    users create logs that can be sent with bug reports.</p>
+    
+    <p>Control of the log functionality is straightforward. Logging is 
+    enabled via the <code>H5Pset_mdc_log_options()</code> function, 
+    which will modify the file access property list used to open or create 
+    a file. This function has a flag that determines whether logging 
+    begins at file open or starts in a paused state. Log messages can 
+    then be controlled via the <code>H5Fstart/stop_logging()</code> 
+    functions. <code>H5Pget_mdc_log_options()</code> can be used to 
+    examine a file access property list, and 
+    <code>H5Fget_mdc_logging_status()</code> will return the current 
+    state of the logging flags.</p>
+    
+    <p>The log format is described in the 
+    <a href="/HDF5/docNewFeatures/FineTuneMDC/Design-MetadataCache-Logging-THG20140224-v4.pdf">
+    <em>Metadata Cache Logging</em></a> document.</p></dd>
+    <br />
+    
+<dt><strong>Notes:</strong></dt>
+    <dd>Unlike <code>H5Fstart/stop_mdc_logging()</code>, this function 
+    can be called on any open file identifier.</dd>
+    <br />
+
+
+
+<dt><strong>Parameters:</strong></dt>
+    <dd>
+    <table width="100%">
+      <tr valign="top">
+        <td width="20%"><code><em>hid_t</em> file_id</code> </td>
+        <td width="80%">IN: Identifier of an open HDF5 file.</td></tr>
+      <tr valign="top">
+        <td><code><em>hbool_t</em> *is_enabled</code> </td>
+        <td>OUT: Whether logging is enabled.</td></tr>
+      <tr valign="top">
+        <td><code><em>hbool_t</em> *is_currently_logging  </code> </td>
+        <td>OUT: Whether events are currently 
+            being logged.</td></tr>
+    </table>
+    </dd>
+    <br />
+
+<dt><strong>Returns:</strong></dt>
+    <dd>Returns a non-negative value if successful. 
+    Otherwise returns a negative value.</dd>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+    <ul>
+      <li><a href="RM_H5P.html#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a></li>
+      <li><a href="RM_H5P.html#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a></li>
+<!--
+      <li><a href="RM_H5F.html#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+-->
+      <li><a href="RM_H5F.html#File-StartMdcLogging">H5Fstart_mdc_logging</a></li>
+      <li><a href="RM_H5F.html#File-StopMdcLogging">H5Fstop_mdc_logging</a></li>
+    </ul>
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+          <strong>Release</strong></td>
+          <td valign="top" align="left" width="90%">
+          <strong>Change</strong></td></tr>
+        <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+          C function introduced with this release. </td></tr>
+        </table></dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5F/H5Fget_metadata_read_retries_info.htm b/html/RM/H5F/H5Fget_metadata_read_retries_info.htm
deleted file mode 100644
index ccbd735..0000000
--- a/html/RM/H5F/H5Fget_metadata_read_retries_info.htm
+++ /dev/null
@@ -1,415 +0,0 @@
-
-
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * 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.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-
-
-<!--__ ***********************************************************  -->
-<!--__ Do not alter the next line; it is used by the PDF generator. -->
-<!--__ ***********************************************************  -->
-<!-- NEW PAGE -->
-<!-- HEADER RIGHT "H5Pset_read_attempts" -->
-<hr>
-<dl>
-
-  <dt><div align="right"><font color="999999" size="-1"><i>
-      Last modified: 7 December 2015
-      </i></font></div></dt>
-  <br />
-
-  <dt><strong>Name:</strong> <a name="File-GetMetadataReadRetriesInfo">
-    H5Fget_metadata_read_retries_info</a></dt>
-    <br />
-
-  <dt><strong>Signature:</strong>
-    <dd><code><em>herr_t</em> H5Fget_metadata_read_retries_info(
-              <em>hid_t</em> file_id,
-              <em>H5F_retries_info_t</em>  *info
-        )</code>
-    </dd></dt><br />
-
-  <dt><strong>Purpose:</strong>
-    <dd>Retrieves the collection of read retries for metadata entries with 
-    checksum.
-    </dd></dt><br />
-
-  <dt><strong>Motivation:</strong>
-    <dd>On a system that is not atomic, the library might possibly read 
-    inconsistent metadata with checksum when performing 
-    single-writer/multiple-reader (SWMR) operations 
-    for an HDF5 file. Upon encountering such situations, the library will 
-    try reading the metadata again for a set number of times to attempt 
-    to obtain consistent data. The maximum number of read attempts used 
-    by the library will be either the value set via 
-    <code>H5Pset_metadata_read_attempts</code> or 
-    the library default value when a value is not set.
-    <br /><br />
-    When the current number of metadata read attempts used in the library 
-    is unable to remedy the reading of inconsistent metadata on a system, 
-    the user can assess the information obtained via this routine to 
-    derive a different maximum value. The information can also be helpful 
-    for debugging purposes to identify potential issues with metadata flush 
-    dependencies and SWMR implementation in general. 
-    </dd></dt><br />
-    
-  <dt><strong>Description:</strong>
-    <dd><code>H5Fget_metadata_read_retries_info</code> 
-      retrieves information regarding the number of read retries for 
-      metadata entries with checksum for the file <code>file_id</code>.
-      This information is reported in the <code>H5F_retries_info_t</code> struct
-      defined in <code>H5Fpublic.h</code> as follows:
-    <pre>
-        /* The number of metadata entries with checksum */
-        #define NUM_METADATA_READ_RETRIES         21        
-
-        typedef struct H5F_retries_info_t {
-            unsigned nbins;
-            uint32_t *retries[NUM_METADATA_READ_RETRIES];
-        } H5F_retries_info_t;
-    </pre>
-    
-    <p><code>nbins</code> is the number of bins for 
-    each <code>retries[i]</code> of metadata entry <code>i</code>.
-    It is calculated based on the current number of read attempts 
-    used in the library and logarithmic 10.</p>
-    
-    <p>If read retries are incurred for a metadata entry <code>i</code>,
-    the library will allocate memory 
-    for <code>retries[i] (nbins * sizeof(uint32_t)</code>
-    and store the collection of retries there.  
-    If there are no retries for a metadata entry <code>i</code>,
-    <code>retries[i]</code> will be NULL. After a call to this routine,
-    users should free each <code>retries[i]</code> that is non-NULL, 
-    otherwise resource leak will occur.</p>
-    
-    <p>For the library default read attempts of 100 for SWMR access, 
-    <code>nbins</code> will be 2 as depicted below:</p>
-    <ul>
-    <li><code>retries[i][0]</code> is the number of 1 to 9 read retries.</li>
-    <li><code>retries[i][1]</code> is the number of 10 to 99 read retries.</li>
-    </ul>
-    
-    <p>For the library default read attempts of 1 for non-SWMR access,
-    <code>nbins</code> will be 0 and each <code>retries[i]</code> will be NULL.</p>
-    
-    <p>The following table lists the 21 metadata entries of 
-    <code>retries[]</code>:</p>
-    
-    <table>
-      <tr><td><code>    </code></td>
-        <td>
-    <table>
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="3" /></td>
-        </tr>
-      <tr valign="top">
-        <th align="right" width="20%">Index for <code>retries[]</code></th>
-        <th width="5%"><code>    </code></th>
-        <th align="left" width="70%">Metadata entries<sup>*</sup></th>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="3" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">0  </td>
-        <td> </td>
-        <td align="left">Object header (version 2)</td>
-        </tr>
-      <tr align="top">
-        <td align="right">1  </td>
-        <td> </td>
-        <td align="left">Object header chunk (version 2)</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">2  </td>
-        <td> </td>
-        <td align="left">B-tree header (version 2)</td>
-        </tr>
-      <tr align="top">
-        <td align="right">3  </td>
-        <td> </td>
-        <td align="left">B-tree internal node (version 2)</td>
-        </tr>
-      <tr align="top">
-        <td align="right">4  </td>
-        <td> </td>
-        <td align="left">B-tree leaf node (version 2)</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">5  </td>
-        <td> </td>
-        <td align="left">Fractal heap header</td>
-        </tr>
-      <tr align="top">
-        <td align="right">6  </td>
-        <td> </td>
-        <td align="left">Fractal heap direct block 
-            (optional checksum)<code>  </code></td>
-        </tr>
-      <tr align="top">
-        <td align="right">7  </td>
-        <td> </td>
-        <td align="left">Fractal heap indirect block</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">8  </td>
-        <td> </td>
-        <td align="left">Free-space  header</td>
-        </tr>
-      <tr align="top">
-        <td align="right">9  </td>
-        <td> </td>
-        <td align="left">Free-space  sections</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">10  </td>
-        <td> </td>
-        <td align="left">Shared object header message table</td>
-        </tr>
-      <tr align="top">
-        <td align="right">11  </td>
-        <td> </td>
-        <td align="left">Shared message record list</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">12  </td>
-        <td> </td>
-        <td align="left">Extensive array header</td>
-        </tr>
-      <tr align="top">
-        <td align="right">13  </td>
-        <td> </td>
-        <td align="left">Extensive array index block</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">14  </td>
-        <td> </td>
-        <td align="left">Extensive array super block</td>
-        </tr>
-      <tr align="top">
-        <td align="right">15  </td>
-        <td> </td>
-        <td align="left">Extensive array data block</td>
-        </tr>
-      <tr align="top">
-        <td align="right">16  </td>
-        <td> </td>
-        <td align="left">Extensive array data block page</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">17  </td>
-        <td> </td>
-        <td align="left">Fixed array header</td>
-        </tr>
-      <tr align="top">
-        <td align="right">18  </td>
-        <td> </td>
-        <td align="left">Fixed array data block</td>
-        </tr>
-      <tr align="top">
-        <td align="right">19  </td>
-        <td> </td>
-        <td align="left">Fixed array data block page</td>
-        </tr>
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="1" /></td>
-        </tr>
-      <tr align="top">
-        <td align="right">20  </td>
-        <td> </td>
-        <td align="left">File’s superblock (version 2)</td>
-        </tr>
-
-      <tr valign="top" align="left">
-        <td colspan="3"><hr color="green" size="3" /></td>
-        </tr>
-      <tr valign="top" align="left">
-        <td colspan="3"><sup>*</sup> <i>All entries are of version 0 (zero)
-            unless indicated otherwise.</i></td>
-        </tr>
-    </table>
-        </td>
-      </tr>
-    </table>
-    </dd></dt><br />
-
-  <dt><strong>Parameters:</strong>
-    <dd>
-    <table>
-    <tr valign="top">
-      <td width="15%"><code><em>hid_t</em> file_id</code>
-           </td>
-      <td>
-          IN: Identifier for a currently opened HDF5 file.
-          </td></tr>
-    <tr valign="top">
-      <td><code><em>H5F_retries_info_t</em> *info   </code>
-          </td>
-      <td>OUT: Struct containing the collection of read retries 
-          for metadata entries with checksum.
-          </td></tr>
-    </table></dd></dt><br />
-
-  <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative value if successful;
-        otherwise returns a negative value.</dd></dt><br />
-
-  <dt><strong>Failure Modes:</strong>
-    <dd>When the input identifier is not a file identifier.
-    <p>When the pointer to the output structure is NULL.</p>
-    <p>When memory allocation failed for <code>retries</code>.</p>
-    </dd></dt><br />
-    
-
-  <dt><strong>Example Usage:</strong>
-    <dd>This example illustrates the case on retrieving the collection of 
-    read retries for a file opened with SWMR access.
-    <dir><pre>
-
-H5F_retries_info_t info;
-
-/* Get a copy of file access property list */
-fapl = H5Pcreate(H5P_FILE_ACCESS);
-
-/* Set to use the latest library format */
-H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
-
-/* Create a file with the latest library format */
-fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-
-/* Create groups/datasets etc. in the file */
-:
-:
-:
-
-/* Close the file */
-H5Fclose(fid);
-
-/* Open and perform operations via a writer. */
-fidw = H5Fopen(filename, H5F_ACC_RDWR |H5F_ACC_SWMR_WRITE, fapl);
-:
-:
-:
-:
-:
-/* Open and perform operations via a reader */
-fidr = H5Fopen(FILE, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
-:
-:
-:
-:
-:
-/* Retrieve the collection of read retries for the file */
-H5Fget_metadata_read_retries_info(fidr, &info);
-
-/* Print the collection of read retries */
-for(i = 0; i < NUM_METADATA_READ_RETRIES; i++) {
-    if(info. retries[i] != NULL) {
-        printf("Read retries for metadata entry %u:\n", i);
-
-        /* info.nbins will be 2 */
-        for(j = 0; j < info.nbins; j++)
-            /* 
-             * Print the following if nonzero:
-             * info.retries[i][0] for # of 1-9 read retries
-             * info.retries[i][1] for # of 10-99 read retries
-             */
-    } /* end if */
-} /* end for */
-
-/* Free the array of retries */
-for(i = 0; i < NUM_ METADATA_READ_RETRIES; i++)
-    if(info.retries[i] != NULL)
-        free(info.retries[i];
-:
-:
-:
-</pre></dir></dd></dt><br />
-
-<!--__ *** 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.                                                -->
-<!--__ ***********************************************************  -->
-
-  <dt><strong>Fortran Interface:</strong></dt>
-    <dd>None</dd>
-    <br />
-
-  <dt><strong>See Also:</strong>
-  <ul>
-    <li><a href="#Property-SetMetadataReadAttempts">
-        <code>H5Pset_metadata_read_attempts</code></a></li>
-    <li><a href="#Property-GetMetadataReadAttempts">
-        <code>H5Pget_metadata_read_attempts</code></a></li>
-    </ul>
-    <br />
-
-<!--__ ***********************************************************  -->
-<!--__ Do not modify the next 8 lines; they set up the table.       -->
-<!--__ ***********************************************************  -->
-
-  <dt><strong>History:</strong></dt>
-    <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 with this release. </td></tr>
-        </table></dd>
-
-</dl>
-<br />
-<br />
-<br />
-
-
-
diff --git a/html/RM/H5F/H5Fget_metadata_read_retry_info.htm b/html/RM/H5F/H5Fget_metadata_read_retry_info.htm
new file mode 100644
index 0000000..53f896e
--- /dev/null
+++ b/html/RM/H5F/H5Fget_metadata_read_retry_info.htm
@@ -0,0 +1,415 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_read_attempts" -->
+<hr>
+<dl>
+
+  <dt><div align="right"><font color="999999" size="-1"><i>
+      Last modified: 31 March 2016
+      </i></font></div></dt>
+  <br />
+
+  <dt><strong>Name:</strong> <a name="File-GetMetadataReadRetryInfo">
+    H5Fget_metadata_read_retry_info</a></dt>
+    <br />
+
+  <dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Fget_metadata_read_retry_info(
+              <em>hid_t</em> file_id,
+              <em>H5F_retry_info_t</em>  *info
+        )</code>
+    </dd></dt><br />
+
+  <dt><strong>Purpose:</strong>
+    <dd>Retrieves the collection of read retries for metadata entries with 
+    checksum.
+    </dd></dt><br />
+
+  <dt><strong>Motivation:</strong>
+    <dd>On a system that is not atomic, the library might possibly read 
+    inconsistent metadata with checksum when performing 
+    single-writer/multiple-reader (SWMR) operations 
+    for an HDF5 file. Upon encountering such situations, the library will 
+    try reading the metadata again for a set number of times to attempt 
+    to obtain consistent data. The maximum number of read attempts used 
+    by the library will be either the value set via 
+    <code>H5Pset_metadata_read_attempts</code> or 
+    the library default value when a value is not set.
+    <br /><br />
+    When the current number of metadata read attempts used in the library 
+    is unable to remedy the reading of inconsistent metadata on a system, 
+    the user can assess the information obtained via this routine to 
+    derive a different maximum value. The information can also be helpful 
+    for debugging purposes to identify potential issues with metadata flush 
+    dependencies and SWMR implementation in general. 
+    </dd></dt><br />
+    
+  <dt><strong>Description:</strong>
+    <dd><code>H5Fget_metadata_read_retry_info</code> 
+      retrieves information regarding the number of read retries for 
+      metadata entries with checksum for the file <code>file_id</code>.
+      This information is reported in the <code>H5F_retry_info_t</code> struct
+      defined in <code>H5Fpublic.h</code> as follows:
+    <pre>
+        /* The number of metadata entries with checksum */
+        #define NUM_METADATA_READ_RETRIES         21        
+
+        typedef struct H5F_retry_info_t {
+            unsigned nbins;
+            uint32_t *retries[H5F_NUM_METADATA_READ_RETRY_TYPES];
+        } H5F_retry_info_t;
+    </pre>
+    
+    <p><code>nbins</code> is the number of bins for 
+    each <code>retries[i]</code> of metadata entry <code>i</code>.
+    It is calculated based on the current number of read attempts 
+    used in the library and logarithmic 10.</p>
+    
+    <p>If read retries are incurred for a metadata entry <code>i</code>,
+    the library will allocate memory 
+    for <code>retries[i] (nbins * sizeof(uint32_t)</code>
+    and store the collection of retries there.  
+    If there are no retries for a metadata entry <code>i</code>,
+    <code>retries[i]</code> will be NULL. After a call to this routine,
+    users should free each <code>retries[i]</code> that is non-NULL, 
+    otherwise resource leak will occur.</p>
+    
+    <p>For the library default read attempts of 100 for SWMR access, 
+    <code>nbins</code> will be 2 as depicted below:</p>
+    <ul>
+    <li><code>retries[i][0]</code> is the number of 1 to 9 read retries.</li>
+    <li><code>retries[i][1]</code> is the number of 10 to 99 read retries.</li>
+    </ul>
+    
+    <p>For the library default read attempts of 1 for non-SWMR access,
+    <code>nbins</code> will be 0 and each <code>retries[i]</code> will be NULL.</p>
+    
+    <p>The following table lists the 21 metadata entries of 
+    <code>retries[]</code>:</p>
+    
+    <table>
+      <tr><td><code>    </code></td>
+        <td>
+    <table>
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="3" /></td>
+        </tr>
+      <tr valign="top">
+        <th align="right" width="20%">Index for <code>retries[]</code></th>
+        <th width="5%"><code>    </code></th>
+        <th align="left" width="70%">Metadata entries<sup>*</sup></th>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="3" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">0  </td>
+        <td> </td>
+        <td align="left">Object header (version 2)</td>
+        </tr>
+      <tr align="top">
+        <td align="right">1  </td>
+        <td> </td>
+        <td align="left">Object header chunk (version 2)</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">2  </td>
+        <td> </td>
+        <td align="left">B-tree header (version 2)</td>
+        </tr>
+      <tr align="top">
+        <td align="right">3  </td>
+        <td> </td>
+        <td align="left">B-tree internal node (version 2)</td>
+        </tr>
+      <tr align="top">
+        <td align="right">4  </td>
+        <td> </td>
+        <td align="left">B-tree leaf node (version 2)</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">5  </td>
+        <td> </td>
+        <td align="left">Fractal heap header</td>
+        </tr>
+      <tr align="top">
+        <td align="right">6  </td>
+        <td> </td>
+        <td align="left">Fractal heap direct block 
+            (optional checksum)<code>  </code></td>
+        </tr>
+      <tr align="top">
+        <td align="right">7  </td>
+        <td> </td>
+        <td align="left">Fractal heap indirect block</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">8  </td>
+        <td> </td>
+        <td align="left">Free-space  header</td>
+        </tr>
+      <tr align="top">
+        <td align="right">9  </td>
+        <td> </td>
+        <td align="left">Free-space  sections</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">10  </td>
+        <td> </td>
+        <td align="left">Shared object header message table</td>
+        </tr>
+      <tr align="top">
+        <td align="right">11  </td>
+        <td> </td>
+        <td align="left">Shared message record list</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">12  </td>
+        <td> </td>
+        <td align="left">Extensive array header</td>
+        </tr>
+      <tr align="top">
+        <td align="right">13  </td>
+        <td> </td>
+        <td align="left">Extensive array index block</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">14  </td>
+        <td> </td>
+        <td align="left">Extensive array super block</td>
+        </tr>
+      <tr align="top">
+        <td align="right">15  </td>
+        <td> </td>
+        <td align="left">Extensive array data block</td>
+        </tr>
+      <tr align="top">
+        <td align="right">16  </td>
+        <td> </td>
+        <td align="left">Extensive array data block page</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">17  </td>
+        <td> </td>
+        <td align="left">Fixed array header</td>
+        </tr>
+      <tr align="top">
+        <td align="right">18  </td>
+        <td> </td>
+        <td align="left">Fixed array data block</td>
+        </tr>
+      <tr align="top">
+        <td align="right">19  </td>
+        <td> </td>
+        <td align="left">Fixed array data block page</td>
+        </tr>
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="1" /></td>
+        </tr>
+      <tr align="top">
+        <td align="right">20  </td>
+        <td> </td>
+        <td align="left">File’s superblock (version 2)</td>
+        </tr>
+
+      <tr valign="top" align="left">
+        <td colspan="3"><hr color="green" size="3" /></td>
+        </tr>
+      <tr valign="top" align="left">
+        <td colspan="3"><sup>*</sup> <i>All entries are of version 0 (zero)
+            unless indicated otherwise.</i></td>
+        </tr>
+    </table>
+        </td>
+      </tr>
+    </table>
+    </dd></dt><br />
+
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+    <tr valign="top">
+      <td width="15%"><code><em>hid_t</em> file_id</code>
+           </td>
+      <td>
+          IN: Identifier for a currently opened HDF5 file.
+          </td></tr>
+    <tr valign="top">
+      <td><code><em>H5F_retry_info_t</em> *info   </code>
+          </td>
+      <td>OUT: Struct containing the collection of read retries 
+          for metadata entries with checksum.
+          </td></tr>
+    </table></dd></dt><br />
+
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd></dt><br />
+
+  <dt><strong>Failure Modes:</strong>
+    <dd>When the input identifier is not a file identifier.
+    <p>When the pointer to the output structure is NULL.</p>
+    <p>When memory allocation failed for <code>retries</code>.</p>
+    </dd></dt><br />
+    
+
+  <dt><strong>Example Usage:</strong>
+    <dd>This example illustrates the case on retrieving the collection of 
+    read retries for a file opened with SWMR access.
+    <dir><pre>
+
+H5F_retry_info_t info;
+
+/* Get a copy of file access property list */
+fapl = H5Pcreate(H5P_FILE_ACCESS);
+
+/* Set to use the latest library format */
+H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+
+/* Create a file with the latest library format */
+fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+
+/* Create groups/datasets etc. in the file */
+:
+:
+:
+
+/* Close the file */
+H5Fclose(fid);
+
+/* Open and perform operations via a writer. */
+fidw = H5Fopen(filename, H5F_ACC_RDWR |H5F_ACC_SWMR_WRITE, fapl);
+:
+:
+:
+:
+:
+/* Open and perform operations via a reader */
+fidr = H5Fopen(FILE, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+:
+:
+:
+:
+:
+/* Retrieve the collection of read retries for the file */
+H5Fget_metadata_read_retry_info(fidr, &info);
+
+/* Print the collection of read retries */
+for(i = 0; i < NUM_METADATA_READ_RETRIES; i++) {
+    if(info. retries[i] != NULL) {
+        printf("Read retries for metadata entry %u:\n", i);
+
+        /* info.nbins will be 2 */
+        for(j = 0; j < info.nbins; j++)
+            /* 
+             * Print the following if nonzero:
+             * info.retries[i][0] for # of 1-9 read retries
+             * info.retries[i][1] for # of 10-99 read retries
+             */
+    } /* end if */
+} /* end for */
+
+/* Free the array of retries */
+for(i = 0; i < NUM_ METADATA_READ_RETRIES; i++)
+    if(info.retries[i] != NULL)
+        free(info.retries[i];
+:
+:
+:
+</pre></dir></dd></dt><br />
+
+<!--__ *** 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.                                                -->
+<!--__ ***********************************************************  -->
+
+  <dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    <br />
+
+  <dt><strong>See Also:</strong>
+  <ul>
+    <li><a href="RM_H5P.html#Property-SetMetadataReadAttempts">
+        <code>H5Pset_metadata_read_attempts</code></a></li>
+    <li><a href="RM_H5P.html#Property-GetMetadataReadAttempts">
+        <code>H5Pget_metadata_read_attempts</code></a></li>
+    </ul>
+    <br />
+
+<!--__ ***********************************************************  -->
+<!--__ Do not modify the next 8 lines; they set up the table.       -->
+<!--__ ***********************************************************  -->
+
+  <dt><strong>History:</strong></dt>
+    <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 with this release. </td></tr>
+        </table></dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5F/H5Fget_obj_count.htm b/html/RM/H5F/H5Fget_obj_count.htm
index 932a838..f149aac 100644
--- a/html/RM/H5F/H5Fget_obj_count.htm
+++ b/html/RM/H5F/H5Fget_obj_count.htm
@@ -47,7 +47,7 @@
         <p>
         To retrieve a count of open identifiers for open objects in 
 	all HDF5 application files that are currently open, 
-        pass the value <code>H5F_OBJ_ALL</code> in <code>file_id</code>.
+        pass the value <code>(hid_t)H5F_OBJ_ALL</code> (<i>Fortran</i>: <code>INT(H5F_OBJ_ALL_F,HID_T)</code>) in <code>file_id</code>.
         <p>
         The types of objects to be counted are specified 
 	in <code>types</code> as follows:
diff --git a/html/RM/H5F/H5Fget_page_buffering_stats.htm b/html/RM/H5F/H5Fget_page_buffering_stats.htm
new file mode 100644
index 0000000..55729ee
--- /dev/null
+++ b/html/RM/H5F/H5Fget_page_buffering_stats.htm
@@ -0,0 +1,171 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5PBget_stats" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="File-GetPBStats">H5Fget_page_buffering_stats</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code>
+   <em>herr_t</em> H5Fget_page_buffering_stats( 
+     <em>hid_t</em> file_id, 
+     <em>int</em> accesses[2], 
+     <em>int</em> hits[2], 
+     <em>int</em> misses[2], 
+     <em>int</em> evictions[2], 
+     <em>int</em> bypasses[2] )
+     </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Retrieves statistics about page access when it is enabled.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+     <code>H5Fget_page_buffering_stats</code> retrieves page buffering statistics such as the number of metadata
+     and raw data accesses (<code>accesses</code>), hits (<code>hits</code>), misses 
+     (<code> misses</code>), evictions (<code> evictions</code>), and accesses that bypass the 
+     page buffer (<code>bypasses</code>).
+</p>
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                file_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>int</em> 
+                accesses</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Two integer array for the number of metadata and raw data accesses to the page buffer</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>int</em> 
+                hits</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Two integer array for the number of metadata and raw data hits in the page buffer </td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>int</em> 
+                misses</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Two integer array for the number of metadata and raw data misses in the page buffer</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>int</em> 
+                evictions</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Two integer array for the number of metadata and raw data evictions from the page buffer</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>int</em> 
+                bypasses</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Two integer array for the number of metadata and raw data accesses that bypass the page buffer</td>
+        </tr>
+
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5F/H5Fis_hdf5.htm b/html/RM/H5F/H5Fis_hdf5.htm
index 52a6617..b7ca39c 100644
--- a/html/RM/H5F/H5Fis_hdf5.htm
+++ b/html/RM/H5F/H5Fis_hdf5.htm
@@ -22,15 +22,27 @@
 <!-- HEADER RIGHT "H5Fis_hdf5" -->
 <hr>
 <dl>
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="File-IsHDF5">H5Fis_hdf5</a>
+<br />
+<br />
 <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Fis_hdf5</code>(<em>const char *</em><code>name</code>
         )
+<br />
+<br />
 <dt><strong>Purpose:</strong>
         <dd>Determines whether a file is in the HDF5 format.
+<br />
+<br />
 <dt><strong>Description:</strong>
         <dd><code>H5Fis_hdf5</code> determines whether a file is in 
             the HDF5 format.
+<br />
+<br />
 <dt><strong>Parameters:</strong>
     <ul><table>
         <tr>
@@ -38,11 +50,16 @@
             <td valign="top">IN: File name to check format.</td></tr>
     </table></ul>
 <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>,
-        or <code>0</code> (zero), for <code>FALSE</code>.
-        <br>
-        On any error, including the case that the file does not exist, 
-        returns a negative value.
+    <dd>
+        Returns a positive value if the file <code>name</code> is an 
+        HDF5 file.
+        <br />
+        Returns 0 if the file <code>name</code> is not an HDF5 file.
+        <br />
+        Returns a negative value when the function fails. This 
+        includes the case where the file does not exist.
+        </dd>
+<br />
 <dt><strong>Fortran90 Interface:</strong> h5fis_hdf5_f
     <dd>
     <pre>
diff --git a/html/RM/H5F/H5Freset_page_buffering_stats.htm b/html/RM/H5F/H5Freset_page_buffering_stats.htm
new file mode 100644
index 0000000..16d3a4c
--- /dev/null
+++ b/html/RM/H5F/H5Freset_page_buffering_stats.htm
@@ -0,0 +1,127 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5PBreset_stats" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="File-ResetPBStats">H5Freset_page_buffering_stats</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code>
+   <em>herr_t</em> H5PBreset_stats( 
+     <em>hid_t</em> file_id )
+     </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Resets the page buffer statistics.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+    <code>H5Freset_page_buffering_stats</code> resets the page buffer statistics for a specified file identifier
+    <code>file_id</code>. 
+</p>
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                file_id</code></td>
+            <td>IN: File identifier </td>
+            <td width="50%"><code> </code></td>
+        </tr>
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5F/H5Fstart_mdc_logging.htm b/html/RM/H5F/H5Fstart_mdc_logging.htm
index fca0239..d807dd4 100644
--- a/html/RM/H5F/H5Fstart_mdc_logging.htm
+++ b/html/RM/H5F/H5Fstart_mdc_logging.htm
@@ -74,7 +74,7 @@
     state of the logging flags.</p>
     
     <p>The log format is described in the 
-    <a href="Design-MetadataCache-Logging-THG20140224-v4.pdf">
+    <a href="/HDF5/docNewFeatures/FineTuneMDC/Design-MetadataCache-Logging-THG20140224-v4.pdf">
     <em>Metadata Cache Logging</em></a> document.</p></dd>
     <br />
     
@@ -115,10 +115,13 @@
 
 <dt><strong>See Also:</strong></dt>
     <dd>
-      <li><a href="H5Pset_mdc_log_options.htm">H5Pset_mdc_log_options</a></li>
-      <li><a href="H5Pget_mdc_log_options.htm">H5Pget_mdc_log_options</a></li>
-      <li><a href="H5Fstop_mdc_logging.htm">H5Fstop_mdc_logging</a></li>
-      <li><a href="H5Pget_mdc_logging_status.htm">H5Pget_mdc_logging_status</a>
+      <li><a href="RM_H5P.html#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a></li>
+      <li><a href="RM_H5P.html#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a></li>
+      <li><a href="RM_H5F.html#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+<!--
+      <li><a href="RM_H5F.html#File-StartMdcLogging">H5Fstart_mdc_logging</a></li>
+-->
+      <li><a href="RM_H5F.html#File-StopMdcLogging">H5Fstop_mdc_logging</a></li>
           </li>
     </dd>
     <br />
diff --git a/html/RM/H5F/H5Fstart_swmr_write.htm b/html/RM/H5F/H5Fstart_swmr_write.htm
index 3e90ea5..3fa3928 100644
--- a/html/RM/H5F/H5Fstart_swmr_write.htm
+++ b/html/RM/H5F/H5Fstart_swmr_write.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 18 February 2014
+    Last modified: 27 May 2014
     </i></font></div></dt>
     <br />
 
@@ -154,34 +154,41 @@ H5Fclose(read_file_id);
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
diff --git a/html/RM/H5F/H5Fstop_mdc_logging.htm b/html/RM/H5F/H5Fstop_mdc_logging.htm
index 7ce7179..f23d171 100644
--- a/html/RM/H5F/H5Fstop_mdc_logging.htm
+++ b/html/RM/H5F/H5Fstop_mdc_logging.htm
@@ -74,7 +74,7 @@
     state of the logging flags.</p>
     
     <p>The log format is described in the 
-    <a href="Design-MetadataCache-Logging-THG20140224-v4.pdf">
+    <a href="/HDF5/docNewFeatures/FineTuneMDC/Design-MetadataCache-Logging-THG20140224-v4.pdf">
     <em>Metadata Cache Logging</em></a> document.</p></dd>
     <br />
     
@@ -109,11 +109,13 @@
 
 <dt><strong>See Also:</strong></dt>
     <dd>
-    <li><a href="H5Pset_mdc_log_options.htm">H5Pset_mdc_log_options</a></li>
-    <li><a href="H5Pget_mdc_log_options.htm">H5Pget_mdc_log_options</a></li>
-    <li><a href="H5Fstart_mdc_logging.htm">H5Fstart_mdc_logging</a></li>
-    <li><a href="H5Pget_mdc_logging_status.htm">H5Pget_mdc_logging_status</a>
-        </li>
+      <li><a href="RM_H5P.html#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a></li>
+      <li><a href="RM_H5P.html#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a></li>
+      <li><a href="RM_H5F.html#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+      <li><a href="RM_H5F.html#File-StartMdcLogging">H5Fstart_mdc_logging</a></li>
+<!--
+      <li><a href="RM_H5F.html#File-StopMdcLogging">H5Fstop_mdc_logging</a></li>
+-->
     </dd>
     <br />
 
diff --git a/html/RM/H5G/H5Gflush.htm b/html/RM/H5G/H5Gflush.htm
index a16c18c..1dc6045 100644
--- a/html/RM/H5G/H5Gflush.htm
+++ b/html/RM/H5G/H5Gflush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -75,36 +75,43 @@
 <dt><strong>Fortran Interface:</strong></dt>
     <dd>None</dd>
     <br />
-
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5G/H5Grefresh.htm b/html/RM/H5G/H5Grefresh.htm
index b923f92..4e46a60 100644
--- a/html/RM/H5G/H5Grefresh.htm
+++ b/html/RM/H5G/H5Grefresh.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -75,33 +75,41 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5I/H5Iis_valid.htm b/html/RM/H5I/H5Iis_valid.htm
index 308ab0a..aff3477 100644
--- a/html/RM/H5I/H5Iis_valid.htm
+++ b/html/RM/H5I/H5Iis_valid.htm
@@ -22,10 +22,10 @@
 <!-- HEADER RIGHT "H5Iis_valid" -->
 <hr>
 <dl>
-<dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 15 June 2009
-      </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Identify-IsValid">H5Iis_valid</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Iis_valid</code>(
@@ -70,10 +70,13 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> if <code>obj_id</code> is valid and
-        <code>FALSE</code> if invalid.
-        Otherwise returns a negative value.
-
+    <dd>
+        Returns a positive value if <code>obj_id</code> is valid.
+        <br />
+        Returns 0 if <code>obj_id</code> is invalid. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <p>
 <dt><strong>See Also:</strong>
     <dd><ul>
diff --git a/html/RM/H5I/H5Itype_exists.htm b/html/RM/H5I/H5Itype_exists.htm
index 556213d..d1eedad 100644
--- a/html/RM/H5I/H5Itype_exists.htm
+++ b/html/RM/H5I/H5Itype_exists.htm
@@ -22,6 +22,10 @@
 <!-- HEADER RIGHT "H5Itype_exists" -->
 <hr>
 <dl>
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Identify-TypeExists">H5Itype_exists</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Itype_exists</code>(
@@ -42,11 +46,15 @@
     </table>
   </ul>
 <dt><strong>Returns:</strong>
-    <dd>Returns <code>1</code> if the type is registered and
-                <code>0</code> if not.
-        Returns a negative value on failure.
+    <dd>
+        Returns a positive value if the type is registered.
+        <br />
+        Returns 0 if the type is not registered. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <dt><strong>Fortran90 Interface:</strong>
-    <dd>None.
+    <dd>None
 <dt><strong>History:</strong>
     <ul><table width="90%">
         <tr>
diff --git a/html/RM/H5L/H5Lis_registered.htm b/html/RM/H5L/H5Lis_registered.htm
index 6898ab6..a358283 100644
--- a/html/RM/H5L/H5Lis_registered.htm
+++ b/html/RM/H5L/H5Lis_registered.htm
@@ -22,6 +22,10 @@
 <!-- HEADER RIGHT "H5Lis_registered" -->
 <hr>
 <dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+  
   <dt><strong>Name:</strong> <a name="Link-IsRegistered">H5Lis_registered</a>
   <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Lis_registered</code>(
@@ -50,10 +54,14 @@
     </table>
       <p></p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a positive value if the link class has been registered
-        and zero if it is unregistered.
-        Otherwise returns a negative value; this may mean that
-        the identifier is not a valid user-defined class identifier.
+    <dd>
+        Returns a positive value if the link class has been registered.
+        <br />
+        Returns 0 if the link class has not been registered. 
+        <br />
+        Returns a negative value if the identifier is not a valid user-defined 
+        class identifier or if the function fails. 
+        </dd>
       <p></p>
   <dt><strong>Fortran90 Interface:</strong> H5Lis_registered_f
     <dd>
diff --git a/html/RM/H5O/H5Oare_mdc_flushes_disabled.htm b/html/RM/H5O/H5Oare_mdc_flushes_disabled.htm
index e5b555b..309491e 100644
--- a/html/RM/H5O/H5Oare_mdc_flushes_disabled.htm
+++ b/html/RM/H5O/H5Oare_mdc_flushes_disabled.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 8 December 2015
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -100,40 +100,48 @@
     <dd>None</dd>
     <br />
 
-<dt><strong>See Also:</strong></dt>
 
+<dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
       <tr>
diff --git a/html/RM/H5O/H5Odecr_refcount.htm b/html/RM/H5O/H5Odecr_refcount.htm
index 96543c7..ab86e64 100644
--- a/html/RM/H5O/H5Odecr_refcount.htm
+++ b/html/RM/H5O/H5Odecr_refcount.htm
@@ -100,7 +100,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/H5O/H5Odisable_mdc_flushes.htm b/html/RM/H5O/H5Odisable_mdc_flushes.htm
index 45fcf22..29f87b3 100644
--- a/html/RM/H5O/H5Odisable_mdc_flushes.htm
+++ b/html/RM/H5O/H5Odisable_mdc_flushes.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 28 January 2016
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -117,40 +117,48 @@
     <dd>None</dd>
     <br />
 
-<dt><strong>See Also:</strong></dt>
 
+<dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5O/H5Oenable_mdc_flushes.htm b/html/RM/H5O/H5Oenable_mdc_flushes.htm
index 30cba9c..84c3349 100644
--- a/html/RM/H5O/H5Oenable_mdc_flushes.htm
+++ b/html/RM/H5O/H5Oenable_mdc_flushes.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 13 April 2016
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -119,40 +119,48 @@
     <dd>None</dd>
     <br />
 
-<dt><strong>See Also:</strong></dt>
 
+<dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5O/H5Oexists_by_name.htm b/html/RM/H5O/H5Oexists_by_name.htm
index f7d05f2..3c4c3be 100644
--- a/html/RM/H5O/H5Oexists_by_name.htm
+++ b/html/RM/H5O/H5Oexists_by_name.htm
@@ -24,7 +24,7 @@
 <dl>
 
   <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 10 April 2013
+      Last modified: 10 December 2015
       </i></font></div>
 
   <dt><strong>Name:</strong> <a name="Object-ExistsByName">H5Oexists_by_name</a>
@@ -156,16 +156,33 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> or <code>FALSE</code> if successful;
-        otherwise returns a negative value.
-
+    <dd>
+        Returns a positive value if the object pointed to by the 
+        <code>loc_id</code> and <code>name</code> combination exists.
+        <br />
+        Returns 0 if the object pointed to by the <code>loc_id</code> and 
+        <code>name</code> combination does not exist.
+        <br />
+        Returns a negative value when the function fails.
+        </dd>
   <p>
   <dt><strong>Failure Modes:</strong>
-    <dd>If the link specified by the <code>loc_id</code> and <code>name</code>
-        does not exist, an error will be returned.  If the link exists
-        but does not resolve to an object for any reason, this routine
-        will return <code>FALSE</code>, not <code>FAIL</code>.
-
+    <dd>If <code>loc_id</code> and <code>name</code> both exist but the 
+    combination does not resolve to an object, the function will return 
+    0 (zero); the function does not fail in this case.
+    
+    <p>If either the location or the link specified by the 
+    <code>loc_id</code> and <code>name</code> combination does not 
+    exist, the function will fail, returning a negative value.</p>
+    
+    <p>Note that verifying the existence of an object within an HDF5 
+    file is a multistep process. An application can be certain the 
+    object does not exist only if <code>H5Lexists</code> and 
+    <code>H5Oexists_by_name</code> have been used to verify the 
+    existence of the links and groups in the hierarchy above that object. 
+    The example above, in the function description, provides a 
+    step-by-step description of that verification process.</p>
+    
   <p>
   <dt><strong>See Also:</strong>
     <dd><a href="RM_H5L.html#Link-Exists">
diff --git a/html/RM/H5O/H5Oflush.htm b/html/RM/H5O/H5Oflush.htm
index 6fb9016..60c9593 100644
--- a/html/RM/H5O/H5Oflush.htm
+++ b/html/RM/H5O/H5Oflush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -80,33 +80,41 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5O/H5Oincr_refcount.htm b/html/RM/H5O/H5Oincr_refcount.htm
index 3bf1ee0..2820bb5 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/H5O/H5Orefresh.htm b/html/RM/H5O/H5Orefresh.htm
index 5985552..69067d3 100644
--- a/html/RM/H5O/H5Orefresh.htm
+++ b/html/RM/H5O/H5Orefresh.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -77,35 +77,42 @@
     <br />
 
 <dt><strong>See Also:</strong></dt>
-
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5P/H5Pall_filters_avail.htm b/html/RM/H5P/H5Pall_filters_avail.htm
index 2a1912e..535690c 100644
--- a/html/RM/H5P/H5Pall_filters_avail.htm
+++ b/html/RM/H5P/H5Pall_filters_avail.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 10 June 2010
-      </i></font></div>
-
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 10 December 2015
+      </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Property-AllFiltersAvail">H5Pall_filters_avail</a>
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Pall_filters_avail</code>(
@@ -54,13 +54,16 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> if all filters are available
-        and <code>FALSE</code> if one or more is not currently available.<br>
-        Returns <code>FAIL</code>, a  negative value, on error.
-
+    <dd>
+        Returns a positive value if all filters are available.
+        <br />
+        Returns 0 if at least one filter is not currently available. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
   <p>
   <dt><strong>Fortran90 Interface:</strong>
-    <dd>None.
+    <dd>None
 <!--
 	<pre>
 SUBROUTINE
diff --git a/html/RM/H5P/H5Pencode.htm b/html/RM/H5P/H5Pencode.htm
index c44ad00..125b17c 100644
--- a/html/RM/H5P/H5Pencode.htm
+++ b/html/RM/H5P/H5Pencode.htm
@@ -24,7 +24,7 @@
 <dl>
 
 <dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 30 March 2016</i></font></div>
+    Last modified: 28 September 2012</i></font></div>
 
 <dt><strong>Name:</strong> <a name="Property-Encode">H5Pencode</a>
 
@@ -75,14 +75,12 @@
         <p>
         Some properties cannot be encoded, particularly properties that 
         are reliant on local context.
-<!-- TEMPORARILY MASK UNTIL THESE CAN BE LISTED
         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>
diff --git a/html/RM/H5P/H5Pequal.htm b/html/RM/H5P/H5Pequal.htm
index 802e1d9..0fd5440 100644
--- a/html/RM/H5P/H5Pequal.htm
+++ b/html/RM/H5P/H5Pequal.htm
@@ -22,17 +22,27 @@
 <!-- HEADER RIGHT "H5Pequal" -->
 <hr>
 <dl>
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong>  <a name="Property-Equal">H5Pequal</a>
 
+    <br />
+    <br />
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Pequal</code>(
                   <em>hid_t</em> <code>id1</code>,
                   <em>hid_t</em> <code>id2</code>
 	)
 
+    <br />
+    <br />
   <dt><strong>Purpose:</strong>
     <dd>Compares two property lists or classes for equality.
 
+    <br />
+    <br />
   <dt><strong>Description:</strong>
     <dd><code>H5Pequal</code> compares two property lists or classes 
     to determine whether they are equal to one another.  
@@ -42,6 +52,7 @@
     property lists or both must be classes; comparing a list to a 
     class is an error.
 
+    <br />
   <dt><strong>Parameters:</strong>
     <ul><table>
     <tr>
@@ -52,10 +63,17 @@
         <td>IN: Second property object to be compared</td></tr>
     </table></ul>
 
+    <br />
   <dt><strong>Returns:</strong>
-    <dd>Success: TRUE (positive) if equal; FALSE (zero) if unequal
-    <dd>Failure: a negative value
-
+    <dd>
+        Returns a positive value if the property lists or classes 
+        are equal.
+        <br />
+        Returns 0 if the property lists or classes are not equal. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
+    <br />
   <dt><strong>Fortran90 Interface:</strong> h5pequal_f
     <dd>
 	<pre>
diff --git a/html/RM/H5P/H5Pexist.htm b/html/RM/H5P/H5Pexist.htm
index 551bcfb..f5b72eb 100644
--- a/html/RM/H5P/H5Pexist.htm
+++ b/html/RM/H5P/H5Pexist.htm
@@ -22,22 +22,34 @@
 <!-- HEADER RIGHT "H5Pexist" -->
 <hr>
 <dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Property-Exist">H5Pexist</a>
 
+    <br />
+    <br />
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Pexist</code>(
                   <em>hid_t</em> <code>id</code>,
                   <em>const char *</em><code>name</code>
 	)
 
+    <br />
+    <br />
   <dt><strong>Purpose:</strong>
     <dd>Queries whether a property name exists in a property list 
     or class.
 
+    <br />
+    <br />
   <dt><strong>Description:</strong>
     <dd><code>H5Pexist</code> determines  whether a property exists 
     within a property list or class.
 
+    <br />
+    <br />
   <dt><strong>Parameters:</strong>
     <ul><table>
     <tr>
@@ -48,11 +60,18 @@
         <td>IN: Name of property to check for</td></tr>
     </table></ul>
 
+    <br />
   <dt><strong>Returns:</strong>
-    <dd>Success: a positive value if the property exists in the 
-        property object; zero if the property does not exist
-    <dd>Failure: a negative value
+    <dd>
+        Returns a positive value if the property exists in the 
+        property object.
+        <br />
+        Returns 0 if the property does not exist in the property object. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 
+    <br />
   <dt><strong>Fortran90 Interface:</strong> h5pexist_f
     <dd>
 	<pre>
diff --git a/html/RM/H5P/H5Pget_append_flush.htm b/html/RM/H5P/H5Pget_append_flush.htm
index c174f36..f08ca07 100644
--- a/html/RM/H5P/H5Pget_append_flush.htm
+++ b/html/RM/H5P/H5Pget_append_flush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 18 February 2014
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -167,41 +167,49 @@ append_cb(hid_t dset_id, hsize_t *cur_dims, void *_udata)
     <dd>None</dd>
     <br />
 
-<dt><strong>See Also:</strong></dt>
 
+<dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5P/H5Pget_char_encoding.htm b/html/RM/H5P/H5Pget_char_encoding.htm
index 25d2fed..c39d399 100644
--- a/html/RM/H5P/H5Pget_char_encoding.htm
+++ b/html/RM/H5P/H5Pget_char_encoding.htm
@@ -84,7 +84,7 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative valule if successful;
+    <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
   <p>
diff --git a/html/RM/H5P/H5Pget_chunk_cache.htm b/html/RM/H5P/H5Pget_chunk_cache.htm
index aafdc44..6e62bc7 100644
--- a/html/RM/H5P/H5Pget_chunk_cache.htm
+++ b/html/RM/H5P/H5Pget_chunk_cache.htm
@@ -53,7 +53,7 @@
       be the corresponding values from a default file access property list.
       <p>
       Any (or all) pointer arguments may be null pointers, in which case the
-      corresponding datua is not returned.
+      corresponding data is not returned.
 
   <p>
   <dt><strong>Parameters:</strong>
diff --git a/html/RM/H5P/H5Pget_chunk_opts.htm b/html/RM/H5P/H5Pget_chunk_opts.htm
new file mode 100644
index 0000000..2a02bea
--- /dev/null
+++ b/html/RM/H5P/H5Pget_chunk_opts.htm
@@ -0,0 +1,152 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_chunk_opts" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified: 6 June 2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetChunkOpts">H5Pget_chunk_opts</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pget_chunk_opts(
+        <em>hid_t</em> dcpl_id,
+        <em>unsigned</em> *opts
+        )</code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Retrieves the edge chunk option setting from
+        a dataset creation property list. 
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pget_chunk_opts</code> 
+        retrieves the edge chunk option setting stored in the 
+        dataset creation property list <code>dcpl_id</code>. 
+        </p>
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                dcpl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Dataset creation property list 
+                identifier</td>
+        </tr><tr>
+            <td valign="top"><code><em>unsigned</em> opts</code></td>
+            <td><code> </code></td>
+            <td valign="top">OUT: Edge chunk option flag. 
+                </p>
+                <p>
+                Valid values are described in 
+                <a href="#Property-SetChunkOpts">
+                <code>H5Pset_chunk_opts</code></a>.
+                </p>
+                <p>
+                The option status can be retrieved using 
+                the bitwise <code>AND</code> 
+                operator ( <code>&</code> ). 
+                For example, the expression 
+                <code>(opts&H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS)</code> will
+                evaluate to <code>H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS</code>
+                if that option has been enabled.
+                Otherwise, it will evaluate to <code>0</code> (zero).
+                </td>
+            </tr>
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="#Property-SetChunkOpts">
+              <code>H5Pset_chunk_opts</code></a>
+<!--
+              </li>
+          <li><a href="#Property-GetChunkOpts">
+              <code>H5Pget_chunk_opts</code></a>
+-->
+              <br /> </li>
+          <li><a href="/HDF5/docNewFeatures/NewFeaturesPartialEdgeChunkDocs.html">
+              Partial Edge Chunk Overview</a>
+              </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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 with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pget_create_intermediate_group.htm b/html/RM/H5P/H5Pget_create_intermediate_group.htm
index 26df53e..44491ba 100644
--- a/html/RM/H5P/H5Pget_create_intermediate_group.htm
+++ b/html/RM/H5P/H5Pget_create_intermediate_group.htm
@@ -76,7 +76,7 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative valule if successful;
+    <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
   <p>
diff --git a/html/RM/H5P/H5Pget_driver_info.htm b/html/RM/H5P/H5Pget_driver_info.htm
index 6f692ed..f0cc7e4 100644
--- a/html/RM/H5P/H5Pget_driver_info.htm
+++ b/html/RM/H5P/H5Pget_driver_info.htm
@@ -24,7 +24,7 @@
 <dl>
   <dt><strong>Name:</strong> <a name="Property-GetDriverInfo">H5Pget_driver_info</a>
   <dt><strong>Signature:</strong>
-    <dd><em>void *</em><code>H5Pget_driver_info</code>(
+    <dd><em>const void *</em><code>H5Pget_driver_info</code>(
                      <em>hid_t</em> <code>plist_id</code>
     )
   <p>
@@ -83,6 +83,12 @@
           <td valign="top" align="left">
             <strong>C</strong></td></tr>
         <tr>
+          <td valign="top">1.10.1</td>
+          <td valign="top">
+           Return value was changed from <code>void *</code> to <code>const void *</code>.
+           </td>
+        </tr>
+        <tr>
           <td valign="top">1.8.2</td>
           <td valign="top">
             Function publicized in this release;
diff --git a/html/RM/H5P/H5Pget_evict_on_close.htm b/html/RM/H5P/H5Pget_evict_on_close.htm
new file mode 100644
index 0000000..c1fdd0f
--- /dev/null
+++ b/html/RM/H5P/H5Pget_evict_on_close.htm
@@ -0,0 +1,145 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_evict_on_close" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetEvictOnClose">H5Pget_evict_on_close</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code><em>herr_t</em> H5Pget_evict_on_close(
+      <em>hid_t</em> fapl_id, 
+      <em>hbool_t</em> *evict_on_close)
+    </code></dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Retrieves the file access property list setting that determines whether an HDF5 object will be 
+      evicted from the library's metadata cache when it is closed. 
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+    The library's metadata cache is fairly conservative about holding on to HDF5 object metadata 
+    (object headers, chunk index structures, etc.), which can cause the cache size to grow, 
+    resulting in memory pressure on an application or system. When enabled, the "evict on close" 
+    property will cause all metadata for an object to be immediately evicted from the cache as 
+    long as it is not referenced by any other open object.
+</p>
+<p>
+    This function only applies to file access property lists. 
+</p>
+<p>
+    See <code><a href="RM_H5P.html#Property-SetEvictOnClose">H5Pset_evict_on_close()</a></code> for additional notes on behavior.
+</p>
+
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fapl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list</td>
+        </tr>
+        <tr>
+            <td valign="top"><code><em>hbool_t *</em> 
+                evict_on_close</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Pointer to an hbool_t variable that will indicate if the object 
+              will be evicted on close.</td>
+        </tr>
+
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<!--
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pget_file_image.htm b/html/RM/H5P/H5Pget_file_image.htm
index 1994d9b..974573b 100644
--- a/html/RM/H5P/H5Pget_file_image.htm
+++ b/html/RM/H5P/H5Pget_file_image.htm
@@ -83,14 +83,6 @@
       or with the appropriate method if file image callbacks have been set.
       <p>
 
-      <p>
-      <b>Note/Warning:</b> 
-
-<font color="red">
-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>
@@ -143,13 +135,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>
-
-<font color="red">
-None known to date.
-</font>
 
 <!--
   <p>
diff --git a/html/RM/H5P/H5Pget_file_space.htm b/html/RM/H5P/H5Pget_file_space.htm
deleted file mode 100644
index 48e3053..0000000
--- a/html/RM/H5P/H5Pget_file_space.htm
+++ /dev/null
@@ -1,270 +0,0 @@
-
-
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * 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.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-
-
-<!--__ ***********************************************************  -->
-<!--__ Do not alter the next line; it is used by the PDF generator. -->
-<!--__ ***********************************************************  -->
-<!-- NEW PAGE -->
-<!-- HEADER RIGHT "H5Pget_file_space" -->
-<hr>
-<dl>
-
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 4 April 2016
-      </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>.
-      <p>
-      Any pointer parameters which are passed as <code>NULL</code> 
-      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 colspan="3"><em>H5F_file_space_type_t</em> *<code>strategy</code>
-            </td></tr>
-      <tr valign="top">
-        <td> </td><td> </td>
-        <td>IN/OUT: The file space management strategy currently in use 
-            for the file.
-            <p>
-            Valid values for <code>strategy</code> are described in the 
-            <code>strategy</code> parameter description in the
-<!-- FOR docNewFeatures ONLY                
-            <a href="H5Pset_file_space.htm">                -->
-            <a href="#Property-SetFileSpace">
-            <code>H5Pset_file_space</code></a> entry.
-            </td></tr>
-
-      <tr valign="top">
-        <td><em>hsize_t *</em><code>threshold</code>
-            </td><td> </td>
-        <td>IN/OUT: The current free-space section threshold.
-            </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 associated with <code>fcpl_id</code>.
-            <li>The library fails to retrieve the strategy and/or threshold 
-                in the file creation property list associated with 
-                <code>fcpl_id</code>.
-        </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>
-  <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>
-
-
-  <p>
-  <dt><strong>See Also:</strong>
-
-<!-- FOR FINAL RM INTEGRATION                     -->
-
-    <dd><a href="RM_H5P.html#Property-SetFileSpace">
-        <code>H5Pset_file_space</code></a>
-<!--
-        <br />
-        <a href="RM_H5P.html#Property-GetFileSpace">
-        <code>H5Pget_file_space</code></a>
--->
-        <p>
-
-        <a href="RM_H5F.html#File-GetFreeSections">
-        <code>H5Fget_free_sections</code></a>
-        <br />
-        <a href="RM_H5F.html#File-GetFreespace">
-        <code>H5Fget_freespace</code></a>
-        <br />
-        <a href="RM_H5F.html#File-GetInfo">
-        <code>H5Fget_info</code></a>
-        <p>
-
-        <a href="Tools.html#Tools-Repack"><code>h5repack</code></a>
-        <br />
-        <a href="Tools.html#Tools-Dump"><code>h5dump</code></a>
-        <br />
-        <a href="Tools.html#Tools-Stat"><code>h5stat</code></a>
-        <p>
-
-<!--    <a href="../?????/FileSpaceManagement.pdf"> --> <cite>HDF5 
-        Guide to File Space Management</cite></a>
-           <i>(Not yet available.)</i>
-
-<!--END FINAL RM INTEGRATION -->
-
-<!-- FOR docNewFeatures ONLY 
-
-    <dd><a href="H5Pset_file_space.htm">
-        <code>H5Pset_file_space</code></a>
-        <br />
-        <a href="H5Pget_file_space.htm">
-        <code>H5Pget_file_space</code></a>
-        <p>
-
-        <a href="H5Fget_free_sections.htm">
-        <code>H5Fget_free_sections</code></a>
-        <br />
-        <a href="H5Fget_freespace.htm">
-        <code>H5Fget_freespace</code></a>
-        <br />
-        <a href="H5Fget_info.htm">
-        <code>H5Fget_info</code></a>
-        <p>
-
-        <a href="h5repack.htm"><code>h5repack</code></a>
-        <br />
-        <a href="h5dump.htm"><code>h5dump</code></a>
-        <br />
-        <a href="h5stat.htm"><code>h5stat</code></a>
-        <p>
-
-        <a href="FileSpaceManagement.pdf"><cite>HDF5 
-        Guide to File Space Management</cite></a>
-
-     END docNewFeatures ONLY                                -->
-
-    </dd></dt>
-
-  <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>
-
-<!--__ ***********************************************************  -->
-<!--__ If adding a new C functions, include the following 5 lines,  -->
-<!--__ replacing '*.**.**' with the appropriate release number,     -->
-<!--__ but otherwise without modification.                          -->
-<!--__ ***********************************************************  -->
-<!--__ If adding a new Fortran subroutine, include the following    -->
-<!--__ 5 lines, replacing '*.**.**' with the appropriate release    -->
-<!--__ number, but otherwise without modification.                  -->
-<!--__ ***********************************************************  -->
-<!--
-        <tr>
-          <td valign="top">*.**.**</td>
-          <td valign="top">
-            Fortran90 subroutine introduced in this release.</td>
-        </tr>
--->
-
-<!--__ ***********************************************************  -->
-<!--__ Do not modify the next 3 lines; they close the "History:"    -->
-<!--__ table and the function entry.                                -->
-<!--__ ***********************************************************  -->
-        </tr>
-        </table>
-</dl>
-
-
diff --git a/html/RM/H5P/H5Pget_file_space_page_size.htm b/html/RM/H5P/H5Pget_file_space_page_size.htm
new file mode 100644
index 0000000..77724e0
--- /dev/null
+++ b/html/RM/H5P/H5Pget_file_space_page_size.htm
@@ -0,0 +1,131 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_file_space_page_size" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetFileSpacePageSize">H5Pget_file_space_page_size</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pget_file_space_page_size(<em>hid_t</em> fcpl, <em>hsize_t</em> *fsp_size) 
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Retrieves the file space page size for a file creation property list.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pget_file_space_page_size</code> retrieves the file space page size for paged aggregation in the
+    parameter <code>fsp_size</code>.
+    <p>
+    The library default is 4KB (4096) if <code>fsp_size</code> is not previously set via a call to 
+    <code>H5Pset_file_space_page_size</code>.
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fcpl</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File creation property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>hsize_t</em> 
+                *fsp_size</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: File space page size</td>
+        </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pget_file_space_strategy.htm b/html/RM/H5P/H5Pget_file_space_strategy.htm
new file mode 100644
index 0000000..d3ce068
--- /dev/null
+++ b/html/RM/H5P/H5Pget_file_space_strategy.htm
@@ -0,0 +1,164 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_file_space_strategy" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetFileSpaceStrategy">H5Pget_file_space_strategy</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+
+    <dd><code><em>herr_t</em> H5Pget_file_space_strategy(
+        <em>hid_t</em> fcpl, 
+        <em>H5F_fspace_strategy_t</em> *strategy, 
+        <em>hbool_t</em> *persist, 
+        <em>hsize_t</em> *threshold);
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Retrieves the file space handling strategy, persisting free-space condition and threshold value for a file creation property list.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd> <code>H5Pget_file_space_strategy</code> retrieves the file space handling strategy,  
+         the persisting free-space condition and the threshold value in the parameters <code>strategy</code>, 
+         <code>persist</code> and <code>threshold</code> respectively. 
+<p>
+ The library default values returned when <code>H5Pset_file_space_strategy</code> has not been called are:
+ <ul class="ul">
+  <li>  <code>strategy</code> ‐ <code>H5F_FSPACE_STRATEGY_FSM_AGGR</code></li>
+  <li>  <code>persist</code>  ‐ FALSE (<code>0</code>)</li>
+  <li>  <code>threshold</code> ‐ 1 </li>
+ </ul>
+</p>
+    </dd></dt>
+    
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fcpl</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: The file creation property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>H5F_fspace_strategy_t</em> *strategy</code></td>
+            <td><code> </code></td>
+            <td valign="top">OUT:  The file space handling strategy.
+
+        <tr>
+            <td valign="top"><code><em>hbool_t</em> 
+                *persist</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: The boolean value indicating whether free space is persistent or not.</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>hsize_t</em> 
+                *threshold</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: The free-space section size threshold value.</td>
+        </tr>
+
+                </p>
+                <p>
+                </td>
+            </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value. 
+  
+
+   </dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+-->
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pget_mdc_config.htm b/html/RM/H5P/H5Pget_mdc_config.htm
index 0b11238..d2f7272 100644
--- a/html/RM/H5P/H5Pget_mdc_config.htm
+++ b/html/RM/H5P/H5Pget_mdc_config.htm
@@ -273,6 +273,14 @@
 			  metadata created since the last synchronization exceeds 
 			  this limit.</td>
 		</tr>
+                <tr>
+                    <td valign="top"><em>int</em> <code>metadata_write_strategy</code>
+                        </td>
+                        <td valign="top">OUT: The specified metadata write strategy.
+                        </td>
+                </tr>
+                
+        
     </table></ul>
   <dt><strong>Returns:</strong>
       <dd>Returns a non-negative value if successful; otherwise returns a negative value.
diff --git a/html/RM/H5P/H5Pget_mdc_image_config.htm b/html/RM/H5P/H5Pget_mdc_image_config.htm
new file mode 100644
index 0000000..c88d4b0
--- /dev/null
+++ b/html/RM/H5P/H5Pget_mdc_image_config.htm
@@ -0,0 +1,182 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_mdc_image_config" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2017
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetMDCImageConfig">H5Pget_mdc_image_config</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pget_mdc_image_config(
+        <em>hid_t</em> plist_id,
+        <em>H5AC_cache_image_config_t * config_ptr);</em>
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Retrieves the metadata cache image configuration values for a file access property list.  
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pget_mdc_image_config</code> 
+        retrieves the metadata cache image values into <code>config_ptr</code> 
+        for the file access property list specified in  <code>plist_id</code>.
+<p>
+       <code>H5AC_cache_image_config_t</code> is defined as follows:
+       <pre>
+        typedef struct H5AC_cache_image_config_t {
+          int32_t         version;
+          hbool_t         generate_image;
+          hbool_t         save_resize_status;
+          int32_t         entry_ageout;
+        } H5AC_cache_image_config_t;
+        </pre>
+
+<p>
+Where the fields of the instance of <code>H5AC_cache_image_config_t</code>
+passed into the function will be set as follows:
+
+<dd><table width="100%">
+        <tr>
+            <td valign="top"><code>version</code>:</td>
+            <td width="5%"><code> </code></td>
+            <td valign="top"> 
+            Must be set to <code>H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION</code> prior to the call to <code>H5Pget_mdc_image_config()</code>.
+            </td>
+        </tr>
+
+        <tr>
+           <td valign="top"><code>generate_image</code>:</td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">
+            Will be set to either <code>TRUE</code> or <code>FALSE</code>, depending on whether a cache image will be requested.
+            </td>
+        </tr>
+
+        <tr>
+           <td valign="top"><code>save_resize_status</code>:</td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">
+            Will be set to either <code>TRUE</code> or <code>FALSE</code>, depending on whether inclusion of the metadata cache 
+            resize configuration is to be included in the cache image.  Note that this field is not supported at present.
+            </td>
+        </tr>
+
+        <tr>
+           <td valign="top"><code>entry_ageout</code>:</td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">Will be set to an integer in the range of <code>-1</code> to <code>100</code>.  Non negative values 
+            indicate the number of close/open cycles a metadata cache can remain in the cache image without being accessed.  <code>-1</code>
+            indicates no limit on the number of such cycles.  Note: this field is not supported at present -- thus in effect it is always 
+            set to <code>-1</code>.
+         </td>
+         </tr>
+         </table>
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                plist_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>H5AC_cache_image_config_t *</em> config_ptr</code></td>
+            <td><code> </code></td>
+            <td valign="top">OUT: Pointer to metadata cache image configuration values 
+                </p>
+                <p>
+                </td>
+            </tr>
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="RM_H5P.html#Property-SetMDCImageConfig">
+              <code>H5Pset_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pget_mdc_log_options.htm b/html/RM/H5P/H5Pget_mdc_log_options.htm
index 5510c37..733e807 100644
--- a/html/RM/H5P/H5Pget_mdc_log_options.htm
+++ b/html/RM/H5P/H5Pget_mdc_log_options.htm
@@ -77,7 +77,7 @@
     state of the logging flags.</p>
     
     <p>The log format is described in the 
-    <a href="Design-MetadataCache-Logging-THG20140224-v4.pdf">
+    <a href="/HDF5/docNewFeatures/FineTuneMDC/Design-MetadataCache-Logging-THG20140224-v4.pdf">
     <em>Metadata Cache Logging</em></a> document.</p></dd>
     <br />
 
@@ -126,10 +126,13 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Pset_mdc_log_options.htm">H5Pset_mdc_log_options</a></li>
-      <li><a href="H5Fstart_mdc_logging.htm">H5Fstart_mdc_logging</a></li>
-      <li><a href="H5Fstop_mdc_logging.htm">H5Fstop_mdc_logging</a></li>
-      <li><a href="H5Pget_mdc_logging_status.htm">H5Pget_mdc_logging_status</a></li>
+      <li><a href="RM_H5P.html#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a></li>
+<!--
+      <li><a href="RM_H5P.html#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a></li>
+-->
+      <li><a href="RM_H5F.html#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+      <li><a href="RM_H5F.html#File-StartMdcLogging">H5Fstart_mdc_logging</a></li>
+      <li><a href="RM_H5F.html#File-StopMdcLogging">H5Fstop_mdc_logging</a></li>
     </ul>
     <br />
 
diff --git a/html/RM/H5P/H5Pget_mdc_logging_status.htm b/html/RM/H5P/H5Pget_mdc_logging_status.htm
deleted file mode 100644
index 5248a9a..0000000
--- a/html/RM/H5P/H5Pget_mdc_logging_status.htm
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * 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://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.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-
-
-<!--__ ***********************************************************  -->
-<!--__ Do not alter the next line; it is used by the PDF generator. -->
-<!--__ ***********************************************************  -->
-<!-- NEW PAGE -->
-<!-- HEADER RIGHT "H5Pget_mdc_logging_status" -->
-
-<hr />
-<dl>
-
-<dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 18 March 2014
-    </i></font></div></dt>
-    <br />
-
-<dt><strong>Name:</strong> 
-    <a name="Property-H5Pget_mdc_logging_status">H5Pget_mdc_logging_status</a>
-    </dt>
-    <br />
-
-<dt><strong>Signature:</strong></dt>
-    <dd><code><em>herr_t</em> H5Fget_mdc_logging_status(
-              <em>hid_t</em> file_id, 
-              <em>hbool_t</em> *is_enabled, 
-              <em>hbool_t</em> *is_currently_logging
-        )</code></dd>
-    <br />
-
-<dt><strong>Purpose:</strong></dt>
-    <dd>Gets the current metadata cache logging status.</dd>
-    <br />
-
-<dt><strong>Description:</strong></dt>
-    <dd>The metadata cache is a central part of the HDF5 library 
-    through which all <em>file metadata</em> reads and writes take 
-    place. File metadata is normally invisible to the user and is used 
-    by the library for purposes such as locating and indexing data. 
-    File metadata should not be confused with <em>user metadata</em>, 
-    which consists of attributes created by users and attached to 
-    HDF5 objects such as datasets via H5A API calls. 
-    
-    <p>Due to the complexity of the cache, a trace/logging feature has 
-    been created that can be used by HDF5 developers for debugging and 
-    performance analysis. The functions that control this functionality 
-    will normally be of use to a very limited number of developers 
-    outside of The HDF Group. The functions have been documented to help 
-    users create logs that can be sent with bug reports.</p>
-    
-    <p>Control of the log functionality is straightforward. Logging is 
-    enabled via the <code>H5Pset_mdc_log_options()</code> function, 
-    which will modify the file access property list used to open or create 
-    a file. This function has a flag that determines whether logging 
-    begins at file open or starts in a paused state. Log messages can 
-    then be controlled via the <code>H5Fstart/stop_logging()</code> 
-    functions. <code>H5Pget_mdc_log_options()</code> can be used to 
-    examine a file access property list, and 
-    <code>H5Fget_mdc_logging_status()</code> will return the current 
-    state of the logging flags.</p>
-    
-    <p>The log format is described in the 
-    <a href="Design-MetadataCache-Logging-THG20140224-v4.pdf">
-    <em>Metadata Cache Logging</em></a> document.</p></dd>
-    <br />
-    
-<dt><strong>Notes:</strong></dt>
-    <dd>Unlike <code>H5Fstart/stop_mdc_logging()</code>, this function 
-    can be called on any open file identifier.</dd>
-    <br />
-
-
-
-<dt><strong>Parameters:</strong></dt>
-    <dd>
-    <table width="100%">
-      <tr valign="top">
-        <td width="20%"><code><em>hid_t</em> file_id</code> </td>
-        <td width="80%">IN: Identifier of an open HDF5 file.</td></tr>
-      <tr valign="top">
-        <td><code><em>hbool_t</em> *is_enabled</code> </td>
-        <td>OUT: Whether logging is enabled.</td></tr>
-      <tr valign="top">
-        <td><code><em>hbool_t</em> *is_currently_logging  </code> </td>
-        <td>OUT: Whether events are currently 
-            being logged.</td></tr>
-    </table>
-    </dd>
-    <br />
-
-<dt><strong>Returns:</strong></dt>
-    <dd>Returns a non-negative value if successful. 
-    Otherwise returns a negative value.</dd>
-    <br />
-
-<dt><strong>Fortran Interface:</strong></dt>
-    <dd>None</dd>
-    <br />
-
-<dt><strong>See Also:</strong></dt>
-    <ul>
-      <li><a href="H5Pset_mdc_log_options.htm">H5Pset_mdc_log_options</a></li>
-      <li><a href="H5Pget_mdc_log_options.htm">H5Pget_mdc_log_options</a></li>
-      <li><a href="H5Fstart_mdc_logging.htm">H5Fstart_mdc_logging</a></li>
-      <li><a href="H5Fstop_mdc_logging.htm">H5Fstop_mdc_logging</a></li>
-    </ul>
-    <br />
-
-<dt><strong>History:</strong></dt>
-    <dd><table width="90%">
-        <tr>
-          <td valign="top" align="left" width="10%">
-          <strong>Release</strong></td>
-          <td valign="top" align="left" width="90%">
-          <strong>Change</strong></td></tr>
-        <tr>
-          <td valign="top">1.10.0</td>
-          <td valign="top">
-          C function introduced with this release. </td></tr>
-        </table></dd>
-
-</dl>
-<br />
-<br />
-<br />
-
-
-
diff --git a/html/RM/H5P/H5Pget_metadata_read_attempts.htm b/html/RM/H5P/H5Pget_metadata_read_attempts.htm
index 4cc2279..abc9989 100644
--- a/html/RM/H5P/H5Pget_metadata_read_attempts.htm
+++ b/html/RM/H5P/H5Pget_metadata_read_attempts.htm
@@ -259,9 +259,9 @@
 
   <dt><strong>See Also:</strong></dt>
     <dd>
-    <li><a href="#Property-SetMetadataReadAttempts">
+    <li><a href="RM_H5P.html#Property-SetMetadataReadAttempts">
         <code>H5Pset_metadata_read_attempts</code></a></li>
-    <li><a href="#File-GetMetadataReadRetriesInfo">
+    <li><a href="RM_H5F.html#File-GetMetadataReadRetriesInfo">
         <code>H5Fget_metadata_read_retries_info</code></a></li>
     </dd>
     <br />
diff --git a/html/RM/H5P/H5Pget_object_flush_cb.htm b/html/RM/H5P/H5Pget_object_flush_cb.htm
index dafd89f..9ebb51e 100644
--- a/html/RM/H5P/H5Pget_object_flush_cb.htm
+++ b/html/RM/H5P/H5Pget_object_flush_cb.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 18 February 2014
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -132,36 +132,44 @@ flush_cb(hid_t obj_id, void *_udata)
     <dd>None</dd>
     <br />
 
+
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-            <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
diff --git a/html/RM/H5P/H5Pget_page_buffer_size.htm b/html/RM/H5P/H5Pget_page_buffer_size.htm
new file mode 100644
index 0000000..b8ea7da
--- /dev/null
+++ b/html/RM/H5P/H5Pget_page_buffer_size.htm
@@ -0,0 +1,153 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_page_buffer_size" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-GetPageBufferSize">H5Pget_page_buffer_size</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code>
+   <em>herr_t</em> H5Pget_page_buffer_size( 
+     <em>hid_t</em> fapl_id, 
+     <em>size_t</em> *buf_size, 
+     <em>unsigned</em> *min_meta_perc, 
+     <em>unsigned</em> *min_raw_perc )
+
+     </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Retrieves the maximum size for the page buffer and the minimum percentage for metadata and raw data pages.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+     <code>H5Pget_page_buffer_size</code> retrieves <code>buf_size</code>, the maximum size in bytes of the page 
+     buffer, <code>min_meta_perc</code>, the minimum metadata percentage, and  <code>min_raw_perc</code>, the minimum raw data percentage.
+</p>
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fapl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>size_t</em> 
+                *buf_size</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Maximum size, in bytes, of the page buffer </td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>unsigned</em> 
+                *min_meta_perc</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Minimum metadata percentage to keep in the page buffer before allowing pages containing metadata to be evicted</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>unsigned</em> 
+                *min_raw_perc</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">OUT: Minimum raw data percentage to keep in the page buffer before allowing pages containing raw data to be evicted</td>
+        </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pisa_class.htm b/html/RM/H5P/H5Pisa_class.htm
index 3827573..36e92f4 100644
--- a/html/RM/H5P/H5Pisa_class.htm
+++ b/html/RM/H5P/H5Pisa_class.htm
@@ -22,10 +22,10 @@
 <!-- HEADER RIGHT "H5Pisa_class" -->
 <hr>
 <dl>
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 20 April 2009
-      </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Property-IsAClass">H5Pisa_class</a>
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Pisa_class</code>(
@@ -56,9 +56,15 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a positive value if true or zero if false;
-        returns a negative value on failure.
-
+    <dd>
+        Returns a positive value if the specified property list is a 
+        member of the specified class.
+        <br />
+        Returns 0 if the specified property list is not a 
+        member of the specified class. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
   <p>
   <dt><strong>See Also:</strong>
     <dd><a href="RM_H5P.html#Property-Create"><code>H5Pcreate</code></a>
diff --git a/html/RM/H5P/H5Pset_alignment.htm b/html/RM/H5P/H5Pset_alignment.htm
index 19ead0e..1a923d5 100644
--- a/html/RM/H5P/H5Pset_alignment.htm
+++ b/html/RM/H5P/H5Pset_alignment.htm
@@ -47,6 +47,11 @@
         the best performance for single-process access to the file.
         For MPI IO and other parallel systems, choose an alignment
         which is a multiple of the disk block size.   
+        <p />
+        If the file space handling strategy is set to <code>H5F_FSPACE_STRATEGY_PAGE</code>, then
+        the alignment set via this routine is ignored. The file space handling strategy is set by
+        <code>H5Pset_file_space_strategy</code>.
+
   <dt><strong>Parameters:</strong>
     <ul><table>
         <tr>
diff --git a/html/RM/H5P/H5Pset_append_flush.htm b/html/RM/H5P/H5Pset_append_flush.htm
index 5f07158..b64a932 100644
--- a/html/RM/H5P/H5Pset_append_flush.htm
+++ b/html/RM/H5P/H5Pset_append_flush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 7 January 2016
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -154,7 +154,8 @@
 <dt><strong>Example Usage:</strong></dt> 
     <dd>The example below illustrates the usage of this public routine to 
         manage flush behavior while appending to a dataset. Note also the 
-        use of <a href="H5DOappend.htm"><code>H5DOappend</code></a>.
+        use of <a href="../HL/RM_HDF5Optimized.html#H5DOappend">
+        <code>H5DOappend</code></a>.
         <dir><pre>
 hsize_t dims[2] = {0, 100};
 hsize_t max_dims[2] = {H5S_UNLIMITED, 100};
@@ -217,40 +218,49 @@ append_cb(hid_t dset_id, hsize_t *cur_dims, void *_udata)
     <dd>None</dd>
     <br />
 
+
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pset_object_flush_cb.htm">H5Pset_object_flush_cb</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5P/H5Pset_char_encoding.htm b/html/RM/H5P/H5Pset_char_encoding.htm
index 541bcb5..5bae221 100644
--- a/html/RM/H5P/H5Pset_char_encoding.htm
+++ b/html/RM/H5P/H5Pset_char_encoding.htm
@@ -100,7 +100,7 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative valule if successful;
+    <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
   <p>
diff --git a/html/RM/H5P/H5Pset_chunk_opts.htm b/html/RM/H5P/H5Pset_chunk_opts.htm
new file mode 100644
index 0000000..4d2e432
--- /dev/null
+++ b/html/RM/H5P/H5Pset_chunk_opts.htm
@@ -0,0 +1,234 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_chunk_opts" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified: 6 June 2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetChunkOpts">H5Pset_chunk_opts</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pset_chunk_opts(
+        <em>hid_t</em> dcpl_id,
+        <em>unsigned</em> opts
+        )</code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Sets the edge chunk option in a dataset creation property list. 
+    </dd></dt>
+    <br />
+
+<dt><strong>Motivation:</strong>
+    <dd><code>H5Pset_chunk_opts</code> is used to specify 
+        storage options for chunks on the edge of a 
+        dataset’s dataspace. 
+        This capability allows the user to tune performance in cases where 
+        the dataset size may not be a multiple of the chunk size and
+        the handling of partial edge chunks can impact performance. 
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pset_chunk_opts</code> 
+        sets the edge chunk option in the dataset creation property list 
+        <code>dcpl_id</code>. 
+        </p>
+        <p>
+        The available option is detailed in the parameters section below. 
+        Only chunks that are not completely filled by the dataset’s 
+        dataspace are affected by this option. 
+        Such chunks are referred to as <i>partial edge chunks</i>.
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                dcpl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Dataset creation property list 
+                identifier</td>
+        </tr><tr>
+            <td valign="top"><code><em>unsigned</em> opts</code></td>
+            <td><code> </code></td>
+            <td valign="top">IN: Edge chunk option flag. Valid values are:
+                <p>
+                <dir>
+                <table width="100%>
+
+<!--          TEXT FOR EDGE CHUNK OPTION OMITTED FROM FINAL IMPLEMENTATION
+                    NEW ROW
+                      NEW CELL colspan=2
+                          <code>H5D_STORE_PARTIAL_CHUNKS</code>
+                          END CELL
+                    END ROW
+                    NEW ROW
+                      NEW CELL 5%
+                          <code>    </code>
+                          END CELL
+                      NEW CELL
+                          When enabled (set to <code>1</code>, one),
+                          only the portions of partial edge chunks 
+                          within the dataset’s dataspace will be stored. 
+                          This will improve storage efficiency, 
+                          but requires reallocation of file space 
+                          when extending the dataset. 
+                          </p>
+                          <p>
+                          Datasets created with this option enabled will be 
+                          inaccessible with HDF5 Library versions before 
+                          Release 1.10.
+                          </p>
+                          <p>
+                          When disabled (set to <code>0</code>, zero), 
+                          all portions of the partial edge chunks, 
+                          including those that fall outside the 
+                          dataset’s dataspace, will be stored.
+                          </p>
+                          <p>
+                          <i>Default:</i> <code>0</code> (zero) for disabled
+                          <br /> 
+                          END CELL
+                    END ROW
+END OMITTED OPTION  -->
+                    <tr align="left">
+                      <td colspan="2">
+                          <code>H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS</code>
+                          </td>
+                    </tr>
+                    <tr align="left">
+                      <td width="5%">
+                          <code>    </code></td>
+                      <td>When enabled, filters are not applied to 
+                          partial edge chunks. 
+                          </p>
+                          <p>
+                          When disabled, partial edge chunks are filtered. 
+                          </p>
+                          <p>
+                          Enabling this option will improve performance 
+                          when appending to the dataset and, 
+                          when compression filters are used, 
+                          prevent reallocation of these chunks. 
+                          </p>
+                          <p>
+                          Datasets created with this option enabled will be 
+                          inaccessible with HDF5 Library versions before 
+                          Release 1.10.
+                          </p>
+                          <p>
+                          <i>Default:</i> Disabled
+                          <br /> 
+                          </td>
+                    </tr> 
+                    <tr> 
+                      <td colspan="2">
+                          <code>0 </code>(zero)</td>
+                          </td>
+                    </tr>
+                    <tr align="left">
+                      <td width="5%">
+                          <code>    </code></td>
+                      <td>Disables option; 
+                          partial edge chunks will be compressed.
+                          </td>
+                    </tr> 
+                </table>
+                </dir>
+                </td>
+            </tr>
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+<!--
+          <li><a href="#Property-SetChunkOpts">
+              <code>H5Pset_chunk_opts</code></a>
+              </li>
+-->
+          <li><a href="#Property-GetChunkOpts">
+              <code>H5Pget_chunk_opts</code></a>
+              <br /> </li>
+          <li><a href="/HDF5/docNewFeatures/NewFeaturesPartialEdgeChunkDocs.html">
+              Partial Edge Chunk Overview</a>
+              </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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 with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pset_create_intermediate_group.htm b/html/RM/H5P/H5Pset_create_intermediate_group.htm
index c5c183a..a5321c4 100644
--- a/html/RM/H5P/H5Pset_create_intermediate_group.htm
+++ b/html/RM/H5P/H5Pset_create_intermediate_group.htm
@@ -84,7 +84,7 @@
 
   <p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative valule if successful;
+    <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
   <p>
diff --git a/html/RM/H5P/H5Pset_evict_on_close.htm b/html/RM/H5P/H5Pset_evict_on_close.htm
new file mode 100644
index 0000000..92a47aa
--- /dev/null
+++ b/html/RM/H5P/H5Pset_evict_on_close.htm
@@ -0,0 +1,149 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_evict_on_close" -->
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetEvictOnClose">H5Pset_evict_on_close</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code>
+     <em>herr_t</em> H5Pset_evict_on_close(
+       <em>hid_t</em> fapl_id, 
+       <em>hbool_t</em> evict_on_close)
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> 
+     Controls the library's behavior of evicting metadata associated with a closed object
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+    The library's metadata cache is fairly conservative about holding on to HDF5 object metadata (object headers, 
+    chunk index structures, etc.), which can cause the cache size to grow, resulting in memory 
+    pressure on an application or system. When enabled, the "evict on close" property will 
+    cause all metadata for an object to be evicted from the cache as long as metadata is 
+    not referenced by any other open object.
+</p>
+<p>
+    This function only applies to file access property lists. 
+</p>
+<p>
+    The default library behavior is to not evict on object or file close.
+</p>
+<p>
+    When applied to a file access property list, any subsequently opened object will inherit the 
+    "evict on close" property and will have its metadata evicted when the object is closed.
+</p>
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fapl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>hbool_t</em> 
+                evict_on_close</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Whether the HDF5 object should be evicted on close.</td>
+        </tr>
+
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<!--
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="RM_H5P.html#Property-GetEvictOnClose">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pset_file_image.htm b/html/RM/H5P/H5Pset_file_image.htm
index 918ff59..eea4a73 100644
--- a/html/RM/H5P/H5Pset_file_image.htm
+++ b/html/RM/H5P/H5Pset_file_image.htm
@@ -63,17 +63,9 @@
       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>
@@ -107,13 +99,13 @@ Notes?  Warnings?
 <!--__ Replace the text following the <dd> with a description       -->
 <!--__ of how the function may fail.                                -->
 <!--__ ***********************************************************  -->
+<!--
   <p>
   <dt><strong>Failure Modes:</strong>
     <dd>
 
-<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 3a19722..b7a9d90 100644
--- a/html/RM/H5P/H5Pset_file_image_callbacks.htm
+++ b/html/RM/H5P/H5Pset_file_image_callbacks.htm
@@ -38,10 +38,6 @@
   <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
@@ -506,18 +502,12 @@
 
 <!--__ *** NOTES AND WARNINGS ************************************  -->
 
+<!--
   <p>
   <dt><strong>Notes/Warnings:</strong>
     <dd>
 
-<font color="red">
-Surely we can provide a few dire warnings for <i>this</i> one . . .
-      Risk of data corruption,
-      loss of a file image,
-      silent failure, 
-      unintended consequences that might go unnoticed.  
-      That sort of thing.
-</font>
+-->
 
 
   <p>
@@ -551,11 +541,6 @@ 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
deleted file mode 100644
index ec525e4..0000000
--- a/html/RM/H5P/H5Pset_file_space.htm
+++ /dev/null
@@ -1,364 +0,0 @@
-
-
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * 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.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-
-
-<!--__ ***********************************************************  -->
-<!--__ Do not alter the next line; it is used by the PDF generator. -->
-<!--__ ***********************************************************  -->
-<!-- NEW PAGE -->
-<!-- HEADER RIGHT "H5Pset_file_space" -->
-<hr>
-<dl>
-
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 4 April 2016
-      </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 border="0">
-      <tr valign="top">
-        <td colspan="3"><em>hid_t </em><code>fcpl_id</code>
-            </td>
-        </tr><tr>
-        <td colspan="2"><code>      </code></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 colspan="2">    </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><code>      </code></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 colspan="2"><code>H5F_FILE_SPACE_ALL    </code> 
-                      <i>(Default file space management strategy)</i>
-                      </td>
-                </tr><tr>
-                <td><code> </code></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 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><code> </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 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 colspan="2"><code>H5F_FILE_SPACE_VFD</code></td>
-                </tr><tr>
-                <td><code> </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>
-              <tr valign="top">
-                <td colspan="2">
-                    Passing a value of zero (<code>0</code>) indicates that 
-                    the value of <code>strategy</code> is not to be modified.
-                </td>
-              </tr>
-
-            </table>
-
-            </td></tr>
-
-      <tr valign="top">
-        <td colspan="3"><em>hsize_t </em><code>threshold</code>
-            </td>
-        </tr><tr>
-        <td colspan="2"> </td>
-        <td>IN: The free-space section threshold.
-	    The library default is 1, which is to track all free-space sections.
-            <p>
-            Passing a value of zero (<code>0</code>) indicates that 
-            the value of <code>threshold</code> is not to be modified.
-            </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 associated with <code>fcpl_id</code>.
-            <li>The library fails to set the strategy and/or threshold 
-                in the file creation property list associated with 
-                <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 greater than or equal to 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>
-
-
-  <p>
-  <dt><strong>See Also:</strong>
-
-<!-- FOR FINAL RM INTEGRATION                            -->
-
-    <dd>
-<!--
-        <a href="RM_H5P.html#Property-SetFileSpace">
-        <code>H5Pset_file_space</code></a>
-        <br />
--->
-        <a href="RM_H5P.html#Property-GetFileSpace">
-        <code>H5Pget_file_space</code></a>
-        <p>
-
-        <a href="RM_H5F.html#File-GetFreeSections">
-        <code>H5Fget_free_sections</code></a>
-        <br />
-        <a href="RM_H5F.html#File-GetFreespace">
-        <code>H5Fget_freespace</code></a>
-        <br />
-        <a href="RM_H5F.html#File-GetInfo">
-        <code>H5Fget_info</code></a>
-        <p>
-
-        <a href="Tools.html#Tools-Repack"><code>h5repack</code></a>
-        <br />
-        <a href="Tools.html#Tools-Dump"><code>h5dump</code></a>
-        <br />
-        <a href="Tools.html#Tools-Stat"><code>h5stat</code></a>
-        <p>
-
-<!--    <a href="../?????/FileSpaceManagement.pdf"> --> <cite>HDF5 
-        Guide to File Space Management</cite></a>
-           <i>(Not yet available.)</i>
-
-<!-- END FINAL RM INTEGRATION                               -->
-
-<!-- FOR docNewFeatures ONLY 
-
-    <dd>
-        <a href="H5Pset_file_space.htm">
-        <code>H5Pset_file_space</code></a>
-        <br />
-        <a href="H5Pget_file_space.htm">
-        <code>H5Pget_file_space</code></a>
-        <p>
-
-        <a href="H5Fget_free_sections.htm">
-        <code>H5Fget_free_sections</code></a>
-        <br />
-        <a href="H5Fget_freespace.htm">
-        <code>H5Fget_freespace</code></a>
-        <br />
-        <a href="H5Fget_info.htm">
-        <code>H5Fget_info</code></a>
-        <p>
-
-        <a href="h5repack.htm"><code>h5repack</code></a>
-        <br />
-        <a href="h5dump.htm"><code>h5dump</code></a>
-        <br />
-        <a href="h5stat.htm"><code>h5stat</code></a>
-        <p>
-
-        <a href="FileSpaceManagement.pdf"><cite>HDF5 
-        Guide to File Space Management</cite></a>
-
-     END docNewFeatures ONLY                                -->
-
-    </dd></dt>
-
-  <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>
-
-<!--__ ***********************************************************  -->
-<!--__ If adding a new C functions, include the following 5 lines,  -->
-<!--__ replacing '*.**.**' with the appropriate release number,     -->
-<!--__ but otherwise without modification.                          -->
-<!--__ ***********************************************************  -->
-<!--__ If adding a new Fortran subroutine, include the following    -->
-<!--__ 5 lines, replacing '*.**.**' with the appropriate release    -->
-<!--__ number, but otherwise without modification.                  -->
-<!--__ ***********************************************************  -->
-<!--
-        <tr>
-          <td valign="top">*.**.**</td>
-          <td valign="top">
-            Fortran90 subroutine introduced in this release.</td>
-        </tr>
--->
-
-<!--__ ***********************************************************  -->
-<!--__ Do not modify the next 3 lines; they close the "History:"    -->
-<!--__ table and the function entry.                                -->
-<!--__ ***********************************************************  -->
-        </tr>
-        </table>
-</dl>
-
-
diff --git a/html/RM/H5P/H5Pset_file_space_page_size.htm b/html/RM/H5P/H5Pset_file_space_page_size.htm
new file mode 100644
index 0000000..b8f7743
--- /dev/null
+++ b/html/RM/H5P/H5Pset_file_space_page_size.htm
@@ -0,0 +1,137 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_file_space_page_size" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetFileSpacePageSize">H5Pset_file_space_page_size</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pset_file_space_page_size(<em>hid_t</em> fcpl, <em>hsize_t</em> fsp_size) 
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Sets the file space page size for a file creation property list.    
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pset_file_space_page_size</code> sets the file space page size <code>fsp_size</code> 
+     used in paged aggregation and paged buffering.
+    <p>
+    <code>fsp_size</code> has a minimum size of 512. Setting a value less than 512 will return an
+    error.  The library default size for the file space page size when not set is 4096.
+    </p>
+    <p>
+     The size set via this routine may not be changed for the life of the file.
+    </p>
+
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fcpl</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File creation property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>hsize_t</em> 
+                fsp_size</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File space page size</td>
+        </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pset_file_space_strategy.htm b/html/RM/H5P/H5Pset_file_space_strategy.htm
new file mode 100644
index 0000000..6957443
--- /dev/null
+++ b/html/RM/H5P/H5Pset_file_space_strategy.htm
@@ -0,0 +1,170 @@
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_file_space_strategy" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetFileSpaceStrategy">H5Pset_file_space_strategy</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+
+    <dd><code><em>herr_t</em> H5Pset_file_space_strategy(
+        <em>hid_t</em> fcpl, 
+        <em>H5F_fspace_strategy_t</em> strategy, 
+        <em>hbool_t</em> persist, 
+        <em>hsize_t</em> threshold);
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Sets the file space handling strategy and persisting free-space values for a file creation property list. 
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pset_file_space_strategy</code> 
+	sets the file space handling <code>strategy</code>, specifies persisting free-space or not
+        (<code>persist</code>), and sets the free-space section size <code>threshold</code> in the file creation property list
+         <code>fcpl</code>.
+<p />
+     This setting cannot be changed for the life of the file.
+<p />
+    As the <code>H5F_FSPACE_STRATEGY_AGGR</code> and <code>H5F_FSPACE_STRATEGY_NONE</code> strategies do not use the free-space 
+   managers, the <code>persist</code> and <code>threshold</code> settings will be ignored for those strategies.
+    </dd></dt>
+    
+<dt><strong>Limitations:</strong>
+    <dd>
+        The <code>H5F_FSPACE_STRATEGY_PAGE</code> (Page Buffering) strategy is turned off
+        in parallel. You will receive an error if attempting to enable it in a parallel build. 
+       <br />
+        The <code>H5F_FSPACE_STRATEGY_AGGR</code>  (Paged Aggregation) strategy is not available with either the
+        split or multi-file drivers. 
+ 
+    </dd></dt>
+    <br />
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fcpl</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: The file creation property list identifier used to create a new file</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>H5F_fspace_strategy_t</em> strategy</code></td>
+            <td><code> </code></td>
+            <td valign="top">IN:  The file space handling strategy to be used. <code>H5F_fspace_strategy_t</code> is defined as:
+<ul class="ul">
+<pre>
+    typedef enum H5F_fspace_strategy_t {
+          H5F_FSPACE_STRATEGY_FSM_AGGR = 0, /* FSM, Aggregators, VFD */ 
+          H5F_FSPACE_STRATEGY_PAGE = 1	   /* Paged FSM, VFD */
+          H5F_FSPACE_STRATEGY_AGGR = 2	   /* Aggregators, VFD */
+          H5F_FSPACE_STRATEGY_NONE = 3,     /* VFD */
+          H5F_FSPACE_STRATEGY_NTYPES     
+    } H5F_fspace_strategy_t;
+</pre>
+</ul>
+ 
+        <tr>
+            <td valign="top"><code><em>hbool_t</em> 
+                persist</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: A boolean value to indicate whether free space should be persistent or not.</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>hsize_t</em> 
+                threshold</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: The smallest free-space section size that the free space manager will track.</td>
+        </tr>
+
+                </p>
+                <p>
+                </td>
+            </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+-->
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pset_mdc_config.htm b/html/RM/H5P/H5Pset_mdc_config.htm
index eaf49ac..4130ee7 100644
--- a/html/RM/H5P/H5Pset_mdc_config.htm
+++ b/html/RM/H5P/H5Pset_mdc_config.htm
@@ -431,8 +431,21 @@
 			  <p>It must be consistant across all caches on any given file.
 			  <p>By default, this field is set to 256 KB.  It shouldn't be more
 			  than half the current max cache size times the min clean 
-			  fraction.</td>
+			  fraction. </p></td>
 		</tr>
+               <tr>
+                    <td valign="top"><em>int</em> <code>metadata_write_strategy</code></td>
+                       <td valign="top">IN: Desired metadata write strategy. The valid values
+                         for this field are:
+                         <p><code>H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY</code>: Specifies 
+                            that only process zero is allowed to write dirty metadata to disk.
+                         <p><code>H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED</code>: Specifies
+                         that process zero still makes the decisions as to what entries should
+                         be flushed, but the actual flushes are distributed across the
+                         processes in the computation to the extent possible. 
+                         <p>The <code>src/H5ACpublic.h</code> include file in the HDF5 library has 
+                         detailed information on each strategy.  
+              </tr>
     </table></ul>
   <dt><strong>Returns:</strong>
       <dd>Returns a non-negative value if successful; otherwise returns a
diff --git a/html/RM/H5P/H5Pset_mdc_image_config.htm b/html/RM/H5P/H5Pset_mdc_image_config.htm
new file mode 100644
index 0000000..e082da0
--- /dev/null
+++ b/html/RM/H5P/H5Pset_mdc_image_config.htm
@@ -0,0 +1,206 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_mdc_image_config" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2017
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetMDCImageConfig">H5Pset_mdc_image_config</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+    <dd><code><em>herr_t</em> H5Pset_mdc_image_config(
+        <em>hid_t</em> plist_id,
+        <em>H5AC_cache_image_config_t * config_ptr);</em>
+        </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd>Sets the metadata cache image option for a file access property list.  
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd><code>H5Pset_mdc_image_config</code> 
+        sets the metadata cache image option with configuration values specified by <code>config_ptr</code> 
+        for the file access property list specified in  <code>plist_id</code>.
+<p>
+       <code>H5AC_cache_image_config_t</code> is defined as follows:
+       <pre>
+        typedef struct H5AC_cache_image_config_t {
+          int32_t         version;
+          hbool_t         generate_image;
+          hbool_t         save_resize_status;
+          int32_t         entry_ageout;
+        } H5AC_cache_image_config_t;
+        </pre>
+
+<p>
+Where the fields of <code>H5AC_cache_image_config_t</code> should be initialized as follows:
+
+ <dd><table width="100%">
+        <tr>
+            <td valign="top"><code>version</code>:</td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">Must be set to <code>H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION</code>.
+            </td>
+        </tr>
+
+        <tr>
+           <td valign="top"><code>generate_image</code>:</td>
+           <td width="5%"><code> </code></td>
+           <td valign="top">Set to either <code>TRUE</code> or <code>FALSE</code> depending on whether a cache image is desired. 
+            </td>
+        </tr>
+
+        <tr>
+           <td valign="top"><code>save_resize_status</code>:</td>
+           <td width="5%"><code> </code></td>
+           <td valign="top">
+           Set to either <code>TRUE</code> or <code>FALSE</code> depending on whether the user wishes the 
+           metadata cache image resize configuration to be stored in the cache image and restored on file 
+           open.  Note: this field is ignored at present.
+           </td>
+        </tr>  
+        
+        <tr>
+           <td valign="top"><code>entry_ageout</code>:</td>
+           <td width="5%"><code> </code></td>
+           <td valign="top">
+           This field allows the user to specify the number of times a cache entry can appear in subsequent 
+           cache images (created in subsequent file closes) without being accessed. The default value is <code>-1</code>, which indicates 
+           that the entry may appear in an indefinitely long sequence of cache images. The maximum value is <code>100</code>.
+           Note: This field is ignored at present.
+           </td>
+         </tr>
+         </table>
+
+    </dd></dt>
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Limitations:</strong>
+   <dd>
+  While it is an obvious error to request a cache image when opening the file read only, it is not in general 
+  possible to test for this error in the <code>H5Pset_mdc_image_config()</code> call. Rather than fail the subsequent file 
+  open, the library silently ignores the file image request in this case.
+<p>
+ It is also an error to request a cache image on a file that does not support superblock extension messages 
+ (i.e. a superblock version less than <code>2</code>). As above, it is not always possible to detect this error 
+ in the <code>H5Pset_mdc_image_config()</code> call, and thus the request for a cache image will fail silently in this case as well.
+<p>
+ Creation of cache images is currently disabled in parallel -- as above, any request for a cache image in this context will fail silently.
+<p>
+ Files with cache images may be read in parallel applications, but note that the load of the cache image is a
+ collective operation triggered by the first operation that accesses metadata after file open (or, if 
+ persistent free space managers are enabled, on the first allocation or deallocation of file space, or read 
+ of file space manager status, whichever comes first).  Thus the parallel process may deadlock if any process does 
+ not participate in this access.
+<p>
+ In long sequences of file closes and opens, infrequently accessed metadata can accumulate in the cache 
+ image to the point where the cost of storing and restoring this metadata exceeds the benefit of retaining 
+ frequently used metadata in the cache image.  When implemented, the <code>entry_ageout</code> should address this problem.  
+ In the interim, not requesting a cache image every <code>n</code> file close/open cycles may be an acceptable 
+ work around.  The choice of <code>n</code> will be driven by application behavior, but <code>n = 10</code> seems a good starting point.
+   </dd></dt>
+   <br />
+
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                plist_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>H5AC_cache_image_config_t *</em> config_ptr</code></td>
+            <td><code> </code></td>
+            <td valign="top">IN: Pointer to metadata cache image configuration values 
+                </p>
+                <p>
+                </td>
+            </tr>
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="RM_H5P.html#Property-GetMDCImageConfig">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5P/H5Pset_mdc_log_options.htm b/html/RM/H5P/H5Pset_mdc_log_options.htm
index 77aad05..15a10b8 100644
--- a/html/RM/H5P/H5Pset_mdc_log_options.htm
+++ b/html/RM/H5P/H5Pset_mdc_log_options.htm
@@ -76,7 +76,7 @@
     state of the logging flags.</p>
     
     <p>The log format is described in the 
-    <a href="Design-MetadataCache-Logging-THG20140224-v4.pdf">
+    <a href="/HDF5/docNewFeatures/FineTuneMDC/Design-MetadataCache-Logging-THG20140224-v4.pdf">
     <em>Metadata Cache Logging</em></a> document.</p></dd>
     <br />
 
@@ -137,10 +137,13 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Pget_mdc_log_options.htm">H5Pget_mdc_log_options</a></li>
-      <li><a href="H5Fstart_mdc_logging.htm">H5Fstart_mdc_logging</a></li>
-      <li><a href="H5Fstop_mdc_logging.htm">H5Fstop_mdc_logging</a></li>
-      <li><a href="H5Pget_mdc_logging_status.htm">H5Pget_mdc_logging_status</a></li>
+<!--
+      <li><a href="RM_H5P.html#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a></li>
+-->
+      <li><a href="RM_H5P.html#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a></li>
+      <li><a href="RM_H5P.html#Property-GetMdcLoggingStatus">H5Pget_mdc_logging_status</a>
+      <li><a href="RM_H5F.html#File-StartMdcLogging">H5Fstart_mdc_logging</a></li>
+      <li><a href="RM_H5F.html#File-StopMdcLogging">H5Fstop_mdc_logging</a></li>
     </ul>
     <br />
 
diff --git a/html/RM/H5P/H5Pset_metadata_read_attempts.htm b/html/RM/H5P/H5Pset_metadata_read_attempts.htm
index c7d7918..a8607b5 100644
--- a/html/RM/H5P/H5Pset_metadata_read_attempts.htm
+++ b/html/RM/H5P/H5Pset_metadata_read_attempts.htm
@@ -198,9 +198,9 @@
   
   <dt><strong>See Also:</strong>
     <dd>
-    <li><a href="#Property-GetMetadataReadAttempts">
+    <li><a href="RM_H5P.html#Property-GetMetadataReadAttempts">
         <code>H5Pget_metadata_read_attempts</code></a></li>
-    <li><a href="#File-GetMetadataReadRetriesInfo">
+    <li><a href="RM_H5F.html#File-GetMetadataReadRetriesInfo">
         <code>H5Fget_metadata_read_retries_info</code></a></li>
     </dd>
     <br />
diff --git a/html/RM/H5P/H5Pset_object_flush_cb.htm b/html/RM/H5P/H5Pset_object_flush_cb.htm
index 386ec93..b6d3abd 100644
--- a/html/RM/H5P/H5Pset_object_flush_cb.htm
+++ b/html/RM/H5P/H5Pset_object_flush_cb.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 18 February 2014
+    Last modified: 27 May 2016
     </i></font></div></dt>
     <br />
 
@@ -154,40 +154,49 @@ flush_cb(hid_t obj_id, void *_udata)
     <dd>None</dd>
     <br />
 
+
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOappend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
 
+
 <dt><strong>History:</strong></dt>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5P/H5Pset_page_buffer_size.htm b/html/RM/H5P/H5Pset_page_buffer_size.htm
new file mode 100644
index 0000000..cc76bab
--- /dev/null
+++ b/html/RM/H5P/H5Pset_page_buffer_size.htm
@@ -0,0 +1,171 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * 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://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.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!--__ ***********************************************************  -->
+<!--__ Do not alter the next line; it is used by the PDF generator. -->
+<!--__ ***********************************************************  -->
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_page_buffer_size" -->
+
+<hr />
+<dl>
+
+<dt><div align="right"><font color="999999" size="-1"><i>
+    Last modified:  2016
+    </i></font></div></dt>
+    <br />
+
+<dt><strong>Name:</strong> 
+    <a name="Property-SetPageBufferSize">H5Pset_page_buffer_size</a>
+    </dt>
+    <br />
+
+<dt><strong>Signature:</strong>
+   <dd><code>
+   <em>herr_t</em> H5Pset_page_buffer_size( 
+     <em>hid_t</em> fapl_id, 
+     <em>size_t</em> buf_size, 
+     <em>unsigned</em> min_meta_perc, 
+     <em>unsigned</em> min_raw_perc )
+
+     </code>
+    </dd></dt>
+    <br />
+
+<dt><strong>Purpose:</strong>
+    <dd> Sets the maximum size for the page buffer and the minimum percentage for metadata and raw data pages.
+    </dd></dt>
+    <br />
+
+<dt><strong>Description:</strong>
+    <dd>
+<p>
+     <code>H5Pset_page_buffer_size</code> sets <code>buf_size</code>, the maximum size in bytes of the page 
+     buffer. The default value is zero, meaning that page buffering is disabled. When a non-zero page buffer
+     size is set, the library will enable page buffering if that size is larger or equal than a single page 
+     size if a paged file space strategy is enabled using the functions <code>H5Pset_file_space_strategy()</code>
+     and <code>H5Pset_file_space_page_size()</code>.
+</p>
+<p> 
+     The page buffer layer captures all I/O requests before they are issued to the VFD and "caches"
+     them in fixed sized pages. Once the total number of pages exceeds the page buffer size, the library 
+     evicts pages from the page buffer by writing them to the VFD. At file close, the page buffer is 
+     flushed writing all the pages to the file. 
+</p>
+<p>
+     If a non-zero page buffer size is set, and the file space strategy is not set to paged or the 
+     page size for the file space strategy is larger than the page buffer size, the subsequent call to 
+     <code>H5Fcreate()</code> or <code>H5Fopen()</code> using the fapl_id will fail.
+</p>
+<p>
+     The function also allows setting the minimum percentage of pages for metadata and raw data to 
+     prevent a certain type of data to evict hot data of the other type.
+</p>
+
+    </dd></dt>
+
+<!--
+<dt><strong>Note:</strong>
+    <dd>
+    </dd></dt>
+    <br />
+-->
+    
+<dt><strong>Parameters:</strong>
+    <dd><table width="100%">
+
+        <tr>
+            <td valign="top"><code><em>hid_t</em> 
+                fapl_id</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: File access property list identifier</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>size_t</em> 
+                buf_size</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Maximum size, in bytes, of the page buffer </td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>unsigned</em> 
+                min_meta_perc</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Minimum metadata percentage to keep in the page buffer before allowing pages containing metadata to be evicted (Default is 0)</td>
+        </tr>
+
+        <tr>
+            <td valign="top"><code><em>unsigned</em> 
+                min_raw_perc</code></td>
+            <td width="5%"><code> </code></td>
+            <td valign="top">IN: Minimum raw data percentage to keep in the page buffer before allowing pages containing raw data to be evicted (Default is 0) </td>
+        </tr>
+
+        </table></dd>
+    </dt>
+    
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful.
+        Otherwise returns a negative value.</dd>
+    </dt>
+    <br />
+
+<dt><strong>Fortran Interface:</strong></dt>
+    <dd>None</dd>
+    </dt>
+    <br />
+
+<dt><strong>See Also:</strong></dt>
+<!--
+    <table width="100%" border="0">
+    <tr><td width="50%"align="left" valign="top">
+        <ul>
+          <li><a href="H5Pget_mdc_image_config.htm">
+              <code>H5Pget_mdc_image_config</code></a>
+              <br /> </li>
+        </ul>
+    </td></tr>
+    </table>
+    <br />
+-->
+
+<dt><strong>History:</strong></dt>
+    <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.1</td>
+        <td valign="top">
+        C function introduced with this release.</td>
+    </tr>
+    </table>
+    </dd>
+
+</dl>
+<br />
+<br />
+<br />
+
+
+
diff --git a/html/RM/H5S/H5Sextent_equal.htm b/html/RM/H5S/H5Sextent_equal.htm
index a539285..c4a3d54 100644
--- a/html/RM/H5S/H5Sextent_equal.htm
+++ b/html/RM/H5S/H5Sextent_equal.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 17 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Dataspace-ExtentEqual">H5Sextent_equal</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Sextent_equal</code>(
@@ -61,7 +61,25 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> if equal, <code>FALSE</code> 
-      if unequal, if successful; otherwise returns a negative value.
+    <dd>
+        Returns a positive value if the two dataspace extents are equal.
+        <br />
+        Returns 0 if the two dataspace extents are not equal. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
+<br />
+<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/H5Sis_simple.htm b/html/RM/H5S/H5Sis_simple.htm
index 6b0b777..f77f88f 100644
--- a/html/RM/H5S/H5Sis_simple.htm
+++ b/html/RM/H5S/H5Sis_simple.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 17 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Dataspace-IsSimple">H5Sis_simple</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Sis_simple</code>(
@@ -53,10 +53,14 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>,
-        or <code>0</code> (zero), for <code>FALSE</code>.
-        Otherwise returns a negative value.
-
+    <dd>
+        Returns a positive value if the specified dataspace is a simple 
+        dataspace.
+        <br />
+        Returns 0 if the specified dataspace is not a simple dataspace. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <p>
 <dt><strong>Fortran90 Interface:</strong> h5sis_simple_f
     <dd>
diff --git a/html/RM/H5S/H5Sselect_valid.htm b/html/RM/H5S/H5Sselect_valid.htm
index aba790a..4134dea 100644
--- a/html/RM/H5S/H5Sselect_valid.htm
+++ b/html/RM/H5S/H5Sselect_valid.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 17 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Dataspace-SelectValid">H5Sselect_valid</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Sselect_valid</code>(
@@ -54,12 +54,15 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>Returns a positive value, for <code>TRUE</code>, 
-        if the selection is contained within the extent 
-        or <code>0</code> (zero), for <code>FALSE</code>, if it is not.
-        Returns a negative value on error conditions 
-        such as the selection or extent not being defined.
-
+    <dd>
+        Returns a positive value if the selection is contained within 
+        the extent.
+        <br />
+        Returns 0 if the selection is not contained within the extent. 
+        <br />
+        Returns a negative value on error conditions 
+        such as the selection or extent not being defined. 
+        </dd>
 <p>
 <dt><strong>Fortran90 Interface:</strong> h5sselect_valid_f
     <dd>
diff --git a/html/RM/H5T/H5Tcommitted.htm b/html/RM/H5T/H5Tcommitted.htm
index f3e81e1..a5d7934 100644
--- a/html/RM/H5T/H5Tcommitted.htm
+++ b/html/RM/H5T/H5Tcommitted.htm
@@ -22,21 +22,27 @@
 <!-- HEADER RIGHT "H5Tcommitted" -->
 <hr>
 <dl>
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Datatype-Committed">H5Tcommitted</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t</em><code>H5Tcommitted</code>(
         <em>hid_t</em> <code>dtype_id</code>
         )
 <dt><strong>Purpose:</strong>
-    <dd>Determines whether a datatype is a named type or a transient type.  
+    <dd>Determines whether a datatype is a committed type or 
+    a transient type.  
 <dt><strong>Description:</strong>
     <dd><code>H5Tcommitted</code> queries a type to determine whether 
         the type specified by the <code>dtype_id</code> identifier 
-        is a named type or a transient type.  If this function returns 
-        a positive value, then the type is named (that is, it has been 
-        committed, perhaps by some other application).  Datasets which
-        return committed datatypes with <code>H5Dget_type()</code> are 
-        able to share the datatype with other datasets in the same file.
+        is a committed (formerly known as a named) type or a transient 
+        type. If this function returns a positive value, then the type 
+        is committed (that is, it has been committed, perhaps by some 
+        other application). Datasets which return committed datatypes 
+        with <code>H5Dget_type()</code> are able to share the datatype 
+        with other datasets in the same file.
 <dt><strong>Parameters:</strong>
     <ul><table>
         <tr>
@@ -44,25 +50,26 @@
             <td valign="top">IN: Datatype identifier.</td></tr>
     </table></ul>
 <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>, 
-        if the datatype has been committed, or <code>0</code> (zero), 
-        for <code>FALSE</code>, if the datatype has not been committed.
-        Otherwise returns a negative value.
-<dt><strong>Fortran90 Interface:</strong> h5tcommitted_f
-    <dd>
-	<pre>
-SUBROUTINE h5tcommitted_f(type_id, hdferr) 
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier 
-  INTEGER, INTENT(OUT) :: hdferr        ! Error code
-END SUBROUTINE h5tcommitted_f
-	</pre>		
-		
-		<!--<dt><strong>Non-C API(s):</strong>
-    	<dd>
-        
-        <img src="Graphics/Java.gif"> 
-        <img src="Graphics/C++.gif">
-        -->
+    <dd>
+        Returns a positive value if the datatype has been committed.
+        <br />
+        Returns 0 if the datatype has not been committed. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
+
+<dt><strong>Fortran90 Interface:</strong> h5tcommitted_f
+    <dd>
+	<pre>
+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 committed
+                                    ! .FALSE., if the datatype not committed.
+  INTEGER, INTENT(OUT) :: hdferr    ! Error code
+                                    ! 0 on success and -1 on failure
+END SUBROUTINE h5tcommitted_f
+	</pre>		
 </dl>
 
diff --git a/html/RM/H5T/H5Tcompiler_conv.htm b/html/RM/H5T/H5Tcompiler_conv.htm
index 8d205bc..1e2e516 100644
--- a/html/RM/H5T/H5Tcompiler_conv.htm
+++ b/html/RM/H5T/H5Tcompiler_conv.htm
@@ -22,6 +22,10 @@
 <!-- HEADER RIGHT "H5Tcompiler_conv" -->
 <hr>
 <dl>
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Datatype-CompilerConv">H5Tcompiler_conv</a>
 <dt><strong>Signature:</strong>
   <dd><em>htri_t</em> <code>H5Tcompiler_conv</code>(<em>hid_t</em> 
@@ -48,8 +52,13 @@
     </table>
   </ul>
 <dt><strong>Returns:</strong>
-  <dd>Returns TRUE for compiler conversion, FALSE for library conversion, 
-    FAIL for the function�s failure.
+    <dd>
+        Returns a positive value if a compiler conversion was used.
+        <br />
+        Returns 0 if a library conversion was used. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <dt><strong>Fortran90 Interface:</strong> h5tcompiler_conv_f
   <dd><pre>
 SUBROUTINE h5tcompiler_conv_f( src_id, dst_id, flag, hdferr)
diff --git a/html/RM/H5T/H5Tdetect_class.htm b/html/RM/H5T/H5Tdetect_class.htm
index cef312d..019c2da 100644
--- a/html/RM/H5T/H5Tdetect_class.htm
+++ b/html/RM/H5T/H5Tdetect_class.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 18 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Datatype-DetectClass">H5Tdetect_class</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Tdetect_class</code>(
@@ -65,10 +65,20 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> or <code>FALSE</code> if successful;
-        otherwise returns a negative value.
+    <dd>
+        Returns a positive value if the datatype being examined by 
+        this function contains any datatypes that belong to the 
+        specified datatype class.
+        <br />
+        Returns 0 if the datatype being examined by this function does 
+        not contain any datatypes that belong to the specified datatype 
+        class.
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
+<p>
 <dt><strong>Fortran90 Interface:</strong>
-    <dd>None.
+    <dd>None
 <!--
     <pre>
     </pre>
diff --git a/html/RM/H5T/H5Tequal.htm b/html/RM/H5T/H5Tequal.htm
index f62ae95..e284be7 100644
--- a/html/RM/H5T/H5Tequal.htm
+++ b/html/RM/H5T/H5Tequal.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 18 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Datatype-Equal">H5Tequal</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Tequal</code>(
@@ -56,11 +56,14 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>When successful, returns a positive value, for <code>TRUE</code>, 
-        if the datatype identifiers refer to the same datatype, 
-        or <code>0</code> (zero), for <code>FALSE</code>.
-        Otherwise returns a negative value.
-
+    <dd>
+        Returns a positive value if the datatype identifiers refer to the 
+        same datatype.
+        <br />
+        Returns 0 if the datatype identifiers do not refer to the same datatype. 
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <p>
 <dt><strong>Fortran90 Interface:</strong> h5tequal_f
     <dd>
diff --git a/html/RM/H5T/H5Tflush.htm b/html/RM/H5T/H5Tflush.htm
index 9d94513..ddb0a3b 100644
--- a/html/RM/H5T/H5Tflush.htm
+++ b/html/RM/H5T/H5Tflush.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 26 February 2014
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -75,33 +75,41 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Trefresh.htm">H5Trefresh</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5T/H5Tis_variable_str.htm b/html/RM/H5T/H5Tis_variable_str.htm
index 319779a..2c762af 100644
--- a/html/RM/H5T/H5Tis_variable_str.htm
+++ b/html/RM/H5T/H5Tis_variable_str.htm
@@ -23,10 +23,10 @@
 <hr>
 <dl>
 
-<dt><div align=right><font color=999999 size=-1><i>
-    Last modified: 18 August 2010
-    </i></font></div>
-
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
 <dt><strong>Name:</strong> <a name="Datatype-IsVariableString">H5Tis_variable_str</a>
 <dt><strong>Signature:</strong>
     <dd><em>htri_t </em><code>H5Tis_variable_str</code>(
@@ -55,9 +55,15 @@
 
 <p>
 <dt><strong>Returns:</strong>
-    <dd>Returns <code>TRUE</code> or <code>FALSE</code> if successful;
-        otherwise returns a negative value.
-
+    <dd>
+        Returns a positive value if the specified datatype is a 
+        variable-length string.
+        <br />
+        Returns 0 if the specified datatype is not a 
+        variable-length string.
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
 <p>
 <dt><strong>Fortran90 Interface:</strong> h5tis_variable_str_f
     <dd>
diff --git a/html/RM/H5T/H5Trefresh.htm b/html/RM/H5T/H5Trefresh.htm
index 3ff99ea..c4c6a79 100644
--- a/html/RM/H5T/H5Trefresh.htm
+++ b/html/RM/H5T/H5Trefresh.htm
@@ -27,7 +27,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 7 December 2015
+    Last modified: 31 May 2016
     </i></font></div></dt>
     <br />
 
@@ -73,33 +73,41 @@
 
 <dt><strong>See Also:</strong></dt>
     <ul>
-      <li><a href="H5Dflush.htm">H5Dflush</a></li>
-      <li><a href="H5Drefresh.htm">H5Drefresh</a></li>
-      <li><a href="H5Gflush.htm">H5Gflush</a></li>
-      <li><a href="H5Grefresh.htm">H5Grefresh</a></li>
-      <li><a href="H5Oflush.htm">H5Oflush</a></li>
-      <li><a href="H5Orefresh.htm">H5Orefresh</a></li>
-      <li><a href="H5Tflush.htm">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Flush">H5Dflush</a></li>
+      <li><a href="../RM/RM_H5D.html#Dataset-Refresh">H5Drefresh</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Flush">H5Gflush</a></li>
+      <li><a href="../RM/RM_H5G.html#Group-Refresh">H5Grefresh</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Flush">H5Oflush</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-Refresh">H5Orefresh</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Flush">H5Tflush</a></li>
+      <li><a href="../RM/RM_H5T.html#Datatype-Refresh">H5Trefresh</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Fstart_swmr_write.htm">H5Fstart_swmr_write</a></li>
-      <li><a href="H5DOAppend.htm">H5DOappend</a></li>
-      <li><a href="H5Pset_append_flush.htm">H5Pset_append_flush</a></li>
-      <li><a href="H5Pget_append_flush.htm">H5Pget_append_flush</a></li>
-      <li><a href="H5Pget_object_flush_cb.htm">H5Pget_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5F.html#File-StartSwmrWrite">H5Fstart_swmr_write</a></li>
+      <li><a href="../HL/RM_HDF5Optimized.html#H5DOappend">H5DOappend</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetAppendFlush">H5Pset_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetAppendFlush">H5Pget_append_flush</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a></li>
+      <li><a href="../RM/RM_H5P.html#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a></li>
     </ul>
     <br />
 
     <ul>
-      <li><a href="H5Odisable_mdc_flushes.htm">H5Odisable_mdc_flushes</a></li>
-      <li><a href="H5Oenable_mdc_flushes.htm">H5Oenable_mdc_flushes</a></li>
-      <li><a href="H5Oare_mdc_flushes_disabled.htm">H5Oare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fdisable_mdc_flushes.htm">H5Fdisable_mdc_flushes</a></li>
-      <li><a href="H5Fenable_mdc_flushes.htm">H5Fenable_mdc_flushes</a></li>
-      <li><a href="H5Fare_mdc_flushes_disabled.htm">H5Fare_mdc_flushes_disabled</a></li>
-      <li><a href="H5Fget_mdc_flush_disabled_obj_ids.htm">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5O.html#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a></li>
+
+<!-- FOLLOWING FUNCTIONS NOT IMPLEMENTED
+
+      <li><a href="../RM/RM_H5F.html#File-DisableMdcFlushes">H5Fdisable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-EnableMdcFlushes">H5Fenable_mdc_flushes</a></li>
+      <li><a href="../RM/RM_H5F.html#File-AreMdcFlushesDisabled">H5Fare_mdc_flushes_disabled</a></li>
+      <li><a href="../RM/RM_H5F.html#File-GetMdcFlushDisabledObjIds">H5Fget_mdc_flush_disabled_obj_ids</a></li>
+
+END UNIMPLEMENTED FUNCTIIONS -->
+
     </ul>
     <br />
 
diff --git a/html/RM/H5Z/H5Zfilter_avail.htm b/html/RM/H5Z/H5Zfilter_avail.htm
index ba8903a..c2f6bab 100644
--- a/html/RM/H5Z/H5Zfilter_avail.htm
+++ b/html/RM/H5Z/H5Zfilter_avail.htm
@@ -22,14 +22,27 @@
 <!-- HEADER RIGHT "H5Zfilter_avail" -->
 <hr>
 <dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 10 December 2015
+    </i></font></div>
+
+  <br />
   <dt><strong>Name:</strong> <a name="Compression-FilterAvail">H5Zfilter_avail</a>
+  <br />
+  <br />
   <dt><strong>Signature:</strong>
     <dd><em>htri_t</em> <code>H5Zfilter_avail</code>(<em>H5Z_filter_t</em> <code>filter</code>)
+  <br />
+  <br />
   <dt><strong>Purpose:</strong>
     <dd>Determines whether a filter is available.
+  <br />
+  <br />
   <dt><strong>Description:</strong>
     <dd><code>H5Zfilter_avail</code> determines whether the filter 
         specified in <code>filter</code> is available to the application.
+  <br />
+  <br />
   <dt><strong>Parameters:</strong>
     <ul><table>
         <tr>
@@ -38,10 +51,17 @@
               See the introduction to this section of the reference manual 
               for a list of valid filter identifiers.</td></tr>
     </table></ul>
+  <br />
   <dt><strong>Returns:</strong>
-    <dd>Returns a Boolean value (<code>TRUE</code>/<code>FALSE</code>) 
-        if successful;
-        otherwise returns a negative value.
+    <dd>
+        Returns a positive value if the specified filter is available.
+        <br />
+        Returns 0 if the specified filter is not available.
+        <br />
+        Returns a negative value when the function fails. 
+        </dd>
+  <br />
+  <br />
   <dt><strong>Fortran90 Interface:</strong> h5zfilter_avail_f
     <dd>
 	<pre>
@@ -57,6 +77,7 @@ SUBROUTINE h5zfilter_avail_f(filter, status, hdferr)
                                      ! filter is available: 
                                      !    .TRUE.
                                      !    .FALSE.
+  INTEGER, INTENT(OUT) :: hdferr     ! Returns 0 if successful and -1 if fails
 END SUBROUTINE h5zfilter_avail_f
 	</pre>		
 		
@@ -79,5 +100,7 @@ END SUBROUTINE h5zfilter_avail_f
 		    Function introduced in this release.</td></tr>
     </table></ul>
 </dl>
+  <br />
+  <br />
 
 
diff --git a/html/RM/PredefDTypes.html b/html/RM/PredefDTypes.html
index 15f3c39..75365ff 100644
--- a/html/RM/PredefDTypes.html
+++ b/html/RM/PredefDTypes.html
@@ -563,7 +563,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 24 January 2013");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/RM_H5.html b/html/RM/RM_H5.html
index c22f4db..bc02ab7 100644
--- a/html/RM/RM_H5.html
+++ b/html/RM/RM_H5.html
@@ -281,7 +281,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 29 September 2015");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5A.html b/html/RM/RM_H5A.html
index 7d7c3a2..b33f92c 100644
--- a/html/RM/RM_H5A.html
+++ b/html/RM/RM_H5A.html
@@ -388,7 +388,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 9 October 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/RM_H5D.html b/html/RM/RM_H5D.html
index d965751..e07d898 100644
--- a/html/RM/RM_H5D.html
+++ b/html/RM/RM_H5D.html
@@ -107,19 +107,20 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#Dataset-Open1">H5Dopen1</a> *
     <li><a href="#Dataset-Open2">H5Dopen2</a>
     <li><a href="#Dataset-Close">H5Dclose</a>
+    <li><a href="#Dataset-Fill">H5Dfill</a>
     
 </ul>
 </td><td>      </td><td valign=top>
 <ul>
-    <li><a href="#Dataset-GetSpace">H5Dget_space</a>
-    <li><a href="#Dataset-GetSpaceStatus">H5Dget_space_status</a>
-    <li><a href="#Dataset-GetType">H5Dget_type</a>
-    <li><a href="#Dataset-GetCreatePlist">H5Dget_create_plist</a>
-    <li><a href="#Dataset-GetAccessPlist">H5Dget_access_plist</a>
-    <li><a href="#Dataset-GetOffset">H5Dget_offset</a>
-    <li><a href="#Dataset-GetStorageSize">H5Dget_storage_size</a>
-    <li><a href="#Dataset-VLGetBuf">H5Dvlen_get_buf_size</a>
-    <li><a href="#Dataset-VLReclaim">H5Dvlen_reclaim</a>
+    <li><a href="#Dataset-Read">H5Dread</a>
+    <li><a href="#Dataset-Write">H5Dwrite</a>
+    <li><a href="#Dataset-Flush">H5Dflush</a>
+    <li><a href="#Dataset-Refresh">H5Drefresh</a>
+    <li><a href="#Dataset-Gather">H5Dgather</a>
+    <li><a href="#Dataset-Scatter">H5Dscatter</a>
+    <li><a href="#Dataset-Iterate">H5Diterate</a>
+    <li><a href="#Dataset-Extend">H5Dextend</a> *
+    <li><a href="#Dataset-SetExtent">H5Dset_extent</a>
 </ul>
 </td><td>      </td><td valign=top>
 <ul>
@@ -130,14 +131,15 @@ In the following lists, italic type indicates a configurable macro.
        It is used only by certain tools.
        DO NOT list it in the Reference Manual.
     -->
-    <li><a href="#Dataset-Read">H5Dread</a>
-    <li><a href="#Dataset-Write">H5Dwrite</a>
-    <li><a href="#Dataset-Gather">H5Dgather</a>
-    <li><a href="#Dataset-Scatter">H5Dscatter</a>
-    <li><a href="#Dataset-Iterate">H5Diterate</a>
-    <li><a href="#Dataset-Extend">H5Dextend</a> *
-    <li><a href="#Dataset-SetExtent">H5Dset_extent</a>
-    <li><a href="#Dataset-Fill">H5Dfill</a>
+    <li><a href="#Dataset-VLGetBuf">H5Dvlen_get_buf_size</a>
+    <li><a href="#Dataset-VLReclaim">H5Dvlen_reclaim</a>
+    <li><a href="#Dataset-GetStorageSize">H5Dget_storage_size</a>
+    <li><a href="#Dataset-GetSpace">H5Dget_space</a>
+    <li><a href="#Dataset-GetSpaceStatus">H5Dget_space_status</a>
+    <li><a href="#Dataset-GetType">H5Dget_type</a>
+    <li><a href="#Dataset-GetCreatePlist">H5Dget_create_plist</a>
+    <li><a href="#Dataset-GetAccessPlist">H5Dget_access_plist</a>
+    <li><a href="#Dataset-GetOffset">H5Dget_offset</a>
 </ul>
 </td></tr>
 <tr><td align=right colspan=5>
@@ -159,6 +161,7 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Dataset-CreateAnon">H5Dcreate_anon</a>
       <li><a href="#Dataset-Extend">H5Dextend</a> *
       <li><a href="#Dataset-Fill">H5Dfill</a>
+      <li><a href="#Dataset-Flush">H5Dflush</a>
       <li><a href="#Dataset-Gather">H5Dgather</a>
 	</ul>     
     </td>
@@ -175,6 +178,7 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Dataset-GetStorageSize">H5Dget_storage_size</a>
       <li><a href="#Dataset-GetType">H5Dget_type</a>
       <li><a href="#Dataset-Iterate">H5Diterate</a>
+      <li><a href="#Dataset-Open"><i>H5Dopen</i></a>
 	</ul>
     </td>
     
@@ -182,10 +186,10 @@ In the following lists, italic type indicates a configurable macro.
     
     <td valign="top">
 	<ul>
-      <li><a href="#Dataset-Open"><i>H5Dopen</i></a>
       <li><a href="#Dataset-Open1">H5Dopen1</a> *
       <li><a href="#Dataset-Open2">H5Dopen2</a>
       <li><a href="#Dataset-Read">H5Dread</a>
+      <li><a href="#Dataset-Refresh">H5Drefresh</a>
       <li><a href="#Dataset-Scatter">H5Dscatter</a>
       <li><a href="#Dataset-SetExtent">H5Dset_extent</a>
       <li><a href="#Dataset-VLGetBuf">H5Dvlen_get_buf_size</a>
@@ -256,6 +260,7 @@ as the corresponding C function.
 <?php include("H5D/H5Dcreate_anon.htm"); ?>
 <?php include("H5D/H5Dextend.htm"); ?>
 <?php include("H5D/H5Dfill.htm"); ?>
+<?php include("H5D/H5Dflush.htm"); ?>
 <?php include("H5D/H5Dgather.htm"); ?>
 <?php include("H5D/H5Dget_access_plist.htm"); ?>
 <?php include("H5D/H5Dget_create_plist.htm"); ?>
@@ -269,6 +274,7 @@ as the corresponding C function.
 <?php include("H5D/H5Dopen1.htm"); ?>
 <?php include("H5D/H5Dopen2.htm"); ?>
 <?php include("H5D/H5Dread.htm"); ?>
+<?php include("H5D/H5Drefresh.htm"); ?>
 <?php include("H5D/H5Dscatter.htm"); ?>
 <?php include("H5D/H5Dset_extent.htm"); ?>
 <?php include("H5D/H5Dvlen_get_buf_size.htm"); ?>
@@ -339,7 +345,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 2 March 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5E.html b/html/RM/RM_H5E.html
index acf7ca6..11072f6 100644
--- a/html/RM/RM_H5E.html
+++ b/html/RM/RM_H5E.html
@@ -372,7 +372,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 9 October 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/RM_H5F.html b/html/RM/RM_H5F.html
index e187ba1..351e818 100644
--- a/html/RM/RM_H5F.html
+++ b/html/RM/RM_H5F.html
@@ -111,12 +111,12 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#File-Mount">H5Fmount</a>
     <li><a href="#File-Unmount">H5Funmount</a>
     <li><a href="#File-GetVfdHandle">H5Fget_vfd_handle</a>
-</ul>
-</td><td>      </td><td valign=top>
-<ul>
     <li><a href="#File-GetFilesize">H5Fget_filesize</a>
     <li><a href="#File-GetCreatePlist">H5Fget_create_plist</a>
     <li><a href="#File-GetAccessPlist">H5Fget_access_plist</a>
+</ul>
+</td><td>      </td><td valign=top>
+<ul>
     <li><a href="#File-GetInfo"><i>H5Fget_info</i></a>
     <li><a href="#File-GetInfo1">H5Fget_info1</a> *
     <li><a href="#File-GetInfo2">H5Fget_info2</a>
@@ -124,19 +124,28 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#File-GetName">H5Fget_name</a>
     <li><a href="#File-GetObjCount">H5Fget_obj_count</a>
     <li><a href="#File-GetObjIDs">H5Fget_obj_ids</a>
-</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>
     <li><a href="#File-GetMdcConfig">H5Fget_mdc_config</a>
+</ul>
+</td><td>      </td><td valign=top>
+<ul>
     <li><a href="#File-GetMdcHitRate">H5Fget_mdc_hit_rate</a>
     <li><a href="#File-ResetMdcHitRateStats">H5Freset_mdc_hit_rate_stats</a>
+    <li><a href="#File-GetMdcImageInfo">H5Fget_mdc_image_info</a>
     <li><a href="#File-GetMdcSize">H5Fget_mdc_size</a>
+    <li><a href="#File-GetMetadataReadRetryInfo">H5Fget_metadata_read_retry_info</a>
+    <li><a href="#File-StartMdcLogging">H5Fstart_mdc_logging</a>
+    <li><a href="#File-StopMdcLogging">H5Fstop_mdc_logging</a>
+    <li><a href="#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
+    <li><a href="#File-StartSwmrWrite">H5Fstart_swmr_write</a>
     <li><a href="#File-SetMpiAtomicity">H5Fset_mpi_atomicity</a>
     <li><a href="#File-GetMpiAtomicity">H5Fget_mpi_atomicity</a>
+    <li><a href="#File-GetPBStats">H5Fget_page_buffering_stats</a></li>
+    <li><a href="#File-ResetPBStats">H5Freset_page_buffering_stats</a></li>
+   
 </ul>
 </td></tr>
 <tr><td align=right colspan=5>
@@ -161,6 +170,8 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#File-GetFilesize">H5Fget_filesize</a>
       <li><a href="#File-GetFreeSections">H5Fget_free_sections</a>
       <li><a href="#File-GetFreespace">H5Fget_freespace</a> 
+      <li><a href="#File-GetInfo"><i>H5Fget_info</i></a>
+      <li><a href="#File-GetInfo1">H5Fget_info1</a> *
     </ul>      
     </td>
     
@@ -168,16 +179,19 @@ In the following lists, italic type indicates a configurable macro.
     
     <td valign="top">
     <ul>
-      <li><a href="#File-GetInfo"><i>H5Fget_info</i></a>
-      <li><a href="#File-GetInfo1">H5Fget_info1</a> *
       <li><a href="#File-GetInfo2">H5Fget_info2</a>
       <li><a href="#File-GetIntent">H5Fget_intent</a>
       <li><a href="#File-GetMdcConfig">H5Fget_mdc_config</a>
       <li><a href="#File-GetMdcHitRate">H5Fget_mdc_hit_rate</a>
+      <li><a href="#File-GetMdcImageInfo">H5Fget_mdc_image_info</a>
+      <li><a href="#File-GetMdcLoggingStatus">H5Fget_mdc_logging_status</a>
       <li><a href="#File-GetMdcSize">H5Fget_mdc_size</a>
+      <li><a href="#File-GetMetadataReadRetryInfo">H5Fget_metadata_read_retry_info</a>
       <li><a href="#File-GetMpiAtomicity">H5Fget_mpi_atomicity</a>
       <li><a href="#File-GetName">H5Fget_name</a>
       <li><a href="#File-GetObjCount">H5Fget_obj_count</a>
+      <li><a href="#File-GetObjIDs">H5Fget_obj_ids</a>
+      <li><a href="#File-GetPBStats">H5Fget_page_buffering_stats</a></li>
     </ul>
     </td>
     
@@ -185,15 +199,18 @@ In the following lists, italic type indicates a configurable macro.
     
     <td valign="top">
     <ul>
-      <li><a href="#File-GetObjIDs">H5Fget_obj_ids</a>
       <li><a href="#File-GetVfdHandle">H5Fget_vfd_handle</a>
       <li><a href="#File-IsHDF5">H5Fis_hdf5</a>
       <li><a href="#File-Mount">H5Fmount</a>
       <li><a href="#File-Open">H5Fopen</a>
       <li><a href="#File-Reopen">H5Freopen</a>
       <li><a href="#File-ResetMdcHitRateStats">H5Freset_mdc_hit_rate_stats</a>
+      <li><a href="#File-ResetPBStats">H5Freset_page_buffering_stats</a></li>
       <li><a href="#File-SetMdcConfig">H5Fset_mdc_config</a>
       <li><a href="#File-SetMpiAtomicity">H5Fset_mpi_atomicity</a>
+      <li><a href="#File-StartSwmrWrite">H5Fstart_swmr_write</a>
+      <li><a href="#File-StartMdcLogging">H5Fstart_mdc_logging</a>
+      <li><a href="#File-StopMdcLogging">H5Fstop_mdc_logging</a>
       <li><a href="#File-Unmount">H5Funmount</a>
     </ul>
     </td>
@@ -275,19 +292,27 @@ as the corresponding C function.
 <?php include("H5F/H5Fget_intent.htm"); ?>
 <?php include("H5F/H5Fget_mdc_config.htm"); ?>
 <?php include("H5F/H5Fget_mdc_hit_rate.htm"); ?>
+<?php include("H5F/H5Fget_mdc_image_info.htm"); ?>
+<?php include("H5F/H5Fget_mdc_logging_status.htm"); ?>
 <?php include("H5F/H5Fget_mdc_size.htm"); ?>
+<?php include("H5F/H5Fget_metadata_read_retry_info.htm"); ?>
 <?php include("H5F/H5Fget_mpi_atomicity.htm"); ?>
 <?php include("H5F/H5Fget_name.htm"); ?>
 <?php include("H5F/H5Fget_obj_count.htm"); ?>
 <?php include("H5F/H5Fget_obj_ids.htm"); ?>
+<?php include("H5F/H5Fget_page_buffering_stats.htm"); ?>
 <?php include("H5F/H5Fget_vfd_handle.htm"); ?>
 <?php include("H5F/H5Fis_hdf5.htm"); ?>
 <?php include("H5F/H5Fmount.htm"); ?>
 <?php include("H5F/H5Fopen.htm"); ?>
 <?php include("H5F/H5Freopen.htm"); ?>
 <?php include("H5F/H5Freset_mdc_hit_rate_stats.htm"); ?>
+<?php include("H5F/H5Freset_page_buffering_stats.htm"); ?>
 <?php include("H5F/H5Fset_mdc_config.htm"); ?>
 <?php include("H5F/H5Fset_mpi_atomicity.htm"); ?>
+<?php include("H5F/H5Fstart_swmr_write.htm"); ?>
+<?php include("H5F/H5Fstart_mdc_logging.htm"); ?>
+<?php include("H5F/H5Fstop_mdc_logging.htm"); ?>
 <?php include("H5F/H5Funmount.htm"); ?>
 
 
@@ -354,7 +379,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 4 March 2016");
+document.writeln("Last modified: March 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/RM_H5Front.html b/html/RM/RM_H5Front.html
index 961a8d0..c8756cb 100644
--- a/html/RM/RM_H5Front.html
+++ b/html/RM/RM_H5Front.html
@@ -96,16 +96,13 @@ In the
 <tr><td valign="center" align="center">
 <table width="98%" bgcolor=#ffffff>
     <tr><td align="left">
-        HDF5 C functions, Fortran subroutines, and command-line tools
-        introduced in HDF5 Release 1.10.0 are not yet fully integrated into 
+        Some HDF5 Fortran subroutines and command-line tools
+        introduced in HDF5 Release 1.10 are not yet fully integrated into 
         the HDF5 Reference Manual.  
-        That integration will be completed within a few weeks
-        following the release.
-        <p />
-        Reference manual entries for those functions, subroutines, 
-        and tools currently appear only in the feature descriptions in
+        <br />
+        For information on what is new in HDF5-1.10 see: 
         <a href="/HDF5/docNewFeatures/index.html">New Features in
-        HDF5 Release 1.10.0</a>.
+        HDF5 Release 1.10</a>
 </td></tr>
 </table>
 <tr><td> </td></tr>
@@ -113,7 +110,7 @@ In the
 <p />
 
 </center>
-The HDF5 Library provides several interfaces, each of which provides the 
+The HDF5 library provides several interfaces, each of which provides the 
 tools required to meet specific aspects of the HDF5 data-handling requirements.
 
 <SCRIPT language="JavaScript">
@@ -517,7 +514,7 @@ In the
 <table width="100%" border="0"> <tr valign="top"> <td align="left">
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 4 April 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 </td></tr></table>
diff --git a/html/RM/RM_H5G.html b/html/RM/RM_H5G.html
index 7b79187..2fad7ff 100644
--- a/html/RM/RM_H5G.html
+++ b/html/RM/RM_H5G.html
@@ -107,22 +107,24 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#Group-Open1">H5Gopen1</a> *
     <li><a href="#Group-Open2">H5Gopen2</a>
     <li><a href="#Group-Close">H5Gclose</a>
+    <li><a href="#Group-Move">H5Gmove</a> *
 </ul>
 </td><td>      </td>
 <td valign=top> 
 <ul>
-    <li><a href="#Group-Move">H5Gmove</a> *
     <li><a href="#Group-Move2">H5Gmove2</a> *
     <li><a href="#Group-Link">H5Glink</a> *
     <li><a href="#Group-Link2">H5Glink2</a> *
     <li><a href="#Group-Unlink">H5Gunlink</a> *
+    <li><a href="#Group-Flush">H5Gflush</a>
+    <li><a href="#Group-Refresh">H5Grefresh</a>
     <li><a href="#Group-SetComment">H5Gset_comment</a> *
     <li><a href="#Group-GetComment">H5Gget_comment</a> *
     <li><a href="#Group-GetInfo">H5Gget_info</a>
-    <li><a href="#Group-GetInfoByName">H5Gget_info_by_name</a>
 </ul>
 </td><td>      </td><td valign=top>
 <ul>
+    <li><a href="#Group-GetInfoByName">H5Gget_info_by_name</a>
     <li><a href="#Group-GetObjinfo">H5Gget_objinfo</a> *
     <li><a href="#Group-GetNumObjs">H5Gget_num_objs</a> *
     <li><a href="#Group-GetCreatePlist">H5Gget_create_plist</a>
@@ -149,6 +151,7 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Group-Create1">H5Gcreate1</a> *
       <li><a href="#Group-Create2">H5Gcreate2</a>
       <li><a href="#Group-CreateAnon">H5Gcreate_anon</a>
+      <li><a href="#Group-Flush">H5Gflush</a>
       <li><a href="#Group-GetComment">H5Gget_comment</a> *
       <li><a href="#Group-GetCreatePlist">H5Gget_create_plist</a>
       <li><a href="#Group-GetLinkval">H5Gget_linkval</a> *
@@ -181,6 +184,7 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Group-Open"><i>H5Gopen</i></a>
       <li><a href="#Group-Open1">H5Gopen1</a> *
       <li><a href="#Group-Open2">H5Gopen2</a>
+      <li><a href="#Group-Refresh">H5Grefresh</a>
       <li><a href="#Group-SetComment">H5Gset_comment</a> *
       <li><a href="#Group-Unlink">H5Gunlink</a> *
 	</ul>
@@ -261,6 +265,7 @@ as the corresponding C function.
 <?php include("H5G/H5Gcreate1.htm"); ?>
 <?php include("H5G/H5Gcreate2.htm"); ?>
 <?php include("H5G/H5Gcreate_anon.htm"); ?>
+<?php include("H5G/H5Gflush.htm"); ?>
 <?php include("H5G/H5Gget_comment.htm"); ?>
 <?php include("H5G/H5Gget_create_plist.htm"); ?>
 <?php include("H5G/H5Gget_info.htm"); ?>
@@ -279,6 +284,7 @@ as the corresponding C function.
 <?php include("H5G/H5Gopen.htm"); ?>
 <?php include("H5G/H5Gopen1.htm"); ?>
 <?php include("H5G/H5Gopen2.htm"); ?>
+<?php include("H5G/H5Grefresh.htm"); ?>
 <?php include("H5G/H5Gset_comment.htm"); ?>
 <?php include("H5G/H5Gunlink.htm"); ?>
 
@@ -346,7 +352,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 9 October 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5I.html b/html/RM/RM_H5I.html
index 6c73131..0d2cfb7 100644
--- a/html/RM/RM_H5I.html
+++ b/html/RM/RM_H5I.html
@@ -296,7 +296,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 18 September 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5L.html b/html/RM/RM_H5L.html
index f38df8c..6c0ec25 100644
--- a/html/RM/RM_H5L.html
+++ b/html/RM/RM_H5L.html
@@ -339,7 +339,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 26 September 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5O.html b/html/RM/RM_H5O.html
index 12c7ed0..575efcd 100644
--- a/html/RM/RM_H5O.html
+++ b/html/RM/RM_H5O.html
@@ -104,24 +104,29 @@ Links interface (H5L).
     <li><a href="#Object-Link">H5Olink</a> 
     <li><a href="#Object-Close">H5Oclose</a>
     <li><a href="#Object-Copy">H5Ocopy</a>
+    <li><a href="#Object-Visit">H5Ovisit</a>
+    <li><a href="#Object-VisitByName">H5Ovisit_by_name</a>
 </ul>
 </td><td>      </td><td valign=top> 
 <ul>
-    <li><a href="#Object-Visit">H5Ovisit</a>
-    <li><a href="#Object-VisitByName">H5Ovisit_by_name</a>
     <li><a href="#Object-SetComment">H5Oset_comment</a> *
     <li><a href="#Object-SetCommentByName">H5Oset_comment_by_name</a> *
     <li><a href="#Object-GetComment">H5Oget_comment</a>
     <li><a href="#Object-GetCommentByName">H5Oget_comment_by_name</a>
-</ul>
-</td><td>      </td><td valign=top>
-<ul>
     <li><a href="#Object-ExistsByName">H5Oexists_by_name</a>
     <li><a href="#Object-GetInfo">H5Oget_info</a>
     <li><a href="#Object-GetInfoByName">H5Oget_info_by_name</a>
     <li><a href="#Object-GetInfoByIdx">H5Oget_info_by_idx</a>
+</ul>
+</td><td>      </td><td valign=top>
+<ul>
     <li><a href="#Object-IncrRefCount">H5Oincr_refcount</a>
     <li><a href="#Object-DecrRefCount">H5Odecr_refcount</a>
+    <li><a href="#Object-Flush">H5Oflush</a>
+    <li><a href="#Object-Refresh">H5Orefresh</a>
+    <li><a href="#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a>
+    <li><a href="#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a>
+    <li><a href="#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a>
 </ul>
 </td></tr>
 <tr><td valign=top>
@@ -144,12 +149,13 @@ Links interface (H5L).
     <td valign="top">
       <ul>
       <li><a href="#Object-McdtSearchCb_t">H5O_mcdt_search_cb_t</a>
+      <li><a href="#Object-AreMdcFlushesDisabled">H5Oare_mdc_flushes_disabled</a>
       <li><a href="#Object-Close">H5Oclose</a>
       <li><a href="#Object-Copy">H5Ocopy</a>
       <li><a href="#Object-DecrRefCount">H5Odecr_refcount</a>
+      <li><a href="#Object-DisableMdcFlushes">H5Odisable_mdc_flushes</a>
+      <li><a href="#Object-EnableMdcFlushes">H5Oenable_mdc_flushes</a>
       <li><a href="#Object-ExistsByName">H5Oexists_by_name</a>
-      <li><a href="#Object-GetComment">H5Oget_comment</a>
-      <li><a href="#Object-GetCommentByName">H5Oget_comment_by_name</a>
       </ul>     
     </td> 
     
@@ -157,12 +163,14 @@ Links interface (H5L).
     
     <td valign="top">
       <ul>
+      <li><a href="#Object-Flush">H5Oflush</a>
+      <li><a href="#Object-GetComment">H5Oget_comment</a>
+      <li><a href="#Object-GetCommentByName">H5Oget_comment_by_name</a>
       <li><a href="#Object-GetInfo">H5Oget_info</a>
       <li><a href="#Object-GetInfoByIdx">H5Oget_info_by_idx</a>
       <li><a href="#Object-GetInfoByName">H5Oget_info_by_name</a>
       <li><a href="#Object-IncrRefCount">H5Oincr_refcount</a>
       <li><a href="#Object-Link">H5Olink</a> 
-      <li><a href="#Object-Open">H5Oopen</a>
       </ul>
     </td>
     
@@ -170,8 +178,10 @@ Links interface (H5L).
     
     <td valign="top">
       <ul>
+      <li><a href="#Object-Open">H5Oopen</a>
       <li><a href="#Object-OpenByAddr">H5Oopen_by_addr</a>
       <li><a href="#Object-OpenByIdx">H5Oopen_by_idx</a>
+      <li><a href="#Object-Refresh">H5Orefresh</a>
       <li><a href="#Object-SetComment">H5Oset_comment</a> *
       <li><a href="#Object-SetCommentByName">H5Oset_comment_by_name</a> *
       <li><a href="#Object-Visit">H5Ovisit</a>
@@ -259,10 +269,14 @@ as the corresponding C function.
 <!--       Include function files                            -->
 <!--  ---  ---  ---  ---  ---  ---  ---  ---  ---  ---  ---  -->
 
+<?php include("H5O/H5Oare_mdc_flushes_disabled.htm"); ?>
 <?php include("H5O/H5Oclose.htm"); ?>
 <?php include("H5O/H5Ocopy.htm"); ?>
 <?php include("H5O/H5Odecr_refcount.htm"); ?>
+<?php include("H5O/H5Odisable_mdc_flushes.htm"); ?>
+<?php include("H5O/H5Oenable_mdc_flushes.htm"); ?>
 <?php include("H5O/H5Oexists_by_name.htm"); ?>
+<?php include("H5O/H5Oflush.htm"); ?>
 <?php include("H5O/H5Oget_comment.htm"); ?>
 <?php include("H5O/H5Oget_comment_by_name.htm"); ?>
 <?php include("H5O/H5Oget_info.htm"); ?>
@@ -273,6 +287,7 @@ as the corresponding C function.
 <?php include("H5O/H5Oopen.htm"); ?>
 <?php include("H5O/H5Oopen_by_addr.htm"); ?>
 <?php include("H5O/H5Oopen_by_idx.htm"); ?>
+<?php include("H5O/H5Orefresh.htm"); ?>
 <?php include("H5O/H5Oset_comment.htm"); ?>
 <?php include("H5O/H5Oset_comment_by_name.htm"); ?>
 <?php include("H5O/H5Ovisit.htm"); ?>
@@ -344,7 +359,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 11 May 2015");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5P.html b/html/RM/RM_H5P.html
index fb26f81..2d20170 100644
--- a/html/RM/RM_H5P.html
+++ b/html/RM/RM_H5P.html
@@ -230,8 +230,11 @@ Symbolic notation in the following index is interpreted as follows:
       Attribute Operations:
       <br>
       <a href="#AttributeCreatePropFuncs">Attribute Creation Properties</a>
+      <br> 
+      <br>
+      Access Operations:
       <br>
-      <a href="#AttributeAccessPropFuncs">Attribute Access Properties</a>
+      <a href="#AccessPropFuncs">Access Properties</a>
       <br> 
       <br>
       Advanced Usage:
@@ -295,19 +298,25 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetSizes">H5Pset_sizes</a>
     <br />
     <a href="#Property-GetSizes">H5Pget_sizes</a>
-    </td>
-<td width="32%" align="left" valign="top">
+    <br />
     <a href="#Property-SetSymK">H5Pset_sym_k</a>
     <br />
     <a href="#Property-GetSymK">H5Pget_sym_k</a>
-    <br />
+    </td>
+<td width="32%" align="left" valign="top">
     <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>
+    <a href="#Property-SetFileSpacePageSize">H5Pset_file_space_page_size</a>
+    <br />
+    <a href="#Property-GetFileSpacePageSize">H5Pget_file_space_page_size</a>
+    <br />
+    <a href="#Property-SetFileSpaceStrategy">H5Pset_file_space_strategy</a>
     <br />
-    <a href="#Property-GetFileSpace">H5Pget_file_space</a>
+    <a href="#Property-GetFileSpaceStrategy">H5Pget_file_space_strategy</a>
+    <br />
+    
     </td>
 <td width="32%" align="left" valign="top">
     <a href="#Property-SetSharedMesgNIndexes">H5Pset_shared_mesg_nindexes</a>
@@ -370,8 +379,7 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetFaplMpio">H5Pset_fapl_mpio</a>   ||
     <br />
     <a href="#Property-GetFaplMpio">H5Pget_fapl_mpio</a>   ||
-    </td>
-<td width="32%" align="left" valign="top">
+    <br />
     <a href="#Property-SetFaplMpiPosix">H5Pset_fapl_mpiposix</a>   ||
     <br />
     <a href="#Property-GetFaplMpiPosix">H5Pget_fapl_mpiposix</a>   ||
@@ -379,7 +387,8 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetFaplMulti">H5Pset_fapl_multi</a>
     <br />
     <a href="#Property-GetFaplMulti">H5Pget_fapl_multi</a>
-    <br />
+    </td>
+<td width="32%" align="left" valign="top">
     <a href="#Property-SetMultiType">H5Pset_multi_type</a>
     <br />
     <a href="#Property-GetMultiType">H5Pget_multi_type</a>
@@ -410,11 +419,14 @@ Symbolic notation in the following index is interpreted as follows:
     <br />
     <a href="#Property-GetMetaBlockSize">H5Pget_meta_block_size</a>
     <br />
+    <a href="#Property-SetPageBufferSize">H5Pset_page_buffer_size</a>
+    <br />
+    <a href="#Property-GetPageBufferSize">H5Pget_page_buffer_size</a>
+    <br />
     <a href="#Property-SetSieveBufSize">H5Pset_sieve_buf_size</a>
     <br />
     <a href="#Property-GetSieveBufSize">H5Pget_sieve_buf_size</a>
-    </td>
-<td width="32%" align="left" valign="top">
+    <br />
     <a href="#Property-SetAlignment">H5Pset_alignment</a>
     <br />
     <a href="#Property-GetAlignment">H5Pget_alignment</a>
@@ -426,11 +438,28 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetELinkFileCacheSize">H5Pset_elink_file_cache_size</a>
     <br />
     <a href="#Property-GetELinkFileCacheSize">H5Pget_elink_file_cache_size</a>
+    </td>
+<td width="32%" align="left" valign="top">
+    <a href="#Property-SetEvictOnClose">H5Pset_evict_on_close</a>
+    <br />
+    <a href="#Property-GetEvictOnClose">H5Pget_evict_on_close</a>
+    <br />
+    <a href="#Property-SetMetadataReadAttempts">H5Pset_metadata_read_attempts</a>
+    <br />
+    <a href="#Property-GetMetadataReadAttempts">H5Pget_metadata_read_attempts</a>
     <br />
     <a href="#Property-SetMdcConfig">H5Pset_mdc_config</a>
     <br />
     <a href="#Property-GetMdcConfig">H5Pget_mdc_config</a>
     <br />
+    <a href="#Property-SetMDCImageConfig">H5Pset_mdc_image_config</a>
+    <br />
+    <a href="#Property-GetMDCImageConfig">H5Pget_mdc_image_config</a>
+    <br />
+    <a href="#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a>
+    <br />
+    <a href="#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a>
+    <br />
     <a href="#Property-SetAllCollMetadataOps">H5Pset_all_coll_metadata_ops</a>
     <br />
     <a href="#Property-GetAllCollMetadataOps">H5Pget_all_coll_metadata_ops</a>
@@ -450,6 +479,10 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetLibverBounds">H5Pset_libver_bounds</a>
     <br />
     <a href="#Property-GetLibverBounds">H5Pget_libver_bounds</a>
+    <br />
+    <a href="#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a>
+    <br />
+    <a href="#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a>
     </td></tr>
 </table>
 
@@ -499,6 +532,7 @@ Symbolic notation in the following index is interpreted as follows:
     </td>
 <td width="32%" align="left" valign="top">
     <a href="#Property-GetAllCollMetadataOps">H5Pget_all_coll_metadata_ops</a>
+     
     </td>
 <td width="32%" align="left" valign="top">
      
@@ -588,6 +622,10 @@ Symbolic notation in the following index is interpreted as follows:
     <br />
     <a href="#Property-GetChunk">H5Pget_chunk</a>
     <br />
+    <a href="#Property-SetChunkOpts">H5Pset_chunk_opts</a>
+    <br />
+    <a href="#Property-GetChunkOpts">H5Pget_chunk_opts</a>
+    <br />
     <a href="#Property-SetDeflate">H5Pset_deflate</a>
 <!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
 <!--
@@ -615,10 +653,10 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-GetFillTime">H5Pget_fill_time</a>
     <br />
     <a href="#Property-SetAllocTime">H5Pset_alloc_time</a>
-    <br />
-    <a href="#Property-GetAllocTime">H5Pget_alloc_time</a>
     </td>
 <td width="32%" align="left" valign="top">
+    <a href="#Property-GetAllocTime">H5Pget_alloc_time</a>
+    <br />
     <a href="#Property-SetFilter">H5Pset_filter</a>
     <br />
     <a href="#Property-AllFiltersAvail">H5Pall_filters_avail</a>
@@ -644,10 +682,10 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-RemoveFilter">H5Premove_filter</a>
     <br />
     <a href="#Property-SetFletcher32">H5Pset_fletcher32</a>
-    <br />
-    <a href="#Property-SetNbit">H5Pset_nbit</a>
     </td>
 <td width="32%" align="left" valign="top">
+    <a href="#Property-SetNbit">H5Pset_nbit</a>
+    <br />
     <a href="#Property-SetScaleoffset">H5Pset_scaleoffset</a>
     <br />
     <a href="#Property-SetShuffle">H5Pset_shuffle</a>
@@ -699,6 +737,10 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetEfilePrefix">H5Pset_efile_prefix</a>
     <br />
     <a href="#Property-GetEfilePrefix">H5Pget_efile_prefix</a>
+    <br />
+    <a href="#Property-SetAppendFlush">H5Pset_append_flush</a>
+    <br />
+    <a href="#Property-GetAppendFlush">H5Pget_append_flush</a>
     </td>
 <td width="32%" align="left" valign="top">
     <a href="#Property-SetVirtualView">H5Pset_virtual_view</a>
@@ -907,17 +949,18 @@ Symbolic notation in the following index is interpreted as follows:
 <table width="100%" border="0">
 <tr><td colspan="4" align="left" valign="top">
     <hr color="green" size="1" />
-    <a name="AttributeAccessPropFuncs">
-    <i>Attribute Access Properties</i>
+    <a name="AccessPropFuncs">
+    <i>Access Properties</i>
     </a>
     </td></tr>
 <tr>
 <td width="4%" valign=top> </td>
 <td width="32%" align="left" valign="top">
     <a href="#Property-SetAllCollMetadataOps">H5Pset_all_coll_metadata_ops</a>
+    <br />
+    <a href="#Property-GetAllCollMetadataOps">H5Pget_all_coll_metadata_ops</a>
     </td>
 <td width="32%" align="left" valign="top">
-    <a href="#Property-GetAllCollMetadataOps">H5Pget_all_coll_metadata_ops</a>
     </td>
 <td width="32%" align="left" valign="top">
      
@@ -1818,6 +1861,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetAllocTime">H5Pget_alloc_time</a>
       <br />
+      <a href="#Property-GetAppendFlush">H5Pget_append_flush</a>
+      <br />
       <a href="#Property-GetAttrCreationOrder">H5Pget_attr_creation_order</a>
       <br />
       <a href="#Property-GetAttrPhaseChange">H5Pget_attr_phase_change</a>
@@ -1834,6 +1879,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetChunkCache">H5Pget_chunk_cache</a>
       <br />
+      <a href="#Property-GetChunkOpts">H5Pget_chunk_opts</a>
+      <br />
       <a href="#Property-GetClass">H5Pget_class</a>
       <br />
       <a href="#Property-GetClassName">H5Pget_class_name</a>
@@ -1876,6 +1923,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetExternalCount">H5Pget_external_count</a>
       <br />
+      <a href="#Property-GetEvictOnClose">H5Pget_evict_on_close</a>
+      <br />
       <a href="#Property-GetFamilyOffset">H5Pget_family_offset</a>
       <br />
       <a href="#Property-GetFaplCore">H5Pget_fapl_core</a>
@@ -1902,7 +1951,9 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetFileImageCallbacks">H5Pget_file_image_callbacks</a>
       <br />
-      <a href="#Property-GetFileSpace">H5Pget_file_space</a>
+      <a href="#Property-GetFileSpacePageSize">H5Pget_file_space_page_size</a>
+      <br />
+      <a href="#Property-GetFileSpaceStrategy">H5Pget_file_space_strategy</a>
       <br />
       <a href="#Property-GetFillTime">H5Pget_fill_time</a>
       <br />
@@ -1925,13 +1976,13 @@ See further notes in the description of each function.
       <a href="#Property-GetGCReferences">H5Pget_gc_references</a>
       <br />
       <a href="#Property-GetHyperVectorSize">H5Pget_hyper_vector_size</a>
+      <br />
+      <a href="#Property-GetIstoreK">H5Pget_istore_k</a>
     </td>
 
     <td>   </td>
 
     <td valign="top">
-      <a href="#Property-GetIstoreK">H5Pget_istore_k</a>
-      <br />
       <a href="#Property-GetLayout">H5Pget_layout</a>
       <br />
       <a href="#Property-GetLibverBounds">H5Pget_libver_bounds</a>
@@ -1946,8 +1997,14 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetMdcConfig">H5Pget_mdc_config</a>
       <br />
+      <a href="#Property-GetMDCImageConfig">H5Pget_mdc_image_config</a>
+      <br />
+      <a href="#Property-GetMdcLogOptions">H5Pget_mdc_log_options</a>
+      <br />
       <a href="#Property-GetMetaBlockSize">H5Pget_meta_block_size</a>
       <br />
+      <a href="#Property-GetMetadataReadAttempts">H5Pget_metadata_read_attempts</a>
+      <br />
       <a href="#Property-GetMpioActualChunkOptMode">H5Pget_mpio_actual_chunk_opt_mode</a>   ||
       <br />
       <a href="#Property-GetMpioActualIoMode">H5Pget_mpio_actual_io_mode</a>   ||
@@ -1962,11 +2019,15 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-GetNProps">H5Pget_nprops</a>
       <br />
+      <a href="#Property-GetPageBufferSize">H5Pget_page_buffer_size</a>
+      <br />
       <a href="#Property-GetPreserve">H5Pget_preserve</a>
            *
       <br />
       <a href="#Property-GetObjTrackTimes">H5Pget_obj_track_times</a>
       <br />
+      <a href="#Property-GetObjectFlushCb">H5Pget_object_flush_cb</a>
+      <br />
       <a href="#Property-GetSharedMesgIndex">H5Pget_shared_mesg_index</a>
       <br />
       <a href="#Property-GetSharedMesgNIndexes">H5Pget_shared_mesg_nindexes</a>
@@ -2037,6 +2098,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-SetAllocTime">H5Pset_alloc_time</a>
       <br />
+      <a href="#Property-SetAppendFlush">H5Pset_append_flush</a>
+      <br />
       <a href="#Property-SetAttrCreationOrder">H5Pset_attr_creation_order</a>
       <br />
       <a href="#Property-SetAttrPhaseChange">H5Pset_attr_phase_change</a>
@@ -2053,6 +2116,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-SetChunkCache">H5Pset_chunk_cache</a>
       <br />
+      <a href="#Property-SetChunkOpts">H5Pset_chunk_opts</a>
+      <br />
       <a href="#Property-SetCollMetadataWrite">H5Pset_coll_metadata_write</a>
       <br />
       <a href="#Property-SetCopyObject">H5Pset_copy_object</a>
@@ -2099,6 +2164,8 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-SetExternal">H5Pset_external</a>
       <br />
+      <a href="#Property-SetEvictOnClose">H5Pset_evict_on_close</a>
+      <br />
       <a href="#Property-SetFamilyOffset">H5Pset_family_offset</a>
       <br />
       <a href="#Property-SetFaplCore">H5Pset_fapl_core</a>
@@ -2135,7 +2202,9 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-SetFileImageCallbacks">H5Pset_file_image_callbacks</a>
       <br />
-      <a href="#Property-SetFileSpace">H5Pset_file_space</a>
+      <a href="#Property-SetFileSpacePageSize">H5Pset_file_space_page_size</a>
+      <br />
+      <a href="#Property-SetFileSpaceStrategy">H5Pset_file_space_strategy</a>
       <br />
       <a href="#Property-SetFillTime">H5Pset_fill_time</a>
       <br />
@@ -2167,19 +2236,29 @@ See further notes in the description of each function.
       <br />
       <a href="#Property-SetMdcConfig">H5Pset_mdc_config</a>
       <br />
+      <a href="#Property-SetMDCImageConfig">H5Pset_mdc_image_config</a>
+      <br />
+      <a href="#Property-SetMdcLogOptions">H5Pset_mdc_log_options</a>
+      <br />
       <a href="#Property-SetMetaBlockSize">H5Pset_meta_block_size</a>
       <br />
+      <a href="#Property-SetMetadataReadAttempts">H5Pset_metadata_read_attempts</a>
+      <br />
       <a href="#Property-SetMultiType">H5Pset_multi_type</a>
       <br />
       <a href="#Property-SetNbit">H5Pset_nbit</a>
       <br />
       <a href="#Property-SetNLinks">H5Pset_nlinks</a>
       <br />
+      <a href="#Property-SetPageBufferSize">H5Pset_page_buffer_size</a>
+      <br />
       <a href="#Property-SetPreserve">H5Pset_preserve</a>
            *
       <br />
       <a href="#Property-SetObjTrackTimes">H5Pset_obj_track_times</a>
       <br />
+      <a href="#Property-SetObjectFlushCb">H5Pset_object_flush_cb</a>
+      <br />
       <a href="#Property-SetScaleoffset">H5Pset_scaleoffset</a>
       <br />
       <a href="#Property-SetSharedMesgIndex">H5Pset_shared_mesg_index</a>
@@ -2564,8 +2643,11 @@ See further notes in the description of each function.
       Attribute Operations:
       <br>
       <a href="#AttributeCreatePropFuncs_f">Attribute Creation Properties</a>
+      <br> 
+      <br>
+      Access Operatons:
       <br>
-      <a href="#AttributeAccessPropFuncs_f">Attribute Access Properties</a>
+      <a href="#AccessPropFuncs_f">Access Properties</a>
       <br> 
       <br>
       Advanced Usage:
@@ -3187,8 +3269,8 @@ See further notes in the description of each function.
 <table width="100%" border="0">
 <tr><td colspan="4" align="left" valign="top">
     <hr color="green" size="1" />
-    <a name="AttributeAccessPropFuncs">
-    <i>Attribute Access Properties</i>
+    <a name="AccessPropFuncs_f">
+    <i>Access Properties</i>
     </a>
     </td></tr>
 <tr>
@@ -3599,6 +3681,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_alignment.htm"); ?>
 <?php include("H5P/H5Pget_all_coll_metadata_ops.htm"); ?>
 <?php include("H5P/H5Pget_alloc_time.htm"); ?>
+<?php include("H5P/H5Pget_append_flush.htm"); ?>
 <?php include("H5P/H5Pget_attr_creation_order.htm"); ?>
 <?php include("H5P/H5Pget_attr_phase_change.htm"); ?>
 <?php include("H5P/H5Pget_btree_ratios.htm"); ?>
@@ -3607,6 +3690,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_char_encoding.htm"); ?>
 <?php include("H5P/H5Pget_chunk.htm"); ?>
 <?php include("H5P/H5Pget_chunk_cache.htm"); ?>
+<?php include("H5P/H5Pget_chunk_opts.htm"); ?>
 <?php include("H5P/H5Pget_class.htm"); ?>
 <?php include("H5P/H5Pget_class_name.htm"); ?>
 <?php include("H5P/H5Pget_class_parent.htm"); ?>
@@ -3629,6 +3713,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_est_link_info.htm"); ?>
 <?php include("H5P/H5Pget_external.htm"); ?>
 <?php include("H5P/H5Pget_external_count.htm"); ?>
+<?php include("H5P/H5Pget_evict_on_close.htm"); ?>
 <?php include("H5P/H5Pget_family_offset.htm"); ?>
 <?php include("H5P/H5Pget_fapl_core.htm"); ?>
 <?php include("H5P/H5Pget_fapl_direct.htm"); ?>
@@ -3640,7 +3725,8 @@ 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_page_size.htm"); ?>
+<?php include("H5P/H5Pget_file_space_strategy.htm"); ?>
 <?php include("H5P/H5Pget_fill_time.htm"); ?>
 <?php include("H5P/H5Pget_fill_value.htm"); ?>
 <?php include("H5P/H5Pget_filter.htm"); ?>
@@ -3659,7 +3745,10 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_local_heap_size_hint.htm"); ?>
 <?php include("H5P/H5Pget_mcdt_search_cb.htm"); ?>
 <?php include("H5P/H5Pget_mdc_config.htm"); ?>
+<?php include("H5P/H5Pget_mdc_image_config.htm"); ?>
+<?php include("H5P/H5Pget_mdc_log_options.htm"); ?>
 <?php include("H5P/H5Pget_meta_block_size.htm"); ?>
+<?php include("H5P/H5Pget_metadata_read_attempts.htm"); ?>
 <?php include("H5P/H5Pget_mpio_actual_chunk_opt_mode.htm"); ?>
 <?php include("H5P/H5Pget_mpio_actual_io_mode.htm"); ?>
 <?php include("H5P/H5Pget_mpio_no_collective_cause.htm"); ?>
@@ -3667,8 +3756,10 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_nfilters.htm"); ?>
 <?php include("H5P/H5Pget_nlinks.htm"); ?>
 <?php include("H5P/H5Pget_nprops.htm"); ?>
+<?php include("H5P/H5Pget_page_buffer_size.htm"); ?>
 <?php include("H5P/H5Pget_preserve.htm"); ?>
 <?php include("H5P/H5Pget_obj_track_time.htm"); ?>
+<?php include("H5P/H5Pget_object_flush_cb.htm"); ?>
 <?php include("H5P/H5Pget_shared_mesg_index.htm"); ?>
 <?php include("H5P/H5Pget_shared_mesg_nindexes.htm"); ?>
 <?php include("H5P/H5Pget_shared_mesg_phase_change.htm"); ?>
@@ -3703,6 +3794,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pset_alignment.htm"); ?>
 <?php include("H5P/H5Pset_all_coll_metadata_ops.htm"); ?>
 <?php include("H5P/H5Pset_alloc_time.htm"); ?>
+<?php include("H5P/H5Pset_append_flush.htm"); ?>
 <?php include("H5P/H5Pset_attr_creation_order.htm"); ?>
 <?php include("H5P/H5Pset_attr_phase_change.htm"); ?>
 <?php include("H5P/H5Pset_btree_ratios.htm"); ?>
@@ -3711,6 +3803,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pset_char_encoding.htm"); ?>
 <?php include("H5P/H5Pset_chunk.htm"); ?>
 <?php include("H5P/H5Pset_chunk_cache.htm"); ?>
+<?php include("H5P/H5Pset_chunk_opts.htm"); ?>
 <?php include("H5P/H5Pset_coll_metadata_write.htm"); ?>
 <?php include("H5P/H5Pset_copy_object.htm"); ?>
 <?php include("H5P/H5Pset_core_write_tracking.htm"); ?>
@@ -3733,6 +3826,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pset_elink_prefix.htm"); ?>
 <?php include("H5P/H5Pset_est_link_info.htm"); ?>
 <?php include("H5P/H5Pset_external.htm"); ?>
+<?php include("H5P/H5Pset_evict_on_close.htm"); ?>
 <?php include("H5P/H5Pset_family_offset.htm"); ?>
 <?php include("H5P/H5Pset_fapl_core.htm"); ?>
 <?php include("H5P/H5Pset_fapl_direct.htm"); ?>
@@ -3749,7 +3843,8 @@ 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_page_size.htm"); ?>
+<?php include("H5P/H5Pset_file_space_strategy.htm"); ?>
 <?php include("H5P/H5Pset_fill_time.htm"); ?>
 <?php include("H5P/H5Pset_fill_value.htm"); ?>
 <?php include("H5P/H5Pset_filter.htm"); ?>
@@ -3765,12 +3860,17 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pset_local_heap_size_hint.htm"); ?>
 <?php include("H5P/H5Pset_mcdt_search_cb.htm"); ?>
 <?php include("H5P/H5Pset_mdc_config.htm"); ?>
+<?php include("H5P/H5Pset_mdc_image_config.htm"); ?>
+<?php include("H5P/H5Pset_mdc_log_options.htm"); ?>
 <?php include("H5P/H5Pset_meta_block_size.htm"); ?>
+<?php include("H5P/H5Pset_metadata_read_attempts.htm"); ?>
 <?php include("H5P/H5Pset_multi_type.htm"); ?>
 <?php include("H5P/H5Pset_nbit.htm"); ?>
 <?php include("H5P/H5Pset_nlinks.htm"); ?>
+<?php include("H5P/H5Pset_page_buffer_size.htm"); ?>
 <?php include("H5P/H5Pset_preserve.htm"); ?>
 <?php include("H5P/H5Pset_obj_track_time.htm"); ?>
+<?php include("H5P/H5Pset_object_flush_cb.htm"); ?>
 <?php include("H5P/H5Pset_scaleoffset.htm"); ?>
 <?php include("H5P/H5Pset_shared_mesg_index.htm"); ?>
 <?php include("H5P/H5Pset_shared_mesg_nindexes.htm"); ?>
@@ -3853,7 +3953,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 27 April 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/RM_H5PL.html b/html/RM/RM_H5PL.html
index da01142..2c86058 100644
--- a/html/RM/RM_H5PL.html
+++ b/html/RM/RM_H5PL.html
@@ -273,7 +273,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 2 September 2015");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT> 
 
diff --git a/html/RM/RM_H5R.html b/html/RM/RM_H5R.html
index 67b8d25..c502dec 100644
--- a/html/RM/RM_H5R.html
+++ b/html/RM/RM_H5R.html
@@ -273,7 +273,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 4 March 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT> 
 
diff --git a/html/RM/RM_H5S.html b/html/RM/RM_H5S.html
index 78144f3..af1d900 100644
--- a/html/RM/RM_H5S.html
+++ b/html/RM/RM_H5S.html
@@ -367,7 +367,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 27 April 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT> 
 
diff --git a/html/RM/RM_H5T.html b/html/RM/RM_H5T.html
index 223a1a6..f51f496 100644
--- a/html/RM/RM_H5T.html
+++ b/html/RM/RM_H5T.html
@@ -111,9 +111,12 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#Datatype-Commit2">H5Tcommit2</a>
     <li><a href="#Datatype-CommitAnon">H5Tcommit_anon</a>
     <li><a href="#Datatype-Committed">H5Tcommitted</a>
+    <li><a href="#Datatype-Close">H5Tclose</a>
     <li><a href="#Datatype-Copy">H5Tcopy</a>
     <li><a href="#Datatype-Equal">H5Tequal</a>
     <li><a href="#Datatype-Lock">H5Tlock</a>
+    <li><a href="#Datatype-Flush">H5Tflush</a>
+    <li><a href="#Datatype-Refresh">H5Trefresh</a>
     <li><a href="#Datatype-GetClass">H5Tget_class</a>
     <li><a href="#Datatype-GetCreatePlist">H5Tget_create_plist</a>
     <li><a href="#Datatype-SetSize">H5Tset_size</a>
@@ -121,7 +124,6 @@ In the following lists, italic type indicates a configurable macro.
     <li><a href="#Datatype-GetSuper">H5Tget_super</a>
     <li><a href="#Datatype-GetNativeType">H5Tget_native_type</a>
     <li><a href="#Datatype-DetectClass">H5Tdetect_class</a>
-    <li><a href="#Datatype-Close">H5Tclose</a>
 <br><br>
 <i>Conversion Functions</i>
     <li><a href="#Datatype-Convert">H5Tconvert</a>
@@ -239,15 +241,16 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Datatype-EnumValueOf">H5Tenum_valueof</a>
       <li><a href="#Datatype-Equal">H5Tequal</a>
       <li><a href="#Datatype-Find">H5Tfind</a>
+      <li><a href="#Datatype-Flush">H5Tflush</a>
       <li><a href="#Datatype-GetArrayDims"><i>H5Tget_array_dims</i></a>
       <li><a href="#Datatype-GetArrayDims1">H5Tget_array_dims1</a>
            *
-      <li><a href="#Datatype-GetArrayDims2">H5Tget_array_dims2</a>
     </td>
     
     <td width=3%>      </td>
     
     <td valign="top" width=30%>
+      <li><a href="#Datatype-GetArrayDims2">H5Tget_array_dims2</a>
       <li><a href="#Datatype-GetArrayNdims">H5Tget_array_ndims</a>
       <li><a href="#Datatype-GetClass">H5Tget_class</a>
       <li><a href="#Datatype-GetCreatePlist">H5Tget_create_plist</a>
@@ -272,12 +275,12 @@ In the following lists, italic type indicates a configurable macro.
       <li><a href="#Datatype-GetSize">H5Tget_size</a>
       <li><a href="#Datatype-GetStrpad">H5Tget_strpad</a>
       <li><a href="#Datatype-GetSuper">H5Tget_super</a>
-      <li><a href="#Datatype-GetTag">H5Tget_tag</a>
     </td>
     
     <td width=3%>      </td>
     
     <td valign="top">
+      <li><a href="#Datatype-GetTag">H5Tget_tag</a>
       <li><a href="#Datatype-Insert">H5Tinsert</a>
       <li><a href="#Datatype-IsVariableString">H5Tis_variable_str</a>     
       <li><a href="#Datatype-Lock">H5Tlock</a>
@@ -286,6 +289,7 @@ In the following lists, italic type indicates a configurable macro.
            *
       <li><a href="#Datatype-Open2">H5Topen2</a>
       <li><a href="#Datatype-Pack">H5Tpack</a>
+      <li><a href="#Datatype-Refresh">H5Trefresh</a>
       <li><a href="#Datatype-Register">H5Tregister</a>
       <li><a href="#Datatype-SetCset">H5Tset_cset</a>
       <li><a href="#Datatype-SetEbias">H5Tset_ebias</a>
@@ -472,6 +476,7 @@ in the <cite>HDF5 User’s Guide</cite> for more information.
 <?php include("H5T/H5Tenum_valueof.htm"); ?>
 <?php include("H5T/H5Tequal.htm"); ?>
 <?php include("H5T/H5Tfind.htm"); ?>
+<?php include("H5T/H5Tflush.htm"); ?>
 <?php include("H5T/H5Tget_array_dims.htm"); ?>
 <?php include("H5T/H5Tget_array_dims1.htm"); ?>
 <?php include("H5T/H5Tget_array_dims2.htm"); ?>
@@ -507,6 +512,7 @@ in the <cite>HDF5 User’s Guide</cite> for more information.
 <?php include("H5T/H5Topen1.htm"); ?>
 <?php include("H5T/H5Topen2.htm"); ?>
 <?php include("H5T/H5Tpack.htm"); ?>
+<?php include("H5T/H5Trefresh.htm"); ?>
 <?php include("H5T/H5Tregister.htm"); ?>
 <?php include("H5T/H5Tset_cset.htm"); ?>
 <?php include("H5T/H5Tset_ebias.htm"); ?>
@@ -588,7 +594,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 14 October 2014");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/RM_H5Z.html b/html/RM/RM_H5Z.html
index 35db2af..cbd130a 100644
--- a/html/RM/RM_H5Z.html
+++ b/html/RM/RM_H5Z.html
@@ -288,7 +288,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 2 July 2013");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
  
diff --git a/html/RM/Tools.html b/html/RM/Tools.html
index 0a09cf0..4e27d72 100644
--- a/html/RM/Tools.html
+++ b/html/RM/Tools.html
@@ -141,6 +141,12 @@ installed with HDF5.
         <li><a href="#Tools-Clear">h5clear</a> -- 
             Clears the file consistency flags field in the superblock 
             of a file.
+        <li><a href="#Tools-Watch">h5watch</a> -- 
+            Outputs new records appended to a dataset as the dataset grows.
+        <li><a href="#Tools-FormatConvert">h5format_convert</a> -- 
+            Converts format of certain datasets created with 
+            HDF5 Release 1.10.0 or later so that applications built with 
+            HDF5 Release 1.8.x can access these datasets.
     <br><br>
     </ul>
 
@@ -270,6 +276,8 @@ installed with HDF5.
 <?php include("Tools/h5perf.htm"); ?>
 <?php include("Tools/h5perf_serial.htm"); ?>
 <?php include("Tools/h5clear.htm"); ?>
+<?php include("Tools/h5watch.htm"); ?>
+<?php include("Tools/h5format_convert.htm"); ?>
 <?php include("Tools/h5redeploy.htm"); ?>
 <?php include("Tools/h5cc_and_h5pcc.htm"); ?>
 <?php include("Tools/h5fc_and_h5pfc.htm"); ?>
@@ -344,7 +352,7 @@ In the
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 5 May 2016");
+document.writeln("Last modified: February 2017");
 -->
 </SCRIPT>
 
diff --git a/html/RM/Tools/h5clear.htm b/html/RM/Tools/h5clear.htm
index b9d3e52..ee8c953 100644
--- a/html/RM/Tools/h5clear.htm
+++ b/html/RM/Tools/h5clear.htm
@@ -37,18 +37,23 @@
     <dd><code>h5clear </code>[<code>-h </code>|<code> --help</code>]
     <dd><code>h5clear </code>[<code>-V </code>|<code> --version</code>]
 -->
-    <dd><code>h5clear <em>file</em></code></dd>
+    <dd><code>h5clear [<em>OPTIONS</em>] <em>file</em></code></dd>
 
     <br />
 <dt><strong>Purpose:</strong></dt>
-    <dd>To clear the <em>file consistency flags</em> field in the 
-    superblock of the <em>file</em> specified in the command line.</dd>
+    <dd>To clear the <code>status_flags</code>  field in the 
+    superblock of the file specified in the command line or to
+    remove the metadata cache image from the file.<dd>
 
     <br />
     
     <dt><strong>Description:</strong></dt>
-    <dd>With the implementation of file locking, the library uses the
-    <em>file consistency flags</em> field in the superblock to mark a 
+    <dd>The <code>h5clear</code> tool can either clear the
+    <code>status_flags</code> field in the superblock of the file or close
+    a metadata cache image in the specified file.
+    <p>
+    With the implementation of file locking, the library uses the
+    <code>status_flags</code> field in the superblock to mark a 
     file as in writing or SWMR writing mode when a file is opened. 
     The library will clear this field when the file closes. 
     <br />
@@ -58,11 +63,42 @@
     and this field will not be cleared as a result. An example would 
     be if an application program crashed. This situation will prevent 
     a user from opening the file. The <code>h5clear</code> tool will 
-    clear the <em>file consistency flags</em> field, and the user can 
+    clear the <code>status_flags</code> field, and the user can 
     then open the file.
+    <p>
+    When used to close a metadata cache image, <code>h5clear</code> will 
+    open the supplied HDF5 file in Read-Write (R/W) mode, check to see 
+    if it contains a cache image, and then close it.  If the file does
+    not contain a cache image, <code>h5clear</code> will generate a warning message 
+    to that effect.
     </dd>
+    <dd> 
+
     <br />
     
+<dt><strong>File Options:</strong></dt>
+    <dd><table border="0">
+        <tr valign="top" align="left">
+            <td><code>-h, --help</code></td>
+            <td>Print a usage message and exit</td>
+        </tr>
+        <tr valign="top" align="left">
+            <td><code>-V, --version</code></td>
+            <td>Print version number and exit</td>
+        </tr>
+        <tr valign="top" align="left">
+            <td><code>-s, --status</code></td>
+            <td>Clear the <code>status_flags</code> field in the file's superblock</td>
+        </tr>
+        <tr valign="top" align="left">
+            <td><code>-m, --image</code></td>
+            <td>Remove the metadata cache image from the file</td>
+        </tr>
+    </table></dd>
+
+
+
+
 <dt><strong>Exit Status:</strong></dt>
     <dd><table border="0">
         <tr valign="top" align="left">
@@ -84,6 +120,10 @@
           <td valign="top" align="left" width="90%">
             <strong>Change</strong></td></tr>
         <tr>
+          <td valign="top">1.10.1</td>
+          <td valign="top">
+            <code>-m</code>, <code>--image</code>  option added to remove the metadata cache image.</td></tr>
+            </td></tr>
           <td valign="top">1.10.0</td>
           <td valign="top">
             Tool introduced in this release.</td></tr>
diff --git a/html/RM/Tools/h5dump.htm b/html/RM/Tools/h5dump.htm
index 56504da..70a3af1 100644
--- a/html/RM/Tools/h5dump.htm
+++ b/html/RM/Tools/h5dump.htm
@@ -1047,6 +1047,14 @@
        <td valign="top" align="left">
          <strong>Change</strong>
       </td></tr>
+
+      <tr>
+        <td valign="top">1.10.1</td>
+        <td valign="top">
+           File space information (strategy, persist, threshold, page size) was added when printing the contents of the 
+           superblock with the <code>-B</code> option. 
+       </td></tr>
+           
       <tr>
         <td valign="top">1.8.12</td>
         <td valign="top">
diff --git a/html/RM/Tools/h5format_convert.htm b/html/RM/Tools/h5format_convert.htm
index 3879a94..d95446a 100644
--- a/html/RM/Tools/h5format_convert.htm
+++ b/html/RM/Tools/h5format_convert.htm
@@ -26,7 +26,7 @@
 <dl>
 
 <dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 4 May 2016
+    Last modified: 26 May 2016
     </i></font></div></dt>
 
   <dt><strong>Tool Name:</strong> 
@@ -160,7 +160,7 @@
     <dd><a href="https://www.hdfgroup.org/HDF5/doc/RM/Tools.html#Tools-FormatConvert">
         <code>h5format_convert</code></a></dd>    
     -->
-    <dd><a href="https://www.hdfgroup.org/HDF5/doc/H5.format.html">
+    <dd><a href="../H5.format.html">
         <em>HDF5 File Format Specification</em></a></dd>
     <br />
 
diff --git a/html/RM/Tools/h5repack.htm b/html/RM/Tools/h5repack.htm
index 59e6c1b..67e5b82 100644
--- a/html/RM/Tools/h5repack.htm
+++ b/html/RM/Tools/h5repack.htm
@@ -322,34 +322,50 @@
                 This file contains only the filter and layout flags.
             <p>
 
+
+        <dt><code>-G</code> <em>fs_pagesize</em>
+              or 
+            <code>--fs_pagesize</code>=<em>fs_page_size</em>
+            <dd>File space page size in bytes (see <code>H5Pset_file_space_page_size</code>). 
+            <br>
+            <em>fs_pagesize</em> is the size (in bytes)  greater than or equal to <code>512</code> that is 
+            used by the library when the file space strategy <code>PAGE</code> is used.
+            <p>
+        <dt><code>-P</code> <em>fs_persist</em>
+              or 
+            <code>--fs_persist</code>=<em>fs_persist</em>
+            <dd>Persisting or not persisting free space (see <code>H5Pset_file_space_strategy</code>).
+            <br>
+            <em>fs_persist</em> is <code>1</code> for persisting free space and <code>0</code> for not persisting free space .
+            <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
+            output file (see <code>H5Pset_file_space_strategy</code>).
             <p>
-            <em>fs_strategy</em> is a string as listed below:
+            <em>fs_strategy</em> is a string indicating the file space strategy:
                 <br>    
-                    <code>ALL_PERSIST</code>: Use persistent free-space 
-                     managers, aggregators and virtual file
-                     driver for file space allocation
+                    <code>FSM_AGGR</code>: Use 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
+                    <code>PAGE</code>: Use free-space managers with embedded
+                    paged aggregation and virtual file driver for file space allocation
                 <br>    
-                    <code>AGGR_VFD</code>: Use aggregators and virtual file 
+                    <code>AGGR</code>: Use aggregators and virtual file 
                      driver for file space allocation
                 <br>    
-                    <code>VFD</code>: Use virtual file driver for 
+                    <code>NONE</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>
+            <dd>The free-space section threshold to use for the output file (see <code>H5Pset_file_space_strategy</code>).
+            <br>
             <em>fs_threshold</em> is the minimum size (in bytes) of 
             free-space sections to be tracked by
             the library's free-space managers.
@@ -407,13 +423,25 @@
           <td valign="top" align="left">
             <strong>Change</strong></td></tr>
         <tr>
+          <td valign="top">1.10.1</td>
+          <td valign="top">
+            Options added or modified in this release for file space management and page buffering:
+            <br />
+            <code>    -G, --fs_page_size</code>
+            <br />
+            <code>    -P, --fs_persist</code>
+            <br />
+            <code>    -S, --fs_strategy</code> (modified)
+            </td></tr>
+
+        <tr>
           <td valign="top">1.10.0</td>
           <td valign="top">
             Options added in this release for file space management:
             <br />
-            <code>    -S, -fs_strategy</code>
+            <code>    -S, --fs_strategy</code>
             <br />
-            <code>    -T, -fs_threshold</code>
+            <code>    -T, --fs_threshold</code>
             </td></tr>
         <tr>
           <td valign="top">1.8.12</td>
diff --git a/html/RM/Tools/h5stat.htm b/html/RM/Tools/h5stat.htm
index f6e4241..d63d6f3 100644
--- a/html/RM/Tools/h5stat.htm
+++ b/html/RM/Tools/h5stat.htm
@@ -169,6 +169,17 @@
             <strong>Release</strong>    </td>
           <td valign="top" align="left">
             <strong>Change</strong></td></tr>
+
+
+        <tr>
+          <td valign="top">1.10.1</td>
+          <td valign="top">
+           When printing file space information via the <code>-S</code> option, the file space page size
+           is included.
+           </td>
+        </tr>
+
+
         <tr>
           <td valign="top">1.10.0</td>
           <td valign="top">
diff --git a/html/RM/Tools/h5watch.htm b/html/RM/Tools/h5watch.htm
index 81d600e..f4f82dc 100644
--- a/html/RM/Tools/h5watch.htm
+++ b/html/RM/Tools/h5watch.htm
@@ -27,7 +27,7 @@
 
 <dt><div align="right"><font color="999999" size="-1"><i>
       <a name="LastModifiedDate">
-      Last modified: 28 January 2016
+      Last modified: 25 May 2016
       </a></i></font></div></dt>
       <br />
 
@@ -235,7 +235,8 @@
     (4): record
     </pre>
 
-    <p>For more examples, see the <a href="h5watchExamples.pdf">
+    <p>For more examples, see the 
+    <a href="/HDF5/docNewFeatures/SWMR/h5watchExamples.pdf">
     <i>h5watch Examples</i></a> document.
     </p>
     </dd>
@@ -245,11 +246,11 @@
 
   <dt><strong><a name="SeeAlso">See Also:</a></strong></dt>
     <ul>
-        <li><a href="H5LDget_dset_type_size.htm">
+        <li><a href="../HL/RM_H5LT.html#H5LDget_dset_type_size">
           <code>H5LDget_dset_type_size</code></a></li>
-        <li><a href="H5LDget_dset_dims.htm">
+        <li><a href="../HL/RM_H5LT.html#H5LDget_dset_dims">
           <code>H5LDget_dset_dims</code></a></li>
-        <li><a href="H5LDget_dset_elmts.htm">
+        <li><a href="../HL/RM_H5LT.html#H5LDget_dset_elmts">
           <code>H5LDget_dset_elmts</code></a></li>
     </ul>
         <br />
diff --git a/html/TechNotes/TechNote-HDF5-ImprovingIOPerformanceCompressedDatasets.docx b/html/TechNotes/TechNote-HDF5-ImprovingIOPerformanceCompressedDatasets.docx
new file mode 100644
index 0000000..1f0786b
Binary files /dev/null and b/html/TechNotes/TechNote-HDF5-ImprovingIOPerformanceCompressedDatasets.docx differ
diff --git a/html/_topic/loc_id+name_obj.htm b/html/_topic/loc_id+name_obj.htm
index 5a3afb2..14ab637 100644
--- a/html/_topic/loc_id+name_obj.htm
+++ b/html/_topic/loc_id+name_obj.htm
@@ -5,40 +5,99 @@
 <strong>
 Accessing objects by location and name:
 </strong></a>
-<br>
 
-Many HDF5 function calls use a combination of a location and name
-to identify an HDF5 object.
+<p>To work with an HDF5 object, an application needs the object's 
+location identifier. An object's location identifier is returned to an 
+application after the object is opened. </p>
+
+<p>To open an object, an application uses a function with three parameters: 
+the location identifier of an already opened object, a path from the already 
+opened object to the object that will be opened, and a property list. The 
+location identifier of an already opened object is its <code>loc_id</code>. 
+An already opened object might be a file or a group. The path from the 
+already opened object to the object that will be opened is kept in 
+the <code>name</code> parameter. The path will be one or more links. 
+For the rest of this discussion, we will assume that the default property 
+list, <code>H5P_DEFAULT</code>, is used. </p>
+
+<p>See the <i>HDF5 Reference Manual</i> entries for the <code>H5Dopen</code>, 
+<code>H5Gopen</code>, <code>H5Oopen</code>, and <code>H5Topen</code> 
+functions for more information on opening datasets, groups, objects, and 
+datatypes.</p>
+
+
+<br /><br /><br />
+an identifier from the file where the object is located and the 
+path from the identifier to the object. The identifier is usually 
+known as <code>loc_id</code>. <code>loc_id</code> is short for 
+location identifier. The path from the identifer is 
+</p>
+
+<br /><br /><br />
+<p>* 
+<p> ??????? The process of identifying an object is to specify a path to 
+the object from a known location. </p>
+
+<p>Suppose we wanted to read the dataset that is the target of the 
+<code>dset3</code> link in the figure below. The <code>H5Dread</code> 
+function call needs an identifier for the dataset. How does an application 
+go about getting that identifier?</p>
+
+
+
+<p>The identifier that is returned from this process 
+can then be used when the object is operated on.
+
+
+
+The <code>loc_id</code> and <code>name</code> 
+parameters are used in many HDF5 function calls to specify a known 
+location 
+
+</p>
+
+
+
+
+
+
+
+
+<p>??????? </p>
+
+
+<p>Many HDF5 function calls use a combination of a location and name
+to identify an HDF5 object. </p>
 <p>
 The location will be specified by a location identifier, <code>loc_id</code>, 
-and will be an HDF5 file or an object in a file, 
-such as a group, dataset or named datatype. 
-<p>
-The name, <code>name</code>, will be a character string and
-will specify an object in an HDF5 file, 
-such as a group, dataset or named datatype.
-<code>name</code> will specify that object by 
-either an absolute path in the file specified by <code>loc_id</code> 
-or by a relative path  relative to <code>loc_id</code>.
+and will be an HDF5 file or object such as a group, dataset, or committed 
+datatype*. </p>
+
 <p>
+The name parameter, <code>name</code>, will be a character string and
+will specify the links to an object in an HDF5 file.
+The link or links to the object will be either an absolute path 
+or a relative path. An absolute path will include all of the links from 
+the root group to the object. A relative path will include all of the 
+links from any other group to the object.</p>
+
 
-<table border=1 align=right width=210><tr>
+<table border=1 align=right ><tr>
     <td align=center>
-        <img src="../UG/Images/Dmodel_fig40_d+g3.jpg" width=250>    
+        <img src="../UG/Images/Dmodel_fig40_d+g3.jpg" width=300>    
 <!--    <img src="./Dmodel_fig40_d.jpg" width=250> -->
-    </td></tr><tr><td align=center>
-        Sample file structure:<br><code>DATA_FILE1</code>
+    </td></tr><tr><td align="left"><b>
+    Figure 1: File structure for DATA_FILE1</b>
 </tr></table>
 
 <p>
-The <code>loc_id</code> and <code>name</code> combination,
-as used in these function calls, can interact in any of several ways.
-To illustrate, the following combinations all identify <code>dset3</code> 
-in the illustrated file structure.
+Several <code>loc_id</code> and <code>name</code> combinations are 
+possible. To illustrate, the following combinations all identify 
+<code>dset3</code> in the file structure in the figure.
 <ul>
     <li>If <code>loc_id</code> is a file identifier,
         <code>name</code> must specify the object from the file’s
-        root group, i.e., by an absolute path.
+        root group.
         <p>
         <code>loc_id</code> specifies the file <code>DATA_FILE1</code>.
         <br>
@@ -53,15 +112,15 @@ in the illustrated file structure.
 -->
     <li>If <code>loc_id</code> is a group identifier 
         and the object of interest is a member of that group,
-        <code>name</code> will simply be the name of the object.
+        <code>name</code> will simply be the name of the link to the object.
         <p>
         <code>loc_id</code> specifies <code>group3</code>.
         <br>
         <code>name = 'dset3'</code>                                     
     <li>If <code>loc_id</code> is a group identifier 
         but the object of interest is not a direct member of that group,
-        <code>name</code> would generally specify the object by a relative 
-        pathe, relative to that group.
+        <code>name</code> would specify the object by a path relative 
+        to that group.
         <p>
         <code>loc_id</code> specifies <code>group2</code>.
         <br>
@@ -96,9 +155,13 @@ the limitations are mentioned in the function’s reference manual entry.
 For a related discussion of the structure of HDF5 files and HDF5 path names, 
 see “<a href="../UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FDataModelAndFileStructure%2FThe_HDF5_Data_Model_and_File_Structure.htm%23TOC_1_4_The_Structure_of_anbc-14&rhtocid=1.3">The 
 Structure of an HDF5 File</a>”
-(particularly the subsection “HDF5 Path Names and Navigation”)
+(particularly the sub-section “HDF5 Path Names and Navigation”)
 in the “<a href="../UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FDataModelAndFileStructure%2FThe_HDF5_Data_Model_and_File_Structure.htm">HDF5 
 Data Model and File Structure</a>” chapter
-of the <cite>HDF5 User’s Guide</cite>.
+of the <cite>HDF5 User’s Guide</cite>.</p>
+<br />
+<p>
+* In the past, a committed datatype was known as a named datatype.
+</p>
  
 
diff --git a/html/doc-info.html b/html/doc-info.html
index dff0d49..7b641f2 100644
--- a/html/doc-info.html
+++ b/html/doc-info.html
@@ -19,14 +19,14 @@
 
 
 <?php
-$page_title = "HDF5 Documentation: Releases 1.6.10 and 1.8.16"; 
+$page_title = "HDF5 Documentation: Releases 1.6.10 and 1.8.17"; 
 include ("../../links.php"); 
 include ("../../includes/header.html"); 
 ?>
 <fieldset><h1>HDF5 Documentation</H1></fieldset>
 
 <p align=left>
-    <A HREF="./index.html">Release 1.8.16</A>
+    <A HREF="./index.html">Release 1.8.17</A>
     <code>  </code>
     <A HREF="../doc1.6/index.html">Release 1.6.10</A>
 
@@ -90,7 +90,7 @@ Upcoming Development Release
     </ul>
 </p>
 
-Existing features will be the same as in HDF5 Release 1.8.16, 
+Existing features will be the same as in HDF5 Release 1.8.17, 
 which is documented here: 
 <p>
     <ul>
@@ -108,13 +108,13 @@ which is documented here:
 Current Stable Releases
 <hr></h2>
 
-<h2>HDF5 Release 1.8.16</h2>
+<h2>HDF5 Release 1.8.17</h2>
 
-<p>Release 1.8.16 is the current release.  
+<p>Release 1.8.17 is the current release.  
    New projects are strongly encouraged to use this release as it contains 
    many new features, file optimizations, and performance enhancements.</p>
 
-<p><h4>Release 1.8.16 Documentation (latest release):</h4></p>
+<p><h4>Release 1.8.17 Documentation (latest release):</h4></p>
 <p>
     <ul>
       <ul>
diff --git a/html/ed_libs/Footer-THGonly.htm b/html/ed_libs/Footer-THGonly.htm
index b0fb983..85e0992 100644
--- a/html/ed_libs/Footer-THGonly.htm
+++ b/html/ed_libs/Footer-THGonly.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="./Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="./Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
       </td>   
   </tr>   
 </table>
diff --git a/html/ed_libs/Footer-THGonly2.htm b/html/ed_libs/Footer-THGonly2.htm
index 5029e70..953f9ec 100644
--- a/html/ed_libs/Footer-THGonly2.htm
+++ b/html/ed_libs/Footer-THGonly2.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="../Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
       </td>   
   </tr>   
 </table>
diff --git a/html/ed_libs/Footer-THGonly3.htm b/html/ed_libs/Footer-THGonly3.htm
index ca7d3de..aefeef3 100644
--- a/html/ed_libs/Footer-THGonly3.htm
+++ b/html/ed_libs/Footer-THGonly3.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="../../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="../../Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
       </td>   
   </tr>   
 </table>
diff --git a/html/ed_libs/Footer.htm b/html/ed_libs/Footer.htm
index cfcfe15..bfe5984 100644
--- a/html/ed_libs/Footer.htm
+++ b/html/ed_libs/Footer.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="./Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="./Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
           <br>
           and the Board of Trustees of the University of Illinois
       </td>   
diff --git a/html/ed_libs/Footer2.htm b/html/ed_libs/Footer2.htm
index 4a6db55..3833594 100644
--- a/html/ed_libs/Footer2.htm
+++ b/html/ed_libs/Footer2.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="../Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
           <br>
           and the Board of Trustees of the University of Illinois
       </td>   
diff --git a/html/ed_libs/Footer3.htm b/html/ed_libs/Footer3.htm
index 2fc00c7..4824fce 100644
--- a/html/ed_libs/Footer3.htm
+++ b/html/ed_libs/Footer3.htm
@@ -8,12 +8,12 @@
           <address>
           The HDF Group Help Desk: <img src="../../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.10.1
+          Describes HDF5 Release 1.10.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
-          <a href="../../Copyright.html">Copyright</a> by
-          <a href="http://www.hdfgroup.org">The HDF Group</a>
+          <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by
+          <a href="https://www.hdfgroup.org">The HDF Group</a>
           <br>
           and the Board of Trustees of the University of Illinois
       </td>   
diff --git a/html/index.html b/html/index.html
index 293871e..7a93b61 100644
--- a/html/index.html
+++ b/html/index.html
@@ -8,7 +8,7 @@
   * Copyright by The HDF Group.                                               *
   * Copyright by the Board of Trustees of the University of Illinois.         *
   * All rights reserved.                                                      *
-  *                                                                         *
+  *                                                                           *
   * This file is part of HDF5.  The full HDF5 copyright notice, including     *
   * terms governing use, modification, and redistribution, is contained in    *
   * the files COPYING and Copyright.html.  COPYING can be found at the root   *
@@ -36,7 +36,7 @@
 <table width="100%" cellpadding="0" border="0"> 
   <tr valign="bottom" align="left">
     <td>
-      <a href="http://www.hdfgroup.org">
+      <a href="https://support.hdfgroup.org">
       <img src="Graphics/THGnoTextSm.jpg" alt="The HDF Group logo" 
         border="0" width="75" ></a>
         <font size="+2">The HDF Group</font>
@@ -114,55 +114,25 @@
     <hr />
 <font size="-1">
     <dl>
-    <dt><a href="http://www.hdfgroup.org/services/">Support Services</a>
+    <dt><a href="https://www.hdfgroup.org/support/">Support Services</a>
     </dt>
     <br />
-    <dt><a href="http://www.hdfgroup.org/HDF5/release/obtain5.html" 
-        target="ExtWin">HDF5 Downloads</a></dt>
+    <dt><a href="https://support.hdfgroup.org/HDF5/index.html" 
+        target="ExtWin">HDF5 Home Page</a></dt>
     <br />
     
-    <dt><a href="http://www.hdfgroup.org/products/java/">HDF Java Products</a></dt>
-    <br />
-    
-    <dt><a href="http://www.hdfgroup.org/HDF5/PHDF5/" 
+    <dt><a href="https://support.hdfgroup.org/HDF5/PHDF5/" 
         target="ExtWin">Parallel HDF5</a></dt>
     <br />
     
-    <dt><a href="http://www.hdfgroup.org/newsletters.html" 
+    <dt><a href="https://support.hdfgroup.org/news/" 
         target="ExtWin">Newsletters</a></dt>
     <br />
     
-    <dt><a href="http://www.hdfgroup.org/pubs/presentations/">Presentations</a></dt>
-    <br />
-    
-    <dt><a href="http://www.hdfgroup.org/pubs/papers/">Papers</a></dt>
-    <br />
-    
-<!--
-    <dt><a href="http://www.hdfgroup.org/pubs/presentations/">Presentations</a> & <a href="http://www.hdfgroup.org/pubs/papers/">Papers</a>
+    <dt><a href="https://support.hdfgroup.org/pubs/">Publications</a></dt>
     <br />
-    <a href="http://www.hdfgroup.uiuc.edu/papers/presentations/HDF5_overview/"
-        target="ExtWin">HDF5 Overview</a>
-    <p>
--->
-<!--
-    <dt><a href="http://www.hdfgroup.org/HDF5/XML/" 
-        target="ExtWin">XML and HDF5</a>
-    <ul>
-    <li>XML tools and standard XML DTD for HDF5 
-    </ul>
-    <p>
-    <dt><a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/">Printer-friendly 
-        and <br />Searchable PDFs</A>
-    <ul>
-    <li>PDF versions of selected HDF5 documents
-    </ul>
-    <p>
-    <dt><a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html" 
-        target="ExtWin">Pre-release Snapshots</A>
--->
     
-    <dt><a href="../docNewFeatures/">Documentation for HDF5 New Features</a></dt>
+    <dt><a href="https://support.hdfgroup.org/HDF5/docNewFeatures/">Documentation for HDF5-1.10 New Features</a></dt>
 
 
 
@@ -183,7 +153,7 @@
     <dl>
         <dt>Latest Supported Prior Release:
         <br />
-        <a href="http://www.hdfgroup.org/HDF5/doc1.8/">Latest 
+        <a href="https://support.hdfgroup.org/HDF5/doc1.8/">Latest 
         HDF5 1.8.x release</a>
     </dl>
 </font>
@@ -193,7 +163,7 @@
     <dl>
         <dt>Unsupported Prior Release:
         <br />
-        <a href="http://www.hdfgroup.org/HDF5/doc1.6/">HDF5 1.6.10</a>
+        <a href="https://support.hdfgroup.org/HDF5/doc1.6/">HDF5 1.6.10</a>
     </dl>
 </font>
 </td></tr>
@@ -222,7 +192,7 @@
 
 <tr>
     <td align="left" valign="top" width="47%">
-        <a href="http://www.hdfgroup.org/products/java/hdfview/">HDFView</a>
+        <a href="https://support.hdfgroup.org/products/java/hdfview/">HDFView</a>
         <br /><font size="-1">Browser and editor
         <br />Excellent choice for a “first look”</font>
     </td><td align="left" valign="top" width="6%"> 
@@ -242,13 +212,13 @@
 
 <tr>
     <td align="left" valign="top" width="47%">
-        <a href="http://www.hdfgroup.org/HDF5/Tutor/index.html">HDF5 
+        <a href="https://support.hdfgroup.org/HDF5/Tutor/index.html">HDF5 
         Tutorial</a>
         <br /><font size="-1">Tutorials treating selected HDF5 topics</font>
     </td><td align="left" valign="top" width="6%" rowspan="2"> 
     </td><td align="left" valign="top" width="47%">
-        <a href="H5.intro.html">Introduction to HDF5</a>
-        <br /><font size="-1">High level overview of using HDF5</font>
+        <a href="/HDF5/Tutor/HDF5Intro.pdf">Introduction to HDF5</a>
+        <br /><font size="-1">High level overview of HDF5</font>
     </td>
 </tr>
 <tr>
@@ -262,7 +232,13 @@
 <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.10.1, Summer 2016</font>
+    <br /><font size="4" color="#004488"> Release 1.10.1 (PRE-RELEASE), March 2017
+           <br />
+<!--
+           Highest current public releases are HDF5 Release 1.8.x and 
+           1.10.x.
+-->
+    </font>
 </td>
 </tr>
 
@@ -278,7 +254,7 @@
             <tr><td align=left valign=top bgcolor=#ffffff>
             <center>
             <font color=#004488><strong>What’s New in
-            the HDF5 Release 1.10 Series?</strong></font>
+            HDF5 Release 1.10.1?</strong></font>
 <!--
             <font size=-1>
             <br>Critical information for updating applications 
@@ -287,8 +263,8 @@
 -->
             </center>
             <br>
-            <a href="/HDF5/docNewFeatures/index.html">New Features in HDF5 
-            Release 1.10.0</a>
+            <a href="https://support.hdfgroup.org/HDF5/docNewFeatures/index.html">New Features in HDF5 
+            Release 1.10</a>
             <font size=-1>
             <br>New features in this release
             </font>
@@ -296,23 +272,14 @@
             <a href="ADGuide/Changes.html">HDF5 Software Changes from 
             Release to Release</a>
             <font size=-1>
-            <br>Specific interface changes in 1.10.0
-            </font>
-<!--
-            <p>
-            <a href="ADGuide/CompatFormat180.html">New Features in 
-            HDF5 Release 1.8.0</a>
-            <br><a href="ADGuide/CompatFormat180.html">and 
-            Format Compatibility Considerations</a>
-            <font size=-1>
-            <br>Format compatibility issues 
+            <br>Specific interface changes in 1.10.1
             </font>
--->
+
             <p>
             <a href="RM/APICompatMacros.html">API Compatibility Macros 
             in HDF5</a>
             <font size=-1>
-            <br>Versioned functions and macros, updated for 1.10.0
+            <br>Versioned functions and macros, updated for 1.10.1
             </font>
             
             </td></tr>
@@ -336,7 +303,7 @@
             <a href="UG/index.html">HDF5 User’s Guide 
             (HTML, 1.8.15)</a>
             <br />
-            <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF">
+            <a href="https://support.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF">
             HDF5 User’s Guide (PDF, 1.8.8)</a>
             <br />
             <font size="-1">Detailed guide covering critical HDF5 
@@ -364,7 +331,7 @@
             <a href="RM/RM_H5Front.html">HDF5 Reference Manual</a>
             <font size="-1">
              
-            (<a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF for Release 1.8.8</a>)
+            (<a href="https://support.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF for Release 1.8.8</a>)
             <br />
             Detailed C and 
             <a href="RM/RM_H5Front.html#F90andCPPlus">Fortran</a> 
@@ -376,7 +343,7 @@
             dimension scale</font>
           </td></tr>
           <tr><td valign="top" align="left">
-            <a href="http://www.hdfgroup.org/HDF5-FAQ.html">FAQs</a>
+            <a href="https://support.hdfgroup.org/HDF5/HDF5-FAQ.html">FAQs</a>
             <br />
             <font size="-1">Frequently asked questions</font>
           </td></tr>
@@ -395,7 +362,7 @@
             -->
           </td></tr>
           <tr><td valign="top" align="left">
-            <a href="http://www.hdfgroup.org/products/java/JNI/jhi5/index.html">
+            <a href="https://support.hdfgroup.org/products/java/JNI3/docs/javadocs/hdf5_java_doc/">
             Java HDF5 Interface</a>
           </td></tr>
         </table>
@@ -482,7 +449,7 @@
 -->
         <br />
         <!-- hhmts start -->
-        Last modified: 20 May 2016
+        Last modified: March 2017 
         <!-- hhmts end -->
 
         <p>
@@ -490,14 +457,11 @@
     </td><td width="10%" rowspan="2"> 
     </td><td width="45%" align="right" valign="top" rowspan="2">
         <font face="arial,helvetica" size="-1">
-        <a href="Copyright.html">Copyright</a> by The HDF Group and the Board 
+        <a href="https://support.hdfgroup.org/ftp/HDF5/releases/COPYING">Copyright</a> by The HDF Group and the Board 
         <br />
         of Trustees of the University of Illinois.  
         <br />
         All rights reserved.
-<!--
-        See <a href="Copyright.html">full copyright notice</a>.
--->
         </font>
 <!--
         <a href="http://www.hdfgroup.org/">
diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt
index 0440d41..d37a409 100644
--- a/java/CMakeLists.txt
+++ b/java/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.1.0)
+cmake_minimum_required(VERSION 3.2.2)
 PROJECT ( HDF5_JAVA C Java )
 
 set (CMAKE_MODULE_PATH "${HDF_RESOURCES_DIR};${HDF_RESOURCES_EXT_DIR}")
@@ -13,6 +13,12 @@ find_package (JNI)
 
 INCLUDE_DIRECTORIES ( ${JNI_INCLUDE_DIRS} )
 
+if (WIN32)
+  set (HDF_JRE_DIRECTORY "C:/Program Files/Java/jre8")
+else ()
+  set (HDF_JRE_DIRECTORY "/usr/lib/jvm/jre")
+endif ()
+
 #-----------------------------------------------------------------------------
 # Include the main src and config directories
 #-----------------------------------------------------------------------------
@@ -35,14 +41,14 @@ add_subdirectory (${HDF5_JAVA_SOURCE_DIR}/src ${HDF5_JAVA_BINARY_DIR}/src)
 #-----------------------------------------------------------------------------
 if (HDF5_BUILD_EXAMPLES)
   add_subdirectory (${HDF5_JAVA_SOURCE_DIR}/examples ${HDF5_JAVA_BINARY_DIR}/examples)
-endif (HDF5_BUILD_EXAMPLES)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Testing
 #-----------------------------------------------------------------------------
 if (BUILD_TESTING)
   add_subdirectory (${HDF5_JAVA_SOURCE_DIR}/test ${HDF5_JAVA_BINARY_DIR}/test)
-endif (BUILD_TESTING)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Required Jar(s)
@@ -61,17 +67,9 @@ install (
 #-----------------------------------------------------------------------------
 option (HDF5_JAVA_PACK_JRE  "Package a JRE installer directory" OFF)
 if (HDF5_JAVA_PACK_JRE)
-  if (WIN32)
-    install (
-        DIRECTORY "C:/Program Files/Java/jre8"
-        DESTINATION ${HDF5_INSTALL_BIN_DIR}
-        USE_SOURCE_PERMISSIONS
-    )
-  else (WIN32)
-    install (
-        DIRECTORY "/usr/lib/jvm/jre"
-        DESTINATION ${HDF5_INSTALL_BIN_DIR}
-        USE_SOURCE_PERMISSIONS
-    )
-  endif (WIN32)
-endif (HDF5_JAVA_PACK_JRE)
+  install (
+      DIRECTORY ${HDF_JRE_DIRECTORY}
+      DESTINATION ${HDF5_INSTALL_BIN_DIR}
+      USE_SOURCE_PERMISSIONS
+  )
+endif ()
diff --git a/java/COPYING b/java/COPYING
index 6903daf..6497ace 100644
--- a/java/COPYING
+++ b/java/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/java/Makefile.am b/java/Makefile.am
index 10b1e91..7d0e2f0 100644
--- a/java/Makefile.am
+++ b/java/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
diff --git a/java/Makefile.in b/java/Makefile.in
index 2ee766e..5aac4e0 100644
--- a/java/Makefile.in
+++ b/java/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -466,6 +464,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -587,6 +586,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -737,18 +737,20 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 @BUILD_JAVA_CONDITIONAL_TRUE at JAVA_API = yes
 @BUILD_JAVA_CONDITIONAL_TRUE at SUBDIRS = src test examples
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1234,6 +1236,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1241,7 +1244,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/CMakeLists.txt b/java/examples/CMakeLists.txt
index 0430bdb..a1a7483 100644
--- a/java/examples/CMakeLists.txt
+++ b/java/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDFJAVA_EXAMPLES)
 
 add_subdirectory (${HDFJAVA_EXAMPLES_SOURCE_DIR}/datasets     datasets)
diff --git a/java/examples/Makefile.am b/java/examples/Makefile.am
index e685e01..8ca49f2 100644
--- a/java/examples/Makefile.am
+++ b/java/examples/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
diff --git a/java/examples/Makefile.in b/java/examples/Makefile.in
index 9fa73b6..2c461fe 100644
--- a/java/examples/Makefile.in
+++ b/java/examples/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -466,6 +464,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -587,6 +586,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -734,18 +734,20 @@ TRACE = perl $(top_srcdir)/bin/trace
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 SUBDIRS = intro groups datasets datatypes
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1231,6 +1233,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1238,7 +1241,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/datasets/CMakeLists.txt b/java/examples/datasets/CMakeLists.txt
index 5f5f37c..d698cfd 100644
--- a/java/examples/datasets/CMakeLists.txt
+++ b/java/examples/datasets/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDFJAVA_EXAMPLES_DATASETS Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -31,16 +31,16 @@ set (HDF_JAVA_EXAMPLES
 
 if (WIN32)
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
-else (WIN32)
+else ()
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
-endif (WIN32)
+endif ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}")
-endforeach (CMAKE_INCLUDE_PATH)
+endforeach ()
 
 foreach (example ${HDF_JAVA_EXAMPLES})
   file (WRITE ${PROJECT_BINARY_DIR}/${example}_Manifest.txt
@@ -52,19 +52,23 @@ foreach (example ${HDF_JAVA_EXAMPLES})
 #  install_jar (${example} ${HJAVA_INSTALL_DATA_DIR}/examples examples)
   get_target_property (${example}_CLASSPATH ${example} CLASSDIR)
   add_dependencies (${example} ${HDF5_JAVA_HDF5_LIB_TARGET})
-endforeach (example ${HDF_JAVA_EXAMPLES})
+endforeach ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_NOP_JAR}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (HDFJAVA_JAR ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFJAVA_JAR}")
-endforeach (HDFJAVA_JAR)
+endforeach ()
 
 MACRO (ADD_H5_TEST resultfile resultcode)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
-  endif(CMAKE_BUILD_TYPE MATCHES Debug)
+    if (WIN32)
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_D;")
+    else ()
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
+    endif ()
+  endif ()
   add_test (
       NAME JAVA_datasets-${resultfile}
       COMMAND "${CMAKE_COMMAND}"
@@ -81,16 +85,16 @@ MACRO (ADD_H5_TEST resultfile resultcode)
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (JAVA_datasets-${resultfile} PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "JAVA_datasets-${resultfile}")
-ENDMACRO (ADD_H5_TEST file)
+ENDMACRO ()
 
 if (BUILD_TESTING)
 
 # detect whether the encoder is present.
   if (H5_HAVE_FILTER_DEFLATE)
     set (USE_FILTER_DEFLATE "true")
-  endif (H5_HAVE_FILTER_DEFLATE)
+  endif ()
 
   if (H5_HAVE_FILTER_SZIP)
     set (USE_FILTER_SZIP "true")
@@ -104,22 +108,18 @@ if (BUILD_TESTING)
               -E remove
               ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.h5
               ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.data
-              ${example}.out
-              ${example}.out.err
       )
-    else (${example} STREQUAL "H5Ex_D_External")
+    else ()
       add_test (
           NAME JAVA_datasets-${example}-clear-objects
           COMMAND    ${CMAKE_COMMAND}
               -E remove
               ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.h5
-              ${example}.out
-              ${example}.out.err
       )
-    endif (${example} STREQUAL "H5Ex_D_External")
+    endif ()
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (JAVA_datasets-${example}-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     add_test (
         NAME JAVA_datasets-${example}-copy-objects
         COMMAND    ${CMAKE_COMMAND}
@@ -132,10 +132,10 @@ if (BUILD_TESTING)
     if (${example} STREQUAL "H5Ex_D_Szip")
       if (USE_FILTER_SZIP)
         ADD_H5_TEST (${example} 0)
-      endif (USE_FILTER_SZIP)
-    else (${example} STREQUAL "H5Ex_D_Szip")
+      endif ()
+    else ()
       ADD_H5_TEST (${example} 0)
-    endif (${example} STREQUAL "H5Ex_D_Szip")
+    endif ()
 
-  endforeach (example ${HDF_JAVA_EXAMPLES})
-endif (BUILD_TESTING)
+  endforeach ()
+endif ()
diff --git a/java/examples/datasets/H5Ex_D_Alloc.java b/java/examples/datasets/H5Ex_D_Alloc.java
index 69fee38..e40c042 100644
--- a/java/examples/datasets/H5Ex_D_Alloc.java
+++ b/java/examples/datasets/H5Ex_D_Alloc.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Checksum.java b/java/examples/datasets/H5Ex_D_Checksum.java
index 3a2f98f..9de09be 100644
--- a/java/examples/datasets/H5Ex_D_Checksum.java
+++ b/java/examples/datasets/H5Ex_D_Checksum.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Chunk.java b/java/examples/datasets/H5Ex_D_Chunk.java
index 7f02e5a..3d61e26 100644
--- a/java/examples/datasets/H5Ex_D_Chunk.java
+++ b/java/examples/datasets/H5Ex_D_Chunk.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
@@ -44,7 +42,7 @@ public class H5Ex_D_Chunk {
 
     // Values for the status of space allocation
     enum H5D_layout {
-        H5D_LAYOUT_ERROR(-1), H5D_COMPACT(0), H5D_CONTIGUOUS(1), H5D_CHUNKED(2), H5D_NLAYOUTS(3);
+        H5D_LAYOUT_ERROR(-1), H5D_COMPACT(0), H5D_CONTIGUOUS(1), H5D_CHUNKED(2), H5D_VIRTUAL(3), H5D_NLAYOUTS(4);
         private static final Map<Integer, H5D_layout> lookup = new HashMap<Integer, H5D_layout>();
 
         static {
@@ -250,6 +248,9 @@ public class H5Ex_D_Chunk {
                 case H5D_CHUNKED:
                     System.out.println("H5D_CHUNKED");
                     break;
+                case H5D_VIRTUAL:
+                    System.out.println("H5D_VIRTUAL");
+                    break;
                 case H5D_LAYOUT_ERROR:
                     break;
                 case H5D_NLAYOUTS:
diff --git a/java/examples/datasets/H5Ex_D_Compact.java b/java/examples/datasets/H5Ex_D_Compact.java
index 4f1e2f0..17c09f5 100644
--- a/java/examples/datasets/H5Ex_D_Compact.java
+++ b/java/examples/datasets/H5Ex_D_Compact.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
@@ -38,7 +36,7 @@ public class H5Ex_D_Compact {
 
     // Values for the status of space allocation
     enum H5D_layout {
-        H5D_LAYOUT_ERROR(-1), H5D_COMPACT(0), H5D_CONTIGUOUS(1), H5D_CHUNKED(2), H5D_NLAYOUTS(3);
+        H5D_LAYOUT_ERROR(-1), H5D_COMPACT(0), H5D_CONTIGUOUS(1), H5D_CHUNKED(2), H5D_VIRTUAL(3), H5D_NLAYOUTS(4);
         private static final Map<Integer, H5D_layout> lookup = new HashMap<Integer, H5D_layout>();
 
         static {
@@ -212,6 +210,9 @@ public class H5Ex_D_Compact {
                 case H5D_CHUNKED:
                     System.out.println("H5D_CHUNKED");
                     break;
+                case H5D_VIRTUAL:
+                    System.out.println("H5D_VIRTUAL");
+                    break;
                 case H5D_LAYOUT_ERROR:
                     break;
                 case H5D_NLAYOUTS:
diff --git a/java/examples/datasets/H5Ex_D_External.java b/java/examples/datasets/H5Ex_D_External.java
index 5fdc696..bf413ba 100644
--- a/java/examples/datasets/H5Ex_D_External.java
+++ b/java/examples/datasets/H5Ex_D_External.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_FillValue.java b/java/examples/datasets/H5Ex_D_FillValue.java
index 982d2cb..29cf4e1 100644
--- a/java/examples/datasets/H5Ex_D_FillValue.java
+++ b/java/examples/datasets/H5Ex_D_FillValue.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Gzip.java b/java/examples/datasets/H5Ex_D_Gzip.java
index b813367..50f8835 100644
--- a/java/examples/datasets/H5Ex_D_Gzip.java
+++ b/java/examples/datasets/H5Ex_D_Gzip.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Hyperslab.java b/java/examples/datasets/H5Ex_D_Hyperslab.java
index 482e2c0..88aa36e 100644
--- a/java/examples/datasets/H5Ex_D_Hyperslab.java
+++ b/java/examples/datasets/H5Ex_D_Hyperslab.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Nbit.java b/java/examples/datasets/H5Ex_D_Nbit.java
index f74b675..0263659 100644
--- a/java/examples/datasets/H5Ex_D_Nbit.java
+++ b/java/examples/datasets/H5Ex_D_Nbit.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_ReadWrite.java b/java/examples/datasets/H5Ex_D_ReadWrite.java
index de94ccb..49bc2e5 100644
--- a/java/examples/datasets/H5Ex_D_ReadWrite.java
+++ b/java/examples/datasets/H5Ex_D_ReadWrite.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Shuffle.java b/java/examples/datasets/H5Ex_D_Shuffle.java
index ac3c1b4..c7b7c53 100644
--- a/java/examples/datasets/H5Ex_D_Shuffle.java
+++ b/java/examples/datasets/H5Ex_D_Shuffle.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Sofloat.java b/java/examples/datasets/H5Ex_D_Sofloat.java
index 26c8d49..f0a437d 100644
--- a/java/examples/datasets/H5Ex_D_Sofloat.java
+++ b/java/examples/datasets/H5Ex_D_Sofloat.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Soint.java b/java/examples/datasets/H5Ex_D_Soint.java
index 7939883..fa4b416 100644
--- a/java/examples/datasets/H5Ex_D_Soint.java
+++ b/java/examples/datasets/H5Ex_D_Soint.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Szip.java b/java/examples/datasets/H5Ex_D_Szip.java
index 5258234..8106557 100644
--- a/java/examples/datasets/H5Ex_D_Szip.java
+++ b/java/examples/datasets/H5Ex_D_Szip.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_Transform.java b/java/examples/datasets/H5Ex_D_Transform.java
index 1f289f3..ada488a 100644
--- a/java/examples/datasets/H5Ex_D_Transform.java
+++ b/java/examples/datasets/H5Ex_D_Transform.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_UnlimitedAdd.java b/java/examples/datasets/H5Ex_D_UnlimitedAdd.java
index ada8df0..7e8ffaa 100644
--- a/java/examples/datasets/H5Ex_D_UnlimitedAdd.java
+++ b/java/examples/datasets/H5Ex_D_UnlimitedAdd.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_UnlimitedGzip.java b/java/examples/datasets/H5Ex_D_UnlimitedGzip.java
index c08ceef..42a6efd 100644
--- a/java/examples/datasets/H5Ex_D_UnlimitedGzip.java
+++ b/java/examples/datasets/H5Ex_D_UnlimitedGzip.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/H5Ex_D_UnlimitedMod.java b/java/examples/datasets/H5Ex_D_UnlimitedMod.java
index 884cad3..b38b233 100644
--- a/java/examples/datasets/H5Ex_D_UnlimitedMod.java
+++ b/java/examples/datasets/H5Ex_D_UnlimitedMod.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datasets/Makefile.am b/java/examples/datasets/Makefile.am
index 41ba6d1..18100a6 100644
--- a/java/examples/datasets/Makefile.am
+++ b/java/examples/datasets/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/java/examples/datasets/Makefile.in b/java/examples/datasets/Makefile.in
index 52210af..7ec263d 100644
--- a/java/examples/datasets/Makefile.in
+++ b/java/examples/datasets/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java Library Examples Makefile(.in)
 
@@ -405,6 +403,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -526,6 +525,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -705,18 +705,20 @@ check_SCRIPTS = runExample.sh
 TEST_SCRIPT = $(check_SCRIPTS)
 CLEANFILES = classnoinst.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/*.class runExample.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1111,6 +1113,7 @@ clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1118,7 +1121,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/datasets/runExample.sh.in b/java/examples/datasets/runExample.sh.in
index 83b06ec..21c3439 100644
--- a/java/examples/datasets/runExample.sh.in
+++ b/java/examples/datasets/runExample.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 top_builddir=@top_builddir@
@@ -38,7 +36,7 @@ nerrors=0
 
 # where the libs exist
 HDFLIB_HOME="$top_srcdir/java/lib"
-BLDLIBDIR="./lib"
+BLDLIBDIR="$top_builddir/hdf5/lib"
 BLDDIR="."
 HDFTEST_HOME="$top_srcdir/java/examples/datasets"
 JARFILE=jar at PACKAGE_TARNAME@- at PACKAGE_VERSION@.jar
@@ -161,6 +159,8 @@ CLEAN_DATAFILES_AND_BLDDIR()
 {
         $RM $BLDDIR/examples.datasets.H5Ex_D_*.txt
         $RM $BLDDIR/H5Ex_D_*.out
+        $RM $BLDDIR/H5Ex_D_*.h5
+        $RM $BLDDIR/H5Ex_D_External.data
 }
 
 # Print a line-line message left justified in a field of 70 characters
diff --git a/java/examples/datatypes/CMakeLists.txt b/java/examples/datatypes/CMakeLists.txt
index 1e305be..8569b8b 100644
--- a/java/examples/datatypes/CMakeLists.txt
+++ b/java/examples/datatypes/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDFJAVA_EXAMPLES_DATATYPES Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -31,16 +31,16 @@ set (HDF_JAVA_EXAMPLES
 
 if (WIN32)
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
-else (WIN32)
+else ()
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
-endif (WIN32)
+endif ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}")
-endforeach (CMAKE_INCLUDE_PATH)
+endforeach ()
 
 foreach (example ${HDF_JAVA_EXAMPLES})
   file (WRITE ${PROJECT_BINARY_DIR}/${example}_Manifest.txt
@@ -52,19 +52,23 @@ foreach (example ${HDF_JAVA_EXAMPLES})
 #  install_jar (${example} ${HJAVA_INSTALL_DATA_DIR}/examples examples)
   get_target_property (${example}_CLASSPATH ${example} CLASSDIR)
   add_dependencies (${example} ${HDF5_JAVA_HDF5_LIB_TARGET})
-endforeach (example ${HDF_JAVA_EXAMPLES})
+endforeach ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_NOP_JAR}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (HDFJAVA_JAR ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFJAVA_JAR}")
-endforeach (HDFJAVA_JAR)
+endforeach ()
 
 MACRO (ADD_H5_TEST resultfile resultcode)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
-  endif(CMAKE_BUILD_TYPE MATCHES Debug)
+    if (WIN32)
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_D;")
+    else ()
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
+    endif ()
+  endif ()
   add_test (
       NAME JAVA_datatypes-${resultfile}
       COMMAND "${CMAKE_COMMAND}"
@@ -81,9 +85,9 @@ MACRO (ADD_H5_TEST resultfile resultcode)
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (JAVA_datatypes-${resultfile} PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "JAVA_datatypes-${resultfile}")
-ENDMACRO (ADD_H5_TEST file)
+ENDMACRO ()
 
 if (BUILD_TESTING)
   foreach (example ${HDF_JAVA_EXAMPLES})
@@ -92,12 +96,10 @@ if (BUILD_TESTING)
         COMMAND    ${CMAKE_COMMAND}
             -E remove
             ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.h5
-            ${example}.out
-            ${example}.out.err
     )
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (JAVA_datatypes-${example}-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     add_test (
         NAME JAVA_datatypes-${example}-copy-objects
         COMMAND    ${CMAKE_COMMAND}
@@ -108,5 +110,5 @@ if (BUILD_TESTING)
     set_tests_properties (JAVA_datatypes-${example}-copy-objects PROPERTIES DEPENDS JAVA_datatypes-${example}-clear-objects)
     set (last_test "JAVA_datatypes-${example}-copy-objects")
     ADD_H5_TEST (${example} 0)
-  endforeach (example ${HDF_JAVA_EXAMPLES})
-endif (BUILD_TESTING)
+  endforeach ()
+endif ()
diff --git a/java/examples/datatypes/H5Ex_T_Array.java b/java/examples/datatypes/H5Ex_T_Array.java
index 7b7009a..f7f58d2 100644
--- a/java/examples/datatypes/H5Ex_T_Array.java
+++ b/java/examples/datatypes/H5Ex_T_Array.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_ArrayAttribute.java b/java/examples/datatypes/H5Ex_T_ArrayAttribute.java
index ce97457..b571f0c 100644
--- a/java/examples/datatypes/H5Ex_T_ArrayAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_ArrayAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_Bit.java b/java/examples/datatypes/H5Ex_T_Bit.java
index f76c7d5..e46f3b2 100644
--- a/java/examples/datatypes/H5Ex_T_Bit.java
+++ b/java/examples/datatypes/H5Ex_T_Bit.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_BitAttribute.java b/java/examples/datatypes/H5Ex_T_BitAttribute.java
index a5ab81b..43de4ea 100644
--- a/java/examples/datatypes/H5Ex_T_BitAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_BitAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_Commit.java b/java/examples/datatypes/H5Ex_T_Commit.java
index d4e43f9..4108979 100644
--- a/java/examples/datatypes/H5Ex_T_Commit.java
+++ b/java/examples/datatypes/H5Ex_T_Commit.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_Compound.java b/java/examples/datatypes/H5Ex_T_Compound.java
index f270cb9..c021c18 100644
--- a/java/examples/datatypes/H5Ex_T_Compound.java
+++ b/java/examples/datatypes/H5Ex_T_Compound.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_CompoundAttribute.java b/java/examples/datatypes/H5Ex_T_CompoundAttribute.java
index 25581d4..971939a 100644
--- a/java/examples/datatypes/H5Ex_T_CompoundAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_CompoundAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_Float.java b/java/examples/datatypes/H5Ex_T_Float.java
index 1b5fd9b..f677479 100644
--- a/java/examples/datatypes/H5Ex_T_Float.java
+++ b/java/examples/datatypes/H5Ex_T_Float.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_FloatAttribute.java b/java/examples/datatypes/H5Ex_T_FloatAttribute.java
index de1dac7..2e706d9 100644
--- a/java/examples/datatypes/H5Ex_T_FloatAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_FloatAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_Integer.java b/java/examples/datatypes/H5Ex_T_Integer.java
index 2f365cd..56da623 100644
--- a/java/examples/datatypes/H5Ex_T_Integer.java
+++ b/java/examples/datatypes/H5Ex_T_Integer.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_IntegerAttribute.java b/java/examples/datatypes/H5Ex_T_IntegerAttribute.java
index c153d99..9de517c 100644
--- a/java/examples/datatypes/H5Ex_T_IntegerAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_IntegerAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_ObjectReference.java b/java/examples/datatypes/H5Ex_T_ObjectReference.java
index 3cad6c9..8ce4f7b 100644
--- a/java/examples/datatypes/H5Ex_T_ObjectReference.java
+++ b/java/examples/datatypes/H5Ex_T_ObjectReference.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
@@ -256,11 +254,10 @@ public class H5Ex_T_ObjectReference {
                     object_id = H5.H5Rdereference(dataset_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5R_OBJECT, dset_data[indx]);
                     object_type = H5.H5Rget_obj_type(dataset_id, HDF5Constants.H5R_OBJECT, dset_data[indx]);
                 }
-                String[] obj_name = new String[1];
-                long name_size = 1;
+                String obj_name = null;
                 if (object_type >= 0) {
                     // Get the length of the name and retrieve the name.
-                    name_size = 1 + H5.H5Iget_name(object_id, obj_name, name_size);
+                    obj_name = H5.H5Iget_name(object_id);
                 }
                 if ((object_id >= 0) && (object_type >= -1)) {
                     switch (H5G_obj.get(object_type)) {
@@ -299,8 +296,7 @@ public class H5Ex_T_ObjectReference {
                     }
                 }
                 // Print the name.
-                if (name_size > 1)
-                    System.out.println(": " + obj_name[0]);
+                System.out.println(": " + obj_name);
             }
             catch (Exception e) {
                 e.printStackTrace();
diff --git a/java/examples/datatypes/H5Ex_T_ObjectReferenceAttribute.java b/java/examples/datatypes/H5Ex_T_ObjectReferenceAttribute.java
index e354029..4dc3677 100644
--- a/java/examples/datatypes/H5Ex_T_ObjectReferenceAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_ObjectReferenceAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
@@ -289,11 +287,10 @@ public class H5Ex_T_ObjectReferenceAttribute {
                     object_id = H5.H5Rdereference(dataset_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5R_OBJECT, dset_data[indx]);
                     object_type = H5.H5Rget_obj_type(dataset_id, HDF5Constants.H5R_OBJECT, dset_data[indx]);
                 }
-                String[] obj_name = new String[1];
-                long name_size = 1;
+                String obj_name = null;
                 if (object_type >= 0) {
                     // Get the length of the name and retrieve the name.
-                    name_size = 1 + H5.H5Iget_name(object_id, obj_name, name_size);
+                    obj_name = H5.H5Iget_name(object_id);
                 }
                 if ((object_id >= 0) && (object_type >= -1)) {
                     switch (H5G_obj.get(object_type)) {
@@ -332,8 +329,7 @@ public class H5Ex_T_ObjectReferenceAttribute {
                     }
                 }
                 // Print the name.
-                if (name_size > 1)
-                    System.out.println(": " + obj_name[0]);
+                System.out.println(": " + obj_name);
             }
             catch (Exception e) {
                 e.printStackTrace();
diff --git a/java/examples/datatypes/H5Ex_T_Opaque.java b/java/examples/datatypes/H5Ex_T_Opaque.java
index eb45686..6b0dc63 100644
--- a/java/examples/datatypes/H5Ex_T_Opaque.java
+++ b/java/examples/datatypes/H5Ex_T_Opaque.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_OpaqueAttribute.java b/java/examples/datatypes/H5Ex_T_OpaqueAttribute.java
index e42bfe8..6b8d1f8 100644
--- a/java/examples/datatypes/H5Ex_T_OpaqueAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_OpaqueAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_String.java b/java/examples/datatypes/H5Ex_T_String.java
index 469172d..7c190b7 100644
--- a/java/examples/datatypes/H5Ex_T_String.java
+++ b/java/examples/datatypes/H5Ex_T_String.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_StringAttribute.java b/java/examples/datatypes/H5Ex_T_StringAttribute.java
index 49361bc..f9ec155 100644
--- a/java/examples/datatypes/H5Ex_T_StringAttribute.java
+++ b/java/examples/datatypes/H5Ex_T_StringAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/H5Ex_T_VLString.java b/java/examples/datatypes/H5Ex_T_VLString.java
index c8892ba..39be3e5 100644
--- a/java/examples/datatypes/H5Ex_T_VLString.java
+++ b/java/examples/datatypes/H5Ex_T_VLString.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/datatypes/Makefile.am b/java/examples/datatypes/Makefile.am
index 7d95a56..71f7769 100644
--- a/java/examples/datatypes/Makefile.am
+++ b/java/examples/datatypes/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/java/examples/datatypes/Makefile.in b/java/examples/datatypes/Makefile.in
index c8a1bd3..189816e 100644
--- a/java/examples/datatypes/Makefile.in
+++ b/java/examples/datatypes/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java Library Examples Makefile(.in)
 
@@ -405,6 +403,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -526,6 +525,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -705,18 +705,20 @@ check_SCRIPTS = runExample.sh
 TEST_SCRIPT = $(check_SCRIPTS)
 CLEANFILES = classnoinst.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/*.class runExample.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1111,6 +1113,7 @@ clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1118,7 +1121,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/datatypes/runExample.sh.in b/java/examples/datatypes/runExample.sh.in
index f80450e..32e9ade 100644
--- a/java/examples/datatypes/runExample.sh.in
+++ b/java/examples/datatypes/runExample.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 top_builddir=@top_builddir@
@@ -35,7 +33,7 @@ nerrors=0
 
 # where the libs exist
 HDFLIB_HOME="$top_srcdir/java/lib"
-BLDLIBDIR="./lib"
+BLDLIBDIR="$top_builddir/hdf5/lib"
 BLDDIR="."
 HDFTEST_HOME="$top_srcdir/java/examples/datatypes"
 JARFILE=jar at PACKAGE_TARNAME@- at PACKAGE_VERSION@.jar
@@ -158,6 +156,7 @@ CLEAN_DATAFILES_AND_BLDDIR()
 {
         $RM $BLDDIR/examples.datatypes.H5Ex_T_*.txt
         $RM $BLDDIR/H5Ex_T_*.out
+        $RM $BLDDIR/H5Ex_T_*.h5
 }
 
 # Print a line-line message left justified in a field of 70 characters
diff --git a/java/examples/groups/CMakeLists.txt b/java/examples/groups/CMakeLists.txt
index 1d61614..bb5f80f 100644
--- a/java/examples/groups/CMakeLists.txt
+++ b/java/examples/groups/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDFJAVA_EXAMPLES_GROUPS Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -20,16 +20,16 @@ set (HDF_JAVA_EXAMPLES
 
 if (WIN32)
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
-else (WIN32)
+else ()
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
-endif (WIN32)
+endif ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}")
-endforeach (CMAKE_INCLUDE_PATH)
+endforeach ()
 
 foreach (example ${HDF_JAVA_EXAMPLES})
   file (WRITE ${PROJECT_BINARY_DIR}/${example}_Manifest.txt
@@ -41,14 +41,14 @@ foreach (example ${HDF_JAVA_EXAMPLES})
 #  install_jar (${example} ${HJAVA_INSTALL_DATA_DIR}/examples examples)
   get_target_property (${example}_CLASSPATH ${example} CLASSDIR)
   add_dependencies (${example} ${HDF5_JAVA_HDF5_LIB_TARGET})
-endforeach (example ${HDF_JAVA_EXAMPLES})
+endforeach ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_NOP_JAR}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (HDFJAVA_JAR ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFJAVA_JAR}")
-endforeach (HDFJAVA_JAR)
+endforeach ()
 
 set (HDF_JAVA_TEST_FILES
     h5ex_g_iterate.h5
@@ -56,20 +56,18 @@ set (HDF_JAVA_TEST_FILES
 )
 
 foreach (h5_file ${HDF_JAVA_TEST_FILES})
-  set (dest "${PROJECT_BINARY_DIR}/${h5_file}")
-  #message (STATUS " Copying ${h5_file}")
-  add_custom_command (
-      TARGET     H5Ex_G_Visit
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/${h5_file} ${dest}
-  )
-endforeach (h5_file ${HDF_JAVA_TEST_FILES})
+  HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "H5Ex_G_Visit_files")
+endforeach ()
+add_custom_target(H5Ex_G_Visit_files ALL COMMENT "Copying files needed by H5Ex_G_Visit tests" DEPENDS ${H5Ex_G_Visit_files_list})
 
 MACRO (ADD_H5_TEST resultfile resultcode)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
-  endif(CMAKE_BUILD_TYPE MATCHES Debug)
+    if (WIN32)
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_D;")
+    else ()
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
+    endif ()
+  endif ()
   add_test (
       NAME JAVA_groups-${resultfile}
       COMMAND "${CMAKE_COMMAND}"
@@ -86,23 +84,12 @@ MACRO (ADD_H5_TEST resultfile resultcode)
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (JAVA_groups-${resultfile} PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "JAVA_groups-${resultfile}")
-ENDMACRO (ADD_H5_TEST file)
+ENDMACRO ()
 
 if (BUILD_TESTING)
   foreach (example ${HDF_JAVA_EXAMPLES})
-    add_test (
-        NAME JAVA_groups-${example}-clear-objects
-        COMMAND    ${CMAKE_COMMAND}
-            -E remove
-            ${example}.out
-            ${example}.out.err
-    )
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (JAVA_groups-${example}-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "JAVA_groups-${example}-clear-objects")
     if (NOT ${example} STREQUAL "H5Ex_G_Iterate" AND NOT ${example} STREQUAL "H5Ex_G_Visit")
       if (${example} STREQUAL "H5Ex_G_Compact")
         add_test (
@@ -112,19 +99,19 @@ if (BUILD_TESTING)
                 ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}1.h5
                 ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}2.h5
         )
-      else (${example} STREQUAL "H5Ex_G_Compact")
+      else ()
         add_test (
             NAME JAVA_groups-${example}-clear-h5s
             COMMAND    ${CMAKE_COMMAND}
                 -E remove
                 ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.h5
         )
-      endif (${example} STREQUAL "H5Ex_G_Compact")
+      endif ()
       if (NOT "${last_test}" STREQUAL "")
         set_tests_properties (JAVA_groups-${example}-clear-h5s PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
+      endif ()
       set (last_test "JAVA_groups-${example}-clear-h5s")
-    endif (NOT ${example} STREQUAL "H5Ex_G_Iterate" AND NOT ${example} STREQUAL "H5Ex_G_Visit")
+    endif ()
     add_test (
         NAME JAVA_groups-${example}-copy-objects
         COMMAND    ${CMAKE_COMMAND}
@@ -134,8 +121,8 @@ if (BUILD_TESTING)
     )
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (JAVA_groups-${example}-copy-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     set (last_test "JAVA_groups-${example}-copy-objects")
     ADD_H5_TEST (${example} 0)
-  endforeach (example ${HDF_JAVA_EXAMPLES})
-endif (BUILD_TESTING)
+  endforeach ()
+endif ()
diff --git a/java/examples/groups/H5Ex_G_Compact.java b/java/examples/groups/H5Ex_G_Compact.java
index ca9b6c8..7e20c2a 100644
--- a/java/examples/groups/H5Ex_G_Compact.java
+++ b/java/examples/groups/H5Ex_G_Compact.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Corder.java b/java/examples/groups/H5Ex_G_Corder.java
index 95790bf..53d0011 100644
--- a/java/examples/groups/H5Ex_G_Corder.java
+++ b/java/examples/groups/H5Ex_G_Corder.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /************************************************************
     Creating a file with creation properties and traverse the
diff --git a/java/examples/groups/H5Ex_G_Create.java b/java/examples/groups/H5Ex_G_Create.java
index 1902d86..0e729d5 100644
--- a/java/examples/groups/H5Ex_G_Create.java
+++ b/java/examples/groups/H5Ex_G_Create.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Intermediate.java b/java/examples/groups/H5Ex_G_Intermediate.java
index a3d620b..f7d5a50 100644
--- a/java/examples/groups/H5Ex_G_Intermediate.java
+++ b/java/examples/groups/H5Ex_G_Intermediate.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Iterate.java b/java/examples/groups/H5Ex_G_Iterate.java
index d0b4ea4..3c9ca82 100644
--- a/java/examples/groups/H5Ex_G_Iterate.java
+++ b/java/examples/groups/H5Ex_G_Iterate.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Phase.java b/java/examples/groups/H5Ex_G_Phase.java
index f23d6f2..bfb775b 100644
--- a/java/examples/groups/H5Ex_G_Phase.java
+++ b/java/examples/groups/H5Ex_G_Phase.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Traverse.java b/java/examples/groups/H5Ex_G_Traverse.java
index b00fe97..2a2cba3 100644
--- a/java/examples/groups/H5Ex_G_Traverse.java
+++ b/java/examples/groups/H5Ex_G_Traverse.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/H5Ex_G_Visit.java b/java/examples/groups/H5Ex_G_Visit.java
index c2367a6..f91c707 100644
--- a/java/examples/groups/H5Ex_G_Visit.java
+++ b/java/examples/groups/H5Ex_G_Visit.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/groups/Makefile.am b/java/examples/groups/Makefile.am
index be15b42..08721e0 100644
--- a/java/examples/groups/Makefile.am
+++ b/java/examples/groups/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/java/examples/groups/Makefile.in b/java/examples/groups/Makefile.in
index 575e562..129415d 100644
--- a/java/examples/groups/Makefile.in
+++ b/java/examples/groups/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java Library Examples Makefile(.in)
 
@@ -405,6 +403,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -526,6 +525,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -694,18 +694,20 @@ check_SCRIPTS = runExample.sh
 TEST_SCRIPT = $(check_SCRIPTS)
 CLEANFILES = classnoinst.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/*.class runExample.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1100,6 +1102,7 @@ clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1107,7 +1110,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/groups/runExample.sh.in b/java/examples/groups/runExample.sh.in
index 7dddc6d..3732e7f 100644
--- a/java/examples/groups/runExample.sh.in
+++ b/java/examples/groups/runExample.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 top_builddir=@top_builddir@
@@ -35,7 +33,7 @@ nerrors=0
 
 # where the libs exist
 HDFLIB_HOME="$top_srcdir/java/lib"
-BLDLIBDIR="./lib"
+BLDLIBDIR="$top_builddir/hdf5/lib"
 BLDREFDIR="./groups"
 BLDDIR="."
 HDFTEST_HOME="$top_srcdir/java/examples/groups"
@@ -153,6 +151,14 @@ CLEAN_DATAFILES_AND_BLDDIR()
 {
         $RM $BLDDIR/examples.groups.H5Ex_G_*.txt
         $RM $BLDDIR/H5Ex_G_*.out
+        $RM $BLDDIR/H5Ex_G_*.h5
+        SDIR=`$DIRNAME $tstfile`
+        INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+        INODE_DDIR=`$LS -i -d $BLDDIR | $AWK -F' ' '{print $1}'`
+        if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then            SDIR=`$DIRNAME $tstfile`
+            $RM $BLDDIR/h5ex_g_iterate.h5
+            $RM $BLDDIR/h5ex_g_visit.h5
+        fi  
 }
 
 COPY_REFFILES="$LIST_REF_FILES"
diff --git a/java/examples/intro/CMakeLists.txt b/java/examples/intro/CMakeLists.txt
index 8679943..9dc4dd7 100644
--- a/java/examples/intro/CMakeLists.txt
+++ b/java/examples/intro/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDFJAVA_EXAMPLES_INTRO Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -20,16 +20,16 @@ set (HDF_JAVA_EXAMPLES
 
 if (WIN32)
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
-else (WIN32)
+else ()
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
-endif (WIN32)
+endif ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}")
-endforeach (CMAKE_INCLUDE_PATH)
+endforeach ()
 
 foreach (example ${HDF_JAVA_EXAMPLES})
   file (WRITE ${PROJECT_BINARY_DIR}/${example}_Manifest.txt
@@ -41,14 +41,14 @@ foreach (example ${HDF_JAVA_EXAMPLES})
 #  install_jar (${example} ${HJAVA_INSTALL_DATA_DIR}/examples examples)
   get_target_property (${example}_CLASSPATH ${example} CLASSDIR)
   add_dependencies (${example} ${HDF5_JAVA_HDF5_LIB_TARGET})
-endforeach (example ${HDF_JAVA_EXAMPLES})
+endforeach ()
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_NOP_JAR}")
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (HDFJAVA_JAR ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFJAVA_JAR}")
-endforeach (HDFJAVA_JAR)
+endforeach ()
 
 foreach (example ${HDF_JAVA_OBJECT_EXAMPLES})
   file (WRITE ${PROJECT_BINARY_DIR}/${example}_Manifest.txt
@@ -60,12 +60,16 @@ foreach (example ${HDF_JAVA_OBJECT_EXAMPLES})
 #  install_jar (${example} ${HJAVA_INSTALL_DATA_DIR}/examples examples)
   get_target_property (${example}_CLASSPATH ${example} CLASSDIR)
   add_dependencies (${example} ${HDFJAVA_H5_LIB_TARGET})
-endforeach (example ${HDF_JAVA_OBJECT_EXAMPLES})
+endforeach ()
 
 MACRO (ADD_H5_TEST resultfile resultcode)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
-  endif(CMAKE_BUILD_TYPE MATCHES Debug)
+    if (WIN32)
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_D;")
+    else ()
+      set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
+    endif ()
+  endif ()
   add_test (
       NAME JAVA_intro-${resultfile}
       COMMAND "${CMAKE_COMMAND}"
@@ -82,9 +86,9 @@ MACRO (ADD_H5_TEST resultfile resultcode)
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (JAVA_intro-${resultfile} PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
+  endif ()
   set (last_test "JAVA_intro-${resultfile}")
-ENDMACRO (ADD_H5_TEST file)
+ENDMACRO ()
 
 if (BUILD_TESTING)
 
@@ -94,12 +98,10 @@ if (BUILD_TESTING)
         COMMAND    ${CMAKE_COMMAND}
             -E remove
             ${HDFJAVA_EXAMPLES_BINARY_DIR}/${example}.h5
-            ${example}.out
-            ${example}.out.err
     )
     if (NOT "${last_test}" STREQUAL "")
       set_tests_properties (JAVA_intro-${example}-clear-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
+    endif ()
     add_test (
         NAME JAVA_intro-${example}-copy-objects
         COMMAND    ${CMAKE_COMMAND}
@@ -110,6 +112,6 @@ if (BUILD_TESTING)
     set_tests_properties (JAVA_intro-${example}-copy-objects PROPERTIES DEPENDS JAVA_intro-${example}-clear-objects)
     set (last_test "JAVA_intro-${example}-copy-objects")
     ADD_H5_TEST (${example} 0)
-  endforeach (example ${HDF_JAVA_EXAMPLES})
+  endforeach ()
 
-endif (BUILD_TESTING)
+endif ()
diff --git a/java/examples/intro/H5_CreateAttribute.java b/java/examples/intro/H5_CreateAttribute.java
index 16c53d6..68749b1 100644
--- a/java/examples/intro/H5_CreateAttribute.java
+++ b/java/examples/intro/H5_CreateAttribute.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_CreateDataset.java b/java/examples/intro/H5_CreateDataset.java
index a16cfe6..3572a31 100644
--- a/java/examples/intro/H5_CreateDataset.java
+++ b/java/examples/intro/H5_CreateDataset.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_CreateFile.java b/java/examples/intro/H5_CreateFile.java
index eb9f277..a8c87ea 100644
--- a/java/examples/intro/H5_CreateFile.java
+++ b/java/examples/intro/H5_CreateFile.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_CreateGroup.java b/java/examples/intro/H5_CreateGroup.java
index 36bd49a..9359605 100644
--- a/java/examples/intro/H5_CreateGroup.java
+++ b/java/examples/intro/H5_CreateGroup.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_CreateGroupAbsoluteRelative.java b/java/examples/intro/H5_CreateGroupAbsoluteRelative.java
index e0127cc..ddc069f 100644
--- a/java/examples/intro/H5_CreateGroupAbsoluteRelative.java
+++ b/java/examples/intro/H5_CreateGroupAbsoluteRelative.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_CreateGroupDataset.java b/java/examples/intro/H5_CreateGroupDataset.java
index 0607bbd..bdb0546 100644
--- a/java/examples/intro/H5_CreateGroupDataset.java
+++ b/java/examples/intro/H5_CreateGroupDataset.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/H5_ReadWrite.java b/java/examples/intro/H5_ReadWrite.java
index 0d73884..5a7dabc 100644
--- a/java/examples/intro/H5_ReadWrite.java
+++ b/java/examples/intro/H5_ReadWrite.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /************************************************************
diff --git a/java/examples/intro/Makefile.am b/java/examples/intro/Makefile.am
index 3d5757a..95743d9 100644
--- a/java/examples/intro/Makefile.am
+++ b/java/examples/intro/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/java/examples/intro/Makefile.in b/java/examples/intro/Makefile.in
index e1cc51a..ffaa3cc 100644
--- a/java/examples/intro/Makefile.in
+++ b/java/examples/intro/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java Library Examples Makefile(.in)
 
@@ -405,6 +403,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -526,6 +525,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -694,18 +694,20 @@ check_SCRIPTS = runExample.sh
 TEST_SCRIPT = $(check_SCRIPTS)
 CLEANFILES = classnoinst.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/*.class runExample.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1100,6 +1102,7 @@ clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1107,7 +1110,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/examples/intro/runExample.sh.in b/java/examples/intro/runExample.sh.in
index 60ea765..4533a1b 100644
--- a/java/examples/intro/runExample.sh.in
+++ b/java/examples/intro/runExample.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 top_builddir=@top_builddir@
@@ -35,7 +33,7 @@ nerrors=0
 
 # where the libs exist
 HDFLIB_HOME="$top_srcdir/java/lib"
-BLDLIBDIR="./lib"
+BLDLIBDIR="$top_builddir/hdf5/lib"
 BLDDIR="."
 HDFTEST_HOME="$top_srcdir/java/examples/intro"
 JARFILE=jar at PACKAGE_TARNAME@- at PACKAGE_VERSION@.jar
@@ -147,6 +145,7 @@ CLEAN_DATAFILES_AND_BLDDIR()
 {
         $RM $BLDDIR/examples.intro.H5_*.txt
         $RM $BLDDIR/H5_*.out
+        $RM $BLDDIR/H5_*.h5
 }
 
 # Print a line-line message left justified in a field of 70 characters
diff --git a/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReference.txt b/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReference.txt
index 827c042..d8afa56 100644
--- a/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReference.txt
+++ b/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReference.txt
@@ -1,4 +1,4 @@
 DS1[0]:
-  ->H5G_GROUP: 
+  ->H5G_GROUP: /G1
 DS1[1]:
-  ->H5G_DATASET: 
+  ->H5G_DATASET: /DS2
diff --git a/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReferenceAttribute.txt b/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReferenceAttribute.txt
index fe3cdc0..3fabd66 100644
--- a/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReferenceAttribute.txt
+++ b/java/examples/testfiles/examples.datatypes.H5Ex_T_ObjectReferenceAttribute.txt
@@ -1,4 +1,4 @@
 A1[0]:
-  ->H5G_GROUP: 
+  ->H5G_GROUP: /G1
 A1[1]:
-  ->H5G_DATASET: 
+  ->H5G_DATASET: /DS2
diff --git a/java/src/CMakeLists.txt b/java/src/CMakeLists.txt
index ae78201..3f93f39 100644
--- a/java/src/CMakeLists.txt
+++ b/java/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.1.0)
+cmake_minimum_required(VERSION 3.2.2)
 PROJECT ( HDF5_JAVA_SRC C Java )
 
 #-----------------------------------------------------------------------------
diff --git a/java/src/Makefile.am b/java/src/Makefile.am
index 21aa5ec..64eef0c 100644
--- a/java/src/Makefile.am
+++ b/java/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -130,6 +128,7 @@ CLEANFILES = classhdf5_java.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/callbacks/*.
 clean:
 	rm -rf $(JAVAROOT)/*
 	rm -f $(jarfile)
+	rm -rf javadoc
 	rm -f classhdf5_java.stamp
 
 
diff --git a/java/src/Makefile.in b/java/src/Makefile.in
index 59ad7e3..5877d3f 100644
--- a/java/src/Makefile.in
+++ b/java/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # 
 # This makefile mostly just reinvokes make in the various subdirectories
@@ -297,6 +295,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -418,6 +417,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -1038,6 +1038,7 @@ docs:
 clean:
 	rm -rf $(JAVAROOT)/*
 	rm -f $(jarfile)
+	rm -rf javadoc
 	rm -f classhdf5_java.stamp
 
 # Clean examples when check-clean is invoked
diff --git a/java/src/hdf/CMakeLists.txt b/java/src/hdf/CMakeLists.txt
index f465da9..84bda53 100644
--- a/java/src/hdf/CMakeLists.txt
+++ b/java/src/hdf/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_JAVA_HDF)
 
 add_subdirectory (${HDF5_JAVA_HDF_SOURCE_DIR}/hdf5lib     hdf5lib)
diff --git a/java/src/hdf/hdf5lib/CMakeLists.txt b/java/src/hdf/hdf5lib/CMakeLists.txt
index a4a156a..c856c04 100644
--- a/java/src/hdf/hdf5lib/CMakeLists.txt
+++ b/java/src/hdf/hdf5lib/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_JAVA_HDF_HDF5 Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -14,7 +14,7 @@ SET_GLOBAL_VARIABLE (HDF5_JAVA_SOURCE_PACKAGES
     "${HDF5_JAVA_SOURCE_PACKAGES};hdf.hdf5lib.callbacks;hdf.hdf5lib.exceptions;hdf.hdf5lib.structs;hdf.hdf5lib"
 )
 
-set (HDF5_JAVA_HDF_HDF5_CALLBACKS_SRCS
+set (HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES
     callbacks/H5A_iterate_cb.java
     callbacks/H5A_iterate_t.java
     callbacks/H5D_append_cb.java
@@ -45,7 +45,7 @@ set (HDF5_JAVA_HDF_HDF5_CALLBACKS_SRCS
     callbacks/Callbacks.java
 )
 
-set (HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SRCS
+set (HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES
     exceptions/HDF5Exception.java
     exceptions/HDF5AtomException.java
     exceptions/HDF5AttributeException.java
@@ -72,7 +72,7 @@ set (HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SRCS
     exceptions/HDF5SymbolTableException.java
 )
 
-set (HDF5_JAVA_HDF_HDF5_STRUCTS_SRCS
+set (HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES
     structs/H5_ih_info_t.java
     structs/H5A_info_t.java
     structs/H5AC_cache_config_t.java
@@ -84,7 +84,7 @@ set (HDF5_JAVA_HDF_HDF5_STRUCTS_SRCS
     structs/H5O_info_t.java
 )
 
-set (HDF5_JAVA_HDF_HDF5_SRCS
+set (HDF5_JAVA_HDF_HDF5_SOURCES
     HDFArray.java
     HDF5Constants.java
     HDF5GroupInfo.java
@@ -101,11 +101,11 @@ file (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_LOGGING_JAR}")
 
-add_jar (${HDF5_JAVA_HDF5_LIB_TARGET} OUTPUT_NAME "${HDF5_JAVA_HDF5_LIB_TARGET}-${HDF5_PACKAGE_VERSION}" OUTPUT_DIR ${CMAKE_JAVA_TARGET_OUTPUT_DIR} MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt ${HDF5_JAVA_HDF_HDF5_CALLBACKS_SRCS} ${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SRCS} ${HDF5_JAVA_HDF_HDF5_STRUCTS_SRCS} ${HDF5_JAVA_HDF_HDF5_SRCS})
+add_jar (${HDF5_JAVA_HDF5_LIB_TARGET} OUTPUT_NAME "${HDF5_JAVA_HDF5_LIB_TARGET}-${HDF5_PACKAGE_VERSION}" OUTPUT_DIR ${CMAKE_JAVA_TARGET_OUTPUT_DIR} MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt ${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES} ${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES} ${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES} ${HDF5_JAVA_HDF_HDF5_SOURCES})
 install_jar (${HDF5_JAVA_HDF5_LIB_TARGET} LIBRARY DESTINATION ${HDF5_INSTALL_JAR_DIR} COMPONENT libraries)
 #if (NOT WIN32)
 #  install_jni_symlink (${HDF5_JAVA_HDF5_LIB_TARGET} ${HDF5_INSTALL_JAR_DIR} libraries)
-#endif (NOT WIN32)
+#endif ()
 
 get_target_property (${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE ${HDF5_JAVA_HDF5_LIB_TARGET} JAR_FILE)
 SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS_TO_EXPORT "${HDF5_JAVA_JARS_TO_EXPORT};${${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE}")
@@ -115,7 +115,7 @@ add_dependencies (${HDF5_JAVA_HDF5_LIB_TARGET} ${HDF5_JAVA_JNI_LIB_TARGET})
 set_target_properties (${HDF5_JAVA_HDF5_LIB_TARGET} PROPERTIES FOLDER libraries/java)
 
 create_javadoc(hdf5_java_doc
-    FILES ${HDF5_JAVA_HDF_HDF5_CALLBACKS_SRCS} ${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SRCS} ${HDF5_JAVA_HDF_HDF5_STRUCTS_SRCS} ${HDF5_JAVA_HDF_HDF5_SRCS}
+    FILES ${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES} ${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES} ${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES} ${HDF5_JAVA_HDF_HDF5_SOURCES}
     OVERVIEW ${HDF5_JAVA_HDF5_SRC_DIR}/overview.html
     CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
     WINDOWTITLE "HDF5 Java"
diff --git a/java/src/hdf/hdf5lib/H5.java b/java/src/hdf/hdf5lib/H5.java
index 08589c2..1f0dd3a 100644
--- a/java/src/hdf/hdf5lib/H5.java
+++ b/java/src/hdf/hdf5lib/H5.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -151,7 +149,7 @@ import hdf.hdf5lib.structs.H5O_info_t;
  * layout of the source and destination, and the data for the array passed as a block of bytes, for instance,
  *
  * <pre>
- *      herr_t H5Dread(int fid, int filetype, int memtype, int memspace,
+ *      herr_t H5Dread(long fid, long filetype, long memtype, long memspace,
  *      void * data);
  * </pre>
  *
@@ -171,7 +169,7 @@ import hdf.hdf5lib.structs.H5O_info_t;
  * library. So the function above would be declared:
  *
  * <pre>
- * public synchronized static native int H5Dread(int fid, int filetype, int memtype, int memspace, Object data);
+ * public synchronized static native int H5Dread(long fid, long filetype, long memtype, long memspace, Object data);
  * </pre>
  *            OPEN_IDS.addElement(id);
 
@@ -192,7 +190,7 @@ import hdf.hdf5lib.structs.H5O_info_t;
  * can be accessed as public variables of the Java class, such as:
  *
  * <pre>
- * int data_type = HDF5CDataTypes.JH5T_NATIVE_INT;
+ * long data_type = HDF5CDataTypes.JH5T_NATIVE_INT;
  * </pre>
  *
  * The Java application uses both types of constants the same way, the only difference is that the
@@ -216,7 +214,7 @@ import hdf.hdf5lib.structs.H5O_info_t;
  * exception handlers to print out the HDF-5 error stack.
  * <hr>
  *
- * @version HDF5 1.10 <BR>
+ * @version HDF5 1.10.1 <BR>
  *          <b>See also: <a href ="./hdf.hdf5lib.HDFArray.html"> hdf.hdf5lib.HDFArray</a> </b><BR>
  *          <a href ="./hdf.hdf5lib.HDF5Constants.html"> hdf.hdf5lib.HDF5Constants</a><BR>
  *          <a href ="./hdf.hdf5lib.HDF5CDataTypes.html"> hdf.hdf5lib.HDF5CDataTypes</a><BR>
@@ -239,7 +237,7 @@ public class H5 implements java.io.Serializable {
      *
      * Make sure to update the versions number when a different library is used.
      */
-    public final static int LIB_VERSION[] = { 1, 10, 0 };
+    public final static int LIB_VERSION[] = { 1, 10, 1 };
 
     public final static String H5PATH_PROPERTY_KEY = "hdf.hdf5lib.H5.hdf5lib";
 
@@ -645,7 +643,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public synchronized static native int H5Adelete(long loc_id, String name) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     /**
      * H5Adelete_by_idx removes an attribute, specified by its location in an index, from an object.
@@ -710,7 +708,7 @@ public class H5 implements java.io.Serializable {
      *                - attr_name is null.
      **/
     public synchronized static native boolean H5Aexists(long obj_id, String attr_name) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     /**
      * H5Aexists_by_name determines whether the attribute attr_name exists on an object. That object is specified by its
@@ -915,7 +913,7 @@ public class H5 implements java.io.Serializable {
      *                - Name is null.
      **/
     public static long H5Aopen(long obj_id, String attr_name, long aapl_id) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         long id = _H5Aopen(obj_id, attr_name, aapl_id);
         if (id > 0) {
             log.trace("OPEN_IDS: H5Aopen add {}", id);
@@ -1043,7 +1041,7 @@ public class H5 implements java.io.Serializable {
      *                - data buffer is null. See public synchronized static native int H5Aread( )
      **/
     public synchronized static int H5Aread(long attr_id, long mem_type_id, Object obj) throws HDF5Exception,
-    NullPointerException {
+            NullPointerException {
         HDFArray theArray = new HDFArray(obj);
         byte[] buf = theArray.emptyBytes();
 
@@ -1061,6 +1059,9 @@ public class H5 implements java.io.Serializable {
     public synchronized static native int H5AreadVL(long attr_id, long mem_type_id, String[] buf)
             throws HDF5LibraryException, NullPointerException;
 
+    public synchronized static native int H5AreadComplex(long attr_id, long mem_type_id, String[] buf)
+            throws HDF5LibraryException, NullPointerException;
+
     /**
      * H5Arename changes the name of attribute that is attached to the object specified by loc_id. The attribute named
      * old_attr_name is renamed new_attr_name.
@@ -1507,7 +1508,7 @@ public class H5 implements java.io.Serializable {
      *                - Error from the HDF-5 Library.
      **/
     public synchronized static native long H5Dget_storage_size(long dataset_id) throws HDF5LibraryException,
-    IllegalArgumentException;
+            IllegalArgumentException;
 
     /**
      * H5Dget_type returns an identifier for a copy of the datatype for a dataset.
@@ -1732,7 +1733,7 @@ public class H5 implements java.io.Serializable {
             status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf,
                     isCriticalPinning);
             if (status >= 0) {
-                // convert the data into a Java Array */
+                // convert the data into a Java Array
                 obj = theArray.arrayify(buf);
             }
 
@@ -1795,6 +1796,9 @@ public class H5 implements java.io.Serializable {
         return H5Dread_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true);
     }
 
+    public synchronized static native int H5DreadVL(long dataset_id, long mem_type_id, long mem_space_id,
+            long file_space_id, long xfer_plist_id, Object[] buf) throws HDF5LibraryException, NullPointerException;
+
     public synchronized static native int H5Dread_string(long dataset_id, long mem_type_id, long mem_space_id,
             long file_space_id, long xfer_plist_id, String[] buf) throws HDF5LibraryException, NullPointerException;
 
@@ -2473,7 +2477,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public static long H5Fopen(String name, int flags, long access_id) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         long id = _H5Fopen(name, flags, access_id);
         if (id > 0) {
             log.trace("OPEN_IDS: H5Fopen add {}", id);
@@ -2544,7 +2548,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public static long H5Fcreate(String name, int flags, long create_id, long access_id) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         long id = _H5Fcreate(name, flags, create_id, access_id);
         if (id > 0) {
             log.trace("OPEN_IDS: H5Fcreate add {}", id);
@@ -3323,7 +3327,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      */
     public synchronized static long H5Gn_members(long loc_id, String name) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         long grp_id = H5Gopen(loc_id, name, HDF5Constants.H5P_DEFAULT);
         long n = -1;
 
@@ -3403,8 +3407,22 @@ public class H5 implements java.io.Serializable {
 
     public synchronized static native long H5Iget_file_id(long obj_id) throws HDF5LibraryException;
 
-    public synchronized static native long H5Iget_name(long obj_id, String[] name, long size)
+    @Deprecated
+    public synchronized static native long H5Iget_name_long(long obj_id, String[] name, long size)
             throws HDF5LibraryException, NullPointerException;
+    /**
+     * H5Iget_name_str retrieves the name of an object specified by the identifier, obj_id.
+     *
+     * @param obj_id
+     *            IN: Identifier of the object.
+     *
+     * @return String for Attribute name.
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native String H5Iget_name(long obj_id)
+            throws HDF5LibraryException;
 
     public synchronized static native int H5Iget_ref(long obj_id) throws HDF5LibraryException, NullPointerException;
 
@@ -4112,8 +4130,6 @@ public class H5 implements java.io.Serializable {
     public synchronized static native String H5Oget_comment_by_name(long loc_id, String name, long lapl_id)
             throws HDF5LibraryException, IllegalArgumentException, NullPointerException;
 
-    // long H5Oget_comment_by_name(int loc_id, String name, String comment, long bufsize, int lapl_id);
-
     /**
      * H5Oset_comment_by_name sets the comment for the specified object.
      *
@@ -4151,7 +4167,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public synchronized static native H5O_info_t H5Oget_info(long loc_id) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     /**
      * H5Oget_info_by_idx retrieves the metadata for an object, identifying the object by an index position.
@@ -4472,6 +4488,20 @@ public class H5 implements java.io.Serializable {
     private synchronized static native long _H5Pcreate(long type) throws HDF5LibraryException;
 
     /**
+     * H5Pget retrieves a copy of the value for a property in a property list (support integer only)
+     *
+     * @param plid
+     *            IN: Identifier of property object to query
+     * @param name
+     *            IN: Name of property to query
+     * @return value for a property if successful; a negative value if failed
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     */
+    public synchronized static native int H5Pget(long plid, String name) throws HDF5LibraryException;
+
+    /**
      * Sets a property list value (support integer only)
      *
      * @param plid
@@ -4552,20 +4582,6 @@ public class H5 implements java.io.Serializable {
     public synchronized static native long H5Pget_class_parent(long plid) throws HDF5LibraryException;
 
     /**
-     * H5Pget retrieves a copy of the value for a property in a property list (support integer only)
-     *
-     * @param plid
-     *            IN: Identifier of property object to query
-     * @param name
-     *            IN: Name of property to query
-     * @return value for a property if successful; a negative value if failed
-     *
-     * @exception HDF5LibraryException
-     *                - Error from the HDF-5 Library.
-     */
-    public synchronized static native int H5Pget(long plid, String name) throws HDF5LibraryException;
-
-    /**
      * H5Pequal determines if two property lists or classes are equal
      *
      * @param plid1
@@ -5341,39 +5357,24 @@ public class H5 implements java.io.Serializable {
             throws HDF5LibraryException, IllegalArgumentException;
 
     /**
-     * H5Pset_file_space sets the file space management strategy for the file associated with fcpl_id to strategy.
+     * H5Pset_file_space_strategy sets the file space management strategy for the file associated with fcpl_id to strategy.
      * There are four strategies that applications can select and they are described in the Parameters section.
      *
      * @param fcpl_id
      *            IN: File creation property list identifier
      * @param strategy
      *            IN: The strategy for file space management.
-     *                Passing a value of zero (0) indicates that the value of strategy is not to be modified.
-     *                H5F_FILE_SPACE_ALL_PERSIST
-     *                        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. 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.
-     *                H5F_FILE_SPACE_ALL     (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.
-     *                        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.
-     *                H5F_FILE_SPACE_AGGR_VFD
-     *                        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.
-     *                        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.
-     *                H5F_FILE_SPACE_VFD
-     *                        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.
-     *                        When space is needed for file metadata or raw data, the library requests space from the virtual file driver.
+     *                H5F_FSPACE_STRATEGY_FSM_AGGR
+     *                        Mechanisms: free-space managers, aggregators, and virtual file drivers
+     *                        This is the library default when not set.
+     *                H5F_FSPACE_STRATEGY_PAGE
+     *                        Mechanisms: free-space managers with embedded paged aggregation and virtual file drivers
+     *                H5F_FSPACE_STRATEGY_AGGR
+     *                        Mechanisms: aggregators and virtual file drivers
+     *                H5F_FSPACE_STRATEGY_NONE
+     *                        Mechanisms: virtual file drivers
+     * @param persist
+     *            IN: True to persist free-space.
      * @param threshold
      *            IN: The free-space section threshold. The library default is 1, which is to track all free-space sections.
      *                Passing a value of zero (0) indicates that the value of threshold is not to be modified.
@@ -5384,28 +5385,100 @@ public class H5 implements java.io.Serializable {
      *                - Invalid values of max_list and min_btree.
      *
      **/
-    public synchronized static native void H5Pset_file_space(long fcpl_id, int strategy, long threshold)
+    public synchronized static native void H5Pset_file_space_strategy(long fcpl_id, int strategy, boolean persist, long threshold)
             throws HDF5LibraryException, IllegalArgumentException;
 
     /**
-     * H5Pget_file_space provides the means for applications to manage the HDF5 file's file space for their specific needs.
+     * H5Pget_file_space_strategy provides the means for applications to manage the HDF5 file's file space strategy for their specific needs.
      *
      * @param fcpl_id
      *            IN: File creation property list identifier
-     * @param strategy
-     *            IN/OUT: The current file space management strategy in use for the file. NULL, strategy not queried.
+     * @param persist
+     *            IN/OUT: The current free-space persistence. NULL, persist not queried.
      * @param threshold
      *            IN/OUT: The current free-space section threshold. NULL, threshold not queried.
      *
+     * @return the current free-space strategy.
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     * @exception IllegalArgumentException
+     *                - Invalid values of max_list and min_btree.
+     *
+     **/
+    public synchronized static native int H5Pget_file_space_strategy(long fcpl_id, boolean[] persist, long[] threshold)
+            throws HDF5LibraryException, IllegalArgumentException;
+
+    /**
+     * H5Pget_file_space_strategy_persist provides the means for applications to manage the HDF5 file's file space strategy for their specific needs.
+     *
+     * @param fcpl_id
+     *            IN: File creation property list identifier
+     *
+     * @return the current free-space persistence.
+     *
      * @exception HDF5LibraryException
      *                - Error from the HDF-5 Library.
      * @exception IllegalArgumentException
      *                - Invalid values of max_list and min_btree.
      *
      **/
-    public synchronized static native void H5Pget_file_space(long fcpl_id, int[] strategy, long[] threshold)
+    public synchronized static native boolean H5Pget_file_space_strategy_persist(long fcpl_id)
             throws HDF5LibraryException, IllegalArgumentException;
 
+    /**
+     * H5Pget_file_space_strategy_threshold provides the means for applications to manage the HDF5 file's file space strategy for their specific needs.
+     *
+     * @param fcpl_id
+     *            IN: File creation property list identifier
+     *
+     * @return the current free-space section threshold.
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     * @exception IllegalArgumentException
+     *                - Invalid values of max_list and min_btree.
+     *
+     **/
+   public synchronized static native long H5Pget_file_space_strategy_threshold(long fcpl_id)
+            throws HDF5LibraryException, IllegalArgumentException;
+
+   /**
+    * H5Pset_file_space_page_size retrieves the file space page size for aggregating small metadata or raw data.
+    *
+    * @param fcpl_id
+    *            IN: File creation property list identifier
+    * @param page_size
+    *            IN: the file space page size.
+    *
+    *
+    * @exception HDF5LibraryException
+    *                - Error from the HDF-5 Library.
+    * @exception IllegalArgumentException
+    *                - Invalid values of max_list and min_btree.
+    *
+    **/
+  public synchronized static native void H5Pset_file_space_page_size(long fcpl_id, long page_size)
+           throws HDF5LibraryException, IllegalArgumentException;
+
+   /**
+    * H5Pget_file_space_page_size Sets the file space page size for paged aggregation.
+    *
+    * @param fcpl_id
+    *            IN: File creation property list identifier
+    *
+    * @return the current file space page size.
+    *
+    * @exception HDF5LibraryException
+    *                - Error from the HDF-5 Library.
+    * @exception IllegalArgumentException
+    *                - Invalid values of max_list and min_btree.
+    *
+    **/
+  public synchronized static native long H5Pget_file_space_page_size(long fcpl_id)
+           throws HDF5LibraryException, IllegalArgumentException;
+
+
     // File access property list (FAPL) routines
 
     /**
@@ -7028,7 +7101,7 @@ public class H5 implements java.io.Serializable {
 
     // File access property list (FAPL) routines //
     // herr_t H5Pset_driver( hid_t plist_id, hid_t new_driver_id, const void *new_driver_info )
-    // void *H5Pget_driver_info( hid_t plist_id )
+    // const void *H5Pget_driver_info( hid_t plist_id )
     // herr_t H5Pget_multi_type ( hid_t fapl_id, H5FD_mem_t *type )
     // herr_t H5Pset_multi_type ( hid_t fapl_id, H5FD_mem_t type )
     // herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr);
@@ -7130,6 +7203,88 @@ public class H5 implements java.io.Serializable {
      **/
     public synchronized static native int H5PLget_loading_state() throws HDF5LibraryException;
 
+    /**
+     * H5PLappend inserts the plugin path at the end of the table.
+     *
+     * @param plugin_path
+     *            IN: Path for location of filter plugin libraries.
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native void H5PLappend(String plugin_path) throws HDF5LibraryException;
+
+    /**
+     * H5PLprepend inserts the plugin path at the beginning of the table.
+     *
+     * @param plugin_path
+     *            IN: Path for location of filter plugin libraries.
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native void H5PLprepend(String plugin_path) throws HDF5LibraryException;
+
+    /**
+     * H5PLreplace replaces the plugin path at the specified index.
+     *
+     * @param plugin_path
+     *            IN: Path for location of filter plugin libraries.
+     * @param index
+     *            IN: The table index (0-based).
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native void H5PLreplace(String plugin_path, int index) throws HDF5LibraryException;
+
+    /**
+     * H5PLinsert inserts the plugin path at the specified index.
+     *
+     * @param plugin_path
+     *            IN: Path for location of filter plugin libraries.
+     * @param index
+     *            IN: The table index (0-based).
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native void H5PLinsert(String plugin_path, int index) throws HDF5LibraryException;
+
+    /**
+     * H5PLremove removes the plugin path at the specified index.
+     *
+     * @param index
+     *            IN: The table index (0-based).
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native void H5PLremove(int index) throws HDF5LibraryException;
+
+    /**
+     * H5PLget retrieves the plugin path at the specified index.
+     *
+     * @param index
+     *            IN: The table index (0-based).
+     *
+     * @return the current path at the index in plugin path table
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native String H5PLget(int index) throws HDF5LibraryException;
+
+    /**
+     * H5PLsize retrieves the size of the current list of plugin paths.
+     *
+     * @return the current number of paths in the plugin path table
+     *
+     * @exception HDF5LibraryException
+     *                - Error from the HDF-5 Library.
+     **/
+    public synchronized static native int H5PLsize() throws HDF5LibraryException;
+
     // ////////////////////////////////////////////////////////////
     // //
     // H5R: HDF5 1.8 Reference API Functions //
@@ -7396,7 +7551,7 @@ public class H5 implements java.io.Serializable {
      *                - dims or maxdims is null.
      **/
     public static long H5Screate_simple(int rank, long[] dims, long[] maxdims) throws HDF5Exception,
-    NullPointerException {
+            NullPointerException {
         long id = _H5Screate_simple(rank, dims, maxdims);
         if (id > 0) {
             log.trace("OPEN_IDS: H5Screate_simple add {}", id);
@@ -7688,10 +7843,10 @@ public class H5 implements java.io.Serializable {
      *                - offset array is null.
      **/
     public synchronized static native int H5Soffset_simple(long space_id, byte[] offset) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     public synchronized static int H5Soffset_simple(long space_id, long[] offset) throws HDF5Exception,
-    NullPointerException {
+            NullPointerException {
         if (offset == null) {
             return -1;
         }
@@ -7953,7 +8108,7 @@ public class H5 implements java.io.Serializable {
      *                - dim is null.
      **/
     public static long H5Tarray_create(long base_id, int ndims, long[] dim) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         long id = _H5Tarray_create2(base_id, ndims, dim);
         if (id > 0) {
             log.trace("OPEN_IDS: H5Tarray_create add {}", id);
@@ -8195,7 +8350,7 @@ public class H5 implements java.io.Serializable {
      *                - buf is null.
      **/
     public synchronized static native int H5Tencode(long obj_id, byte[] buf, long nalloc) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     // /**
     // * H5Tencode converts a data type description into binary form in a buffer.
@@ -8269,12 +8424,12 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public static int H5Tenum_insert(long type, String name, int[] value) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         return H5Tenum_insert_int(type, name, value);
     }
 
     public static int H5Tenum_insert(long type, String name, int value) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         int[] val = { value };
         return H5Tenum_insert_int(type, name, val);
     }
@@ -8324,7 +8479,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public static int H5Tenum_nameof(long type, int[] value, String[] name, int size) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         return H5Tenum_nameof_int(type, value, name, size);
     }
 
@@ -8365,7 +8520,7 @@ public class H5 implements java.io.Serializable {
      *                - name is null.
      **/
     public static int H5Tenum_valueof(long type, String name, int[] value) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         return H5Tenum_valueof_int(type, name, value);
     }
 
@@ -8422,7 +8577,7 @@ public class H5 implements java.io.Serializable {
      *                - dims is null.
      **/
     public synchronized static native int H5Tget_array_dims2(long type_id, long[] dims) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     /**
      * H5Tget_array_ndims returns the rank, the number of dimensions, of an array datatype object.
@@ -8621,7 +8776,7 @@ public class H5 implements java.io.Serializable {
      *                - fields array is invalid.
      **/
     public synchronized static native void H5Tget_fields(long type_id, long[] fields) throws HDF5LibraryException,
-    NullPointerException, IllegalArgumentException;
+            NullPointerException, IllegalArgumentException;
 
     /**
      * H5Tget_fields retrieves information about the locations of the various bit fields of a floating point datatype.
@@ -8649,12 +8804,12 @@ public class H5 implements java.io.Serializable {
      *                - fields array is invalid.
      **/
     public static int H5Tget_fields(long type_id, int[] fields) throws HDF5LibraryException, NullPointerException,
-    IllegalArgumentException {
+            IllegalArgumentException {
         return H5Tget_fields_int(type_id, fields);
     }
 
     private synchronized static native int H5Tget_fields_int(long type_id, int[] fields) throws HDF5LibraryException,
-    NullPointerException, IllegalArgumentException;
+            NullPointerException, IllegalArgumentException;
 
     /**
      * H5Tset_fields sets the locations and sizes of the various floating point bit fields.
@@ -8852,7 +9007,7 @@ public class H5 implements java.io.Serializable {
      *                - value is null.
      **/
     public static int H5Tget_member_value(long type_id, int membno, int[] value) throws HDF5LibraryException,
-    NullPointerException {
+            NullPointerException {
         return H5Tget_member_value_int(type_id, membno, value);
     }
 
@@ -9033,7 +9188,7 @@ public class H5 implements java.io.Serializable {
      *                - pad is null.
      **/
     public synchronized static native int H5Tget_pad(long type_id, int[] pad) throws HDF5LibraryException,
-    NullPointerException;
+            NullPointerException;
 
     /**
      * H5Tset_pad sets the least and most-significant bits padding types.
diff --git a/java/src/hdf/hdf5lib/HDF5Constants.java b/java/src/hdf/hdf5lib/HDF5Constants.java
index acd3eb5..8a3d6c8 100644
--- a/java/src/hdf/hdf5lib/HDF5Constants.java
+++ b/java/src/hdf/hdf5lib/HDF5Constants.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -219,12 +217,12 @@ public class HDF5Constants {
     public static final int H5F_SCOPE_GLOBAL = H5F_SCOPE_GLOBAL();
     public static final int H5F_SCOPE_LOCAL = H5F_SCOPE_LOCAL();
     public static final int H5F_UNLIMITED = H5F_UNLIMITED();
-    public static final int H5F_FILE_SPACE_DEFAULT = H5F_FILE_SPACE_DEFAULT();
-    public static final int H5F_FILE_SPACE_ALL_PERSIST = H5F_FILE_SPACE_ALL_PERSIST();
-    public static final int H5F_FILE_SPACE_ALL = H5F_FILE_SPACE_ALL();
-    public static final int H5F_FILE_SPACE_AGGR_VFD = H5F_FILE_SPACE_AGGR_VFD();
-    public static final int H5F_FILE_SPACE_VFD = H5F_FILE_SPACE_VFD();
-    public static final int H5F_FILE_SPACE_NTYPES = H5F_FILE_SPACE_NTYPES();
+
+    public static final int H5F_FSPACE_STRATEGY_FSM_AGGR = H5F_FSPACE_STRATEGY_FSM_AGGR();
+    public static final int H5F_FSPACE_STRATEGY_AGGR = H5F_FSPACE_STRATEGY_AGGR();
+    public static final int H5F_FSPACE_STRATEGY_PAGE = H5F_FSPACE_STRATEGY_PAGE();
+    public static final int H5F_FSPACE_STRATEGY_NONE = H5F_FSPACE_STRATEGY_NONE();
+    public static final int H5F_FSPACE_STRATEGY_NTYPES = H5F_FSPACE_STRATEGY_NTYPES();
 
     public static final long H5FD_CORE = H5FD_CORE();
     public static final long H5FD_DIRECT = H5FD_DIRECT();
@@ -1024,17 +1022,15 @@ public class HDF5Constants {
 
     private static native final int H5F_UNLIMITED();
 
-    private static native final int H5F_FILE_SPACE_DEFAULT();
-
-    private static native final int H5F_FILE_SPACE_ALL_PERSIST();
+    private static native final int H5F_FSPACE_STRATEGY_FSM_AGGR();
 
-    private static native final int H5F_FILE_SPACE_ALL();
+    private static native final int H5F_FSPACE_STRATEGY_AGGR();
 
-    private static native final int H5F_FILE_SPACE_AGGR_VFD();
+    private static native final int H5F_FSPACE_STRATEGY_PAGE();
 
-    private static native final int H5F_FILE_SPACE_VFD();
+    private static native final int H5F_FSPACE_STRATEGY_NONE();
 
-    private static native final int H5F_FILE_SPACE_NTYPES();
+    private static native final int H5F_FSPACE_STRATEGY_NTYPES();
 
     private static native final long H5FD_CORE();
 
diff --git a/java/src/hdf/hdf5lib/HDF5GroupInfo.java b/java/src/hdf/hdf5lib/HDF5GroupInfo.java
index fa33fec..a45cb7c 100644
--- a/java/src/hdf/hdf5lib/HDF5GroupInfo.java
+++ b/java/src/hdf/hdf5lib/HDF5GroupInfo.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/java/src/hdf/hdf5lib/HDFArray.java b/java/src/hdf/hdf5lib/HDFArray.java
index 55c19e4..529aecb 100644
--- a/java/src/hdf/hdf5lib/HDFArray.java
+++ b/java/src/hdf/hdf5lib/HDFArray.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/java/src/hdf/hdf5lib/HDFNativeData.java b/java/src/hdf/hdf5lib/HDFNativeData.java
index 66929fb..9637f62 100644
--- a/java/src/hdf/hdf5lib/HDFNativeData.java
+++ b/java/src/hdf/hdf5lib/HDFNativeData.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib;
diff --git a/java/src/hdf/hdf5lib/callbacks/Callbacks.java b/java/src/hdf/hdf5lib/callbacks/Callbacks.java
index 5757eef..9fc961a 100644
--- a/java/src/hdf/hdf5lib/callbacks/Callbacks.java
+++ b/java/src/hdf/hdf5lib/callbacks/Callbacks.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
index fa390a2..988c8fb 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java
index 4816f8f..51d67d5 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
index 1b66e34..ead8f73 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java b/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java
index dcbd331..8bf6410 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
index bac3dd9..a911a1c 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java
index 03bcc20..d049711 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
index 672d151..afc04ae 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java b/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java
index f3f8a39..0be8977 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_cb.java
index 5218311..ec71911 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
index b7c25f4..28ffb8a 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_cb.java
index 630205f..89cf206 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
index da64f19..1491b09 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
index dcd4ed2..e77d386 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java
index 222bd26..0d5ad9e 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
index 0dc8a94..139f877 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java
index eed29bb..12c2601 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
index 777e302..e64ec6f 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java
index 78973f0..73646f1 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
index 0d98325..5ecb88d 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java
index dbbf80d..2e320b4 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
index 3ea44ac..103fe5f 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
index 0daaca5..46477b9 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
index 4e560e2..57994bb 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
index dc4fee1..8791c22 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
index 9aa27ab..46cd097 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
index bfc7b37..04599a0 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
index c1e9b00..6ac750f 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.callbacks;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5AtomException.java b/java/src/hdf/hdf5lib/exceptions/HDF5AtomException.java
index 3309223..850044c 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5AtomException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5AtomException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
index 8c1a7b8..87b075b 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
index dc82fd9..5118254 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
index 17fd9db..14ae43f 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
index f22c9ec..721d3ef 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
index e39709d..3c55a6b 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
index 531202c..c0182ee 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
index 3c0c144..4da074b 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
index 8a83ca1..1b55437 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
index 62c5dd8..28f5437 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
index 0b63b41..c8dbcea 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
index c984aae..e7f20e0 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
index 5dad930..26e836f 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
index dfe4ced..a32e2a1 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
index 45a836c..25ac572 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
index 2db79ef..7c61194 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
index 8b21ff8..5ae977d 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
index e0a95d0..6d792c3 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
index cbc3b75..02f2d33 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
index 0cdd0d1..2bb6861 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
index aa9f668..b1baaad 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
index 2c8c93b..ea4a89a 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
index f1c0c60..fc92578 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
index 87384d1..b90ce64 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.exceptions;
diff --git a/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java b/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java
index 2128d8a..20863dc 100644
--- a/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5A_info_t.java b/java/src/hdf/hdf5lib/structs/H5A_info_t.java
index b04a757..a46a495 100644
--- a/java/src/hdf/hdf5lib/structs/H5A_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5A_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5E_error2_t.java b/java/src/hdf/hdf5lib/structs/H5E_error2_t.java
index b7cd60a..257ad05 100644
--- a/java/src/hdf/hdf5lib/structs/H5E_error2_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5E_error2_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5F_info2_t.java b/java/src/hdf/hdf5lib/structs/H5F_info2_t.java
index 8fbde68..4664b5b 100644
--- a/java/src/hdf/hdf5lib/structs/H5F_info2_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5F_info2_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5G_info_t.java b/java/src/hdf/hdf5lib/structs/H5G_info_t.java
index daa6808..56c876e 100644
--- a/java/src/hdf/hdf5lib/structs/H5G_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5G_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5L_info_t.java b/java/src/hdf/hdf5lib/structs/H5L_info_t.java
index d43853f..3bbb189 100644
--- a/java/src/hdf/hdf5lib/structs/H5L_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5L_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java b/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java
index 86cf883..a39c1ed 100644
--- a/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5O_info_t.java b/java/src/hdf/hdf5lib/structs/H5O_info_t.java
index a89aaf0..ac32f6a 100644
--- a/java/src/hdf/hdf5lib/structs/H5O_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5O_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java b/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java
index 450f548..ea36d85 100644
--- a/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java
+++ b/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package hdf.hdf5lib.structs;
diff --git a/java/src/jni/CMakeLists.txt b/java/src/jni/CMakeLists.txt
index ef80072..9e6c099 100644
--- a/java/src/jni/CMakeLists.txt
+++ b/java/src/jni/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_JAVA_JNI C CXX)
 
 set (HDF5_JAVA_JNI_CSRCS
@@ -57,6 +57,9 @@ SET_GLOBAL_VARIABLE (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF
 H5_SET_LIB_OPTIONS (${HDF5_JAVA_JNI_LIB_TARGET} ${HDF5_JAVA_JNI_LIB_NAME} SHARED ${HDF5_JAVA_PACKAGE_SOVERSION})
 if (WIN32)
   get_filename_component (HDF5_JAVA_JNI_DLL_NAME ${HDF5_JAVA_JNI_LIB_TARGET} NAME_WE)
+  if (CMAKE_BUILD_TYPE MATCHES Debug)
+    set (HDF5_JAVA_JNI_DLL_NAME "${HDF5_JAVA_JNI_DLL_NAME}_D")
+  endif ()
   # message (STATUS "HDF5_JAVA_JNI_DLL_NAME: ${HDF5_JAVA_JNI_DLL_NAME}")
   if (BUILD_TESTING)
     add_custom_target (HDF5_JAVA_JNI-Test-Copy ALL
@@ -64,8 +67,8 @@ if (WIN32)
         COMMENT "Copying ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/${HDF5_JAVA_JNI_DLL_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/"
     )
     add_dependencies (HDF5_JAVA_JNI-Test-Copy ${HDF5_JAVA_JNI_LIB_TARGET})
-  endif (BUILD_TESTING)
-endif (WIN32)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
@@ -76,10 +79,11 @@ if (HDF5_EXPORTED_TARGETS)
       TARGETS
           ${HDF5_JAVA_JNI_LIB_TARGET}
       EXPORT
-          ${HDF5_JAVA_EXPORTED_TARGETS}
+          ${HDF5_EXPORTED_TARGETS}
       LIBRARY DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
       RUNTIME DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT libraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/java/src/jni/Makefile.am b/java/src/jni/Makefile.am
index 4667407..6ded371 100644
--- a/java/src/jni/Makefile.am
+++ b/java/src/jni/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -31,7 +29,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/java/src/jni $(JNIFLAGS)
 lib_LTLIBRARIES=libhdf5_java.la
 
 # Add libtool numbers to the HDF5 Java (JNI) library (from config/lt_vers.am)
-libhdf5_java_la_LDFLAGS= -version-info $(LT_JAVA_VERS_INTERFACE):$(LT_JAVA_VERS_REVISION):$(LT_JAVA_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_java_la_LDFLAGS = -avoid-version -shared -export-dynamic -version-info $(LT_JAVA_VERS_INTERFACE):$(LT_JAVA_VERS_REVISION):$(LT_JAVA_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library
 libhdf5_java_la_SOURCES=exceptionImp.c h5Constants.c nativeData.c h5util.c h5Imp.c \
diff --git a/java/src/jni/Makefile.in b/java/src/jni/Makefile.in
index 97febf1..929ee47 100644
--- a/java/src/jni/Makefile.in
+++ b/java/src/jni/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java native interface (JNI) Library Makefile(.in)
 #
@@ -464,6 +462,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -585,6 +584,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -730,32 +730,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -767,7 +762,7 @@ JAVA_API = yes
 lib_LTLIBRARIES = libhdf5_java.la
 
 # Add libtool numbers to the HDF5 Java (JNI) library (from config/lt_vers.am)
-libhdf5_java_la_LDFLAGS = -version-info $(LT_JAVA_VERS_INTERFACE):$(LT_JAVA_VERS_REVISION):$(LT_JAVA_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_java_la_LDFLAGS = -avoid-version -shared -export-dynamic -version-info $(LT_JAVA_VERS_INTERFACE):$(LT_JAVA_VERS_REVISION):$(LT_JAVA_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library
 libhdf5_java_la_SOURCES = exceptionImp.c h5Constants.c nativeData.c h5util.c h5Imp.c \
@@ -778,18 +773,20 @@ libhdf5_java_la_SOURCES = exceptionImp.c h5Constants.c nativeData.c h5util.c h5I
 # HDF5 Java (JNI) library depends on HDF5 Library.
 libhdf5_java_la_LIBADD = $(LIBHDF5)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -897,22 +894,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nativeData.Plo 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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1294,21 +1294,9 @@ uninstall-am: uninstall-libLTLIBRARIES
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1316,7 +1304,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/src/jni/exceptionImp.c b/java/src/jni/exceptionImp.c
index 8623ca9..05c193f 100644
--- a/java/src/jni/exceptionImp.c
+++ b/java/src/jni/exceptionImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -101,7 +99,8 @@ static jboolean H5JNIErrorClass(JNIEnv *env, const char *message, const char *cl
 
 /* get the major and minor error numbers on the top of the error stack */
 static herr_t
-walk_error_callback(unsigned n, const H5E_error2_t *err_desc, void *_err_nums)
+walk_error_callback
+    (unsigned n, const H5E_error2_t *err_desc, void *_err_nums)
 {
     H5E_num_t *err_nums = (H5E_num_t *)_err_nums;
 
@@ -120,7 +119,8 @@ walk_error_callback(unsigned n, const H5E_error2_t *err_desc, void *_err_nums)
  *
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5error_1off(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5error_1off
+    (JNIEnv *env, jclass clss)
 {
     H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
     return 0;
@@ -135,8 +135,8 @@ Java_hdf_hdf5lib_H5_H5error_1off(JNIEnv *env, jclass clss)
  *  Call the HDF-5 library to print the HDF-5 error stack to 'file_name'.
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(
-    JNIEnv *env, jobject obj, jstring file_name)
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0
+    (JNIEnv *env, jobject obj, jstring file_name)
 {
     FILE       *stream = NULL;
     const char *file = NULL;
@@ -163,8 +163,8 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(
  *  Extract the HDF-5 major error number from the HDF-5 error stack.
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber(
-    JNIEnv *env, jobject obj)
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber
+    (JNIEnv *env, jobject obj)
 {
     H5E_num_t err_nums;
     err_nums.maj_num = 0;
@@ -183,8 +183,8 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber(
  *  Extract the HDF-5 minor error number from the HDF-5 error stack.
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMinorErrorNumber(
-    JNIEnv *env, jobject obj)
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMinorErrorNumber
+    (JNIEnv *env, jobject obj)
 {
     H5E_num_t err_nums;
     err_nums.maj_num = 0;
@@ -198,9 +198,9 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMinorErrorNumber(
 /*
  *  Routine to raise particular Java exceptions from C
  */
-static
-jboolean
-H5JNIErrorClass(JNIEnv *env, const char *message, const char *className)
+static jboolean
+H5JNIErrorClass
+    (JNIEnv *env, const char *message, const char *className)
 {
     char *args[2];
     jstring str = ENVPTR->NewStringUTF(ENVPAR message);
@@ -218,7 +218,8 @@ H5JNIErrorClass(JNIEnv *env, const char *message, const char *className)
  *  exception.
  */
 jboolean
-h5outOfMemory(JNIEnv *env, const char *functName)
+h5outOfMemory
+    (JNIEnv *env, const char *functName)
 {
     return H5JNIErrorClass(env, functName, "java/lang/OutOfMemoryError");
 } /* end h5outOfMemory() */
@@ -233,7 +234,8 @@ h5outOfMemory(JNIEnv *env, const char *functName)
  *  exception.
  */
 jboolean
-h5JNIFatalError(JNIEnv *env, const char *functName)
+h5JNIFatalError
+    (JNIEnv *env, const char *functName)
 {
     return H5JNIErrorClass(env, functName, "java/lang/InternalError");
 } /* end h5JNIFatalError() */
@@ -247,7 +249,8 @@ h5JNIFatalError(JNIEnv *env, const char *functName)
  *  exception.
  */
 jboolean
-h5nullArgument(JNIEnv *env, const char *functName)
+h5nullArgument
+    (JNIEnv *env, const char *functName)
 {
     return H5JNIErrorClass(env, functName, "java/lang/NullPointerException");
 } /* end h5nullArgument() */
@@ -261,7 +264,8 @@ h5nullArgument(JNIEnv *env, const char *functName)
  *  exception.
  */
 jboolean
-h5badArgument(JNIEnv *env, const char *functName)
+h5badArgument
+    (JNIEnv *env, const char *functName)
 {
     return H5JNIErrorClass(env, functName, "java/lang/IllegalArgumentException");
 } /* end h5badArgument() */
@@ -275,7 +279,8 @@ h5badArgument(JNIEnv *env, const char *functName)
  *  exception.
  */
 jboolean
-h5unimplemented(JNIEnv *env, const char *functName)
+h5unimplemented
+    (JNIEnv *env, const char *functName)
 {
     return H5JNIErrorClass(env, functName, "java/lang/UnsupportedOperationException");
 } /* end h5unimplemented() */
@@ -288,7 +293,8 @@ h5unimplemented(JNIEnv *env, const char *functName)
  *  exception.
  */
 jboolean
-h5raiseException(JNIEnv *env, const char *exception, const char *message)
+h5raiseException
+    (JNIEnv *env, const char *exception, const char *message)
 {
     return H5JNIErrorClass(env, message, exception);
 } /* end h5raiseException() */
@@ -305,7 +311,8 @@ h5raiseException(JNIEnv *env, const char *exception, const char *message)
  *  exception.
  */
 jboolean
-h5libraryError(JNIEnv *env)
+h5libraryError
+    (JNIEnv *env)
 {
     char       *args[2];
     const char *exception = NULL;
@@ -358,7 +365,8 @@ h5libraryError(JNIEnv *env)
  *  which goes with an HDF-5 error code.
  */
 static const char *
-defineHDF5LibraryException(hid_t maj_num)
+defineHDF5LibraryException
+    (hid_t maj_num)
 {
     hid_t err_num = maj_num;
 
diff --git a/java/src/jni/exceptionImp.h b/java/src/jni/exceptionImp.h
index e238372..cb74602 100644
--- a/java/src/jni/exceptionImp.h
+++ b/java/src/jni/exceptionImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -30,7 +28,8 @@ extern "C" {
  *
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5error_1off(JNIEnv *env, jclass clss );
+Java_hdf_hdf5lib_H5_H5error_1off
+  (JNIEnv *env, jclass clss );
 
 
 /*
@@ -41,8 +40,8 @@ Java_hdf_hdf5lib_H5_H5error_1off(JNIEnv *env, jclass clss );
  *  Call the HDF-5 library to print the HDF-5 error stack to 'file_name'.
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(JNIEnv *env,
-    jobject obj, jstring file_name);
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0
+  (JNIEnv *env, jobject obj, jstring file_name);
 
 /*
  * Class:     hdf_hdf5lib_exceptions_HDFLibraryException
@@ -50,7 +49,8 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(JNIEnv *env,
  * Signature: ()J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber(JNIEnv *env, jobject obj);
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber
+  (JNIEnv *env, jobject obj);
 
 /*
  * Class:     hdf_hdf5lib_exceptions_HDFLibraryException
@@ -58,7 +58,8 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMajorErrorNumber(JNIEnv *env
  * Signature: ()J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMinorErrorNumber(JNIEnv *env, jobject obj);
+Java_hdf_hdf5lib_exceptions_HDF5LibraryException_getMinorErrorNumber
+  (JNIEnv *env, jobject obj);
 
 #ifdef __cplusplus
 } /* end extern "C" */
diff --git a/java/src/jni/h5Constants.c b/java/src/jni/h5Constants.c
index 1b94315..cd1c2f0 100644
--- a/java/src/jni/h5Constants.c
+++ b/java/src/jni/h5Constants.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -28,267 +26,500 @@ extern "C" {
 
 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
 
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1QUARTER_1HADDR_1MAX(JNIEnv *env, jclass cls) { return (hsize_t)HADDR_MAX/4; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1ALLOW_1K13_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_ALLOW_K13_OPTION_MASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1CHIP_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_CHIP_OPTION_MASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1EC_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_EC_OPTION_MASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1MAX_1PIXELS_1PER_1BLOCK(JNIEnv *env, jclass cls) { return H5_SZIP_MAX_PIXELS_PER_BLOCK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1NN_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_NN_OPTION_MASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1UNKNOWN(JNIEnv *env, jclass cls) { return H5_INDEX_UNKNOWN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1NAME(JNIEnv *env, jclass cls) { return H5_INDEX_NAME; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1CRT_1ORDER(JNIEnv *env, jclass cls) { return H5_INDEX_CRT_ORDER; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1N(JNIEnv *env, jclass cls) { return H5_INDEX_N; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1UNKNOWN(JNIEnv *env, jclass cls) { return H5_ITER_UNKNOWN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1INC(JNIEnv *env, jclass cls) { return H5_ITER_INC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1DEC(JNIEnv *env, jclass cls) { return H5_ITER_DEC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1NATIVE(JNIEnv *env, jclass cls) { return H5_ITER_NATIVE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1N(JNIEnv *env, jclass cls) { return H5_ITER_N; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5AC_1CURR_1CACHE_1CONFIG_1VERSION(JNIEnv *env, jclass cls) { return H5AC__CURR_CACHE_CONFIG_VERSION; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5AC_1MAX_1TRACE_1FILE_1NAME_1LEN(JNIEnv *env, jclass cls) { return H5AC__MAX_TRACE_FILE_NAME_LEN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5AC_1METADATA_1WRITE_1STRATEGY_1PROCESS_1ZERO_1ONLY(JNIEnv *env, jclass cls) { return H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5AC_1METADATA_1WRITE_1STRATEGY_1DISTRIBUTED(JNIEnv *env, jclass cls) { return H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1incr_1off(JNIEnv *env, jclass cls) { return H5C_incr__off; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1incr_1threshold(JNIEnv *env, jclass cls) { return H5C_incr__threshold; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1flash_1incr_1off(JNIEnv *env, jclass cls) { return H5C_flash_incr__off; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1flash_1incr_1add_1space(JNIEnv *env, jclass cls) { return H5C_flash_incr__add_space; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1off(JNIEnv *env, jclass cls) { return H5C_decr__off; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1threshold(JNIEnv *env, jclass cls) { return H5C_decr__threshold; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1age_1out(JNIEnv *env, jclass cls) { return H5C_decr__age_out; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1age_1out_1with_1threshold(JNIEnv *env, jclass cls) { return H5C_decr__age_out_with_threshold; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1CHUNK_1IDX_1BTREE(JNIEnv *env, jclass cls) { return H5D_CHUNK_IDX_BTREE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1DEFAULT(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1EARLY(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_EARLY; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1ERROR(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1INCR(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_INCR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1LATE(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_LATE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1ERROR(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1ALLOC(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_ALLOC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1NEVER(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_NEVER; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1IFSET(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_IFSET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1DEFAULT(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1ERROR(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1UNDEFINED(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_UNDEFINED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1USER_1DEFINED(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_USER_DEFINED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1LAYOUT_1ERROR(JNIEnv *env, jclass cls) { return H5D_LAYOUT_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1CHUNKED(JNIEnv *env, jclass cls) { return H5D_CHUNKED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1COMPACT(JNIEnv *env, jclass cls) { return H5D_COMPACT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1CONTIGUOUS(JNIEnv *env, jclass cls) { return H5D_CONTIGUOUS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1VIRTUAL(JNIEnv *env, jclass cls) { return H5D_VIRTUAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1NLAYOUTS(JNIEnv *env, jclass cls) { return H5D_NLAYOUTS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_ALLOCATED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1ERROR(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1NOT_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_NOT_ALLOCATED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1PART_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_PART_ALLOCATED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1ERROR(JNIEnv *env, jclass cls) { return H5D_VDS_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1FIRST_1MISSING(JNIEnv *env, jclass cls) { return H5D_VDS_FIRST_MISSING; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1LAST_1AVAILABLE(JNIEnv *env, jclass cls) { return H5D_VDS_LAST_AVAILABLE; }
-
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ALIGNMENT(JNIEnv *env, jclass cls) { return H5E_ALIGNMENT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ALREADYEXISTS(JNIEnv *env, jclass cls) { return H5E_ALREADYEXISTS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ALREADYINIT(JNIEnv *env, jclass cls) { return H5E_ALREADYINIT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ARGS(JNIEnv *env, jclass cls) { return H5E_ARGS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ATOM(JNIEnv *env, jclass cls) { return H5E_ATOM; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1ATTR(JNIEnv *env, jclass cls) { return H5E_ATTR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADATOM(JNIEnv *env, jclass cls) { return H5E_BADATOM; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADFILE(JNIEnv *env, jclass cls) { return H5E_BADFILE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADGROUP(JNIEnv *env, jclass cls) { return H5E_BADGROUP; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADMESG(JNIEnv *env, jclass cls) { return H5E_BADMESG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADRANGE(JNIEnv *env, jclass cls) { return H5E_BADRANGE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADSELECT(JNIEnv *env, jclass cls) { return H5E_BADSELECT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADSIZE(JNIEnv *env, jclass cls) { return H5E_BADSIZE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADTYPE(JNIEnv *env, jclass cls) { return H5E_BADTYPE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BADVALUE(JNIEnv *env, jclass cls) { return H5E_BADVALUE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1BTREE(JNIEnv *env, jclass cls) { return H5E_BTREE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CACHE(JNIEnv *env, jclass cls) { return H5E_CACHE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CALLBACK(JNIEnv *env, jclass cls) { return H5E_CALLBACK; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANAPPLY(JNIEnv *env, jclass cls) { return H5E_CANAPPLY; }
-/*JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTALLOC(JNIEnv *env, jclass cls) { return H5E_CANTALLOC; }*/
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCLIP(JNIEnv *env, jclass cls) { return H5E_CANTCLIP; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCLOSEFILE(JNIEnv *env, jclass cls) { return H5E_CANTCLOSEFILE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCONVERT(JNIEnv *env, jclass cls) { return H5E_CANTCONVERT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCOPY(JNIEnv *env, jclass cls) { return H5E_CANTCOPY; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCOUNT(JNIEnv *env, jclass cls) { return H5E_CANTCOUNT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCREATE(JNIEnv *env, jclass cls) { return H5E_CANTCREATE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDEC(JNIEnv *env, jclass cls) { return H5E_CANTDEC; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDECODE(JNIEnv *env, jclass cls) { return H5E_CANTDECODE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDELETE(JNIEnv *env, jclass cls) { return H5E_CANTDELETE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTENCODE(JNIEnv *env, jclass cls) { return H5E_CANTENCODE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTFLUSH(JNIEnv *env, jclass cls) { return H5E_CANTFLUSH; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTFREE(JNIEnv *env, jclass cls) { return H5E_CANTFREE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTGET(JNIEnv *env, jclass cls) { return H5E_CANTGET; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINC(JNIEnv *env, jclass cls) { return H5E_CANTINC; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINIT(JNIEnv *env, jclass cls) { return H5E_CANTINIT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINSERT(JNIEnv *env, jclass cls) { return H5E_CANTINSERT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLIST(JNIEnv *env, jclass cls) { return H5E_CANTLIST; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLOAD(JNIEnv *env, jclass cls) { return H5E_CANTLOAD; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLOCK(JNIEnv *env, jclass cls) { return H5E_CANTLOCK; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTNEXT(JNIEnv *env, jclass cls) { return H5E_CANTNEXT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTOPENFILE(JNIEnv *env, jclass cls) { return H5E_CANTOPENFILE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTOPENOBJ(JNIEnv *env, jclass cls) { return H5E_CANTOPENOBJ; }
-/*JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTRECV(JNIEnv *env, jclass cls) { return H5E_CANTRECV; }*/
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTREGISTER(JNIEnv *env, jclass cls) { return H5E_CANTREGISTER; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTRELEASE(JNIEnv *env, jclass cls) { return H5E_CANTRELEASE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSELECT(JNIEnv *env, jclass cls) { return H5E_CANTSELECT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSET(JNIEnv *env, jclass cls) { return H5E_CANTSET; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSPLIT(JNIEnv *env, jclass cls) { return H5E_CANTSPLIT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTUNLOCK(JNIEnv *env, jclass cls) { return H5E_CANTUNLOCK; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1CLOSEERROR(JNIEnv *env, jclass cls) { return H5E_CLOSEERROR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1COMPLEN(JNIEnv *env, jclass cls) { return H5E_COMPLEN; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1DATASET(JNIEnv *env, jclass cls) { return H5E_DATASET; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1DATASPACE(JNIEnv *env, jclass cls) { return H5E_DATASPACE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1DATATYPE(JNIEnv *env, jclass cls) { return H5E_DATATYPE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1DEFAULT(JNIEnv *env, jclass cls) { return H5E_DEFAULT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1DUPCLASS(JNIEnv *env, jclass cls) { return H5E_DUPCLASS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1EFL(JNIEnv *env, jclass cls) { return H5E_EFL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1EXISTS(JNIEnv *env, jclass cls) { return H5E_EXISTS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1FCNTL(JNIEnv *env, jclass cls) { return H5E_FCNTL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1FILE(JNIEnv *env, jclass cls) { return H5E_FILE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1FILEEXISTS(JNIEnv *env, jclass cls) { return H5E_FILEEXISTS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1FILEOPEN(JNIEnv *env, jclass cls) { return H5E_FILEOPEN; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1FUNC(JNIEnv *env, jclass cls) { return H5E_FUNC; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1HEAP(JNIEnv *env, jclass cls) { return H5E_HEAP; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1INTERNAL(JNIEnv *env, jclass cls) { return H5E_INTERNAL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1IO(JNIEnv *env, jclass cls) { return H5E_IO; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1LINK(JNIEnv *env, jclass cls) { return H5E_LINK; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1LINKCOUNT(JNIEnv *env, jclass cls) { return H5E_LINKCOUNT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1MAJOR(JNIEnv *env, jclass cls) { return H5E_MAJOR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1MINOR(JNIEnv *env, jclass cls) { return H5E_MINOR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1MOUNT(JNIEnv *env, jclass cls) { return H5E_MOUNT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1MPI(JNIEnv *env, jclass cls) { return H5E_MPI; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1MPIERRSTR(JNIEnv *env, jclass cls) { return H5E_MPIERRSTR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOFILTER(JNIEnv *env, jclass cls) { return H5E_NOFILTER; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOIDS(JNIEnv *env, jclass cls) { return H5E_NOIDS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NONE_1MAJOR(JNIEnv *env, jclass cls) { return H5E_NONE_MAJOR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NONE_1MINOR(JNIEnv *env, jclass cls) { return H5E_NONE_MINOR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOSPACE(JNIEnv *env, jclass cls) { return H5E_NOSPACE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTCACHED(JNIEnv *env, jclass cls) { return H5E_NOTCACHED; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTFOUND(JNIEnv *env, jclass cls) { return H5E_NOTFOUND; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTHDF5(JNIEnv *env, jclass cls) { return H5E_NOTHDF5; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1OHDR(JNIEnv *env, jclass cls) { return H5E_OHDR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1OVERFLOW(JNIEnv *env, jclass cls) { return H5E_OVERFLOW; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1PLINE(JNIEnv *env, jclass cls) { return H5E_PLINE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1PLIST(JNIEnv *env, jclass cls) { return H5E_PLIST; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1PROTECT(JNIEnv *env, jclass cls) { return H5E_PROTECT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1READERROR(JNIEnv *env, jclass cls) { return H5E_READERROR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1REFERENCE(JNIEnv *env, jclass cls) { return H5E_REFERENCE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1RESOURCE(JNIEnv *env, jclass cls) { return H5E_RESOURCE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1RS(JNIEnv *env, jclass cls) { return H5E_RS; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1SEEKERROR(JNIEnv *env, jclass cls) { return H5E_SEEKERROR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1SETLOCAL(JNIEnv *env, jclass cls) { return H5E_SETLOCAL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1STORAGE(JNIEnv *env, jclass cls) { return H5E_STORAGE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1SYM(JNIEnv *env, jclass cls) { return H5E_SYM; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1TRUNCATED(JNIEnv *env, jclass cls) { return H5E_TRUNCATED; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1TST(JNIEnv *env, jclass cls) { return H5E_TST; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1UNINITIALIZED(JNIEnv *env, jclass cls) { return H5E_UNINITIALIZED; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1UNSUPPORTED(JNIEnv *env, jclass cls) { return H5E_UNSUPPORTED; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1VERSION(JNIEnv *env, jclass cls) { return H5E_VERSION; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1VFL(JNIEnv *env, jclass cls) { return H5E_VFL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1DOWNWARD(JNIEnv *env, jclass cls) { return H5E_WALK_DOWNWARD; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1UPWARD(JNIEnv *env, jclass cls) { return H5E_WALK_UPWARD; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5E_1WRITEERROR(JNIEnv *env, jclass cls) { return H5E_WRITEERROR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1QUARTER_1HADDR_1MAX(JNIEnv *env, jclass cls) { return (hsize_t)HADDR_MAX/4; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1ALLOW_1K13_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_ALLOW_K13_OPTION_MASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1CHIP_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_CHIP_OPTION_MASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1EC_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_EC_OPTION_MASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1MAX_1PIXELS_1PER_1BLOCK(JNIEnv *env, jclass cls) { return H5_SZIP_MAX_PIXELS_PER_BLOCK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1SZIP_1NN_1OPTION_1MASK(JNIEnv *env, jclass cls) { return H5_SZIP_NN_OPTION_MASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1UNKNOWN(JNIEnv *env, jclass cls) { return H5_INDEX_UNKNOWN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1NAME(JNIEnv *env, jclass cls) { return H5_INDEX_NAME; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1CRT_1ORDER(JNIEnv *env, jclass cls) { return H5_INDEX_CRT_ORDER; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1INDEX_1N(JNIEnv *env, jclass cls) { return H5_INDEX_N; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1UNKNOWN(JNIEnv *env, jclass cls) { return H5_ITER_UNKNOWN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1INC(JNIEnv *env, jclass cls) { return H5_ITER_INC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1DEC(JNIEnv *env, jclass cls) { return H5_ITER_DEC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1NATIVE(JNIEnv *env, jclass cls) { return H5_ITER_NATIVE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5_1ITER_1N(JNIEnv *env, jclass cls) { return H5_ITER_N; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5AC_1CURR_1CACHE_1CONFIG_1VERSION(JNIEnv *env, jclass cls) { return H5AC__CURR_CACHE_CONFIG_VERSION; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5AC_1MAX_1TRACE_1FILE_1NAME_1LEN(JNIEnv *env, jclass cls) { return H5AC__MAX_TRACE_FILE_NAME_LEN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5AC_1METADATA_1WRITE_1STRATEGY_1PROCESS_1ZERO_1ONLY(JNIEnv *env, jclass cls) { return H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5AC_1METADATA_1WRITE_1STRATEGY_1DISTRIBUTED(JNIEnv *env, jclass cls) { return H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1incr_1off(JNIEnv *env, jclass cls) { return H5C_incr__off; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1incr_1threshold(JNIEnv *env, jclass cls) { return H5C_incr__threshold; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1flash_1incr_1off(JNIEnv *env, jclass cls) { return H5C_flash_incr__off; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1flash_1incr_1add_1space(JNIEnv *env, jclass cls) { return H5C_flash_incr__add_space; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1off(JNIEnv *env, jclass cls) { return H5C_decr__off; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1threshold(JNIEnv *env, jclass cls) { return H5C_decr__threshold; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1age_1out(JNIEnv *env, jclass cls) { return H5C_decr__age_out; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5C_1decr_1age_1out_1with_1threshold(JNIEnv *env, jclass cls) { return H5C_decr__age_out_with_threshold; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1CHUNK_1IDX_1BTREE(JNIEnv *env, jclass cls) { return H5D_CHUNK_IDX_BTREE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1DEFAULT(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1EARLY(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_EARLY; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1ERROR(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1INCR(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_INCR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1ALLOC_1TIME_1LATE(JNIEnv *env, jclass cls) { return H5D_ALLOC_TIME_LATE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1ERROR(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1ALLOC(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_ALLOC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1NEVER(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_NEVER; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1TIME_1IFSET(JNIEnv *env, jclass cls) { return H5D_FILL_TIME_IFSET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1DEFAULT(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1ERROR(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1UNDEFINED(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_UNDEFINED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1FILL_1VALUE_1USER_1DEFINED(JNIEnv *env, jclass cls) { return H5D_FILL_VALUE_USER_DEFINED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1LAYOUT_1ERROR(JNIEnv *env, jclass cls) { return H5D_LAYOUT_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1CHUNKED(JNIEnv *env, jclass cls) { return H5D_CHUNKED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1COMPACT(JNIEnv *env, jclass cls) { return H5D_COMPACT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1CONTIGUOUS(JNIEnv *env, jclass cls) { return H5D_CONTIGUOUS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1VIRTUAL(JNIEnv *env, jclass cls) { return H5D_VIRTUAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1NLAYOUTS(JNIEnv *env, jclass cls) { return H5D_NLAYOUTS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_ALLOCATED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1ERROR(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1NOT_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_NOT_ALLOCATED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1SPACE_1STATUS_1PART_1ALLOCATED(JNIEnv *env, jclass cls) { return H5D_SPACE_STATUS_PART_ALLOCATED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1ERROR(JNIEnv *env, jclass cls) { return H5D_VDS_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1FIRST_1MISSING(JNIEnv *env, jclass cls) { return H5D_VDS_FIRST_MISSING; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5D_1VDS_1LAST_1AVAILABLE(JNIEnv *env, jclass cls) { return H5D_VDS_LAST_AVAILABLE; }
+
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ALIGNMENT(JNIEnv *env, jclass cls) { return H5E_ALIGNMENT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ALREADYEXISTS(JNIEnv *env, jclass cls) { return H5E_ALREADYEXISTS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ALREADYINIT(JNIEnv *env, jclass cls) { return H5E_ALREADYINIT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ARGS(JNIEnv *env, jclass cls) { return H5E_ARGS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ATOM(JNIEnv *env, jclass cls) { return H5E_ATOM; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1ATTR(JNIEnv *env, jclass cls) { return H5E_ATTR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADATOM(JNIEnv *env, jclass cls) { return H5E_BADATOM; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADFILE(JNIEnv *env, jclass cls) { return H5E_BADFILE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADGROUP(JNIEnv *env, jclass cls) { return H5E_BADGROUP; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADMESG(JNIEnv *env, jclass cls) { return H5E_BADMESG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADRANGE(JNIEnv *env, jclass cls) { return H5E_BADRANGE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADSELECT(JNIEnv *env, jclass cls) { return H5E_BADSELECT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADSIZE(JNIEnv *env, jclass cls) { return H5E_BADSIZE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADTYPE(JNIEnv *env, jclass cls) { return H5E_BADTYPE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BADVALUE(JNIEnv *env, jclass cls) { return H5E_BADVALUE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1BTREE(JNIEnv *env, jclass cls) { return H5E_BTREE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CACHE(JNIEnv *env, jclass cls) { return H5E_CACHE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CALLBACK(JNIEnv *env, jclass cls) { return H5E_CALLBACK; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANAPPLY(JNIEnv *env, jclass cls) { return H5E_CANAPPLY; }
+/*JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTALLOC(JNIEnv *env, jclass cls) { return H5E_CANTALLOC; }*/
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCLIP(JNIEnv *env, jclass cls) { return H5E_CANTCLIP; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCLOSEFILE(JNIEnv *env, jclass cls) { return H5E_CANTCLOSEFILE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCONVERT(JNIEnv *env, jclass cls) { return H5E_CANTCONVERT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCOPY(JNIEnv *env, jclass cls) { return H5E_CANTCOPY; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCOUNT(JNIEnv *env, jclass cls) { return H5E_CANTCOUNT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTCREATE(JNIEnv *env, jclass cls) { return H5E_CANTCREATE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDEC(JNIEnv *env, jclass cls) { return H5E_CANTDEC; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDECODE(JNIEnv *env, jclass cls) { return H5E_CANTDECODE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTDELETE(JNIEnv *env, jclass cls) { return H5E_CANTDELETE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTENCODE(JNIEnv *env, jclass cls) { return H5E_CANTENCODE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTFLUSH(JNIEnv *env, jclass cls) { return H5E_CANTFLUSH; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTFREE(JNIEnv *env, jclass cls) { return H5E_CANTFREE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTGET(JNIEnv *env, jclass cls) { return H5E_CANTGET; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINC(JNIEnv *env, jclass cls) { return H5E_CANTINC; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINIT(JNIEnv *env, jclass cls) { return H5E_CANTINIT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTINSERT(JNIEnv *env, jclass cls) { return H5E_CANTINSERT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLIST(JNIEnv *env, jclass cls) { return H5E_CANTLIST; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLOAD(JNIEnv *env, jclass cls) { return H5E_CANTLOAD; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTLOCK(JNIEnv *env, jclass cls) { return H5E_CANTLOCK; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTNEXT(JNIEnv *env, jclass cls) { return H5E_CANTNEXT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTOPENFILE(JNIEnv *env, jclass cls) { return H5E_CANTOPENFILE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTOPENOBJ(JNIEnv *env, jclass cls) { return H5E_CANTOPENOBJ; }
+/*JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTRECV(JNIEnv *env, jclass cls) { return H5E_CANTRECV; }*/
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTREGISTER(JNIEnv *env, jclass cls) { return H5E_CANTREGISTER; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTRELEASE(JNIEnv *env, jclass cls) { return H5E_CANTRELEASE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSELECT(JNIEnv *env, jclass cls) { return H5E_CANTSELECT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSET(JNIEnv *env, jclass cls) { return H5E_CANTSET; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTSPLIT(JNIEnv *env, jclass cls) { return H5E_CANTSPLIT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CANTUNLOCK(JNIEnv *env, jclass cls) { return H5E_CANTUNLOCK; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1CLOSEERROR(JNIEnv *env, jclass cls) { return H5E_CLOSEERROR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1COMPLEN(JNIEnv *env, jclass cls) { return H5E_COMPLEN; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1DATASET(JNIEnv *env, jclass cls) { return H5E_DATASET; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1DATASPACE(JNIEnv *env, jclass cls) { return H5E_DATASPACE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1DATATYPE(JNIEnv *env, jclass cls) { return H5E_DATATYPE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1DEFAULT(JNIEnv *env, jclass cls) { return H5E_DEFAULT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1DUPCLASS(JNIEnv *env, jclass cls) { return H5E_DUPCLASS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1EFL(JNIEnv *env, jclass cls) { return H5E_EFL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1EXISTS(JNIEnv *env, jclass cls) { return H5E_EXISTS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1FCNTL(JNIEnv *env, jclass cls) { return H5E_FCNTL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1FILE(JNIEnv *env, jclass cls) { return H5E_FILE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1FILEEXISTS(JNIEnv *env, jclass cls) { return H5E_FILEEXISTS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1FILEOPEN(JNIEnv *env, jclass cls) { return H5E_FILEOPEN; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1FUNC(JNIEnv *env, jclass cls) { return H5E_FUNC; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1HEAP(JNIEnv *env, jclass cls) { return H5E_HEAP; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1INTERNAL(JNIEnv *env, jclass cls) { return H5E_INTERNAL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1IO(JNIEnv *env, jclass cls) { return H5E_IO; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1LINK(JNIEnv *env, jclass cls) { return H5E_LINK; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1LINKCOUNT(JNIEnv *env, jclass cls) { return H5E_LINKCOUNT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1MAJOR(JNIEnv *env, jclass cls) { return H5E_MAJOR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1MINOR(JNIEnv *env, jclass cls) { return H5E_MINOR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1MOUNT(JNIEnv *env, jclass cls) { return H5E_MOUNT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1MPI(JNIEnv *env, jclass cls) { return H5E_MPI; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1MPIERRSTR(JNIEnv *env, jclass cls) { return H5E_MPIERRSTR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOFILTER(JNIEnv *env, jclass cls) { return H5E_NOFILTER; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOIDS(JNIEnv *env, jclass cls) { return H5E_NOIDS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NONE_1MAJOR(JNIEnv *env, jclass cls) { return H5E_NONE_MAJOR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NONE_1MINOR(JNIEnv *env, jclass cls) { return H5E_NONE_MINOR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOSPACE(JNIEnv *env, jclass cls) { return H5E_NOSPACE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTCACHED(JNIEnv *env, jclass cls) { return H5E_NOTCACHED; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTFOUND(JNIEnv *env, jclass cls) { return H5E_NOTFOUND; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1NOTHDF5(JNIEnv *env, jclass cls) { return H5E_NOTHDF5; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1OHDR(JNIEnv *env, jclass cls) { return H5E_OHDR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1OVERFLOW(JNIEnv *env, jclass cls) { return H5E_OVERFLOW; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1PLINE(JNIEnv *env, jclass cls) { return H5E_PLINE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1PLIST(JNIEnv *env, jclass cls) { return H5E_PLIST; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1PROTECT(JNIEnv *env, jclass cls) { return H5E_PROTECT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1READERROR(JNIEnv *env, jclass cls) { return H5E_READERROR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1REFERENCE(JNIEnv *env, jclass cls) { return H5E_REFERENCE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1RESOURCE(JNIEnv *env, jclass cls) { return H5E_RESOURCE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1RS(JNIEnv *env, jclass cls) { return H5E_RS; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1SEEKERROR(JNIEnv *env, jclass cls) { return H5E_SEEKERROR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1SETLOCAL(JNIEnv *env, jclass cls) { return H5E_SETLOCAL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1STORAGE(JNIEnv *env, jclass cls) { return H5E_STORAGE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1SYM(JNIEnv *env, jclass cls) { return H5E_SYM; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1TRUNCATED(JNIEnv *env, jclass cls) { return H5E_TRUNCATED; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1TST(JNIEnv *env, jclass cls) { return H5E_TST; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1UNINITIALIZED(JNIEnv *env, jclass cls) { return H5E_UNINITIALIZED; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1UNSUPPORTED(JNIEnv *env, jclass cls) { return H5E_UNSUPPORTED; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1VERSION(JNIEnv *env, jclass cls) { return H5E_VERSION; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1VFL(JNIEnv *env, jclass cls) { return H5E_VFL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1DOWNWARD(JNIEnv *env, jclass cls) { return H5E_WALK_DOWNWARD; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1UPWARD(JNIEnv *env, jclass cls) { return H5E_WALK_UPWARD; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5E_1WRITEERROR(JNIEnv *env, jclass cls) { return H5E_WRITEERROR; }
 
 /* Java does not have unsigned native types */
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wsign-conversion"
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1CREAT(JNIEnv *env, jclass cls) { return H5F_ACC_CREAT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1EXCL(JNIEnv *env, jclass cls) { return H5F_ACC_EXCL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1RDONLY(JNIEnv *env, jclass cls) { return H5F_ACC_RDONLY; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1RDWR(JNIEnv *env, jclass cls) { return H5F_ACC_RDWR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1TRUNC(JNIEnv *env, jclass cls) { return H5F_ACC_TRUNC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_ACC_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1READ(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_READ; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1WRITE(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_WRITE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1CREAT(JNIEnv *env, jclass cls) { return H5F_ACC_CREAT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1EXCL(JNIEnv *env, jclass cls) { return H5F_ACC_EXCL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1RDONLY(JNIEnv *env, jclass cls) { return H5F_ACC_RDONLY; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1RDWR(JNIEnv *env, jclass cls) { return H5F_ACC_RDWR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1TRUNC(JNIEnv *env, jclass cls) { return H5F_ACC_TRUNC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_ACC_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1READ(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_READ; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1WRITE(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_WRITE; }
 #pragma GCC diagnostic pop
 
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_CLOSE_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1SEMI(JNIEnv *env, jclass cls) { return H5F_CLOSE_SEMI; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1STRONG(JNIEnv *env, jclass cls) { return H5F_CLOSE_STRONG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1WEAK(JNIEnv *env, jclass cls) { return H5F_CLOSE_WEAK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1EARLIEST(JNIEnv *env, jclass cls){return H5F_LIBVER_EARLIEST;}
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1LATEST(JNIEnv *env, jclass cls){return H5F_LIBVER_LATEST;}
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1ALL(JNIEnv *env, jclass cls) { return H5F_OBJ_ALL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1ATTR(JNIEnv *env, jclass cls) { return H5F_OBJ_ATTR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1DATASET(JNIEnv *env, jclass cls) { return H5F_OBJ_DATASET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1DATATYPE(JNIEnv *env, jclass cls) { return H5F_OBJ_DATATYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1FILE(JNIEnv *env, jclass cls) { return H5F_OBJ_FILE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1GROUP(JNIEnv *env, jclass cls) { return H5F_OBJ_GROUP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1LOCAL(JNIEnv *env, jclass cls) { return H5F_OBJ_LOCAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1SCOPE_1GLOBAL(JNIEnv *env, jclass cls) { return H5F_SCOPE_GLOBAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1SCOPE_1LOCAL(JNIEnv *env, jclass cls) { return H5F_SCOPE_LOCAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1UNLIMITED(JNIEnv *env, jclass cls) { return (jint)H5F_UNLIMITED; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1ALL_1PERSIST(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_ALL_PERSIST; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1ALL(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_ALL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1AGGR_1VFD(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_AGGR_VFD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1VFD(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_VFD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1FILE_1SPACE_1NTYPES(JNIEnv *env, jclass cls) { return H5F_FILE_SPACE_NTYPES; }
-
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1CORE(JNIEnv *env, jclass cls) { return H5FD_CORE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1DIRECT(JNIEnv *env, jclass cls) {
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_CLOSE_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1SEMI(JNIEnv *env, jclass cls) { return H5F_CLOSE_SEMI; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1STRONG(JNIEnv *env, jclass cls) { return H5F_CLOSE_STRONG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1CLOSE_1WEAK(JNIEnv *env, jclass cls) { return H5F_CLOSE_WEAK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1EARLIEST(JNIEnv *env, jclass cls){return H5F_LIBVER_EARLIEST;}
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1LATEST(JNIEnv *env, jclass cls){return H5F_LIBVER_LATEST;}
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1ALL(JNIEnv *env, jclass cls) { return H5F_OBJ_ALL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1ATTR(JNIEnv *env, jclass cls) { return H5F_OBJ_ATTR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1DATASET(JNIEnv *env, jclass cls) { return H5F_OBJ_DATASET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1DATATYPE(JNIEnv *env, jclass cls) { return H5F_OBJ_DATATYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1FILE(JNIEnv *env, jclass cls) { return H5F_OBJ_FILE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1GROUP(JNIEnv *env, jclass cls) { return H5F_OBJ_GROUP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1LOCAL(JNIEnv *env, jclass cls) { return H5F_OBJ_LOCAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1SCOPE_1GLOBAL(JNIEnv *env, jclass cls) { return H5F_SCOPE_GLOBAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1SCOPE_1LOCAL(JNIEnv *env, jclass cls) { return H5F_SCOPE_LOCAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1UNLIMITED(JNIEnv *env, jclass cls) { return (jint)H5F_UNLIMITED; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1FSPACE_1STRATEGY_1FSM_1AGGR(JNIEnv *env, jclass cls) { return H5F_FSPACE_STRATEGY_FSM_AGGR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1FSPACE_1STRATEGY_1AGGR(JNIEnv *env, jclass cls) { return H5F_FSPACE_STRATEGY_AGGR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1FSPACE_1STRATEGY_1PAGE(JNIEnv *env, jclass cls) { return H5F_FSPACE_STRATEGY_PAGE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1FSPACE_1STRATEGY_1NONE(JNIEnv *env, jclass cls) { return H5F_FSPACE_STRATEGY_NONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5F_1FSPACE_1STRATEGY_1NTYPES(JNIEnv *env, jclass cls) { return H5F_FSPACE_STRATEGY_NTYPES; }
+
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1CORE(JNIEnv *env, jclass cls) { return H5FD_CORE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1DIRECT(JNIEnv *env, jclass cls) {
 #ifdef H5_HAVE_DIRECT
     return H5FD_DIRECT;
 #else
     return -1;
 #endif
 }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1FAMILY(JNIEnv *env, jclass cls) { return H5FD_FAMILY; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG(JNIEnv *env, jclass cls) { return H5FD_LOG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MPIO(JNIEnv *env, jclass cls) { return H5FD_MPIO; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MULTI(JNIEnv *env, jclass cls) { return H5FD_MULTI; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1SEC2(JNIEnv *env, jclass cls) { return H5FD_SEC2; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1STDIO(JNIEnv *env, jclass cls) { return H5FD_STDIO; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1WINDOWS(JNIEnv *env, jclass cls) {
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1FAMILY(JNIEnv *env, jclass cls) { return H5FD_FAMILY; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG(JNIEnv *env, jclass cls) { return H5FD_LOG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MPIO(JNIEnv *env, jclass cls) { return H5FD_MPIO; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MULTI(JNIEnv *env, jclass cls) { return H5FD_MULTI; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1SEC2(JNIEnv *env, jclass cls) { return H5FD_SEC2; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1STDIO(JNIEnv *env, jclass cls) { return H5FD_STDIO; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1WINDOWS(JNIEnv *env, jclass cls) {
 #ifdef H5_HAVE_WINDOWS
     return H5FD_DIRECT;
 #else
     return -1;
 #endif
 }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_READ; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_WRITE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_SEEK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_IO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_READ; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_WRITE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_IO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FLAVOR(JNIEnv *env, jclass cls) { return H5FD_LOG_FLAVOR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_READ; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_WRITE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_SEEK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1TRUNCATE(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_TRUNCATE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_IO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1OPEN(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_OPEN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1STAT(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_STAT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_READ; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_WRITE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_SEEK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1CLOSE(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_CLOSE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_IO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1ALLOC(JNIEnv *env, jclass cls) { return H5FD_LOG_ALLOC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1ALL(JNIEnv *env, jclass cls) { return H5FD_LOG_ALL; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1NOLIST(JNIEnv *env, jclass cls) { return H5FD_MEM_NOLIST; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT(JNIEnv *env, jclass cls) { return H5FD_MEM_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1SUPER(JNIEnv *env, jclass cls) { return H5FD_MEM_SUPER; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1BTREE(JNIEnv *env, jclass cls) { return H5FD_MEM_BTREE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DRAW(JNIEnv *env, jclass cls) { return H5FD_MEM_DRAW; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1GHEAP(JNIEnv *env, jclass cls) { return H5FD_MEM_GHEAP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1LHEAP(JNIEnv *env, jclass cls) { return H5FD_MEM_LHEAP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1OHDR(JNIEnv *env, jclass cls) { return H5FD_MEM_OHDR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1NTYPES(JNIEnv *env, jclass cls) { return H5FD_MEM_NTYPES; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1DEFAULT_1HADDR_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(HADDR_MAX/H5FD_MEM_NTYPES); }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)0; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1SUPER_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)0; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1BTREE_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(1 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1DRAW_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(2 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1GHEAP_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(3 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1LHEAP_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(4 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1OHDR_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(5 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_READ; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_WRITE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_SEEK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1LOC_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_LOC_IO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_READ; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_WRITE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FILE_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_FILE_IO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1FLAVOR(JNIEnv *env, jclass cls) { return H5FD_LOG_FLAVOR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_READ; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_WRITE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_SEEK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1TRUNCATE(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_TRUNCATE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1NUM_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_NUM_IO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1OPEN(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_OPEN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1STAT(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_STAT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1READ(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_READ; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1WRITE(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_WRITE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1SEEK(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_SEEK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1CLOSE(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_CLOSE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1TIME_1IO(JNIEnv *env, jclass cls) { return H5FD_LOG_TIME_IO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1ALLOC(JNIEnv *env, jclass cls) { return H5FD_LOG_ALLOC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1LOG_1ALL(JNIEnv *env, jclass cls) { return H5FD_LOG_ALL; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1NOLIST(JNIEnv *env, jclass cls) { return H5FD_MEM_NOLIST; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT(JNIEnv *env, jclass cls) { return H5FD_MEM_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1SUPER(JNIEnv *env, jclass cls) { return H5FD_MEM_SUPER; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1BTREE(JNIEnv *env, jclass cls) { return H5FD_MEM_BTREE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DRAW(JNIEnv *env, jclass cls) { return H5FD_MEM_DRAW; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1GHEAP(JNIEnv *env, jclass cls) { return H5FD_MEM_GHEAP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1LHEAP(JNIEnv *env, jclass cls) { return H5FD_MEM_LHEAP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1OHDR(JNIEnv *env, jclass cls) { return H5FD_MEM_OHDR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1NTYPES(JNIEnv *env, jclass cls) { return H5FD_MEM_NTYPES; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1DEFAULT_1HADDR_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(HADDR_MAX/H5FD_MEM_NTYPES); }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)0; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1SUPER_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)0; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1BTREE_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(1 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1DRAW_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(2 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1GHEAP_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(3 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1LHEAP_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(4 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1OHDR_1SIZE(JNIEnv *env, jclass cls) { return (hsize_t)(5 * (HADDR_MAX / (H5FD_MEM_NTYPES-1))); }
 
 
 /* Symbols defined for compatibility with previous versions of the HDF5 API.
@@ -297,394 +528,770 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5FD_1MEM_1DEFAULT_1OHDR_
  */
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1DATASET(JNIEnv *env, jclass cls) { return H5G_DATASET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1GROUP(JNIEnv *env, jclass cls) { return H5G_GROUP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK(JNIEnv *env, jclass cls) { return H5G_LINK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1UDLINK(JNIEnv *env, jclass cls) { return H5G_UDLINK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_15(JNIEnv *env, jclass cls) { return H5G_RESERVED_5; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_16(JNIEnv *env, jclass cls) { return H5G_RESERVED_6; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_17(JNIEnv *env, jclass cls) { return H5G_RESERVED_7; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1TYPE(JNIEnv *env, jclass cls) { return H5G_TYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1UNKNOWN(JNIEnv *env, jclass cls) { return H5G_UNKNOWN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1ERROR(JNIEnv *env, jclass cls) { return H5G_LINK_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1HARD(JNIEnv *env, jclass cls) { return H5G_LINK_HARD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1SOFT(JNIEnv *env, jclass cls) { return H5G_LINK_SOFT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1NLIBTYPES(JNIEnv *env, jclass cls) { return H5G_NLIBTYPES; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1NTYPES(JNIEnv *env, jclass cls) { return H5G_NTYPES; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1NUSERTYPES(JNIEnv *env, jclass cls) { return H5G_NUSERTYPES; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1SAME_1LOC(JNIEnv *env, jclass cls) { return H5G_SAME_LOC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1DATASET(JNIEnv *env, jclass cls) { return H5G_DATASET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1GROUP(JNIEnv *env, jclass cls) { return H5G_GROUP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK(JNIEnv *env, jclass cls) { return H5G_LINK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1UDLINK(JNIEnv *env, jclass cls) { return H5G_UDLINK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_15(JNIEnv *env, jclass cls) { return H5G_RESERVED_5; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_16(JNIEnv *env, jclass cls) { return H5G_RESERVED_6; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1RESERVED_17(JNIEnv *env, jclass cls) { return H5G_RESERVED_7; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1TYPE(JNIEnv *env, jclass cls) { return H5G_TYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1UNKNOWN(JNIEnv *env, jclass cls) { return H5G_UNKNOWN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1ERROR(JNIEnv *env, jclass cls) { return H5G_LINK_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1HARD(JNIEnv *env, jclass cls) { return H5G_LINK_HARD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1LINK_1SOFT(JNIEnv *env, jclass cls) { return H5G_LINK_SOFT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1NLIBTYPES(JNIEnv *env, jclass cls) { return H5G_NLIBTYPES; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1NTYPES(JNIEnv *env, jclass cls) { return H5G_NTYPES; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1NUSERTYPES(JNIEnv *env, jclass cls) { return H5G_NUSERTYPES; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1SAME_1LOC(JNIEnv *env, jclass cls) { return H5G_SAME_LOC; }
 
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1UNKNOWN(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_UNKNOWN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1SYMBOL_1TABLE(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_SYMBOL_TABLE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1COMPACT(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_COMPACT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1DENSE(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_DENSE; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1UNINIT(JNIEnv *env, jclass cls) { return H5I_UNINIT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1BADID(JNIEnv *env, jclass cls) { return H5I_BADID; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1FILE(JNIEnv *env, jclass cls) { return H5I_FILE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1GROUP(JNIEnv *env, jclass cls) { return H5I_GROUP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1DATATYPE(JNIEnv *env, jclass cls) { return H5I_DATATYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1DATASPACE(JNIEnv *env, jclass cls) { return H5I_DATASPACE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1DATASET(JNIEnv *env, jclass cls) { return H5I_DATASET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1ATTR(JNIEnv *env, jclass cls) { return H5I_ATTR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1REFERENCE(JNIEnv *env, jclass cls) { return H5I_REFERENCE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1VFL(JNIEnv *env, jclass cls) { return H5I_VFL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1INVALID_1HID(JNIEnv *env, jclass cls) { return H5I_INVALID_HID; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1GENPROP_1CLS(JNIEnv *env, jclass cls) { return H5I_GENPROP_CLS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1GENPROP_1LST(JNIEnv *env, jclass cls) { return H5I_GENPROP_LST; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1CLASS(JNIEnv *env, jclass cls) { return H5I_ERROR_CLASS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1MSG(JNIEnv *env, jclass cls) { return H5I_ERROR_MSG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1STACK(JNIEnv *env, jclass cls) { return H5I_ERROR_STACK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5I_1NTYPES(JNIEnv *env, jclass cls) { return H5I_NTYPES; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1ERROR(JNIEnv *env, jclass cls) { return H5L_TYPE_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1HARD(JNIEnv *env, jclass cls) { return H5L_TYPE_HARD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1SOFT(JNIEnv *env, jclass cls) { return H5L_TYPE_SOFT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1EXTERNAL(JNIEnv *env, jclass cls) { return H5L_TYPE_EXTERNAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1MAX(JNIEnv *env, jclass cls) { return H5L_TYPE_MAX; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1SHALLOW_1HIERARCHY_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_SHALLOW_HIERARCHY_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1SOFT_1LINK_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_SOFT_LINK_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1EXT_1LINK_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_EXT_LINK_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1REFERENCE_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_REFERENCE_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1WITHOUT_1ATTR_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_WITHOUT_ATTR_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1PRESERVE_1NULL_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_PRESERVE_NULL_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1NONE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_NONE_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1SDSPACE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_SDSPACE_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1DTYPE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_DTYPE_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1FILL_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_FILL_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1PLINE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_PLINE_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1ATTR_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_ATTR_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1ALL_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_ALL_FLAG; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1UNKNOWN(JNIEnv *env, jclass cls) { return H5O_TYPE_UNKNOWN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1GROUP(JNIEnv *env, jclass cls) { return H5O_TYPE_GROUP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1DATASET(JNIEnv *env, jclass cls) { return H5O_TYPE_DATASET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1NAMED_1DATATYPE(JNIEnv *env, jclass cls) { return H5O_TYPE_NAMED_DATATYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1NTYPES(JNIEnv *env, jclass cls) { return H5O_TYPE_NTYPES; }
-
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1ROOT(JNIEnv *env, jclass cls){return H5P_ROOT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1CREATE(JNIEnv *env, jclass cls){return H5P_OBJECT_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1CREATE(JNIEnv *env, jclass cls){return H5P_FILE_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1ACCESS(JNIEnv *env, jclass cls){return H5P_FILE_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1CREATE(JNIEnv *env, jclass cls){return H5P_DATASET_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1ACCESS(JNIEnv *env, jclass cls){return H5P_DATASET_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1XFER(JNIEnv *env, jclass cls){return H5P_DATASET_XFER;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1MOUNT(JNIEnv *env, jclass cls){return H5P_FILE_MOUNT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1CREATE(JNIEnv *env, jclass cls){return H5P_GROUP_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1ACCESS(JNIEnv *env, jclass cls){return H5P_GROUP_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1CREATE(JNIEnv *env, jclass cls){return H5P_DATATYPE_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1ACCESS(JNIEnv *env, jclass cls){return H5P_DATATYPE_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1STRING_1CREATE(JNIEnv *env, jclass cls){return H5P_STRING_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1ACCESS(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1CREATE(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1COPY(JNIEnv *env, jclass cls){return H5P_OBJECT_COPY;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1CREATE(JNIEnv *env, jclass cls){return H5P_LINK_CREATE;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1ACCESS(JNIEnv *env, jclass cls){return H5P_LINK_ACCESS;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_ACCESS_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_ACCESS_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1XFER_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_XFER_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1MOUNT_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_MOUNT_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_GROUP_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_GROUP_ACCESS_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATATYPE_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATATYPE_ACCESS_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_ACCESS_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1COPY_1DEFAULT(JNIEnv *env, jclass cls){return H5P_OBJECT_COPY_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_LINK_CREATE_DEFAULT;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_LINK_ACCESS_DEFAULT;}
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1CRT_1ORDER_1TRACKED(JNIEnv *env, jclass cls){return H5P_CRT_ORDER_TRACKED;}
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1CRT_1ORDER_1INDEXED(JNIEnv *env, jclass cls){return H5P_CRT_ORDER_INDEXED;}
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1DEFAULT(JNIEnv *env, jclass cls) { return H5P_DEFAULT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5P_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5P_ROOT; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5PL_1TYPE_1ERROR(JNIEnv *env, jclass cls) { return H5PL_TYPE_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5PL_1TYPE_1FILTER(JNIEnv *env, jclass cls) { return H5PL_TYPE_FILTER; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5PL_1FILTER_1PLUGIN(JNIEnv *env, jclass cls) { return H5PL_FILTER_PLUGIN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5PL_1ALL_1PLUGIN(JNIEnv *env, jclass cls) { return H5PL_ALL_PLUGIN; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1BADTYPE(JNIEnv *env, jclass cls) { return H5R_BADTYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1MAXTYPE(JNIEnv *env, jclass cls) { return H5R_MAXTYPE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1OBJ_1REF_1BUF_1SIZE(JNIEnv *env, jclass cls) { return H5R_OBJ_REF_BUF_SIZE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1DSET_1REG_1REF_1BUF_1SIZE(JNIEnv *env, jclass cls) { return H5R_DSET_REG_REF_BUF_SIZE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1OBJECT(JNIEnv *env, jclass cls) { return H5R_OBJECT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5R_1DATASET_1REGION(JNIEnv *env, jclass cls) { return H5R_DATASET_REGION; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1ALL(JNIEnv *env, jclass cls) { return H5S_ALL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1MAX_1RANK(JNIEnv *env, jclass cls) { return H5S_MAX_RANK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5S_NO_CLASS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1NULL(JNIEnv *env, jclass cls) { return H5S_NULL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SCALAR(JNIEnv *env, jclass cls) { return H5S_SCALAR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1ALL(JNIEnv *env, jclass cls) { return H5S_SEL_ALL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1ERROR(JNIEnv *env, jclass cls) { return H5S_SEL_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1HYPERSLABS(JNIEnv *env, jclass cls) { return H5S_SEL_HYPERSLABS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1N(JNIEnv *env, jclass cls) { return H5S_SEL_N; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1NONE(JNIEnv *env, jclass cls) { return H5S_SEL_NONE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1POINTS(JNIEnv *env, jclass cls) { return H5S_SEL_POINTS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1AND(JNIEnv *env, jclass cls) { return H5S_SELECT_AND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1APPEND(JNIEnv *env, jclass cls) { return H5S_SELECT_APPEND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1INVALID(JNIEnv *env, jclass cls) { return H5S_SELECT_INVALID; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOOP(JNIEnv *env, jclass cls) { return H5S_SELECT_NOOP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOTA(JNIEnv *env, jclass cls) { return H5S_SELECT_NOTA; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOTB(JNIEnv *env, jclass cls) { return H5S_SELECT_NOTB; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1OR(JNIEnv *env, jclass cls) { return H5S_SELECT_OR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1PREPEND(JNIEnv *env, jclass cls) { return H5S_SELECT_PREPEND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1SET(JNIEnv *env, jclass cls) { return H5S_SELECT_SET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1XOR(JNIEnv *env, jclass cls) { return H5S_SELECT_XOR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1SIMPLE(JNIEnv *env, jclass cls) { return H5S_SIMPLE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5S_1UNLIMITED(JNIEnv *env, jclass cls) { return (jint)H5S_UNLIMITED; }
-
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B16(JNIEnv *env, jclass cls) { return H5T_ALPHA_B16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B32(JNIEnv *env, jclass cls) { return H5T_ALPHA_B32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B64(JNIEnv *env, jclass cls) { return H5T_ALPHA_B64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B8(JNIEnv *env, jclass cls) { return H5T_ALPHA_B8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1F32(JNIEnv *env, jclass cls) { return H5T_ALPHA_F32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1F64(JNIEnv *env, jclass cls) { return H5T_ALPHA_F64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I16(JNIEnv *env, jclass cls) { return H5T_ALPHA_I16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I32(JNIEnv *env, jclass cls) { return H5T_ALPHA_I32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I64(JNIEnv *env, jclass cls) { return H5T_ALPHA_I64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I8(JNIEnv *env, jclass cls) { return H5T_ALPHA_I8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U16(JNIEnv *env, jclass cls) { return H5T_ALPHA_U16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U32(JNIEnv *env, jclass cls) { return H5T_ALPHA_U32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U64(JNIEnv *env, jclass cls) { return H5T_ALPHA_U64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U8(JNIEnv *env, jclass cls) { return H5T_ALPHA_U8; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ARRAY(JNIEnv *env, jclass cls) { return H5T_ARRAY; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1BITFIELD(JNIEnv *env, jclass cls) { return H5T_BITFIELD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1BKG_1NO(JNIEnv *env, jclass cls) { return H5T_BKG_NO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1BKG_1YES(JNIEnv *env, jclass cls) { return H5T_BKG_YES; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1C_1S1(JNIEnv *env, jclass cls) { return H5T_C_S1; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPOUND(JNIEnv *env, jclass cls) { return H5T_COMPOUND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1CONV(JNIEnv *env, jclass cls) { return H5T_CONV_CONV; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1FREE(JNIEnv *env, jclass cls) { return H5T_CONV_FREE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1INIT(JNIEnv *env, jclass cls) { return H5T_CONV_INIT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1ERROR(JNIEnv *env, jclass cls) { return H5T_CSET_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1ASCII(JNIEnv *env, jclass cls) { return H5T_CSET_ASCII; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1UTF8(JNIEnv *env, jclass cls) { return H5T_CSET_UTF8; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_110(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_10; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_111(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_11; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_112(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_12; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_113(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_13; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_114(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_14; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_115(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_15; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_12(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_2; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_13(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_3; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_14(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_4; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_15(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_5; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_16(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_6; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_17(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_7; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_18(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_8; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_19(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_9; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1ASCEND(JNIEnv *env, jclass cls) { return H5T_DIR_ASCEND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1DEFAULT(JNIEnv *env, jclass cls) { return H5T_DIR_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1DESCEND(JNIEnv *env, jclass cls) { return H5T_DIR_DESCEND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ENUM(JNIEnv *env, jclass cls) { return H5T_ENUM; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1FLOAT(JNIEnv *env, jclass cls) { return H5T_FLOAT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1FORTRAN_1S1(JNIEnv *env, jclass cls) { return H5T_FORTRAN_S1; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F32BE(JNIEnv *env, jclass cls) { return H5T_IEEE_F32BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F32LE(JNIEnv *env, jclass cls) { return H5T_IEEE_F32LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F64BE(JNIEnv *env, jclass cls) { return H5T_IEEE_F64BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F64LE(JNIEnv *env, jclass cls) { return H5T_IEEE_F64LE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEGER(JNIEnv *env, jclass cls) { return H5T_INTEGER; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B16(JNIEnv *env, jclass cls) { return H5T_INTEL_B16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B32(JNIEnv *env, jclass cls) { return H5T_INTEL_B32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B64(JNIEnv *env, jclass cls) { return H5T_INTEL_B64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B8(JNIEnv *env, jclass cls) { return H5T_INTEL_B8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1F32(JNIEnv *env, jclass cls) { return H5T_INTEL_F32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1F64(JNIEnv *env, jclass cls) { return H5T_INTEL_F64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I16(JNIEnv *env, jclass cls) { return H5T_INTEL_I16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I32(JNIEnv *env, jclass cls) { return H5T_INTEL_I32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I64(JNIEnv *env, jclass cls) { return H5T_INTEL_I64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I8(JNIEnv *env, jclass cls) { return H5T_INTEL_I8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U16(JNIEnv *env, jclass cls) { return H5T_INTEL_U16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U32(JNIEnv *env, jclass cls) { return H5T_INTEL_U32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U64(JNIEnv *env, jclass cls) { return H5T_INTEL_U64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U8(JNIEnv *env, jclass cls) { return H5T_INTEL_U8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B16(JNIEnv *env, jclass cls) { return H5T_MIPS_B16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B32(JNIEnv *env, jclass cls) { return H5T_MIPS_B32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B64(JNIEnv *env, jclass cls) { return H5T_MIPS_B64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B8(JNIEnv *env, jclass cls) { return H5T_MIPS_B8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1F32(JNIEnv *env, jclass cls) { return H5T_MIPS_F32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1F64(JNIEnv *env, jclass cls) { return H5T_MIPS_F64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I16(JNIEnv *env, jclass cls) { return H5T_MIPS_I16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I32(JNIEnv *env, jclass cls) { return H5T_MIPS_I32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I64(JNIEnv *env, jclass cls) { return H5T_MIPS_I64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I8(JNIEnv *env, jclass cls) { return H5T_MIPS_I8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U16(JNIEnv *env, jclass cls) { return H5T_MIPS_U16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U32(JNIEnv *env, jclass cls) { return H5T_MIPS_U32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U64(JNIEnv *env, jclass cls) { return H5T_MIPS_U64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U8(JNIEnv *env, jclass cls) { return H5T_MIPS_U8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B16(JNIEnv *env, jclass cls) { return H5T_NATIVE_B16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B32(JNIEnv *env, jclass cls) { return H5T_NATIVE_B32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B64(JNIEnv *env, jclass cls) { return H5T_NATIVE_B64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B8(JNIEnv *env, jclass cls) { return H5T_NATIVE_B8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1CHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_CHAR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1DOUBLE(JNIEnv *env, jclass cls) { return H5T_NATIVE_DOUBLE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1FLOAT(JNIEnv *env, jclass cls) { return H5T_NATIVE_FLOAT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HADDR(JNIEnv *env, jclass cls) { return H5T_NATIVE_HADDR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HBOOL(JNIEnv *env, jclass cls) { return H5T_NATIVE_HBOOL; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HERR(JNIEnv *env, jclass cls) { return H5T_NATIVE_HERR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HSIZE(JNIEnv *env, jclass cls) { return H5T_NATIVE_HSIZE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HSSIZE(JNIEnv *env, jclass cls) { return H5T_NATIVE_HSSIZE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LDOUBLE(JNIEnv *env, jclass cls) { return H5T_NATIVE_LDOUBLE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LLONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_LLONG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_LONG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1OPAQUE(JNIEnv *env, jclass cls) { return H5T_NATIVE_OPAQUE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1SCHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_SCHAR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1SHORT(JNIEnv *env, jclass cls) { return H5T_NATIVE_SHORT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UCHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_UCHAR; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT16; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT32; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT64; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT8; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1ULLONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_ULLONG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1ULONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_ULONG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1USHORT(JNIEnv *env, jclass cls) { return H5T_NATIVE_USHORT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NCLASSES(JNIEnv *env, jclass cls) { return H5T_NCLASSES; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5T_NO_CLASS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1ERROR(JNIEnv *env, jclass cls) { return H5T_NORM_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1IMPLIED(JNIEnv *env, jclass cls) { return H5T_NORM_IMPLIED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1MSBSET(JNIEnv *env, jclass cls) { return H5T_NORM_MSBSET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1NONE(JNIEnv *env, jclass cls) { return H5T_NORM_NONE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NPAD(JNIEnv *env, jclass cls) { return H5T_NPAD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NSGN(JNIEnv *env, jclass cls) { return H5T_NSGN; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1OPAQUE(JNIEnv *env, jclass cls) { return H5T_OPAQUE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1OPAQUE_1TAG_1MAX(JNIEnv *env, jclass cls) { return H5T_OPAQUE_TAG_MAX; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1BE(JNIEnv *env, jclass cls) { return H5T_ORDER_BE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1ERROR(JNIEnv *env, jclass cls) { return H5T_ORDER_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1LE(JNIEnv *env, jclass cls) { return H5T_ORDER_LE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1NONE(JNIEnv *env, jclass cls) { return H5T_ORDER_NONE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1VAX(JNIEnv *env, jclass cls) { return H5T_ORDER_VAX; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1BACKGROUND(JNIEnv *env, jclass cls) { return H5T_PAD_BACKGROUND; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ERROR(JNIEnv *env, jclass cls) { return H5T_PAD_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ONE(JNIEnv *env, jclass cls) { return H5T_PAD_ONE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ZERO(JNIEnv *env, jclass cls) { return H5T_PAD_ZERO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1DONTCARE(JNIEnv *env, jclass cls) { return H5T_PERS_DONTCARE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1HARD(JNIEnv *env, jclass cls) { return H5T_PERS_HARD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1SOFT(JNIEnv *env, jclass cls) { return H5T_PERS_SOFT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1REFERENCE(JNIEnv *env, jclass cls) { return H5T_REFERENCE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_12(JNIEnv *env, jclass cls) { return H5T_SGN_2; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_1ERROR(JNIEnv *env, jclass cls) { return H5T_SGN_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_1NONE(JNIEnv *env, jclass cls) { return H5T_SGN_NONE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B16BE(JNIEnv *env, jclass cls) { return H5T_STD_B16BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B16LE(JNIEnv *env, jclass cls) { return H5T_STD_B16LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B32BE(JNIEnv *env, jclass cls) { return H5T_STD_B32BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B32LE(JNIEnv *env, jclass cls) { return H5T_STD_B32LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B64BE(JNIEnv *env, jclass cls) { return H5T_STD_B64BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B64LE(JNIEnv *env, jclass cls) { return H5T_STD_B64LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B8BE(JNIEnv *env, jclass cls) { return H5T_STD_B8BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B8LE(JNIEnv *env, jclass cls) { return H5T_STD_B8LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I16BE(JNIEnv *env, jclass cls) { return H5T_STD_I16BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I16LE(JNIEnv *env, jclass cls) { return H5T_STD_I16LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I32BE(JNIEnv *env, jclass cls) { return H5T_STD_I32BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I32LE(JNIEnv *env, jclass cls) { return H5T_STD_I32LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I64BE(JNIEnv *env, jclass cls) { return H5T_STD_I64BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I64LE(JNIEnv *env, jclass cls) { return H5T_STD_I64LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I8BE(JNIEnv *env, jclass cls) { return H5T_STD_I8BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I8LE(JNIEnv *env, jclass cls) { return H5T_STD_I8LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1REF_1DSETREG(JNIEnv *env, jclass cls) { return H5T_STD_REF_DSETREG; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1REF_1OBJ(JNIEnv *env, jclass cls) { return H5T_STD_REF_OBJ; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U16BE(JNIEnv *env, jclass cls) { return H5T_STD_U16BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U16LE(JNIEnv *env, jclass cls) { return H5T_STD_U16LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U32BE(JNIEnv *env, jclass cls) { return H5T_STD_U32BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U32LE(JNIEnv *env, jclass cls) { return H5T_STD_U32LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U64BE(JNIEnv *env, jclass cls) { return H5T_STD_U64BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U64LE(JNIEnv *env, jclass cls) { return H5T_STD_U64LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U8BE(JNIEnv *env, jclass cls) { return H5T_STD_U8BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U8LE(JNIEnv *env, jclass cls) { return H5T_STD_U8LE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1ERROR(JNIEnv *env, jclass cls) { return H5T_STR_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1NULLPAD(JNIEnv *env, jclass cls) { return H5T_STR_NULLPAD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1NULLTERM(JNIEnv *env, jclass cls) { return H5T_STR_NULLTERM; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_110(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_10; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_111(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_11; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_112(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_12; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_113(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_13; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_114(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_14; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_115(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_15; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_13(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_3; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_14(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_4; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_15(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_5; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_16(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_6; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_17(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_7; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_18(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_8; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_19(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_9; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1SPACEPAD(JNIEnv *env, jclass cls) { return H5T_STR_SPACEPAD; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1STRING(JNIEnv *env, jclass cls) { return H5T_STRING; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1TIME(JNIEnv *env, jclass cls) { return H5T_TIME; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D32BE(JNIEnv *env, jclass cls) { return H5T_UNIX_D32BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D32LE(JNIEnv *env, jclass cls) { return H5T_UNIX_D32LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D64BE(JNIEnv *env, jclass cls) { return H5T_UNIX_D64BE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D64LE(JNIEnv *env, jclass cls) { return H5T_UNIX_D64LE; }
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1VARIABLE(JNIEnv *env, jclass cls) { return (int)H5T_VARIABLE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1VLEN(JNIEnv *env, jclass cls) { return H5T_VLEN; }
-
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1CONT(JNIEnv *env, jclass cls) { return H5Z_CB_CONT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1ERROR(JNIEnv *env, jclass cls) { return H5Z_CB_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1FAIL(JNIEnv *env, jclass cls) { return H5Z_CB_FAIL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1NO(JNIEnv *env, jclass cls) { return H5Z_CB_NO; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1DISABLE_1EDC(JNIEnv *env, jclass cls) { return H5Z_DISABLE_EDC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1ENABLE_1EDC(JNIEnv *env, jclass cls) { return H5Z_ENABLE_EDC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1ERROR_1EDC(JNIEnv *env, jclass cls) { return H5Z_ERROR_EDC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1CONFIG_1DECODE_1ENABLED(JNIEnv *env, jclass cls) { return H5Z_FILTER_CONFIG_DECODE_ENABLED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1CONFIG_1ENCODE_1ENABLED(JNIEnv *env, jclass cls) { return H5Z_FILTER_CONFIG_ENCODE_ENABLED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1DEFLATE(JNIEnv *env, jclass cls) { return H5Z_FILTER_DEFLATE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1ERROR(JNIEnv *env, jclass cls) { return H5Z_FILTER_ERROR; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1FLETCHER32(JNIEnv *env, jclass cls) { return H5Z_FILTER_FLETCHER32; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1MAX(JNIEnv *env, jclass cls) { return H5Z_FILTER_MAX; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1NBIT(JNIEnv *env, jclass cls) {return H5Z_FILTER_NBIT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1NONE(JNIEnv *env, jclass cls) { return H5Z_FILTER_NONE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1RESERVED(JNIEnv *env, jclass cls) { return H5Z_FILTER_RESERVED; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SCALEOFFSET(JNIEnv *env, jclass cls){ return H5Z_FILTER_SCALEOFFSET; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SHUFFLE(JNIEnv *env, jclass cls) { return H5Z_FILTER_SHUFFLE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SZIP(JNIEnv *env, jclass cls) { return H5Z_FILTER_SZIP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1DEFMASK(JNIEnv *env, jclass cls) { return H5Z_FLAG_DEFMASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1INVMASK(JNIEnv *env, jclass cls) { return H5Z_FLAG_INVMASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1MANDATORY(JNIEnv *env, jclass cls) { return H5Z_FLAG_MANDATORY; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1OPTIONAL(JNIEnv *env, jclass cls) { return H5Z_FLAG_OPTIONAL; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1REVERSE(JNIEnv *env, jclass cls) { return H5Z_FLAG_REVERSE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1SKIP_1EDC(JNIEnv *env, jclass cls) { return H5Z_FLAG_SKIP_EDC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1MAX_1NFILTERS(JNIEnv *env, jclass cls) { return H5Z_MAX_NFILTERS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1NO_1EDC(JNIEnv *env, jclass cls) { return H5Z_NO_EDC; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1INT_1MINBITS_1DEFAULT(JNIEnv *env, jclass cls) { return H5Z_SO_INT_MINBITS_DEFAULT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1FLOAT_1DSCALE(JNIEnv *env, jclass cls){return H5Z_SO_FLOAT_DSCALE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1FLOAT_1ESCALE(JNIEnv *env, jclass cls){return H5Z_SO_FLOAT_ESCALE; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1INT(JNIEnv *env, jclass cls){return H5Z_SO_INT; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SHUFFLE_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SHUFFLE_USER_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SHUFFLE_1TOTAL_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SHUFFLE_TOTAL_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SZIP_USER_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1TOTAL_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SZIP_TOTAL_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1MASK(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_MASK; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1PPB(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_PPB; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1BPP(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_BPP; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1PPS(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_PPS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1NBIT_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_NBIT_USER_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1SCALEOFFSET_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SCALEOFFSET_USER_NPARMS; }
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1ALL(JNIEnv *env, jclass cls) { return H5Z_FILTER_ALL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1UNKNOWN(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_UNKNOWN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1SYMBOL_1TABLE(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_SYMBOL_TABLE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1COMPACT(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_COMPACT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5G_1STORAGE_1TYPE_1DENSE(JNIEnv *env, jclass cls){ return H5G_STORAGE_TYPE_DENSE; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1UNINIT(JNIEnv *env, jclass cls) { return H5I_UNINIT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1BADID(JNIEnv *env, jclass cls) { return H5I_BADID; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1FILE(JNIEnv *env, jclass cls) { return H5I_FILE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1GROUP(JNIEnv *env, jclass cls) { return H5I_GROUP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1DATATYPE(JNIEnv *env, jclass cls) { return H5I_DATATYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1DATASPACE(JNIEnv *env, jclass cls) { return H5I_DATASPACE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1DATASET(JNIEnv *env, jclass cls) { return H5I_DATASET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1ATTR(JNIEnv *env, jclass cls) { return H5I_ATTR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1REFERENCE(JNIEnv *env, jclass cls) { return H5I_REFERENCE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1VFL(JNIEnv *env, jclass cls) { return H5I_VFL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1INVALID_1HID(JNIEnv *env, jclass cls) { return H5I_INVALID_HID; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1GENPROP_1CLS(JNIEnv *env, jclass cls) { return H5I_GENPROP_CLS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1GENPROP_1LST(JNIEnv *env, jclass cls) { return H5I_GENPROP_LST; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1CLASS(JNIEnv *env, jclass cls) { return H5I_ERROR_CLASS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1MSG(JNIEnv *env, jclass cls) { return H5I_ERROR_MSG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1ERROR_1STACK(JNIEnv *env, jclass cls) { return H5I_ERROR_STACK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5I_1NTYPES(JNIEnv *env, jclass cls) { return H5I_NTYPES; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1ERROR(JNIEnv *env, jclass cls) { return H5L_TYPE_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1HARD(JNIEnv *env, jclass cls) { return H5L_TYPE_HARD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1SOFT(JNIEnv *env, jclass cls) { return H5L_TYPE_SOFT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1EXTERNAL(JNIEnv *env, jclass cls) { return H5L_TYPE_EXTERNAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5L_1TYPE_1MAX(JNIEnv *env, jclass cls) { return H5L_TYPE_MAX; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1SHALLOW_1HIERARCHY_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_SHALLOW_HIERARCHY_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1SOFT_1LINK_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_SOFT_LINK_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1EXT_1LINK_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_EXT_LINK_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1EXPAND_1REFERENCE_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_EXPAND_REFERENCE_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1WITHOUT_1ATTR_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_WITHOUT_ATTR_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1COPY_1PRESERVE_1NULL_1FLAG(JNIEnv *env, jclass cls){return H5O_COPY_PRESERVE_NULL_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1NONE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_NONE_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1SDSPACE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_SDSPACE_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1DTYPE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_DTYPE_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1FILL_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_FILL_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1PLINE_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_PLINE_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1ATTR_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_ATTR_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1SHMESG_1ALL_1FLAG(JNIEnv *env, jclass cls){return H5O_SHMESG_ALL_FLAG; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1UNKNOWN(JNIEnv *env, jclass cls) { return H5O_TYPE_UNKNOWN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1GROUP(JNIEnv *env, jclass cls) { return H5O_TYPE_GROUP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1DATASET(JNIEnv *env, jclass cls) { return H5O_TYPE_DATASET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1NAMED_1DATATYPE(JNIEnv *env, jclass cls) { return H5O_TYPE_NAMED_DATATYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5O_1TYPE_1NTYPES(JNIEnv *env, jclass cls) { return H5O_TYPE_NTYPES; }
+
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1ROOT(JNIEnv *env, jclass cls){return H5P_ROOT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1CREATE(JNIEnv *env, jclass cls){return H5P_OBJECT_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1CREATE(JNIEnv *env, jclass cls){return H5P_FILE_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1ACCESS(JNIEnv *env, jclass cls){return H5P_FILE_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1CREATE(JNIEnv *env, jclass cls){return H5P_DATASET_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1ACCESS(JNIEnv *env, jclass cls){return H5P_DATASET_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1XFER(JNIEnv *env, jclass cls){return H5P_DATASET_XFER;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1MOUNT(JNIEnv *env, jclass cls){return H5P_FILE_MOUNT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1CREATE(JNIEnv *env, jclass cls){return H5P_GROUP_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1ACCESS(JNIEnv *env, jclass cls){return H5P_GROUP_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1CREATE(JNIEnv *env, jclass cls){return H5P_DATATYPE_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1ACCESS(JNIEnv *env, jclass cls){return H5P_DATATYPE_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1STRING_1CREATE(JNIEnv *env, jclass cls){return H5P_STRING_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1CREATE(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1ACCESS(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1COPY(JNIEnv *env, jclass cls){return H5P_OBJECT_COPY;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1CREATE(JNIEnv *env, jclass cls){return H5P_LINK_CREATE;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1ACCESS(JNIEnv *env, jclass cls){return H5P_LINK_ACCESS;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_ACCESS_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_ACCESS_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATASET_1XFER_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATASET_XFER_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1FILE_1MOUNT_1DEFAULT(JNIEnv *env, jclass cls){return H5P_FILE_MOUNT_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_GROUP_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1GROUP_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_GROUP_ACCESS_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATATYPE_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DATATYPE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_DATATYPE_ACCESS_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1ATTRIBUTE_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_ATTRIBUTE_ACCESS_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1OBJECT_1COPY_1DEFAULT(JNIEnv *env, jclass cls){return H5P_OBJECT_COPY_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1CREATE_1DEFAULT(JNIEnv *env, jclass cls){return H5P_LINK_CREATE_DEFAULT;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1LINK_1ACCESS_1DEFAULT(JNIEnv *env, jclass cls){return H5P_LINK_ACCESS_DEFAULT;}
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1CRT_1ORDER_1TRACKED(JNIEnv *env, jclass cls){return H5P_CRT_ORDER_TRACKED;}
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1CRT_1ORDER_1INDEXED(JNIEnv *env, jclass cls){return H5P_CRT_ORDER_INDEXED;}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1DEFAULT(JNIEnv *env, jclass cls) { return H5P_DEFAULT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5P_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5P_ROOT; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5PL_1TYPE_1ERROR(JNIEnv *env, jclass cls) { return H5PL_TYPE_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5PL_1TYPE_1FILTER(JNIEnv *env, jclass cls) { return H5PL_TYPE_FILTER; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5PL_1FILTER_1PLUGIN(JNIEnv *env, jclass cls) { return H5PL_FILTER_PLUGIN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5PL_1ALL_1PLUGIN(JNIEnv *env, jclass cls) { return H5PL_ALL_PLUGIN; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1BADTYPE(JNIEnv *env, jclass cls) { return H5R_BADTYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1MAXTYPE(JNIEnv *env, jclass cls) { return H5R_MAXTYPE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1OBJ_1REF_1BUF_1SIZE(JNIEnv *env, jclass cls) { return H5R_OBJ_REF_BUF_SIZE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1DSET_1REG_1REF_1BUF_1SIZE(JNIEnv *env, jclass cls) { return H5R_DSET_REG_REF_BUF_SIZE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1OBJECT(JNIEnv *env, jclass cls) { return H5R_OBJECT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5R_1DATASET_1REGION(JNIEnv *env, jclass cls) { return H5R_DATASET_REGION; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1ALL(JNIEnv *env, jclass cls) { return H5S_ALL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1MAX_1RANK(JNIEnv *env, jclass cls) { return H5S_MAX_RANK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5S_NO_CLASS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1NULL(JNIEnv *env, jclass cls) { return H5S_NULL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SCALAR(JNIEnv *env, jclass cls) { return H5S_SCALAR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1ALL(JNIEnv *env, jclass cls) { return H5S_SEL_ALL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1ERROR(JNIEnv *env, jclass cls) { return H5S_SEL_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1HYPERSLABS(JNIEnv *env, jclass cls) { return H5S_SEL_HYPERSLABS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1N(JNIEnv *env, jclass cls) { return H5S_SEL_N; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1NONE(JNIEnv *env, jclass cls) { return H5S_SEL_NONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SEL_1POINTS(JNIEnv *env, jclass cls) { return H5S_SEL_POINTS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1AND(JNIEnv *env, jclass cls) { return H5S_SELECT_AND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1APPEND(JNIEnv *env, jclass cls) { return H5S_SELECT_APPEND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1INVALID(JNIEnv *env, jclass cls) { return H5S_SELECT_INVALID; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOOP(JNIEnv *env, jclass cls) { return H5S_SELECT_NOOP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOTA(JNIEnv *env, jclass cls) { return H5S_SELECT_NOTA; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1NOTB(JNIEnv *env, jclass cls) { return H5S_SELECT_NOTB; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1OR(JNIEnv *env, jclass cls) { return H5S_SELECT_OR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1PREPEND(JNIEnv *env, jclass cls) { return H5S_SELECT_PREPEND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1SET(JNIEnv *env, jclass cls) { return H5S_SELECT_SET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SELECT_1XOR(JNIEnv *env, jclass cls) { return H5S_SELECT_XOR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1SIMPLE(JNIEnv *env, jclass cls) { return H5S_SIMPLE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5S_1UNLIMITED(JNIEnv *env, jclass cls) { return (jint)H5S_UNLIMITED; }
+
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B16(JNIEnv *env, jclass cls) { return H5T_ALPHA_B16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B32(JNIEnv *env, jclass cls) { return H5T_ALPHA_B32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B64(JNIEnv *env, jclass cls) { return H5T_ALPHA_B64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1B8(JNIEnv *env, jclass cls) { return H5T_ALPHA_B8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1F32(JNIEnv *env, jclass cls) { return H5T_ALPHA_F32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1F64(JNIEnv *env, jclass cls) { return H5T_ALPHA_F64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I16(JNIEnv *env, jclass cls) { return H5T_ALPHA_I16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I32(JNIEnv *env, jclass cls) { return H5T_ALPHA_I32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I64(JNIEnv *env, jclass cls) { return H5T_ALPHA_I64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1I8(JNIEnv *env, jclass cls) { return H5T_ALPHA_I8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U16(JNIEnv *env, jclass cls) { return H5T_ALPHA_U16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U32(JNIEnv *env, jclass cls) { return H5T_ALPHA_U32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U64(JNIEnv *env, jclass cls) { return H5T_ALPHA_U64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ALPHA_1U8(JNIEnv *env, jclass cls) { return H5T_ALPHA_U8; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ARRAY(JNIEnv *env, jclass cls) { return H5T_ARRAY; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1BITFIELD(JNIEnv *env, jclass cls) { return H5T_BITFIELD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1BKG_1NO(JNIEnv *env, jclass cls) { return H5T_BKG_NO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1BKG_1YES(JNIEnv *env, jclass cls) { return H5T_BKG_YES; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1C_1S1(JNIEnv *env, jclass cls) { return H5T_C_S1; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPOUND(JNIEnv *env, jclass cls) { return H5T_COMPOUND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1CONV(JNIEnv *env, jclass cls) { return H5T_CONV_CONV; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1FREE(JNIEnv *env, jclass cls) { return H5T_CONV_FREE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1INIT(JNIEnv *env, jclass cls) { return H5T_CONV_INIT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1ERROR(JNIEnv *env, jclass cls) { return H5T_CSET_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1ASCII(JNIEnv *env, jclass cls) { return H5T_CSET_ASCII; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1UTF8(JNIEnv *env, jclass cls) { return H5T_CSET_UTF8; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_110(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_10; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_111(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_11; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_112(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_12; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_113(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_13; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_114(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_14; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_115(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_15; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_12(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_2; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_13(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_3; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_14(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_4; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_15(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_5; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_16(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_6; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_17(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_7; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_18(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_8; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1RESERVED_19(JNIEnv *env, jclass cls) { return H5T_CSET_RESERVED_9; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1ASCEND(JNIEnv *env, jclass cls) { return H5T_DIR_ASCEND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1DEFAULT(JNIEnv *env, jclass cls) { return H5T_DIR_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1DIR_1DESCEND(JNIEnv *env, jclass cls) { return H5T_DIR_DESCEND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ENUM(JNIEnv *env, jclass cls) { return H5T_ENUM; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1FLOAT(JNIEnv *env, jclass cls) { return H5T_FLOAT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1FORTRAN_1S1(JNIEnv *env, jclass cls) { return H5T_FORTRAN_S1; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F32BE(JNIEnv *env, jclass cls) { return H5T_IEEE_F32BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F32LE(JNIEnv *env, jclass cls) { return H5T_IEEE_F32LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F64BE(JNIEnv *env, jclass cls) { return H5T_IEEE_F64BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1IEEE_1F64LE(JNIEnv *env, jclass cls) { return H5T_IEEE_F64LE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEGER(JNIEnv *env, jclass cls) { return H5T_INTEGER; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B16(JNIEnv *env, jclass cls) { return H5T_INTEL_B16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B32(JNIEnv *env, jclass cls) { return H5T_INTEL_B32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B64(JNIEnv *env, jclass cls) { return H5T_INTEL_B64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1B8(JNIEnv *env, jclass cls) { return H5T_INTEL_B8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1F32(JNIEnv *env, jclass cls) { return H5T_INTEL_F32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1F64(JNIEnv *env, jclass cls) { return H5T_INTEL_F64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I16(JNIEnv *env, jclass cls) { return H5T_INTEL_I16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I32(JNIEnv *env, jclass cls) { return H5T_INTEL_I32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I64(JNIEnv *env, jclass cls) { return H5T_INTEL_I64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1I8(JNIEnv *env, jclass cls) { return H5T_INTEL_I8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U16(JNIEnv *env, jclass cls) { return H5T_INTEL_U16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U32(JNIEnv *env, jclass cls) { return H5T_INTEL_U32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U64(JNIEnv *env, jclass cls) { return H5T_INTEL_U64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1INTEL_1U8(JNIEnv *env, jclass cls) { return H5T_INTEL_U8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B16(JNIEnv *env, jclass cls) { return H5T_MIPS_B16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B32(JNIEnv *env, jclass cls) { return H5T_MIPS_B32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B64(JNIEnv *env, jclass cls) { return H5T_MIPS_B64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1B8(JNIEnv *env, jclass cls) { return H5T_MIPS_B8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1F32(JNIEnv *env, jclass cls) { return H5T_MIPS_F32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1F64(JNIEnv *env, jclass cls) { return H5T_MIPS_F64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I16(JNIEnv *env, jclass cls) { return H5T_MIPS_I16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I32(JNIEnv *env, jclass cls) { return H5T_MIPS_I32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I64(JNIEnv *env, jclass cls) { return H5T_MIPS_I64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1I8(JNIEnv *env, jclass cls) { return H5T_MIPS_I8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U16(JNIEnv *env, jclass cls) { return H5T_MIPS_U16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U32(JNIEnv *env, jclass cls) { return H5T_MIPS_U32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U64(JNIEnv *env, jclass cls) { return H5T_MIPS_U64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1MIPS_1U8(JNIEnv *env, jclass cls) { return H5T_MIPS_U8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B16(JNIEnv *env, jclass cls) { return H5T_NATIVE_B16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B32(JNIEnv *env, jclass cls) { return H5T_NATIVE_B32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B64(JNIEnv *env, jclass cls) { return H5T_NATIVE_B64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1B8(JNIEnv *env, jclass cls) { return H5T_NATIVE_B8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1CHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_CHAR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1DOUBLE(JNIEnv *env, jclass cls) { return H5T_NATIVE_DOUBLE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1FLOAT(JNIEnv *env, jclass cls) { return H5T_NATIVE_FLOAT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HADDR(JNIEnv *env, jclass cls) { return H5T_NATIVE_HADDR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HBOOL(JNIEnv *env, jclass cls) { return H5T_NATIVE_HBOOL; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HERR(JNIEnv *env, jclass cls) { return H5T_NATIVE_HERR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HSIZE(JNIEnv *env, jclass cls) { return H5T_NATIVE_HSIZE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HSSIZE(JNIEnv *env, jclass cls) { return H5T_NATIVE_HSSIZE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1FAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_FAST8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT_1LEAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT_LEAST8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT16(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT32(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT64(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1INT8(JNIEnv *env, jclass cls) { return H5T_NATIVE_INT8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LDOUBLE(JNIEnv *env, jclass cls) { return H5T_NATIVE_LDOUBLE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LLONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_LLONG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_LONG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1OPAQUE(JNIEnv *env, jclass cls) { return H5T_NATIVE_OPAQUE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1SCHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_SCHAR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1SHORT(JNIEnv *env, jclass cls) { return H5T_NATIVE_SHORT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UCHAR(JNIEnv *env, jclass cls) { return H5T_NATIVE_UCHAR; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1FAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_FAST8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT_1LEAST8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT_LEAST8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT16(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT16; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT32(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT32; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT64(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT64; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1UINT8(JNIEnv *env, jclass cls) { return H5T_NATIVE_UINT8; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1ULLONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_ULLONG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1ULONG(JNIEnv *env, jclass cls) { return H5T_NATIVE_ULONG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1USHORT(JNIEnv *env, jclass cls) { return H5T_NATIVE_USHORT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NCLASSES(JNIEnv *env, jclass cls) { return H5T_NCLASSES; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NO_1CLASS(JNIEnv *env, jclass cls) { return H5T_NO_CLASS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1ERROR(JNIEnv *env, jclass cls) { return H5T_NORM_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1IMPLIED(JNIEnv *env, jclass cls) { return H5T_NORM_IMPLIED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1MSBSET(JNIEnv *env, jclass cls) { return H5T_NORM_MSBSET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NORM_1NONE(JNIEnv *env, jclass cls) { return H5T_NORM_NONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NPAD(JNIEnv *env, jclass cls) { return H5T_NPAD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1NSGN(JNIEnv *env, jclass cls) { return H5T_NSGN; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1OPAQUE(JNIEnv *env, jclass cls) { return H5T_OPAQUE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1OPAQUE_1TAG_1MAX(JNIEnv *env, jclass cls) { return H5T_OPAQUE_TAG_MAX; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1BE(JNIEnv *env, jclass cls) { return H5T_ORDER_BE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1ERROR(JNIEnv *env, jclass cls) { return H5T_ORDER_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1LE(JNIEnv *env, jclass cls) { return H5T_ORDER_LE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1NONE(JNIEnv *env, jclass cls) { return H5T_ORDER_NONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1ORDER_1VAX(JNIEnv *env, jclass cls) { return H5T_ORDER_VAX; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1BACKGROUND(JNIEnv *env, jclass cls) { return H5T_PAD_BACKGROUND; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ERROR(JNIEnv *env, jclass cls) { return H5T_PAD_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ONE(JNIEnv *env, jclass cls) { return H5T_PAD_ONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PAD_1ZERO(JNIEnv *env, jclass cls) { return H5T_PAD_ZERO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1DONTCARE(JNIEnv *env, jclass cls) { return H5T_PERS_DONTCARE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1HARD(JNIEnv *env, jclass cls) { return H5T_PERS_HARD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1PERS_1SOFT(JNIEnv *env, jclass cls) { return H5T_PERS_SOFT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1REFERENCE(JNIEnv *env, jclass cls) { return H5T_REFERENCE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_12(JNIEnv *env, jclass cls) { return H5T_SGN_2; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_1ERROR(JNIEnv *env, jclass cls) { return H5T_SGN_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1SGN_1NONE(JNIEnv *env, jclass cls) { return H5T_SGN_NONE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B16BE(JNIEnv *env, jclass cls) { return H5T_STD_B16BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B16LE(JNIEnv *env, jclass cls) { return H5T_STD_B16LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B32BE(JNIEnv *env, jclass cls) { return H5T_STD_B32BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B32LE(JNIEnv *env, jclass cls) { return H5T_STD_B32LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B64BE(JNIEnv *env, jclass cls) { return H5T_STD_B64BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B64LE(JNIEnv *env, jclass cls) { return H5T_STD_B64LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B8BE(JNIEnv *env, jclass cls) { return H5T_STD_B8BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1B8LE(JNIEnv *env, jclass cls) { return H5T_STD_B8LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I16BE(JNIEnv *env, jclass cls) { return H5T_STD_I16BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I16LE(JNIEnv *env, jclass cls) { return H5T_STD_I16LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I32BE(JNIEnv *env, jclass cls) { return H5T_STD_I32BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I32LE(JNIEnv *env, jclass cls) { return H5T_STD_I32LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I64BE(JNIEnv *env, jclass cls) { return H5T_STD_I64BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I64LE(JNIEnv *env, jclass cls) { return H5T_STD_I64LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I8BE(JNIEnv *env, jclass cls) { return H5T_STD_I8BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1I8LE(JNIEnv *env, jclass cls) { return H5T_STD_I8LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1REF_1DSETREG(JNIEnv *env, jclass cls) { return H5T_STD_REF_DSETREG; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1REF_1OBJ(JNIEnv *env, jclass cls) { return H5T_STD_REF_OBJ; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U16BE(JNIEnv *env, jclass cls) { return H5T_STD_U16BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U16LE(JNIEnv *env, jclass cls) { return H5T_STD_U16LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U32BE(JNIEnv *env, jclass cls) { return H5T_STD_U32BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U32LE(JNIEnv *env, jclass cls) { return H5T_STD_U32LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U64BE(JNIEnv *env, jclass cls) { return H5T_STD_U64BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U64LE(JNIEnv *env, jclass cls) { return H5T_STD_U64LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U8BE(JNIEnv *env, jclass cls) { return H5T_STD_U8BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STD_1U8LE(JNIEnv *env, jclass cls) { return H5T_STD_U8LE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1ERROR(JNIEnv *env, jclass cls) { return H5T_STR_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1NULLPAD(JNIEnv *env, jclass cls) { return H5T_STR_NULLPAD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1NULLTERM(JNIEnv *env, jclass cls) { return H5T_STR_NULLTERM; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_110(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_10; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_111(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_11; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_112(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_12; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_113(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_13; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_114(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_14; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_115(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_15; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_13(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_3; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_14(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_4; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_15(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_5; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_16(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_6; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_17(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_7; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_18(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_8; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1RESERVED_19(JNIEnv *env, jclass cls) { return H5T_STR_RESERVED_9; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STR_1SPACEPAD(JNIEnv *env, jclass cls) { return H5T_STR_SPACEPAD; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1STRING(JNIEnv *env, jclass cls) { return H5T_STRING; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1TIME(JNIEnv *env, jclass cls) { return H5T_TIME; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D32BE(JNIEnv *env, jclass cls) { return H5T_UNIX_D32BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D32LE(JNIEnv *env, jclass cls) { return H5T_UNIX_D32LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D64BE(JNIEnv *env, jclass cls) { return H5T_UNIX_D64BE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1UNIX_1D64LE(JNIEnv *env, jclass cls) { return H5T_UNIX_D64LE; }
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1VARIABLE(JNIEnv *env, jclass cls) { return (int)H5T_VARIABLE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5T_1VLEN(JNIEnv *env, jclass cls) { return H5T_VLEN; }
+
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1CONT(JNIEnv *env, jclass cls) { return H5Z_CB_CONT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1ERROR(JNIEnv *env, jclass cls) { return H5Z_CB_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1FAIL(JNIEnv *env, jclass cls) { return H5Z_CB_FAIL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1CB_1NO(JNIEnv *env, jclass cls) { return H5Z_CB_NO; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1DISABLE_1EDC(JNIEnv *env, jclass cls) { return H5Z_DISABLE_EDC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1ENABLE_1EDC(JNIEnv *env, jclass cls) { return H5Z_ENABLE_EDC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1ERROR_1EDC(JNIEnv *env, jclass cls) { return H5Z_ERROR_EDC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1CONFIG_1DECODE_1ENABLED(JNIEnv *env, jclass cls) { return H5Z_FILTER_CONFIG_DECODE_ENABLED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1CONFIG_1ENCODE_1ENABLED(JNIEnv *env, jclass cls) { return H5Z_FILTER_CONFIG_ENCODE_ENABLED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1DEFLATE(JNIEnv *env, jclass cls) { return H5Z_FILTER_DEFLATE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1ERROR(JNIEnv *env, jclass cls) { return H5Z_FILTER_ERROR; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1FLETCHER32(JNIEnv *env, jclass cls) { return H5Z_FILTER_FLETCHER32; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1MAX(JNIEnv *env, jclass cls) { return H5Z_FILTER_MAX; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1NBIT(JNIEnv *env, jclass cls) {return H5Z_FILTER_NBIT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1NONE(JNIEnv *env, jclass cls) { return H5Z_FILTER_NONE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1RESERVED(JNIEnv *env, jclass cls) { return H5Z_FILTER_RESERVED; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SCALEOFFSET(JNIEnv *env, jclass cls){ return H5Z_FILTER_SCALEOFFSET; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SHUFFLE(JNIEnv *env, jclass cls) { return H5Z_FILTER_SHUFFLE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1SZIP(JNIEnv *env, jclass cls) { return H5Z_FILTER_SZIP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1DEFMASK(JNIEnv *env, jclass cls) { return H5Z_FLAG_DEFMASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1INVMASK(JNIEnv *env, jclass cls) { return H5Z_FLAG_INVMASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1MANDATORY(JNIEnv *env, jclass cls) { return H5Z_FLAG_MANDATORY; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1OPTIONAL(JNIEnv *env, jclass cls) { return H5Z_FLAG_OPTIONAL; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1REVERSE(JNIEnv *env, jclass cls) { return H5Z_FLAG_REVERSE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FLAG_1SKIP_1EDC(JNIEnv *env, jclass cls) { return H5Z_FLAG_SKIP_EDC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1MAX_1NFILTERS(JNIEnv *env, jclass cls) { return H5Z_MAX_NFILTERS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1NO_1EDC(JNIEnv *env, jclass cls) { return H5Z_NO_EDC; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1INT_1MINBITS_1DEFAULT(JNIEnv *env, jclass cls) { return H5Z_SO_INT_MINBITS_DEFAULT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1FLOAT_1DSCALE(JNIEnv *env, jclass cls){return H5Z_SO_FLOAT_DSCALE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1FLOAT_1ESCALE(JNIEnv *env, jclass cls){return H5Z_SO_FLOAT_ESCALE; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SO_1INT(JNIEnv *env, jclass cls){return H5Z_SO_INT; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SHUFFLE_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SHUFFLE_USER_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SHUFFLE_1TOTAL_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SHUFFLE_TOTAL_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SZIP_USER_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1TOTAL_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SZIP_TOTAL_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1MASK(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_MASK; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1PPB(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_PPB; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1BPP(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_BPP; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SZIP_1PARM_1PPS(JNIEnv *env, jclass cls) { return H5Z_SZIP_PARM_PPS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1NBIT_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_NBIT_USER_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1SCALEOFFSET_1USER_1NPARMS(JNIEnv *env, jclass cls) { return H5Z_SCALEOFFSET_USER_NPARMS; }
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5Z_1FILTER_1ALL(JNIEnv *env, jclass cls) { return H5Z_FILTER_ALL; }
 
 #pragma GCC diagnostic pop
 
diff --git a/java/src/jni/h5Imp.c b/java/src/jni/h5Imp.c
index 05d5d59..2eeb075 100644
--- a/java/src/jni/h5Imp.c
+++ b/java/src/jni/h5Imp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -46,7 +44,8 @@ extern jobject visit_callback;
  * Signature: ()I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5open(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5open
+    (JNIEnv *env, jclass clss)
 {
     herr_t retVal = H5open();
     if (retVal < 0)
@@ -61,7 +60,8 @@ Java_hdf_hdf5lib_H5_H5open(JNIEnv *env, jclass clss)
  * Signature: ()I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5close(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5close
+    (JNIEnv *env, jclass clss)
 {
     herr_t retVal = H5close();
     if (retVal < 0)
@@ -76,7 +76,8 @@ Java_hdf_hdf5lib_H5_H5close(JNIEnv *env, jclass clss)
  * Signature: ()I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5dont_1atexit(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5dont_1atexit
+    (JNIEnv *env, jclass clss)
 {
     herr_t retVal = H5dont_atexit();
     if (retVal < 0)
@@ -91,7 +92,8 @@ Java_hdf_hdf5lib_H5_H5dont_1atexit(JNIEnv *env, jclass clss)
  * Signature: ([I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5get_1libversion(JNIEnv *env, jclass clss, jintArray libversion)
+Java_hdf_hdf5lib_H5_H5get_1libversion
+    (JNIEnv *env, jclass clss, jintArray libversion)
 {
     unsigned *theArray = NULL;
     herr_t    status = -1;
@@ -124,7 +126,8 @@ Java_hdf_hdf5lib_H5_H5get_1libversion(JNIEnv *env, jclass clss, jintArray libver
  * Signature: (III)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5check_1version(JNIEnv *env, jclass clss, jint majnum, jint minnum, jint relnum)
+Java_hdf_hdf5lib_H5_H5check_1version
+    (JNIEnv *env, jclass clss, jint majnum, jint minnum, jint relnum)
 {
     return (jint)H5check_version((unsigned)majnum, (unsigned)minnum, (unsigned)relnum);
 } /* end Java_hdf_hdf5lib_H5_H5check_1version */
@@ -136,7 +139,8 @@ Java_hdf_hdf5lib_H5_H5check_1version(JNIEnv *env, jclass clss, jint majnum, jint
  *
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5garbage_1collect(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5garbage_1collect
+    (JNIEnv *env, jclass clss)
 {
     herr_t retVal = H5garbage_collect();
     if (retVal < 0)
@@ -151,7 +155,8 @@ Java_hdf_hdf5lib_H5_H5garbage_1collect(JNIEnv *env, jclass clss)
  * Signature: (IIIIII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits(JNIEnv *env, jclass clss, jint reg_global_lim, jint reg_list_lim,
+Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits
+    (JNIEnv *env, jclass clss, jint reg_global_lim, jint reg_list_lim,
         jint arr_global_lim, jint arr_list_lim, jint blk_global_lim, jint blk_list_lim )
 {
     herr_t retVal = H5set_free_list_limits((int)reg_global_lim, (int)reg_list_lim,
@@ -168,7 +173,8 @@ Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits(JNIEnv *env, jclass clss, jint reg
  * Signature: ()Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5is_1library_1threadsafe(JNIEnv *env, jclass clss)
+Java_hdf_hdf5lib_H5_H5is_1library_1threadsafe
+    (JNIEnv *env, jclass clss)
 {
     hbool_t is_ts = false;
     H5is_library_threadsafe(&is_ts);
diff --git a/java/src/jni/h5Imp.h b/java/src/jni/h5Imp.h
index 6600378..756b8bb 100644
--- a/java/src/jni/h5Imp.h
+++ b/java/src/jni/h5Imp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    H5open
  * Signature: ()I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5open
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5open
   (JNIEnv *, jclass);
 
 /*
@@ -36,7 +35,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5open
  * Method:    H5close
  * Signature: ()I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5close
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5close
   (JNIEnv *, jclass);
 
 /*
@@ -44,7 +44,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5close
  * Method:    H5dont_atexit
  * Signature: ()I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5dont_1atexit
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5dont_1atexit
   (JNIEnv *, jclass);
 
 /*
@@ -52,7 +53,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5dont_1atexit
  * Method:    H5get_libversion
  * Signature: ([I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5get_1libversion
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5get_1libversion
   (JNIEnv *, jclass, jintArray);
 
 /*
@@ -60,7 +62,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5get_1libversion
  * Method:    H5check_version
  * Signature: (III)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5check_1version
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5check_1version
   (JNIEnv *, jclass, jint, jint, jint);
 
 /*
@@ -69,7 +72,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5check_1version
  * Signature: ()I
  *
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5garbage_1collect
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5garbage_1collect
   (JNIEnv *, jclass);
 
 /*
@@ -77,7 +81,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5garbage_1collect
  * Method:    H5set_free_list_limits
  * Signature: (IIIIII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits
   (JNIEnv *, jclass, jint, jint, jint, jint, jint, jint );
 
 /*
@@ -85,7 +90,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5set_1free_1list_1limits
  * Method:    H5is_library_threadsafe
  * Signature: ()Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5is_1library_1threadsafe
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5is_1library_1threadsafe
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5aImp.c b/java/src/jni/h5aImp.c
index a081271..26ec4fc 100644
--- a/java/src/jni/h5aImp.c
+++ b/java/src/jni/h5aImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -60,20 +58,22 @@ static herr_t H5A_iterate_cb(hid_t g_id, const char *name, const H5A_info_t *inf
  * Signature: (JLjava/lang/String;JJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Acreate(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
+Java_hdf_hdf5lib_H5__1H5Acreate
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
           jlong space_id, jlong create_plist)
 {
     hid_t       attr_id = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        attr_id = H5Acreate2((hid_t)loc_id, aName, (hid_t)type_id, (hid_t)space_id, (hid_t)create_plist, (hid_t)H5P_DEFAULT);
 
-    attr_id = H5Acreate2((hid_t)loc_id, aName, (hid_t)type_id, (hid_t)space_id, (hid_t)create_plist, (hid_t)H5P_DEFAULT);
+        UNPIN_JAVA_STRING(name, aName);
 
-    UNPIN_JAVA_STRING(name, aName);
-
-    if (attr_id < 0)
-        h5libraryError(env);
+        if (attr_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)attr_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Acreate */
@@ -84,19 +84,21 @@ Java_hdf_hdf5lib_H5__1H5Acreate(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JLjava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aopen_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring name)
+Java_hdf_hdf5lib_H5__1H5Aopen_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name)
 {
     hid_t       attr_id = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        attr_id = H5Aopen_name((hid_t)loc_id, aName);
 
-    attr_id = H5Aopen_name((hid_t)loc_id, aName);
+        UNPIN_JAVA_STRING(name,aName);
 
-    UNPIN_JAVA_STRING(name,aName);
-
-    if (attr_id < 0)
-        h5libraryError(env);
+        if (attr_id < 0)
+            h5libraryError(env);
+        }
 
     return (jlong)attr_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Aopen_1name */
@@ -107,7 +109,8 @@ Java_hdf_hdf5lib_H5__1H5Aopen_1name(JNIEnv *env, jclass clss, jlong loc_id, jstr
  * Signature: (JI)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aopen_1idx(JNIEnv *env, jclass clss, jlong loc_id, jint idx)
+Java_hdf_hdf5lib_H5__1H5Aopen_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jint idx)
 {
     hid_t attr_id =  H5Aopen_idx((hid_t)loc_id, (unsigned int) idx);
 
@@ -123,7 +126,8 @@ Java_hdf_hdf5lib_H5__1H5Aopen_1idx(JNIEnv *env, jclass clss, jlong loc_id, jint
  * Signature: (JJ[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Awrite(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jbyteArray buf)
+Java_hdf_hdf5lib_H5_H5Awrite
+    (JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jbyteArray buf)
 {
     herr_t   status = -1;
     jbyte   *byteP;
@@ -157,7 +161,8 @@ Java_hdf_hdf5lib_H5_H5Awrite(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_
  * Signature: (JJ[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Aread(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jbyteArray buf)
+Java_hdf_hdf5lib_H5_H5Aread
+    (JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jbyteArray buf)
 {
     herr_t   status = -1;
     jbyte   *byteP;
@@ -193,7 +198,8 @@ Java_hdf_hdf5lib_H5_H5Aread(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_t
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aget_1space(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5__1H5Aget_1space
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     hid_t retVal = -1;
 
@@ -210,7 +216,8 @@ Java_hdf_hdf5lib_H5__1H5Aget_1space(JNIEnv *env, jclass clss, jlong attr_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aget_1type(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5__1H5Aget_1type
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     hid_t retVal = -1;
 
@@ -227,15 +234,15 @@ Java_hdf_hdf5lib_H5__1H5Aget_1type(JNIEnv *env, jclass clss, jlong attr_id)
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1name(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5_H5Aget_1name
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     char    *aName;
     jstring  str = NULL;
     ssize_t  buf_size;
 
     /* get the length of the name */
-    buf_size = H5Aget_name((hid_t)attr_id, NULL, 0);
-
+    buf_size = H5Aget_name((hid_t)attr_id, 0, NULL);
     if (buf_size <= 0) {
         h5badArgument(env, "H5Aget_name:  buf_size <= 0");
     } /* end if */
@@ -267,7 +274,8 @@ Java_hdf_hdf5lib_H5_H5Aget_1name(JNIEnv *env, jclass clss, jlong attr_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     int retVal = -1;
 
@@ -284,19 +292,21 @@ Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Adelete(JNIEnv *env, jclass clss, jlong loc_id, jstring name)
+Java_hdf_hdf5lib_H5_H5Adelete
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name)
 {
     herr_t      status = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
-
-    status = H5Adelete((hid_t)loc_id, aName);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        status = H5Adelete((hid_t)loc_id, aName);
 
-    UNPIN_JAVA_STRING(name, aName);
+        UNPIN_JAVA_STRING(name, aName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Adelete */
@@ -307,7 +317,8 @@ Java_hdf_hdf5lib_H5_H5Adelete(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Aclose(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5__1H5Aclose
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     herr_t retVal = -1;
 
@@ -326,21 +337,23 @@ Java_hdf_hdf5lib_H5__1H5Aclose(JNIEnv *env, jclass clss, jlong attr_id)
  * Signature: (JLjava/lang/String;JJJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Acreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
+Java_hdf_hdf5lib_H5__1H5Acreate2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
         jlong space_id, jlong create_plist, jlong access_plist)
 {
     hid_t       status = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        status = H5Acreate2((hid_t)loc_id, aName, (hid_t)type_id,
+            (hid_t)space_id, (hid_t)create_plist, (hid_t)access_plist );
 
-    status = H5Acreate2((hid_t)loc_id, aName, (hid_t)type_id,
-        (hid_t)space_id, (hid_t)create_plist, (hid_t)access_plist );
+        UNPIN_JAVA_STRING(name, aName);
 
-    UNPIN_JAVA_STRING(name, aName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Acreate2 */
@@ -352,20 +365,22 @@ Java_hdf_hdf5lib_H5__1H5Acreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aopen(JNIEnv *env, jclass clss, jlong obj_id, jstring name, jlong access_plist)
+Java_hdf_hdf5lib_H5__1H5Aopen
+    (JNIEnv *env, jclass clss, jlong obj_id, jstring name, jlong access_plist)
 
 {
     hid_t       retVal = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        retVal = H5Aopen((hid_t)obj_id, aName, (hid_t)access_plist);
 
-    retVal = H5Aopen((hid_t)obj_id, aName, (hid_t)access_plist);
+        UNPIN_JAVA_STRING(name, aName);
 
-    UNPIN_JAVA_STRING(name, aName);
-
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)retVal;
 } /* end Java_hdf_hdf5lib_H5__1H5Aopen */
@@ -376,20 +391,22 @@ Java_hdf_hdf5lib_H5__1H5Aopen(JNIEnv *env, jclass clss, jlong obj_id, jstring na
  * Signature: (JLjava/lang/String;IIJJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jint idx_type, jint order, jlong n, jlong aapl_id, jlong lapl_id)
+Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jint idx_type, jint order, jlong n, jlong aapl_id, jlong lapl_id)
 {
     hid_t       retVal = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(name, aName, -1);
-
-    retVal = H5Aopen_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
-            (H5_iter_order_t)order, (hsize_t)n, (hid_t)aapl_id, (hid_t)lapl_id);
+    PIN_JAVA_STRING(name, aName);
+    if (aName != NULL) {
+        retVal = H5Aopen_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
+                (H5_iter_order_t)order, (hsize_t)n, (hid_t)aapl_id, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING(name, aName);
+        UNPIN_JAVA_STRING(name, aName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)retVal;
 } /* end Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx */
@@ -400,21 +417,23 @@ Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, j
 * Signature: (JLjava/lang/String;Ljava/lang/String;JJJJJ)J
 */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong type_id, jlong space_id, jlong acpl_id, jlong aapl_id, jlong lapl_id)
+Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong type_id, jlong space_id, jlong acpl_id, jlong aapl_id, jlong lapl_id)
 {
     hid_t       retVal = -1;
     const char *aName;
     const char *attrName;
 
-    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName, -1);
-
-    retVal = H5Acreate_by_name((hid_t)loc_id, aName, attrName, (hid_t)type_id,
-            (hid_t)space_id, (hid_t)acpl_id, (hid_t)aapl_id, (hid_t)lapl_id);
+    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+    if (aName != NULL && attrName != NULL) {
+        retVal = H5Acreate_by_name((hid_t)loc_id, aName, attrName, (hid_t)type_id,
+                (hid_t)space_id, (hid_t)acpl_id, (hid_t)aapl_id, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+        UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)retVal;
 } /* end Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name */
@@ -425,22 +444,26 @@ Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Aexists_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Aexists_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
 {
-    htri_t      retVal = -1;
+    htri_t      bval = JNI_FALSE;
     const char *aName;
     const char *attrName;
 
-    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName, JNI_FALSE);
-
-    retVal = H5Aexists_by_name((hid_t)loc_id, aName, attrName, (hid_t)lapl_id);
+    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+    if (aName != NULL && attrName != NULL) {
+        bval = H5Aexists_by_name((hid_t)loc_id, aName, attrName, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+        UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
-    return (jboolean)retVal;
+    return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Aexists_1by_1name */
 
 /*
@@ -449,20 +472,22 @@ Java_hdf_hdf5lib_H5_H5Aexists_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (JLjava/lang/String;Ljava/lang/String)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Arename(JNIEnv *env, jclass clss, jlong loc_id, jstring old_attr_name, jstring new_attr_name)
+Java_hdf_hdf5lib_H5_H5Arename
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring old_attr_name, jstring new_attr_name)
 {
     herr_t      retVal = -1;
     const char *oName;
     const char *nName;
 
-    PIN_JAVA_STRING_TWO(old_attr_name, oName, new_attr_name, nName, -1);
-
-    retVal = H5Arename((hid_t)loc_id, oName, nName);
+    PIN_JAVA_STRING_TWO(old_attr_name, oName, new_attr_name, nName);
+    if (oName != NULL && nName != NULL) {
+        retVal = H5Arename((hid_t)loc_id, oName, nName);
 
-    UNPIN_JAVA_STRING_TWO(old_attr_name, oName, new_attr_name, nName);
+        UNPIN_JAVA_STRING_TWO(old_attr_name, oName, new_attr_name, nName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Arename */
@@ -474,21 +499,23 @@ Java_hdf_hdf5lib_H5_H5Arename(JNIEnv *env, jclass clss, jlong loc_id, jstring ol
  * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Arename_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring old_attr_name, jstring new_attr_name, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Arename_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring old_attr_name, jstring new_attr_name, jlong lapl_id)
 {
     herr_t      retVal = -1;
     const char *aName;
     const char *oName;
     const char *nName;
 
-    PIN_JAVA_STRING_THREE(obj_name, aName, old_attr_name, oName, new_attr_name, nName, -1);
-
-    retVal = H5Arename_by_name((hid_t)loc_id, aName, oName, nName, (hid_t)lapl_id);
+    PIN_JAVA_STRING_THREE(obj_name, aName, old_attr_name, oName, new_attr_name, nName);
+    if (aName != NULL && oName != NULL && nName != NULL) {
+        retVal = H5Arename_by_name((hid_t)loc_id, aName, oName, nName, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING_THREE(obj_name, aName, old_attr_name, oName, new_attr_name, nName);
+        UNPIN_JAVA_STRING_THREE(obj_name, aName, old_attr_name, oName, new_attr_name, nName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Arename_1by_1name */
@@ -499,7 +526,8 @@ Java_hdf_hdf5lib_H5_H5Arename_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (JLjava/lang/String;IIJJ)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
 {
     size_t   buf_size;
     char    *aValue;
@@ -507,44 +535,45 @@ Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
     jstring  str = NULL;
     const char *aName;
 
-    PIN_JAVA_STRING(obj_name, aName, NULL);
+    PIN_JAVA_STRING(obj_name, aName);
+    if (aName != NULL) {
+        /* get the length of the attribute name */
+        status_size = H5Aget_name_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
+                (H5_iter_order_t) order, (hsize_t) n, (char*)NULL, (size_t)0, (hid_t)lapl_id);
 
-    /* get the length of the attribute name */
-    status_size = H5Aget_name_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
-            (H5_iter_order_t) order, (hsize_t) n, (char*)NULL, (size_t)0, (hid_t)lapl_id);
-
-    if(status_size < 0) {
-        UNPIN_JAVA_STRING(obj_name, aName);
-        h5libraryError(env);
-    } /* end if */
-    else {
-        buf_size = (size_t)status_size + 1;/* add extra space for the null terminator */
-
-        aValue = (char*)HDmalloc(sizeof(char) * buf_size);
-        if (aValue == NULL) {
+        if(status_size < 0) {
             UNPIN_JAVA_STRING(obj_name, aName);
-            h5outOfMemory(env, "H5Aget_name_by_idx:  malloc failed ");
+            h5libraryError(env);
         } /* end if */
         else {
-            status_size = H5Aget_name_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
-                    (H5_iter_order_t) order, (hsize_t) n, (char*)aValue, (size_t)buf_size, (hid_t)lapl_id);
-
-            UNPIN_JAVA_STRING(obj_name, aName);
+            buf_size = (size_t)status_size + 1;/* add extra space for the null terminator */
 
-            if (status_size < 0) {
-                HDfree(aValue);
-                h5libraryError(env);
+            aValue = (char*)HDmalloc(sizeof(char) * buf_size);
+            if (aValue == NULL) {
+                UNPIN_JAVA_STRING(obj_name, aName);
+                h5outOfMemory(env, "H5Aget_name_by_idx:  malloc failed ");
             } /* end if */
             else {
-                str = ENVPTR->NewStringUTF(ENVPAR aValue);
-                HDfree(aValue);
-                if (str == NULL) {
-                    /* exception -- fatal JNI error */
-                    h5JNIFatalError(env, "H5Aget_name_by_idx:  return string not created");
+                status_size = H5Aget_name_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
+                        (H5_iter_order_t) order, (hsize_t) n, (char*)aValue, (size_t)buf_size, (hid_t)lapl_id);
+
+                UNPIN_JAVA_STRING(obj_name, aName);
+
+                if (status_size < 0) {
+                    HDfree(aValue);
+                    h5libraryError(env);
                 } /* end if */
+                else {
+                    str = ENVPTR->NewStringUTF(ENVPAR aValue);
+                    HDfree(aValue);
+                    if (str == NULL) {
+                        /* exception -- fatal JNI error */
+                        h5JNIFatalError(env, "H5Aget_name_by_idx:  return string not created");
+                    } /* end if */
+                } /* end else */
             } /* end else */
         } /* end else */
-    } /* end else */
+    }
     return str;
 } /* end Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx */
 
@@ -554,7 +583,8 @@ Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1storage_1size(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5_H5Aget_1storage_1size
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     hsize_t retVal = (hsize_t)-1;
 
@@ -570,7 +600,8 @@ Java_hdf_hdf5lib_H5_H5Aget_1storage_1size(JNIEnv *env, jclass clss, jlong attr_i
  * Signature: (J)Lhdf/hdf5lib/structs/H5A_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1info(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5_H5Aget_1info
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     herr_t     status = -1;
     H5A_info_t ainfo;
@@ -598,7 +629,8 @@ Java_hdf_hdf5lib_H5_H5Aget_1info(JNIEnv *env, jclass clss, jlong attr_id)
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5A_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
 {
     herr_t      status;
     H5A_info_t  ainfo;
@@ -606,23 +638,24 @@ Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
     jobject     ret_obj = NULL;
     const char *aName;
 
-    PIN_JAVA_STRING(obj_name, aName, NULL);
+    PIN_JAVA_STRING(obj_name, aName);
+    if (aName != NULL) {
+        status = H5Aget_info_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
+                (H5_iter_order_t)order, (hsize_t)n, &ainfo, (hid_t)lapl_id);
 
-    status = H5Aget_info_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type,
-            (H5_iter_order_t)order, (hsize_t)n, &ainfo, (hid_t)lapl_id);
-
-    UNPIN_JAVA_STRING(obj_name, aName);
+        UNPIN_JAVA_STRING(obj_name, aName);
 
-    if (status < 0) {
-       h5libraryError(env);
-    } /* end if */
-    else {
-        args[0].z = ainfo.corder_valid;
-        args[1].j = ainfo.corder;
-        args[2].i = ainfo.cset;
-        args[3].j = (jlong)ainfo.data_size;
-        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5A_info_t", "(ZJIJ)V", args);
-    } /* end else */
+        if (status < 0) {
+        h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].z = ainfo.corder_valid;
+            args[1].j = ainfo.corder;
+            args[2].i = ainfo.cset;
+            args[3].j = (jlong)ainfo.data_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5A_info_t", "(ZJIJ)V", args);
+        } /* end else */
+    }
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx */
 
@@ -632,7 +665,8 @@ Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)Lhdf/hdf5lib/structs/H5A_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
 {
     const char *aName;
     const char *attrName;
@@ -641,22 +675,23 @@ Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_i
     jvalue      args[4];
     jobject     ret_obj = NULL;
 
-    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName, NULL);
+    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+    if (aName != NULL && attrName != NULL) {
+        status = H5Aget_info_by_name((hid_t)loc_id, aName, attrName, &ainfo, (hid_t)lapl_id);
 
-    status = H5Aget_info_by_name((hid_t)loc_id, aName, attrName, &ainfo, (hid_t)lapl_id);
+        UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
 
-    UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
-
-    if (status < 0) {
-       h5libraryError(env);
-    } /* end if */
-    else {
-        args[0].z = ainfo.corder_valid;
-        args[1].j = ainfo.corder;
-        args[2].i = ainfo.cset;
-        args[3].j = (jlong)ainfo.data_size;
-        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5A_info_t", "(ZJIJ)V", args);
-    } /* end else */
+        if (status < 0) {
+        h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].z = ainfo.corder_valid;
+            args[1].j = ainfo.corder;
+            args[2].i = ainfo.cset;
+            args[3].j = (jlong)ainfo.data_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5A_info_t", "(ZJIJ)V", args);
+        } /* end else */
+    }
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name */
 
@@ -666,20 +701,22 @@ Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_i
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Adelete_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Adelete_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong lapl_id)
 {
     herr_t      retVal = -1;
     const char *aName;
     const char *attrName;
 
-    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName, -1);
-
-    retVal = H5Adelete_by_name((hid_t)loc_id, aName, attrName, (hid_t)lapl_id);
+    PIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+    if (aName != NULL && attrName != NULL) {
+        retVal = H5Adelete_by_name((hid_t)loc_id, aName, attrName, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
+        UNPIN_JAVA_STRING_TWO(obj_name, aName, attr_name, attrName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Adelete_1by_1name */
@@ -690,21 +727,23 @@ Java_hdf_hdf5lib_H5_H5Adelete_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (JLjava/lang/String;)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Aexists(JNIEnv *env, jclass clss, jlong obj_id, jstring attr_name)
+Java_hdf_hdf5lib_H5_H5Aexists
+    (JNIEnv *env, jclass clss, jlong obj_id, jstring attr_name)
 {
     htri_t      bval = JNI_FALSE;
     const char *aName;
 
-    PIN_JAVA_STRING(attr_name, aName, JNI_FALSE);
+    PIN_JAVA_STRING(attr_name, aName);
+    if (aName != NULL) {
+        bval = H5Aexists((hid_t)obj_id, aName);
 
-    bval = H5Aexists((hid_t)obj_id, aName);
+        UNPIN_JAVA_STRING(attr_name, aName);
 
-    UNPIN_JAVA_STRING(attr_name, aName);
-
-    if (bval > 0)
-        bval = JNI_TRUE;
-    else if (bval < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
     return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Aexists */
@@ -715,19 +754,21 @@ Java_hdf_hdf5lib_H5_H5Aexists(JNIEnv *env, jclass clss, jlong obj_id, jstring at
  * Signature: (JLjava/lang/String;IIJJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jint idx_type, jint order, jlong n, jlong lapl_id)
 {
     herr_t      status = -1;
     const char *aName;
 
-    PIN_JAVA_STRING0(obj_name, aName);
-
-    status = H5Adelete_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t)n, (hid_t)lapl_id);
+    PIN_JAVA_STRING(obj_name, aName);
+    if (aName != NULL) {
+        status = H5Adelete_by_idx((hid_t)loc_id, aName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t)n, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING(obj_name, aName);
+        UNPIN_JAVA_STRING(obj_name, aName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx */
 
 /*
@@ -736,21 +777,23 @@ Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, j
  * Signature: (JLjava/lang/String;Ljava/lang/String;JJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong aapl_id, jlong lapl_id)
+Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring obj_name, jstring attr_name, jlong aapl_id, jlong lapl_id)
 
 {
     hid_t       status = -1;
     const char *aName;
     const char *oName;
 
-    PIN_JAVA_STRING_TWO(obj_name, oName, attr_name, aName, -1);
-
-    status = H5Aopen_by_name((hid_t)loc_id, oName, aName, (hid_t)aapl_id, (hid_t)lapl_id);
+    PIN_JAVA_STRING_TWO(obj_name, oName, attr_name, aName);
+    if (oName != NULL && aName != NULL) {
+        status = H5Aopen_by_name((hid_t)loc_id, oName, aName, (hid_t)aapl_id, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING_TWO(obj_name, oName, attr_name, aName);
+        UNPIN_JAVA_STRING_TWO(obj_name, oName, attr_name, aName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name */
@@ -761,7 +804,8 @@ Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist(JNIEnv *env, jclass clss, jlong attr_id)
+Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist
+    (JNIEnv *env, jclass clss, jlong attr_id)
 {
     hid_t retVal = -1;
 
@@ -773,7 +817,8 @@ Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist(JNIEnv *env, jclass clss, jlong attr
 } /* end Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist */
 
 static herr_t
-H5A_iterate_cb(hid_t g_id, const char *name, const H5A_info_t *info, void *op_data) {
+H5A_iterate_cb
+    (hid_t g_id, const char *name, const H5A_info_t *info, void *op_data) {
     JNIEnv    *cbenv;
     jint       status = -1;
     jclass     cls;
@@ -819,7 +864,8 @@ H5A_iterate_cb(hid_t g_id, const char *name, const H5A_info_t *info, void *op_da
  * Signature: (JIIJLjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Aiterate(JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Aiterate
+    (JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
           jlong idx, jobject callback_op, jobject op_data)
 {
     hsize_t       start_idx = (hsize_t)idx;
@@ -847,7 +893,8 @@ Java_hdf_hdf5lib_H5_H5Aiterate(JNIEnv *env, jclass clss, jlong grp_id, jint idx_
  * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Aiterate_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Aiterate_1by_1name
+    (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
           jlong idx, jobject callback_op, jobject op_data, jlong access_id)
 {
     const char   *lName;
@@ -861,14 +908,15 @@ Java_hdf_hdf5lib_H5_H5Aiterate_1by_1name(JNIEnv *env, jclass clss, jlong grp_id,
         h5nullArgument(env,  "H5Literate_by_name:  op_data or callback_op is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING(name, lName, -1);
+        PIN_JAVA_STRING(name, lName);
+        if (lName != NULL) {
+            status = H5Aiterate_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t*)&start_idx, (H5A_operator2_t)H5A_iterate_cb, (void*)op_data, (hid_t)access_id);
 
-        status = H5Aiterate_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t*)&start_idx, (H5A_operator2_t)H5A_iterate_cb, (void*)op_data, (hid_t)access_id);
+            UNPIN_JAVA_STRING(name, lName);
 
-        UNPIN_JAVA_STRING(name, lName);
-
-        if (status < 0)
-            h5libraryError(env);
+            if (status < 0)
+                h5libraryError(env);
+        }
     } /* end else */
 
     return (jint)status;
diff --git a/java/src/jni/h5aImp.h b/java/src/jni/h5aImp.h
index bbc61f5..62769fd 100644
--- a/java/src/jni/h5aImp.h
+++ b/java/src/jni/h5aImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -29,7 +27,8 @@ extern "C" {
  * Method:    H5Acreate
  * Signature: (JLjava/lang/String;JJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Acreate
   (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong);
 
 /*
@@ -37,7 +36,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate
  * Method:    H5Aopen_name
  * Signature: (JLjava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1name
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aopen_1name
   (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -45,7 +45,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1name
  * Method:    H5Aopen_idx
  * Signature: (JI)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1idx
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aopen_1idx
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -53,7 +54,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1idx
  * Method:    H5Awrite
  * Signature: (JJ[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Awrite
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Awrite
   (JNIEnv *, jclass, jlong, jlong, jbyteArray);
 
 /*
@@ -61,7 +63,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Awrite
  * Method:    H5Aread
  * Signature: (JJ[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aread
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Aread
   (JNIEnv *, jclass, jlong, jlong, jbyteArray);
 
 /*
@@ -69,7 +72,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aread
  * Method:    H5Aget_space
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1space
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aget_1space
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -77,7 +81,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1space
  * Method:    H5Aget_type
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1type
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aget_1type
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -85,7 +90,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1type
  * Method:    H5Aget_name
  * Signature: (J)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Aget_1name
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1name
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -93,7 +99,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Aget_1name
  * Method:    H5Aget_num_attrs
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -101,7 +108,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aget_1num_1attrs
  * Method:    H5Adelete
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Adelete
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Adelete
   (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -109,7 +117,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Adelete
  * Method:    H5Aclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Aclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Aclose
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -117,7 +126,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Aclose
  * Method:    _H5Acreate2
  * Signature: (JLjava/lang/String;JJJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Acreate2
 (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong, jlong);
 
 /*
@@ -125,7 +135,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate2
  * Method:    _H5Aopen
  * Signature: (JLjava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aopen
   (JNIEnv *, jclass, jlong, jstring, jlong);
 
 /*
@@ -133,7 +144,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen
  * Method:    _H5Aopen_by_idx
  * Signature: (JLjava/lang/String;IIJJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx
   (JNIEnv *, jclass, jlong, jstring, jint, jint, jlong, jlong, jlong);
 
 /*
@@ -141,7 +153,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1by_1idx
 * Method:    _H5Acreate_by_name
 * Signature: (JLjava/lang/String;Ljava/lang/String;JJJJJ)J
 */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name
 (JNIEnv *, jclass, jlong, jstring, jstring, jlong, jlong, jlong, jlong, jlong);
 
 /*
@@ -149,7 +162,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Acreate_1by_1name
  * Method:    H5Aexists_by_name
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Aexists_1by_1name
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Aexists_1by_1name
   (JNIEnv *, jclass, jlong, jstring, jstring, jlong);
 
 /*
@@ -157,7 +171,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Aexists_1by_1name
  * Method:    H5Arename
  * Signature: (JLjava/lang/String;Ljava/lang/String)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Arename
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Arename
   (JNIEnv *, jclass, jlong, jstring, jstring);
 
 /*
@@ -165,7 +180,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Arename
  * Method:    H5Arename_by_name
  * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Arename_1by_1name
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Arename_1by_1name
   (JNIEnv *, jclass, jlong, jstring, jstring, jstring, jlong);
 
 /*
@@ -173,7 +189,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Arename_1by_1name
  * Method:    H5Aget_name_by_idx
  * Signature: (JLjava/lang/String;IIJJ)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx
   (JNIEnv *, jclass, jlong, jstring, jint, jint, jlong, jlong);
 
 /*
@@ -181,16 +198,17 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Aget_1name_1by_1idx
  * Method:    H5Aget_storage_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Aget_1storage_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1storage_1size
   (JNIEnv *, jclass, jlong);
 
-
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Aget_info
  * Signature: (J)Lhdf/hdf5lib/structs/H5A_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1info
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -198,7 +216,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info
  * Method:    H5Aget_info_by_idx
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5A_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx
   (JNIEnv *, jclass, jlong, jstring, jint, jint, jlong, jlong);
 
 /*
@@ -206,7 +225,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1idx
  * Method:    H5Aget_info_by_name
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)Lhdf/hdf5lib/structs/H5A_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name
   (JNIEnv *, jclass, jlong, jstring, jstring, jlong);
 
 /*
@@ -214,7 +234,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Aget_1info_1by_1name
  * Method:    H5Adelete_by_name
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Adelete_1by_1name
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Adelete_1by_1name
   (JNIEnv *, jclass, jlong, jstring, jstring, jlong);
 
 /*
@@ -222,7 +243,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Adelete_1by_1name
  * Method:    H5Aexists
  * Signature: (JLjava/lang/String;)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Aexists
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Aexists
   (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -230,7 +252,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Aexists
  * Method:    H5Adelete_by_idx
  * Signature: (JLjava/lang/String;IIJJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx
   (JNIEnv *, jclass, jlong, jstring, jint, jint, jlong, jlong);
 
 /*
@@ -238,7 +261,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Adelete_1by_1idx
  * Method:    _H5Aopen_by_name
  * Signature: (JLjava/lang/String;Ljava/lang/String;JJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name
   (JNIEnv *, jclass, jlong, jstring, jstring, jlong, jlong);
 
 /*
@@ -246,7 +270,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aopen_1by_1name
  * Method:    H5Aget_create_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -254,7 +279,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Aget_1create_1plist
  * Method:    H5Aiterate
  * Signature: (JIIJLjava/lang/Object;Ljava/lang/Object;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aiterate
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Aiterate
   (JNIEnv*, jclass, jlong, jint, jint, jlong, jobject, jobject);
 
 /*
@@ -262,7 +288,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aiterate
  * Method:    H5Aiterate_by_name
  * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Aiterate_1by_1name
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Aiterate_1by_1name
   (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jobject, jobject, jlong);
 
 
diff --git a/java/src/jni/h5dImp.c b/java/src/jni/h5dImp.c
index 9e03051..66efed0 100644
--- a/java/src/jni/h5dImp.c
+++ b/java/src/jni/h5dImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -55,6 +53,7 @@ extern jobject visit_callback;
 /* Local Prototypes */
 /********************/
 
+static herr_t H5DreadVL_asstr (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf);
 static herr_t H5DreadVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf);
 static herr_t H5DreadVL_array (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf);
 static herr_t H5DwriteVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf);
@@ -154,20 +153,22 @@ static herr_t H5DwriteVL_array (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid
  * Signature: (JLjava/lang/String;JJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dcreate(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
+Java_hdf_hdf5lib_H5__1H5Dcreate
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
           jlong space_id, jlong create_plist_id)
 {
     hid_t       dset_id = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        dset_id = H5Dcreate2((hid_t)loc_id, fileName, (hid_t)type_id, (hid_t)space_id, H5P_DEFAULT, (hid_t)create_plist_id, H5P_DEFAULT);
 
-    dset_id = H5Dcreate2((hid_t)loc_id, fileName, (hid_t)type_id, (hid_t)space_id, H5P_DEFAULT, (hid_t)create_plist_id, H5P_DEFAULT);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (dset_id < 0)
-        h5libraryError(env);
+        if (dset_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)dset_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Dcreate */
@@ -178,18 +179,20 @@ Java_hdf_hdf5lib_H5__1H5Dcreate(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JLjava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dopen(JNIEnv *env, jclass clss, jlong loc_id, jstring name)
+Java_hdf_hdf5lib_H5__1H5Dopen
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name)
 {
     hid_t       dset_id = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        dset_id = H5Dopen2((hid_t)loc_id, fileName, H5P_DEFAULT);
 
-    dset_id = H5Dopen2((hid_t)loc_id, fileName, H5P_DEFAULT);
-
-    UNPIN_JAVA_STRING(name, fileName);
-    if (dset_id < 0)
-        h5libraryError(env);
+        UNPIN_JAVA_STRING(name, fileName);
+        if (dset_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)dset_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Dopen */
@@ -200,7 +203,8 @@ Java_hdf_hdf5lib_H5__1H5Dopen(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dget_1space(JNIEnv *env, jclass clss, jlong dataset_id)
+Java_hdf_hdf5lib_H5__1H5Dget_1space
+    (JNIEnv *env, jclass clss, jlong dataset_id)
 {
     hid_t retVal = -1;
 
@@ -217,7 +221,8 @@ Java_hdf_hdf5lib_H5__1H5Dget_1space(JNIEnv *env, jclass clss, jlong dataset_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dget_1type(JNIEnv *env, jclass clss, jlong dataset_id)
+Java_hdf_hdf5lib_H5__1H5Dget_1type
+    (JNIEnv *env, jclass clss, jlong dataset_id)
 {
     hid_t retVal = -1;
 
@@ -234,7 +239,8 @@ Java_hdf_hdf5lib_H5__1H5Dget_1type(JNIEnv *env, jclass clss, jlong dataset_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist(JNIEnv *env, jclass clss, jlong dataset_id)
+Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist
+    (JNIEnv *env, jclass clss, jlong dataset_id)
 {
     hid_t retVal = -1;
 
@@ -246,7 +252,8 @@ Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist(JNIEnv *env, jclass clss, jlong data
 } /* end Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist */
 
 static htri_t
-H5Tdetect_variable_str(hid_t tid) {
+H5Tdetect_variable_str
+    (hid_t tid) {
     htri_t ret_val = 0;
 
     if (H5Tget_class(tid) == H5T_COMPOUND) {
@@ -275,10 +282,11 @@ H5Tdetect_variable_str(hid_t tid) {
  * Signature: (JJJJJ[BZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jbyteArray buf, jboolean isCriticalPinning)
 {
-    herr_t   status;
+    herr_t   status = -1;
     jbyte   *buffP;
     jboolean isCopy;
     htri_t data_class;
@@ -330,10 +338,11 @@ Java_hdf_hdf5lib_H5_H5Dread(JNIEnv *env, jclass clss, jlong dataset_id, jlong me
  * Signature: (JJJJJ[BZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jbyteArray buf, jboolean isCriticalPinning)
 {
-    herr_t   status;
+    herr_t   status = -1;
     jbyte   *buffP;
     jboolean isCopy;
     htri_t data_class;
@@ -381,7 +390,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite(JNIEnv *env, jclass clss, jlong dataset_id, jlong m
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Dclose(JNIEnv *env, jclass clss, jlong dataset_id)
+Java_hdf_hdf5lib_H5__1H5Dclose
+    (JNIEnv *env, jclass clss, jlong dataset_id)
 {
     herr_t retVal = -1;
 
@@ -399,7 +409,8 @@ Java_hdf_hdf5lib_H5__1H5Dclose(JNIEnv *env, jclass clss, jlong dataset_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Dget_1storage_1size(JNIEnv *env, jclass clss, jlong dataset_id)
+Java_hdf_hdf5lib_H5_H5Dget_1storage_1size
+    (JNIEnv *env, jclass clss, jlong dataset_id)
 {
     hsize_t retVal = (hsize_t)-1;
 
@@ -419,7 +430,8 @@ Java_hdf_hdf5lib_H5_H5Dget_1storage_1size(JNIEnv *env, jclass clss, jlong datase
  * Signature: (JJJ[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim(JNIEnv *env, jclass clss, jlong type_id, jlong space_id,
+Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim
+    (JNIEnv *env, jclass clss, jlong type_id, jlong space_id,
           jlong xfer_plist_id, jbyteArray buf)
 {
     herr_t   status = -1;
@@ -448,23 +460,13 @@ Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim(JNIEnv *env, jclass clss, jlong type_id, jl
 } /* end Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim */
 
 /*
-    ////////////////////////////////////////////////////////////////////
-    //                                                                //
-    //         New APIs for read data from library                    //
-    //  Using H5Dread(..., Object buf) requires function calls        //
-    //  theArray.emptyBytes() and theArray.arrayify(buf), which       //
-    //  triples the actual memory needed by the data set.             //
-    //  Using the following APIs solves the problem.                  //
-    //                                                                //
-    ////////////////////////////////////////////////////////////////////
-*/
-/*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Dread_short
  * Signature: (JJJJJ[SZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1short(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1short
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jshortArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -518,7 +520,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1short(JNIEnv *env, jclass clss, jlong dataset_id, j
  * Signature: (JJJJJ[SZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1short(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1short
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jshortArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -569,7 +572,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1short(JNIEnv *env, jclass clss, jlong dataset_id,
  * Signature: (JJJJJ[IZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1int(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1int
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jintArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -623,7 +627,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1int(JNIEnv *env, jclass clss, jlong dataset_id, jlo
  * Signature: (JJJJJ[IZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1int(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1int
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jintArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -674,7 +679,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1int(JNIEnv *env, jclass clss, jlong dataset_id, jl
  * Signature: (JJJJJ[JZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1long(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1long
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jlongArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -728,7 +734,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1long(JNIEnv *env, jclass clss, jlong dataset_id, jl
  * Signature: (JJJJJ[JZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1long(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1long
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jlongArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -778,7 +785,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1long(JNIEnv *env, jclass clss, jlong dataset_id, j
  * Signature: (JJJJJ[FZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1float(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1float
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jfloatArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -832,7 +840,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1float(JNIEnv *env, jclass clss, jlong dataset_id, j
  * Signature: (JJJJJ[FZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1float(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1float
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jfloatArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -882,7 +891,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1float(JNIEnv *env, jclass clss, jlong dataset_id,
  * Signature: (JJJJJ[DZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1double(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1double
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jdoubleArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -936,7 +946,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1double(JNIEnv *env, jclass clss, jlong dataset_id,
  * Signature: (JJJJJ[DZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1double(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1double
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jdoubleArray buf, jboolean isCriticalPinning)
 {
     herr_t   status = -1;
@@ -982,11 +993,102 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1double(JNIEnv *env, jclass clss, jlong dataset_id,
 
 /*
  * Class:     hdf_hdf5lib_H5
+ * Method:    H5DreadVL
+ * Signature: (JJJJJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5DreadVL
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+          jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
+{
+    herr_t  status = -1;
+    htri_t  isVlenStr=0;
+
+    if (buf == NULL) {
+        h5nullArgument(env, "H5DreadVL:  buf is NULL");
+    } /* end if */
+    else {
+        isVlenStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
+
+        if (isVlenStr)
+            h5badArgument(env, "H5DreadVL: type is not variable length non-string");
+        else
+            status = H5DreadVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id,
+                                        (hid_t)mem_space_id, (hid_t)file_space_id,
+                                        (hid_t)xfer_plist_id, buf);
+    } /* end else */
+
+    return (jint)status;
+} /* end Java_hdf_hdf5lib_H5_H5Dread_1VLStrings */
+
+herr_t
+H5DreadVL_asstr
+    (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf)
+{
+    jint    i;
+    jint    n;
+    jstring jstr;
+    h5str_t h5str;
+    hvl_t  *rdata;
+    size_t  size;
+    size_t  max_len = 0;
+    herr_t  status = -1;
+
+    n = ENVPTR->GetArrayLength(ENVPAR buf);
+    rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t));
+    if (rdata == NULL) {
+        h5JNIFatalError(env, "H5DreadVL_notstr:  failed to allocate buff for read");
+    } /* end if */
+    else {
+        status = H5Dread(did, tid, mem_sid, file_sid, xfer_plist_id, rdata);
+
+        if (status < 0) {
+            H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
+            HDfree(rdata);
+            h5JNIFatalError(env, "H5DreadVL_notstr: failed to read data");
+        } /* end if */
+        else {
+            max_len = 1;
+            for (i=0; i < n; i++) {
+                if ((rdata + i)->len > max_len)
+                    max_len = (rdata + i)->len;
+            }
+
+            size = H5Tget_size(tid) * max_len;
+            HDmemset(&h5str, 0, sizeof(h5str_t));
+            h5str_new(&h5str, 4 * size);
+
+            if (h5str.s == NULL) {
+                H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
+                HDfree(rdata);
+                h5JNIFatalError(env, "H5DreadVL_notstr:  failed to allocate buf");
+            } /* end if */
+            else {
+                for (i=0; i < n; i++) {
+                    h5str.s[0] = '\0';
+                    h5str_sprintf(&h5str, did, tid, rdata+i, 0);
+                    jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s);
+                    ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
+                } /* end for */
+                h5str_free(&h5str);
+
+                H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
+                HDfree(rdata);
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+    return status;
+}
+
+/*
+ * Class:     hdf_hdf5lib_H5
  * Method:    H5Dread_string
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1string(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1string
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jobjectArray j_buf)
 {
     herr_t  status = -1;
@@ -1061,7 +1163,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1string(JNIEnv *env, jclass clss, jlong dataset_id,
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1string(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1string
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jobjectArray j_buf)
 {
     herr_t  status = -1;
@@ -1128,7 +1231,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1string(JNIEnv *env, jclass clss, jlong dataset_id,
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dread_1VLStrings
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
 {
     herr_t  status = -1;
@@ -1138,7 +1242,7 @@ Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_i
         h5nullArgument(env, "H5Dread_VLStrings:  buf is NULL");
     } /* end if */
     else {
-        isVlenStr = H5Tis_variable_str((hid_t)mem_type_id);
+        isVlenStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
 
         if (isVlenStr) {
             status = H5DreadVL_str(env, (hid_t)dataset_id, (hid_t)mem_type_id,
@@ -1153,8 +1257,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_i
 } /* end Java_hdf_hdf5lib_H5_H5Dread_1VLStrings */
 
 herr_t
-H5DreadVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t
-        file_sid, hid_t xfer_plist_id, jobjectArray buf)
+H5DreadVL_str
+    (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf)
 {
     char  **strs;
     jstring jstr;
@@ -1205,7 +1309,8 @@ H5DreadVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
+Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
           jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
 {
     herr_t  status = -1;
@@ -1230,8 +1335,8 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_
 } /* end Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings */
 
 herr_t
-H5DwriteVL_str(JNIEnv *env, hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id,
-        hid_t file_space_id, hid_t xfer_plist_id, jobjectArray buf)
+H5DwriteVL_str
+    (JNIEnv *env, hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, jobjectArray buf)
 {
     herr_t  status = -1;
     char  **wdata;
@@ -1288,7 +1393,8 @@ H5DwriteVL_str(JNIEnv *env, hid_t dataset_id, hid_t mem_type_id, hid_t mem_space
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref (JNIEnv *env, jclass clss,
+Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref
+    (JNIEnv *env, jclass clss,
         jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
         jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
 {
@@ -1345,7 +1451,8 @@ Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref (JNIEnv *env, jclass clss,
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data (JNIEnv *env, jclass clss,
+Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data
+    (JNIEnv *env, jclass clss,
         jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
         jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
 {
@@ -1422,19 +1529,21 @@ Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data (JNIEnv *env, jclass clss,
  * Signature: (JLjava/lang/String;JJJJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dcreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
+Java_hdf_hdf5lib_H5__1H5Dcreate2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type_id,
           jlong space_id, jlong link_plist_id, jlong create_plist_id, jlong access_plist_id)
 {
     hid_t       dset_id = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
-
-    dset_id = H5Dcreate2((hid_t)loc_id, fileName, (hid_t)type_id, (hid_t)space_id, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        dset_id = H5Dcreate2((hid_t)loc_id, fileName, (hid_t)type_id, (hid_t)space_id, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id);
 
-    UNPIN_JAVA_STRING(name, fileName);
-    if (dset_id < 0)
-        h5libraryError(env);
+        UNPIN_JAVA_STRING(name, fileName);
+        if (dset_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)dset_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Dcreate2 */
@@ -1445,18 +1554,20 @@ Java_hdf_hdf5lib_H5__1H5Dcreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dopen2(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist)
+Java_hdf_hdf5lib_H5__1H5Dopen2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist)
 {
-    hid_t       dset_id;
+    hid_t       dset_id = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
-
-    dset_id = H5Dopen2((hid_t)loc_id, fileName, (hid_t)access_plist);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        dset_id = H5Dopen2((hid_t)loc_id, fileName, (hid_t)access_plist);
 
-    UNPIN_JAVA_STRING(name, fileName);
-    if (dset_id < 0)
-        h5libraryError(env);
+        UNPIN_JAVA_STRING(name, fileName);
+        if (dset_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)dset_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Dopen2 */
@@ -1467,7 +1578,8 @@ Java_hdf_hdf5lib_H5__1H5Dopen2(JNIEnv *env, jclass clss, jlong loc_id, jstring n
  * Signature: (JJJJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Dcreate_1anon(JNIEnv *env, jclass clss, jlong loc_id, jlong type_id, jlong space_id, jlong dcpl_id, jlong dapl_id)
+Java_hdf_hdf5lib_H5__1H5Dcreate_1anon
+    (JNIEnv *env, jclass clss, jlong loc_id, jlong type_id, jlong space_id, jlong dcpl_id, jlong dapl_id)
 {
     hid_t dset_id = -1;
 
@@ -1484,7 +1596,8 @@ Java_hdf_hdf5lib_H5__1H5Dcreate_1anon(JNIEnv *env, jclass clss, jlong loc_id, jl
  * Signature: (J)I;
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dget_1space_1status(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Dget_1space_1status
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     H5D_space_status_t space_status = H5D_SPACE_STATUS_ERROR;
 
@@ -1500,7 +1613,8 @@ Java_hdf_hdf5lib_H5_H5Dget_1space_1status(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Dget_1access_1plist(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Dget_1access_1plist
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     hid_t retVal = -1;
 
@@ -1517,7 +1631,8 @@ Java_hdf_hdf5lib_H5_H5Dget_1access_1plist(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Dget_1offset(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Dget_1offset
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     haddr_t offset = HADDR_UNDEF;
 
@@ -1534,7 +1649,8 @@ Java_hdf_hdf5lib_H5_H5Dget_1offset(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (JJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size(JNIEnv *env, jclass clss, jlong dataset_id, jlong type_id, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size
+    (JNIEnv *env, jclass clss, jlong dataset_id, jlong type_id, jlong space_id)
 {
   hsize_t sz = 0;
 
@@ -1550,7 +1666,8 @@ Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size(JNIEnv *env, jclass clss, jlong data
  * Signature: ([BJ[BJJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Dfill(JNIEnv *env, jclass clss, jbyteArray fill, jlong fill_type_id, jbyteArray buf, jlong buf_type_id, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Dfill
+    (JNIEnv *env, jclass clss, jbyteArray fill, jlong fill_type_id, jbyteArray buf, jlong buf_type_id, jlong space_id)
 {
     herr_t    status;
     jbyte    *fillP;
@@ -1561,39 +1678,40 @@ Java_hdf_hdf5lib_H5_H5Dfill(JNIEnv *env, jclass clss, jbyteArray fill, jlong fil
 
     if (buf == NULL) {
         h5nullArgument(env, "H5Dfill:  buf is NULL");
-        return;
     } /* end if */
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR buf, &isCopy2);
-    if (buffP == NULL) {
-        h5JNIFatalError(env, "H5Dfill:  buf not pinned");
-        return;
-    } /* end if */
-
-    if(fill) {
-        fillP = ENVPTR->GetByteArrayElements(ENVPAR fill, &isCopy1);
-        if (fillP == NULL) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
-            h5JNIFatalError( env, "H5Dfill:  fill not pinned");
-            return;
+    else {
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR buf, &isCopy2);
+        if (buffP == NULL) {
+            h5JNIFatalError(env, "H5Dfill:  buf not pinned");
         } /* end if */
-    } /* end if */
-    else
-        fillP = NULL;
+        else {
+            if(fill) {
+                fillP = ENVPTR->GetByteArrayElements(ENVPAR fill, &isCopy1);
+                if (fillP == NULL) {
+                    ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
+                    h5JNIFatalError( env, "H5Dfill:  fill not pinned");
+                    return;
+                } /* end if */
+            } /* end if */
+            else
+                fillP = NULL;
 
-    status = H5Dfill((const void*)fillP, (hid_t)fill_type_id, (void*)buffP, (hid_t)buf_type_id, (hid_t)space_id);
-    if(fillP) {
-        /* free the buffer without copying back */
-        /* end if */ ENVPTR->ReleaseByteArrayElements(ENVPAR fill, fillP, JNI_ABORT);
+            status = H5Dfill((const void*)fillP, (hid_t)fill_type_id, (void*)buffP, (hid_t)buf_type_id, (hid_t)space_id);
+            if(fillP) {
+                /* free the buffer without copying back */
+                ENVPTR->ReleaseByteArrayElements(ENVPAR fill, fillP, JNI_ABORT);
+            } /* end if */
+            if (status < 0) {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
+                h5libraryError(env);
+            } /* end if */
+            else {
+                if (isCopy2 == JNI_TRUE) {
+                    ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, 0);
+                } /* end if */
+            } /* end else */
+        }
     }
-    if (status < 0) {
-        ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
-        h5libraryError(env);
-    } /* end if */
-    else {
-        if (isCopy2 == JNI_TRUE) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, 0);
-        } /* end if */
-    } /* end else */
 } /* end Java_hdf_hdf5lib_H5_H5Dfill */
 
 /*
@@ -1602,7 +1720,8 @@ Java_hdf_hdf5lib_H5_H5Dfill(JNIEnv *env, jclass clss, jbyteArray fill, jlong fil
  * Signature: (J[J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Dset_1extent(JNIEnv *env, jclass clss, jlong loc_id, jlongArray buf)
+Java_hdf_hdf5lib_H5_H5Dset_1extent
+    (JNIEnv *env, jclass clss, jlong loc_id, jlongArray buf)
 {
     herr_t    status;
     hsize_t  *dims;
@@ -1613,39 +1732,40 @@ Java_hdf_hdf5lib_H5_H5Dset_1extent(JNIEnv *env, jclass clss, jlong loc_id, jlong
 
     if (buf == NULL) {
         h5nullArgument(env, "H5Dset_extent:  buf is NULL");
-        return;
-    } /* end if */
-
-    rank = ENVPTR->GetArrayLength(ENVPAR buf);
-    if (rank <= 0) {
-        h5JNIFatalError(env, "H5Dset_extent:  rank <=0");
     } /* end if */
     else {
-        buffP = ENVPTR->GetLongArrayElements(ENVPAR buf, &isCopy);
-        if (buffP == NULL) {
-            h5JNIFatalError( env, "H5Dset_extent:  buf not pinned");
+        rank = ENVPTR->GetArrayLength(ENVPAR buf);
+        if (rank <= 0) {
+            h5JNIFatalError(env, "H5Dset_extent:  rank <=0");
         } /* end if */
         else {
-            dims = (hsize_t*)HDmalloc((size_t)rank * sizeof(hsize_t));
-            for (i = 0; i< rank; i++)
-                dims[i] = (hsize_t)buffP[i];
+            buffP = ENVPTR->GetLongArrayElements(ENVPAR buf, &isCopy);
+            if (buffP == NULL) {
+                h5JNIFatalError( env, "H5Dset_extent:  buf not pinned");
+            } /* end if */
+            else {
+                dims = (hsize_t*)HDmalloc((size_t)rank * sizeof(hsize_t));
+                for (i = 0; i< rank; i++)
+                    dims[i] = (hsize_t)buffP[i];
 
-            status = H5Dset_extent((hid_t)loc_id, (hsize_t*)dims);
+                status = H5Dset_extent((hid_t)loc_id, (hsize_t*)dims);
 
-            HDfree (dims);
+                HDfree (dims);
 
-            /* free the buffer without copying back */
-            ENVPTR->ReleaseLongArrayElements(ENVPAR buf, buffP, JNI_ABORT);
+                /* free the buffer without copying back */
+                ENVPTR->ReleaseLongArrayElements(ENVPAR buf, buffP, JNI_ABORT);
 
-            if (status < 0) {
-                h5libraryError(env);
-            } /* end if */
+                if (status < 0) {
+                    h5libraryError(env);
+                } /* end if */
+            } /* end else */
         } /* end else */
-    } /* end else */
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Dset_1extent */
 
 static herr_t
-H5D_iterate_cb(void* elem, hid_t elem_id, unsigned ndim, const hsize_t *point, void *op_data) {
+H5D_iterate_cb
+    (void* elem, hid_t elem_id, unsigned ndim, const hsize_t *point, void *op_data) {
     JNIEnv    *cbenv;
     jint       status;
     jclass     cls;
@@ -1708,7 +1828,8 @@ H5D_iterate_cb(void* elem, hid_t elem_id, unsigned ndim, const hsize_t *point, v
  * Signature: ([BJJLjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Diterate(JNIEnv *env, jclass clss, jbyteArray buf, jlong buf_type, jlong space,
+Java_hdf_hdf5lib_H5_H5Diterate
+    (JNIEnv *env, jclass clss, jbyteArray buf, jlong buf_type, jlong space,
           jobject callback_op, jobject op_data)
 {
     herr_t        status = -1;
@@ -1720,34 +1841,32 @@ Java_hdf_hdf5lib_H5_H5Diterate(JNIEnv *env, jclass clss, jbyteArray buf, jlong b
 
     if (op_data == NULL) {
         h5nullArgument(env,  "H5Diterate:  op_data is NULL");
-        return -1;
     } /* end if */
-    if (callback_op == NULL) {
+    else if (callback_op == NULL) {
         h5nullArgument(env,  "H5Diterate:  callback_op is NULL");
-        return -1;
     } /* end if */
-
-    if (buf == NULL) {
+    else if (buf == NULL) {
         h5nullArgument(env,  "H5Diterate:  buf is NULL");
-        return -1;
-    } /* end if */
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR buf, &isCopy);
-    if (buffP == NULL) {
-        h5JNIFatalError(env, "H5Diterate:  buf not pinned");
     } /* end if */
     else {
-        status = H5Diterate((void*)buffP, (hid_t)buf_type, (hid_t)space, (H5D_operator_t)H5D_iterate_cb, (void*)op_data);
-
-        if (status < 0) {
-        ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
-        h5libraryError(env);
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR buf, &isCopy);
+        if (buffP == NULL) {
+            h5JNIFatalError(env, "H5Diterate:  buf not pinned");
         } /* end if */
         else {
-            if (isCopy == JNI_TRUE) {
-                ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, 0);
+            status = H5Diterate((void*)buffP, (hid_t)buf_type, (hid_t)space, (H5D_operator_t)H5D_iterate_cb, (void*)op_data);
+
+            if (status < 0) {
+            ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, JNI_ABORT);
+            h5libraryError(env);
             } /* end if */
+            else {
+                if (isCopy == JNI_TRUE) {
+                    ENVPTR->ReleaseByteArrayElements(ENVPAR buf, buffP, 0);
+                } /* end if */
+            } /* end else */
         } /* end else */
-    } /* end else */
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Diterate */
@@ -1758,7 +1877,8 @@ Java_hdf_hdf5lib_H5_H5Diterate(JNIEnv *env, jclass clss, jbyteArray buf, jlong b
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Dflush(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Dflush
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Dflush((hid_t)loc_id) < 0)
         h5libraryError(env);
@@ -1770,13 +1890,15 @@ Java_hdf_hdf5lib_H5_H5Dflush(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Drefresh(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Drefresh
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Drefresh((hid_t)loc_id) < 0)
         h5libraryError(env);
 }
 
 
+
 #ifdef __cplusplus
 } /* end extern "C" */
 #endif /* __cplusplus */
diff --git a/java/src/jni/h5dImp.h b/java/src/jni/h5dImp.h
index 0edabfc..3cf24fe 100644
--- a/java/src/jni/h5dImp.h
+++ b/java/src/jni/h5dImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -29,7 +27,8 @@ extern "C" {
  * Method:    _H5Dcreate
  * Signature: (JLjava/lang/String;JJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dcreate
   (JNIEnv*, jclass, jlong, jstring, jlong, jlong, jlong);
 
 /*
@@ -37,7 +36,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate
  * Method:    _H5Dopen
  * Signature: (JLjava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dopen
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dopen
   (JNIEnv*, jclass, jlong, jstring);
 
 /*
@@ -45,7 +45,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dopen
  * Method:    _H5Dget_space
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1space
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dget_1space
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -53,7 +54,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1space
  * Method:    _H5Dget_type
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1type
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dget_1type
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -61,7 +63,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1type
  * Method:    _H5Dget_create_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -69,7 +72,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dget_1create_1plist
  * Method:    H5Dread
  * Signature: (JJJJJ[BZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jbyteArray, jboolean);
 
 /*
@@ -77,7 +81,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread
  * Method:    H5Dwrite
  * Signature: (JJJJJ[BZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jbyteArray, jboolean);
 
 /*
@@ -85,7 +90,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite
  * Method:    _H5Dclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Dclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Dclose
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -93,7 +99,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Dclose
  * Method:    H5Dget_storage_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1storage_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Dget_1storage_1size
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -101,7 +108,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1storage_1size
  * Method:    H5Dvlen_reclaim
  * Signature: (JJJ[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim
   (JNIEnv*, jclass, jlong, jlong, jlong, jbyteArray);
 
 /*
@@ -109,7 +117,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dvlen_1reclaim
  * Method:    H5Dread_short
  * Signature: (JJJJJ[SZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1short
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1short
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jshortArray, jboolean);
 
 /*
@@ -117,7 +126,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1short
  * Method:    H5Dwrite_short
  * Signature: (JJJJJ[SZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1short
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1short
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jshortArray, jboolean);
 
 /*
@@ -125,7 +135,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1short
  * Method:    H5Dread_int
  * Signature: (JJJJJ[IZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1int
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jintArray, jboolean);
 
 /*
@@ -133,7 +144,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1int
  * Method:    H5Dwrite_int
  * Signature: (JJJJJ[IZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1int
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jintArray, jboolean);
 
 /*
@@ -141,7 +153,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1int
  * Method:    H5Dread_long
  * Signature: (JJJJJ[JZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1long
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1long
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jlongArray, jboolean);
 
 /*
@@ -149,7 +162,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1long
  * Method:    H5Dwrite_long
  * Signature: (JJJJJ[JZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1long
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1long
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jlongArray, jboolean);
 
 /*
@@ -157,7 +171,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1long
  * Method:    H5Dread_float
  * Signature: (JJJJJ[FZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1float
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1float
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jfloatArray, jboolean);
 
 /*
@@ -165,7 +180,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1float
  * Method:    H5Dwrite_float
  * Signature: (JJJJJ[FZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1float
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1float
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jfloatArray, jboolean);
 
 /*
@@ -173,7 +189,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1float
  * Method:    H5Dread_double
  * Signature: (JJJJJ[DZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1double
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1double
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jdoubleArray, jboolean);
 
 /*
@@ -181,15 +198,26 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1double
  * Method:    H5Dwrite_double
  * Signature: (JJJJJ[DZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1double
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1double
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jdoubleArray, jboolean);
 
 /*
  * Class:     hdf_hdf5lib_H5
+ * Method:    H5DreadVL
+ * Signature: (JJJJJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5DreadVL
+(JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
+
+/*
+ * Class:     hdf_hdf5lib_H5
  * Method:    H5Dread_string
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1string
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1string
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -197,7 +225,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1string
  * Method:    H5Dwrite_string
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1string
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1string
 (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -205,7 +234,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1string
  * Method:    H5Dread_VLStrings
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1VLStrings
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1VLStrings
 (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -213,7 +243,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1VLStrings
  * Method:    H5Dwrite_VLStrings
  * Signature: (JJJJJ[BZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -221,7 +252,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings
  * Method:    H5Dread_reg_ref
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref
 (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -229,7 +261,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref
  * Method:    H5Dread_reg_ref_data
  * Signature: (JJJJJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray);
 
 /*
@@ -237,7 +270,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dread_1reg_1ref_1data
  * Method:    _H5Dcreate2
  * Signature: (JLjava/lang/String;JJJJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dcreate2
   (JNIEnv*, jclass, jlong, jstring, jlong, jlong, jlong, jlong, jlong);
 
 /*
@@ -245,7 +279,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate2
  * Method:    _H5Dopen2
  * Signature: (JLjava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dopen2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dopen2
   (JNIEnv*, jclass, jlong, jstring, jlong);
 
 /*
@@ -253,7 +288,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dopen2
  * Method:    _H5Dcreate_anon
  * Signature: (JJJJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate_1anon
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Dcreate_1anon
   (JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong);
 
 /*
@@ -261,7 +297,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Dcreate_1anon
  * Method:    H5Dget_space_status
  * Signature: (J)I;
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dget_1space_1status
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dget_1space_1status
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -269,7 +306,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dget_1space_1status
  * Method:    H5Dget_access_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1access_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Dget_1access_1plist
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -277,7 +315,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1access_1plist
  * Method:    H5Dget_offset
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1offset
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Dget_1offset
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -285,7 +324,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dget_1offset
  * Method:    H5Dvlen_get_buf_size
  * Signature: (JJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size
   (JNIEnv*, jclass, jlong, jlong, jlong);
 
 /*
@@ -293,7 +333,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Dvlen_1get_1buf_1size
  * Method:    H5Dfill
  * Signature: ([BJ[BJJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dfill
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Dfill
   (JNIEnv*, jclass, jbyteArray, jlong, jbyteArray, jlong, jlong);
 
 /*
@@ -301,7 +342,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dfill
  * Method:    H5Dset_extent
  * Signature: (J[J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dset_1extent
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Dset_1extent
   (JNIEnv*, jclass, jlong, jlongArray);
 
 /*
@@ -309,7 +351,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dset_1extent
  * Method:    H5Diterate
  * Signature: ([BJJLjava/lang/Object;Ljava/lang/Object;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Diterate
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Diterate
   (JNIEnv*, jclass, jbyteArray, jlong, jlong, jobject, jobject);
 
 /*
@@ -317,7 +360,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Diterate
  * Method:    H5Dflush
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dflush
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Dflush
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -325,7 +369,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Dflush
  * Method:    H5Drefresh
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Drefresh
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Drefresh
   (JNIEnv*, jclass, jlong);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5eImp.c b/java/src/jni/h5eImp.c
index f0c4135..24ddcbc 100644
--- a/java/src/jni/h5eImp.c
+++ b/java/src/jni/h5eImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -70,7 +68,8 @@ static herr_t H5E_walk_cb(int nindx, const H5E_error2_t *info, void *op_data);
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2(JNIEnv *env, jclass cls, jlong stk_id)
+Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2
+    (JNIEnv *env, jclass cls, jlong stk_id)
 {
     unsigned int is_stack = 0;
 
@@ -89,21 +88,23 @@ Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2(JNIEnv *env, jclass cls, jlong stk_id)
  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Eregister_1class(JNIEnv *env, jclass cls, jstring cls_name, jstring lib_name, jstring version)
+Java_hdf_hdf5lib_H5_H5Eregister_1class
+    (JNIEnv *env, jclass cls, jstring cls_name, jstring lib_name, jstring version)
 {
     hid_t       ret_val = -1;
     const char* the_cls_name;
     const char* the_lib_name;
     const char* the_version;
 
-    PIN_JAVA_STRING_THREE(cls_name, the_cls_name, lib_name, the_lib_name, version, the_version, -1);
+    PIN_JAVA_STRING_THREE(cls_name, the_cls_name, lib_name, the_lib_name, version, the_version);
+    if (the_cls_name != NULL && the_lib_name != NULL && the_version != NULL) {
+        ret_val = H5Eregister_class(the_cls_name, the_lib_name, the_version);
 
-    ret_val = H5Eregister_class(the_cls_name, the_lib_name, the_version);
+        UNPIN_JAVA_STRING_THREE(cls_name, the_cls_name, lib_name, the_lib_name, version, the_version);
 
-    UNPIN_JAVA_STRING_THREE(cls_name, the_cls_name, lib_name, the_lib_name, version, the_version);
-
-    if (ret_val < 0)
-        h5libraryError(env);
+        if (ret_val < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)ret_val;
 } /* end Java_hdf_hdf5lib_H5_H5Eregister_1class */
@@ -114,7 +115,8 @@ Java_hdf_hdf5lib_H5_H5Eregister_1class(JNIEnv *env, jclass cls, jstring cls_name
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eunregister_1class(JNIEnv *env, jclass cls, jlong cls_id)
+Java_hdf_hdf5lib_H5_H5Eunregister_1class
+    (JNIEnv *env, jclass cls, jlong cls_id)
 {
     if (cls_id < 0) {
         h5badArgument(env, "H5Eunregister_class: invalid argument");
@@ -129,7 +131,8 @@ Java_hdf_hdf5lib_H5_H5Eunregister_1class(JNIEnv *env, jclass cls, jlong cls_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eclose_1msg(JNIEnv *env, jclass cls, jlong err_id)
+Java_hdf_hdf5lib_H5_H5Eclose_1msg
+    (JNIEnv *env, jclass cls, jlong err_id)
 {
     if (err_id < 0) {
         h5badArgument(env, "H5Eclose_msg: invalid argument");
@@ -144,7 +147,8 @@ Java_hdf_hdf5lib_H5_H5Eclose_1msg(JNIEnv *env, jclass cls, jlong err_id)
  * Signature: (JILjava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Ecreate_1msg(JNIEnv *env, jclass cls, jlong err_id, jint msg_type, jstring err_msg)
+Java_hdf_hdf5lib_H5_H5Ecreate_1msg
+    (JNIEnv *env, jclass cls, jlong err_id, jint msg_type, jstring err_msg)
 {
     hid_t       ret_val = -1;
     const char *the_err_msg;
@@ -154,14 +158,15 @@ Java_hdf_hdf5lib_H5_H5Ecreate_1msg(JNIEnv *env, jclass cls, jlong err_id, jint m
         h5badArgument(env, "H5Ecreate_msg: invalid argument");
     } /* end if */
     else {
-        PIN_JAVA_STRING(err_msg, the_err_msg, -1);
-
-        ret_val = H5Ecreate_msg((hid_t)err_id, error_msg_type, the_err_msg);
+        PIN_JAVA_STRING(err_msg, the_err_msg);
+        if (the_err_msg != NULL) {
+            ret_val = H5Ecreate_msg((hid_t)err_id, error_msg_type, the_err_msg);
 
-        UNPIN_JAVA_STRING(err_msg, the_err_msg);
+            UNPIN_JAVA_STRING(err_msg, the_err_msg);
 
-        if (ret_val < 0)
-            h5libraryError(env);
+            if (ret_val < 0)
+                h5libraryError(env);
+        }
     } /* end else */
 
     return (jlong)ret_val;
@@ -173,7 +178,8 @@ Java_hdf_hdf5lib_H5_H5Ecreate_1msg(JNIEnv *env, jclass cls, jlong err_id, jint m
  * Signature: ()J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Ecreate_1stack(JNIEnv *env, jclass cls)
+Java_hdf_hdf5lib_H5_H5Ecreate_1stack
+    (JNIEnv *env, jclass cls)
 {
     hid_t ret_val = -1;
 
@@ -190,7 +196,8 @@ Java_hdf_hdf5lib_H5_H5Ecreate_1stack(JNIEnv *env, jclass cls)
  * Signature: ()J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Eget_1current_1stack(JNIEnv *env, jclass cls)
+Java_hdf_hdf5lib_H5_H5Eget_1current_1stack
+    (JNIEnv *env, jclass cls)
 {
     hid_t ret_val = -1;
 
@@ -207,7 +214,8 @@ Java_hdf_hdf5lib_H5_H5Eget_1current_1stack(JNIEnv *env, jclass cls)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eclose_1stack(JNIEnv *env, jclass cls, jlong stk_id)
+Java_hdf_hdf5lib_H5_H5Eclose_1stack
+    (JNIEnv *env, jclass cls, jlong stk_id)
 {
     if (stk_id < 0) {
         h5badArgument(env, "H5Eclose_stack: invalid argument");
@@ -222,7 +230,8 @@ Java_hdf_hdf5lib_H5_H5Eclose_1stack(JNIEnv *env, jclass cls, jlong stk_id)
  * Signature: (JLjava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eprint2(JNIEnv *env, jclass cls, jlong stk_id, jobject stream_obj)
+Java_hdf_hdf5lib_H5_H5Eprint2
+    (JNIEnv *env, jclass cls, jlong stk_id, jobject stream_obj)
 {
     herr_t ret_val = -1;
 
@@ -246,7 +255,8 @@ Java_hdf_hdf5lib_H5_H5Eprint2(JNIEnv *env, jclass cls, jlong stk_id, jobject str
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Eget_1class_1name(JNIEnv *env, jclass cls, jlong cls_id)
+Java_hdf_hdf5lib_H5_H5Eget_1class_1name
+    (JNIEnv *env, jclass cls, jlong cls_id)
 {
     char   *namePtr;
     jstring str = NULL;
@@ -294,7 +304,8 @@ Java_hdf_hdf5lib_H5_H5Eget_1class_1name(JNIEnv *env, jclass cls, jlong cls_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eset_1current_1stack(JNIEnv *env, jclass cls, jlong stk_id)
+Java_hdf_hdf5lib_H5_H5Eset_1current_1stack
+    (JNIEnv *env, jclass cls, jlong stk_id)
 {
     if (stk_id < 0) {
         h5badArgument(env, "H5Eset_current_stack: invalid argument");
@@ -309,7 +320,8 @@ Java_hdf_hdf5lib_H5_H5Eset_1current_1stack(JNIEnv *env, jclass cls, jlong stk_id
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Epop(JNIEnv *env, jclass cls, jlong stk_id, jlong count)
+Java_hdf_hdf5lib_H5_H5Epop
+    (JNIEnv *env, jclass cls, jlong stk_id, jlong count)
 {
     if (stk_id < 0) {
         h5badArgument(env, "H5Epop: invalid argument");
@@ -324,7 +336,8 @@ Java_hdf_hdf5lib_H5_H5Epop(JNIEnv *env, jclass cls, jlong stk_id, jlong count)
  * Signature: (JLjava/lang/String;Ljava/lang/String;IJJJLjava/lang/String;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Epush2(JNIEnv *env, jclass cls, jlong stk_id, jstring filename, jstring funcname,
+Java_hdf_hdf5lib_H5_H5Epush2
+    (JNIEnv *env, jclass cls, jlong stk_id, jstring filename, jstring funcname,
         jint linenumber, jlong class_id, jlong major_id, jlong minor_id, jstring err_desc)
 {
     herr_t      ret_val = -1;
@@ -345,15 +358,16 @@ Java_hdf_hdf5lib_H5_H5Epush2(JNIEnv *env, jclass cls, jlong stk_id, jstring file
         h5badArgument(env, "H5Epush: invalid minor_id argument");
     } /* end else if */
     else {
-        PIN_JAVA_STRING_THREE0(filename, fName, funcname, fncName, err_desc, errMsg);
-
-        ret_val = H5Epush2((hid_t)stk_id, fName, fncName, (unsigned)linenumber, (hid_t)class_id,
-                (hid_t)major_id, (hid_t)minor_id, errMsg);
+        PIN_JAVA_STRING_THREE(filename, fName, funcname, fncName, err_desc, errMsg);
+        if (fName != NULL && fncName != NULL && errMsg != NULL) {
+            ret_val = H5Epush2((hid_t)stk_id, fName, fncName, (unsigned)linenumber, (hid_t)class_id,
+                    (hid_t)major_id, (hid_t)minor_id, errMsg);
 
-        UNPIN_JAVA_STRING_THREE(filename, fName, funcname, fncName, err_desc, errMsg);
+            UNPIN_JAVA_STRING_THREE(filename, fName, funcname, fncName, err_desc, errMsg);
 
-        if (ret_val < 0)
-            h5libraryError(env);
+            if (ret_val < 0)
+                h5libraryError(env);
+        }
     } /* end else */
 } /* end Java_hdf_hdf5lib_H5_H5Epush2 */
 
@@ -363,7 +377,8 @@ Java_hdf_hdf5lib_H5_H5Epush2(JNIEnv *env, jclass cls, jlong stk_id, jstring file
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Eclear2(JNIEnv *env, jclass cls, jlong stk_id)
+Java_hdf_hdf5lib_H5_H5Eclear2
+    (JNIEnv *env, jclass cls, jlong stk_id)
 {
     if (stk_id < 0) {
         h5badArgument(env, "H5Eclear2: invalid argument");
@@ -378,7 +393,8 @@ Java_hdf_hdf5lib_H5_H5Eclear2(JNIEnv *env, jclass cls, jlong stk_id)
  * Signature: (J[I)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Eget_1msg(JNIEnv *env, jclass cls, jlong msg_id, jintArray error_msg_type_list)
+Java_hdf_hdf5lib_H5_H5Eget_1msg
+    (JNIEnv *env, jclass cls, jlong msg_id, jintArray error_msg_type_list)
 {
     char      *namePtr;
     jstring    str = NULL;
@@ -441,7 +457,8 @@ Java_hdf_hdf5lib_H5_H5Eget_1msg(JNIEnv *env, jclass cls, jlong msg_id, jintArray
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Eget_1num(JNIEnv *env, jclass cls, jlong stk_id)
+Java_hdf_hdf5lib_H5_H5Eget_1num
+    (JNIEnv *env, jclass cls, jlong stk_id)
 {
     ssize_t ret_val = -1;
 
@@ -457,7 +474,8 @@ Java_hdf_hdf5lib_H5_H5Eget_1num(JNIEnv *env, jclass cls, jlong stk_id)
 } /* end Java_hdf_hdf5lib_H5_H5Eget_1num */
 
 static herr_t
-H5E_walk_cb(int nindx, const H5E_error2_t *info, void *op_data)
+H5E_walk_cb
+    (int nindx, const H5E_error2_t *info, void *op_data)
 {
     JNIEnv    *cbenv;
     jint       status = -1;
@@ -507,7 +525,8 @@ H5E_walk_cb(int nindx, const H5E_error2_t *info, void *op_data)
  * Signature: (JJLjava/lang/Object;Ljava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Ewalk2(JNIEnv *env, jclass cls, jlong stk_id, jlong direction, jobject callback_op, jobject op_data)
+Java_hdf_hdf5lib_H5_H5Ewalk2
+    (JNIEnv *env, jclass cls, jlong stk_id, jlong direction, jobject callback_op, jobject op_data)
 {
     ENVPTR->GetJavaVM(ENVPAR &jvm);
     visit_callback = callback_op;
diff --git a/java/src/jni/h5eImp.h b/java/src/jni/h5eImp.h
index c40c013..051b2ed 100644
--- a/java/src/jni/h5eImp.h
+++ b/java/src/jni/h5eImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -29,7 +27,8 @@ extern "C" {
  * Method:    H5Eauto_is_v2
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -37,7 +36,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Eauto_1is_1v2
  * Method:    H5Eregister_class
  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eregister_1class
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Eregister_1class
   (JNIEnv *, jclass, jstring, jstring, jstring);
 
 /*
@@ -45,7 +45,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eregister_1class
  * Method:    H5Eunregister_class
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eunregister_1class
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eunregister_1class
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -53,7 +54,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eunregister_1class
  * Method:    H5Eclose_msg
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclose_1msg
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eclose_1msg
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -61,7 +63,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclose_1msg
  * Method:    H5Ecreate_msg
  * Signature: (JILjava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Ecreate_1msg
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Ecreate_1msg
   (JNIEnv *, jclass, jlong, jint, jstring);
 
 /*
@@ -69,7 +72,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Ecreate_1msg
  * Method:    H5Ecreate_stack
  * Signature: ()J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Ecreate_1stack
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Ecreate_1stack
   (JNIEnv *, jclass);
 
 /*
@@ -77,7 +81,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Ecreate_1stack
  * Method:    H5Eget_current_stack
  * Signature: ()J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eget_1current_1stack
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Eget_1current_1stack
   (JNIEnv *, jclass);
 
 /*
@@ -85,7 +90,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eget_1current_1stack
  * Method:    H5Eclose_stack
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclose_1stack
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eclose_1stack
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -93,7 +99,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclose_1stack
  * Method:    H5Eprint2
  * Signature: (JLjava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eprint2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eprint2
   (JNIEnv *, jclass, jlong, jobject);
 
 /*
@@ -101,7 +108,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eprint2
  * Method:    H5Eget_class_name
  * Signature: (J)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Eget_1class_1name
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Eget_1class_1name
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -109,7 +117,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Eget_1class_1name
  * Method:    H5Eset_current_stack
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eset_1current_1stack
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eset_1current_1stack
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -117,7 +126,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eset_1current_1stack
  * Method:    H5Epop
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Epop
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Epop
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -125,7 +135,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Epop
  * Method:    H5Epush2
  * Signature: (JLjava/lang/String;Ljava/lang/String;IJJJLjava/lang/String;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Epush2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Epush2
   (JNIEnv *, jclass, jlong, jstring, jstring, jint, jlong, jlong, jlong, jstring);
 
 /*
@@ -133,7 +144,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Epush2
  * Method:    H5Eclear2
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclear2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Eclear2
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -141,7 +153,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Eclear2
  * Method:    H5Eget_msg
  * Signature: (J[I)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Eget_1msg
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Eget_1msg
   (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -149,7 +162,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Eget_1msg
  * Method:    H5Eget_num
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eget_1num
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Eget_1num
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -157,7 +171,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Eget_1num
  * Method:    H5Ewalk2
  * Signature: (JJLjava/lang/Object;Ljava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Ewalk2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Ewalk2
   (JNIEnv *, jclass, jlong, jlong, jobject, jobject);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5fImp.c b/java/src/jni/h5fImp.c
index 1666940..8cf5252 100644
--- a/java/src/jni/h5fImp.c
+++ b/java/src/jni/h5fImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -39,19 +37,21 @@ extern jobject visit_callback;
  * Signature: (Ljava/lang/String;IJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Fopen(JNIEnv *env, jclass clss, jstring name, jint flags, jlong access_id)
+Java_hdf_hdf5lib_H5__1H5Fopen
+    (JNIEnv *env, jclass clss, jstring name, jint flags, jlong access_id)
 {
     hid_t       status = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        status = H5Fopen(fileName, (unsigned)flags, (hid_t)access_id );
 
-    status = H5Fopen(fileName, (unsigned)flags, (hid_t)access_id );
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Fopen */
@@ -62,19 +62,21 @@ Java_hdf_hdf5lib_H5__1H5Fopen(JNIEnv *env, jclass clss, jstring name, jint flags
  * Signature: (Ljava/lang/String;IJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Fcreate(JNIEnv *env, jclass clss, jstring name, jint flags, jlong create_id, jlong access_id)
+Java_hdf_hdf5lib_H5__1H5Fcreate
+    (JNIEnv *env, jclass clss, jstring name, jint flags, jlong create_id, jlong access_id)
 {
     hid_t       status = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
-
-    status = H5Fcreate(fileName, (unsigned)flags, create_id, access_id);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        status = H5Fcreate(fileName, (unsigned)flags, create_id, access_id);
 
-    UNPIN_JAVA_STRING(name, fileName);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Fcreate */
@@ -85,7 +87,8 @@ Java_hdf_hdf5lib_H5__1H5Fcreate(JNIEnv *env, jclass clss, jstring name, jint fla
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Fflush(JNIEnv *env, jclass clss, jlong object_id, jint scope)
+Java_hdf_hdf5lib_H5_H5Fflush
+    (JNIEnv *env, jclass clss, jlong object_id, jint scope)
 {
     herr_t retVal = -1;
 
@@ -102,7 +105,8 @@ Java_hdf_hdf5lib_H5_H5Fflush(JNIEnv *env, jclass clss, jlong object_id, jint sco
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1name(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fget_1name
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     char   *namePtr;
     jstring str = NULL;
@@ -142,21 +146,23 @@ Java_hdf_hdf5lib_H5_H5Fget_1name(JNIEnv *env, jclass cls, jlong file_id)
  * Signature: (Ljava/lang/String;)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Fis_1hdf5(JNIEnv *env, jclass clss, jstring name)
+Java_hdf_hdf5lib_H5_H5Fis_1hdf5
+    (JNIEnv *env, jclass clss, jstring name)
 {
     htri_t      bval = JNI_FALSE;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, JNI_FALSE);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        bval = H5Fis_hdf5(fileName);
 
-    bval = H5Fis_hdf5(fileName);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (bval > 0)
-        bval = JNI_TRUE;
-    else if (bval < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
     return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Fis_1hdf5 */
@@ -167,7 +173,8 @@ Java_hdf_hdf5lib_H5_H5Fis_1hdf5(JNIEnv *env, jclass clss, jstring name)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist(JNIEnv *env, jclass clss, jlong file_id)
+Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist
+    (JNIEnv *env, jclass clss, jlong file_id)
 {
     hid_t retVal = -1;
 
@@ -184,7 +191,8 @@ Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist(JNIEnv *env, jclass clss, jlong file
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist(JNIEnv *env, jclass clss, jlong file_id)
+Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist
+    (JNIEnv *env, jclass clss, jlong file_id)
 {
     hid_t retVal = -1;
 
@@ -201,7 +209,8 @@ Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist(JNIEnv *env, jclass clss, jlong file
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1intent(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fget_1intent
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     unsigned intent = 0;
 
@@ -217,7 +226,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1intent(JNIEnv *env, jclass cls, jlong file_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Fclose(JNIEnv *env, jclass clss, jlong file_id)
+Java_hdf_hdf5lib_H5__1H5Fclose
+    (JNIEnv *env, jclass clss, jlong file_id)
 {
     herr_t status = -1;
 
@@ -236,19 +246,21 @@ Java_hdf_hdf5lib_H5__1H5Fclose(JNIEnv *env, jclass clss, jlong file_id)
  * Signature: (JLjava/lang/String;JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Fmount(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong child_id, jlong plist_id)
+Java_hdf_hdf5lib_H5_H5Fmount
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong child_id, jlong plist_id)
 {
     herr_t      status = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        status = H5Fmount((hid_t)loc_id, fileName, (hid_t)child_id, (hid_t)plist_id);
 
-    status = H5Fmount((hid_t)loc_id, fileName, (hid_t)child_id, (hid_t)plist_id);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Fmount */
@@ -259,19 +271,21 @@ Java_hdf_hdf5lib_H5_H5Fmount(JNIEnv *env, jclass clss, jlong loc_id, jstring nam
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Funmount(JNIEnv *env, jclass clss, jlong loc_id, jstring name)
+Java_hdf_hdf5lib_H5_H5Funmount
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name)
 {
     herr_t      status = -1;
     const char *fileName;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        status = H5Funmount((hid_t)loc_id, fileName);
 
-    status = H5Funmount((hid_t)loc_id, fileName);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Funmount */
@@ -282,7 +296,8 @@ Java_hdf_hdf5lib_H5_H5Funmount(JNIEnv *env, jclass clss, jlong loc_id, jstring n
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1freespace(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fget_1freespace
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     hssize_t ret_val = H5Fget_freespace((hid_t)file_id);
 
@@ -298,7 +313,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1freespace(JNIEnv *env, jclass cls, jlong file_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Freopen(JNIEnv *env, jclass clss, jlong file_id)
+Java_hdf_hdf5lib_H5__1H5Freopen
+    (JNIEnv *env, jclass clss, jlong file_id)
 {
     hid_t retVal = -1;
 
@@ -315,7 +331,8 @@ Java_hdf_hdf5lib_H5__1H5Freopen(JNIEnv *env, jclass clss, jlong file_id)
  * Signature: (JIJ[J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids(JNIEnv *env, jclass cls, jlong file_id, jint types, jlong maxObjs,
+Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids
+    (JNIEnv *env, jclass cls, jlong file_id, jint types, jlong maxObjs,
           jlongArray obj_id_list)
 {
     ssize_t  ret_val = -1;
@@ -369,7 +386,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids(JNIEnv *env, jclass cls, jlong file_id, jin
  * Signature: (JI)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1obj_1count(JNIEnv *env, jclass cls, jlong file_id, jint types)
+Java_hdf_hdf5lib_H5_H5Fget_1obj_1count
+    (JNIEnv *env, jclass cls, jlong file_id, jint types)
 {
     ssize_t ret_val = H5Fget_obj_count((hid_t)file_id, (unsigned int)types);
 
@@ -385,7 +403,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1obj_1count(JNIEnv *env, jclass cls, jlong file_id, j
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1filesize(JNIEnv *env, jclass clss, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fget_1filesize
+    (JNIEnv *env, jclass clss, jlong file_id)
 {
     hsize_t size = 0;
 
@@ -401,7 +420,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1filesize(JNIEnv *env, jclass clss, jlong file_id)
  * Signature: (J)D
  */
 JNIEXPORT jdouble JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     double rate = 0.0;
 
@@ -417,7 +437,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate(JNIEnv *env, jclass cls, jlong file_i
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size(JNIEnv *env, jclass cls, jlong file_id, jlongArray metadata_cache)
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size
+    (JNIEnv *env, jclass cls, jlong file_id, jlongArray metadata_cache)
 {
     jint     size = 0;
     jlong   *metadata_cache_ptr;
@@ -456,7 +477,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size(JNIEnv *env, jclass cls, jlong file_id, jl
  * Signature: (J)Lhdf/hdf5lib/structs/H5F_info2_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1info(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Fget_1info
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     H5F_info2_t  finfo;
     jvalue      args[9];
@@ -492,7 +514,8 @@ Java_hdf_hdf5lib_H5_H5Fget_1info(JNIEnv *env, jclass clss, jlong obj_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     if (H5Freset_mdc_hit_rate_stats((hid_t)file_id) < 0)
         h5libraryError(env);
@@ -504,7 +527,8 @@ Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats(JNIEnv *env, jclass cls, jlo
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     if (H5Fclear_elink_file_cache((hid_t)file_id) < 0)
         h5libraryError(env);
@@ -516,7 +540,8 @@ Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache(JNIEnv *env, jclass cls, jlong
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write
+	(JNIEnv *env, jclass cls, jlong file_id)
 {
     if (H5Fstart_swmr_write((hid_t)file_id) < 0)
         h5libraryError(env);
@@ -528,7 +553,8 @@ Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write(JNIEnv *env, jclass cls, jlong file_id
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging(JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging
+	(JNIEnv *env, jclass cls, jlong file_id)
 {
     if (H5Fstart_mdc_logging((hid_t)file_id) < 0)
         h5libraryError(env);
@@ -540,7 +566,8 @@ Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging(JNIEnv *env, jclass cls, jlong file_i
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging  (JNIEnv *env, jclass cls, jlong file_id)
+Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging
+    (JNIEnv *env, jclass cls, jlong file_id)
 {
     if (H5Fstop_mdc_logging((hid_t)file_id) < 0)
         h5libraryError(env);
@@ -552,8 +579,8 @@ Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging  (JNIEnv *env, jclass cls, jlong file_
  * Signature: (J[Z)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status(JNIEnv *env, jclass cls, jlong file_id,
-        jbooleanArray mdc_logging_status)
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status
+	(JNIEnv *env, jclass cls, jlong file_id, jbooleanArray mdc_logging_status)
 {
     hbool_t    is_enabled;
     hbool_t    is_currently_logging;
@@ -584,6 +611,7 @@ Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status(JNIEnv *env, jclass cls, jlong
 } /* end Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status */
 
 
+
 #ifdef __cplusplus
 } /* end extern "C" */
 #endif /* __cplusplus */
diff --git a/java/src/jni/h5fImp.h b/java/src/jni/h5fImp.h
index 909d1b8..fcfdedf 100644
--- a/java/src/jni/h5fImp.h
+++ b/java/src/jni/h5fImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    H5Fopen
  * Signature: (Ljava/lang/String;IJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fopen
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Fopen
   (JNIEnv*, jclass, jstring, jint, jlong);
 
 /*
@@ -36,7 +35,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fopen
  * Method:    H5Fcreate
  * Signature: (Ljava/lang/String;IJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fcreate
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Fcreate
   (JNIEnv*, jclass, jstring, jint, jlong, jlong);
 
 /*
@@ -44,7 +44,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fcreate
  * Method:    H5Fflush
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fflush
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Fflush
   (JNIEnv*, jclass, jlong, jint);
 
 /*
@@ -52,7 +53,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fflush
  * Method:    H5Fget_name
  * Signature: (J)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Fget_1name
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1name
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -60,7 +62,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Fget_1name
  * Method:    H5Fis_hdf5
  * Signature: (Ljava/lang/String;)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Fis_1hdf5
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Fis_1hdf5
   (JNIEnv*, jclass, jstring);
 
 /*
@@ -68,7 +71,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Fis_1hdf5
  * Method:    H5Fget_create_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -76,7 +80,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fget_1create_1plist
  * Method:    H5Fget_access_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -84,7 +89,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Fget_1access_1plist
  * Method:    H5Fget_intent
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fget_1intent
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1intent
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -92,7 +98,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fget_1intent
  * Method:    H5Fclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Fclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Fclose
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -100,7 +107,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Fclose
  * Method:    H5Fmount
  * Signature: (JLjava/lang/String;JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fmount
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Fmount
   (JNIEnv*, jclass, jlong, jstring, jlong, jlong);
 
 /*
@@ -108,7 +116,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fmount
  * Method:    H5Funmount
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Funmount
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Funmount
   (JNIEnv*, jclass, jlong, jstring);
 
 /*
@@ -116,7 +125,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Funmount
  * Method:    H5Fget_freespace
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1freespace
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1freespace
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -124,7 +134,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1freespace
  * Method:    H5Freopen
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Freopen
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Freopen
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -132,7 +143,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Freopen
  * Method:    H5Fget_obj_ids
  * Signature: (JIJ[J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids
   (JNIEnv*, jclass, jlong, jint, jlong, jlongArray);
 
 /*
@@ -140,7 +152,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1obj_1ids
  * Method:    H5Fget_obj_count
  * Signature: (JI)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1obj_1count
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1obj_1count
   (JNIEnv*, jclass, jlong, jint);
 
 /*
@@ -148,7 +161,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1obj_1count
  * Method:    H5Fget_filesize
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1filesize
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1filesize
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -156,7 +170,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Fget_1filesize
  * Method:    H5Fget_mdc_hit_rate
  * Signature: (J)D
  */
-JNIEXPORT jdouble JNICALL Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate
+JNIEXPORT jdouble JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -164,7 +179,8 @@ JNIEXPORT jdouble JNICALL Java_hdf_hdf5lib_H5_H5Fget_1mdc_1hit_1rate
  * Method:    H5Fget_mdc_size
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size
   (JNIEnv*, jclass, jlong, jlongArray);
 
 /*
@@ -172,7 +188,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Fget_1mdc_1size
  * Method:    H5Freset_mdc_hit_rate_stats
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -180,7 +197,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Freset_1mdc_1hit_1rate_1stats
  * Method:    H5Fget_info
  * Signature: (J)Lhdf/hdf5lib/structs/H5F_info2_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Fget_1info
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1info
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -188,7 +206,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Fget_1info
  * Method:    H5Fclear_elink_file_cache
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -196,7 +215,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache
  * Method:    H5Fstart_swmr_write
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -204,7 +224,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write
  * Method:    H5Fstart_mdc_logging
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -212,7 +233,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstart_1mdc_1logging
  * Method:    H5Fstop_mdc_logging
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -220,7 +242,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fstop_1mdc_1logging
  * Method:    H5Fget_mdc_logging_status
  * Signature: (J[Z)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Fget_1mdc_1logging_1status
   (JNIEnv *, jclass, jlong, jbooleanArray);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5gImp.c b/java/src/jni/h5gImp.c
index eab0b02..41ec382 100644
--- a/java/src/jni/h5gImp.c
+++ b/java/src/jni/h5gImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -40,7 +38,8 @@ extern jobject visit_callback;
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Gclose(JNIEnv *env, jclass clss, jlong group_id)
+Java_hdf_hdf5lib_H5__1H5Gclose
+    (JNIEnv *env, jclass clss, jlong group_id)
 {
     herr_t retVal = -1;
 
@@ -62,38 +61,36 @@ Java_hdf_hdf5lib_H5__1H5Gclose(JNIEnv *env, jclass clss, jlong group_id)
  *
  */
 jobject
-create_H5G_info_t(JNIEnv *env, H5G_info_t group_info)
+create_H5G_info_t
+    (JNIEnv *env, H5G_info_t group_info)
 {
     jclass   cls;
     jboolean jmounted;
     jint     storage_type;
-    jobject  obj;
+    jobject  obj = NULL;
     jfieldID fid_storage_type, fid_nlinks, fid_max_corder, fid_mounted;
 
     cls = ENVPTR->FindClass(ENVPAR "hdf/hdf5lib/structs/H5G_info_t");
-    if (cls == NULL)
-        return NULL;
-
-    obj = ENVPTR->AllocObject(ENVPAR cls);
-    if (obj == NULL)
-        return NULL;
-
-    fid_storage_type = ENVPTR->GetFieldID(ENVPAR cls, "storage_type", "I");
-    fid_nlinks = ENVPTR->GetFieldID(ENVPAR cls, "nlinks", "J");
-    fid_max_corder = ENVPTR->GetFieldID(ENVPAR cls, "max_corder", "J");
-    fid_mounted = ENVPTR->GetFieldID(ENVPAR cls, "mounted", "Z");
-
-    if (fid_storage_type==NULL || fid_nlinks==NULL || fid_max_corder==NULL || fid_mounted == NULL)
-        return NULL;
-
-    jmounted = (group_info.mounted==0) ? JNI_FALSE : JNI_TRUE;
-    storage_type = (jint)group_info.storage_type;
-
-    ENVPTR->SetIntField(ENVPAR obj, fid_storage_type, (jint)storage_type);
-    ENVPTR->SetLongField(ENVPAR obj, fid_nlinks, (jlong)group_info.nlinks);
-    ENVPTR->SetLongField(ENVPAR obj, fid_max_corder, (jlong)group_info.max_corder);
-    ENVPTR->SetBooleanField(ENVPAR obj, fid_mounted, jmounted);
-
+    if (cls != NULL) {
+        obj = ENVPTR->AllocObject(ENVPAR cls);
+        if (obj != NULL) {
+            if ((fid_storage_type = ENVPTR->GetFieldID(ENVPAR cls, "storage_type", "I")) != NULL) {
+                if ((fid_nlinks = ENVPTR->GetFieldID(ENVPAR cls, "nlinks", "J")) != NULL) {
+                    if ((fid_max_corder = ENVPTR->GetFieldID(ENVPAR cls, "max_corder", "J")) != NULL) {
+                        if ((fid_mounted = ENVPTR->GetFieldID(ENVPAR cls, "mounted", "Z")) != NULL) {
+                            jmounted = (group_info.mounted==0) ? JNI_FALSE : JNI_TRUE;
+                            storage_type = (jint)group_info.storage_type;
+
+                            ENVPTR->SetIntField(ENVPAR obj, fid_storage_type, (jint)storage_type);
+                            ENVPTR->SetLongField(ENVPAR obj, fid_nlinks, (jlong)group_info.nlinks);
+                            ENVPTR->SetLongField(ENVPAR obj, fid_max_corder, (jlong)group_info.max_corder);
+                            ENVPTR->SetBooleanField(ENVPAR obj, fid_mounted, jmounted);
+                        }
+                    }
+                }
+            }
+        }
+    }
     return obj;
 } /* end create_H5G_info_t */
 
@@ -103,19 +100,21 @@ create_H5G_info_t(JNIEnv *env, H5G_info_t group_info)
  * Signature: (JLjava/lang/String;JJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Gcreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring name,
+Java_hdf_hdf5lib_H5__1H5Gcreate2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name,
           jlong link_plist_id, jlong create_plist_id, jlong access_plist_id)
 {
     hid_t       group_id = -1;
     const char *gName;
 
-    PIN_JAVA_STRING(name, gName, -1);
+    PIN_JAVA_STRING(name, gName);
+    if (gName != NULL) {
+        group_id = H5Gcreate2((hid_t)loc_id, gName, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id );
 
-    group_id = H5Gcreate2((hid_t)loc_id, gName, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id );
-
-    UNPIN_JAVA_STRING(name, gName);
-    if (group_id < 0)
-        h5libraryError(env);
+        UNPIN_JAVA_STRING(name, gName);
+        if (group_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)group_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Gcreate2 */
@@ -126,7 +125,8 @@ Java_hdf_hdf5lib_H5__1H5Gcreate2(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JJJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Gcreate_1anon(JNIEnv *env, jclass cls, jlong loc_id, jlong gcpl_id, jlong gapl_id)
+Java_hdf_hdf5lib_H5__1H5Gcreate_1anon
+    (JNIEnv *env, jclass cls, jlong loc_id, jlong gcpl_id, jlong gapl_id)
 {
     hid_t group_id = -1;
 
@@ -135,7 +135,7 @@ Java_hdf_hdf5lib_H5__1H5Gcreate_1anon(JNIEnv *env, jclass cls, jlong loc_id, jlo
         h5libraryError(env);
 
     return (jlong)group_id;
-} /* end JNICALL */
+} /* end Java_hdf_hdf5lib_H5__1H5Gcreate_1anon */
 
 /*
  * Class:     hdf_hdf5lib_H5
@@ -143,19 +143,21 @@ Java_hdf_hdf5lib_H5__1H5Gcreate_1anon(JNIEnv *env, jclass cls, jlong loc_id, jlo
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Gopen2(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist_id)
+Java_hdf_hdf5lib_H5__1H5Gopen2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist_id)
 {
     hid_t group_id = -1;
     const char *gName;
 
-    PIN_JAVA_STRING(name, gName, -1);
-
-    group_id = H5Gopen2((hid_t)loc_id, gName, (hid_t)access_plist_id );
+    PIN_JAVA_STRING(name, gName);
+    if (gName != NULL) {
+        group_id = H5Gopen2((hid_t)loc_id, gName, (hid_t)access_plist_id );
 
-    UNPIN_JAVA_STRING(name, gName);
+        UNPIN_JAVA_STRING(name, gName);
 
-    if (group_id < 0)
-        h5libraryError(env);
+        if (group_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)group_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Gopen2 */
@@ -167,7 +169,8 @@ Java_hdf_hdf5lib_H5__1H5Gopen2(JNIEnv *env, jclass clss, jlong loc_id, jstring n
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1create_1plist(JNIEnv *env, jclass cls, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Gget_1create_1plist
+    (JNIEnv *env, jclass cls, jlong loc_id)
 {
     hid_t plist_id = H5Gget_create_plist((hid_t)loc_id);
 
@@ -183,16 +186,18 @@ Java_hdf_hdf5lib_H5_H5Gget_1create_1plist(JNIEnv *env, jclass cls, jlong loc_id)
  * Signature: (J)Lhdf/hdf5lib/structs/H5G_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1info(JNIEnv *env, jclass cls, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Gget_1info
+    (JNIEnv *env, jclass cls, jlong loc_id)
 {
+    jobject    obj = NULL;
     H5G_info_t group_info;
 
-    if (H5Gget_info((hid_t)loc_id, &group_info) < 0) {
+    if (H5Gget_info((hid_t)loc_id, &group_info) < 0)
         h5libraryError(env);
-        return NULL;
-    } /* end if */
+    else
+        obj = create_H5G_info_t(env, group_info);
 
-    return create_H5G_info_t(env, group_info);
+    return obj;
 } /* end Java_hdf_hdf5lib_H5_H5Gget_1info */
 
 /*
@@ -201,24 +206,27 @@ Java_hdf_hdf5lib_H5_H5Gget_1info(JNIEnv *env, jclass cls, jlong loc_id)
  * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5G_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name(JNIEnv *env, jclass cls, jlong loc_id, jstring name, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name
+    (JNIEnv *env, jclass cls, jlong loc_id, jstring name, jlong lapl_id)
 {
+    jobject     obj = NULL;
     herr_t      ret_val = -1;
     const char *gName;
     H5G_info_t  group_info;
 
-    PIN_JAVA_STRING(name, gName, NULL);
+    PIN_JAVA_STRING(name, gName);
+    if (gName != NULL) {
+        ret_val = H5Gget_info_by_name((hid_t)loc_id, gName, &group_info, (hid_t)lapl_id);
 
-    ret_val = H5Gget_info_by_name((hid_t)loc_id, gName, &group_info, (hid_t)lapl_id);
+        UNPIN_JAVA_STRING(name, gName);
 
-    UNPIN_JAVA_STRING(name, gName);
-
-    if (ret_val < 0) {
-        h5libraryError(env);
-        return NULL;
-    } /* end if */
+        if (ret_val < 0)
+            h5libraryError(env);
+        else
+            obj = create_H5G_info_t(env, group_info);
+    }
 
-    return create_H5G_info_t(env, group_info);
+    return obj;
 } /* end Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name */
 
 /*
@@ -227,28 +235,31 @@ Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name(JNIEnv *env, jclass cls, jlong loc_id
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5G_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx(JNIEnv *env, jclass cls, jlong loc_id, jstring name, jint index_type,
+Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx
+    (JNIEnv *env, jclass cls, jlong loc_id, jstring name, jint index_type,
           jint order, jlong n, jlong lapl_id)
 {
+    jobject         obj = NULL;
     herr_t          ret_val = -1;
     const char     *gName;
     H5G_info_t      group_info;
     H5_index_t      cindex_type = (H5_index_t)index_type;
     H5_iter_order_t corder = (H5_iter_order_t)order;
 
-    PIN_JAVA_STRING(name, gName, NULL);
-
-    ret_val = H5Gget_info_by_idx((hid_t)loc_id, gName, cindex_type,
-            corder, (hsize_t)n, &group_info, (hid_t)lapl_id);
+    PIN_JAVA_STRING(name, gName);
+    if (gName != NULL) {
+        ret_val = H5Gget_info_by_idx((hid_t)loc_id, gName, cindex_type,
+                corder, (hsize_t)n, &group_info, (hid_t)lapl_id);
 
-    UNPIN_JAVA_STRING(name, gName);
+        UNPIN_JAVA_STRING(name, gName);
 
-    if (ret_val < 0) {
-        h5libraryError(env);
-        return NULL;
-    } /* end if */
+        if (ret_val < 0)
+            h5libraryError(env);
+        else
+            obj = create_H5G_info_t(env, group_info);
+    }
 
-    return create_H5G_info_t(env, group_info);
+    return obj;
 } /* end Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx */
 
 /*
@@ -257,11 +268,12 @@ Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx(JNIEnv *env, jclass cls, jlong loc_id,
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Gflush(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Gflush
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Gflush((hid_t)loc_id) < 0)
         h5libraryError(env);
-}
+} /* end Java_hdf_hdf5lib_H5_H5Gflush */
 
 /*
  * Class:     hdf_hdf5lib_H5
@@ -269,11 +281,13 @@ Java_hdf_hdf5lib_H5_H5Gflush(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Grefresh(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Grefresh
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Grefresh((hid_t)loc_id) < 0)
         h5libraryError(env);
-}
+} /* end Java_hdf_hdf5lib_H5_H5Grefresh */
+
 
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5gImp.h b/java/src/jni/h5gImp.h
index e413652..a411658 100644
--- a/java/src/jni/h5gImp.h
+++ b/java/src/jni/h5gImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -29,7 +27,8 @@ extern "C" {
  * Method:    _H5Gclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Gclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Gclose
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -37,7 +36,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Gclose
  * Method:    _H5Gcreate2
  * Signature: (JLjava/lang/String;JJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gcreate2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Gcreate2
   (JNIEnv*, jclass, jlong, jstring, jlong, jlong, jlong);
 
 /*
@@ -45,7 +45,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gcreate2
  * Method:    _H5Gcreate_anon
  * Signature: (JJJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gcreate_1anon
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Gcreate_1anon
   (JNIEnv*, jclass, jlong, jlong, jlong);
 
 /*
@@ -53,7 +54,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gcreate_1anon
  * Method:    _H5Gopen2
  * Signature: (JLjava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gopen2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Gopen2
   (JNIEnv*, jclass, jlong, jstring, jlong);
 
 
@@ -62,7 +64,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Gopen2
  * Method:    H5Gget_create_plist
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Gget_1create_1plist
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1create_1plist
 (JNIEnv*, jclass, jlong);
 
 /*
@@ -70,7 +73,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Gget_1create_1plist
  * Method:    H5Gget_info
  * Signature: (J)Lhdf/hdf5lib/structs/H5G_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1info
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -78,7 +82,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info
  * Method:    H5Gget_info_by_name
  * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5G_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name
   (JNIEnv*, jclass, jlong, jstring, jlong);
 
 /*
@@ -86,7 +91,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1name
  * Method:    H5Gget_info_by_idx
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5G_info_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx
   (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
 
 /*
@@ -94,7 +100,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Gget_1info_1by_1idx
  * Method:    H5Gflush
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Gflush
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Gflush
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -102,7 +109,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Gflush
  * Method:    H5Grefresh
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Grefresh
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Grefresh
   (JNIEnv*, jclass, jlong);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5iImp.c b/java/src/jni/h5iImp.c
index e7d663f..47574ca 100644
--- a/java/src/jni/h5iImp.c
+++ b/java/src/jni/h5iImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -38,7 +36,8 @@ extern jobject visit_callback;
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Iget_1type(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Iget_1type
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     H5I_type_t retVal = H5I_BADID;
 
@@ -51,11 +50,12 @@ Java_hdf_hdf5lib_H5_H5Iget_1type(JNIEnv *env, jclass clss, jlong obj_id)
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Iget_name
+ * Method:    H5Iget_name_long
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Iget_1name(JNIEnv *env, jclass clss, jlong obj_id, jobjectArray name, jlong buf_size)
+Java_hdf_hdf5lib_H5_H5Iget_1name_1long
+    (JNIEnv *env, jclass clss, jlong obj_id, jobjectArray name, jlong buf_size)
 {
     char *aName;
     jstring str;
@@ -89,11 +89,51 @@ Java_hdf_hdf5lib_H5_H5Iget_1name(JNIEnv *env, jclass clss, jlong obj_id, jobject
 
 /*
  * Class:     hdf_hdf5lib_H5
+ * Method:    H5Iget_name
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1name
+    (JNIEnv *env, jclass clss, jlong obj_id)
+{
+    char *aName;
+    jstring  str = NULL;
+    ssize_t  buf_size;
+
+    /* get the length of the name */
+    buf_size = H5Iget_name((hid_t)obj_id, NULL, 0);
+
+    if (buf_size <= 0) {
+        h5badArgument(env, "H5Iget_name:  buf_size <= 0");
+    } /* end if */
+    else {
+        buf_size++; /* add extra space for the null terminator */
+        aName = (char*)HDmalloc(sizeof(char) * (size_t)buf_size);
+        if (aName == NULL) {
+            h5outOfMemory(env, "H5Iget_name:  malloc failed");
+        } /* end if */
+        else {
+            buf_size = H5Iget_name((hid_t)obj_id, aName, (size_t)buf_size);
+            if (buf_size < 0) {
+                h5libraryError(env);
+            } /* end if */
+            else {
+                str = ENVPTR->NewStringUTF(ENVPAR aName);
+            }
+            HDfree(aName);
+        }
+    }
+    return str;
+} /* end Java_hdf_hdf5lib_H5_H5Iget_1name */
+
+/*
+ * Class:     hdf_hdf5lib_H5
  * Method:    H5Iget_ref
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Iget_1ref(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Iget_1ref
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     int retVal = -1;
 
@@ -110,7 +150,8 @@ Java_hdf_hdf5lib_H5_H5Iget_1ref(JNIEnv *env, jclass clss, jlong obj_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Iinc_1ref(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Iinc_1ref
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     int retVal = -1;
 
@@ -127,7 +168,8 @@ Java_hdf_hdf5lib_H5_H5Iinc_1ref(JNIEnv *env, jclass clss, jlong obj_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Idec_1ref(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Idec_1ref
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     int retVal = -1;
 
@@ -145,7 +187,8 @@ Java_hdf_hdf5lib_H5_H5Idec_1ref(JNIEnv *env, jclass clss, jlong obj_id)
  */
 
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Iget_1file_1id(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Iget_1file_1id
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     hid_t file_id = -1;
 
@@ -162,7 +205,8 @@ Java_hdf_hdf5lib_H5_H5Iget_1file_1id(JNIEnv *env, jclass clss, jlong obj_id)
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Iget_1type_1ref(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Iget_1type_1ref
+    (JNIEnv *env, jclass clss, jint type)
 {
     int retVal = -1;
 
@@ -179,7 +223,8 @@ Java_hdf_hdf5lib_H5_H5Iget_1type_1ref(JNIEnv *env, jclass clss, jint type)
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Idec_1type_1ref(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Idec_1type_1ref
+    (JNIEnv *env, jclass clss, jint type)
 {
     int retVal = -1;
 
@@ -196,7 +241,8 @@ Java_hdf_hdf5lib_H5_H5Idec_1type_1ref(JNIEnv *env, jclass clss, jint type)
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref
+    (JNIEnv *env, jclass clss, jint type)
 {
     int retVal = -1;
 
@@ -213,7 +259,8 @@ Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref(JNIEnv *env, jclass clss, jint type)
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Inmembers(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Inmembers
+    (JNIEnv *env, jclass clss, jint type)
 {
     hsize_t num_members;
 
@@ -229,7 +276,8 @@ Java_hdf_hdf5lib_H5_H5Inmembers(JNIEnv *env, jclass clss, jint type)
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Iis_1valid(JNIEnv *env, jclass clss, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Iis_1valid
+    (JNIEnv *env, jclass clss, jlong obj_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -247,7 +295,8 @@ Java_hdf_hdf5lib_H5_H5Iis_1valid(JNIEnv *env, jclass clss, jlong obj_id)
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Itype_1exists(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Itype_1exists
+    (JNIEnv *env, jclass clss, jint type)
 {
     htri_t bval = JNI_FALSE;
 
@@ -266,7 +315,8 @@ Java_hdf_hdf5lib_H5_H5Itype_1exists(JNIEnv *env, jclass clss, jint type)
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Iclear_1type(JNIEnv *env, jclass clss, jint type, jboolean force)
+Java_hdf_hdf5lib_H5_H5Iclear_1type
+    (JNIEnv *env, jclass clss, jint type, jboolean force)
 {
      if (H5Iclear_type((H5I_type_t)type, (hbool_t)force) < 0)
        h5libraryError(env);
@@ -278,7 +328,8 @@ Java_hdf_hdf5lib_H5_H5Iclear_1type(JNIEnv *env, jclass clss, jint type, jboolean
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Idestroy_1type(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5_H5Idestroy_1type
+    (JNIEnv *env, jclass clss, jint type)
 {
      if (H5Idestroy_type((H5I_type_t)type) < 0)
        h5libraryError(env);
diff --git a/java/src/jni/h5iImp.h b/java/src/jni/h5iImp.h
index fe36b5b..2c854e6 100644
--- a/java/src/jni/h5iImp.h
+++ b/java/src/jni/h5iImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,23 +26,35 @@ extern "C" {
  * Method:    H5Iget_type
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iget_1type
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1type
   (JNIEnv*, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Iget_name
+ * Method:    H5Iget_name_long
  * Signature: (JLjava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Iget_1name
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1name_1long
   (JNIEnv*, jclass, jlong, jobjectArray, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
+ * Method:    H5Iget_name
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1name
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
  * Method:    H5Iget_ref
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iget_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1ref
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -52,7 +62,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iget_1ref
  * Method:    H5Iinc_ref
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iinc_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Iinc_1ref
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -60,7 +71,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iinc_1ref
  * Method:    H5Idec_1ref
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Idec_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Idec_1ref
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -69,7 +81,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Idec_1ref
  * Signature: (J)J
  */
 
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Iget_1file_1id
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1file_1id
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -77,7 +90,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Iget_1file_1id
  * Method:    H5Iget_type_ref
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iget_1type_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Iget_1type_1ref
   (JNIEnv*, jclass, jint);
 
 /*
@@ -85,7 +99,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iget_1type_1ref
  * Method:    H5Idec_type_ref
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Idec_1type_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Idec_1type_1ref
   (JNIEnv*, jclass, jint);
 
 /*
@@ -93,7 +108,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Idec_1type_1ref
  * Method:    H5Iinc_type_ref
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref
   (JNIEnv*, jclass, jint);
 
 /*
@@ -101,7 +117,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Iinc_1type_1ref
  * Method:    H5Inmembers
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Inmembers
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Inmembers
   (JNIEnv*, jclass, jint);
 
 /*
@@ -109,7 +126,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Inmembers
  * Method:    H5Iis_valid
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Iis_1valid
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Iis_1valid
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -117,7 +135,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Iis_1valid
  * Method:    H5Itype_exists
  * Signature: (I)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Itype_1exists
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Itype_1exists
   (JNIEnv*, jclass, jint);
 
 /*
@@ -125,7 +144,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Itype_1exists
  * Method:    H5Iclear_type
  * Signature: (IZ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Iclear_1type
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Iclear_1type
   (JNIEnv*, jclass, jint, jboolean);
 
 /*
@@ -133,7 +153,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Iclear_1type
  * Method:    H5Idestroy_type
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Idestroy_1type
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Idestroy_1type
   (JNIEnv*, jclass, jint);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5jni.h b/java/src/jni/h5jni.h
index da49eeb..2970e14 100644
--- a/java/src/jni/h5jni.h
+++ b/java/src/jni/h5jni.h
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -67,29 +65,17 @@
 
 
 /* Macros for string access */
-#define PIN_JAVA_STRING(javastr,localstr,retdefault) {                           \
+#define PIN_JAVA_STRING(javastr,localstr) {                                     \
     jboolean isCopy;                                                             \
+    (localstr) = NULL;                                                      \
     if ((javastr) == NULL) {                                                     \
         h5nullArgument(env, "java string is NULL");                              \
-        return (retdefault);                                                     \
     }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return (retdefault);                                                     \
-    }                                                                            \
-}
-
-#define PIN_JAVA_STRING0(javastr,localstr) {                                     \
-    jboolean isCopy;                                                             \
-    if ((javastr) == NULL) {                                                     \
-        h5nullArgument(env, "java string is NULL");                              \
-        return;                                                                  \
-    }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return;                                                                  \
+    else {                                                                       \
+        (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
+        if ((localstr) == NULL) {                                                    \
+            h5JNIFatalError(env, "local c string is not pinned");                    \
+        }                                                                        \
     }                                                                            \
 }
 
@@ -97,49 +83,28 @@
      ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));                \
 }
 
-#define PIN_JAVA_STRING_TWO(javastr,localstr,java2str,local2str,retdefault) {    \
+#define PIN_JAVA_STRING_TWO(javastr,localstr,java2str,local2str) {              \
     jboolean isCopy;                                                             \
+    (localstr) = NULL;                                                      \
+    (local2str) = NULL;                                                      \
     if ((javastr) == NULL) {                                                     \
         h5nullArgument(env, "java string is NULL");                              \
-        return (retdefault);                                                     \
     }                                                                            \
-    if ((java2str) == NULL) {                                                    \
+    else if ((java2str) == NULL) {                                                    \
         h5nullArgument(env, "second java string is NULL");                       \
-        return (retdefault);                                                     \
     }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return (retdefault);                                                     \
-    }                                                                            \
-    (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
-    if ((local2str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        h5JNIFatalError(env, "second local c string is not pinned");             \
-        return (retdefault);                                                     \
-    }                                                                            \
-}
-
-#define PIN_JAVA_STRING_TWO0(javastr,localstr,java2str,local2str) {              \
-    jboolean isCopy;                                                             \
-    if ((javastr) == NULL) {                                                     \
-        h5nullArgument(env, "java string is NULL");                              \
-        return;                                                                  \
-    }                                                                            \
-    if ((java2str) == NULL) {                                                    \
-        h5nullArgument(env, "second java string is NULL");                       \
-        return;                                                                  \
-    }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return;                                                                  \
-    }                                                                            \
-    (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
-    if ((local2str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        h5JNIFatalError(env, "second local c string is not pinned");             \
-        return;                                                                  \
+    else {                                                                       \
+        (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
+        if ((localstr) == NULL) {                                                    \
+            h5JNIFatalError(env, "local c string is not pinned");                    \
+        }                                                                            \
+        else {                                                                   \
+            (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
+            if ((local2str) == NULL) {                                                   \
+                ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
+                h5JNIFatalError(env, "second local c string is not pinned");             \
+            }                                                                    \
+        }                                                                        \
     }                                                                            \
 }
 
@@ -148,71 +113,40 @@
      ENVPTR->ReleaseStringUTFChars(ENVPAR (java2str), (local2str));              \
 }
 
-#define PIN_JAVA_STRING_THREE(javastr,localstr,java2str,local2str,java3str,local3str,retdefault) {       \
-    jboolean isCopy;                                                             \
-    if ((javastr) == NULL) {                                                     \
-        h5nullArgument(env, "java string is NULL");                              \
-        return (retdefault);                                                     \
-    }                                                                            \
-    if ((java2str) == NULL) {                                                    \
-        h5nullArgument(env, "second java string is NULL");                       \
-        return (retdefault);                                                     \
-    }                                                                            \
-    if ((java3str) == NULL) {                                                    \
-        h5nullArgument(env, "third java string is NULL");                        \
-        return (retdefault);                                                     \
-    }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return (retdefault);                                                     \
-    }                                                                            \
-    (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
-    if ((local2str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        h5JNIFatalError(env, "second local c string is not pinned");             \
-        return (retdefault);                                                     \
-    }                                                                            \
-    (local3str) = ENVPTR->GetStringUTFChars(ENVPAR (java3str), &isCopy);         \
-    if ((local3str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (java2str), (local2str));           \
-        h5JNIFatalError(env, "third local c string is not pinned");              \
-        return (retdefault);                                                     \
-    }                                                                            \
-}
-
-#define PIN_JAVA_STRING_THREE0(javastr,localstr,java2str,local2str,java3str,local3str) {       \
+#define PIN_JAVA_STRING_THREE(javastr,localstr,java2str,local2str,java3str,local3str) {       \
     jboolean isCopy;                                                             \
+    (localstr) = NULL;                                                      \
+    (local2str) = NULL;                                                      \
+    (local3str) = NULL;                                                      \
     if ((javastr) == NULL) {                                                     \
         h5nullArgument(env, "java string is NULL");                              \
-        return;                                                                  \
     }                                                                            \
-    if ((java2str) == NULL) {                                                    \
+    else if ((java2str) == NULL) {                                                    \
         h5nullArgument(env, "second java string is NULL");                       \
-        return;                                                                  \
     }                                                                            \
-    if ((java3str) == NULL) {                                                    \
+    else if ((java3str) == NULL) {                                                    \
         h5nullArgument(env, "third java string is NULL");                        \
-        return;                                                                  \
-    }                                                                            \
-    (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
-    if ((localstr) == NULL) {                                                    \
-        h5JNIFatalError(env, "local c string is not pinned");                    \
-        return;                                                                  \
-    }                                                                            \
-    (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
-    if ((local2str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        h5JNIFatalError(env, "second local c string is not pinned");             \
-        return;                                                                  \
     }                                                                            \
-    (local3str) = ENVPTR->GetStringUTFChars(ENVPAR (java3str), &isCopy);         \
-    if ((local3str) == NULL) {                                                   \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
-        ENVPTR->ReleaseStringUTFChars(ENVPAR (java2str), (local2str));           \
-        h5JNIFatalError(env, "third local c string is not pinned");              \
-        return;                                                                  \
+    else {                                                                       \
+        (localstr) = ENVPTR->GetStringUTFChars(ENVPAR (javastr), &isCopy);           \
+        if ((localstr) == NULL) {                                                    \
+            h5JNIFatalError(env, "local c string is not pinned");                    \
+        }                                                                            \
+        else {                                                                   \
+            (local2str) = ENVPTR->GetStringUTFChars(ENVPAR (java2str), &isCopy);         \
+            if ((local2str) == NULL) {                                                   \
+                ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
+                h5JNIFatalError(env, "second local c string is not pinned");             \
+            }                                                                            \
+            else {                                                               \
+                (local3str) = ENVPTR->GetStringUTFChars(ENVPAR (java3str), &isCopy);         \
+                if ((local3str) == NULL) {                                                   \
+                    ENVPTR->ReleaseStringUTFChars(ENVPAR (javastr), (localstr));             \
+                    ENVPTR->ReleaseStringUTFChars(ENVPAR (java2str), (local2str));           \
+                    h5JNIFatalError(env, "third local c string is not pinned");              \
+                }                                                                \
+            }                                                                    \
+        }                                                                        \
     }                                                                            \
 }
 
diff --git a/java/src/jni/h5lImp.c b/java/src/jni/h5lImp.c
index 739e43b..bf2d7b1 100644
--- a/java/src/jni/h5lImp.c
+++ b/java/src/jni/h5lImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -44,21 +42,23 @@ static herr_t H5L_iterate_cb(hid_t g_id, const char *name, const H5L_info_t *inf
  * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lcopy(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name, jlong dst_loc_id,
+Java_hdf_hdf5lib_H5_H5Lcopy
+    (JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name, jlong dst_loc_id,
         jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_TWO0(cur_name, lCurName, dst_name, lDstName);
+    PIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+    if (lCurName != NULL && lDstName != NULL) {
+        status = H5Lcopy((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    status = H5Lcopy((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+        UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
 
-    UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Lcopy */
 
 /*
@@ -67,7 +67,8 @@ Java_hdf_hdf5lib_H5_H5Lcopy(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring
  * Signature: (Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lcreate_1external(JNIEnv *env, jclass clss, jstring file_name, jstring cur_name,
+Java_hdf_hdf5lib_H5_H5Lcreate_1external
+    (JNIEnv *env, jclass clss, jstring file_name, jstring cur_name,
         jlong dst_loc_id, jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
@@ -75,14 +76,15 @@ Java_hdf_hdf5lib_H5_H5Lcreate_1external(JNIEnv *env, jclass clss, jstring file_n
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_THREE0(file_name, lFileName, cur_name, lCurName, dst_name, lDstName);
-
-    status = H5Lcreate_external(lFileName, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+    PIN_JAVA_STRING_THREE(file_name, lFileName, cur_name, lCurName, dst_name, lDstName);
+    if (lFileName != NULL && lCurName != NULL && lDstName != NULL) {
+        status = H5Lcreate_external(lFileName, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING_THREE(file_name, lFileName, cur_name, lCurName, dst_name, lDstName);
+        UNPIN_JAVA_STRING_THREE(file_name, lFileName, cur_name, lCurName, dst_name, lDstName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Lcreate_1external */
 
 /*
@@ -91,21 +93,23 @@ Java_hdf_hdf5lib_H5_H5Lcreate_1external(JNIEnv *env, jclass clss, jstring file_n
  * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lcreate_1hard(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
+Java_hdf_hdf5lib_H5_H5Lcreate_1hard
+    (JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
         jlong dst_loc_id, jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_TWO0(cur_name, lCurName, dst_name, lDstName);
+    PIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+    if (lCurName != NULL && lDstName != NULL) {
+        status = H5Lcreate_hard((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    status = H5Lcreate_hard((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+        UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
 
-    UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Lcreate_1hard */
 
 /*
@@ -114,21 +118,23 @@ Java_hdf_hdf5lib_H5_H5Lcreate_1hard(JNIEnv *env, jclass clss, jlong cur_loc_id,
  * Signature: (Ljava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lcreate_1soft(JNIEnv *env, jclass clss, jstring cur_name, jlong dst_loc_id,
+Java_hdf_hdf5lib_H5_H5Lcreate_1soft
+    (JNIEnv *env, jclass clss, jstring cur_name, jlong dst_loc_id,
         jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_TWO0(cur_name, lCurName, dst_name, lDstName);
-
-    status = H5Lcreate_soft(lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+    PIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+    if (lCurName != NULL && lDstName != NULL) {
+        status = H5Lcreate_soft(lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+        UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Lcreate_1soft */
 
 /*
@@ -137,19 +143,21 @@ Java_hdf_hdf5lib_H5_H5Lcreate_1soft(JNIEnv *env, jclass clss, jstring cur_name,
  * Signature: (JLjava/lang/String;J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Ldelete(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Ldelete
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     herr_t      status = -1;
     const char *lName;
 
-    PIN_JAVA_STRING0(name, lName);
-
-    status = H5Ldelete((hid_t)loc_id, lName, (hid_t)access_id);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Ldelete((hid_t)loc_id, lName, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Ldelete */
 
 /*
@@ -158,21 +166,23 @@ Java_hdf_hdf5lib_H5_H5Ldelete(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (JLjava/lang/String;IIJJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name,
+Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name,
         jint index_field, jint order, jlong link_n, jlong access_id)
 {
     hsize_t     n = (hsize_t)link_n;
     herr_t      status;
     const char *lName;
 
-    PIN_JAVA_STRING0(name, lName);
-
-    status = H5Ldelete_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, n, (hid_t)access_id);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Ldelete_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, n, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx */
 
 /*
@@ -181,21 +191,23 @@ Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, j
  * Signature: (JLjava/lang/String;J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Lexists(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Lexists
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     htri_t   bval = JNI_FALSE;
     const char *lName;
 
-    PIN_JAVA_STRING(name, lName, JNI_FALSE);
-
-    bval = H5Lexists((hid_t)loc_id, lName, (hid_t)access_id);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        bval = H5Lexists((hid_t)loc_id, lName, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (bval > 0)
-        bval = JNI_TRUE;
-    else if (bval < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
     return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Lexists */
@@ -206,7 +218,8 @@ Java_hdf_hdf5lib_H5_H5Lexists(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5L_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Lget_1info(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Lget_1info
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     jobject     ret_obj = NULL;
     jvalue      args[5];
@@ -214,26 +227,27 @@ Java_hdf_hdf5lib_H5_H5Lget_1info(JNIEnv *env, jclass clss, jlong loc_id, jstring
     H5L_info_t  infobuf;
     const char *lName;
 
-    PIN_JAVA_STRING(name, lName, NULL);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Lget_info((hid_t)loc_id, lName, &infobuf, (hid_t)access_id);
 
-    status = H5Lget_info((hid_t)loc_id, lName, &infobuf, (hid_t)access_id);
-
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (status < 0) {
-        h5libraryError(env);
+        if (status < 0) {
+            h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].i = infobuf.type;
+            args[1].z = infobuf.corder_valid;
+            args[2].j = infobuf.corder;
+            args[3].i = infobuf.cset;
+            if(infobuf.type==0)
+                args[4].j = (jlong)infobuf.u.address;
+            else
+                args[4].j = (jlong)infobuf.u.val_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5L_info_t", "(IZJIJ)V", args);
+        } /* end else */
     } /* end if */
-    else {
-        args[0].i = infobuf.type;
-        args[1].z = infobuf.corder_valid;
-        args[2].j = infobuf.corder;
-        args[3].i = infobuf.cset;
-        if(infobuf.type==0)
-            args[4].j = (jlong)infobuf.u.address;
-        else
-            args[4].j = (jlong)infobuf.u.val_size;
-        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5L_info_t", "(IZJIJ)V", args);
-    } /* end else */
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Lget_1info */
 
@@ -243,7 +257,8 @@ Java_hdf_hdf5lib_H5_H5Lget_1info(JNIEnv *env, jclass clss, jlong loc_id, jstring
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5L_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name,
+Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name,
         jint index_field, jint order, jlong link_n, jlong access_id)
 {
     jobject     ret_obj = NULL;
@@ -252,26 +267,27 @@ Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
     H5L_info_t  infobuf;
     const char *lName;
 
-    PIN_JAVA_STRING(name, lName, NULL);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Lget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
 
-    status = H5Lget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
-
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (status < 0) {
-        h5libraryError(env);
-    } /* end if */
-    else {
-        args[0].i = infobuf.type;
-        args[1].z = infobuf.corder_valid;
-        args[2].j = infobuf.corder;
-        args[3].i = infobuf.cset;
-        if(infobuf.type==0)
-            args[4].j = (jlong)infobuf.u.address;
-        else
-            args[4].j = (jlong)infobuf.u.val_size;
-        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5L_info_t", "(IZJIJ)V", args);
-    } /* end els */
+        if (status < 0) {
+            h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].i = infobuf.type;
+            args[1].z = infobuf.corder_valid;
+            args[2].j = infobuf.corder;
+            args[3].i = infobuf.cset;
+            if(infobuf.type==0)
+                args[4].j = (jlong)infobuf.u.address;
+            else
+                args[4].j = (jlong)infobuf.u.val_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5L_info_t", "(IZJIJ)V", args);
+        } /* end els */
+    }
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx */
 
@@ -280,8 +296,9 @@ Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
  * Method:    H5Lget_name_by_idx
  * Signature: (JLjava/lang/String;IIJJ)Ljava/lang/String;
  */
-JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name,
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name,
         jint index_field, jint order, jlong link_n, jlong access_id)
 {
     jlong       status_size;
@@ -290,39 +307,38 @@ Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
     const char *lName;
     char       *lValue;
 
-    PIN_JAVA_STRING(name, lName, NULL);
-
-    /* get the length of the link name */
-    status_size = H5Lget_name_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (char*)NULL, (size_t)0, H5P_DEFAULT);
-    if(status_size < 0) {
-        UNPIN_JAVA_STRING(name, lName);
-        h5libraryError(env);
-    } /* end if */
-    else {
-        buf_size = (size_t)status_size + 1;/* add extra space for the null terminator */
-
-        lValue = (char*)HDmalloc(sizeof(char) * buf_size);
-        if (lValue == NULL) {
-            UNPIN_JAVA_STRING(name, lName);
-            h5outOfMemory(env, "H5Lget_name_by_idx:  malloc failed ");
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        /* get the length of the link name */
+        status_size = H5Lget_name_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (char*)NULL, (size_t)0, H5P_DEFAULT);
+        if(status_size < 0) {
+            h5libraryError(env);
         } /* end if */
         else {
-            status_size = H5Lget_name_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (char*)lValue, (size_t)buf_size, (hid_t)access_id);
+            buf_size = (size_t)status_size + 1;/* add extra space for the null terminator */
 
-            UNPIN_JAVA_STRING(name, lName);
-
-            if (status_size < 0) {
-                HDfree(lValue);
-                h5libraryError(env);
+            lValue = (char*)HDmalloc(sizeof(char) * buf_size);
+            if (lValue == NULL) {
+                h5outOfMemory(env, "H5Lget_name_by_idx:  malloc failed ");
             } /* end if */
             else {
-                str = ENVPTR->NewStringUTF(ENVPAR lValue);
-                HDfree(lValue);
-                if (str == NULL)
-                    h5JNIFatalError(env, "H5Lget_name_by_idx:  return string not created");
+                status_size = H5Lget_name_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (char*)lValue, (size_t)buf_size, (hid_t)access_id);
+
+                if (status_size < 0) {
+                    HDfree(lValue);
+                    h5libraryError(env);
+                } /* end if */
+                else {
+                    str = ENVPTR->NewStringUTF(ENVPAR lValue);
+                    HDfree(lValue);
+                    if (str == NULL)
+                        h5JNIFatalError(env, "H5Lget_name_by_idx:  return string not created");
+                } /* end else */
             } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, lName);
+    }
+
     return str;
 } /* end Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx */
 
@@ -332,7 +348,8 @@ Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (JLjava/lang/String;[Ljava/lang/String;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Lget_1value(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jobjectArray link_value, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Lget_1value
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jobjectArray link_value, jlong access_id)
 {
     size_t      buf_size;
     herr_t      status;
@@ -343,79 +360,70 @@ Java_hdf_hdf5lib_H5_H5Lget_1value(JNIEnv *env, jclass clss, jlong loc_id, jstrin
     const char *obj_name;
     jstring     str;
 
-    PIN_JAVA_STRING(name, lName, -1);
-
     infobuf.type = -1;
-    /* get the length of the link val */
-    status = H5Lget_info((hid_t)loc_id, lName, &infobuf, H5P_DEFAULT);
-    if(status < 0) {
-        UNPIN_JAVA_STRING(name, lName);
-        h5libraryError(env);
-    } /* end if */
-    else {
-        buf_size = infobuf.u.val_size + 1;/* add extra space for the null terminator */
-
-        if(infobuf.type == H5L_TYPE_HARD) {
-            UNPIN_JAVA_STRING(name, lName);
-            h5JNIFatalError(env, "H5Lget_val:  link is hard type");
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        /* get the length of the link val */
+        status = H5Lget_info((hid_t)loc_id, lName, &infobuf, H5P_DEFAULT);
+        if(status < 0) {
+            h5libraryError(env);
         } /* end if */
         else {
-            lValue = (char*)HDmalloc(sizeof(char) * buf_size);
-            if (lValue == NULL) {
-                UNPIN_JAVA_STRING(name, lName);
-                h5outOfMemory(env, "H5Lget_val:  malloc failed");
+            buf_size = infobuf.u.val_size + 1;/* add extra space for the null terminator */
+
+            if(infobuf.type == H5L_TYPE_HARD) {
+                h5JNIFatalError(env, "H5Lget_val:  link is hard type");
             } /* end if */
             else {
-                status = H5Lget_val((hid_t)loc_id, lName, (void*)lValue, buf_size, (hid_t)access_id);
-
-                UNPIN_JAVA_STRING(name, lName);
-
-                if (status < 0) {
-                    HDfree(lValue);
-                    h5libraryError(env);
+                lValue = (char*)HDmalloc(sizeof(char) * buf_size);
+                if (lValue == NULL) {
+                    h5outOfMemory(env, "H5Lget_val:  malloc failed");
                 } /* end if */
-                else if(infobuf.type == H5L_TYPE_EXTERNAL) {
-                    status = H5Lunpack_elink_val(lValue, (size_t)infobuf.u.val_size, (unsigned*)NULL, &file_name, &obj_name);
+                else {
+                    status = H5Lget_val((hid_t)loc_id, lName, (void*)lValue, buf_size, (hid_t)access_id);
+
                     if (status < 0) {
-                        HDfree(lValue);
                         h5libraryError(env);
                     } /* end if */
-                    else {
-                        str = ENVPTR->NewStringUTF(ENVPAR obj_name);
-                        if (str == NULL) {
-                            HDfree(lValue);
-                            h5JNIFatalError(env, "H5Lget_val:  return string not created");
+                    else if(infobuf.type == H5L_TYPE_EXTERNAL) {
+                        status = H5Lunpack_elink_val(lValue, (size_t)infobuf.u.val_size, (unsigned*)NULL, &file_name, &obj_name);
+                        if (status < 0) {
+                            h5libraryError(env);
                         } /* end if */
                         else {
-                            ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
-
-                            str = ENVPTR->NewStringUTF(ENVPAR file_name);
+                            str = ENVPTR->NewStringUTF(ENVPAR obj_name);
                             if (str == NULL) {
-                                HDfree(lValue);
                                 h5JNIFatalError(env, "H5Lget_val:  return string not created");
                             } /* end if */
                             else {
-                                ENVPTR->SetObjectArrayElement(ENVPAR link_value, 1, str);
-                                HDfree(lValue);
+                                ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
+
+                                str = ENVPTR->NewStringUTF(ENVPAR file_name);
+                                if (str == NULL) {
+                                    h5JNIFatalError(env, "H5Lget_val:  return string not created");
+                                } /* end if */
+                                else {
+                                    ENVPTR->SetObjectArrayElement(ENVPAR link_value, 1, str);
+                                } /* end else */
                             } /* end else */
                         } /* end else */
-                    } /* end else */
-                } /* end else if */
-                else {
-                    str = ENVPTR->NewStringUTF(ENVPAR lValue);
-                    if (str == NULL) {
-                        /* exception -- fatal JNI error */
-                        HDfree(lValue);
-                        h5JNIFatalError(env, "H5Lget_val:  return string not created");
-                    } /* end if */
+                    } /* end else if */
                     else {
-                        ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
-                        HDfree(lValue);
+                        str = ENVPTR->NewStringUTF(ENVPAR lValue);
+                        if (str == NULL) {
+                            /* exception -- fatal JNI error */
+                            h5JNIFatalError(env, "H5Lget_val:  return string not created");
+                        } /* end if */
+                        else {
+                            ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
+                        } /* end else */
                     } /* end else */
+                    HDfree(lValue);
                 } /* end else */
             } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, lName);
+    }
 
     return infobuf.type;
 } /* end Java_hdf_hdf5lib_H5_H5Lget_1val */
@@ -426,7 +434,8 @@ Java_hdf_hdf5lib_H5_H5Lget_1value(JNIEnv *env, jclass clss, jlong loc_id, jstrin
  * Signature: (JLjava/lang/String;IIJ[Ljava/lang/String;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jint index_field, jint order,
+Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jint index_field, jint order,
         jlong link_n, jobjectArray link_value, jlong access_id)
 {
     herr_t      status;
@@ -438,80 +447,69 @@ Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx(JNIEnv *env, jclass clss, jlong loc_i
     const char *obj_name;
     jstring     str;
 
-    PIN_JAVA_STRING(name, lName, -1);
-
     infobuf.type = -1;
-    /* get the length of the link valuee */
-    status = H5Lget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
-    if(status < 0) {
-        UNPIN_JAVA_STRING(name, lName);
-        h5libraryError(env);
-        return -1;
-    } /* end if */
-    else {
-        buf_size = infobuf.u.val_size;
-        if(buf_size < 0) {
-            UNPIN_JAVA_STRING(name, lName);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        /* get the length of the link valuee */
+        status = H5Lget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
+        if(status < 0) {
             h5libraryError(env);
-            return -1;
         } /* end if */
         else {
-            lValue = (void*)HDmalloc(buf_size);
-            if (lValue == NULL) {
-                UNPIN_JAVA_STRING(name, lName);
-                h5outOfMemory(env, "H5Lget_val_by_idx:  malloc failed ");
-                return -1;
+            buf_size = infobuf.u.val_size;
+            if(buf_size < 0) {
+                h5libraryError(env);
             } /* end if */
             else {
-                status = H5Lget_val_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (void*)lValue, (size_t)buf_size, (hid_t)access_id);
-
-                UNPIN_JAVA_STRING(name, lName);
-
-                if (status < 0) {
-                    HDfree(lValue);
-                    h5libraryError(env);
+                lValue = (void*)HDmalloc(buf_size);
+                if (lValue == NULL) {
+                    h5outOfMemory(env, "H5Lget_val_by_idx:  malloc failed ");
                 } /* end if */
-                else if(infobuf.type == H5L_TYPE_EXTERNAL) {
-                    status = H5Lunpack_elink_val((char*)lValue, (size_t)infobuf.u.val_size, (unsigned*)NULL, (const char**)&file_name, (const char**)&obj_name);
+                else {
+                    status = H5Lget_val_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (void*)lValue, (size_t)buf_size, (hid_t)access_id);
+
                     if (status < 0) {
-                        HDfree(lValue);
                         h5libraryError(env);
                     } /* end if */
-                    else {
-                        str = ENVPTR->NewStringUTF(ENVPAR obj_name);
-                        if (str == NULL) {
-                            HDfree(lValue);
-                            h5JNIFatalError(env, "H5Lget_val_by_idx:  return string not created");
+                    else if(infobuf.type == H5L_TYPE_EXTERNAL) {
+                        status = H5Lunpack_elink_val((char*)lValue, (size_t)infobuf.u.val_size, (unsigned*)NULL, (const char**)&file_name, (const char**)&obj_name);
+                        if (status < 0) {
+                            h5libraryError(env);
                         } /* end if */
                         else {
-                            ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
-
-                            str = ENVPTR->NewStringUTF(ENVPAR file_name);
+                            str = ENVPTR->NewStringUTF(ENVPAR obj_name);
                             if (str == NULL) {
-                                HDfree(lValue);
                                 h5JNIFatalError(env, "H5Lget_val_by_idx:  return string not created");
                             } /* end if */
                             else {
-                                ENVPTR->SetObjectArrayElement(ENVPAR link_value, 1, str);
-                                HDfree(lValue);
+                                ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
+
+                                str = ENVPTR->NewStringUTF(ENVPAR file_name);
+                                if (str == NULL) {
+                                    h5JNIFatalError(env, "H5Lget_val_by_idx:  return string not created");
+                                } /* end if */
+                                else {
+                                    ENVPTR->SetObjectArrayElement(ENVPAR link_value, 1, str);
+                                } /* end else */
                             } /* end else */
                         } /* end else */
-                    } /* end else */
-                } /* end else if */
-                else {
-                    str = ENVPTR->NewStringUTF(ENVPAR (char *)lValue);
-                    if (str == NULL) {
-                        HDfree(lValue);
-                        h5JNIFatalError(env, "H5Lget_val_by_idx:  return string not created");
-                    } /* end if */
+                    } /* end else if */
                     else {
-                        ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
-                        HDfree(lValue);
+                        str = ENVPTR->NewStringUTF(ENVPAR (char *)lValue);
+                        if (str == NULL) {
+                            h5JNIFatalError(env, "H5Lget_val_by_idx:  return string not created");
+                        } /* end if */
+                        else {
+                            ENVPTR->SetObjectArrayElement(ENVPAR link_value, 0, str);
+                        } /* end else */
                     } /* end else */
+                    HDfree(lValue);
                 } /* end else */
             } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, lName);
+    }
+
     return infobuf.type;
 } /* end Java_hdf_hdf5lib_H5_H5Lget_1val_1by_1idx */
 
@@ -521,26 +519,30 @@ Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx(JNIEnv *env, jclass clss, jlong loc_i
  * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lmove(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
+Java_hdf_hdf5lib_H5_H5Lmove
+    (JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
         jlong dst_loc_id, jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t   status = -1;
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_TWO0(cur_name, lCurName, dst_name, lDstName);
-
-    status = H5Lmove((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+    PIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+    if (lCurName != NULL && lDstName != NULL) {
+        status = H5Lmove((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+        UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
 } /* end Java_hdf_hdf5lib_H5_H5Lmove */
 
 static herr_t
-H5L_iterate_cb(hid_t g_id, const char *name, const H5L_info_t *info, void *op_data) {
+H5L_iterate_cb
+    (hid_t g_id, const char *name, const H5L_info_t *info, void *op_data)
+{
     JNIEnv    *cbenv;
     jint       status;
     jclass     cls;
@@ -589,7 +591,8 @@ H5L_iterate_cb(hid_t g_id, const char *name, const H5L_info_t *info, void *op_da
  * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Lvisit(JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Lvisit
+    (JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
         jobject callback_op, jobject op_data)
 {
     herr_t status = -1;
@@ -615,7 +618,8 @@ Java_hdf_hdf5lib_H5_H5Lvisit(JNIEnv *env, jclass clss, jlong grp_id, jint idx_ty
  * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name
+    (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
         jobject callback_op, jobject op_data, jlong access_id)
 {
     herr_t        status = -1;
@@ -628,14 +632,15 @@ Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, j
         h5nullArgument(env,  "H5Lvisit_by_name:  op_data or callback_op is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING(name, lName, -1);
-
-        status = H5Lvisit_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5L_iterate_t)H5L_iterate_cb, (void*)op_data, (hid_t)access_id);
+        PIN_JAVA_STRING(name, lName);
+        if (lName != NULL) {
+            status = H5Lvisit_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5L_iterate_t)H5L_iterate_cb, (void*)op_data, (hid_t)access_id);
 
-        UNPIN_JAVA_STRING(name, lName);
+            UNPIN_JAVA_STRING(name, lName);
 
-        if (status < 0)
-            h5libraryError(env);
+            if (status < 0)
+                h5libraryError(env);
+        }
     } /* end else */
 
     return status;
@@ -647,7 +652,8 @@ Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, j
  * Signature: (JIIJLjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Literate(JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Literate
+    (JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
         jlong idx, jobject callback_op, jobject op_data)
 {
     hsize_t       start_idx = (hsize_t)idx;
@@ -675,7 +681,8 @@ Java_hdf_hdf5lib_H5_H5Literate(JNIEnv *env, jclass clss, jlong grp_id, jint idx_
  * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Literate_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Literate_1by_1name
+    (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
         jlong idx, jobject callback_op, jobject op_data, jlong access_id)
 {
     hsize_t       start_idx = (hsize_t)idx;
@@ -689,14 +696,15 @@ Java_hdf_hdf5lib_H5_H5Literate_1by_1name(JNIEnv *env, jclass clss, jlong grp_id,
         h5nullArgument(env,  "H5Literate_by_name:  op_data or callback_op is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING(name, lName, -1);
+        PIN_JAVA_STRING(name, lName);
+        if (lName != NULL) {
+            status = H5Literate_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t*)&start_idx, (H5L_iterate_t)H5L_iterate_cb, (void*)op_data, (hid_t)access_id);
 
-        status = H5Literate_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (hsize_t*)&start_idx, (H5L_iterate_t)H5L_iterate_cb, (void*)op_data, (hid_t)access_id);
-
-        UNPIN_JAVA_STRING(name, lName);
+            UNPIN_JAVA_STRING(name, lName);
 
-        if (status < 0)
-            h5libraryError(env);
+            if (status < 0)
+                h5libraryError(env);
+        }
     } /* end else */
 
     return status;
@@ -708,7 +716,8 @@ Java_hdf_hdf5lib_H5_H5Literate_1by_1name(JNIEnv *env, jclass clss, jlong grp_id,
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Lis_1registered(JNIEnv *env, jclass clss, jint link_cls_id)
+Java_hdf_hdf5lib_H5_H5Lis_1registered
+    (JNIEnv *env, jclass clss, jint link_cls_id)
 {
     htri_t ret_val = H5Lis_registered((H5L_type_t)link_cls_id);
 
@@ -724,7 +733,8 @@ Java_hdf_hdf5lib_H5_H5Lis_1registered(JNIEnv *env, jclass clss, jint link_cls_id
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Lunregister(JNIEnv *env, jclass clss, jint link_cls_id)
+Java_hdf_hdf5lib_H5_H5Lunregister
+    (JNIEnv *env, jclass clss, jint link_cls_id)
 {
     if (H5Lunregister((H5L_type_t)link_cls_id) < 0)
         h5libraryError(env);
diff --git a/java/src/jni/h5lImp.h b/java/src/jni/h5lImp.h
index f0a9a63..3a7d8ea 100644
--- a/java/src/jni/h5lImp.h
+++ b/java/src/jni/h5lImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -24,157 +22,176 @@ extern "C" {
 #endif /* __cplusplus */
 
 
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lcopy
-     * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lcopy
-      (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lcreate_external
-     * Signature: (Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lcreate_1external
-    (JNIEnv*, jclass, jstring, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lcreate_hard
-     * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lcreate_1hard
-      (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lcreate_soft
-     * Signature: (Ljava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lcreate_1soft
-      (JNIEnv*, jclass, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Ldelete
-     * Signature: (JLjava/lang/String;J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Ldelete
-      (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Ldelete_by_idx
-     * Signature: (JLjava/lang/String;IIJJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx
-    (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lexists
-     * Signature: (JLjava/lang/String;J)Z
-     */
-    JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Lexists
-      (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lget_info
-     * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5L_info_t;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Lget_1info
-    (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lget_info_by_idx
-     * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5L_info_t;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx
-    (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lget_name_by_idx
-     * Signature: (JLjava/lang/String;IIJJ)Ljava/lang/String;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx
-    (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lget_value
-     * Signature: (JLjava/lang/String;[Ljava/lang/String;J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lget_1value
-      (JNIEnv*, jclass, jlong, jstring, jobjectArray, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lget_value_by_idx
-     * Signature: (JLjava/lang/String;IIJ[Ljava/lang/String;J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx
-    (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jobjectArray, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lmove
-     * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lmove
-      (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lvisit
-     * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lvisit
-      (JNIEnv*, jclass, jlong, jint, jint, jobject, jobject);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lvisit_by_name
-     * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jint, jint, jobject, jobject, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Literate
-     * Signature: (JIIJLjava/lang/Object;Ljava/lang/Object;)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Literate
-      (JNIEnv*, jclass, jlong, jint, jint, jlong, jobject, jobject);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Literate_by_name
-     * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Literate_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jobject, jobject, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lis_registered
-     * Signature: (I)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lis_1registered
-      (JNIEnv*, jclass, jint);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Lunregister
-     * Signature: (I)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Lunregister
-      (JNIEnv*, jclass, jint);
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lcopy
+ * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lcopy
+  (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lcreate_external
+ * Signature: (Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lcreate_1external
+(JNIEnv*, jclass, jstring, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lcreate_hard
+ * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lcreate_1hard
+  (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lcreate_soft
+ * Signature: (Ljava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lcreate_1soft
+  (JNIEnv*, jclass, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Ldelete
+ * Signature: (JLjava/lang/String;J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Ldelete
+  (JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Ldelete_by_idx
+ * Signature: (JLjava/lang/String;IIJJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Ldelete_1by_1idx
+(JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lexists
+ * Signature: (JLjava/lang/String;J)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Lexists
+  (JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lget_info
+ * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5L_info_t;
+ */
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1info
+(JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lget_info_by_idx
+ * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5L_info_t;
+ */
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1info_1by_1idx
+(JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lget_name_by_idx
+ * Signature: (JLjava/lang/String;IIJJ)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1name_1by_1idx
+(JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lget_value
+ * Signature: (JLjava/lang/String;[Ljava/lang/String;J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1value
+  (JNIEnv*, jclass, jlong, jstring, jobjectArray, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lget_value_by_idx
+ * Signature: (JLjava/lang/String;IIJ[Ljava/lang/String;J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Lget_1value_1by_1idx
+(JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jobjectArray, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lmove
+ * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lmove
+  (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lvisit
+ * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Lvisit
+  (JNIEnv*, jclass, jlong, jint, jint, jobject, jobject);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lvisit_by_name
+ * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jint, jint, jobject, jobject, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Literate
+ * Signature: (JIIJLjava/lang/Object;Ljava/lang/Object;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Literate
+  (JNIEnv*, jclass, jlong, jint, jint, jlong, jobject, jobject);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Literate_by_name
+ * Signature: (JLjava/lang/String;IIJLjava/lang/Object;Ljava/lang/Object;J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Literate_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jobject, jobject, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lis_registered
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Lis_1registered
+  (JNIEnv*, jclass, jint);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Lunregister
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Lunregister
+  (JNIEnv*, jclass, jint);
 
 #ifdef __cplusplus
 } /* end extern "C" */
diff --git a/java/src/jni/h5oImp.c b/java/src/jni/h5oImp.c
index 60130fc..e8abead 100644
--- a/java/src/jni/h5oImp.c
+++ b/java/src/jni/h5oImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -43,19 +41,21 @@ static herr_t H5O_iterate_cb(hid_t g_id, const char *name, const H5O_info_t *inf
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Oopen(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist_id)
+Java_hdf_hdf5lib_H5__1H5Oopen
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist_id)
 {
-    hid_t       status;
+    hid_t       status = -1;
     const char *oName;
 
-    PIN_JAVA_STRING(name, oName, -1);
+    PIN_JAVA_STRING(name, oName);
+    if (oName != NULL) {
+        status = H5Oopen((hid_t)loc_id, oName, (hid_t)access_plist_id );
 
-    status = H5Oopen((hid_t)loc_id, oName, (hid_t)access_plist_id );
-
-    UNPIN_JAVA_STRING(name, oName);
+        UNPIN_JAVA_STRING(name, oName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Oopen */
@@ -66,7 +66,8 @@ Java_hdf_hdf5lib_H5__1H5Oopen(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Oclose(JNIEnv *env, jclass clss, jlong object_id)
+Java_hdf_hdf5lib_H5__1H5Oclose
+    (JNIEnv *env, jclass clss, jlong object_id)
 {
     herr_t retVal = H5Oclose((hid_t)object_id);
 
@@ -82,21 +83,23 @@ Java_hdf_hdf5lib_H5__1H5Oclose(JNIEnv *env, jclass clss, jlong object_id)
  * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Ocopy(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
+Java_hdf_hdf5lib_H5_H5Ocopy
+    (JNIEnv *env, jclass clss, jlong cur_loc_id, jstring cur_name,
         jlong dst_loc_id, jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
     const char *lCurName;
     const char *lDstName;
 
-    PIN_JAVA_STRING_TWO0(cur_name, lCurName, dst_name, lDstName);
+    PIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
+    if (lCurName != NULL && lDstName != NULL) {
+        status = H5Ocopy((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    status = H5Ocopy((hid_t)cur_loc_id, lCurName, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+        UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
 
-    UNPIN_JAVA_STRING_TWO(cur_name, lCurName, dst_name, lDstName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Ocopy */
 
 /*
@@ -105,7 +108,8 @@ Java_hdf_hdf5lib_H5_H5Ocopy(JNIEnv *env, jclass clss, jlong cur_loc_id, jstring
  * Signature: (J)Lhdf/hdf5lib/structs/H5O_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Oget_1info(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Oget_1info
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     herr_t      status = -1;
     H5O_info_t  infobuf;
@@ -119,44 +123,44 @@ Java_hdf_hdf5lib_H5_H5Oget_1info(JNIEnv *env, jclass clss, jlong loc_id)
 
     if (status < 0) {
         h5libraryError(env);
-        return NULL;
     } /* end if */
-
-    args[0].i = (jint)infobuf.hdr.version;
-    args[1].i = (jint)infobuf.hdr.nmesgs;
-    args[2].i = (jint)infobuf.hdr.nchunks;
-    args[3].i = (jint)infobuf.hdr.flags;
-    args[4].j = (jlong)infobuf.hdr.space.total;
-    args[5].j = (jlong)infobuf.hdr.space.meta;
-    args[6].j = (jlong)infobuf.hdr.space.mesg;
-    args[7].j = (jlong)infobuf.hdr.space.free;
-    args[8].j = (jlong)infobuf.hdr.mesg.present;
-    args[9].j = (jlong)infobuf.hdr.mesg.shared;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
-    hdrinfobuf = ret_obj;
-
-    args[0].j = (jlong)infobuf.meta_size.obj.index_size;
-    args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf1 = ret_obj;
-    args[0].j = (jlong)infobuf.meta_size.attr.index_size;
-    args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf2 = ret_obj;
-
-    args[0].j = (jlong)infobuf.fileno;
-    args[1].j = (jlong)infobuf.addr;
-    args[2].i = infobuf.type;
-    args[3].i = (jint)infobuf.rc;
-    args[4].j = (jlong)infobuf.num_attrs;
-    args[5].j = infobuf.atime;
-    args[6].j = infobuf.mtime;
-    args[7].j = infobuf.ctime;
-    args[8].j = infobuf.btime;
-    args[9].l = hdrinfobuf;
-    args[10].l = ihinfobuf1;
-    args[11].l = ihinfobuf2;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+    else {
+        args[0].i = (jint)infobuf.hdr.version;
+        args[1].i = (jint)infobuf.hdr.nmesgs;
+        args[2].i = (jint)infobuf.hdr.nchunks;
+        args[3].i = (jint)infobuf.hdr.flags;
+        args[4].j = (jlong)infobuf.hdr.space.total;
+        args[5].j = (jlong)infobuf.hdr.space.meta;
+        args[6].j = (jlong)infobuf.hdr.space.mesg;
+        args[7].j = (jlong)infobuf.hdr.space.free;
+        args[8].j = (jlong)infobuf.hdr.mesg.present;
+        args[9].j = (jlong)infobuf.hdr.mesg.shared;
+        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
+        hdrinfobuf = ret_obj;
+
+        args[0].j = (jlong)infobuf.meta_size.obj.index_size;
+        args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
+        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+        ihinfobuf1 = ret_obj;
+        args[0].j = (jlong)infobuf.meta_size.attr.index_size;
+        args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
+        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+        ihinfobuf2 = ret_obj;
+
+        args[0].j = (jlong)infobuf.fileno;
+        args[1].j = (jlong)infobuf.addr;
+        args[2].i = infobuf.type;
+        args[3].i = (jint)infobuf.rc;
+        args[4].j = (jlong)infobuf.num_attrs;
+        args[5].j = infobuf.atime;
+        args[6].j = infobuf.mtime;
+        args[7].j = infobuf.ctime;
+        args[8].j = infobuf.btime;
+        args[9].l = hdrinfobuf;
+        args[10].l = ihinfobuf1;
+        args[11].l = ihinfobuf2;
+        CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+    }
 
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Oget_1info */
@@ -167,7 +171,8 @@ Java_hdf_hdf5lib_H5_H5Oget_1info(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5O_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     const char *lName;
     herr_t      status = -1;
@@ -178,52 +183,53 @@ Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_i
     jobject     ihinfobuf2;
     jobject     ret_obj = NULL;
 
-    PIN_JAVA_STRING(name, lName, NULL);
-
-    status = H5Oget_info_by_name((hid_t)loc_id, lName, &infobuf, (hid_t)access_id);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Oget_info_by_name((hid_t)loc_id, lName, &infobuf, (hid_t)access_id);
 
-    UNPIN_JAVA_STRING(name, lName);
+        UNPIN_JAVA_STRING(name, lName);
 
-    if (status < 0) {
-        h5libraryError(env);
-        return NULL;
-    } /* end if */
-
-    args[0].i = (jint)infobuf.hdr.version;
-    args[1].i = (jint)infobuf.hdr.nmesgs;
-    args[2].i = (jint)infobuf.hdr.nchunks;
-    args[3].i = (jint)infobuf.hdr.flags;
-    args[4].j = (jlong)infobuf.hdr.space.total;
-    args[5].j = (jlong)infobuf.hdr.space.meta;
-    args[6].j = (jlong)infobuf.hdr.space.mesg;
-    args[7].j = (jlong)infobuf.hdr.space.free;
-    args[8].j = (jlong)infobuf.hdr.mesg.present;
-    args[9].j = (jlong)infobuf.hdr.mesg.shared;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
-    hdrinfobuf = ret_obj;
-
-    args[0].j = (jlong)infobuf.meta_size.obj.index_size;
-    args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf1 = ret_obj;
-    args[0].j = (jlong)infobuf.meta_size.attr.index_size;
-    args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf2 = ret_obj;
-
-    args[0].j = (jlong)infobuf.fileno;
-    args[1].j = (jlong)infobuf.addr;
-    args[2].i = infobuf.type;
-    args[3].i = (jint)infobuf.rc;
-    args[4].j = (jlong)infobuf.num_attrs;
-    args[5].j = infobuf.atime;
-    args[6].j = infobuf.mtime;
-    args[7].j = infobuf.ctime;
-    args[8].j = infobuf.btime;
-    args[9].l = hdrinfobuf;
-    args[10].l = ihinfobuf1;
-    args[11].l = ihinfobuf2;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+        if (status < 0) {
+            h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].i = (jint)infobuf.hdr.version;
+            args[1].i = (jint)infobuf.hdr.nmesgs;
+            args[2].i = (jint)infobuf.hdr.nchunks;
+            args[3].i = (jint)infobuf.hdr.flags;
+            args[4].j = (jlong)infobuf.hdr.space.total;
+            args[5].j = (jlong)infobuf.hdr.space.meta;
+            args[6].j = (jlong)infobuf.hdr.space.mesg;
+            args[7].j = (jlong)infobuf.hdr.space.free;
+            args[8].j = (jlong)infobuf.hdr.mesg.present;
+            args[9].j = (jlong)infobuf.hdr.mesg.shared;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
+            hdrinfobuf = ret_obj;
+
+            args[0].j = (jlong)infobuf.meta_size.obj.index_size;
+            args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+            ihinfobuf1 = ret_obj;
+            args[0].j = (jlong)infobuf.meta_size.attr.index_size;
+            args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+            ihinfobuf2 = ret_obj;
+
+            args[0].j = (jlong)infobuf.fileno;
+            args[1].j = (jlong)infobuf.addr;
+            args[2].i = infobuf.type;
+            args[3].i = (jint)infobuf.rc;
+            args[4].j = (jlong)infobuf.num_attrs;
+            args[5].j = infobuf.atime;
+            args[6].j = infobuf.mtime;
+            args[7].j = infobuf.ctime;
+            args[8].j = infobuf.btime;
+            args[9].l = hdrinfobuf;
+            args[10].l = ihinfobuf1;
+            args[11].l = ihinfobuf2;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+        }
+    }
 
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name */
@@ -234,7 +240,8 @@ Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name(JNIEnv *env, jclass clss, jlong loc_i
  * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5O_info_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id,
+Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id,
         jstring name, jint index_field, jint order, jlong link_n, jlong access_id)
 {
     const char *lName;
@@ -246,52 +253,53 @@ Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
     jobject     ihinfobuf2;
     jobject     ret_obj = NULL;
 
-    PIN_JAVA_STRING(name, lName, NULL);
+    PIN_JAVA_STRING(name, lName);
+    if (lName != NULL) {
+        status = H5Oget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
 
-    status = H5Oget_info_by_idx((hid_t)loc_id, lName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, &infobuf, (hid_t)access_id);
+        UNPIN_JAVA_STRING(name, lName);
 
-    UNPIN_JAVA_STRING(name, lName);
-
-    if (status < 0) {
-        h5libraryError(env);
-        return NULL;
-    } /* end if */
-
-    args[0].i = (jint)infobuf.hdr.version;
-    args[1].i = (jint)infobuf.hdr.nmesgs;
-    args[2].i = (jint)infobuf.hdr.nchunks;
-    args[3].i = (jint)infobuf.hdr.flags;
-    args[4].j = (jlong)infobuf.hdr.space.total;
-    args[5].j = (jlong)infobuf.hdr.space.meta;
-    args[6].j = (jlong)infobuf.hdr.space.mesg;
-    args[7].j = (jlong)infobuf.hdr.space.free;
-    args[8].j = (jlong)infobuf.hdr.mesg.present;
-    args[9].j = (jlong)infobuf.hdr.mesg.shared;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
-    hdrinfobuf = ret_obj;
-
-    args[0].j = (jlong)infobuf.meta_size.obj.index_size;
-    args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf1 = ret_obj;
-    args[0].j = (jlong)infobuf.meta_size.attr.index_size;
-    args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
-    ihinfobuf2 = ret_obj;
-
-    args[0].j = (jlong)infobuf.fileno;
-    args[1].j = (jlong)infobuf.addr;
-    args[2].i = infobuf.type;
-    args[3].i = (jint)infobuf.rc;
-    args[4].j = (jlong)infobuf.num_attrs;
-    args[5].j = infobuf.atime;
-    args[6].j = infobuf.mtime;
-    args[7].j = infobuf.ctime;
-    args[8].j = infobuf.btime;
-    args[9].l = hdrinfobuf;
-    args[10].l = ihinfobuf1;
-    args[11].l = ihinfobuf2;
-    CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+        if (status < 0) {
+            h5libraryError(env);
+        } /* end if */
+        else {
+            args[0].i = (jint)infobuf.hdr.version;
+            args[1].i = (jint)infobuf.hdr.nmesgs;
+            args[2].i = (jint)infobuf.hdr.nchunks;
+            args[3].i = (jint)infobuf.hdr.flags;
+            args[4].j = (jlong)infobuf.hdr.space.total;
+            args[5].j = (jlong)infobuf.hdr.space.meta;
+            args[6].j = (jlong)infobuf.hdr.space.mesg;
+            args[7].j = (jlong)infobuf.hdr.space.free;
+            args[8].j = (jlong)infobuf.hdr.mesg.present;
+            args[9].j = (jlong)infobuf.hdr.mesg.shared;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_hdr_info_t", "(IIIIJJJJJJ)V", args);
+            hdrinfobuf = ret_obj;
+
+            args[0].j = (jlong)infobuf.meta_size.obj.index_size;
+            args[1].j = (jlong)infobuf.meta_size.obj.heap_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+            ihinfobuf1 = ret_obj;
+            args[0].j = (jlong)infobuf.meta_size.attr.index_size;
+            args[1].j = (jlong)infobuf.meta_size.attr.heap_size;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5_ih_info_t", "(JJ)V", args);
+            ihinfobuf2 = ret_obj;
+
+            args[0].j = (jlong)infobuf.fileno;
+            args[1].j = (jlong)infobuf.addr;
+            args[2].i = infobuf.type;
+            args[3].i = (jint)infobuf.rc;
+            args[4].j = (jlong)infobuf.num_attrs;
+            args[5].j = infobuf.atime;
+            args[6].j = infobuf.mtime;
+            args[7].j = infobuf.ctime;
+            args[8].j = infobuf.btime;
+            args[9].l = hdrinfobuf;
+            args[10].l = ihinfobuf1;
+            args[11].l = ihinfobuf2;
+            CALL_CONSTRUCTOR("hdf/hdf5lib/structs/H5O_info_t", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V", args);
+        }
+    }
 
     return ret_obj;
 } /* end Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx */
@@ -302,24 +310,27 @@ Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id
  * Signature: (JJLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Olink(JNIEnv *env, jclass clss, jlong cur_loc_id, jlong dst_loc_id,
+Java_hdf_hdf5lib_H5_H5Olink
+    (JNIEnv *env, jclass clss, jlong cur_loc_id, jlong dst_loc_id,
         jstring dst_name, jlong create_id, jlong access_id)
 {
     herr_t      status = -1;
     const char *lDstName;
 
-    PIN_JAVA_STRING0(dst_name, lDstName);
+    PIN_JAVA_STRING(dst_name, lDstName);
+    if (lDstName != NULL) {
+        status = H5Olink((hid_t)cur_loc_id, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
 
-    status = H5Olink((hid_t)cur_loc_id, (hid_t)dst_loc_id, lDstName, (hid_t)create_id, (hid_t)access_id);
+        UNPIN_JAVA_STRING(dst_name, lDstName);
 
-    UNPIN_JAVA_STRING(dst_name, lDstName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Olink */
 
 static herr_t
-H5O_iterate_cb(hid_t g_id, const char *name, const H5O_info_t *info, void *op_data)
+H5O_iterate_cb
+    (hid_t g_id, const char *name, const H5O_info_t *info, void *op_data)
 {
     JNIEnv    *cbenv;
     jint       status = -1;
@@ -339,90 +350,71 @@ H5O_iterate_cb(hid_t g_id, const char *name, const H5O_info_t *info, void *op_da
         return -1;
     } /* end if */
     cls = CBENVPTR->GetObjectClass(CBENVPAR visit_callback);
-    if (cls == 0) {
-        /* printf("JNI H5O_iterate_cb error: GetObjectClass failed\n"); */
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
+    if (cls != 0) {
+        mid = CBENVPTR->GetMethodID(CBENVPAR cls, "callback", "(JLjava/lang/String;Lhdf/hdf5lib/structs/H5O_info_t;Lhdf/hdf5lib/callbacks/H5O_iterate_t;)I");
+        if (mid != 0) {
+            str = CBENVPTR->NewStringUTF(CBENVPAR name);
+
+            args[0].i = (jint)info->hdr.version;
+            args[1].i = (jint)info->hdr.nmesgs;
+            args[2].i = (jint)info->hdr.nchunks;
+            args[3].i = (jint)info->hdr.flags;
+            args[4].j = (jlong)info->hdr.space.total;
+            args[5].j = (jlong)info->hdr.space.meta;
+            args[6].j = (jlong)info->hdr.space.mesg;
+            args[7].j = (jlong)info->hdr.space.free;
+            args[8].j = (jlong)info->hdr.mesg.present;
+            args[9].j = (jlong)info->hdr.mesg.shared;
+            // get a reference to the H5_hdr_info_t class
+            cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5O_hdr_info_t");
+            if (cls != 0) {
+                // get a reference to the constructor; the name is <init>
+                constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(IIIIJJJJJJ)V");
+                if (constructor != 0) {
+                    hdrinfobuf = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
+
+                    args[0].j = (jlong)info->meta_size.obj.index_size;
+                    args[1].j = (jlong)info->meta_size.obj.heap_size;
+                    // get a reference to the H5_ih_info_t class
+                    cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5_ih_info_t");
+                    if (cls != 0) {
+                        // get a reference to the constructor; the name is <init>
+                        constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(JJ)V");
+                        if (constructor != 0) {
+                            ihinfobuf1 = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
+                            args[0].j = (jlong)info->meta_size.attr.index_size;
+                            args[1].j = (jlong)info->meta_size.attr.heap_size;
+                            ihinfobuf2 = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
+
+                            args[0].j = (jlong)info->fileno;
+                            args[1].j = (jlong)info->addr;
+                            args[2].i = info->type;
+                            args[3].i = (jint)info->rc;
+                            args[4].j = (jlong)info->num_attrs;
+                            args[5].j = info->atime;
+                            args[6].j = info->mtime;
+                            args[7].j = info->ctime;
+                            args[8].j = info->btime;
+                            args[9].l = hdrinfobuf;
+                            args[10].l = ihinfobuf1;
+                            args[11].l = ihinfobuf2;
+                            // get a reference to the H5O_info_t class
+                            cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5O_info_t");
+                            if (cls != 0) {
+                                // get a reference to the constructor; the name is <init>
+                                constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V");
+                                if (constructor != 0) {
+                                    cb_info_t = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
+
+                                    status = CBENVPTR->CallIntMethod(CBENVPAR visit_callback, mid, g_id, str, cb_info_t, op_data);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
     } /* end if */
-    mid = CBENVPTR->GetMethodID(CBENVPAR cls, "callback", "(JLjava/lang/String;Lhdf/hdf5lib/structs/H5O_info_t;Lhdf/hdf5lib/callbacks/H5O_iterate_t;)I");
-    if (mid == 0) {
-        /* printf("JNI H5O_iterate_cb error: GetMethodID failed\n"); */
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    str = CBENVPTR->NewStringUTF(CBENVPAR name);
-
-    args[0].i = (jint)info->hdr.version;
-    args[1].i = (jint)info->hdr.nmesgs;
-    args[2].i = (jint)info->hdr.nchunks;
-    args[3].i = (jint)info->hdr.flags;
-    args[4].j = (jlong)info->hdr.space.total;
-    args[5].j = (jlong)info->hdr.space.meta;
-    args[6].j = (jlong)info->hdr.space.mesg;
-    args[7].j = (jlong)info->hdr.space.free;
-    args[8].j = (jlong)info->hdr.mesg.present;
-    args[9].j = (jlong)info->hdr.mesg.shared;
-    // get a reference to the H5_hdr_info_t class
-    cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5O_hdr_info_t");
-    if (cls == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    // get a reference to the constructor; the name is <init>
-    constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(IIIIJJJJJJ)V");
-    if (constructor == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    hdrinfobuf = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
-
-    args[0].j = (jlong)info->meta_size.obj.index_size;
-    args[1].j = (jlong)info->meta_size.obj.heap_size;
-    // get a reference to the H5_ih_info_t class
-    cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5_ih_info_t");
-    if (cls == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    // get a reference to the constructor; the name is <init>
-    constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(JJ)V");
-    if (constructor == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    ihinfobuf1 = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
-    args[0].j = (jlong)info->meta_size.attr.index_size;
-    args[1].j = (jlong)info->meta_size.attr.heap_size;
-    ihinfobuf2 = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
-
-    args[0].j = (jlong)info->fileno;
-    args[1].j = (jlong)info->addr;
-    args[2].i = info->type;
-    args[3].i = (jint)info->rc;
-    args[4].j = (jlong)info->num_attrs;
-    args[5].j = info->atime;
-    args[6].j = info->mtime;
-    args[7].j = info->ctime;
-    args[8].j = info->btime;
-    args[9].l = hdrinfobuf;
-    args[10].l = ihinfobuf1;
-    args[11].l = ihinfobuf2;
-    // get a reference to the H5O_info_t class
-    cls = CBENVPTR->FindClass(CBENVPAR "hdf/hdf5lib/structs/H5O_info_t");
-    if (cls == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    // get a reference to the constructor; the name is <init>
-    constructor = CBENVPTR->GetMethodID(CBENVPAR cls, "<init>", "(JJIIJJJJJLhdf/hdf5lib/structs/H5O_hdr_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;Lhdf/hdf5lib/structs/H5_ih_info_t;)V");
-    if (constructor == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-    cb_info_t = CBENVPTR->NewObjectA(CBENVPAR cls, constructor, args);
-
-    status = CBENVPTR->CallIntMethod(CBENVPAR visit_callback, mid, g_id, str, cb_info_t, op_data);
-
     JVMPTR->DetachCurrentThread(JVMPAR);
 
     return status;
@@ -434,7 +426,8 @@ H5O_iterate_cb(hid_t g_id, const char *name, const H5O_info_t *info, void *op_da
  * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Ovisit(JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Ovisit
+    (JNIEnv *env, jclass clss, jlong grp_id, jint idx_type, jint order,
         jobject callback_op, jobject op_data)
 {
     herr_t   status = -1;
@@ -444,17 +437,16 @@ Java_hdf_hdf5lib_H5_H5Ovisit(JNIEnv *env, jclass clss, jlong grp_id, jint idx_ty
 
     if (op_data == NULL) {
         h5nullArgument(env, "H5Ovisit:  op_data is NULL");
-        return -1;
     } /* end if */
-    if (callback_op == NULL) {
+    else if (callback_op == NULL) {
         h5nullArgument(env, "H5Ovisit:  callback_op is NULL");
-        return -1;
     } /* end if */
+    else {
+        status = H5Ovisit((hid_t)grp_id, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5O_iterate_t)H5O_iterate_cb, (void*)op_data);
 
-    status = H5Ovisit((hid_t)grp_id, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5O_iterate_t)H5O_iterate_cb, (void*)op_data);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return status;
 } /* end Java_hdf_hdf5lib_H5_H5Ovisit */
@@ -465,7 +457,8 @@ Java_hdf_hdf5lib_H5_H5Ovisit(JNIEnv *env, jclass clss, jlong grp_id, jint idx_ty
  * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
+Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name
+    (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order,
         jobject callback_op, jobject op_data, jlong access_id)
 {
     herr_t        status = -1;
@@ -478,19 +471,21 @@ Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, j
         h5nullArgument(env, "H5Ovisit_by_name:  op_data is NULL");
         return -1;
     } /* end if */
-    if (callback_op == NULL) {
+    else if (callback_op == NULL) {
         h5nullArgument(env, "H5Ovisit_by_name:  callback_op is NULL");
         return -1;
     } /* end if */
+    else {
+        PIN_JAVA_STRING(name, lName);
+        if (lName != NULL) {
+            status = H5Ovisit_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5O_iterate_t)H5O_iterate_cb, (void*)op_data, (hid_t)access_id);
 
-    PIN_JAVA_STRING(name, lName, -1);
-
-    status = H5Ovisit_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5O_iterate_t)H5O_iterate_cb, (void*)op_data, (hid_t)access_id);
+            UNPIN_JAVA_STRING(name, lName);
 
-    UNPIN_JAVA_STRING(name, lName);
-
-    if (status < 0)
-        h5libraryError(env);
+            if (status < 0)
+                h5libraryError(env);
+        }
+    }
 
     return status;
 } /* end Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name */
@@ -501,27 +496,24 @@ Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name(JNIEnv *env, jclass clss, jlong grp_id, j
  * Signature: (JLjava/lang/String;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Oset_1comment(JNIEnv *env, jclass clss, jlong loc_id, jstring comment)
+Java_hdf_hdf5lib_H5_H5Oset_1comment
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring comment)
 {
     herr_t      status = -1;
-    const char *oComment;
+    const char *oComment = NULL;
     jboolean    isCopy;
 
     if (comment == NULL) {
-        oComment = NULL;
+        status = H5Oset_comment((hid_t)loc_id, oComment);
     } /* end if */
     else {
         oComment = ENVPTR->GetStringUTFChars(ENVPAR comment, &isCopy);
-        if (oComment == NULL) {
-            h5JNIFatalError( env, "H5Oset_comment:  comment not pinned");
-            return;
-        } /* end if */
-    } /* end else */
+        if (oComment != NULL) {
+            status = H5Oset_comment((hid_t)loc_id, oComment);
 
-    status = H5Oset_comment((hid_t)loc_id, oComment);
-
-    if(oComment)
-        ENVPTR->ReleaseStringUTFChars(ENVPAR comment, oComment);
+            ENVPTR->ReleaseStringUTFChars(ENVPAR comment, oComment);
+        }
+    } /* end else */
 
     if (status < 0)
         h5libraryError(env);
@@ -533,37 +525,33 @@ Java_hdf_hdf5lib_H5_H5Oset_1comment(JNIEnv *env, jclass clss, jlong loc_id, jstr
  * Signature: (JLjava/lang/String;Ljava/lang/String;J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
+Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id,
         jstring name, jstring comment, jlong access_id)
 {
     herr_t      status = -1;
     const char *oName;
     const char *oComment;
 
-    PIN_JAVA_STRING0(name, oName);
-
-    if (comment == NULL) {
-        oComment = NULL;
-    } /* end if */
-    else {
-        jboolean    isCopy;
-        oComment = ENVPTR->GetStringUTFChars(ENVPAR comment, &isCopy);
-        if (oComment == NULL) {
-            UNPIN_JAVA_STRING(name, oName);
-            h5JNIFatalError( env, "H5Oset_comment_by_name:  comment not pinned");
-            return;
+    PIN_JAVA_STRING(name, oName);
+    if (oName != NULL) {
+        if (comment == NULL) {
+            status = H5Oset_comment_by_name((hid_t)loc_id, oName, NULL, (hid_t)access_id);
         } /* end if */
-    } /* end else */
+        else {
+            jboolean    isCopy;
+            oComment = ENVPTR->GetStringUTFChars(ENVPAR comment, &isCopy);
+            if (oComment != NULL) {
+                status = H5Oset_comment_by_name((hid_t)loc_id, oName, oComment, (hid_t)access_id);
+                ENVPTR->ReleaseStringUTFChars(ENVPAR comment, oComment);
+            } /* end if */
+        } /* end else */
 
-    status = H5Oset_comment_by_name((hid_t)loc_id, oName, oComment, (hid_t)access_id);
-
-    UNPIN_JAVA_STRING(name, oName);
-
-    if(oComment)
-        ENVPTR->ReleaseStringUTFChars(ENVPAR comment, oComment);
+        UNPIN_JAVA_STRING(name, oName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name */
 
 /*
@@ -572,7 +560,8 @@ Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name(JNIEnv *env, jclass clss, jlong lo
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Oget_1comment(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Oget_1comment
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     char    *oComment;
     ssize_t  buf_size;
@@ -583,34 +572,30 @@ Java_hdf_hdf5lib_H5_H5Oget_1comment(JNIEnv *env, jclass clss, jlong loc_id)
     buf_size = H5Oget_comment((hid_t)loc_id, NULL, 0);
     if (buf_size < 0) {
         h5badArgument( env, "H5Oget_comment:  buf_size < 0");
-        return NULL;
-    } /* end if */
-    if (buf_size == 0) {
-        return NULL;
-    } /* end if */
-
-    buf_size++; /* add extra space for the null terminator */
-    oComment = (char *)HDmalloc(sizeof(char) * (size_t)buf_size);
-    if (oComment == NULL) {
-        /* exception -- out of memory */
-        h5outOfMemory( env, "H5Oget_comment:  malloc failed");
-        return NULL;
     } /* end if */
-
-    status = H5Oget_comment((hid_t)loc_id, oComment, (size_t)buf_size);
-
-    if (status >= 0) {
-        /*  may throw OutOfMemoryError */
-        str = ENVPTR->NewStringUTF(ENVPAR oComment);
-        HDfree(oComment);
-        if (str == NULL) {
-            h5JNIFatalError( env, "H5Oget_comment:  return string not allocated");
+    else if (buf_size > 0) {
+        buf_size++; /* add extra space for the null terminator */
+        oComment = (char *)HDmalloc(sizeof(char) * (size_t)buf_size);
+        if (oComment == NULL) {
+            /* exception -- out of memory */
+            h5outOfMemory( env, "H5Oget_comment:  malloc failed");
         } /* end if */
-    } /* end if */
-    else {
-        HDfree(oComment);
-        h5libraryError(env);
-    } /* end else */
+        else {
+            status = H5Oget_comment((hid_t)loc_id, oComment, (size_t)buf_size);
+
+            if (status < 0) {
+                h5libraryError(env);
+            } /* end if */
+            else {
+                /*  may throw OutOfMemoryError */
+                str = ENVPTR->NewStringUTF(ENVPAR oComment);
+                if (str == NULL) {
+                    h5JNIFatalError( env, "H5Oget_comment:  return string not allocated");
+                } /* end if */
+            } /* end else */
+            HDfree(oComment);
+        }
+    } /* end else if */
 
     return (jstring)str;
 } /* end Java_hdf_hdf5lib_H5_H5Oget_1comment */
@@ -621,7 +606,8 @@ Java_hdf_hdf5lib_H5_H5Oget_1comment(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (JLjava/lang/String;J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     char       *oComment;
     const char *oName;
@@ -629,43 +615,37 @@ Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name(JNIEnv *env, jclass clss, jlong lo
     ssize_t     status;
     jstring     str = NULL;
 
-    PIN_JAVA_STRING(name, oName, NULL);
-
-    /* get the length of the comment */
-    buf_size = H5Oget_comment_by_name((hid_t)loc_id, oName, NULL, 0, (hid_t)access_id);
-    if (buf_size < 0) {
-        UNPIN_JAVA_STRING(name, oName);
-        h5badArgument( env, "H5Oget_comment_by_name:  buf_size < 0");
-        return NULL;
-    } /* end if */
-    if (buf_size == 0) {
-        UNPIN_JAVA_STRING(name, oName);
-        return NULL;
-    } /* end if */
-
-    buf_size++; /* add extra space for the null terminator */
-    oComment = (char *)HDmalloc(sizeof(char) * (size_t)buf_size);
-    if (oComment == NULL) {
-        UNPIN_JAVA_STRING(name, oName);
-        h5outOfMemory( env, "H5Oget_comment_by_name:  malloc failed");
-        return NULL;
-    } /* end if */
-
-    status = H5Oget_comment_by_name((hid_t)loc_id, oName, oComment, (size_t)buf_size, (hid_t)access_id);
-    UNPIN_JAVA_STRING(name, oName);
-
-    if (status >= 0) {
-        /*  may throw OutOfMemoryError */
-        str = ENVPTR->NewStringUTF(ENVPAR oComment);
-        HDfree(oComment);
-        if (str == NULL) {
-            h5JNIFatalError( env, "H5Oget_comment_by_name:  return string not allocated");
+    PIN_JAVA_STRING(name, oName);
+    if (oName != NULL) {
+        /* get the length of the comment */
+        buf_size = H5Oget_comment_by_name((hid_t)loc_id, oName, NULL, 0, (hid_t)access_id);
+        if (buf_size < 0) {
+            h5badArgument( env, "H5Oget_comment_by_name:  buf_size < 0");
         } /* end if */
-    } /* end if */
-    else {
-        HDfree(oComment);
-        h5libraryError(env);
-    } /* end else */
+        else if (buf_size > 0) {
+            buf_size++; /* add extra space for the null terminator */
+            oComment = (char *)HDmalloc(sizeof(char) * (size_t)buf_size);
+            if (oComment == NULL) {
+                h5outOfMemory( env, "H5Oget_comment_by_name:  malloc failed");
+            } /* end if */
+            else {
+                status = H5Oget_comment_by_name((hid_t)loc_id, oName, oComment, (size_t)buf_size, (hid_t)access_id);
+
+                if (status < 0) {
+                    h5libraryError(env);
+                } /* end if */
+                else {
+                    /*  may throw OutOfMemoryError */
+                    str = ENVPTR->NewStringUTF(ENVPAR oComment);
+                    if (str == NULL) {
+                        h5JNIFatalError( env, "H5Oget_comment_by_name:  return string not allocated");
+                    } /* end if */
+                } /* end else */
+                HDfree(oComment);
+            }
+        } /* end if */
+        UNPIN_JAVA_STRING(name, oName);
+    }
 
     return (jstring)str;
 } /* end Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name */
@@ -676,21 +656,23 @@ Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name(JNIEnv *env, jclass clss, jlong lo
  * Signature: (JLjava/lang/String;J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Oexists_1by_1name(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
+Java_hdf_hdf5lib_H5_H5Oexists_1by_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_id)
 {
     htri_t      bval = JNI_FALSE;
     const char *oName;
 
-    PIN_JAVA_STRING(name, oName, JNI_FALSE);
+    PIN_JAVA_STRING(name, oName);
+    if (oName != NULL) {
+        bval = H5Oexists_by_name((hid_t)loc_id, oName, (hid_t)access_id);
 
-    bval = H5Oexists_by_name((hid_t)loc_id, oName, (hid_t)access_id);
-
-    UNPIN_JAVA_STRING(name, oName);
+        UNPIN_JAVA_STRING(name, oName);
 
-    if (bval > 0)
-        bval = JNI_TRUE;
-    else if (bval < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
     return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Oexists_1by_1name */
@@ -701,7 +683,8 @@ Java_hdf_hdf5lib_H5_H5Oexists_1by_1name(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Odecr_1refcount(JNIEnv *env, jclass clss, jlong object_id)
+Java_hdf_hdf5lib_H5_H5Odecr_1refcount
+    (JNIEnv *env, jclass clss, jlong object_id)
 {
     if (H5Odecr_refcount((hid_t)object_id) < 0)
         h5libraryError(env);
@@ -713,7 +696,8 @@ Java_hdf_hdf5lib_H5_H5Odecr_1refcount(JNIEnv *env, jclass clss, jlong object_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Oincr_1refcount(JNIEnv *env, jclass clss, jlong object_id)
+Java_hdf_hdf5lib_H5_H5Oincr_1refcount
+    (JNIEnv *env, jclass clss, jlong object_id)
 {
     if (H5Oincr_refcount((hid_t)object_id) < 0)
         h5libraryError(env);
@@ -725,7 +709,8 @@ Java_hdf_hdf5lib_H5_H5Oincr_1refcount(JNIEnv *env, jclass clss, jlong object_id)
  * Signature: (JJ)J;
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr(JNIEnv *env, jclass clss, jlong loc_id, jlong addr)
+Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr
+    (JNIEnv *env, jclass clss, jlong loc_id, jlong addr)
 {
     hid_t retVal = -1;
 
@@ -742,20 +727,22 @@ Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr(JNIEnv *env, jclass clss, jlong loc_id,
  * Signature: (JLjava/lang/String;IIJJ)J;
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, jstring name,
+Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name,
         jint index_field, jint order, jlong link_n, jlong lapl_id)
 {
     hid_t       retVal = -1;
     const char *oName;
 
-    PIN_JAVA_STRING(name, oName, -1);
+    PIN_JAVA_STRING(name, oName);
+    if (oName != NULL) {
+        retVal = H5Oopen_by_idx((hid_t)loc_id, oName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (hid_t)lapl_id );
 
-    retVal = H5Oopen_by_idx((hid_t)loc_id, oName, (H5_index_t)index_field, (H5_iter_order_t)order, (hsize_t)link_n, (hid_t)lapl_id );
-
-    UNPIN_JAVA_STRING(name, oName);
+        UNPIN_JAVA_STRING(name, oName);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)retVal;
 } /* end Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx */
@@ -766,11 +753,12 @@ Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx(JNIEnv *env, jclass clss, jlong loc_id, j
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Oflush(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Oflush
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Oflush((hid_t)loc_id) < 0)
         h5libraryError(env);
-}
+} /* end Java_hdf_hdf5lib_H5_H5Oflush */
 
 /*
  * Class:     hdf_hdf5lib_H5
@@ -778,11 +766,13 @@ Java_hdf_hdf5lib_H5_H5Oflush(JNIEnv *env, jclass clss, jlong loc_id)
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Orefresh(JNIEnv *env, jclass clss, jlong loc_id)
+Java_hdf_hdf5lib_H5_H5Orefresh
+    (JNIEnv *env, jclass clss, jlong loc_id)
 {
     if (H5Orefresh((hid_t)loc_id) < 0)
         h5libraryError(env);
-}
+} /* end Java_hdf_hdf5lib_H5_H5Orefresh */
+
 
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5oImp.h b/java/src/jni/h5oImp.h
index a404145..224f298 100644
--- a/java/src/jni/h5oImp.h
+++ b/java/src/jni/h5oImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -24,165 +22,185 @@ extern "C" {
 #endif /* __cplusplus */
 
 
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    _H5Oopen
-     * Signature: (JLjava/lang/String;J)J
-     */
-    JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Oopen
-      (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    _H5Oclose
-     * Signature: (J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Oclose
-      (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Ocopy
-     * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Ocopy
-      (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oget_info
-     * Signature: (J)Lhdf/hdf5lib/structs/H5O_info_t;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Oget_1info
-    (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oget_info_by_name
-     * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5O_info_t;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name
-    (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oget_info_by_idx
-     * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5O_info_t;
-     */
-    JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx
-    (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Olink
-     * Signature: (JJLjava/lang/String;JJ)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Olink
-      (JNIEnv*, jclass, jlong, jlong, jstring, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Ovisit
-     * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Ovisit
-      (JNIEnv*, jclass, jlong, jint, jint, jobject, jobject);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Ovisit_by_name
-     * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
-     */
-    JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jint, jint, jobject, jobject, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oset_comment
-     * Signature: (JLjava/lang/String;)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Oset_1comment
-      (JNIEnv*, jclass, jlong, jstring);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oset_comment_by_name
-     * Signature: (JLjava/lang/String;Ljava/lang/String;J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oget_comment
-     * Signature: (J)Ljava/lang/String;
-     */
-    JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Oget_1comment
-      (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oget_comment_by_name
-     * Signature: (JLjava/lang/String;J)Ljava/lang/String;
-     */
-    JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oexists_by_name
-     * Signature: (JLjava/lang/String;J)Z
-     */
-    JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Oexists_1by_1name
-      (JNIEnv*, jclass, jlong, jstring, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Odecr_refcount
-     * Signature: (J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Odecr_1refcount
-      (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oincr_refcount
-     * Signature: (J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Oincr_1refcount
-      (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    _H5Oopen_by_addr
-     * Signature: (JJ)J;
-     */
-    JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr
-      (JNIEnv*, jclass, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    _H5Oopen_by_idx
-     * Signature: (JLjava/lang/String;IIJJ)J;
-     */
-    JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx
-      (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Oflush
-     * Signature: (J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Oflush
-      (JNIEnv*, jclass, jlong);
-
-    /*
-     * Class:     hdf_hdf5lib_H5
-     * Method:    H5Orefresh
-     * Signature: (J)V
-     */
-    JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Orefresh
-      (JNIEnv*, jclass, jlong);
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    _H5Oopen
+ * Signature: (JLjava/lang/String;J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Oopen
+  (JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    _H5Oclose
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Oclose
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Ocopy
+ * Signature: (JLjava/lang/String;JLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Ocopy
+  (JNIEnv*, jclass, jlong, jstring, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oget_info
+ * Signature: (J)Lhdf/hdf5lib/structs/H5O_info_t;
+ */
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Oget_1info
+(JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oget_info_by_name
+ * Signature: (JLjava/lang/String;J)Lhdf/hdf5lib/structs/H5O_info_t;
+ */
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1name
+(JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oget_info_by_idx
+ * Signature: (JLjava/lang/String;IIJJ)Lhdf/hdf5lib/structs/H5O_info_t;
+ */
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Oget_1info_1by_1idx
+(JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Olink
+ * Signature: (JJLjava/lang/String;JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Olink
+  (JNIEnv*, jclass, jlong, jlong, jstring, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Ovisit
+ * Signature: (JIILjava/lang/Object;Ljava/lang/Object;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Ovisit
+  (JNIEnv*, jclass, jlong, jint, jint, jobject, jobject);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Ovisit_by_name
+ * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Ovisit_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jint, jint, jobject, jobject, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oset_comment
+ * Signature: (JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Oset_1comment
+  (JNIEnv*, jclass, jlong, jstring);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oset_comment_by_name
+ * Signature: (JLjava/lang/String;Ljava/lang/String;J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Oset_1comment_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oget_comment
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Oget_1comment
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oget_comment_by_name
+ * Signature: (JLjava/lang/String;J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Oget_1comment_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oexists_by_name
+ * Signature: (JLjava/lang/String;J)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Oexists_1by_1name
+  (JNIEnv*, jclass, jlong, jstring, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Odecr_refcount
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Odecr_1refcount
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oincr_refcount
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Oincr_1refcount
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    _H5Oopen_by_addr
+ * Signature: (JJ)J;
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr
+  (JNIEnv*, jclass, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    _H5Oopen_by_idx
+ * Signature: (JLjava/lang/String;IIJJ)J;
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Oopen_1by_1idx
+  (JNIEnv*, jclass, jlong, jstring, jint, jint, jlong, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Oflush
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Oflush
+  (JNIEnv*, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Orefresh
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Orefresh
+  (JNIEnv*, jclass, jlong);
 
 #ifdef __cplusplus
 } /* end extern "C" */
diff --git a/java/src/jni/h5pImp.c b/java/src/jni/h5pImp.c
index 5181672..df8b3c9 100644
--- a/java/src/jni/h5pImp.c
+++ b/java/src/jni/h5pImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -62,7 +60,8 @@ static herr_t H5P_iterate_cb(hid_t prop_id, const char *name, void *op_data);
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Pcreate(JNIEnv *env, jclass clss, jlong type)
+Java_hdf_hdf5lib_H5__1H5Pcreate
+    (JNIEnv *env, jclass clss, jlong type)
 {
     hid_t retVal = -1;
 
@@ -79,7 +78,8 @@ Java_hdf_hdf5lib_H5__1H5Pcreate(JNIEnv *env, jclass clss, jlong type)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Pclose(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5__1H5Pclose
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     herr_t retVal = 0;
 
@@ -98,11 +98,12 @@ Java_hdf_hdf5lib_H5__1H5Pclose(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1class(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1class
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     hid_t retVal = -1;
 
-    retVal = retVal = H5Pget_class((hid_t) plist);
+    retVal = H5Pget_class((hid_t) plist);
     if (retVal == H5P_ROOT)
         h5libraryError(env);
 
@@ -115,7 +116,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1class(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Pcopy(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5__1H5Pcopy
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     hid_t retVal = -1;
 
@@ -132,7 +134,8 @@ Java_hdf_hdf5lib_H5__1H5Pcopy(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1version(JNIEnv *env, jclass clss, jlong plist, jintArray version_info)
+Java_hdf_hdf5lib_H5_H5Pget_1version
+    (JNIEnv *env, jclass clss, jlong plist, jintArray version_info)
 {
     herr_t   status = -1;
     jint    *theArray;
@@ -170,7 +173,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1version(JNIEnv *env, jclass clss, jlong plist, jintA
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1userblock(JNIEnv *env, jclass clss, jlong plist, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1userblock
+    (JNIEnv *env, jclass clss, jlong plist, jlong size)
 {
     herr_t retVal = -1;
     long sz = (long)size;
@@ -188,7 +192,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1userblock(JNIEnv *env, jclass clss, jlong plist, jlo
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1userblock(JNIEnv *env, jclass clss, jlong plist, jlongArray size)
+Java_hdf_hdf5lib_H5_H5Pget_1userblock
+    (JNIEnv *env, jclass clss, jlong plist, jlongArray size)
 {
     herr_t   status = -1;
     jlong   *theArray;
@@ -226,7 +231,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1userblock(JNIEnv *env, jclass clss, jlong plist, jlo
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1sizes(JNIEnv *env, jclass clss, jlong plist, jint sizeof_addr, jint sizeof_size)
+Java_hdf_hdf5lib_H5_H5Pset_1sizes
+    (JNIEnv *env, jclass clss, jlong plist, jint sizeof_addr, jint sizeof_size)
 {
     herr_t retVal = -1;
 
@@ -243,7 +249,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1sizes(JNIEnv *env, jclass clss, jlong plist, jint si
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1sizes(JNIEnv *env, jclass clss, jlong plist, jlongArray size)
+Java_hdf_hdf5lib_H5_H5Pget_1sizes
+    (JNIEnv *env, jclass clss, jlong plist, jlongArray size)
 {
     herr_t   status = -1;
     jlong   *theArray;
@@ -285,7 +292,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1sizes(JNIEnv *env, jclass clss, jlong plist, jlongAr
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1sym_1k(JNIEnv *env, jclass clss, jlong plist, jint ik, jint lk)
+Java_hdf_hdf5lib_H5_H5Pset_1sym_1k
+    (JNIEnv *env, jclass clss, jlong plist, jint ik, jint lk)
 {
     herr_t retVal = -1;
 
@@ -302,7 +310,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1sym_1k(JNIEnv *env, jclass clss, jlong plist, jint i
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1sym_1k(JNIEnv *env, jclass clss, jlong plist, jintArray size)
+Java_hdf_hdf5lib_H5_H5Pget_1sym_1k
+    (JNIEnv *env, jclass clss, jlong plist, jintArray size)
 {
     herr_t   status = -1;
     jint    *theArray;
@@ -339,7 +348,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1sym_1k(JNIEnv *env, jclass clss, jlong plist, jintAr
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1istore_1k(JNIEnv *env, jclass clss, jlong plist, jint ik)
+Java_hdf_hdf5lib_H5_H5Pset_1istore_1k
+    (JNIEnv *env, jclass clss, jlong plist, jint ik)
 {
     herr_t retVal = -1;
 
@@ -356,7 +366,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1istore_1k(JNIEnv *env, jclass clss, jlong plist, jin
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1istore_1k(JNIEnv *env, jclass clss, jlong plist, jintArray ik)
+Java_hdf_hdf5lib_H5_H5Pget_1istore_1k
+    (JNIEnv *env, jclass clss, jlong plist, jintArray ik)
 {
     herr_t   status = -1;
     jint    *theArray;
@@ -390,7 +401,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1istore_1k(JNIEnv *env, jclass clss, jlong plist, jin
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1layout(JNIEnv *env, jclass clss, jlong plist, jint layout)
+Java_hdf_hdf5lib_H5_H5Pset_1layout
+    (JNIEnv *env, jclass clss, jlong plist, jint layout)
 {
     herr_t retVal = -1;
 
@@ -407,7 +419,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1layout(JNIEnv *env, jclass clss, jlong plist, jint l
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1layout(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1layout
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     H5D_layout_t retVal = H5D_LAYOUT_ERROR;
 
@@ -424,7 +437,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1layout(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JI[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1chunk(JNIEnv *env, jclass clss, jlong plist, jint ndims, jbyteArray dim)
+Java_hdf_hdf5lib_H5_H5Pset_1chunk
+    (JNIEnv *env, jclass clss, jlong plist, jint ndims, jbyteArray dim)
 {
     herr_t   status = -1;
     jbyte   *theArray;
@@ -484,7 +498,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1chunk(JNIEnv *env, jclass clss, jlong plist, jint nd
  * Signature: (JI[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1chunk(JNIEnv *env, jclass clss, jlong plist, jint max_ndims, jlongArray dims)
+Java_hdf_hdf5lib_H5_H5Pget_1chunk
+    (JNIEnv *env, jclass clss, jlong plist, jint max_ndims, jlongArray dims)
 {
     herr_t   status = -1;
     jlong   *theArray;
@@ -537,7 +552,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1chunk(JNIEnv *env, jclass clss, jlong plist, jint ma
  * Signature: (JJJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1alignment(JNIEnv *env, jclass clss, jlong plist, jlong threshold, jlong alignment)
+Java_hdf_hdf5lib_H5_H5Pset_1alignment
+    (JNIEnv *env, jclass clss, jlong plist, jlong threshold, jlong alignment)
 {
     herr_t retVal = -1;
     long thr = (long)threshold;
@@ -556,7 +572,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1alignment(JNIEnv *env, jclass clss, jlong plist, jlo
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1alignment(JNIEnv *env, jclass clss, jlong plist, jlongArray alignment)
+Java_hdf_hdf5lib_H5_H5Pget_1alignment
+    (JNIEnv *env, jclass clss, jlong plist, jlongArray alignment)
 {
     herr_t   status = -1;
     jlong   *theArray;
@@ -600,7 +617,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1alignment(JNIEnv *env, jclass clss, jlong plist, jlo
  * Signature: (JLjava/lang/String;JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1external(JNIEnv *env, jclass clss, jlong plist, jstring name, jlong offset, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1external
+    (JNIEnv *env, jclass clss, jlong plist, jstring name, jlong offset, jlong size)
 {
     herr_t      status = -1;
     const char *fileName;
@@ -612,14 +630,15 @@ Java_hdf_hdf5lib_H5_H5Pset_1external(JNIEnv *env, jclass clss, jlong plist, jstr
     off = (off_t)offset;
     sz = (hsize_t)size;
 
-    PIN_JAVA_STRING(name, fileName, -1);
+    PIN_JAVA_STRING(name, fileName);
+    if (fileName != NULL) {
+        status = H5Pset_external(plid, fileName, off, sz);
 
-    status = H5Pset_external(plid, fileName, off, sz);
+        UNPIN_JAVA_STRING(name, fileName);
 
-    UNPIN_JAVA_STRING(name, fileName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1external */
@@ -630,7 +649,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1external(JNIEnv *env, jclass clss, jlong plist, jstr
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1external_1count(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1external_1count
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     int retVal = -1;
 
@@ -647,72 +667,64 @@ Java_hdf_hdf5lib_H5_H5Pget_1external_1count(JNIEnv *env, jclass clss, jlong plis
  * Signature: (JIJ[Ljava/lang/String;[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1external(JNIEnv *env, jclass clss, jlong plist, jint idx, jlong name_size,
+Java_hdf_hdf5lib_H5_H5Pget_1external
+    (JNIEnv *env, jclass clss, jlong plist, jint idx, jlong name_size,
         jobjectArray name, jlongArray size)
 {
     herr_t   status = -1;
     jlong   *theArray;
     jboolean isCopy;
-    char    *file;
+    char    *file = NULL;
     jstring  str;
     off_t    o;
     hsize_t  s;
 
     if (name_size < 0) {
         h5badArgument(env, "H5Pget_external:  name_size < 0");
-        return -1;
     } /* end if */
-    else if (name_size == 0) {
-        file = NULL;
+    else if ((size != NULL) && (ENVPTR->GetArrayLength(ENVPAR size) < 2)) {
+        h5badArgument(env, "H5Pget_external:  size input array < 2");
     } /* end else if */
     else {
-        file = (char *)HDmalloc(sizeof(char)*(size_t)name_size);
-    } /* end else */
+        if (name_size > 0) {
+            file = (char *)HDmalloc(sizeof(char)*(size_t)name_size);
+        } /* end else */
 
-    if (size != NULL) {
-        if (ENVPTR->GetArrayLength(ENVPAR size) < 2) {
-            HDfree(file);
-            h5badArgument(env, "H5Pget_external:  size input array < 2");
-            return -1;
-        } /* end if */
-        theArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR size, &isCopy);
-        if (theArray == NULL) {
+        status = H5Pget_external((hid_t) plist, (unsigned)idx, (size_t)name_size,
+                file, (off_t *)&o, (hsize_t *)&s);
+        if (status < 0) {
             HDfree(file);
-            h5JNIFatalError( env, "H5Pget_external:  size array not pinned");
-            return -1;
-        } /* end if */
-    } /* end if */
-
-    status = H5Pget_external((hid_t) plist, (unsigned)idx, (size_t)name_size,
-            file, (off_t *)&o, (hsize_t *)&s);
-    if (status < 0) {
-        if (size != NULL) {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR size, theArray, JNI_ABORT);
-        } /* end if */
-        HDfree(file);
-        h5libraryError(env);
-    } /* end if */
-    else {
-        if (size != NULL) {
-            theArray[0] = o;
-            theArray[1] = (jlong)s;
-            ENVPTR->ReleaseLongArrayElements(ENVPAR size, theArray, 0);
+            h5libraryError(env);
         } /* end if */
+        else {
+            if (size != NULL) {
+                theArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR size, &isCopy);
+                if (theArray == NULL) {
+                    h5JNIFatalError( env, "H5Pget_external:  size array not pinned");
+                } /* end if */
+                else {
+                    theArray[0] = o;
+                    theArray[1] = (jlong)s;
+                    ENVPTR->ReleaseLongArrayElements(ENVPAR size, theArray, 0);
+                }
+            } /* end if */
 
-        if (file != NULL) {
-            /*  NewStringUTF may throw OutOfMemoryError */
-            str = ENVPTR->NewStringUTF(ENVPAR file);
-            if (str == NULL) {
-                HDfree(file);
-                h5JNIFatalError(env, "H5Pget_external:  return array not created");
+            if (file != NULL) {
+                /*  NewStringUTF may throw OutOfMemoryError */
+                str = ENVPTR->NewStringUTF(ENVPAR file);
+                if (str == NULL) {
+                    HDfree(file);
+                    h5JNIFatalError(env, "H5Pget_external:  return array not created");
+                } /* end if */
+                else {
+                    /*  SetObjectArrayElement may raise exceptions */
+                    ENVPTR->SetObjectArrayElement(ENVPAR name, 0, (jobject)str);
+                    HDfree(file);
+                } /* end else */
             } /* end if */
-            else {
-                /*  SetObjectArrayElement may raise exceptions */
-                ENVPTR->SetObjectArrayElement(ENVPAR name, 0, (jobject)str);
-                HDfree(file);
-            } /* end else */
-        } /* end if */
-    } /* end else */
+        } /* end else */
+    }
+
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Pget_1external */
 
@@ -722,29 +734,32 @@ Java_hdf_hdf5lib_H5_H5Pget_1external(JNIEnv *env, jclass clss, jlong plist, jint
  * Signature: (JJ[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fill_1value(JNIEnv *env, jclass clss, jlong plist_id, jlong type_id, jbyteArray value)
+Java_hdf_hdf5lib_H5_H5Pset_1fill_1value
+    (JNIEnv *env, jclass clss, jlong plist_id, jlong type_id, jbyteArray value)
 {
     jint     status = -1;
-    jbyte   *byteP;
+    jbyte   *byteP = NULL;
     jboolean isCopy;
 
     if (value != NULL) {
         byteP = ENVPTR->GetByteArrayElements(ENVPAR value, &isCopy);
         if (byteP == NULL) {
             h5JNIFatalError(env, "H5Pget_fill_value:  value array not pinned");
-            return -1;
         } /* end if */
-    } /* end if */
-
-    status = H5Pset_fill_value((hid_t)plist_id, (hid_t)type_id, byteP);
+        else {
+            status = H5Pset_fill_value((hid_t)plist_id, (hid_t)type_id, byteP);
 
-    if (value != NULL)
-        ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
+            ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
+        }
+    } /* end if */
+    else {
+        status = H5Pset_fill_value((hid_t)plist_id, (hid_t)type_id, byteP);
+    }
 
     if (status < 0)
         h5libraryError(env);
 
-    return status;
+    return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1fill_1value */
 
 /*
@@ -753,7 +768,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fill_1value(JNIEnv *env, jclass clss, jlong plist_id
  * Signature: (JJ[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fill_1value(JNIEnv *env, jclass clss, jlong plist_id, jlong type_id, jbyteArray value)
+Java_hdf_hdf5lib_H5_H5Pget_1fill_1value
+    (JNIEnv *env, jclass clss, jlong plist_id, jlong type_id, jbyteArray value)
 {
     jint     status = -1;
     jbyte   *byteP;
@@ -778,7 +794,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1fill_1value(JNIEnv *env, jclass clss, jlong plist_id
         } /* end else */
     } /* end else */
 
-    return status;
+    return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Pget_1fill_1value */
 
 /*
@@ -787,7 +803,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fill_1value(JNIEnv *env, jclass clss, jlong plist_id
  * Signature: (JIIJ[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1filter(JNIEnv *env, jclass clss, jlong plist, jint filter, jint flags,
+Java_hdf_hdf5lib_H5_H5Pset_1filter
+    (JNIEnv *env, jclass clss, jlong plist, jint filter, jint flags,
   jlong cd_nelmts, jintArray cd_values)
 {
     herr_t   status = -1;
@@ -823,7 +840,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1filter(JNIEnv *env, jclass clss, jlong plist, jint f
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1nfilters(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1nfilters
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     int retVal = -1;
 
@@ -840,13 +858,15 @@ Java_hdf_hdf5lib_H5_H5Pget_1nfilters(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JI[I[J[IJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1filter(JNIEnv *env, jclass clss, jlong plist, jint filter_number, jintArray flags,
+Java_hdf_hdf5lib_H5_H5Pget_1filter
+    (JNIEnv *env, jclass clss, jlong plist, jint filter_number, jintArray flags,
         jlongArray cd_nelmts, jintArray cd_values, jlong namelen, jobjectArray name)
 {
     herr_t   status = -1;
     jint    *flagsArray;
     jlong   *cd_nelmtsArray;
     jint    *cd_valuesArray;
+    jint     mode = JNI_ABORT;
     jboolean isCopy;
     jstring  str;
     char    *filter;
@@ -866,65 +886,59 @@ Java_hdf_hdf5lib_H5_H5Pget_1filter(JNIEnv *env, jclass clss, jlong plist, jint f
     else {
         filter = (char *)HDmalloc(sizeof(char)*(size_t)namelen);
         if (filter == NULL) {
-            h5outOfMemory(env, "H5Pget_filter:  namelent malloc failed");
-            return -1;
-        } /* end if */
-        flagsArray = (jint *)ENVPTR->GetIntArrayElements(ENVPAR flags, &isCopy);
-        if (flagsArray == NULL) {
-            HDfree(filter);
-            h5JNIFatalError(env, "H5Pget_filter:  flags array not pinned");
-            return -1;
-        } /* end if */
-        cd_nelmtsArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR cd_nelmts, &isCopy);
-        if (cd_nelmtsArray == NULL) {
-            ENVPTR->ReleaseIntArrayElements(ENVPAR flags, flagsArray, JNI_ABORT);
-            HDfree(filter);
-            h5JNIFatalError(env, "H5Pget_filter:  nelmts array not pinned");
-            return -1;
-        } /* end if */
-        cd_valuesArray = (jint *)ENVPTR->GetIntArrayElements(ENVPAR cd_values, &isCopy);
-        if (cd_valuesArray == NULL)  {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR cd_nelmts, cd_nelmtsArray, JNI_ABORT);
-            ENVPTR->ReleaseIntArrayElements(ENVPAR flags, flagsArray, JNI_ABORT);
-            HDfree(filter);
-            h5JNIFatalError(env, "H5Pget_filter:  elmts array not pinned");
-            return -1;
-        } /* end if */
-
-        { /* direct cast (size_t *)variable fails on 32-bit environment */
-            long long cd_nelmts_temp = *(cd_nelmtsArray);
-            size_t cd_nelmts_t = (size_t)cd_nelmts_temp;
-            unsigned int filter_config;
-            status = H5Pget_filter2((hid_t)plist, (unsigned)filter_number,
-                (unsigned int *)flagsArray, &cd_nelmts_t, (unsigned int *)cd_valuesArray,
-                (size_t)namelen, filter, &filter_config);
-
-            *cd_nelmtsArray = (jlong)cd_nelmts_t;
-        } /* end direct cast special */
-
-        if (status < 0) {
-            ENVPTR->ReleaseIntArrayElements(ENVPAR cd_values, cd_valuesArray, JNI_ABORT);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR cd_nelmts, cd_nelmtsArray, JNI_ABORT);
-            ENVPTR->ReleaseIntArrayElements(ENVPAR flags, flagsArray, JNI_ABORT);
-            HDfree(filter);
-            h5libraryError(env);
+            h5outOfMemory(env, "H5Pget_filter:  namelen malloc failed");
         } /* end if */
         else {
-            ENVPTR->ReleaseIntArrayElements(ENVPAR cd_values, cd_valuesArray, 0);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR cd_nelmts, cd_nelmtsArray, 0);
-            ENVPTR->ReleaseIntArrayElements(ENVPAR flags, flagsArray, 0);
-
-            /*  NewStringUTF may throw OutOfMemoryError */
-            str = ENVPTR->NewStringUTF(ENVPAR filter);
-            HDfree(filter);
-            if (str == NULL) {
-                h5JNIFatalError(env, "H5Pget_filter:  return string not pinned");
+            flagsArray = (jint *)ENVPTR->GetIntArrayElements(ENVPAR flags, &isCopy);
+            if (flagsArray == NULL) {
+                h5JNIFatalError(env, "H5Pget_filter:  flags array not pinned");
             } /* end if */
             else {
-                /*  SetObjectArrayElement may throw exceptiosn */
-                ENVPTR->SetObjectArrayElement(ENVPAR name, 0, (jobject)str);
-            } /* end else */
-        } /* end else */
+                cd_nelmtsArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR cd_nelmts, &isCopy);
+                if (cd_nelmtsArray == NULL) {
+                    h5JNIFatalError(env, "H5Pget_filter:  nelmts array not pinned");
+                } /* end if */
+                else {
+                    cd_valuesArray = (jint *)ENVPTR->GetIntArrayElements(ENVPAR cd_values, &isCopy);
+                    if (cd_valuesArray == NULL)  {
+                        h5JNIFatalError(env, "H5Pget_filter:  elmts array not pinned");
+                    } /* end if */
+                    else {
+                        /* direct cast (size_t *)variable fails on 32-bit environment */
+                        long long cd_nelmts_temp = *(cd_nelmtsArray);
+                        size_t cd_nelmts_t = (size_t)cd_nelmts_temp;
+                        unsigned int filter_config;
+                        status = H5Pget_filter2((hid_t)plist, (unsigned)filter_number,
+                                (unsigned int *)flagsArray, &cd_nelmts_t, (unsigned int *)cd_valuesArray,
+                                (size_t)namelen, filter, &filter_config);
+
+                        *cd_nelmtsArray = (jlong)cd_nelmts_t;
+                        /* end direct cast special */
+
+                        if (status < 0) {
+                            h5libraryError(env);
+                        } /* end if */
+                        else {
+                            mode = 0;
+
+                            /*  NewStringUTF may throw OutOfMemoryError */
+                            str = ENVPTR->NewStringUTF(ENVPAR filter);
+                            if (str == NULL) {
+                                h5JNIFatalError(env, "H5Pget_filter:  return string not pinned");
+                            } /* end if */
+                            else {
+                                /*  SetObjectArrayElement may throw exceptiosn */
+                                ENVPTR->SetObjectArrayElement(ENVPAR name, 0, (jobject)str);
+                            } /* end else */
+                        } /* end else */
+                        ENVPTR->ReleaseIntArrayElements(ENVPAR cd_values, cd_valuesArray, mode);
+                    }
+                    ENVPTR->ReleaseLongArrayElements(ENVPAR cd_nelmts, cd_nelmtsArray, mode);
+                }
+                ENVPTR->ReleaseIntArrayElements(ENVPAR flags, flagsArray, mode);
+            }
+            HDfree(filter);
+        }
     } /* end else */
 
     return (jint)status;
@@ -936,7 +950,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1filter(JNIEnv *env, jclass clss, jlong plist, jint f
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1driver(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1driver
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     hid_t retVal = -1;
 
@@ -953,7 +968,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1driver(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JIJJD)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1cache(JNIEnv *env, jclass clss, jlong plist, jint mdc_nelmts, jlong rdcc_nelmts,
+Java_hdf_hdf5lib_H5_H5Pset_1cache
+    (JNIEnv *env, jclass clss, jlong plist, jint mdc_nelmts, jlong rdcc_nelmts,
   jlong rdcc_nbytes, jdouble rdcc_w0)
 {
     herr_t retVal = -1;
@@ -972,20 +988,18 @@ Java_hdf_hdf5lib_H5_H5Pset_1cache(JNIEnv *env, jclass clss, jlong plist, jint md
  * Signature: (J[I[J[J[D)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1cache(JNIEnv *env, jclass clss, jlong plist, jintArray mdc_nelmts,
+Java_hdf_hdf5lib_H5_H5Pget_1cache
+    (JNIEnv *env, jclass clss, jlong plist, jintArray mdc_nelmts,
         jlongArray rdcc_nelmts, jlongArray rdcc_nbytes, jdoubleArray rdcc_w0)
 {
     herr_t   status = -1;
     jint     mode;
-    jdouble *w0Array;
-    jlong   *rdcc_nelmtsArray;
-    jlong   *nbytesArray;
+    jdouble *w0Array = (jdouble *)NULL;
+    jlong   *rdcc_nelmtsArray = (jlong *)NULL;
+    jlong   *nbytesArray = (jlong *)NULL;
     jboolean isCopy;
 
-    if (rdcc_w0 == NULL) {
-        w0Array = (jdouble *)NULL;
-    } /* end if */
-    else {
+    if (rdcc_w0 != NULL) {
         w0Array = (jdouble *)ENVPTR->GetDoubleArrayElements(ENVPAR rdcc_w0, &isCopy);
         if (w0Array == NULL) {
             h5JNIFatalError(env, "H5Pget_cache:  w0_array array not pinned");
@@ -993,10 +1007,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1cache(JNIEnv *env, jclass clss, jlong plist, jintArr
         } /* end if */
     } /* end else */
 
-    if (rdcc_nelmts == NULL) {
-        rdcc_nelmtsArray = (jlong *) NULL;
-    } /* end if */
-    else {
+    if (rdcc_nelmts != NULL) {
         rdcc_nelmtsArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR rdcc_nelmts, &isCopy);
         if (rdcc_nelmtsArray == NULL) {
             /* exception -- out of memory */
@@ -1008,10 +1019,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1cache(JNIEnv *env, jclass clss, jlong plist, jintArr
         } /* end if */
     } /* end else */
 
-    if (rdcc_nbytes == NULL) {
-        nbytesArray = (jlong *) NULL;
-    } /* end if */
-    else {
+    if (rdcc_nbytes != NULL) {
         nbytesArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR rdcc_nbytes, &isCopy);
         if (nbytesArray == NULL) {
             if (w0Array != NULL) {
@@ -1071,7 +1079,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1cache(JNIEnv *env, jclass clss, jlong plist, jintArr
  * Signature: (JJ[B[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1buffer(JNIEnv *env, jclass clss, jlong plist, jlong size, jbyteArray tconv, jbyteArray bkg)
+Java_hdf_hdf5lib_H5_H5Pset_1buffer
+    (JNIEnv *env, jclass clss, jlong plist, jlong size, jbyteArray tconv, jbyteArray bkg)
 {
     h5unimplemented(env, "H5Pset_buffer:  not implemented");
     return -1;
@@ -1117,7 +1126,7 @@ Java_hdf_hdf5lib_H5_H5Pset_1buffer(JNIEnv *env, jclass clss, jlong plist, jlong
     if (bkg != NULL)
         ENVPTR->ReleaseByteArrayElements(ENVPAR bkg, bkgP, 0);
 
-    return status;
+    return (jint)status;
 #endif
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1buffer */
 
@@ -1127,7 +1136,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1buffer(JNIEnv *env, jclass clss, jlong plist, jlong
  * Signature: (J[B[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1buffer(JNIEnv *env, jclass clss, jlong plist, jbyteArray tconv, jbyteArray bkg)
+Java_hdf_hdf5lib_H5_H5Pget_1buffer
+    (JNIEnv *env, jclass clss, jlong plist, jbyteArray tconv, jbyteArray bkg)
 {
     h5unimplemented(env, "H5Pget_buffer:  not implemented");
     return -1;
@@ -1168,7 +1178,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1buffer(JNIEnv *env, jclass clss, jlong plist, jbyteA
     ENVPTR->ReleaseByteArrayElements(ENVPAR tconv, tconvP, 0);
     ENVPTR->ReleaseByteArrayElements(ENVPAR bkg, bkgP, 0);
 
-    return status;
+    return (jint)status;
 #endif
 } /* end Java_hdf_hdf5lib_H5_H5Pget_1buffer */
 
@@ -1178,7 +1188,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1buffer(JNIEnv *env, jclass clss, jlong plist, jbyteA
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size(JNIEnv *env, jclass clss, jlong plist, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlong size)
 {
     if (H5Pset_buffer((hid_t)plist, (size_t)size, NULL, NULL) < 0)
         h5libraryError(env);
@@ -1190,7 +1201,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size(JNIEnv *env, jclass clss, jlong plist,
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     size_t size = 0;
 
@@ -1207,7 +1219,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1preserve(JNIEnv *env, jclass clss, jlong plist, jboolean status)
+Java_hdf_hdf5lib_H5_H5Pset_1preserve
+    (JNIEnv *env, jclass clss, jlong plist, jboolean status)
 {
     hbool_t st;
     herr_t  retVal = -1;
@@ -1236,7 +1249,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1preserve(JNIEnv *env, jclass clss, jlong plist, jboo
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1preserve(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1preserve
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     herr_t retVal = -1;
 
@@ -1253,7 +1267,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1preserve(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1deflate(JNIEnv *env, jclass clss, jlong plist, jint level)
+Java_hdf_hdf5lib_H5_H5Pset_1deflate
+    (JNIEnv *env, jclass clss, jlong plist, jint level)
 {
     herr_t retVal = -1;
 
@@ -1270,7 +1285,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1deflate(JNIEnv *env, jclass clss, jlong plist, jint
  * Signature: (JZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1gc_1references(JNIEnv *env, jclass clss, jlong fapl_id, jboolean gc_ref)
+Java_hdf_hdf5lib_H5_H5Pset_1gc_1references
+    (JNIEnv *env, jclass clss, jlong fapl_id, jboolean gc_ref)
 {
     herr_t   retVal = -1;
     unsigned gc_ref_val;
@@ -1293,7 +1309,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1gc_1references(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1gc_1references(JNIEnv *env, jclass clss, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1gc_1references
+    (JNIEnv *env, jclass clss, jlong fapl_id)
 {
     unsigned  gc_ref_val = 0;
     jboolean  bval = JNI_FALSE;
@@ -1315,7 +1332,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1gc_1references(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (JDDD)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios(JNIEnv *env, jclass clss, jlong plist_id, jdouble left, jdouble middle, jdouble right)
+Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios
+    (JNIEnv *env, jclass clss, jlong plist_id, jdouble left, jdouble middle, jdouble right)
 {
     herr_t status = -1;
 
@@ -1332,7 +1350,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios(JNIEnv *env, jclass clss, jlong plist_
  * Signature: (J[D[D[D)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios(JNIEnv *env, jclass clss, jlong plist_id, jdoubleArray left,
+Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios
+    (JNIEnv *env, jclass clss, jlong plist_id, jdoubleArray left,
         jdoubleArray middle, jdoubleArray right)
 {
     herr_t   status = -1;
@@ -1396,7 +1415,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios(JNIEnv *env, jclass clss, jlong plist_
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size(JNIEnv *env, jclass clss, jlong plist, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlong size)
 {
     long sz = (long)size;
     herr_t retVal = -1;
@@ -1414,7 +1434,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size(JNIEnv *env, jclass clss, j
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     hsize_t  s;
 
@@ -1430,7 +1451,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size(JNIEnv *env, jclass clss, j
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time(JNIEnv *env, jclass clss, jlong plist, jint alloc_time)
+Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time
+    (JNIEnv *env, jclass clss, jlong plist, jint alloc_time)
 {
     herr_t retVal = -1;
 
@@ -1447,7 +1469,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time(JNIEnv *env, jclass clss, jlong plist, j
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time(JNIEnv *env, jclass clss, jlong plist, jintArray alloc_time)
+Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time
+    (JNIEnv *env, jclass clss, jlong plist, jintArray alloc_time)
 {
     herr_t           retVal = -1;
     jint            *theArray;
@@ -1485,7 +1508,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time(JNIEnv *env, jclass clss, jlong plist, j
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fill_1time(JNIEnv *env, jclass clss, jlong plist, jint fill_time)
+Java_hdf_hdf5lib_H5_H5Pset_1fill_1time
+    (JNIEnv *env, jclass clss, jlong plist, jint fill_time)
 {
     herr_t retVal = -1;
 
@@ -1502,7 +1526,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fill_1time(JNIEnv *env, jclass clss, jlong plist, ji
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fill_1time(JNIEnv *env, jclass clss, jlong plist, jintArray fill_time)
+Java_hdf_hdf5lib_H5_H5Pget_1fill_1time
+    (JNIEnv *env, jclass clss, jlong plist, jintArray fill_time)
 {
     herr_t          retVal = -1;
     jint           *theArray;
@@ -1540,7 +1565,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fill_1time(JNIEnv *env, jclass clss, jlong plist, ji
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined(JNIEnv *env, jclass clss, jlong plist, jintArray status)
+Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined
+    (JNIEnv *env, jclass clss, jlong plist, jintArray status)
 {
     herr_t retVal = -1;
     jint *theArray;
@@ -1578,7 +1604,8 @@ Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined(JNIEnv *env, jclass clss, jlong plis
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fletcher32(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pset_1fletcher32
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     herr_t retVal = -1;
 
@@ -1595,7 +1622,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fletcher32(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1edc_1check(JNIEnv *env, jclass clss, jlong plist, jint check)
+Java_hdf_hdf5lib_H5_H5Pset_1edc_1check
+    (JNIEnv *env, jclass clss, jlong plist, jint check)
 {
     herr_t retVal = -1;
 
@@ -1612,7 +1640,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1edc_1check(JNIEnv *env, jclass clss, jlong plist, ji
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1edc_1check(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1edc_1check
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     H5Z_EDC_t retVal = -1;
 
@@ -1629,7 +1658,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1edc_1check(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1shuffle(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pset_1shuffle
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     herr_t retVal = -1;
 
@@ -1646,7 +1676,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1shuffle(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1szip(JNIEnv *env, jclass clss, jlong plist, jint options_mask, jint pixels_per_block)
+Java_hdf_hdf5lib_H5_H5Pset_1szip
+    (JNIEnv *env, jclass clss, jlong plist, jint options_mask, jint pixels_per_block)
 {
     herr_t retVal = -1;
 
@@ -1663,7 +1694,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1szip(JNIEnv *env, jclass clss, jlong plist, jint opt
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size(JNIEnv *env, jclass clss, jlong plist, jlong vector_size)
+Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlong vector_size)
 {
     herr_t retVal = -1;
 
@@ -1680,7 +1712,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size(JNIEnv *env, jclass clss, jlong
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size(JNIEnv *env, jclass clss, jlong plist, jlongArray vector_size)
+Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlongArray vector_size)
 {
     herr_t   retVal = -1;
     jlong   *theArray;
@@ -1718,7 +1751,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size(JNIEnv *env, jclass clss, jlong
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail(JNIEnv *env, jclass clss, jlong dcpl_id)
+Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail
+    (JNIEnv *env, jclass clss, jlong dcpl_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -1737,7 +1771,8 @@ Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail(JNIEnv *env, jclass clss, jlong dcpl_
  * Signature: (JIIJ[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pmodify_1filter(JNIEnv *env, jclass clss, jlong plist, jint filter,
+Java_hdf_hdf5lib_H5_H5Pmodify_1filter
+    (JNIEnv *env, jclass clss, jlong plist, jint filter,
         jint flags, jlong cd_nelmts, jintArray cd_values)
 {
     herr_t   status = -1;
@@ -1772,7 +1807,8 @@ Java_hdf_hdf5lib_H5_H5Pmodify_1filter(JNIEnv *env, jclass clss, jlong plist, jin
  * Signature: (JI[I[J[IJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id(JNIEnv *env, jclass clss, jlong plist, jint filter,
+Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id
+    (JNIEnv *env, jclass clss, jlong plist, jint filter,
         jintArray flags, jlongArray cd_nelmts, jintArray cd_values, jlong namelen, jobjectArray name)
 {
     jboolean     isCopy;
@@ -1873,7 +1909,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id(JNIEnv *env, jclass clss, jlong plist
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree(JNIEnv *env, jclass clss, jlong plist, jint fc_degree)
+Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree
+    (JNIEnv *env, jclass clss, jlong plist, jint fc_degree)
 {
     herr_t  retVal = -1;
 
@@ -1890,7 +1927,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree(JNIEnv *env, jclass clss, jlong plist
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     H5F_close_degree_t degree;
 
@@ -1913,7 +1951,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree(JNIEnv *env, jclass clss, jlong plist
  * Signature: (JJJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family(JNIEnv *env, jclass clss, jlong plist, jlong memb_size, jlong memb_plist)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family
+    (JNIEnv *env, jclass clss, jlong plist, jlong memb_size, jlong memb_plist)
 {
     long ms = (long)memb_size;
     herr_t retVal = -1;
@@ -1931,11 +1970,13 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family(JNIEnv *env, jclass clss, jlong plist,
  * Signature: (J[J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family(JNIEnv *env, jclass clss, jlong tid, jlongArray memb_size, jlongArray memb_plist)
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family
+    (JNIEnv *env, jclass clss, jlong tid, jlongArray memb_size, jlongArray memb_plist)
 {
     herr_t   status = -1;
     jlong   *sizeArray;
     jlong   *plistArray;
+    jint     mode = JNI_ABORT;
     jboolean isCopy;
     hsize_t *sa;
     size_t   i;
@@ -1951,39 +1992,36 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family(JNIEnv *env, jclass clss, jlong tid, jl
         sizeArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR memb_size, &isCopy);
         if (sizeArray == NULL) {
             h5JNIFatalError(env,  "H5Pget_family:  sizeArray not pinned");
-            return -1;
-        } /* end if */
-        rank = (size_t)ENVPTR->GetArrayLength(ENVPAR  memb_size);
-        sa = (hsize_t *)HDmalloc(rank * sizeof(hsize_t));
-        if (sa == NULL) {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_size, sizeArray, JNI_ABORT);
-            h5JNIFatalError(env,  "H5Screate-simple:  dims not converted to hsize_t");
-            return -1;
-        } /* end if */
-        plistArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR memb_plist, &isCopy);
-        if (plistArray == NULL) {
-            HDfree(sa);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_size, sizeArray, JNI_ABORT);
-            h5JNIFatalError(env,  "H5Pget_family:  plistArray not pinned");
-            return -1;
-        } /* end if */
-
-        status = H5Pget_fapl_family ((hid_t)tid, sa, (hid_t *)plistArray);
-
-        if (status < 0) {
-            HDfree(sa);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_size, sizeArray, JNI_ABORT);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_plist, plistArray, JNI_ABORT);
-            h5libraryError(env);
         } /* end if */
         else {
-            for (i = 0; i < rank; i++) {
-                sizeArray[i] = (jlong)sa[i];
-            } /* end for */
-            HDfree(sa);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_size, sizeArray, 0);
-            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_plist, plistArray, 0);
-        } /* end else */
+            rank = (size_t)ENVPTR->GetArrayLength(ENVPAR  memb_size);
+            sa = (hsize_t *)HDmalloc(rank * sizeof(hsize_t));
+            if (sa == NULL) {
+                h5JNIFatalError(env,  "H5Screate-simple:  dims not converted to hsize_t");
+            } /* end if */
+            else {
+                plistArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR memb_plist, &isCopy);
+                if (plistArray == NULL) {
+                    h5JNIFatalError(env,  "H5Pget_family:  plistArray not pinned");
+                } /* end if */
+                else {
+                    status = H5Pget_fapl_family ((hid_t)tid, sa, (hid_t *)plistArray);
+
+                    if (status < 0) {
+                        h5libraryError(env);
+                    } /* end if */
+                    else {
+                        for (i = 0; i < rank; i++) {
+                            sizeArray[i] = (jlong)sa[i];
+                        } /* end for */
+                        mode = 0;
+                    } /* end else */
+                    ENVPTR->ReleaseLongArrayElements(ENVPAR memb_plist, plistArray, mode);
+                }
+                HDfree(sa);
+            }
+            ENVPTR->ReleaseLongArrayElements(ENVPAR memb_size, sizeArray, mode);
+        }
     } /* end else */
 
     return (jint)status;
@@ -1995,7 +2033,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family(JNIEnv *env, jclass clss, jlong tid, jl
  * Signature: (JJZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core(JNIEnv *env, jclass clss, jlong fapl_id, jlong increment, jboolean backing_store)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core
+    (JNIEnv *env, jclass clss, jlong fapl_id, jlong increment, jboolean backing_store)
 {
     herr_t retVal = -1;
 
@@ -2012,9 +2051,11 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core(JNIEnv *env, jclass clss, jlong fapl_id,
  * Signature: (J[J[Z)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core(JNIEnv *env, jclass clss, jlong fapl_id, jlongArray increment, jbooleanArray backing_store)
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core
+    (JNIEnv *env, jclass clss, jlong fapl_id, jlongArray increment, jbooleanArray backing_store)
 {
     herr_t    status = -1;
+    jint      mode = JNI_ABORT;
     jlong    *incArray;
     jboolean *backArray;
     jboolean  isCopy;
@@ -2029,34 +2070,32 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core(JNIEnv *env, jclass clss, jlong fapl_id,
         incArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR increment, &isCopy);
         if (incArray == NULL) {
             h5JNIFatalError(env,  "H5Pget_fapl_core:  incArray not pinned");
-            return -1;
-        } /* end if */
-
-        backArray = (jboolean *)ENVPTR->GetBooleanArrayElements(ENVPAR backing_store, &isCopy);
-        if (backArray == NULL) {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR increment, incArray, JNI_ABORT);
-            h5JNIFatalError(env, "H5Pget_fapl_core:  backArray not pinned");
-            return -1;
         } /* end if */
+        else {
+            backArray = (jboolean *)ENVPTR->GetBooleanArrayElements(ENVPAR backing_store, &isCopy);
+            if (backArray == NULL) {
+                h5JNIFatalError(env, "H5Pget_fapl_core:  backArray not pinned");
+            } /* end if */
+            else {
+                /* direct cast (size_t *)variable fails on 32-bit environment */
+                long long inc_temp = *(incArray);
+                size_t inc_t = (size_t)inc_temp;
 
-        { /* direct cast (size_t *)variable fails on 32-bit environment */
-            long long inc_temp = *(incArray);
-            size_t inc_t = (size_t)inc_temp;
-
-            status = H5Pget_fapl_core((hid_t)fapl_id, &inc_t, (hbool_t *)backArray);
+                status = H5Pget_fapl_core((hid_t)fapl_id, &inc_t, (hbool_t *)backArray);
 
-            *incArray = (jlong)inc_t;
-        } /* end direct cast special */
+                *incArray = (jlong)inc_t;
+                /* end direct cast special */
 
-        if (status < 0) {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR increment, incArray, JNI_ABORT);
-            ENVPTR->ReleaseBooleanArrayElements(ENVPAR backing_store, backArray, JNI_ABORT);
-            h5libraryError(env);
-        } /* end if */
-        else {
-            ENVPTR->ReleaseLongArrayElements(ENVPAR increment, incArray, 0);
-            ENVPTR->ReleaseBooleanArrayElements(ENVPAR backing_store, backArray, 0);
-        } /* end else */
+                if (status < 0) {
+                    h5libraryError(env);
+                } /* end if */
+                else {
+                    mode = 0;
+                } /* end else */
+                ENVPTR->ReleaseBooleanArrayElements(ENVPAR backing_store, backArray, mode);
+            }
+            ENVPTR->ReleaseLongArrayElements(ENVPAR increment, incArray, mode);
+        }
     } /* end else */
 
     return (jint)status;
@@ -2068,7 +2107,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core(JNIEnv *env, jclass clss, jlong fapl_id,
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1family_1offset(JNIEnv *env, jclass clss, jlong fapl_id, jlong offset)
+Java_hdf_hdf5lib_H5_H5Pset_1family_1offset
+    (JNIEnv *env, jclass clss, jlong fapl_id, jlong offset)
 {
     herr_t retVal = -1;
 
@@ -2085,7 +2125,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1family_1offset(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1family_1offset(JNIEnv *env, jclass clss, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1family_1offset
+    (JNIEnv *env, jclass clss, jlong fapl_id)
 {
     hsize_t offset = 0;
     herr_t  retVal = -1;
@@ -2103,19 +2144,21 @@ Java_hdf_hdf5lib_H5_H5Pget_1family_1offset(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (JLjava/lang/String;JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log(JNIEnv *env, jclass clss, jlong fapl_id, jstring logfile, jlong flags, jlong buf_size)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log
+    (JNIEnv *env, jclass clss, jlong fapl_id, jstring logfile, jlong flags, jlong buf_size)
 {
     herr_t      retVal = -1;
     const char *pLogfile;
 
-    PIN_JAVA_STRING0(logfile, pLogfile);
-
-    retVal = H5Pset_fapl_log( (hid_t)fapl_id, pLogfile, (unsigned long long)flags, (size_t)buf_size );
+    PIN_JAVA_STRING(logfile, pLogfile);
+    if (pLogfile != NULL) {
+        retVal = H5Pset_fapl_log( (hid_t)fapl_id, pLogfile, (unsigned long long)flags, (size_t)buf_size );
 
-    UNPIN_JAVA_STRING(logfile, pLogfile);
+        UNPIN_JAVA_STRING(logfile, pLogfile);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log */
 
 /*
@@ -2124,7 +2167,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log(JNIEnv *env, jclass clss, jlong fapl_id, j
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5P1remove_1filter(JNIEnv *env, jclass clss, jlong obj_id, jint filter)
+Java_hdf_hdf5lib_H5_H5P1remove_1filter
+    (JNIEnv *env, jclass clss, jlong obj_id, jint filter)
 {
     herr_t status = -1;
 
@@ -2132,7 +2176,7 @@ Java_hdf_hdf5lib_H5_H5P1remove_1filter(JNIEnv *env, jclass clss, jlong obj_id, j
     if (status < 0)
         h5libraryError(env);
 
-    return status;
+    return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5P1remove_1filter */
 
 
@@ -2142,19 +2186,21 @@ Java_hdf_hdf5lib_H5_H5P1remove_1filter(JNIEnv *env, jclass clss, jlong obj_id, j
  * Signature: (JLjava/lang/String;I)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pset(JNIEnv *env, jclass clss, jlong plid, jstring name, jint val)
+Java_hdf_hdf5lib_H5_H5Pset
+    (JNIEnv *env, jclass clss, jlong plid, jstring name, jint val)
 {
     hid_t       retVal = -1;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    retVal =  H5Pset((hid_t)plid, cstr, &val);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal =  H5Pset((hid_t)plid, cstr, &val);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Pset */
@@ -2165,21 +2211,23 @@ Java_hdf_hdf5lib_H5_H5Pset(JNIEnv *env, jclass clss, jlong plid, jstring name, j
  * Signature: (JLjava/lang/String;)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pexist(JNIEnv *env, jclass clss, jlong plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Pexist
+    (JNIEnv *env, jclass clss, jlong plid, jstring name)
 {
     htri_t bval = JNI_FALSE;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    bval = H5Pexist((hid_t)plid, cstr);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        bval = H5Pexist((hid_t)plid, cstr);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (bval > 0)
-        bval = JNI_TRUE;
-    else if (bval < 0)
-        h5libraryError(env);
+        if (bval > 0)
+            bval = JNI_TRUE;
+        else if (bval < 0)
+            h5libraryError(env);
+    }
 
     return (jboolean)bval;
 } /* end Java_hdf_hdf5lib_H5_H5Pexist */
@@ -2190,20 +2238,22 @@ Java_hdf_hdf5lib_H5_H5Pexist(JNIEnv *env, jclass clss, jlong plid, jstring name)
  * Signature: (JLjava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1size(JNIEnv *env, jclass clss, jlong plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Pget_1size
+    (JNIEnv *env, jclass clss, jlong plid, jstring name)
 {
     hid_t       retVal = -1;
     const char *cstr;
-    size_t      size;
-
-    PIN_JAVA_STRING(name, cstr, -1);
+    size_t      size = 0;
 
-    retVal = H5Pget_size((hid_t)plid, cstr, &size);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal = H5Pget_size((hid_t)plid, cstr, &size);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jlong) size;
 } /* end Java_hdf_hdf5lib_H5_H5Pget_1size */
@@ -2214,7 +2264,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1size(JNIEnv *env, jclass clss, jlong plid, jstring n
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1nprops(JNIEnv *env, jclass clss, jlong plid)
+Java_hdf_hdf5lib_H5_H5Pget_1nprops
+    (JNIEnv *env, jclass clss, jlong plid)
 {
     size_t nprops;
 
@@ -2230,10 +2281,11 @@ Java_hdf_hdf5lib_H5_H5Pget_1nprops(JNIEnv *env, jclass clss, jlong plid)
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1class_1name(JNIEnv *env, jclass clss, jlong plid)
+Java_hdf_hdf5lib_H5_H5Pget_1class_1name
+    (JNIEnv *env, jclass clss, jlong plid)
 {
     char   *c_str;
-    jstring j_str;
+    jstring j_str = NULL;
 
     c_str = H5Pget_class_name((hid_t)plid);
     if (c_str == NULL) {
@@ -2255,7 +2307,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1class_1name(JNIEnv *env, jclass clss, jlong plid)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1class_1parent(JNIEnv *env, jclass clss, jlong plid)
+Java_hdf_hdf5lib_H5_H5Pget_1class_1parent
+    (JNIEnv *env, jclass clss, jlong plid)
 {
     hid_t retVal = -1;
 
@@ -2272,7 +2325,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1class_1parent(JNIEnv *env, jclass clss, jlong plid)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pisa_1class(JNIEnv *env, jclass clss, jlong plid, jlong pcls)
+Java_hdf_hdf5lib_H5_H5Pisa_1class
+    (JNIEnv *env, jclass clss, jlong plid, jlong pcls)
 {
     htri_t retVal = -1;
 
@@ -2289,20 +2343,22 @@ Java_hdf_hdf5lib_H5_H5Pisa_1class(JNIEnv *env, jclass clss, jlong plid, jlong pc
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget(JNIEnv *env, jclass clss, jlong plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Pget
+    (JNIEnv *env, jclass clss, jlong plid, jstring name)
 {
     herr_t      retVal = -1;
     const char *cstr;
     jint        val;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    retVal = H5Pget((hid_t)plid, cstr, &val);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal = H5Pget((hid_t)plid, cstr, &val);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)val;
 } /* end Java_hdf_hdf5lib_H5_H5Pget */
@@ -2313,7 +2369,8 @@ Java_hdf_hdf5lib_H5_H5Pget(JNIEnv *env, jclass clss, jlong plid, jstring name)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pequal(JNIEnv *env, jclass clss, jlong plid1, jlong plid2)
+Java_hdf_hdf5lib_H5_H5Pequal
+    (JNIEnv *env, jclass clss, jlong plid1, jlong plid2)
 {
     htri_t retVal = -1;
 
@@ -2330,19 +2387,21 @@ Java_hdf_hdf5lib_H5_H5Pequal(JNIEnv *env, jclass clss, jlong plid1, jlong plid2)
  * Signature: (JJLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pcopy_1prop(JNIEnv *env, jclass clss, jlong dst_plid, jlong src_plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Pcopy_1prop
+    (JNIEnv *env, jclass clss, jlong dst_plid, jlong src_plid, jstring name)
 {
     herr_t      retVal = -1;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    retVal = H5Pcopy_prop((hid_t)dst_plid, (hid_t)src_plid, cstr);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal = H5Pcopy_prop((hid_t)dst_plid, (hid_t)src_plid, cstr);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Pcopy_1prop */
@@ -2353,19 +2412,21 @@ Java_hdf_hdf5lib_H5_H5Pcopy_1prop(JNIEnv *env, jclass clss, jlong dst_plid, jlon
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Premove(JNIEnv *env, jclass clss, jlong plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Premove
+    (JNIEnv *env, jclass clss, jlong plid, jstring name)
 {
     herr_t      retVal = -1;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    retVal = H5Premove((hid_t)plid, cstr);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal = H5Premove((hid_t)plid, cstr);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Premove */
@@ -2376,19 +2437,21 @@ Java_hdf_hdf5lib_H5_H5Premove(JNIEnv *env, jclass clss, jlong plid, jstring name
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Punregister(JNIEnv *env, jclass clss, jlong plid, jstring name)
+Java_hdf_hdf5lib_H5_H5Punregister
+    (JNIEnv *env, jclass clss, jlong plid, jstring name)
 {
     herr_t      retVal = -1;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        retVal = H5Punregister((hid_t)plid, cstr);
 
-    retVal = H5Punregister((hid_t)plid, cstr);
-
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Punregister */
@@ -2399,7 +2462,8 @@ Java_hdf_hdf5lib_H5_H5Punregister(JNIEnv *env, jclass clss, jlong plid, jstring
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Pclose_1class(JNIEnv *env, jclass clss, jlong plid)
+Java_hdf_hdf5lib_H5__1H5Pclose_1class
+    (JNIEnv *env, jclass clss, jlong plid)
 {
     herr_t  retVal = -1;
 
@@ -2408,7 +2472,7 @@ Java_hdf_hdf5lib_H5__1H5Pclose_1class(JNIEnv *env, jclass clss, jlong plid)
         h5libraryError(env);
 
     return (jint)retVal;
-} /* end Java_hdf_hdf5lib_H5_H5Pget_1filter2 */
+} /* end Java_hdf_hdf5lib_H5__1H5Pclose_1class */
 
 /*
  * Class:     hdf_hdf5lib_H5
@@ -2416,7 +2480,8 @@ Java_hdf_hdf5lib_H5__1H5Pclose_1class(JNIEnv *env, jclass clss, jlong plid)
  * Signature: (JI[I[J[IJ[Ljava/lang/String;[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1filter2(JNIEnv *env, jclass clss, jlong plist, jint filter_number,
+Java_hdf_hdf5lib_H5_H5Pget_1filter2
+    (JNIEnv *env, jclass clss, jlong plist, jint filter_number,
         jintArray flags, jlongArray cd_nelmts, jintArray cd_values, jlong namelen,
         jobjectArray name, jintArray filter_config)
 {
@@ -2542,7 +2607,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1filter2(JNIEnv *env, jclass clss, jlong plist, jint
  * Signature: (JI[I[J[IJ[Ljava/lang/String;[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2(JNIEnv *env, jclass clss, jlong plist, jint filter,
+Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2
+    (JNIEnv *env, jclass clss, jlong plist, jint filter,
         jintArray flags, jlongArray cd_nelmts, jintArray cd_values, jlong namelen, jobjectArray name, jintArray filter_config)
 {
     herr_t   status = -1;
@@ -2650,7 +2716,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2(JNIEnv *env, jclass clss, jlong plis
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1nlinks(JNIEnv *env, jclass clss, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1nlinks
+    (JNIEnv *env, jclass clss, jlong lapl_id)
 {
     size_t nlinks;
     if (H5Pget_nlinks((hid_t)lapl_id, &nlinks) < 0)
@@ -2665,7 +2732,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1nlinks(JNIEnv *env, jclass clss, jlong lapl_id)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1nlinks(JNIEnv *env, jclass clss, jlong lapl_id, jlong nlinks)
+Java_hdf_hdf5lib_H5_H5Pset_1nlinks
+    (JNIEnv *env, jclass clss, jlong lapl_id, jlong nlinks)
 {
      herr_t retVal = -1;
 
@@ -2686,7 +2754,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1nlinks(JNIEnv *env, jclass clss, jlong lapl_id, jlon
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds(JNIEnv *env, jclass clss, jlong fapl_id, jintArray libver)
+Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds
+    (JNIEnv *env, jclass clss, jlong fapl_id, jintArray libver)
 {
     herr_t        retVal = -1;
     H5F_libver_t *theArray = NULL;
@@ -2720,7 +2789,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds(JNIEnv *env, jclass clss, jlong fapl_id, jint low, jint high)
+Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds
+    (JNIEnv *env, jclass clss, jlong fapl_id, jint low, jint high)
 {
     herr_t retVal = -1;
 
@@ -2745,7 +2815,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds(JNIEnv *env, jclass clss, jlong fapl_
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order(JNIEnv *env, jclass clss, jlong gcpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order
+    (JNIEnv *env, jclass clss, jlong gcpl_id)
 {
     unsigned crt_order_flags;
 
@@ -2761,7 +2832,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order(JNIEnv *env, jclass clss, jlon
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order(JNIEnv *env, jclass clss, jlong gcpl_id, jint crt_order_flags)
+Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jint crt_order_flags)
 {
     herr_t retVal = -1;
 
@@ -2778,7 +2850,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order(JNIEnv *env, jclass clss, jlon
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order(JNIEnv *env, jclass clss, jlong ocpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order
+    (JNIEnv *env, jclass clss, jlong ocpl_id)
 {
     unsigned crt_order_flags;
 
@@ -2794,7 +2867,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order(JNIEnv *env, jclass clss, jlon
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order(JNIEnv *env, jclass clss, jlong ocpl_id, jint crt_order_flags)
+Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order
+    (JNIEnv *env, jclass clss, jlong ocpl_id, jint crt_order_flags)
 {
     herr_t retVal = -1;
 
@@ -2811,7 +2885,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order(JNIEnv *env, jclass clss, jlon
  * Signature: (JI)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1copy_1object(JNIEnv *env, jclass clss, jlong ocp_plist_id, jint copy_options)
+Java_hdf_hdf5lib_H5_H5Pset_1copy_1object
+    (JNIEnv *env, jclass clss, jlong ocp_plist_id, jint copy_options)
 {
     herr_t retVal = -1;
 
@@ -2826,7 +2901,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1copy_1object(JNIEnv *env, jclass clss, jlong ocp_pli
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1copy_1object(JNIEnv *env, jclass clss, jlong ocp_plist_id)
+Java_hdf_hdf5lib_H5_H5Pget_1copy_1object
+    (JNIEnv *env, jclass clss, jlong ocp_plist_id)
 {
     unsigned copy_options;
 
@@ -2842,7 +2918,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1copy_1object(JNIEnv *env, jclass clss, jlong ocp_pli
  * Signature: (JZ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group(JNIEnv *env, jclass clss, jlong lcpl_id, jboolean crt_intermed_group)
+Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group
+    (JNIEnv *env, jclass clss, jlong lcpl_id, jboolean crt_intermed_group)
 {
     herr_t retVal = -1;
 
@@ -2859,7 +2936,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group(JNIEnv *env, jclass clss
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1group(JNIEnv *env, jclass clss, jlong lcpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1group
+    (JNIEnv *env, jclass clss, jlong lcpl_id)
 {
     unsigned crt_intermed_group;
 
@@ -2875,19 +2953,21 @@ Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1group(JNIEnv *env, jclass clss
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1data_1transform(JNIEnv *env, jclass clss, jlong plist_id, jstring expression)
+Java_hdf_hdf5lib_H5_H5Pset_1data_1transform
+    (JNIEnv *env, jclass clss, jlong plist_id, jstring expression)
 {
     herr_t      retVal = -1;
     const char *express;
 
-    PIN_JAVA_STRING(expression, express, -1);
-
-    retVal = H5Pset_data_transform((hid_t)plist_id, express);
+    PIN_JAVA_STRING(expression, express);
+    if (express != NULL) {
+        retVal = H5Pset_data_transform((hid_t)plist_id, express);
 
-    UNPIN_JAVA_STRING(expression, express);
+        UNPIN_JAVA_STRING(expression, express);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1data_1transform */
@@ -2898,7 +2978,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1data_1transform(JNIEnv *env, jclass clss, jlong plis
  * Signature: (J[Ljava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1data_1transform(JNIEnv *env, jclass clss, jlong plist_id, jobjectArray expression, jlong size)
+Java_hdf_hdf5lib_H5_H5Pget_1data_1transform
+    (JNIEnv *env, jclass clss, jlong plist_id, jobjectArray expression, jlong size)
 {
     size_t   buf_size;
     char    *express;
@@ -2945,7 +3026,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1data_1transform(JNIEnv *env, jclass clss, jlong plis
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags(JNIEnv *env, jclass clss, jlong lapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags
+    (JNIEnv *env, jclass clss, jlong lapl_id)
 {
     unsigned flags;
 
@@ -2961,7 +3043,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags(JNIEnv *env, jclass clss, jlong la
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags(JNIEnv *env, jclass clss, jlong lapl_id, jint flags)
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags
+    (JNIEnv *env, jclass clss, jlong lapl_id, jint flags)
 {
     herr_t retVal = -1;
 
@@ -2978,7 +3061,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags(JNIEnv *env, jclass clss, jlong la
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change(JNIEnv *env, jclass clss, jlong gcpl_id, jint max_compact, jint min_dense)
+Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jint max_compact, jint min_dense)
 {
     herr_t retVal = -1;
 
@@ -3006,7 +3090,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change(JNIEnv *env, jclass clss, jlong
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change  (JNIEnv *env, jclass clss, jlong gcpl_id, jintArray links)
+Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jintArray links)
 {
     herr_t    retVal = -1;
     unsigned *theArray = NULL;
@@ -3040,7 +3125,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change  (JNIEnv *env, jclass clss, jlon
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change(JNIEnv *env, jclass clss, jlong ocpl_id, jintArray attributes)
+Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change
+    (JNIEnv *env, jclass clss, jlong ocpl_id, jintArray attributes)
 {
     herr_t    retVal = -1;
     unsigned *theArray = NULL;
@@ -3074,7 +3160,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change(JNIEnv *env, jclass clss, jlong
  * Signature: (JII)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change(JNIEnv *env, jclass clss, jlong ocpl_id, jint max_compact, jint min_dense)
+Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change
+    (JNIEnv *env, jclass clss, jlong ocpl_id, jint max_compact, jint min_dense)
 {
     herr_t    retVal = -1;
 
@@ -3089,7 +3176,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change(JNIEnv *env, jclass clss, jlong
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change(JNIEnv *env, jclass clss, jlong fcpl_id, jintArray size)
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jintArray size)
 {
     herr_t    retVal = -1;
     unsigned *theArray = NULL;
@@ -3123,7 +3211,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change(JNIEnv *env, jclass clss
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change(JNIEnv *env, jclass clss, jlong fcpl_id, jint max_list, jint min_btree)
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jint max_list, jint min_btree)
 {
     herr_t retVal = -1;
 
@@ -3157,7 +3246,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change(JNIEnv *env, jclass clss
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes(JNIEnv *env, jclass clss, jlong fcpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes
+    (JNIEnv *env, jclass clss, jlong fcpl_id)
 {
     unsigned nindexes;
 
@@ -3173,7 +3263,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes(JNIEnv *env, jclass clss, jlo
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes(JNIEnv *env, jclass clss, jlong plist_id, jint nindexes)
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes
+    (JNIEnv *env, jclass clss, jlong plist_id, jint nindexes)
 {
     herr_t retVal = -1;
 
@@ -3195,7 +3286,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes(JNIEnv *env, jclass clss, jlo
  * Signature: (JIII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index(JNIEnv *env, jclass clss, jlong fcpl_id, jint index_num,
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jint index_num,
         jint mesg_type_flags, jint min_mesg_size)
 {
     herr_t      retVal = -1;
@@ -3229,7 +3321,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index(JNIEnv *env, jclass clss, jlong
  * Signature: (JI[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index(JNIEnv *env, jclass clss, jlong fcpl_id, jint index_num, jintArray mesg_info)
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jint index_num, jintArray mesg_info)
 {
     herr_t    retVal = -1;
     unsigned  nindexes;/* Number of SOHM indexes */
@@ -3274,7 +3367,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index(JNIEnv *env, jclass clss, jlong
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint(JNIEnv *env, jclass clss, jlong gcpl_id, jlong size_hint)
+Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jlong size_hint)
 {
     herr_t retVal = -1;
 
@@ -3291,7 +3385,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint(JNIEnv *env, jclass clss, jl
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint(JNIEnv *env, jclass clss, jlong gcpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint
+    (JNIEnv *env, jclass clss, jlong gcpl_id)
 {
     size_t size_hint;
 
@@ -3307,7 +3402,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint(JNIEnv *env, jclass clss, jl
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1nbit(JNIEnv *env, jclass clss, jlong plist_id)
+Java_hdf_hdf5lib_H5_H5Pset_1nbit
+    (JNIEnv *env, jclass clss, jlong plist_id)
 {
     herr_t retVal = -1;
 
@@ -3324,7 +3420,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1nbit(JNIEnv *env, jclass clss, jlong plist_id)
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset(JNIEnv *env, jclass clss, jlong plist_id, jint scale_type, jint scale_factor)
+Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset
+    (JNIEnv *env, jclass clss, jlong plist_id, jint scale_type, jint scale_factor)
 {
     herr_t retVal = -1;
 
@@ -3352,7 +3449,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset(JNIEnv *env, jclass clss, jlong plist_id
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info(JNIEnv *env, jclass clss, jlong gcpl_id, jint est_num_entries, jint est_name_len)
+Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jint est_num_entries, jint est_name_len)
 {
     herr_t retVal = -1;
 
@@ -3375,7 +3473,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info(JNIEnv *env, jclass clss, jlong gcpl
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info(JNIEnv *env, jclass clss, jlong gcpl_id, jintArray link_info)
+Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info
+    (JNIEnv *env, jclass clss, jlong gcpl_id, jintArray link_info)
 {
     herr_t    retVal = -1;
     unsigned *theArray = NULL;
@@ -3409,7 +3508,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info(JNIEnv *env, jclass clss, jlong gcpl
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl(JNIEnv *env, jclass clss, jlong lapl_id, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl
+    (JNIEnv *env, jclass clss, jlong lapl_id, jlong fapl_id)
 {
     herr_t retVal = -1;
 
@@ -3426,7 +3526,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl(JNIEnv *env, jclass clss, jlong lapl_id,
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl(JNIEnv *env, jclass clss, jlong lapl_id)
+Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl
+    (JNIEnv *env, jclass clss, jlong lapl_id)
 {
     hid_t retVal = -1;
 
@@ -3443,19 +3544,21 @@ Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl(JNIEnv *env, jclass clss, jlong lapl_i
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix(JNIEnv *env, jclass clss, jlong lapl_id, jstring prefix)
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix
+    (JNIEnv *env, jclass clss, jlong lapl_id, jstring prefix)
 {
     herr_t      retVal = -1;
     const char *aName;
 
-    PIN_JAVA_STRING(prefix, aName, -1);
-
-    retVal = H5Pset_elink_prefix((hid_t)lapl_id, aName);
+    PIN_JAVA_STRING(prefix, aName);
+    if (aName != NULL) {
+        retVal = H5Pset_elink_prefix((hid_t)lapl_id, aName);
 
-    UNPIN_JAVA_STRING(prefix, aName);
+        UNPIN_JAVA_STRING(prefix, aName);
 
-    if(retVal < 0)
-        h5libraryError(env);
+        if(retVal < 0)
+            h5libraryError(env);
+    }
 
     return (jint)retVal;
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix */
@@ -3466,11 +3569,12 @@ Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix(JNIEnv *env, jclass clss, jlong lapl_i
  * Signature: (J[Ljava/lang/String;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix(JNIEnv *env, jclass clss, jlong lapl_id, jobjectArray prefix)
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix
+    (JNIEnv *env, jclass clss, jlong lapl_id, jobjectArray prefix)
 {
     size_t  size = 0;
     char   *pre;
-    jlong   prefix_size;
+    jlong   prefix_size = -1;
     jstring str = NULL;
 
     if (prefix == NULL) {
@@ -3516,7 +3620,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix(JNIEnv *env, jclass clss, jlong lapl_i
  * Signature: (JJJJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct(JNIEnv *env, jclass clss, jlong fapl_id, jlong alignment,
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct
+    (JNIEnv *env, jclass clss, jlong fapl_id, jlong alignment,
         jlong block_size, jlong cbuf_size)
 {
     herr_t retVal = -1;
@@ -3536,7 +3641,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct(JNIEnv *env, jclass clss, jlong fapl_id
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct(JNIEnv *env, jclass clss, jlong fapl_id, jlongArray info)
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct
+    (JNIEnv *env, jclass clss, jlong fapl_id, jlongArray info)
 {
     herr_t   retVal = -1;
 
@@ -3587,7 +3693,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct(JNIEnv *env, jclass clss, jlong fapl_id
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2(JNIEnv *env, jclass clss, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2
+    (JNIEnv *env, jclass clss, jlong fapl_id)
 {
     herr_t retVal = -1;
 
@@ -3604,7 +3711,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2(JNIEnv *env, jclass clss, jlong fapl_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio(JNIEnv *env, jclass clss, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio
+    (JNIEnv *env, jclass clss, jlong fapl_id)
 {
     herr_t retVal = -1;
 
@@ -3621,7 +3729,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio(JNIEnv *env, jclass clss, jlong fapl_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows(JNIEnv *env, jclass clss, jlong fapl_id)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows
+    (JNIEnv *env, jclass clss, jlong fapl_id)
 {
     herr_t retVal = -1;
 
@@ -3640,7 +3749,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows(JNIEnv *env, jclass clss, jlong fapl_i
  * Signature: (J[I[J[Ljava/lang/String;[J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi(JNIEnv *env, jclass clss, jlong tid, jintArray memb_map,
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi
+    (JNIEnv *env, jclass clss, jlong tid, jintArray memb_map,
         jlongArray memb_fapl, jobjectArray memb_name, jlongArray memb_addr)
 {
     herr_t   status = -1;
@@ -3719,7 +3829,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi(JNIEnv *env, jclass clss, jlong tid, jin
  * Signature: (J[I[J[Ljava/lang/String;[JZ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi(JNIEnv *env, jclass clss, jlong tid, jintArray memb_map,
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi
+    (JNIEnv *env, jclass clss, jlong tid, jintArray memb_map,
         jlongArray memb_fapl, jobjectArray memb_name, jlongArray memb_addr, jboolean relax)
 {
     herr_t       status = -1;
@@ -3833,20 +3944,22 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi(JNIEnv *env, jclass clss, jlong tid, jin
  * Signature: (JLjava/lang/String;JLjava/lang/String;J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split(JNIEnv *env, jclass clss, jlong fapl_id, jstring metaext, jlong meta_pl_id, jstring rawext, jlong raw_pl_id)
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split
+    (JNIEnv *env, jclass clss, jlong fapl_id, jstring metaext, jlong meta_pl_id, jstring rawext, jlong raw_pl_id)
 {
     herr_t      retVal = -1;
     const char *mstr;
     const char *rstr;
 
-    PIN_JAVA_STRING_TWO0(metaext, mstr, rawext, rstr);
-
-    retVal = H5Pset_fapl_split((hid_t)fapl_id, mstr, (hid_t)meta_pl_id, rstr, (hid_t)raw_pl_id);
+    PIN_JAVA_STRING_TWO(metaext, mstr, rawext, rstr);
+    if (mstr != NULL && rstr != NULL) {
+        retVal = H5Pset_fapl_split((hid_t)fapl_id, mstr, (hid_t)meta_pl_id, rstr, (hid_t)raw_pl_id);
 
-    UNPIN_JAVA_STRING_TWO(metaext, mstr, rawext, rstr);
+        UNPIN_JAVA_STRING_TWO(metaext, mstr, rawext, rstr);
 
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split */
 
 /*
@@ -3855,7 +3968,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split(JNIEnv *env, jclass clss, jlong fapl_id,
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size(JNIEnv *env, jclass clss, jlong plist, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlong size)
 {
     long sz = (long)size;
 
@@ -3869,7 +3983,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size(JNIEnv *env, jclass clss, jlong pl
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     hsize_t  s;
 
@@ -3885,7 +4000,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size(JNIEnv *env, jclass clss, jlong pl
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size(JNIEnv *env, jclass clss, jlong plist, jlong size)
+Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size
+    (JNIEnv *env, jclass clss, jlong plist, jlong size)
 {
     size_t sz = (size_t)size;
 
@@ -3899,11 +4015,12 @@ Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size(JNIEnv *env, jclass clss, jlong pli
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     size_t  s;
 
-    if ( H5Pget_sieve_buf_size((hid_t)plist, &s) < 0)
+    if (H5Pget_sieve_buf_size((hid_t)plist, &s) < 0)
         h5libraryError(env);
 
     return (jlong)s;
@@ -3915,7 +4032,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size(JNIEnv *env, jclass clss, jlong pli
  * Signature: (JI)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size(JNIEnv *env, jclass clss, jlong plist, jint size)
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size
+    (JNIEnv *env, jclass clss, jlong plist, jint size)
 {
     unsigned  sz = (unsigned)size;
 
@@ -3929,7 +4047,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size(JNIEnv *env, jclass clss, j
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     unsigned  s;
 
@@ -3946,7 +4065,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size(JNIEnv *env, jclass clss, j
  * Signature: (J)Lhdf/hdf5lib/structs/H5AC_cache_config_t;
  */
 JNIEXPORT jobject JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config(JNIEnv *env, jclass clss, jlong plist)
+Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config
+    (JNIEnv *env, jclass clss, jlong plist)
 {
     H5AC_cache_config_t cacheinfo;
     herr_t     status = -1;
@@ -4007,7 +4127,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config(JNIEnv *env, jclass clss, jlong plist)
  * Signature: (JLhdf/hdf5lib/structs/H5AC_cache_config_t;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config(JNIEnv *env, jclass clss, jlong plist, jobject cache_config)
+Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config
+    (JNIEnv *env, jclass clss, jlong plist, jobject cache_config)
 {
     herr_t      status = -1;
     jclass      cls;
@@ -4351,13 +4472,13 @@ Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config(JNIEnv *env, jclass clss, jlong plist, j
     cacheinfo.metadata_write_strategy = ENVPTR->GetIntField(ENVPAR cache_config, fid);
     if(ENVPTR->ExceptionOccurred(ENVONLY)) {
         h5JNIFatalError(env, "H5Pset_mdc_config: loading metadata_write_strategy failed");
-        return;
     } /* end if */
+    else {
+        status = H5Pset_mdc_config((hid_t)plist, &cacheinfo);
 
-    status = H5Pset_mdc_config((hid_t)plist, &cacheinfo);
-
-    if (status < 0)
-       h5libraryError(env);
+        if (status < 0)
+        h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config */
 
 /*
@@ -4366,7 +4487,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config(JNIEnv *env, jclass clss, jlong plist, j
  * Signature: (JJJD)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, jlong rdcc_nslots,
+Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache
+    (JNIEnv *env, jclass clss, jlong dapl, jlong rdcc_nslots,
         jlong rdcc_nbytes, jdouble rdcc_w0)
 {
     if (H5Pset_chunk_cache((hid_t)dapl, (size_t)rdcc_nslots, (size_t)rdcc_nbytes, (double) rdcc_w0) < 0)
@@ -4379,20 +4501,18 @@ Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, j
  * Signature: (J[J[J[D)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, jlongArray rdcc_nslots,
+Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache
+    (JNIEnv *env, jclass clss, jlong dapl, jlongArray rdcc_nslots,
         jlongArray rdcc_nbytes, jdoubleArray rdcc_w0)
 {
     herr_t   status = -1;
     jint     mode;
-    jdouble *w0Array;
-    jlong   *rdcc_nslotsArray;
-    jlong   *nbytesArray;
+    jdouble *w0Array = (jdouble *)NULL;
+    jlong   *rdcc_nslotsArray = (jlong *)NULL;
+    jlong   *nbytesArray = (jlong *)NULL;
     jboolean isCopy;
 
-    if (rdcc_w0 == NULL) {
-        w0Array = (jdouble *)NULL;
-    } /* end if */
-    else {
+    if (rdcc_w0 != NULL) {
         w0Array = (jdouble *)ENVPTR->GetDoubleArrayElements(ENVPAR rdcc_w0, &isCopy);
         if (w0Array == NULL) {
             h5JNIFatalError(env, "H5Pget_chunk_cache:  w0_array array not pinned");
@@ -4400,10 +4520,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, j
         } /* end if */
     } /* end else */
 
-    if (rdcc_nslots == NULL) {
-        rdcc_nslotsArray = (jlong *)NULL;
-    } /* end if */
-    else {
+    if (rdcc_nslots != NULL) {
         rdcc_nslotsArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR rdcc_nslots, &isCopy);
         if (rdcc_nslotsArray == NULL) {
             /* exception -- out of memory */
@@ -4415,10 +4532,7 @@ Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, j
         } /* end if */
     } /* end else */
 
-    if (rdcc_nbytes == NULL) {
-        nbytesArray = (jlong *)NULL;
-    } /* end if */
-    else {
+    if (rdcc_nbytes != NULL) {
         nbytesArray = (jlong *)ENVPTR->GetLongArrayElements(ENVPAR rdcc_nbytes, &isCopy);
         if (nbytesArray == NULL) {
             if (w0Array != NULL) {
@@ -4473,7 +4587,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache(JNIEnv *env, jclass clss, jlong dapl, j
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times(JNIEnv *env, jclass clss, jlong objplid)
+Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times
+    (JNIEnv *env, jclass clss, jlong objplid)
 {
     hbool_t  track_times;
 
@@ -4493,7 +4608,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times(JNIEnv *env, jclass clss, jlong ob
  * Signature: (JZ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times(JNIEnv *env, jclass clss, jlong objplid, jboolean track_times)
+Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times
+    (JNIEnv *env, jclass clss, jlong objplid, jboolean track_times)
 {
     hbool_t  track;
 
@@ -4514,7 +4630,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times(JNIEnv *env, jclass clss, jlong ob
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding(JNIEnv *env, jclass clss, jlong acpl)
+Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding
+    (JNIEnv *env, jclass clss, jlong acpl)
 {
     H5T_cset_t  encoding;
 
@@ -4530,7 +4647,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding(JNIEnv *env, jclass clss, jlong acpl)
  * Signature: (JI)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding(JNIEnv *env, jclass clss, jlong acpl, jint encoding)
+Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding
+    (JNIEnv *env, jclass clss, jlong acpl, jint encoding)
 {
     if (H5Pset_char_encoding((hid_t)acpl, (H5T_cset_t)encoding) < 0)
         h5libraryError(env);
@@ -4542,21 +4660,23 @@ Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding(JNIEnv *env, jclass clss, jlong acpl,
  * Signature: (JJLjava/lang/String;Ljava/lang/String;J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1virtual(JNIEnv *env, jclass clss, jlong dcpl_id, jlong vspace_id,
+Java_hdf_hdf5lib_H5_H5Pset_1virtual
+    (JNIEnv *env, jclass clss, jlong dcpl_id, jlong vspace_id,
         jstring src_file_name, jstring src_dset_name, jlong src_space_id)
 {
     herr_t      retVal = -1;
     const char *fstr;
     const char *dstr;
 
-    PIN_JAVA_STRING_TWO0(src_file_name, fstr, src_dset_name, dstr);
+    PIN_JAVA_STRING_TWO(src_file_name, fstr, src_dset_name, dstr);
+    if (fstr != NULL && dstr != NULL) {
+        retVal = H5Pset_virtual((hid_t)dcpl_id, (hid_t)vspace_id, fstr, dstr, (hid_t)src_space_id);
 
-    retVal = H5Pset_virtual((hid_t)dcpl_id, (hid_t)vspace_id, fstr, dstr, (hid_t)src_space_id);
+        UNPIN_JAVA_STRING_TWO(src_file_name, fstr, src_dset_name, dstr);
 
-    UNPIN_JAVA_STRING_TWO(src_file_name, fstr, src_dset_name, dstr);
-
-    if (retVal < 0)
-        h5libraryError(env);
+        if (retVal < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pset_1virtual */
 
 /*
@@ -4565,7 +4685,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1virtual(JNIEnv *env, jclass clss, jlong dcpl_id, jlo
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count(JNIEnv *env, jclass clss, jlong dcpl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count
+    (JNIEnv *env, jclass clss, jlong dcpl_id)
 {
     size_t  s;
 
@@ -4581,7 +4702,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count(JNIEnv *env, jclass clss, jlong dcpl_
  * Signature: (JJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace(JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace
+    (JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
 {
     hid_t space_id = -1;
 
@@ -4598,7 +4720,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace(JNIEnv *env, jclass clss, jlong dcpl
  * Signature: (JJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace(JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace
+    (JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
 {
     hid_t space_id = -1;
 
@@ -4615,7 +4738,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace(JNIEnv *env, jclass clss, jlong dc
  * Signature: (JJ)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename(JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename
+    (JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
 {
     char    *fname;
     ssize_t  buf_size;
@@ -4658,7 +4782,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename(JNIEnv *env, jclass clss, jlong dc
  * Signature: (JJ)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname(JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname
+    (JNIEnv *env, jclass clss, jlong dcpl_id, jlong index)
 {
     char    *dname;
     ssize_t  buf_size;
@@ -4700,7 +4825,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname(JNIEnv *env, jclass clss, jlong dc
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view(JNIEnv *env, jclass clss, jlong dapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view
+    (JNIEnv *env, jclass clss, jlong dapl_id)
 {
     H5D_vds_view_t virtual_view;
 
@@ -4716,7 +4842,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view(JNIEnv *env, jclass clss, jlong dapl_i
  * Signature: (JI)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view(JNIEnv *env, jclass clss, jlong dapl_id, jint view)
+Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view
+    (JNIEnv *env, jclass clss, jlong dapl_id, jint view)
 {
     if (H5Pset_virtual_view((hid_t)dapl_id, (H5D_vds_view_t)view) < 0)
         h5libraryError(env);
@@ -4728,7 +4855,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view(JNIEnv *env, jclass clss, jlong dapl_i
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap(JNIEnv *env, jclass clss, jlong dapl_id)
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap
+    (JNIEnv *env, jclass clss, jlong dapl_id)
 {
     hsize_t gap_size;
 
@@ -4744,7 +4872,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap(JNIEnv *env, jclass clss, jlong
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1virtual_1printf_1gap(JNIEnv *env, jclass clss, jlong dapl_id, jlong gap_size)
+Java_hdf_hdf5lib_H5_H5Pset_1virtual_1printf_1gap
+    (JNIEnv *env, jclass clss, jlong dapl_id, jlong gap_size)
 {
     if (H5Pset_virtual_printf_gap((hid_t)dapl_id, (hsize_t)gap_size) < 0)
         h5libraryError(env);
@@ -4752,68 +4881,139 @@ Java_hdf_hdf5lib_H5_H5Pset_1virtual_1printf_1gap(JNIEnv *env, jclass clss, jlong
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Pget_file_space
- * Signature: (J[I[J)V
+ * Method:    H5Pget_file_space_strategy
+ * Signature: (J[Z[J)I
  */
-JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1file_1space(JNIEnv *env, jclass clss, jlong fcpl_id, jintArray strategy, jlongArray threshold)
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jbooleanArray persist, jlongArray threshold)
 {
     herr_t   status = -1;
-    jint    *thestrategyArray = NULL;
+    H5F_fspace_strategy_t    thestrategy = H5F_FSPACE_STRATEGY_FSM_AGGR; /* Library default */
     jlong   *thethresholdArray = NULL;
+    jboolean *thepersistArray = NULL;
     jboolean isCopy;
 
-    if (strategy) {
-        thestrategyArray = (jint*)ENVPTR->GetIntArrayElements(ENVPAR strategy, &isCopy);
-        if (thestrategyArray == NULL) {
-            h5JNIFatalError(env, "H5Pget_file_space:  strategy not pinned");
-            return;
+    if (persist) {
+        thepersistArray = (jboolean*)ENVPTR->GetBooleanArrayElements(ENVPAR persist, &isCopy);
+        if (thepersistArray == NULL) {
+            h5JNIFatalError(env, "H5Pget_file_space:  persist not pinned");
+            return -1;
         }
     }
 
     if (threshold) {
         thethresholdArray = (jlong*)ENVPTR->GetLongArrayElements(ENVPAR threshold, &isCopy);
         if (thethresholdArray == NULL) {
-            if (strategy) ENVPTR->ReleaseIntArrayElements(ENVPAR strategy, thestrategyArray, JNI_ABORT);
+            if (persist) ENVPTR->ReleaseBooleanArrayElements(ENVPAR persist, thepersistArray, JNI_ABORT);
             h5JNIFatalError(env, "H5Pget_file_space:  threshold not pinned");
-            return;
+            return -1;
         } /* end if */
     } /* end if */
 
-    status = H5Pget_file_space((hid_t)fcpl_id, (H5F_file_space_type_t*)thestrategyArray, (hsize_t*)thethresholdArray);
+    status = H5Pget_file_space_strategy((hid_t)fcpl_id, &thestrategy, (hbool_t*)thepersistArray, (hsize_t*)thethresholdArray);
 
     if (status < 0) {
-        if (strategy) ENVPTR->ReleaseIntArrayElements(ENVPAR strategy, thestrategyArray, JNI_ABORT);
+        if (persist) ENVPTR->ReleaseBooleanArrayElements(ENVPAR persist, thepersistArray, JNI_ABORT);
         if (threshold) ENVPTR->ReleaseLongArrayElements(ENVPAR threshold, thethresholdArray, JNI_ABORT);
         h5libraryError(env);
     } /* end if */
     else {
-        if (strategy) ENVPTR->ReleaseIntArrayElements(ENVPAR strategy, thestrategyArray, 0);
+        if (persist) ENVPTR->ReleaseBooleanArrayElements(ENVPAR persist, thepersistArray, 0);
         if (threshold) ENVPTR->ReleaseLongArrayElements(ENVPAR threshold, thethresholdArray, 0);
     } /* end else */
-} /* end Java_hdf_hdf5lib_H5_H5Pget_1file_1space */
+    return (jint)thestrategy;
+} /* end Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy */
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Pset_file_space
- * Signature: (JIJ)V
+ * Method:    H5Pget_file_space_strategy_persist
+ * Signature: (J)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy_1persist
+    (JNIEnv *env, jclass clss, jlong fcpl_id)
+{
+    herr_t   status = -1;
+    hbool_t  thepersist = FALSE;
+
+    status = H5Pget_file_space_strategy((hid_t)fcpl_id, NULL, &thepersist, NULL);
+
+    if (status < 0)
+        h5libraryError(env);
+
+    return (jboolean)thepersist;
+} /* end Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy_1persist */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pget_file_space_strategy_threshold
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy_1threshold
+    (JNIEnv *env, jclass clss, jlong fcpl_id)
+{
+    herr_t   status = -1;
+    hsize_t    thethreshold;
+
+    status = H5Pget_file_space_strategy((hid_t)fcpl_id, NULL, NULL, &thethreshold);
+
+    if (status < 0)
+        h5libraryError(env);
+
+    return (jlong)thethreshold;
+} /* end Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1threshold */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pset_file_space_strategy
+ * Signature: (JIZJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1file_1space(JNIEnv *env, jclass clss, jlong fcpl_id, jint strategy, jlong threshold)
+Java_hdf_hdf5lib_H5_H5Pset_1file_1space_1strategy
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jint strategy, jboolean persist, jlong threshold)
 {
-    if (H5Pset_file_space((hid_t)fcpl_id, (H5F_file_space_type_t)strategy, (hsize_t)threshold) < 0)
+    if (H5Pset_file_space_strategy((hid_t)fcpl_id, (H5F_fspace_strategy_t)strategy, (hbool_t)persist, (hsize_t)threshold) < 0)
         h5libraryError(env);
-} /* end Java_hdf_hdf5lib_H5_H5Pset_1file_1space */
+} /* end Java_hdf_hdf5lib_H5_H5Pset_file_space_strategy */
 
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pset_file_space_page_size
+ * Signature: (JJ)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1file_1space_1page_1size
+    (JNIEnv *env, jclass clss, jlong fcpl_id, jlong fsp_size)
+{
+    if (H5Pset_file_space_page_size((hid_t)fcpl_id, (hsize_t)fsp_size) < 0)
+        h5libraryError(env);
+}
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pget_file_space_page_size
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1page_1size
+    (JNIEnv *env, jclass clss, jlong fcpl_id)
+{
+    hsize_t fsp_size = 0;
+    if (H5Pget_file_space_page_size((hid_t)fcpl_id, &fsp_size) < 0)
+        h5libraryError(env);
+    return (jlong)fsp_size;
+}
 
 static herr_t
-H5P_cls_create_cb(hid_t prop_id, void *create_data)
+H5P_cls_create_cb
+    (hid_t prop_id, void *create_data)
 {
     JNIEnv    *cbenv;
     jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
         cls = CBENVPTR->GetObjectClass(CBENVPAR create_callback);
@@ -4827,17 +5027,17 @@ H5P_cls_create_cb(hid_t prop_id, void *create_data)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_cls_create_cb */
 
 static herr_t
-H5P_cls_copy_cb(hid_t new_prop_id, hid_t old_prop_id, void *copy_data)
+H5P_cls_copy_cb
+    (hid_t new_prop_id, hid_t old_prop_id, void *copy_data)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
         cls = CBENVPTR->GetObjectClass(CBENVPAR copy_callback);
@@ -4849,17 +5049,17 @@ H5P_cls_copy_cb(hid_t new_prop_id, hid_t old_prop_id, void *copy_data)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_cls_ccopy_cb */
 
 static herr_t
-H5P_cls_close_cb(hid_t prop_id, void *close_data)
+H5P_cls_close_cb
+    (hid_t prop_id, void *close_data)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
         cls = CBENVPTR->GetObjectClass(CBENVPAR close_callback);
@@ -4871,7 +5071,7 @@ H5P_cls_close_cb(hid_t prop_id, void *close_data)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_cls_close_cb */
 
 /*
@@ -4880,12 +5080,13 @@ H5P_cls_close_cb(hid_t prop_id, void *close_data)
  * Signature: (JZLjava/lang/String;Z)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options(JNIEnv *env, jclass clss, jlong fapl_id, jboolean is_enabled, jstring location, jboolean start_on_access)
+Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options
+    (JNIEnv *env, jclass clss, jlong fapl_id, jboolean is_enabled, jstring location, jboolean start_on_access)
 {
     herr_t      retVal = -1;
     const char *lstr;
 
-    PIN_JAVA_STRING0(location, lstr);
+    PIN_JAVA_STRING(location, lstr);
 
     retVal = H5Pset_mdc_log_options((hid_t)fapl_id, (hbool_t)is_enabled, lstr, (hbool_t)start_on_access);
 
@@ -4902,7 +5103,8 @@ Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options(JNIEnv *env, jclass clss, jlong fa
  * Signature: (J[Z)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options(JNIEnv *env, jclass clss, jlong fapl_id, jbooleanArray mdc_log_options)
+Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options
+    (JNIEnv *env, jclass clss, jlong fapl_id, jbooleanArray mdc_log_options)
 {
     hbool_t    is_enabled;
     hbool_t    start_on_access;
@@ -4963,47 +5165,36 @@ Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options(JNIEnv *env, jclass clss, jlong fa
 } /* end if */
 
 static herr_t
-H5D_append_cb(hid_t dataset_id, hsize_t *cur_dims, void *op_data)
+H5D_append_cb
+    (hid_t dataset_id, hsize_t *cur_dims, void *op_data)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
     jlongArray cur_dimsArray;
-    jsize      size;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) != 0) {
         JVMPTR->DetachCurrentThread(JVMPAR);
         return -1;
     } /* end if */
     cls = CBENVPTR->GetObjectClass(CBENVPAR visit_callback);
-    if (cls == 0) {
-       JVMPTR->DetachCurrentThread(JVMPAR);
-       return -1;
-    } /* end if */
-    mid = CBENVPTR->GetMethodID(CBENVPAR cls, "callback", "(J[JLhdf/hdf5lib/callbacks/H5D_append_t;)I");
-    if (mid == 0) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-
-    if (cur_dims == NULL) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
-    } /* end if */
-
-    cur_dimsArray = CBENVPTR->NewLongArray(CBENVPAR 2);
-    if (cur_dimsArray == NULL) {
-        JVMPTR->DetachCurrentThread(JVMPAR);
-        return -1;
+    if (cls != 0) {
+        mid = CBENVPTR->GetMethodID(CBENVPAR cls, "callback", "(J[JLhdf/hdf5lib/callbacks/H5D_append_t;)I");
+        if (mid != 0) {
+            if (cur_dims != NULL) {
+                cur_dimsArray = CBENVPTR->NewLongArray(CBENVPAR 2);
+                if (cur_dimsArray != NULL) {
+                    CBENVPTR->SetLongArrayRegion(CBENVPAR cur_dimsArray, 0, 2, (const jlong *)cur_dims);
+
+                    status = CBENVPTR->CallIntMethod(CBENVPAR visit_callback, mid, dataset_id, cur_dims, op_data);
+                }
+            }
+        }
     } /* end if */
-    CBENVPTR->SetLongArrayRegion(CBENVPAR cur_dimsArray, 0, 2, (const jlong *)cur_dims);
-
-    status = CBENVPTR->CallIntMethod(CBENVPAR visit_callback, mid, dataset_id, cur_dims, op_data);
-
     JVMPTR->DetachCurrentThread(JVMPAR);
 
-    return status;
+    return (herr_t)status;
 } /* end H5D_append_cb */
 
 /*
@@ -5012,8 +5203,8 @@ H5D_append_cb(hid_t dataset_id, hsize_t *cur_dims, void *op_data)
  * Signature: (JI[JLjava/lang/Object;Ljava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1append_1flush(JNIEnv *env, jclass clss, jlong plist_id, jint ndims, jlongArray boundary,
-        jobject callback_op, jobject op_data)
+Java_hdf_hdf5lib_H5_H5Pset_1append_1flush
+    (JNIEnv *env, jclass clss, jlong plist_id, jint ndims, jlongArray boundary, jobject callback_op, jobject op_data)
 {
     herr_t   status = -1;
 
@@ -5040,19 +5231,21 @@ Java_hdf_hdf5lib_H5_H5Pset_1append_1flush(JNIEnv *env, jclass clss, jlong plist_
  * Signature: (JLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb(JNIEnv *env, jclass clss, jlong parent_class, jstring name)
+Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb
+    (JNIEnv *env, jclass clss, jlong parent_class, jstring name)
 {
     hid_t class_id = -1;
     const char *cstr;
 
-    PIN_JAVA_STRING(name, cstr, -1);
-
-    class_id = H5Pcreate_class((hid_t)parent_class, cstr,  NULL, NULL, NULL, NULL, NULL, NULL);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        class_id = H5Pcreate_class((hid_t)parent_class, cstr,  NULL, NULL, NULL, NULL, NULL, NULL);
 
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (class_id < 0)
-        h5libraryError(env);
+        if (class_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)class_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb */
@@ -5063,7 +5256,8 @@ Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb(JNIEnv *env, jclass clss, jlong par
  * Signature: (JLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Pcreate_1class(JNIEnv *env, jclass clss, jlong parent_class, jstring name, jobject create_op,
+Java_hdf_hdf5lib_H5__1H5Pcreate_1class
+    (JNIEnv *env, jclass clss, jlong parent_class, jstring name, jobject create_op,
         jobject create_data, jobject copy_op, jobject copy_data, jobject close_op, jobject close_data)
 {
     hid_t class_id = -1;
@@ -5072,27 +5266,28 @@ Java_hdf_hdf5lib_H5__1H5Pcreate_1class(JNIEnv *env, jclass clss, jlong parent_cl
     close_callback = close_op;
     create_callback = create_op;
 
-    PIN_JAVA_STRING(name, cstr, -1);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        class_id = H5Pcreate_class((hid_t)parent_class, cstr, (H5P_cls_create_func_t)H5P_cls_create_cb, (void*) create_data,
+                (H5P_cls_copy_func_t)H5P_cls_copy_cb, (void*) copy_data, (H5P_cls_close_func_t)H5P_cls_close_cb, (void*) close_data);
 
-    class_id = H5Pcreate_class((hid_t)parent_class, cstr, (H5P_cls_create_func_t)H5P_cls_create_cb, (void*) create_data,
-            (H5P_cls_copy_func_t)H5P_cls_copy_cb, (void*) copy_data, (H5P_cls_close_func_t)H5P_cls_close_cb, (void*) close_data);
-
-    UNPIN_JAVA_STRING(name, cstr);
+        UNPIN_JAVA_STRING(name, cstr);
 
-    if (class_id < 0)
-        h5libraryError(env);
+        if (class_id < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)class_id;
 } /* end Java_hdf_hdf5lib_H5__1H5Pcreate_1class */
 
 static herr_t
-H5P_prp_create_cb(const char *name, size_t size, void *value)
+H5P_prp_create_cb
+    (const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5106,17 +5301,17 @@ H5P_prp_create_cb(const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_create_cb */
 
 static herr_t
-H5P_prp_copy_cb(const char *name, size_t size, void *value)
+H5P_prp_copy_cb
+    (const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5130,17 +5325,17 @@ H5P_prp_copy_cb(const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_copy_cb */
 
 static herr_t
-H5P_prp_close_cb(const char *name, size_t size, void *value)
+H5P_prp_close_cb
+    (const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5154,17 +5349,17 @@ H5P_prp_close_cb(const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_close_cb */
 
 static int
-H5P_prp_compare_cb(void *value1, void *value2, size_t size)
+H5P_prp_compare_cb
+    (void *value1, void *value2, size_t size)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
         cls = CBENVPTR->GetObjectClass(CBENVPAR compare_callback);
@@ -5176,17 +5371,17 @@ H5P_prp_compare_cb(void *value1, void *value2, size_t size)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_compare_cb */
 
 static herr_t
-H5P_prp_get_cb(hid_t prop_id, const char *name, size_t size, void *value)
+H5P_prp_get_cb
+    (hid_t prop_id, const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5200,17 +5395,17 @@ H5P_prp_get_cb(hid_t prop_id, const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_get_cb */
 
 static herr_t
-H5P_prp_set_cb(hid_t prop_id, const char *name, size_t size, void *value)
+H5P_prp_set_cb
+    (hid_t prop_id, const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5224,17 +5419,17 @@ H5P_prp_set_cb(hid_t prop_id, const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_set_cb */
 
 static herr_t
-H5P_prp_delete_cb(hid_t prop_id, const char *name, size_t size, void *value)
+H5P_prp_delete_cb
+    (hid_t prop_id, const char *name, size_t size, void *value)
 {
     JNIEnv    *cbenv;
-    jint       status;
+    jint       status = -1;
     jclass     cls;
     jmethodID  mid;
-    jmethodID  constructor;
     jstring    str;
 
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) == 0) {
@@ -5248,7 +5443,7 @@ H5P_prp_delete_cb(hid_t prop_id, const char *name, size_t size, void *value)
         } /* end if */
     } /* end if */
     JVMPTR->DetachCurrentThread(JVMPAR);
-    return status;
+    return (herr_t)status;
 } /* end H5P_prp_delete_cb */
 
 /*
@@ -5257,31 +5452,33 @@ H5P_prp_delete_cb(hid_t prop_id, const char *name, size_t size, void *value)
  * Signature: (JLjava/lang/String;J[B)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pregister2_1nocb(JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size, jbyteArray def_value)
+Java_hdf_hdf5lib_H5_H5Pregister2_1nocb
+    (JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size, jbyteArray def_value)
 {
     herr_t   status = -1;
     jbyte   *buffP;
     jboolean isCopy2;
     const char *cstr;
 
-    PIN_JAVA_STRING0(name, cstr);
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
-    if (buffP == NULL) {
-        UNPIN_JAVA_STRING(name, cstr);
-        h5JNIFatalError(env, "H5Pregister2:  buf not pinned");
-    } /* end if */
-    else {
-        status = H5Pregister2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-        UNPIN_JAVA_STRING(name, cstr);
-        if (status < 0) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
-            h5libraryError(env);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
+        if (buffP == NULL) {
+            h5JNIFatalError(env, "H5Pregister2:  buf not pinned");
         } /* end if */
         else {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            status = H5Pregister2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+            if (status < 0) {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
+                h5libraryError(env);
+            } /* end if */
+            else {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, cstr);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pregister2_1nocb */
 
 /*
@@ -5290,7 +5487,8 @@ Java_hdf_hdf5lib_H5_H5Pregister2_1nocb(JNIEnv *env, jclass clss, jlong cls_id, j
  * Signature: (JLjava/lang/String;J[BLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pregister2(JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size,
+Java_hdf_hdf5lib_H5_H5Pregister2
+    (JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size,
         jbyteArray def_value, jobject prp_create, jobject prp_set, jobject prp_get, jobject prp_delete,
         jobject prp_copy, jobject prp_cmp, jobject prp_close)
 {
@@ -5306,26 +5504,27 @@ Java_hdf_hdf5lib_H5_H5Pregister2(JNIEnv *env, jclass clss, jlong cls_id, jstring
     get_callback = prp_get;
     delete_callback = prp_delete;
 
-    PIN_JAVA_STRING0(name, cstr);
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
-    if (buffP == NULL) {
-        UNPIN_JAVA_STRING(name, cstr);
-        h5JNIFatalError(env, "H5Pregister2:  buf not pinned");
-    } /* end if */
-    else {
-        status = H5Pregister2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, (H5P_prp_create_func_t)H5P_prp_create_cb,
-            (H5P_prp_set_func_t)H5P_prp_set_cb, (H5P_prp_get_func_t)H5P_prp_get_cb, (H5P_prp_delete_func_t)H5P_prp_delete_cb,
-            (H5P_prp_copy_func_t)H5P_prp_copy_cb, (H5P_prp_compare_func_t)H5P_prp_compare_cb, (H5P_prp_close_func_t)H5P_prp_close_cb);
-
-        UNPIN_JAVA_STRING(name, cstr);
-        if (status < 0) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
-            h5libraryError(env);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
+        if (buffP == NULL) {
+            h5JNIFatalError(env, "H5Pregister2:  buf not pinned");
         } /* end if */
         else {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            status = H5Pregister2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, (H5P_prp_create_func_t)H5P_prp_create_cb,
+                (H5P_prp_set_func_t)H5P_prp_set_cb, (H5P_prp_get_func_t)H5P_prp_get_cb, (H5P_prp_delete_func_t)H5P_prp_delete_cb,
+                (H5P_prp_copy_func_t)H5P_prp_copy_cb, (H5P_prp_compare_func_t)H5P_prp_compare_cb, (H5P_prp_close_func_t)H5P_prp_close_cb);
+
+            if (status < 0) {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
+                h5libraryError(env);
+            } /* end if */
+            else {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, cstr);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pregister2 */
 
 /*
@@ -5334,31 +5533,33 @@ Java_hdf_hdf5lib_H5_H5Pregister2(JNIEnv *env, jclass clss, jlong cls_id, jstring
  * Signature: (JLjava/lang/String;J[B)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb(JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size, jbyteArray def_value)
+Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb
+    (JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size, jbyteArray def_value)
 {
     herr_t   status = -1;
     jbyte   *buffP;
     jboolean isCopy2;
     const char *cstr;
 
-    PIN_JAVA_STRING0(name, cstr);
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
-    if (buffP == NULL) {
-        UNPIN_JAVA_STRING(name, cstr);
-        h5JNIFatalError(env, "H5Pinsert2:  buf not pinned");
-    } /* end if */
-    else {
-        status = H5Pinsert2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, NULL, NULL, NULL, NULL, NULL, NULL);
-
-        UNPIN_JAVA_STRING(name, cstr);
-        if (status < 0) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
-            h5libraryError(env);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
+        if (buffP == NULL) {
+            h5JNIFatalError(env, "H5Pinsert2:  buf not pinned");
         } /* end if */
         else {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            status = H5Pinsert2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP, NULL, NULL, NULL, NULL, NULL, NULL);
+
+            if (status < 0) {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
+                h5libraryError(env);
+            } /* end if */
+            else {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, cstr);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pinsert2 */
 
 
@@ -5368,7 +5569,8 @@ Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb(JNIEnv *env, jclass clss, jlong cls_id, jst
  * Signature: (JLjava/lang/String;J[BLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pinsert2(JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size,
+Java_hdf_hdf5lib_H5_H5Pinsert2
+    (JNIEnv *env, jclass clss, jlong cls_id, jstring name, jlong prp_size,
         jbyteArray def_value, jobject prp_set, jobject prp_get, jobject prp_delete,
         jobject prp_copy, jobject prp_cmp, jobject prp_close)
 {
@@ -5383,37 +5585,39 @@ Java_hdf_hdf5lib_H5_H5Pinsert2(JNIEnv *env, jclass clss, jlong cls_id, jstring n
     get_callback = prp_get;
     delete_callback = prp_delete;
 
-    PIN_JAVA_STRING0(name, cstr);
-    buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
-    if (buffP == NULL) {
-        UNPIN_JAVA_STRING(name, cstr);
-        h5JNIFatalError(env, "H5Pinsert2:  buf not pinned");
-    } /* end if */
-    else {
-        status = H5Pinsert2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP,
-            (H5P_prp_set_func_t)H5P_prp_set_cb, (H5P_prp_get_func_t)H5P_prp_get_cb, (H5P_prp_delete_func_t)H5P_prp_delete_cb,
-            (H5P_prp_copy_func_t)H5P_prp_copy_cb, (H5P_prp_compare_func_t)H5P_prp_compare_cb, (H5P_prp_close_func_t)H5P_prp_close_cb);
-
-        UNPIN_JAVA_STRING(name, cstr);
-        if (status < 0) {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
-            h5libraryError(env);
+    PIN_JAVA_STRING(name, cstr);
+    if (cstr != NULL) {
+        buffP = ENVPTR->GetByteArrayElements(ENVPAR def_value, &isCopy2);
+        if (buffP == NULL) {
+            UNPIN_JAVA_STRING(name, cstr);
+            h5JNIFatalError(env, "H5Pinsert2:  buf not pinned");
         } /* end if */
         else {
-            ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            status = H5Pinsert2((hid_t)cls_id, cstr, (size_t)prp_size, (void*)buffP,
+                (H5P_prp_set_func_t)H5P_prp_set_cb, (H5P_prp_get_func_t)H5P_prp_get_cb, (H5P_prp_delete_func_t)H5P_prp_delete_cb,
+                (H5P_prp_copy_func_t)H5P_prp_copy_cb, (H5P_prp_compare_func_t)H5P_prp_compare_cb, (H5P_prp_close_func_t)H5P_prp_close_cb);
+
+            if (status < 0) {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, JNI_ABORT);
+                h5libraryError(env);
+            } /* end if */
+            else {
+                ENVPTR->ReleaseByteArrayElements(ENVPAR def_value, buffP, 0);
+            } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, cstr);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Pinsert2 */
 
 static herr_t
-H5P_iterate_cb(hid_t prop_id, const char *name, void *op_data)
+H5P_iterate_cb
+    (hid_t prop_id, const char *name, void *op_data)
 {
     JNIEnv    *cbenv;
     jint       status = -1;
     jclass     cls;
     jmethodID  mid;
     jstring    str;
-    jmethodID  constructor;
 
     /* fprintf(stderr, "\nJNI H5P_iterate_cb entered\n"); fflush(stderr); */
     if(JVMPTR->AttachCurrentThread(JVMPAR2 (void**)&cbenv, NULL) != 0) {
@@ -5454,8 +5658,8 @@ H5P_iterate_cb(hid_t prop_id, const char *name, void *op_data)
  * Signature: (J[ILjava/lang/Object;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Piterate(JNIEnv *env, jclass clss, jlong prop_id, jintArray idx,
-        jobject callback_op, jobject op_data)
+Java_hdf_hdf5lib_H5_H5Piterate
+    (JNIEnv *env, jclass clss, jlong prop_id, jintArray idx, jobject callback_op, jobject op_data)
 {
     herr_t   status = -1;
     jint    *theArray = NULL;
@@ -5478,9 +5682,9 @@ Java_hdf_hdf5lib_H5_H5Piterate(JNIEnv *env, jclass clss, jlong prop_id, jintArra
             theArray = (jint *)ENVPTR->GetIntArrayElements(ENVPAR idx, &isCopy);
             if (theArray == NULL) {
                 h5JNIFatalError(env, "H5Piterate:  idx not pinned");
-                return -1;
             } /* end if */
-            status = H5Piterate((hid_t)prop_id, (int*)&theArray[0], (H5P_iterate_t)H5P_iterate_cb, (void*)op_data);
+            else
+                status = H5Piterate((hid_t)prop_id, (int*)&theArray[0], (H5P_iterate_t)H5P_iterate_cb, (void*)op_data);
         } /* end else */
 
         if (status < 0) {
@@ -5492,7 +5696,7 @@ Java_hdf_hdf5lib_H5_H5Piterate(JNIEnv *env, jclass clss, jlong prop_id, jintArra
             ENVPTR->ReleaseIntArrayElements(ENVPAR idx, theArray, 0);
     } /* end else */
 
-    return status;
+    return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Piterate */
 
 /*
@@ -5501,7 +5705,8 @@ Java_hdf_hdf5lib_H5_H5Piterate(JNIEnv *env, jclass clss, jlong prop_id, jintArra
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts(JNIEnv *env, jclass clss, jlong plist_id)
+Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts
+    (JNIEnv *env, jclass clss, jlong plist_id)
 {
     unsigned attempts;
     if (H5Pget_metadata_read_attempts((hid_t)plist_id, &attempts) < 0)
@@ -5516,7 +5721,8 @@ Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts(JNIEnv *env, jclass clss, j
  * Signature: (JJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Pset_1metadata_1read_1attempts(JNIEnv *env, jclass clss, jlong plist_id, jlong attempts)
+Java_hdf_hdf5lib_H5_H5Pset_1metadata_1read_1attempts
+    (JNIEnv *env, jclass clss, jlong plist_id, jlong attempts)
 {
      if (attempts <= 0) {
          h5badArgument(env, "H5Pset_metadata_read_attempts:  attempts <= 0");
diff --git a/java/src/jni/h5pImp.h b/java/src/jni/h5pImp.h
index 997a8f1..d413f69 100644
--- a/java/src/jni/h5pImp.h
+++ b/java/src/jni/h5pImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -23,13 +21,13 @@
 extern "C" {
 #endif /* __cplusplus */
 
-
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Pcreate
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcreate
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Pcreate
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -37,7 +35,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcreate
  * Method:    H5Pclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Pclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Pclose
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -45,7 +44,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Pclose
  * Method:    H5Pget_class
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1class
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -53,7 +53,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class
  * Method:    H5Pcopy
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcopy
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Pcopy
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -61,7 +62,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcopy
  * Method:    H5Pget_version
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1version
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1version
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -69,7 +71,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1version
  * Method:    H5Pset_userblock
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1userblock
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1userblock
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -77,7 +80,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1userblock
  * Method:    H5Pget_userblock
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1userblock
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1userblock
 (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -85,7 +89,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1userblock
  * Method:    H5Pset_sizes
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sizes
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1sizes
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -93,7 +98,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sizes
  * Method:    H5Pget_sizes
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sizes
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1sizes
 (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -101,7 +107,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sizes
  * Method:    H5Pset_sym_k
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sym_1k
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1sym_1k
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -109,7 +116,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sym_1k
  * Method:    H5Pget_sym_k
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sym_1k
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1sym_1k
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -117,7 +125,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sym_1k
  * Method:    H5Pset_istore_k
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1istore_1k
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1istore_1k
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -125,7 +134,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1istore_1k
  * Method:    H5Pget_istore_k
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1istore_1k
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1istore_1k
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -133,7 +143,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1istore_1k
  * Method:    H5Pset_layout
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1layout
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1layout
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -141,7 +152,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1layout
  * Method:    H5Pget_layout
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1layout
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1layout
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -149,7 +161,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1layout
  * Method:    H5Pset_chunk
  * Signature: (JI[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1chunk
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1chunk
 (JNIEnv *, jclass, jlong, jint, jbyteArray);
 
 /*
@@ -157,7 +170,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1chunk
  * Method:    H5Pget_chunk
  * Signature: (JI[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1chunk
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1chunk
 (JNIEnv *, jclass, jlong, jint, jlongArray);
 
 /*
@@ -165,7 +179,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1chunk
  * Method:    H5Pset_alignment
  * Signature: (JJJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1alignment
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1alignment
 (JNIEnv *, jclass, jlong, jlong, jlong);
 
 /*
@@ -173,7 +188,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1alignment
  * Method:    H5Pget_alignment
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1alignment
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1alignment
 (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -181,7 +197,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1alignment
  * Method:    H5Pset_external
  * Signature: (JLjava/lang/String;JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1external
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1external
 (JNIEnv *, jclass, jlong, jstring, jlong, jlong);
 
 /*
@@ -189,7 +206,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1external
  * Method:    H5Pget_external_count
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1external_1count
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1external_1count
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -197,7 +215,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1external_1count
  * Method:    H5Pget_external
  * Signature: (JIJ[Ljava/lang/String;[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1external
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1external
 (JNIEnv *, jclass, jlong, jint, jlong, jobjectArray, jlongArray);
 
 /*
@@ -205,7 +224,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1external
  * Method:    H5Pset_fill_value
  * Signature: (JJ[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fill_1value
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fill_1value
 (JNIEnv *, jclass, jlong, jlong, jbyteArray);
 
 /*
@@ -213,7 +233,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fill_1value
  * Method:    H5Pget_fill_value
  * Signature: (JJ[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fill_1value
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fill_1value
 (JNIEnv *, jclass, jlong, jlong, jbyteArray);
 
 /*
@@ -221,7 +242,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fill_1value
  * Method:    H5Pset_filter
  * Signature: (JIIJ[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1filter
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1filter
 (JNIEnv *, jclass, jlong, jint, jint, jlong, jintArray);
 
 /*
@@ -229,7 +251,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1filter
  * Method:    H5Pget_nfilters
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nfilters
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1nfilters
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -237,7 +260,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nfilters
  * Method:    H5Pget_filter
  * Signature: (JI[I[J[IJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1filter
 (JNIEnv *, jclass, jlong, jint, jintArray, jlongArray, jintArray, jlong, jobjectArray);
 
 /*
@@ -245,7 +269,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter
  * Method:    H5Pget_driver
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1driver
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1driver
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -253,7 +278,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1driver
  * Method:    H5Pset_cache
  * Signature: (JIJJD)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1cache
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1cache
 (JNIEnv *, jclass, jlong, jint, jlong, jlong, jdouble);
 
 /*
@@ -261,7 +287,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1cache
  * Method:    H5Pget_cache
  * Signature: (J[I[J[J[D)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1cache
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1cache
 (JNIEnv *, jclass, jlong, jintArray, jlongArray, jlongArray, jdoubleArray);
 
 /*
@@ -269,7 +296,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1cache
  * Method:    H5Pset_buffer
  * Signature: (JJ[B[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1buffer
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1buffer
 (JNIEnv *, jclass, jlong, jlong, jbyteArray, jbyteArray);
 
 /*
@@ -277,7 +305,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1buffer
  * Method:    H5Pget_buffer
  * Signature: (J[B[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1buffer
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1buffer
 (JNIEnv *, jclass, jlong, jbyteArray, jbyteArray);
 
 /*
@@ -285,7 +314,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1buffer
  * Method:    H5Pset_buffer_size
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -293,7 +323,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1buffer_1size
  * Method:    H5Pget_buffer_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -301,7 +332,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1buffer_1size
  * Method:    H5Pset_preserve
  * Signature: (JZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1preserve
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1preserve
 (JNIEnv *, jclass, jlong, jboolean);
 
 /*
@@ -309,7 +341,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1preserve
  * Method:    H5Pget_preserve
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1preserve
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1preserve
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -317,7 +350,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1preserve
  * Method:    H5Pset_deflate
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1deflate
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1deflate
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -325,7 +359,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1deflate
  * Method:    H5Pset_gc_references
  * Signature: (JZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1gc_1references
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1gc_1references
 (JNIEnv *, jclass, jlong, jboolean);
 
 /*
@@ -333,7 +368,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1gc_1references
  * Method:    H5Pget_gc_references
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1gc_1references
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1gc_1references
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -341,7 +377,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1gc_1references
  * Method:    H5Pset_btree_ratios
  * Signature: (JDDD)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios
 (JNIEnv *, jclass, jlong, jdouble, jdouble, jdouble);
 
 /*
@@ -349,7 +386,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1btree_1ratios
  * Method:    H5Pget_btree_ratios
  * Signature: (J[D[D[D)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios
 (JNIEnv *, jclass, jlong, jdoubleArray, jdoubleArray, jdoubleArray);
 
 /*
@@ -357,7 +395,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1btree_1ratios
  * Method:    H5Pset_small_data_block_size
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -365,7 +404,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1small_1data_1block_1size
  * Method:    H5Pget_small_data_block_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -373,7 +413,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1small_1data_1block_1size
  * Method:    H5Pset_alloc_time
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -381,7 +422,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1alloc_1time
  * Method:    H5Pget_alloc_time
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -389,7 +431,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1alloc_1time
  * Method:    H5Pset_fill_time
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fill_1time
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fill_1time
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -397,7 +440,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fill_1time
  * Method:    H5Pget_fill_time
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fill_1time
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fill_1time
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -405,7 +449,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fill_1time
  * Method:    H5Pfill_value_defined
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -413,7 +458,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pfill_1value_1defined
  * Method:    H5Pset_fletcher32
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fletcher32
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fletcher32
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -421,7 +467,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fletcher32
  * Method:    H5Pset_edc_check
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1edc_1check
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1edc_1check
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -429,7 +476,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1edc_1check
  * Method:    H5Pget_edc_check
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1edc_1check
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1edc_1check
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -437,7 +485,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1edc_1check
  * Method:    H5Pset_shuffle
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shuffle
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1shuffle
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -445,7 +494,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shuffle
  * Method:    H5Pset_szip
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1szip
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1szip
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -453,7 +503,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1szip
  * Method:    H5Pset_hyper_vector_size
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -461,7 +512,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1hyper_1vector_1size
  * Method:    H5Pget_hyper_vector_size
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size
 (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -469,7 +521,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1hyper_1vector_1size
  * Method:    H5Pall_filters_avail
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -477,7 +530,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pall_1filters_1avail
  * Method:    H5Pmodify_filter
  * Signature: (JIIJ[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pmodify_1filter
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pmodify_1filter
 (JNIEnv *, jclass, jlong, jint, jint, jlong, jintArray);
 
 /*
@@ -485,7 +539,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pmodify_1filter
  * Method:    H5Pget_filter_by_id
  * Signature: (JI[I[J[IJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id
 (JNIEnv *, jclass, jlong, jint, jintArray, jlongArray, jintArray, jlong, jobjectArray);
 
 /*
@@ -493,7 +548,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id
  * Method:    H5Pset_fclose_degree
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -501,7 +557,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fclose_1degree
  * Method:    H5Pget_fclose_degree
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -509,7 +566,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fclose_1degree
  * Method:    H5Pset_fapl_family
  * Signature: (JJJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family
 (JNIEnv *, jclass, jlong, jlong, jlong);
 
 /*
@@ -517,7 +575,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1family
  * Method:    H5Pget_fapl_family
  * Signature: (J[J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family
 (JNIEnv *, jclass, jlong, jlongArray, jlongArray);
 
 /*
@@ -525,7 +584,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1family
  * Method:    H5Pset_fapl_core
  * Signature: (JJZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core
 (JNIEnv *, jclass, jlong, jlong, jboolean);
 
 /*
@@ -533,7 +593,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1core
  * Method:    H5Pget_fapl_core
  * Signature: (J[J[Z)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core
 (JNIEnv *, jclass, jlong, jlongArray, jbooleanArray);
 
 /*
@@ -541,7 +602,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1core
  * Method:    H5Pset_family_offset
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1family_1offset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1family_1offset
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -549,7 +611,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1family_1offset
  * Method:    H5Pget_family_offset
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1family_1offset
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1family_1offset
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -557,7 +620,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1family_1offset
  * Method:    H5Pset_fapl_log
  * Signature: (JLjava/lang/String;JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log
 (JNIEnv *, jclass, jlong, jstring, jlong, jlong);
 
 /*
@@ -565,7 +629,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1log
  * Method:    H5Premove_filter
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5P1remove_1filter
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5P1remove_1filter
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -573,7 +638,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5P1remove_1filter
  * Method:    H5Pset
  * Signature: (JLjava/lang/String;I)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pset
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pset
 (JNIEnv *, jclass, jlong, jstring, jint);
 
 /*
@@ -581,7 +647,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pset
  * Method:    H5Pexist
  * Signature: (JLjava/lang/String;)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pexist
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pexist
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -589,7 +656,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pexist
  * Method:    H5Pget_size
  * Signature: (JLjava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1size
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -597,7 +665,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1size
  * Method:    H5Pget_nprops
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nprops
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1nprops
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -605,7 +674,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nprops
  * Method:    H5Pget_class_name
  * Signature: (J)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class_1name
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1class_1name
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -613,7 +683,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class_1name
  * Method:    H5Pget_class_parent
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class_1parent
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1class_1parent
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -621,7 +692,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1class_1parent
  * Method:    H5Pisa_class
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pisa_1class
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pisa_1class
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -629,7 +701,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pisa_1class
  * Method:    H5Pget
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -637,7 +710,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget
  * Method:    H5Pequal
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pequal
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pequal
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -645,7 +719,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pequal
  * Method:    H5Pcopy_prop
  * Signature: (JJLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pcopy_1prop
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pcopy_1prop
 (JNIEnv *, jclass, jlong, jlong, jstring);
 
 /*
@@ -653,7 +728,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pcopy_1prop
  * Method:    H5Premove
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Premove
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Premove
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -661,7 +737,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Premove
  * Method:    H5Punregister
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Punregister
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Punregister
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -669,7 +746,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Punregister
  * Method:    _H5Pclose_class
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Pclose_1class
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Pclose_1class
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -677,7 +755,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Pclose_1class
  * Method:    H5Pget_filter2
  * Signature: (JI[I[J[IJ[Ljava/lang/String;[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter2
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1filter2
 (JNIEnv *, jclass, jlong, jint, jintArray, jlongArray, jintArray, jlong, jobjectArray, jintArray);
 
 /*
@@ -685,7 +764,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter2
  * Method:    H5Pget_filter_by_id2
  * Signature: (JI[I[J[IJ[Ljava/lang/String;[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2
 (JNIEnv *, jclass, jlong, jint, jintArray, jlongArray, jintArray, jlong, jobjectArray, jintArray);
 
 /*
@@ -693,7 +773,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1filter_1by_1id2
  * Method:    H5Pget_nlinks
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nlinks
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1nlinks
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -701,7 +782,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1nlinks
  * Method:    H5Pset_nlinks
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1nlinks
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1nlinks
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -709,7 +791,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1nlinks
  * Method:    H5Pget_libver_bounds
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -717,7 +800,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1libver_1bounds
  * Method:    H5Pset_libver_bounds
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -725,7 +809,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1libver_1bounds
  * Method:    H5Pget_link_creation_order
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -733,7 +818,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1link_1creation_1order
  * Method:    H5Pset_link_creation_order
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -741,7 +827,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1link_1creation_1order
  * Method:    H5Pget_attr_creation_order
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -749,7 +836,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1attr_1creation_1order
  * Method:    H5Pset_attr_creation_order
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -757,7 +845,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1attr_1creation_1order
  * Method:    H5Pset_copy_object
  * Signature: (JI)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1copy_1object
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1copy_1object
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -765,7 +854,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1copy_1object
  * Method:    H5Pget_copy_object
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1copy_1object
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1copy_1object
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -773,7 +863,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1copy_1object
  * Method:    H5Pset_create_intermediate_group
  * Signature: (JZ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group
 (JNIEnv *, jclass, jlong, jboolean);
 
 /*
@@ -781,7 +872,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1create_1intermediate_1group
  * Method:    H5Pget_create_intermediate_group
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1group
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1group
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -789,7 +881,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1create_1intermediate_1gro
  * Method:    H5Pset_data_transform
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1data_1transform
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1data_1transform
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -797,7 +890,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1data_1transform
  * Method:    H5Pget_data_transform
  * Signature: (J[Ljava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1data_1transform
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1data_1transform
 (JNIEnv *, jclass, jlong, jobjectArray, jlong);
 
 /*
@@ -805,7 +899,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1data_1transform
  * Method:    H5Pget_elink_acc_flags
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -813,7 +908,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1acc_1flags
  * Method:    H5Pset_elink_acc_flags
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -821,7 +917,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1acc_1flags
  * Method:    H5Pset_link_phase_change
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -829,7 +926,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1link_1phase_1change
  * Method:    H5Pget_link_phase_change
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -837,7 +935,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1link_1phase_1change
  * Method:    H5Pget_attr_phase_change
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -845,7 +944,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1attr_1phase_1change
  * Method:    H5Pset_attr_phase_change
  * Signature: (JII)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -853,7 +953,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1attr_1phase_1change
  * Method:    H5Pget_shared_mesg_phase_change
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -861,7 +962,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1phase_1change
  * Method:    H5Pset_shared_mesg_phase_change
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -869,7 +971,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1phase_1change
  * Method:    H5Pget_shared_mesg_nindexes
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -877,7 +980,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1nindexes
  * Method:    H5Pset_shared_mesg_nindexes
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -885,7 +989,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1nindexes
  * Method:    H5Pset_shared_mesg_index
  * Signature: (JIII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index
 (JNIEnv *, jclass, jlong, jint, jint, jint);
 
 /*
@@ -893,7 +998,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1shared_1mesg_1index
  * Method:    H5Pget_shared_mesg_index
  * Signature: (JI[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index
 (JNIEnv *, jclass, jlong, jint, jintArray);
 
 /*
@@ -901,7 +1007,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1shared_1mesg_1index
  * Method:    H5Pset_local_heap_size_hint
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -909,7 +1016,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1local_1heap_1size_1hint
  * Method:    H5Pget_local_heap_size_hint
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -917,7 +1025,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1local_1heap_1size_1hint
  * Method:    H5Pset_nbit
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1nbit
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1nbit
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -925,7 +1034,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1nbit
  * Method:    H5Pset_scaleoffset
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -933,7 +1043,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1scaleoffset
  * Method:    H5Pset_est_link_info
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info
 (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -941,7 +1052,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1est_1link_1info
  * Method:    H5Pget_est_link_info
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info
 (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -949,7 +1061,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1est_1link_1info
  * Method:    H5Pset_elink_fapl
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -957,7 +1070,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1fapl
  * Method:    _H5Pget_elink_fapl
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -965,7 +1079,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pget_1elink_1fapl
  * Method:    H5Pset_elink_prefix
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix
 (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -973,7 +1088,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1prefix
  * Method:    H5Pget_elink_prefix
  * Signature: (J[Ljava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix
 (JNIEnv *, jclass, jlong, jobjectArray);
 
 /*
@@ -981,7 +1097,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1prefix
  * Method:    H5Pset_fapl_direct
  * Signature: (JJJJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct
 (JNIEnv *, jclass, jlong, jlong, jlong, jlong);
 
 /*
@@ -989,7 +1106,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1direct
  * Method:    H5Pget_fapl_direct
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct
 (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -997,7 +1115,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1direct
  * Method:    H5Pset_fapl_sec2
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1005,7 +1124,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1sec2
  * Method:    H5Pset_fapl_stdio
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1013,7 +1133,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1stdio
  * Method:    H5Pset_fapl_windows
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1021,7 +1142,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1windows
  * Method:    H5Pget_fapl_muti
  * Signature: (J[I[J[Ljava/lang/String;[J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi
 (JNIEnv *, jclass, jlong, jintArray, jlongArray, jobjectArray, jlongArray);
 
 /*
@@ -1029,7 +1151,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1fapl_1multi
  * Method:    H5Pset_fapl_muti
  * Signature: (J[I[J[Ljava/lang/String;[JZ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi
 (JNIEnv *, jclass, jlong, jintArray, jlongArray, jobjectArray, jlongArray, jboolean);
 
 /*
@@ -1037,7 +1160,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1multi
  * Method:    H5Pset_fapl_split
  * Signature: (JLjava/lang/String;JLjava/lang/String;J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split
 (JNIEnv *, jclass, jlong, jstring, jlong, jstring, jlong);
 
 /*
@@ -1045,7 +1169,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1fapl_1split
  * Method:    H5Pset_meta_block_size
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1053,7 +1178,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1meta_1block_1size
  * Method:    H5Pget_meta_block_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1061,7 +1187,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1meta_1block_1size
  * Method:    H5Pset_sieve_buf_size
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1069,7 +1196,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1sieve_1buf_1size
  * Method:    H5Pget_sieve_buf_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1077,7 +1205,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1sieve_1buf_1size
  * Method:    H5Pset_elink_file_cache_size
  * Signature: (JI)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -1085,7 +1214,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1elink_1file_1cache_1size
  * Method:    H5Pget_elink_file_cache_size
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size
 (JNIEnv *, jclass, jlong);
 
 
@@ -1094,7 +1224,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1elink_1file_1cache_1size
  * Method:    H5Pget_mdc_config
  * Signature: (J)Lhdf/hdf5lib/structs/H5AC_cache_config_t;
  */
-JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config
+JNIEXPORT jobject JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1102,7 +1233,8 @@ JNIEXPORT jobject JNICALL Java_hdf_hdf5lib_H5_H5Pget_1mdc_1config
  * Method:    H5Pset_mdc_config
  * Signature: (JLhdf/hdf5lib/structs/H5AC_cache_config_t;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config
 (JNIEnv *, jclass, jlong, jobject);
 
 /*
@@ -1110,7 +1242,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1mdc_1config
  * Method:    H5Pset_chunk_cache
  * Signature: (JJJD)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache
 (JNIEnv *, jclass, jlong, jlong, jlong, jdouble);
 
 /*
@@ -1118,7 +1251,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1chunk_1cache
  * Method:    H5Pget_chunk_cache
  * Signature: (J[J[J[D)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache
 (JNIEnv *, jclass, jlong, jlongArray, jlongArray, jdoubleArray);
 
 /*
@@ -1126,7 +1260,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pget_1chunk_1cache
  * Method:    H5Pget_obj_track_times
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1134,7 +1269,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Pget_1obj_1track_1times
  * Method:    H5Pset_obj_track_times
  * Signature: (JZ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times
 (JNIEnv *, jclass, jlong, jboolean);
 
 /*
@@ -1142,7 +1278,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1obj_1track_1times
  * Method:    H5Pget_char_encoding
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1150,7 +1287,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1char_1encoding
  * Method:    H5Pset_char_encoding
  * Signature: (JI)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -1158,7 +1296,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1char_1encoding
  * Method:    H5Pset_virtual
  * Signature: (JJLjava/lang/String;Ljava/lang/String;J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1virtual
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1virtual
 (JNIEnv *, jclass, jlong, jlong, jstring, jstring, jlong);
 
 /*
@@ -1166,7 +1305,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1virtual
  * Method:    H5Pget_virtual_count
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1174,7 +1314,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1count
  * Method:    H5Pget_virtual_vspace
  * Signature: (JJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1182,7 +1323,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1vspace
  * Method:    H5Pget_virtual_srcspace
  * Signature: (JJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1190,7 +1332,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1srcspace
  * Method:    H5Pget_virtual_filename
  * Signature: (JJ)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1198,7 +1341,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1filename
  * Method:    H5Pget_virtual_dsetname
  * Signature: (JJ)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1206,7 +1350,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1dsetname
  * Method:    H5Pget_virtual_view
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1214,7 +1359,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1view
  * Method:    H5Pset_virtual_view
  * Signature: (JI)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view
 (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -1222,7 +1368,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1virtual_1view
  * Method:    H5Pget_virtual_printf_gap
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap
 (JNIEnv *, jclass, jlong);
 
 /*
@@ -1230,32 +1377,71 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1virtual_1printf_1gap
  * Method:    H5Pset_virtual_printf_gap
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1virtual_1printf_1gap
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1virtual_1printf_1gap
 (JNIEnv *, jclass, jlong, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Pget_file_space
- * Signature: (J[I[J)V
+ * Method:    H5Pget_file_space_strategy
+ * Signature: (J[Z[J)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy
+(JNIEnv *, jclass, jlong, jbooleanArray, jlongArray);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pget_file_space_strategy_persist
+ * Signature: (J)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy_1persist
+(JNIEnv *, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pget_file_space_strategy_threshold
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1strategy_1threshold
+(JNIEnv *, jclass, jlong);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pset_file_space_strategy
+ * Signature: (JIZJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pget_1file_1space
-(JNIEnv *, jclass, jlong, jintArray, jlongArray);
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1file_1space_1strategy
+(JNIEnv *, jclass, jlong, jint, jboolean, jlong);
 
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5Pget_file_space_page_size
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1file_1space_1page_1size
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Pset_file_space
- * Signature: (JIJ)V
+ * Method:    H5Pset_file_space_page_size
+ * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1file_1space
-(JNIEnv *, jclass, jlong, jint, jlong);
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1file_1space_1page_1size
+(JNIEnv *, jclass, jlong, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Pset_mdc_log_options
  * Signature: (JZLjava/lang/String;Z)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options
 (JNIEnv *, jclass, jlong, jboolean, jstring, jboolean);
 
 /*
@@ -1263,7 +1449,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1mdc_1log_1options
  * Method:    H5Pget_mdc_log_options
  * Signature: (J[Z)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options
 (JNIEnv *, jclass, jlong, jbooleanArray);
 
 /*
@@ -1271,7 +1458,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Pget_1mdc_1log_1options
  * Method:    H5Pset_append_flush
  * Signature: (JI[JLjava/lang/Object;Ljava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1append_1flush
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1append_1flush
   (JNIEnv*, jclass, jlong, jint, jlongArray, jobject, jobject);
 
 /*
@@ -1279,14 +1467,16 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1append_1flush
  * Method:    _H5Pcreate_class_nocb
  * Signature: (JLjava/lang/String;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Pcreate_1class_1nocb
   (JNIEnv*, jclass, jlong, jstring);
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    _H5Pcreate_class
  * Signature: (JLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcreate_1class
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Pcreate_1class
   (JNIEnv*, jclass, jlong, jstring, jobject, jobject, jobject, jobject, jobject, jobject);
 
 /*
@@ -1294,7 +1484,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Pcreate_1class
  * Method:    H5Pregister2_nocb
  * Signature: (JLjava/lang/String;J[B)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pregister2_1nocb
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pregister2_1nocb
   (JNIEnv*, jclass, jlong, jstring, jlong, jbyteArray);
 
 /*
@@ -1302,7 +1493,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pregister2_1nocb
  * Method:    H5Pregister2
  * Signature: (JLjava/lang/String;J[BLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pregister2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pregister2
   (JNIEnv*, jclass, jlong, jstring, jlong, jbyteArray, jobject, jobject, jobject, jobject, jobject, jobject, jobject);
 
 /*
@@ -1310,7 +1502,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pregister2
  * Method:    H5Pinsert2_nocb
  * Signature: (JLjava/lang/String;J[B)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb
   (JNIEnv*, jclass, jlong, jstring, jlong, jbyteArray);
 
 /*
@@ -1318,7 +1511,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pinsert2_1nocb
  * Method:    H5Pinsert2
  * Signature: (JLjava/lang/String;J[BLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pinsert2
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pinsert2
   (JNIEnv*, jclass, jlong, jstring, jlong, jbyteArray, jobject, jobject, jobject, jobject, jobject, jobject);
 
 /*
@@ -1326,7 +1520,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pinsert2
  * Method:    H5Piterate
  * Signature: (J[ILjava/lang/Object;Ljava/lang/Object;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Piterate
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Piterate
   (JNIEnv*, jclass, jlong, jintArray, jobject, jobject);
 
 /*
@@ -1334,7 +1529,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Piterate
  * Method:    H5Pget_metadata_read_attempts
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts
 (JNIEnv *, jclass, jlong);
 
 
@@ -1343,7 +1539,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Pget_1metadata_1read_1attempts
  * Method:    H5Pset_metadata_read_attempts
  * Signature: (JJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Pset_1metadata_1read_1attempts
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Pset_1metadata_1read_1attempts
 (JNIEnv *, jclass, jlong, jlong);
 
 
diff --git a/java/src/jni/h5plImp.c b/java/src/jni/h5plImp.c
index dfaeb53..f064634 100644
--- a/java/src/jni/h5plImp.c
+++ b/java/src/jni/h5plImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -36,28 +34,189 @@ extern jobject visit_callback;
  * Method:    H5PLset_loading_state
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5PLset_1loading_1state
-  (JNIEnv *env, jclass clss, jint plugin_flags)
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLset_1loading_1state
+    (JNIEnv *env, jclass clss, jint plugin_flags)
 {
     if (H5PLset_loading_state((unsigned int)plugin_flags) < 0) {
         h5libraryError(env);
     }
-}
+} /* end Java_hdf_hdf5lib_H5_H5PLset_1loading_1state */
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5PLget_loading_state
  * Signature: (V)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5PLget_1loading_1state
-  (JNIEnv *env, jclass clss)
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5PLget_1loading_1state
+    (JNIEnv *env, jclass clss)
 {
     unsigned int plugin_type = 0;
     if (H5PLget_loading_state(&plugin_type) < 0) {
         h5libraryError(env);
     }
     return (jint)plugin_type;
-}
+} /* end Java_hdf_hdf5lib_H5_H5PLget_1loading_1state */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLappend
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLappend
+  (JNIEnv *env, jclass clss, jobjectArray plugin_path)
+{
+    char *aName;
+    herr_t retVal = -1;
+
+    PIN_JAVA_STRING(plugin_path, aName);
+    if (aName != NULL) {
+        retVal = H5PLappend(aName);
+
+        UNPIN_JAVA_STRING(plugin_path, aName);
+
+        if (retVal < 0)
+            h5libraryError(env);
+    }
+} /* end Java_hdf_hdf5lib_H5_H5PLappend */
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLprepend
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLprepend
+  (JNIEnv *env, jclass clss, jobjectArray plugin_path)
+{
+    char *aName;
+    herr_t retVal = -1;
+
+    PIN_JAVA_STRING(plugin_path, aName);
+    if (aName != NULL) {
+        retVal = H5PLprepend(aName);
+
+        UNPIN_JAVA_STRING(plugin_path, aName);
+
+        if (retVal < 0)
+            h5libraryError(env);
+    }
+} /* end Java_hdf_hdf5lib_H5_H5PLprepend */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLreplace
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLreplace
+  (JNIEnv *env, jclass clss, jobjectArray plugin_path, jint index)
+{
+    char *aName;
+    herr_t retVal = -1;
+
+    PIN_JAVA_STRING(plugin_path, aName);
+    if (aName != NULL) {
+        retVal = H5PLreplace(aName, index);
+
+        UNPIN_JAVA_STRING(plugin_path, aName);
+
+        if (retVal < 0)
+            h5libraryError(env);
+    }
+} /* end Java_hdf_hdf5lib_H5_H5PLreplace */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLinsert
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLinsert
+  (JNIEnv *env, jclass clss, jobjectArray plugin_path, jint index)
+{
+    char *aName;
+    herr_t retVal = -1;
+
+    PIN_JAVA_STRING(plugin_path, aName);
+    if (aName != NULL) {
+        retVal = H5PLinsert(aName, index);
+
+        UNPIN_JAVA_STRING(plugin_path, aName);
+
+        if (retVal < 0)
+            h5libraryError(env);
+    }
+} /* end Java_hdf_hdf5lib_H5_H5PLinsert */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLremove
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLremove
+  (JNIEnv *env, jclass clss, jint index)
+{
+    if (H5PLremove(index) < 0)
+      h5libraryError(env);
+} /* end Java_hdf_hdf5lib_H5_H5PLremove */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLget
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5PLget
+  (JNIEnv *env, jclass clss, jint index)
+{
+    char *aName;
+    jstring  str = NULL;
+    ssize_t  buf_size;
+
+    /* get the length of the name */
+    buf_size = H5PLget(index, NULL, 0);
+
+    if (buf_size <= 0) {
+        h5badArgument(env, "H5PLget:  buf_size <= 0");
+    } /* end if */
+    else {
+        buf_size++; /* add extra space for the null terminator */
+        aName = (char*)HDmalloc(sizeof(char) * (size_t)buf_size);
+        if (aName == NULL) {
+            h5outOfMemory(env, "H5PLget:  malloc failed");
+        } /* end if */
+        else {
+            buf_size = H5PLget(index, aName, (size_t)buf_size);
+            if (buf_size < 0) {
+                h5libraryError(env);
+            } /* end if */
+            else {
+                str = ENVPTR->NewStringUTF(ENVPAR aName);
+            }
+            HDfree(aName);
+        }
+    }
+    return str;
+} /* end Java_hdf_hdf5lib_H5_H5PLget */
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLsize
+ * Signature: (V)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5PLsize
+  (JNIEnv *env, jclass clss)
+{
+    unsigned int listsize = 0;
+    if (H5PLsize(&listsize) < 0) {
+        h5libraryError(env);
+    }
+    return (jint)listsize;
+} /* end Java_hdf_hdf5lib_H5_H5PLsize */
 
 #ifdef __cplusplus
 } /* end extern "C" */
diff --git a/java/src/jni/h5plImp.h b/java/src/jni/h5plImp.h
index 7c55bf4..5336621 100644
--- a/java/src/jni/h5plImp.h
+++ b/java/src/jni/h5plImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    H5PLset_loading_state
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5PLset_1loading_1state
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLset_1loading_1state
   (JNIEnv *, jclass, jint);
 
 /*
@@ -36,7 +35,71 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5PLset_1loading_1state
  * Method:    H5PLget_loading_state
  * Signature: (V)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5PLget_1loading_1state
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5PLget_1loading_1state
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLappend
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLappend
+  (JNIEnv *, jclass, jobjectArray);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLprepend
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLprepend
+  (JNIEnv *, jclass, jobjectArray);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLreplace
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLreplace
+  (JNIEnv *, jclass, jobjectArray, jint);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLinsert
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLinsert
+  (JNIEnv *, jclass, jobjectArray, jint);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLremove
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5PLremove
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLget
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5PLget
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5PLsize
+ * Signature: (V)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5PLsize
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5rImp.c b/java/src/jni/h5rImp.c
index 9b19bfb..b250550 100644
--- a/java/src/jni/h5rImp.c
+++ b/java/src/jni/h5rImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 #ifdef __cplusplus
@@ -38,52 +36,49 @@ extern jobject visit_callback;
  * Signature: ([BJLjava/lang/String;IJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Rcreate(JNIEnv *env, jclass clss, jbyteArray ref, jlong loc_id, jstring name, jint ref_type, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Rcreate
+    (JNIEnv *env, jclass clss, jbyteArray ref, jlong loc_id, jstring name, jint ref_type, jlong space_id)
 {
     const char *rName;
     herr_t      status = -1;
     jbyte      *refP;
     jboolean    isCopy2;
 
-    PIN_JAVA_STRING(name, rName, -1);
-
-    if (ref == NULL) {
-        UNPIN_JAVA_STRING(name, rName);
-        h5nullArgument( env, "H5Rcreate:  ref is NULL");
-    } /* end if */
-    else {
-        if ((ref_type == H5R_OBJECT) && ENVPTR->GetArrayLength(ENVPAR ref) != H5R_OBJ_REF_BUF_SIZE) {
-            UNPIN_JAVA_STRING(name, rName);
-            h5badArgument( env, "H5Rcreate:  ref input array != H5R_OBJ_REF_BUF_SIZE");
+    PIN_JAVA_STRING(name, rName);
+    if (rName != NULL) {
+        if (ref == NULL) {
+            h5nullArgument( env, "H5Rcreate:  ref is NULL");
         } /* end if */
-        else if ((ref_type == H5R_DATASET_REGION) && ENVPTR->GetArrayLength(ENVPAR ref) != H5R_DSET_REG_REF_BUF_SIZE) {
-            UNPIN_JAVA_STRING(name, rName);
-            h5badArgument( env, "H5Rcreate:  region ref input array != H5R_DSET_REG_REF_BUF_SIZE");
-        } /* end else if */
-        else if ((ref_type != H5R_OBJECT) && (ref_type != H5R_DATASET_REGION)) {
-            UNPIN_JAVA_STRING(name, rName);
-            h5badArgument( env, "H5Rcreate:  ref_type unknown type ");
-        } /* end else if */
         else {
-            refP = (jbyte*)ENVPTR->GetByteArrayElements(ENVPAR ref, &isCopy2);
-            if (refP == NULL) {
-                UNPIN_JAVA_STRING(name, rName);
-                h5JNIFatalError(env,  "H5Rcreate:  ref not pinned");
+            if ((ref_type == H5R_OBJECT) && ENVPTR->GetArrayLength(ENVPAR ref) != H5R_OBJ_REF_BUF_SIZE) {
+                h5badArgument( env, "H5Rcreate:  ref input array != H5R_OBJ_REF_BUF_SIZE");
             } /* end if */
+            else if ((ref_type == H5R_DATASET_REGION) && ENVPTR->GetArrayLength(ENVPAR ref) != H5R_DSET_REG_REF_BUF_SIZE) {
+                h5badArgument( env, "H5Rcreate:  region ref input array != H5R_DSET_REG_REF_BUF_SIZE");
+            } /* end else if */
+            else if ((ref_type != H5R_OBJECT) && (ref_type != H5R_DATASET_REGION)) {
+                h5badArgument( env, "H5Rcreate:  ref_type unknown type ");
+            } /* end else if */
             else {
-                status = H5Rcreate(refP, (hid_t)loc_id, rName, (H5R_type_t)ref_type, (hid_t)space_id);
-
-                UNPIN_JAVA_STRING(name, rName);
-                if (status < 0) {
-                    ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, JNI_ABORT);
-                    h5libraryError(env);
+                refP = (jbyte*)ENVPTR->GetByteArrayElements(ENVPAR ref, &isCopy2);
+                if (refP == NULL) {
+                    h5JNIFatalError(env,  "H5Rcreate:  ref not pinned");
                 } /* end if */
                 else {
-                    ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, 0);
+                    status = H5Rcreate(refP, (hid_t)loc_id, rName, (H5R_type_t)ref_type, (hid_t)space_id);
+
+                    if (status < 0) {
+                        ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, JNI_ABORT);
+                        h5libraryError(env);
+                    } /* end if */
+                    else {
+                        ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, 0);
+                    } /* end else */
                 } /* end else */
             } /* end else */
         } /* end else */
-    } /* end else */
+        UNPIN_JAVA_STRING(name, rName);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Rcreate */
@@ -94,7 +89,8 @@ Java_hdf_hdf5lib_H5_H5Rcreate(JNIEnv *env, jclass clss, jbyteArray ref, jlong lo
  * Signature: (JJI[B)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Rdereference(JNIEnv *env, jclass clss, jlong dataset, jlong access_list, jint ref_type, jbyteArray ref)
+Java_hdf_hdf5lib_H5__1H5Rdereference
+    (JNIEnv *env, jclass clss, jlong dataset, jlong access_list, jint ref_type, jbyteArray ref)
 {
     jboolean isCopy;
     jbyte   *refP;
@@ -133,7 +129,8 @@ Java_hdf_hdf5lib_H5__1H5Rdereference(JNIEnv *env, jclass clss, jlong dataset, jl
  * Signature: (JI[B)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Rget_1region(JNIEnv *env, jclass clss, jlong dataset, jint ref_type, jbyteArray ref)
+Java_hdf_hdf5lib_H5__1H5Rget_1region
+    (JNIEnv *env, jclass clss, jlong dataset, jint ref_type, jbyteArray ref)
 {
     hid_t    retVal = -1;
     jboolean isCopy;
@@ -172,7 +169,8 @@ Java_hdf_hdf5lib_H5__1H5Rget_1region(JNIEnv *env, jclass clss, jlong dataset, ji
  * Signature: (JI[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Rget_1obj_1type(JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref)
+Java_hdf_hdf5lib_H5_H5Rget_1obj_1type
+    (JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref)
 {
     int      retVal =-1;
     jboolean isCopy;
@@ -209,7 +207,8 @@ Java_hdf_hdf5lib_H5_H5Rget_1obj_1type(JNIEnv *env, jclass clss, jlong loc_id, ji
  * Signature: (JI[B[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2(JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref, jintArray ref_obj)
+Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2
+    (JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref, jintArray ref_obj)
 {
 
     jint     status;
@@ -261,7 +260,8 @@ Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2(JNIEnv *env, jclass clss, jlong loc_id, j
  * Signature: (JI[B[Ljava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Rget_1name(JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref, jobjectArray name, jlong size)
+Java_hdf_hdf5lib_H5_H5Rget_1name
+    (JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref, jobjectArray name, jlong size)
 {
     jlong    ret_val = -1;
     jbyte   *refP;
diff --git a/java/src/jni/h5rImp.h b/java/src/jni/h5rImp.h
index 2afb345..e28329b 100644
--- a/java/src/jni/h5rImp.h
+++ b/java/src/jni/h5rImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    H5Rcreate
  * Signature: ([BJLjava/lang/String;IJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rcreate
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Rcreate
   (JNIEnv *, jclass, jbyteArray, jlong, jstring, jint, jlong);
 
 /*
@@ -36,7 +35,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rcreate
  * Method:    _H5Rdereference
  * Signature: (JJI[B)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Rdereference
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Rdereference
   (JNIEnv *, jclass, jlong, jlong, jint, jbyteArray);
 
 /*
@@ -44,7 +44,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Rdereference
  * Method:    H5Rget_region
  * Signature: (JI[B)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Rget_1region
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Rget_1region
   (JNIEnv *, jclass, jlong, jint, jbyteArray);
 
 /*
@@ -52,7 +53,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Rget_1region
  * Method:    H5G_obj_t H5Rget_obj_type
  * Signature: (JI[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Rget_1obj_1type
   (JNIEnv *, jclass, jlong, jint, jbyteArray);
 
 /*
@@ -60,7 +62,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type
  * Method:    int H5Rget_obj_type2
  * Signature: (JI[B[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2
   (JNIEnv *, jclass, jlong, jint, jbyteArray, jintArray);
 
 /*
@@ -68,7 +71,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2
  * Method:    H5Rget_name
  * Signature: (JI[B[Ljava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Rget_1name
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Rget_1name
   (JNIEnv *, jclass, jlong, jint, jbyteArray, jobjectArray, jlong);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5sImp.c b/java/src/jni/h5sImp.c
index 2aad3d0..c578ab8 100644
--- a/java/src/jni/h5sImp.c
+++ b/java/src/jni/h5sImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -37,7 +35,8 @@ extern jobject visit_callback;
  * Signature: (I)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Screate(JNIEnv *env, jclass clss, jint type)
+Java_hdf_hdf5lib_H5__1H5Screate
+    (JNIEnv *env, jclass clss, jint type)
 {
     hid_t retVal = -1;
 
@@ -54,8 +53,8 @@ Java_hdf_hdf5lib_H5__1H5Screate(JNIEnv *env, jclass clss, jint type)
  * Signature: (I[J[J)G
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Screate_1simple(JNIEnv *env, jclass clss, jint rank,
-        jlongArray dims, jlongArray maxdims)
+Java_hdf_hdf5lib_H5__1H5Screate_1simple
+    (JNIEnv *env, jclass clss, jint rank, jlongArray dims, jlongArray maxdims)
 {
     hid_t retVal = -1;
     jlong *dimsP, *maxdimsP;
@@ -159,7 +158,8 @@ Java_hdf_hdf5lib_H5__1H5Screate_1simple(JNIEnv *env, jclass clss, jint rank,
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Scopy(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5__1H5Scopy
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     hid_t retVal = -1;
 
@@ -185,7 +185,8 @@ Java_hdf_hdf5lib_H5__1H5Scopy(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (JII[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1elements(JNIEnv *env, jclass clss, jlong space_id, jint op, jint num_elemn, jlongArray coord)
+Java_hdf_hdf5lib_H5_H5Sselect_1elements
+    (JNIEnv *env, jclass clss, jlong space_id, jint op, jint num_elemn, jlongArray coord)
 {
     herr_t status = -1;
     jint i;
@@ -231,8 +232,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1elements(JNIEnv *env, jclass clss, jlong space_id
  * Signature: (JII[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1elements(JNIEnv *env, jclass clss, jlong space_id, jint op,
-        jint num_elemn, jbyteArray coord)
+Java_hdf_hdf5lib_H5_H5Sselect_1elements
+    (JNIEnv *env, jclass clss, jlong space_id, jint op, jint num_elemn, jbyteArray coord)
 {
     int      ii;
     hsize_t *lp = NULL;
@@ -285,7 +286,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1elements(JNIEnv *env, jclass clss, jlong space_id
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1all(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sselect_1all
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     herr_t retVal = -1;
 
@@ -302,7 +304,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1all(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1none(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sselect_1none
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     herr_t retVal = -1;
 
@@ -319,7 +322,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1none(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1valid(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sselect_1valid
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -338,7 +342,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1valid(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1npoints(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1npoints
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     hssize_t retVal = H5Sget_simple_extent_npoints(space_id);
 
@@ -354,7 +359,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1npoints(JNIEnv *env, jclass clss, jl
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1npoints(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1npoints
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     hssize_t retVal = H5Sget_select_npoints(space_id);
 
@@ -370,7 +376,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1npoints(JNIEnv *env, jclass clss, jlong spac
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1type(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1type
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     int retVal = -1;
 
@@ -387,7 +394,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1type(JNIEnv *env, jclass clss, jlong space_i
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1ndims(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1ndims
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     int retVal = -1;
 
@@ -404,8 +412,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1ndims(JNIEnv *env, jclass clss, jlon
  * Signature: (J[J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1dims(JNIEnv *env, jclass clss, jlong space_id,
-        jlongArray dims, jlongArray maxdims)
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1dims
+    (JNIEnv *env, jclass clss, jlong space_id, jlongArray dims, jlongArray maxdims)
 {
     int status = -1;
     jlong *dimsP, *maxdimsP;
@@ -511,7 +519,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1dims(JNIEnv *env, jclass clss, jlong
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1type(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1type
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     H5S_class_t retVal = H5S_NO_CLASS;
 
@@ -529,8 +538,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1type(JNIEnv *env, jclass clss, jlong
  * Signature: (JI[J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple(JNIEnv *env, jclass clss, jlong space_id,
-        jint rank, jlongArray dims, jlongArray maxdims)
+Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple
+    (JNIEnv *env, jclass clss, jlong space_id, jint rank, jlongArray dims, jlongArray maxdims)
 {
     herr_t status = -1;
     jlong *dimsP, *maxdimsP;
@@ -615,7 +624,7 @@ Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple(JNIEnv *env, jclass clss, jlong space
         h5libraryError(env);
 
     return (jint)status;
-} /* end v */
+} /* end Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple */
 
 /*
  * Class:     hdf_hdf5lib_H5
@@ -623,7 +632,8 @@ Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple(JNIEnv *env, jclass clss, jlong space
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Sis_1simple(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sis_1simple
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -642,7 +652,8 @@ Java_hdf_hdf5lib_H5_H5Sis_1simple(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (J[B)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Soffset_1simple(JNIEnv *env, jclass clss, jlong space_id, jbyteArray offset)
+Java_hdf_hdf5lib_H5_H5Soffset_1simple
+    (JNIEnv *env, jclass clss, jlong space_id, jbyteArray offset)
 {
     herr_t    status;
     jbyte    *P = NULL;
@@ -697,7 +708,8 @@ Java_hdf_hdf5lib_H5_H5Soffset_1simple(JNIEnv *env, jclass clss, jlong space_id,
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sextent_1copy(JNIEnv *env, jclass clss, jlong space_id, jlong src_id)
+Java_hdf_hdf5lib_H5_H5Sextent_1copy
+    (JNIEnv *env, jclass clss, jlong space_id, jlong src_id)
 {
     herr_t retVal = -1;
 
@@ -714,7 +726,8 @@ Java_hdf_hdf5lib_H5_H5Sextent_1copy(JNIEnv *env, jclass clss, jlong space_id, jl
  * Signature: (JJ)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Sextent_1equal(JNIEnv *env, jclass clss, jlong space_id, jlong src_id)
+Java_hdf_hdf5lib_H5_H5Sextent_1equal
+    (JNIEnv *env, jclass clss, jlong space_id, jlong src_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -733,7 +746,8 @@ Java_hdf_hdf5lib_H5_H5Sextent_1equal(JNIEnv *env, jclass clss, jlong space_id, j
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sset_1extent_1none(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5_H5Sset_1extent_1none
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     herr_t retVal = -1;
 
@@ -750,8 +764,8 @@ Java_hdf_hdf5lib_H5_H5Sset_1extent_1none(JNIEnv *env, jclass clss, jlong space_i
  * Signature: (JI[J[J[J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sselect_1hyperslab(JNIEnv *env, jclass clss, jlong space_id, jint op,
-        jlongArray start, jlongArray stride, jlongArray count, jlongArray block)
+Java_hdf_hdf5lib_H5_H5Sselect_1hyperslab
+    (JNIEnv *env, jclass clss, jlong space_id, jint op, jlongArray start, jlongArray stride, jlongArray count, jlongArray block)
 {
     herr_t status = -1;
     jlong *startP, *strideP, *countP, *blockP;
@@ -919,7 +933,8 @@ Java_hdf_hdf5lib_H5_H5Sselect_1hyperslab(JNIEnv *env, jclass clss, jlong space_i
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Sclose(JNIEnv *env, jclass clss, jlong space_id)
+Java_hdf_hdf5lib_H5__1H5Sclose
+    (JNIEnv *env, jclass clss, jlong space_id)
 {
     herr_t retVal = -1;
 
@@ -936,7 +951,8 @@ Java_hdf_hdf5lib_H5__1H5Sclose(JNIEnv *env, jclass clss, jlong space_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1nblocks(JNIEnv *env, jclass clss, jlong spaceid)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1nblocks
+    (JNIEnv *env, jclass clss, jlong spaceid)
 {
     hssize_t retVal = -1;
 
@@ -953,7 +969,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1nblocks(JNIEnv *env, jclass clss, jlo
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1npoints(JNIEnv *env, jclass clss, jlong spaceid)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1npoints
+    (JNIEnv *env, jclass clss, jlong spaceid)
 {
     hssize_t retVal = -1;
 
@@ -970,8 +987,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1npoints(JNIEnv *env, jclass clss, jlon
  * Signature: (JJJ[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1blocklist(JNIEnv *env, jclass clss,
-        jlong spaceid, jlong startblock, jlong numblocks, jlongArray buf)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1blocklist
+    (JNIEnv *env, jclass clss, jlong spaceid, jlong startblock, jlong numblocks, jlongArray buf)
 {
     herr_t status = -1;
     jlong *bufP;
@@ -1035,8 +1052,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1blocklist(JNIEnv *env, jclass clss,
  * Signature: (JJJ[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1pointlist(JNIEnv *env, jclass clss, jlong spaceid,
-        jlong startpoint, jlong numpoints, jlongArray buf)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1pointlist
+    (JNIEnv *env, jclass clss, jlong spaceid, jlong startpoint, jlong numpoints, jlongArray buf)
 {
     herr_t status = -1;
     jlong *bufP;
@@ -1095,8 +1112,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1pointlist(JNIEnv *env, jclass clss, jl
  * Signature: (J[J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1select_1bounds(JNIEnv *env, jclass clss, jlong spaceid,
-        jlongArray start, jlongArray end)
+Java_hdf_hdf5lib_H5_H5Sget_1select_1bounds
+    (JNIEnv *env, jclass clss, jlong spaceid, jlongArray start, jlongArray end)
 {
     herr_t status = -1;
     jlong *startP, *endP;
@@ -1172,7 +1189,8 @@ Java_hdf_hdf5lib_H5_H5Sget_1select_1bounds(JNIEnv *env, jclass clss, jlong space
  * Signature: (J)[B
  */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_H5_H5Sencode(JNIEnv *env, jclass cls, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Sencode
+    (JNIEnv *env, jclass cls, jlong obj_id)
 {
     herr_t status = -1;
     unsigned char *bufPtr;
@@ -1221,7 +1239,8 @@ Java_hdf_hdf5lib_H5_H5Sencode(JNIEnv *env, jclass cls, jlong obj_id)
  * Signature: ([B)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Sdecode(JNIEnv *env, jclass cls, jbyteArray buf)
+Java_hdf_hdf5lib_H5_H5Sdecode
+    (JNIEnv *env, jclass cls, jbyteArray buf)
 {
     hid_t sid = -1;
     jbyte *bufP;
@@ -1254,7 +1273,8 @@ Java_hdf_hdf5lib_H5_H5Sdecode(JNIEnv *env, jclass cls, jbyteArray buf)
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab(JNIEnv *env, jclass cls, jlong obj_id)
+Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab
+    (JNIEnv *env, jclass cls, jlong obj_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -1273,8 +1293,8 @@ Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab(JNIEnv *env, jclass cls, jlong obj
  * Signature: (J[J[J[J[J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Sget_1regular_1hyperslab(JNIEnv *env, jclass clss, jlong space_id,
-        jlongArray start, jlongArray stride, jlongArray count, jlongArray block)
+Java_hdf_hdf5lib_H5_H5Sget_1regular_1hyperslab
+    (JNIEnv *env, jclass clss, jlong space_id, jlongArray start, jlongArray stride, jlongArray count, jlongArray block)
 {
     herr_t status;
     jlong *startP, *strideP, *countP, *blockP;
diff --git a/java/src/jni/h5sImp.h b/java/src/jni/h5sImp.h
index 007b9a7..141e504 100644
--- a/java/src/jni/h5sImp.h
+++ b/java/src/jni/h5sImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,24 +26,27 @@ extern "C" {
  * Method:    _H5Screate
  * Signature: (I)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Screate(
-        JNIEnv *, jclass, jint);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Screate
+(JNIEnv *, jclass, jint);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    _H5Screate_simple
  * Signature: (I[J[J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Screate_1simple(
-        JNIEnv *, jclass, jint, jlongArray, jlongArray);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Screate_1simple
+(JNIEnv *, jclass, jint, jlongArray, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    _H5Scopy
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Scopy(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Scopy
+(JNIEnv *, jclass, jlong);
 
 #ifdef notdef
 // 10/28/99 -- added code to copy the array -- this is not used,
@@ -61,7 +62,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Scopy(
  * Method:    H5Sselect_elements
  * Signature: (JII[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1elements
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sselect_1elements
 (JNIEnv *, jclass, jlong, jint, jint, jlongArray);
 #endif
 
@@ -70,119 +72,133 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1elements
  * Method:    H5Sselect_elements
  * Signature: (JII[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1elements(
-        JNIEnv *, jclass, jlong, jint, jint, jbyteArray);
+JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1elements
+(JNIEnv *, jclass, jlong, jint, jint, jbyteArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sselect_all
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1all(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sselect_1all
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sselect_none
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1none(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sselect_1none
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sselect_valid
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1valid(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Sselect_1valid
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_simple_extent_npoints
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1npoints(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1npoints
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_npoints
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1npoints(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1npoints
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_type
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1type(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1type
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_simple_extent_ndims
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1ndims(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1ndims
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_simple_extent_dims
  * Signature: (J[J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1dims(
-        JNIEnv *, jclass, jlong, jlongArray, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1dims
+(JNIEnv *, jclass, jlong, jlongArray, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_simple_extent_type
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1type(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1simple_1extent_1type
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sset_extent_simple
  * Signature: (JI[J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple(
-        JNIEnv *, jclass, jlong, jint, jlongArray, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sset_1extent_1simple
+(JNIEnv *, jclass, jlong, jint, jlongArray, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sis_simple
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sis_1simple(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Sis_1simple
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Soffset_simple
  * Signature: (J[B)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Soffset_1simple(
-        JNIEnv *, jclass, jlong, jbyteArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Soffset_1simple
+(JNIEnv *, jclass, jlong, jbyteArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sextent_copy
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sextent_1copy(
-        JNIEnv *, jclass, jlong, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sextent_1copy
+(JNIEnv *, jclass, jlong, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sextent_equal
  * Signature: (JJ)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sextent_1equal
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Sextent_1equal
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -190,71 +206,80 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sextent_1equal
  * Method:    H5Sset_extent_none
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sset_1extent_1none(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sset_1extent_1none
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sselect_hyperslab
  * Signature: (JI[J[J[J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sselect_1hyperslab(
-        JNIEnv *, jclass, jlong, jint, jlongArray, jlongArray, jlongArray, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sselect_1hyperslab
+(JNIEnv *, jclass, jlong, jint, jlongArray, jlongArray, jlongArray, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Sclose(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Sclose
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_hyper_nblocks
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1nblocks(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1nblocks
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_elem_npoints
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1npoints(
-        JNIEnv *, jclass, jlong);
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1npoints
+(JNIEnv *, jclass, jlong);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_hyper_blocklist
  * Signature: (JJJ[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1blocklist(
-        JNIEnv *, jclass, jlong, jlong, jlong, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1hyper_1blocklist
+(JNIEnv *, jclass, jlong, jlong, jlong, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_elem_pointlist
  * Signature: (JJJ[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1pointlist(
-        JNIEnv *, jclass, jlong, jlong, jlong, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1elem_1pointlist
+(JNIEnv *, jclass, jlong, jlong, jlong, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sget_select_bounds
  * Signature: (J[J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Sget_1select_1bounds(
-        JNIEnv *, jclass, jlong, jlongArray, jlongArray);
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1select_1bounds
+(JNIEnv *, jclass, jlong, jlongArray, jlongArray);
 
 /*
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Sencode
  * Signature: (J)[B
  */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_H5_H5Sencode
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_H5_H5Sencode
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -262,7 +287,8 @@ JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_H5_H5Sencode
  * Method:    H5Sdecode
  * Signature: ([B)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sdecode
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Sdecode
   (JNIEnv *, jclass, jbyteArray);
 
 /*
@@ -270,7 +296,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Sdecode
  * Method:    H5Sis_regular_hyperslab
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -278,8 +305,9 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Sis_1regular_1hyperslab
  * Method:    H5Sget_regular_hyperslab
  * Signature: (J[J[J[J[J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Sget_1regular_1hyperslab(
-        JNIEnv *, jclass, jlong, jlongArray, jlongArray, jlongArray, jlongArray);
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Sget_1regular_1hyperslab
+(JNIEnv *, jclass, jlong, jlongArray, jlongArray, jlongArray, jlongArray);
 
 #ifdef __cplusplus
 } /* end extern "C" */
diff --git a/java/src/jni/h5tImp.c b/java/src/jni/h5tImp.c
index 7280aed..7b4af56 100644
--- a/java/src/jni/h5tImp.c
+++ b/java/src/jni/h5tImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -40,19 +38,21 @@ extern jobject visit_callback;
  * Signature: (JLjava/lang/String;J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Topen2(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist)
+Java_hdf_hdf5lib_H5__1H5Topen2
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong access_plist)
 {
-    hid_t       status;
+    hid_t       status = -1;
     const char *tName;
 
-    PIN_JAVA_STRING(name, tName, -1);
+    PIN_JAVA_STRING(name, tName);
+    if (tName != NULL) {
+        status = H5Topen2((hid_t)loc_id, tName, (hid_t)access_plist);
 
-    status = H5Topen2((hid_t)loc_id, tName, (hid_t)access_plist);
+        UNPIN_JAVA_STRING(name, tName);
 
-    UNPIN_JAVA_STRING(name, tName);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jlong)status;
 } /* end Java_hdf_hdf5lib_H5__1H5Topen2 */
@@ -63,7 +63,8 @@ Java_hdf_hdf5lib_H5__1H5Topen2(JNIEnv *env, jclass clss, jlong loc_id, jstring n
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Tcommitted(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tcommitted
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -82,7 +83,8 @@ Java_hdf_hdf5lib_H5_H5Tcommitted(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (IJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tcreate(JNIEnv *env, jclass clss, jint dclass, jlong size)
+Java_hdf_hdf5lib_H5__1H5Tcreate
+    (JNIEnv *env, jclass clss, jint dclass, jlong size)
 {
     hid_t retVal = -1;
 
@@ -95,11 +97,12 @@ Java_hdf_hdf5lib_H5__1H5Tcreate(JNIEnv *env, jclass clss, jint dclass, jlong siz
 
 /*
  * Class:     hdf_hdf5lib_H5
- * Method:    H5Tcopy
+ * Method:    _H5Tcopy
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tcopy(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5__1H5Tcopy
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     hid_t retVal = -1;
 
@@ -116,7 +119,8 @@ Java_hdf_hdf5lib_H5__1H5Tcopy(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JJ)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Tequal(JNIEnv *env, jclass clss, jlong type_id1, jlong type_id2)
+Java_hdf_hdf5lib_H5_H5Tequal
+    (JNIEnv *env, jclass clss, jlong type_id1, jlong type_id2)
 {
     htri_t bval = JNI_FALSE;
 
@@ -135,7 +139,8 @@ Java_hdf_hdf5lib_H5_H5Tequal(JNIEnv *env, jclass clss, jlong type_id1, jlong typ
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tlock(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tlock
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     herr_t retVal = -1;
 
@@ -152,7 +157,8 @@ Java_hdf_hdf5lib_H5_H5Tlock(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1class(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1class
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_class_t retVal = H5T_NO_CLASS;
 
@@ -169,7 +175,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1class(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1size(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1size
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     size_t retVal = 0;
 
@@ -186,7 +193,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1size(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1size(JNIEnv *env, jclass clss, jlong type_id, jlong size)
+Java_hdf_hdf5lib_H5_H5Tset_1size
+    (JNIEnv *env, jclass clss, jlong type_id, jlong size)
 {
     size_t tsize = (size_t)size;
     herr_t retVal = -1;
@@ -204,7 +212,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1size(JNIEnv *env, jclass clss, jlong type_id, jlong
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1order(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1order
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_order_t retVal = H5T_ORDER_ERROR;
 
@@ -221,7 +230,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1order(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1order(JNIEnv *env, jclass clss, jlong type_id, jint order)
+Java_hdf_hdf5lib_H5_H5Tset_1order
+    (JNIEnv *env, jclass clss, jlong type_id, jint order)
 {
     herr_t retVal = -1;
 
@@ -238,7 +248,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1order(JNIEnv *env, jclass clss, jlong type_id, jint
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1precision(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1precision
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     size_t retVal = 0;
 
@@ -255,7 +266,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1precision(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1precision_1long(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1precision_1long
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     size_t retVal = 0;
 
@@ -272,7 +284,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1precision_1long(JNIEnv *env, jclass clss, jlong type
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1precision(JNIEnv *env, jclass clss, jlong type_id, jlong precision)
+Java_hdf_hdf5lib_H5_H5Tset_1precision
+    (JNIEnv *env, jclass clss, jlong type_id, jlong precision)
 {
     herr_t retVal = -1;
 
@@ -289,7 +302,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1precision(JNIEnv *env, jclass clss, jlong type_id, j
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1offset(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1offset
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     int retVal = -1;
 
@@ -306,7 +320,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1offset(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1offset(JNIEnv *env, jclass clss, jlong type_id, jlong offset)
+Java_hdf_hdf5lib_H5_H5Tset_1offset
+    (JNIEnv *env, jclass clss, jlong type_id, jlong offset)
 {
     herr_t retVal = -1;
 
@@ -323,7 +338,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1offset(JNIEnv *env, jclass clss, jlong type_id, jlon
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1pad(JNIEnv *env, jclass clss, jlong type_id, jintArray pad)
+Java_hdf_hdf5lib_H5_H5Tget_1pad
+    (JNIEnv *env, jclass clss, jlong type_id, jintArray pad)
 {
     herr_t   status = -1;
     jboolean isCopy;
@@ -358,7 +374,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1pad(JNIEnv *env, jclass clss, jlong type_id, jintArr
  * Signature: (JII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1pad(JNIEnv *env, jclass clss, jlong type_id, jint lsb, jint msb)
+Java_hdf_hdf5lib_H5_H5Tset_1pad
+    (JNIEnv *env, jclass clss, jlong type_id, jint lsb, jint msb)
 {
     herr_t retVal = -1;
 
@@ -375,7 +392,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1pad(JNIEnv *env, jclass clss, jlong type_id, jint ls
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1sign(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1sign
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_sign_t retVal = H5T_SGN_ERROR;
 
@@ -392,7 +410,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1sign(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1sign(JNIEnv *env, jclass clss, jlong type_id, jint sign)
+Java_hdf_hdf5lib_H5_H5Tset_1sign
+    (JNIEnv *env, jclass clss, jlong type_id, jint sign)
 {
     herr_t retVal = -1;
 
@@ -409,7 +428,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1sign(JNIEnv *env, jclass clss, jlong type_id, jint s
  * Signature: (J[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1fields_1int(JNIEnv *env, jclass clss, jlong type_id, jintArray fields)
+Java_hdf_hdf5lib_H5_H5Tget_1fields_1int
+    (JNIEnv *env, jclass clss, jlong type_id, jintArray fields)
 {
     herr_t   status;
     jboolean isCopy;
@@ -447,7 +467,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1fields_1int(JNIEnv *env, jclass clss, jlong type_id,
  * Signature: (J[J)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1fields(JNIEnv *env, jclass clss, jlong type_id, jlongArray fields)
+Java_hdf_hdf5lib_H5_H5Tget_1fields
+    (JNIEnv *env, jclass clss, jlong type_id, jlongArray fields)
 {
     herr_t   status;
     jboolean isCopy;
@@ -507,7 +528,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1fields(JNIEnv *env, jclass clss, jlong type_id, jlon
  * Signature: (JJJJJJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1fields(JNIEnv *env, jclass clss, jlong type_id, jlong spos, jlong epos,
+Java_hdf_hdf5lib_H5_H5Tset_1fields
+    (JNIEnv *env, jclass clss, jlong type_id, jlong spos, jlong epos,
         jlong esize, jlong mpos, jlong msize)
 {
     if (H5Tset_fields((hid_t)type_id, (size_t)spos, (size_t)epos, (size_t)esize, (size_t)mpos, (size_t)msize) < 0)
@@ -520,7 +542,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1fields(JNIEnv *env, jclass clss, jlong type_id, jlon
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1ebias(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1ebias
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     size_t retVal = 0;
 
@@ -537,7 +560,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1ebias(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     size_t retVal = 0;
 
@@ -554,7 +578,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1ebias(JNIEnv *env, jclass clss, jlong type_id, jlong ebias)
+Java_hdf_hdf5lib_H5_H5Tset_1ebias
+    (JNIEnv *env, jclass clss, jlong type_id, jlong ebias)
 {
     herr_t retVal = -1;
 
@@ -571,7 +596,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1ebias(JNIEnv *env, jclass clss, jlong type_id, jlong
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1norm(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1norm
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_norm_t retVal = H5T_NORM_ERROR;
 
@@ -588,7 +614,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1norm(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1norm(JNIEnv *env, jclass clss, jlong type_id, jint norm)
+Java_hdf_hdf5lib_H5_H5Tset_1norm
+    (JNIEnv *env, jclass clss, jlong type_id, jint norm)
 {
     herr_t retVal = -1;
 
@@ -605,7 +632,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1norm(JNIEnv *env, jclass clss, jlong type_id, jint n
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1inpad(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1inpad
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_pad_t retVal = H5T_PAD_ERROR;
 
@@ -622,7 +650,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1inpad(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1inpad(JNIEnv *env, jclass clss, jlong type_id, jint inpad)
+Java_hdf_hdf5lib_H5_H5Tset_1inpad
+    (JNIEnv *env, jclass clss, jlong type_id, jint inpad)
 {
     herr_t retVal = -1;
 
@@ -639,7 +668,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1inpad(JNIEnv *env, jclass clss, jlong type_id, jint
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1cset(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1cset
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_cset_t retVal = H5T_CSET_ERROR;
 
@@ -656,7 +686,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1cset(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1cset(JNIEnv *env, jclass clss, jlong type_id, jint cset)
+Java_hdf_hdf5lib_H5_H5Tset_1cset
+    (JNIEnv *env, jclass clss, jlong type_id, jint cset)
 {
     herr_t retVal = -1;
 
@@ -673,7 +704,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1cset(JNIEnv *env, jclass clss, jlong type_id, jint c
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1strpad(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1strpad
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     H5T_str_t retVal = H5T_STR_ERROR;
 
@@ -690,7 +722,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1strpad(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1strpad(JNIEnv *env, jclass clss, jlong type_id, jint strpad)
+Java_hdf_hdf5lib_H5_H5Tset_1strpad
+    (JNIEnv *env, jclass clss, jlong type_id, jint strpad)
 {
     herr_t retVal = -1;
 
@@ -707,7 +740,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1strpad(JNIEnv *env, jclass clss, jlong type_id, jint
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1nmembers(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1nmembers
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     int retVal = -1;
 
@@ -724,7 +758,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1nmembers(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (JI)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1name(JNIEnv *env, jclass clss, jlong type_id, jint field_idx)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1name
+    (JNIEnv *env, jclass clss, jlong type_id, jint field_idx)
 {
     char   *name;
     jstring str = NULL;
@@ -747,19 +782,21 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1name(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (JLjava/lang/String)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1index(JNIEnv *env, jclass clss, jlong type_id, jstring field_name)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1index
+    (JNIEnv *env, jclass clss, jlong type_id, jstring field_name)
 {
     const char *tName;
     int         index = -1;
 
-    PIN_JAVA_STRING(field_name, tName, -1);
+    PIN_JAVA_STRING(field_name, tName);
+    if (tName != NULL) {
+        index = H5Tget_member_index((hid_t)type_id, tName);
 
-    index = H5Tget_member_index((hid_t)type_id, tName);
+        UNPIN_JAVA_STRING(field_name, tName);
 
-    UNPIN_JAVA_STRING(field_name, tName);
-
-    if (index < 0)
-        h5libraryError(env);
+        if (index < 0)
+            h5libraryError(env);
+    }
 
     return (jint)index;
 } /* end Java_hdf_hdf5lib_H5_H5Tget_1member_1index */
@@ -770,7 +807,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1index(JNIEnv *env, jclass clss, jlong type_i
  * Signature: (JI)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tget_1member_1type(JNIEnv *env, jclass clss, jlong type_id, jint field_idx)
+Java_hdf_hdf5lib_H5__1H5Tget_1member_1type
+    (JNIEnv *env, jclass clss, jlong type_id, jint field_idx)
 {
     hid_t retVal = -1;
 
@@ -787,7 +825,8 @@ Java_hdf_hdf5lib_H5__1H5Tget_1member_1type(JNIEnv *env, jclass clss, jlong type_
  * Signature: (JI)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1offset(JNIEnv *env, jclass clss, jlong type_id, jint memno)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1offset
+    (JNIEnv *env, jclass clss, jlong type_id, jint memno)
 {
     return (jlong)H5Tget_member_offset((hid_t)type_id, (unsigned)memno);
 } /* end Java_hdf_hdf5lib_H5_H5Tget_1member_1offset */
@@ -798,7 +837,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1offset(JNIEnv *env, jclass clss, jlong type_
  * Signature: (JI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1class(JNIEnv *env, jclass clss, jlong type_id, jint memno)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1class
+    (JNIEnv *env, jclass clss, jlong type_id, jint memno)
 {
     int retVal = -1;
 
@@ -815,19 +855,21 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1class(JNIEnv *env, jclass clss, jlong type_i
  * Signature: (JLjava/lang/String;JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tinsert(JNIEnv *env, jclass clss, jlong type_id, jstring name, jlong offset, jlong field_id)
+Java_hdf_hdf5lib_H5_H5Tinsert
+    (JNIEnv *env, jclass clss, jlong type_id, jstring name, jlong offset, jlong field_id)
 {
-    herr_t      status;
+    herr_t      status = -1;
     const char *tName;
     long        off = (long)offset;
 
-    PIN_JAVA_STRING(name, tName, -1);
+    PIN_JAVA_STRING(name, tName);
+    if (tName != NULL) {
+        status = H5Tinsert((hid_t)type_id, tName, (size_t)off, field_id);
 
-    status = H5Tinsert((hid_t)type_id, tName, (size_t)off, field_id);
-
-    UNPIN_JAVA_STRING(name,tName);
-    if (status < 0)
-        h5libraryError(env);
+        UNPIN_JAVA_STRING(name,tName);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Tinsert */
@@ -838,7 +880,8 @@ Java_hdf_hdf5lib_H5_H5Tinsert(JNIEnv *env, jclass clss, jlong type_id, jstring n
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tpack(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tpack
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     herr_t retVal = -1;
 
@@ -855,7 +898,8 @@ Java_hdf_hdf5lib_H5_H5Tpack(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5__1H5Tclose(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5__1H5Tclose
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     herr_t retVal = -1;
 
@@ -872,7 +916,8 @@ Java_hdf_hdf5lib_H5__1H5Tclose(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tvlen_1create(JNIEnv *env, jclass clss, jlong base_id)
+Java_hdf_hdf5lib_H5__1H5Tvlen_1create
+    (JNIEnv *env, jclass clss, jlong base_id)
 {
     hid_t retVal = -1;
 
@@ -889,19 +934,21 @@ Java_hdf_hdf5lib_H5__1H5Tvlen_1create(JNIEnv *env, jclass clss, jlong base_id)
  * Signature: (JLjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tset_1tag(JNIEnv *env, jclass clss, jlong type, jstring tag)
+Java_hdf_hdf5lib_H5_H5Tset_1tag
+    (JNIEnv *env, jclass clss, jlong type, jstring tag)
 {
     herr_t      status = -1;
     const char *tagP;
 
-    PIN_JAVA_STRING(tag, tagP, -1);
+    PIN_JAVA_STRING(tag, tagP);
+    if (tagP != NULL) {
+        status = H5Tset_tag((hid_t)type, tagP);
 
-    status = H5Tset_tag((hid_t)type, tagP);
+        UNPIN_JAVA_STRING(tag,tagP);
 
-    UNPIN_JAVA_STRING(tag,tagP);
-
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 
     return (jint)status;
 } /* end Java_hdf_hdf5lib_H5_H5Tset_1tag */
@@ -912,7 +959,8 @@ Java_hdf_hdf5lib_H5_H5Tset_1tag(JNIEnv *env, jclass clss, jlong type, jstring ta
  * Signature: (J)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1tag(JNIEnv *env, jclass clss, jlong type)
+Java_hdf_hdf5lib_H5_H5Tget_1tag
+    (JNIEnv *env, jclass clss, jlong type)
 {
     jstring str = NULL;
     char   *tag;
@@ -935,7 +983,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1tag(JNIEnv *env, jclass clss, jlong type)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tget_1super(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5__1H5Tget_1super
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     hid_t retVal = -1;
 
@@ -952,7 +1001,8 @@ Java_hdf_hdf5lib_H5__1H5Tget_1super(JNIEnv *env, jclass clss, jlong type_id)
  * Signature: (J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tenum_1create(JNIEnv *env, jclass clss, jlong base_id)
+Java_hdf_hdf5lib_H5__1H5Tenum_1create
+    (JNIEnv *env, jclass clss, jlong base_id)
 {
     hid_t retVal = -1;
 
@@ -969,7 +1019,8 @@ Java_hdf_hdf5lib_H5__1H5Tenum_1create(JNIEnv *env, jclass clss, jlong base_id)
  * Signature: (JLjava/lang/String;[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int(JNIEnv *env, jclass clss, jlong type_id, jstring name, jintArray value)
+Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int
+    (JNIEnv *env, jclass clss, jlong type_id, jstring name, jintArray value)
 {
     herr_t      status = -1;
     jint       *intP;
@@ -980,23 +1031,22 @@ Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int(JNIEnv *env, jclass clss, jlong type_id
         h5nullArgument(env, "H5Tenum_insert:  value is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING(name, nameP, -1);
+        PIN_JAVA_STRING(name, nameP);
+        if (nameP != NULL) {
+            intP = ENVPTR->GetIntArrayElements(ENVPAR value, &isCopy2);
+            if (intP == NULL) {
+                h5JNIFatalError(env, "H5Tenum_insert:  value not pinned");
+            } /* end if */
+            else {
+                status = H5Tenum_insert((hid_t)type_id, nameP, intP);
 
-        intP = ENVPTR->GetIntArrayElements(ENVPAR value, &isCopy2);
-        if (intP == NULL) {
-            UNPIN_JAVA_STRING(name, nameP);
-            h5JNIFatalError(env, "H5Tenum_insert:  value not pinned");
-            return -1;
-        } /* end if */
-        else {
-            status = H5Tenum_insert((hid_t)type_id, nameP, intP);
+                ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, JNI_ABORT);
 
+                if (status < 0)
+                    h5libraryError(env);
+            } /* end else */
             UNPIN_JAVA_STRING(name, nameP);
-            ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, JNI_ABORT);
-
-            if (status < 0)
-                h5libraryError(env);
-        } /* end else */
+        }
     } /* end else */
 
     return (jint)status;
@@ -1008,7 +1058,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (JLjava/lang/String;[B)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1insert(JNIEnv *env, jclass clss, jlong type_id, jstring name, jbyteArray value)
+Java_hdf_hdf5lib_H5_H5Tenum_1insert
+    (JNIEnv *env, jclass clss, jlong type_id, jstring name, jbyteArray value)
 {
     herr_t      status = -1;
     jbyte      *byteP;
@@ -1019,22 +1070,22 @@ Java_hdf_hdf5lib_H5_H5Tenum_1insert(JNIEnv *env, jclass clss, jlong type_id, jst
         h5nullArgument(env, "H5Tenum_insert:  value is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING0(name, nameP);
+        PIN_JAVA_STRING(name, nameP);
+        if (nameP != NULL) {
+            byteP = ENVPTR->GetByteArrayElements(ENVPAR value, &isCopy2);
+            if (byteP == NULL) {
+                h5JNIFatalError(env, "H5Tenum_insert:  value not pinned");
+            } /* end if */
+            else {
+                status = H5Tenum_insert((hid_t)type_id, nameP, byteP);
 
-        byteP = ENVPTR->GetByteArrayElements(ENVPAR value, &isCopy2);
-        if (byteP == NULL) {
-            UNPIN_JAVA_STRING(name, nameP);
-            h5JNIFatalError(env, "H5Tenum_insert:  value not pinned");
-        } /* end if */
-        else {
-            status = H5Tenum_insert((hid_t)type_id, nameP, byteP);
+                ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
 
+                if (status < 0)
+                    h5libraryError(env);
+            } /* end else */
             UNPIN_JAVA_STRING(name, nameP);
-            ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
-
-            if (status < 0)
-                h5libraryError(env);
-        } /* end else */
+        }
     } /* end else */
 } /* end Java_hdf_hdf5lib_H5_H5Tenum_1insert */
 
@@ -1044,7 +1095,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1insert(JNIEnv *env, jclass clss, jlong type_id, jst
  * Signature: (J[I[Ljava/lang/String;I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int(JNIEnv *env, jclass clss, jlong type_id, jintArray value, jobjectArray name,
+Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int
+    (JNIEnv *env, jclass clss, jlong type_id, jintArray value, jobjectArray name,
           jint size)
 {
     herr_t   status = -1;
@@ -1102,7 +1154,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (J[BJ)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1nameof(JNIEnv *env, jclass clss, jlong type_id, jbyteArray value, jlong size)
+Java_hdf_hdf5lib_H5_H5Tenum_1nameof
+    (JNIEnv *env, jclass clss, jlong type_id, jbyteArray value, jlong size)
 {
     herr_t status = -1;
     jbyte *byteP;
@@ -1157,7 +1210,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1nameof(JNIEnv *env, jclass clss, jlong type_id, jby
  * Signature: (JLjava/lang/String;[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int(JNIEnv *env, jclass clss, jlong type_id, jstring name, jintArray value)
+Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int
+    (JNIEnv *env, jclass clss, jlong type_id, jstring name, jintArray value)
 {
     herr_t      status = -1;
     jint       *intP;
@@ -1168,25 +1222,24 @@ Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int(JNIEnv *env, jclass clss, jlong type_i
         h5nullArgument(env, "H5Tenum_valueof:  value is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING(name, nameP, -1);
-
-        intP = ENVPTR->GetIntArrayElements(ENVPAR value, &isCopy2);
-        if (intP == NULL)  {
-            UNPIN_JAVA_STRING(name, nameP);
-            h5JNIFatalError(env, "H5Tenum_valueof:  value not pinned");
-        } /* end if */
-        else {
-            status = H5Tenum_valueof((hid_t)type_id, nameP, intP);
+        PIN_JAVA_STRING(name, nameP);
+        if (nameP != NULL) {
+            intP = ENVPTR->GetIntArrayElements(ENVPAR value, &isCopy2);
+            if (intP == NULL)  {
+                h5JNIFatalError(env, "H5Tenum_valueof:  value not pinned");
+            } /* end if */
+            else {
+                status = H5Tenum_valueof((hid_t)type_id, nameP, intP);
 
+                if (status < 0) {
+                    ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, JNI_ABORT);
+                    h5libraryError(env);
+                } /* end if */
+                else
+                    ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, 0);
+            } /* end else */
             UNPIN_JAVA_STRING(name, nameP);
-
-            if (status < 0) {
-                ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, JNI_ABORT);
-                h5libraryError(env);
-            } /* end if */
-            else
-                ENVPTR->ReleaseIntArrayElements(ENVPAR value, intP, 0);
-        } /* end else */
+        }
     } /* end else */
 
     return (jint)status;
@@ -1198,7 +1251,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int(JNIEnv *env, jclass clss, jlong type_i
  * Signature: (JLjava/lang/String;[B)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tenum_1valueof(JNIEnv *env, jclass clss, jlong type_id, jstring name, jbyteArray value)
+Java_hdf_hdf5lib_H5_H5Tenum_1valueof
+    (JNIEnv *env, jclass clss, jlong type_id, jstring name, jbyteArray value)
 {
     herr_t      status = -1;
     jbyte      *byteP;
@@ -1209,25 +1263,24 @@ Java_hdf_hdf5lib_H5_H5Tenum_1valueof(JNIEnv *env, jclass clss, jlong type_id, js
         h5nullArgument(env, "H5Tenum_valueof:  value is NULL");
     } /* end if */
     else {
-        PIN_JAVA_STRING0(name, nameP);
-
-        byteP = ENVPTR->GetByteArrayElements(ENVPAR value, &isCopy2);
-        if (byteP == NULL)  {
-            UNPIN_JAVA_STRING(name,nameP);
-            h5JNIFatalError(env, "H5Tenum_valueof:  value not pinned");
-        } /* end if */
-        else {
-            status = H5Tenum_valueof((hid_t)type_id, nameP, byteP);
+        PIN_JAVA_STRING(name, nameP);
+        if (nameP != NULL) {
+            byteP = ENVPTR->GetByteArrayElements(ENVPAR value, &isCopy2);
+            if (byteP == NULL)  {
+                h5JNIFatalError(env, "H5Tenum_valueof:  value not pinned");
+            } /* end if */
+            else {
+                status = H5Tenum_valueof((hid_t)type_id, nameP, byteP);
 
+                if (status < 0) {
+                    ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
+                    h5libraryError(env);
+                } /* end if */
+                else
+                    ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, 0);
+            } /* end else */
             UNPIN_JAVA_STRING(name, nameP);
-
-            if (status < 0) {
-                ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, JNI_ABORT);
-                h5libraryError(env);
-            } /* end if */
-            else
-                ENVPTR->ReleaseByteArrayElements(ENVPAR value, byteP, 0);
-        } /* end else */
+        }
     } /* end else */
 } /* end Java_hdf_hdf5lib_H5_H5Tenum_1valueof */
 
@@ -1237,7 +1290,8 @@ Java_hdf_hdf5lib_H5_H5Tenum_1valueof(JNIEnv *env, jclass clss, jlong type_id, js
  * Signature: (JI[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int(JNIEnv *env, jclass clss, jlong type_id, jint membno, jintArray value)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int
+    (JNIEnv *env, jclass clss, jlong type_id, jint membno, jintArray value)
 {
     herr_t   status = -1;
     jint    *intP;
@@ -1273,7 +1327,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int(JNIEnv *env, jclass clss, jlong t
  * Signature: (JI[B)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1member_1value(JNIEnv *env, jclass clss, jlong type_id, jint membno, jbyteArray value)
+Java_hdf_hdf5lib_H5_H5Tget_1member_1value
+    (JNIEnv *env, jclass clss, jlong type_id, jint membno, jbyteArray value)
 {
     herr_t   status = -1;
     jbyte   *byteP;
@@ -1306,7 +1361,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1member_1value(JNIEnv *env, jclass clss, jlong type_i
  * Signature: (J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     int ndims = -1;
 
@@ -1323,7 +1379,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (J[I[I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1array_1dims(JNIEnv *env, jclass clss, jlong type_id, jintArray dims, jintArray perms)
+Java_hdf_hdf5lib_H5_H5Tget_1array_1dims
+    (JNIEnv *env, jclass clss, jlong type_id, jintArray dims, jintArray perms)
 {
     int      ndims = -1;
     int      dlen;
@@ -1370,7 +1427,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1array_1dims(JNIEnv *env, jclass clss, jlong type_id,
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Tis_1variable_1str(JNIEnv *env, jclass clss, jlong type_id)
+Java_hdf_hdf5lib_H5_H5Tis_1variable_1str
+    (JNIEnv *env, jclass clss, jlong type_id)
 {
     htri_t bval = JNI_FALSE;
 
@@ -1389,7 +1447,8 @@ Java_hdf_hdf5lib_H5_H5Tis_1variable_1str(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (JI)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tget_1native_1type(JNIEnv *env, jclass clss, jlong type_id, jint direction)
+Java_hdf_hdf5lib_H5__1H5Tget_1native_1type
+    (JNIEnv *env, jclass clss, jlong type_id, jint direction)
 {
     hid_t native_tid = -1;
 
@@ -1407,7 +1466,8 @@ Java_hdf_hdf5lib_H5__1H5Tget_1native_1type(JNIEnv *env, jclass clss, jlong type_
  * Signature: (JI)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_hdf_hdf5lib_H5_H5Tdetect_1class(JNIEnv *env, jclass clss, jlong type_id, jint dtype_class)
+Java_hdf_hdf5lib_H5_H5Tdetect_1class
+    (JNIEnv *env, jclass clss, jlong type_id, jint dtype_class)
 {
     htri_t bval = JNI_FALSE;
 
@@ -1426,20 +1486,22 @@ Java_hdf_hdf5lib_H5_H5Tdetect_1class(JNIEnv *env, jclass clss, jlong type_id, ji
  * Signature: (JLjava/lang/String;JJJJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tcommit(JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type,
+Java_hdf_hdf5lib_H5_H5Tcommit
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring name, jlong type,
           jlong link_plist_id, jlong create_plist_id, jlong access_plist_id)
 {
     herr_t      status = -1;
     const char *tName;
 
-    PIN_JAVA_STRING0(name, tName);
-
-    status = H5Tcommit2((hid_t)loc_id, tName, (hid_t)type, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id);
+    PIN_JAVA_STRING(name, tName);
+    if (tName != NULL) {
+        status = H5Tcommit2((hid_t)loc_id, tName, (hid_t)type, (hid_t)link_plist_id, (hid_t)create_plist_id, (hid_t)access_plist_id);
 
-    UNPIN_JAVA_STRING(name, tName);
+        UNPIN_JAVA_STRING(name, tName);
 
-    if (status < 0)
-        h5libraryError(env);
+        if (status < 0)
+            h5libraryError(env);
+    }
 } /* end Java_hdf_hdf5lib_H5_H5Tcommit */
 
 /*
@@ -1448,7 +1510,8 @@ Java_hdf_hdf5lib_H5_H5Tcommit(JNIEnv *env, jclass clss, jlong loc_id, jstring na
  * Signature: (JI[J)J
  */
 JNIEXPORT jlong JNICALL
-Java_hdf_hdf5lib_H5__1H5Tarray_1create2(JNIEnv *env, jclass clss, jlong base_id, jint rank, jlongArray dims)
+Java_hdf_hdf5lib_H5__1H5Tarray_1create2
+    (JNIEnv *env, jclass clss, jlong base_id, jint rank, jlongArray dims)
 {
     hid_t    retVal = -1;
     jlong   *dimsP;
@@ -1499,7 +1562,8 @@ Java_hdf_hdf5lib_H5__1H5Tarray_1create2(JNIEnv *env, jclass clss, jlong base_id,
  * Signature: (J[J)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2(JNIEnv *env, jclass clss, jlong type_id, jlongArray dims)
+Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2
+    (JNIEnv *env, jclass clss, jlong type_id, jlongArray dims)
 {
     int      ndims = -1;
     int      dlen;
@@ -1549,7 +1613,8 @@ Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2(JNIEnv *env, jclass clss, jlong type_id
  * Signature: (JJJ[B[BJ)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5Tconvert(JNIEnv *env, jclass clss, jlong src_id, jlong dst_id, jlong nelmts,
+Java_hdf_hdf5lib_H5_H5Tconvert
+    (JNIEnv *env, jclass clss, jlong src_id, jlong dst_id, jlong nelmts,
       jbyteArray buf, jbyteArray background, jlong plist_id)
 {
     herr_t   status;
@@ -1607,6 +1672,7 @@ Java_hdf_hdf5lib_H5_H5Trefresh(JNIEnv *env, jclass clss, jlong loc_id)
 }
 
 
+
 #ifdef __cplusplus
 } /* end extern "C" */
 #endif /* __cplusplus */
diff --git a/java/src/jni/h5tImp.h b/java/src/jni/h5tImp.h
index edaca2f..374d992 100644
--- a/java/src/jni/h5tImp.h
+++ b/java/src/jni/h5tImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    _H5Topen2
  * Signature: (JLjava/lang/String;J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Topen2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Topen2
   (JNIEnv *, jclass, jlong, jstring, jlong);
 
 /*
@@ -36,7 +35,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Topen2
  * Method:    H5Tcommitted
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tcommitted
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Tcommitted
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -44,7 +44,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tcommitted
  * Method:    _H5Tcreate
  * Signature: (IJ)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tcreate
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tcreate
   (JNIEnv *, jclass, jint, jlong);
 
 /*
@@ -52,7 +53,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tcreate
  * Method:    _H5Tcopy
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tcopy
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tcopy
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -60,7 +62,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tcopy
  * Method:    H5Tequal
  * Signature: (JJ)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tequal
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Tequal
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -68,7 +71,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tequal
  * Method:    H5Tlock
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tlock
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tlock
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -76,7 +80,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tlock
  * Method:    H5Tget_class
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1class
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1class
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -84,7 +89,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1class
  * Method:    H5Tget_size
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1size
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1size
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -92,7 +98,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1size
  * Method:    H5Tset_size
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1size
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1size
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -100,7 +107,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1size
  * Method:    H5Tget_order
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1order
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -108,7 +116,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1order
  * Method:    H5Tset_order
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1order
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1order
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -116,7 +125,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1order
  * Method:    H5Tget_precision
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1precision
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1precision
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -124,7 +134,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1precision
  * Method:    H5Tget_precision_long
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1precision_1long
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1precision_1long
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -132,7 +143,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1precision_1long
  * Method:    H5Tset_precision
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1precision
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1precision
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -140,7 +152,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1precision
  * Method:    H5Tget_offset
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1offset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1offset
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -148,7 +161,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1offset
  * Method:    H5Tset_offset
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1offset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1offset
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -156,7 +170,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1offset
  * Method:    H5Tget_pad
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1pad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1pad
   (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -164,7 +179,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1pad
  * Method:    H5Tset_pad
  * Signature: (JII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1pad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1pad
   (JNIEnv *, jclass, jlong, jint, jint);
 
 /*
@@ -172,7 +188,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1pad
  * Method:    H5Tget_sign
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1sign
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1sign
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -180,7 +197,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1sign
  * Method:    H5Tset_sign
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1sign
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1sign
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -188,7 +206,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1sign
  * Method:    H5Tget_fields_int
  * Signature: (J[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1fields_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1fields_1int
   (JNIEnv *, jclass, jlong, jintArray);
 
 /*
@@ -196,7 +215,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1fields_1int
  * Method:    H5Tget_fields
  * Signature: (J[J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tget_1fields
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1fields
   (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -204,7 +224,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tget_1fields
  * Method:    H5Tset_fields
  * Signature: (JJJJJJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tset_1fields
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1fields
   (JNIEnv *, jclass, jlong, jlong, jlong, jlong, jlong, jlong);
 
 /*
@@ -212,7 +233,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tset_1fields
  * Method:    H5Tget_ebias
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1ebias
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1ebias
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -220,7 +242,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1ebias
  * Method:    H5Tget_ebias_long
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -228,7 +251,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1ebias_1long
  * Method:    H5Tset_ebias
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1ebias
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1ebias
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -236,7 +260,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1ebias
  * Method:    H5Tget_norm
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1norm
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1norm
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -244,7 +269,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1norm
  * Method:    H5Tset_norm
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1norm
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1norm
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -252,7 +278,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1norm
  * Method:    H5Tget_inpad
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1inpad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1inpad
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -260,7 +287,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1inpad
  * Method:    H5Tset_inpad
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1inpad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1inpad
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -268,7 +296,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1inpad
  * Method:    H5Tget_cset
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1cset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1cset
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -276,7 +305,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1cset
  * Method:    H5Tset_cset
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1cset
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1cset
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -284,7 +314,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1cset
  * Method:    H5Tget_strpad
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1strpad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1strpad
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -292,7 +323,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1strpad
  * Method:    H5Tset_strpad
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1strpad
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1strpad
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -300,7 +332,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1strpad
  * Method:    H5Tget_nmembers
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1nmembers
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1nmembers
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -308,7 +341,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1nmembers
  * Method:    H5Tget_member_name
  * Signature: (JI)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1name
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1name
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -316,7 +350,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1name
  * Method:    H5Tget_member_index
  * Signature: (JLjava/lang/String)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1index
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1index
   (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -324,7 +359,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1index
  * Method:    H5Tget_member_type
  * Signature: (JI)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1member_1type
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tget_1member_1type
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -332,7 +368,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1member_1type
  * Method:    H5Tget_member_offset
  * Signature: (JI)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1offset
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1offset
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -340,7 +377,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1offset
  * Method:    H5Tget_member_class
  * Signature: (JI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1class
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1class
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -348,7 +386,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1class
  * Method:    H5Tinsert
  * Signature: (JLjava/lang/String;JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tinsert
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tinsert
   (JNIEnv *, jclass, jlong, jstring, jlong, jlong);
 
 /*
@@ -356,7 +395,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tinsert
  * Method:    H5Tpack
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tpack
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tpack
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -364,7 +404,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tpack
  * Method:    _H5Tclose
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Tclose
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5__1H5Tclose
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -372,7 +413,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5__1H5Tclose
  * Method:    _H5Tvlen_create
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tvlen_1create
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tvlen_1create
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -380,7 +422,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tvlen_1create
  * Method:    H5Tset_tag
  * Signature: (JLjava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1tag
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tset_1tag
   (JNIEnv *, jclass, jlong, jstring);
 
 /*
@@ -388,7 +431,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tset_1tag
  * Method:    H5Tget_tag
  * Signature: (J)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tget_1tag
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1tag
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -396,7 +440,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tget_1tag
  * Method:    H5Tget_super
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1super
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tget_1super
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -404,7 +449,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1super
  * Method:    _H5Tenum_create
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tenum_1create
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tenum_1create
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -412,7 +458,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tenum_1create
  * Method:    H5Tenum_insert_int
  * Signature: (JLjava/lang/String;[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int
   (JNIEnv *, jclass, jlong, jstring, jintArray);
 
 /*
@@ -420,7 +467,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1insert_1int
  * Method:    H5Tenum_insert
  * Signature: (JLjava/lang/String;[B)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1insert
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1insert
   (JNIEnv *, jclass, jlong, jstring, jbyteArray);
 
 /*
@@ -428,7 +476,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1insert
  * Method:    H5Tenum_nameof_int
  * Signature: (J[I[Ljava/lang/String;I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int
   (JNIEnv *, jclass, jlong, jintArray, jobjectArray, jint);
 
 /*
@@ -436,7 +485,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1nameof_1int
  * Method:    H5Tenum_nameof
  * Signature: (J[BJ)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1nameof
+JNIEXPORT jstring JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1nameof
   (JNIEnv *, jclass, jlong, jbyteArray, jlong);
 
 /*
@@ -444,7 +494,8 @@ JNIEXPORT jstring JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1nameof
  * Method:    H5Tenum_valueof_int
  * Signature: (JLjava/lang/String;[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int
   (JNIEnv *, jclass, jlong, jstring, jintArray);
 
 /*
@@ -452,7 +503,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1valueof_1int
  * Method:    H5Tenum_valueof
  * Signature: (JLjava/lang/String;[B)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1valueof
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tenum_1valueof
   (JNIEnv *, jclass, jlong, jstring, jbyteArray);
 
 /*
@@ -460,7 +512,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tenum_1valueof
  * Method:    H5Tget_member_value_int
  * Signature: (JI[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int
   (JNIEnv *, jclass, jlong, jint, jintArray);
 
 /*
@@ -468,7 +521,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1value_1int
  * Method:    H5Tget_member_value
  * Signature: (JI[B)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1value
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1member_1value
   (JNIEnv *, jclass, jlong, jint, jbyteArray);
 
 /*
@@ -476,7 +530,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tget_1member_1value
  * Method:    H5Tget_array_ndims
  * Signature: (J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -484,7 +539,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1ndims
  * Method:    H5Tget_array_dims
  * Signature: (J[I[I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1dims
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1array_1dims
   (JNIEnv *, jclass, jlong, jintArray, jintArray);
 
 /*
@@ -492,7 +548,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1dims
  * Method:    H5Tis_variable_str
  * Signature: (J)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tis_1variable_1str
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Tis_1variable_1str
   (JNIEnv *, jclass, jlong);
 
 /*
@@ -500,7 +557,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tis_1variable_1str
  * Method:    H5Tget_native_type
  * Signature: (JI)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1native_1type
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tget_1native_1type
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -508,7 +566,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tget_1native_1type
  * Method:    H5Tdetect_class
  * Signature: (JI)Z
  */
-JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tdetect_1class
+JNIEXPORT jboolean JNICALL
+Java_hdf_hdf5lib_H5_H5Tdetect_1class
   (JNIEnv *, jclass, jlong, jint);
 
 /*
@@ -516,7 +575,8 @@ JNIEXPORT jboolean JNICALL Java_hdf_hdf5lib_H5_H5Tdetect_1class
  * Method:    H5Tcommit
  * Signature: (JLjava/lang/String;JJJJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tcommit
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tcommit
   (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong, jlong);
 
 /*
@@ -524,7 +584,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tcommit
  * Method:    _H5Tarray_create2
  * Signature: (JI[J)J
  */
-JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tarray_1create2
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_H5__1H5Tarray_1create2
   (JNIEnv *, jclass, jlong, jint, jlongArray);
 
 /*
@@ -532,7 +593,8 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tarray_1create2
  * Method:    H5Tget_array_dims2
  * Signature: (J[J)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2
   (JNIEnv *, jclass, jlong, jlongArray);
 
 /*
@@ -540,7 +602,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2
  * Method:    H5Tconvert
  * Signature: (JJJ[B[BJ)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tconvert
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tconvert
   (JNIEnv *, jclass, jlong, jlong, jlong, jbyteArray, jbyteArray, jlong);
 
 /*
@@ -548,7 +611,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tconvert
  * Method:    H5Tflush
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tflush
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Tflush
   (JNIEnv*, jclass, jlong);
 
 /*
@@ -556,7 +620,8 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Tflush
  * Method:    H5Trefresh
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Trefresh
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5Trefresh
   (JNIEnv*, jclass, jlong);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/h5util.c b/java/src/jni/h5util.c
index 90c8ad2..8454815 100644
--- a/java/src/jni/h5util.c
+++ b/java/src/jni/h5util.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -68,7 +66,9 @@ static int     render_bin_output_region_points(FILE *stream, hid_t region_space,
 
 /** frees memory held by array of strings */
 void
-h5str_array_free(char **strs, size_t len) {
+h5str_array_free
+    (char **strs, size_t len)
+{
     size_t i;
 
     if (!strs || len <= 0)
@@ -83,7 +83,9 @@ h5str_array_free(char **strs, size_t len) {
 
 /** allocate a new str with given length */
 void
-h5str_new(h5str_t *str, size_t len) {
+h5str_new
+    (h5str_t *str, size_t len)
+{
     if (str && len > 0) {
         str->s = (char *)HDmalloc(len);
         str->max = len;
@@ -93,7 +95,9 @@ h5str_new(h5str_t *str, size_t len) {
 
 /** free string memory */
 void
-h5str_free(h5str_t *str) {
+h5str_free
+    (h5str_t *str)
+{
     if (str && str->max > 0) {
         HDfree(str->s);
         HDmemset(str, 0, sizeof(h5str_t));
@@ -102,7 +106,9 @@ h5str_free(h5str_t *str) {
 
 /** reset the max size of the string */
 void
-h5str_resize(h5str_t *str, size_t new_len) {
+h5str_resize
+    (h5str_t *str, size_t new_len)
+{
     char *new_str;
 
     if (!str || new_len <= 0 || str->max == new_len)
@@ -124,7 +130,9 @@ h5str_resize(h5str_t *str, size_t new_len) {
  the char string point to str->s
  */
 char*
-h5str_append(h5str_t *str, const char* cstr) {
+h5str_append
+    (h5str_t *str, const char* cstr)
+{
     size_t len;
 
     if (!str)
@@ -147,7 +155,9 @@ h5str_append(h5str_t *str, const char* cstr) {
  On error, a negative number is returned.
  */
 size_t
-h5str_sprintf(h5str_t *str, hid_t container, hid_t tid, void *ptr, int expand_data) {
+h5str_sprintf
+    (h5str_t *str, hid_t container, hid_t tid, void *ptr, int expand_data)
+{
     unsigned char   tmp_uchar = 0;
     char            tmp_char = 0;
     unsigned short  tmp_ushort = 0;
@@ -169,7 +179,6 @@ h5str_sprintf(h5str_t *str, hid_t container, hid_t tid, void *ptr, int expand_da
     char           *this_str;
     size_t          this_strlen;
     int             n;
-    int             len;
     hvl_t          *vlptr;
     char           *cptr = (char*) ptr;
     unsigned char  *ucptr = (unsigned char*) ptr;
@@ -502,15 +511,14 @@ h5str_sprintf(h5str_t *str, hid_t container, hid_t tid, void *ptr, int expand_da
  *-------------------------------------------------------------------------
  */
 static int
-h5str_print_region_data_blocks(hid_t region_id,
-        h5str_t *str, int ndims, hid_t type_id, hssize_t nblocks, hsize_t *ptdata)
+h5str_print_region_data_blocks
+    (hid_t region_id, h5str_t *str, int ndims, hid_t type_id, hssize_t nblocks, hsize_t *ptdata)
 {
     hsize_t     *dims1 = NULL;
     hsize_t     *start = NULL;
     hsize_t     *count = NULL;
     hsize_t      blkndx;
     hsize_t      total_size[H5S_MAX_RANK];
-    unsigned int region_flags; /* buffer extent flags */
     hsize_t      numelem;
     hsize_t      numindex;
     size_t       jndx;
@@ -601,7 +609,8 @@ h5str_print_region_data_blocks(hid_t region_id,
 } /* end h5str_print_region_data_blocks */
 
 int
-h5str_dump_region_blocks_data(h5str_t *str, hid_t region, hid_t region_id)
+h5str_dump_region_blocks_data
+    (h5str_t *str, hid_t region, hid_t region_id)
 {
     int        ret_value = 0;
     hssize_t   nblocks;
@@ -609,7 +618,6 @@ h5str_dump_region_blocks_data(h5str_t *str, hid_t region, hid_t region_id)
     hsize_t   *ptdata;
     hid_t      dtype = -1;
     hid_t      type_id = -1;
-    char       tmp_str[256];
     int        ndims = H5Sget_simple_extent_ndims(region);
 
     /*
@@ -621,8 +629,6 @@ h5str_dump_region_blocks_data(h5str_t *str, hid_t region, hid_t region_id)
 
     /* Print block information */
     if (nblocks > 0) {
-        int i;
-
         alloc_size = (hsize_t)nblocks * (hsize_t)ndims * 2 * (hsize_t)sizeof(ptdata[0]);
         if (alloc_size == (hsize_t)((size_t) alloc_size)) {
             ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
@@ -654,7 +660,8 @@ h5str_dump_region_blocks_data(h5str_t *str, hid_t region, hid_t region_id)
 } /* end h5str_dump_region_blocks_data */
 
 static int
-h5str_dump_region_blocks(h5str_t *str, hid_t region, hid_t region_id)
+h5str_dump_region_blocks
+    (h5str_t *str, hid_t region, hid_t region_id)
 {
     int        ret_value = 0;
     hssize_t   nblocks;
@@ -725,19 +732,16 @@ h5str_dump_region_blocks(h5str_t *str, hid_t region, hid_t region_id)
  *-------------------------------------------------------------------------
  */
 static int
-h5str_print_region_data_points(hid_t region_space, hid_t region_id,
-        h5str_t *str, int ndims, hid_t type_id, hssize_t npoints, hsize_t *ptdata)
+h5str_print_region_data_points
+    (hid_t region_space, hid_t region_id, h5str_t *str, int ndims, hid_t type_id, hssize_t npoints, hsize_t *ptdata)
 {
     hsize_t        *dims1 = NULL;
     hsize_t         total_size[H5S_MAX_RANK];
     size_t          jndx;
-    unsigned        indx;
     size_t          type_size;
     int             ret_value = SUCCEED;
-    unsigned int    region_flags; /* buffer extent flags */
     hid_t           mem_space = -1;
     void           *region_buf = NULL;
-    char            tmp_str[256];
 
     /* Allocate space for the dimension array */
     if((dims1 = (hsize_t *)HDmalloc(sizeof(hsize_t) * (size_t)ndims)) != NULL) {
@@ -789,13 +793,13 @@ h5str_print_region_data_points(hid_t region_space, hid_t region_id,
 } /* end h5str_print_region_data_points */
 
 int
-h5str_dump_region_points_data(h5str_t *str, hid_t region, hid_t region_id)
+h5str_dump_region_points_data
+    (h5str_t *str, hid_t region, hid_t region_id)
 {
     int        ret_value = 0;
     hssize_t   npoints;
     hsize_t    alloc_size;
     hsize_t   *ptdata;
-    char       tmp_str[256];
     hid_t      dtype = -1;
     hid_t      type_id = -1;
     int        ndims = H5Sget_simple_extent_ndims(region);
@@ -809,8 +813,6 @@ h5str_dump_region_points_data(h5str_t *str, hid_t region, hid_t region_id)
 
     /* Print point information */
     if (npoints > 0) {
-        int i;
-
         alloc_size = (hsize_t)npoints * (hsize_t)ndims * (hsize_t)sizeof(ptdata[0]);
         if (alloc_size == (hsize_t)((size_t) alloc_size)) {
             ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
@@ -842,7 +844,8 @@ h5str_dump_region_points_data(h5str_t *str, hid_t region, hid_t region_id)
 } /* end h5str_dump_region_points_data */
 
 static int
-h5str_dump_region_points(h5str_t *str, hid_t region, hid_t region_id)
+h5str_dump_region_points
+    (h5str_t *str, hid_t region, hid_t region_id)
 {
     int        ret_value = 0;
     hssize_t   npoints;
@@ -895,7 +898,9 @@ h5str_dump_region_points(h5str_t *str, hid_t region, hid_t region_id)
 } /* end h5str_dump_region_points */
 
 static int
-h5str_is_zero(const void *_mem, size_t size) {
+h5str_is_zero
+    (const void *_mem, size_t size)
+{
     const unsigned char *mem = (const unsigned char *) _mem;
 
     while (size-- > 0)
@@ -918,7 +923,8 @@ h5str_is_zero(const void *_mem, size_t size) {
  *-------------------------------------------------------------------------
  */
 static htri_t
-h5str_detect_vlen_str(hid_t tid)
+h5str_detect_vlen_str
+    (hid_t tid)
 {
     H5T_class_t tclass = H5T_NO_CLASS;
     htri_t ret = 0;
@@ -977,7 +983,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static hid_t
-h5str_get_native_type(hid_t type)
+h5str_get_native_type
+    (hid_t type)
 {
     hid_t p_type;
     H5T_class_t type_class;
@@ -1002,7 +1009,8 @@ h5str_get_native_type(hid_t type)
  *-------------------------------------------------------------------------
  */
 static hid_t
-h5str_get_little_endian_type(hid_t tid)
+h5str_get_little_endian_type
+    (hid_t tid)
 {
     hid_t       p_type=-1;
     H5T_class_t type_class;
@@ -1072,7 +1080,8 @@ h5str_get_little_endian_type(hid_t tid)
  *-------------------------------------------------------------------------
  */
 static hid_t
-h5str_get_big_endian_type(hid_t tid)
+h5str_get_big_endian_type
+    (hid_t tid)
 {
     hid_t       p_type=-1;
     H5T_class_t type_class;
@@ -1144,7 +1153,8 @@ h5str_get_big_endian_type(hid_t tid)
  *-------------------------------------------------------------------------
  */
 static htri_t
-h5str_detect_vlen(hid_t tid)
+h5str_detect_vlen
+    (hid_t tid)
 {
     htri_t ret;
 
@@ -1172,7 +1182,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-h5str_render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hsize_t block_nelmts)
+h5str_render_bin_output
+    (FILE *stream, hid_t container, hid_t tid, void *_mem, hsize_t block_nelmts)
 {
     int                ret_value = 0;
     unsigned char     *mem  = (unsigned char*)_mem;
@@ -1273,7 +1284,7 @@ h5str_render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hs
                 case H5T_ARRAY:
                 {
                     int     k, ndims;
-                    hsize_t i, dims[H5S_MAX_RANK], temp_nelmts, nelmts;
+                    hsize_t dims[H5S_MAX_RANK], temp_nelmts, nelmts;
                     hid_t   memb;
 
                     /* get the array's base datatype for each element */
@@ -1301,7 +1312,6 @@ h5str_render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hs
                 break;
                 case H5T_VLEN:
                 {
-                    unsigned int i;
                     hsize_t      nelmts;
                     hid_t        memb;
 
@@ -1385,14 +1395,13 @@ h5str_render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hs
  *-------------------------------------------------------------------------
  */
 static int
-render_bin_output_region_data_blocks(FILE *stream, hid_t region_id,
-    hid_t container, int ndims, hid_t type_id, hssize_t nblocks, hsize_t *ptdata)
+render_bin_output_region_data_blocks
+    (FILE *stream, hid_t region_id, hid_t container, int ndims, hid_t type_id, hssize_t nblocks, hsize_t *ptdata)
 {
     hsize_t     *dims1 = NULL;
     hsize_t     *start = NULL;
     hsize_t     *count = NULL;
     hsize_t      numelem;
-    hsize_t      numindex;
     hsize_t      total_size[H5S_MAX_RANK];
     int          jndx;
     size_t       type_size;
@@ -1495,7 +1504,8 @@ render_bin_output_region_data_blocks(FILE *stream, hid_t region_id,
  *-------------------------------------------------------------------------
  */
 static int
-render_bin_output_region_blocks(FILE *stream, hid_t region_space, hid_t region_id, hid_t container)
+render_bin_output_region_blocks
+    (FILE *stream, hid_t region_space, hid_t region_id, hid_t container)
 {
     int          ret_value = SUCCEED;
     hssize_t     nblocks;
@@ -1557,11 +1567,11 @@ render_bin_output_region_blocks(FILE *stream, hid_t region_space, hid_t region_i
  *-------------------------------------------------------------------------
  */
 static int
-render_bin_output_region_data_points(FILE *stream, hid_t region_space, hid_t region_id,
+render_bin_output_region_data_points
+    (FILE *stream, hid_t region_space, hid_t region_id,
         hid_t container, int ndims, hid_t type_id, hssize_t npoints, hsize_t *ptdata)
 {
     hsize_t *dims1 = NULL;
-    int      jndx;
     size_t   type_size;
     hid_t    mem_space = -1;
     void    *region_buf = NULL;
@@ -1616,7 +1626,8 @@ render_bin_output_region_data_points(FILE *stream, hid_t region_space, hid_t reg
  *-------------------------------------------------------------------------
  */
 static int
-render_bin_output_region_points(FILE *stream, hid_t region_space, hid_t region_id, hid_t container)
+render_bin_output_region_points
+    (FILE *stream, hid_t region_space, hid_t region_id, hid_t container)
 {
     int      ret_value = SUCCEED;
     hssize_t npoints;
@@ -1668,7 +1679,8 @@ render_bin_output_region_points(FILE *stream, hid_t region_space, hid_t region_i
 } /* end render_bin_output_region_points */
 
 int
-h5str_dump_simple_dset(FILE *stream, hid_t dset, int binary_order)
+h5str_dump_simple_dset
+    (FILE *stream, hid_t dset, int binary_order)
 {
     int      ret_value = SUCCEED;
     hid_t               f_space = -1;                  /* file data space */
@@ -1677,7 +1689,6 @@ h5str_dump_simple_dset(FILE *stream, hid_t dset, int binary_order)
     int                 ndims;
     int                 carry;                    /* counter carry value */
     hsize_t             zero[8];                  /* vector of zeros */
-    unsigned int        flags;                    /* buffer extent flags */
     hsize_t             total_size[H5S_MAX_RANK]; /* total size of dataset*/
 
     /* Print info */
@@ -1827,13 +1838,13 @@ h5str_dump_simple_dset(FILE *stream, hid_t dset, int binary_order)
 } /* end h5str_dump_simple_dset */
 
 static int
-h5tools_dump_simple_data(FILE *stream, hid_t container, hid_t type, void *_mem, hsize_t nelmts)
+h5tools_dump_simple_data
+    (FILE *stream, hid_t container, hid_t type, void *_mem, hsize_t nelmts)
 {
     int                ret_value = 0;
     int                line_count;
     unsigned char     *mem  = (unsigned char*)_mem;
     size_t             size;   /* datum size */
-    H5T_class_t        type_class;
     hsize_t            i;         /*element counter  */
     h5str_t            buffer;    /*string into which to render */
 
@@ -1875,7 +1886,8 @@ h5tools_dump_simple_data(FILE *stream, hid_t container, hid_t type, void *_mem,
  * Signature: (JJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5AwriteVL(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
+Java_hdf_hdf5lib_H5_H5AwriteVL
+    (JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
 {
     herr_t  status = -1;
     char  **wdata;
@@ -1931,7 +1943,8 @@ Java_hdf_hdf5lib_H5_H5AwriteVL(JNIEnv *env, jclass clss, jlong attr_id, jlong me
  * Signature: (JJ[Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5AreadVL(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
+Java_hdf_hdf5lib_H5_H5AreadVL
+    (JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
 {
     herr_t  status = -1;
     jstring jstr;
@@ -1978,13 +1991,68 @@ Java_hdf_hdf5lib_H5_H5AreadVL(JNIEnv *env, jclass clss, jlong attr_id, jlong mem
 } /* end Java_hdf_hdf5lib_H5_H5AreadVL */
 
 /*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5AreadComplex
+ * Signature: (JJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5AreadComplex
+(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
+{
+    herr_t      status = -1;
+    int         i;
+    int         n;
+    char       *rdata;
+    size_t      max_len = 0;
+    size_t      size;
+    h5str_t     h5str;
+    hid_t       p_type = -1;
+    jstring     jstr;
+
+    p_type = H5Tget_native_type(mem_type_id, H5T_DIR_DEFAULT);
+    size = (((H5Tget_size(mem_type_id))>(H5Tget_size(p_type))) ? (H5Tget_size(mem_type_id)) : (H5Tget_size(p_type)));
+    H5Tclose(p_type);
+
+    n = ENVPTR->GetArrayLength(ENVPAR buf);
+    rdata = (char *)malloc((size_t)n * size);
+    if (rdata == NULL) {
+        h5JNIFatalError(env, "H5AreadComplex:  failed to allocate buff for read");
+    } /* end if */
+    else {
+        status = H5Aread(attr_id, mem_type_id, rdata);
+        if (status < 0) {
+            h5JNIFatalError(env, "H5AreadComplex: failed to read data");
+        } /* end if */
+        else {
+            HDmemset(&h5str, 0, sizeof(h5str_t));
+            h5str_new(&h5str, 4 * size);
+            if (h5str.s == NULL) {
+                h5JNIFatalError(env, "H5AreadComplex:  failed to allocate string buf");
+            } /* end if */
+            else {
+                for (i = 0; i < n; i++) {
+                    h5str.s[0] = '\0';
+                    h5str_sprintf(&h5str, attr_id, mem_type_id, rdata + ((size_t)i * size), 0);
+                    jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s);
+                    ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
+                } /* end for */
+            }  /* end else */
+            h5str_free(&h5str);
+        }  /* end else */
+        HDfree(rdata);
+    }  /* end else */
+    return status;
+}
+
+/*
  * Copies the content of one dataset to another dataset
  * Class:     hdf_hdf5lib_H5
  * Method:    H5Acopy
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Acopy(JNIEnv *env, jclass clss, jlong src_id, jlong dst_id)
+Java_hdf_hdf5lib_H5_H5Acopy
+    (JNIEnv *env, jclass clss, jlong src_id, jlong dst_id)
 {
     jbyte  *buf;
     herr_t  retVal = -1;
@@ -2053,7 +2121,8 @@ Java_hdf_hdf5lib_H5_H5Acopy(JNIEnv *env, jclass clss, jlong src_id, jlong dst_id
  * Signature: (JJ)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Dcopy(JNIEnv *env, jclass clss, jlong src_id, jlong dst_id)
+Java_hdf_hdf5lib_H5_H5Dcopy
+    (JNIEnv *env, jclass clss, jlong src_id, jlong dst_id)
 {
     jbyte  *buf;
     herr_t  retVal = -1;
@@ -2158,7 +2227,8 @@ typedef struct info_all
  * Signature: (JLjava/lang/String;[Ljava/lang/String;[I[I[J[JIII)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full(JNIEnv *env, jclass clss, jlong loc_id, jstring group_name,
+Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full
+    (JNIEnv *env, jclass clss, jlong loc_id, jstring group_name,
         jobjectArray objName, jintArray oType, jintArray lType, jlongArray fNo,
         jlongArray oRef, jint n, jint indx_type, jint indx_order)
 {
@@ -2311,9 +2381,9 @@ Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full(JNIEnv *env, jclass clss, jlong loc_
  * Signature: (J[Ljava/lang/String;[I[I[JJI)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max(JNIEnv *env, jclass clss, jlong loc_id, jobjectArray objName,
-          jintArray oType, jintArray lType, jlongArray oRef,
-          jlong maxnum, jint n)
+Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max
+    (JNIEnv *env, jclass clss, jlong loc_id, jobjectArray objName,
+          jintArray oType, jintArray lType, jlongArray oRef, jlong maxnum, jint n)
 {
     herr_t         ret_val = -1;
     char         **oName=NULL;
@@ -2406,7 +2476,8 @@ Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max(JNIEnv *env, jclass clss, jlong loc_i
 } /* end Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max */
 
 int
-H5Gget_obj_info_full(hid_t loc_id, char **objname, int *otype, int *ltype, unsigned long *fno, unsigned long *objno, int indexType, int indexOrder)
+H5Gget_obj_info_full
+    (hid_t loc_id, char **objname, int *otype, int *ltype, unsigned long *fno, unsigned long *objno, int indexType, int indexOrder)
 {
     info_all_t info;
     info.objname = objname;
@@ -2427,7 +2498,8 @@ H5Gget_obj_info_full(hid_t loc_id, char **objname, int *otype, int *ltype, unsig
 } /* end H5Gget_obj_info_full */
 
 int
-H5Gget_obj_info_max(hid_t loc_id, char **objname, int *otype, int *ltype, unsigned long *objno, long maxnum)
+H5Gget_obj_info_max
+    (hid_t loc_id, char **objname, int *otype, int *ltype, unsigned long *objno, long maxnum)
 {
     info_all_t info;
     info.objname = objname;
@@ -2444,7 +2516,8 @@ H5Gget_obj_info_max(hid_t loc_id, char **objname, int *otype, int *ltype, unsign
 } /* end H5Gget_obj_info_max */
 
 herr_t
-obj_info_all(hid_t loc_id, const char *name, const H5L_info_t *info, void *op_data)
+obj_info_all
+    (hid_t loc_id, const char *name, const H5L_info_t *info, void *op_data)
 {
     int         type = -1;
     hid_t       oid = -1;
@@ -2483,7 +2556,8 @@ obj_info_all(hid_t loc_id, const char *name, const H5L_info_t *info, void *op_da
 } /* end obj_info_all */
 
 herr_t
-obj_info_max(hid_t loc_id, const char *name, const H5L_info_t *info, void *op_data)
+obj_info_max
+    (hid_t loc_id, const char *name, const H5L_info_t *info, void *op_data)
 {
     int         type = -1;
     herr_t      retVal = 0;
@@ -2522,7 +2596,8 @@ obj_info_max(hid_t loc_id, const char *name, const H5L_info_t *info, void *op_da
  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
  */
 JNIEXPORT void JNICALL
-Java_hdf_hdf5lib_H5_H5export_1dataset(JNIEnv *env, jclass cls, jstring file_export_name, jstring file_name, jstring object_path, jint binary_order)
+Java_hdf_hdf5lib_H5_H5export_1dataset
+    (JNIEnv *env, jclass cls, jstring file_export_name, jstring file_name, jstring object_path, jint binary_order)
 {
     herr_t      status = -1;
     herr_t      ret_val = -1;
@@ -2541,49 +2616,50 @@ Java_hdf_hdf5lib_H5_H5export_1dataset(JNIEnv *env, jclass cls, jstring file_expo
         h5nullArgument(env, "HDF5Library_export_data:  object_path is NULL");
     } /* end else if */
     else {
-        PIN_JAVA_STRING0(file_name, fileName);
-
-        file_id = H5Fopen(fileName, (unsigned)H5F_ACC_RDWR, (hid_t)H5P_DEFAULT);
+        PIN_JAVA_STRING(file_name, fileName);
+        if (fileName != NULL) {
+            file_id = H5Fopen(fileName, (unsigned)H5F_ACC_RDWR, (hid_t)H5P_DEFAULT);
 
-        UNPIN_JAVA_STRING(file_name, fileName);
+            UNPIN_JAVA_STRING(file_name, fileName);
 
-        if (file_id < 0) {
-            /* throw exception */
-            h5libraryError(env);
-        } /* end if */
-        else {
-            object_name = ENVPTR->GetStringUTFChars(ENVPAR object_path, &isCopy2);
-            if (object_name == NULL) {
-                h5JNIFatalError( env, "H5Dopen:  object name not pinned");
+            if (file_id < 0) {
+                /* throw exception */
+                h5libraryError(env);
             } /* end if */
             else {
-                dataset_id = H5Dopen2(file_id, object_name, H5P_DEFAULT);
-
-                ENVPTR->ReleaseStringUTFChars(ENVPAR object_path, object_name);
-
-                if (dataset_id < 0) {
-                    H5Fclose(file_id);
-                    h5libraryError(env);
+                object_name = ENVPTR->GetStringUTFChars(ENVPAR object_path, &isCopy2);
+                if (object_name == NULL) {
+                    h5JNIFatalError( env, "H5Dopen:  object name not pinned");
                 } /* end if */
                 else {
-                    file_export = ENVPTR->GetStringUTFChars(ENVPAR file_export_name, 0);
-                    stream = HDfopen(file_export, "w+");
-                    ENVPTR->ReleaseStringUTFChars(ENVPAR file_export_name, file_export);
+                    dataset_id = H5Dopen2(file_id, object_name, H5P_DEFAULT);
 
-                    ret_val = h5str_dump_simple_dset(stream, dataset_id, binary_order);
+                    ENVPTR->ReleaseStringUTFChars(ENVPAR object_path, object_name);
 
-                    if (stream)
-                        HDfclose(stream);
+                    if (dataset_id < 0) {
+                        H5Fclose(file_id);
+                        h5libraryError(env);
+                    } /* end if */
+                    else {
+                        file_export = ENVPTR->GetStringUTFChars(ENVPAR file_export_name, 0);
+                        stream = HDfopen(file_export, "w+");
+                        ENVPTR->ReleaseStringUTFChars(ENVPAR file_export_name, file_export);
 
-                    H5Dclose(dataset_id);
+                        ret_val = h5str_dump_simple_dset(stream, dataset_id, binary_order);
 
-                    H5Fclose(file_id);
+                        if (stream)
+                            HDfclose(stream);
 
-                    if (ret_val < 0)
-                        h5libraryError(env);
+                        H5Dclose(dataset_id);
+
+                        H5Fclose(file_id);
+
+                        if (ret_val < 0)
+                            h5libraryError(env);
+                    } /* end else */
                 } /* end else */
             } /* end else */
-        } /* end else */
+        }
     } /* end else */
 } /* end Java_hdf_hdf5lib_H5_H5export_1dataset */
 
diff --git a/java/src/jni/h5util.h b/java/src/jni/h5util.h
index fcf343d..434a107 100644
--- a/java/src/jni/h5util.h
+++ b/java/src/jni/h5util.h
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -52,7 +50,8 @@ extern int     h5str_dump_region_points_data(h5str_t *str, hid_t region, hid_t r
  * Method:    H5AwriteVL
  * Signature: (JJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5AwriteVL
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5AwriteVL
   (JNIEnv *, jclass, jlong, jlong, jobjectArray);
 
 /*
@@ -60,7 +59,17 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5AwriteVL
  * Method:    H5AreadVL
  * Signature: (JJ[Ljava/lang/String;)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5AreadVL
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5AreadVL
+  (JNIEnv *, jclass, jlong, jlong, jobjectArray);
+
+/*
+ * Class:     hdf_hdf5lib_H5
+ * Method:    H5AreadComplex
+ * Signature: (JJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5AreadComplex
   (JNIEnv *, jclass, jlong, jlong, jobjectArray);
 
 /*
@@ -69,7 +78,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5AreadVL
  * Method:    H5Acopy
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Acopy
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Acopy
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -78,7 +88,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Acopy
  * Method:    H5Dcopy
  * Signature: (JJ)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dcopy
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Dcopy
   (JNIEnv*, jclass, jlong, jlong);
 
 /*
@@ -86,7 +97,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Dcopy
  * Method:    H5Gget_obj_info_full
  * Signature: (JLjava/lang/String;[Ljava/lang/String;[I[I[J[JIII)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full
   (JNIEnv*, jclass, jlong, jstring, jobjectArray, jintArray, jintArray, jlongArray, jlongArray, jint, jint, jint);
 
 /*
@@ -94,7 +106,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1full
  * Method:    H5Gget_obj_info_max
  * Signature: (J[Ljava/lang/String;[I[I[JJI)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max
   (JNIEnv*, jclass, jlong, jobjectArray, jintArray, jintArray, jlongArray, jlong, jint);
 
 /*
@@ -102,7 +115,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Gget_1obj_1info_1max
  * Method:    H5export_dataset
  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
  */
-JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5export_1dataset
+JNIEXPORT void JNICALL
+Java_hdf_hdf5lib_H5_H5export_1dataset
   (JNIEnv*, jclass, jstring, jstring, jstring, jint);
 
 #endif  /* H5UTIL_H__ */
diff --git a/java/src/jni/h5zImp.c b/java/src/jni/h5zImp.c
index a60854d..a5e6cd8 100644
--- a/java/src/jni/h5zImp.c
+++ b/java/src/jni/h5zImp.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 
@@ -35,7 +33,8 @@ extern "C" {
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Zunregister(JNIEnv *env, jclass clss, jint filter)
+Java_hdf_hdf5lib_H5_H5Zunregister
+    (JNIEnv *env, jclass clss, jint filter)
 {
     herr_t retValue = H5Zunregister((H5Z_filter_t)filter);
 
@@ -51,7 +50,8 @@ Java_hdf_hdf5lib_H5_H5Zunregister(JNIEnv *env, jclass clss, jint filter)
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Zfilter_1avail(JNIEnv *env, jclass clss, jint filter)
+Java_hdf_hdf5lib_H5_H5Zfilter_1avail
+    (JNIEnv *env, jclass clss, jint filter)
 {
     herr_t retValue = H5Zfilter_avail((H5Z_filter_t)filter);
 
@@ -68,7 +68,8 @@ Java_hdf_hdf5lib_H5_H5Zfilter_1avail(JNIEnv *env, jclass clss, jint filter)
  */
 
 JNIEXPORT jint JNICALL
-Java_hdf_hdf5lib_H5_H5Zget_1filter_1info(JNIEnv *env, jclass clss, jint filter)
+Java_hdf_hdf5lib_H5_H5Zget_1filter_1info
+    (JNIEnv *env, jclass clss, jint filter)
 {
     unsigned int flags = 0;
 
diff --git a/java/src/jni/h5zImp.h b/java/src/jni/h5zImp.h
index de0d6e6..bffe9d8 100644
--- a/java/src/jni/h5zImp.h
+++ b/java/src/jni/h5zImp.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -28,7 +26,8 @@ extern "C" {
  * Method:    H5Zunregister
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Zunregister
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Zunregister
   (JNIEnv *, jclass, jint);
 
 /*
@@ -36,7 +35,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Zunregister
  * Method:    H5Zfilter_avail
  * Signature: (I)I
  */
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Zfilter_1avail
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Zfilter_1avail
   (JNIEnv *, jclass, jint);
 
 /*
@@ -45,7 +45,8 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Zfilter_1avail
  * Signature: (I)I
  */
 
-JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Zget_1filter_1info
+JNIEXPORT jint JNICALL
+Java_hdf_hdf5lib_H5_H5Zget_1filter_1info
   (JNIEnv *, jclass, jint);
 
 #ifdef __cplusplus
diff --git a/java/src/jni/nativeData.c b/java/src/jni/nativeData.c
index da86e09..33f4953 100644
--- a/java/src/jni/nativeData.c
+++ b/java/src/jni/nativeData.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  *  For details of the HDF libraries, see the HDF Documentation at:
- *    http://hdfdfgroup.org/HDF5/doc/
+ *    http://hdfgroup.org/HDF5/doc/
  *
  */
 /*
@@ -49,7 +47,8 @@ extern "C" {
 
 /* returns int [] */
 JNIEXPORT jintArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToInt___3B(JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToInt___3B
+    (JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
 {
     jbyte *barr;
     jintArray rarray = NULL;
@@ -104,7 +103,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToInt___3B(JNIEnv *env, jclass clss, jbyteArr
 
 /* returns float [] */
 JNIEXPORT jfloatArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToFloat___3B(JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToFloat___3B
+    (JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
 {
     jbyte *barr;
     jfloatArray rarray;
@@ -157,7 +157,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToFloat___3B(JNIEnv *env, jclass clss, jbyteA
 
 /* returns short [] */
 JNIEXPORT jshortArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToShort___3B(JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToShort___3B
+    (JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
 {
     jbyte *barr;
     jshortArray rarray;
@@ -213,7 +214,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToShort___3B(JNIEnv *env, jclass clss, jbyteA
 
 /* returns long [] */
 JNIEXPORT jlongArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToLong___3B(JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToLong___3B
+    (JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
 {
     jbyte *barr;
     jlongArray rarray;
@@ -267,7 +269,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToLong___3B(JNIEnv *env, jclass clss, jbyteAr
 
 /* returns double [] */
 JNIEXPORT jdoubleArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToDouble___3B(JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToDouble___3B
+    (JNIEnv *env, jclass clss, jbyteArray bdata)  /* IN: array of bytes */
 {
     jbyte *barr;
     jdoubleArray rarray;
@@ -322,7 +325,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToDouble___3B(JNIEnv *env, jclass clss, jbyte
 
 /* returns int [] */
 JNIEXPORT jintArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToInt__II_3B(JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToInt__II_3B
+    (JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
 {
     char *bp;
     jbyte *barr;
@@ -381,7 +385,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToInt__II_3B(JNIEnv *env, jclass clss, jint s
 
 /* returns short [] */
 JNIEXPORT jshortArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToShort__II_3B(JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToShort__II_3B
+    (JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
 {
     char *bp;
     jbyte *barr;
@@ -440,7 +445,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToShort__II_3B(JNIEnv *env, jclass clss, jint
 
 /* returns float [] */
 JNIEXPORT jfloatArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToFloat__II_3B(JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToFloat__II_3B
+    (JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
 {
     char *bp;
     jbyte *barr;
@@ -499,7 +505,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToFloat__II_3B(JNIEnv *env, jclass clss, jint
 
 /* returns long [] */
 JNIEXPORT jlongArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToLong__II_3B(JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToLong__II_3B
+    (JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
 {
     char *bp;
     jbyte *barr;
@@ -559,7 +566,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToLong__II_3B(JNIEnv *env, jclass clss, jint
 
 /* returns double [] */
 JNIEXPORT jdoubleArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToDouble__II_3B(JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
+Java_hdf_hdf5lib_HDFNativeData_byteToDouble__II_3B
+    (JNIEnv *env, jclass clss, jint start, jint len, jbyteArray bdata)  /* IN: array of bytes */
 {
     char *bp;
     jbyte *barr;
@@ -618,7 +626,8 @@ Java_hdf_hdf5lib_HDFNativeData_byteToDouble__II_3B(JNIEnv *env, jclass clss, jin
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_intToByte__II_3I(JNIEnv *env, jclass clss, jint start, jint len, jintArray idata)  /* IN: array of int */
+Java_hdf_hdf5lib_HDFNativeData_intToByte__II_3I
+    (JNIEnv *env, jclass clss, jint start, jint len, jintArray idata)  /* IN: array of int */
 {
     jint *ip;
     jint *iarr;
@@ -687,7 +696,8 @@ Java_hdf_hdf5lib_HDFNativeData_intToByte__II_3I(JNIEnv *env, jclass clss, jint s
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_shortToByte__II_3S(JNIEnv *env, jclass clss, jint start, jint len, jshortArray idata)  /* IN: array of short */
+Java_hdf_hdf5lib_HDFNativeData_shortToByte__II_3S
+    (JNIEnv *env, jclass clss, jint start, jint len, jshortArray idata)  /* IN: array of short */
 {
     jshort *ip;
     jshort *iarr;
@@ -755,7 +765,8 @@ Java_hdf_hdf5lib_HDFNativeData_shortToByte__II_3S(JNIEnv *env, jclass clss, jint
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_floatToByte__II_3F(JNIEnv *env, jclass clss, jint start, jint len, jfloatArray idata)  /* IN: array of float */
+Java_hdf_hdf5lib_HDFNativeData_floatToByte__II_3F
+    (JNIEnv *env, jclass clss, jint start, jint len, jfloatArray idata)  /* IN: array of float */
 {
     jfloat *ip;
     jfloat *iarr;
@@ -823,7 +834,8 @@ Java_hdf_hdf5lib_HDFNativeData_floatToByte__II_3F(JNIEnv *env, jclass clss, jint
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_doubleToByte__II_3D(JNIEnv *env, jclass clss, jint start, jint len, jdoubleArray idata)  /* IN: array of double */
+Java_hdf_hdf5lib_HDFNativeData_doubleToByte__II_3D
+    (JNIEnv *env, jclass clss, jint start, jint len, jdoubleArray idata)  /* IN: array of double */
 {
     jdouble *ip;
     jdouble *iarr;
@@ -892,7 +904,8 @@ Java_hdf_hdf5lib_HDFNativeData_doubleToByte__II_3D(JNIEnv *env, jclass clss, jin
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_longToByte__II_3J(JNIEnv *env, jclass clss, jint start, jint len, jlongArray idata)  /* IN: array of long */
+Java_hdf_hdf5lib_HDFNativeData_longToByte__II_3J
+    (JNIEnv *env, jclass clss, jint start, jint len, jlongArray idata)  /* IN: array of long */
 {
     jlong *ip;
     jlong *iarr;
@@ -961,7 +974,8 @@ Java_hdf_hdf5lib_HDFNativeData_longToByte__II_3J(JNIEnv *env, jclass clss, jint
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_intToByte__I(JNIEnv *env, jclass clss, jint idata)  /* IN: int */
+Java_hdf_hdf5lib_HDFNativeData_intToByte__I
+    (JNIEnv *env, jclass clss, jint idata)  /* IN: int */
 {
     jbyteArray rarray;
     jbyte *barray;
@@ -999,7 +1013,8 @@ Java_hdf_hdf5lib_HDFNativeData_intToByte__I(JNIEnv *env, jclass clss, jint idata
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_floatToByte__F(JNIEnv *env, jclass clss, jfloat idata)  /* IN: int */
+Java_hdf_hdf5lib_HDFNativeData_floatToByte__F
+    (JNIEnv *env, jclass clss, jfloat idata)  /* IN: int */
 {
     jbyteArray rarray;
     jbyte *barray;
@@ -1037,7 +1052,8 @@ Java_hdf_hdf5lib_HDFNativeData_floatToByte__F(JNIEnv *env, jclass clss, jfloat i
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_shortToByte__S(JNIEnv *env, jclass clss, jshort idata)  /* IN: short */
+Java_hdf_hdf5lib_HDFNativeData_shortToByte__S
+    (JNIEnv *env, jclass clss, jshort idata)  /* IN: short */
 {
     jbyteArray rarray;
     jbyte *barray;
@@ -1076,7 +1092,8 @@ Java_hdf_hdf5lib_HDFNativeData_shortToByte__S(JNIEnv *env, jclass clss, jshort i
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_doubleToByte__D(JNIEnv *env, jclass clss, jdouble idata)  /* IN: double */
+Java_hdf_hdf5lib_HDFNativeData_doubleToByte__D
+    (JNIEnv *env, jclass clss, jdouble idata)  /* IN: double */
 {
     jbyteArray rarray;
     jbyte *barray;
@@ -1115,7 +1132,8 @@ Java_hdf_hdf5lib_HDFNativeData_doubleToByte__D(JNIEnv *env, jclass clss, jdouble
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_longToByte__J(JNIEnv *env, jclass clss, jlong idata)  /* IN: array of long */
+Java_hdf_hdf5lib_HDFNativeData_longToByte__J
+    (JNIEnv *env, jclass clss, jlong idata)  /* IN: array of long */
 {
     jbyteArray rarray;
     jbyte *barray;
@@ -1153,7 +1171,8 @@ Java_hdf_hdf5lib_HDFNativeData_longToByte__J(JNIEnv *env, jclass clss, jlong ida
 
 /* returns byte [] */
 JNIEXPORT jbyteArray JNICALL
-Java_hdf_hdf5lib_HDFNativeData_byteToByte__B(JNIEnv *env, jclass clss, jbyte idata)  /* IN: array of long */
+Java_hdf_hdf5lib_HDFNativeData_byteToByte__B
+    (JNIEnv *env, jclass clss, jbyte idata)  /* IN: array of long */
 {
     jbyteArray rarray;
     jbyte *barray;
diff --git a/java/src/jni/nativeData.h b/java/src/jni/nativeData.h
index 1af06b4..e9e1a5d 100644
--- a/java/src/jni/nativeData.h
+++ b/java/src/jni/nativeData.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <jni.h>
@@ -25,87 +23,108 @@ extern "C" {
 
 
 /* returns int [] */
-JNIEXPORT jintArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToInt___3B
+JNIEXPORT jintArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToInt___3B
 (JNIEnv *, jclass, jbyteArray);
 
 /* returns float [] */
-JNIEXPORT jfloatArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToFloat___3B
+JNIEXPORT jfloatArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToFloat___3B
 (JNIEnv *, jclass, jbyteArray);
 
 /* returns short [] */
-JNIEXPORT jshortArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToShort___3B
+JNIEXPORT jshortArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToShort___3B
 (JNIEnv *, jclass, jbyteArray);
 
 /* returns long [] */
-JNIEXPORT jlongArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToLong___3B
+JNIEXPORT jlongArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToLong___3B
 (JNIEnv *, jclass, jbyteArray);
 
 /* returns double [] */
-JNIEXPORT jdoubleArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToDouble___3B
+JNIEXPORT jdoubleArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToDouble___3B
 (JNIEnv *, jclass, jbyteArray);
 
 /* returns int [] */
-JNIEXPORT jintArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToInt__II_3B
+JNIEXPORT jintArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToInt__II_3B
 (JNIEnv *, jclass, jint, jint, jbyteArray);
 
 /* returns short [] */
-JNIEXPORT jshortArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToShort__II_3B
+JNIEXPORT jshortArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToShort__II_3B
 (JNIEnv *, jclass, jint, jint, jbyteArray);
 
 /* returns float [] */
-JNIEXPORT jfloatArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToFloat__II_3B
+JNIEXPORT jfloatArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToFloat__II_3B
 (JNIEnv *, jclass, jint, jint, jbyteArray);
 
 /* returns long [] */
-JNIEXPORT jlongArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToLong__II_3B
+JNIEXPORT jlongArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToLong__II_3B
 (JNIEnv *, jclass, jint, jint, jbyteArray);
 
 /* returns double [] */
-JNIEXPORT jdoubleArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToDouble__II_3B
+JNIEXPORT jdoubleArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToDouble__II_3B
 (JNIEnv *, jclass, jint, jint, jbyteArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_intToByte__II_3I
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_intToByte__II_3I
 (JNIEnv *, jclass, jint, jint, jintArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_shortToByte__II_3S
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_shortToByte__II_3S
 (JNIEnv *, jclass, jint, jint, jshortArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_floatToByte__II_3F
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_floatToByte__II_3F
 (JNIEnv *, jclass, jint, jint, jfloatArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_doubleToByte__II_3D
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_doubleToByte__II_3D
 (JNIEnv *, jclass, jint, jint, jdoubleArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_longToByte__II_3J
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_longToByte__II_3J
 (JNIEnv *, jclass, jint, jint, jlongArray);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_intToByte__I
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_intToByte__I
 (JNIEnv *, jclass, jint);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_floatToByte__F
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_floatToByte__F
 (JNIEnv *, jclass, jfloat);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_shortToByte__S
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_shortToByte__S
 (JNIEnv *, jclass, jshort);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_doubleToByte__D
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_doubleToByte__D
 (JNIEnv *env, jclass, jdouble);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_longToByte__J
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_longToByte__J
 (JNIEnv *, jclass, jlong);
 
 /* returns byte [] */
-JNIEXPORT jbyteArray JNICALL Java_hdf_hdf5lib_HDFNativeData_byteToByte__B
+JNIEXPORT jbyteArray JNICALL
+Java_hdf_hdf5lib_HDFNativeData_byteToByte__B
 (JNIEnv *, jclass, jbyte);
 
 #ifdef __cplusplus
diff --git a/java/test/CMakeLists.txt b/java/test/CMakeLists.txt
index 068689b..8912b3f 100644
--- a/java/test/CMakeLists.txt
+++ b/java/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_JAVA_TEST Java)
 
 set (CMAKE_VERBOSE_MAKEFILE 1)
@@ -8,7 +8,7 @@ INCLUDE_DIRECTORIES (
     ${HDF5_JAVA_HDF5_LIB_DIR}
 )
 
-set (HDF5_JAVA_TEST_SRCS
+set (HDF5_JAVA_TEST_SOURCES
     TestH5.java
     TestH5E.java
     TestH5Edefault.java
@@ -54,7 +54,7 @@ file (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt
 
 set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVA_LIB_DIR}/junit.jar;${HDF5_JAVA_LIB_DIR}/hamcrest-core.jar;${HDF5_JAVA_JARS};${HDF5_JAVA_LOGGING_JAR};${HDF5_JAVA_LOGGING_SIMPLE_JAR}")
 
-add_jar (${HDF5_JAVA_TEST_LIB_TARGET} MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt ${HDF5_JAVA_TEST_SRCS})
+add_jar (${HDF5_JAVA_TEST_LIB_TARGET} MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt ${HDF5_JAVA_TEST_SOURCES})
 
 get_target_property (${HDF5_JAVA_TEST_LIB_TARGET}_JAR_FILE ${HDF5_JAVA_TEST_LIB_TARGET} JAR_FILE)
 #install_jar (${HDF5_JAVA_TEST_LIB_TARGET} ${HJAVA_INSTALL_DATA_DIR}/tests tests)
@@ -69,39 +69,32 @@ set (HDF_JAVA_TEST_FILES
 )
 
 foreach (h5_file ${HDF_JAVA_TEST_FILES})
-  set (dest "${PROJECT_BINARY_DIR}/${h5_file}")
-  #message (STATUS " Copying ${h5_file}")
-  add_custom_command (
-      TARGET     ${HDF5_JAVA_TEST_LIB_TARGET}
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/${h5_file} ${dest}
-  )
-endforeach (h5_file ${HDF_JAVA_TEST_FILES})
-
-add_custom_command (
-    TARGET     ${HDF5_JAVA_TEST_LIB_TARGET}
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/h5ex_g_iterate.orig ${PROJECT_BINARY_DIR}/h5ex_g_iterate.hdf
-)
+  HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "${HDF5_JAVA_TEST_LIB_TARGET}_files")
+endforeach ()
+
+HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/h5ex_g_iterate.orig" "${PROJECT_BINARY_DIR}/h5ex_g_iterate.hdf" "${HDF5_JAVA_TEST_LIB_TARGET}_files")
+add_custom_target(${HDF5_JAVA_TEST_LIB_TARGET}_files ALL COMMENT "Copying files needed by ${HDF5_JAVA_TEST_LIB_TARGET} tests" DEPENDS ${${HDF5_JAVA_TEST_LIB_TARGET}_files_list})
 
 if (WIN32)
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
-else (WIN32)
+else ()
   set (CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
-endif (WIN32)
+endif ()
 
 set (CMAKE_JAVA_CLASSPATH ".")
 foreach (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH})
   set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}")
-endforeach (CMAKE_INCLUDE_PATH)
+endforeach ()
 set (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${${HDF5_JAVA_TEST_LIB_TARGET}_JAR_FILE}")
 set (testfilter "OK (598 tests)")
 
 if (CMAKE_BUILD_TYPE MATCHES Debug)
-  set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
-endif(CMAKE_BUILD_TYPE MATCHES Debug)
+  if (WIN32)
+    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_D;")
+  else ()
+    set (CMD_ARGS "-Dhdf.hdf5lib.H5.loadLibraryName=hdf5_java_debug;")
+  endif ()
+endif ()
 
 add_test (
   NAME JUnit-interface-clearall-objects
@@ -129,4 +122,7 @@ add_test (
         -D "TEST_REFERENCE=JUnit-interface.txt"
         -P "${HDF_RESOURCES_DIR}/jrunTest.cmake"
 )
-set_tests_properties (JUnit-interface PROPERTIES DEPENDS "JUnit-interface-clearall-objects")
+set_tests_properties (JUnit-interface PROPERTIES
+    ENVIRONMENT "HDF5_PLUGIN_PATH=${CMAKE_BINARY_DIR}/testdir2"
+    DEPENDS "JUnit-interface-clearall-objects"
+)
diff --git a/java/test/JUnit-interface.txt b/java/test/JUnit-interface.txt
index 7fd80f8..ab2f3b1 100644
--- a/java/test/JUnit-interface.txt
+++ b/java/test/JUnit-interface.txt
@@ -416,6 +416,7 @@ JUnit version 4.11
 .testH5P_layout
 .testH5Pget_link_creation_order
 .testH5Pset_shared_mesg_nindexes_InvalidHIGHnindexes
+.testH5P_file_space_page_size
 .testH5Pget_shared_mesg_index_Invalid_indexnum
 .testH5Pset_data_transform_NullExpression
 .testH5Pset_elink_prefix_null
@@ -438,9 +439,9 @@ JUnit version 4.11
 .testH5Pset_shared_mesg_index
 .testH5Pset_copy_object
 .testH5Pset_link_creation_order_trackedPLUSindexed
+.testH5P_file_space_strategy
 .testH5Pset_copy_object_invalidobject
 .testH5Pset_est_link_info_InvalidValues
-.testH5P_file_space
 .testH5Pset_local_heap_size_hint
 .testH5Pget_est_link_info
 .testH5Pset_scaleoffset
@@ -530,6 +531,7 @@ JUnit version 4.11
 .testH5Pvirtual_storage
 .testH5Pget_selection_source_dataset
 .testH5Pget_source_filename
+.testH5Pset_get_virtual_printf_gap
 .testH5Pget_virtual_count
 .testH5Pset_get_virtual_view
 .testH5Pget_mapping_parameters
@@ -631,13 +633,14 @@ JUnit version 4.11
 .testH5Ocomment_clear
 .testH5Ocopy_cur_not_exists
 .TestH5PLplugins
+.TestH5PLpaths
 .testH5Zfilter_avail
 .testH5Zunregister_predefined
 .testH5Zget_filter_info
 
 Time:  XXXX
 
-OK (635 tests)
+OK (638 tests)
 
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Fopen(): can't set access and transfer property lists
diff --git a/java/test/Makefile.am b/java/test/Makefile.am
index 92ac12d..b7409cf 100644
--- a/java/test/Makefile.am
+++ b/java/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/java/test/Makefile.in b/java/test/Makefile.in
index bbc6322..1d84126 100644
--- a/java/test/Makefile.in
+++ b/java/test/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Java native interface (JNI) Library Test Makefile(.in)
 
@@ -405,6 +403,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -526,6 +525,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -726,18 +726,20 @@ check_SCRIPTS = junit.sh
 TEST_SCRIPT = $(check_SCRIPTS)
 CLEANFILES = classnoinst.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/*.class junit.sh
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1138,6 +1140,7 @@ clean:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1145,7 +1148,7 @@ 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)
+lib dyn 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                           \
diff --git a/java/test/TestAll.java b/java/test/TestAll.java
index a4b44c3..de5d333 100644
--- a/java/test/TestAll.java
+++ b/java/test/TestAll.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5.java b/java/test/TestH5.java
index 3ab4f3c..f8c2721 100644
--- a/java/test/TestH5.java
+++ b/java/test/TestH5.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -164,7 +162,7 @@ public class TestH5 {
      */
     @Test
     public void testH5get_libversion() {
-        int libversion[] = { 1, 10, 0 };
+        int libversion[] = { 1, 10, 1 };
 
         try {
             H5.H5get_libversion(libversion);
@@ -186,7 +184,7 @@ public class TestH5 {
      */
     @Test
     public void testH5check_version() {
-        int majnum = 1, minnum = 10, relnum = 0;
+        int majnum = 1, minnum = 10, relnum = 1;
 
         try {
             H5.H5check_version(majnum, minnum, relnum);
@@ -245,7 +243,7 @@ public class TestH5 {
 
             assertTrue("H5.LIB_VERSION[0]", test.LIB_VERSION[0]==H5.LIB_VERSION[0]);
             assertTrue("H5.LIB_VERSION[1]", test.LIB_VERSION[1]==H5.LIB_VERSION[1]);
-            assertTrue("H5.LIB_VERSION[2]", test.LIB_VERSION[2]==H5.LIB_VERSION[2]);
+//            assertTrue("H5.LIB_VERSION[2]", test.LIB_VERSION[2]==H5.LIB_VERSION[2]);
 
             // Clean up the file
             new File("temph5.ser").delete();
diff --git a/java/test/TestH5A.java b/java/test/TestH5A.java
index fb7b31a..5e1e3f6 100644
--- a/java/test/TestH5A.java
+++ b/java/test/TestH5A.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5D.java b/java/test/TestH5D.java
index fa051db..372fdba 100644
--- a/java/test/TestH5D.java
+++ b/java/test/TestH5D.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Dparams.java b/java/test/TestH5Dparams.java
index 2cdd121..a3618f2 100644
--- a/java/test/TestH5Dparams.java
+++ b/java/test/TestH5Dparams.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Dplist.java b/java/test/TestH5Dplist.java
index eb1669f..6feaa23 100644
--- a/java/test/TestH5Dplist.java
+++ b/java/test/TestH5Dplist.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5E.java b/java/test/TestH5E.java
index 028369d..9a36365 100644
--- a/java/test/TestH5E.java
+++ b/java/test/TestH5E.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -543,8 +541,8 @@ public class TestH5E {
         }
         assertFalse("testH5Ewalk:H5Ewalk2 ",((H5E_walk_data)walk_data).walkdata.isEmpty());
         assertTrue("testH5Ewalk:H5Ewalk2 "+((H5E_walk_data)walk_data).walkdata.size(),((H5E_walk_data)walk_data).walkdata.size()==3);
-        assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).line,((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).line==3767);
-        assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).line,((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).line==5506);
+        assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).line,((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).line==3765);
+        assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).line,((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).line==5504);
         assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).func_name,((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).func_name.compareToIgnoreCase("H5P_verify_apl_and_dxpl")==0);
         assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).err_desc,((wdata)((H5E_walk_data)walk_data).walkdata.get(0)).err_desc.compareToIgnoreCase("not a property list")==0);
         assertTrue("testH5Ewalk:H5Ewalk2 "+((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).err_desc,((wdata)((H5E_walk_data)walk_data).walkdata.get(1)).err_desc.compareToIgnoreCase("not the required access property list")==0);
diff --git a/java/test/TestH5Edefault.java b/java/test/TestH5Edefault.java
index 510aa2f..835ccba 100644
--- a/java/test/TestH5Edefault.java
+++ b/java/test/TestH5Edefault.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Eregister.java b/java/test/TestH5Eregister.java
index 13e0ca2..742b47f 100644
--- a/java/test/TestH5Eregister.java
+++ b/java/test/TestH5Eregister.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5F.java b/java/test/TestH5F.java
index 3451187..ac2f70d 100644
--- a/java/test/TestH5F.java
+++ b/java/test/TestH5F.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Fbasic.java b/java/test/TestH5Fbasic.java
index c08daff..faf0bf7 100644
--- a/java/test/TestH5Fbasic.java
+++ b/java/test/TestH5Fbasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Fparams.java b/java/test/TestH5Fparams.java
index 2d67f3d..fffded1 100644
--- a/java/test/TestH5Fparams.java
+++ b/java/test/TestH5Fparams.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Fswmr.java b/java/test/TestH5Fswmr.java
index b65ebf2..5ca1a97 100644
--- a/java/test/TestH5Fswmr.java
+++ b/java/test/TestH5Fswmr.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5G.java b/java/test/TestH5G.java
index 32329bb..1a67990 100644
--- a/java/test/TestH5G.java
+++ b/java/test/TestH5G.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Gbasic.java b/java/test/TestH5Gbasic.java
index b049e15..6ff7d03 100644
--- a/java/test/TestH5Gbasic.java
+++ b/java/test/TestH5Gbasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Giterate.java b/java/test/TestH5Giterate.java
index 17f594e..06c59e7 100644
--- a/java/test/TestH5Giterate.java
+++ b/java/test/TestH5Giterate.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Lbasic.java b/java/test/TestH5Lbasic.java
index c35519e..9e832f3 100644
--- a/java/test/TestH5Lbasic.java
+++ b/java/test/TestH5Lbasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Lcreate.java b/java/test/TestH5Lcreate.java
index 2fbd9e3..dcb076d 100644
--- a/java/test/TestH5Lcreate.java
+++ b/java/test/TestH5Lcreate.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Lparams.java b/java/test/TestH5Lparams.java
index 9a2c204..c8d5f5d 100644
--- a/java/test/TestH5Lparams.java
+++ b/java/test/TestH5Lparams.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Obasic.java b/java/test/TestH5Obasic.java
index b564089..923d2b1 100644
--- a/java/test/TestH5Obasic.java
+++ b/java/test/TestH5Obasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Ocopy.java b/java/test/TestH5Ocopy.java
index 62dd886..e730b9f 100644
--- a/java/test/TestH5Ocopy.java
+++ b/java/test/TestH5Ocopy.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -239,6 +237,7 @@ public class TestH5Ocopy {
             try {H5.H5Pclose(ocp_plist_id);} catch (Exception ex) {}
             try {H5.H5Fclose(H5fid2);} catch (Exception ex) {}
         }
+        _deleteFile("copy.h5");
     }
 
     @Test
diff --git a/java/test/TestH5Ocreate.java b/java/test/TestH5Ocreate.java
index 0edecba..559e12b 100644
--- a/java/test/TestH5Ocreate.java
+++ b/java/test/TestH5Ocreate.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Oparams.java b/java/test/TestH5Oparams.java
index 9398940..2af190f 100644
--- a/java/test/TestH5Oparams.java
+++ b/java/test/TestH5Oparams.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5P.java b/java/test/TestH5P.java
index b8a4376..5aafb5b 100644
--- a/java/test/TestH5P.java
+++ b/java/test/TestH5P.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -1198,25 +1196,40 @@ public class TestH5P {
     }
 
     @Test
-    public void testH5P_file_space() {
+    public void testH5P_file_space_strategy() {
         long[] threshold = {0};
-        int[] strategy = {0};
+        boolean[] persist = {false};
+        int strategy = 0;
         try {
-            H5.H5Pget_file_space(fcpl_id, strategy, threshold);
-            assertTrue("strategy: "+strategy[0], strategy[0] == HDF5Constants.H5F_FILE_SPACE_ALL);
+            strategy = H5.H5Pget_file_space_strategy(fcpl_id, persist, threshold);
+            assertTrue("strategy(default): "+strategy, strategy == HDF5Constants.H5F_FSPACE_STRATEGY_FSM_AGGR);
+            assertTrue("persist(default): "+persist[0], persist[0] == false);
+            assertTrue("theshold(default): "+threshold[0], threshold[0] == 1);
+            H5.H5Pset_file_space_strategy(fcpl_id, HDF5Constants.H5F_FSPACE_STRATEGY_PAGE, true, 1);
+            strategy = H5.H5Pget_file_space_strategy(fcpl_id, persist, threshold);
+            assertTrue("strategy: "+strategy, strategy == HDF5Constants.H5F_FSPACE_STRATEGY_PAGE);
+            assertTrue("persist: "+persist[0], persist[0] == true);
             assertTrue("theshold: "+threshold[0], threshold[0] == 1);
-            H5.H5Pset_file_space(fcpl_id, HDF5Constants.H5F_FILE_SPACE_ALL_PERSIST, 10);
-            H5.H5Pget_file_space(fcpl_id, strategy, threshold);
-            assertTrue("strategy: "+strategy[0], strategy[0] == HDF5Constants.H5F_FILE_SPACE_ALL_PERSIST);
-            assertTrue("theshold: "+threshold[0], threshold[0] == 10);
-            H5.H5Pset_file_space(fcpl_id, HDF5Constants.H5F_FILE_SPACE_VFD, 0);
-            H5.H5Pget_file_space(fcpl_id, strategy, threshold);
-            assertTrue("strategy: "+strategy[0], strategy[0] == HDF5Constants.H5F_FILE_SPACE_VFD);
-            assertTrue("theshold: "+threshold[0], threshold[0] == 10);
         }
         catch (Throwable err) {
             err.printStackTrace();
-            fail("testH5P_file_space: " + err);
+            fail("testH5P_file_space_strategy: " + err);
+        }
+    }
+
+    @Test
+    public void testH5P_file_space_page_size() {
+        long page_size = 0;
+        try {
+            page_size = H5.H5Pget_file_space_page_size(fcpl_id);
+            assertTrue("page_size(default): "+page_size, page_size == 4096);
+            H5.H5Pset_file_space_page_size(fcpl_id, 512);
+            page_size = H5.H5Pget_file_space_page_size(fcpl_id);
+            assertTrue("page_size: "+page_size, page_size == 512);
+        }
+        catch (Throwable err) {
+            err.printStackTrace();
+            fail("testH5P_file_space_page_size: " + err);
         }
    }
 }
diff --git a/java/test/TestH5PData.java b/java/test/TestH5PData.java
index 7fc154d..c414d67 100644
--- a/java/test/TestH5PData.java
+++ b/java/test/TestH5PData.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5PL.java b/java/test/TestH5PL.java
index afcb88a..aa59478 100644
--- a/java/test/TestH5PL.java
+++ b/java/test/TestH5PL.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -23,12 +21,22 @@ import hdf.hdf5lib.exceptions.HDF5LibraryException;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestName;
 
 public class TestH5PL {
     @Rule public TestName testname = new TestName();
+    private static String FILENAME = "h5_dlopenChunk.h5";
+    private static String DATASETNAME = "DS1";
+    private static final int DIM_X = 6;
+    private static final int DIM_Y = 8;
+    private static final int CHUNK_X = 4;
+    private static final int CHUNK_Y = 4;
+    private static final int RANK = 2;
+    private static final int NDIMS = 2;
+    private static final int H5Z_FILTER_DYNLIB4 = 260;
 
     @Before
     public void checkOpenIDs() {
@@ -58,4 +66,147 @@ public class TestH5PL {
             fail("TestH5PLplugins " + err);
         }
     }
+
+    @Test
+    public void TestH5PLpaths() {
+        try {
+            int original_entries = H5.H5PLsize();
+            H5.H5PLappend("path_one");
+            int plugin_entries = H5.H5PLsize();
+            assertTrue("H5.H5PLsize: "+plugin_entries, (original_entries+1) == plugin_entries);
+            H5.H5PLprepend("path_two");
+            plugin_entries = H5.H5PLsize();
+            assertTrue("H5.H5PLsize: "+plugin_entries, (original_entries+2) == plugin_entries);
+            H5.H5PLinsert("path_three", original_entries);
+            plugin_entries = H5.H5PLsize();
+            assertTrue("H5.H5PLsize: "+plugin_entries, (original_entries+3) == plugin_entries);
+            String first_path = H5.H5PLget(original_entries);
+            assertTrue("First path was : "+first_path + " ",first_path.compareToIgnoreCase("path_three")==0);
+            H5.H5PLreplace("path_four", original_entries);
+            first_path = H5.H5PLget(original_entries);
+            assertTrue("First path changed to : "+first_path + " ",first_path.compareToIgnoreCase("path_four")==0);
+            H5.H5PLremove(original_entries);
+            first_path = H5.H5PLget(original_entries);
+            assertTrue("First path now : "+first_path + " ",first_path.compareToIgnoreCase("path_two")==0);
+            plugin_entries = H5.H5PLsize();
+            assertTrue("H5.H5PLsize: "+plugin_entries, (original_entries+2) == plugin_entries);
+        }
+        catch (Throwable err) {
+            err.printStackTrace();
+            fail("TestH5PLpaths " + err);
+        }
+    }
+
+    @Ignore
+    public void TestH5PLdlopen() {
+        long file_id = -1;
+        long filespace_id = -1;
+        long dataset_id = -1;
+        long fapl_id = -1;
+        long dcpl_id = -1;
+        try {
+            int[]  cd_values = {9, 0, 0, 0};
+            int[] libversion = {0, 0, 0};
+            long[] dims = { DIM_X, DIM_Y };
+            long[] chunk_dims = { CHUNK_X, CHUNK_Y };
+            int[][] dset_data = new int[DIM_X][DIM_Y];
+            int[] mdc_nelmts = {0};
+            long[] rdcc_nelmts = {0};
+            long[] rdcc_nbytes = {0};
+            double[] rdcc_w0 = {0};
+
+            // Initialize data to "1", to make it easier to see the selections.
+            for (int indx = 0; indx < DIM_X; indx++)
+                for (int jndx = 0; jndx < DIM_Y; jndx++)
+                    dset_data[indx][jndx] = 1;
+
+            // Create a new file using default properties.
+            try {
+                file_id = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT,
+                        HDF5Constants.H5P_DEFAULT);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Fcreate:" + e);
+            }
+
+            // Create dataspace. Setting maximum size to NULL sets the maximum
+            // size to be the current size.
+            try {
+                filespace_id = H5.H5Screate_simple(RANK, dims, null);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Screate_simple:" + e);
+            }
+
+            // Create the dataset creation property list.
+            try {
+                dcpl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_CREATE);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Pcreate:" + e);
+            }
+
+            // Set the chunk size.
+            try {
+                if (dcpl_id >= 0)
+                    H5.H5Pset_chunk(dcpl_id, NDIMS, chunk_dims);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Pset_chunk:" + e);
+            }
+
+            try {
+                H5.H5get_libversion(libversion);
+                cd_values[1] = libversion[0];
+                cd_values[2] = libversion[1];
+                cd_values[3] = libversion[2];
+                if (dcpl_id >= 0)
+                    H5.H5Pset_filter(dcpl_id, H5Z_FILTER_DYNLIB4, HDF5Constants.H5Z_FLAG_MANDATORY, 4, cd_values);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Pset_filter:" + e);
+            }
+
+            // Create the chunked dataset.
+            try {
+                if ((file_id >= 0) && (filespace_id >= 0) && (dcpl_id >= 0))
+                    dataset_id = H5.H5Dcreate(file_id, DATASETNAME, HDF5Constants.H5T_NATIVE_INT, filespace_id,
+                            HDF5Constants.H5P_DEFAULT, dcpl_id, HDF5Constants.H5P_DEFAULT);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Dcreate:" + e);
+            }
+
+            try {
+                if (dataset_id >= 0)
+                    H5.H5Dwrite(dataset_id, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL,
+                            HDF5Constants.H5S_ALL, dset_data);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+                fail("TestH5PLdlopen H5Dwrite:" + e);
+            }
+        }
+        catch (Throwable err) {
+            err.printStackTrace();
+            fail("TestH5PLdlopen " + err);
+        }
+        finally {
+            // End access to the dataset and release resources used by it.
+            if (dcpl_id >= 0)
+                try {H5.H5Pclose_class(dcpl_id);} catch (Throwable err) {}
+            if (dataset_id >= 0)
+                try {H5.H5Dclose(dataset_id);} catch (Throwable err) {}
+            if (filespace_id >= 0)
+                try {H5.H5Sclose(filespace_id);} catch (Throwable err) {}
+            if (file_id >= 0)
+                try {H5.H5Fclose(file_id);} catch (Throwable err) {}
+        }
+    }
 }
diff --git a/java/test/TestH5Pfapl.java b/java/test/TestH5Pfapl.java
index e888e20..d4a2231 100644
--- a/java/test/TestH5Pfapl.java
+++ b/java/test/TestH5Pfapl.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Plist.java b/java/test/TestH5Plist.java
index 024237a..e318cc9 100644
--- a/java/test/TestH5Plist.java
+++ b/java/test/TestH5Plist.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Pvirtual.java b/java/test/TestH5Pvirtual.java
index 9372ae1..40cfbac 100644
--- a/java/test/TestH5Pvirtual.java
+++ b/java/test/TestH5Pvirtual.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
@@ -220,6 +218,7 @@ public class TestH5Pvirtual {
                 try {H5.H5Dclose(H5did);} catch (Exception ex) {}
         }
         assertTrue("testH5Pget_virtual_count: "+num_map, num_map >= 0);
+        assertEquals(3, num_map);
     }
 
     @Test
@@ -406,7 +405,7 @@ public class TestH5Pvirtual {
         }
     }
 
-    @Ignore
+    @Test
     public void  testH5Pset_get_virtual_printf_gap() {
         long ret_val = -1;
         H5did = _createDataset(H5fid, H5dsid, "VDS", H5dcplid, H5dapl_id);
@@ -415,7 +414,7 @@ public class TestH5Pvirtual {
             assertTrue("H5Pget_virtual_printf_gap", ret_val >= 0);
             assertEquals(0, ret_val);
             H5.H5Pset_virtual_printf_gap(H5dapl_id, 2);
-            ret_val = H5.H5Pget_virtual_view(H5dapl_id);
+            ret_val = H5.H5Pget_virtual_printf_gap(H5dapl_id);
             assertTrue("H5Pget_virtual_printf_gap", ret_val >= 0);
             assertEquals(2, ret_val);
         }
diff --git a/java/test/TestH5R.java b/java/test/TestH5R.java
index 72e0bfb..5349855 100644
--- a/java/test/TestH5R.java
+++ b/java/test/TestH5R.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5S.java b/java/test/TestH5S.java
index 909ab02..985342b 100644
--- a/java/test/TestH5S.java
+++ b/java/test/TestH5S.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Sbasic.java b/java/test/TestH5Sbasic.java
index 2731a06..3007495 100644
--- a/java/test/TestH5Sbasic.java
+++ b/java/test/TestH5Sbasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5T.java b/java/test/TestH5T.java
index e03b97f..0c68d2e 100644
--- a/java/test/TestH5T.java
+++ b/java/test/TestH5T.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Tbasic.java b/java/test/TestH5Tbasic.java
index 950f1c7..3c2500b 100644
--- a/java/test/TestH5Tbasic.java
+++ b/java/test/TestH5Tbasic.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Tparams.java b/java/test/TestH5Tparams.java
index 4ebeea7..53d3a37 100644
--- a/java/test/TestH5Tparams.java
+++ b/java/test/TestH5Tparams.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/TestH5Z.java b/java/test/TestH5Z.java
index bdf3f1d..31adf22 100644
--- a/java/test/TestH5Z.java
+++ b/java/test/TestH5Z.java
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 package test;
diff --git a/java/test/junit.sh.in b/java/test/junit.sh.in
index f37703a..32b0832 100644
--- a/java/test/junit.sh.in
+++ b/java/test/junit.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 top_builddir=@top_builddir@
@@ -39,7 +37,7 @@ myos=`uname -s`
 
 # where the libs exist
 HDFLIB_HOME="$top_srcdir/java/lib"
-BLDLIBDIR="$top_builddir/java/lib"
+BLDLIBDIR="$top_builddir/hdf5/lib"
 BLDDIR="."
 HDFTEST_HOME="$top_srcdir/java/test"
 JARFILE=jar at PACKAGE_TARNAME@- at PACKAGE_VERSION@.jar
@@ -55,12 +53,14 @@ test -d $BLDLIBDIR || mkdir -p $BLDLIBDIR
 #       Comment '#' without space can be used.
 # --------------------------------------------------------------------
 LIST_LIBRARY_FILES="
+$top_builddir/src/.libs/libhdf5.*
+$top_builddir/java/src/jni/.libs/libhdf5_java.*
+"
+LIST_JAR_FILES="
 $HDFLIB_HOME/hamcrest-core.jar
 $HDFLIB_HOME/junit.jar
 $HDFLIB_HOME/slf4j-api-1.7.5.jar
 $HDFLIB_HOME/ext/slf4j-simple-1.7.5.jar
-$top_builddir/src/.libs/libhdf5.*
-$top_builddir/java/src/jni/.libs/libhdf5_java.*
 $top_builddir/java/src/$JARFILE
 "
 LIST_DATA_FILES="
@@ -77,6 +77,7 @@ actual_ext="JUnit-interface.ext"
 # copy files from source dirs to test dir
 #
 COPY_LIBFILES="$LIST_LIBRARY_FILES"
+COPY_JARFILES="$LIST_JAR_FILES"
 
 COPY_LIBFILES_TO_BLDLIBDIR()
 {
@@ -104,6 +105,30 @@ COPY_LIBFILES_TO_BLDLIBDIR()
             fi
         fi
     done
+    # copy jar files. Used -f to make sure get a new copy
+    for tstfile in $COPY_JARFILES
+    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 $BLDLIBDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+                $CP -f $tstfile $BLDLIBDIR
+                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_LIBFILES_AND_BLDLIBDIR()
@@ -111,7 +136,7 @@ CLEAN_LIBFILES_AND_BLDLIBDIR()
     # skip rm if srcdir is same as destdir
     # this occurs when build/test performed in source dir and
     # make cp fail
-    SDIR=`$DIRNAME $HDFLIB_HOME/junit.jar`
+    SDIR=$HDFLIB_HOME
     INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
     INODE_DDIR=`$LS -i -d $BLDLIBDIR | $AWK -F' ' '{print $1}'`
     if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
@@ -156,7 +181,16 @@ CLEAN_DATAFILES_AND_BLDDIR()
         $RM $BLDDIR/JUnit-interface.out
         $RM $BLDDIR/JUnit-interface.err
         $RM $BLDDIR/JUnit-interface.ext
+    # 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 $BLDDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $BLDDIR/JUnit-interface.ert
         $RM $BLDDIR/JUnit-interface.txt
+    fi        
 }
 
 # Print a line-line message left justified in a field of 70 characters
diff --git a/m4/aclocal_cxx.m4 b/m4/aclocal_cxx.m4
index b44ae82..29a0607 100644
--- a/m4/aclocal_cxx.m4
+++ b/m4/aclocal_cxx.m4
@@ -6,12 +6,10 @@ dnl All rights reserved.
 dnl
 dnl This file is part of HDF5.  The full HDF5 copyright notice, including
 dnl terms governing use, modification, and redistribution, is contained in
-dnl the files COPYING and Copyright.html.  COPYING can be found at the root
-dnl of the source code distribution tree; Copyright.html can be found at the
-dnl root level of an installed copy of the electronic HDF5 document set and
-dnl is linked from the top-level documents page.  It can also be found at
-dnl http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
-dnl access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu.
+dnl the COPYING file, which can be found at the root of the source code
+dnl distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+dnl If you do not have access to either file, you may request a copy from
+dnl help at hdfgroup.org
 dnl
 dnl -------------------------------------------------------------------------
 dnl -------------------------------------------------------------------------
@@ -26,14 +24,11 @@ dnl we need as part of the C++ support.  To distinquish these, they
 dnl have a [PAC] prefix.
 
 dnl Checking if C++ needs old style header files in includes
-
 AC_DEFUN([PAC_PROG_CXX_HEADERS],[
   AC_MSG_CHECKING([if $CXX needs old style header files in includes])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([
-#include <iostream>
+  TEST_SRC="`(echo \"#define OLD_HEADER_FILENAME 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
 
-int main(void) { return 0; }
-  ])],
+  AC_LINK_IFELSE([AC_LANG_SOURCE([$TEST_SRC])],
     [AC_MSG_RESULT([no])],
     [AC_MSG_RESULT([yes])
     CXXFLAGS="${CXXFLAGS} -DOLD_HEADER_FILENAME"
@@ -41,80 +36,43 @@ int main(void) { return 0; }
 ])
 
 dnl Checking if ++ can handle namespaces
-
 AC_DEFUN([PAC_PROG_CXX_NAMESPACE],[
   AC_MSG_CHECKING([if $CXX can handle namespaces])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([
-namespace H5 {
-int fnord;
-}
+  TEST_SRC="`(echo \"#define HDF_NO_NAMESPACE 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
 
-int main(void) {
-   using namespace H5;
-   fnord = 37;
-   return 0;
-} 
-  ])], [AC_MSG_RESULT([yes])],
+  AC_LINK_IFELSE([AC_LANG_SOURCE([$TEST_SRC])], [AC_MSG_RESULT([yes])],
      [AC_MSG_RESULT([no])
-     CXXFLAGS="${CXXFLAGS} -DH5_NO_NAMESPACE"
-     AM_CXXFLAGS="${AM_CXXFLAGS} -DH5_NO_NAMESPACE"])
+     CXXFLAGS="${CXXFLAGS} -DHDF_NO_NAMESPACE"
+     AM_CXXFLAGS="${AM_CXXFLAGS} -DHDF_NO_NAMESPACE"])
 ])
 
 dnl Checking if C++ supports std
-
 AC_DEFUN([PAC_PROG_CXX_STD],[
   AC_MSG_CHECKING([if $CXX supports std])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([
-#include <string>
-
-using namespace std;
+  TEST_SRC="`(echo \"#define HDF_NO_STD 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
 
-int main(void) {
-   string myString("testing namespace std");
-   return 0;
-}
-  ])], [AC_MSG_RESULT([yes])],
+  AC_LINK_IFELSE([AC_LANG_SOURCE([$TEST_SRC])], [AC_MSG_RESULT([yes])],
      [AC_MSG_RESULT([no])
      CXXFLAGS="${CXXFLAGS} -DH5_NO_STD"
      AM_CXXFLAGS="${AM_CXXFLAGS} -DH5_NO_STD"])
 ])
 
 dnl Checking if C++ has offsetof extension
-
 AC_DEFUN([PAC_PROG_CXX_OFFSETOF],[
   AC_MSG_CHECKING([if $CXX has offsetof extension])
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([
-  #include <stdio.h>
-  #include <stddef.h>
-    ],[
-    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)
-    ])],[AC_MSG_RESULT([yes])
+  TEST_SRC="`(echo \"#define CXX_HAVE_OFFSETOF 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
+
+  AC_LINK_IFELSE([AC_LANG_SOURCE([$TEST_SRC])],[AC_MSG_RESULT([yes])
     AC_DEFINE([CXX_HAVE_OFFSETOF], [1], [Define if C++ compiler recognizes offsetof])],
     AC_MSG_RESULT([no]))
 ])
 
 dnl Checking if C++ can handle static cast
-
 AC_DEFUN([PAC_PROG_CXX_STATIC_CAST],[
   AC_MSG_CHECKING([if $CXX can handle static cast])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([
-int main(void) {
-   float test_float;
-   int test_int;
-   test_float = 37.0;
-   test_int = static_cast <int> (test_float);
-   return 0;
-}
-  ])], [AC_MSG_RESULT([yes])],
+  TEST_SRC="`(echo \"#define NO_STATIC_CAST 1\"; cat $srcdir/config/cmake_ext_mod/HDFCXXTests.cpp)`"
+
+  AC_LINK_IFELSE([AC_LANG_SOURCE([$TEST_SRC])], [AC_MSG_RESULT([yes])],
     [AC_MSG_RESULT([no])
     CXXFLAGS="${CXXFLAGS} -DNO_STATIC_CAST"
     AM_CXXFLAGS="${AM_CXXFLAGS} -DNO_STATIC_CAST"])
diff --git a/m4/aclocal_fc.f90 b/m4/aclocal_fc.f90
new file mode 100644
index 0000000..4c58e4e
--- /dev/null
+++ b/m4/aclocal_fc.f90
@@ -0,0 +1,149 @@
+! 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 COPYING file, which can be found at the root of the source code       *
+!   distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+!   If you do not have access to either file, you may request a copy from     *
+!   help at hdfgroup.org.                                                        *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! This file contains all the configure test programs 
+! used by autotools and cmake. This avoids having to
+! duplicate code for both cmake and autotool tests.
+! For autotools, a program below is chosen via a
+! sed command in aclocal_fc.m4. For cmake, a program
+! below is chosen via the macro READ_SOURCE in 
+! HDF5UseFortran.cmake
+!
+
+PROGRAM PROG_FC_ISO_FORTRAN_ENV
+  USE, INTRINSIC :: ISO_FORTRAN_ENV
+END PROGRAM PROG_FC_ISO_FORTRAN_ENV
+
+PROGRAM PROG_FC_SIZEOF
+  i = sizeof(x)
+END PROGRAM PROG_FC_SIZEOF
+
+PROGRAM PROG_FC_C_SIZEOF
+  USE ISO_C_BINDING
+  INTEGER(C_INT) :: a
+  INTEGER(C_SIZE_T) :: RESULT
+  RESULT = C_SIZEOF(a)
+END PROGRAM PROG_FC_C_SIZEOF
+
+PROGRAM PROG_FC_STORAGE_SIZE
+  INTEGER :: a
+  INTEGER :: RESULT
+  RESULT = STORAGE_SIZE(a)
+END PROGRAM PROG_FC_STORAGE_SIZE
+
+PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE
+  USE ISO_C_BINDING
+  REAL(KIND=C_LONG_DOUBLE) :: d
+END PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE
+
+PROGRAM PROG_FC_HAVE_F2003_REQUIREMENTS
+  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 PROGRAM PROG_FC_HAVE_F2003_REQUIREMENTS
+
+!---- START ----- Check to see C_LONG_DOUBLE is different from C_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 PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE
+  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 PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE
+!---- END ------- Check to see C_LONG_DOUBLE is different from C_DOUBLE
+
+!---- START ----- Determine the available KINDs for REALs and INTEGERs
+PROGRAM FC_AVAIL_KINDS
+      IMPLICIT NONE
+      INTEGER :: ik, jk, k, max_decimal_prec
+      INTEGER :: num_rkinds = 1, num_ikinds = 1
+      INTEGER, DIMENSION(1:10) :: list_ikinds = -1
+      INTEGER, DIMENSION(1:10) :: list_rkinds = -1
+  
+      OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+
+      ! Find integer KINDs
+      list_ikinds(num_ikinds)=SELECTED_INT_KIND(1)
+      DO ik = 2, 36
+         k = SELECTED_INT_KIND(ik)
+         IF(k.LT.0) EXIT
+         IF(k.GT.list_ikinds(num_ikinds))THEN
+            num_ikinds = num_ikinds + 1
+            list_ikinds(num_ikinds) = k
+         ENDIF
+      ENDDO
+
+      DO k = 1, num_ikinds
+         WRITE(8,'(I0)', ADVANCE='NO') list_ikinds(k)
+         IF(k.NE.num_ikinds)THEN
+            WRITE(8,'(A)',ADVANCE='NO') ','
+         ELSE
+            WRITE(8,'()')
+         ENDIF
+      ENDDO
+
+      ! Find real KINDs
+      list_rkinds(num_rkinds)=SELECTED_REAL_KIND(1)
+      max_decimal_prec = 1
+
+      prec: DO ik = 2, 36
+         exp: DO jk = 1, 17000
+            k = SELECTED_REAL_KIND(ik,jk)
+            IF(k.LT.0) EXIT exp
+            IF(k.GT.list_rkinds(num_rkinds))THEN
+               num_rkinds = num_rkinds + 1
+               list_rkinds(num_rkinds) = k
+            ENDIF
+            max_decimal_prec = ik
+         ENDDO exp
+      ENDDO prec
+
+      DO k = 1, num_rkinds
+         WRITE(8,'(I0)', ADVANCE='NO') list_rkinds(k)
+         IF(k.NE.num_rkinds)THEN
+            WRITE(8,'(A)',ADVANCE='NO') ','
+         ELSE
+            WRITE(8,'()')
+         ENDIF
+      ENDDO
+
+     WRITE(8,'(I0)') max_decimal_prec
+     WRITE(8,'(I0)') num_ikinds
+     WRITE(8,'(I0)') num_rkinds
+END PROGRAM FC_AVAIL_KINDS
+!---- END ----- Determine the available KINDs for REALs and INTEGERs
+
+PROGRAM FC_MPI_CHECK
+  INCLUDE 'mpif.h'
+  INTEGER :: comm, amode, info, fh, ierror
+  CHARACTER(LEN=1) :: filename 
+  CALL MPI_File_open( comm, filename, amode, info, fh, ierror)
+END PROGRAM FC_MPI_CHECK
diff --git a/m4/aclocal_fc.m4 b/m4/aclocal_fc.m4
index 0672e87..0bf3cb1 100644
--- a/m4/aclocal_fc.m4
+++ b/m4/aclocal_fc.m4
@@ -6,12 +6,10 @@ dnl All rights reserved.
 dnl
 dnl This file is part of HDF5.  The full HDF5 copyright notice, including
 dnl terms governing use, modification, and redistribution, is contained in
-dnl the files COPYING and Copyright.html.  COPYING can be found at the root
-dnl of the source code distribution tree; Copyright.html can be found at the
-dnl root level of an installed copy of the electronic HDF5 document set and
-dnl is linked from the top-level documents page.  It can also be found at
-dnl http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
-dnl access to either file, you may request a copy from hdfhelp at ncsa.uiuc.edu.
+dnl the COPYING file, which can be found at the root of the source code
+dnl distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+dnl If you do not have access to either file, you may request a copy from
+dnl help at hdfgroup.org
 dnl
 dnl -------------------------------------------------------------------------
 dnl -------------------------------------------------------------------------
@@ -68,11 +66,8 @@ 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])
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_ISO_FORTRAN_ENV/,/END PROGRAM PROG_FC_ISO_FORTRAN_ENV/p' $srcdir/m4/aclocal_fc.f90`"	
+  AC_LINK_IFELSE([$TEST_SRC],[AC_MSG_RESULT([yes])
      	HAVE_ISO_FORTRAN_ENV="yes"],
       [AC_MSG_RESULT([no])])
 ])
@@ -82,11 +77,8 @@ dnl See if the fortran compiler supports the intrinsic function "SIZEOF"
 AC_DEFUN([PAC_PROG_FC_SIZEOF],[
   HAVE_SIZEOF_FORTRAN="no"
   AC_MSG_CHECKING([if Fortran compiler supports intrinsic SIZEOF])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([ 
-   PROGRAM main
-     i = sizeof(x)
-   END PROGRAM
-  ])],[AC_MSG_RESULT([yes])
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_SIZEOF/,/END PROGRAM PROG_FC_SIZEOF/p' $srcdir/m4/aclocal_fc.f90`"
+  AC_LINK_IFELSE([$TEST_SRC],[AC_MSG_RESULT([yes])
      	HAVE_SIZEOF_FORTRAN="yes"],
       [AC_MSG_RESULT([no])])
 ])
@@ -96,14 +88,8 @@ dnl See if the fortran compiler supports the intrinsic function "C_SIZEOF"
 AC_DEFUN([PAC_PROG_FC_C_SIZEOF],[
   HAVE_C_SIZEOF_FORTRAN="no"
   AC_MSG_CHECKING([if Fortran compiler supports intrinsic C_SIZEOF])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([ 
-   PROGRAM main
-     USE ISO_C_BINDING
-     INTEGER(C_INT) :: a
-     INTEGER(C_SIZE_T) :: result
-     result = C_SIZEOF(a)
-   END PROGRAM
-  ])], [AC_MSG_RESULT([yes])
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_C_SIZEOF/,/END PROGRAM PROG_FC_C_SIZEOF/p' $srcdir/m4/aclocal_fc.f90`"
+  AC_LINK_IFELSE([$TEST_SRC], [AC_MSG_RESULT([yes])
      	HAVE_C_SIZEOF_FORTRAN="yes"],
      [AC_MSG_RESULT([no])])
 ])
@@ -113,13 +99,8 @@ dnl See if the fortran compiler supports the intrinsic function "STORAGE_SIZE"
 AC_DEFUN([PAC_PROG_FC_STORAGE_SIZE],[
   HAVE_STORAGE_SIZE_FORTRAN="no"
   AC_MSG_CHECKING([if Fortran compiler supports intrinsic STORAGE_SIZE])
-  AC_LINK_IFELSE([AC_LANG_SOURCE([
-   PROGRAM main
-     INTEGER :: a
-     INTEGER :: result
-     result = STORAGE_SIZE(a)
-   END PROGRAM
-  ])], [AC_MSG_RESULT([yes])
+  TEST_SRC="`sed -ne '/PROGRAM PROG_FC_STORAGE_SIZE/,/END PROGRAM PROG_FC_STORAGE_SIZE/p' $srcdir/m4/aclocal_fc.f90`"
+  AC_LINK_IFELSE([$TEST_SRC], [AC_MSG_RESULT([yes])
      	HAVE_STORAGE_SIZE_FORTRAN="yes"],
      [AC_MSG_RESULT([no])])
 
@@ -130,12 +111,9 @@ 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])
+  TEST_SRC=""
+  TEST_SRC="`sed -n '/PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE/,/END PROGRAM PROG_FC_HAVE_C_LONG_DOUBLE/p' $srcdir/m4/aclocal_fc.f90`"
+  AC_LINK_IFELSE([$TEST_SRC], [AC_MSG_RESULT([yes])
      	HAVE_C_LONG_DOUBLE_FORTRAN="yes"],
      [AC_MSG_RESULT([no])])
 ])
@@ -146,31 +124,8 @@ 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_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
-    ])], [AC_MSG_RESULT([yes]) 
+  TEST_SRC="`sed -n '/MODULE type_mod/,/END PROGRAM PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE/p' $srcdir/m4/aclocal_fc.f90`"
+  AC_COMPILE_IFELSE([$TEST_SRC], [AC_MSG_RESULT([yes]) 
             C_LONG_DOUBLE_IS_UNIQUE_FORTRAN="yes"], 
          [AC_MSG_RESULT([no])])
 ])
@@ -180,24 +135,12 @@ dnl Checking if the compiler supports the required Fortran 2003 features and
 dnl disable Fortran 2003 if it does not.
 
 AC_DEFUN([PAC_PROG_FC_HAVE_F2003_REQUIREMENTS],[
+   HAVE_F2003_REQUIREMENTS="no"
    AC_MSG_CHECKING([if Fortran compiler version compatible with Fortran 2003 HDF])
-dnl --------------------------------------------------------------------
-dnl Default for FORTRAN 2003 compliant compilers
-dnl
-    HAVE_F2003_REQUIREMENTS="no"
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[
-
-        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))
-
-        ])],[AC_MSG_RESULT([yes])
-        HAVE_F2003_REQUIREMENTS=[yes]], 
-      [AC_MSG_RESULT([no])])
+   TEST_SRC="`sed -n '/PROG_FC_HAVE_F2003_REQUIREMENTS/,/END PROGRAM PROG_FC_HAVE_F2003_REQUIREMENTS/p' $srcdir/m4/aclocal_fc.f90`"
+   AC_COMPILE_IFELSE([$TEST_SRC], [AC_MSG_RESULT([yes]) 
+            HAVE_F2003_REQUIREMENTS="yes"], 
+         [AC_MSG_RESULT([no])])
 ])
 
 dnl -------------------------------------------------------------------------
@@ -294,16 +237,10 @@ AC_DEFUN([PAC_PROG_FC_MPI_CHECK],[
 
 dnl   Change to the Fortran 90 language
       AC_LANG_PUSH(Fortran)
-
+      TEST_SRC="`sed -n '/PROGRAM FC_MPI_CHECK/,/END PROGRAM FC_MPI_CHECK/p' $srcdir/m4/aclocal_fc.f90`"
 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
-          INCLUDE 'mpif.h'
-          INTEGER :: comm, amode, info, fh, ierror
-          CHARACTER(LEN=1) :: filename 
-          CALL MPI_File_open( comm, filename, amode, info, fh, ierror)
-          END],
+      AC_LINK_IFELSE([$TEST_SRC],
 	  [AC_MSG_RESULT([yes])],
 	  [AC_MSG_RESULT([no])
 	   AC_MSG_ERROR([unable to link a simple MPI-IO Fortran program])])
@@ -321,69 +258,9 @@ 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, jk, k, max_decimal_prec
-      INTEGER :: num_rkinds = 1, num_ikinds = 1
-      INTEGER, DIMENSION(1:10) :: list_ikinds = -1
-      INTEGER, DIMENSION(1:10) :: list_rkinds = -1
-  
-      OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
-
-      ! Find integer KINDs
-      list_ikinds(num_ikinds)=SELECTED_INT_KIND(1)
-      DO ik = 2, 36
-         k = SELECTED_INT_KIND(ik)
-         IF(k.LT.0) EXIT
-         IF(k.GT.list_ikinds(num_ikinds))THEN
-            num_ikinds = num_ikinds + 1
-            list_ikinds(num_ikinds) = k
-         ENDIF
-      ENDDO
-
-      DO k = 1, num_ikinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_ikinds(k)
-         IF(k.NE.num_ikinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-      ! Find real KINDs
-      list_rkinds(num_rkinds)=SELECTED_REAL_KIND(1)
-      max_decimal_prec = 1
-
-      prec: DO ik = 2, 36
-         exp: DO jk = 1, 17000
-            k = SELECTED_REAL_KIND(ik,jk)
-            IF(k.LT.0) EXIT exp
-            IF(k.GT.list_rkinds(num_rkinds))THEN
-               num_rkinds = num_rkinds + 1
-               list_rkinds(num_rkinds) = k
-            ENDIF
-            max_decimal_prec = ik
-         ENDDO exp
-      ENDDO prec
-
-      DO k = 1, num_rkinds
-         WRITE(8,'(I0)', ADVANCE='NO') list_rkinds(k)
-         IF(k.NE.num_rkinds)THEN
-            WRITE(8,'(A)',ADVANCE='NO') ','
-         ELSE
-            WRITE(8,'()')
-         ENDIF
-      ENDDO
-
-     WRITE(8,'(I0)') max_decimal_prec
-     WRITE(8,'(I0)') num_ikinds
-     WRITE(8,'(I0)') num_rkinds
-    END PROGRAM main
-    ])
-],[
+TEST_SRC="`sed -n '/PROGRAM FC_AVAIL_KINDS/,/END PROGRAM FC_AVAIL_KINDS/p' $srcdir/m4/aclocal_fc.f90`"
+AC_RUN_IFELSE([$TEST_SRC],
+ [
     if test -s pac_fconftest.out ; then
 	
      dnl The output from the above program will be:
@@ -401,7 +278,8 @@ AC_RUN_IFELSE([
         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`"
+        PAC_FORTRAN_NUM_INTEGER_KINDS="`sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `echo $PAC_FORTRAN_NUM_INTEGER_KINDS`"
 	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`/)"
@@ -411,6 +289,8 @@ AC_RUN_IFELSE([
 	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 Number of Fortran INTEGER KINDs])
+        AC_MSG_RESULT([$PAC_FORTRAN_NUM_INTEGER_KINDS])
         AC_MSG_CHECKING([for Fortran INTEGER KINDs])
         AC_MSG_RESULT([$PAC_FC_ALL_INTEGER_KINDS])
 	AC_MSG_CHECKING([for Fortran REAL KINDs])
@@ -419,12 +299,12 @@ AC_RUN_IFELSE([
 	AC_MSG_RESULT([$PAC_FC_MAX_REAL_PRECISION])
     else
         AC_MSG_RESULT([Error])
-        AC_MSG_WARN([No output from test program!])
+        AC_MSG_ERROR([No output from Fortran test program!])
     fi
     rm -f pac_fconftest.out
 ],[
     AC_MSG_RESULT([Error])
-    AC_MSG_WARN([Failed to run program to determine available KINDs])
+    AC_MSG_ERROR([Failed to run Fortran program to determine available KINDs])
 ],[])
 
 AC_LANG_POP([Fortran])
@@ -454,11 +334,11 @@ for kind in `echo $pac_validIntKinds | sed -e 's/,/ /g'`; do
                 sizes="`cat pac_fconftest.out`"
                 pack_int_sizeof="$pack_int_sizeof $sizes,"
             else
-                AC_MSG_WARN([No output from test program!])
+                AC_MSG_ERROR([No output from Fortran test program!])
             fi
             rm -f pac_fconftest.out
         ],[
-            AC_MSG_WARN([Fortran program fails to build or run!])
+            AC_MSG_ERROR([Fortran program fails to build or run!])
         ],[
             pack_int_sizeof="$2"
         ])
@@ -492,11 +372,11 @@ for kind in `echo  $pac_validRealKinds | sed -e 's/,/ /g'`; do
                 sizes="`cat pac_fconftest.out`"
                 pack_real_sizeof="$pack_real_sizeof $sizes,"
             else
-                AC_MSG_WARN([No output from test program!])
+                AC_MSG_ERROR([No output from Fortran test program!])
             fi
             rm -f pac_fconftest.out
         ],[
-            AC_MSG_WARN([Fortran program fails to build or run!])
+            AC_MSG_ERROR([Fortran program fails to build or run!])
         ],[
             pack_real_sizeof="$2"
         ])
@@ -522,29 +402,29 @@ rm -f pac_fconftest.out
                 DOUBLE PRECISION c
                 OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
                 WRITE(8,*) $FC_SIZEOF_A
-	        WRITE(8,*) kind(a)
+	        WRITE(8,*) KIND(a)
 	        WRITE(8,*) $FC_SIZEOF_B
-	        WRITE(8,*) kind(b)
+	        WRITE(8,*) KIND(b)
                 WRITE(8,*) $FC_SIZEOF_C
-                WRITE(8,*) kind(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`"
+                PAC_FORTRAN_NATIVE_INTEGER_SIZEOF="`sed -n '1p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_INTEGER_KIND="`sed -n '2p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_SIZEOF="`sed -n '3p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_KIND="`sed -n '4p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF="`sed -n '5p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_KIND="`sed -n '6p' pac_fconftest.out`"
             else
-                AC_MSG_WARN([No output from test program!])
+                AC_MSG_ERROR([No output from Fortran test program!])
             fi
             rm -f pac_fconftest.out
         ],[
-            AC_MSG_WARN([Fortran program fails to build or run!])
+            AC_MSG_ERROR([Fortran program fails to build or run!])
         ],[
             pack_int_sizeof="$2"
         ])
@@ -588,7 +468,7 @@ rm -f pac_Cconftest.out
 	        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!])
+                AC_MSG_ERROR([No output from C decimal precision program!])
             fi
             rm -f pac_Cconftest.out
         ],[
diff --git a/release_docs/COPYING b/release_docs/COPYING
index 6903daf..6497ace 100644
--- a/release_docs/COPYING
+++ b/release_docs/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/release_docs/HISTORY-1_10.txt b/release_docs/HISTORY-1_10.txt
new file mode 100644
index 0000000..03d0e3e
--- /dev/null
+++ b/release_docs/HISTORY-1_10.txt
@@ -0,0 +1,1367 @@
+HDF5 History
+============
+
+This file contains development history of the HDF5 1.10 branch
+
+02.      Release Information for hdf5-1.10.0-patch1 
+01.      Release Information for hdf5-1.10.0
+
+[Search on the string '%%%%' for section breaks of each release.]
+
+%%%%1.10.0-patch1%%%%
+
+
+HDF5 version 1.10.0-patch1 released on 2016-05-23
+================================================================================
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.8 series and
+HDF5 1.10.0 releases, and contains information on the platforms
+tested.
+
+Links to HDF5 1.10.0 source code can be found on The HDF Group's
+development FTP server at the following location:
+
+    https://www.hdfgroup.org/HDF5/release/obtain5110.html
+
+User documentation can be accessed directly at this location:
+
+    https://www.hdfgroup.org/HDF5/docNewFeatures/
+
+For more information, see the HDF5 home page:
+
+    https://www.hdfgroup.org/HDF5/
+
+If you have any questions or comments, please send them to the HDF
+Help Desk:
+
+    help at hdfgroup.org
+
+
+
+CONTENTS
+
+- New Features
+- Issues Addressed in this Release
+- Supported Platforms
+- Tested Configuration Features Summary
+- More Tested Platforms
+- Known Problems and Limitations
+
+
+
+New Features
+============
+This release supports the following features:
+
+    Configuration
+    -------------
+    - API Compatibility with HDF5 1.8 Flag Was Added
+
+      The 1.10 version of the HDF5 Library can be configured to operate
+      identically to the 1.8 library with the --with-default-api-version=v18
+      configure flag. This allows existing code to be compiled with the 1.10
+      library without requiring immediate changes to the application source
+      code. For addtional configuration options and other details, see
+      "API Compatibility Macros in HDF5" at
+      https://www.hdfgroup.org/HDF5/doc/RM/APICompatMacros.html.
+
+    - Autotools Configuration Has Been Extensively Reworked
+
+      The autotools configuration options have been updated to allow more
+      fine-grained control of the build options and to correct some bugs.
+      See configure --help for comprehensive information on each option.
+
+      Specific changes:
+
+      * --enable-debug and --enable-production are no longer accepted.
+        Use --enable-build-mode=(debug | production) instead. These set
+        appropriate defaults for symbols, optimizations, and other
+        configuration options. These defaults can be overridden by the
+        user.
+
+      * Extra debug output messages are no longer enabled with
+        --enable-debug=<package list>. Use --enable-internal-debug=<pkg list>
+        instead.
+
+      * A new --enable-symbols option allows symbols to be generated
+        independently of the build mode. --disable-symbols can be used
+        to strip symbols from the binary.
+
+      * A new --enable-asserts option sets/unsets NDEBUG. This is
+        independent of the build mode. This also enables some extra
+        low-overhead debug checks in the library.
+
+      * A new --enable-profiling option sets profiling flags. This is
+        independent of the build mode.
+
+      * A new --enable-optimization option sets the optimization level.
+        This is independent of the build mode.
+
+      * Many of these options can take a flags string that will be used
+        to build the library. This can be useful for specifying custom
+        optimization flags such as -Os and -Ofast.
+
+      * gnu C++ and Fortran use configure sub-files that update the
+        build flags and turn on warnings. The increase in warnings when
+        building these wrapper libraries is due to these flag changes
+        and not to a decrease in code quality.
+
+      * The option to clear file buffers has been removed. Any buffer that
+        will eventually be written to disk will now always be memset
+        to zero. This prevents the previous contents of the buffer from
+        being written to the disk if the buffer contents are not
+        completely overwritten, which has security implications.
+
+    - LFS Changes
+
+      The way the autotools handle large file support (LFS) has been
+      overhauled in this release.
+
+      * We assume ftello and fseeko exist
+
+      * We no longer explicitly use the *64 I/O functions. Instead, we
+        rely on a mapping provided by _FILE_OFFSET_BITS or its equivalent.
+
+      * _LARGEFILE(64)_SOURCE is no longer exported via AM_CPPFLAGS.
+
+
+
+    Parallel Library
+    -----------------
+    - Collective Metadata I/O
+
+      Calls for HDF5 metadata can result in many small reads and writes.
+      On metadata reads, collective metadata I/O can improve performance
+      by allowing the library to perform optimizations when reading the
+      metadata by having one rank read the data and broadcasting it to
+      all other ranks.
+
+      Collective metadata I/O improves metadata write performance through
+      the construction of an MPI derived datatype that is then written
+      collectively in a single call. For more information, see
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesCollectiveMetadataIoDocs.html.
+
+
+
+    Library
+    --------
+    - Concurrent Access to HDF5 Files - Single Writer/ Multple Reader (SWMR)
+
+      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.
+
+    - Virtual Dataset (VDS)
+
+      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/NewFeaturesVirtualDatasetDocs.html.
+
+    - Persistent Free File Space Tracking
+
+      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
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html.
+
+    - Version 3 Metadata Cache
+
+      The version 3 metadata cache moves management of metadata I/O from 
+      the clients to the metadata cache proper.  This change is essential for
+      SWMR and other features that have yet to be released.
+
+
+
+    C++ Library
+    ------------
+    - New Member Function Added to H5::ArrayType
+
+      The assignment operator ArrayType::operator= was added because
+      ArrayType has pointer data members.
+
+      (BMR - 2016/03/07, HDFFV-9562)
+
+
+
+    Tools
+    ------
+    - h5watch
+
+      The h5watch tool allows users to output new records appended to
+      a dataset under 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
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html#Tools.
+
+    - h5format_convert
+
+      The h5format_convert 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
+      tool does not rewrite raw data, but it does rewrite HDF5 metadata.
+
+
+
+    High-Level APIs
+    ----------------
+    - H5DOappend
+
+      The function appends data to a dataset along a specified dimension.
+
+
+    C Packet Table API
+    ------------------
+    - Replacement of a Public Function with H5PTcreate
+
+      The existing function H5PTcreate_fl limits applications so they
+      can use the deflate compression only. The public function
+      H5PTcreate has been added to replace H5PTcreate_fl. H5PTcreate
+      takes a property list identifier to provide flexibility on
+      creation properties.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - New Public Functions: H5PTget_dataset and H5PTget_type
+
+      Two accessor functions have been added. H5PTget_dataset returns
+      the identifier of the dataset associated with the packet table, 
+      and H5PTget_type returns the identifier of the datatype used by
+      the packet table.
+
+      (BMR, 2016/03/04, HDFFV-8623)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table (PT) library source except for the following functions:
+        + H5PTis_varlen() has been made available again
+        + H5PTfree_vlen_readbuff() is now H5PTfree_vlen_buff()
+
+      (BMR - 2016/03/04, HDFFV-442)
+
+    C++ Packet Table API
+    --------------------
+    - New Constructor Added to FL_PacketTable
+
+      An overloaded constructor has been added to FL_PacketTable and
+      takes a property list identifier to provide flexibility on
+      creation properties.
+
+      (BMR - 2016/03/08, HDFFV-8623)
+
+    - New Public Functions
+
+      Two accessor wrappers are added to class PacketTable.
+      PacketTable::GetDataset() returns the identifier of the dataset
+      associated with the packet table, and PacketTable::GetDatatype()
+      returns the identifier of the datatype that the packet table uses.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - Member Functions with "char*" as an Argument
+
+      Overloaded functions were added to provide the "const char*"
+      argument; the existing version will be deprecated in future
+      releases.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table library source code except for the following functions:
+        + VL_PacketTable::IsVariableLength() was moved to PacketTable
+        + VL_PacketTable::FreeReadBuff() is now PacketTable::FreeBuff()
+
+      (BMR - 2016/03/04, HDFFV-442)
+
+
+
+    Java Wrapper Library
+    --------------------
+
+    The Java HDF5 JNI library has been integrated into the HDF5 repository.
+    The configure option is "--enable-java", and the CMake option is
+    HDF5_BUILD_JAVA:BOOL=ON. The package hierarchy has changed from the
+    HDF5 1.8 JNI, which was "ncsa.hdf.hdflib.hdf5", to HDF5 1.10,
+    "hdf.hdflib.hdf5".
+
+    A number of new APIs were added including some for VDS and SWMR.
+
+
+
+    Other Important Changes
+    -----------------------
+
+    The hid_t type was changed from 32-bit to a 64-bit value.
+
+
+
+Issues Addressed in this Release Since 1.10.0
+=============================================
+
+     - h5diff would return from a compare attributes abnormally if one of the datatypes
+       was a vlen. This resulted in a memory leak as well as an incorrect report of
+       attribute comparison.
+
+       Fixed.
+       (ADB - 2016/04/26, HDFFV-9784)
+
+     - The JUnit-interface test may fail on Solaris platforms. The result of
+       a test for verifying the content of the error stack to stdout is
+       in a different order on Solaris then other platforms.
+
+       This test is skipped on Solaris
+       (ADB - 2016/04/21, HDFFV-9734)
+
+     - When building HDF5 with Java using CMake and specifying Debug for CMAKE_BUILD_TYPE,
+       there was a missing command argument for the tests of the examples.
+
+       Fixed.
+       (ADB - 2016/04/21, HDFFV-9743)
+
+     - Changed h5diff to print a warning when a dataset is virtual, enabling
+       the data to be compared. In addition h5repack failed to copy the data
+       of a virtual dataset to the new file. Function H5D__get_space_status changed
+       to correctly determine the H5D_space_status_t allocation value.
+
+       CMake added the Fixed Array indexing tests that were only in the autotools
+       test scripts.
+
+       Fixed and tests added for vds issues.
+       (ADB,NAF - 2016/04/21, HDFFV-9756)
+
+     - CMake added the h5format_convert tool and tests that were only in the autotools
+       build and test scripts. The autotools test script was reworked to allow CMake
+       to execute the test suite in parallel.
+
+       Also, h5clear tool and tests were added to the misc folder.
+
+       Fixed.
+       (ADB - 2016/04/21, HDFFV-9766)
+
+     - CMake added the h5watch tool and argument tests that were only in the autotools
+       build and test scripts. The POSIX only tests were not added to CMake.
+
+       CMake HL tools files were refactored to move the CMake test scripts into each tool folder.
+
+       Fixed.
+       (ADB - 2016/04/21, HDFFV-9770)
+
+     - Configure fails to detect valid real KINDs on FreeBSD 9.3 (i386) with Fortran enabled.
+
+       Fixed. Added the exponential option to SELECTED_REAL_KIND to distinguish 
+       KINDs of same precision
+       (MSB - 2016/05/14,HDFFV-9912)
+
+
+     - Corrected the f90 H5AWRITE_F integer interface's buf to be INTENT(IN).
+       (MSB - 2016/05/14) 
+
+     - Configure fails in sed command on FreeBSD 9.3 (i386) with Fortran enabled.
+  
+       Fixed.
+       (MSB - 2016/05/14,HDFFV-9912)
+
+     - Compile time error in H5f90global.F90 with IBM XL Fortran 14.1.0.13 on BG/Q with Fortran
+       enabled.
+    
+       Fixed.
+       (MSB - 2016/05/16,HDFFV-9917)
+
+     - A cmake build with Fortran enabled does not install module h5fortkit
+
+       Fixed. 
+       (MSB - 2016/05/23,HDFFV-9923)
+
+
+Issues Addressed in this Release Since alpha1
+=============================================
+
+     - H5Pget_virtual_printf_gap, H5Pget_virtual_view, H5Pget_efile_prefix
+
+       The correct access property list settings from the
+       H5Pget_virtual_printf_gap, H5Pget_virtual_view, and
+       H5Pget_efile_prefix function calls could not be retrieved
+       using H5Dget_access_plist().
+
+       Fixed.
+
+       (DER and NAF - 2016/03/14, HDFFV-9716)
+
+     - h5dump
+
+       When h5dump was provided with the name of a non-existing file or
+       when optional arguments were the last option on the command line,
+       h5dump would segfault.
+
+       Fixed.
+
+       (ADB 2016/02/28 HDFFV-9639, HDFFV-9684)
+
+     - No Error Message for Corrupt Metadata
+
+       The HDF5 Library did not propagate an error when it encountered
+       corrupt metadata in an HDF5 file. The issue was fixed for a
+       specific file provided by a user. If you still see the problem,
+       please contact help at hdfgroup.org
+
+       Fixed.
+
+       (MC - 2016/02/18, HDFFV-9670)
+
+     - Problem Reading Chunked Datasets with a String Datatype Larger
+       Than the Chunk Size in Bytes
+
+       When the latest file format was used and when a chunked dataset
+       was created with a datatype with the size bigger than a chunk
+       size, the data could not be read back. The issue was reported
+       for chunked datasets with a string datatype and was confirmed
+       for other datatypes with the sizes bigger than the chunk size in
+       bytes.
+
+       Fixed.
+
+       (JM - 2016/02/13, HDFFV-9672)
+
+     - Control over the Location of External Files
+
+       Users were unable to specify the locations of external files.
+
+       Two APIs - H5Pget_efile_prefix and H5Pset_efile_prefix - were
+       added so that users could specify the locations of external files.
+
+       (DER - 2016/02/04, HDFFV-8740)
+
+
+
+Issues Addressed in this Release Since alpha0
+=============================================
+    - h5format_convert
+
+      The h5format_convert tool did not downgrade the version of the
+      superblock.
+
+      Fixed. The tool now will downgrade the version of the superblock.
+
+      (EIP 2016/01/11)
+
+    - Crashes with multiple threads: invalid pointers
+
+      It was reported that alpha0 crashed when used with multiple
+      threads. The issue exists in the HDF5 Library versions 1.8 and
+      1.9. The problem is related to a shared file pointer used in some
+      miscellaneous data structures. The thread-safe library exposed
+      paths in the library where a file pointer became invalid.
+
+      The alpha1 release contains the fixes for the specific use case
+      as described in HDFFV-9643. We will keep working on identifying
+      and fixing other paths in the library with similar problems.
+
+      (EIP - 2016/01/15, HDFFV-9643)
+
+
+
+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.32-573.22.1.el6     GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (mayll/platypus)                 Version 4.4.7 20120313 (Red Hat 4.4.7-16)
+                                     Version 4.9.3, Version 5.2.0
+                                  PGI C, Fortran, C++ for 64-bit target on
+                                  x86-64;
+                                      Version 15.7-0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    Linux 2.6.32-573.18.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+                                  IBM XL C/C++ V13.1
+                                  IBM XL Fortran V15.1
+
+    Linux 3.10.0-327.10.1.el7   GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (kituo/moohan)                  Version 4.8.5 20150623 (Red Hat 4.8.5-4)
+                                    Version 4.9.3, Version 5.2.0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    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 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.2.1(0.289/5/3) gcc(4.9.3) compiler and gfortran)
+                                  (cmake and autotools)
+
+    Windows 7 x64                 Visual Studio 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (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 15.0.3
+
+    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.2
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (wren/quail)                  Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.0 from Xcode 7.0
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X El Capitan 10.11.4   Apple clang/clang++ version 7.3.0 from Xcode 7.3
+    64-bit                        gfortran GNU Fortran (GCC) 5.2.0
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+
+
+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.5 64-bit        n        y/y    n        y    y     y
+AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 7.1 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.5 64-bit           y       n         y         y
+AIX 6.1 32- and 64-bit                     y       n         n         y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU         y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel       y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 Intel       y       y         y         y
+Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         y
+
+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-431.11.2.el6     g95 (GCC 4.0.3 (g95 0.94!)
+    #1 SMP x86_64 GNU/Linux
+    (platypus)
+
+    Windows 7                     Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2010  (cmake) with SWMR using GPFS
+
+    Windows 10                    Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    Windows 10 x64                Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    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 and Limitations
+==============================
+This section contains the list of known problems and limitations introduced
+in this release of HDF5.
+
+Note: this list is not exhaustive of all known issues discovered in HDF5
+software to date. For a list of significant problems and known workarounds
+identified in past releases, please refer to:
+
+https://www.hdfgroup.org/HDF5/release/known_problems/
+
+The HDF Group also maintains a JIRA issue-tracking database which is used to
+capture all known issues which are too numerous to reasonably list in this
+document. The HDF Group is taking steps to make our JIRA issue database
+open to the public, and this section will refer to that database in a future
+release. In the meantime, please contact help at hdfgroup.org if you come across
+an issue not listed here or at the link above, and we will provide any
+information about known workarounds that we have or add it to our list of
+known issues if it is a new issue.
+
+ - The flush/refresh test occasionally fails on OS X platforms. This is
+   being investigated but no fix or workaround is available at this time.
+   (DER - 2016/03/22, HDFFV-9731)
+
+ - The VDS/SWMR test will fail with a segmentation fault if the library
+   is built with --enable-using-memchecker. The is due to a VDS shutdown
+   procedure freeing a shared resource too early when the memory
+   checker changes are built. This problem does not arise when the
+   memory checker changes are not used since the internal library free
+   lists behave differently. The memory checker configure option should
+   normally only be used under special circumstances so this should not
+   affect most users. Users should be aware that the --enable-using-memchecker
+   + VDS combination may cause a segfault, however, so Valgrind et al. may
+   have to be used with an HDF5 library built without the feature if this
+   proves to be a problem.
+   (DER - 2016/03/21, HDFFV-9732)
+
+ - SWMR feature limitations
+   The SWMR feature will only work if an HDF5 file under SWMR access resides
+   on a file system that obeys POSIX write() ordering semantics. Because of
+   this, SWMR will not work on  network file systems such as NFS or SMB/Windows
+   file shares since those systems do not guarantee write odering. SWMR
+   regression tests are likely to fail if run on a network file system. SWMR
+   is currently not tested on Windows though it can be tested manually
+   (some of the SWMR test programs are built by CMake), and there are no
+   obvious reasons for it to not work on NTFS or GPFS.
+   (EIP - 2016/03/20, HDFFV-9733)
+
+ - VDS feature limitation
+   Currently, the path to a VDS source file is interpreted as relative to the
+   directory where the executable program runs and not to the HDF5 file with
+   the VDS dataset unless a full path to the source file is specified during
+   the mapping.
+   (EIP - 2016/03/20, HDFFV-9724)
+
+ - The H5Lexists API changed behavior in HDF5-1.10 when used with a file handle
+   and root group name ("/"):
+
+   H5Lexists(fileid, "/")
+
+   In HDF5-1.8 it returns false (0) and in HDF5-1.10 it returns true (1).
+   The documentation will be updated with information regarding this change.
+   (LRK - 2016/03/30, HDFFV-8746)
+
+
+%%%%1.10.0%%%%
+
+HDF5 version 1.10.0 released on 2016-03-30
+================================================================================
+
+
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.8 series and
+HDF5 1.10.0 releases, and contains information on the platforms
+tested.
+
+Links to HDF5 1.10.0 source code can be found on The HDF Group's
+development FTP server at the following location:
+
+    https://www.hdfgroup.org/HDF5/release/obtain5110.html
+
+User documentation can be accessed directly at this location:
+
+    https://www.hdfgroup.org/HDF5/docNewFeatures/
+
+For more information, see the HDF5 home page:
+
+    https://www.hdfgroup.org/HDF5/
+
+If you have any questions or comments, please send them to the HDF
+Help Desk:
+
+    help at hdfgroup.org
+
+
+
+CONTENTS
+
+- New Features
+- Issues Addressed in this Release
+- Supported Platforms
+- Tested Configuration Features Summary
+- More Tested Platforms
+- Known Problems and Limitations
+
+
+
+New Features
+============
+This release supports the following features:
+
+    Configuration
+    -------------
+    - API Compatibility with HDF5 1.8 Flag Was Added
+
+      The 1.10 version of the HDF5 Library can be configured to operate
+      identically to the 1.8 library with the --with-default-api-version=v18
+      configure flag. This allows existing code to be compiled with the 1.10
+      library without requiring immediate changes to the application source
+      code. For addtional configuration options and other details, see
+      "API Compatibility Macros in HDF5" at
+      https://www.hdfgroup.org/HDF5/doc/RM/APICompatMacros.html.
+
+    - Autotools Configuration Has Been Extensively Reworked
+
+      The autotools configuration options have been updated to allow more
+      fine-grained control of the build options and to correct some bugs.
+      See configure --help for comprehensive information on each option.
+
+      Specific changes:
+
+      * --enable-debug and --enable-production are no longer accepted.
+        Use --enable-build-mode=(debug | production) instead. These set
+        appropriate defaults for symbols, optimizations, and other
+        configuration options. These defaults can be overridden by the
+        user.
+
+      * Extra debug output messages are no longer enabled with
+        --enable-debug=<package list>. Use --enable-internal-debug=<pkg list>
+        instead.
+
+      * A new --enable-symbols option allows symbols to be generated
+        independently of the build mode. --disable-symbols can be used
+        to strip symbols from the binary.
+
+      * A new --enable-asserts option sets/unsets NDEBUG. This is
+        independent of the build mode. This also enables some extra
+        low-overhead debug checks in the library.
+
+      * A new --enable-profiling option sets profiling flags. This is
+        independent of the build mode.
+
+      * A new --enable-optimization option sets the optimization level.
+        This is independent of the build mode.
+
+      * Many of these options can take a flags string that will be used
+        to build the library. This can be useful for specifying custom
+        optimization flags such as -Os and -Ofast.
+
+      * gnu C++ and Fortran use configure sub-files that update the
+        build flags and turn on warnings. The increase in warnings when
+        building these wrapper libraries is due to these flag changes
+        and not to a decrease in code quality.
+
+      * The option to clear file buffers has been removed. Any buffer that
+        will eventually be written to disk will now always be memset
+        to zero. This prevents the previous contents of the buffer from
+        being written to the disk if the buffer contents are not
+        completely overwritten, which has security implications.
+
+    - LFS Changes
+
+      The way the autotools handle large file support (LFS) has been
+      overhauled in this release.
+
+      * We assume ftello and fseeko exist
+
+      * We no longer explicitly use the *64 I/O functions. Instead, we
+        rely on a mapping provided by _FILE_OFFSET_BITS or its equivalent.
+
+      * _LARGEFILE(64)_SOURCE is no longer exported via AM_CPPFLAGS.
+
+
+
+    Parallel Library
+    -----------------
+    - Collective Metadata I/O
+
+      Calls for HDF5 metadata can result in many small reads and writes.
+      On metadata reads, collective metadata I/O can improve performance
+      by allowing the library to perform optimizations when reading the
+      metadata by having one rank read the data and broadcasting it to
+      all other ranks.
+
+      Collective metadata I/O improves metadata write performance through
+      the construction of an MPI derived datatype that is then written
+      collectively in a single call. For more information, see
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesCollectiveMetadataIoDocs.html.
+
+
+
+    Library
+    --------
+    - Concurrent Access to HDF5 Files - Single Writer/ Multple Reader (SWMR)
+
+      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.
+
+    - Virtual Dataset (VDS)
+
+      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/NewFeaturesVirtualDatasetDocs.html.
+
+    - Persistent Free File Space Tracking
+
+      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
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html.
+
+    - Version 3 Metadata Cache
+
+      The version 3 metadata cache moves management of metadata I/O from 
+      the clients to the metadata cache proper.  This change is essential for
+      SWMR and other features that have yet to be released.
+
+
+
+    C++ Library
+    ------------
+    - New Member Function Added to H5::ArrayType
+
+      The assignment operator ArrayType::operator= was added because
+      ArrayType has pointer data members.
+
+      (BMR - 2016/03/07, HDFFV-9562)
+
+
+
+    Tools
+    ------
+    - h5watch
+
+      The h5watch tool allows users to output new records appended to
+      a dataset under 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
+      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html#Tools.
+
+    - h5format_convert
+
+      The h5format_convert 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
+      tool does not rewrite raw data, but it does rewrite HDF5 metadata.
+
+
+
+    High-Level APIs
+    ----------------
+    - H5DOappend
+
+      The function appends data to a dataset along a specified dimension.
+
+
+    C Packet Table API
+    ------------------
+    - Replacement of a Public Function with H5PTcreate
+
+      The existing function H5PTcreate_fl limits applications so they
+      can use the deflate compression only. The public function
+      H5PTcreate has been added to replace H5PTcreate_fl. H5PTcreate
+      takes a property list identifier to provide flexibility on
+      creation properties.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - New Public Functions: H5PTget_dataset and H5PTget_type
+
+      Two accessor functions have been added. H5PTget_dataset returns
+      the identifier of the dataset associated with the packet table, 
+      and H5PTget_type returns the identifier of the datatype used by
+      the packet table.
+
+      (BMR, 2016/03/04, HDFFV-8623)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table (PT) library source except for the following functions:
+        + H5PTis_varlen() has been made available again
+        + H5PTfree_vlen_readbuff() is now H5PTfree_vlen_buff()
+
+      (BMR - 2016/03/04, HDFFV-442)
+
+    C++ Packet Table API
+    --------------------
+    - New Constructor Added to FL_PacketTable
+
+      An overloaded constructor has been added to FL_PacketTable and
+      takes a property list identifier to provide flexibility on
+      creation properties.
+
+      (BMR - 2016/03/08, HDFFV-8623)
+
+    - New Public Functions
+
+      Two accessor wrappers are added to class PacketTable.
+      PacketTable::GetDataset() returns the identifier of the dataset
+      associated with the packet table, and PacketTable::GetDatatype()
+      returns the identifier of the datatype that the packet table uses.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - Member Functions with "char*" as an Argument
+
+      Overloaded functions were added to provide the "const char*"
+      argument; the existing version will be deprecated in future
+      releases.
+
+      (BMR - 2016/03/04, HDFFV-8623)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table library source code except for the following functions:
+        + VL_PacketTable::IsVariableLength() was moved to PacketTable
+        + VL_PacketTable::FreeReadBuff() is now PacketTable::FreeBuff()
+
+      (BMR - 2016/03/04, HDFFV-442)
+
+
+
+    Java Wrapper Library
+    --------------------
+
+    The Java HDF5 JNI library has been integrated into the HDF5 repository.
+    The configure option is "--enable-java", and the CMake option is
+    HDF5_BUILD_JAVA:BOOL=ON. The package hierarchy has changed from the
+    HDF5 1.8 JNI, which was "ncsa.hdf.hdflib.hdf5", to HDF5 1.10,
+    "hdf.hdflib.hdf5".
+
+    A number of new APIs were added including some for VDS and SWMR.
+
+
+
+    Other Important Changes
+    -----------------------
+
+    The hid_t type was changed from 32-bit to a 64-bit value.
+
+
+
+Issues Addressed in this Release Since alpha1
+=============================================
+
+     - H5Pget_virtual_printf_gap, H5Pget_virtual_view, H5Pget_efile_prefix
+
+       The correct access property list settings from the
+       H5Pget_virtual_printf_gap, H5Pget_virtual_view, and
+       H5Pget_efile_prefix function calls could not be retrieved
+       using H5Dget_access_plist().
+
+       Fixed.
+
+       (DER and NAF - 2016/03/14, HDFFV-9716)
+
+     - h5dump
+
+       When h5dump was provided with the name of a non-existing file or
+       when optional arguments were the last option on the command line,
+       h5dump would segfault.
+
+       Fixed.
+
+       (ADB 2016/02/28 HDFFV-9639, HDFFV-9684)
+
+     - No Error Message for Corrupt Metadata
+
+       The HDF5 Library did not propagate an error when it encountered
+       corrupt metadata in an HDF5 file. The issue was fixed for a
+       specific file provided by a user. If you still see the problem,
+       please contact help at hdfgroup.org
+
+       Fixed.
+
+       (MC - 2016/02/18, HDFFV-9670)
+
+     - Problem Reading Chunked Datasets with a String Datatype Larger
+       Than the Chunk Size in Bytes
+
+       When the latest file format was used and when a chunked dataset
+       was created with a datatype with the size bigger than a chunk
+       size, the data could not be read back. The issue was reported
+       for chunked datasets with a string datatype and was confirmed
+       for other datatypes with the sizes bigger than the chunk size in
+       bytes.
+
+       Fixed.
+
+       (JM - 2016/02/13, HDFFV-9672)
+
+     - Control over the Location of External Files
+
+       Users were unable to specify the locations of external files.
+
+       Two APIs - H5Pget_efile_prefix and H5Pset_efile_prefix - were
+       added so that users could specify the locations of external files.
+
+       (DER - 2016/02/04, HDFFV-8740)
+
+
+
+Issues Addressed in this Release Since alpha0
+=============================================
+    - h5format_convert
+
+      The h5format_convert tool did not downgrade the version of the
+      superblock.
+
+      Fixed. The tool now will downgrade the version of the superblock.
+
+      (EIP 2016/01/11)
+
+    - Crashes with multiple threads: invalid pointers
+
+      It was reported that alpha0 crashed when used with multiple
+      threads. The issue exists in the HDF5 Library versions 1.8 and
+      1.9. The problem is related to a shared file pointer used in some
+      miscellaneous data structures. The thread-safe library exposed
+      paths in the library where a file pointer became invalid.
+
+      The alpha1 release contains the fixes for the specific use case
+      as described in HDFFV-9643. We will keep working on identifying
+      and fixing other paths in the library with similar problems.
+
+      (EIP - 2016/01/15, HDFFV-9643)
+
+
+
+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.32-573.18.1.el6    GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (mayll/platypus)                 Version 4.4.7 20120313 (Red Hat 4.4.7-16)
+                                     Version 4.9.3, Version 5.2.0
+                                  PGI C, Fortran, C++ for 64-bit target on
+                                  x86-64;
+                                      Version 15.7-0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    Linux 2.6.32-504.8.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+                                  IBM XL C/C++ V13.1
+                                  IBM XL Fortran V15.1
+
+    Linux 3.10.0-327.10.1.el7   GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (kituo/moohan)                  Version 4.8.5 20150623 (Red Hat 4.8.5-4)
+                                    Version 4.9.3, Version 5.2.0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    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 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.2.1(0.289/5/3) gcc(4.9.3) compiler and gfortran)
+                                  (cmake and autotools)
+
+    Windows 7 x64                 Visual Studio 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (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 15.0.3
+
+    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.2.0
+    64-bit                  gfortran GNU Fortran (GCC) 4.9.2
+    (wren/quail)                  Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.0 from Xcode 7.0.0
+    64-bit                  gfortran GNU Fortran (GCC) 4.9.2
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X El Capitan 10.11.3     Apple clang/clang++ version 7.0.2 from Xcode 7.0.2
+    64-bit                  gfortran GNU Fortran (GCC) 5.2.0
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+
+
+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.5 64-bit        n        y/y    n        y    y     y
+AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 7.1 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.5 64-bit           y       n         y         y
+AIX 6.1 32- and 64-bit                     y       n         n         y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU         y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel       y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 Intel       y       y         y         y
+Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         y
+
+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-431.11.2.el6     g95 (GCC 4.0.3 (g95 0.94!)
+    #1 SMP x86_64 GNU/Linux
+    (platypus)
+
+    Windows 7                     Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2010  (cmake) with SWMR using GPFS
+
+    Windows 10                    Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    Windows 10 x64                Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    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 and Limitations
+==============================
+This section contains the list of known problems and limitations introduced
+in this release of HDF5.
+
+Note: this list is not exhaustive of all known issues discovered in HDF5
+software to date. For a list of significant problems and known workarounds
+identified in past releases, please refer to:
+
+https://www.hdfgroup.org/HDF5/release/known_problems/
+
+The HDF Group also maintains a JIRA issue-tracking database which is used to
+capture all known issues which are too numerous to reasonably list in this
+document. The HDF Group is taking steps to make our JIRA issue database
+open to the public, and this section will refer to that database in a future
+release. In the meantime, please contact help at hdfgroup.org if you come across
+an issue not listed here or at the link above, and we will provide any
+information about known workarounds that we have or add it to our list of
+known issues if it is a new issue.
+
+ - The JUnit-interface test may fail on Solaris platforms. The result of
+   a test for verifying the content of the error stack to stdout is
+   in a different order on Solaris then other platforms. Use make -i option
+   to test beyond the java/test folder.
+   (ADB - 2016/03/22, HDFFV-9734)
+
+ - The flush/refresh test occasionally fails on OS X platforms. This is
+   being investigated but no fix or workaround is available at this time.
+   (DER - 2016/03/22, HDFFV-9731)
+
+ - The VDS/SWMR test will fail with a segmentation fault if the library
+   is built with --enable-using-memchecker. The is due to a VDS shutdown
+   procedure freeing a shared resource too early when the memory
+   checker changes are built. This problem does not arise when the
+   memory checker changes are not used since the internal library free
+   lists behave differently. The memory checker configure option should
+   normally only be used under special circumstances so this should not
+   affect most users. Users should be aware that the --enable-using-memchecker
+   + VDS combination may cause a segfault, however, so Valgrind et al. may
+   have to be used with an HDF5 library built without the feature if this
+   proves to be a problem.
+   (DER - 2016/03/21, HDFFV-9732)
+
+ - SWMR feature limitations
+   The SWMR feature will only work if an HDF5 file under SWMR access resides
+   on a file system that obeys POSIX write() ordering semantics. Because of
+   this, SWMR will not work on  network file systems such as NFS or SMB/Windows
+   file shares since those systems do not guarantee write odering. SWMR
+   regression tests are likely to fail if run on a network file system. SWMR
+   is currently not tested on Windows though it can be tested manually
+   (some of the SWMR test programs are built by CMake), and there are no
+   obvious reasons for it to not work on NTFS or GPFS.
+   (EIP - 2016/03/20, HDFFV-9733)
+
+ - VDS feature limitation
+   Currently, the path to a VDS source file is interpreted as relative to the
+   directory where the executable program runs and not to the HDF5 file with
+   the VDS dataset unless a full path to the source file is specified during
+   the mapping.
+   (EIP - 2016/03/20, HDFFV-9724)
+
+ - When building HDF5 with Java using CMake and specifying Debug for CMAKE_BUILD_TYPE,
+   there is a missing command argument for the tests of the examples.
+
+   This error can be avoided by not building Java with Debug, HDF5_BUILD_JAVA:BOOL=OFF, 
+   or not building Examples, HDF5_BUILD_EXAMPLES:BOOL=OFF.
+   (LRK - 2016/03/30, HDFFV-9743) 
+
+ - The H5Lexists API changed behavior in HDF5-1.10 when used with a file handle 
+   and root group name ("/"):
+
+   H5Lexists(fileid, "/")
+
+   In HDF5-1.8 it returns false (0) and in HDF5-1.10 it returns true (1). 
+   The documentation will be updated with information regarding this change.
+   (LRK - 2016/03/30, HDFFV-8746)
+
diff --git a/release_docs/HISTORY-1_8.txt b/release_docs/HISTORY-1_8.txt
new file mode 100644
index 0000000..4465d06
--- /dev/null
+++ b/release_docs/HISTORY-1_8.txt
@@ -0,0 +1,12344 @@
+HDF5 History
+============
+
+This file contains development history of HDF5 1.8 branch
+
+19.      Release Information for hdf5-1.8.17
+18.      Release Information for hdf5-1.8.16
+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.17%%%%
+
+
+HDF5 version 1.8.17 released on 2016-05-10
+================================================================================
+
+INTRODUCTION
+============
+
+This document describes the differences between HDF5-1.8.16 and
+HDF5-1.8.17-*, and contains information on the platforms tested and
+known problems in HDF5-1.8.17-*.
+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.17 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.17 release can be obtained from:
+
+     http://www.hdfgroup.org/HDF5/release/obtain5.html
+
+User documentation for 1.8.17 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.17 (current
+release) versus Release 1.8.16
+
+     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.16
+- Supported Platforms
+- Supported Configuration Features Summary
+- More Tested Platforms
+- Known Problems
+
+
+
+New Features
+============
+
+    Configuration
+    -------------
+    - Cmakehdf5: Added Ability to Run Multiple Make Commands
+    
+      Added option --njobs to specify up to how many jobs to launch during
+      build (cmake) and testing (ctest).
+      
+      (AKC - 2015/12/13, HDFFV-9612)
+
+    - Cmakehdf5: Added Szip Support and Verbose Option
+      
+      Added --with-szlib to support the Szip library; and 
+      --enable/disable-verbose to display all CMake process output.
+      
+      (AKC - 2015/11/16, HDFFV-8932 and DAILYTEST-195)
+
+    - CMake minimum is now 3.1.0. (ADB - 2015/11/14)
+
+    - Large File System (LFS) Support has Changed in the Autotools
+
+      We assume that fseeko and ftello exist.
+
+      The *64 I/O functions and types are no longer explicitly used.
+      We now rely on a mapping provided by _FILE_OFFSET_BITS (or its
+      equivalent).
+
+      _LARGEFILE(64)_SOURCE is no longer exposed via AM_CPPFLAGS.
+
+      (DER - 2016/03/29, HDFFV-9626 and HDFFV-9541)
+
+
+
+    Library
+    -------
+    - New API Calls for Searching for External Dataset Storage
+      
+      API calls that determine the search path for dataset external
+      storage were added. H5Pset/get_efile_prefix() API calls were added 
+      to the library. These functions give control over the search path 
+      for dataset external storage that has been configured with 
+      H5Pset_external().
+      
+      Additionally, the HDF5_EXTFILE_PREFIX environment variable can be
+      used to control the search path.
+
+      (DER - 2016/04/20, HDFFV-8740)
+
+
+
+    Parallel Library
+    ----------------
+    - None
+
+
+
+    Tools
+    -----
+    - None
+
+
+
+    High-Level APIs
+    ---------------
+
+    C Packet Table API
+    ------------------
+    - Replacement of a Public Function with H5PTcreate
+
+      The existing function H5PTcreate_fl limits applications so they
+      can use the deflate compression only. The public function
+      H5PTcreate has been added to replace H5PTcreate_fl. H5PTcreate
+      takes a property list identifier to provide flexibility on
+      creation properties.  This also removes the following warning:
+      "deprecated conversion from string constant to "char*" 
+      [-Wwrite-strings]".
+
+      (BMR - 2016/04/25, HDFFV-9708, HDFFV-8615)
+
+    - New Public Functions: H5PTget_dataset and H5PTget_type
+
+      Two accessor functions have been added. H5PTget_dataset returns
+      the identifier of the dataset associated with the packet table,
+      and H5PTget_type returns the identifier of the datatype used by
+      the packet table.
+
+      (BMR - 2016/04/25, HDFFV-8623 patch 3)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table (PT) library source except for the following functions:
+        + H5PTis_varlen() has been made available again
+        + H5PTfree_vlen_readbuff() is now H5PTfree_vlen_buff()
+
+      (BMR - 2016/04/25, HDFFV-442)
+
+    C++ Packet Table API
+    --------------------
+    - New Constructor in FL_PacketTable
+
+      An overloaded constructor has been added to FL_PacketTable and
+      takes a property list identifier to provide flexibility on
+      creation properties such as compression.
+
+      FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID,
+                       hsize_t chunkSize = 0, hid_t plistID = H5P_DEFAULT)
+
+      (BMR - 2016/04/25, HDFFV-8623 patch 5)
+
+    - New Member Functions in PacketTable
+
+      Two accessor wrappers were added to class PacketTable.
+
+      PacketTable::GetDataset() returns the identifier of the dataset
+      associated with the packet table, and PacketTable::GetDatatype() 
+      returns the identifier of the datatype that the packet table uses.
+
+      (BMR - 2016/04/25, HDFFV-8623 patch 4)
+
+    - New Member Functions with "char*" as an Argument
+
+      Overloaded functions were added to provide the "const char*"
+      argument; the existing version will be deprecated in future
+      releases. This also removes the following warning:
+      "deprecated conversion from string constant to "char*" 
+      [-Wwrite-strings]".
+
+      (BMR - 2016/04/25, HDFFV-8623 patch 1, HDFFV-8615)
+
+    - Regarding #ifdef VLPT_REMOVED
+
+      The #ifdef VLPT_REMOVED blocks have been removed from the packet
+      table library source code except for the following functions:
+        + VL_PacketTable::IsVariableLength() was moved to PacketTable
+        + VL_PacketTable::FreeReadBuff() is now PacketTable::FreeBuff()
+
+      (BMR - 2016/04/25, HDFFV-442)
+
+
+
+    Fortran API
+    -----------
+    - None
+
+
+
+    C++ API
+    -------
+    - New Member Function in DSetCreatPropList
+
+      DSetCreatPropList::setNbit() was added to setup N-bit compression for
+      a dataset.
+
+      (BMR - 2016/04/25, HDFFV-8623 patch 7)
+
+    - New Overloaded "const" Member Functions in ArrayType
+
+      The two following functions were added:
+        ArrayType::getArrayNDims() const
+        ArrayType::getArrayDims() const
+      to provide const version, and the non-const version was marked 
+      deprecated. In-memory array information, ArrayType::rank and 
+      ArrayType::dimensions, were removed. This is an implementation 
+      detail and should not affect applications.
+
+      (BMR, 2016/04/25, HDFFV-9725)
+
+     - New member function added
+
+       The assignment operator ArrayType::operator= is added because ArrayType
+       has pointer data members.
+
+       (BMR, 2016/03/07, HDFFV-9562)
+
+
+Support for New Platforms, Languages, and Compilers
+===================================================
+    - Mac OS X El Capitan 10.11.4 with compilers Apple clang/clang++ 
+      version 7.3.0 from Xcode 7.3, gfortran GNU Fortran (GCC) 5.2.0 
+      and Intel icc/icpc/ifort version 16.0.2
+
+
+
+Bug Fixes since HDF5-1.8.16
+===========================
+
+    Configuration
+    -------------
+    - Updated Linux Language Level Flags to Match the Autotools. Removed
+      Linux-specific Flags from OS X.
+
+      An addition to the flags simply being out of sync with the Autotools,
+      the Linux flags were used on OS X builds which led to symbols not being
+      found. Although this was non-fatal and compilation continued (implicit
+      definitions were used by the compiler and the symbols resolved at link
+      time), a large number of warnings were raised.
+
+      Linux changes:
+
+      * CHANGED:    _POSIX_C_SOURCE (from 199605 to 200112L)
+      * ADDED:      _GNU_SOURCE
+      * REMOVED:    _BSD_SOURCE
+      * REMOVED:    _DEFAULT_SOURCE
+
+      (DER - 2015/12/08, HDFFV-9627)
+
+    - The --enable-clear-file-buffers configure Option was Non-functional 
+      so the Feature was Always Enabled (its default value).
+
+      Regardless of the configure flag, the setting was always enabled when
+      the Autotools were used to configure HDF5. This was due to the "no"
+      option being processed after the "*" option in configure.ac so "*"
+      matched first. CMake was unaffected.
+
+      The option now works correctly.
+
+      NOTE that builders are always advised to leave this option enabled.
+      When disabled, buffers that are written to disk may contain the
+      memory's previous contents, which may include secure information.
+      The performance overhead of the feature (a single memset call per
+      allocation) is minimal.
+
+      (DER - 2016/02/03, HDFFV-9676)
+
+    - Added a patch to remove '"'s from arguments for MPI compilers that 
+      were causing errors compiling H5lib_settings.c with SGI MPT.
+
+      (LRK - 2016/04/20, HDFFV-9439)
+
+    Library
+    -------
+    - Fixed shared file pointer problem which caused a crash when running a
+      program provided by a user.
+
+      (VC - 2016/04/01, HDFFV-9469)
+
+    - Fixed some format string warnings that prevent compiling with
+      -Werror=format-security on gcc.
+
+      These only appeared in error messages and would not cause problems
+      under normal operation.
+
+      (DER - 2016/01/13, HDFFV-9640)
+
+    - Fixed a library segmentation fault when accessing a corrupted
+      file provided by a user.
+
+      (MSC - 2016/02/19, HDFFV-9670)
+
+
+
+    Parallel Library
+    ----------------
+    - None
+
+
+
+    Performance
+    -------------
+    - None
+
+
+
+    Tools
+    -----
+    - h5dump: Sub-setting Fixed for Dimensions Greater than Two
+
+      When a dataset has more than two dimensions, sub-setting would 
+      incorrectly calculate the data that needed to be displayed. 
+      Added in block and stride calculations that account for dimensions 
+      greater than two. NOTE: lines that have line breaks inserted 
+      because of display length calculations may have index info that 
+      is incorrect until the next dimension break.
+
+      (ADB - 2016/03/07, HDFFV-9698)
+
+    - h5dump: Issue with Argument Segmentation Fault
+
+      When an argument with an optional value was at the end of the command 
+      line with a value, h5dump would crash. Reworked check for remaining 
+      arguments.
+
+      (ADB - 2016/03/07, HDFFV-9570, HDFFV-9684)
+
+    - h5dump: Issue with Default Fill Value
+
+      Added all default cases of fill value to the display of fill value.
+
+      (ADB -, 2016/03/07, HDFFV-9241)
+
+    - h5dump: Clarified Help
+      
+      Clarified usage of -O F option in h5dump utility help.
+
+      (ADB - 2016/03/07, HDFFV-9066)
+
+    - h5dump: Issue with Double Free Fault
+
+      Added a check for filename not null before calling free().
+
+      (ADB - 2016/01/27, HDFFV-9639)
+
+    - VS2015 Release Changed how Timezone was Handled
+
+      Created a function, HDget_timezone, in H5system.c. Replaced 
+      timezone variable usage with function call.
+
+      (ADB - 2015/11/02, HDFFV-9550)
+
+
+
+    Fortran API
+    -----------
+    - None
+
+
+
+    C++ API
+    -------
+    - Removal of Obsolete Methods
+
+      The overloaded methods which had parameters that should be const 
+      but were not have been removed.
+
+      (BMR - 2016/01/13, HDFFV-9789)
+
+
+
+    High-Level APIs:
+    ---------------
+    - Fixed Memory Leak in Packet Table API
+
+      Applied user's patch to fix memory leak in the creation of a 
+      packet table.
+
+      (BMR - 2016/04/25, HDFFV-9700)
+
+
+
+    Fortran High-Level APIs:
+    ------------------------
+    - None
+
+
+
+    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.32-573.22.1.el6     GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (platypus)                       Version 4.4.7 20120313
+                                     Version 4.9.3, Version 5.2.0
+                                  PGI C, Fortran, C++ for 64-bit target on
+                                  x86-64;
+                                      Version 15.7-0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    Linux 2.6.32-504.8.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
+    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
+    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
+                                  IBM XL C/C++ V13.1
+                                  IBM XL Fortran V15.1
+
+    Linux 3.10.0-229.14.1.el7   GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (kituo/moohan)                  Version 4.8.5 20150623 (Red Hat 4.8.5-4)
+                                    Version 5.2.0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    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 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015  (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.2.1(0.289/5/3) gcc(4.9.3) compiler and gfortran)
+                                  (cmake and autotools)
+
+    Windows 7 x64                 Visual Studio 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015  (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 15.0.3
+
+    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.2
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (wren/quail)                  Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.1 from Xcode 7.0
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X El Capitan 10.11.4   Apple clang/clang++ version 7.3.0 from Xcode 7.3
+    64-bit                        gfortran GNU Fortran (GCC) 5.2.0
+    (osx1011dev/ox1011test)       Intel icc/icpc/ifort version 16.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
+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.5 64-bit        n        y/y    n        y    y     y
+AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 7.1 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.5 64-bit           y       n         y         y
+AIX 6.1 32- and 64-bit                     y       n         n         y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU         y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel       y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 Intel       y       y         y         y
+Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         y
+
+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-431.11.2.el6     g95 (GCC 4.0.3 (g95 0.94!)
+    #1 SMP x86_64 GNU/Linux
+    (platypus)
+
+    Windows 7                     Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2008  (cmake)
+
+    Windows 10                    Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    Windows 10 x64                Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    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.16%%%%
+
+
+HDF5 version 1.8.16 released on 2015-11-10
+================================================================================
+
+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/
+
+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.16 (current
+release) versus Release 1.8.15":
+
+     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.15
+- Supported Platforms
+- Supported Configuration Features Summary
+- More Tested Platforms
+- Known Problems
+
+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
+    -------
+
+    - H5F_ACC_DEBUG flag for H5Fopen/create: functionality removed
+
+      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.
+
+      (DER - 2015-05-02, HDFFV-1074)
+
+    - New public API call: H5is_library_threadsafe()
+
+      This API call indicates if the library was built with thread-
+      safety enabled.
+
+      (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
+    ------
+    - 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)
+
+
+    High-Level APIs:
+    ------
+    - None
+
+
+    Fortran High-Level APIs:
+    ------------------------
+    - None
+
+
+    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.32-573.3.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.4, Version 5.2.0
+                                  PGI C, Fortran, C++ for 64-bit target on
+                                  x86-64;
+                                      Version 15.7-0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    Linux 2.6.32-504.8.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+                                  IBM XL C/C++ V13.1
+                                  IBM XL Fortran V15.1
+
+    Linux 3.10.0-229.14.1.el7   GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (kituo/moohan)                  Version 4.8.3 20140911 (Red Hat 4.8.3-9)
+                                    Version 5.2.0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 Build 20150407
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
+
+    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 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.2.1(0.289/5/3) gcc(4.9.3) compiler and gfortran)
+                                  (cmake and autotools)
+
+    Windows 7 x64                 Visual Studio 2012 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+                                  Visual Studio 2015 w/ Intel Fortran 16 (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 15.0.3
+
+    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.2.0
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (wren/quail)                  Intel icc/icpc/ifort version 15.0.3
+
+    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.0 from Xcode 7.0.0
+    64-bit                        gfortran GNU Fortran (GCC) 4.9.2
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
+
+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.5 64-bit        n        y/y    n        y    y     y
+AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 7.1 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.5 64-bit           y       n         y         y
+AIX 6.1 32- and 64-bit                     y       n         n         y
+CentOS 6.7 Linux 2.6.32 x86_64 GNU         y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 Intel       y       y         y         y
+CentOS 6.7 Linux 2.6.32 x86_64 PGI         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 GNU         y       y         y         y
+CentOS 7.1 Linux 3.10.0 x86_64 Intel       y       y         y         y
+Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         y
+
+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-431.11.2.el6     g95 (GCC 4.0.3 (g95 0.94!)
+    #1 SMP x86_64 GNU/Linux
+    (platypus)
+
+    Mac OS X El Capitan 10.11     Apple clang/clang++ version 7.0.0 from Xcode 7.0.1
+    64-bit                        gfortran GNU Fortran (GCC) 5.2.0
+    (VM)
+
+    Windows 7                     Visual Studio 2008  (cmake)
+
+    Windows 7 x64                 Visual Studio 2008  (cmake)
+
+    Windows 10                    Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    Windows 10 x64                Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+
+    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. 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)
+
+
+%%%%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/INSTALL b/release_docs/INSTALL
index edd2c93..2dcb9be 100644
--- a/release_docs/INSTALL
+++ b/release_docs/INSTALL
@@ -275,47 +275,7 @@ CONTENTS
 
             $ CC=/usr/local/mpi/bin/mpicc ./configure
 
-4.3.3. Debug vs. production builds
-
-        The HDF5 library can be built in either debug or production mode.
-        The primary difference between these in HDF5 1.10.0 is that each
-        mode specifies different default values for other configure options
-        such as --enable-symbols.
-
-        To build in debug mode:
-
-            $ ./configure --enable-build-mode=debug
-
-        To build in production mode:
-
-            $ ./configure --enable-build-mode=production
-
-        To build in clean mode:
-
-            $ ./configure --enable-build-mode=clean
-
-        "Clean mode" is a minimalist configuration. e.g., no symbols, no
-        optimization, etc.
-
-        Previously, --enable-debug and --enable-production were used to
-        configure the build mode. Since the new options have somewhat
-        different semantics from these original options, these older
-        options have been deprecated and will cause the configuration
-        step to abort if used.
-
-        Release branches and distributions (e.g, HDF5 1.10.0) are set to
-        build in production mode by default. All other branches and
-        distributions (e.g., trunk, snapshots, HDF5 1.10 development branch)
-        will build in debug mode by default.
-
-        Assertions and other low-overhead sanity checks are controlled
-        separately via the --enable-asserts option (which itself primarily
-        controls the NDEBUG setting). This is enabled by default in debug
-        builds but can be configured independently of the build type.
-
-            $ ./configure --enable-asserts
-
-4.3.4. Configuring for 64-bit support
+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.
 
@@ -339,72 +299,38 @@ CONTENTS
             $ CFLAGS=-q64 FCFLAGS=-q64 AR='ar -X 64'\
               ./configure --enable-fortran
 
-        Configure should automatically enable large file system (LFS) support
-        for autotools builds regardless of platform and architecture. If
-        this is not true for a platform, please contact the HDF Group
-        help desk at help at hdfgroup.org.
-
-4.3.5. Additional compilation flags
+4.3.4. Additional compilation flags
         If addtional flags must be passed to the compilation commands,
         specify those flags with the CFLAGS variable. For instance,
-        to use pipes instead of temporary files when compiling, you
-        can enter:
+        to enable symbolic debugging of a production version of HDF5, one
+        might say:
 
-            $ CFLAGS=-pipe ./configure
+            $ CFLAGS=-g ./configure --enable-production
 
-4.3.6. Compiling HDF5 wrapper libraries
-        One can optionally build the Fortran, C++, and/or Java JNI interfaces
-        to the HDF5 C library. By default, all of these options are disabled.
-        To build them, specify --enable-fortran, --enable-cxx, and/or
-        --enable-java, respectively.
+4.3.5. Compiling HDF5 wrapper libraries
+        One can optionally build the Fortran and/or C++ interfaces to the
+        HDF5 C library. By default, both options are disabled. To build
+        them, specify `--enable-fortran' and `--enable-cxx', respectively.
 
             $ ./configure --enable-fortran
             $ ./configure --enable-cxx
-            $ ./configure --enable-java
         
-        Configuration will halt if a working Fortran 2003, C++, or
-        Java compiler is not found. To use an alternate Fortran compiler,
-        specify it with the FC variable:
+        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:
 
             $ FC=/usr/local/bin/g95 ./configure --enable-fortran
 
-        CXX can similarly be used to specify an alternative C++ compiler.
-
-        The libraries are compiled with flags and settings that are
-        distinct from the HDF5 library. These settings are specified in
-        platform- and compiler-specific configuration files in the config/
-        directory in the source tree. An exception to this is when a custom
-        string is used to specify profiling, symbols, and/or optimization
-        options. These flags will be used everywhere.
-
-        Note: The Fortran, C++, and Java interfaces are not supported on all
+        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++ and Java
-              interfaces do not. None of the interfaces supports 
-              thread-safety.
+              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.
-
-        A high-level wrapper library that contains some convenience and
-        special-purpose functions and tools can also be built with the
-        library. By default, this library is normally built along with
-        the C library. The high-level library is not supported when the
-        thread-safe HDF5 library is built, however, and will either have
-        to be explicitly disabled or the --enable-unsupported configure
-        option will have to be used.
-
-            $ ./configure --enable-threadsafe --disable-hl
-
-                OR
+              Intel or PGI compilers. 
 
-            $ ./configure --enable-threadsafe --enable-unsupported
-
-        This is admittedly a little awkward but it avoids the more common
-        case of users having to specify --enable-hl for all builds if we
-        disabled building the high-level library by default.
-
-4.3.7. Specifying other programs
+4.3.6. Specifying other programs
         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
@@ -438,7 +364,7 @@ CONTENTS
                because the HDF5 makefiles also use the install program to
                change file ownership and/or access permissions.
 
-4.3.8. Specifying other libraries and headers
+4.3.7. Specifying other libraries and headers
         Configure searches the standard places (those places known by the
         systems compiler) for include files and header files. However,
         additional directories can be specified by using the CPPFLAGS
@@ -468,7 +394,7 @@ CONTENTS
 
             $ ./configure --with-szlib=/Szip_Install_Directory
 
-4.3.9. Static versus shared linking
+4.3.8. Static versus shared linking
         The build process will create static libraries on all systems and
         shared libraries on systems that support dynamic linking to a
         sufficient degree. Either form of the library may be suppressed by
@@ -484,175 +410,67 @@ CONTENTS
 
             $ ./configure --enable-static-exec
 
-4.3.10. Symbolic debugging and profiling
+4.3.9. Optimization versus symbolic debugging
         The library can be compiled to provide symbolic debugging support
-        so it can be debugged with gdb, dbx, ddd, etc. To compile for
-        symbolic, use --enable-symbols:
-
-            $ ./configure --enable-symbols
-
-        The --enable-symbols option can optionally take a flags string
-        which the library will use to build the library and wrappers.
-        This can be used to enable special settings like -ggdb to be
-        used:
-
-            $ ./configure --enable-symbols=-ggdb
-
-        In most cases, when symbols are not enabled the option to
-        strip all symbols (e.g., -s w/ gcc) will be added to the
-        compiler/linker flags.
+        so it can be debugged with gdb, dbx, ddd, etc., or it can be
+        compiled with various optimizations. To compile for symbolic
+        debugging (the default for snapshots), say `--disable-production';
+        to compile with optimizations (the default for supported public
+        releases), say `--enable-production'. On some systems the library
+        can also be compiled for profiling with gprof by saying
+        `--enable-production=profile'.
+
+            $ ./configure --disable-production         #symbolic debugging
+            $ ./configure --enable-production          #optimized code
+            $ ./configure --enable-production=profile  #for use with gprof
 
         Regardless of whether support for symbolic debugging is enabled,
         the library can also perform runtime debugging of certain packages 
         (such as type conversion execution times and extensive invariant 
-        condition checking). These checks are generally more intensive
-        than the simple asserts and low-overhead checks enabled by
-        --enable-asserts. Note that some of these checks can significantly
-        slow down the library.
-        
-        To enable this debugging, supply a comma-separated list of package
-        names to to the --enable-internal-debug option.
-
-        Current packages that can perform extra checks:
-
-            AC,B,B2,D,F,FA,FL,FS,HL,I,O,S,ST,T,Z
-
-        Any subset can be specified:
-
-            $ ./configure --enable-internal-debug="B,B2,EA,FA"
-
-        Not all packages will generate special debug checks. Configure
-        simply defines an H5<pkg>_DEBUG symbol for each package in the
-        list so there is no harm in specifying arbitrary packages. The
-        string "all" can be used to specify "all reasonable" packages,
-        though even this excludes a few packages (e.g.: B) that have
-        severe run-time penalties.
-
-        In general, the internal debug option is intended for HDF Group
-        use and, outside of the default settings, will not be of
-        interest the the average user.
-
-        The HDF5 library 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 use --enable-trace (the default for
-        debug mode) or --disable-trace (the default for production mode). 
+        condition checking). To enable this debugging, supply a
+        comma-separated list of package names to to the `--enable-debug'
+        switch.  See "Debugging HDF5 Applications" for a list of package 
+        names:
+
+            http://www.hdfgroup.org/HDF5/doc/H5.user/Debugging.html
+
+        Debugging can be disabled by saying `--disable-debug'. 
+        The default debugging level for snapshots is a subset of the
+        available packages; the default for supported releases is no
+        debugging (debugging can incur a significant runtime penalty).
+
+            $ ./configure --enable-debug=s,t  #debug only H5S and H5T
+            $ ./configure --enable-debug      #debug normal packages
+            $ ./configure --enable-debug=all  #debug all packages
+            $ ./configure --disable-debug     #no debugging
+
+        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
+        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).
 
-        Profiling can be enabled with --enable-profiling. This will set
-        appropriate flags for a common profiler for the platform (usually
-        gprof). Other flags can be specified via a custom string passed
-        to the option:
-
-            $ ./configure --enable-profiling        # default profiler
-            $ ./configure --enable-profiling=-p     # use prof w/ gcc
-
-        The profiling option is independent of the build mode. In particular,
-        note that enabling profiling will NOT automatically enable debugging
-        since it can be useful to profile a production library, even
-        if the output will be limited.
-
-        The custom strings can be more complicated than a single
-        argument:
-
-            $ ./configure --enable-profiling="-pg --coverage"
-
-        Do note that when a custom string is specified, it will *replace*
-        the flags that would normally be set for that option. It is NOT
-        concatenated. This is true of all configure options that can
-        accept a custom string.
-
-        If using Valgrind or some other memory sanity checker, you will
-        want to build the library with --enable-using-memchecker. This
-        will disable a feature of the HDF5 library that recycles
-        certain memory blocks without a trip to the system's allocator.
-        This can confuse memory checkers and hide problems.
-
-            $ ./configure --enable-using-memchecker
-
-        The library also includes its own memory sanity checker. It is not
-        as involved as Valgrind and is mainly for library developers
-        but may be of some use to users trying to track down memory leaks.
-        It can be enabled with --enable-memory-alloc-sanity-check and
-        is separate from --enable-using-memchecker.
-
-            $ ./configure --enable-memory-alloc-sanity-check
-
-        Both of these options can slow down the library and cause
-        increased memory usage.
-
-4.3.11  Optimization
-        Various levels of compiler optimization can be specified at
-        compile time using --enable-optimization. This option can
-        take several strings:
-
-            high        Aggressive optimization (-O3, etc.)
-
-            debug       Optimizations that do not detract significantly
-                        from the debugging experience (-Og, etc.)
-
-            none        No optimizations (typically -O0)
-
-        Example:
-
-            $ ./configure --enable-optimization=high
-
-        The exact options used will vary with compiler and platform and can
-        be seen in the library settings file created during the configure
-        step.
-
-        Additionally, a custom string can be provided, such as "-Ofast":
-
-            $ ./configure --enable-optimization=-Ofast
-
-
-        Setting the optimization level to be high, debug, or none will
-        set appropriate options for the language wrappers as well if they
-        are being built (due to compiler quirks, these may be different
-        than those used for the main library). If a custom string string
-        has been provided, however, it will be used for both the HDF5
-        library and the language wrappers.
-
-4.3.12. Parallel versus serial library
+4.3.10. Parallel versus serial library
         The HDF5 Library can be configured to use MPI and MPI-IO for
         parallelism on a distributed multi-processor system.  Read the
         file INSTALL_parallel for detailed explanations.
 
-4.3.13. Threadsafe capability
-        The HDF5 Library can be configured to be thread-safe with the
-        `--enable-threadsafe' flag to the configure script.  Some platforms
-        may also require the '-with-pthread=INC,LIB' (or 
-        '--with-pthread=DIR') flag to the configure script, though this
-        is normally not necessary. 
-
-        In HDF5 1.10.0, the thread-safety code uses pthreads on POSIX systems
-        and Win32 threads on Windows systems.
-        
-        Thread-safety is currently implemented via a global library mutex,
-        effectively serializing library access. Please be aware of the
-        potential performance implications. The library is currently NOT
-        threaded internally though we do use thread-local storage to keep
-        track of things like per-thread function stacks for debugging.
-
-        Note that building the thread-safe library with the high-level
-        library and/or language wrappers (Fortran, etc.) is not officially
-        supported since we've never investigated the thread-safety of
-        these high-level or wrapper libraries and there is no testing.
-        However, this can be enabled with --enable-unsupported if you
-        are willing to take the risk of using it.
-
+4.3.11. Threadsafe capability
+        The HDF5 Library can be configured to be thread-safe (on a very
+        large scale) with the `--enable-threadsafe' flag to the configure
+        script.  Some platforms may also require the '-with-pthread=INC,LIB'
+        (or '--with-pthread=DIR') flag to the configure script.
         For further details, see "HDF5 Thread Safe Library":
 
             http://www.hdfgroup.org/HDF5/doc/TechNotes/ThreadSafeLibrary.html
 
-4.3.14. Backward compatibility
-        The 1.10 version of the HDF5 Library can be configured to operate
+4.3.12. Backward compatibility
+        The 1.8 version of the HDF5 Library can be configured to operate
         identically to the v1.6 library with the 
             --with-default-api-version=v16
-        and to the v1.8 library with the
-            --with-default-api-version=v18
         configure flag. This allows existing code to be compiled with the
-        v1.10 library without requiring immediate changes to the application 
+        v1.8 library without requiring immediate changes to the application 
         source code.  For addtional configuration options and other details, 
         see "API Compatibility Macros in HDF5":
 
diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt
index b49b3a6..4c4460e 100644
--- a/release_docs/INSTALL_CMake.txt
+++ b/release_docs/INSTALL_CMake.txt
@@ -30,7 +30,7 @@ Obtaining HDF5 source code
 
 CMake version
    1. We suggest you obtain the latest CMake from the Kitware web site.
-      The HDF5 1.10."X" product requires a minimum CMake version 3.1.0,
+      The HDF5 1.10."X" product requires a minimum CMake version 3.2.2,
       where "X" is the current HDF5 release version.
 
 Note:
@@ -51,7 +51,7 @@ The following files referenced below are available at the HDF web site:
     http://www.hdfgroup.org/HDF5/release/cmakebuild.html
 
 Single compressed file with all the files needed, including source:
-    hdf5-1.10.0-CMake.zip or hdf5-1.10.0-CMake.tar.gz
+    hdf5-1.10.X-CMake.zip or hdf5-1.10.X-CMake.tar.gz
 
 Individual files
 -----------------------------------------------
@@ -106,7 +106,7 @@ To build HDF5 with the SZIP and ZLIB external libraries you will need to:
       The -S option uses the script version of ctest.
 
       The value for the -C option (as shown above, "-C Release") must
-      match the setting for CTEST_BUILD_CONFIGURATION in the platform
+      match the setting for CTEST_CONFIGURATION_TYPE in the platform
       configuration file.
 
       The -VV option is for most verbose; use -V for less verbose.
@@ -249,7 +249,7 @@ IV. Further considerations
 ========================================================================
 
    1. We suggest you obtain the latest CMake for windows from the Kitware
-      web site. The HDF5 1.10."X" product requires a minimum CMake version 3.1.0.
+      web site. The HDF5 1.10."X" product requires a minimum CMake version 3.2.2.
 
    2. If you plan to use Zlib or Szip:
       A. Download the binary packages and install them in a central location.
@@ -263,10 +263,10 @@ IV. Further considerations
 
       B. Use source packages from an SVN server by adding the following CMake
          options:
-            HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="SVN"
-            ZLIB_SVN_URL:STRING="http://some_location/zlib/trunk"
-            SZIP_SVN_URL:STRING="http://some_location/szip/trunk"
-         where "some_location" is the URL to the SVN repository. Also set
+            HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"
+            ZLIB_GIT_URL:STRING="http://some_location/zlib"
+            SZIP_GIT_URL:STRING="http://some_location/szip"
+         where "some_location" is the URL to the GIT repository. Also set
          CMAKE_BUILD_TYPE to the configuration type.
 
       C. Use source packages from a compressed file by adding the following
@@ -376,10 +376,10 @@ These five steps are described in detail below.
             * MinGW Makefiles
             * NMake Makefiles
             * Unix Makefiles
-            * Visual Studio 12 2013
-            * Visual Studio 12 2013 Win64
             * Visual Studio 11 2012
             * Visual Studio 11 2012 Win64
+            * Visual Studio 12 2013
+            * Visual Studio 12 2013 Win64
             * Visual Studio 14 2015
             * Visual Studio 14 2015 Win64
 
@@ -396,6 +396,7 @@ These five steps are described in detail below.
                 # EXTERNAL cache entries
                 ########################
                 set (CMAKE_INSTALL_FRAMEWORK_PREFIX "Library/Frameworks" CACHE STRING "Frameworks installation directory" FORCE)
+                set (HDF5_GENERATE_HEADERS ON CACHE BOOL "Rebuild Generated Files" FORCE)
                 set (HDF_PACKAGE_EXT "" CACHE STRING "Name of HDF package extension" FORCE)
                 set (HDF5_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE)
                 set (HDF5_BUILD_GENERATORS OFF CACHE BOOL "Build Test Generators" FORCE)
@@ -403,7 +404,7 @@ These five steps are described in detail below.
                 set (HDF5_ENABLE_SZIP_SUPPORT ON CACHE BOOL "Use SZip Filter" FORCE)
                 set (HDF5_ENABLE_SZIP_ENCODING ON CACHE BOOL "Use SZip Encoding" FORCE)
                 set (HDF5_ENABLE_HSIZET ON CACHE BOOL "Enable datasets larger than memory" FORCE)
-                set (HDF5_ENABLE_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
+                set (ALLOW_UNSUPPORTED OFF CACHE BOOL "Enable unsupported combinations of configuration options" FORCE)
                 set (HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable deprecated public API symbols" FORCE)
                 set (HDF5_ENABLE_DIRECT_VFD OFF CACHE BOOL "Build the Direct I/O Virtual File Driver" FORCE)
                 set (HDF5_ENABLE_PARALLEL OFF CACHE BOOL "Enable parallel build (requires MPI)" FORCE)
@@ -413,14 +414,16 @@ These five steps are described in detail below.
                 set (HDF5_ENABLE_USING_MEMCHECKER OFF CACHE BOOL "Indicate that a memory checker is used" FORCE)
                 set (HDF5_MEMORY_ALLOC_SANITY_CHECK OFF CACHE BOOL "Indicate that internal memory allocation sanity checks are enabled" FORCE)
                 set (HDF5_DISABLE_COMPILER_WARNINGS OFF CACHE BOOL "Disable compiler warnings" FORCE)
+                set (HDF5_ENABLE_ALL_WARNINGS ON CACHE BOOL "Enable all warnings" FORCE)
                 set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs." FORCE)
                 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)
                 set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libraries" FORCE)
                 set (HDF5_NO_PACKAGES OFF CACHE BOOL "CPACK - Disable packaging" FORCE)
-                set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO SVN TGZ)" FORCE)
-                set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO SVN TGZ)
+                set (HDF5_ALLOW_EXTERNAL_SUPPORT "NO" CACHE STRING "Allow External Library Building (NO GIT SVN TGZ)" FORCE)
+                set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT SVN TGZ)
                 set (ZLIB_TGZ_NAME "ZLib.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE)
                 set (SZIP_TGZ_NAME "SZip.tar.gz" CACHE STRING "Use SZip from compressed file" FORCE)
                 set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE)
@@ -477,15 +480,15 @@ These five steps are described in detail below.
            Release and build the solution.
 
       3.2.1  The external libraries (zlib and szip) can be configured
-           to allow building the libraries by downloading from an SVN repository.
+           to allow building the libraries by downloading from an GIT repository.
            The option is 'HDF5_ALLOW_EXTERNAL_SUPPORT'; by adding the following
            configuration option:
-               -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING="SVN"
+               -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"
 
-           The options to control the SVN URL (config/cmake/cacheinit.cmake file) are:
-               ZLIB_SVN_URL:STRING="http://${svn_url}/zlib/trunk"
-               SZIP_SVN_URL:STRING="http://${svn_url}/szip/trunk"
-           ${svn_url} should be changed to your location. Also define CMAKE_BUILD_TYPE
+           The options to control the GIT URL (config/cmake/cacheinit.cmake file) are:
+               ZLIB_GIT_URL:STRING="http://${git_url}/zlib"
+               SZIP_GIT_URL:STRING="http://${git_url}/szip"
+           ${git_url} should be changed to your location. Also define CMAKE_BUILD_TYPE
            to be the configuration type.
 
       3.2.2  Or the external libraries (zlib and szip) can be configured
@@ -525,8 +528,8 @@ These five steps are described in detail below.
 
       NOTE: See note 8 of this document for NSIS information.
             See note 9 of this document for WiX information.
-            Also, if you are using a Visual Studio Express version or do not
-            want to enable the packaging components, set HDF5_NO_PACKAGES
+            Also, if you are using a Visual Studio Express version or
+            want to disable the packaging components, set HDF5_NO_PACKAGES
             to ON (on the command line add -DHDF5_NO_PACKAGES:BOOL=ON)
 
    6. The files that support building HDF5 with CMake are all the files in the
@@ -563,7 +566,7 @@ The config/cmake/cacheinit.cmake file can override the following values.
 
 ---------------- General Build Options ---------------------
 BUILD_SHARED_LIBS  "Build Shared Libraries"    ON
-BUILD_STATIC_EXECS "Build Static Executabless" OFF
+BUILD_STATIC_EXECS "Build Static Executables"  OFF
 BUILD_TESTING      "Build HDF5 Unit Testing"   ON
 
 ---------------- HDF5 Build Options ---------------------
@@ -624,9 +627,9 @@ if (HDF5_ENABLE_SZIP_SUPPORT)
     HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding"      OFF
 if (WINDOWS)
     H5_DEFAULT_PLUGINDIR    "%ALLUSERSPROFILE%/hdf5/lib/plugin"
-else (WINDOWS)
+else ()
     H5_DEFAULT_PLUGINDIR    "/usr/local/hdf5/lib/plugin"
-endif (WINDOWS)
+endif ()
 
 
 
@@ -647,9 +650,9 @@ build and test process.
 VIII. Options for Platform Configuration Files
 ========================================================================
 
-Below is the HDF5config.cmake ctest script with extra comments.
+Below is the HDF5config.cmake and HDF5options.cmake ctest scripts.
 Execute:
-       ctest -S HDF5config.cmake,BUILD_GENERATOR=xxx -C Release -V -O hdf5.log
+       ctest -S HDF5config.cmake,BUILD_GENERATOR=xxx -C Release -VV -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.
 
@@ -657,10 +660,10 @@ 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 HDF5config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf5.log          ###
+### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201264 -C Release -VV -O hdf5.log         ###
 #############################################################################################
 
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+cmake_minimum_required (VERSION 3.2.2 FATAL_ERROR)
 ############################################################################
 # Usage:
 #     ctest -S HDF5config.cmake,OPTION=VALUE -C Release -VV -O test.log
@@ -675,260 +678,307 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 #            VS201264 * Visual Studio 11 2012 Win64
 #
 #     INSTALLDIR  -  root folder where hdf5 is installed
-#     CTEST_BUILD_CONFIGURATION  - Release, Debug, etc
+#     CTEST_CONFIGURATION_TYPE  - Release, Debug, etc
 #     CTEST_SOURCE_NAME  -  source folder
-#     STATIC_LIBRARIES  -  Build/use static libraries
+#     STATIC_ONLY  -  Build/use static libraries
 #     FORTRAN_LIBRARIES -  Build/use fortran libraries
 #     JAVA_LIBRARIES -  Build/use java libraries
 #     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
 ##############################################################################
 
-set(CTEST_SOURCE_VERSION 1.10.0)
-set(CTEST_SOURCE_VERSEXT "-pre1")
+set (CTEST_SOURCE_VERSION 1.10.1)
+set (CTEST_SOURCE_VERSEXT "")
 
 ##############################################################################
 # handle input parameters to script.
 #BUILD_GENERATOR - which CMake generator to use, required
 #INSTALLDIR - HDF5-1.10.0 root folder
-#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
+#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
 #CTEST_SOURCE_NAME - name of source folder; HDF5-1.10.0
-#STATIC_LIBRARIES - Default is YES
+#STATIC_ONLY - Default is YES
 #FORTRAN_LIBRARIES - Default is NO
 #JAVA_LIBRARIES - Default is NO
 #NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
-if(DEFINED CTEST_SCRIPT_ARG)
+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})
+    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()
+            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")
-else()
-    set(STATICLIBRARIES "NO")
-endif()
-if(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "NO")
-else()
-    set(FORTRANLIBRARIES "YES")
-endif()
-if(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "NO")
-else()
-    set(JAVALIBRARIES "YES")
-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()
+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 ()
+
+###################################################################
+### Following Line is one of [Release, RelWithDebInfo, Debug] #####
+set (CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}")
+###################################################################
+
+if (NOT DEFINED INSTALLDIR)
+  if (WIN32)
+    set (INSTALLDIR "C:/Program Files/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
+  else ()
+    set (INSTALLDIR "${CTEST_SCRIPT_DIRECTORY}/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
+  endif ()
+endif ()
+if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
+  set (CTEST_CONFIGURATION_TYPE "Release")
+endif ()
+if (NOT DEFINED CTEST_SOURCE_NAME)
+  set (CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+endif ()
+if (NOT DEFINED STATIC_ONLY)
+  set (STATICONLYLIBRARIES "YES")
+else ()
+  set (STATICONLYLIBRARIES "NO")
+endif ()
+if (NOT DEFINED FORTRAN_LIBRARIES)
+  set (FORTRANLIBRARIES "NO")
+else ()
+  set(FORTRANLIBRARIES "YES")
+endif ()
+if (NOT DEFINED JAVA_LIBRARIES)
+  set (JAVALIBRARIES "NO")
+else ()
+  set (JAVALIBRARIES "YES")
+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()
+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 (CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
+else ()
+  set (CTEST_CMAKE_GENERATOR "Unix Makefiles")
 ##  Set the following to unique id your computer  ##
-  if(APPLE)
-    set(CTEST_SITE "MAC.XXXX")
-  else()
-    set(CTEST_SITE "LINUX.XXXX")
-  endif()
-endif()
+  if (APPLE)
+    set (CTEST_SITE "MAC.XXXX")
+  else ()
+    set (CTEST_SITE "LINUX.XXXX")
+  endif ()
+  if (APPLE)
+    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}")
+    set (CTEST_USE_LAUNCHERS        1)
+    set (RR_WARNINGS_COMMON "-Wno-format-nonliteral -Wno-cast-align -Wno-unused -Wno-unused-variable -Wno-unused-function -Wno-self-assign -Wno-unused-parameter -Wno-sign-compare")
+    set (RR_WARNINGS_C "${RR_WARNINGS_COMMON} -Wno-deprecated-declarations -Wno-uninitialized")
+    set (RR_WARNINGS_CXX "${RR_WARNINGS_COMMON} -Woverloaded-virtual -Wshadow -Wwrite-strings -Wc++11-compat")
+    set (RR_FLAGS_COMMON "-g -O0 -fstack-protector-all -D_FORTIFY_SOURCE=2")
+    set (RR_FLAGS_C "${RR_FLAGS_COMMON}")
+    set (RR_FLAGS_CXX "${RR_FLAGS_COMMON}")
+    set (ENV{CFLAGS} "${RR_WARNINGS_C} ${RR_FLAGS_C}")
+    set (ENV{CXXFLAGS} "${RR_WARNINGS_CXX} ${RR_FLAGS_CXX}")
+  endif ()
+endif ()
 ###################################################################
 
 ###################################################################
 #########       Following is for submission to CDash   ############
 ###################################################################
-set(MODEL "Experimental")
+set (MODEL "Experimental")
 ###################################################################
 
 ###################################################################
 #####       Following controls CDash submission               #####
-#set(LOCAL_SUBMIT "TRUE")
+#set (LOCAL_SUBMIT "TRUE")
 #####       Following controls test process                   #####
-#set(LOCAL_SKIP_TEST "TRUE")
-#set(LOCAL_MEMCHECK_TEST "TRUE")
-#set(LOCAL_COVERAGE_TEST "TRUE")
+#set (LOCAL_SKIP_TEST "TRUE")
+#set (LOCAL_MEMCHECK_TEST "TRUE")
+#set (LOCAL_COVERAGE_TEST "TRUE")
 #####       Following controls cpack command                  #####
-#set(LOCAL_NO_PACKAGE "TRUE")
+#set (LOCAL_NO_PACKAGE "TRUE")
 #####       Following controls source update                  #####
-#set(LOCAL_UPDATE "TRUE")
-set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/trunk")
+#set (LOCAL_UPDATE "TRUE")
+set (REPOSITORY_URL "https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5.git")
+set (REPOSITORY_BRANCH "develop")
+
 #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")
+if (${STATICONLYLIBRARIES})
+  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()
+  set (SITE_BUILDNAME_SUFFIX "STATIC")
+endif ()
 ###################################################################
+####      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 ()
+####      java       ####
+if (${JAVALIBRARIES})
+  set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON")
+else ()
+  set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF")
+endif ()
+
+### change install prefix
+set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH=${INSTALLDIR}")
+set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCTEST_CONFIGURATION_TYPE:STRING=$ENV{CMAKE_CONFIG_TYPE}")
+
+###################################################################
+
+if (WIN32)
+  set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}")
+  include (${CTEST_SCRIPT_DIRECTORY}\\HDF5options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+  if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip")
+    file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif ()
+else ()
+  set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+  include (${CTEST_SCRIPT_DIRECTORY}/HDF5options.cmake)
+  include (${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
+  if (APPLE)
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+    if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh")
+      file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif ()
+  else ()
+    if (CYGWIN)
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+    else ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+      if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz")
+        file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif ()
+    endif ()
+  endif ()
+endif ()
+
+HDF5options.cmake:
+#############################################################################################
+####  Change default configuration of options in config/cmake/cacheinit.cmake file        ###
+####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")                 ###
+#############################################################################################
 
 ### uncomment/comment and change the following lines for other configuration options
 
+#############################################################################################
+####      alternate toolsets       ####
+#set(CMAKE_GENERATOR_TOOLSET "Intel C++ Compiler 17.0")
+
+#############################################################################################
 ####      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 from git
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=GIT")
 ### 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
+
+### disable ext zlib building
 #set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF")
+### disable ext szip building
 #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()
-####      java       ####
-if(${JAVALIBRARIES})
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=ON")
-else()
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA: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)
+### Create install package with external libraries (szip, zlib)
 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()
-
+#############################################################################################
 
 ========================================================================
 For further assistance, send email to help at hdfgroup.org
diff --git a/release_docs/INSTALL_parallel b/release_docs/INSTALL_parallel
index e4c540c..5a8b603 100644
--- a/release_docs/INSTALL_parallel
+++ b/release_docs/INSTALL_parallel
@@ -1,6 +1,18 @@
 	    Installation instructions for Parallel HDF5
 	    -------------------------------------------
 
+0. Use Build Scripts
+--------------------
+The HDF Group is accumulating build scripts to handle building parallel HDF5
+on various platforms (Cray, IBM, SGI, etc...). These scripts are being 
+maintained and updated continuously for current and future systems. The reader
+is strongly encouraged to consult the repository at,
+
+https://github.com/HDFGroup/build_hdf5
+
+for building parallel HDF5 on these system. All contributions, additions
+and fixes to the repository are welcomed and encouraged.
+
 
 1. Overview
 -----------
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 662eb58..c1adf8d 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -1,490 +1,570 @@
-HDF5 version 1.10.0-patch1 released on 2016-05-18
+HDF5 version 1.10.1 released on 2017-04-27
 ================================================================================
 
+INTRODUCTION
 
+This document describes the differences between HDF5-1.10.0-patch1 and
+HDF5 1.10.1, and contains information on the platforms tested and known 
+problems in HDF5-1.10.1. For more details check the HISTORY*.txt files 
+in the HDF5 source.
 
-INTRODUCTION
+Links to HDF5 1.10.1 source code, documentation, and additional materials can 
+be found on The HDF5 web page at:
 
-This document describes the differences between HDF5-1.8 series and
-HDF5 1.10.0 releases, and contains information on the platforms
-tested.
+     https://support.hdfgroup.org/HDF5/
 
-Links to HDF5 1.10.0 source code can be found on The HDF Group's
-development FTP server at the following location:
+The HDF5 1.10.1 release can be obtained from:
 
-    https://www.hdfgroup.org/HDF5/release/obtain5110.html
+     https://support.hdfgroup.org/HDF5/release/obtain5.html
 
-User documentation can be accessed directly at this location:
+User documentation for the snapshot can be accessed directly at this location:
 
-    https://www.hdfgroup.org/HDF5/docNewFeatures/
+     https://support.hdfgroup.org/HDF5/doc/
 
-For more information, see the HDF5 home page:
+New features in the HDF5-1.10.x release series, including brief general
+descriptions of some new and modified APIs, are described in the "New Features
+in HDF5 Release 1.10" document:
 
-    https://www.hdfgroup.org/HDF5/
+     https://support.hdfgroup.org/HDF5/docNewFeatures/index.html
 
-If you have any questions or comments, please send them to the HDF
-Help Desk:
+All new and modified APIs are listed in detail in the "HDF5 Software Changes
+from Release to Release" document, in the section "Release 10.1 (current
+release) versus Release 1.10.0
 
-    help at hdfgroup.org
+     https://support.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
-- Issues Addressed in this Release
+- Major New Features Introduced in HDF5 1.10.1
+- Other New Features and Enhancements
+- Support for New Platforms, Languages, and Compilers
+- Bug Fixes since HDF5-1.10.0-patch1
 - Supported Platforms
 - Tested Configuration Features Summary
 - More Tested Platforms
-- Known Problems and Limitations
+- Known Problems
+
+
+Major New Features Introduced in HDF5 1.10.1
+============================================
+
+For links to the RFCs and documentation in this section please view 
+https://support.hdfgroup.org/HDF5/docNewFeatures in a web browser.
+
+________________________________________
+Metadata Cache Image 
+________________________________________
+
+    HDF5 metadata is typically small, and scattered throughout the HDF5 file. 
+    This can affect performance, particularly on large HPC systems. The 
+    Metadata Cache Image feature can improve performance by writing the 
+    metadata cache in a single block on file close, and then populating the 
+    cache with the contents of this block on file open, thus avoiding the many 
+    small I/O operations that would otherwise be required on file open and 
+    close. See the RFC for complete details regarding this feature. Also, 
+    see the Fine Tuning the Metadata Cache documentation. 
+
+    At present, metadata cache images may not be generated by parallel 
+    applications.  Parallel applications can read files with metadata cache
+    images, but since this is a collective operation, a deadlock is possible
+    if one or more processes do not participate.
+
+________________________________________
+Metadata Cache Evict on Close 
+________________________________________
+
+    The HDF5 library's metadata cache is fairly conservative about holding on 
+    to HDF5 object metadata (object headers, chunk index structures, etc.), 
+    which can cause the cache size to grow, resulting in memory pressure on 
+    an application or system. The "evict on close" property will cause all 
+    metadata for an object to be evicted from the cache as long as metadata 
+    is not referenced from any other open object. See the Fine Tuning the 
+    Metadata Cache documentation for information on the APIs. 
+
+    At present, evict on close is disabled in parallel builds.
+
+________________________________________
+Paged Aggregation 
+________________________________________
+
+    The current HDF5 file space allocation accumulates small pieces of metadata 
+    and raw data in aggregator blocks which are not page aligned and vary 
+    widely in sizes. The paged aggregation feature was implemented to provide 
+    efficient paged access of these small pieces of metadata and raw data. 
+    See the RFC for details. Also, see the File Space Management documentation.
+    
+________________________________________
+Page Buffering 
+________________________________________
 
+    Small and random I/O accesses on parallel file systems result in poor 
+    performance for applications. Page buffering in conjunction with paged 
+    aggregation can improve performance by giving an application control of 
+    minimizing HDF5 I/O requests to a specific granularity and alignment. 
+    See the RFC for details. Also, see the Page Buffering documentation.
 
+    At present, page buffering is disabled in parallel builds.
 
-New Features
-============
-This release supports the following features:
 
-    Configuration
-    -------------
-    - API Compatibility with HDF5 1.8 Flag Was Added
 
-      The 1.10 version of the HDF5 Library can be configured to operate
-      identically to the 1.8 library with the --with-default-api-version=v18
-      configure flag. This allows existing code to be compiled with the 1.10
-      library without requiring immediate changes to the application source
-      code. For addtional configuration options and other details, see
-      "API Compatibility Macros in HDF5" at
-      https://www.hdfgroup.org/HDF5/doc/RM/APICompatMacros.html.
+Other New Features and Enhancements
+===================================
 
-    - Autotools Configuration Has Been Extensively Reworked
+    Library
+    -------
+    - Added a mechanism for disabling the SWMR file locking scheme.
 
-      The autotools configuration options have been updated to allow more
-      fine-grained control of the build options and to correct some bugs.
-      See configure --help for comprehensive information on each option.
+      The file locking calls used in HDF5 1.10.0 (including patch1)
+      will fail when the underlying file system does not support file
+      locking or where locks have been disabled. To disable all file
+      locking operations, an environment variable named
+      HDF5_USE_FILE_LOCKING can be set to the five-character string
+      'FALSE'. This does not fundamentally change HDF5 library
+      operation (aside from initial file open/create, SWMR is lock-free),
+      but users will have to be more careful about opening files
+      to avoid problematic access patterns (i.e.: multiple writers)
+      that the file locking was designed to prevent.
 
-      Specific changes:
+      Additionally, the error message that is emitted when file lock
+      operations set errno to ENOSYS (typical when file locking has been
+      disabled) has been updated to describe the problem and potential
+      resolution better.
 
-      * --enable-debug and --enable-production are no longer accepted.
-        Use --enable-build-mode=(debug | production) instead. These set
-        appropriate defaults for symbols, optimizations, and other
-        configuration options. These defaults can be overridden by the
-        user.
+      (DER, 2016/10/26, HDFFV-9918)
 
-      * Extra debug output messages are no longer enabled with
-        --enable-debug=<package list>. Use --enable-internal-debug=<pkg list>
-        instead.
+    - The return type of H5Pget_driver_info() has been changed from void *
+      to const void *.
 
-      * A new --enable-symbols option allows symbols to be generated
-        independently of the build mode. --disable-symbols can be used
-        to strip symbols from the binary.
+      The pointer returned by this function points to internal library
+      memory and should not be freed by the user.
 
-      * A new --enable-asserts option sets/unsets NDEBUG. This is
-        independent of the build mode. This also enables some extra
-        low-overhead debug checks in the library.
+      (DER, 2016/11/04, HDFFV-10017)
 
-      * A new --enable-profiling option sets profiling flags. This is
-        independent of the build mode.
+    - The direct I/O VFD has been removed from the list of VFDs that
+      support SWMR.
 
-      * A new --enable-optimization option sets the optimization level.
-        This is independent of the build mode.
+      This configuration was never officially tested and several SWMR
+      tests fail when this VFD is set.
 
-      * Many of these options can take a flags string that will be used
-        to build the library. This can be useful for specifying custom
-        optimization flags such as -Os and -Ofast.
+      (DER, 2016/11/03, HDFFV-10169)
 
-      * gnu C++ and Fortran use configure sub-files that update the
-        build flags and turn on warnings. The increase in warnings when
-        building these wrapper libraries is due to these flag changes
-        and not to a decrease in code quality.
+    Configuration:
+    --------------
+    - The minimum version of CMake required to build HDF5 is now 3.2.2.
 
-      * The option to clear file buffers has been removed. Any buffer that
-        will eventually be written to disk will now always be memset
-        to zero. This prevents the previous contents of the buffer from
-        being written to the disk if the buffer contents are not
-        completely overwritten, which has security implications.
+      (ADB, 2017/01/10)
 
-    - LFS Changes
+    - An --enable/disable-developer-warnings option has been added to
+      configure.
 
-      The way the autotools handle large file support (LFS) has been
-      overhauled in this release.
+      This disables warnings that do not indicate poor code quality such
+      as -Winline and gcc's -Wsuggest-attribute. Developer warnings are
+      disabled by default.
 
-      * We assume ftello and fseeko exist
+      (DER, 2017/01/10)
 
-      * We no longer explicitly use the *64 I/O functions. Instead, we
-        rely on a mapping provided by _FILE_OFFSET_BITS or its equivalent.
+    - A bin/restore.sh script was added that reverts autogen.sh processing.
 
-      * _LARGEFILE(64)_SOURCE is no longer exported via AM_CPPFLAGS.
+      (DER, 2016/11/08)
 
+    - CMake: Added NAMESPACE hdf5:: to package configuration files to allow
+      projects using installed HDF5 binaries built with CMake to link with
+      them without specifying the HDF5 library location via IMPORTED_LOCATION.
 
+      (ABD, 2016/10/17, HDFFV-10003)
 
-    Parallel Library
-    -----------------
-    - Collective Metadata I/O
+    - CMake: Changed the CTEST_BUILD_CONFIGURATION option to
+      CTEST_CONFIGURATION_TYPE as recommended by the CMake documentation.
 
-      Calls for HDF5 metadata can result in many small reads and writes.
-      On metadata reads, collective metadata I/O can improve performance
-      by allowing the library to perform optimizations when reading the
-      metadata by having one rank read the data and broadcasting it to
-      all other ranks.
+      (ABD, 2016/10/17, HDFFV-9971)
+    
 
-      Collective metadata I/O improves metadata write performance through
-      the construction of an MPI derived datatype that is then written
-      collectively in a single call. For more information, see
-      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesCollectiveMetadataIoDocs.html.
+    Fortran Library:
+    ----------------
 
+    - The HDF5 Fortran library can now be compiled with the NAG compiler.
 
+      (MSB, 2017/2/10, HDFFV-9973)
 
-    Library
-    --------
-    - Concurrent Access to HDF5 Files - Single Writer/ Multple Reader (SWMR)
 
-      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.
+    C++ Library:
+    ------------
 
-    - Virtual Dataset (VDS)
+    - The following C++ API wrappers have been added to the C++ Library:
 
-      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/NewFeaturesVirtualDatasetDocs.html.
+        // Sets/Gets the strategy and the threshold value that the library
+        // will employ in managing file space.
+        FileCreatPropList::setFileSpaceStrategy - H5Pset_file_space_strategy
+        FileCreatPropList::getFileSpaceStrategy - H5Pget_file_space_strategy
 
-    - Persistent Free File Space Tracking
+        // Sets/Gets the file space page size for paged aggregation.
+        FileCreatPropList::setFileSpacePagesize - H5Pset_file_space_page_size
+        FileCreatPropList::getFileSpacePagesize - H5Pget_file_space_page_size
 
-      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
-      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html.
+        // Checks if the given ID is valid.
+        IdComponent::isValid - H5Iis_valid
 
-    - Version 3 Metadata Cache
+        // Sets/Gets the number of soft or user-defined links that can be
+        // traversed before a failure occurs.
+        LinkAccPropList::setNumLinks - H5Pset_nlinks
+        LinkAccPropList::getNumLinks - H5Pget_nlinks
 
-      The version 3 metadata cache moves management of metadata I/O from 
-      the clients to the metadata cache proper.  This change is essential for
-      SWMR and other features that have yet to be released.
+        // Returns a copy of the creation property list of a datatype.
+        DataType::getCreatePlist - H5Tget_create_plist
 
+        // Opens/Closes an object within a group or a file, regardless of object 
+        // type
+        Group::getObjId - H5Oopen
+        Group::closeObjId - H5Oclose
 
+        // Maps elements of a virtual dataset to elements of the source dataset.
+        DSetCreatPropList::setVirtual - H5Pset_virtual
 
-    C++ Library
-    ------------
-    - New Member Function Added to H5::ArrayType
+        // Gets general information about this file.
+        H5File::getFileInfo - H5Fget_info2
 
-      The assignment operator ArrayType::operator= was added because
-      ArrayType has pointer data members.
+        // Returns the number of members in a type.
+        IdComponent::getNumMembers - H5Inmembers
 
-      (BMR - 2016/03/07, HDFFV-9562)
+        // Determines if an element type exists.
+        IdComponent::typeExists - H5Itype_exists
 
+        // Determines if an object exists.
+        H5Location::exists - H5Lexists.
 
+        // Returns the header version of an HDF5 object.
+        H5Object::objVersion - H5Oget_info for version
 
-    Tools
-    ------
-    - h5watch
+      (BMR, 2017/03/20, HDFFV-10004, HDFFV-10139, HDFFV-10145)
 
-      The h5watch tool allows users to output new records appended to
-      a dataset under 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
-      https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html#Tools.
+    - New exception: ObjHeaderIException for H5O interface.
 
-    - h5format_convert
+      (BMR, 2017/03/15, HDFFV-10145)
 
-      The h5format_convert 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
-      tool does not rewrite raw data, but it does rewrite HDF5 metadata.
+    - New class LinkAccPropList for link access property list, to be used by
+      wrappers of H5Lexists.
 
+      (BMR, 2017/01/04, HDFFV-10145)
 
+    - New constructors to open datatypes in ArrayType, CompType, DataType,
+      EnumType, FloatType, IntType, StrType, and VarLenType.
+      
+      (BMR, 2016/12/26, HDFFV-10056)
 
-    High-Level APIs
-    ----------------
-    - H5DOappend
+    - New member functions:
 
-      The function appends data to a dataset along a specified dimension.
+        DSetCreatPropList::setNbit() to setup N-bit compression for a dataset.
 
+        ArrayType::getArrayNDims() const
+        ArrayType::getArrayDims() const
+        both to replace the non-const versions.
 
-    C Packet Table API
-    ------------------
-    - Replacement of a Public Function with H5PTcreate
+      (BMR, 2016/04/25, HDFFV-8623, HDFFV-9725)
 
-      The existing function H5PTcreate_fl limits applications so they
-      can use the deflate compression only. The public function
-      H5PTcreate has been added to replace H5PTcreate_fl. H5PTcreate
-      takes a property list identifier to provide flexibility on
-      creation properties.
 
-      (BMR - 2016/03/04, HDFFV-8623)
+    Tools:
+    ------
+     - The following options have been added to h5clear:
+       -s: clear the status_flags field in the file's superblock
+       -m: Remove the metadata cache image from the file
+
+       (QAK, 2017/03/22, PR#361)
+
+
+    High-Level APIs:
+    ---------------
+     - Added New Fortran 2003 API for h5tbmake_table_f.
+
+       (MSB, 2017/02/10, HDFFV-8486)
+
+
+
+Support for New Platforms, Languages, and Compilers
+===================================================
+
+    - Added NAG compiler 
 
-    - New Public Functions: H5PTget_dataset and H5PTget_type
 
-      Two accessor functions have been added. H5PTget_dataset returns
-      the identifier of the dataset associated with the packet table, 
-      and H5PTget_type returns the identifier of the datatype used by
-      the packet table.
 
-      (BMR, 2016/03/04, HDFFV-8623)
+Bug Fixes since HDF5-1.10.0-patch1 release
+==================================
 
-    - Regarding #ifdef VLPT_REMOVED
+    Library
+    -------
+    - Outdated data structure was used in H5D_CHUNK_DEBUG blocks, causing
+      compilation errors when H5D_CHUNK_DEBUG was defined.  This is fixed.
 
-      The #ifdef VLPT_REMOVED blocks have been removed from the packet
-      table (PT) library source except for the following functions:
-        + H5PTis_varlen() has been made available again
-        + H5PTfree_vlen_readbuff() is now H5PTfree_vlen_buff()
+      (BMR, 2017/04/04, HDFFV-8089)
 
-      (BMR - 2016/03/04, HDFFV-442)
+    - SWMR implementation in the HDF5 1.10.0 and 1.10.0-patch1 releases has a 
+      broken metadata flush dependency that manifested itself with the following
+      error at the end of the HDF5 error stack:
 
-    C++ Packet Table API
-    --------------------
-    - New Constructor Added to FL_PacketTable
+      H5Dint.c line 846 in H5D__swmr_setup(): dataspace chunk index must be 0 
+      for SWMR access, chunkno = 1
+      major: Dataset
+      minor: Bad value
 
-      An overloaded constructor has been added to FL_PacketTable and
-      takes a property list identifier to provide flexibility on
-      creation properties.
+      It was also reported at https://github.com/areaDetector/ADCore/issues/203
 
-      (BMR - 2016/03/08, HDFFV-8623)
+      The flush dependency is fixed in this release.
 
-    - New Public Functions
+    - Changed the plugins dlopen option from RTLD_NOW to RTLD_LAZY
 
-      Two accessor wrappers are added to class PacketTable.
-      PacketTable::GetDataset() returns the identifier of the dataset
-      associated with the packet table, and PacketTable::GetDatatype()
-      returns the identifier of the datatype that the packet table uses.
+      (ABD, 2016/12/12, PR#201)
 
-      (BMR - 2016/03/04, HDFFV-8623)
+    - A number of issues were fixed when reading/writing from/to corrupted
+      files to ensure that the library fails gracefully in these cases:
 
-    - Member Functions with "char*" as an Argument
+      * Writing to a corrupted file that has an object message which is
+        incorrectly marked as sharable on disk results in a buffer overflow /
+        invalid write instead of a clean error message.
 
-      Overloaded functions were added to provide the "const char*"
-      argument; the existing version will be deprecated in future
-      releases.
+      * Decoding data from a corrupted file with a dataset encoded with the
+        H5Z_NBIT decoding can result in a code execution vulnerability under
+        the context of the application using the HDF5 library.
 
-      (BMR - 2016/03/04, HDFFV-8623)
+      * When decoding an array datatype from a corrupted file, the HDF5 library
+        fails to return an error in production if the number of dimensions
+        decoded is greater than the maximum rank.
 
-    - Regarding #ifdef VLPT_REMOVED
+      * When decoding an "old style" array datatype from a corrupted file, the
+        HDF5 library fails to return an error in production if the number of
+        dimensions decoded is greater than the maximum rank.
 
-      The #ifdef VLPT_REMOVED blocks have been removed from the packet
-      table library source code except for the following functions:
-        + VL_PacketTable::IsVariableLength() was moved to PacketTable
-        + VL_PacketTable::FreeReadBuff() is now PacketTable::FreeBuff()
+      (NAF, 2016/10/06, HDFFV-9950, HDFFV-9951, HDFFV-9992, HDFFV-9993)
 
-      (BMR - 2016/03/04, HDFFV-442)
+    - Fixed an error that would occur when copying an object with an attribute
+      which is a compound datatype consisting of a variable length string.    
 
+      (VC, 2016/08/24, HDFFV-7991)
 
+    - H5DOappend will no longer fail if a dataset has no append callback 
+      registered.
 
-    Java Wrapper Library
-    --------------------
+      (VC, 2016/08/14, HDFFV-9960)
 
-    The Java HDF5 JNI library has been integrated into the HDF5 repository.
-    The configure option is "--enable-java", and the CMake option is
-    HDF5_BUILD_JAVA:BOOL=ON. The package hierarchy has changed from the
-    HDF5 1.8 JNI, which was "ncsa.hdf.hdflib.hdf5", to HDF5 1.10,
-    "hdf.hdflib.hdf5".
+    - Fixed an issue where H5Pset_alignment could result in misaligned blocks
+      with some input combinations, causing an assertion failure in debug mode.
 
-    A number of new APIs were added including some for VDS and SWMR.
+      (NAF, 2016/08/11, HDFFV-9948)
 
+    - Fixed a problem where a plugin compiled into a DLL in the default plugin
+      directory could not be found by the HDF5 library at runtime on Windows
+      when the HDF5_PLUGIN_PATH environment variable was not set.
 
+      (ABD, 2016/08/01, HDFFV-9706)
 
-    Other Important Changes
-    -----------------------
+    - Fixed an error that would occur when calling H5Adelete on an attribute
+      which is attached to an externally linked object in the target file and
+      whose datatype is a committed datatype in the main file.    
 
-    The hid_t type was changed from 32-bit to a 64-bit value.
+      (VC, 2016/07/06, HDFFV-9940)
 
+    - (a) Throw an error instead of assertion when v1 btree level hits the 1 
+          byte limit.
+      (b) Modifications to better handle error recovery when conversion by
+          h5format_convert fails.
 
+      (VC, 2016/05/29, HDFFV-9434)
 
-Issues Addressed in this Release Since 1.10.0
-=============================================
+    - Fixed a memory leak where an array used by the library to track SWMR
+      read retries was unfreed.
 
-     - h5diff would return from a compare attributes abnormally if one of the datatypes
-       was a vlen. This resulted in a memory leak as well as an incorrect report of
-       attribute comparison.
+      The leaked memory was small (on the order of a few tens of ints) and
+      allocated per-file. The memory was allocated (and lost) only when a
+      file was opened for SWMR access.
 
-       Fixed.
-       (ADB - 2016/04/26, HDFFV-9784)
+      (DER, 2016/04/27, HDFFV-9786)
 
-     - The JUnit-interface test may fail on Solaris platforms. The result of
-       a test for verifying the content of the error stack to stdout is
-       in a different order on Solaris then other platforms.
+    - Fixed a memory leak that could occur when opening a file for the first
+      time (including creating) and the call fails.
 
-       This test is skipped on Solaris
-       (ADB - 2016/04/21, HDFFV-9734)
+      This occurred when the file-driver-specific info was not cleaned up.
+      The amount of memory leaked varied with the file driver, but would
+      normally be less than 1 kB.
 
-     - When building HDF5 with Java using CMake and specifying Debug for CMAKE_BUILD_TYPE,
-       there was a missing command argument for the tests of the examples.
+      (DER, 2016/12/06, HDFFV-10168)
 
-       Fixed.
-       (ADB - 2016/04/21, HDFFV-9743)
+    - Fixed a failure in collective metadata writes.  
 
-     - Changed h5diff to print a warning when a dataset is virtual, enabling
-       the data to be compared. In addition h5repack failed to copy the data
-       of a virtual dataset to the new file. Function H5D__get_space_status changed
-       to correctly determine the H5D_space_status_t allocation value.
+      This failure only appeared when collective metadata writes 
+      were enabled (via H5Pset_coll_metadata_write()).
 
-       CMake added the Fixed Array indexing tests that were only in the autotools
-       test scripts.
+      (JRM, 2017/04/10, HDFFV-10055)
 
-       Fixed and tests added for vds issues.
-       (ADB,NAF - 2016/04/21, HDFFV-9756)
 
-     - CMake added the h5format_convert tool and tests that were only in the autotools
-       build and test scripts. The autotools test script was reworked to allow CMake
-       to execute the test suite in parallel.
+    Parallel Library
+    ----------------
+    - Fixed a bug that could occur when allocating a chunked dataset in parallel
+      with an alignment set and an alignment threshold greater than the chunk
+      size but less than or equal to the raw data aggregator size.
 
-       Also, h5clear tool and tests were added to the misc folder.
+      (NAF, 2016/08/11, HDFFV-9969)
 
-       Fixed.
-       (ADB - 2016/04/21, HDFFV-9766)
 
-     - CMake added the h5watch tool and argument tests that were only in the autotools
-       build and test scripts. The POSIX only tests were not added to CMake.
+    Configuration
+    -------------         
+    - Configuration will check for the strtoll and strtoull functions
+      before using alternatives
+
+      (ABD, 2017/03/17, PR#340)
 
-       CMake HL tools files were refactored to move the CMake test scripts into each tool folder.
+    - CMake uses a Windows pdb directory variable if available and
+      will generate both static and shared pdb files.
 
-       Fixed.
-       (ADB - 2016/04/21, HDFFV-9770)
+      (ABD, 2017/02/06, HDFFV-9875)
 
-     - Configure fails to detect valid real KINDs on FreeBSD 9.3 (i386) with Fortran enabled.
+    - CMake now builds shared versions of tools.
 
-       Fixed. Added the exponential option to SELECTED_REAL_KIND to distinguish 
-       KINDs of same precision
-       (MSB - 2016/05/14,HDFFV-9912)
+      (ABD, 2017/02/01, HDFFV-10123)
 
-     - Configure fails in sed command on FreeBSD 9.3 (i386) with Fortran enabled.
-  
-       Fixed.
-       (MSB - 2016/05/14,HDFFV-9912)
+    - Makefiles and test scripts have been updated to correctly remove files
+      created when running "make check" and to avoid removing any files under 
+      source control.  In-source builds followed by "make clean" and "make 
+      distclean" should result in the original source files.
 
-     - Compile time error in H5f90global.F90 with IBM XL Fortran 14.1.0.13 on BG/Q with Fortran
-       enabled.
+      (LRK, 2017/01/17, HDFFV-10099)
+
+    - The tools directory has been divided into two separate source and test
+      directories. This resolves a build dependency and, as a result,
+      'make check' will no longer fail in the tools directory if 'make' was
+      not executed first.
     
-       Fixed.
-       (MSB - 2016/05/16,HDFFV-9917)
+      (ABD, 2016/10/27, HDFFV-9719)
+
+    - CMake: Fixed a timeout error that would occasionally occur when running
+      the virtual file driver tests simultaneously due to test directory
+      and file name collisions.
+
+      (ABD, 2016/09/19, HDFFV-9431)
+
+    - CMake: Fixed a command length overflow error by converting custom
+      commands inside CMakeTest.cmake files into regular dependencies and
+      targets.
 
+      (ABD, 2016/07/12, HDFFV-9939)
 
-Issues Addressed in this Release Since alpha1
-=============================================
+    - Fixed a problem preventing HDF5 to be built on 32-bit CYGWIN by
+      condensing cygwin configuration files into a single file and
+      removing outdated compiler settings.
 
-     - H5Pget_virtual_printf_gap, H5Pget_virtual_view, H5Pget_efile_prefix
+      (ABD, 2016/07/12, HDFFV-9946)
 
-       The correct access property list settings from the
-       H5Pget_virtual_printf_gap, H5Pget_virtual_view, and
-       H5Pget_efile_prefix function calls could not be retrieved
-       using H5Dget_access_plist().
 
-       Fixed.
+    Fortran
+    --------
+    - Changed H5S_ALL_F from INTEGER to INTEGER(HID_T)
 
-       (DER and NAF - 2016/03/14, HDFFV-9716)
+      (MSB, 2016/10/14, HDFFV-9987)
 
-     - h5dump
 
-       When h5dump was provided with the name of a non-existing file or
-       when optional arguments were the last option on the command line,
-       h5dump would segfault.
+    Tools
+    -----
+    - h5diff now correctly ignores strpad in comparing strings.
 
-       Fixed.
+      (ABD, 2017/03/03, HDFFV-10128)
 
-       (ADB 2016/02/28 HDFFV-9639, HDFFV-9684)
+    - h5repack now correctly parses the command line filter options.
 
-     - No Error Message for Corrupt Metadata
+      (ABD, 2017/01/24, HDFFV-10046)
 
-       The HDF5 Library did not propagate an error when it encountered
-       corrupt metadata in an HDF5 file. The issue was fixed for a
-       specific file provided by a user. If you still see the problem,
-       please contact help at hdfgroup.org
+    - h5diff now correctly returns an error when it cannot read data due
+      to an unavailable filter plugin.
 
-       Fixed.
+      (ADB 2017/01/18, HDFFV-9994 )
 
-       (MC - 2016/02/18, HDFFV-9670)
+    - Fixed an error in the compiler wrapper scripts (h5cc, h5fc, et al.)
+      in which they would erroneously drop the file argument specified via
+      the -o flag when the -o flag was specified before the -c flag on the
+      command line, resulting in a failure to compile.
 
-     - Problem Reading Chunked Datasets with a String Datatype Larger
-       Than the Chunk Size in Bytes
+      (LRK, 2016/11/04, HDFFV-9938, HDFFV-9530) 
 
-       When the latest file format was used and when a chunked dataset
-       was created with a datatype with the size bigger than a chunk
-       size, the data could not be read back. The issue was reported
-       for chunked datasets with a string datatype and was confirmed
-       for other datatypes with the sizes bigger than the chunk size in
-       bytes.
+    - h5repack User Defined (UD) filter parameters were not parsed correctly.
 
-       Fixed.
+      The UD filter parameters were not being parsed correctly. Reworked coding
+      section to parse the correct values and verify number of parameters.
 
-       (JM - 2016/02/13, HDFFV-9672)
+      (ABD, 2016/10/19, HDFFV-9996, HDFFV-9974, HDFFV-9515, HDFFV-9039) 
 
-     - Control over the Location of External Files
+    - h5repack allows the --enable-error-stack option on the command line.
 
-       Users were unable to specify the locations of external files.
+      (ADB, 2016/08/08, HDFFV-9775)
 
-       Two APIs - H5Pget_efile_prefix and H5Pset_efile_prefix - were
-       added so that users could specify the locations of external files.
 
-       (DER - 2016/02/04, HDFFV-8740)
+    C++ APIs
+    --------
+    - The member function H5Location::getNumObjs() is moved to
+      class Group because the objects are in a group or a file only,
+      and H5Object::getNumAttrs to H5Location to get the number of
+      attributes at a given location.
 
+      (BMR, 2017/03/17, PR#466)
 
+    - Due to the change in the C API, the overloaded functions of
+      PropList::setProperty now need const for some arguments.  They are
+      planned for deprecation and are replaced by new versions with proper
+      consts.
 
-Issues Addressed in this Release Since alpha0
-=============================================
-    - h5format_convert
+      (BMR, 2017/03/17, PR#344)
 
-      The h5format_convert tool did not downgrade the version of the
-      superblock.
+    - The high-level API Packet Table (PT) did not write data correctly when
+      the datatype is a compound type that has string type as one of the
+      members.  This problem started in 1.8.15, after the fix of HDFFV-9042
+      was applied, which caused the Packet Table to use native type to access
+      the data.  It should be up to the application to specify whether the
+      buffer to be read into memory is in the machine's native architecture.
+      Thus, the PT is fixed to not use native type but to make a copy of the
+      user's provided datatype during creation or the packet table's datatype
+      during opening.  If an application wishes to use native type to read the
+      data, then the application will request that.  However, the Packet Table
+      doesn't provide a way to specify memory datatype in this release.  This
+      feature will be available in future releases.
 
-      Fixed. The tool now will downgrade the version of the superblock.
+      (BMR, 2016/10/27, HDFFV-9758)
 
-      (EIP 2016/01/11)
+    - The obsolete macros H5_NO_NAMESPACE and H5_NO_STD have been removed from
+      the HDF5 C++ API library.
 
-    - Crashes with multiple threads: invalid pointers
+      (BMR, 2016/10/23, HDFFV-9532)
 
-      It was reported that alpha0 crashed when used with multiple
-      threads. The issue exists in the HDF5 Library versions 1.8 and
-      1.9. The problem is related to a shared file pointer used in some
-      miscellaneous data structures. The thread-safe library exposed
-      paths in the library where a file pointer became invalid.
+    - The problem where a user-defined function cannot access both, attribute
+      and dataset, using only one argument is now fixed.
 
-      The alpha1 release contains the fixes for the specific use case
-      as described in HDFFV-9643. We will keep working on identifying
-      and fixing other paths in the library with similar problems.
+      (BMR, 2016/10/11, HDFFV-9920)
 
-      (EIP - 2016/01/15, HDFFV-9643)
+    - In-memory array information, ArrayType::rank and
+      ArrayType::dimensions, were removed. This is an implementation
+      detail and should not affect applications.
 
+      (BMR, 2016/04/25, HDFFV-9725)
 
 
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
+    Testing
+    -------
+    - Fixed a problem that caused tests using SWMR to occasionally fail when 
+      running "make check" using parallel make.
 
-    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
+      (LRK, 2016/03/22, PR#338, PR#346, PR#358)
 
-    Linux 2.6.32-573.22.1.el6     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (mayll/platypus)                 Version 4.4.7 20120313 (Red Hat 4.4.7-16)
-                                     Version 4.9.3, Version 5.2.0
-                                  PGI C, Fortran, C++ for 64-bit target on
-                                  x86-64;
-                                      Version 15.7-0
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 15.0.3.187 Build 20150407
-                                  MPICH 3.1.4 compiled with GCC 4.9.3
 
-    Linux 2.6.32-573.18.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
+Supported Platforms
+===================
+
+    Linux 2.6.32-573.18.1.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
 
-    Linux 3.10.0-327.10.1.el7   GNU C (gcc), Fortran (gfortran), C++ (g++)
+    Linux 3.10.0-327.10.1.el7     GNU C (gcc), Fortran (gfortran), C++ (g++)
     #1 SMP x86_64 GNU/Linux       compilers:
     (kituo/moohan)                  Version 4.8.5 20150623 (Red Hat 4.8.5-4)
                                     Version 4.9.3, Version 5.2.0
@@ -500,18 +580,21 @@ They are built with the configure process unless specified otherwise.
     Windows 7                     Visual Studio 2012 w/ Intel Fortran 15 (cmake)
                                   Visual Studio 2013 w/ Intel Fortran 15 (cmake)
                                   Visual Studio 2015 w/ Intel Fortran 16 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 2.2.1(0.289/5/3) gcc(4.9.3) compiler and gfortran)
-                                  (cmake and autotools)
 
     Windows 7 x64                 Visual Studio 2012 w/ Intel Fortran 15 (cmake)
                                   Visual Studio 2013 w/ Intel Fortran 15 (cmake)
                                   Visual Studio 2015 w/ Intel Fortran 16 (cmake)
+                                  Visual Studio 2015 w/ MSMPI 8 (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.8.0(0.309/5/3) 
+                                      gcc and gfortran compilers (GCC 5.4.0)
+                                      (cmake and autotools)
 
-    Windows 8.1                   Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+    Windows 10                    Visual Studio 2015 w/ Intel Fortran 16 (cmake)
+                                  Cygwin(CYGWIN_NT-6.1 2.8.0(0.309/5/3) 
+                                      gcc and gfortran compilers (GCC 5.4.0)
+                                      (cmake and autotools)
 
-    Windows 8.1 x64               Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+    Windows 10 x64                Visual Studio 2015 w/ Intel Fortran 16 (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
@@ -521,14 +604,13 @@ They are built with the configure process unless specified otherwise.
     64-bit                        gfortran GNU Fortran (GCC) 4.9.2
     (wren/quail)                  Intel icc/icpc/ifort version 15.0.3
 
-    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.0 from Xcode 7.0
+    Mac OS X Yosemite 10.10.5     Apple clang/clang++ version 6.1 from Xcode 7.0
     64-bit                        gfortran GNU Fortran (GCC) 4.9.2
     (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
 
-    Mac OS X El Capitan 10.11.4   Apple clang/clang++ version 7.3.0 from Xcode 7.3
+    Mac OS X El Capitan 10.11.6   Apple clang/clang++ version 7.3 from Xcode 7.3
     64-bit                        gfortran GNU Fortran (GCC) 5.2.0
-    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.3
-
+    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 16.0.2
 
 
 Tested Configuration Features Summary
@@ -546,155 +628,103 @@ Tested Configuration Features Summary
 
 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
+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/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
+Windows 7 x64                           y        y/y    y        y    y     y
+Windows 7 Cygwin                        n        y/n    n        y    y     y
+Windows 7 x64 Cygwin                    n        y/n    n        y    y     y
+Windows 10                              y        y/y    n        y    y     y
+Windows 10 x64                          y        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.5 64-bit        n        y/y    n        y    y     y
-AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 6.7 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 6.7 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.7 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
-CentOS 7.1 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 7.1 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
+Mac OS X Yosemite 10.10.5 64-bit        n        y/y    n        y    y     y
+Mac OS X El Capitan 10.11.6 64-bit      n        y/y    n        y    y     y
+CentOS 7.2 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
+CentOS 7.2 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
+CentOS 7.2 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
+Linux 2.6.32-573.18.1.el6.ppc64         n        y/y    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
+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
+Windows 7 x64 Cygwin                       n       n         n         y
+Windows 10                                 y       y         y         y
+Windows 10 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.5 64-bit           y       n         y         y
-AIX 6.1 32- and 64-bit                     y       n         n         y
-CentOS 6.7 Linux 2.6.32 x86_64 GNU         y       y         y         y
-CentOS 6.7 Linux 2.6.32 x86_64 Intel       y       y         y         y
-CentOS 6.7 Linux 2.6.32 x86_64 PGI         y       y         y         y
-CentOS 7.1 Linux 3.10.0 x86_64 GNU         y       y         y         y
-CentOS 7.1 Linux 3.10.0 x86_64 Intel       y       y         y         y
-Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         y
+Mac OS X Yosemite 10.10.5 64-bit           y       n         y         y
+Mac OS X El Capitan 10.11.6 64-bit         y       n         y         y
+CentOS 7.2 Linux 2.6.32 x86_64 PGI         y       y         y         n
+CentOS 7.2 Linux 2.6.32 x86_64 GNU         y       y         y         y
+CentOS 7.2 Linux 2.6.32 x86_64 Intel       y       y         y         n
+Linux 2.6.32-573.18.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-431.11.2.el6     g95 (GCC 4.0.3 (g95 0.94!)
-    #1 SMP x86_64 GNU/Linux
-    (platypus)
 
-    Windows 7                     Visual Studio 2008  (cmake)
-
-    Windows 7 x64                 Visual Studio 2008  (cmake)
+The following platforms are not supported but have been tested for this release.
 
-    Windows 7 x64                 Visual Studio 2010  (cmake) with SWMR using GPFS
+    Linux 2.6.32-573.22.1.el6     GNU C (gcc), Fortran (gfortran), C++ (g++)
+    #1 SMP x86_64 GNU/Linux       compilers:
+    (mayll/platypus)                 Version 4.4.7 20120313
+                                     Version 4.8.4
+                                  PGI C, Fortran, C++ for 64-bit target on
+                                  x86-64;
+                                      Version 16.10-0
+                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
+                                  compilers:
+                                     Version 15.0.3.187 (Build 20150407)
+                                  MPICH 3.1.4 compiled with GCC 4.9.3
 
-    Windows 10                    Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+    Linux 3.10.0-327.18.2.el7     GNU C (gcc) and C++ (g++) compilers
+    #1 SMP x86_64 GNU/Linux          Version 4.8.5 20150623 (Red Hat 4.8.5-4)
+    (jelly)                       with NAG Fortran Compiler Release 6.1(Tozai) 
+                                  Intel(R) C (icc) and C++ (icpc) compilers
+                                     Version 15.0.3.187 (Build 20150407)
+                                  with NAG Fortran Compiler Release 6.1(Tozai)
 
-    Windows 10 x64                Visual Studio 2013 w/ Intel Fortran 15 (cmake)
+    Linux 2.6.32-573.18.1.el6.ppc64  MPICH mpich 3.1.4 compiled with
+    #1 SMP ppc64 GNU/Linux           IBM XL C/C++ for Linux, V13.1
+    (ostrich)                        and IBM XL Fortran for Linux, V15.1
 
-    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
+    Debian 8.4 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1 x86_64 GNU/Linux
+                                  gcc, g++ (Debian 4.9.2-10) 4.9.2
+                                  GNU Fortran (Debian 4.9.2-10) 4.9.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)
+    Fedora 24  4.7.2-201.fc24.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
+                                  gcc, g++ (GCC) 6.1.1 20160621 
+                                      (Red Hat 6.1.1-3)
+                                  GNU Fortran (GCC) 6.1.1 20160621 
+                                      (Red Hat 6.1.1-3)
                                   (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
+    Ubuntu 16.04.1 4.4.0-38-generic #57-Ubuntu SMP x86_64 GNU/Linux
+                                  gcc, g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 
+                                      5.4.0 20160609
+                                  GNU Fortran (Ubuntu 5.4.0-6ubuntu1~16.04.2) 
+                                      5.4.0 20160609
                                   (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 and Limitations
-==============================
-This section contains the list of known problems and limitations introduced
-in this release of HDF5.
-
-Note: this list is not exhaustive of all known issues discovered in HDF5
-software to date. For a list of significant problems and known workarounds
-identified in past releases, please refer to:
-
-https://www.hdfgroup.org/HDF5/release/known_problems/
-
-The HDF Group also maintains a JIRA issue-tracking database which is used to
-capture all known issues which are too numerous to reasonably list in this
-document. The HDF Group is taking steps to make our JIRA issue database
-open to the public, and this section will refer to that database in a future
-release. In the meantime, please contact help at hdfgroup.org if you come across
-an issue not listed here or at the link above, and we will provide any
-information about known workarounds that we have or add it to our list of
-known issues if it is a new issue.
-
- - The flush/refresh test occasionally fails on OS X platforms. This is
-   being investigated but no fix or workaround is available at this time.
-   (DER - 2016/03/22, HDFFV-9731)
-
- - The VDS/SWMR test will fail with a segmentation fault if the library
-   is built with --enable-using-memchecker. The is due to a VDS shutdown
-   procedure freeing a shared resource too early when the memory
-   checker changes are built. This problem does not arise when the
-   memory checker changes are not used since the internal library free
-   lists behave differently. The memory checker configure option should
-   normally only be used under special circumstances so this should not
-   affect most users. Users should be aware that the --enable-using-memchecker
-   + VDS combination may cause a segfault, however, so Valgrind et al. may
-   have to be used with an HDF5 library built without the feature if this
-   proves to be a problem.
-   (DER - 2016/03/21, HDFFV-9732)
-
- - SWMR feature limitations
-   The SWMR feature will only work if an HDF5 file under SWMR access resides
-   on a file system that obeys POSIX write() ordering semantics. Because of
-   this, SWMR will not work on  network file systems such as NFS or SMB/Windows
-   file shares since those systems do not guarantee write odering. SWMR
-   regression tests are likely to fail if run on a network file system. SWMR
-   is currently not tested on Windows though it can be tested manually
-   (some of the SWMR test programs are built by CMake), and there are no
-   obvious reasons for it to not work on NTFS or GPFS.
-   (EIP - 2016/03/20, HDFFV-9733)
-
- - VDS feature limitation
-   Currently, the path to a VDS source file is interpreted as relative to the
-   directory where the executable program runs and not to the HDF5 file with
-   the VDS dataset unless a full path to the source file is specified during
-   the mapping.
-   (EIP - 2016/03/20, HDFFV-9724)
-
- - The H5Lexists API changed behavior in HDF5-1.10 when used with a file handle
-   and root group name ("/"):
-
-   H5Lexists(fileid, "/")
-
-   In HDF5-1.8 it returns false (0) and in HDF5-1.10 it returns true (1).
-   The documentation will be updated with information regarding this change.
-   (LRK - 2016/03/30, HDFFV-8746)
+Known Problems
+==============
+
+    At present, metadata cache images may not be generated by parallel 
+    applications.  Parallel applications can read files with metadata cache
+    images, but since this is a collective operation, a deadlock is possible
+    if one or more processes do not participate.
 
+    Known problems in previous releases can be found in the HISTORY*.txt files 
+    in the HDF5 source. Please report any new problems found to 
+    help at hdfgroup.org.
diff --git a/release_docs/USING_CMake_Examples.txt b/release_docs/USING_CMake_Examples.txt
index d8940a5..f188ab3 100644
--- a/release_docs/USING_CMake_Examples.txt
+++ b/release_docs/USING_CMake_Examples.txt
@@ -22,7 +22,7 @@ I. Preconditions
 
    1. We suggest you obtain the latest CMake for windows from the Kitware
       web site. The HDF5 1.10.x product requires a minimum CMake version
-      of 3.1.0.
+      of 3.2.2.
 
    2. You have installed the HDF5 library built with CMake, by executing
       the HDF Install Utility (the *.msi file in the binary package for
@@ -49,10 +49,10 @@ Default installation process:
        The default installation folder is defined as "@CMAKE_INSTALL_PREFIX@".
            It can be changed with the INSTALLDIR script option.
        The default ctest configuration is defined as "Release". It can be changed
-           with the CTEST_BUILD_CONFIGURATION script option. Note that this must
+           with the CTEST_CONFIGURATION_TYPE script option. Note that this must
            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".
+           Shared libraries can be used with the STATIC_ONLY script option set to "NO".
        Other options can be changed by editing the HDF5_Examples.cmake file.
 
        If the defaults are okay, execute from this directory:
diff --git a/release_docs/USING_HDF5_CMake.txt b/release_docs/USING_HDF5_CMake.txt
index 64d1a2a..ecf972d 100644
--- a/release_docs/USING_HDF5_CMake.txt
+++ b/release_docs/USING_HDF5_CMake.txt
@@ -37,7 +37,7 @@ I. Preconditions
 
    1. We suggest you obtain the latest CMake for windows from the Kitware
       web site. The HDF5 1.10.x product requires a minimum CMake version
-      of 3.1.0.
+      of 3.2.2.
 
    2. You have installed the HDF5 library built with CMake, by executing
       the HDF Install Utility (the *.msi file in the binary package for
@@ -180,18 +180,22 @@ Given the preconditions in section I, create a CMakeLists.txt file at the
 source root. Include the following text in the file:
 
 ##########################################################
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 project (HDF5MyApp C CXX)
 
-find_package (HDF5 NAMES hdf5 COMPONENTS C static)
+set (LIB_TYPE STATIC) # or SHARED
+string(TOLOWER ${LIB_TYPE} SEARCH_TYPE)
+
+find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE})
 # find_package (HDF5) # Find non-cmake built HDF5
 INCLUDE_DIRECTORIES (${HDF5_INCLUDE_DIR})
-set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_STATIC_LIBRARY})
+set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY})
 
 set (example hdf_example)
 
 add_executable (${example} ${PROJECT_SOURCE_DIR}/${example}.c)
-TARGET_C_PROPERTIES (${example} " " " ")
+TARGET_NAMING (${example} ${LIB_TYPE})
+TARGET_C_PROPERTIES (${example} ${LIB_TYPE} " " " ")
 target_link_libraries (${example} ${LINK_LIBS})
 
 enable_testing ()
@@ -217,103 +221,105 @@ NOTE: this file is available at the HDF web site:
 
     HDF5_Examples.cmake
 
-
+Also available at the HDF web site is a CMake application framework template.
+You can quickly add files to the framework and execute the script to compile
+your application with an installed HDF5 binary.
 
 ========================================================================
 ctest
 ========================================================================
 
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.2.2 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})
+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_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
 #CTEST_SOURCE_NAME - name of source folder; HDF4Examples
-#STATIC_LIBRARIES - Default is YES
+#STATIC_ONLY - Default is YES
 #FORTRAN_LIBRARIES - Default is NO
 #JAVA_LIBRARIES - Default is NO
 ##NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac)
-if(DEFINED CTEST_SCRIPT_ARG)
+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})
+    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")
-else(NOT DEFINED STATIC_LIBRARIES)
-    set(STATICLIBRARIES "NO")
-endif()
-if(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "NO")
-else(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "YES")
-endif()
-if(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "NO")
-else(NOT DEFINED JAVA_LIBRARIES)
-    set(JAVALIBRARIES "YES")
-endif()
+        endif ()
+    endforeach ()
+endif ()
+if (NOT DEFINED INSTALLDIR)
+    set (INSTALLDIR "@CMAKE_INSTALL_PREFIX@")
+endif ()
+if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
+    set (CTEST_CONFIGURATION_TYPE "Release")
+endif ()
+if (NOT DEFINED CTEST_SOURCE_NAME)
+    set (CTEST_SOURCE_NAME "HDF5Examples")
+endif ()
+if (NOT DEFINED STATIC_ONLY)
+    set (STATICONLYLIBRARIES "YES")
+else ()
+    set (STATICONLYLIBRARIES "NO")
+endif ()
+if (NOT DEFINED FORTRAN_LIBRARIES)
+    set (FORTRANLIBRARIES "NO")
+else ()
+    set (FORTRANLIBRARIES "YES")
+endif ()
+if (NOT DEFINED JAVA_LIBRARIES)
+    set (JAVALIBRARIES "NO")
+else ()
+    set (JAVALIBRARIES "YES")
+endif ()
 
 #TAR_SOURCE - name of tarfile
-#if(NOT DEFINED TAR_SOURCE)
-#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.10.1-Source")
-#endif()
+#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}")
+if (WIN32)
+  if (${STATICONLYLIBRARIES})
+    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 (${STATICONLYLIBRARIES})
+    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(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
-else()
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
-endif()
-if(${JAVALIBRARIES})
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=ON")
-else()
-  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=OFF")
-endif()
-set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HDF_PACKAGE_EXT@")
+if (${FORTRANLIBRARIES})
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
+else ()
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+endif ()
+if (${JAVALIBRARIES})
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA:BOOL=ON")
+else ()
+  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_JAVA: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
@@ -323,90 +329,90 @@ set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HD
 #-----------------------------------------------------------------------------
 # MAC machines need special option
 #-----------------------------------------------------------------------------
-if(APPLE)
+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)
+  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 (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}\"")
+set (CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
 ## --------------------------
-if(CTEST_USE_TAR_SOURCE)
+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)
+  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 ()
 
 #-----------------------------------------------------------------------------
 ## Clear the build directory
 ## --------------------------
-set(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
+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})
+  ctest_empty_binary_directory (${CTEST_BINARY_DIRECTORY})
 else ()
-  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+  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()
+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}\""
+    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_CONFIGURATION_TYPE} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
 )
 
 #-----------------------------------------------------------------------------
 ## -- set output to english
-set($ENV{LC_MESSAGES}  "en_EN")
+set ($ENV{LC_MESSAGES}  "en_EN")
 
 #-----------------------------------------------------------------------------
-configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+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)
+if (LOCAL_SUBMIT)
   ctest_submit (PARTS Configure Notes)
-endif()
+endif ()
 ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
-if(LOCAL_SUBMIT)
+if (LOCAL_SUBMIT)
   ctest_submit (PARTS Build)
-endif()
+endif ()
 ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
-if(LOCAL_SUBMIT)
+if (LOCAL_SUBMIT)
   ctest_submit (PARTS Test)
-endif()
-if(res GREATER 0)
+endif ()
+if (res GREATER 0)
   message (FATAL_ERROR "tests FAILED")
-endif()
+endif ()
 #-----------------------------------------------------------------------------
 ##############################################################################################################
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d93612b..e2acd30 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_SRC C CXX)
 
 #-----------------------------------------------------------------------------
@@ -9,7 +9,7 @@ add_definitions (${HDF_EXTRA_C_FLAGS})
 #-----------------------------------------------------------------------------
 # List Source Files
 #-----------------------------------------------------------------------------
-set (H5_SRCS
+set (H5_SOURCES
     ${HDF5_SRC_DIR}/H5.c
     ${HDF5_SRC_DIR}/H5checksum.c
     ${HDF5_SRC_DIR}/H5dbg.c
@@ -25,9 +25,9 @@ set (H5_HDRS
     #${HDF5_SRC_DIR}/H5version.h
     #${HDF5_SRC_DIR}/H5overflow.h
 )
-IDE_GENERATED_PROPERTIES ("H5" "${H5_HDRS}" "${H5_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5" "${H5_HDRS}" "${H5_SOURCES}" )
 
-set (H5A_SRCS
+set (H5A_SOURCES
     ${HDF5_SRC_DIR}/H5A.c
     ${HDF5_SRC_DIR}/H5Abtree2.c
     ${HDF5_SRC_DIR}/H5Adense.c
@@ -40,21 +40,23 @@ set (H5A_HDRS
     ${HDF5_SRC_DIR}/H5Apkg.h
     ${HDF5_SRC_DIR}/H5Apublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5A" "${H5A_HDRS}" "${H5A_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5A" "${H5A_HDRS}" "${H5A_SOURCES}" )
 
-set (H5AC_SRCS
+set (H5AC_SOURCES
     ${HDF5_SRC_DIR}/H5AC.c
+    ${HDF5_SRC_DIR}/H5ACdbg.c
     ${HDF5_SRC_DIR}/H5AClog.c
     ${HDF5_SRC_DIR}/H5ACmpio.c
+    ${HDF5_SRC_DIR}/H5ACproxy_entry.c
 )
 
 set (H5AC_HDRS
     ${HDF5_SRC_DIR}/H5ACpkg.h
     ${HDF5_SRC_DIR}/H5ACpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5AC" "${H5AC_HDRS}" "${H5AC_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5AC" "${H5AC_HDRS}" "${H5AC_SOURCES}" )
 
-set (H5B_SRCS
+set (H5B_SOURCES
     ${HDF5_SRC_DIR}/H5B.c
     ${HDF5_SRC_DIR}/H5Bcache.c
     ${HDF5_SRC_DIR}/H5Bdbg.c
@@ -63,15 +65,17 @@ set (H5B_HDRS
     ${HDF5_SRC_DIR}/H5Bpkg.h
     ${HDF5_SRC_DIR}/H5Bpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5B" "${H5B_HDRS}" "${H5B_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5B" "${H5B_HDRS}" "${H5B_SOURCES}" )
 
 
-set (H5B2_SRCS
+set (H5B2_SOURCES
     ${HDF5_SRC_DIR}/H5B2.c
     ${HDF5_SRC_DIR}/H5B2cache.c
     ${HDF5_SRC_DIR}/H5B2dbg.c
     ${HDF5_SRC_DIR}/H5B2hdr.c
     ${HDF5_SRC_DIR}/H5B2int.c
+    ${HDF5_SRC_DIR}/H5B2internal.c
+    ${HDF5_SRC_DIR}/H5B2leaf.c
     ${HDF5_SRC_DIR}/H5B2stat.c
     ${HDF5_SRC_DIR}/H5B2test.c
 )
@@ -79,29 +83,37 @@ set (H5B2_HDRS
     ${HDF5_SRC_DIR}/H5B2pkg.h
     ${HDF5_SRC_DIR}/H5B2public.h
 )
-IDE_GENERATED_PROPERTIES ("H5B2" "${H5B2_HDRS}" "${H5B2_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5B2" "${H5B2_HDRS}" "${H5B2_SOURCES}" )
 
 
-set (H5C_SRCS
+set (H5C_SOURCES
     ${HDF5_SRC_DIR}/H5C.c
+    ${HDF5_SRC_DIR}/H5Cdbg.c
+    ${HDF5_SRC_DIR}/H5Cepoch.c
+    ${HDF5_SRC_DIR}/H5Cimage.c
+    ${HDF5_SRC_DIR}/H5Clog.c
     ${HDF5_SRC_DIR}/H5Cmpio.c
+    ${HDF5_SRC_DIR}/H5Cprefetched.c
+    ${HDF5_SRC_DIR}/H5Cquery.c
+    ${HDF5_SRC_DIR}/H5Ctag.c
+    ${HDF5_SRC_DIR}/H5Ctest.c
 )
 set (H5C_HDRS
     ${HDF5_SRC_DIR}/H5Cpkg.h
     ${HDF5_SRC_DIR}/H5Cpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5C" "${H5C_HDRS}" "${H5C_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5C" "${H5C_HDRS}" "${H5C_SOURCES}" )
 
 
-set (H5CS_SRCS
+set (H5CS_SOURCES
     ${HDF5_SRC_DIR}/H5CS.c
 )
 set (H5CS_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5CS" "${H5CS_HDRS}" "${H5CS_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5CS" "${H5CS_HDRS}" "${H5CS_SOURCES}" )
 
 
-set (H5D_SRCS
+set (H5D_SOURCES
     ${HDF5_SRC_DIR}/H5D.c
     ${HDF5_SRC_DIR}/H5Dbtree.c
     ${HDF5_SRC_DIR}/H5Dbtree2.c
@@ -131,9 +143,9 @@ set (H5D_HDRS
     ${HDF5_SRC_DIR}/H5Dpkg.h
     ${HDF5_SRC_DIR}/H5Dpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5D" "${H5D_HDRS}" "${H5D_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5D" "${H5D_HDRS}" "${H5D_SOURCES}" )
 
-set (H5E_SRCS
+set (H5E_SOURCES
     ${HDF5_SRC_DIR}/H5E.c
     ${HDF5_SRC_DIR}/H5Edeprec.c
     ${HDF5_SRC_DIR}/H5Eint.c
@@ -147,10 +159,10 @@ set (H5E_HDRS
     ${HDF5_SRC_DIR}/H5Epublic.h
     #${HDF5_SRC_DIR}/H5Eterm.h
 )
-IDE_GENERATED_PROPERTIES ("H5E" "${H5E_HDRS}" "${H5E_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5E" "${H5E_HDRS}" "${H5E_SOURCES}" )
 
 
-set (H5EA_SRCS
+set (H5EA_SOURCES
     ${HDF5_SRC_DIR}/H5EA.c
     ${HDF5_SRC_DIR}/H5EAcache.c
     ${HDF5_SRC_DIR}/H5EAdbg.c
@@ -166,10 +178,10 @@ set (H5EA_SRCS
 set (H5EA_HDRS
     ${HDF5_SRC_DIR}/H5EApkg.h
 )
-IDE_GENERATED_PROPERTIES ("H5EA" "${H5EA_HDRS}" "${H5EA_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5EA" "${H5EA_HDRS}" "${H5EA_SOURCES}" )
 
 
-set (H5F_SRCS
+set (H5F_SOURCES
     ${HDF5_SRC_DIR}/H5F.c
     ${HDF5_SRC_DIR}/H5Faccum.c
     ${HDF5_SRC_DIR}/H5Fcwfs.c
@@ -183,6 +195,7 @@ set (H5F_SRCS
     ${HDF5_SRC_DIR}/H5Fmpi.c
     ${HDF5_SRC_DIR}/H5Fquery.c
     ${HDF5_SRC_DIR}/H5Fsfile.c
+    ${HDF5_SRC_DIR}/H5Fspace.c
     ${HDF5_SRC_DIR}/H5Fsuper.c
     ${HDF5_SRC_DIR}/H5Fsuper_cache.c
     ${HDF5_SRC_DIR}/H5Ftest.c
@@ -192,10 +205,10 @@ set (H5F_HDRS
     ${HDF5_SRC_DIR}/H5Fpkg.h
     ${HDF5_SRC_DIR}/H5Fpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5F" "${H5F_HDRS}" "${H5F_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5F" "${H5F_HDRS}" "${H5F_SOURCES}" )
 
 
-set (H5FA_SRCS
+set (H5FA_SOURCES
     ${HDF5_SRC_DIR}/H5FA.c
     ${HDF5_SRC_DIR}/H5FAcache.c
     ${HDF5_SRC_DIR}/H5FAdbg.c
@@ -209,10 +222,10 @@ set (H5FA_SRCS
 set (H5FA_HDRS
     ${HDF5_SRC_DIR}/H5FApkg.h
 )
-IDE_GENERATED_PROPERTIES ("H5FA" "${H5FA_HDRS}" "${H5FA_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5FA" "${H5FA_HDRS}" "${H5FA_SOURCES}" )
 
 
-set (H5FD_SRCS
+set (H5FD_SOURCES
     ${HDF5_SRC_DIR}/H5FD.c
     ${HDF5_SRC_DIR}/H5FDcore.c
     ${HDF5_SRC_DIR}/H5FDdirect.c
@@ -243,26 +256,26 @@ set (H5FD_HDRS
     ${HDF5_SRC_DIR}/H5FDstdio.h
     ${HDF5_SRC_DIR}/H5FDwindows.h
 )
-IDE_GENERATED_PROPERTIES ("H5FD" "${H5FD_HDRS}" "${H5FD_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5FD" "${H5FD_HDRS}" "${H5FD_SOURCES}" )
 
 
-set (H5FL_SRCS
+set (H5FL_SOURCES
     ${HDF5_SRC_DIR}/H5FL.c
 )
 set (H5FL_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5FL" "${H5FL_HDRS}" "${H5FL_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5FL" "${H5FL_HDRS}" "${H5FL_SOURCES}" )
 
 
-set (H5FO_SRCS
+set (H5FO_SOURCES
     ${HDF5_SRC_DIR}/H5FO.c
 )
 set (H5FO_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5FO" "${H5FO_HDRS}" "${H5FO_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5FO" "${H5FO_HDRS}" "${H5FO_SOURCES}" )
 
 
-set (H5FS_SRCS
+set (H5FS_SOURCES
     ${HDF5_SRC_DIR}/H5FS.c
     ${HDF5_SRC_DIR}/H5FScache.c
     ${HDF5_SRC_DIR}/H5FSdbg.c
@@ -276,9 +289,9 @@ set (H5FS_HDRS
     ${HDF5_SRC_DIR}/H5FSpkg.h
     ${HDF5_SRC_DIR}/H5FSpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5FS" "${H5FS_HDRS}" "${H5FS_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5FS" "${H5FS_HDRS}" "${H5FS_SOURCES}" )
 
-set (H5G_SRCS
+set (H5G_SOURCES
     ${HDF5_SRC_DIR}/H5G.c
     ${HDF5_SRC_DIR}/H5Gbtree2.c
     ${HDF5_SRC_DIR}/H5Gcache.c
@@ -303,9 +316,9 @@ set (H5G_HDRS
     ${HDF5_SRC_DIR}/H5Gpkg.h
     ${HDF5_SRC_DIR}/H5Gpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5G" "${H5G_HDRS}" "${H5G_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5G" "${H5G_HDRS}" "${H5G_SOURCES}" )
 
-set (H5HF_SRCS
+set (H5HF_SOURCES
     ${HDF5_SRC_DIR}/H5HF.c
     ${HDF5_SRC_DIR}/H5HFbtree2.c
     ${HDF5_SRC_DIR}/H5HFcache.c
@@ -315,7 +328,6 @@ 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
@@ -329,9 +341,9 @@ set (H5HF_HDRS
     ${HDF5_SRC_DIR}/H5HFpkg.h
     ${HDF5_SRC_DIR}/H5HFpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5HF" "${H5HF_HDRS}" "${H5HF_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5HF" "${H5HF_HDRS}" "${H5HF_SOURCES}" )
 
-set (H5HG_SRCS
+set (H5HG_SOURCES
     ${HDF5_SRC_DIR}/H5HG.c
     ${HDF5_SRC_DIR}/H5HGcache.c
     ${HDF5_SRC_DIR}/H5HGdbg.c
@@ -342,9 +354,9 @@ set (H5HG_HDRS
     ${HDF5_SRC_DIR}/H5HGpkg.h
     ${HDF5_SRC_DIR}/H5HGpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5HG" "${H5HG_HDRS}" "${H5HG_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5HG" "${H5HG_HDRS}" "${H5HG_SOURCES}" )
 
-set (H5HL_SRCS
+set (H5HL_SOURCES
     ${HDF5_SRC_DIR}/H5HL.c
     ${HDF5_SRC_DIR}/H5HLcache.c
     ${HDF5_SRC_DIR}/H5HLdbg.c
@@ -357,18 +369,18 @@ set (H5HL_HDRS
     ${HDF5_SRC_DIR}/H5HLpkg.h
     ${HDF5_SRC_DIR}/H5HLpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5HL" "${H5HL_HDRS}" "${H5HL_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5HL" "${H5HL_HDRS}" "${H5HL_SOURCES}" )
 
 
-set (H5HP_SRCS
+set (H5HP_SOURCES
     ${HDF5_SRC_DIR}/H5HP.c
 )
 set (H5HP_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5HP" "${H5HP_HDRS}" "${H5HP_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5HP" "${H5HP_HDRS}" "${H5HP_SOURCES}" )
 
 
-set (H5I_SRCS
+set (H5I_SOURCES
     ${HDF5_SRC_DIR}/H5I.c
     ${HDF5_SRC_DIR}/H5Itest.c
 )
@@ -376,10 +388,10 @@ set (H5I_HDRS
     ${HDF5_SRC_DIR}/H5Ipkg.h
     ${HDF5_SRC_DIR}/H5Ipublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5I" "${H5I_HDRS}" "${H5I_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5I" "${H5I_HDRS}" "${H5I_SOURCES}" )
 
 
-set (H5L_SRCS
+set (H5L_SOURCES
     ${HDF5_SRC_DIR}/H5L.c
     ${HDF5_SRC_DIR}/H5Lexternal.c
 )
@@ -387,10 +399,10 @@ set (H5L_HDRS
     ${HDF5_SRC_DIR}/H5Lpkg.h
     ${HDF5_SRC_DIR}/H5Lpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5L" "${H5L_HDRS}" "${H5L_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5L" "${H5L_HDRS}" "${H5L_SOURCES}" )
 
 
-set (H5MF_SRCS
+set (H5MF_SOURCES
     ${HDF5_SRC_DIR}/H5MF.c
     ${HDF5_SRC_DIR}/H5MFaggr.c
     ${HDF5_SRC_DIR}/H5MFdbg.c
@@ -399,19 +411,19 @@ set (H5MF_SRCS
 
 set (H5MF_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5MF" "${H5MF_HDRS}" "${H5MF_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5MF" "${H5MF_HDRS}" "${H5MF_SOURCES}" )
 
 
-set (H5MM_SRCS
+set (H5MM_SOURCES
     ${HDF5_SRC_DIR}/H5MM.c
 )
 set (H5MM_HDRS
     ${HDF5_SRC_DIR}/H5MMpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5MM" "${H5MM_HDRS}" "${H5MM_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5MM" "${H5MM_HDRS}" "${H5MM_SOURCES}" )
 
 
-set (H5MP_SRCS
+set (H5MP_SOURCES
     ${HDF5_SRC_DIR}/H5MP.c
     ${HDF5_SRC_DIR}/H5MPtest.c
 )
@@ -419,9 +431,9 @@ set (H5MP_SRCS
 set (H5MP_HDRS
     ${HDF5_SRC_DIR}/H5MPpkg.h
 )
-IDE_GENERATED_PROPERTIES ("H5MP" "${H5MP_HDRS}" "${H5MP_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5MP" "${H5MP_HDRS}" "${H5MP_SOURCES}" )
 
-set (H5O_SRCS
+set (H5O_SOURCES
     ${HDF5_SRC_DIR}/H5O.c
     ${HDF5_SRC_DIR}/H5Oainfo.c
     ${HDF5_SRC_DIR}/H5Oalloc.c
@@ -430,6 +442,7 @@ set (H5O_SRCS
     ${HDF5_SRC_DIR}/H5Obogus.c
     ${HDF5_SRC_DIR}/H5Obtreek.c
     ${HDF5_SRC_DIR}/H5Ocache.c
+    ${HDF5_SRC_DIR}/H5Ocache_image.c
     ${HDF5_SRC_DIR}/H5Ochunk.c
     ${HDF5_SRC_DIR}/H5Ocont.c
     ${HDF5_SRC_DIR}/H5Ocopy.c
@@ -449,7 +462,6 @@ 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
@@ -464,9 +476,9 @@ set (H5O_HDRS
     ${HDF5_SRC_DIR}/H5Opublic.h
     ${HDF5_SRC_DIR}/H5Oshared.h
 )
-IDE_GENERATED_PROPERTIES ("H5O" "${H5O_HDRS}" "${H5O_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5O" "${H5O_HDRS}" "${H5O_SOURCES}" )
 
-set (H5P_SRCS
+set (H5P_SOURCES
     ${HDF5_SRC_DIR}/H5P.c
     ${HDF5_SRC_DIR}/H5Pacpl.c
     ${HDF5_SRC_DIR}/H5Pdapl.c
@@ -491,20 +503,30 @@ set (H5P_HDRS
     ${HDF5_SRC_DIR}/H5Ppkg.h
     ${HDF5_SRC_DIR}/H5Ppublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5P" "${H5P_HDRS}" "${H5P_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5P" "${H5P_HDRS}" "${H5P_SOURCES}" )
 
-set (H5PL_SRCS
+set (H5PB_SOURCES
+    ${HDF5_SRC_DIR}/H5PB.c
+)
+
+set (H5PB_HDRS
+    ${HDF5_SRC_DIR}/H5PBpkg.h
+)
+IDE_GENERATED_PROPERTIES ("H5PB" "${H5PB_HDRS}" "${H5PB_SOURCES}" )
+
+set (H5PL_SOURCES
     ${HDF5_SRC_DIR}/H5PL.c
 )
 
 set (H5PL_HDRS
     ${HDF5_SRC_DIR}/H5PLextern.h
+    ${HDF5_SRC_DIR}/H5PLpkg.h
     ${HDF5_SRC_DIR}/H5PLpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5PL" "${H5PL_HDRS}" "${H5PL_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5PL" "${H5PL_HDRS}" "${H5PL_SOURCES}" )
 
 
-set (H5R_SRCS
+set (H5R_SOURCES
     ${HDF5_SRC_DIR}/H5R.c
     ${HDF5_SRC_DIR}/H5Rdeprec.c
 )
@@ -512,18 +534,18 @@ set (H5R_HDRS
     ${HDF5_SRC_DIR}/H5Rpkg.h
     ${HDF5_SRC_DIR}/H5Rpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5R" "${H5R_HDRS}" "${H5R_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5R" "${H5R_HDRS}" "${H5R_SOURCES}" )
 
 
-set (H5RS_SRCS
+set (H5RS_SOURCES
     ${HDF5_SRC_DIR}/H5RS.c
 )
 set (H5RS_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5RS" "${H5RS_HDRS}" "${H5RS_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5RS" "${H5RS_HDRS}" "${H5RS_SOURCES}" )
 
 
-set (H5S_SRCS
+set (H5S_SOURCES
     ${HDF5_SRC_DIR}/H5S.c
     ${HDF5_SRC_DIR}/H5Sall.c
     ${HDF5_SRC_DIR}/H5Sdbg.c
@@ -539,18 +561,18 @@ set (H5S_HDRS
     ${HDF5_SRC_DIR}/H5Spkg.h
     ${HDF5_SRC_DIR}/H5Spublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5S" "${H5S_HDRS}" "${H5S_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5S" "${H5S_HDRS}" "${H5S_SOURCES}" )
 
 
-set (H5SL_SRCS
+set (H5SL_SOURCES
     ${HDF5_SRC_DIR}/H5SL.c
 )
 set (H5SL_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5SL" "${H5SL_HDRS}" "${H5SL_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5SL" "${H5SL_HDRS}" "${H5SL_SOURCES}" )
 
 
-set (H5SM_SRCS
+set (H5SM_SOURCES
     ${HDF5_SRC_DIR}/H5SM.c
     ${HDF5_SRC_DIR}/H5SMbtree2.c
     ${HDF5_SRC_DIR}/H5SMcache.c
@@ -561,18 +583,18 @@ set (H5SM_SRCS
 set (H5SM_HDRS
     ${HDF5_SRC_DIR}/H5SMpkg.h
 )
-IDE_GENERATED_PROPERTIES ("H5SM" "${H5SM_HDRS}" "${H5SM_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5SM" "${H5SM_HDRS}" "${H5SM_SOURCES}" )
 
 
-set (H5ST_SRCS
+set (H5ST_SOURCES
     ${HDF5_SRC_DIR}/H5ST.c
 )
 set (H5ST_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5ST" "${H5ST_HDRS}" "${H5ST_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5ST" "${H5ST_HDRS}" "${H5ST_SOURCES}" )
 
 
-set (H5T_SRCS
+set (H5T_SOURCES
     ${HDF5_SRC_DIR}/H5T.c
     ${HDF5_SRC_DIR}/H5Tarray.c
     ${HDF5_SRC_DIR}/H5Tbit.c
@@ -602,42 +624,42 @@ set (H5T_HDRS
     ${HDF5_SRC_DIR}/H5Tpkg.h
     ${HDF5_SRC_DIR}/H5Tpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5T" "${H5T_HDRS}" "${H5T_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5T" "${H5T_HDRS}" "${H5T_SOURCES}" )
 
 
-set (H5TS_SRCS
+set (H5TS_SOURCES
     ${HDF5_SRC_DIR}/H5TS.c
 )
 set (H5TS_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5TS" "${H5TS_HDRS}" "${H5TS_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5TS" "${H5TS_HDRS}" "${H5TS_SOURCES}" )
 
 
-set (H5UC_SRCS
+set (H5UC_SOURCES
     ${HDF5_SRC_DIR}/H5UC.c
 )
 set (H5UC_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5UC" "${H5UC_HDRS}" "${H5UC_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5UC" "${H5UC_HDRS}" "${H5UC_SOURCES}" )
 
 
-set (H5VM_SRCS
+set (H5VM_SOURCES
     ${HDF5_SRC_DIR}/H5VM.c
 )
 set (H5VM_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5VM" "${H5VM_HDRS}" "${H5VM_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5VM" "${H5VM_HDRS}" "${H5VM_SOURCES}" )
 
 
-set (H5WB_SRCS
+set (H5WB_SOURCES
     ${HDF5_SRC_DIR}/H5WB.c
 )
 set (H5WB_HDRS
 )
-IDE_GENERATED_PROPERTIES ("H5WB" "${H5WB_HDRS}" "${H5WB_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5WB" "${H5WB_HDRS}" "${H5WB_SOURCES}" )
 
 
-set (H5Z_SRCS
+set (H5Z_SOURCES
     ${HDF5_SRC_DIR}/H5Z.c
     ${HDF5_SRC_DIR}/H5Zdeflate.c
     ${HDF5_SRC_DIR}/H5Zfletcher32.c
@@ -650,57 +672,58 @@ set (H5Z_SRCS
 if (H5_ZLIB_HEADER)
   SET_PROPERTY(SOURCE ${HDF5_SRC_DIR}/H5Zdeflate.c PROPERTY
       COMPILE_DEFINITIONS H5_ZLIB_HEADER="${H5_ZLIB_HEADER}")
-endif (H5_ZLIB_HEADER)
+endif ()
 
 
 set (H5Z_HDRS
     ${HDF5_SRC_DIR}/H5Zpkg.h
     ${HDF5_SRC_DIR}/H5Zpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5Z" "${H5Z_HDRS}" "${H5Z_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5Z" "${H5Z_HDRS}" "${H5Z_SOURCES}" )
 
 set (common_SRCS
-    ${H5_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}
-    ${H5UC_SRCS}
-    ${H5RS_SRCS}
-    ${H5S_SRCS}
-    ${H5SL_SRCS}
-    ${H5SM_SRCS}
-    ${H5ST_SRCS}
-    ${H5T_SRCS}
-    ${H5TS_SRCS}
-    ${H5VM_SRCS}
-    ${H5WB_SRCS}
-    ${H5Z_SRCS}
+    ${H5_SOURCES}
+    ${H5A_SOURCES}
+    ${H5AC_SOURCES}
+    ${H5B_SOURCES}
+    ${H5B2_SOURCES}
+    ${H5C_SOURCES}
+    ${H5CS_SOURCES}
+    ${H5D_SOURCES}
+    ${H5E_SOURCES}
+    ${H5EA_SOURCES}
+    ${H5F_SOURCES}
+    ${H5FA_SOURCES}
+    ${H5FD_SOURCES}
+    ${H5FL_SOURCES}
+    ${H5FO_SOURCES}
+    ${H5FS_SOURCES}
+    ${H5G_SOURCES}
+    ${H5HF_SOURCES}
+    ${H5HG_SOURCES}
+    ${H5HL_SOURCES}
+    ${H5HP_SOURCES}
+    ${H5I_SOURCES}
+    ${H5L_SOURCES}
+    ${H5MF_SOURCES}
+    ${H5MM_SOURCES}
+    ${H5MP_SOURCES}
+    ${H5O_SOURCES}
+    ${H5P_SOURCES}
+    ${H5PB_SOURCES}
+    ${H5PL_SOURCES}
+    ${H5R_SOURCES}
+    ${H5UC_SOURCES}
+    ${H5RS_SOURCES}
+    ${H5S_SOURCES}
+    ${H5SL_SOURCES}
+    ${H5SM_SOURCES}
+    ${H5ST_SOURCES}
+    ${H5T_SOURCES}
+    ${H5TS_SOURCES}
+    ${H5VM_SOURCES}
+    ${H5WB_SOURCES}
+    ${H5Z_SOURCES}
 )
 
 set (H5_PUBLIC_HEADERS
@@ -728,6 +751,7 @@ set (H5_PUBLIC_HEADERS
     ${H5MP_HDRS}
     ${H5O_HDRS}
     ${H5P_HDRS}
+    ${H5PB_HDRS}
     ${H5PL_HDRS}
     ${H5R_HDRS}
     ${H5S_HDRS}
@@ -766,6 +790,7 @@ set (H5_PRIVATE_HEADERS
     ${HDF5_SRC_DIR}/H5MPprivate.h
     ${HDF5_SRC_DIR}/H5Oprivate.h
     ${HDF5_SRC_DIR}/H5Pprivate.h
+    ${HDF5_SRC_DIR}/H5PBprivate.h
     ${HDF5_SRC_DIR}/H5PLprivate.h
     ${HDF5_SRC_DIR}/H5UCprivate.h
     ${HDF5_SRC_DIR}/H5Rprivate.h
@@ -808,10 +833,10 @@ if (HDF5_GENERATE_HEADERS)
         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)
+  else ()
     message (STATUS "Cannot generate headers - perl not found")
-  endif (PERL_FOUND)
-endif (HDF5_GENERATE_HEADERS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # Setup the H5Detect utility which generates H5Tinit with platform
@@ -821,7 +846,7 @@ add_executable (H5detect ${HDF5_SRC_DIR}/H5detect.c)
 TARGET_C_PROPERTIES (H5detect STATIC " " " ")
 if (MSVC OR MINGW)
   target_link_libraries (H5detect "ws2_32.lib")
-endif (MSVC OR MINGW)
+endif ()
 
 set (CMD $<TARGET_FILE:H5detect>)
 add_custom_command (
@@ -835,7 +860,7 @@ add_executable (H5make_libsettings ${HDF5_SRC_DIR}/H5make_libsettings.c)
 TARGET_C_PROPERTIES (H5make_libsettings STATIC " " " ")
 if (MSVC OR MINGW)
   target_link_libraries (H5make_libsettings "ws2_32.lib")
-endif (MSVC OR MINGW)
+endif ()
 
 set (CMD $<TARGET_FILE:H5make_libsettings>)
 add_custom_command (
@@ -856,10 +881,10 @@ TARGET_C_PROPERTIES (${HDF5_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_LIB_TARGET} ${LINK_LIBS})
 if (NOT WIN32)
   target_link_libraries (${HDF5_LIB_TARGET} dl)
-endif (NOT WIN32)
+endif ()
 if (H5_HAVE_PARALLEL AND MPI_C_FOUND)
   target_link_libraries (${HDF5_LIB_TARGET} ${MPI_C_LIBRARIES})
-endif (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+endif ()
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT ${HDF5_LIB_TARGET})
 H5_SET_LIB_OPTIONS (${HDF5_LIB_TARGET} ${HDF5_LIB_NAME} STATIC)
 set_target_properties (${HDF5_LIB_TARGET} PROPERTIES
@@ -873,7 +898,7 @@ if (HDF5_ENABLE_DEBUG_APIS)
       COMPILE_DEFINITIONS
           "H5Z_DEBUG;H5T_DEBUG;H5ST_DEBUG;H5S_DEBUG;H5O_DEBUG;H5I_DEBUG;H5HL_DEBUG;H5F_DEBUG;H5D_DEBUG;H5B2_DEBUG;H5AC_DEBUG"
   )
-endif (HDF5_ENABLE_DEBUG_APIS)
+endif ()
 set (install_targets ${HDF5_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
@@ -900,10 +925,10 @@ if (BUILD_SHARED_LIBS)
   target_link_libraries (${HDF5_LIBSH_TARGET} ${LINK_SHARED_LIBS})
   if (NOT WIN32)
     target_link_libraries (${HDF5_LIBSH_TARGET} dl)
-  endif (NOT WIN32)
+  endif ()
   if (H5_HAVE_PARALLEL AND MPI_C_FOUND)
     target_link_libraries (${HDF5_LIBSH_TARGET} ${MPI_C_LIBRARIES})
-  endif (H5_HAVE_PARALLEL AND MPI_C_FOUND)
+  endif ()
   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})
   set_target_properties (${HDF5_LIBSH_TARGET} PROPERTIES
@@ -918,16 +943,16 @@ if (BUILD_SHARED_LIBS)
             "H5_HAVE_THREADSAFE"
     )
     target_link_libraries (${HDF5_LIBSH_TARGET} Threads::Threads)
-  endif (HDF5_ENABLE_THREADSAFE)
+  endif ()
 
   if (HDF5_ENABLE_DEBUG_APIS)
     set_property (TARGET ${HDF5_LIBSH_TARGET}
         APPEND PROPERTY COMPILE_DEFINITIONS
             "H5Z_DEBUG;H5T_DEBUG;H5ST_DEBUG;H5S_DEBUG;H5O_DEBUG;H5I_DEBUG;H5HL_DEBUG;H5F_DEBUG;H5D_DEBUG;H5B2_DEBUG;H5AC_DEBUG"
     )
-  endif (HDF5_ENABLE_DEBUG_APIS)
+  endif ()
   set (install_targets ${install_targets} ${HDF5_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add file(s) to CMake Install
@@ -942,7 +967,7 @@ if (NOT HDF5_INSTALL_NO_DEVELOPMENT)
       COMPONENT
           headers
   )
-endif (NOT HDF5_INSTALL_NO_DEVELOPMENT)
+endif ()
 
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
@@ -950,7 +975,8 @@ endif (NOT HDF5_INSTALL_NO_DEVELOPMENT)
 if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS)
     INSTALL_TARGET_PDB (${HDF5_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} libraries)
-  endif (BUILD_SHARED_LIBS)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} libraries)
 
   install (
       TARGETS
@@ -961,5 +987,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT libraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT libraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT libraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/src/COPYING b/src/COPYING
index 6903daf..6497ace 100644
--- a/src/COPYING
+++ b/src/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/src/H5.c b/src/H5.c
index 41fb3ba..1068fc6 100644
--- a/src/H5.c
+++ b/src/H5.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -944,7 +942,7 @@ H5allocate_memory(size_t size, hbool_t clear)
 {
     void *ret_value = NULL;
 
-    FUNC_ENTER_API_NOINIT;
+    FUNC_ENTER_API_NOINIT
     H5TRACE2("*x", "zb", size, clear);
 
     if(clear)
@@ -985,7 +983,7 @@ H5resize_memory(void *mem, size_t size)
 {
     void *ret_value = NULL;
 
-    FUNC_ENTER_API_NOINIT;
+    FUNC_ENTER_API_NOINIT
     H5TRACE2("*x", "*xz", mem, size);
 
     ret_value = H5MM_realloc(mem, size);
@@ -1009,7 +1007,7 @@ H5resize_memory(void *mem, size_t size)
 herr_t
 H5free_memory(void *mem)
 {
-    FUNC_ENTER_API_NOINIT;
+    FUNC_ENTER_API_NOINIT
     H5TRACE1("e", "*x", mem);
 
     /* At this time, it is impossible for this to fail. */
diff --git a/src/H5A.c b/src/H5A.c
index e5a7ae5..cf48232 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5AC.c b/src/H5AC.c
index 456be4a..4223158 100644
--- a/src/H5AC.c
+++ b/src/H5AC.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -32,8 +30,7 @@
 /****************/
 
 #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	        */
+#define H5F_FRIEND		/* Suppress error about including H5Fpkg            */
 
 
 /***********/
@@ -41,7 +38,7 @@
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5ACpkg.h"		/* Metadata cache			*/
-#include "H5Cpkg.h"		        /* Cache                                */
+#include "H5Cprivate.h"		/* Cache                                */
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"		/* Files				*/
 #include "H5FDprivate.h"	/* File drivers				*/
@@ -103,41 +100,48 @@ hid_t H5AC_rawdata_dxpl_id = (-1);
 hbool_t H5_coll_api_sanity_check_g = false;
 #endif /* H5_HAVE_PARALLEL */
 
+
 /*******************/
 /* Local Variables */
 /*******************/
 
-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 */
+/* Metadata entry class list */
+
+/* Remember to add new type ID to the H5AC_type_t enum in H5ACprivate.h when
+ *      adding a new class.
+ */
+
+static const H5AC_class_t *const H5AC_class_s[] = {
+    H5AC_BT,                    /* ( 0) B-tree nodes                    */
+    H5AC_SNODE,                 /* ( 1) symbol table nodes              */
+    H5AC_LHEAP_PRFX,            /* ( 2) local heap prefix               */
+    H5AC_LHEAP_DBLK,            /* ( 3) local heap data block           */
+    H5AC_GHEAP,                 /* ( 4) global heap                     */
+    H5AC_OHDR,                  /* ( 5) object header                   */
+    H5AC_OHDR_CHK,              /* ( 6) object header chunk             */
+    H5AC_BT2_HDR,               /* ( 7) v2 B-tree header                */
+    H5AC_BT2_INT,               /* ( 8) v2 B-tree internal node         */
+    H5AC_BT2_LEAF,              /* ( 9) v2 B-tree leaf node             */
+    H5AC_FHEAP_HDR,             /* (10) fractal heap header             */
+    H5AC_FHEAP_DBLOCK,          /* (11) fractal heap direct block       */
+    H5AC_FHEAP_IBLOCK,          /* (12) fractal heap indirect block     */
+    H5AC_FSPACE_HDR,            /* (13) free space header               */
+    H5AC_FSPACE_SINFO,          /* (14) free space sections             */
+    H5AC_SOHM_TABLE,            /* (15) shared object header message master table */
+    H5AC_SOHM_LIST,             /* (16) shared message index stored as a list */
+    H5AC_EARRAY_HDR,            /* (17) extensible array header         */
+    H5AC_EARRAY_IBLOCK,         /* (18) extensible array index block    */
+    H5AC_EARRAY_SBLOCK,         /* (19) extensible array super block    */
+    H5AC_EARRAY_DBLOCK,         /* (20) extensible array data block     */
+    H5AC_EARRAY_DBLK_PAGE,      /* (21) extensible array data block page */
+    H5AC_FARRAY_HDR,            /* (22) fixed array header              */
+    H5AC_FARRAY_DBLOCK,         /* (23) fixed array data block          */
+    H5AC_FARRAY_DBLK_PAGE,      /* (24) fixed array data block page     */
+    H5AC_SUPERBLOCK,            /* (25) file superblock                 */
+    H5AC_DRVRINFO,              /* (26) driver info block (supplements superblock) */
+    H5AC_EPOCH_MARKER,          /* (27) epoch marker - always internal to cache */
+    H5AC_PROXY_ENTRY,           /* (28) cache entry proxy               */
+    H5AC_PREFETCHED_ENTRY  	/* (29) prefetched entry - always internal to cache */
 };
 
 
@@ -183,13 +187,15 @@ done:
 herr_t
 H5AC__init_package(void)
 {
+#if defined H5_DEBUG_BUILD | defined H5_HAVE_PARALLEL
     H5P_genplist_t  *xfer_plist;    /* Dataset transfer property list object */
-#ifdef H5_HAVE_PARALLEL
-    H5P_coll_md_read_flag_t coll_meta_read;
-#endif /* H5_HAVE_PARALLEL */
+#endif /* defined H5_DEBUG_BUILD | defined H5_HAVE_PARALLEL */
 #ifdef H5_DEBUG_BUILD
     H5FD_dxpl_type_t  dxpl_type;    /* Property indicating the type of the internal dxpl */
 #endif /* H5_DEBUG_BUILD */
+#ifdef H5_HAVE_PARALLEL
+    H5P_coll_md_read_flag_t coll_meta_read;
+#endif /* H5_HAVE_PARALLEL */
     herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -201,9 +207,8 @@ H5AC__init_package(void)
         const char *s;  /* String for environment variables */
 
         s = HDgetenv("H5_COLL_API_SANITY_CHECK");
-        if(s && HDisdigit(*s)) {
+        if(s && HDisdigit(*s))
             H5_coll_api_sanity_check_g = (hbool_t)HDstrtol(s, NULL, 0);
-        }
     }
 #endif /* H5_HAVE_PARALLEL */
 
@@ -278,7 +283,9 @@ H5AC__init_package(void)
     H5AC_rawdata_dxpl_id = H5P_DATASET_XFER_DEFAULT;
 #endif /* defined(H5_HAVE_PARALLEL) || defined(H5_DEBUG_BUILD) */
 
+#if defined(H5_DEBUG_BUILD) | defined(H5_HAVE_PARALLEL)
 done:
+#endif /* defined(H5_DEBUG_BUILD) | defined(H5_HAVE_PARALLEL) */
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5AC__init_package() */
 
@@ -344,6 +351,44 @@ H5AC_term_package(void)
 
 

 /*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_cache_image_pending()
+ *
+ * Purpose:     Debugging function that tests to see if the load of a 
+ *              metadata cache image load is pending (i.e. will be executed
+ *              on the next protect or insert)
+ *              
+ *              Returns TRUE if a cache image load is pending, and FALSE
+ *              if not.  Throws an assertion failure on error.
+ *
+ * Return:      TRUE if a cache image load is pending, and FALSE otherwise.
+ *
+ * Programmer:  John Mainzer, 1/10/17
+ *
+ * Changes:     None.
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5AC_cache_image_pending(const H5F_t *f)
+{
+    H5C_t *cache_ptr;
+    hbool_t ret_value = FALSE;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    ret_value = H5C_cache_image_pending(cache_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_cache_image_pending() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_create
  *
  * Purpose:     Initialize the cache just after a file is opened.  The
@@ -362,12 +407,13 @@ H5AC_term_package(void)
  *-------------------------------------------------------------------------
  */
 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, H5AC_cache_image_config_t * image_config_ptr)
 {
 #ifdef H5_HAVE_PARALLEL
     char 	 prefix[H5C__PREFIX_LEN] = "";
     H5AC_aux_t * aux_ptr = NULL;
 #endif /* H5_HAVE_PARALLEL */
+    struct H5C_cache_image_ctl_t int_ci_config = H5C__DEFAULT_CACHE_IMAGE_CTL;
     herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -376,11 +422,16 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
     HDassert(f);
     HDassert(NULL == f->shared->cache);
     HDassert(config_ptr != NULL) ;
-    HDcompile_assert(NELMTS(H5AC_entry_type_names) == H5AC_NTYPES);
+    HDassert(image_config_ptr != NULL) ;
+    HDassert(image_config_ptr->version == H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION);
+    HDcompile_assert(NELMTS(H5AC_class_s) == H5AC_NTYPES);
     HDcompile_assert(H5C__MAX_NUM_TYPE_IDS == H5AC_NTYPES);
 
+    /* Validate configurations */
     if(H5AC_validate_config(config_ptr) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache configuration")
+    if(H5AC_validate_cache_image_config(image_config_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache image configuration")
 
 #ifdef H5_HAVE_PARALLEL
     if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
@@ -398,7 +449,7 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
             HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi size")
 
         if(NULL == (aux_ptr = H5FL_CALLOC(H5AC_aux_t)))
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate H5AC auxilary structure.")
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate H5AC auxilary structure")
 
         aux_ptr->magic = H5AC__H5AC_AUX_T_MAGIC;
         aux_ptr->mpi_comm = mpi_comm;
@@ -422,15 +473,16 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
         aux_ptr->candidate_slist_ptr = NULL;
         aux_ptr->write_done = NULL;
         aux_ptr->sync_point_done = NULL;
+        aux_ptr->p0_image_len = 0;
 
         sprintf(prefix, "%d:", mpi_rank);
 
         if(mpi_rank == 0) {
             if(NULL == (aux_ptr->d_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create dirtied entry list.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create dirtied entry list")
 
             if(NULL == (aux_ptr->c_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create cleaned entry list.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create cleaned entry list")
         } /* end if */
 
         /* construct the candidate slist for all processes.
@@ -438,25 +490,25 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
          * will use it in the case of a flush.
          */
         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.")
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create candidate entry list")
 
         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_class_s,
                         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_class_s,
                         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_class_s,
                     H5AC__check_if_write_permitted, TRUE, NULL, NULL);
     } /* end if */
     else {
@@ -467,7 +519,7 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
          */
         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_class_s,
                 H5AC__check_if_write_permitted, TRUE, NULL, NULL);
 #ifdef H5_HAVE_PARALLEL
     } /* end else */
@@ -483,9 +535,9 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
 #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")
+    if(H5F_USE_MDC_LOGGING(f)) {
+        if(H5C_set_up_logging(f->shared->cache, H5F_MDC_LOG_LOCATION(f), H5F_START_MDC_LOG_ON_ACCESS(f)) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINIT, 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)
@@ -494,7 +546,20 @@ H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
 
     /* Set the cache parameters */
     if(H5AC_set_cache_auto_resize_config(f->shared->cache, config_ptr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "auto resize configuration failed")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "auto resize configuration failed")
+
+    /* Don't need to get the current H5C image config here since the
+     * cache has just been created, and thus f->shared->cache->image_ctl 
+     * must still set to its initial value (H5C__DEFAULT_CACHE_IMAGE_CTL).  
+     * Note that this not true as soon as control returns to the application
+     * program, as some test code modifies f->shared->cache->image_ctl.
+     */
+    int_ci_config.version            = image_config_ptr->version;
+    int_ci_config.generate_image     = image_config_ptr->generate_image;
+    int_ci_config.save_resize_status = image_config_ptr->save_resize_status;
+    int_ci_config.entry_ageout       = image_config_ptr->entry_ageout;
+    if(H5C_set_cache_image_config(f, f->shared->cache, &int_ci_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "auto resize configuration failed")
 
 done:
 #ifdef H5_HAVE_PARALLEL
@@ -544,6 +609,7 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
 
     /* Sanity check */
     HDassert(f);
+    HDassert(f->shared);
     HDassert(f->shared->cache);
 
 #if H5AC_DUMP_STATS_ON_CLOSE
@@ -551,7 +617,12 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
     H5AC_stats(f);
 #endif /* H5AC_DUMP_STATS_ON_CLOSE */
 
-    if(f->shared->use_mdc_logging) {
+#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(H5F_USE_MDC_LOGGING(f)) {
         /* 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")
@@ -561,17 +632,25 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
 
 #ifdef H5_HAVE_PARALLEL
     /* destroying the cache, so clear all collective entries */
-    if(H5C_clear_coll_entries(f->shared->cache, 0) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_clear_coll_entries() failed.")
+    if(H5C_clear_coll_entries(f->shared->cache, FALSE) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_clear_coll_entries() failed")
 
     aux_ptr = (H5AC_aux_t *)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, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+    /* If the file was opened R/W, attempt to flush all entries 
+     * from rank 0 & Bcast clean list to other ranks.
+     *
+     * Must not flush in the R/O case, as this will trigger the 
+     * free space manager settle routines.
+     */
+    if ( ( H5F_ACC_RDWR & H5F_INTENT(f) ) && 
+         ( H5AC__flush_entries(f, dxpl_id) < 0 ) )
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush")
+
 #endif /* H5_HAVE_PARALLEL */
 
     /* Destroy the cache */
@@ -581,12 +660,18 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
 
 #ifdef H5_HAVE_PARALLEL
     if(aux_ptr != NULL) {
-        if(aux_ptr->d_slist_ptr != NULL)
+        if(aux_ptr->d_slist_ptr != NULL) {
+            HDassert(H5SL_count(aux_ptr->d_slist_ptr) == 0);
             H5SL_close(aux_ptr->d_slist_ptr);
-        if(aux_ptr->c_slist_ptr != NULL)
+        } /* end if */
+        if(aux_ptr->c_slist_ptr != NULL) {
+            HDassert(H5SL_count(aux_ptr->c_slist_ptr) == 0);
             H5SL_close(aux_ptr->c_slist_ptr);
-        if(aux_ptr->candidate_slist_ptr != NULL)
+        } /* end if */
+        if(aux_ptr->candidate_slist_ptr != NULL) {
+            HDassert(H5SL_count(aux_ptr->candidate_slist_ptr) == 0);
             H5SL_close(aux_ptr->candidate_slist_ptr);
+        } /* end if */
         aux_ptr->magic = 0;
         aux_ptr = H5FL_FREE(H5AC_aux_t, aux_ptr);
     } /* end if */
@@ -605,7 +690,8 @@ done:
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Vailin Choi; Dec 2013
+ * Programmer:  Vailin Choi
+ *		Dec 2013
  *
  *-------------------------------------------------------------------------
  */
@@ -636,7 +722,7 @@ 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_evict() */
@@ -696,7 +782,7 @@ H5AC_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
     if(H5C_expunge_entry(f, dxpl_id, type, addr, flags) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "H5C_expunge_entry() failed.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "H5C_expunge_entry() failed")
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
@@ -707,7 +793,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_expunge_entry() */
@@ -765,18 +851,18 @@ H5AC_flush(H5F_t *f, hid_t dxpl_id)
 
 #ifdef H5_HAVE_PARALLEL
     /* flushing the cache, so clear all collective entries */
-    if(H5C_clear_coll_entries(f->shared->cache, 0) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_clear_coll_entries() failed.")
+    if(H5C_clear_coll_entries(f->shared->cache, FALSE) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_clear_coll_entries() failed")
 
     /* Attempt to flush all entries from rank 0 & Bcast clean list to other ranks */
     if(H5AC__flush_entries(f, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush")
 #endif /* H5_HAVE_PARALLEL */
 
     /* Flush the cache */
     /* (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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush cache")
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
@@ -787,13 +873,53 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_flush() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5AC_force_cache_image_load()
+ *
+ * Purpose:     On rare occasions, it is necessary to run 
+ *              H5MF_tidy_self_referential_fsm_hack() prior to the first
+ *              metadata cache access.  This is a problem as if there is a 
+ *              cache image at the end of the file, that routine will 
+ *              discard it.
+ *
+ *              We solve this issue by calling this function, which will
+ *              load the cache image and then call 
+ *              H5MF_tidy_self_referential_fsm_hack() to discard it.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              1/11/17
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_force_cache_image_load(H5F_t *f, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    if(H5C_force_cache_image_load(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, FAIL, "Can't load cache image")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_force_cache_image_load() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_get_entry_status
  *
  * Purpose:     Given a file address, determine whether the metadata
@@ -824,16 +950,17 @@ H5AC_get_entry_status(const H5F_t *f, haddr_t addr, unsigned *status)
     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 */
+    hbool_t	image_is_up_to_date;    /* Entry @ addr is in the cache and has an up to date image */
     herr_t      ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     if((f == NULL) || (!H5F_addr_defined(addr)) || (status == NULL))
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry")
 
     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.")
+            &is_protected, &is_pinned, &is_corked, &is_flush_dep_parent, &is_flush_dep_child, &image_is_up_to_date) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_entry_status() failed")
 
     if(in_cache) {
 	*status |= H5AC_ES__IN_CACHE;
@@ -849,6 +976,8 @@ H5AC_get_entry_status(const H5F_t *f, haddr_t addr, unsigned *status)
 	    *status |= H5AC_ES__IS_FLUSH_DEP_PARENT;
 	if(is_flush_dep_child)
 	    *status |= H5AC_ES__IS_FLUSH_DEP_CHILD;
+	if(image_is_up_to_date)
+	    *status |= H5AC_ES__IMAGE_IS_UP_TO_DATE;
     } /* end if */
     else
         *status = 0;
@@ -919,7 +1048,7 @@ H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t add
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
 #if H5AC_DO_TAGGING_SANITY_CHECKS
-    if (!f->shared->cache->ignore_tags && (H5AC__verify_tag(dxpl_id, type) < 0))
+    if(!H5C_get_ignore_tags(f->shared->cache) && H5AC__verify_tag(dxpl_id, type) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "Bad tag value")
 #endif /* H5AC_DO_TAGGING_SANITY_CHECKS */
 
@@ -945,7 +1074,7 @@ H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t add
         /* Check if we should try to flush */
         if(aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)
             if(H5AC__run_sync_point(f, dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point")
     } /* end if */
 }
 #endif /* H5_HAVE_PARALLEL */
@@ -958,13 +1087,48 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_insert_entry() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5AC_load_cache_image_on_next_protect
+ *
+ * Purpose:     Load the cache image block at the specified location,
+ *              decode it, and insert its contents into the metadata
+ *              cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_load_cache_image_on_next_protect(H5F_t * f, haddr_t addr, hsize_t len,
+    hbool_t rw)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    if(H5C_load_cache_image_on_next_protect(f, addr, len, rw) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, FAIL, "call to H5C_load_cache_image_on_next_protect failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_load_cache_image_on_next_protect() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_mark_entry_dirty
  *
  * Purpose:	Mark a pinned or protected entry as dirty.  The target
@@ -995,19 +1159,19 @@ H5AC_mark_entry_dirty(void *thing)
     /* Sanity check */
     HDassert(thing);
 
+    /* Set up entry & cache pointers */
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
 #if H5AC__TRACE_FILE_ENABLED
     /* For the mark pinned or protected entry dirty call, only the addr
      * is really necessary in the trace file.  Write the result to catch
      * occult errors.
      */
     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));
+        sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(entry_ptr->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")
@@ -1036,150 +1200,140 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_mark_entry_dirty() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_move_entry
+ * Function:    H5AC_mark_entry_clean
  *
- * Purpose:     Use this function to notify the cache that an object's
- *              file address changed.
+ * Purpose:	Mark a pinned entry as dirty.  The target
+ * 		entry MUST be pinned.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Robb Matzke
- *              matzke at llnl.gov
- *              Jul  9 1997
+ * Programmer:  Quincey Koziol
+ *              7/23/16
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, 
-                haddr_t new_addr, hid_t dxpl_id)
+H5AC_mark_entry_clean(void *thing)
 {
 #if H5AC__TRACE_FILE_ENABLED
     char          	trace[128] = "";
     FILE *        	trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-#ifdef H5_HAVE_PARALLEL
-    H5AC_aux_t        *aux_ptr;
-#endif /* H5_HAVE_PARALLEL */
-    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 */
+    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 checks */
-    HDassert(f);
-    HDassert(f->shared->cache);
-    HDassert(type);
-    HDassert(H5F_addr_defined(old_addr));
-    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")
+    /* Sanity check */
+    HDassert(thing);
 
 #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.
+    /* For the mark pinned or protected entry clean call, only the addr
+     * is really necessary in the trace file.  Write the result to catch
+     * occult errors.
      */
-    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));
+    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 */
 
-#ifdef H5_HAVE_PARALLEL
-    /* Log moving the entry */
-    if(NULL != (aux_ptr = (H5AC_aux_t *)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")
-#endif /* H5_HAVE_PARALLEL */
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
 
-    if(H5C_move_entry(f->shared->cache, type, old_addr, new_addr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "H5C_move_entry() failed.")
+    /* 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
-    /* 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, dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+{
+    H5AC_aux_t *aux_ptr;
+
+    aux_ptr = (H5AC_aux_t *)H5C_get_aux_ptr(cache_ptr);
+    if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) &&
+             (entry_ptr->is_pinned) && (NULL != aux_ptr))
+        if(H5AC__log_cleaned_entry(entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKCLEAN, FAIL, "can't log cleaned entry")
+}
 #endif /* H5_HAVE_PARALLEL */
 
+    if(H5C_mark_entry_clean(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKCLEAN, FAIL, "can't mark pinned or protected entry clean")
+
 done:
 #if H5AC__TRACE_FILE_ENABLED
-    if(trace_file_ptr != NULL)
+    if(trace_file_ptr)
 	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")
+        if(H5AC__write_mark_clean_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_move_entry() */
+} /* H5AC_mark_entry_clean() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_pin_protected_entry()
+ * Function:    H5AC_mark_entry_unserialized
  *
- * Purpose:	Pin a protected cache entry.  The entry must be protected
- *              at the time of call, and must be unpinned.
+ * Purpose:	Mark a pinned or protected entry as unserialized.  The target
+ * 		entry MUST be either pinned, protected, or both.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              4/27/06
+ * Programmer:  Quincey Koziol
+ *              12/22/16
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_pin_protected_entry(void *thing)
+H5AC_mark_entry_unserialized(void *thing)
 {
 #if H5AC__TRACE_FILE_ENABLED
-    char        trace[128] = "";
-    FILE *      trace_file_ptr = NULL;
+    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 */
+    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(thing);
 
+    /* Set up entry & cache pointers */
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
 #if H5AC__TRACE_FILE_ENABLED
-    /* For the pin protected entry call, only the addr is really necessary
-     * in the trace file.  Also write the result to catch occult errors.
+    /* For the mark entry unserialized call, only the addr
+     * is really necessary in the trace file.  Write the result to catch
+     * occult errors.
      */
     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));
+        sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(entry_ptr->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")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, 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")
+    if(H5C_mark_entry_unserialized(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKUNSERIALIZED, FAIL, "can't mark entry unserialized")
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
@@ -1189,65 +1343,323 @@ done:
 
     /* 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")
+        if(H5AC__write_mark_unserialized_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_pin_protected_entry() */
+} /* H5AC_mark_entry_unserialized() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_create_flush_dependency()
+ * Function:    H5AC_mark_entry_serialized
  *
- * Purpose:	Create a flush dependency between two entries in the metadata
- *              cache.
+ * Purpose:	Mark a pinned entry as serialized.  The target
+ * 		entry MUST be pinned.
  *
  * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
- *              3/24/09
+ *              12/22/16
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_create_flush_dependency(void * parent_thing, void * child_thing)
+H5AC_mark_entry_serialized(void *thing)
 {
 #if H5AC__TRACE_FILE_ENABLED
-    char        trace[128] = "";
-    FILE *      trace_file_ptr = NULL;
+    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 */
+    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);
+    HDassert(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));
+    /* For the mark entry serializedn call, only the addr
+     * is really necessary in the trace file.  Write the result to catch
+     * occult errors.
+     */
+    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 *)parent_thing;
+    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")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "unable to get logging status")
+
+    if(H5C_mark_entry_serialized(thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKSERIALIZED, FAIL, "can't mark entry serialized")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	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_serialized_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_mark_entry_serialized() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_move_entry
+ *
+ * Purpose:     Use this function to notify the cache that an object's
+ *              file address changed.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul  9 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, 
+                haddr_t new_addr, hid_t 
+#ifndef H5_HAVE_PARALLEL
+H5_ATTR_UNUSED
+#endif /* H5_HAVE_PARALLEL */
+                dxpl_id)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char          	trace[128] = "";
+    FILE *        	trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t        *aux_ptr;
+#endif /* H5_HAVE_PARALLEL */
+    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);
+    HDassert(H5F_addr_defined(old_addr));
+    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(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 *)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")
+#endif /* H5_HAVE_PARALLEL */
+
+    if(H5C_move_entry(f->shared->cache, type, old_addr, new_addr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "H5C_move_entry() failed")
+
+#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, dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point")
+#endif /* H5_HAVE_PARALLEL */
+
+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_move_entry_log_msg(f->shared->cache, old_addr, new_addr, type->id, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_move_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_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/27/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_pin_protected_entry(void *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(thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* 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(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);
+
+    /* 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")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	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_LOGFAIL, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_pin_protected_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_prep_for_file_close
+ *
+ * Purpose:     This function should be called just prior to the cache
+ *              flushes at file close.
+ *
+ *              The objective of the call is to allow the metadata cache
+ *              to do any preparatory work prior to generation of a
+ *              cache image.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/3/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_prep_for_file_close(H5F_t *f, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    if(H5C_prep_for_file_close(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "cache prep for file close failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_prep_for_file_close() */
+
+

+/*-------------------------------------------------------------------------
+ * 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);
+
+    /* 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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "H5C_create_flush_dependency() failed")
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
@@ -1258,7 +1670,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_create_flush_dependency() */
@@ -1297,10 +1709,10 @@ H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
     size_t		trace_entry_size = 0;
     FILE *              trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-    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 */
+    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)
 
@@ -1329,7 +1741,7 @@ H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
 #endif /* H5_HAVE_PARALLEL */
 
     /* Check for invalid access request */
-    if((0 == (H5F_INTENT(f) & H5F_ACC_RDWR)) &&  (0 == (flags & H5C__READ_ONLY_FLAG)))
+    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
@@ -1343,12 +1755,12 @@ H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
 #if H5AC_DO_TAGGING_SANITY_CHECKS
-    if (!f->shared->cache->ignore_tags && (H5AC__verify_tag(dxpl_id, type) < 0))
+    if(!H5C_get_ignore_tags(f->shared->cache) && 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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_protect() failed")
 
 #if H5AC__TRACE_FILE_ENABLED
     if(trace_file_ptr != NULL)
@@ -1370,7 +1782,7 @@ done:
         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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, NULL, "unable to emit log message")
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1420,9 +1832,7 @@ H5AC_resize_entry(void *thing, size_t new_size)
 
     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)
@@ -1452,7 +1862,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_resize_entry() */
@@ -1500,9 +1910,7 @@ H5AC_unpin_entry(void *thing)
 
     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)
@@ -1521,7 +1929,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_unpin_entry() */
@@ -1567,9 +1975,7 @@ H5AC_destroy_flush_dependency(void * parent_thing, void * child_thing)
 
     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)
@@ -1577,7 +1983,7 @@ H5AC_destroy_flush_dependency(void * parent_thing, void * child_thing)
 
     /* 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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "H5C_destroy_flush_dependency() failed")
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
@@ -1588,7 +1994,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_destroy_flush_dependency() */
@@ -1684,11 +2090,9 @@ H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
      *  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->image_len)(thing, &curr_size, &curr_compressed, &curr_compressed_size) < 0)
+        if((type->image_len)(thing, &curr_size) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
 
         if(((H5AC_info_t *)thing)->size != curr_size)
@@ -1703,18 +2107,18 @@ H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
 
         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.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5AC__log_deleted_entry() failed")
     } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
     if(H5C_unprotect(f, dxpl_id, addr, thing, flags) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5C_unprotect() failed.")
+        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, dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point")
 #endif /* H5_HAVE_PARALLEL */
 
 done:
@@ -1726,75 +2130,11 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_unprotect() */
 
-#ifndef NDEBUG  /* debugging functions */
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_stats
- *
- * Purpose:     Prints statistics about the cache.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  Robb Matzke
- *              Thursday, October 30, 1997
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5AC_stats(const H5F_t *f)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /* Sanity checks */
-    HDassert(f);
-    HDassert(f->shared);
-    HDassert(f->shared->cache);
-
-    /* at present, this can't fail */
-    (void)H5C_stats(f->shared->cache, H5F_OPEN_NAME(f), FALSE);
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5AC_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_dump_cache
- *
- * Purpose:     Dumps a summary of the contents of the metadata cache
- *              to stdout.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              Sunday, October 10, 2010
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5AC_dump_cache(const H5F_t *f)
-{
-    herr_t              ret_value = SUCCEED;   /* Return value */
-
-    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)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_dump_cache() failed.")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_dump_cache() */
-#endif /* NDEBUG */
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5AC_get_cache_auto_resize_config
@@ -1821,22 +2161,22 @@ H5AC_get_cache_auto_resize_config(const H5AC_t *cache_ptr,
     /* 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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or config_ptr on entry")
 #ifdef H5_HAVE_PARALLEL
 {
     H5AC_aux_t *aux_ptr;
 
     aux_ptr = (H5AC_aux_t *)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.")
+        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.")
+        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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_resize_enabled() failed")
 
     /* Set the information to return */
     if(internal_config.rpt_fcn == NULL)
@@ -1905,7 +2245,7 @@ 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)
+    size_t *cur_size_ptr, uint32_t *cur_num_entries_ptr)
 {
     herr_t ret_value = SUCCEED;      /* Return value */
 
@@ -1913,7 +2253,7 @@ H5AC_get_cache_size(H5AC_t *cache_ptr, size_t *max_size_ptr, size_t *min_clean_s
 
     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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_size() failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1940,7 +2280,7 @@ H5AC_get_cache_hit_rate(H5AC_t *cache_ptr, double *hit_rate_ptr)
     FUNC_ENTER_NOAPI(FAIL)
 
     if(H5C_get_cache_hit_rate((H5C_t *)cache_ptr, hit_rate_ptr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_hit_rate() failed.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_hit_rate() failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1967,7 +2307,7 @@ H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr)
     FUNC_ENTER_NOAPI(FAIL)
 
     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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_reset_cache_hit_rate_stats() failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2016,48 +2356,48 @@ H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr, H5AC_cache_config_t *config
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
     if(cache_ptr == NULL)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry")
 #ifdef H5_HAVE_PARALLEL
 {
     H5AC_aux_t *aux_ptr;
 
     aux_ptr = (H5AC_aux_t *)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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad aux_ptr on entry")
 }
 #endif /* H5_HAVE_PARALLEL */
 
     /* 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_BADVALUE, FAIL, "Bad cache configuration")
 
     if(config_ptr->open_trace_file) {
 	FILE * file_ptr;
 
 	if(NULL == (file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
-	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_trace_file_ptr() failed.")
+	    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_CACHE, H5E_BADVALUE, FAIL, "Trace file already open.")
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Trace file already open")
     } /* end if */
 
     /* 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(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__open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "H5AC__open_trace_file() 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.")
+        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.")
+        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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_evictions_enabled() failed")
 
 #ifdef H5_HAVE_PARALLEL
 {
@@ -2118,7 +2458,7 @@ done:
     /* 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")
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_set_cache_auto_resize_config() */
@@ -2128,304 +2468,132 @@ done:
  * Function:    H5AC_validate_config()
  *
  * Purpose:     Run a sanity check on the contents of the supplied
- *		instance of H5AC_cache_config_t.
- *
- *              Do nothing and return SUCCEED if no errors are detected,
- *              and flag an error and return FAIL otherwise.
- *
- *		At present, this function operates by packing the data
- *		from the instance of H5AC_cache_config_t into an instance
- *		of H5C_auto_size_ctl_t, and then calling
- *		H5C_validate_resize_config().  As H5AC_cache_config_t and
- *		H5C_auto_size_ctl_t diverge, we may have to change this.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              4/6/05
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-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_CACHE, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
-    if(config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION)
-        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) {
-        size_t	        name_len;
-
-	/* Can't really test the trace_file_name field without trying to
-	 * open the file, so we will content ourselves with a couple of
-	 * 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((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_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_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(H5C_validate_resize_config(&internal_config, H5C_RESIZE_CFG__VALIDATE_ALL) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "error(s) in new config.")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_validate_config() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_close_trace_file()
- *
- * Purpose:     If a trace file is open, stop logging calls to the cache,
- *              and close the file.
- *
- *              Note that the function does nothing if there is no trace
- *              file.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              6/2/06
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5AC_close_trace_file(H5AC_t *cache_ptr)
-{
-    FILE *   trace_file_ptr = NULL;
-    herr_t   ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    if(cache_ptr == NULL)
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.")
-
-    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)
-            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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_open_trace_file()
+ *		instance of H5AC_cache_config_t.
  *
- * Purpose:     Open a trace file, and start logging calls to the cache.
+ *              Do nothing and return SUCCEED if no errors are detected,
+ *              and flag an error and return FAIL otherwise.
  *
- * 		This logging is done at the H5C level, and will only take
- * 		place if H5C_TRACE_FILE_ENABLED (defined in H5Cprivate.h)
- * 		is TRUE.
+ *		At present, this function operates by packing the data
+ *		from the instance of H5AC_cache_config_t into an instance
+ *		of H5C_auto_size_ctl_t, and then calling
+ *		H5C_validate_resize_config().  As H5AC_cache_config_t and
+ *		H5C_auto_size_ctl_t diverge, we may have to change this.
  *
  * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  John Mainzer
- *              6/1/06
+ *              4/6/05
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_open_trace_file(H5AC_t *cache_ptr, const char *trace_file_name)
+H5AC_validate_config(H5AC_cache_config_t *config_ptr)
 {
-    char     file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 2];
-    FILE *   file_ptr = NULL;
-    herr_t   ret_value = SUCCEED;    /* Return value */
+    H5C_auto_size_ctl_t internal_config;
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert(cache_ptr);
-
     /* 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.")
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL config_ptr on entry")
+    if(config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Unknown config version")
 
-#ifdef H5_HAVE_PARALLEL
-{
-    H5AC_aux_t * aux_ptr;
+    /* don't bother to test trace_file_name unless open_trace_file is TRUE */
+    if(config_ptr->open_trace_file) {
+        size_t	        name_len;
 
-    aux_ptr = (H5AC_aux_t *)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)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr->magic.")
+	/* Can't really test the trace_file_name field without trying to
+	 * open the file, so we will content ourselves with a couple of
+	 * 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 */
 
-        sprintf(file_name, "%s.%d", trace_file_name, aux_ptr->mpi_rank);
-    } /* end else */
+    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(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), 
-               "%s", trace_file_name);
-#endif /* H5_HAVE_PARALLEL */
+    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((file_ptr = HDfopen(file_name, "w")) == NULL)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.")
+    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_CACHE, H5E_BADVALUE, FAIL, "config_ptr->metadata_write_strategy out of range")
 
-    HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 1 ###\n");
+    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_set_trace_file_ptr(cache_ptr, file_ptr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_trace_file_ptr() failed.")
+    if(H5C_validate_resize_config(&internal_config, H5C_RESIZE_CFG__VALIDATE_ALL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "error(s) in new config")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_open_trace_file() */
+} /* H5AC_validate_config() */
 
 

-/*************************************************************************/
-/*************************** Debugging Functions: ************************/
-/*************************************************************************/
-
 /*-------------------------------------------------------------------------
+ * Function:    H5AC_validate_cache_image_config()
  *
- * Function:    H5AC_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.
+ * Purpose:     Run a sanity check on the contents of the supplied
+ *		instance of H5AC_cache_image_config_t.
  *
- *              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.
+ *              Do nothing and return SUCCEED if no errors are detected,
+ *              and flag an error and return FAIL otherwise.
  *
- *		This function is just a wrapper that calls the H5C 
- *		version of the function.
+ *		At present, this function operates by packing the data
+ *		from the instance of H5AC_cache_image_config_t into an 
+ *		instance of H5C_cache_image_ctl_t, and then calling
+ *		H5C_validate_cache_image_config().  If and when 
+ *              H5AC_cache_image_config_t and H5C_cache_image_ctl_t 
+ *		diverge, we may have to change this.
  *
- * Return:      FAIL if error is detected, SUCCEED otherwise.
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer, 5/30/14
+ * Programmer:  John Mainzer
+ *              6/25/15
  *
  *-------------------------------------------------------------------------
  */
-#ifndef NDEBUG
 herr_t
-H5AC_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr, void **entry_ptr_ptr)
+H5AC_validate_cache_image_config(H5AC_cache_image_config_t *config_ptr)
 {
-    herr_t              ret_value = SUCCEED;      /* Return value */
+    H5C_cache_image_ctl_t internal_config = H5C__DEFAULT_CACHE_IMAGE_CTL;
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    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_get_entry_ptr_from_addr() */
-#endif /* NDEBUG */
+    /* Check args */
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL config_ptr on entry")
 
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_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 expected 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.
- *
- *		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
- *
- *-------------------------------------------------------------------------
- */
-#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 */
+    if(config_ptr->version != H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Unknown image config version")
 
-    FUNC_ENTER_NOAPI(FAIL)
+    /* don't need to get the current H5C image config here since the
+     * default values of fields not in the H5AC config will always be 
+     * valid.
+     */
+    internal_config.version            = config_ptr->version;
+    internal_config.generate_image     = config_ptr->generate_image;
+    internal_config.save_resize_status = config_ptr->save_resize_status;
+    internal_config.entry_ageout       = config_ptr->entry_ageout;
 
-    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")
+    if(H5C_validate_cache_image_config(&internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "error(s) in new cache image config")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_verify_entry_type() */
-#endif /* NDEBUG */
-
-
-

-/*************************************************************************/
-/**************************** Private Functions: *************************/
-/*************************************************************************/
+} /* H5AC_validate_cache_image_config() */
 
 

 /*-------------------------------------------------------------------------
@@ -2511,7 +2679,7 @@ H5AC__ext_config_2_int_config(H5AC_cache_config_t *ext_conf_ptr,
 
     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.")
+        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)
@@ -2578,7 +2746,7 @@ H5AC_ignore_tags(const H5F_t *f)
 
     /* 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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "H5C_ignore_tags() failed")
             
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2600,7 +2768,6 @@ done:
 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 */
 
@@ -2612,32 +2779,16 @@ H5AC_tag(hid_t dxpl_id, haddr_t metadata_tag, haddr_t *prev_tag)
 
     /* 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)
+        haddr_t tag;                    /* Tag value */
+
+        if((H5P_get(dxpl, H5AC_TAG_NAME, &tag)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query dxpl")
-        *prev_tag = tag.value;
+        *prev_tag = tag;
     } /* end if */
 
-    /* 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 */
-
     /* 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")
+    if(H5P_set(dxpl, H5AC_TAG_NAME, &metadata_tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't set tag in dxpl")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2661,17 +2812,21 @@ done:
 herr_t
 H5AC_retag_copied_metadata(const H5F_t *f, haddr_t metadata_tag) 
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* 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);
+    if(H5C_retag_entries(f->shared->cache, H5AC__COPIED_TAG, metadata_tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "Can't retag metadata")
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5AC_retag_copied_metadata */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_retag_copied_metadata() */
 
 

 /*------------------------------------------------------------------------------
@@ -2723,7 +2878,7 @@ done:
  *------------------------------------------------------------------------------
  */
 herr_t
-H5AC_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id)
+H5AC_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hbool_t match_global, hid_t dxpl_id)
 {
     /* Variable Declarations */
     herr_t ret_value = SUCCEED;
@@ -2736,13 +2891,80 @@ H5AC_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id)
     HDassert(f->shared);
 
     /* Call cache level function to evict metadata entries with specified tag */
-    if(H5C_evict_tagged_entries(f, dxpl_id, metadata_tag)<0)
+    if(H5C_evict_tagged_entries(f, dxpl_id, metadata_tag, match_global) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot evict metadata")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_evict_tagged_metadata() */
+
+

+/*------------------------------------------------------------------------------
+ * Function:    H5AC_expunge_tag_type_metadata()
+ *
+ * Purpose:     Wrapper for cache level function which expunge entries with
+ *              a specific tag and type id.
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
+ *
+ * Programmer:  Vailin Choi; May 2016
+ *
+ *------------------------------------------------------------------------------
+ */
+herr_t
+H5AC_expunge_tag_type_metadata(H5F_t *f, hid_t dxpl_id, haddr_t tag, int type_id, unsigned flags)
+{
+    /* Variable Declarations */
+    herr_t ret_value = SUCCEED;
+ 
+    /* Function Enter Macro */   
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Assertions */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Call cache level function to expunge entries with specified tag and type id */
+    if(H5C_expunge_tag_type_metadata(f, dxpl_id, tag, type_id, flags)<0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot expunge tagged type entries")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_expunge_tag_type_metadata*/
+
+

+/*------------------------------------------------------------------------------
+ * Function:    H5AC_get_tag()
+ *
+ * Purpose:     Get the tag for a metadata cache entry.
+ * 
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *------------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_tag(const void *thing, haddr_t *tag)
+{
+    /* Variable Declarations */
+    herr_t ret_value = SUCCEED;
+ 
+    /* Function Enter Macro */   
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Assertions */
+    HDassert(thing);
+    HDassert(tag);
 
-} /* H5AC_evict_tagged_metadata */
+    /* Call cache level function to get the tag */
+    if(H5C_get_tag(thing, tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "Cannot get tag for metadata cache entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_get_tag() */
 
 

 /*-------------------------------------------------------------------------
@@ -2797,11 +3019,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__verify_tag(hid_t dxpl_id, const H5AC_class_t * type)
+H5AC__verify_tag(hid_t dxpl_id, const H5AC_class_t *type)
 {
-    H5C_tag_t tag;
-    H5P_genplist_t * dxpl;
-    herr_t ret_value = SUCCEED;
+    H5P_genplist_t *dxpl;               /* DXPL for operation */
+    haddr_t tag;                        /* Entry tag to validate */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -2810,66 +3032,12 @@ H5AC__verify_tag(hid_t dxpl_id, const H5AC_class_t * type)
         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 {
+    if((H5P_get(dxpl, H5AC_TAG_NAME, &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. */
-
-        /* 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 */
+    /* Verify legal tag value */
+    if(H5C_verify_tag(type->id, tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "tag verification failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2986,3 +3154,183 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5AC_reset_ring() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_unsettle_entry_ring()
+ *
+ * Purpose:     Advise the metadata cache that the specified entry's metadata
+ *              cache manager ring is no longer settled (if it was on entry).
+ *
+ *              If the target metadata cache manager ring is already
+ *              unsettled, do nothing, and return SUCCEED.
+ *
+ *              If the target metadata cache manager ring is settled, and
+ *              we are not in the process of a file shutdown, mark
+ *              the ring as unsettled, and return SUCCEED.
+ *
+ *              If the target metadata cache  manager is settled, and we
+ *              are in the process of a file shutdown, post an error
+ *              message, and return FAIL.
+ *
+ *		Note that this function simply passes the call on to
+ *		the metadata cache proper, and returns the result.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_unsettle_entry_ring(void *_entry)
+{
+    H5AC_info_t *entry = (H5AC_info_t *)_entry; /* Entry to remove */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry);
+
+    /* Unsettle the entry's ring */
+    if(H5C_unsettle_entry_ring(entry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_unsettle_entry_ring() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_unsettle_ring()
+ *
+ * Purpose:     Advise the metadata cache that the specified free space
+ *              manager ring is no longer settled (if it was on entry).
+ *
+ *              If the target free space manager ring is already
+ *              unsettled, do nothing, and return SUCCEED.
+ *
+ *              If the target free space manager ring is settled, and
+ *              we are not in the process of a file shutdown, mark
+ *              the ring as unsettled, and return SUCCEED.
+ *
+ *              If the target free space manager is settled, and we
+ *              are in the process of a file shutdown, post an error
+ *              message, and return FAIL.
+ *
+ *              Note that this function simply passes the call on to
+ *              the metadata cache proper, and returns the result.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/15/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_unsettle_ring(H5F_t * f, H5C_ring_t ring)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(FAIL == (ret_value = H5C_unsettle_ring(f, ring)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_unsettle_ring() failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_unsettle_ring() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_remove_entry()
+ *
+ * Purpose:     Remove an entry from the cache.  Must be not protected, pinned,
+ *		dirty, involved in flush dependencies, etc.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_remove_entry(void *_entry)
+{
+    H5AC_info_t *entry = (H5AC_info_t *)_entry; /* Entry to remove */
+    H5C_t *cache = NULL;                /* Pointer to the entry's associated metadata cache */
+#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(entry);
+    cache = entry->cache_ptr;
+    HDassert(cache);
+
+#if H5AC__TRACE_FILE_ENABLED
+    /* For the remove entry call, only the addr is really necessary
+     * in the trace file.  Also write the result to catch occult errors.
+     */
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(entry)))
+        sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(entry->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "unable to get logging status")
+
+    /* Remove the entry from the cache*/
+    if(H5C_remove_entry(entry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr)
+	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_remove_entry_log_msg(cache, entry, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_remove_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_mdc_image_info
+ *
+ * Purpose:     Wrapper function for H5C_get_mdc_image_info().
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  Vailin Choi; March 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_get_mdc_image_info(H5AC_t *cache_ptr, haddr_t *image_addr, hsize_t *image_len)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(H5C_get_mdc_image_info((H5C_t *)cache_ptr, image_addr, image_len) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't retrieve cache image info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_get_mdc_image_info() */
+
diff --git a/src/H5ACdbg.c b/src/H5ACdbg.c
new file mode 100644
index 0000000..c6d71a8
--- /dev/null
+++ b/src/H5ACdbg.c
@@ -0,0 +1,492 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5ACdbg.c
+ *
+ * Purpose:             Functions for debugging the metadata cache
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* 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 "H5Eprivate.h"         /* Error handling                       */
+#include "H5Fpkg.h"		/* Files				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_stats
+ *
+ * Purpose:     Prints statistics about the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, October 30, 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_stats(const H5F_t *f)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    /* at present, this can't fail */
+    (void)H5C_stats(f->shared->cache, H5F_OPEN_NAME(f), FALSE);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC_stats() */
+
+#ifndef NDEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_dump_cache
+ *
+ * Purpose:     Dumps a summary of the contents of the metadata cache
+ *              to stdout.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              Sunday, October 10, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_dump_cache(const H5F_t *f)
+{
+    herr_t              ret_value = SUCCEED;   /* Return value */
+
+    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)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_dump_cache() failed.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_dump_cache() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__close_trace_file()
+ *
+ * Purpose:     If a trace file is open, stop logging calls to the cache,
+ *              and close the file.
+ *
+ *              Note that the function does nothing if there is no trace
+ *              file.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__close_trace_file(H5AC_t *cache_ptr)
+{
+    FILE *   trace_file_ptr;
+    herr_t   ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    if(cache_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.")
+
+    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)
+            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() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__open_trace_file()
+ *
+ * Purpose:     Open a trace file, and start logging calls to the cache.
+ *
+ * 		This logging is done at the H5C level, and will only take
+ * 		place if H5C_TRACE_FILE_ENABLED (defined in H5Cprivate.h)
+ * 		is TRUE.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/1/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__open_trace_file(H5AC_t *cache_ptr, const char *trace_file_name)
+{
+    char     file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 2];
+    FILE *   file_ptr;
+    herr_t   ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(cache_ptr);
+
+    /* 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 *)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)
+            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.")
+}
+#else /* H5_HAVE_PARALLEL */
+    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)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.")
+
+    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.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__open_trace_file() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_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.
+ *
+ *              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
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5AC_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr, void **entry_ptr_ptr)
+{
+    H5C_t *cache_ptr;               /* Ptr to cache */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    if(H5C_get_entry_ptr_from_addr(cache_ptr, 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_get_entry_ptr_from_addr() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_flush_dependency_exists()
+ *
+ * Purpose:     Test to see if a flush dependency relationship exists
+ *              between the supplied parent and child.  Both parties
+ *              are indicated by addresses so as to avoid the necessity
+ *              of protect / unprotect calls prior to this call.
+ *
+ *              If either the parent or the child is not in the metadata
+ *              cache, the function sets *fd_exists_ptr to FALSE.
+ *
+ *              If both are in the cache, the childs list of parents is
+ *              searched for the proposed parent.  If the proposed parent
+ *              is found in the childs parent list, the function sets
+ *              *fd_exists_ptr to TRUE.  In all other non-error cases,
+ *              the function sets *fd_exists_ptr FALSE.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.  Note that
+ *              *fd_exists_ptr is undefined on failure.
+ *
+ * Programmer:  John Mainzer
+ *              9/28/16
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5AC_flush_dependency_exists(H5F_t *f, haddr_t parent_addr, haddr_t child_addr,
+    hbool_t *fd_exists_ptr)
+{
+    H5C_t *cache_ptr;               /* Ptr to cache */
+    herr_t  ret_value = FAIL;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    ret_value = H5C_flush_dependency_exists(cache_ptr, parent_addr, child_addr, fd_exists_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_flush_dependency_exists() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_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 expected 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.
+ *
+ *              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
+ *
+ * Changes:	None.
+ *
+ *						JRM -- 9/17/16
+ *
+ *-------------------------------------------------------------------------
+ */
+#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)
+{
+    H5C_t             * cache_ptr;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    if(H5C_verify_entry_type(cache_ptr, addr, expected_type, in_cache_ptr, type_ok_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_verify_entry_type() failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_verify_entry_type() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_get_serialization_in_progress
+ *
+ * Purpose:     Return the current value of 
+ *              cache_ptr->serialization_in_progress.
+ *
+ * Return:      Current value of cache_ptr->serialization_in_progress.
+ *
+ * Programmer:  John Mainzer
+ *              8/24/15
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+hbool_t
+H5AC_get_serialization_in_progress(H5F_t *f)
+{
+    H5C_t * cache_ptr;
+    hbool_t ret_value = FALSE;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    /* Set return value */
+    ret_value = H5C_get_serialization_in_progress(cache_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_get_serialization_in_progress() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_cache_is_clean()
+ *
+ * Purpose:     Debugging function that verifies that all rings in the
+ *              metadata cache are clean from the outermost ring, inwards
+ *              to the inner ring specified.
+ *
+ *              Returns TRUE if all specified rings are clean, and FALSE
+ *              if not.  Throws an assertion failure on error.
+ *
+ * Return:      TRUE if the indicated ring(s) are clean, and FALSE otherwise.
+ *
+ * Programmer:  John Mainzer, 6/18/16
+ *
+ * Changes:     None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+hbool_t
+H5AC_cache_is_clean(const H5F_t *f, H5AC_ring_t inner_ring)
+{
+    H5C_t *cache_ptr;
+    hbool_t ret_value = FALSE;  /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+
+    ret_value = H5C_cache_is_clean(cache_ptr, inner_ring);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_cache_is_clean() */
+#endif /* NDEBUG */
+
diff --git a/src/H5AClog.c b/src/H5AClog.c
index cdfb932..51a2050 100644
--- a/src/H5AClog.c
+++ b/src/H5AClog.c
@@ -5,17 +5,15 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
  *
- * Created:             H5AClog_json.c
+ * Created:             H5AClog.c
  *
  * Purpose:             Functions for metadata cache logging in JSON format
  *
@@ -26,22 +24,23 @@
 /* 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 "H5Cprivate.h"		/* Cache                                */
 #include "H5Eprivate.h"         /* Error handling                       */
 
+
 /****************/
 /* Local Macros */
 /****************/
 
 #define MSG_SIZE 128
 
+
 /******************/
 /* Local Typedefs */
 /******************/
@@ -71,18 +70,6 @@
 /* Local Variables */
 /*******************/
 
-

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

 /*-------------------------------------------------------------------------
@@ -93,20 +80,34 @@
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 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;
+    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(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* 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(!log_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "attempt to write opening log message when logging is disabled")
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -118,24 +119,21 @@ H5AC__write_create_cache_log_msg(H5AC_t *cache)
 "
     , (long long)HDtime(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")
+    /* Have to temporarily enable logging, if it isn't currently  */
+    if(!curr_logging)
+        if(H5C_start_logging(cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to start mdc logging")
 
-    /* Write the log message to the file
-     * Have to temporarily enable logging for this.
-     */
-    orig_state = cache->currently_logging;
-    cache->currently_logging = TRUE;
+    /* 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")
-    cache->currently_logging = orig_state;
 
-done:
+    /* Stop logging, if it wasn't started originally */
+    if(!curr_logging)
+        if(H5C_stop_logging(cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to stop mdc logging")
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_create_cache_log_msg() */
 
@@ -148,20 +146,34 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 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;
+    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(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* 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(!log_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "attempt to write closing log message when logging is disabled")
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -172,24 +184,21 @@ H5AC__write_destroy_cache_log_msg(H5AC_t *cache)
 "
     , (long long)HDtime(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")
+    /* Have to temporarily enable logging, if it isn't currently  */
+    if(!curr_logging)
+        if(H5C_start_logging(cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to start mdc logging")
 
-    /* Write the log message to the file
-     * Have to temporarily enable logging for this.
-     */
-    orig_state = cache->currently_logging;
-    cache->currently_logging = TRUE;
+    /* 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")
-    cache->currently_logging = orig_state;
 
-done:
+    /* Stop logging, if it wasn't started originally */
+    if(!curr_logging)
+        if(H5C_stop_logging(cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to stop mdc logging")
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_destroy_cache_log_msg() */
 
@@ -202,6 +211,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -215,7 +227,6 @@ H5AC__write_evict_cache_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -233,7 +244,6 @@ H5AC__write_evict_cache_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_evict_cache_log_msg() */
 
@@ -246,6 +256,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -261,7 +274,6 @@ H5AC__write_expunge_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -282,7 +294,6 @@ H5AC__write_expunge_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_expunge_entry_log_msg() */
 
@@ -295,6 +306,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -308,7 +322,6 @@ H5AC__write_flush_cache_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -326,7 +339,6 @@ H5AC__write_flush_cache_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_flush_cache_log_msg() */
 
@@ -339,6 +351,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -356,7 +371,6 @@ H5AC__write_insert_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
 
 
     /* Create the log message string */
@@ -380,7 +394,6 @@ H5AC__write_insert_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_insert_entry_log_msg() */
 
@@ -393,6 +406,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -407,7 +423,6 @@ H5AC__write_mark_dirty_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     /* Create the log message string */
@@ -427,12 +442,153 @@ H5AC__write_mark_dirty_entry_log_msg(const H5AC_t *cache,
         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_mark_clean_entry_log_msg
+ *
+ * Purpose:     Write a log message for marking cache entries as clean.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, July 23, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_mark_clean_entry_log_msg(const H5AC_t *cache, const H5AC_info_t *entry,
+    herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];                 /* Log message buffer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"clean\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)HDtime(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_clean_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_mark_unserialized_entry_log_msg
+ *
+ * Purpose:     Write a log message for marking cache entries as unserialized.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, December 22, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_mark_unserialized_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(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"unserialized\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)HDtime(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_unserialized_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_mark_serialize_entry_log_msg
+ *
+ * Purpose:     Write a log message for marking cache entries as serialize.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, December 22, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_mark_serialized_entry_log_msg(const H5AC_t *cache, const H5AC_info_t *entry,
+    herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];                 /* Log message buffer */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"serialized\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)HDtime(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_serialized_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC__write_move_entry_log_msg
  *
  * Purpose:     Write a log message for moving a cache entry.
@@ -440,6 +596,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -456,7 +615,6 @@ H5AC__write_move_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
 
     /* Create the log message string */
     HDsnprintf(msg, MSG_SIZE, 
@@ -478,7 +636,6 @@ H5AC__write_move_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_move_entry_log_msg() */
 
@@ -491,6 +648,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -505,7 +665,6 @@ H5AC__write_pin_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     /* Create the log message string */
@@ -526,7 +685,6 @@ H5AC__write_pin_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_pin_entry_log_msg() */
 
@@ -540,6 +698,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -555,7 +716,6 @@ H5AC__write_create_fd_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(parent);
     HDassert(child);
 
@@ -578,7 +738,6 @@ H5AC__write_create_fd_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_create_fd_log_msg() */
 
@@ -591,6 +750,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -607,7 +769,6 @@ H5AC__write_protect_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     if(H5AC__READ_ONLY_FLAG == flags)
@@ -635,7 +796,6 @@ H5AC__write_protect_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_protect_entry_log_msg() */
 
@@ -648,6 +808,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -663,7 +826,6 @@ H5AC__write_resize_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     /* Create the log message string */
@@ -685,7 +847,6 @@ H5AC__write_resize_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_resize_entry_log_msg() */
 
@@ -698,6 +859,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -712,7 +876,6 @@ H5AC__write_unpin_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     /* Create the log message string */
@@ -733,7 +896,6 @@ H5AC__write_unpin_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_unpin_entry_log_msg() */
 
@@ -747,6 +909,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -762,7 +927,6 @@ H5AC__write_destroy_fd_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(parent);
     HDassert(child);
 
@@ -785,7 +949,6 @@ H5AC__write_destroy_fd_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_destroy_fd_log_msg() */
 
@@ -798,6 +961,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -814,7 +980,6 @@ H5AC__write_unprotect_entry_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(entry);
 
     /* Create the log message string */
@@ -839,7 +1004,6 @@ H5AC__write_unprotect_entry_log_msg(const H5AC_t *cache,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC__write_unprotect_entry_log_msg() */
 
@@ -852,6 +1016,9 @@ done:
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -866,7 +1033,6 @@ H5AC__write_set_cache_config_log_msg(const H5AC_t *cache,
 
     /* Sanity checks */
     HDassert(cache);
-    HDassert(cache->magic == H5C__H5C_T_MAGIC);
     HDassert(config);
 
     /* Create the log message string */
@@ -886,7 +1052,54 @@ H5AC__write_set_cache_config_log_msg(const H5AC_t *cache,
         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() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_remove_entry_log_msg
+ *
+ * Purpose:     Write a log message for removing a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_remove_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(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"remove\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)HDtime(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_remove_entry_log_msg() */
+
diff --git a/src/H5ACmodule.h b/src/H5ACmodule.h
index a8dba59..e218b31 100644
--- a/src/H5ACmodule.h
+++ b/src/H5ACmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5ACmpio.c b/src/H5ACmpio.c
index e33fc8e..d03c17b 100644
--- a/src/H5ACmpio.c
+++ b/src/H5ACmpio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -81,7 +79,7 @@ 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 */
+    unsigned        u;              /* Counter for position in array */
 } H5AC_addr_list_ud_t;
 
 
@@ -90,21 +88,21 @@ typedef struct H5AC_addr_list_ud_t
 /********************/
 
 static herr_t H5AC__broadcast_candidate_list(H5AC_t *cache_ptr,
-    int *num_entries_ptr, haddr_t **haddr_buf_ptr_ptr);
+    unsigned *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);
+    unsigned *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,
+static herr_t H5AC__receive_haddr_list(MPI_Comm mpi_comm, unsigned *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);
+    unsigned *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,
+static herr_t H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, unsigned 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);
@@ -151,7 +149,7 @@ H5FL_DEFINE_STATIC(H5AC_slist_entry_t);
  */
 herr_t
 H5AC__set_sync_point_done_callback(H5C_t * cache_ptr,
-    void (* sync_point_done)(int num_writes, haddr_t * written_entries_tbl))
+    void (* sync_point_done)(unsigned num_writes, haddr_t * written_entries_tbl))
 {
     H5AC_aux_t * aux_ptr;
 
@@ -282,13 +280,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__broadcast_candidate_list(H5AC_t *cache_ptr, int *num_entries_ptr,
+H5AC__broadcast_candidate_list(H5AC_t *cache_ptr, unsigned *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;
+    unsigned		 num_entries;
     herr_t               ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
@@ -310,13 +308,13 @@ H5AC__broadcast_candidate_list(H5AC_t *cache_ptr, int *num_entries_ptr,
      * 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)))
+    num_entries = (unsigned)H5SL_count(aux_ptr->candidate_slist_ptr);
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_UNSIGNED, 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;
+        unsigned	 chk_num_entries = 0;
 
         /* convert the candidate list into the format we
          * are used to receiving from process 0, and also load it 
@@ -328,7 +326,7 @@ H5AC__broadcast_candidate_list(H5AC_t *cache_ptr, int *num_entries_ptr,
         HDassert(haddr_buf_ptr != NULL);
 
         /* Now broadcast the list of candidate entries */
-        buf_size = sizeof(haddr_t) * (size_t)num_entries;
+        buf_size = sizeof(haddr_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 */
@@ -378,8 +376,8 @@ H5AC__broadcast_clean_list_cb(void *_item, void H5_ATTR_UNUSED *_key,
 
     /* Store the entry's address in the buffer */
     addr = slist_entry_ptr->addr;
-    udata->addr_buf_ptr[udata->i] = addr;
-    udata->i++;
+    udata->addr_buf_ptr[udata->u] = addr;
+    udata->u++;
 
     /* now release the entry */
     slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
@@ -420,7 +418,7 @@ 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;
+    unsigned		 num_entries = 0;
     herr_t               ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
@@ -437,8 +435,8 @@ H5AC__broadcast_clean_list(H5AC_t * cache_ptr)
      * 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)))
+    num_entries = (unsigned)H5SL_count(aux_ptr->c_slist_ptr);
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_UNSIGNED, 0, aux_ptr->mpi_comm)))
         HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
 
     if(num_entries > 0) {
@@ -446,14 +444,14 @@ H5AC__broadcast_clean_list(H5AC_t * cache_ptr)
         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;
+        buf_size = sizeof(haddr_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;
+        udata.u = 0;
 
         /* Free all the clean list entries, building the address list in the callback */
         /* (Callback also removes the matching entries from the dirtied list) */
@@ -568,8 +566,8 @@ H5AC__copy_candidate_list_to_buffer_cb(void *_item, void H5_ATTR_UNUSED *_key,
     HDassert(udata);
 
     /* Store the entry's address in the buffer */
-    udata->addr_buf_ptr[udata->i] = slist_entry_ptr->addr;
-    udata->i++;
+    udata->addr_buf_ptr[udata->u] = slist_entry_ptr->addr;
+    udata->u++;
 
     /* now release the entry */
     slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
@@ -610,14 +608,14 @@ H5AC__copy_candidate_list_to_buffer_cb(void *_item, void H5_ATTR_UNUSED *_key,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__copy_candidate_list_to_buffer(const H5AC_t *cache_ptr, int *num_entries_ptr,
+H5AC__copy_candidate_list_to_buffer(const H5AC_t *cache_ptr, unsigned *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;
+    unsigned		 num_entries = 0;
     herr_t               ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
@@ -635,19 +633,19 @@ H5AC__copy_candidate_list_to_buffer(const H5AC_t *cache_ptr, int *num_entries_pt
     HDassert(haddr_buf_ptr_ptr != NULL);
     HDassert(*haddr_buf_ptr_ptr == NULL);
 
-    num_entries = (int)H5SL_count(aux_ptr->candidate_slist_ptr);
+    num_entries = (unsigned)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;
+    buf_size = sizeof(haddr_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;
+    udata.u = 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)
@@ -730,12 +728,10 @@ H5AC__log_deleted_entry(const H5AC_info_t *entry_ptr)
  *
  *		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
+ *		If it isn't, add the size to the 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
@@ -807,6 +803,63 @@ done:
 

 /*-------------------------------------------------------------------------
  *
+ * Function:    H5AC__log_cleaned_entry()
+ *
+ * Purpose:     Treat this operation as a 'clear' and remove the entry
+ * 		from both the cleaned and dirtied lists if it is present.
+ *		Reduces the dirty_bytes count by the size of the entry.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  Quincey Koziol
+ *              7/23/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_cleaned_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 check */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->is_dirty == FALSE);
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = (H5AC_aux_t *)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);
+
+        /* 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 */
+
+    /* Decrement the dirty byte count */
+    aux_ptr->dirty_bytes -= entry_ptr->size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__log_cleaned_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
  * Function:    H5AC__log_flushed_entry()
  *
  * Purpose:     Update the clean entry slist for the flush of an entry --
@@ -1016,7 +1069,7 @@ H5AC__log_moved_entry(const H5F_t *f, haddr_t old_addr, haddr_t new_addr)
 
     /* 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)
+            &entry_dirty, NULL, 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.")
@@ -1179,7 +1232,7 @@ H5AC__propagate_and_apply_candidate_list(H5F_t  *f, hid_t dxpl_id)
     H5AC_aux_t         * aux_ptr;
     haddr_t            * candidates_list_ptr = NULL;
     int		         mpi_result;
-    int	                 num_candidates = 0;
+    unsigned	         num_candidates = 0;
     herr_t               ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_STATIC
@@ -1393,12 +1446,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__receive_haddr_list(MPI_Comm mpi_comm, int *num_entries_ptr,
+H5AC__receive_haddr_list(MPI_Comm mpi_comm, unsigned *num_entries_ptr,
     haddr_t **haddr_buf_ptr_ptr)
 {
     haddr_t	       * haddr_buf_ptr = NULL;
     int                  mpi_result;
-    int			 num_entries;
+    unsigned		 num_entries;
     herr_t               ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
@@ -1413,14 +1466,14 @@ H5AC__receive_haddr_list(MPI_Comm mpi_comm, int *num_entries_ptr,
      * 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)))
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_UNSIGNED, 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;
+        buf_size = sizeof(haddr_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")
 
@@ -1468,7 +1521,7 @@ 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;
+    unsigned		 num_entries = 0;
     herr_t               ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
@@ -1488,7 +1541,7 @@ H5AC__receive_and_apply_clean_list(H5F_t *f, hid_t dxpl_id)
 
     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)
+        if(H5C_mark_entries_as_clean(f, dxpl_id, 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
@@ -1527,7 +1580,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__receive_candidate_list(const H5AC_t *cache_ptr, int *num_entries_ptr,
+H5AC__receive_candidate_list(const H5AC_t *cache_ptr, unsigned *num_entries_ptr,
     haddr_t **haddr_buf_ptr_ptr)
 {
     H5AC_aux_t         * aux_ptr;
@@ -1612,7 +1665,7 @@ H5AC__rsp__dist_md_write__flush(H5F_t *f, hid_t dxpl_id)
     H5AC_aux_t * aux_ptr;
     haddr_t    * haddr_buf_ptr = NULL;
     int		 mpi_result;
-    int          num_entries = 0;
+    unsigned     num_entries = 0;
     herr_t	 ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_STATIC
@@ -2169,11 +2222,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, int num_candidates,
+H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, unsigned num_candidates,
     haddr_t *candidates_list_ptr)
 {
     H5AC_aux_t         * aux_ptr;
-    int                  i;
+    unsigned             u;
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -2194,12 +2247,12 @@ H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, int num_candidates,
      * 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++) {
+    for(u = 0; u < num_candidates; u++) {
         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 = candidates_list_ptr[u];
 
         /* addr may be either on the dirtied list, or on the flushed 
          * and still clean list.  Remove it.
diff --git a/src/H5ACpkg.h b/src/H5ACpkg.h
index 82e500e..ea7f0bf 100644
--- a/src/H5ACpkg.h
+++ b/src/H5ACpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -42,7 +40,6 @@
 /* Get needed headers */
 #include "H5Cprivate.h"         /* Cache                                */
 #include "H5FLprivate.h"        /* Free Lists                           */
-#include "H5SLprivate.h"        /* Skip lists */
 
 /*****************************/
 /* Package Private Variables */
@@ -352,6 +349,12 @@ H5FL_EXTERN(H5AC_aux_t);
  *		this verification.  The field is set to NULL when the 
  *		callback is not needed.
  *
+ * The following field supports the metadata cache image feature.
+ *
+ * p0_image_len: unsiged integer containing the length of the metadata cache
+ *		image constructed by MPI process 0.  This field should be 0
+ *		if the value is unknown, or if cache image is not enabled.
+ *
  ****************************************************************************/
 
 #ifdef H5_HAVE_PARALLEL
@@ -399,13 +402,24 @@ typedef struct H5AC_aux_t
 
     void	(* write_done)(void);
 
-    void	(* sync_point_done)(int num_writes, 
+    void	(* sync_point_done)(unsigned num_writes, 
                                     haddr_t * written_entries_tbl);
+
+    unsigned    p0_image_len;
+
 } H5AC_aux_t; /* struct H5AC_aux_t */
+#endif /* H5_HAVE_PARALLEL */
 
-/* Package scoped functions */
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+#ifdef H5_HAVE_PARALLEL
+/* Parallel I/O routines */
 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_cleaned_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);
@@ -414,15 +428,14 @@ H5_DLL herr_t H5AC__log_moved_entry(const H5F_t *f, haddr_t old_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));
+    void (*sync_point_done)(unsigned 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 */
-/******************************/
+/* Trace file routines */
+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);
 
 /* Cache logging routines */
 H5_DLL herr_t H5AC__write_create_cache_log_msg(H5AC_t *cache);
@@ -444,6 +457,12 @@ H5_DLL herr_t H5AC__write_insert_entry_log_msg(const H5AC_t *cache,
 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_mark_clean_entry_log_msg(const H5AC_t *cache,
+    const H5AC_info_t *entry, herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_mark_unserialized_entry_log_msg(const H5AC_t *cache,
+        const H5AC_info_t *entry, herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_mark_serialized_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,
@@ -479,6 +498,9 @@ H5_DLL herr_t H5AC__write_unprotect_entry_log_msg(const H5AC_t *cache,
 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);
+H5_DLL herr_t H5AC__write_remove_entry_log_msg(const H5AC_t *cache,
+                                              const H5AC_info_t *entry,
+                                              herr_t fxn_ret_value);
 
 #endif /* _H5ACpkg_H */
 
diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h
index 15c9756..b9e2a60 100644
--- a/src/H5ACprivate.h
+++ b/src/H5ACprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -35,6 +33,7 @@
 #include "H5Cprivate.h"		/* Cache				*/
 #include "H5Fprivate.h"		/* File access				*/
 #include "H5Pprivate.h"		/* Property lists			*/
+#include "H5SLprivate.h"        /* Skip lists 				*/
 
 #ifdef H5_METADATA_TRACE_FILE
 #define H5AC__TRACE_FILE_ENABLED	1
@@ -45,44 +44,50 @@
 /* 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
+#define H5AC__COPIED_TAG       (haddr_t)2
+#define H5AC__SUPERBLOCK_TAG   (haddr_t)3
+#define H5AC__FREESPACE_TAG    (haddr_t)4
+#define H5AC__SOHM_TAG         (haddr_t)5
+#define H5AC__GLOBALHEAP_TAG   (haddr_t)6
+
+/* Definitions for cache "tag" property */
+#define H5AC_TAG_NAME          "H5AC_tag"
+#define H5AC_TAG_SIZE          sizeof(haddr_t)
+#define H5AC_TAG_DEF           (H5AC__INVALID_TAG)
 
 /* Types of metadata objects cached */
 typedef enum {
-    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_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_BT2_HDR_ID,            /* ( 7) v2 B-tree header                            */
+    H5AC_BT2_INT_ID,            /* ( 8) v2 B-tree internal node                     */
+    H5AC_BT2_LEAF_ID,           /* ( 9) v2 B-tree leaf node                         */
+    H5AC_FHEAP_HDR_ID,          /* (10) fractal heap header                         */
+    H5AC_FHEAP_DBLOCK_ID,       /* (11) fractal heap direct block                   */
+    H5AC_FHEAP_IBLOCK_ID,       /* (12) fractal heap indirect block                 */
+    H5AC_FSPACE_HDR_ID,         /* (13) free space header                           */
+    H5AC_FSPACE_SINFO_ID,       /* (14) free space sections                         */
+    H5AC_SOHM_TABLE_ID,         /* (15) shared object header message master table   */
+    H5AC_SOHM_LIST_ID,          /* (16) shared message index stored as a list       */
+    H5AC_EARRAY_HDR_ID,         /* (17) extensible array header                     */
+    H5AC_EARRAY_IBLOCK_ID,      /* (18) extensible array index block                */
+    H5AC_EARRAY_SBLOCK_ID,      /* (19) extensible array super block                */
+    H5AC_EARRAY_DBLOCK_ID,      /* (20) extensible array data block                 */
+    H5AC_EARRAY_DBLK_PAGE_ID,   /* (21) extensible array data block page            */
+    H5AC_FARRAY_HDR_ID,         /* (22) fixed array header                          */
+    H5AC_FARRAY_DBLOCK_ID,      /* (23) fixed array data block                      */
+    H5AC_FARRAY_DBLK_PAGE_ID,   /* (24) fixed array data block page                 */
+    H5AC_SUPERBLOCK_ID,         /* (25) file superblock                             */
+    H5AC_DRVRINFO_ID,           /* (26) driver info block (supplements superblock)  */
+    H5AC_EPOCH_MARKER_ID,       /* (27) epoch marker - always internal to cache     */
+    H5AC_PROXY_ENTRY_ID,        /* (28) cache entry proxy                           */
+    H5AC_PREFETCHED_ENTRY_ID, 	/* (29) prefetched entry - always internal to cache */
+    H5AC_NTYPES                 /* Number of types, must be last                    */
 } H5AC_type_t;
 
 /* H5AC_DUMP_STATS_ON_CLOSE should always be FALSE when
@@ -104,14 +109,22 @@ typedef enum {
  *	 use the dump_stats parameter to takedown_cache(), or call 
  *	 H5C_stats() directly.
  *					JRM -- 4/12/15
+ *
+ * Added the H5AC_DUMP_IMAGE_STATS_ON_CLOSE #define, which works much 
+ * the same way as H5AC_DUMP_STATS_ON_CLOSE.  However, the set of stats
+ * displayed is much smaller, and directed purely at the cache image feature.
+ *
+ *					JRM -- 11/1/15
  */
 #if H5C_COLLECT_CACHE_STATS
 
 #define H5AC_DUMP_STATS_ON_CLOSE	0
+#define H5AC_DUMP_IMAGE_STATS_ON_CLOSE  0
 
 #else /* H5C_COLLECT_CACHE_STATS */
 
 #define H5AC_DUMP_STATS_ON_CLOSE	0
+#define H5AC_DUMP_IMAGE_STATS_ON_CLOSE  0
 
 #endif /* H5C_COLLECT_CACHE_STATS */
 
@@ -137,7 +150,6 @@ typedef enum {
 
 #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
@@ -147,8 +159,9 @@ typedef enum {
 /* 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_USER   H5C_RING_USER
+#define H5AC_RING_RDFSM  H5C_RING_RDFSM
+#define H5AC_RING_MDFSM  H5C_RING_MDFSM
 #define H5AC_RING_SBE    H5C_RING_SBE
 #define H5AC_RING_SB     H5C_RING_SB
 #define H5AC_RING_NTYPES H5C_RING_NTYPES
@@ -159,18 +172,22 @@ typedef H5C_notify_action_t     H5AC_notify_action_t;
 #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_NOTIFY_ACTION_ENTRY_DIRTIED H5C_NOTIFY_ACTION_ENTRY_DIRTIED
+#define H5AC_NOTIFY_ACTION_ENTRY_CLEANED H5C_NOTIFY_ACTION_ENTRY_CLEANED
+#define H5AC_NOTIFY_ACTION_CHILD_DIRTIED H5C_NOTIFY_ACTION_CHILD_DIRTIED
+#define H5AC_NOTIFY_ACTION_CHILD_CLEANED H5C_NOTIFY_ACTION_CHILD_CLEANED
+#define H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED
+#define H5AC_NOTIFY_ACTION_CHILD_SERIALIZED H5C_NOTIFY_ACTION_CHILD_SERIALIZED
 
 #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
+#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_get_initial_load_size_func_t	H5AC_get_initial_load_size_func_t;
+typedef H5C_get_final_load_size_func_t	H5AC_get_final_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;
@@ -183,7 +200,6 @@ 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;
@@ -191,10 +207,30 @@ typedef H5C_class_t			H5AC_class_t;
 /* Cache entry info */
 typedef H5C_cache_entry_t		H5AC_info_t;
 
-
 /* Typedef for metadata cache (defined in H5Cpkg.h) */
 typedef H5C_t	H5AC_t;
 
+/* Metadata cache proxy entry type */
+typedef struct H5AC_proxy_entry_t {
+    H5AC_info_t cache_info;             /* Information for H5AC cache functions */
+                                        /* (MUST be first field in structure) */
+
+    /* General fields */
+    haddr_t addr;                       /* Address of the entry in the file */
+                                        /* (Should be in 'temporary' address space) */
+
+    /* Parent fields */
+    H5SL_t *parents;                    /* Skip list to track parent addresses */
+
+    /* Child fields */
+    size_t nchildren;                   /* Number of children */
+    size_t ndirty_children;             /* Number of dirty children */
+                                        /* (Note that this currently duplicates some cache functionality) */
+    size_t nunser_children;             /* Number of unserialized children */
+                                        /* (Note that this currently duplicates some cache functionality) */
+} H5AC_proxy_entry_t;
+
+
 #define H5AC_RING_NAME  "H5AC_ring_type"
 
 /* Dataset transfer property lists for metadata calls */
@@ -289,7 +325,13 @@ H5_DLLVAR hid_t H5AC_rawdata_dxpl_id;
 }
 #endif /* H5_HAVE_PARALLEL */
 
-
+#define H5AC__DEFAULT_CACHE_IMAGE_CONFIG                                     \
+{                                                                            \
+   /* int32_t version            = */ H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION, \
+   /* hbool_t generate_image     = */ FALSE,                                 \
+   /* hbool_t save_resize_status = */ FALSE,                                 \
+   /* int32_t entry_ageout       = */ H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE  \
+}
 /*
  * Library prototypes.
  */
@@ -314,31 +356,65 @@ H5_DLLVAR hid_t H5AC_rawdata_dxpl_id;
 #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
  * H5AC_get_entry_status() call.
  */
 
-#define H5AC_ES__IN_CACHE	0x0001
-#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
+#define H5AC_ES__IN_CACHE               0x0001
+#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
+#define H5AC_ES__IMAGE_IS_UP_TO_DATE    0x0080
+
+/* Metadata entry class declarations */
+H5_DLLVAR const H5AC_class_t H5AC_BT[1];
+H5_DLLVAR const H5AC_class_t H5AC_SNODE[1];
+H5_DLLVAR const H5AC_class_t H5AC_LHEAP_PRFX[1];
+H5_DLLVAR const H5AC_class_t H5AC_LHEAP_DBLK[1];
+H5_DLLVAR const H5AC_class_t H5AC_GHEAP[1];
+H5_DLLVAR const H5AC_class_t H5AC_OHDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_OHDR_CHK[1];
+H5_DLLVAR const H5AC_class_t H5AC_BT2_HDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_BT2_INT[1];
+H5_DLLVAR const H5AC_class_t H5AC_BT2_LEAF[1];
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_HDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_FSPACE_HDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_FSPACE_SINFO[1];
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1];
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1];
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_HDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_IBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_SBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_DBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1];
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_HDR[1];
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_DBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1];
+H5_DLLVAR const H5AC_class_t H5AC_SUPERBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_DRVRINFO[1];
+H5_DLLVAR const H5AC_class_t H5AC_EPOCH_MARKER[1];
+H5_DLLVAR const H5AC_class_t H5AC_PROXY_ENTRY[1];
+H5_DLLVAR const H5AC_class_t H5AC_PREFETCHED_ENTRY[1];
 
 
 /* external function declarations: */
 
 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_create(const H5F_t *f, H5AC_cache_config_t *config_ptr,
+    H5AC_cache_image_config_t * image_config_ptr);
 H5_DLL herr_t H5AC_get_entry_status(const H5F_t *f, haddr_t addr,
     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);
 H5_DLL herr_t H5AC_pin_protected_entry(void *thing);
+H5_DLL herr_t H5AC_prep_for_file_close(H5F_t *f, hid_t dxpl_id);
 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, unsigned flags);
@@ -349,28 +425,39 @@ 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_mark_entry_clean(void *thing);
+H5_DLL herr_t H5AC_mark_entry_unserialized(void *thing);
+H5_DLL herr_t H5AC_mark_entry_serialized(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, hid_t dxpl_id);
 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_remove_entry(void *entry);
 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);
+    size_t *min_clean_size_ptr, size_t *cur_size_ptr, uint32_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);
+
+/* Cache image routines */
+H5_DLL herr_t H5AC_load_cache_image_on_next_protect(H5F_t *f, haddr_t addr, 
+    hsize_t len, hbool_t rw);
+H5_DLL herr_t H5AC_validate_cache_image_config(H5AC_cache_image_config_t *config_ptr);
+H5_DLL hbool_t H5AC_cache_image_pending(const H5F_t *f);
+H5_DLL herr_t H5AC_force_cache_image_load(H5F_t * f, hid_t dxpl_id);
+H5_DLL herr_t H5AC_get_mdc_image_info(H5AC_t *cache_ptr, haddr_t *image_addr,
+    hsize_t *image_len);
 
 /* 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_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hbool_t match_global, 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);
@@ -378,19 +465,37 @@ H5_DLL herr_t H5AC_get_entry_ring(const H5F_t *f, haddr_t addr, H5AC_ring_t *rin
 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);
+H5_DLL herr_t H5AC_unsettle_entry_ring(void *entry);
+H5_DLL herr_t H5AC_unsettle_ring(H5F_t * f, H5AC_ring_t ring);
+H5_DLL herr_t H5AC_expunge_tag_type_metadata(H5F_t *f, hid_t dxpl_id, haddr_t tag, int type_id, unsigned flags);
+H5_DLL herr_t H5AC_get_tag(const void *thing, /*OUT*/ haddr_t *tag);
+
+/* Virtual entry routines */
+H5_DLL H5AC_proxy_entry_t *H5AC_proxy_entry_create(void);
+H5_DLL herr_t H5AC_proxy_entry_add_parent(H5AC_proxy_entry_t *pentry, void *parent);
+H5_DLL herr_t H5AC_proxy_entry_remove_parent(H5AC_proxy_entry_t *pentry, void *parent);
+H5_DLL herr_t H5AC_proxy_entry_add_child(H5AC_proxy_entry_t *pentry, H5F_t *f,
+    hid_t dxpl_id, void *child);
+H5_DLL herr_t H5AC_proxy_entry_remove_child(H5AC_proxy_entry_t *pentry, void *child);
+H5_DLL herr_t H5AC_proxy_entry_dest(H5AC_proxy_entry_t *pentry);
 
 #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 */
+/* Debugging functions */
 H5_DLL herr_t H5AC_stats(const H5F_t *f);
+#ifndef NDEBUG
 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);
+    void **entry_ptr_ptr);
+H5_DLL herr_t H5AC_flush_dependency_exists(H5F_t *f, haddr_t parent_addr,
+    haddr_t child_addr, hbool_t *fd_exists_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);
+H5_DLL hbool_t H5AC_get_serialization_in_progress(H5F_t *f);
+H5_DLL hbool_t H5AC_cache_is_clean(const H5F_t *f, H5AC_ring_t inner_ring);
 #endif /* NDEBUG */ /* end debugging functions */
 
 #endif /* !_H5ACprivate_H */
diff --git a/src/H5ACproxy_entry.c b/src/H5ACproxy_entry.c
new file mode 100644
index 0000000..105a531
--- /dev/null
+++ b/src/H5ACproxy_entry.c
@@ -0,0 +1,661 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5ACproxy_entry.c
+ *
+ * Purpose:             Functions and a cache client for a "proxy" cache entry.
+ *			A proxy cache entry is used as a placeholder for entire
+ *			data structures to attach flush dependencies, etc.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#include "H5ACmodule.h"         /* This source code file is part of the H5AC module */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5ACpkg.h"            /* Metadata cache                       */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5MFprivate.h"	/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static herr_t H5AC__proxy_entry_image_len(const void *thing, size_t *image_len);
+static herr_t H5AC__proxy_entry_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t H5AC__proxy_entry_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5AC__proxy_entry_free_icr(void *thing);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5AC proxy entries inherit cache-like properties from H5AC */
+const H5AC_class_t H5AC_PROXY_ENTRY[1] = {{
+    H5AC_PROXY_ENTRY_ID,               	/* Metadata client ID */
+    "Proxy entry",           		/* Metadata client name (for debugging) */
+    H5FD_MEM_SUPER,                     /* File space memory type for client */
+    0,					/* Client class behavior flags */
+    NULL,    				/* 'get_initial_load_size' callback */
+    NULL,    				/* 'get_final_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    NULL,    				/* 'deserialize' callback */
+    H5AC__proxy_entry_image_len,	/* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5AC__proxy_entry_serialize,	/* 'serialize' callback */
+    H5AC__proxy_entry_notify,		/* 'notify' callback */
+    H5AC__proxy_entry_free_icr,        	/* 'free_icr' callback */
+    NULL,                              	/* 'fsf_size' callback */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage H5AC_proxy_entry_t objects */
+H5FL_DEFINE_STATIC(H5AC_proxy_entry_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_create
+ *
+ * Purpose:     Create a new proxy entry
+ *
+ * Return:	Success:	Pointer to the new proxy entry object.
+ *		Failure:	NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+H5AC_proxy_entry_t *
+H5AC_proxy_entry_create(void)
+{
+    H5AC_proxy_entry_t *pentry = NULL;  /* Pointer to new proxy entry */
+    H5AC_proxy_entry_t *ret_value = NULL;       /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Allocate new proxy entry */
+    if(NULL == (pentry = H5FL_CALLOC(H5AC_proxy_entry_t)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "can't allocate proxy entry")
+
+    /* Set non-zero fields */
+    pentry->addr = HADDR_UNDEF;
+
+    /* Set return value */
+    ret_value = pentry;
+
+done:
+    /* Release resources on error */
+    if(!ret_value)
+        if(pentry)
+            pentry = H5FL_FREE(H5AC_proxy_entry_t, pentry);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_add_parent
+ *
+ * Purpose:     Add a parent to a proxy entry
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_proxy_entry_add_parent(H5AC_proxy_entry_t *pentry, void *_parent)
+{
+    H5AC_info_t *parent = (H5AC_info_t *)_parent; /* Parent entry's cache info */
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(parent);
+    HDassert(pentry);
+
+    /* Add parent to the list of parents */
+    if(NULL == pentry->parents)
+        if(NULL == (pentry->parents = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to create skip list for parents of proxy entry")
+
+    /* Insert parent address into skip list */
+    if(H5SL_insert(pentry->parents, parent, &parent->addr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "unable to insert parent into proxy's skip list")
+
+    /* Add flush dependency on parent */
+    if(pentry->nchildren > 0) {
+        /* Sanity check */
+        HDassert(H5F_addr_defined(pentry->addr));
+
+        if(H5AC_create_flush_dependency(parent, pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "unable to set flush dependency on proxy entry")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_add_parent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_remove_parent
+ *
+ * Purpose:     Removes a parent from a proxy entry
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_proxy_entry_remove_parent(H5AC_proxy_entry_t *pentry, void *_parent)
+{
+    H5AC_info_t *parent = (H5AC_info_t *)_parent;   /* Pointer to the parent entry */
+    H5AC_info_t *rem_parent;            /* Pointer to the removed parent entry */
+    herr_t ret_value = SUCCEED;        	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(pentry);
+    HDassert(pentry->parents);
+    HDassert(parent);
+
+    /* Remove parent from skip list */
+    if(NULL == (rem_parent = (H5AC_info_t *)H5SL_remove(pentry->parents, &parent->addr)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "unable to remove proxy entry parent from skip list")
+    if(!H5F_addr_eq(rem_parent->addr, parent->addr))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "removed proxy entry parent not the same as real parent")
+
+    /* Shut down the skip list, if this is the last parent */
+    if(0 == H5SL_count(pentry->parents)) {
+        /* Sanity check */
+        HDassert(0 == pentry->nchildren);
+
+        if(H5SL_close(pentry->parents) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CLOSEERROR, FAIL, "can't close proxy parent skip list")
+        pentry->parents = NULL;
+    } /* end if */
+
+    /* Remove flush dependency between the proxy entry and a parent */
+    if(pentry->nchildren > 0)
+        if(H5AC_destroy_flush_dependency(parent, pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "unable to remove flush dependency on proxy entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_remove_parent() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC__proxy_entry_add_child_cb
+ *
+ * Purpose:	Callback routine for adding an entry as a flush dependency for
+ *		a proxy entry.
+ *
+ * Return:	Success:	Non-negative on success
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 22, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5AC__proxy_entry_add_child_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
+{
+    H5AC_info_t *parent = (H5AC_info_t *)_item;   /* Pointer to the parent entry */
+    H5AC_proxy_entry_t *pentry = (H5AC_proxy_entry_t *)_udata; /* Pointer to the proxy entry */
+    int ret_value = H5_ITER_CONT;     /* Callback return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Add flush dependency on parent for proxy entry */
+    if(H5AC_create_flush_dependency(parent, pentry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, H5_ITER_ERROR, "unable to set flush dependency for virtual entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC__proxy_entry_add_child_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_add_child
+ *
+ * Purpose:     Add a child a proxy entry
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_proxy_entry_add_child(H5AC_proxy_entry_t *pentry, H5F_t *f, hid_t dxpl_id,
+    void *child)
+{
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(pentry);
+    HDassert(child);
+
+    /* Check for first child */
+    if(0 == pentry->nchildren) {
+        /* Get an address, if the proxy doesn't already have one */
+        if(!H5F_addr_defined(pentry->addr))
+            if(HADDR_UNDEF == (pentry->addr = H5MF_alloc_tmp(f, 1)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "temporary file space allocation failed for proxy entry")
+
+        /* Insert the proxy entry into the cache */
+        if(H5AC_insert_entry(f, dxpl_id, H5AC_PROXY_ENTRY, pentry->addr, pentry, H5AC__PIN_ENTRY_FLAG) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "unable to cache proxy entry")
+
+        /* Proxies start out clean (insertions are automatically marked dirty) */
+        if(H5AC_mark_entry_clean(pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTCLEAN, FAIL, "can't mark proxy entry clean")
+
+        /* Proxies start out serialized (insertions are automatically marked unserialized) */
+        if(H5AC_mark_entry_serialized(pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "can't mark proxy entry clean")
+
+        /* If there are currently parents, iterate over the list of parents, creating flush dependency on them */
+        if(pentry->parents)
+            if(H5SL_iterate(pentry->parents, H5AC__proxy_entry_add_child_cb, pentry) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "can't visit parents")
+    } /* end if */
+
+    /* Add flush dependency on proxy entry */
+    if(H5AC_create_flush_dependency(pentry, child) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "unable to set flush dependency on proxy entry")
+
+    /* Increment count of children */
+    pentry->nchildren++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_add_child() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC__proxy_entry_remove_child_cb
+ *
+ * Purpose:	Callback routine for removing an entry as a flush dependency for
+ *		proxy entry.
+ *
+ * Return:	Success:	Non-negative on success
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, September 22, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5AC__proxy_entry_remove_child_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
+{
+    H5AC_info_t *parent = (H5AC_info_t *)_item;   /* Pointer to the parent entry */
+    H5AC_proxy_entry_t *pentry = (H5AC_proxy_entry_t *)_udata; /* Pointer to the proxy entry */
+    int ret_value = H5_ITER_CONT;     /* Callback return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Remove flush dependency on parent for proxy entry */
+    if(H5AC_destroy_flush_dependency(parent, pentry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, H5_ITER_ERROR, "unable to remove flush dependency for proxy entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC__proxy_entry_remove_child_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_remove_child
+ *
+ * Purpose:     Remove a child a proxy entry
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_proxy_entry_remove_child(H5AC_proxy_entry_t *pentry, void *child)
+{
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(pentry);
+    HDassert(child);
+
+    /* Remove flush dependency on proxy entry */
+    if(H5AC_destroy_flush_dependency(pentry, child) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "unable to remove flush dependency on proxy entry")
+
+    /* Decrement count of children */
+    pentry->nchildren--;
+
+    /* Check for last child */
+    if(0 == pentry->nchildren) {
+        /* Check for flush dependencies on proxy's parents */
+        if(pentry->parents)
+            /* Iterate over the list of parents, removing flush dependency on them */
+            if(H5SL_iterate(pentry->parents, H5AC__proxy_entry_remove_child_cb, pentry) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "can't visit parents")
+
+        /* Unpin proxy */
+        if(H5AC_unpin_entry(pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "can't unpin proxy entry")
+
+        /* Remove proxy entry from cache */
+        if(H5AC_remove_entry(pentry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "unable to remove proxy entry")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_remove_child() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_proxy_entry_dest
+ *
+ * Purpose:     Destroys a proxy entry in memory.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_proxy_entry_dest(H5AC_proxy_entry_t *pentry)
+{
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(pentry);
+    HDassert(NULL == pentry->parents);
+    HDassert(0 == pentry->nchildren);
+    HDassert(0 == pentry->ndirty_children);
+    HDassert(0 == pentry->nunser_children);
+
+    /* Free the proxy entry object */
+    pentry = H5FL_FREE(H5AC_proxy_entry_t, pentry);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC_proxy_entry_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__proxy_entry_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__proxy_entry_image_len(const void H5_ATTR_UNUSED *thing, size_t *image_len)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    /* Set the image length size to 1 byte */
+    *image_len = 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5AC__proxy_entry_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__proxy_entry_serialize
+ *
+ * Purpose:	Serializes a data structure for writing to disk.
+ *
+ * Note:	Should never be invoked.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__proxy_entry_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 /* Yes, even though this pushes an error on the stack */
+
+    /* Should never be invoked */
+    HDassert(0 && "Invalid callback?!?");
+
+    HERROR(H5E_CACHE, H5E_CANTSERIALIZE, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5AC__proxy_entry_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__proxy_entry_notify
+ *
+ * Purpose:     Handle cache action notifications
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__proxy_entry_notify(H5AC_notify_action_t action, void *_thing)
+{
+    H5AC_proxy_entry_t *pentry = (H5AC_proxy_entry_t *)_thing;
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(pentry);
+
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+#ifdef NDEBUG
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid notify action from metadata cache")
+#else /* NDEBUG */
+            HDassert(0 && "Invalid action?!?");
+#endif /* NDEBUG */
+            break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+#ifdef NDEBUG
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid notify action from metadata cache")
+#else /* NDEBUG */
+            HDassert(0 && "Invalid action?!?");
+#endif /* NDEBUG */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            /* Sanity checks */
+            HDassert(0 == pentry->ndirty_children);
+            HDassert(0 == pentry->nunser_children);
+
+            /* No action */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            /* Sanity checks */
+            HDassert(pentry->ndirty_children > 0);
+
+            /* No action */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            /* Sanity checks */
+            HDassert(0 == pentry->ndirty_children);
+
+            /* No action */
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            /* Increment # of dirty children */
+            pentry->ndirty_children++;
+
+            /* Check for first dirty child */
+            if(1 == pentry->ndirty_children)
+                if(H5AC_mark_entry_dirty(pentry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTDIRTY, FAIL, "can't mark proxy entry dirty")
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            /* Sanity check */
+            HDassert(pentry->ndirty_children > 0);
+
+            /* Decrement # of dirty children */
+            pentry->ndirty_children--;
+
+            /* Check for last dirty child */
+            if(0 == pentry->ndirty_children)
+                if(H5AC_mark_entry_clean(pentry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTCLEAN, FAIL, "can't mark proxy entry clean")
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            /* Increment # of unserialized children */
+            pentry->nunser_children++;
+
+            /* Check for first unserialized child */
+            if(1 == pentry->nunser_children)
+                if(H5AC_mark_entry_unserialized(pentry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTUNSERIALIZE, FAIL, "can't mark proxy entry unserialized")
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* Sanity check */
+            HDassert(pentry->nunser_children > 0);
+
+            /* Decrement # of unserialized children */
+            pentry->nunser_children--;
+
+            /* Check for last unserialized child */
+            if(0 == pentry->nunser_children)
+                if(H5AC_mark_entry_serialized(pentry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "can't mark proxy entry serialized")
+            break;
+
+        default:
+#ifdef NDEBUG
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "unknown notify action from metadata cache")
+#else /* NDEBUG */
+            HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5AC__proxy_entry_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5AC__proxy_entry_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__proxy_entry_free_icr(void *_thing)
+{
+    H5AC_proxy_entry_t *pentry = (H5AC_proxy_entry_t *)_thing;
+    herr_t ret_value = SUCCEED;     		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Destroy the proxy entry */
+    if(H5AC_proxy_entry_dest(pentry) < 0)
+	HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "unable to destroy proxy entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__proxy_entry_free_icr() */
+
diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h
index dd16764..c8276cf 100644
--- a/src/H5ACpublic.h
+++ b/src/H5ACpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -508,6 +506,67 @@ typedef struct H5AC_cache_config_t
 } H5AC_cache_config_t;
 
 
+/****************************************************************************
+ *
+ * structure H5AC_cache_image_config_t
+ *
+ * H5AC_cache_image_ctl_t is a public structure intended for use in public 
+ * APIs.  At least in its initial incarnation, it is a copy of struct
+ * H5C_cache_image_ctl_t.
+ *
+ * The fields of the structure are discussed individually below:
+ *
+ * version: Integer field containing the version number of this version
+ *      of the H5C_image_ctl_t structure.  Any instance of
+ *      H5C_image_ctl_t passed to the cache must have a known
+ *      version number, or an error will be flagged.
+ *
+ * generate_image:  Boolean flag indicating whether a cache image should
+ *      be created on file close.
+ *
+ * save_resize_status:	Boolean flag indicating whether the cache image 
+ *	should include the adaptive cache resize configuration and status.
+ *	Note that this field is ignored at present.
+ *
+ * entry_ageout:	Integer field indicating the maximum number of 
+ *	times a prefetched entry can appear in subsequent cache images.
+ *	This field exists to allow the user to avoid the buildup of 
+ *	infrequently used entries in long sequences of cache images.
+ *
+ *	The value of this field must lie in the range
+ *	H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE (-1) to 
+ *	H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX (100).
+ *
+ *	H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE means that no limit 
+ *	is imposed on number of times a prefeteched entry can appear
+ *	in subsequent cache images.
+ *
+ *	A value of 0 prevents prefetched entries from being included 
+ *	in cache images.
+ *
+ *	Positive integers restrict prefetched entries to the specified
+ *	number of appearances.
+ *
+ *	Note that the number of subsequent cache images that a prefetched
+ *	entry has appeared in is tracked in an 8 bit field.  Thus, while
+ *	H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX can be increased from its 
+ *	current value, any value in excess of 255 will be the functional 
+ *	equivalent of H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE.
+ *
+ ****************************************************************************/
+
+#define H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION 	1
+
+#define H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE	-1
+#define H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX	100
+
+typedef struct H5AC_cache_image_config_t {
+    int                                 version;
+    hbool_t                             generate_image;
+    hbool_t                             save_resize_status;
+    int                                 entry_ageout;
+} H5AC_cache_image_config_t;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/H5Abtree2.c b/src/H5Abtree2.c
index a9c77d2..ed67e0f 100644
--- a/src/H5Abtree2.c
+++ b/src/H5Abtree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Adense.c b/src/H5Adense.c
index 148977d..b1903a4 100644
--- a/src/H5Adense.c
+++ b/src/H5Adense.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -339,8 +337,7 @@ 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 */
@@ -889,8 +886,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 */
@@ -1141,9 +1138,8 @@ 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 */
@@ -1344,8 +1340,7 @@ 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 */
@@ -1695,8 +1690,7 @@ 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 */
diff --git a/src/H5Adeprec.c b/src/H5Adeprec.c
index a4713a7..9221254 100644
--- a/src/H5Adeprec.c
+++ b/src/H5Adeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Aint.c b/src/H5Aint.c
index 0ad5929..160c7fb 100644
--- a/src/H5Aint.c
+++ b/src/H5Aint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -202,6 +200,11 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
     if(NULL == (attr->shared->dt = H5T_copy(type, H5T_COPY_ALL)))
         HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't get shared datatype info")
 
+    /* Convert a datatype (if committed) to a transient type if the committed datatype's file
+       location is different from the file location where the attribute will be created */
+    if(H5T_convert_committed_datatype(attr->shared->dt, loc->oloc->file) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "can't get shared datatype info")
+
     /* Mark datatype as being on disk now */
     if(H5T_set_loc(attr->shared->dt, loc->oloc->file, H5T_LOC_DISK) < 0)
         HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
@@ -1045,7 +1048,7 @@ H5A_close(H5A_t *attr)
     HDassert(attr->shared);
 
     /* Close the object's symbol-table entry */
-    if(attr->obj_opened && (H5O_close(&(attr->oloc)) < 0))
+    if(attr->obj_opened && (H5O_close(&(attr->oloc), NULL) < 0))
         HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info")
 
     /* Reference count can be 0.  It only happens when H5A_create fails. */
@@ -1787,8 +1790,8 @@ done:
 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 = FAIL;            /* Return value */
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
@@ -1915,15 +1918,17 @@ H5A_t *
 H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_size,
     H5O_copy_t *cpy_info, hid_t dxpl_id)
 {
-    H5A_t        *attr_dst = NULL;
-
-    /* for dataype conversion */
+    H5A_t      *attr_dst = NULL;        /* Destination attribute */
     hid_t       tid_src = -1;           /* Datatype ID for source datatype */
     hid_t       tid_dst = -1;           /* Datatype ID for destination datatype */
     hid_t       tid_mem = -1;           /* Datatype ID for memory datatype */
     void       *buf = NULL;             /* Buffer for copying data */
     void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
+    void       *bkg_buf = NULL;     	/* Background buffer */
     hid_t       buf_sid = -1;           /* ID for buffer dataspace */
+    hssize_t	sdst_nelmts;	        /* # of elements in destination attribute (signed) */
+    size_t	dst_nelmts;		/* # of elements in destination attribute */
+    size_t	dst_dt_size;		/* Size of destination attribute datatype */
     H5A_t      *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -2009,12 +2014,17 @@ H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_si
     if(attr_dst->shared->dt_size != attr_src->shared->dt_size || attr_dst->shared->ds_size != attr_src->shared->ds_size)
         *recompute_size = TRUE;
 
+    /* Get # of elements for destination attribute's dataspace */
+    if((sdst_nelmts = H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, NULL, "dataspace is invalid")
+    H5_CHECKED_ASSIGN(dst_nelmts, size_t, sdst_nelmts, hssize_t);
+
+    /* Get size of destination attribute's datatype */
+    if(0 == (dst_dt_size = H5T_get_size(attr_dst->shared->dt)))
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size")
+
     /* Compute the size of the data */
-    /* NOTE: This raises warnings. If we are going to be serious about
-     * expecting overflow here, we should implement testing similar to
-     * that described in CERT bulletins INT30-C and INT32-C.
-     */
-    H5_CHECKED_ASSIGN(attr_dst->shared->data_size, size_t, H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds) * H5T_get_size(attr_dst->shared->dt), hssize_t);
+    attr_dst->shared->data_size =  dst_nelmts * dst_dt_size;
 
     /* Copy (& convert) the data, if necessary */
     if(attr_src->shared->data) {
@@ -2093,14 +2103,23 @@ H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_si
 
             HDmemcpy(buf, attr_src->shared->data, attr_src->shared->data_size);
 
+	    /* Allocate background memory */
+	    if(H5T_path_bkg(tpath_src_mem) || H5T_path_bkg(tpath_mem_dst))
+		if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
+		    HGOTO_ERROR(H5E_ATTR, H5E_CANTALLOC, NULL, "memory allocation failed")
+
             /* Convert from source file to memory */
-            if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0)
+            if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, bkg_buf, dxpl_id) < 0)
                 HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed")
 
             HDmemcpy(reclaim_buf, buf, buf_size);
 
+	    /* Set background buffer to all zeros */
+	    if(bkg_buf)
+		HDmemset(bkg_buf, 0, buf_size);
+
             /* Convert from memory to destination file */
-            if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0)
+            if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, bkg_buf, dxpl_id) < 0)
                 HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed")
 
             HDmemcpy(attr_dst->shared->data, buf, attr_dst->shared->data_size);
@@ -2147,6 +2166,8 @@ done:
         buf = H5FL_BLK_FREE(attr_buf, buf);
     if(reclaim_buf)
         reclaim_buf = H5FL_BLK_FREE(attr_buf, reclaim_buf);
+    if(bkg_buf)
+        bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
 
     /* Release destination attribute information on failure */
     if(!ret_value && attr_dst && H5A_close(attr_dst) < 0)
diff --git a/src/H5Amodule.h b/src/H5Amodule.h
index e347fe1..8ed056b 100644
--- a/src/H5Amodule.h
+++ b/src/H5Amodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Apkg.h b/src/H5Apkg.h
index 5858147..6d5a83a 100644
--- a/src/H5Apkg.h
+++ b/src/H5Apkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Aprivate.h b/src/H5Aprivate.h
index 6b62692..b285920 100644
--- a/src/H5Aprivate.h
+++ b/src/H5Aprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Apublic.h b/src/H5Apublic.h
index 99ca90e..586940b 100644
--- a/src/H5Apublic.h
+++ b/src/H5Apublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Atest.c b/src/H5Atest.c
index 3dcca87..b923637 100644
--- a/src/H5Atest.c
+++ b/src/H5Atest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5B.c b/src/H5B.c
index 1208f3c..e64a695 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -1054,7 +1052,15 @@ H5B__insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
      * Handle changes/additions to children
      */
     HDassert(!(bt->level == 0) != !(child_bt_ud.bt));
-    if(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins) {
+    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) {
         unsigned *tmp_bt_flags_ptr = NULL;
         H5B_t	*tmp_bt;
 
@@ -1081,17 +1087,7 @@ H5B__insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 	/* Insert the child */
 	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")
-    } 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 */
+    } /* end else-if */
 
     /*
      * If this node split, return the mid key (the one that is shared
diff --git a/src/H5B2.c b/src/H5B2.c
index ff27d87..7e679cd 100644
--- a/src/H5B2.c
+++ b/src/H5B2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -290,7 +288,7 @@ H5B2_insert(H5B2_t *bt2, hid_t dxpl_id, void *udata)
     hdr = bt2->hdr;
 
     /* Insert the record */
-    if(H5B2__insert_hdr(hdr, dxpl_id, udata) < 0)
+    if(H5B2__insert(hdr, dxpl_id, udata) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree")
 
 done:
@@ -355,7 +353,7 @@ H5B2_update(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op, void *op_
 
     /* Use insert algorithm if nodes to leaf full */
     if(H5B2_UPDATE_INSERT_CHILD_FULL == status) {
-        if(H5B2__insert_hdr(hdr, dxpl_id, udata) < 0)
+        if(H5B2__insert(hdr, dxpl_id, udata) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree")
     } /* end if */
     else if(H5B2_UPDATE_SHADOW_DONE == status || H5B2_UPDATE_INSERT_DONE == status) {
@@ -512,22 +510,22 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
         if(cmp < 0)
             HGOTO_DONE(FALSE) 	/* Less than the least record--not found */ 
-        else if(cmp == 0) { /* Record is found */
-	        if(op && (op)(hdr->min_native_rec, op_data) < 0)
+	else if(cmp == 0) { /* Record is found */
+	    if(op && (op)(hdr->min_native_rec, op_data) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
-	        HGOTO_DONE(TRUE)
-	    } /* end if */
+	    HGOTO_DONE(TRUE)
+	} /* end if */
     } /* end if */
     if(hdr->max_native_rec != NULL) {
-	    if((hdr->cls->compare)(udata, hdr->max_native_rec, &cmp) < 0)
+	if((hdr->cls->compare)(udata, hdr->max_native_rec, &cmp) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
         if(cmp > 0)
             HGOTO_DONE(FALSE) 	/* Less than the least record--not found */ 
-	    else if(cmp == 0) { /* Record is found */
-	        if(op && (op)(hdr->max_native_rec, op_data) < 0)
+	else if(cmp == 0) { /* Record is found */
+	    if(op && (op)(hdr->max_native_rec, op_data) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation")
-	        HGOTO_DONE(TRUE)
-	    } /* end if */
+	    HGOTO_DONE(TRUE)
+	} /* end if */
     } /* end if */
 
     /* Current depth of the tree */
@@ -545,7 +543,7 @@ 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, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, &curr_node_ptr, depth, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
         /* Unpin parent if necessary */
@@ -556,8 +554,7 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
         } /* end if */
 
         /* Locate node pointer for child */
-        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                               udata, &idx, &cmp) < 0) {
+        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0) {
             /* Unlock current node before failing */
             H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET);
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
@@ -624,7 +621,7 @@ 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, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, &curr_node_ptr, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Unpin parent if necessary */
@@ -635,12 +632,11 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
         } /* end if */
 
         /* Locate record */
-        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, 
-                               udata, &idx, &cmp) < 0) {
-            /* unlock current node before failing */
+        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0) {
+            /* Unlock current node before failing */
             H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET);
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-        }
+        } /* end if */
 
         if(cmp != 0) {
             /* Unlock leaf node */
@@ -767,7 +763,7 @@ 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, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, &curr_node_ptr, depth, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
         /* Unpin parent if necessary */
@@ -854,7 +850,7 @@ 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, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, &curr_node_ptr, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Unpin parent if necessary */
@@ -1014,9 +1010,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,
-                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 */
@@ -1210,7 +1206,7 @@ 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, parent, curr_node_ptr.node_nrec, depth, H5AC__NO_FLAGS_SET)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, &curr_node_ptr, depth, FALSE, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
         /* Unpin parent if necessary */
@@ -1221,12 +1217,11 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
         } /* end if */
 
         /* Locate node pointer for child */
-        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                               udata, &idx, &cmp) < 0) {
-            /* Unlock current node */
+        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0) {
+            /* Unlock current node before failing */
             H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET);
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-        }
+        } /* end if */
 
         if(cmp > 0)
             idx++;
@@ -1299,7 +1294,7 @@ 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, parent, curr_node_ptr.node_nrec, H5AC__NO_FLAGS_SET)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, &curr_node_ptr, FALSE, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Unpin parent if necessary */
@@ -1310,11 +1305,11 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
         } /* end if */
 
         /* Locate record */
-        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, 
-                               udata, &idx, &cmp) < 0) {
+        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0) {
+            /* Unlock current node before failing */
             H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET);
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-        }
+        } /* end if */
 
         if(cmp != 0) {
             /* Unlock leaf node */
@@ -1567,7 +1562,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_depend(H5AC_info_t *parent_entry, H5B2_t *bt2)
+H5B2_depend(H5B2_t *bt2, hid_t dxpl_id, H5AC_proxy_entry_t *parent)
 {
     /* Local variables */
     H5B2_hdr_t  *hdr = bt2->hdr;        /* Header for B-tree */
@@ -1575,47 +1570,37 @@ H5B2_depend(H5AC_info_t *parent_entry, H5B2_t *bt2)
 
     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);
+    HDassert(parent);
+    HDassert(hdr->parent == NULL || hdr->parent == parent);
 
     /*
-     * Check to see if the flush dependency between the object header proxy
+     * Check to see if the flush dependency between the parent
      * 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;
+        /* Sanity check */
+        HDassert(hdr->top_proxy);
 
-        /* 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")
+        /* Set the shared v2 B-tree header's file context for this operation */
+        hdr->f = bt2->f;
 
-	hdr->parent = parent_entry;
+        /* Add the v2 B-tree as a child of the parent (proxy) */
+        if(H5AC_proxy_entry_add_child(parent, hdr->f, dxpl_id, hdr->top_proxy) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, FAIL, "unable to add v2 B-tree as child of proxy")
+	hdr->parent = parent;
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5B2_depend() */
 
+

 /*-------------------------------------------------------------------------
  * Function:    H5B2_patch_file
  *
@@ -1633,10 +1618,6 @@ H5B2_patch_file(H5B2_t *bt2, H5F_t *f)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /*
      * Check arguments.
      */
@@ -1648,3 +1629,4 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* H5B2_patch_file() */
+
diff --git a/src/H5B2cache.c b/src/H5B2cache.c
index 928a7ee..2e1d37b 100644
--- a/src/H5B2cache.c
+++ b/src/H5B2cache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -65,40 +63,31 @@
 /********************/
 
 /* Metadata cache callbacks */
-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 herr_t H5B2__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5B2__cache_int_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5B2__cache_leaf_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
@@ -114,15 +103,15 @@ const H5AC_class_t H5AC_BT2_HDR[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_load_size' callback */
+    H5B2__cache_hdr_verify_chksum,      /* 'verify_chksum' callback */
     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 */
 }};
 
@@ -132,7 +121,8 @@ const H5AC_class_t H5AC_BT2_INT[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -140,7 +130,6 @@ const H5AC_class_t H5AC_BT2_INT[1] = {{
     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 */
 }};
 
@@ -150,7 +139,8 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -158,7 +148,6 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
     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 */
 }};
 
@@ -175,7 +164,7 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2__cache_hdr_get_load_size
+ * Function:    H5B2__cache_hdr_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -188,10 +177,8 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
  *-------------------------------------------------------------------------
  */
 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)
+H5B2__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -201,16 +188,11 @@ H5B2__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_le
     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);
-    }
+    /* Set the image length size */
+    *image_len = H5B2_HEADER_SIZE_FILE(udata->f);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B2__cache_hdr_get_load_size() */
+} /* end H5B2__cache_hdr_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -363,8 +345,7 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5B2__cache_hdr_image_len(const void *_thing, size_t *image_len)
 {
     const H5B2_hdr_t *hdr = (const H5B2_hdr_t *)_thing;      /* Pointer to the B-tree header */
 
@@ -448,27 +429,6 @@ H5B2__cache_hdr_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED le
     /* 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(SUCCEED)
 } /* H5B2__cache_hdr_serialize() */
 
@@ -504,32 +464,44 @@ H5B2__cache_hdr_notify(H5AC_notify_action_t action, void *_thing)
         switch(action) {
             case H5AC_NOTIFY_ACTION_AFTER_INSERT:
 	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+		/* do nothing */
+                break;
+
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* Increment the shadow epoch, forcing new modifications to
+                 * internal and leaf nodes to create new shadow copies */
+                hdr->shadow_epoch++;
+                break;
+
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
 		/* 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 != NULL, hdr->parent is used to destroy
+                 * the flush dependency before the 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);
+                    /* Sanity check */
+                    HDassert(hdr->top_proxy);
 
 		    /* 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")
+		    if(H5AC_proxy_entry_remove_child((H5AC_proxy_entry_t *)hdr->parent, (void *)hdr->top_proxy) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency between v2 B-tree and proxy")
+                    hdr->parent = NULL;
 		} /* end if */
+
+                /* Detach from 'top' proxy for extensible array */
+                if(hdr->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(hdr->top_proxy, hdr) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency between header and v2 B-tree 'top' proxy")
+                    /* Don't reset hdr->top_proxy here, it's destroyed when the header is freed -QAK */
+                } /* end if */
 		break;
 
             default:
@@ -540,6 +512,8 @@ H5B2__cache_hdr_notify(H5AC_notify_action_t action, void *_thing)
 #endif /* NDEBUG */
         } /* end switch */
     } /* end if */
+    else
+        HDassert(NULL == hdr->parent);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -580,7 +554,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2__cache_int_get_load_size
+ * Function:    H5B2__cache_int_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -593,10 +567,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5B2__cache_int_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -606,17 +578,13 @@ H5B2__cache_int_get_load_size(const void *_image, void *_udata, size_t *image_le
     HDassert(udata->hdr);
     HDassert(image_len);
 
-    if(image == NULL) {
-	/* Set the image length size */
-	*image_len = udata->hdr->node_size;
-    } else {
-	HDassert(actual_len);
-	HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = udata->hdr->node_size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B2__cache_int_get_load_size() */
+} /* end H5B2__cache_int_get_initial_load_size() */
 
+

 /*-------------------------------------------------------------------------
  * Function:	H5B2__cache_int_verify_chksum
  *
@@ -693,9 +661,8 @@ H5B2__cache_int_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
     HDassert(udata);
 
     /* Allocate new internal node and reset cache info */
-    if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t)))
+    if(NULL == (internal = H5FL_CALLOC(H5B2_internal_t)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-    HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Increment ref. count on B-tree header */
     if(H5B2__hdr_incr(udata->hdr) < 0)
@@ -704,8 +671,7 @@ H5B2__cache_int_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
     /* Share B-tree information */
     internal->hdr = udata->hdr;
     internal->parent = udata->parent;
-    internal->shadowed_next = NULL;
-    internal->shadowed_prev = NULL;
+    internal->shadow_epoch = udata->hdr->shadow_epoch;
 
     /* Magic number */
     if(HDmemcmp(image, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC))
@@ -793,8 +759,7 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5B2__cache_int_image_len(const void *_thing, size_t *image_len)
 {
     const H5B2_internal_t *internal = (const H5B2_internal_t *)_thing;      /* Pointer to the B-tree internal node */
 
@@ -923,10 +888,10 @@ H5B2__cache_int_notify(H5AC_notify_action_t action, void *_thing)
      * Check arguments.
      */
     HDassert(internal);
+    HDassert(internal->hdr);
 
     /* 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:
@@ -936,6 +901,12 @@ H5B2__cache_int_notify(H5AC_notify_action_t action, void *_thing)
                 break;
 
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
 		/* do nothing */
 		break;
 
@@ -944,6 +915,12 @@ H5B2__cache_int_notify(H5AC_notify_action_t action, void *_thing)
 		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")
 
+                /* Detach from 'top' proxy for v2 B-tree */
+                if(internal->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(internal->top_proxy, internal) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency between internal node and v2 B-tree 'top' proxy")
+                    internal->top_proxy = NULL;
+                } /* end if */
                 break;
 
             default:
@@ -954,6 +931,8 @@ H5B2__cache_int_notify(H5AC_notify_action_t action, void *_thing)
 #endif /* NDEBUG */
         } /* end switch */
     } /* end if */
+    else
+        HDassert(NULL == internal->top_proxy);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -984,31 +963,6 @@ H5B2__cache_int_free_icr(void *_thing)
 
     /* Check arguments */
     HDassert(internal);
-    HDassert(internal->hdr);
-
-    /* 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 */
 
     /* Release v2 B-tree internal node */
     if(H5B2__internal_free(internal) < 0)
@@ -1020,7 +974,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2__cache_leaf_get_load_size
+ * Function:    H5B2__cache_leaf_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -1033,10 +987,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5B2__cache_leaf_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -1046,17 +998,13 @@ H5B2__cache_leaf_get_load_size(const void *_image, void *_udata, size_t *image_l
     HDassert(udata->hdr);
     HDassert(image_len);
 
-    if(image == NULL) {
-	/* Set the image length size */
-	*image_len = udata->hdr->node_size;
-    } else {
-	HDassert(actual_len);
-	HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = udata->hdr->node_size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B2__cache_leaf_get_load_size() */
+} /* end H5B2__cache_leaf_get_initial_load_size() */
 
+

 /*-------------------------------------------------------------------------
  * Function:	H5B2__cache_leaf_verify_chksum
  *
@@ -1132,9 +1080,8 @@ H5B2__cache_leaf_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
     HDassert(udata);
 
     /* Allocate new leaf node and reset cache info */
-    if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t)))
+    if(NULL == (leaf = H5FL_CALLOC(H5B2_leaf_t)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed")
-    HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Increment ref. count on B-tree header */
     if(H5B2__hdr_incr(udata->hdr) < 0)
@@ -1143,8 +1090,7 @@ H5B2__cache_leaf_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
     /* Share B-tree header information */
     leaf->hdr = udata->hdr;
     leaf->parent = udata->parent;
-    leaf->shadowed_next = NULL;
-    leaf->shadowed_prev = NULL;
+    leaf->shadow_epoch = udata->hdr->shadow_epoch;
 
     /* Magic number */
     if(HDmemcmp(image, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC))
@@ -1215,8 +1161,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5B2__cache_leaf_image_len(const void *_thing, size_t *image_len)
 {
     const H5B2_leaf_t *leaf = (const H5B2_leaf_t *)_thing;      /* Pointer to the B-tree leaf node  */
 
@@ -1248,7 +1193,7 @@ H5B2__cache_leaf_image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_leaf_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+H5B2__cache_leaf_serialize(const H5F_t H5_ATTR_UNUSED *f, void *_image, size_t H5_ATTR_UNUSED len,
     void *_thing)
 {
     H5B2_leaf_t *leaf = (H5B2_leaf_t *)_thing;      /* Pointer to the B-tree leaf node  */
@@ -1331,10 +1276,10 @@ H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *_thing)
      * Check arguments.
      */
     HDassert(leaf);
+    HDassert(leaf->hdr);
 
     /* 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:
@@ -1344,6 +1289,12 @@ H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *_thing)
                 break;
 
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
                 /* do nothing */
                 break;
 
@@ -1351,6 +1302,13 @@ H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *_thing)
 		/* 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")
+
+                /* Detach from 'top' proxy for v2 B-tree */
+                if(leaf->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(leaf->top_proxy, leaf) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency between leaf node and v2 B-tree 'top' proxy")
+                    leaf->top_proxy = NULL;
+                } /* end if */
                 break;
 
             default:
@@ -1361,6 +1319,8 @@ H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *_thing)
 #endif /* NDEBUG */
         } /* end switch */
     } /* end if */
+    else
+        HDassert(NULL == leaf->top_proxy);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1391,31 +1351,6 @@ H5B2__cache_leaf_free_icr(void *_thing)
 
     /* Check arguments */
     HDassert(leaf);
-    HDassert(leaf->hdr);
-
-    /* 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)
diff --git a/src/H5B2dbg.c b/src/H5B2dbg.c
index bc1edd7..3890ae0 100644
--- a/src/H5B2dbg.c
+++ b/src/H5B2dbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -188,6 +186,7 @@ H5B2__int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
 {
     H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
     H5B2_internal_t	*internal = NULL;   /* B-tree internal node */
+    H5B2_node_ptr_t node_ptr;           /* Fake node pointer for protect */
     unsigned	u;                      /* Local index variable */
     char        temp_str[128];          /* Temporary string, for formatting */
     herr_t      ret_value=SUCCEED;      /* Return value */
@@ -217,9 +216,10 @@ H5B2__int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     /*
      * Load the B-tree internal node
      */
-    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)))
+    node_ptr.addr = addr;
+    H5_CHECKED_ASSIGN(node_ptr.node_nrec, unsigned, nrec, uint16_t)
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, NULL, &node_ptr, (uint16_t)depth, FALSE, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree internal node")
 
     /* Print opening message */
@@ -298,6 +298,7 @@ H5B2__leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent
 {
     H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
     H5B2_leaf_t	*leaf = NULL;           /* B-tree leaf node */
+    H5B2_node_ptr_t node_ptr;           /* Fake node pointer for protect */
     unsigned	u;                      /* Local index variable */
     char        temp_str[128];          /* Temporary string, for formatting */
     herr_t      ret_value = SUCCEED;    /* Return value */
@@ -328,7 +329,9 @@ H5B2__leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent
      * Load the B-tree leaf node
      */
     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)))
+    node_ptr.addr = addr;
+    H5_CHECKED_ASSIGN(node_ptr.node_nrec, unsigned, nrec, uint16_t)
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, NULL, &node_ptr, FALSE, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
     /* Print opening message */
diff --git a/src/H5B2hdr.c b/src/H5B2hdr.c
index 578eeb9..ab017c6 100644
--- a/src/H5B2hdr.c
+++ b/src/H5B2hdr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -133,11 +131,6 @@ H5B2__hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
     HDassert(cparam->split_percent > 0 && cparam->split_percent <= 100);
     HDassert(cparam->merge_percent < (cparam->split_percent / 2));
 
-    /* Initialize basic information */
-    hdr->parent = NULL;
-    hdr->rc = 0;
-    hdr->pending_delete = FALSE;
-
     /* Assign dynamic information */
     hdr->depth = depth;
 
@@ -208,15 +201,12 @@ H5B2__hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
         } /* end for */
     } /* end if */
 
-    /* Determine if we are doing SWMR writes.  Only enable for data chunks for
-     * now. */
+    /* 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);
+            && (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;
+    /* Reset the shadow epoch */
+    hdr->shadow_epoch = 0;
 
     /* Create the callback context, if the callback exists */
     if(hdr->cls->crt_context)
@@ -296,6 +286,7 @@ 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 */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
     haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -318,17 +309,40 @@ H5B2__hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
     if(HADDR_UNDEF == (hdr->addr = H5MF_alloc(f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->hdr_size)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, HADDR_UNDEF, "file allocation failed for B-tree header")
 
+    /* Create 'top' proxy for extensible array entries */
+    if(hdr->swmr_write)
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, HADDR_UNDEF, "can't create v2 B-tree proxy")
+
     /* Cache the new B-tree node */
     if(H5AC_insert_entry(f, dxpl_id, H5AC_BT2_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, HADDR_UNDEF, "can't add B-tree header to cache")
+    inserted = TRUE;
+
+    /* Add header as child of 'top' proxy */
+    if(hdr->top_proxy)
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, HADDR_UNDEF, "unable to add v2 B-tree header as child of array proxy")
 
     /* Set address of v2 B-tree header to return */
     ret_value = hdr->addr;
 
 done:
-    if(!H5F_addr_defined(ret_value) && hdr)
-        if(H5B2__hdr_free(hdr) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, HADDR_UNDEF, "unable to release v2 B-tree header")
+    if(!H5F_addr_defined(ret_value))
+        if(hdr) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(hdr) < 0)
+                    HDONE_ERROR(H5E_BTREE, H5E_CANTREMOVE, HADDR_UNDEF, "unable to remove v2 B-tree header from cache")
+
+            /* Release header's disk space */
+            if(H5F_addr_defined(hdr->addr) && H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, hdr->addr, (hsize_t)hdr->hdr_size) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, HADDR_UNDEF, "unable to free v2 B-tree header")
+
+            /* Destroy header */
+            if(H5B2__hdr_free(hdr) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, HADDR_UNDEF, "unable to release v2 B-tree header")
+        } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5B2__hdr_create() */
@@ -514,6 +528,7 @@ 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 *hdr = NULL;             /* v2 B-tree header */
     H5B2_hdr_t *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -531,11 +546,32 @@ H5B2__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t hdr_addr, void *ctx_udata,
     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)))
+    if(NULL == (hdr = (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) */
+    hdr->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->swmr_write && NULL == hdr->top_proxy) {
+        /* Create 'top' proxy for v2 B-tree entries */
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, NULL, "can't create v2 B-tree proxy")
+
+        /* Add header as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, NULL, "unable to add v2 B-tree header as child of proxy")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = hdr;
 
 done:
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the header, if it was protected */
+        if(hdr && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to unprotect v2 B-tree header, address = %llu", (unsigned long long)hdr_addr)
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5B2__hdr_protect() */
 
@@ -634,6 +670,13 @@ H5B2__hdr_free(H5B2_hdr_t *hdr)
     if(hdr->max_native_rec)
 	hdr->max_native_rec = H5MM_xfree(hdr->max_native_rec);
 
+    /* Destroy the 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_dest(hdr->top_proxy) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to destroy v2 B-tree 'top' proxy")
+        hdr->top_proxy = NULL;
+    } /* end if */
+
     /* Free B-tree header info */
     hdr = H5FL_FREE(H5B2_hdr_t, hdr);
 
diff --git a/src/H5B2int.c b/src/H5B2int.c
index 3e3c487..c72bc98 100644
--- a/src/H5B2int.c
+++ b/src/H5B2int.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -37,16 +35,13 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5B2pkg.h"		/* v2 B-trees				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5MFprivate.h"	/* File memory management		*/
-#include "H5MMprivate.h"	/* Memory management			*/
 #include "H5VMprivate.h"	/* Vectors and arrays 			*/
 
+
 /****************/
 /* Local Macros */
 /****************/
 
-/* Uncomment this macro to enable extra sanity checking */
-/* #define H5B2_DEBUG */
 
 /******************/
 /* Local Typedefs */
@@ -61,48 +56,15 @@
 /********************/
 /* Local Prototypes */
 /********************/
+static herr_t H5B2__update_child_flush_depends(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned depth, const H5B2_node_ptr_t *node_ptrs, unsigned start_idx,
+    unsigned end_idx, void *old_parent, void *new_parent);
 
-/* Helper functions */
-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, uint16_t depth,
-    H5B2_internal_t *internal, unsigned idx);
-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, 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, 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, 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,
-    hbool_t *was_shadowed);
-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 *was_shadowed);
-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);
-#endif /* H5B2_DEBUG */
 
 /*********************/
 /* Package Variables */
 /*********************/
 
-/* Declare a free list to manage the H5B2_internal_t struct */
-H5FL_DEFINE(H5B2_internal_t);
-
-/* Declare a free list to manage the H5B2_leaf_t struct */
-H5FL_DEFINE(H5B2_leaf_t);
-
 
 /*****************************/
 /* Library Private Variables */
@@ -141,7 +103,7 @@ H5FL_SEQ_EXTERN(H5B2_node_info_t);
  */
 herr_t
 H5B2__locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
-                    const uint8_t *native, const void *udata, unsigned *idx, int *cmp)
+    const uint8_t *native, const void *udata, unsigned *idx, int *cmp)
 {
     unsigned	lo = 0, hi;     /* Low & high index values */
     unsigned    my_idx = 0;     /* Final index value */
@@ -183,7 +145,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+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)
@@ -191,19 +153,15 @@ H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     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_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -227,21 +185,15 @@ H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_INT;
-        left_addr = internal->node_ptrs[idx].addr;
-        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Protect both leaves */
-        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)))
+        /* (Shadow left node if doing SWMR writes) */
+        if(NULL == (left_int = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_int = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], (uint16_t)(depth - 1), FALSE, 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, NULL) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
-            left_addr = internal->node_ptrs[idx].addr;
-        } /* end if */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_int;
@@ -263,21 +215,15 @@ H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_LEAF;
-        left_addr = internal->node_ptrs[idx].addr;
-        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Protect both leaves */
-        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
+        /* (Shadow the left node if doing SWMR writes) */
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], FALSE, 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, NULL) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
-            left_addr = internal->node_ptrs[idx].addr;
-        } /* end if */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_leaf;
@@ -317,6 +263,7 @@ H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
 
@@ -350,64 +297,11 @@ H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+    /* Update flush dependencies for grandchildren, if using SWMR */
+    if(hdr->swmr_write && depth > 1)
+        if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, right_node_ptrs,
+                0, (unsigned)(*right_nrec + 1), left_child, right_child) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
 #ifdef H5B2_DEBUG
     H5B2__assert_internal((hsize_t)0, hdr, internal);
@@ -428,17 +322,6 @@ 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() */
 
@@ -502,7 +385,7 @@ H5B2__split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
         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, hdr->root.node_nrec, hdr->depth, H5AC__NO_FLAGS_SET)))
+    if(NULL == (new_root = H5B2__protect_internal(hdr, dxpl_id, hdr, &hdr->root, hdr->depth, FALSE, 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 */
@@ -535,25 +418,21 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+herr_t
 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_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -566,24 +445,15 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_INT;
-        left_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        /* (Shadow both nodes if doing SWMR writes) */
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], (uint16_t)(depth - 1), hdr->swmr_write, 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_internal;
@@ -601,24 +471,15 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_LEAF;
-        left_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
+        /* (Shadow both nodes if doing SWMR writes) */
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], hdr->swmr_write, 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_leaf;
@@ -664,6 +525,7 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
 
             /* Count the number of records being moved */
             for(u = 0; u < move_nrec; u++)
@@ -678,64 +540,11 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
             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 flush dependencies for grandchildren, if using SWMR */
+        if(hdr->swmr_write && depth > 1)
+            if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, left_node_ptrs,
+                    (unsigned)(*left_nrec + 1), (unsigned)(*left_nrec + move_nrec + 1), right_child, left_child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
         /* Update number of records in child nodes */
         *left_nrec = (uint16_t)(*left_nrec + move_nrec);
@@ -772,6 +581,7 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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));
@@ -786,64 +596,11 @@ H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
             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 flush dependencies for grandchildren, if using SWMR */
+        if(hdr->swmr_write && depth > 1)
+            if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, right_node_ptrs,
+                    0, (unsigned)move_nrec, left_child, right_child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
         /* Update number of records in child nodes */
         *left_nrec = new_left_nrec;
@@ -887,13 +644,6 @@ 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__redistribute2() */
 
@@ -912,7 +662,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+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)
 {
@@ -923,9 +673,6 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
@@ -934,10 +681,9 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -952,30 +698,18 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_INT;
-        left_addr = internal->node_ptrs[idx - 1].addr;
-        middle_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx - 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        /* (Shadow all nodes if doing SWMR writes) */
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx - 1], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        if(NULL == (middle_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        middle_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], (uint16_t)(depth - 1), hdr->swmr_write, 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, NULL) < 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_internal;
@@ -998,30 +732,18 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_LEAF;
-        left_addr = internal->node_ptrs[idx - 1].addr;
-        middle_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx - 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        /* (Shadow all nodes if doing SWMR writes) */
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx - 1], hdr->swmr_write, 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, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        if(NULL == (middle_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        middle_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], hdr->swmr_write, 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, NULL) < 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for child nodes */
         left_child = left_leaf;
@@ -1070,8 +792,9 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+                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);
@@ -1087,64 +810,11 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+            if(hdr->swmr_write && depth > 1)
+                if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, left_node_ptrs,
+                        (unsigned)(*left_nrec + 1), (unsigned)(*left_nrec + moved_middle_nrec + 1), middle_child, left_child) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec - moved_middle_nrec);
@@ -1173,7 +843,8 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+                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));
@@ -1188,64 +859,11 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+            if(hdr->swmr_write && depth > 1)
+                if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, right_node_ptrs,
+                        0, (unsigned)right_nrec_move, middle_child, right_child) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec - right_nrec_move);
@@ -1274,7 +892,8 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+                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));
@@ -1289,64 +908,11 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+            if(hdr->swmr_write && depth > 1)
+                if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, middle_node_ptrs,
+                        0, (unsigned)left_nrec_move, left_child, middle_child) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec + left_nrec_move);
@@ -1374,7 +940,8 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+                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);
@@ -1389,64 +956,11 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
+            /* Update flush dependencies for grandchildren, if using SWMR */
+            if(hdr->swmr_write && depth > 1)
+                if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, middle_node_ptrs,
+                        (unsigned)(curr_middle_nrec + 1), (unsigned)(curr_middle_nrec + right_nrec_move + 1), right_child, middle_child) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
             /* Mark nodes as dirty */
             middle_child_flags |= H5AC__DIRTIED_FLAG;
@@ -1479,46 +993,6 @@ H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     /* Mark parent as dirty */
     *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
 
-#ifdef QAK
-{
-    unsigned u;
-
-    HDfprintf(stderr, "%s: Internal records:\n", FUNC);
-    for(u = 0; u < internal->nrec; u++) {
-        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
-        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_INT_NREC(internal, hdr, u), NULL);
-    } /* end for */
-
-    HDfprintf(stderr, "%s: Left Child records:\n", FUNC);
-    for(u = 0; u < *left_nrec; u++) {
-        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
-        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(left_native, hdr, u), NULL);
-    } /* end for */
-
-    HDfprintf(stderr, "%s: Middle Child records:\n", FUNC);
-    for(u = 0; u < *middle_nrec; u++) {
-        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
-        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(middle_native, hdr, u), NULL);
-    } /* end for */
-
-    HDfprintf(stderr, "%s: Right Child records:\n", FUNC);
-    for(u = 0; u < *right_nrec; u++) {
-        HDfprintf(stderr, "%s: u = %u\n", FUNC, u);
-        (hdr->cls->debug)(stderr, hdr->f, dxpl_id, 3, 4, H5B2_NAT_NREC(right_native, hdr, u), NULL);
-    } /* end for */
-
-    for(u = 0; u < internal->nrec + 1; u++)
-        HDfprintf(stderr, "%s: internal->node_ptrs[%u] = (%Hu/%u/%a)\n", FUNC, u, internal->node_ptrs[u].all_nrec, internal->node_ptrs[u].node_nrec, internal->node_ptrs[u].addr);
-    if(depth > 1) {
-        for(u = 0; u < *left_nrec + 1; u++)
-            HDfprintf(stderr, "%s: left_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, left_node_ptrs[u].all_nrec, left_node_ptrs[u].node_nrec, left_node_ptrs[u].addr);
-        for(u = 0; u < *middle_nrec + 1; u++)
-            HDfprintf(stderr, "%s: middle_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, middle_node_ptrs[u].all_nrec, middle_node_ptrs[u].node_nrec, middle_node_ptrs[u].addr);
-        for(u = 0; u < *right_nrec + 1; u++)
-            HDfprintf(stderr, "%s: right_node_ptr[%u] = (%Hu/%u/%a)\n", FUNC, u, right_node_ptrs[u].all_nrec, right_node_ptrs[u].node_nrec, right_node_ptrs[u].addr);
-    } /* end if */
-}
-#endif /* QAK */
 #ifdef H5B2_DEBUG
     H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
@@ -1543,13 +1017,6 @@ 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() */
 
@@ -1569,7 +1036,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+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)
@@ -1577,17 +1044,13 @@ H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     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_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1602,21 +1065,15 @@ H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_INT;
-        left_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        /* (Shadow the left node if doing SWMR writes) */
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], (uint16_t)(depth - 1), FALSE, 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, NULL) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
-            left_addr = internal->node_ptrs[idx].addr;
-        } /* end if */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for accessing child node information */
         left_child = left_internal;
@@ -1634,21 +1091,15 @@ H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_LEAF;
-        left_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
+        /* (Shadow the left node if doing SWMR writes) */
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], FALSE, 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, NULL) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
-            left_addr = internal->node_ptrs[idx].addr;
-        } /* end if */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for accessing child node information */
         left_child = left_leaf;
@@ -1671,64 +1122,11 @@ H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+        if(hdr->swmr_write && depth > 1)
+            if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, left_node_ptrs,
+                    (unsigned)(*left_nrec + 1), (unsigned)(*left_nrec + *right_nrec + 2), right_child, left_child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
         /* Update # of records in left node */
         *left_nrec = (uint16_t)(*left_nrec + *right_nrec + 1);
@@ -1782,13 +1180,6 @@ 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() */
 
@@ -1808,7 +1199,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+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)
@@ -1818,9 +1209,6 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 */
@@ -1830,10 +1218,9 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1849,27 +1236,18 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_INT;
-        left_addr = internal->node_ptrs[idx - 1].addr;
-        middle_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx - 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        /* (Shadow left and middle nodes if doing SWMR writes) */
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx - 1], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        if(NULL == (middle_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+        middle_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], (uint16_t)(depth - 1), FALSE, 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for accessing child node information */
         left_child = left_internal;
@@ -1892,27 +1270,18 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
 
         /* Setup information for unlocking child nodes */
         child_class = H5AC_BT2_LEAF;
-        left_addr = internal->node_ptrs[idx - 1].addr;
-        middle_addr = internal->node_ptrs[idx].addr;
-        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, internal->node_ptrs[idx - 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        /* (Shadow left and middle nodes if doing SWMR writes) */
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx - 1], hdr->swmr_write, 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, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
+        left_addr = internal->node_ptrs[idx - 1].addr;
+        if(NULL == (middle_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], hdr->swmr_write, 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, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
+        middle_addr = internal->node_ptrs[idx].addr;
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx + 1], FALSE, 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, NULL) < 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, NULL) < 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 */
+        right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* More setup for accessing child node information */
         left_child = left_leaf;
@@ -1948,6 +1317,7 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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);
@@ -1960,64 +1330,11 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+        if(hdr->swmr_write && depth > 1)
+            if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, left_node_ptrs,
+                    (unsigned)(*left_nrec + 1), (unsigned)(*left_nrec + middle_nrec_move + 1), middle_child, left_child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
         /* Update # of records in left & middle nodes */
         *left_nrec = (uint16_t)(*left_nrec + middle_nrec_move);
@@ -2041,64 +1358,11 @@ H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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 flush dependencies for grandchildren, if using SWMR */
+        if(hdr->swmr_write && depth > 1)
+            if(H5B2__update_child_flush_depends(hdr, dxpl_id, depth, middle_node_ptrs,
+                    (unsigned)(*middle_nrec + 1), (unsigned)(*middle_nrec + *right_nrec + 2), right_child, middle_child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child nodes to new parent")
 
         /* Update # of records in middle node */
         *middle_nrec = (uint16_t)(*middle_nrec + (*right_nrec + 1));
@@ -2160,110 +1424,12 @@ 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() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__swap_leaf
- *
- * Purpose:	Swap a record in a node with a record in a leaf node
- *
- * Return:	Success:	Non-negative
- *
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  4 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
-    haddr_t child_addr;                 /* Address of child node */
-    void *child = NULL;                 /* Pointer to child node */
-    uint8_t *child_native;              /* Pointer to child's native records */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(internal);
-    HDassert(internal_flags_ptr);
-    HDassert(idx <= internal->nrec);
-
-    /* Check for the kind of B-tree node to swap */
-    if(depth > 1) {
-        H5B2_internal_t *child_internal;        /* Pointer to internal node */
-
-        /* Setup information for unlocking child node */
-        child_class = H5AC_BT2_INT;
-        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, 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 */
-        child = child_internal;
-        child_native = child_internal->int_native;
-    } /* end if */
-    else {
-        H5B2_leaf_t *child_leaf;        /* Pointer to leaf node */
-
-        /* Setup information for unlocking child nodes */
-        child_class = H5AC_BT2_LEAF;
-        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, 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 */
-        child = child_leaf;
-        child_native = child_leaf->leaf_native;
-    } /* end else */
-
-    /* Swap records (use disk page as temporary buffer) */
-    HDmemcpy(hdr->page, H5B2_NAT_NREC(child_native, hdr, 0), hdr->cls->nrec_size);
-    HDmemcpy(H5B2_NAT_NREC(child_native, hdr, 0), swap_loc, hdr->cls->nrec_size);
-    HDmemcpy(swap_loc, hdr->page, hdr->cls->nrec_size);
-
-    /* Mark parent as dirty */
-    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
-
-#ifdef H5B2_DEBUG
-    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);
-    else
-        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)child);
-#endif /* H5B2_DEBUG */
-
-done:
-    /* Unlock child node */
-    if(child && H5AC_unprotect(hdr->f, dxpl_id, child_class, child_addr, child, H5AC__DIRTIED_FLAG) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__swap_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__insert_hdr
+ * Function:	H5B2__insert
  *
  * Purpose:	Adds a new record to the B-tree.
  *
@@ -2276,7 +1442,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2__insert_hdr(H5B2_hdr_t *hdr, hid_t dxpl_id, void *udata)
+H5B2__insert(H5B2_hdr_t *hdr, hid_t dxpl_id, void *udata)
 {
     herr_t	ret_value = SUCCEED;    /* Return value */
 
@@ -2315,2052 +1481,129 @@ H5B2__insert_hdr(H5B2_hdr_t *hdr, hid_t dxpl_id, void *udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__insert_hdr() */
+} /* H5B2__insert() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__insert_leaf
+ * 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.
  *
- * Purpose:	Adds a new record to a B-tree leaf node.
+ *              If the callback returns non-zero, the iteration breaks out
+ *              without finishing all the records.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Value from callback, non-negative on success, negative on error
  *
  * Programmer:	Quincey Koziol
  *		koziol at ncsa.uiuc.edu
- *		Mar  3 2005
+ *		Feb 11 2005
  *
  *-------------------------------------------------------------------------
  */
 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)
+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)
 {
-    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
-    unsigned leaf_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting the leaf node */
-    int         cmp;                    /* Comparison value of records */
-    unsigned    idx;                    /* Location of record which matches key */
-    herr_t	ret_value = SUCCEED;    /* Return value */
+    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_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
-    HDassert(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, parent, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree 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);
+    HDassert(curr_node);
+    HDassert(op);
 
-    /* Sanity check number of records */
-    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
-    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+    /* Protect current node & set up variables */
+    if(depth > 0) {
+        H5B2_internal_t *internal;     /* Pointer to internal node */
 
-    /* Check for inserting into empty leaf */
-    if(leaf->nrec == 0)
-        idx = 0;
-    else {
-        /* Find correct location to insert this record */
-        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-        if(cmp == 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
-        if(cmp > 0)
-            idx++;
-
-        /* Make room for new record */
-        if(idx < leaf->nrec)
-            HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx + 1), H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size * (leaf->nrec - idx));
-    } /* end else */
+        /* Lock the current B-tree node */
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, (H5B2_node_ptr_t *)curr_node, depth, FALSE, H5AC__READ_ONLY_FLAG))) /* Casting away const OK -QAK */
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
-    /* Make callback to store record in native form */
-    if((hdr->cls->store)(H5B2_LEAF_NREC(leaf, hdr, idx), udata) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into leaf node")
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_INT;
+        node = internal;
+        node_native = internal->int_native;
 
-    /* Mark the node as dirty */
-    leaf_flags |= H5AC__DIRTIED_FLAG;
+        /* Allocate space for the node pointers in memory */
+        if(NULL == (node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
 
-    /* Update record count for node pointer to current node */
-    curr_node_ptr->all_nrec++;
-    curr_node_ptr->node_nrec++;
-
-    /* Update record count for current node */
-    leaf->nrec++;
-
-    /* Check for new record being the min or max for the tree */
-    /* (Don't use 'else' for the idx check, to allow for root leaf node) */
-    if(H5B2_POS_MIDDLE != curr_pos) {
-        if(idx == 0) {
-            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->min_native_rec == NULL)
-                    if(NULL == (hdr->min_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
-                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
-                HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
-            } /* end if */
-        } /* end if */
-        if(idx == (unsigned)(leaf->nrec - 1)) {
-            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->max_native_rec == NULL)
-                    if(NULL == (hdr->max_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
-                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
-                HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
-            } /* end if */
-        } /* end if */
-    } /* end if */
-
-done:
-    /* Release the B-tree leaf node (marked as dirty) */
-    if(leaf) {
-        /* Shadow the node if doing SWMR writes */
-        if(hdr->swmr_write && (leaf_flags & H5AC__DIRTIED_FLAG))
-            if(H5B2__shadow_leaf(hdr, dxpl_id, curr_node_ptr, &leaf, NULL) < 0)
-                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf B-tree node")
-        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, leaf_flags) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__insert_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__insert_internal
- *
- * Purpose:	Adds a new record to a B-tree node.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  2 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
-    unsigned internal_flags = H5AC__NO_FLAGS_SET;
-    unsigned    idx;                    /* Location of record which matches key */
-    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(depth > 0);
-    HDassert(curr_node_ptr);
-    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, 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")
-
-    /* Sanity check number of records */
-    HDassert(internal->nrec == curr_node_ptr->node_nrec);
-
-    /* Split or redistribute child node pointers, if necessary */
-    {
-        int         cmp;        /* Comparison value of records */
-        unsigned retries;       /* Number of times to attempt redistribution */
-        size_t      split_nrec; /* Number of records to split node at */
-
-        /* Locate node pointer for child */
-        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                               udata, &idx, &cmp) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-        if(cmp == 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
-        if(cmp > 0)
-            idx++;
-
-        /* Set the number of redistribution retries */
-        /* This takes care of the case where a B-tree node needs to be
-         * redistributed, but redistributing the node causes the index
-         * for insertion to move to another node, which also needs to be
-         * redistributed.  Now, we loop trying to redistribute and then
-         * eventually force a split */
-        retries = 2;
-
-        /* Determine the correct number of records to split child node at */
-        split_nrec = hdr->node_info[depth - 1].split_nrec;
-
-        /* Preemptively split/redistribute a node we will enter */
-        while(internal->node_ptrs[idx].node_nrec == split_nrec) {
-            /* 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)
-                        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,
-                           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)
-                        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,
-                           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 { /* 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)
-                        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,
-                           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 else */
-
-            /* 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(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                                   udata, &idx, &cmp) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-            if(cmp == 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
-            if(cmp > 0)
-                idx++;
-
-            /* Decrement the number of redistribution retries left */
-            retries--;
-        } /* end while */
-    } /* end block */
-
-    /* Check if this node is left/right-most */
-    if(H5B2_POS_MIDDLE != curr_pos) {
-        if(idx == 0) {
-            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                next_pos = H5B2_POS_LEFT;
-        } /* end if */
-        else if(idx == internal->nrec) {
-            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                next_pos = H5B2_POS_RIGHT;
-        } /* end else */
-    } /* end if */
-
-    /* Attempt to insert node */
-    if(depth > 1) {
-        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, internal, udata) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
-    } /* end else */
-
-    /* Update record count for node pointer to current node */
-    curr_node_ptr->all_nrec++;
-
-    /* Mark node as dirty */
-    internal_flags |= H5AC__DIRTIED_FLAG;
-
-done:
-    /* Release the B-tree internal node */
-    if(internal) {
-        /* Shadow the node if doing SWMR writes */
-        if(hdr->swmr_write && (internal_flags & H5AC__DIRTIED_FLAG))
-            if(H5B2__shadow_internal(hdr, dxpl_id, depth, curr_node_ptr, &internal, NULL) < 0)
-                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal B-tree node")
-        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__insert_internal() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__update_leaf
- *
- * Purpose:	Insert or modify a record in a B-tree leaf node.
- *		If the record exists already, it is modified as if H5B2_modify
- *		was called).  If it doesn't exist, it is inserted as if
- *		H5B2_insert was called.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Dec 23 2015
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5B2__update_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
-    H5B2_update_status_t *status, H5B2_nodepos_t curr_pos, void *parent,
-    void *udata, H5B2_modify_t op, void *op_data)
-{
-    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
-    unsigned leaf_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting the leaf node */
-    int         cmp = -1;               /* Comparison value of records */
-    unsigned    idx;                    /* Location of record which matches key */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(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, 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 */
-    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
-    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
-
-    /* Check for inserting into empty leaf */
-    if(leaf->nrec == 0)
-        idx = 0;
-    else {
-        /* Find correct location to insert this record */
-        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-
-        /* Check for inserting a record */
-        if(0 != cmp) {
-            /* Check if the leaf node is full */
-            if(curr_node_ptr->node_nrec == hdr->node_info[0].split_nrec) {
-                /* Indicate that the leaf is full, but we need to insert */
-                *status = H5B2_UPDATE_INSERT_CHILD_FULL;
-
-                /* Let calling routine handle insertion */
-                HGOTO_DONE(SUCCEED)
-            } /* end if */
-
-            /* Adjust index to leave room for record to insert */
-            if(cmp > 0)
-                idx++;
-
-            /* Make room for new record */
-            if(idx < leaf->nrec)
-                HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx + 1), H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size * (leaf->nrec - idx));
-        } /* end if */
-    } /* end else */
-
-    /* Check for modifying existing record */
-    if(0 == cmp) {
-        hbool_t changed = FALSE;        /* Whether the 'modify' callback changed the record */
-
-        /* Make callback for current record */
-        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data, &changed) < 0) {
-            /* Make certain that the callback didn't modify the value if it failed */
-            HDassert(changed == FALSE);
-
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree update operation")
-        } /* end if */
-
-        /* Mark the node as dirty if it changed */
-        leaf_flags |= (changed ? H5AC__DIRTIED_FLAG : 0);
-
-        /* Indicate that the record was modified */
-        *status = H5B2_UPDATE_MODIFY_DONE;
-    } /* end if */
-    else {
-        /* 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);
-
-        /* Make callback to store record in native form */
-        if((hdr->cls->store)(H5B2_LEAF_NREC(leaf, hdr, idx), udata) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into leaf node")
-
-        /* Mark the node as dirty */
-        leaf_flags |= H5AC__DIRTIED_FLAG;
-
-        /* Indicate that the record was inserted */
-        *status = H5B2_UPDATE_INSERT_DONE;
-
-        /* Update record count for node pointer to current node */
-        curr_node_ptr->all_nrec++;
-        curr_node_ptr->node_nrec++;
-
-        /* Update record count for current node */
-        leaf->nrec++;
-    } /* end else */
-
-    /* Check for new record being the min or max for the tree */
-    /* (Don't use 'else' for the idx check, to allow for root leaf node) */
-    if(H5B2_POS_MIDDLE != curr_pos) {
-        if(idx == 0) {
-            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->min_native_rec == NULL)
-                    if(NULL == (hdr->min_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
-                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
-                HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
-            } /* end if */
-        } /* end if */
-        if(idx == (unsigned)(leaf->nrec - 1)) {
-            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->max_native_rec == NULL)
-                    if(NULL == (hdr->max_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
-                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
-                HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
-            } /* end if */
-        } /* end if */
-    } /* end if */
-
-done:
-    /* Release the B-tree leaf node */
-    if(leaf) {
-        /* Check if we should shadow this node */
-        if(hdr->swmr_write && (leaf_flags & H5AC__DIRTIED_FLAG)) {
-            hbool_t was_shadowed;       /* Whether the node was actually shadowed */
-
-            /* Attempt to shadow the node if doing SWMR writes */
-            if(H5B2__shadow_leaf(hdr, dxpl_id, curr_node_ptr, &leaf, &was_shadowed) < 0)
-                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf B-tree node")
-
-            /* Change the state to "shadowed" if only modified currently */
-            /* (Triggers parent to be marked dirty) */
-            if(*status == H5B2_UPDATE_MODIFY_DONE)
-                *status = H5B2_UPDATE_SHADOW_DONE;
-        } /* end if */
-        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, leaf_flags) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__update_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__update_internal
- *
- * Purpose:	Insert or modify a record in a B-tree leaf node.
- *		If the record exists already, it is modified as if H5B2_modify
- *		was called).  If it doesn't exist, it is inserted as if
- *		H5B2_insert was called.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Dec 24 2015
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5B2__update_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_update_status_t *status, H5B2_nodepos_t curr_pos, void *parent,
-    void *udata, H5B2_modify_t op, void *op_data)
-{
-    H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
-    unsigned internal_flags = H5AC__NO_FLAGS_SET;
-    int         cmp;                    /* Comparison value of records */
-    unsigned    idx;                    /* Location of record which matches key */
-    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(depth > 0);
-    HDassert(curr_node_ptr);
-    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, 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")
-
-    /* Sanity check number of records */
-    HDassert(internal->nrec == curr_node_ptr->node_nrec);
-
-    /* Locate node pointer for child */
-    if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-
-    /* Check for modifying existing record */
-    if(0 == cmp) {
-        hbool_t changed = FALSE;        /* Whether the 'modify' callback changed the record */
-
-        /* Make callback for current record */
-        if((op)(H5B2_INT_NREC(internal, hdr, idx), op_data, &changed) < 0) {
-            /* Make certain that the callback didn't modify the value if it failed */
-            HDassert(changed == FALSE);
-
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree update operation")
-        } /* end if */
-
-        /* Mark the node as dirty if it changed */
-        internal_flags |= (changed ? H5AC__DIRTIED_FLAG : 0);
-
-        /* Indicate that the record was modified */
-        *status = H5B2_UPDATE_MODIFY_DONE;
-    } /* end if */
-    else {
-        /* Adjust index to leave room for node to insert */
-        if(cmp > 0)
-            idx++;
-
-        /* Check if this node is left/right-most */
-        if(H5B2_POS_MIDDLE != curr_pos) {
-            if(idx == 0) {
-                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_LEFT;
-            } /* end if */
-            else if(idx == internal->nrec) {
-                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_RIGHT;
-            } /* end else */
-        } /* end if */
-
-        /* Attempt to update record in child */
-        if(depth > 1) {
-            if(H5B2__update_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &internal_flags, &internal->node_ptrs[idx], status, next_pos, internal, udata, op, op_data) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update record in internal B-tree node")
-        } /* end if */
-        else {
-            if(H5B2__update_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], status, next_pos, internal, udata, op, op_data) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update record in leaf B-tree node")
-        } /* end else */
-
-        /* Take actions based on child's status report */
-        switch(*status) {
-            case H5B2_UPDATE_MODIFY_DONE:
-                /* No action */
-                break;
-
-            case H5B2_UPDATE_SHADOW_DONE:
-                /* If child node was shadowed (if SWMR is enabled), mark this node dirty */
-                if(hdr->swmr_write)
-                    internal_flags |= H5AC__DIRTIED_FLAG;
-
-                /* No further modifications up the tree are necessary though, so downgrade to merely "modified" */
-                *status = H5B2_UPDATE_MODIFY_DONE;
-                break;
-
-            case H5B2_UPDATE_INSERT_DONE:
-                /* Mark node as dirty */
-                internal_flags |= H5AC__DIRTIED_FLAG;
-
-                /* Update total record count for node pointer to current node */
-                curr_node_ptr->all_nrec++;
-                break;
-
-            case H5B2_UPDATE_INSERT_CHILD_FULL:
-                /* Split/redistribute this node */
-                if(internal->nrec == hdr->node_info[depth].split_nrec) {
-                    hbool_t could_split = FALSE;        /* Whether the child node could split */
-
-#ifdef QAK
-HDfprintf(stderr, "%s: idx = %u, internal->nrec = %u\n", FUNC, idx, internal->nrec);
-HDfprintf(stderr, "%s: hdr->node_info[%u].split_nrec = %u\n", FUNC, (unsigned)depth, (unsigned)hdr->node_info[depth].split_nrec);
-HDfprintf(stderr, "%s: hdr->node_info[%u].split_nrec = %u\n", FUNC, (unsigned)(depth - 1), (unsigned)hdr->node_info[depth - 1].split_nrec);
-#endif /* QAK */
-                    if(idx == 0) {      /* Left-most child */
-#ifdef QAK
-HDfprintf(stderr, "%s: Left-most child\n", FUNC);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)idx, (unsigned)internal->node_ptrs[idx].node_nrec);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)(idx + 1), (unsigned)internal->node_ptrs[idx + 1].node_nrec);
-#endif /* QAK */
-                        /* Check for left-most child and its neighbor being close to full */
-                        if((internal->node_ptrs[idx].node_nrec + internal->node_ptrs[idx + 1].node_nrec)
-                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
-                            could_split = TRUE;
-                    } /* end if */
-                    else if(idx == internal->nrec) { /* Right-most child */
-#ifdef QAK
-HDfprintf(stderr, "%s: Right-most child\n", FUNC);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)(idx - 1), (unsigned)internal->node_ptrs[idx - 1].node_nrec);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)idx, (unsigned)internal->node_ptrs[idx].node_nrec);
-#endif /* QAK */
-                        /* Check for right-most child and its neighbor being close to full */
-                        if((internal->node_ptrs[idx - 1].node_nrec + internal->node_ptrs[idx].node_nrec)
-                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
-                            could_split = TRUE;
-                    } /* end else-if */
-                    else {              /* Middle child */
-#ifdef QAK
-HDfprintf(stderr, "%s: Middle child\n", FUNC);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)(idx - 1), (unsigned)internal->node_ptrs[idx - 1].node_nrec);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)idx, (unsigned)internal->node_ptrs[idx].node_nrec);
-HDfprintf(stderr, "%s: internal->node_ptrs[%u].node_nrec = %u\n", FUNC, (unsigned)(idx + 1), (unsigned)internal->node_ptrs[idx + 1].node_nrec);
-#endif /* QAK */
-                        /* Check for middle child and its left neighbor being close to full */
-                        if((internal->node_ptrs[idx - 1].node_nrec + internal->node_ptrs[idx].node_nrec)
-                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
-                            could_split = TRUE;
-                        /* Check for middle child and its right neighbor being close to full */
-                        else if((internal->node_ptrs[idx].node_nrec + internal->node_ptrs[idx + 1].node_nrec)
-                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
-                            could_split = TRUE;
-                    } /* end if */
-
-                    /* If this node is full and the child node insertion could
-                     *  cause a split, punt back up to caller, leaving the
-                     *  "insert child full" status.
-                     */
-                    if(could_split) {
-                        /* Release the internal B-tree node */
-                        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
-                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
-                        internal = NULL;
-
-#ifdef QAK
-HDfprintf(stderr, "%s: Punting back to caller\n", FUNC);
-#endif /* QAK */
-                        /* Punt back to caller */
-                        HGOTO_DONE(SUCCEED);
-                    } /* end if */
-                } /* end if */
-
-                /* Release the internal B-tree node */
-                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
-                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
-                internal = NULL;
-
-                /* Indicate that the record was inserted */
-                *status = H5B2_UPDATE_INSERT_DONE;
-
-                /* Dodge sideways into inserting a record into this node */
-                if(H5B2__insert_internal(hdr, dxpl_id, depth, parent_cache_info_flags_ptr, curr_node_ptr, curr_pos, parent, udata) < 0)
-                    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into internal B-tree node")
-                break;
-
-            case H5B2_UPDATE_UNKNOWN:
-            default:
-                HDassert(0 && "Invalid update status");
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "invalid update status")
-        } /* end switch */
-    } /* end else */
-
-done:
-    /* Release the internal B-tree node */
-    if(internal) {
-        /* Check if we should shadow this node */
-        if(hdr->swmr_write && (internal_flags & H5AC__DIRTIED_FLAG)) {
-            hbool_t was_shadowed;       /* Whether the node was actually shadowed */
-
-            /* Attempt to shadow the node if doing SWMR writes */
-            if(H5B2__shadow_internal(hdr, dxpl_id, depth, curr_node_ptr, &internal, &was_shadowed) < 0)
-                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal B-tree node")
-
-            /* Change the state to "shadowed" if only modified currently */
-            /* (Triggers parent to be marked dirty) */
-            if(*status == H5B2_UPDATE_MODIFY_DONE)
-                *status = H5B2_UPDATE_SHADOW_DONE;
-        } /* end if */
-        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__update_internal() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__create_leaf
- *
- * Purpose:	Creates empty leaf node of a B-tree and update node pointer
- *              to point to it.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb  2 2005
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-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_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(node_ptr);
-
-    /* Allocate memory for leaf information */
-    if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf info")
-
-    /* Set metadata cache info */
-    HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
-
-    /* Increment ref. count on B-tree header */
-    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 */
-    leaf->hdr = hdr;
-
-    /* Allocate space for the native keys in memory */
-    if(NULL == (leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[0].nat_rec_fac)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf native keys")
-    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")
-
-    /* Cache the new B-tree node */
-    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree leaf to cache")
-
-done:
-    if(ret_value < 0) {
-        if(leaf)
-            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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__protect_leaf
- *
- * Purpose:	"Protect" an leaf node in the metadata cache
- *
- * Return:	Pointer to leaf node on success/NULL on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		May  5 2010
- *
- *-------------------------------------------------------------------------
- */
-H5B2_leaf_t *
-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 = NULL;      /* Return value */
-
-    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, flags)))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree leaf node")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__protect_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__create_internal
- *
- * Purpose:	Creates empty internal node of a B-tree and update node pointer
- *              to point to it.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb  3 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_internal_t *internal = NULL;   /* Pointer to new internal node created */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(node_ptr);
-    HDassert(depth > 0);
-
-    /* Allocate memory for internal node information */
-    if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal info")
-
-    /* Set metadata cache info */
-    HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
-
-    /* Increment ref. count on B-tree header */
-    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 */
-    internal->hdr = hdr;
-
-    /* Allocate space for the native keys in memory */
-    if(NULL == (internal->int_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
-    HDmemset(internal->int_native, 0, hdr->cls->nrec_size * hdr->node_info[depth].max_nrec);
-
-    /* Allocate space for the node pointers in memory */
-    if(NULL == (internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
-    HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (hdr->node_info[depth].max_nrec + 1));
-
-    /* Set number of records & depth of the node */
-    internal->nrec = 0;
-    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)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree internal node")
-
-    /* Cache the new B-tree node */
-    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree internal node to cache")
-
-done:
-    if(ret_value < 0) {
-	if(internal)
-            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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__protect_internal
- *
- * Purpose:	"Protect" an internal node in the metadata cache
- *
- * Return:	Pointer to internal node on success/NULL on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug 25 2006
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_internal_cache_ud_t udata;     /* User data to pass through to cache 'deserialize' callback */
-    H5B2_internal_t *ret_value = NULL;  /* Return value */
-
-    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;
-    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, flags)))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree internal node")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__protect_internal() */
-
-

-/*-------------------------------------------------------------------------
- * 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.
- *
- *              If the callback returns non-zero, the iteration breaks out
- *              without finishing all the records.
- *
- * Return:	Value from callback, non-negative on success, negative on error
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 11 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    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_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(curr_node);
-    HDassert(op);
-
-    /* Protect current node & set up variables */
-    if(depth > 0) {
-        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, 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 */
-        curr_node_class = H5AC_BT2_INT;
-        node = internal;
-        node_native = internal->int_native;
-
-        /* Allocate space for the node pointers in memory */
-        if(NULL == (node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
-
-        /* Copy the node pointers */
-        HDmemcpy(node_ptrs, internal->node_ptrs, (sizeof(H5B2_node_ptr_t) * (size_t)(curr_node->node_nrec + 1)));
-    } /* 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, 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 */
-        curr_node_class = H5AC_BT2_LEAF;
-        node = leaf;
-        node_native = leaf->leaf_native;
-    } /* end else */
-
-    /* Allocate space for the native keys in memory */
-    if(NULL == (native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
-
-    /* Copy the native keys */
-    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, (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")
-    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, (uint16_t)(depth - 1), &(node_ptrs[u]), node, op, op_data)) < 0)
-                HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
-        } /* end if */
-
-        /* Make callback for current record */
-        if(!ret_value) {
-            if((ret_value = (op)(H5B2_NAT_NREC(native, hdr, u), op_data)) < 0)
-                HERROR(H5E_BTREE, H5E_CANTLIST, "iterator function failed");
-        } /* end if */
-    } /* end for */
-
-    /* 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, (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);
-    if(native)
-        native = (uint8_t *)H5FL_FAC_FREE(hdr->node_info[depth].nat_rec_fac, native);
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__iterate_node() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__remove_leaf
- *
- * Purpose:	Removes a record from a B-tree leaf node.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  3 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
-    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
-    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
-    unsigned    idx;                    /* Location of record which matches key */
-    int         cmp;                    /* Comparison value of records */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-
-    /* Lock current B-tree node */
-    leaf_addr = curr_node_ptr->addr;
-    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 */
-    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
-    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, &cmp) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-    if(cmp != 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
-
-    /* Check for invalidating the min/max record for the tree */
-    if(H5B2_POS_MIDDLE != curr_pos) {
-        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
-        if(idx == 0) {
-            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->min_native_rec)
-                    hdr->min_native_rec = H5MM_xfree(hdr->min_native_rec);
-            } /* end if */
-        } /* end if */
-        if(idx == (unsigned)(leaf->nrec - 1)) {
-            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->max_native_rec)
-                    hdr->max_native_rec = H5MM_xfree(hdr->max_native_rec);
-            } /* end if */
-        } /* end if */
-    } /* end if */
-
-    /* Make 'remove' callback if there is one */
-    if(op)
-        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
-
-    /* Update number of records in node */
-    leaf->nrec--;
-
-    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, NULL) < 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;
-        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;
-    } /* end else */
-
-    /* Update record count for parent of leaf node */
-    curr_node_ptr->node_nrec--;
-
-done:
-    /* Release the B-tree leaf node */
-    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__remove_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__remove_internal
- *
- * Purpose:	Removes a record from a B-tree node.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  3 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    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 */
-    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 */
-    size_t      merge_nrec;             /* Number of records to merge node at */
-    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(depth > 0);
-    HDassert(parent_cache_info);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-
-    /* Lock current B-tree node */
-    internal_addr = curr_node_ptr->addr;
-    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 */
-    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
-
-    /* Check for needing to collapse the root node */
-    /* (The root node is the only internal node allowed to have 1 record) */
-    if(internal->nrec == 1 &&
-            ((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,
-                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;
-        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;
-
-        /* Set pointers for advancing to child node */
-        new_cache_info = parent_cache_info;
-        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
-        new_node_ptr = curr_node_ptr;
-
-        /* Set flag to indicate root was collapsed */
-        collapsed_root = TRUE;
-
-        /* Indicate position of next node */
-        next_pos = H5B2_POS_ROOT;
-    } /* end if */
-    /* Merge or redistribute child node pointers, if necessary */
-    else {
-        unsigned idx;           /* Location of record which matches key */
-        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, NULL) < 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 {
-            if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                                   udata, &idx, &cmp) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-            if(cmp >= 0)
-                idx++;
-        } /* end else */
-
-        /* Set the number of redistribution retries */
-        /* This takes care of the case where a B-tree node needs to be
-         * redistributed, but redistributing the node causes the index
-         * for removal to move to another node, which also needs to be
-         * redistributed.  Now, we loop trying to redistribute and then
-         * eventually force a merge */
-        retries = 2;
-
-        /* Preemptively merge/redistribute a node we will enter */
-        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
-            /* Attempt to redistribute records among children */
-            /* (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)
-             */
-            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)
-                        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,
-                           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)
-                        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,
-                           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 */
-            } /* end if */
-            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)
-                        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,
-                           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 else */
-
-            /* Locate node pointer for child (after merge/redistribute) */
-            if(swap_loc)
-                idx = 0;
-            else {
-/* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
-                if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
-                    HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-                if(cmp >= 0)
-                    idx++;
-            } /* end else */
-
-            /* Decrement the number of redistribution retries left */
-            retries--;
-        } /* end while */
-
-        /* Handle deleting a record from an internal node */
-        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)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "Can't swap records in B-tree")
-
-        /* Set pointers for advancing to child node */
-        new_cache_info_flags_ptr = &internal_flags;
-        new_cache_info = &internal->cache_info;
-        new_node_ptr = &internal->node_ptrs[idx];
-
-        /* Indicate position of next node */
-        if(H5B2_POS_MIDDLE != curr_pos) {
-            if(idx == 0) {
-                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_LEFT;
-            } /* end if */
-            else if(idx == internal->nrec) {
-                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_RIGHT;
-            } /* end if */
-        } /* end if */
-    } /* end else */
-
-    /* Attempt to remove record from child node */
-    if(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, 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 */
-
-    /* Update record count for node pointer to current node */
-    if(!collapsed_root)
-        new_node_ptr->all_nrec--;
-
-    /* Mark node as dirty */
-    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);
-#endif /* H5B2_DEBUG */
-
-done:
-    /* Release the B-tree internal node */
-    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() */
-
-

-/*-------------------------------------------------------------------------
- * 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.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Nov 14 2006
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
-    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
-    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-
-    /* Lock B-tree leaf node */
-    leaf_addr = curr_node_ptr->addr;
-    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 */
-    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
-    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
-    HDassert(idx < leaf->nrec);
-
-    /* Check for invalidating the min/max record for the tree */
-    if(H5B2_POS_MIDDLE != curr_pos) {
-        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
-        if(idx == 0) {
-            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->min_native_rec)
-                    hdr->min_native_rec = H5MM_xfree(hdr->min_native_rec);
-            } /* end if */
-        } /* end if */
-        if(idx == (unsigned)(leaf->nrec - 1)) {
-            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
-                if(hdr->max_native_rec)
-                    hdr->max_native_rec = H5MM_xfree(hdr->max_native_rec);
-            } /* end if */
-        } /* end if */
-    } /* end if */
-
-    /* Make 'remove' callback if there is one */
-    if(op)
-        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
-
-    /* Update number of records in node */
-    leaf->nrec--;
-
-    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, NULL) < 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;
-        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;
-    } /* end else */
-
-    /* Update record count for parent of leaf node */
-    curr_node_ptr->node_nrec--;
-
-done:
-    /* Release the B-tree leaf node */
-    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__remove_leaf_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
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Nov 14 2006
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    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;
-    haddr_t internal_addr;              /* Address of internal node */
-    size_t      merge_nrec;             /* Number of records to merge node at */
-    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
-    herr_t	ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(depth > 0);
-    HDassert(parent_cache_info);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-
-    /* Lock current B-tree node */
-    internal_addr = curr_node_ptr->addr;
-    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);
-
-    /* Determine the correct number of records to merge at */
-    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
-
-    /* Check for needing to collapse the root node */
-    /* (The root node is the only internal node allowed to have 1 record) */
-    if(internal->nrec == 1 &&
-            ((internal->node_ptrs[0].node_nrec + internal->node_ptrs[1].node_nrec) <= ((merge_nrec * 2) + 1))) {
-        HDassert(depth == hdr->depth);
-
-        /* Merge children of root node */
-        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;
-        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;
-
-        /* Set pointers for advancing to child node */
-        new_cache_info = parent_cache_info;
-        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
-        new_node_ptr = curr_node_ptr;
-
-        /* Set flag to indicate root was collapsed */
-        collapsed_root = TRUE;
-
-        /* Indicate position of next node */
-        next_pos = H5B2_POS_ROOT;
-    } /* end if */
-    /* Merge or redistribute child node pointers, if necessary */
-    else {
-        hsize_t orig_n = n;     /* Original index looked for */
-        unsigned idx;           /* Location of record which matches key */
-        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, NULL) < 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 {
-            /* Search for record with correct index */
-            for(idx = 0; idx < internal->nrec; idx++) {
-                /* Check which child node contains indexed record */
-                if(internal->node_ptrs[idx].all_nrec >= n) {
-                    /* Check if record is in this node */
-                    if(internal->node_ptrs[idx].all_nrec == n) {
-                        /* Indicate the record was found and that the index
-                         *      in child nodes is zero from now on
-                         */
-                        found = TRUE;
-                        n = 0;
-
-                        /* Increment to next record */
-                        idx++;
-                    } /* end if */
-
-                    /* Break out of loop early */
-                    break;
-                } /* end if */
-
-                /* Decrement index we are looking for to account for the node we
-                 * just advanced past.
-                 */
-                n -= (internal->node_ptrs[idx].all_nrec + 1);
-            } /* end for */
-        } /* end else */
-
-        /* Set the number of redistribution retries */
-        /* This takes care of the case where a B-tree node needs to be
-         * redistributed, but redistributing the node causes the index
-         * for removal to move to another node, which also needs to be
-         * redistributed.  Now, we loop trying to redistribute and then
-         * eventually force a merge */
-        retries = 2;
-
-        /* Preemptively merge/redistribute a node we will enter */
-        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
-            /* Attempt to redistribute records among children */
-            /* (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)
-             */
-            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)
-                        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,
-                           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)
-                        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,
-                           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 */
-            } /* end if */
-            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)
-                        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,
-                           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 else */
-
-            /* Locate node pointer for child (after merge/redistribute) */
-            if(swap_loc)
-                idx = 0;
-            else {
-                /* Count from the orginal index value again */
-                n = orig_n;
-
-                /* Reset "found" flag - the record may have shifted during the
-                 *      redistribute/merge
-                 */
-                found = FALSE;
-
-                /* Search for record with correct index */
-                for(idx = 0; idx < internal->nrec; idx++) {
-                    /* Check which child node contains indexed record */
-                    if(internal->node_ptrs[idx].all_nrec >= n) {
-                        /* Check if record is in this node */
-                        if(internal->node_ptrs[idx].all_nrec == n) {
-                            /* Indicate the record was found and that the index
-                             *      in child nodes is zero from now on
-                             */
-                            found = TRUE;
-                            n = 0;
-
-                            /* Increment to next record */
-                            idx++;
-                        } /* end if */
-
-                        /* Break out of loop early */
-                        break;
-                    } /* end if */
-
-                    /* Decrement index we are looking for to account for the node we
-                     * just advanced past.
-                     */
-                    n -= (internal->node_ptrs[idx].all_nrec + 1);
-                } /* end for */
-            } /* end else */
-
-            /* Decrement the number of redistribution retries left */
-            retries--;
-        } /* end while */
-
-        /* Handle deleting a record from an internal node */
-        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)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "can't swap records in B-tree")
-
-        /* Set pointers for advancing to child node */
-        new_cache_info_flags_ptr = &internal_flags;
-        new_cache_info = &internal->cache_info;
-        new_node_ptr = &internal->node_ptrs[idx];
-
-        /* Indicate position of next node */
-        if(H5B2_POS_MIDDLE != curr_pos) {
-            if(idx == 0) {
-                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_LEFT;
-            } /* end if */
-            else if(idx == internal->nrec) {
-                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
-                    next_pos = H5B2_POS_RIGHT;
-            } /* end if */
-        } /* end if */
-    } /* end else */
-
-    /* Attempt to remove record from child node */
-    if(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, 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 */
-
-    /* Update record count for node pointer to child node */
-    if(!collapsed_root)
-        new_node_ptr->all_nrec--;
-
-    /* Mark node as dirty */
-    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);
-#endif /* H5B2_DEBUG */
-
-done:
-    /* Release the B-tree internal node */
-    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() */
-
-

-/*-------------------------------------------------------------------------
- * 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
- *              fields of the
- *              caller-supplied UDATA pointer depending on the type of leaf node
- *		requested.  The UDATA can point to additional data passed
- *		to the key comparison function.
- *
- *              The 'OP' routine is called with the record found and the
- *              OP_DATA pointer, to allow caller to return information about
- *              the record.
- *
- *              The RANGE indicates whether to search for records less than or
- *              equal to, or greater than or equal to the information passed
- *              in with UDATA.
- *
- * Return:	Non-negative on success, negative on failure.
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  9 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5B2_leaf_t *leaf;                  /* Pointer to leaf 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_PACKAGE
-
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-    HDassert(op);
-
-    /* Lock current B-tree node */
-    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 */
-    if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-    if(cmp > 0)
-        idx++;
-    else
-        if(cmp == 0 && comp == H5B2_COMPARE_GREATER)
-            idx++;
-
-    /* Set the neighbor location, if appropriate */
-    if(comp == H5B2_COMPARE_LESS) {
-        if(idx > 0)
-            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx - 1);
-    } /* end if */
-    else {
-        HDassert(comp == H5B2_COMPARE_GREATER);
-
-        if(idx < leaf->nrec)
-            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx);
-    } /* end else */
-
-    /* Make callback if neighbor record has been found */
-    if(neighbor_loc) {
-        /* Make callback for current record */
-        if((op)(neighbor_loc, op_data) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree neighbor operation")
-    } /* end if */
-    else
-        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree")
-
-done:
-    /* Release the B-tree internal node */
-    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__neighbor_leaf() */
-
-

-/*-------------------------------------------------------------------------
- * 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
- *              fields of the
- *              caller-supplied UDATA pointer depending on the type of leaf node
- *		requested.  The UDATA can point to additional data passed
- *		to the key comparison function.
- *
- *              The 'OP' routine is called with the record found and the
- *              OP_DATA pointer, to allow caller to return information about
- *              the record.
- *
- *              The RANGE indicates whether to search for records less than or
- *              equal to, or greater than or equal to the information passed
- *              in with UDATA.
- *
- * Return:	Non-negative on success, negative on failure.
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  9 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    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 */
+        /* Copy the node pointers */
+        HDmemcpy(node_ptrs, internal->node_ptrs, (sizeof(H5B2_node_ptr_t) * (size_t)(curr_node->node_nrec + 1)));
+    } /* end if */
+    else {
+        H5B2_leaf_t *leaf;             /* Pointer to leaf node */
 
-    FUNC_ENTER_PACKAGE
+        /* Lock the current B-tree node */
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, (H5B2_node_ptr_t *)curr_node, FALSE, H5AC__READ_ONLY_FLAG)))   /* Casting away const OK -QAK */
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
-    /* Check arguments. */
-    HDassert(hdr);
-    HDassert(depth > 0);
-    HDassert(curr_node_ptr);
-    HDassert(H5F_addr_defined(curr_node_ptr->addr));
-    HDassert(op);
+        /* Set up information about current node */
+        curr_node_class = H5AC_BT2_LEAF;
+        node = leaf;
+        node_native = leaf->leaf_native;
+    } /* end else */
 
-    /* Lock current B-tree node */
-    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")
+    /* Allocate space for the native keys in memory */
+    if(NULL == (native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
 
-    /* Locate node pointer for child */
-    if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
-                           udata, &idx, &cmp) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
-    if(cmp > 0)
-        idx++;
-
-    /* Set the neighbor location, if appropriate */
-    if(comp == H5B2_COMPARE_LESS) {
-        if(idx > 0)
-            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
-    } /* end if */
-    else {
-        HDassert(comp == H5B2_COMPARE_GREATER);
+    /* Copy the native keys */
+    HDmemcpy(native, node_native, (hdr->cls->nrec_size * curr_node->node_nrec));
 
-        if(idx < internal->nrec)
-            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx);
-    } /* end else */
+    /* Unlock the node */
+    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")
+    if(hdr->swmr_write)
+        node_pinned = TRUE;
+    else
+        node = NULL;
 
-    /* Attempt to find neighboring record */
-    if(depth > 1) {
-        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")
+    /* 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, (uint16_t)(depth - 1), &(node_ptrs[u]), node, op, op_data)) < 0)
+                HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
+        } /* end if */
+
+        /* Make callback for current record */
+        if(!ret_value) {
+            if((ret_value = (op)(H5B2_NAT_NREC(native, hdr, u), op_data)) < 0)
+                HERROR(H5E_BTREE, H5E_CANTLIST, "iterator function failed");
+        } /* end if */
+    } /* end for */
+
+    /* 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, (uint16_t)(depth - 1), &(node_ptrs[u]), node, op, op_data)) < 0)
+            HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
     } /* end if */
-    else {
-        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 */
 
 done:
-    /* Release the B-tree internal node */
-    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+    /* 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);
+    if(native)
+        native = (uint8_t *)H5FL_FAC_FREE(hdr->node_info[depth].nat_rec_fac, native);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__neighbor_internal() */
+} /* H5B2__iterate_node() */
 
 

 /*-------------------------------------------------------------------------
@@ -4398,7 +1641,7 @@ H5B2__delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
         unsigned u;                    /* Local index */
 
         /* Lock the current B-tree node */
-        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, depth, H5AC__NO_FLAGS_SET)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, (H5B2_node_ptr_t *)curr_node, depth, FALSE, H5AC__NO_FLAGS_SET)))   /* Casting away const OK -QAK */
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
         /* Set up information about current node */
@@ -4415,7 +1658,7 @@ H5B2__delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t 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, parent, curr_node->node_nrec, H5AC__NO_FLAGS_SET)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, (H5B2_node_ptr_t *)curr_node, FALSE, H5AC__NO_FLAGS_SET)))     /* Casting away const OK -QAK */
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Set up information about current node */
@@ -4474,7 +1717,7 @@ H5B2__node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     HDassert(depth > 0);
 
     /* Lock the current B-tree node */
-    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, depth, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, (H5B2_node_ptr_t *)curr_node, depth, FALSE, H5AC__READ_ONLY_FLAG)))     /* Casting away const OK -QAK */
         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 */
@@ -4501,473 +1744,175 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__internal_free
+ * Function:    H5B2__create_flush_depend
  *
- * Purpose:	Destroys a B-tree internal node in memory.
+ * Purpose:     Create a flush dependency between two data structure components
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:  Dana Robinson
+ *              Fall 2012
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2__internal_free(H5B2_internal_t *internal)
+H5B2__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_PACKAGE
-
-    /*
-     * Check arguments.
-     */
-    HDassert(internal);
-
-    /* Release internal node's native key buffer */
-    if(internal->int_native)
-        internal->int_native = (uint8_t *)H5FL_FAC_FREE(internal->hdr->node_info[internal->depth].nat_rec_fac, internal->int_native);
-
-    /* Release internal node's node pointer buffer */
-    if(internal->node_ptrs)
-        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)
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
 
-    /* Free B-tree internal node info */
-    internal = H5FL_FREE(H5B2_internal_t, internal);
+    /* 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__internal_free() */
+} /* end H5B2__create_flush_depend() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__leaf_free
+ * Function:    H5B2__update_flush_depend
  *
- * Purpose:	Destroys a B-tree leaf node in memory.
+ * Purpose:     Update flush dependencies for children of a node
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:  Quincey Koziol
+ *		koziol at lbl.gov
+ *		Dec  1 2016
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2__leaf_free(H5B2_leaf_t *leaf)
+H5B2__update_flush_depend(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *node_ptr, void *old_parent, void *new_parent)
 {
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    void *child = NULL;                 /* Pointer to child node */
+    unsigned node_status = 0;           /* Node's status in the metadata cache */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
-
-    /*
-     * Check arguments.
-     */
-    HDassert(leaf);
-
-    /* Release leaf's native key buffer */
-    if(leaf->leaf_native)
-        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)
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
-
-    /* Free B-tree leaf node info */
-    leaf = H5FL_FREE(H5B2_leaf_t, leaf);
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* 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 *was_shadowed)
-{
-    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.
-     */
+    
+    /* Sanity checks */
     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, H5AC_ind_read_dxpl_id) < 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;
-
-        /* Indicate that the node was shadowed to parent */
-        if(was_shadowed)
-            *was_shadowed = TRUE;
-    } /* end if */
-    else {
-        /* Indicate that the node was _not_ shadowed to parent */
-        if(was_shadowed)
-            *was_shadowed = FALSE;
-    } /* end else */
-
-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 */
+    HDassert(node_ptr);
+    HDassert(old_parent);
+    HDassert(new_parent);
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__shadow_internal() */
+    /* Check the node's entry status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, node_ptr->addr, &node_status) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to check status of B-tree node")
 
-

-/*-------------------------------------------------------------------------
- * 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 *was_shadowed)
-{
-    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 */
+    /* If the node is in the cache, check for retargeting its parent */
+    if(node_status & H5AC_ES__IN_CACHE) {
+        void **parent_ptr;                  /* Pointer to child node's parent */
+        hbool_t update_deps = FALSE;        /* Whether to update flush dependencies */
 
-    FUNC_ENTER_STATIC
+        /* Get child node pointer */
+        if(depth > 1) {
+            H5B2_internal_t *child_int;
 
-    /*
-     * 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;
+            /* Protect child */
+            if(NULL == (child_int = H5B2__protect_internal(hdr, dxpl_id, new_parent, (H5B2_node_ptr_t *)node_ptr, (uint16_t)(depth - 1), FALSE, H5AC__NO_FLAGS_SET)))      /* Casting away const OK -QAK */
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+            child_class = H5AC_BT2_INT;
+            child = child_int;
 
-        /* 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;
+            if(child_int->parent == old_parent) {
+                parent_ptr = &child_int->parent;
+                update_deps = TRUE;
+            } /* end if */
+            else
+                HDassert(child_int->parent == new_parent);
+        } /* end if */
+        else {
+            H5B2_leaf_t *child_leaf;
 
-        /* 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, H5AC_ind_read_dxpl_id) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTMOVE, FAIL, "unable to move B-tree node")
-        curr_node_ptr->addr = new_node_addr;
+            /* Protect child */
+            if(NULL == (child_leaf = H5B2__protect_leaf(hdr, dxpl_id, new_parent, (H5B2_node_ptr_t *)node_ptr, FALSE, H5AC__NO_FLAGS_SET)))    /* Casting away const OK -QAK */
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+            child_class = H5AC_BT2_LEAF;
+            child = child_leaf;
 
-        /* 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;
+            if(child_leaf->parent == old_parent) {
+                parent_ptr = &child_leaf->parent;
+                update_deps = TRUE;
+            } /* end if */
+            else
+                HDassert(child_leaf->parent == new_parent);
+        } /* end else */
 
-        /* Add node to shadowed node list */
-        if(hdr->shadowed_leaf) {
-            (*leaf)->shadowed_next = hdr->shadowed_leaf;
-            hdr->shadowed_leaf->shadowed_prev = *leaf;
+        /* Update flush dependencies if necessary */
+        if(update_deps) {
+            /* Sanity check */
+            HDassert(parent_ptr);
+
+            /* Switch the flush dependency for the node */
+            if(H5B2__destroy_flush_depend((H5AC_info_t *)old_parent, (H5AC_info_t *)child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+            *parent_ptr = new_parent;
+            if(H5B2__create_flush_depend((H5AC_info_t *)new_parent, (H5AC_info_t *)child) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
         } /* end if */
-        else
-            (*leaf)->shadowed_next = *leaf;
-        hdr->shadowed_leaf = *leaf;
-
-        /* Indicate that the node was shadowed to parent */
-        if(was_shadowed)
-            *was_shadowed = TRUE;
     } /* end if */
-    else {
-        /* Indicate that the node was _not_ shadowed to parent */
-        if(was_shadowed)
-            *was_shadowed = FALSE;
-    } /* end else */
 
 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 */
+    /* Unprotect the child */
+    if(child)
+        if(H5AC_unprotect(hdr->f, dxpl_id, child_class, node_ptr->addr, child, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__shadow_leaf() */
-
-#ifdef H5B2_DEBUG
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__assert_leaf
- *
- * Purpose:	Verify than a leaf node is mostly sane
- *
- * Return:	Non-negative on success, negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 19 2005
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__assert_leaf2
- *
- * Purpose:	Verify than a leaf node is mostly sane
- *
- * Return:	Non-negative on success, negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 19 2005
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__assert_internal
- *
- * Purpose:	Verify than an internal node is mostly sane
- *
- * Return:	Non-negative on success, negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 19 2005
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-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 */
-
-    /* General sanity checking on node */
-    HDassert(internal->nrec <= hdr->node_info->split_nrec);
-
-    /* Sanity checking on node pointers */
-    tot_all_nrec = internal->nrec;
-    for(u = 0; u < internal->nrec + 1; u++) {
-        tot_all_nrec += internal->node_ptrs[u].all_nrec;
-
-        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
-        HDassert(internal->node_ptrs[u].addr > 0);
-        for(v = 0; v < u; v++)
-            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
-    } /* end for */
-
-    /* Sanity check all_nrec total in parent */
-    if(parent_all_nrec > 0)
-        HDassert(tot_all_nrec == parent_all_nrec);
-
-    return(0);
-} /* end H5B2__assert_internal() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B2__assert_internal2
- *
- * Purpose:	Verify than internal nodes are mostly sane
- *
- * Return:	Non-negative on success, negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 19 2005
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    hsize_t tot_all_nrec;       /* Total number of records at or below this node */
-    uint16_t u, v;       /* Local index variables */
-
-    /* General sanity checking on node */
-    HDassert(internal->nrec <= hdr->node_info->split_nrec);
-
-    /* Sanity checking on node pointers */
-    tot_all_nrec =internal->nrec;
-    for(u =0; u < internal->nrec + 1; u++) {
-        tot_all_nrec += internal->node_ptrs[u].all_nrec;
-
-        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
-        HDassert(internal->node_ptrs[u].addr > 0);
-        for(v = 0; v < u; v++)
-            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
-        for(v = 0; v < internal2->nrec + 1; v++)
-            HDassert(internal->node_ptrs[u].addr != internal2->node_ptrs[v].addr);
-    } /* end for */
-
-    /* Sanity check all_nrec total in parent */
-    if(parent_all_nrec > 0)
-        HDassert(tot_all_nrec == parent_all_nrec);
-
-    return(0);
-} /* end H5B2__assert_internal2() */
-#endif /* H5B2_DEBUG */
+} /* end H5B2__update_flush_depend() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2__create_flush_depend
+ * Function:    H5B2__update_child_flush_depends
  *
- * Purpose:     Create a flush dependency between two data structure components
+ * Purpose:     Update flush dependencies for children of a node
  *
  * Return:      SUCCEED/FAIL
  *
- * Programmer:  Dana Robinson
- *              Fall 2012
+ * Programmer:  Quincey Koziol
+ *		koziol at lbl.gov
+ *		Dec  1 2016
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5B2__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+static herr_t
+H5B2__update_child_flush_depends(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+    const H5B2_node_ptr_t *node_ptrs, unsigned start_idx, unsigned end_idx, 
+    void *old_parent, void *new_parent)
 {
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
     
-    /* 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")
+    /* Sanity checks */
+    HDassert(hdr);
+    HDassert(depth > 1);
+    HDassert(node_ptrs);
+    HDassert(start_idx <= end_idx);
+    HDassert(old_parent);
+    HDassert(new_parent);
+
+    /* Loop over children */
+    for(u = start_idx; u < end_idx; u++)
+        /* Update parent for children */
+        if(H5B2__update_flush_depend(hdr, dxpl_id, depth - 1, &node_ptrs[u], old_parent, new_parent) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child node to new parent")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__create_flush_depend() */
+} /* end H5B2__update_child_flush_depends() */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5B2internal.c b/src/H5B2internal.c
new file mode 100644
index 0000000..1716c44
--- /dev/null
+++ b/src/H5B2internal.c
@@ -0,0 +1,1441 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2internal.c
+ *			Dec 01 2016
+ *			Quincey Koziol <koziol at lbl.gov>
+ *
+ * Purpose:		Routines for managing v2 B-tree internal ndoes.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5B2__shadow_internal(H5B2_internal_t *internal, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5B2_internal_t struct */
+H5FL_DEFINE(H5B2_internal_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__create_internal
+ *
+ * Purpose:	Creates empty internal node of a B-tree and update node pointer
+ *              to point to it.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+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 */
+    hbool_t inserted = FALSE;           /* Whether the internal node was inserted into cache */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+    HDassert(depth > 0);
+
+    /* Allocate memory for internal node information */
+    if(NULL == (internal = H5FL_CALLOC(H5B2_internal_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal info")
+
+    /* Increment ref. count on B-tree header */
+    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 */
+    internal->hdr = hdr;
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (internal->int_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal native keys")
+    HDmemset(internal->int_native, 0, hdr->cls->nrec_size * hdr->node_info[depth].max_nrec);
+
+    /* Allocate space for the node pointers in memory */
+    if(NULL == (internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_MALLOC(hdr->node_info[depth].node_ptr_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal node pointers")
+    HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (hdr->node_info[depth].max_nrec + 1));
+
+    /* Set depth of the node */
+    internal->depth = depth;
+
+    /* Set parent */
+    internal->parent = parent;
+
+    /* Set shadowed epoch to header's epoch */
+    internal->shadow_epoch = hdr->shadow_epoch;
+
+    /* 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)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree internal node")
+
+    /* Cache the new B-tree node */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree internal node to cache")
+    inserted = TRUE;
+
+    /* Add internal node as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, internal) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, FAIL, "unable to add v2 B-tree node as child of proxy")
+        internal->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+done:
+    if(ret_value < 0) {
+	if(internal) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(internal) < 0)
+                    HDONE_ERROR(H5E_BTREE, H5E_CANTREMOVE, FAIL, "unable to remove v2 B-tree internal node from cache")
+
+            /* Release internal node's disk space */
+            if(H5F_addr_defined(node_ptr->addr) && H5MF_xfree(hdr->f, H5FD_MEM_BTREE, dxpl_id, node_ptr->addr, (hsize_t)hdr->node_size) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release file space for v2 B-tree internal node")
+
+            /* Destroy internal node */
+            if(H5B2__internal_free(internal) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__create_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__protect_internal
+ *
+ * Purpose:	"Protect" an internal node in the metadata cache
+ *
+ * Return:	Pointer to internal node on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_internal_t *
+H5B2__protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    H5B2_node_ptr_t *node_ptr, uint16_t depth, hbool_t shadow, unsigned flags)
+{
+    H5B2_internal_cache_ud_t udata;     /* User data to pass through to cache 'deserialize' callback */
+    H5B2_internal_t *internal = NULL;   /* v2 B-tree internal node */
+    H5B2_internal_t *ret_value = NULL;  /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+    HDassert(H5F_addr_defined(node_ptr->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;
+    udata.parent = parent;
+    udata.nrec = node_ptr->node_nrec;
+    udata.depth = depth;
+
+    /* Protect the internal node */
+    if(NULL == (internal = (H5B2_internal_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, &udata, flags)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree internal node")
+
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == internal->top_proxy) {
+        /* Add internal node as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, internal) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, NULL, "unable to add v2 B-tree internal node as child of proxy")
+        internal->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Shadow the node, if requested */
+    if(shadow)
+        if(H5B2__shadow_internal(internal, dxpl_id, node_ptr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, NULL, "unable to shadow internal node")
+
+    /* Set return value */
+    ret_value = internal;
+
+done:
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the internal node, if it was protected */
+        if(internal) {
+            /* Remove from v2 B-tree's proxy, if added */
+            if(internal->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(internal->top_proxy, internal) < 0)
+                    HDONE_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, NULL, "unable to destroy flush dependency between internal node and v2 B-tree 'top' proxy")
+                internal->top_proxy = NULL;
+            } /* end if */
+
+            /* Unprotect internal node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to unprotect v2 B-tree internal node, address = %llu", (unsigned long long)node_ptr->addr)
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__protect_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
+ *              fields of the
+ *              caller-supplied UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              The RANGE indicates whether to search for records less than or
+ *              equal to, or greater than or equal to the information passed
+ *              in with UDATA.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_internal_t *internal;          /* Pointer to internal node */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    int         cmp = 0;                /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(op);
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, curr_node_ptr, depth, FALSE, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Locate node pointer for child */
+    if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp > 0)
+        idx++;
+
+    /* Set the neighbor location, if appropriate */
+    if(comp == H5B2_COMPARE_LESS) {
+        if(idx > 0)
+            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+    } /* end if */
+    else {
+        HDassert(comp == H5B2_COMPARE_GREATER);
+
+        if(idx < internal->nrec)
+            neighbor_loc = H5B2_INT_NREC(internal, hdr, idx);
+    } /* end else */
+
+    /* Attempt to find neighboring record */
+    if(depth > 1) {
+        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, 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 */
+
+done:
+    /* Release the B-tree internal node */
+    if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__neighbor_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__insert_internal
+ *
+ * Purpose:	Adds a new record to a B-tree node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
+    unsigned internal_flags = H5AC__NO_FLAGS_SET;
+    unsigned    idx = 0;                /* Location of record which matches key */
+    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, curr_node_ptr, depth, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Sanity check number of records */
+    HDassert(internal->nrec == curr_node_ptr->node_nrec);
+
+    /* Split or redistribute child node pointers, if necessary */
+    {
+        int         cmp;        /* Comparison value of records */
+        unsigned retries;       /* Number of times to attempt redistribution */
+        size_t      split_nrec; /* Number of records to split node at */
+
+        /* Locate node pointer for child */
+        if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                               udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp == 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+        if(cmp > 0)
+            idx++;
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for insertion to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a split */
+        retries = 2;
+
+        /* Determine the correct number of records to split child node at */
+        split_nrec = hdr->node_info[depth - 1].split_nrec;
+
+        /* Preemptively split/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == split_nrec) {
+            /* 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)
+                        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,
+                           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)
+                        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,
+                           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 { /* 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)
+                        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,
+                           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 else */
+
+            /* 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(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, 
+                                   udata, &idx, &cmp) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+            if(cmp == 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+            if(cmp > 0)
+                idx++;
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+    } /* end block */
+
+    /* Check if this node is left/right-most */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                next_pos = H5B2_POS_LEFT;
+        } /* end if */
+        else if(idx == internal->nrec) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                next_pos = H5B2_POS_RIGHT;
+        } /* end else */
+    } /* end if */
+
+    /* Attempt to insert node */
+    if(depth > 1) {
+        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, internal, udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
+    } /* end else */
+
+    /* Update record count for node pointer to current node */
+    curr_node_ptr->all_nrec++;
+
+    /* Mark node as dirty */
+    internal_flags |= H5AC__DIRTIED_FLAG;
+
+done:
+    /* Release the B-tree internal node */
+    if(internal) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write && (internal_flags & H5AC__DIRTIED_FLAG))
+            if(H5B2__shadow_internal(internal, dxpl_id, curr_node_ptr) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal B-tree node")
+
+        /* Unprotect node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__insert_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__update_internal
+ *
+ * Purpose:	Insert or modify a record in a B-tree internal node.
+ *		If the record exists already, it is modified as if H5B2_modify
+ *		was called).  If it doesn't exist, it is inserted as if
+ *		H5B2_insert was called.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 24 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__update_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_update_status_t *status, H5B2_nodepos_t curr_pos, void *parent,
+    void *udata, H5B2_modify_t op, void *op_data)
+{
+    H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
+    unsigned internal_flags = H5AC__NO_FLAGS_SET;
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, curr_node_ptr, depth, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+
+    /* Sanity check number of records */
+    HDassert(internal->nrec == curr_node_ptr->node_nrec);
+
+    /* Locate node pointer for child */
+    if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+    /* Check for modifying existing record */
+    if(0 == cmp) {
+        hbool_t changed = FALSE;        /* Whether the 'modify' callback changed the record */
+
+        /* Make callback for current record */
+        if((op)(H5B2_INT_NREC(internal, hdr, idx), op_data, &changed) < 0) {
+            /* Make certain that the callback didn't modify the value if it failed */
+            HDassert(changed == FALSE);
+
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree update operation")
+        } /* end if */
+
+        /* Mark the node as dirty if it changed */
+        internal_flags |= (changed ? H5AC__DIRTIED_FLAG : 0);
+
+        /* Indicate that the record was modified */
+        *status = H5B2_UPDATE_MODIFY_DONE;
+    } /* end if */
+    else {
+        /* Adjust index to leave room for node to insert */
+        if(cmp > 0)
+            idx++;
+
+        /* Check if this node is left/right-most */
+        if(H5B2_POS_MIDDLE != curr_pos) {
+            if(idx == 0) {
+                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_LEFT;
+            } /* end if */
+            else if(idx == internal->nrec) {
+                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_RIGHT;
+            } /* end else */
+        } /* end if */
+
+        /* Attempt to update record in child */
+        if(depth > 1) {
+            if(H5B2__update_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &internal_flags, &internal->node_ptrs[idx], status, next_pos, internal, udata, op, op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update record in internal B-tree node")
+        } /* end if */
+        else {
+            if(H5B2__update_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], status, next_pos, internal, udata, op, op_data) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update record in leaf B-tree node")
+        } /* end else */
+
+        /* Take actions based on child's status report */
+        switch(*status) {
+            case H5B2_UPDATE_MODIFY_DONE:
+                /* No action */
+                break;
+
+            case H5B2_UPDATE_SHADOW_DONE:
+                /* If child node was shadowed (if SWMR is enabled), mark this node dirty */
+                if(hdr->swmr_write)
+                    internal_flags |= H5AC__DIRTIED_FLAG;
+
+                /* No further modifications up the tree are necessary though, so downgrade to merely "modified" */
+                *status = H5B2_UPDATE_MODIFY_DONE;
+                break;
+
+            case H5B2_UPDATE_INSERT_DONE:
+                /* Mark node as dirty */
+                internal_flags |= H5AC__DIRTIED_FLAG;
+
+                /* Update total record count for node pointer to current node */
+                curr_node_ptr->all_nrec++;
+                break;
+
+            case H5B2_UPDATE_INSERT_CHILD_FULL:
+                /* Split/redistribute this node */
+                if(internal->nrec == hdr->node_info[depth].split_nrec) {
+                    hbool_t could_split = FALSE;        /* Whether the child node could split */
+
+                    if(idx == 0) {      /* Left-most child */
+                        /* Check for left-most child and its neighbor being close to full */
+                        if((internal->node_ptrs[idx].node_nrec + internal->node_ptrs[idx + 1].node_nrec)
+                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
+                            could_split = TRUE;
+                    } /* end if */
+                    else if(idx == internal->nrec) { /* Right-most child */
+                        /* Check for right-most child and its neighbor being close to full */
+                        if((internal->node_ptrs[idx - 1].node_nrec + internal->node_ptrs[idx].node_nrec)
+                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
+                            could_split = TRUE;
+                    } /* end else-if */
+                    else {              /* Middle child */
+                        /* Check for middle child and its left neighbor being close to full */
+                        if((internal->node_ptrs[idx - 1].node_nrec + internal->node_ptrs[idx].node_nrec)
+                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
+                            could_split = TRUE;
+                        /* Check for middle child and its right neighbor being close to full */
+                        else if((internal->node_ptrs[idx].node_nrec + internal->node_ptrs[idx + 1].node_nrec)
+                                >= ((hdr->node_info[depth - 1].split_nrec * 2) - 1))
+                            could_split = TRUE;
+                    } /* end if */
+
+                    /* If this node is full and the child node insertion could
+                     *  cause a split, punt back up to caller, leaving the
+                     *  "insert child full" status.
+                     */
+                    if(could_split) {
+                        /* Release the internal B-tree node */
+                        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+                        internal = NULL;
+
+                        /* Punt back to caller */
+                        HGOTO_DONE(SUCCEED);
+                    } /* end if */
+                } /* end if */
+
+                /* Release the internal B-tree node */
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+                internal = NULL;
+
+                /* Indicate that the record was inserted */
+                *status = H5B2_UPDATE_INSERT_DONE;
+
+                /* Dodge sideways into inserting a record into this node */
+                if(H5B2__insert_internal(hdr, dxpl_id, depth, parent_cache_info_flags_ptr, curr_node_ptr, curr_pos, parent, udata) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into internal B-tree node")
+                break;
+
+            case H5B2_UPDATE_UNKNOWN:
+            default:
+                HDassert(0 && "Invalid update status");
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "invalid update status")
+        } /* end switch */
+    } /* end else */
+
+done:
+    /* Release the internal B-tree node */
+    if(internal) {
+        /* Check if we should shadow this node */
+        if(hdr->swmr_write && (internal_flags & H5AC__DIRTIED_FLAG)) {
+            /* Attempt to shadow the node if doing SWMR writes */
+            if(H5B2__shadow_internal(internal, dxpl_id, curr_node_ptr) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal B-tree node")
+
+            /* Change the state to "shadowed" if only modified currently */
+            /* (Triggers parent to be marked dirty) */
+            if(*status == H5B2_UPDATE_MODIFY_DONE)
+                *status = H5B2_UPDATE_SHADOW_DONE;
+        } /* end if */
+
+        /* Unprotect node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, internal, internal_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__update_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * 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_internal_t *internal, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr)
+{
+    H5B2_hdr_t *hdr;                    /* B-tree header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(internal);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    hdr = internal->hdr;
+    HDassert(hdr);
+    HDassert(hdr->swmr_write);
+
+    /* 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, compare the epoch of this node and the header.  If this node's
+     * epoch is <= to the header's, it hasn't been shadowed yet. */
+    if(internal->shadow_epoch <= hdr->shadow_epoch) {
+        haddr_t new_node_addr;          /* Address to move node to */
+
+        /*
+         * 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")
+
+        /* Move the location of the node on the disk */
+        if(H5AC_move_entry(hdr->f, H5AC_BT2_INT, curr_node_ptr->addr, new_node_addr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMOVE, FAIL, "unable to move B-tree node")
+        curr_node_ptr->addr = new_node_addr;
+
+        /* Should free the space in the file, but this is not supported by
+         * SWMR_WRITE code yet - QAK, 2016/12/01
+         */
+
+        /* Set shadow epoch for node ahead of header */
+        internal->shadow_epoch = hdr->shadow_epoch + 1;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__shadow_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__remove_internal
+ *
+ * Purpose:	Removes a record from a B-tree node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    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 */
+    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;
+    haddr_t internal_addr = HADDR_UNDEF; /* Address of internal node */
+    size_t      merge_nrec;             /* Number of records to merge node at */
+    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(parent_cache_info);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent_cache_info, curr_node_ptr, depth, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+    internal_addr = curr_node_ptr->addr;
+
+    /* Determine the correct number of records to merge at */
+    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
+
+    /* Check for needing to collapse the root node */
+    /* (The root node is the only internal node allowed to have 1 record) */
+    if(internal->nrec == 1 &&
+            ((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,
+                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;
+        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 dependency for child, if using SWMR */
+        if(hdr->swmr_write)
+            if(H5B2__update_flush_depend(hdr, dxpl_id, depth, curr_node_ptr, internal, hdr) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child node to new parent")
+
+        /* Indicate that the level of the B-tree decreased */
+        *depth_decreased = TRUE;
+
+        /* Set pointers for advancing to child node */
+        new_cache_info = parent_cache_info;
+        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
+        new_node_ptr = curr_node_ptr;
+
+        /* Set flag to indicate root was collapsed */
+        collapsed_root = TRUE;
+
+        /* Indicate position of next node */
+        next_pos = H5B2_POS_ROOT;
+    } /* end if */
+    /* Merge or redistribute child node pointers, if necessary */
+    else {
+        unsigned idx = 0;       /* Location of record which matches key */
+        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(internal, dxpl_id, curr_node_ptr) < 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 {
+            if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+            if(cmp >= 0)
+                idx++;
+        } /* end else */
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for removal to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a merge */
+        retries = 2;
+
+        /* Preemptively merge/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
+            /* Attempt to redistribute records among children */
+            /* (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)
+             */
+            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)
+                        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,
+                           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)
+                        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,
+                           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 */
+            } /* end if */
+            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)
+                        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,
+                           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 else */
+
+            /* Locate node pointer for child (after merge/redistribute) */
+            if(swap_loc)
+                idx = 0;
+            else {
+/* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
+                if(H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx, &cmp) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+                if(cmp >= 0)
+                    idx++;
+            } /* end else */
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+
+        /* Handle deleting a record from an internal node */
+        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)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "Can't swap records in B-tree")
+
+        /* Set pointers for advancing to child node */
+        new_cache_info_flags_ptr = &internal_flags;
+        new_cache_info = &internal->cache_info;
+        new_node_ptr = &internal->node_ptrs[idx];
+
+        /* Indicate position of next node */
+        if(H5B2_POS_MIDDLE != curr_pos) {
+            if(idx == 0) {
+                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_LEFT;
+            } /* end if */
+            else if(idx == internal->nrec) {
+                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_RIGHT;
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Attempt to remove record from child node */
+    if(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, 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 */
+
+    /* Update record count for node pointer to current node */
+    if(!collapsed_root)
+        new_node_ptr->all_nrec--;
+
+    /* Mark node as dirty */
+    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);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release the B-tree internal node */
+    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")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__remove_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__remove_internal_by_idx
+ *
+ * Purpose:	Removes a record from a B-tree node, according to the offset
+ *              in the B-tree records
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    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 */
+    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;
+    haddr_t internal_addr = HADDR_UNDEF; /* Address of internal node */
+    size_t      merge_nrec;             /* Number of records to merge node at */
+    hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(parent_cache_info);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock current B-tree node */
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent_cache_info, curr_node_ptr, depth, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+    internal_addr = curr_node_ptr->addr;
+    HDassert(internal->nrec == curr_node_ptr->node_nrec);
+    HDassert(depth == hdr->depth || internal->nrec > 1);
+
+    /* Determine the correct number of records to merge at */
+    merge_nrec = hdr->node_info[depth - 1].merge_nrec;
+
+    /* Check for needing to collapse the root node */
+    /* (The root node is the only internal node allowed to have 1 record) */
+    if(internal->nrec == 1 &&
+            ((internal->node_ptrs[0].node_nrec + internal->node_ptrs[1].node_nrec) <= ((merge_nrec * 2) + 1))) {
+        HDassert(depth == hdr->depth);
+
+        /* Merge children of root node */
+        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;
+        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 dependency for child, if using SWMR */
+        if(hdr->swmr_write)
+            if(H5B2__update_flush_depend(hdr, dxpl_id, depth, curr_node_ptr, internal, hdr) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUPDATE, FAIL, "unable to update child node to new parent")
+
+        /* Indicate that the level of the B-tree decreased */
+        *depth_decreased = TRUE;
+
+        /* Set pointers for advancing to child node */
+        new_cache_info = parent_cache_info;
+        new_cache_info_flags_ptr = parent_cache_info_flags_ptr;
+        new_node_ptr = curr_node_ptr;
+
+        /* Set flag to indicate root was collapsed */
+        collapsed_root = TRUE;
+
+        /* Indicate position of next node */
+        next_pos = H5B2_POS_ROOT;
+    } /* end if */
+    /* Merge or redistribute child node pointers, if necessary */
+    else {
+        hsize_t orig_n = n;     /* Original index looked for */
+        unsigned idx;           /* Location of record which matches key */
+        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) {
+            if(H5B2__shadow_internal(internal, dxpl_id, curr_node_ptr) < 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 {
+            /* Search for record with correct index */
+            for(idx = 0; idx < internal->nrec; idx++) {
+                /* Check which child node contains indexed record */
+                if(internal->node_ptrs[idx].all_nrec >= n) {
+                    /* Check if record is in this node */
+                    if(internal->node_ptrs[idx].all_nrec == n) {
+                        /* Indicate the record was found and that the index
+                         *      in child nodes is zero from now on
+                         */
+                        found = TRUE;
+                        n = 0;
+
+                        /* Increment to next record */
+                        idx++;
+                    } /* end if */
+
+                    /* Break out of loop early */
+                    break;
+                } /* end if */
+
+                /* Decrement index we are looking for to account for the node we
+                 * just advanced past.
+                 */
+                n -= (internal->node_ptrs[idx].all_nrec + 1);
+            } /* end for */
+        } /* end else */
+
+        /* Set the number of redistribution retries */
+        /* This takes care of the case where a B-tree node needs to be
+         * redistributed, but redistributing the node causes the index
+         * for removal to move to another node, which also needs to be
+         * redistributed.  Now, we loop trying to redistribute and then
+         * eventually force a merge */
+        retries = 2;
+
+        /* Preemptively merge/redistribute a node we will enter */
+        while(internal->node_ptrs[idx].node_nrec == merge_nrec) {
+            /* Attempt to redistribute records among children */
+            /* (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)
+             */
+            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)
+                        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,
+                           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)
+                        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,
+                           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 */
+            } /* end if */
+            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)
+                        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,
+                           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 else */
+
+            /* Locate node pointer for child (after merge/redistribute) */
+            if(swap_loc)
+                idx = 0;
+            else {
+                /* Count from the orginal index value again */
+                n = orig_n;
+
+                /* Reset "found" flag - the record may have shifted during the
+                 *      redistribute/merge
+                 */
+                found = FALSE;
+
+                /* Search for record with correct index */
+                for(idx = 0; idx < internal->nrec; idx++) {
+                    /* Check which child node contains indexed record */
+                    if(internal->node_ptrs[idx].all_nrec >= n) {
+                        /* Check if record is in this node */
+                        if(internal->node_ptrs[idx].all_nrec == n) {
+                            /* Indicate the record was found and that the index
+                             *      in child nodes is zero from now on
+                             */
+                            found = TRUE;
+                            n = 0;
+
+                            /* Increment to next record */
+                            idx++;
+                        } /* end if */
+
+                        /* Break out of loop early */
+                        break;
+                    } /* end if */
+
+                    /* Decrement index we are looking for to account for the node we
+                     * just advanced past.
+                     */
+                    n -= (internal->node_ptrs[idx].all_nrec + 1);
+                } /* end for */
+            } /* end else */
+
+            /* Decrement the number of redistribution retries left */
+            retries--;
+        } /* end while */
+
+        /* Handle deleting a record from an internal node */
+        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)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "can't swap records in B-tree")
+
+        /* Set pointers for advancing to child node */
+        new_cache_info_flags_ptr = &internal_flags;
+        new_cache_info = &internal->cache_info;
+        new_node_ptr = &internal->node_ptrs[idx];
+
+        /* Indicate position of next node */
+        if(H5B2_POS_MIDDLE != curr_pos) {
+            if(idx == 0) {
+                if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_LEFT;
+            } /* end if */
+            else if(idx == internal->nrec) {
+                if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos)
+                    next_pos = H5B2_POS_RIGHT;
+            } /* end if */
+        } /* end if */
+    } /* end else */
+
+    /* Attempt to remove record from child node */
+    if(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, 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 */
+
+    /* Update record count for node pointer to child node */
+    if(!collapsed_root)
+        new_node_ptr->all_nrec--;
+
+    /* Mark node as dirty */
+    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);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Release the B-tree internal node */
+    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")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__remove_internal_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__internal_free
+ *
+ * Purpose:	Destroys a B-tree internal node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__internal_free(H5B2_internal_t *internal)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(internal);
+
+    /* Release internal node's native key buffer */
+    if(internal->int_native)
+        internal->int_native = (uint8_t *)H5FL_FAC_FREE(internal->hdr->node_info[internal->depth].nat_rec_fac, internal->int_native);
+
+    /* Release internal node's node pointer buffer */
+    if(internal->node_ptrs)
+        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)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
+
+    /* Sanity check */
+    HDassert(NULL == internal->top_proxy);
+
+    /* Free B-tree internal node info */
+    internal = H5FL_FREE(H5B2_internal_t, internal);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__internal_free() */
+
+#ifdef H5B2_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__assert_internal
+ *
+ * Purpose:	Verify than an internal node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE herr_t
+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 */
+
+    /* General sanity checking on node */
+    HDassert(internal->nrec <= hdr->node_info->split_nrec);
+
+    /* Sanity checking on node pointers */
+    tot_all_nrec = internal->nrec;
+    for(u = 0; u < internal->nrec + 1; u++) {
+        tot_all_nrec += internal->node_ptrs[u].all_nrec;
+
+        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
+        HDassert(internal->node_ptrs[u].addr > 0);
+        for(v = 0; v < u; v++)
+            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
+    } /* end for */
+
+    /* Sanity check all_nrec total in parent */
+    if(parent_all_nrec > 0)
+        HDassert(tot_all_nrec == parent_all_nrec);
+
+    return(0);
+} /* end H5B2__assert_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__assert_internal2
+ *
+ * Purpose:	Verify than internal nodes are mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE 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)
+{
+    hsize_t tot_all_nrec;       /* Total number of records at or below this node */
+    uint16_t u, v;       /* Local index variables */
+
+    /* General sanity checking on node */
+    HDassert(internal->nrec <= hdr->node_info->split_nrec);
+
+    /* Sanity checking on node pointers */
+    tot_all_nrec =internal->nrec;
+    for(u =0; u < internal->nrec + 1; u++) {
+        tot_all_nrec += internal->node_ptrs[u].all_nrec;
+
+        HDassert(H5F_addr_defined(internal->node_ptrs[u].addr));
+        HDassert(internal->node_ptrs[u].addr > 0);
+        for(v = 0; v < u; v++)
+            HDassert(internal->node_ptrs[u].addr != internal->node_ptrs[v].addr);
+        for(v = 0; v < internal2->nrec + 1; v++)
+            HDassert(internal->node_ptrs[u].addr != internal2->node_ptrs[v].addr);
+    } /* end for */
+
+    /* Sanity check all_nrec total in parent */
+    if(parent_all_nrec > 0)
+        HDassert(tot_all_nrec == parent_all_nrec);
+
+    return(0);
+} /* end H5B2__assert_internal2() */
+#endif /* H5B2_DEBUG */
+
diff --git a/src/H5B2leaf.c b/src/H5B2leaf.c
new file mode 100644
index 0000000..d900761
--- /dev/null
+++ b/src/H5B2leaf.c
@@ -0,0 +1,1063 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5B2leaf.c
+ *			Dec 01 2016
+ *			Quincey Koziol <koziol at lbl.gov>
+ *
+ * Purpose:		Routines for managing v2 B-tree leaf ndoes.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5B2pkg.h"		/* v2 B-trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5B2__shadow_leaf(H5B2_leaf_t *leaf, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5B2_leaf_t struct */
+H5FL_DEFINE(H5B2_leaf_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__create_leaf
+ *
+ * Purpose:	Creates empty leaf node of a B-tree and update node pointer
+ *              to point to it.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb  2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+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 */
+    hbool_t inserted = FALSE;           /* Whether the leaf node was inserted into cache */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+
+    /* Allocate memory for leaf information */
+    if(NULL == (leaf = H5FL_CALLOC(H5B2_leaf_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf info")
+
+    /* Increment ref. count on B-tree header */
+    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 */
+    leaf->hdr = hdr;
+
+    /* Allocate space for the native keys in memory */
+    if(NULL == (leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(hdr->node_info[0].nat_rec_fac)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf native keys")
+    HDmemset(leaf->leaf_native, 0, hdr->cls->nrec_size * hdr->node_info[0].max_nrec);
+
+    /* Set parent */
+    leaf->parent = parent;
+
+    /* Set shadowed epoch to header's epoch */
+    leaf->shadow_epoch = hdr->shadow_epoch;
+
+    /* 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")
+
+    /* Cache the new B-tree node */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree leaf to cache")
+    inserted = TRUE;
+
+    /* Add leaf node as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, leaf) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, FAIL, "unable to add v2 B-tree node as child of proxy")
+        leaf->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+done:
+    if(ret_value < 0) {
+        if(leaf) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(leaf) < 0)
+                    HDONE_ERROR(H5E_BTREE, H5E_CANTREMOVE, FAIL, "unable to remove v2 B-tree leaf node from cache")
+
+            /* Release leaf node's disk space */
+            if(H5F_addr_defined(node_ptr->addr) && H5MF_xfree(hdr->f, H5FD_MEM_BTREE, dxpl_id, node_ptr->addr, (hsize_t)hdr->node_size) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release file space for v2 B-tree leaf node")
+
+            /* Destroy leaf node */
+            if(H5B2__leaf_free(leaf) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree leaf node")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__create_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__protect_leaf
+ *
+ * Purpose:	"Protect" an leaf node in the metadata cache
+ *
+ * Return:	Pointer to leaf node on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May  5 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_leaf_t *
+H5B2__protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent, 
+    H5B2_node_ptr_t *node_ptr, hbool_t shadow, unsigned flags)
+{
+    H5B2_leaf_cache_ud_t udata;         /* User-data for callback */
+    H5B2_leaf_t *leaf;                  /* v2 B-tree leaf node */
+    H5B2_leaf_t *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(node_ptr);
+    HDassert(H5F_addr_defined(node_ptr->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;
+    udata.nrec = node_ptr->node_nrec;
+
+    /* Protect the leaf node */
+    if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, &udata, flags)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree leaf node")
+
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == leaf->top_proxy) {
+        /* Add leaf node as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, leaf) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTSET, NULL, "unable to add v2 B-tree leaf node as child of proxy")
+        leaf->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Shadow the node, if requested */
+    if(shadow)
+        if(H5B2__shadow_leaf(leaf, dxpl_id, node_ptr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, NULL, "unable to shadow leaf node")
+
+    /* Set return value */
+    ret_value = leaf;
+
+done:
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the leaf node, if it was protected */
+        if(leaf) {
+            /* Remove from v2 B-tree's proxy, if added */
+            if(leaf->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(leaf->top_proxy, leaf) < 0)
+                    HDONE_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, NULL, "unable to destroy flush dependency between leaf node and v2 B-tree 'top' proxy")
+                leaf->top_proxy = NULL;
+            } /* end if */
+
+            /* Unprotect leaf node */
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to unprotect v2 B-tree leaf node, address = %llu", (unsigned long long)node_ptr->addr)
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__protect_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
+ *              fields of the
+ *              caller-supplied UDATA pointer depending on the type of leaf node
+ *		requested.  The UDATA can point to additional data passed
+ *		to the key comparison function.
+ *
+ *              The 'OP' routine is called with the record found and the
+ *              OP_DATA pointer, to allow caller to return information about
+ *              the record.
+ *
+ *              The RANGE indicates whether to search for records less than or
+ *              equal to, or greater than or equal to the information passed
+ *              in with UDATA.
+ *
+ * Return:	Non-negative on success, negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  9 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    int         cmp = 0;                /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(op);
+
+    /* Lock current B-tree node */
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, curr_node_ptr, FALSE, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Locate node pointer for child */
+    if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp > 0)
+        idx++;
+    else
+        if(cmp == 0 && comp == H5B2_COMPARE_GREATER)
+            idx++;
+
+    /* Set the neighbor location, if appropriate */
+    if(comp == H5B2_COMPARE_LESS) {
+        if(idx > 0)
+            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx - 1);
+    } /* end if */
+    else {
+        HDassert(comp == H5B2_COMPARE_GREATER);
+
+        if(idx < leaf->nrec)
+            neighbor_loc = H5B2_LEAF_NREC(leaf, hdr, idx);
+    } /* end else */
+
+    /* Make callback if neighbor record has been found */
+    if(neighbor_loc) {
+        /* Make callback for current record */
+        if((op)(neighbor_loc, op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree neighbor operation")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree")
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__neighbor_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__insert_leaf
+ *
+ * Purpose:	Adds a new record to a B-tree leaf node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    unsigned leaf_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting the leaf node */
+    int         cmp;                    /* Comparison value of records */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(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, parent, curr_node_ptr, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree 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);
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+
+    /* Check for inserting into empty leaf */
+    if(leaf->nrec == 0)
+        idx = 0;
+    else {
+        /* Find correct location to insert this record */
+        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+        if(cmp == 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
+        if(cmp > 0)
+            idx++;
+
+        /* Make room for new record */
+        if(idx < leaf->nrec)
+            HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx + 1), H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size * (leaf->nrec - idx));
+    } /* end else */
+
+    /* Make callback to store record in native form */
+    if((hdr->cls->store)(H5B2_LEAF_NREC(leaf, hdr, idx), udata) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into leaf node")
+
+    /* Mark the node as dirty */
+    leaf_flags |= H5AC__DIRTIED_FLAG;
+
+    /* Update record count for node pointer to current node */
+    curr_node_ptr->all_nrec++;
+    curr_node_ptr->node_nrec++;
+
+    /* Update record count for current node */
+    leaf->nrec++;
+
+    /* Check for new record being the min or max for the tree */
+    /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec == NULL)
+                    if(NULL == (hdr->min_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
+                HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec == NULL)
+                    if(NULL == (hdr->max_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
+                HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the B-tree leaf node (marked as dirty) */
+    if(leaf) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write && (leaf_flags & H5AC__DIRTIED_FLAG))
+            if(H5B2__shadow_leaf(leaf, dxpl_id, curr_node_ptr) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf B-tree node")
+
+        /* Unprotect leaf node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, leaf_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__insert_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__update_leaf
+ *
+ * Purpose:	Insert or modify a record in a B-tree leaf node.
+ *		If the record exists already, it is modified as if H5B2_modify
+ *		was called).  If it doesn't exist, it is inserted as if
+ *		H5B2_insert was called.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 23 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__update_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_update_status_t *status, H5B2_nodepos_t curr_pos, void *parent,
+    void *udata, H5B2_modify_t op, void *op_data)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    unsigned leaf_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting the leaf node */
+    int         cmp = -1;               /* Comparison value of records */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(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, parent, curr_node_ptr, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+
+    /* Check for inserting into empty leaf */
+    if(leaf->nrec == 0)
+        idx = 0;
+    else {
+        /* Find correct location to insert this record */
+        if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx, &cmp) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+
+        /* Check for inserting a record */
+        if(0 != cmp) {
+            /* Check if the leaf node is full */
+            if(curr_node_ptr->node_nrec == hdr->node_info[0].split_nrec) {
+                /* Indicate that the leaf is full, but we need to insert */
+                *status = H5B2_UPDATE_INSERT_CHILD_FULL;
+
+                /* Let calling routine handle insertion */
+                HGOTO_DONE(SUCCEED)
+            } /* end if */
+
+            /* Adjust index to leave room for record to insert */
+            if(cmp > 0)
+                idx++;
+
+            /* Make room for new record */
+            if(idx < leaf->nrec)
+                HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx + 1), H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size * (leaf->nrec - idx));
+        } /* end if */
+    } /* end else */
+
+    /* Check for modifying existing record */
+    if(0 == cmp) {
+        hbool_t changed = FALSE;        /* Whether the 'modify' callback changed the record */
+
+        /* Make callback for current record */
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data, &changed) < 0) {
+            /* Make certain that the callback didn't modify the value if it failed */
+            HDassert(changed == FALSE);
+
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree update operation")
+        } /* end if */
+
+        /* Mark the node as dirty if it changed */
+        leaf_flags |= (changed ? H5AC__DIRTIED_FLAG : 0);
+
+        /* Indicate that the record was modified */
+        *status = H5B2_UPDATE_MODIFY_DONE;
+    } /* end if */
+    else {
+        /* 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);
+
+        /* Make callback to store record in native form */
+        if((hdr->cls->store)(H5B2_LEAF_NREC(leaf, hdr, idx), udata) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into leaf node")
+
+        /* Mark the node as dirty */
+        leaf_flags |= H5AC__DIRTIED_FLAG;
+
+        /* Indicate that the record was inserted */
+        *status = H5B2_UPDATE_INSERT_DONE;
+
+        /* Update record count for node pointer to current node */
+        curr_node_ptr->all_nrec++;
+        curr_node_ptr->node_nrec++;
+
+        /* Update record count for current node */
+        leaf->nrec++;
+    } /* end else */
+
+    /* Check for new record being the min or max for the tree */
+    /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec == NULL)
+                    if(NULL == (hdr->min_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree min record info")
+                HDmemcpy(hdr->min_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec == NULL)
+                    if(NULL == (hdr->max_native_rec = H5MM_malloc(hdr->cls->nrec_size)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for v2 B-tree max record info")
+                HDmemcpy(hdr->max_native_rec, H5B2_LEAF_NREC(leaf, hdr, idx), hdr->cls->nrec_size);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf) {
+        /* Check if we should shadow this node */
+        if(hdr->swmr_write && (leaf_flags & H5AC__DIRTIED_FLAG)) {
+            /* Attempt to shadow the node if doing SWMR writes */
+            if(H5B2__shadow_leaf(leaf, dxpl_id, curr_node_ptr) < 0)
+                HDONE_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf B-tree node")
+
+            /* Change the state to "shadowed" if only modified currently */
+            /* (Triggers parent to be marked dirty) */
+            if(*status == H5B2_UPDATE_MODIFY_DONE)
+                *status = H5B2_UPDATE_SHADOW_DONE;
+        } /* end if */
+
+        /* Unprotect leaf node */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, leaf, leaf_flags) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__update_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__swap_leaf
+ *
+ * Purpose:	Swap a record in a node with a record in a leaf node
+ *
+ * Return:	Success:	Non-negative
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  4 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    const H5AC_class_t *child_class;    /* Pointer to child node's class info */
+    haddr_t child_addr;                 /* Address of child node */
+    void *child = NULL;                 /* Pointer to child node */
+    uint8_t *child_native;              /* Pointer to child's native records */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(internal);
+    HDassert(internal_flags_ptr);
+    HDassert(idx <= internal->nrec);
+
+    /* Check for the kind of B-tree node to swap */
+    if(depth > 1) {
+        H5B2_internal_t *child_internal;        /* Pointer to internal node */
+
+        /* Setup information for unlocking child node */
+        child_class = H5AC_BT2_INT;
+
+        /* Lock B-tree child nodes */
+        if(NULL == (child_internal = H5B2__protect_internal(hdr, dxpl_id, internal, &internal->node_ptrs[idx], (uint16_t)(depth - 1), FALSE, H5AC__NO_FLAGS_SET)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        child_addr = internal->node_ptrs[idx].addr;
+
+        /* More setup for accessing child node information */
+        child = child_internal;
+        child_native = child_internal->int_native;
+    } /* end if */
+    else {
+        H5B2_leaf_t *child_leaf;        /* Pointer to leaf node */
+
+        /* Setup information for unlocking child nodes */
+        child_class = H5AC_BT2_LEAF;
+
+        /* Lock B-tree child node */
+        if(NULL == (child_leaf = H5B2__protect_leaf(hdr, dxpl_id, internal, &internal->node_ptrs[idx], FALSE, H5AC__NO_FLAGS_SET)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        child_addr = internal->node_ptrs[idx].addr;
+
+        /* More setup for accessing child node information */
+        child = child_leaf;
+        child_native = child_leaf->leaf_native;
+    } /* end else */
+
+    /* Swap records (use disk page as temporary buffer) */
+    HDmemcpy(hdr->page, H5B2_NAT_NREC(child_native, hdr, 0), hdr->cls->nrec_size);
+    HDmemcpy(H5B2_NAT_NREC(child_native, hdr, 0), swap_loc, hdr->cls->nrec_size);
+    HDmemcpy(swap_loc, hdr->page, hdr->cls->nrec_size);
+
+    /* Mark parent as dirty */
+    *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
+
+#ifdef H5B2_DEBUG
+    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);
+    else
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)child);
+#endif /* H5B2_DEBUG */
+
+done:
+    /* Unlock child node */
+    if(child && H5AC_unprotect(hdr->f, dxpl_id, child_class, child_addr, child, H5AC__DIRTIED_FLAG) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__swap_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * 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_leaf_t *leaf, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr)
+{
+    H5B2_hdr_t *hdr;                    /* B-tree header */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(leaf);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    hdr = leaf->hdr;
+    HDassert(hdr);
+    HDassert(hdr->swmr_write);
+
+    /* 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, compare the epoch of this node and the header.  If this node's
+     * epoch is <= to the header's, it hasn't been shadowed yet. */
+    if(leaf->shadow_epoch <= hdr->shadow_epoch) {
+        haddr_t new_node_addr;              /* Address to move node to */
+
+        /*
+        * 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")
+
+        /* 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, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMOVE, FAIL, "unable to move B-tree node")
+        curr_node_ptr->addr = new_node_addr;
+
+        /* Should free the space in the file, but this is not supported by
+         * SWMR_WRITE code yet - QAK, 2016/12/01
+         */
+
+        /* Set shadow epoch for node ahead of header */
+        leaf->shadow_epoch = hdr->shadow_epoch + 1;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__shadow_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__remove_leaf
+ *
+ * Purpose:	Removes a record from a B-tree leaf node.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Mar  3 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
+    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
+    unsigned    idx = 0;                /* Location of record which matches key */
+    int         cmp;                    /* Comparison value of records */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(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, parent, curr_node_ptr, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+    leaf_addr = curr_node_ptr->addr;
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    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, &cmp) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTCOMPARE, FAIL, "can't compare btree2 records")
+    if(cmp != 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
+
+    /* Check for invalidating the min/max record for the tree */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec)
+                    hdr->min_native_rec = H5MM_xfree(hdr->min_native_rec);
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec)
+                    hdr->max_native_rec = H5MM_xfree(hdr->max_native_rec);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    /* Make 'remove' callback if there is one */
+    if(op)
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
+
+    /* Update number of records in node */
+    leaf->nrec--;
+
+    if(leaf->nrec > 0) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(leaf, dxpl_id, curr_node_ptr) < 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;
+        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;
+    } /* end else */
+
+    /* Update record count for parent of leaf node */
+    curr_node_ptr->node_nrec--;
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__remove_leaf() */
+
+

+/*-------------------------------------------------------------------------
+ * 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.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 14 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
+    haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
+    unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments. */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+
+    /* Lock B-tree leaf node */
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, curr_node_ptr, FALSE, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+    leaf_addr = curr_node_ptr->addr;
+
+    /* Sanity check number of records */
+    HDassert(curr_node_ptr->all_nrec == curr_node_ptr->node_nrec);
+    HDassert(leaf->nrec == curr_node_ptr->node_nrec);
+    HDassert(idx < leaf->nrec);
+
+    /* Check for invalidating the min/max record for the tree */
+    if(H5B2_POS_MIDDLE != curr_pos) {
+        /* (Don't use 'else' for the idx check, to allow for root leaf node) */
+        if(idx == 0) {
+            if(H5B2_POS_LEFT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->min_native_rec)
+                    hdr->min_native_rec = H5MM_xfree(hdr->min_native_rec);
+            } /* end if */
+        } /* end if */
+        if(idx == (unsigned)(leaf->nrec - 1)) {
+            if(H5B2_POS_RIGHT == curr_pos || H5B2_POS_ROOT == curr_pos) {
+                if(hdr->max_native_rec)
+                    hdr->max_native_rec = H5MM_xfree(hdr->max_native_rec);
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+    /* Make 'remove' callback if there is one */
+    if(op)
+        if((op)(H5B2_LEAF_NREC(leaf, hdr, idx), op_data) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record into leaf node")
+
+    /* Update number of records in node */
+    leaf->nrec--;
+
+    if(leaf->nrec > 0) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(leaf, dxpl_id, curr_node_ptr) < 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;
+        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;
+    } /* end else */
+
+    /* Update record count for parent of leaf node */
+    curr_node_ptr->node_nrec--;
+
+done:
+    /* Release the B-tree leaf node */
+    if(leaf && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, leaf, leaf_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__remove_leaf_by_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__leaf_free
+ *
+ * Purpose:	Destroys a B-tree leaf node in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__leaf_free(H5B2_leaf_t *leaf)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /*
+     * Check arguments.
+     */
+    HDassert(leaf);
+
+    /* Release leaf's native key buffer */
+    if(leaf->leaf_native)
+        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)
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
+
+    /* Sanity check */
+    HDassert(NULL == leaf->top_proxy);
+
+    /* Free B-tree leaf node info */
+    leaf = H5FL_FREE(H5B2_leaf_t, leaf);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__leaf_free() */
+
+#ifdef H5B2_DEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__assert_leaf
+ *
+ * Purpose:	Verify than a leaf node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE herr_t
+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() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__assert_leaf2
+ *
+ * Purpose:	Verify than a leaf node is mostly sane
+ *
+ * Return:	Non-negative on success, negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 19 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE herr_t
+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() */
+#endif /* H5B2_DEBUG */
+
diff --git a/src/H5B2module.h b/src/H5B2module.h
index 0fc30a5..35c982c 100644
--- a/src/H5B2module.h
+++ b/src/H5B2module.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5B2pkg.h b/src/H5B2pkg.h
index ca5a55e..e24d2eb 100644
--- a/src/H5B2pkg.h
+++ b/src/H5B2pkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -125,6 +123,9 @@
 #define H5B2_NUM_INT_REC(h, d) \
     (((h)->node_size - (H5B2_INT_PREFIX_SIZE + H5B2_INT_POINTER_SIZE(h, d))) / ((h)->rrec_size + H5B2_INT_POINTER_SIZE(h, d)))
 
+/* Uncomment this macro to enable extra sanity checking */
+/* #define H5B2_DEBUG */
+
 
 /****************************/
 /* Package Private Typedefs */
@@ -170,7 +171,6 @@ 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 */
@@ -183,12 +183,29 @@ 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 */
     void        *min_native_rec; /* Pointer to minimum native record                  */
     void        *max_native_rec; /* Pointer to maximum native record                  */
 
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t     swmr_write;     /* Whether we are doing SWMR writes */
+    H5AC_proxy_entry_t *top_proxy;  /* 'Top' proxy cache entry for all B-tree entries */
+    void        *parent;        /* Pointer to 'top' proxy flush dependency
+                                 * parent, if it exists, otherwise NULL.
+                                 * If the v2 B-tree is being used to index a
+                                 * chunked dataset 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 v2 B-tree header.
+ 				 *
+ 				 * The field is used to avoid duplicate setups
+                                 * of the flush dependency relationship, and to
+                                 * allow the v2 B-tree header to destroy the
+                                 * flush dependency on receipt of an eviction
+                                 * notification from the metadata cache.
+				 */
+    uint64_t    shadow_epoch;   /* Epoch of header, for making shadow copies */
+
     /* Client information (not stored) */
     const H5B2_class_t *cls;	/* Class of B-tree client */
     void        *cb_ctx;        /* Client callback context */
@@ -201,11 +218,13 @@ 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      */
+
+    /* SWMR / Flush dependency information (not stored) */
+    H5AC_proxy_entry_t *top_proxy;  /* 'Top' proxy cache entry for all B-tree entries */
+    void        *parent;        /* Flush dependency parent for leaf           */
+    uint64_t    shadow_epoch;   /* Epoch of node, for making shadow copies */
 } H5B2_leaf_t;
 
 /* B-tree internal node information */
@@ -215,13 +234,15 @@ 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  */
+
+    /* SWMR / Flush dependency information (not stored) */
+    H5AC_proxy_entry_t *top_proxy;  /* 'Top' proxy cache entry for all B-tree entries */
+    void        *parent;        /* Flush dependency parent for internal node  */
+    uint64_t    shadow_epoch;   /* Epoch of node, for making shadow copies */
 } H5B2_internal_t;
 
 /* v2 B-tree */
@@ -247,14 +268,14 @@ typedef enum H5B2_update_status_t {
     H5B2_UPDATE_INSERT_CHILD_FULL   /* Update will insert record, but child is full */
 } H5B2_update_status_t;
 
-/* Callback info for loading a free space header into the cache */
+/* Callback info for loading a v2 B-tree 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;
 
-/* Callback info for loading a free space internal node into the cache */
+/* Callback info for loading a v2 B-tree internal node into the cache */
 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 */
@@ -263,7 +284,7 @@ typedef struct H5B2_internal_cache_ud_t {
     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 */
+/* Callback info for loading a v2 B-tree 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 */
@@ -284,15 +305,6 @@ typedef struct H5B2_node_info_test_t {
 /* Package Private Variables */
 /*****************************/
 
-/* H5B2 header inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_BT2_HDR[1];
-
-/* H5B2 internal node inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_BT2_INT[1];
-
-/* H5B2 leaf node inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_BT2_LEAF[1];
-
 /* Declare a free list to manage the H5B2_internal_t struct */
 H5FL_EXTERN(H5B2_internal_t);
 
@@ -322,9 +334,27 @@ extern const H5B2_class_t *const H5B2_client_class_g[H5B2_NUM_BTREE_ID];
 /* 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__update_flush_depend(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned depth, const H5B2_node_ptr_t *node_ptr, void *old_parent,
+    void *new_parent);
 H5_DLL herr_t H5B2__destroy_flush_depend(H5AC_info_t *parent_entry,
     H5AC_info_t *child_entry);
 
+/* Internal node management routines */
+H5_DLL 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);
+H5_DLL herr_t H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    H5B2_internal_t *internal, unsigned idx);
+H5_DLL 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);
+H5_DLL 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);
+H5_DLL 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);
+
 /* 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,
@@ -343,17 +373,23 @@ H5_DLL herr_t H5B2__hdr_unprotect(H5B2_hdr_t *hdr, hid_t dxpl_id,
 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,
-    void *parent, uint16_t nrec, unsigned flags);
+H5_DLL H5B2_leaf_t * H5B2__protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    void *parent, H5B2_node_ptr_t *node_ptr, hbool_t shadow, unsigned flags);
+H5_DLL 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);
 
 /* 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, void *parent, uint16_t nrec, uint16_t depth, unsigned flags);
+    void *parent, H5B2_node_ptr_t *node_ptr, uint16_t depth, hbool_t shadow,
+    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, void *parent,
     H5B2_node_ptr_t *node_ptr);
+H5_DLL herr_t H5B2__create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    H5B2_node_ptr_t *node_ptr, uint16_t depth);
 
 /* Routines for releasing structures */
 H5_DLL herr_t H5B2__hdr_free(H5B2_hdr_t *hdr);
@@ -361,7 +397,7 @@ 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_hdr(H5B2_hdr_t *hdr, hid_t dxpl_id, void *udata);
+H5_DLL herr_t H5B2__insert(H5B2_hdr_t *hdr, hid_t dxpl_id, 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);
@@ -430,6 +466,15 @@ 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);
 
+/* Sanity checking routines */
+#ifdef H5B2_DEBUG
+/* Don't label these with H5_ATTR_PURE or you'll get even more warnings... */
+H5_DLL herr_t H5B2__assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal);
+H5_DLL 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);
+H5_DLL herr_t H5B2__assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf);
+H5_DLL herr_t H5B2__assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t *leaf2);
+#endif /* H5B2_DEBUG */
+
 /* Testing routines */
 #ifdef H5B2_TESTING
 H5_DLL herr_t H5B2_get_root_addr_test(H5B2_t *bt2, haddr_t *root_addr);
diff --git a/src/H5B2private.h b/src/H5B2private.h
index eef8aa3..e4bbffa 100644
--- a/src/H5B2private.h
+++ b/src/H5B2private.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -147,19 +145,14 @@ H5_DLL herr_t H5B2_update(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);
+H5_DLL herr_t H5B2_depend(H5B2_t *bt2, hid_t dxpl_id, H5AC_proxy_entry_t *parent);
 H5_DLL herr_t H5B2_patch_file(H5B2_t *fa, H5F_t *f);
 
 /* Statistics routines */
diff --git a/src/H5B2public.h b/src/H5B2public.h
index 43ec5d7..6e0b964 100644
--- a/src/H5B2public.h
+++ b/src/H5B2public.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5B2stat.c b/src/H5B2stat.c
index da721c6..df99ad5 100644
--- a/src/H5B2stat.c
+++ b/src/H5B2stat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5B2test.c b/src/H5B2test.c
index be4265f..c10e5a8 100644
--- a/src/H5B2test.c
+++ b/src/H5B2test.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -556,7 +554,7 @@ 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, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, parent, &curr_node_ptr, depth, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
         /* Unpin parent if necessary */
@@ -610,7 +608,7 @@ 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, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, parent, &curr_node_ptr, FALSE, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Unpin parent if necessary */
diff --git a/src/H5Bcache.c b/src/H5Bcache.c
index 2036257..a0a75c8 100644
--- a/src/H5Bcache.c
+++ b/src/H5Bcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -54,15 +52,13 @@
 /********************/
 
 /* Metadata cache callbacks */
-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,
+static herr_t H5B__cache_get_initial_load_size(void *udata, size_t *image_len);
+static void *H5B__cache_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,
+static herr_t H5B__cache_image_len(const void *thing, size_t *image_len);
+static herr_t H5B__cache_serialize(const H5F_t *f, void *image, size_t len,
     void *thing);
-static herr_t H5B__free_icr(void *thing);
+static herr_t H5B__cache_free_icr(void *thing);
 
 
 /*********************/
@@ -75,15 +71,15 @@ const H5AC_class_t H5AC_BT[1] = {{
     "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 */
+    H5B__cache_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_load_size' callback */
     NULL,				/* 'verify_chksum' callback */
-    H5B__deserialize,                   /* 'deserialize' callback */
-    H5B__image_len,                     /* 'image_len' callback */
+    H5B__cache_deserialize,             /* 'deserialize' callback */
+    H5B__cache_image_len,               /* 'image_len' callback */
     NULL,                               /* 'pre_serialize' callback */
-    H5B__serialize,                     /* 'serialize' callback */
+    H5B__cache_serialize,               /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
-    H5B__free_icr,                      /* 'free_icr' callback */
-    NULL,				/* 'clear" callback */
+    H5B__cache_free_icr,                /* 'free_icr' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -94,7 +90,7 @@ const H5AC_class_t H5AC_BT[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B__get_load_size
+ * Function:    H5B__cache_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -107,10 +103,8 @@ const H5AC_class_t H5AC_BT[1] = {{
  *-------------------------------------------------------------------------
  */
 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)
+H5B__cache_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
 
@@ -120,24 +114,19 @@ H5B__get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *
     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);
+    /* 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);
-    }
+    /* Set the image length size */
+    *image_len = shared->sizeof_rnode;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B__get_load_size() */
+} /* end H5B__cache_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B__deserialize
+ * Function:    H5B__cache_deserialize
  *
  * Purpose:     Deserialize the data structure from disk.
  *
@@ -151,7 +140,7 @@ H5B__get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *
  *-------------------------------------------------------------------------
  */
 static void *
-H5B__deserialize(const void *_image, size_t H5_ATTR_UNUSED len, void *_udata,
+H5B__cache_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 */
@@ -240,11 +229,11 @@ done:
             HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__deserialize() */
+} /* end H5B__cache_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B__image_len
+ * Function:    H5B__cache_image_len
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -257,8 +246,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5B__cache_image_len(const void *_thing, size_t *image_len)
 {
     const H5B_t *bt = (const H5B_t *)_thing;        /* Pointer to the B-tree node */
     H5B_shared_t *shared;       /* Pointer to shared B-tree info */
@@ -277,11 +265,11 @@ H5B__image_len(const void *_thing, size_t *image_len,
     *image_len = shared->sizeof_rnode;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B__image_len() */
+} /* end H5B__cache_image_len() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B__serialize
+ * Function:    H5B__cache_serialize
  *
  * Purpose:     Serialize the data structure for writing to disk.
  *
@@ -294,7 +282,7 @@ H5B__image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B__serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+H5B__cache_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
     void *_thing)
 {
     H5B_t *bt = (H5B_t *)_thing;        /* Pointer to the B-tree node */
@@ -321,6 +309,11 @@ H5B__serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
 
     /* node type and level */
     *image++ = (uint8_t)shared->type->id;
+
+    /* 2^8 limit: only 1 byte is used to store node level */
+    if(bt->level >= HDpow(2, LEVEL_BITS))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode node level")
+
     H5_CHECK_OVERFLOW(bt->level, unsigned, uint8_t);
     *image++ = (uint8_t)bt->level;
 
@@ -358,11 +351,11 @@ H5B__serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__serialize() */
+} /* end H5B__cache_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B__free_icr
+ * Function:    H5B__cache_free_icr
  *
  * Purpose:     Destroy/release an "in core representation" of a data structure
  *
@@ -375,7 +368,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B__free_icr(void *thing)
+H5B__cache_free_icr(void *thing)
 {
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -390,4 +383,5 @@ H5B__free_icr(void *thing)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__free_icr() */
+} /* end H5B__cache_free_icr() */
+
diff --git a/src/H5Bdbg.c b/src/H5Bdbg.c
index b22264d..3881b44 100644
--- a/src/H5Bdbg.c
+++ b/src/H5Bdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Bmodule.h b/src/H5Bmodule.h
index 6800b26..bc46752 100644
--- a/src/H5Bmodule.h
+++ b/src/H5Bmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h
index e645626..14dce4f 100644
--- a/src/H5Bpkg.h
+++ b/src/H5Bpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -42,6 +40,7 @@
 
 /* Get the native key at a given index */
 #define H5B_NKEY(b, shared, idx)  ((b)->native + (shared)->nkey[(idx)])
+#define LEVEL_BITS	8 	/* # of bits for node level: 1 byte */
 
 
 /****************************/
@@ -72,9 +71,6 @@ typedef struct H5B_cache_ud_t {
 /* Package Private Variables */
 /*****************************/
 
-/* H5B header inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_BT[1];
-
 /* Declare a free list to manage the haddr_t sequence information */
 H5FL_SEQ_EXTERN(haddr_t);
 
diff --git a/src/H5Bprivate.h b/src/H5Bprivate.h
index 02fb82c..cb038ec 100644
--- a/src/H5Bprivate.h
+++ b/src/H5Bprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Bpublic.h b/src/H5Bpublic.h
index 0016996..1764f61 100644
--- a/src/H5Bpublic.h
+++ b/src/H5Bpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5C.c b/src/H5C.c
index 211cf2d..e6770ec 100644
--- a/src/H5C.c
+++ b/src/H5C.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -46,9 +44,9 @@
  *	 - Change protect/unprotect to lock/unlock.
  *
  *	 - Flush entries in increasing address order in
- *	   H5C_make_space_in_cache().
+ *	   H5C__make_space_in_cache().
  *
- *	 - Also in H5C_make_space_in_cache(), use high and low water marks
+ *	 - Also in H5C__make_space_in_cache(), use high and low water marks
  *	   to reduce the number of I/O calls.
  *
  *	 - When flushing, attempt to combine contiguous entries to reduce
@@ -75,17 +73,13 @@
 /****************/
 
 #include "H5Cmodule.h"          /* This source code file is part of the H5C module */
-#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5F_FRIEND		/* suppress error about including H5Fpkg  */
 
 
 /***********/
 /* Headers */
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
-#ifdef H5_HAVE_PARALLEL
-#define H5AC_FRIEND		/*suppress error about including H5ACpkg	  */
-#include "H5ACpkg.h"        /* Metadata cache                       */
-#endif /* H5_HAVE_PARALLEL */
 #include "H5Cpkg.h"		/* Cache				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"		/* Files				*/
@@ -140,15 +134,12 @@ static herr_t H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr);
 static herr_t H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr);
 
 static herr_t H5C__flash_increase_cache_size(H5C_t * cache_ptr,
-                                             size_t old_entry_size,
-                                             size_t new_entry_size);
+    size_t old_entry_size, size_t new_entry_size);
 
-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 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_invalidate_ring(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);
@@ -162,42 +153,16 @@ static void * H5C_load_entry(H5F_t *             f,
                              haddr_t             addr,
                              void *              udata);
 
-static herr_t H5C_make_space_in_cache(H5F_t * f,
-                                      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);
-
-static herr_t H5C__generate_image(const H5F_t *f, H5C_t * cache_ptr, H5C_cache_entry_t *entry_ptr, 
-                                  hid_t dxpl_id, int64_t *entry_size_change_ptr);
+static herr_t H5C__serialize_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring);
+static herr_t H5C__serialize_single_entry(H5F_t *f, hid_t dxpl_id, 
+    H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr);
 
-#if H5C_DO_TAGGING_SANITY_CHECKS
-static herr_t H5C_verify_tag(int id, haddr_t tag);
-#endif
+static herr_t H5C__verify_len_eoa(H5F_t *f, const H5C_class_t * type,
+    haddr_t addr, size_t *len, hbool_t actual);
 
 #if H5C_DO_SLIST_SANITY_CHECKS
 static hbool_t H5C_entry_in_skip_list(H5C_t * cache_ptr, 
@@ -211,14 +176,10 @@ 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);
+static void H5C__assert_flush_dep_nocycle(const H5C_cache_entry_t * entry,
+                                          const 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 */
@@ -227,6 +188,9 @@ herr_t H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn);
 /* Package initialization variable */
 hbool_t H5_PKG_INIT_VAR = FALSE;
 
+/* Declare a free list to manage the tag info struct */
+H5FL_DEFINE(H5C_tag_info_t);
+
 
 /*****************************/
 /* Library Private Variables */
@@ -243,218 +207,6 @@ H5FL_DEFINE_STATIC(H5C_t);
 /* Declare a free list to manage flush dependency arrays */
 H5FL_BLK_DEFINE_STATIC(parent);
 
-/* Declare extern free list to manage the H5C_collective_write_t struct */
-H5FL_EXTERN(H5C_collective_write_t);
-
-/* Declare a free list to manage corked object addresses */
-H5FL_DEFINE_STATIC(haddr_t);
-
-

-/****************************************************************************
- *
- * #defines and declarations for epoch marker cache entries.
- *
- * As a strategy for automatic cache size reduction, the cache may insert
- * marker entries in the LRU list at the end of each epoch.  These markers
- * are then used to identify entries that have not been accessed for n
- * epochs so that they can be evicted from the cache.
- *
- ****************************************************************************/
-
-/* Note that H5C__MAX_EPOCH_MARKERS is defined in H5Cpkg.h, not here because
- * it is needed to dimension arrays in H5C_t.
- */
-
-#define H5C__EPOCH_MARKER_TYPE	H5C__MAX_NUM_TYPE_IDS
-
-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,
-    /* 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:
- *
- * None of these functions should ever be called, so there is no point in
- * documenting them separately.
- *                                                     JRM - 11/16/04
- *
- ***************************************************************************/
-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)
-{
-    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_get_load_size() */
-
-

-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)
-{
-    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(FALSE)
-} /* end H5C__epoch_marker_verify_chksum() */
-
-

-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 */
-
-    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
-
-    FUNC_LEAVE_NOAPI(NULL)
-} /* end H5C__epoch_marker_deserialize() */
-
-

-static herr_t
-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)
-{
-    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_image_len() */
-
-

-static herr_t
-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)
-{
-    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_pre_serialize() */
-
-

-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 */
-
-    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,
-                       void H5_ATTR_UNUSED * thing)
-{
-    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_notify() */
-
-

-static herr_t
-H5C__epoch_marker_free_icr(void H5_ATTR_UNUSED * thing)
-{
-    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_free_icr() */
-
-

-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() */
-
 
 

 /*-------------------------------------------------------------------------
@@ -485,7 +237,7 @@ H5C_t *
 H5C_create(size_t		      max_cache_size,
            size_t		      min_clean_size,
            int			      max_type_id,
-           const char *		      (* type_name_table_ptr),
+           const H5C_class_t * const * class_table_ptr,
            H5C_write_permitted_func_t check_write_permitted,
            hbool_t		      write_permitted,
            H5C_log_flush_func_t       log_flush,
@@ -503,29 +255,21 @@ H5C_create(size_t		      max_cache_size,
 
     HDassert( max_type_id >= 0 );
     HDassert( max_type_id < H5C__MAX_NUM_TYPE_IDS );
-    HDassert( type_name_table_ptr );
+    HDassert( class_table_ptr );
 
     for ( i = 0; i <= max_type_id; i++ ) {
+        HDassert( (class_table_ptr)[i] );
+        HDassert(HDstrlen((class_table_ptr)[i]->name) > 0);
+    } /* end for */
 
-        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(NULL == (cache_ptr = H5FL_CALLOC(H5C_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    if ( (cache_ptr->cork_list_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL ) {
+    if(NULL == (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list")
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list for corked object addresses.")
-    }
+    if(NULL == (cache_ptr->tag_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list for tagged entry addresses")
 
     /* If we get this far, we should succeed.  Go ahead and initialize all
      * the fields.
@@ -547,7 +291,7 @@ H5C_create(size_t		      max_cache_size,
 
     cache_ptr->max_type_id			= max_type_id;
 
-    cache_ptr->type_name_table_ptr		= type_name_table_ptr;
+    cache_ptr->class_table_ptr			= class_table_ptr;
 
     cache_ptr->max_cache_size			= max_cache_size;
     cache_ptr->min_clean_size			= min_clean_size;
@@ -558,6 +302,7 @@ H5C_create(size_t		      max_cache_size,
     cache_ptr->log_flush			= log_flush;
 
     cache_ptr->evictions_enabled		= TRUE;
+    cache_ptr->close_warning_received		= FALSE;
 
     cache_ptr->index_len			= 0;
     cache_ptr->index_size			= (size_t)0;
@@ -574,12 +319,18 @@ H5C_create(size_t		      max_cache_size,
 	cache_ptr->slist_ring_size[i]		= (size_t)0;
     } /* end for */
 
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++)
+        (cache_ptr->index)[i] = NULL;
+
+    cache_ptr->il_len				= 0;
+    cache_ptr->il_size				= (size_t)0;
+    cache_ptr->il_head				= NULL;
+    cache_ptr->il_tail				= NULL;
+
     /* Tagging Field Initializations */
     cache_ptr->ignore_tags                      = FALSE;
 
     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;
 
@@ -588,11 +339,9 @@ H5C_create(size_t		      max_cache_size,
     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->entries_removed_counter		= 0;
     cache_ptr->last_entry_removed_ptr		= NULL;
+    cache_ptr->entry_watched_for_removal        = NULL;
 
     cache_ptr->pl_len				= 0;
     cache_ptr->pl_size				= (size_t)0;
@@ -614,6 +363,7 @@ H5C_create(size_t		      max_cache_size,
     cache_ptr->coll_list_size			= (size_t)0;
     cache_ptr->coll_head_ptr			= NULL;
     cache_ptr->coll_tail_ptr			= NULL;
+    cache_ptr->coll_write_list			= NULL;
 #endif /* H5_HAVE_PARALLEL */
 
     cache_ptr->cLRU_list_len			= 0;
@@ -633,6 +383,8 @@ H5C_create(size_t		      max_cache_size,
     cache_ptr->resize_enabled			= FALSE;
     cache_ptr->cache_full			= FALSE;
     cache_ptr->size_decreased			= FALSE;
+    cache_ptr->resize_in_progress		= FALSE;
+    cache_ptr->msic_in_progress			= FALSE;
 
     (cache_ptr->resize_ctl).version		= H5C__CURR_AUTO_SIZE_CTL_VER;
     (cache_ptr->resize_ctl).rpt_fcn		= NULL;
@@ -678,48 +430,70 @@ H5C_create(size_t		      max_cache_size,
         ((cache_ptr->epoch_markers)[i]).magic		 =
 					       H5C__H5C_CACHE_ENTRY_T_MAGIC;
         ((cache_ptr->epoch_markers)[i]).addr		 = (haddr_t)i;
-        ((cache_ptr->epoch_markers)[i]).type		 = &epoch_marker_class;
+        ((cache_ptr->epoch_markers)[i]).type		 = H5AC_EPOCH_MARKER;
     }
 
-    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
-
+    /* Initialize cache image generation on file close related fields.
+     * Initial value of image_ctl must match H5C__DEFAULT_CACHE_IMAGE_CTL
+     * in H5Cprivate.h.
+     */
+    cache_ptr->image_ctl.version            = H5C__CURR_CACHE_IMAGE_CTL_VER;
+    cache_ptr->image_ctl.generate_image     = FALSE;
+    cache_ptr->image_ctl.save_resize_status = FALSE;
+    cache_ptr->image_ctl.entry_ageout       = -1;
+    cache_ptr->image_ctl.flags              = H5C_CI__ALL_FLAGS;
+
+    cache_ptr->serialization_in_progress= FALSE;
+    cache_ptr->load_image		= FALSE;
+    cache_ptr->image_loaded             = FALSE;
+    cache_ptr->delete_image		= FALSE;
+    cache_ptr->image_addr		= HADDR_UNDEF;
+    cache_ptr->image_len		= 0;
+    cache_ptr->image_data_len		= 0;
+
+    cache_ptr->entries_loaded_counter		= 0;
+    cache_ptr->entries_inserted_counter		= 0;
+    cache_ptr->entries_relocated_counter	= 0;
+    cache_ptr->entry_fd_height_change_counter	= 0;
+
+    cache_ptr->num_entries_in_image	= 0;
+    cache_ptr->image_entries		= NULL;
+    cache_ptr->image_buffer		= NULL;
+
+    /* initialize free space manager related fields: */
+    cache_ptr->rdfsm_settled		= FALSE;
+    cache_ptr->mdfsm_settled		= FALSE;
+
+    if(H5C_reset_cache_hit_rate_stats(cache_ptr) < 0)
         /* this should be impossible... */
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
-                    "H5C_reset_cache_hit_rate_stats failed.")
-    }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "H5C_reset_cache_hit_rate_stats failed")
 
     H5C_stats__reset(cache_ptr);
 
     cache_ptr->prefix[0]			= '\0';  /* empty string */
 
 #ifndef NDEBUG
-    cache_ptr->get_entry_ptr_from_addr_counter	= 0;  
+    cache_ptr->get_entry_ptr_from_addr_counter  = 0;
 #endif /* NDEBUG */
 
     /* Set return value */
     ret_value = cache_ptr;
 
 done:
-
-    if ( ret_value == 0 ) {
-
-        if ( cache_ptr != NULL ) {
-
-            if ( cache_ptr->slist_ptr != NULL )
+    if(NULL == ret_value) {
+        if(cache_ptr != NULL) {
+            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);
+            if(cache_ptr->tag_list != NULL)
+                H5SL_close(cache_ptr->tag_list);
 
             cache_ptr->magic = 0;
             cache_ptr = H5FL_FREE(H5C_t, cache_ptr);
-
         } /* end if */
-
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_create() */
 
 

@@ -910,32 +684,126 @@ H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_free_cork_list_cb
+ * Function:    H5C_free_tag_list_cb
  *
- * Purpose:     Callback function to free the list of object addresses 
- *		on the skip list.
+ * Purpose:     Callback function to free tag nodes from the skip list.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Vailin Choi; January 2014
+ * 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)
+H5C_free_tag_list_cb(void *_item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op_data)
 {
-    haddr_t *addr = (haddr_t *)_item;
+    H5C_tag_info_t *tag_info = (H5C_tag_info_t *)_item;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    HDassert(addr);
+    HDassert(tag_info);
 
     /* Release the item */
-    addr = H5FL_FREE(haddr_t, addr);
+    tag_info = H5FL_FREE(H5C_tag_info_t, tag_info);
 
     FUNC_LEAVE_NOAPI(0)
-}  /* H5C_free_cork_list_cb() */
+}  /* H5C_free_tag_list_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_prep_for_file_close
+ *
+ * Purpose:     This function should be called just prior to the cache 
+ *		flushes at file close.  There should be no protected 
+ *		entries in the cache at this point.
+ *		
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/3/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_prep_for_file_close(H5F_t *f, hid_t dxpl_id)
+{
+    H5C_t *     cache_ptr;
+    hbool_t     image_generated = FALSE;        /* Whether a cache image was generated */
+    herr_t	ret_value = SUCCEED;            /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* For now at least, it is possible to receive the 
+     * close warning more than once -- the following 
+     * if statement handles this.
+     */
+    if(cache_ptr->close_warning_received)
+        HGOTO_DONE(SUCCEED)
+    cache_ptr->close_warning_received = TRUE;
+
+    /* Make certain there aren't any protected entries */
+    HDassert(cache_ptr->pl_len == 0);
+
+    /* Prepare cache image */
+    if(H5C__prep_image_for_file_close(f, dxpl_id, &image_generated) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create cache image")
+
+#ifdef H5_HAVE_PARALLEL
+    if ( ( H5F_INTENT(f) & H5F_ACC_RDWR ) &&
+         ( ! image_generated ) && 
+         ( cache_ptr->aux_ptr != NULL ) && 
+         ( f->shared->fs_persist ) ) {
+        /* If persistent free space managers are enabled, flushing the
+         * metadata cache may result in the deletion, insertion, and/or
+         * dirtying of entries.
+         *
+         * This is a problem in PHDF5, as it breaks two invariants of
+         * our management of the metadata cache across all processes:
+         *
+         * 1) Entries will not be dirtied, deleted, inserted, or moved
+         *    during flush in the parallel case.
+         *
+         * 2) All processes contain the same set of dirty metadata
+         *    entries on entry to a sync point.
+         *
+         * To solve this problem for the persistent free space managers,
+         * serialize the metadata cache on all processes prior to the
+         * first sync point on file shutdown.  The shutdown warning is
+         * a convenient location for this call.
+         *
+         * This is sufficient since:
+         *
+         * 1) FSM settle routines are only invoked on file close.  Since
+         *    serialization make the same settle calls as flush on file
+         *    close, and since the close warning is issued after all
+         *    non FSM related space allocations and just before the
+         *    first sync point on close, this call will leave the caches
+         *    in a consistant state across the processes if they were
+         *    consistant before.
+         *
+         * 2) Since the FSM settle routines are only invoked once during
+         *    file close, invoking them now will prevent their invocation
+         *    during a flush, and thus avoid any resulting entrie dirties,
+         *    deletions, insertion, or moves during the flush.
+         */
+        if(H5C__serialize_cache(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "serialization of the cache failed")
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
 
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_prep_for_file_close() */
 
 

 /*-------------------------------------------------------------------------
@@ -973,39 +841,39 @@ H5C_dest(H5F_t * f, hid_t dxpl_id)
     /* Sanity check */
     HDassert(cache_ptr);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+
+#if H5AC_DUMP_IMAGE_STATS_ON_CLOSE
+    if(H5C_image_stats(cache_ptr, TRUE) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't display cache image stats")
+#endif /* H5AC_DUMP_IMAGE_STATS_ON_CLOSE */
 
     /* Flush and invalidate all cache entries */
     if(H5C_flush_invalidate_cache(f, dxpl_id, H5C__NO_FLAGS_SET) < 0 )
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
 
+    /* Generate & write cache image if requested */
+    if(cache_ptr->image_ctl.generate_image)
+        if(H5C__generate_cache_image(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "Can't generate metadata cache image")
+
     if(cache_ptr->slist_ptr != NULL) {
         H5SL_close(cache_ptr->slist_ptr);
         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;
+    if(cache_ptr->tag_list != NULL) {
+        H5SL_destroy(cache_ptr->tag_list, H5C_free_tag_list_cb, NULL);
+        cache_ptr->tag_list = 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 
+#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);
+    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 */
 
@@ -1023,21 +891,20 @@ done:
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Vailin Choi; Dec 2013
+ * Programmer:  Vailin Choi
+ *		Dec 2013
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5C_evict(H5F_t * f, hid_t dxpl_id)
 {
-    H5C_t *cache_ptr = f->shared->cache;
     herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Sanity check */
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(f);
 
     /* 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 )
@@ -1069,10 +936,6 @@ H5C_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type,
     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 */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -1087,8 +950,7 @@ H5C_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *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");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "LRU extreme sanity check failed on entry")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     /* Look for entry in cache */
@@ -1102,53 +964,28 @@ H5C_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type,
 
     /* Check for entry being pinned or protected */
     if(entry_ptr->is_protected)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "Target entry 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.")
-#ifdef H5_HAVE_PARALLEL
-    if(entry_ptr->coll_access) {
-        entry_ptr->coll_access = FALSE;
-        H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, FAIL)
-    } /* end if */
-#endif /* H5_HAVE_PARALLEL */
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "Target entry is pinned")
 
     /* 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.
      */
 
-    /* Pass along 'free file space' flag to  cache client.  */
+    /* Pass along 'free file space' flag */
     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, NULL) < 0)
+    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flush_flags) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "can't flush entry")
 
-#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 extreme sanity check failed on exit.\n");
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "LRU extreme sanity check failed on exit")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1196,6 +1033,10 @@ done:
  *
  *						JRM -- 8/30/15
  *
+ *		Modified function to call the free space manager 
+ *		settling functions.
+ *						JRM -- 6/9/16
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -1203,12 +1044,12 @@ H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
 {
 #if H5C_DO_SANITY_CHECKS
     int			i;
-    int32_t		index_len = 0;
+    uint32_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;
+    uint32_t		slist_len = 0;
 #endif /* H5C_DO_SANITY_CHECKS */
     H5C_ring_t		ring;
     H5C_t             * cache_ptr;
@@ -1255,7 +1096,7 @@ H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
     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");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on entry")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 );
@@ -1267,7 +1108,7 @@ H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
 
     if(destroy) {
         if(H5C_flush_invalidate_cache(f, dxpl_id, flags) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush invalidate failed.")
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush invalidate failed")
     } /* end if */
     else {
 	/* flush each ring, starting from the outermost ring and 
@@ -1275,8 +1116,41 @@ H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
          */
         ring = H5C_RING_USER;
 	while(ring < H5C_RING_NTYPES) {
+
+            /* Only call the free space manager settle routines when close
+             * warning has been received.
+             */
+	    if(cache_ptr->close_warning_received) {
+		switch(ring) {
+		    case H5C_RING_USER:
+			break;
+
+		    case H5C_RING_RDFSM:
+                        /* Settle raw data FSM */
+			if(!cache_ptr->rdfsm_settled)
+			    if(H5MF_settle_raw_data_fsm(f, dxpl_id, &cache_ptr->rdfsm_settled) < 0)
+                                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "RD FSM settle failed")
+			break;
+
+		    case H5C_RING_MDFSM:
+                        /* Settle metadata FSM */
+			if(!cache_ptr->mdfsm_settled)
+			    if(H5MF_settle_meta_data_fsm(f, dxpl_id, &cache_ptr->mdfsm_settled) < 0)
+                                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "MD FSM settle failed")
+			break;
+
+		    case H5C_RING_SBE:
+		    case H5C_RING_SB:
+			break;
+
+		    default:
+                        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown ring?!?!")
+			break;
+		} /* end switch */
+            } /* end if */
+
 	    if(H5C_flush_ring(f, dxpl_id, ring, flags) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush ring failed.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush ring failed")
             ring++;
         } /* end while */
     } /* end else */
@@ -1317,9 +1191,8 @@ H5C_flush_to_min_clean(H5F_t * f,
 		       hid_t    dxpl_id)
 {
     H5C_t *             cache_ptr;
-    herr_t      	result;
     hbool_t		write_permitted;
-#if 0 /* modified code -- commented out for now */
+#if 0 /* modified code -- commented out for now */ /* JRM */
     int			i;
     int			flushed_entries_count = 0;
     size_t		flushed_entries_size = 0;
@@ -1339,36 +1212,19 @@ H5C_flush_to_min_clean(H5F_t * f,
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
 
-    if ( cache_ptr->check_write_permitted != NULL ) {
-
-        result = (cache_ptr->check_write_permitted)(f, &write_permitted);
-
-        if ( result < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, 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_SYSTEM, FAIL, "can't get write_permitted")
+    } /* end if */
+    else
         write_permitted = cache_ptr->write_permitted;
-    }
 
-    if ( ! write_permitted ) {
+    if(!write_permitted)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "cache write is not permitted!?!")
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "cache write is not permitted!?!\n");
-    }
 #if 1 /* original code */
-    result = H5C_make_space_in_cache(f,
-                                     dxpl_id,
-                                     (size_t)0,
-                                     write_permitted);
-
-    if ( result < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_make_space_in_cache failed.")
-    }
+    if(H5C__make_space_in_cache(f, dxpl_id, (size_t)0, write_permitted) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C__make_space_in_cache failed")
 #else /* modified code -- commented out for now */
     if ( cache_ptr->max_cache_size > cache_ptr->index_size ) {
 
@@ -1406,12 +1262,8 @@ H5C_flush_to_min_clean(H5F_t * f,
          */
         flushed_entries_list = (haddr_t *)H5MM_malloc(sizeof(haddr_t) *
                                               (size_t)(cache_ptr->slist_len));
-
-        if ( flushed_entries_list == NULL ) {
-
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                        "memory allocation failed for flushed entries list")
-        }
+        if(flushed_entries_list == NULL)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flushed entries list")
 
         /* Scan the dirty LRU list from tail forward and mark sufficient
          * entries to free up the necessary space.  Keep a list of the
@@ -1441,13 +1293,8 @@ H5C_flush_to_min_clean(H5F_t * f,
 
 
         /* Flush the marked entries */
-	result = H5C_flush_cache(f, primary_dxpl_id, secondary_dxpl_id,
-                                 H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_IGNORE_PROTECTED_FLAG);
-
-        if ( result < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_cache failed.")
-        }
+        if(H5C_flush_cache(f, primary_dxpl_id, secondary_dxpl_id, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_IGNORE_PROTECTED_FLAG) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_cache failed")
 
         /* Now touch up the LRU list so as to place the flushed entries in
          * the order they they would be in if we had flushed them in the
@@ -1477,759 +1324,1079 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_get_cache_auto_resize_config
+ * Function:    H5C_insert_entry
  *
- * Purpose:	Copy the current configuration of the cache automatic
- *		re-sizing function into the instance of H5C_auto_size_ctl_t
- *		pointed to by config_ptr.
+ * Purpose:     Adds the specified thing to the cache.  The thing need not
+ *              exist on disk yet, but it must have an address and disk
+ *              space reserved.
  *
- * Return:      SUCCEED on success, and FAIL on 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.
+ *
+ *		The primary_dxpl_id is the dxpl_id passed to the
+ *		check_write_permitted function if such a function has been
+ *		provided.
+ *
+ *		Observe that this function cannot occasion a read.
+ *
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  John Mainzer
- *		10/8/04
+ *		6/2/04
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr,
-                                 H5C_auto_size_ctl_t *config_ptr)
+H5C_insert_entry(H5F_t *             f,
+                 hid_t		     dxpl_id,
+                 const H5C_class_t * type,
+                 haddr_t 	     addr,
+                 void *		     thing,
+                 unsigned int        flags)
 {
-    herr_t ret_value = SUCCEED;      /* Return value */
+    H5C_t               *cache_ptr;
+    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             coll_access = FALSE; /* whether access to the cache entry is done 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 = NULL;
+    H5C_cache_entry_t  *test_entry_ptr;
+    hbool_t		entry_tagged = FALSE;
+    herr_t		ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+    HDassert( f );
+    HDassert( f->shared );
 
-    if ( config_ptr == NULL ) {
+    cache_ptr = f->shared->cache;
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad config_ptr on entry.")
-    }
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( type );
+    HDassert( type->mem_type == cache_ptr->class_table_ptr[type->id]->mem_type );
+    HDassert( type->image_len );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( thing );
 
-    *config_ptr = cache_ptr->resize_ctl;
-
-    config_ptr->set_initial_size = FALSE;
-    config_ptr->initial_size = cache_ptr->max_cache_size;
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    /* no need to verify that entry is not already in the index as */
+    /* we already make that check below.                           */
+    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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-done:
+    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 );
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    /* 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")
 
-} /* H5C_get_cache_auto_resize_config() */
+    /* 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")
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_get_cache_size
- *
- * Purpose:	Return the cache maximum size, the minimum clean size, the
- *		current size, and the current number of entries in
- *              *max_size_ptr, *min_clean_size_ptr, *cur_size_ptr, and
- *		*cur_num_entries_ptr respectively.  If any of these
- *		parameters are NULL, skip that value.
- *
- * Return:      SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer
- *		10/8/04
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    herr_t ret_value = SUCCEED;      /* Return value */
+    entry_ptr = (H5C_cache_entry_t *)thing;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    /* verify that the new entry isn't already in the hash table -- scream
+     * and die if it is.
+     */
 
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+    H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+    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 */
 
-    if ( max_size_ptr != NULL ) {
+    entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+    entry_ptr->cache_ptr = cache_ptr;
+    entry_ptr->addr  = addr;
+    entry_ptr->type  = type;
 
-        *max_size_ptr = cache_ptr->max_cache_size;
-    }
+    entry_ptr->image_ptr = NULL;
+    entry_ptr->image_up_to_date = FALSE;
 
-    if ( min_clean_size_ptr != NULL ) {
+    entry_ptr->is_protected = FALSE;
+    entry_ptr->is_read_only = FALSE;
+    entry_ptr->ro_ref_count = 0;
 
-        *min_clean_size_ptr = cache_ptr->min_clean_size;
-    }
+    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;
 
-    if ( cur_size_ptr != NULL ) {
+    /* newly inserted entries are assumed to be dirty */
+    entry_ptr->is_dirty = TRUE;
 
-        *cur_size_ptr = cache_ptr->index_size;
-    }
+    /* not protected, so can't be dirtied */
+    entry_ptr->dirtied  = FALSE;
 
-    if ( cur_num_entries_ptr != NULL ) {
+    /* Retrieve the size of the thing */
+    if((type->image_len)(thing, &(entry_ptr->size)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGETSIZE, FAIL, "can't get size of thing")
+    HDassert(entry_ptr->size > 0 &&  entry_ptr->size < H5C_MAX_ENTRY_SIZE);
 
-        *cur_num_entries_ptr = cache_ptr->index_len;
-    }
+    entry_ptr->in_slist = FALSE;
 
-done:
+#ifdef H5_HAVE_PARALLEL
+    entry_ptr->clear_on_unprotect = FALSE;
+    entry_ptr->flush_immediately = FALSE;
+#endif /* H5_HAVE_PARALLEL */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    entry_ptr->flush_in_progress = FALSE;
+    entry_ptr->destroy_in_progress = FALSE;
 
-} /* H5C_get_cache_size() */
+    entry_ptr->ring = ring;
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_get_cache_hit_rate
- *
- * Purpose:	Compute and return the current cache hit rate in
- *              *hit_rate_ptr.  If there have been no accesses since the
- *              last time the cache hit rate stats were reset, set
- *		*hit_rate_ptr to 0.0.  On error, *hit_rate_ptr is
- *		undefined.
- *
- * Return:      SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer
- *		10/7/04
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_get_cache_hit_rate(H5C_t * cache_ptr, double * hit_rate_ptr)
-{
-    herr_t ret_value = SUCCEED;      /* Return value */
+    /* Initialize flush dependency 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->flush_dep_nunser_children    = 0;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    entry_ptr->ht_next = NULL;
+    entry_ptr->ht_prev = NULL;
+    entry_ptr->il_next = NULL;
+    entry_ptr->il_prev = NULL;
 
-    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)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad hit_rate_ptr on entry.")
+    entry_ptr->next = NULL;
+    entry_ptr->prev = NULL;
 
-    HDassert(cache_ptr->cache_hits >= 0);
-    HDassert(cache_ptr->cache_accesses >= cache_ptr->cache_hits);
+    entry_ptr->aux_next = NULL;
+    entry_ptr->aux_prev = NULL;
 
-    if(cache_ptr->cache_accesses > 0)
-        *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) /
-                         ((double)(cache_ptr->cache_accesses));
-    else
-        *hit_rate_ptr = 0.0f;
+#ifdef H5_HAVE_PARALLEL
+    entry_ptr->coll_next = NULL;
+    entry_ptr->coll_prev = NULL;
+#endif /* H5_HAVE_PARALLEL */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_get_cache_hit_rate() */
+    /* initialize cache image related fields */
+    entry_ptr->include_in_image 		= FALSE;
+    entry_ptr->lru_rank         		= 0;
+    entry_ptr->image_dirty			= FALSE;
+    entry_ptr->fd_parent_count			= 0;
+    entry_ptr->fd_parent_addrs			= NULL;
+    entry_ptr->fd_child_count			= 0;
+    entry_ptr->fd_dirty_child_count		= 0;
+    entry_ptr->image_fd_height			= 0;
+    entry_ptr->prefetched			= FALSE;
+    entry_ptr->prefetch_type_id			= 0;
+    entry_ptr->age				= 0;
+    entry_ptr->prefetched_dirty                 = FALSE;
+#ifndef NDEBUG  /* debugging field */
+    entry_ptr->serialization_count		= 0;
+#endif /* NDEBUG */
 
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5C_get_entry_status
- *
- * Purpose:     This function is used to determine whether the cache
- *		contains an entry with the specified base address.  If
- *		the entry exists, it also reports some status information
- *		on the entry.
- *
- *		Status information is reported in the locations pointed
- *		to by the size_ptr, in_cache_ptr, is_dirty_ptr, and
- *		is_protected_ptr.  While in_cache_ptr must be defined,
- *		the remaining pointers may be NULL, in which case the
- *		associated data is not reported.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              7/1/05
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    H5C_t             * cache_ptr;
-    H5C_cache_entry_t *	entry_ptr = NULL;
-    herr_t		ret_value = SUCCEED;      /* Return value */
+    entry_ptr->tl_next  = NULL;
+    entry_ptr->tl_prev  = NULL;
+    entry_ptr->tag_info = NULL;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    /* 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")
+    entry_tagged = TRUE;
 
-    HDassert( f );
-    HDassert( f->shared );
+    H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
 
-    cache_ptr = f->shared->cache;
+    if(cache_ptr->flash_size_increase_possible &&
+            (entry_ptr->size > cache_ptr->flash_size_increase_threshold))
+        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")
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( H5F_addr_defined(addr) );
-    HDassert( in_cache_ptr != NULL );
+    if(cache_ptr->index_size >= cache_ptr->max_cache_size)
+        empty_space = 0;
+    else
+        empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
 
-    /* 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 ) ) {
+    if(cache_ptr->evictions_enabled &&
+         (((cache_ptr->index_size + entry_ptr->size) > cache_ptr->max_cache_size)
+	   ||
+	   (((empty_space + cache_ptr->clean_index_size) < cache_ptr->min_clean_size)))) {
+        size_t space_needed;
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+	if(empty_space <= entry_ptr->size)
+            cache_ptr->cache_full = TRUE;
 
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+        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;
 
-    if ( entry_ptr == NULL ) {
+        HDassert(entry_ptr->size <= H5C_MAX_ENTRY_SIZE);
+        space_needed = entry_ptr->size;
+        if(space_needed > cache_ptr->max_cache_size)
+            space_needed = cache_ptr->max_cache_size;
 
-        /* the entry doesn't exist in the cache -- report this
-         * and quit.
+        /* Note that space_needed is just the amount of space that
+         * needed to insert the new entry without exceeding the cache
+         * size limit.  The subsequent call to H5C__make_space_in_cache()
+         * may evict the entries required to free more or less space
+         * depending on conditions.  It MAY be less if the cache is
+         * currently undersized, or more if the cache is oversized.
+         *
+         * The cache can exceed its maximum size limit via the following
+         * mechanisms:
+         *
+         * First, it is possible for the cache to grow without
+         * bound as long as entries are protected and not unprotected.
+         *
+         * Second, when writes are not permitted it is also possible
+         * for the cache to grow without bound.
+         *
+         * Finally, we usually don't check to see if the cache is
+         * oversized at the end of an unprotect.  As a result, it is
+         * possible to have a vastly oversized cache with no protected
+         * entries as long as all the protects preceed the unprotects.
+         *
+         * Since items 1 and 2 are not changing any time soon, I see
+         * no point in worrying about the third.
          */
-        *in_cache_ptr = FALSE;
-
-    } else {
 
-        *in_cache_ptr = TRUE;
-
-        if ( size_ptr != NULL ) {
-
-            *size_ptr = entry_ptr->size;
-        }
-
-        if ( is_dirty_ptr != NULL ) {
+        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")
+    } /* end if */
 
-            *is_dirty_ptr = entry_ptr->is_dirty;
-        }
+    H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
 
-        if ( is_protected_ptr != NULL ) {
+    /* New entries are presumed to be dirty */
+    HDassert(entry_ptr->is_dirty);
+    entry_ptr->flush_marker = set_flush_marker;
+    H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+    H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL)
 
-            *is_protected_ptr = entry_ptr->is_protected;
-        }
+#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 just before done")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-        if ( is_pinned_ptr != NULL ) {
+    /* 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")
 
-            *is_pinned_ptr = entry_ptr->is_pinned;
-        }
+    H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
 
-        if ( is_corked_ptr != NULL ) {
+#ifdef H5_HAVE_PARALLEL
+    /* Get the dataset transfer property list */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
 
-            *is_corked_ptr = entry_ptr->is_corked;
-        }
+    if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
+        coll_access = (H5P_USER_TRUE == f->coll_md_read ? TRUE : FALSE);
 
-        if ( is_flush_dep_parent_ptr != NULL ) {
+        if(!coll_access && H5P_FORCE_FALSE != f->coll_md_read) {
+            H5P_coll_md_read_flag_t prop_value;
 
-            *is_flush_dep_parent_ptr = (entry_ptr->flush_dep_nchildren > 0);
-        }
+            /* Get the property value */
+            if(H5P_get(dxpl, H5_COLL_MD_READ_FLAG_NAME, &prop_value) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't get collective metadata access flag")
+            coll_access = (H5P_USER_TRUE == prop_value ? TRUE : FALSE);
+        } /* end if */
+    } /* end if */
 
-        if ( is_flush_dep_child_ptr != NULL ) {
+    entry_ptr->coll_access = coll_access;
+    if(coll_access) {
+        H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, FAIL)
 
-            *is_flush_dep_child_ptr = (entry_ptr->flush_dep_nparents > 0);
-        }
-    }
+        /* Make sure the size of the collective entries in the cache remain in check */
+        if(H5P_USER_TRUE == f->coll_md_read) {
+            if(cache_ptr->max_cache_size * 80 < cache_ptr->coll_list_size * 100) {
+                if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear collective metadata entries")
+            } /* end if */
+        } /* end if */
+        else {
+            if(cache_ptr->max_cache_size * 40 < cache_ptr->coll_list_size * 100) {
+                if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear collective metadata entries")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+#endif
 
 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))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    if(ret_value < 0 && entry_tagged)
+        if(H5C__untag_entry(cache_ptr, entry_ptr) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry from tag list")
 
-} /* H5C_get_entry_status() */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_insert_entry() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_get_evictions_enabled()
+ * Function:    H5C_mark_entry_dirty
  *
- * Purpose:     Copy the current value of cache_ptr->evictions_enabled into
- *              *evictions_enabled_ptr.
+ * Purpose:	Mark a pinned or protected entry as dirty.  The target entry
+ * 		MUST be either pinned or protected, and MAY be both.
  *
- * Return:      SUCCEED on success, and FAIL on failure.
+ * 		In the protected case, this call is the functional
+ * 		equivalent of setting the H5C__DIRTIED_FLAG on an unprotect
+ * 		call.
  *
- * Programmer:  John Mainzer
- *              7/27/07
+ * 		In the pinned but not protected case, if the entry is not
+ * 		already dirty, the function places function marks the entry
+ * 		dirty and places it on the skip list.
  *
- *-------------------------------------------------------------------------
- */
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/15/06
+ *
+ * 		JRM -- 11/5/08
+ * 		Added call to H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY() to
+ * 		update the new clean_index_size and dirty_index_size
+ * 		fields of H5C_t in the case that the entry was clean
+ * 		prior to this call, and is pinned and not protected.
+ *
+ *-------------------------------------------------------------------------
+ */
 herr_t
-H5C_get_evictions_enabled(const H5C_t *cache_ptr,
-                          hbool_t * evictions_enabled_ptr)
+H5C_mark_entry_dirty(void *thing)
 {
-    herr_t ret_value = SUCCEED;      /* Return value */
+    H5C_t *             cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+    /* 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);
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+    if ( entry_ptr->is_protected ) {
+	HDassert( ! ((entry_ptr)->is_read_only) );
 
-    if ( evictions_enabled_ptr == NULL ) {
+        /* set the dirtied flag */
+        entry_ptr->dirtied = TRUE;
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "Bad evictions_enabled_ptr on entry.")
-    }
+        /* reset image_up_to_date */
+        if(entry_ptr->image_up_to_date) {
+            entry_ptr->image_up_to_date = FALSE;
 
-    *evictions_enabled_ptr = cache_ptr->evictions_enabled;
+            if(entry_ptr->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_unserialized(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
+        }/* end if */
+    } /* end if */
+    else if ( entry_ptr->is_pinned ) {
+        hbool_t		was_clean;      /* Whether the entry was previously clean */
+        hbool_t		image_was_up_to_date;
 
-done:
+        /* Remember previous dirty status */
+	was_clean = !entry_ptr->is_dirty;
 
-    FUNC_LEAVE_NOAPI(ret_value)
+        /* Check if image is up to date */
+        image_was_up_to_date = entry_ptr->image_up_to_date;
+
+        /* Mark the entry as dirty if it isn't already */
+        entry_ptr->is_dirty = TRUE;
+	entry_ptr->image_up_to_date = FALSE;
+
+        /* Modify cache data structures */
+        if(was_clean)
+            H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
+        if(!entry_ptr->in_slist)
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+
+        /* Update stats for entry being marked dirty */
+        H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+
+        /* Check for entry changing status and do notifications, etc. */
+        if(was_clean) {
+            /* If the entry's type has a 'notify' callback send a 'entry dirtied'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_DIRTIED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag set")
+
+            /* Propagate the dirty flag up the flush dependency chain if appropriate */
+            if(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(image_was_up_to_date)
+            if(entry_ptr->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_unserialized(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry is neither pinned nor protected??")
 
-} /* H5C_get_evictions_enabled() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_mark_entry_dirty() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_get_aux_ptr
+ * Function:    H5C_mark_entry_clean
  *
- * Purpose:     Get the aux_ptr field from the cache.
+ * Purpose:	Mark a pinned entry as clean.  The target entry MUST be pinned.
  *
- *              This field will either be NULL (when accessing a file serially)
- *              or contains a pointer to the auxiliary info for parallel I/O.
+ * 		If the entry is not
+ * 		already clean, the function places function marks the entry
+ * 		clean and removes it from the skip list.
  *
- * Return:      NULL/non-NULL (can't fail)
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
- *              6/29/15
+ *              7/23/16
  *
  *-------------------------------------------------------------------------
  */
-void *
-H5C_get_aux_ptr(const H5C_t *cache_ptr)
+herr_t
+H5C_mark_entry_clean(void *_thing)
 {
-    FUNC_ENTER_NOAPI_NOERR
+    H5C_t *             cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_thing;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
 
-    /* Check arguments */
+    /* 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);
 
-    FUNC_LEAVE_NOAPI(cache_ptr->aux_ptr)
-} /* H5C_get_aux_ptr() */
+    /* Operate on pinned entry */
+    if(entry_ptr->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKCLEAN, FAIL, "entry is protected")
+    else if(entry_ptr->is_pinned) {
+        hbool_t		was_dirty;      /* Whether the entry was previously dirty */
+
+        /* Remember previous dirty status */
+        was_dirty = entry_ptr->is_dirty;
 
-

-/*-------------------------------------------------------------------------
- * 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-NULL trace file pointer (can't fail)
- *
- * Programmer:  John Mainzer
- *              1/20/06
- *
- *-------------------------------------------------------------------------
- */
-FILE *
-H5C_get_trace_file_ptr(const H5C_t *cache_ptr)
-{
-    FUNC_ENTER_NOAPI_NOERR
+        /* Mark the entry as clean if it isn't already */
+        entry_ptr->is_dirty = FALSE;
 
-    /* Check arguments */
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+        /* Also reset the 'flush_marker' flag, since the entry shouldn't be flushed now */
+        entry_ptr->flush_marker = FALSE;
 
-    FUNC_LEAVE_NOAPI(cache_ptr->trace_file_ptr)
-} /* H5C_get_trace_file_ptr() */
+        /* Modify cache data structures */
+        if(was_dirty)
+            H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr)
+        if(entry_ptr->in_slist)
+            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, FALSE)
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_get_trace_file_ptr_from_entry
- *
- * Purpose:     Get the trace_file_ptr field from the cache, via an entry.
- *
- *              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-NULL trace file pointer (can't fail)
- *
- * Programmer:  Quincey Koziol
- *              6/9/08
- *
- *-------------------------------------------------------------------------
- */
-FILE *
-H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr)
-{
-    FUNC_ENTER_NOAPI_NOERR
+        /* Update stats for entry being marked clean */
+        H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
 
-    /* Sanity checks */
-    HDassert(entry_ptr);
-    HDassert(entry_ptr->cache_ptr);
+        /* Check for entry changing status and do notifications, etc. */
+        if(was_dirty) {
+            /* If the entry's type has a 'notify' callback send a 'entry cleaned'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_CLEANED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag cleared")
+
+            /* Propagate the clean up the flush dependency chain, if appropriate */
+            if(entry_ptr->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_clean(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKCLEAN, FAIL, "Can't propagate flush dep clean")
+        } /* end if */
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKCLEAN, FAIL, "Entry is not pinned??")
 
-    FUNC_LEAVE_NOAPI(H5C_get_trace_file_ptr(entry_ptr->cache_ptr))
-} /* H5C_get_trace_file_ptr_from_entry() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_mark_entry_clean() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_set_up_logging
- *
- * Purpose:     Setup for metadata cache logging.
+ * Function:    H5C_mark_entry_unserialized
  *
- *              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.
+ * Purpose:	Mark a pinned or protected entry as unserialized.  The target
+ *		entry MUST be either pinned or protected, and MAY be both.
  *
  * Return:      Non-negative on success/Negative on failure
  *
+ * Programmer:  Quincey Koziol
+ *              12/23/16
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_set_up_logging(H5C_t *cache_ptr, const char log_location[],
-    hbool_t start_immediately)
+H5C_mark_entry_unserialized(void *thing)
 {
-#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 */
+    H5C_cache_entry_t  *entry = (H5C_cache_entry_t *)thing;
+    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 */
+    HDassert(entry);
+    HDassert(H5F_addr_defined(entry->addr));
 
-    /* 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")
+    if(entry->is_protected || entry->is_pinned) {
+        HDassert(!entry->is_read_only);
 
-    /* Set logging flags */
-    cache_ptr->logging_enabled = TRUE;
-    cache_ptr->currently_logging = start_immediately;
+        /* Reset image_up_to_date */
+        if(entry->image_up_to_date) {
+	    entry->image_up_to_date = FALSE;
 
- done:
-    if(file_name)
-        HDfree(file_name);
+            if(entry->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_unserialized(entry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "Can't propagate serialization status to fd parents")
+        }/* end if */
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKUNSERIALIZED, FAIL, "Entry to unserialize is neither pinned nor protected??")
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_set_up_logging() */
+} /* H5C_mark_entry_unserialized() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_tear_down_logging
+ * Function:    H5C_mark_entry_serialized
  *
- * Purpose:     Tear-down for metadata cache logging.
+ * Purpose:	Mark a pinned entry as serialized.  The target entry MUST be
+ *		pinned.
  *
  * Return:      Non-negative on success/Negative on failure
  *
+ * Programmer:  Quincey Koziol
+ *              12/23/16
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_tear_down_logging(H5C_t *cache_ptr)
+H5C_mark_entry_serialized(void *_thing)
 {
-    herr_t ret_value = SUCCEED;      /* Return value */
+    H5C_cache_entry_t  *entry = (H5C_cache_entry_t *)_thing;
+    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:
+    HDassert(entry);
+    HDassert(H5F_addr_defined(entry->addr));
+
+    /* Operate on pinned entry */
+    if(entry->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKSERIALIZED, FAIL, "entry is protected")
+    else if(entry->is_pinned) {
+        /* Check for entry changing status and do notifications, etc. */
+        if(!entry->image_up_to_date) {
+	    /* Set the image_up_to_date flag */
+            entry->image_up_to_date = TRUE;
+
+            /* Propagate the serialize up the flush dependency chain, if appropriate */
+            if(entry->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_serialized(entry) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKSERIALIZED, FAIL, "Can't propagate flush dep serialize")
+        } /* end if */
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKSERIALIZED, FAIL, "Entry is not pinned??")
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_tear_down_logging() */
+} /* H5C_mark_entry_serialized() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_start_logging
  *
- * Purpose:     Start logging metadata cache operations.
+ * Function:    H5C_move_entry
  *
- *              TODO: Add a function that dumps the current state of the
- *                    metadata cache.
+ * Purpose:     Use this function to notify the cache that an entry's
+ *              file address changed.
  *
  * Return:      Non-negative on success/Negative on failure
  *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_start_logging(H5C_t *cache_ptr)
+H5C_move_entry(H5C_t *	     cache_ptr,
+                 const H5C_class_t * type,
+                 haddr_t 	     old_addr,
+	         haddr_t 	     new_addr)
 {
-    herr_t ret_value = SUCCEED;      /* Return value */
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	test_entry_ptr = NULL;
+    herr_t			ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(cache_ptr);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(type);
+    HDassert(H5F_addr_defined(old_addr));
+    HDassert(H5F_addr_defined(new_addr));
+    HDassert(H5F_addr_ne(old_addr, new_addr));
 
-    /* Sanity checks */
-    if(NULL == cache_ptr)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+    H5C__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL)
 
-    if(FALSE == cache_ptr->logging_enabled)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not enabled")
+    if(entry_ptr == NULL || entry_ptr->type != type)
+        /* the old item doesn't exist in the cache, so we are done. */
+        HGOTO_DONE(SUCCEED)
 
-    if(cache_ptr->currently_logging)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging already in progress")
+    HDassert(entry_ptr->addr == old_addr);
+    HDassert(entry_ptr->type == type);
 
-    /* Set logging flags */
-    cache_ptr->currently_logging = TRUE;
+    /* Check for R/W status, otherwise error */
+    /* (Moving a R/O entry would mark it dirty, which shouldn't
+     *  happen. QAK - 2016/12/02)
+     */
+    if(entry_ptr->is_read_only)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "can't move R/O entry")
 
-    /* TODO - Dump cache state */
+    H5C__SEARCH_INDEX(cache_ptr, new_addr, test_entry_ptr, FAIL)
 
- done:
+    if(test_entry_ptr != NULL) { /* we are hosed */
+        if(test_entry_ptr->type == type)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "target already moved & reinserted???")
+        else
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, "new address already in use?")
+    } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_start_logging() */
+    /* If we get this far we have work to do.  Remove *entry_ptr from
+     * the hash table (and skip list if necessary), change its address to the
+     * new address, mark it as dirty (if it isn't already) and then re-insert.
+     *
+     * Update the replacement policy for a hit to avoid an eviction before
+     * the moved entry is touched.  Update stats for a move.
+     *
+     * Note that we do not check the size of the cache, or evict anything.
+     * Since this is a simple re-name, cache size should be unaffected.
+     *
+     * Check to see if the target entry is in the process of being destroyed
+     * before we delete from the index, etc.  If it is, all we do is
+     * change the addr.  If the entry is only in the process of being flushed,
+     * don't mark it as dirty either, lest we confuse the flush call back.
+     */
+    if(!entry_ptr->destroy_in_progress) {
+        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, FAIL)
 
-

-/*-------------------------------------------------------------------------
- * 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 */
+        if(entry_ptr->in_slist) {
+            HDassert(cache_ptr->slist_ptr);
+            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, FALSE)
+        } /* end if */
+    } /* end if */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    entry_ptr->addr = new_addr;
 
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    if(!entry_ptr->destroy_in_progress) {
+        hbool_t		was_dirty;      /* Whether the entry was previously dirty */
 
-    /* Sanity checks */
-    if(NULL == cache_ptr)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+        /* Remember previous dirty status */
+        was_dirty = entry_ptr->is_dirty;
+
+        /* Mark the entry as dirty if it isn't already */
+	entry_ptr->is_dirty = TRUE;
+
+	/* This shouldn't be needed, but it keeps the test code happy */
+        if(entry_ptr->image_up_to_date) {
+            entry_ptr->image_up_to_date = FALSE;
+            if(entry_ptr->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_unserialized(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
+        } /* end if */
+
+        /* Modify cache data structures */
+        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
+        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
 
-    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+        /* Skip some actions if we're in the middle of flushing the entry */
+	if(!entry_ptr->flush_in_progress) {
+            /* Update the replacement policy for the entry */
+            H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, FAIL)
 
-    if(FALSE == cache_ptr->logging_enabled)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not enabled")
+            /* Check for entry changing status and do notifications, etc. */
+            if(!was_dirty) {
+                /* If the entry's type has a 'notify' callback send a 'entry dirtied'
+                 * notice now that the entry is fully integrated into the cache.
+                 */
+                if(entry_ptr->type->notify &&
+                        (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_DIRTIED, entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag set")
 
-    if(FALSE == cache_ptr->currently_logging)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not in progress")
+                /* Propagate the dirty flag up the flush dependency chain if appropriate */
+                if(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 */
+        } /* end if */
+    } /* end if */
 
-    /* Set logging flags */
-    cache_ptr->currently_logging = FALSE;
+    H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
 
- done:
+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))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_stop_logging() */
+} /* H5C_move_entry() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_get_logging_status
+ * Function:    H5C_resize_entry
+ *
+ * Purpose:	Resize a pinned or protected entry.
  *
- * Purpose:     Determines if the cache is actively logging (via the OUT
- *              parameter).
+ * 		Resizing an entry dirties it, so if the entry is not
+ * 		already dirty, the function places the entry on the
+ * 		skip list.
  *
  * Return:      Non-negative on success/Negative on failure
  *
+ * Programmer:  John Mainzer
+ *              7/5/06
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_get_logging_status(const H5C_t *cache_ptr, /*OUT*/ hbool_t *is_enabled,
-                       /*OUT*/ hbool_t *is_currently_logging)
+H5C_resize_entry(void *thing, size_t new_size)
 {
-    herr_t ret_value = SUCCEED;      /* Return value */
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
+    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);
-    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")
+    /* Check for usage errors */
+    if(new_size <= 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "New size is non-positive")
+    if(!(entry_ptr->is_pinned || entry_ptr->is_protected))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "Entry isn't pinned or protected??")
 
-    *is_enabled = cache_ptr->logging_enabled;
-    *is_currently_logging = cache_ptr->currently_logging;
+#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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    /* update for change in entry size if necessary */
+    if ( entry_ptr->size != new_size ) {
+        hbool_t		was_clean;
+
+        /* make note of whether the entry was clean to begin with */
+        was_clean = !entry_ptr->is_dirty;
+
+        /* mark the entry as dirty if it isn't already */
+        entry_ptr->is_dirty = TRUE;
+
+        /* Reset the image up-to-date status */
+        if(entry_ptr->image_up_to_date) {
+            entry_ptr->image_up_to_date = FALSE;
+            if(entry_ptr->flush_dep_nparents > 0)
+                if(H5C__mark_flush_dep_unserialized(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
+        } /* end if */
+
+        /* Release the current image */
+        if(entry_ptr->image_ptr)
+            entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr);
+
+        /* do a flash cache size increase if appropriate */
+        if ( cache_ptr->flash_size_increase_possible ) {
+
+            if ( new_size > entry_ptr->size ) {
+                size_t             	size_increase;
+
+                size_increase = new_size - entry_ptr->size;
+
+                if(size_increase >= cache_ptr->flash_size_increase_threshold) {
+                    if(H5C__flash_increase_cache_size(cache_ptr, entry_ptr->size, new_size) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "flash cache increase failed")
+                }
+            }
+        }
+
+        /* update the pinned and/or protected entry list */
+        if(entry_ptr->is_pinned) {
+            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
+                                            (cache_ptr->pel_size), \
+                                            (entry_ptr->size), (new_size))
+        } /* end if */
+        if(entry_ptr->is_protected) {
+            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \
+                                            (cache_ptr->pl_size), \
+                                            (entry_ptr->size), (new_size))
+        } /* end if */
+
+#ifdef H5_HAVE_PARALLEL
+        if(entry_ptr->coll_access) {
+            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->coll_list_len), \
+                                            (cache_ptr->coll_list_size), \
+                                            (entry_ptr->size), (new_size))
+        } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+        /* update statistics just before changing the entry size */
+	H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size);
+
+        /* update the hash table */
+	H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, entry_ptr->size, \
+                                          new_size, entry_ptr, was_clean);
+
+        /* if the entry is in the skip list, update that too */
+        if(entry_ptr->in_slist)
+	    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, entry_ptr->size, new_size);
+
+	/* finally, update the entry size proper */
+	entry_ptr->size = new_size;
+
+        if(!entry_ptr->in_slist)
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+
+        if(entry_ptr->is_pinned)
+            H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+
+        /* Check for entry changing status and do notifications, etc. */
+        if(was_clean) {
+            /* If the entry's type has a 'notify' callback send a 'entry dirtied'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_DIRTIED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag set")
+
+            /* Propagate the dirty flag up the flush dependency chain if appropriate */
+            if(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 */
+    } /* 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))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_resize_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_pin_entry_from_client()
+ *
+ * Purpose:	Internal routine to pin a cache entry from a client action.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * 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 
+ *
+ *-------------------------------------------------------------------------
+ */
+#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
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    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;
+
+        H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+    } /* end else */
+
+    /* 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_get_logging_status() */
+
+} /* H5C_pin_entry_from_client() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_write_log_message
+ * Function:    H5C_pin_protected_entry()
  *
- * Purpose:     Write a message to the log file and flush the file. 
- *              The message string is neither modified nor freed.
+ * 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_write_log_message(const H5C_t *cache_ptr, const char message[])
+H5C_pin_protected_entry(void *thing)
 {
-    size_t n_chars;
-    herr_t ret_value = SUCCEED;      /* Return value */
+    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);
-    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 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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    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")
+    /* Only protected entries can be pinned */
+    if(!entry_ptr->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected")
 
-    /* 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")
+    /* 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:
+#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))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_write_log_message() */
+} /* H5C_pin_protected_entry() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_insert_entry
- *
- * Purpose:     Adds the specified thing to the cache.  The thing need not
- *              exist on disk yet, but it must have an address and disk
- *              space reserved.
+ * Function:    H5C_protect
  *
- *		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.
+ * Purpose:     If the target entry is not in the cache, load it.  If
+ *		necessary, attempt to evict one or more entries to keep
+ *		the cache within its maximum size.
  *
- *		The primary_dxpl_id is the dxpl_id passed to the
- *		check_write_permitted function if such a function has been
- *		provided.
+ *		Mark the target entry as protected, and return its address
+ *		to the caller.  The caller must call H5C_unprotect() when
+ *		finished with the entry.
  *
- *		Observe that this function cannot occasion a read.
+ *		While it is protected, the entry may not be either evicted
+ *		or flushed -- nor may it be accessed by another call to
+ *		H5C_protect.  Any attempt to do so will result in a failure.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      Success:        Ptr to the desired entry
+ *              Failure:        NULL
  *
- * Programmer:  John Mainzer
- *		6/2/04
+ * Programmer:  John Mainzer -  6/2/04
  *
  *-------------------------------------------------------------------------
  */
-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)
+void *
+H5C_protect(H5F_t *		f,
+            hid_t	        dxpl_id,
+            const H5C_class_t * type,
+            haddr_t 	        addr,
+            void *              udata,
+	    unsigned		flags)
 {
-    H5C_t               *cache_ptr;
-    H5P_genplist_t      *dxpl;
+    H5C_t *		cache_ptr;
     H5AC_ring_t         ring = H5C_RING_UNDEFINED;
-    hbool_t		insert_pinned;
+    hbool_t		hit;
+    hbool_t		have_write_permitted = FALSE;
+    hbool_t		read_only = FALSE;
     hbool_t             flush_last;
 #ifdef H5_HAVE_PARALLEL
     hbool_t             coll_access = FALSE; /* whether access to the cache entry is done collectively */
 #endif /* H5_HAVE_PARALLEL */
-    hbool_t             set_flush_marker;
-    hbool_t		write_permitted = TRUE;
+    hbool_t		write_permitted;
+    hbool_t             was_loaded = FALSE;     /* Whether the entry was loaded as a result of the protect */
     size_t		empty_space;
-    H5C_cache_entry_t  *entry_ptr;
-    H5C_cache_entry_t  *test_entry_ptr;
-    herr_t		ret_value = SUCCEED;    /* Return value */
+    void *		thing;
+    H5C_cache_entry_t *	entry_ptr;
+    H5P_genplist_t    * dxpl;    /* dataset transfer property list */
+    void *		ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI(NULL)
 
+    /* check args */
     HDassert( f );
     HDassert( f->shared );
 
@@ -2238,2615 +2405,702 @@ H5C_insert_entry(H5F_t *             f,
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
     HDassert( type );
+    HDassert( type->mem_type == cache_ptr->class_table_ptr[type->id]->mem_type );
     HDassert( H5F_addr_defined(addr) );
-    HDassert( thing );
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-    /* no need to verify that entry is not already in the index as */
-    /* we already make that check below.                           */
-
-    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");
-    }
+    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, "an extreme sanity check failed on entry")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    set_flush_marker   = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
-    insert_pinned      = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
+    /* Load the cache image, if requested */
+    if(cache_ptr->load_image) {
+        cache_ptr->load_image = FALSE;
+        if(H5C__load_cache_image(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't load cache image")
+    } /* end if */
+
+    read_only          = ( (flags & H5C__READ_ONLY_FLAG) != 0 );
     flush_last         = ( (flags & H5C__FLUSH_LAST_FLAG) != 0 );
 
     /* 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")
+        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, FAIL, "unable to query ring value")
-
-    entry_ptr = (H5C_cache_entry_t *)thing;
-
-    /* verify that the new entry isn't already in the hash table -- scream
-     * and die if it is.
-     */
-
-    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.")
-    } /* end if */
-
-    entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
-    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;
-
-    /* newly inserted entries are assumed to be dirty */
-    entry_ptr->is_dirty = TRUE;
-
-    /* not protected, so can't be dirtied */
-    entry_ptr->dirtied  = FALSE;
-
-    /* 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;
-
-#ifdef H5_HAVE_PARALLEL
-    entry_ptr->clear_on_unprotect = FALSE;
-    entry_ptr->flush_immediately = FALSE;
-#endif /* H5_HAVE_PARALLEL */
-
-    entry_ptr->flush_in_progress = FALSE;
-    entry_ptr->destroy_in_progress = 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;
-
-    entry_ptr->next = NULL;
-    entry_ptr->prev = NULL;
-
-    entry_ptr->aux_next = NULL;
-    entry_ptr->aux_prev = NULL;
-
-#ifdef H5_HAVE_PARALLEL
-    entry_ptr->coll_next = NULL;
-    entry_ptr->coll_prev = NULL;
-#endif /* H5_HAVE_PARALLEL */
-
-    H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
-
-    if ( ( cache_ptr->flash_size_increase_possible ) &&
-         ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
-
-        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)
-       empty_space = 0;
-    else
-       empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
-
-    if ( ( cache_ptr->evictions_enabled ) &&
-         ( ( (cache_ptr->index_size + entry_ptr->size) >
-	     cache_ptr->max_cache_size)
-	   ||
-	   ( ( ( empty_space + cache_ptr->clean_index_size ) <
-	       cache_ptr->min_clean_size ) ) ) ) {
-
-        size_t space_needed;
-
-	if(empty_space <= entry_ptr->size)
-            cache_ptr->cache_full = TRUE;
-
-        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);
-        space_needed = entry_ptr->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
-         * size limit.  The subsequent call to H5C_make_space_in_cache()
-         * may evict the entries required to free more or less space
-         * depending on conditions.  It MAY be less if the cache is
-         * currently undersized, or more if the cache is oversized.
-         *
-         * The cache can exceed its maximum size limit via the following
-         * mechanisms:
-         *
-         * First, it is possible for the cache to grow without
-         * bound as long as entries are protected and not unprotected.
-         *
-         * Second, when writes are not permitted it is also possible
-         * for the cache to grow without bound.
-         *
-         * Finally, we usually don't check to see if the cache is
-         * oversized at the end of an unprotect.  As a result, it is
-         * possible to have a vastly oversized cache with no protected
-         * entries as long as all the protects preceed the unprotects.
-         *
-         * Since items 1 and 2 are not changing any time soon, I see
-         * no point in worrying about the third.
-         */
-
-        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)
-
-    /* New entries are presumed to be dirty, so this if statement is
-     * unnecessary.  Rework it once the rest of the code changes are
-     * in and tested.   -- JRM
-     */
-    if ( entry_ptr->is_dirty ) {
-
-        entry_ptr->flush_marker = set_flush_marker;
-        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
-
-    } else {
-
-        entry_ptr->flush_marker = FALSE;
-    }
-
-    H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL)
-
-#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 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)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "unable to query ring value")
 
 #ifdef H5_HAVE_PARALLEL
-    /* Get the dataset transfer property list */
-    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
-
     if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
         coll_access = (H5P_USER_TRUE == f->coll_md_read ? TRUE : FALSE);
 
         if(!coll_access && H5P_FORCE_FALSE != f->coll_md_read) {
             H5P_coll_md_read_flag_t prop_value;
 
-            /* Get the property value */
+            /* get the property value */
             if(H5P_get(dxpl, H5_COLL_MD_READ_FLAG_NAME, &prop_value) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't get collective metadata access flag")
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "Can't get collective metadata access flag")
             coll_access = (H5P_USER_TRUE == prop_value ? TRUE : FALSE);
         } /* end if */
     } /* end if */
+#endif /* H5_HAVE_PARALLEL */
 
-    entry_ptr->coll_access = coll_access;
-    if(coll_access) {
-        H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, FAIL)
-
-        /* Make sure the size of the collective entries in the cache remain in check */
-        if(H5P_USER_TRUE == f->coll_md_read) {
-            if(cache_ptr->max_cache_size * 80 < cache_ptr->coll_list_size * 100) {
-                if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear collective metadata entries")
-            } /* end if */
-        } /* end if */
-        else {
-            if(cache_ptr->max_cache_size * 40 < cache_ptr->coll_list_size * 100) {
-                if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear collective metadata entries")
-            } /* end if */
-        } /* end else */
-    } /* end if */
-#endif
+    /* first check to see if the target is in cache */
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, NULL)
 
-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 */
+    if(entry_ptr != NULL) {
+        if(entry_ptr->ring != ring)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "ring type mismatch occured for cache entry")
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_insert_entry() */
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_mark_entry_dirty
- *
- * Purpose:	Mark a pinned or protected entry as dirty.  The target entry
- * 		MUST be either pinned or protected, and MAY be both.
- *
- * 		In the protected case, this call is the functional
- * 		equivalent of setting the H5C__DIRTIED_FLAG on an unprotect
- * 		call.
- *
- * 		In the pinned but not protected case, if the entry is not
- * 		already dirty, the function places function marks the entry
- * 		dirty and places it on the skip list.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              5/15/06
- *
- * 		JRM -- 11/5/08
- * 		Added call to H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY() to
- * 		update the new clean_index_size and dirty_index_size
- * 		fields of H5C_t in the case that the entry was clean
- * 		prior to this call, and is pinned and not protected.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_mark_entry_dirty(void *thing)
-{
-    H5C_t *             cache_ptr;
-    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
-    herr_t              ret_value = SUCCEED;    /* Return value */
+        if(entry_ptr->prefetched) {
+            /* This call removes the prefetched entry from the cache,
+             * and replaces it with an entry deserialized from the 
+             * image of the prefetched entry.
+             */
+            if(H5C__deserialize_prefetched_entry(f, dxpl_id, cache_ptr, &entry_ptr, type, addr, udata) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't deserialize prefetched entry")
 
-    FUNC_ENTER_NOAPI(FAIL)
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(!entry_ptr->prefetched);
+            HDassert(entry_ptr->addr == addr);
+        } /* end if */
 
-    /* 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);
+        /* 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 ( entry_ptr->is_protected ) {
-	HDassert( ! ((entry_ptr)->is_read_only) );
+        /* if this is a collective metadata read, the entry is not
+           marked as collective, and is clean, it is possible that
+           other processes will not have it in its cache and will
+           expect a bcast of the entry from process 0. So process 0
+           will bcast the entry to all other ranks. Ranks that _do_ have
+           the entry in their cache still have to participate in the
+           bcast. */
+#ifdef H5_HAVE_PARALLEL
+        if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI) && coll_access) {
+            if(!(entry_ptr->is_dirty) && !(entry_ptr->coll_access)) {
+                MPI_Comm  comm;           /* File MPI Communicator */
+                int       mpi_code;       /* MPI error code */
+                int       buf_size;
 
-        /* set the dirtied flag */
-        entry_ptr->dirtied = TRUE;
+                if(MPI_COMM_NULL == (comm = H5F_mpi_get_comm(f)))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "get_comm request failed")
 
-    } else if ( entry_ptr->is_pinned ) {
-        hbool_t		was_pinned_unprotected_and_clean;
+                if(entry_ptr->image_ptr == NULL) {
+                    int mpi_rank;
 
-	was_pinned_unprotected_and_clean = ! ( entry_ptr->is_dirty );
+                    if((mpi_rank = H5F_mpi_get_rank(f)) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "Can't get MPI rank")
 
-        /* mark the entry as dirty if it isn't already */
-        entry_ptr->is_dirty = TRUE;
-	entry_ptr->image_up_to_date = FALSE;
-
-        /* 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);
-
-            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) ) {
-
-            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
-        }
-
-        H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
-
-    } else {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, \
-                    "Entry is neither pinned nor protected??")
-    }
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_mark_entry_dirty() */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5C_move_entry
- *
- * Purpose:     Use this function to notify the cache that an entry's
- *              file address changed.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              6/2/04
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_move_entry(H5C_t *	     cache_ptr,
-                 const H5C_class_t * type,
-                 haddr_t 	     old_addr,
-	         haddr_t 	     new_addr)
-{
-    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 */
-    herr_t			ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( type );
-    HDassert( H5F_addr_defined(old_addr) );
-    HDassert( H5F_addr_defined(new_addr) );
-    HDassert( H5F_addr_ne(old_addr, new_addr) );
-
-#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 */
-
-    H5C__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL)
-
-    if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) {
-
-        /* the old item doesn't exist in the cache, so we are done. */
-        HGOTO_DONE(SUCCEED)
-    }
-
-    HDassert( entry_ptr->addr == old_addr );
-    HDassert( entry_ptr->type == type );
-
-    if ( entry_ptr->is_protected ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
-		    "Target entry is protected.")
-    }
-
-    H5C__SEARCH_INDEX(cache_ptr, new_addr, test_entry_ptr, FAIL)
-
-    if ( test_entry_ptr != NULL ) { /* we are hosed */
-
-        if ( test_entry_ptr->type == type ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
-                        "Target already moved & reinserted???.")
-
-        } else {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTMOVE, FAIL, \
-                        "New address already in use?.")
-
-        }
-    }
-
-    /* If we get this far we have work to do.  Remove *entry_ptr from
-     * the hash table (and skip list if necessary), change its address to the
-     * new address, mark it as dirty (if it isn't already) and then re-insert.
-     *
-     * Update the replacement policy for a hit to avoid an eviction before
-     * the moved entry is touched.  Update stats for a move.
-     *
-     * Note that we do not check the size of the cache, or evict anything.
-     * Since this is a simple re-name, cache size should be unaffected.
-     *
-     * Check to see if the target entry is in the process of being destroyed
-     * before we delete from the index, etc.  If it is, all we do is
-     * change the addr.  If the entry is only in the process of being flushed,
-     * don't mark it as dirty either, lest we confuse the flush call back.
-     */
-
-    if ( ! ( entry_ptr->destroy_in_progress ) ) {
-
-        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
-
-        if ( entry_ptr->in_slist ) {
-
-            HDassert( cache_ptr->slist_ptr );
-
-            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
-
-#if H5C_DO_SANITY_CHECKS
-
-            removed_entry_from_slist = TRUE;
-
-#endif /* H5C_DO_SANITY_CHECKS */
-        }
-    }
-
-    entry_ptr->addr = new_addr;
-
-    if ( ! ( entry_ptr->destroy_in_progress ) ) {
-
-        was_dirty = entry_ptr->is_dirty;
-	entry_ptr->is_dirty = TRUE;
-
-	/* This shouldn't be needed, but it keeps the test code happy */
-        entry_ptr->image_up_to_date = FALSE;
-
-        if ( ! ( entry_ptr->flush_in_progress ) ) {
-
-            /* Propagate the dirty flag up the flush dependency chain if
-             * appropriate */
-            if ( ! ( was_dirty ) ) {
-
-                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")
-                }
-            }
-        }
-
-        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
-
-        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
-
-#if H5C_DO_SANITY_CHECKS
-
-        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)
-
-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_move_entry() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_resize_entry
- *
- * Purpose:	Resize a pinned or protected entry.
- *
- * 		Resizing an entry dirties it, so if the entry is not
- * 		already dirty, the function places the entry on the
- * 		skip list.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              7/5/06
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_resize_entry(void *thing, size_t new_size)
-{
-    H5C_t             * cache_ptr;
-    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing;
-    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);
-
-    /* Check for usage errors */
-    if(new_size <= 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "New size is non-positive.")
-    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;
-
-        /* make note of whether the entry was clean to begin with */
-        was_clean = ! ( entry_ptr->is_dirty );
-
-        /* 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 ) {
-
-            if ( new_size > entry_ptr->size ) {
-                size_t             	size_increase;
-
-                size_increase = new_size - entry_ptr->size;
-
-                if(size_increase >= cache_ptr->flash_size_increase_threshold) {
-                    if(H5C__flash_increase_cache_size(cache_ptr, entry_ptr->size, new_size) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "flash cache increase failed")
-                }
-            }
-        }
-
-        /* update the pinned and/or protected entry list */
-        if(entry_ptr->is_pinned) {
-            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
-                                            (cache_ptr->pel_size), \
-                                            (entry_ptr->size), (new_size))
-        } /* end if */
-        if(entry_ptr->is_protected) {
-            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \
-                                            (cache_ptr->pl_size), \
-                                            (entry_ptr->size), (new_size))
-        } /* end if */
-
-#ifdef H5_HAVE_PARALLEL
-        if(entry_ptr->coll_access) {
-            H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->coll_list_len), \
-                                            (cache_ptr->coll_list_size), \
-                                            (entry_ptr->size), (new_size))
-        } /* end if */
-#endif /* H5_HAVE_PARALLEL */
-
-        /* update the hash table */
-	H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\
-                                          (new_size), (entry_ptr), (was_clean));
-
-        /* if the entry is in the skip list, update that too */
-        if ( entry_ptr->in_slist ) {
-	    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\
-                                              (new_size));
-        } /* end if */
-
-        /* update statistics just before changing the entry size */
-	H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \
-                                                (new_size));
-
-	/* finally, update the entry size proper */
-	entry_ptr->size = new_size;
-
-        if(!entry_ptr->in_slist) {
-            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
-        } /* end if */
-
-        if(entry_ptr->is_pinned) {
-            H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
-        } /* end if */
-    } /* 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_entry_from_client()
- *
- * Purpose:	Internal routine to pin a cache entry from a client action.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * 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 
- *
- *-------------------------------------------------------------------------
- */
-#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
-{
-    herr_t              ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Sanity checks */
-    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;
-
-        H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
-    } /* end else */
-
-    /* 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 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 */
-
-
-    /* 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:
-
-#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() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_protect
- *
- * Purpose:     If the target entry is not in the cache, load it.  If
- *		necessary, attempt to evict one or more entries to keep
- *		the cache within its maximum size.
- *
- *		Mark the target entry as protected, and return its address
- *		to the caller.  The caller must call H5C_unprotect() when
- *		finished with the entry.
- *
- *		While it is protected, the entry may not be either evicted
- *		or flushed -- nor may it be accessed by another call to
- *		H5C_protect.  Any attempt to do so will result in a failure.
- *
- * Return:      Success:        Ptr to the desired entry
- *              Failure:        NULL
- *
- * Programmer:  John Mainzer -  6/2/04
- *
- * 		JRM -- 11/13/08
- * 		Modified function to call H5C_make_space_in_cache() when
- * 		the min_clean_size is violated, not just when there isn't
- * 		enough space for and entry that has just been loaded.
- *
- *              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.
- *
- *		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.
- *		At present, this flag is 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	        dxpl_id,
-            const H5C_class_t * type,
-            haddr_t 	        addr,
-            void *              udata,
-	    unsigned		flags)
-{
-    H5C_t *		cache_ptr;
-    H5AC_ring_t         ring = H5C_RING_UNDEFINED;
-    hbool_t		hit;
-    hbool_t		have_write_permitted = FALSE;
-    hbool_t		read_only = FALSE;
-    hbool_t             flush_last;
-#ifdef H5_HAVE_PARALLEL
-    hbool_t             coll_access = FALSE; /* whether access to the cache entry is done collectively */
-#endif /* H5_HAVE_PARALLEL */
-    hbool_t		write_permitted;
-    size_t		empty_space;
-    void *		thing;
-    H5C_cache_entry_t *	entry_ptr;
-    H5P_genplist_t    * dxpl;    /* dataset transfer property list */
-    void *		ret_value = NULL;       /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
-
-    /* check args */
-    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 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, NULL, \
-                    "an extreme sanity check failed on entry.\n");
-    }
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
-
-    read_only          = ( (flags & H5C__READ_ONLY_FLAG) != 0 );
-    flush_last         = ( (flags & H5C__FLUSH_LAST_FLAG) != 0 );
-
-    /* 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")
-
-#ifdef H5_HAVE_PARALLEL
-    if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
-        coll_access = (H5P_USER_TRUE == f->coll_md_read ? TRUE : FALSE);
-
-        if(!coll_access && H5P_FORCE_FALSE != f->coll_md_read) {
-            H5P_coll_md_read_flag_t prop_value;
-
-            /* get the property value */
-            if(H5P_get(dxpl, H5_COLL_MD_READ_FLAG_NAME, &prop_value) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "Can't get collective metadata access flag")
-            coll_access = (H5P_USER_TRUE == prop_value ? TRUE : FALSE);
-        } /* end if */
-    } /* end if */
-#endif /* H5_HAVE_PARALLEL */
-
-    /* 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 this is a collective metadata read, the entry is not
-           marked as collective, and is clean, it is possible that
-           other processes will not have it in its cache and will
-           expect a bcast of the entry from process 0. So process 0
-           will bcast the entry to all other ranks. Ranks that do have
-           the entry in their cache still have to participate in the
-           bcast. */
-#ifdef H5_HAVE_PARALLEL
-        if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI) && coll_access) {
-            if(!(entry_ptr->is_dirty) && !(entry_ptr->coll_access)) {
-                MPI_Comm  comm;           /* File MPI Communicator */
-                int       mpi_code;       /* MPI error code */
-                int       buf_size;
-
-                if(MPI_COMM_NULL == (comm = H5F_mpi_get_comm(f)))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "get_comm request failed")
-
-                if(entry_ptr->image_ptr == NULL) {
-                    int mpi_rank;
-                    size_t image_size;
-
-                    if((mpi_rank = H5F_mpi_get_rank(f)) < 0)
-                        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "Can't get MPI rank")
-
-                    if(entry_ptr->compressed)
-                        image_size = entry_ptr->compressed_size;
-                    else
-                        image_size = entry_ptr->size;
-                    HDassert(image_size > 0);
-
-                    if(NULL == (entry_ptr->image_ptr = H5MM_malloc(image_size + 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(((uint8_t *)entry_ptr->image_ptr) + image_size, 
-                             H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
-#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
-                    if(0 == mpi_rank)
-                        if(H5C__generate_image(f, cache_ptr, entry_ptr, dxpl_id, NULL) < 0)
-                            HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "can't generate entry's image")
-                } /* end if */
-                HDassert(entry_ptr->image_ptr);
-
-                H5_CHECKED_ASSIGN(buf_size, int, entry_ptr->size, size_t);
-                if(MPI_SUCCESS != (mpi_code = MPI_Bcast(entry_ptr->image_ptr, buf_size, MPI_BYTE, 0, comm)))
-                    HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
-
-                /* Mark the entry as collective and insert into the collective list */
-                entry_ptr->coll_access = TRUE;
-                H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
-            } /* end if */
-            else if(entry_ptr->coll_access) {
-                H5C__MOVE_TO_TOP_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
-            } /* end else-if */
-        } /* end if */
-#endif /* H5_HAVE_PARALLEL */
-
-#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;
-
-    } else {
-
-        /* must try to load the entry from disk. */
-
-        hit = FALSE;
-
-        if(NULL == (thing = H5C_load_entry(f, dxpl_id, 
-#ifdef H5_HAVE_PARALLEL
-                                           coll_access, 
-#endif /* H5_HAVE_PARALLEL */
-                                           type, addr, udata)))
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't load entry")
-
-        entry_ptr = (H5C_cache_entry_t *)thing;
-        entry_ptr->ring  = ring;
-#ifdef H5_HAVE_PARALLEL
-        if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI) && entry_ptr->coll_access)
-            H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
-#endif /* H5_HAVE_PARALLEL */
-
-        /* 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 ) ) {
-
-            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)
-           empty_space = 0;
-        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)
-	       ||
-	       ( ( empty_space + cache_ptr->clean_index_size ) <
-	         cache_ptr->min_clean_size )
-	     )
-           ) {
-
-            size_t space_needed;
-
-	    if(empty_space <= entry_ptr->size)
-                cache_ptr->cache_full = TRUE;
-
-            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;
-            } else {
-
-                write_permitted = cache_ptr->write_permitted;
-
-                have_write_permitted = TRUE;
-
-            }
-
-            HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE );
-
-            space_needed = entry_ptr->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
-             * size limit.  The subsequent call to H5C_make_space_in_cache()
-             * may evict the entries required to free more or less space
-             * depending on conditions.  It MAY be less if the cache is
-             * currently undersized, or more if the cache is oversized.
-             *
-             * The cache can exceed its maximum size limit via the following
-             * mechanisms:
-             *
-             * First, it is possible for the cache to grow without
-             * bound as long as entries are protected and not unprotected.
-             *
-             * Second, when writes are not permitted it is also possible
-             * for the cache to grow without bound.
-	     *
-	     * Third, the user may choose to disable evictions -- causing
-	     * the cache to grow without bound until evictions are
-	     * re-enabled.
-             *
-             * Finally, we usually don't check to see if the cache is
-             * oversized at the end of an unprotect.  As a result, it is
-             * possible to have a vastly oversized cache with no protected
-             * entries as long as all the protects preceed the unprotects.
-             *
-             * Since items 1, 2, and 3 are not changing any time soon, I
-             * see no point in worrying about the fourth.
-             */
-
-            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
-         * we don't even check to see if it should go in the skip list.
-         *
-         * This is no longer true -- due to a bug fix, we may modify
-         * data on load to repair a file.
-         *
-         *   *******************************************
-         *
-         * Set the flush_last field
- 	 * 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 flag 
-         * is ignored if the entry is already in cache.
-         */
-        entry_ptr->flush_me_last = flush_last;
-
-        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL)
-
-        if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) {
-
-            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, NULL)
-        }
-
-        /* insert the entry in the data structures used by the replacement
-         * policy.  We are just going to take it out again when we update
-         * the replacement policy for a protect, but this simplifies the
-         * 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 );
-    HDassert( entry_ptr->type == type );
-
-    if ( entry_ptr->is_protected ) {
-
-	if ( ( read_only ) && ( entry_ptr->is_read_only ) ) {
-
-	    HDassert( entry_ptr->ro_ref_count > 0 );
-
-	    (entry_ptr->ro_ref_count)++;
-
-	} else {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                        "Target already protected & not read only?!?.")
-	}
-    } else {
-
-    	H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, NULL)
-
-    	entry_ptr->is_protected = TRUE;
-
-	if ( read_only ) {
-
-	    entry_ptr->is_read_only = TRUE;
-	    entry_ptr->ro_ref_count = 1;
-	}
-
-    	entry_ptr->dirtied = FALSE;
-    }
-
-    H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit)
-
-    H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
-
-    ret_value = thing;
-
-    if ( ( cache_ptr->evictions_enabled ) &&
-         ( ( cache_ptr->size_decreased ) ||
-           ( ( cache_ptr->resize_enabled ) &&
-             ( cache_ptr->cache_accesses >=
-               (cache_ptr->resize_ctl).epoch_length ) ) ) ) {
-
-        if ( ! have_write_permitted ) {
-
-            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 2")
-                else
-                    have_write_permitted = TRUE;
-            } else {
-
-                write_permitted = cache_ptr->write_permitted;
-
-                have_write_permitted = TRUE;
-
-            }
-        }
-
-        if ( ( cache_ptr->resize_enabled ) &&
-             ( cache_ptr->cache_accesses >=
-               (cache_ptr->resize_ctl).epoch_length ) ) {
-
-            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  ) {
-
-            cache_ptr->size_decreased = FALSE;
-
-            /* check to see if the cache is now oversized due to the cache
-             * size reduction.  If it is, try to evict enough entries to
-             * bring the cache size down to the current maximum cache size.
-	     *
-	     * Also, if the min_clean_size requirement is not met, we
-	     * should also call H5C_make_space_in_cache() to bring us
-	     * into complience.
-             */
-
-            if(cache_ptr->index_size >= cache_ptr->max_cache_size)
-               empty_space = 0;
-            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)
-                    cache_ptr->cache_full = TRUE;
-
-                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
-
-#ifdef H5_HAVE_PARALLEL
-    if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
-        /* Make sure the size of the collective entries in the cache remain in check */
-        if(coll_access) {
-            if(H5P_USER_TRUE == f->coll_md_read) {
-                if(cache_ptr->max_cache_size * 80 < cache_ptr->coll_list_size * 100)
-                    if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, "can't clear collective metadata entries")
-            } /* end if */
-            else {
-                if(cache_ptr->max_cache_size * 40 < cache_ptr->coll_list_size * 100)
-                    if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, "can't clear collective metadata entries")
-            } /* end else */
-        } /* end if */
-    } /* end if */
-#endif /* H5_HAVE_PARALLEL */
-
-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, NULL, "an extreme sanity check failed on exit.\n")
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_protect() */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5C_reset_cache_hit_rate_stats()
- *
- * Purpose:     Reset the cache hit rate computation fields.
- *
- * Return:      SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer, 10/5/04
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr)
-{
-    herr_t	ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
-
-    cache_ptr->cache_hits		= 0;
-    cache_ptr->cache_accesses		= 0;
-
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_reset_cache_hit_rate_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_set_cache_auto_resize_config
- *
- * Purpose:	Set the cache automatic resize configuration to the
- *		provided values if they are in range, and fail if they
- *		are not.
- *
- *		If the new configuration enables automatic cache resizing,
- *		coerce the cache max size and min clean size into agreement
- *		with the new policy and re-set the full cache hit rate
- *		stats.
- *
- * Return:      SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer
- *		10/8/04
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_set_cache_auto_resize_config(H5C_t *cache_ptr,
-                                 H5C_auto_size_ctl_t *config_ptr)
-{
-    herr_t	result;
-    size_t      new_max_cache_size;
-    size_t      new_min_clean_size;
-    herr_t	ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
-
-    if ( config_ptr == NULL ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.")
-    }
-
-    if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.")
-    }
-
-    /* check general configuration section of the config: */
-    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
-                                   H5C_RESIZE_CFG__VALIDATE_GENERAL) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
-                    "error in general configuration fields of new config.")
-    }
-
-    /* check size increase control fields of the config: */
-    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
-                                   H5C_RESIZE_CFG__VALIDATE_INCREMENT) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
-                    "error in the size increase control fields of new config.")
-    }
-
-    /* check size decrease control fields of the config: */
-    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
-                                   H5C_RESIZE_CFG__VALIDATE_DECREMENT) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
-                    "error in the size decrease control fields of new config.")
-    }
-
-    /* check for conflicts between size increase and size decrease controls: */
-    if ( SUCCEED != H5C_validate_resize_config(config_ptr,
-                                   H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \
-                    "conflicting threshold fields in new config.")
-    }
-
-    /* will set the increase possible fields to FALSE later if needed */
-    cache_ptr->size_increase_possible       = TRUE;
-    cache_ptr->flash_size_increase_possible = TRUE;
-    cache_ptr->size_decrease_possible       = TRUE;
-
-    switch ( config_ptr->incr_mode )
-    {
-        case H5C_incr__off:
-            cache_ptr->size_increase_possible = FALSE;
-            break;
-
-        case H5C_incr__threshold:
-            if ( ( config_ptr->lower_hr_threshold <= (double)0.0f ) ||
-                 ( config_ptr->increment <= (double)1.0f ) ||
-                 ( ( config_ptr->apply_max_increment ) &&
-                   ( config_ptr->max_increment <= 0 ) ) ) {
-
-                 cache_ptr->size_increase_possible = FALSE;
-            }
-            break;
-
-        default: /* should be unreachable */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.")
-    }
-
-    /* logically, this is were configuration for flash cache size increases
-     * should go.  However, this configuration depends on max_cache_size, so
-     * we wait until the end of the function, when this field is set.
-     */
-
-    switch ( config_ptr->decr_mode )
-    {
-        case H5C_decr__off:
-            cache_ptr->size_decrease_possible = FALSE;
-            break;
-
-        case H5C_decr__threshold:
-            if ( ( config_ptr->upper_hr_threshold >= (double)1.0f ) ||
-                 ( config_ptr->decrement >= (double)1.0f ) ||
-                 ( ( config_ptr->apply_max_decrement ) &&
-                   ( config_ptr->max_decrement <= 0 ) ) ) {
-
-                cache_ptr->size_decrease_possible = FALSE;
-            }
-            break;
-
-        case H5C_decr__age_out:
-            if ( ( ( config_ptr->apply_empty_reserve ) &&
-                   ( config_ptr->empty_reserve >= (double)1.0f ) ) ||
-                 ( ( config_ptr->apply_max_decrement ) &&
-                   ( config_ptr->max_decrement <= 0 ) ) ) {
-
-                cache_ptr->size_decrease_possible = FALSE;
-            }
-            break;
-
-        case H5C_decr__age_out_with_threshold:
-            if ( ( ( config_ptr->apply_empty_reserve ) &&
-                   ( config_ptr->empty_reserve >= (double)1.0f ) ) ||
-                 ( ( config_ptr->apply_max_decrement ) &&
-                   ( config_ptr->max_decrement <= 0 ) ) ||
-                 ( config_ptr->upper_hr_threshold >= (double)1.0f ) ) {
-
-                cache_ptr->size_decrease_possible = FALSE;
-            }
-            break;
-
-        default: /* should be unreachable */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown decr_mode?!?!?.")
-    }
-
-    if ( config_ptr->max_size == config_ptr->min_size ) {
-
-        cache_ptr->size_increase_possible = FALSE;
-	cache_ptr->flash_size_increase_possible = FALSE;
-        cache_ptr->size_decrease_possible = FALSE;
-    }
-
-    /* flash_size_increase_possible is intentionally omitted from the
-     * following:
-     */
-    cache_ptr->resize_enabled = cache_ptr->size_increase_possible ||
-                                cache_ptr->size_decrease_possible;
-
-    cache_ptr->resize_ctl = *config_ptr;
-
-    /* Resize the cache to the supplied initial value if requested, or as
-     * necessary to force it within the bounds of the current automatic
-     * cache resizing configuration.
-     *
-     * Note that the min_clean_fraction may have changed, so we
-     * go through the exercise even if the current size is within
-     * range and an initial size has not been provided.
-     */
-    if ( (cache_ptr->resize_ctl).set_initial_size ) {
-
-        new_max_cache_size = (cache_ptr->resize_ctl).initial_size;
-    }
-    else if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).max_size ) {
-
-        new_max_cache_size = (cache_ptr->resize_ctl).max_size;
-    }
-    else if ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).min_size ) {
-
-        new_max_cache_size = (cache_ptr->resize_ctl).min_size;
-
-    } else {
-
-        new_max_cache_size = cache_ptr->max_cache_size;
-    }
-
-    new_min_clean_size = (size_t)
-                         ((double)new_max_cache_size *
-                          ((cache_ptr->resize_ctl).min_clean_fraction));
-
-
-    /* since new_min_clean_size is of type size_t, we have
-     *
-     * 	( 0 <= new_min_clean_size )
-     *
-     * by definition.
-     */
-    HDassert( new_min_clean_size <= new_max_cache_size );
-    HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size );
-    HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size );
-
-    if ( new_max_cache_size < cache_ptr->max_cache_size ) {
-
-        cache_ptr->size_decreased = TRUE;
-    }
-
-    cache_ptr->max_cache_size = new_max_cache_size;
-    cache_ptr->min_clean_size = new_min_clean_size;
-
-    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
-
-        /* this should be impossible... */
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_reset_cache_hit_rate_stats failed.")
-    }
-
-    /* remove excess epoch markers if any */
-    if ( ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) ||
-         ( config_ptr->decr_mode == H5C_decr__age_out ) ) {
-
-        if ( cache_ptr->epoch_markers_active >
-             (cache_ptr->resize_ctl).epochs_before_eviction ) {
-
-            result =
-                H5C__autoadjust__ageout__remove_excess_markers(cache_ptr);
-
-            if ( result != SUCCEED ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "can't remove excess epoch markers.")
-            }
-        }
-    } else if ( cache_ptr->epoch_markers_active > 0 ) {
-
-        result = H5C__autoadjust__ageout__remove_all_markers(cache_ptr);
-
-        if ( result != SUCCEED ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "error removing all epoch markers.")
-        }
-    }
-
-    /* configure flash size increase facility.  We wait until the
-     * end of the function, as we need the max_cache_size set before
-     * we start to keep things simple.
-     *
-     * If we haven't already ruled out flash cache size increases above,
-     * go ahead and configure it.
-     */
-
-    if ( cache_ptr->flash_size_increase_possible ) {
-
-        switch ( config_ptr->flash_incr_mode )
-        {
-            case H5C_flash_incr__off:
-                cache_ptr->flash_size_increase_possible = FALSE;
-                break;
-
-            case H5C_flash_incr__add_space:
-                cache_ptr->flash_size_increase_possible = TRUE;
-                cache_ptr->flash_size_increase_threshold =
-                    (size_t)
-                    (((double)(cache_ptr->max_cache_size)) *
-                     ((cache_ptr->resize_ctl).flash_threshold));
-                break;
-
-            default: /* should be unreachable */
-                 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                             "Unknown flash_incr_mode?!?!?.")
-                 break;
-        }
-    }
-
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_set_cache_auto_resize_config() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_set_evictions_enabled()
- *
- * Purpose:     Set cache_ptr->evictions_enabled to the value of the
- *              evictions enabled parameter.
- *
- * Return:      SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer
- *              7/27/07
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_set_evictions_enabled(H5C_t *cache_ptr, hbool_t evictions_enabled)
-{
-    herr_t ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-
-    /* There is no fundamental reason why we should not permit
-     * evictions to be disabled while automatic resize is enabled.
-     * However, I can't think of any good reason why one would
-     * want to, and allowing it would greatly complicate testing
-     * the feature.  Hence the following:
-     */
-    if((evictions_enabled != TRUE) &&
-         ((cache_ptr->resize_ctl.incr_mode != H5C_incr__off) ||
-	   (cache_ptr->resize_ctl.decr_mode != H5C_decr__off)))
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't disable evictions when auto resize enabled.")
-
-    cache_ptr->evictions_enabled = evictions_enabled;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_set_evictions_enabled() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_set_prefix
- *
- * Purpose:     Set the values of the prefix field of H5C_t.  This
- *		filed is used to label some debugging output.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              1/20/06
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_set_prefix(H5C_t * cache_ptr, char * prefix)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    if ( ( cache_ptr == NULL ) ||
-         ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ||
-         ( prefix == NULL ) ||
-         ( HDstrlen(prefix) >= H5C__PREFIX_LEN ) ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.")
-    }
-
-    HDstrncpy(&(cache_ptr->prefix[0]), prefix, (size_t)(H5C__PREFIX_LEN));
-
-    cache_ptr->prefix[H5C__PREFIX_LEN - 1] = '\0';
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_set_prefix() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_set_trace_file_ptr
- *
- * Purpose:     Set the trace_file_ptr field for the cache.
- *
- *              This field must either be NULL (which turns of trace
- *              file logging), or be a pointer to an open file to which
- *              trace file data is to be written.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              1/20/06
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5C_set_trace_file_ptr(H5C_t * cache_ptr,
-                       FILE * trace_file_ptr)
-{
-    herr_t		ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* This would normally be an assert, but we need to use an HGOTO_ERROR
-     * call to shut up the compiler.
-     */
-    if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr")
-    }
-
-    cache_ptr->trace_file_ptr = trace_file_ptr;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_set_trace_file_ptr() */
+                    if(NULL == (entry_ptr->image_ptr = H5MM_malloc(entry_ptr->size + 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(((uint8_t *)entry_ptr->image_ptr) + entry_ptr->size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+                    if(0 == mpi_rank)
+                        if(H5C__generate_image(f, cache_ptr, entry_ptr, dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "can't generate entry's image")
+                } /* end if */
+                HDassert(entry_ptr->image_ptr);
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_stats
- *
- * Purpose:     Prints statistics about the cache.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              6/2/04
- *
- *		JRM -- 11/13/08
- *		Added code displaying the max_clean_index_size and
- *		max_dirty_index_size.
- *
- *              MAM -- 01/06/09
- *              Added code displaying the calls_to_msic,
- *              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
-H5C_stats(H5C_t * cache_ptr,
-          const char *  cache_name,
-          hbool_t
-#if !H5C_COLLECT_CACHE_STATS
-          H5_ATTR_UNUSED
-#endif /* H5C_COLLECT_CACHE_STATS */
-          display_detailed_stats)
-{
-#if H5C_COLLECT_CACHE_STATS
-    int		i;
-    int64_t     total_hits = 0;
-    int64_t     total_misses = 0;
-    int64_t	total_write_protects = 0;
-    int64_t	total_read_protects = 0;
-    int64_t	max_read_protects = 0;
-    int64_t     total_insertions = 0;
-    int64_t     total_pinned_insertions = 0;
-    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;
-    int64_t	total_size_increases = 0;
-    int64_t	total_size_decreases = 0;
-    int64_t	total_entry_flush_size_changes = 0;
-    int64_t	total_cache_flush_size_changes = 0;
-    int64_t	total_pins = 0;
-    int64_t	total_unpins = 0;
-    int64_t	total_dirty_pins = 0;
-    int64_t	total_pinned_flushes = 0;
-    int64_t	total_pinned_clears = 0;
-    int32_t     aggregate_max_accesses = 0;
-    int32_t     aggregate_min_accesses = 1000000;
-    int32_t     aggregate_max_clears = 0;
-    int32_t     aggregate_max_flushes = 0;
-    size_t      aggregate_max_size = 0;
-    int32_t	aggregate_max_pins = 0;
-    double      hit_rate;
-    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 */
+                H5_CHECKED_ASSIGN(buf_size, int, entry_ptr->size, size_t);
+                if(MPI_SUCCESS != (mpi_code = MPI_Bcast(entry_ptr->image_ptr, buf_size, MPI_BYTE, 0, comm)))
+                    HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
 
-    FUNC_ENTER_NOAPI(FAIL)
+                /* Mark the entry as collective and insert into the collective list */
+                entry_ptr->coll_access = TRUE;
+                H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
+            } /* end if */
+            else if(entry_ptr->coll_access) {
+                H5C__MOVE_TO_TOP_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
+            } /* end else-if */
+        } /* end if */
+#endif /* H5_HAVE_PARALLEL */
 
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+#if H5C_DO_TAGGING_SANITY_CHECKS
+{
+        /* Verify tag value */
+        if(cache_ptr->ignore_tags != TRUE) {
+            haddr_t tag;              /* Tag value */
 
-    /* This would normally be an assert, but we need to use an HGOTO_ERROR
-     * call to shut up the compiler.
-     */
-    if ( ( ! cache_ptr ) ||
-         ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ||
-         ( !cache_name ) ) {
+            /* 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. */
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or cache_name")
-    }
+            /* Get the tag from the DXPL */
+            if((H5P_get(dxpl, H5AC_TAG_NAME, &tag)) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to query property value")
+    
+            if(H5C_verify_tag(entry_ptr->type->id, tag) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "tag verification failed")
+        } /* end if */
+}
+#endif
 
-#if H5C_COLLECT_CACHE_STATS
+        hit = TRUE;
+        thing = (void *)entry_ptr;
 
-    for ( i = 0; i <= cache_ptr->max_type_id; i++ ) {
+    } else {
 
-        total_hits              += cache_ptr->hits[i];
-        total_misses            += cache_ptr->misses[i];
-	total_write_protects	+= cache_ptr->write_protects[i];
-	total_read_protects	+= cache_ptr->read_protects[i];
-	if ( max_read_protects < cache_ptr->max_read_protects[i] ) {
-	    max_read_protects = cache_ptr->max_read_protects[i];
-	}
-        total_insertions        += cache_ptr->insertions[i];
-        total_pinned_insertions += cache_ptr->pinned_insertions[i];
-        total_clears            += cache_ptr->clears[i];
-        total_flushes           += cache_ptr->flushes[i];
-        total_evictions         += cache_ptr->evictions[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
-				+= cache_ptr->entry_flush_size_changes[i];
-    	total_cache_flush_size_changes
-				+= cache_ptr->cache_flush_size_changes[i];
-	total_pins              += cache_ptr->pins[i];
-	total_unpins            += cache_ptr->unpins[i];
-	total_dirty_pins        += cache_ptr->dirty_pins[i];
-	total_pinned_flushes    += cache_ptr->pinned_flushes[i];
-	total_pinned_clears     += cache_ptr->pinned_clears[i];
-#if H5C_COLLECT_CACHE_ENTRY_STATS
-    if ( aggregate_max_accesses < cache_ptr->max_accesses[i] )
-        aggregate_max_accesses = cache_ptr->max_accesses[i];
-    if ( aggregate_min_accesses > aggregate_max_accesses )
-        aggregate_min_accesses = aggregate_max_accesses;
-    if ( aggregate_min_accesses > cache_ptr->min_accesses[i] )
-        aggregate_min_accesses = cache_ptr->min_accesses[i];
-    if ( aggregate_max_clears < cache_ptr->max_clears[i] )
-        aggregate_max_clears = cache_ptr->max_clears[i];
-    if ( aggregate_max_flushes < cache_ptr->max_flushes[i] )
-        aggregate_max_flushes = cache_ptr->max_flushes[i];
-    if ( aggregate_max_size < cache_ptr->max_size[i] )
-        aggregate_max_size = cache_ptr->max_size[i];
-    if ( aggregate_max_pins < cache_ptr->max_pins[i] )
-        aggregate_max_pins = cache_ptr->max_pins[i];
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
-    }
+        /* must try to load the entry from disk. */
 
-    if ( ( total_hits > 0 ) || ( total_misses > 0 ) ) {
+        hit = FALSE;
 
-        hit_rate = (double)100.0f * ((double)(total_hits)) /
-                   ((double)(total_hits + total_misses));
-    } else {
-        hit_rate = 0.0f;
-    }
+        if(NULL == (thing = H5C_load_entry(f, dxpl_id, 
+#ifdef H5_HAVE_PARALLEL
+                                           coll_access, 
+#endif /* H5_HAVE_PARALLEL */
+                                           type, addr, udata)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't load entry")
 
-    if ( cache_ptr->successful_ht_searches > 0 ) {
+        entry_ptr = (H5C_cache_entry_t *)thing;
+        cache_ptr->entries_loaded_counter++;
 
-        average_successful_search_depth =
-            ((double)(cache_ptr->total_successful_ht_search_depth)) /
-            ((double)(cache_ptr->successful_ht_searches));
-    }
+        entry_ptr->ring  = ring;
+#ifdef H5_HAVE_PARALLEL
+        if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI) && entry_ptr->coll_access)
+            H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, NULL)
+#endif /* H5_HAVE_PARALLEL */
 
-    if ( cache_ptr->failed_ht_searches > 0 ) {
+        /* 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")
 
-        average_failed_search_depth =
-            ((double)(cache_ptr->total_failed_ht_search_depth)) /
-            ((double)(cache_ptr->failed_ht_searches));
-    }
+        /* 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 ) ) {
 
+            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")
+        }
 
-    HDfprintf(stdout, "\n%sH5C: cache statistics for %s\n",
-              cache_ptr->prefix, cache_name);
-
-    HDfprintf(stdout, "\n");
-
-    HDfprintf(stdout,
-              "%s  hash table insertion / deletions   = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->total_ht_insertions),
-              (long)(cache_ptr->total_ht_deletions));
-
-    HDfprintf(stdout,
-              "%s  HT successful / failed searches    = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->successful_ht_searches),
-              (long)(cache_ptr->failed_ht_searches));
-
-    HDfprintf(stdout,
-              "%s  Av. HT suc / failed search depth   = %f / %f\n",
-              cache_ptr->prefix,
-              average_successful_search_depth,
-              average_failed_search_depth);
-
-    HDfprintf(stdout,
-             "%s  current (max) index size / length  = %ld (%ld) / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->index_size),
-              (long)(cache_ptr->max_index_size),
-              (long)(cache_ptr->index_len),
-              (long)(cache_ptr->max_index_len));
-
-    HDfprintf(stdout,
-             "%s  current (max) clean/dirty idx size = %ld (%ld) / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->clean_index_size),
-              (long)(cache_ptr->max_clean_index_size),
-              (long)(cache_ptr->dirty_index_size),
-              (long)(cache_ptr->max_dirty_index_size));
-
-    HDfprintf(stdout,
-             "%s  current (max) slist size / length  = %ld (%ld) / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->slist_size),
-              (long)(cache_ptr->max_slist_size),
-              (long)(cache_ptr->slist_len),
-              (long)(cache_ptr->max_slist_len));
-
-    HDfprintf(stdout,
-             "%s  current (max) PL size / length     = %ld (%ld) / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->pl_size),
-              (long)(cache_ptr->max_pl_size),
-              (long)(cache_ptr->pl_len),
-              (long)(cache_ptr->max_pl_len));
-
-    HDfprintf(stdout,
-             "%s  current (max) PEL size / length    = %ld (%ld) / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->pel_size),
-              (long)(cache_ptr->max_pel_size),
-              (long)(cache_ptr->pel_len),
-              (long)(cache_ptr->max_pel_len));
-
-    HDfprintf(stdout,
-              "%s  current LRU list size / length     = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->LRU_list_size),
-              (long)(cache_ptr->LRU_list_len));
-
-    HDfprintf(stdout,
-              "%s  current clean LRU size / length    = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->cLRU_list_size),
-              (long)(cache_ptr->cLRU_list_len));
-
-    HDfprintf(stdout,
-              "%s  current dirty LRU size / length    = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)(cache_ptr->dLRU_list_size),
-              (long)(cache_ptr->dLRU_list_len));
-
-    HDfprintf(stdout,
-              "%s  Total hits / misses / hit_rate     = %ld / %ld / %f\n",
-              cache_ptr->prefix,
-              (long)total_hits,
-              (long)total_misses,
-              hit_rate);
-
-    HDfprintf(stdout,
-              "%s  Total write / read (max) protects  = %ld / %ld (%ld)\n",
-              cache_ptr->prefix,
-              (long)total_write_protects,
-              (long)total_read_protects,
-              (long)max_read_protects);
-
-    HDfprintf(stdout,
-              "%s  Total clears / flushes             = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)total_clears,
-              (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",
-              cache_ptr->prefix,
-              (long)total_insertions,
-              (long)total_pinned_insertions,
-              (long)total_moves);
-
-    HDfprintf(stdout,
-	      "%s  Total entry / cache flush moves    = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)total_entry_flush_moves,
-              (long)total_cache_flush_moves);
-
-    HDfprintf(stdout, "%s  Total entry size incrs / decrs     = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)total_size_increases,
-              (long)total_size_decreases);
-
-    HDfprintf(stdout, "%s  Ttl entry/cache flush size changes = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)total_entry_flush_size_changes,
-              (long)total_cache_flush_size_changes);
-
-    HDfprintf(stdout,
-	      "%s  Total entry pins (dirty) / unpins  = %ld (%ld) / %ld\n",
-              cache_ptr->prefix,
-              (long)total_pins,
-	      (long)total_dirty_pins,
-              (long)total_unpins);
-
-    HDfprintf(stdout, "%s  Total pinned flushes / clears      = %ld / %ld\n",
-              cache_ptr->prefix,
-              (long)total_pinned_flushes,
-              (long)total_pinned_clears);
-
-    HDfprintf(stdout, "%s  MSIC: (make space in cache) calls  = %lld\n",
-              cache_ptr->prefix,
-              (long long)(cache_ptr->calls_to_msic));
-
-    if (cache_ptr->calls_to_msic > 0) {
-        average_entries_skipped_per_calls_to_msic =
-            (((double)(cache_ptr->total_entries_skipped_in_msic)) /
-            ((double)(cache_ptr->calls_to_msic)));
-    }
+        if(cache_ptr->index_size >= cache_ptr->max_cache_size)
+           empty_space = 0;
+        else
+           empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
 
-    HDfprintf(stdout, "%s  MSIC: Average/max entries skipped  = %lf / %ld\n",
-              cache_ptr->prefix,
-              (double)average_entries_skipped_per_calls_to_msic,
-              (long)(cache_ptr->max_entries_skipped_in_msic));
+	/* 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)
+	       ||
+	       ( ( empty_space + cache_ptr->clean_index_size ) <
+	         cache_ptr->min_clean_size )
+	     )
+           ) {
 
-    if (cache_ptr->calls_to_msic > 0) {
-        average_entries_scanned_per_calls_to_msic =
-            (((double)(cache_ptr->total_entries_scanned_in_msic)) /
-            ((double)(cache_ptr->calls_to_msic)));
-    }
+            size_t space_needed;
 
-    HDfprintf(stdout, "%s  MSIC: Average/max entries scanned  = %lf / %ld\n",
-              cache_ptr->prefix,
-              (double)average_entries_scanned_per_calls_to_msic,
-              (long)(cache_ptr->max_entries_scanned_in_msic));
+	    if(empty_space <= entry_ptr->size)
+                cache_ptr->cache_full = TRUE;
 
-    HDfprintf(stdout, "%s  MSIC: Scanned to make space(evict) = %lld\n",
-              cache_ptr->prefix,
-              (long long)(cache_ptr->entries_scanned_to_make_space));
+            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;
+            } /* end if */
+            else {
+                write_permitted = cache_ptr->write_permitted;
+                have_write_permitted = TRUE;
+            } /* end else */
 
-    HDfprintf(stdout, "%s  MSIC: Scanned to satisfy min_clean = %lld\n",
-              cache_ptr->prefix,
-              (long long)(cache_ptr->total_entries_scanned_in_msic -
-                            cache_ptr->entries_scanned_to_make_space));
+            HDassert(entry_ptr->size <= H5C_MAX_ENTRY_SIZE);
+            space_needed = entry_ptr->size;
+            if(space_needed > cache_ptr->max_cache_size)
+                space_needed = cache_ptr->max_cache_size;
 
-    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));
+            /* Note that space_needed is just the amount of space that
+             * needed to insert the new entry without exceeding the cache
+             * size limit.  The subsequent call to H5C__make_space_in_cache()
+             * may evict the entries required to free more or less space
+             * depending on conditions.  It MAY be less if the cache is
+             * currently undersized, or more if the cache is oversized.
+             *
+             * The cache can exceed its maximum size limit via the following
+             * mechanisms:
+             *
+             * First, it is possible for the cache to grow without
+             * bound as long as entries are protected and not unprotected.
+             *
+             * Second, when writes are not permitted it is also possible
+             * for the cache to grow without bound.
+	     *
+	     * Third, the user may choose to disable evictions -- causing
+	     * the cache to grow without bound until evictions are
+	     * re-enabled.
+             *
+             * Finally, we usually don't check to see if the cache is
+             * oversized at the end of an unprotect.  As a result, it is
+             * possible to have a vastly oversized cache with no protected
+             * entries as long as all the protects preceed the unprotects.
+             *
+             * Since items 1, 2, and 3 are not changing any time soon, I
+             * see no point in worrying about the fourth.
+             */
 
-#if H5C_COLLECT_CACHE_ENTRY_STATS
+            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")
+        } /* end if */
 
-    HDfprintf(stdout, "%s  aggregate max / min accesses       = %d / %d\n",
-              cache_ptr->prefix,
-              (int)aggregate_max_accesses,
-              (int)aggregate_min_accesses);
+        /* Insert the entry in the hash table.  It can't be dirty yet, so
+         * we don't even check to see if it should go in the skip list.
+         *
+         * This is no longer true -- due to a bug fix, we may modify
+         * data on load to repair a file.
+         *
+         *   *******************************************
+         *
+         * Set the flush_last field
+ 	 * 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 flag 
+         * is ignored if the entry is already in cache.
+         */
+        entry_ptr->flush_me_last = flush_last;
 
-    HDfprintf(stdout, "%s  aggregate max_clears / max_flushes = %d / %d\n",
-              cache_ptr->prefix,
-              (int)aggregate_max_clears,
-              (int)aggregate_max_flushes);
+        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL)
 
-    HDfprintf(stdout, "%s  aggregate max_size / max_pins      = %d / %d\n",
-              cache_ptr->prefix,
-              (int)aggregate_max_size,
-	      (int)aggregate_max_pins);
+        if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) {
 
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, NULL)
+        }
 
-    if ( display_detailed_stats )
-    {
+        /* insert the entry in the data structures used by the replacement
+         * policy.  We are just going to take it out again when we update
+         * the replacement policy for a protect, but this simplifies the
+         * code.  If we do this often enough, we may want to optimize this.
+         */
+        H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, NULL)
 
-        for ( i = 0; i <= cache_ptr->max_type_id; i++ ) {
+        /* Record that the entry was loaded, to trigger a notify callback later */
+        /* (After the entry is fully added to the cache) */
+        was_loaded = TRUE;
+    } /* end else */
 
-            HDfprintf(stdout, "\n");
+    HDassert(entry_ptr->addr == addr);
+    HDassert(entry_ptr->type == type);
 
-            HDfprintf(stdout, "%s  Stats on %s:\n",
-                      cache_ptr->prefix,
-                      ((cache_ptr->type_name_table_ptr))[i]);
+    if(entry_ptr->is_protected) {
+	if(read_only && entry_ptr->is_read_only) {
+	    HDassert(entry_ptr->ro_ref_count > 0);
+	    (entry_ptr->ro_ref_count)++;
+	} /* end if */
+        else 
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "Target already protected & not read only?!?")
+    } /* end if */
+    else {
+    	H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, NULL)
 
-            if ( ( cache_ptr->hits[i] > 0 ) || ( cache_ptr->misses[i] > 0 ) ) {
+    	entry_ptr->is_protected = TRUE;
 
-                hit_rate = (double)100.0f * ((double)(cache_ptr->hits[i])) /
-                          ((double)(cache_ptr->hits[i] + cache_ptr->misses[i]));
-            } else {
-                hit_rate = 0.0f;
-            }
+	if ( read_only ) {
+	    entry_ptr->is_read_only = TRUE;
+	    entry_ptr->ro_ref_count = 1;
+	} /* end if */
 
-            HDfprintf(stdout,
-                      "%s    hits / misses / hit_rate       = %ld / %ld / %f\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->hits[i]),
-                      (long)(cache_ptr->misses[i]),
-                      hit_rate);
+    	entry_ptr->dirtied = FALSE;
+    } /* end else */
 
-            HDfprintf(stdout,
-                      "%s    write / read (max) protects    = %ld / %ld (%d)\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->write_protects[i]),
-                      (long)(cache_ptr->read_protects[i]),
-                      (int)(cache_ptr->max_read_protects[i]));
+    H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit)
 
-            HDfprintf(stdout,
-                      "%s    clears / flushes               = %ld / %ld\n", 
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->clears[i]),
-                      (long)(cache_ptr->flushes[i]));
+    H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
 
-            HDfprintf(stdout,
-                      "%s    evictions / take ownerships    = %ld / %ld\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->evictions[i]),
-                      (long)(cache_ptr->take_ownerships[i]));
+    ret_value = thing;
 
-            HDfprintf(stdout,
-                      "%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]));
+    if ( ( cache_ptr->evictions_enabled ) &&
+         ( ( cache_ptr->size_decreased ) ||
+           ( ( cache_ptr->resize_enabled ) &&
+             ( cache_ptr->cache_accesses >=
+               (cache_ptr->resize_ctl).epoch_length ) ) ) ) {
 
-            HDfprintf(stdout,
-                      "%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]));
+        if ( ! have_write_permitted ) {
 
-            HDfprintf(stdout,
-                      "%s    size increases / decreases     = %ld / %ld\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->size_increases[i]),
-                      (long)(cache_ptr->size_decreases[i]));
+            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")
+                else
+                    have_write_permitted = TRUE;
+            } else {
 
-            HDfprintf(stdout,
-                      "%s    entry/cache flush size changes = %ld / %ld\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->entry_flush_size_changes[i]),
-                      (long)(cache_ptr->cache_flush_size_changes[i]));
+                write_permitted = cache_ptr->write_permitted;
 
+                have_write_permitted = TRUE;
 
-            HDfprintf(stdout,
-                      "%s    entry pins / unpins            = %ld / %ld\n",
-                      cache_ptr->prefix,
-                      (long)(cache_ptr->pins[i]),
-                      (long)(cache_ptr->unpins[i]));
+            }
+        }
 
-            HDfprintf(stdout,
-                      "%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]));
+        if(cache_ptr->resize_enabled &&
+             (cache_ptr->cache_accesses >= (cache_ptr->resize_ctl).epoch_length)) {
 
-#if H5C_COLLECT_CACHE_ENTRY_STATS
+            if(H5C__auto_adjust_cache_size(f, dxpl_id, write_permitted) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "Cache auto-resize failed")
+        } /* end if */
 
-            HDfprintf(stdout,
-                      "%s    entry max / min accesses       = %d / %d\n",
-                      cache_ptr->prefix,
-                      cache_ptr->max_accesses[i],
-                      cache_ptr->min_accesses[i]);
+        if(cache_ptr->size_decreased) {
+            cache_ptr->size_decreased = FALSE;
 
-            HDfprintf(stdout,
-                      "%s    entry max_clears / max_flushes = %d / %d\n",
-                      cache_ptr->prefix,
-                      cache_ptr->max_clears[i],
-                      cache_ptr->max_flushes[i]);
+            /* check to see if the cache is now oversized due to the cache
+             * size reduction.  If it is, try to evict enough entries to
+             * bring the cache size down to the current maximum cache size.
+	     *
+	     * Also, if the min_clean_size requirement is not met, we
+	     * should also call H5C__make_space_in_cache() to bring us
+	     * into complience.
+             */
 
-            HDfprintf(stdout,
-                      "%s    entry max_size / max_pins      = %d / %d\n",
-                      cache_ptr->prefix,
-                      (int)(cache_ptr->max_size[i]),
-		      (int)(cache_ptr->max_pins[i]));
+            if(cache_ptr->index_size >= cache_ptr->max_cache_size)
+               empty_space = 0;
+            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) ) {
 
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+		if(cache_ptr->index_size > cache_ptr->max_cache_size)
+                    cache_ptr->cache_full = TRUE;
 
-        }
+                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")
+            }
+        } /* end if */
     }
 
-    HDfprintf(stdout, "\n");
+    /* If we loaded the entry and the entry's type has a 'notify' callback, send
+     * an 'after load' 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(was_loaded) {
+        /* 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")
+    } /* end if */
 
-#endif /* H5C_COLLECT_CACHE_STATS */
+#ifdef H5_HAVE_PARALLEL
+    if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
+        /* Make sure the size of the collective entries in the cache remain in check */
+        if(coll_access) {
+            if(H5P_USER_TRUE == f->coll_md_read) {
+                if(cache_ptr->max_cache_size * 80 < cache_ptr->coll_list_size * 100)
+                    if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, "can't clear collective metadata entries")
+            } /* end if */
+            else {
+                if(cache_ptr->max_cache_size * 40 < cache_ptr->coll_list_size * 100)
+                    if(H5C_clear_coll_entries(cache_ptr, TRUE) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, "can't clear collective metadata entries")
+            } /* end else */
+        } /* end if */
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
 
 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))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "an extreme sanity check failed on exit")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-} /* H5C_stats() */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_protect() */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_stats__reset
- *
- * Purpose:     Reset the stats fields to their initial values.
- *
- * Return:      void
- *
- * Programmer:  John Mainzer, 4/28/04
+ * Function:    H5C_reset_cache_hit_rate_stats()
  *
- *		JRM 11/13/08
- *		Added initialization for the new max_clean_index_size and
- *		max_dirty_index_size fields.
+ * Purpose:     Reset the cache hit rate computation fields.
  *
- *              MAM -- 01/06/09
- *              Added code to initalize the calls_to_msic,
- *              total_entries_skipped_in_msic, total_entries_scanned_in_msic,
- *              and max_entries_skipped_in_msic fields.
+ * Return:      SUCCEED on success, and FAIL on failure.
  *
- *		JRM 4/11/15
- *		Added code to initialize the new slist_scan_restarts,
- *		LRU_scan_restarts, hash_bucket_scan_restarts, and 
- *		take_ownerships fields.
+ * Programmer:  John Mainzer, 10/5/04
  *
  *-------------------------------------------------------------------------
  */
-void
-#ifndef NDEBUG
-H5C_stats__reset(H5C_t * cache_ptr)
-#else /* NDEBUG */
-#if H5C_COLLECT_CACHE_STATS
-H5C_stats__reset(H5C_t * cache_ptr)
-#else /* H5C_COLLECT_CACHE_STATS */
-H5C_stats__reset(H5C_t H5_ATTR_UNUSED * cache_ptr)
-#endif /* H5C_COLLECT_CACHE_STATS */
-#endif /* NDEBUG */
+herr_t
+H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr)
 {
-#if H5C_COLLECT_CACHE_STATS
-    int i;
-#endif /* H5C_COLLECT_CACHE_STATS */
-
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-#if H5C_COLLECT_CACHE_STATS
-    for ( i = 0; i <= cache_ptr->max_type_id; i++ )
-    {
-        cache_ptr->hits[i]			= 0;
-        cache_ptr->misses[i]			= 0;
-        cache_ptr->write_protects[i]		= 0;
-        cache_ptr->read_protects[i]		= 0;
-        cache_ptr->max_read_protects[i]		= 0;
-        cache_ptr->insertions[i]		= 0;
-        cache_ptr->pinned_insertions[i]		= 0;
-        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->pins[i]	 		= 0;
-        cache_ptr->unpins[i]	 		= 0;
-        cache_ptr->dirty_pins[i]	 	= 0;
-        cache_ptr->pinned_flushes[i]	 	= 0;
-        cache_ptr->pinned_clears[i]	 	= 0;
-        cache_ptr->size_increases[i] 		= 0;
-        cache_ptr->size_decreases[i] 		= 0;
-	cache_ptr->entry_flush_size_changes[i]	= 0;
-	cache_ptr->cache_flush_size_changes[i]	= 0;
-    }
-
-    cache_ptr->total_ht_insertions		= 0;
-    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		= 0;
-    cache_ptr->total_failed_ht_search_depth	= 0;
-
-    cache_ptr->max_index_len			= 0;
-    cache_ptr->max_index_size			= (size_t)0;
-    cache_ptr->max_clean_index_size		= (size_t)0;
-    cache_ptr->max_dirty_index_size		= (size_t)0;
-
-    cache_ptr->max_slist_len			= 0;
-    cache_ptr->max_slist_size			= (size_t)0;
-
-    cache_ptr->max_pl_len			= 0;
-    cache_ptr->max_pl_size			= (size_t)0;
-
-    cache_ptr->max_pel_len			= 0;
-    cache_ptr->max_pel_size			= (size_t)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;
-
-#if H5C_COLLECT_CACHE_ENTRY_STATS
+    herr_t	ret_value = SUCCEED;      /* Return value */
 
-    for ( i = 0; i <= cache_ptr->max_type_id; i++ )
-    {
-        cache_ptr->max_accesses[i]		= 0;
-        cache_ptr->min_accesses[i]		= 1000000;
-        cache_ptr->max_clears[i]		= 0;
-        cache_ptr->max_flushes[i]		= 0;
-        cache_ptr->max_size[i]			= (size_t)0;
-        cache_ptr->max_pins[i]			= 0;
-    }
+    FUNC_ENTER_NOAPI(FAIL)
 
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
-#endif /* H5C_COLLECT_CACHE_STATS */
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "bad cache_ptr on entry")
 
-    return;
+    cache_ptr->cache_hits		= 0;
+    cache_ptr->cache_accesses		= 0;
 
-} /* H5C_stats__reset() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_reset_cache_hit_rate_stats() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_dump_cache
+ * Function:    H5C_set_cache_auto_resize_config
  *
- * Purpose:     Print a summary of the contents of the metadata cache for
- *              debugging purposes.
+ * Purpose:	Set the cache automatic resize configuration to the
+ *		provided values if they are in range, and fail if they
+ *		are not.
  *
- * Return:      Non-negative on success/Negative on failure
+ *		If the new configuration enables automatic cache resizing,
+ *		coerce the cache max size and min clean size into agreement
+ *		with the new policy and re-set the full cache hit rate
+ *		stats.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
  *
  * Programmer:  John Mainzer
- *              10/10/10
+ *		10/8/04
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_dump_cache(H5C_t * cache_ptr,
-               const char *  cache_name)
+H5C_set_cache_auto_resize_config(H5C_t *cache_ptr,
+                                 H5C_auto_size_ctl_t *config_ptr)
 {
-    herr_t              ret_value = SUCCEED;   /* Return value */
-    int                 i;
-    H5C_cache_entry_t * entry_ptr = NULL;
-    H5SL_t *            slist_ptr = NULL;
-    H5SL_node_t *       node_ptr = NULL;
+    size_t      new_max_cache_size;
+    size_t      new_min_clean_size;
+    herr_t	ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert(cache_ptr != NULL);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
-    HDassert(cache_name != NULL );
-
-    /* First, create a skip list */
-    slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL);
-
-    if ( slist_ptr == NULL ) {
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "bad cache_ptr on entry")
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry")
+    if(config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "unknown config version")
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create skip list.")
-    }
+    /* check general configuration section of the config: */
+    if(H5C_validate_resize_config(config_ptr, H5C_RESIZE_CFG__VALIDATE_GENERAL) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "error in general configuration fields of new config")
 
-    /* Next, scan the index, and insert all entries in the skip list.
-     * Do this, as we want to display cache entries in increasing address
-     * order.
-     */
-    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) {
+    /* check size increase control fields of the config: */
+    if(H5C_validate_resize_config(config_ptr, H5C_RESIZE_CFG__VALIDATE_INCREMENT) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "error in the size increase control fields of new config")
 
-        entry_ptr = cache_ptr->index[i];
+    /* check size decrease control fields of the config: */
+    if(H5C_validate_resize_config(config_ptr, H5C_RESIZE_CFG__VALIDATE_DECREMENT) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "error in the size decrease control fields of new config")
 
-        while ( entry_ptr != NULL ) {
+    /* check for conflicts between size increase and size decrease controls: */
+    if(H5C_validate_resize_config(config_ptr, H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "conflicting threshold fields in new config")
 
-            HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+    /* will set the increase possible fields to FALSE later if needed */
+    cache_ptr->size_increase_possible       = TRUE;
+    cache_ptr->flash_size_increase_possible = TRUE;
+    cache_ptr->size_decrease_possible       = TRUE;
 
-            if ( H5SL_insert(slist_ptr, entry_ptr, &(entry_ptr->addr)) < 0 ) {
+    switch(config_ptr->incr_mode) {
+        case H5C_incr__off:
+            cache_ptr->size_increase_possible = FALSE;
+            break;
 
-                HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \
-                            "Can't insert entry in skip list")
-            }
+        case H5C_incr__threshold:
+            if((config_ptr->lower_hr_threshold <= (double)0.0f) ||
+                     (config_ptr->increment <= (double)1.0f) ||
+                     ((config_ptr->apply_max_increment) && (config_ptr->max_increment <= 0)))
+                 cache_ptr->size_increase_possible = FALSE;
+            break;
 
-            entry_ptr = entry_ptr->ht_next;
-        }
-    }
+        default: /* should be unreachable */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?")
+    } /* end switch */
 
-    /* If we get this far, all entries in the cache are listed in the
-     * skip list -- scan the skip list generating the desired output.
+    /* logically, this is were configuration for flash cache size increases
+     * should go.  However, this configuration depends on max_cache_size, so
+     * we wait until the end of the function, when this field is set.
      */
 
-    HDfprintf(stdout, "\n\nDump of metadata cache \"%s\".\n", cache_name);
-    HDfprintf(stdout,
-        "Num:    Addr:                             Tag:         Len:    Type:   Prot:   Pinned: Dirty: Corked:\n");
-
-    i = 0;
-
-    node_ptr = H5SL_first(slist_ptr);
+    switch(config_ptr->decr_mode) {
+        case H5C_decr__off:
+            cache_ptr->size_decrease_possible = FALSE;
+            break;
 
-    if ( node_ptr != NULL ) {
+        case H5C_decr__threshold:
+            if((config_ptr->upper_hr_threshold >= (double)1.0f) ||
+                     (config_ptr->decrement >= (double)1.0f) ||
+                     ((config_ptr->apply_max_decrement) && (config_ptr->max_decrement <= 0)))
+                cache_ptr->size_decrease_possible = FALSE;
+            break;
 
-        entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+        case H5C_decr__age_out:
+            if(((config_ptr->apply_empty_reserve) && (config_ptr->empty_reserve >= (double)1.0f)) ||
+                    ((config_ptr->apply_max_decrement) && (config_ptr->max_decrement <= 0)))
+                cache_ptr->size_decrease_possible = FALSE;
+            break;
 
-    } else {
+        case H5C_decr__age_out_with_threshold:
+            if(((config_ptr->apply_empty_reserve) && (config_ptr->empty_reserve >= (double)1.0f)) ||
+                    ((config_ptr->apply_max_decrement) && (config_ptr->max_decrement <= 0)) ||
+                    (config_ptr->upper_hr_threshold >= (double)1.0f))
+                cache_ptr->size_decrease_possible = FALSE;
+            break;
 
-        entry_ptr = NULL;
-    }
+        default: /* should be unreachable */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown decr_mode?!?!?")
+    } /* end switch */
 
-    while ( entry_ptr != NULL ) {
+    if(config_ptr->max_size == config_ptr->min_size) {
+        cache_ptr->size_increase_possible = FALSE;
+	cache_ptr->flash_size_increase_possible = FALSE;
+        cache_ptr->size_decrease_possible = FALSE;
+    } /* end if */
 
-        HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+    /* flash_size_increase_possible is intentionally omitted from the
+     * following:
+     */
+    cache_ptr->resize_enabled = cache_ptr->size_increase_possible ||
+                                cache_ptr->size_decrease_possible;
 
-        HDfprintf(stdout,
-            "%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_corked));
+    cache_ptr->resize_ctl = *config_ptr;
 
-        /* increment node_ptr before we delete its target */
-        node_ptr = H5SL_next(node_ptr);
+    /* Resize the cache to the supplied initial value if requested, or as
+     * necessary to force it within the bounds of the current automatic
+     * cache resizing configuration.
+     *
+     * Note that the min_clean_fraction may have changed, so we
+     * go through the exercise even if the current size is within
+     * range and an initial size has not been provided.
+     */
+    if(cache_ptr->resize_ctl.set_initial_size)
+        new_max_cache_size = cache_ptr->resize_ctl.initial_size;
+    else if(cache_ptr->max_cache_size > cache_ptr->resize_ctl.max_size)
+        new_max_cache_size = cache_ptr->resize_ctl.max_size;
+    else if(cache_ptr->max_cache_size < cache_ptr->resize_ctl.min_size)
+        new_max_cache_size = cache_ptr->resize_ctl.min_size;
+    else
+        new_max_cache_size = cache_ptr->max_cache_size;
 
-        /* remove the first item in the skip list */
-        if ( H5SL_remove(slist_ptr, &(entry_ptr->addr)) != entry_ptr ) {
+    new_min_clean_size = (size_t)((double)new_max_cache_size *
+                          ((cache_ptr->resize_ctl).min_clean_fraction));
 
-            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \
-                        "Can't delete entry from skip list.")
-        }
 
-        if ( node_ptr != NULL ) {
+    /* since new_min_clean_size is of type size_t, we have
+     *
+     * 	( 0 <= new_min_clean_size )
+     *
+     * by definition.
+     */
+    HDassert(new_min_clean_size <= new_max_cache_size);
+    HDassert(cache_ptr->resize_ctl.min_size <= new_max_cache_size);
+    HDassert(new_max_cache_size <= cache_ptr->resize_ctl.max_size);
 
-            entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+    if(new_max_cache_size < cache_ptr->max_cache_size)
+        cache_ptr->size_decreased = TRUE;
 
-        } else {
+    cache_ptr->max_cache_size = new_max_cache_size;
+    cache_ptr->min_clean_size = new_min_clean_size;
 
-            entry_ptr = NULL;
-        }
+    if(H5C_reset_cache_hit_rate_stats(cache_ptr) < 0)
+        /* this should be impossible... */
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_reset_cache_hit_rate_stats failed")
 
-        i++;
+    /* remove excess epoch markers if any */
+    if((config_ptr->decr_mode == H5C_decr__age_out_with_threshold) ||
+            (config_ptr->decr_mode == H5C_decr__age_out)) {
+        if(cache_ptr->epoch_markers_active > cache_ptr->resize_ctl.epochs_before_eviction)
+            if(H5C__autoadjust__ageout__remove_excess_markers(cache_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't remove excess epoch markers")
+    } /* end if */
+    else 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")
     }
 
-    HDfprintf(stdout, "\n\n");
+    /* configure flash size increase facility.  We wait until the
+     * end of the function, as we need the max_cache_size set before
+     * we start to keep things simple.
+     *
+     * If we haven't already ruled out flash cache size increases above,
+     * go ahead and configure it.
+     */
 
-    /* Finally, discard the skip list */
+    if(cache_ptr->flash_size_increase_possible) {
+        switch(config_ptr->flash_incr_mode) {
+            case H5C_flash_incr__off:
+                cache_ptr->flash_size_increase_possible = FALSE;
+                break;
 
-    HDassert( H5SL_count(slist_ptr) == 0 );
+            case H5C_flash_incr__add_space:
+                cache_ptr->flash_size_increase_possible = TRUE;
+                cache_ptr->flash_size_increase_threshold = (size_t)(((double)(cache_ptr->max_cache_size)) *
+                     ((cache_ptr->resize_ctl).flash_threshold));
+                break;
 
-    H5SL_close(slist_ptr);
+            default: /* should be unreachable */
+                 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown flash_incr_mode?!?!?")
+                 break;
+        } /* end switch */
+    } /* end if */
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_dump_cache() */
+} /* H5C_set_cache_auto_resize_config() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_dump_cache_skip_list
+ * Function:    H5C_set_evictions_enabled()
  *
- * 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.
+ * Purpose:     Set cache_ptr->evictions_enabled to the value of the
+ *              evictions enabled parameter.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      SUCCEED on success, and FAIL on failure.
  *
  * Programmer:  John Mainzer
- *              11/15/14
+ *              7/27/07
  *
  *-------------------------------------------------------------------------
  */
-#if 0 /* debugging routine */
 herr_t
-H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn)
+H5C_set_evictions_enabled(H5C_t *cache_ptr, hbool_t evictions_enabled)
 {
-    herr_t              ret_value = SUCCEED;   /* Return value */
-    int                 i;
-    H5C_cache_entry_t * entry_ptr = NULL;
-    H5SL_node_t *       node_ptr = NULL;
+    herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert(cache_ptr != NULL);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
-    HDassert(calling_fcn != NULL);
-
-    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));
-
-    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.
-         */
-
-        HDfprintf(stdout,
-                  "Num:    Addr:               Len: Prot/Pind: Dirty: Type:\n");
-
-        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;
-            }
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry")
 
-            i++;
-        }
-    }
+    /* There is no fundamental reason why we should not permit
+     * evictions to be disabled while automatic resize is enabled.
+     * However, I can't think of any good reason why one would
+     * want to, and allowing it would greatly complicate testing
+     * the feature.  Hence the following:
+     */
+    if((evictions_enabled != TRUE) &&
+         ((cache_ptr->resize_ctl.incr_mode != H5C_incr__off) ||
+	   (cache_ptr->resize_ctl.decr_mode != H5C_decr__off)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't disable evictions when auto resize enabled")
 
-    HDfprintf(stdout, "\n\n");
+    cache_ptr->evictions_enabled = evictions_enabled;
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_dump_cache_skip_list() */
-#endif /* debugging routine */
+} /* H5C_set_evictions_enabled() */
 
 

 /*-------------------------------------------------------------------------
@@ -4935,13 +3189,10 @@ H5C_unpin_entry(void *_entry_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");
-    }
+    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")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
 
@@ -4950,19 +3201,14 @@ H5C_unpin_entry(void *_entry_ptr)
         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");
-    }
+    if((H5C_validate_protected_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_pinned_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_lru_list(cache_ptr) < 0))
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_unpin_entry() */
 
 

@@ -5049,13 +3295,10 @@ H5C_unprotect(H5F_t *		  f,
     was_clean = ! ( entry_ptr->is_dirty );
 
 #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");
-    }
+    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")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     /* if the entry has multiple read only protects, just decrement
@@ -5083,7 +3326,6 @@ H5C_unprotect(H5F_t *		  f,
             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 */
@@ -5128,43 +3370,47 @@ H5C_unprotect(H5F_t *		  f,
         /* Mark the entry as dirty if appropriate */
         entry_ptr->is_dirty = (entry_ptr->is_dirty || dirtied);
 
-        /* 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 */
+	if(dirtied)
+	    if(entry_ptr->image_up_to_date) {
+	        entry_ptr->image_up_to_date = FALSE;
+	        if(entry_ptr->flush_dep_nparents > 0)
+		    if(H5C__mark_flush_dep_unserialized(entry_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
+            } /* end if */
 
-        /* Update index for newly dirtied entry */
+        /* Check for newly dirtied entry */
         if(was_clean && entry_ptr->is_dirty) {
+            /* Update index for newly dirtied entry */
+            H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
+
+            /* If the entry's type has a 'notify' callback send a 'entry dirtied'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_DIRTIED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag set")
 
             /* 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 ) ) {
-
-                if ( H5C__mark_flush_dep_dirty(entry_ptr) < 0 )
+            if(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")
-            }
-
-            H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
-        } else if ( ! ( was_clean ) && ! ( entry_ptr->is_dirty ) ) {
+        } /* end if */ 
+        /* Check for newly clean entry */
+        else if(!was_clean && !entry_ptr->is_dirty) {
+            /* If the entry's type has a 'notify' callback send a 'entry cleaned'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_CLEANED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag cleared")
 
             /* 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 ) ) {
-
-                if ( H5C__mark_flush_dep_clean(entry_ptr) < 0 )
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL,  "Can't propagate flush dep dirty flag")
-            }
-        }
+            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 dirty flag")
+        } /* end else-if */
 
         /* Pin or unpin the entry as requested. */
         if(pin_entry) {
@@ -5202,19 +3448,16 @@ H5C_unprotect(H5F_t *		  f,
          * makes good use of existing code.
          *                                             JRM - 5/19/04
          */
-        if ( deleted ) {
+        if(deleted) {
             unsigned    flush_flags = (H5C__FLUSH_CLEAR_ONLY_FLAG |
                                          H5C__FLUSH_INVALIDATE_FLAG);
 
-	    /* we can't delete a pinned entry */
-	    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?!?.")
+                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?!?.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "hash table contains multiple entries for addr?!?")
 
             /* Set the 'free file space' flag for the flush, if needed */
             if(free_file_space)
@@ -5227,58 +3470,181 @@ H5C_unprotect(H5F_t *		  f,
             /* 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, NULL) < 0)
+            HDassert(((!was_clean) || dirtied) == entry_ptr->in_slist);
+            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flush_flags) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush entry")
-
-#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 */
-        }
+        } /* end if */
 #ifdef H5_HAVE_PARALLEL
-        else if ( clear_entry ) {
+        else if(clear_entry) {
 
             /* 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?!?.")
+                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?!?.")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "hash table contains multiple entries for addr?!?")
 
-            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, NULL) < 0)
+            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear entry")
-        }
+        } /* end else if */
 #endif /* H5_HAVE_PARALLEL */
     }
 
     H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
 
 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");
-    }
+    if((H5C_validate_protected_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_pinned_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_lru_list(cache_ptr) < 0)) {
+        HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on exit")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_unprotect() */
 
 

 /*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_unsettle_entry_ring
+ *
+ * Purpose:     Advise the metadata cache that the specified entry's free space
+ *              manager ring is no longer settled (if it was on entry).
+ *
+ *              If the target free space manager ring is already
+ *              unsettled, do nothing, and return SUCCEED.
+ *
+ *              If the target free space manager ring is settled, and
+ *              we are not in the process of a file shutdown, mark
+ *              the ring as unsettled, and return SUCCEED.
+ *
+ *              If the target free space manager is settled, and we
+ *              are in the process of a file shutdown, post an error
+ *              message, and return FAIL.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              January 3, 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unsettle_entry_ring(void *_entry)
+{
+    H5C_cache_entry_t *entry = (H5C_cache_entry_t *)_entry;     /* Entry whose ring to unsettle */
+    H5C_t *cache;               /* Cache for file */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry);
+    HDassert(entry->ring != H5C_RING_UNDEFINED);
+    HDassert((H5C_RING_USER == entry->ring) || (H5C_RING_RDFSM == entry->ring) || (H5C_RING_MDFSM == entry->ring));
+    cache = entry->cache_ptr;
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    switch(entry->ring) {
+	case H5C_RING_USER:
+            /* Do nothing */
+	    break;
+
+	case H5C_RING_RDFSM:
+	    if(cache->rdfsm_settled) {
+		if(cache->flush_in_progress || cache->close_warning_received)
+		    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unexpected rdfsm ring unsettle")
+		cache->rdfsm_settled = FALSE;
+	    } /* end if */
+	    break;
+
+	case H5C_RING_MDFSM:
+	    if(cache->mdfsm_settled) {
+		if(cache->flush_in_progress || cache->close_warning_received)
+		    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unexpected mdfsm ring unsettle")
+		cache->mdfsm_settled = FALSE;
+	    } /* end if */
+	    break;
+
+	default:
+	    HDassert(FALSE); /* this should be un-reachable */
+	    break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_unsettle_entry_ring() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_unsettle_ring()
+ *
+ * Purpose:     Advise the metadata cache that the specified free space
+ *              manager ring is no longer settled (if it was on entry).
+ *
+ *              If the target free space manager ring is already
+ *              unsettled, do nothing, and return SUCCEED.
+ *
+ *              If the target free space manager ring is settled, and
+ *              we are not in the process of a file shutdown, mark
+ *              the ring as unsettled, and return SUCCEED.
+ *
+ *              If the target free space manager is settled, and we
+ *              are in the process of a file shutdown, post an error
+ *              message, and return FAIL.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/15/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unsettle_ring(H5F_t * f, H5C_ring_t ring)
+{
+    H5C_t *             cache_ptr;
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert((H5C_RING_RDFSM == ring) || (H5C_RING_MDFSM == ring));
+    cache_ptr = f->shared->cache;
+    HDassert(H5C__H5C_T_MAGIC == cache_ptr->magic);
+
+    switch(ring) {
+        case H5C_RING_RDFSM:
+            if(cache_ptr->rdfsm_settled) {
+                if(cache_ptr->close_warning_received)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unexpected rdfsm ring unsettle")
+                cache_ptr->rdfsm_settled = FALSE;
+            } /* end if */
+            break;
+
+        case H5C_RING_MDFSM:
+            if(cache_ptr->mdfsm_settled) {
+                if(cache_ptr->close_warning_received)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unexpected mdfsm ring unsettle")
+                cache_ptr->mdfsm_settled = FALSE;
+            } /* end if */
+            break;
+
+	default:
+	    HDassert(FALSE); /* this should be un-reachable */
+	    break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_unsettle_ring() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5C_validate_resize_config()
  *
  * Purpose:	Run a sanity check on the specified sections of the
@@ -5302,18 +3668,13 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( config_ptr == NULL ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.")
-    }
-
-    if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.")
-    }
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry")
 
+    if(config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version")
 
-    if ( (tests & H5C_RESIZE_CFG__VALIDATE_GENERAL) != 0 ) {
+    if((tests & H5C_RESIZE_CFG__VALIDATE_GENERAL) != 0) {
 
         if(config_ptr->max_size > H5C__MAX_MAX_CACHE_SIZE)
             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "max_size too big")
@@ -5324,43 +3685,29 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
         if(config_ptr->min_size > config_ptr->max_size)
             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size > max_size")
 
-        if ( ( config_ptr->set_initial_size ) &&
-             ( ( config_ptr->initial_size < config_ptr->min_size ) ||
-               ( config_ptr->initial_size > config_ptr->max_size ) ) ) {
-
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                  "initial_size must be in the interval [min_size, max_size]");
-        }
-
-        if ( ( config_ptr->min_clean_fraction < (double)0.0f ) ||
-             ( config_ptr->min_clean_fraction > (double)1.0f ) ) {
-
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                  "min_clean_fraction must be in the interval [0.0, 1.0]");
-        }
-
-        if ( config_ptr->epoch_length < H5C__MIN_AR_EPOCH_LENGTH ) {
+        if(config_ptr->set_initial_size &&
+                ((config_ptr->initial_size < config_ptr->min_size) ||
+                    (config_ptr->initial_size > config_ptr->max_size)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "initial_size must be in the interval [min_size, max_size]")
 
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too small");
-        }
+        if((config_ptr->min_clean_fraction < (double)0.0f) ||
+                (config_ptr->min_clean_fraction > (double)1.0f))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_clean_fraction must be in the interval [0.0, 1.0]")
 
-        if ( config_ptr->epoch_length > H5C__MAX_AR_EPOCH_LENGTH ) {
+        if(config_ptr->epoch_length < H5C__MIN_AR_EPOCH_LENGTH)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too small")
 
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too big");
-        }
+        if(config_ptr->epoch_length > H5C__MAX_AR_EPOCH_LENGTH)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too big")
     } /* H5C_RESIZE_CFG__VALIDATE_GENERAL */
 
 
-    if ( (tests & H5C_RESIZE_CFG__VALIDATE_INCREMENT) != 0 ) {
-
-        if ( ( config_ptr->incr_mode != H5C_incr__off ) &&
-             ( config_ptr->incr_mode != H5C_incr__threshold ) ) {
-
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid incr_mode");
-        }
-
-        if ( config_ptr->incr_mode == H5C_incr__threshold ) {
+    if((tests & H5C_RESIZE_CFG__VALIDATE_INCREMENT) != 0) {
+        if((config_ptr->incr_mode != H5C_incr__off) &&
+                (config_ptr->incr_mode != H5C_incr__threshold))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid incr_mode")
 
+        if(config_ptr->incr_mode == H5C_incr__threshold) {
             if((config_ptr->lower_hr_threshold < (double)0.0f) ||
                     (config_ptr->lower_hr_threshold > (double)1.0f))
                 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "lower_hr_threshold must be in the range [0.0, 1.0]")
@@ -5373,33 +3720,24 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
              */
         } /* H5C_incr__threshold */
 
-        switch ( config_ptr->flash_incr_mode )
-        {
+        switch(config_ptr->flash_incr_mode) {
             case H5C_flash_incr__off:
                 /* nothing to do here */
                 break;
 
             case H5C_flash_incr__add_space:
-                if ( ( config_ptr->flash_multiple < (double)0.1f ) ||
-                     ( config_ptr->flash_multiple > (double)10.0f ) ) {
-
-                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                        "flash_multiple must be in the range [0.1, 10.0]");
-                }
-
-                if ( ( config_ptr->flash_threshold < (double)0.1f ) ||
-                     ( config_ptr->flash_threshold > (double)1.0f ) ) {
-
-                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                           "flash_threshold must be in the range [0.1, 1.0]");
-                }
+                if((config_ptr->flash_multiple < (double)0.1f) ||
+                        (config_ptr->flash_multiple > (double)10.0f))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "flash_multiple must be in the range [0.1, 10.0]")
+                if((config_ptr->flash_threshold < (double)0.1f) ||
+                        (config_ptr->flash_threshold > (double)1.0f))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "flash_threshold must be in the range [0.1, 1.0]")
                 break;
 
             default:
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                            "Invalid flash_incr_mode");
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid flash_incr_mode")
                 break;
-        }
+        } /* end switch */
     } /* H5C_RESIZE_CFG__VALIDATE_INCREMENT */
 
 
@@ -5411,39 +3749,27 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
              ( config_ptr->decr_mode != H5C_decr__age_out_with_threshold )
            ) {
 
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid decr_mode");
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid decr_mode")
         }
 
         if ( config_ptr->decr_mode == H5C_decr__threshold ) {
+            if(config_ptr->upper_hr_threshold > (double)1.0f)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "upper_hr_threshold must be <= 1.0")
 
-            if ( config_ptr->upper_hr_threshold > (double)1.0f ) {
-
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                            "upper_hr_threshold must be <= 1.0");
-            }
-
-            if ( ( config_ptr->decrement > (double)1.0f ) ||
-                 ( config_ptr->decrement < (double)0.0f ) ) {
-
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                            "decrement must be in the interval [0.0, 1.0]");
-            }
+            if((config_ptr->decrement > (double)1.0f) ||
+                    (config_ptr->decrement < (double)0.0f))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "decrement must be in the interval [0.0, 1.0]")
 
             /* no need to check max_decrement as it is a size_t
              * and thus must be non-negative.
              */
         } /* H5C_decr__threshold */
 
-        if ( ( config_ptr->decr_mode == H5C_decr__age_out ) ||
-             ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold )
-           ) {
-
-            if ( config_ptr->epochs_before_eviction < 1 ) {
-
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                            "epochs_before_eviction must be positive");
-            }
+        if((config_ptr->decr_mode == H5C_decr__age_out) ||
+                (config_ptr->decr_mode == H5C_decr__age_out_with_threshold)) {
 
+            if(config_ptr->epochs_before_eviction < 1)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epochs_before_eviction must be positive")
             if(config_ptr->epochs_before_eviction > H5C__MAX_EPOCH_MARKERS)
                 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epochs_before_eviction too big")
 
@@ -5457,43 +3783,24 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
              */
         } /* H5C_decr__age_out || H5C_decr__age_out_with_threshold */
 
-        if ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) {
-
-            if ( ( config_ptr->upper_hr_threshold > (double)1.0f ) ||
-                 ( config_ptr->upper_hr_threshold < (double)0.0f ) ) {
-
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                       "upper_hr_threshold must be in the interval [0.0, 1.0]");
-            }
+        if(config_ptr->decr_mode == H5C_decr__age_out_with_threshold) {
+            if((config_ptr->upper_hr_threshold > (double)1.0f) ||
+                    (config_ptr->upper_hr_threshold < (double)0.0f))
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "upper_hr_threshold must be in the interval [0.0, 1.0]")
         } /* H5C_decr__age_out_with_threshold */
-
     } /* H5C_RESIZE_CFG__VALIDATE_DECREMENT */
 
 
     if ( (tests & H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) != 0 ) {
-
-        if ( ( config_ptr->incr_mode == H5C_incr__threshold )
-             &&
-             ( ( config_ptr->decr_mode == H5C_decr__threshold )
-               ||
-               ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold )
-             )
-             &&
-             ( config_ptr->lower_hr_threshold
-               >=
-               config_ptr->upper_hr_threshold
-             )
-           ) {
-
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                        "conflicting threshold fields in config.")
-        }
+        if((config_ptr->incr_mode == H5C_incr__threshold)
+                && ((config_ptr->decr_mode == H5C_decr__threshold) ||
+                       (config_ptr->decr_mode == H5C_decr__age_out_with_threshold))
+                && (config_ptr->lower_hr_threshold >= config_ptr->upper_hr_threshold))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "conflicting threshold fields in config")
     } /* H5C_RESIZE_CFG__VALIDATE_INTERACTIONS */
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_validate_resize_config() */
 
 

@@ -5543,10 +3850,10 @@ H5C_create_flush_dependency(void * parent_thing, void * child_thing)
 #ifndef NDEBUG
     /* Make sure the parent is not already a parent */
     {
-        unsigned i;
+        unsigned u;
 
-        for(i=0; i<child_entry->flush_dep_nparents; i++)
-            HDassert(child_entry->flush_dep_parent[i] != parent_entry);
+        for(u = 0; u < child_entry->flush_dep_nparents; u++)
+            HDassert(child_entry->flush_dep_parent[u] != parent_entry);
     } /* end block */
 #endif /* NDEBUG */
 
@@ -5589,6 +3896,7 @@ H5C_create_flush_dependency(void * parent_thing, void * child_thing)
                 HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent list")
             child_entry->flush_dep_parent_nalloc *= 2;
         } /* end else */
+        cache_ptr->entry_fd_height_change_counter++;
     } /* end if */
 
     /* Add the dependency to the child's parent array */
@@ -5599,17 +3907,30 @@ H5C_create_flush_dependency(void * parent_thing, void * child_thing)
     parent_entry->flush_dep_nchildren++;
 
     /* Adjust the number of dirty children */
-    if(child_entry->is_dirty || child_entry->flush_dep_ndirty_children > 0) {
+    if(child_entry->is_dirty) {
         /* 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")
+        /* If the parent has a 'notify' callback, send a 'child entry dirtied' notice */
+        if(parent_entry->type->notify &&
+                (parent_entry->type->notify)(H5C_NOTIFY_ACTION_CHILD_DIRTIED, parent_entry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry dirty flag set")
+    } /* end if */
+
+    /* adjust the parent's number of unserialized children.  Note
+     * that it is possible for and entry to be clean and unserialized.
+     */
+    if(!child_entry->image_up_to_date) {
+        HDassert(parent_entry->flush_dep_nunser_children < parent_entry->flush_dep_nchildren);
+
+        parent_entry->flush_dep_nunser_children++;
+
+        /* If the parent has a 'notify' callback, send a 'child entry unserialized' notice */
+        if(parent_entry->type->notify &&
+                (parent_entry->type->notify)(H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED, parent_entry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry serialized flag reset")
     } /* end if */
 
     /* Post-conditions, for successful operation */
@@ -5646,7 +3967,7 @@ 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 */
+    unsigned            u;                      /* Local index variable */
     herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -5674,18 +3995,17 @@ H5C_destroy_flush_dependency(void *parent_thing, void * child_thing)
     /* 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)
+    for(u = 0; u < child_entry->flush_dep_nparents; u++)
+        if(child_entry->flush_dep_parent[u] == parent_entry)
             break;
-    if(i == child_entry->flush_dep_nparents)
+    if(u == 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]));
+    if(u < (child_entry->flush_dep_nparents - 1))
+        HDmemmove(&child_entry->flush_dep_parent[u],
+                &child_entry->flush_dep_parent[u + 1],
+                (child_entry->flush_dep_nparents - u - 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 */
@@ -5712,17 +4032,28 @@ H5C_destroy_flush_dependency(void *parent_thing, void * child_thing)
     } /* end if */
 
     /* Adjust parent entry's ndirty_children */
-    if(child_entry->is_dirty || child_entry->flush_dep_ndirty_children > 0) {
+    if(child_entry->is_dirty) {
         /* 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")
+        /* If the parent has a 'notify' callback, send a 'child entry cleaned' notice */
+        if(parent_entry->type->notify &&
+                (parent_entry->type->notify)(H5C_NOTIFY_ACTION_CHILD_CLEANED, parent_entry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry dirty flag reset")
+    } /* end if */
+
+    /* adjust parent entry's number of unserialized children */
+    if(!child_entry->image_up_to_date) {
+        HDassert(parent_entry->flush_dep_nunser_children > 0);
+
+        parent_entry->flush_dep_nunser_children--;
+
+        /* If the parent has a 'notify' callback, send a 'child entry serialized' notice */
+        if(parent_entry->type->notify &&
+                (parent_entry->type->notify)(H5C_NOTIFY_ACTION_CHILD_SERIALIZED, parent_entry) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry serialized flag set")
     } /* end if */
 
     /* Shrink or free the parent array if apporpriate */
@@ -5773,7 +4104,7 @@ H5C__auto_adjust_cache_size(H5F_t * f,
                             hbool_t write_permitted)
 {
     H5C_t *			cache_ptr = f->shared->cache;
-    herr_t			result;
+    hbool_t			reentrant_call = FALSE;
     hbool_t			inserted_epoch_marker = FALSE;
     size_t			new_max_cache_size = 0;
     size_t			old_max_cache_size = 0;
@@ -5793,29 +4124,33 @@ H5C__auto_adjust_cache_size(H5F_t * f,
     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 ) {
+    /* check to see if cache_ptr->resize_in_progress is TRUE.  If it, this
+     * is a re-entrant call via a client callback called in the resize 
+     * process.  To avoid an infinite recursion, set reentrant_call to 
+     * TRUE, and goto done.
+     */
+    if(cache_ptr->resize_in_progress) {
+        reentrant_call = TRUE;
+        HGOTO_DONE(SUCCEED)
+    } /* end if */
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.")
-    }
+    cache_ptr->resize_in_progress = TRUE;
 
-    HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C_incr__off ) || \
-              ( (cache_ptr->resize_ctl).decr_mode != H5C_decr__off ) );
+    if(!cache_ptr->resize_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled")
 
-    if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+    HDassert(((cache_ptr->resize_ctl).incr_mode != H5C_incr__off) || \
+              ((cache_ptr->resize_ctl).decr_mode != H5C_decr__off));
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
-    }
+    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 )
-    {
+    switch((cache_ptr->resize_ctl).incr_mode) {
         case H5C_incr__off:
-            if ( cache_ptr->size_increase_possible ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                           "size_increase_possible but H5C_incr__off?!?!?")
-            }
+            if(cache_ptr->size_increase_possible)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "size_increase_possible but H5C_incr__off?!?!?")
             break;
 
         case H5C_incr__threshold:
@@ -5865,7 +4200,7 @@ H5C__auto_adjust_cache_size(H5F_t * f,
             break;
 
         default:
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.")
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode")
     }
 
     /* If the decr_mode is either age out or age out with threshold, we
@@ -5892,17 +4227,10 @@ H5C__auto_adjust_cache_size(H5F_t * f,
          )
        ) {
 
-        result = H5C__autoadjust__ageout__insert_new_marker(cache_ptr);
-
-        if ( result != SUCCEED ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "can't insert new epoch marker.")
+        if(H5C__autoadjust__ageout__insert_new_marker(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't insert new epoch marker")
 
-        } else {
-
-            inserted_epoch_marker = TRUE;
-        }
+        inserted_epoch_marker = TRUE;
     }
 
     /* don't run the cache size decrease code unless the cache size
@@ -5962,32 +4290,18 @@ H5C__auto_adjust_cache_size(H5F_t * f,
 
             case H5C_decr__age_out_with_threshold:
             case H5C_decr__age_out:
-                if ( ! inserted_epoch_marker ) {
-
-                    if ( ! cache_ptr->size_decrease_possible ) {
-
+                if(!inserted_epoch_marker) {
+                    if(!cache_ptr->size_decrease_possible)
                         status = decrease_disabled;
-
-                    } else {
-
-                        result = H5C__autoadjust__ageout(f,
-                                                         dxpl_id,
-                                                         hit_rate,
-                                                         &status,
-                                                         &new_max_cache_size,
-                                                         write_permitted);
-
-                        if ( result != SUCCEED ) {
-
-                            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                        "ageout code failed.")
-                        }
-                    }
-                }
+                    else {
+                        if(H5C__autoadjust__ageout(f, dxpl_id, hit_rate, &status, &new_max_cache_size, write_permitted) < 0)
+                            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ageout code failed")
+                    } /* end else */
+                } /* end if */
                 break;
 
             default:
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode")
         }
     }
 
@@ -6003,13 +4317,8 @@ H5C__auto_adjust_cache_size(H5F_t * f,
        ) {
 
         /* move last epoch marker to the head of the LRU list */
-        result = H5C__autoadjust__ageout__cycle_epoch_marker(cache_ptr);
-
-        if ( result != SUCCEED ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "error cycling epoch marker.")
-        }
+        if(H5C__autoadjust__ageout__cycle_epoch_marker(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error cycling epoch marker")
     }
 
     if ( ( status == increase ) || ( status == decrease ) ) {
@@ -6050,9 +4359,7 @@ H5C__auto_adjust_cache_size(H5F_t * f,
             switch ( (cache_ptr->resize_ctl).flash_incr_mode )
             {
                 case H5C_flash_incr__off:
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                     "flash_size_increase_possible but H5C_flash_incr__off?!")
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "flash_size_increase_possible but H5C_flash_incr__off?!")
                     break;
 
                 case H5C_flash_incr__add_space:
@@ -6063,15 +4370,13 @@ H5C__auto_adjust_cache_size(H5F_t * f,
                      break;
 
                 default: /* should be unreachable */
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                "Unknown flash_incr_mode?!?!?.")
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown flash_incr_mode?!?!?")
                     break;
             }
         }
     }
 
     if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
-
         (*((cache_ptr->resize_ctl).rpt_fcn))
             (cache_ptr,
              H5C__CURR_AUTO_RESIZE_RPT_FCN_VER,
@@ -6083,17 +4388,18 @@ H5C__auto_adjust_cache_size(H5F_t * f,
              new_min_clean_size);
     }
 
-    if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
-
+    if(H5C_reset_cache_hit_rate_stats(cache_ptr) < 0)
         /* this should be impossible... */
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_reset_cache_hit_rate_stats failed.")
-    }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_reset_cache_hit_rate_stats failed")
 
 done:
+    /* Sanity checks */
+    HDassert(cache_ptr->resize_in_progress);
+    if(!reentrant_call)
+        cache_ptr->resize_in_progress = FALSE;
+    HDassert((!reentrant_call) || (cache_ptr->resize_in_progress));
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C__auto_adjust_cache_size() */
 
 

@@ -6125,7 +4431,6 @@ H5C__autoadjust__ageout(H5F_t * f,
                         hbool_t write_permitted)
 {
     H5C_t *     cache_ptr = f->shared->cache;
-    herr_t	result;
     size_t	test_size;
     herr_t	ret_value = SUCCEED;      /* Return value */
 
@@ -6138,17 +4443,9 @@ H5C__autoadjust__ageout(H5F_t * f,
     HDassert( ( new_max_cache_size_ptr ) && ( *new_max_cache_size_ptr == 0 ) );
 
     /* remove excess epoch markers if any */
-    if ( cache_ptr->epoch_markers_active >
-         (cache_ptr->resize_ctl).epochs_before_eviction ) {
-
-        result = H5C__autoadjust__ageout__remove_excess_markers(cache_ptr);
-
-        if ( result != SUCCEED ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "can't remove excess epoch markers.")
-        }
-    }
+    if(cache_ptr->epoch_markers_active > (cache_ptr->resize_ctl).epochs_before_eviction)
+        if(H5C__autoadjust__ageout__remove_excess_markers(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't remove excess epoch markers")
 
     if ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out )
          ||
@@ -6164,7 +4461,7 @@ H5C__autoadjust__ageout(H5F_t * f,
 
             /* evict aged out cache entries if appropriate... */
             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.")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error flushing aged out entries")
 
             /* ... and then reduce cache size if appropriate */
             if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
@@ -6246,11 +4543,8 @@ H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr)
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
 
-    if ( cache_ptr->epoch_markers_active <= 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "No active epoch markers on entry?!?!?.")
-    }
+    if(cache_ptr->epoch_markers_active <= 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "No active epoch markers on entry?!?!?")
 
     /* remove the last marker from both the ring buffer and the LRU list */
 
@@ -6262,15 +4556,10 @@ H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr)
 
     cache_ptr->epoch_marker_ringbuf_size -= 1;
 
-    if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
-    }
-
-    if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
-
+    if(cache_ptr->epoch_marker_ringbuf_size < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow")
+    if((cache_ptr->epoch_marker_active)[i] != TRUE)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
-    }
 
     H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
                     (cache_ptr)->LRU_head_ptr, \
@@ -6283,9 +4572,9 @@ H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr)
      * the ring buffer.
      */
 
-    HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
-    HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
-    HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL );
+    HDassert(((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i);
+    HDassert(((cache_ptr->epoch_markers)[i]).next == NULL);
+    HDassert(((cache_ptr->epoch_markers)[i]).prev == NULL);
 
     cache_ptr->epoch_marker_ringbuf_last =
         (cache_ptr->epoch_marker_ringbuf_last + 1) %
@@ -6295,10 +4584,8 @@ H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr)
 
     cache_ptr->epoch_marker_ringbuf_size += 1;
 
-    if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.")
-    }
+    if(cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow")
 
     H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \
                      (cache_ptr)->LRU_head_ptr, \
@@ -6360,19 +4647,6 @@ 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
@@ -6417,10 +4691,10 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
         entry_ptr = cache_ptr->LRU_tail_ptr;
 
         while ( ( entry_ptr != NULL ) &&
-                ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
+                ( (entry_ptr->type)->id != H5AC_EPOCH_MARKER_ID ) &&
                 ( bytes_evicted < eviction_size_limit ) )
         {
-	    hbool_t		corked = FALSE;
+            hbool_t skipping_entry = FALSE;
 
             HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
             HDassert( ! (entry_ptr->is_protected) );
@@ -6430,76 +4704,68 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
 	    next_ptr = entry_ptr->next;
             prev_ptr = entry_ptr->prev;
 
-	    if ( prev_ptr != NULL ) {
-
+	    if(prev_ptr != NULL)
                 prev_is_dirty = prev_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;
-
-                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, NULL, NULL) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
+            if(entry_ptr->is_dirty ) {
+                HDassert(!entry_ptr->prefetched_dirty);
 
-                if ( ( cache_ptr->entries_removed_counter > 1 ) ||
-                     ( cache_ptr->last_entry_removed_ptr == prev_ptr ) )
+                /* dirty corked entry is skipped */
+                if(entry_ptr->tag_info && entry_ptr->tag_info->corked)
+                    skipping_entry = TRUE;
+                else {
+                    /* 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;
 
-                    restart_scan = TRUE;
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
 
-            } else {
+                    if(cache_ptr->entries_removed_counter > 1 || cache_ptr->last_entry_removed_ptr == prev_ptr)
+                        restart_scan = TRUE;
+                } /* end else */
+            } /* end if */
+            else if(!entry_ptr->prefetched_dirty) {
 
                 bytes_evicted += entry_ptr->size;
 
-                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, NULL) < 0 )
+                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 0 )
                     HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
-            }
+            } /* end else-if */
+            else {
+                HDassert(!entry_ptr->is_dirty);
+                HDassert(entry_ptr->prefetched_dirty);
 
-            if ( prev_ptr != NULL ) {
+                skipping_entry = TRUE;
+            } /* end else */
 
-		if(corked)   /* dirty corked entry is skipped */
+            if(prev_ptr != NULL) {
+                if(skipping_entry)
                     entry_ptr = prev_ptr;
-
-		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
+		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 {
-
+                } /* end else-if */
+                else
                     entry_ptr = prev_ptr;
-
-                }
-	    } else {
-
+	    } /* end if */
+            else
 		entry_ptr = NULL;
-
-	    }
         } /* end while */
 
         /* for now at least, don't bother to maintain the minimum clean size,
@@ -6517,9 +4783,9 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
          * entry).
          */
 
-    } else /* ! write_permitted */  {
-
-        /* since we are not allowed to write, all we can do is evict
+    } /* end if */
+    else /* ! write_permitted */  {
+        /* Since we are not allowed to write, all we can do is evict
          * any clean entries that we may encounter before we either
          * hit the eviction size limit, or encounter the epoch marker.
          *
@@ -6532,23 +4798,19 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
          * performance implications, but it shouldn't cause any net
          * slowdown.
          */
-
-        HDassert( H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS );
-
+        HDassert(H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS);
         entry_ptr = cache_ptr->LRU_tail_ptr;
-
-        while ( ( entry_ptr != NULL ) &&
-                ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
-                ( bytes_evicted < eviction_size_limit ) )
-        {
-            HDassert( ! (entry_ptr->is_protected) );
+        while(entry_ptr != NULL &&
+                ((entry_ptr->type)->id != H5AC_EPOCH_MARKER_ID) &&
+                (bytes_evicted < eviction_size_limit)) {
+            HDassert(!(entry_ptr->is_protected));
 
             prev_ptr = entry_ptr->prev;
 
-            if ( ! (entry_ptr->is_dirty) ) {
-                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, NULL) < 0)
+            if(!(entry_ptr->is_dirty) && !(entry_ptr->prefetched_dirty))
+                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 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.
 	     *
@@ -6556,21 +4818,15 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
 	     * and thus we needn't test to see if the LRU has been changed
 	     * out from under us.
              */
-
             entry_ptr = prev_ptr;
-
         } /* end while */
-    }
-
-    if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+    } /* end else */
 
+    if(cache_ptr->index_size < cache_ptr->max_cache_size)
         cache_ptr->cache_full = FALSE;
-    }
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C__autoadjust__ageout__evict_aged_out_entries() */
 
 

@@ -6599,23 +4855,16 @@ H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr)
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
 
-    if ( cache_ptr->epoch_markers_active >=
-         (cache_ptr->resize_ctl).epochs_before_eviction ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "Already have a full complement of markers.")
-    }
+    if(cache_ptr->epoch_markers_active >= (cache_ptr->resize_ctl).epochs_before_eviction)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Already have a full complement of markers")
 
     /* find an unused marker */
     i = 0;
-    while ( ( (cache_ptr->epoch_marker_active)[i] ) &&
-            ( i < H5C__MAX_EPOCH_MARKERS ) )
-    {
+    while((cache_ptr->epoch_marker_active)[i] && i < H5C__MAX_EPOCH_MARKERS)
         i++;
-    }
 
     if(i >= H5C__MAX_EPOCH_MARKERS)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't find unused marker.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't find unused marker")
 
     HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i );
     HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL );
@@ -6633,7 +4882,7 @@ H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr)
 
     if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) {
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow")
     }
 
     H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \
@@ -6692,15 +4941,11 @@ H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr)
 
         cache_ptr->epoch_marker_ringbuf_size -= 1;
 
-        if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
-        }
-
-        if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
+        if(cache_ptr->epoch_marker_ringbuf_size < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow")
 
+        if((cache_ptr->epoch_marker_active)[i] != TRUE)
             HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
-        }
 
         /* remove the epoch marker from the LRU list */
         H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
@@ -6758,15 +5003,10 @@ H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr)
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
 
-    if ( cache_ptr->epoch_markers_active <=
-         (cache_ptr->resize_ctl).epochs_before_eviction ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "no excess markers on entry.")
-    }
+    if(cache_ptr->epoch_markers_active <= (cache_ptr->resize_ctl).epochs_before_eviction)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "no excess markers on entry")
 
-    while ( cache_ptr->epoch_markers_active >
-            (cache_ptr->resize_ctl).epochs_before_eviction )
-    {
+    while(cache_ptr->epoch_markers_active > (cache_ptr->resize_ctl).epochs_before_eviction) {
         /* get the index of the last epoch marker in the LRU list
          * and remove it from the ring buffer.
          */
@@ -6780,15 +5020,10 @@ H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr)
 
         cache_ptr->epoch_marker_ringbuf_size -= 1;
 
-        if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.")
-        }
-
-        if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) {
-
+        if(cache_ptr->epoch_marker_ringbuf_size < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow")
+        if((cache_ptr->epoch_marker_active)[i] != TRUE)
             HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?")
-        }
 
         /* remove the epoch marker from the LRU list */
         H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \
@@ -6857,11 +5092,8 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
     HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold );
     HDassert( old_entry_size < new_entry_size );
 
-    if ( old_entry_size >= new_entry_size ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "old_entry_size >= new_entry_size")
-    }
+    if(old_entry_size >= new_entry_size)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "old_entry_size >= new_entry_size")
 
     space_needed = new_entry_size - old_entry_size;
 
@@ -6874,8 +5106,7 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
         switch ( (cache_ptr->resize_ctl).flash_incr_mode )
         {
             case H5C_flash_incr__off:
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                   "flash_size_increase_possible but H5C_flash_incr__off?!")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "flash_size_increase_possible but H5C_flash_incr__off?!")
                 break;
 
             case H5C_flash_incr__add_space:
@@ -6895,8 +5126,7 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
                 break;
 
             default: /* should be unreachable */
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "Unknown flash_incr_mode?!?!?.")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown flash_incr_mode?!?!?")
                 break;
         }
 
@@ -6925,8 +5155,7 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
         switch ( (cache_ptr->resize_ctl).flash_incr_mode )
         {
             case H5C_flash_incr__off:
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "flash_size_increase_possible but H5C_flash_incr__off?!")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "flash_size_increase_possible but H5C_flash_incr__off?!")
                 break;
 
             case H5C_flash_incr__add_space:
@@ -6937,8 +5166,7 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
                 break;
 
             default: /* should be unreachable */
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "Unknown flash_incr_mode?!?!?.")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown flash_incr_mode?!?!?")
                 break;
         }
 
@@ -6952,10 +5180,8 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
             /* get the hit rate for the reporting function.  Should still
              * be good as we havent reset the hit rate statistics.
              */
-            if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
-            }
+            if(H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate")
 
             (*((cache_ptr->resize_ctl).rpt_fcn))
                 (cache_ptr,
@@ -6968,12 +5194,9 @@ H5C__flash_increase_cache_size(H5C_t * cache_ptr,
                  new_min_clean_size);
         }
 
-        if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
-
+        if(H5C_reset_cache_hit_rate_stats(cache_ptr) < 0)
             /* this should be impossible... */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "H5C_reset_cache_hit_rate_stats failed.")
-        }
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_reset_cache_hit_rate_stats failed")
     }
 
 done:
@@ -7021,7 +5244,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
+H5C_flush_invalidate_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
 {
     H5C_t *		cache_ptr;
     H5C_ring_t		ring;
@@ -7039,8 +5262,8 @@ H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
 #if H5C_DO_SANITY_CHECKS
 {
     int32_t		i;
-    int32_t		index_len = 0;
-    int32_t		slist_len = 0;
+    uint32_t		index_len = 0;
+    uint32_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;
@@ -7075,7 +5298,7 @@ H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
     /* 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.")
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error removing all epoch markers")
 
     /* flush invalidate each ring, starting from the outermost ring and
      * working inward.
@@ -7083,7 +5306,7 @@ H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
     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.")
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush invalidate ring failed")
         ring++;
     } /* end while */
 
@@ -7091,16 +5314,38 @@ H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
     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 */
+    else {
+        H5C_cache_entry_t *entry_ptr;   /* Cache entry */
+        unsigned u;                     /* Local index variable */
+
+        /* All rings except ring 4 should be empty now */
+        /* (Ring 4 has the superblock) */
+        for(u = H5C_RING_USER; u < H5C_RING_SB; u++) {
+            HDassert(cache_ptr->index_ring_len[u] == 0);
+            HDassert(cache_ptr->index_ring_size[u] == 0);
+            HDassert(cache_ptr->clean_index_ring_size[u] == 0);
+        } /* end for */
+
+        /* Check that any remaining pinned entries are in the superblock ring */
+        entry_ptr = cache_ptr->pel_head_ptr;
+        while(entry_ptr) {
+            /* Check ring */
+            HDassert(entry_ptr->ring == H5C_RING_SB);
+            
+            /* Advance to next entry in pinned entry list */
+            entry_ptr = entry_ptr->next;
+        } /* end while */
+    } /* end else */
+    HDassert(cache_ptr->dirty_index_size == 0);
+    HDassert(cache_ptr->slist_len == 0);
+    HDassert(cache_ptr->slist_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);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -7144,31 +5389,25 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
+H5C_flush_invalidate_ring(H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
     unsigned flags)
 {
-    H5C_t *		cache_ptr;
+    H5C_t              *cache_ptr;
     hbool_t             restart_slist_scan;
-    int32_t		protected_entries = 0;
-    int32_t		i;
-    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;
+    uint32_t            protected_entries = 0;
+    int32_t             i;
+    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		flushed_slist_len = 0;
-    int64_t		initial_slist_len = 0;
-    int64_t             flushed_slist_size = 0;
+    uint32_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 */
-    herr_t		ret_value = SUCCEED;
+    herr_t              ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -7258,29 +5497,18 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
          */
         cache_ptr->slist_len_increase = 0;
         cache_ptr->slist_size_increase = 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 */
 
-        /* set the cache_ptr->slist_change_in_pre_serialize and
-         * cache_ptr->slist_change_in_serialize to false.
+        /* Set the cache_ptr->slist_changed 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.
+         * This flag is set to TRUE by H5C__flush_single_entry if the slist
+         * is modified by a pre_serialize, serialize, or notify callback.
          *
-         * H5C_flush_invalidate_cache() uses these flags to detect any 
+         * H5C_flush_invalidate_ring() uses this flag 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;
+        cache_ptr->slist_changed = FALSE;
 
         /* this done, start the scan of the slist */
         restart_slist_scan = TRUE;
@@ -7318,6 +5546,7 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
              * slist if we find them.  However, best we do some extra
              * sanity checking just in case.
              */
+            HDassert(entry_ptr != NULL);
             HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
             HDassert(entry_ptr->in_slist);
             HDassert(entry_ptr->is_dirty);
@@ -7350,9 +5579,6 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
              * flush, we must keep the slist in cannonical form at all
              * times.
              */
-            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))) &&
@@ -7363,33 +5589,12 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
                      * everything we can before we flag an error.
                      */
                     protected_entries++;
-                } else if(entry_ptr->is_pinned) {
-
-#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 */
-
-                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, entry_size_change_ptr, NULL) < 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 */
+                } /* end if */
+                else if(entry_ptr->is_pinned) {
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__DURING_FLUSH_FLAG) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "dirty pinned entry flush failed")
 
-                    if((cache_ptr->slist_change_in_serialize) ||
-                            (cache_ptr->slist_change_in_pre_serialize)) {
+                    if(cache_ptr->slist_changed) {
                         /* The slist has been modified by something
                          * other than the simple removal of the
                          * of the flushed entry after the flush.
@@ -7398,39 +5603,15 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
                          * 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;
+                        cache_ptr->slist_changed = FALSE;
                         H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr);
                     } /* end if */
-                } /* end if */
+                } /* end else-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 */
-
-                    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, NULL) < 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 */
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, (cooked_flags | H5C__DURING_FLUSH_FLAG | H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG)) < 0)
+                        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)) {
+                    if(cache_ptr->slist_changed) {
                         /* The slist has been modified by something
                          * other than the simple removal of the
                          * of the flushed entry after the flush.
@@ -7439,8 +5620,7 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
                          * 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;
+                        cache_ptr->slist_changed = FALSE;
                         H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
                     } /* end if */
                 } /* end else */
@@ -7458,10 +5638,8 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
          */
 
         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));
+            HDassert(cache_ptr->slist_len == (uint32_t)((int32_t)initial_slist_len + cache_ptr->slist_len_increase));
+            HDassert(cache_ptr->slist_size == (size_t)((ssize_t)initial_slist_size + cache_ptr->slist_size_increase));
         } /* end if */
 #endif /* H5C_DO_SANITY_CHECKS */
 
@@ -7472,139 +5650,133 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
          * 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.
+         * in 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];
 
-            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);
+        /* reset the counters so that we can detect insertions, loads,
+         * and moves caused by the pre_serialize and serialize calls.
+         */
+        cache_ptr->entries_loaded_counter         = 0;
+        cache_ptr->entries_inserted_counter       = 0;
+        cache_ptr->entries_relocated_counter      = 0;
 
-                next_entry_ptr = entry_ptr->ht_next;
-                HDassert((next_entry_ptr == NULL) ||
-                        (next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC));
+        next_entry_ptr = cache_ptr->il_head;
+        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);
 
-                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)) {
+            next_entry_ptr = entry_ptr->il_next;
+            HDassert((next_entry_ptr == NULL) ||
+                     (next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC));
 
-                    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->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));
+                } /* end if */
+                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.
+                     *
+                     * It's also possible that removing a clean
+                     * entry will remove the last child of a proxy
+                     * entry, allowing it to be removed also and
+                     * invalidating the next_entry_ptr.
+                     *
+                     * If either of these happen, and one of the target 
+                     * or proxy entries happens to be the next entry in 
+                     * the hash bucket, we could 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 we detect that the next_entry_ptr
+                     * becomes invalid.
+                     *
+                     * This is not as inefficient at it might seem,
+                     * as hash buckets typically have at most two
+                     * or three entries.
+                     */
+                    cache_ptr->entry_watched_for_removal = next_entry_ptr;
+
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, (cooked_flags | H5C__DURING_FLUSH_FLAG | H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG)) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Entry flush destroy failed")
+
+                    /* Restart the index list scan if necessary.  Must
+                     * do this if the next entry is evicted, and also if 
+                     * one or more entries are inserted, loaded, or moved
+                     * as these operations can result in part of the scan
+                     * being skipped -- which can cause a spurious failure
+                     * if this results in the size of the pinned entry 
+                     * failing to decline during the pass.
+                     */
+                    if((NULL != next_entry_ptr && NULL == cache_ptr->entry_watched_for_removal)
+                            || (cache_ptr->entries_loaded_counter > 0)
+                            || (cache_ptr->entries_inserted_counter > 0)
+                            || (cache_ptr->entries_relocated_counter > 0)) {
 
-                        entry_was_dirty = entry_ptr->is_dirty;
+                        next_entry_ptr = cache_ptr->il_head;
 
-                        if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, 
-                                (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG), 
-                                NULL, NULL) < 0)
-                            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Entry flush destroy failed.")
+                        cache_ptr->entries_loaded_counter         = 0;
+                        cache_ptr->entries_inserted_counter       = 0;
+                        cache_ptr->entries_relocated_counter      = 0;
 
-                        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 */
+                        H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr)
                     } /* end if */
+                    else
+                       cache_ptr->entry_watched_for_removal = NULL;
                 } /* 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.
-                 *
-                 * 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
-                 */
-                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?!?!?.")
-            } /* end while loop scanning hash table bin */
+            } /* end if */
         } /* end for loop scanning hash table */
 
-	old_ring_pel_len = cur_ring_pel_len;
+        /* We can't do anything if entries are pinned.  The
+         * hope is that the entries will be unpinned as the
+         * result of destroys of entries that reference them.
+         *
+         * 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.
+         */
+        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)
+            if(entry_ptr->ring == ring)
                 cur_ring_pel_len++;
 
             entry_ptr = entry_ptr->next;
         } /* end while */
 
-	if((cur_ring_pel_len > 0) && (cur_ring_pel_len >= old_ring_pel_len)) {
+       /* Check if the number of pinned entries in the ring is positive, and 
+        * it is not declining.  Scream and die if so.
+        */
+        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)
+            if(evict_flags)
                 HGOTO_DONE(TRUE)
 
-	   /* 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 */
 
         HDassert(protected_entries == cache_ptr->pl_len);
-        if((protected_entries > 0) && (protected_entries == cache_ptr->index_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 */
 
@@ -7622,9 +5794,9 @@ H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
     HDassert(protected_entries <= cache_ptr->pl_len);
 
     if(protected_entries > 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cache has protected entries.")
+        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, "Can't unpin all pinned entries in ring")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -7659,25 +5831,18 @@ 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;
+    uint32_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;
+    uint32_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;
@@ -7695,11 +5860,10 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
     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");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on entry")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     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(!flush_marked_entries)
@@ -7715,17 +5879,15 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
      */
     flushed_entries_last_pass = TRUE;
 
-    /* set the cache_ptr->slist_change_in_pre_serialize and
-     * cache_ptr->slist_change_in_serialize to false.
+    /* Set the cache_ptr->slist_changed 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
+     * This flag is set to TRUE by H5C__flush_single_entry if the 
+     * slist is modified by a pre_serialize, serialize, or notify callback.
+     * H5C_flush_cache uses this flag 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;
+    cache_ptr->slist_changed = FALSE;
 
     while((cache_ptr->slist_ring_len[ring] > 0) &&
 	    (protected_entries == 0)  &&
@@ -7752,12 +5914,6 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
         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, flushed, or removed
          * from the cache via the take ownership flag  during
@@ -7826,7 +5982,7 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
             if(!flush_marked_entries || entry_ptr->flush_marker)
                 HDassert(entry_ptr->ring >= ring);
 
-            /* increment node pointer now, before we delete its target
+            /* Advance node pointer now, before we delete its target
              * from the slist.
              */
             node_ptr = H5SL_next(node_ptr);
@@ -7838,6 +5994,7 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
                 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);
 
@@ -7846,18 +6003,17 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
             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
+                        || entry_ptr->flush_dep_ndirty_children == 0) 
+                    && entry_ptr->ring == ring) {
+
+                HDassert(entry_ptr->flush_dep_nunser_children == 0);
 
-            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 
@@ -7866,62 +6022,11 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
                     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, NULL) < 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, NULL) < 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(H5C__flush_single_entry(f, dxpl_id, entry_ptr, (flags | H5C__DURING_FLUSH_FLAG)) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry")
 
-                    if((cache_ptr->slist_change_in_serialize) ||
-                            (cache_ptr->slist_change_in_pre_serialize)) {
+                    if(cache_ptr->slist_changed) {
                         /* The slist has been modified by something
                          * other than the simple removal of the 
                          * of the flushed entry after the flush.
@@ -7930,9 +6035,7 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
                          * 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;
-
+                        cache_ptr->slist_changed = FALSE;
                         H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
                     } /* end if */
 
@@ -7943,11 +6046,8 @@ H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
 
 #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);
+        HDassert((uint32_t)((int32_t)initial_slist_len + cache_ptr->slist_len_increase) == cache_ptr->slist_len);
+        HDassert((size_t)((ssize_t)initial_slist_size + cache_ptr->slist_size_increase) == cache_ptr->slist_size);
 #endif /* H5C_DO_SANITY_CHECKS */
     } /* while */
 
@@ -7999,43 +6099,11 @@ 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
- *
  *-------------------------------------------------------------------------
  */
 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, H5SL_t
-#ifndef H5_HAVE_PARALLEL
-    H5_ATTR_UNUSED
-#endif /* NDEBUG */
-    *collective_write_list)
+H5C__flush_single_entry(H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_ptr,
+    unsigned flags)
 {
     H5C_t *	     	cache_ptr;              /* Cache for file */
     hbool_t		destroy;		/* external flag */
@@ -8043,9 +6111,14 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
     hbool_t		free_file_space;	/* external flag */
     hbool_t		take_ownership;		/* external flag */
     hbool_t             del_from_slist_on_destroy;    /* external flag */
+    hbool_t		during_flush;		/* external flag */
     hbool_t		write_entry;		/* internal flag */
     hbool_t		destroy_entry;		/* internal flag */
+    hbool_t		generate_image;		/* internal flag */
+    hbool_t		update_page_buffer;	/* internal flag */
     hbool_t		was_dirty;
+    hbool_t		suppress_image_entry_writes = FALSE;
+    hbool_t		suppress_image_entry_frees = FALSE;
     haddr_t             entry_addr = HADDR_UNDEF;
     herr_t		ret_value = SUCCEED;      /* Return value */
 
@@ -8056,11 +6129,9 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
     HDassert(cache_ptr);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
     HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
     HDassert(entry_ptr->ring != H5C_RING_UNDEFINED);
-
-    /* If defined, initialize *entry_size_change_ptr to 0 */
-    if(entry_size_change_ptr != NULL)
-        *entry_size_change_ptr = 0;
+    HDassert(entry_ptr->type);
 
     /* setup external flags from the flags parameter */
     destroy                = ((flags & H5C__FLUSH_INVALIDATE_FLAG) != 0);
@@ -8068,6 +6139,9 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
     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);
+    during_flush           = ((flags & H5C__DURING_FLUSH_FLAG) != 0);
+    generate_image         = ((flags & H5C__GENERATE_IMAGE_FLAG) != 0);
+    update_page_buffer     = ((flags & H5C__UPDATE_PAGE_BUFFER_FLAG) != 0);
 
     /* Set the flag for destroying the entry, based on the 'take ownership'
      * and 'destroy' flags
@@ -8077,10 +6151,6 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
     else
         destroy_entry = destroy;
 
-#ifdef H5_HAVE_PARALLEL
-    HDassert(FALSE == entry_ptr->coll_access);
-#endif
-
     /* we will write the entry to disk if it exists, is dirty, and if the
      * clear only flag is not set.
      */
@@ -8089,142 +6159,138 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
     else
         write_entry = FALSE;
 
+    /* if we have received close warning, and we have been instructed to 
+     * generate a metadata cache image, and we have actually constructed
+     * the entry images, set suppress_image_entry_frees to TRUE.
+     *
+     * Set suppress_image_entry_writes to TRUE if indicated by the 
+     * image_ctl flags.
+     */
+    if(cache_ptr->close_warning_received && cache_ptr->image_ctl.generate_image
+            && cache_ptr->num_entries_in_image > 0 && cache_ptr->image_entries) {
+        /* Sanity checks */
+        HDassert(entry_ptr->image_up_to_date || !(entry_ptr->include_in_image));
+        HDassert(entry_ptr->image_ptr || !(entry_ptr->include_in_image));
+        HDassert((!clear_only) || !(entry_ptr->include_in_image));
+        HDassert((!take_ownership) || !(entry_ptr->include_in_image));
+        HDassert((!free_file_space) || !(entry_ptr->include_in_image));
+
+        suppress_image_entry_frees = TRUE;
+
+        if(cache_ptr->image_ctl.flags & H5C_CI__SUPRESS_ENTRY_WRITES)
+            suppress_image_entry_writes = TRUE;
+    } /* end if */
+
     /* run initial sanity checks */
 #if H5C_DO_SANITY_CHECKS
-    HDassert( ! ( destroy && entry_ptr->is_pinned ) );
-
     if(entry_ptr->in_slist) {
         HDassert(entry_ptr->is_dirty);
 
         if((entry_ptr->flush_marker) && (!entry_ptr->is_dirty))
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry in slist failed sanity checks.")
-    } else {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry in slist failed sanity checks")
+    } /* end if */
+    else {
         HDassert(!entry_ptr->is_dirty);
         HDassert(!entry_ptr->flush_marker);
 
         if((entry_ptr->is_dirty) || (entry_ptr->flush_marker))
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry failed sanity checks.")
-    }
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry failed sanity checks")
+    } /* end else */
 #endif /* H5C_DO_SANITY_CHECKS */
 
     if(entry_ptr->is_protected) {
-	HDassert(!entry_ptr->is_protected);
+        HDassert(!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.")
+        HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, "Attempt to flush a protected entry")
     } /* end if */
 
-    /* set entry_ptr->flush_in_progress = TRUE and set
+    /* 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);
-
-    was_dirty = entry_ptr->is_dirty;  /* needed later for logging */
-
-    /* We will set flush_in_progress back to FALSE at the end if the
+     * 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;
 
-    /* serialize the entry if necessary, and then write it to disk. */
-    if(write_entry) {
+    /* Preserve current dirty state for later */
+    was_dirty = entry_ptr->is_dirty;
 
-	/* 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.
-         *
-         * Note that this may cause the entry to be re-sized and/or
-         * moved in the cache.  
-	 *
-         * 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).
-         */
+    /* The entry is dirty, and we are doing a flush, a flush destroy or have
+     * been requested to generate an image.  In those cases, serialize the
+     * entry.
+     */
+    if(write_entry || generate_image) {
         HDassert(entry_ptr->is_dirty);
 
-#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 */
-
         if(NULL == entry_ptr->image_ptr) {
-            size_t image_size;
-
-            if(entry_ptr->compressed)
-                image_size = entry_ptr->compressed_size;
-            else
-                image_size = entry_ptr->size;
-            HDassert(image_size > 0);
-
-
-            if(NULL == (entry_ptr->image_ptr = H5MM_malloc(image_size + H5C_IMAGE_EXTRA_SPACE)))
+            if(NULL == (entry_ptr->image_ptr = H5MM_malloc(entry_ptr->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);
+            HDmemcpy(((uint8_t *)entry_ptr->image_ptr) + entry_ptr->size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
 #endif /* H5C_DO_MEMORY_SANITY_CHECKS */
         } /* end if */
 
         if(!(entry_ptr->image_up_to_date)) {
+            /* Sanity check */
+            HDassert(!entry_ptr->prefetched);
+
             /* Generate the entry's image */
-            if(H5C__generate_image(f, cache_ptr, entry_ptr, dxpl_id, entry_size_change_ptr) < 0)
+            if(H5C__generate_image(f, cache_ptr, entry_ptr, dxpl_id) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't generate entry's image")
         } /* end if ( ! (entry_ptr->image_up_to_date) ) */
+    } /* end if */
 
-        /* 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(entry_ptr->compressed)
-                image_size = entry_ptr->compressed_size;
-            else
-                image_size = entry_ptr->size;
-
-#ifdef H5_HAVE_PARALLEL
-            if(collective_write_list) {
-                H5C_collective_write_t *item;
+    /* Finally, write the image to disk.  
+     * 
+     * Note that if 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(write_entry) {
+        HDassert(entry_ptr->is_dirty);
 
-                if(NULL == (item = (H5C_collective_write_t *)H5FL_MALLOC(H5C_collective_write_t)))
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "unable to allocate skip list item")
+#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 */
 
-                item->length = image_size;
-                item->free_buf = FALSE;
-                item->buf = entry_ptr->image_ptr;
-                item->offset = entry_ptr->addr;
+        /* Write the image to disk unless the write is suppressed.
+         *
+         * This happens if both suppress_image_entry_writes and 
+         * entry_ptr->include_in_image are TRUE, or if the 
+         * H5AC__CLASS_SKIP_WRITES is set in the entry's type.  This
+         * flag should only be used in test code
+         */
+        if((!suppress_image_entry_writes || !entry_ptr->include_in_image)
+                && (((entry_ptr->type->flags) & H5C__CLASS_SKIP_WRITES) == 0)) {
+            H5FD_mem_t mem_type = H5FD_MEM_DEFAULT;
 
-                if(H5SL_insert(collective_write_list, item, &item->offset) < 0) {
-                    H5MM_free(item);
+#ifdef H5_HAVE_PARALLEL
+            if(cache_ptr->coll_write_list) {
+                if(H5SL_insert(cache_ptr->coll_write_list, entry_ptr, &entry_ptr->addr) < 0)
                     HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "unable to insert skip list item")
-                } /* end if */
             } /* end if */
             else
 #endif /* H5_HAVE_PARALLEL */
-            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.")
-        }
+
+            if(entry_ptr->prefetched) {
+                HDassert(entry_ptr->type->id == H5AC_PREFETCHED_ENTRY_ID);
+                mem_type = cache_ptr->class_table_ptr[entry_ptr->prefetch_type_id]->mem_type;
+            } /* end if */
+            else
+                mem_type = entry_ptr->type->mem_type;
+
+            if(H5F_block_write(f, mem_type, entry_ptr->addr, entry_ptr->size, dxpl_id, entry_ptr->image_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't write image to file")
+        } /* end if */
 
         /* 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 )
+                (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 ) */
 
@@ -8249,25 +6315,30 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
         H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
     } /* end else if */
 
+    /* Note that the algorithm below is (very) similar to the set of operations
+     * in H5C_remove_entry() and should be kept in sync with changes
+     * to that code. - QAK, 2016/11/30
+     */
+
+    /* Update the cache internal data structures. */
     if(destroy) {
+        /* Sanity checks */
         if(take_ownership)
             HDassert(!destroy_entry);
         else
             HDassert(destroy_entry);
+        HDassert(!entry_ptr->is_pinned);
 
+        /* Update stats, while entry is still in the cache */
         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 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(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:
          *
@@ -8275,46 +6346,38 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
          *
          * 2) Delete it from the skip list if requested.
          *
-         * 3) Update the replacement policy for eviction
+         * 3) Delete it from the collective read access list.
+         *
+         * 4) Update the replacement policy for eviction
+         *
+         * 5) Remove it from the tag list for this object
          *
          * Finally, if the destroy_entry flag is set, discard the 
          * entry.
          */
-
-        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
+        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, FAIL)
 
         if(entry_ptr->in_slist && del_from_slist_on_destroy)
-            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+            H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush)
 
-        H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL)
-
-#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 ) ) {
-
-	    int i;
-
-	    HDfprintf(stdout, 
-                    "\n\nattempting to evict entry of type \"%s\" at 0X%llx:\n",
-                    entry_ptr->type->name, (long long)(entry_ptr->addr));
-
-	    for ( i = 0; i < entry_ptr->flush_dep_nparents; i++ ) {
+#ifdef H5_HAVE_PARALLEL
+        /* Check for collective read access flag */
+        if(entry_ptr->coll_access) {
+            entry_ptr->coll_access = FALSE;
+            H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, FAIL)
+        } /* end if */
+#endif /* H5_HAVE_PARALLEL */
 
-		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));
-	    }
+        H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL)
 
-	    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 */
+        /* Remove entry from tag list */
+        if(H5C__untag_entry(cache_ptr, entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry from tag list")
 
 	/* 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);
-    }
+    } /* end if */
     else {
         HDassert(clear_only || write_entry);
         HDassert(entry_ptr->is_dirty);
@@ -8331,7 +6394,7 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
 
         H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL)
 
-        H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+        H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush)
 
         /* mark the entry as clean and update the index for 
          * entry clean.  Also, call the clear callback 
@@ -8341,20 +6404,23 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
 
         H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr);
 
-        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")
-
-	/* Propagate the clean flag up the flush dependency chain if
-         * appropriate */
+        /* Check for entry changing status and do notifications, etc. */
         if(was_dirty) {
-	    HDassert(entry_ptr->flush_dep_ndirty_children == 0);
-
-	    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 */
-
-    }
+            /* If the entry's type has a 'notify' callback send a 'entry cleaned'
+             * notice now that the entry is fully integrated into the cache.
+             */
+            if(entry_ptr->type->notify &&
+                    (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_CLEANED, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag cleared")
+
+            /* Propagate the clean flag up the flush dependency chain if appropriate */
+            if(entry_ptr->flush_dep_ndirty_children != 0)
+                HDassert(entry_ptr->flush_dep_ndirty_children == 0);
+            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 */
+    } /* end else */
 
     /* reset the flush_in progress flag */
     entry_ptr->flush_in_progress = FALSE;
@@ -8369,10 +6435,32 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *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)
+        /* Sanity check */
+        HDassert(0 == entry_ptr->flush_dep_nparents);
+
+        /* if both suppress_image_entry_frees and entry_ptr->include_in_image
+         * are true, simply set entry_ptr->image_ptr to NULL, as we have 
+         * another pointer to the buffer in an instance of H5C_image_entry_t
+         * in cache_ptr->image_entries.
+         *
+         * Otherwise, free the buffer if it exists.
+         */
+        if(suppress_image_entry_frees && entry_ptr->include_in_image) 
+            entry_ptr->image_ptr = NULL;
+        else if(entry_ptr->image_ptr != NULL)
             entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr);
 
+        /* If the entry is not a prefetched entry, verify that the flush 
+         * dependency parents addresses array has been transfered.
+         *
+         * If the entry is prefetched, the free_isr routine will dispose of
+         * the flush dependency parents adresses array if necessary.
+         */
+        if(!entry_ptr->prefetched) {
+            HDassert(0 == entry_ptr->fd_parent_count);
+            HDassert(NULL == entry_ptr->fd_parent_addrs);
+        } /* end if */
+
         /* Check whether we should free the space in the file that 
          * the entry occupies 
          */
@@ -8383,31 +6471,23 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
             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);
-}
+            {
+                size_t curr_len;
+
+                /* Get the actual image size for the thing again */
+                entry_ptr->type->image_len((void *)entry_ptr, &curr_len);
+                HDassert(curr_len == entry_ptr->size);
+            }
 #endif /* NDEBUG */
 
-            /* if the file space free size callback is defined, use
+            /* 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.
+             * Otherwise use entry_ptr->size.
              */
             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;
 
@@ -8429,26 +6509,30 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
          * unexpected removal of entries (via expunge, eviction, 
          * or take ownership at present), so that they can re-start
          * their scans if necessary.
+         *
+         * Also check if the entry we are watching for removal is being
+         * removed (usually the 'next' entry for an iteration) and reset
+         * it to indicate that it was removed.
          */
-        cache_ptr->last_entry_removed_ptr++;
+        cache_ptr->entries_removed_counter++;
         cache_ptr->last_entry_removed_ptr = entry_ptr;
+        if(entry_ptr == cache_ptr->entry_watched_for_removal)
+            cache_ptr->entry_watched_for_removal = NULL;
 
         /* 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) {
+                /* Reset dirty flag */
                 entry_ptr->is_dirty = FALSE;
 
-                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")
-            }
+                /* If the entry's type has a 'notify' callback send a 'entry cleaned'
+                 * notice now that the entry is fully integrated into the cache.
+                 */
+                if(entry_ptr->type->notify &&
+                        (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_ENTRY_CLEANED, entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry dirty flag cleared")
+            } /* end if */
 
             /* we are about to discard the in core representation --
              * set the magic field to bad magic so we can detect a
@@ -8460,8 +6544,8 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
             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.")
-        } 
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "free_icr callback failed")
+        }  /* end if */
         else {
             HDassert(take_ownership);
 
@@ -8470,17 +6554,29 @@ H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_
              * unless the entry is re-inserted properly
              */
             entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
-        }
+        } /* end else */
     } /* if (destroy) */
 
+    /* Check if we have to update the page buffer with cleared entries 
+     * so it doesn't go out of date 
+     */
+    if(update_page_buffer) {
+        /* Sanity check */
+        HDassert(!destroy);
+        HDassert(entry_ptr->image_ptr);
+
+        if(f->shared->page_buf && f->shared->page_buf->page_size >= entry_ptr->size)
+            if(H5PB_update_entry(f->shared->page_buf, entry_ptr->addr, entry_ptr->size, entry_ptr->image_ptr) > 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Failed to update PB with metadata cache")
+    } /* end if */
+
     if(cache_ptr->log_flush)
         if((cache_ptr->log_flush)(cache_ptr, entry_addr, was_dirty, flags) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "log_flush callback failed.")
+            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 ) );
 
@@ -8490,7 +6586,7 @@ done:
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_verify_len_eoa
+ * 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
@@ -8502,8 +6598,6 @@ done:
  *              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
@@ -8512,54 +6606,46 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_verify_len_eoa (H5F_t *             f,
-               	    const H5C_class_t * type,
-               	    haddr_t             addr,
-		    size_t              *len,
-               	    htri_t		actual)
+H5C__verify_len_eoa(H5F_t *f, const H5C_class_t *type, haddr_t addr,
+    size_t *len, hbool_t actual)
 {
+    H5FD_mem_t cooked_type;             /* Modified type, accounting for switching global heaps */
     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
+    FUNC_ENTER_STATIC
 
     /* 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
+     * 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));
+    if(!H5F_addr_defined(eoa))
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid EOA address for file")
 
     /* Check for bad address in general */
-    if ( H5F_addr_gt(addr, eoa) )
+    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) ) {
-
+    /* 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.")
+	    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);
-    }
+    } /* end if */
 
-    if ( *len <= 0 )
-	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "len not positive after adjustment for EOA.")
+    if(*len <= 0)
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "len not positive after adjustment for EOA")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_verify_len_eoa() */
+} /* H5C__verify_len_eoa() */
 
 

 /*-------------------------------------------------------------------------
@@ -8581,7 +6667,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static void *
-H5C_load_entry(H5F_t *             f,
+H5C_load_entry(H5F_t *              f,
                 hid_t               dxpl_id,
 #ifdef H5_HAVE_PARALLEL
                 hbool_t             coll_access,
@@ -8591,14 +6677,6 @@ H5C_load_entry(H5F_t *             f,
                 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 = NULL;    /* Alias for thing loaded, as cache entry   */
@@ -8612,47 +6690,38 @@ H5C_load_entry(H5F_t *             f,
 
     FUNC_ENTER_NOAPI_NOINIT
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-
-    /* 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)));
+    HDassert(H5F_addr_defined(addr));
+    HDassert(type->get_initial_load_size);
+    if(type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG)
+        HDassert(type->get_final_load_size);
+    else
+        HDassert(NULL == type->get_final_load_size);
+    HDassert(type->deserialize);
 
     /* Can't see how skip reads could be usefully combined with
-     * either the speculative read or compressed flags.  Hence disallow.
+     * the speculative read flag.  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)
+    /* Call the get_initial_load_size callback, to retrieve the initial size of image */
+    if(type->get_initial_load_size(udata, &len) < 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)
-        if(H5C_verify_len_eoa(f, type, addr, &len, FALSE) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid len with respect to EOA.")
+        if(H5C__verify_len_eoa(f, type, addr, &len, FALSE) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid len with respect to EOA")
 
     /* 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.")
-
+        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 */
@@ -8671,27 +6740,29 @@ H5C_load_entry(H5F_t *             f,
         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 = NULL;         /* Pointer to image                     */
+        size_t actual_len = len;        /* The actual length, after speculative reads have been resolved */
+        uint64_t nanosec = 1;           /* # of nanoseconds to sleep between retries */
+        void *new_image;                /* Pointer to image                     */
+        hbool_t len_changed = TRUE;     /* Whether to re-check speculative entries */
 
         /* 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.
+         * This do/while loop performs the following till the metadata checksum
+         * is correct or the file's number of 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 H5C_DO_MEMORY_SANITY_CHECKS
+                HDmemcpy(image + len, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
             } /* end if */
 
 #ifdef H5_HAVE_PARALLEL
@@ -8713,44 +6784,26 @@ H5C_load_entry(H5F_t *             f,
                     HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
             } /* end if */
 #endif /* H5_HAVE_PARALLEL */
-            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 the entry could be read speculatively and the length is still
+             *  changing, check for updating the actual size
+             */
+            if((type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG) && len_changed) {
+                /* Retrieve the actual length */
+                actual_len = len;
+                if(type->get_final_load_size(image, len, udata, &actual_len) < 0)
+                    continue;   /* Transfer control to while() and count towards retries */
+
+                /* Check for the length changing */
+                if(actual_len != len) {
+                    /* Verify that the length isn't past the EOA for the file */
+                    if(H5C__verify_len_eoa(f, type, addr, &actual_len, TRUE) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "actual_len exceeds EOA")
+
+                    /* Expand buffer to new size */
                     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 */
@@ -8762,35 +6815,47 @@ H5C_load_entry(H5F_t *             f,
                             /* 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(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")
+                            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")
 #ifdef H5_HAVE_PARALLEL
                         }
-                        /* if the collective metadata read optimization is turned on,
-                           bcast the metadata read from process 0 to all ranks in the file
-                           communicator */
+                        /* If the collective metadata read optimization is turned on,
+                         * Bcast the metadata read from process 0 to all ranks in the file
+                         * communicator */
                         if(coll_access) {
                             int buf_size;
 
-                            H5_CHECKED_ASSIGN(buf_size, int, actual_len-len, size_t);
-                            if(MPI_SUCCESS != (mpi_code = MPI_Bcast(image+len, buf_size, MPI_BYTE, 0, comm)))
+                            H5_CHECKED_ASSIGN(buf_size, int, actual_len - len, size_t);
+                            if(MPI_SUCCESS != (mpi_code = MPI_Bcast(image + len, buf_size, MPI_BYTE, 0, comm)))
                                 HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
                         } /* end if */
 #endif /* H5_HAVE_PARALLEL */
-                    }
-                } else {
-                    /* throw an error */
-                    HGOTO_ERROR(H5E_CACHE, H5E_UNSUPPORTED, NULL, "size of non-speculative, non-compressed object changed")
-                } /* end else */
-            } /* end if (actual_len != len) */
+                    } /* end if */
+                } /* end if (actual_len != len) */
+                else {
+                    /* The length has stabilized */
+                    len_changed = FALSE;
+
+                    /* Set the final length */
+                    len = actual_len;
+                } /* else */
+            } /* end if */
 
+            /* If there's no way to verify the checksum for a piece of metadata
+             * (usually because there's no checksum in the file), leave now
+             */
             if(type->verify_chksum == NULL)
                 break;
 
+            /* Verify the checksum for the metadata image */
             if((chk_ret = type->verify_chksum(image, actual_len, udata)) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_NOSPACE, NULL, "Failure from verify_chksum callback")
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "failure from verify_chksum callback")
             if(chk_ret == TRUE)
                 break;
+
+            /* Sleep for some time */
+            H5_nanosleep(nanosec);
+            nanosec *= 2;               /* Double the sleep time next time */
         } while(--tries);
 
         /* Check for too many tries */
@@ -8799,12 +6864,12 @@ H5C_load_entry(H5F_t *             f,
 
         /* Calculate and track the # of retries */
         retries = max_tries - tries;
-        if(retries) {        /* Does not track 0 retry */
+        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;
 
+        /* Set the final length (in case it wasn't set earlier) */
+        len = actual_len;
     } /* end if !H5C__CLASS_SKIP_READS */
 
     /* Deserialize the on-disk image into the native memory form */
@@ -8834,54 +6899,76 @@ H5C_load_entry(H5F_t *             f,
 
     HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6) );
 
-    entry->magic                = H5C__H5C_CACHE_ENTRY_T_MAGIC;
-    entry->cache_ptr            = f->shared->cache;
-    entry->addr                 = addr;
-    entry->size                 = len;
+    entry->magic                        = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+    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;
+    entry->image_ptr                    = image;
+    entry->image_up_to_date             = !dirty;
+    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
-    entry->clear_on_unprotect   = FALSE;
-    entry->flush_immediately    = FALSE;
-    entry->coll_access          = coll_access;
+    entry->clear_on_unprotect           = FALSE;
+    entry->flush_immediately            = FALSE;
+    entry->coll_access                  = coll_access;
 #endif /* H5_HAVE_PARALLEL */
-    entry->flush_in_progress    = FALSE;
-    entry->destroy_in_progress  = FALSE;
+    entry->flush_in_progress            = FALSE;
+    entry->destroy_in_progress          = FALSE;
 
-    entry->ring                 = H5C_RING_UNDEFINED;
+    entry->ring                         = H5C_RING_UNDEFINED;
 
-    /* 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;
+    /* Initialize flush dependency 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->flush_dep_nunser_children    = 0;
+    entry->ht_next                      = NULL;
+    entry->ht_prev                      = NULL;
+    entry->il_next                      = NULL;
+    entry->il_prev             	        = NULL;
 
-    entry->next                 = NULL;
-    entry->prev                 = NULL;
+    entry->next                         = NULL;
+    entry->prev                         = NULL;
 
-    entry->aux_next             = NULL;
-    entry->aux_prev             = NULL;
+    entry->aux_next                     = NULL;
+    entry->aux_prev                     = NULL;
 
 #ifdef H5_HAVE_PARALLEL
-    entry->coll_next            = NULL;
-    entry->coll_prev            = NULL;
+    entry->coll_next                    = NULL;
+    entry->coll_prev                    = NULL;
 #endif /* H5_HAVE_PARALLEL */
 
+    /* initialize cache image related fields */
+    entry->include_in_image             = FALSE;
+    entry->lru_rank                     = 0;
+    entry->image_dirty                  = FALSE;
+    entry->fd_parent_count              = 0;
+    entry->fd_parent_addrs              = NULL;
+    entry->fd_child_count               = 0;
+    entry->fd_dirty_child_count         = 0;
+    entry->image_fd_height              = 0;
+    entry->prefetched                   = FALSE;
+    entry->prefetch_type_id             = 0;
+    entry->age                          = 0;
+    entry->prefetched_dirty             = FALSE;
+#ifndef NDEBUG  /* debugging field */
+    entry->serialization_count          = 0;
+#endif /* NDEBUG */
+
+    entry->tl_next  = NULL;
+    entry->tl_prev  = NULL;
+    entry->tag_info = NULL;
+
     H5C__RESET_CACHE_ENTRY_STATS(entry);
 
     ret_value = thing;
@@ -8890,7 +6977,7 @@ done:
     /* Cleanup on error */
     if(NULL == ret_value) {
         /* Release resources */
-        if ( thing && type->free_icr(thing) < 0 )
+        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);
@@ -8902,7 +6989,7 @@ done:
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_make_space_in_cache
+ * Function:    H5C__make_space_in_cache
  *
  * Purpose:     Attempt to evict cache entries until the index_size
  *		is at least needed_space below max_cache_size.
@@ -8920,100 +7007,67 @@ done:
  *		Thus the function simply does its best, returning success
  *		unless an error is encountered.
  *
- *		The primary_dxpl_id and secondary_dxpl_id parameters
- *		specify the dxpl_ids used on the first write occasioned
- *		by the call (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.
- *
  *		Observe that this function cannot occasion a read.
  *
  * Return:      Non-negative on success/Negative on failure.
  *
  * Programmer:  John Mainzer, 5/14/04
  *
- * 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.
- *
- *		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
- *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5C_make_space_in_cache(H5F_t *	f,
-                        hid_t	dxpl_id,
-		        size_t	space_needed,
-                        hbool_t	write_permitted)
+herr_t
+H5C__make_space_in_cache(H5F_t *f, hid_t dxpl_id, size_t space_needed,
+    hbool_t	write_permitted)
 {
     H5C_t *		cache_ptr = f->shared->cache;
 #if H5C_COLLECT_CACHE_STATS
     int32_t             clean_entries_skipped = 0;
+    int32_t             dirty_pf_entries_skipped = 0;
     int32_t             total_entries_scanned = 0;
 #endif /* H5C_COLLECT_CACHE_STATS */
-    int32_t		entries_examined = 0;
-    int32_t		initial_list_len;
+    uint32_t		entries_examined = 0;
+    uint32_t		initial_list_len;
     size_t		empty_space;
+    hbool_t             reentrant_call = FALSE;
     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;
+    uint32_t 		num_corked_entries = 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( cache_ptr->index_size ==
-	      (cache_ptr->clean_index_size + cache_ptr->dirty_index_size) );
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->index_size == (cache_ptr->clean_index_size + cache_ptr->dirty_index_size));
 
-    if ( write_permitted ) {
+    /* check to see if cache_ptr->msic_in_progress is TRUE.  If it, this
+     * is a re-entrant call via a client callback called in the make 
+     * space in cache process.  To avoid an infinite recursion, set 
+     * reentrant_call to TRUE, and goto done.
+     */
+    if(cache_ptr->msic_in_progress) {
+        reentrant_call = TRUE;
+        HGOTO_DONE(SUCCEED);
+    } /* end if */
 
+    cache_ptr->msic_in_progress = TRUE;
+
+    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 ) {
-
+	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;
 
-	}
-
         while ( ( ( (cache_ptr->index_size + space_needed)
                     >
                     cache_ptr->max_cache_size
@@ -9039,19 +7093,19 @@ H5C_make_space_in_cache(H5F_t *	f,
 	    next_ptr = entry_ptr->next;
             prev_ptr = entry_ptr->prev;
 
-	    if ( prev_ptr != NULL ) {
-
+	    if(prev_ptr != NULL)
 		prev_is_dirty = prev_ptr->is_dirty;
-	    }
 
-	    if (entry_ptr->is_corked && entry_ptr->is_dirty) {
+	    if(entry_ptr->is_dirty &&
+                    (entry_ptr->tag_info && entry_ptr->tag_info->corked)) {
 
                 /* 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 ) ) {
+	    } else if ( ( (entry_ptr->type)->id != H5AC_EPOCH_MARKER_ID ) &&
+                        ( ! entry_ptr->flush_in_progress ) &&
+                        ( ! entry_ptr->prefetched_dirty ) ) {
 
                 didnt_flush_entry = FALSE;
 
@@ -9077,14 +7131,7 @@ H5C_make_space_in_cache(H5F_t *	f,
                     cache_ptr->entries_removed_counter = 0;
                     cache_ptr->last_entry_removed_ptr  = NULL;
 
-#ifdef H5_HAVE_PARALLEL
-                    if(TRUE == entry_ptr->coll_access) {
-                        entry_ptr->coll_access = FALSE;
-                        H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, FAIL)
-                    } /* end if */
-#endif
-
-                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, NULL, NULL) < 0)
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET) < 0)
                         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
 
 		    if ( ( cache_ptr->entries_removed_counter > 1 ) ||
@@ -9101,7 +7148,7 @@ H5C_make_space_in_cache(H5F_t *	f,
                     cache_ptr->entries_scanned_to_make_space++;
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, NULL) < 0)
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 0)
                         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
                 } else {
                     /* We have enough space so don't flush clean entry. */
@@ -9117,10 +7164,16 @@ H5C_make_space_in_cache(H5F_t *	f,
 
             } else {
 
-                /* Skip epoch markers and entries that are in the process
-                 * of being flushed.
+                /* Skip epoch markers, entries that are in the process
+                 * of being flushed, and entries marked as prefetched_dirty
+                 * (occurs in the R/O case only).
                  */
                 didnt_flush_entry = TRUE;
+
+#if H5C_COLLECT_CACHE_STATS
+                if(entry_ptr->prefetched_dirty)
+                    dirty_pf_entries_skipped++;
+#endif /* H5C_COLLECT_CACHE_STATS */
             }
 
 	    if ( prev_ptr != NULL ) {
@@ -9185,6 +7238,7 @@ H5C_make_space_in_cache(H5F_t *	f,
         cache_ptr->calls_to_msic++;
 
         cache_ptr->total_entries_skipped_in_msic += clean_entries_skipped;
+        cache_ptr->total_dirty_pf_entries_skipped_in_msic += dirty_pf_entries_skipped;
         cache_ptr->total_entries_scanned_in_msic += total_entries_scanned;
 
         if ( clean_entries_skipped > cache_ptr->max_entries_skipped_in_msic ) {
@@ -9192,6 +7246,9 @@ H5C_make_space_in_cache(H5F_t *	f,
             cache_ptr->max_entries_skipped_in_msic = clean_entries_skipped;
         }
 
+        if(dirty_pf_entries_skipped > cache_ptr->max_dirty_pf_entries_skipped_in_msic)
+            cache_ptr->max_dirty_pf_entries_skipped_in_msic = dirty_pf_entries_skipped;
+
         if ( total_entries_scanned > cache_ptr->max_entries_scanned_in_msic ) {
 
             cache_ptr->max_entries_scanned_in_msic = total_entries_scanned;
@@ -9239,14 +7296,20 @@ H5C_make_space_in_cache(H5F_t *	f,
 
             prev_ptr = entry_ptr->aux_prev;
 
+            if ( ( !(entry_ptr->prefetched_dirty) ) 
 #ifdef H5_HAVE_PARALLEL
-            if(!(entry_ptr->coll_access)) {
+                 && ( ! (entry_ptr->coll_access) )
 #endif /* H5_HAVE_PARALLEL */
-                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, NULL) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
-#ifdef H5_HAVE_PARALLEL
+               ) {
+
+                if ( H5C__flush_single_entry(f, dxpl_id, entry_ptr, 
+                                  H5C__FLUSH_INVALIDATE_FLAG | 
+                                  H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 0 )
+
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                                "unable to flush entry")
+
             } /* end if */
-#endif /* H5_HAVE_PARALLEL */
 
 	    /* we are scanning the clean LRU, so the serialize function
 	     * will not be called on any entry -- thus there is no
@@ -9260,10 +7323,14 @@ H5C_make_space_in_cache(H5F_t *	f,
     }
 
 done:
+    /* Sanity checks */
+    HDassert(cache_ptr->msic_in_progress);
+    if(!reentrant_call)
+        cache_ptr->msic_in_progress = FALSE;
+    HDassert((!reentrant_call) || (cache_ptr->msic_in_progress));
 
     FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_make_space_in_cache() */
+} /* H5C__make_space_in_cache() */
 
 

 /*-------------------------------------------------------------------------
@@ -9594,241 +7661,75 @@ H5C_validate_protected_entry_list(H5C_t * cache_ptr)
          )
        ) {
 
-        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:
-
-    if ( ret_value != SUCCEED ) {
-
-        HDassert(0);
-    }
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* 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 */
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed")
+    }
 
-    FUNC_ENTER_NOAPI(FAIL)
+    entry_ptr = cache_ptr->pl_head_ptr;
+    while ( entry_ptr != NULL )
+    {
 
-    HDassert( f );
-    HDassert( f->shared );
+        if ( ( entry_ptr != cache_ptr->pl_head_ptr ) &&
+             ( ( entry_ptr->prev == NULL ) ||
+               ( entry_ptr->prev->next != entry_ptr ) ) ) {
 
-    cache_ptr = f->shared->cache;
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed")
+        }
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( H5F_addr_defined(addr) );
-    HDassert( entry_ptr_ptr != NULL );
+        if ( ( entry_ptr != cache_ptr->pl_tail_ptr ) &&
+             ( ( entry_ptr->next == NULL ) ||
+               ( entry_ptr->next->prev != entry_ptr ) ) ) {
 
-    /* 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, "Check 6 failed")
+        }
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+        if ( ! entry_ptr->is_protected ) {
 
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+        }
 
-    if ( entry_ptr == NULL ) {
+        if ( ( entry_ptr->is_read_only ) &&
+             ( entry_ptr->ro_ref_count <= 0 ) ) {
 
-        /* the entry doesn't exist in the cache -- report this
-         * and quit.
-         */
-        *entry_ptr_ptr = NULL;
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 8 failed")
+        }
 
-    } else {
+        len++;
+        size += entry_ptr->size;
+        entry_ptr = entry_ptr->next;
+    }
 
-        *entry_ptr_ptr = entry_ptr;
+    if ( ( cache_ptr->pl_len != len ) ||
+         ( cache_ptr->pl_size != size ) ) {
 
-	/* increment call counter */
-	(cache_ptr->get_entry_ptr_from_addr_counter)++;
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 9 failed")
     }
 
 done:
 
+    if ( ret_value != SUCCEED ) {
+
+        HDassert(0);
+    }
+
     FUNC_LEAVE_NOAPI(ret_value)
 
-} /* H5C_get_entry_ptr_from_addr() */
+} /* H5C_validate_protected_entry_list() */
 
-#endif /* NDEBUG */
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
 

 /*-------------------------------------------------------------------------
  *
- * 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.
+ * Function:    H5C_entry_in_skip_list
  *
- *		Note that this function is only defined if NDEBUG
- *		is not defined.
+ * 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:      FAIL if error is detected, SUCCEED otherwise.
+ * Return:      FALSE if the entry is not in the skip list, and TRUE 
+ *		if it is.
  *
- * Programmer:  John Mainzer, 5/30/14
+ * Programmer:  John Mainzer, 11/1/14
  *
  * Changes:
  *
@@ -9836,853 +7737,915 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-#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 );
+#if H5C_DO_SLIST_SANITY_CHECKS
 
-    cache_ptr = f->shared->cache;
+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 != NULL );
+    HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( H5F_addr_defined(addr) );
-    HDassert( in_cache_ptr != NULL );
-    HDassert( type_ok_ptr != NULL );
+    HDassert( cache_ptr->slist_ptr );
 
-    /* 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 ) ) {
+    node_ptr = H5SL_first(cache_ptr->slist_ptr);
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
+    while ( ( node_ptr != NULL ) && ( ! in_slist ) )
+    {
+        entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
 
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+	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 == NULL ) {
+        if ( entry_ptr == target_ptr ) {
 
-        /* the entry doesn't exist in the cache -- report this
-         * and quit.
-         */
-        *in_cache_ptr = FALSE;
+	    in_slist = TRUE;
 
-    } else {
+	} else {
 
-        *in_cache_ptr = TRUE;
-	*type_ok_ptr = (expected_type == entry_ptr->type);
+	    node_ptr = H5SL_next(node_ptr);
+	}
     }
 
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_verify_entry_type() */
+    return(in_slist);
 
-#endif /* NDEBUG */
+} /* H5C_entry_in_skip_list() */
+#endif /* H5C_DO_SLIST_SANITY_CHECKS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_ignore_tags
+ * Function:    H5C__flush_marked_entries
  *
- * 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.
+ * Purpose:     Flushes all marked entries in the cache.
  *
  * Return:      FAIL if error is detected, SUCCEED otherwise.
  *
  * Programmer:  Mike McGreevy
- *              December 1, 2009
+ *              November 3, 2010
  *
  *-------------------------------------------------------------------------
  */
 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 */
+H5C__flush_marked_entries(H5F_t * f, hid_t dxpl_id)
+{ 
+    herr_t ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /* 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;
+    HDassert(f != NULL);
 
-    /* Apply the tag globality to the entry */
-    entry_ptr->globality = tag.globality;
+    /* 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_tag_entry */
+} /* H5C__flush_marked_entries */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_evict_tagged_entries
- *
- * Purpose:     Evicts all entries with the specified tag from cache
+ * Function:    H5C_cork
  *
- * Return:      FAIL if error is detected, SUCCEED otherwise.
+ * 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:  Mike McGreevy
- *              August 19, 2010
+ * Programmer:  Vailin Choi
+ *		January 2014
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_evict_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag)
+H5C_cork(H5C_t *cache_ptr, haddr_t obj_addr, unsigned action, hbool_t *corked) 
 {
-    /* 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;
+    H5C_tag_info_t *tag_info;	/* Points to a tag info struct */
+    herr_t              ret_value = SUCCEED;
 
-    /* Function Enter Macro */
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOINIT
 
     /* 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, 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 */
+    HDassert(cache_ptr != NULL);
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(action == H5C__SET_CORK || action == H5C__UNCORK || action == H5C__GET_CORKED);
 
-    /* Keep doing this until we have stopped evicted entries */
-    } while (evicted_entries_last_pass == TRUE);
+    /* Search the list of corked object addresses in the cache */
+    tag_info = (H5C_tag_info_t *)H5SL_search(cache_ptr->tag_list, &obj_addr);
 
-    /* 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?!");
+    if(H5C__GET_CORKED == action) {
+        HDassert(corked);
+        if(tag_info != NULL && tag_info->corked)
+            *corked = TRUE;
+        else
+            *corked = FALSE;
     } /* end if */
+    else {
+        /* Sanity check */
+        HDassert(H5C__SET_CORK == action || H5C__UNCORK == action);
 
-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];
+        /* Perform appropriate action */
+        if(H5C__SET_CORK == action) {
+            /* Check if this is the first entry for this tagged object */
+            if(NULL == tag_info) {
+                /* Allocate new tag info struct */
+                if(NULL == (tag_info = H5FL_CALLOC(H5C_tag_info_t)))
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "can't allocate tag info for cache entry")
+
+                /* Set the tag for all entries */
+                tag_info->tag = obj_addr;
+
+                /* Insert tag info into skip list */
+                if(H5SL_insert(cache_ptr->tag_list, tag_info, &(tag_info->tag)) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert tag info in skip list")
+            } /* end if */
+            else {
+                /* Check for object already corked */
+                if(tag_info->corked)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTCORK, FAIL, "object already corked")
+                HDassert(tag_info->entry_cnt > 0 && tag_info->head);
+            } /* end else */
 
-	while ( entry_ptr != NULL ) {
+            /* Set the corked status for the entire object */
+            tag_info->corked = TRUE;
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(tag_info);
 
-	    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) {  
+            /* Check for already uncorked */
+            if(!tag_info->corked)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNCORK, FAIL, "object already uncorked")
 
-		    entry_ptr->flush_marker = TRUE;
+            /* Set the corked status for the entire object */
+            tag_info->corked = FALSE;
 
-		} /* end if */
+            /* Remove the tag info from the tag list, if there's no more entries with this tag */
+            if(0 == tag_info->entry_cnt) {
+                /* Sanity check */
+                HDassert(NULL == tag_info->head);
 
-	    } /* end if */
+                if(H5SL_remove(cache_ptr->tag_list, &(tag_info->tag)) != tag_info)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove tag info from list")
 
-	    entry_ptr = entry_ptr->ht_next;
-	} /* end while */
-    } /* for */
+                /* Release the tag info */
+                tag_info = H5FL_FREE(H5C_tag_info_t, tag_info);
+            } /* end if */
+            else
+                HDassert(NULL != tag_info->head);
+        } /* end else */
+    } /* end else */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5C_mark_tagged_entries */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_cork() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_dirty()
  *
- * Function:    H5C_flush_marked_entries
- *
- * Purpose:     Flushes all marked entries in the cache.
+ * 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:      FAIL if error is detected, SUCCEED otherwise.
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              November 3, 2010
+ * Programmer:  Neil Fortner
+ *              11/13/12
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_flush_marked_entries(H5F_t * f, hid_t dxpl_id)
-{ 
-    herr_t ret_value = SUCCEED;
+H5C__mark_flush_dep_dirty(H5C_cache_entry_t * entry)
+{
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Assertions */
-    HDassert(f != NULL);
+    /* Sanity checks */
+    HDassert(entry);
 
-    /* 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")
+    /* Iterate over the parent entries, if any */
+    for(u = 0; u < entry->flush_dep_nparents; u++) {
+	/* Sanity check */
+	HDassert(entry->flush_dep_parent[u]->flush_dep_ndirty_children < entry->flush_dep_parent[u]->flush_dep_nchildren);
+
+	/* Adjust the parent's number of dirty children */
+	entry->flush_dep_parent[u]->flush_dep_ndirty_children++;
+
+        /* If the parent has a 'notify' callback, send a 'child entry dirtied' notice */
+        if(entry->flush_dep_parent[u]->type->notify &&
+                (entry->flush_dep_parent[u]->type->notify)(H5C_NOTIFY_ACTION_CHILD_DIRTIED, entry->flush_dep_parent[u]) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry dirty flag set")
+    } /* end for */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_flush_marked_entries */
+} /* H5C__mark_flush_dep_dirty() */
 
-#if H5C_DO_TAGGING_SANITY_CHECKS
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_clean()
  *
- * Function:    H5C_verify_tag
- *
- * Purpose:     Performs sanity checking on an entrytype/tag pair.
+ * 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:      SUCCEED or FAIL.
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              January 14, 2010
+ * Programmer:  Neil Fortner
+ *              11/13/12
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_verify_tag(int id, haddr_t tag) 
+H5C__mark_flush_dep_clean(H5C_cache_entry_t * entry)
 {
-    herr_t ret_value = SUCCEED;
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* 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 {
+    /* Sanity checks */
+    HDassert(entry);
 
-        /* Perform some sanity checks on tag value. Certain entry
-         * types require certain tag values, so check that these
-         * constraints are met. */
+    /* Iterate over the parent entries, if any */
+    for(u = 0; u < entry->flush_dep_nparents; u++) {
+	/* Sanity check */
+	HDassert(entry->flush_dep_parent[u]->flush_dep_ndirty_children > 0);
 
-        /* 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 */
+	/* Adjust the parent's number of dirty children */
+	entry->flush_dep_parent[u]->flush_dep_ndirty_children--;
+
+        /* If the parent has a 'notify' callback, send a 'child entry cleaned' notice */
+        if(entry->flush_dep_parent[u]->type->notify &&
+                (entry->flush_dep_parent[u]->type->notify)(H5C_NOTIFY_ACTION_CHILD_CLEANED, entry->flush_dep_parent[u]) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry dirty flag reset")
+    } /* end for */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_verify_tag */
-#endif
+} /* H5C__mark_flush_dep_clean() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_serialized()
  *
- * Function:    H5C_flush_tagged_entries
+ * Purpose:     Decrement the flush_dep_nunser_children fields of all the 
+ *		target entry's flush dependency parents in response to 
+ *		the target entry becoming serialized.
  *
- * Purpose:     Flushes all entries with the specified tag to disk.
- *
- * Return:      FAIL if error is detected, SUCCEED otherwise.
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              August 19, 2010
+ * Programmer:  John Mainzer
+ *              8/30/16
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_flush_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag)
+H5C__mark_flush_dep_serialized(H5C_cache_entry_t * entry_ptr)
 {
-    /* Variable Declarations */
-    H5C_t      *cache_ptr = NULL;
-    herr_t      ret_value = SUCCEED;
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
-    /* Assertions */
-    HDassert(f);
-    HDassert(f->shared);
+    /* Sanity checks */
+    HDassert(entry_ptr);
 
-    /* Get cache pointer */
-    cache_ptr = f->shared->cache;
+    /* Iterate over the parent entries, if any */
+    for(u = 0; u < entry_ptr->flush_dep_nparents; u++) {
 
-    /* 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")
+        HDassert(entry_ptr->flush_dep_parent);
+        HDassert(entry_ptr->flush_dep_parent[u]->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(entry_ptr->flush_dep_parent[u]->flush_dep_nunser_children > 0);
 
-    /* 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")
+        /* decrement the parents number of unserialized children */
+        entry_ptr->flush_dep_parent[u]->flush_dep_nunser_children--;
+
+        /* If the parent has a 'notify' callback, send a 'child entry serialized' notice */
+        if(entry_ptr->flush_dep_parent[u]->type->notify &&
+                (entry_ptr->flush_dep_parent[u]->type->notify)(H5C_NOTIFY_ACTION_CHILD_SERIALIZED, entry_ptr->flush_dep_parent[u]) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry serialized flag set")
+    } /* end for */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_flush_tagged_entries */
+} /* H5C__mark_flush_dep_serialized() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_unserialized()
  *
- * Function:    H5C_retag_entries
+ * Purpose:     Decrement the flush_dep_nunser_children fields of all the 
+ *              target entry's flush dependency parents in response to 
+ *              the target entry becoming unserialized.
  *
- * 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.
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              March 17, 2010
+ * Programmer:  John Mainzer
+ *              8/30/16
  *
  *-------------------------------------------------------------------------
  */
-void
-H5C_retag_entries(H5C_t * cache_ptr, haddr_t src_tag, haddr_t dest_tag) 
+herr_t
+H5C__mark_flush_dep_unserialized(H5C_cache_entry_t * entry_ptr)
 {
-    unsigned u;         /* Local index variable */
-    H5C_cache_entry_t *entry_ptr = NULL; /* entry pointer */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
-    /* 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 */
+    /* Sanity checks */
+    HDassert(entry_ptr);
+
+    /* Iterate over the parent entries, if any */
+    for(u = 0; u < entry_ptr->flush_dep_nparents; u++) {
+        /* Sanity check */
+        HDassert(entry_ptr->flush_dep_parent);
+        HDassert(entry_ptr->flush_dep_parent[u]->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(entry_ptr->flush_dep_parent[u]->flush_dep_nunser_children < 
+                 entry_ptr->flush_dep_parent[u]->flush_dep_nchildren);
+
+        /* increment parents number of usserialized children */
+        entry_ptr->flush_dep_parent[u]->flush_dep_nunser_children++;
+
+        /* If the parent has a 'notify' callback, send a 'child entry unserialized' notice */
+        if(entry_ptr->flush_dep_parent[u]->type->notify &&
+                (entry_ptr->flush_dep_parent[u]->type->notify)(H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED, entry_ptr->flush_dep_parent[u]) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify parent about child entry serialized flag reset")
     } /* end for */
 
-    FUNC_LEAVE_NOAPI_VOID
-} /* H5C_retag_entries */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__mark_flush_dep_unserialized() */
 
 

+#ifndef NDEBUG
 /*-------------------------------------------------------------------------
- * Function:    H5C_get_entry_ring
- *
- * Purpose:     Given a file address, retrieve the ring for an entry at that
- *              address.
+ * Function:    H5C__assert_flush_dep_nocycle()
  *
- * 		On error, the value of *ring is not modified.
+ * 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:      Non-negative on success/Negative on failure
+ * Return:      void
  *
- * Programmer:  Quincey Koziol
- *              9/8/15
+ * Programmer:  Neil Fortner
+ *              12/10/12
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5C_get_entry_ring(const H5F_t *f, haddr_t addr, H5C_ring_t *ring)
+static void
+H5C__assert_flush_dep_nocycle(const H5C_cache_entry_t * entry,
+    const H5C_cache_entry_t * base_entry)
 {
-    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 */
+    unsigned u;                         /* Local index variable */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC_NOERR
 
     /* 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));
+    HDassert(entry);
+    HDassert(base_entry);
 
-    /* Locate the entry at the address */
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
-    HDassert(entry_ptr);
+    /* Make sure the entries are not the same */
+    HDassert(base_entry != entry);
 
-    /* Return the ring value */
-    *ring = entry_ptr->ring;
+    /* Iterate over entry's parents (if any) */
+    for(u = 0; u < entry->flush_dep_nparents; u++)
+	H5C__assert_flush_dep_nocycle(entry->flush_dep_parent[u], base_entry);
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_get_entry_ring() */
+    FUNC_LEAVE_NOAPI_VOID
+} /* H5C__assert_flush_dep_nocycle() */
+#endif /* NDEBUG */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__serialize_cache
  *
- * Function:    H5C_cork
+ * Purpose:	Serialize (i.e. construct an on disk image) for all entries 
+ *		in the metadata cache including clean entries.  
  *
- * 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
+ *		Note that flush dependencies and "flush me last" flags
+ *		must be observed in the serialization process.  
+ *
+ *		Note also that entries may be loaded, flushed, evicted,
+ *		expunged, relocated, resized, or removed from the cache
+ *		during this process, just as these actions may occur during
+ *		a regular flush.
  *
- * Programmer:  Vailin Choi; January 2014
+ *		However, we are given that the cache will contain no protected
+ *		entries on entry to this routine (although entries may be 
+ *		briefly protected and then unprotected during the serialize 
+ *		process).  
+ *
+ *		The objective of this routine is serialize all entries and 
+ *		to force all entries into their actual locations on disk.  
+ *
+ *		The initial need for this routine is to settle all entries 
+ *		in the cache prior to construction of the metadata cache 
+ *		image so that the size of the cache image can be calculated.
+ *		However, I gather that other uses for the routine are 
+ *		under consideration.
+ *
+ * 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
+ *		7/22/15
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_cork(H5C_t * cache_ptr, haddr_t obj_addr, unsigned action, hbool_t *corked) 
+H5C__serialize_cache(H5F_t *f, hid_t dxpl_id)
 {
-    haddr_t *ptr;		/* Points to an address */
-    herr_t ret_value = SUCCEED;	/* Return value */
+#if H5C_DO_SANITY_CHECKS
+    int                 i;
+    uint32_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;
+    uint32_t            slist_len = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+    H5C_ring_t          ring;
+    H5C_t             * cache_ptr;
+    herr_t              ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
-    /* Assertions */
-    HDassert(cache_ptr != NULL);
-    HDassert(H5F_addr_defined(obj_addr));
-    HDassert(action == H5C__SET_CORK || action == H5C__UNCORK || action == H5C__GET_CORKED);
+    /* Sanity checks */
+    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);
 
-    /* Search the list of corked object addresses in the cache */
-    ptr = (haddr_t *)H5SL_search(cache_ptr->cork_list_ptr, &obj_addr);
+#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);
 
-    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 */
+    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];
 
-        /* Sanity check */
-        HDassert(H5C__SET_CORK == action || H5C__UNCORK == action);
+        slist_len += cache_ptr->slist_ring_len[i];
+        slist_size += cache_ptr->slist_ring_size[i];
+    } /* end for */
 
-        /* Perform appropriate action */
-        if(H5C__SET_CORK == action) {
-            haddr_t *addr_ptr = NULL;	/* Points to an address */
+    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 */
+
+#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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-            if(ptr != NULL && *ptr == obj_addr)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't cork an already corked object")
+#ifndef NDEBUG
+    /* if this is a debug build, set the serialization_count field of 
+     * each entry in the cache to zero before we start the serialization.
+     * This allows us to detect the case in which any entry is serialized
+     * more than once (a performance issues), and more importantly, the 
+     * case is which any flush depencency parent is serializes more than
+     * once (a correctness issue).
+     */
+     {
+        H5C_cache_entry_t * scan_ptr = NULL;
+
+        scan_ptr = cache_ptr->il_head;
+        while(scan_ptr != NULL) {
+	    HDassert(scan_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+	    scan_ptr->serialization_count = 0;
+	    scan_ptr = scan_ptr->il_next;
+        } /* end while */
+     } /* end block */
+#endif /* NDEBUG */
 
-            /* Allocate address */
-            if(NULL == (addr_ptr = H5FL_MALLOC(haddr_t)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    /* set cache_ptr->serialization_in_progress to TRUE, and back 
+     * to FALSE at the end of the function.  Must maintain this flag
+     * to support H5C_get_serialization_in_progress(), which is in 
+     * turn required to support sanity checking in some cache 
+     * clients.
+     */
+    HDassert(!cache_ptr->serialization_in_progress);
+    cache_ptr->serialization_in_progress = TRUE;
 
-            /* 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 */
+    /* Serialize each ring, starting from the outermost ring and
+     * working inward.
+     */
+    ring = H5C_RING_USER;
+    while(ring < H5C_RING_NTYPES) {
+	HDassert(cache_ptr->close_warning_received);
+        switch(ring) {
+            case H5C_RING_USER:
+                break;
 
-            /* 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 ")
+            case H5C_RING_RDFSM:
+                /* Settle raw data FSM */
+                if(!cache_ptr->rdfsm_settled)
+                    if(H5MF_settle_raw_data_fsm(f, dxpl_id, &cache_ptr->rdfsm_settled) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "RD FSM settle failed")
+                break;
+
+            case H5C_RING_MDFSM:
+                /* Settle metadata FSM */
+                if(!cache_ptr->mdfsm_settled)
+                    if(H5MF_settle_meta_data_fsm(f, dxpl_id, &cache_ptr->mdfsm_settled) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "MD FSM settle failed")
+                break;
 
-            /* 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")
+            case H5C_RING_SBE:
+            case H5C_RING_SB:
+                break;
 
-            /* Free address */
-            ptr = H5FL_FREE(haddr_t, ptr);
+            default:
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown ring?!?!")
+                break;
+        } /* end switch */
 
-            /* Set the entry's cork status */
-            is_corked = FALSE;
-        } /* end else */
+        if(H5C__serialize_ring(f, dxpl_id, ring) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "serialize ring failed")
 
-        /* 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 */
+        ring++;
+    } /* end while */
+
+#ifndef NDEBUG
+    /* Verify that no entry has been serialized more than once.
+     * FD parents with multiple serializations should have been caught
+     * elsewhere, so no specific check for them here.
+     */
+     {
+        H5C_cache_entry_t * scan_ptr = NULL;
+
+        scan_ptr = cache_ptr->il_head;
+        while(scan_ptr != NULL) {
+	    HDassert(scan_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+	    HDassert(scan_ptr->serialization_count <= 1);
+
+	    scan_ptr = scan_ptr->il_next;
+        } /* end while */
+     } /* end block */
+#endif /* NDEBUG */
 
 done:
+    cache_ptr->serialization_in_progress = FALSE;
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_cork() */
+} /* H5C__serialize_cache() */
 
 

 /*-------------------------------------------------------------------------
- * 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
+ * Function:    H5C__serialize_ring
  *
- * Purpose:     To set the "is_corked" field to "val" for entries in cache 
- *		with the entry's tag equals to "obj_addr".
+ * Purpose:     Serialize the entries contained in the specified cache and
+ *              ring.  All entries in rings outside the specified ring
+ *              must have been serialized on entry.
  *
- * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *              If the cache contains protected entries in the specified
+ *              ring, the function will fail, as protected entries cannot
+ *              be serialized.  However all unprotected entries in the 
+ *		target ring should be serialized before the function 
+ *		returns failure.
+ *
+ *              If flush dependencies appear in the target ring, the
+ *              function makes repeated passes through the index list
+ *		serializing entries in flush dependency order.
+ *
+ *		All entries outside the H5C_RING_SBE are marked for 
+ *		inclusion in the cache image.  Entries in H5C_RING_SBE 
+ *		and below are marked for exclusion from the image.
  *
- * Programmer:  Vailin Choi; January 2014
+ * 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/11/15
  *
  *-------------------------------------------------------------------------
  */
-static herr_t 
-H5C_mark_tagged_entries_cork(H5C_t *cache_ptr, haddr_t obj_addr, hbool_t val)
+static herr_t
+H5C__serialize_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring)
 {
-    /* Variable Declarations */
-    int u;                          /* Iterator */
-    H5C_cache_entry_t *entry_ptr = NULL; /* entry pointer */
+    hbool_t		done = FALSE;
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr;
+    herr_t              ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
-    /* Assertions */
-    HDassert(cache_ptr != NULL);
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(ring > H5C_RING_UNDEFINED);
+    HDassert(ring < H5C_RING_NTYPES);
 
-    /* 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++) {
+    HDassert(cache_ptr->serialization_in_progress);
 
-	entry_ptr = cache_ptr->index[u];
+    /* The objective here is to serialize all entries in the cache ring
+     * in flush dependency order.
+     *
+     * The basic algorithm is to scan the cache index list looking for 
+     * unserialized entries that are either not in a flush dependency
+     * relationship, or which have no unserialized children.  Any such
+     * entry is serialized and its flush dependency parents (if any) are 
+     * informed -- allowing them to decrement their userialized child counts.
+     *
+     * However, this algorithm is complicated by the ability
+     * of client serialization callbacks to perform operations on 
+     * on the cache which can result in the insertion, deletion, 
+     * relocation, resize, dirty, flush, eviction, or removal (via the
+     * take ownership flag) of entries.  Changes in the flush dependency
+     * structure are also possible.
+     *
+     * On the other hand, the algorithm is simplified by the fact that 
+     * we are serializing, not flushing.  Thus, as long as all entries 
+     * are serialized correctly, it doesn't matter if we have to go back
+     * and serialize an entry a second time.
+     *
+     * These possible actions result in the following modfications to 
+     * tha basic algorithm:
+     *
+     * 1) In the event of an entry expunge, eviction or removal, we must 
+     *    restart the scan as it is possible that the next entry in our 
+     *    scan is no longer in the cache.  Were we to examine this entry,
+     *    we would be accessing deallocated memory.
+     *
+     * 2) A resize, dirty, or insertion of an entry may result in the 
+     *    the increment of a flush dependency parent's dirty and/or 
+     *    unserialized child count.  In the context of serializing the 
+     *    the cache, this is a non-issue, as even if we have already 
+     *    serialized the parent, it will be marked dirty and its image 
+     *    marked out of date if appropriate when the child is serialized.  
+     *    
+     *    However, this is a major issue for a flush, as were this to happen
+     *    in a flush, it would violate the invariant that the flush dependency
+     *    feature is intended to enforce.  As the metadata cache has no 
+     *    control over the behavior of cache clients, it has no way of 
+     *    preventing this behaviour.  However, it should detect it if at all
+     *    possible.  
+     *
+     *    Do this by maintaining a count of the number of times each entry is
+     *    serialized during a cache serialization.  If any flush dependency 
+     *    parent is serialized more than once, throw an assertion failure.
+     *
+     * 3) An entry relocation will typically change the location of the 
+     *    entry in the index list.  This shouldn't cause problems as we 
+     *    will scan the index list until we make a complete pass without 
+     *    finding anything to serialize -- making relocations of either 
+     *    the current or next entries irrelevant.
+     *
+     *    Note that since a relocation may result in our skipping part of 
+     *    the index list, we must always do at least one more pass through
+     *    the index list after an entry relocation.
+     *
+     * 4) Changes in the flush dependency structure are possible on 
+     *    entry insertion, load, expunge, evict, or remove.  Destruction
+     *    of a flush dependency has no effect, as it can only relax the 
+     *    flush dependencies.  Creation of a flush dependency can create
+     *    an unserialized child of a flush dependency parent where all 
+     *    flush dependency children were previously serialized.  Should
+     *    this child dirty the flush dependency parent when it is serialized,
+     *    the parent will be re-serialized.
+     *
+     *    Per the discussion of 2) above, this is a non issue for cache 
+     *    serialization, and a major problem for cache flush.  Using the
+     *    same detection mechanism, throw an assertion failure if this 
+     *    condition appears.  
+     *
+     * Observe that either eviction or removal of entries as a result of 
+     * a serialization is not a problem as long as the flush depencency 
+     * tree does not change beyond the removal of a leaf.
+     */
+    while(!done) {
+        /* Reset the counters so that we can detect insertions, loads,
+         * moves, and flush dependency height changes caused by the pre_serialize
+         * and serialize callbacks.
+         */
+        cache_ptr->entries_loaded_counter         = 0;
+        cache_ptr->entries_inserted_counter	  = 0;
+        cache_ptr->entries_relocated_counter      = 0;
 
+	done = TRUE; /* set to FALSE if any activity in inner loop */
+	entry_ptr = cache_ptr->il_head;
 	while(entry_ptr != NULL) {
+	    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
 
-	    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 */
+	    /* Verify that either the entry is already serialized, or
+             * that it is assigned to either the target or an inner 
+             * ring.
+             */
+            HDassert((entry_ptr->ring >= ring) || (entry_ptr->image_up_to_date));
 
-

-/*-------------------------------------------------------------------------
- * 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 */
+	    /* Skip flush me last entries or inner ring entries */
+	    if(!entry_ptr->flush_me_last && entry_ptr->ring == ring) {
 
-    FUNC_ENTER_NOAPI_NOINIT
+		/* if we encounter an unserialized entry in the current
+                 * ring that is not marked flush me last, we are not done.
+                 */
+		if(!entry_ptr->image_up_to_date)
+		    done = FALSE;
 
-    /* Sanity checks */
-    HDassert(entry);
-    HDassert((entry->is_dirty && entry->flush_dep_ndirty_children == 0)
-	    || (!entry->is_dirty && entry->flush_dep_ndirty_children == 1));
+		/* Serialize the entry if its image is not up to date
+                 * and it has no unserialized flush dependency children.
+                 */
+		if(!entry_ptr->image_up_to_date && entry_ptr->flush_dep_nunser_children == 0) {
+		    HDassert(entry_ptr->serialization_count == 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
-		< entry->flush_dep_parent[i]->flush_dep_nchildren);
+		    /* Serialize the entry */
+		    if(H5C__serialize_single_entry(f, dxpl_id, cache_ptr, entry_ptr) < 0)
+            	        HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "entry serialization failed")
 
-	/* Adjust the parent's number of dirty children */
-	entry->flush_dep_parent[i]->flush_dep_ndirty_children++;
+                    HDassert(entry_ptr->flush_dep_nunser_children == 0);
+		    HDassert(entry_ptr->serialization_count == 0);
 
-	/* 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 */
+#ifndef NDEBUG
+                    /* Increment serialization counter (to detect multiple serializations) */
+		    entry_ptr->serialization_count++;
+#endif /* NDEBUG */
+                 } /* end if */
+            } /* end if */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C__mark_flush_dep_dirty() */
+            /* Check for the cache being perturbed during the entry serialize */
+            if((cache_ptr->entries_loaded_counter > 0) ||
+                    (cache_ptr->entries_inserted_counter > 0) ||
+                    (cache_ptr->entries_relocated_counter > 0)) {
 
-

-/*-------------------------------------------------------------------------
- * 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 */
+#if H5C_COLLECT_CACHE_STATS
+                H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr);
+#endif /* H5C_COLLECT_CACHE_STATS */
 
-    FUNC_ENTER_NOAPI_NOINIT
+                /* Reset the counters */
+                cache_ptr->entries_loaded_counter         = 0;
+                cache_ptr->entries_inserted_counter	  = 0;
+                cache_ptr->entries_relocated_counter      = 0;
 
-    /* Sanity checks */
-    HDassert(entry);
-    HDassert(!entry->is_dirty && entry->flush_dep_ndirty_children == 0);
+                /* Restart scan */
+                entry_ptr = cache_ptr->il_head;
+            } /* end if */
+            else
+                /* Advance to next entry */
+	        entry_ptr = entry_ptr->il_next;
+	} /* while ( entry_ptr != NULL ) */
+    } /* while ( ! done ) */
 
-    /* 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--;
+    /* Reset the counters so that we can detect insertions, loads,
+     * moves, and flush dependency height changes caused by the pre_serialize
+     * and serialize callbacks.
+     */
+    cache_ptr->entries_loaded_counter     = 0;
+    cache_ptr->entries_inserted_counter	  = 0;
+    cache_ptr->entries_relocated_counter  = 0;
+
+    /* At this point, all entries not marked "flush me last" and in
+     * the current ring or outside it should be serialized and have up 
+     * to date images.  Scan the index list again to serialize the 
+     * "flush me last" entries (if they are in the current ring) and to 
+     * verify that all other entries have up to date images.
+     */
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    	HDassert(entry_ptr->ring > H5C_RING_UNDEFINED);
+        HDassert(entry_ptr->ring < H5C_RING_NTYPES);
+        HDassert((entry_ptr->ring >= ring) || (entry_ptr->image_up_to_date));
+
+	if(entry_ptr->ring == ring) {
+	    if(entry_ptr->flush_me_last) {
+		if(!entry_ptr->image_up_to_date) {
+		    HDassert(entry_ptr->serialization_count == 0);
+                    HDassert(entry_ptr->flush_dep_nunser_children == 0);
+
+	            /* Serialize the entry */
+	            if(H5C__serialize_single_entry(f, dxpl_id,  cache_ptr, entry_ptr) < 0)
+		        HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "entry serialization failed")
+
+                    /* Check for the cache changing */
+                    if((cache_ptr->entries_loaded_counter > 0) ||
+                            (cache_ptr->entries_inserted_counter > 0) ||
+                            (cache_ptr->entries_relocated_counter > 0))
+		        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "flush_me_last entry serialization triggered restart")
+
+                    HDassert(entry_ptr->flush_dep_nunser_children == 0);
+		    HDassert(entry_ptr->serialization_count == 0);
+#ifndef NDEBUG
+                    /* Increment serialization counter (to detect multiple serializations) */
+		    entry_ptr->serialization_count++;
+#endif /* NDEBUG */
+                } /* end if */
+            } /* end if */
+            else {
+	        HDassert(entry_ptr->image_up_to_date);
+		HDassert(entry_ptr->serialization_count <= 1);
+                HDassert(entry_ptr->flush_dep_nunser_children == 0);
+            }  /* end else */
+        } /* if ( entry_ptr->ring == ring ) */
 
-	/* 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 */
+	entry_ptr = entry_ptr->il_next;
+    } /* while ( entry_ptr != NULL ) */
 
 done:
+    HDassert(cache_ptr->serialization_in_progress);
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C__mark_flush_dep_clean() */
+} /* H5C__serialize_ring() */
 
-#ifndef NDEBUG
 

 /*-------------------------------------------------------------------------
- * Function:    H5C__assert_flush_dep_nocycle()
+ * Function:    H5C__serialize_single_entry
  *
- * 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.
+ * Purpose:     Serialize the cache entry pointed to by the entry_ptr 
+ *		parameter.
  *
- * Return:      void
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Neil Fortner
- *              12/10/12
+ * Programmer:  John Mainzer, 7/24/15
  *
  *-------------------------------------------------------------------------
  */
-static void
-H5C__assert_flush_dep_nocycle(H5C_cache_entry_t * entry,
-    H5C_cache_entry_t * base_entry)
+static herr_t
+H5C__serialize_single_entry(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr,
+    H5C_cache_entry_t *entry_ptr)
 {
-    unsigned i;                         /* Local index variable */
+    herr_t		ret_value = SUCCEED;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
     /* Sanity checks */
-    HDassert(entry);
-    HDassert(base_entry);
+    HDassert(f);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(!entry_ptr->prefetched);
+    HDassert(!entry_ptr->image_up_to_date);
+    HDassert(entry_ptr->is_dirty);
+    HDassert(!entry_ptr->is_protected);
+    HDassert(!entry_ptr->flush_in_progress);
+    HDassert(entry_ptr->type);
 
-    /* Make sure the entries are not the same */
-    HDassert(base_entry != entry);
+    /* Set entry_ptr->flush_in_progress to TRUE so the the target entry
+     * will not be evicted out from under us.  Must set it back to FALSE
+     * when we are done.
+     */
+    entry_ptr->flush_in_progress = TRUE;
 
-    /* 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);
+    /* Allocate buffer for the entry image if required. */
+    if(NULL == entry_ptr->image_ptr) {
+        HDassert(entry_ptr->size > 0);
+        if(NULL == (entry_ptr->image_ptr = H5MM_malloc(entry_ptr->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 */
 
-    FUNC_LEAVE_NOAPI_VOID
-} /* H5C__assert_flush_dep_nocycle() */
-#endif /* NDEBUG */
+    /* Generate image for entry */
+    if(H5C__generate_image(f, cache_ptr, entry_ptr, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSERIALIZE, FAIL, "Can't generate image for cache entry")
+
+    /* Reset the flush_in progress flag */
+    entry_ptr->flush_in_progress = FALSE;
+
+done:
+    HDassert((ret_value != SUCCEED) || (!entry_ptr->flush_in_progress));
+    HDassert((ret_value != SUCCEED) || (entry_ptr->image_up_to_date));
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__serialize_single_entry() */
 
 

 /*-------------------------------------------------------------------------
@@ -10690,6 +8653,15 @@ H5C__assert_flush_dep_nocycle(H5C_cache_entry_t * entry,
  *
  * Purpose:     Serialize an entry and generate its image.
  *
+ * Note:	This may cause the entry to be re-sized and/or moved in
+ *              the cache.  
+ *
+ *              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).
+ *
  * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Mohamad Chaarawi
@@ -10697,50 +8669,42 @@ H5C__assert_flush_dep_nocycle(H5C_cache_entry_t * entry,
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5C__generate_image(const H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr, 
-    hid_t dxpl_id, int64_t *entry_size_change_ptr)
+herr_t
+H5C__generate_image(H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr, 
+    hid_t dxpl_id)
 {
     haddr_t		new_addr = HADDR_UNDEF;
     haddr_t		old_addr = HADDR_UNDEF;
     size_t		new_len = 0;
-    size_t		new_compressed_len = 0;
     unsigned            serialize_flags = H5C__SERIALIZE_NO_FLAGS_SET;
     herr_t              ret_value = SUCCEED;
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
+    HDassert(f);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
     HDassert(!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;
+    HDassert(entry_ptr->is_dirty);
+    HDassert(!entry_ptr->is_protected);
+    HDassert(entry_ptr->type);
 
     /* 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 && 
-         (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)
+            (entry_ptr->type->pre_serialize)(f, dxpl_id, (void *)entry_ptr,
+                entry_ptr->addr, entry_ptr->size, &new_addr, &new_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))
+        if(serialize_flags & ~(H5C__SERIALIZE_RESIZED_FLAG | H5C__SERIALIZE_MOVED_FLAG))
             HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unknown serialize flag(s)")
 
 #ifdef H5_HAVE_PARALLEL
@@ -10771,65 +8735,44 @@ H5C__generate_image(const H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_p
          *     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.")
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "resize/move in serialize occured in parallel case")
 #endif
 
-        /* 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);
+        /* If required, resize the buffer and update the entry and the cache
+         * data structures */
+        if(serialize_flags & H5C__SERIALIZE_RESIZED_FLAG) {
+            /* Sanity check */
+            HDassert(new_len > 0);
 
             /* Allocate a new image buffer */
-            if(NULL == (entry_ptr->image_ptr = H5MM_malloc(new_image_size + H5C_IMAGE_EXTRA_SPACE)))
+            if(NULL == (entry_ptr->image_ptr = H5MM_realloc(entry_ptr->image_ptr, new_len + 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);
+            HDmemcpy(((uint8_t *)entry_ptr->image_ptr) + new_len, 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) {
+            /* Update statistics for resizing the entry */
             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));
+            /* 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.
+            /* 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);
 
-            /* as we haven't updated the cache data structures for 
+            /* 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->is_dirty);
             HDassert(entry_ptr->in_slist);
             H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, entry_ptr->size, new_len);
 
-            /* 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);
-
-            /* finally, update the entry for its new size */
+            /* Finally, update the entry for its new size */
             entry_ptr->size = new_len;
         } /* end if */
 
@@ -10837,92 +8780,173 @@ H5C__generate_image(const H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_p
          * 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);
+            /* Update stats and entries relocated counter */
+            H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
 
+            /* We must update cache data structures for the change in address */
             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);
+                /* Delete the entry from the hash table and the slist */
+                H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, FAIL);
+                H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, FALSE);
 
-                /* update the entry for its new address */
+                /* Update the entry for its new address */
                 entry_ptr->addr = new_addr;
 
-                /* and then reinsert in the index and slist */
+                /* And then reinsert in the index and slist */
                 H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL);
-
-#if H5C_DO_SANITY_CHECKS
-                /* 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 */
-
                 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 */
             } /* end if */
             else /* move is already 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 */
     } /* end if(serialize_flags != H5C__SERIALIZE_NO_FLAGS_SET) */
 
     /* Serialize object into buffer */
-    {
-        size_t image_len;
+    if(entry_ptr->type->serialize(f, entry_ptr->image_ptr, entry_ptr->size, (void *)entry_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to serialize entry")
+#if H5C_DO_MEMORY_SANITY_CHECKS
+    HDassert(0 == HDmemcmp(((uint8_t *)entry_ptr->image_ptr) + entry_ptr->size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE));
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+    entry_ptr->image_up_to_date = TRUE;
 
-        if(entry_ptr->compressed)
-            image_len = entry_ptr->compressed_size;
-        else
-            image_len = entry_ptr->size;
+    /* Propagate the fact that the entry is serialized up the 
+     * flush dependency chain if appropriate.  Since the image must
+     * have been out of date for this function to have been called
+     * (see assertion on entry), no need to check that -- only check
+     * for flush dependency parents.
+     */
+    HDassert(entry_ptr->flush_dep_nunser_children == 0);
+    if(entry_ptr->flush_dep_nparents > 0)
+        if(H5C__mark_flush_dep_serialized(entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "Can't propagate serialization status to fd parents")
 
-        /* reset cache_ptr->slist_changed so we can detect slist
-         * modifications in the serialize call.
-         */
-        cache_ptr->slist_changed = 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")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__generate_image */
 
-        /* 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;
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_remove_entry
+ *
+ * Purpose:     Remove an entry from the cache.  Must be not protected, pinned,
+ *		dirty, involved in flush dependencies, etc.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              September 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_remove_entry(void *_entry)
+{
+    H5C_cache_entry_t *entry = (H5C_cache_entry_t *)_entry;     /* Entry to remove */
+    H5C_t *cache;               /* Cache for file */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-#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 */
+    FUNC_ENTER_NOAPI(FAIL)
 
-        entry_ptr->image_up_to_date = TRUE;
-    } /* end block */
+    /* Sanity checks */
+    HDassert(entry);
+    HDassert(entry->ring != H5C_RING_UNDEFINED);
+    cache = entry->cache_ptr;
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Check for error conditions */
+    if(entry->is_dirty)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove dirty entry from cache")
+    if(entry->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove protected entry from cache")
+    if(entry->is_pinned)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove pinned entry from cache")
+    if(entry->flush_dep_nparents > 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry with flush dependency parents from cache")
+    if(entry->flush_dep_nchildren > 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry with flush dependency children from cache")
+
+    /* Additional internal cache consistency checks */
+    HDassert(!entry->in_slist);
+    HDassert(!entry->flush_marker);
+    HDassert(!entry->flush_in_progress);
+
+    /* Note that the algorithm below is (very) similar to the set of operations
+     * in H5C__flush_single_entry() and should be kept in sync with changes
+     * to that code. - QAK, 2016/11/30
+     */
+
+    /* Update stats, as if we are "destroying" and taking ownership of the entry */
+    H5C__UPDATE_STATS_FOR_EVICTION(cache, entry, TRUE)
+
+    /* If the entry's type has a 'notify' callback, send a 'before eviction'
+     * notice while the entry is still fully integrated in the cache.
+     */
+    if(entry->type->notify && (entry->type->notify)(H5C_NOTIFY_ACTION_BEFORE_EVICT, entry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry to evict")
+
+    /* Update the cache internal data structures as appropriate for a destroy.
+     * Specifically:
+     *	1) Delete it from the index
+     *	2) Delete it from the collective read access list
+     *	3) Update the replacement policy for eviction
+     *	4) Remove it from the tag list for this object
+     */
+
+    H5C__DELETE_FROM_INDEX(cache, entry, FAIL)
+
+#ifdef H5_HAVE_PARALLEL
+    /* Check for collective read access flag */
+    if(entry->coll_access) {
+        entry->coll_access = FALSE;
+        H5C__REMOVE_FROM_COLL_LIST(cache, entry, FAIL)
+    } /* end if */
+#endif /* H5_HAVE_PARALLEL */
+
+    H5C__UPDATE_RP_FOR_EVICTION(cache, entry, FAIL)
+
+    /* Remove entry from tag list */
+    if(H5C__untag_entry(cache, entry) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove entry from tag list")
+
+    /* Increment entries_removed_counter and set last_entry_removed_ptr.
+     * As we me be about 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.
+     *
+     * Also check if the entry we are watching for removal is being
+     * removed (usually the 'next' entry for an iteration) and reset
+     * it to indicate that it was removed.
+     */
+    cache->entries_removed_counter++;
+    cache->last_entry_removed_ptr = entry;
+    if(entry == cache->entry_watched_for_removal)
+        cache->entry_watched_for_removal = NULL;
+
+    /* Internal cache data structures should now be up to date, and 
+     * consistant with the status of the entry.  
+     *
+     * Now clean up internal cache fields if appropriate.
+     */
+
+    /* Free the buffer for the on disk image */
+    if(entry->image_ptr != NULL)
+        entry->image_ptr = H5MM_xfree(entry->image_ptr);
+
+    /* Reset the pointer to the cache the entry is within */
+    entry->cache_ptr = NULL;
+
+    /* Client is taking ownership of the entry.  Set bad magic here so the
+     * cache will choke unless the entry is re-inserted properly
+     */
+    entry->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C__generate_image */
+} /* H5C__remove_entry() */
 
diff --git a/src/H5CS.c b/src/H5CS.c
index f1d3a8b..0a3dcce 100644
--- a/src/H5CS.c
+++ b/src/H5CS.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -192,6 +190,8 @@ H5CS_push(const char *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);
+
+        /* Don't use H5MM_realloc here */
         const char **x = (const char **)HDrealloc(fstack->rec, na * sizeof(const char *));
 
         /* (Avoid returning an error from this routine, currently -QAK) */
diff --git a/src/H5CSprivate.h b/src/H5CSprivate.h
index ab7f993..467dd9d 100644
--- a/src/H5CSprivate.h
+++ b/src/H5CSprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Cdbg.c b/src/H5Cdbg.c
new file mode 100644
index 0000000..4a08d9b
--- /dev/null
+++ b/src/H5Cdbg.c
@@ -0,0 +1,1597 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cdbg.c
+ *              July 8 2016
+ *              Quincey Koziol
+ *
+ * Purpose:     Debugging Routines for the generic cache structure or entries.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Cmodule.h"          /* This source code file is part of the H5C module */
+
+#define H5AC_FRIEND
+
+
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions            */
+#include "H5ACpkg.h"        /* Metadata Cache               */
+#include "H5Cpkg.h"         /* Cache                        */
+#include "H5Eprivate.h"     /* Error Handling               */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+#ifndef NDEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dump_cache
+ *
+ * Purpose:     Print a summary of the contents of the metadata cache for
+ *              debugging purposes.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/10/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_dump_cache(H5C_t * cache_ptr, const char *  cache_name)
+{
+    H5C_cache_entry_t * entry_ptr;
+    H5SL_t *            slist_ptr = NULL;
+    int                 i;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_name != NULL );
+
+    /* First, create a skip list */
+    if(NULL == (slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create skip list")
+
+    /* Next, scan the index, and insert all entries in the skip list.
+     * Do this, as we want to display cache entries in increasing address
+     * order.
+     */
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        entry_ptr = cache_ptr->index[i];
+
+        while(entry_ptr != NULL) {
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            if(H5SL_insert(slist_ptr, entry_ptr, &(entry_ptr->addr)) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "can't insert entry in skip list")
+
+            entry_ptr = entry_ptr->ht_next;
+        } /* end while */
+    } /* end for */
+
+    /* If we get this far, all entries in the cache are listed in the
+     * skip list -- scan the skip list generating the desired output.
+     */
+
+    HDfprintf(stdout, "\n\nDump of metadata cache \"%s\"\n", cache_name);
+
+    /* Print header */
+    HDfprintf(stdout, "Entry ");
+    HDfprintf(stdout, "|       Address      ");
+    HDfprintf(stdout, "|         Tag        ");
+    HDfprintf(stdout, "|  Size ");
+    HDfprintf(stdout, "| Ring ");
+    HDfprintf(stdout, "|              Type              ");
+    HDfprintf(stdout, "| Prot/Pin/Dirty");
+    HDfprintf(stdout, "\n");
+
+    HDfprintf(stdout, "----------------------------------------------------------------------------------------------------------------\n");
+
+    i = 0;
+    entry_ptr = (H5C_cache_entry_t *)H5SL_remove_first(slist_ptr);
+    while(entry_ptr != NULL) {
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+        /* Print entry */
+        HDfprintf(stdout, "%s%5d ", cache_ptr->prefix, i);
+        HDfprintf(stdout, "  0x%16llx ", (long long)(entry_ptr->addr));
+        if(NULL == entry_ptr->tag_info)
+            HDfprintf(stdout, "    %16s ", "N/A");
+        else
+            HDfprintf(stdout, "  0x%16llx ", (long long)(entry_ptr->tag_info->tag));
+        HDfprintf(stdout, "  %5lld ", (long long)(entry_ptr->size));
+        HDfprintf(stdout, "    %d  ", (int)(entry_ptr->ring));
+        HDfprintf(stdout, "  %2d %-32s ", (int)(entry_ptr->type->id), (entry_ptr->type->name));
+        HDfprintf(stdout, " %d", (int)(entry_ptr->is_protected));
+        HDfprintf(stdout, " %d", (int)(entry_ptr->is_pinned));
+        HDfprintf(stdout, " %d", (int)(entry_ptr->is_dirty));
+        HDfprintf(stdout, "\n");
+
+        /* remove the next (first) item in the skip list */
+        entry_ptr = (H5C_cache_entry_t *)H5SL_remove_first(slist_ptr);
+
+        i++;
+    } /* end while */
+
+    HDfprintf(stdout, "\n\n");
+
+    /* Verify that all the entries were removed from the skip list */
+    HDassert(H5SL_count(slist_ptr) == 0);
+
+done:
+    /* Discard the skip list */
+    if(slist_ptr)
+        H5SL_close(slist_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_dump_cache() */
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dump_cache_LRU
+ *
+ * Purpose:     Print a summary of the contents of the metadata cache 
+ *              LRU for debugging purposes.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/10/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_dump_cache_LRU(H5C_t *cache_ptr, const char *cache_name)
+{
+    H5C_cache_entry_t * entry_ptr;
+    int                 i = 0;
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity check */
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_name != NULL );
+
+    HDfprintf(stdout, "\n\nDump of metadata cache LRU \"%s\"\n", cache_name);
+    HDfprintf(stdout, "LRU len = %d, LRU size = %d\n", 
+              cache_ptr->LRU_list_len, (int)(cache_ptr->LRU_list_size));
+    HDfprintf(stdout, "index_size = %d, max_cache_size = %d, delta = %d\n\n", 
+              (int)(cache_ptr->index_size), (int)(cache_ptr->max_cache_size),
+              (int)(cache_ptr->max_cache_size) - (int)(cache_ptr->index_size));
+
+    /* Print header */
+    HDfprintf(stdout, "Entry ");
+    HDfprintf(stdout, "|       Address      ");
+    HDfprintf(stdout, "|         Tag        ");
+    HDfprintf(stdout, "|  Size ");
+    HDfprintf(stdout, "| Ring ");
+    HDfprintf(stdout, "|              Type              ");
+    HDfprintf(stdout, "| Dirty");
+    HDfprintf(stdout, "\n");
+
+    HDfprintf(stdout, "----------------------------------------------------------------------------------------------------------------\n");
+
+    entry_ptr = cache_ptr->LRU_head_ptr;
+    while(entry_ptr != NULL) {
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+        /* Print entry */
+        HDfprintf(stdout, "%s%5d ", cache_ptr->prefix, i);
+        HDfprintf(stdout, "  0x%16llx ", (long long)(entry_ptr->addr));
+
+        if(NULL == entry_ptr->tag_info)
+            HDfprintf(stdout, "    %16s ", "N/A");
+        else
+            HDfprintf(stdout, "  0x%16llx ", 
+                      (long long)(entry_ptr->tag_info->tag));
+
+        HDfprintf(stdout, "  %5lld ", (long long)(entry_ptr->size));
+        HDfprintf(stdout, "    %d  ", (int)(entry_ptr->ring));
+        HDfprintf(stdout, "  %2d %-32s ", (int)(entry_ptr->type->id), 
+                  (entry_ptr->type->name));
+        HDfprintf(stdout, " %d", (int)(entry_ptr->is_dirty));
+        HDfprintf(stdout, "\n");
+
+        i++;
+        entry_ptr = entry_ptr->next;
+    } /* end while */
+
+    HDfprintf(stdout, "----------------------------------------------------------------------------------------------------------------\n");
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_dump_cache_LRU() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dump_cache_skip_list
+ *
+ * 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
+ *              11/15/14
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn)
+{
+    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_NOERR
+
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(calling_fcn != NULL);
+
+    HDfprintf(stdout, "\n\nDumping metadata cache skip list from %s.\n", calling_fcn);
+    HDfprintf(stdout, "	slist len = %u.\n", cache_ptr->slist_len);
+    HDfprintf(stdout, "	slist size = %lld.\n", (long long)(cache_ptr->slist_size));
+
+    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.
+         */
+        HDfprintf(stdout,
+                  "Num:    Addr:               Len: Prot/Pind: Dirty: Type:\n");
+
+        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 = %p\n",
+                      (unsigned long long)node_ptr,
+                      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;
+
+            i++;
+        } /* end while */
+    } /* end if */
+
+    HDfprintf(stdout, "\n\n");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_dump_cache_skip_list() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_dump_coll_write_list
+ *
+ * Purpose:     Debugging routine that prints a summary of the contents of 
+ *		the collective write skip list used by the metadata cache 
+ *              in the parallel case to maintain a list of entries to write 
+ *              collectively at a sync point.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/1/17
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_PARALLEL
+#ifndef NDEBUG
+herr_t
+H5C_dump_coll_write_list(H5C_t * cache_ptr, char * calling_fcn)
+{
+    herr_t              ret_value = SUCCEED;   /* Return value */
+    int                 i;
+    int                 list_len;
+    H5AC_aux_t *        aux_ptr = NULL;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    H5SL_node_t *       node_ptr = NULL;
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->aux_ptr);
+
+    aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    HDassert(calling_fcn != NULL);
+
+    list_len = (int)H5SL_count(cache_ptr->coll_write_list);
+
+    HDfprintf(stdout, "\n\nDumping MDC coll write list from %d:%s.\n", 
+              aux_ptr->mpi_rank, calling_fcn);
+    HDfprintf(stdout, "	slist len = %u.\n", cache_ptr->slist_len);
+
+    if ( list_len > 0 ) {
+
+        /* scan the collective write list generating the desired output */
+        HDfprintf(stdout,
+                  "Num:    Addr:               Len: Prot/Pind: Dirty: Type:\n");
+
+        i = 0;
+
+        node_ptr = H5SL_first(cache_ptr->coll_write_list);
+
+        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);
+
+            node_ptr = H5SL_next(node_ptr);
+
+            if ( node_ptr != NULL )
+
+                entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+            else
+
+                entry_ptr = NULL;
+
+            i++;
+
+        } /* end while */
+    } /* end if */
+
+    HDfprintf(stdout, "\n\n");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_dump_coll_write_list() */
+#endif /* NDEBUG */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_prefix
+ *
+ * Purpose:     Set the values of the prefix field of H5C_t.  This
+ *		filed is used to label some debugging output.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_prefix(H5C_t * cache_ptr, char * prefix)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC) ||
+            (prefix == NULL) || (HDstrlen(prefix) >= H5C__PREFIX_LEN))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry")
+
+    HDstrncpy(&(cache_ptr->prefix[0]), prefix, (size_t)(H5C__PREFIX_LEN));
+
+    cache_ptr->prefix[H5C__PREFIX_LEN - 1] = '\0';
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_set_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_trace_file_ptr
+ *
+ * Purpose:     Set the trace_file_ptr field for the cache.
+ *
+ *              This field must either be NULL (which turns of trace
+ *              file logging), or be a pointer to an open file to which
+ *              trace file data is to be written.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_trace_file_ptr(H5C_t * cache_ptr, FILE * trace_file_ptr)
+{
+    herr_t		ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* This would normally be an assert, but we need to use an HGOTO_ERROR
+     * call to shut up the compiler.
+     */
+    if((NULL == cache_ptr) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr")
+
+    cache_ptr->trace_file_ptr = trace_file_ptr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_set_trace_file_ptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_stats
+ *
+ * Purpose:     Prints statistics about the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_stats(H5C_t * cache_ptr,
+          const char *  cache_name,
+          hbool_t
+#if !H5C_COLLECT_CACHE_STATS
+          H5_ATTR_UNUSED
+#endif /* H5C_COLLECT_CACHE_STATS */
+          display_detailed_stats)
+{
+#if H5C_COLLECT_CACHE_STATS
+    int		i;
+    int64_t     total_hits = 0;
+    int64_t     total_misses = 0;
+    int64_t	total_write_protects = 0;
+    int64_t	total_read_protects = 0;
+    int64_t	max_read_protects = 0;
+    int64_t     total_insertions = 0;
+    int64_t     total_pinned_insertions = 0;
+    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;
+    int64_t	total_size_increases = 0;
+    int64_t	total_size_decreases = 0;
+    int64_t	total_entry_flush_size_changes = 0;
+    int64_t	total_cache_flush_size_changes = 0;
+    int64_t	total_pins = 0;
+    int64_t	total_unpins = 0;
+    int64_t	total_dirty_pins = 0;
+    int64_t	total_pinned_flushes = 0;
+    int64_t	total_pinned_clears = 0;
+    int32_t     aggregate_max_accesses = 0;
+    int32_t     aggregate_min_accesses = 1000000;
+    int32_t     aggregate_max_clears = 0;
+    int32_t     aggregate_max_flushes = 0;
+    size_t      aggregate_max_size = 0;
+    int32_t	aggregate_max_pins = 0;
+    double      hit_rate;
+    double      prefetch_use_rate;
+    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_dirty_pf_entries_skipped_per_call_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.
+     */
+    if((NULL == cache_ptr) || (cache_ptr->magic != H5C__H5C_T_MAGIC) ||
+            (NULL == cache_name))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or cache_name")
+
+#if H5C_COLLECT_CACHE_STATS
+    for(i = 0; i <= cache_ptr->max_type_id; i++ ) {
+        total_hits              += cache_ptr->hits[i];
+        total_misses            += cache_ptr->misses[i];
+	total_write_protects	+= cache_ptr->write_protects[i];
+	total_read_protects	+= cache_ptr->read_protects[i];
+	if(max_read_protects < cache_ptr->max_read_protects[i])
+	    max_read_protects = cache_ptr->max_read_protects[i];
+        total_insertions        += cache_ptr->insertions[i];
+        total_pinned_insertions += cache_ptr->pinned_insertions[i];
+        total_clears            += cache_ptr->clears[i];
+        total_flushes           += cache_ptr->flushes[i];
+        total_evictions         += cache_ptr->evictions[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
+				+= cache_ptr->entry_flush_size_changes[i];
+    	total_cache_flush_size_changes
+				+= cache_ptr->cache_flush_size_changes[i];
+	total_pins              += cache_ptr->pins[i];
+	total_unpins            += cache_ptr->unpins[i];
+	total_dirty_pins        += cache_ptr->dirty_pins[i];
+	total_pinned_flushes    += cache_ptr->pinned_flushes[i];
+	total_pinned_clears     += cache_ptr->pinned_clears[i];
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+        if(aggregate_max_accesses < cache_ptr->max_accesses[i])
+            aggregate_max_accesses = cache_ptr->max_accesses[i];
+        if(aggregate_min_accesses > aggregate_max_accesses)
+            aggregate_min_accesses = aggregate_max_accesses;
+        if(aggregate_min_accesses > cache_ptr->min_accesses[i])
+            aggregate_min_accesses = cache_ptr->min_accesses[i];
+        if(aggregate_max_clears < cache_ptr->max_clears[i])
+            aggregate_max_clears = cache_ptr->max_clears[i];
+        if(aggregate_max_flushes < cache_ptr->max_flushes[i])
+            aggregate_max_flushes = cache_ptr->max_flushes[i];
+        if(aggregate_max_size < cache_ptr->max_size[i])
+            aggregate_max_size = cache_ptr->max_size[i];
+        if(aggregate_max_pins < cache_ptr->max_pins[i])
+            aggregate_max_pins = cache_ptr->max_pins[i];
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+    } /* end for */
+
+    if((total_hits > 0) || (total_misses > 0))
+        hit_rate = (double)100.0f * ((double)(total_hits)) /
+                   ((double)(total_hits + total_misses));
+    else
+        hit_rate = 0.0f;
+
+    if(cache_ptr->successful_ht_searches > 0)
+        average_successful_search_depth =
+            ((double)(cache_ptr->total_successful_ht_search_depth)) /
+            ((double)(cache_ptr->successful_ht_searches));
+
+    if(cache_ptr->failed_ht_searches > 0)
+        average_failed_search_depth =
+            ((double)(cache_ptr->total_failed_ht_search_depth)) /
+            ((double)(cache_ptr->failed_ht_searches));
+
+
+    HDfprintf(stdout, "\n%sH5C: cache statistics for %s\n",
+              cache_ptr->prefix, cache_name);
+
+    HDfprintf(stdout, "\n");
+
+    HDfprintf(stdout,
+              "%s  hash table insertion / deletions   = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->total_ht_insertions),
+              (long)(cache_ptr->total_ht_deletions));
+
+    HDfprintf(stdout,
+              "%s  HT successful / failed searches    = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->successful_ht_searches),
+              (long)(cache_ptr->failed_ht_searches));
+
+    HDfprintf(stdout,
+              "%s  Av. HT suc / failed search depth   = %f / %f\n",
+              cache_ptr->prefix,
+              average_successful_search_depth,
+              average_failed_search_depth);
+
+    HDfprintf(stdout,
+             "%s  current (max) index size / length  = %ld (%ld) / %lu (%lu)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->index_size),
+              (long)(cache_ptr->max_index_size),
+              (unsigned long)(cache_ptr->index_len),
+              (unsigned long)(cache_ptr->max_index_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) clean/dirty idx size = %ld (%ld) / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->clean_index_size),
+              (long)(cache_ptr->max_clean_index_size),
+              (long)(cache_ptr->dirty_index_size),
+              (long)(cache_ptr->max_dirty_index_size));
+
+    HDfprintf(stdout,
+             "%s  current (max) slist size / length  = %ld (%ld) / %lu (%lu)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->slist_size),
+              (long)(cache_ptr->max_slist_size),
+              (unsigned long)(cache_ptr->slist_len),
+              (unsigned long)(cache_ptr->max_slist_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) PL size / length     = %ld (%ld) / %lu (%lu)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->pl_size),
+              (long)(cache_ptr->max_pl_size),
+              (unsigned long)(cache_ptr->pl_len),
+              (unsigned long)(cache_ptr->max_pl_len));
+
+    HDfprintf(stdout,
+             "%s  current (max) PEL size / length    = %ld (%ld) / %lu (%lu)\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->pel_size),
+              (long)(cache_ptr->max_pel_size),
+              (unsigned long)(cache_ptr->pel_len),
+              (unsigned long)(cache_ptr->max_pel_len));
+
+    HDfprintf(stdout,
+              "%s  current LRU list size / length     = %ld / %lu\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->LRU_list_size),
+              (unsigned long)(cache_ptr->LRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  current clean LRU size / length    = %ld / %lu\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->cLRU_list_size),
+              (unsigned long)(cache_ptr->cLRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  current dirty LRU size / length    = %ld / %lu\n",
+              cache_ptr->prefix,
+              (long)(cache_ptr->dLRU_list_size),
+              (unsigned long)(cache_ptr->dLRU_list_len));
+
+    HDfprintf(stdout,
+              "%s  Total hits / misses / hit_rate     = %ld / %ld / %f\n",
+              cache_ptr->prefix,
+              (long)total_hits,
+              (long)total_misses,
+              hit_rate);
+
+    HDfprintf(stdout,
+              "%s  Total write / read (max) protects  = %ld / %ld (%ld)\n",
+              cache_ptr->prefix,
+              (long)total_write_protects,
+              (long)total_read_protects,
+              (long)max_read_protects);
+
+    HDfprintf(stdout,
+              "%s  Total clears / flushes             = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_clears,
+              (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",
+              cache_ptr->prefix,
+              (long)total_insertions,
+              (long)total_pinned_insertions,
+              (long)total_moves);
+
+    HDfprintf(stdout,
+	      "%s  Total entry / cache flush moves    = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_entry_flush_moves,
+              (long)total_cache_flush_moves);
+
+    HDfprintf(stdout, "%s  Total entry size incrs / decrs     = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_size_increases,
+              (long)total_size_decreases);
+
+    HDfprintf(stdout, "%s  Ttl entry/cache flush size changes = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_entry_flush_size_changes,
+              (long)total_cache_flush_size_changes);
+
+    HDfprintf(stdout,
+	      "%s  Total entry pins (dirty) / unpins  = %ld (%ld) / %ld\n",
+              cache_ptr->prefix,
+              (long)total_pins,
+	      (long)total_dirty_pins,
+              (long)total_unpins);
+
+    HDfprintf(stdout, "%s  Total pinned flushes / clears      = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_pinned_flushes,
+              (long)total_pinned_clears);
+
+    HDfprintf(stdout, "%s  MSIC: (make space in cache) calls  = %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->calls_to_msic));
+
+    if (cache_ptr->calls_to_msic > 0)
+        average_entries_skipped_per_calls_to_msic =
+            (((double)(cache_ptr->total_entries_skipped_in_msic)) /
+            ((double)(cache_ptr->calls_to_msic)));
+
+    HDfprintf(stdout, "%s  MSIC: Average/max entries skipped  = %lf / %ld\n",
+              cache_ptr->prefix,
+              (double)average_entries_skipped_per_calls_to_msic,
+              (long)(cache_ptr->max_entries_skipped_in_msic));
+
+    if(cache_ptr->calls_to_msic > 0)
+        average_dirty_pf_entries_skipped_per_call_to_msic =
+            (((double)(cache_ptr->total_dirty_pf_entries_skipped_in_msic)) /
+            ((double)(cache_ptr->calls_to_msic)));
+
+    HDfprintf(stdout, 
+              "%s  MSIC: Average/max dirty pf entries skipped  = %lf / %ld\n",
+              cache_ptr->prefix,
+              average_dirty_pf_entries_skipped_per_call_to_msic,
+              (long)(cache_ptr->max_dirty_pf_entries_skipped_in_msic));
+
+    if(cache_ptr->calls_to_msic > 0)
+        average_entries_scanned_per_calls_to_msic =
+            (((double)(cache_ptr->total_entries_scanned_in_msic)) /
+            ((double)(cache_ptr->calls_to_msic)));
+
+    HDfprintf(stdout, "%s  MSIC: Average/max entries scanned  = %lf / %ld\n",
+              cache_ptr->prefix,
+              (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",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->entries_scanned_to_make_space));
+
+    HDfprintf(stdout, "%s  MSIC: Scanned to satisfy min_clean = %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->total_entries_scanned_in_msic -
+                            cache_ptr->entries_scanned_to_make_space));
+
+    HDfprintf(stdout, 
+              "%s  slist/LRU/index 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->index_scan_restarts));
+
+    HDfprintf(stdout,
+	    "%s  cache image creations/reads/loads/size = %d / %d /%d / %Hu\n",
+              cache_ptr->prefix,
+              cache_ptr->images_created,
+              cache_ptr->images_read,
+              cache_ptr->images_loaded,
+              cache_ptr->last_image_size);
+
+    HDfprintf(stdout,
+	      "%s  prefetches / dirty prefetches      = %lld / %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->prefetches),
+              (long long)(cache_ptr->dirty_prefetches));
+
+    HDfprintf(stdout,
+	      "%s  prefetch hits/flushes/evictions    = %lld / %lld / %lld\n",
+              cache_ptr->prefix,
+              (long long)(cache_ptr->prefetch_hits),
+              (long long)(cache_ptr->flushes[H5AC_PREFETCHED_ENTRY_ID]),
+              (long long)(cache_ptr->evictions[H5AC_PREFETCHED_ENTRY_ID]));
+
+    if(cache_ptr->prefetches > 0)
+        prefetch_use_rate = 
+                   (double)100.0f * ((double)(cache_ptr->prefetch_hits)) /
+                   ((double)(cache_ptr->prefetches));
+    else
+        prefetch_use_rate = 0.0f;
+
+    HDfprintf(stdout,
+	      "%s  prefetched entry use rate          = %lf\n",
+              cache_ptr->prefix,
+              prefetch_use_rate);
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+    HDfprintf(stdout, "%s  aggregate max / min accesses       = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_accesses,
+              (int)aggregate_min_accesses);
+
+    HDfprintf(stdout, "%s  aggregate max_clears / max_flushes = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_clears,
+              (int)aggregate_max_flushes);
+
+    HDfprintf(stdout, "%s  aggregate max_size / max_pins      = %d / %d\n",
+              cache_ptr->prefix,
+              (int)aggregate_max_size,
+	      (int)aggregate_max_pins);
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if(display_detailed_stats) {
+        for(i = 0; i <= cache_ptr->max_type_id; i++) {
+            HDfprintf(stdout, "\n");
+
+            HDfprintf(stdout, "%s  Stats on %s:\n",
+                      cache_ptr->prefix,
+                      ((cache_ptr->class_table_ptr))[i]->name);
+
+            if((cache_ptr->hits[i] > 0) || (cache_ptr->misses[i] > 0))
+                hit_rate = (double)100.0f * ((double)(cache_ptr->hits[i])) /
+                          ((double)(cache_ptr->hits[i] + cache_ptr->misses[i]));
+            else
+                hit_rate = 0.0f;
+
+            HDfprintf(stdout,
+                      "%s    hits / misses / hit_rate       = %ld / %ld / %f\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->hits[i]),
+                      (long)(cache_ptr->misses[i]),
+                      hit_rate);
+
+            HDfprintf(stdout,
+                      "%s    write / read (max) protects    = %ld / %ld (%d)\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->write_protects[i]),
+                      (long)(cache_ptr->read_protects[i]),
+                      (int)(cache_ptr->max_read_protects[i]));
+
+            HDfprintf(stdout,
+                      "%s    clears / flushes               = %ld / %ld\n", 
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->clears[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",
+                      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",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->entry_flush_moves[i]),
+                      (long)(cache_ptr->cache_flush_moves[i]));
+
+            HDfprintf(stdout,
+                      "%s    size increases / decreases     = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->size_increases[i]),
+                      (long)(cache_ptr->size_decreases[i]));
+
+            HDfprintf(stdout,
+                      "%s    entry/cache flush size changes = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->entry_flush_size_changes[i]),
+                      (long)(cache_ptr->cache_flush_size_changes[i]));
+
+
+            HDfprintf(stdout,
+                      "%s    entry pins / unpins            = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->pins[i]),
+                      (long)(cache_ptr->unpins[i]));
+
+            HDfprintf(stdout,
+                      "%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]));
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+            HDfprintf(stdout,
+                      "%s    entry max / min accesses       = %d / %d\n",
+                      cache_ptr->prefix,
+                      cache_ptr->max_accesses[i],
+                      cache_ptr->min_accesses[i]);
+
+            HDfprintf(stdout,
+                      "%s    entry max_clears / max_flushes = %d / %d\n",
+                      cache_ptr->prefix,
+                      cache_ptr->max_clears[i],
+                      cache_ptr->max_flushes[i]);
+
+            HDfprintf(stdout,
+                      "%s    entry max_size / max_pins      = %d / %d\n",
+                      cache_ptr->prefix,
+                      (int)(cache_ptr->max_size[i]),
+		      (int)(cache_ptr->max_pins[i]));
+
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+        } /* end for */
+    } /* end if */
+
+    HDfprintf(stdout, "\n");
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_stats() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_stats__reset
+ *
+ * Purpose:     Reset the stats fields to their initial values.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer, 4/28/04
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+#ifndef NDEBUG
+H5C_stats__reset(H5C_t * cache_ptr)
+#else /* NDEBUG */
+#if H5C_COLLECT_CACHE_STATS
+H5C_stats__reset(H5C_t * cache_ptr)
+#else /* H5C_COLLECT_CACHE_STATS */
+H5C_stats__reset(H5C_t H5_ATTR_UNUSED * cache_ptr)
+#endif /* H5C_COLLECT_CACHE_STATS */
+#endif /* NDEBUG */
+{
+#if H5C_COLLECT_CACHE_STATS
+    int i;
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+#if H5C_COLLECT_CACHE_STATS
+    for(i = 0; i <= cache_ptr->max_type_id; i++) {
+        cache_ptr->hits[i]			= 0;
+        cache_ptr->misses[i]			= 0;
+        cache_ptr->write_protects[i]		= 0;
+        cache_ptr->read_protects[i]		= 0;
+        cache_ptr->max_read_protects[i]		= 0;
+        cache_ptr->insertions[i]		= 0;
+        cache_ptr->pinned_insertions[i]		= 0;
+        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->pins[i]	 		= 0;
+        cache_ptr->unpins[i]	 		= 0;
+        cache_ptr->dirty_pins[i]	 	= 0;
+        cache_ptr->pinned_flushes[i]	 	= 0;
+        cache_ptr->pinned_clears[i]	 	= 0;
+        cache_ptr->size_increases[i] 		= 0;
+        cache_ptr->size_decreases[i] 		= 0;
+	cache_ptr->entry_flush_size_changes[i]	= 0;
+	cache_ptr->cache_flush_size_changes[i]	= 0;
+    } /* end for */
+
+    cache_ptr->total_ht_insertions		= 0;
+    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		= 0;
+    cache_ptr->total_failed_ht_search_depth	= 0;
+
+    cache_ptr->max_index_len			= 0;
+    cache_ptr->max_index_size			= (size_t)0;
+    cache_ptr->max_clean_index_size		= (size_t)0;
+    cache_ptr->max_dirty_index_size		= (size_t)0;
+
+    cache_ptr->max_slist_len			= 0;
+    cache_ptr->max_slist_size			= (size_t)0;
+
+    cache_ptr->max_pl_len			= 0;
+    cache_ptr->max_pl_size			= (size_t)0;
+
+    cache_ptr->max_pel_len			= 0;
+    cache_ptr->max_pel_size			= (size_t)0;
+
+    cache_ptr->calls_to_msic                          = 0;
+    cache_ptr->total_entries_skipped_in_msic          = 0;
+    cache_ptr->total_dirty_pf_entries_skipped_in_msic = 0;
+    cache_ptr->total_entries_scanned_in_msic          = 0;
+    cache_ptr->max_entries_skipped_in_msic            = 0;
+    cache_ptr->max_dirty_pf_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->index_scan_restarts              = 0;
+
+    cache_ptr->images_created           = 0;
+    cache_ptr->images_read              = 0;
+    cache_ptr->images_loaded            = 0;
+    cache_ptr->last_image_size          = (hsize_t)0;
+
+    cache_ptr->prefetches               = 0;
+    cache_ptr->dirty_prefetches			= 0;
+    cache_ptr->prefetch_hits			= 0;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    for(i = 0; i <= cache_ptr->max_type_id; i++) {
+        cache_ptr->max_accesses[i]		= 0;
+        cache_ptr->min_accesses[i]		= 1000000;
+        cache_ptr->max_clears[i]		= 0;
+        cache_ptr->max_flushes[i]		= 0;
+        cache_ptr->max_size[i]			= (size_t)0;
+        cache_ptr->max_pins[i]			= 0;
+    } /* end for */
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    return;
+} /* H5C_stats__reset() */
+
+extern void
+H5C__dump_entry(H5C_t *cache_ptr, const H5C_cache_entry_t *entry_ptr,
+    hbool_t dump_parents, const char *prefix, int indent);
+
+static void
+H5C__dump_parents(H5C_t *cache_ptr, const H5C_cache_entry_t *entry_ptr, const char *prefix, int indent)
+{
+    unsigned u;
+
+    for(u = 0; u < entry_ptr->flush_dep_nparents; u++)
+        H5C__dump_entry(cache_ptr, entry_ptr->flush_dep_parent[u], TRUE, prefix, indent + 2);
+}
+
+typedef struct H5C__dump_child_ctx_t {
+    H5C_t *cache_ptr;
+    const H5C_cache_entry_t *parent;
+    hbool_t dump_parents;
+    const char *prefix;
+    int indent;
+} H5C__dump_child_ctx_t;
+
+static int
+H5C__dump_children_cb(H5C_cache_entry_t *entry_ptr, void *_ctx)
+{
+    H5C__dump_child_ctx_t *ctx = (H5C__dump_child_ctx_t *)_ctx;
+
+    if(entry_ptr->tag_info->tag != entry_ptr->addr) {
+        unsigned u;
+
+        HDassert(entry_ptr->flush_dep_nparents);
+        for(u = 0; u < entry_ptr->flush_dep_nparents; u++)
+            if(ctx->parent == entry_ptr->flush_dep_parent[u])
+                H5C__dump_entry(ctx->cache_ptr, entry_ptr, ctx->dump_parents, ctx->prefix, ctx->indent + 2);
+    } /* end if */
+
+    return(H5_ITER_CONT);
+} /* end H5C__dump_children_cb() */
+
+static void
+H5C__dump_children(H5C_t *cache_ptr, const H5C_cache_entry_t *entry_ptr,
+    hbool_t dump_parents, const char *prefix, int indent)
+{
+    H5C__dump_child_ctx_t ctx;
+
+    HDassert(entry_ptr->tag_info);
+
+    ctx.cache_ptr = cache_ptr;
+    ctx.parent = entry_ptr;
+    ctx.dump_parents = dump_parents;
+    ctx.prefix = prefix;
+    ctx.indent = indent;
+    H5C__iter_tagged_entries(cache_ptr, entry_ptr->tag_info->tag, FALSE, H5C__dump_children_cb, &ctx);
+} /* end H5C__dump_children() */
+
+void
+H5C__dump_entry(H5C_t *cache_ptr, const H5C_cache_entry_t *entry_ptr,
+    hbool_t dump_parents, const char *prefix, int indent)
+{
+    HDassert(cache_ptr);
+    HDassert(entry_ptr);
+
+    HDfprintf(stderr, "%*s%s: entry_ptr = (%a, '%s', %a, %t, %u, %u/%u)\n", indent, "", prefix, entry_ptr->addr, entry_ptr->type->name, entry_ptr->tag_info ? entry_ptr->tag_info->tag : HADDR_UNDEF, entry_ptr->is_dirty, entry_ptr->flush_dep_nparents, entry_ptr->flush_dep_nchildren, entry_ptr->flush_dep_ndirty_children);
+    if(dump_parents && entry_ptr->flush_dep_nparents)
+        H5C__dump_parents(cache_ptr, entry_ptr, "Parent", indent);
+    if(entry_ptr->flush_dep_nchildren)
+        H5C__dump_children(cache_ptr, entry_ptr, FALSE, "Child", indent);
+} /* end H5C__dump_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_dependency_exists()
+ *
+ * Purpose:	Test to see if a flush dependency relationship exists 
+ *          between the supplied parent and child.  Both parties 
+ *          are indicated by addresses so as to avoid the necessity
+ *          of protect / unprotect calls prior to this call. 
+ *
+ *          If either the parent or the child is not in the metadata 
+ *          cache, the function sets *fd_exists_ptr to FALSE.
+ *
+ *          If both are in the cache, the childs list of parents is 
+ *          searched for the proposed parent.  If the proposed parent
+ *          is found in the childs parent list, the function sets
+ *          *fd_exists_ptr to TRUE.  In all other non-error cases, 
+ *          the function sets *fd_exists_ptr FALSE.
+ *
+ * Return:      SUCCEED on success/FAIL on failure.  Note that 
+ *              *fd_exists_ptr is undefined on failure.
+ *
+ * Programmer:  John Mainzer
+ *              9/28/16
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_flush_dependency_exists(H5C_t *cache_ptr, haddr_t parent_addr, haddr_t child_addr,
+    hbool_t *fd_exists_ptr)
+{
+    hbool_t             fd_exists = FALSE;  /* whether flush dependency exists */
+    H5C_cache_entry_t *	parent_ptr;         /* Ptr to parent entry */
+    H5C_cache_entry_t *	child_ptr;          /* Ptr to child entry */
+    hbool_t             ret_value = FALSE;  /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(H5F_addr_defined(parent_addr));
+    HDassert(H5F_addr_defined(child_addr));
+    HDassert(fd_exists_ptr);
+
+    H5C__SEARCH_INDEX(cache_ptr, parent_addr, parent_ptr, FAIL)
+    H5C__SEARCH_INDEX(cache_ptr, child_addr, child_ptr, FAIL)
+
+    if(parent_ptr && child_ptr) {
+        HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(child_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+        if(child_ptr->flush_dep_nparents > 0) {
+            unsigned u;         /* Local index variable */
+
+            HDassert(child_ptr->flush_dep_parent);
+            HDassert(child_ptr->flush_dep_parent_nalloc >= child_ptr->flush_dep_nparents);
+
+            for(u = 0; u < child_ptr->flush_dep_nparents; u++) {
+                if(child_ptr->flush_dep_parent[u] == parent_ptr) {
+                    fd_exists = TRUE;
+                    HDassert(parent_ptr->flush_dep_nchildren > 0);
+                    break;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+    } /* end if */
+
+    *fd_exists_ptr = fd_exists;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_dependency_exists() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_validate_index_list
+ *
+ * Purpose:     Debugging function that scans the index 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, 9/16/16
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_validate_index_list(H5C_t *cache_ptr)
+{
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    uint32_t            len = 0;
+    int32_t		index_ring_len[H5C_RING_NTYPES];
+    size_t              size = 0;
+    size_t              clean_size = 0;
+    size_t              dirty_size = 0;
+    size_t		index_ring_size[H5C_RING_NTYPES];
+    size_t		clean_index_ring_size[H5C_RING_NTYPES];
+    size_t		dirty_index_ring_size[H5C_RING_NTYPES];
+    int			i;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    for(i = 0; i < H5C_RING_NTYPES; i++) {
+	index_ring_len[i] = 0;
+	index_ring_size[i] = 0;
+	clean_index_ring_size[i] = 0;
+	dirty_index_ring_size[i] = 0;
+    } /* end if */
+
+    if(((cache_ptr->il_head == NULL) || (cache_ptr->il_tail == NULL))
+            && (cache_ptr->il_head != cache_ptr->il_tail))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index list pointer validation failed")
+
+    if((cache_ptr->index_len == 1) && ((cache_ptr->il_head != cache_ptr->il_tail)
+            || (cache_ptr->il_head == NULL) || (cache_ptr->il_head->size != cache_ptr->index_size)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index list pointer sanity checks failed")
+
+    if((cache_ptr->index_len >= 1)
+            && ((cache_ptr->il_head == NULL)
+                || (cache_ptr->il_head->il_prev != NULL)
+                || (cache_ptr->il_tail == NULL)
+                || (cache_ptr->il_tail->il_next != NULL)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index list length sanity checks failed")
+
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+        if((entry_ptr != cache_ptr->il_head)
+                && ((entry_ptr->il_prev == NULL) || (entry_ptr->il_prev->il_next != entry_ptr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index list pointers for entry are invalid")
+
+        if((entry_ptr != cache_ptr->il_tail)
+                && ((entry_ptr->il_next == NULL) || (entry_ptr->il_next->il_prev != entry_ptr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index list pointers for entry are invalid")
+
+	HDassert(entry_ptr->ring > 0);
+	HDassert(entry_ptr->ring < H5C_RING_NTYPES);
+
+        len++;
+	index_ring_len[entry_ptr->ring] += 1;
+
+        size += entry_ptr->size;
+        index_ring_size[entry_ptr->ring] += entry_ptr->size;
+
+	if(entry_ptr->is_dirty) {
+	    dirty_size += entry_ptr->size;
+	    dirty_index_ring_size[entry_ptr->ring] += entry_ptr->size;
+	} /* end if */
+        else {
+	    clean_size += entry_ptr->size;
+	    clean_index_ring_size[entry_ptr->ring] += entry_ptr->size;
+	} /* end else */
+
+        entry_ptr = entry_ptr->il_next;
+    } /* end while */
+
+    if((cache_ptr->index_len != len) || (cache_ptr->il_len != len)
+            || (cache_ptr->index_size != size) || (cache_ptr->il_size != size)
+            || (cache_ptr->clean_index_size != clean_size)
+            || (cache_ptr->dirty_index_size != dirty_size)
+            || (clean_size + dirty_size != size))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index, clean and dirty sizes for cache are invalid")
+
+    size = 0;
+    clean_size = 0;
+    dirty_size = 0;
+    for(i = 0; i < H5C_RING_NTYPES; i++) {
+	size += clean_index_ring_size[i] + dirty_index_ring_size[i];
+	clean_size += clean_index_ring_size[i];
+	dirty_size += dirty_index_ring_size[i];
+    } /* end for */
+
+    if((cache_ptr->index_size != size)
+            || (cache_ptr->clean_index_size != clean_size)
+            || (cache_ptr->dirty_index_size != dirty_size))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Index, clean and dirty sizes for cache are invalid")
+
+done:
+    if(ret_value != SUCCEED)
+        HDassert(0);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_validate_index_list() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * 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
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_get_entry_ptr_from_addr(H5C_t *cache_ptr, haddr_t addr, void **entry_ptr_ptr)
+{
+    H5C_cache_entry_t * entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(entry_ptr_ptr);
+
+    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)++;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_entry_ptr_from_addr() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_serialization_in_progress
+ *
+ * Purpose:     Return the current value of 
+ *              cache_ptr->serialization_in_progress.
+ *
+ * Return:      Current value of cache_ptr->serialization_in_progress.
+ *
+ * Programmer:  John Mainzer
+ *		8/24/15
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+hbool_t
+H5C_get_serialization_in_progress(const H5C_t *cache_ptr)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    FUNC_LEAVE_NOAPI(cache_ptr->serialization_in_progress)
+} /* H5C_get_serialization_in_progress() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_cache_is_clean()
+ *
+ * Purpose:     Debugging function that verifies that all rings in the 
+ *		metadata cache are clean from the outermost ring, inwards
+ *		to the inner ring specified.
+ *
+ *		Returns TRUE if all specified rings are clean, and FALSE
+ *		if not.  Throws an assertion failure on error.
+ *
+ * Return:      TRUE if the indicated ring(s) are clean, and FALSE otherwise.
+ *
+ * Programmer:  John Mainzer, 6/18/16
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+hbool_t
+H5C_cache_is_clean(const H5C_t *cache_ptr, H5C_ring_t inner_ring)
+{
+    H5C_ring_t		ring = H5C_RING_USER;
+    hbool_t             ret_value = TRUE;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(inner_ring >= H5C_RING_USER);
+    HDassert(inner_ring <= H5C_RING_SB);
+
+    while(ring <= inner_ring) {
+	if(cache_ptr->dirty_index_ring_size[ring] > 0)
+            HGOTO_DONE(FALSE)
+
+	ring++;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_cache_is_clean() */
+#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
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_verify_entry_type(H5C_t *cache_ptr, haddr_t addr,
+    const H5C_class_t *expected_type, hbool_t *in_cache_ptr,
+    hbool_t *type_ok_ptr)
+{
+    H5C_cache_entry_t * entry_ptr = NULL;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(expected_type);
+    HDassert(in_cache_ptr);
+    HDassert(type_ok_ptr);
+
+    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;
+
+	if(entry_ptr->prefetched)
+	    *type_ok_ptr = (expected_type->id == entry_ptr->prefetch_type_id);
+	else
+	    *type_ok_ptr = (expected_type == entry_ptr->type);
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_verify_entry_type() */
+#endif /* NDEBUG */
+
diff --git a/src/H5Cepoch.c b/src/H5Cepoch.c
new file mode 100644
index 0000000..f8507a9
--- /dev/null
+++ b/src/H5Cepoch.c
@@ -0,0 +1,240 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cepoch.c
+ *              June 5 2004
+ *              Quincey Koziol
+ *
+ * Purpose:     Metadata cache epoch callbacks.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/****************************************************************************
+ *
+ * declarations for epoch marker cache entries.
+ *
+ * As a strategy for automatic cache size reduction, the cache may insert
+ * marker entries in the LRU list at the end of each epoch.  These markers
+ * are then used to identify entries that have not been accessed for n
+ * epochs so that they can be evicted from the cache.
+ *
+ ****************************************************************************/
+static herr_t H5C__epoch_marker_get_initial_load_size(void *udata_ptr,
+    size_t *image_len_ptr);
+static herr_t H5C__epoch_marker_get_final_load_size(const void *image_ptr,
+    size_t image_len_ptr, void *udata_ptr, size_t *actual_len);
+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);
+static herr_t H5C__epoch_marker_pre_serialize(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 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_fsf_size(const void H5_ATTR_UNUSED * thing, 
+    size_t H5_ATTR_UNUSED * fsf_size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+const H5AC_class_t H5AC_EPOCH_MARKER[1] = {{
+    /* id               = */ H5AC_EPOCH_MARKER_ID,
+    /* name             = */ "epoch marker",
+    /* mem_type         = */ H5FD_MEM_DEFAULT, /* value doesn't matter */
+    /* flags		= */ H5AC__CLASS_NO_FLAGS_SET,
+    /* get_initial_load_size = */ H5C__epoch_marker_get_initial_load_size,
+    /* get_final_load_size = */ H5C__epoch_marker_get_final_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,
+    /* fsf_size         = */ H5C__epoch_marker_fsf_size,
+}};
+
+
+/***************************************************************************
+ * Class functions for H5C__EPOCH_MAKER_TYPE:
+ *
+ * None of these functions should ever be called, so there is no point in
+ * documenting them separately.
+ *                                                     JRM - 11/16/04
+ *
+ ***************************************************************************/
+
+

+static herr_t
+H5C__epoch_marker_get_initial_load_size(void H5_ATTR_UNUSED *udata_ptr,
+    size_t H5_ATTR_UNUSED *image_len_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_get_initial_load_size() */
+
+

+static herr_t
+H5C__epoch_marker_get_final_load_size(const void H5_ATTR_UNUSED *image_ptr,
+    size_t H5_ATTR_UNUSED image_len, void H5_ATTR_UNUSED *udata_ptr,
+    size_t H5_ATTR_UNUSED *actual_len)
+{
+    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_final_get_load_size() */
+
+

+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)
+{
+    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(FALSE)
+} /* end H5C__epoch_marker_verify_chksum() */
+
+

+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 */
+
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(NULL)
+} /* end H5C__epoch_marker_deserialize() */
+
+

+static herr_t
+H5C__epoch_marker_image_len(const void H5_ATTR_UNUSED *thing,
+    size_t H5_ATTR_UNUSED *image_len_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_image_len() */
+
+

+static herr_t
+H5C__epoch_marker_pre_serialize(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,
+    haddr_t H5_ATTR_UNUSED *new_addr_ptr, size_t H5_ATTR_UNUSED *new_len_ptr,
+    unsigned H5_ATTR_UNUSED *flags_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_pre_serialize() */
+
+

+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 */
+
+    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,
+                       void H5_ATTR_UNUSED * thing)
+{
+    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_notify() */
+
+

+static herr_t
+H5C__epoch_marker_free_icr(void H5_ATTR_UNUSED * thing)
+{
+    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_free_icr() */
+
+

+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() */
+
diff --git a/src/H5Cimage.c b/src/H5Cimage.c
new file mode 100644
index 0000000..debd30c
--- /dev/null
+++ b/src/H5Cimage.c
@@ -0,0 +1,3569 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cimage.c
+ *              July 20, 2015
+ *              John Mainzer
+ *
+ * Purpose:     Functions in this file are specific to the implementation
+ *		of the metadata cache image feature.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* 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
+#define H5AC_FRIEND		/*suppress error about including H5ACpkg  */
+#include "H5ACpkg.h"            /* Metadata cache                       */
+#endif /* H5_HAVE_PARALLEL */
+#include "H5Cpkg.h"		/* Cache				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* 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 */
+
+/* Cache image buffer components, on disk */
+#define H5C__MDCI_BLOCK_SIGNATURE	"MDCI"
+#define H5C__MDCI_BLOCK_SIGNATURE_LEN	4
+#define H5C__MDCI_BLOCK_VERSION_0	0
+
+/* Metadata cache image header flags -- max 8 bits */
+#define H5C__MDCI_HEADER_HAVE_RESIZE_STATUS	0x01
+
+/* Metadata cache image entry flags -- max 8 bits */
+#define H5C__MDCI_ENTRY_DIRTY_FLAG		0x01
+#define H5C__MDCI_ENTRY_IN_LRU_FLAG		0x02
+#define H5C__MDCI_ENTRY_IS_FD_PARENT_FLAG	0x04
+#define H5C__MDCI_ENTRY_IS_FD_CHILD_FLAG	0x08
+
+/* Limits on flush dependency values, stored in 16-bit values on disk */
+#define H5C__MDCI_MAX_FD_CHILDREN		USHRT_MAX
+#define H5C__MDCI_MAX_FD_PARENTS		USHRT_MAX
+
+/* Values for image entry magic field */
+#define H5C_IMAGE_ENTRY_T_MAGIC		0x005CAC08
+#define H5C_IMAGE_ENTRY_T_BAD_MAGIC	0xBeefDead
+
+/* Maximum ring allowed in image */
+#define H5C_MAX_RING_IN_IMAGE   H5C_RING_MDFSM
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Helper routines */
+static size_t H5C__cache_image_block_entry_header_size(const H5F_t *f);
+static size_t H5C__cache_image_block_header_size(const H5F_t *f);
+static herr_t H5C__decode_cache_image_header(const H5F_t *f,
+    H5C_t *cache_ptr, const uint8_t **buf);
+#ifndef NDEBUG	/* only used in assertions */
+static herr_t H5C__decode_cache_image_entry(const H5F_t *f,
+    const H5C_t *cache_ptr, const uint8_t **buf, unsigned entry_num);
+#endif /* NDEBUG */ /* only used in assertions */
+static herr_t H5C__destroy_pf_entry_child_flush_deps(H5C_t *cache_ptr, 
+    H5C_cache_entry_t *pf_entry_ptr, H5C_cache_entry_t **fd_children);
+static herr_t H5C__encode_cache_image_header(const H5F_t *f,
+    const H5C_t *cache_ptr, uint8_t **buf);
+static herr_t H5C__encode_cache_image_entry(H5F_t *f, H5C_t *cache_ptr, 
+    uint8_t **buf, unsigned entry_num);
+static herr_t H5C__prep_for_file_close__compute_fd_heights(const H5C_t *cache_ptr);
+static void H5C__prep_for_file_close__compute_fd_heights_real(
+    H5C_cache_entry_t  *entry_ptr, uint32_t fd_height);
+static herr_t H5C__prep_for_file_close__setup_image_entries_array(H5C_t *cache_ptr);
+static herr_t H5C__prep_for_file_close__scan_entries(const H5F_t *f,
+    H5C_t *cache_ptr);
+static herr_t H5C__reconstruct_cache_contents(H5F_t *f, hid_t dxpl_id, 
+    H5C_t *cache_ptr);
+static H5C_cache_entry_t *H5C__reconstruct_cache_entry(const H5F_t *f,
+    H5C_t *cache_ptr, const uint8_t **buf);
+static herr_t H5C__write_cache_image_superblock_msg(H5F_t *f, hid_t dxpl_id, 
+    hbool_t create);
+static herr_t H5C__read_cache_image(H5F_t * f, hid_t dxpl_id, H5C_t *cache_ptr);
+static herr_t H5C__write_cache_image(H5F_t *f, hid_t dxpl_id, const H5C_t *cache_ptr);
+static herr_t H5C__construct_cache_image_buffer(H5F_t *f, H5C_t *cache_ptr);
+static herr_t H5C__free_image_entries_array(H5C_t *cache_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage H5C_cache_entry_t objects */
+H5FL_DEFINE(H5C_cache_entry_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_cache_image_pending()
+ *
+ * Purpose:     Tests to see if the load of a metadata cache image 
+ *              load is pending (i.e. will be executed on the next 
+ *              protect or insert)
+ *
+ *              Returns TRUE if a cache image load is pending, and FALSE
+ *              if not.  Throws an assertion failure on error.
+ *
+ * Return:      TRUE if a cache image load is pending, and FALSE otherwise.
+ *
+ * Programmer:  John Mainzer, 6/18/16
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5C_cache_image_pending(const H5C_t *cache_ptr)
+{
+    hbool_t             ret_value = TRUE;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    ret_value = (cache_ptr->load_image && !cache_ptr->image_loaded);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_cache_image_pending() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_cache_image_status()
+ *
+ * Purpose:     Examine the metadata cache associated with the supplied 
+ *              instance of H5F_t to determine whether the load of a 
+ *              cache image has either been queued or executed, and if 
+ *              construction of a cache image has been requested.
+ *
+ *              This done, it set *load_ci_ptr to TRUE if a cache image
+ *              has either been loaded or a load has been requested, and
+ *              to FALSE otherwise.
+ *
+ *              Similarly, set *write_ci_ptr to TRUE if construction of 
+ *              a cache image has been requested, and to FALSE otherwise.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              12/29/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_cache_image_status(H5F_t * f, hbool_t *load_ci_ptr, hbool_t *write_ci_ptr)
+{
+    H5C_t *     cache_ptr;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(load_ci_ptr);
+    HDassert(write_ci_ptr);
+ 
+    *load_ci_ptr = cache_ptr->load_image || cache_ptr->image_loaded;
+    *write_ci_ptr = cache_ptr->image_ctl.generate_image;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_cache_image_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__construct_cache_image_buffer()
+ *
+ * Purpose:     Allocate a buffer of size cache_ptr->image_len, and 
+ *		load it with an image of the metadata cache image block.
+ *
+ *		Note that by the time this function is called, the cache
+ *		should have removed all entries from its data structures.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              8/5/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__construct_cache_image_buffer(H5F_t * f, H5C_t *cache_ptr)
+{
+    uint8_t *	p;                      /* Pointer into image buffer */
+    uint32_t    chksum;
+    unsigned	u;                      /* Local index variable */
+    herr_t 	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(cache_ptr == f->shared->cache);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->image_ctl.generate_image);
+    HDassert(cache_ptr->num_entries_in_image > 0);
+    HDassert(cache_ptr->index_len == 0);
+    HDassert(cache_ptr->image_data_len > 0);
+    HDassert(cache_ptr->image_data_len <= cache_ptr->image_len);
+
+    /* Allocate the buffer in which to construct the cache image block */
+    if(NULL == (cache_ptr->image_buffer = H5MM_malloc(cache_ptr->image_len + 1)))
+	HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for cache image buffer")
+
+    /* Construct the cache image block header image */
+    p = (uint8_t *)cache_ptr->image_buffer;
+    if(H5C__encode_cache_image_header(f, cache_ptr, &p) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTENCODE, FAIL, "header image construction failed")
+    HDassert((size_t)(p - (uint8_t *)cache_ptr->image_buffer) < cache_ptr->image_data_len);
+
+    /* Construct the cache entry images */
+    for(u = 0; u < cache_ptr->num_entries_in_image; u++)
+	if(H5C__encode_cache_image_entry(f, cache_ptr, &p, u) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTENCODE, FAIL, "entry image construction failed")
+    HDassert((size_t)(p - (uint8_t *)cache_ptr->image_buffer) < cache_ptr->image_data_len);
+
+    /* Construct the adaptive resize status image -- not yet */
+
+    /* Compute the checksum and encode */
+    chksum = H5_checksum_metadata(cache_ptr->image_buffer, (size_t)(cache_ptr->image_data_len - H5F_SIZEOF_CHKSUM), 0);
+    UINT32ENCODE(p, chksum);
+    HDassert((size_t)(p - (uint8_t *)cache_ptr->image_buffer) == cache_ptr->image_data_len);
+    HDassert((size_t)(p - (uint8_t *)cache_ptr->image_buffer) <= cache_ptr->image_len);
+
+#ifndef NDEBUG
+    /* validate the metadata cache image we just constructed by decoding it
+     * and comparing the result with the original data.
+     */
+    {
+        uint32_t        old_chksum;
+        const uint8_t *	q;
+        H5C_t *	        fake_cache_ptr = NULL;
+        unsigned        v;
+        herr_t          status;      /* Status from decoding */
+
+	fake_cache_ptr = (H5C_t *)H5MM_malloc(sizeof(H5C_t));
+        HDassert(fake_cache_ptr);
+        fake_cache_ptr->magic = H5C__H5C_T_MAGIC;
+
+	/* needed for sanity checks */
+	fake_cache_ptr->image_len = cache_ptr->image_len;
+        q = (const uint8_t *)cache_ptr->image_buffer;
+        status = H5C__decode_cache_image_header(f, fake_cache_ptr, &q);
+        HDassert(status >= 0);
+
+        HDassert(NULL != p);
+        HDassert(fake_cache_ptr->num_entries_in_image == cache_ptr->num_entries_in_image);
+
+	fake_cache_ptr->image_entries = (H5C_image_entry_t *)H5MM_malloc(sizeof(H5C_image_entry_t) *
+                (size_t)(fake_cache_ptr->num_entries_in_image + 1));
+	HDassert(fake_cache_ptr->image_entries);
+
+        for(u = 0; u < fake_cache_ptr->num_entries_in_image; u++) {
+	    (fake_cache_ptr->image_entries)[u].magic = H5C_IMAGE_ENTRY_T_MAGIC;
+            (fake_cache_ptr->image_entries)[u].image_ptr = NULL;
+
+	    /* touch up f->shared->cache to satisfy sanity checks... */
+            f->shared->cache = fake_cache_ptr;
+	    status = H5C__decode_cache_image_entry(f, fake_cache_ptr, &q, u);
+	    HDassert(status >= 0);
+
+	    /* ...and then return f->shared->cache to its correct value */
+            f->shared->cache = cache_ptr;
+
+	    /* verify expected contents */
+	    HDassert((cache_ptr->image_entries)[u].addr == (fake_cache_ptr->image_entries)[u].addr);
+	    HDassert((cache_ptr->image_entries)[u].size == (fake_cache_ptr->image_entries)[u].size);
+	    HDassert((cache_ptr->image_entries)[u].type_id == (fake_cache_ptr->image_entries)[u].type_id);
+	    HDassert((cache_ptr->image_entries)[u].lru_rank == (fake_cache_ptr->image_entries)[u].lru_rank);
+	    HDassert((cache_ptr->image_entries)[u].is_dirty == (fake_cache_ptr->image_entries)[u].is_dirty);
+	    /* don't check image_fd_height as it is not stored in 
+             * the metadata cache image block.
+             */
+	    HDassert((cache_ptr->image_entries)[u].fd_child_count == (fake_cache_ptr->image_entries)[u].fd_child_count);
+	    HDassert((cache_ptr->image_entries)[u].fd_dirty_child_count == (fake_cache_ptr->image_entries)[u].fd_dirty_child_count);
+	    HDassert((cache_ptr->image_entries)[u].fd_parent_count == (fake_cache_ptr->image_entries)[u].fd_parent_count);
+
+	    for(v = 0; v < (cache_ptr->image_entries)[u].fd_parent_count; v++)
+		HDassert((cache_ptr->image_entries)[u].fd_parent_addrs[v] == (fake_cache_ptr->image_entries)[u].fd_parent_addrs[v]);
+
+	    /* free the fd_parent_addrs array if it exists */
+	    if((fake_cache_ptr->image_entries)[u].fd_parent_addrs) {
+		HDassert((fake_cache_ptr->image_entries)[u].fd_parent_count > 0);
+		(fake_cache_ptr->image_entries)[u].fd_parent_addrs = (haddr_t *)H5MM_xfree((fake_cache_ptr->image_entries)[u].fd_parent_addrs);
+		(fake_cache_ptr->image_entries)[u].fd_parent_count = 0;
+	    } /* end if */
+            else 
+		HDassert((fake_cache_ptr->image_entries)[u].fd_parent_count == 0);
+
+	    HDassert((cache_ptr->image_entries)[u].image_ptr);
+            HDassert((fake_cache_ptr->image_entries)[u].image_ptr);
+            HDassert(!HDmemcmp((cache_ptr->image_entries)[u].image_ptr,
+                               (fake_cache_ptr->image_entries)[u].image_ptr,
+                               (cache_ptr->image_entries)[u].size));
+
+	    (fake_cache_ptr->image_entries)[u].image_ptr = H5MM_xfree((fake_cache_ptr->image_entries)[u].image_ptr);
+	} /* end for */
+
+        HDassert((size_t)(q - (const uint8_t *)cache_ptr->image_buffer) == cache_ptr->image_data_len - H5F_SIZEOF_CHKSUM);
+
+        /* compute the checksum  */
+        old_chksum = chksum;
+        chksum = H5_checksum_metadata(cache_ptr->image_buffer, (size_t)(cache_ptr->image_data_len - H5F_SIZEOF_CHKSUM), 0);
+	HDassert(chksum == old_chksum);
+
+	fake_cache_ptr->image_entries = (H5C_image_entry_t *)H5MM_xfree(fake_cache_ptr->image_entries);
+	fake_cache_ptr = (H5C_t *)H5MM_xfree(fake_cache_ptr);
+    } /* end block */
+#endif /* NDEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__construct_cache_image_buffer() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__generate_cache_image()
+ *
+ * Purpose:	Generate the cache image and write it to the file, if
+ *		directed.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  Quincey Koziol
+ *              1/26/17
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__generate_cache_image(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr)
+{
+    herr_t 	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(cache_ptr == f->shared->cache);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Construct cache image */
+    if(H5C__construct_cache_image_buffer(f, cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't create metadata cache image")
+
+    /* Free image entries array */
+    if(H5C__free_image_entries_array(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't free image entries array")
+
+    /* Write cache image block if so configured */
+    if(cache_ptr->image_ctl.flags & H5C_CI__GEN_MDC_IMAGE_BLK) {
+        if(H5C__write_cache_image(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't write metadata cache image block to file")
+
+        H5C__UPDATE_STATS_FOR_CACHE_IMAGE_CREATE(cache_ptr);
+    } /* end if */
+
+    /* Free cache image buffer */
+    HDassert(cache_ptr->image_buffer);
+    cache_ptr->image_buffer = H5MM_xfree(cache_ptr->image_buffer);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__generate_cache_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__deserialize_prefetched_entry()
+ *
+ * Purpose:     Deserialize the supplied prefetched entry entry, and return
+ *		a pointer to the deserialized entry in *entry_ptr_ptr. 
+ *		If successful, remove the prefetched entry from the cache,
+ *		and free it.  Insert the deserialized entry into the cache.
+ *
+ *		Note that the on disk image of the entry is not freed -- 
+ *		a pointer to it is stored in the deserialized entries'
+ *		image_ptr field, and its image_up_to_date field is set to
+ *		TRUE unless the entry is dirtied by the deserialize call.
+ *
+ *		If the prefetched entry is a flush dependency child,
+ *		destroy that flush dependency prior to calling the 
+ *		deserialize callback.  If appropriate, the flush dependency
+ *		relationship will be recreated by the cache client.
+ *
+ *		If the prefetched entry is a flush dependency parent,
+ *		destroy the flush dependency relationship with all its 
+ *		children.  As all these children must be prefetched entries,
+ *		recreate these flush dependency relationships with 
+ *		deserialized entry after it is inserted in the cache.
+ *
+ *		Since deserializing a prefetched entry is semantically 
+ *		equivalent to a load, issue an entry loaded nofification 
+ *		if the notify callback is defined.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ *		Note that *entry_ptr_ptr is undefined on failure.
+ *
+ * Programmer:  John Mainzer, 8/10/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__deserialize_prefetched_entry(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr,
+    H5C_cache_entry_t **entry_ptr_ptr, const H5C_class_t *type,
+    haddr_t addr, void *udata)
+{
+    hbool_t		dirty = FALSE;  /* Flag indicating whether thing was 
+                                         * dirtied during deserialize 
+                                         */
+    size_t              len;            /* Size of image in file */
+    void *		thing = NULL;   /* Pointer to thing loaded */
+    H5C_cache_entry_t * pf_entry_ptr;   /* pointer to the prefetched entry   */
+                                        /* supplied in *entry_ptr_ptr.       */
+    H5C_cache_entry_t *	ds_entry_ptr;   /* Alias for thing loaded, as cache 
+                                         * entry 
+                                         */
+    H5C_cache_entry_t** fd_children = NULL; /* Pointer to a dynamically      */
+                                        /* allocated array of pointers to    */
+                                        /* the flush dependency children of  */
+                                        /* the prefetched entry, or NULL if  */
+                                        /* that array does not exist.        */
+    unsigned            flush_flags = (H5C__FLUSH_INVALIDATE_FLAG | 
+				       H5C__FLUSH_CLEAR_ONLY_FLAG);
+    int			i;
+    herr_t      	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(f->shared->cache == cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry_ptr_ptr);
+    HDassert(*entry_ptr_ptr);
+    pf_entry_ptr = *entry_ptr_ptr;
+    HDassert(pf_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(pf_entry_ptr->type);
+    HDassert(pf_entry_ptr->type->id == H5AC_PREFETCHED_ENTRY_ID);
+    HDassert(pf_entry_ptr->prefetched);
+    HDassert(pf_entry_ptr->image_up_to_date);
+    HDassert(pf_entry_ptr->image_ptr);
+    HDassert(pf_entry_ptr->size > 0);
+    HDassert(pf_entry_ptr->addr == addr);
+    HDassert(type);
+    HDassert(type->id == pf_entry_ptr->prefetch_type_id);
+    HDassert(type->mem_type == cache_ptr->class_table_ptr[type->id]->mem_type);
+
+    /* verify absence of prohibited or unsupported type flag combinations */
+    HDassert(!(type->flags & H5C__CLASS_SKIP_READS));
+ 
+    /* Can't see how skip reads could be usefully combined with 
+     * either the speculative read flag.  Hence disallow.
+     */
+    HDassert(!((type->flags & H5C__CLASS_SKIP_READS) &&
+               (type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG)));
+    HDassert(H5F_addr_defined(addr));
+    HDassert(type->get_initial_load_size);
+    HDassert(type->deserialize);
+
+    /* if *pf_entry_ptr is a flush dependency child, destroy all such
+     * relationships now.  The client will restore the relationship(s) with
+     * the deserialized entry if appropriate.
+     */
+    HDassert(pf_entry_ptr->fd_parent_count == pf_entry_ptr->flush_dep_nparents);
+    for(i = (int)(pf_entry_ptr->fd_parent_count) - 1; i >= 0; i--) {
+        HDassert(pf_entry_ptr->flush_dep_parent);
+        HDassert(pf_entry_ptr->flush_dep_parent[i]);
+        HDassert(pf_entry_ptr->flush_dep_parent[i]->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(pf_entry_ptr->flush_dep_parent[i]->flush_dep_nchildren > 0);
+        HDassert(pf_entry_ptr->fd_parent_addrs);
+        HDassert(pf_entry_ptr->flush_dep_parent[i]->addr == pf_entry_ptr->fd_parent_addrs[i]);
+        
+        if(H5C_destroy_flush_dependency(pf_entry_ptr->flush_dep_parent[i], pf_entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "can't destroy pf entry parent flush dependency")
+
+        pf_entry_ptr->fd_parent_addrs[i] = HADDR_UNDEF;
+    } /* end for */
+    HDassert(pf_entry_ptr->flush_dep_nparents == 0);
+
+    /* If *pf_entry_ptr is a flush dependency parent, destroy its flush 
+     * dependency relationships with all its children (which must be 
+     * prefetched entries as well).
+     *
+     * These flush dependency relationships will have to be restored 
+     * after the deserialized entry is inserted into the cache in order
+     * to transfer these relationships to the new entry.  Hence save the
+     * pointers to the flush dependency children of *pf_enty_ptr for later
+     * use.
+     */
+    if(pf_entry_ptr->fd_child_count > 0) {
+        if(NULL == (fd_children = (H5C_cache_entry_t **)H5MM_calloc(sizeof(H5C_cache_entry_t **) * (size_t)(pf_entry_ptr->fd_child_count + 1))))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for fd child ptr array")
+
+        if(H5C__destroy_pf_entry_child_flush_deps(cache_ptr, pf_entry_ptr, fd_children) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "can't destroy pf entry child flush dependency(s).")
+    } /* end if */
+
+    /* Since the size of the on disk image is known exactly, there is 
+     * no need for either a call to the get_initial_load_size() callback, 
+     * or retries if the H5C__CLASS_SPECULATIVE_LOAD_FLAG flag is set.
+     * Similarly, there is no need to clamp possible reads beyond
+     * EOF.
+     */
+    len = pf_entry_ptr->size;
+
+    /* Deserialize the prefetched on-disk image of the entry into the 
+     * native memory form 
+     */
+    if(NULL == (thing = type->deserialize(pf_entry_ptr->image_ptr, len, udata, &dirty)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, FAIL, "Can't deserialize image")
+    ds_entry_ptr = (H5C_cache_entry_t *)thing;
+
+    /* In general, an entry should be clean just after it is loaded.
+     *
+     * However, when this code is used in the metadata cache, it is
+     * possible that object headers will be dirty at this point, as
+     * the deserialize function will alter object headers if necessary to
+     * fix an old bug.
+     *
+     * In the following assert:
+     *
+     * 	HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6 ) );
+     *
+     * 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.
+     *
+     * Note that at present, dirty can't be set to true with prefetched 
+     * entries.  However this may change, so include this functionality
+     * against that posibility.
+     *
+     * Also, note that it is possible for a prefetched entry to be dirty --
+     * hence the value assigned to ds_entry_ptr->is_dirty below.
+     */
+
+    HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6) );
+
+    ds_entry_ptr->magic                     	= H5C__H5C_CACHE_ENTRY_T_MAGIC;
+    ds_entry_ptr->cache_ptr                 	= f->shared->cache;
+    ds_entry_ptr->addr                      	= addr;
+    ds_entry_ptr->size                      	= len;
+    HDassert(ds_entry_ptr->size < H5C_MAX_ENTRY_SIZE);
+    ds_entry_ptr->image_ptr                 	= pf_entry_ptr->image_ptr;
+    ds_entry_ptr->image_up_to_date          	= !dirty;
+    ds_entry_ptr->type                      	= type;
+    ds_entry_ptr->is_dirty	            	= dirty | pf_entry_ptr->is_dirty;
+    ds_entry_ptr->dirtied                   	= FALSE;
+    ds_entry_ptr->is_protected              	= FALSE;
+    ds_entry_ptr->is_read_only              	= FALSE;
+    ds_entry_ptr->ro_ref_count              	= 0;
+    ds_entry_ptr->is_pinned                 	= FALSE;
+    ds_entry_ptr->in_slist                  	= FALSE;
+    ds_entry_ptr->flush_marker              	= FALSE;
+#ifdef H5_HAVE_PARALLEL
+    ds_entry_ptr->clear_on_unprotect        	= FALSE;
+    ds_entry_ptr->flush_immediately         	= FALSE;
+    ds_entry_ptr->coll_access               	= FALSE;
+#endif /* H5_HAVE_PARALLEL */
+    ds_entry_ptr->flush_in_progress         	= FALSE;
+    ds_entry_ptr->destroy_in_progress       	= FALSE;
+
+    ds_entry_ptr->ring		            	= pf_entry_ptr->ring;
+
+    /* Initialize flush dependency height fields */
+    ds_entry_ptr->flush_dep_parent          	= NULL;
+    ds_entry_ptr->flush_dep_nparents        	= 0;
+    ds_entry_ptr->flush_dep_parent_nalloc   	= 0;
+    ds_entry_ptr->flush_dep_nchildren       	= 0;
+    ds_entry_ptr->flush_dep_ndirty_children 	= 0;
+    ds_entry_ptr->flush_dep_nunser_children 	= 0;
+
+    /* Initialize fields supporting the hash table: */
+    ds_entry_ptr->ht_next                   	= NULL;
+    ds_entry_ptr->ht_prev                   	= NULL;
+    ds_entry_ptr->il_next                   	= NULL;
+    ds_entry_ptr->il_prev                   	= NULL;
+
+    /* Initialize fields supporting replacement policies: */
+    ds_entry_ptr->next                      	= NULL;
+    ds_entry_ptr->prev                      	= NULL;
+    ds_entry_ptr->aux_next                  	= NULL;
+    ds_entry_ptr->aux_prev                  	= NULL;
+#ifdef H5_HAVE_PARALLEL
+    pf_entry_ptr->coll_next                 	= NULL;
+    pf_entry_ptr->coll_prev                 	= NULL;
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Initialize cache image related fields */
+    ds_entry_ptr->include_in_image          	= FALSE;
+    ds_entry_ptr->lru_rank	            	= 0;
+    ds_entry_ptr->image_dirty	            	= FALSE;
+    ds_entry_ptr->fd_parent_count           	= 0;
+    ds_entry_ptr->fd_parent_addrs           	= NULL;
+    ds_entry_ptr->fd_child_count            	= pf_entry_ptr->fd_child_count;
+    ds_entry_ptr->fd_dirty_child_count      	= 0;
+    ds_entry_ptr->image_fd_height           	= 0;
+    ds_entry_ptr->prefetched	            	= FALSE;
+    ds_entry_ptr->prefetch_type_id          	= 0;
+    ds_entry_ptr->age		          	= 0;
+    ds_entry_ptr->prefetched_dirty              = pf_entry_ptr->prefetched_dirty;
+#ifndef NDEBUG  /* debugging field */
+    ds_entry_ptr->serialization_count           = 0;
+#endif /* NDEBUG */
+
+    H5C__RESET_CACHE_ENTRY_STATS(ds_entry_ptr);
+
+    /* Apply to to the newly deserialized entry */
+    if(H5C__tag_entry(cache_ptr, ds_entry_ptr, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "Cannot tag metadata entry")
+
+    /* We have successfully deserialized the prefetched entry.
+     *
+     * Before we return a pointer to the deserialized entry, we must remove
+     * the prefetched entry from the cache, discard it, and replace it with 
+     * the deserialized entry.  Note that we do not free the prefetched 
+     * entries image, as that has been transferred to the deserialized
+     * entry.
+     *
+     * Also note that we have not yet restored any flush dependencies.  This
+     * must wait until the deserialized entry is inserted in the cache.
+     *
+     * To delete the prefetched entry from the cache:
+     *
+     *  1) Set pf_entry_ptr->image_ptr to NULL.  Since we have already
+     *     transferred the buffer containing the image to *ds_entry_ptr,
+     *	   this is not a memory leak.
+     * 
+     *  2) Call H5C__flush_single_entry() with the H5C__FLUSH_INVALIDATE_FLAG
+     *     and H5C__FLUSH_CLEAR_ONLY_FLAG flags set.
+     */
+    pf_entry_ptr->image_ptr = NULL; 
+    if(pf_entry_ptr->is_dirty) {
+        HDassert(pf_entry_ptr->in_slist);
+        flush_flags |= H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG;
+    } /* end if */
+
+    if(H5C__flush_single_entry(f, dxpl_id, pf_entry_ptr, flush_flags) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "can't expunge prefetched entry")
+
+#ifndef NDEGUG /* verify deletion */
+    H5C__SEARCH_INDEX(cache_ptr, addr, pf_entry_ptr, FAIL);
+
+    HDassert(NULL == pf_entry_ptr);
+#endif /* NDEBUG */
+
+    /* Insert the deserialized entry into the cache.  */
+    H5C__INSERT_IN_INDEX(cache_ptr, ds_entry_ptr, FAIL)
+
+    HDassert(!ds_entry_ptr->in_slist);
+    if(ds_entry_ptr->is_dirty)
+        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, ds_entry_ptr, FAIL)
+
+    H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, ds_entry_ptr, FAIL)
+
+    /* Deserializing a prefetched entry is the conceptual equivalent of 
+     * loading it from file.  If the deserialized entry has a notify callback,
+     * send an "after load" notice now that the deserialized entry is fully
+     * integrated into the cache.
+     */
+    if(ds_entry_ptr->type->notify &&
+            (ds_entry_ptr->type->notify)(H5C_NOTIFY_ACTION_AFTER_LOAD, ds_entry_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry loaded into cache")
+
+    /* Restore flush dependencies with the flush dependency children of 
+     * of the prefetched entry.  Note that we must protect *ds_entry_ptr 
+     * before the call to avoid triggering sanity check failures, and 
+     * then unprotect it afterwards.
+     */
+    i = 0;
+    if(fd_children != NULL) {
+        H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, ds_entry_ptr, FAIL)
+        ds_entry_ptr->is_protected = TRUE;
+        while(fd_children[i] != NULL) {
+            /* Sanity checks */
+            HDassert((fd_children[i])->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert((fd_children[i])->prefetched);
+            HDassert((fd_children[i])->fd_parent_count > 0);
+            HDassert((fd_children[i])->fd_parent_addrs);
+
+#ifndef NDEBUG
+            {
+                int j;
+                hbool_t found;
+
+                j = 0;
+                found = FALSE;
+                while((j < (int)((fd_children[i])->fd_parent_count)) && (!found)) {
+                    if((fd_children[i])->fd_parent_addrs[j] == ds_entry_ptr->addr)
+                        found = TRUE;
+
+                    j++;
+                } /* end while */
+                HDassert(found);
+            }
+#endif /* NDEBUG */
+
+            if(H5C_create_flush_dependency(ds_entry_ptr, fd_children[i]) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "Can't restore child flush dependency")
+
+            i++;
+        } /* end while */
+
+        H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, ds_entry_ptr, FAIL);
+        ds_entry_ptr->is_protected = FALSE;
+    } /* end if ( fd_children != NULL ) */
+    HDassert((unsigned)i == ds_entry_ptr->fd_child_count);
+
+    ds_entry_ptr->fd_child_count = 0;
+    H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr)
+
+    /* finally, pass ds_entry_ptr back to the caller */
+    *entry_ptr_ptr = ds_entry_ptr;
+
+done:
+    if(fd_children)
+        fd_children = (H5C_cache_entry_t **)H5MM_xfree((void *)fd_children);
+
+    /* Release resources on error */
+    if(FAIL == ret_value)
+        if(thing && type->free_icr(thing) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "free_icr callback failed")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__deserialize_prefetched_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__free_image_entries_array
+ *
+ * Purpose:     If the image entries array exists, free the image 
+ *		associated with each entry, and then free the image 
+ *		entries array proper.
+ *
+ *		Note that by the time this function is called, the cache
+ *		should have removed all entries from its data structures.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              8/4/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__free_image_entries_array(H5C_t * cache_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->image_ctl.generate_image);
+    HDassert(cache_ptr->index_len == 0);
+
+    /* Check for entries to free */
+    if(cache_ptr->image_entries != NULL) {
+        unsigned u;     /* Local index variable */
+
+        for(u = 0; u < cache_ptr->num_entries_in_image; u++) {
+            H5C_image_entry_t *ie_ptr;          /* Image entry to release */
+
+            /* Get pointer to image entry */
+ 	    ie_ptr = &((cache_ptr->image_entries)[u]);
+
+            /* Sanity checks */ 
+	    HDassert(ie_ptr);
+            HDassert(ie_ptr->magic == H5C_IMAGE_ENTRY_T_MAGIC);
+	    HDassert(ie_ptr->image_ptr);
+
+	    /* Free the parent addrs array if appropriate */
+	    if(ie_ptr->fd_parent_addrs) {
+		HDassert(ie_ptr->fd_parent_count > 0);
+
+		ie_ptr->fd_parent_addrs = (haddr_t *)H5MM_xfree(ie_ptr->fd_parent_addrs);
+            } /* end if */
+            else
+		HDassert(ie_ptr->fd_parent_count == 0);
+
+            /* Free the image */
+            ie_ptr->image_ptr = H5MM_xfree(ie_ptr->image_ptr);
+
+	    /* Set magic field to bad magic so we can detect freed entries */
+	    ie_ptr->magic = H5C_IMAGE_ENTRY_T_BAD_MAGIC;
+	} /* end for */
+
+	/* Free the image entries array */
+	cache_ptr->image_entries = (H5C_image_entry_t *)H5MM_xfree(cache_ptr->image_entries);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C__free_image_entries_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_force_cache_image_load()
+ *
+ * Purpose:     On rare occasions, it is necessary to run 
+ *		H5MF_tidy_self_referential_fsm_hack() prior to the first
+ *              metadata cache access.  This is a problem as if there is a 
+ *              cache image at the end of the file, that routine will 
+ *              discard it.
+ *
+ *              We solve this issue by calling this function, which will
+ *		load the cache image and then call 
+ *              H5MF_tidy_self_referential_fsm_hack() to discard it.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              1/11/17
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_force_cache_image_load(H5F_t *f, hid_t dxpl_id)
+{
+    H5C_t *cache_ptr;
+    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(cache_ptr->load_image);
+
+    /* Load the cache image, if requested */
+    if(cache_ptr->load_image) {
+        cache_ptr->load_image = FALSE;
+        if(H5C__load_cache_image(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, FAIL, "can't load cache image")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_force_cache_image_load() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_image_config
+ *
+ * Purpose:     Copy the current configuration for cache image generation
+ *              on file close into the instance of H5C_cache_image_ctl_t
+ *              pointed to by config_ptr.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              7/3/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_cache_image_config(const H5C_t * cache_ptr,
+    H5C_cache_image_ctl_t *config_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache_ptr on entry")
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad config_ptr on entry")
+
+    *config_ptr = cache_ptr->image_ctl;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_cache_image_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_image_stats
+ *
+ * Purpose:     Prints statistics specific to the cache image.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              10/26/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+#if H5C_COLLECT_CACHE_STATS
+H5C_image_stats(H5C_t * cache_ptr, hbool_t print_header)
+#else /* H5C_COLLECT_CACHE_STATS */
+H5C_image_stats(H5C_t * cache_ptr, hbool_t H5_ATTR_UNUSED print_header)
+#endif /* H5C_COLLECT_CACHE_STATS */
+{
+#if H5C_COLLECT_CACHE_STATS
+    int         i;
+    int64_t     total_hits = 0;
+    int64_t     total_misses = 0;
+    double      hit_rate;
+    double      prefetch_use_rate;
+#endif /* H5C_COLLECT_CACHE_STATS */
+    herr_t      ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(!cache_ptr || cache_ptr->magic != H5C__H5C_T_MAGIC)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr")
+
+#if H5C_COLLECT_CACHE_STATS
+    for(i = 0; i <= cache_ptr->max_type_id; i++) {
+        total_hits              += cache_ptr->hits[i];
+        total_misses            += cache_ptr->misses[i];
+    } /* end for */
+
+    if((total_hits > 0) || (total_misses > 0))
+        hit_rate = (double)100.0f * ((double)(total_hits)) / ((double)(total_hits + total_misses));
+    else
+        hit_rate = 0.0f;
+
+    if(cache_ptr->prefetches > 0)
+        prefetch_use_rate = (double)100.0f * ((double)(cache_ptr->prefetch_hits)) /
+                   ((double)(cache_ptr->prefetches));
+    else
+        prefetch_use_rate = 0.0f;
+
+    if(print_header) {
+        HDfprintf(stdout,
+           "\nhit     prefetches      prefetch              image  pf hit\n");
+        HDfprintf(stdout,
+             "rate:   total:  dirty:  hits:  flshs:  evct:  size:  rate:\n");
+    } /* end if */
+
+    HDfprintf(stdout,
+           "%3.1lf    %5lld   %5lld   %5lld  %5lld   %5lld   %5lld   %3.1lf\n",
+            hit_rate,
+            (long long)(cache_ptr->prefetches),
+            (long long)(cache_ptr->dirty_prefetches),
+            (long long)(cache_ptr->prefetch_hits),
+            (long long)(cache_ptr->flushes[H5AC_PREFETCHED_ENTRY_ID]),
+            (long long)(cache_ptr->evictions[H5AC_PREFETCHED_ENTRY_ID]),
+            (long long)(cache_ptr->last_image_size),
+            prefetch_use_rate);
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_image_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__read_cache_image
+ *
+ * Purpose:	Load the metadata cache image from the specified location
+ *		in the file, and return it in the supplied buffer.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/16/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__read_cache_image(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(cache_ptr);
+    HDassert(H5F_addr_defined(cache_ptr->image_addr));
+    HDassert(cache_ptr->image_len > 0);
+    HDassert(cache_ptr->image_buffer);
+
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_aux_t *aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+    int mpi_result;
+
+    if ( ( NULL == aux_ptr ) || ( aux_ptr->mpi_rank == 0 ) ) {
+
+	HDassert((NULL == aux_ptr) || 
+                 (aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC));
+#endif /* H5_HAVE_PARALLEL */
+
+	/* Read the buffer (if serial access, or rank 0 of parallel access) */
+        if ( H5F_block_read(f, H5FD_MEM_SUPER, cache_ptr->image_addr, 
+                            cache_ptr->image_len, dxpl_id, 
+                            cache_ptr->image_buffer) < 0)
+
+            HGOTO_ERROR(H5E_CACHE, H5E_READERROR, FAIL, \
+                        "Can't read metadata cache image block")
+
+        H5C__UPDATE_STATS_FOR_CACHE_IMAGE_READ(cache_ptr)
+
+#ifdef H5_HAVE_PARALLEL
+	if ( aux_ptr ) {
+
+	    /* Broadcast cache image */
+            if ( MPI_SUCCESS != 
+                 (mpi_result = MPI_Bcast(cache_ptr->image_buffer, 
+                                         (int)cache_ptr->image_len, MPI_BYTE, 
+                                         0, aux_ptr->mpi_comm)) )
+
+                HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+
+        } /* end if */
+    } /* end if */
+    else if ( aux_ptr ) {
+
+        /* Retrieve the contents of the metadata cache image from process 0 */
+        if ( MPI_SUCCESS != 
+             (mpi_result = MPI_Bcast(cache_ptr->image_buffer, 
+                                     (int)cache_ptr->image_len, MPI_BYTE, 
+                                     0, aux_ptr->mpi_comm)) )
+
+            HMPI_GOTO_ERROR(FAIL, "can't receive cache image MPI_Bcast", \
+                            mpi_result)
+    } /* end else-if */
+} /* end block */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__read_cache_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__load_cache_image
+ *
+ * Purpose:     Read the cache image superblock extension message and
+ *		delete it if so directed.
+ *
+ *		Then load the cache image block at the specified location,
+ *		decode it, and insert its contents into the metadata
+ *		cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *		7/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__load_cache_image(H5F_t *f, hid_t dxpl_id)
+{
+    H5C_t *             cache_ptr;
+    herr_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* If the image address is defined, load the image, decode it, 
+     * and insert its contents into the metadata cache. 
+     *
+     * Note that under normal operating conditions, it is an error if the 
+     * image address is HADDR_UNDEF.  However, to facilitate testing,
+     * we allow this special value of the image address which means that
+     * no image exists, and that the load operation should be skipped 
+     * silently.  
+     */
+    if(H5F_addr_defined(cache_ptr->image_addr)) {
+        /* Sanity checks */
+	HDassert(cache_ptr->image_len > 0);
+        HDassert(cache_ptr->image_buffer == NULL);
+
+	/* Allocate space for the image */
+        if(NULL == (cache_ptr->image_buffer = H5MM_malloc(cache_ptr->image_len + 1)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for cache image buffer")
+
+	/* Load the image from file */
+	if(H5C__read_cache_image(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_READERROR, FAIL, "Can't read metadata cache image block")
+
+	/* Reconstruct cache contents, from image */
+	if(H5C__reconstruct_cache_contents(f, dxpl_id, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTDECODE, FAIL, "Can't reconstruct cache contents from image block")
+
+	/* Free the image buffer */
+        cache_ptr->image_buffer = H5MM_xfree(cache_ptr->image_buffer);
+
+        /* Update stats -- must do this now, as we are about
+         * to discard the size of the cache image.
+         */
+        H5C__UPDATE_STATS_FOR_CACHE_IMAGE_LOAD(cache_ptr)
+
+        cache_ptr->image_loaded = TRUE;
+    } /* end if */
+
+    /* If directed, free the on disk metadata cache image */
+    if(cache_ptr->delete_image) {
+        if(H5F_super_ext_remove_msg(f, dxpl_id, H5O_MDCI_MSG_ID) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove metadata cache image message from superblock extension")
+
+        /* Reset image block values */
+        cache_ptr->image_len = 0;
+        cache_ptr->image_data_len = 0;
+        cache_ptr->image_addr = HADDR_UNDEF;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__load_cache_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_load_cache_image_on_next_protect()
+ *
+ * Purpose:     Note the fact that a metadata cache image superblock 
+ *		extension message exists, along with the base address
+ *		and length of the metadata cache image block.
+ *
+ *		Once this notification is received the metadata cache 
+ *		image block must be read, decoded, and loaded into the 
+ *		cache on the next call to H5C_protect().
+ *
+ *		Further, if the file is opened R/W, the metadata cache 
+ *		image superblock extension message must be deleted from 
+ *		the superblock extension and the image block freed
+ *
+ *		Contrawise, if the file is openened R/O, the metadata
+ *		cache image superblock extension message and image block
+ *		must be left as is.  Further, any dirty entries in the
+ *		cache image block must be marked as clean to avoid 
+ *		attempts to write them on file close.
+ *
+ * Return:      SUCCEED 
+ *
+ * Programmer:  John Mainzer
+ *		7/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_load_cache_image_on_next_protect(H5F_t *f, haddr_t addr, hsize_t len,
+    hbool_t rw)
+{
+    H5C_t *cache_ptr;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Set information needed to load cache image */
+    cache_ptr->image_addr   = addr,
+    cache_ptr->image_len    = len;
+    cache_ptr->load_image   = TRUE;
+    cache_ptr->delete_image = rw;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_load_cache_image_on_next_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__image_entry_cmp
+ *
+ * Purpose:     Comparison callback for qsort(3) on image entries.
+ *		Entries are sorted first by flush dependency height,
+ *		and then by LRU rank.
+ *
+ * Note:        Entries with a _greater_ flush dependency height should
+ *		be sorted earlier than entries with lower heights, since
+ *		leafs in the flush dependency graph are at height 0, and their
+ *		parents need to be earlier in the image, so that they can
+ *		construct their flush dependencies when decoded.
+ *
+ * Return:      An integer less than, equal to, or greater than zero if the
+ *		first entry is considered to be respectively less than,
+ *		equal to, or greater than the second.
+ *
+ * Programmer:  Quincey Koziol
+ *		1/20/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5C__image_entry_cmp(const void *_entry1, const void *_entry2)
+{
+    const H5C_image_entry_t *entry1 = (const H5C_image_entry_t *)_entry1;  /* Pointer to first image entry to compare */
+    const H5C_image_entry_t *entry2 = (const H5C_image_entry_t *)_entry2;  /* Pointer to second image entry to compare */
+    int ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(entry1);
+    HDassert(entry2);
+
+    if(entry1->image_fd_height > entry2->image_fd_height)
+        ret_value = -1;
+    else if(entry1->image_fd_height < entry2->image_fd_height)
+        ret_value = 1;
+    else {
+        /* Sanity check */
+        HDassert(entry1->lru_rank >= -1);
+        HDassert(entry2->lru_rank >= -1);
+
+        if(entry1->lru_rank < entry2->lru_rank)
+            ret_value = -1;
+        else if(entry1->lru_rank > entry2->lru_rank)
+            ret_value = 1;
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__image_entry_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prep_image_for_file_close
+ *
+ * Purpose:     The objective of the call is to allow the metadata cache 
+ *		to do any preparatory work prior to generation of a 
+ *		cache image.
+ *
+ *		In particular, the cache must 
+ *
+ *		1) serialize all its entries,
+ *
+ *		2) compute the size of the metadata cache image, 
+ *
+ *		3) allocate space for the metadata cache image, and
+ *
+ *		4) setup the metadata cache image superblock extension
+ *		   message with the address and size of the metadata 
+ *		   cache image.
+ *
+ *		The parallel case is complicated by the fact that 
+ *		while all metadata caches must contain the same set of 
+ *		dirty entries, there is no such requirement for clean 
+ *		entries or the order that entries appear in the LRU.
+ *
+ *		Thus, there is no requirement that different processes
+ *		will construct cache images of the same size.
+ *
+ *		This is not a major issue as long as all processes include 
+ *		the same set of dirty entries in the cache -- as they 
+ *		currently do (note that this will change when we implement 
+ *		the ageout feature).  Since only the process zero cache 
+ *		writes the cache image, all that is necessary is to 
+ *		broadcast the process zero cache size for use in the 
+ *		superblock extension messages and cache image block 
+ *		allocations.
+ *
+ *		Note: At present, cache image is disabled in the 
+ *		parallel case as the new collective metadata write 
+ *		code must be modified to support cache image.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/3/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__prep_image_for_file_close(H5F_t *f, hid_t dxpl_id, hbool_t *image_generated)
+{
+    H5C_t *     cache_ptr = NULL;
+    haddr_t     eoa_frag_addr = HADDR_UNDEF;
+    hsize_t     eoa_frag_size = 0;
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(image_generated);
+
+    /* If the file is opened and closed without any access to 
+     * any group or data set, it is possible that the cache image (if 
+     * it exists) has not been read yet.  Do this now if required.
+     */
+    if(cache_ptr->load_image) {
+        cache_ptr->load_image = FALSE;
+        if(H5C__load_cache_image(f, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, FAIL, "can't load cache image")
+    } /* end if */
+
+    /* Before we start to generate the cache image (if requested), verify
+     * that the superblock supports superblock extension messages, and 
+     * silently cancel any request for a cache image if it does not.
+     *
+     * Ideally, we would do this when the cache image is requested,
+     * but the necessary information is not necessary available at that 
+     * time -- hence this last minute check.
+     *
+     * Note that under some error conditions, the superblock will be 
+     * undefined in this case as well -- if so, assume that the 
+     * superblock does not support superblock extension messages.
+     */
+    if((NULL == f->shared->sblock) ||
+         (f->shared->sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2)) {
+        H5C_cache_image_ctl_t default_image_ctl = H5C__DEFAULT_CACHE_IMAGE_CTL;
+
+        cache_ptr->image_ctl = default_image_ctl;
+        HDassert(!(cache_ptr->image_ctl.generate_image));
+    } /* end if */
+
+    /* Generate the cache image, if requested */
+    if(cache_ptr->image_ctl.generate_image) {
+        /* Create the cache image super block extension message.
+         * 
+         * Note that the base address and length of the metadata cache
+         * image are undefined at this point, and thus will have to be
+         * updated later.
+         *
+         * Create the super block extension message now so that space 
+         * is allocated for it (if necessary) before we allocate space
+         * for the cache image block.
+         *
+         * To simplify testing, do this only if the 
+         * H5C_CI__GEN_MDCI_SBE_MESG bit is set in 
+         * cache_ptr->image_ctl.flags.
+         */
+        if(cache_ptr->image_ctl.flags & H5C_CI__GEN_MDCI_SBE_MESG)
+            if(H5C__write_cache_image_superblock_msg(f, dxpl_id, TRUE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "creation of cache image SB mesg failed.")
+
+        /* Serialize the cache */
+        if(H5C__serialize_cache(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "serialization of the cache failed")
+
+        /* Scan the cache and record data needed to construct the 
+         * cache image.  In particular, for each entry we must record:
+         *
+         * 1) rank in LRU (if entry is in LRU)
+         *
+         * 2) Whether the entry is dirty prior to flush of 
+         *    cache just prior to close.
+         *
+         * 3) Addresses of flush dependency parents (if any).
+         *
+         * 4) Number of flush dependency children (if any).  
+         *
+         * In passing, also compute the size of the metadata cache 
+         * image.  With the recent modifications of the free space 
+         * manager code, this size should be correct.
+         */
+        if(H5C__prep_for_file_close__scan_entries(f, cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C__prep_for_file_close__scan_entries failed")
+        HDassert(HADDR_UNDEF == cache_ptr->image_addr);
+
+#ifdef H5_HAVE_PARALLEL
+        /* In the parallel case, overwrite the image_len with the 
+         * value computed by process 0.
+         */
+        if(cache_ptr->aux_ptr) { /* we have multiple processes */
+            int mpi_result;
+            unsigned p0_image_len;
+            H5AC_aux_t * aux_ptr;
+
+            aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+            if(aux_ptr->mpi_rank == 0) {
+                aux_ptr->p0_image_len = (unsigned)cache_ptr->image_data_len;
+                p0_image_len = aux_ptr->p0_image_len;
+
+                if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&p0_image_len, 1, MPI_UNSIGNED, 0, aux_ptr->mpi_comm)))
+                    HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+
+                HDassert(p0_image_len == aux_ptr->p0_image_len);
+            } /* end if */
+            else {
+                if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&p0_image_len, 1, MPI_UNSIGNED, 0, aux_ptr->mpi_comm)))
+                    HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+                
+                aux_ptr->p0_image_len = p0_image_len;
+            } /* end else */
+
+            /* Allocate space for a cache image of size equal to that 
+             * computed by the process 0.  This may be different from 
+             * cache_ptr->image_data_len if mpi_rank != 0.  However, since
+             * cache image write is suppressed on all processes other than 
+             * process 0, this doesn't matter.
+             *
+             * Note that we allocate the cache image directly from the file 
+             * driver so as to avoid unsettling the free space managers.
+             */
+            if(HADDR_UNDEF == (cache_ptr->image_addr = H5FD_alloc(f->shared->lf, dxpl_id, H5FD_MEM_SUPER, f,
+                        (hsize_t)p0_image_len, &eoa_frag_addr, &eoa_frag_size)))
+                HGOTO_ERROR(H5E_CACHE, H5E_NOSPACE, FAIL, "can't allocate file space for metadata cache image")
+        } /* end if */
+        else
+#endif /* H5_HAVE_PARALLEL */
+            /* Allocate the cache image block.  Note that we allocate this 
+             * this space directly from the file driver so as to avoid 
+             * unsettling the free space managers.
+             */
+            if(HADDR_UNDEF == (cache_ptr->image_addr = H5FD_alloc(f->shared->lf, dxpl_id, H5FD_MEM_SUPER, f,
+                        (hsize_t)(cache_ptr->image_data_len), &eoa_frag_addr, &eoa_frag_size)))
+                HGOTO_ERROR(H5E_CACHE, H5E_NOSPACE, FAIL, "can't allocate file space for metadata cache image")
+
+        /* Make note of the eoa after allocation of the cache image
+         * block.  This value is used for sanity checking when we
+         * shutdown the self referential free space managers after
+         * we destroy the metadata cache.
+         */
+        HDassert(HADDR_UNDEF == f->shared->eoa_post_mdci_fsalloc);
+        if(HADDR_UNDEF == (f->shared->eoa_post_mdci_fsalloc = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)) )
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+
+        /* For now, drop any fragment left over from the allocation of the
+         * image block on the ground.  A fragment should only be returned
+         * if the underlying file alignment is greater than 1.
+         *
+         * Clean this up eventually by extending the size of the cache
+         * image block to the next alignement boundary, and then setting
+         * the image_data_len to the actual size of the cache_image.
+         *
+         * On the off chance that there is some other way to get a 
+         * a fragment on a cache image allocation, leave the following
+         * assertion in the code so we will find out.
+         */
+        HDassert((eoa_frag_size == 0) || (f->shared->alignment != 1));
+
+        /* Eventually it will be possible for the length of the cache image
+         * block on file to be greater than the size of the data it 
+         * contains.  However, for now they must be the same.  Set 
+         * cache_ptr->image_len accordingly.
+         */
+        cache_ptr->image_len = cache_ptr->image_data_len;
+
+        /* update the metadata cache image superblock extension 
+         * message with the new cache image block base address and 
+         * length.
+         *
+         * to simplify testing, do this only if the 
+         * H5C_CI__GEN_MDC_IMAGE_BLK bit is set in 
+         * cache_ptr->image_ctl.flags.
+         */
+        if(cache_ptr->image_ctl.flags & H5C_CI__GEN_MDC_IMAGE_BLK)
+            if(H5C__write_cache_image_superblock_msg(f, dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "update of cache image SB mesg failed")
+
+        /* At this point:
+         *
+         *   1) space in the file for the metadata cache image
+         *      is allocated, 
+         *
+         *   2) the metadata cache image superblock extension 
+         *      message exists and (if so configured) contains 
+         *      the correct data,
+         *
+         *   3) All entries in the cache that will appear in the 
+         *      cache image are serialized with up to date images.
+         *
+         *      Since we just updated the cache image message,
+         *      the super block extension message is dirty.  However,
+         *      since the superblock and the superblock extension 
+         *      can't be included in the cache image, this is a non-
+         *      issue.
+         *
+         *   4) All entries in the cache that will be include in
+         *      the cache are marked as such, and we have a count
+         *      of same.
+         *
+         *   5) Flush dependency heights are calculated for all 
+         *      entries that will be included in the cache image.
+         *
+         * If there are any entries to be included in the metadata cache
+         * image, allocate, populate, and sort the image_entries array.  
+         *
+         * If the metadata cache image will be empty, delete the 
+         * metadata cache image superblock extension message, set 
+         * cache_ptr->image_ctl.generate_image to FALSE.  This will
+         * allow the file close to continue normally without the 
+         * unecessary generation of the metadata cache image.
+         */
+        if(cache_ptr->num_entries_in_image > 0) {
+            if(H5C__prep_for_file_close__setup_image_entries_array(cache_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINIT, FAIL, "can't setup image entries array.")
+
+            /* Sort the entries */
+            HDqsort(cache_ptr->image_entries, (size_t)cache_ptr->num_entries_in_image,
+                    sizeof(H5C_image_entry_t), H5C__image_entry_cmp);
+        } /* end if */
+        else { /* cancel creation of metadata cache image */
+            HDassert(cache_ptr->image_entries == NULL);
+
+            /* To avoid breaking the control flow tests, only delete 
+             * the mdci superblock extension message if the 
+             * H5C_CI__GEN_MDC_IMAGE_BLK flag is set in 
+             * cache_ptr->image_ctl.flags.
+             */
+            if(cache_ptr->image_ctl.flags & H5C_CI__GEN_MDC_IMAGE_BLK)
+                if(H5F_super_ext_remove_msg(f, dxpl_id, H5O_MDCI_MSG_ID) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove MDC image msg from superblock ext")
+
+            cache_ptr->image_ctl.generate_image = FALSE;
+        } /* end else */
+
+        /* Indicate that a cache image was generated */
+        *image_generated = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__prep_image_for_file_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_set_cache_image_config
+ *
+ * Purpose:	If *config_ptr contains valid data, copy it into the 
+ *		image_ctl field of *cache_ptr.  Make adjustments for 
+ *		changes in configuration as required.
+ *
+ *              If the file is open read only, silently
+ *              force the cache image configuration to its default
+ *              (which disables construction of a cache image).
+ *
+ *              Note that in addition to being inapplicable in the
+ *              read only case, cache image is also inapplicable if
+ *              the superblock does not support superblock extension 
+ *              messages.  Unfortunately, this information need not 
+ *              be available at this point. Thus we check for this 
+ *              later, in H5C_prep_for_file_close() and cancel the
+ *              cache image request if appropriate.
+ *
+ *		Fail if the new configuration is invalid.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		7/3/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_cache_image_config(const H5F_t *f, H5C_t *cache_ptr,
+    H5C_cache_image_ctl_t *config_ptr)
+{
+    herr_t	ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache == f->shared->cache);
+
+    /* Check arguments */
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache_ptr on entry")
+
+    /* Validate the config: */
+    if(H5C_validate_cache_image_config(config_ptr) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid cache image configuration")
+
+#ifdef H5_HAVE_PARALLEL
+    /* The collective metadata write code is not currently compatible 
+     * with cache image.  Until this is fixed, suppress cache image silently
+     * if there is more than one process.
+     *                                         JRM -- 11/8/16
+     */
+    if(cache_ptr->aux_ptr) {
+	H5C_cache_image_ctl_t default_image_ctl = H5C__DEFAULT_CACHE_IMAGE_CTL;
+
+        cache_ptr->image_ctl = default_image_ctl;
+	HDassert(!(cache_ptr->image_ctl.generate_image));
+    } /* end if */
+    else {
+#endif /* H5_HAVE_PARALLEL */
+        /* A cache image can only be generated if the file is opened read / write
+         * and the superblock supports superblock extension messages.  
+         *
+         * However, the superblock version is not available at this point -- 
+         * hence we can only check the former requirement now.  Do the latter
+         * check just before we construct the image..  
+         *
+         * If the file is opened read / write, apply the supplied configuration.
+         *
+         * If it is not, set the image configuration to the default, which has 
+         * the effect of silently disabling the cache image if it was requested.
+         */
+        if(H5F_INTENT(f) & H5F_ACC_RDWR)
+            cache_ptr->image_ctl = *config_ptr;
+        else {
+            H5C_cache_image_ctl_t default_image_ctl = H5C__DEFAULT_CACHE_IMAGE_CTL;
+
+            cache_ptr->image_ctl = default_image_ctl;
+            HDassert(!(cache_ptr->image_ctl.generate_image));
+        } /* end else */
+#ifdef H5_HAVE_PARALLEL
+    } /* end else */
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_set_cache_image_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_validate_cache_image_config()
+ *
+ * Purpose:	Run a sanity check on the provided instance of struct 
+ *		H5AC_cache_image_config_t.
+ *
+ *		Do nothing and return SUCCEED if no errors are detected,
+ *		and flag an error and return FAIL otherwise.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_validate_cache_image_config(H5C_cache_image_ctl_t * ctl_ptr)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(ctl_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL ctl_ptr on entry")
+    if(ctl_ptr->version != H5C__CURR_CACHE_IMAGE_CTL_VER)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown cache image control version")
+
+    /* At present, we do not support inclusion of the adaptive resize
+     * configuration in the cache image.  Thus the save_resize_status
+     * field must be FALSE.
+     */
+    if(ctl_ptr->save_resize_status != FALSE)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "unexpected value in save_resize_status field")
+
+    /* At present, we do not support prefetched entry ageouts.  Thus 
+     * the entry_ageout field must be set to 
+     * H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE.
+     */
+    if(ctl_ptr->entry_ageout != H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "unexpected value in entry_ageout field")
+
+    if((ctl_ptr->flags & ~H5C_CI__ALL_FLAGS) != 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "unknown flag set")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_validate_cache_image_config() */
+
+

+/*************************************************************************/
+/**************************** Private Functions: *************************/
+/*************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    H5C__cache_image_block_entry_header_size
+ *
+ * Purpose:     Compute the size of the header of the metadata cache
+ *		image block, and return the value.
+ *
+ * Return:      Size of the header section of the metadata cache image 
+ *		block in bytes.
+ *
+ * Programmer:  John Mainzer
+ *		7/27/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5C__cache_image_block_entry_header_size(const H5F_t * f)
+{
+    size_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)( 1 +			/* type                     */
+			  1 +			/* flags                    */
+			  1 +			/* ring                     */
+			  1 +			/* age                      */
+			  2 +			/* dependency child count   */
+			  2 +			/* dirty dep child count    */
+			  2 +			/* dependency parent count  */
+			  4 +			/* index in LRU             */
+			  H5F_SIZEOF_ADDR(f) +  /* entry offset             */
+			  H5F_SIZEOF_SIZE(f) ); /* entry length             */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__cache_image_block_entry_header_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__cache_image_block_header_size
+ *
+ * Purpose:     Compute the size of the header of the metadata cache
+ *		image block, and return the value.
+ *
+ * Return:      Size of the header section of the metadata cache image 
+ *		block in bytes.
+ *
+ * Programmer:  John Mainzer
+ *		7/27/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5C__cache_image_block_header_size(const H5F_t * f)
+{
+    size_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)( 4 +                   /* signature           */
+			  1 +			/* version             */
+			  1 +			/* flags               */
+			  H5F_SIZEOF_SIZE(f) +	/* image data length   */
+			  4 );			/* num_entries         */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__cache_image_block_header_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__decode_cache_image_header()
+ *
+ * Purpose:     Decode the metadata cache image buffer header from the 
+ *		supplied buffer and load the data into the supplied instance
+ *		of H5C_t.  Advances the buffer pointer to the first byte 
+ *		after the header image, or unchanged on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__decode_cache_image_header(const H5F_t *f, H5C_t *cache_ptr,
+    const uint8_t **buf)
+{
+    uint8_t		version;
+    uint8_t		flags;
+    hbool_t		have_resize_status = FALSE;
+    size_t 		actual_header_len;
+    size_t		expected_header_len;
+    const uint8_t *	p;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(buf);
+    HDassert(*buf);
+
+    /* Point to buffer to decode */
+    p = *buf;
+
+    /* Check signature */
+    if(HDmemcmp(p, H5C__MDCI_BLOCK_SIGNATURE, (size_t)H5C__MDCI_BLOCK_SIGNATURE_LEN))
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad metadata cache image header signature")
+    p += H5C__MDCI_BLOCK_SIGNATURE_LEN;
+
+    /* Check version */
+    version = *p++;
+    if(version != (uint8_t)H5C__MDCI_BLOCK_VERSION_0)
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad metadata cache image version")
+
+    /* Decode flags */
+    flags = *p++;
+    if(flags & H5C__MDCI_HEADER_HAVE_RESIZE_STATUS)	
+	have_resize_status = TRUE;
+    if(have_resize_status)
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "MDC resize status not yet supported")
+
+    /* Read image data length */
+    H5F_DECODE_LENGTH(f, p, cache_ptr->image_data_len);
+
+    /* For now -- will become <= eventually */
+    if(cache_ptr->image_data_len != cache_ptr->image_len)
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad metadata cache image data length")
+
+    /* Read num entries */
+    UINT32DECODE(p, cache_ptr->num_entries_in_image);
+    if(cache_ptr->num_entries_in_image == 0) 
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad metadata cache entry count")
+
+    /* Verify expected length of header */
+    actual_header_len = (size_t)(p - *buf);
+    expected_header_len = H5C__cache_image_block_header_size(f);
+    if(actual_header_len != expected_header_len)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad header image len")
+
+    /* Update buffer pointer */
+    *buf = p;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__decode_cache_image_header() */
+
+#ifndef NDEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__decode_cache_image_entry()
+ *
+ * Purpose:     Decode the metadata cache image entry from the supplied 
+ *		buffer into the supplied instance of H5C_image_entry_t.
+ *		This includes allocating a buffer for the entry image,
+ *		loading it, and seting ie_ptr->image_ptr to point to 
+ *		the buffer.
+ *
+ *		Advances the buffer pointer to the first byte 
+ *		after the entry, or unchanged on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__decode_cache_image_entry(const H5F_t *f, const H5C_t *cache_ptr,
+    const uint8_t **buf, unsigned entry_num)
+{
+    hbool_t		is_dirty = FALSE;
+    hbool_t		in_lru = FALSE;         /* Only used in assertions */
+    hbool_t		is_fd_parent = FALSE;   /* Only used in assertions */
+    hbool_t		is_fd_child = FALSE;    /* Only used in assertions */
+    haddr_t 		addr;
+    hsize_t		size = 0;
+    void *		image_ptr;
+    uint8_t             flags = 0;
+    uint8_t		type_id;
+    uint8_t		ring;
+    uint8_t		age;
+    uint16_t 		fd_child_count;
+    uint16_t 		fd_dirty_child_count;
+    uint16_t 		fd_parent_count;
+    haddr_t           * fd_parent_addrs = NULL;
+    int32_t		lru_rank;
+    H5C_image_entry_t * ie_ptr = NULL;
+    const uint8_t *	p;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(cache_ptr == f->shared->cache);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(buf);
+    HDassert(*buf);
+    HDassert(entry_num < cache_ptr->num_entries_in_image);
+    ie_ptr = &((cache_ptr->image_entries)[entry_num]);
+    HDassert(ie_ptr);
+    HDassert(ie_ptr->magic == H5C_IMAGE_ENTRY_T_MAGIC);
+
+    /* Get pointer to buffer */
+    p = *buf;
+
+    /* Decode type id */
+    type_id = *p++;
+
+    /* Decode flags */
+    flags = *p++;
+    if(flags & H5C__MDCI_ENTRY_DIRTY_FLAG)
+        is_dirty = TRUE;
+    if(flags & H5C__MDCI_ENTRY_IN_LRU_FLAG)
+        in_lru = TRUE;
+    if(flags & H5C__MDCI_ENTRY_IS_FD_PARENT_FLAG)
+        is_fd_parent = TRUE;
+    if(flags & H5C__MDCI_ENTRY_IS_FD_CHILD_FLAG)
+        is_fd_child = TRUE;
+
+    /* Decode ring */
+    ring = *p++;
+    HDassert(ring > (uint8_t)(H5C_RING_UNDEFINED));
+    HDassert(ring < (uint8_t)(H5C_RING_NTYPES));
+
+    /* Decode age */
+    age = *p++;
+
+    /* Decode dependency child count */
+    UINT16DECODE(p, fd_child_count);
+    HDassert((is_fd_parent && fd_child_count > 0) || (!is_fd_parent && fd_child_count == 0));
+
+    /* Decode dirty dependency child count */
+    UINT16DECODE(p, fd_dirty_child_count);
+    if(fd_dirty_child_count > fd_child_count)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid dirty flush dependency child count")
+
+    /* Decode dependency parent count */
+    UINT16DECODE(p, fd_parent_count);
+    HDassert((is_fd_child && fd_parent_count > 0) || (!is_fd_child && fd_parent_count == 0));
+
+    /* Decode index in LRU */
+    INT32DECODE(p, lru_rank);
+    HDassert((in_lru && lru_rank >= 0) || (!in_lru && lru_rank == -1));
+
+    /* Decode entry offset */
+    H5F_addr_decode(f, &p, &addr);
+    if(!H5F_addr_defined(addr))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid entry offset")
+
+    /* Decode entry length */
+    H5F_DECODE_LENGTH(f, p, size);
+    if(size == 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid entry size")
+
+    /* Verify expected length of entry image */
+    if((size_t)(p - *buf) != H5C__cache_image_block_entry_header_size(f))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADSIZE, FAIL, "Bad entry image len")
+    
+    /* If parent count greater than zero, allocate array for parent 
+     * addresses, and decode addresses into the array.
+     */
+    if(fd_parent_count > 0) {
+        int i;          /* Local index variable */
+
+        if(NULL == (fd_parent_addrs = (haddr_t *)H5MM_malloc((size_t)(fd_parent_count) * H5F_SIZEOF_ADDR(f))))
+	    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for fd parent addrs buffer")
+
+	for(i = 0; i < fd_parent_count; i++) {
+            H5F_addr_decode(f, &p, &(fd_parent_addrs[i]));
+            if(!H5F_addr_defined(fd_parent_addrs[i]))
+                HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "invalid flush dependency parent offset")
+        } /* end for */
+    } /* end if */
+
+    /* Allocate buffer for entry image */
+    if(NULL == (image_ptr = H5MM_malloc(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 *)image_ptr) + size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+
+    /* Copy the entry image from the cache image block */
+    HDmemcpy(image_ptr, p, size);
+    p += size;
+
+    /* Copy data into target */
+    ie_ptr->addr                 = addr;
+    ie_ptr->size                 = size;
+    ie_ptr->ring                 = (H5C_ring_t)ring;
+    ie_ptr->age                  = (int32_t)age;
+    ie_ptr->type_id              = (int32_t)type_id;
+    ie_ptr->lru_rank             = lru_rank;
+    ie_ptr->is_dirty             = is_dirty;
+    ie_ptr->fd_child_count       = (uint64_t)fd_child_count;
+    ie_ptr->fd_dirty_child_count = (uint64_t)fd_dirty_child_count;
+    ie_ptr->fd_parent_count      = (uint64_t)fd_parent_count;
+    ie_ptr->fd_parent_addrs      = fd_parent_addrs;
+    ie_ptr->image_ptr            = image_ptr;
+
+    /* Update buffer pointer */
+    *buf = p;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__decode_cache_image_entry() */
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__destroy_pf_entry_child_flush_deps()
+ *
+ * Purpose:     Destroy all flush dependencies in this the supplied 
+ *		prefetched entry is the parent.  Note that the children
+ *		in these flush dependencies must be prefetched entries as 
+ *		well.
+ *
+ *		As this action is part of the process of transferring all
+ *		such flush dependencies to the deserialized version of the
+ *		prefetched entry, ensure that the data necessary to complete
+ *		the transfer is retained.
+ *
+ *		Note: The current implementation of this function is 
+ *		      quite inefficient -- mostly due to the current 
+ *		      implementation of flush dependencies.  This should
+ *		      be fixed at some point.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/11/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__destroy_pf_entry_child_flush_deps(H5C_t *cache_ptr, 
+    H5C_cache_entry_t *pf_entry_ptr, H5C_cache_entry_t **fd_children)
+{
+    H5C_cache_entry_t * entry_ptr;
+    unsigned		entries_visited = 0;
+    int			fd_children_found = 0;
+    hbool_t		found;
+    herr_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(pf_entry_ptr);
+    HDassert(pf_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(pf_entry_ptr->type);
+    HDassert(pf_entry_ptr->type->id == H5AC_PREFETCHED_ENTRY_ID);
+    HDassert(pf_entry_ptr->prefetched);
+    HDassert(pf_entry_ptr->fd_child_count > 0);
+    HDassert(fd_children);
+
+    /* Scan each entry on the index list */
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+	/* Here we look at entry_ptr->flush_dep_nparents and not 
+         * entry_ptr->fd_parent_count as it is possible that some 
+	 * or all of the prefetched flush dependency child relationships
+	 * have already been destroyed.
+         */
+	if(entry_ptr->prefetched && (entry_ptr->flush_dep_nparents > 0)) {
+            unsigned u;         /* Local index variable */
+
+            /* Re-init */
+	    u = 0;
+	    found = FALSE;
+
+            /* Sanity checks */
+            HDassert(entry_ptr->type);
+            HDassert(entry_ptr->type->id == H5AC_PREFETCHED_ENTRY_ID);
+	    HDassert(entry_ptr->fd_parent_count >= entry_ptr->flush_dep_nparents);
+	    HDassert(entry_ptr->fd_parent_addrs);
+	    HDassert(entry_ptr->flush_dep_parent);
+
+            /* Look for correct entry */
+	    while(!found && (u < entry_ptr->fd_parent_count)) {
+                /* Sanity check entry */
+		HDassert(entry_ptr->flush_dep_parent[u]);
+		HDassert(entry_ptr->flush_dep_parent[u]->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+                /* Correct entry? */
+		if(pf_entry_ptr == entry_ptr->flush_dep_parent[u])
+		    found = TRUE;
+
+		u++;
+            } /* end while */
+
+	    if(found) {
+	        HDassert(NULL == fd_children[fd_children_found]);
+
+                /* Remove flush dependency */
+	        fd_children[fd_children_found] = entry_ptr;
+	        fd_children_found++;
+                if(H5C_destroy_flush_dependency(pf_entry_ptr, entry_ptr) < 0)
+	            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "can't destroy pf entry child flush dependency")
+
+#ifndef NDEBUG
+		/* Sanity check -- verify that the address of the parent 
+                 * appears in entry_ptr->fd_parent_addrs.  Must do a search,
+                 * as with flush dependency creates and destroys, 
+                 * entry_ptr->fd_parent_addrs and entry_ptr->flush_dep_parent
+                 * can list parents in different order.
+                 */
+		found = FALSE;
+		u = 0;
+	        while(!found && u < entry_ptr->fd_parent_count) {
+		    if(pf_entry_ptr->addr == entry_ptr->fd_parent_addrs[u])
+		        found = TRUE;
+		    u++;
+                } /* end while */
+		HDassert(found);
+#endif /* NDEBUG */
+	    } /* end if */
+	} /* end if */
+
+        entries_visited++;
+        entry_ptr = entry_ptr->il_next;
+    } /* end while */
+
+    /* Post-op sanity checks */
+    HDassert(NULL == fd_children[fd_children_found]);
+    HDassert((unsigned)fd_children_found == pf_entry_ptr->fd_child_count);
+    HDassert(entries_visited == cache_ptr->index_len);
+    HDassert(!pf_entry_ptr->is_pinned);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__destroy_pf_entry_child_flush_deps() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__encode_cache_image_header()
+ *
+ * Purpose:     Encode the metadata cache image buffer header in the 
+ *		supplied buffer.  Updates buffer pointer to the first byte 
+ *		after the header image in the buffer, or unchanged on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__encode_cache_image_header(const H5F_t *f, const H5C_t *cache_ptr,
+    uint8_t **buf)
+{
+    size_t 	actual_header_len;
+    size_t	expected_header_len;
+    uint8_t     flags = 0;
+    uint8_t *	p;                      /* Pointer into cache image buffer */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->image_ctl.generate_image);
+    HDassert(cache_ptr->index_len == 0);
+    HDassert(cache_ptr->image_data_len > 0);
+    HDassert(cache_ptr->image_data_len <= cache_ptr->image_len);
+    HDassert(buf);
+    HDassert(*buf);
+
+    /* Set pointer into buffer */
+    p = *buf;
+
+    /* write signature */
+    HDmemcpy(p, H5C__MDCI_BLOCK_SIGNATURE, (size_t)H5C__MDCI_BLOCK_SIGNATURE_LEN);
+    p += H5C__MDCI_BLOCK_SIGNATURE_LEN;
+
+    /* write version */
+    *p++ = (uint8_t)H5C__MDCI_BLOCK_VERSION_0;
+
+    /* setup and write flags */
+
+    /* at present we don't support saving resize status */
+    HDassert(!cache_ptr->image_ctl.save_resize_status);
+    if(cache_ptr->image_ctl.save_resize_status)
+	flags |= H5C__MDCI_HEADER_HAVE_RESIZE_STATUS;
+
+    *p++ = flags;
+
+    /* Encode image data length */
+    /* this must be true at present */
+    HDassert(cache_ptr->image_len == cache_ptr->image_data_len);
+    H5F_ENCODE_LENGTH(f, p, cache_ptr->image_data_len);
+
+    /* write num entries */
+    UINT32ENCODE(p, cache_ptr->num_entries_in_image);
+
+    /* verify expected length of header */
+    actual_header_len = (size_t)(p - *buf);
+    expected_header_len = H5C__cache_image_block_header_size(f);
+    if(actual_header_len != expected_header_len)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad header image len")
+
+    /* Update buffer pointer */
+    *buf = p;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__encode_cache_image_header() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__encode_cache_image_entry()
+ *
+ * Purpose:     Encode the metadata cache image buffer header in the 
+ *		supplied buffer.  Updates buffer pointer to the first byte 
+ *		after the entry in the buffer, or unchanged on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__encode_cache_image_entry(H5F_t *f, H5C_t *cache_ptr, uint8_t **buf, 
+    unsigned entry_num)
+{
+    H5C_image_entry_t *	ie_ptr;                 /* Pointer to entry to encode */
+    uint8_t             flags = 0;              /* Flags for entry */
+    uint8_t           *	p;                      /* Pointer into cache image buffer */
+    unsigned            u;                      /* Local index value */
+    herr_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(cache_ptr == f->shared->cache);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->image_ctl.generate_image);
+    HDassert(cache_ptr->index_len == 0);
+    HDassert(buf);
+    HDassert(*buf);
+    HDassert(entry_num < cache_ptr->num_entries_in_image);
+    ie_ptr = &((cache_ptr->image_entries)[entry_num]);
+    HDassert(ie_ptr->magic == H5C_IMAGE_ENTRY_T_MAGIC);
+
+    /* Get pointer to buffer to encode into */
+    p = *buf;
+
+    /* Encode type */
+    if((ie_ptr->type_id < 0) || (ie_ptr->type_id > 255))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADRANGE, FAIL, "type_id out of range.")
+    *p++ = (uint8_t)(ie_ptr->type_id);
+
+    /* Compose and encode flags */
+    if(ie_ptr->is_dirty) 
+	flags |= H5C__MDCI_ENTRY_DIRTY_FLAG;
+    if(ie_ptr->lru_rank > 0) 
+	flags |= H5C__MDCI_ENTRY_IN_LRU_FLAG;
+    if(ie_ptr->fd_child_count > 0)
+	flags |= H5C__MDCI_ENTRY_IS_FD_PARENT_FLAG;
+    if(ie_ptr->fd_parent_count > 0) 
+	flags |= H5C__MDCI_ENTRY_IS_FD_CHILD_FLAG;
+    *p++ = flags;
+
+    /* Encode ring */
+    *p++ = (uint8_t)(ie_ptr->ring);
+
+    /* Encode age */
+    *p++ = (uint8_t)(ie_ptr->age);
+
+    /* Validate and encode dependency child count */
+    if(ie_ptr->fd_child_count > H5C__MDCI_MAX_FD_CHILDREN)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADRANGE, FAIL, "fd_child_count out of range")
+    UINT16ENCODE(p, (uint16_t)(ie_ptr->fd_child_count));
+
+    /* Validate and encode dirty dependency child count */
+    if(ie_ptr->fd_dirty_child_count > H5C__MDCI_MAX_FD_CHILDREN)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADRANGE, FAIL, "fd_dirty_child_count out of range")
+    UINT16ENCODE(p, (uint16_t)(ie_ptr->fd_dirty_child_count));
+
+    /* Validate and encode dependency parent count */
+    if(ie_ptr->fd_parent_count > H5C__MDCI_MAX_FD_PARENTS)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADRANGE, FAIL, "fd_parent_count out of range")
+    UINT16ENCODE(p, (uint16_t)(ie_ptr->fd_parent_count));
+
+    /* Encode index in LRU */
+    INT32ENCODE(p, ie_ptr->lru_rank);
+
+    /* Encode entry offset */
+    H5F_addr_encode(f, &p, ie_ptr->addr);
+
+    /* Encode entry length */
+    H5F_ENCODE_LENGTH(f, p, ie_ptr->size);
+
+    /* Verify expected length of entry image */
+    if((size_t)(p - *buf) != H5C__cache_image_block_entry_header_size(f))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad entry image len")
+
+    /* Encode dependency parent offsets -- if any */
+    for(u = 0; u < ie_ptr->fd_parent_count; u++)
+	H5F_addr_encode(f, &p, ie_ptr->fd_parent_addrs[u]);
+
+    /* Copy entry image */
+    HDmemcpy(p, ie_ptr->image_ptr, ie_ptr->size);
+    p += ie_ptr->size;
+
+    /* Update buffer pointer */
+    *buf = p;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__encode_cache_image_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prep_for_file_close__compute_fd_heights
+ *
+ * Purpose:     Recent modifications to flush dependency support in the
+ *		metadata cache have removed the notion of flush dependency
+ *		height.  This is a problem for the cache image feature,
+ *		as flush dependency height is used to order entries in the
+ *		cache image so that flush dependency parents appear before
+ *		flush dependency children. (Recall that the flush dependency
+ *		height of an entry in a flush dependency relationship is the
+ *		length of the longest path from the entry to a leaf entry --
+ *		that is an entry with flush dependency parents, but no 
+ *		flush dependency children.  With the introduction of the 
+ *		possibility of multiple flush dependency parents, we have
+ *		a flush partial dependency latice, not a flush dependency 
+ *		tree.  But since the partial latice is acyclic, the concept 
+ *		of flush dependency height still makes sense.
+ *
+ *		The purpose of this function is to compute the flush 
+ *		dependency height of all entries that appear in the cache
+ *		image.  
+ *
+ *		At present, entries are included or excluded from the 
+ *		cache image depending upon the ring in which they reside.
+ *		Thus there is no chance that one side of a flush dependency
+ *		will be in the cache image, and the other side not.
+ *
+ *		However, once we start placing a limit on the size of the
+ *		cache image, or start excluding prefetched entries from
+ *		the cache image if they haven't been accessed in some 
+ *		number of file close / open cycles, this will no longer 
+ *		be the case.  
+ *
+ *		In particular, if a flush dependency child is dirty, and
+ *		one of its flush dependency parents is dirty and not in
+ *		the cache image, then the flush dependency child cannot
+ *		be in the cache image without violating flush ordering.
+ *
+ *		Observe that a clean flush dependency child can be either 
+ *		in or out of the cache image without effect on flush 
+ *		dependencies.
+ *
+ *		Similarly, a flush dependency parent can always be part 
+ *		of a cache image, regardless of whether it is clean or 
+ *		dirty -- but remember that a flush dependency parent can
+ *		also be a flush dependency child.
+ *		
+ *		Finally, note that for purposes of the cache image, flush
+ *		dependency height ends when a flush dependecy relation 
+ *		passes off the cache image.
+ *
+ *		On exit, the flush dependency height of each entry in the 
+ *		cache image should be calculated and stored in the cache
+ *		entry.  Entries will be removed from the cache image if
+ *		necessary to maintain flush ordering.
+ *		
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              9/6/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__prep_for_file_close__compute_fd_heights(const H5C_t *cache_ptr)
+{
+    H5C_cache_entry_t * entry_ptr;
+    H5C_cache_entry_t * parent_ptr;
+    unsigned		entries_removed_from_image = 0;
+    unsigned		external_parent_fd_refs_removed = 0;
+    unsigned		external_child_fd_refs_removed = 0;
+    hbool_t 		done = FALSE;
+    unsigned		u;              /* Local index variable */
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Remove from the cache image all dirty entries that are 
+     * flush dependency children of dirty entries that are not in the
+     * cache image.  Must do this, as if we fail to do so, the parent 
+     * will be written to file before the child.  Since it is possible 
+     * that the child will have dirty children of its own, this may take
+     * multiple passes through the index list.
+     */
+    done = FALSE;
+    while(!done) {
+	done = TRUE;
+	entry_ptr = cache_ptr->il_head;
+        while(entry_ptr != NULL) {
+	    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+            /* Should this entry be in the image */
+	    if(entry_ptr->image_dirty && entry_ptr->include_in_image &&
+                    (entry_ptr->fd_parent_count > 0)) {
+		HDassert(entry_ptr->flush_dep_parent != NULL);
+		for(u = 0; u < entry_ptr->flush_dep_nparents; u++ ) {
+		    parent_ptr = entry_ptr->flush_dep_parent[u];
+
+                    /* Sanity check parent */
+		    HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+		    HDassert(entry_ptr->ring == parent_ptr->ring);
+
+		    if(parent_ptr->is_dirty && !parent_ptr->include_in_image &&
+                             entry_ptr->include_in_image) {
+
+			/* Must remove child from image -- only do this once */
+			entries_removed_from_image++;
+			entry_ptr->include_in_image = FALSE;
+		    } /* end if */
+		} /* for */
+            } /* end if */
+
+	    entry_ptr = entry_ptr->il_next;
+        } /* while ( entry_ptr != NULL ) */
+    } /* while ( ! done ) */ 
+
+    /* at present, entries are included in the cache image if they reside
+     * in a specified set of rings.  Thus it should be impossible for 
+     * entries_removed_from_image to be positive.  Assert that this is 
+     * so.  Note that this will change when we start aging entries out 
+     * of the cache image.
+     */
+    HDassert(entries_removed_from_image == 0);
+
+    /* Next, remove from entries in the cache image, references to 
+     * flush dependency parents or children that are not in the cache image.
+     */
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	if(!entry_ptr->include_in_image && entry_ptr->flush_dep_nparents > 0) {
+	    HDassert(entry_ptr->flush_dep_parent != NULL);
+
+	    for(u = 0; u < entry_ptr->flush_dep_nparents; u++ ) {
+	        parent_ptr = entry_ptr->flush_dep_parent[u];
+
+                /* Sanity check parent */
+		HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+		HDassert(entry_ptr->ring == parent_ptr->ring);
+
+		if(parent_ptr->include_in_image) {
+		    /* Must remove reference to child */
+		    HDassert(parent_ptr->fd_child_count > 0);
+		    parent_ptr->fd_child_count--;
+
+		    if(entry_ptr->is_dirty) {
+			HDassert(parent_ptr->fd_dirty_child_count > 0);
+			parent_ptr->fd_dirty_child_count--;
+		    } /* end if */
+
+		    external_child_fd_refs_removed++;
+		} /* end if */
+	    } /* for */
+	} /* end if */
+        else if(entry_ptr->include_in_image && entry_ptr->flush_dep_nparents > 0) {
+            /* Sanity checks */
+	    HDassert(entry_ptr->flush_dep_parent != NULL);
+	    HDassert(entry_ptr->flush_dep_nparents == entry_ptr->fd_parent_count);
+	    HDassert(entry_ptr->fd_parent_addrs);
+
+	    for(u = 0; u < entry_ptr->flush_dep_nparents; u++ ) {
+	        parent_ptr = entry_ptr->flush_dep_parent[u];
+
+                /* Sanity check parent */
+		HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+		HDassert(entry_ptr->ring == parent_ptr->ring);
+
+		if(!parent_ptr->include_in_image) {
+		    /* Must remove reference to parent */
+		    HDassert(entry_ptr->fd_parent_count > 0);
+		    parent_ptr->fd_child_count--;
+
+		    HDassert(parent_ptr->addr == entry_ptr->fd_parent_addrs[u]);
+
+		    entry_ptr->fd_parent_addrs[u] = HADDR_UNDEF;
+		    external_parent_fd_refs_removed++;
+		} /* end if */
+	    } /* for */
+
+	    /* Touch up fd_parent_addrs array if necessary */
+	    if(entry_ptr->fd_parent_count == 0) {
+		H5MM_xfree(entry_ptr->fd_parent_addrs);
+		entry_ptr->fd_parent_addrs = NULL;
+	    } /* end if */
+            else if(entry_ptr->flush_dep_nparents > entry_ptr->fd_parent_count) {
+		haddr_t * old_fd_parent_addrs = entry_ptr->fd_parent_addrs;
+                unsigned v;
+
+		if(NULL == (entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_calloc(sizeof(haddr_t) * (size_t)(entry_ptr->fd_parent_addrs))))
+		    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for fd parent addr array")
+
+		v = 0;
+	        for(u = 0; u < entry_ptr->flush_dep_nparents; u++) {
+		    if(old_fd_parent_addrs[u] != HADDR_UNDEF) {
+			entry_ptr->fd_parent_addrs[v] = old_fd_parent_addrs[u];
+			v++;
+		    } /* end if */
+		} /* end for */
+
+		HDassert(v == entry_ptr->fd_parent_count);
+	    } /* end else-if */
+	} /* end else-if */
+
+        entry_ptr = entry_ptr->il_next;
+    } /* while (entry_ptr != NULL) */
+
+    /* At present, no extenal parent or child flush dependency links 
+     * should exist -- hence the following assertions.  This will change
+     * if we support ageout of entries in the cache image.
+     */
+    HDassert(external_child_fd_refs_removed == 0);
+    HDassert(external_parent_fd_refs_removed == 0);
+
+    /* At this point we should have removed all flush dependencies that 
+     * cross cache image boundaries.  Now compute the flush dependency
+     * heights for all entries in the image.
+     *
+     * Until I can think of a better way, do this via a depth first
+     * search implemented via a recursive function call.
+     *
+     * Note that entry_ptr->image_fd_height has already been initialized to 0
+     * for all entries that may appear in the cache image.
+     */
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	if(entry_ptr->include_in_image && entry_ptr->fd_child_count == 0 &&
+                entry_ptr->fd_parent_count > 0) {
+	    for(u = 0; u < entry_ptr->fd_parent_count; u++) {
+	        parent_ptr = entry_ptr->flush_dep_parent[u];
+
+	        HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+	        if(parent_ptr->include_in_image && parent_ptr->image_fd_height <= 0) 
+		    H5C__prep_for_file_close__compute_fd_heights_real(parent_ptr, 1);
+	    } /* end for */
+        } /* end if */
+
+        entry_ptr = entry_ptr->il_next;
+    } /* while (entry_ptr != NULL) */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__prep_for_file_close__compute_fd_heights() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prep_for_file_close__compute_fd_heights_real
+ *
+ * Purpose:     H5C__prep_for_file_close__compute_fd_heights() prepares
+ *		for the computation of flush dependency heights of all
+ *		entries in the cache image, this function actually does
+ *		it.
+ *
+ *		The basic observation behind this function is as follows:
+ *
+ *		Suppose you have an entry E with a flush dependency 
+ *		height of X.  Then the parents of E must all have 
+ *		flush dependency X + 1 or greater.
+ *
+ *		Use this observation to compute flush dependency height
+ *		of all entries in the cache image via the following
+ *		recursive algorithm:
+ *
+ *		1) On entry, set the flush dependency height of the 
+ *		   supplied cache entry to the supplied value.
+ *
+ *		2) Examine all the flush dependency parents of the 
+ *		   supplied entry.  
+ *
+ *		   If the parent is in the cache image, and has flush 
+ *		   dependency height less than or equal to the flush
+ *		   dependency height of the current entry, call the 
+ *		   recursive routine on the parent with flush dependency
+ *		   height equal to the flush dependency height of the 
+ *		   child plus 1.
+ *
+ *		   Otherwise do nothing.
+ *
+ *		Observe that if the flush dependency height of all entries
+ *		in the image is initialized to zero, and if this recursive 
+ *		function is called with flush dependency height 0 on all 
+ *		entries in the cache image with FD parents in the image, 
+ *		but without FD children in the image, the correct flush 
+ *		dependency height should be set for all entries in the 
+ *		cache image.
+ *		
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/6/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5C__prep_for_file_close__compute_fd_heights_real(H5C_cache_entry_t  *entry_ptr,
+    uint32_t fd_height)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(entry_ptr->include_in_image);
+    HDassert((entry_ptr->image_fd_height == 0) || (entry_ptr->image_fd_height < fd_height));
+    HDassert(((fd_height == 0) && (entry_ptr->fd_child_count == 0)) || ((fd_height > 0) && (entry_ptr->fd_child_count > 0)));
+
+    entry_ptr->image_fd_height = fd_height;
+    if(entry_ptr->flush_dep_nparents > 0) {
+        unsigned u;
+
+	HDassert(entry_ptr->flush_dep_parent);
+	for(u = 0; u < entry_ptr->fd_parent_count; u++) {
+            H5C_cache_entry_t *parent_ptr;
+
+	    parent_ptr = entry_ptr->flush_dep_parent[u];
+	    HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+	    if(parent_ptr->include_in_image && parent_ptr->image_fd_height <= fd_height)
+		H5C__prep_for_file_close__compute_fd_heights_real(parent_ptr, fd_height + 1);
+        } /* end for */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* H5C__prep_for_file_close__compute_fd_heights_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prep_for_file_close__setup_image_entries_array
+ *
+ * Purpose:     Allocate space for the image_entries array, and load
+ *		each instance of H5C_image_entry_t in the array with 
+ *		the data necessary to construct the metadata cache image.
+ *		
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/4/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__prep_for_file_close__setup_image_entries_array(H5C_t *cache_ptr)
+{
+    H5C_cache_entry_t * entry_ptr;
+    H5C_image_entry_t * image_entries = NULL;
+    uint32_t		entries_visited = 0;
+    unsigned            u;                      /* Local index variable */
+    herr_t		ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->pl_len == 0);
+    HDassert(cache_ptr->num_entries_in_image > 0);
+    HDassert(cache_ptr->image_entries == NULL);
+
+    /* Allocate and initialize image_entries array */
+    if(NULL == (image_entries = (H5C_image_entry_t *)H5MM_calloc(sizeof(H5C_image_entry_t) * (size_t)(cache_ptr->num_entries_in_image + 1))))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for image_entries")
+
+    /* Initialize (non-zero/NULL/FALSE) fields */
+    for(u = 0; u <= cache_ptr->num_entries_in_image; u++) {
+	image_entries[u].magic                = H5C_IMAGE_ENTRY_T_MAGIC;
+	image_entries[u].addr                 = HADDR_UNDEF;
+        image_entries[u].ring		      = H5C_RING_UNDEFINED;
+	image_entries[u].type_id              = -1;
+    } /* end for */
+
+    /* Scan each entry on the index list and populate the image_entries array */
+    u = 0;
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+        if(entry_ptr->include_in_image) {
+	    /* Since we have already serialized the cache, the following
+             * should hold.
+             */
+            HDassert(entry_ptr->image_up_to_date);
+            HDassert(entry_ptr->image_ptr);
+	    HDassert(entry_ptr->type);
+
+	    image_entries[u].addr                 = entry_ptr->addr;
+	    image_entries[u].size                 = entry_ptr->size;
+	    image_entries[u].ring                 = entry_ptr->ring;
+
+	    /* When a prefetched entry is included in the image, store
+             * its underlying type id in the image entry, not 
+             * H5AC_PREFETCHED_ENTRY_ID.  In passing, also increment
+	     * the age (up to H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX).
+             */
+	    if(entry_ptr->type->id == H5AC_PREFETCHED_ENTRY_ID) {
+		image_entries[u].type_id          = entry_ptr->prefetch_type_id;
+		image_entries[u].age              = entry_ptr->age + 1;
+		
+		if(image_entries[u].age > H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX)
+		    image_entries[u].age = H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX;
+	    } /* end if */
+            else {
+                image_entries[u].type_id          = entry_ptr->type->id;
+		image_entries[u].age              = 0;
+	    } /* end else */
+
+	    image_entries[u].lru_rank             = entry_ptr->lru_rank;
+	    image_entries[u].is_dirty             = entry_ptr->is_dirty;
+	    image_entries[u].image_fd_height      = entry_ptr->image_fd_height;
+	    image_entries[u].fd_parent_count      = entry_ptr->fd_parent_count;
+	    image_entries[u].fd_parent_addrs      = entry_ptr->fd_parent_addrs;
+	    image_entries[u].fd_child_count       = entry_ptr->fd_child_count;
+	    image_entries[u].fd_dirty_child_count = 
+						entry_ptr->fd_dirty_child_count;
+	    image_entries[u].image_ptr            = entry_ptr->image_ptr;
+
+	    /* Null out entry_ptr->fd_parent_addrs and set 
+             * entry_ptr->fd_parent_count to zero so that ownership of the
+             * flush dependency parents address array is transferred to the 
+	     * image entry.
+             */
+	    entry_ptr->fd_parent_count = 0;
+	    entry_ptr->fd_parent_addrs = NULL;
+
+            u++;
+
+	    HDassert(u <= cache_ptr->num_entries_in_image);
+        } /* end if */
+
+        entries_visited++;
+
+        entry_ptr = entry_ptr->il_next;
+    } /* end while */
+
+    /* Sanity checks */
+    HDassert(entries_visited == cache_ptr->index_len);
+    HDassert(u == cache_ptr->num_entries_in_image);
+
+    HDassert(image_entries[u].fd_parent_addrs == NULL);
+    HDassert(image_entries[u].image_ptr == NULL);
+
+    cache_ptr->image_entries = image_entries;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__prep_for_file_close__setup_image_entries_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prep_for_file_close__scan_entries
+ *
+ * Purpose:     Scan all entries in the metadata cache, and store all 
+ *		entry specific data required for construction of the 
+ *		metadata cache image block and likely to be discarded
+ *		or modified during the cache flush on file close.
+ *
+ *		In particular, make note of:
+ *			entry rank in LRU
+ *			whether the entry is dirty
+ *			base address of entry flush dependency parent,
+ *			        if it exists.
+ *			number of flush dependency children, if any.
+ *
+ *		Also, determine which entries are to be included in the
+ *		metadata cache image.  At present, all entries other than
+ *		the superblock, the superblock extension object header and
+ *		its associated chunks (if any) are included.
+ *
+ *		Finally, compute the size of the metadata cache image
+ *		block.
+ *		
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/21/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__prep_for_file_close__scan_entries(const H5F_t *f, H5C_t *cache_ptr)
+{
+    H5C_cache_entry_t * entry_ptr;
+    hbool_t		include_in_image;
+    unsigned		entries_visited = 0;
+    int			lru_rank = 1;
+    uint32_t		num_entries_tentatively_in_image = 0;
+    uint32_t		num_entries_in_image = 0;
+    size_t		image_len;
+    size_t		entry_header_len;
+    size_t		fd_parents_list_len;
+    int			i;
+    unsigned            j;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+    HDassert(cache_ptr->pl_len == 0);
+
+    /* Initialize image len to the size of the metadata cache image block
+     * header.
+     */
+    image_len        = H5C__cache_image_block_header_size(f);
+    entry_header_len = H5C__cache_image_block_entry_header_size(f);
+
+    /* Scan each entry on the index list */
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+	HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+	/* Since we have already serialized the cache, the following
+         * should hold.
+         */
+        HDassert(entry_ptr->image_up_to_date);
+        HDassert(entry_ptr->image_ptr);
+
+	/* Initially, we mark all entries in the rings included
+         * in the cache image as being included in the in the 
+         * image.  Depending on circumstances, we may exclude some
+         * of these entries later.
+         */
+	if(entry_ptr->ring > H5C_MAX_RING_IN_IMAGE)
+	    include_in_image = FALSE;
+        else
+	    include_in_image = TRUE;
+        entry_ptr->include_in_image = include_in_image;
+
+        if(include_in_image) {
+	    entry_ptr->lru_rank = -1;
+            entry_ptr->image_dirty = entry_ptr->is_dirty;
+	    entry_ptr->image_fd_height = 0;     /* will compute this later */
+
+	    /* Initially, include all flush dependency parents in the
+             * the list of flush dependencies to be stored in the 
+             * image.  We may remove some or all of these later.
+             */
+	    if(entry_ptr->flush_dep_nparents > 0) {
+	        /* The parents addresses array may already exist -- reallocate
+                 * as needed.
+                 */
+		if(entry_ptr->flush_dep_nparents == entry_ptr->fd_parent_count ) {
+		    /* parent addresses array should already be allocated 
+                     * and of the correct size.
+                     */
+		    HDassert(entry_ptr->fd_parent_addrs);
+		} /* end if */
+                else if(entry_ptr->fd_parent_count > 0) {
+		    HDassert(entry_ptr->fd_parent_addrs);
+                    entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_xfree(entry_ptr->fd_parent_addrs);
+		} /* end else-if */
+                else {
+		    HDassert(entry_ptr->fd_parent_count == 0);
+		    HDassert(entry_ptr->fd_parent_addrs == NULL);
+		} /* end else */
+
+		entry_ptr->fd_parent_count = entry_ptr->flush_dep_nparents;
+		if(NULL == entry_ptr->fd_parent_addrs)
+		    if(NULL == (entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)(entry_ptr->fd_parent_count))))
+        	        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for fd parent addrs buffer")
+
+		for(i = 0; i < (int)(entry_ptr->fd_parent_count); i++) {
+		    entry_ptr->fd_parent_addrs[i] = entry_ptr->flush_dep_parent[i]->addr;
+		    HDassert(H5F_addr_defined(entry_ptr->fd_parent_addrs[i]));
+		} /* end for */
+            } /* end if */
+            else if(entry_ptr->fd_parent_count > 0) {
+		HDassert(entry_ptr->fd_parent_addrs);
+		entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_xfree(entry_ptr->fd_parent_addrs);
+	    } /* end else-if */
+            else
+		HDassert(entry_ptr->fd_parent_addrs == NULL);
+
+	    /* Initially, all flush dependency children are included int
+             * the count of flush dependency child relationships to be 
+             * represented in the cache image.  Some or all of these 
+             * may be dropped from the image later.
+             */
+	    if(entry_ptr->flush_dep_nchildren > 0) {
+		if(!entry_ptr->is_pinned)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "encountered unpinned fd parent?!?")
+
+		entry_ptr->fd_child_count = entry_ptr->flush_dep_nchildren;
+		entry_ptr->fd_dirty_child_count = entry_ptr->flush_dep_ndirty_children;
+	    } /* end if */
+
+	    num_entries_tentatively_in_image++;
+        } /* end if */
+
+        entries_visited++;
+        entry_ptr = entry_ptr->il_next;
+    } /* end while */
+    HDassert(entries_visited == cache_ptr->index_len);
+
+    /* Now compute the flush dependency heights of all flush dependency
+     * relationships to be represented in the image.
+     *
+     * If all entries in the target rings are included in the 
+     * image, the flush dependency heights are simply the heights 
+     * of all flush dependencies in the target rings.
+     *
+     * However, if we restrict appearance in the cache image either 
+     * by number of entries in the image, restrictions on the number 
+     * of times a prefetched entry can appear in an image, or image 
+     * size, it is possible that flush dependency parents or children
+     * of entries that are in the image may not be included in the
+     * the image.  In this case, we must prune all flush dependency 
+     * relationships that cross the image boundary, and all exclude 
+     * from the image all dirty flush dependency children that have 
+     * a dirty flush dependency parent that is not in the image. 
+     * This is necessary to preserve the required flush ordering.
+     * 
+     * These details are tended to by the following call to 
+     * H5C__prep_for_file_close__compute_fd_heights().  Because the 
+     * exact contents of the image cannot be known until after this
+     * call, computation of the image size is delayed.
+     */
+    if(H5C__prep_for_file_close__compute_fd_heights(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "computation of flush dependency heights failed?!?")
+
+    /* At this point, all entries that will appear in the cache
+     * image should be marked correctly.  Compute the size of the 
+     * cache image.
+     */
+    entries_visited = 0;
+    entry_ptr = cache_ptr->il_head;
+    while(entry_ptr != NULL) {
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+
+        if(entry_ptr->include_in_image) {
+            if(entry_ptr->fd_parent_count > 0)
+                fd_parents_list_len = (size_t)(H5F_SIZEOF_ADDR(f) * entry_ptr->fd_parent_count);
+            else
+                fd_parents_list_len = (size_t)0;
+
+            image_len += entry_header_len + fd_parents_list_len + entry_ptr->size;
+            num_entries_in_image++;
+        } /* end if */
+
+        entries_visited++;
+        entry_ptr = entry_ptr->il_next;
+    } /* end while */
+    HDassert(entries_visited == cache_ptr->index_len);
+    HDassert(num_entries_in_image <= num_entries_tentatively_in_image);
+
+    j = 0;
+    for(i = H5C_MAX_RING_IN_IMAGE + 1; i <= H5C_RING_SB; i++)
+        j += cache_ptr->index_ring_len[i];
+
+    /* This will change */
+    HDassert(entries_visited == (num_entries_tentatively_in_image + j));
+
+    cache_ptr->num_entries_in_image = num_entries_in_image;
+    entries_visited = 0;
+
+    /* Now scan the LRU list to set the lru_rank fields of all entries
+     * on the LRU.
+     *
+     * Note that we start with rank 1, and increment by 1 with each 
+     * entry on the LRU.  
+     *
+     * Note that manually pinned entryies will have lru_rank -1,
+     * and no flush dependency.  Putting these entries at the head of 
+     * the reconstructed LRU should be appropriate.
+     */
+    entry_ptr = cache_ptr->LRU_head_ptr;
+    while(entry_ptr != NULL) {
+	HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(entry_ptr->type != NULL);
+
+        /* to avoid confusion, don't set lru_rank on epoch markers.
+         * Note that we still increment the lru_rank, so that the holes
+         * in the sequence of entries on the LRU will indicate the 
+         * locations of epoch markers (if any) when we reconstruct 
+         * the LRU.
+         *
+         * Do not set lru_rank or increment lru_rank for entries 
+         * that will not be included in the cache image.
+         */
+	if(entry_ptr->type->id == H5AC_EPOCH_MARKER_ID)
+	    lru_rank++;
+	else if(entry_ptr->include_in_image) {
+	    entry_ptr->lru_rank = lru_rank;
+            lru_rank++;
+        } /* end else-if */
+
+        entries_visited++;
+        entry_ptr = entry_ptr->next;
+    } /* end while */
+    HDassert(entries_visited == cache_ptr->LRU_list_len);
+
+    image_len += H5F_SIZEOF_CHKSUM;
+    cache_ptr->image_data_len = image_len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__prep_for_file_close__scan_entries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__reconstruct_cache_contents()
+ *
+ * Purpose:     Scan the image buffer, and create a prefetched
+ *		cache entry for every entry in the buffer.  Insert the 
+ *		prefetched entries in the index and the LRU, and 
+ *		reconstruct any flush dependencies.  Order the entries 
+ *		in the LRU as indicated by the stored lru_ranks.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              8/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__reconstruct_cache_contents(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr)
+{
+    H5C_cache_entry_t *	pf_entry_ptr;   /* Pointer to prefetched entry */
+    H5C_cache_entry_t *	parent_ptr;     /* Pointer to parent of prefetched entry */
+    const uint8_t *	p;              /* Pointer into image buffer */
+    unsigned		u, v;           /* Local index variable */
+    herr_t 		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(cache_ptr == f->shared->cache);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->image_buffer);
+    HDassert(cache_ptr->image_len > 0);
+
+    /* Decode metadata cache image header */
+    p = (uint8_t *)cache_ptr->image_buffer;
+    if(H5C__decode_cache_image_header(f, cache_ptr, &p) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDECODE, FAIL, "cache image header decode failed")
+    HDassert((size_t)(p - (uint8_t *)cache_ptr->image_buffer) < cache_ptr->image_len);
+
+    /* The image_data_len and # of entries should be defined now */
+    HDassert(cache_ptr->image_data_len > 0);
+    HDassert(cache_ptr->image_data_len <= cache_ptr->image_len);
+    HDassert(cache_ptr->num_entries_in_image > 0);
+
+    /* Reconstruct entries in image */
+    for(u = 0; u < cache_ptr->num_entries_in_image; u++) {
+	/* Create the prefetched entry described by the ith
+         * entry in cache_ptr->image_entrise.
+         */
+	if(NULL == (pf_entry_ptr = H5C__reconstruct_cache_entry(f, cache_ptr, &p)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "reconstruction of cache entry failed")
+
+	/* Note that we make no checks on available cache space before 
+         * inserting the reconstructed entry into the metadata cache.
+         *
+         * This is OK since the cache must be almost empty at the beginning
+         * of the process, and since we check cache size at the end of the 
+         * reconstruction process.
+         */
+
+	/* Insert the prefetched entry in the index */
+	H5C__INSERT_IN_INDEX(cache_ptr, pf_entry_ptr, FAIL)
+
+	/* If dirty, insert the entry into the slist. */
+	if(pf_entry_ptr->is_dirty)
+	    H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, pf_entry_ptr, FAIL)
+
+        /* Append the entry to the LRU */
+	H5C__UPDATE_RP_FOR_INSERT_APPEND(cache_ptr, pf_entry_ptr, FAIL)
+
+	H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, pf_entry_ptr->is_dirty)
+
+	/* If the prefetched entry is the child in one or more flush 
+         * dependency relationships, recreate those flush dependencies.
+         */
+	for(v = 0; v < pf_entry_ptr->fd_parent_count; v++) {
+            /* Sanity checks */
+	    HDassert(pf_entry_ptr->fd_parent_addrs);
+	    HDassert(H5F_addr_defined(pf_entry_ptr->fd_parent_addrs[v]));
+
+            /* Find the parent entry */
+	    parent_ptr = NULL;
+	    H5C__SEARCH_INDEX(cache_ptr, pf_entry_ptr->fd_parent_addrs[v], parent_ptr, FAIL)
+	    if(parent_ptr == NULL)
+                HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "fd parent not in cache?!?")
+
+            /* Sanity checks */
+	    HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(parent_ptr->addr == pf_entry_ptr->fd_parent_addrs[v]);
+            HDassert(parent_ptr->lru_rank == -1);
+
+	    /* Must protect parent entry to set up a flush dependency.
+             * Do this now, and then uprotect when done.
+             */
+            H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, parent_ptr, FAIL)
+            parent_ptr->is_protected = TRUE;
+	    
+	    /* Setup the flush dependency */
+	    if(H5C_create_flush_dependency(parent_ptr, pf_entry_ptr) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "Can't restore flush dependency")
+
+	    /* And now unprotect */
+	    H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, parent_ptr, FAIL)
+	    parent_ptr->is_protected = FALSE;
+        } /* end for */
+    } /* end for */
+
+#ifndef NDEBUG
+    /* Scan the cache entries, and verify that each entry has
+     * the expected flush dependency status.
+     */
+    pf_entry_ptr = cache_ptr->il_head;
+    while(pf_entry_ptr != NULL) {
+        HDassert(pf_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert((pf_entry_ptr->prefetched && pf_entry_ptr->type == H5AC_PREFETCHED_ENTRY)
+            || (!pf_entry_ptr->prefetched && pf_entry_ptr->type != H5AC_PREFETCHED_ENTRY));
+        if(pf_entry_ptr->type == H5AC_PREFETCHED_ENTRY)
+            HDassert(pf_entry_ptr->fd_parent_count == pf_entry_ptr->flush_dep_nparents);
+
+        for(v = 0; v < pf_entry_ptr->fd_parent_count; v++) {
+            parent_ptr = pf_entry_ptr->flush_dep_parent[v];
+            HDassert(parent_ptr);
+            HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(pf_entry_ptr->fd_parent_addrs);
+            HDassert(pf_entry_ptr->fd_parent_addrs[v] == parent_ptr->addr);
+            HDassert(parent_ptr->flush_dep_nchildren > 0);
+        } /* end for */
+
+        if(pf_entry_ptr->type == H5AC_PREFETCHED_ENTRY) {
+            HDassert(pf_entry_ptr->fd_child_count == pf_entry_ptr->flush_dep_nchildren);
+            HDassert(pf_entry_ptr->fd_dirty_child_count == pf_entry_ptr->flush_dep_ndirty_children);
+        } /* end if */
+
+        pf_entry_ptr = pf_entry_ptr->il_next;
+    } /* end while */
+
+    /* Scan the LRU, and verify the expected ordering of the 
+     * prefetched entries.
+     */
+    {
+	int lru_rank_holes = 0;
+        H5C_cache_entry_t *entry_ptr;
+        int     i;              /* Local index variable */
+
+        i = -1;
+        entry_ptr = cache_ptr->LRU_head_ptr;
+
+        while(entry_ptr != NULL) {
+
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(entry_ptr->type != NULL);
+
+            if ( entry_ptr->prefetched ) {
+
+                HDassert(entry_ptr->lru_rank != 0);
+                HDassert((entry_ptr->lru_rank == -1) ||
+                         (entry_ptr->lru_rank > i));
+
+                if ( ( entry_ptr->lru_rank > 1 ) && 
+                     ( entry_ptr->lru_rank > i + 1 ) )
+
+                    lru_rank_holes += entry_ptr->lru_rank - (i + 1);
+
+                i = entry_ptr->lru_rank;
+
+            } /* end if */
+
+            entry_ptr = entry_ptr->next;
+        } /* end while */
+
+	/* Holes in the sequences of LRU ranks can appear due to epoch 
+         * markers.  They are left in to allow re-insertion of the
+         * epoch markers on reconstruction of the cache -- thus 
+         * the following sanity check will have to be revised when
+         * we add code to store and restore adaptive resize status.
+         */
+	HDassert(lru_rank_holes <= H5C__MAX_EPOCH_MARKERS);
+    } /* end block */
+#endif /* NDEBUG */
+
+    /* Check to see if the cache is oversize, and evict entries as 
+     * necessary to remain within limits.
+     */
+    if(cache_ptr->index_size >= cache_ptr->max_cache_size) {
+	/* cache is oversized -- call H5C__make_space_in_cache() with zero
+         * space needed to repair the situation if possible.
+         */
+        hbool_t write_permitted = FALSE;
+
+	if(cache_ptr->check_write_permitted != NULL) {
+	    if((cache_ptr->check_write_permitted)(f, &write_permitted) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "Can't get write_permitted")
+        } /* end if */
+        else
+            write_permitted = cache_ptr->write_permitted;
+
+	if(H5C__make_space_in_cache(f, dxpl_id, 0, write_permitted) < 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "H5C__make_space_in_cache failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__reconstruct_cache_contents() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__reconstruct_cache_entry()
+ *
+ * Purpose:     Allocate a prefetched metadata cache entry and initialize
+ *		it from image buffer.
+ *
+ *		Return a pointer to the newly allocated cache entry,
+ *		or NULL on failure.
+ *
+ * Return:      Pointer to the new instance of H5C_cache_entry on success, 
+ *		or NULL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              8/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5C_cache_entry_t *
+H5C__reconstruct_cache_entry(const H5F_t *f, H5C_t *cache_ptr,
+    const uint8_t **buf)
+{
+    H5C_cache_entry_t *pf_entry_ptr = NULL;     /* Reconstructed cache entry */
+    uint8_t             flags = 0;
+    hbool_t		is_dirty = FALSE;
+#ifndef NDEBUG	/* only used in assertions */
+    hbool_t		in_lru = FALSE;
+    hbool_t		is_fd_parent = FALSE;
+    hbool_t		is_fd_child = FALSE;
+#endif /* NDEBUG */ /* only used in assertions */
+    const uint8_t *	p;
+    hbool_t            file_is_rw;
+    H5C_cache_entry_t *ret_value = NULL;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->num_entries_in_image > 0);
+    HDassert(buf && *buf);
+
+    /* Key R/W access off of whether the image will be deleted */
+    file_is_rw = cache_ptr->delete_image;
+
+    /* Allocate space for the prefetched cache entry */
+    if(NULL == (pf_entry_ptr = H5FL_CALLOC(H5C_cache_entry_t)))
+	HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "memory allocation failed for prefetched cache entry")
+
+    /* Get pointer to buffer */
+    p = *buf;
+
+    /* Decode type id */
+    pf_entry_ptr->prefetch_type_id = *p++;
+
+    /* Decode flags */
+    flags = *p++;
+    if(flags & H5C__MDCI_ENTRY_DIRTY_FLAG)
+        is_dirty = TRUE;
+#ifndef NDEBUG	/* only used in assertions */
+    if(flags & H5C__MDCI_ENTRY_IN_LRU_FLAG)
+        in_lru = TRUE;
+    if(flags & H5C__MDCI_ENTRY_IS_FD_PARENT_FLAG)
+        is_fd_parent = TRUE;
+    if(flags & H5C__MDCI_ENTRY_IS_FD_CHILD_FLAG)
+        is_fd_child = TRUE;
+#endif /* NDEBUG */ /* only used in assertions */
+
+    /* Force dirty entries to clean if the file read only -- must do 
+     * this as otherwise the cache will attempt to write them on file
+     * close.  Since the file is R/O, the metadata cache image superblock
+     * extension message and the cache image block will not be removed.
+     * Hence no danger in this for subsequent opens.
+     *
+     * However, if the dirty entry (marked clean for purposes of the R/O
+     * file open) is evicted and then referred to, the cache will read
+     * either invalid or obsolete data from the file.  Handle this by 
+     * setting the prefetched_dirty field, and hiding such entries from
+     * the eviction candidate selection algorithm.
+     */
+    pf_entry_ptr->is_dirty = (is_dirty && file_is_rw);
+
+    /* Decode ring */
+    pf_entry_ptr->ring = *p++;
+    HDassert(pf_entry_ptr->ring > (uint8_t)(H5C_RING_UNDEFINED));
+    HDassert(pf_entry_ptr->ring < (uint8_t)(H5C_RING_NTYPES));
+
+    /* Decode age */
+    pf_entry_ptr->age = *p++;
+
+    /* Decode dependency child count */
+    UINT16DECODE(p, pf_entry_ptr->fd_child_count);
+    HDassert((is_fd_parent && pf_entry_ptr->fd_child_count > 0) || (!is_fd_parent && pf_entry_ptr->fd_child_count == 0));
+
+    /* Decode dirty dependency child count */
+    UINT16DECODE(p, pf_entry_ptr->fd_dirty_child_count);
+    if(!file_is_rw) 
+        pf_entry_ptr->fd_dirty_child_count      = 0;
+    if(pf_entry_ptr->fd_dirty_child_count > pf_entry_ptr->fd_child_count)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid dirty flush dependency child count")
+
+    /* Decode dependency parent count */
+    UINT16DECODE(p, pf_entry_ptr->fd_parent_count);
+    HDassert((is_fd_child && pf_entry_ptr->fd_parent_count > 0) || (!is_fd_child && pf_entry_ptr->fd_parent_count == 0));
+
+    /* Decode index in LRU */
+    INT32DECODE(p, pf_entry_ptr->lru_rank);
+    HDassert((in_lru && pf_entry_ptr->lru_rank >= 0) || (!in_lru && pf_entry_ptr->lru_rank == -1));
+
+    /* Decode entry offset */
+    H5F_addr_decode(f, &p, &pf_entry_ptr->addr);
+    if(!H5F_addr_defined(pf_entry_ptr->addr))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid entry offset")
+
+    /* Decode entry length */
+    H5F_DECODE_LENGTH(f, p, pf_entry_ptr->size);
+    if(pf_entry_ptr->size == 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid entry size")
+
+    /* Verify expected length of entry image */
+    if((size_t)(p - *buf) != H5C__cache_image_block_entry_header_size(f))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADSIZE, NULL, "Bad entry image len")
+    
+    /* If parent count greater than zero, allocate array for parent 
+     * addresses, and decode addresses into the array.
+     */
+    if(pf_entry_ptr->fd_parent_count > 0) {
+        unsigned u;          /* Local index variable */
+
+        if(NULL == (pf_entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_malloc((size_t)(pf_entry_ptr->fd_parent_count) * H5F_SIZEOF_ADDR(f))))
+	    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "memory allocation failed for fd parent addrs buffer")
+
+	for(u = 0; u < pf_entry_ptr->fd_parent_count; u++) {
+            H5F_addr_decode(f, &p, &(pf_entry_ptr->fd_parent_addrs[u]));
+            if(!H5F_addr_defined(pf_entry_ptr->fd_parent_addrs[u]))
+                HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid flush dependency parent offset")
+        } /* end for */
+    } /* end if */
+
+    /* Allocate buffer for entry image */
+    if(NULL == (pf_entry_ptr->image_ptr = H5MM_malloc(pf_entry_ptr->size + 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(((uint8_t *)pf_entry_ptr->image_ptr) + size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+
+    /* Copy the entry image from the cache image block */
+    HDmemcpy(pf_entry_ptr->image_ptr, p, pf_entry_ptr->size);
+    p += pf_entry_ptr->size;
+
+    /* Initialize the rest of the fields in the prefetched entry */
+    /* (Only need to set non-zero/NULL/FALSE fields, due to calloc() above) */
+    pf_entry_ptr->magic				= H5C__H5C_CACHE_ENTRY_T_MAGIC;
+    pf_entry_ptr->cache_ptr 			= cache_ptr;
+    pf_entry_ptr->image_up_to_date		= TRUE;
+    pf_entry_ptr->type				= H5AC_PREFETCHED_ENTRY;
+    pf_entry_ptr->prefetched			= TRUE;
+    pf_entry_ptr->prefetched_dirty              = is_dirty && (!file_is_rw);
+
+    /* Sanity checks */
+    HDassert(pf_entry_ptr->size > 0 && pf_entry_ptr->size < H5C_MAX_ENTRY_SIZE);
+
+    /* Update buffer pointer */
+    *buf = p;
+
+    ret_value = pf_entry_ptr;
+
+done:
+    if(NULL == ret_value && pf_entry_ptr)
+        pf_entry_ptr = H5FL_FREE(H5C_cache_entry_t, pf_entry_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__reconstruct_cache_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__write_cache_image_superblock_msg
+ *
+ * Purpose:     Write the cache image superblock extension message, 
+ *		creating if specified.
+ *
+ *		In general, the size and location of the cache image block
+ *		will be unknow at the time that the cache image superblock
+ *		message is created.  A subsequent call to this routine will
+ *		be used to write the correct data.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/4/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__write_cache_image_superblock_msg(H5F_t *f, hid_t dxpl_id, hbool_t create)
+{
+    H5C_t *		cache_ptr;
+    H5O_mdci_t 	        mdci_msg;	/* metadata cache image message */
+					/* to insert in the superblock  */
+					/* extension.			*/
+    unsigned	   	mesg_flags = H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->close_warning_received);
+
+    /* Write data into the metadata cache image superblock extension message.
+     * Note that this data will be bogus when we first create the message.
+     * We will overwrite this data later in a second call to this function.
+     */
+    mdci_msg.addr = cache_ptr->image_addr;
+#ifdef H5_HAVE_PARALLEL
+    if(cache_ptr->aux_ptr) { /* we have multiple processes */
+        H5AC_aux_t * aux_ptr;
+
+        aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+        HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+        mdci_msg.size = aux_ptr->p0_image_len;
+    } /* end if */
+    else
+#endif /* H5_HAVE_PARALLEL */
+        mdci_msg.size = cache_ptr->image_len;
+
+    /* Write metadata cache image message to superblock extension */
+    if(H5F_super_ext_write_msg(f, dxpl_id, H5O_MDCI_MSG_ID, &mdci_msg, create, mesg_flags) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, "can't write metadata cache image message to superblock extension")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__write_cache_image_superblock_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__write_cache_image
+ *
+ * Purpose:	Write the supplied metadata cache image to the specified
+ *		location in file.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              8/26/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__write_cache_image(H5F_t *f, hid_t dxpl_id, const H5C_t *cache_ptr)
+{
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(cache_ptr);
+    HDassert(H5F_addr_defined(cache_ptr->image_addr));
+    HDassert(cache_ptr->image_len > 0);
+    HDassert(cache_ptr->image_buffer);
+
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_aux_t *aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
+
+    if((NULL == aux_ptr) || (aux_ptr->mpi_rank == 0)) {
+	HDassert((NULL == aux_ptr) || (aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC));
+#endif /* H5_HAVE_PARALLEL */
+
+	/* Write the buffer (if serial access, or rank 0 for parallel access) */
+	if(H5F_block_write(f, H5FD_MEM_SUPER, cache_ptr->image_addr, cache_ptr->image_len, dxpl_id, cache_ptr->image_buffer) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't write metadata cache image block to file")
+#ifdef H5_HAVE_PARALLEL
+    } /* end if */
+} /* end block */
+#endif /* H5_HAVE_PARALLEL */
+	
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__write_cache_image() */
+
diff --git a/src/H5Clog.c b/src/H5Clog.c
new file mode 100644
index 0000000..3353619
--- /dev/null
+++ b/src/H5Clog.c
@@ -0,0 +1,368 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Clog.c
+ *                      May 30 2016
+ *                      Quincey Koziol
+ *
+ * Purpose:             Functions for generic cache logging in JSON format
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#include "H5Cmodule.h"         /* This source code file is part of the H5C module */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#ifdef H5_HAVE_PARALLEL
+#define H5AC_FRIEND		/*suppress error about including H5ACpkg	  */
+#include "H5ACpkg.h"            /* Metadata cache                       */
+#endif /* H5_HAVE_PARALLEL */
+#include "H5Cpkg.h"            /* Metadata cache                       */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * 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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+
+    /* 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 *)H5MM_calloc(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);
+    } /* end else */
+#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)
+        file_name = (char *)H5MM_xfree(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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_tear_down_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* 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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_start_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* 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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_stop_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* 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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+
+    /* 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(NULL == is_enabled)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+    if(NULL == is_currently_logging)
+        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
+ *
+ * Programmer:	Dana Robinson
+ *              Sunday, March 16, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+
+    /* 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() */
+
diff --git a/src/H5Cmodule.h b/src/H5Cmodule.h
index 2c39eab..534404d 100644
--- a/src/H5Cmodule.h
+++ b/src/H5Cmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Cmpio.c b/src/H5Cmpio.c
index 4e88e44..a75cd88 100644
--- a/src/H5Cmpio.c
+++ b/src/H5Cmpio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -64,9 +62,12 @@
 /********************/
 /* Local Prototypes */
 /********************/
-static herr_t H5C__collective_write(H5F_t *f, hid_t dxpl_id,
-    H5SL_t *collective_write_list);
-static herr_t H5C__collective_write_free(void *_item, void *key, void *op_data);
+static herr_t H5C__collective_write(H5F_t *f, hid_t dxpl_id);
+static herr_t H5C__flush_candidate_entries(H5F_t *f, hid_t dxpl_id, 
+    unsigned entries_to_flush[H5C_RING_NTYPES], 
+    unsigned entries_to_clear[H5C_RING_NTYPES]);
+static herr_t H5C__flush_candidates_in_ring(H5F_t *f, hid_t dxpl_id, 
+    H5C_ring_t ring, unsigned  entries_to_flush, unsigned entries_to_clear);
 
 
 /*********************/
@@ -83,9 +84,6 @@ static herr_t H5C__collective_write_free(void *_item, void *key, void *op_data);
 /* Local Variables */
 /*******************/
 
-/* Declare a free list to manage the H5C_collective_write_t struct */
-H5FL_DEFINE(H5C_collective_write_t);
-
 
 

 /*-------------------------------------------------------------------------
@@ -169,110 +167,78 @@ H5FL_DEFINE(H5C_collective_write_t);
  * 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,
+                         unsigned 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;
+    unsigned		first_entry_to_flush;
+    unsigned		last_entry_to_flush;
+    unsigned		total_entries_to_clear = 0;
+    unsigned		total_entries_to_flush = 0;
     int               * candidate_assignment_table = NULL;
+    unsigned            entries_to_flush[H5C_RING_NTYPES];
+    unsigned            entries_to_clear[H5C_RING_NTYPES];
     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;
-    H5SL_t            * collective_write_list = 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 */
+    unsigned            u;                      /* Local index variable */
+    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 );
+    /* Sanity checks */
+    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);
+
+    /* Initialize the entries_to_flush and entries_to_clear arrays */
+    HDmemset(entries_to_flush, 0, sizeof(entries_to_flush));
+    HDmemset(entries_to_clear, 0, sizeof(entries_to_clear));
 
 #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';
+    HDfprintf(stdout, "%s:%d: setting up candidate assignment table.\n", FUNC, mpi_rank);
+
+    HDmemset(tbl_buf, 0, sizeof(tbl_buf));
+
     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)));
-    }
+    for(u = 0; u < num_candidates; u++)
+        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " 0x%llx", (long long)(*(candidates_list_ptr + u)));
     sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
+
     HDfprintf(stdout, "%s", tbl_buf);
 #endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
 
     if(f->coll_md_write) {
+        /* Sanity check */
+        HDassert(NULL == cache_ptr->coll_write_list);
+
         /* Create skip list of entries for collective write */
-        if(NULL == (collective_write_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        if(NULL == (cache_ptr->coll_write_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
             HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't create skip list for entries")
     } /* end if */
 
     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")
 
@@ -300,9 +266,8 @@ H5C_apply_candidate_list(H5F_t * f,
     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++ ) 
-    {
+    /* 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];
@@ -326,443 +291,123 @@ H5C_apply_candidate_list(H5F_t * f,
     sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
     HDfprintf(stdout, "%s", tbl_buf);
 
-    HDfprintf(stdout, "%s:%d: flush entries [%d, %d].\n", 
+    HDfprintf(stdout, "%s:%d: flush entries [%u, %u].\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) );
+    for(u = 0; u < num_candidates; u++) {
+        addr = candidates_list_ptr[u];
+        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")
-            }
-        }
+        if(u > 0) {
+            if(last_addr == addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "duplicate entry in cleaned list")
+            else if(last_addr > addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "candidate list not sorted")
+        } /* end if */
 
         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 ) {
+        if(entry_ptr == NULL)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "listed candidate entry not in cache?!?!?")
+        if(!entry_ptr->is_dirty)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not dirty?!?!?")
+        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 */
-
-            /* Entries marked as collectively accessed and are in the
-               candidate list to clear from the cache have to be
-               removed from the coll list. This is OK since the
-               candidate list is collective and uniform across all
-               ranks. */
-            if(TRUE == entry_ptr->coll_access) {
-                entry_ptr->coll_access = FALSE;
-                H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, FAIL)
-            } /* end if */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry is protected?!?!?")
+
+        /* Sanity checks */
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(entry_ptr->ring >= H5C_RING_USER);
+        HDassert(entry_ptr->ring <= H5C_RING_SB);
+        HDassert(!entry_ptr->flush_immediately);
+        HDassert(!entry_ptr->clear_on_unprotect);
+
+        /* 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(u >= first_entry_to_flush && u <= last_entry_to_flush) {
+            total_entries_to_flush++;
+            entries_to_flush[entry_ptr->ring]++;
+            entry_ptr->flush_immediately = TRUE;
+        } /* end if */
+        else {
+            total_entries_to_clear++;
+            entries_to_clear[entry_ptr->ring]++;
+            entry_ptr->clear_on_unprotect = TRUE;
         } /* end else */
+
+        /* Entries marked as collectively accessed and are in the
+         * candidate list to clear from the cache have to be
+         * removed from the coll list. This is OK since the
+         * candidate list is collective and uniform across all
+         * ranks. 
+         */
+        if(entry_ptr->coll_access) {
+            entry_ptr->coll_access = FALSE;
+            H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, FAIL)
+        } /* end if */
     } /* end for */
 
+#if H5C_DO_SANITY_CHECKS
+    m = 0;
+    n = 0;
+    for(i = 0; i < H5C_RING_NTYPES; i++) {
+        m += (int)entries_to_flush[i];
+        n += (int)entries_to_clear[i];
+    } /* end if */
+
+    HDassert((unsigned)m == total_entries_to_flush);
+    HDassert((unsigned)n == total_entries_to_clear);
+#endif /* H5C_DO_SANITY_CHECKS */
+
 #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);
+    HDfprintf(stdout, "%s:%d: num candidates/to clear/to flush = %u/%u/%u.\n", 
+              FUNC, mpi_rank, num_candidates, total_entries_to_clear,
+              total_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.
+     * for these entries and do the deed.  Do this via a call to 
+     * H5C__flush_candidate_entries().
      *
      * 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 flag 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, NULL) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, 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;
-
-            /* Add this entry to the list of entries to collectively write */
-            if(H5C__flush_single_entry(f, dxpl_id, flush_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, collective_write_list) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, 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 will require a more
-                   intense rework of this function and potentially the function
-                   of candidate lists as a whole. */
-
-                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, NULL) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, 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 */
-
-                /* Add this entry to the list of entries to collectively write */
-                if(H5C__flush_single_entry(f, dxpl_id, flush_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, collective_write_list) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, 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) {
-            if(H5C__flush_single_entry(f, dxpl_id, delayed_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG, NULL, NULL) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry.")
-
-            entry_ptr->clear_on_unprotect = FALSE;
-            entries_cleared++;
-        } else if (delayed_ptr->flush_immediately) {
-            /* Add this entry to the list of entries to collectively write */
-            if(H5C__flush_single_entry(f, dxpl_id, delayed_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL, collective_write_list) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry collectively.")
-
-            entry_ptr->flush_immediately = FALSE;
-            entries_flushed++;
-        } /* end if */
-
-        entries_flushed_collectively++;
-        entries_flushed_or_cleared_last++;
-    } /* end if */
+     if(H5C__flush_candidate_entries(f, dxpl_id, entries_to_flush, entries_to_clear) < 0)
+         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush candidates failed")
 
     /* If we've deferred writing to do it collectively, take care of that now */
     if(f->coll_md_write) {
-        HDassert(collective_write_list);
+        /* Sanity check */
+        HDassert(cache_ptr->coll_write_list);
 
         /* Write collective list */
-        if(H5C__collective_write(f, dxpl_id, collective_write_list) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, "Can't write metadata collectively")
+        if(H5C__collective_write(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, "can't write metadata collectively")
     } /* 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);
-
-    if(collective_write_list)
-        if(H5SL_destroy(collective_write_list, H5C__collective_write_free, NULL) < 0)
+    if(cache_ptr->coll_write_list) {
+        if(H5SL_close(cache_ptr->coll_write_list) < 0)
             HDONE_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "failed to destroy skip list")
+        cache_ptr->coll_write_list = NULL;
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5C_apply_candidate_list() */
@@ -814,7 +459,7 @@ H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
 
     if(space_needed > 0) { /* we have work to do */
         H5C_cache_entry_t *entry_ptr;
-        int     nominated_entries_count = 0;
+        unsigned nominated_entries_count = 0;
         size_t  nominated_entries_size = 0;
         haddr_t	nominated_addr;
 
@@ -835,7 +480,7 @@ H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
 
             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).")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed")
 
             nominated_entries_size += entry_ptr->size;
             nominated_entries_count++;
@@ -859,7 +504,7 @@ H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
 
                 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).")
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed")
 
                 nominated_entries_size += entry_ptr->size;
                 nominated_entries_count++;
@@ -928,7 +573,7 @@ H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr)
 
     if(space_needed > 0) { /* we have work to do */
         H5C_cache_entry_t *entry_ptr;
-        int    nominated_entries_count = 0;
+        unsigned nominated_entries_count = 0;
         size_t nominated_entries_size = 0;
 
         HDassert( cache_ptr->slist_len > 0 );
@@ -951,7 +596,7 @@ H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr)
 
             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.")
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed")
 
             nominated_entries_size += entry_ptr->size;
             nominated_entries_count++;
@@ -995,51 +640,30 @@ done:
  * 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,
+                          unsigned  ce_array_len,
                           haddr_t * ce_array_ptr)
 {
     H5C_t *             cache_ptr;
-    int			entries_cleared;
-    int			entries_examined;
-    int                 i;
-    int			initial_list_len;
+    unsigned		entries_cleared;
+    unsigned            pinned_entries_cleared;
+    hbool_t             progress;
+    unsigned		entries_examined;
+    unsigned		initial_list_len;
     haddr_t		addr;
+    unsigned		pinned_entries_marked = 0;
 #if H5C_DO_SANITY_CHECKS
-    int			pinned_entries_marked = 0;
-    int			protected_entries_marked = 0;
-    int			other_entries_marked = 0;
+    unsigned		protected_entries_marked = 0;
+    unsigned		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;
+    unsigned            u;
     herr_t		ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -1054,46 +678,30 @@ H5C_mark_entries_as_clean(H5F_t *  f,
     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");
-    }
+    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")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    for ( i = 0; i < ce_array_len; i++ )
-    {
-        addr = ce_array_ptr[i];
+    for(u = 0; u < ce_array_len; u++) {
+        addr = ce_array_ptr[u];
 
 #if H5C_DO_SANITY_CHECKS
-        if ( i == 0 ) {
-
+        if(u == 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");
-            }
-        }
+        else {
+            if(last_addr == addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Duplicate entry in cleaned list")
+            if(last_addr > addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "cleaned list not sorted")
+        } /* end else */
 
 #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");
-        }
+        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")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 #endif /* H5C_DO_SANITY_CHECKS */
 
@@ -1101,28 +709,24 @@ H5C_mark_entries_as_clean(H5F_t *  f,
 
         H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
 
-        if ( entry_ptr == NULL ) {
+        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);
+                  "H5C_mark_entries_as_clean: entry[%u] = %a not in cache.\n",
+                      u,
+                      addr);
 #endif /* H5C_DO_SANITY_CHECKS */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "Listed entry not in cache?!?!?.")
-
-        } else if ( ! entry_ptr->is_dirty ) {
-
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not in cache?!?!?")
+        } /* end if */
+        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);
+                      "H5C_mark_entries_as_clean: entry %a is not dirty!?!\n",
+                      addr);
 #endif /* H5C_DO_SANITY_CHECKS */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "Listed entry not dirty?!?!?.")
-
-        } else {
-
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not dirty?!?!?")
+        } /* end else-if */
+        else {
             /* Mark the entry to be cleared on unprotect.  We will
              * scan the LRU list shortly, and clear all those entries
              * not currently protected.
@@ -1136,19 +740,13 @@ H5C_mark_entries_as_clean(H5F_t *  f,
             } /* end if */
 
             entry_ptr->clear_on_unprotect = TRUE;
+	    if(entry_ptr->is_pinned)
+		pinned_entries_marked++;
 #if H5C_DO_SANITY_CHECKS
-	    if ( entry_ptr->is_protected ) {
-
+	    else if(entry_ptr->is_protected)
 		protected_entries_marked++;
-
-	    } else if ( entry_ptr->is_pinned ) {
-
-		pinned_entries_marked++;
-
-	    } else {
-
+	    else
 		other_entries_marked++;
-	    }
 #endif /* H5C_DO_SANITY_CHECKS */
         }
     }
@@ -1160,7 +758,7 @@ H5C_mark_entries_as_clean(H5F_t *  f,
      *
      * 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 
+     * H5C__flush_single_entry() with the H5C__FLUSH_CLEAR_ONLY_FLAG 
      * set.  As a result, the pre_serialize() and serialize calls are 
      * not made.
      *
@@ -1178,31 +776,26 @@ H5C_mark_entries_as_clean(H5F_t *  f,
      * 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 ) {
-
+    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, NULL) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't clear entry.")
-        } else {
-
+            if(H5C__flush_single_entry(f, dxpl_id, clear_ptr,
+                    (H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__GENERATE_IMAGE_FLAG | H5C__UPDATE_PAGE_BUFFER_FLAG)) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear entry")
+        } /* end if */
+        else
             entry_ptr = entry_ptr->prev;
-        }
         entries_examined++;
-    }
+    } /* end while */
 
 #if H5C_DO_SANITY_CHECKS
     HDassert( entries_cleared == other_entries_marked );
@@ -1211,25 +804,28 @@ H5C_mark_entries_as_clean(H5F_t *  f,
     /* It is also possible that some of the cleared entries are on the
      * pinned list.  Must scan that also.
      */
+    pinned_entries_cleared = 0;
+    progress = TRUE;
+    while((pinned_entries_cleared < pinned_entries_marked) && progress) {
+        progress = FALSE;
+        entry_ptr = cache_ptr->pel_head_ptr;
+        while(entry_ptr != NULL) {
+            if(entry_ptr->clear_on_unprotect && entry_ptr->flush_dep_ndirty_children == 0) {
+                entry_ptr->clear_on_unprotect = FALSE;
+                clear_ptr = entry_ptr;
+                entry_ptr = entry_ptr->next;
+                entries_cleared++;
+                pinned_entries_cleared++;
+                progress = TRUE;
 
-    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, NULL) < 0 )
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't clear entry.")
-        } else {
-
-            entry_ptr = entry_ptr->next;
-        }
-    }
+                if(H5C__flush_single_entry(f, dxpl_id, clear_ptr, 
+                        (H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__GENERATE_IMAGE_FLAG | H5C__UPDATE_PAGE_BUFFER_FLAG)) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear entry")
+            } /* end if */
+            else
+                entry_ptr = entry_ptr->next;
+        }  /* end while */
+    } /* end while */
 
 #if H5C_DO_SANITY_CHECKS
     HDassert( entries_cleared == pinned_entries_marked + other_entries_marked );
@@ -1240,33 +836,28 @@ H5C_mark_entries_as_clean(H5F_t *  f,
               ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) );
 
 #if H5C_DO_SANITY_CHECKS
-    i = 0;
+    u = 0;
     entry_ptr = cache_ptr->pl_head_ptr;
     while ( entry_ptr != NULL )
     {
         if ( entry_ptr->clear_on_unprotect ) {
 
-            i++;
+            u++;
         }
         entry_ptr = entry_ptr->next;
     }
-    HDassert( (entries_cleared + i) == ce_array_len );
+    HDassert( (entries_cleared + u) == 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");
-    }
+    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")
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_mark_entries_as_clean() */
 
 

@@ -1287,7 +878,7 @@ done:
 herr_t
 H5C_clear_coll_entries(H5C_t *cache_ptr, hbool_t partial)
 { 
-    int32_t		clear_cnt;
+    uint32_t		clear_cnt;
     H5C_cache_entry_t *	entry_ptr = NULL;
     herr_t              ret_value = SUCCEED;
 
@@ -1331,8 +922,9 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C__collective_write(H5F_t *f, hid_t dxpl_id, H5SL_t *collective_write_list)
+H5C__collective_write(H5F_t *f, hid_t dxpl_id)
 {
+    H5AC_t              *cache_ptr;
     H5P_genplist_t      *plist = NULL;
     H5FD_mpio_xfer_t    orig_xfer_mode = H5FD_MPIO_COLLECTIVE;
     int                 count;
@@ -1348,55 +940,78 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id, H5SL_t *collective_write_list)
 
     FUNC_ENTER_STATIC
 
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->coll_write_list != NULL);
+
     /* Get original transfer mode */
     if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \
+                    "not a data transfer property list")
+
     if(H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, &orig_xfer_mode) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
 
     /* Get number of entries in collective write list */
-    count = (int)H5SL_count(collective_write_list);
+    count = (int)H5SL_count(cache_ptr->coll_write_list);
 
     if(count > 0) {
         H5FD_mpio_xfer_t    xfer_mode = H5FD_MPIO_COLLECTIVE;
         H5SL_node_t         *node;
-        H5C_collective_write_t *item;
+        H5C_cache_entry_t   *entry_ptr;
         void                *base_buf;
         int                 i;
 
         if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \
+                        "can't set MPI-I/O property")
 
         /* Allocate arrays */
-        if(NULL == (length_array = (int *)H5MM_malloc((size_t)count * sizeof(int))))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective write table length array")
-        if(NULL == (buf_array = (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective buf table length array")
-        if(NULL == (offset_array = (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective offset table length array")
+        if ( NULL == (length_array = 
+                      (int *)H5MM_malloc((size_t)count * sizeof(int))) )
+
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \
+            "memory allocation failed for collective write table length array")
+
+        if ( NULL == (buf_array = 
+                 (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))) )
+
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \
+              "memory allocation failed for collective buf table length array")
+
+        if(NULL == (offset_array = 
+                    (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))) )
+
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \
+            "memory allocation failed for collective offset table length array")
 
         /* Fill arrays */
-        node = H5SL_first(collective_write_list);
+        node = H5SL_first(cache_ptr->coll_write_list);
         HDassert(node);
-        if(NULL == (item = (H5C_collective_write_t *)H5SL_item(node)))
-            HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't retrieve skip list item")
+        if(NULL == (entry_ptr = (H5C_cache_entry_t *)H5SL_item(node)))
+            HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, \
+                        "can't retrieve skip list item")
 
         /* Set up initial array position & buffer base address */
-        length_array[0] = (int)item->length;
-        base_buf = item->buf;
+        length_array[0] = (int)entry_ptr->size;
+        base_buf = entry_ptr->image_ptr;
         buf_array[0] = (MPI_Aint)0;
-        offset_array[0] = (MPI_Aint)item->offset;
+        offset_array[0] = (MPI_Aint)entry_ptr->addr;
 
         node = H5SL_next(node);
         i = 1;
         while(node) {
-            if(NULL == (item = (H5C_collective_write_t *)H5SL_item(node)))
-                HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't retrieve skip list item")
+
+            if(NULL == (entry_ptr = (H5C_cache_entry_t *)H5SL_item(node)))
+                HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, \
+                            "can't retrieve skip list item")
 
             /* Set up array position */
-            length_array[i] = (int)item->length;
-            buf_array[i] = (MPI_Aint)item->buf - (MPI_Aint)base_buf;
-            offset_array[i] = (MPI_Aint)item->offset;
+            length_array[i] = (int)entry_ptr->size;
+            buf_array[i] = (MPI_Aint)entry_ptr->image_ptr - (MPI_Aint)base_buf;
+            offset_array[i] = (MPI_Aint)entry_ptr->addr;
 
             /* Advance to next node & array location */
             node = H5SL_next(node);
@@ -1404,48 +1019,85 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id, H5SL_t *collective_write_list)
         } /* end while */
 
         /* Create memory MPI type */
-        if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed(count, length_array, buf_array, MPI_BYTE, &btype)))
+        if(MPI_SUCCESS != (mpi_code = 
+                           MPI_Type_create_hindexed(count, length_array, 
+                                                    buf_array, MPI_BYTE, 
+                                                    &btype)))
             HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
+
         btype_created = TRUE;
+
         if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&btype)))
             HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
 
         /* Create file MPI type */
-        if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed(count, length_array, offset_array, MPI_BYTE, &ftype)))
+        if(MPI_SUCCESS != (mpi_code = 
+                           MPI_Type_create_hindexed(count, length_array, 
+                                                    offset_array, MPI_BYTE, 
+                                                    &ftype)))
             HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
+
         ftype_created = TRUE;
+
         if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&ftype)))
             HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
 
         /* Pass buf type, file type to the file driver */
         if(H5FD_mpi_setup_collective(dxpl_id, &btype, &ftype) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O properties")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \
+                        "can't set MPI-I/O properties")
 
         /* Write data */
-        if(H5F_block_write(f, H5FD_MEM_DEFAULT, (haddr_t)0, (size_t)1, dxpl_id, base_buf) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to write entries collectively")
+        if(H5F_block_write(f, H5FD_MEM_DEFAULT, (haddr_t)0, 
+                           (size_t)1, dxpl_id, base_buf) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+                        "unable to write entries collectively")
+
     } /* end if */
     else {
         MPI_Status mpi_stat;
-        MPI_File mpi_fh_p;
+        MPI_File *mpi_fh_p;
         MPI_File mpi_fh;
+        MPI_Info *info_p;
+        MPI_Info info;
 
         if(H5F_get_mpi_handle(f, (MPI_File **)&mpi_fh_p) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get mpi file handle")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, \
+                        "can't get mpi file handle")
+
         mpi_fh = *(MPI_File*)mpi_fh_p;
 
-        /* just to match up with the 1st MPI_File_set_view from H5FD_mpio_write() */
-        if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL)))
+        if (H5F_get_mpi_info(f, &info_p) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, \
+                        "can't get mpi file info")
+
+        info = *info_p;
+
+        /* just to match up with the 1st MPI_File_set_view from 
+         * H5FD_mpio_write() 
+         */
+        if(MPI_SUCCESS != (mpi_code = 
+                           MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, 
+                                             MPI_BYTE, "native", 
+                                             info)))
             HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
 
         /* just to match up with MPI_File_write_at_all from H5FD_mpio_write() */
         HDmemset(&mpi_stat, 0, sizeof(MPI_Status));
-        if(MPI_SUCCESS != (mpi_code = MPI_File_write_at_all(mpi_fh, (MPI_Offset)0, NULL, 0, MPI_BYTE, &mpi_stat)))
+        if(MPI_SUCCESS != (mpi_code = 
+                           MPI_File_write_at_all(mpi_fh, (MPI_Offset)0, 
+                                                 NULL, 0, MPI_BYTE, &mpi_stat)))
             HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at_all failed", mpi_code)
 
-        /* just to match up with the 2nd MPI_File_set_view (reset) in H5FD_mpio_write() */
-        if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL)))
+        /* just to match up with the 2nd MPI_File_set_view (reset) in 
+         * H5FD_mpio_write() 
+         */
+        if(MPI_SUCCESS != (mpi_code = 
+                           MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, 
+                                             MPI_BYTE, "native", 
+                                             info)))
             HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
+
     } /* end else */
 
 done:
@@ -1464,7 +1116,8 @@ done:
     if(orig_xfer_mode != H5FD_MPIO_COLLECTIVE) {
         HDassert(plist);
         if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &orig_xfer_mode) < 0)
-            HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property")
+            HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \
+                        "can't set MPI-I/O property")
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value);
@@ -1472,33 +1125,508 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C__flush_candidate_entries
  *
- * Function:    H5C__collective_write_free
+ * Purpose:	Flush or clear (as indicated) the candidate entries that
+ *              have been marked in the metadata cache.  In so doing,
+ *              observe rings and flush dependencies.
  *
- * Purpose:     Release node on collective write skiplist
+ *              Note that this function presumes that:
  *
- * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *              1) no candidate entries are protected,
  *
- * Programmer:  Mohamad Chaarawi
- *              February, 2016
+ *              2) all candidate entries are dirty, and
+ *
+ *              3) if a candidate entry has a dirty flush dependency
+ *                 child, that child is also a candidate entry.
+ *
+ *              The function will fail if any of these preconditions are
+ *              not met.
+ *
+ *              Candidate entries are marked by setting either the
+ *              flush_immediately or the clear_on_unprotect flags in the
+ *              cache entry (but not both).  Entries marked flush_immediately
+ *              will be flushed, those marked clear_on_unprotect will be
+ *              cleared.
+ *
+ *              Note that this function is a modified version of
+ *              H5C_flush_cache() -- any changes there may need to be
+ *              reflected here and vise versa.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer
+ *		2/10/17
+ *
+ * Changes:	None.
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C__collective_write_free(void *_item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op_data)
+H5C__flush_candidate_entries(H5F_t *f, hid_t dxpl_id,
+    unsigned entries_to_flush[H5C_RING_NTYPES],
+    unsigned entries_to_clear[H5C_RING_NTYPES])
 {
-    H5C_collective_write_t *item = (H5C_collective_write_t *)_item;
+#if H5C_DO_SANITY_CHECKS
+    int			i;
+    uint32_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;
+    uint32_t		slist_len = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+    H5C_ring_t		ring;
+    H5C_t             * cache_ptr;
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    HDassert(f);
+    HDassert(f->shared);
 
-    FUNC_ENTER_STATIC_NOERR
+    cache_ptr = f->shared->cache;
 
-    /* Sanity check */
-    HDassert(item);
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->slist_ptr);
 
-    if(item->free_buf)
-        item->buf = H5MM_xfree(item->buf);
-    H5FL_FREE(H5C_collective_write_t, item);
+    HDassert(entries_to_flush[H5C_RING_UNDEFINED] == 0);
+    HDassert(entries_to_clear[H5C_RING_UNDEFINED] == 0);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5C__collective_write_free() */
+#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 */
+
+    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 */
+
+#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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    cache_ptr->flush_in_progress = TRUE;
+
+    /* flush each ring, starting from the outermost ring and
+     * working inward.
+     */
+    ring = H5C_RING_USER;
+    while(ring < H5C_RING_NTYPES) {
+        if(H5C__flush_candidates_in_ring(f, dxpl_id, ring, entries_to_flush[ring], entries_to_clear[ring]) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush candidates in ring failed")
+
+        ring++;
+    }  /* end while */
+
+done:
+    cache_ptr->flush_in_progress = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__flush_candidate_entries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__flush_candidates_in_ring
+ *
+ * Purpose:	Flush or clear (as indicated) the candidate entries
+ *              contained in the specified cache and ring.  All candidate
+ *              entries in rings outside the specified ring must have been
+ *              flushed (or cleared) on entry.
+ *
+ *              Note that this function presumes that:
+ *
+ *              1) no candidate entries are protected,
+ *
+ *              2) all candidate entries are dirty, and
+ *
+ *              3) if a candidate entry has a dirty flush dependency
+ *                 child, that child is also a candidate entry.
+ *
+ *              The function will fail if any of these preconditions are
+ *              not met.
+ *
+ *              Candidate entries are marked by setting either the
+ *              flush_immediately or the clear_on_unprotect flags in the
+ *              cache entry (but not both).  Entries marked flush_immediately
+ *              will be flushed, those marked clear_on_unprotect will be
+ *              cleared.
+ *
+ *              Candidate entries residing in the LRU must be flushed
+ *              (or cleared) in LRU order to avoid performance issues.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer
+ *		2/10/17
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__flush_candidates_in_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,
+    unsigned  entries_to_flush, unsigned entries_to_clear)
+{
+    H5C_t   * cache_ptr;
+    hbool_t   progress;
+    hbool_t   restart_scan = FALSE;
+    unsigned  entries_flushed = 0;
+    unsigned  entries_cleared = 0;
+#if H5C_DO_SANITY_CHECKS
+    unsigned  init_index_len;
+#endif /* H5C_DO_SANITY_CHECKS */
+    unsigned  clear_flags = H5C__FLUSH_CLEAR_ONLY_FLAG |
+                            H5C__GENERATE_IMAGE_FLAG |
+                            H5C__UPDATE_PAGE_BUFFER_FLAG;
+    unsigned  flush_flags = H5C__NO_FLAGS_SET;
+    unsigned  op_flags;
+    H5C_cache_entry_t *op_ptr;
+    H5C_cache_entry_t *entry_ptr;
+    herr_t    ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    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);
+
+#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")
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+#if H5C_DO_SANITY_CHECKS
+    /* index len should not change */
+    init_index_len = cache_ptr->index_len;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    /* Examine entries in the LRU list, and flush or clear all entries
+     * so marked in the target ring.
+     *
+     * With the current implementation of flush dependencies, no entry
+     * in the LRU can have flush dependency children -- thus one pass
+     * through the LRU will be sufficient.
+     *
+     * It is possible that this will change -- hence the assertion.
+     */
+    restart_scan = FALSE;
+    entry_ptr = cache_ptr->LRU_tail_ptr;
+    while(((entries_flushed < entries_to_flush) || (entries_cleared < entries_to_clear))
+            && (entry_ptr != NULL)) {
+        hbool_t prev_is_dirty = FALSE;
+        H5C_cache_entry_t *next_ptr;
+
+        /* Entries in the LRU must not have flush dependency children */
+        HDassert(entry_ptr->flush_dep_nchildren == 0);
+
+        /* Remember dirty state of entry to advance to */
+        if(entry_ptr->prev != NULL)
+            prev_is_dirty = entry_ptr->prev->is_dirty;
+
+        /* If the entry is in the ring */
+        if(entry_ptr->ring == ring) {
+            /* If this process needs to clear this entry. */
+            if(entry_ptr->clear_on_unprotect) {
+                HDassert(entry_ptr->is_dirty);
+
+                /* Set entry and flags for operation */
+                op_ptr = entry_ptr;
+                op_flags = clear_flags;
+
+                /* Set next entry appropriately */
+                next_ptr = entry_ptr->next;
+
+                /* Reset entry flag */
+                entry_ptr->clear_on_unprotect = FALSE;
+                entries_cleared++;
+            } /* end if */
+            else if(entry_ptr->flush_immediately) {
+                HDassert(entry_ptr->is_dirty);
+
+                /* Set entry and flags for operation */
+                op_ptr = entry_ptr;
+                op_flags = flush_flags;
+
+                /* Set next entry appropriately */
+                next_ptr = entry_ptr->next;
+
+                /* Reset entry flag */
+                entry_ptr->flush_immediately = FALSE;
+                entries_flushed++;
+            } /* end else-if */
+            else {
+                /* No operation for this entry */
+                op_ptr = NULL;
+
+                /* Set next entry appropriately */
+                next_ptr = entry_ptr;
+            } /* end else */
+
+            /* Advance to next entry */
+            entry_ptr = entry_ptr->prev;
+
+            /* Check for operation */
+            if(op_ptr) {
+                /* 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, this
+                 * case cannot occur in the parallel case.
+                 *
+                 * 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).
+                 */
+                cache_ptr->entries_removed_counter = 0;
+                cache_ptr->last_entry_removed_ptr  = NULL;
+
+                if(H5C__flush_single_entry(f, dxpl_id, op_ptr, op_flags) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush entry")
+
+                if(cache_ptr->entries_removed_counter != 0
+                        || cache_ptr->last_entry_removed_ptr != NULL)
+                    restart_scan = TRUE;
+            } /* end if */
+        } /* end if */
+        else {
+            /* Remember "next" pointer (after advancing entries) */
+            next_ptr = entry_ptr;
+
+            /* Advance to next entry */
+            entry_ptr = entry_ptr->prev;
+        } /* end else */
+
+        /* Check for restarts, etc. */
+        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)
+        } /* end if */
+    } /* end while */
+
+    /* It is also possible that some of the cleared entries are on the
+     * pinned list.  Must scan that also.
+     *
+     * Observe that in the case of the pinned entry list, most of the
+     * entries will have flush dependency children.  As entries with
+     * flush dependency children may not be flushed until all of their
+     * children are clean, multiple passes throguh the pinned entry list
+     * may be required.
+     *
+     * 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 should not be possible in this case, as we disallow
+     *  such operations in the parallel version of the library.  However,
+     *  this may change, and to that end, I have included code to detect
+     *  such changes and cause this function to fail if they are detected.
+     */
+    progress = TRUE;
+    while(progress && ((entries_flushed < entries_to_flush) || (entries_cleared < entries_to_clear))) {
+        progress = FALSE;
+        entry_ptr = cache_ptr->pel_head_ptr;
+        while((entry_ptr != NULL) &&
+                ((entries_flushed < entries_to_flush) || (entries_cleared < entries_to_clear))) {
+            H5C_cache_entry_t *prev_ptr;
+            hbool_t next_is_dirty = FALSE;
+
+            HDassert(entry_ptr->is_pinned);
+
+            /* Remember dirty state of entry to advance to */
+            if(entry_ptr->next != NULL)
+                next_is_dirty = entry_ptr->next->is_dirty;
+
+            if(entry_ptr->ring == ring && entry_ptr->flush_dep_ndirty_children == 0) {
+                if(entry_ptr->clear_on_unprotect) {
+                    HDassert(entry_ptr->is_dirty);
+
+                    /* Set entry and flags for operation */
+                    op_ptr = entry_ptr;
+                    op_flags = clear_flags;
+
+                    /* Reset entry flag */
+                    entry_ptr->clear_on_unprotect = FALSE;
+                    entries_cleared++;
+                    progress = TRUE;
+                } /* end if */
+                else if(entry_ptr->flush_immediately) {
+                    HDassert(entry_ptr->is_dirty);
+
+                    /* Set entry and flags for operation */
+                    op_ptr = entry_ptr;
+                    op_flags = flush_flags;
+
+                    /* Reset entry flag */
+                    entry_ptr->flush_immediately = FALSE;
+                    entries_flushed++;
+                    progress = TRUE;
+                } /* end else-if */
+                else
+                    /* No operation for this entry */
+                    op_ptr = NULL;
+
+                /* Check for operation */
+                if(op_ptr) {
+                    /* 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,  this
+                     * case cannot occur in the parallel case.
+                     *
+                     * 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).
+                     */
+                    cache_ptr->entries_removed_counter = 0;
+                    cache_ptr->last_entry_removed_ptr  = NULL;
+
+                    /* Add this entry to the list of entries to collectively write
+                     *
+                     * This comment is misleading -- the entry will be added to the
+                     * collective write list only if said list exists.
+                     *
+                     *                                    JRM -- 2/9/17
+                     */
+                    if(H5C__flush_single_entry(f, dxpl_id, op_ptr, op_flags) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush entry")
+
+                    if(cache_ptr->entries_removed_counter != 0
+                            || cache_ptr->last_entry_removed_ptr != NULL)
+                        restart_scan = TRUE;
+                } /* end if */
+            } /* end if */
+
+            /* Remember "previous" pointer (after advancing entries) */
+            prev_ptr = entry_ptr;
+
+            /* Advance to next entry */
+            entry_ptr = entry_ptr->next;
+
+            /* Check for restarts, etc. */
+            if((entry_ptr != NULL) &&
+                    (restart_scan || (entry_ptr->is_dirty != next_is_dirty)
+                        || (entry_ptr->prev != prev_ptr) || entry_ptr->is_protected
+                        || !entry_ptr->is_pinned)) {
+                /* Something has happened to the pinned entry list -- start
+                 * over from the head.
+                 *
+                 * 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 == next_is_dirty);
+                HDassert(entry_ptr->prev == prev_ptr);
+                HDassert(!entry_ptr->is_protected);
+                HDassert(entry_ptr->is_pinned);
+
+                HDassert(FALSE); /* see comment above */
+
+                restart_scan = FALSE;
+
+                entry_ptr = cache_ptr->pel_head_ptr;
+
+                /* we don't keeps stats for pinned entry list scan
+                 * restarts.  If this code ever becomes reachable,
+                 * define the necessary field, and implement the
+                 * the following macro:
+                 *
+                 * H5C__UPDATE_STATS_FOR_PEL_SCAN_RESTART(cache_ptr)
+                 */
+            } /* end if */
+        } /* end while ( ( entry_ptr != NULL ) &&
+           *             ( ( entries_flushed > entries_to_flush ) ||
+           *               ( entries_cleared > entries_to_clear ) ) )
+           */
+    } /* end while ( ( ( entries_flushed > entries_to_flush ) ||
+       *               ( entries_cleared > entries_to_clear ) ) &&
+       *             ( progress ) )
+       */
+
+#if H5C_DO_SANITY_CHECKS
+    HDassert(init_index_len == cache_ptr->index_len);
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    if(entries_flushed != entries_to_flush || entries_cleared != entries_to_clear) {
+        entry_ptr = cache_ptr->il_head;
+        while(entry_ptr != NULL) {
+            HDassert(!entry_ptr->clear_on_unprotect || (entry_ptr->ring > ring));
+            HDassert(!entry_ptr->flush_immediately || (entry_ptr->ring > ring));
+            entry_ptr = entry_ptr->il_next;
+        } /* end while */
+
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush/clear all entries")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__flush_candidates_in_ring() */
 #endif /* H5_HAVE_PARALLEL */
 
diff --git a/src/H5Cpkg.h b/src/H5Cpkg.h
index 36ca09e..fdb14a5 100644
--- a/src/H5Cpkg.h
+++ b/src/H5Cpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -45,6 +43,9 @@
 /* Package Private Macros */
 /**************************/
 
+/* Number of epoch markers active */
+#define H5C__MAX_EPOCH_MARKERS                  10
+
 /* Cache configuration settings */
 #define H5C__HASH_TABLE_LEN     (64 * 1024) /* must be a power of 2 */
 #define H5C__H5C_T_MAGIC	0x005CAC0E
@@ -147,6 +148,13 @@
  *
  *							JRM - 9/8/05
  *
+ *  - Added macros supporting the index list -- a doubly liked list of 
+ *    all entries in the index.  This list is necessary to reduce the 
+ *    cost of visiting all entries in the cache, which was previously
+ *    done via a scan of the hash table.
+ *
+ *							JRM - 10/15/15
+ *
  ****************************************************************************/
 
 #if H5C_DO_SANITY_CHECKS
@@ -199,7 +207,6 @@ if ( ( (entry_ptr) == 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) )            \
@@ -365,7 +372,6 @@ if ( ( (entry_ptr) == 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) )                  \
@@ -453,6 +459,128 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
     }                                                                        \
 } /* H5C__AUX_DLL_REMOVE() */
 
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__IL_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)->il_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->il_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
+     ( ( (len) == 1 ) &&                                                      \
+       ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) &&  \
+             ( (entry_ptr)->il_next == NULL ) &&                              \
+             ( (entry_ptr)->il_prev == NULL ) &&                              \
+             ( (Size) == (entry_ptr)->size )                                  \
+           )                                                                  \
+       )                                                                      \
+     )                                                                        \
+   ) {                                                                        \
+    HDassert(0 && "il DLL pre remove SC failed");                             \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "il DLL pre remove SC failed")   \
+}
+
+#define H5C__IL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
+if ( ( (entry_ptr) == NULL ) ||                                               \
+     ( (entry_ptr)->il_next != NULL ) ||                                      \
+     ( (entry_ptr)->il_prev != NULL ) ||                                      \
+     ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&                  \
+       ( (hd_ptr) != (tail_ptr) )                                             \
+     ) ||                                                                     \
+     ( ( (len) == 1 ) &&                                                      \
+       ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                     \
+         ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) )                 \
+       )                                                                      \
+     ) ||                                                                     \
+     ( ( (len) >= 1 ) &&                                                      \
+       ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->il_prev != NULL ) ||             \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->il_next != NULL )            \
+       )                                                                      \
+     )                                                                        \
+   ) {                                                                        \
+    HDassert(0 && "IL DLL pre insert SC failed");                             \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "IL DLL pre insert SC failed")   \
+}
+
+#define H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                  \
+if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&             \
+       ( (head_ptr) != (tail_ptr) )                                        \
+     ) ||                                                                  \
+     ( ( (len) == 1 ) &&                                                   \
+       ( ( (head_ptr) != (tail_ptr) ) ||                                   \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )          \
+       )                                                                   \
+     ) ||                                                                  \
+     ( ( (len) >= 1 ) &&                                                   \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->il_prev != NULL ) ||      \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->il_next != NULL )         \
+       )                                                                   \
+     )                                                                     \
+   ) {                                                                     \
+    HDassert(0 && "IL DLL sanity check failed");                           \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "IL DLL sanity check failed") \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__IL_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+#define H5C__IL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+#define H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__IL_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
+{                                                                             \
+    H5C__IL_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)->il_next = (entry_ptr);                                     \
+       (entry_ptr)->il_prev = (tail_ptr);                                     \
+       (tail_ptr) = (entry_ptr);                                              \
+    }                                                                         \
+    (len)++;                                                                  \
+    (Size) += entry_ptr->size;                                                \
+    H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fail_val)                   \
+} /* H5C__IL_DLL_APPEND() */
+
+#define H5C__IL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv)    \
+{                                                                           \
+    H5C__IL_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+    {                                                                       \
+       if ( (head_ptr) == (entry_ptr) )                                     \
+       {                                                                    \
+          (head_ptr) = (entry_ptr)->il_next;                                \
+          if ( (head_ptr) != NULL )                                         \
+             (head_ptr)->il_prev = NULL;                                    \
+       }                                                                    \
+       else                                                                 \
+          (entry_ptr)->il_prev->il_next = (entry_ptr)->il_next;             \
+       if ( (tail_ptr) == (entry_ptr) )                                     \
+       {                                                                    \
+          (tail_ptr) = (entry_ptr)->il_prev;                                \
+          if ( (tail_ptr) != NULL )                                         \
+             (tail_ptr)->il_next = NULL;                                    \
+       }                                                                    \
+       else                                                                 \
+          (entry_ptr)->il_next->il_prev = (entry_ptr)->il_prev;             \
+       entry_ptr->il_next = NULL;                                           \
+       entry_ptr->il_prev = NULL;                                           \
+       (len)--;                                                             \
+       (Size) -= entry_ptr->size;                                           \
+    }                                                                       \
+    H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                       \
+} /* H5C__IL_DLL_REMOVE() */
+
 

 /***********************************************************************
  *
@@ -465,23 +593,6 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  * 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) \
@@ -518,21 +629,18 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
 	    (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 ) {                            \
+	if ( cache_ptr->flush_in_progress )                            \
             ((cache_ptr)->cache_flush_moves[(entry_ptr)->type->id])++; \
-	}                                                                \
-        if ( entry_ptr->flush_in_progress ) {                            \
+        if ( entry_ptr->flush_in_progress )                            \
             ((cache_ptr)->entry_flush_moves[(entry_ptr)->type->id])++; \
-	}                                                                \
-	(((cache_ptr)->moves)[(entry_ptr)->type->id])++;
+	(((cache_ptr)->moves)[(entry_ptr)->type->id])++;               \
+        (cache_ptr)->entries_relocated_counter++;
 
 #define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
-	if ( cache_ptr->flush_in_progress ) {                                  \
+	if ( cache_ptr->flush_in_progress )                                    \
             ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++;  \
-	}                                                                      \
-        if ( entry_ptr->flush_in_progress ) {                                  \
+        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)                        \
@@ -568,8 +676,40 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
 #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)++;
+#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) \
+	((cache_ptr)->index_scan_restarts)++;
+
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_CREATE(cache_ptr) \
+{                                                           \
+    (cache_ptr)->images_created++;                          \
+}
+
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_READ(cache_ptr)  \
+{                                                          \
+    /* make sure image len is still good */                \
+    HDassert((cache_ptr)->image_len > 0);                  \
+    (cache_ptr)->images_read++;                            \
+}
+
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_LOAD(cache_ptr)  \
+{                                                          \
+    /* make sure image len is still good */                \
+    HDassert((cache_ptr)->image_len > 0);                  \
+    (cache_ptr)->images_loaded++;                          \
+    (cache_ptr)->last_image_size = (cache_ptr)->image_len; \
+}
+
+#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) \
+{                                                        \
+    (cache_ptr)->prefetches++;                           \
+    if ( dirty )                                         \
+        (cache_ptr)->dirty_prefetches++;                 \
+}
+
+#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) \
+{                                                     \
+    (cache_ptr)->prefetch_hits++;                     \
+}
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
 
@@ -652,6 +792,7 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
             ((cache_ptr)->max_size)[(entry_ptr)->type->id] )         \
         ((cache_ptr)->max_size)[(entry_ptr)->type->id]               \
              = (entry_ptr)->size;                                    \
+    cache_ptr->entries_inserted_counter++;                           \
 }
 
 #define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)            \
@@ -736,6 +877,7 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
         (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;       \
+    cache_ptr->entries_inserted_counter++;                           \
 }
 
 #define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)            \
@@ -792,7 +934,12 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
 #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)
+#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_CREATE(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_READ(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_LOAD(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty)
+#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr)
 
 #endif /* H5C_COLLECT_CACHE_STATS */
 
@@ -821,6 +968,14 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *
  *						JRM -- 9/1/15
  *
+ *   - Updated existing index macros and sanity checks macros to 
+ *     maintain an doubly linked list of all entries in the index.
+ *     This is necessary to reduce the computational cost of visiting
+ *     all entries in the index, which used to be done by scanning 
+ *     the hash table.
+ *
+ *                                              JRM -- 10/15/15
+ *
  ***********************************************************************/
 
 /* H5C__HASH_TABLE_LEN is defined in H5Cpkg.h.  It mut be a power of two. */
@@ -854,13 +1009,14 @@ if ( ( (cache_ptr) == NULL ) ||                                         \
        (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]) ) ) {    \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||     \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||               \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) {            \
     HDassert(FALSE);                                                    \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                        \
-               "Pre HT insert SC failed")                               \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT insert SC failed") \
 }
 
-#define H5C__POST_HT_INSERT_SC(cache_ptr, fail_val)                     \
+#define H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)          \
 if ( ( (cache_ptr) == NULL ) ||                                         \
      ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
      ( (cache_ptr)->index_size !=                                       \
@@ -875,10 +1031,11 @@ if ( ( (cache_ptr) == NULL ) ||                                         \
        (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]) ) ) {    \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||     \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||               \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size) ) {             \
     HDassert(FALSE);                                                    \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                        \
-               "Post HT insert SC failed")                              \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT insert SC failed") \
 }
 
 #define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
@@ -915,9 +1072,11 @@ if ( ( (cache_ptr) == NULL ) ||                                         \
        (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]) ) ) {    \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||     \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||               \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) {            \
     HDassert(FALSE);                                                    \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Pre HT remove SC failed") \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT remove SC failed") \
 }
 
 #define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
@@ -939,9 +1098,11 @@ if ( ( (cache_ptr) == NULL ) ||                                          \
        (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]) ) ) {     \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||      \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||                \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) {             \
     HDassert(FALSE);                                                     \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Post HT remove SC failed") \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT remove SC failed") \
 }
 
 /* (Keep in sync w/H5C_TEST__PRE_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
@@ -953,11 +1114,11 @@ if ( ( (cache_ptr) == NULL ) ||                                             \
      ( ! 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") \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT search SC failed") \
 }
 
 /* (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) \
+#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val)       \
 if ( ( (cache_ptr) == NULL ) ||                                             \
      ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
      ( (cache_ptr)->index_len < 1 ) ||                                      \
@@ -965,7 +1126,6 @@ if ( ( (cache_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) ) &&                        \
@@ -976,8 +1136,7 @@ if ( ( (cache_ptr) == 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")                      \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post successful HT search SC failed") \
 }
 
 /* (Keep in sync w/H5C_TEST__POST_HT_SHIFT_TO_FRONT macro in test/cache_common.h -QAK) */
@@ -985,8 +1144,7 @@ if ( ( (cache_ptr) == NULL ) ||                                             \
 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")                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT shift to front SC failed") \
 }
 
 #define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
@@ -996,7 +1154,6 @@ if ( ( (cache_ptr) == NULL ) ||                                         \
      ( (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 !=                                       \
@@ -1018,10 +1175,11 @@ if ( ( (cache_ptr) == NULL ) ||                                         \
        (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]) ) ) {    \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||     \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||               \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) {            \
     HDassert(FALSE);                                                    \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                            \
-                "Pre HT entry size change SC failed")                   \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT entry size change SC failed") \
 }
 
 #define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,  \
@@ -1047,10 +1205,11 @@ if ( ( (cache_ptr) == NULL ) ||                                           \
        (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]) ) ) {      \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ||       \
+     ( (cache_ptr)->index_len != (cache_ptr)->il_len ) ||                 \
+     ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) {              \
     HDassert(FALSE);                                                      \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                              \
-                "Post HT entry size change SC failed")                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT entry size change SC failed") \
 }
 
 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)           \
@@ -1077,8 +1236,7 @@ if (                                                                          \
       ((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")                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT update for entry clean SC failed") \
 }
 
 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)           \
@@ -1105,8 +1263,7 @@ if (                                                                          \
       ((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")                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT update for entry dirty SC failed") \
 }
 
 #define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)        \
@@ -1122,8 +1279,7 @@ if ( ( (cache_ptr)->index_size !=                                           \
        ((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")                 \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT update for entry clean SC failed") \
 }
 
 #define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)        \
@@ -1139,18 +1295,17 @@ if ( ( (cache_ptr)->index_size !=                                           \
        ((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")                 \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT update for entry dirty SC failed") \
 }
 
 #else /* H5C_DO_SANITY_CHECKS */
 
 #define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
-#define H5C__POST_HT_INSERT_SC(cache_ptr, fail_val)
+#define H5C__POST_HT_INSERT_SC(cache_ptr, entry_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_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, 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)
@@ -1164,73 +1319,77 @@ if ( ( (cache_ptr)->index_size !=                                           \
 #endif /* H5C_DO_SANITY_CHECKS */
 
 
-#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__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) {                                    \
+        (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__IL_DLL_APPEND((entry_ptr), (cache_ptr)->il_head,                    \
+                       (cache_ptr)->il_tail, (cache_ptr)->il_len,            \
+                       (cache_ptr)->il_size, fail_val)                       \
+    H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)                            \
+    H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)                   \
 }
 
-#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)              \
+#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, fail_val)               \
+{                                                                            \
+    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__IL_DLL_REMOVE((entry_ptr), (cache_ptr)->il_head,                    \
+                       (cache_ptr)->il_tail, (cache_ptr)->il_len,            \
+                       (cache_ptr)->il_size, fail_val)                       \
+    H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)                             \
+    H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)                             \
 }
 
 #define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val)             \
@@ -1240,51 +1399,51 @@ if ( ( (cache_ptr)->index_size !=                                           \
     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) ) ) {   \
+    while(entry_ptr) {                                                      \
+        if(H5F_addr_eq(Addr, (entry_ptr)->addr)) {                          \
+            H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, 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) \
+            }                                                               \
+            break;                                                          \
+        }                                                                   \
         (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)  \
 }
 
 #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)  \
+    while(entry_ptr) {                                                      \
+        if(H5F_addr_eq(Addr, (entry_ptr)->addr)) {                          \
+            H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, 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) \
+            }                                                               \
+            break;                                                          \
         }                                                                   \
+        (entry_ptr) = (entry_ptr)->ht_next;                                 \
     }                                                                       \
 }
 
@@ -1321,20 +1480,23 @@ if ( ( (cache_ptr)->index_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 ) {                                                      \
+    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 ) {                                          \
+    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__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->il_len,                    \
+                                    (cache_ptr)->il_size,                   \
+                                    (old_size), (new_size))                 \
     H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,        \
                                       entry_ptr)                            \
 }
@@ -1434,8 +1596,7 @@ if ( ( (cache_ptr)->index_size !=                                           \
               (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")                         \
+        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;                                         \
@@ -1470,8 +1631,7 @@ if ( ( (cache_ptr)->index_size !=                                           \
               (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")                         \
+        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;                                         \
@@ -1500,40 +1660,15 @@ if ( ( (cache_ptr)->index_size !=                                           \
  *
  * 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__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)                  \
+#if H5C_DO_SANITY_CHECKS
+#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush)    \
 {                                                                           \
     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 );                                      \
@@ -1548,11 +1683,11 @@ if ( ( (cache_ptr)->index_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.")                   \
+        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;                                      \
+    if(!(during_flush))                                                     \
+        (cache_ptr)->slist_changed = TRUE;                                  \
     (cache_ptr)->slist_len--;                                               \
     HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size );               \
     (cache_ptr)->slist_size -= (entry_ptr)->size;                           \
@@ -1560,9 +1695,47 @@ if ( ( (cache_ptr)->index_size !=                                           \
     HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=            \
               (entry_ptr)->size );                                          \
     ((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);       \
     (entry_ptr)->in_slist = FALSE;                                          \
 } /* H5C__REMOVE_ENTRY_FROM_SLIST */
 
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush)    \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 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 );                                 \
+    if(!(during_flush))                                                     \
+        (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 */
+#endif /* H5C_DO_SANITY_CHECKS */
+
 

 /*-------------------------------------------------------------------------
  *
@@ -2066,6 +2239,120 @@ if ( ( (cache_ptr)->index_size !=                                           \
 

 /*-------------------------------------------------------------------------
  *
+ * Macro:	H5C__UPDATE_RP_FOR_INSERT_APPEND
+ *
+ * Purpose:     Update the replacement policy data structures for an
+ *		insertion of the specified cache entry.  
+ *
+ *		Unlike H5C__UPDATE_RP_FOR_INSERTION below, mark the 
+ *		new entry as the LEAST recently used entry, not the 
+ *		most recently used.  
+ *
+ *		For now at least, this macro should only be used in 
+ *		the reconstruction of the metadata cache from a cache 
+ *		image block.
+ *
+ *		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/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_INSERT_APPEND(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 tail of the LRU list. */                \
+                                                                           \
+        H5C__DLL_APPEND((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 tail of the clean or dirty LRU list as  \
+         * appropriate.                                                    \
+         */                                                                \
+                                                                           \
+        if ( entry_ptr->is_dirty ) {                                       \
+            H5C__AUX_DLL_APPEND((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_APPEND((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. */                              \
+    }                                                                      \
+}
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_INSERT_APPEND(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 tail of the LRU list. */                \
+                                                                           \
+        H5C__DLL_APPEND((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__UPDATE_RP_FOR_INSERTION
  *
  * Purpose:     Update the replacement policy data structures for an
@@ -2264,7 +2551,6 @@ if ( ( (cache_ptr)->index_size !=                                           \
                         (cache_ptr)->pel_tail_ptr, 			  \
 			(cache_ptr)->pel_len,                             \
                         (cache_ptr)->pel_size, (fail_val))                \
-        HDassert( (cache_ptr)->pel_len >= 0 );                            \
                                                                           \
     } else {                                                              \
                                                                           \
@@ -2327,7 +2613,6 @@ if ( ( (cache_ptr)->index_size !=                                           \
                         (cache_ptr)->pel_tail_ptr, 			  \
 			(cache_ptr)->pel_len,                             \
                         (cache_ptr)->pel_size, (fail_val))                \
-        HDassert( (cache_ptr)->pel_len >= 0 );                            \
                                                                           \
     } else {                                                              \
                                                                           \
@@ -2382,12 +2667,11 @@ if ( ( (cache_ptr)->index_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 );                                       \
                                                                              \
-    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+    if ( ! ( (entry_ptr)->is_pinned ) && ! ( (entry_ptr->is_protected ) ) ) { \
 	                                                                     \
         /* modified LRU specific code */                                     \
                                                                              \
@@ -2460,12 +2744,11 @@ if ( ( (cache_ptr)->index_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 );                                       \
                                                                              \
-    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+    if ( ! ( (entry_ptr)->is_pinned ) && ! ( (entry_ptr->is_protected ) ) ) { \
 	                                                                     \
         /* modified LRU specific code */                                     \
                                                                              \
@@ -2673,41 +2956,40 @@ if ( ( (cache_ptr)->index_size !=                                           \
     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 */                               \
+    /* modified LRU specific code */                                   \
                                                                        \
-        /* insert the entry at the head of the LRU list. */            \
+    /* 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))       \
+    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.                           \
-         */                                                            \
+    /* 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))                          \
+        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 {                                                       \
+    } 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))                          \
-         }                                                             \
+        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. */                          \
+    /* End modified LRU specific code. */                              \
                                                                        \
 } /* H5C__UPDATE_RP_FOR_UNPIN */
 
@@ -2730,7 +3012,6 @@ if ( ( (cache_ptr)->index_size !=                                           \
     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 */                               \
                                                                        \
@@ -2903,22 +3184,22 @@ if ( ( (hd_ptr) == NULL ) ||                                                   \
      ( (len) <= 0 ) ||                                                         \
      ( (Size) < (entry_ptr)->size ) ||                                         \
      ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) ||            \
-     ( ( (entry_ptr)->coll_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->coll_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||  \
      ( ( (entry_ptr)->coll_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
      ( ( (len) == 1 ) &&                                                       \
        ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) &&   \
-             ( (entry_ptr)->coll_next == NULL ) &&                              \
-             ( (entry_ptr)->coll_prev == NULL ) &&                              \
+             ( (entry_ptr)->coll_next == NULL ) &&                             \
+             ( (entry_ptr)->coll_prev == NULL ) &&                             \
              ( (Size) == (entry_ptr)->size )                                   \
            )                                                                   \
        )                                                                       \
      )                                                                         \
    ) {                                                                         \
-    HDassert(0 && "coll DLL pre remove SC failed");                       \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "coll DLL pre remove SC failed")   \
+    HDassert(0 && "coll DLL pre remove SC failed");                            \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "coll DLL pre remove SC failed")  \
 }
 
-#define H5C__COLL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                  \
+#define H5C__COLL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                 \
 if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&              \
        ( (head_ptr) != (tail_ptr) )                                         \
      ) ||                                                                   \
@@ -2930,36 +3211,35 @@ if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&              \
        )                                                                    \
      ) ||                                                                   \
      ( ( (len) >= 1 ) &&                                                    \
-       ( ( (head_ptr) == NULL ) || ( (head_ptr)->coll_prev != NULL ) ||      \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL )         \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->coll_prev != NULL ) ||     \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL )        \
        )                                                                    \
      )                                                                      \
    ) {                                                                      \
-    HDassert(0 && "COLL DLL sanity check failed");                      \
+    HDassert(0 && "COLL DLL sanity check failed");                          \
     HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "COLL DLL sanity check failed") \
 }
 
 #define H5C__COLL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
 if ( ( (entry_ptr) == NULL ) ||                                                \
-     ( (entry_ptr)->coll_next != NULL ) ||                                      \
-     ( (entry_ptr)->coll_prev != NULL ) ||                                      \
+     ( (entry_ptr)->coll_next != NULL ) ||                                     \
+     ( (entry_ptr)->coll_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)->coll_prev != NULL ) ||             \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL )            \
+       ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->coll_prev != NULL ) ||            \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL )           \
        )                                                                       \
      )                                                                         \
    ) {                                                                         \
-    HDassert(0 && "COLL DLL pre insert SC failed");                     \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "COLL DLL pre insert SC failed")   \
+    HDassert(0 && "COLL DLL pre insert SC failed");                            \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "COLL DLL pre insert SC failed")  \
 }
 
 #else /* H5C_DO_SANITY_CHECKS */
@@ -3140,6 +3420,40 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
 
 /****************************************************************************
  *
+ * structure H5C_tag_info_t
+ *
+ * Structure about each set of tagged entries for an object in the file.
+ *
+ * Each H5C_tag_info_t struct corresponds to a particular object in the file.
+ *
+ * Each H5C_cache_entry struct in the linked list of entries for this tag
+ *      also contains a pointer back to the H5C_tag_info_t struct for the
+ *      overall object.
+ *
+ *
+ * The fields of this structure are discussed individually below:
+ *
+ * tag:	Address (i.e. "tag") of the object header for all the entries
+ *              corresponding to parts of that object.
+ *
+ * head: Head of doubly-linked list of all entries belonging to the tag.
+ *
+ * entry_cnt: Number of entries on linked list of entries for this tag.
+ *
+ * corked: Boolean flag indicating whether entries for this object can be
+ * 		evicted.
+ *
+ ****************************************************************************/
+typedef struct H5C_tag_info_t {
+    haddr_t tag;                /* Tag (address) of the entries (must be first, for skiplist) */
+    H5C_cache_entry_t *head;    /* Head of the list of entries for this tag */
+    size_t entry_cnt;           /* Number of entries on list */
+    hbool_t corked;             /* Whether this object is corked */
+} H5C_tag_info_t;
+
+
+/****************************************************************************
+ *
  * structure H5C_t
  *
  * Catchall structure for all variables specific to an instance of the cache.
@@ -3228,10 +3542,8 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		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.
+ * class_table_ptr: Pointer to an array of H5C_class_t of length
+ *              max_type_id + 1.  Entry classes for the cache.
  *
  * 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
@@ -3263,6 +3575,9 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *              clean data so as to avoid case b) above.  Again, this is
  *              a soft limit.
  *
+ * close_warning_received: Boolean flag indicating that a file closing 
+ *		warning has been received.
+ *
  *
  * In addition to the call back functions required for each entry, the
  * cache requires the following call back functions for this instance of
@@ -3299,6 +3614,17 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  * The cache requires an index to facilitate searching for entries.  The
  * following fields support that index.
  *
+ * Addendum:  JRM -- 10/14/15
+ *
+ * We sometimes need to visit all entries in the cache.  In the past, this
+ * was done by scanning the hash table.  However, this is expensive, and 
+ * we have come to scan the hash table often enough that it has become a 
+ * performance issue.  To repair this, I have added code to maintain a 
+ * list of all entries in the index -- call this list the index list.  
+ *
+ * The index list is maintained by the same macros that maintain the 
+ * index, and must have the same length and size as the index proper.
+ *
  * index_len:   Number of entries currently in the hash table used to index
  *		the cache.
  *
@@ -3366,6 +3692,36 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		changing the H5C__HASH_FCN macro and the deletion of the
  *		H5C__HASH_MASK #define.  No other changes should be required.
  *
+ * il_len:	Number of entries on the index list.  
+ *
+ *		This must always be equal to index_len.  As such, this 
+ *		field is redundant.  However, the existing linked list 
+ *		management macros expect to maintain a length field, so 
+ *		this field exists primarily to avoid adding complexity to
+ *		these macros.
+ *
+ * il_size: 	Number of bytes of cache entries currently stored in the
+ *		index list.
+ *
+ *		This must always be equal to index_size.  As such, this 
+ *		field is redundant.  However, the existing linked list 
+ *		management macros expect to maintain a size field, so 
+ *		this field exists primarily to avoid adding complexity to
+ *		these macros.
+ *
+ * il_head:	Pointer to the head of the doubly linked list of entries in
+ *              the index list.  Note that cache entries on this list are 
+ *		linked by their il_next and il_prev fields.
+ *
+ *              This field is NULL if the index is empty.
+ *
+ * il_tail:	Pointer to the tail of the doubly linked list of entries in
+ *              the index list.  Note that cache entries on this list are 
+ *              linked by their il_next and il_prev fields.
+ *
+ *              This field is NULL if the index is empty.
+ *
+ *
  * 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 
@@ -3380,7 +3736,7 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		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().  
+ *		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.
  *
@@ -3388,7 +3744,7 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		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().
+ *		to calling H5C__flush_single_entry().
  *
  *		WARNING!!! This field must NEVER be dereferenced.  It is 
  *		maintained to allow functions that perform scans of lists
@@ -3397,14 +3753,13 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		pointers don't match, and if entries_removed_counter is 
  *		one.
  *
+ * entry_watched_for_removal:	Pointer to an instance of H5C_cache_entry_t
+ *		which contains the 'next' entry for an iteration.  Removing
+ *              this entry must trigger a rescan of the iteration, so each
+ *              entry removed from the cache is compared against this pointer
+ *              and the pointer is reset to NULL if the watched entry is removed.
+ *              (This functions similarly to a "dead man's switch")
  *
- * 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
@@ -3423,14 +3778,6 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		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.
@@ -3490,11 +3837,22 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  * 		to the slist since the last time this field was set to
  * 		zero.  Note that this value can be negative.
  *
- * 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.
+ * Cache entries belonging to a particular object are "tagged" with that
+ * object's base object header address.
+ *
+ * The following fields are maintained to facilitate this.
+ *
+ * tag_list: A skip list to track entries that belong to an object.
+ *                Each H5C_tag_info_t struct on the tag list corresponds to
+ *                a particular object in the file.  Tagged entries can be
+ *                flushed or evicted as a group, or corked to prevent entries
+ *                from being evicted from the cache.
+ *
+ *                "Global" entries, like the superblock and the file's
+ *                freelist, as well as shared entries like global
+ *                heaps and shared object header messages, are not tagged.
+ *
+ * ignore_tags:	Boolean flag to disable tag validation during entry insertion.
  *
  * 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.
@@ -3719,13 +4077,6 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *              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,
@@ -3733,9 +4084,48 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		    resize_enabled = size_increase_possible ||
  *                                   size_decrease_possible;
  *
+ * 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.
+ *
  * 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().
+ *		H5C__make_space_in_cache() on the next call to H5C_protect().
+ *
+ * resize_in_progress: As the metadata cache has become re-entrant, it is 
+ *		possible that a protect may trigger a call to 
+ *		H5C__auto_adjust_cache_size(), which may trigger a flush,
+ *		which may trigger a protect, which will result in another 
+ *		call to H5C__auto_adjust_cache_size().  
+ *
+ *		The resize_in_progress boolean flag is used to detect this,
+ *		and to prevent the infinite recursion that would otherwise
+ *		occur.
+ *
+ *		Note that this issue is not hypothetical -- this field 
+ *		was added 12/29/15 to fix a bug exposed in the testing 
+ *		of changes to the file driver info superblock extension
+ *		management code needed to support rings.
+ *
+ * msic_in_progress: As the metadata cache has become re-entrant, and as
+ *              the free space manager code has become more tightly 
+ *              integrated with the metadata cache, it is possible that 
+ *              a call to H5C_insert_entry() may trigger a call to 
+ *              H5C_make_space_in_cache(), which, via H5C__flush_single_entry()
+ *              and client callbacks, may trigger an infinite regression
+ *              of calls to H5C_make_space_in_cache().
+ *
+ *              The msic_in_progress boolean flag is used to detect this,
+ *              and prevent the infinite regression that would otherwise
+ *              occur.
+ *
+ *              Note that this is issue is not hypothetical -- this field 
+ *              was added 2/16/17 to address this issue when it was 
+ *              exposed by modifications to test/fheap.c to cause it to 
+ *              use paged allocation.
  *
  * resize_ctl:	Instance of H5C_auto_size_ctl_t containing configuration
  * 		data for automatic cache resizing.
@@ -3812,6 +4202,146 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *	this field will be reset every automatic resize epoch.
  *
  *
+ * Metadata cache image management related fields.
+ *
+ * image_ctl:	Instance of H5C_cache_image_ctl_t containing configuration
+ * 		data for generation of a cache image on file close.
+ *
+ * serialization_in_progress:  Boolean field that is set to TRUE iff
+ *		the cache is in the process of being serialized.  This 
+ *		field is needed to support the H5C_serialization_in_progress()
+ *		call, which is in turn required for sanity checks in some
+ *		cache clients.
+ *
+ * load_image:	Boolean flag indicating that the metadata cache image 
+ *		superblock extension message exists and should be 
+ *		read, and the image block read and decoded on the next
+ *		call to H5C_protect().  
+ *
+ * image_loaded:  Boolean flag indicating that the metadata cache has 
+ *              loaded the metadata cache image as directed by the 
+ *              MDC cache image superblock extension message.
+ *
+ * delete_image: Boolean flag indicating whether the metadata cache image
+ *		superblock message should be deleted and the cache image
+ *		file space freed after they have been read and decoded.
+ *
+ *		This flag should be set to TRUE iff the file is opened 
+ *		R/W and there is a cache image to be read.
+ *
+ * image_addr:  haddr_t containing the base address of the on disk 
+ *		metadata cache image, or HADDR_UNDEF if that value is 
+ *		undefined.  Note that this field is used both in the 
+ *		construction and write, and the read and decode of 
+ *		metadata cache image blocks.
+ *
+ * image_len:	hsize_t containing the size of the on disk metadata cache 
+ *		image, or zero if that value is undefined.  Note that this 
+ *		field is used both in the construction and write, and the 
+ *		read and decode of metadata cache image blocks.
+ *
+ * image_data_len:  size_t containing the number of bytes of data in the 
+ *		on disk metadata cache image, or zero if that value is 
+ *		undefined.
+ *
+ *		In most cases, this value is the same as the image_len
+ *		above.  It exists to allow for metadata cache image blocks
+ *		that are larger than the actual image.  Thus in all 
+ *		cases image_data_len <= image_len.
+ *
+ * To create the metadata cache image, we must first serialize all the
+ * entries in the metadata cache.  This is done by a scan of the index.
+ * As entries must be serialized in increasing flush dependency height
+ * order, we scan the index repeatedly, once for each flush dependency
+ * height in increasing order.
+ *
+ * This operation is complicated by the fact that entries other the the
+ * target may be inserted, loaded, relocated, or removed from the cache 
+ * (either by eviction or the take ownership flag) as the result of a 
+ * pre_serialize or serialize callback.  While entry removals are not 
+ * a problem for the scan of the index, insertions, loads, and relocations
+ * are.  Hence the entries loaded, inserted, and relocated counters 
+ * listed below have been implemented to allow these conditions to be 
+ * detected and dealt with by restarting the scan.
+ *
+ * The serialization operation is further complicated by the fact that 
+ * the flush dependency height of a given entry may increase (as the 
+ * result of an entry load or insert) or decrease (as the result of an 
+ * entry removal -- via either eviction or the take ownership flag).  The
+ * entry_fd_height_change_counter field is maintained to allow detection
+ * of this condition, and a restart of the scan when it occurs.
+ *
+ * Note that all these new fields would work just as well as booleans.
+ *
+ * entries_loaded_counter: Number of entries loaded into the cache 
+ *		since the last time this field was reset.
+ *
+ * entries_inserted_counter: Number of entries inserted into the cache 
+ *		since the last time this field was reset.
+ *
+ * entries relocated_counter: Number of entries whose base address has
+ *		been changed since the last time this field was reset.
+ *
+ * entry_fd_height_change_counter: Number of entries whose flush dependency
+ *		height has changed since the last time this field was reset.
+ *
+ * The following fields are used assemble the cache image prior to 
+ * writing it to disk.
+ *
+ * num_entries_in_image: Unsigned integer field containing the number of entries
+ *		to be copied into the metadata cache image.  Note that 
+ *		this value will be less than the number of entries in 
+ *		the cache, and the superblock and its related entries 
+ *		are not written to the metadata cache image.
+ *
+ * image_entries: Pointer to a dynamically allocated array of instance of
+ *		H5C_image_entry_t of length num_entries_in_image, or NULL
+ *		if that array does not exist.  This array is used to
+ *		assemble entry data to be included in the image, and to 
+ *		sort them by flush dependency height and LRU rank.
+ * 
+ * image_buffer: Pointer to the dynamically allocated buffer of length
+ *		image_len in which the metadata cache image is assembled, 
+ *		or NULL if that	buffer does not exist.
+ *
+ *
+ * Free Space Manager Related fields:
+ *
+ * The free space managers must be informed when we are about to close 
+ * or flush the file so that they order themselves accordingly.  This used
+ * to be done much later in the close process, but with cache image and 
+ * page buffering, this is no longer viable, as we must finalize the on 
+ * disk image of all metadata much sooner.
+ *
+ * This is handled by the H5MF_settle_raw_data_fsm() and
+ * H5MF_settle_meta_data_FSM() routines.  As these calls are expensive,
+ * the following fields are used to track whether the target free space
+ * managers are clean.
+ *
+ * They are also used in sanity checking, as once a free space manager is
+ * settled, it should not become unsettled (i.e. be asked to allocate or
+ * free file space) either ever (in the case of a file close) or until the
+ * flush is complete.
+ *
+ * rdfsm_settled:  Boolean flag indicating whether the raw data free space
+ *		manager is settled -- i.e. whether the correct space has 
+ *		been allocated for it in the file.
+ *
+ *		Note that the name of this field is deceptive.  In the 
+ *		multi file case, the flag applies to all free space 
+ *		managers that are not involved in allocating space for
+ *		free space manager metadata.
+ *
+ * mdfsm_settled:  Boolean flag indicating whether the meta data free space
+ *              manager is settled -- i.e. whether the correct space has
+ *              been allocated for it in the file.
+ *
+ *              Note that the name of this field is deceptive.  In the 
+ *              multi file case, the flag applies only to free space 
+ *		managers that are involved in allocating space for free 
+ *		space managers.
+ *
+ *
  * Statistics collection fields:
  *
  * When enabled, these fields are used to collect statistics as described
@@ -3988,23 +4518,85 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  * 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
+ * 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().
+ *              enforcing the min_clean_fraction in H5C__make_space_in_cache().
+ *
+ * total_dirty_pf_entries_skipped_in_msic: Number of dirty prefetched entries
+ *              skipped in H5C__make_space_in_cache().  Note that this can 
+ *              only occur when a file is opened R/O with a cache image
+ *              containing dirty entries.
  *
  * total_entries_scanned_in_msic: Number of clean entries skipped while
- *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
+ *              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().
+ *              in any one call to H5C__make_space_in_cache().
+ *
+ * max_dirty_pf_entries_skipped_in_msic: Maximum number of dirty prefetched
+ *              entries skipped in any one call to H5C__make_space_in_cache().
+ *              Note that this can only occur when the file is opened 
+ *              R/O with a cache image containing dirty entries.
  *
  * max_entries_scanned_in_msic: Maximum number of entries scanned over
- *              in any one call to H5C_make_space_in_cache().
+ *              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 following fields track statistics on cache images.  
+ *
+ * images_created:  Integer field containing the number of cache images
+ *		created since the last time statistics were reset.  
+ *
+ *		At present, this field must always be either 0 or 1.
+ *		Further, since cache images are only created at file 
+ *		close, this field should only be set at that time.
+ *
+ * images_read: Integer field containing the number of cache images 
+ *              read from file.  Note that reading an image is different
+ *              from loading it -- reading the image means just that,
+ *              while loading the image refers to decoding it and loading
+ *              it into the metadata cache.
+ *
+ *              In the serial case, image_read should always equal 
+ *              images_loaded.  However, in the parallel case, the 
+ *              image should only be read by process 0.  All other 
+ *              processes should receive the cache image via a broadcast
+ *              from process 0.
+ *
+ * images_loaded:  Integer field containing the number of cache images
+ *		loaded since the last time statistics were reset.
+ *
+ *		At present, this field must always be either 0 or 1.
+ *		Further, since cache images are only loaded at the 
+ *		time of the first protect or on file close, this value
+ *		should only change on those events.
+ *
+ * last_image_size:  Size of the most recently loaded metadata cache image
+ *             loaded into the cache, or zero if no image has been
+ *             loaded.  
+ *
+ *             At present, at most one cache image can be loaded into 
+ *             the metadata cache for any given file, and this image
+ *             will be loaded either on the first protect, or on file
+ *             close if no entry is protected before then.
+ *
+ *
+ * Fields for tracking prefetched entries.  Note that flushes and evictions
+ * of prefetched entries are tracked in the flushes and evictions arrays 
+ * discused above.
+ *
+ * prefetches:	Number of prefetched entries that are loaded to the 
+ *		cache.
+ *
+ * dirty_prefetches:  Number of dirty prefetched entries that are loaded
+ *		into the cache.
+ *
+ * prefetch_hits:  Number of prefetched entries that are actually used.
+ *
  * 
  * As entries are now capable of moving, loading, dirtying, and deleting 
  * other entries in their pre_serialize and serialize callbacks, it has 
@@ -4017,19 +4609,23 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  * 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 
+ *		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 
+ *              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.
+ * index_scan_restarts: Number of times a scan of the index has been 
+ *		restarted to avoid potential issues with load, insertion
+ *		or change in flush dependency height of an entry other 
+ *		than the target entry as the result of call(s) to the
+ *		pre_serialize or serialize callbacks.
+ *
+ *		Note that at present, this condition can only be triggerd
+ *		by a call to H5C_serialize_single_entry().
  *
  * The remaining stats are collected only when both H5C_COLLECT_CACHE_STATS
  * and H5C_COLLECT_CACHE_ENTRY_STATS are true.
@@ -4071,10 +4667,10 @@ if ( ( (entry_ptr) == NULL ) ||                                                \
  *		field is intended to allow marking of output of with
  *		the processes mpi rank.
  *
- * 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.
+ * 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 {
@@ -4086,84 +4682,91 @@ struct H5C_t {
     FILE *			log_file_ptr;
     void *			aux_ptr;
     int32_t			max_type_id;
-    const char *                (* type_name_table_ptr);
+    const H5C_class_t * const   *class_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;
+    hbool_t			close_warning_received;
 
     /* Fields for maintaining [hash table] index of entries */
-    int32_t                     index_len;
+    uint32_t                    index_len;
     size_t                      index_size;
-    int32_t			index_ring_len[H5C_RING_NTYPES];
+    uint32_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]);
+    H5C_cache_entry_t *	        index[H5C__HASH_TABLE_LEN];
+    uint32_t                    il_len;
+    size_t                      il_size;
+    H5C_cache_entry_t *	        il_head;
+    H5C_cache_entry_t *	        il_tail;
 
     /* Fields to detect entries removed during scans */
     int64_t			entries_removed_counter;
     H5C_cache_entry_t *		last_entry_removed_ptr;
-
-    /* Field to disable tag validation */
-    hbool_t                     ignore_tags;
+    H5C_cache_entry_t *		entry_watched_for_removal;
 
     /* 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;
+    uint32_t                    slist_len;
     size_t                      slist_size;
-    int32_t			slist_ring_len[H5C_RING_NTYPES];
+    uint32_t			slist_ring_len[H5C_RING_NTYPES];
     size_t			slist_ring_size[H5C_RING_NTYPES];
     H5SL_t *                    slist_ptr;
-    int32_t                     num_last_entries;
+    uint32_t                    num_last_entries;
 #if H5C_DO_SANITY_CHECKS
-    int64_t			slist_len_increase;
-    int64_t			slist_size_increase;
+    int32_t			slist_len_increase;
+    ssize_t			slist_size_increase;
 #endif /* H5C_DO_SANITY_CHECKS */
 
-    H5SL_t *                    cork_list_ptr; /* list of corked object addresses */
+    /* Fields for maintaining list of tagged entries */
+    H5SL_t *                    tag_list;
+    hbool_t                     ignore_tags;
 
     /* Fields for tracking protected entries */
-    int32_t                     pl_len;
+    uint32_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;
+    uint32_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;
+    uint32_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;
+    uint32_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;
+    uint32_t                    dLRU_list_len;
     size_t                      dLRU_list_size;
     H5C_cache_entry_t *		dLRU_head_ptr;
     H5C_cache_entry_t *	        dLRU_tail_ptr;
 
 #ifdef H5_HAVE_PARALLEL
-    int32_t                     coll_list_len;
+    /* Fields for collective metadata reads */
+    uint32_t                    coll_list_len;
     size_t                      coll_list_size;
     H5C_cache_entry_t *		coll_head_ptr;
     H5C_cache_entry_t *		coll_tail_ptr;
+
+    /* Fields for collective metadata writes */
+    H5SL_t *                    coll_write_list;
 #endif /* H5_HAVE_PARALLEL */
 
     /* Fields for automatic cache size adjustment */
@@ -4174,6 +4777,8 @@ struct H5C_t {
     hbool_t			resize_enabled;
     hbool_t			cache_full;
     hbool_t			size_decreased;
+    hbool_t			resize_in_progress;
+    hbool_t			msic_in_progress;
     H5C_auto_size_ctl_t		resize_ctl;
 
     /* Fields for epoch markers used in automatic cache size adjustment */
@@ -4189,6 +4794,27 @@ struct H5C_t {
     int64_t			cache_hits;
     int64_t			cache_accesses;
 
+    /* fields supporting generation of a cache image on file close */
+    H5C_cache_image_ctl_t	image_ctl;
+    hbool_t			serialization_in_progress;
+    hbool_t			load_image;
+    hbool_t                     image_loaded;
+    hbool_t			delete_image;
+    haddr_t 			image_addr;
+    hsize_t			image_len;
+    hsize_t			image_data_len;
+    int64_t			entries_loaded_counter;
+    int64_t			entries_inserted_counter;
+    int64_t			entries_relocated_counter;
+    int64_t			entry_fd_height_change_counter;
+    uint32_t			num_entries_in_image;
+    H5C_image_entry_t *		image_entries;
+    void *                      image_buffer;
+
+    /* Free Space Manager Related fields */
+    hbool_t 			rdfsm_settled;
+    hbool_t			mdfsm_settled;
+
 #if H5C_COLLECT_CACHE_STATS
     /* stats fields */
     int64_t                     hits[H5C__MAX_NUM_TYPE_IDS + 1];
@@ -4222,35 +4848,48 @@ struct H5C_t {
     int64_t			total_successful_ht_search_depth;
     int64_t			failed_ht_searches;
     int64_t			total_failed_ht_search_depth;
-    int32_t                     max_index_len;
+    uint32_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;
+    uint32_t                    max_slist_len;
     size_t                      max_slist_size;
 
     /* Fields for protected entry list */
-    int32_t                     max_pl_len;
+    uint32_t                    max_pl_len;
     size_t                      max_pl_size;
 
     /* Fields for pinned entry list */
-    int32_t                     max_pel_len;
+    uint32_t                    max_pel_len;
     size_t                      max_pel_size;
 
-    /* Fields for tacking 'make space in cache' (msic) operations */
+    /* Fields for tracking 'make space in cache' (msic) operations */
     int64_t                     calls_to_msic;
     int64_t                     total_entries_skipped_in_msic;
+    int64_t                     total_dirty_pf_entries_skipped_in_msic;
     int64_t                     total_entries_scanned_in_msic;
     int32_t                     max_entries_skipped_in_msic;
+    int32_t                     max_dirty_pf_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;
+    int64_t			index_scan_restarts;
+
+    /* Fields for tracking cache image operations */
+    int32_t			images_created;
+    int32_t			images_read;
+    int32_t			images_loaded;
+    hsize_t			last_image_size;
+
+    /* Fields for tracking prefetched entries */
+    int64_t			prefetches;
+    int64_t			dirty_prefetches;
+    int64_t			prefetch_hits;
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
     int32_t                     max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
@@ -4265,18 +4904,12 @@ struct H5C_t {
     char			prefix[H5C__PREFIX_LEN];
 
 #ifndef NDEBUG
-    int64_t			get_entry_ptr_from_addr_counter;
+    int64_t                     get_entry_ptr_from_addr_counter;
 #endif /* NDEBUG */
 };
 
-#ifdef H5_HAVE_PARALLEL
-typedef struct H5C_collective_write_t {
-    size_t length;
-    hbool_t free_buf;
-    void *buf;
-    haddr_t offset;
-} H5C_collective_write_t;
-#endif /* H5_HAVE_PARALLEL */
+/* Define typedef for tagged cache entry iteration callbacks */
+typedef int (*H5C_tag_iter_cb_t)(H5C_cache_entry_t *entry, void *ctx);
 
 
 /*****************************/
@@ -4287,8 +4920,37 @@ typedef struct H5C_collective_write_t {
 /******************************/
 /* 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, H5SL_t *collective_write_list);
+H5_DLL herr_t H5C__prep_image_for_file_close(H5F_t *f, hid_t dxpl_id,
+    hbool_t *image_generated);
+H5_DLL herr_t H5C__deserialize_prefetched_entry(H5F_t *f, hid_t dxpl_id,
+    H5C_t * cache_ptr, H5C_cache_entry_t** entry_ptr_ptr, 
+    const H5C_class_t * type, haddr_t addr, void * udata);
+
+/* General routines */
+H5_DLL herr_t H5C__flush_single_entry(H5F_t *f, hid_t dxpl_id,
+    H5C_cache_entry_t *entry_ptr, unsigned flags);
+H5_DLL herr_t H5C__generate_cache_image(H5F_t *f, hid_t dxpl_id, H5C_t *cache_ptr);
+H5_DLL herr_t H5C__load_cache_image(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5C__mark_flush_dep_serialized(H5C_cache_entry_t * entry_ptr);
+H5_DLL herr_t H5C__mark_flush_dep_unserialized(H5C_cache_entry_t * entry_ptr);
+H5_DLL herr_t H5C__make_space_in_cache(H5F_t * f, hid_t dxpl_id,
+    size_t  space_needed, hbool_t write_permitted);
+H5_DLL herr_t H5C__flush_marked_entries(H5F_t * f, hid_t dxpl_id);
+H5_DLL herr_t H5C__generate_image(H5F_t *f, H5C_t *cache_ptr,
+    H5C_cache_entry_t *entry_ptr, hid_t dxpl_id);
+H5_DLL herr_t H5C__serialize_cache(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5C__iter_tagged_entries(H5C_t *cache, haddr_t tag, hbool_t match_global,
+    H5C_tag_iter_cb_t cb, void *cb_ctx);
+
+/* Routines for operating on entry tags */
+H5_DLL herr_t H5C__tag_entry(H5C_t * cache_ptr, H5C_cache_entry_t * entry_ptr,
+    hid_t dxpl_id);
+H5_DLL herr_t H5C__untag_entry(H5C_t *cache, H5C_cache_entry_t *entry);
+
+/* Testing functions */
+#ifdef H5C_TESTING
+H5_DLL herr_t H5C__verify_cork_tag_test(hid_t fid, haddr_t tag, hbool_t status);
+#endif /* H5C_TESTING */
 
 #endif /* _H5Cpkg_H */
 
diff --git a/src/H5Cprefetched.c b/src/H5Cprefetched.c
new file mode 100644
index 0000000..6237d57
--- /dev/null
+++ b/src/H5Cprefetched.c
@@ -0,0 +1,350 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cprefetched.c
+ *              December 28 2016
+ *              Quincey Koziol
+ *
+ * Purpose:     Metadata cache prefetched entry callbacks.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/****************************************************************************
+ *
+ * Declarations for prefetched cache entry callbacks.
+ *
+ ****************************************************************************/
+static herr_t H5C__prefetched_entry_get_initial_load_size(void *udata_ptr,
+    size_t *image_len_ptr);
+static herr_t H5C__prefetched_entry_get_final_load_size(const void *image_ptr,
+    size_t image_len, void *udata_ptr, size_t *actual_len_ptr);
+static htri_t H5C__prefetched_entry_verify_chksum(const void *image_ptr,
+    size_t len, void *udata_ptr);
+static void * H5C__prefetched_entry_deserialize(const void *image_ptr,
+    size_t len, void *udata, hbool_t *dirty_ptr);
+static herr_t H5C__prefetched_entry_image_len(const void *thing,
+    size_t *image_len_ptr);
+static herr_t H5C__prefetched_entry_pre_serialize(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 H5C__prefetched_entry_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t H5C__prefetched_entry_notify(H5C_notify_action_t action, 
+    void *thing);
+static herr_t H5C__prefetched_entry_free_icr(void *thing);
+static herr_t H5C__prefetched_entry_fsf_size(const void *thing,
+    size_t *fsf_size_ptr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare external the free list for H5C_cache_entry_t's */
+H5FL_EXTERN(H5C_cache_entry_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+const H5AC_class_t H5AC_PREFETCHED_ENTRY[1] = {{
+    /* id                       = */ H5AC_PREFETCHED_ENTRY_ID,
+    /* name                     = */ "prefetched entry",
+    /* mem_type                 = */ H5FD_MEM_DEFAULT, /* value doesn't matter */
+    /* flags                    = */ H5AC__CLASS_NO_FLAGS_SET,
+    /* get_initial_load_size    = */ H5C__prefetched_entry_get_initial_load_size,
+    /* get_final_load_size      = */ H5C__prefetched_entry_get_final_load_size,
+    /* verify_chksum            = */ H5C__prefetched_entry_verify_chksum,
+    /* deserialize              = */ H5C__prefetched_entry_deserialize,
+    /* image_len                = */ H5C__prefetched_entry_image_len,
+    /* pre_serialize            = */ H5C__prefetched_entry_pre_serialize,
+    /* serialize                = */ H5C__prefetched_entry_serialize,
+    /* notify                   = */ H5C__prefetched_entry_notify,
+    /* free_icr                 = */ H5C__prefetched_entry_free_icr,
+    /* fsf_size                 = */ H5C__prefetched_entry_fsf_size,
+}};
+
+
+

+/***************************************************************************
+ * With two exceptions, these functions should never be called, and thus 
+ * there is little point in documenting them separately as they all simply
+ * throw an error.
+ *
+ * See header comments for the two exceptions (free_icr and notify).
+ * 
+ *                                                     JRM - 8/13/15
+ *
+ ***************************************************************************/
+
+static herr_t
+H5C__prefetched_entry_get_initial_load_size(void H5_ATTR_UNUSED *udata_ptr,
+    size_t H5_ATTR_UNUSED *image_len_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__prefetched_entry_get_initial_load_size() */
+
+static herr_t
+H5C__prefetched_entry_get_final_load_size(const void H5_ATTR_UNUSED *image_ptr,
+    size_t H5_ATTR_UNUSED image_len, void H5_ATTR_UNUSED *udata_ptr,
+    size_t H5_ATTR_UNUSED *actual_len_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__prefetched_entry_get_final_load_size() */
+
+static htri_t
+H5C__prefetched_entry_verify_chksum(const void H5_ATTR_UNUSED *image_ptr,
+    size_t H5_ATTR_UNUSED len, void H5_ATTR_UNUSED *udata_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__prefetched_verify_chksum() */
+
+

+static void *
+H5C__prefetched_entry_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 */
+
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(NULL)
+} /* end H5C__prefetched_entry_deserialize() */
+
+

+static herr_t
+H5C__prefetched_entry_image_len(const void H5_ATTR_UNUSED *thing,
+    size_t H5_ATTR_UNUSED *image_len_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__prefetched_entry_image_len() */
+
+

+static herr_t
+H5C__prefetched_entry_pre_serialize(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,
+    haddr_t H5_ATTR_UNUSED *new_addr_ptr, 
+    size_t H5_ATTR_UNUSED *new_len_ptr, 
+    unsigned H5_ATTR_UNUSED *flags_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__prefetched_entry_pre_serialize() */
+
+

+static herr_t
+H5C__prefetched_entry_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 */
+
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__prefetched_entry_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prefetched_entry_notify
+ *
+ * Purpose:     On H5AC_NOTIFY_ACTION_BEFORE_EVICT, check to see if the 
+ *		target entry is a child in a flush dependency relationship.
+ *		If it is, destroy that flush dependency relationship.
+ *
+ *		Ignore on all other notifications.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/13/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__prefetched_entry_notify(H5C_notify_action_t action, void *_thing)
+{
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_thing;
+    unsigned 		u;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(entry_ptr->prefetched);
+
+    switch(action) {
+        case H5C_NOTIFY_ACTION_AFTER_INSERT:
+        case H5C_NOTIFY_ACTION_AFTER_LOAD:
+        case H5C_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5C_NOTIFY_ACTION_ENTRY_DIRTIED: 
+        case H5C_NOTIFY_ACTION_ENTRY_CLEANED: 
+        case H5C_NOTIFY_ACTION_CHILD_DIRTIED: 
+        case H5C_NOTIFY_ACTION_CHILD_CLEANED: 
+        case H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED: 
+        case H5C_NOTIFY_ACTION_CHILD_SERIALIZED: 
+            /* do nothing */
+            break;
+
+        case H5C_NOTIFY_ACTION_BEFORE_EVICT:
+            for(u = 0; u < entry_ptr->flush_dep_nparents; u++) {
+                H5C_cache_entry_t * parent_ptr; 
+
+                /* Sanity checks */
+                HDassert(entry_ptr->flush_dep_parent);
+                parent_ptr = entry_ptr->flush_dep_parent[u];
+                HDassert(parent_ptr);
+                HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(parent_ptr->flush_dep_nchildren > 0);
+
+                /* Destroy flush dependency with flush dependency parent */
+                if(H5C_destroy_flush_dependency(parent_ptr, entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "unable to destroy prefetched entry flush dependency")
+
+                if(parent_ptr->prefetched) {
+                    /* In prefetched entries, the fd_child_count field is 
+                     * used in sanity checks elsewhere.  Thus update this 
+                     * field to reflect the destruction of the flush 
+                     * dependency relationship.
+                     */
+                    HDassert(parent_ptr->fd_child_count > 0);
+                    (parent_ptr->fd_child_count)--;
+                } /* end if */
+            } /* end for */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5C__prefetched_entry_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__prefetched_entry_free_icr
+ *
+ * Purpose:     Free the in core representation of the prefetched entry.
+ *		Verify that the image buffer associated with the entry
+ *		has been either transferred or freed.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/13/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__prefetched_entry_free_icr(void *_thing)
+{
+    H5C_cache_entry_t *entry_ptr = (H5C_cache_entry_t *)_thing;
+    herr_t               ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(entry_ptr->prefetched);
+
+    /* Release array for flush dependency parent addresses */
+    if(entry_ptr->fd_parent_addrs != NULL) {
+	HDassert(entry_ptr->fd_parent_count > 0);
+	entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_xfree((void *)entry_ptr->fd_parent_addrs);
+    } /* end if */
+    else
+	HDassert(entry_ptr->fd_parent_count == 0);
+
+    if(entry_ptr->image_ptr != NULL)
+	HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "prefetched entry image buffer still attatched?")
+
+    entry_ptr = H5FL_FREE(H5C_cache_entry_t, entry_ptr);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5C__prefetched_entry_free_icr() */
+
+

+static herr_t 
+H5C__prefetched_entry_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__prefetched_entry_fsf_size() */
+
diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h
index 8d495be..5335f80 100644
--- a/src/H5Cprivate.h
+++ b/src/H5Cprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -41,7 +39,7 @@
 /**************************/
 
 /* Cache configuration settings */
-#define H5C__MAX_NUM_TYPE_IDS   29
+#define H5C__MAX_NUM_TYPE_IDS   30
 #define H5C__PREFIX_LEN         32
 
 /* This sanity checking constant was picked out of the air.  Increase
@@ -66,20 +64,16 @@
 #endif /* H5_HAVE_PARALLEL */
 
 /* 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)
+#define H5C__CLASS_NO_FLAGS_SET             ((unsigned)0x0)
+#define H5C__CLASS_SPECULATIVE_LOAD_FLAG    ((unsigned)0x1)
 /* 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)
+#define H5C__CLASS_SKIP_READS               ((unsigned)0x2)
+#define H5C__CLASS_SKIP_WRITES              ((unsigned)0x4)
 
 /* 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.
@@ -118,9 +112,7 @@
 /* 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
+#define H5C__CURR_CACHE_IMAGE_CTL_VER		1
 
 /* Default configuration settings */
 #define H5C__DEF_AR_UPPER_THRESHHOLD		0.9999f
@@ -173,12 +165,16 @@
  * These flags apply to H5C_expunge_entry():
  * 	H5C__FREE_FILE_SPACE_FLAG
  *
+ * These flags apply to H5C_evict():
+ * 	H5C__EVICT_ALLOW_LAST_PINS_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)
+ * 	H5C__DURING_FLUSH_FLAG
  *
  * These flags apply to H5C_flush_single_entry():
  * 	H5C__FLUSH_INVALIDATE_FLAG
@@ -186,29 +182,29 @@
  * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
  *      H5C__TAKE_OWNERSHIP_FLAG
  *      H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG
+ *      H5C__GENERATE_IMAGE_FLAG
+ *      H5C__UPDATE_PAGE_BUFFER_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		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}
+#define H5C__NO_FLAGS_SET			0x00000
+#define H5C__SET_FLUSH_MARKER_FLAG		0x00001
+#define H5C__DELETED_FLAG			0x00002
+#define H5C__DIRTIED_FLAG			0x00004
+#define H5C__PIN_ENTRY_FLAG			0x00008
+#define H5C__UNPIN_ENTRY_FLAG			0x00010
+#define H5C__FLUSH_INVALIDATE_FLAG		0x00020
+#define H5C__FLUSH_CLEAR_ONLY_FLAG		0x00040
+#define H5C__FLUSH_MARKED_ENTRIES_FLAG		0x00080
+#define H5C__FLUSH_IGNORE_PROTECTED_FLAG	0x00100
+#define H5C__READ_ONLY_FLAG			0x00200
+#define H5C__FREE_FILE_SPACE_FLAG		0x00400
+#define H5C__TAKE_OWNERSHIP_FLAG		0x00800
+#define H5C__FLUSH_LAST_FLAG			0x01000
+#define H5C__FLUSH_COLLECTIVELY_FLAG		0x02000
+#define H5C__EVICT_ALLOW_LAST_PINS_FLAG         0x04000
+#define H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG     0x08000
+#define H5C__DURING_FLUSH_FLAG                  0x10000 /* Set when the entire cache is being flushed */
+#define H5C__GENERATE_IMAGE_FLAG                0x20000 /* Set during parallel I/O */
+#define H5C__UPDATE_PAGE_BUFFER_FLAG            0x40000 /* Set during parallel I/O */
 
 /* Debugging/sanity checking/statistics settings */
 #ifndef NDEBUG
@@ -272,19 +268,6 @@
 /* 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;
-
 /*
  *
  * Struct H5C_class_t
@@ -304,19 +287,12 @@ typedef enum {
  *
  * 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 
+ *	H5C__CLASS_SPECULATIVE_LOAD_FLAG: This flag is used only in
+ *              H5C_load_entry().  When it is set, entries are 
  *		permitted to change their sizes on the first attempt 
  *		to load.  
  *
@@ -330,157 +306,112 @@ typedef enum {
  *		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
+ *		or deserializes 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 
+ *		end of file could occur.  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 
+ *		read past the end of file, the size is truncated 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.
+ *
+ * GET_INITIAL_LOAD_SIZE: Pointer to the 'get initial load size' function.
+ *
+ *	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".
  *
  * 	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.
+ *	  This function returns in "image_len_ptr" the on disk size of the
+ *              entry.
  *	
  * 	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:
+ *	  This function returns in "image_len_ptr" an initial guess of the
+ *              entry's on disk size.  This many bytes will be loaded from
+ *              the file and then passed to 'get_final_load_size' callback
+ *              for the actual (final) image length to be determined.
  *
- * 	   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 typedef for the get_initial_load_size callback is as follows:
  *
- *	The parameters of the get_load_size callback are as follows:
+ * 	   typedef herr_t (*H5C_get_initial_load_size_func_t)(void *udata_ptr,
+ * 	                                              size_t *image_len_ptr);
  *
- *	image_ptr: Pointer to a buffer containing the metadata read in.
+ *	The parameters of the get_initial_load_size callback are as follows:
  *
  *	udata_ptr: Pointer to user data provided in the protect call, which
- *         	will also be passed through to the deserialize callback.
+ *         	will also be passed through to the 'get_final_load_size',
+ *              'verify_chksum', and 'deserialize' callbacks.
  *
- *	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.
+ *	image_len_ptr: Pointer to 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.
  *	
+ *	Processing in the get_load_size function should proceed as follows:
+ *
+ *	If successful, the function will place the length in the *image_len_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.
+ *
+ *
+ * GET_FINAL_LOAD_SIZE: Pointer to the 'get final load size' function.
+ *
+ * 	This function determines the final size of a speculatively loaded
+ *      metadata cache entry based on the parameter "image" and the "udata"
+ *      parameters.  This callback _must_ be implemented for cache clients
+ *      which set the H5C__CLASS_SPECULATIVE_LOAD_FLAG and must return the
+ *      actual length of on-disk image after being called once.
+ *
+ *	This function might deserialize the needed metadata information to
+ *	determine the actual size.  The size is returned in the parameter
+ *      "actual_len_ptr".
+ *
+ *	The typedef for the get_load_size callback is as follows:
+ *
+ * 	   typedef herr_t (*H5C_get_final_load_size_func_t)(const void *image_ptr,
+ * 	                                              size_t image_len,
+ *						      void *udata_ptr,
+ *						      size_t *actual_len_ptr);
+ *
+ *	The parameters of the get_load_size callback are as follows:
+ *
+ *	image_ptr: Pointer to a buffer containing the (possibly partial)
+ *              metadata read in.
+ *
+ *	image_len: The length in bytes of the (possibly partial) in-file image
+ *              to be queried for an actual length.
+ *
+ *	udata_ptr: Pointer to user data provided in the protect call, which
+ *         	will also be passed through to the 'verify_chksum' and
+ *              'deserialize' callbacks.
+ *
  *	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:
+ *	Processing in the get_final_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.
+ *	If successful, the function will place the length in the *actual_len_ptr
+ *      associated with supplied image and/or 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.
+ *      the value pointed to by actual_len_ptr.
  *
  *
  * VERIFY_CHKSUM: Pointer to the verify_chksum function.
@@ -492,11 +423,6 @@ typedef enum {
  *	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, 
@@ -514,9 +440,10 @@ typedef enum {
  *
  * DESERIALIZE: Pointer to the deserialize function.
  *
- * 	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.
+ * 	This function must be able to deserialize a buffer containing the
+ *      on-disk image of a metadata cache entry, allocate and initialize the
+ *      equivalent in core representation, and return a pointer to that
+ *      representation.
  *
  *	The typedef for the deserialize callback is as follows:
  *
@@ -548,24 +475,18 @@ typedef enum {
  *
  *	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
+ *      the deserialize function must allocate space for an in-core
+ *      representation of that data, deserialize 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
+ *      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
+ *      returned be sufficient for the client's purposes when it is returned
  *      on a protect call.
  *
  *      If the deserialize function has to clean up file corruption
@@ -577,65 +498,16 @@ typedef enum {
  *      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.
-
- *	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 image_len callback is used to obtain the size of newly inserted
+ *      entries and assert verification.
  *
  *      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);
+ *                                           size_t *image_len_ptr);
  *
  * 	The parameters of the image_len callback are as follows:
  *
@@ -644,84 +516,16 @@ typedef enum {
  *	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:
+ *	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.
+ *	thing parameter in *image_len_ptr, and then return SUCCEED.
+ *
+ *	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 parameter.
+ *
  *
  * PRE_SERIALIZE: Pointer to the pre-serialize callback.
  *
@@ -729,11 +533,11 @@ typedef enum {
  *	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.
+ *      If the client needs to change the address or 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, 
@@ -747,7 +551,7 @@ typedef enum {
  *	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) 
+ *	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.
  *
@@ -756,15 +560,13 @@ typedef enum {
  *
  *	The typedef for the pre-serialize callback is as follows:
  *
- *	typedef herr_t (*H5C_pre_serialize_func_t)(const H5F_t *f,
+ *	typedef herr_t (*H5C_pre_serialize_func_t)(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:
@@ -792,22 +594,8 @@ typedef enum {
  *
  *	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.
+ *		serialize callback (discussed below) unless that 
+ *		value is altered by this function.
  *
  *		This parameter is supplied mainly for sanity checking.
  *		Sanity checks should be performed when compiled in debug
@@ -832,20 +620,12 @@ typedef enum {
  *		*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.
+ *		the entry.  If the entry was neither resized or moved, the
+ *              serialize function must set *flags_ptr to zero.  The
+ *              H5C__SERIALIZE_RESIZED_FLAG or H5C__SERIALIZE_MOVED_FLAG must
+ *              be set to indicate a resize or move respectively.
  *
  *	        If the H5C__SERIALIZE_RESIZED_FLAG is set, the new length
  *	        must be stored in *new_len_ptr.
@@ -853,40 +633,21 @@ typedef enum {
  *	        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. 
+ *      not need to change the size or location of the on-disk image, 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 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
  *
@@ -935,11 +696,7 @@ typedef enum {
  * 		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.
+ *		serialized.  Also the size of *image_ptr (below).
  *
  *		This parameter is supplied mainly for sanity checking.
  *		Sanity checks should be performed when compiled in debug
@@ -958,8 +715,7 @@ typedef enum {
  *
  *	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. 
+ *	serialized image of its contents into the provided buffer. 
  *
  *	If it is successful, the function must return SUCCEED. 
  *
@@ -1031,65 +787,7 @@ typedef enum {
  *
  *	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. 
+ *	modified since the last serialize callback.
  *
  * GET_FSF_SIZE: Pointer to the get file space free size callback.
  *
@@ -1125,12 +823,12 @@ typedef enum {
  *	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:
+ *      The typedef for the get_fsf_size 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:
+ *      The parameters of the get_fsf_size callback are as follows:
  *
  *      thing:  Pointer to void containing the address of the in core
  *              representation of the target metadata cache entry.  This
@@ -1164,30 +862,32 @@ typedef enum H5C_notify_action_t {
     H5C_NOTIFY_ACTION_AFTER_FLUSH,	/* Entry has just been flushed to
  					 * file.
                                          */
-    H5C_NOTIFY_ACTION_BEFORE_EVICT      /* Entry is about to be evicted 
+    H5C_NOTIFY_ACTION_BEFORE_EVICT,     /* Entry is about to be evicted 
                                          * from cache.
                                          */
+    H5C_NOTIFY_ACTION_ENTRY_DIRTIED,    /* Entry has been marked dirty. */
+    H5C_NOTIFY_ACTION_ENTRY_CLEANED,    /* Entry has been marked clean. */
+    H5C_NOTIFY_ACTION_CHILD_DIRTIED,    /* Dependent child has been marked dirty. */
+    H5C_NOTIFY_ACTION_CHILD_CLEANED,    /* Dependent child has been marked clean. */
+    H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED, /* Dependent child has been marked unserialized. */
+    H5C_NOTIFY_ACTION_CHILD_SERIALIZED  /* Dependent child has been marked serialized. */
 } H5C_notify_action_t;
 
 /* 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 herr_t (*H5C_get_initial_load_size_func_t)(void *udata_ptr, size_t *image_len_ptr);
+typedef herr_t (*H5C_get_final_load_size_func_t)(const void *image_ptr,
+    size_t image_len, void *udata_ptr, size_t *actual_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_image_len_func_t)(const void *thing, size_t *image_len_ptr);
+typedef herr_t (*H5C_pre_serialize_func_t)(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);
 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 */
@@ -1196,7 +896,8 @@ typedef struct H5C_class_t {
     const char *		name;
     H5FD_mem_t			mem_type;
     unsigned			flags;
-    H5C_get_load_size_func_t 	get_load_size;
+    H5C_get_initial_load_size_func_t 	get_initial_load_size;
+    H5C_get_final_load_size_func_t 	get_final_load_size;
     H5C_verify_chksum_func_t	verify_chksum;
     H5C_deserialize_func_t 	deserialize;
     H5C_image_len_func_t	image_len;
@@ -1204,7 +905,6 @@ typedef struct H5C_class_t {
     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;
 
@@ -1240,11 +940,13 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t *cache_ptr, haddr_t addr,
  * ring.  
  *
  * Free space managers managing file space must be flushed next,
- * and are assigned to the second outermost ring.
+ * and are assigned to the second and third outermost rings.  Two rings
+ * are used here as the raw data free space manager must be flushed before
+ * the metadata free space manager.
  *
  * 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 fourth outermost ring.
  *
  * The superblock proper must be flushed last, and is thus assigned to 
  * the innermost ring.
@@ -1258,12 +960,13 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t *cache_ptr, haddr_t addr,
  * debugging.
  */
 
-#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_RING_UNDEFINED  0 /* shouldn't appear in the cache */
+#define H5C_RING_USER       1 /* outermost ring */
+#define H5C_RING_RDFSM      2
+#define H5C_RING_MDFSM      3
+#define H5C_RING_SBE        4
+#define H5C_RING_SB         5 /* innermost ring */
+#define H5C_RING_NTYPES     6
 
 typedef int H5C_ring_t;
 
@@ -1292,16 +995,16 @@ typedef int H5C_ring_t;
  *              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 serialize
+ *              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.
  *
  *              This in turn can cause a recursive call to
- *              H5C_make_space_in_cache() which may either flush or evict
+ *              H5C__make_space_in_cache() which may either flush or evict
  *              the next entry that the first invocation of that function
  *              was about to examine.
  *
- *              The magic field allows H5C_make_space_in_cache() to
+ *              The magic field allows H5C__make_space_in_cache() to
  *              detect this case, and re-start its scan from the bottom
  *              of the LRU when this situation occurs.
  *
@@ -1309,51 +1012,11 @@ typedef int H5C_ring_t;
  *
  * addr:	Base address of the cache entry on disk.
  *
- * 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.
+ * size:	Length of the cache entry on disk in bytes Note that unlike
+ *              normal caches, the entries in this cache are of arbitrary size.
+ *
+ *		The file space allocations for cache entries implied by the
+ *              addr and size fields must be disjoint.
  *
  * image_ptr:	Pointer to void.  When not NULL, this field points to a
  * 		dynamically allocated block of size bytes in which the
@@ -1374,32 +1037,10 @@ typedef int H5C_ring_t;
  *		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.
  *
- *		NOTE: For historical reasons, this field is not maintained
- *		      by the cache.  Instead, the module using the cache
- *		      sets this flag when it modifies the entry, and the
- *		      flush and clear functions supplied by that module
- *		      reset the dirty when appropriate.
- *
- *		      This is a bit quirky, so we may want to change this
- *		      someday.  However it will require a change in the
- *		      cache interface.
- *
- *		Update: Management of the is_dirty field has been largely
- *		      moved into the cache.  The only remaining exceptions
- *		      are the flush and clear functions supplied by the
- *		      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.
  *
@@ -1425,9 +1066,9 @@ typedef int H5C_ring_t;
  *
  * is_read_only: Boolean flag that is only meaningful if is_protected is
  * 		TRUE.  In this circumstance, it indicates whether the
- * 		entry has been protected read only, or read/write.
+ * 		entry has been protected read-only, or read/write.
  *
- * 		If the entry has been protected read only (i.e. is_protected
+ * 		If the entry has been protected read-only (i.e. is_protected
  * 		and is_read_only are both TRUE), we allow the entry to be
  * 		protected more than once.
  *
@@ -1437,7 +1078,7 @@ typedef int H5C_ring_t;
  *		the entry is actually unprotected.
  *
  * ro_ref_count: Integer field used to maintain a count of the number of
- * 		outstanding read only protects on this entry.  This field
+ * 		outstanding read-only protects on this entry.  This field
  * 		must be zero whenever either is_protected or is_read_only
  * 		are TRUE.
  *
@@ -1552,7 +1193,7 @@ typedef int H5C_ring_t;
  *
  * Fields supporting the 'flush dependency' feature:
  *
- * Entries in the cache may have a 'flush dependencies' on other entries in the
+ * Entries in the cache may have '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
@@ -1576,13 +1217,35 @@ typedef int H5C_ring_t;
  *              either dirty or have a nonzero flush_dep_ndirty_children.  If
  *              this field is nonzero, then this entry cannot be flushed.
  *
+ * flush_dep_nunser_children:  Number of flush dependency children
+ *		that are either unserialized, or have a non-zero number of 
+ *		positive number of unserialized children.
+ *
+ *		Note that since there is no requirement that a clean entry
+ *		be serialized, it is possible that flush_dep_nunser_children
+ *		to be greater than flush_dep_ndirty_children.
+ *
+ *		This field exist to facilitate correct ordering of entry
+ *		serializations when it is necessary to serialize all the 
+ *		entries in the metadata cache.  Thus in the cache
+ *		serialization, no entry can be serialized unless this
+ *		field contains 0.
  *
  * Fields supporting the hash table:
  *
- * Fields in the cache are indexed by a more or less conventional hash table.
+ * Entries in the cache are indexed by a more or less conventional hash table.
  * If there are multiple entries in any hash bin, they are stored in a doubly
  * linked list.
  *
+ * Addendum:  JRM -- 10/14/15
+ *
+ * We have come to scan all entries in the cache frequently enough that 
+ * the cost of doing so by scanning the hash table has become unacceptable.
+ * To reduce this cost, the index now also maintains a doubly linked list
+ * of all entries in the index.  This list is known as the index list.
+ * The il_next and il_prev fields discussed below were added to support
+ * the index list.
+ *
  * ht_next:	Next pointer used by the hash table to store multiple
  *		entries in a single hash bin.  This field points to the
  *		next entry in the doubly linked list of entries in the
@@ -1593,6 +1256,16 @@ typedef int H5C_ring_t;
  *              previous entry in the doubly linked list of entries in
  *		the hash bin, or NULL if there is no previuos entry.
  *
+ * il_next:	Next pointer used by the index to maintain a doubly linked
+ *		list of all entries in the index (and thus in the cache).
+ *		This field contains a pointer to the next entry in the 
+ *		index list, or NULL if there is no next entry.
+ *
+ * il_prev:	Prev pointer used by the index to maintain a doubly linked
+ *		list of all entries in the index (and thus in the cache).
+ *		This field contains a pointer to the previous entry in the 
+ *		index list, or NULL if there is no previous entry.
+ *
  *
  * Fields supporting replacement policies:
  *
@@ -1666,6 +1339,249 @@ typedef int H5C_ring_t;
  *		In either case, when there is no previous item, it should 
  *		be NULL.
  *
+ * Fields supporting the cache image feature:
+ *
+ * The following fields are used to store data about the entry which must 
+ * be stored in the cache image block, but which will typically be either 
+ * lost or heavily altered in the process of serializing the cache and 
+ * preparing its contents to be copied into the cache image block.
+ *
+ * Some fields are also used in loading the contents of the metadata cache
+ * image back into the cache, and in managing such entries until they are 
+ * either protected by the library (at which point they become regular 
+ * entries) or are evicted.  See discussion of the prefetched field for 
+ * further details.
+ *
+ * include_in_image: Boolean flag indicating whether this entry should
+ *		be included in the metadata cache image.  This field should
+ *		always be false prior to the H5C_prep_for_file_close() call.
+ *		During that call, it should be set to TRUE for all entries
+ *		that are to be included in the metadata cache image.  At 
+ *		present, only the superblock, the superblock extension 
+ *		object header and its chunks (if any) are omitted from 
+ *		the image.
+ *
+ * lru_rank:	Rank of the entry in the LRU just prior to file close.
+ *
+ *		Note that the first entry on the LRU has lru_rank 1,
+ *		and that entries not on the LRU at that time will have 
+ *		either lru_rank -1 (if pinned) or 0 (if loaded during 
+ *		the process of flushing the cache.
+ *
+ * image_dirty: Boolean flag indicating whether the entry should be marked
+ *		as dirty in the metadata cache image.  The flag is set to
+ *		TRUE iff the entry is dirty when H5C_prep_for_file_close()
+ *		is called.
+ *
+ * fd_parent_count: If the entry is a child in one or more flush dependency 
+ *		relationships, this field contains the number of flush 
+ *		dependency parents.
+ *
+ *		In all other cases, the field is set to zero.
+ *
+ *		Note that while this count is initially taken from the 
+ *		flush dependency fields above, if the entry is in the 
+ *		cache image (i.e. include_in_image is TRUE), any parents
+ *		that are not in the image are removed from this count and
+ *		from the fd_parent_addrs array below.
+ *
+ *		Finally observe that if the entry is dirty and in the 
+ *		cache image, and its parent is dirty and not in the cache
+ *		image, then the entry must be removed from the cache image
+ *		to avoid violating the flush dependency flush ordering.
+ *
+ * fd_parent_addrs: If the entry is a child in one or more flush dependency 
+ *		relationship when H5C_prep_for_file_close() is called, this 
+ *		field must contain a pointer to an array of size 
+ *		fd_parent_count containing the on disk addresses of the 
+ *		parent.
+ *
+ *		In all other cases, the field is set to NULL.
+ *
+ *		Note that while this list of addresses is initially taken 
+ *		from the flush dependency fields above, if the entry is in the 
+ *		cache image (i.e. include_in_image is TRUE), any parents
+ *		that are not in the image are removed from this list, and 
+ *		and from the fd_parent_count above.
+ *
+ *		Finally observe that if the entry is dirty and in the 
+ *		cache image, and its parent is dirty and not in the cache
+ *		image, then the entry must be removed from the cache image
+ *		to avoid violating the flush dependency flush ordering.
+ *
+ * fd_child_count: If the entry is a parent in a flush dependency 
+ *		relationship, this field contains the number of flush 
+ *		dependency children.
+ *
+ *		In all other cases, the field is set to zero.
+ *
+ *		Note that while this count is initially taken from the 
+ *		flush dependency fields above, if the entry is in the 
+ *		cache image (i.e. include_in_image is TRUE), any children
+ *		that are not in the image are removed from this count.
+ *
+ * fd_dirty_child_count: If the entry is a parent in a flush dependency 
+ *		relationship, this field contains the number of dirty flush 
+ *		dependency children.
+ *
+ *		In all other cases, the field is set to zero.
+ *
+ *		Note that while this count is initially taken from the 
+ *		flush dependency fields above, if the entry is in the 
+ *		cache image (i.e. include_in_image is TRUE), any dirty 
+ *		children that are not in the image are removed from this 
+ *		count.
+ *
+ * image_fd_height: Flush dependency height of the entry in the cache image.
+ *
+ *		The flush dependency height of any entry involved in a 
+ *		flush dependency relationship is defined to be the 
+ *		longest flush dependency path from that entry to an entry
+ *		with no flush depenency children.  
+ *
+ *		Since the image_fd_height is used to order entries in the 
+ *		cache image so that fd parents preceed fd children, for 
+ *		purposes of this field, and entry is at flush dependency
+ *		level 0 if it either has no children, or if all of its
+ *		children are not in the cache image.  
+ *
+ *		Note that if a child in a flush dependency relationship is 
+ *		dirty and in the cache image, and its parent is dirty and
+ *		not in the cache image, then the child must be excluded 
+ *		from the cache image to maintain flush ordering.
+ *
+ * prefetched:	Boolean flag indicating that the on disk image of the entry
+ *		has been loaded into the cache prior any request for the 
+ *		entry by the rest of the library.
+ *
+ *		As of this writing (8/10/15), this can only happen through 
+ *		the load of a cache image block, although other scenarios 
+ *		are contemplated for the use of this feature.  Note that 
+ *		unlike the usual prefetch situation, this means that a 
+ *		prefetched entry can be dirty, and/or can be a party to 
+ *		flush dependency relationship(s).  This complicates matters 
+ *		somewhat.
+ *
+ *		The essential feature of a prefetched entry is that it 
+ *		consists only of a buffer containing the on disk image of 
+ *		the entry.  Thus it must be deserialized before it can 
+ *		be passed back to the library on a protect call.  This 
+ *		task is handled by H5C_deserialized_prefetched_entry().
+ *		In essence, this routine calls the deserialize callback 
+ *		provided in the protect call with the on disk image, 
+ *		deletes the prefetched entry from the cache, and replaces
+ *		it with the deserialized entry returned by the deserialize
+ *		callback.
+ *
+ *		Further, if the prefetched entry is a flush dependency parent, 
+ *		all its flush dependency children (which must also be 
+ *		prefetched entries), must be tranfered to the new cache 
+ *		entry returned by the deserailization callback.
+ *
+ *		Finally, if the prefetched entry is a flush dependency child, 
+ *		this flush dependency must be destroyed prior to the 
+ *		deserialize call.
+ *
+ *		In addition to the above special processing on the first 
+ *		protect call on a prefetched entry (after which is no longer
+ *		a prefetched entry), prefetched entries also require special 
+ *		tretment on flush and evict.
+ *
+ *		On flush, a dirty prefetched entry must simply be written 
+ *		to disk and marked clean without any call to any client 
+ *		callback.
+ *
+ *		On eviction, if a prefetched entry is a flush dependency 
+ *		child, that flush dependency relationship must be destroyed
+ *		just prior to the eviction.  If the flush dependency code
+ *		is working properly, it should be impossible for any entry
+ *		that is a flush dependency parent to be evicted.
+ *
+ * prefetch_type_id: Integer field containing the type ID of the prefetched
+ *		entry.  This ID must match the ID of the type provided in any
+ *		protect call on the prefetched entry.
+ *
+ *		The value of this field is undefined in prefetched is FALSE.
+ *
+ * age:		Number of times a prefetched entry has appeared in 
+ *		subsequent cache images. The field exists to allow 
+ *		imposition of a limit on how many times a prefetched 
+ *		entry can appear in subsequent cache images without being
+ *		converted to a regular entry.
+ *
+ *		This field must be zero if prefetched is FALSE.  
+ *
+ * prefetched_dirty:  Boolean field that must be set to FALSE unless the
+ *		following conditions hold:
+ *
+ *		    1) The file has been opened R/O.
+ *
+ *		    2) The entry is either a prefetched entry, or was 
+ *                     re-constructed from a prefetched entry.
+ *
+ *                  3) The base prefetched entry was marked dirty.
+ *
+ *              This field exists to solve the following problem with 
+ *              files containing cache images that are opened R/O.
+ *
+ *              If the cache image contains a dirty entry, that entry
+ *              must be marked clean when it is inserted into the cache
+ *              in the read-only case, as otherwise the metadata cache 
+ *              will attempt to flush it on file close -- which is poor 
+ *              form in the read-only case.
+ *
+ *              However, since the entry is marked clean, it is possible 
+ *              that the metadata cache will evict it if the size of the 
+ *              metadata in the file exceeds the size of the metadata cache,
+ *              and the application visits much of this data.
+ *
+ *              If this happens, and the metadata cache is then asked for
+ *              this entry, it will attempt to read it from file, and will
+ *              obtain either obsolete or invalid data depending on whether
+ *              the entry has ever been written to it assigned location in
+ *              the file.
+ *
+ *              With this background, the purpose of this field should be 
+ *              obvious -- when set, it allows the eviction candidate 
+ *              selection code to skip over the entry, thus avoiding the 
+ *              issue.
+ *
+ *              Since the issue only arises in the R/O case, there is 
+ *              no possible interaction with SWMR.  There are also 
+ *              potential interactions with Evict On Close -- at present,
+ *              we deal with this by disabling EOC in the R/O case.
+ *
+ * serialization_count:  Integer field used to maintain a count of the 
+ *		number of times each entry is serialized during cache 
+ *		serialization.  While no entry should be serialized more than
+ *		once in any serialization call, throw an assertion if any 
+ *		flush depencency parent is serialized more than once during 
+ *		a single cache serialization.
+ *
+ *		This is a debugging field, and thus is maintained only if 
+ *		NDEBUG is undefined.
+ *
+ * Fields supporting tagged entries:
+ *
+ * Entries in the cache that belong to a single object in the file are
+ * joined into a doubly-linked list, and are "tagged" with the object header
+ * address for that object's base header "chunk" (which is used as the
+ * canonical address for the object).  Global and shared entries are
+ * not tagged.  Tagged entries have a pointer to the tag info for the object,
+ * which is shared state for all the entries for that object.
+ *
+ * tl_next:	Pointer to the next entry in the tag list for an object.
+ *		NULL for the tail entry in the list, as well as untagged
+ *		entries.
+ *
+ * tl_prev:	Pointer to the previous entry in the tag list for an object.
+ *		NULL for the head entry in the list, as well as untagged
+ *		entries.
+ *
+ * tag_info:	Pointer to the common tag state for all entries belonging to
+ *              an object.  NULL for untagged entries.
+ *
+ *
  * Cache entry stats collection fields:
  *
  * These fields should only be compiled in when both H5C_COLLECT_CACHE_STATS
@@ -1687,17 +1603,12 @@ typedef int H5C_ring_t;
  ****************************************************************************/
 typedef struct H5C_cache_entry_t {
     uint32_t			magic;
-    H5C_t                     * cache_ptr;
+    H5C_t                      *cache_ptr;
     haddr_t			addr;
     size_t			size;
-    hbool_t			compressed;
-    size_t			compressed_size;
-    void  		      *	image_ptr;
+    void  		       *image_ptr;
     hbool_t			image_up_to_date;
-    const H5C_class_t	      *	type;
-    haddr_t		        tag;
-    int				globality;
-    hbool_t			is_corked;
+    const H5C_class_t	       *type;
     hbool_t			is_dirty;
     hbool_t			dirtied;
     hbool_t			is_protected;
@@ -1724,23 +1635,49 @@ typedef struct H5C_cache_entry_t {
     unsigned                    flush_dep_parent_nalloc;
     unsigned                    flush_dep_nchildren;
     unsigned                    flush_dep_ndirty_children;
+    unsigned                    flush_dep_nunser_children;
     hbool_t			pinned_from_client;
     hbool_t			pinned_from_cache;
 
     /* fields supporting the hash table: */
-    struct H5C_cache_entry_t  *	ht_next;
-    struct H5C_cache_entry_t  *	ht_prev;
+    struct H5C_cache_entry_t   *ht_next;
+    struct H5C_cache_entry_t   *ht_prev;
+    struct H5C_cache_entry_t   *il_next;
+    struct H5C_cache_entry_t   *il_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;
+    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;
 #ifdef H5_HAVE_PARALLEL
-    struct H5C_cache_entry_t  *	coll_next;
-    struct H5C_cache_entry_t  *	coll_prev;
+    struct H5C_cache_entry_t   *coll_next;
+    struct H5C_cache_entry_t   *coll_prev;
 #endif /* H5_HAVE_PARALLEL */
 
+    /* fields supporting cache image */
+    hbool_t                     include_in_image;
+    int32_t                     lru_rank;
+    hbool_t                     image_dirty;
+    uint64_t                    fd_parent_count;
+    haddr_t                    *fd_parent_addrs;
+    uint64_t                    fd_child_count;
+    uint64_t                    fd_dirty_child_count;
+    uint32_t                    image_fd_height;
+    hbool_t                     prefetched;
+    int                         prefetch_type_id;
+    int32_t                     age;
+    hbool_t			prefetched_dirty;
+
+#ifndef NDEBUG	/* debugging field */
+    int                         serialization_count;
+#endif /* NDEBUG */
+
+    /* fields supporting tag lists */
+    struct H5C_cache_entry_t   *tl_next;
+    struct H5C_cache_entry_t   *tl_prev;
+    struct H5C_tag_info_t      *tag_info;
+
 #if H5C_COLLECT_CACHE_ENTRY_STATS
     /* cache entry stats fields */
     int32_t			accesses;
@@ -1750,6 +1687,168 @@ typedef struct H5C_cache_entry_t {
 #endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
 } H5C_cache_entry_t;
 
+
+/****************************************************************************
+ *
+ * structure H5C_image_entry_t
+ *
+ * Instances of the H5C_image_entry_t structure are used to store data on
+ * metadata cache entries used in the construction of the metadata cache 
+ * image block.  In essence this structure is a greatly simplified version
+ * of H5C_cache_entry_t.
+ *
+ * The fields of this structure are discussed individually below:
+ *
+ *						JRM - 8/5/15
+ *
+ * magic:	Unsigned 32 bit integer that must always be set to
+ *              H5C_IMAGE_ENTRY_T_MAGIC when the entry is valid.
+ *              The field must be set to H5C_IMAGE_ENTRY_T_BAD_MAGIC
+ *              just before the entry is freed.
+ *
+ * addr:	Base address of the cache entry on disk.
+ *
+ * size:	Length of the cache entry on disk in bytes.
+ *
+ * ring:	Instance of H5C_ring_t indicating the flush ordering ring 
+ *		to which this entry is assigned.
+ *
+ * age:		Number of times this prefetech entry has appeared in 
+ *		the current sequence of cache images.  This field is 
+ *		initialized to 0 if the instance of H5C_image_entry_t
+ *		is constructed from a regular entry.  
+ *
+ *		If the instance is constructed from a prefetched entry 
+ *		currently residing in the metadata cache, the field is
+ *		set to 1 + the age of the prefetched entry, or to 
+ *		H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX if that sum exceeds
+ *		H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX.
+ *
+ * type_id:	Integer field containing the type ID of the entry.
+ *
+ * lru_rank:	Rank of the entry in the LRU just prior to file close.
+ *
+ *		Note that the first entry on the LRU has lru_rank 1,
+ *		and that entries not on the LRU at that time will have 
+ *		either lru_rank -1 (if pinned) or 0 (if loaded during 
+ *		the process of flushing the cache.
+ *
+ * is_dirty:	Boolean flag indicating whether the contents of the cache
+ *		entry has been modified since the last time it was written
+ *		to disk as a regular piece of metadata.
+ *
+ * image_fd_height: Flush dependency height of the entry in the cache image.
+ *
+ *              The flush dependency height of any entry involved in a
+ *              flush dependency relationship is defined to be the
+ *              longest flush dependency path from that entry to an entry
+ *              with no flush depenency children.
+ *
+ *              Since the image_fd_height is used to order entries in the
+ *              cache image so that fd parents preceed fd children, for
+ *              purposes of this field, an entry is at flush dependency
+ *              level 0 if it either has no children, or if all of its
+ *              children are not in the cache image.
+ *
+ *              Note that if a child in a flush dependency relationship is
+ *              dirty and in the cache image, and its parent is dirty and
+ *              not in the cache image, then the child must be excluded
+ *              from the cache image to maintain flush ordering.
+ *
+ * fd_parent_count: If the entry is a child in one or more flush dependency
+ *              relationships, this field contains the number of flush
+ *              dependency parents.
+ *
+ *              In all other cases, the field is set to zero.
+ *
+ *              Note that while this count is initially taken from the
+ *              flush dependency fields in the associated instance of 
+ *		H5C_cache_entry_t, if the entry is in the cache image 
+ *		(i.e. include_in_image is TRUE), any parents that are 
+ *		not in the image are removed from this count and
+ *              from the fd_parent_addrs array below.
+ *
+ *              Finally observe that if the entry is dirty and in the
+ *              cache image, and its parent is dirty and not in the cache
+ *              image, then the entry must be removed from the cache image
+ *              to avoid violating the flush dependency flush ordering.
+ *		This should have happened before the construction of 
+ *		the instance of H5C_image_entry_t.
+ *
+ * fd_parent_addrs: If the entry is a child in one or more flush dependency
+ *              relationship when H5C_prep_for_file_close() is called, this
+ *              field must contain a pointer to an array of size
+ *              fd_parent_count containing the on disk addresses of the
+ *              parents.
+ *
+ *              In all other cases, the field is set to NULL.
+ *
+ *              Note that while this list of addresses is initially taken
+ *              from the flush dependency fields in the associated instance of
+ *              H5C_cache_entry_t, if the entry is in the cache image 
+ *		(i.e. include_in_image is TRUE), any parents that are not 
+ *		in the image are removed from this list, and from the 
+ *		fd_parent_count above.
+ *
+ *              Finally observe that if the entry is dirty and in the
+ *              cache image, and its parent is dirty and not in the cache
+ *              image, then the entry must be removed from the cache image
+ *              to avoid violating the flush dependency flush ordering.
+ *		This should have happened before the construction of 
+ *		the instance of H5C_image_entry_t.
+ *
+ * fd_child_count: If the entry is a parent in a flush dependency 
+ *		relationship, this field contains the number of flush 
+ *		dependency children.
+ *
+ *		In all other cases, the field is set to zero.
+ *
+ *              Note that while this count is initially taken from the
+ *              flush dependency fields in the associated instance of
+ *              H5C_cache_entry_t, if the entry is in the cache image 
+ *		(i.e. include_in_image is TRUE), any children
+ *              that are not in the image are removed from this count.
+ *
+ * fd_dirty_child_count: If the entry is a parent in a flush dependency
+ *              relationship, this field contains the number of dirty flush
+ *              dependency children.
+ *
+ *              In all other cases, the field is set to zero.
+ *
+ *              Note that while this count is initially taken from the
+ *              flush dependency fields in the associated instance of
+ *              H5C_cache_entry_t, if the entry is in the cache image 
+ *		(i.e. include_in_image is TRUE), any dirty children 
+ *		that are not in the image are removed from this count.
+ *
+ * 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
+ *
+ *
+ ****************************************************************************/
+
+typedef struct H5C_image_entry_t {
+    uint32_t                    magic;
+    haddr_t                     addr;
+    size_t                      size;
+    H5C_ring_t                  ring;
+    int32_t                     age;
+    int32_t                     type_id;
+    int32_t                     lru_rank;
+    hbool_t                     is_dirty;
+    unsigned                    image_fd_height;
+    uint64_t                    fd_parent_count;
+    haddr_t                    *fd_parent_addrs;
+    uint64_t                    fd_child_count;
+    uint64_t                    fd_dirty_child_count;
+    void                       *image_ptr;
+} H5C_image_entry_t;
+
 /****************************************************************************
  *
  * structure H5C_auto_size_ctl_t
@@ -2039,12 +2138,98 @@ typedef struct H5C_auto_size_ctl_t {
     double				empty_reserve;
 } H5C_auto_size_ctl_t;
 
+/****************************************************************************
+ *
+ * structure H5C_cache_image_ctl_t
+ *
+ * Instances of H5C_image_ctl_t are used to get and set the control
+ * fields for generation of a metadata cache image on file close.
+ *
+ * At present control of construction of a cache image is via a FAPL
+ * property at file open / create.  
+ *
+ * The fields of the structure are discussed individually below:
+ *
+ * version: Integer field containing the version number of this version
+ *	of the H5C_image_ctl_t structure.  Any instance of
+ *	H5C_image_ctl_t passed to the cache must have a known
+ *	version number, or an error will be flagged.
+ *
+ * generate_image:  Boolean flag indicating whether a cache image should 
+ *	be created on file close.
+ *
+ * save_resize_status:  Boolean flag indicating whether the cache image 
+ *      should include the adaptive cache resize configuration and status.
+ *      Note that this field is ignored at present.
+ *
+ * entry_ageout:        Integer field indicating the maximum number of
+ *      times a prefetched entry can appear in subsequent cache images.
+ *      This field exists to allow the user to avoid the buildup of 
+ *      infrequently used entries in long sequences of cache images.
+ *
+ *      The value of this field must lie in the range
+ *      H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE (-1) to 
+ *      H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX (100).
+ *
+ *      H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE means that no limit  
+ *      is imposed on number of times a prefeteched entry can appear
+ *      in subsequent cache images.
+ *
+ *      A value of 0 prevents prefetched entries from being included 
+ *      in cache images.
+ *
+ *      Positive integers restrict prefetched entries to the specified
+ *      number of appearances.
+ *      
+ *      Note that the number of subsequent cache images that a prefetched
+ *      entry has appeared in is tracked in an 8 bit field.  Thus, while
+ *      H5AC__CACHE_IMAGE__ENTRY_AGEOUT__MAX can be increased from its  
+ *      current value, any value in excess of 255 will be the functional 
+ *      equivalent of H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE.
+ *
+ * flags: Unsigned integer containing flags controling which aspects of the
+ *	cache image functinality is actually executed.  The primary impetus 
+ *	behind this field is to allow developement of tests for partial 
+ *	implementations that will require little if any modification to run 
+ *	with the full implementation.  In normal operation, all flags should 
+ *	be set.
+ *
+ ****************************************************************************/
+
+#define H5C_CI__GEN_MDCI_SBE_MESG	((unsigned)0x0001)
+#define H5C_CI__GEN_MDC_IMAGE_BLK	((unsigned)0x0002)
+#define H5C_CI__SUPRESS_ENTRY_WRITES	((unsigned)0x0004)
+#define H5C_CI__WRITE_CACHE_IMAGE	((unsigned)0x0008)
+
+/* This #define must set all defined H5C_CI flags.  It is 
+ * used in the default value for instances of H5C_cache_image_ctl_t.
+ * This value will only be modified in test code.
+ */
+#define H5C_CI__ALL_FLAGS		((unsigned)0x000F)
+
+#define H5C__DEFAULT_CACHE_IMAGE_CTL                                  \
+{                                                                     \
+    /* version            = */ H5C__CURR_CACHE_IMAGE_CTL_VER,         \
+    /* generate_image     = */ FALSE,                                 \
+    /* save_resize_status = */ FALSE,                                 \
+    /* entry_ageout       = */ H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE, \
+    /* flags              = */ H5C_CI__ALL_FLAGS                      \
+}
+
+typedef struct H5C_cache_image_ctl_t {
+    int32_t				version;
+    hbool_t				generate_image;
+    hbool_t                             save_resize_status;
+    int32_t                             entry_ageout;
+    unsigned				flags;
+} H5C_cache_image_ctl_t;
+
 /***************************************/
 /* 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),
+    int max_type_id, const H5C_class_t * const *class_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);
@@ -2054,81 +2239,116 @@ 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_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_force_cache_image_load(H5F_t * f, hid_t dxpl_id);
+H5_DLL herr_t H5C_evict_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag, hbool_t match_global);
+H5_DLL herr_t H5C_expunge_tag_type_metadata(H5F_t *f, hid_t dxpl_id, haddr_t tag, int type_id, unsigned flags);
+H5_DLL herr_t H5C_get_tag(const void *thing, /*OUT*/ haddr_t *tag);
+#if H5C_DO_TAGGING_SANITY_CHECKS
+herr_t H5C_verify_tag(int id, haddr_t tag);
+#endif
 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_image_config(const H5C_t * cache_ptr,
+    H5C_cache_image_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);
+    uint32_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);
+    hbool_t *is_flush_dep_parent_ptr, hbool_t *is_flush_dep_child_ptr,
+    hbool_t *image_up_to_date_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_image_stats(H5C_t * cache_ptr, hbool_t print_header);
 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_load_cache_image_on_next_protect(H5F_t *f, haddr_t addr, 
+   hsize_t len, hbool_t rw);
 H5_DLL herr_t H5C_mark_entry_dirty(void *thing);
+H5_DLL herr_t H5C_mark_entry_clean(void *thing);
+H5_DLL herr_t H5C_mark_entry_unserialized(void *thing);
+H5_DLL herr_t H5C_mark_entry_serialized(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_pin_protected_entry(void *thing);
+H5_DLL herr_t H5C_prep_for_file_close(H5F_t *f, hid_t dxpl_id);
 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_cache_image_config(const H5F_t *f, H5C_t *cache_ptr,
+    H5C_cache_image_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_cache_image_config(H5C_cache_image_ctl_t * ctl_ptr);
 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 hbool_t H5C_get_ignore_tags(const H5C_t *cache_ptr);
+H5_DLL herr_t 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_unsettle_entry_ring(void *thing);
+H5_DLL herr_t H5C_unsettle_ring(H5F_t * f, H5C_ring_t ring);
+H5_DLL herr_t H5C_remove_entry(void *thing);
+H5_DLL herr_t H5C_cache_image_status(H5F_t * f, hbool_t *load_ci_ptr, 
+    hbool_t *write_ci_ptr);
+H5_DLL hbool_t H5C_cache_image_pending(const H5C_t *cache_ptr);
+H5_DLL herr_t H5C_get_mdc_image_info(H5C_t *cache_ptr, haddr_t *image_addr, hsize_t *image_len);
 
 #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,
+    H5C_t *cache_ptr, unsigned 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_clear_coll_entries(H5C_t * cache_ptr, hbool_t partial);
-H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t *f, hid_t dxpl_id, int32_t ce_array_len,
+H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t *f, hid_t dxpl_id, unsigned ce_array_len,
     haddr_t *ce_array_ptr);
 #endif /* H5_HAVE_PARALLEL */
 
 #ifndef NDEBUG	/* debugging functions */
-H5_DLL herr_t H5C_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr,
+H5_DLL herr_t H5C_dump_cache(H5C_t *cache_ptr, const char *cache_name);
+H5_DLL herr_t H5C_dump_cache_LRU(H5C_t *cache_ptr, const char *cache_name);
+H5_DLL hbool_t H5C_get_serialization_in_progress(const H5C_t *cache_ptr);
+H5_DLL hbool_t H5C_cache_is_clean(const H5C_t *cache_ptr, H5C_ring_t inner_ring);
+H5_DLL herr_t H5C_dump_cache_skip_list(H5C_t *cache_ptr, char *calling_fcn);
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5C_dump_coll_write_list(H5C_t * cache_ptr, char * calling_fcn);
+#endif /* H5_HAVE_PARALLEL */
+H5_DLL herr_t H5C_get_entry_ptr_from_addr(H5C_t *cache_ptr, haddr_t addr,
     void **entry_ptr_ptr);
-H5_DLL herr_t H5C_verify_entry_type(const H5F_t *f, haddr_t addr,
+H5_DLL herr_t H5C_flush_dependency_exists(H5C_t *cache_ptr, haddr_t parent_addr,
+    haddr_t child_addr, hbool_t *fd_exists_ptr);
+H5_DLL herr_t H5C_verify_entry_type(H5C_t *cache_ptr, haddr_t addr,
     const H5C_class_t *expected_type, hbool_t *in_cache_ptr,
     hbool_t *type_ok_ptr);
+H5_DLL herr_t H5C_validate_index_list(H5C_t *cache_ptr);
 #endif /* NDEBUG */
 
 #endif /* !_H5Cprivate_H */
diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h
index 39ebbe3..62107d9 100644
--- a/src/H5Cpublic.h
+++ b/src/H5Cpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Cquery.c b/src/H5Cquery.c
new file mode 100644
index 0000000..6c927b0
--- /dev/null
+++ b/src/H5Cquery.c
@@ -0,0 +1,484 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cquery.c
+ *              May 30 2016
+ *              Quincey Koziol
+ *
+ * Purpose:     Routines which query different components of the generic
+ *              cache structure or entries.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* 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 "H5Cpkg.h"		/* Cache				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_auto_resize_config
+ *
+ * Purpose:	Copy the current configuration of the cache automatic
+ *		re-sizing function into the instance of H5C_auto_size_ctl_t
+ *		pointed to by config_ptr.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/8/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr,
+                                 H5C_auto_size_ctl_t *config_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad config_ptr on entry.")
+
+    *config_ptr = cache_ptr->resize_ctl;
+
+    config_ptr->set_initial_size = FALSE;
+    config_ptr->initial_size = cache_ptr->max_cache_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_cache_auto_resize_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_size
+ *
+ * Purpose:	Return the cache maximum size, the minimum clean size, the
+ *		current size, and the current number of entries in
+ *              *max_size_ptr, *min_clean_size_ptr, *cur_size_ptr, and
+ *		*cur_num_entries_ptr respectively.  If any of these
+ *		parameters are NULL, skip that value.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/8/04
+ *
+ *-------------------------------------------------------------------------
+ */
+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,
+                   uint32_t * cur_num_entries_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+
+    if(max_size_ptr != NULL)
+        *max_size_ptr = cache_ptr->max_cache_size;
+
+    if(min_clean_size_ptr != NULL)
+        *min_clean_size_ptr = cache_ptr->min_clean_size;
+
+    if(cur_size_ptr != NULL)
+        *cur_size_ptr = cache_ptr->index_size;
+
+    if(cur_num_entries_ptr != NULL)
+        *cur_num_entries_ptr = cache_ptr->index_len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_cache_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_cache_hit_rate
+ *
+ * Purpose:	Compute and return the current cache hit rate in
+ *              *hit_rate_ptr.  If there have been no accesses since the
+ *              last time the cache hit rate stats were reset, set
+ *		*hit_rate_ptr to 0.0.  On error, *hit_rate_ptr is
+ *		undefined.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *		10/7/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+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))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    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)
+        *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) /
+                         ((double)(cache_ptr->cache_accesses));
+    else
+        *hit_rate_ptr = 0.0f;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_cache_hit_rate() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_get_entry_status
+ *
+ * Purpose:     This function is used to determine whether the cache
+ *		contains an entry with the specified base address.  If
+ *		the entry exists, it also reports some status information
+ *		on the entry.
+ *
+ *		Status information is reported in the locations pointed
+ *		to by the size_ptr, in_cache_ptr, is_dirty_ptr, and
+ *		is_protected_ptr.  While in_cache_ptr must be defined,
+ *		the remaining pointers may be NULL, in which case the
+ *		associated data is not reported.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+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,
+		     hbool_t * image_up_to_date_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    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 != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(in_cache_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;
+    } /* end if */
+    else {
+        *in_cache_ptr = TRUE;
+        if(size_ptr != NULL)
+            *size_ptr = entry_ptr->size;
+        if(is_dirty_ptr != NULL)
+            *is_dirty_ptr = entry_ptr->is_dirty;
+        if(is_protected_ptr != NULL)
+            *is_protected_ptr = entry_ptr->is_protected;
+        if(is_pinned_ptr != NULL)
+            *is_pinned_ptr = entry_ptr->is_pinned;
+        if(is_corked_ptr != NULL)
+            *is_corked_ptr = entry_ptr->tag_info ? entry_ptr->tag_info->corked : FALSE;
+        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);
+        if(image_up_to_date_ptr != NULL )
+            *image_up_to_date_ptr = entry_ptr->image_up_to_date;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_entry_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_evictions_enabled()
+ *
+ * Purpose:     Copy the current value of cache_ptr->evictions_enabled into
+ *              *evictions_enabled_ptr.
+ *
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer
+ *              7/27/07
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_evictions_enabled(const H5C_t *cache_ptr,
+                          hbool_t * evictions_enabled_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL ) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+
+    if(evictions_enabled_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad evictions_enabled_ptr on entry.")
+
+    *evictions_enabled_ptr = cache_ptr->evictions_enabled;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_evictions_enabled() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_aux_ptr
+ *
+ * Purpose:     Get the aux_ptr field from the cache.
+ *
+ *              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-NULL trace file pointer (can't fail)
+ *
+ * Programmer:  John Mainzer
+ *              1/20/06
+ *
+ *-------------------------------------------------------------------------
+ */
+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);
+
+    FUNC_LEAVE_NOAPI(cache_ptr->trace_file_ptr)
+} /* H5C_get_trace_file_ptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_trace_file_ptr_from_entry
+ *
+ * Purpose:     Get the trace_file_ptr field from the cache, via an entry.
+ *
+ *              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-NULL trace file pointer (can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              6/9/08
+ *
+ *-------------------------------------------------------------------------
+ */
+FILE *
+H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->cache_ptr);
+
+    FUNC_LEAVE_NOAPI(H5C_get_trace_file_ptr(entry_ptr->cache_ptr))
+} /* H5C_get_trace_file_ptr_from_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * 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)
+    if(entry_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't find entry in index")
+
+    /* Return the ring value */
+    *ring = entry_ptr->ring;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_entry_ring() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_mdc_image_info
+ *
+ * Purpose:	    To retrieve the address and size of the cache image in the file.
+ *              
+ * Return:      SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  Vailin Choi; March 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_mdc_image_info(H5C_t * cache_ptr, haddr_t *image_addr, hsize_t *image_len)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "bad cache_ptr on entry")
+    if(image_addr == NULL || image_len == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "bad image_addr or image_len on entry")
+
+    *image_addr = cache_ptr->image_addr;
+    *image_len = cache_ptr->image_len;
+    
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_mdc_image_info() */
+
diff --git a/src/H5Ctag.c b/src/H5Ctag.c
new file mode 100644
index 0000000..a9b2ec0
--- /dev/null
+++ b/src/H5Ctag.c
@@ -0,0 +1,907 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Ctag.c
+ *              June 5 2016
+ *              Quincey Koziol
+ *
+ * Purpose:     Functions in this file operate on tags for metadata
+ *              cache entries.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* 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 "H5Pprivate.h"         /* Property lists                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for tagged entry iterator callback context - evict tagged entries */
+typedef struct {
+    H5F_t * f;                          /* File pointer for evicting entry */
+    hid_t dxpl_id;                      /* DXPL for evicting entry */
+    hbool_t evicted_entries_last_pass;  /* Flag to indicate that an entry 
+                                         * was evicted when iterating over 
+                                         * cache 
+                                         */
+    hbool_t pinned_entries_need_evicted;/* Flag to indicate that a pinned 
+                                         * entry was attempted to be evicted 
+                                         */
+    hbool_t skipped_pf_dirty_entries;   /* Flag indicating that one or more 
+                                         * entries marked prefetched_dirty
+                                         * were encountered and not 
+                                         * evicted.
+                                         */
+} H5C_tag_iter_evict_ctx_t;
+
+/* Typedef for tagged entry iterator callback context - expunge tag type metadata */
+typedef struct {
+    H5F_t * f;                          /* File pointer for evicting entry */
+    hid_t dxpl_id;                      /* DXPL for evicting entry */
+    int type_id;                        /* Cache entry type to expunge */
+    unsigned flags;                     /* Flags for expunging entry */
+} H5C_tag_iter_ettm_ctx_t;
+
+/* Typedef for tagged entry iterator callback context - mark corked */
+typedef struct {
+    hbool_t cork_val;                   /* Corked value */
+} H5C_tag_iter_cork_ctx_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5C__mark_tagged_entries(H5C_t *cache_ptr, haddr_t tag);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare extern free list to manage the tag info struct */
+H5FL_EXTERN(H5C_tag_info_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ *
+ * 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_get_ignore_tags
+ *
+ * Purpose:     Retrieve the 'ignore_tags' field for the cache
+ *
+ * Return:      'ignore_tags' value (can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              April 30, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5C_get_ignore_tags(const H5C_t *cache_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Return ignore tag value */
+    FUNC_LEAVE_NOAPI(cache_ptr->ignore_tags)
+} /* H5C_get_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
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__tag_entry(H5C_t *cache, H5C_cache_entry_t *entry, hid_t dxpl_id)
+{
+    H5P_genplist_t *dxpl;       /* dataset transfer property list */
+    H5C_tag_info_t *tag_info;	/* Points to a tag info struct */
+    haddr_t tag;                /* Tag value */
+    herr_t ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Assertions */
+    HDassert(cache != NULL);
+    HDassert(entry != NULL);
+    HDassert(cache->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, H5AC_TAG_NAME, &tag)) < 0)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query property value")
+
+    if(cache->ignore_tags) {
+        /* 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(!H5F_addr_defined(tag))
+            tag = H5AC__IGNORE_TAG;
+    } /* end if */
+#if H5C_DO_TAGGING_SANITY_CHECKS
+    else {
+        /* Perform some sanity checks to ensure that a correct tag is being applied */
+        if(H5C_verify_tag(entry->type->id, tag) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "tag verification failed")
+    } /* end else */
+#endif
+
+    /* Search the list of tagged object addresses in the cache */
+    tag_info = (H5C_tag_info_t *)H5SL_search(cache->tag_list, &tag);
+
+    /* Check if this is the first entry for this tagged object */
+    if(NULL == tag_info) {
+        /* Allocate new tag info struct */
+        if(NULL == (tag_info = H5FL_CALLOC(H5C_tag_info_t)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "can't allocate tag info for cache entry")
+
+        /* Set the tag for all entries */
+        tag_info->tag = tag;
+
+        /* Insert tag info into skip list */
+        if(H5SL_insert(cache->tag_list, tag_info, &(tag_info->tag)) < 0 )
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert tag info in skip list")
+    } /* end if */
+    else
+        HDassert(tag_info->corked || (tag_info->entry_cnt > 0 && tag_info->head));
+
+    /* Sanity check entry, to avoid double insertions, etc */
+    HDassert(entry->tl_next == NULL);
+    HDassert(entry->tl_prev == NULL);
+    HDassert(entry->tag_info == NULL);
+
+    /* Add the entry to the list for the tagged object */
+    entry->tl_next = tag_info->head;
+    entry->tag_info = tag_info;
+    if(tag_info->head)
+        tag_info->head->tl_prev = entry;
+    tag_info->head = entry;
+    tag_info->entry_cnt++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__tag_entry */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__untag_entry
+ *
+ * Purpose:     Removes an entry from a tag list, possibly removing the tag
+ *		info from the list of tagged objects with entries.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Quincey Koziol
+ *              July 8, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__untag_entry(H5C_t *cache, H5C_cache_entry_t *entry)
+{
+    H5C_tag_info_t *tag_info;	/* Points to a tag info struct */
+    herr_t ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Assertions */
+    HDassert(cache != NULL);
+    HDassert(entry != NULL);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Get the entry's tag info struct */
+    if(NULL != (tag_info = entry->tag_info)) {
+        /* Remove the entry from the list */
+        if(entry->tl_next)
+            entry->tl_next->tl_prev = entry->tl_prev;
+        if(entry->tl_prev)
+            entry->tl_prev->tl_next = entry->tl_next;
+        if(tag_info->head == entry)
+            tag_info->head = entry->tl_next;
+        tag_info->entry_cnt--;
+
+        /* Reset pointers, to avoid confusion */
+        entry->tl_next = NULL;
+        entry->tl_prev = NULL;
+        entry->tag_info = NULL;
+
+        /* Remove the tag info from the tag list, if there's no more entries with this tag */
+        if(!tag_info->corked && 0 == tag_info->entry_cnt) {
+            /* Sanity check */
+            HDassert(NULL == tag_info->head);
+
+            if(H5SL_remove(cache->tag_list, &(tag_info->tag)) != tag_info)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTREMOVE, FAIL, "can't remove tag info from list")
+
+            /* Release the tag info */
+            tag_info = H5FL_FREE(H5C_tag_info_t, tag_info);
+        } /* end if */
+        else
+            HDassert(tag_info->corked || NULL != tag_info->head);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__untag_entry */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__iter_tagged_entries_real
+ *
+ * Purpose:     Iterate over tagged entries, making a callback for matches
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Quincey Koziol
+ *              June 7, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__iter_tagged_entries_real(H5C_t *cache, haddr_t tag, H5C_tag_iter_cb_t cb,
+    void *cb_ctx)
+{
+    H5C_tag_info_t *tag_info;	        /* Points to a tag info struct */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache != NULL);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Search the list of tagged object addresses in the cache */
+    tag_info = (H5C_tag_info_t *)H5SL_search(cache->tag_list, &tag);
+
+    /* If there's any entries for this tag, iterate over them */
+    if(tag_info) {
+        H5C_cache_entry_t *entry;       /* Pointer to current entry */
+        H5C_cache_entry_t *next_entry;  /* Pointer to next entry in hash bucket chain */
+
+        /* Sanity check */
+        HDassert(tag_info->head);
+        HDassert(tag_info->entry_cnt > 0);
+
+        /* Iterate over the entries for this tag */
+        entry = tag_info->head;
+        while(entry) {
+            /* Acquire pointer to next entry */
+            next_entry = entry->tl_next;
+
+            /* Make callback for entry */
+            if((cb)(entry, cb_ctx) != H5_ITER_CONT)
+                HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "tagged entry iteration callback failed")
+            
+            /* Advance to next entry */
+            entry = next_entry;
+        } /* end while */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__iter_tagged_entries_real() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__iter_tagged_entries
+ *
+ * Purpose:     Iterate over tagged entries, making a callback for matches
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Quincey Koziol
+ *              June 7, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__iter_tagged_entries(H5C_t *cache, haddr_t tag, hbool_t match_global,
+    H5C_tag_iter_cb_t cb, void *cb_ctx)
+{
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(cache != NULL);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Iterate over the entries for this tag */
+    if(H5C__iter_tagged_entries_real(cache, tag, cb, cb_ctx) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "iteration of tagged entries failed")
+
+    /* Check for iterating over global metadata */
+    if(match_global) { 
+        /* Iterate over the entries for SOHM entries */
+        if(H5C__iter_tagged_entries_real(cache, H5AC__SOHM_TAG, cb, cb_ctx) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "iteration of tagged entries failed")
+    
+        /* Iterate over the entries for global heap entries */
+        if(H5C__iter_tagged_entries_real(cache, H5AC__GLOBALHEAP_TAG, cb, cb_ctx) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "iteration of tagged entries failed")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__iter_tagged_entries() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__evict_tagged_entries_cb
+ *
+ * Purpose:     Callback for evicting tagged entries
+ *
+ * Return:      H5_ITER_ERROR if error is detected, H5_ITER_CONT otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              August 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5C__evict_tagged_entries_cb(H5C_cache_entry_t *entry, void *_ctx)
+{
+    H5C_tag_iter_evict_ctx_t *ctx = (H5C_tag_iter_evict_ctx_t *)_ctx; /* Get pointer to iterator context */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_STATIC
+
+    /* Santify checks */
+    HDassert(entry);
+    HDassert(ctx);
+
+    /* Attempt to evict entry */
+    if(entry->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, H5_ITER_ERROR, "Cannot evict protected entry")
+    else if(entry->is_dirty)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, H5_ITER_ERROR, "Cannot evict dirty entry")
+    else if(entry->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) */
+        ctx->pinned_entries_need_evicted = TRUE;
+    else if(!entry->prefetched_dirty) {
+        /* Evict the Entry */
+        if(H5C__flush_single_entry(ctx->f, ctx->dxpl_id, entry, H5C__FLUSH_INVALIDATE_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, H5_ITER_ERROR, "Entry eviction failed.")
+        ctx->evicted_entries_last_pass = TRUE;
+    } else {
+        ctx->skipped_pf_dirty_entries = TRUE;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__evict_tagged_entries_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * 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, hbool_t match_global)
+{
+    H5C_t *cache;                   /* Pointer to cache structure */
+    H5C_tag_iter_evict_ctx_t ctx;   /* Context for iterator callback */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache = f->shared->cache;   /* Get cache pointer */
+    HDassert(cache != NULL);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Construct context for iterator callbacks */
+    ctx.f = f;
+    ctx.dxpl_id = dxpl_id;
+
+    /* Start evicting entries */
+    do {
+        /* Reset pinned/evicted tracking flags */
+        ctx.pinned_entries_need_evicted = FALSE;
+        ctx.evicted_entries_last_pass = FALSE;
+        ctx.skipped_pf_dirty_entries = FALSE;
+
+        /* Iterate through entries in the cache */
+        if(H5C__iter_tagged_entries(cache, tag, match_global, H5C__evict_tagged_entries_cb, &ctx) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "Iteration of tagged entries failed")
+
+        /* Keep doing this until we have stopped evicted entries */
+    } while(TRUE == ctx.evicted_entries_last_pass);
+
+    /* In most cases, fail if we have finished evicting entries and pinned 
+     * entries still need evicted 
+     *
+     * However, things can get strange if the file was opened R/O and 
+     * the file contains a cache image and the cache image contains dirty 
+     * entries.  
+     *
+     * Since the file was opened read only, dirty entries in the cache 
+     * image were marked as clean when they were inserted into the metadata
+     * cache.  This is necessary, as if they are marked dirty, the metadata
+     * cache will attempt to write them on file close, which is frowned 
+     * upon when the file is opened R/O.
+     *
+     * On the other hand, such entries (marked prefetched_dirty) must not 
+     * be evicted, as should the cache be asked to re-load them, the cache
+     * will attempt to read them from the file, and at best load an outdated
+     * version.
+     * 
+     * To avoid this, H5C__evict_tagged_entries_cb has been modified to 
+     * skip such entries.  However, by doing so, it may prevent pinned 
+     * entries from becoming unpinned.
+     *
+     * Thus we must ignore ctx.pinned_entries_need_evicted if 
+     * ctx.skipped_pf_dirty_entries is TRUE.
+     */
+    if((!ctx.skipped_pf_dirty_entries) && (ctx.pinned_entries_need_evicted))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Pinned entries still need evicted?!")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_evict_tagged_entries() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__mark_tagged_entries_cb
+ *
+ * Purpose:     Callback to set the flush marker on dirty entries in the cache
+ *
+ * Return:      H5_ITER_CONT (can't fail)
+ *
+ * Programmer:  Mike McGreevy
+ *              September 9, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5C__mark_tagged_entries_cb(H5C_cache_entry_t *entry, void H5_ATTR_UNUSED *_ctx)
+{
+    /* Function enter macro */
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(entry);
+
+    /* We only want to set the flush marker on entries that
+     * actually need flushed (i.e., dirty ones) */
+    if(entry->is_dirty)
+        entry->flush_marker = TRUE;
+
+    FUNC_LEAVE_NOAPI(H5_ITER_CONT)
+} /* H5C__mark_tagged_entries_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * 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.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              September 9, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5C__mark_tagged_entries(H5C_t *cache, haddr_t tag)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Iterate through hash table entries, marking those with specified tag, as
+     * well as any major global entries which should always be flushed
+     * when flushing based on tag value */
+    if(H5C__iter_tagged_entries(cache, tag, TRUE, H5C__mark_tagged_entries_cb, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "Iteration of tagged entries failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__mark_tagged_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
+ *
+ *-------------------------------------------------------------------------
+ */
+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) {
+        if(id != H5AC_PROXY_ENTRY_ID)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "no metadata tag provided")
+    } /* end else-if */
+    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")
+        } /* end if */
+        else {
+            if(tag == H5AC__SUPERBLOCK_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__SUPERBLOCK_TAG applied to non-superblock entry")
+        } /* end else */
+    
+        /* Free Space Manager */
+        if(tag == H5AC__FREESPACE_TAG && ((id != H5AC_FSPACE_HDR_ID) && (id != H5AC_FSPACE_SINFO_ID)))
+                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")
+        } /* end if */
+        else {
+            if(tag == H5AC__GLOBALHEAP_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__GLOBALHEAP_TAG applied to non-globalheap entry")
+        } /* end else */
+    } /* 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) < 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
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_retag_entries(H5C_t *cache, haddr_t src_tag, haddr_t dest_tag) 
+{
+    H5C_tag_info_t *tag_info;	        /* Points to a tag info struct */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(cache);
+
+    /* Remove tag info from tag list */
+    if(NULL != (tag_info = (H5C_tag_info_t *)H5SL_remove(cache->tag_list, &src_tag))) {
+        /* Change to new tag */
+        tag_info->tag = dest_tag;
+
+        /* Re-insert tag info into skip list */
+        if(H5SL_insert(cache->tag_list, tag_info, &(tag_info->tag)) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert tag info in skip list")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_retag_entries() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__expunge_tag_type_metadata_cb
+ *
+ * Purpose:     Expunge from the cache entries associated
+ *              with 'tag' and type id.
+ *
+ * Return:      H5_ITER_ERROR if error is detected, H5_ITER_CONT otherwise.
+ *
+ * Programmer:  Vailin Choi
+ *		May 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5C__expunge_tag_type_metadata_cb(H5C_cache_entry_t *entry, void *_ctx)
+{
+    H5C_tag_iter_ettm_ctx_t *ctx = (H5C_tag_iter_ettm_ctx_t *)_ctx; /* Get pointer to iterator context */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_STATIC
+
+    /* Santify checks */
+    HDassert(entry);
+    HDassert(ctx);
+
+    /* Found one with the same tag and type id */
+    if(entry->type->id == ctx->type_id)
+        if(H5C_expunge_entry(ctx->f, ctx->dxpl_id, entry->type, entry->addr, ctx->flags) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, H5_ITER_ERROR, "can't expunge entry")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__expunge_tag_type_metadata_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_expunge_tag_type_metadata
+ *
+ * Purpose:     Search and expunge from the cache entries associated
+ *              with 'tag' and type id.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Vailin Choi
+ *		May 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5C_expunge_tag_type_metadata(H5F_t *f, hid_t dxpl_id, haddr_t tag, int type_id,
+    unsigned flags)
+{
+    H5C_t *cache;                       /* Pointer to cache structure */
+    H5C_tag_iter_ettm_ctx_t ctx;        /* Context for iterator callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache = f->shared->cache;   /* Get cache pointer */
+    HDassert(cache != NULL);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Construct context for iterator callbacks */
+    ctx.f = f;
+    ctx.dxpl_id = dxpl_id;
+    ctx.type_id = type_id;
+    ctx.flags = flags;
+
+    /* Iterate through hash table entries, expunge those with specified tag and type id */
+    if(H5C__iter_tagged_entries(cache, tag, FALSE, H5C__expunge_tag_type_metadata_cb, &ctx) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "Iteration of tagged entries failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_expunge_tag_type_metadata() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_get_tag()
+ *
+ * Purpose:     Get the tag for a metadata cache entry.
+ *
+ * Return:      SUCCEED (can't fail)
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5C_get_tag(const void *thing, haddr_t *tag /*OUT*/)
+{
+    const H5C_cache_entry_t *entry = (const H5C_cache_entry_t *)thing;  /* Pointer to cache entry */
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    HDassert(entry);
+    HDassert(entry->tag_info);
+    HDassert(tag);
+
+    /* Return the tag */
+    *tag = entry->tag_info->tag;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_get_tag() */
+
diff --git a/src/H5Ctest.c b/src/H5Ctest.c
new file mode 100644
index 0000000..2cd0a5d
--- /dev/null
+++ b/src/H5Ctest.c
@@ -0,0 +1,161 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Ctest.c
+ *              June 7 2016
+ *              Quincey Koziol
+ *
+ * Purpose:     Functions in this file support the metadata cache regression
+ *		tests>
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Cmodule.h"          /* This source code file is part of the H5C module */
+#define H5C_TESTING		/*suppress warning about H5C testing funcs*/
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Cpkg.h"		/* Cache				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for tagged entry iterator callback context - verify cork tag */
+typedef struct {
+    hbool_t status;             /* Corked status */
+} H5C_tag_iter_vct_ctx_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__verify_cork_tag_test_cb
+ *
+ * Purpose:     Verify the cork status for an entry
+ *
+ * Return:      SUCCEED on success, FAIL on error
+ *
+ * Programmer:  Vailin Choi
+ *		Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5C__verify_cork_tag_test_cb(H5C_cache_entry_t *entry, void *_ctx)
+{
+    H5C_tag_iter_vct_ctx_t *ctx = (H5C_tag_iter_vct_ctx_t *)_ctx; /* Get pointer to iterator context */
+    hbool_t is_corked;                  /* Corked status for entry */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_STATIC
+
+    /* Santify checks */
+    HDassert(entry);
+    HDassert(ctx);
+
+    /* Retrieve corked status for entry */
+    is_corked = entry->tag_info ? entry->tag_info->corked : FALSE;
+
+    /* Verify corked status for entry */
+    if(is_corked != ctx->status)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, H5_ITER_ERROR, "bad cork status")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__verify_cork_tag_test_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__verify_cork_tag_test
+ *
+ * Purpose:     This routine verifies that all cache entries associated with
+ *      the object tag are marked with the desired "cork" status.
+ *
+ * Return:      SUCCEED on success, FAIL on error
+ *
+ * Programmer:  Vailin Choi
+ *		Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C__verify_cork_tag_test(hid_t fid, haddr_t tag, hbool_t status)
+{
+    H5F_t * f;                  /* File Pointer */
+    H5C_t * cache;              /* Cache Pointer */
+    H5C_tag_iter_vct_ctx_t ctx; /* Context for iterator callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Function enter macro */
+    FUNC_ENTER_PACKAGE
+
+    /* Get file pointer */
+    if(NULL == (f = (H5F_t *)H5I_object_verify(fid, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Get cache pointer */
+    cache = f->shared->cache;
+
+    /* Construct context for iterator callbacks */
+    ctx.status = status;
+
+    /* Iterate through tagged entries in the cache */
+    if(H5C__iter_tagged_entries(cache, tag, FALSE, H5C__verify_cork_tag_test_cb, &ctx) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADITER, FAIL, "iteration of tagged entries failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__verify_cork_tag_test() */
+
diff --git a/src/H5D.c b/src/H5D.c
index 0f5a769..6f69ee4 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -308,37 +306,37 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Dclose
+ * Function:    H5Dclose
  *
- * Purpose:	Closes access to a dataset (DATASET_ID) and releases
- *		resources used by it. It is illegal to subsequently use that
- *		same dataset ID in calls to other dataset functions.
+ * Purpose:     Closes access to a dataset (DATASET_ID) and releases
+ *              resources used by it. It is illegal to subsequently use that
+ *              same dataset ID in calls to other dataset functions.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Robb Matzke
- *		Thursday, December  4, 1997
+ * Programmer:  Robb Matzke
+ *              Thursday, December  4, 1997
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Dclose(hid_t dset_id)
 {
-    herr_t       ret_value = SUCCEED;   /* Return value */
+    herr_t  ret_value = SUCCEED;    /* Return value                     */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "i", dset_id);
 
     /* Check args */
     if(NULL == 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")
 
     /*
      * Decrement the counter on the dataset.  It will be freed if the count
      * reaches zero.  
      */
     if(H5I_dec_app_ref_always_close(dset_id) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't decrement count on dataset ID")
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't decrement count on dataset ID")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -379,7 +377,7 @@ H5Dget_space(hid_t dset_id)
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Dget_space() */
 
 

 /*-------------------------------------------------------------------------
@@ -415,7 +413,7 @@ H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation)
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* H5Dget_space_status() */
 
 

 /*-------------------------------------------------------------------------
@@ -916,7 +914,7 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[])
 done:
         FUNC_LEAVE_API(ret_value)
 } /* end H5Dset_extent() */
- 
+
 

 /*-------------------------------------------------------------------------
  * Function:    H5Dflush
@@ -1001,7 +999,8 @@ done:
  *
  * Return:      Non-negative on success, negative on failure
  *
- * Programmer:  Vailin Choi; Feb 2015
+ * Programmer:  Vailin Choi
+ *              Feb 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -1021,25 +1020,27 @@ H5Dformat_convert(hid_t dset_id)
     switch(dset->shared->layout.type) {
 	case H5D_CHUNKED:
 	    /* Convert the chunk indexing type to version 1 B-tree if not */
-	    if(dset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE) {
-		    if((H5D__format_convert(dset, H5AC_ind_read_dxpl_id)) < 0)
-		        HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade chunk indexing type for dataset")
-	    }
+	    if(dset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE)
+                if((H5D__format_convert(dset, H5AC_ind_read_dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade chunk indexing type for dataset")
 	    break;
 
 	case H5D_CONTIGUOUS:
 	case H5D_COMPACT:
 	    /* Downgrade the layout version to 3 if greater than 3 */
-	    if(dset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT) {
-		    if((H5D__format_convert(dset, H5AC_ind_read_dxpl_id)) < 0)
-		        HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade layout version for dataset")
-	    }
+	    if(dset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT)
+                if((H5D__format_convert(dset, H5AC_ind_read_dxpl_id)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade layout version for dataset")
 	    break;
 
 	case H5D_VIRTUAL:
 	    /* Nothing to do even though layout is version 4 */
 	    break;
 
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
+
 	default: 
 	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
     } /* end switch */
@@ -1056,7 +1057,8 @@ done:
  *
  * Return:      Non-negative on success, negative on failure
  *
- * Programmer:  Vailin Choi; Feb 2015
+ * Programmer:  Vailin Choi
+ *              Feb 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -1077,9 +1079,11 @@ H5Dget_chunk_index_type(hid_t did, H5D_chunk_index_t *idx_type)
     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 */
+    /* Get the chunk indexing type */
+    if(idx_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 8ef14b9..8177e13 100644
--- a/src/H5Dbtree.c
+++ b/src/H5Dbtree.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer: 	Robb Matzke <matzke at llnl.gov>
diff --git a/src/H5Dbtree2.c b/src/H5Dbtree2.c
index 363d57a..2e19392 100644
--- a/src/H5Dbtree2.c
+++ b/src/H5Dbtree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* 
@@ -211,8 +209,6 @@ const H5B2_class_t H5D_BT2_FILT[1] = {{	/* B-tree class information */
 
 /* 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);
 
@@ -643,8 +639,9 @@ H5D__bt2_idx_init(const H5D_chk_idx_info_t H5_ATTR_UNUSED *idx_info,
 static herr_t
 H5D__btree2_idx_depend(const H5D_chk_idx_info_t *idx_info)
 {
+    H5O_t *oh = NULL;                   /* Object header */
     H5O_loc_t oloc;                     /* Temporary object header location for dataset */
-    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    H5AC_proxy_entry_t *oh_proxy;       /* Dataset's object header proxy */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -666,18 +663,22 @@ H5D__btree2_idx_depend(const H5D_chk_idx_info_t *idx_info)
     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")
+    /* Get header */
+    if(NULL == (oh = H5O_protect(&oloc, idx_info->dxpl_id, H5AC__READ_ONLY_FLAG, TRUE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
-    /* 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")
+    /* Retrieve the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_get_proxy(oh)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get dataset object header proxy")
+
+    /* Make the v2 B-tree a child flush dependency of the dataset's object header proxy */
+    if(H5B2_depend(idx_info->storage->u.btree2.bt2, idx_info->dxpl_id, oh_proxy) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header proxy")
 
 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")
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(&oloc, idx_info->dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__btree2_idx_depend() */
@@ -923,8 +924,10 @@ H5D__bt2_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
 	/* 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")
-    } else  /* Patch the top level file pointer contained in bt2 if needed */
-	H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f);
+    } /* end if */
+    else  /* Patch the top level file pointer contained in bt2 if needed */
+	if(H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch v2 B-tree file pointer")
 
     /* Set convenience pointer to v2 B-tree structure */
     bt2 = idx_info->storage->u.btree2.bt2;
@@ -1016,8 +1019,10 @@ H5D__bt2_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
 	/* 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")
-    } else  /* Patch the top level file pointer contained in bt2 if needed */
-	H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f);
+    } /* end if */
+    else  /* Patch the top level file pointer contained in bt2 if needed */
+	if(H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch v2 B-tree file pointer")
 
     /* Set convenience pointer to v2 B-tree structure */
     bt2 = idx_info->storage->u.btree2.bt2;
@@ -1137,8 +1142,10 @@ H5D__bt2_idx_iterate(const H5D_chk_idx_info_t *idx_info,
 	/* 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")
-    } else  /* Patch the top level file pointer contained in bt2 if needed */
-	H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f);
+    } /* end if */
+    else  /* Patch the top level file pointer contained in bt2 if needed */
+	if(H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch v2 B-tree file pointer")
 
     /* Set convenience pointer to v2 B-tree structure */
     bt2 = idx_info->storage->u.btree2.bt2;
@@ -1226,10 +1233,14 @@ H5D__bt2_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t *u
     HDassert(udata);
 
     /* Check if the v2 B-tree is open yet */
-    if(NULL == idx_info->storage->u.btree2.bt2)
+    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")
+    } /* end if */
+    else  /* Patch the top level file pointer contained in bt2 if needed */
+	if(H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch v2 B-tree file pointer")
 
     /* Set convenience pointer to v2 B-tree structure */
     bt2 = idx_info->storage->u.btree2.bt2;
@@ -1547,6 +1558,11 @@ H5D__bt2_idx_dest(const H5D_chk_idx_info_t *idx_info)
 
     /* Check if the v2-btree is open */
     if(idx_info->storage->u.btree2.bt2) {
+
+	/* Patch the top level file pointer contained in bt2 if needed */
+	if(H5B2_patch_file(idx_info->storage->u.btree2.bt2, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch v2 B-tree file pointer")
+
         /* 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")
diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c
index 1cd9bb6..ce684a0 100644
--- a/src/H5Dchunk.c
+++ b/src/H5Dchunk.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
@@ -364,6 +362,9 @@ H5FL_DEFINE(H5D_chunk_info_t);
 /* Declare a free list to manage the chunk sequence information */
 H5FL_BLK_DEFINE_STATIC(chunk);
 
+/* Declare extern free list to manage the H5S_sel_iter_t struct */
+H5FL_EXTERN(H5S_sel_iter_t);
+
 

 /*-------------------------------------------------------------------------
  * Function:	H5D__chunk_direct_write
@@ -519,7 +520,10 @@ H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims,
     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];
+        if(H5S_UNLIMITED == max_dims[u])
+            layout->max_chunks[u] = H5S_UNLIMITED;
+        else
+            layout->max_chunks[u] = ((max_dims[u] + layout->dim[u]) - 1) / layout->dim[u];
 
         /* Accumulate the # of chunks */
 	layout->nchunks *= layout->chunks[u];
@@ -4554,14 +4558,14 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata, hbool_t new_unfilt_chunk)
     const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset's layout */
     unsigned    rank = udata->common.layout->ndims - 1; /* Dataset rank */
     const hsize_t *scaled = udata->common.scaled; /* Scaled chunk offset */
-    H5S_sel_iter_t chunk_iter;          /* Memory selection iteration info */
+    H5S_sel_iter_t *chunk_iter = NULL;  /* Memory selection iteration info */
+    hbool_t     chunk_iter_init = FALSE; /* Whether the chunk iterator has been initialized */
     hssize_t    sel_nelmts;             /* Number of elements in selection */
     hsize_t     count[H5O_LAYOUT_NDIMS]; /* Element count of hyperslab */
     size_t      chunk_size;             /*size of a chunk       */
     void        *chunk;	                /* The file chunk  */
     H5D_chunk_ud_t chk_udata;           /* User data for locking chunk */
     uint32_t    bytes_accessed;         /* Bytes accessed in chunk */
-    hbool_t     chunk_iter_init = FALSE; /* Whether the chunk iterator has been initialized */
     unsigned    u;                      /* Local index variable */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -4626,13 +4630,17 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata, hbool_t new_unfilt_chunk)
         if(H5D__fill_refill_vl(&udata->fb_info, (size_t)sel_nelmts, io_info->md_dxpl_id) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
 
+    /* Allocate the chunk selection iterator */
+    if(NULL == (chunk_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate chunk selection iterator")
+
     /* Create a selection iterator for scattering the elements to memory buffer */
-    if(H5S_select_iter_init(&chunk_iter, udata->chunk_space, layout->u.chunk.dim[rank]) < 0)
+    if(H5S_select_iter_init(chunk_iter, udata->chunk_space, layout->u.chunk.dim[rank]) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunk selection information")
     chunk_iter_init = TRUE;
 
     /* Scatter the data into memory */
-    if(H5D__scatter_mem(udata->fb_info.fill_buf, udata->chunk_space, &chunk_iter, (size_t)sel_nelmts, io_info->dxpl_cache, chunk/*out*/) < 0)
+    if(H5D__scatter_mem(udata->fb_info.fill_buf, udata->chunk_space, chunk_iter, (size_t)sel_nelmts, io_info->dxpl_cache, chunk/*out*/) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "scatter failed")
 
 
@@ -4647,8 +4655,10 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata, hbool_t new_unfilt_chunk)
 
 done:
     /* Release the selection iterator */
-    if(chunk_iter_init && H5S_SELECT_ITER_RELEASE(&chunk_iter) < 0)
+    if(chunk_iter_init && H5S_SELECT_ITER_RELEASE(chunk_iter) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(chunk_iter)
+        chunk_iter = H5FL_FREE(H5S_sel_iter_t, chunk_iter);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5D__chunk_prune_fill */
@@ -5534,7 +5544,7 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     } /* end if */
 
     udata_dst.chunk_idx = H5VM_array_offset_pre(udata_dst.common.layout->ndims - 1, 
-			    udata_dst.common.layout->down_chunks, udata_dst.common.scaled);
+			    udata_dst.common.layout->max_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.common.scaled) < 0)
@@ -6048,9 +6058,9 @@ H5D__chunk_stats(const H5D_t *dset, hbool_t headers)
 #endif
 
     if (headers) {
-        if (rdcc->nhits>0 || rdcc->nmisses>0) {
-            miss_rate = 100.0 * rdcc->nmisses /
-                    (rdcc->nhits + rdcc->nmisses);
+        if (rdcc->stats.nhits>0 || rdcc->stats.nmisses>0) {
+            miss_rate = 100.0 * rdcc->stats.nmisses /
+                    (rdcc->stats.nhits + rdcc->stats.nmisses);
         } else {
             miss_rate = 0.0;
         }
@@ -6061,8 +6071,8 @@ H5D__chunk_stats(const H5D_t *dset, hbool_t headers)
         }
 
         fprintf(H5DEBUG(AC), "   %-18s %8u %8u %7s %8d+%-9ld\n",
-            "raw data chunks", rdcc->nhits, rdcc->nmisses, ascii,
-            rdcc->ninits, (long)(rdcc->nflushes)-(long)(rdcc->ninits));
+            "raw data chunks", rdcc->stats.nhits, rdcc->stats.nmisses, ascii,
+            rdcc->stats.ninits, (long)(rdcc->stats.nflushes)-(long)(rdcc->stats.ninits));
     }
 
 done:
@@ -6308,37 +6318,37 @@ H5D__chunk_file_alloc(const H5D_chk_idx_info_t *idx_info, const H5F_block_t *old
 
     /* 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;
+        switch(idx_info->storage->idx_type) {
+            case H5D_CHUNK_IDX_NONE:
+            {
+                H5D_chunk_ud_t udata;
 
-		udata.common.scaled = scaled;
+                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);
+                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_EARRAY:
             case H5D_CHUNK_IDX_FARRAY:
             case H5D_CHUNK_IDX_BT2:
-	    case H5D_CHUNK_IDX_BTREE:
-	    case H5D_CHUNK_IDX_SINGLE:
+            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")
+                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")
                 *need_insert = TRUE;
-		break;
+                break;
 
-	    case H5D_CHUNK_IDX_NTYPES:
-	    default:
-		HDassert(0 && "This should never be executed!");
-		break;
-	} /* end switch */
+            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));
@@ -6357,7 +6367,8 @@ done:
  * Return:      Success:        Non-negative
  *              Failure:        Negative
  *
- * Programmer:  Vailin Choi; Feb 2015
+ * Programmer:  Vailin Choi
+ *              Feb 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -6374,6 +6385,7 @@ H5D__chunk_format_convert_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 
     FUNC_ENTER_STATIC
 
+    /* Set up */
     new_idx_info = udata->new_idx_info;
     H5_CHECKED_ASSIGN(nbytes, size_t, chunk_rec->nbytes, uint32_t);
     chunk_addr = chunk_rec->chunk_addr;
@@ -6397,16 +6409,15 @@ H5D__chunk_format_convert_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 	    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, H5AC_rawdata_dxpl_id, buf) < 0)
+        if(H5F_block_read(new_idx_info->f, H5FD_MEM_DRAW, chunk_addr, read_size, H5AC_rawdata_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)
+	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 */
+        /* 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 */
@@ -6417,10 +6428,9 @@ H5D__chunk_format_convert_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 	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, 
-               H5AC_rawdata_dxpl_id, buf) < 0)
+	if(H5F_block_write(new_idx_info->f, H5FD_MEM_DRAW, chunk_addr, nbytes, H5AC_rawdata_dxpl_id, buf) < 0)
 	    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, H5_ITER_ERROR, "unable to write raw data to file")
-    }
+    } /* end if */
 
     /* Set up chunk information for insertion to chunk index */
     insert_udata.chunk_block.offset = chunk_addr;
@@ -6450,7 +6460,8 @@ done:
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Vailin Choi; Feb 2015
+ * Programmer:  Vailin Choi
+ *              Feb 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -6471,10 +6482,10 @@ H5D__chunk_format_convert(H5D_t *dset, H5D_chk_idx_info_t *idx_info, H5D_chk_idx
     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)
+    if((idx_info->storage->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 224a1d1..2578975 100644
--- a/src/H5Dcompact.c
+++ b/src/H5Dcompact.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c
index 9d73357..0ee4d28 100644
--- a/src/H5Dcontig.c
+++ b/src/H5Dcontig.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -364,9 +362,8 @@ 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(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")
+    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)
diff --git a/src/H5Ddbg.c b/src/H5Ddbg.c
index a6c130e..b1efb20 100644
--- a/src/H5Ddbg.c
+++ b/src/H5Ddbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5Ddeprec.c b/src/H5Ddeprec.c
index c6a03c2..8d9461c 100644
--- a/src/H5Ddeprec.c
+++ b/src/H5Ddeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Dearray.c b/src/H5Dearray.c
index 3896172..1df0a58 100644
--- a/src/H5Dearray.c
+++ b/src/H5Dearray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
@@ -659,7 +657,7 @@ H5D__earray_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get layout info")
 
     /* close the object header */
-    if(H5O_close(&obj_loc) < 0)
+    if(H5O_close(&obj_loc, NULL) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
 
     /* Create user data */
@@ -678,7 +676,7 @@ done:
 
         /* Close object header */
         if(obj_opened) {
-            if(H5O_close(&obj_loc) < 0)
+            if(H5O_close(&obj_loc, NULL) < 0)
                 HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
         } /* end if */
     } /* end if */
@@ -734,8 +732,9 @@ H5D__earray_dst_dbg_context(void *_dbg_ctx)
 static herr_t
 H5D__earray_idx_depend(const H5D_chk_idx_info_t *idx_info)
 {
+    H5O_t *oh = NULL;                   /* Object header */
     H5O_loc_t oloc;                     /* Temporary object header location for dataset */
-    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    H5AC_proxy_entry_t *oh_proxy;       /* Dataset's object header proxy */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -757,18 +756,22 @@ H5D__earray_idx_depend(const H5D_chk_idx_info_t *idx_info)
     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")
+    /* Get header */
+    if(NULL == (oh = H5O_protect(&oloc, idx_info->dxpl_id, H5AC__READ_ONLY_FLAG, TRUE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Retrieve the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_get_proxy(oh)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get 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")
+    if(H5EA_depend(idx_info->storage->u.earray.ea, idx_info->dxpl_id, oh_proxy) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header proxy")
 
 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")
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(&oloc, idx_info->dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__earray_idx_depend() */
@@ -1132,11 +1135,11 @@ H5D__earray_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *uda
         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);
+        idx = H5VM_chunk_index(ndims, swizzled_coords, idx_info->layout->u.earray.swizzled_dim, idx_info->layout->u.earray.swizzled_max_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);
+        idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->max_down_chunks, udata->common.scaled);
     } /* end else */
 
     udata->chunk_idx = idx;
@@ -1197,7 +1200,8 @@ H5D__earray_idx_resize(H5O_layout_chunk_t *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 */
+        hsize_t swizzled_chunks[H5O_LAYOUT_NDIMS];      /* Swizzled form of # of chunks in each dimension */
+        hsize_t swizzled_max_chunks[H5O_LAYOUT_NDIMS];  /* Swizzled form of max # 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]));
@@ -1210,12 +1214,21 @@ H5D__earray_idx_resize(H5O_layout_chunk_t *layout)
         /* 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")
+
+        /* Get the swizzled max number of chunks in each dimension */
+        HDmemcpy(swizzled_max_chunks, layout->max_chunks, (layout->ndims - 1) * sizeof(swizzled_max_chunks[0]));
+        H5VM_swizzle_coords(hsize_t, swizzled_max_chunks, layout->u.earray.unlim_dim);
+
+        /* Get the swizzled max "down" sizes for each dimension */
+        if(H5VM_array_down((layout->ndims - 1), swizzled_max_chunks, layout->u.earray.swizzled_max_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
  *
@@ -1262,7 +1275,7 @@ H5D__earray_idx_iterate_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *
         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]) {
+        if(udata->chunk_rec.scaled[curr_dim] >= udata->common.layout->max_chunks[curr_dim]) {
             /* Reset coordinate & move to next faster dimension */
             udata->chunk_rec.scaled[curr_dim] = 0;
             curr_dim--;
@@ -1384,10 +1397,13 @@ H5D__earray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
     HDassert(udata);
 
     /* Check if the extensible array is open yet */
-    if(NULL == idx_info->storage->u.earray.ea)
+    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")
+    } else  /* Patch the top level file pointer contained in ea if needed */
+        if(H5EA_patch_file(idx_info->storage->u.earray.ea, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch earray file pointer")
 
     /* Set convenience pointer to extensible array structure */
     ea = idx_info->storage->u.earray.ea;
@@ -1405,11 +1421,11 @@ H5D__earray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
         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);
+        idx = H5VM_chunk_index(ndims, swizzled_coords, idx_info->layout->u.earray.swizzled_dim, idx_info->layout->u.earray.swizzled_max_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);
+        idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->max_down_chunks, udata->scaled);
     } /* end else */
 
     /* Check for filters on chunks */
@@ -1801,6 +1817,11 @@ H5D__earray_idx_dest(const H5D_chk_idx_info_t *idx_info)
 
     /* Check if the extensible array is open */
     if(idx_info->storage->u.earray.ea) {
+
+	/* Patch the top level file pointer contained in ea if needed */
+        if(H5EA_patch_file(idx_info->storage->u.earray.ea, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch earray file pointer")
+
         /* 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")
diff --git a/src/H5Defl.c b/src/H5Defl.c
index cf1b36c..5536ba3 100644
--- a/src/H5Defl.c
+++ b/src/H5Defl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -286,13 +284,13 @@ H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size
         HDassert(buf);
         if(u >= efl->nused)
             HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "read past logical end of file")
-        if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip))
+        if(H5F_OVERFLOW_HSIZET2OFFT((hsize_t)efl->slot[u].offset + skip))
             HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed")
         if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0)
             HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name")
         if((fd = HDopen(full_name, O_RDONLY, 0)) < 0)
             HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
-        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + (HDoff_t)skip), SEEK_SET) < 0)
             HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file")
 #ifndef NDEBUG
         tempto_read = MIN((size_t)(efl->slot[u].size-skip), (hsize_t)size);
@@ -378,7 +376,7 @@ H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t siz
         HDassert(buf);
         if(u >= efl->nused)
             HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "write past logical end of file")
-        if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip))
+        if(H5F_OVERFLOW_HSIZET2OFFT((hsize_t)efl->slot[u].offset + skip))
             HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed")
         if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0)
             HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name")
@@ -388,7 +386,7 @@ H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t siz
             else
                 HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
             } /* end if */
-        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+        if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + (HDoff_t)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);
diff --git a/src/H5Dfarray.c b/src/H5Dfarray.c
index e5541c7..d183a8c 100644
--- a/src/H5Dfarray.c
+++ b/src/H5Dfarray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
@@ -66,13 +64,11 @@ typedef struct H5D_farray_ctx_t {
     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 {
+/* User data for chunk callbacks */
+typedef struct H5D_farray_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;
+} H5D_farray_ud_t;
 
 /* Fixed Array callback info for iteration over chunks */
 typedef struct H5D_farray_it_ud_t {
@@ -97,7 +93,7 @@ typedef struct H5D_farray_filt_elmt_t {
 
 /* 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);
+static int H5D__farray_idx_delete_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata);
 
 /* Fixed array class callbacks for chunks w/o filters */
 static void *H5D__farray_crt_context(void *udata);
@@ -147,7 +143,7 @@ static herr_t H5D__farray_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_
 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 */
+/* Generic fixed 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);
 
@@ -501,7 +497,7 @@ H5D__farray_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get layout info")
 
     /* close the object header */
-    if(H5O_close(&obj_loc) < 0)
+    if(H5O_close(&obj_loc, NULL) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
 
     /* Create user data */
@@ -520,7 +516,7 @@ done:
 
         /* Close object header */
         if(obj_opened) {
-            if(H5O_close(&obj_loc) < 0)
+            if(H5O_close(&obj_loc, NULL) < 0)
                 HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
         } /* end if */
     } /* end if */
@@ -728,15 +724,17 @@ H5D__farray_filt_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
  * Return:	Success:	non-negative
  *		Failure:	negative
  *
- * Programmer:	Copied and modified from H5Dearrary.c
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5D__farray_idx_depend(const H5D_chk_idx_info_t *idx_info)
 {
+    H5O_t *oh = NULL;                   /* Object header */
     H5O_loc_t oloc;                     /* Temporary object header location for dataset */
-    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    H5AC_proxy_entry_t *oh_proxy;       /* Dataset's object header proxy */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -758,18 +756,22 @@ H5D__farray_idx_depend(const H5D_chk_idx_info_t *idx_info)
     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")
+    /* Get header */
+    if(NULL == (oh = H5O_protect(&oloc, idx_info->dxpl_id, H5AC__READ_ONLY_FLAG, TRUE)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+
+    /* Retrieve the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_get_proxy(oh)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get 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")
+    /* Make the fixed array a child flush dependency of the dataset's object header proxy */
+    if(H5FA_depend(idx_info->storage->u.farray.fa, idx_info->dxpl_id, oh_proxy) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header proxy")
 
 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")
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(&oloc, idx_info->dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__farray_idx_depend() */
@@ -1153,7 +1155,7 @@ H5D__farray_idx_iterate_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *
         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]) {
+        if(udata->chunk_rec.scaled[curr_dim] >= udata->common.layout->max_chunks[curr_dim]) {
             /* Reset coordinate & move to next faster dimension */
             udata->chunk_rec.scaled[curr_dim] = 0;
             curr_dim--;
@@ -1272,10 +1274,13 @@ H5D__farray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
     HDassert(udata);
 
     /* Check if the fixed array is open yet */
-    if(NULL == idx_info->storage->u.farray.fa)
+    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")
+    } else  /* Patch the top level file pointer contained in fa if needed */
+	if(H5FA_patch_file(idx_info->storage->u.farray.fa, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch fixed array file pointer")
 
     /* Set convenience pointer to fixed array structure */
     fa = idx_info->storage->u.farray.fa;
@@ -1291,11 +1296,13 @@ H5D__farray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
         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 */
+        /* Remove raw data chunk from file if not doing SWMR writes */
         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")
+        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;
@@ -1311,11 +1318,13 @@ H5D__farray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
         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 */
+        /* Remove raw data chunk from file if not doing SWMR writes */
         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")
+        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;
@@ -1342,35 +1351,23 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-H5D__farray_idx_delete_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *_udata)
+H5D__farray_idx_delete_cb(const H5D_chunk_rec_t *chunk_rec, 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 */
+    H5D_farray_ud_t *udata = (H5D_farray_ud_t *)_udata;         /* User data for callback */
     int ret_value = H5_ITER_CONT;       /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Sanity checks */
-    HDassert(_elmt);
+    HDassert(chunk_rec);
+    HDassert(H5F_addr_defined(chunk_rec->chunk_addr));
+    HDassert(chunk_rec->nbytes > 0);
     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)
+    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:
@@ -1408,37 +1405,16 @@ H5D__farray_idx_delete(const H5D_chk_idx_info_t *idx_info)
 
     /* 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_ud_t udata;      /* User data for callback */
         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")
+	/* Initialize user data for callback */
+	udata.f = idx_info->f;
+	udata.dxpl_id = idx_info->dxpl_id;
 
-        /* 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 */
+	/* Iterate over the chunk addresses in the fixed array, deleting each chunk */
+        if(H5D__farray_idx_iterate(idx_info, H5D__farray_idx_delete_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk addresses")
 
         /* Close fixed array */
         if(H5FA_close(idx_info->storage->u.farray.fa, idx_info->dxpl_id) < 0)
@@ -1694,6 +1670,11 @@ H5D__farray_idx_dest(const H5D_chk_idx_info_t *idx_info)
 
     /* Check if the fixed array is open */
     if(idx_info->storage->u.farray.fa) {
+
+	/* Patch the top level file pointer contained in fa if needed */
+	if(H5FA_patch_file(idx_info->storage->u.farray.fa, idx_info->f) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch fixed array file pointer")
+
         /* 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")
diff --git a/src/H5Dfill.c b/src/H5Dfill.c
index e5b2161..922ac98 100644
--- a/src/H5Dfill.c
+++ b/src/H5Dfill.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -88,6 +86,9 @@ H5FL_BLK_DEFINE_STATIC(non_zero_fill);
 /* Declare the free list to manage blocks of zero fill-value data */
 H5FL_BLK_DEFINE_STATIC(zero_fill);
 
+/* Declare extern free list to manage the H5S_sel_iter_t struct */
+H5FL_EXTERN(H5S_sel_iter_t);
+
 

 /*--------------------------------------------------------------------------
  NAME
@@ -174,6 +175,8 @@ herr_t
 H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
           const H5T_t *buf_type, const H5S_t *space, hid_t dxpl_id)
 {
+    H5S_sel_iter_t *mem_iter = NULL; /* Memory selection iteration info */
+    hbool_t mem_iter_init = FALSE; /* Whether the memory selection iterator has been initialized */
     H5WB_t  *elem_wb = NULL;    /* Wrapped buffer for element data */
     uint8_t elem_buf[H5T_ELEM_BUF_SIZE]; /* Buffer for element data */
     H5WB_t  *bkg_elem_wb = NULL;     /* Wrapped buffer for background data */
@@ -246,7 +249,6 @@ H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
         if(TRUE == H5T_detect_class(fill_type, H5T_VLEN, FALSE)) {
             H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
             H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
-            H5S_sel_iter_t mem_iter;            /* Memory selection iteration info */
             hssize_t nelmts;                    /* Number of data elements */
 
             /* Get the number of elements in the selection */
@@ -273,19 +275,18 @@ H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
             if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
+            /* Allocate the chunk selection iterator */
+            if(NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory selection iterator")
+
             /* Create a selection iterator for scattering the elements to memory buffer */
-            if(H5S_select_iter_init(&mem_iter, space, dst_type_size) < 0)
+            if(H5S_select_iter_init(mem_iter, space, dst_type_size) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
+            mem_iter_init = TRUE;
 
             /* Scatter the data into memory */
-            if(H5D__scatter_mem(tmp_buf, space, &mem_iter, (size_t)nelmts, dxpl_cache, buf/*out*/) < 0) {
-                H5S_SELECT_ITER_RELEASE(&mem_iter);
+            if(H5D__scatter_mem(tmp_buf, space, mem_iter, (size_t)nelmts, dxpl_cache, buf/*out*/) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "scatter failed")
-            } /* end if */
-
-            /* Release the selection iterator */
-            if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
         } /* end if */
         else {
             const uint8_t *fill_buf;          /* Buffer to use for writing fill values */
@@ -335,6 +336,10 @@ H5D__fill(const void *fill, const H5T_t *fill_type, void *buf,
     } /* end else */
 
 done:
+    if(mem_iter_init && H5S_SELECT_ITER_RELEASE(mem_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(mem_iter)
+        mem_iter = H5FL_FREE(H5S_sel_iter_t, mem_iter);
     if(src_id != (-1) && H5I_dec_ref(src_id) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement temporary datatype ID")
     if(dst_id != (-1) && H5I_dec_ref(dst_id) < 0)
diff --git a/src/H5Dint.c b/src/H5Dint.c
index 9359311..1813ca6 100644
--- a/src/H5Dint.c
+++ b/src/H5Dint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -61,8 +59,6 @@ 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_build_extfile_prefix(const H5D_t *dset, hid_t dapl_id,
@@ -685,6 +681,11 @@ H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id, const H5T_t *type)
         if((dset->shared->type = H5T_copy(type, H5T_COPY_ALL)) == NULL)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy datatype")
 
+	/* Convert a datatype (if committed) to a transient type if the committed datatype's file
+	   location is different from the file location where the dataset will be created */
+        if(H5T_convert_committed_datatype(dset->shared->type, file) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get shared datatype info")
+
         /* Mark any datatypes as being on disk now */
         if(H5T_set_loc(dset->shared->type, file, H5T_LOC_DISK) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't set datatype location")
@@ -805,105 +806,6 @@ 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
@@ -1078,10 +980,6 @@ H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
         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)
@@ -1360,8 +1258,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;
 
+    /* Set up append flush parameters for the dataset */
     if(H5D__append_flush_setup(new_dset, dapl_id) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "unable to set up flush append property")
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to set up flush append property")
 
     /* Set the external file prefix */
     if(H5D_build_extfile_prefix(new_dset, dapl_id, &new_dset->shared->extfile_prefix) < 0)
@@ -1402,7 +1301,7 @@ done:
             if(H5F_addr_defined(new_dset->oloc.addr)) {
                 if(H5O_dec_rc_by_loc(&(new_dset->oloc), dxpl_id) < 0)
                     HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL, "unable to decrement refcount on newly created object")
-                if(H5O_close(&(new_dset->oloc)) < 0)
+                if(H5O_close(&(new_dset->oloc), NULL) < 0)
                     HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release object header")
                 if(file) {
                     if(H5O_delete(file, dxpl_id, new_dset->oloc.addr) < 0)
@@ -1611,11 +1510,12 @@ done:
  *-------------------------------------------------------------------------
  * Function:	H5D__flush_append_setup
  *
- * Purpose:	
+ * Purpose:	Set the append flush parameters for a dataset
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	
+ * Programmer:	Vailin Choi
+ *		Wednesday, January 8, 2014
  *
  *-------------------------------------------------------------------------
  */
@@ -1624,18 +1524,16 @@ H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id)
 {
     herr_t ret_value = SUCCEED;         /* return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
-    /* check args */
+    /* 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));
+    HDmemset(&dset->shared->append_flush,  0, sizeof(dset->shared->append_flush));
 
+    /* If the dataset is chunked and there is a non-default DAPL */
     if(dapl_id != H5P_DATASET_ACCESS_DEFAULT && dset->shared->layout.type == H5D_CHUNKED) {
         H5P_genplist_t *dapl;               /* data access property list object pointer */
 
@@ -1650,7 +1548,7 @@ H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id)
 	    /* 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) {
+	    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 */
@@ -1659,26 +1557,26 @@ H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id)
 		/* 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++) {
+		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 */
+                /* At least one boundary dimension is not extendible */
+		if(u != info.ndims)
 		    HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "boundary dimension is not valid")
 
+                /* Copy append flush settings */
 		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 */
     } /* end if */
 
@@ -1753,7 +1651,7 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
 
     /* 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")
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, 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;
@@ -1836,13 +1734,9 @@ 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)
+        if(H5F_addr_defined(dataset->oloc.addr) && H5O_close(&(dataset->oloc), NULL) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
         if(dataset->shared) {
 	    if(layout_init)
@@ -1884,9 +1778,10 @@ done:
 herr_t
 H5D_close(H5D_t *dataset)
 {
-    hbool_t free_failed = FALSE;
-    hbool_t corked;			/* Whether the dataset is corked or not */
-    herr_t ret_value = SUCCEED;      	/* Return value */
+    hbool_t free_failed = FALSE;    /* Set if freeing sub-components failed */
+    hbool_t corked;                 /* Whether the dataset is corked or not */
+    hbool_t file_closed = TRUE;     /* H5O_close also closed the file?      */
+    herr_t ret_value = SUCCEED;     /* Return value                         */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1901,6 +1796,7 @@ H5D_close(H5D_t *dataset)
 
     dataset->shared->fo_count--;
     if(dataset->shared->fo_count == 0) {
+
         /* Flush the dataset's information.  Continue to close even if it fails. */
         if(H5D__flush_real(dataset, H5AC_ind_read_dxpl_id) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
@@ -1995,18 +1891,13 @@ H5D_close(H5D_t *dataset)
                     (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_ind_read_dxpl_id) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to shut down SWMR access")
-        
+        /* 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")
+        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")
+
         /*
          * Release datatype, dataspace and creation property list -- there isn't
          * much we can do if one of these fails, so we just continue.
@@ -2023,9 +1914,17 @@ H5D_close(H5D_t *dataset)
 
         /* Close the dataset object */
         /* (This closes the file, if this is the last object open) */
-        if(H5O_close(&(dataset->oloc)) < 0)
+        if(H5O_close(&(dataset->oloc), &file_closed) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
 
+        /* Evict dataset metadata if evicting on close */
+        if(!file_closed && H5F_SHARED(dataset->oloc.file) && H5F_EVICT_ON_CLOSE(dataset->oloc.file)) {
+            if(H5AC_flush_tagged_metadata(dataset->oloc.file, dataset->oloc.addr, H5AC_ind_read_dxpl_id) < 0) 
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
+            if(H5AC_evict_tagged_metadata(dataset->oloc.file, dataset->oloc.addr, FALSE, H5AC_ind_read_dxpl_id) < 0) 
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to evict tagged metadata")
+        } /* end if */
+
         /*
          * Free memory.  Before freeing the memory set the file pointer to NULL.
          * We always check for a null file pointer in other H5D functions to be
@@ -2033,8 +1932,8 @@ H5D_close(H5D_t *dataset)
          * above).
          */
         dataset->oloc.file = NULL;
-
         dataset->shared = H5FL_FREE(H5D_shared_t, dataset->shared);
+
     } /* end if */
     else {
         /* Decrement the ref. count for this object in the top file */
@@ -2043,7 +1942,7 @@ H5D_close(H5D_t *dataset)
 
         /* Check reference count for this object in the top file */
         if(H5FO_top_count(dataset->oloc.file, dataset->oloc.addr) == 0) {
-            if(H5O_close(&(dataset->oloc)) < 0)
+            if(H5O_close(&(dataset->oloc), NULL) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to close")
         } /* end if */
         else
@@ -2052,16 +1951,16 @@ H5D_close(H5D_t *dataset)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
     } /* end else */
 
-   /* Release the dataset's path info */
-   if(H5G_name_free(&(dataset->path)) < 0)
-       free_failed = TRUE;
+    /* Release the dataset's path info */
+    if(H5G_name_free(&(dataset->path)) < 0)
+        free_failed = TRUE;
 
     /* Free the dataset's memory structure */
     dataset = H5FL_FREE(H5D_t, dataset);
 
     /* Check if anything failed in the middle... */
     if(free_failed)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "couldn't free a component of the dataset, but the dataset was freed anyway.")
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "couldn't free a component of the dataset, but the dataset was freed anyway.")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2076,7 +1975,8 @@ done:
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Vailin Choi; 12/24/15
+ * Programmer:	Vailin Choi
+ *		12/24/15
  *
  *-------------------------------------------------------------------------
  */
@@ -2126,12 +2026,10 @@ H5D_mult_refresh_close(hid_t dset_id, hid_t dxpl_id)
                 break;
 
             case H5D_COMPACT:
+            case H5D_VIRTUAL:
                 /* Nothing special to do (info freed in the layout destroy) */
                 break;
 
-            case H5D_VIRTUAL:
-		break;
-
             case H5D_LAYOUT_ERROR:
             case H5D_NLAYOUTS:
             default:
@@ -2143,8 +2041,7 @@ H5D_mult_refresh_close(hid_t dset_id, hid_t dxpl_id)
 
         /* 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")
-
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
     } /* end if */
 
 done:
@@ -2160,7 +2057,8 @@ done:
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Vailin Choi; 12/24/15
+ * Programmer:	Vailin Choi
+ *		12/24/15
  *
  *-------------------------------------------------------------------------
  */
@@ -2176,10 +2074,9 @@ H5D_mult_refresh_reopen(H5D_t *dataset, hid_t dxpl_id)
     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")
+	    HGOTO_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)))
@@ -2189,17 +2086,17 @@ H5D_mult_refresh_reopen(H5D_t *dataset, hid_t dxpl_id)
 	if(H5D__cache_dataspace_info(dataset) < 0)
 	    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't cache dataspace info")
     
+	/* Release layout info */
 	if(H5O_msg_reset(H5O_LAYOUT_ID, &dataset->shared->layout) < 0)
-	    HGOTO_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset layout info")
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "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")	
-    }
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5D_mult_refresh_reopen() */
 
 

@@ -3097,17 +2994,20 @@ done:
  * Return:	Success:	Non-negative
  *		Failure:	Negative
  *
- * Programmer:  Vailin Choi; Feb 2015
+ * 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 */
+    hbool_t init_new_index = FALSE;		/* Indicate that the new chunk index is initialized */
+    hbool_t delete_old_layout = FALSE;		/* Indicate that the old layout message is deleted */
+    hbool_t add_new_layout = FALSE;		/* Indicate that the new layout message is added */
     herr_t ret_value = SUCCEED;         	/* Return value */
 
     FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
@@ -3117,7 +3017,6 @@ H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
 
     switch(dataset->shared->layout.type) {
         case H5D_CHUNKED:
-	{
 	    HDassert(dataset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE);
 
 	    /* Set up the current index info */
@@ -3145,42 +3044,44 @@ H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
 	    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)
+	    if(new_idx_info.storage->ops->init && 
+              (new_idx_info.storage->ops->init)(&new_idx_info, dataset->shared->space, dataset->oloc.addr) < 0)
 		HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
-    
+	    init_new_index = TRUE;
+
 	    /* If the current chunk index exists */
-	    if(H5F_addr_defined(dataset->shared->layout.storage.u.chunk.idx_addr)) {
+	    if(H5F_addr_defined(idx_info.storage->idx_addr)) {
+
 		/* Create v1 B-tree chunk index */
-		if((newlayout.storage.u.chunk.ops->create)(&new_idx_info) < 0)
+		if((new_idx_info.storage->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")
+		    HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate/convert chunk index")
 	    } /* 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")
-
-	    /* Delete the "layout" message */
-	    if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, TRUE, dxpl_id) < 0)
+	    /* Delete the old "current" layout message */
+	    if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
 		HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
 
-	    HDmemcpy(&dataset->shared->layout, &newlayout, sizeof(H5O_layout_t));
-
-	    if(NULL == (oh = H5O_pin(&dataset->oloc, dxpl_id)))
-		HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+	    delete_old_layout = TRUE;
 
 	    /* 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")
+	    if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &newlayout, dxpl_id) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout header message")
+
+	    add_new_layout = TRUE;
+
+	    /* Release the old (current) chunk index */
+	    if(idx_info.storage->ops->dest && (idx_info.storage->ops->dest)(&idx_info) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+
+	    /* Copy the new layout to the dataset's layout */
+	    HDmemcpy(&dataset->shared->layout, &newlayout, sizeof(H5O_layout_t));
 
 	    break;
-	}
 
 	case H5D_CONTIGUOUS:
         case H5D_COMPACT:
@@ -3191,16 +3092,45 @@ H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
 	    break;
 
 	case H5D_VIRTUAL:
-	default:
-	    HDassert(0);
-            break;
-    }
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "virtual dataset layout not supported")
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
+
+	default: 
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
+    } /* end switch */
 
 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")
+    if(ret_value < 0 && dataset->shared->layout.type == H5D_CHUNKED) {
+	/* Remove new layout message */
+	if(add_new_layout)
+	    if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
+		HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
+
+	/* Add back old layout message */
+	if(delete_old_layout)
+	    if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &dataset->shared->layout, dxpl_id) < 0)
+		HDONE_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to add layout header message")
+
+	/* Clean up v1 b-tree chunk index */
+	if(init_new_index) {
+	    if(H5F_addr_defined(new_idx_info.storage->idx_addr)) {
+		/* Check for valid address i.e. tag */
+		if(!H5F_addr_defined(dataset->oloc.addr))
+		    HDONE_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "address undefined")
+
+		/* Expunge from cache all v1 B-tree type entries associated with tag */
+		if(H5AC_expunge_tag_type_metadata(dataset->oloc.file, dxpl_id, dataset->oloc.addr, H5AC_BT_ID, H5AC__NO_FLAGS_SET))
+		    HDONE_ERROR(H5E_DATASET, H5E_CANTEXPUNGE, FAIL, "unable to expunge index metadata")
+	    } /* end if */
+
+	    /* Delete v1 B-tree chunk index */
+	    if(new_idx_info.storage->ops->dest && (new_idx_info.storage->ops->dest)(&new_idx_info) < 0)
+		HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+	} /* end if */
+    } /* end if */
 
     FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__format_convert() */
@@ -3553,37 +3483,28 @@ H5D_get_access_plist(H5D_t *dset)
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Make a copy of the default dataset access property list */
-    if (NULL == (old_plist = (H5P_genplist_t *)H5I_object(H5P_LST_DATASET_ACCESS_ID_g)))
+    if(NULL == (old_plist = (H5P_genplist_t *)H5I_object(H5P_LST_DATASET_ACCESS_ID_g)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
-    if ((new_dapl_id = H5P_copy_plist(old_plist, TRUE)) < 0)
+    if((new_dapl_id = H5P_copy_plist(old_plist, TRUE)) < 0)
         HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "can't copy dataset access property list")
-    if (NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_dapl_id)))
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_dapl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
 
-    /* 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)
+    /* If the dataset is chunked then copy the rdcc & append flush parameters */
+    if(dset->shared->layout.type == H5D_CHUNKED) {
+        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)
+        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)
+        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)
+        if(H5P_set(new_plist, H5D_ACS_APPEND_FLUSH_NAME, &dset->shared->append_flush) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set append flush property")
     } /* end if */
 
-    /* Set the VDS view option */
+    /* Set the VDS view & printf gap options */
     if(H5P_set(new_plist, H5D_ACS_VDS_VIEW_NAME, &(dset->shared->layout.storage.u.virt.view)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set VDS view")
-
-    /* Set the VDS printf gap option */
     if(H5P_set(new_plist, H5D_ACS_VDS_PRINTF_GAP_NAME, &(dset->shared->layout.storage.u.virt.printf_gap)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set VDS printf gap")
 
@@ -3722,7 +3643,9 @@ H5D__refresh(hid_t dset_id, H5D_t *dset, hid_t dxpl_id)
 
     FUNC_ENTER_NOAPI_NOINIT
 
+    /* Sanity check */
     HDassert(dset);
+    HDassert(dset->shared);
 
     /* If the layout is virtual... */
     if(dset->shared->layout.type == H5D_VIRTUAL) {
@@ -3743,9 +3666,6 @@ H5D__refresh(hid_t dset_id, H5D_t *dset, hid_t dxpl_id)
 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")
diff --git a/src/H5Dio.c b/src/H5Dio.c
index de22fd1..dfd3f17 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -87,6 +85,9 @@ static herr_t H5D__typeinfo_term(const H5D_type_info_t *type_info);
 /* Declare a free list to manage blocks of type conversion data */
 H5FL_BLK_DEFINE(type_conv);
 
+/* Declare a free list to manage the H5D_chunk_map_t struct */
+H5FL_DEFINE(H5D_chunk_map_t);
+
 
 

 /*-------------------------------------------------------------------------
@@ -366,7 +367,7 @@ herr_t
 H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
 	 const H5S_t *file_space, hid_t dxpl_id, void *buf/*out*/)
 {
-    H5D_chunk_map_t fm;                 /* Chunk file<->memory mapping */
+    H5D_chunk_map_t *fm = NULL;         /* Chunk file<->memory mapping */
     H5D_io_info_t io_info;              /* Dataset I/O info     */
     H5D_type_info_t type_info;          /* Datatype info for operation */
     hbool_t type_info_init = FALSE;     /* Whether the datatype info has been initialized */
@@ -410,9 +411,6 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
-    /* Patch the top level file pointer for dt->shared->u.vlen.f if needed */
-    H5T_patch_vlen_file(dataset->shared->type, dataset->oloc.file);
-
     /* Set up datatype info for operation */
     if(H5D__typeinfo_init(dataset, dxpl_cache, dxpl_id, mem_type_id, FALSE, &type_info) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up type info")
@@ -526,26 +524,31 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
                 || dataset->shared->dcpl_cache.efl.nused > 0
                 || dataset->shared->layout.type == H5D_COMPACT);
 
+    /* Allocate the chunk map */
+    if(NULL == (fm = H5FL_CALLOC(H5D_chunk_map_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate chunk map")
+
     /* Call storage method's I/O initialization routine */
-    HDmemset(&fm, 0, sizeof(H5D_chunk_map_t));
-    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize I/O info")
     io_op_init = TRUE;
 
 #ifdef H5_HAVE_PARALLEL
     /* Adjust I/O info for any parallel I/O */
-    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, &fm) < 0)
+    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to adjust I/O info for parallel I/O")
 #endif /*H5_HAVE_PARALLEL*/
 
     /* Invoke correct "high level" I/O routine */
-    if((*io_info.io_ops.multi_read)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+    if((*io_info.io_ops.multi_read)(&io_info, &type_info, nelmts, file_space, mem_space, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
 
 done:
     /* Shut down the I/O op information */
-    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(&fm) < 0)
+    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(fm) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down I/O op info")
+    if(fm)
+        fm = H5FL_FREE(H5D_chunk_map_t, fm);
 
     if(io_info_init) {
 #ifdef H5_DEBUG_BUILD
@@ -590,7 +593,7 @@ 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)
 {
-    H5D_chunk_map_t fm;                 /* Chunk file<->memory mapping */
+    H5D_chunk_map_t *fm = NULL;         /* Chunk file<->memory mapping */
     H5D_io_info_t io_info;              /* Dataset I/O info     */
     H5D_type_info_t type_info;          /* Datatype info for operation */
     hbool_t type_info_init = FALSE;     /* Whether the datatype info has been initialized */
@@ -638,9 +641,6 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
-    /* Patch the top level file pointer for dt->shared->u.vlen.f if needed */
-    H5T_patch_vlen_file(dataset->shared->type, dataset->oloc.file);
-
     /* Set up datatype info for operation */
     if(H5D__typeinfo_init(dataset, dxpl_cache, dxpl_id, mem_type_id, TRUE, &type_info) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up type info")
@@ -766,25 +766,28 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
         else
             full_overwrite = (hbool_t)((hsize_t)file_nelmts == nelmts ? TRUE : FALSE);
 
- 	    /* Allocate storage */
+        /* Allocate storage */
         if(H5D__alloc_storage(&io_info, H5D_ALLOC_WRITE, full_overwrite, NULL) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
     } /* end if */
 
+    /* Allocate the chunk map */
+    if(NULL == (fm = H5FL_CALLOC(H5D_chunk_map_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate chunk map")
+
     /* Call storage method's I/O initialization routine */
-    HDmemset(&fm, 0, sizeof(H5D_chunk_map_t));
-    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+    if(io_info.layout_ops.io_init && (*io_info.layout_ops.io_init)(&io_info, &type_info, nelmts, file_space, mem_space, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize I/O info")
     io_op_init = TRUE;
 
 #ifdef H5_HAVE_PARALLEL
     /* Adjust I/O info for any parallel I/O */
-    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, &fm) < 0)
+    if(H5D__ioinfo_adjust(&io_info, dataset, dxpl_id, file_space, mem_space, &type_info, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to adjust I/O info for parallel I/O")
 #endif /*H5_HAVE_PARALLEL*/
 
     /* Invoke correct "high level" I/O routine */
-    if((*io_info.io_ops.multi_write)(&io_info, &type_info, nelmts, file_space, mem_space, &fm) < 0)
+    if((*io_info.io_ops.multi_write)(&io_info, &type_info, nelmts, file_space, mem_space, fm) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
 
 #ifdef OLD_WAY
@@ -807,8 +810,10 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
 
 done:
     /* Shut down the I/O op information */
-    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(&fm) < 0)
+    if(io_op_init && io_info.layout_ops.io_term && (*io_info.layout_ops.io_term)(fm) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down I/O op info")
+    if(fm)
+        fm = H5FL_FREE(H5D_chunk_map_t, fm);
 
     if(io_info_init) {
 #ifdef H5_DEBUG_BUILD
@@ -945,6 +950,10 @@ H5D__typeinfo_init(const H5D_t *dset, const H5D_dxpl_cache_t *dxpl_cache,
     HDassert(type_info);
     HDassert(dset);
 
+    /* Patch the top level file pointer for dt->shared->u.vlen.f if needed */
+    if(H5T_patch_vlen_file(dset->shared->type, dset->oloc.file) < 0 )
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't patch VL datatype file pointer")
+
     /* Initialize type info safely */
     HDmemset(type_info, 0, sizeof(*type_info));
 
diff --git a/src/H5Dlayout.c b/src/H5Dlayout.c
index 42b3098..c2fb5c2 100644
--- a/src/H5Dlayout.c
+++ b/src/H5Dlayout.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -421,7 +419,7 @@ H5D__layout_set_latest_indexing(H5O_layout_t *layout, const H5S_t *space,
                     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 */
+                else {
                     /* 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;
@@ -595,8 +593,6 @@ 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
diff --git a/src/H5Dmodule.h b/src/H5Dmodule.h
index 9b0c411..b259b69 100644
--- a/src/H5Dmodule.h
+++ b/src/H5Dmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c
index 441cc96..0389c72 100644
--- a/src/H5Dmpio.c
+++ b/src/H5Dmpio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Dnone.c b/src/H5Dnone.c
index 0cadac2..97ec5d6 100644
--- a/src/H5Dnone.c
+++ b/src/H5Dnone.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5Doh.c b/src/H5Doh.c
index 2836ef2..9abbdff 100644
--- a/src/H5Doh.c
+++ b/src/H5Doh.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -156,10 +154,6 @@ 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);
 
@@ -465,7 +459,7 @@ H5O__dset_flush(void *_obj_ptr, hid_t dxpl_id)
         HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
 
     if(H5D__flush_real(dset, dxpl_id) < 0)
-	HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
+        HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h
index 215f034..8a4711f 100644
--- a/src/H5Dpkg.h
+++ b/src/H5Dpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -459,8 +457,6 @@ typedef struct H5D_shared_t {
     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 */
@@ -478,8 +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_append_flush_t  append_flush;   /* Append flush property information */
     char                *extfile_prefix; /* expanded external file prefix */
 } H5D_shared_t;
 
@@ -567,7 +562,6 @@ H5_DLLVAR const H5B2_class_t H5D_BT2[1];
 H5_DLLVAR const H5B2_class_t H5D_BT2_FILT[1];
 
 
-
 /******************************/
 /* Package Private Prototypes */
 /******************************/
@@ -781,6 +775,7 @@ H5_DLL htri_t H5D__mpio_opt_possible(const H5D_io_info_t *io_info,
 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__layout_type_test(hid_t did, H5D_layout_t *layout_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 12a56f0..5d565bb 100644
--- a/src/H5Dprivate.h
+++ b/src/H5Dprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -150,7 +148,6 @@ 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) */
diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h
index 0bb232f..fe408b2 100644
--- a/src/H5Dpublic.h
+++ b/src/H5Dpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -60,13 +58,13 @@ typedef enum H5D_layout_t {
 
 /* Types of chunk index data structures */
 typedef enum H5D_chunk_index_t {
-    H5D_CHUNK_IDX_BTREE	= 0,	/* v1 B-tree index (default)                 */
+    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_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 */
diff --git a/src/H5Dscatgath.c b/src/H5Dscatgath.c
index 7c1abca..4625c7a 100644
--- a/src/H5Dscatgath.c
+++ b/src/H5Dscatgath.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -67,10 +65,13 @@ static herr_t H5D__compound_opt_write(size_t nelmts, const H5D_type_info_t *type
 /* Local Variables */
 /*******************/
 
-/* Declare a free list to manage sequences of size_t */
+/* Declare extern free list to manage the H5S_sel_iter_t struct */
+H5FL_EXTERN(H5S_sel_iter_t);
+
+/* Declare extern free list to manage sequences of size_t */
 H5FL_SEQ_EXTERN(size_t);
 
-/* Declare a free list to manage sequences of hsize_t */
+/* Declare extern free list to manage sequences of hsize_t */
 H5FL_SEQ_EXTERN(hsize_t);
 
 
@@ -97,17 +98,16 @@ H5D__scatter_file(const H5D_io_info_t *_io_info,
     const void *_buf)
 {
     H5D_io_info_t tmp_io_info;     /* Temporary I/O info object */
-    hsize_t _off[H5D_IO_VECTOR_SIZE];             /* Array to store sequence offsets */
     hsize_t *off = NULL;           /* Pointer to sequence offsets */
     hsize_t mem_off;               /* Offset in memory */
     size_t mem_curr_seq;           /* "Current sequence" in memory */
     size_t dset_curr_seq;          /* "Current sequence" in dataset */
-    size_t _len[H5D_IO_VECTOR_SIZE];              /* Array to store sequence lengths */
     size_t *len = NULL;            /* Array to store sequence lengths */
     size_t orig_mem_len, mem_len;  /* Length of sequence in memory */
-    size_t  nseq;                  /* Number of sequences generated */
-    size_t  nelem;                 /* Number of elements used in sequences */
-    herr_t  ret_value = SUCCEED;   /* Return value */
+    size_t nseq;                   /* Number of sequences generated */
+    size_t nelem;                  /* Number of elements used in sequences */
+    size_t vec_size;               /* Vector length */
+    herr_t ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -124,21 +124,19 @@ H5D__scatter_file(const H5D_io_info_t *_io_info,
     tmp_io_info.u.wbuf = _buf;
 
     /* Allocate the vector I/O arrays */
-    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, tmp_io_info.dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
-        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, tmp_io_info.dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        len = _len;
-        off = _off;
-    } /* end else */
+    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = tmp_io_info.dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O offset vector array")
 
     /* Loop until all elements are written */
     while(nelmts > 0) {
         /* Get list of sequences for selection to write */
-        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, tmp_io_info.dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, vec_size, nelmts, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
 
         /* Reset the current sequence information */
@@ -160,9 +158,9 @@ H5D__scatter_file(const H5D_io_info_t *_io_info,
 
 done:
     /* Release resources, if allocated */
-    if(len && len != _len)
+    if(len)
         len = H5FL_SEQ_FREE(size_t, len);
-    if(off && off != _off)
+    if(off)
         off = H5FL_SEQ_FREE(hsize_t, off);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -196,16 +194,15 @@ H5D__gather_file(const H5D_io_info_t *_io_info,
     void *_buf/*out*/)
 {
     H5D_io_info_t tmp_io_info;  /* Temporary I/O info object */
-    hsize_t _off[H5D_IO_VECTOR_SIZE];   /* Array to store sequence offsets */
     hsize_t *off = NULL;        /* Pointer to sequence offsets */
     hsize_t mem_off;            /* Offset in memory */
     size_t mem_curr_seq;        /* "Current sequence" in memory */
     size_t dset_curr_seq;       /* "Current sequence" in dataset */
-    size_t _len[H5D_IO_VECTOR_SIZE];    /* Array to store sequence lengths */
     size_t *len = NULL;         /* Pointer to sequence lengths */
     size_t orig_mem_len, mem_len;       /* Length of sequence in memory */
     size_t nseq;                /* Number of sequences generated */
     size_t nelem;               /* Number of elements used in sequences */
+    size_t vec_size;            /* Vector length */
     size_t ret_value = nelmts;  /* Return value */
 
     FUNC_ENTER_STATIC
@@ -225,21 +222,19 @@ H5D__gather_file(const H5D_io_info_t *_io_info,
     tmp_io_info.u.rbuf = _buf;
 
     /* Allocate the vector I/O arrays */
-    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, tmp_io_info.dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O length vector array")
-        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, tmp_io_info.dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        len = _len;
-        off = _off;
-    } /* end else */
+    if(tmp_io_info.dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = tmp_io_info.dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, 0, "can't allocate I/O length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, 0, "can't allocate I/O offset vector array")
 
     /* Loop until all elements are read */
     while(nelmts > 0) {
         /* Get list of sequences for selection to read */
-        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, tmp_io_info.dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, H5S_GET_SEQ_LIST_SORTED, iter, vec_size, nelmts, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
 
         /* Reset the current sequence information */
@@ -261,9 +256,9 @@ H5D__gather_file(const H5D_io_info_t *_io_info,
 
 done:
     /* Release resources, if allocated */
-    if(len && len != _len)
+    if(len)
         len = H5FL_SEQ_FREE(size_t, len);
-    if(off && off != _off)
+    if(off)
         off = H5FL_SEQ_FREE(hsize_t, off);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -292,15 +287,14 @@ H5D__scatter_mem (const void *_tscat_buf, const H5S_t *space,
 {
     uint8_t *buf = (uint8_t *)_buf;   /* Get local copies for address arithmetic */
     const uint8_t *tscat_buf = (const uint8_t *)_tscat_buf;
-    hsize_t _off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
-    hsize_t *off = NULL;          /* Pointer to sequence offsets */
-    size_t _len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
-    size_t *len = NULL;           /* Pointer to sequence lengths */
+    hsize_t *off = NULL;        /* Pointer to sequence offsets */
+    size_t *len = NULL;         /* Pointer to sequence lengths */
     size_t curr_len;            /* Length of bytes left to process in sequence */
     size_t nseq;                /* Number of sequences generated */
     size_t curr_seq;            /* Current sequence being processed */
     size_t nelem;               /* Number of elements used in sequences */
-    herr_t ret_value = SUCCEED;   /* Number of elements scattered */
+    size_t vec_size;            /* Vector length */
+    herr_t ret_value = SUCCEED; /* Number of elements scattered */
 
     FUNC_ENTER_PACKAGE
 
@@ -312,21 +306,19 @@ H5D__scatter_mem (const void *_tscat_buf, const H5S_t *space,
     HDassert(buf);
 
     /* Allocate the vector I/O arrays */
-    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
-        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        len = _len;
-        off = _off;
-    } /* end else */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O offset vector array")
 
     /* Loop until all elements are written */
     while(nelmts > 0) {
         /* Get list of sequences for selection to write */
-        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, vec_size, nelmts, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR (H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
 
         /* Loop, while sequences left to process */
@@ -346,9 +338,9 @@ H5D__scatter_mem (const void *_tscat_buf, const H5S_t *space,
 
 done:
     /* Release resources, if allocated */
-    if(len && len != _len)
+    if(len)
         len = H5FL_SEQ_FREE(size_t, len);
-    if(off && off != _off)
+    if(off)
         off = H5FL_SEQ_FREE(hsize_t, off);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -379,15 +371,14 @@ H5D__gather_mem(const void *_buf, const H5S_t *space,
 {
     const uint8_t *buf = (const uint8_t *)_buf;   /* Get local copies for address arithmetic */
     uint8_t *tgath_buf = (uint8_t *)_tgath_buf;
-    hsize_t _off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
     hsize_t *off = NULL;          /* Pointer to sequence offsets */
-    size_t _len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
-    size_t *len = NULL;           /* Pointer to sequence lengths */
+    size_t *len = NULL;         /* Pointer to sequence lengths */
     size_t curr_len;            /* Length of bytes left to process in sequence */
     size_t nseq;                /* Number of sequences generated */
     size_t curr_seq;            /* Current sequence being processed */
     size_t nelem;               /* Number of elements used in sequences */
-    size_t ret_value = nelmts;    /* Number of elements gathered */
+    size_t vec_size;            /* Vector length */
+    size_t ret_value = nelmts;  /* Number of elements gathered */
 
     FUNC_ENTER_STATIC
 
@@ -399,21 +390,19 @@ H5D__gather_mem(const void *_buf, const H5S_t *space,
     HDassert(tgath_buf);
 
     /* Allocate the vector I/O arrays */
-    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O length vector array")
-        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        len = _len;
-        off = _off;
-    } /* end else */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, 0, "can't allocate I/O length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, 0, "can't allocate I/O offset vector array")
 
     /* Loop until all elements are written */
     while(nelmts > 0) {
         /* Get list of sequences for selection to write */
-        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, vec_size, nelmts, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR (H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
 
         /* Loop, while sequences left to process */
@@ -433,9 +422,9 @@ H5D__gather_mem(const void *_buf, const H5S_t *space,
 
 done:
     /* Release resources, if allocated */
-    if(len && len != _len)
+    if(len)
         len = H5FL_SEQ_FREE(size_t, len);
-    if(off && off != _off)
+    if(off)
         off = H5FL_SEQ_FREE(hsize_t, off);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -460,15 +449,15 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
 {
     const H5D_dxpl_cache_t *dxpl_cache = io_info->dxpl_cache;     /* Local pointer to dataset transfer info */
     void        *buf = io_info->u.rbuf; /* Local pointer to application buffer */
-    H5S_sel_iter_t mem_iter;            /*memory selection iteration info*/
-    hbool_t	mem_iter_init = FALSE;	/*memory selection iteration info has been initialized */
-    H5S_sel_iter_t bkg_iter;            /*background iteration info*/
-    hbool_t	bkg_iter_init = FALSE;	/*background iteration info has been initialized */
-    H5S_sel_iter_t file_iter;           /*file selection iteration info*/
-    hbool_t	file_iter_init = FALSE;	/*file selection iteration info has been initialized */
-    hsize_t	smine_start;		/*strip mine start loc	*/
-    size_t	smine_nelmts;		/*elements per strip	*/
-    herr_t	ret_value = SUCCEED;	/*return value		*/
+    H5S_sel_iter_t *mem_iter = NULL;    /* Memory selection iteration info*/
+    hbool_t	mem_iter_init = FALSE;	/* Memory selection iteration info has been initialized */
+    H5S_sel_iter_t *bkg_iter = NULL;    /* Background iteration info*/
+    hbool_t	bkg_iter_init = FALSE;	/* Background iteration info has been initialized */
+    H5S_sel_iter_t *file_iter = NULL;   /* File selection iteration info*/
+    hbool_t	file_iter_init = FALSE;	/* File selection iteration info has been initialized */
+    hsize_t	smine_start;		/* Strip mine start loc	*/
+    size_t	smine_nelmts;		/* Elements per strip	*/
+    herr_t	ret_value = SUCCEED;	/* Return value		*/
 
     FUNC_ENTER_PACKAGE
 
@@ -483,14 +472,22 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
     if(nelmts == 0)
         HGOTO_DONE(SUCCEED)
 
+    /* Allocate the iterators */
+    if(NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory iterator")
+    if(NULL == (bkg_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate background iterator")
+    if(NULL == (file_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate file iterator")
+
     /* Figure out the strip mine size. */
-    if(H5S_select_iter_init(&file_iter, file_space, type_info->src_type_size) < 0)
+    if(H5S_select_iter_init(file_iter, file_space, type_info->src_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file selection information")
     file_iter_init = TRUE;	/*file selection iteration info has been initialized */
-    if(H5S_select_iter_init(&mem_iter, mem_space, type_info->dst_type_size) < 0)
+    if(H5S_select_iter_init(mem_iter, mem_space, type_info->dst_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
     mem_iter_init = TRUE;	/*file selection iteration info has been initialized */
-    if(H5S_select_iter_init(&bkg_iter, mem_space, type_info->dst_type_size) < 0)
+    if(H5S_select_iter_init(bkg_iter, mem_space, type_info->dst_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize background selection information")
     bkg_iter_init = TRUE;	/*file selection iteration info has been initialized */
 
@@ -499,7 +496,7 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
         size_t n;               /* Elements operated on */
 
         /* Go figure out how many elements to read from the file */
-        HDassert(H5S_SELECT_ITER_NELMTS(&file_iter) == (nelmts - smine_start));
+        HDassert(H5S_SELECT_ITER_NELMTS(file_iter) == (nelmts - smine_start));
         smine_nelmts = (size_t)MIN(type_info->request_nelmts, (nelmts - smine_start));
 
         /*
@@ -511,8 +508,7 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
 	/*
          * Gather data
          */
-        n = H5D__gather_file(io_info, file_space, &file_iter, smine_nelmts,
-                type_info->tconv_buf/*out*/);
+        n = H5D__gather_file(io_info, file_space, file_iter, smine_nelmts, type_info->tconv_buf/*out*/);
 	if(n != smine_nelmts)
             HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file gather failed")
 
@@ -521,14 +517,12 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
          * bypass the rest of steps.
          */
         if(type_info->cmpd_subset && H5T_SUBSET_FALSE != type_info->cmpd_subset->subset) {
-            if(H5D__compound_opt_read(smine_nelmts, mem_space, &mem_iter, dxpl_cache,
-                    type_info, buf /*out*/) < 0)
+            if(H5D__compound_opt_read(smine_nelmts, mem_space, mem_iter, dxpl_cache, type_info, buf /*out*/) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "datatype conversion failed")
         } /* end if */
         else {
             if(H5T_BKG_YES == type_info->need_bkg) {
-                n = H5D__gather_mem(buf, mem_space, &bkg_iter, smine_nelmts,
-                        dxpl_cache, type_info->bkg_buf/*out*/);
+                n = H5D__gather_mem(buf, mem_space, bkg_iter, smine_nelmts, dxpl_cache, type_info->bkg_buf/*out*/);
                 if(n != smine_nelmts)
                     HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "mem gather failed")
             } /* end if */
@@ -549,26 +543,25 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
             /*
              * Scatter the data into memory.
              */
-            if(H5D__scatter_mem(type_info->tconv_buf, mem_space, &mem_iter,
-                    smine_nelmts, dxpl_cache, buf/*out*/) < 0)
+            if(H5D__scatter_mem(type_info->tconv_buf, mem_space, mem_iter, smine_nelmts, dxpl_cache, buf/*out*/) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "scatter failed")
         } /* end else */
     } /* end for */
 
 done:
     /* Release selection iterators */
-    if(file_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
-    if(mem_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
-    if(bkg_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&bkg_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
+    if(file_iter_init && H5S_SELECT_ITER_RELEASE(file_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(file_iter)
+        file_iter = H5FL_FREE(H5S_sel_iter_t, file_iter);
+    if(mem_iter_init && H5S_SELECT_ITER_RELEASE(mem_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(mem_iter)
+        mem_iter = H5FL_FREE(H5S_sel_iter_t, mem_iter);
+    if(bkg_iter_init && H5S_SELECT_ITER_RELEASE(bkg_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(bkg_iter)
+        bkg_iter = H5FL_FREE(H5S_sel_iter_t, bkg_iter);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__scatgath_read() */
@@ -592,15 +585,15 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
 {
     const H5D_dxpl_cache_t *dxpl_cache = io_info->dxpl_cache;     /* Local pointer to dataset transfer info */
     const void  *buf = io_info->u.wbuf; /* Local pointer to application buffer */
-    H5S_sel_iter_t mem_iter;            /*memory selection iteration info*/
-    hbool_t	mem_iter_init = FALSE;	/*memory selection iteration info has been initialized */
-    H5S_sel_iter_t bkg_iter;            /*background iteration info*/
-    hbool_t	bkg_iter_init = FALSE;	/*background iteration info has been initialized */
-    H5S_sel_iter_t file_iter;           /*file selection iteration info*/
-    hbool_t	file_iter_init = FALSE;	/*file selection iteration info has been initialized */
-    hsize_t	smine_start;		/*strip mine start loc	*/
-    size_t	smine_nelmts;		/*elements per strip	*/
-    herr_t	ret_value = SUCCEED;	/*return value		*/
+    H5S_sel_iter_t *mem_iter = NULL;    /* Memory selection iteration info*/
+    hbool_t	mem_iter_init = FALSE;	/* Memory selection iteration info has been initialized */
+    H5S_sel_iter_t *bkg_iter = NULL;    /* Background iteration info*/
+    hbool_t	bkg_iter_init = FALSE;	/* Background iteration info has been initialized */
+    H5S_sel_iter_t *file_iter = NULL;   /* File selection iteration info*/
+    hbool_t	file_iter_init = FALSE;	/* File selection iteration info has been initialized */
+    hsize_t	smine_start;		/* Strip mine start loc	*/
+    size_t	smine_nelmts;		/* Elements per strip	*/
+    herr_t	ret_value = SUCCEED;	/* Return value		*/
 
     FUNC_ENTER_PACKAGE
 
@@ -615,14 +608,22 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
     if(nelmts == 0)
         HGOTO_DONE(SUCCEED)
 
+    /* Allocate the iterators */
+    if(NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory iterator")
+    if(NULL == (bkg_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate background iterator")
+    if(NULL == (file_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate file iterator")
+
     /* Figure out the strip mine size. */
-    if(H5S_select_iter_init(&file_iter, file_space, type_info->dst_type_size) < 0)
+    if(H5S_select_iter_init(file_iter, file_space, type_info->dst_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file selection information")
     file_iter_init = TRUE;	/*file selection iteration info has been initialized */
-    if(H5S_select_iter_init(&mem_iter, mem_space, type_info->src_type_size) < 0)
+    if(H5S_select_iter_init(mem_iter, mem_space, type_info->src_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize memory selection information")
     mem_iter_init = TRUE;	/*file selection iteration info has been initialized */
-    if(H5S_select_iter_init(&bkg_iter, file_space, type_info->dst_type_size) < 0)
+    if(H5S_select_iter_init(bkg_iter, file_space, type_info->dst_type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize background selection information")
     bkg_iter_init = TRUE;	/*file selection iteration info has been initialized */
 
@@ -631,7 +632,7 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
         size_t n;               /* Elements operated on */
 
         /* Go figure out how many elements to read from the file */
-        HDassert(H5S_SELECT_ITER_NELMTS(&file_iter) == (nelmts - smine_start));
+        HDassert(H5S_SELECT_ITER_NELMTS(file_iter) == (nelmts - smine_start));
         smine_nelmts = (size_t)MIN(type_info->request_nelmts, (nelmts - smine_start));
 
         /*
@@ -639,8 +640,7 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
          * buffer. Also gather data from the file into the background buffer
          * if necessary.
          */
-        n = H5D__gather_mem(buf, mem_space, &mem_iter, smine_nelmts,
-                dxpl_cache, type_info->tconv_buf/*out*/);
+        n = H5D__gather_mem(buf, mem_space, mem_iter, smine_nelmts, dxpl_cache, type_info->tconv_buf/*out*/);
         if(n != smine_nelmts)
             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "mem gather failed")
 
@@ -657,8 +657,7 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
         } /* end if */
         else {
             if(H5T_BKG_YES == type_info->need_bkg) {
-                n = H5D__gather_file(io_info, file_space, &bkg_iter, smine_nelmts,
-                        type_info->bkg_buf/*out*/);
+                n = H5D__gather_file(io_info, file_space, bkg_iter, smine_nelmts, type_info->bkg_buf/*out*/);
                 if(n != smine_nelmts)
                     HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file gather failed")
             } /* end if */
@@ -681,25 +680,24 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_type_info_t *type_in
         /*
          * Scatter the data out to the file.
          */
-        if(H5D__scatter_file(io_info, file_space, &file_iter, smine_nelmts,
-                type_info->tconv_buf) < 0)
+        if(H5D__scatter_file(io_info, file_space, file_iter, smine_nelmts, type_info->tconv_buf) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "scatter failed")
     } /* end for */
 
 done:
     /* Release selection iterators */
-    if(file_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
-    if(mem_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
-    if(bkg_iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&bkg_iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
+    if(file_iter_init && H5S_SELECT_ITER_RELEASE(file_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(file_iter)
+        file_iter = H5FL_FREE(H5S_sel_iter_t, file_iter);
+    if(mem_iter_init && H5S_SELECT_ITER_RELEASE(mem_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(mem_iter)
+        mem_iter = H5FL_FREE(H5S_sel_iter_t, mem_iter);
+    if(bkg_iter_init && H5S_SELECT_ITER_RELEASE(bkg_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(bkg_iter)
+        bkg_iter = H5FL_FREE(H5S_sel_iter_t, bkg_iter);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__scatgath_write() */
@@ -744,12 +742,11 @@ H5D__compound_opt_read(size_t nelmts, const H5S_t *space,
 {
     uint8_t    *ubuf = (uint8_t *)user_buf;     /* Cast for pointer arithmetic	*/
     uint8_t    *xdbuf;                          /* Pointer into dataset buffer */
-    hsize_t    _off[H5D_IO_VECTOR_SIZE];        /* Array to store sequence offsets */
     hsize_t    *off = NULL;                     /* Pointer to sequence offsets */
-    size_t     _len[H5D_IO_VECTOR_SIZE];        /* Array to store sequence lengths */
     size_t     *len = NULL;                     /* Pointer to sequence lengths */
     size_t     src_stride, dst_stride, copy_size;
-    herr_t     ret_value = SUCCEED;	       /*return value		*/
+    size_t     vec_size;                        /* Vector length */
+    herr_t     ret_value = SUCCEED;	        /* Return value		*/
 
     FUNC_ENTER_STATIC
 
@@ -765,16 +762,14 @@ H5D__compound_opt_read(size_t nelmts, const H5S_t *space,
     HDassert(user_buf);
 
     /* Allocate the vector I/O arrays */
-    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (len = H5FL_SEQ_MALLOC(size_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
-        if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        len = _len;
-        off = _off;
-    } /* end else */
+    if(dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O offset vector array")
 
     /* Get source & destination strides */
     src_stride = type_info->src_type_size;
@@ -791,7 +786,7 @@ H5D__compound_opt_read(size_t nelmts, const H5S_t *space,
         size_t     elmtno;		/* Element counter */
 
         /* Get list of sequences for selection to write */
-        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, dxpl_cache->vec_size, nelmts, &nseq, &elmtno, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, vec_size, nelmts, &nseq, &elmtno, off, len) < 0)
             HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, 0, "sequence length generation failed")
 
         /* Loop, while sequences left to process */
@@ -827,9 +822,9 @@ H5D__compound_opt_read(size_t nelmts, const H5S_t *space,
 
 done:
     /* Release resources, if allocated */
-    if(len && len != _len)
+    if(len)
         len = H5FL_SEQ_FREE(size_t, len);
-    if(off && off != _off)
+    if(off)
         off = H5FL_SEQ_FREE(hsize_t, off);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -923,7 +918,7 @@ H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
 {
     H5T_t *type;                /* Datatype */
     H5S_t *dst_space;           /* Dataspace */
-    H5S_sel_iter_t iter;        /* Selection iteration info*/
+    H5S_sel_iter_t *iter = NULL; /* Selection iteration info*/
     hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
     const void *src_buf = NULL; /* Source (contiguous) data buffer */
     size_t src_buf_nbytes = 0;  /* Size of src_buf */
@@ -959,8 +954,12 @@ H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
     if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(dst_space)) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
 
+    /* Allocate the selection iterator */
+    if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+
     /* Initialize selection iterator */
-    if(H5S_select_iter_init(&iter, dst_space, type_size) < 0)
+    if(H5S_select_iter_init(iter, dst_space, type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize selection iterator information")
     iter_init = TRUE;
 
@@ -984,7 +983,7 @@ H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback returned more elements than in selection")
 
         /* Scatter data */
-        if(H5D__scatter_mem(src_buf, dst_space, &iter, nelmts_scatter, dxpl_cache, dst_buf) < 0)
+        if(H5D__scatter_mem(src_buf, dst_space, iter, nelmts_scatter, dxpl_cache, dst_buf) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "scatter failed")
 
         nelmts -= (hssize_t)nelmts_scatter;
@@ -992,10 +991,10 @@ H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
 
 done:
     /* Release selection iterator */
-    if(iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
+    if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(iter)
+        iter = H5FL_FREE(H5S_sel_iter_t, iter);
 
     FUNC_LEAVE_API(ret_value)
 }   /* H5Dscatter() */
@@ -1023,7 +1022,7 @@ H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
 {
     H5T_t *type;                /* Datatype */
     H5S_t *src_space;           /* Dataspace */
-    H5S_sel_iter_t iter;        /* Selection iteration info*/
+    H5S_sel_iter_t *iter = NULL; /* Selection iteration info*/
     hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
     size_t type_size;           /* Datatype element size */
     hssize_t nelmts;            /* Number of remaining elements in selection */
@@ -1071,15 +1070,19 @@ H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
     if(((size_t)nelmts > dst_buf_nelmts) && (op == NULL))
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback supplied and destination buffer too small")
 
+    /* Allocate the selection iterator */
+    if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+
     /* Initialize selection iterator */
-    if(H5S_select_iter_init(&iter, src_space, type_size) < 0)
+    if(H5S_select_iter_init(iter, src_space, type_size) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize selection iterator information")
     iter_init = TRUE;
 
     /* Loop until all data has been scattered */
     while(nelmts > 0) {
         /* Gather data */
-        if(0 == (nelmts_gathered = H5D__gather_mem(src_buf, src_space, &iter, MIN(dst_buf_nelmts, (size_t)nelmts), dxpl_cache, dst_buf)))
+        if(0 == (nelmts_gathered = H5D__gather_mem(src_buf, src_space, iter, MIN(dst_buf_nelmts, (size_t)nelmts), dxpl_cache, dst_buf)))
             HGOTO_ERROR(H5E_IO, H5E_CANTCOPY, FAIL, "gather failed")
         HDassert(nelmts_gathered == MIN(dst_buf_nelmts, (size_t)nelmts));
 
@@ -1093,10 +1096,10 @@ H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
 
 done:
     /* Release selection iterator */
-    if(iter_init) {
-        if(H5S_SELECT_ITER_RELEASE(&iter) < 0)
-            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
-    } /* end if */
+    if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release selection iterator")
+    if(iter)
+        iter = H5FL_FREE(H5S_sel_iter_t, iter);
 
     FUNC_LEAVE_API(ret_value)
 }   /* H5Dgather() */
diff --git a/src/H5Dselect.c b/src/H5Dselect.c
index 312beba..b4d0515 100644
--- a/src/H5Dselect.c
+++ b/src/H5Dselect.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.ued>
@@ -68,6 +66,9 @@ H5FL_SEQ_DEFINE(size_t);
 /* Declare a free list to manage sequences of hsize_t */
 H5FL_SEQ_DEFINE(hsize_t);
 
+/* Declare extern free list to manage the H5S_sel_iter_t struct */
+H5FL_EXTERN(H5S_sel_iter_t);
+
 
 

 /*-------------------------------------------------------------------------
@@ -86,22 +87,19 @@ static herr_t
 H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
     size_t nelmts, const H5S_t *file_space, const H5S_t *mem_space)
 {
-    H5S_sel_iter_t mem_iter;    /* Memory selection iteration info */
-    hbool_t mem_iter_init = 0;  /* Memory selection iteration info has been initialized */
-    H5S_sel_iter_t file_iter;   /* File selection iteration info */
-    hbool_t file_iter_init = 0;	/* File selection iteration info has been initialized */
-    hsize_t _mem_off[H5D_IO_VECTOR_SIZE];      /* Array to store sequence offsets in memory */
+    H5S_sel_iter_t *mem_iter = NULL; /* Memory selection iteration info */
+    hbool_t mem_iter_init = FALSE; /* Memory selection iteration info has been initialized */
+    H5S_sel_iter_t *file_iter = NULL; /* File selection iteration info */
+    hbool_t file_iter_init = FALSE; /* File selection iteration info has been initialized */
     hsize_t *mem_off = NULL;    /* Pointer to sequence offsets in memory */
-    hsize_t _file_off[H5D_IO_VECTOR_SIZE];     /* Array to store sequence offsets in the file */
     hsize_t *file_off = NULL;   /* Pointer to sequence offsets in the file */
-    size_t _mem_len[H5D_IO_VECTOR_SIZE];       /* Array to store sequence lengths in memory */
     size_t *mem_len = NULL;     /* Pointer to sequence lengths in memory */
-    size_t _file_len[H5D_IO_VECTOR_SIZE];      /* Array to store sequence lengths in the file */
     size_t *file_len = NULL;    /* Pointer to sequence lengths in the file */
     size_t curr_mem_seq;        /* Current memory sequence to operate on */
     size_t curr_file_seq;       /* Current file sequence to operate on */
     size_t mem_nseq;            /* Number of sequences generated in the file */
     size_t file_nseq;           /* Number of sequences generated in memory */
+    size_t vec_size;            /* Vector length */
     ssize_t tmp_file_len;       /* Temporary number of bytes in file sequence */
     herr_t ret_value = SUCCEED; /* Return value */
 
@@ -115,22 +113,18 @@ H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
     HDassert(io_info->u.rbuf);
 
     /* Allocate the vector I/O arrays */
-    if(io_info->dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE) {
-        if(NULL == (mem_len = H5FL_SEQ_MALLOC(size_t,io_info->dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
-        if(NULL == (mem_off = H5FL_SEQ_MALLOC(hsize_t,io_info->dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
-        if(NULL == (file_len = H5FL_SEQ_MALLOC(size_t,io_info->dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O length vector array")
-        if(NULL == (file_off = H5FL_SEQ_MALLOC(hsize_t,io_info->dxpl_cache->vec_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate I/O offset vector array")
-    } /* end if */
-    else {
-        mem_len = _mem_len;
-        mem_off = _mem_off;
-        file_len = _file_len;
-        file_off = _file_off;
-    } /* end else */
+    if(io_info->dxpl_cache->vec_size > H5D_IO_VECTOR_SIZE)
+        vec_size = io_info->dxpl_cache->vec_size;
+    else
+        vec_size = H5D_IO_VECTOR_SIZE;
+    if(NULL == (mem_len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O length vector array")
+    if(NULL == (mem_off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O offset vector array")
+    if(NULL == (file_len = H5FL_SEQ_MALLOC(size_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O length vector array")
+    if(NULL == (file_off = H5FL_SEQ_MALLOC(hsize_t, vec_size)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate I/O offset vector array")
 
     /* Check for only one element in selection */
     if(nelmts == 1) {
@@ -169,13 +163,19 @@ H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
         size_t mem_nelem;           /* Number of elements used in memory sequences */
         size_t file_nelem;          /* Number of elements used in file sequences */
 
+        /* Allocate the iterators */
+        if(NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory iterator")
+        if(NULL == (file_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate file iterator")
+
         /* Initialize file iterator */
-        if(H5S_select_iter_init(&file_iter, file_space, elmt_size) < 0)
+        if(H5S_select_iter_init(file_iter, file_space, elmt_size) < 0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
         file_iter_init = 1;	/* File selection iteration info has been initialized */
 
         /* Initialize memory iterator */
-        if(H5S_select_iter_init(&mem_iter, mem_space, elmt_size) < 0)
+        if(H5S_select_iter_init(mem_iter, mem_space, elmt_size) < 0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
         mem_iter_init = 1;	/* Memory selection iteration info has been initialized */
 
@@ -188,7 +188,7 @@ H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
             /* Check if more file sequences are needed */
             if(curr_file_seq >= file_nseq) {
                 /* Get sequences for file selection */
-                if(H5S_SELECT_GET_SEQ_LIST(file_space, H5S_GET_SEQ_LIST_SORTED, &file_iter, io_info->dxpl_cache->vec_size, nelmts, &file_nseq, &file_nelem, file_off, file_len) < 0)
+                if(H5S_SELECT_GET_SEQ_LIST(file_space, H5S_GET_SEQ_LIST_SORTED, file_iter, vec_size, nelmts, &file_nseq, &file_nelem, file_off, file_len) < 0)
                     HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
 
                 /* Start at the beginning of the sequences again */
@@ -198,7 +198,7 @@ H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
             /* Check if more memory sequences are needed */
             if(curr_mem_seq >= mem_nseq) {
                 /* Get sequences for memory selection */
-                if(H5S_SELECT_GET_SEQ_LIST(mem_space, 0, &mem_iter, io_info->dxpl_cache->vec_size, nelmts, &mem_nseq, &mem_nelem, mem_off, mem_len) < 0)
+                if(H5S_SELECT_GET_SEQ_LIST(mem_space, 0, mem_iter, vec_size, nelmts, &mem_nseq, &mem_nelem, mem_off, mem_len) < 0)
                     HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
 
                 /* Start at the beginning of the sequences again */
@@ -227,24 +227,24 @@ H5D__select_io(const H5D_io_info_t *io_info, size_t elmt_size,
     } /* end else */
 
 done:
-    /* Release file selection iterator */
-    if(file_iter_init)
-        if(H5S_SELECT_ITER_RELEASE(&file_iter) < 0)
-            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
-
-    /* Release memory selection iterator */
-    if(mem_iter_init)
-        if(H5S_SELECT_ITER_RELEASE(&mem_iter) < 0)
-            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    /* Release selection iterators */
+    if(file_iter_init && H5S_SELECT_ITER_RELEASE(file_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(file_iter)
+        file_iter = H5FL_FREE(H5S_sel_iter_t, file_iter);
+    if(mem_iter_init && H5S_SELECT_ITER_RELEASE(mem_iter) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(mem_iter)
+        mem_iter = H5FL_FREE(H5S_sel_iter_t, mem_iter);
 
     /* Release vector arrays, if allocated */
-    if(file_len && file_len != _file_len)
+    if(file_len)
         file_len = H5FL_SEQ_FREE(size_t, file_len);
-    if(file_off && file_off != _file_off)
+    if(file_off)
         file_off = H5FL_SEQ_FREE(hsize_t, file_off);
-    if(mem_len && mem_len != _mem_len)
+    if(mem_len)
         mem_len = H5FL_SEQ_FREE(size_t, mem_len);
-    if(mem_off && mem_off != _mem_off)
+    if(mem_off)
         mem_off = H5FL_SEQ_FREE(hsize_t, mem_off);
 
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Dsingle.c b/src/H5Dsingle.c
index 04b8971..e999449 100644
--- a/src/H5Dsingle.c
+++ b/src/H5Dsingle.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5Dtest.c b/src/H5Dtest.c
index c3b0b19..2fc71a0 100644
--- a/src/H5Dtest.c
+++ b/src/H5Dtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -144,6 +142,47 @@ done:
 

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

+/*--------------------------------------------------------------------------
+ NAME
     H5D__layout_idx_type_test
  PURPOSE
     Determine the storage layout index type for a dataset's layout information
diff --git a/src/H5Dvirtual.c b/src/H5Dvirtual.c
index 504dd68..3be2353 100644
--- a/src/H5Dvirtual.c
+++ b/src/H5Dvirtual.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -807,7 +805,7 @@ H5D__virtual_open_source_dset(const H5D_t *vdset,
 done:
     /* Close source file */
     if(src_file_open)
-        if(H5F_try_close(src_file) < 0)
+        if(H5F_try_close(src_file, NULL) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEFILE, FAIL, "can't close source file")
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2931,7 +2929,7 @@ H5D__virtual_release_source_dset_files(H5D_virtual_held_file_t *head)
          *      essentially "private" to the virtual dataset, since it wasn't
          *      opened through an API routine -QAK)
          */
-        if(H5F_try_close(head->file) < 0)
+        if(H5F_try_close(head->file, NULL) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
 
         /* Delete node */
diff --git a/src/H5E.c b/src/H5E.c
index efa83e4..741f0dd 100644
--- a/src/H5E.c
+++ b/src/H5E.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -367,8 +365,12 @@ H5E_get_stack(void)
     if(!estack) {
         /* No associated value with current thread - create one */
 #ifdef H5_HAVE_WIN_THREADS
-        estack = (H5E_t *)LocalAlloc(LPTR, sizeof(H5E_t)); /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
+        /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
+        estack = (H5E_t *)LocalAlloc(LPTR, sizeof(H5E_t)); 
 #else
+        /* Use HDmalloc here since this has to match the HDfree in the
+         * destructor and we want to avoid the codestack there.
+         */
         estack = (H5E_t *)HDmalloc(sizeof(H5E_t));
 #endif /* H5_HAVE_WIN_THREADS */
         HDassert(estack);
@@ -1418,6 +1420,9 @@ done:
     if(va_started)
         va_end(ap);
 #ifdef H5_HAVE_VASPRINTF
+    /* Memory was allocated with HDvasprintf so it needs to be freed
+     * with HDfree
+     */
     if(tmp)
         HDfree(tmp);
 #else /* H5_HAVE_VASPRINTF */
diff --git a/src/H5EA.c b/src/H5EA.c
index 6648bcf..c524d49 100644
--- a/src/H5EA.c
+++ b/src/H5EA.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -74,6 +72,13 @@ typedef herr_t (*H5EA__unprotect_func_t)(void *thing, hid_t dxpl_id,
 /* Local Prototypes */
 /********************/
 
+static herr_t
+H5EA__lookup_elmt(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, hbool_t will_extend,
+    unsigned thing_acc, void **thing, uint8_t **thing_elmt_buf,
+    hsize_t *thing_elmt_idx, H5EA__unprotect_func_t *thing_unprot_func);
+static H5EA_t *H5EA__new(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr,
+    hbool_t from_open, void *ctx_udata);
+
 
 /*********************/
 /* Package Variables */
@@ -111,53 +116,45 @@ H5FL_BLK_DEFINE(ea_native_elmt);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5EA_create
+ * Function:	H5EA__new
  *
- * Purpose:	Creates a new empty extensible array in the file.
+ * Purpose:	Allocate and initialize a new extensible array wrapper in memory
  *
- * Return:	Pointer to earray wrapper on success
+ * Return:	Pointer to earray wrapper success
  *              NULL on failure
  *
  * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jun 17 2008
+ *		koziol at lbl.gov
+ *		Oct 10 2016
  *
  *-------------------------------------------------------------------------
  */
-BEGIN_FUNC(PRIV, ERR,
+BEGIN_FUNC(STATIC, ERR,
 H5EA_t *, NULL, NULL,
-H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam, void *ctx_udata))
+H5EA__new(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, hbool_t from_open, 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")
+    HDassert(H5F_addr_defined(ea_addr));
 
     /* Allocate extensible array wrapper */
-    if(NULL == (ea = H5FL_MALLOC(H5EA_t)))
+    if(NULL == (ea = H5FL_CALLOC(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)))
+    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")
 
+    /* Check for pending array deletion */
+    if(from_open && hdr->pending_delete)
+        H5E_THROW(H5E_CANTOPENOBJ, "can't open extensible array pending deletion")
+
     /* Point extensible array wrapper at header and bump it's ref count */
     ea->hdr = hdr;
     if(H5EA__hdr_incr(ea->hdr) < 0)
@@ -181,6 +178,57 @@ CATCH
         if(ea && H5EA_close(ea, dxpl_id) < 0)
             H5E_THROW(H5E_CLOSEERROR, "unable to close extensible array")
 
+END_FUNC(STATIC)  /* end H5EA__new() */
+
+

+/*-------------------------------------------------------------------------
+ * 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 */
+    haddr_t ea_addr;            /* Array header address */
+
+    /*
+     * 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 and initialize new extensible array wrapper */
+    if(NULL == (ea = H5EA__new(f, dxpl_id, ea_addr, FALSE, ctx_udata)))
+	H5E_THROW(H5E_CANTINIT, "allocation and/or initialization failed for extensible array wrapper")
+
+    /* Set the return value */
+    ret_value = ea;
+
+CATCH
+
+    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() */
 
 

@@ -204,7 +252,6 @@ 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.
@@ -212,40 +259,15 @@ H5EA_open(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata))
     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;
+    /* Allocate and initialize new extensible array wrapper */
+    if(NULL == (ea = H5EA__new(f, dxpl_id, ea_addr, TRUE, ctx_udata)))
+	H5E_THROW(H5E_CANTINIT, "allocation and/or initialization failed for extensible array wrapper")
 
     /* 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")
@@ -272,10 +294,6 @@ H5EA_get_nelmts(const H5EA_t *ea, hsize_t *nelmts))
 
     /* Local variables */
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /*
      * Check arguments.
      */
@@ -307,10 +325,6 @@ H5EA_get_addr(const H5EA_t *ea, haddr_t *addr))
 
     /* Local variables */
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /*
      * Check arguments.
      */
@@ -325,7 +339,7 @@ END_FUNC(PRIV)  /* end H5EA_get_addr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5EA_lookup_elmt
+ * Function:	H5EA__lookup_elmt
  *
  * Purpose:	Retrieve the metadata object and the element buffer for a
  *              given element in the array.
@@ -340,9 +354,9 @@ END_FUNC(PRIV)  /* end H5EA_get_addr() */
  */
 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))
+H5EA__lookup_elmt(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, hbool_t will_extend,
+    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 */
@@ -355,11 +369,6 @@ H5EA__lookup_elmt(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, unsigned thing_a
     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.
      */
@@ -383,9 +392,6 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
 
     /* 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 */
@@ -397,9 +403,6 @@ HDfprintf(stderr, "%s: Index block address not defined!\n", FUNC, idx);
         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)))
@@ -420,26 +423,14 @@ HDfprintf(stderr, "%s: Index block address is: %a\n", FUNC, hdr->idx_blk_addr);
 
         /* 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 */
@@ -470,6 +461,13 @@ HDfprintf(stderr, "%s: dblk_idx = %u, iblock->ndblk_addrs = %Zu\n", FUNC, dblk_i
             /* Adjust index to offset in data block */
             elmt_idx %= hdr->sblk_info[sblk_idx].dblk_nelmts;
 
+            /* Check if there is already a dependency on the header */
+            if(will_extend && !dblock->has_hdr_depend) {
+                if(H5EA__create_flush_depend((H5AC_info_t *)hdr, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block and header, index = %llu", (unsigned long long)idx)
+                dblock->has_hdr_depend = TRUE;
+            } /* end if */
+
             /* Set 'thing' info to refer to the data block */
             *thing = dblock;
             *thing_elmt_buf = (uint8_t *)dblock->elmts;
@@ -490,9 +488,6 @@ HDfprintf(stderr, "%s: dblk_idx = %u, iblock->ndblk_addrs = %Zu\n", FUNC, dblk_i
 
                     /* 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")
 
@@ -510,9 +505,6 @@ HDfprintf(stderr, "%s: New super block address is: %a\n", FUNC, sblk_addr);
 
             /* 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 */
@@ -531,21 +523,20 @@ HDfprintf(stderr, "%s: dblk_idx = %u, sblock->ndblks = %Zu\n", FUNC, dblk_idx, s
                     /* Set data block address in index block */
                     sblock->dblk_addrs[dblk_idx] = dblk_addr;
                     sblock_cache_flags |= H5AC__DIRTIED_FLAG;
+
+                    /* Create flush dependency on header, if extending the array and one doesn't already exist */
+                    if(will_extend && !sblock->has_hdr_depend) {
+                        if(H5EA__create_flush_depend((H5AC_info_t *)sblock->hdr, (H5AC_info_t *)sblock) < 0)
+                            H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between super block and header, address = %llu", (unsigned long long)sblock->addr)
+                        sblock->has_hdr_depend = TRUE;
+                    } /* end if */
                 } /* 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) {
@@ -566,14 +557,6 @@ if(sblock->dblk_npages)
                 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)) {
@@ -595,6 +578,13 @@ HDfprintf(stderr, "%s: sblock->dblk_page_size = %Zu\n", FUNC, sblock->dblk_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)
 
+                /* Check if there is already a dependency on the header */
+                if(will_extend && !dblk_page->has_hdr_depend) {
+                    if(H5EA__create_flush_depend((H5AC_info_t *)hdr, (H5AC_info_t *)dblk_page) < 0)
+                        H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block page and header, index = %llu", (unsigned long long)idx)
+                    dblk_page->has_hdr_depend = TRUE;
+                } /* end if */
+
                 /* Set 'thing' info to refer to the data block page */
                 *thing = dblk_page;
                 *thing_elmt_buf = (uint8_t *)dblk_page->elmts;
@@ -606,6 +596,13 @@ HDfprintf(stderr, "%s: sblock->dblk_page_size = %Zu\n", FUNC, sblock->dblk_page_
                 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])
 
+                /* Check if there is already a dependency on the header */
+                if(will_extend && !dblock->has_hdr_depend) {
+                    if(H5EA__create_flush_depend((H5AC_info_t *)hdr, (H5AC_info_t *)dblock) < 0)
+                        H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block and header, index = %llu", (unsigned long long)idx)
+                    dblock->has_hdr_depend = TRUE;
+                } /* end if */
+
                 /* Set 'thing' info to refer to the data block */
                 *thing = dblock;
                 *thing_elmt_buf = (uint8_t *)dblock->elmts;
@@ -615,6 +612,10 @@ HDfprintf(stderr, "%s: sblock->dblk_page_size = %Zu\n", FUNC, sblock->dblk_page_
         } /* end else */
     } /* end else */
 
+    /* Sanity checks */
+    HDassert(*thing != NULL);
+    HDassert(*thing_unprot_func != NULL);
+
 CATCH
     /* Reset 'thing' info on error */
     if(ret_value < 0) {
@@ -644,7 +645,7 @@ CATCH
     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() */
+END_FUNC(STATIC)  /* end H5EA__lookup_elmt() */
 
 

 /*-------------------------------------------------------------------------
@@ -670,13 +671,9 @@ H5EA_set(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, const void *elmt))
     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 */
+    hbool_t will_extend;                /* Flag indicating if setting the element will extend the array */
     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.
      */
@@ -687,7 +684,8 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
     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)
+    will_extend = (idx >= hdr->stats.stored.max_idx_set);
+    if(H5EA__lookup_elmt(ea, dxpl_id, idx, will_extend, 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 */
@@ -700,10 +698,7 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
     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) {
+    if(will_extend) {
         /* Update the max index for the array */
         hdr->stats.stored.max_idx_set = idx + 1;
         if(H5EA__hdr_modified(hdr) < 0)
@@ -740,11 +735,6 @@ H5EA_get(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, void *elmt))
     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.
      */
@@ -753,9 +743,6 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
 
     /* 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")
@@ -764,15 +751,11 @@ HDfprintf(stderr, "%s: Element beyond max. index set, hdr->stats.max_idx_set = %
         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)
+        if(H5EA__lookup_elmt(ea, dxpl_id, idx, FALSE, 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 */
@@ -797,8 +780,8 @@ 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.
+ * Purpose:	Make a child flush dependency between the extensible array
+ *              and another piece of metadata in the file.
  *
  * Return:	SUCCEED/FAIL
  *
@@ -810,52 +793,34 @@ END_FUNC(PRIV)  /* end H5EA_get() */
  */
 BEGIN_FUNC(PRIV, ERR,
 herr_t, SUCCEED, FAIL,
-H5EA_depend(H5AC_info_t *parent_entry, H5EA_t *ea))
+H5EA_depend(H5EA_t *ea, hid_t dxpl_id, H5AC_proxy_entry_t *parent))
 
     /* 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));
+    HDassert(parent);
 
     /*
-     * 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.
+     * Check to see if a flush dependency between the extensible array
+     * and another data structure in the file has already been set up.
+     * If it hasn't, do so now.
      */
-    if(!H5F_addr_defined(hdr->fd_parent_addr)) {
+    if(NULL == hdr->parent) {
+        /* Sanity check */
+        HDassert(hdr->top_proxy);
+
         /* 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;
+        /* Add the extensible array as a child of the parent (proxy) */
+        if(H5AC_proxy_entry_add_child(parent, hdr->f, dxpl_id, hdr->top_proxy) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array as child of proxy")
+        hdr->parent = parent;
     } /* end if */
 
 CATCH
@@ -864,49 +829,6 @@ 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
@@ -927,35 +849,33 @@ H5EA_close(H5EA_t *ea, hid_t dxpl_id))
     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;
+    /* Close the header, if it was set */
+    if(ea->hdr) {
+        /* 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 */
-    } /* end if */
 
-    /* Check for pending array deletion */
-    if(pending_delete) {
-        H5EA_hdr_t *hdr;            /* Another pointer to extensible array header */
+        /* Check for pending array deletion */
+        if(pending_delete) {
+            H5EA_hdr_t *hdr;            /* Another pointer to extensible array header */
 
 #ifndef NDEBUG
 {
@@ -972,33 +892,34 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 }
 #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")
+            /* 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;
+            /* 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")
+            /* 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")
+            /* 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 */
     } /* 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);
@@ -1035,9 +956,6 @@ H5EA_delete(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata))
     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)
 
@@ -1116,6 +1034,7 @@ CATCH
 
 END_FUNC(PRIV)  /* end H5EA_iterate() */
 
+

 /*-------------------------------------------------------------------------
  * Function:    H5EA_patch_file
  *
@@ -1134,10 +1053,6 @@ H5EA_patch_file(H5EA_t *ea, H5F_t *f))
 
     /* Local variables */
 
-#ifdef H5EA_DEBUG
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* H5EA_DEBUG */
-
     /*
      * Check arguments.
      */
@@ -1148,3 +1063,4 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
         ea->f = ea->hdr->f = f;
 
 END_FUNC(PRIV)  /* end H5EA_patch_file() */
+
diff --git a/src/H5EAcache.c b/src/H5EAcache.c
index d3f3d41..def38af 100644
--- a/src/H5EAcache.c
+++ b/src/H5EAcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -73,71 +71,53 @@
 /********************/
 
 /* 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 herr_t H5EA__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5EA__cache_iblock_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5EA__cache_sblock_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5EA__cache_dblock_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5EA__cache_dblk_page_get_initial_load_size(void *udata, size_t *image_len);
 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);
+    size_t *image_len);
 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);
@@ -154,7 +134,8 @@ const H5AC_class_t H5AC_EARRAY_HDR[1] = {{
     "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_get_initial_load_size,      /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -162,7 +143,6 @@ const H5AC_class_t H5AC_EARRAY_HDR[1] = {{
     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 */
 }};
 
@@ -172,7 +152,8 @@ const H5AC_class_t H5AC_EARRAY_IBLOCK[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -180,7 +161,6 @@ const H5AC_class_t H5AC_EARRAY_IBLOCK[1] = {{
     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 */
 }};
 
@@ -190,7 +170,8 @@ const H5AC_class_t H5AC_EARRAY_SBLOCK[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -198,7 +179,6 @@ const H5AC_class_t H5AC_EARRAY_SBLOCK[1] = {{
     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 */
 }};
 
@@ -208,7 +188,8 @@ const H5AC_class_t H5AC_EARRAY_DBLOCK[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -216,7 +197,6 @@ const H5AC_class_t H5AC_EARRAY_DBLOCK[1] = {{
     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 */
 }};
 
@@ -226,7 +206,8 @@ const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -234,7 +215,6 @@ const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
     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 */
 }};
 
@@ -251,7 +231,7 @@ const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5EA__cache_hdr_get_load_size
+ * Function:    H5EA__cache_hdr_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -265,11 +245,9 @@ const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
  */
 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))
+H5EA__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
@@ -277,15 +255,10 @@ H5EA__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_le
     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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5EA_HEADER_SIZE_FILE(udata->f);
 
-END_FUNC(STATIC)   /* end H5EA__cache_hdr_get_load_size() */
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -462,8 +435,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_hdr_deserialize() */
  */
 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))
+H5EA__cache_hdr_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5EA_hdr_t *hdr = (const H5EA_hdr_t *)_thing;      /* Pointer to the object */
@@ -576,33 +548,35 @@ H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
             case H5AC_NOTIFY_ACTION_AFTER_INSERT:
 	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
 		/* 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->parent != NULL, hdr->parent is used to destroy
+                 * the flush dependency before the 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);
+                if(hdr->parent) {
+                    /* Sanity check */
+                    HDassert(hdr->top_proxy);
 
 		    /* 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)
+		    if(H5AC_proxy_entry_remove_child((H5AC_proxy_entry_t *)hdr->parent, (void *)hdr->top_proxy) < 0)
+		        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between extensible array and proxy")
+                    hdr->parent = NULL;
 		} /* end if */
+
+                /* Detach from 'top' proxy for extensible array */
+                if(hdr->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(hdr->top_proxy, hdr) < 0)
+                        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between header and extensible array 'top' proxy")
+                    /* Don't reset hdr->top_proxy here, it's destroyed when the header is freed -QAK */
+                } /* end if */
 		break;
 
             default:
@@ -613,10 +587,8 @@ H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
 #endif /* NDEBUG */
         } /* end switch */
     } /* end if */
-    else {
-        HDassert(hdr->fd_parent_addr == HADDR_UNDEF);
-        HDassert(hdr->fd_parent_ptr == NULL);
-    } /* end else */
+    else
+        HDassert(NULL == hdr->parent);
 
 CATCH
 
@@ -654,7 +626,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_hdr_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5EA__cache_iblock_get_load_size
+ * Function:    H5EA__cache_iblock_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -668,11 +640,9 @@ END_FUNC(STATIC)   /* end H5EA__cache_hdr_free_icr() */
  */
 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))
+H5EA__cache_iblock_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
 
@@ -680,22 +650,17 @@ H5EA__cache_iblock_get_load_size(const void *_image, void *_udata, size_t *image
     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 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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5EA_IBLOCK_SIZE(&iblock);
 
-END_FUNC(STATIC)   /* end H5EA__cache_iblock_get_load_size() */
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -855,8 +820,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_iblock_deserialize() */
  */
 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))
+H5EA__cache_iblock_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5EA_iblock_t *iblock = (const H5EA_iblock_t *)_thing;      /* Pointer to the object */
@@ -980,35 +944,45 @@ H5EA__cache_iblock_notify(H5AC_notify_action_t action, void *_thing))
     /* 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;
+    /* 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_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* 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;
+        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)
+
+            /* Detach from 'top' proxy for extensible array */
+            if(iblock->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(iblock->top_proxy, iblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between index block and extensible array 'top' proxy")
+                iblock->top_proxy = NULL;
+            } /* end if */
+            break;
 
-            default:
+        default:
 #ifdef NDEBUG
-                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+            H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
 #else /* NDEBUG */
-                HDassert(0 && "Unknown action?!?");
+            HDassert(0 && "Unknown action?!?");
 #endif /* NDEBUG */
-        } /* end switch */
-    } /* end if */
+    } /* end switch */
 
 CATCH
 
@@ -1046,7 +1020,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_iblock_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5EA__cache_sblock_get_load_size
+ * Function:    H5EA__cache_sblock_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -1060,12 +1034,9 @@ END_FUNC(STATIC)   /* end H5EA__cache_iblock_free_icr() */
  */
 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))
+H5EA__cache_sblock_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
 
@@ -1076,39 +1047,33 @@ H5EA__cache_sblock_get_load_size(const void *_image, void *_udata,
     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;
+    /* 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;
+    /* 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 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);
+        /* 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);
+        /* 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 */
 
-    } else {
-        HDassert(actual_len);
-        HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5EA_SBLOCK_SIZE(&sblock);
 
-END_FUNC(STATIC)   /* end H5EA__cache_sblock_get_load_size() */
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -1265,8 +1230,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_sblock_deserialize() */
  */
 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))
+H5EA__cache_sblock_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5EA_sblock_t *sblock = (const H5EA_sblock_t *)_thing;      /* Pointer to the object */
@@ -1377,35 +1341,60 @@ H5EA__cache_sblock_notify(H5AC_notify_action_t action, void *_thing))
     /* 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;
+    /* 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_AFTER_FLUSH:
+            /* Destroy flush dependency on extensible array header, if set */
+            if(sblock->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->hdr, (H5AC_info_t *)sblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and header, address = %llu", (unsigned long long)sblock->addr)
+                sblock->has_hdr_depend = FALSE;
+            } /* end if */
+            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;
+        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)
+
+            /* Destroy flush dependency on extensible array header, if set */
+            if(sblock->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->hdr, (H5AC_info_t *)sblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and header, address = %llu", (unsigned long long)sblock->addr)
+                sblock->has_hdr_depend = FALSE;
+            } /* end if */
+
+            /* Detach from 'top' proxy for extensible array */
+            if(sblock->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(sblock->top_proxy, sblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and extensible array 'top' proxy")
+                sblock->top_proxy = NULL;
+            } /* end if */
+            break;
 
-            default:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        default:
 #ifdef NDEBUG
-                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+            H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
 #else /* NDEBUG */
-                HDassert(0 && "Unknown action?!?");
+            HDassert(0 && "Unknown action?!?");
 #endif /* NDEBUG */
-        } /* end switch */
-    } /* end if */
+    } /* end switch */
 
 CATCH
 
@@ -1443,7 +1432,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_sblock_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5EA__cache_dblock_get_load_size
+ * Function:    H5EA__cache_dblock_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -1457,12 +1446,9 @@ END_FUNC(STATIC)   /* end H5EA__cache_sblock_free_icr() */
  */
 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))
+H5EA__cache_dblock_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
 
@@ -1472,40 +1458,35 @@ H5EA__cache_dblock_get_load_size(const void *_image, void *_udata,
     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() */
+    /* 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);
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -1661,8 +1642,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_dblock_deserialize() */
  */
 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))
+H5EA__cache_dblock_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5EA_dblock_t *dblock = (const H5EA_dblock_t *)_thing;      /* Pointer to the object */
@@ -1774,35 +1754,60 @@ H5EA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
     /* 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;
+    /* 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_AFTER_FLUSH:
+            /* Destroy flush dependency on extensible array header, if set */
+            if(dblock->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between direct block and header, address = %llu", (unsigned long long)dblock->addr)
+                dblock->has_hdr_depend = FALSE;
+            } /* end if */
+            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;
+        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)
+
+            /* Destroy flush dependency on extensible array header, if set */
+            if(dblock->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and header, address = %llu", (unsigned long long)dblock->addr)
+                dblock->has_hdr_depend = FALSE;
+            } /* end if */
+
+            /* Detach from 'top' proxy for extensible array */
+            if(dblock->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(dblock->top_proxy, dblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and extensible array 'top' proxy")
+                dblock->top_proxy = NULL;
+            } /* end if */
+            break;
 
-            default:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        default:
 #ifdef NDEBUG
-                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+            H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
 #else /* NDEBUG */
-                HDassert(0 && "Unknown action?!?");
+            HDassert(0 && "Unknown action?!?");
 #endif /* NDEBUG */
-        } /* end switch */
-    } /* end if */
+    } /* end switch */
 
 CATCH
 
@@ -1847,7 +1852,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_dblock_free_icr() */
  *              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
+ *              the datablock header and all its pages are allocated as a
  *              single contiguous chunk of file space, and must be
  *              deallocated the same way.
  *
@@ -1887,7 +1892,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_dblock_fsf_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5EA__cache_dblk_page_get_load_size
+ * Function:    H5EA__cache_dblk_page_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -1901,12 +1906,9 @@ END_FUNC(STATIC)   /* end H5EA__cache_dblock_fsf_size() */
  */
 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))
+H5EA__cache_dblk_page_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
@@ -1914,14 +1916,10 @@ H5EA__cache_dblk_page_get_load_size(const void *_image, void *_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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5EA_DBLK_PAGE_SIZE(udata->hdr);
 
-END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_get_load_size() */
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -2047,8 +2045,7 @@ END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_deserialize() */
  */
 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))
+H5EA__cache_dblk_page_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5EA_dblk_page_t *dblk_page = (const H5EA_dblk_page_t *)_thing;      /* Pointer to the object */
@@ -2138,35 +2135,60 @@ H5EA__cache_dblk_page_notify(H5AC_notify_action_t action, void *_thing))
     /* 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;
+    /* 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_AFTER_FLUSH:
+            /* Destroy flush dependency on extensible array header, if set */
+            if(dblk_page->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->hdr, (H5AC_info_t *)dblk_page) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and header, address = %llu", (unsigned long long)dblk_page->addr)
+                dblk_page->has_hdr_depend = FALSE;
+            } /* end if */
+            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)
+        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)
+
+            /* Destroy flush dependency on extensible array header, if set */
+            if(dblk_page->has_hdr_depend) {
+                if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->hdr, (H5AC_info_t *)dblk_page) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and header, address = %llu", (unsigned long long)dblk_page->addr)
+                dblk_page->has_hdr_depend = FALSE;
+            } /* end if */
+
+            /* Detach from 'top' proxy for extensible array */
+            if(dblk_page->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(dblk_page->top_proxy, dblk_page) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and extensible array 'top' proxy")
+                dblk_page->top_proxy = NULL;
+            } /* end if */
             break;
 
-            default:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        default:
 #ifdef NDEBUG
-                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+            H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
 #else /* NDEBUG */
-                HDassert(0 && "Unknown action?!?");
+            HDassert(0 && "Unknown action?!?");
 #endif /* NDEBUG */
-        } /* end switch */
-    } /* end if */
+    } /* end switch */
 
 CATCH
 
diff --git a/src/H5EAdbg.c b/src/H5EAdbg.c
index ef45881..e67a5a8 100644
--- a/src/H5EAdbg.c
+++ b/src/H5EAdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5EAdblkpage.c b/src/H5EAdblkpage.c
index 9f3b39a..2b07356 100644
--- a/src/H5EAdblkpage.c
+++ b/src/H5EAdblkpage.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -154,11 +152,8 @@ 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 */
+    H5EA_dblk_page_t *dblk_page = NULL; /* Extensible array data block page */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
     /* Sanity check */
     HDassert(hdr);
@@ -170,9 +165,6 @@ HDfprintf(stderr, "%s: Called, addr = %a\n", FUNC, addr);
     /* 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)
@@ -181,10 +173,23 @@ HDfprintf(stderr, "%s: dblk_page->size = %Zu\n", FUNC, dblk_page->size);
     /* 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")
+    inserted = TRUE;
+
+    /* Add data block page as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblk_page) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        dblk_page->top_proxy = hdr->top_proxy;
+    } /* end if */
 
 CATCH
     if(ret_value < 0)
         if(dblk_page) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(dblk_page) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove extensible array data block page from cache")
+
             /* Destroy data block page */
             if(H5EA__dblk_page_dest(dblk_page) < 0)
                 H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block page")
@@ -213,11 +218,8 @@ 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 */
+    H5EA_dblk_page_t *dblk_page = NULL; /* Extensible array data block page */
+    H5EA_dblk_page_cache_ud_t udata;    /* Information needed for loading data block page */
 
     /* Sanity check */
     HDassert(hdr);
@@ -232,10 +234,27 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (dblk_page = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == dblk_page->top_proxy) {
+        /* Add data block page as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblk_page) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        dblk_page->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dblk_page;
+
 CATCH
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the data block page, if it was protected */
+        if(dblk_page && H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array data block page, address = %llu", (unsigned long long)dblk_page->addr)
+    } /* end if */
 
 END_FUNC(PKG)   /* end H5EA__dblk_page_protect() */
 
@@ -261,10 +280,6 @@ H5EA__dblk_page_unprotect(H5EA_dblk_page_t *dblk_page, hid_t dxpl_id,
 
     /* Local variables */
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /* Sanity check */
     HDassert(dblk_page);
 
@@ -296,6 +311,7 @@ H5EA__dblk_page_dest(H5EA_dblk_page_t *dblk_page))
 
     /* Sanity check */
     HDassert(dblk_page);
+    HDassert(!dblk_page->has_hdr_depend);
 
     /* Check if header field has been initialized */
     if(dblk_page->hdr) {
@@ -313,6 +329,9 @@ H5EA__dblk_page_dest(H5EA_dblk_page_t *dblk_page))
         dblk_page->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == dblk_page->top_proxy);
+
     /* Free the data block page itself */
     dblk_page = H5FL_FREE(H5EA_dblk_page_t, dblk_page);
 
diff --git a/src/H5EAdblock.c b/src/H5EAdblock.c
index 3eaaf1c..7df0ee9 100644
--- a/src/H5EAdblock.c
+++ b/src/H5EAdblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -168,10 +166,7 @@ H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
     /* 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 */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
     /* Sanity check */
     HDassert(hdr);
@@ -184,15 +179,9 @@ HDfprintf(stderr, "%s: Called, hdr->dblk_page_nelmts = %Zu, nelmts = %Zu\n", FUN
 
     /* 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)))
@@ -208,6 +197,14 @@ HDfprintf(stderr, "%s: dblock->block_off = %Hu\n", FUNC, dblock->block_off);
     /* 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")
+    inserted = TRUE;
+
+    /* Add data block as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        dblock->top_proxy = hdr->top_proxy;
+    } /* end if */
 
     /* Update extensible array data block statistics */
     hdr->stats.stored.ndata_blks++;
@@ -225,6 +222,11 @@ HDfprintf(stderr, "%s: dblock->block_off = %Hu\n", FUNC, dblock->block_off);
 CATCH
     if(!H5F_addr_defined(ret_value))
         if(dblock) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(dblock) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove extensible array data block from cache")
+
             /* 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")
@@ -262,25 +264,12 @@ H5EA__dblock_sblk_idx(const H5EA_hdr_t *hdr, hsize_t idx))
     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;
@@ -307,11 +296,8 @@ 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 */
+    H5EA_dblock_t *dblock;              /* Extensible array data block */
+    H5EA_dblock_cache_ud_t udata;       /* Information needed for loading data block */
 
     /* Sanity check */
     HDassert(hdr);
@@ -328,11 +314,29 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (dblock = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == dblock->top_proxy) {
+        /* Add data block as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        dblock->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dblock;
+
 CATCH
 
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the data block, if it was protected */
+        if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblock->addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array data block, address = %llu", (unsigned long long)dblock->addr)
+    } /* end if */
+
 END_FUNC(PKG)   /* end H5EA__dblock_protect() */
 
 

@@ -355,10 +359,6 @@ H5EA__dblock_unprotect(H5EA_dblock_t *dblock, hid_t dxpl_id, unsigned cache_flag
 
     /* Local variables */
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /* Sanity check */
     HDassert(dblock);
 
@@ -392,10 +392,6 @@ H5EA__dblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
     /* 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);
@@ -420,16 +416,10 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 
         /* 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;
@@ -463,6 +453,7 @@ H5EA__dblock_dest(H5EA_dblock_t *dblock))
 
     /* Sanity check */
     HDassert(dblock);
+    HDassert(!dblock->has_hdr_depend);
 
     /* Check if shared header field has been initialized */
     if(dblock->hdr) {
@@ -482,6 +473,9 @@ H5EA__dblock_dest(H5EA_dblock_t *dblock))
         dblock->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == dblock->top_proxy);
+
     /* Free the data block itself */
     dblock = H5FL_FREE(H5EA_dblock_t, dblock);
 
diff --git a/src/H5EAhdr.c b/src/H5EAhdr.c
index 46224f6..92d7c4d 100644
--- a/src/H5EAhdr.c
+++ b/src/H5EAhdr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -132,8 +130,6 @@ H5EA__hdr_alloc(H5F_t *f))
 
     /* 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;
@@ -207,9 +203,6 @@ H5EA__hdr_init(H5EA_hdr_t *hdr, void *ctx_udata))
     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)))
@@ -223,9 +216,6 @@ HDfprintf(stderr, "%s: hdr->nsblks = %Zu\n", FUNC, hdr->nsblks);
         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;
@@ -274,9 +264,6 @@ H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts))
     /* 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) {
@@ -344,9 +331,6 @@ H5EA__hdr_free_elmts(H5EA_hdr_t *hdr, size_t nelmts, void *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);
@@ -376,10 +360,7 @@ H5EA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam,
 
     /* Local variables */
     H5EA_hdr_t *hdr = NULL;     /* Extensible array header */
-
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
+    hbool_t inserted = FALSE;   /* Whether the header was inserted into cache */
 
     /* Check arguments */
     HDassert(f);
@@ -437,9 +418,20 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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")
 
+    /* Create 'top' proxy for extensible array entries */
+    if(hdr->swmr_write)
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            H5E_THROW(H5E_CANTCREATE, "can't create extensible array entry proxy")
+
     /* 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")
+    inserted = TRUE;
+
+    /* Add header as child of 'top' proxy */
+    if(hdr->top_proxy)
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
 
     /* Set address of array header to return */
     ret_value = hdr->addr;
@@ -447,6 +439,11 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 CATCH
     if(!H5F_addr_defined(ret_value))
         if(hdr) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(hdr) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove extensible array header from cache")
+
             /* 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")
@@ -633,6 +630,7 @@ H5EA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata,
     unsigned flags))
 
     /* Local variables */
+    H5EA_hdr_t *hdr;            /* Extensible array header */
     H5EA_hdr_cache_ud_t udata;  /* User data for cache callbacks */
 
     /* Sanity check */
@@ -648,9 +646,23 @@ H5EA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata,
     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)))
+    if(NULL == (hdr = (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) */
+    hdr->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->swmr_write && NULL == hdr->top_proxy) {
+        /* Create 'top' proxy for extensible array entries */
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            H5E_THROW(H5E_CANTCREATE, "can't create extensible array entry proxy")
+
+        /* Add header as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = hdr;
 
 CATCH
 
@@ -728,9 +740,6 @@ H5EA__hdr_delete(H5EA_hdr_t *hdr, hid_t dxpl_id))
 
     /* 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")
@@ -801,6 +810,13 @@ H5EA__hdr_dest(H5EA_hdr_t *hdr))
     if(hdr->sblk_info)
         hdr->sblk_info = (H5EA_sblk_info_t *)H5FL_SEQ_FREE(H5EA_sblk_info_t, hdr->sblk_info);
 
+    /* Destroy the 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_dest(hdr->top_proxy) < 0)
+            H5E_THROW(H5E_CANTRELEASE, "unable to destroy extensible array 'top' proxy")
+        hdr->top_proxy = NULL;
+    } /* end if */
+
     /* Free the shared info itself */
     hdr = H5FL_FREE(H5EA_hdr_t, hdr);
 
diff --git a/src/H5EAiblock.c b/src/H5EAiblock.c
index 623ae30..e25e3ef 100644
--- a/src/H5EAiblock.c
+++ b/src/H5EAiblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -183,6 +181,7 @@ 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 */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
 #ifdef QAK
 HDfprintf(stderr, "%s: Called\n", FUNC);
@@ -233,6 +232,14 @@ HDfprintf(stderr, "%s: iblock->size = %Zu\n", FUNC, iblock->size);
     /* 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")
+    inserted = TRUE;
+
+    /* Add index block as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, iblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        iblock->top_proxy = hdr->top_proxy;
+    } /* end if */
 
     /* Update extensible array index block statistics */
     HDassert(0 == hdr->stats.computed.nindex_blks);
@@ -252,9 +259,14 @@ HDfprintf(stderr, "%s: iblock->size = %Zu\n", FUNC, iblock->size);
 CATCH
     if(!H5F_addr_defined(ret_value))
         if(iblock) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(iblock) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove extensible array index block from cache")
+
             /* 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")
+                H5E_THROW(H5E_CANTFREE, "unable to release file space for extensible array index block")
 
             /* Destroy index block */
             if(H5EA__iblock_dest(iblock) < 0)
@@ -281,6 +293,9 @@ BEGIN_FUNC(PKG, ERR,
 H5EA_iblock_t *, NULL, NULL,
 H5EA__iblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned flags))
 
+    /* Local variables */
+    H5EA_iblock_t *iblock = NULL;       /* Pointer to index block */
+
 #ifdef QAK
 HDfprintf(stderr, "%s: Called\n", FUNC);
 #endif /* QAK */
@@ -292,10 +307,27 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (iblock = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == iblock->top_proxy) {
+        /* Add index block as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, iblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        iblock->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = iblock;
+
 CATCH
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the index block, if it was protected */
+        if(iblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, iblock->addr, iblock, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array index block, address = %llu", (unsigned long long)iblock->addr)
+    } /* end if */
 
 END_FUNC(PKG)   /* end H5EA__iblock_protect() */
 
@@ -470,6 +502,9 @@ H5EA__iblock_dest(H5EA_iblock_t *iblock))
         iblock->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == iblock->top_proxy);
+
     /* Free the index block itself */
     iblock = H5FL_FREE(H5EA_iblock_t, iblock);
 
diff --git a/src/H5EAint.c b/src/H5EAint.c
index 9f910d0..2baf1f4 100644
--- a/src/H5EAint.c
+++ b/src/H5EAint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5EAmodule.h b/src/H5EAmodule.h
index 405b232..d3e06b7 100644
--- a/src/H5EAmodule.h
+++ b/src/H5EAmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5EApkg.h b/src/H5EApkg.h
index 147a612..e162fab 100644
--- a/src/H5EApkg.h
+++ b/src/H5EApkg.h
@@ -5,21 +5,19 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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
+ * 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.
+ * 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!"
@@ -95,10 +93,10 @@
     /* General metadata fields */                                             \
     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
                                                                               \
-    /* Sanity-checking fields */                          \
+    /* Sanity-checking fields */                                              \
     + (i)->hdr->sizeof_addr          /* File address of array owning the block */ \
                                                                               \
-    /* Extensible Array Index Block specific fields */                  \
+    /* 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  */ \
@@ -109,31 +107,31 @@
     /* General metadata fields */                                             \
     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
                                                                               \
-    /* Sanity-checking fields */                          \
+    /* 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 */                  \
+    /* 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)  (                          \
+#define H5EA_DBLOCK_PREFIX_SIZE(d)  (                                         \
     /* General metadata fields */                                             \
     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
                                                                               \
-    /* Sanity-checking fields */                          \
+    /* 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)     (                          \
+#define H5EA_DBLOCK_SIZE(d)     (                                             \
     /* Data block prefix size  */                                             \
     H5EA_DBLOCK_PREFIX_SIZE(d)                                                \
                                                                               \
-    /* Extensible Array Data Block specific fields */                  \
+    /* 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 */  \
     )
@@ -191,7 +189,6 @@ typedef struct H5EA_hdr_t {
     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 */
@@ -208,17 +205,18 @@ typedef struct H5EA_hdr_t {
     /* 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.
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t swmr_write;                 /* Flag indicating the file is opened with SWMR-write access */
+    H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
+    void *parent;		        /* Pointer to 'top' proxy flush dependency
+                                         * parent, if it exists, otherwise NULL.
+                                         * If the extensible array is being used
+                                         * to index a chunked dataset 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 extensible array header.
  					 *
  					 * The field is used to avoid duplicate
 					 * setups of the flush dependency 
@@ -228,12 +226,6 @@ typedef struct H5EA_hdr_t {
 					 * 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 */
@@ -247,9 +239,12 @@ typedef struct H5EA_iblock_t {
     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                  */
+    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              */
+    size_t      size;           /* Size of index block on disk                  */
+
+    /* SWMR / Flush dependency information (not stored) */
+    H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
 
     /* Computed/cached values (not stored) */
     size_t      nsblks;         /* # of super blocks whose data block addresses are in index block */
@@ -268,10 +263,14 @@ typedef struct H5EA_sblock_t {
     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) */
+    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              */
+    size_t      size;           /* Size of index block on disk                  */
+
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
+    H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
+    H5EA_iblock_t *parent;      /* Parent object for super block (index block)  */
 
     /* Computed/cached values (not stored) */
     unsigned    idx;            /* Super block index within the extensible array */
@@ -292,10 +291,14 @@ typedef struct H5EA_dblock_t {
     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              */
+    H5EA_hdr_t  *hdr;           /* Shared array header info                             */
+    haddr_t     addr;           /* Address of this data block on disk                   */
+    size_t      size;           /* Size of data block on disk                           */
+
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
+    H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
+    void        *parent;        /* Parent object for data block (index or super block)  */
 
     /* Computed/cached values (not stored) */
     size_t      nelmts;         /* Number of elements in block                */
@@ -311,10 +314,14 @@ typedef struct H5EA_dbk_page_t {
     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          */
+    H5EA_hdr_t  *hdr;           /* Shared array header info                         */
+    haddr_t     addr;           /* Address of this data block page on disk          */
+    size_t      size;           /* Size of data block page on disk                  */
+
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
+    H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
+    H5EA_sblock_t *parent;      /* Parent object for data block page (super block)  */
 
     /* Computed/cached values (not stored) */
     /* <none> */
@@ -369,21 +376,6 @@ typedef struct H5EA__ctx_cb_t {
 /* 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];
 
diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h
index 78bcca8..cda1d46 100644
--- a/src/H5EAprivate.h
+++ b/src/H5EAprivate.h
@@ -5,22 +5,20 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
+ * Created:     H5EAprivate.h
+ *              Jun 17 2008
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:        Private header for library accessible extensible
- *                      array routines.
+ * Purpose:     Private header for library accessible extensible
+ *              array routines.
  *
  *-------------------------------------------------------------------------
  */
@@ -34,8 +32,8 @@
 #endif /* NOT_YET */
 
 /* Private headers needed by this file */
-#include "H5ACprivate.h"    /* Metadata cache            */
-#include "H5Fprivate.h"        /* File access                */
+#include "H5ACprivate.h"        /* Metadata cache               */
+#include "H5Fprivate.h"         /* File access                  */
 
 
 /**************************/
@@ -54,7 +52,7 @@ typedef enum H5EA_cls_id_t {
 
     /* 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_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;
 
@@ -142,7 +140,7 @@ 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_depend(H5EA_t *ea, hid_t dxpl_id, H5AC_proxy_entry_t *parent);
 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);
diff --git a/src/H5EAsblock.c b/src/H5EAsblock.c
index f775484..4e291c0 100644
--- a/src/H5EAsblock.c
+++ b/src/H5EAsblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -133,9 +131,6 @@ H5EA__sblock_alloc(H5EA_hdr_t *hdr, H5EA_iblock_t *parent, unsigned 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)))
@@ -198,10 +193,7 @@ H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_iblock_t *parent,
     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 */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
     /* Sanity check */
     HDassert(hdr);
@@ -213,15 +205,9 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 
     /* 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)))
@@ -234,6 +220,14 @@ HDfprintf(stderr, "%s: sblock->block_off = %Hu\n", FUNC, sblock->block_off);
     /* 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")
+    inserted = TRUE;
+
+    /* Add super block as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, sblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        sblock->top_proxy = hdr->top_proxy;
+    } /* end if */
 
     /* Update extensible array super block statistics */
     hdr->stats.stored.nsuper_blks++;
@@ -248,6 +242,11 @@ HDfprintf(stderr, "%s: sblock->block_off = %Hu\n", FUNC, sblock->block_off);
 CATCH
     if(!H5F_addr_defined(ret_value))
         if(sblock) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(sblock) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove extensible array super block from cache")
+
             /* 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")
@@ -279,13 +278,9 @@ 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_t *sblock = NULL;       /* Pointer to super block */
     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));
@@ -300,10 +295,27 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (sblock = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == sblock->top_proxy) {
+        /* Add super block as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, sblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add extensible array entry as child of array proxy")
+        sblock->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = sblock;
+
 CATCH
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the super block, if it was protected */
+        if(sblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblock->addr, sblock, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array super block, address = %llu", (unsigned long long)sblock->addr)
+    } /* end if */
 
 END_FUNC(PKG)   /* end H5EA__sblock_protect() */
 
@@ -327,10 +339,6 @@ H5EA__sblock_unprotect(H5EA_sblock_t *sblock, hid_t dxpl_id, unsigned cache_flag
 
     /* Local variables */
 
-#ifdef QAK
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* QAK */
-
     /* Sanity check */
     HDassert(sblock);
 
@@ -365,10 +373,6 @@ H5EA__sblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_iblock_t *parent,
     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));
@@ -415,9 +419,7 @@ 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 */
+    HDassert(!sblock->has_hdr_depend);
 
     /* Check if shared header field has been initialized */
     if(sblock->hdr) {
@@ -437,6 +439,9 @@ HDfprintf(stderr, "%s: sblock->hdr->dblk_page_nelmts = %Zu, sblock->ndblks = %Zu
         sblock->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == sblock->top_proxy);
+
     /* Free the super block itself */
     sblock = H5FL_FREE(H5EA_sblock_t, sblock);
 
diff --git a/src/H5EAstat.c b/src/H5EAstat.c
index 0c27681..72c4d14 100644
--- a/src/H5EAstat.c
+++ b/src/H5EAstat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5EAtest.c b/src/H5EAtest.c
index 905aa7f..422ea68 100644
--- a/src/H5EAtest.c
+++ b/src/H5EAtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5Edefin.h b/src/H5Edefin.h
index 7a82572..b6eac17 100644
--- a/src/H5Edefin.h
+++ b/src/H5Edefin.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_err -- do not edit */
@@ -39,6 +37,7 @@ hid_t H5E_ATTR_g           = FAIL;      /* Attribute */
 hid_t H5E_IO_g             = FAIL;      /* Low-level I/O */
 hid_t H5E_EFL_g            = FAIL;      /* External file list */
 hid_t H5E_TST_g            = FAIL;      /* Ternary Search Trees */
+hid_t H5E_PAGEBUF_g        = FAIL;      /* Page Buffering */
 hid_t H5E_FSPACE_g         = FAIL;      /* Free Space Manager */
 hid_t H5E_DATASET_g        = FAIL;      /* Dataset */
 hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
@@ -156,6 +155,7 @@ 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_CANTUNSERIALIZE_g = FAIL;      /* Unable to mark metadata as unserialized */
 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 */
@@ -168,7 +168,11 @@ hid_t H5E_CANTUNPROTECT_g  = FAIL;      /* Unable to unprotect metadata */
 hid_t H5E_CANTPIN_g        = FAIL;      /* Unable to pin cache entry */
 hid_t H5E_CANTUNPIN_g      = FAIL;      /* Unable to un-pin cache entry */
 hid_t H5E_CANTMARKDIRTY_g  = FAIL;      /* Unable to mark a pinned entry as dirty */
+hid_t H5E_CANTMARKCLEAN_g  = FAIL;      /* Unable to mark a pinned entry as clean */
+hid_t H5E_CANTMARKUNSERIALIZED_g = FAIL;      /* Unable to mark an entry as unserialized */
+hid_t H5E_CANTMARKSERIALIZED_g = FAIL;      /* Unable to mark an entry as serialized */
 hid_t H5E_CANTDIRTY_g      = FAIL;      /* Unable to mark metadata as dirty */
+hid_t H5E_CANTCLEAN_g      = FAIL;      /* Unable to mark metadata as clean */
 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 */
 hid_t H5E_CANTDEPEND_g     = FAIL;      /* Unable to create a flush dependency */
diff --git a/src/H5Edeprec.c b/src/H5Edeprec.c
index 1a13c01..f579773 100644
--- a/src/H5Edeprec.c
+++ b/src/H5Edeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Einit.h b/src/H5Einit.h
index 0b2a6da..94e76f0 100644
--- a/src/H5Einit.h
+++ b/src/H5Einit.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_err -- do not edit */
@@ -114,6 +112,11 @@ 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_PAGEBUF_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Page Buffering"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_PAGEBUF_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)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
@@ -574,6 +577,11 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to flush data from cache"))==NU
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTFLUSH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUNSERIALIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark metadata as unserialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUNSERIALIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_CANTSERIALIZE_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to serialize data from cache"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
@@ -634,11 +642,31 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark a pinned entry as dirty
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTMARKDIRTY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMARKCLEAN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark a pinned entry as clean"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMARKCLEAN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMARKUNSERIALIZED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark an entry as unserialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMARKUNSERIALIZED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMARKSERIALIZED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark an entry as serialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMARKSERIALIZED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_CANTDIRTY_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark metadata as dirty"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTDIRTY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCLEAN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to mark metadata as clean"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLEAN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_CANTEXPUNGE_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to expunge a metadata cache entry"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
diff --git a/src/H5Eint.c b/src/H5Eint.c
index 6ed405f..110c6bb 100644
--- a/src/H5Eint.c
+++ b/src/H5Eint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -744,6 +742,9 @@ done:
     if(va_started)
         va_end(ap);
 #ifdef H5_HAVE_VASPRINTF
+    /* Memory was allocated with HDvasprintf so it needs to be freed
+     * with HDfree
+     */
     if(tmp)
         HDfree(tmp);
 #else /* H5_HAVE_VASPRINTF */
diff --git a/src/H5Emodule.h b/src/H5Emodule.h
index d624409..2d1bcd0 100644
--- a/src/H5Emodule.h
+++ b/src/H5Emodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Epkg.h b/src/H5Epkg.h
index 3af653a..90f4f80 100644
--- a/src/H5Epkg.h
+++ b/src/H5Epkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h
index db413e3..57e7485 100644
--- a/src/H5Eprivate.h
+++ b/src/H5Eprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Epubgen.h b/src/H5Epubgen.h
index a2ed6b4..45bfbc6 100644
--- a/src/H5Epubgen.h
+++ b/src/H5Epubgen.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_err -- do not edit */
@@ -46,6 +44,7 @@ extern "C" {
 #define H5E_IO               (H5OPEN H5E_IO_g)
 #define H5E_EFL              (H5OPEN H5E_EFL_g)
 #define H5E_TST              (H5OPEN H5E_TST_g)
+#define H5E_PAGEBUF          (H5OPEN H5E_PAGEBUF_g)
 #define H5E_FSPACE           (H5OPEN H5E_FSPACE_g)
 #define H5E_DATASET          (H5OPEN H5E_DATASET_g)
 #define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
@@ -79,6 +78,7 @@ H5_DLLVAR hid_t H5E_ATTR_g;          /* Attribute */
 H5_DLLVAR hid_t H5E_IO_g;            /* Low-level I/O */
 H5_DLLVAR hid_t H5E_EFL_g;           /* External file list */
 H5_DLLVAR hid_t H5E_TST_g;           /* Ternary Search Trees */
+H5_DLLVAR hid_t H5E_PAGEBUF_g;       /* Page Buffering */
 H5_DLLVAR hid_t H5E_FSPACE_g;        /* Free Space Manager */
 H5_DLLVAR hid_t H5E_DATASET_g;       /* Dataset */
 H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
@@ -267,6 +267,7 @@ H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
 
 /* Cache related errors */
 #define H5E_CANTFLUSH        (H5OPEN H5E_CANTFLUSH_g)
+#define H5E_CANTUNSERIALIZE  (H5OPEN H5E_CANTUNSERIALIZE_g)
 #define H5E_CANTSERIALIZE    (H5OPEN H5E_CANTSERIALIZE_g)
 #define H5E_CANTTAG          (H5OPEN H5E_CANTTAG_g)
 #define H5E_CANTLOAD         (H5OPEN H5E_CANTLOAD_g)
@@ -279,7 +280,11 @@ H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
 #define H5E_CANTPIN          (H5OPEN H5E_CANTPIN_g)
 #define H5E_CANTUNPIN        (H5OPEN H5E_CANTUNPIN_g)
 #define H5E_CANTMARKDIRTY    (H5OPEN H5E_CANTMARKDIRTY_g)
+#define H5E_CANTMARKCLEAN    (H5OPEN H5E_CANTMARKCLEAN_g)
+#define H5E_CANTMARKUNSERIALIZED (H5OPEN H5E_CANTMARKUNSERIALIZED_g)
+#define H5E_CANTMARKSERIALIZED (H5OPEN H5E_CANTMARKSERIALIZED_g)
 #define H5E_CANTDIRTY        (H5OPEN H5E_CANTDIRTY_g)
+#define H5E_CANTCLEAN        (H5OPEN H5E_CANTCLEAN_g)
 #define H5E_CANTEXPUNGE      (H5OPEN H5E_CANTEXPUNGE_g)
 #define H5E_CANTRESIZE       (H5OPEN H5E_CANTRESIZE_g)
 #define H5E_CANTDEPEND       (H5OPEN H5E_CANTDEPEND_g)
@@ -289,6 +294,7 @@ H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
 #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_CANTUNSERIALIZE_g; /* Unable to mark metadata as unserialized */
 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 */
@@ -301,7 +307,11 @@ H5_DLLVAR hid_t H5E_CANTUNPROTECT_g; /* Unable to unprotect metadata */
 H5_DLLVAR hid_t H5E_CANTPIN_g;       /* Unable to pin cache entry */
 H5_DLLVAR hid_t H5E_CANTUNPIN_g;     /* Unable to un-pin cache entry */
 H5_DLLVAR hid_t H5E_CANTMARKDIRTY_g; /* Unable to mark a pinned entry as dirty */
+H5_DLLVAR hid_t H5E_CANTMARKCLEAN_g; /* Unable to mark a pinned entry as clean */
+H5_DLLVAR hid_t H5E_CANTMARKUNSERIALIZED_g; /* Unable to mark an entry as unserialized */
+H5_DLLVAR hid_t H5E_CANTMARKSERIALIZED_g; /* Unable to mark an entry as serialized */
 H5_DLLVAR hid_t H5E_CANTDIRTY_g;     /* Unable to mark metadata as dirty */
+H5_DLLVAR hid_t H5E_CANTCLEAN_g;     /* Unable to mark metadata as clean */
 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 */
 H5_DLLVAR hid_t H5E_CANTDEPEND_g;    /* Unable to create a flush dependency */
diff --git a/src/H5Epublic.h b/src/H5Epublic.h
index 17a35d9..3eae2da 100644
--- a/src/H5Epublic.h
+++ b/src/H5Epublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Eterm.h b/src/H5Eterm.h
index 49c0d18..f0503c4 100644
--- a/src/H5Eterm.h
+++ b/src/H5Eterm.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_err -- do not edit */
@@ -40,6 +38,7 @@ H5E_ATTR_g=
 H5E_IO_g=    
 H5E_EFL_g=    
 H5E_TST_g=    
+H5E_PAGEBUF_g=    
 H5E_FSPACE_g=    
 H5E_DATASET_g=    
 H5E_STORAGE_g=    
@@ -158,6 +157,7 @@ H5E_NOIDS_g=
 
 /* Cache related errors */    
 H5E_CANTFLUSH_g=    
+H5E_CANTUNSERIALIZE_g=    
 H5E_CANTSERIALIZE_g=    
 H5E_CANTTAG_g=    
 H5E_CANTLOAD_g=    
@@ -170,7 +170,11 @@ H5E_CANTUNPROTECT_g=
 H5E_CANTPIN_g=    
 H5E_CANTUNPIN_g=    
 H5E_CANTMARKDIRTY_g=    
+H5E_CANTMARKCLEAN_g=    
+H5E_CANTMARKUNSERIALIZED_g=    
+H5E_CANTMARKSERIALIZED_g=    
 H5E_CANTDIRTY_g=    
+H5E_CANTCLEAN_g=    
 H5E_CANTEXPUNGE_g=    
 H5E_CANTRESIZE_g=    
 H5E_CANTDEPEND_g=    
diff --git a/src/H5F.c b/src/H5F.c
index 4cdf1e7..78fce2a 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -140,7 +138,7 @@ H5F_term_package(void)
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     if(H5_PKG_INIT_VAR) {
-	if(H5I_nmembers(H5I_FILE) > 0) {
+        if(H5I_nmembers(H5I_FILE) > 0) {
             (void)H5I_clear_type(H5I_FILE, FALSE, FALSE);
             n++; /*H5I*/
 	} /* end if */
@@ -149,12 +147,12 @@ H5F_term_package(void)
             H5F_sfile_assert_num(0);
 
             /* Destroy the file object id group */
-	    n += (H5I_dec_type_ref(H5I_FILE) > 0);
+            n += (H5I_dec_type_ref(H5I_FILE) > 0);
 
-	    /* Mark closed */
+            /* Mark closed */
             if(0 == n)
                 H5_PKG_INIT_VAR = FALSE;
-	} /* end else */
+        } /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
@@ -188,13 +186,13 @@ H5Fget_create_plist(hid_t 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")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
     if(NULL == (plist = (H5P_genplist_t *)H5I_object(file->shared->fcpl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
 
     /* Create the property list object to return */
     if((ret_value = H5P_copy_plist(plist, TRUE)) < 0)
-	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file creation properties")
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file creation properties")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -233,7 +231,7 @@ H5Fget_access_plist(hid_t file_id)
 
     /* Check args */
     if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
 
     /* Retrieve the file's access property list */
     if((ret_value = H5F_get_access_plist(f, TRUE)) < 0)
@@ -275,7 +273,7 @@ H5Fget_obj_count(hid_t file_id, unsigned types)
 
     /* Perform the query */
     if(H5F_get_obj_count(f, types, TRUE, &obj_count) < 0)
-	HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_count failed")
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_count failed")
 
     /* Set the return value */
     ret_value = (ssize_t)obj_count;
@@ -406,7 +404,7 @@ H5Fis_hdf5(const char *name)
         HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "no file name specified")
 
     /* call the private is_HDF5 function */
-    if((ret_value = H5F_is_hdf5(name, H5AC_ind_read_dxpl_id)) < 0)
+    if((ret_value = H5F__is_hdf5(name, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id)) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable open file")
 
 done:
@@ -445,6 +443,8 @@ done:
 hid_t
 H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
 {
+    hbool_t      ci_load = FALSE;       /* whether MDC ci load requested */
+    hbool_t      ci_write = FALSE;      /* whether MDC CI write requested */
     H5F_t	*new_file = NULL;	/*file struct for new file	*/
     hid_t        dxpl_id = H5AC_ind_read_dxpl_id; /*dxpl used by library        */
     hid_t	 ret_value;	        /*return value			*/
@@ -459,7 +459,7 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
      *          H5F_ACC_EXCL, H5F_ACC_TRUNC and H5F_ACC_SWMR_WRITE
      */
     if(flags & ~(H5F_ACC_EXCL | H5F_ACC_TRUNC | H5F_ACC_SWMR_WRITE))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
+        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")
@@ -481,26 +481,31 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
      * reading and writing.
      */
     if (0==(flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC)))
-	flags |= H5F_ACC_EXCL;	 /*default*/
+        flags |= H5F_ACC_EXCL;	 /*default*/
     flags |= H5F_ACC_RDWR | H5F_ACC_CREAT;
 
     /*
      * Create a new file or truncate an existing file.
      */
     if(NULL == (new_file = H5F_open(filename, flags, fcpl_id, fapl_id, dxpl_id)))
-	HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to create file")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to create file")
+
+   /* Check to see if both SWMR and cache image are requested.  Fail if so */
+   if(H5C_cache_image_status(new_file, &ci_load, &ci_write) < 0)
+       HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get MDC cache image status")
+   if((ci_load || ci_write) && (flags & (H5F_ACC_SWMR_READ | H5F_ACC_SWMR_WRITE)))
+       HGOTO_ERROR(H5E_FILE, H5E_UNSUPPORTED, FAIL, "can't have both SWMR and cache image")
 
     /* Get an atom for the file */
     if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
-	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
 
     /* Keep this ID in file object structure */
     new_file->file_id = ret_value;
 
 done:
-    if(ret_value < 0 && new_file)
-        if(H5F_close(new_file) < 0)
-            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+    if(ret_value < 0 && new_file && H5F_try_close(new_file, NULL) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Fcreate() */
@@ -528,7 +533,7 @@ done:
  * Modifications:
  *	  	Robb Matzke, 1997-07-18
  *		File struct creation and destruction is through H5F_new() and
- *		H5F_dest(). Reading the root symbol table entry is done with
+ *		H5F__dest(). Reading the root symbol table entry is done with
  *		H5G_decode().
  *
  *  		Robb Matzke, 1997-09-23
@@ -549,6 +554,8 @@ done:
 hid_t
 H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
 {
+    hbool_t      ci_load = FALSE;       /* whether MDC ci load requested */
+    hbool_t      ci_write = FALSE;      /* whether MDC CI write requested */
     H5F_t	*new_file = NULL;	/*file struct for new file	*/
     hid_t        dxpl_id = H5AC_ind_read_dxpl_id; /*dxpl used by library        */
     hid_t	 ret_value;	        /*return value			*/
@@ -558,11 +565,11 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
 
     /* Check/fix arguments. */
     if(!filename || !*filename)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name")
     /* Reject undefined flags (~H5F_ACC_PUBLIC_FLAGS) and the H5F_ACC_TRUNC & H5F_ACC_EXCL flags */
     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")
+        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")
@@ -576,17 +583,23 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
 
     /* Open the file */
     if(NULL == (new_file = H5F_open(filename, flags, H5P_FILE_CREATE_DEFAULT, fapl_id, dxpl_id)))
-	HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open file")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open file")
+
+    /* Check to see if both SWMR and cache image are requested.  Fail if so */
+    if(H5C_cache_image_status(new_file, &ci_load, &ci_write) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get MDC cache image status")
+    if((ci_load || ci_write) && (flags & (H5F_ACC_SWMR_READ | H5F_ACC_SWMR_WRITE)))
+        HGOTO_ERROR(H5E_FILE, H5E_UNSUPPORTED, FAIL, "can't have both SWMR and cache image")
 
     /* Get an atom for the file */
     if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
-	HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
 
     /* Keep this ID in file object structure */
     new_file->file_id = ret_value;
 
 done:
-    if(ret_value < 0 && new_file && H5F_try_close(new_file) < 0)
+    if(ret_value < 0 && new_file && H5F_try_close(new_file, NULL) < 0)
         HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
 
     FUNC_LEAVE_API(ret_value)
@@ -679,12 +692,12 @@ H5Fflush(hid_t object_id, H5F_scope_t scope)
     } /* end switch */
 
     if(!f) {
-	if(!oloc)
-	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
-	f = oloc->file;
+        if(!oloc)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
+        f = oloc->file;
     } /* end if */
     if(!f)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
 
     /* Flush the file */
     /*
@@ -698,12 +711,12 @@ H5Fflush(hid_t object_id, H5F_scope_t scope)
         /* Flush other files, depending on scope */
         if(H5F_SCOPE_GLOBAL == scope) {
             /* Call the flush routine for mounted file hierarchies */
-            if(H5F_flush_mounts(f, H5AC_ind_read_dxpl_id) < 0)
+            if(H5F_flush_mounts(f, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
         } /* end if */
         else {
             /* Call the flush routine, for this file */
-            if(H5F_flush(f, H5AC_ind_read_dxpl_id, FALSE) < 0)
+            if(H5F__flush(f, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id, FALSE) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
         } /* end else */
     } /* end if */
@@ -746,7 +759,7 @@ H5Fclose(hid_t file_id)
 
     /* Check/fix arguments. */
     if(H5I_FILE != H5I_get_type(file_id))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
 
     /* Flush file if this is the last reference to this id and we have write
      * intent, unless it will be flushed by the "shared" file being closed.
@@ -757,10 +770,9 @@ 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(H5F_flush(f, H5AC_ind_read_dxpl_id, FALSE) < 0)
+        if(nref == 1)
+            if(H5F__flush(f, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id, FALSE) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
-	}
     } /* end if */
 
     /*
@@ -768,7 +780,7 @@ H5Fclose(hid_t file_id)
      * be closed.
      */
     if(H5I_dec_app_ref(file_id) < 0)
-	HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEFILE, FAIL, "decrementing file ID failed")
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEFILE, FAIL, "decrementing file ID failed")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -824,7 +836,7 @@ H5Freopen(hid_t file_id)
 
 done:
     if(ret_value < 0 && new_file)
-        if(H5F_dest(new_file, H5AC_ind_read_dxpl_id, FALSE) < 0)
+        if(H5F__dest(new_file, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id, FALSE) < 0)
             HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
 
     FUNC_LEAVE_API(ret_value)
@@ -1028,7 +1040,7 @@ H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
 
     /* call private get_file_image function */
-    if((ret_value = H5F_get_file_image(file, buf_ptr, buf_len, H5AC_ind_read_dxpl_id)) < 0)
+    if((ret_value = H5F_get_file_image(file, buf_ptr, buf_len, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id)) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file image")
 
 done:
@@ -1178,7 +1190,7 @@ H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
     size_t *cur_size_ptr, int *cur_num_entries_ptr)
 {
     H5F_t      *file;                   /* File object for file ID */
-    int32_t    cur_num_entries;
+    uint32_t   cur_num_entries;
     herr_t     ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -1195,7 +1207,7 @@ H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.")
 
     if(cur_num_entries_ptr != NULL)
-	*cur_num_entries_ptr = (int)cur_num_entries;
+        *cur_num_entries_ptr = (int)cur_num_entries;
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1362,11 +1374,11 @@ H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo)
 
     /* Get the size of the superblock and any superblock extensions */
     if(H5F__super_size(f, H5AC_ind_read_dxpl_id, &finfo->super.super_size, &finfo->super.super_ext_size) < 0)
-	HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock sizes")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock sizes")
 
     /* Get the size of any persistent free space */
     if(H5MF_get_freespace(f, H5AC_ind_read_dxpl_id, &finfo->free.tot_space, &finfo->free.meta_size) < 0)
-	HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve free space information")
+        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))
@@ -1439,26 +1451,30 @@ H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info)
             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_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_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 */
+                    /* Allocate memory for retries[i]
+                     *
+                     * This memory should be released by the user with
+                     * the H5free_memory() call.
+                     */
+                    if(NULL == (info->retries[j] = (uint32_t *)H5MM_malloc(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 */
 
@@ -1590,6 +1606,8 @@ done:
 herr_t
 H5Fstart_swmr_write(hid_t file_id)
 {
+    hbool_t ci_load = FALSE;    /* whether MDC ci load requested */
+    hbool_t ci_write = FALSE;   /* whether MDC CI write requested */
     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 */
@@ -1599,7 +1617,7 @@ H5Fstart_swmr_write(hid_t file_id)
     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 */
+    H5F_io_info2_t fio_info;    /* I/O info for operation */
     herr_t ret_value = SUCCEED;	/* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -1607,31 +1625,37 @@ H5Fstart_swmr_write(hid_t 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")
+        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")
+        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")
+        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")
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file already in SWMR writing mode")
 
     HDassert(file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS);
 
+    /* Check to see if cache image is enabled.  Fail if so */
+    if(H5C_cache_image_status(file, &ci_load, &ci_write) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get MDC cache image status")
+    if(ci_load || ci_write )
+        HGOTO_ERROR(H5E_FILE, H5E_UNSUPPORTED, FAIL, "can't have both SWMR and MDC cache image")
+
     /* Flush data buffers */
-    if(H5F_flush(file, H5AC_ind_read_dxpl_id, FALSE) < 0)
+    if(H5F__flush(file, H5AC_ind_read_dxpl_id, H5AC_rawdata_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")
+        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)
@@ -1655,7 +1679,8 @@ H5Fstart_swmr_write(hid_t file_id)
         /* 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;
+            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];
@@ -1665,19 +1690,21 @@ H5Fstart_swmr_write(hid_t file_id)
             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);
+            /* 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")
+            /* 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_ind_read_dxpl_id)))
+    if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
 
     /* Flush and reset the accumulator */
@@ -1695,7 +1722,7 @@ H5Fstart_swmr_write(hid_t file_id)
 
     /* 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")
+        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;
@@ -1709,59 +1736,60 @@ H5Fstart_swmr_write(hid_t file_id)
         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_ind_read_dxpl_id) < 0)
-        HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
+    if(H5F_flush_tagged_metadata(file, H5AC__SUPERBLOCK_TAG, H5AC_ind_read_dxpl_id) < 0)
+        HGOTO_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_ind_read_dxpl_id) < 0)
+    if(H5F__evict_cache_entries(file, H5AC_ind_read_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++) {
+    for(u = 0; u < grp_dset_count; u++)
         if(H5O_refresh_metadata_reopen(obj_ids[u], &obj_glocs[u], H5AC_ind_read_dxpl_id, TRUE) < 0)
-	        HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't refresh-close object")
-    }
+            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")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to unlock the file")
+
 done:
     if(ret_value < 0 && setup) {
-	HDassert(file);
+        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")
 
-	/* 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")
 
-	/* 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;
 
-	/* 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);
 
-	/* 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")
 
-	/* 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, H5AC__SUPERBLOCK_TAG, H5AC_ind_read_dxpl_id) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
+    } /* end if */
 
-	/* Flush the superblock */
-	if(H5F_flush_tagged_metadata(file, (haddr_t)0, H5AC_ind_read_dxpl_id) < 0)
-	    HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
-    }
     /* Free memory */
     if(obj_ids)
-	H5MM_xfree(obj_ids);
+        H5MM_xfree(obj_ids);
     if(obj_glocs)
-	H5MM_xfree(obj_glocs);
+        H5MM_xfree(obj_glocs);
     if(obj_olocs)
-	H5MM_xfree(obj_olocs);
+        H5MM_xfree(obj_olocs);
     if(obj_paths)
-	H5MM_xfree(obj_paths);
+        H5MM_xfree(obj_paths);
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Fstart_swmr_write() */
@@ -1788,15 +1816,14 @@ H5Fstart_mdc_logging(hid_t 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")
+        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")
+        HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to start mdc logging")
 
 done:
     FUNC_LEAVE_API(ret_value)
-
 } /* H5Fstart_mdc_logging() */
 
 

@@ -1822,15 +1849,14 @@ H5Fstop_mdc_logging(hid_t 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")
+        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")
+        HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to stop mdc logging")
 
 done:
     FUNC_LEAVE_API(ret_value)
-
 } /* H5Fstop_mdc_logging() */
 
 

@@ -1857,16 +1883,56 @@ H5Fget_mdc_logging_status(hid_t file_id, hbool_t *is_enabled,
 
     /* 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")
+        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")
+        HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to get logging status")
 
 done:
     FUNC_LEAVE_API(ret_value)
+} /* H5Fget_mdc_logging_status() */
 
-} /* H5Fstop_mdc_logging() */
+

+/*-------------------------------------------------------------------------
+ * Function:   H5Fset_latest_format
+ *
+ * Purpose:    Enable switching the "latest format" flag while a file is open.
+ *
+ * Return:     Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ *             Monday, September 21, 2015
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fset_latest_format(hid_t file_id, hbool_t latest_format)
+{
+    H5F_t *f;                           /* File */
+    unsigned latest_flags;              /* Latest format flags for file */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ib", file_id, latest_format);
+
+    /* Check args */
+    if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Check if the value is changing */
+    latest_flags = H5F_USE_LATEST_FLAGS(f, H5F_LATEST_ALL_FLAGS);
+    if(latest_format != (H5F_LATEST_ALL_FLAGS == latest_flags)) {
+        /* Call the flush routine, for this file */
+        if(H5F__flush(f, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+
+        /* Toggle the 'latest format' flag */
+        H5F_SET_LATEST_FLAGS(f, latest_format ? H5F_LATEST_ALL_FLAGS : 0);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fset_latest_format() */
 
 

 /*-------------------------------------------------------------------------
@@ -1878,77 +1944,183 @@ done:
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Vailin Choi; Jan 2016
+ * Programmer:	Vailin Choi
+ *              Jan 2016
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Fformat_convert(hid_t fid)
 {
-    H5F_t	*f = NULL;              /* File to flush */
-    hbool_t	mark_dirty = FALSE;
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "i", fid);
 
-    switch(H5I_get_type(fid)) {
-        case H5I_FILE:
-            if(NULL == (f = (H5F_t *)H5I_object(fid)))
-                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+    if(H5I_FILE == H5I_get_type(fid)) {
+        H5F_t	*f;                     /* File to flush */
+        hbool_t	mark_dirty = FALSE;
+
+        /* Get file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
 
-	    if(f->shared->sblock->super_vers > HDF5_SUPERBLOCK_VERSION_V18_LATEST) {
-		f->shared->sblock->super_vers = HDF5_SUPERBLOCK_VERSION_V18_LATEST;
-		mark_dirty = TRUE;
-	    }
-
-            if(f->shared->fs_strategy == H5F_FILE_SPACE_STRATEGY_DEF &&
-	       f->shared->fs_threshold == H5F_FREE_SPACE_THRESHOLD_DEF) {
-		if(mark_dirty) {
-		    /* Mark superblock as dirty */
-		    if(H5F_super_dirty(f) < 0)
-			HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
-		}
-		HGOTO_DONE(SUCCEED)
-	    }
-
-	    /* Check to remove free-space manager info message from superblock extension */
-            if(H5F_addr_defined(f->shared->sblock->ext_addr)) {
+        /* Check if the superblock should be downgraded */
+        if(f->shared->sblock->super_vers > HDF5_SUPERBLOCK_VERSION_V18_LATEST) {
+            f->shared->sblock->super_vers = HDF5_SUPERBLOCK_VERSION_V18_LATEST;
+            mark_dirty = TRUE;
+        } /* end if */
+
+        /* Check for persistent freespace manager, which needs to be downgraded */
+        if(!(f->shared->fs_strategy == H5F_FILE_SPACE_STRATEGY_DEF &&
+             f->shared->fs_persist == H5F_FREE_SPACE_PERSIST_DEF &&
+             f->shared->fs_threshold == H5F_FREE_SPACE_THRESHOLD_DEF &&
+             f->shared->fs_page_size == H5F_FILE_SPACE_PAGE_SIZE_DEF)) {
+            /* 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, H5AC_ind_read_dxpl_id, H5O_FSINFO_ID) < 0)
                     HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "error in removing message from superblock extension")
-	    }
 
+            /* Close freespace manager */
             if(H5MF_try_close(f, H5AC_ind_read_dxpl_id) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to free free-space address")
 
+            /* Set non-persistent freespace manager */
             f->shared->fs_strategy = H5F_FILE_SPACE_STRATEGY_DEF;
+            f->shared->fs_persist = H5F_FREE_SPACE_PERSIST_DEF;
             f->shared->fs_threshold = H5F_FREE_SPACE_THRESHOLD_DEF;
+            f->shared->fs_page_size = H5F_FILE_SPACE_PAGE_SIZE_DEF;
 
-	    /* Mark superblock as dirty */
-	    if(H5F_super_dirty(f) < 0)
-		HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
-
-            break;
+            /* Indicate that the superblock should be marked dirty */
+            mark_dirty = TRUE;
+        } /* end if */
 
-        case H5I_GROUP:
-        case H5I_DATATYPE:
-        case H5I_DATASET:
-        case H5I_ATTR:
-        case H5I_UNINIT:
-        case H5I_BADID:
-        case H5I_DATASPACE:
-        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_BADTYPE, FAIL, "not a file or file object")
-    } /* end switch */
+        /* Check if we should mark the superblock dirty */
+        if(mark_dirty)
+            /* Mark superblock as dirty */
+            if(H5F_super_dirty(f) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+    } /* end if */
+    else
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
 
 done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Fformat_convert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Freset_page_buffering_stats
+ *
+ * Purpose:     Resets statistics for the page buffer layer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Freset_page_buffering_stats(hid_t file_id)
+{
+    H5F_t   *file;                      /* File to reset stats on */
+    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(file_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+    if(NULL == file->shared->page_buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "page buffering not enabled on file")
+
+    /* Reset the statistics */
+    if(H5PB_reset_stats(file->shared->page_buf) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't reset stats for page buffering")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Freset_page_buffering_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_page_buffering_stats
+ *
+ * Purpose:     Retrieves statistics for the page buffer layer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_page_buffering_stats(hid_t file_id, unsigned accesses[2], unsigned hits[2],
+    unsigned misses[2], unsigned evictions[2], unsigned bypasses[2])
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE6("e", "i*Iu*Iu*Iu*Iu*Iu", file_id, accesses, hits, misses, evictions,
+             bypasses);
+
+    /* 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(NULL == file->shared->page_buf)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "page buffering not enabled on file")
+    if(NULL == accesses || NULL == hits || NULL == misses || NULL == evictions || NULL == bypasses)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL input parameters for stats")
+
+    /* Get the statistics */
+    if(H5PB_get_stats(file->shared->page_buf, accesses, hits, misses, evictions, bypasses) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve stats for page buffering")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_page_buffering_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_mdc_image_info
+ *
+ * Purpose:     Retrieves the image_addr and image_len for the cache image in the file.
+ *              image_addr:  --base address of the on disk metadata cache image
+ *                           --HADDR_UNDEF if no cache image
+ *              image_len:   --size of the on disk metadata cache image
+ *                           --zero if no cache image
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Vailin Choi; March 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mdc_image_info(hid_t file_id, haddr_t *image_addr, hsize_t *image_len)
+{
+    H5F_t      *file;                   /* File object for file ID */
+    herr_t     ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*a*h", file_id, image_addr, image_len);
+
+    /* 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(NULL == image_addr || NULL == image_len)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL image addr or image len")
+
+    /* Go get the address and size of the cache image */
+    if(H5AC_get_mdc_image_info(file->shared->cache, image_addr, image_len) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't retrieve cache image info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Fget_mdc_image_info() */
+
diff --git a/src/H5FA.c b/src/H5FA.c
index 70a4b56..d421eec 100644
--- a/src/H5FA.c
+++ b/src/H5FA.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -64,6 +62,8 @@
 /********************/
 /* Local Prototypes */
 /********************/
+static H5FA_t *H5FA__new(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr,
+    hbool_t from_open, void *ctx_udata);
 
 
 /*********************/
@@ -103,60 +103,53 @@ H5FL_BLK_DEFINE(fa_native_elmt);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FA_create
+ * Function:	H5FA__new
  *
- * Purpose:     Creates a new fixed array (header) in the file.
+ * Purpose:	Allocate and initialize a new fixe array wrapper in memory
  *
- * Return:      Pointer to fixed array wrapper on success
+ * Return:	Pointer to farray wrapper success
  *              NULL on failure
  *
- * Programmer:  Vailin Choi
- *              Thursday, April 30, 2009
+ * Programmer:	Quincey Koziol
+ *		koziol at lbl.gov
+ *		Oct 17 2016
  *
  *-------------------------------------------------------------------------
  */
-BEGIN_FUNC(PRIV, ERR,
+BEGIN_FUNC(STATIC, ERR,
 H5FA_t *, NULL, NULL,
-H5FA_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam, void *ctx_udata))
+H5FA__new(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, hbool_t from_open, 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")
+    HDassert(H5F_addr_defined(fa_addr));
 
     /* Allocate fixed array wrapper */
-    if(NULL == (fa = H5FL_MALLOC(H5FA_t)))
-        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array info")
+    if(NULL == (fa = H5FL_CALLOC(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")
+    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")
+
+    /* Check for pending array deletion */
+    if(from_open && hdr->pending_delete)
+        H5E_THROW(H5E_CANTOPENOBJ, "can't open fixed array pending deletion")
 
     /* 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")
+	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")
+	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;
@@ -167,7 +160,57 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 CATCH
 
     if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
-        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+	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(STATIC)  /* end H5FA__new() */
+
+

+/*-------------------------------------------------------------------------
+ * 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 */
+    haddr_t fa_addr;            /* Fixed array header address */
+
+    /*
+     * 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 and initialize new fixed array wrapper */
+    if(NULL == (fa = H5FA__new(f, dxpl_id, fa_addr, FALSE, ctx_udata)))
+	H5E_THROW(H5E_CANTINIT, "allocation and/or initialization failed for fixed array wrapper")
+
+    /* Set the return value */
+    ret_value = fa;
+
+CATCH
+
     if(!ret_value)
         if(fa && H5FA_close(fa, dxpl_id) < 0)
             H5E_THROW(H5E_CLOSEERROR, "unable to close fixed array")
@@ -194,7 +237,6 @@ 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.
@@ -202,40 +244,15 @@ H5FA_open(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata))
     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;
+    /* Allocate and initialize new fixed array wrapper */
+    if(NULL == (fa = H5FA__new(f, dxpl_id, fa_addr, TRUE, ctx_udata)))
+	H5E_THROW(H5E_CANTINIT, "allocation and/or initialization failed for fixed array wrapper")
 
     /* 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")
@@ -261,10 +278,6 @@ 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.
      */
@@ -295,10 +308,6 @@ 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.
      */
@@ -336,11 +345,6 @@ H5FA_set(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, const void *elmt))
     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.
      */
@@ -352,9 +356,6 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
 
     /* 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))
@@ -449,11 +450,6 @@ H5FA_get(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, void *elmt))
     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.
      */
@@ -550,35 +546,33 @@ H5FA_close(H5FA_t *fa, hid_t dxpl_id))
     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;
+    /* Close the header, if it was set */
+    if(fa->hdr) {
+        /* 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 */
-    } /* end if */
 
-    /* Check for pending array deletion */
-    if(pending_delete) {
-        H5FA_hdr_t *hdr;            /* Another pointer to fixed array header */
+        /* Check for pending array deletion */
+        if(pending_delete) {
+            H5FA_hdr_t *hdr;            /* Another pointer to fixed array header */
 
 #ifndef NDEBUG
 {
@@ -595,33 +589,34 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 }
 #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")
+            /* 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;
+            /* 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")
+            /* 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")
+            /* 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 */
     } /* 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);
@@ -657,9 +652,6 @@ H5FA_delete(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata))
     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)
 
@@ -745,8 +737,8 @@ 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.
+ * Purpose:     Make a child flush dependency between the fixed array
+ *              and another piece of metadata in the file.
  *
  * Return:      SUCCEED/FAIL
  *
@@ -757,52 +749,34 @@ END_FUNC(PRIV)  /* end H5FA_iterate() */
  */
 BEGIN_FUNC(PRIV, ERR,
 herr_t, SUCCEED, FAIL,
-H5FA_depend(H5AC_info_t *parent_entry, H5FA_t *fa))
+H5FA_depend(H5FA_t *fa, hid_t dxpl_id, H5AC_proxy_entry_t *parent))
 
     /* 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));
+    HDassert(parent);
 
     /*
-     * 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.
+     * Check to see if a flush dependency between the fixed array
+     * and another data structure in the file has already been set up.
+     * If it hasn't, do so now.
      */
-    if(!H5F_addr_defined(hdr->fd_parent_addr)) {
+    if(NULL == hdr->parent) {
+        /* Sanity check */
+        HDassert(hdr->top_proxy);
+
         /* 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;
+        /* Add the fixed array as a child of the parent (proxy) */
+        if(H5AC_proxy_entry_add_child(parent, hdr->f, dxpl_id, hdr->top_proxy) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array as child of proxy")
+        hdr->parent = parent;
     } /* end if */
 
 CATCH
@@ -811,47 +785,6 @@ 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() */
-
-/*-------------------------------------------------------------------------
  * Function:    H5FA_patch_file
  *
  * Purpose:     Patch the top-level file pointer contained in fa
@@ -869,10 +802,6 @@ H5FA_patch_file(H5FA_t *fa, H5F_t *f))
 
     /* Local variables */
 
-#ifdef H5FA_DEBUG
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* H5FA_DEBUG */
-
     /*
      * Check arguments.
      */
diff --git a/src/H5FAcache.c b/src/H5FAcache.c
index b4e9dfc..19fdb74 100644
--- a/src/H5FAcache.c
+++ b/src/H5FAcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -71,45 +69,35 @@
 /********************/
 
 /* 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 herr_t H5FA__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5FA__cache_dblock_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5FA__cache_dblk_page_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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_notify(H5AC_notify_action_t action, void *thing);
 static herr_t H5FA__cache_dblk_page_free_icr(void *thing);
 
 
@@ -123,7 +111,8 @@ const H5AC_class_t H5AC_FARRAY_HDR[1] = {{
     "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_get_initial_load_size,      /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -131,7 +120,6 @@ const H5AC_class_t H5AC_FARRAY_HDR[1] = {{
     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 */
 }};
 
@@ -141,7 +129,8 @@ const H5AC_class_t H5AC_FARRAY_DBLOCK[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -149,7 +138,6 @@ const H5AC_class_t H5AC_FARRAY_DBLOCK[1] = {{
     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 */
 }};
 
@@ -159,15 +147,15 @@ const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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_notify,	/* 'notify' callback */
     H5FA__cache_dblk_page_free_icr,     /* 'free_icr' callback */
-    NULL,				/* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -184,7 +172,7 @@ const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FA__cache_hdr_get_load_size
+ * Function:    H5FA__cache_hdr_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -198,12 +186,9 @@ const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1] = {{
  */
 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))
+H5FA__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
@@ -211,15 +196,10 @@ H5FA__cache_hdr_get_load_size(const void *_image, void *_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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5FA_HEADER_SIZE_FILE(udata->f);
 
-END_FUNC(STATIC)   /* end H5FA__cache_hdr_get_load_size() */
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -385,8 +365,7 @@ END_FUNC(STATIC)   /* end H5FA__cache_hdr_deserialize() */
  */
 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))
+H5FA__cache_hdr_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5FA_hdr_t *hdr = (const H5FA_hdr_t *)_thing;      /* Pointer to the object */
@@ -488,34 +467,36 @@ H5FA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
         /* 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:
+            case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
                 /* 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.
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+                /* If hdr->parent != NULL, hdr->parent is used to destroy
+                 * the flush dependency before the 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)
+                if(hdr->parent) {
+                    /* Sanity check */
+                    HDassert(hdr->top_proxy);
+
+		    /* Destroy flush dependency on object header proxy */
+		    if(H5AC_proxy_entry_remove_child((H5AC_proxy_entry_t *)hdr->parent, (void *)hdr->top_proxy) < 0)
+		        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between fixed array and proxy")
+                    hdr->parent = NULL;
+		} /* end if */
+
+                /* Detach from 'top' proxy for fixed array */
+                if(hdr->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(hdr->top_proxy, hdr) < 0)
+                        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between header and fixed array 'top' proxy")
+                    /* Don't reset hdr->top_proxy here, it's destroyed when the header is freed -QAK */
                 } /* end if */
                 break;
 
@@ -527,10 +508,8 @@ H5FA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
 #endif /* NDEBUG */
         } /* end switch */
     } /* end if */
-    else {
-        HDassert(hdr->fd_parent_addr == HADDR_UNDEF);
-        HDassert(hdr->fd_parent_ptr == NULL);
-    } /* end else */
+    else
+        HDassert(NULL == hdr->parent);
 
 CATCH
 
@@ -568,7 +547,7 @@ END_FUNC(STATIC)   /* end H5FA__cache_hdr_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FA__cache_dblock_get_load_size
+ * Function:    H5FA__cache_dblock_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -582,12 +561,9 @@ END_FUNC(STATIC)   /* end H5FA__cache_hdr_free_icr() */
  */
 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))
+H5FA__cache_dblock_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
@@ -597,37 +573,30 @@ H5FA__cache_dblock_get_load_size(const void *_image, void *_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() */
+    /* 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);
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -780,8 +749,7 @@ END_FUNC(STATIC)   /* end H5FA__cache_dblock_deserialize() */
  */
 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))
+H5FA__cache_dblock_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5FA_dblock_t *dblock = (const H5FA_dblock_t *)_thing;      /* Pointer to the object */
@@ -872,7 +840,6 @@ CATCH
 
 END_FUNC(STATIC)   /* end H5FA__cache_dblock_serialize() */
 
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5FA__cache_dblock_notify
@@ -908,6 +875,12 @@ H5FA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
                 break;
 
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
                 /* do nothing */
                 break;
 
@@ -916,6 +889,12 @@ H5FA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
                 if(H5FA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
                     H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency")
 
+                /* Detach from 'top' proxy for fixed array */
+                if(dblock->top_proxy) {
+                    if(H5AC_proxy_entry_remove_child(dblock->top_proxy, dblock) < 0)
+                        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and fixed array 'top' proxy")
+                    dblock->top_proxy = NULL;
+                } /* end if */
                 break;
 
             default:
@@ -1012,7 +991,7 @@ END_FUNC(STATIC)   /* end H5FA__cache_dblock_fsf_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FA__cache_dblk_page_get_load_size
+ * Function:    H5FA__cache_dblk_page_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -1026,12 +1005,9 @@ END_FUNC(STATIC)   /* end H5FA__cache_dblock_fsf_size() */
  */
 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))
+H5FA__cache_dblk_page_get_initial_load_size(void *_udata, size_t *image_len))
 
     /* 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 */
@@ -1040,14 +1016,10 @@ H5FA__cache_dblk_page_get_load_size(const void *_image, void *_udata,
     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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5FA_DBLK_PAGE_SIZE(udata->hdr, udata->nelmts);
 
-END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_get_load_size() */
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -1173,8 +1145,7 @@ END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_deserialize() */
  */
 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))
+H5FA__cache_dblk_page_image_len(const void *_thing, size_t *image_len))
 
     /* Local variables */
     const H5FA_dblk_page_t *dblk_page = (const H5FA_dblk_page_t *)_thing;      /* Pointer to the object */
@@ -1242,6 +1213,68 @@ END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_serialize() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblk_page_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at lbl.gov
+ *		Oct 17 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblk_page_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5FA_dblk_page_t *dblk_page = (H5FA_dblk_page_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* 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:
+            /* Detach from 'top' proxy for fixed array */
+            if(dblk_page->top_proxy) {
+                if(H5AC_proxy_entry_remove_child(dblk_page->top_proxy, dblk_page) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and fixed array 'top' proxy")
+                dblk_page->top_proxy = NULL;
+            } /* end if */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        default:
+#ifdef NDEBUG
+            H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+            HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+    } /* end switch */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_notify() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5FA__cache_dblk_page_free_icr
  *
  * Purpose:	Destroy/release an "in core representation" of a data
@@ -1269,3 +1302,4 @@ H5FA__cache_dblk_page_free_icr(void *thing))
 CATCH
 
 END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_free_icr() */
+
diff --git a/src/H5FAdbg.c b/src/H5FAdbg.c
index 2dc51c5..7444eae 100644
--- a/src/H5FAdbg.c
+++ b/src/H5FAdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FAdblkpage.c b/src/H5FAdblkpage.c
index bba4439..baf4286 100644
--- a/src/H5FAdblkpage.c
+++ b/src/H5FAdblkpage.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -152,7 +150,8 @@ 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 */
+    H5FA_dblk_page_t *dblk_page = NULL; /* Fixed array data block page */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
 #ifdef H5FA_DEBUG
 HDfprintf(stderr, "%s: Called, addr = %a\n", FUNC, addr);
@@ -179,10 +178,23 @@ HDfprintf(stderr, "%s: dblk_page->size = %Zu\n", FUNC, dblk_page->size);
     /* 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")
+    inserted = TRUE;
+
+    /* Add data block page as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblk_page) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
+        dblk_page->top_proxy = hdr->top_proxy;
+    } /* end if */
 
 CATCH
     if(ret_value < 0)
         if(dblk_page) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(dblk_page) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove fixed array data block page from cache")
+
             /* Destroy data block page */
             if(H5FA__dblk_page_dest(dblk_page) < 0)
                 H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block page")
@@ -210,7 +222,8 @@ 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 */
+    H5FA_dblk_page_t *dblk_page = NULL;     /* Fixed array data block page */
+    H5FA_dblk_page_cache_ud_t udata;        /* Information needed for loading data block page */
 
 #ifdef H5FA_DEBUG
 HDfprintf(stderr, "%s: Called\n", FUNC);
@@ -229,11 +242,29 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (dblk_page = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == dblk_page->top_proxy) {
+        /* Add data block page as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblk_page) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
+        dblk_page->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dblk_page;
+
 CATCH
 
+    /* Clean up on error */
+    if(!ret_value) {
+        /* Release the data block page, if it was protected */
+        if(dblk_page && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect fixed array data block page, address = %llu", (unsigned long long)dblk_page->addr)
+    } /* end if */
+
 END_FUNC(PKG)   /* end H5FA__dblk_page_protect() */
 
 

@@ -306,6 +337,9 @@ H5FA__dblk_page_dest(H5FA_dblk_page_t *dblk_page))
         dblk_page->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == dblk_page->top_proxy);
+
     /* Free the data block page itself */
     dblk_page = H5FL_FREE(H5FA_dblk_page_t, dblk_page);
 
diff --git a/src/H5FAdblock.c b/src/H5FAdblock.c
index 95419f8..432bf58 100644
--- a/src/H5FAdblock.c
+++ b/src/H5FAdblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -189,12 +187,9 @@ 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 */
+    H5FA_dblock_t *dblock = NULL;       /* Fixed array data block */
+    haddr_t dblock_addr;                /* Fixed array data block address */
+    hbool_t inserted = FALSE;           /* Whether the header was inserted into cache */
 
     /* Sanity check */
     HDassert(hdr);
@@ -206,10 +201,6 @@ HDfprintf(stderr, "%s: Called, hdr->stats.nelmts = %Zu, nelmts = %Zu\n", FUNC, h
 
     /* 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)))
@@ -225,6 +216,14 @@ HDfprintf(stderr, "%s: dblock->size = %Zu\n", FUNC, dblock->size);
     /* 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")
+    inserted = TRUE;
+
+    /* Add data block as child of 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
+        dblock->top_proxy = hdr->top_proxy;
+    } /* end if */
 
     /* Mark the header dirty (for updating statistics) */
     *hdr_dirty = TRUE;
@@ -236,6 +235,11 @@ CATCH
 
     if(!H5F_addr_defined(ret_value))
         if(dblock) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(dblock) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove fixed array data block from cache")
+
             /* 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")
@@ -266,11 +270,8 @@ 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 */
+    H5FA_dblock_t *dblock;              /* Fixed array data block */
+    H5FA_dblock_cache_ud_t udata;       /* Information needed for loading data block */
 
     /* Sanity check */
     HDassert(hdr);
@@ -284,11 +285,28 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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)))
+    if(NULL == (dblock = (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)
 
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->top_proxy && NULL == dblock->top_proxy) {
+        /* Add data block as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, hdr->f, dxpl_id, dblock) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
+        dblock->top_proxy = hdr->top_proxy;
+    } /* end if */
+
+    /* Set return value */
+    ret_value = dblock;
+
 CATCH
 
+    /* Clean up on error */
+    if(!ret_value)
+        /* Release the data block, if it was protected */
+        if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FARRAY_DBLOCK, dblock->addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+            H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect fixed array data block, address = %llu", (unsigned long long)dblock->addr)
+
 END_FUNC(PKG)   /* end H5FA__dblock_protect() */
 
 

@@ -310,10 +328,6 @@ H5FA__dblock_unprotect(H5FA_dblock_t *dblock, hid_t dxpl_id, unsigned cache_flag
 
     /* Local variables */
 
-#ifdef H5FA_DEBUG
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* H5FA_DEBUG */
-
     /* Sanity check */
     HDassert(dblock);
 
@@ -345,10 +359,6 @@ 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));
@@ -367,16 +377,10 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
 
         /* 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;
@@ -434,6 +438,9 @@ H5FA__dblock_dest(H5FA_dblock_t *dblock))
         dblock->hdr = NULL;
     } /* end if */
 
+    /* Sanity check */
+    HDassert(NULL == dblock->top_proxy);
+
     /* Free the data block itself */
     dblock = H5FL_FREE(H5FA_dblock_t, dblock);
 
diff --git a/src/H5FAhdr.c b/src/H5FAhdr.c
index a71d92e..6809f02 100644
--- a/src/H5FAhdr.c
+++ b/src/H5FAhdr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -109,8 +107,6 @@ H5FA__hdr_alloc(H5F_t *f))
 
     /* 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;
@@ -122,6 +118,7 @@ H5FA__hdr_alloc(H5F_t *f))
     ret_value = hdr;
 
 CATCH
+
     if(!ret_value)
         if(hdr && H5FA__hdr_dest(hdr) < 0)
             H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array header")
@@ -186,10 +183,7 @@ H5FA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam,
 
     /* Local variables */
     H5FA_hdr_t *hdr = NULL;     /* Fixed array header */
-
-#ifdef H5FA_DEBUG
-HDfprintf(stderr, "%s: Called\n", FUNC);
-#endif /* H5FA_DEBUG */
+    hbool_t inserted = FALSE;   /* Whether the header was inserted into cache */
 
     /* Check arguments */
     HDassert(f);
@@ -224,16 +218,33 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
     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")
 
+    /* Create 'top' proxy for extensible array entries */
+    if(hdr->swmr_write)
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            H5E_THROW(H5E_CANTCREATE, "can't create fixed array entry proxy")
+
     /* 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")
+    inserted = TRUE;
+
+    /* Add header as child of 'top' proxy */
+    if(hdr->top_proxy)
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
 
     /* Set address of array header to return */
     ret_value = hdr->addr;
 
 CATCH
+
     if(!H5F_addr_defined(ret_value))
         if(hdr) {
+            /* Remove from cache, if inserted */
+            if(inserted)
+                if(H5AC_remove_entry(hdr) < 0)
+                    H5E_THROW(H5E_CANTREMOVE, "unable to remove fixed array header from cache")
+
             /* 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")
@@ -414,6 +425,7 @@ H5FA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata,
     unsigned flags))
 
     /* Local variables */
+    H5FA_hdr_t *hdr;            /* Fixed array header */
     H5FA_hdr_cache_ud_t udata;  /* User data for cache callbacks */
 
     /* Sanity check */
@@ -429,9 +441,23 @@ H5FA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata,
     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)))
+    if(NULL == (hdr = (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) */
+    hdr->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+    /* Create top proxy, if it doesn't exist */
+    if(hdr->swmr_write && NULL == hdr->top_proxy) {
+        /* Create 'top' proxy for fixed array entries */
+        if(NULL == (hdr->top_proxy = H5AC_proxy_entry_create()))
+            H5E_THROW(H5E_CANTCREATE, "can't create fixed array entry proxy")
+
+        /* Add header as child of 'top' proxy */
+        if(H5AC_proxy_entry_add_child(hdr->top_proxy, f, dxpl_id, hdr) < 0)
+            H5E_THROW(H5E_CANTSET, "unable to add fixed array entry as child of array proxy")
+    } /* end if */
+
+    /* Set return value */
+    ret_value = hdr;
 
 CATCH
 
@@ -508,10 +534,6 @@ H5FA__hdr_delete(H5FA_hdr_t *hdr, hid_t dxpl_id))
 
     /* 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")
@@ -556,6 +578,13 @@ H5FA__hdr_dest(H5FA_hdr_t *hdr))
     } /* end if */
     hdr->cb_ctx = NULL;
 
+    /* Destroy the 'top' proxy */
+    if(hdr->top_proxy) {
+        if(H5AC_proxy_entry_dest(hdr->top_proxy) < 0)
+            H5E_THROW(H5E_CANTRELEASE, "unable to destroy fixed array 'top' proxy")
+        hdr->top_proxy = NULL;
+    } /* end if */
+
     /* Free the shared info itself */
     hdr = H5FL_FREE(H5FA_hdr_t, hdr);
 
diff --git a/src/H5FAint.c b/src/H5FAint.c
index 331227b..9d3bce8 100644
--- a/src/H5FAint.c
+++ b/src/H5FAint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FAmodule.h b/src/H5FAmodule.h
index e46b071..f675faf 100644
--- a/src/H5FAmodule.h
+++ b/src/H5FAmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FApkg.h b/src/H5FApkg.h
index 890bf39..6f0a43a 100644
--- a/src/H5FApkg.h
+++ b/src/H5FApkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -137,7 +135,6 @@ typedef struct H5FA_hdr_t {
     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                                       */
@@ -146,32 +143,27 @@ typedef struct H5FA_hdr_t {
     /* 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)
-                                         */
+    /* SWMR / Flush dependency information (not stored) */
+    hbool_t swmr_write;                 /* Flag indicating the file is opened with SWMR-write access    */
+    H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
+    void *parent;		        /* Pointer to 'top' proxy flush dependency
+                                         * parent, if it exists, otherwise NULL.
+                                         * If the fixed array is being used
+                                         * to index a chunked dataset 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.
+					 */
 } H5FA_hdr_t;
 
 /* The fixed array data block information */
@@ -186,6 +178,9 @@ typedef struct H5FA_dblock_t {
     /* Internal array information (not stored) */
     H5FA_hdr_t    *hdr;            /* Shared array header info                              */
 
+    /* SWMR / Flush dependency information (not stored) */
+    H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
+
     /* Computed/cached values (not stored) */
     haddr_t     addr;               /* Address of this data block on disk                   */
     hsize_t     size;               /* Size of data block on disk                           */
@@ -209,6 +204,9 @@ typedef struct H5FA_dbk_page_t {
     /* Internal array information (not stored) */
     H5FA_hdr_t    *hdr;         /* Shared array header info                     */
 
+    /* SWMR / Flush dependency information (not stored) */
+    H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
+
     /* 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              */
@@ -249,15 +247,6 @@ typedef struct 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];
 
diff --git a/src/H5FAprivate.h b/src/H5FAprivate.h
index 2ce9cbb..1e44126 100644
--- a/src/H5FAprivate.h
+++ b/src/H5FAprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -127,7 +125,7 @@ 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_depend(H5FA_t *fa, hid_t dxpl_id, H5AC_proxy_entry_t *parent);
 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);
diff --git a/src/H5FAstat.c b/src/H5FAstat.c
index 72fa0de..3c06855 100644
--- a/src/H5FAstat.c
+++ b/src/H5FAstat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FAtest.c b/src/H5FAtest.c
index 091f284..3c6d8e4 100644
--- a/src/H5FAtest.c
+++ b/src/H5FAtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FD.c b/src/H5FD.c
index 1a63795..dcfaa6d 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -498,8 +496,7 @@ H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf)
     FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(file && file->cls);
-    if(file->cls->sb_encode &&
-            (file->cls->sb_encode)(file, name/*out*/, buf/*out*/) < 0)
+    if(file->cls->sb_encode && (file->cls->sb_encode)(file, name/*out*/, buf/*out*/) < 0)
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_encode request failed")
 
 done:
@@ -811,6 +808,9 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     if(NULL == (file = (driver->open)(name, flags, fapl_id, maxaddr)))
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "open failed")
 
+    /* Set the file access flags */
+    file->access_flags = flags;
+
     /*
      * 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.
@@ -840,10 +840,6 @@ 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;
 
@@ -1532,7 +1528,7 @@ herr_t
 H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
 	 void *buf/*out*/)
 {
-    H5P_genplist_t *dxpl;               /* DXPL object */
+    H5FD_io_info_t fdio_info;           /* File driver I/O object */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -1551,13 +1547,24 @@ H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size
     if(!buf)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null result buffer")
 
-    /* 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")
+    /* Set up the file driver I/O info object */
+    fdio_info.file = file;
+    if(H5FD_MEM_DRAW == type) {
+        if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end if */
+    else {
+        if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end else */
 
     /* Do the real work */
     /* (Note compensating for base address addition in internal routine) */
-    if(H5FD_read(file, dxpl, type, addr - file->base_addr, size, buf) < 0)
+    if(H5FD_read(&fdio_info, type, addr - file->base_addr, size, buf) < 0)
 	HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "file read request failed")
 
 done:
@@ -1586,7 +1593,7 @@ herr_t
 H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
 	  const void *buf)
 {
-    H5P_genplist_t *dxpl;               /* DXPL object */
+    H5FD_io_info_t fdio_info;           /* File driver I/O object */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -1604,13 +1611,24 @@ H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t siz
     if(!buf)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null buffer")
 
-    /* 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")
+    /* Set up the file driver I/O info object */
+    fdio_info.file = file;
+    if(H5FD_MEM_DRAW == type) {
+        if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end if */
+    else {
+        if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end else */
 
     /* The real work */
     /* (Note compensating for base address addition in internal routine) */
-    if(H5FD_write(file, dxpl, type, addr - file->base_addr, size, buf) < 0)
+    if(H5FD_write(&fdio_info, type, addr - file->base_addr, size, buf) < 0)
 	HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "file write request failed")
 
 done:
@@ -1638,12 +1656,12 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FDflush(H5FD_t *file, hid_t dxpl_id, unsigned closing)
+H5FDflush(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
 {
     herr_t ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_API(FAIL)
-    H5TRACE3("e", "*xiIu", file, dxpl_id, closing);
+    H5TRACE3("e", "*xib", file, dxpl_id, closing);
 
     /* Check args */
     if(!file || !file->cls)
@@ -1677,7 +1695,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_flush(H5FD_t *file, hid_t dxpl_id, unsigned closing)
+H5FD_flush(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
@@ -2034,3 +2052,27 @@ H5FD_get_base_addr(const H5FD_t *file)
     FUNC_LEAVE_NOAPI(file->base_addr)
 } /* end H5FD_get_base_addr() */
 
+

+/*--------------------------------------------------------------------------
+ * Function:    H5FD_set_paged_aggr
+ *
+ * Purpose:     Set "paged_aggr" for the file.
+ *
+ * Return:      Non-negative if succeed; negative if fails.
+ *
+ * Programmer:  Vailin Choi; April 2013
+ *
+ *--------------------------------------------------------------------------
+ */
+herr_t
+H5FD_set_paged_aggr(H5FD_t *file, hbool_t paged)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+
+    /* Indicate whether paged aggregation for handling file space is enabled or not */
+    file->paged_aggr = paged;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_set_paged_aggr() */
diff --git a/src/H5FDcore.c b/src/H5FDcore.c
index 778baa0..d100a8b 100644
--- a/src/H5FDcore.c
+++ b/src/H5FDcore.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -139,7 +137,7 @@ static herr_t H5FD__core_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, had
             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,
             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_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t 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);
@@ -203,9 +201,6 @@ H5FD__core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
     haddr_t     a_addr          = 0;
     hbool_t     create_new_node = TRUE;
     herr_t      ret_value       = SUCCEED;
-#ifdef DER
-    hbool_t     was_adjusted    = FALSE;
-#endif
 
     FUNC_ENTER_STATIC
 
@@ -213,34 +208,15 @@ H5FD__core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
     HDassert(file->dirty_list);
     HDassert(start <= end);
 
-#ifdef DER
-fprintf(stderr, "Add region: (%llu, %llu)\n", start, end);
-#endif
-
     /* Adjust the dirty region to the nearest block boundaries */
-    if(start % file->bstore_page_size != 0) {
+    if(start % file->bstore_page_size != 0)
         start = (start / file->bstore_page_size) * file->bstore_page_size;
-#ifdef DER
-        was_adjusted = TRUE;
-#endif
-    }
+
     if(end % file->bstore_page_size != (file->bstore_page_size - 1)) {
         end = (((end / file->bstore_page_size) + 1) * file->bstore_page_size) - 1;
-        if(end > file->eof){
-#ifdef DER
-fprintf(stderr, "Adjusted to EOF\n");
-#endif
+        if(end > file->eof)
             end = file->eof - 1;
-        }
-#ifdef DER
-        was_adjusted = TRUE;
-#endif
-    }
-
-#ifdef DER
-if(was_adjusted)
-    fprintf(stderr, "Adjusted region: (%llu, %llu)\n", start, end);
-#endif
+    } /* end if */
 
     /* Get the regions before and after the intended insertion point */
     b_addr = start +1;
@@ -249,15 +225,13 @@ if(was_adjusted)
     a_item = (H5FD_core_region_t *)H5SL_less(file->dirty_list, &a_addr);
 
     /* Check to see if we need to extend the upper end of the NEW region */
-    if(a_item) {
+    if(a_item)
         if(start < a_item->start && end < a_item->end) {
-
             /* Extend the end of the NEW region to match the existing AFTER region */
             end = a_item->end;
-        }
-    }
+        } /* end if */
     /* Attempt to extend the PREV region */
-    if(b_item) {
+    if(b_item)
         if(start <= b_item->end + 1) {
 
             /* Need to set this for the delete algorithm */
@@ -267,8 +241,7 @@ if(was_adjusted)
              * just update an existing one instead.
              */
             create_new_node = FALSE;
-        }
-    }
+        } /* end if */
 
     /* Remove any old nodes that are no longer needed */
     while(a_item && a_item->start > start) {
@@ -286,7 +259,7 @@ if(was_adjusted)
         /* Set up to check the next node */
         if(less)
             a_item = less;
-    }
+    } /* end while */
 
     /* Insert the new node */
     if(create_new_node) {
@@ -296,18 +269,18 @@ if(was_adjusted)
             item->start = start;
             item->end = end;
             if(H5SL_insert(file->dirty_list, item, &item->start) < 0)
-                HGOTO_ERROR(H5E_SLIST, H5E_CANTINSERT, FAIL, "can't insert new dirty region: (%llu, %llu)\n", start, end)
-        }
+                HGOTO_ERROR(H5E_SLIST, H5E_CANTINSERT, FAIL, "can't insert new dirty region: (%llu, %llu)\n", (unsigned long long)start, (unsigned long long)end)
+        } /* end if */
         else {
             /* Store the new item endpoint if it's bigger */
             item->end = (item->end < end) ? end : item->end;
-        }
-    }
+        } /* end else */
+    } /* end if */
     else {
         /* Update the size of the before region */
         if(b_item->end < end)
             b_item->end = end;
-    }
+    } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -336,20 +309,13 @@ H5FD__core_destroy_dirty_list(H5FD_core_t *file)
     if(file->dirty_list) {
         H5FD_core_region_t *region = NULL;
 
-#ifdef DER
-{
-size_t count = H5SL_count(file->dirty_list);
-if(count != 0)
-    fprintf(stderr, "LIST NOT EMPTY AT DESTROY\n");
-}
-#endif
         while(NULL != (region = (H5FD_core_region_t *)H5SL_remove_first(file->dirty_list)))
             region = H5FL_FREE(H5FD_core_region_t, region);
 
         if(H5SL_close(file->dirty_list) < 0)
             HGOTO_ERROR(H5E_SLIST, H5E_CLOSEERROR, FAIL, "can't close core vfd dirty list")
         file->dirty_list = NULL;
-    }
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -394,14 +360,8 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
         else
             bytes_in = (h5_posix_io_t)size;
 
-#ifdef DER
-fprintf(stderr, "\nNEW\n");
-#endif
         do {
             bytes_wrote = HDwrite(file->fd, ptr, bytes_in);
-#ifdef DER
-fprintf(stderr, "bytes wrote: %lu\n", bytes_wrote);
-#endif
         } while(-1 == bytes_wrote && EINTR == errno);
 
         if(-1 == bytes_wrote) { /* error */
@@ -755,11 +715,11 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
             /* Allocate memory for the file's data, using the file image callback if available. */
             if(file->fi_callbacks.image_malloc) {
                 if(NULL == (file->mem = (unsigned char*)file->fi_callbacks.image_malloc(size, H5FD_FILE_IMAGE_OP_FILE_OPEN, file->fi_callbacks.udata)))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "image malloc callback failed")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "image malloc callback failed")
             } /* end if */
             else {
                 if(NULL == (file->mem = (unsigned char*)H5MM_malloc(size)))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "unable to allocate memory block")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "unable to allocate memory block")
             } /* end else */
 
             /* Set up data structures */
@@ -844,9 +804,6 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
         if(use_write_tracking) {
             if(NULL == (file->dirty_list = H5SL_create(H5SL_TYPE_HADDR, NULL)))
                 HGOTO_ERROR(H5E_SLIST, H5E_CANTCREATE, NULL, "can't create core vfd dirty region list");
-#ifdef DER
-fprintf(stderr, "\n");
-#endif
         } /* end if */
     } /* end if */
 
@@ -1288,11 +1245,11 @@ H5FD__core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
         /* (Re)allocate memory for the file buffer, using callbacks if available */
         if(file->fi_callbacks.image_realloc) {
             if(NULL == (x = (unsigned char *)file->fi_callbacks.image_realloc(file->mem, new_eof, H5FD_FILE_IMAGE_OP_FILE_RESIZE, file->fi_callbacks.udata)))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes with callback", (unsigned long long)new_eof)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes with callback", (unsigned long long)new_eof)
         } /* end if */
         else {
             if(NULL == (x = (unsigned char *)H5MM_realloc(file->mem, new_eof)))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes", (unsigned long long)new_eof)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate memory block of %llu bytes", (unsigned long long)new_eof)
         } /* end else */
 
         HDmemset(x + file->eof, 0, (size_t)(new_eof - file->eof));
@@ -1307,7 +1264,7 @@ H5FD__core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
         haddr_t end = addr + (haddr_t)size - 1;
 
         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)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTINSERT, FAIL, "unable to add core VFD dirty region during write call - addresses: start=%llu end=%llu", (unsigned long long)start, (unsigned long long)end)
     }
 
     /* Write from BUF to memory */
@@ -1335,7 +1292,7 @@ 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, hbool_t H5_ATTR_UNUSED closing)
 {
     H5FD_core_t *file = (H5FD_core_t*)_file;
     herr_t      ret_value = SUCCEED;            /* Return value */
@@ -1350,9 +1307,6 @@ H5FD__core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_U
             H5FD_core_region_t *item = NULL;
             size_t size;
 
-#ifdef DER
-    fprintf(stderr, "FLUSHING. DIRTY LIST:\n");
-#endif
             while(NULL != (item = (H5FD_core_region_t *)H5SL_remove_first(file->dirty_list))) {
 
                 /* The file may have been truncated, so check for that
@@ -1362,11 +1316,8 @@ H5FD__core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_U
                     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)
                         HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "unable to write to backing store")
                 } /* end if */
@@ -1374,13 +1325,6 @@ fprintf(stderr, "(%llu, %llu : %lu)\n", item->start, item->end, size);
                 item = H5FL_FREE(H5FD_core_region_t, item);
            } /* end while */
 
-#ifdef DER
-fprintf(stderr, "EOF: %llu\n", file->eof);
-fprintf(stderr, "EOA: %llu\n", file->eoa);
-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 {
@@ -1460,11 +1404,11 @@ H5FD__core_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing
             /* (Re)allocate memory for the file buffer, using callback if available */
             if(file->fi_callbacks.image_realloc) {
                 if(NULL == (x = (unsigned char *)file->fi_callbacks.image_realloc(file->mem, new_eof, H5FD_FILE_IMAGE_OP_FILE_RESIZE, file->fi_callbacks.udata)))
-                  HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block with callback")
+                  HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate memory block with callback")
             } /* end if */
             else {
                 if(NULL == (x = (unsigned char *)H5MM_realloc(file->mem, new_eof)))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate memory block")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate memory block")
             } /* end else */
 
             if(file->eof < new_eof)
@@ -1504,9 +1448,6 @@ H5FD__core_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing
                     HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
 #endif /* H5_HAVE_WIN32_API */
 
-#ifdef DER
-fprintf(stderr, "OLD: Truncated to: %llu\n", file->eoa);
-#endif
             } /* end if */
 
             /* Update the eof value */
@@ -1536,23 +1477,31 @@ done:
 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 */
+    H5FD_core_t *file = (H5FD_core_t*)_file;    /* VFD file struct          */
+    int lock_flags;                             /* file locking flags       */
+    herr_t ret_value = SUCCEED;                 /* Return value             */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     HDassert(file);
+
+    /* Only set the lock if there is a file descriptor. If no file
+     * descriptor, this is a no-op.
+     */
     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 */
+        /* Set exclusive or shared lock based on rw status */
+        lock_flags = rw ? LOCK_EX : LOCK_SH;
+
+        /* Place a non-blocking lock on the file */
+        if(HDflock(file->fd, lock_flags | LOCK_NB) < 0) {
+            if(ENOSYS == errno)
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+            else
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to lock file")
+        } /* end if */
+
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1582,11 +1531,16 @@ H5FD_core_unlock(H5FD_t *_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 */
+        if(HDflock(file->fd, LOCK_UN) < 0) {
+            if(ENOSYS == errno)
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+            else
+                HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to unlock file")
+        } /* end if */
+
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_core_unlock() */
+
diff --git a/src/H5FDcore.h b/src/H5FDcore.h
index 16cce89..5fe2912 100644
--- a/src/H5FDcore.h
+++ b/src/H5FDcore.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDdirect.c b/src/H5FDdirect.c
index 27088a4..1487cda 100644
--- a/src/H5FDdirect.c
+++ b/src/H5FDdirect.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -526,6 +524,9 @@ H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxadd
      * is to handle correctly the case that the file is in a different file system
      * than the one where the program is running.
      */
+    /* NOTE: Use HDmalloc and HDfree here to ensure compatibility with
+     *       HDposix_memalign.
+     */
     buf1 = (int *)HDmalloc(sizeof(int));
     if(HDposix_memalign(&buf2, file->fa.mboundary, file->fa.fbsize) != 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "HDposix_memalign failed")
@@ -697,7 +698,6 @@ H5FD_direct_query(const H5FD_t H5_ATTR_UNUSED * _f, unsigned long *flags /* out
         *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)
@@ -993,6 +993,7 @@ H5FD_direct_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
       addr = (haddr_t)(((addr + size - 1) / _fbsize + 1) * _fbsize);
 
       if(copy_buf) {
+                /* Free with HDfree since it came from posix_memalign */
                 HDfree(copy_buf);
                 copy_buf = NULL;
             } /* end if */
@@ -1004,6 +1005,7 @@ H5FD_direct_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
 
 done:
     if(ret_value<0) {
+        /* Free with HDfree since it came from posix_memalign */
         if(copy_buf)
             HDfree(copy_buf);
 
@@ -1224,6 +1226,7 @@ H5FD_direct_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_U
   buf = (const char*)buf + size;
 
   if(copy_buf) {
+    /* Free with HDfree since it came from posix_memalign */
       HDfree(copy_buf);
       copy_buf = NULL;
         } /* end if */
@@ -1237,6 +1240,7 @@ H5FD_direct_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_U
 
 done:
     if(ret_value<0) {
+        /* Free with HDfree since it came from posix_memalign */
         if(copy_buf)
             HDfree(copy_buf);
 
diff --git a/src/H5FDdirect.h b/src/H5FDdirect.h
index 5ceb91f..805f3be 100644
--- a/src/H5FDdirect.h
+++ b/src/H5FDdirect.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDdrvr_module.h b/src/H5FDdrvr_module.h
index 8bb83a1..59a419e 100644
--- a/src/H5FDdrvr_module.h
+++ b/src/H5FDdrvr_module.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDfamily.c b/src/H5FDfamily.c
index b92a685..98ece84 100644
--- a/src/H5FDfamily.c
+++ b/src/H5FDfamily.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -46,10 +44,8 @@
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"		/* Property lists			*/
 
-#undef MAX
-#define MAX(X,Y)	((X)>(Y)?(X):(Y))
-#undef MIN
-#define MIN(X,Y)	((X)<(Y)?(X):(Y))
+/* The size of the member name buffers */
+#define H5FD_FAM_MEMB_NAME_BUF_SIZE 4096
 
 /* The driver identification number, initialized at runtime */
 static hid_t H5FD_FAMILY_g = 0;
@@ -104,8 +100,8 @@ static herr_t H5FD_family_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, ha
 			       size_t size, void *_buf/*out*/);
 static herr_t H5FD_family_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
 				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_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
 static herr_t H5FD_family_lock(H5FD_t *_file, hbool_t rw);
 static herr_t H5FD_family_unlock(H5FD_t *_file);
 
@@ -623,11 +619,11 @@ static H5FD_t *
 H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
 		 haddr_t maxaddr)
 {
-    H5FD_family_t	*file=NULL;
-    H5FD_t     		*ret_value=NULL;
-    char		memb_name[4096], temp[4096];
-    hsize_t		eof=HADDR_UNDEF;
+    H5FD_family_t	*file = NULL;
+    char		*memb_name = NULL, *temp = NULL;
+    hsize_t		eof = HADDR_UNDEF;
     unsigned		t_flags = flags & ~H5F_ACC_CREAT;
+    H5FD_t     		*ret_value = NULL;
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -683,15 +679,21 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
     file->name = H5MM_strdup(name);
     file->flags = flags;
 
+    /* Allocate space for the string buffers */
+    if(NULL == (memb_name = (char *)H5MM_malloc(H5FD_FAM_MEMB_NAME_BUF_SIZE)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "unable to allocate member name")
+    if(NULL == (temp = (char *)H5MM_malloc(H5FD_FAM_MEMB_NAME_BUF_SIZE)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "unable to allocate temporary member name")
+
     /* Check that names are unique */
-    HDsnprintf(memb_name, sizeof(memb_name), name, 0);
-    HDsnprintf(temp, sizeof(temp), name, 1);
+    HDsnprintf(memb_name, H5FD_FAM_MEMB_NAME_BUF_SIZE, name, 0);
+    HDsnprintf(temp, H5FD_FAM_MEMB_NAME_BUF_SIZE, name, 1);
     if(!HDstrcmp(memb_name, temp))
         HGOTO_ERROR(H5E_FILE, H5E_FILEEXISTS, NULL, "file names not unique")
 
     /* Open all the family members */
     while(1) {
-        HDsnprintf(memb_name, sizeof(memb_name), name, file->nmembs);
+        HDsnprintf(memb_name, H5FD_FAM_MEMB_NAME_BUF_SIZE, name, file->nmembs);
 
         /* Enlarge member array */
         if(file->nmembs >= file->amembs) {
@@ -732,6 +734,12 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
     ret_value=(H5FD_t *)file;
 
 done:
+    /* Release resources */
+    if(memb_name)
+        H5MM_xfree(memb_name);
+    if(temp)
+        H5MM_xfree(temp);
+
     /* Cleanup and fail */
     if(ret_value == NULL && file != NULL) {
         unsigned nerrors = 0;   /* Number of errors closing member files */
@@ -941,12 +949,16 @@ H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t abs_eoa)
 {
     H5FD_family_t	*file = (H5FD_family_t*)_file;
     haddr_t		addr = abs_eoa;
-    char		memb_name[4096];
+    char		*memb_name = NULL;
     unsigned		u;                      /* Local index variable */
     herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
+    /* Allocate space for the member name buffer */
+    if(NULL == (memb_name = (char *)H5MM_malloc(H5FD_FAM_MEMB_NAME_BUF_SIZE)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate member name")
+
     for(u = 0; addr || u < file->nmembs; u++) {
 
         /* Enlarge member array */
@@ -964,7 +976,7 @@ H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t abs_eoa)
         /* Create another file if necessary */
         if(u >= file->nmembs || !file->memb[u]) {
             file->nmembs = MAX(file->nmembs, u+1);
-            HDsnprintf(memb_name, sizeof(memb_name), file->name, u);
+            HDsnprintf(memb_name, H5FD_FAM_MEMB_NAME_BUF_SIZE, file->name, u);
             H5E_BEGIN_TRY {
                 H5_CHECK_OVERFLOW(file->memb_size, hsize_t, haddr_t);
                 file->memb[u] = H5FDopen(memb_name, file->flags | H5F_ACC_CREAT,
@@ -992,6 +1004,10 @@ H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t abs_eoa)
     file->eoa = abs_eoa;
 
 done:
+    /* Release resources */
+    if(memb_name)
+        H5MM_xfree(memb_name);
+
     FUNC_LEAVE_NOAPI(ret_value)
 }
 
@@ -1249,7 +1265,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_family_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+H5FD_family_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
 {
     H5FD_family_t	*file = (H5FD_family_t*)_file;
     unsigned		u, nerrors = 0;
@@ -1284,7 +1300,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
 {
     H5FD_family_t	*file = (H5FD_family_t*)_file;
     unsigned		u, nerrors = 0;
@@ -1321,33 +1337,37 @@ done:
 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 */
+    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
 
     /* Place the lock on all the member files */
-    for(u = 0; u < file->nmembs; u++) {
-        if(file->memb[u]) {
+    for(u = 0; u < file->nmembs; u++)
+        if(file->memb[u])
             if(H5FD_lock(file->memb[u], rw) < 0)
-		break;
-        } /* end if */
-    } /* end for */
+                break;
 
-    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")
+    /* If one of the locks failed, try to unlock the locked member files
+     * in an attempt to return to a fully unlocked state.
+     */
+    if(u < file->nmembs) {
+        unsigned v;                         /* Local index variable */
+
+        for(v = 0; v < u; v++) {
+            if(H5FD_unlock(file->memb[v]) < 0)
+                /* Push error, but keep going */
+                HDONE_ERROR(H5E_IO, H5E_CANTUNLOCK, FAIL, "unable to unlock member files")
+        } /* end for */
+        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
  *
@@ -1363,19 +1383,18 @@ 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 */
+    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]) {
+    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 */
+                HGOTO_ERROR(H5E_IO, H5E_CANTUNLOCK, FAIL, "unable to unlock member files")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_family_unlock() */
+
diff --git a/src/H5FDfamily.h b/src/H5FDfamily.h
index 80969c3..1584cf6 100644
--- a/src/H5FDfamily.h
+++ b/src/H5FDfamily.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDint.c b/src/H5FDint.c
index 4ce8ceb..bc322d6 100644
--- a/src/H5FDint.c
+++ b/src/H5FDint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -93,8 +91,9 @@
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_addr)
+H5FD_locate_signature(H5FD_io_info_t *fdio_info, haddr_t *sig_addr)
 {
+    H5FD_t         *file;
     haddr_t         addr, eoa, eof;
     uint8_t         buf[H5F_SIGNATURE_LEN];
     unsigned        n, maxpow;
@@ -102,6 +101,10 @@ H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_add
 
     FUNC_ENTER_NOAPI_NOINIT
 
+    HDassert(fdio_info);
+    file = fdio_info->file;
+    HDassert(file);
+
     /* Find the least N such that 2^N is larger than the file size */
     eof = H5FD_get_eof(file, H5FD_MEM_SUPER);
     eoa = H5FD_get_eoa(file, H5FD_MEM_SUPER);
@@ -120,7 +123,7 @@ H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_add
         addr = (8 == n) ? 0 : (haddr_t)1 << n;
         if(H5FD_set_eoa(file, H5FD_MEM_SUPER, addr + H5F_SIGNATURE_LEN) < 0)
             HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to set EOA value for file signature")
-        if(H5FD_read(file, dxpl, H5FD_MEM_SUPER, addr, (size_t)H5F_SIGNATURE_LEN, buf) < 0)
+        if(H5FD_read(fdio_info, H5FD_MEM_SUPER, addr, (size_t)H5F_SIGNATURE_LEN, buf) < 0)
             HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to read file signature")
         if(!HDmemcmp(buf, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN))
             break;
@@ -158,25 +161,36 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t addr,
+H5FD_read(H5FD_io_info_t *fdio_info, H5FD_mem_t type, haddr_t addr,
     size_t size, void *buf/*out*/)
 {
+    H5FD_t      *file;
+    H5P_genplist_t *io_dxpl;
     haddr_t     eoa = HADDR_UNDEF;
     herr_t      ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    HDassert(fdio_info);
+    file = fdio_info->file;
     HDassert(file && file->cls);
-    HDassert(TRUE == H5P_class_isa(H5P_CLASS(dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(fdio_info->meta_dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(fdio_info->raw_dxpl), H5P_CLS_DATASET_XFER_g));
     HDassert(buf);
 
+    /* Set up proper DXPL for I/O */
+    if(H5FD_MEM_DRAW == type)
+        io_dxpl = fdio_info->raw_dxpl;
+    else
+        io_dxpl = fdio_info->meta_dxpl;
+
     /* Sanity check the dxpl type against the mem type */
 #ifdef H5_DEBUG_BUILD
     {
         H5FD_dxpl_type_t dxpl_type;    /* Property indicating the type of the internal dxpl */
 
         /* get the dxpl type */
-        if(H5P_get(dxpl, H5FD_DXPL_TYPE_NAME, &dxpl_type) < 0)
+        if(H5P_get(io_dxpl, H5FD_DXPL_TYPE_NAME, &dxpl_type) < 0)
             HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't retrieve dxpl type")
 
         /* we shouldn't be here if the dxpl is labeled with NO I/O */
@@ -186,7 +200,6 @@ H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t add
             HDassert(H5FD_RAWDATA_DXPL == dxpl_type);
         else
             HDassert(H5FD_METADATA_DXPL == dxpl_type);
-
     }
 #endif /* H5_DEBUG_BUILD */
 
@@ -208,12 +221,11 @@ H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t add
      * 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)
+    if(!(file->access_flags & H5F_ACC_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)
 
     /* Dispatch to driver */
-    if((file->cls->read)(file, type, H5P_PLIST_ID(dxpl), addr + file->base_addr, size, buf) < 0)
+    if((file->cls->read)(file, type, H5P_PLIST_ID(io_dxpl), addr + file->base_addr, size, buf) < 0)
         HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "driver read request failed")
 
 done:
@@ -235,25 +247,36 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t addr,
+H5FD_write(const H5FD_io_info_t *fdio_info, H5FD_mem_t type, haddr_t addr,
     size_t size, const void *buf)
 {
+    H5FD_t      *file;
+    H5P_genplist_t *io_dxpl;
     haddr_t     eoa = HADDR_UNDEF;
     herr_t      ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    HDassert(fdio_info);
+    file = fdio_info->file;
     HDassert(file && file->cls);
-    HDassert(TRUE == H5P_class_isa(H5P_CLASS(dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(fdio_info->meta_dxpl), H5P_CLS_DATASET_XFER_g));
+    HDassert(TRUE == H5P_class_isa(H5P_CLASS(fdio_info->raw_dxpl), H5P_CLS_DATASET_XFER_g));
     HDassert(buf);
 
+    /* Set up proper DXPL for I/O */
+    if(H5FD_MEM_DRAW == type)
+        io_dxpl = fdio_info->raw_dxpl;
+    else
+        io_dxpl = fdio_info->meta_dxpl;
+
     /* Sanity check the dxpl type against the mem type */
 #ifdef H5_DEBUG_BUILD
     {
         H5FD_dxpl_type_t dxpl_type;    /* Property indicating the type of the internal dxpl */
 
         /* get the dxpl type */
-        if(H5P_get(dxpl, H5FD_DXPL_TYPE_NAME, &dxpl_type) < 0)
+        if(H5P_get(io_dxpl, H5FD_DXPL_TYPE_NAME, &dxpl_type) < 0)
             HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't retrieve dxpl type")
 
         /* we shouldn't be here if the dxpl is labeled with NO I/O */
@@ -281,7 +304,7 @@ H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t ad
                     (unsigned long long)(addr+ file->base_addr), (unsigned long long)size, (unsigned long long)eoa)
 
     /* Dispatch to driver */
-    if((file->cls->write)(file, type, H5P_PLIST_ID(dxpl), addr + file->base_addr, size, buf) < 0)
+    if((file->cls->write)(file, type, H5P_PLIST_ID(io_dxpl), addr + file->base_addr, size, buf) < 0)
         HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "driver write request failed")
 
 done:
diff --git a/src/H5FDlog.c b/src/H5FDlog.c
index 8ef776d..75333c2 100644
--- a/src/H5FDlog.c
+++ b/src/H5FDlog.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -132,6 +130,7 @@ typedef struct H5FD_log_t {
     double              total_read_time;        /* Total time spent in read operations              */
     double              total_write_time;       /* Total time spent in write operations             */
     double              total_seek_time;        /* Total time spent in seek operations              */
+    double              total_truncate_time;    /* Total time spent in truncate operations              */
     size_t              iosize;                 /* Size of I/O information buffers                  */
     FILE                *logfp;                 /* Log file pointer                                 */
     H5FD_log_fapl_t     fa;                     /* Driver-specific file access properties           */
@@ -170,6 +169,8 @@ static herr_t H5FD_log_close(H5FD_t *_file);
 static int H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
 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 herr_t H5FD__log_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+            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, H5FD_mem_t type);
@@ -203,7 +204,7 @@ static const H5FD_class_t H5FD_log_g = {
     H5FD_log_query,				/*query			*/
     NULL,					/*get_type_map		*/
     H5FD_log_alloc,				/*alloc			*/
-    NULL,					/*free			*/
+    H5FD__log_free,				/*free			*/
     H5FD_log_get_eoa,				/*get_eoa		*/
     H5FD_log_set_eoa, 				/*set_eoa		*/
     H5FD_log_get_eof,				/*get_eof		*/
@@ -416,7 +417,7 @@ done:
     if(NULL == ret_value)
         if(new_fa) {
             if(new_fa->logfile)
-                new_fa->logfile = H5MM_xfree(new_fa->logfile);
+                new_fa->logfile = (char *)H5MM_xfree(new_fa->logfile);
             H5MM_free(new_fa);
         } /* end if */
 
@@ -445,7 +446,7 @@ H5FD_log_fapl_free(void *_fa)
 
     /* Free the fapl information */
     if(fa->logfile)
-        fa->logfile = H5MM_xfree(fa->logfile);
+        fa->logfile = (char *)H5MM_xfree(fa->logfile);
     H5MM_xfree(fa);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -735,6 +736,8 @@ H5FD_log_close(H5FD_t *_file)
             HDfprintf(file->logfp, "Total time in write operations: %f s\n", file->total_write_time);
         if(file->fa.flags & H5FD_LOG_TIME_SEEK)
             HDfprintf(file->logfp, "Total time in seek operations: %f s\n", file->total_seek_time);
+        if(file->fa.flags & H5FD_LOG_TIME_TRUNCATE)
+            HDfprintf(file->logfp, "Total time in truncate operations: %f s\n", file->total_truncate_time);
 
         /* Dump the write I/O information */
         if(file->fa.flags & H5FD_LOG_FILE_WRITE) {
@@ -799,7 +802,7 @@ H5FD_log_close(H5FD_t *_file)
     } /* end if */
 
     if(file->fa.logfile)
-        file->fa.logfile = H5MM_xfree(file->fa.logfile);
+        file->fa.logfile = (char *)H5MM_xfree(file->fa.logfile);
 
     /* Release the file info */
     file = H5FL_FREE(H5FD_log_t, file);
@@ -929,13 +932,7 @@ H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hsi
     /* Compute the address for the block to allocate */
     addr = file->eoa;
 
-    /* Check if we need to align this block */
-    if(size >= file->pub.threshold) {
-        /* Check for an already aligned block */
-        if(addr % file->pub.alignment != 0)
-            addr = ((addr / file->pub.alignment) + 1) * file->pub.alignment;
-    } /* end if */
-
+    /* Extend the end-of-allocated space address */
     file->eoa = addr + size;
 
     /* Retain the (first) flavor of the information written to the file */
@@ -958,6 +955,43 @@ H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hsi
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5FD__log_free
+ *
+ * Purpose:     Release file memory.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, September 28, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD__log_free(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id,
+    haddr_t addr, hsize_t size)
+{
+    H5FD_log_t	*file = (H5FD_log_t *)_file;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if(file->fa.flags != 0) {
+        /* Reset the flavor of the information in the file */
+        if(file->fa.flags & H5FD_LOG_FLAVOR) {
+            HDassert(addr < file->iosize);
+            H5_CHECK_OVERFLOW(size, hsize_t, size_t);
+            HDmemset(&file->flavor[addr], H5FD_MEM_DEFAULT, (size_t)size);
+        } /* end if */
+
+        /* Log the file memory freed */
+        if(file->fa.flags & H5FD_LOG_FREE)
+            HDfprintf(file->logfp, "%10a-%10a (%10Hu bytes) (%s) Freed\n", addr, (addr + size) - 1, size, flavors[type]);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD__log_free() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5FD_log_get_eoa
  *
  * Purpose:     Gets the end-of-address marker for the file. The EOA marker
@@ -1005,6 +1039,7 @@ H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr)
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     if(file->fa.flags != 0) {
+        /* Check for increasing file size */
         if(H5F_addr_gt(addr, file->eoa) && H5F_addr_gt(addr, 0)) {
             hsize_t size = addr - file->eoa;
 
@@ -1019,6 +1054,22 @@ H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr)
             if(file->fa.flags & H5FD_LOG_ALLOC)
                 HDfprintf(file->logfp, "%10a-%10a (%10Hu bytes) (%s) Allocated\n", file->eoa, addr, size, flavors[type]);
         } /* end if */
+
+        /* Check for decreasing file size */
+        if(H5F_addr_lt(addr, file->eoa) && H5F_addr_gt(addr, 0)) {
+            hsize_t size = file->eoa - addr;
+
+            /* Reset the flavor of the space freed by the shrink */
+            if(file->fa.flags & H5FD_LOG_FLAVOR) {
+                HDassert((addr + size) < file->iosize);
+                H5_CHECK_OVERFLOW(size, hsize_t, size_t);
+                HDmemset(&file->flavor[addr], H5FD_MEM_DEFAULT, (size_t)size);
+            } /* end if */
+
+            /* Log the shrink like a free */
+            if(file->fa.flags & H5FD_LOG_FREE)
+                HDfprintf(file->logfp, "%10a-%10a (%10Hu bytes) (%s) Freed\n", file->eoa, addr, size, flavors[type]);
+        } /* end if */
     } /* end if */
 
     file->eoa = addr;
@@ -1168,7 +1219,7 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
                     timeval_diff.tv_sec--;
                 } /* end if */
                 time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
-                HDfprintf(file->logfp, " (%f s)\n", time_diff);
+                HDfprintf(file->logfp, " (%fs @ %.6lu.%.6llu)\n", time_diff, (unsigned long long)timeval_start.tv_sec, (unsigned long long)timeval_start.tv_usec);
 
                 /* Add to total seek time */
                 file->total_seek_time += time_diff;
@@ -1242,7 +1293,12 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
     if(file->fa.flags & H5FD_LOG_LOC_READ) {
         HDfprintf(file->logfp, "%10a-%10a (%10Zu bytes) (%s) Read", orig_addr, (orig_addr + orig_size) - 1, orig_size, flavors[type]);
 
-        /* XXX: Verify the flavor information, if we have it? */
+        /* Verify that we are reading in the type of data we allocated in this location */
+        if(file->flavor) {
+            HDassert(type == H5FD_MEM_DEFAULT || type == (H5FD_mem_t)file->flavor[orig_addr] || (H5FD_mem_t)file->flavor[orig_addr] == H5FD_MEM_DEFAULT);
+            HDassert(type == H5FD_MEM_DEFAULT || type == (H5FD_mem_t)file->flavor[(orig_addr + orig_size) - 1] || (H5FD_mem_t)file->flavor[(orig_addr + orig_size) - 1] == H5FD_MEM_DEFAULT);
+        } /* end if */
+
 
 #ifdef H5_HAVE_GETTIMEOFDAY
         if(file->fa.flags & H5FD_LOG_TIME_READ) {
@@ -1257,7 +1313,7 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
                 timeval_diff.tv_sec--;
             } /* end if */
             time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
-            HDfprintf(file->logfp, " (%f s)\n", time_diff);
+            HDfprintf(file->logfp, " (%fs @ %.6lu.%.6llu)\n", time_diff, (unsigned long long)timeval_start.tv_sec, (unsigned long long)timeval_start.tv_usec);
 
             /* Add to total read time */
             file->total_read_time += time_diff;
@@ -1370,7 +1426,7 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
                     timeval_diff.tv_sec--;
                 } /* end if */
                 time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
-                HDfprintf(file->logfp, " (%f s)\n", time_diff);
+                HDfprintf(file->logfp, " (%fs @ %.6lu.%.6llu)\n", time_diff, (unsigned long long)timeval_start.tv_sec, (unsigned long long)timeval_start.tv_usec);
 
                 /* Add to total seek time */
                 file->total_seek_time += time_diff;
@@ -1439,8 +1495,10 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
 
         /* Check if this is the first write into a "default" section, grabbed by the metadata agregation algorithm */
         if(file->fa.flags & H5FD_LOG_FLAVOR) {
-            if((H5FD_mem_t)file->flavor[orig_addr] == H5FD_MEM_DEFAULT)
+            if((H5FD_mem_t)file->flavor[orig_addr] == H5FD_MEM_DEFAULT) {
                 HDmemset(&file->flavor[orig_addr], (int)type, orig_size);
+                HDfprintf(file->logfp, " (fresh)");
+            } /* end if */
         } /* end if */
 
 #ifdef H5_HAVE_GETTIMEOFDAY
@@ -1456,7 +1514,7 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
                 timeval_diff.tv_sec--;
             } /* end if */
             time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
-            HDfprintf(file->logfp, " (%f s)\n", time_diff);
+            HDfprintf(file->logfp, " (%fs @ %.6lu.%.6llu)\n", time_diff, (unsigned long long)timeval_start.tv_sec, (unsigned long long)timeval_start.tv_usec);
 
             /* Add to total write time */
             file->total_write_time += time_diff;
@@ -1510,6 +1568,9 @@ H5FD_log_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_U
 
     /* Extend the file to make sure it's large enough */
     if(!H5F_addr_eq(file->eoa, file->eof)) {
+#ifdef H5_HAVE_GETTIMEOFDAY
+        struct timeval timeval_start, timeval_stop;
+#endif /* H5_HAVE_GETTIMEOFDAY */
 #ifdef H5_HAVE_WIN32_API
         LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
         DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
@@ -1517,7 +1578,13 @@ H5FD_log_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_U
                                      */
         DWORD           dwError;    /* DWORD error code from GetLastError() */
         BOOL            bError;     /* Boolean error flag */
+#endif /* H5_HAVE_WIN32_API */
 
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_TRUNCATE)
+            HDgettimeofday(&timeval_start, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+#ifdef H5_HAVE_WIN32_API
         /* Windows uses this odd QuadPart union for 32/64-bit portability */
         li.QuadPart = (__int64)file->eoa;
 
@@ -1540,10 +1607,40 @@ H5FD_log_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_U
         if(-1 == HDftruncate(file->fd, (HDoff_t)file->eoa))
             HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
 #endif /* H5_HAVE_WIN32_API */
+#ifdef H5_HAVE_GETTIMEOFDAY
+        if(file->fa.flags & H5FD_LOG_TIME_TRUNCATE)
+            HDgettimeofday(&timeval_stop, NULL);
+#endif /* H5_HAVE_GETTIMEOFDAY */
 
         /* Log information about the truncate */
         if(file->fa.flags & H5FD_LOG_NUM_TRUNCATE)
             file->total_truncate_ops++;
+        if(file->fa.flags & H5FD_LOG_TRUNCATE) {
+            HDfprintf(file->logfp, "Truncate: To %10a", file->eoa);
+#ifdef H5_HAVE_GETTIMEOFDAY
+            if(file->fa.flags & H5FD_LOG_TIME_TRUNCATE) {
+                struct timeval timeval_diff;
+                double time_diff;
+
+                /* Calculate the elapsed gettimeofday time */
+                timeval_diff.tv_usec = timeval_stop.tv_usec - timeval_start.tv_usec;
+                timeval_diff.tv_sec = timeval_stop.tv_sec - timeval_start.tv_sec;
+                if(timeval_diff.tv_usec < 0) {
+                    timeval_diff.tv_usec += 1000000;
+                    timeval_diff.tv_sec--;
+                } /* end if */
+                time_diff = (double)timeval_diff.tv_sec + ((double)timeval_diff.tv_usec / (double)1000000.0f);
+                HDfprintf(file->logfp, " (%fs @ %.6lu.%.6llu)\n", time_diff, (unsigned long long)timeval_start.tv_sec, (unsigned long long)timeval_start.tv_usec);
+
+                /* Add to total truncate time */
+                file->total_truncate_time += time_diff;
+            } /* end if */
+            else
+                HDfprintf(file->logfp, "\n");
+#else /* H5_HAVE_GETTIMEOFDAY */
+            HDfprintf(file->logfp, "\n");
+#endif /* H5_HAVE_GETTIMEOFDAY */
+        } /* end if */
 
         /* Update the eof value */
         file->eof = file->eoa;
@@ -1573,21 +1670,25 @@ done:
 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 */
+    H5FD_log_t	*file = (H5FD_log_t *)_file;    /* VFD file struct          */
+    int lock_flags;                             /* file locking flags       */
+    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;
+    /* Set exclusive or shared lock based on rw status */
+    lock_flags = 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")
+    /* Place a non-blocking lock on the file */
+    if(HDflock(file->fd, lock_flags | LOCK_NB) < 0) {
+        if(ENOSYS == errno)
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+        else
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to lock file")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1608,15 +1709,19 @@ done:
 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 */
+    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")
+    if(HDflock(file->fd, LOCK_UN) < 0) {
+        if(ENOSYS == errno)
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+        else
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to unlock file")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5FDlog.h b/src/H5FDlog.h
index 2f1544e..a69bb18 100644
--- a/src/H5FDlog.h
+++ b/src/H5FDlog.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -25,34 +23,39 @@
 #define H5FD_LOG	(H5FD_log_init())
 
 /* Flags for H5Pset_fapl_log() */
+/* Flags for tracking 'meta' operations (truncate) */
+#define H5FD_LOG_TRUNCATE   0x00000001
+#define H5FD_LOG_META_IO    (H5FD_LOG_TRUNCATE)
 /* Flags for tracking where reads/writes/seeks occur */
-#define H5FD_LOG_LOC_READ   0x00000001
-#define H5FD_LOG_LOC_WRITE  0x00000002
-#define H5FD_LOG_LOC_SEEK   0x00000004
+#define H5FD_LOG_LOC_READ   0x00000002
+#define H5FD_LOG_LOC_WRITE  0x00000004
+#define H5FD_LOG_LOC_SEEK   0x00000008
 #define H5FD_LOG_LOC_IO     (H5FD_LOG_LOC_READ|H5FD_LOG_LOC_WRITE|H5FD_LOG_LOC_SEEK)
 /* Flags for tracking number of times each byte is read/written */
-#define H5FD_LOG_FILE_READ  0x00000008
-#define H5FD_LOG_FILE_WRITE 0x00000010
+#define H5FD_LOG_FILE_READ  0x00000010
+#define H5FD_LOG_FILE_WRITE 0x00000020
 #define H5FD_LOG_FILE_IO    (H5FD_LOG_FILE_READ|H5FD_LOG_FILE_WRITE)
 /* Flag for tracking "flavor" (type) of information stored at each byte */
-#define H5FD_LOG_FLAVOR     0x00000020
+#define H5FD_LOG_FLAVOR     0x00000040
 /* Flags for tracking total number of reads/writes/seeks/truncates */
-#define H5FD_LOG_NUM_READ   0x00000040
-#define H5FD_LOG_NUM_WRITE  0x00000080
-#define H5FD_LOG_NUM_SEEK   0x00000100
-#define H5FD_LOG_NUM_TRUNCATE 0x00000200
+#define H5FD_LOG_NUM_READ   0x00000080
+#define H5FD_LOG_NUM_WRITE  0x00000100
+#define H5FD_LOG_NUM_SEEK   0x00000200
+#define H5FD_LOG_NUM_TRUNCATE 0x00000400
 #define H5FD_LOG_NUM_IO     (H5FD_LOG_NUM_READ|H5FD_LOG_NUM_WRITE|H5FD_LOG_NUM_SEEK|H5FD_LOG_NUM_TRUNCATE)
-/* Flags for tracking time spent in open/stat/read/write/seek/close */
-#define H5FD_LOG_TIME_OPEN  0x00000400
-#define H5FD_LOG_TIME_STAT  0x00000800
-#define H5FD_LOG_TIME_READ  0x00001000
-#define H5FD_LOG_TIME_WRITE 0x00002000
-#define H5FD_LOG_TIME_SEEK  0x00004000
-#define H5FD_LOG_TIME_CLOSE 0x00008000
-#define H5FD_LOG_TIME_IO    (H5FD_LOG_TIME_OPEN|H5FD_LOG_TIME_STAT|H5FD_LOG_TIME_READ|H5FD_LOG_TIME_WRITE|H5FD_LOG_TIME_SEEK|H5FD_LOG_TIME_CLOSE)
-/* Flag for tracking allocation of space in file */
-#define H5FD_LOG_ALLOC      0x00010000
-#define H5FD_LOG_ALL        (H5FD_LOG_ALLOC|H5FD_LOG_TIME_IO|H5FD_LOG_NUM_IO|H5FD_LOG_FLAVOR|H5FD_LOG_FILE_IO|H5FD_LOG_LOC_IO)
+/* Flags for tracking time spent in open/stat/read/write/seek/truncate/close */
+#define H5FD_LOG_TIME_OPEN  0x00000800
+#define H5FD_LOG_TIME_STAT  0x00001000
+#define H5FD_LOG_TIME_READ  0x00002000
+#define H5FD_LOG_TIME_WRITE 0x00004000
+#define H5FD_LOG_TIME_SEEK  0x00008000
+#define H5FD_LOG_TIME_TRUNCATE 0x00010000
+#define H5FD_LOG_TIME_CLOSE 0x00020000
+#define H5FD_LOG_TIME_IO    (H5FD_LOG_TIME_OPEN|H5FD_LOG_TIME_STAT|H5FD_LOG_TIME_READ|H5FD_LOG_TIME_WRITE|H5FD_LOG_TIME_SEEK|H5FD_LOG_TIME_TRUNCATE|H5FD_LOG_TIME_CLOSE)
+/* Flags for tracking allocation/release of space in file */
+#define H5FD_LOG_ALLOC      0x00040000
+#define H5FD_LOG_FREE       0x00080000
+#define H5FD_LOG_ALL        (H5FD_LOG_FREE|H5FD_LOG_ALLOC|H5FD_LOG_TIME_IO|H5FD_LOG_NUM_IO|H5FD_LOG_FLAVOR|H5FD_LOG_FILE_IO|H5FD_LOG_LOC_IO|H5FD_LOG_META_IO)
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/H5FDmodule.h b/src/H5FDmodule.h
index 6358e86..ea1a9fd 100644
--- a/src/H5FDmodule.h
+++ b/src/H5FDmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDmpi.c b/src/H5FDmpi.c
index fdc4eca..16be455 100644
--- a/src/H5FDmpi.c
+++ b/src/H5FDmpi.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -148,6 +146,45 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5FD_get_mpi_info
+ *
+ * Purpose:	Retrieves the file's mpi info
+ *
+ * Return:	Success:	SUCCEED
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	John Mainzer
+ *              4/4/17
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_get_mpi_info(H5FD_t *file, void** mpi_info)
+{
+    const H5FD_class_mpi_t *cls;
+    herr_t  ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+    cls = (const H5FD_class_mpi_t *)(file->cls);
+    HDassert(cls);
+    HDassert(cls->get_mpi_info);    /* All MPI drivers must implement this */
+
+    /* Dispatch to driver */
+    if ((ret_value=(cls->get_mpi_info)(file, mpi_info)) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, \
+                    "driver get_mpi_info request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_get_mpi_info() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5FD_mpi_MPIOff_to_haddr
  *
  * Purpose:     Convert an MPI_Offset value to haddr_t.
diff --git a/src/H5FDmpi.h b/src/H5FDmpi.h
index 784fe70..2d62c79 100644
--- a/src/H5FDmpi.h
+++ b/src/H5FDmpi.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c
index ed70e20..ace91f8 100644
--- a/src/H5FDmpio.c
+++ b/src/H5FDmpio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -90,11 +88,12 @@ static herr_t H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hadd
             size_t size, void *buf);
 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);
-static herr_t H5FD_mpio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_mpio_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
 static herr_t H5FD_mpio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
 static int H5FD_mpio_mpi_rank(const H5FD_t *_file);
 static int H5FD_mpio_mpi_size(const H5FD_t *_file);
 static MPI_Comm H5FD_mpio_communicator(const H5FD_t *_file);
+static herr_t  H5FD_mpio_get_info(H5FD_t *_file, void** mpi_info);
 
 /* The MPIO file driver information */
 static const H5FD_class_mpi_t H5FD_mpio_g = {
@@ -134,7 +133,8 @@ static const H5FD_class_mpi_t H5FD_mpio_g = {
     },  /* End of superclass information */
     H5FD_mpio_mpi_rank,                         /*get_rank              */
     H5FD_mpio_mpi_size,                         /*get_size              */
-    H5FD_mpio_communicator                      /*get_comm              */
+    H5FD_mpio_communicator,                     /*get_comm              */
+    H5FD_mpio_get_info                          /*get_info              */
 };
 
 #ifdef H5FDmpio_DEBUG
@@ -1308,6 +1308,39 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:       H5FD_mpio_get_info
+ *
+ * Purpose:        Returns the file info of MPIO file driver.
+ *
+ * Returns:        Non-negative if succeed or negative if fails.
+ *
+ * Programmer:     John Mainzer
+ *                 April 4, 2017
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+*/
+static herr_t
+H5FD_mpio_get_info(H5FD_t *_file, void** mpi_info)
+{
+    H5FD_mpio_t         *file = (H5FD_mpio_t *)_file;
+    herr_t              ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(!mpi_info)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mpi info not valid")
+
+    *mpi_info = &(file->info);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5FD_mpio_get_info() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5FD_mpio_read
  *
  * Purpose:	Reads SIZE bytes of data from FILE beginning at address ADDR
@@ -1866,7 +1899,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned closing)
+H5FD_mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing)
 {
     H5FD_mpio_t		*file = (H5FD_mpio_t*)_file;
     int			mpi_code;	/* mpi return code */
diff --git a/src/H5FDmpio.h b/src/H5FDmpio.h
index 858e8ba..6ee0a1a 100644
--- a/src/H5FDmpio.h
+++ b/src/H5FDmpio.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDmulti.c b/src/H5FDmulti.c
index b4460b8..8ae23d2 100644
--- a/src/H5FDmulti.c
+++ b/src/H5FDmulti.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -44,16 +42,22 @@
 #endif
 
 /* Loop through all mapped files */
-#define UNIQUE_MEMBERS(MAP,LOOPVAR) {					      \
-    H5FD_mem_t _unmapped, LOOPVAR;					      \
-    unsigned _seen[H5FD_MEM_NTYPES];					      \
+#define UNIQUE_MEMBERS_CORE(MAP, ITER, SEEN, LOOPVAR) {					      \
+    H5FD_mem_t ITER, LOOPVAR;					      \
+    unsigned SEEN[H5FD_MEM_NTYPES];					      \
 									      \
-    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;		      \
+    memset(SEEN, 0, sizeof SEEN);	      				      \
+    for (ITER=H5FD_MEM_SUPER; ITER<H5FD_MEM_NTYPES; ITER=(H5FD_mem_t)(ITER+1)) {  \
+	LOOPVAR = MAP[ITER];					      \
+	if (H5FD_MEM_DEFAULT==LOOPVAR) LOOPVAR=ITER;		      \
 	assert(LOOPVAR>0 && LOOPVAR<H5FD_MEM_NTYPES);			      \
-	if (_seen[LOOPVAR]++) continue;					      \
+	if (SEEN[LOOPVAR]++) continue;					      \
+
+/* Need two front-ends, since they are nested sometimes */
+#define UNIQUE_MEMBERS(MAP, LOOPVAR)                                          \
+    UNIQUE_MEMBERS_CORE(MAP, _unmapped, _seen, LOOPVAR)
+#define UNIQUE_MEMBERS2(MAP, LOOPVAR)                                         \
+    UNIQUE_MEMBERS_CORE(MAP, _unmapped2, _seen2, LOOPVAR)
 
 #define ALL_MEMBERS(LOOPVAR) {						      \
     H5FD_mem_t LOOPVAR;							      \
@@ -69,11 +73,11 @@ static hid_t H5FD_MULTI_g = 0;
 
 /* Driver-specific file access properties */
 typedef struct H5FD_multi_fapl_t {
-    H5FD_mem_t	memb_map[H5FD_MEM_NTYPES]; /*memory usage map		*/
-    hid_t	memb_fapl[H5FD_MEM_NTYPES];/*member access properties	*/
-    char	*memb_name[H5FD_MEM_NTYPES];/*name generators		*/
-    haddr_t	memb_addr[H5FD_MEM_NTYPES];/*starting addr per member	*/
-    hbool_t	relax;			/*less stringent error checking	*/
+    H5FD_mem_t  memb_map[H5FD_MEM_NTYPES];      /*memory usage map              */
+    hid_t       memb_fapl[H5FD_MEM_NTYPES];     /*member access properties      */
+    char        *memb_name[H5FD_MEM_NTYPES];    /*name generators               */
+    haddr_t     memb_addr[H5FD_MEM_NTYPES];     /*starting addr per member      */
+    hbool_t     relax;                          /*less stringent error checking	*/
 } H5FD_multi_fapl_t;
 
 /*
@@ -83,17 +87,17 @@ typedef struct H5FD_multi_fapl_t {
  * copied into the parent file struct in H5F_open().
  */
 typedef struct H5FD_multi_t {
-    H5FD_t	pub;		/*public stuff, must be first		*/
-    H5FD_multi_fapl_t fa;	/*driver-specific file access properties*/
-    haddr_t	memb_next[H5FD_MEM_NTYPES];/*addr of next member	*/
-    H5FD_t	*memb[H5FD_MEM_NTYPES];	/*member pointers		*/
-    haddr_t     memb_eoa[H5FD_MEM_NTYPES]; /*EOA for individual files,
-    				 *end of allocated addresses.  v1.6 library 
-                                 *have the EOA for the entire file. But it's
-                                 *meaningless for MULTI file.  We replaced it
-                                 *with the EOAs for individual files    */
-    unsigned	flags;		/*file open flags saved for debugging	*/
-    char	*name;		/*name passed to H5Fopen or H5Fcreate	*/
+    H5FD_t              pub;                        /*public stuff, must be first               */
+    H5FD_multi_fapl_t   fa;                         /*driver-specific file access properties    */
+    haddr_t             memb_next[H5FD_MEM_NTYPES]; /*addr of next member                       */
+    H5FD_t             *memb[H5FD_MEM_NTYPES];      /*member pointers                           */
+    haddr_t             memb_eoa[H5FD_MEM_NTYPES];  /*EOA for individual files,
+                                                     *end of allocated addresses.  v1.6 library 
+                                                     *have the EOA for the entire file. But it's
+                                                     *meaningless for MULTI file.  We replaced it
+                                                     *with the EOAs for individual files        */
+    unsigned            flags;                      /*file open flags saved for debugging       */
+    char               *name;                       /*name passed to H5Fopen or H5Fcreate       */
 } H5FD_multi_t;
 
 /* Driver specific data transfer properties */
@@ -133,7 +137,7 @@ static herr_t H5FD_multi_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, had
 			      size_t size, void *_buf/*out*/);
 static herr_t H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
 			       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_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t 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);
@@ -227,9 +231,9 @@ H5FD_multi_init(void)
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
 
-    if (H5I_VFL!=H5Iget_type(H5FD_MULTI_g)) {
-	H5FD_MULTI_g = H5FDregister(&H5FD_multi_g);
-    }
+    if(H5I_VFL!=H5Iget_type(H5FD_MULTI_g))
+        H5FD_MULTI_g = H5FDregister(&H5FD_multi_g);
+
     return H5FD_MULTI_g;
 }
 
@@ -279,7 +283,8 @@ H5Pset_fapl_split(hid_t fapl, const char *meta_ext, hid_t meta_plist_id,
     H5FD_mem_t		memb_map[H5FD_MEM_NTYPES];
     hid_t		memb_fapl[H5FD_MEM_NTYPES];
     const char		*memb_name[H5FD_MEM_NTYPES];
-    char		meta_name[H5FD_MULT_MAX_FILE_NAME_LEN], raw_name[H5FD_MULT_MAX_FILE_NAME_LEN];
+    char		meta_name[H5FD_MULT_MAX_FILE_NAME_LEN];
+    char		raw_name[H5FD_MULT_MAX_FILE_NAME_LEN];
     haddr_t		memb_addr[H5FD_MEM_NTYPES];
 
     /*NO TRACE*/
@@ -528,7 +533,7 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/,
 		  hid_t *memb_fapl/*out*/, char **memb_name/*out*/,
 		  haddr_t *memb_addr/*out*/, hbool_t *relax)
 {
-    H5FD_multi_fapl_t	*fa;
+    const H5FD_multi_fapl_t *fa;
     H5FD_mem_t		mt;
     static const char *func="H5FDget_fapl_multi";  /* Function Name for error reporting */
 
@@ -542,7 +547,7 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/,
         H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not an access list", -1)
     if(H5FD_MULTI != H5Pget_driver(fapl_id))
         H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "incorrect VFL driver", -1)
-    if(NULL == (fa= (H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id)))
+    if(NULL == (fa= (const H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id)))
         H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "bad VFL driver info", -1)
 
     if (memb_map)
@@ -899,25 +904,30 @@ H5FD_multi_fapl_copy(const void *_old_fa)
     memcpy(new_fa, old_fa, sizeof(H5FD_multi_fapl_t));
     ALL_MEMBERS(mt) {
 	if (old_fa->memb_fapl[mt]>=0) {
-	    new_fa->memb_fapl[mt] = H5Pcopy(old_fa->memb_fapl[mt]);
-	    if(new_fa->memb_fapl[mt]<0)
+	    if (H5Iinc_ref(old_fa->memb_fapl[mt]) < 0) {
                 nerrors++;
+                break;
+            }
+	    new_fa->memb_fapl[mt] = old_fa->memb_fapl[mt];
 	}
 	if (old_fa->memb_name[mt]) {
 	    new_fa->memb_name[mt] = my_strdup(old_fa->memb_name[mt]);
-	    assert(new_fa->memb_name[mt]);
+            if (NULL == new_fa->memb_name[mt]) {
+                nerrors++;
+                break;
+            }
 	}
     } END_MEMBERS;
 
     if (nerrors) {
         ALL_MEMBERS(mt) {
             if (new_fa->memb_fapl[mt]>=0)
-                (void)H5Pclose(new_fa->memb_fapl[mt]);
+                (void)H5Idec_ref(new_fa->memb_fapl[mt]);
             if (new_fa->memb_name[mt])
                 free(new_fa->memb_name[mt]);
         } END_MEMBERS;
         free(new_fa);
-        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "invalid freespace objects", NULL)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't release object on error", NULL)
     }
     return new_fa;
 }
@@ -948,7 +958,7 @@ H5FD_multi_fapl_free(void *_fa)
 
     ALL_MEMBERS(mt) {
 	if (fa->memb_fapl[mt]>=0)
-            if(H5Pclose(fa->memb_fapl[mt])<0)
+            if(H5Idec_ref(fa->memb_fapl[mt])<0)
                 H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", -1)
 	if (fa->memb_name[mt])
             free(fa->memb_name[mt]);
@@ -981,7 +991,7 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id,
 {
     H5FD_multi_t	*file=NULL;
     hid_t		close_fapl=-1;
-    H5FD_multi_fapl_t	*fa;
+    const H5FD_multi_fapl_t *fa;
     H5FD_mem_t		m;
     static const char *func="H5FD_multi_open";  /* Function Name for error reporting */
 
@@ -1007,15 +1017,14 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id,
         if(H5Pset_fapl_multi(fapl_id, NULL, NULL, NULL, NULL, TRUE)<0)
             H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error)
     }
-    fa = (H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id);
+    fa = (const H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id);
     assert(fa);
     ALL_MEMBERS(mt) {
 	file->fa.memb_map[mt] = fa->memb_map[mt];
 	file->fa.memb_addr[mt] = fa->memb_addr[mt];
 	if (fa->memb_fapl[mt]>=0)
-	    file->fa.memb_fapl[mt] = H5Pcopy(fa->memb_fapl[mt]);
-	else
-	    file->fa.memb_fapl[mt] = fa->memb_fapl[mt];
+	    H5Iinc_ref(fa->memb_fapl[mt]);
+        file->fa.memb_fapl[mt] = fa->memb_fapl[mt];
 	if (fa->memb_name[mt])
 	    file->fa.memb_name[mt] = my_strdup(fa->memb_name[mt]);
 	else
@@ -1047,7 +1056,7 @@ error:
     if (file) {
 	ALL_MEMBERS(mt) {
 	    if (file->memb[mt]) (void)H5FDclose(file->memb[mt]);
-	    if (file->fa.memb_fapl[mt]>=0) (void)H5Pclose(file->fa.memb_fapl[mt]);
+	    if (file->fa.memb_fapl[mt]>=0) (void)H5Idec_ref(file->fa.memb_fapl[mt]);
 	    if (file->fa.memb_name[mt]) free(file->fa.memb_name[mt]);
 	} END_MEMBERS;
 	if (file->name) free(file->name);
@@ -1098,9 +1107,10 @@ H5FD_multi_close(H5FD_t *_file)
 
     /* Clean up other stuff */
     ALL_MEMBERS(mt) {
-	if (file->fa.memb_fapl[mt]>=0) (void)H5Pclose(file->fa.memb_fapl[mt]);
+	if (file->fa.memb_fapl[mt]>=0) (void)H5Idec_ref(file->fa.memb_fapl[mt]);
 	if (file->fa.memb_name[mt]) free(file->fa.memb_name[mt]);
     } END_MEMBERS;
+
     free(file->name);
     free(file);
     return 0;
@@ -1139,14 +1149,18 @@ H5FD_multi_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
 
     ALL_MEMBERS(mt) {
         out_mt = mt;
-	if (f1->memb[mt] && f2->memb[mt]) break;
-	if (!cmp) {
-	    if (f1->memb[mt]) cmp = -1;
-	    else if (f2->memb[mt]) cmp = 1;
+	if(f1->memb[mt] && f2->memb[mt])
+            break;
+	if(!cmp) {
+	    if(f1->memb[mt])
+                cmp = -1;
+	    else if(f2->memb[mt])
+                cmp = 1;
 	}
     } END_MEMBERS;
     assert(cmp || out_mt<H5FD_MEM_NTYPES);
-    if (out_mt>=H5FD_MEM_NTYPES) return cmp;
+    if(out_mt>=H5FD_MEM_NTYPES)
+        return cmp;
 
     return H5FDcmp(f1->memb[out_mt], f2->memb[out_mt]);
 }
@@ -1176,8 +1190,10 @@ H5FD_multi_query(const H5FD_t *_f, unsigned long *flags /* out */)
     /* Set the VFL feature flags that this driver supports */
     if(flags) {
         *flags = 0;
-        *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_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_USE_ALLOC_SIZE;     /* OK just pass the allocation size to the alloc callback */
+        *flags |= H5FD_FEAT_PAGED_AGGR;         /* OK special file space mapping for paged aggregation */
     } /* end if */
 
     return(0);
@@ -1280,7 +1296,7 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
     } else {
         H5FD_mem_t mmt = file->fa.memb_map[type];
 
-        if(H5FD_MEM_DEFAULT==mmt)
+        if(H5FD_MEM_DEFAULT == mmt)
             mmt = type;
 
 	if(file->memb[mmt]) {
@@ -1348,18 +1364,24 @@ H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
     H5Eclear2(H5E_DEFAULT);
 
     mmt = file->fa.memb_map[type];
-    if(H5FD_MEM_DEFAULT == mmt)
-        mmt = type;
-
-    /* Handle backward compatibility in a quick and simple way.  v1.6 library had EOA for the entire virtual 
-     * file.  But it wasn't meaningful.  So v1.8 library doesn't have it anymore.  It saves the EOA for the 
-     * metadata file, instead.  Here we try to figure out whether the EOA is from a v1.6 file by comparing its 
-     * value.  If it is a big value, we assume it's from v1.6 and simply discard it. This is the normal case 
-     * when the metadata file has the smallest starting address.  If the metadata file has the biggest address,
-     * the EOAs of v1.6 and v1.8 files are the same.  It won't cause any trouble.  (Please see Issue 2598 
-     * in Jira) SLU - 2011/6/21
+    if(H5FD_MEM_DEFAULT == mmt) {
+        if(H5FD_MEM_DEFAULT == type)
+            mmt = H5FD_MEM_SUPER;
+        else
+            mmt = type;
+    } /* end if */
+
+    /* Handle backward compatibility in a quick and simple way.  v1.6 library
+     * had EOA for the entire virtual file.  But it wasn't meaningful.  So v1.8
+     * library doesn't have it anymore.  It saves the EOA for the metadata file,
+     * instead.  Here we try to figure out whether the EOA is from a v1.6 file
+     * by comparing its value.  If it is a big value, we assume it's from v1.6
+     * and simply discard it. This is the normal case when the metadata file
+     * has the smallest starting address.  If the metadata file has the biggest
+     * address, the EOAs of v1.6 and v1.8 files are the same.  It won't cause
+     * any trouble.  (Please see Issue 2598 in Jira) SLU - 2011/6/21
      */
-    if(H5FD_MEM_SUPER == type && file->memb_eoa[H5FD_MEM_SUPER] > 0 && eoa > file->memb_eoa[H5FD_MEM_SUPER])
+    if(H5FD_MEM_SUPER == mmt && file->memb_eoa[H5FD_MEM_SUPER] > 0 && eoa > (file->memb_next[H5FD_MEM_SUPER] / 2))
         return 0;
 
     assert(eoa >= file->fa.memb_addr[mmt]);
@@ -1368,7 +1390,7 @@ H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
     H5E_BEGIN_TRY {
 	status = H5FDset_eoa(file->memb[mmt], mmt, (eoa - file->fa.memb_addr[mmt]));
     } H5E_END_TRY;
-    if (status<0)
+    if(status < 0)
         H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1)
 
     return 0;
@@ -1516,6 +1538,14 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
     mmt = file->fa.memb_map[type];
     if (H5FD_MEM_DEFAULT==mmt) mmt = type;
 
+    /* XXX: NEED to work on this again */
+    if(file->pub.paged_aggr) {
+        ALL_MEMBERS(mt) {
+            if(file->memb[mt])
+                file->memb[mt]->paged_aggr = file->pub.paged_aggr;
+        } END_MEMBERS;
+    }
+
     if (HADDR_UNDEF==(addr=H5FDalloc(file->memb[mmt], mmt, dxpl_id, size)))
         H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", HADDR_UNDEF)
     addr += file->fa.memb_addr[mmt];
@@ -1682,7 +1712,7 @@ H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
 {
     H5FD_multi_t	*file = (H5FD_multi_t*)_file;
     H5FD_mem_t		mt;
@@ -1900,7 +1930,7 @@ compute_next(H5FD_multi_t *file)
     } END_MEMBERS;
 
     UNIQUE_MEMBERS(file->fa.memb_map, mt1) {
-	UNIQUE_MEMBERS(file->fa.memb_map, mt2) {
+	UNIQUE_MEMBERS2(file->fa.memb_map, mt2) {
 	    if (file->fa.memb_addr[mt1]<file->fa.memb_addr[mt2] &&
 		(HADDR_UNDEF==file->memb_next[mt1] ||
 		 file->memb_next[mt1]>file->fa.memb_addr[mt2])) {
diff --git a/src/H5FDmulti.h b/src/H5FDmulti.h
index e819e74..0bd5718 100644
--- a/src/H5FDmulti.h
+++ b/src/H5FDmulti.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDpkg.h b/src/H5FDpkg.h
index 45bcfd8..31dcf8d 100644
--- a/src/H5FDpkg.h
+++ b/src/H5FDpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h
index 36e57a1..0fc2135 100644
--- a/src/H5FDprivate.h
+++ b/src/H5FDprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -53,6 +51,7 @@ typedef struct H5FD_class_mpi_t {
     int  (*get_rank)(const H5FD_t *file);     /* Get the MPI rank of a process */
     int  (*get_size)(const H5FD_t *file);     /* Get the MPI size of a communicator */
     MPI_Comm (*get_comm)(const H5FD_t *file); /* Get the communicator for a file */
+    herr_t (*get_mpi_info)(H5FD_t *file, void** mpi_info); /* get MPI_Info for a file */
 } H5FD_class_mpi_t;
 #endif
 
@@ -115,6 +114,19 @@ typedef enum {
 #define H5FD_DXPL_TYPE_NAME              "H5P_dxpl_type"
 #endif /* H5_DEBUG_BUILD */
 
+/* I/O Info for an operation */
+typedef struct H5FD_io_info_t {
+    H5FD_t *file;                       /* File driver object */
+#ifndef H5_DEBUG_BUILD
+    const
+#endif /* H5_DEBUG_BUILD */
+    H5P_genplist_t *meta_dxpl;          /* Metadata DXPL object */
+#ifndef H5_DEBUG_BUILD
+    const
+#endif /* H5_DEBUG_BUILD */
+    H5P_genplist_t *raw_dxpl;           /* Raw data DXPL object */
+} H5FD_io_info_t;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -126,11 +138,10 @@ typedef enum {
 /******************************/
 
 /* Forward declarations for prototype arguments */
-struct H5P_genplist_t;
 struct H5F_t;
 
 H5_DLL int H5FD_term_interface(void);
-H5_DLL herr_t H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_addr);
+H5_DLL herr_t H5FD_locate_signature(H5FD_io_info_t *fdio_info, haddr_t *sig_addr);
 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);
@@ -142,12 +153,12 @@ H5_DLL H5FD_t *H5FD_open(const char *name, unsigned flags, hid_t fapl_id,
 		  haddr_t maxaddr);
 H5_DLL herr_t H5FD_close(H5FD_t *file);
 H5_DLL int H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2);
-H5_DLL haddr_t H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, struct H5F_t *f,
-    hsize_t size, haddr_t *align_addr, hsize_t *align_size);
+H5_DLL haddr_t H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, 
+    struct H5F_t *f, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size);
 H5_DLL herr_t H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, struct H5F_t *f,
     haddr_t addr, hsize_t size);
 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);
+    hid_t dxpl_id, 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, H5FD_mem_t type);
@@ -155,11 +166,11 @@ 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,
+H5_DLL herr_t H5FD_read(H5FD_io_info_t *fdio_info, H5FD_mem_t type,
     haddr_t addr, size_t size, void *buf/*out*/);
-H5_DLL herr_t H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type,
+H5_DLL herr_t H5FD_write(const H5FD_io_info_t *fdio_info, H5FD_mem_t type,
     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_flush(H5FD_t *file, hid_t dxpl_id, hbool_t 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);
@@ -167,6 +178,7 @@ 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);
 H5_DLL haddr_t H5FD_get_base_addr(const H5FD_t *file);
+H5_DLL herr_t H5FD_set_paged_aggr(H5FD_t *file, hbool_t paged);
 
 /* Function prototypes for MPI based VFDs*/
 #ifdef H5_HAVE_PARALLEL
@@ -189,6 +201,7 @@ H5_DLL herr_t H5FD_get_mpio_atomicity(H5FD_t *file, hbool_t *flag);
 H5_DLL int H5FD_mpi_get_rank(const H5FD_t *file);
 H5_DLL int H5FD_mpi_get_size(const H5FD_t *file);
 H5_DLL MPI_Comm H5FD_mpi_get_comm(const H5FD_t *_file);
+H5_DLL herr_t H5FD_get_mpi_info(H5FD_t *file, void** file_info);
 #endif /* H5_HAVE_PARALLEL */
 
 #endif /* !_H5FDprivate_H */
diff --git a/src/H5FDpublic.h b/src/H5FDpublic.h
index cabca06..3032e8a 100644
--- a/src/H5FDpublic.h
+++ b/src/H5FDpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -239,6 +237,19 @@ typedef enum H5F_mem_t	H5FD_mem_t;
      * driver supports the single-writer/multiple-readers I/O pattern.
      */
 #define H5FD_FEAT_SUPPORTS_SWMR_IO      0x00001000
+    /*
+     * Defining H5FD_FEAT_USE_ALLOC_SIZE for a VFL driver
+     * means that the library will just pass the allocation size to the
+     * the driver's allocation callback which will eventually handle alignment.
+     * This is specifically used for the multi/split driver.
+     */
+#define H5FD_FEAT_USE_ALLOC_SIZE	0x00002000
+    /*
+     * Defining H5FD_FEAT_PAGED_AGGR for a VFL driver
+     * means that the driver needs special file space mapping for paged aggregation.
+     * This is specifically used for the multi/split driver.
+     */
+#define H5FD_FEAT_PAGED_AGGR		0x00004000
 
 /* Forward declaration */
 typedef struct H5FD_t H5FD_t;
@@ -277,7 +288,7 @@ typedef struct H5FD_class_t {
                     haddr_t addr, size_t size, void *buffer);
     herr_t  (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl,
                      haddr_t addr, size_t size, const void *buffer);
-    herr_t  (*flush)(H5FD_t *file, hid_t dxpl_id, unsigned closing);
+    herr_t  (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
     herr_t  (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
     herr_t  (*lock)(H5FD_t *file, hbool_t rw);
     herr_t  (*unlock)(H5FD_t *file);
@@ -299,15 +310,15 @@ struct H5FD_t {
     hid_t               driver_id;      /*driver ID for this file   */
     const H5FD_class_t *cls;            /*constant class info       */
     unsigned long       fileno;         /* File 'serial' number     */
+    unsigned            access_flags;   /* File access flags (from create or open) */
     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  */
     hsize_t             alignment;      /* Allocation alignment     */
+    hbool_t             paged_aggr;     /* Paged aggregation for file space is enabled or not */
 };
 
 /* Define enum for the source of file image callbacks */
@@ -360,7 +371,7 @@ 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*/);
 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 H5FDflush(H5FD_t *file, hid_t dxpl_id, hbool_t 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);
diff --git a/src/H5FDsec2.c b/src/H5FDsec2.c
index 149715e..26913e2 100644
--- a/src/H5FDsec2.c
+++ b/src/H5FDsec2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -923,20 +921,24 @@ done:
 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 */
+    H5FD_sec2_t *file = (H5FD_sec2_t *)_file;   /* VFD file struct          */
+    int lock_flags;                             /* file locking flags       */
+    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")
+    /* Set exclusive or shared lock based on rw status */
+    lock_flags = rw ? LOCK_EX : LOCK_SH;
+
+    /* Place a non-blocking lock on the file */
+    if(HDflock(file->fd, lock_flags | LOCK_NB) < 0) {
+        if(ENOSYS == errno)
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+        else
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to lock file")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -957,15 +959,19 @@ done:
 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 */
+    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")
+    if(HDflock(file->fd, LOCK_UN) < 0) {
+        if(ENOSYS == errno)
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)")
+        else
+            HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to unlock file")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5FDsec2.h b/src/H5FDsec2.h
index 0c62597..a4ade0b 100644
--- a/src/H5FDsec2.h
+++ b/src/H5FDsec2.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDspace.c b/src/H5FDspace.c
index edc83e6..e451d6b 100644
--- a/src/H5FDspace.c
+++ b/src/H5FDspace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -19,7 +17,7 @@
  *			Jan  3 2008
  *			Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Space allocation routines for the file.
+ * Purpose:		Space allocation routines for the file driver code.
  *
  *-------------------------------------------------------------------------
  */
@@ -99,7 +97,7 @@ H5FL_DEFINE(H5FD_free_t);
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_extend(H5FD_t *file, H5FD_mem_t type, hbool_t new_block, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size)
+H5FD_extend(H5FD_t *file, H5FD_mem_t type, hsize_t size)
 {
     hsize_t orig_size = size;   /* Original allocation size */
     haddr_t eoa;                /* Address of end-of-allocated space */
@@ -117,40 +115,18 @@ H5FD_extend(H5FD_t *file, H5FD_mem_t type, hbool_t new_block, hsize_t size, hadd
     /* Get current end-of-allocated space address */
     eoa = file->cls->get_eoa(file, type);
 
-    /* Compute extra space to allocate, if this is a new block and should be aligned */
-    extra = 0;
-    if(new_block && file->alignment > 1 && orig_size >= file->threshold) {
-        hsize_t mis_align;              /* Amount EOA is misaligned */
-
-        /* Check for EOA already aligned */
-        if((mis_align = (eoa % file->alignment)) > 0) {
-            extra = file->alignment - mis_align;
-	    if(frag_addr)
-                *frag_addr = eoa - file->base_addr;     /* adjust for file's base address */
-	    if(frag_size)
-                *frag_size = extra;
-	} /* end if */
-    } /* end if */
-
-    /* Add in extra allocation amount */
-    size += extra;
-
     /* Check for overflow when extending */
     if(H5F_addr_overflow(eoa, size) || (eoa + size) > file->maxaddr)
         HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
 
-    /* Set the [possibly aligned] address to return */
-    ret_value = eoa + extra;
+    /* Set the [NOT aligned] address to return */
+    ret_value = eoa;
 
     /* Extend the end-of-allocated space address */
     eoa += size;
     if(file->cls->set_eoa(file, type, eoa) < 0)
         HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
 
-    /* Post-condition sanity check */
-    if(new_block && file->alignment && orig_size >= file->threshold)
-	HDassert(!(ret_value % file->alignment));
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_extend() */
@@ -160,6 +136,8 @@ done:
  * Function:    H5FD_alloc_real
  *
  * Purpose:     Allocate space in the file with the VFD
+ *              Note: the handling of alignment is moved up from each driver to
+ *              this routine.
  *
  * Return:      Success:    The format address of the new file memory.
  *              Failure:    The undefined address HADDR_UNDEF
@@ -170,8 +148,14 @@ 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)
+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)
 {
+    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 */
+    unsigned long flags = 0;    /* Driver feature flags */
+    hbool_t use_alloc_size;     /* Just pass alloc size to the driver */
     haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
@@ -185,16 +169,53 @@ HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size);
     HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
     HDassert(size > 0);
 
+    /* Check for query driver and call it */
+    if(file->cls->query)
+        (file->cls->query)(file, &flags);
+
+    /* Check for the driver feature flag */
+    use_alloc_size = flags & H5FD_FEAT_USE_ALLOC_SIZE;
+
+    /* Get current end-of-allocated space address */
+    eoa = file->cls->get_eoa(file, type);
+
+    /* Compute extra space to allocate, if this should be aligned */
+    extra = 0;
+    if(!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold) {
+        hsize_t mis_align;              /* Amount EOA is misaligned */
+
+        /* Check for EOA already aligned */
+        if((mis_align = (eoa % file->alignment)) > 0) {
+            extra = file->alignment - mis_align;
+            if(frag_addr)
+                *frag_addr = eoa - file->base_addr;     /* adjust for file's base address */
+            if(frag_size)
+                *frag_size = extra;
+        } /* end if */
+    } /* end if */
+
     /* Dispatch to driver `alloc' callback or extend the end-of-address marker */
+    /* For the multi/split driver: the size passed down to the alloc callback is the original size from H5FD_alloc() */
+    /* For all other drivers: the size passed down to the alloc callback is the size + [possibly] alignment size */
     if(file->cls->alloc) {
-        if((ret_value = (file->cls->alloc)(file, type, dxpl_id, size)) == HADDR_UNDEF)
+        ret_value = (file->cls->alloc)(file, type, dxpl_id, use_alloc_size ? size : size + extra);
+        if(!H5F_addr_defined(ret_value))
             HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver allocation request failed")
     } /* end if */
     else {
-        if((ret_value = H5FD_extend(file, type, TRUE, size, frag_addr, frag_size)) == HADDR_UNDEF)
+        ret_value = H5FD_extend(file, type, size + extra);
+        if(!H5F_addr_defined(ret_value))
             HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver eoa update request failed")
     } /* end else */
 
+    /* Set the [possibly aligned] address to return */
+    if(!use_alloc_size)
+        ret_value += extra;
+
+    /* Post-condition sanity check */
+    if(!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold)
+        HDassert(!(ret_value % file->alignment));
+
     /* Convert absolute file offset to relative address */
     ret_value -= file->base_addr;
 
@@ -243,9 +264,9 @@ H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, hsize_t size,
     if(!H5F_addr_defined(ret_value))
         HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "real 'alloc' request failed")
 
-    /* Mark superblock dirty in cache, so change to EOA will get encoded */
-    if(H5F_super_dirty(f) < 0)
-        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, HADDR_UNDEF, "unable to mark superblock as dirty")
+    /* Mark EOA info dirty in cache, so change will get encoded */
+    if(H5F_eoa_dirty(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, HADDR_UNDEF, "unable to mark EOA info as dirty")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -350,8 +371,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, haddr_t addr,
-    hsize_t size)
+H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f,
+    haddr_t addr, hsize_t size)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
@@ -367,9 +388,9 @@ H5FD_free(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, haddr_t addr,
     if(H5FD_free_real(file, dxpl_id, type, addr, size) < 0)
         HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "real 'free' request failed")
 
-    /* Mark superblock dirty in cache, so change to EOA will get encoded */
-    if(H5F_super_dirty(f) < 0)
-        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+    /* Mark EOA info dirty in cache, so change will get encoded */
+    if(H5F_eoa_dirty(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark EOA info as dirty")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -395,8 +416,8 @@ done:
  *-------------------------------------------------------------------------
  */
 htri_t
-H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end,
-    hsize_t extra_requested)
+H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, hid_t dxpl_id,
+    haddr_t blk_end, hsize_t extra_requested)
 {
     haddr_t eoa;                /* End of allocated space in file */
     htri_t ret_value = FALSE;   /* Return value */
@@ -420,12 +441,12 @@ H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end,
     /* Check if the block is exactly at the end of the file */
     if(H5F_addr_eq(blk_end, eoa)) {
         /* Extend the object by extending the underlying file */
-        if(HADDR_UNDEF == H5FD_extend(file, type, FALSE, extra_requested, NULL, NULL))
+        if(HADDR_UNDEF == H5FD_extend(file, type, extra_requested))
             HGOTO_ERROR(H5E_VFL, H5E_CANTEXTEND, FAIL, "driver extend request failed")
 
-        /* Mark superblock dirty in cache, so change to EOA will get encoded */
-        if(H5F_super_dirty(f) < 0)
-            HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+        /* Mark EOA info dirty in cache, so change will get encoded */
+        if(H5F_eoa_dirty(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark EOA info as dirty")
 
         /* Indicate success */
         HGOTO_DONE(TRUE)
diff --git a/src/H5FDstdio.c b/src/H5FDstdio.c
index 13ccd5c..5023af3 100644
--- a/src/H5FDstdio.c
+++ b/src/H5FDstdio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
@@ -24,6 +22,7 @@
  *          and is not intended for production use!
  */
 #include <assert.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -114,7 +113,6 @@ 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. */
@@ -174,7 +172,7 @@ static herr_t H5FD_stdio_read(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_
                 size_t size, void *buf);
 static herr_t H5FD_stdio_write(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
                 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_flush(H5FD_t *_file, hid_t dxpl_id, hbool_t 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);
@@ -601,13 +599,6 @@ H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxp
     /* Compute the address for the block to allocate */
     addr = file->eoa;
 
-    /* Check if we need to align this block */
-    if(size >= file->pub.threshold) {
-        /* Check for an already aligned block */
-        if((addr % file->pub.alignment) != 0)
-            addr = ((addr / file->pub.alignment) + 1) * file->pub.alignment;
-    } /* end if */
-
     file->eoa = addr + size;
 
     return addr;
@@ -960,7 +951,7 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxp
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, unsigned closing)
+H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, hbool_t closing)
 {
     H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
     static const char *func = "H5FD_stdio_flush";  /* Function Name for error reporting */
@@ -1083,8 +1074,8 @@ H5FD_stdio_truncate(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id,
  * 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.
  *
@@ -1098,21 +1089,27 @@ 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 */
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;     /* VFD file struct                      */
+    int lock_flags;                                 /* file locking flags                   */
+    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;
+    /* Set exclusive or shared lock based on rw status */
+    lock_flags = rw ? LOCK_EX : LOCK_SH;
+
+    /* Place a non-blocking lock on the file */
+    if(flock(file->fd, lock_flags | LOCK_NB) < 0) {
+        if(ENOSYS == errno)
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)", -1)
+        else
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "file lock failed", -1)
+    } /* end if */
 
-    /* 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)
+    /* Flush the stream */
     if(fflush(file->fp) < 0)
         H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1)
 
@@ -1122,16 +1119,15 @@ H5FD_stdio_lock(H5FD_t *_file, hbool_t rw)
 } /* end H5FD_stdio_lock() */
 
 /*-------------------------------------------------------------------------
- * Function:  H5F_stdio_unlock
- *
- * Purpose:  Unlock a file via flock
+ * Function:    H5F_stdio_unlock
  *
+ * Purpose:     Unlock a file via flock
+ *              NOTE: This function is a no-op if flock() is not present.
  *
- *           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
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Vailin Choi; March 2015
  *
@@ -1141,18 +1137,25 @@ 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 */
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;         /* VFD file struct                      */
+    static const char *func = "H5FD_stdio_unlock";  	/* Function Name for error reporting    */
 
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
 
     assert(file);
 
+    /* Flush the stream */
     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)
+
+    /* Place a non-blocking lock on the file */
+    if(flock(file->fd, LOCK_UN) < 0) {
+        if(ENOSYS == errno)
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "file locking disabled on this file system (use HDF5_USE_FILE_LOCKING environment variable to override)", -1)
+        else
+            H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "file unlock failed", -1)
+    } /* end if */
 
 #endif /* H5_HAVE_FLOCK */
 
diff --git a/src/H5FDstdio.h b/src/H5FDstdio.h
index 8281705..f99aacf 100644
--- a/src/H5FDstdio.h
+++ b/src/H5FDstdio.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FDtest.c b/src/H5FDtest.c
index 9d2f2e9..f528dfb 100644
--- a/src/H5FDtest.c
+++ b/src/H5FDtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -109,8 +107,7 @@ H5FD_supports_swmr_test(const char *vfd_name)
     if(!vfd_name || !HDstrcmp(vfd_name, ""))
         ret_value = TRUE;
     else
-        ret_value = !HDstrcmp(vfd_name, "direct")
-            || !HDstrcmp(vfd_name, "log")
+        ret_value = !HDstrcmp(vfd_name, "log")
             || !HDstrcmp(vfd_name, "sec2");
 
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5FDwindows.c b/src/H5FDwindows.c
index 8dd7555..76c4f18 100644
--- a/src/H5FDwindows.c
+++ b/src/H5FDwindows.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5private.h"      /* Generic Functions        */
diff --git a/src/H5FDwindows.h b/src/H5FDwindows.h
index 7a9d2cf..5cf68a1 100644
--- a/src/H5FDwindows.h
+++ b/src/H5FDwindows.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FL.c b/src/H5FL.c
index 00cbf0c..0e67414 100644
--- a/src/H5FL.c
+++ b/src/H5FL.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -293,7 +291,7 @@ H5FL_reg_init(H5FL_reg_head_t *head)
     H5FL_reg_gc_head.first=new_node;
 
     /* Indicate that the free list is initialized */
-    head->init=1;
+    head->init = TRUE;
 
     /* Make certain that the space allocated is large enough to store a free list pointer (eventually) */
     if(head->size<sizeof(H5FL_reg_node_t))
@@ -655,7 +653,7 @@ printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_reg_gc_head.fir
         /* 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;
+            H5FL_reg_gc_head.first->list->init = FALSE;
 
             /* Free the node from the garbage collection list */
             H5MM_xfree(H5FL_reg_gc_head.first);
@@ -822,7 +820,7 @@ H5FL_blk_init(H5FL_blk_head_t *head)
     H5FL_blk_gc_head.first=new_node;
 
     /* Indicate that the PQ is initialized */
-    head->init=1;
+    head->init = TRUE;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1326,7 +1324,7 @@ printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_blk_gc_head.fir
         /* 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 = FALSE;
 
             /* Free the node from the garbage collection list */
             H5MM_free(H5FL_blk_gc_head.first);
@@ -1379,7 +1377,7 @@ H5FL_arr_init(H5FL_arr_head_t *head)
     H5FL_arr_gc_head.first=new_node;
 
     /* Allocate room for the free lists */
-    if(NULL == (head->list_arr = (H5FL_arr_node_t *)H5MM_calloc((size_t)head->maxelem*sizeof(H5FL_arr_node_t))))
+    if(NULL == (head->list_arr = (H5FL_arr_node_t *)H5MM_calloc((size_t)head->maxelem * sizeof(H5FL_arr_node_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
 
     /* Initialize the size of each array */
@@ -1387,7 +1385,7 @@ H5FL_arr_init(H5FL_arr_head_t *head)
         head->list_arr[u].size = head->base_size + (head->elem_size * u);
 
     /* Indicate that the free list is initialized */
-    head->init = 1;
+    head->init = TRUE;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1795,7 +1793,7 @@ printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_arr_gc_head.fir
             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 = FALSE;
 
             /* Free the node from the garbage collection list */
             H5MM_free(H5FL_arr_gc_head.first);
@@ -2007,7 +2005,7 @@ H5FL_fac_init(size_t size)
 #endif /* H5FL_TRACK */
 
     /* Indicate that the free list is initialized */
-    factory->init = 1;
+    factory->init = TRUE;
 
     /* Set return value */
     ret_value = factory;
@@ -2417,7 +2415,7 @@ printf("%s: head->size = %d, head->allocated = %d\n", FUNC, (int)H5FL_fac_gc_hea
         HDassert(H5FL_fac_gc_head.first->list->allocated == 0);
 
         /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
-        H5FL_fac_gc_head.first->list->init = 0;
+        H5FL_fac_gc_head.first->list->init = FALSE;
 
         /* Free the node from the garbage collection list */
         H5FL_fac_gc_head.first = H5FL_FREE(H5FL_fac_gc_node_t, H5FL_fac_gc_head.first);
diff --git a/src/H5FLmodule.h b/src/H5FLmodule.h
index cfa585c..48b8d2b 100644
--- a/src/H5FLmodule.h
+++ b/src/H5FLmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h
index 3cd30a6..4aa44f9 100644
--- a/src/H5FLprivate.h
+++ b/src/H5FLprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -97,7 +95,7 @@ typedef struct H5FL_reg_node_t {
 
 /* Data structure for free list of blocks */
 typedef struct H5FL_reg_head_t {
-    unsigned init;      /* Whether the free list has been initialized */
+    hbool_t init;       /* Whether the free list has been initialized */
     unsigned allocated; /* Number of blocks allocated */
     unsigned onlist;    /* Number of blocks on free list */
     const char *name;   /* Name of the type */
@@ -166,9 +164,9 @@ typedef struct H5FL_blk_node_t {
 
 /* Data structure for priority queue of native block free lists */
 typedef struct H5FL_blk_head_t {
-    unsigned init;         /* Whether the free list has been initialized */
-    unsigned allocated;    /* Number of blocks allocated */
-    unsigned onlist;       /* Number of blocks on free list */
+    hbool_t init;       /* Whether the free list has been initialized */
+    unsigned allocated; /* Number of blocks allocated */
+    unsigned onlist;    /* Number of blocks on free list */
     size_t list_mem;    /* Amount of memory in block on free list */
     const char *name;   /* Name of the type */
     H5FL_blk_node_t *head;  /* Pointer to first free list in queue */
@@ -237,7 +235,7 @@ typedef struct H5FL_arr_node_t {
 
 /* Data structure for free list of array blocks */
 typedef struct H5FL_arr_head_t {
-    unsigned init;         /* Whether the free list has been initialized */
+    hbool_t init;          /* Whether the free list has been initialized */
     unsigned allocated;    /* Number of blocks allocated */
     size_t list_mem;       /* Amount of memory in block on free list */
     const char *name;      /* Name of the type */
@@ -354,7 +352,7 @@ typedef struct H5FL_fac_node_t H5FL_fac_node_t;
 
 /* Data structure for free list block factory */
 typedef struct H5FL_fac_head_t {
-    unsigned init;      /* Whether the free list has been initialized */
+    hbool_t init;       /* Whether the free list has been initialized */
     unsigned allocated; /* Number of blocks allocated */
     unsigned onlist;    /* Number of blocks on free list */
     size_t size;        /* Size of the blocks in the list */
diff --git a/src/H5FO.c b/src/H5FO.c
index a77e268..627ee64 100644
--- a/src/H5FO.c
+++ b/src/H5FO.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FOprivate.h b/src/H5FOprivate.h
index 4648f02..aa85c29 100644
--- a/src/H5FOprivate.h
+++ b/src/H5FOprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FS.c b/src/H5FS.c
index 00189a3..b789dfd 100644
--- a/src/H5FS.c
+++ b/src/H5FS.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -109,7 +107,7 @@ H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr, const H5FS_create_t *fs_c
     H5FS_t *fspace = NULL;      /* New free space structure */
     H5FS_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, NULL)
+    FUNC_ENTER_NOAPI(NULL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, nclasses);
 #endif /* H5FS_DEBUG */
@@ -135,7 +133,7 @@ HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, ncl
     fspace->swmr_write = (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) > 0;
 
     fspace->alignment = alignment;
-    fspace->threshold = threshold;
+    fspace->align_thres = threshold;
 
     /* Check if the free space tracker is supposed to be persistant */
     if(fs_addr) {
@@ -168,7 +166,7 @@ done:
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 #endif /* H5FS_DEBUG */
-    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_create() */
 
 

@@ -193,7 +191,7 @@ H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, uint16_t nclasses,
     H5FS_hdr_cache_ud_t cache_udata;    /* User-data for metadata cache callback */
     H5FS_t *ret_value = NULL;           /* Return value */
 
-    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, NULL)
+    FUNC_ENTER_NOAPI(NULL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Opening free space manager, fs_addr = %a, nclasses = %Zu\n", FUNC, fs_addr, nclasses);
 #endif /* H5FS_DEBUG */
@@ -227,7 +225,7 @@ HDfprintf(stderr, "%s: fspace->rc = %u\n", FUNC, fspace->rc);
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTINC, NULL, "unable to increment ref. count on free space header")
 
     fspace->alignment = alignment;
-    fspace->threshold = threshold;
+    fspace->align_thres = threshold;
 
     /* Unlock free space header */
     if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__NO_FLAGS_SET) < 0)
@@ -237,7 +235,7 @@ HDfprintf(stderr, "%s: fspace->rc = %u\n", FUNC, fspace->rc);
     ret_value = fspace;
 
 done:
-    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_open() */
 
 

@@ -260,7 +258,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_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+    FUNC_ENTER_NOAPI(FAIL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Deleting free space manager, fs_addr = %a\n", FUNC, fs_addr);
 #endif /* H5FS_DEBUG */
@@ -365,7 +363,7 @@ HDfprintf(stderr, "%s: Expunging free space section info from cache\n", FUNC);
 
                 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")
-            }
+            } /* end block */
 
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Done expunging free space section info from cache\n", FUNC);
@@ -387,7 +385,7 @@ 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_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_delete() */
 
 

@@ -409,7 +407,7 @@ H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check arguments. */
     HDassert(f);
@@ -570,7 +568,7 @@ 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_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_close() */
 
 

@@ -607,7 +605,7 @@ H5FS__new(const H5F_t *f, uint16_t nclasses, const H5FS_section_class_t *classes
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
 
     /* Set immutable free list parameters */
-    H5_CHECKED_ASSIGN(fspace->nclasses, unsigned, nclasses, size_t);
+    H5_CHECKED_ASSIGN(fspace->nclasses, uint16_t, 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")
@@ -825,7 +823,7 @@ 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)
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check arguments. */
     HDassert(f);
@@ -845,7 +843,7 @@ H5FS_alloc_hdr(H5F_t *f, H5FS_t *fspace, haddr_t *fs_addr, hid_t dxpl_id)
         *fs_addr = fspace->addr;
 
 done:
-    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_alloc_hdr() */
 
 

@@ -866,17 +864,14 @@ 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)
+    FUNC_ENTER_NOAPI(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)))
+        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 section info")
         fspace->alloc_sect_size = fspace->sect_size;
 
@@ -888,11 +883,15 @@ H5FS_alloc_sect(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
         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")
 
+        /* Since space has been allocated for the section info and the sinfo
+         * has been inserted into the cache, relinquish owership (i.e. float)
+         * the section info.
+         */
         fspace->sinfo = NULL;
     } /* end if */
 
 done:
-    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_alloc_sect() */
 
 

@@ -909,13 +908,13 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
+H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id, hbool_t free_file_space)
 {
     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)
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check arguments. */
     HDassert(f);
@@ -923,6 +922,7 @@ H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
 
     cache_flags = H5AC__DELETED_FLAG | H5AC__TAKE_OWNERSHIP_FLAG;;
 
+    /* Free space for section info */
     if(H5F_addr_defined(fspace->sect_addr)) {
         hsize_t	saved_size;     /* Size of previous section info */
         unsigned sinfo_status = 0;      /* Section info cache status */
@@ -955,7 +955,8 @@ H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
 
         /* 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)
+            if(free_file_space &&
+               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 */
 
@@ -964,6 +965,7 @@ H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
     } /* end if */
 
+    /* Free space for header */
     if(H5F_addr_defined(fspace->addr)) {
         unsigned hdr_status = 0;        /* Header entry status */
 
@@ -996,91 +998,14 @@ H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
         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)
+        if(free_file_space &&
+           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:     Make 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_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() */
+} /* H5FS_free() */
 
 

 /*-------------------------------------------------------------------------
@@ -1248,6 +1173,23 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FS_sinfo_dest() */
 
+herr_t 
+H5FS_get_sect_count(const H5FS_t *frsp, hsize_t *tot_sect_count)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(frsp);
+    HDassert(tot_sect_count);
+
+    /* Report statistics for free space */
+    *tot_sect_count = frsp->serial_sect_count;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
 #ifdef H5FS_DEBUG_ASSERT
 

 /*-------------------------------------------------------------------------
@@ -1291,3 +1233,4 @@ HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", "H5FS_assert", fspace->t
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FS_assert() */
 #endif /* H5FS_DEBUG_ASSERT */
+
diff --git a/src/H5FScache.c b/src/H5FScache.c
index 9dab742..628fba0 100644
--- a/src/H5FScache.c
+++ b/src/H5FScache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -37,6 +35,7 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5ACprivate.h"        /* Metadata cache                       */
 #include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File          			*/
 #include "H5FSpkg.h"		/* File free space			*/
 #include "H5MFprivate.h"	/* File memory management		*/
 #include "H5VMprivate.h"	/* Vectors and arrays 			*/
@@ -78,33 +77,26 @@ static herr_t H5FS__sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *ke
 static herr_t H5FS__sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
 
 /* Metadata cache callbacks */
-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 herr_t H5FS__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
 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, 
+static herr_t H5FS__cache_hdr_image_len(const void *thing, size_t *image_len);
+static herr_t H5FS__cache_hdr_pre_serialize(H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_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_notify(H5AC_notify_action_t action, 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 herr_t H5FS__cache_sinfo_get_initial_load_size(void *udata, size_t *image_len);
 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, 
+static herr_t H5FS__cache_sinfo_image_len(const void *thing, size_t *image_len);
+static herr_t H5FS__cache_sinfo_pre_serialize(H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_len,
     unsigned *flags);
 static herr_t H5FS__cache_sinfo_serialize(const H5F_t *f, void *image,
     size_t len, void *thing);
@@ -122,15 +114,15 @@ const H5AC_class_t H5AC_FSPACE_HDR[1] = {{
     "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_get_initial_load_size,      /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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_notify, 		/* 'notify' callback */
     H5FS__cache_hdr_free_icr,           /* 'free_icr' callback */
-    NULL,			        /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -140,7 +132,8 @@ const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
     "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_get_initial_load_size,    /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -148,7 +141,6 @@ const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
     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 */
 }};
 
@@ -165,7 +157,7 @@ const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FS__cache_hdr_get_load_size
+ * Function:    H5FS__cache_hdr_get_initial_load_size
  *
  * Purpose:     Compute the size of the data structure on disk.
  *
@@ -178,10 +170,8 @@ const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
  *-------------------------------------------------------------------------
  */
 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)
+H5FS__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -191,16 +181,11 @@ H5FS__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_le
     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);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)H5FS_HEADER_SIZE(udata->f);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FS__cache_hdr_get_load_size() */
+} /* end H5FS__cache_hdr_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -310,7 +295,7 @@ H5FS__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
     /* # of section classes */
     /* (only check if we actually have some classes) */
     UINT16DECODE(image, nclasses);
-    if(fspace->nclasses > 0 && fspace->nclasses != nclasses)
+    if(fspace->nclasses > 0 && nclasses > fspace->nclasses)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "section class count mismatch")
 
     /* Shrink percent */
@@ -372,8 +357,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5FS__cache_hdr_image_len(const void *_thing, size_t *image_len)
 {
     const H5FS_t *fspace = (const H5FS_t *)_thing;       /* Pointer to the object */
 
@@ -420,9 +404,8 @@ H5FS__cache_hdr_image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 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, 
+H5FS__cache_hdr_pre_serialize(H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t H5_ATTR_UNUSED len, haddr_t *new_addr, size_t *new_len,
     unsigned *flags)
 {
     H5FS_t 	*fspace = (H5FS_t *)_thing;     /* Pointer to the object */
@@ -430,7 +413,7 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
     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)
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -456,7 +439,7 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
         /* 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
+         * 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 
@@ -500,7 +483,7 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
          * 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
@@ -514,8 +497,8 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
          *         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
+         *         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,
@@ -529,22 +512,30 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
          * 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.
+         * serialize the header if it thought it was clean.
          */
         if(fspace->serial_sect_count > 0 && H5F_addr_defined(fspace->addr)) {
-	    /* Sanity check */
+            /* 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
+                haddr_t tag = HADDR_UNDEF;
+
+                /* 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")
+
+                /* Get the tag for this free space manager and use it to insert the entry */
+                if(H5AC_get_tag((const void *)fspace, &tag) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTTAG, FAIL, "can't get tag for metadata cache object")
+                H5_BEGIN_TAG(dxpl_id, tag, FAIL)
+                if(H5AC_insert_entry((H5F_t *)f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR_TAG(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space sections to cache")
+                H5_END_TAG(FAIL)
 
                 HDassert(fspace->sinfo->cache_info.size == fspace->alloc_sect_size);
 
@@ -556,7 +547,7 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
             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
+                /* move the section info from temporary (AKA imaginary) file
                  * space to real file space.
                  */
 
@@ -604,15 +595,17 @@ H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
          * 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_POINT_OF_NO_RETURN(f)) {
+            HDassert(fspace->serial_sect_count > 0);
+            HDassert(fspace->sect_size > 0);
+            HDassert(fspace->alloc_sect_size == (size_t)fspace->sect_size);
+        } /* end if */
 
         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 
+            /* we have work to do -- must relocate section info into 
              * real file space.
              *
              * Since the section info address is in temporary space (AKA
@@ -662,7 +655,7 @@ done:
     if(H5AC_reset_ring(dxpl, orig_ring) < 0)
         HDONE_ERROR(H5E_FSPACE, H5E_CANTSET, FAIL, "unable to set property value")
 
-    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FS__cache_hdr_pre_serialize() */
 
 

@@ -710,10 +703,12 @@ H5FS__cache_hdr_serialize(const H5F_t *f, void *_image, size_t len,
      * 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)));
+
+    if(!H5F_POINT_OF_NO_RETURN(f))
+        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)));
 
     /* Magic number */
     HDmemcpy(image, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
@@ -775,9 +770,64 @@ H5FS__cache_hdr_serialize(const H5F_t *f, void *_image, size_t len,
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS__cache_hdr_serialize() */
 
-/***************************************/
-/* no H5FS__cache_hdr_notify() function */
-/***************************************/
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__cache_hdr_notify
+ *
+ * Purpose:     Handle cache action notifications
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              January 3, 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS__cache_hdr_notify(H5AC_notify_action_t action, void *_thing)
+{
+    H5FS_t *fspace = (H5FS_t *)_thing;  /* Pointer to the object */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(fspace);
+
+    /* 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_ENTRY_DIRTIED:
+            if(H5AC_unsettle_entry_ring(fspace) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to mark FSM ring as unsettled")
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            /* do nothing */
+            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 */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FS__cache_hdr_notify() */
 
 

 /*-------------------------------------------------------------------------
@@ -822,13 +872,9 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FS__cache_hdr_free_icr() */
 
-/********************************************************/
-/* metadata cache callback definitions for section info */
-/********************************************************/
-
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS__cache_sinfo_get_load_size()
+ * Function:	H5FS__cache_sinfo_get_initial_load_size()
  *
  * Purpose:	Compute the size of the on disk image of the free space 
  *		manager section info, and place this value in *image_len.
@@ -842,10 +888,8 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5FS__cache_sinfo_get_initial_load_size(void  *_udata, size_t *image_len)
 {
-    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 */
 
@@ -858,15 +902,11 @@ H5FS__cache_sinfo_get_load_size(const void *_image, void  *_udata, size_t *image
     HDassert(fspace->sect_size > 0);
     HDassert(image_len);
 
-    if(image == NULL)
-	*image_len = (size_t)(fspace->sect_size);
-    else {
-        HDassert(actual_len);
-        HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = (size_t)(fspace->sect_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FS__cache_sinfo_get_load_size() */
+} /* end H5FS__cache_sinfo_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -1024,7 +1064,7 @@ H5FS__cache_sinfo_deserialize(const void *_image, size_t len, void *_udata,
 
                 /* 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)
+                    if(H5FS_sect_add(udata->f, udata->dxpl_id, udata->fspace, new_sect, H5FS_ADD_DESERIALIZING, udata) < 0)
                         HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, NULL, "can't add section to free space manager")
             } /* end for */
         } while(image < (((const uint8_t *)_image + old_sect_size) - H5FS_SIZEOF_CHKSUM));
@@ -1073,8 +1113,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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__cache_sinfo_image_len(const void *_thing, size_t *image_len)
 {
     const H5FS_sinfo_t *sinfo = (const H5FS_sinfo_t *)_thing;   /* Pointer to the object */
     const H5FS_t *fspace;               /* Free space header */
@@ -1115,9 +1154,8 @@ H5FS__cache_sinfo_image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 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__cache_sinfo_pre_serialize(H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_len, unsigned *flags)
 {
     H5FS_sinfo_t 	*sinfo = (H5FS_sinfo_t *)_thing;        /* Pointer to the object */
     H5FS_t 		*fspace;                /* Free space header */
@@ -1142,8 +1180,9 @@ H5FS__cache_sinfo_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
     HDassert(new_len);
     HDassert(flags);
 
-    /* we shouldn't be called if the section info is empty */
-    HDassert(fspace->serial_sect_count > 0);
+    /* we shouldn't be called if the section info is empty, unless we hit the point of no return. */
+    if(!H5F_POINT_OF_NO_RETURN(f))
+        HDassert(fspace->serial_sect_count > 0);
 
     sinfo_addr = addr; /* this will change if we relocate the section data */
 
@@ -1303,6 +1342,12 @@ H5FS__cache_sinfo_notify(H5AC_notify_action_t action, void *_thing)
                 break;
 
 	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+            case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
                 /* do nothing */
                 break;
 
diff --git a/src/H5FSdbg.c b/src/H5FSdbg.c
index fbdeb70..450216b 100644
--- a/src/H5FSdbg.c
+++ b/src/H5FSdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FSint.c b/src/H5FSint.c
index 60cedd5..1a41172 100644
--- a/src/H5FSint.c
+++ b/src/H5FSint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FSmodule.h b/src/H5FSmodule.h
index b435b79..b2869dd 100644
--- a/src/H5FSmodule.h
+++ b/src/H5FSmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5FSpkg.h b/src/H5FSpkg.h
index 616499f..df1d92f 100644
--- a/src/H5FSpkg.h
+++ b/src/H5FSpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -65,18 +63,18 @@
                                                                               \
     /* Free space header specific fields */                                   \
     + 1 /* Client ID */                                                       \
-    + H5F_SIZEOF_SIZE(f) /* Total free space tracked */                       \
-    + H5F_SIZEOF_SIZE(f) /* Total # of sections tracked */                    \
-    + H5F_SIZEOF_SIZE(f) /* # of serializable sections tracked */             \
-    + H5F_SIZEOF_SIZE(f) /* # of ghost sections tracked */                    \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* Total free space tracked */                       \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* Total # of sections tracked */                    \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* # of serializable sections tracked */             \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* # of ghost sections tracked */                    \
     + 2 /* Number of section classes */                                       \
     + 2 /* Shrink percent */                                                  \
     + 2 /* Expand percent */                                                  \
     + 2 /* Size of address space for sections (log2 of value) */              \
-    + H5F_SIZEOF_SIZE(f) /* Max. size of section to track */                  \
-    + H5F_SIZEOF_ADDR(f) /* Address of serialized free space sections */      \
-    + H5F_SIZEOF_SIZE(f) /* Size of serialized free space sections used */    \
-    + H5F_SIZEOF_SIZE(f) /* Allocated size of serialized free space sections */ \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* Max. size of section to track */                  \
+    + (unsigned)H5F_SIZEOF_ADDR(f) /* Address of serialized free space sections */      \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* Size of serialized free space sections used */    \
+    + (unsigned)H5F_SIZEOF_SIZE(f) /* Allocated size of serialized free space sections */ \
     )
 
 /* Size of the free space serialized sections on disk */
@@ -85,7 +83,7 @@
     H5FS_METADATA_PREFIX_SIZE                                                 \
                                                                               \
     /* Free space serialized sections specific fields */                      \
-    + H5F_SIZEOF_ADDR(f) /* Address of free space header for these sections */ \
+    + (unsigned)H5F_SIZEOF_ADDR(f) /* Address of free space header for these sections */ \
     )
 
 
@@ -187,8 +185,8 @@ struct H5FS_t {
                                 /* 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                            */
+    hsize_t    align_thres;     /* Threshold for alignment              */
 
 
 /* Memory data structures (not stored directly) */
@@ -200,12 +198,6 @@ struct H5FS_t {
 /* Package Private Variables */
 /*****************************/
 
-/* H5FS header inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_FSPACE_HDR[1];
-
-/* H5FS section info inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_FSPACE_SINFO[1];
-
 /* Declare a free list to manage the H5FS_node_t struct */
 H5FL_EXTERN(H5FS_node_t);
 
diff --git a/src/H5FSprivate.h b/src/H5FSprivate.h
index 2dde410..c0467a6 100644
--- a/src/H5FSprivate.h
+++ b/src/H5FSprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -31,7 +29,6 @@
 #include "H5FSpublic.h"
 
 /* Private headers needed by this file */
-#include "H5ACprivate.h"	/* Metadata cache			*/
 #include "H5Fprivate.h"		/* File access				*/
 #include "H5FLprivate.h"	/* Free Lists                           */
 
@@ -68,6 +65,12 @@
                                          *      managed sections is in flux)
                                          */
 
+#define H5FS_PAGE_END_NO_ADD    0x08    /* For "small" page fs:
+                                         * Don't add section to free space:
+                                         * 	when the section is at page end and
+                                         * 	when the section size is <= "small"
+                                         */
+
 /* Flags for deserialize callback  */
 #define H5FS_DESERIALIZE_NO_ADD  0x01   /* Don't add section to free space
                                          *      manager after it's deserialized
@@ -99,11 +102,11 @@ typedef struct H5FS_section_class_t {
     herr_t (*term_cls)(struct H5FS_section_class_t *);                  /* Routine to terminate class-specific settings */
 
     /* Object methods */
-    herr_t (*add)(H5FS_section_info_t *, unsigned *, void *);       /* Routine called when section is about to be added to manager */
+    herr_t (*add)(H5FS_section_info_t **, unsigned *, void *);       /* Routine called when section is about to be added to manager */
     herr_t (*serialize)(const struct H5FS_section_class_t *, const H5FS_section_info_t *, uint8_t *);        /* Routine to serialize a "live" section into a buffer */
     H5FS_section_info_t *(*deserialize)(const struct H5FS_section_class_t *, hid_t dxpl_id, const uint8_t *, haddr_t, hsize_t, unsigned *);     /* Routine to deserialize a buffer into a "live" section */
     htri_t (*can_merge)(const H5FS_section_info_t *, const H5FS_section_info_t *, void *);  /* Routine to determine if two nodes are mergable */
-    herr_t (*merge)(H5FS_section_info_t *, H5FS_section_info_t *, void *);      /* Routine to merge two nodes */
+    herr_t (*merge)(H5FS_section_info_t **, H5FS_section_info_t *, void *);      /* Routine to merge two nodes */
     htri_t (*can_shrink)(const H5FS_section_info_t *, void *);        /* Routine to determine if node can shrink container */
     herr_t (*shrink)(H5FS_section_info_t **, void *);   /* Routine to shrink container */
     herr_t (*free)(H5FS_section_info_t *);              /* Routine to free node */
@@ -183,9 +186,8 @@ 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);
+H5_DLL herr_t H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id, 
+    hbool_t free_file_space);
 
 /* Free space section routines */
 H5_DLL herr_t H5FS_sect_add(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
@@ -193,7 +195,7 @@ H5_DLL herr_t H5FS_sect_add(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
 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);
+    haddr_t addr, hsize_t size, hsize_t extra_requested, unsigned flags, void *op_data);
 H5_DLL herr_t H5FS_sect_remove(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
     H5FS_section_info_t *node);
 H5_DLL htri_t H5FS_sect_find(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
@@ -203,11 +205,18 @@ 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, 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);
+H5_DLL htri_t H5FS_sect_try_shrink_eoa(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    void *op_data);
 
 /* Statistics routine */
 H5_DLL herr_t H5FS_stat_info(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *stats);
+H5_DLL herr_t H5FS_get_sect_count(const H5FS_t *frsp, hsize_t *tot_sect_count);
+
+/* free space manager settling routines */
+H5_DLL herr_t H5FS_vfd_alloc_hdr_and_section_info_if_needed(H5F_t *f,
+                                                          hid_t dxpl_id,
+                                                          H5FS_t *fspace,
+                                                          haddr_t *fs_addr_ptr);
 
 /* Debugging routines for dumping file structures */
 H5_DLL herr_t H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
diff --git a/src/H5FSpublic.h b/src/H5FSpublic.h
index 87debe8..3090d0d 100644
--- a/src/H5FSpublic.h
+++ b/src/H5FSpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5FSsection.c b/src/H5FSsection.c
index 5638f4f..8f911a4 100644
--- a/src/H5FSsection.c
+++ b/src/H5FSsection.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -25,6 +23,8 @@
 /* Module Setup */
 /****************/
 
+#define H5F_FRIEND              /*suppress error about including H5Fpkg   */
+
 #include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
 
 
@@ -33,6 +33,7 @@
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access                          */
 #include "H5FSpkg.h"		/* File free space			*/
 #include "H5MFprivate.h"	/* File memory management		*/
 #include "H5VMprivate.h"		/* Vectors and arrays 			*/
@@ -144,7 +145,7 @@ HDfprintf(stderr, "%s: fspace->addr = %a\n", FUNC, fspace->addr);
 
     /* Set non-zero values */
     sinfo->nbins = H5VM_log2_gen(fspace->max_sect_size);
-    sinfo->sect_prefix_size = (size_t)H5FS_SINFO_PREFIX_SIZE(f);
+    sinfo->sect_prefix_size = H5FS_SINFO_PREFIX_SIZE(f);
     sinfo->sect_off_size = (fspace->max_sect_addr + 7) / 8;
     sinfo->sect_len_size = H5VM_limit_enc_size((uint64_t)fspace->max_sect_size);
 #ifdef H5FS_SINFO_DEBUG
@@ -208,7 +209,7 @@ 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_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+    FUNC_ENTER_NOAPI_NOINIT
 
 #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);
@@ -298,7 +299,7 @@ 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_TAG(ret_value, FAIL)
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5FS_sinfo_lock() */
 
 

@@ -1210,11 +1211,13 @@ H5FS_sect_merge(H5FS_t *fspace, H5FS_section_info_t **sect, void *op_data)
                             HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
 
                         /* Merge the two sections together */
-                        if((*tmp_sect_cls->merge)(tmp_sect, *sect, op_data) < 0)
+                        if((*tmp_sect_cls->merge)(&tmp_sect, *sect, op_data) < 0)
                             HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't merge two sections")
 
                         /* Retarget section pointer to 'less than' node that was merged into */
                         *sect = tmp_sect;
+			if(*sect == NULL) 
+			    HGOTO_DONE(ret_value);
 
                         /* Indicate successful merge occurred */
                         modified = TRUE;
@@ -1254,9 +1257,13 @@ H5FS_sect_merge(H5FS_t *fspace, H5FS_section_info_t **sect, void *op_data)
                             HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
 
                         /* Merge the two sections together */
-                        if((*sect_cls->merge)(*sect, tmp_sect, op_data) < 0)
+                        if((*sect_cls->merge)(sect, tmp_sect, op_data) < 0)
                             HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't merge two sections")
 
+                        /* It's possible that the merge caused the section to be deleted (particularly in the paged allocation case) */
+                        if(*sect == NULL) 
+                            HGOTO_DONE(ret_value);
+
                         /* Indicate successful merge occurred */
                         modified = TRUE;
                     } /* end if */
@@ -1383,7 +1390,7 @@ HDfprintf(stderr, "%s: *sect = {%a, %Hu, %u, %s}\n", FUNC, sect->addr, sect->siz
     /* Call "add" section class callback, if there is one */
     cls = &fspace->sect_cls[sect->type];
     if(cls->add) {
-        if((*cls->add)(sect, &flags, op_data) < 0)
+        if((*cls->add)(&sect, &flags, op_data) < 0)
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "'add' section class callback failed")
     } /* end if */
 
@@ -1411,7 +1418,7 @@ HDfprintf(stderr, "%s: fspace->tot_space = %Hu\n", FUNC, fspace->tot_space);
 #endif /* H5FS_SINFO_DEBUG */
     /* Mark free space sections as changed */
     /* (if adding sections while deserializing sections, don't set the flag) */
-    if(!(flags & H5FS_ADD_DESERIALIZING))
+    if(!(flags & (H5FS_ADD_DESERIALIZING | H5FS_PAGE_END_NO_ADD)))
         sinfo_modified = TRUE;
 
 done:
@@ -1444,7 +1451,7 @@ HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
  */
 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)
+    hsize_t size, hsize_t extra_requested, 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 */
@@ -1528,10 +1535,16 @@ if(_section_)
                     /* Adjust section by amount requested */
                     sect->addr += extra_requested;
                     sect->size -= extra_requested;
-
-                    /* Re-add adjusted section to free sections data structures */
-                    if(H5FS_sect_link(fspace, sect, 0) < 0)
-                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+                    if(cls->add)
+                        if((*cls->add)(&sect, &flags, op_data) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "'add' section class callback failed")
+
+                    /* Re-adding the section could cause it to disappear (particularly when paging) */
+                    if(sect) {
+                        /* Re-add adjusted section to free sections data structures */
+                        if(H5FS_sect_link(fspace, sect, 0) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+                    } /* end if */
                 } /* end if */
                 else {
                     /* Sanity check */
@@ -1667,7 +1680,7 @@ HDfprintf(stderr, "%s: fspace->sinfo->nbins = %u\n", FUNC, fspace->sinfo->nbins)
 HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
 #endif /* QAK */
     alignment = fspace->alignment;
-    if(!((alignment > 1) && (request >= fspace->threshold)))
+    if(!((alignment > 1) && (request >= fspace->align_thres)))
         alignment = 0; /* no alignment */
 
     do {
@@ -1725,10 +1738,10 @@ HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
                         HDassert(alignment);
                         HDassert(cls);
 
-                        if ((mis_align = curr_sect->addr % alignment))
+                        if((mis_align = curr_sect->addr % alignment))
                             frag_size = alignment - mis_align;
 
-                        if ((curr_sect->size >= (request + frag_size)) && (cls->split)) {
+                        if((curr_sect->size >= (request + frag_size)) && (cls->split)) {
                             /* remove the section with aligned address */
                             if(NULL == (*node = (H5FS_section_info_t *)H5SL_remove(curr_fspace_node->sect_list, &curr_sect->addr)))
                                 HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
@@ -1745,17 +1758,17 @@ HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
                              *  NODE's addr & size are updated to point to the remaining aligned section
                              * split_sect is re-added to free-space
                              */
-                            if (mis_align) {
+                            if(mis_align) {
                                 split_sect = cls->split(*node, frag_size);
                                 if((H5FS_sect_link(fspace, split_sect, 0) < 0))
                                     HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
                                 /* sanity check */
                                 HDassert(split_sect->addr < (*node)->addr);
                                 HDassert(request <= (*node)->size);
-                            }
+                            } /* end if */
                             /* Indicate that we found a node for the request */
                             HGOTO_DONE(TRUE)
-                        }
+                        } /* end if */
 
                         /* Get the next section node in the list */
                         curr_sect_node = H5SL_next(curr_sect_node);
@@ -1831,7 +1844,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 */
     } /* end if */
 
 done:
@@ -2349,7 +2362,7 @@ HDfprintf(stderr, "%s: sect->size = %Hu, sect->addr = %a, sect->type = %u\n", "H
  *-------------------------------------------------------------------------
  */
 htri_t
-H5FS_sect_try_shrink_eoa(const H5F_t *f, hid_t dxpl_id, const H5FS_t *fspace, void *op_data)
+H5FS_sect_try_shrink_eoa(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, void *op_data)
 {
     hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
     hbool_t section_removed = FALSE;    /* Whether a section was removed */
@@ -2406,42 +2419,264 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_query_last_sect
- *
- * Purpose:	Retrieve info about the last section on the merge list
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Function:    H5FS_vfd_alloc_hdr_and_section_info_if_needed
+ *
+ * Purpose:     This function is part of a hack to patch over a design
+ *              flaw in the free space managers for file space allocation.
+ *              Specifically, if a free space manager allocates space for
+ *              its own section info, it is possible for it to
+ *              go into an infinite loop as it:
+ *
+ *                      1) computes the size of the section info
+ *
+ *                      2) allocates file space for the section info
+ *
+ *                      3) notices that the size of the section info
+ *                         has changed
+ *
+ *                      4) deallocates the section info file space and
+ *                         returns to 1) above.
+ *
+ *              Similarly, if it allocates space for its own header, it
+ *              can go into an infinte loop as it:
+ *
+ *                      1) allocates space for the header
+ *
+ *                      2) notices that the free space manager is empty
+ *                         and thus should not have file space allocated
+ *                         to its header
+ *
+ *                      3) frees the space allocated to the header
+ *
+ *                      4) notices that the free space manager is not
+ *                         empty and thus must have file space allocated
+ *                         to it, and thus returns to 1) above.
+ *
+ *              In a nutshell, the solution applied in this hack is to
+ *              deallocate file space for the free space manager(s) that
+ *              handle FSM header and/or section info file space allocations,
+ *              wait until all other allocation/deallocation requests have
+ *              been handled, and then test to see if the free space manager(s)
+ *              in question are empty.  If they are, do nothing.  If they
+ *              are not, allocate space for them at end of file bypassing the
+ *              usual file space allocation calls, and thus avoiding the
+ *              potential infinite loops.
+ *
+ *              The purpose of this function is to allocate file space for
+ *              the header and section info of the target free space manager
+ *              directly from the VFD if needed.  In this case the function
+ *              also re-inserts the header and section info in the metadata
+ *              cache with this allocation.
+ *
+ *		When paged allocation is not enabled, allocation of space 
+ *		for the free space manager header and section info is 
+ *		straight forward -- we simply allocate the space directly 
+ *		from file driver.
+ *
+ *              Note that if f->shared->alignment > 1, and EOA is not a
+ *              multiple of the alignment, it is possible that performing
+ *              these allocations may generate a fragment of file space in
+ *              addition to the space allocated for the section info.  This
+ *		excess space is dropped on the floor.  As shall be seen,
+ *		it will usually be reclaimed later.
+ *
+ *		When page allocation is enabled, things are more difficult,
+ *		as there is the possibility that page buffering will be 
+ *		enabled when the free space managers are read.  To allow
+ *		for this, we must ensure that space allocated for the 
+ *		free space manager header and section info is either larger
+ *		than a page, or resides completely withing a page.
+ *
+ *		Do this by allocating space for the free space header and 
+ *		section info starting at page boundaries, and extending 
+ *		allocation to the next page boundary.  This of course wastes
+ *		space, but see below.
+ *
+ *              On the first free space allocation / deallocation after the 
+ *		next file open, we will read the self referential free space 
+ *		managers, float them and reduce the EOA to its value prior 
+ *		to allocation of file space for the self referential free 
+ *              space managers on the preceeding file close.  This EOA value 
+ *		is stored in the free space manager superblock extension 
+ *		message.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
  *
- * Programmer:	Vailin Choi
+ * Programmer:  John Mainzer
+ *              6/6/16
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FS_sect_query_last_sect(const H5FS_t *fspace, haddr_t *sect_addr, hsize_t *sect_size)
+H5FS_vfd_alloc_hdr_and_section_info_if_needed(H5F_t *f, hid_t dxpl_id,
+    H5FS_t *fspace, haddr_t *fs_addr_ptr)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    hsize_t	hdr_alloc_size;
+    hsize_t	sinfo_alloc_size;
+    haddr_t     sect_addr = HADDR_UNDEF;        /* address of sinfo */
+    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 */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
 
     /* Check arguments. */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
     HDassert(fspace);
+    HDassert(fs_addr_ptr);
 
-    if(fspace->sinfo && fspace->sinfo->merge_list) {
-        H5SL_node_t *last_node;             /* Last node in merge list */
+    /* the section info should be unlocked */
+    HDassert(fspace->sinfo_lock_count == 0);
 
-        /* Check for last node in the merge list */
-        if(NULL != (last_node = H5SL_last(fspace->sinfo->merge_list))) {
-            H5FS_section_info_t *tmp_sect;      /* Temporary free space section */
+    /* no space should be allocated */
+    HDassert(*fs_addr_ptr == HADDR_UNDEF);
+    HDassert(fspace->addr == HADDR_UNDEF);
+    HDassert(fspace->sect_addr == HADDR_UNDEF);
+    HDassert(fspace->alloc_sect_size == 0);
 
-            /* Get the pointer to the last section, from the last node */
-            tmp_sect = (H5FS_section_info_t *)H5SL_item(last_node);
-            HDassert(tmp_sect);
-	    if(sect_addr)
-                *sect_addr = tmp_sect->addr;
-	    if(sect_size)
-                *sect_size = tmp_sect->size;
-	} /* end if */
+    /* persistant free space managers must be enabled */
+    HDassert(f->shared->fs_persist);
+
+    /* At present, all free space strategies enable the free space managers.
+     * This will probably change -- at which point this assertion should 
+     * be revisited.
+     */
+    /* Updated: Only the following two strategies enable the free-space managers */
+    HDassert((f->shared->fs_strategy == H5F_FSPACE_STRATEGY_FSM_AGGR) ||
+             (f->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE));
+
+    if(fspace->serial_sect_count > 0) {
+        /* the section info is floating, so space->sinfo should be defined */
+        HDassert(fspace->sinfo);
+
+        /* start by allocating file space for the header */
+
+        /* Get the EOA for the file -- need for sanity check below */
+        if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_FSPACE_HDR)))
+           HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "Unable to get eoa")
+
+        /* check for overlap into temporary allocation space */
+        if(H5F_IS_TMP_ADDR(f, (eoa + fspace->sect_size)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, FAIL, "hdr file space alloc will overlap into 'temporary' file space")
+
+	hdr_alloc_size = H5FS_HEADER_SIZE(f);
+
+	/* if page allocation is enabled, extend the hdr_alloc_size to the 
+	 * next page boundary.
+         */
+        if(H5F_PAGED_AGGR(f)) {
+            HDassert(0 == (eoa % f->shared->fs_page_size));
+
+	    hdr_alloc_size = ((hdr_alloc_size / f->shared->fs_page_size) + 1) * f->shared->fs_page_size;
+
+            HDassert(hdr_alloc_size >= H5FS_HEADER_SIZE(f));
+            HDassert((hdr_alloc_size % f->shared->fs_page_size) == 0);
+        } /* end if */
+
+        /* allocate space for the hdr */
+        if(HADDR_UNDEF == (fspace->addr = H5FD_alloc(f->shared->lf, dxpl_id,
+                                                   H5FD_MEM_FSPACE_HDR, f, 
+                                                   hdr_alloc_size,
+                                                   &eoa_frag_addr,
+                                                   &eoa_frag_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTALLOC, FAIL, "can't allocate file space for hdr")
+
+        /* if the file alignement is 1, there should be no
+         * eoa fragment.  Otherwise, drop any fragment on the floor.
+         */
+        HDassert((eoa_frag_size == 0) || (f->shared->alignment != 1));
+
+        /* 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")
+
+        *fs_addr_ptr = fspace->addr;
+
+        /* now allocate file space for the section info */
+
+        /* Get the EOA for the file -- need for sanity check below */
+        if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_FSPACE_SINFO)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "Unable to get eoa")
+
+        /* check for overlap into temporary allocation space */
+        if(H5F_IS_TMP_ADDR(f, (eoa + fspace->sect_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADRANGE, FAIL, "sinfo file space alloc will overlap into 'temporary' file space")
+
+        sinfo_alloc_size = fspace->sect_size;
+
+	/* if paged allocation is enabled, extend the sinfo_alloc_size to the 
+	 * next page boundary.
+         */
+        if(H5F_PAGED_AGGR(f)) {
+            HDassert(0 == (eoa % f->shared->fs_page_size));
+
+	    sinfo_alloc_size = ((sinfo_alloc_size / f->shared->fs_page_size) + 1) * f->shared->fs_page_size;
+
+            HDassert(sinfo_alloc_size >= fspace->sect_size);
+            HDassert((sinfo_alloc_size % f->shared->fs_page_size) == 0);
+        } /* end if */
+
+        /* allocate space for the section info */
+        if(HADDR_UNDEF == (sect_addr = H5FD_alloc(f->shared->lf, dxpl_id,
+                                                  H5FD_MEM_FSPACE_SINFO, f, 
+                                                  sinfo_alloc_size,
+                                                  &eoa_frag_addr,
+                                                  &eoa_frag_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTALLOC, FAIL, "can't allocate file space")
+
+        /* if the file alignement is 1, there should be no
+         * eoa fragment.  Otherwise, drop the fragment on the floor.
+         */
+        HDassert((eoa_frag_size == 0) || (f->shared->alignment != 1));
+
+        /* update fspace->alloc_sect_size and fspace->sect_addr to reflect
+         * the allocation
+         */
+        fspace->alloc_sect_size = fspace->sect_size;
+        fspace->sect_addr = sect_addr;
+
+        /* insert the new section info into the metadata cache.  */
+
+        /* Question: Do we need to worry about this insertion causing an
+         * eviction from the metadata cache?  Think on this.  If so, add a
+         * flag to H5AC_insert() to force it to skip the call to make space in
+         * cache.
+         *
+         * On reflection, no.
+         *
+         * On a regular file close, any eviction will not change the
+         * the contents of the free space manger(s), as all entries
+         * should have correct file space allocated by the time this
+         * function is called.
+         *
+         * In the cache image case, the selection of entries for inclusion
+         * in the cache image will not take place until after this call.
+         * (Recall that this call is made during the metadata fsm settle
+         * routine, which is called during the serialization routine in
+         * the cache image case.  Entries are not selected for inclusion
+         * in the image until after the cache is serialized.)
+         *
+         *                                        JRM -- 11/4/16
+         */
+        if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_SINFO, sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space sinfo to cache")
+
+        /* We have changed the sinfo address -- Mark free space header dirty */
+        if(H5AC_mark_entry_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+
+        /* since space has been allocated for the section info and the sinfo
+         * has been inserted into the cache, relinquish owership (i.e. float)
+         * the section info.
+         */
+        fspace->sinfo = NULL;
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5FS_sect_query_last_sect() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_vfd_alloc_hdr_and_section_info_if_needed() */
 
diff --git a/src/H5FSstat.c b/src/H5FSstat.c
index d2c0177..e2ad5bb 100644
--- a/src/H5FSstat.c
+++ b/src/H5FSstat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -96,7 +94,7 @@ H5FS_stat_info(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *stats)
     stats->serial_sect_count = frsp->serial_sect_count;
     stats->ghost_sect_count = frsp->ghost_sect_count;
     stats->addr = frsp->addr;
-    stats->hdr_size = (size_t)H5FS_HEADER_SIZE(f);
+    stats->hdr_size = (hsize_t)H5FS_HEADER_SIZE(f);
     stats->sect_addr = frsp->sect_addr;
     stats->alloc_sect_size = frsp->alloc_sect_size;
     stats->sect_size = frsp->sect_size;
diff --git a/src/H5FStest.c b/src/H5FStest.c
index 06f5166..5ab0219 100644
--- a/src/H5FStest.c
+++ b/src/H5FStest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Faccum.c b/src/H5Faccum.c
index 9515abd..e84cfda 100644
--- a/src/H5Faccum.c
+++ b/src/H5Faccum.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -112,18 +110,25 @@ H5FL_BLK_DEFINE_STATIC(meta_accum);
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr,
+H5F__accum_read(const H5F_io_info2_t *fio_info, H5FD_mem_t map_type, haddr_t addr,
     size_t size, void *buf/*out*/)
 {
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     HDassert(fio_info);
     HDassert(fio_info->f);
-    HDassert(fio_info->dxpl);
+    HDassert(fio_info->meta_dxpl);
+    HDassert(fio_info->raw_dxpl);
     HDassert(buf);
 
+    /* Translate to file driver I/O info object */
+    fdio_info.file = fio_info->f->shared->lf;
+    fdio_info.meta_dxpl = fio_info->meta_dxpl;
+    fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
     /* Check if this information is in the metadata accumulator */
     if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) {
         H5F_meta_accum_t *accum;     /* Alias for file's metadata accumulator */
@@ -178,7 +183,7 @@ H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr
                         accum->dirty_off += amount_before;
 
                     /* Dispatch to driver */
-                    if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, amount_before, accum->buf) < 0)
+                    if(H5FD_read(&fdio_info, map_type, addr, amount_before, accum->buf) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
                 } /* end if */
                 else
@@ -192,7 +197,7 @@ H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr
                     H5_CHECKED_ASSIGN(amount_after, size_t, ((addr + size) - (accum->loc + accum->size)), hsize_t);
 
                     /* Dispatch to driver */
-                    if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, (accum->loc + accum->size), amount_after, (accum->buf + accum->size + amount_before)) < 0)
+                    if(H5FD_read(&fdio_info, map_type, (accum->loc + accum->size), amount_after, (accum->buf + accum->size + amount_before)) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
                 } /* end if */
 
@@ -206,13 +211,13 @@ H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr
             /* Current read doesn't overlap with metadata accumulator, read it from file */
             else {
                 /* Dispatch to driver */
-                if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+                if(H5FD_read(&fdio_info, map_type, addr, size, buf) < 0)
                     HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
             } /* end else */
         } /* end if */
         else {
             /* Read the data */
-            if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+            if(H5FD_read(&fdio_info, map_type, addr, size, buf) < 0)
                 HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
 
             /* Check for overlap w/dirty accumulator */
@@ -255,7 +260,7 @@ H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr
     } /* end if */
     else {
         /* Read the data */
-        if(H5FD_read(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+        if(H5FD_read(&fdio_info, map_type, addr, size, buf) < 0)
             HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "driver read request failed")
     } /* end else */
 
@@ -278,7 +283,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
+H5F__accum_adjust(H5F_meta_accum_t *accum, const H5FD_io_info_t *fdio_info,
     H5F_accum_adjust_t adjust, size_t size)
 {
     herr_t      ret_value = SUCCEED;    /* Return value */
@@ -286,7 +291,7 @@ H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
     FUNC_ENTER_STATIC
 
     HDassert(accum);
-    HDassert(fio_info);
+    HDassert(fdio_info);
     HDassert(H5F_ACCUM_APPEND == adjust || H5F_ACCUM_PREPEND == adjust);
     HDassert(size > 0);
     HDassert(size <= H5F_ACCUM_MAX_SIZE);
@@ -344,7 +349,7 @@ H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
                     /* Check if the dirty region overlaps the region to eliminate from the accumulator */
                     if((accum->size - shrink_size) < (accum->dirty_off + accum->dirty_len)) {
                         /* Write out the dirty region from the metadata accumulator, with dispatch to driver */
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
+                        if(H5FD_write(fdio_info, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
                             HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed")
 
                         /* Reset accumulator dirty flag */
@@ -355,7 +360,7 @@ H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
                     /* Check if the dirty region overlaps the region to eliminate from the accumulator */
                     if(shrink_size > accum->dirty_off) {
                         /* Write out the dirty region from the metadata accumulator, with dispatch to driver */
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
+                        if(H5FD_write(fdio_info, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0)
                             HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed")
 
                         /* Reset accumulator dirty flag */
@@ -414,17 +419,13 @@ 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
-H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t addr,
+H5F__accum_write(const H5F_io_info2_t *fio_info, H5FD_mem_t map_type, haddr_t addr,
     size_t size, const void *buf)
 {
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -432,9 +433,15 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
     HDassert(fio_info);
     HDassert(fio_info->f);
     HDassert(H5F_INTENT(fio_info->f) & H5F_ACC_RDWR);
-    HDassert(fio_info->dxpl);
+    HDassert(fio_info->meta_dxpl);
+    HDassert(fio_info->raw_dxpl);
     HDassert(buf);
 
+    /* Translate to file driver I/O info object */
+    fdio_info.file = fio_info->f->shared->lf;
+    fdio_info.meta_dxpl = fio_info->meta_dxpl;
+    fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
     /* Check for accumulating metadata */
     if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) {
         H5F_meta_accum_t *accum;     /* Alias for file's metadata accumulator */
@@ -451,7 +458,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
                 /* Check if the new metadata adjoins the beginning of the current accumulator */
                 if((addr + size) == accum->loc) {
                     /* Check if we need to adjust accumulator size */
-                    if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, size) < 0)
+                    if(H5F__accum_adjust(accum, &fdio_info, H5F_ACCUM_PREPEND, size) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
 
                     /* Move the existing metadata to the proper location */
@@ -476,7 +483,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
                 /* Check if the new metadata adjoins the end of the current accumulator */
                 else if(addr == (accum->loc + accum->size)) {
                     /* Check if we need to adjust accumulator size */
-                    if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, size) < 0)
+                    if(H5F__accum_adjust(accum, &fdio_info, H5F_ACCUM_APPEND, size) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
 
                     /* Copy the new metadata to the end */
@@ -536,7 +543,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
                         H5_CHECKED_ASSIGN(add_size, size_t, (accum->loc - addr), hsize_t);
 
                         /* Check if we need to adjust accumulator size */
-                        if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, add_size) < 0)
+                        if(H5F__accum_adjust(accum, &fdio_info, H5F_ACCUM_PREPEND, add_size) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
 
                         /* Calculate the proper offset of the existing metadata */
@@ -576,7 +583,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
                         H5_CHECKED_ASSIGN(add_size, size_t, (addr + size) - (accum->loc + accum->size), hsize_t);
 
                         /* Check if we need to adjust accumulator size */
-                        if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, add_size) < 0)
+                        if(H5F__accum_adjust(accum, &fdio_info, H5F_ACCUM_APPEND, add_size) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator")
 
                         /* Compute offset of dirty region (after adjusting accumulator) */
@@ -642,7 +649,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
                 else {
                     /* Write out the existing metadata accumulator, with dispatch to driver */
                     if(accum->dirty) {
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, accum->loc + accum->dirty_off, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
+                        if(H5FD_write(&fdio_info, H5FD_MEM_DEFAULT, accum->loc + accum->dirty_off, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
 
                         /* Reset accumulator dirty flag */
@@ -731,14 +738,14 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
             } /* end else */
         } /* end if */
         else {
-	    if((H5F_INTENT(fio_info->f) & H5F_ACC_SWMR_WRITE) > 0) {
+            /* Make certain that data in accumulator is visible before new write */
+	    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)
+            if(H5FD_write(&fdio_info, map_type, addr, size, buf) < 0)
                 HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
 
             /* Check for overlap w/accumulator */
@@ -823,7 +830,7 @@ H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t map_type, haddr_t add
     } /* end if */
     else {
         /* Write the data */
-        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
+        if(H5FD_write(&fdio_info, map_type, addr, size, buf) < 0)
             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
     } /* end else */
 
@@ -847,10 +854,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr,
+H5F__accum_free(const H5F_io_info2_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr,
     hsize_t size)
 {
     H5F_meta_accum_t *accum;            /* Alias for file's metadata accumulator */
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -858,11 +866,17 @@ H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, h
     /* check arguments */
     HDassert(fio_info);
     HDassert(fio_info->f);
-    HDassert(fio_info->dxpl);
+    HDassert(fio_info->meta_dxpl);
+    HDassert(fio_info->raw_dxpl);
 
     /* Set up alias for file's metadata accumulator info */
     accum = &fio_info->f->shared->accum;
 
+    /* Translate to file driver I/O info object */
+    fdio_info.file = fio_info->f->shared->lf;
+    fdio_info.meta_dxpl = fio_info->meta_dxpl;
+    fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
     /* Adjust the metadata accumulator to remove the freed block, if it overlaps */
     if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA)
             && H5F_addr_overlap(addr, size, accum->loc, accum->size)) {
@@ -935,7 +949,7 @@ H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, h
                     /* Check if block to free is entirely before dirty region */
                     if(H5F_addr_le(tail_addr, dirty_start)) {
                         /* Write out the entire dirty region of the accumulator */
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
+                        if(H5FD_write(&fdio_info, H5FD_MEM_DEFAULT, dirty_start, accum->dirty_len, accum->buf + accum->dirty_off) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
                     } /* end if */
                     /* Block to free overlaps with some/all of dirty region */
@@ -950,7 +964,7 @@ H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, h
                         HDassert(write_size > 0);
 
                         /* Write out the unfreed dirty region of the accumulator */
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
+                        if(H5FD_write(&fdio_info, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
                     } /* end if */
 
@@ -970,7 +984,7 @@ H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t H5_ATTR_UNUSED type, h
                         HDassert(write_size > 0);
 
                         /* Write out the unfreed end of the dirty region of the accumulator */
-                        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
+                        if(H5FD_write(&fdio_info, H5FD_MEM_DEFAULT, dirty_start + dirty_delta, write_size, accum->buf + accum->dirty_off + dirty_delta) < 0)
                             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
                     } /* end if */
 
@@ -1011,7 +1025,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F__accum_flush(const H5F_io_info_t *fio_info)
+H5F__accum_flush(const H5F_io_info2_t *fio_info)
 {
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -1019,12 +1033,20 @@ H5F__accum_flush(const H5F_io_info_t *fio_info)
 
     HDassert(fio_info);
     HDassert(fio_info->f);
-    HDassert(fio_info->dxpl);
+    HDassert(fio_info->meta_dxpl);
+    HDassert(fio_info->raw_dxpl);
 
     /* Check if we need to flush out the metadata accumulator */
     if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && fio_info->f->shared->accum.dirty) {
+        H5FD_io_info_t fdio_info;           /* File driver I/O info */
+
+        /* Translate to file driver I/O info object */
+        fdio_info.file = fio_info->f->shared->lf;
+        fdio_info.meta_dxpl = fio_info->meta_dxpl;
+        fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
         /* Flush the metadata contents */
-        if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, fio_info->f->shared->accum.loc + fio_info->f->shared->accum.dirty_off, fio_info->f->shared->accum.dirty_len, fio_info->f->shared->accum.buf + fio_info->f->shared->accum.dirty_off) < 0)
+        if(H5FD_write(&fdio_info, H5FD_MEM_DEFAULT, fio_info->f->shared->accum.loc + fio_info->f->shared->accum.dirty_off, fio_info->f->shared->accum.dirty_len, fio_info->f->shared->accum.buf + fio_info->f->shared->accum.dirty_off) < 0)
             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
 
         /* Reset the dirty flag */
@@ -1050,7 +1072,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush)
+H5F__accum_reset(const H5F_io_info2_t *fio_info, hbool_t flush)
 {
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -1058,7 +1080,6 @@ H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush)
 
     HDassert(fio_info);
     HDassert(fio_info->f);
-    HDassert(fio_info->dxpl);
 
     /* Flush any dirty data in accumulator, if requested */
     if(flush)
diff --git a/src/H5Fcwfs.c b/src/H5Fcwfs.c
index 32c73b0..04b86d2 100644
--- a/src/H5Fcwfs.c
+++ b/src/H5Fcwfs.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Fdbg.c b/src/H5Fdbg.c
index 11accc6..535b43d 100644
--- a/src/H5Fdbg.c
+++ b/src/H5Fdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5Fdeprec.c b/src/H5Fdeprec.c
index 4a3bce0..03f5df8 100644
--- a/src/H5Fdeprec.c
+++ b/src/H5Fdeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Fefc.c b/src/H5Fefc.c
index 5e3deb1..5652d15 100644
--- a/src/H5Fefc.c
+++ b/src/H5Fefc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -301,7 +299,7 @@ done:
         if(ent) {
             if(open_file) {
                 ent->file->nopen_objs--;
-                if(H5F_try_close(ent->file) < 0)
+                if(H5F_try_close(ent->file, NULL) < 0)
                     HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "can't close external file")
             } /* end if */
             ent->name = (char *)H5MM_xfree(ent->name);
@@ -350,7 +348,7 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
      * on the state of the efc. */
     if(!efc) {
         file->nopen_objs--;
-        if(H5F_try_close(file) < 0)
+        if(H5F_try_close(file, NULL) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
 
         HGOTO_DONE(SUCCEED)
@@ -364,7 +362,7 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
     for(ent = efc->LRU_head; ent && ent->file != file; ent = ent->LRU_next);
     if(!ent) {
         file->nopen_objs--;
-        if(H5F_try_close(file) < 0)
+        if(H5F_try_close(file, NULL) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
     } /* end if */
     else
@@ -572,7 +570,7 @@ H5F_efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
      * However we must still manipulate the nopen_objs field to prevent the file
      * from being closed out from under us. */
     ent->file->nopen_objs--;
-    if(H5F_try_close(ent->file) < 0)
+    if(H5F_try_close(ent->file, NULL) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
     ent->file = NULL;
 
diff --git a/src/H5Ffake.c b/src/H5Ffake.c
index e191003..6072f2e 100644
--- a/src/H5Ffake.c
+++ b/src/H5Ffake.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Fmodule.h"          /* This source code file is part of the H5F module */
diff --git a/src/H5Fint.c b/src/H5Fint.c
index 54f4be6..fe532b2 100644
--- a/src/H5Fint.c
+++ b/src/H5Fint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -76,6 +74,8 @@ typedef struct H5F_olist_t {
 static int H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key);
 static herr_t H5F_build_actual_name(const H5F_t *f, const H5P_genplist_t *fapl,
     const char *name, char ** /*out*/ actual_name);/* Declare a free list to manage the H5F_t struct */
+static herr_t H5F__flush_phase1(H5F_t *f, hid_t meta_dxpl_id);
+static herr_t H5F__flush_phase2(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t closing);
 
 
 /*********************/
@@ -127,10 +127,10 @@ 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 */
-    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;
+    hbool_t	latest_format = FALSE;	    /* Always use the latest format? */
     hid_t	ret_value = SUCCEED;        /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -167,29 +167,35 @@ H5F_get_access_plist(H5F_t *f, hbool_t app_ref)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't sieve buffer size")
     if(H5P_set(new_plist, H5F_ACS_SDATA_BLOCK_SIZE_NAME, &(f->shared->sdata_aggr.alloc_size)) < 0)
         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)
+    if(f->shared->latest_flags > 0)
+        latest_format = TRUE;
+    if(H5P_set(new_plist, H5F_ACS_LATEST_FORMAT_NAME, &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)
+    if(H5P_set(new_plist, H5F_ACS_OBJECT_FLUSH_CB_NAME, &(f->shared->object_flush)) < 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")
+    if(f->shared->page_buf != NULL) {
+        if(H5P_set(new_plist, H5F_ACS_PAGE_BUFFER_SIZE_NAME, &(f->shared->page_buf->max_size)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set page buffer size")
+        if(H5P_set(new_plist, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME, &(f->shared->page_buf->min_meta_perc)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set minimum metadata fraction of page buffer")
+        if(H5P_set(new_plist, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME, &(f->shared->page_buf->min_raw_perc)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set minimum raw data fraction of page buffer")
+    } /* end if */
 #ifdef H5_HAVE_PARALLEL
     if(H5P_set(new_plist, H5_COLL_MD_READ_FLAG_NAME, &(f->coll_md_read)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set collective metadata read flag")
     if(H5P_set(new_plist, H5F_ACS_COLL_MD_WRITE_FLAG_NAME, &(f->coll_md_write)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set collective metadata read flag")
 #endif /* H5_HAVE_PARALLEL */
+    if(H5P_set(new_plist, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME, &(f->shared->mdc_initCacheImageCfg)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set initial metadata cache resize config.")
 
     /* Prepare the driver property */
     driver_prop.driver_id = f->shared->lf->driver_id;
@@ -495,7 +501,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_is_hdf5
+ * Function:	H5F__is_hdf5
  *
  * Purpose:	Check the file signature to detect an HDF5 file.
  *
@@ -509,17 +515,14 @@ done:
  *
  * Programmer:	Unknown
  *
- * Modifications:
- *		Robb Matzke, 1999-08-02
- *		Rewritten to use the virtual file layer.
  *-------------------------------------------------------------------------
  */
 htri_t
-H5F_is_hdf5(const char *name, hid_t dxpl_id)
+H5F__is_hdf5(const char *name, hid_t meta_dxpl_id, hid_t raw_dxpl_id)
 {
     H5FD_t	*file = NULL;           /* Low-level file struct */
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
     haddr_t     sig_addr;               /* Addess of hdf5 file signature */
-    H5P_genplist_t  *xfer_plist= NULL;  /* Dataset transfer property list object */
     htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -528,12 +531,15 @@ H5F_is_hdf5(const char *name, hid_t dxpl_id)
     if(NULL == (file = H5FD_open(name, H5F_ACC_RDONLY, H5P_FILE_ACCESS_DEFAULT, HADDR_UNDEF)))
 	HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to open file")
 
-    /* Get the property list object */
-    if(NULL == (xfer_plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
+    /* Set up the file driver info */
+    fdio_info.file = file;
+    if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(meta_dxpl_id)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object")
+    if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(raw_dxpl_id)))
         HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object")
 
     /* The file is an hdf5 file if the hdf5 file signature can be found */
-    if(H5FD_locate_signature(file, xfer_plist, &sig_addr) < 0)
+    if(H5FD_locate_signature(&fdio_info, &sig_addr) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to locate file signature")
     ret_value = (HADDR_UNDEF != sig_addr);
 
@@ -544,7 +550,7 @@ done:
             HDONE_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_is_hdf5() */
+} /* end H5F__is_hdf5() */
 
 

 /*-------------------------------------------------------------------------
@@ -577,16 +583,17 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
     FUNC_ENTER_NOAPI_NOINIT
 
     if(NULL == (f = H5FL_CALLOC(H5F_t)))
-	HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
+        HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
     f->file_id = -1;
 
     if(shared) {
         HDassert(lf == NULL);
-	f->shared = shared;
+        f->shared = shared;
     } /* end if */
     else {
         H5P_genplist_t *plist;          /* Property list */
         unsigned        efc_size;       /* External file cache size */
+        hbool_t	latest_format;	        /* Always use the latest format?	*/
         size_t u;                       /* Local index variable */
 
         HDassert(lf != NULL);
@@ -594,18 +601,33 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
             HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared file structure")
 
         f->shared->flags = flags;
-	f->shared->sohm_addr = HADDR_UNDEF;
-	f->shared->sohm_vers = HDF5_SHAREDHEADER_VERSION;
-        for(u = 0; u < NELMTS(f->shared->fs_addr); u++)
-            f->shared->fs_addr[u] = HADDR_UNDEF;
-	f->shared->accum.loc = HADDR_UNDEF;
+        f->shared->sohm_addr = HADDR_UNDEF;
+        f->shared->sohm_vers = HDF5_SHAREDHEADER_VERSION;
+        f->shared->accum.loc = HADDR_UNDEF;
         f->shared->lf = lf;
 
-	/*
-	 * Copy the file creation and file access property lists into the
-	 * new file handle.  We do this early because some values might need
-	 * to change as the file is being opened.
-	 */
+        /* Initialization for handling file space */
+        for(u = 0; u < NELMTS(f->shared->fs_addr); u++) {
+            f->shared->fs_state[u] = H5F_FS_STATE_CLOSED;
+            f->shared->fs_addr[u] = HADDR_UNDEF;
+            f->shared->fs_man[u] = NULL;
+        } /* end for */
+        f->shared->first_alloc_dealloc = FALSE;
+        f->shared->eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+        f->shared->eoa_post_fsm_fsalloc = HADDR_UNDEF;
+        f->shared->eoa_post_mdci_fsalloc = HADDR_UNDEF;
+
+        /* Initialization for handling file space (for paged aggregation) */
+        f->shared->pgend_meta_thres = H5F_FILE_SPACE_PGEND_META_THRES;
+
+        /* intialize point of no return */
+        f->shared->point_of_no_return = FALSE;
+
+        /*
+         * Copy the file creation and file access property lists into the
+         * new file handle.  We do this early because some values might need
+         * to change as the file is being opened.
+         */
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(fcpl_id)))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not property list")
         f->shared->fcpl_id = H5P_copy_plist(plist, FALSE);
@@ -620,8 +642,19 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
         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_PERSIST_NAME, &f->shared->fs_persist) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file space persisting status")
         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")
+        if(H5P_get(plist, H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME, &f->shared->fs_page_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file space page size")
+        HDassert(f->shared->fs_page_size >= H5F_FILE_SPACE_PAGE_SIZE_MIN);
+
+        /* Temporary for multi/split drivers: fail file creation 
+             when persisting free-space or using paged aggregation strategy */
+        if(H5F_HAS_FEATURE(f, H5FD_FEAT_PAGED_AGGR))
+            if(f->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE || f->shared->fs_persist)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't open with this strategy or persistent fs")
 
         /* Get the FAPL values to cache */
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
@@ -642,16 +675,12 @@ 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 garbage collect reference")
         if(H5P_get(plist, H5F_ACS_SIEVE_BUF_SIZE_NAME, &(f->shared->sieve_buf_size)) < 0)
             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)
+        if(H5P_get(plist, H5F_ACS_LATEST_FORMAT_NAME, &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)
+        /* For latest format or SWMR_WRITE, activate all latest version support */
+        if(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")
@@ -672,6 +701,8 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
         if(H5P_get(plist, H5F_ACS_COLL_MD_WRITE_FLAG_NAME, &(f->coll_md_write)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get collective metadata write flag")
 #endif /* H5_HAVE_PARALLEL */
+        if(H5P_get(plist, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME, &(f->shared->mdc_initCacheImageCfg)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get initial metadata cache resize config")
 
         /* Get the VFD values to cache */
         f->shared->maxaddr = H5FD_get_maxaddr(lf);
@@ -680,7 +711,7 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
         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 */
+        /* 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")
 
@@ -716,18 +747,21 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
                 f->shared->read_attempts = H5F_SWMR_METADATA_READ_ATTEMPTS;
 
             /* Turn off accumulator with SWMR */
-	    f->shared->feature_flags &= ~(unsigned)H5FD_FEAT_ACCUMULATE_METADATA;
+            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;
+        else {
+            /* If no value for read attempts has been set, use the default */
+            if(!f->shared->read_attempts)
+                f->shared->read_attempts = H5F_METADATA_READ_ATTEMPTS;
+        } /* end else */
 
-	/* 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")
+        /* 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) */
+        /* Get the metadata cache log location (if we're logging) */
         {
             char *mdc_log_location = NULL;      /* location of metadata cache log location */
 
@@ -735,33 +769,33 @@ 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 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))))
+                if(NULL == (f->shared->mdc_log_location = (char *)H5MM_calloc((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;
-        }
+        } /* end block */
 
- 	/* 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")
+        /* 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
-	 * the access property list should be updated to reflect that.
-	 */
-	if(H5AC_create(f, &(f->shared->mdc_initCacheCfg)) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache")
+        /*
+         * Create a metadata cache with the specified number of elements.
+         * The cache might be created with a different number of elements and
+         * the access property list should be updated to reflect that.
+         */
+        if(H5AC_create(f, &(f->shared->mdc_initCacheCfg), &(f->shared->mdc_initCacheImageCfg)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache")
 
         /* Create the file's "open object" information */
         if(H5FO_create(f) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object data structure")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object data structure")
 
         /* Add new "shared" struct to list of open files */
         if(H5F_sfile_add(f->shared) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to append to list of open files")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to append to list of open files")
     } /* end else */
 
     f->shared->nrefs++;
@@ -775,7 +809,7 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
 
 done:
     if(!ret_value && f) {
-	if(!shared) {
+        if(!shared) {
             /* Attempt to clean up some of the shared file structures */
             if(f->shared->efc)
                 if(H5F_efc_destroy(f->shared->efc) < 0)
@@ -786,7 +820,7 @@ done:
 
             f->shared = H5FL_FREE(H5F_file_t, f->shared);
         } /* end if */
-	f = H5FL_FREE(H5F_t, f);
+        f = H5FL_FREE(H5F_t, f);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -794,7 +828,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_dest
+ * Function:	H5F__dest
  *
  * Purpose:	Destroys a file structure.  This function flushes the cache
  *		but doesn't do any other cleanup other than freeing memory
@@ -810,27 +844,53 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
+H5F__dest(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t flush)
 {
     herr_t	   ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(f);
     HDassert(f->shared);
 
     if(1 == f->shared->nrefs) {
-        H5F_io_info_t fio_info;             /* I/O info for operation */
+        int actype;                         /* metadata cache type (enum value) */
+        H5F_io_info2_t fio_info;            /* I/O info for operation */
 
-        /* Flush at this point since the file will be closed.
+        /* Flush at this point since the file will be closed (phase 1).
          * Only try to flush the file if it was opened with write access, and if
          * the caller requested a flush.
          */
         if((H5F_ACC_RDWR & H5F_INTENT(f)) && flush)
-            if(H5F_flush(f, dxpl_id, TRUE) < 0)
+            if(H5F__flush_phase1(f, meta_dxpl_id) < 0)
                 /* Push error, but keep going*/
-                HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+                HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush cached data (phase 1)")
+
+        /* Notify the metadata cache that the file is about to be closed.
+         * This allows the cache to set up for creating a metadata cache 
+         * image if this has been requested.
+         */
+        if(H5AC_prep_for_file_close(f, meta_dxpl_id) < 0)
+            /* Push error, but keep going */
+            HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "metadata cache prep for close failed")
+
+        /* Flush at this point since the file will be closed (phase 2).
+         * Only try to flush the file if it was opened with write access, and if
+         * the caller requested a flush.
+         */
+        if((H5F_ACC_RDWR & H5F_INTENT(f)) && flush)
+            if(H5F__flush_phase2(f, meta_dxpl_id, raw_dxpl_id, TRUE) < 0)
+                /* Push error, but keep going */
+                HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush cached data (phase 2)")
+
+        /* With the shutdown modifications, the contents of the metadata cache
+         * should be clean at this point, with the possible exception of the 
+         * the superblock and superblock extension.
+         *
+         * Verify this.
+         */
+        HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
 
         /* Release the external file cache */
         if(f->shared->efc) {
@@ -840,36 +900,76 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
             f->shared->efc = NULL;
         } /* end if */
 
+        /* With the shutdown modifications, the contents of the metadata cache
+         * should be clean at this point, with the possible exception of the
+         * the superblock and superblock extension.
+         *
+         * Verify this.
+         */
+        HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
+
         /* Release objects that depend on the superblock being initialized */
         if(f->shared->sblock) {
             /* Shutdown file free space manager(s) */
-            /* (We should release the free space information now (before truncating
-             *      the file and before the metadata cache is shut down) since the
-             *      free space manager is holding some data structures in memory
-             *      and also because releasing free space can shrink the file's
-             *      'eoa' value)
+            /* (We should release the free space information now (before 
+             *      truncating the file and before the metadata cache is shut 
+             *      down) since the free space manager is holding some data 
+             *      structures in memory and also because releasing free space 
+             *      can shrink the file's 'eoa' value)
+             *
+             * Update 11/1/16:
+             *
+             *      With recent library shutdown modifications, the free space
+             *      managers should be settled and written to file at this point
+             *      (assuming they are persistent).  In this case, closing the
+             *      free space managers should have no effect on EOA.
+             *
+             *                                          -- JRM
              */
             if(H5F_ACC_RDWR & H5F_INTENT(f)) {
-                if(H5MF_close(f, dxpl_id) < 0)
+                if(H5MF_close(f, meta_dxpl_id) < 0)
                     /* Push error, but keep going*/
                     HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file free space info")
 
+                /* at this point, only the superblock and superblock
+                 * extension should be dirty.
+                 */
+                HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
+
                 /* Flush the file again (if requested), as shutting down the
                  * free space manager may dirty some data structures again.
                  */
                 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)
+                    f->shared->sblock->status_flags &= (uint8_t)(~H5F_SUPER_WRITE_ACCESS);
+                    f->shared->sblock->status_flags &= (uint8_t)(~H5F_SUPER_SWMR_WRITE_ACCESS);
+
+                    /* Mark EOA info dirty in cache, so change will get encoded */
+                    if(H5F_eoa_dirty(f, meta_dxpl_id) < 0)
+                        /* Push error, but keep going*/
                         HDONE_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
 
-                    if(H5F_flush(f, dxpl_id, TRUE) < 0)
+                    /* Release any space allocated to space aggregators, 
+                     * so that the eoa value corresponds to the end of the 
+                     * space written to in the file.
+                     *
+                     * At most, this should change the superblock or the
+                     * superblock extension messages.
+                     */
+                    if(H5MF_free_aggrs(f, meta_dxpl_id) < 0)
                         /* Push error, but keep going*/
-                        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
-		}
+                        HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file space")
+
+                    /* Truncate the file to the current allocated size */
+                    if(H5FD_truncate(f->shared->lf, meta_dxpl_id, TRUE) < 0)
+                        /* Push error, but keep going*/
+                        HDONE_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "low level truncate failed")
+
+                    /* at this point, only the superblock and superblock
+                     * extension should be dirty.
+                     */
+                    HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
+		} /* end if */
             } /* end if */
 
             /* if it exists, unpin the driver information block cache entry,
@@ -886,6 +986,13 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
                 HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
             f->shared->sblock = NULL;
         } /* end if */
+
+        /* with the possible exception of the superblock and superblock
+         * extension, the metadata cache should be clean at this point.
+         *
+         * Verify this.
+         */
+        HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
  
         /* Remove shared file struct from list of open files */
         if(H5F_sfile_remove(f->shared) < 0)
@@ -893,13 +1000,25 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
             HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
 
         /* Shutdown the metadata cache */
-        if(H5AC_dest(f, dxpl_id))
+        if(H5AC_dest(f, meta_dxpl_id))
             /* Push error, but keep going*/
             HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
 
+        /* Set up I/O info for operation */
+        fio_info.f = f;
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(meta_dxpl_id)))
+            HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+        /* Shutdown the page buffer cache */
+        if(H5PB_dest(&fio_info) < 0)
+            /* Push error, but keep going*/
+            HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing page buffer cache")
+
         /* Clean up the metadata cache log location string */
         if(f->shared->mdc_log_location)
-            HDfree(f->shared->mdc_log_location);
+            f->shared->mdc_log_location = (char *)H5MM_xfree(f->shared->mdc_log_location);
 
         /*
          * Do not close the root group since we didn't count it, but free
@@ -913,11 +1032,6 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
             f->shared->root_grp = NULL;
         } /* end if */
 
-        /* Set up I/O info for operation */
-        fio_info.f = f;
-        if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
-            HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
-
         /* Destroy other components of the file */
         if(H5F__accum_reset(&fio_info, TRUE) < 0)
             /* Push error, but keep going*/
@@ -947,6 +1061,11 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
         f->shared->mtab.child = (H5F_mount_t *)H5MM_xfree(f->shared->mtab.child);
         f->shared->mtab.nalloc = 0;
 
+        /* Clean up the metadata retries array */
+        for(actype = 0; actype < (int)H5AC_NTYPES; actype++)
+            if(f->shared->retries[actype])
+                f->shared->retries[actype] = (uint32_t *)H5MM_xfree(f->shared->retries[actype]);
+
         /* Destroy shared file struct */
         f->shared = (H5F_file_t *)H5FL_FREE(H5F_file_t, f->shared);
 
@@ -1050,7 +1169,7 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
  */
 H5F_t *
 H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
-    hid_t dxpl_id)
+    hid_t meta_dxpl_id)
 {
     H5F_t              *file = NULL;        /*the success return value      */
     H5F_file_t         *shared = NULL;      /*shared part of `file'         */
@@ -1059,9 +1178,16 @@ 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             */
+    hid_t               raw_dxpl_id = H5AC_rawdata_dxpl_id;    /* Raw data dxpl used by library        */
+    size_t              page_buf_size;
+    unsigned            page_buf_min_meta_perc;
+    unsigned            page_buf_min_raw_perc;
     hbool_t             set_flag = FALSE;   /*set the status_flags in the superblock */
     hbool_t             clear = FALSE;      /*clear the status_flags 	    */
+    hbool_t             evict_on_close;     /* evict on close value from plist  */
     H5F_t              *ret_value = NULL;   /*actual return value           */
+    char               *lock_env_var = NULL;/*env var pointer               */
+    hbool_t             use_file_locking;   /*read from env var             */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1076,6 +1202,16 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     if(NULL == (drvr = H5FD_get_class(fapl_id)))
         HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to retrieve VFL class")
 
+    /* Check the environment variable that determines if we care
+     * about file locking. File locking should be used unless explicitly
+     * disabled.
+     */
+    lock_env_var = HDgetenv("HDF5_USE_FILE_LOCKING");
+    if(lock_env_var && !HDstrcmp(lock_env_var, "FALSE"))
+        use_file_locking = FALSE;
+    else
+        use_file_locking = TRUE;    
+
     /*
      * Opening a file is a two step process. First we try to open the
      * file in a way which doesn't affect its state (like not truncating
@@ -1088,58 +1224,58 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
      * way for us to detect it here anyway).
      */
     if(drvr->cmp)
-	tent_flags = flags & ~(H5F_ACC_CREAT|H5F_ACC_TRUNC|H5F_ACC_EXCL);
+        tent_flags = flags & ~(H5F_ACC_CREAT|H5F_ACC_TRUNC|H5F_ACC_EXCL);
     else
-	tent_flags = flags;
+        tent_flags = flags;
 
     if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
-	if(tent_flags == flags) {
+        if(tent_flags == flags) {
 #ifndef H5_USING_MEMCHECKER
             time_t mytime = HDtime(NULL);
 
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
 #else /* H5_USING_MEMCHECKER */
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
 #endif /* H5_USING_MEMCHECKER */
         } /* end if */
         H5E_clear_stack(NULL);
-	tent_flags = flags;
-	if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
+        tent_flags = flags;
+        if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
 #ifndef H5_USING_MEMCHECKER
             time_t mytime = HDtime(NULL);
 
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
 #else /* H5_USING_MEMCHECKER */
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
 #endif /* H5_USING_MEMCHECKER */
         } /* end if */
     } /* end if */
 
     /* Is the file already open? */
     if((shared = H5F_sfile_search(lf)) != NULL) {
-	/*
-	 * The file is already open, so use that one instead of the one we
-	 * just opened. We only one one H5FD_t* per file so one doesn't
-	 * confuse the other.  But fail if this request was to truncate the
-	 * 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), or if the
+        /*
+         * The file is already open, so use that one instead of the one we
+         * just opened. We only one one H5FD_t* per file so one doesn't
+         * confuse the other.  But fail if this request was to truncate the
+         * 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), 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")
-	if(flags & H5F_ACC_TRUNC)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to truncate a file which is already open")
-	if(flags & H5F_ACC_EXCL)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file exists")
-	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")
+         */
+        if(H5FD_close(lf) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
+        if(flags & H5F_ACC_TRUNC)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to truncate a file which is already open")
+        if(flags & H5F_ACC_EXCL)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file exists")
+        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)
@@ -1160,17 +1296,29 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
                 HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
         } /* end if */
 
-	/* 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 */
+        /* Place an advisory lock on the file */
+        if(use_file_locking)
+            if(H5FD_lock(lf, (hbool_t)((flags & H5F_ACC_RDWR) ? TRUE : FALSE)) < 0) {
+                /* Locking failed - Closing will remove the lock */                
+                if(H5FD_close(lf) < 0) 
+                    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")
+            } /* end if */
+
+        /* Create the 'top' file structure */
+        if(NULL == (file = H5F_new(NULL, flags, fcpl_id, fapl_id, lf))) {
+            /* If this is the only time the file has been opened and the struct
+             * returned is NULL, H5FD_close() will never be called via H5F_dest()
+             * so we have to close lf here before heading to the error handling.
+             */
+            if(H5FD_close(lf) < 0) 
                 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")
-        }
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to initialize file structure")
+        } /* end if */
 
-	/* Need to set status_flags in the superblock if the driver has a 'lock' method */
-	if(drvr->lock)
-	    set_flag = TRUE;
+        /* 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 */
@@ -1180,6 +1328,29 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     shared = file->shared;
     lf = shared->lf;
 
+    /* Get the file access property list, for future queries */
+    if(NULL == (a_plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list")
+
+    /* Check if page buffering is enabled */
+    if(H5P_get(a_plist, H5F_ACS_PAGE_BUFFER_SIZE_NAME, &page_buf_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get page buffer size")
+    if(page_buf_size) {
+#ifdef H5_HAVE_PARALLEL
+        /* Collective metadata writes are not supported with page buffering */
+        if(file->coll_md_write)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "collective metadata writes are not supported with page buffering")
+
+        /* Temporary: fail file create when page buffering feature is enabled for parallel */
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "page buffering is disabled for parallel")
+#endif /* H5_HAVE_PARALLEL */
+        /* Query for other page buffer cache properties */
+        if(H5P_get(a_plist, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME, &page_buf_min_meta_perc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get minimum metadata fraction of page buffer")
+        if(H5P_get(a_plist, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME, &page_buf_min_raw_perc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get minimum raw data fraction of page buffer")
+    } /* end if */
+
     /*
      * Read or write the file superblock, depending on whether the file is
      * empty or not.
@@ -1190,31 +1361,37 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
          * to create & write the superblock.
          */
 
+        /* Create the page buffer before initializing the superblock */
+        if(page_buf_size)
+            if(H5PB_create(file, page_buf_size, page_buf_min_meta_perc, page_buf_min_raw_perc) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create page buffer")
+
         /* 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, meta_dxpl_id) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to allocate file superblock")
 
         /* Create and open the root group */
         /* (This must be after the space for the superblock is allocated in
          *      the file, since the superblock must be at offset 0)
          */
-        if(H5G_mkroot(file, dxpl_id, TRUE) < 0)
+        if(H5G_mkroot(file, meta_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, TRUE) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
-
-	/* Open the root group */
-	if(H5G_mkroot(file, dxpl_id, FALSE) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read root group")
     } /* end if */
-
-    /* Get the file access property list, for future queries */
-    if(NULL == (a_plist = (H5P_genplist_t *)H5I_object(fapl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list")
+    else if (1 == shared->nrefs) {
+        /* Read the superblock if it hasn't been read before. */
+        if(H5F__super_read(file, meta_dxpl_id, raw_dxpl_id, TRUE) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
+
+        /* Create the page buffer before initializing the superblock */
+        if(page_buf_size)
+            if(H5PB_create(file, page_buf_size, page_buf_min_meta_perc, page_buf_min_raw_perc) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create page buffer")
+
+        /* Open the root group */
+        if(H5G_mkroot(file, meta_dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read root group")
+    } /* end if */
 
     /*
      * Decide the file close degree.  If it's the first time to open the
@@ -1230,40 +1407,54 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     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) {
+        else if(clear)
             file->shared->sblock->status_flags = 0;
-        }
-    }
+    } /* end if */
 
     if(shared->nrefs == 1) {
         if(fc_degree == H5F_CLOSE_DEFAULT)
             shared->fc_degree = lf->cls->fc_degree;
         else
             shared->fc_degree = fc_degree;
-    } else if(shared->nrefs > 1) {
+    } /* end if */
+    else if(shared->nrefs > 1) {
         if(fc_degree == H5F_CLOSE_DEFAULT && shared->fc_degree != lf->cls->fc_degree)
             HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "file close degree doesn't match")
         if(fc_degree != H5F_CLOSE_DEFAULT && fc_degree != shared->fc_degree)
             HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "file close degree doesn't match")
     } /* end if */
 
+    /* Record the evict-on-close MDC behavior.  If it's the first time opening
+     * the file, set it to access property list value; if it's the second time
+     * or later, verify that the access property list value matches the value
+     * in shared file structure.
+     */
+    if(H5P_get(a_plist, H5F_ACS_EVICT_ON_CLOSE_FLAG_NAME, &evict_on_close) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get evict on close value")
+    if(shared->nrefs == 1)
+        shared->evict_on_close = evict_on_close;
+    else if(shared->nrefs > 1) {
+        if(shared->evict_on_close != evict_on_close)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "file evict-on-close value doesn't match")
+    } /* end if */
+
     /* Formulate the absolute path for later search of target file for external links */
     if(H5_build_extpath(name, &file->extpath) < 0)
-	HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build extpath")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build extpath")
 
     /* Formulate the actual file name, after following symlinks, etc. */
     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")
+        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 */
+            /* 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 */
+                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)
@@ -1272,72 +1463,69 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
             /* 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_ind_read_dxpl_id) < 0)
+            if(H5F_flush_tagged_metadata(file, H5AC__SUPERBLOCK_TAG, meta_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) { 
+            /* Remove the file lock for SWMR_WRITE */
+            if(use_file_locking && (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 */
+            } /* end if */
+        } /* end if */
+        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 */
-        }
+                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")
+                } /* end if */
+                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 else */
     } /* 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((NULL == ret_value) && file)
+        if(H5F__dest(file, meta_dxpl_id, raw_dxpl_id, FALSE) < 0)
+            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "problems closing file")
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_open() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_flush
+ * Function:	H5F_flush_phase1
  *
- * Purpose:	Flushes cached data.
+ * Purpose:	First phase of flushing cached data.
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Aug 29 1997
+ * Programmer:	Quincey Koziol
+ *		koziol at lbl.gov
+ *		Jan  1 2017
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing)
+static herr_t
+H5F__flush_phase1(H5F_t *f, hid_t meta_dxpl_id)
 {
-    H5F_io_info_t fio_info;             /* I/O info for operation */
     herr_t   ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
     /* Sanity check arguments */
     HDassert(f);
 
     /* Flush any cached dataset storage raw data */
-    if(H5D_flush(f, dxpl_id) < 0)
+    if(H5D_flush(f, meta_dxpl_id) < 0)
         /* Push error, but keep going*/
         HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush dataset cache")
 
@@ -1347,27 +1535,60 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing)
     /* (needs to happen before cache flush, with superblock write, since the
      *  'eoa' value is written in superblock -QAK)
      */
-    if(H5MF_free_aggrs(f, dxpl_id) < 0)
+    if(H5MF_free_aggrs(f, meta_dxpl_id) < 0)
         /* Push error, but keep going*/
         HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release file space")
 
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__flush_phase1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__flush_phase2
+ *
+ * Purpose:	Second phase of flushing cached data.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at lbl.gov
+ *		Jan  1 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__flush_phase2(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t closing)
+{
+    H5F_io_info2_t fio_info;            /* I/O info for operation */
+    herr_t   ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check arguments */
+    HDassert(f);
+
     /* Flush the entire metadata cache */
-    if(H5AC_flush(f, dxpl_id) < 0)
+    if(H5AC_flush(f, meta_dxpl_id) < 0)
         /* Push error, but keep going*/
         HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache")
 
     /* Truncate the file to the current allocated size */
-    if(H5FD_truncate(f->shared->lf, dxpl_id, closing) < 0)
+    if(H5FD_truncate(f->shared->lf, meta_dxpl_id, closing) < 0)
+        /* Push error, but keep going*/
         HDONE_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "low level truncate failed")
 
     /* Flush the entire metadata cache again since the EOA could have changed in the truncate call. */
-    if(H5AC_flush(f, dxpl_id) < 0)
+    if(H5AC_flush(f, meta_dxpl_id) < 0)
         /* Push error, but keep going*/
         HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache")
 
     /* Set up I/O info for operation */
     fio_info.f = f;
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+    if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(meta_dxpl_id)))
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(raw_dxpl_id)))
+        /* Push error, but keep going*/
         HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
 
     /* Flush out the metadata accumulator */
@@ -1375,14 +1596,55 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing)
         /* Push error, but keep going*/
         HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush metadata accumulator")
 
+    /* Flush the page buffer */
+    if(H5PB_flush(&fio_info) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "page buffer flush failed")
+
     /* Flush file buffers to disk. */
-    if(H5FD_flush(f->shared->lf, dxpl_id, closing) < 0)
+    if(H5FD_flush(f->shared->lf, meta_dxpl_id, closing) < 0)
         /* Push error, but keep going*/
-        HDONE_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed")
+        HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "low level flush failed")
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_flush() */
+} /* end H5F__flush_phase2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__flush
+ *
+ * Purpose:	Flushes cached data.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke at llnl.gov
+ *		Aug 29 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__flush(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t closing)
+{
+    herr_t   ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check arguments */
+    HDassert(f);
+
+    /* First phase of flushing data */
+    if(H5F__flush_phase1(f, meta_dxpl_id) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush file data")
+
+    /* Second phase of flushing data */
+    if(H5F__flush_phase2(f, meta_dxpl_id, raw_dxpl_id, closing) < 0)
+        /* Push error, but keep going*/
+        HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush file data")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__flush() */
 
 

 /*-------------------------------------------------------------------------
@@ -1442,7 +1704,7 @@ H5F_close(H5F_t *f)
     f->file_id = -1;
 
     /* Attempt to close the file/mount hierarchy */
-    if(H5F_try_close(f) < 0)
+    if(H5F_try_close(f, NULL) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
 
 done:
@@ -1466,7 +1728,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_try_close(H5F_t *f)
+H5F_try_close(H5F_t *f, hbool_t *was_closed /*out*/)
 {
     unsigned            nopen_files = 0;        /* Number of open files in file/mount hierarchy */
     unsigned            nopen_objs = 0;         /* Number of open objects in file/mount hierarchy */
@@ -1478,9 +1740,21 @@ H5F_try_close(H5F_t *f)
     HDassert(f);
     HDassert(f->shared);
 
+    /* Set the was_closed flag to the default value.
+     * This flag lets downstream code know if the file struct is
+     * still accessible and/or likely to contain useful data.
+     * It's needed by the evict-on-close code. Clients can ignore
+     * this value by passing in NULL.
+     */
+    if(was_closed)
+        *was_closed = FALSE;
+
     /* Check if this file is already in the process of closing */
-    if(f->closing)
+    if(f->closing) {
+        if(was_closed)
+            *was_closed = TRUE;
         HGOTO_DONE(SUCCEED)
+    } /* end if */
 
     /* Get the number of open objects and open files on this file/mount hierarchy */
     if(H5F_mount_count_ids(f, &nopen_files, &nopen_objs) < 0)
@@ -1581,7 +1855,7 @@ H5F_try_close(H5F_t *f)
      * hierarchy if so.
      */
     if(f->parent)
-        if(H5F_try_close(f->parent) < 0)
+        if(H5F_try_close(f->parent, NULL) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close parent file")
 
     /* Unmount and close each child before closing the current file. */
@@ -1595,7 +1869,7 @@ H5F_try_close(H5F_t *f)
         if(H5F_efc_try_close(f) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't attempt to close EFC")
 
-    /* Delay flush until the shared file struct is closed, in H5F_dest.  If the
+    /* Delay flush until the shared file struct is closed, in H5F__dest.  If the
      * application called H5Fclose, it would have been flushed in that function
      * (unless it will have been flushed in H5F_dest anyways). */
 
@@ -1604,9 +1878,12 @@ H5F_try_close(H5F_t *f)
      * shared H5F_file_t struct. If the reference count for the H5F_file_t
      * struct reaches zero then destroy it also.
      */
-    if(H5F_dest(f, H5AC_ind_read_dxpl_id, TRUE) < 0)
+    if(H5F__dest(f, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id, TRUE) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
 
+    /* Since we closed the file, this should be set to TRUE */
+    if(was_closed)
+        *was_closed = TRUE;
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_try_close() */
@@ -1725,6 +2002,10 @@ H5F_build_actual_name(const H5F_t *f, const H5P_genplist_t *fapl, const char *na
     char **actual_name/*out*/)
 {
     hid_t       new_fapl_id = -1;       /* ID for duplicated FAPL */
+#ifdef H5_HAVE_SYMLINK
+    /* This has to be declared here to avoid unfreed resources on errors */
+    char *realname = NULL;              /* Fully resolved path name of file */
+#endif /* H5_HAVE_SYMLINK */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -1756,9 +2037,12 @@ H5F_build_actual_name(const H5F_t *f, const H5P_genplist_t *fapl, const char *na
             int *fd;                    /* POSIX I/O file descriptor */
             h5_stat_t st;               /* Stat info from stat() call */
             h5_stat_t fst;              /* Stat info from fstat() call */
-            char realname[PATH_MAX];    /* Fully resolved path name of file */
             hbool_t want_posix_fd;      /* Flag for retrieving file descriptor from VFD */
 
+            /* Allocate realname buffer */
+            if(NULL == (realname = (char *)H5MM_calloc((size_t)PATH_MAX * sizeof(char))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
             /* Perform a sanity check that the file or link wasn't switched
              * between when we opened it and when we called lstat().  This is
              * according to the security best practices for lstat() documented
@@ -1815,6 +2099,10 @@ done:
     if(new_fapl_id > 0)
         if(H5I_dec_app_ref(new_fapl_id) < 0)
             HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close duplicated FAPL")
+#ifdef H5_HAVE_SYMLINK
+    if(realname)
+        realname = (char *)H5MM_xfree(realname);
+#endif /* H5_HAVE_SYMLINK */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_build_actual_name() */
@@ -2148,7 +2436,8 @@ H5F_set_store_msg_crt_idx(H5F_t *f, hbool_t flag)
  *-------------------------------------------------------------------------
  */
 ssize_t
-H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len, hid_t dxpl_id)
+H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len, hid_t meta_dxpl_id,
+    hid_t raw_dxpl_id)
 {
     H5FD_t     *fd_ptr;                 /* file driver */
     haddr_t     eoa;                    /* End of file address */
@@ -2215,10 +2504,10 @@ H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len, hid_t dxpl_id)
 
     /* test to see if a buffer was provided -- if not, we are done */
     if(buf_ptr != NULL) {
+        H5FD_io_info_t fdio_info;       /* File driver I/O info */
         size_t	space_needed;		/* size of file image */
         hsize_t tmp;
         size_t tmp_size;
-        H5P_genplist_t *xfer_plist= NULL;  /* Dataset transfer property list object */
 
         /* Check for buffer too small */
         if((haddr_t)buf_len < eoa)
@@ -2226,13 +2515,16 @@ H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len, hid_t dxpl_id)
 
         space_needed = (size_t)eoa;
 
-        /* Get the property list object */
-        if(NULL == (xfer_plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
-            HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object")
+        /* Set up file driver I/O info object */
+        fdio_info.file = fd_ptr;
+        if(NULL == (fdio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(meta_dxpl_id)))
+            HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list object")
+        if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(raw_dxpl_id)))
+            HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list object")
 
         /* read in the file image */
         /* (Note compensation for base address addition in internal routine) */
-        if(H5FD_read(fd_ptr, xfer_plist, H5FD_MEM_DEFAULT, 0, space_needed, buf_ptr) < 0)
+        if(H5FD_read(&fdio_info, 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 */
@@ -2285,8 +2577,8 @@ H5F_track_metadata_read_retries(H5F_t *f, unsigned actype, unsigned retries)
 
     /* 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")
+        if(NULL == (f->shared->retries[actype] = (uint32_t *)H5MM_calloc((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);
@@ -2434,6 +2726,38 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F__set_eoa() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__set_paged_aggr
+ *
+ * Purpose:	Quick and dirty routine to set the file's paged_aggr mode
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		June 19, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__set_paged_aggr(const H5F_t *f, hbool_t paged)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Dispatch to driver */
+    if(H5FD_set_paged_aggr(f->shared->lf, paged) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "driver set paged aggr mode failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__set_paged_aggr() */
+
 #ifdef H5_HAVE_PARALLEL
 

 /*-------------------------------------------------------------------------
@@ -2464,3 +2788,33 @@ H5F_set_coll_md_read(H5F_t *f, H5P_coll_md_read_flag_t cmr)
 } /* H5F_set_coll_md_read() */
 #endif /* H5_HAVE_PARALLEL */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_latest_flags
+ *
+ * Purpose:     Set the latest_flags field with a new value.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              4/26/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_latest_flags(H5F_t *f, unsigned flags)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(0 == ((~flags) & H5F_LATEST_ALL_FLAGS));
+
+    f->shared->latest_flags = flags;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_latest_flags() */
+
diff --git a/src/H5Fio.c b/src/H5Fio.c
index f0e3bc7..81fa514 100644
--- a/src/H5Fio.c
+++ b/src/H5Fio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -39,6 +37,7 @@
 #include "H5Fpkg.h"             /* File access				*/
 #include "H5FDprivate.h"	/* File drivers				*/
 #include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5PBprivate.h"	/* Page Buffer				*/
 
 
 /****************/
@@ -96,15 +95,11 @@ herr_t
 H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size,
     hid_t dxpl_id, void *buf/*out*/)
 {
-    H5F_io_info_t fio_info;             /* I/O info for operation */
+    H5F_io_info2_t fio_info;            /* I/O info for operation */
     H5FD_mem_t  map_type;               /* Mapped memory type */
-    hid_t       my_dxpl_id = dxpl_id;   /* transfer property to use for I/O */
     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);
@@ -118,20 +113,24 @@ HDfprintf(stderr, "%s: read from addr = %a, size = %Zu\n", FUNC, addr, size);
     /* Treat global heap as raw data */
     map_type = (type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type;
 
-#ifdef H5_DEBUG_BUILD
-    /* GHEAP type is treated as RAW, so update the dxpl type property too */
-    if(H5FD_MEM_GHEAP == type)
-        my_dxpl_id = H5AC_rawdata_dxpl_id;
-#endif /* H5_DEBUG_BUILD */
-
-    /* Set up I/O info for operation */
+    /* Set up the I/O info object */
     fio_info.f = f;
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(my_dxpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(H5FD_MEM_DRAW == type) {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end if */
+    else {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end else */
 
-    /* Pass through metadata accumulator layer */
-    if(H5F__accum_read(&fio_info, map_type, addr, size, buf) < 0)
-        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "read through metadata accumulator failed")
+    /* Pass through page buffer layer */
+    if(H5PB_read(&fio_info, map_type, addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "read through page buffer failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -157,15 +156,11 @@ 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)
 {
-    H5F_io_info_t fio_info;             /* I/O info for operation */
+    H5F_io_info2_t fio_info;            /* I/O info for operation */
     H5FD_mem_t  map_type;               /* Mapped memory type */
-    hid_t       my_dxpl_id = dxpl_id;   /* transfer property to use for I/O */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
-#ifdef QAK
-HDfprintf(stderr, "%s: write to addr = %a, size = %Zu\n", FUNC, addr, size);
-#endif /* QAK */
 
     HDassert(f);
     HDassert(f->shared);
@@ -180,20 +175,24 @@ HDfprintf(stderr, "%s: write to addr = %a, size = %Zu\n", FUNC, addr, size);
     /* Treat global heap as raw data */
     map_type = (type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type;
 
-#ifdef H5_DEBUG_BUILD
-    /* GHEAP type is treated as RAW, so update the dxpl type property too */
-    if(H5FD_MEM_GHEAP == type)
-        my_dxpl_id = H5AC_rawdata_dxpl_id;
-#endif /* H5_DEBUG_BUILD */
-
-    /* Set up I/O info for operation */
+    /* Set up the I/O info object */
     fio_info.f = f;
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(my_dxpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(H5FD_MEM_DRAW == type) {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end if */
+    else {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end else */
 
-    /* Pass through metadata accumulator layer */
-    if(H5F__accum_write(&fio_info, map_type, addr, size, buf) < 0)
-        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write through metadata accumulator failed")
+    /* Pass through page buffer layer */
+    if(H5PB_write(&fio_info, map_type, addr, size, buf) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write through page buffer failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -216,7 +215,7 @@ done:
 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 */
+    H5F_io_info2_t fio_info;             /* I/O info for operation */
     herr_t ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -227,10 +226,10 @@ H5F_flush_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id)
 
     /* Set up I/O info for operation */
     fio_info.f = f;
-
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+    if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_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)
@@ -264,44 +263,33 @@ H5F_evict_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id)
 
     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)
+    if(H5AC_evict_tagged_metadata(f, tag, TRUE, 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
+ * Function:    H5F__evict_cache_entries
  *
- * Purpose:     To revict all cache entries except the pinned superblock entry
+ * Purpose:     To evict all cache entries except the pinned superblock entry
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Vailin Choi; Dec 2013
+ * Programmer:  Vailin Choi
+ *		Dec 2013
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_evict_cache_entries(H5F_t *f, hid_t dxpl_id)
+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)
+    FUNC_ENTER_PACKAGE
 
     HDassert(f);
     HDassert(f->shared);
@@ -310,6 +298,11 @@ H5F_evict_cache_entries(H5F_t *f, hid_t dxpl_id)
     if(H5AC_evict(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "unable to evict all except pinned entries")
 
+#ifndef NDEBUG
+{
+    unsigned status = 0;
+    uint32_t cur_num_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")
@@ -322,13 +315,15 @@ H5F_evict_cache_entries(H5F_t *f, hid_t dxpl_id)
     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 */
+    /* Should be the only one left in the cache (the superblock) */
     if(cur_num_entries != 1)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "number of cache entries is not correct")
+}
+#endif /* NDEBUG */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value);
-} /* end H5F_evict_cache_entries() */
+} /* end H5F__evict_cache_entries() */
 
 

 /*-------------------------------------------------------------------------
@@ -341,7 +336,8 @@ done:
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Vailin Choi; Sept 2013
+ * Programmer:	Vailin Choi
+ *		Sept 2013
  *
  *-------------------------------------------------------------------------
  */
@@ -372,68 +368,3 @@ H5F_get_checksums(const uint8_t *buf, size_t buf_size, uint32_t *s_chksum/*out*/
     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
index 4bb2506..0481512 100644
--- a/src/H5Fmodule.h
+++ b/src/H5Fmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Fmount.c b/src/H5Fmount.c
index adde071..3cd5c21 100644
--- a/src/H5Fmount.c
+++ b/src/H5Fmount.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Fmodule.h"          /* This source code file is part of the H5F module */
@@ -69,7 +67,7 @@ H5F_close_mounts(H5F_t *f)
             HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close child group")
 
             /* Close the child file */
-            if(H5F_try_close(f->shared->mtab.child[u].file) < 0)
+            if(H5F_try_close(f->shared->mtab.child[u].file, NULL) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close child file")
 
             /* Eliminate the mount point from the table */
@@ -386,7 +384,7 @@ H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id)
 
     /* Detach child file from parent & see if it should close */
     child->parent = NULL;
-    if(H5F_try_close(child) < 0)
+    if(H5F_try_close(child, NULL) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close unmounted file")
 
 done:
@@ -614,7 +612,7 @@ H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F_flush_mounts_recurse(H5F_t *f, hid_t dxpl_id)
+H5F_flush_mounts_recurse(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id)
 {
     unsigned	nerrors = 0;            /* Errors from recursive flushes */
     unsigned    u;                      /* Index variable */
@@ -627,11 +625,11 @@ H5F_flush_mounts_recurse(H5F_t *f, hid_t dxpl_id)
 
     /* Flush all child files, not stopping for errors */
     for(u = 0; u < f->shared->mtab.nmounts; u++)
-        if(H5F_flush_mounts_recurse(f->shared->mtab.child[u].file, dxpl_id) < 0)
+        if(H5F_flush_mounts_recurse(f->shared->mtab.child[u].file, meta_dxpl_id, raw_dxpl_id) < 0)
             nerrors++;
 
     /* Call the "real" flush routine, for this file */
-    if(H5F_flush(f, dxpl_id, FALSE) < 0)
+    if(H5F__flush(f, meta_dxpl_id, raw_dxpl_id, FALSE) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
 
     /* Check flush errors for children - errors are already on the stack */
@@ -656,7 +654,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_flush_mounts(H5F_t *f, hid_t dxpl_id)
+H5F_flush_mounts(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
@@ -670,7 +668,7 @@ H5F_flush_mounts(H5F_t *f, hid_t dxpl_id)
         f = f->parent;
 
     /* Flush the mounted file hierarchy */
-    if(H5F_flush_mounts_recurse(f, dxpl_id) < 0)
+    if(H5F_flush_mounts_recurse(f, meta_dxpl_id, raw_dxpl_id) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
 
 done:
diff --git a/src/H5Fmpi.c b/src/H5Fmpi.c
index 5434aa5..2ce454a 100644
--- a/src/H5Fmpi.c
+++ b/src/H5Fmpi.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -356,5 +354,31 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_mpi_retrieve_comm */
 
+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_mpi_info
+ *
+ * Purpose:     Retrieves MPI File info.
+ *
+ * Return:      Success:        The size (positive)
+ *              Failure:        Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_mpi_info(const H5F_t *f, MPI_Info **f_info)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f && f->shared);
+
+    /* Dispatch to driver */
+    if ((ret_value = H5FD_get_mpi_info(f->shared->lf, (void **)f_info)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get mpi file info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_mpi_info() */
 #endif /* H5_HAVE_PARALLEL */
 
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index a297b6d..7a5c126 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -42,6 +40,7 @@
 #include "H5FSprivate.h"	/* File free space                      */
 #include "H5Gprivate.h"		/* Groups 			  	*/
 #include "H5Oprivate.h"         /* Object header messages               */
+#include "H5PBprivate.h"        /* Page buffer                          */
 #include "H5UCprivate.h"	/* Reference counted object functions	*/
 
 
@@ -68,8 +67,8 @@
 
 /* Macro to abstract checking whether file is using 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)
+    ((F)->shared->fs_strategy == H5F_FSPACE_STRATEGY_FSM_AGGR ||                        \
+     (F)->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE)
 
 /* Macros for encoding/decoding superblock */
 #define H5F_MAX_DRVINFOBLOCK_SIZE  1024         /* Maximum size of superblock driver info buffer */
@@ -155,17 +154,6 @@
 /* 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;
@@ -185,6 +173,7 @@ typedef struct H5F_superblock_cache_ud_t {
 			       */
 } H5F_superblock_cache_ud_t;
 
+/* Structure for passing 'user data' to driver info block cache callbacks */
 typedef struct H5F_drvrinfo_cache_ud_t {
     H5F_t   *f;               /* Pointer to file */
     haddr_t driver_addr;      /* address of driver info block */
@@ -210,13 +199,6 @@ typedef struct H5F_meta_accum_t {
     hbool_t             dirty;          /* Flag to indicate that the accumulated metadata is dirty */
 } H5F_meta_accum_t;
 
-/* Enum for free space manager state */
-typedef enum H5F_fs_state_t {
-    H5F_FS_STATE_CLOSED,                /* Free space manager is closed */
-    H5F_FS_STATE_OPEN,                  /* Free space manager has been opened */
-    H5F_FS_STATE_DELETING               /* Free space manager is being deleted */
-} H5F_fs_state_t;
-
 /* A record of the mount table */
 typedef struct H5F_mount_t {
     struct H5G_t	*group;	/* Mount point group held open		*/
@@ -269,6 +251,14 @@ struct H5F_file_t {
                                  * block is present.  At all other times
                                  * it should be NULL.
                                  */
+    hbool_t drvinfo_sb_msg_exists;  /* Convenience field used to track 
+                                     * whether the driver info superblock 
+                                     * extension message has been created 
+                                     * yet. This field should be TRUE iff the
+                                     * superblock extension exists and contains
+                                     * a driver info message.  Under all other
+                                     * circumstances, it must be set to FALSE.
+                                     */
     unsigned	nrefs;		/* Ref count for times file is opened	*/
     unsigned	flags;		/* Access Permissions for file          */
     H5F_mtab_t	mtab;		/* File mount table                     */
@@ -283,18 +273,26 @@ struct H5F_file_t {
     unsigned long feature_flags; /* VFL Driver feature Flags            */
     haddr_t	maxaddr;	/* Maximum address for file             */
 
+    H5PB_t      *page_buf;                  /* The page buffer cache                */
     H5AC_t      *cache;		/* The object cache	 		*/
     H5AC_cache_config_t
 		mdc_initCacheCfg; /* initial configuration for the      */
                                 /* metadata cache.  This structure is   */
                                 /* fixed at creation time and should    */
                                 /* not change thereafter.               */
+    H5AC_cache_image_config_t 
+		mdc_initCacheImageCfg;  /* initial configuration for the */
+                                        /* generate metadata cache image on     */
+                                        /* close option.  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	*/
+    hbool_t evict_on_close; /* If the file's objects should be evicted from the metadata cache on close */
     size_t	rdcc_nslots;	/* Size of raw data chunk cache (slots)	*/
     size_t	rdcc_nbytes;	/* Size of raw data chunk cache	(bytes)	*/
     double	rdcc_w0;	/* Preempt read chunks first? [0.0..1.0]*/
@@ -302,7 +300,6 @@ struct H5F_file_t {
     hsize_t	threshold;	/* Threshold for alignment		*/
     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		*/
@@ -312,19 +309,38 @@ struct H5F_file_t {
     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		*/
+    H5F_fspace_strategy_t fs_strategy;      /* File space handling strategy	*/
     hsize_t     fs_threshold;	/* Free space section threshold 	*/
+    hbool_t fs_persist;                     /* Free-space persist or not */
     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 */
+    hbool_t point_of_no_return;             /* flag to indicate that we can't go back and delete a freespace header when it's used up */
+
+    H5F_fs_state_t fs_state[H5F_MEM_PAGE_NTYPES];   /* State of free space manager for each type */
+    haddr_t fs_addr[H5F_MEM_PAGE_NTYPES];           /* Address of free space manager info for each type */
+    H5FS_t *fs_man[H5F_MEM_PAGE_NTYPES];            /* Free space manager for each file space type */
+    hbool_t first_alloc_dealloc;            /* TRUE iff free space managers   */
+                                            /* are persistant and have not    */
+                                            /* been used accessed for either  */
+                                            /* allocation or deallocation     */
+                                            /* since file open.               */
+    haddr_t eoa_pre_fsm_fsalloc;	    /* eoa pre file space allocation  */
+                                            /* for self referential FSMs      */
+    haddr_t eoa_post_fsm_fsalloc;           /* eoa post file space allocation */
+                                            /* for self referential FSMs      */
+    haddr_t eoa_post_mdci_fsalloc;          /* eoa past file space allocation */
+                                            /* for metadata cache image, or   */
+                                            /* HADDR_UNDEF if no cache image. */
+
+    /* Free-space aggregation info */
     unsigned fs_aggr_merge[H5FD_MEM_NTYPES];    /* Flags for whether free space can merge with aggregator(s) */
-    H5F_fs_state_t fs_state[H5FD_MEM_NTYPES];   /* State of free space manager for each type */
-    haddr_t fs_addr[H5FD_MEM_NTYPES];   /* Address of free space manager info for each type */
-    H5FS_t *fs_man[H5FD_MEM_NTYPES];    /* Free space manager for each file space type */
-    H5FD_mem_t fs_type_map[H5FD_MEM_NTYPES]; /* Mapping of "real" file space type into tracked type */
-    H5F_blk_aggr_t meta_aggr;   /* Metadata aggregation info */
-                                /* (if aggregating metadata allocations) */
-    H5F_blk_aggr_t sdata_aggr;  /* "Small data" aggregation info */
-                                /* (if aggregating "small data" allocations) */
+    H5FD_mem_t fs_type_map[H5FD_MEM_NTYPES];    /* Mapping of "real" file space type into tracked type */
+    H5F_blk_aggr_t meta_aggr;   	        /* Metadata aggregation info (if aggregating metadata allocations) */
+    H5F_blk_aggr_t sdata_aggr;                  /* "Small data" aggregation info (if aggregating "small data" allocations) */
+
+    /* Paged aggregation info */
+    hsize_t fs_page_size;                           /* File space page size */
+    size_t pgend_meta_thres;                        /* Do not track page end meta section <= this threshold */
 
     /* Metadata accumulator information */
     H5F_meta_accum_t accum;     /* Metadata accumulator info           	*/
@@ -333,6 +349,8 @@ struct H5F_file_t {
     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 */
+
+    /* Object flush info */
     H5F_object_flush_t 	object_flush;		/* Information for object flush callback */
 };
 
@@ -369,9 +387,6 @@ H5FL_EXTERN(H5F_t);
 /* Declare a free list to manage the H5F_file_t struct */
 H5FL_EXTERN(H5F_file_t);
 
-H5_DLLVAR const H5AC_class_t H5AC_SUPERBLOCK[1];
-H5_DLLVAR const H5AC_class_t H5AC_DRVRINFO[1];
-
 
 /******************************/
 /* Package Private Prototypes */
@@ -380,11 +395,12 @@ H5_DLLVAR const H5AC_class_t H5AC_DRVRINFO[1];
 /* General routines */
 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);
-H5_DLL herr_t H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing);
-H5_DLL htri_t H5F_is_hdf5(const char *name, hid_t dxpl_id);
+H5_DLL herr_t H5F__dest(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t flush);
+H5_DLL herr_t H5F__flush(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t closing);
+H5_DLL htri_t H5F__is_hdf5(const char *name, hid_t meta_dxpl_id, hid_t raw_dxpl_id);
 H5_DLL herr_t H5F_get_objects(const H5F_t *f, unsigned types, size_t max_index, hid_t *obj_id_list, hbool_t app_ref, size_t *obj_id_count_ptr);
-H5_DLL ssize_t H5F_get_file_image(H5F_t *f, void *buf_ptr, size_t buf_len, hid_t dxpl_id);
+H5_DLL ssize_t H5F_get_file_image(H5F_t *f, void *buf_ptr, size_t buf_len,
+    hid_t meta_dxpl_id, hid_t raw_dxpl_id);
 H5_DLL herr_t H5F_close(H5F_t *f);
 
 /* File mount related routines */
@@ -394,26 +410,28 @@ H5_DLL herr_t H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nop
 
 /* 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, hbool_t initial_read);
+H5_DLL herr_t H5F__super_read(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_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, unsigned id, void *mesg, hbool_t may_create);
+H5_DLL herr_t H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, unsigned id,
+    void *mesg, hbool_t may_create, unsigned mesg_flags);
 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);
 
 /* Metadata accumulator routines */
-H5_DLL herr_t H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+H5_DLL herr_t H5F__accum_read(const H5F_io_info2_t *fio_info, H5FD_mem_t type,
     haddr_t addr, size_t size, void *buf);
-H5_DLL herr_t H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+H5_DLL herr_t H5F__accum_write(const H5F_io_info2_t *fio_info, H5FD_mem_t type,
     haddr_t addr, size_t size, const void *buf);
-H5_DLL herr_t H5F__accum_free(const H5F_io_info_t *fio_info, H5FD_mem_t type,
+H5_DLL herr_t H5F__accum_free(const H5F_io_info2_t *fio_info, H5FD_mem_t type,
     haddr_t addr, hsize_t size);
-H5_DLL herr_t H5F__accum_flush(const H5F_io_info_t *fio_info);
-H5_DLL herr_t H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush);
+H5_DLL herr_t H5F__accum_flush(const H5F_io_info2_t *fio_info);
+H5_DLL herr_t H5F__accum_reset(const H5F_io_info2_t *fio_info, hbool_t flush);
 
 /* Shared file list related routines */
 H5_DLL herr_t H5F_sfile_add(H5F_file_t *shared);
@@ -427,9 +445,19 @@ 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);
 
+/* Space allocation routines */
+H5_DLL haddr_t H5F_alloc(H5F_t *f, hid_t dxpl_id, H5F_mem_t type, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size);
+H5_DLL herr_t H5F_free(H5F_t *f, hid_t dxpl_id, H5F_mem_t type, haddr_t addr, hsize_t size);
+H5_DLL htri_t H5F_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, 
+    haddr_t blk_end, hsize_t extra_requested);
+
 /* 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);
+H5_DLL herr_t H5F__set_paged_aggr(const H5F_t *f, hbool_t paged);
+
+/* Functions that flush or evict */
+H5_DLL herr_t H5F__evict_cache_entries(H5F_t *f, hid_t dxpl_id);
 
 /* Testing functions */
 #ifdef H5F_TESTING
@@ -437,6 +465,7 @@ H5_DLL herr_t H5F_get_sohm_mesg_count_test(hid_t fid, unsigned type_id,
     size_t *mesg_count);
 H5_DLL herr_t H5F_check_cached_stab_test(hid_t file_id);
 H5_DLL herr_t H5F_get_maxaddr_test(hid_t file_id, haddr_t *maxaddr);
+H5_DLL herr_t H5F_get_sbe_addr_test(hid_t file_id, haddr_t *sbe_addr);
 #endif /* H5F_TESTING */
 
 #endif /* _H5Fpkg_H */
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index aabff99..6f68a62 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -279,7 +277,7 @@
 #define H5F_ACTUAL_NAME(F)      ((F)->actual_name)
 #define H5F_EXTPATH(F)          ((F)->extpath)
 #define H5F_SHARED(F)           ((F)->shared)
-#define H5F_SAME_SHARED(F1, F2) ((F1)->shared == (F2)->shared))
+#define H5F_SAME_SHARED(F1, F2) ((F1)->shared == (F2)->shared)
 #define H5F_NOPEN_OBJS(F)       ((F)->nopen_objs)
 #define H5F_INCR_NOPEN_OBJS(F)  ((F)->nopen_objs++)
 #define H5F_DECR_NOPEN_OBJS(F)  ((F)->nopen_objs--)
@@ -304,22 +302,32 @@
 #define H5F_SET_SOHM_NINDEXES(F, N) ((F)->shared->sohm_nindexes = (N))
 #define H5F_FCPL(F)             ((F)->shared->fcpl_id)
 #define H5F_GET_FC_DEGREE(F)    ((F)->shared->fc_degree)
+#define H5F_EVICT_ON_CLOSE(F)   ((F)->shared->evict_on_close)
 #define H5F_RDCC_NSLOTS(F)      ((F)->shared->rdcc_nslots)
 #define H5F_RDCC_NBYTES(F)      ((F)->shared->rdcc_nbytes)
 #define H5F_RDCC_W0(F)          ((F)->shared->rdcc_w0)
 #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)))
+#define H5F_USE_TMP_SPACE(F)    ((F)->shared->fs.use_tmp_space)
+#define H5F_IS_TMP_ADDR(F, ADDR) (H5F_addr_le((F)->shared->fs.tmp_addr, (ADDR)))
+#define H5F_SET_LATEST_FLAGS(F, FL)  ((F)->shared->latest_flags = (FL))
 #ifdef H5_HAVE_PARALLEL
 #define H5F_COLL_MD_READ(F)     ((F)->coll_md_read)
 #endif /* H5_HAVE_PARALLEL */
+#define H5F_USE_MDC_LOGGING(F)  ((F)->shared->use_mdc_logging)
+#define H5F_START_MDC_LOG_ON_ACCESS(F)  ((F)->shared->start_mdc_log_on_access)
+#define H5F_MDC_LOG_LOCATION(F) ((F)->shared->mdc_log_location)
+#define H5F_ALIGNMENT(F)   	((F)->shared->alignment)
+#define H5F_THRESHOLD(F)   	((F)->shared->threshold)
+#define H5F_PGEND_META_THRES(F) ((F)->shared->fs.pgend_meta_thres)
+#define H5F_POINT_OF_NO_RETURN(F) ((F)->shared->fs.point_of_no_return)
+#define H5F_FIRST_ALLOC_DEALLOC(F) ((F)->shared->first_alloc_dealloc)
+#define H5F_EOA_PRE_FSM_FSALLOC(F) ((F)->shared->eoa_pre_fsm_fsalloc)
 #else /* H5F_MODULE */
 #define H5F_INTENT(F)           (H5F_get_intent(F))
 #define H5F_OPEN_NAME(F)        (H5F_get_open_name(F))
@@ -351,12 +359,12 @@
 #define H5F_SET_SOHM_NINDEXES(F, N) (H5F_set_sohm_nindexes((F), (N)))
 #define H5F_FCPL(F)             (H5F_get_fcpl(F))
 #define H5F_GET_FC_DEGREE(F)    (H5F_get_fc_degree(F))
+#define H5F_EVICT_ON_CLOSE(F)   (H5F_get_evict_on_close(F))
 #define H5F_RDCC_NSLOTS(F)      (H5F_rdcc_nslots(F))
 #define H5F_RDCC_NBYTES(F)      (H5F_rdcc_nbytes(F))
 #define H5F_RDCC_W0(F)          (H5F_rdcc_w0(F))
 #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)))
@@ -364,9 +372,19 @@
 #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)))
+#define H5F_SET_LATEST_FLAGS(F, FL)  (H5F_set_latest_flags((F), (FL)))
 #ifdef H5_HAVE_PARALLEL
 #define H5F_COLL_MD_READ(F)     (H5F_coll_md_read(F))
 #endif /* H5_HAVE_PARALLEL */
+#define H5F_USE_MDC_LOGGING(F)  (H5F_use_mdc_logging(F))
+#define H5F_START_MDC_LOG_ON_ACCESS(F)  (H5F_start_mdc_log_on_access(F))
+#define H5F_MDC_LOG_LOCATION(F) (H5F_mdc_log_location(F))
+#define H5F_ALIGNMENT(F)    	(H5F_get_alignment(F))
+#define H5F_THRESHOLD(F)    	(H5F_get_threshold(F))
+#define H5F_PGEND_META_THRES(F) (H5F_get_pgend_meta_thres(F))
+#define H5F_POINT_OF_NO_RETURN(F) (H5F_get_point_of_no_return(F))
+#define H5F_FIRST_ALLOC_DEALLOC(F) (H5F_get_first_alloc_dealloc(F))
+#define H5F_EOA_PRE_FSM_FSALLOC(F) (H5F_get_eoa_pre_fsm_fsalloc(F))
 #endif /* H5F_MODULE */
 
 
@@ -413,7 +431,7 @@
 #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(HDoff_t)-1)))
+    ((hsize_t)(X) >= (hsize_t)((hsize_t)1 << (8 * sizeof(HDoff_t) - 1)))
 #else
 #   define H5F_OVERFLOW_HSIZET2OFFT(X) 0
 #endif
@@ -440,7 +458,9 @@
 #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_PERSIST_NAME "free_space_persist"  	/* Free-space persisting status */
 #define H5F_CRT_FREE_SPACE_THRESHOLD_NAME "free_space_threshold"  /* Free space section threshold */
+#define H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME "file_space_page_size"  /* File space page size */
 
 
 
@@ -471,10 +491,14 @@
 #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 */
+#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_EVICT_ON_CLOSE_FLAG_NAME        "evict_on_close_flag" /* Whether or not the metadata cache will evict objects on close */
+#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 */
 #define H5F_ACS_COLL_MD_WRITE_FLAG_NAME         "collective_metadata_write" /* property indicating whether metadata writes are done collectively or not */
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME "mdc_initCacheImageCfg" /* Initial metadata cache image creation configuration */
+#define H5F_ACS_PAGE_BUFFER_SIZE_NAME           "page_buffer_size" /* the maximum size for the page buffer cache */
+#define H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME  "page_buffer_min_meta_perc" /* the min metadata percentage for the page buffer cache */
+#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME   "page_buffer_min_raw_perc" /* the min raw data percentage for the page buffer cache */
 
 /* ======================== File Mount properties ====================*/
 #define H5F_MNT_SYM_LOCAL_NAME 		"local"                 /* Whether absolute symlinks local to file. */
@@ -513,19 +537,44 @@
 						/* See format specification on version 1 B-trees */
 
 /* Default file space handling strategy */
-#define H5F_FILE_SPACE_STRATEGY_DEF	        H5F_FILE_SPACE_ALL
+#define H5F_FILE_SPACE_STRATEGY_DEF	        H5F_FSPACE_STRATEGY_FSM_AGGR
+
+/* Default free space section threshold used by free-space managers */
+#define H5F_FREE_SPACE_PERSIST_DEF	        FALSE
+
 /* Default free space section threshold used by free-space managers */
 #define H5F_FREE_SPACE_THRESHOLD_DEF	        1
 
+/* For paged aggregation: default file space page size when not set */
+#define H5F_FILE_SPACE_PAGE_SIZE_DEF     	4096    
+/* For paged aggregation: minimum value for file space page size */
+#define H5F_FILE_SPACE_PAGE_SIZE_MIN     	512
+
+/* For paged aggregation: drop free-space with size <= this threshold for small meta section */
+#define H5F_FILE_SPACE_PGEND_META_THRES  10    
+
+/* Default for threshold for alignment (can be set via H5Pset_alignment()) */
+#define H5F_ALIGN_DEF			1
+/* Default for alignment (can be set via H5Pset_alignment()) */
+#define H5F_ALIGN_THRHD_DEF		1
+/* Default size for meta data aggregation block (can be set via H5Pset_meta_block_size()) */
+#define H5F_META_BLOCK_SIZE_DEF		2048
+/* Default size for small data aggregation block (can be set via H5Pset_small_data_block_size()) */
+#define H5F_SDATA_BLOCK_SIZE_DEF	2048
+
+/* Check for file using paged aggregation */
+#define H5F_PAGED_AGGR(F) (F->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE && F->shared->fs_page_size)
+
 /* 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
+#define H5_SIZEOF_MAGIC                 4
 
 /* Size of checksum information (on disk) */
 /* (all on-disk checksums should be this length) */
@@ -584,9 +633,9 @@
 #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_NO_MOD_TIME_MSG      0x0040
 #define H5F_LATEST_STYLE_GROUP          0x0080
-#define H5F_LATEST_OBJ_HEADER		0x0100
+#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)
 
@@ -618,19 +667,54 @@ typedef struct H5F_object_flush_t {
     void *udata;                /* User data */
 } H5F_object_flush_t;
 
-
-/* I/O Info for an operation */
+/* I/O Info for an operation (old) */
 typedef struct H5F_io_info_t {
     const H5F_t *f;                     /* File object */
     const struct H5P_genplist_t *dxpl;         /* DXPL object */
 } H5F_io_info_t;
 
+/* I/O Info for an operation */
+/* (Migrate toward this one, so that both raw data & metadata DXPLs are available) */
+typedef struct H5F_io_info2_t {
+    const H5F_t *f;                             /* File object */
+    const struct H5P_genplist_t *meta_dxpl;     /* Metadata DXPL object */
+    const struct H5P_genplist_t *raw_dxpl;      /* Raw data DXPL object */
+} H5F_io_info2_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;
 
+/* Enum for free space manager state */
+typedef enum H5F_fs_state_t {
+    H5F_FS_STATE_CLOSED = 0,                /* Free space manager is closed */
+    H5F_FS_STATE_OPEN = 1,                  /* Free space manager has been opened */
+    H5F_FS_STATE_DELETING = 2               /* Free space manager is being deleted */
+} H5F_fs_state_t;
+
+/* For paged aggregation */
+/* The values 0 to 6 is the same as H5F_mem_t */
+typedef enum H5F_mem_page_t {
+    H5F_MEM_PAGE_DEFAULT = 0,       /* Not used */
+    H5F_MEM_PAGE_SUPER = 1,
+    H5F_MEM_PAGE_BTREE = 2,          
+    H5F_MEM_PAGE_DRAW = 3, 
+    H5F_MEM_PAGE_GHEAP = 4,      
+    H5F_MEM_PAGE_LHEAP = 5,      
+    H5F_MEM_PAGE_OHDR = 6,      
+    H5F_MEM_PAGE_LARGE_SUPER = 7,
+    H5F_MEM_PAGE_LARGE_BTREE = 8,
+    H5F_MEM_PAGE_LARGE_DRAW = 9,
+    H5F_MEM_PAGE_LARGE_GHEAP = 10,
+    H5F_MEM_PAGE_LARGE_LHEAP = 11,
+    H5F_MEM_PAGE_LARGE_OHDR = 12,
+    H5F_MEM_PAGE_NTYPES = 13       /* Sentinel value - must be last */
+} H5F_mem_page_t;
+
+#define H5F_MEM_PAGE_META       H5F_MEM_PAGE_SUPER          /* Small-sized meta data */
+#define H5F_MEM_PAGE_GENERIC    H5F_MEM_PAGE_LARGE_SUPER    /* Large-sized generic: meta and raw */
 
 /*****************************/
 /* Library-private Variables */
@@ -645,7 +729,7 @@ typedef struct H5F_block_t {
 /* Private functions */
 H5_DLL H5F_t *H5F_open(const char *name, unsigned flags, hid_t fcpl_id,
     hid_t fapl_id, hid_t dxpl_id);
-H5_DLL herr_t H5F_try_close(H5F_t *f);
+H5_DLL herr_t H5F_try_close(H5F_t *f, hbool_t *was_closed/*out*/);
 
 /* Functions than retrieve values from the file struct */
 H5_DLL unsigned H5F_get_intent(const H5F_t *f);
@@ -665,7 +749,10 @@ 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);
+H5_DLL hsize_t H5F_get_pgend_meta_thres(const H5F_t *f);
+H5_DLL hbool_t H5F_get_point_of_no_return(const H5F_t *f);
+H5_DLL hbool_t H5F_get_first_alloc_dealloc(const H5F_t *f);
+H5_DLL hbool_t H5F_get_eoa_pre_fsm_fsalloc(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);
@@ -682,12 +769,12 @@ H5_DLL unsigned H5F_get_sohm_nindexes(const H5F_t *f);
 H5_DLL herr_t H5F_set_sohm_nindexes(H5F_t *f, unsigned nindexes);
 H5_DLL hid_t H5F_get_fcpl(const H5F_t *f);
 H5_DLL H5F_close_degree_t H5F_get_fc_degree(const H5F_t *f);
+H5_DLL hbool_t H5F_get_evict_on_close(const H5F_t *f);
 H5_DLL size_t H5F_rdcc_nbytes(const H5F_t *f);
 H5_DLL size_t H5F_rdcc_nslots(const H5F_t *f);
 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);
@@ -695,10 +782,16 @@ 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);
+H5_DLL herr_t H5F_set_latest_flags(H5F_t *f, unsigned flags);
+H5_DLL hsize_t H5F_get_alignment(const H5F_t *f);
+H5_DLL hsize_t H5F_get_threshold(const H5F_t *f);
 #ifdef H5_HAVE_PARALLEL
 H5_DLL H5P_coll_md_read_flag_t H5F_coll_md_read(const H5F_t *f);
 H5_DLL void H5F_set_coll_md_read(H5F_t *f, H5P_coll_md_read_flag_t flag);
 #endif /* H5_HAVE_PARALLEL */
+H5_DLL hbool_t H5F_use_mdc_logging(const H5F_t *f);
+H5_DLL hbool_t H5F_start_mdc_log_on_access(const H5F_t *f);
+H5_DLL char *H5F_mdc_log_location(const H5F_t *f);
 
 /* Functions that retrieve values from VFD layer */
 H5_DLL hid_t H5F_get_driver_id(const H5F_t *f);
@@ -711,7 +804,7 @@ H5_DLL herr_t H5F_get_vfd_handle(const H5F_t *file, hid_t fapl, void **file_hand
 H5_DLL hbool_t H5F_is_mount(const H5F_t *file);
 H5_DLL hbool_t H5F_has_mount(const H5F_t *file);
 H5_DLL herr_t H5F_traverse_mount(struct H5O_loc_t *oloc/*in,out*/);
-H5_DLL herr_t H5F_flush_mounts(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5F_flush_mounts(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id);
 
 /* Functions that operate on blocks of bytes wrt super block */
 H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
@@ -722,13 +815,8 @@ H5_DLL herr_t H5F_block_write(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
 /* 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*/);
+/* Functions that verify a piece of metadata with checksum */
 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 */
@@ -738,7 +826,6 @@ 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);
@@ -754,6 +841,7 @@ H5_DLL herr_t H5F_fake_free(H5F_t *f);
 
 /* Superblock related routines */
 H5_DLL herr_t H5F_super_dirty(H5F_t *f);
+H5_DLL herr_t H5F_eoa_dirty(H5F_t *f, hid_t dxpl_id);
 
 /* Parallel I/O (i.e. MPI) related routines */
 #ifdef H5_HAVE_PARALLEL
@@ -762,6 +850,7 @@ H5_DLL int H5F_mpi_get_rank(const H5F_t *f);
 H5_DLL MPI_Comm H5F_mpi_get_comm(const H5F_t *f);
 H5_DLL int H5F_mpi_get_size(const H5F_t *f);
 H5_DLL herr_t H5F_mpi_retrieve_comm(hid_t loc_id, hid_t acspl_id, MPI_Comm *mpi_comm);
+H5_DLL herr_t H5F_get_mpi_info(const H5F_t *f, MPI_Info **f_info);
 #endif /* H5_HAVE_PARALLEL */
 
 /* External file cache routines */
diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h
index 318f374..1594cb2 100644
--- a/src/H5Fpublic.h
+++ b/src/H5Fpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -48,9 +46,6 @@
  * which are compatible with the library to which the application is linked.
  * We're assuming that these constants are used rather early in the hdf5
  * session.
- *
- * Note that H5F_ACC_DEBUG is deprecated (nonfuncational) but retained as a
- * symbol for backward compatibility.
  */
 #define H5F_ACC_RDONLY	(H5CHECK H5OPEN 0x0000u)	/*absence of rdwr => rd-only */
 #define H5F_ACC_RDWR	(H5CHECK H5OPEN 0x0001u)	/*open for read and write    */
@@ -185,6 +180,17 @@ typedef enum H5F_libver_t {
 } H5F_libver_t;
 
 /* File space handling strategy */
+typedef enum H5F_fspace_strategy_t {
+    H5F_FSPACE_STRATEGY_FSM_AGGR = 0,   /* Mechanisms: free-space managers, aggregators, and virtual file drivers */
+                                        /* This is the library default when not set */
+    H5F_FSPACE_STRATEGY_PAGE = 1,   /* Mechanisms: free-space managers with embedded paged aggregation and virtual file drivers */
+    H5F_FSPACE_STRATEGY_AGGR = 2,   /* Mechanisms: aggregators and virtual file drivers */
+    H5F_FSPACE_STRATEGY_NONE = 3,   /* Mechanisms: virtual file drivers */
+    H5F_FSPACE_STRATEGY_NTYPES      /* must be last */
+} H5F_fspace_strategy_t;
+
+/* Deprecated: File space handling strategy for release 1.10.0 */
+/* They are mapped to H5F_fspace_strategy_t as defined above from release 1.10.1 onwards */
 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 */
@@ -249,12 +255,18 @@ 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 H5Fset_latest_format(hid_t file_id, hbool_t latest_format);
 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);
 H5_DLL herr_t H5Fformat_convert(hid_t fid);
+H5_DLL herr_t H5Freset_page_buffering_stats(hid_t file_id);
+H5_DLL herr_t H5Fget_page_buffering_stats(hid_t file_id, unsigned accesses[2],
+    unsigned hits[2], unsigned misses[2], unsigned evictions[2], unsigned bypasses[2]);
+H5_DLL herr_t H5Fget_mdc_image_info(hid_t file_id, haddr_t *image_addr, hsize_t *image_size);
+
 #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);
diff --git a/src/H5Fquery.c b/src/H5Fquery.c
index 34f8dd7..41cf4d2 100644
--- a/src/H5Fquery.c
+++ b/src/H5Fquery.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -802,23 +800,22 @@ H5F_gc_ref(const H5F_t *f)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_use_latest_format
+ * Function:	H5F_use_latest_flags
  *
- * Purpose:	Retrieve the 'use the latest version of the format' flag for
- *              the file.
+ * Purpose:	Retrieve the 'latest version support' for the file.
  *
- * Return:	Success:	Non-negative, the 'use the latest format' flag
+ * Return:	Success:	Non-negative, the requested 'version support'
  *
  * 		Failure:	(can't happen)
  *
  * Programmer:	Quincey Koziol
  *		koziol at hdfgroup.org
- *		Oct  2 2006
+ *		Mar  5 2007
  *
  *-------------------------------------------------------------------------
  */
-hbool_t
-H5F_use_latest_format(const H5F_t *f)
+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
@@ -826,16 +823,16 @@ H5F_use_latest_format(const H5F_t *f)
     HDassert(f);
     HDassert(f->shared);
 
-    FUNC_LEAVE_NOAPI(f->shared->latest_format)
-} /* end H5F_use_latest_format() */
+    FUNC_LEAVE_NOAPI(f->shared->latest_flags & (fl))
+} /* end H5F_use_latest_flags() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_use_latest_flags
+ * Function:	H5F_get_fc_degree
  *
- * Purpose:	Retrieve the 'latest version support' for the file.
+ * Purpose:	Retrieve the 'file close degree' for the file.
  *
- * Return:	Success:	Non-negative, the requested 'version support'
+ * Return:	Success:	Non-negative, the 'file close degree'
  *
  * 		Failure:	(can't happen)
  *
@@ -845,8 +842,8 @@ H5F_use_latest_format(const H5F_t *f)
  *
  *-------------------------------------------------------------------------
  */
-unsigned
-H5F_use_latest_flags(const H5F_t *f, unsigned fl)
+H5F_close_degree_t
+H5F_get_fc_degree(const H5F_t *f)
 {
     /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -854,27 +851,27 @@ H5F_use_latest_flags(const H5F_t *f, unsigned fl)
     HDassert(f);
     HDassert(f->shared);
 
-    FUNC_LEAVE_NOAPI(f->shared->latest_flags & (fl))
-} /* end H5F_use_latest_flags() */
+    FUNC_LEAVE_NOAPI(f->shared->fc_degree)
+} /* end H5F_get_fc_degree() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_get_fc_degree
+ * Function:    H5F_get_evict_on_close
  *
- * Purpose:	Retrieve the 'file close degree' for the file.
+ * Purpose:     Checks if evict-on-close is desired for objects in the
+ *              file.
  *
- * Return:	Success:	Non-negative, the 'file close degree'
+ * Return:      Success:    Flag indicating whether the evict-on-close
+ *                          property was set for the file.
+ *              Failure:    (can't happen)
  *
- * 		Failure:	(can't happen)
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Mar  5 2007
+ * Programmer:  Dana Robinson
+ *              Spring 2016
  *
  *-------------------------------------------------------------------------
  */
-H5F_close_degree_t
-H5F_get_fc_degree(const H5F_t *f)
+hbool_t
+H5F_get_evict_on_close(const H5F_t *f)
 {
     /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -882,8 +879,8 @@ H5F_get_fc_degree(const H5F_t *f)
     HDassert(f);
     HDassert(f->shared);
 
-    FUNC_LEAVE_NOAPI(f->shared->fc_degree)
-} /* end H5F_get_fc_degree() */
+    FUNC_LEAVE_NOAPI(f->shared->evict_on_close)
+} /* end H5F_get_evict_on_close() */
 
 

 /*-------------------------------------------------------------------------
@@ -1152,3 +1149,234 @@ H5F_coll_md_read(const H5F_t *f)
 } /* end H5F_coll_md_read() */
 #endif /* H5_HAVE_PARALLEL */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_use_mdc_logging
+ *
+ * Purpose:	Quick and dirty routine to determine if using MDC logging
+ *		is enabled for this file.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		June  5, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_use_mdc_logging(const H5F_t *f)
+{
+    /* 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->use_mdc_logging)
+} /* end H5F_use_mdc_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_start_mdc_log_on_access
+ *
+ * Purpose:	Quick and dirty routine to determine if we should start MDC
+ *		logging on access for this file.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		June  5, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_start_mdc_log_on_access(const H5F_t *f)
+{
+    /* 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->start_mdc_log_on_access)
+} /* end H5F_start_mdc_log_on_access() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_mdc_log_location
+ *
+ * Purpose:	Quick and dirty routine to retrieve the MDC log location
+ *		for this file.
+ *          (Mainly added to stop non-file routines from poking about in the
+ *          H5F_t data structure)
+ *
+ * Return:	TRUE/FALSE on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		June  5, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+H5F_mdc_log_location(const H5F_t *f)
+{
+    /* 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->mdc_log_location)
+} /* end H5F_mdc_log_location() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_alignment
+ *
+ * Purpose:	Retrieve the 'alignment' for the file.
+ *
+ * Return:	Success:	Non-negative, the 'alignment'
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5F_get_alignment(const H5F_t *f)
+{
+    /* 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->alignment)
+} /* end H5F_get_alignment() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_threshold
+ *
+ * Purpose:	Retrieve the 'threshold' for alignment in the file.
+ *
+ * Return:	Success:	Non-negative, the 'threshold'
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5F_get_threshold(const H5F_t *f)
+{
+    /* 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->threshold)
+} /* end H5F_get_threshold() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_pgend_meta_thres
+ *
+ * Purpose:	Retrieve the 'page end meta threshold size' for the file.
+ *
+ * Return:	Success:	Non-negative, the 'pgend_meta_thres'
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5F_get_pgend_meta_thres(const H5F_t *f)
+{
+    /* 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->pgend_meta_thres)
+} /* end H5F_get_pgend_meta_thres() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_point_of_no_return
+ *
+ * Purpose:	Retrieve the 'point of no return' value for the file.
+ *
+ * Return:	Success:	Non-negative, the 'point_of_no_return'
+ * 		Failure:	(can't happen)
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_get_point_of_no_return(const H5F_t *f)
+{
+    /* 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->point_of_no_return)
+} /* end H5F_get_point_of_no_return() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_first_alloc_dealloc
+ *
+ * Purpose:	Retrieve the 'first alloc / dealloc' value for the file.
+ *
+ * Return:	Success:	Non-negative, the 'first_alloc_dealloc'
+ * 		Failure:	(can't happen)
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_get_first_alloc_dealloc(const H5F_t *f)
+{
+    /* 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->first_alloc_dealloc)
+} /* end H5F_get_first_alloc_dealloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_eoa_pre_fsm_fsalloc
+ *
+ * Purpose:	Retrieve the 'EOA pre-FSM fsalloc' value for the file.
+ *
+ * Return:	Success:	Non-negative, the 'EOA pre-FSM fsalloc'
+ * 		Failure:	(can't happen)
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_get_eoa_pre_fsm_fsalloc(const H5F_t *f)
+{
+    /* 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->eoa_pre_fsm_fsalloc)
+} /* end H5F_get_eoa_pre_fsm_fsalloc() */
+
diff --git a/src/H5Fsfile.c b/src/H5Fsfile.c
index 4fb9cd9..e0c830b 100644
--- a/src/H5Fsfile.c
+++ b/src/H5Fsfile.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Fmodule.h"          /* This source code file is part of the H5F module */
diff --git a/src/H5Fspace.c b/src/H5Fspace.c
new file mode 100644
index 0000000..0962f69
--- /dev/null
+++ b/src/H5Fspace.c
@@ -0,0 +1,224 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Fspace.c
+ *			Dec 30 2013
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Space allocation routines for the file.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* 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 "H5FDprivate.h"	/* File drivers				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_alloc
+ *
+ * Purpose:     Wrapper for H5FD_alloc, to make certain EOA changes are
+ *		reflected in superblock.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:      Success:    The format address of the new file memory.
+ *              Failure:    The undefined address HADDR_UNDEF
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, December 30, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+haddr_t
+H5F_alloc(H5F_t *f, hid_t dxpl_id, H5F_mem_t type, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size)
+{
+    haddr_t     ret_value = 0;          /* Return value */
+
+    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Check whether the file can use temporary addresses */
+    if(f->shared->use_tmp_space) {
+        haddr_t	eoa;            /* Current EOA for the file */
+
+        /* Get the EOA for the file */
+        if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, type)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, HADDR_UNDEF, "Unable to get eoa")
+
+        /* Check for overlapping into file's temporary allocation space */
+        if(H5F_addr_gt((eoa + size), f->shared->tmp_addr))
+            HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
+    } /* end if */
+
+    /* Call the file driver 'alloc' routine */
+    ret_value = H5FD_alloc(f->shared->lf, dxpl_id, type, f, size, frag_addr, frag_size);
+    if(!H5F_addr_defined(ret_value))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, HADDR_UNDEF, "file driver 'alloc' request failed")
+
+    /* Mark EOA dirty */
+    if(H5F_eoa_dirty(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, HADDR_UNDEF, "unable to mark EOA as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_free
+ *
+ * Purpose:     Wrapper for H5FD_free, to make certain EOA changes are
+ *		reflected in superblock.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, December 30, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr, hsize_t size)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(size > 0);
+
+    /* Call the file driver 'free' routine */
+    if(H5FD_free(f->shared->lf, dxpl_id, type, f, addr, size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "file driver 'free' request failed")
+
+    /* Mark EOA dirty */
+    if(H5F_eoa_dirty(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark EOA as dirty")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_try_extend
+ *
+ * Purpose:	Extend a block at the end of the file, if possible.
+ *
+ * Note:	When the metadata cache routines are updated to allow
+ *		marking an entry dirty without a H5F_t*, this routine should
+ *		be changed to take a H5F_super_t* directly.
+ *
+ * Return:	Success:	TRUE(1)  - Block was extended
+ *                              FALSE(0) - Block could not be extended
+ * 		Failure:	FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, 30 December, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5F_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, haddr_t blk_end, hsize_t extra_requested)
+{
+    htri_t ret_value = FALSE;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
+    HDassert(extra_requested > 0);
+
+    /* Extend the object by extending the underlying file */
+    if((ret_value = H5FD_try_extend(f->shared->lf, type, f, dxpl_id, blk_end, extra_requested)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTEXTEND, FAIL, "driver try extend request failed")
+
+    /* H5FD_try_extend() updates driver message and marks the superblock
+     * dirty, so no need to do it again here.
+     */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_try_extend() */
+
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index a11648a..7c70a64 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -29,6 +27,7 @@
 #include "H5Fpkg.h"             /* File access                          */
 #include "H5FDprivate.h"	/* File drivers                         */
 #include "H5Iprivate.h"		/* IDs                                  */
+#include "H5MFprivate.h"        /* File memory management               */
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"		/* Property lists                       */
 #include "H5SMprivate.h"        /* Shared Object Header Messages        */
@@ -53,6 +52,7 @@
 /* Local Prototypes */
 /********************/
 static herr_t H5F_super_ext_create(H5F_t *f, hid_t dxpl_id, H5O_loc_t *ext_ptr);
+static herr_t H5F__update_super_ext_driver_msg(H5F_t *f, hid_t dxpl_id);
 
 
 /*********************/
@@ -208,7 +208,7 @@ H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
 
     /* Twiddle the number of open objects to avoid closing the file. */
     f->nopen_objs++;
-    if(H5O_close(ext_ptr) < 0)
+    if(H5O_close(ext_ptr, NULL) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close superblock extension")
     f->nopen_objs--;
 
@@ -222,6 +222,86 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5F__update_super_ext_driver_msg
+ *
+ * Purpose:	Update the superblock extension file driver info message if 
+ *		we are using a V 2 superblock.  Observe that the function
+ *		is a NO-OP if the file driver info message does not exist.
+ *              This is necessary, as the function is called whenever the 
+ *		EOA is updated, and were it to create the file driver info
+ *		message, it would find itself in an infinite recursion.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              11/10/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__update_super_ext_driver_msg(H5F_t *f, hid_t dxpl_id)
+{
+    H5F_super_t *sblock;        /* Pointer to the super block */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    sblock = f->shared->sblock;
+    HDassert(sblock);
+    HDassert(sblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sblock->cache_info.type == H5AC_SUPERBLOCK);
+
+    /* Update the driver information message in the superblock extension
+     * if appropriate.
+     */
+    if(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2) {
+        if(H5F_addr_defined(sblock->ext_addr)) {
+            /* Check for ignoring the driver info for this file */
+            if(!H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
+                size_t     driver_size;    /* Size of driver info block (bytes)*/
+
+                /* Check for driver info */
+                H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+
+		/* Nothing to do unless there is both driver info and 
+                 * the driver info superblock extension message has 
+                 * already been created.
+                 */
+                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")
+
+                    /* Write the message to the superblock extension.
+                     *
+                     * Note that the superblock extension and the 
+                     * file driver info message must already exist.
+                     */
+                    drvinfo.len = driver_size;
+                    drvinfo.buf = dbuf;
+                    if(H5F_super_ext_write_msg(f, dxpl_id, H5O_DRVINFO_ID, &drvinfo, FALSE, H5O_MSG_NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "unable to update driver info header message")
+                } /* end if driver_size > 0 */
+            } /* end if !H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO) */
+        } /* end if superblock extension exists */
+    } /* end if sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2 */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__update_super_ext_driver_msg() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5F__super_read
  *
  * Purpose:     Reads the superblock from the file or from the BUF. If
@@ -239,13 +319,14 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
+H5F__super_read(H5F_t *f, hid_t meta_dxpl_id, hid_t raw_dxpl_id, hbool_t initial_read)
 {
     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  */
+    H5FD_io_info_t      fdio_info;          /* File driver I/O info */
     unsigned            sblock_flags = H5AC__NO_FLAGS_SET;       /* flags used in superblock unprotect call      */
     haddr_t             super_addr;         /* Absolute address of superblock */
     haddr_t             eof;                /* End of file address */
@@ -253,7 +334,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
     hbool_t 		skip_eof_check = FALSE; /* Whether to skip checking the EOF value */
     herr_t              ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_PACKAGE_TAG(dxpl_id, H5AC__SUPERBLOCK_TAG, FAIL)
+    FUNC_ENTER_PACKAGE_TAG(meta_dxpl_id, H5AC__SUPERBLOCK_TAG, FAIL)
 
     /* initialize the drvinfo to NULL -- we will overwrite this if there
      * is a driver information block 
@@ -261,13 +342,19 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
     f->shared->drvinfo = NULL;
 
     /* Get the DXPL plist object for DXPL ID */
-    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(meta_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");
 
+    /* Set up file driver I/O info */
+    fdio_info.file = f->shared->lf;
+    fdio_info.meta_dxpl = dxpl;
+    if(NULL == (fdio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(raw_dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
     /* Find the superblock */
-    if(H5FD_locate_signature(f->shared->lf, dxpl, &super_addr) < 0)
+    if(H5FD_locate_signature(&fdio_info, &super_addr) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to locate file signature")
     if(HADDR_UNDEF == super_addr)
         HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "file signature not found")
@@ -315,7 +402,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
         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, &udata, rw_flags)))
+    if(NULL == (sblock = (H5F_super_t *)H5AC_protect(f, meta_dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, &udata, rw_flags)))
         HGOTO_ERROR(H5E_FILE, H5E_CANTPROTECT, FAIL, "unable to load superblock")
 
     if(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE)
@@ -410,7 +497,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
      * individually.
      */
     /* Can skip this test when it is not the initial file open--
-     * H5F_super_read() call from H5F_evict_tagged_metadata() for
+     * 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
@@ -436,7 +523,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
     } /* 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")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to determine file size")
 
         /* (Account for the stored EOA being absolute offset -QAK) */
         if((eof + sblock->base_addr) < udata.stored_eof)
@@ -472,21 +559,17 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
          * 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")
+            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)))
+        if(NULL == (drvinfo = (H5O_drvinfo_t *)H5AC_protect(f, meta_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) ) ) {
-
+        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.
@@ -494,7 +577,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
         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)
+        if(H5AC_unprotect(f, meta_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 */
@@ -502,7 +585,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
     } /* 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)
+    if(H5F__set_eoa(f, H5FD_MEM_DEFAULT, 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 */
@@ -535,14 +618,14 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
             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)
+        if((status = H5O_msg_exists(&ext_loc, H5O_DRVINFO_ID, meta_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))
+                if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, meta_dxpl_id))
                     HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "driver info message not present")
 
                 /* Validate and decode driver information */
@@ -553,19 +636,22 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
 
                 /* Reset driver info message */
                 H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo);
+
+		HDassert(FALSE == f->shared->drvinfo_sb_msg_exists);
+		f->shared->drvinfo_sb_msg_exists = TRUE;
             } /* 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)
+        if(H5SM_get_info(&ext_loc, c_plist, meta_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)
+        if((status = H5O_msg_exists(&ext_loc, H5O_BTREEK_ID, meta_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))
+            if(NULL == H5O_msg_read(&ext_loc, H5O_BTREEK_ID, &btreek, meta_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 */
@@ -581,39 +667,133 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
         } /* 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)
+        if((status = H5O_msg_exists(&ext_loc, H5O_FSINFO_ID, meta_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 */
+            H5O_fsinfo_t fsinfo;   /* File space info message from superblock extension */
+            uint8_t flags;          /* Message flags */
 
-            /* 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")
+            /* Get message flags */
+            if(H5O_msg_get_flags(&ext_loc, H5O_FSINFO_ID, meta_dxpl_id, &flags) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to message flags for free-space manager info message")
 
-            /* Check for non-default info */
-	    if(f->shared->fs_strategy != fsinfo.strategy) {
-		f->shared->fs_strategy = fsinfo.strategy;
+            /* If message is NOT marked "unknown"--set up file space info  */
+            if(!(flags & H5O_MSG_FLAG_WAS_UNKNOWN)) {
 
-		/* 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;
+                /* Retrieve the 'file space info' structure */
+                if(NULL == H5O_msg_read(&ext_loc, H5O_FSINFO_ID, &fsinfo, meta_dxpl_id))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get free-space manager info message")
 
-		/* 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 */
+                /* Update changed values */
+                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_persist != fsinfo.persist) {
+                    f->shared->fs_persist = fsinfo.persist;
+
+                    /* Set non-default strategy in the property list */
+                    if(H5P_set(c_plist, H5F_CRT_FREE_SPACE_PERSIST_NAME, &fsinfo.persist) < 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 */
+
+                HDassert(f->shared->fs_page_size >= H5F_FILE_SPACE_PAGE_SIZE_MIN);
+                HDassert(fsinfo.page_size >= H5F_FILE_SPACE_PAGE_SIZE_MIN);
+                if(f->shared->fs_page_size != fsinfo.page_size) {
+                    f->shared->fs_page_size = fsinfo.page_size;
+
+                    /* Set file space page size in the property list */
+                    if(H5P_set(c_plist, H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME, &fsinfo.page_size) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set file space page size")
+                } /* end if */
+                if(f->shared->pgend_meta_thres != fsinfo.pgend_meta_thres)
+                    /* Initialize page end meta threshold */
+                    f->shared->pgend_meta_thres = fsinfo.pgend_meta_thres;
+
+                if(f->shared->eoa_pre_fsm_fsalloc != fsinfo.eoa_pre_fsm_fsalloc)
+                    f->shared->eoa_pre_fsm_fsalloc = fsinfo.eoa_pre_fsm_fsalloc;
+
+                /* f->shared->eoa_pre_fsm_fsalloc must always be HADDR_UNDEF
+                 * in the absence of persistant free space managers.
+                 */
+                HDassert((!f->shared->fs_persist) || (f->shared->eoa_pre_fsm_fsalloc != HADDR_UNDEF));
+                HDassert(!f->shared->first_alloc_dealloc);
+
+                if((f->shared->eoa_pre_fsm_fsalloc != HADDR_UNDEF) &&
+                   (H5F_INTENT(f) & H5F_ACC_RDWR))
+                    f->shared->first_alloc_dealloc = TRUE;
+
+                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];
+
+                if(fsinfo.mapped && (rw_flags & H5AC__READ_ONLY_FLAG) == 0) {
+
+                    /* Do the same kluge until we know for sure.  VC */
+#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_remove_msg(f, meta_dxpl_id, H5O_FSINFO_ID) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTDELETE, FAIL,  "error in removing message from superblock extension")
+
+                    if(H5F_super_ext_write_msg(f, meta_dxpl_id, H5O_FSINFO_ID, &fsinfo, TRUE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "error in writing fsinfo 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 not marked "unknown" */
+        } /* end if */
+
+	/* Check for the extension having a 'metadata cache image' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_MDCI_MSG_ID, meta_dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_EXISTS, FAIL, "unable to read object header")
+        if(status) {
+            hbool_t 	rw = ((rw_flags & H5AC__READ_ONLY_FLAG) == 0);
+	    H5O_mdci_t  mdci_msg;
+
+	    /* if the metadata cache image superblock extension message exists,
+             * read its contents and pass the data on to the metadata cache.
+             * Given this data, the cache will load and decode the metadata
+ 	     * cache image block, decoded it and load its contents into the 
+	     * the cache on the test protect call.  
+             *
+             * Further, if the file is opened R/W, the metadata cache will 
+	     * delete the metadata cache image superblock extension and free
+	     * the cache image block.  Don't do this now as f->shared 
+	     * is not fully setup, which complicates matters.
+             */
+
+            /* Retrieve the 'metadata cache image message' structure */
+	    if(NULL == H5O_msg_read(&ext_loc, H5O_MDCI_MSG_ID, &mdci_msg, meta_dxpl_id))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get metadata cache image message")
 
-	    /* 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];
+            /* Indicate to the cache that there's an image to load on first protect call */
+            if(H5AC_load_cache_image_on_next_protect(f, mdci_msg.addr, mdci_msg.size, rw) < 0)
+		HGOTO_ERROR(H5E_FILE, H5E_CANTLOAD, FAIL, "call to H5AC_load_cache_image_on_next_protect failed");
         } /* end if */
 
         /* Close superblock extension */
-        if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
+        if(H5F_super_ext_close(f, &ext_loc, meta_dxpl_id, FALSE) < 0)
 	    HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
     } /* end if */
 
@@ -657,8 +837,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
 		HDassert(f->shared->sblock == NULL);
 		f->shared->sblock = sblock;
 #endif /* JRM */
-
-		if(H5F_super_ext_write_msg(f, dxpl_id, H5O_DRVINFO_ID, &drvinfo, FALSE) < 0)
+		if(H5F_super_ext_write_msg(f, meta_dxpl_id, H5O_DRVINFO_ID, &drvinfo, FALSE, H5O_MSG_NO_FLAGS_SET) < 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 */
@@ -670,7 +849,7 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
         /* 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)
+            if(H5F_super_ext_remove_msg(f, meta_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 */
@@ -682,13 +861,17 @@ H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
     /* Set the pointer to the pinned superblock */
     f->shared->sblock = sblock;
 
+    /* Set the page aggregation mode */
+    if(H5F__set_paged_aggr(f, (hbool_t)H5F_PAGED_AGGR(f)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "failed to set paged_aggr status for file driver")
+
 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)
+    if(sblock && H5AC_unprotect(f, meta_dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, sblock_flags) < 0)
         HDONE_ERROR(H5E_FILE, H5E_CANTUNPROTECT, FAIL, "unable to close superblock")
 
     /* If we have failed, make sure no entries are left in the 
@@ -701,7 +884,7 @@ done:
                 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)
+            if(H5AC_expunge_entry(f, meta_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 */
 
@@ -712,7 +895,7 @@ done:
                 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)
+            if(H5AC_expunge_entry(f, meta_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 */
@@ -754,6 +937,7 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
     H5O_loc_t       ext_loc;            /* Superblock extension object location */
     hbool_t         need_ext;           /* Whether the superblock extension is needed */
     hbool_t         ext_created = FALSE; /* Whether the extension has been created */
+    hbool_t         non_default_fs_settings = FALSE;    /* Whether the file has non-default free-space settings */
     herr_t          ret_value = SUCCEED; /* Return Value                              */
 
     FUNC_ENTER_PACKAGE_TAG(dxpl_id, H5AC__SUPERBLOCK_TAG, FAIL)
@@ -780,17 +964,27 @@ 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")
 
+    /* Check for non-default free-space settings */
+    if(!(f->shared->fs_strategy == H5F_FILE_SPACE_STRATEGY_DEF &&
+            f->shared->fs_persist == H5F_FREE_SPACE_PERSIST_DEF &&
+            f->shared->fs_threshold == H5F_FREE_SPACE_THRESHOLD_DEF &&
+	    f->shared->fs_page_size == H5F_FILE_SPACE_PAGE_SIZE_DEF))
+        non_default_fs_settings = TRUE;
+
     /* 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
+    /* 
+     *	Bump superblock version to create superblock extension for:
+     * 	-- non-default file space strategy or 
+     * 	-- non-default persisting free-space or 
+     *  -- non-default free-space threshold or
+     *  -- non-default page_size
      */
-    else if(f->shared->fs_strategy != H5F_FILE_SPACE_STRATEGY_DEF ||
-            f->shared->fs_threshold != H5F_FREE_SPACE_THRESHOLD_DEF)
+    else if(non_default_fs_settings)
         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
@@ -809,6 +1003,9 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set superblock version")
     } /* end if */
 
+    if(H5FD_set_paged_aggr(f->shared->lf, (hbool_t)H5F_PAGED_AGGR(f)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "failed to set paged_aggr status for file driver")
+
     /*
      * The superblock starts immediately after the user-defined
      * header, which we have already insured is a proper size. The
@@ -820,9 +1017,12 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
 
     /* Sanity check the userblock size vs. the file's allocation alignment */
     if(userblock_size > 0) {
-        if(userblock_size < f->shared->alignment)
+	/* Set up the alignment to use for page or aggr fs */
+	hsize_t alignment = H5F_PAGED_AGGR(f) ? f->shared->fs_page_size : f->shared->alignment;
+
+        if(userblock_size < alignment)
             HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "userblock size must be > file object alignment")
-        if(0 != (userblock_size % f->shared->alignment))
+        if(0 != (userblock_size % alignment))
             HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "userblock size must be an integral multiple of file object alignment")
     } /* end if */
 
@@ -849,8 +1049,18 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
 
     /* Compute the size of the driver information block */
     H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+
+    /* The following code sets driver_size to the valued needed 
+     * for the driver info block, and sets the driver info block
+     * address regardless of the version of the superblock.
+     */
     if(driver_size > 0) {
-        driver_size += H5F_DRVINFOBLOCK_HDR_SIZE;
+        /* Add in the driver info header, for older superblocks */
+        /* Superblock versions >= 2 will put the driver info in a message
+         *      and don't need the header -QAK, 1/4/2017
+         */
+        if(super_vers < HDF5_SUPERBLOCK_VERSION_2)
+            driver_size += H5F_DRVINFOBLOCK_HDR_SIZE;
 
         /*
          * The file driver information block begins immediately after the
@@ -868,10 +1078,6 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
     if(super_vers < HDF5_SUPERBLOCK_VERSION_2)
         superblock_size += driver_size;
 
-    /* Reserve space in the file for the superblock, instead of allocating it */
-    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")
@@ -884,6 +1090,10 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
     /* Keep a copy of the superblock info */
     f->shared->sblock = sblock;
 
+    /* Allocate space for the superblock */
+    if(HADDR_UNDEF == H5MF_alloc(f, H5FD_MEM_SUPER, dxpl_id, superblock_size))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for superblock")
+
     /* set the drvinfo filed to NULL -- will overwrite this later if needed */
     f->shared->drvinfo = NULL;
 
@@ -897,8 +1107,7 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
         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) {
+    else if(non_default_fs_settings) {
         HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
         need_ext = TRUE;
     } /* end if */
@@ -981,21 +1190,29 @@ H5F__super_init(H5F_t *f, hid_t dxpl_id)
             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")
+
+            HDassert(FALSE == f->shared->drvinfo_sb_msg_exists);
+            f->shared->drvinfo_sb_msg_exists = TRUE;
         } /* 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 */
+        /* Check for non-default free-space info settings */
+        if(non_default_fs_settings) {
+            H5F_mem_page_t ptype;
+            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.persist = f->shared->fs_persist;
+            fsinfo.threshold = f->shared->fs_threshold;
+            fsinfo.page_size = f->shared->fs_page_size;
+            fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
+            fsinfo.eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+            fsinfo.mapped = FALSE;
 
-	    /* 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;
+            for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+                fsinfo.fs_addr[ptype - 1] = HADDR_UNDEF;
 
-	    if(H5O_msg_create(&ext_loc, H5O_FSINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &fsinfo, dxpl_id) < 0)
+            if(H5O_msg_create(&ext_loc, H5O_FSINFO_ID, H5O_MSG_FLAG_DONTSHARE | H5O_MSG_FLAG_MARK_IF_UNKNOWN, 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 */
@@ -1082,20 +1299,20 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_super_dirty
+ * Function:    H5F_eoa_dirty
  *
- * Purpose:     Mark the file's superblock dirty
+ * Purpose:     Mark the file's EOA info dirty
  *
  * Return:      Success:        non-negative on success
  *              Failure:        Negative
  *
  * Programmer:  Quincey Koziol
- *              August 14, 2009
+ *              January 4, 2017
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_dirty(H5F_t *f)
+H5F_eoa_dirty(H5F_t *f, hid_t dxpl_id)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -1107,16 +1324,56 @@ H5F_super_dirty(H5F_t *f)
     HDassert(f->shared->sblock);
 
     /* Mark superblock dirty in cache, so change to EOA will get encoded */
-    if(H5AC_mark_entry_dirty(f->shared->sblock) < 0)
+    if(H5F_super_dirty(f) < 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 
+    /* 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(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")
+    } /* end if */
+    /* If the driver info is stored as a message, update that instead */
+    else if(f->shared->drvinfo_sb_msg_exists) {
+        if(H5F__update_super_ext_driver_msg(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark drvinfo message as dirty")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_eoa_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_dirty
+ *
+ * Purpose:     Mark the file's superblock dirty
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              August 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_dirty(H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->sblock);
+
+    /* Mark superblock dirty in cache, so change to EOA will get encoded */
+    if(H5AC_mark_entry_dirty(f->shared->sblock) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1233,7 +1490,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, unsigned id, void *mesg, hbool_t may_create)
+H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, unsigned id, void *mesg,
+    hbool_t may_create, unsigned mesg_flags)
 {
     H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
     H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
@@ -1278,7 +1536,7 @@ H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, unsigned id, void *mesg, hbool_
 	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "Message should not exist")
 
 	/* Create the message with ID in the superblock extension */
-	if(H5O_msg_create(&ext_loc, id, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
+	if(H5O_msg_create(&ext_loc, id, (mesg_flags | H5O_MSG_FLAG_DONTSHARE), H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
 	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to create the message in object header")
     } /* end if */
     else {
@@ -1286,7 +1544,7 @@ H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, unsigned id, void *mesg, hbool_
 	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "Message should exist")
 
 	/* Update the message with ID in the superblock extension */
-	if(H5O_msg_write(&ext_loc, id, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
+	if(H5O_msg_write(&ext_loc, id, (mesg_flags | H5O_MSG_FLAG_DONTSHARE), H5O_UPDATE_TIME, mesg, dxpl_id) < 0)
 	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to write the message in object header")
     } /* end else */
 
diff --git a/src/H5Fsuper_cache.c b/src/H5Fsuper_cache.c
index e0b5df5..76866db 100644
--- a/src/H5Fsuper_cache.c
+++ b/src/H5Fsuper_cache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -67,35 +65,35 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-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 herr_t H5F__cache_superblock_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5F__cache_superblock_get_final_load_size(const void *image_ptr,
+    size_t image_len, void *udata, size_t *actual_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5F__cache_drvrinfo_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5F__cache_drvrinfo_get_final_load_size(const void *image_ptr,
+    size_t image_len, void *udata, size_t *actual_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
 
+/* Local encode/decode routines */
+static herr_t H5F__superblock_prefix_decode(H5F_super_t *sblock,
+    const uint8_t **image_ref, const H5F_superblock_cache_ud_t *udata,
+    hbool_t extend_eoa);
+static herr_t H5F__drvrinfo_prefix_decode(H5O_drvinfo_t *drvinfo, char *drv_name,
+    const uint8_t **image_ref, H5F_drvrinfo_cache_ud_t *udata,
+    hbool_t extend_eoa);
+
 
 /*********************/
 /* Package Variables */
@@ -107,15 +105,15 @@ const H5AC_class_t H5AC_SUPERBLOCK[1] = {{
     "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_get_initial_load_size,/* 'get_initial_load_size' callback */
+    H5F__cache_superblock_get_final_load_size, /* 'get_final_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 */
+    NULL,                               /* '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 */
 }};
 
@@ -125,7 +123,8 @@ const H5AC_class_t H5AC_DRVRINFO[1] = {{
     "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 */
+    H5F__cache_drvrinfo_get_initial_load_size,  /* 'get_initial_load_size' callback */
+    H5F__cache_drvrinfo_get_final_load_size, /* 'get_final_load_size' callback */
     NULL,				/* 'verify_chksum' callback */
     H5F__cache_drvrinfo_deserialize,    /* 'deserialize' callback */
     H5F__cache_drvrinfo_image_len,      /* 'image_len' callback */
@@ -133,7 +132,6 @@ const H5AC_class_t H5AC_DRVRINFO[1] = {{
     H5F__cache_drvrinfo_serialize,      /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5F__cache_drvrinfo_free_icr,       /* 'free_icr' callback */
-    NULL,				/* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -153,101 +151,231 @@ H5FL_EXTERN(H5F_super_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F__cache_superblock_get_load_size
+ * Function:    H5F__superblock_prefix_decode
  *
- * Purpose:     Compute the size of the data structure on disk.
+ * Purpose:	Decode a superblock prefix
  *
  * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
- *              koziol at hdfgroup.org
- *              July 17, 2013
+ *              December 15, 2016
  *
  *-------------------------------------------------------------------------
  */
 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__superblock_prefix_decode(H5F_super_t *sblock, const uint8_t **image_ref,
+    const H5F_superblock_cache_ud_t *udata, hbool_t extend_eoa)
 {
-    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 */
+    const uint8_t *image = (const uint8_t *)*image_ref; /* Pointer into raw data buffer */
     htri_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(image_len);
+    HDassert(sblock);
+    HDassert(image_ref);
+    HDassert(image);
+    HDassert(udata);
+    HDassert(udata->f);
 
-    if(image == NULL) {
-	HDassert(actual_len == NULL);
+    /* Skip over signature (already checked when locating the superblock) */
+    image += H5F_SIGNATURE_LEN;
 
-	/* 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);
+    /* Superblock version */
+    sblock->super_vers = *image++;
+    if(sblock->super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad superblock version number")
 
-	image += H5F_SIGNATURE_LEN;
+    /* Sanity check */
+    HDassert(((size_t)(image - (const uint8_t *)*image_ref)) == H5F_SUPERBLOCK_FIXED_SIZE);
 
-	/* Superblock version */
-	super_vers = *image++;
-	if(super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
-	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad superblock version number")
+    /* Determine the size of addresses & size of offsets, for computing the
+     * variable-sized portion of the superblock.
+     */
+    if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+        sblock->sizeof_addr = image[4];
+        sblock->sizeof_size = image[5];
+    } /* end if */
+    else {
+        sblock->sizeof_addr = image[0];
+        sblock->sizeof_size = image[1];
+    } /* end else */
+    if(sblock->sizeof_addr != 2 && sblock->sizeof_addr != 4 &&
+            sblock->sizeof_addr != 8 && sblock->sizeof_addr != 16 && sblock->sizeof_addr != 32)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number in an address")
+    if(sblock->sizeof_size != 2 && sblock->sizeof_size != 4 &&
+            sblock->sizeof_size != 8 && sblock->sizeof_size != 16 && sblock->sizeof_size != 32)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number for object size")
+
+    /* Check for extending the EOA for the file */
+    if(extend_eoa) {
+        size_t variable_size;   /* Variable size of superblock */
+
+        /* Determine the size of the variable-length part of the superblock */
+        variable_size = (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(sblock->super_vers, sblock->sizeof_addr, sblock->sizeof_size);
+        HDassert(variable_size > 0);
+
+        /* Make certain we can read the variable-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")
+    } /* end if */
 
-	/* Save the version to be used in verify_chksum callback */
-	udata->super_vers = super_vers;
+    /* Update the image buffer pointer */
+    *image_ref = image;
 
-	/* Sanity check */
-	HDassert(((size_t)(image - (const uint8_t *)_image)) == H5F_SUPERBLOCK_FIXED_SIZE);
-	HDassert(*image_len >= H5F_SUPERBLOCK_FIXED_SIZE + 6);
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__superblock_prefix_decode() */
 
-	/* 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")
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__drvrinfo_prefix_decode
+ *
+ * Purpose:	Decode a driver info prefix
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              December 15, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__drvrinfo_prefix_decode(H5O_drvinfo_t *drvrinfo, char *drv_name,
+    const uint8_t **image_ref, H5F_drvrinfo_cache_ud_t *udata,
+    hbool_t extend_eoa)
+{
+    const uint8_t	*image = (const uint8_t *)*image_ref;   /* Pointer into raw data buffer */
+    unsigned            drv_vers;       /* Version of driver info block */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-	/* 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);
+    FUNC_ENTER_STATIC
 
-	/* Handle metadata cache retry for variable-sized portion of the superblock */
-	if(*image_len != (H5F_SUPERBLOCK_FIXED_SIZE + variable_size)) {
+    /* Sanity check */
+    HDassert(drvrinfo);
+    HDassert(image_ref);
+    HDassert(image);
+    HDassert(udata);
+    HDassert(udata->f);
 
-	    /* Sanity check */
-	    HDassert(*image_len == (H5F_SUPERBLOCK_FIXED_SIZE + H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE));
+    /* 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")
 
-	    /* 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")
+    image += 3; /* reserved bytes */
 
-	    *actual_len = H5F_SUPERBLOCK_FIXED_SIZE + variable_size;
+    /* Driver info size */
+    UINT32DECODE(image, drvrinfo->len);
 
-	} /* end if */
-    }
+    /* Driver name and/or version */
+    if(drv_name) { 
+        HDmemcpy(drv_name, (const char *)image, (size_t)8);
+        drv_name[8] = '\0';
+        image += 8; /* advance past name/version */
+    } /* end if */
+
+    /* Extend the EOA if required so that we can read the complete driver info block */
+    if(extend_eoa) {
+        haddr_t eoa;                /* Current EOA for the file */
+        haddr_t min_eoa;            /* Minimum EOA needed for reading the driver info */
+
+        /* Get current EOA... */
+        eoa = H5FD_get_eoa(udata->f->shared->lf, H5FD_MEM_SUPER);
+        if(!H5F_addr_defined(eoa))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+        /* ... if it is too small, extend it. */
+        min_eoa = udata->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drvrinfo->len;
+
+        /* If it grew, set it */
+        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")
+    } /* end if */
+
+    /* Update the image buffer pointer */
+    *image_ref = image;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__drvrinfo_prefix_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__cache_superblock_get_initial_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
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_superblock_get_initial_load_size(void H5_ATTR_UNUSED *_udata, size_t *image_len)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    /* Set the initial image length size */
+    *image_len = H5F_SUPERBLOCK_FIXED_SIZE +    /* Fixed size of superblock */
+                 H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F__cache_superblock_get_initial_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__cache_superblock_get_final_load_size
+ *
+ * Purpose:     Compute the final size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              November 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_superblock_get_final_load_size(const void *_image, size_t image_len,
+    void *_udata, size_t *actual_len)
+{
+    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 */
+    H5F_super_t sblock;                 /* Temporary file superblock */
+    htri_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
+    HDassert(image_len >= H5F_SUPERBLOCK_FIXED_SIZE + 6);
+
+    /* Deserialize the file superblock's prefix */
+    if(H5F__superblock_prefix_decode(&sblock, &image, udata, TRUE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, FAIL, "can't decode file superblock prefix")
+
+    /* Save the version to be used in verify_chksum callback */
+    udata->super_vers = sblock.super_vers;
+
+    /* Set the final size for the cache image */
+    *actual_len = H5F_SUPERBLOCK_FIXED_SIZE + 
+            (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(sblock.super_vers, sblock.sizeof_addr, sblock.sizeof_size);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F__cache_superblock_get_load_size() */
+} /* end H5F__cache_superblock_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -286,7 +414,7 @@ H5F__cache_superblock_verify_chksum(const void *_image, size_t len, void *_udata
 
 	if(stored_chksum != computed_chksum)
 	    ret_value = FALSE;
-    }
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F__cache_superblock_verify_chksum() */
@@ -313,10 +441,6 @@ H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
     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
@@ -325,53 +449,18 @@ H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
     HDassert(image);
     HDassert(udata);
     HDassert(udata->f);
+    HDassert(len >= H5F_SUPERBLOCK_FIXED_SIZE + 6);
 
     /* Allocate space for the superblock */
     if(NULL == (sblock = H5FL_CALLOC(H5F_super_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    image += H5F_SIGNATURE_LEN;
-
-    /* Superblock version */
-    super_vers = *image++;
-    if(super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
-        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad superblock version number")
-
-    /* Record the superblock version */
-    sblock->super_vers = super_vers;
-
-    /* Sanity check */
-    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, sizeof_addr, sizeof_size);
-    HDassert(variable_size > 0);
-
-    HDassert(len == (H5F_SUPERBLOCK_FIXED_SIZE + variable_size));
+    /* Deserialize the file superblock's prefix */
+    if(H5F__superblock_prefix_decode(sblock, &image, udata, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "can't decode file superblock prefix")
 
     /* Check for older version of superblock format */
-    if(super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+    if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
 	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 */
@@ -392,21 +481,13 @@ H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
 	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 size of file addresses (already decoded) */
+	image++;
+	udata->f->shared->sizeof_addr = sblock->sizeof_addr;  /* Keep a local copy also */
+
+	/* Skip over size of file sizes (already decoded) */
+	image++;
+	udata->f->shared->sizeof_size = sblock->sizeof_size;  /* Keep a local copy also */
 
 	/* Skip over reserved byte */
 	image++;
@@ -439,11 +520,11 @@ H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
          * 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) {
+        if(sblock->super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
 	    UINT16DECODE(image, chunk_btree_k);
 
 	    /* Reserved bytes are present only in version 1 */
-	    if(super_vers == HDF5_SUPERBLOCK_VERSION_1)
+	    if(sblock->super_vers == HDF5_SUPERBLOCK_VERSION_1)
 		image += 2;   /* reserved */
 	} /* end if */
 	else
@@ -485,21 +566,13 @@ H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
     else {
 	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 */
+        /* Skip over size of file addresses (already decoded) */
+        image++;
+	udata->f->shared->sizeof_addr = sblock->sizeof_addr;  /* Keep a local copy also */
+
+	/* Skip over size of file sizes (already decoded) */
+	image++;
+	udata->f->shared->sizeof_size = sblock->sizeof_size;  /* Keep a local copy also */
 
 	/* File status flags (not really used yet) */
 	sblock->status_flags = *image++;
@@ -555,7 +628,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5F__cache_superblock_image_len(const void *_thing, size_t *image_len)
 {
     const H5F_super_t *sblock = (const H5F_super_t *)_thing;    /* Pointer to the object */
 
@@ -566,134 +639,15 @@ H5F__cache_superblock_image_len(const void *_thing, size_t *image_len, hbool_t *
     HDassert(sblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
     HDassert(sblock->cache_info.type == H5AC_SUPERBLOCK);
     HDassert(image_len);
-    HDassert(compressed_ptr);
 
     /* Set the image length size */
     *image_len = (size_t)H5F_SUPERBLOCK_SIZE(sblock);
 
-    /* Set *compressed_ptr to FALSE unconditionally */
-    *compressed_ptr = FALSE;
-
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5F__cache_superblock_image_len() */
 
 

 /*-------------------------------------------------------------------------
- * 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 */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* 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 */
-
-            HDassert(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2);
-
-            /* 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 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 */
-                    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 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")
-                } /* 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.
@@ -873,9 +827,9 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F__cache_drvrinfo_get_load_size
+ * Function:    H5F__cache_drvrinfo_get_initial_load_size
  *
- * Purpose:     Compute the size of the data structure on disk.
+ * Purpose:     Compute the intiial size of the data structure on disk.
  *
  * Return:      Non-negative on success/Negative on failure
  *
@@ -886,73 +840,61 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5F__cache_drvrinfo_get_initial_load_size(void H5_ATTR_UNUSED *_udata, size_t *image_len)
 {
-    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_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
     /* 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 */
+    /* Set the initial image length size */
+    *image_len = H5F_DRVINFOBLOCK_HDR_SIZE;     /* Fixed size portion of driver info block */
 
-	/* Driver info size */
-	UINT32DECODE(image, drvinfo_len);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F__cache_drvrinfo_get_initial_load_size() */
 
-	/* 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);
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__cache_drvrinfo_get_final_load_size
+ *
+ * Purpose:     Compute the final size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              November 17, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_drvrinfo_get_final_load_size(const void *_image, size_t image_len,
+    void *_udata, size_t *actual_len)
+{
+    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 */
+    H5O_drvinfo_t drvrinfo;     /* Driver info */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-	    /* extend the eoa if required so that we can read the complete driver info block */
-	    {
-		haddr_t eoa;
-		haddr_t min_eoa;
+    FUNC_ENTER_STATIC
 
-		/* 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")
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
+    HDassert(image_len == H5F_DRVINFOBLOCK_HDR_SIZE);
 
-		/* ... if it is too small, extend it. */
-		min_eoa = udata->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo_len;
+    /* Deserialize the file driver info's prefix */
+    if(H5F__drvrinfo_prefix_decode(&drvrinfo, NULL, &image, udata, TRUE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, FAIL, "can't decode file driver info prefix")
 
-		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 */
+    /* Set the final size for the cache image */
+    *actual_len = H5F_DRVINFOBLOCK_HDR_SIZE + drvrinfo.len;
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F__cache_drvrinfo_get_load_size() */
+} /* end H5F__cache_drvrinfo_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -960,7 +902,7 @@ done:
  *
  * Purpose:	Loads an object from the disk.
  *
- * Return:	Success:	Pointer to a new B-tree.
+ * Return:	Success:	Pointer to a new driver info struct
  *		Failure:	NULL
  *
  * Programmer:	Quincey Koziol
@@ -977,7 +919,6 @@ H5F__cache_drvrinfo_deserialize(const void *_image, size_t len, void *_udata,
     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
@@ -992,21 +933,11 @@ H5F__cache_drvrinfo_deserialize(const void *_image, size_t len, void *_udata,
     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 */
+    /* Deserialize the file driver info's prefix */
+    if(H5F__drvrinfo_prefix_decode(drvinfo, drv_name, &image, udata, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "can't decode file driver info prefix")
 
+    /* Sanity check */
     HDassert(len == (H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo->len));
 
     /* Validate and decode driver information */
@@ -1042,8 +973,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5F__cache_drvrinfo_image_len(const void *_thing, size_t *image_len)
 {
     const H5O_drvinfo_t *drvinfo = (const H5O_drvinfo_t *)_thing;       /* Pointer to the object */
 
@@ -1054,11 +984,10 @@ H5F__cache_drvrinfo_image_len(const void *_thing, size_t *image_len,
     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 */
+            drvinfo->len);                              /* Variable-size portion of driver info block */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5F__cache_drvrinfo_image_len() */
diff --git a/src/H5Ftest.c b/src/H5Ftest.c
index 344d7c1..dd69b1e 100644
--- a/src/H5Ftest.c
+++ b/src/H5Ftest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -186,3 +184,37 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_get_maxaddr_test() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F_get_sbe_addr_test
+ *
+ * Purpose:     Retrieve the address of a superblock extension's object header
+ *		for a file
+ *
+ * Return:	Success:        Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *	        Jul 10, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_sbe_addr_test(hid_t file_id, haddr_t *sbe_addr)
+{
+    H5F_t	*file;                  /* File info */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Retrieve maxaddr for file */
+    *sbe_addr = file->shared->sblock->ext_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_get_sbe_addr_test() */
+
diff --git a/src/H5G.c b/src/H5G.c
index 5d920a4..10eb5ed 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -715,14 +713,14 @@ done:
 herr_t
 H5Gclose(hid_t group_id)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    herr_t  ret_value = SUCCEED;    /* Return value                     */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "i", group_id);
 
     /* Check args */
     if(NULL == H5I_object_verify(group_id,H5I_GROUP))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
 
     /*
      * Decrement the counter on the group atom.	 It will be freed if the count
diff --git a/src/H5Gbtree2.c b/src/H5Gbtree2.c
index ff7e200..71d15e5 100644
--- a/src/H5Gbtree2.c
+++ b/src/H5Gbtree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gcache.c b/src/H5Gcache.c
index ed1c4a3..65115a5 100644
--- a/src/H5Gcache.c
+++ b/src/H5Gcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -63,13 +61,10 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-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 herr_t H5G__cache_node_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
@@ -95,7 +90,8 @@ const H5AC_class_t H5AC_SNODE[1] = {{
     "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 */
+    H5G__cache_node_get_initial_load_size,      /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_load_size' callback */
     NULL,				/* 'verify_chksum' callback */
     H5G__cache_node_deserialize,        /* 'deserialize' callback */
     H5G__cache_node_image_len,          /* 'image_len' callback */
@@ -103,7 +99,6 @@ const H5AC_class_t H5AC_SNODE[1] = {{
     H5G__cache_node_serialize,          /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5G__cache_node_free_icr,           /* 'free_icr' callback */
-    NULL,			        /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -116,17 +111,11 @@ H5FL_SEQ_EXTERN(H5G_entry_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5G__cache_node_get_load_size()
+ * Function:    H5G__cache_node_get_initial_load_size()
  *
- * Purpose:	Determine the size of the on disk image of the node, and 
+ * Purpose:	Determine the size of the on-disk image of the node, and 
  *		return this value in *image_len.
  *
- *		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
  *
@@ -136,10 +125,8 @@ H5FL_SEQ_EXTERN(H5G_entry_t);
  *-------------------------------------------------------------------------
  */
 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__cache_node_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -148,18 +135,11 @@ H5G__cache_node_get_load_size(const void *_image, void *_udata, size_t *image_le
     HDassert(f);
     HDassert(image_len);
 
-    if(image == NULL) {
-	/* report image length */
-	*image_len = (size_t)(H5G_NODE_SIZE(f));
-    } else {
-        HDassert(actual_len);
-        HDassert(*image_len == *actual_len);
-    }
-
-    /* Nothing to do for non-NULL image : no need to compute actual_len */
+    /* Set the image length size */
+    *image_len = (size_t)(H5G_NODE_SIZE(f));
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5G__cache_node_get_load_size() */
+} /* end H5G__cache_node_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -253,8 +233,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5G__cache_node_image_len(const void *_thing, size_t *image_len)
 {
     const H5G_node_t *sym = (const H5G_node_t *)_thing; /* Pointer to object */
 
@@ -271,11 +250,6 @@ H5G__cache_node_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5G__cache_node_image_len() */
 
-
-/*************************************/
-/* no H5G__cache_node_pre_serialize() */
-/*************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5G__cache_node_serialize
@@ -335,11 +309,6 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G__cache_node_serialize() */
 
-
-/***************************************/
-/* no H5G__cache_node_notify() function */
-/***************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5G__cache_node_free_icr
diff --git a/src/H5Gcompact.c b/src/H5Gcompact.c
index 41ca4f5..d5698a8 100644
--- a/src/H5Gcompact.c
+++ b/src/H5Gcompact.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gdense.c b/src/H5Gdense.c
index e8fa237..4ae6800 100644
--- a/src/H5Gdense.c
+++ b/src/H5Gdense.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c
index a775c58..228fb9c 100644
--- a/src/H5Gdeprec.c
+++ b/src/H5Gdeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gent.c b/src/H5Gent.c
index 6020028..b781fae 100644
--- a/src/H5Gent.c
+++ b/src/H5Gent.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -460,7 +458,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_ONLY_FLAG)))
+                if(NULL == (oh = H5O_protect(&targ_oloc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
                     HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, FAIL, "unable to protect target object header")
 
                 /* Check if a symbol table message exists */
diff --git a/src/H5Gint.c b/src/H5Gint.c
index a165e3a..6d33716 100644
--- a/src/H5Gint.c
+++ b/src/H5Gint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -232,7 +230,7 @@ done:
         if(oloc_init) {
             if(H5O_dec_rc_by_loc(&(grp->oloc), dxpl_id) < 0)
                 HDONE_ERROR(H5E_SYM, H5E_CANTDEC, NULL, "unable to decrement refcount on newly created object")
-            if(H5O_close(&(grp->oloc)) < 0)
+            if(H5O_close(&(grp->oloc), NULL) < 0)
                 HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "unable to release object header")
             if(H5O_delete(file, dxpl_id, grp->oloc.addr) < 0)
                 HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, NULL, "unable to delete object header")
@@ -448,7 +446,7 @@ H5G_open_oid(H5G_t *grp, hid_t dxpl_id)
 done:
     if(ret_value < 0) {
         if(obj_opened)
-            H5O_close(&(grp->oloc));
+            H5O_close(&(grp->oloc), NULL);
         if(grp->shared)
             grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
     } /* end if */
@@ -472,8 +470,9 @@ done:
 herr_t
 H5G_close(H5G_t *grp)
 {
-    hbool_t	corked;			/* Whether the group is corked or not */
-    herr_t      ret_value = SUCCEED; 	/* Return value */
+    hbool_t	corked;			        /* Whether the group is corked or not   */
+    hbool_t file_closed = TRUE;     /* H5O_close also closed the file?      */
+    herr_t ret_value = SUCCEED;     /* Return value                         */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -486,21 +485,30 @@ 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 */
+        /* 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) {
+            HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
+        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")
-        }
+                HGOTO_ERROR(H5E_SYM, H5E_CANTUNCORK, 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")
         if(H5FO_delete(grp->oloc.file, H5AC_ind_read_dxpl_id, grp->oloc.addr) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't remove group from list of open objects")
-        if(H5O_close(&(grp->oloc)) < 0)
+        if(H5O_close(&(grp->oloc), &file_closed) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
+
+        /* Evict group metadata if evicting on close */
+        if(!file_closed && H5F_SHARED(grp->oloc.file) && H5F_EVICT_ON_CLOSE(grp->oloc.file)) {
+            if(H5AC_flush_tagged_metadata(grp->oloc.file, grp->oloc.addr, H5AC_ind_read_dxpl_id) < 0) 
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
+            if(H5AC_evict_tagged_metadata(grp->oloc.file, grp->oloc.addr, FALSE, H5AC_ind_read_dxpl_id) < 0) 
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to evict tagged metadata")
+        } /* end if */
+
+        /* Free memory */
         grp->shared = H5FL_FREE(H5G_shared_t, grp->shared);
     } else {
         /* Decrement the ref. count for this object in the top file */
@@ -509,7 +517,7 @@ H5G_close(H5G_t *grp)
 
         /* Check reference count for this object in the top file */
         if(H5FO_top_count(grp->oloc.file, grp->oloc.addr) == 0) {
-            if(H5O_close(&(grp->oloc)) < 0)
+            if(H5O_close(&(grp->oloc), NULL) < 0)
                 HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
         } /* end if */
         else
@@ -522,7 +530,7 @@ H5G_close(H5G_t *grp)
          */
         if(grp->shared->mounted && grp->shared->fo_count == 1) {
             /* Attempt to close down the file hierarchy */
-            if(H5F_try_close(grp->oloc.file) < 0)
+            if(H5F_try_close(grp->oloc.file, NULL) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
         } /* end if */
     } /* end else */
diff --git a/src/H5Glink.c b/src/H5Glink.c
index 5a195c8..d246ee7 100644
--- a/src/H5Glink.c
+++ b/src/H5Glink.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gloc.c b/src/H5Gloc.c
index 3fcbd09..c011cdf 100644
--- a/src/H5Gloc.c
+++ b/src/H5Gloc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gmodule.h b/src/H5Gmodule.h
index 52ac067..19ea982 100644
--- a/src/H5Gmodule.h
+++ b/src/H5Gmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Gname.c b/src/H5Gname.c
index aff9d31..7b53668 100644
--- a/src/H5Gname.c
+++ b/src/H5Gname.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 4d299dc..20924ee 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -715,7 +713,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr,
 		md_key->offset = ent.name_off;
 	} /* end if */
         else {
-	    idx -= H5F_SYM_LEAF_K(f);
+	    idx -= (int)H5F_SYM_LEAF_K(f);
 	    insert_into = snrt;
 	    if(idx == (int)H5F_SYM_LEAF_K(f)) {
 		rt_key->offset = ent.name_off;
diff --git a/src/H5Gobj.c b/src/H5Gobj.c
index 92ad0af..d2dc83b 100644
--- a/src/H5Gobj.c
+++ b/src/H5Gobj.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Goh.c b/src/H5Goh.c
index bde540c..977fc2d 100644
--- a/src/H5Goh.c
+++ b/src/H5Goh.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h
index 4cb6f9b..76bf08b 100644
--- a/src/H5Gpkg.h
+++ b/src/H5Gpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -55,7 +53,7 @@
     + 2         /* Number of symbols */                                       \
                                                                               \
     /* Entries */                                                             \
-    + ((2 * H5F_SYM_LEAF_K(f)) * H5G_SIZEOF_ENTRY_FILE(f))                    \
+    + ((2 * H5F_SYM_LEAF_K(f)) * (unsigned)H5G_SIZEOF_ENTRY_FILE(f))                    \
     )
 
 
@@ -312,9 +310,6 @@ typedef struct H5G_copy_file_ud_t {
  */
 H5_DLLVAR H5B_class_t H5B_SNODE[1];
 
-/* The cache subclass */
-H5_DLLVAR const H5AC_class_t H5AC_SNODE[1];
-
 /* The v2 B-tree class for indexing 'name' field on links */
 H5_DLLVAR const H5B2_class_t H5G_BT2_NAME[1];
 
diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h
index 2ef99fd..c48e687 100644
--- a/src/H5Gprivate.h
+++ b/src/H5Gprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h
index 9d8ade5..ab6f200 100644
--- a/src/H5Gpublic.h
+++ b/src/H5Gpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Groot.c b/src/H5Groot.c
index ba25f31..fbc4f1a 100644
--- a/src/H5Groot.c
+++ b/src/H5Groot.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Gstab.c b/src/H5Gstab.c
index 27fa67a..a239cfe 100644
--- a/src/H5Gstab.c
+++ b/src/H5Gstab.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer: Robb Matzke <matzke at llnl.gov>
@@ -152,11 +150,11 @@ 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(FAIL == H5B_create(f, dxpl_id, H5B_SNODE, NULL, &(stab->btree_addr)/*out*/))
+    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")
 
     /* Create symbol table private heap */
-    if(FAIL == H5HL_create(f, dxpl_id, size_hint, &(stab->heap_addr)/*out*/))
+    if(H5HL_create(f, dxpl_id, size_hint, &(stab->heap_addr)/*out*/) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create heap")
 
     /* Pin the heap down in memory */
diff --git a/src/H5Gtest.c b/src/H5Gtest.c
index d69a804..7271cdc 100644
--- a/src/H5Gtest.c
+++ b/src/H5Gtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -701,7 +699,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_ONLY_FLAG)))
+        if(NULL == (targ_oh = H5O_protect(&targ_oloc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
             HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to protect target object header")
 
         /* Check if a symbol table message exists */
diff --git a/src/H5Gtraverse.c b/src/H5Gtraverse.c
index 4d84e9f..ff1206e 100644
--- a/src/H5Gtraverse.c
+++ b/src/H5Gtraverse.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -727,7 +725,7 @@ H5G_traverse_real(const H5G_loc_t *_loc, const char *name, unsigned target,
                     HGOTO_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
 
                 /* Close new group */
-                if(H5O_close(obj_loc.oloc) < 0)
+                if(H5O_close(obj_loc.oloc, NULL) < 0)
                     HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close")
 
                 /* If the parent group was holding the file open, the
diff --git a/src/H5HF.c b/src/H5HF.c
index 3a6d4ea..6c09969 100644
--- a/src/H5HF.c
+++ b/src/H5HF.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -952,90 +950,3 @@ 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 d4a30b8..2d35368 100644
--- a/src/H5HFbtree2.c
+++ b/src/H5HFbtree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFcache.c b/src/H5HFcache.c
index b14b7fc..f957e2e 100644
--- a/src/H5HFcache.c
+++ b/src/H5HFcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -69,72 +67,64 @@
 /********************/
 
 /* Local encode/decode routines */
+static herr_t H5HF__hdr_prefix_decode(H5HF_hdr_t *hdr, const uint8_t **image_ref);
 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 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 herr_t H5HF__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5HF__cache_hdr_get_final_load_size(const void *image_ptr,
+    size_t image_len, void *udata, size_t *actual_len);
 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, 
+static herr_t H5HF__cache_hdr_image_len(const void *thing, size_t *image_len);
+static herr_t H5HF__cache_hdr_pre_serialize(H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_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 herr_t H5HF__cache_iblock_get_initial_load_size(void *udata, size_t *image_len);
 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, 
+static herr_t H5HF__cache_iblock_image_len(const void *thing, size_t *image_len);
+static herr_t H5HF__cache_iblock_pre_serialize(H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_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_notify(H5AC_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 herr_t H5HF__cache_dblock_get_initial_load_size(void *udata, size_t *image_len);
 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, 
+static herr_t H5HF__cache_dblock_image_len(const void *thing, size_t *image_len);
+static herr_t H5HF__cache_dblock_pre_serialize(H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_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_notify(H5AC_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);
+    H5HF_hdr_t *hdr, hbool_t *fd_clean, hbool_t *clean);
+static herr_t H5HF__cache_verify_iblock_descendants_clean(H5F_t *f, 
+    hid_t dxpl_id, haddr_t fd_parent_addr, H5HF_indirect_t *iblock, 
+    unsigned *iblock_status, hbool_t *fd_clean, hbool_t *clean);
+static herr_t H5HF__cache_verify_iblocks_dblocks_clean(H5F_t *f, 
+    haddr_t fd_parent_addr, H5HF_indirect_t *iblock, hbool_t *fd_clean, 
+    hbool_t *clean, hbool_t *has_dblocks);
+static herr_t H5HF__cache_verify_descendant_iblocks_clean(H5F_t *f, 
+    hid_t dxpl_id, haddr_t fd_parent_addr, H5HF_indirect_t *iblock, 
+    hbool_t *fd_clean, hbool_t *clean, hbool_t *has_iblocks);
 #endif /* NDEBUG */
 
 
@@ -148,7 +138,8 @@ const H5AC_class_t H5AC_FHEAP_HDR[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    H5HF__cache_hdr_get_final_load_size, /* 'get_final_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 */
@@ -156,7 +147,6 @@ const H5AC_class_t H5AC_FHEAP_HDR[1] = {{
     H5HF__cache_hdr_serialize,          /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5HF__cache_hdr_free_icr,           /* 'free_icr' callback */
-    NULL,                               /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -166,7 +156,8 @@ const H5AC_class_t H5AC_FHEAP_IBLOCK[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -174,7 +165,6 @@ const H5AC_class_t H5AC_FHEAP_IBLOCK[1] = {{
     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 */
 }};
 
@@ -183,8 +173,9 @@ const H5AC_class_t H5AC_FHEAP_DBLOCK[1] = {{
     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 */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5HF__cache_dblock_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -192,7 +183,6 @@ const H5AC_class_t H5AC_FHEAP_DBLOCK[1] = {{
     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 */
 }};
 
@@ -212,6 +202,52 @@ H5FL_BLK_DEFINE(direct_block);
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5HF__hdr_prefix_decode()
+ *
+ * Purpose:	Decode a fractal heap header's prefix
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		December 15, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__hdr_prefix_decode(H5HF_hdr_t *hdr, const uint8_t **image_ref)
+{
+    const uint8_t *image = *image_ref;  /* Pointer into into supplied image */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(hdr);
+    HDassert(image);
+
+    /* Magic number */
+    if(HDmemcmp(image, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "wrong fractal heap header signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5HF_HDR_VERSION)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "wrong fractal heap header version")
+
+    /* General heap information */
+    UINT16DECODE(image, hdr->id_len);              /* Heap ID length */
+    UINT16DECODE(image, hdr->filter_len);          /* I/O filters' encoded length */
+
+    /* Update the image buffer pointer */
+    *image_ref = image;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__hdr_prefix_decode() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HF__dtable_decode
  *
  * Purpose:	Decodes the metadata for a doubling table
@@ -310,21 +346,13 @@ H5HF__dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HF__dtable_encode() */
 
-/**************************************************/
-/* metadata cache callback definitions for header */
-/**************************************************/
-
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF__cache_hdr_get_load_size()
+ * Function:	H5HF__cache_hdr_get_initial_load_size()
  *
  * Purpose:	Determine the size of the fractal heap header on disk,
  *		and set *image_len to this value.
  *
- *		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()
@@ -339,16 +367,10 @@ H5HF__dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
+    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 */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -356,49 +378,63 @@ H5HF__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_le
     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 */
+    /* 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);
 
-	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;
+    /* Compute the 'base' size of the fractal heap header on disk */
+    *image_len = (size_t)H5HF_HEADER_SIZE(&dummy_hdr);
 
-	/* Version */
-	if(*image++ != H5HF_HDR_VERSION)
-	    HGOTO_DONE(FAIL)
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF__cache_hdr_get_initial_load_size() */
 
-	/* General heap information */
-	UINT16DECODE(image, id_len);              /* Heap ID length */
-	UINT16DECODE(image, filter_len);          /* I/O filters' encoded length */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_hdr_get_final_load_size()
+ *
+ * Purpose:	Determine the final size of the fractal heap header on disk,
+ *		and set *actual_len to this value.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		November 18, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_hdr_get_final_load_size(const void *_image, size_t image_len,
+    void *_udata, size_t *actual_len)
+{
+    H5HF_hdr_t hdr;             /* Temporary fractal heap header */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into into supplied image */
+    H5HF_hdr_cache_ud_t *udata = (H5HF_hdr_cache_ud_t *)_udata; /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-	if(filter_len > 0) {
+    FUNC_ENTER_STATIC
 
-	    /* 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 */
+    /* Sanity checks */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
 
-	    /* Compute the heap header's size */
-	    *actual_len += filter_info_size;
-	}
+    /* Deserialize the fractal heap header's prefix */
+    if(H5HF__hdr_prefix_decode(&hdr, &image) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, FAIL, "can't decode fractal heap header prefix")
 
-    } /* compute actual_len */
+    /* Check for I/O filter info on this heap */
+    if(hdr.filter_len > 0)
+        /* Compute the extra heap header size */
+        *actual_len += (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 */
+                            + hdr.filter_len);         	/* Size of encoded I/O filter info */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF__cache_hdr_get_load_size() */
+} /* end H5HF__cache_hdr_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -445,30 +481,6 @@ H5HF__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSE
  *		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
  *
@@ -484,7 +496,6 @@ H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
     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 */
     uint8_t             heap_flags;     /* Status flags for heap */
     void *              ret_value = NULL;       /* Return value */
@@ -501,40 +512,9 @@ H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
     if(NULL == (hdr = H5HF_hdr_alloc(udata->f)))
         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);
-
-    /* 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(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(*image++ != H5HF_HDR_VERSION)
-        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap header version")
-
-    /* General heap information */
-    UINT16DECODE(image, hdr->id_len);              /* Heap ID length */
-    UINT16DECODE(image, hdr->filter_len);          /* I/O filters' encoded length */
+    /* Deserialize the fractal heap header's prefix */
+    if(H5HF__hdr_prefix_decode(hdr, &image) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode fractal heap header prefix")
 
     /* Heap status flags */
     /* (bit 0: "huge" object IDs have wrapped) */
@@ -566,32 +546,24 @@ H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
     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")
 
+    /* Set the fractal heap header's 'base' size */
+    hdr->heap_size = (size_t)H5HF_HEADER_SIZE(hdr);
+
     /* Sanity check */
     /* (allow for checksum not decoded yet) */
-    HDassert((size_t)(image - (const uint8_t *)_image) == (size - H5HF_SIZEOF_CHKSUM));
+    HDassert((size_t)(image - (const uint8_t *)_image) == (hdr->heap_size - H5HF_SIZEOF_CHKSUM));
 
     /* Check for I/O filter information to decode */
     if(hdr->filter_len > 0) {
-        size_t filter_info_size;    /* Size of filter information */
         H5O_pline_t *pline;         /* Pipeline information from the header on disk */
 
-        /* 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 */
+        /* Sanity check */
+        HDassert(len > hdr->heap_size);       /* A header with filter info is > than a standard header */
 
         /* Compute the heap header's size */
-        hdr->heap_size = size + filter_info_size;
-
-        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)
-
-	else
-            if((size + filter_info_size) != len)
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "bad image len")
+        hdr->heap_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 */
 
         /* Decode the size of a filtered root direct block */
         H5F_DECODE_LENGTH(udata->f, image, hdr->pline_root_direct_size);
@@ -603,6 +575,7 @@ H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
         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")
 
+        /* Advance past filter info to checksum */
         image += hdr->filter_len;
 
         /* Copy the information into the header's I/O pipeline structure */
@@ -612,11 +585,6 @@ H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
         /* Release the space allocated for the I/O pipeline filters */
         H5O_msg_free(H5O_PLINE_ID, pline);
     } /* end if */
-    else
-        /* Set the heap header's size */
-        hdr->heap_size = size;
-
-    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
     UINT32DECODE(image, stored_chksum);
@@ -647,7 +615,7 @@ done:
  *		disk image.  
  *
  *		If the header contains filter information, this size will be 
- *		larger than the value returned by H5HF__cache_hdr_get_load_size().  
+ *		larger than the value returned by H5HF__cache_hdr_get_initial_load_size().  
  *
  * Return:	Success:	SUCCEED
  *		Failure:	FAIL
@@ -658,8 +626,7 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_hdr_image_len(const void *_thing, size_t *image_len)
 {
     const H5HF_hdr_t  *hdr = (const H5HF_hdr_t *)_thing;    /* Fractal heap info */
 
@@ -698,10 +665,9 @@ H5HF__cache_hdr_image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 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__cache_hdr_pre_serialize(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    void *_thing, haddr_t addr, size_t len, haddr_t H5_ATTR_UNUSED *new_addr,
+    size_t H5_ATTR_UNUSED *new_len, unsigned *flags)
 {
     H5HF_hdr_t *hdr = (H5HF_hdr_t *)_thing;     /* Fractal heap info */
     herr_t      ret_value = SUCCEED;    /* Return value */
@@ -722,6 +688,7 @@ H5HF__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
 #ifndef NDEBUG
 {
     hbool_t descendants_clean = TRUE;
+    hbool_t fd_children_clean = TRUE;
 
     /* Verify that flush dependencies are working correctly.  Do this
      * by verifying that either:
@@ -736,10 +703,22 @@ H5HF__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
      *    constraint is met by default.
      *
      * Do this with a call to H5HF__cache_verify_hdr_descendants_clean().
+     *
+     * Note that decendants need not be clean if the pre_serialize call
+     * is made during a cache serialization instead of an entry or cache
+     * flush.
+     *
+     * Note also that with the recent change in the definition of flush 
+     * dependency, not all decendants need be clean -- only direct flush 
+     * dependency children.
+     *
+     * Finally, observe that the H5HF__cache_verify_hdr_descendants_clean()
+     * call still looks for dirty descendants.  At present we do not check
+     * this value.
      */
-    if(H5HF__cache_verify_hdr_descendants_clean((H5F_t *)f, dxpl_id, hdr, &descendants_clean) < 0)
+    if(H5HF__cache_verify_hdr_descendants_clean((H5F_t *)f, dxpl_id, hdr, &fd_children_clean, &descendants_clean) < 0)
          HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify hdr descendants clean.")
-    HDassert(descendants_clean);
+    HDassert(fd_children_clean);
 }
 #endif /* NDEBUG */
 
@@ -863,10 +842,6 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HF__cache_hdr_serialize() */
 
-/***************************************/
-/* no H5HF__cache_hdr_notify() function */
-/***************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:	H5HF__cache_hdr_free_icr
@@ -913,13 +888,9 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HF__cache_hdr_free_icr() */
 
-/***********************************************************/
-/* metadata cache callback definitions for indirect blocks */
-/***********************************************************/
-
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF__cache_iblock_get_load_size()
+ * Function:	H5HF__cache_iblock_get_initial_load_size()
  *
  * Purpose:	Compute the size of the on disk image of the indirect 
  *		block, and place this value in *image_len.
@@ -933,10 +904,8 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_iblock_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
 
     FUNC_ENTER_STATIC_NOERR
@@ -947,19 +916,12 @@ H5HF__cache_iblock_get_load_size(const void *_image, void *_udata, size_t *image
     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 */
+    /* Set the image length size */
+    *image_len = (size_t)H5HF_MAN_INDIRECT_SIZE(udata->par_info->hdr, *udata->nrows);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HF__cache_iblock_get_load_size() */
+} /* end H5HF__cache_iblock_get_initial_load_size() */
 
-/***********************************************************/
-/* metadata cache callback definitions for indirect blocks */
-/***********************************************************/
 

 /*-------------------------------------------------------------------------
  * Function:    H5HF__cache_iblock_verify_chksum
@@ -1202,8 +1164,7 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_iblock_image_len(const void *_thing, size_t *image_len)
 {
     const H5HF_indirect_t *iblock = (const H5HF_indirect_t *)_thing;    /* Indirect block info */
 
@@ -1229,8 +1190,9 @@ H5HF__cache_iblock_image_len(const void *_thing, size_t *image_len,
  *		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.
+ *		In debug compiles, this function also verifies that all 
+ *		immediate flush dependency children of this indirect block 
+ *		are either clean or are not in cache.
  *
  * Return:	Success:	SUCCEED
  *		Failure:	FAIL
@@ -1241,10 +1203,9 @@ H5HF__cache_iblock_image_len(const void *_thing, size_t *image_len,
  *-------------------------------------------------------------------------
  */
 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__cache_iblock_pre_serialize(H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t H5_ATTR_UNUSED len, haddr_t *new_addr,
+    size_t H5_ATTR_UNUSED *new_len, unsigned *flags)
 {
     H5HF_hdr_t          *hdr;                   /* Shared fractal heap information */
     H5HF_indirect_t     *iblock = (H5HF_indirect_t *)_thing;    /* Indirect block info */
@@ -1271,10 +1232,12 @@ H5HF__cache_iblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
 #ifndef NDEBUG
 {
     hbool_t 		 descendants_clean = TRUE;
+    hbool_t		 fd_children_clean = TRUE;
     unsigned 		 iblock_status = 0;
 
     /* verify that flush dependencies are working correctly.  Do this
-     * by verifying that all children of this iblock are clean.
+     * by verifying that all immediate flush dependency 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")
@@ -1284,9 +1247,9 @@ H5HF__cache_iblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
      * 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)
+    if(H5HF__cache_verify_iblock_descendants_clean((H5F_t *)f, dxpl_id, iblock->addr, iblock, &iblock_status, &fd_children_clean, &descendants_clean) < 0)
          HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify descendants clean.")
-    HDassert(descendants_clean);
+    HDassert(fd_children_clean);
 }
 #endif /* NDEBUG */
 
@@ -1336,7 +1299,7 @@ H5HF__cache_iblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
         } /* end if */
 
 	*new_addr = iblock_addr;
-        *flags = H5C__SERIALIZE_MOVED_FLAG;
+        *flags = H5AC__SERIALIZE_MOVED_FLAG;
     } /* end if */
     else 
 	*flags = 0;
@@ -1483,7 +1446,7 @@ H5HF__cache_iblock_serialize(const H5F_t *f, void *_image, size_t len,
  *-------------------------------------------------------------------------
  */
 static herr_t 
-H5HF__cache_iblock_notify(H5C_notify_action_t action, void *_thing)
+H5HF__cache_iblock_notify(H5AC_notify_action_t action, void *_thing)
 {
     H5HF_indirect_t     *iblock = (H5HF_indirect_t *)_thing;    /* Indirect block info */
     herr_t      	 ret_value = SUCCEED;    /* Return value */
@@ -1498,19 +1461,9 @@ H5HF__cache_iblock_notify(H5C_notify_action_t action, void *_thing)
 
     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.                                   */
@@ -1552,6 +1505,12 @@ H5HF__cache_iblock_notify(H5C_notify_action_t action, void *_thing)
             break;
 
 	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
 	    /* do nothing */
 	    break;
 
@@ -1619,13 +1578,9 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HF__cache_iblock_free_icr() */
 
-/*********************************************************/
-/* metadata cache callback definitions for direct blocks */
-/*********************************************************/
-
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF__cache_dblock_get_load_size()
+ * Function:	H5HF__cache_dblock_get_initial_load_size()
  *
  * Purpose:	Determine the size of the direct block on disk image, and 
  *		return it in *image_len.
@@ -1639,76 +1594,41 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_dblock_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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;
 
     FUNC_ENTER_STATIC_NOERR
 
     /* Sanity checks */
     HDassert(udata);
     HDassert(image_len);
+
+    /* Convenience variables */
     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);
 
     /* 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;
-    }
+        /* Check for root direct block */
+        if(par_info->iblock == NULL)
+            /* filtered root direct block */
+            *image_len = hdr->pline_root_direct_size;
+        else
+            /* filtered direct block */
+            *image_len = par_info->iblock->filt_ents[par_info->entry].size;
+    }  /* end if */
+    else
+        *image_len = udata->dblock_size;
     
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HF__cache_dblock_get_load_size() */
-
-/*********************************************************/
-/* metadata cache callback definitions for direct blocks */
-/*********************************************************/
+} /* end H5HF__cache_dblock_get_initial_load_size() */
 
+

 /*-------------------------------------------------------------------------
  * Function:    H5HF__cache_dblock_verify_chksum
  *
@@ -1728,7 +1648,6 @@ 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 */
@@ -1747,56 +1666,37 @@ H5HF__cache_dblock_verify_chksum(const void *_image, size_t len, void *_udata)
     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;
+        /* Allocate buffer to perform I/O filtering on and copy image into
+         * it.  Must do this as H5Z_pipeline() may re-size the buffer 
+         * provided to it.
+         */
+        if(NULL == (read_buf = H5MM_malloc(len)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+
+	/* Set up parameters for filter pipeline */
+	nbytes = len;
 	filter_mask = udata->filter_mask;
-        HDmemcpy(read_buf, image, read_size);
+        HDmemcpy(read_buf, image, len);
 
-	if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
+	/* Push direct block data through I/O filter pipeline */
+	if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &len, &read_buf) < 0)
 	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, FAIL, "output pipeline failed")
 
-	/* Sanity check */
-	HDassert(nbytes == len); 
+        /* Update info about direct block */
 	udata->decompressed = TRUE;
-
-    } else
-        HDmemcpy(read_buf, image, read_size);
+        len = nbytes;
+    } /* end if */
+    else
+        read_buf = (void *)image;       /* Casting away const OK - QAK */
 
     /* Decode checksum */
     chk_size = (size_t)(H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr) - H5HF_SIZEOF_CHKSUM);
@@ -1823,20 +1723,21 @@ H5HF__cache_dblock_verify_chksum(const void *_image, size_t len, void *_udata)
 
     /* Save the decompressed data to be used later in deserialize callback */
     if(hdr->filter_len > 0) {
-
+        /* Sanity check */
 	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);
-    }
+    } /* end if */
 
 done:
     /* Release the read buffer */
-    if(read_buf)
+    if(read_buf && read_buf != image)
 	H5MM_xfree(read_buf);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1871,14 +1772,15 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
     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       *image;         /* Pointer into raw data buffer */
+    const uint8_t       *image = (const uint8_t *)_image;/* Pointer into raw data buffer */
+    void                *read_buf = NULL; /* Pointer to buffer to decompress */
     haddr_t             heap_addr;      /* Address of heap header in the file */
     void *              ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Sanity checks */
-    HDassert(_image);
+    HDassert(image);
     HDassert(udata);
     par_info = (H5HF_parent_t *)(&(udata->par_info));
     HDassert(par_info);
@@ -1889,7 +1791,7 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
     HDassert(dirty);
 
     /* Allocate space for the fractal heap direct block */
-    if(NULL == (dblock = H5FL_MALLOC(H5HF_direct_t)))
+    if(NULL == (dblock = H5FL_CALLOC(H5HF_direct_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
     HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t));
 
@@ -1903,61 +1805,40 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
 
     /* Set block's internal information */
     dblock->size = udata->dblock_size;
-    dblock->file_size = 0;
-
-    /* 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")
-    } 
 
     /* 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 */
+        /* Direct block is already decompressed in verify_chksum callback */
+        if(udata->decompressed) { 
+            /* Sanity check */
+            HDassert(udata->dblk);
 
-	if(!udata->decompressed) {
-	    HDassert(udata->dblk == NULL);
+            /* Take ownership of the decompressed direct block */
+            dblock->blk = udata->dblk;
+            udata->dblk = NULL;
+        } /* end if */
+        else {
+            H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+            size_t nbytes;          /* Number of bytes used in buffer, after applying reverse filters */
+            unsigned filter_mask;   /* Excluded filters for direct block */
 
-	    /* 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);
+            /* Sanity check */
+	    HDassert(udata->dblk == NULL);
 
 	    /* Allocate buffer to perform I/O filtering on and copy image into
-	     * it.  Must do this as H5Z_pipeline() may re-sized the buffer 
+	     * it.  Must do this as H5Z_pipeline() may resize the buffer 
 	     * provided to it.
 	     */
-	    if(NULL == (read_buf = H5MM_malloc(read_size)))
+	    if(NULL == (read_buf = H5MM_malloc(len)))
 		HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed for pipeline buffer")
-	    HDmemcpy(read_buf, _image, len);
+
+            /* Copy compressed image into buffer */
+	    HDmemcpy(read_buf, image, len);
 
 	    /* Push direct block data through I/O filter pipeline */
-	    nbytes = read_size;
+	    nbytes = len;
 	    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)
+	    if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &len, &read_buf) < 0)
 		HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, NULL, "output pipeline failed")
 
 	    /* Sanity check */
@@ -1965,15 +1846,21 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
 
 	    /* 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 */
     } /* end if */
     else {
-        /* copy image to dblock->blk */
+        /* Sanity checks */
+	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")
+
+        /* Copy image to dblock->blk */
         HDassert(dblock->size == len);
-        HDmemcpy(dblock->blk, _image, dblock->size);
+        HDmemcpy(dblock->blk, image, dblock->size);
     } /* end else */
 
     /* Start decoding direct block */
@@ -2014,7 +1901,6 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
 
         /* Metadata checksum */
         UINT32DECODE(image, stored_chksum);
-
     } /* end if */
 
     /* Sanity check */
@@ -2024,6 +1910,11 @@ H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
     ret_value = (void *)dblock;
 
 done:
+    /* Release the read buffer */
+    if(read_buf)
+        H5MM_xfree(read_buf);
+
+    /* Cleanup on error */
     if(!ret_value && dblock)
         if(H5HF_man_dblock_dest(dblock) < 0)
             HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy fractal heap direct block")
@@ -2048,14 +1939,11 @@ done:
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len)
 {
     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_STATIC_NOERR
 
@@ -2064,19 +1952,15 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
     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);
 
     /* Set up convenience variables */
     hdr = dblock->hdr;
-    par_iblock = dblock->parent;
+    HDassert(hdr);
 
     /* Check for I/O filters on this heap */
     if(hdr->filter_len > 0) {
-
-        /* 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
+        /* 
+         * If the data is available, set to the compressed
          * size of the direct block -- otherwise set it equal to the 
          * uncompressed size.  
          *
@@ -2086,7 +1970,7 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
          * 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.
+         * stored in dblock->size as the size.
          *
          * Second, the block may have just been serialized, in which
          * case, dblock->file_size should be zero, and the correct 
@@ -2100,42 +1984,26 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
          * 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;
+            size = dblock->file_size;
         else {
-            if(par_iblock) {
-                unsigned          par_entry;  /* Entry in parent indirect block */
-
-                par_entry = dblock->par_entry;
-                compressed_size = par_iblock->filt_ents[par_entry].size;
-
-            } /* end if */
-            else {
-                compressed_size = hdr->pline_root_direct_size;
-            }
+            const H5HF_indirect_t  *par_iblock = dblock->parent; /* Parent iblock */
 
-            if(compressed_size == 0)
-                compressed_size = dblock->size;
+            if(par_iblock)
+                size = par_iblock->filt_ents[dblock->par_entry].size;
+            else
+                size = hdr->pline_root_direct_size;
 
+            if(size == 0)
+                size = dblock->size;
         } /* end else */
     } /* end if */
-    else {
+    else
         size = dblock->size;
-        compressed = FALSE;
-        compressed_size = 0; /* a convenient, invalid value */
-    }
 
+    /* Set the image size */
     HDassert(size > 0);
-
-    *image_len                = size;
-    *compressed_ptr           = compressed;
-    *compressed_image_len_ptr = compressed_size;
+    *image_len = size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HF__cache_dblock_image_len() */
@@ -2147,7 +2015,7 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
  * 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, 
+ *		fixed, but since the direct block could be compressed, 
  *		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 
@@ -2159,8 +2027,8 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
  *
  *		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 
+ *		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, 
@@ -2204,9 +2072,8 @@ H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *com
  *-------------------------------------------------------------------------
  */
 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)
+H5HF__cache_dblock_pre_serialize(H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t len, haddr_t *new_addr, size_t *new_len, unsigned *flags)
 {
     hbool_t 		 at_tmp_addr;  /* Flag to indicate direct block is */
                                        /* at temporary address */
@@ -2232,18 +2099,14 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
     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(new_len);
     HDassert(flags);
 
     /* Set up local variables */
     hdr = dblock->hdr;
     dblock_addr = addr;    /* will update dblock_addr if we move the block */
 
-    /* dblock->size must match dblock->cache_info.size */
-    HDassert(dblock->cache_info.size == dblock->size);
-
     /* Set the shared heap header's file context for this operation */
     hdr->f = (H5F_t *)f;
 
@@ -2331,9 +2194,10 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
 
         /* 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")
+
+        /* Copy the direct block's image into the buffer to compress */
         HDmemcpy(write_buf, dblock->blk, write_size);
 
         /* Push direct block data through I/O filter pipeline */
@@ -2370,7 +2234,7 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
              * size matches the heap's last record.  This value will
              * likely change shortly.
              */
-            HDassert(compressed_len == hdr->pline_root_direct_size);
+            HDassert(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) {
@@ -2379,26 +2243,20 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
                  *
                  * (temp. file space does not need to be freed) 
                  */
-                if(!at_tmp_addr) {
+                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, 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, dxpl_id) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
-
                 /* Update information about compressed direct block's 
                  * location & size 
                  */
                 HDassert(hdr->man_dtable.table_addr == addr);
-                HDassert(hdr->pline_root_direct_size == compressed_len);
+                HDassert(hdr->pline_root_direct_size == len);
                 hdr->man_dtable.table_addr = dblock_addr;
                 hdr->pline_root_direct_size = write_size;
 
@@ -2428,7 +2286,7 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
              * size matches the heap's last record.  This value will
              * likely change shortly.
              */
-            HDassert(compressed_len == par_iblock->filt_ents[par_entry].size);
+            HDassert(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) {
@@ -2437,26 +2295,20 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
                  *
                  * (temp. file space does not need to be freed) 
                  */
-                if(!at_tmp_addr) {
+                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 */
 
                 /* 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, 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, dxpl_id) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
-
                 /* 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);
+                HDassert(par_iblock->filt_ents[par_entry].size == len);
                 par_iblock->ents[par_entry].addr = dblock_addr;
                 par_iblock->filt_ents[par_entry].size = write_size;
 
@@ -2488,22 +2340,16 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
          * to 'normal' file space 
          */
         if(at_tmp_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")
+
             /* Check for root direct block */
             if(NULL == dblock->parent) {
-                /* Sanity check */
+                /* Sanity checks */
                 HDassert(H5F_addr_eq(hdr->man_dtable.table_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(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, dxpl_id) < 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;
 
@@ -2512,22 +2358,12 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
                     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 */
+                /* Sanity checks */
                 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, dxpl_id) < 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;
 
@@ -2553,13 +2389,13 @@ H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
 
     /* finally, pass data back to the metadata cache as appropriate */
     if(!H5F_addr_eq(addr, dblock_addr)) {
-        dblock_flags |= H5C__SERIALIZE_MOVED_FLAG;
+        dblock_flags |= H5AC__SERIALIZE_MOVED_FLAG;
         *new_addr = dblock_addr;
     } /* end if */
 
-    if((hdr->filter_len > 0) && (compressed_len != write_size)) {
-        dblock_flags |= H5C__SERIALIZE_COMPRESSED_FLAG;
-        *new_compressed_len = write_size;
+    if((hdr->filter_len > 0) && (len != write_size)) {
+        dblock_flags |= H5AC__SERIALIZE_RESIZED_FLAG;
+        *new_len = write_size;
     } /* end if */
 
     *flags = dblock_flags;
@@ -2652,7 +2488,7 @@ H5HF__cache_dblock_serialize(const H5F_t *f, void *image, size_t len,
  *-------------------------------------------------------------------------
  */
 static herr_t 
-H5HF__cache_dblock_notify(H5C_notify_action_t action, void *_thing)
+H5HF__cache_dblock_notify(H5AC_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 */
@@ -2684,6 +2520,12 @@ H5HF__cache_dblock_notify(H5C_notify_action_t action, void *_thing)
             break;
 
 	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
 	    /* do nothing */
 	    break;
 
@@ -2760,6 +2602,54 @@ done:
  *		instance of H5HF_hdr_t are clean.  Set *clean to 
  *		TRUE if this is the case, and to FALSE otherwise.
  *
+ *		Update -- 8/24/15
+ *
+ *		With the advent of the metadata cache image feature, it is
+ *		possible for the pre-serialize and serialize calls to be
+ *		invoked outside of a flush.  While this serialization
+ *		observes flush dependencies for the order of serialization,
+ *		the entries are not written to disk, and hence dirty entries
+ *		remain dirty.
+ *
+ *		To address this, updated the sanity checks in this function
+ *		to treat entries whose images are up to date as clean if 
+ *		a cache serialization is in progress.
+ *
+ *		Update -- 9/29/16
+ *
+ *		The implementation of flush dependencies has been changed.
+ *		Prior to this change, a flush dependency parent could be 
+ *		flushed if and only if all its flush dependency decendants
+ *		were clean.  In the new definition, a flush dependency 
+ *		parent can be flushed if all its immediate flush dependency
+ *		children are clean, regardless of any other dirty 
+ *		decendants.  
+ *
+ *		Further, metadata cache entries are now allowed to have 
+ *		multiple flush dependency parents.  
+ *
+ *		This means that the fractal heap is no longer ncessarily 
+ *		flushed from the bottom up.
+ *
+ *		For example, it is now possible for a dirty fractal heap 
+ *		header to be flushed before a dirty dblock, as long as the
+ *		there in an interviening iblock, and the header has no 
+ *		dirty immediate flush dependency children.
+ *
+ *		Also, I gather that under some circumstances, a dblock 
+ *		will be direct a flush dependency child both of the iblock 
+ *		that points to it, and of the fractal heap header.
+ *
+ *		As a result of these changes, the functionality of these
+ *		sanity checking routines has been modified significantly.
+ *		Instead of scanning the fractal heap from a starting point
+ *		down, and verifying that there were no dirty entries, the 
+ *		functions now scan downward from the starting point and 
+ *		verify that there are no dirty flush dependency children 
+ *		of the specified flush dependency parent.  In passing, 
+ *		they also walk the data structure, and verify it.
+ *
+ *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	John Mainzer
@@ -2770,8 +2660,9 @@ done:
 #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)
+    H5HF_hdr_t *hdr, hbool_t *fd_clean, hbool_t *clean)
 {
+    hbool_t     fd_exists = FALSE;      /* whether flush dependency exists. */
     haddr_t	hdr_addr;               /* Address of header */
     unsigned	hdr_status = 0;         /* Header cache entry status */
     herr_t      ret_value = SUCCEED;    /* Return value */
@@ -2783,6 +2674,7 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
     HDassert(hdr);
     HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
     HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(fd_clean);
     HDassert(clean);
     hdr_addr = hdr->cache_info.addr;
     HDassert(hdr_addr == hdr->heap_addr);
@@ -2847,60 +2739,73 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
 	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.
+        if(!root_iblock_in_cache) { /* we are done */
+            *clean = TRUE;
+            *fd_clean = TRUE;
+        } /* end if */
+        else if((root_iblock_status & H5AC_ES__IS_DIRTY) &&
+                  (((root_iblock_status & H5AC_ES__IMAGE_IS_UP_TO_DATE) == 0) ||
+                   (!H5AC_get_serialization_in_progress(f)))) {
+            *clean = FALSE;
+
+            /* verify that a flush dependency exists between the header and
+             * the root inode.
+             */
+            if(H5AC_flush_dependency_exists(f, hdr->heap_addr, root_iblock_addr, &fd_exists) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+            HDassert(fd_exists);
+
+            *fd_clean = FALSE;
+        } /* end else-if */
+        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.
                      *
-                     * Note that we must set the dxpl tag to avoid a failure
-                     * in H5C_protect() if H5C_DO_TAGGING_SANITY_CHECKS is set.
-                     * Do this unconditionally.  Can't do this at a higher
-                     * level since this call can be triggered by any protect 
-                     * or a flush.
-                     *
-                     * Use the tag assigned to the hdr -- this tag should 
-                     * be used all the way down the fractal heap.
-		     */
-                    H5_BEGIN_TAG(dxpl_id, hdr->cache_info.tag, FAIL)
+                     * The tag specified in the dxpl we received
+                     * as a parameter (via dxpl_id) may not be correct.
+                     * Grab the (hopefully) correct tag from the header,
+                     * and load it into the dxpl via the H5_BEGIN_TAG and 
+                     * H5_END_TAG macros.  Note that any error bracked by
+                     * these macros must be reported with HGOTO_ERROR_TAG. 
+                     */
+                    H5_BEGIN_TAG(dxpl_id, hdr->heap_addr, FAIL)
 
-                    if(NULL == (root_iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                    if(NULL == (root_iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5AC__READ_ONLY_FLAG)))
                         HGOTO_ERROR_TAG(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
-                    unprotect_root_iblock = TRUE;
 
-		    H5_END_TAG(FAIL)
-		} /* end if */
+                    H5_END_TAG(FAIL)
+
+                    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
+                    /* 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.
                      *
@@ -2917,30 +2822,31 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
                      * 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.
+                     * 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.
+                     * 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 */
+                } /* 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)) {
+                /* 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
                      *
@@ -2949,39 +2855,37 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
                      * in this case, since we know that the entry is in cache,
                      * we can pass NULL udata.
                      *
-                     * Note that we must set the dxpl tag to avoid a failure
-                     * in H5C_protect() if H5C_DO_TAGGING_SANITY_CHECKS is set.
-                     * Do this unconditionally.  Can't do this at a higher
-                     * level since this call can be triggered by any protect 
-                     * or a flush.
-                     *
-                     * Use the tag assigned to the hdr -- this tag should 
-                     * be used all the way down the fractal heap.
+                     * The tag associated specified in the dxpl we received
+                     * as a parameter (via dxpl_id) may not be correct.
+                     * Grab the (hopefully) correct tag from the header,
+                     * and load it into the dxpl via the H5_BEGIN_TAG and 
+                     * H5_END_TAG macros.  Note that any error bracked by
+                     * these macros must be reported with HGOTO_ERROR_TAG. 
                      */
-                    H5_BEGIN_TAG(dxpl_id, hdr->cache_info.tag, FAIL)
+                    H5_BEGIN_TAG(dxpl_id, hdr->heap_addr, FAIL)
 
-                    if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                    if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5AC__READ_ONLY_FLAG)))
                         HGOTO_ERROR_TAG(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
+
+                    H5_END_TAG(FAIL)
+
                     unprotect_root_iblock = TRUE;
                     HDassert(iblock == root_iblock);
-
-		    H5_END_TAG(FAIL)
-		} /* end if */
-	    } /* end else */
+                } /* 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().
+             * and then call H5HF__cache_verify_iblock_descendants_clean().
              */
-	    HDassert(root_iblock);
-	    HDassert(root_iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
-	    HDassert(root_iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+             HDassert(root_iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+             HDassert(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.")
+             if(H5HF__cache_verify_iblock_descendants_clean(f, dxpl_id, hdr->heap_addr, root_iblock, &root_iblock_status, fd_clean, 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) {
+             /* 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.")
@@ -2992,8 +2896,8 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
 		(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;
+        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;
@@ -3001,11 +2905,11 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
             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)
+            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?!?")
+            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
@@ -3013,24 +2917,36 @@ H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
              * relationship.
              *
              * We don't test this fully, but we will verify that
-             * the root iblock is a child in some flush dependency
-             * relationship.
+             * the root iblock is a child in a flush dependency
+             * relationship with the header.
              */
-            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(H5AC_flush_dependency_exists(f, hdr->heap_addr, root_dblock_addr, &fd_exists) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+            if(!fd_exists)
+                HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "root dblock is not a flush dep parent of header.")
+
             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;
+            *clean = !((root_dblock_status & H5AC_ES__IS_DIRTY) &&
+                       (((root_dblock_status & 
+                          H5AC_ES__IMAGE_IS_UP_TO_DATE) == 0) || 
+                        (!H5AC_get_serialization_in_progress(f))));
+
+            *fd_clean = *clean;
+        } /* end if */
+        else {    /* root dblock not in cache */
+            *fd_clean = TRUE;
+            *clean = TRUE;
+        } /* end else */
     } /* end else-if */
-    else
-	/* this is scenario 3 -- the fractal heap is empty, and we 
-	 * have nothing to do. 
-	 */
-	*clean = TRUE;
+    else {
+        /* this is scenario 3 -- the fractal heap is empty, and we 
+         * have nothing to do. 
+         */
+        *fd_clean = TRUE;
+        *clean = TRUE;
+    } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -3065,6 +2981,40 @@ done:
  *		H5HF__cache_verify_descendant_iblocks_clean() are 
  *		recursive co-routines.
  *
+ *		Update -- 9/29/16
+ *
+ *		The implementation of flush dependencies has been changed.
+ *		Prior to this change, a flush dependency parent could be 
+ *		flushed if and only if all its flush dependency decendants
+ *		were clean.  In the new definition, a flush dependency 
+ *		parent can be flushed if all its immediate flush dependency
+ *		children are clean, regardless of any other dirty 
+ *		decendants.  
+ *
+ *		Further, metadata cache entries are now allowed to have 
+ *		multiple flush dependency parents.  
+ *
+ *		This means that the fractal heap is no longer ncessarily 
+ *		flushed from the bottom up.
+ *
+ *		For example, it is now possible for a dirty fractal heap 
+ *		header to be flushed before a dirty dblock, as long as the
+ *		there in an interviening iblock, and the header has no 
+ *		dirty immediate flush dependency children.
+ *
+ *		Also, I gather that under some circumstances, a dblock 
+ *		will be direct a flush dependency child both of the iblock 
+ *		that points to it, and of the fractal heap header.
+ *
+ *		As a result of these changes, the functionality of these
+ *		sanity checking routines has been modified significantly.
+ *		Instead of scanning the fractal heap from a starting point
+ *		down, and verifying that there were no dirty entries, the 
+ *		functions now scan downward from the starting point and 
+ *		verify that there are no dirty flush dependency children 
+ *		of the specified flush dependency parent.  In passing, 
+ *		they also walk the data structure, and verify it.
+ *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	John Mainzer
@@ -3075,7 +3025,8 @@ done:
 #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)
+    haddr_t fd_parent_addr, H5HF_indirect_t *iblock, unsigned *iblock_status, 
+    hbool_t * fd_clean, hbool_t *clean)
 {
     hbool_t	has_dblocks = FALSE;
     hbool_t	has_iblocks = FALSE;
@@ -3085,22 +3036,21 @@ H5HF__cache_verify_iblock_descendants_clean(H5F_t *f, hid_t dxpl_id,
 
     /* Sanity checks */
     HDassert(f);
+    HDassert(H5F_addr_defined(fd_parent_addr));
     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);
+    HDassert(fd_clean);
+    HDassert(*fd_clean);
+    HDassert(clean); /* note that *clean need not be TRUE */
 
-    if((*clean) && H5HF__cache_verify_iblocks_dblocks_clean(f, iblock, clean, &has_dblocks) < 0)
+    if((*fd_clean) && H5HF__cache_verify_iblocks_dblocks_clean(f, fd_parent_addr, iblock, fd_clean, 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)
+    if((*fd_clean) && H5HF__cache_verify_descendant_iblocks_clean(f, dxpl_id, fd_parent_addr, iblock, fd_clean, 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.")
@@ -3135,6 +3085,53 @@ done:
  *		during the call.  Caller must ensure that this is 
  *		the case before the call.
  *
+ *      Update -- 8/24/15
+ *
+ *      With the advent of the metadata cache image feature, it is
+ *      possible for the pre-serialize and serialize calls to be
+ *      invoked outside of a flush.  While this serialization
+ *      observes flush dependencies for the order of serialization,
+ *      the entries are not written to disk, and hence dirty entries
+ *      remain dirty.
+ *
+ *      To address this, updated the sanity checks in this function
+ *      to treat entries whose images are up to date as clean if
+ *      a cache serialization is in progress.
+ *
+ *		Update -- 9/29/16
+ *
+ *		The implementation of flush dependencies has been changed.
+ *		Prior to this change, a flush dependency parent could be 
+ *		flushed if and only if all its flush dependency decendants
+ *		were clean.  In the new definition, a flush dependency 
+ *		parent can be flushed if all its immediate flush dependency
+ *		children are clean, regardless of any other dirty 
+ *		decendants.  
+ *
+ *		Further, metadata cache entries are now allowed to have 
+ *		multiple flush dependency parents.  
+ *
+ *		This means that the fractal heap is no longer ncessarily 
+ *		flushed from the bottom up.
+ *
+ *		For example, it is now possible for a dirty fractal heap 
+ *		header to be flushed before a dirty dblock, as long as the
+ *		there in an interviening iblock, and the header has no 
+ *		dirty immediate flush dependency children.
+ *
+ *		Also, I gather that under some circumstances, a dblock 
+ *		will be direct a flush dependency child both of the iblock 
+ *		that points to it, and of the fractal heap header.
+ *
+ *		As a result of these changes, the functionality of these
+ *		sanity checking routines has been modified significantly.
+ *		Instead of scanning the fractal heap from a starting point
+ *		down, and verifying that there were no dirty entries, the 
+ *		functions now scan downward from the starting point and 
+ *		verify that there are no dirty flush dependency children 
+ *		of the specified flush dependency parent.  In passing, 
+ *		they also walk the data structure, and verify it.
+ *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	John Mainzer
@@ -3144,30 +3141,37 @@ done:
  */
 #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)
+H5HF__cache_verify_iblocks_dblocks_clean(H5F_t *f, haddr_t fd_parent_addr, 
+    H5HF_indirect_t *iblock, hbool_t *fd_clean, hbool_t *clean, 
+    hbool_t *has_dblocks)
 {
     unsigned	num_direct_rows;
     unsigned	max_dblock_index;
     unsigned    i;
+    haddr_t	iblock_addr;
     herr_t      ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Sanity checks */
     HDassert(f);
+    HDassert(H5F_addr_defined(fd_parent_addr));
     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(fd_clean);
+    HDassert(*fd_clean);
+    HDassert(clean); /* note that *clean need not be true */
     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)) {
+    iblock_addr = iblock->addr;
+    HDassert(H5F_addr_defined(iblock_addr));
+
+    while((*fd_clean) && (i <= max_dblock_index)) {
         haddr_t     dblock_addr;
 
         dblock_addr = iblock->ents[i].addr;
@@ -3175,38 +3179,44 @@ H5HF__cache_verify_iblocks_dblocks_clean(H5F_t *f, H5HF_indirect_t *iblock,
             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)
+            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 */
+            if(in_cache) { /* dblock is in cache */
+                hbool_t 	fd_exists;
                 unsigned 	dblock_status = 0;
 
-		if(!type_ok)
-		    HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "dblock addr doesn't refer to a dblock?!?")
+                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.
+                *has_dblocks = TRUE;
+
+                if((dblock_status & H5AC_ES__IS_DIRTY) &&
+                        (((dblock_status & H5AC_ES__IMAGE_IS_UP_TO_DATE) == 0) ||
+                        (!H5AC_get_serialization_in_progress(f)))) {
+                    *clean = FALSE;
+		    
+                    if(H5AC_flush_dependency_exists(f, fd_parent_addr, dblock_addr, &fd_exists) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+
+                    if(fd_exists) 
+                        *fd_clean = FALSE;
+                } /* end if */
+
+                /* If a child dblock is in cache, it must have a flush 
+                 * dependency relationship with this iblock.  Test this 
+                 * here.
                  */
-	        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.")
-   
+                 if(H5AC_flush_dependency_exists(f, iblock_addr, dblock_addr, &fd_exists) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+
+                if(!fd_exists)
+                    HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "dblock in cache and not a flush dep child of iblock.")
             } /* end if */
         } /* end if */
 
@@ -3239,6 +3249,54 @@ done:
  *		during the call.  Caller must ensure that this is 
  *		the case before the call.
  *
+ *              Update -- 8/24/15
+ *
+ *              With the advent of the metadata cache image feature, it is
+ *              possible for the pre-serialize and serialize calls to be
+ *              invoked outside of a flush.  While this serialization
+ *              observes flush dependencies for the order of serialization,
+ *              the entries are not written to disk, and hence dirty entries
+ *              remain dirty.
+ *
+ *              To address this, updated the sanity checks in this function
+ *              to treat entries whose images are up to date as clean if
+ *              a cache serialization is in progress.
+ *
+ *		Update -- 9/29/16
+ *
+ *		The implementation of flush dependencies has been changed.
+ *		Prior to this change, a flush dependency parent could be 
+ *		flushed if and only if all its flush dependency decendants
+ *		were clean.  In the new definition, a flush dependency 
+ *		parent can be flushed if all its immediate flush dependency
+ *		children are clean, regardless of any other dirty 
+ *		decendants.  
+ *
+ *		Further, metadata cache entries are now allowed to have 
+ *		multiple flush dependency parents.
+ *
+ *		This means that the fractal heap is no longer ncessarily 
+ *		flushed from the bottom up.
+ *
+ *		For example, it is now possible for a dirty fractal heap 
+ *		header to be flushed before a dirty dblock, as long as the
+ *		there in an interviening iblock, and the header has no 
+ *		dirty immediate flush dependency children.
+ *
+ *		Also, I gather that under some circumstances, a dblock 
+ *		will be direct a flush dependency child both of the iblock 
+ *		that points to it, and of the fractal heap header.
+ *
+ *		As a result of these changes, the functionality of these
+ *		sanity checking routines has been modified significantly.
+ *		Instead of scanning the fractal heap from a starting point
+ *		down, and verifying that there were no dirty entries, the 
+ *		functions now scan downward from the starting point and 
+ *		verify that there are no dirty flush dependency children 
+ *		of the specified flush dependency parent.  In passing, 
+ *		they also walk the data structure, and verify it.
+ *
+ *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	John Mainzer
@@ -3249,32 +3307,37 @@ done:
 #ifndef NDEBUG
 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)
+    haddr_t fd_parent_addr, H5HF_indirect_t *iblock, hbool_t *fd_clean,
+    hbool_t *clean, hbool_t *has_iblocks)
 {
     unsigned	      first_iblock_index;
     unsigned	      last_iblock_index;
     unsigned	      num_direct_rows;
     unsigned	      i;
+    haddr_t    	      iblock_addr;
     herr_t            ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Sanity checks */
     HDassert(f);
+    HDassert(H5F_addr_defined(fd_parent_addr));
     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(fd_clean);
+    HDassert(*fd_clean);
+    HDassert(clean); /* note that *clean need not be true */
     HDassert(has_iblocks);
     num_direct_rows = MIN(iblock->nrows, iblock->hdr->man_dtable.max_direct_rows);
     HDassert(num_direct_rows <= iblock->nrows);
 
+    iblock_addr = iblock->addr;
     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)) {
+    while((*fd_clean) && (i <= last_iblock_index)) {
         haddr_t           child_iblock_addr = iblock->ents[i].addr;
 
 	if(H5F_addr_defined(child_iblock_addr)) {
@@ -3284,19 +3347,33 @@ H5HF__cache_verify_descendant_iblocks_clean(H5F_t *f, hid_t dxpl_id,
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get iblock status")
 
 	    if(child_iblock_status & H5AC_ES__IN_CACHE) {
+                hbool_t         fd_exists;
+
 	        *has_iblocks = TRUE;
-                if(child_iblock_status & H5AC_ES__IS_DIRTY)
-		    *clean = FALSE;
 
-                /* if the child iblock is in cache and *clean is TRUE, 
+                if((child_iblock_status & H5AC_ES__IS_DIRTY) &&
+                        (((child_iblock_status & H5AC_ES__IMAGE_IS_UP_TO_DATE) == 0) ||
+                        (!H5AC_get_serialization_in_progress(f)))) {
+
+                    *clean = FALSE;
+
+                    if(H5AC_flush_dependency_exists(f, fd_parent_addr, child_iblock_addr, &fd_exists) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+
+                    if(fd_exists)
+                        *fd_clean = FALSE;
+                } /* end if */
+
+                /* if the child iblock is in cache and *fd_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
+                 * structure to verify that all descendant blocks that are 
+                 * flush dependency children of the entry at parent_addr 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.
+                 * 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 
@@ -3305,107 +3382,120 @@ H5HF__cache_verify_descendant_iblocks_clean(H5F_t *f, hid_t dxpl_id,
                  * If the entry is unprotected and unpinned, we simply
                  * protect it.
                  *
-		 * If, however, the the child iblock is already protected, 
+                 * 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.
+                 * 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) {
+                if(*fd_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(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 */
                             /*                                           */
-                            /* Note that we must set the dxpl tag to     */
-                            /* avoid a failure in H5C_protect() if       */
-                            /* H5C_DO_TAGGING_SANITY_CHECKS is set.      */
-                            /* Do this unconditionally.  Can't do this   */
-                            /* at a higher level since this call can be  */
-                            /* triggered by any protect or a flush.      */
+                            /* The tag associated specified in the dxpl  */
+                            /* we received as a parameter (via dxpl_id)  */
+                            /* may not be correct.                       */
                             /*                                           */
-                            /* Use the tag assigned to the iblock --     */
-                            /* this tag should be used all the way down  */
-                            /* the fractal heap.                         */
-                            H5_BEGIN_TAG(dxpl_id, iblock->cache_info.tag, FAIL)
+                            /* Grab the (hopefully) correct tag from the */
+                            /* parent iblock, and load it into the dxpl  */
+                            /* via the H5_BEGIN_TAG and H5_END_TAG       */
+                            /* macros.  Note that any error bracked by   */
+                            /* these macros must be reported with        */
+                            /* HGOTO_ERROR_TAG.                          */
+
+                            H5_BEGIN_TAG(dxpl_id, iblock->hdr->heap_addr, FAIL)
 
-			    if(NULL == (child_iblock = (H5HF_indirect_t *) H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, child_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                            if(NULL == (child_iblock = (H5HF_indirect_t *) H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, child_iblock_addr, NULL, H5AC__READ_ONLY_FLAG)))
                                 HGOTO_ERROR_TAG(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
-			    unprotect_child_iblock = TRUE;
 
                             H5_END_TAG(FAIL)
-			} /* end if */
+
+                            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)
+                            /* 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 */
+                            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 */
+                        /* 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 
+                    /* 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);
-
-		    /* 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.")
+                    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);
+
+                    /* now make the recursive call */
+                    if(H5HF__cache_verify_iblock_descendants_clean(f, dxpl_id, fd_parent_addr, child_iblock, &child_iblock_status, fd_clean, clean) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify child iblock clean.")
+
+                    /* if iblock_addr != fd_parent_addr, verify that a flush 
+                     * dependency relationship exists between iblock and 
+                     * the child iblock.
+                     */
+                    if(fd_parent_addr != iblock_addr) {
+                        if(H5AC_flush_dependency_exists(f, iblock_addr, child_iblock_addr, &fd_exists) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check flush dependency")
+
+                        if(!fd_exists)
+                            HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "iblock is not a flush dep parent of child_iblock.")
+                    } /* end if */
 
+                    /* 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 */
diff --git a/src/H5HFdbg.c b/src/H5HFdbg.c
index 40191e5..279de1e 100644
--- a/src/H5HFdbg.c
+++ b/src/H5HFdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFdblock.c b/src/H5HFdblock.c
index 1272ab0..4496962 100644
--- a/src/H5HFdblock.c
+++ b/src/H5HFdblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -493,6 +491,10 @@ H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr,
         udata.filter_mask = 0;
     } /* end else */
 
+    /* Reset compression context info */
+    udata.decompressed = FALSE;
+    udata.dblk = NULL;
+
     /* Protect the direct block */
     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")
diff --git a/src/H5HFdtable.c b/src/H5HFdtable.c
index 3ceb6f5..563e8c5 100644
--- a/src/H5HFdtable.c
+++ b/src/H5HFdtable.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFhdr.c b/src/H5HFhdr.c
index 42857c0..2f01ce6 100644
--- a/src/H5HFhdr.c
+++ b/src/H5HFhdr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFhuge.c b/src/H5HFhuge.c
index 2f0b034..b2a1e68 100644
--- a/src/H5HFhuge.c
+++ b/src/H5HFhuge.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -1121,7 +1119,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)
diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c
index 341f423..11abce0 100644
--- a/src/H5HFiblock.c
+++ b/src/H5HFiblock.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -451,14 +449,11 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si
 
 	/* 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")
+            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")
-
+            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")
diff --git a/src/H5HFint.c b/src/H5HFint.c
deleted file mode 100644
index 61c357c..0000000
--- a/src/H5HFint.c
+++ /dev/null
@@ -1,146 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*-------------------------------------------------------------------------
- *
- * 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 55a8532..54246d2 100644
--- a/src/H5HFiter.c
+++ b/src/H5HFiter.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFman.c b/src/H5HFman.c
index cff4395..2b88b50 100644
--- a/src/H5HFman.c
+++ b/src/H5HFman.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFmodule.h b/src/H5HFmodule.h
index e3274ce..dd6576a 100644
--- a/src/H5HFmodule.h
+++ b/src/H5HFmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h
index 15b62e2..d03c122 100644
--- a/src/H5HFpkg.h
+++ b/src/H5HFpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -544,14 +542,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.
-				 */
+    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;
 
 
@@ -559,15 +557,6 @@ typedef struct H5HF_dblock_cache_ud_t {
 /* Package Private Variables */
 /*****************************/
 
-/* H5HF header inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_FHEAP_HDR[1];
-
-/* H5HF indirect block inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1];
-
-/* H5HF direct block inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1];
-
 /* The v2 B-tree class for tracking indirectly accessed 'huge' objects */
 H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_INDIR[1];
 
@@ -616,12 +605,6 @@ 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);
diff --git a/src/H5HFprivate.h b/src/H5HFprivate.h
index c052143..8cf4b3c 100644
--- a/src/H5HFprivate.h
+++ b/src/H5HFprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -127,8 +125,6 @@ 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);
diff --git a/src/H5HFpublic.h b/src/H5HFpublic.h
index 78b367b..82cfc21 100644
--- a/src/H5HFpublic.h
+++ b/src/H5HFpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFsection.c b/src/H5HFsection.c
index 37ff8f4..42c12ec 100644
--- a/src/H5HFsection.c
+++ b/src/H5HFsection.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -85,14 +83,14 @@ static herr_t H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id,
     H5HF_free_section_t *sect);
 
 /* 'single' section callbacks */
-static herr_t H5HF_sect_single_add(H5FS_section_info_t *sect, unsigned *flags,
+static herr_t H5HF_sect_single_add(H5FS_section_info_t **sect, unsigned *flags,
     void *udata);
 static H5FS_section_info_t *H5HF_sect_single_deserialize(const H5FS_section_class_t *cls,
     hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
     unsigned *des_flags);
 static htri_t H5HF_sect_single_can_merge(const H5FS_section_info_t *sect1,
     const H5FS_section_info_t *sect2, void *udata);
-static herr_t H5HF_sect_single_merge(H5FS_section_info_t *sect1,
+static herr_t H5HF_sect_single_merge(H5FS_section_info_t **sect1,
     H5FS_section_info_t *sect2, void *udata);
 static htri_t H5HF_sect_single_can_shrink(const H5FS_section_info_t *sect,
     void *udata);
@@ -121,7 +119,7 @@ static H5FS_section_info_t *H5HF_sect_row_deserialize(const H5FS_section_class_t
     unsigned *des_flags);
 static htri_t H5HF_sect_row_can_merge(const H5FS_section_info_t *sect1,
     const H5FS_section_info_t *sect2, void *udata);
-static herr_t H5HF_sect_row_merge(H5FS_section_info_t *sect1,
+static herr_t H5HF_sect_row_merge(H5FS_section_info_t **sect1,
     H5FS_section_info_t *sect2, void *udata);
 static htri_t H5HF_sect_row_can_shrink(const H5FS_section_info_t *sect,
     void *udata);
@@ -811,7 +809,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_sect_single_add(H5FS_section_info_t *_sect, unsigned *flags, void *_udata)
+H5HF_sect_single_add(H5FS_section_info_t **_sect, unsigned *flags, void *_udata)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -821,7 +819,7 @@ H5HF_sect_single_add(H5FS_section_info_t *_sect, unsigned *flags, void *_udata)
      *  have already been checked when it was first added
      */
     if(!(*flags & H5FS_ADD_DESERIALIZING)) {
-        H5HF_free_section_t *sect = (H5HF_free_section_t *)_sect;   /* Fractal heap free section */
+        H5HF_free_section_t **sect = (H5HF_free_section_t **)_sect;   /* Fractal heap free section */
         H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
         H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
         hid_t dxpl_id = udata->dxpl_id;     /* DXPL ID for operation */
@@ -832,14 +830,14 @@ H5HF_sect_single_add(H5FS_section_info_t *_sect, unsigned *flags, void *_udata)
 
         /* Check if single section covers entire direct block it's in */
         /* (converts to row section possibly) */
-        if(H5HF_sect_single_full_dblock(hdr, dxpl_id, sect) < 0)
+        if(H5HF_sect_single_full_dblock(hdr, dxpl_id, (*sect)) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTCONVERT, FAIL, "can't check/convert single section")
 
         /* Set the "returned space" flag if the single section was changed
          *      into a row section, so the "merging & shrinking" algorithm
          *      gets executed in the free space manager
          */
-        if(sect->sect_info.type != H5HF_FSPACE_SECT_SINGLE)
+        if((*sect)->sect_info.type != H5HF_FSPACE_SECT_SINGLE)
             *flags |= H5FS_ADD_RETURNED_SPACE;
     } /* end if */
 
@@ -949,10 +947,10 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_sect_single_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+H5HF_sect_single_merge(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
     void *_udata)
 {
-    H5HF_free_section_t *sect1 = (H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    H5HF_free_section_t **sect1 = (H5HF_free_section_t **)_sect1;   /* Fractal heap free section */
     H5HF_free_section_t *sect2 = (H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
     H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
     H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
@@ -963,26 +961,26 @@ H5HF_sect_single_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
 
     /* Check arguments. */
     HDassert(sect1);
-    HDassert(sect1->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
+    HDassert((*sect1)->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
     HDassert(sect2);
     HDassert(sect2->sect_info.type == H5HF_FSPACE_SECT_SINGLE);
-    HDassert(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr));
+    HDassert(H5F_addr_eq((*sect1)->sect_info.addr + (*sect1)->sect_info.size, sect2->sect_info.addr));
 
     /* Add second section's size to first section */
-    sect1->sect_info.size += sect2->sect_info.size;
+    (*sect1)->sect_info.size += sect2->sect_info.size;
 
     /* Get rid of second section */
     if(H5HF_sect_single_free((H5FS_section_info_t *)sect2) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't free section node")
 
     /* Check to see if we should revive first section */
-    if(sect1->sect_info.state != H5FS_SECT_LIVE)
-        if(H5HF_sect_single_revive(hdr, dxpl_id, sect1) < 0)
+    if((*sect1)->sect_info.state != H5FS_SECT_LIVE)
+        if(H5HF_sect_single_revive(hdr, dxpl_id, (*sect1)) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
 
     /* Check if single section covers entire direct block it's in */
     /* (converts to row section possibly) */
-    if(H5HF_sect_single_full_dblock(hdr, dxpl_id, sect1) < 0)
+    if(H5HF_sect_single_full_dblock(hdr, dxpl_id, (*sect1)) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTCONVERT, FAIL, "can't check/convert single section")
 
 done:
@@ -1771,10 +1769,10 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_sect_row_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+H5HF_sect_row_merge(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
     void *_udata)
 {
-    H5HF_free_section_t *sect1 = (H5HF_free_section_t *)_sect1;   /* Fractal heap free section */
+    H5HF_free_section_t **sect1 = (H5HF_free_section_t **)_sect1;   /* Fractal heap free section */
     H5HF_free_section_t *sect2 = (H5HF_free_section_t *)_sect2;   /* Fractal heap free section */
     H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata;   /* User callback data */
     H5HF_hdr_t *hdr = udata->hdr;       /* Fractal heap header */
@@ -1785,7 +1783,7 @@ H5HF_sect_row_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
 
     /* Check arguments. */
     HDassert(sect1);
-    HDassert(sect1->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
+    HDassert((*sect1)->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
     HDassert(sect2);
     HDassert(sect2->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW);
 
@@ -1802,8 +1800,8 @@ H5HF_sect_row_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
     } /* end if */
     else {
         /* Check to see if we should revive first section */
-        if(sect1->sect_info.state != H5FS_SECT_LIVE)
-            if(H5HF_sect_row_revive(hdr, dxpl_id, sect1) < 0)
+        if((*sect1)->sect_info.state != H5FS_SECT_LIVE)
+            if(H5HF_sect_row_revive(hdr, dxpl_id, (*sect1)) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
 
         /* Check to see if we should revive second section */
@@ -1812,7 +1810,7 @@ H5HF_sect_row_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
 
         /* Merge rows' underlying indirect sections together */
-        if(H5HF_sect_indirect_merge_row(hdr, dxpl_id, sect1, sect2) < 0)
+        if(H5HF_sect_indirect_merge_row(hdr, dxpl_id, (*sect1), sect2) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTMERGE, FAIL, "can't merge underlying indirect sections")
     } /* end else */
 
diff --git a/src/H5HFspace.c b/src/H5HFspace.c
index 20057e4..41954fc 100644
--- a/src/H5HFspace.c
+++ b/src/H5HFspace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HFstat.c b/src/H5HFstat.c
index 303b1f4..e38a9b1 100644
--- a/src/H5HFstat.c
+++ b/src/H5HFstat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5HFtest.c b/src/H5HFtest.c
index 4b97194..1b1f688 100644
--- a/src/H5HFtest.c
+++ b/src/H5HFtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5HFtiny.c b/src/H5HFtiny.c
index 711ceb9..79462e9 100644
--- a/src/H5HFtiny.c
+++ b/src/H5HFtiny.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HG.c b/src/H5HG.c
index f95b607..893be80 100644
--- a/src/H5HG.c
+++ b/src/H5HG.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -155,7 +153,7 @@ H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size)
     H5_CHECK_OVERFLOW(size, size_t, hsize_t);
     if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_GHEAP, dxpl_id, (hsize_t)size)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to allocate file space for global heap")
-    if(NULL == (heap = H5FL_MALLOC(H5HG_heap_t)))
+    if(NULL == (heap = H5FL_CALLOC(H5HG_heap_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "memory allocation failed")
     heap->addr = addr;
     heap->size = size;
@@ -183,7 +181,7 @@ H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size)
      * which was always at least H5HG_ALIGNMENT aligned then we could just
      * align the pointer, but this might not be the case.
      */
-    n = H5HG_ALIGN(p - heap->chunk) - (size_t)(p - heap->chunk);
+    n = (size_t)H5HG_ALIGN(p - heap->chunk) - (size_t)(p - heap->chunk);
 #ifdef OLD_WAY
 /* Don't bother zeroing out the rest of the info in the heap -QAK */
     HDmemset(p, 0, n);
diff --git a/src/H5HGcache.c b/src/H5HGcache.c
index 511937d..50b2669 100644
--- a/src/H5HGcache.c
+++ b/src/H5HGcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -62,17 +60,20 @@
 /********************/
 
 /* Metadata cache callbacks */
-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 herr_t H5HG__cache_heap_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5HG__cache_heap_get_final_load_size(const void *_image,
+    size_t image_len, void *udata, size_t *actual_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
 
+/* Prefix deserialization */
+static herr_t H5HG__hdr_deserialize(H5HG_heap_t *heap, const uint8_t *image,
+    const H5F_t *f);
+
 
 /*********************/
 /* Package Variables */
@@ -84,7 +85,8 @@ const H5AC_class_t H5AC_GHEAP[1] = {{
     "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 */
+    H5HG__cache_heap_get_initial_load_size,     /* 'get_initial_load_size' callback */
+    H5HG__cache_heap_get_final_load_size, /* 'get_final_load_size' callback */
     NULL, 				/* 'verify_chksum' callback */
     H5HG__cache_heap_deserialize,       /* 'deserialize' callback */
     H5HG__cache_heap_image_len,         /* 'image_len' callback */
@@ -92,7 +94,6 @@ const H5AC_class_t H5AC_GHEAP[1] = {{
     H5HG__cache_heap_serialize,         /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5HG__cache_heap_free_icr,          /* 'free_icr' callback */
-    NULL,                               /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -109,13 +110,59 @@ const H5AC_class_t H5AC_GHEAP[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5HG__cache_heap_get_load_size()
+ * Function:    H5HG__hdr_deserialize()
+ *
+ * Purpose:	Decode a global heap's header
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              December 15, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG__hdr_deserialize(H5HG_heap_t *heap, const uint8_t *image, const H5F_t *f)
+{
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(heap);
+    HDassert(image);
+    HDassert(f);
+
+    /* Magic number */
+    if(HDmemcmp(image, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad global heap collection signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(H5HG_VERSION != *image++)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "wrong version number in global heap")
+
+    /* Reserved */
+    image += 3;
+
+    /* Size */
+    H5F_DECODE_LENGTH(f, image, heap->size);
+    HDassert(heap->size >= H5HG_MINSIZE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG__hdr_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HG__cache_heap_get_initial_load_size()
  *
  * 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().
+ *		H5HG__cache_get_final_load_size().
  *
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
@@ -126,49 +173,60 @@ const H5AC_class_t H5AC_GHEAP[1] = {{
  *-------------------------------------------------------------------------
  */
 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__cache_heap_get_initial_load_size(void H5_ATTR_UNUSED *_udata, size_t *image_len)
 {
-    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 */
-
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
+    /* Sanity check */
     HDassert(image_len);
 
-    if(image == NULL) {
-	*image_len = (size_t)H5HG_MINSIZE;
+    /* Set the image length size */
+    *image_len = (size_t)H5HG_MINSIZE;
 
-    } else { /* compute actual_len */
-	HDassert(f);
-	HDassert(actual_len);
-	HDassert(*actual_len == *image_len);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HG__cache_heap_get_initial_load_size() */
 
-	/* 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;
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HG__cache_heap_get_initial_load_size()
+ *
+ * Purpose:	Return the final read size for a speculatively ready heap to
+ *		the metadata cache.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              November 18, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HG__cache_heap_get_final_load_size(const void *image, size_t image_len,
+    void *udata, size_t *actual_len)
+{
+    H5HG_heap_t heap;                   /* Global heap */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-	/* Version */
-	if(H5HG_VERSION != *image++)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "wrong version number in global heap")
+    FUNC_ENTER_STATIC
 
-	/* Reserved */
-	image += 3;
+    /* Sanity check */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
+    HDassert(image_len == H5HG_MINSIZE);
 
-	/* Size */
-	H5F_DECODE_LENGTH(f, image, heap_size);
-	HDassert(heap_size >= H5HG_MINSIZE);
-	HDassert(*image_len == H5HG_MINSIZE);
+    /* Deserialize the heap's header */
+    if(H5HG__hdr_deserialize(&heap, (const uint8_t *)image, (const H5F_t *)udata) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, FAIL, "can't decode global heap prefix")
 
-	*actual_len = heap_size;
-    }
+    /* Set the final size for the cache image */
+    *actual_len = heap.size;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HG__cache_heap_get_load_size() */
+} /* end H5HG__cache_heap_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -178,10 +236,6 @@ done:
  *		heap, deserialize it, load its contents into a newly allocated
  *		instance of H5HG_heap_t, and return a pointer to the new instance.
  *
- *		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:      Success:        Pointer to in core representation
  *              Failure:        NULL
  *
@@ -197,6 +251,8 @@ H5HG__cache_heap_deserialize(const void *_image, size_t len, void *_udata,
     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 */
+    size_t       max_idx = 0;   /* Maximum heap object index seen */
+    size_t       nalloc;        /* Number of objects allocated */
     void        *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_STATIC
@@ -214,132 +270,105 @@ H5HG__cache_heap_deserialize(const void *_image, size_t len, void *_udata,
     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 */
+    /* Copy the image buffer into the newly allocate chunk */
     HDmemcpy(heap->chunk, _image, len);
 
-    image = heap->chunk;
+    /* Deserialize the heap's header */
+    if(H5HG__hdr_deserialize(heap, (const uint8_t *)heap->chunk, f) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode global heap header")
 
-    /* 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;
-
-    /* Version */
-    if(H5HG_VERSION != *image++) 
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong version number in global heap")
+    /* Decode each object */
+    image = heap->chunk + H5HG_SIZEOF_HDR(f);
+    nalloc = H5HG_NOBJS(f, heap->size);
 
-    /* Reserved */
-    image += 3;
+    /* 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 */
 
-    /* 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;
+            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 {
-                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
+                need = heap->obj[idx].size;
+
+            image = begin + need;
+        } /* end else */
+    } /* end while */
+
+    /* Sanity checks */
+    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
-        /* 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);
+        heap->nused = 1;
+
+    /* Sanity check */
+    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")
 
     ret_value = heap;
 
@@ -367,8 +396,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5HG__cache_heap_image_len(const void *_thing, size_t *image_len)
 {
     const H5HG_heap_t *heap = (const H5HG_heap_t *)_thing;
 
@@ -386,10 +414,6 @@ H5HG__cache_heap_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HG__cache_heap_image_len() */
 
-/**************************************/
-/* no H5HG_cache_heap_pre_serialize() */
-/**************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5HG__cache_heap_serialize
@@ -429,10 +453,6 @@ H5HG__cache_heap_serialize(const H5F_t *f, void *image, size_t len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HG__cache_heap_serialize() */
 
-/****************************************/
-/* no H5HG_cache_heap_notify() function */
-/****************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5HG__cache_heap_free_icr
diff --git a/src/H5HGdbg.c b/src/H5HGdbg.c
index 6013de5..6dd94f5 100644
--- a/src/H5HGdbg.c
+++ b/src/H5HGdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5HGmodule.h b/src/H5HGmodule.h
index aa34f29..1c68206 100644
--- a/src/H5HGmodule.h
+++ b/src/H5HGmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HGpkg.h b/src/H5HGpkg.h
index e566ece..47760bf 100644
--- a/src/H5HGpkg.h
+++ b/src/H5HGpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -40,9 +38,6 @@
 /* Package Private Variables */
 /*****************************/
 
-/* The cache subclass */
-H5_DLLVAR const H5AC_class_t H5AC_GHEAP[1];
-
 /* Declare extern the free list to manage the H5HG_t struct */
 H5FL_EXTERN(H5HG_heap_t);
 
diff --git a/src/H5HGprivate.h b/src/H5HGprivate.h
index 0c0aa69..19dcaa4 100644
--- a/src/H5HGprivate.h
+++ b/src/H5HGprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HGpublic.h b/src/H5HGpublic.h
index 01cd60c..fcec593 100644
--- a/src/H5HGpublic.h
+++ b/src/H5HGpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HGquery.c b/src/H5HGquery.c
index d07edcc..35abc2e 100644
--- a/src/H5HGquery.c
+++ b/src/H5HGquery.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HL.c b/src/H5HL.c
index 7ad2e3c..fa577c3 100644
--- a/src/H5HL.c
+++ b/src/H5HL.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -341,12 +339,10 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned 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, flags)))
@@ -359,25 +355,14 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags))
     /* (for re-entrant situation) */
     if(heap->prots == 0) {
         /* Check if heap has separate data block */
-        if(heap->single_cache_obj) {
+        if(heap->single_cache_obj)
             /* Set the flag for pinning the prefix when unprotecting it */
             prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG;
-        } /* end if */
         else {
-            H5HL_cache_dblk_ud_t dblk_udata; /* User data for protecting local heap data block */
-
-            /* Construct the user data for protect callback */
-            dblk_udata.heap = heap;
-            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, flags)))
+            if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, heap, 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)
-                prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG;
-
             /* Set the flag for pinning the data block when unprotecting it */
             dblk_cache_flags |= H5AC__PIN_ENTRY_FLAG;
         } /* end if */
@@ -931,12 +916,10 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr))
     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__NO_FLAGS_SET)))
@@ -946,24 +929,11 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr))
     heap = prfx->heap;
 
     /* Check if heap has separate data block */
-    if(!heap->single_cache_obj) {
-        H5HL_cache_dblk_ud_t dblk_udata; /* User data for protecting local heap data block */
-
-        /* Construct the user data for protect callback */
-        dblk_udata.heap = heap;
-        dblk_udata.loaded = FALSE;
-
+    if(!heap->single_cache_obj)
         /* 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__NO_FLAGS_SET)))
+        if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, heap, 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(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;
 
@@ -1005,12 +975,10 @@ 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_ONLY_FLAG)))
@@ -1056,12 +1024,10 @@ 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_ONLY_FLAG)))
diff --git a/src/H5HLcache.c b/src/H5HLcache.c
index d0dde89..926f787 100644
--- a/src/H5HLcache.c
+++ b/src/H5HLcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -71,31 +69,30 @@
 
 /* Metadata cache callbacks */
 /* 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 herr_t H5HL__cache_prefix_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5HL__cache_prefix_get_final_load_size(const void *_image,
+    size_t image_len, void *udata, size_t *actual_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5HL__cache_datablock_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 static herr_t H5HL__cache_datablock_serialize(const H5F_t *f, void *image,
     size_t len, void *thing); 
+static herr_t H5HL__cache_datablock_notify(H5C_notify_action_t action, void *_thing);
 static herr_t H5HL__cache_datablock_free_icr(void *thing);
 
+/* Header deserialization */
+static herr_t H5HL__hdr_deserialize(H5HL_t *heap, const uint8_t *image,
+    H5HL_cache_prfx_ud_t *udata);
+
 /* Free list de/serialization */
 static herr_t H5HL__fl_deserialize(H5HL_t *heap);
 static void H5HL__fl_serialize(const H5HL_t *heap);
@@ -110,7 +107,8 @@ const H5AC_class_t H5AC_LHEAP_PRFX[1] = {{
     "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 */
+    H5HL__cache_prefix_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    H5HL__cache_prefix_get_final_load_size, /* 'get_final_load_size' callback */
     NULL,				/* 'verify_chksum' callback */
     H5HL__cache_prefix_deserialize,     /* 'deserialize' callback */
     H5HL__cache_prefix_image_len,       /* 'image_len' callback */
@@ -118,7 +116,6 @@ const H5AC_class_t H5AC_LHEAP_PRFX[1] = {{
     H5HL__cache_prefix_serialize,       /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5HL__cache_prefix_free_icr,        /* 'free_icr' callback */
-    NULL,                               /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -127,15 +124,15 @@ const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{
     "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 */
+    H5HL__cache_datablock_get_initial_load_size,/* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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_notify,       /* 'notify' callback */
     H5HL__cache_datablock_free_icr,     /* 'free_icr' callback */
-    NULL,                               /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -152,6 +149,64 @@ const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5HL__hdr_deserialize()
+ *
+ * Purpose:	Decode a local heap's header
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              December 15, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL__hdr_deserialize( H5HL_t *heap, const uint8_t *image,
+    H5HL_cache_prfx_ud_t *udata)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(heap);
+    HDassert(image);
+    HDassert(udata);
+
+    /* 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_VERSION, FAIL, "wrong version number in local heap")
+
+    /* Reserved */
+    image += 3;
+
+    /* 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(image, heap->dblk_size, udata->sizeof_size);
+
+    /* 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));
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL__hdr_deserialize() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5HL__fl_deserialize
  *
  * Purpose:     Deserialize the free list for a heap data block
@@ -265,18 +320,11 @@ H5HL__fl_serialize(const H5HL_t *heap)
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5HL__cache_prefix_get_load_size()
+ * Function:    H5HL__cache_prefix_get_initial_load_size()
  *
- * Purpose:	Return the size of the buffer the metadata cache should 
+ * Purpose:	Return the initial size of the buffer the metadata cache should 
  *		load from file and pass to the deserialize routine.
  *
- *		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.
- *
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
@@ -286,69 +334,68 @@ H5HL__fl_serialize(const H5HL_t *heap)
  *-------------------------------------------------------------------------
  */
 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)
+H5HL__cache_prefix_get_initial_load_size(void H5_ATTR_UNUSED *_udata, size_t *image_len)
 {
-    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
+    FUNC_ENTER_STATIC_NOERR
 
-    HDassert(udata);
+    /* Sanity check */
     HDassert(image_len);
 
-    if(image == NULL)
-	*image_len = H5HL_SPEC_READ_SIZE;
-
-    else { /* compute actual_len */
-
-	HDassert(actual_len);
-	HDassert(*actual_len == *image_len);
+    /* Set the image length size */
+    *image_len = H5HL_SPEC_READ_SIZE;
 
-	/* 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")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL__cache_prefix_get_initial_load_size() */
 
-	/* Reserved */
-	image += 3;
-    
-	/* Store the prefix's address & length */
-	heap.prfx_addr = udata->prfx_addr; /* NEED */
-	heap.prfx_size = udata->sizeof_prfx; /* NEED */
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__cache_prefix_get_final_load_size()
+ *
+ * Purpose:	Return the final size of the buffer the metadata cache should 
+ *		load from file and pass to the deserialize routine.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              November 18, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL__cache_prefix_get_final_load_size(const void *_image, size_t image_len,
+    void *_udata, size_t *actual_len)
+{
+    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 */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-	/* Heap data size */
-	H5F_DECODE_LENGTH_LEN(image, heap.dblk_size, udata->sizeof_size); /* NEED */
+    FUNC_ENTER_STATIC
 
-	/* 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");
+    /* Sanity checks */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
 
-	/* Heap data address */
-	H5F_addr_decode_len(udata->sizeof_addr, &image, &(heap.dblk_addr)); /* NEED */
+    /* Deserialize the heap's header */
+    if(H5HL__hdr_deserialize(&heap, (const uint8_t *)image, udata) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, FAIL, "can't decode local heap header")
 
-	*actual_len = heap.prfx_size;
+    /* Set the final size for the cache image */
+    *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 */
+    /* 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;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL__cache_prefix_get_load_size() */
+} /* end H5HL__cache_prefix_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -388,42 +435,18 @@ H5HL__cache_prefix_deserialize(const void *_image, size_t len, void *_udata,
     HDassert(H5F_addr_defined(udata->prfx_addr));
     HDassert(dirty);
 
-    /* Check magic number */
-    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 != *image++) 
-        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong version number in local heap")
-
-    /* Reserved */
-    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");
 
+    /* Deserialize the heap's header */
+    if(H5HL__hdr_deserialize(heap, (const uint8_t *)image, udata) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode local heap header")
+
     /* Allocate the 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(image, heap->dblk_size, udata->sizeof_size);
-
-    /* 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, NULL, "bad heap free list")
-
-    /* Heap data address */
-    H5F_addr_decode_len(udata->sizeof_addr, &image, &(heap->dblk_addr));
-
     /* Check if heap block exists */
     if(heap->dblk_size) {
         /* Check if heap data block is contiguous with header */
@@ -431,53 +454,29 @@ H5HL__cache_prefix_deserialize(const void *_image, size_t len, void *_udata,
             /* Note that the heap should be a single object in the cache */
             heap->single_cache_obj = TRUE;
 
-            /* 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")
-
-                /* 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. */
-                image = ((const uint8_t *)_image) + heap->prfx_size;
-
-                /* Copy the heap data from the speculative read buffer */
-                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 {
-		/* 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 */
+            /* 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")
+
+            /* 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. */
+            image = ((const uint8_t *)_image) + heap->prfx_size;
+
+            /* Copy the heap data from the speculative read buffer */
+            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 {
+        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;
 
@@ -513,8 +512,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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__cache_prefix_image_len(const void *_thing, size_t *image_len)
 {
     const H5HL_prfx_t *prfx = (const H5HL_prfx_t *)_thing;  /* Pointer to local heap prefix to query */
 
@@ -538,10 +536,6 @@ H5HL__cache_prefix_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HL__cache_prefix_image_len() */
 
-/****************************************/
-/* no H5HL_cache_prefix_pre_serialize() */
-/****************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5HL__cache_prefix_serialize
@@ -637,10 +631,6 @@ H5HL__cache_prefix_serialize(const H5F_t *f, void *_image, size_t len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HL__cache_prefix_serialize() */
 
-/******************************************/
-/* no H5HL_cache_prefix_notify() function */
-/******************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5HL__cache_prefix_free_icr
@@ -688,7 +678,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5HL__cache_datablock_get_load_size()
+ * Function:    H5HL__cache_datablock_get_initial_load_size()
  *
  * Purpose:	Tell the metadata cache how large a buffer to read from 
  *		file when loading a datablock.  In this case, we simply lookup
@@ -703,30 +693,22 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5HL__cache_datablock_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
+    H5HL_t *heap = (H5HL_t *)_udata;    /* User data for callback */
 
     FUNC_ENTER_STATIC_NOERR
 
     /* Check arguments */
-    HDassert(udata);
-    HDassert(udata->heap);
-    HDassert(udata->heap->dblk_size > 0);
+    HDassert(heap);
+    HDassert(heap->dblk_size > 0);
     HDassert(image_len);
 
-    if(image == NULL)
-	*image_len = udata->heap->dblk_size;
-    else {
-	HDassert(actual_len);
-        HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = heap->dblk_size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HL__cache_datablock_get_load_size() */
+} /* end H5HL__cache_datablock_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -748,8 +730,8 @@ static void *
 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          *dblk = NULL;          /* Local heap data block deserialized */
+    H5HL_t *heap = (H5HL_t *)_udata;            /* User data for callback */
     void                 *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_STATIC
@@ -757,34 +739,30 @@ H5HL__cache_datablock_deserialize(const void *image, size_t len, void *_udata,
     /* 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(heap);
+    HDassert(heap->dblk_size == len);
+    HDassert(!heap->single_cache_obj);
+    HDassert(NULL == heap->dblk);
     HDassert(dirty);
 
     /* Allocate space in memory for the heap data block */
-    if(NULL == (dblk = H5HL__dblk_new(udata->heap)))
+    if(NULL == (dblk = H5HL__dblk_new(heap)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed");
 
     /* Check for heap still retaining image */
-    if(NULL == udata->heap->dblk_image) {
+    if(NULL == 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)))
+        if(NULL == (heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, heap->dblk_size)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate data block image buffer");
 
         /* copy the datablock from the read buffer */
-        HDmemcpy(udata->heap->dblk_image, image, len);
+        HDmemcpy(heap->dblk_image, image, len);
 
         /* Build free list */
-        if(FAIL == H5HL__fl_deserialize(udata->heap))
+        if(FAIL == H5HL__fl_deserialize(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 */
-    udata->loaded = TRUE;
-
     /* Set return value */
     ret_value = dblk;
 
@@ -812,8 +790,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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__cache_datablock_image_len(const void *_thing, size_t *image_len)
 {
     const H5HL_dblk_t *dblk = (const H5HL_dblk_t *)_thing;    /* Pointer to the local heap data block */
 
@@ -832,10 +809,6 @@ H5HL__cache_datablock_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HL__cache_datablock_image_len() */
 
-/*******************************************/
-/* no H5HL_cache_datablock_pre_serialize() */
-/*******************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5HL__cache_datablock_serialize
@@ -883,9 +856,75 @@ H5HL__cache_datablock_serialize(const H5F_t *f, void *image, size_t len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5HL__cache_datablock_serialize() */
 
-/*********************************************/
-/* no H5HL_cache_datablock_notify() function */
-/*********************************************/
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HL__cache_datablock_notify
+ *
+ * Purpose:	This function is used to create and destroy pinned
+ *		relationships between datablocks and their prefix parent.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		November 19, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HL__cache_datablock_notify(H5C_notify_action_t action, void *_thing)
+{
+    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing;  /* Pointer to the local heap data block */
+    herr_t      	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dblk);
+
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    /* do nothing */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            /* Sanity checks */
+            HDassert(dblk->heap);
+            HDassert(dblk->heap->prfx);
+
+            /* Pin the heap's prefix */
+            if(FAIL == H5AC_pin_protected_entry(dblk->heap->prfx))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin local heap prefix")
+            break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+	    /* do nothing */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            /* Sanity checks */
+            HDassert(dblk->heap);
+            HDassert(dblk->heap->prfx);
+
+            /* Unpin the local heap prefix */
+            if(FAIL == H5AC_unpin_entry(dblk->heap->prfx))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap prefix")
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+            break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL__cache_datablock_notify() */
 
 

 /*-------------------------------------------------------------------------
@@ -925,3 +964,4 @@ H5HL__cache_datablock_free_icr(void *_thing)
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HL__cache_datablock_free_icr() */
+
diff --git a/src/H5HLdbg.c b/src/H5HLdbg.c
index fc8f5d3..3533a39 100644
--- a/src/H5HLdbg.c
+++ b/src/H5HLdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5HLdblk.c b/src/H5HLdblk.c
index 69e0334..684d7f9 100644
--- a/src/H5HLdblk.c
+++ b/src/H5HLdblk.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -119,10 +117,9 @@ H5HL__dblk_new(H5HL_t *heap))
 
 CATCH
     /* Ensure that the data block memory is deallocated on errors */
-    if(!ret_value && dblk != NULL) {
+    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() */
 
@@ -151,10 +148,6 @@ H5HL__dblk_dest(H5HL_dblk_t *dblk))
         /* 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")
@@ -223,7 +216,6 @@ H5HL__dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size))
             /* 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 */
@@ -233,7 +225,6 @@ H5HL__dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size))
             /* 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 {
@@ -280,3 +271,4 @@ CATCH
     } /* end if */
 
 END_FUNC(PKG) /* end H5HL__dblk_realloc() */
+
diff --git a/src/H5HLint.c b/src/H5HLint.c
index 5b547cf..e625f3d 100644
--- a/src/H5HLint.c
+++ b/src/H5HLint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HLmodule.h b/src/H5HLmodule.h
index b38c077..b0fd750 100644
--- a/src/H5HLmodule.h
+++ b/src/H5HLmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5HLpkg.h b/src/H5HLpkg.h
index fb8667b..770b7c0 100644
--- a/src/H5HLpkg.h
+++ b/src/H5HLpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -39,12 +37,6 @@
 /* Package Private Variables */
 /*****************************/
 
-/* The local heap prefix cache subclass */
-H5_DLLVAR const H5AC_class_t H5AC_LHEAP_PRFX[1];
-
-/* The local heap data block cache subclass */
-H5_DLLVAR const H5AC_class_t H5AC_LHEAP_DBLK[1];
-
 /* Declare extern the free list to manage the H5HL_free_t struct */
 H5FL_EXTERN(H5HL_free_t);
 
@@ -131,28 +123,12 @@ struct H5HL_prfx_t {
 
 /* 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                               */
-
-    /* Upwards */
-    hbool_t loaded;                     /* Whether data block was loaded from file  */
-} H5HL_cache_dblk_ud_t;
-
 
 /******************************/
 /* Package Private Prototypes */
diff --git a/src/H5HLprfx.c b/src/H5HLprfx.c
index 66c4dad..41c254a 100644
--- a/src/H5HLprfx.c
+++ b/src/H5HLprfx.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -118,10 +116,9 @@ H5HL__prfx_new(H5HL_t *heap))
 
 CATCH
     /* Ensure that the prefix memory is deallocated on errors */
-    if(!ret_value && prfx != NULL) {
+    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() */
 
@@ -164,3 +161,4 @@ CATCH
     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 e2bf29c..054d396 100644
--- a/src/H5HLprivate.h
+++ b/src/H5HLprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HLpublic.h b/src/H5HLpublic.h
index 6dc1828..143bb78 100644
--- a/src/H5HLpublic.h
+++ b/src/H5HLpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5HP.c b/src/H5HP.c
index f6fb20c..4ef5662 100644
--- a/src/H5HP.c
+++ b/src/H5HP.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -848,7 +846,8 @@ H5HP_decr(H5HP_t *heap, unsigned amt, void *_obj)
     HDassert(obj_loc>0 && obj_loc<=heap->nobjs);
 
     /* Change the heap object's priority */
-    heap->heap[obj_loc].val-=amt;
+    H5_CHECK_OVERFLOW(amt, unsigned, int);
+    heap->heap[obj_loc].val-=(int)amt;
 
     /* Restore heap condition */
     if(heap->type==H5HP_MAX_HEAP) {
diff --git a/src/H5HPprivate.h b/src/H5HPprivate.h
index 8db5b21..041c2b9 100644
--- a/src/H5HPprivate.h
+++ b/src/H5HPprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5I.c b/src/H5I.c
index 075f86e..ce4ecdc 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -804,8 +802,6 @@ done:
  * Programmer: Mike McGreevy
  *             Wednesday, July 21, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
diff --git a/src/H5Imodule.h b/src/H5Imodule.h
index 19cc9a4..60bda5a 100644
--- a/src/H5Imodule.h
+++ b/src/H5Imodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Ipkg.h b/src/H5Ipkg.h
index 0a6ae8c..16d7d67 100644
--- a/src/H5Ipkg.h
+++ b/src/H5Ipkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h
index c916f31..25cea4f 100644
--- a/src/H5Iprivate.h
+++ b/src/H5Iprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-----------------------------------------------------------------------------
diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h
index 3bf3c66..896f82f 100644
--- a/src/H5Ipublic.h
+++ b/src/H5Ipublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Itest.c b/src/H5Itest.c
index 506ca87..e7bd2a7 100644
--- a/src/H5Itest.c
+++ b/src/H5Itest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at hdfgoup.org>
diff --git a/src/H5L.c b/src/H5L.c
index b5c6240..469a86c 100644
--- a/src/H5L.c
+++ b/src/H5L.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -2351,9 +2349,11 @@ H5L_delete_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk,
     if(name == NULL)
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist")
 
-    /* Check for removing '.' */
+    /* Check for non-existent (NULL) link.
+     * Note that this can also occur when attempting to remove '.'
+     */
     if(lnk == NULL)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "can't delete self")
+        HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "callback link pointer is NULL (specified link may be '.' or not exist)")
 
     /* Remove the link from the group */
     if(H5G_obj_remove(grp_loc->oloc, grp_loc->path->full_path_r, name, udata->dxpl_id) < 0)
diff --git a/src/H5Lexternal.c b/src/H5Lexternal.c
index 7f59e50..b4a173f 100644
--- a/src/H5Lexternal.c
+++ b/src/H5Lexternal.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5Lmodule.h b/src/H5Lmodule.h
index e665c81..cba4de4 100644
--- a/src/H5Lmodule.h
+++ b/src/H5Lmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Lpkg.h b/src/H5Lpkg.h
index bb8534b..39e3197 100644
--- a/src/H5Lpkg.h
+++ b/src/H5Lpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Lprivate.h b/src/H5Lprivate.h
index 1c8690b..dd243a6 100644
--- a/src/H5Lprivate.h
+++ b/src/H5Lprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Lpublic.h b/src/H5Lpublic.h
index ff2322f..9d1643e 100644
--- a/src/H5Lpublic.h
+++ b/src/H5Lpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5MF.c b/src/H5MF.c
index c8973e3..e54d809 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -29,6 +27,7 @@
 /****************/
 
 #define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5FS_FRIEND		/*suppress error about including H5Fpkg	  */
 #include "H5MFmodule.h"         /* This source code file is part of the H5MF module */
 
 
@@ -38,6 +37,7 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"             /* File access				*/
+#include "H5FSpkg.h"            /* File access              */
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MFpkg.h"		/* File memory management		*/
 #include "H5VMprivate.h"	/* Vectors and arrays 			*/
@@ -50,11 +50,6 @@
 #define H5MF_FSPACE_SHRINK      80              /* Percent of "normal" size to shrink serialized free space size */
 #define H5MF_FSPACE_EXPAND      120             /* Percent of "normal" size to expand serialized free space size */
 
-/* Map an allocation request type to a free list */
-#define H5MF_ALLOC_TO_FS_TYPE(F, T)      ((H5FD_MEM_DEFAULT == (F)->shared->fs_type_map[T]) \
-    ? (T) : (F)->shared->fs_type_map[T])
-
-
 /******************/
 /* Local Typedefs */
 /******************/
@@ -84,9 +79,23 @@ typedef struct {
 /********************/
 
 /* Allocator routines */
-static herr_t H5MF_alloc_create(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
-static herr_t H5MF_alloc_close(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
-static herr_t H5MF_close_delete(H5F_t *f, hid_t dxpl_id);
+static haddr_t H5MF__alloc_pagefs(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size);
+
+/* "File closing" routines */
+static herr_t H5MF__close_aggrfs(H5F_t *f, hid_t dxpl_id);
+static herr_t H5MF__close_pagefs(H5F_t *f, hid_t dxpl_id);
+static herr_t H5MF__close_shrink_eoa(H5F_t *f, hid_t dxpl_id);
+
+/* General routines */
+static herr_t H5MF__get_free_sects(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5MF_sect_iter_ud_t *sect_udata, size_t *nums);
+static hbool_t H5MF__fsm_type_is_self_referential(H5F_t *f, H5F_mem_page_t fsm_type);
+static hbool_t H5MF__fsm_is_self_referential(H5F_t *f, H5FS_t *fspace);
+
+/* Free-space type manager routines */
+static herr_t H5MF__create_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
+static herr_t H5MF__close_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
+static herr_t H5MF__delete_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
+static herr_t H5MF__close_delete_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
 
 
 /*********************/
@@ -222,10 +231,54 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_alloc_open
+ * Function:    H5MF_alloc_to_fs_type
+ *
+ * Purpose:     Map "alloc_type" to the free-space manager type
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer: Vailin Choi; Nov 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5MF_alloc_to_fs_type(H5F_t *f, H5FD_mem_t alloc_type, hsize_t size, H5F_mem_page_t *fs_type)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(fs_type);
+
+    if(H5F_PAGED_AGGR(f)) { /* paged aggregation */
+        if(size >= f->shared->fs_page_size) {
+            if(H5F_HAS_FEATURE(f, H5FD_FEAT_PAGED_AGGR)) { /* multi or split driver */
+                /* For non-contiguous address space, map to large size free-space manager for each alloc_type */
+                if(H5FD_MEM_DEFAULT == f->shared->fs_type_map[alloc_type]) 
+                    *fs_type = (H5F_mem_page_t) (alloc_type + (H5FD_MEM_NTYPES - 1));
+                else
+                    *fs_type = (H5F_mem_page_t) (f->shared->fs_type_map[alloc_type] + (H5FD_MEM_NTYPES - 1));
+            } /* end if */
+            else
+                /* For contiguous address space, map to generic large size free-space manager */
+                *fs_type = H5F_MEM_PAGE_GENERIC; /* H5F_MEM_PAGE_SUPER */
+        } /* end if */
+        else
+            *fs_type = (H5F_mem_page_t)H5MF_ALLOC_TO_FS_AGGR_TYPE(f, alloc_type);
+    } /* end if */
+    else /* non-paged aggregation */
+        *fs_type = (H5F_mem_page_t)H5MF_ALLOC_TO_FS_AGGR_TYPE(f, alloc_type);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5MF_alloc_to_fs_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_open_fstype
  *
  * Purpose:	Open an existing free space manager of TYPE for file by
- *		creating a free-space structure
+ *          creating a free-space structure.
+ *          Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
  *
  * Return:	Success:	non-negative
  *		Failure:	negative
@@ -237,33 +290,59 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+H5MF_open_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_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
+        H5MF_FSPACE_SECT_CLS_SIMPLE,
+        H5MF_FSPACE_SECT_CLS_SMALL,
+        H5MF_FSPACE_SECT_CLS_LARGE };
+    hsize_t alignment;                      /* Alignment to use */
+    hsize_t threshold;                      /* Threshold to use */
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* ring of fsm */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /*
      * Check arguments.
      */
     HDassert(f);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else {
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
+        HDassert((H5FD_mem_t)type != H5FD_MEM_NOLIST);
+    } /* end else */
     HDassert(f->shared);
-    HDassert(type != H5FD_MEM_NOLIST);
     HDassert(H5F_addr_defined(f->shared->fs_addr[type]));
     HDassert(f->shared->fs_state[type] == H5F_FS_STATE_CLOSED);
 
+    /* Set up the aligment and threshold to use depending on the manager type */
+    if(H5F_PAGED_AGGR(f)) {
+        alignment = (type == H5F_MEM_PAGE_GENERIC) ? f->shared->fs_page_size : (hsize_t)H5F_ALIGN_DEF;
+        threshold = H5F_ALIGN_THRHD_DEF;
+    } /* end if */
+    else {
+        alignment = f->shared->alignment;
+        threshold = f->shared->threshold;
+    } /* end else */
+
     /* Set the ring type in the DXPL */
-    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+    if(H5MF__fsm_type_is_self_referential(f, type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
 
     /* 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)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
+	    NELMTS(classes), classes, f, alignment, threshold)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
 
     /* Set the state for the free space manager to "open", if it is now */
     if(f->shared->fs_man[type])
@@ -271,18 +350,20 @@ H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
 
 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")
+    if(reset_ring)
+        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() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_open_fstype() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_alloc_create
+ * Function:	H5MF__create_fstype
  *
  * Purpose:	Create free space manager of TYPE for the file by creating
- *		a free-space structure
+ *          a free-space structure
+ *          Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
  *
  * Return:	Success:	non-negative
  *		Failure:	negative
@@ -294,21 +375,34 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_alloc_create(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+H5MF__create_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type)
 {
     const H5FS_section_class_t *classes[] = { /* Free space section classes implemented for file */
-        H5MF_FSPACE_SECT_CLS_SIMPLE};
-    herr_t ret_value = SUCCEED;         /* Return value */
-    H5FS_create_t fs_create; 		/* Free space creation parameters */
-
-    FUNC_ENTER_NOAPI_NOINIT
+        H5MF_FSPACE_SECT_CLS_SIMPLE,
+        H5MF_FSPACE_SECT_CLS_SMALL,
+        H5MF_FSPACE_SECT_CLS_LARGE };
+    H5FS_create_t fs_create;    /* Free space creation parameters */
+    hsize_t alignment;          /* Alignment to use */
+    hsize_t threshold;			/* Threshold to use */
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* ring of fsm */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /*
      * Check arguments.
      */
     HDassert(f);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else {
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
+        HDassert((H5FD_mem_t)type != H5FD_MEM_NOLIST);
+    } /* end else */
     HDassert(f->shared);
-    HDassert(type != H5FD_MEM_NOLIST);
     HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
     HDassert(f->shared->fs_state[type] == H5F_FS_STATE_CLOSED);
 
@@ -319,24 +413,48 @@ H5MF_alloc_create(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
     fs_create.max_sect_addr = 1 + H5VM_log2_gen((uint64_t)f->shared->maxaddr);
     fs_create.max_sect_size = f->shared->maxaddr;
 
-    if(NULL == (f->shared->fs_man[type] = H5FS_create(f, dxpl_id, NULL,
-	    &fs_create, NELMTS(classes), classes, f, f->shared->alignment, f->shared->threshold)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
+    /* Set up alignment and threshold to use depending on TYPE */
+    if(H5F_PAGED_AGGR(f)) {
+        alignment = (type == H5F_MEM_PAGE_GENERIC) ? f->shared->fs_page_size : (hsize_t)H5F_ALIGN_DEF;
+        threshold = H5F_ALIGN_THRHD_DEF;
+    } /* end if */
+    else {
+        alignment = f->shared->alignment;
+        threshold = f->shared->threshold;
+    } /* end else */
+
+    /* Set the ring type in the DXPL */
+    if(H5MF__fsm_type_is_self_referential(f, type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
 
+    if(NULL == (f->shared->fs_man[type] = H5FS_create(f, dxpl_id, NULL,
+	    &fs_create, NELMTS(classes), classes, f, alignment, threshold)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
 
     /* Set the state for the free space manager to "open", if it is now */
     if(f->shared->fs_man[type])
         f->shared->fs_state[type] = H5F_FS_STATE_OPEN;
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_alloc_create() */
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF__create_fstype() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_alloc_start
+ * Function:	H5MF_start_fstype
  *
- * Purpose:	Open or create a free space manager of a given type
+ * Purpose:	Open or create a free space manager of a given TYPE.
+ *          Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
  *
  * Return:	Success:	non-negative
  *		Failure:	negative
@@ -348,40 +466,123 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5MF_alloc_start(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+H5MF_start_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /*
      * Check arguments.
      */
     HDassert(f);
     HDassert(f->shared);
-    HDassert(type != H5FD_MEM_NOLIST);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else {
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
+        HDassert((H5FD_mem_t)type != H5FD_MEM_NOLIST);
+    } /* end else */
 
     /* Check if the free space manager exists already */
     if(H5F_addr_defined(f->shared->fs_addr[type])) {
         /* Open existing free space manager */
-        if(H5MF_alloc_open(f, dxpl_id, type) < 0)
+        if(H5MF_open_fstype(f, dxpl_id, type) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTOPENOBJ, FAIL, "can't initialize file free space")
     } /* end if */
     else {
         /* Create new free space manager */
-        if(H5MF_alloc_create(f, dxpl_id, type) < 0)
+        if(H5MF__create_fstype(f, dxpl_id, type) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCREATE, FAIL, "can't initialize file free space")
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_alloc_start() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_start_fstype() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF__delete_fstype
+ *
+ * Purpose:     Delete the free-space manager as specified by TYPE.
+ *              Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer: 	Vailin Choi; April 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF__delete_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type)
+{
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;       /* ring of fsm */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
+    haddr_t tmp_fs_addr;       	        /* Temporary holder for free space manager address */
+    herr_t ret_value = SUCCEED;	        /* Return value */
+
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* check args */
+    HDassert(f);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
+    HDassert(H5F_addr_defined(f->shared->fs_addr[type]));
+
+    /* 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;
+
+    /* Set the ring type in the DXPL */
+    if(H5MF__fsm_type_is_self_referential(f, type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+
+#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_RESOURCE, 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;
+
+    /* Sanity check that the free space manager for this type wasn't started up again */
+    HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF__delete_fstype() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_alloc_close
+ * Function:    H5MF__close_fstype
  *
- * Purpose:     Close an existing free space manager of TYPE for file
+ * Purpose:     Close the free space manager of TYPE for file
+ *              Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
  *
  * Return:      Success:        non-negative
  *              Failure:        negative
@@ -391,30 +592,188 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_alloc_close(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
+H5MF__close_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /*
      * Check arguments.
      */
     HDassert(f);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
     HDassert(f->shared);
-    HDassert(type != H5FD_MEM_NOLIST);
     HDassert(f->shared->fs_man[type]);
     HDassert(f->shared->fs_state[type] != H5F_FS_STATE_CLOSED);
 
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Before closing free space manager\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
     /* Close an existing free space structure for the file */
     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")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free space info")
     f->shared->fs_man[type] = NULL;
     f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_alloc_close() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF__close_fstype() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_add_sect
+ *
+ * Purpose:	    To add a section to the specified free-space manager.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; April 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_add_sect(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, H5FS_t *fspace, H5MF_free_section_t *node)
+{
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* ring of fsm */
+    H5MF_sect_ud_t udata;		            /* User data for callback */
+    H5F_mem_page_t  fs_type;                /* Free space type (mapped from allocation type) */
+
+    herr_t ret_value = SUCCEED; 	        /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(node);
+
+    H5MF_alloc_to_fs_type(f, alloc_type, node->sect_info.size, &fs_type);
+
+    /* Construct user data for callbacks */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.alloc_type = alloc_type;
+    udata.allow_sect_absorb = TRUE;
+    udata.allow_eoa_shrink_only = FALSE;
+
+    /* Set the ring type in the DXPL */
+    if(H5MF__fsm_is_self_referential(f, fspace))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: adding node, node->sect_info.addr = %a, node->sect_info.size = %Hu\n", FUNC, node->sect_info.addr, node->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+    /* Add the section */
+    if(H5FS_sect_add(f, dxpl_id, fspace, (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't re-add section to file free space")
+
+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_TAG(ret_value, FAIL)
+} /* end H5MF_add_sect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_find_sect
+ *
+ * Purpose:	To find a section from the specified free-space manager to fulfill the request.
+ *		    If found, re-add the left-over space back to the manager.
+ *
+ * Return:	TRUE if a section is found to fulfill the request
+ *		    FALSE if not
+ *
+ * Programmer:  Vailin Choi; April 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5MF_find_sect(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size, H5FS_t *fspace, haddr_t *addr)
+{
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* ring of fsm */
+    H5MF_free_section_t *node;              /* Free space section pointer */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    htri_t ret_value = FAIL;      	    /* Whether an existing free list node was found */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    HDassert(f);
+    HDassert(fspace);
+
+    /* Set the ring type in the DXPL */
+    if(H5MF__fsm_is_self_referential(f, fspace))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+
+    /* Try to get a section from the free space manager */
+    if((ret_value = H5FS_sect_find(f, dxpl_id, fspace, size, (H5FS_section_info_t **)&node)) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "error locating free space in file")
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section found = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+    /* Check for actually finding section */
+    if(ret_value) {
+        /* Sanity check */
+        HDassert(node);
+
+        /* Retrieve return value */
+        if(addr)
+            *addr = node->sect_info.addr;
+
+        /* Check for eliminating the section */
+        if(node->sect_info.size == size) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: freeing node\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+            /* Free section node */
+            if(H5MF_sect_free((H5FS_section_info_t *)node) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+        } /* end if */
+        else {
+            /* Adjust information for section */
+            node->sect_info.addr += size;
+            node->sect_info.size -= size;
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: re-adding node, node->sect_info.size = %Hu\n", FUNC, node->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+            /* Re-add the section to the free-space manager */
+            if(H5MF_add_sect(f, alloc_type, dxpl_id, fspace, node) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't re-add section to file free space")
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_find_sect() */
 
 

 /*-------------------------------------------------------------------------
@@ -438,11 +797,13 @@ 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 fsm_ring = H5AC_RING_INV;       /* free space manager ring */
     H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
-    H5FD_mem_t  fs_type;                /* Free space type (mapped from allocation type) */
+    H5F_mem_page_t  fs_type;            /* Free space type (mapped from allocation type) */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
     haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
-    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, HADDR_UNDEF)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_type, size);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -453,89 +814,211 @@ HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_typ
     HDassert(f->shared->lf);
     HDassert(size > 0);
 
-    /* Get free space type from allocation type */
-    fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
+    if(f->shared->first_alloc_dealloc) {
+        HDassert(! H5AC_cache_image_pending(f));
+        if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "tidy of self referential fsm hack failed")
+    } /* end if */
+
+    H5MF_alloc_to_fs_type(f, alloc_type, size, &fs_type);
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 1.0\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
 
     /* Set the ring type in the DXPL */
-    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+    if(H5MF__fsm_type_is_self_referential(f, fs_type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, HADDR_UNDEF, "unable to set ring value")
+    reset_ring = TRUE;
 
     /* Check if we are using the free space manager for this file */
     if(H5F_HAVE_FREE_SPACE_MANAGER(f)) {
+        /* We are about to change the contents of the free space manager --
+         * notify metadata cache that the associated fsm ring is
+         * unsettled
+         */
+        if(H5AC_unsettle_ring(f, fsm_ring) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_SYSTEM, HADDR_UNDEF, "attempt to notify cache that ring is unsettled failed")
+
         /* Check if the free space manager for the file has been initialized */
-        if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type]))
-            if(H5MF_alloc_open(f, dxpl_id, fs_type) < 0)
+        if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type])) {
+            /* Open the free-space manager */
+            if(H5MF_open_fstype(f, dxpl_id, fs_type) < 0)
                 HGOTO_ERROR(H5E_RESOURCE, H5E_CANTOPENOBJ, HADDR_UNDEF, "can't initialize file free space")
+            HDassert(f->shared->fs_man[fs_type]);
+        } /* end if */
 
         /* Search for large enough space in the free space manager */
-        if(f->shared->fs_man[fs_type]) {
-            H5MF_free_section_t *node;      /* Free space section pointer */
-            htri_t node_found = FALSE;      /* Whether an existing free list node was found */
+        if(f->shared->fs_man[fs_type])
+            if(H5MF_find_sect(f, alloc_type, dxpl_id, size, f->shared->fs_man[fs_type], &ret_value) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "error locating a node")
+    } /* end if */
 
-            /* Try to get a section from the free space manager */
-            if((node_found = H5FS_sect_find(f, dxpl_id, f->shared->fs_man[fs_type], size, (H5FS_section_info_t **)&node)) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "error locating free space in file")
+    /* If no space is found from the free-space manager, continue further action */
+    if(!H5F_addr_defined(ret_value)) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Check 2.0\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+        if(f->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE) {
+            HDassert(f->shared->fs_page_size >= H5F_FILE_SPACE_PAGE_SIZE_MIN);
+            if(HADDR_UNDEF == (ret_value = H5MF__alloc_pagefs(f, alloc_type, dxpl_id, size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed from paged aggregation")
+        } /* end if */
+        else { /* For non-paged aggregation, continue further action */
+            if(HADDR_UNDEF == (ret_value = H5MF_aggr_vfd_alloc(f, alloc_type, dxpl_id, size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed from aggr/vfd")
+        } /* end else */
+    } /* end if */
+    HDassert(H5F_addr_defined(ret_value));
 #ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: Check 1.5, node_found = %t\n", FUNC, node_found);
+HDfprintf(stderr, "%s: Check 3.0\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
 
-            /* Check for actually finding section */
-            if(node_found) {
-                /* Sanity check */
-                HDassert(node);
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        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 */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
 
-                /* Retrieve return value */
-                ret_value = node->sect_info.addr;
+    FUNC_LEAVE_NOAPI_TAG(ret_value, HADDR_UNDEF)
+} /* end H5MF_alloc() */
 
-                /* Check for eliminating the section */
-                if(node->sect_info.size == size) {
-#ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: Check 1.6, freeing node\n", FUNC);
-#endif /* H5MF_ALLOC_DEBUG_MORE */
-                    /* Free section node */
-                    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, HADDR_UNDEF, "can't free simple section node")
-                } /* end if */
-                else {
-                    H5MF_sect_ud_t udata;               /* User data for callback */
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF__alloc_pagefs
+ *
+ * Purpose:     Allocate space from either the large or small free-space manager.
+ *              For "large" request:
+ *                  Allocate request from VFD
+ *                  Determine mis-aligned fragment and return the fragment to the
+ *                  appropriate manager
+ *              For "small" request:
+ *                  Allocate a page from the large manager
+ *                  Determine whether space is available from a mis-aligned fragment
+ *                  being returned to the manager
+ *              Return left-over space to the manager after fulfilling request
+ *
+ * Return:      Success:        The file address of new chunk.
+ *              Failure:        HADDR_UNDEF
+ *
+ * Programmer:  Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static haddr_t
+H5MF__alloc_pagefs(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size)
+{
+    H5F_mem_page_t ptype;		        /* Free-space mananger type */
+    H5MF_free_section_t *node = NULL;  	/* Free space section pointer */
+    haddr_t ret_value = HADDR_UNDEF; 	/* Return value */
 
-                    /* Adjust information for section */
-                    node->sect_info.addr += size;
-                    node->sect_info.size -= size;
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, HADDR_UNDEF)
 
-                    /* Construct user data for callbacks */
-                    udata.f = f;
-                    udata.dxpl_id = dxpl_id;
-                    udata.alloc_type = alloc_type;
-                    udata.allow_sect_absorb = TRUE;
-		    udata.allow_eoa_shrink_only = FALSE; 
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_type, size);
+#endif /* H5MF_ALLOC_DEBUG */
 
-#ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: Check 1.7, re-adding node, node->sect_info.size = %Hu\n", FUNC, node->sect_info.size);
-#endif /* H5MF_ALLOC_DEBUG_MORE */
-                    /* Re-insert section node into file's free space */
-                    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, HADDR_UNDEF, "can't re-add section to file free space")
-                } /* end else */
+    H5MF_alloc_to_fs_type(f, alloc_type, size, &ptype);
+
+    switch(ptype) {
+	    case H5F_MEM_PAGE_GENERIC:  
+	    case H5F_MEM_PAGE_LARGE_BTREE:
+	    case H5F_MEM_PAGE_LARGE_DRAW:
+	    case H5F_MEM_PAGE_LARGE_GHEAP:
+	    case H5F_MEM_PAGE_LARGE_LHEAP:
+	    case H5F_MEM_PAGE_LARGE_OHDR:
+        {
+            haddr_t eoa;            /* EOA for the file */
+            hsize_t frag_size = 0;  /* Fragment size */
+
+            /* Get the EOA for the file */
+            if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, alloc_type)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "Unable to get eoa")
+            HDassert(!(eoa % f->shared->fs_page_size));
+
+            H5MF_EOA_MISALIGN(f, (eoa+size), f->shared->fs_page_size, frag_size);
 
-                /* Leave now */
-                HGOTO_DONE(ret_value)
+            /* Allocate from VFD */
+            if(HADDR_UNDEF == (ret_value = H5F_alloc(f, dxpl_id, alloc_type, size + frag_size, NULL, NULL)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
+
+            /* If there is a mis-aligned fragment at EOA */
+            if(frag_size) {
+
+                /* Start up the free-space manager */
+                if(!(f->shared->fs_man[ptype]))
+                    if(H5MF_start_fstype(f, dxpl_id, ptype) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize file free space")
+
+                /* Create free space section for the fragment */
+                if(NULL == (node = H5MF_sect_new(H5MF_FSPACE_SECT_LARGE, ret_value + size, frag_size)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize free space section")
+
+                /* Add the fragment to the large free-space manager */
+                if(H5MF_add_sect(f, alloc_type, dxpl_id, f->shared->fs_man[ptype], node) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, HADDR_UNDEF, "can't re-add section to file free space")
+
+                node = NULL;
             } /* end if */
-        } /* end if */
-#ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: Check 2.0\n", FUNC);
-#endif /* H5MF_ALLOC_DEBUG_MORE */
-    } /* end if */
+        }
+        break;
+
+        case H5F_MEM_PAGE_META: 
+        case H5F_MEM_PAGE_DRAW:
+        case H5F_MEM_PAGE_BTREE:
+        case H5F_MEM_PAGE_GHEAP:
+        case H5F_MEM_PAGE_LHEAP:
+        case H5F_MEM_PAGE_OHDR:
+        {
+            haddr_t new_page;		/* The address for the new file size page */
+
+            /* Allocate one file space page */
+            if(HADDR_UNDEF == (new_page = H5MF_alloc(f, alloc_type, dxpl_id, f->shared->fs_page_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
+
+            /* Start up the free-space manager */
+            if(!(f->shared->fs_man[ptype]))
+                if(H5MF_start_fstype(f, dxpl_id, ptype) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize file free space")
+            HDassert(f->shared->fs_man[ptype]);
+
+            if(NULL == (node = H5MF_sect_new(H5MF_FSPACE_SECT_SMALL, (new_page + size), (f->shared->fs_page_size - size))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize free space section")
+
+            /* Add the remaining space in the page to the manager */
+            if(H5MF_add_sect(f, alloc_type, dxpl_id, f->shared->fs_man[ptype], node) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, HADDR_UNDEF, "can't re-add section to file free space")
 
-    /* Allocate from the metadata aggregator (or the VFD) */
-    if(HADDR_UNDEF == (ret_value = H5MF_aggr_vfd_alloc(f, alloc_type, dxpl_id, size)))
-	HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed from aggr/vfd")
+            node = NULL;
 
-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")
+            /* Insert the new page into the Page Buffer list of new pages so 
+               we don't read an empty page from disk */
+            if(f->shared->page_buf != NULL && H5PB_add_new_page(f, alloc_type, new_page) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, HADDR_UNDEF, "can't add new page to Page Buffer new page list")
+
+            ret_value = new_page;
+        } 
+        break;
+
+        case H5F_MEM_PAGE_NTYPES:
+        case H5F_MEM_PAGE_DEFAULT:
+        default:
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space: unrecognized type")
+            break;
+    } /* end switch */
 
+done:
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value, size);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -543,8 +1026,13 @@ HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value,
 H5MF_sects_dump(f, dxpl_id, stderr);
 #endif /* H5MF_ALLOC_DEBUG_DUMP */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_alloc() */
+    /* Release section node, if allocated and not added to section list or merged */
+    if(node)
+        if(H5MF_sect_free((H5FS_section_info_t *)node) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, HADDR_UNDEF, "can't free section node")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, HADDR_UNDEF)
+} /* end H5MF__alloc_pagefs() */
 
 

 /*-------------------------------------------------------------------------
@@ -622,18 +1110,20 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5MF_xfree(const H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
+H5MF_xfree(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 */
+    H5F_io_info2_t fio_info;            /* I/O info for operation */
+    H5F_mem_page_t  fs_type;            /* Free space type (mapped from allocation type) */
     H5MF_free_section_t *node = NULL;   /* Free space section pointer */
-    H5MF_sect_ud_t udata;               /* User data for callback */
+    unsigned ctype;			/* section class type */
     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) */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* Ring of fsm */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)alloc_type, addr, size);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -641,32 +1131,58 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     /* check arguments */
     HDassert(f);
     if(!H5F_addr_defined(addr) || 0 == size)
-        HGOTO_DONE(SUCCEED);
+        HGOTO_DONE(SUCCEED)
     HDassert(addr != 0);        /* Can't deallocate the superblock :-) */
 
-    /* Check for attempting to free space that's a 'temporary' file address */
-    if(H5F_addr_le(f->shared->tmp_addr, addr))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, FAIL, "attempting to free temporary file space")
+    if(f->shared->first_alloc_dealloc) {
+        HDassert(!H5AC_cache_image_pending(f));
+        if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "tidy of self referential fsm hack failed")
+    } /* end if */
+
+    H5MF_alloc_to_fs_type(f, alloc_type, size, &fs_type);
 
     /* Set the ring type in the DXPL */
-    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+    if(H5MF__fsm_type_is_self_referential(f, fs_type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+
+    /* we are about to change the contents of the free space manager --
+     * notify metadata cache that the associated fsm ring is
+     * unsettled
+     */
+    /* Only do so for strategies that use free-space managers */
+    if(H5F_HAVE_FREE_SPACE_MANAGER(f))
+        if(H5AC_unsettle_ring(f, fsm_ring) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_SYSTEM, FAIL, "attempt to notify cache that ring is unsettled failed")
+
+    /* Check for attempting to free space that's a 'temporary' file address */
+    if(H5F_addr_le(f->shared->tmp_addr, addr))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, FAIL, "attempting to free temporary file space")
 
     /* 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")
+    if(H5FD_MEM_DRAW == alloc_type) {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end if */
+    else {
+        if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    } /* end else */
 
     /* Check if the space to free intersects with the file's metadata accumulator */
     if(H5F__accum_free(&fio_info, alloc_type, addr, size) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't check free space intersection w/metadata accumulator")
 
-    /* Get free space type from allocation type */
-    fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
-#ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: fs_type = %u\n", FUNC, (unsigned)fs_type);
-#endif /* H5MF_ALLOC_DEBUG_MORE */
-
     /* Check if the free space manager for the file has been initialized */
     if(!f->shared->fs_man[fs_type]) {
         /* If there's no free space manager for objects of this type,
@@ -674,7 +1190,7 @@ HDfprintf(stderr, "%s: fs_type = %u\n", FUNC, (unsigned)fs_type);
          *  space is at the end of the file
          */
 #ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)fs_type, f->shared->fs_addr[fs_type]);
+HDfprintf(stderr, "%s: fs_addr = %a\n", FUNC, f->shared->fs_addr[fs_type]);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
         if(!H5F_addr_defined(f->shared->fs_addr[fs_type])) {
             htri_t status;          /* "can absorb" status for section into */
@@ -684,7 +1200,7 @@ HDfprintf(stderr, "%s: Trying to avoid starting up free space manager\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
             /* Try to shrink the file or absorb the block into a block aggregator */
             if((status = H5MF_try_shrink(f, alloc_type, dxpl_id, addr, size)) < 0)
-                HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for absorbing block")
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "can't check for absorbing block")
             else if(status > 0)
                 /* Indicate success */
                 HGOTO_DONE(SUCCEED)
@@ -693,13 +1209,13 @@ HDfprintf(stderr, "%s: Trying to avoid starting up free space manager\n", FUNC);
 HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, addr, size);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
 		HGOTO_DONE(SUCCEED)
-	    }
+	    } /* end else-if */
         } /* end if */
 
         /* If we are deleting the free space manager, leave now, to avoid
          *  [re-]starting it.
-	 * or if file space strategy type is not using a free space manager
-	 *   (H5F_FILE_SPACE_AGGR_VFD or H5F_FILE_SPACE_VFD), drop free space
+         * or if file space strategy type is not using a free space manager
+         *  (H5F_FSPACE_STRATEGY_AGGR or H5F_FSPACE_STRATEGY_NONE), drop free space
          *   section on the floor.
          *
          * Note: this drops the space to free on the floor...
@@ -717,38 +1233,42 @@ HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, a
          *  space isn't at the end of the file, so start up (or create)
          *  the file space manager
          */
-        if(H5MF_alloc_start(f, dxpl_id, fs_type) < 0)
+        if(H5MF_start_fstype(f, dxpl_id, fs_type) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
     } /* end if */
 
-    /* Create free space section for block */
-    if(NULL == (node = H5MF_sect_simple_new(addr, size)))
+    /* Create the free-space section for the freed section */
+    ctype = H5MF_SECT_CLASS_TYPE(f, size);
+    if(NULL == (node = H5MF_sect_new(ctype, addr, size)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
 
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = dxpl_id;
-    udata.alloc_type = alloc_type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE; 
-
-    /* If size of section freed is larger than threshold, add it to the free space manager */
+    /* If size of the freed section 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 */
+
         /* 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;
+        if(H5MF_add_sect(f, alloc_type, dxpl_id, f->shared->fs_man[fs_type], node) < 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 */
+        H5MF_sect_ud_t udata; 	/* User data for callback */
+
+        /* Construct user data for callbacks */
+        udata.f = f;
+        udata.dxpl_id = dxpl_id;
+        udata.alloc_type = alloc_type;
+        udata.allow_sect_absorb = TRUE;
+        udata.allow_eoa_shrink_only = FALSE;
 
         /* 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)
@@ -760,12 +1280,13 @@ HDfprintf(stderr, "%s: After H5FS_sect_add()\n", FUNC);
 
 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")
+    if(reset_ring)
+        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)
+        if(H5MF_sect_free((H5FS_section_info_t *)node) < 0)
             HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
 
 #ifdef H5MF_ALLOC_DEBUG
@@ -774,7 +1295,7 @@ HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 #ifdef H5MF_ALLOC_DEBUG_DUMP
 H5MF_sects_dump(f, dxpl_id, stderr);
 #endif /* H5MF_ALLOC_DEBUG_DUMP */
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5MF_xfree() */
 
 

@@ -782,6 +1303,14 @@ H5MF_sects_dump(f, dxpl_id, stderr);
  * Function:	H5MF_try_extend
  *
  * Purpose:	Extend a block in the file if possible.
+ *          For non-paged aggregation:
+ *          --try to extend at EOA
+ *          --try to extend into the aggregators
+ *          --try to extend into a free-space section if adjoined
+ *          For paged aggregation:
+ *          --try to extend at EOA
+ *          --try to extend into a free-space section if adjoined
+ *          --try to extend into the page end threshold if a metadata block
  *
  * Return:	Success:	TRUE(1)  - Block was extended
  *                              FALSE(0) - Block could not be extended
@@ -796,13 +1325,18 @@ 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 = FAIL;       /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* ring of fsm */
+    haddr_t end;                            /* End of block to extend */
+    H5FD_mem_t  map_type;                   /* Mapped type */
+    H5F_mem_page_t fs_type;                 /* free space type */
+    htri_t allow_extend = TRUE;		    /* Possible to extend the block */
+    hsize_t frag_size = 0;                  /* Size of mis-aligned fragment */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    htri_t ret_value = FALSE;      	    /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering: alloc_type = %u, addr = %a, size = %Hu, extra_requested = %Hu\n", FUNC, (unsigned)alloc_type, addr, size, extra_requested);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -811,204 +1345,152 @@ HDfprintf(stderr, "%s: Entering: alloc_type = %u, addr = %a, size = %Hu, extra_r
     HDassert(f);
     HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
 
+    if(f->shared->first_alloc_dealloc) {
+        HDassert(! H5AC_cache_image_pending(f));
+        if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "tidy of self referential fsm hack failed")
+    } /* end if */
+
     /* Set mapped type, treating global heap as raw data */
     map_type = (alloc_type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : alloc_type;
 
     /* 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")
-    else if(ret_value == FALSE) {
-        H5F_blk_aggr_t *aggr;   /* Aggregator to use */
-
-        /* Check for test block able to extend aggregation block */
-        aggr = (map_type == H5FD_MEM_DRAW) ?  &(f->shared->sdata_aggr) : &(f->shared->meta_aggr);
-        if((ret_value = H5MF_aggr_try_extend(f, aggr, map_type, end, extra_requested)) < 0)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending aggregation block")
-        else if(ret_value == FALSE) {
-            H5FD_mem_t  fs_type;                /* Free space type (mapped from allocation type) */
-
-            /* Get free space type from allocation type */
-            fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
+    /* For paged aggregation:
+     *   To extend a small block: can only extend if not crossing page boundary 
+     *   To extend a large block at EOA: calculate in advance mis-aligned fragment so EOA will still end at page boundary
+     */
+    if(H5F_PAGED_AGGR(f)) {
+        if(size < f->shared->fs_page_size) {
+            /* To extend a small block: cannot cross page boundary */
+            if((addr / f->shared->fs_page_size) != (((end + extra_requested) - 1) / f->shared->fs_page_size))
+                allow_extend = FALSE;
+        } /* end if */
+        else {
+            haddr_t eoa;  /* EOA for the file */
 
-            /* Check if the free space for the file has been initialized */
-            if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type]))
-                if(H5MF_alloc_open(f, dxpl_id, fs_type) < 0)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+            /*   To extend a large block: calculate in advance the mis-aligned fragment so EOA will end at page boundary if extended */
+            if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, alloc_type)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "Unable to get eoa")
+            HDassert(!(eoa % f->shared->fs_page_size));
 
-            /* Check for test block able to block in free space manager */
-            if(f->shared->fs_man[fs_type])
-                if((ret_value = H5FS_sect_try_extend(f, dxpl_id, f->shared->fs_man[fs_type], addr, size, extra_requested)) < 0)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending block in free space manager")
-        } /* end if */
+            H5MF_EOA_MISALIGN(f, (eoa+extra_requested), f->shared->fs_page_size, frag_size);
+        } /* end else */
     } /* 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 */
-#ifdef H5MF_ALLOC_DEBUG_DUMP
-H5MF_sects_dump(f, dxpl_id, stderr);
-#endif /* H5MF_ALLOC_DEBUG_DUMP */
+    /* Get free space type from allocation type */
+    H5MF_alloc_to_fs_type(f, alloc_type, size, &fs_type);
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_try_extend() */
+    /* Set the ring type in the DXPL */
+    if(H5MF__fsm_type_is_self_referential(f, fs_type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5MF_get_freespace
- *
- * Purpose:     Retrieve the amount of free space in a file.
- *
- * Return:      Success:        Amount of free space in file
- *              Failure:        Negative
- *
- * Programmer:  Quincey Koziol
- *              Monday, October  6, 2003
- *
- * Modifications:
- *      Vailin Choi; July 2012
- *      As the default free-list mapping is changed to H5FD_FLMAP_DICHOTOMY,
- *      checks are added to account for the last section of each free-space manager
- *      and the remaining space in the two aggregators are at EOF.
- *-------------------------------------------------------------------------
- */
-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" */
-    haddr_t sda_addr = HADDR_UNDEF;    /* Base "small data aggregator" address */
-    hsize_t sda_size = 0;       /* Size of "small data aggregator" */
-    hsize_t tot_fs_size = 0;    /* Amount of all free space managed */
-    hsize_t tot_meta_size = 0;  /* Amount of metadata for free space managers */
-    H5FD_mem_t type;            /* Memory type for iteration */
-    hbool_t fs_started[H5FD_MEM_NTYPES]; /* Indicate whether the free-space manager has been started */
-    hbool_t eoa_shrank;		/* Whether an EOA shrink occurs */
-    herr_t ret_value = SUCCEED; /* Return value */
+    if(allow_extend) {
+        /* Try extending the block at EOA */
+        if((ret_value = H5F_try_extend(f, dxpl_id, map_type, end, extra_requested + frag_size)) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: extended = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
 
-    FUNC_ENTER_NOAPI(FAIL)
+        /* If extending at EOA succeeds: */
+        /*   for paged aggregation, put the fragment into the large-sized free-space manager */
+        if(ret_value == TRUE && H5F_PAGED_AGGR(f) && frag_size) {
+            H5MF_free_section_t *node = NULL;   /* Free space section pointer */
 
-    /* check args */
-    HDassert(f);
-    HDassert(f->shared);
-    HDassert(f->shared->lf);
+            /* Should be large-sized block */
+            HDassert(size >= f->shared->fs_page_size);
 
-    /* Retrieve the 'eoa' for the file */
-    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_DEFAULT)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+            /* Start up the free-space manager */
+            if(!(f->shared->fs_man[fs_type]))
+                if(H5MF_start_fstype(f, dxpl_id, fs_type) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free 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")
+            /* Create free space section for the fragment */
+            if(NULL == (node = H5MF_sect_new(H5MF_FSPACE_SECT_LARGE, end + extra_requested, frag_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
 
-    /* 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")
+            /* Add the fragment to the large-sized free-space manager */
+            if(H5MF_add_sect(f, alloc_type, dxpl_id, f->shared->fs_man[fs_type], node) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't re-add section to file free space")
 
-    /* Retrieve 'small data' aggregator info, if available */
-    if(H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
+            node = NULL;
+        } /* end if */
 
-    /* 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)) {
+        /* For non-paged aggregation: try to extend into the aggregators */
+        if(ret_value == FALSE && (f->shared->fs_strategy == H5F_FSPACE_STRATEGY_FSM_AGGR ||
+                                  f->shared->fs_strategy == H5F_FSPACE_STRATEGY_AGGR) ) {
+            H5F_blk_aggr_t *aggr;   /* Aggregator to use */
 
-	fs_started[type] = FALSE;
+            /* Check if the block is able to extend into aggregation block */
+            aggr = (map_type == H5FD_MEM_DRAW) ?  &(f->shared->sdata_aggr) : &(f->shared->meta_aggr);
+            if((ret_value = H5MF_aggr_try_extend(f, dxpl_id, aggr, map_type, end, extra_requested)) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending aggregation block")
 
-	/* Check if the free space for the file has been initialized */
-        if(!f->shared->fs_man[type] && H5F_addr_defined(f->shared->fs_addr[type])) {
-            if(H5MF_alloc_open(f, dxpl_id, type) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
-            HDassert(f->shared->fs_man[type]);
-            fs_started[type] = TRUE;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: H5MF_aggr_try_extend = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
         } /* end if */
 
-	/* Check if there's free space of this type */
-        if(f->shared->fs_man[type]) {
-            hsize_t type_fs_size = 0;    /* Amount of free space managed for each type */
-            hsize_t type_meta_size = 0;  /* Amount of free space metadata for each type */
-
-            /* Retrieve free space size from free space manager */
-            if(H5FS_sect_stats(f->shared->fs_man[type], &type_fs_size, NULL) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space stats")
-            if(H5FS_size(f, f->shared->fs_man[type], &type_meta_size) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space metadata stats")
+        /* If no extension so far, try to extend into a free-space section */
+        if(ret_value == FALSE && ((f->shared->fs_strategy == H5F_FSPACE_STRATEGY_FSM_AGGR) ||
+                                  (H5F_PAGED_AGGR(f))) ) {
+            H5MF_sect_ud_t udata;       /* User data */
 
-            /* Increment total free space for types */
-            tot_fs_size += type_fs_size;
-            tot_meta_size += type_meta_size;
-	} /* end if */
-    } /* end for */
+            /* Construct user data for callbacks */
+            udata.f = f;
+            udata.dxpl_id = dxpl_id;
+            udata.alloc_type = alloc_type;
 
-    /* Iterate until no more EOA shrink occurs */
-    do {
-	eoa_shrank = FALSE;
+            /* Check if the free space for the file has been initialized */
+            if(!f->shared->fs_man[fs_type] && H5F_addr_defined(f->shared->fs_addr[fs_type]))
+                /* Open the free-space manager */
+                if(H5MF_open_fstype(f, dxpl_id, fs_type) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
 
-	/* Check the last section of each free-space manager */
-	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
-	    haddr_t sect_addr = HADDR_UNDEF;
-	    hsize_t sect_size = 0;
-
-	    if(f->shared->fs_man[type]) {
-		if(H5FS_sect_query_last_sect(f->shared->fs_man[type], &sect_addr, &sect_size) < 0)
-		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query last section on merge list")
-
-		/* Deduct space from previous accumulation if the section is at EOA */
-		if(H5F_addr_eq(sect_addr + sect_size, eoa)) {
-		    eoa = sect_addr;
-		    eoa_shrank = TRUE;
-		    tot_fs_size -= sect_size;
-		} /* end if */
-	    } /* end if */
-	} /* end for */
-
-	/* Check the metadata and raw data aggregators */
-	if(ma_size > 0 && H5F_addr_eq(ma_addr + ma_size, eoa)) {
-	    eoa = ma_addr;
-	    eoa_shrank = TRUE;
-	    ma_size = 0;
-	} /* end if */
-	if(sda_size > 0 && H5F_addr_eq(sda_addr + sda_size, eoa)) {
-	    eoa = sda_addr;
-	    eoa_shrank = TRUE;
-	    sda_size = 0;
-	} /* end if */
-    } while(eoa_shrank);
+            /* Try to extend the block into a free-space section */
+            if(f->shared->fs_man[fs_type]) {
+                if((ret_value = H5FS_sect_try_extend(f, dxpl_id, f->shared->fs_man[fs_type], addr, size, extra_requested, H5FS_ADD_RETURNED_SPACE, &udata)) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending block in free space manager")
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Try to H5FS_sect_try_extend = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            } /* end if */
 
-    /* Close the free-space managers if they were opened earlier in this routine */
-    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
-	if(fs_started[type])
-            if(H5MF_alloc_close(f, dxpl_id, type) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't close file free space")
-    } /* end for */
+            /* For paged aggregation and a metadata block: try to extend into page end threshold */
+            if(ret_value == FALSE && H5F_PAGED_AGGR(f) && map_type != H5FD_MEM_DRAW) {
+                H5MF_EOA_MISALIGN(f, end, f->shared->fs_page_size, frag_size);
 
-    /* Set the value(s) to return */
-    /* (The metadata & small data aggregators count as free space now, since they aren't at EOA) */
-    if(tot_space)
-	*tot_space = tot_fs_size + ma_size + sda_size;
-    if(meta_size)
-	*meta_size = tot_meta_size;
+                if(frag_size <= H5F_PGEND_META_THRES(f) && extra_requested <= frag_size)
+                    ret_value = TRUE;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Try to extend into the page end threshold = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+            } /* end if */
+        } /* end if */
+    } /* allow_extend */
 
 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")
+    if(reset_ring)
+        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() */
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG */
+#ifdef H5MF_ALLOC_DEBUG_DUMP
+H5MF_sects_dump(f, dxpl_id, stderr);
+#endif /* H5MF_ALLOC_DEBUG_DUMP */
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_try_extend() */
 
 

 /*-------------------------------------------------------------------------
@@ -1031,11 +1513,15 @@ 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 */
+    H5FS_section_class_t *sect_cls;	/* Section class */
     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 */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    H5AC_ring_t fsm_ring = H5AC_RING_INV;   /* Ring of fsm */
+    H5F_mem_page_t fs_type;                 /* Free space type */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    htri_t ret_value = FAIL;                /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)alloc_type, addr, size);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -1047,12 +1533,24 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     HDassert(H5F_addr_defined(addr));
     HDassert(size > 0);
 
+    /* Set up free-space section class information */
+    sect_cls = H5MF_SECT_CLS_TYPE(f, size);
+    HDassert(sect_cls);
+
+    /* Get free space type from allocation type */
+    H5MF_alloc_to_fs_type(f, alloc_type, size, &fs_type);
+
     /* Set the ring type in the DXPL */
-    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+    if(H5MF__fsm_type_is_self_referential(f, fs_type))
+        fsm_ring = H5AC_RING_MDFSM;
+    else
+        fsm_ring = H5AC_RING_RDFSM;
+    if(H5AC_set_ring(dxpl_id, fsm_ring, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
 
-    /* Create free space section for block */
-    if(NULL == (node = H5MF_sect_simple_new(addr, size)))
+    /* Create free-space section for block */
+    if(NULL == (node = H5MF_sect_new(sect_cls->type, addr, size)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
 
     /* Construct user data for callbacks */
@@ -1060,113 +1558,101 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     udata.dxpl_id = dxpl_id;
     udata.alloc_type = alloc_type;
     udata.allow_sect_absorb = FALSE;    /* Force section to be absorbed into aggregator */
-    udata.allow_eoa_shrink_only = FALSE; 
-
-    /* Call the "can shrink" callback for the section */
-    if((ret_value = H5MF_sect_simple_can_shrink((const H5FS_section_info_t *)node, &udata)) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "can't check if section can shrink container")
-    else if(ret_value > 0) {
-        /* Shrink or absorb the section */
-        if(H5MF_sect_simple_shrink((H5FS_section_info_t **)&node, &udata) < 0)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink container")
+    udata.allow_eoa_shrink_only = FALSE;
+
+    /* Check if the block can shrink the container */
+    if(sect_cls->can_shrink) {
+        if((ret_value = (*sect_cls->can_shrink)((const H5FS_section_info_t *)node, &udata)) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTMERGE, FAIL, "can't check if section can shrink container")
+        if(ret_value > 0) {
+            HDassert(sect_cls->shrink);
+
+            if((*sect_cls->shrink)((H5FS_section_info_t **)&node, &udata) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink container")
+        } /* end if */
     } /* 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")
+    if(reset_ring)
+        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)
+    if(node && H5MF_sect_free((H5FS_section_info_t *)node) < 0)
         HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
 
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 #endif /* H5MF_ALLOC_DEBUG */
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5MF_try_shrink() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_close_shrink_eoa
+ * Function:    H5MF_close
  *
- * Purpose:     Shrink the EOA while closing
+ * Purpose:     Close the free space tracker(s) for a file:
+ *              paged or non-paged aggregation
  *
  * Return:	SUCCEED/FAIL
  *
- * Programmer:  Quincey Koziol
- *              Saturday, July 7, 2012
+ * Programmer:  Vailin Choi; Dec 2012
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5MF_close_shrink_eoa(H5F_t *f, hid_t dxpl_id)
+herr_t
+H5MF_close(H5F_t *f, hid_t dxpl_id)
 {
-    H5FD_mem_t type;            /* Memory type for iteration */
-    hbool_t eoa_shrank;		/* Whether an EOA shrink occurs */
-    htri_t status;		/* Status value */
-    H5MF_sect_ud_t udata;	/* User data for callback */
-    herr_t ret_value = SUCCEED;	/* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
 
     /* check args */
     HDassert(f);
     HDassert(f->shared);
 
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = dxpl_id;
-    udata.allow_sect_absorb = FALSE;    
-    udata.allow_eoa_shrink_only = TRUE; 
-
-    /* Iterate until no more EOA shrinking occurs */
-    do {
-	eoa_shrank = FALSE;
-
-	/* Check the last section of each free-space manager */
-	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
-	    if(f->shared->fs_man[type]) {
-		udata.alloc_type = type;
-		if((status = H5FS_sect_try_shrink_eoa(f, dxpl_id, f->shared->fs_man[type], &udata)) < 0)
-		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
-		else if(status > 0)
-		    eoa_shrank = TRUE;
-	    } /* end if */
-	} /* end for */
-
-	/* check the two aggregators */
-	if((status = H5MF_aggrs_try_shrink_eoa(f, dxpl_id)) < 0)
-	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
-	else if(status > 0)
-	    eoa_shrank = TRUE;
-    } while(eoa_shrank);
+    if(H5F_PAGED_AGGR(f)) {
+        if((ret_value = H5MF__close_pagefs(f, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't close free-space managers for 'page' file space")
+    } /* end if */
+    else {
+        if((ret_value = H5MF__close_aggrfs(f, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't close free-space managers for 'aggr' file space")
+    } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_close_shrink_eoa() */
 
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Leaving\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_close_delete
+ * Function:    H5MF__close_delete_fstype
  *
- * Purpose:     The coding is copied from H5MF_close() "else" statement
- *		to this routine so it can also be called by H5MF_try_close().
+ * Purpose:     Common code for closing and deleting the freespace manager
+ *              of TYPE for file.
+ *              Note that TYPE can be H5F_mem_page_t or H5FD_mem_t enum types.
  *
  * Return:	SUCCEED/FAIL
  *
- * Programmer:  
+ * Programmer:	Vailin Choi
+ *              Jan 2016
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_close_delete(H5F_t *f, hid_t dxpl_id)
+H5MF__close_delete_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type)
 {
-    H5FD_mem_t type;                    /* Memory type for iteration */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -1174,76 +1660,48 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
     /* check args */
     HDassert(f);
     HDassert(f->shared);
+    if(H5F_PAGED_AGGR(f))
+        HDassert(type < H5F_MEM_PAGE_NTYPES);
+    else
+        HDassert((H5FD_mem_t)type < H5FD_MEM_NTYPES);
 
-    /* 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]) {
-#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 */
-#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 */
-	    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;
 
-		/* 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;
+    /* If the free space manager for this type is open, close it */
+    if(f->shared->fs_man[type])
+        if(H5MF__close_fstype(f, dxpl_id, type) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't close the free space manager")
 
 #ifdef H5MF_ALLOC_DEBUG_MORE
-HDfprintf(stderr, "%s: Before deleting free space manager\n", FUNC);
+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 */
 
-		/* 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;
-
-		/* 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 */
+    /* If there is free space manager info for this type, delete it */
+    if(H5F_addr_defined(f->shared->fs_addr[type]))
+        if(H5MF__delete_fstype(f, dxpl_id, type) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't delete the free space manager")
 
 done:
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5MF_close_delete() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5MF__close_delete() */
 
 

 /*-------------------------------------------------------------------------
  * Function:    H5MF_try_close
  *
  * Purpose:     This is called by H5Fformat_convert() to close and delete
- *		free-space managers when downgrading persistent free-space
- *		to non-persistent.
+ *              free-space managers when downgrading persistent free-space
+ *              to non-persistent.
  *
  * Return:	SUCCEED/FAIL
  *
- * Programmer:  
+ * Programmer:	Vailin Choi
+ *              Jan 2016
  *
  *-------------------------------------------------------------------------
  */
@@ -1251,10 +1709,13 @@ herr_t
 H5MF_try_close(H5F_t *f, hid_t dxpl_id)
 {
     H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration  */
     H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -1262,53 +1723,125 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
     /* check args */
     HDassert(f);
 
-    /* Set the ring type in the DXPL */
-    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+    /* If there have been no file space allocations / deallocation so 
+     * far, must call H5MF_tidy_self_referential_fsm_hack() to float 
+     * all self referential FSMs and release file space allocated to
+     * them.  Otherwise, the function will be called after the format
+     * conversion, and will become very confused.
+     *
+     * The situation is further complicated if a cache image exists
+     * and had not yet been loaded into the metadata cache.  In this
+     * case, call H5AC_force_cache_image_load() instead of 
+     * H5MF_tidy_self_referential_fsm_hack().  H5AC_force_cache_image_load()
+     * will load the cache image, and then call 
+     * H5MF_tidy_self_referential_fsm_hack() to discard the cache image 
+     * block.
+     */
+    if(f->shared->first_alloc_dealloc) {
+        if(H5AC_cache_image_pending(f)) {
+            if(H5AC_force_cache_image_load(f, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "forced cache image load failed")
+        } /* end if */
+        else {
+            if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "tidy of self referential fsm hack failed")
+        } /* end else */
+    } /* end if */
+
+    /* Set the ring type in the DXPL.  In most cases, we will
+     * need H5AC_RING_RDFSM, so initialy set the ring in
+     * the DXPL to that value.  We will alter this later if
+     * needed.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
+
+    if(H5F_PAGED_AGGR(f)) {
+        H5F_mem_page_t ptype; 	/* Memory type for iteration */
+
+        /* Iterate over all the free space types that have managers and 
+         * get each free list's space 
+         */
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype)) {
+            /* Test to see if we need to switch rings -- do so if required */
+            if(H5MF__fsm_type_is_self_referential(f, ptype))
+                needed_ring = H5AC_RING_MDFSM;
+            else
+                needed_ring = H5AC_RING_RDFSM;
+
+            if(needed_ring != curr_ring ) {
+                if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+                curr_ring = needed_ring;
+            } /* end if */
+
+            if(H5MF__close_delete_fstype(f, dxpl_id, ptype) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't close the free space manager")
+        } /* end for */
+    } /* end if */
+    else {
+        H5FD_mem_t type;          	/* Memory type for iteration */
+
+        /* 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)) {
+            /* test to see if we need to switch rings -- do so if required */
+            if(H5MF__fsm_type_is_self_referential(f, (H5F_mem_page_t)type))
+                needed_ring = H5AC_RING_MDFSM;
+            else
+                needed_ring = H5AC_RING_RDFSM;
+
+            if(needed_ring != curr_ring) {
+                if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+                curr_ring = needed_ring;
+            } /* end if */
 
-    if(H5MF_close_delete(f, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to close delete free-space managers")
+            if(H5MF__close_delete_fstype(f, dxpl_id, (H5F_mem_page_t)type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't close the free space manager")
+        } /* end for */
+    } /* 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")
+    if(reset_ring)
+        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)
-
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5MF_try_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_close
+ * Function:    H5MF__close_aggrfs
  *
- * Purpose:     Close the free space tracker(s) for a file
+ * Purpose:     Close the free space tracker(s) for a file: non-paged aggregation
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              Tuesday, January 22, 2008
  *
- * Modifications:
- *      Vailin Choi; July 2012
- *      As the default free-list mapping is changed to H5FD_FLMAP_DICHOTOMY,
- *      modifications are needed to shrink EOA if the last section of each free-space manager
- *      and the remaining space in the two aggregators are at EOA.
-
  *-------------------------------------------------------------------------
  */
-herr_t
-H5MF_close(H5F_t *f, hid_t dxpl_id)
+static herr_t
+H5MF__close_aggrfs(H5F_t *f, hid_t dxpl_id)
 {
     H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration.  */
     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 */
+    H5FD_mem_t type;          	        /* Memory type for iteration */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;	        /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Entering\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -1319,114 +1852,122 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
     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)
+    /* Set the ring type in the DXPL.  In most cases, we will
+     * need H5AC_RING_RDFSM, so initialy set the ring in
+     * the DXPL to that value.  We will alter this later if
+     * needed.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
 
     /* Free the space in aggregators */
-    /* (for space not at EOF, it may be put into free space managers) */
+    /* (for space not at EOA, it may be put into free space managers) */
     if(H5MF_free_aggrs(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't free aggregators")
 
     /* Trying shrinking the EOA for the file */
-    if(H5MF_close_shrink_eoa(f, dxpl_id) < 0)
+    if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
 
     /* 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 */
+            && f->shared->fs_persist) {
+        H5O_fsinfo_t fsinfo;	/* File space info message */
+        haddr_t final_eoa;      /* Final eoa -- for sanity check */
+        H5F_mem_page_t ptype;   /* Memory type for iteration */
 
-        /* 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")
+        /* superblock extension and free space manager message should
+         * exist at this point -- verify at least the former.
+         */
+        HDassert(H5F_addr_defined(f->shared->sblock->ext_addr));
 
-	/* 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 */
+        /* file space for all non-empty free space managers should be 
+         * allocated at this point, and these free space managers should
+         * be written to file and thus their headers and section info 
+         * entries in the metadata cache should be clean.
+         */
 
-	    /* 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, H5O_FSINFO_ID, &fsinfo, 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 */
+        /* gather data for the free space manager superblock extension message.
+         *
+         * In passing, verify that all the free space managers are closed.
+         */
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+            fsinfo.fs_addr[ptype - 1] = HADDR_UNDEF;
+        for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+            fsinfo.fs_addr[type-1] = f->shared->fs_addr[type];
+        fsinfo.strategy = f->shared->fs_strategy;
+        fsinfo.persist = f->shared->fs_persist;
+        fsinfo.threshold = f->shared->fs_threshold;
+        fsinfo.page_size = f->shared->fs_page_size;
+        fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
+        fsinfo.eoa_pre_fsm_fsalloc = f->shared->eoa_pre_fsm_fsalloc;
+
+        /* Write the free space manager message -- message must already exist */
+        if(H5F_super_ext_write_msg(f, dxpl_id, H5O_FSINFO_ID, &fsinfo, FALSE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+
+        /* Close the free space managers */
+        for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, 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, H5O_FSINFO_ID, &fsinfo, 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 */
+                /* test to see if we need to switch rings -- do 
+                 * so if required 
+                 */
+                if(H5MF__fsm_type_is_self_referential(f, (H5F_mem_page_t)type))
+                    needed_ring = H5AC_RING_MDFSM;
+                else 
+                    needed_ring = H5AC_RING_RDFSM;
+
+                if(needed_ring != curr_ring) {
+                    if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+                    curr_ring = needed_ring;
+                } /* end if */
 
-	if(H5MF_close_delete(f, dxpl_id) < 0)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+                HDassert(f->shared->fs_state[type] == H5F_FS_STATE_OPEN);
+
+                if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, 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 */
+
+        /* verify that we haven't dirtied any metadata cache entries
+         * from the metadata free space manager ring out.
+         */
+        HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
+
+        /* verify that the aggregators are still shutdown. */
+        HDassert(f->shared->sdata_aggr.tot_size == 0);
+        HDassert(f->shared->sdata_aggr.addr == 0);
+        HDassert(f->shared->sdata_aggr.size == 0);
+
+        HDassert(f->shared->meta_aggr.tot_size == 0);
+        HDassert(f->shared->meta_aggr.addr == 0);
+        HDassert(f->shared->meta_aggr.size == 0);
+
+        /* Trying shrinking the EOA for the file */
+        /* (in case any free space is now at the EOA) */
+        if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
 
+        /* get the eoa, and verify that it has the expected value */
+        if(HADDR_UNDEF == (final_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)) )
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+
+        /* f->shared->eoa_post_fsm_fsalloc is undefined if there has 
+         * been no file space allocation or deallocation since file 
+         * open.
+         */
+        HDassert((f->shared->first_alloc_dealloc) || (final_eoa == f->shared->eoa_post_fsm_fsalloc));
+    } /* end if */
+    else {  /* super_vers can be 0, 1, 2 */
+        for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+            if(H5MF__close_delete_fstype(f, dxpl_id, (H5F_mem_page_t)type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
     } /* end else */
 
     /* Free the space in aggregators (again) */
@@ -1436,92 +1977,544 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
 
     /* Trying shrinking the EOA for the file */
     /* (in case any free space is now at the EOA) */
-    if(H5MF_close_shrink_eoa(f, dxpl_id) < 0)
+    if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
         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")
+    if(reset_ring)
+        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() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF__close_aggrfs() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_sects_cb()
+ * Function:    H5MF__close_pagefs
  *
- * Purpose:	Iterator callback for each free-space section
- *		Retrieve address and size into user data
+ * Purpose:     Close the free space tracker(s) for a file: paged aggregation
  *
- * Return:	Always succeed
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:  Vailin Choi
- *	        July 1st, 2009
+ * Programmer:  Vailin Choi; Dec 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_sects_cb(H5FS_section_info_t *_sect, void *_udata)
+H5MF__close_pagefs(H5F_t *f, hid_t dxpl_id)
 {
-    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;
-    H5MF_sect_iter_ud_t *udata = (H5MF_sect_iter_ud_t *)_udata;
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* ring value needed for this
+                                                 * iteration.
+                                                 */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5F_mem_page_t ptype; 	/* Memory type for iteration */
+    H5O_fsinfo_t fsinfo;	/* File space info message */
+    hbool_t reset_ring = FALSE; /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;	/* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: Entering\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG */
 
-    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++;
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+    HDassert(f->shared->sblock);
+    HDassert(f->shared->fs_page_size);
+    HDassert(f->shared->sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+
+    /* Set the ring type in the DXPL.  In most cases, we will
+     * need H5AC_RING_RDFSM, so initialy set the ring in
+     * the DXPL to that value.  We will alter this later if
+     * needed.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
+
+    /* Trying shrinking the EOA for the file */
+    if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+    /* Set up file space info message */
+    fsinfo.strategy = f->shared->fs_strategy;
+    fsinfo.persist = f->shared->fs_persist;
+    fsinfo.threshold = f->shared->fs_threshold;
+    fsinfo.page_size = f->shared->fs_page_size;
+    fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
+    fsinfo.eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+    for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+        fsinfo.fs_addr[ptype - 1] = HADDR_UNDEF;
+
+    if(f->shared->fs_persist) {
+        haddr_t final_eoa;              /* final eoa -- for sanity check */
+
+        /* superblock extension and free space manager message should
+         * exist at this point -- verify at least the former.
+         */
+        HDassert(H5F_addr_defined(f->shared->sblock->ext_addr));
+
+        /* file space for all non-empty free space managers should be
+         * allocated at this point, and these free space managers should
+         * be written to file and thus their headers and section info
+         * entries in the metadata cache should be clean.
+         */
+
+        /* gather data for the free space manager superblock extension message.
+         * Only need addresses of FSMs and eoa prior to allocation of
+         * file space for the self referential free space managers.  Other 
+         * data was gathered above.
+         */
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+            fsinfo.fs_addr[ptype-1] = f->shared->fs_addr[ptype];
+        fsinfo.eoa_pre_fsm_fsalloc = f->shared->eoa_pre_fsm_fsalloc;
+
+        /* Write the free space manager message -- message must already exist */
+        if(H5F_super_ext_write_msg(f, dxpl_id, H5O_FSINFO_ID, &fsinfo, FALSE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+
+        /* Close the free space managers */
+        /* use H5MF__close_fstype() for this? */
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype)) {
+            if(f->shared->fs_man[ptype]) {
+                /* test to see if we need to switch rings -- do
+                 * so if required
+                 */
+                if(H5MF__fsm_type_is_self_referential(f, ptype))
+                    needed_ring = H5AC_RING_MDFSM;
+                else
+                    needed_ring = H5AC_RING_RDFSM;
+
+                if(needed_ring != curr_ring) {
+                    if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+                    curr_ring = needed_ring;
+                } /* end if */
+
+                HDassert(f->shared->fs_state[ptype] == H5F_FS_STATE_OPEN);
+
+                if(H5FS_close(f, dxpl_id, f->shared->fs_man[ptype]) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't close free space manager")
+                f->shared->fs_man[ptype] = NULL;
+                f->shared->fs_state[ptype] = H5F_FS_STATE_CLOSED;
+            } /* end if */
+            f->shared->fs_addr[ptype] = HADDR_UNDEF;
+        } /* end for */
+
+        /* verify that we haven't dirtied any metadata cache entries
+         * from the metadata free space manager ring out.
+         */
+        HDassert(H5AC_cache_is_clean(f, H5AC_RING_MDFSM));
+
+        /* Trying shrinking the EOA for the file */
+        /* (in case any free space is now at the EOA) */
+        if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+        /* get the eoa, and verify that it has the expected value */
+        if(HADDR_UNDEF == (final_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)) )
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+
+        /* f->shared->eoa_post_fsm_fsalloc is undefined if there has
+         * been no file space allocation or deallocation since file
+         * open.
+         *
+         * If there is a cache image in the file at file open, 
+         * f->shared->first_alloc_dealloc will always be FALSE unless 
+         * the file is opened R/O, as otherwise, the image will have been
+         * read and discarded by this point.
+         *
+         * If a cache image was created on file close, the actual EOA 
+         * should be in f->shared->eoa_post_mdci_fsalloc.  Note that in 
+         * this case, it is conceivable that f->shared->first_alloc_dealloc
+         * will still be TRUE, as the cache image is allocated directly from
+         * the file driver layer.  However, as this possibility seems remote,
+         * it is ignored in the following assert.
+         */
+        HDassert((f->shared->first_alloc_dealloc) ||
+                 (final_eoa == f->shared->eoa_post_fsm_fsalloc) ||
+                 ((H5F_addr_defined(f->shared->eoa_post_mdci_fsalloc)) &&
+                  (final_eoa == f->shared->eoa_post_mdci_fsalloc)));
     } /* end if */
+    else {
+        /* Iterate over all the free space types that have managers 
+         * and get each free list's space 
+         */
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+            if(H5MF__close_delete_fstype(f, dxpl_id, ptype) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't close the free space manager")
+
+        /* Write file space 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, H5O_FSINFO_ID, &fsinfo, FALSE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+    } /* end else */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5MF_sects_cb() */
+    /* Trying shrinking the EOA for the file */
+    /* (in case any free space is now at the EOA) */
+    if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        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_TAG(ret_value, FAIL)
+} /* end H5MF__close_pagefs() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_get_free_sections()
+ * Function:    H5MF__close_shrink_eoa
  *
- * Purpose: 	To iterate over one or all free-space managers for:
- *			# of sections
- *			section info as defined in H5F_sect_info_t
+ * Purpose:     Shrink the EOA while closing
  *
  * Return:	SUCCEED/FAIL
  *
- * Programmer:  Vailin Choi
- *	        July 1st, 2009
+ * Programmer:  Quincey Koziol
+ *              Saturday, July 7, 2012
  *
  *-------------------------------------------------------------------------
  */
-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)
+static herr_t
+H5MF__close_shrink_eoa(H5F_t *f, hid_t dxpl_id)
 {
-    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 curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration.  */
     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 */
+    H5F_mem_t type;
+    H5F_mem_page_t ptype;        /* Memory type for iteration */
+    hbool_t eoa_shrank;		/* Whether an EOA shrink occurs */
+    htri_t status;		/* Status value */
+    H5MF_sect_ud_t udata;	/* User data for callback */
+    hbool_t reset_ring = FALSE; /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;	/* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Construct user data for callbacks */
+    udata.f = f;
+    udata.dxpl_id = dxpl_id;
+    udata.allow_sect_absorb = FALSE;
+    udata.allow_eoa_shrink_only = TRUE;
+
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value(1)")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
+
+    /* Iterate until no more EOA shrinking occurs */
+    do {
+	eoa_shrank = FALSE;
+
+        if(H5F_PAGED_AGGR(f)) {
+            /* Check the last section of each free-space manager */
+            for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype)) {
+                if(f->shared->fs_man[ptype]) {
+                    /* Test to see if we need to switch rings -- do so if required */
+                    if(H5MF__fsm_type_is_self_referential(f, ptype))
+                        needed_ring = H5AC_RING_MDFSM;
+                    else
+                        needed_ring = H5AC_RING_RDFSM;
+
+                    if(needed_ring != curr_ring) {
+                        if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+                        curr_ring = needed_ring;
+                    } /* end if */
+
+                    udata.alloc_type = (H5FD_mem_t)((H5FD_mem_t)ptype < H5FD_MEM_NTYPES ? ptype : ((ptype % H5FD_MEM_NTYPES) + 1));
+
+                    if((status = H5FS_sect_try_shrink_eoa(f, dxpl_id, f->shared->fs_man[ptype], &udata)) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+                    else if(status > 0)
+                        eoa_shrank = TRUE;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+        else {
+            /* Check the last section of each free-space manager */
+            for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+                if(f->shared->fs_man[type]) {
+                    /* Test to see if we need to switch rings -- do so if required */
+                    if(H5MF__fsm_type_is_self_referential(f, (H5F_mem_page_t)type))
+                        needed_ring = H5AC_RING_MDFSM;
+                    else
+                        needed_ring = H5AC_RING_RDFSM;
+
+                    if(needed_ring != curr_ring) {
+                        if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+                        curr_ring = needed_ring;
+                    } /* end if */
+
+                    udata.alloc_type = type;
+
+                    if((status = H5FS_sect_try_shrink_eoa(f, dxpl_id, f->shared->fs_man[type], &udata)) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+                else if(status > 0)
+                    eoa_shrank = TRUE;
+                } /* end if */
+            } /* end for */
+
+            /* check the two aggregators */
+            if((status = H5MF_aggrs_try_shrink_eoa(f, dxpl_id)) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
+            else if(status > 0)
+                eoa_shrank = TRUE;
+        } /* end else */
+    } while(eoa_shrank);
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF__close_shrink_eoa() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_get_freespace
+ *
+ * Purpose:     Retrieve the amount of free space in the file
+ *
+ * Return:      Success:        Amount of free space in file
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, October  6, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_size)
+{
+    haddr_t ma_addr = HADDR_UNDEF;  /* Base "metadata aggregator" address */
+    hsize_t ma_size = 0;            /* Size of "metadata aggregator" */
+    haddr_t sda_addr = HADDR_UNDEF; /* Base "small data aggregator" address */
+    hsize_t sda_size = 0;           /* Size of "small data aggregator" */
+    hsize_t tot_fs_size = 0;        /* Amount of all free space managed */
+    hsize_t tot_meta_size = 0;      /* Amount of metadata for free space managers */
+    H5FD_mem_t tt;                  /* Memory type for iteration */
+    H5F_mem_page_t type;            /* Memory type for iteration */
+    H5F_mem_page_t start_type;      /* Memory type for iteration */
+    H5F_mem_page_t end_type;        /* Memory type for iteration */
+    htri_t fs_started[H5F_MEM_PAGE_NTYPES]; /* Indicate whether the free-space manager has been started */
+    haddr_t fs_eoa[H5FD_MEM_NTYPES];        /* EAO for each free-space manager */
+    H5P_genplist_t *dxpl = NULL;            /* DXPL for setting ring */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration.  */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;  /* Original ring value */
+    hbool_t reset_ring = FALSE;             /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /* check args */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->lf);
 
+    /* Set the ring type in the DXPL.  In most cases, we will
+     * need H5AC_RING_RDFSM, so initialy set the ring in
+     * the DXPL to that value.  We will alter this later if
+     * needed.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
+
     /* Determine start/end points for loop */
+    if(H5F_PAGED_AGGR(f)) {
+        start_type = H5F_MEM_PAGE_META;
+        end_type = H5F_MEM_PAGE_NTYPES;
+    } /* end if */
+    else {
+        start_type = (H5F_mem_page_t)H5FD_MEM_SUPER;
+        end_type = (H5F_mem_page_t)H5FD_MEM_NTYPES;
+    } /* end else */
+
+    for(tt = H5FD_MEM_SUPER; tt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, tt))
+        if(HADDR_UNDEF == (fs_eoa[tt] = H5F_get_eoa(f, tt)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    if(!H5F_PAGED_AGGR(f)) {
+        /* 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")
+
+        /* Retrieve 'small data' aggregator info, if available */
+        if(H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
+    } /* end if */
+
+    /* Iterate over all the free space types that have managers and get each free list's space */
+    for(type = start_type; type < end_type; H5_INC_ENUM(H5F_mem_page_t, type)) {
+        fs_started[type] = FALSE;
+
+        /* Check if the free space for the file has been initialized */
+        if(!f->shared->fs_man[type] && H5F_addr_defined(f->shared->fs_addr[type])) {
+            if(H5MF_open_fstype(f, dxpl_id, type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+            HDassert(f->shared->fs_man[type]);
+            fs_started[type] = TRUE;
+        } /* end if */
+
+        /* test to see if we need to switch rings -- do
+         * so if required
+         */
+        if(H5MF__fsm_type_is_self_referential(f, (H5F_mem_page_t)type))
+            needed_ring = H5AC_RING_MDFSM;
+        else
+            needed_ring = H5AC_RING_RDFSM;
+
+        if(needed_ring != curr_ring) {
+            if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+            curr_ring = needed_ring;
+        } /* end if */
+
+        /* Check if there's free space of this type */
+        if(f->shared->fs_man[type]) {
+            hsize_t type_fs_size = 0;    /* Amount of free space managed for each type */
+            hsize_t type_meta_size = 0;  /* Amount of free space metadata for each type */
+
+            /* Retrieve free space size from free space manager */
+            if(H5FS_sect_stats(f->shared->fs_man[type], &type_fs_size, NULL) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space stats")
+            if(H5FS_size(f, f->shared->fs_man[type], &type_meta_size) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space metadata stats")
+
+            /* Increment total free space for types */
+            tot_fs_size += type_fs_size;
+            tot_meta_size += type_meta_size;
+        } /* end if */
+    } /* end for */
+
+    /* Close the free-space managers if they were opened earlier in this routine */
+    for(type = start_type; type < end_type; H5_INC_ENUM(H5F_mem_page_t, type)) {
+        /* Test to see if we need to switch rings -- do so if required */
+        if(H5MF__fsm_type_is_self_referential(f, (H5F_mem_page_t)type))
+            needed_ring = H5AC_RING_MDFSM;
+        else
+            needed_ring = H5AC_RING_RDFSM;
+
+        if(needed_ring != curr_ring) {
+            if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+            curr_ring = needed_ring;
+        } /* end if */
+
+        if(fs_started[type])
+            if(H5MF__close_fstype(f, dxpl_id, type) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't close file free space")
+    } /* end for */
+
+    /* Set the value(s) to return */
+    /* (The metadata & small data aggregators count as free space now, since they aren't at EOA) */
+    if(tot_space)
+        *tot_space = tot_fs_size + ma_size + sda_size;
+    if(meta_size)
+        *meta_size = tot_meta_size;
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5MF_get_freespace() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_get_free_sections()
+ *
+ * Purpose: 	To retrieve free-space section information for
+ *              paged or non-paged aggregation
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    H5P_genplist_t *dxpl = NULL;                /* DXPL for setting ring */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration.  */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    size_t total_sects = 0;                     /* Total number of sections */
+    H5MF_sect_iter_ud_t sect_udata;             /* User data for callback */
+    H5F_mem_page_t start_type, end_type;        /* Memory types to iterate over */
+    H5F_mem_page_t ty;                          /* Memory type for iteration */
+    hbool_t reset_ring = FALSE;                 /* Whether the ring was set */
+    ssize_t ret_value = -1;                     /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, -1)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* H5MF_tidy_self_referential_fsm_hack() will fail if any self 
+     * referential FSM is opened prior to the call to it.  Thus call
+     * it here if necessary and if it hasn't been called already.
+     *
+     * The situation is further complicated if a cache image exists
+     * and had not yet been loaded into the metadata cache.  In this
+     * case, call H5AC_force_cache_image_load() instead of 
+     * H5MF_tidy_self_referential_fsm_hack().  H5AC_force_cache_image_load()
+     * will load the cache image, and then call 
+     * H5MF_tidy_self_referential_fsm_hack() to discard the cache image 
+     * block.
+     */
+    if(f->shared->first_alloc_dealloc) {
+        if(H5AC_cache_image_pending(f)) {
+            if(H5AC_force_cache_image_load(f, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "forced cache image load failed")
+        } /* end if */
+        else {
+            if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "tidy of self referential fsm hack failed")
+        } /* end else */
+    } /* end if */
+
     if(type == H5FD_MEM_DEFAULT) {
-	start_type = H5FD_MEM_SUPER;
-	end_type = H5FD_MEM_NTYPES;
+        start_type = H5F_MEM_PAGE_SUPER;
+        end_type = H5F_MEM_PAGE_NTYPES;
     } /* end if */
     else {
-	start_type = end_type = type;
-	H5_INC_ENUM(H5FD_mem_t, end_type);
+        start_type = end_type = (H5F_mem_page_t)type;
+        if(H5F_PAGED_AGGR(f)) /* set to the corresponding LARGE free-space manager */
+            end_type = (H5F_mem_page_t)(end_type + H5FD_MEM_NTYPES);
+        else
+            H5_INC_ENUM(H5F_mem_page_t, end_type);
     } /* end else */
 
     /* Set up user data for section iteration */
@@ -1529,47 +2522,54 @@ H5MF_get_free_sections(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, size_t nsects,
     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")
+    /* Set the ring type in the DXPL.  In most cases, we will
+     * need H5AC_RING_RDFSM, so initialy set the ring in
+     * the DXPL to that value.  We will alter this later if
+     * needed.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_RDFSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value(0)")
+    reset_ring = TRUE;
+    curr_ring = H5AC_RING_RDFSM;
 
     /* 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;
+    for(ty = start_type; ty < end_type; H5_INC_ENUM(H5F_mem_page_t, ty)) {
+        hbool_t fs_started = FALSE;	/* The free-space manager is opened or not */
+        size_t nums = 0;		/* The number of free-space sections */
+
+        /* Test to see if we need to switch rings -- do so if required */
+        if(H5MF__fsm_type_is_self_referential(f, ty))
+            needed_ring = H5AC_RING_MDFSM;
+        else
+            needed_ring = H5AC_RING_RDFSM;
+
+        if(needed_ring != curr_ring) {
+            if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value (1)")
+            curr_ring = needed_ring;
+        } /* end if */
 
-	/* 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")
+            if(H5MF_open_fstype(f, dxpl_id, ty) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't open the free space manager")
             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 */
+            fs_started = TRUE;
         } /* end if */
 
-	/* Close the free space manager of this type, if we started it here */
+        /* Check if there's free space sections of this type */
+        if(f->shared->fs_man[ty])
+            if(H5MF__get_free_sects(f, dxpl_id, f->shared->fs_man[ty], &sect_udata, &nums) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't get section info for the free space manager")
+
+        /* Increment total # of sections */
+        total_sects += nums;
+
+        /* 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")
+            if(H5MF__close_fstype(f, dxpl_id, ty) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCLOSEOBJ, FAIL, "can't close file free space")
+        if((H5F_PAGED_AGGR(f)) && (type != H5FD_MEM_DEFAULT))
+            ty = (H5F_mem_page_t)(ty + H5FD_MEM_NTYPES - 2);
     } /* end for */
 
     /* Set return value */
@@ -1577,9 +2577,1343 @@ H5MF_get_free_sections(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, size_t nsects,
 
 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")
+    if(reset_ring)
+        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)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, -1)
 } /* H5MF_get_free_sections() */
 
+

+/*-------------------------------------------------------------------------
+ * 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_sects
+ *
+ * Purpose:	Retrieve section information for the specified free-space manager.
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF__get_free_sects(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5MF_sect_iter_ud_t *sect_udata, size_t *nums)
+{
+    hsize_t hnums = 0;          	/* # of sections */
+    herr_t ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(sect_udata);
+    HDassert(nums);
+    HDassert(fspace);
+
+    /* Query how many sections of this type */
+    if(H5FS_sect_stats(fspace, 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);
+
+    /* Check if we should retrieve the section info */
+    if(sect_udata->sects && *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, fspace, H5MF_sects_cb, sect_udata) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_BADITER, FAIL, "can't iterate over sections")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF__get_free_sects() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_settle_raw_data_fsm()
+ *
+ * Purpose: 	Handle any tasks required before the metadata cache 
+ *		can serialize or flush the raw data free space manager
+ *		and any metadata free space managers that reside in the 
+ *		raw data free space manager ring.
+ *
+ *              Specifically, this means any metadata managers that DON'T 
+ *              handle space allocation for free space manager header or 
+ *              section info will reside in the raw data free space manager 
+ *              ring.
+ *
+ *              In the absence of page allocation, there is at most one 
+ *		free space manager per memory type defined in H5F_mem_t.
+ *		Of these, the one that allocates H5FD_MEM_DRAW will 
+ *		always reside in the raw data free space manager ring.
+ *		If there is more than one metadata free space manager, 
+ *		all that don't handle H5FD_MEM_FSPACE_HDR or 
+ *              H5FD_MEM_FSPACE_SINFO (which map to H5FD_MEM_OHDR and 
+ *              H5FD_MEM_LHEAP respectively) will reside in the raw 
+ *		data free space manager ring as well
+ *
+ *		With page allocation, the situation is conceptually 
+ *		identical, but more complex in practice.
+ *
+ *              In the worst case (multi file driver) page allocation 
+ *		can result in two free space managers for each memory 
+ *		type -- one for small (less than on equal to one page)
+ *              allocations, and one for large (greater than one page)
+ *              allocations.
+ *
+ *		In the more common one file case, page allocation will
+ *              result in a total of three free space managers -- one for 
+ *              small (<= one page) raw data allocations, one for small 
+ *              metadata allocations (i.e, all memory types other than 
+ *              H5FD_MEM_DRAW), and one for all large (> one page) 
+ *              allocations.
+ *
+ *              Despite these complications, the solution is the same in
+ *		the page allocation case -- free space managers (be they 
+ *              small data or large) are assigned to the raw data free 
+ *              space manager ring if they don't allocate file space for
+ *              free space managers.  Note that in the one file case, the 
+ *		large free space manager must be assigned to the metadata
+ *		free space manager ring, as it both allocates pages for 
+ *		the metadata free space manager, and allocates space for 
+ *		large (> 1 page) metadata cache entries.
+ *
+ *              At present, the task list for this routine is:
+ *
+ *		1) Reduce the EOA to the extent possible.  To do this:
+ *
+ *		    a) Free both aggregators.  Space not at EOA will be
+ *		       added to the appropriate free space manager.
+ *
+ *		       The raw data aggregator should not be restarted 
+ *		       after this point.  It is possible that the metadata
+ *		       aggregator will be.
+ *
+ *		    b) Free all file space currently allocated to free
+ *		       space managers.
+ *
+ *		    c) Delete the free space manager superblock 
+ *		       extension message if allocated.
+ *
+ *		   This done, reduce the EOA by moving it to just before
+ *		   the last piece of free memory in the file.
+ *
+ *		2) Ensure that space is allocated for the free space
+ *                 manager superblock extension message.  Must do this
+ *                 now, before reallocating file space for free space 
+ *		   managers, as it is possible that this allocation may
+ *		   grab the last section in a FSM -- making it unnecessary
+ *		   to re-allocate file space for it.
+ *
+ *		3) Scan all free space managers not involved in allocating
+ *		   space for free space managers.  For each such free space
+ *		   manager, test to see if it contains free space.  If 
+ *		   it does, allocate file space for its header and section
+ *		   data.  If it contains no free space, leave it without 
+ *		   allocated file space as there is no need to save it to 
+ *		   file.
+ *
+ *		   Note that all free space managers in this class should
+ *		   see no further space allocations / deallocations as 
+ *		   at this point, all raw data allocations should be 
+ *		   finalized, as should all metadata allocations not 
+ *		   involving free space managers.
+ *
+ *		   We will allocate space for free space managers involved
+ *		   in the allocation of file space for free space managers
+ *		   in H5MF_settle_meta_data_fsm()
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  John Mainzer
+ *	        5/25/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_settle_raw_data_fsm(H5F_t *f, hid_t dxpl_id, hbool_t *fsm_settled)
+{
+    int pass_count;
+    hsize_t alloc_size;
+    H5F_mem_t mem_type;                 /* Memory type for iteration */
+    H5F_mem_page_t fsm_type;            /* FSM type for iteration */
+    H5O_fsinfo_t fsinfo;                /* Free space manager info message */
+    H5FS_stat_t fs_stat;                /* Information for free-space manager */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5AC_ring_t curr_ring = H5AC_RING_INV;      /* Current ring value */
+    H5AC_ring_t needed_ring = H5AC_RING_INV;    /* Ring value needed for this iteration */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(fsm_settled);
+
+    /* Only need to settle things if we are persisting the free space info 
+     * and allocation/deallocation has occurred.
+     */
+    if(f->shared->fs_persist && !f->shared->first_alloc_dealloc) {
+        hbool_t fsm_opened[H5F_MEM_PAGE_NTYPES];        /* State of FSM */
+        hbool_t fsm_visited[H5F_MEM_PAGE_NTYPES];       /* State of FSM */
+
+        /* Sanity check */
+        HDassert(f->shared->sblock);
+
+        /* should only be called if file is opened R/W */
+        HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+
+        /* shouldn't be called unless we have a superblock supporting the
+         * superblock extension.
+         */
+        HDassert(f->shared->sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+
+        /* Initialize fsm_opened and fsm_visited */
+        HDmemset(fsm_opened, 0, sizeof(fsm_opened));
+        HDmemset(fsm_visited, 0, sizeof(fsm_visited));
+
+        /* 1) Reduce the EOA to the extent possible. */
+
+        /* a) Free the space in aggregators:
+         *
+         * (for space not at EOF, it may be put into free space managers)
+         *
+         * Do this now so that the raw data FSM (and any other FSM that isn't
+         * involved in space allocation for FSMs) will have no further activity.
+         *
+         * Note that while the raw data aggregator should not be restarted during
+         * the close process, this need not be the case for the metadata aggregator.
+         *
+         * Note also that the aggregators will not exist if page aggregation 
+         * is enabled -- skip this if so.
+         */
+        /* Vailin -- is this correct? */
+        if(!H5F_PAGED_AGGR(f) && (H5MF_free_aggrs(f, dxpl_id) < 0))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free aggregators")
+
+        /* Set the ring type in the DXPL.  In most cases, we will
+         * need H5AC_RING_MDFSM first, so initialy set the ring in
+         * the DXPL to that value.  We will alter this later if
+         * needed.
+         */
+        if(H5AC_set_ring(dxpl_id, H5AC_RING_MDFSM, &dxpl, &orig_ring) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value(0)")
+        reset_ring = TRUE;
+        curr_ring = H5AC_RING_MDFSM;
+
+        /* b) Free the file space (if any) allocated to each free space manager.
+         *
+         * Do this to facilitate reduction of the size of the file to the
+         * extent possible.  We will re-allocate space to free space managers
+         * that have free space to save after this reduction.
+         *
+         * In the case of the raw data free space manager, and any other free
+         * space manager that does not allocate space for free space managers,
+         * allocations should be complete at this point, as all raw data should
+         * have space allocated and be flushed to file by now.  Thus we
+         * can examine such free space managers and only re-allocate space for
+         * them if they contain free space.  Do this later in this function after
+         * the EOA has been reduced to the extent possible.
+         *
+         * For free space managers that allocate file space for free space
+         * managers (usually just a single metadata free space manager, but for
+         * now at least, free space managers for different types of metadata
+         * are possible), the matter is more ticklish due to the self-
+         * referential nature of the problem.  These FSMs are dealt with in
+         * H5MF_settle_meta_data_fsm().
+         *
+         * Since paged allocation may be enabled, there may be up to two 
+         * free space managers per memory type -- one for small and one for
+         * large allocation.  Hence we must loop over the memory types twice
+         * setting the allocation size accordingly if paged allocation is 
+         * enabled.
+         */
+        for(pass_count = 0; pass_count <= 1; pass_count++) {
+            if(pass_count == 0)
+                alloc_size = 1;
+            else if ( H5F_PAGED_AGGR(f) )
+                alloc_size = f->shared->fs_page_size + 1;
+            else /* no need for a second pass */
+                break;
+
+            for(mem_type = H5FD_MEM_SUPER; mem_type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5F_mem_t, mem_type)) {
+                H5MF_alloc_to_fs_type(f, mem_type, alloc_size, &fsm_type);
+
+                if(pass_count == 0) { /* this is the first pass */
+                    HDassert(fsm_type > H5F_MEM_PAGE_DEFAULT);
+                    HDassert(fsm_type < H5F_MEM_PAGE_LARGE_SUPER);
+                } /* end if */
+                else if(H5F_PAGED_AGGR(f)) { /* page alloc active */
+                    HDassert(fsm_type >= H5F_MEM_PAGE_LARGE_SUPER);
+                    HDassert(fsm_type < H5F_MEM_PAGE_NTYPES);
+                } /* end else-if */
+                else    /* paged allocation disabled -- should be unreachable */
+                    HDassert(FALSE);
+
+                if(!fsm_visited[fsm_type]) {
+                    fsm_visited[fsm_type] = TRUE;
+
+                    /* If there is no active FSM for this type, but such a FSM has
+                     * space allocated in file, open it so that we can free its file
+                     * space.
+                     */
+                    if(NULL == f->shared->fs_man[fsm_type]) {
+                        if(H5F_addr_defined(f->shared->fs_addr[fsm_type])) {
+                            /* Sanity check */
+                            HDassert(fsm_opened[fsm_type] == FALSE);
+
+                             if(H5MF_open_fstype(f, dxpl_id, fsm_type) < 0)
+                                 HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space manager")
+                            fsm_opened[fsm_type] = TRUE;
+                        } /* end if */
+                    } /* end if */
+
+                    if(f->shared->fs_man[fsm_type]) {
+                        /* Test to see if we need to switch rings -- do so if required */
+                        if(H5MF__fsm_type_is_self_referential(f, fsm_type))
+                             needed_ring = H5AC_RING_MDFSM;
+                        else
+                             needed_ring = H5AC_RING_RDFSM;
+
+                        if(needed_ring != curr_ring) {
+                            if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring) < 0)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+                            curr_ring = needed_ring;
+                        } /* end if */
+
+                        /* Query free space manager info for this type */
+                        if(H5FS_stat_info(f, f->shared->fs_man[fsm_type], &fs_stat) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, 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 
+                             * reallocate later if the free space manager contains
+                             * any free space.
+                             */
+                            if(H5FS_free(f, f->shared->fs_man[fsm_type], dxpl_id, TRUE) < 0)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free-space headers")
+                            f->shared->fs_addr[fsm_type] = HADDR_UNDEF;
+                        } /* end if */
+                    } /* end if */
+
+                    /* note that we are tracking opened FSM -- we will close them
+                     * at the end of the function.
+                     */
+                } /* end if */
+            } /* end for */
+        } /* end for */
+
+
+        /* c) Delete the free space manager superblock extension message
+         *    if allocated.
+         *
+         *    Must do this since the routine that writes / creates superblock
+         *    extension messages will choke if the target message is
+         *    unexpectedly either absent or present.
+         *
+         *    Update: This is probably unecessary, as I gather that the 
+         *            file space manager info message is guaranteed to exist.
+         *            Leave it in for now, but consider removing it.
+         */
+        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")
+
+        /* As the final element in 1), shrink the EOA for the file */
+        if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+
+        /* 2) Ensure that space is allocated for the free space manager superblock
+         *    extension message.  Must do this now, before reallocating file space
+         *    for free space managers, as it is possible that this allocation may
+         *    grab the last section in a FSM -- making it unnecessary to
+         *    re-allocate file space for it.
+         *
+         * Do this by writing a free space manager superblock extension message.
+         *
+         * Since no free space manager has file space allocated for it, this
+         * message must be invalid since we can't save addresses of FSMs when
+         * those addresses are unknown.  This is OK -- we will write the correct
+         * values to the message at free space manager shutdown.
+         */
+        for(fsm_type = H5F_MEM_PAGE_SUPER; fsm_type < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, fsm_type))
+            fsinfo.fs_addr[fsm_type - 1] = HADDR_UNDEF;
+        fsinfo.strategy = f->shared->fs_strategy;
+        fsinfo.persist = f->shared->fs_persist;
+        fsinfo.threshold = f->shared->fs_threshold;
+        fsinfo.page_size = f->shared->fs_page_size;
+        fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
+        fsinfo.eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+
+        if(H5F_super_ext_write_msg(f, dxpl_id, H5O_FSINFO_ID, &fsinfo, TRUE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing fsinfo message to superblock extension")
+
+
+        /* 3) Scan all free space managers not involved in allocating
+         *    space for free space managers.  For each such free space
+         *    manager, test to see if it contains free space.  If
+         *    it does, allocate file space for its header and section
+         *    data.  If it contains no free space, leave it without
+         *    allocated file space as there is no need to save it to
+         *    file.
+         *
+         *    Note that all free space managers in this class should
+         *    see no further space allocations / deallocations as
+         *    at this point, all raw data allocations should be
+         *    finalized, as should all metadata allocations not involving
+         *    free space managers.
+         *
+         *    We will allocate space for free space managers involved
+         *    in the allocation of file space for free space managers
+         *    in H5MF_settle_meta_data_fsm()
+         */
+
+        /* Reinitialize fsm_visited */
+        for(fsm_type = H5F_MEM_PAGE_SUPER; fsm_type < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, fsm_type))
+            fsm_visited[fsm_type] = FALSE;
+
+        for(pass_count = 0; pass_count <= 1; pass_count++) {
+            if(pass_count == 0)
+                alloc_size = 1;
+            else if(H5F_PAGED_AGGR(f))
+                alloc_size = f->shared->fs_page_size + 1;
+            else /* no need for a second pass */
+                break;
+
+            for(mem_type = H5FD_MEM_SUPER; mem_type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5F_mem_t, mem_type)) {
+                H5MF_alloc_to_fs_type(f, mem_type, alloc_size, &fsm_type);
+
+                if(pass_count == 0) { /* this is the first pass */
+                    HDassert(fsm_type > H5F_MEM_PAGE_DEFAULT);
+                    HDassert(fsm_type < H5F_MEM_PAGE_LARGE_SUPER);
+                } /* end if */
+                else if(H5F_PAGED_AGGR(f)) { /* page alloc active */
+                    HDassert(fsm_type >= H5F_MEM_PAGE_LARGE_SUPER);
+                    HDassert(fsm_type < H5F_MEM_PAGE_NTYPES);
+                } /* end else-if */
+                else  /* paged allocation disabled -- should be unreachable */
+                    HDassert(FALSE);
+
+                /* test to see if we need to switch rings -- do so if required */
+                if(H5MF__fsm_type_is_self_referential(f, fsm_type))
+                    needed_ring = H5AC_RING_MDFSM;
+                else
+                    needed_ring = H5AC_RING_RDFSM;
+
+                if(needed_ring != curr_ring) {
+                    if(H5AC_set_ring(dxpl_id, needed_ring, &dxpl, &curr_ring)< 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+                    curr_ring = needed_ring;
+                } /* end if */
+
+                /* Since there can be a many-to-one mapping from memory types
+                 * to free space managers, ensure that we don't visit any FSM
+                 * more than once.
+                 */
+                if(!fsm_visited[fsm_type]) {
+                    fsm_visited[fsm_type] = TRUE;
+
+                    if(f->shared->fs_man[fsm_type]) {
+                        /* Only allocate file space if the target free space manager 
+                         * doesn't allocate file space for free space managers.  Note 
+                         * that this is also the deciding factor as to whether a FSM 
+                         * in in the raw data FSM ring.
+                         */
+                        if(!H5MF__fsm_type_is_self_referential(f, fsm_type)) {
+                            /* The current ring should be H5AC_RING_RDFSM */
+                            HDassert(curr_ring == H5AC_RING_RDFSM);
+
+                            /* Query free space manager info for this type */
+                            if(H5FS_stat_info(f, f->shared->fs_man[fsm_type], &fs_stat) < 0 )
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info")
+
+                            /* If the free space manager contains section info,
+                             * allocate space for the header and sinfo (note that
+                             * space must not be allocated at present -- verify
+                             * verify this with assertions).
+                             */
+                            if(fs_stat.serial_sect_count > 0) {
+                                /* Sanity check */
+                                HDassert(!H5F_addr_defined(fs_stat.addr));
+
+                                /* Allocate FSM header */
+                                if(H5FS_alloc_hdr(f, f->shared->fs_man[fsm_type], &f->shared->fs_addr[fsm_type], dxpl_id) < 0)
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't allocated free-space header")
+
+                                /* Allocate FSM section info */
+                                HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+                                HDassert(fs_stat.alloc_sect_size == 0);
+                                if(H5FS_alloc_sect(f, f->shared->fs_man[fsm_type], dxpl_id) < 0 )
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't allocate free-space section info")
+
+#ifndef NDEBUG
+                                /* Re-Query free space manager info for this type */
+                                if(H5FS_stat_info(f, f->shared->fs_man[fsm_type], &fs_stat) < 0)
+                                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't get free-space info")
+
+                                HDassert(H5F_addr_defined(fs_stat.addr));
+                                HDassert(H5F_addr_defined(fs_stat.sect_addr));
+                                HDassert(fs_stat.serial_sect_count > 0);
+                                HDassert(fs_stat.alloc_sect_size > 0);
+                                HDassert(fs_stat.alloc_sect_size == fs_stat.sect_size);
+#endif /* NDEBUG */
+                            } /* end if */
+                            else {
+                                HDassert(!H5F_addr_defined(fs_stat.addr));
+                                HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+                                HDassert(fs_stat.serial_sect_count == 0);
+                                HDassert(fs_stat.alloc_sect_size == 0);
+                            } /* end else */
+                        } /* end if */
+                    } /* end if */
+
+                    /* Close any opened FSMs */
+                    if(fsm_opened[fsm_type]) {
+                        if(H5MF__close_fstype(f, dxpl_id, fsm_type) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't close file free space manager")
+                        fsm_opened[fsm_type] = FALSE;
+                    } /* end if */
+                } /* end if */
+            } /* end for */
+        } /* end for */
+
+        /* verify that all opened FSMs were closed */
+        for(fsm_type = H5F_MEM_PAGE_SUPER; fsm_type < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, fsm_type))
+            HDassert(!fsm_opened[fsm_type]);
+
+        /* Indicate that the FSM was settled successfully */
+        *fsm_settled = TRUE;
+    } /* end if */
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5MF_settle_raw_data_fsm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_settle_meta_data_fsm()
+ *
+ * Purpose: 	If the free space manager is persistent, handle any tasks 
+ *		required before the metadata cache can serialize or flush 
+ *		the metadata free space manager(s) that handle file space 
+ *		allocation for free space managers.
+ *
+ *		In most cases, there will be only one manager assigned 
+ *		to this role.  However, since for reasons unknown,
+ *		free space manager headers and section info blocks are 
+ *		different classes of memory, it is possible that two free 
+ *		space managers will be involved.
+ *
+ *		On entry to this function, the raw data settle routine
+ *		(H5MF_settle_raw_data_fsm()) should have:
+ *
+ *              1) Freed the aggregators.
+ *
+ *		2) Freed all file space allocated to the free space managers.
+ *
+ *		3) Deleted the free space manager superblock extension message
+ *
+ *		4) Reduced the EOA to the extent possible.
+ *
+ *		5) Re-created the free space manager superblock extension
+ *		   message.
+ *
+ *		6) Reallocated file space for all non-empty free space 
+ *		   managers NOT involved in allocation of space for free 
+ *		   space managers.
+ *
+ *		   Note that these free space managers (if not empty) should
+ *		   have been written to file by this point, and that no
+ *		   further space allocations involving them should take 
+ *		   place during file close.
+ *
+ *		On entry to this routine. the free space manager(s) involved
+ *		in allocation of file space for free space managers should
+ *		still be floating. (i.e. should not have any file space 
+ *		allocated to them.)
+ *
+ *		Similarly, the raw data aggregator should not have been 
+ *		restarted.  Note that it is probable that reallocation of 
+ *		space in 5) and 6) above will have re-started the metadata 
+ *		aggregator.
+ *
+ *
+ *		In this routine, we proceed as follows:
+ *
+ *		1) Verify that the free space manager(s) involved in file
+ *		   space allocation for free space managers are still floating.
+ *
+ *              2) Free the aggregators.
+ *
+ *              3) Reduce the EOA to the extent possible, and make note
+ *		   of the resulting value.  This value will be stored 
+ *		   in the fsinfo superblock extension message and be used
+ *                 in the subsequent file open.
+ *
+ *		4) Re-allocate space for any free space manager(s) that:
+ *
+ *		   a) are involved in allocation of space for free space 
+ *		      managers, and 
+ *
+ *		   b) contain free space.
+ *
+ *		   It is possible that we could allocate space for one 
+ *		   of these free space manager(s) only to have the allocation 
+ *		   result in the free space manager being empty and thus 
+ *		   obliging us to free the space again.  Thus there is the
+ *		   potential for an infinte loop if we want to avoid saving
+ *		   empty free space managers.
+ *
+ *		   Similarly, it is possible that we could allocate space 
+ *		   for a section info block, only to discover that this 
+ *		   allocation has changed the size of the section info -- 
+ *		   forcing us to deallocate and start the loop over again.
+ *
+ *		   To avoid this, simply allocate file space for these
+ *		   FSM(s) directly from the VFD layer if allocation is 
+ *		   indicated.  This avoids the issue by bypassing the FSMs
+ *		   in this case.  
+ *
+ *		   Note that this may increase the size of the file needlessly. 
+ *		   A better solution would be to modify the FSM code to 
+ *		   save empty FSMs to file, and to allow section info blocks
+ *		   to be oversized.  However, given that the FSM code is 
+ *		   also used by the fractal heaps, and that we are under 
+ *		   severe time pressure at the moment, the above brute 
+ *		   force solution is attractive. 
+ *
+ *              5) Make note of the EOA -- used for sanity checking on 
+ *                 FSM shutdown.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  John Mainzer
+ *	        5/25/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_settle_meta_data_fsm(H5F_t *f, hid_t dxpl_id, hbool_t *fsm_settled)
+{
+    H5F_mem_page_t sm_fshdr_fs_type;	/* small fs hdr fsm */
+    H5F_mem_page_t sm_fssinfo_fs_type;  /* small fs sinfo fsm */
+    H5F_mem_page_t lg_fshdr_fs_type;    /* large fs hdr fsm */
+    H5F_mem_page_t lg_fssinfo_fs_type;  /* large fs sinfo fsm */
+    H5FS_t     *sm_hdr_fspace = NULL;   /* ptr to sm FSM hdr alloc FSM */
+    H5FS_t     *sm_sinfo_fspace = NULL; /* ptr to sm FSM sinfo alloc FSM */
+    H5FS_t     *lg_hdr_fspace = NULL;   /* ptr to lg FSM hdr alloc FSM */
+    H5FS_t     *lg_sinfo_fspace = NULL; /* ptr to lg FSM sinfo alloc FSM */
+    haddr_t eoa_pre_fsm_fsalloc;        /* eoa pre file space allocation */
+                                        /* for self referential FSMs */
+    haddr_t eoa_post_fsm_fsalloc;       /* eoa post file space allocation */
+                                        /* for self referential FSMs */
+    H5FS_stat_t fs_stat;                /* Information for hdr FSM */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */
+    hbool_t	reset_ring = FALSE;     /* Whether we set the ring */
+    herr_t 	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(fsm_settled);
+
+    /* Only need to settle things if we are persisting the free space info 
+     * and allocation/deallocation has occurred.
+     */
+    if(f->shared->fs_persist && !f->shared->first_alloc_dealloc) {
+        /* Sanity check */
+        HDassert(f->shared->lf);
+
+        /* should only be called if file is opened R/W */
+        HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, (size_t)1, &sm_fshdr_fs_type);
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, (size_t)1, &sm_fssinfo_fs_type);
+
+        HDassert(sm_fshdr_fs_type > H5F_MEM_PAGE_DEFAULT);
+        HDassert(sm_fshdr_fs_type < H5F_MEM_PAGE_LARGE_SUPER);
+
+        HDassert(sm_fssinfo_fs_type > H5F_MEM_PAGE_DEFAULT);
+        HDassert(sm_fssinfo_fs_type < H5F_MEM_PAGE_LARGE_SUPER);
+
+        HDassert(!H5F_addr_defined(f->shared->fs_addr[sm_fshdr_fs_type]));
+        HDassert(!H5F_addr_defined(f->shared->fs_addr[sm_fssinfo_fs_type]));
+
+        /* Note that in most cases, sm_hdr_fspace will equal sm_sinfo_fspace. */
+        sm_hdr_fspace = f->shared->fs_man[sm_fshdr_fs_type];
+        sm_sinfo_fspace = f->shared->fs_man[sm_fssinfo_fs_type];
+
+        if(H5F_PAGED_AGGR(f)) {
+            H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, f->shared->fs_page_size + 1, &lg_fshdr_fs_type);
+            H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, f->shared->fs_page_size + 1, &lg_fssinfo_fs_type);
+
+            HDassert(lg_fshdr_fs_type >= H5F_MEM_PAGE_LARGE_SUPER);
+            HDassert(lg_fshdr_fs_type < H5F_MEM_PAGE_NTYPES);
+
+            HDassert(lg_fssinfo_fs_type >= H5F_MEM_PAGE_LARGE_SUPER);
+            HDassert(lg_fssinfo_fs_type < H5F_MEM_PAGE_NTYPES);
+
+            HDassert(!H5F_addr_defined(f->shared->fs_addr[lg_fshdr_fs_type]));
+            HDassert(!H5F_addr_defined(f->shared->fs_addr[lg_fssinfo_fs_type]));
+
+            /* Note that in most cases, lg_hdr_fspace will equal lg_sinfo_fspace. */
+            lg_hdr_fspace = f->shared->fs_man[lg_fshdr_fs_type];
+            lg_sinfo_fspace = f->shared->fs_man[lg_fssinfo_fs_type];
+        } /* end if */
+
+        /* Set the ring in the dxpl appropriately for subsequent calls */
+        if(H5AC_set_ring(dxpl_id, H5AC_RING_MDFSM, &dxpl, &orig_ring) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+        reset_ring = TRUE;
+
+#ifndef NDEBUG
+        /* Verify that sm_hdr_fspace is floating if it exists */
+        if(sm_hdr_fspace) {
+            /* Query free space manager info for this type */
+            if(H5FS_stat_info(f, sm_hdr_fspace, &fs_stat) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL,  "can't get free-space info")
+
+            HDassert(!H5F_addr_defined(fs_stat.addr));
+            HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+            HDassert(fs_stat.alloc_sect_size == 0);
+        } /* end if */
+
+        /* Verify that sm_sinfo_fspace is floating if it exists and is distinct */
+        if((sm_sinfo_fspace) && (sm_hdr_fspace != sm_sinfo_fspace)) {
+            /* Query free space manager info for this type */
+            if(H5FS_stat_info(f, sm_sinfo_fspace, &fs_stat) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info")
+
+            HDassert(!H5F_addr_defined(fs_stat.addr));
+            HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+            HDassert(fs_stat.alloc_sect_size == 0);
+        } /* end if */
+
+        if(H5F_PAGED_AGGR(f)) {
+            /* Verify that lg_hdr_fspace is floating if it exists */
+            if(lg_hdr_fspace) {
+                /* Query free space manager info for this type */
+                if(H5FS_stat_info(f, lg_hdr_fspace, &fs_stat) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info (3)")
+
+                HDassert(!H5F_addr_defined(fs_stat.addr));
+                HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+                HDassert(fs_stat.alloc_sect_size == 0);
+            } /* end if */
+
+            /* Verify that lg_sinfo_fspace is floating if it 
+             * exists and is distinct 
+             */
+            if((lg_sinfo_fspace) && (lg_hdr_fspace != lg_sinfo_fspace)) {
+                /* Query free space manager info for this type */
+                if(H5FS_stat_info(f, lg_sinfo_fspace, &fs_stat) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info (4)")
+
+                HDassert(!H5F_addr_defined(fs_stat.addr));
+                HDassert(!H5F_addr_defined(fs_stat.sect_addr));
+                HDassert(fs_stat.alloc_sect_size == 0);
+            } /* end if */
+        } /* end if */
+#endif /* NDEBUG */
+
+        /* Free the space in the metadata aggregator.  Do this via the
+         * H5MF_free_aggrs() call.  Note that the raw data aggregator must
+         * have already been freed.  Sanity checks for this?
+         *
+         * Note that the aggregators will not exist if paged aggregation 
+         * is enabled -- don't attempt to free if this is the case.
+         */
+        /* Vailin -- is this correct? */
+        /* (for space not at EOF, it may be put into free space managers) */
+        if((!H5F_PAGED_AGGR(f)) && (H5MF_free_aggrs(f, dxpl_id) < 0))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free aggregators")
+
+        /* Trying shrinking the EOA for the file */
+        if(H5MF__close_shrink_eoa(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
+
+        /* At this point, the EOA should be set to a value that contains 
+         * the allocation for all user data, all non self referential FSMs,
+         * the superblock and all superblock extension messages.
+         * 
+         * Make note of the current EOA.  We will store this value in the 
+         * free space manager superblock extension message.  Since space for
+         * everything other than the self referential FSMs (and possibly the
+         * cache image) has been allocated at this point, this allows us to 
+         * to float the self referential FSMs on the first file space allocation / 
+         * deallocaiton and then set the EOA to this value before we handle
+         * the allocation / deallocation. (If a cache image exists, the 
+         * first allocation / deallocation will be the deallocation of space
+         * for the cache image).   
+         *
+         * WARNING:  This approach settling the self referential free space 
+         *           managers and allocating space for them in the file will 
+         *           not work as currently implemented with the split and 
+         *           multi file drivers, as the self referential free space 
+         *           manager header and section info can be stored in up to 
+         *           two different files -- requiring that up to two EOA's 
+         *           be stored in the the free space managers super block 
+         *           extension message.  
+         *
+         *           As of this writing, we are solving this problem by 
+         *           simply not supporting persistant FSMs with the split 
+         *           and multi file drivers.
+         *
+         *           Current plans are to do away with the multi file 
+         *           driver, so this should be a non-issue in this case.
+         *
+         *           We should be able to support the split file driver 
+         *           without a file format change.  However, the code to 
+         *           do so does not exist at present.
+         */
+         if(HADDR_UNDEF == (eoa_pre_fsm_fsalloc = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get EOA")
+
+
+        /* ******************* PROBLEM: ********************
+         *
+         * If the file has an alignement other than 1, and if
+         * the EOA is not a multiple of this alignment, allocating sapce
+         * for the section via the VFD info has the potential of generating
+         * a fragment that will be added to the free space manager.  This
+         * of course undoes everything we have been doing here.
+         *
+         * Need a way around this.  Obvious solution is to force the EOA to
+         * be a multiple of the alignment.
+         *
+         * Fortunately, alignment is typically 1, so this is a non-issue in
+         * most cases.  In cases where the alignment is not 1, for now we
+         * have decided to drop the fragment on the floor.
+         *
+         * Eventually, we should fix this by modifying the on disk representations
+         * of free space managers to allow for empty space, so as to bypass the
+         * issues created by self-referential free space managers, and make
+         * this issue moot.
+         */
+        /* HDassert(f->shared->alignment == 1); */
+
+
+        /* The free space manager(s) that handle space allocations for free
+         * space managers should be settled now, albeit without file space
+         * allocated to them.  To avoid the possibility of changing the sizes
+         * of their section info blocks, allocate space for them now at the
+         * end of file via H5FD_alloc().
+         *
+         * In the past, this issue of allocating space without touching the
+         * free space managers has been deal with by calling
+         * H5MF_aggr_vfd_alloc(), which in turn calls H5MF_aggr_alloc().
+         * This is problematic since (if I read the code correctly) it will
+         * re-constitute the metadata aggregator, which will add any leftover
+         * space to one of the free space managers when freed.
+         *
+         * This is a non-starter, since the entire objective is to settle the
+         * free space managers.
+         *
+         * Hence the decision to call H5FD_alloc() directly.
+         *
+         * As discussed in PROBLEM above, if f->shared->alignment is not 1,
+         * this has the possibility of generating a fragment of file space
+         * that would typically be inserted into one of the free space managers.
+         *
+         * This is isn't good, but due to schedule pressure, we will just drop
+         * the fragment on the floor for now.
+         */
+        if(sm_hdr_fspace)
+            if(H5FS_vfd_alloc_hdr_and_section_info_if_needed(f, dxpl_id, sm_hdr_fspace, &(f->shared->fs_addr[sm_fshdr_fs_type])) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't vfd allocate sm hdr FSM file space")
+
+        if(sm_sinfo_fspace && (sm_sinfo_fspace != sm_hdr_fspace))
+            if(H5FS_vfd_alloc_hdr_and_section_info_if_needed(f, dxpl_id, sm_sinfo_fspace, &(f->shared->fs_addr[sm_fssinfo_fs_type])) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't vfd allocate sm sinfo FSM file space")
+
+        if(H5F_PAGED_AGGR(f)) {
+            if(lg_hdr_fspace)
+                if(H5FS_vfd_alloc_hdr_and_section_info_if_needed(f, dxpl_id, lg_hdr_fspace, &(f->shared->fs_addr[lg_fshdr_fs_type])) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't vfd allocate lg hdr FSM file space")
+
+            if(lg_sinfo_fspace && (lg_sinfo_fspace != lg_hdr_fspace))
+                if(H5FS_vfd_alloc_hdr_and_section_info_if_needed(f, dxpl_id, lg_sinfo_fspace, &(f->shared->fs_addr[lg_fssinfo_fs_type])) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't vfd allocate lg sinfo FSM file space")
+        } /* end if */
+
+        /* Get the eoa after allocation of file space for the self referential
+         * free space managers.  Assuming no cache image, this should be the 
+         * final EOA of the file.
+         */
+        if(HADDR_UNDEF == (eoa_post_fsm_fsalloc = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+
+        /* All free space managers should have file space allocated for them
+         * now, and should see no further allocations / deallocations.  Store
+         * the pre and post file space allocaton for self referential FSMs EOA
+         * for use when we actually write the free space manager superblock 
+         * extension message.
+         */
+        f->shared->eoa_pre_fsm_fsalloc  = eoa_pre_fsm_fsalloc;
+        f->shared->eoa_post_fsm_fsalloc = eoa_post_fsm_fsalloc;
+
+        /* Indicate that the FSM was settled successfully */
+        *fsm_settled = TRUE;
+    } /* end if */
+
+done:
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5MF_settle_meta_data_fsm() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF__fsm_type_is_self_referential()
+ *
+ * Purpose:     Return TRUE if the indicated free space manager allocates
+ *		file space for free space managers.  Return FALSE otherwise.
+ *
+ * Return:      TRUE/FALSE
+ *
+ * Programmer:  John Mainzer
+ *              12/6/16
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5MF__fsm_type_is_self_referential(H5F_t *f, H5F_mem_page_t fsm_type)
+{
+    H5F_mem_page_t sm_fshdr_fsm;
+    H5F_mem_page_t sm_fssinfo_fsm;
+    H5F_mem_page_t lg_fshdr_fsm;
+    H5F_mem_page_t lg_fssinfo_fsm;
+    hbool_t result = FALSE;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(fsm_type >= H5F_MEM_PAGE_DEFAULT);
+    HDassert(fsm_type < H5F_MEM_PAGE_NTYPES);
+
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, (size_t)1, &sm_fshdr_fsm);
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, (size_t)1, &sm_fssinfo_fsm);
+
+    if(H5F_PAGED_AGGR(f)) {
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, f->shared->fs_page_size + 1, &lg_fshdr_fsm);
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, f->shared->fs_page_size + 1, &lg_fssinfo_fsm);
+
+        result = (fsm_type == sm_fshdr_fsm) || (fsm_type == sm_fssinfo_fsm)
+                || (fsm_type == lg_fshdr_fsm) || (fsm_type == lg_fssinfo_fsm);
+    } /* end if */
+    else {
+        /* In principle, fsm_type should always be less than 
+         * H5F_MEM_PAGE_LARGE_SUPER whenever paged aggregation
+         * is not enabled.  However, since there is code that does
+         * not observe this prinicple, force the result to FALSE if
+         * fsm_type is greater than or equal to H5F_MEM_PAGE_LARGE_SUPER.
+         */
+        if(fsm_type >= H5F_MEM_PAGE_LARGE_SUPER)
+            result = FALSE;
+        else
+            result = (fsm_type == sm_fshdr_fsm) || (fsm_type == sm_fssinfo_fsm);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(result)
+} /* H5MF__fsm_type_is_self_referential() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF__fsm_is_self_referential()
+ *
+ * Purpose:     Return TRUE if the indicated free space manager allocates
+ *		file space for free space managers.  Return FALSE otherwise.
+ *
+ * Return:      TRUE/FALSE
+ *
+ * Programmer:  John Mainzer
+ *              12/6/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5MF__fsm_is_self_referential(H5F_t *f, H5FS_t *fspace)
+{
+    H5F_mem_page_t sm_fshdr_fsm;
+    H5F_mem_page_t sm_fssinfo_fsm;
+    hbool_t result = FALSE;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(fspace);
+
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, (size_t)1, &sm_fshdr_fsm);
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, (size_t)1, &sm_fssinfo_fsm);
+
+    if(H5F_PAGED_AGGR(f)) {
+        H5F_mem_page_t lg_fshdr_fsm;
+        H5F_mem_page_t lg_fssinfo_fsm;
+
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, f->shared->fs_page_size + 1, &lg_fshdr_fsm);
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, f->shared->fs_page_size + 1, &lg_fssinfo_fsm);
+
+        result = (fspace == f->shared->fs_man[sm_fshdr_fsm]) ||
+                   (fspace == f->shared->fs_man[sm_fssinfo_fsm]) ||
+                   (fspace == f->shared->fs_man[lg_fshdr_fsm]) ||
+                   (fspace == f->shared->fs_man[lg_fssinfo_fsm]);
+    } /* end if */
+    else
+        result = (fspace == f->shared->fs_man[sm_fshdr_fsm]) ||
+                   (fspace == f->shared->fs_man[sm_fssinfo_fsm]);
+
+    FUNC_LEAVE_NOAPI(result)
+} /* H5MF__fsm_is_self_referential() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_tidy_self_referential_fsm_hack
+ *
+ * Purpose:     As discussed in the comments of the settle routines above,
+ *		the existence of self referential free space managers
+ *		as currently implemented creates the possibility of 
+ *		infinite loops at file close.
+ *
+ *		As a hack to avoid this, we have added code to settle
+ *		self referential free space managers, and then allocate 
+ *		space for them directly from the file driver.
+ *
+ *		To avoid dropping ever increasing amounts of file space 
+ *              on the floor with each subsequent file close/open cycle,
+ *              we need to clean this up on file open.  To avoid this,
+ *              this function is called on the first file space allocation
+ *              or deallocation after file open to float the self referential
+ *              free space managers and reduce the EOA to the value it 
+ *              had before the direct allocation of space for the self 
+ *              referential free space managers.
+ *
+ *              The function proceeds as follows:
+ *
+ *              1) Verify that f->shared->first_alloc_dealloc is TRUE, 
+ *                 and then set it to FALSE.
+ *
+ *              2) Get the current EOA.  Verify that it is greater than
+ *                 or equal to f->shared->eoa_pre_fsm_fsalloc.  If the 
+ *                 current eoa is equal to f->shared->eoa_pre_fsm_fsalloc,
+ *                 no self referential FSMs were stored, and we are done.
+ *
+ *                 NOTE:  This will have to be reworked somewhat for 
+ *                 cache image.
+ *
+ *              3) Load the self referential FSMs.  In passing verify that
+ *                 the lowest address of a FSM header is equal to 
+ *                 f->shared->eoa_pre_fsm_fsalloc.'
+ *
+ *                 Note that we don't have to use any special I/O for 
+ *                 this -- we can use the regular I/O methods even if 
+ *                 paged aggregation and page buffering is enabled.
+ *
+ *              4) Float the FSMs. Ensure that the file space is NOT
+ *                 released.
+ *
+ *              5) Set EOA equal to f->shared->eoa_pre_fsm_fsalloc, 
+ *                 and then set f->shared->eoa_pre_fsm_fsalloc to 
+ *                 HADDR_UNDEF.
+ *
+ *		   If page buffering, verify that the new EOA is 
+ *                 on a page boundary, and expunge any pages in the 
+ *                 page buffer after the new EOA.
+ *
+ *              Note that this function is also called from test code
+ *              when it is necessary to startup a self referential 
+ *              free space manager prior to the first file space 
+ *              allocation / deallocation.  Failure to do so will 
+ *              result in assertion failures in this function on
+ *              the first file space allocation / deallocation.
+ *                 
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  John Mainzer
+ *              12/11/16
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_tidy_self_referential_fsm_hack(H5F_t *f, hid_t dxpl_id)
+{
+    haddr_t eoa;                        /* EOA of file */
+    hsize_t tail_size = 0;              /* Size of chunk to free */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */
+    haddr_t first_srfsm_hdr = HADDR_UNDEF; /* Addr of first self referential */
+                                           /* fsm header in file             */
+    H5FS_stat_t fs_stat;                /* Information for hdr FSM */
+    H5F_mem_page_t sm_fshdr_fs_type;    /* Small fs hdr fsm */
+    H5F_mem_page_t sm_fssinfo_fs_type;  /* Small fs sinfo fsm */
+    H5F_mem_page_t lg_fshdr_fs_type;    /* Large fs hdr fsm */
+    H5F_mem_page_t lg_fssinfo_fs_type;  /* Large fs sinfo fsm */
+    hbool_t reset_ring = FALSE;         /* Whether the ring was set */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->fs_persist);
+    HDassert(f->shared->first_alloc_dealloc);
+
+    /* Set the ring type in the DXPL.  Since we are only dealing with 
+     * self referential FSMs, we will only need H5AC_RING_MDFSM.
+     */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_MDFSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+    reset_ring = TRUE;
+
+    /* 1) Verify that f->shared->first_alloc_dealloc is TRUE, 
+     *    and then set it to FALSE.  
+     */
+    HDassert(f->shared->first_alloc_dealloc);
+    f->shared->first_alloc_dealloc = FALSE;
+
+
+    /* 2) Get the current EOA.  Verify that it is greater than
+     *    or equal to f->shared->eoa_pre_fsm_fsalloc.  If the 
+     *    current eoa is equal to f->shared->eoa_pre_fsm_fsalloc,
+     *    no self referential FSMs were stored, and we are done.
+     *
+     *    NOTE:  This will have to be reworked somewhat for 
+     *           cache image.
+     */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get EOA")
+    HDassert(H5F_addr_le(f->shared->eoa_pre_fsm_fsalloc, eoa));
+
+    if(H5F_addr_eq(f->shared->eoa_pre_fsm_fsalloc, eoa))
+        HGOTO_DONE(SUCCEED)
+
+
+    /* 3) Load the self referential FSMs.  In passing verify that
+     *    the lowest address of a FSM header is equal to 
+     *    f->shared->eoa_pre_fsm_fsalloc.'
+     *
+     *    Note that we don't have to use any special I/O for 
+     *    this -- we can use the regular I/O methods even if 
+     *    paged aggregation and page buffering is enabled.
+     */
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, (size_t)1, &sm_fshdr_fs_type);
+    H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, (size_t)1, &sm_fssinfo_fs_type);
+    HDassert(sm_fshdr_fs_type > H5F_MEM_PAGE_DEFAULT);
+    HDassert(sm_fshdr_fs_type < H5F_MEM_PAGE_LARGE_SUPER);
+
+    HDassert(sm_fssinfo_fs_type > H5F_MEM_PAGE_DEFAULT);
+    HDassert(sm_fssinfo_fs_type < H5F_MEM_PAGE_LARGE_SUPER);
+
+    HDassert(NULL == f->shared->fs_man[sm_fshdr_fs_type]);
+    HDassert(NULL == f->shared->fs_man[sm_fssinfo_fs_type]);
+
+    if(H5F_addr_defined(f->shared->fs_addr[sm_fshdr_fs_type])) {
+        first_srfsm_hdr = f->shared->fs_addr[sm_fshdr_fs_type];
+
+        /* open the FSM */
+        if(H5MF_open_fstype(f, dxpl_id, sm_fshdr_fs_type) < 0)
+             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL,  "can't initialize file free space manager")
+
+        HDassert(f->shared->fs_man[sm_fshdr_fs_type]);
+    } /* end if */
+
+    if((sm_fshdr_fs_type != sm_fssinfo_fs_type) &&
+            (H5F_addr_defined(f->shared->fs_addr[sm_fssinfo_fs_type]))) {
+
+        if(!H5F_addr_defined(first_srfsm_hdr) ||
+                (H5F_addr_defined(first_srfsm_hdr) &&
+                    H5F_addr_lt(f->shared->fs_addr[sm_fssinfo_fs_type], first_srfsm_hdr)))
+            first_srfsm_hdr = f->shared->fs_addr[sm_fssinfo_fs_type];
+
+        HDassert(NULL == f->shared->fs_man[sm_fssinfo_fs_type]);
+
+        /* open the FSM */
+        if(H5MF_open_fstype(f, dxpl_id, sm_fssinfo_fs_type) < 0)
+             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space manager")
+
+        HDassert(f->shared->fs_man[sm_fssinfo_fs_type]);
+    } /* end if */
+
+    if(H5F_PAGED_AGGR(f)) {
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_HDR, f->shared->fs_page_size + 1, &lg_fshdr_fs_type);
+        H5MF_alloc_to_fs_type(f, H5FD_MEM_FSPACE_SINFO, f->shared->fs_page_size + 1, &lg_fssinfo_fs_type);
+
+        HDassert(lg_fshdr_fs_type >= H5F_MEM_PAGE_LARGE_SUPER);
+        HDassert(lg_fshdr_fs_type < H5F_MEM_PAGE_NTYPES);
+
+        HDassert(lg_fssinfo_fs_type >= H5F_MEM_PAGE_LARGE_SUPER);
+        HDassert(lg_fssinfo_fs_type < H5F_MEM_PAGE_NTYPES);
+
+        HDassert(NULL == f->shared->fs_man[lg_fshdr_fs_type]);
+        HDassert(NULL == f->shared->fs_man[lg_fssinfo_fs_type]);
+
+        if(H5F_addr_defined(f->shared->fs_addr[lg_fshdr_fs_type])) {
+            if(!H5F_addr_defined(first_srfsm_hdr) ||
+                    (H5F_addr_defined(first_srfsm_hdr) &&
+                        H5F_addr_lt(f->shared->fs_addr[lg_fshdr_fs_type], first_srfsm_hdr)))
+                first_srfsm_hdr = f->shared->fs_addr[lg_fshdr_fs_type];
+
+            HDassert(NULL == f->shared->fs_man[lg_fshdr_fs_type]);
+
+            /* open the FSM */
+            if(H5MF_open_fstype(f, dxpl_id, lg_fshdr_fs_type) < 0)
+                 HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space manager")
+            HDassert(f->shared->fs_man[lg_fshdr_fs_type]);
+        } /* end if */
+
+        if(lg_fshdr_fs_type != lg_fssinfo_fs_type && H5F_addr_defined(f->shared->fs_addr[lg_fssinfo_fs_type])) {
+            if(!H5F_addr_defined(first_srfsm_hdr) ||
+                    (H5F_addr_defined(first_srfsm_hdr) &&
+                        H5F_addr_lt(f->shared->fs_addr[lg_fssinfo_fs_type], first_srfsm_hdr)))
+                first_srfsm_hdr = f->shared->fs_addr[lg_fssinfo_fs_type];
+
+            HDassert(NULL == f->shared->fs_man[lg_fssinfo_fs_type]);
+
+            /* open the FSM */
+            if(H5MF_open_fstype(f, dxpl_id, lg_fssinfo_fs_type) < 0)
+                 HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space manager")
+            HDassert(f->shared->fs_man[lg_fssinfo_fs_type]);
+        } /* end if */
+    } /* end if */
+    HDassert(H5F_addr_eq(first_srfsm_hdr, f->shared->eoa_pre_fsm_fsalloc));
+ 
+    /* 4) Float the FSMs. Ensure that the file space is NOT released. */
+    if(f->shared->fs_man[sm_fshdr_fs_type]) {
+        /* Sanity check: Query free space manager info for this type */
+        if(H5FS_stat_info(f, f->shared->fs_man[sm_fshdr_fs_type], &fs_stat) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't get free-space info")
+
+        HDassert(H5F_addr_defined(fs_stat.addr));
+        HDassert(H5F_addr_defined(fs_stat.sect_addr));
+        if(H5FS_free(f, f->shared->fs_man[sm_fshdr_fs_type], dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free-space headers")
+        f->shared->fs_addr[sm_fshdr_fs_type] = HADDR_UNDEF;
+    } /* end if */
+
+    if(sm_fshdr_fs_type != sm_fssinfo_fs_type && f->shared->fs_man[sm_fssinfo_fs_type]) {
+        /* Sanity check: Query free space manager info for this type */
+        if(H5FS_stat_info(f, f->shared->fs_man[sm_fssinfo_fs_type], &fs_stat) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't get free-space info")
+
+        HDassert(H5F_addr_defined(fs_stat.addr));
+        HDassert(H5F_addr_defined(fs_stat.sect_addr));
+        if(H5FS_free(f, f->shared->fs_man[sm_fssinfo_fs_type], dxpl_id, FALSE) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free-space headers")
+        f->shared->fs_addr[sm_fssinfo_fs_type] = HADDR_UNDEF;
+    } /* end if */
+
+    if(H5F_PAGED_AGGR(f)) {
+        if(f->shared->fs_man[lg_fshdr_fs_type]) {
+            /* Sanity check: Query free space manager info for this type */
+            if(H5FS_stat_info(f, f->shared->fs_man[lg_fshdr_fs_type], &fs_stat) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info")
+
+            HDassert(H5F_addr_defined(fs_stat.addr));
+            HDassert(H5F_addr_defined(fs_stat.sect_addr));
+            if(H5FS_free(f, f->shared->fs_man[lg_fshdr_fs_type], dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't float free-space headers")
+            f->shared->fs_addr[lg_fshdr_fs_type] = HADDR_UNDEF;
+        } /* end if */
+
+        if(lg_fshdr_fs_type != lg_fssinfo_fs_type && f->shared->fs_man[lg_fssinfo_fs_type]) {
+            /* Sanity check: Query free space manager info for this type */
+            if(H5FS_stat_info(f, f->shared->fs_man[lg_fssinfo_fs_type], &fs_stat) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info")
+
+            HDassert(H5F_addr_defined(fs_stat.addr));
+            HDassert(H5F_addr_defined(fs_stat.sect_addr));
+            if(H5FS_free(f, f->shared->fs_man[lg_fssinfo_fs_type], dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't float free-space headers")
+            f->shared->fs_addr[lg_fssinfo_fs_type] = HADDR_UNDEF;
+        } /* end if */
+    } /* end if */
+
+    /* 5) Set EOA equal to f->shared->eoa_pre_fsm_fsalloc, 
+     *    and then set f->shared->eoa_pre_fsm_fsalloc to 
+     *    HADDR_UNDEF.
+     *
+     *    If page buffering, verify that the new EOA is 
+     *    on a page boundary, and expunge any pages in the 
+     *    page buffer after the new EOA.
+     */
+    if(!H5F_PAGED_AGGR(f)) {
+        /* Verify that the aggregators are still shutdown. */
+        HDassert(f->shared->sdata_aggr.tot_size == 0);
+        HDassert(f->shared->sdata_aggr.addr == 0);
+        HDassert(f->shared->sdata_aggr.size == 0);
+
+        HDassert(f->shared->meta_aggr.tot_size == 0);
+        HDassert(f->shared->meta_aggr.addr == 0);
+        HDassert(f->shared->meta_aggr.size == 0);
+    } /* end if */
+
+    tail_size = (hsize_t)(eoa - f->shared->eoa_pre_fsm_fsalloc);
+
+    /* Release file space allocated to self referential FSMs */
+    if(H5F_free(f, dxpl_id, H5FD_MEM_DEFAULT, f->shared->eoa_pre_fsm_fsalloc, tail_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "driver free request failed")
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get EOA")
+    HDassert(H5F_addr_eq(f->shared->eoa_pre_fsm_fsalloc, eoa));
+
+    f->shared->eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+
+    HDassert((!H5F_PAGED_AGGR(f)) || (0 == (eoa % f->shared->fs_page_size)));
+
+done:
+    /* Reset the ring in the DXPL */
+    if(reset_ring)
+        if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+            HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5MF_tidy_self_referential_fsm_hack() */
+
diff --git a/src/H5MFaggr.c b/src/H5MFaggr.c
index 40f3ac0..7c05e0d 100644
--- a/src/H5MFaggr.c
+++ b/src/H5MFaggr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -57,8 +55,10 @@
 /********************/
 /* Local Prototypes */
 /********************/
-static herr_t H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+static herr_t H5MF__aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
     H5F_blk_aggr_t *aggr);
+static haddr_t H5MF__aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
+    H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size);
 
 
 /*********************/
@@ -80,7 +80,7 @@ static herr_t H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
 /*-------------------------------------------------------------------------
  * Function:    H5MF_aggr_vfd_alloc
  *
- * Purpose:     Allocate SIZE bytes of file memory via H5MF_aggr_alloc()
+ * Purpose:     Allocate SIZE bytes of file memory via H5MF__aggr_alloc()
  *		and return the relative address where that contiguous chunk
  *		of file memory exists.
  *		The TYPE argument describes the purpose for which the storage
@@ -100,9 +100,9 @@ H5MF_aggr_vfd_alloc(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size
     haddr_t     ret_value = HADDR_UNDEF;        /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
-#ifdef H5MF_ALLOC_DEBUG
+#ifdef H5MF_AGGR_DEBUG
 HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_type, size);
-#endif /* H5MF_ALLOC_DEBUG */
+#endif /* H5MF_AGGR_DEBUG */
 
     /* check arguments */
     HDassert(f);
@@ -113,12 +113,12 @@ HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_typ
     /* Couldn't find anything from the free space manager, go allocate some */
     if(alloc_type != H5FD_MEM_DRAW && alloc_type != H5FD_MEM_GHEAP) {
         /* Handle metadata differently from "raw" data */
-        if(HADDR_UNDEF == (ret_value = H5MF_aggr_alloc(f, dxpl_id, &(f->shared->meta_aggr), &(f->shared->sdata_aggr), alloc_type, size)))
+        if(HADDR_UNDEF == (ret_value = H5MF__aggr_alloc(f, dxpl_id, &(f->shared->meta_aggr), &(f->shared->sdata_aggr), alloc_type, size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate metadata")
     } /* end if */
     else {
         /* Allocate "raw" data: H5FD_MEM_DRAW and H5FD_MEM_GHEAP */
-        if(HADDR_UNDEF == (ret_value = H5MF_aggr_alloc(f, dxpl_id, &(f->shared->sdata_aggr), &(f->shared->meta_aggr), H5FD_MEM_DRAW, size)))
+        if(HADDR_UNDEF == (ret_value = H5MF__aggr_alloc(f, dxpl_id, &(f->shared->sdata_aggr), &(f->shared->meta_aggr), H5FD_MEM_DRAW, size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate raw data")
     } /* end else */
 
@@ -126,19 +126,16 @@ HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_typ
     HDassert(H5F_addr_le((ret_value + size), f->shared->tmp_addr));
 
 done:
-#ifdef H5MF_ALLOC_DEBUG
+#ifdef H5MF_AGGR_DEBUG
 HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value, size);
-#endif /* H5MF_ALLOC_DEBUG */
-#ifdef H5MF_ALLOC_DEBUG_DUMP
-H5MF_sects_dump(f, dxpl_id, stderr);
-#endif /* H5MF_ALLOC_DEBUG_DUMP */
+#endif /* H5MF_AGGR_DEBUG */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5MF_aggr_vfd_alloc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_aggr_alloc
+ * Function:    H5MF__aggr_alloc
  *
  * Purpose:     Try to allocate SIZE bytes of memory from an aggregator
  *              block if possible.
@@ -151,16 +148,16 @@ H5MF_sects_dump(f, dxpl_id, stderr);
  *
  *-------------------------------------------------------------------------
  */
-haddr_t
-H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
+static haddr_t
+H5MF__aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
     H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size)
 {
-    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     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 = HADDR_UNDEF;        /* Return value */
 
-    FUNC_ENTER_NOAPI(HADDR_UNDEF)
+    FUNC_ENTER_STATIC
 #ifdef H5MF_AGGR_DEBUG
 HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size);
 #endif /* H5MF_AGGR_DEBUG */
@@ -180,11 +177,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 and strategy is not H5F_FILE_SPACE_VFD,
+     * If the aggregation feature is enabled for this file and strategy is not H5F_FILE_SPACE_NONE,
      * allocate "generic" space and sub-allocate out of that, if possible.
-     * Otherwise just allocate through H5FD_alloc().
+     * Otherwise just allocate through H5F_alloc().
      */
-    if((f->shared->feature_flags & aggr->feature_flag) && f->shared->fs_strategy != H5F_FILE_SPACE_VFD) {
+    if((f->shared->feature_flags & aggr->feature_flag) && f->shared->fs_strategy != H5F_FSPACE_STRATEGY_NONE) {
         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 */
@@ -196,12 +193,12 @@ HDfprintf(stderr, "%s: aggr = {%a, %Hu, %Hu}\n", FUNC, aggr->addr, aggr->tot_siz
 #endif /* H5MF_AGGR_DEBUG */
 
         /* Turn off alignment if allocation < threshold */
-	alignment = f->shared->alignment;
-	if(!((alignment > 1) && (size >= f->shared->threshold)))
+	alignment = H5F_ALIGNMENT(f);
+	if(!((alignment > 1) && (size >= H5F_THRESHOLD(f))))
 	    alignment = 0; /* no alignment */
 
         /* Generate fragment if aggregator is mis-aligned */
-	if(alignment && aggr->addr > 0 && aggr->size > 0 && (aggr_mis_align = (aggr->addr + H5FD_get_base_addr(f->shared->lf)) % alignment)) {
+	if(alignment && H5F_addr_gt(aggr->addr, 0) && (aggr_mis_align = (aggr->addr + H5F_BASE_ADDR(f)) % alignment)) {
 	    aggr_frag_addr = aggr->addr;
 	    aggr_frag_size = alignment - aggr_mis_align;
 	} /* end if */
@@ -211,7 +208,7 @@ HDfprintf(stderr, "%s: aggr = {%a, %Hu, %Hu}\n", FUNC, aggr->addr, aggr->tot_siz
 
         /* Check if the space requested is larger than the space left in the block */
         if((size + aggr_frag_size) > aggr->size) {
-            htri_t  	was_extended = FALSE;   /* Whether the file was extended */
+            htri_t  	extended = FALSE;   /* Whether the file was extended */
 
             /* Check if the block asked for is too large for 'normal' aggregator block */
             if(size >= aggr->alloc_size) {
@@ -221,31 +218,27 @@ HDfprintf(stderr, "%s: aggr = {%a, %Hu, %Hu}\n", FUNC, aggr->addr, aggr->tot_siz
                 if(H5F_addr_gt((aggr->addr + aggr->size + ext_size), f->shared->tmp_addr))
                     HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
 
-		if ((aggr->addr > 0) && (was_extended = H5FD_try_extend(f->shared->lf, alloc_type, f, aggr->addr + aggr->size, ext_size)) < 0)
+		if((aggr->addr > 0) && (extended = H5F_try_extend(f, dxpl_id, alloc_type, (aggr->addr + aggr->size), ext_size)) < 0)
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't extending space")
-		else if (was_extended) {
+		else if (extended) {
 		    /* aggr->size is unchanged */
 		    ret_value = aggr->addr + aggr_frag_size;
 		    aggr->addr += ext_size;
 		    aggr->tot_size += ext_size;
 		} else {
-                    /* Check for overlapping into file's temporary allocation space */
-                    if(H5F_addr_gt((eoa + size), f->shared->tmp_addr))
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
-
                     /* Release "other" aggregator, if it exists, is at the end of the allocated space,
                      * has allocated more than one block and the unallocated space is greater than its
                      * allocation block size.
                      */
-		    if ((other_aggr->size > 0) && (H5F_addr_eq((other_aggr->addr + other_aggr->size), eoa)) &&
-			(other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
-                            if(H5MF_aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
+		    if((other_aggr->size > 0) && (H5F_addr_eq((other_aggr->addr + other_aggr->size), eoa)) &&
+			    (other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
+                        if(H5MF__aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
 		    } /* end if */
 
                     /* Allocate space from the VFD (i.e. at the end of the file) */
-		    if(HADDR_UNDEF == (ret_value = H5FD_alloc(f->shared->lf, dxpl_id, alloc_type, f, size, &eoa_frag_addr, &eoa_frag_size)))
-			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate aggregation block")
+		    if(HADDR_UNDEF == (ret_value = H5F_alloc(f, dxpl_id, alloc_type, size, &eoa_frag_addr, &eoa_frag_size)))
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
                 } /* end else */
             } /* end if */
 	    else {
@@ -263,42 +256,55 @@ HDfprintf(stderr, "%s: Allocating block\n", FUNC);
                 if(H5F_addr_gt((aggr->addr + aggr->size + ext_size), f->shared->tmp_addr))
                     HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
 
-		if((aggr->addr > 0) && (was_extended = H5FD_try_extend(f->shared->lf, alloc_type, f, aggr->addr + aggr->size, ext_size)) < 0)
+		if((aggr->addr > 0) && (extended = H5F_try_extend(f, dxpl_id, alloc_type, (aggr->addr + aggr->size), ext_size)) < 0)
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't extending space")
-		else if (was_extended) {
+		else if(extended) {
 		    aggr->addr += aggr_frag_size;
 		    aggr->size += (ext_size - aggr_frag_size);
 		    aggr->tot_size += ext_size;
-		} else {
+		} /* end else-if */
+		else {
                     haddr_t new_space;          /* Address of new space allocated */
 
-                    /* Check for overlapping into file's temporary allocation space */
-                    if(H5F_addr_gt((eoa + aggr->alloc_size), f->shared->tmp_addr))
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
-
                     /* Release "other" aggregator, if it exists, is at the end of the allocated space,
                      * has allocated more than one block and the unallocated space is greater than its
                      * allocation block size.
                      */
 		    if((other_aggr->size > 0) && (H5F_addr_eq((other_aggr->addr + other_aggr->size), eoa)) &&
-			(other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
-                            if(H5MF_aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
+			    (other_aggr->tot_size > other_aggr->size) && ((other_aggr->tot_size - other_aggr->size) >= other_aggr->alloc_size)) {
+                        if(H5MF__aggr_free(f, dxpl_id, other_alloc_type, other_aggr) < 0)
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
 		    } /* end if */
 
                     /* Allocate space from the VFD (i.e. at the end of the file) */
-		    if(HADDR_UNDEF == (new_space = H5FD_alloc(f->shared->lf, dxpl_id, alloc_type, f, aggr->alloc_size, &eoa_frag_addr, &eoa_frag_size)))
-			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate aggregation block")
+		    if(HADDR_UNDEF == (new_space = H5F_alloc(f, dxpl_id, alloc_type, aggr->alloc_size, &eoa_frag_addr, &eoa_frag_size)))
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
 
                     /* Return the unused portion of the block to a free list */
                     if(aggr->size > 0)
                         if(H5MF_xfree(f, alloc_type, dxpl_id, aggr->addr, aggr->size) < 0)
                             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation block")
 
-                    /* Point the aggregator at the newly allocated block */
-                    aggr->addr = new_space;
-                    aggr->size = aggr->alloc_size;
-                    aggr->tot_size = aggr->alloc_size;
+                    /* If the block is not to be aligned, fold the eoa fragment
+                     * into the newly allocated aggregator, as it could have
+                     * been allocated in an aligned manner if the aggregator
+                     * block is larger than the threshold */
+                    if(eoa_frag_size && !alignment) {
+                        HDassert(eoa_frag_addr + eoa_frag_size == new_space);
+                        aggr->addr = eoa_frag_addr;
+                        aggr->size = aggr->alloc_size + eoa_frag_size;
+                        aggr->tot_size = aggr->size;
+
+                        /* Reset EOA fragment */
+                        eoa_frag_addr = HADDR_UNDEF;
+                        eoa_frag_size = 0;
+                    } /* end if */
+                    else {
+                        /* Point the aggregator at the newly allocated block */
+                        aggr->addr = new_space;
+                        aggr->size = aggr->alloc_size;
+                        aggr->tot_size = aggr->alloc_size;
+                    } /* end else */
                 } /* end else */
 
 		/* Allocate space out of the metadata block */
@@ -313,7 +319,7 @@ HDfprintf(stderr, "%s: Allocating block\n", FUNC);
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free eoa fragment")
 
 	    /* Freeing any possible fragment due to alignment in the block after extension */
-	    if(was_extended && aggr_frag_size)
+            if(extended && aggr_frag_size)
 		if(H5MF_xfree(f, alloc_type, dxpl_id, aggr_frag_addr, aggr_frag_size) < 0)
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, HADDR_UNDEF, "can't free aggregation fragment")
         } /* end if */
@@ -330,12 +336,8 @@ HDfprintf(stderr, "%s: Allocating block\n", FUNC);
         } /* end else */
     } /* end if */
     else {
-        /* Check for overlapping into file's temporary allocation space */
-        if(H5F_addr_gt((eoa + size), f->shared->tmp_addr))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, HADDR_UNDEF, "'normal' file space allocation request will overlap into 'temporary' file space")
-
         /* Allocate data from the file */
-        if(HADDR_UNDEF == (ret_value = H5FD_alloc(f->shared->lf, dxpl_id, type, f, size, &eoa_frag_addr, &eoa_frag_size)))
+        if(HADDR_UNDEF == (ret_value = H5F_alloc(f, dxpl_id, type, size, &eoa_frag_addr, &eoa_frag_size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "can't allocate file space")
 
         /* Check if fragment was generated */
@@ -349,15 +351,15 @@ HDfprintf(stderr, "%s: Allocating block\n", FUNC);
     HDassert(H5F_addr_le((ret_value + size), f->shared->tmp_addr));
 
     /* Post-condition sanity check */
-    if(f->shared->alignment && size >= f->shared->threshold)
-	HDassert(!((ret_value + H5FD_get_base_addr(f->shared->lf)) % f->shared->alignment));
+    if(H5F_ALIGNMENT(f) && size >= H5F_THRESHOLD(f))
+        HDassert(!((ret_value + H5FD_get_base_addr(f->shared->lf)) % H5F_ALIGNMENT(f)));
 
 done:
 #ifdef H5MF_AGGR_DEBUG
 HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value);
 #endif /* H5MF_AGGR_DEBUG */
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_aggr_alloc() */
+} /* end H5MF__aggr_alloc() */
 
 

 /*-------------------------------------------------------------------------
@@ -386,8 +388,8 @@ HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value);
  *-------------------------------------------------------------------------
  */
 htri_t
-H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr, H5FD_mem_t type,
-    haddr_t blk_end, hsize_t extra_requested)
+H5MF_aggr_try_extend(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr, 
+    H5FD_mem_t type, haddr_t blk_end, hsize_t extra_requested)
 {
     htri_t ret_value = FALSE;           /* Return value */
 
@@ -414,14 +416,14 @@ H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr, H5FD_mem_t type,
 	    /* If the aggregator is at the end of file: */
 	    if(H5F_addr_eq(eoa, aggr->addr + aggr->size)) {
 		/* If extra_requested is below percentage threshold, extend block into the aggregator. */
-		if(extra_requested <= (EXTEND_THRESHOLD * aggr->size)) {
+		if(extra_requested <= (hsize_t)(EXTEND_THRESHOLD * (float)aggr->size)) {
 		    aggr->size -= extra_requested;
 		    aggr->addr += extra_requested;
 
 		    /* Indicate success */
 		    HGOTO_DONE(TRUE);
-		} 
-		/* 
+		} /* end if */
+		/*
 		 * If extra_requested is above percentage threshold:
 		 * 1) "bubble" up the aggregator by aggr->alloc_size or extra_requested
 		 * 2) extend the block into the aggregator 
@@ -429,7 +431,7 @@ H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr, H5FD_mem_t type,
 		else {
 		    hsize_t extra = (extra_requested < aggr->alloc_size) ? aggr->alloc_size : extra_requested;
 
-		    if((ret_value = H5FD_try_extend(f->shared->lf, type, f, (aggr->addr + aggr->size), extra)) < 0)
+                    if((ret_value = H5F_try_extend(f, dxpl_id, type, (aggr->addr + aggr->size), extra)) < 0)
 			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
 		    else if(ret_value == TRUE) {
 			/* Shift the aggregator block by the extra requested */
@@ -445,10 +447,11 @@ H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr, H5FD_mem_t type,
                          */
 			aggr->size += extra;
 			aggr->size -= extra_requested;
-		    } /* end if */
-		} /* end if */
+		    } /* end else-if */
+		} /* end else */
 	    } /* end if */
-            else { /* The aggreator is not at end of file */
+            else {
+                /* The aggreator is not at end of file */
                 /* Check if aggregator has enough internal space to satisfy the extension. */
                 if(aggr->size >= extra_requested) {
                     /* Extend block into aggregator */
@@ -809,7 +812,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5MF_aggr_free
+ * Function:    H5MF__aggr_free
  *
  * Purpose:     Free the aggregator's space in the file.
  *
@@ -823,11 +826,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
+H5MF__aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
 {
     herr_t ret_value = SUCCEED;   	/* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -840,7 +843,7 @@ H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
     HDassert(f->shared->feature_flags & aggr->feature_flag);
 
     /* Free the remaining space at EOA in the aggregator */
-    if(H5FD_free(f->shared->lf, dxpl_id, type, f, aggr->addr, aggr->size) < 0)
+    if(H5F_free(f, dxpl_id, type, aggr->addr, aggr->size) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free aggregation block")
 
     /* Reset the aggregator */
@@ -850,7 +853,7 @@ H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, H5F_blk_aggr_t *aggr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5MF_aggr_free() */
+} /* H5MF__aggr_free() */
 
 

 /*-------------------------------------------------------------------------
@@ -882,13 +885,13 @@ H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id)
     if((ma_status = H5MF_aggr_can_shrink_eoa(f, H5FD_MEM_DEFAULT, &(f->shared->meta_aggr))) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query metadata aggregator stats")
     if(ma_status > 0)
-	if(H5MF_aggr_free(f, dxpl_id, H5FD_MEM_DEFAULT, &(f->shared->meta_aggr)) < 0)
+	if(H5MF__aggr_free(f, dxpl_id, H5FD_MEM_DEFAULT, &(f->shared->meta_aggr)) < 0)
 	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
 
     if((sda_status = H5MF_aggr_can_shrink_eoa(f, H5FD_MEM_DRAW, &(f->shared->sdata_aggr))) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query small data aggregator stats")
     if(sda_status > 0)
-	if(H5MF_aggr_free(f, dxpl_id, H5FD_MEM_DRAW, &(f->shared->sdata_aggr)) < 0)
+	if(H5MF__aggr_free(f, dxpl_id, H5FD_MEM_DRAW, &(f->shared->sdata_aggr)) < 0)
 	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't check for shrinking eoa")
 
     ret_value = (ma_status || sda_status);
diff --git a/src/H5MFdbg.c b/src/H5MFdbg.c
index 59da9e8..49cfbfc 100644
--- a/src/H5MFdbg.c
+++ b/src/H5MFdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -116,7 +114,9 @@ H5MF_sects_debug_cb(H5FS_section_info_t *_sect, void *_udata)
     /* Print generic section information */
     HDfprintf(udata->stream, "%*s%-*s %s\n", udata->indent, "", udata->fwidth,
 	      "Section type:",
-	      (sect->sect_info.type == H5MF_FSPACE_SECT_SIMPLE ? "simple" : "unknown"));
+          (sect->sect_info.type == H5MF_FSPACE_SECT_SIMPLE ? "simple" : 
+          (sect->sect_info.type == H5MF_FSPACE_SECT_SMALL ? "small" : 
+          (sect->sect_info.type == H5MF_FSPACE_SECT_LARGE ? "large" : "unknown"))));
     HDfprintf(udata->stream, "%*s%-*s %a\n", udata->indent, "", udata->fwidth,
 	      "Section address:",
 	      sect->sect_info.addr);
@@ -158,7 +158,7 @@ H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, FILE *stream, int ind
     herr_t      ret_value = SUCCEED;    /* Return value */
     H5FD_mem_t 	type;                    /* Memory type for iteration */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /*
      * Check arguments.
@@ -171,7 +171,7 @@ H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, FILE *stream, int ind
     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)
+                if(H5MF_open_fstype(f, dxpl_id, type) < 0)
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
 
 	    if(f->shared->fs_man[type]) {
@@ -192,10 +192,10 @@ H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, FILE *stream, int ind
 		    HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
 	    } /* end if */
 	    break;
-	}
+	} /* end if */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5MF_sects_debug() */
 
 #ifdef H5MF_ALLOC_DEBUG_DUMP
@@ -217,16 +217,11 @@ herr_t
 H5MF_sects_dump(H5F_t *f, hid_t dxpl_id, FILE *stream)
 {
     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" */
-    haddr_t sda_addr = HADDR_UNDEF;     /* Base "small data aggregator" address */
-    hsize_t sda_size = 0;               /* Size of "small data aggregator" */
-    H5FD_mem_t type;                    /* Memory type for iteration */
     int indent = 0;                     /* Amount to indent */
     int fwidth = 50;                    /* Field width */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Dumping file free space sections\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -244,63 +239,94 @@ HDfprintf(stderr, "%s: Dumping file free space sections\n", FUNC);
 HDfprintf(stderr, "%s: for type = H5FD_MEM_DEFAULT, eoa = %a\n", FUNC, eoa);
 #endif /* H5MF_ALLOC_DEBUG */
 
-    /* Retrieve metadata aggregator info, if available */
-    H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-#ifdef H5MF_ALLOC_DEBUG
-HDfprintf(stderr, "%s: ma_addr = %a, ma_size = %Hu, end of ma = %a\n", FUNC, ma_addr, ma_size, (haddr_t)((ma_addr + ma_size) - 1));
-#endif /* H5MF_ALLOC_DEBUG */
+    if(H5F_PAGED_AGGR(f)) { /* File space paging */
+        H5F_mem_page_t ptype;		/* Memory type for iteration -- page fs */
 
-    /* Retrieve 'small data' aggregator info, if available */
-    H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size);
-#ifdef H5MF_ALLOC_DEBUG
-HDfprintf(stderr, "%s: sda_addr = %a, sda_size = %Hu, end of sda = %a\n", FUNC, sda_addr, sda_size, (haddr_t)((sda_addr + sda_size) - 1));
-#endif /* H5MF_ALLOC_DEBUG */
-
-    /* Iterate over all the free space types that have managers and dump each free list's space */
-    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
-        /* Print header for type */
-        HDfprintf(stream, "%*sFile Free Space Info for type = %u:\n", indent, "", (unsigned)type);
-
-        /* Check for this type being mapped to another type */
-        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 = 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:",
-                      eoa);
+        for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype)) {
+            /* Print header for type */
+            HDfprintf(stream, "%*sFile Free Space Info for type = %u:\n", indent, "", (unsigned)ptype);
 
             /* Print header for sections */
             HDfprintf(stream, "%*sSections:\n", indent + 3, "");
 
             /* If there is a free space manager for this type, iterate over them */
-            if(f->shared->fs_man[type]) {
+            if(f->shared->fs_man[ptype]) {
                 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.fspace = f->shared->fs_man[ptype];
                 udata.stream = stream;
                 udata.indent = indent + 6;
                 udata.fwidth = MAX(0, fwidth - 6);
 
                 /* 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)
+                if(H5FS_sect_iterate(f, dxpl_id, f->shared->fs_man[ptype], H5MF_sects_debug_cb, &udata) < 0)
                     HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
             } /* end if */
-            else {
+            else
                 /* No sections of this type */
                 HDfprintf(stream, "%*s<none>\n", indent + 6, "");
-            } /* end else */
-        } /* end if */
-        else {
-            HDfprintf(stream, "%*sMapped to type = %u\n", indent, "", (unsigned)f->shared->fs_type_map[type]);
-        } /* end else */
-    } /* end for */
+        } /* end for */
+    } /* end if */
+    else { /* not file space paging */
+        H5FD_mem_t atype;                   /* Memory type for iteration -- aggr fs */
+        haddr_t ma_addr = HADDR_UNDEF;      /* Base "metadata aggregator" address */
+        hsize_t ma_size = 0;                /* Size of "metadata aggregator" */
+        haddr_t sda_addr = HADDR_UNDEF;     /* Base "small data aggregator" address */
+        hsize_t sda_size = 0;               /* Size of "small data aggregator" */
+
+        /* Retrieve metadata aggregator info, if available */
+        H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: ma_addr = %a, ma_size = %Hu, end of ma = %a\n", FUNC, ma_addr, ma_size, (haddr_t)((ma_addr + ma_size) - 1));
+#endif /* H5MF_ALLOC_DEBUG */
+
+        /* Retrieve 'small data' aggregator info, if available */
+        H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sda_addr, &sda_size);
+#ifdef H5MF_ALLOC_DEBUG
+HDfprintf(stderr, "%s: sda_addr = %a, sda_size = %Hu, end of sda = %a\n", FUNC, sda_addr, sda_size, (haddr_t)((sda_addr + sda_size) - 1));
+#endif /* H5MF_ALLOC_DEBUG */
+
+        /* Iterate over all the free space types that have managers and dump each free list's space */
+        for(atype = H5FD_MEM_DEFAULT; atype < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, atype)) {
+            /* Print header for type */
+            HDfprintf(stream, "%*sFile Free Space Info for type = %u:\n", indent, "", (unsigned)atype);
+
+            /* Check for this type being mapped to another type */
+            if(H5FD_MEM_DEFAULT == f->shared->fs_type_map[atype] || atype == f->shared->fs_type_map[atype]) {
+                /* Retrieve the 'eoa' for this file memory type */
+                if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, atype)))
+                    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:", eoa);
+
+                /* Print header for sections */
+                HDfprintf(stream, "%*sSections:\n", indent + 3, "");
+
+                /* If there is a free space manager for this type, iterate over them */
+                if(f->shared->fs.aggr.fs_man[atype]) {
+                    H5MF_debug_iter_ud_t udata;        /* User data for callbacks */
+
+                    /* Prepare user data for section iteration callback */
+                    udata.fspace = f->shared->fs_man[atype];
+                    udata.stream = stream;
+                    udata.indent = indent + 6;
+                    udata.fwidth = MAX(0, fwidth - 6);
+
+                    /* Iterate over all the free space sections */
+                    if(H5FS_sect_iterate(f, dxpl_id, f->shared->fs_man[atype], H5MF_sects_debug_cb, &udata) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
+                } /* end if */
+                else /* No sections of this type */
+                    HDfprintf(stream, "%*s<none>\n", indent + 6, "");
+            } /* end if */
+            else
+                HDfprintf(stream, "%*sMapped to type = %u\n", indent, "", (unsigned)f->shared->fs_type_map[atype]);
+        } /* end for */
+    } /* end else */
 
 done:
 HDfprintf(stderr, "%s: Done dumping file free space sections\n", FUNC);
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5MF_sects_dump() */
 #endif /* H5MF_ALLOC_DEBUG_DUMP */
 
diff --git a/src/H5MFmodule.h b/src/H5MFmodule.h
index 6e5f8ad..53daabf 100644
--- a/src/H5MFmodule.h
+++ b/src/H5MFmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5MFpkg.h b/src/H5MFpkg.h
index 1a62710..b95a6db 100644
--- a/src/H5MFpkg.h
+++ b/src/H5MFpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -51,9 +49,38 @@
 /* Define this to dump free space tracker contents after they've been modified */
 /* #define H5MF_ALLOC_DEBUG_DUMP */
 
-/* Free space section types for file */
+/* Free-space section types for file */
 /* (values stored in free space data structures in file) */
-#define H5MF_FSPACE_SECT_SIMPLE         0       /* Section is a range of actual bytes in file */
+#define H5MF_FSPACE_SECT_SIMPLE     0   /* For non-paged aggregation: section is a range of actual bytes in file */
+#define H5MF_FSPACE_SECT_SMALL      1   /* For paged aggregation: "small" meta/raw data section which is < fsp_size) */
+#define H5MF_FSPACE_SECT_LARGE      2   /* For paged aggregation: "large" Section which is >= fsp_size) */
+
+/* For non-paged aggregation: map allocation request type to tracked free-space type */
+/* F -- pointer to H5F_t; T -- H5FD_mem_t */
+#define H5MF_ALLOC_TO_FS_AGGR_TYPE(F, T)                  \
+        ((H5FD_MEM_DEFAULT == (F)->shared->fs_type_map[T]) ? (T) : (F)->shared->fs_type_map[T])
+
+/* Get section class type based on size */
+#define H5MF_SECT_CLASS_TYPE(F, S)                          \
+        ((H5F_PAGED_AGGR(F)) ?                              \
+         ((S >= (F)->shared->fs_page_size) ? H5MF_FSPACE_SECT_LARGE : H5MF_FSPACE_SECT_SMALL) : H5MF_FSPACE_SECT_SIMPLE)
+
+/* Get section class cls */
+#define H5MF_SECT_CLS_TYPE(F, S)                            \
+        ((H5F_PAGED_AGGR(F)) ?                              \
+         ((S >= (F)->shared->fs_page_size) ?                \
+          H5MF_FSPACE_SECT_CLS_LARGE : H5MF_FSPACE_SECT_CLS_SMALL) : H5MF_FSPACE_SECT_CLS_SIMPLE)
+
+/* Calculate the mis-aligned fragment */
+#define H5MF_EOA_MISALIGN(F, E, A, FR)                                  \
+{                                                                       \
+    hsize_t m;                                                          \
+                                                                        \
+    if(H5F_addr_gt((E), 0) && ((m) = ((E) + H5F_BASE_ADDR(F)) % (A)))   \
+        (FR) = (A) - m;                                                 \
+    else                                                                \
+        (FR) = 0;                                                       \
+}
 
 
 /****************************/
@@ -129,6 +156,15 @@ typedef struct H5MF_sect_ud_t {
     H5F_blk_aggr_t *aggr;       /* Aggregator block to operate on */
 } H5MF_sect_ud_t;
 
+/* Information about the current free-space manager to use */
+typedef struct H5MF_fs_t {
+    H5F_fs_state_t *fs_state;
+    haddr_t *fs_addr;
+    H5FS_t **fs_man;
+    hsize_t     align_thres;	/* Threshold for alignment              */
+    hsize_t     alignment;      /* Alignment                            */
+} H5MF_fs_t;
+
 
 /*****************************/
 /* Package Private Variables */
@@ -136,6 +172,8 @@ typedef struct H5MF_sect_ud_t {
 
 /* H5MF single section inherits serializable properties from H5FS_section_class_t */
 H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1];
+H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SMALL[1];
+H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_LARGE[1];
 
 
 /******************************/
@@ -143,23 +181,24 @@ H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1];
 /******************************/
 
 /* Allocator routines */
-H5_DLL herr_t H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
-H5_DLL herr_t H5MF_alloc_start(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
+H5_DLL herr_t H5MF_open_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
+H5_DLL herr_t H5MF_start_fstype(H5F_t *f, hid_t dxpl_id, H5F_mem_page_t type);
+
+H5_DLL htri_t H5MF_find_sect(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size, H5FS_t *fspace, haddr_t *addr);
+H5_DLL herr_t H5MF_add_sect(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, H5FS_t *fspace, H5MF_free_section_t *node);
+
 H5_DLL herr_t H5MF_sects_dump(H5F_t *f, hid_t dxpl_id, FILE *stream);
 
-/* 'simple' section routines */
-H5_DLL H5MF_free_section_t *H5MF_sect_simple_new(haddr_t sect_off,
+H5_DLL void H5MF_alloc_to_fs_type(H5F_t *f, H5FD_mem_t alloc_type, hsize_t size, H5F_mem_page_t *fs_type);
+
+/* 'simple/small/large' section routines */
+H5_DLL H5MF_free_section_t *H5MF_sect_new(unsigned ctype, haddr_t sect_off,
     hsize_t sect_size);
-H5_DLL htri_t H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect,
-    void *udata);
-H5_DLL herr_t H5MF_sect_simple_shrink(H5FS_section_info_t **_sect,
-    void *udata);
-H5_DLL herr_t H5MF_sect_simple_free(H5FS_section_info_t *sect);
+H5_DLL herr_t H5MF_sect_free(H5FS_section_info_t *sect);
+
 
 /* Block aggregator routines */
-H5_DLL haddr_t H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
-    H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size);
-H5_DLL htri_t H5MF_aggr_try_extend(H5F_t *f, H5F_blk_aggr_t *aggr,
+H5_DLL htri_t H5MF_aggr_try_extend(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
     H5FD_mem_t type, haddr_t abs_blk_end, hsize_t extra_requested);
 H5_DLL htri_t H5MF_aggr_can_absorb(const H5F_t *f, const H5F_blk_aggr_t *aggr,
     const H5MF_free_section_t *sect, H5MF_shrink_type_t *shrink);
diff --git a/src/H5MFprivate.h b/src/H5MFprivate.h
index 22ed308..bfeaa33 100644
--- a/src/H5MFprivate.h
+++ b/src/H5MFprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -51,16 +49,15 @@
 
 /* File space manager routines */
 H5_DLL herr_t H5MF_init_merge_flags(H5F_t *f);
-H5_DLL herr_t H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space,
-    hsize_t *meta_size);
+H5_DLL herr_t H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_size);
 H5_DLL herr_t H5MF_close(H5F_t *f, hid_t dxpl_id);
 H5_DLL herr_t H5MF_try_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(const H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
-			  hsize_t size);
+H5_DLL herr_t H5MF_xfree(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,
@@ -75,6 +72,18 @@ H5_DLL haddr_t H5MF_alloc_tmp(H5F_t *f, hsize_t size);
 H5_DLL herr_t H5MF_free_aggrs(H5F_t *f, hid_t dxpl_id);
 H5_DLL htri_t H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id);
 
+/* Free space manager settling routines */
+H5_DLL herr_t H5MF_settle_raw_data_fsm(H5F_t *f, hid_t dxpl_id, hbool_t *fsm_settled);
+H5_DLL herr_t H5MF_settle_meta_data_fsm(H5F_t *f, hid_t dxpl_id, hbool_t *fsm_settled);
+
+/* This function has to be declared in H5MFprivate.h as it is needed 
+ * in our test code to allow us to manually start a self referential 
+ * free space manager prior to the first file space allocations / 
+ * deallocation without causing assertion failures on the first
+ * file space allocation / deallocation.
+ */
+H5_DLL herr_t H5MF_tidy_self_referential_fsm_hack(H5F_t *f, hid_t dxpl_id);
+
 /* Debugging routines */
 #ifdef H5MF_DEBUGGING
 H5_DLL herr_t H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
diff --git a/src/H5MFsection.c b/src/H5MFsection.c
index e5a0cf0..0dd26b3 100644
--- a/src/H5MFsection.c
+++ b/src/H5MFsection.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -57,18 +55,47 @@
 /* Local Prototypes */
 /********************/
 
-/* 'simple' section callbacks */
-static H5FS_section_info_t *H5MF_sect_simple_deserialize(const H5FS_section_class_t *cls,
+/* 'simple/small/large' section callbacks */
+static H5FS_section_info_t *H5MF_sect_deserialize(const H5FS_section_class_t *cls,
     hid_t dxpl_id, const uint8_t *buf, haddr_t sect_addr, hsize_t sect_size,
     unsigned *des_flags);
+static herr_t H5MF_sect_valid(const H5FS_section_class_t *cls,
+    const H5FS_section_info_t *sect, hid_t dxpl_id);
+static H5FS_section_info_t *H5MF_sect_split(H5FS_section_info_t *sect,
+    hsize_t frag_size);
+
+
+/* 'simple' section callbacks */
 static htri_t H5MF_sect_simple_can_merge(const H5FS_section_info_t *sect1,
     const H5FS_section_info_t *sect2, void *udata);
-static herr_t H5MF_sect_simple_merge(H5FS_section_info_t *sect1,
+static herr_t H5MF_sect_simple_merge(H5FS_section_info_t **sect1,
     H5FS_section_info_t *sect2, void *udata);
-static herr_t H5MF_sect_simple_valid(const H5FS_section_class_t *cls,
-    const H5FS_section_info_t *sect, hid_t dxpl_id);
-static H5FS_section_info_t *H5MF_sect_simple_split(H5FS_section_info_t *sect,
-    hsize_t frag_size);
+static htri_t H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect,
+    void *udata);
+static herr_t H5MF_sect_simple_shrink(H5FS_section_info_t **_sect,
+    void *udata);
+
+
+/* 'small' section callbacks */
+static herr_t H5MF_sect_small_add(H5FS_section_info_t **_sect, unsigned *flags, void *_udata);
+static htri_t H5MF_sect_small_can_merge(const H5FS_section_info_t *sect1,
+    const H5FS_section_info_t *sect2, void *udata);
+static herr_t H5MF_sect_small_merge(H5FS_section_info_t **sect1,
+    H5FS_section_info_t *sect2, void *udata);
+static htri_t H5MF_sect_small_can_shrink(const H5FS_section_info_t *_sect,
+    void *udata);
+static herr_t H5MF_sect_small_shrink(H5FS_section_info_t **_sect,
+    void *udata);
+
+/* 'large' section callbacks */
+static htri_t H5MF_sect_large_can_merge(const H5FS_section_info_t *sect1,
+    const H5FS_section_info_t *sect2, void *udata);
+static herr_t H5MF_sect_large_merge(H5FS_section_info_t **sect1,
+    H5FS_section_info_t *sect2, void *udata);
+static htri_t H5MF_sect_large_can_shrink(const H5FS_section_info_t *_sect,
+    void *udata);
+static herr_t H5MF_sect_large_shrink(H5FS_section_info_t **_sect,
+    void *udata);
 
 /*********************/
 /* Package Variables */
@@ -89,17 +116,68 @@ H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1] = {{
     /* Object methods */
     NULL,				/* Add section                  */
     NULL,				/* Serialize section            */
-    H5MF_sect_simple_deserialize,	/* Deserialize section          */
+    H5MF_sect_deserialize,		/* Deserialize section          */
     H5MF_sect_simple_can_merge,		/* Can sections merge?          */
     H5MF_sect_simple_merge,		/* Merge sections               */
     H5MF_sect_simple_can_shrink,	/* Can section shrink container?*/
     H5MF_sect_simple_shrink,		/* Shrink container w/section   */
-    H5MF_sect_simple_free,		/* Free section                 */
-    H5MF_sect_simple_valid,		/* Check validity of section    */
-    H5MF_sect_simple_split,		/* Split section node for alignment */
+    H5MF_sect_free,			/* Free section                 */
+    H5MF_sect_valid,			/* Check validity of section    */
+    H5MF_sect_split,			/* Split section node for alignment */
     NULL,				/* Dump debugging for section   */
 }};
 
+/* Class info for "small" free space sections */
+H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SMALL[1] = {{
+    /* Class variables */
+    H5MF_FSPACE_SECT_SMALL,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM | H5FS_CLS_ADJUST_OK, /* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    NULL,				/* Initialize section class     */
+    NULL,				/* Terminate section class      */
+
+    /* Object methods */
+    H5MF_sect_small_add,		/* Add section                  */
+    NULL,				/* Serialize section            */
+    H5MF_sect_deserialize,		/* Deserialize section          */
+    H5MF_sect_small_can_merge,		/* Can sections merge?          */
+    H5MF_sect_small_merge,		/* Merge sections               */
+    H5MF_sect_small_can_shrink,		/* Can section shrink container?*/
+    H5MF_sect_small_shrink,		/* Shrink container w/section   */
+    H5MF_sect_free,			/* Free section                 */
+    H5MF_sect_valid,			/* Check validity of section    */
+    H5MF_sect_split,			/* Split section node for alignment */
+    NULL,				/* Dump debugging for section   */
+}};
+
+/* Class info for "large" free space sections */
+H5FS_section_class_t H5MF_FSPACE_SECT_CLS_LARGE[1] = {{
+    /* Class variables */
+    H5MF_FSPACE_SECT_LARGE,		/* Section type                 */
+    0,					/* Extra serialized size        */
+    H5FS_CLS_MERGE_SYM | H5FS_CLS_ADJUST_OK, /* Class flags                  */
+    NULL,				/* Class private info           */
+
+    /* Class methods */
+    NULL,				/* Initialize section class     */
+    NULL,				/* Terminate section class      */
+
+    /* Object methods */
+    NULL,				/* Add section                  */
+    NULL,				/* Serialize section            */
+    H5MF_sect_deserialize,		/* Deserialize section          */
+    H5MF_sect_large_can_merge,		/* Can sections merge?          */
+    H5MF_sect_large_merge,		/* Merge sections               */
+    H5MF_sect_large_can_shrink,		/* Can section shrink container?*/
+    H5MF_sect_large_shrink,		/* Shrink container w/section   */
+    H5MF_sect_free,			/* Free section                 */
+    H5MF_sect_valid,			/* Check validity of section    */
+    H5MF_sect_split,			/* Split section node for alignment */
+    NULL,				/* Dump debugging for section   */
+}};
 
 /*****************************/
 /* Library Private Variables */
@@ -113,12 +191,15 @@ H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1] = {{
 /* Declare a free list to manage the H5MF_free_section_t struct */
 H5FL_DEFINE(H5MF_free_section_t);
 
+/* 
+ * "simple/small/large" section callbacks
+ */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_sect_simple_new
+ * Function:	H5MF_sect_new
  *
- * Purpose:	Create a new 'simple' section and return it to the caller
+ * Purpose:	Create a new section of "ctype" and return it to the caller
  *
  * Return:	Pointer to new section on success/NULL on failure
  *
@@ -129,9 +210,9 @@ H5FL_DEFINE(H5MF_free_section_t);
  *-------------------------------------------------------------------------
  */
 H5MF_free_section_t *
-H5MF_sect_simple_new(haddr_t sect_off, hsize_t sect_size)
+H5MF_sect_new(unsigned ctype, haddr_t sect_off, hsize_t sect_size)
 {
-    H5MF_free_section_t *sect = NULL;   /* 'Simple' free space section to add */
+    H5MF_free_section_t *sect;          /* 'Simple' free space section to add */
     H5MF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -148,7 +229,7 @@ H5MF_sect_simple_new(haddr_t sect_off, hsize_t sect_size)
     sect->sect_info.size = sect_size;
 
     /* Set the section's class & state */
-    sect->sect_info.type = H5MF_FSPACE_SECT_SIMPLE;
+    sect->sect_info.type = ctype;
     sect->sect_info.state = H5FS_SECT_LIVE;
 
     /* Set return value */
@@ -156,13 +237,43 @@ H5MF_sect_simple_new(haddr_t sect_off, hsize_t sect_size)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5MF_sect_simple_new() */
+} /* end H5MF_sect_new() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_sect_simple_deserialize
+ * Function:	H5MF_sect_free
  *
- * Purpose:	Deserialize a buffer into a "live" single section
+ * Purpose:	Free a 'simple/small/large' section node
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_sect_free(H5FS_section_info_t *_sect)
+{
+    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;   /* File free section */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    /* Release the section */
+    sect = H5FL_FREE(H5MF_free_section_t, sect);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5MF_sect_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_deserialize
+ *
+ * Purpose:	Deserialize a buffer into a "live" section
  *
  * Return:	Success:	non-negative
  *		Failure:	negative
@@ -173,7 +284,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static H5FS_section_info_t *
-H5MF_sect_simple_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
+H5MF_sect_deserialize(const H5FS_section_class_t *cls,
     hid_t H5_ATTR_UNUSED dxpl_id, const uint8_t H5_ATTR_UNUSED *buf, haddr_t sect_addr,
     hsize_t sect_size, unsigned H5_ATTR_UNUSED *des_flags)
 {
@@ -183,11 +294,12 @@ H5MF_sect_simple_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Check arguments. */
+    HDassert(cls);
     HDassert(H5F_addr_defined(sect_addr));
     HDassert(sect_size);
 
     /* Create free space section for block */
-    if(NULL == (sect = H5MF_sect_simple_new(sect_addr, sect_size)))
+    if(NULL == (sect = H5MF_sect_new(cls->type, sect_addr, sect_size)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't initialize free space section")
 
     /* Set return value */
@@ -195,10 +307,80 @@ H5MF_sect_simple_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5MF_sect_simple_deserialize() */
+} /* H5MF_sect_deserialize() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_valid
+ *
+ * Purpose:	Check the validity of a section
+ *
+ * Return:	Success:	non-negative
+ *          Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January  8, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
+    const H5FS_section_info_t
+#ifdef NDEBUG
+    H5_ATTR_UNUSED
+#endif /* NDEBUG */
+    *_sect, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+#ifndef NDEBUG
+    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
+#endif /* NDEBUG */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments. */
+    HDassert(sect);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}   /* H5MF_sect_valid() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_split
+ *
+ * Purpose:	Split SECT into 2 sections: fragment for alignment & the aligned section
+ *          SECT's addr and size are updated to point to the aligned section
+ *
+ * Return:	Success:	the fragment for aligning sect
+ *          Failure:	null
+ *
+ * Programmer:	Vailin Choi, July 29, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5FS_section_info_t *
+H5MF_sect_split(H5FS_section_info_t *sect, hsize_t frag_size)
+{
+    H5MF_free_section_t *ret_value;     /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Allocate space for new section */
+    if(NULL == (ret_value = H5MF_sect_new(sect->type, sect->addr, frag_size)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't initialize free space section")
+
+    /* Set new section's info */
+    sect->addr += frag_size;
+    sect->size -= frag_size;
+
+done:
+    FUNC_LEAVE_NOAPI((H5FS_section_info_t *)ret_value)
+} /* end H5MF_sect_split() */
+
+/* 
+ * "simple" section callbacks
+ */
+

+/*-------------------------------------------------------------------------
  * Function:	H5MF_sect_simple_can_merge
  *
  * Purpose:	Can two sections of this type merge?
@@ -252,10 +434,10 @@ H5MF_sect_simple_can_merge(const H5FS_section_info_t *_sect1,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_sect_simple_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+H5MF_sect_simple_merge(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
     void H5_ATTR_UNUSED *_udata)
 {
-    H5MF_free_section_t *sect1 = (H5MF_free_section_t *)_sect1;   /* File free section */
+    H5MF_free_section_t **sect1 = (H5MF_free_section_t **)_sect1;   /* File free section */
     H5MF_free_section_t *sect2 = (H5MF_free_section_t *)_sect2;   /* File free section */
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -263,16 +445,16 @@ H5MF_sect_simple_merge(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
 
     /* Check arguments. */
     HDassert(sect1);
-    HDassert(sect1->sect_info.type == H5MF_FSPACE_SECT_SIMPLE);
+    HDassert((*sect1)->sect_info.type == H5MF_FSPACE_SECT_SIMPLE);
     HDassert(sect2);
     HDassert(sect2->sect_info.type == H5MF_FSPACE_SECT_SIMPLE);
-    HDassert(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr));
+    HDassert(H5F_addr_eq((*sect1)->sect_info.addr + (*sect1)->sect_info.size, sect2->sect_info.addr));
 
     /* Add second section's size to first section */
-    sect1->sect_info.size += sect2->sect_info.size;
+    (*sect1)->sect_info.size += sect2->sect_info.size;
 
     /* Get rid of second section */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)sect2) < 0)
+    if(H5MF_sect_free((H5FS_section_info_t *)sect2) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
 
 done:
@@ -293,7 +475,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-htri_t
+static htri_t
 H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
 {
     const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
@@ -392,7 +574,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
+static herr_t
 H5MF_sect_simple_shrink(H5FS_section_info_t **_sect, void *_udata)
 {
     H5MF_free_section_t **sect = (H5MF_free_section_t **)_sect;   /* File free section */
@@ -411,8 +593,8 @@ H5MF_sect_simple_shrink(H5FS_section_info_t **_sect, void *_udata)
         /* Sanity check */
         HDassert(H5F_INTENT(udata->f) & H5F_ACC_RDWR);
 
-        /* Release section's space at EOA with file driver */
-        if(H5FD_free(udata->f->shared->lf, udata->dxpl_id, udata->alloc_type, udata->f, (*sect)->sect_info.addr, (*sect)->sect_info.size) < 0)
+        /* Release section's space at EOA */
+        if(H5F_free(udata->f, udata->dxpl_id, udata->alloc_type, (*sect)->sect_info.addr, (*sect)->sect_info.size) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "driver free request failed")
     } /* end if */
     else {
@@ -427,7 +609,7 @@ H5MF_sect_simple_shrink(H5FS_section_info_t **_sect, void *_udata)
     /* Check for freeing section */
     if(udata->shrink != H5MF_SHRINK_SECT_ABSORB_AGGR) {
         /* Free section */
-        if(H5MF_sect_simple_free((H5FS_section_info_t *)*sect) < 0)
+        if(H5MF_sect_free((H5FS_section_info_t *)*sect) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
 
         /* Mark section as freed, for free space manager */
@@ -438,100 +620,474 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5MF_sect_simple_shrink() */
 
+/* 
+ * "small" section callbacks
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_sect_small_add
+ *
+ * Purpose:     Perform actions on a small "meta" action before adding it to the free space manager:
+ *              1) Drop the section if it is at page end and its size <= page end threshold
+ *              2) Adjust section size to include page end threshold if 
+ *                 (section size + threshold) is at page end
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_small_add(H5FS_section_info_t **_sect, unsigned *flags, void *_udata)
+{
+    H5MF_free_section_t **sect = (H5MF_free_section_t **)_sect;   /* Fractal heap free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    haddr_t sect_end;
+    hsize_t rem, prem;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Entering, section {%a, %Hu}\n", FUNC, (*sect)->sect_info.addr, (*sect)->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+    /* Do not adjust the section raw data or global heap data */
+    if(udata->alloc_type == H5FD_MEM_DRAW || udata->alloc_type == H5FD_MEM_GHEAP)
+        HGOTO_DONE(ret_value);
+
+    sect_end = (*sect)->sect_info.addr + (*sect)->sect_info.size;
+    rem = sect_end % udata->f->shared->fs_page_size;
+    prem = udata->f->shared->fs_page_size - rem;
+
+    /* Drop the section if it is at page end and its size is <= pgend threshold */
+    if(!rem && (*sect)->sect_info.size <= H5F_PGEND_META_THRES(udata->f) && (*flags & H5FS_ADD_RETURNED_SPACE)) {
+        if(H5MF_sect_free((H5FS_section_info_t *)(*sect)) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
+        *sect = NULL;
+        *flags &= (unsigned)~H5FS_ADD_RETURNED_SPACE;
+        *flags |= H5FS_PAGE_END_NO_ADD;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section is dropped\n", FUNC);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+    } /* end if */
+    /* Adjust the section if it is not at page end but its size + pgend threshold is at page end */
+    else
+        if(prem <= H5F_PGEND_META_THRES(udata->f)) {
+            (*sect)->sect_info.size += prem;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section is adjusted {%a, %Hu}\n", FUNC, (*sect)->sect_info.addr, (*sect)->sect_info.size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+        } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_small_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_small_can_shrink
+ *
+ * Purpose:	Can this section shrink the container?
+ *
+ * Note: 	A small section is allowed to shrink only at closing.
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *          Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5MF_sect_small_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
+{
+    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
+    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 = FALSE;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(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)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* Compute address of end of section to check */
+    end = sect->sect_info.addr + sect->sect_info.size;
+
+    /* Check if the section is exactly at the end of the allocated space in the file */
+    if(H5F_addr_eq(end, eoa) && sect->sect_info.size == udata->f->shared->fs_page_size) {
+        udata->shrink = H5MF_SHRINK_EOA;
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section {%a, %Hu}, shrinks file, eoa = %a\n", FUNC, sect->sect_info.addr, sect->sect_info.size, eoa);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+        /* Indicate shrinking can occur */
+        HGOTO_DONE(TRUE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_small_can_shrink() */
+
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_sect_simple_free
+ * Function:	H5MF_sect_small_shrink
  *
- * Purpose:	Free a 'single' section node
+ * Purpose:	Shrink container with section
  *
  * Return:	Success:	non-negative
- *		Failure:	negative
+ *          Failure:	negative 
+ * 
+ * Programmer:	Vailin Choi; Dec 2012
  *
- * Programmer:	Quincey Koziol
- *              Tuesday, January  8, 2008
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_small_shrink(H5FS_section_info_t **_sect, void *_udata)
+{
+    H5MF_free_section_t **sect = (H5MF_free_section_t **)_sect;   /* File free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert((*sect)->sect_info.type == H5MF_FSPACE_SECT_SMALL);
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->shrink == H5MF_SHRINK_EOA);
+    HDassert(H5F_INTENT(udata->f) & H5F_ACC_RDWR);
+
+    /* Release section's space at EOA */
+    if(H5F_free(udata->f, udata->dxpl_id, udata->alloc_type, (*sect)->sect_info.addr, (*sect)->sect_info.size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "driver free request failed")
+
+    /* Free section */
+    if(H5MF_sect_free((H5FS_section_info_t *)*sect) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+
+    /* Mark section as freed, for free space manager */
+    *sect = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_small_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_small_can_merge
+ *
+ * Purpose:	Can two sections of this type merge?
+ *
+ * Note: Second section must be "after" first section
+ *       The "merged" section cannot cross page boundary.
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *          Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Dec 2012
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5MF_sect_simple_free(H5FS_section_info_t *_sect)
+static htri_t
+H5MF_sect_small_can_merge(const H5FS_section_info_t *_sect1,
+    const H5FS_section_info_t *_sect2, void *_udata)
 {
-    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;   /* File free section */
+    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 */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    htri_t ret_value = FALSE;                   	/* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* Check arguments. */
-    HDassert(sect);
+    HDassert(sect1);
+    HDassert(sect2);
+    HDassert(sect1->sect_info.type == sect2->sect_info.type);   /* Checks "MERGE_SYM" flag */
+    HDassert(H5F_addr_lt(sect1->sect_info.addr, sect2->sect_info.addr));
 
-    /* Release the section */
-    sect = H5FL_FREE(H5MF_free_section_t, sect);
+    /* Check if second section adjoins first section */
+    ret_value = H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr);
+    if(ret_value > 0)
+        /* If they are on different pages, couldn't merge */
+        if((sect1->sect_info.addr / udata->f->shared->fs_page_size) != (((sect2->sect_info.addr + sect2->sect_info.size - 1) / udata->f->shared->fs_page_size)))
+	    ret_value = FALSE;
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* H5MF_sect_simple_free() */
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_small_can_merge() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MF_sect_simple_valid
+ * Function:	H5MF_sect_small_merge
  *
- * Purpose:	Check the validity of a section
+ * Purpose:	Merge two sections of this type
+ *
+ * Note: Second section always merges into first node.
+ *       If the size of the "merged" section is equal to file space page size,
+ *       free the section.
  *
  * Return:	Success:	non-negative
  *		Failure:	negative
  *
- * Programmer:	Quincey Koziol
- *              Tuesday, January  8, 2008
+ * Programmer:	Vailin Choi; Dec 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5MF_sect_simple_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
-    const H5FS_section_info_t
-#ifdef NDEBUG
-    H5_ATTR_UNUSED
-#endif /* NDEBUG */
-    *_sect, hid_t H5_ATTR_UNUSED dxpl_id)
+H5MF_sect_small_merge(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
+    void *_udata)
 {
-#ifndef NDEBUG
-    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
-#endif /* NDEBUG */
+    H5MF_free_section_t **sect1 = (H5MF_free_section_t **)_sect1;   /* File free section */
+    H5MF_free_section_t *sect2 = (H5MF_free_section_t *)_sect2;   /* File free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
+    herr_t ret_value = SUCCEED;         		/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert((*sect1)->sect_info.type == H5MF_FSPACE_SECT_SMALL);
+    HDassert(sect2);
+    HDassert(sect2->sect_info.type == H5MF_FSPACE_SECT_SMALL);
+    HDassert(H5F_addr_eq((*sect1)->sect_info.addr + (*sect1)->sect_info.size, sect2->sect_info.addr));
+
+    /* Add second section's size to first section */
+    (*sect1)->sect_info.size += sect2->sect_info.size;
+
+    if((*sect1)->sect_info.size == udata->f->shared->fs_page_size) {
+        if(H5MF_xfree(udata->f, udata->alloc_type, udata->dxpl_id, (*sect1)->sect_info.addr, (*sect1)->sect_info.size) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free merged section")
+
+        /* Need to free possible metadata page in the PB cache */
+        /* This is in response to the data corruption bug from fheap.c with page buffering + page strategy */
+        /* Note: Large metadata page bypasses the PB cache */
+        /* Note: Update of raw data page (large or small sized) is handled by the PB cache */
+        if(udata->f->shared->page_buf != NULL && udata->alloc_type != H5FD_MEM_DRAW)
+            if(H5PB_remove_entry(udata->f, (*sect1)->sect_info.addr) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "can't free merged section")
+
+        if(H5MF_sect_free((H5FS_section_info_t *)(*sect1)) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
+        *sect1 = NULL;
+    } /* end if */
+
+    /* Get rid of second section */
+    if(H5MF_sect_free((H5FS_section_info_t *)sect2) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_small_merge() */
+
+/* 
+ * "Large" section callbacks
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_large_can_merge (same as H5MF_sect_simple_can_merge)
+ *
+ * Purpose:	Can two sections of this type merge?
+ *
+ * Note: Second section must be "after" first section
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *          Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5MF_sect_large_can_merge(const H5FS_section_info_t *_sect1,
+    const H5FS_section_info_t *_sect2, void H5_ATTR_UNUSED *_udata)
+{
+    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 = FALSE;           /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* Check arguments. */
+    HDassert(sect1);
+    HDassert(sect2);
+    HDassert(sect1->sect_info.type == sect2->sect_info.type);   /* Checks "MERGE_SYM" flag */
+    HDassert(H5F_addr_lt(sect1->sect_info.addr, sect2->sect_info.addr));
+
+    ret_value = H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr);
+
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_large_can_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_large_merge (same as H5MF_sect_simple_merge)
+ *
+ * Purpose:	Merge two sections of this type
+ *
+ * Note: Second section always merges into first node
+ *
+ * Return:	Success:	non-negative
+ *          Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sect_large_merge(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
+    void H5_ATTR_UNUSED *_udata)
+{
+    H5MF_free_section_t **sect1 = (H5MF_free_section_t **)_sect1;   /* File free section */
+    H5MF_free_section_t *sect2 = (H5MF_free_section_t *)_sect2;   /* File free section */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
+    HDassert(sect1);
+    HDassert((*sect1)->sect_info.type == H5MF_FSPACE_SECT_LARGE);
+    HDassert(sect2);
+    HDassert(sect2->sect_info.type == H5MF_FSPACE_SECT_LARGE);
+    HDassert(H5F_addr_eq((*sect1)->sect_info.addr + (*sect1)->sect_info.size, sect2->sect_info.addr));
+
+    /* Add second section's size to first section */
+    (*sect1)->sect_info.size += sect2->sect_info.size;
+
+    /* Get rid of second section */
+    if(H5MF_sect_free((H5FS_section_info_t *)sect2) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free section node")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_large_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sect_large_can_shrink
+ *
+ * Purpose:	Can this section shrink the container?
+ *
+ * Return:	Success:	non-negative (TRUE/FALSE)
+ *          Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Dec 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5MF_sect_large_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
+{
+    const H5MF_free_section_t *sect = (const H5MF_free_section_t *)_sect;   /* File free section */
+    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 = FALSE;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check arguments. */
     HDassert(sect);
+    HDassert(sect->sect_info.type == H5MF_FSPACE_SECT_LARGE);
+    HDassert(udata);
+    HDassert(udata->f);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* H5MF_sect_simple_valid() */
+    /* Retrieve the end of the file's address space */
+    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(udata->f->shared->lf, udata->alloc_type)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* Compute address of end of section to check */
+    end = sect->sect_info.addr + sect->sect_info.size;
+
+    /* Check if the section is exactly at the end of the allocated space in the file */
+    if(H5F_addr_eq(end, eoa) && sect->sect_info.size >= udata->f->shared->fs_page_size) {
+        /* Set the shrinking type */
+        udata->shrink = H5MF_SHRINK_EOA;
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: section {%a, %Hu}, shrinks file, eoa = %a\n", FUNC, sect->sect_info.addr, sect->sect_info.size, eoa);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
 
+        /* Indicate shrinking can occur */
+        HGOTO_DONE(TRUE)
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_large_can_shrink() */
 
+

 /*-------------------------------------------------------------------------
- * Function:	H5MF_sect_simple_split
+ * Function:	H5MF_sect_large_shrink
  *
- * Purpose:	Split SECT into 2 sections: fragment for alignment & the aligned section
- *		SECT's addr and size are updated to point to the aligned section
+ * Purpose:     Shrink a large-sized section
  *
- * Return:	Success:	the fragment for aligning sect
- *		Failure:	null
+ * Return:      Success:	non-negative
+ *              Failure:	negative
  *
- * Programmer:	Vailin Choi, July 29, 2008
+ * Programmer:	Vailin Choi; Dec 2012
  *
  *-------------------------------------------------------------------------
  */
-static H5FS_section_info_t *
-H5MF_sect_simple_split(H5FS_section_info_t *sect, hsize_t frag_size)
+static herr_t
+H5MF_sect_large_shrink(H5FS_section_info_t **_sect, void *_udata)
 {
-    H5MF_free_section_t *ret_value = NULL;      /* Return value */
+    H5MF_free_section_t **sect = (H5MF_free_section_t **)_sect; /* File free section */
+    H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;           /* User data for callback */
+    hsize_t frag_size = 0;              /* Fragment size */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    /* Allocate space for new section */
-    if(NULL == (ret_value = H5MF_sect_simple_new(sect->addr, frag_size)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't initialize free space section")
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert((*sect)->sect_info.type == H5MF_FSPACE_SECT_LARGE);
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->shrink == H5MF_SHRINK_EOA);
+    HDassert(H5F_INTENT(udata->f) & H5F_ACC_RDWR);
+    HDassert(H5F_PAGED_AGGR(udata->f));
 
-    /* Set new section's info */
-    sect->addr += frag_size;
-    sect->size -= frag_size;
+    /* Calculate possible mis-aligned fragment */
+    H5MF_EOA_MISALIGN(udata->f, (*sect)->sect_info.addr, udata->f->shared->fs_page_size, frag_size);
+
+    /* Free full pages from EOA */
+    /* Retain partial page in the free-space manager so as to keep EOA at page boundary */
+    if(H5F_free(udata->f, udata->dxpl_id, udata->alloc_type, (*sect)->sect_info.addr+frag_size, (*sect)->sect_info.size-frag_size) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "driver free request failed")
+
+    if(frag_size) /* Adjust section size for the partial page */
+        (*sect)->sect_info.size = frag_size;
+    else {
+        /* Free section */
+        if(H5MF_sect_free((H5FS_section_info_t *)*sect) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
+
+        /* Mark section as freed, for free space manager */
+        *sect = NULL;
+    } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI((H5FS_section_info_t *)ret_value)
-} /* end H5MF_sect_simple_split() */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sect_large_shrink() */
 
diff --git a/src/H5MM.c b/src/H5MM.c
index 5c2a731..ee3b28f 100644
--- a/src/H5MM.c
+++ b/src/H5MM.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -156,7 +154,7 @@ H5MM__is_our_block(void *mem)
  *
  *-------------------------------------------------------------------------
  */
-static void
+H5_ATTR_PURE static void
 H5MM__sanity_check_block(const H5MM_block_t *block)
 {
     HDassert(block->u.info.size > 0);
@@ -182,7 +180,7 @@ H5MM__sanity_check_block(const H5MM_block_t *block)
  *
  *-------------------------------------------------------------------------
  */
-static void
+H5_ATTR_PURE static void
 H5MM__sanity_check(void *mem)
 {
     H5MM_block_t *block = H5MM_BLOCK_FROM_BUF(mem);
@@ -203,7 +201,7 @@ H5MM__sanity_check(void *mem)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE void
 H5MM_sanity_check_all(void)
 {
     H5MM_block_t *curr = NULL;
@@ -228,7 +226,7 @@ H5MM_sanity_check_all(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE void
 H5MM_final_sanity_check(void)
 {
     HDassert(0 == H5MM_curr_alloc_bytes_s);
diff --git a/src/H5MMprivate.h b/src/H5MMprivate.h
index 14bd28d..0524601 100644
--- a/src/H5MMprivate.h
+++ b/src/H5MMprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5MMpublic.h b/src/H5MMpublic.h
index bfcb807..4e54c33 100644
--- a/src/H5MMpublic.h
+++ b/src/H5MMpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5MP.c b/src/H5MP.c
index 50fc598..8c9b411 100644
--- a/src/H5MP.c
+++ b/src/H5MP.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5MPmodule.h b/src/H5MPmodule.h
index ca6c405..27f7706 100644
--- a/src/H5MPmodule.h
+++ b/src/H5MPmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5MPpkg.h b/src/H5MPpkg.h
index e724146..29a25fa 100644
--- a/src/H5MPpkg.h
+++ b/src/H5MPpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5MPprivate.h b/src/H5MPprivate.h
index 3fa312c..009cb50 100644
--- a/src/H5MPprivate.h
+++ b/src/H5MPprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5MPtest.c b/src/H5MPtest.c
index 3f218db..b3f2e24 100644
--- a/src/H5MPtest.c
+++ b/src/H5MPtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5O.c b/src/H5O.c
index 3dda713..152e6cc 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -129,12 +127,13 @@ 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_FSINFO,		/*0x0017 Free-space manager info message */
-    H5O_MSG_UNKNOWN,		/*0x0018 Placeholder for unknown message */
+    H5O_MSG_FSINFO,		/*0x0017 Free-space manager info        */
+    H5O_MSG_MDCI,               /*0x0018 Metadata cache image           */
+    H5O_MSG_UNKNOWN,		/*0x0019 Placeholder for unknown message */
 #ifdef H5O_ENABLE_BOGUS
-    H5O_MSG_BOGUS_INVALID, 	/*0x0019 "Bogus invalid" (for testing) 	*/
+    H5O_MSG_BOGUS_INVALID, 	/*0x001A "Bogus invalid" (for testing) 	*/
 #else /* H5O_ENABLE_BOGUS */
-    NULL,                      /*0x0019 "Bogus invalid" (for testing)  	*/
+    NULL,                       /*0x001A "Bogus invalid" (for testing) 	*/
 #endif /* H5O_ENABLE_BOGUS */
 };
 
@@ -1051,7 +1050,7 @@ done:
  *              the same effect as calling H5Gclose, H5Dclose, or H5Tclose.
  *
  * Return:	Success:	Non-negative
- *		Failure:	Negative
+ *          Failure:	Negative
  *
  * Programmer:	James Laird
  *		July 14 2006
@@ -1109,7 +1108,8 @@ done:
  * Return:	Success:	Non-negative
  *		Failure:	Negative
  *
- * Programmer:	Vailin Choi; January 2014
+ * Programmer:	Vailin Choi
+ *		January 2014
  *
  *-------------------------------------------------------------------------
  */
@@ -1123,11 +1123,11 @@ H5Odisable_mdc_flushes(hid_t object_id)
     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(NULL == (oloc = H5O_get_loc(object_id)))
+        HGOTO_ERROR(H5E_OHDR, 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")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCORK, FAIL, "unable to cork an object")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1144,7 +1144,8 @@ done:
  * Return:	Success:	Non-negative
  *		Failure:	Negative
  *
- * Programmer:	Vailin Choi; January 2014
+ * Programmer:	Vailin Choi
+ *		January 2014
  *
  *-------------------------------------------------------------------------
  */
@@ -1158,12 +1159,12 @@ H5Oenable_mdc_flushes(hid_t object_id)
     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(NULL == (oloc = H5O_get_loc(object_id)))
+        HGOTO_ERROR(H5E_OHDR, 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")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1181,7 +1182,8 @@ done:
  * Return:	Success:	Non-negative
  *		Failure:	Negative
  *
- * Programmer:	Vailin Choi; January 2014
+ * Programmer:	Vailin Choi
+ *		January 2014
  *
  *-------------------------------------------------------------------------
  */
@@ -1197,14 +1199,14 @@ H5Oare_mdc_flushes_disabled(hid_t object_id, hbool_t *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(NULL == (oloc = H5O_get_loc(object_id)))
+        HGOTO_ERROR(H5E_OHDR, 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")
+        HGOTO_ERROR(H5E_OHDR, 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")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1288,16 +1290,17 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
     } /* end if */
 #endif /* H5O_ENABLE_BAD_MESG_COUNT */
 
-    /* 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)
+    if(oh->swmr_write) {
+        /* Create virtual entry, for use as proxy */
+        if(NULL == (oh->proxy = H5AC_proxy_entry_create()))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create object header proxy")
     } /* end if */
     else
-        oh->proxy_addr = HADDR_UNDEF;
+        oh->proxy = NULL;
+
+    /* Set initial status flags */
+    oh->flags = oh_flags;
 
     /* Initialize version-specific fields */
     if(oh->version > H5O_VERSION_1) {
@@ -1362,6 +1365,7 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
     /* (including space for serializing the object header prefix */
     if(NULL == (oh->chunk[0].image = H5FL_BLK_CALLOC(chunk_image, oh_size)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+    oh->chunk[0].chunk_proxy = NULL;
 
     /* Put magic # for object header in first chunk */
     if(oh->version > H5O_VERSION_1)
@@ -1394,6 +1398,8 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
     /* Cache object header */
     if(H5AC_insert_entry(f, dxpl_id, H5AC_OHDR, oh_addr, oh, insert_flags) < 0)
         HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
+
+    /* Reset object header pointer, now that it's been inserted into the cache */
     oh = NULL;
 
     /* Reset metadata tag in dxpl_id */
@@ -1409,7 +1415,7 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
 
 done:
     if(ret_value < 0 && oh)
-        if(H5O_free(oh) < 0)
+        if(H5O__free(oh) < 0)
 	    HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1562,7 +1568,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5O_close(H5O_loc_t *loc)
+H5O_close(H5O_loc_t *loc, hbool_t *file_closed /*out*/)
 {
     herr_t ret_value = SUCCEED;   /* Return value */
 
@@ -1573,6 +1579,15 @@ H5O_close(H5O_loc_t *loc)
     HDassert(loc->file);
     HDassert(H5F_NOPEN_OBJS(loc->file) > 0);
 
+    /* Set the file_closed flag to the default value.
+     * This flag lets downstream code know if the file struct is
+     * still accessible and/or likely to contain useful data.
+     * It's needed by the evict-on-close code. Clients can ignore
+     * this value by passing in NULL.
+     */
+    if(file_closed)
+        *file_closed = FALSE;
+
     /* Decrement open-lock counters */
     H5F_DECR_NOPEN_OBJS(loc->file);
 
@@ -1593,7 +1608,7 @@ H5O_close(H5O_loc_t *loc)
      */
     if(H5F_NOPEN_OBJS(loc->file) == H5F_NMOUNTS(loc->file))
         /* Attempt to close down the file hierarchy */
-        if(H5F_try_close(loc->file) < 0)
+        if(H5F_try_close(loc->file, file_closed) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
 
     /* Release location information */
@@ -1786,7 +1801,8 @@ done:
  *-------------------------------------------------------------------------
  */
 H5O_t *
-H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
+H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags,
+    hbool_t pin_all_chunks)
 {
     H5O_t *oh = NULL;           /* Object header protected */
     H5O_cache_ud_t udata;       /* User data for protecting object header */
@@ -1815,11 +1831,12 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
     /* Construct the user data for protect callback */
     udata.made_attempt = FALSE;
     udata.v1_pfx_nmesgs = 0;
+    udata.chunk0_size = 0;
+    udata.oh = NULL;
     udata.common.f = loc->file;
     udata.common.dxpl_id = dxpl_id;
     udata.common.file_intent = file_intent;
     udata.common.merged_null_msgs = 0;
-    udata.common.mesgs_modified = FALSE;
     HDmemset(&cont_msg_info, 0, sizeof(cont_msg_info));
     udata.common.cont_msg_info = &cont_msg_info;
     udata.common.addr = loc->addr;
@@ -1847,10 +1864,12 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
         chk_udata.common.dxpl_id = dxpl_id;
         chk_udata.common.file_intent = file_intent;
         chk_udata.common.merged_null_msgs = udata.common.merged_null_msgs;
-        chk_udata.common.mesgs_modified = udata.common.mesgs_modified;
         chk_udata.common.cont_msg_info = &cont_msg_info;
 
         /* Read in continuation messages, until there are no more */
+        /* (Note that loading chunks could increase the # of continuation
+         *      messages if new ones are found - QAK, 19/11/2016)
+         */
         curr_msg = 0;
         while(curr_msg < cont_msg_info.nmsgs) {
             H5O_chunk_proxy_t *chk_proxy;       /* Proxy for chunk, to bring it into memory */
@@ -1883,16 +1902,12 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
 
         /* Pass back out some of the chunk's user data */
         udata.common.merged_null_msgs = chk_udata.common.merged_null_msgs;
-        udata.common.mesgs_modified = chk_udata.common.mesgs_modified;
     } /* end if */
 
     /* Check for incorrect # of object header messages, if we've just loaded
      *  this object header from the file
      */
     if(udata.made_attempt) {
-        /* Check for incorrect # of messages in v1 object header */
-        if(oh->version == H5O_VERSION_1 &&
-                (oh->nmesgs + udata.common.merged_null_msgs) != udata.v1_pfx_nmesgs) {
 /* Don't enforce the error on an incorrect # of object header messages bug
  *      unless strict format checking is enabled.  This allows for older
  *      files, created with a version of the library that had a bug in tracking
@@ -1900,91 +1915,56 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
  *      erroring out here. -QAK
  */
 #ifdef H5_STRICT_FORMAT_CHECKS
+        /* Check for incorrect # of messages in v1 object header */
+        if(oh->version == H5O_VERSION_1 &&
+                (oh->nmesgs + udata.common.merged_null_msgs) != udata.v1_pfx_nmesgs)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "corrupt object header - incorrect # of messages")
-#else /* H5_STRICT_FORMAT_CHECKS */
-            /* Mark object header prefix dirty later if we don't have write access */
-            /* (object header will have been marked dirty during protect, if we
-             *  have write access -QAK)
-             */
-            if((prot_flags & H5AC__READ_ONLY_FLAG) != 0)
-                oh->prefix_modified = TRUE;
-#ifndef NDEBUG
-            else {
-                unsigned oh_status = 0;         /* Object header entry cache status */
+#endif /* H5_STRICT_FORMAT_CHECKS */
+    } /* end if */
 
-                /* Check the object header's status in the metadata cache */
-                if(H5AC_get_entry_status(loc->file, loc->addr, &oh_status) < 0)
-                    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to check metadata cache status for object header")
+#ifdef H5O_DEBUG
+H5O_assert(oh);
+#endif /* H5O_DEBUG */
 
-                /* Make certain that object header is not dirty */
-                HDassert(!(oh_status & H5AC_ES__IS_DIRTY));
-            } /* end else */
-#endif /* NDEBUG */
-#endif /* H5_STRICT_FORMAT_CHECKS */
-        } /* end if */
+    /* Pin the other chunks also when requested, so that the object header
+     *  proxy can be set up.
+     */
+    if(pin_all_chunks && oh->nchunks > 1) {
+        unsigned u;         /* Local index variable */
 
-        /* Check for any messages that were modified while being read in */
-        if(udata.common.mesgs_modified && (0 == (prot_flags & H5AC__READ_ONLY_FLAG)))
-            oh->mesgs_modified = TRUE;
+        /* Sanity check */
+        HDassert(oh->swmr_write);
 
-        /* Reset the field that contained chunk 0's size during speculative load */
-        oh->chunk0_size = 0;
-    } /* end if */
+        /* Iterate over chunks > 0 */
+        for(u = 1; u < oh->nchunks; u++) {
+            H5O_chunk_proxy_t *chk_proxy;       /* Chunk proxy */
 
-    /* Take care of loose ends for modifications made while bringing in the
-     *      object header & chunks.
-     */
-    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) {
-            /* Mark the header as dirty now */
-            if(H5AC_mark_entry_dirty(oh) < 0)
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, NULL, "unable to mark object header as dirty")
+            /* Protect chunk */
+            if(NULL == (chk_proxy = H5O_chunk_protect(loc->file, dxpl_id, oh, u)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header chunk")
 
-            /* Reset flag */
-            oh->prefix_modified = FALSE;
-        } /* end if */
+            /* Pin chunk proxy*/
+            if(H5AC_pin_protected_entry(chk_proxy) < 0 )
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, NULL, "unable to pin object header chunk")
 
-        /* Check for deferred dirty messages */
-        if(oh->mesgs_modified) {
-            unsigned u;         /* Local index variable */
-
-            /* Loop through all messages, marking their chunks as dirty */
-            /* (slightly inefficient, since we don't know exactly which messages
-             *  were modified when the object header & chunks were brought in
-             *  from the file, but this only can happen once per load -QAK)
-             */
-            for(u = 0; u < oh->nmesgs; u++) {
-                /* Mark each chunk with a dirty message as dirty also */
-                if(oh->mesg[u].dirty) {
-                    H5O_chunk_proxy_t *chk_proxy;        /* Chunk that message is in */
-
-                    /* Protect chunk */
-                    if(NULL == (chk_proxy = H5O_chunk_protect(loc->file, dxpl_id, oh, oh->mesg[u].chunkno)))
-                        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
-
-                    /* Unprotect chunk, marking it dirty */
-                    if(H5O_chunk_unprotect(loc->file, dxpl_id, chk_proxy, TRUE) < 0)
-                        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header chunk")
-                } /* end if */
-            } /* end for */
+            /* Unprotect chunk */
+            if(H5O_chunk_unprotect(loc->file, dxpl_id, chk_proxy, FALSE) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header chunk")
 
-            /* Reset flag */
-            oh->mesgs_modified = FALSE;
-        } /* end if */
-    } /* end if */
+            /* Preserve chunk proxy pointer for later */
+            oh->chunk[u].chunk_proxy = chk_proxy;
+        } /* end for */
 
-#ifdef H5O_DEBUG
-H5O_assert(oh);
-#endif /* H5O_DEBUG */
+        /* Set the flag for the unprotect */
+        oh->chunks_pinned = TRUE;
+    } /* end if */
 
     /* Set return value */
     ret_value = oh;
 
 done:
     if(ret_value == NULL && oh)
-        if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) < 0)
+        if(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_TAG(ret_value, NULL)
@@ -2020,7 +2000,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__NO_FLAGS_SET)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
 
     /* Increment the reference count on the object header */
@@ -2102,6 +2082,27 @@ H5O_unprotect(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, unsigned oh_flags)
     HDassert(loc);
     HDassert(oh);
 
+    /* Unpin the other chunks */
+    if(oh->chunks_pinned && oh->nchunks > 1) {
+        unsigned u;         /* Local index variable */
+
+        /* Sanity check */
+        HDassert(oh->swmr_write);
+
+        /* Iterate over chunks > 0 */
+        for(u = 1; u < oh->nchunks; u++) {
+            if(NULL != oh->chunk[u].chunk_proxy) {
+                /* Release chunk proxy */
+                if(H5AC_unpin_entry(oh->chunk[u].chunk_proxy) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header chunk")
+                oh->chunk[u].chunk_proxy = NULL;
+            } /* end if */
+        } /* end for */
+
+        /* Reet the flag from the unprotect */
+        oh->chunks_pinned = FALSE;
+    } /* end if */
+
     /* Unprotect the object header */
     if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, oh->chunk[0].addr, oh, oh_flags) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
@@ -2233,7 +2234,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__NO_FLAGS_SET)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Create/Update the modification time message */
@@ -2359,7 +2360,7 @@ 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__NO_FLAGS_SET)))
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC__NO_FLAGS_SET, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Delete object */
@@ -2368,12 +2369,11 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
 
     /* 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) {
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
+    if(corked)
 	if(H5AC_cork(f, addr, H5AC__UNCORK, NULL) < 0)
-	    HGOTO_ERROR(H5E_OHDR, H5E_SYSTEM, FAIL, "unable to uncork an object")
-    }
-    
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
+
     /* Mark object header as deleted */
     oh_flags = H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
@@ -2451,7 +2451,7 @@ H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id)
     FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve the type of the object */
@@ -2529,7 +2529,7 @@ H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id)
     FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, NULL)
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Test whether entry qualifies as a particular type of object */
@@ -2787,7 +2787,7 @@ H5O_loc_free(H5O_loc_t *loc)
         H5F_DECR_NOPEN_OBJS(loc->file);
         loc->holding_file = FALSE;
         if(H5F_NOPEN_OBJS(loc->file) <= 0) {
-            if(H5F_try_close(loc->file) < 0)
+            if(H5F_try_close(loc->file, NULL) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
         } /* end if */
     } /* end if */
@@ -2826,7 +2826,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
 
     /* Get the information for the object header */
@@ -2950,7 +2950,7 @@ H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info,
     HDassert(oinfo);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Reset the object info structure */
@@ -3071,7 +3071,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Set property values, if they were used for the object */
@@ -3126,7 +3126,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve the # of link messages seen when the object header was loaded */
@@ -3243,7 +3243,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Set the object's reference count */
@@ -3616,7 +3616,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Decrement the reference count on the object header */
@@ -3634,7 +3634,31 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_free
+ * Function:	H5O_get_proxy
+ *
+ * Purpose:	Retrieve the proxy for the object header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		July 24 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+H5AC_proxy_entry_t *
+H5O_get_proxy(const H5O_t *oh)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(oh);
+
+    FUNC_LEAVE_NOAPI(oh->proxy)
+} /* end H5O_get_proxy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__free
  *
  * Purpose:	Destroys an object header.
  *
@@ -3647,14 +3671,16 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5O_free(H5O_t *oh)
+H5O__free(H5O_t *oh)
 {
     unsigned	u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE
 
     /* check args */
     HDassert(oh);
+    HDassert(0 == oh->rc);
 
     /* Destroy chunks */
     if(oh->chunk) {
@@ -3685,126 +3711,15 @@ H5O_free(H5O_t *oh)
         oh->mesg = (H5O_mesg_t *)H5FL_SEQ_FREE(H5O_mesg_t, oh->mesg);
     } /* end if */
 
+    /* Destroy the proxy */
+    if(oh->proxy)
+        if(H5AC_proxy_entry_dest(oh->proxy) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy virtual entry used for proxy")
+
     /* destroy object header */
     oh = H5FL_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() */
+} /* end H5O__free() */
 
diff --git a/src/H5Oainfo.c b/src/H5Oainfo.c
index 44c6611..d8298a4 100644
--- a/src/H5Oainfo.c
+++ b/src/H5Oainfo.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Oalloc.c b/src/H5Oalloc.c
index 7263ca6..3512d3e 100644
--- a/src/H5Oalloc.c
+++ b/src/H5Oalloc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -67,8 +65,11 @@ static herr_t H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t null_idx
     const H5O_msg_class_t *new_type, void *new_native, size_t new_size);
 static htri_t H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     unsigned chunkno, size_t size, size_t *msg_idx);
+static herr_t H5O__alloc_find_best_nonnull(const H5F_t *f, const H5O_t *oh, size_t *size,
+    H5O_msg_alloc_info_t *found_msg);
 static herr_t H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size,
     size_t *new_idx);
+static herr_t H5O__alloc_find_best_null(const H5O_t *oh, size_t size, size_t *mesg_idx);
 static htri_t H5O_move_cont(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned cont_u);
 static htri_t H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
 static htri_t H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
@@ -644,9 +645,9 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno,
     old_size = oh->chunk[chunkno].size;
     oh->chunk[chunkno].size += delta + extra_prfx_size;
     oh->chunk[chunkno].image = H5FL_BLK_REALLOC(chunk_image, old_image, oh->chunk[chunkno].size);
-    oh->chunk[chunkno].gap = 0;
     if(NULL == oh->chunk[chunkno].image)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't reallocate extended object header chunk")
+    oh->chunk[chunkno].gap = 0;
 
     /* Wipe new space for chunk */
     HDmemset(oh->chunk[chunkno].image + old_size, 0, oh->chunk[chunkno].size - old_size);
@@ -664,8 +665,8 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno,
             oh->mesg[u].raw = oh->chunk[chunkno].image + extra_prfx_size + (oh->mesg[u].raw - old_image);
 
         /* Find continuation message which points to this chunk and adjust chunk's size */
-        /* (Chunk 0 doesn't have a continuation message that points to it and
-         * it's size is directly encoded in the object header) */
+        /* (Chunk 0 doesn't have a continuation message that points to it,
+         * its size is directly encoded in the object header) */
         if(chunkno > 0 && (H5O_CONT_ID == oh->mesg[u].type->id) &&
                 (((H5O_cont_t *)(oh->mesg[u].native))->chunkno == chunkno)) {
             H5O_chunk_proxy_t *chk_proxy2 = NULL;       /* Chunk that continuation message is in */
@@ -707,17 +708,10 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_alloc_new_chunk
- *
- * Purpose:     Allocates a new chunk for the object header, including
- *		file space.
+ * Function:    H5O__alloc_find_best_nonnull
  *
- *              One of the other chunks will get an object continuation
- *		message.  If there isn't room in any other chunk for the
- *		object continuation message, then some message from
- *		another chunk is moved into this chunk to make room.
- *
- *              SIZE need not be aligned.
+ * Purpose:     Find the best fit non-null message for a given size of message
+ *              to allocate.
  *
  * Note:	The algorithm for finding a message to replace with a
  *		continuation message is still fairly limited.  It's possible
@@ -735,50 +729,33 @@ done:
  *
  *              Failure:        Negative
  *
- * Programmer:  Robb Matzke
- *              matzke at llnl.gov
- *              Aug  7 1997
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              Oct 21 2016
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new_idx)
+H5O__alloc_find_best_nonnull(const H5F_t *f, const H5O_t *oh, size_t *size,
+    H5O_msg_alloc_info_t *found_msg)
 {
-    /* Struct for storing information about "best" messages to allocate from */
-    typedef struct {
-        int msgno;                      /* Index in message array */
-        size_t gap_size;                /* Size of any "gap" in the chunk immediately after message */
-        size_t null_size;               /* Size of any null message in the chunk immediately after message */
-        size_t total_size;              /* Total size of "available" space around message */
-        unsigned null_msgno;            /* Message index of null message immediately after message */
-    } alloc_info;
-
     H5O_mesg_t *curr_msg;               /* Pointer to current message to operate on */
-    H5O_chunk_proxy_t *chk_proxy;       /* Chunk that message is in */
-    size_t      cont_size;              /*continuation message size     */
-    size_t      multi_size = 0;         /* Size of all the messages in the last chunk */
-    int         found_null = (-1);      /* Best fit null message         */
-    alloc_info  found_attr = {-1, 0, 0, 0, 0};      /* Best fit attribute message    */
-    alloc_info  found_other = {-1, 0, 0, 0, 0};     /* Best fit other message        */
-    size_t      idx;                    /* Message number */
-    uint8_t     *p = NULL;              /*ptr into new chunk            */
-    H5O_cont_t  *cont = NULL;           /*native continuation message   */
-    size_t      chunkno;                /* Chunk allocated */
-    haddr_t	new_chunk_addr;
+    size_t      cont_size;              /* Continuation message size */
+    size_t      multi_size;             /* Size of all the messages in the last chunk */
     unsigned    u;                      /* Local index variable */
-    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check args */
+    /* Check args */
+    HDassert(f);
     HDassert(oh);
-    HDassert(size > 0);
-    size = H5O_ALIGN_OH(oh, size);
+    HDassert(size);
+    HDassert(*size > 0);
+    HDassert(found_msg);
 
     /*
-     * Find the smallest null message that will hold an object
-     * continuation message.  Failing that, find the smallest message
-     * that could be moved to make room for the continuation message.
+     * Find the smallest message that could be moved to make room for the
+     * continuation message.
      *
      * Don't ever move continuation message from one chunk to another.
      *
@@ -787,23 +764,10 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
      *
      */
     cont_size = H5O_ALIGN_OH(oh, (size_t)(H5F_SIZEOF_ADDR(f) + H5F_SIZEOF_SIZE(f)));
+    multi_size = 0;
     for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++) {
-        if(curr_msg->type->id == H5O_NULL_ID) {
-            if(cont_size == curr_msg->raw_size) {
-                found_null = (int)u;
-                break;
-            }  /* end if */
-            else if(curr_msg->raw_size > cont_size &&
-                    (found_null < 0 || curr_msg->raw_size < oh->mesg[found_null].raw_size))
-                found_null = (int)u;
-        } /* end if */
-        else if(curr_msg->type->id == H5O_CONT_ID) {
-            /* Don't consider continuation messages (for now) */
-        } /* end if */
-        else if(curr_msg->locked) {
-            /* Don't consider locked messages */
-        } /* end if */
-        else {
+        /* Don't consider continuation messages (for now) */
+        if(H5O_CONT_ID != curr_msg->type->id) {
             unsigned msg_chunkno = curr_msg->chunkno;         /* Chunk that the message is in */
             uint8_t *end_chunk_data = (oh->chunk[msg_chunkno].image + oh->chunk[msg_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[msg_chunkno].gap);     /* End of message data in chunk */
             uint8_t *end_msg = curr_msg->raw + curr_msg->raw_size;  /* End of current message */
@@ -837,34 +801,51 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
 
             /* Check if message is large enough to hold continuation info */
             if(total_size >= cont_size) {
-                if(curr_msg->type->id == H5O_ATTR_ID) {
-                    if(found_attr.msgno < 0 || total_size < found_attr.total_size) {
-                        found_attr.msgno = (int)u;
-                        found_attr.gap_size = gap_size;
-                        found_attr.null_size = null_size;
-                        found_attr.total_size = total_size;
-                        found_attr.null_msgno = null_msgno;
-                    } /* end if */
-                } /* end if */
+                hbool_t better = FALSE;         /* Whether the current message is better than a previous one */
+
+                /* Check for first message that can be moved */
+                if(found_msg->msgno < 0)
+                    better = TRUE;
                 else {
-                    if(found_other.msgno < 0 || total_size < found_other.total_size) {
-                        found_other.msgno = (int)u;
-                        found_other.gap_size = gap_size;
-                        found_other.null_size = null_size;
-                        found_other.total_size = total_size;
-                        found_other.null_msgno = null_msgno;
-                    } /* end if */
+                    /* Prioritize moving non-attributes above attributes */
+                    /* (Even attributes with an otherwise better fit */
+                    if(found_msg->id == H5O_ATTR_ID && curr_msg->type->id != H5O_ATTR_ID)
+                        better = TRUE;
+                    /* Either two attributes, or two non-attributes */
+                    else {
+                        /* Take a smaller one */
+                        if(total_size < found_msg->total_size)
+                            better = TRUE;
+                        /* If they are the same size, choose the earliest one
+                         * in the chunk array */
+                        /* (Could also bias toward message earlier / later
+                         *      chunk in, but shouldn't be a big deal - QAK, 2016/10/21)
+                         */
+                        else if(total_size == found_msg->total_size) {
+                            if(msg_chunkno < found_msg->chunkno)
+                                better = TRUE;
+                        } /* end else-if */
+                    } /* end else */
                 } /* end else */
+
+                /* If we found a better message, keep its info */
+                if(better) {
+                    found_msg->msgno = (int)u;
+                    found_msg->id = curr_msg->type->id;
+                    found_msg->chunkno = msg_chunkno;
+                    found_msg->gap_size = gap_size;
+                    found_msg->null_size = null_size;
+                    found_msg->total_size = total_size;
+                    found_msg->null_msgno = null_msgno;
+                } /* end if */
             } /* end if */
-            else if(found_null < 0 && found_attr.msgno < 0 && found_other.msgno < 0 && msg_chunkno == oh->nchunks - 1)
+            else if(found_msg->msgno < 0 && msg_chunkno == oh->nchunks - 1)
                 /* Keep track of the total size of smaller messages in the last
                  * chunk, in case we need to move more than 1 message.
                  */
                 multi_size += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
-        } /* end else */
+        } /* end if */
     } /* end for */
-    if(found_null >= 0 || found_attr.msgno >= 0 || found_other.msgno >= 0)
-        multi_size = 0;
 
     /*
      * If we must move some other message to make room for the null
@@ -876,22 +857,60 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
      * If all else fails, move every message in the last chunk.
      *
      */
-    if(multi_size == 0) {
-        if(found_null < 0) {
-            if(found_other.msgno < 0)
-                found_other = found_attr;
-
-            HDassert(found_other.msgno >= 0);
-            size += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
-        } /* end if */
-    } /* end if */
+    if(found_msg->msgno < 0)
+        *size += multi_size;
     else
-        size += multi_size;
+        *size += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_msg->msgno].raw_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O__alloc_find_best_nonnull() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__alloc_chunk
+ *
+ * Purpose:     Allocates and initializes a new chunk for the object header,
+ *		including file space.
+ *
+ * Return:      Success:        SUCCEED, with chunk number for the
+ *                              new chunk and a pointer to the location in its
+ *				image where the first message should be placed.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              Oct 21 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O__alloc_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size,
+    size_t found_null, const H5O_msg_alloc_info_t *found_msg, size_t *new_idx)
+{
+    H5O_mesg_t *curr_msg;               /* Pointer to current message to operate on */
+    H5O_chunk_proxy_t *chk_proxy;       /* Chunk that message is in */
+    size_t      cont_size;              /*continuation message size     */
+    size_t      idx;                    /* Message number */
+    uint8_t     *p = NULL;              /* Pointer into new chunk image */
+    H5O_cont_t  *cont = NULL;           /*native continuation message   */
+    unsigned    chunkno;                /* Chunk allocated */
+    haddr_t	new_chunk_addr;         /* Address of new chunk in file */
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+    HDassert(found_msg);
+    HDassert(new_idx);
 
     /*
      * The total chunk size must include the requested space plus enough
      * for the message header.  This must be at least some minimum and
-     * aligned propertly.
+     * aligned properly.
      */
     size = MAX(H5O_MIN_SIZE, size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
     HDassert(size == H5O_ALIGN_OH(oh, size));
@@ -903,30 +922,30 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
      */
     size +=  H5O_SIZEOF_CHKHDR_OH(oh);
 
-    /* allocate space in file to hold the new chunk */
+    /* Allocate space in file to hold the new chunk */
     new_chunk_addr = H5MF_alloc(f, H5FD_MEM_OHDR, dxpl_id, (hsize_t)size);
-    if(HADDR_UNDEF == new_chunk_addr)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate space for new chunk")
+    if(!H5F_addr_defined(new_chunk_addr))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "unable to allocate space for new chunk")
 
-    /*
-     * Create the new chunk giving it a file address.
-     */
+    /* Create the new chunk giving it a file address. */
     if(oh->nchunks >= oh->alloc_nchunks) {
         size_t na = MAX(H5O_NCHUNKS, oh->alloc_nchunks * 2);        /* Double # of chunks allocated */
         H5O_chunk_t *x;
 
         if(NULL == (x = H5FL_SEQ_REALLOC(H5O_chunk_t, oh->chunk, na)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate larger chunk array, na = %zu", na)
         oh->alloc_nchunks = na;
         oh->chunk = x;
     } /* end if */
 
-    chunkno = (unsigned)oh->nchunks++;
+    H5_CHECKED_ASSIGN(chunkno, unsigned, oh->nchunks, size_t);
+    oh->nchunks++;
     oh->chunk[chunkno].addr = new_chunk_addr;
     oh->chunk[chunkno].size = size;
     oh->chunk[chunkno].gap = 0;
     if(NULL == (oh->chunk[chunkno].image = p = H5FL_BLK_CALLOC(chunk_image, size)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate image for chunk, size = %zu", size)
+    oh->chunk[chunkno].chunk_proxy = NULL;
 
     /* If this is a later version of the object header format, put the magic
      *  # at the beginning of the chunk image.
@@ -945,133 +964,136 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
 
     /* Check if we need to move multiple messages, in order to make room for the new message */
-    if(multi_size > 0) {
-        /* Move all non-null messages in the last chunk to the new chunk.  This
-         * should be extremely rare so we don't care too much about minimizing
-         * the space used.
-         */
-        H5O_mesg_t *null_msg;       /* Pointer to new null message */
-
-        /* Protect last chunk */
-        if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, chunkno - 1)))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
-
-        /* Copy each message to the new location */
-        for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++)
-            if(curr_msg->chunkno == chunkno - 1) {
-                if(curr_msg->type->id == H5O_NULL_ID) {
-                    /* Delete the null message */
-                    if(u < oh->nmesgs - 1)
-                        HDmemmove(curr_msg, curr_msg + 1, ((oh->nmesgs - 1) - u) * sizeof(H5O_mesg_t));
-                    oh->nmesgs--;
+    cont_size = H5O_ALIGN_OH(oh, (size_t)(H5F_SIZEOF_ADDR(f) + H5F_SIZEOF_SIZE(f)));
+    if(found_null >= oh->nmesgs) {
+        if(found_msg->msgno < 0) {
+            /* Move all non-null messages in the last chunk to the new chunk.  This
+             * should be extremely rare so we don't care too much about minimizing
+             * the space used.
+             */
+            H5O_mesg_t *null_msg;       /* Pointer to new null message */
+
+            /* Protect last chunk */
+            if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, chunkno - 1)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+            /* Copy each message to the new location */
+            for(u = 0, curr_msg = &oh->mesg[0]; u < oh->nmesgs; u++, curr_msg++)
+                if(curr_msg->chunkno == chunkno - 1) {
+                    if(curr_msg->type->id == H5O_NULL_ID) {
+                        /* Delete the null message */
+                        if(u < oh->nmesgs - 1)
+                            HDmemmove(curr_msg, curr_msg + 1, ((oh->nmesgs - 1) - u) * sizeof(H5O_mesg_t));
+                        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));
+
+                        /* Update the message info */
+                        curr_msg->chunkno = chunkno;
+                        curr_msg->raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+
+                        /* Account for copied message in new chunk */
+                        p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
+                        size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
+                    } /* end else */
                 } /* 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));
+            /* Create a null message spanning the entire last chunk */
+            found_null = oh->nmesgs++;
+            null_msg = &(oh->mesg[found_null]);
+            null_msg->type = H5O_MSG_NULL;
+            null_msg->dirty = TRUE;
+            null_msg->native = NULL;
+            null_msg->raw = oh->chunk[chunkno - 1].image
+                    + ((chunkno == 1) ? H5O_SIZEOF_HDR(oh) : H5O_SIZEOF_CHKHDR_OH(oh))
+                    - H5O_SIZEOF_CHKSUM_OH(oh) + H5O_SIZEOF_MSGHDR_OH(oh);
+            null_msg->raw_size = oh->chunk[chunkno - 1].size
+                    - ((chunkno == 1) ? (size_t)H5O_SIZEOF_HDR(oh) : (size_t)H5O_SIZEOF_CHKHDR_OH(oh))
+                    - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+            null_msg->chunkno = chunkno - 1;
 
-                    /* Update the message info */
-                    curr_msg->chunkno = chunkno;
-                    curr_msg->raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+            HDassert(null_msg->raw_size >= cont_size);
 
-                    /* Account for copied message in new chunk */
-                    p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
-                    size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + curr_msg->raw_size;
-                } /* end else */
-            } /* end if */
+            /* Remove any gap in the chunk */
+            oh->chunk[chunkno - 1].gap = 0;
 
-        /* Create a null message spanning the entire last chunk */
-        found_null = (int)oh->nmesgs++;
-        null_msg = &(oh->mesg[found_null]);
-        null_msg->type = H5O_MSG_NULL;
-        null_msg->dirty = TRUE;
-        null_msg->native = NULL;
-        null_msg->raw = oh->chunk[chunkno - 1].image
-                + ((chunkno == 1) ? H5O_SIZEOF_HDR(oh) : H5O_SIZEOF_CHKHDR_OH(oh))
-                - H5O_SIZEOF_CHKSUM_OH(oh) + H5O_SIZEOF_MSGHDR_OH(oh);
-        null_msg->raw_size = oh->chunk[chunkno - 1].size
-                - ((chunkno == 1) ? (size_t)H5O_SIZEOF_HDR(oh) : (size_t)H5O_SIZEOF_CHKHDR_OH(oh))
-                - (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
-        null_msg->chunkno = chunkno - 1;
-
-        HDassert(null_msg->raw_size >= cont_size);
-
-        /* Remove any gap in the chunk */
-        oh->chunk[chunkno - 1].gap = 0;
-
-        /* Release chunk, marking it dirty */
-        if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
-    } else if(found_null < 0) {
-        /* Move message (that will be replaced with continuation message)
-         *  to new chunk, if necessary.
-         */
-        H5O_mesg_t *null_msg;       /* Pointer to new null message */
-
-        /* Protect chunk */
-        if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, oh->mesg[found_other.msgno].chunkno)))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
-
-        /* Create null message for space that message to copy currently occupies */
-        found_null = (int)oh->nmesgs++;
-        null_msg = &(oh->mesg[found_null]);
-        null_msg->type = H5O_MSG_NULL;
-        null_msg->native = NULL;
-        null_msg->raw = oh->mesg[found_other.msgno].raw;
-        null_msg->raw_size = oh->mesg[found_other.msgno].raw_size;
-        null_msg->chunkno = oh->mesg[found_other.msgno].chunkno;
-
-        /* Copy the message to move (& its prefix) to its new location */
-        HDmemcpy(p, oh->mesg[found_other.msgno].raw - H5O_SIZEOF_MSGHDR_OH(oh),
-                 oh->mesg[found_other.msgno].raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
-
-        /* Switch moved message to point to new location */
-        oh->mesg[found_other.msgno].raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
-        oh->mesg[found_other.msgno].chunkno = chunkno;
-
-        /* Account for copied message in new chunk */
-        p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
-        size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_other.msgno].raw_size;
-
-        /* Add any available space after the message to move to the new null message */
-        if(found_other.gap_size > 0) {
-            /* Absorb a gap after the moved message */
-            HDassert(oh->chunk[null_msg->chunkno].gap == found_other.gap_size);
-            null_msg->raw_size += found_other.gap_size;
-            oh->chunk[null_msg->chunkno].gap = 0;
+            /* Release chunk, marking it dirty */
+            if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
         } /* end if */
-        else if(found_other.null_size > 0) {
-            H5O_mesg_t *old_null_msg = &oh->mesg[found_other.null_msgno]; /* Pointer to NULL message to eliminate */
+        else {
+            /* Move message (that will be replaced with continuation message)
+             *  to new chunk, if necessary.
+             */
+            H5O_mesg_t *null_msg;       /* Pointer to new null message */
 
-            /* Absorb a null message after the moved message */
-            HDassert((null_msg->raw + null_msg->raw_size) == (old_null_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)));
-            null_msg->raw_size += found_other.null_size;
+            /* Protect chunk */
+            if(NULL == (chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, oh->mesg[found_msg->msgno].chunkno)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
 
-            /* Release any information/memory for message */
-            H5O_msg_free_mesg(old_null_msg);
+            /* Create null message for space that message to copy currently occupies */
+            found_null = oh->nmesgs++;
+            null_msg = &(oh->mesg[found_null]);
+            null_msg->type = H5O_MSG_NULL;
+            null_msg->native = NULL;
+            null_msg->raw = oh->mesg[found_msg->msgno].raw;
+            null_msg->raw_size = oh->mesg[found_msg->msgno].raw_size;
+            null_msg->chunkno = oh->mesg[found_msg->msgno].chunkno;
+
+            /* Copy the message to move (& its prefix) to its new location */
+            HDmemcpy(p, oh->mesg[found_msg->msgno].raw - H5O_SIZEOF_MSGHDR_OH(oh),
+                     oh->mesg[found_msg->msgno].raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
+
+            /* Switch moved message to point to new location */
+            oh->mesg[found_msg->msgno].raw = p + H5O_SIZEOF_MSGHDR_OH(oh);
+            oh->mesg[found_msg->msgno].chunkno = chunkno;
+
+            /* Account for copied message in new chunk */
+            p += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_msg->msgno].raw_size;
+            size -= (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + oh->mesg[found_msg->msgno].raw_size;
+
+            /* Add any available space after the message to move to the new null message */
+            if(found_msg->gap_size > 0) {
+                /* Absorb a gap after the moved message */
+                HDassert(oh->chunk[null_msg->chunkno].gap == found_msg->gap_size);
+                null_msg->raw_size += found_msg->gap_size;
+                oh->chunk[null_msg->chunkno].gap = 0;
+            } /* end if */
+            else if(found_msg->null_size > 0) {
+                H5O_mesg_t *old_null_msg = &oh->mesg[found_msg->null_msgno]; /* Pointer to NULL message to eliminate */
 
-            /* Remove null message from list of messages */
-            if(found_other.null_msgno < (oh->nmesgs - 1))
-                HDmemmove(old_null_msg, old_null_msg + 1, ((oh->nmesgs - 1) - found_other.null_msgno) * sizeof(H5O_mesg_t));
+                /* Absorb a null message after the moved message */
+                HDassert((null_msg->raw + null_msg->raw_size) == (old_null_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)));
+                null_msg->raw_size += found_msg->null_size;
 
-            /* Decrement # of messages */
-            /* (Don't bother reducing size of message array for now -QAK) */
-            oh->nmesgs--;
+                /* Release any information/memory for message */
+                H5O_msg_free_mesg(old_null_msg);
 
-            /* Adjust message index for new NULL message */
-            found_null--;
-        } /* end if */
+                /* Remove null message from list of messages */
+                if(found_msg->null_msgno < (oh->nmesgs - 1))
+                    HDmemmove(old_null_msg, old_null_msg + 1, ((oh->nmesgs - 1) - found_msg->null_msgno) * sizeof(H5O_mesg_t));
+
+                /* Decrement # of messages */
+                /* (Don't bother reducing size of message array for now -QAK) */
+                oh->nmesgs--;
+
+                /* Adjust message index for new NULL message */
+                found_null--;
+            } /* end if */
 
-        /* Mark the new null message as dirty */
-        null_msg->dirty = TRUE;
+            /* Mark the new null message as dirty */
+            null_msg->dirty = TRUE;
 
-        /* Release chunk, marking it dirty */
-        if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+            /* Release chunk, marking it dirty */
+            if(H5O_chunk_unprotect(f, dxpl_id, chk_proxy, TRUE) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+        } /* end if */
     } /* end if */
-    HDassert(found_null >= 0);
 
     /* Create null message for [rest of] space in new chunk */
     /* (account for chunk's magic # & checksum) */
@@ -1095,7 +1117,7 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
     cont->chunkno = chunkno;
 
     /* Split the null message and point at continuation message */
-    if(H5O_alloc_null(f, dxpl_id, oh, (size_t)found_null, H5O_MSG_CONT, cont, cont_size) < 0)
+    if(H5O_alloc_null(f, dxpl_id, oh, found_null, H5O_MSG_CONT, cont, cont_size) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't split null message")
 
     /* Set new message index value */
@@ -1103,16 +1125,163 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O__alloc_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_alloc_new_chunk
+ *
+ * Purpose:     Allocates a new chunk for the object header, including
+ *		file space.
+ *
+ *              One of the other chunks will get an object continuation
+ *		message.  If there isn't room in any other chunk for the
+ *		object continuation message, then some message from
+ *		another chunk is moved into this chunk to make room.
+ *
+ *              SIZE need not be aligned.
+ *
+ * Note:	The algorithm for finding a message to replace with a
+ *		continuation message is still fairly limited.  It's possible
+ *		that two (or more) messages smaller than a continuation message
+ *		might occupy a chunk and need to be moved in order to make
+ *		room for the continuation message.
+ *
+ *		Also, we aren't checking for NULL messages in front of another
+ *		message right now...
+ *
+ * Return:      Success:        Index number of the null message for the
+ *                              new chunk.  The null message will be at
+ *                              least SIZE bytes not counting the message
+ *                              ID or size fields.
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Aug  7 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new_idx)
+{
+    size_t      cont_size;              /*continuation message size     */
+    size_t      idx;                    /* Message number */
+    H5O_msg_alloc_info_t  found_msg;    /* Best fit non-null message */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(oh);
+    HDassert(size > 0);
+    size = H5O_ALIGN_OH(oh, size);
+
+    /* Find the smallest null message that could hold a continuation message */
+    idx = oh->nmesgs;
+    cont_size = H5O_ALIGN_OH(oh, (size_t)(H5F_SIZEOF_ADDR(f) + H5F_SIZEOF_SIZE(f)));
+    if(H5O__alloc_find_best_null(oh, cont_size, &idx) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "error while locating best null header message")
+
+    /* If we couldn't find a null message, locate the best message to move to new chunk */
+    if(idx >= oh->nmesgs) {
+        found_msg.msgno = -1;
+        if(H5O__alloc_find_best_nonnull(f, oh, &size, &found_msg) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "error while locating best non-null header message")
+    } /* end if */
+
+    /* Allocate and initialize new chunk in the file */
+    if(H5O__alloc_chunk(f, dxpl_id, oh, size, idx, &found_msg, new_idx) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate new object header chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5O_alloc_new_chunk() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5O__alloc_find_best_null
+ *
+ * Purpose:     Find the best fit null message for a given size of message
+ *              to allocate.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at lbl.gov
+ *              Oct 21 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__alloc_find_best_null(const H5O_t *oh, size_t size, size_t *mesg_idx)
+{
+    size_t idx;                 /* Index of message which fits allocation */
+    ssize_t found_null;         /* Best fit null message         */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check args */
+    HDassert(oh);
+    HDassert(size > 0);
+    HDassert(mesg_idx);
+
+    /* Find the smallest null message that could hold the new object header message */
+    found_null = -1;
+    for(idx = 0; idx < oh->nmesgs; idx++) {
+        if(H5O_NULL_ID == oh->mesg[idx].type->id) {
+            /* If we found an exact fit, use it */
+            if(oh->mesg[idx].raw_size == size) {
+                /* Keep first exact fit */
+                if(found_null < 0)
+                    found_null = (ssize_t)idx;
+                else
+                    /* If we've got more than one exact fit, choose the one in the earliest chunk */
+                    if(oh->mesg[idx].chunkno < oh->mesg[found_null].chunkno) {
+                        found_null = (ssize_t)idx;
+
+                        /* If we found an exact fit in object header chunk #0, we can get out */
+                        /* (Could extend this to look for earliest message in
+                         *      chunk #0 - QAK, 2016/10/21)
+                         */
+                        if(0 == oh->mesg[idx].chunkno)
+                            break;
+                    } /* end if */
+            } /* end if */
+            /* Look for null message that's larger than needed */
+            else if(oh->mesg[idx].raw_size > size) {
+                /* Keep first one found */
+                if(found_null < 0)
+                    found_null = (ssize_t)idx;
+                else
+                    /* Check for better fit */
+                    if(oh->mesg[idx].raw_size < oh->mesg[found_null].raw_size)
+                        found_null = (ssize_t)idx;
+                    else {
+                        /* If they are the same size, choose the one in the earliest chunk */
+                        if(oh->mesg[idx].raw_size ==  oh->mesg[found_null].raw_size) {
+                            if(oh->mesg[idx].chunkno < oh->mesg[found_null].chunkno)
+                                found_null = (ssize_t)idx;
+                        } /* end if */
+                    } /* end else */
+            } /* end else-if */
+            /* else: Ignore too-small null messages */
+        } /* end if */
+    } /* end for */
+    if(found_null >= 0)
+        *mesg_idx = (size_t)found_null;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O__alloc_find_best_null() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5O_alloc
  *
  * Purpose:     Allocate enough space in the object header for this message.
  *
- * Return:      Success:        Index of message
- *              Failure:        Negative
+ * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:  Robb Matzke
  *              matzke at llnl.gov
@@ -1145,10 +1314,10 @@ H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "object header message is too large")
     aligned_size = H5O_ALIGN_OH(oh, raw_size);
 
-    /* look for a null message which is large enough */
-    for(idx = 0; idx < oh->nmesgs; idx++)
-        if(H5O_NULL_ID == oh->mesg[idx].type->id && oh->mesg[idx].raw_size >= aligned_size)
-            break;
+    /* Find the smallest null message that could hold the new object header message */
+    idx = oh->nmesgs;
+    if(H5O__alloc_find_best_null(oh, aligned_size, &idx) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "error while locating best null header message")
 
     /* if we didn't find one, then allocate more header space */
     if(idx >= oh->nmesgs) {
@@ -1164,7 +1333,7 @@ H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
             htri_t	tri_result;     /* Status from attempting to extend chunk */
 
             if((tri_result = H5O_alloc_extend_chunk(f, dxpl_id, oh, chunkno, raw_size, &idx)) < 0)
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTEXTEND, FAIL, "H5O_alloc_extend_chunk failed unexpectedly")
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTEXTEND, FAIL, "can't extend existing chunk")
             if(tri_result == TRUE)
 		break;
         } /* end for */
@@ -1309,12 +1478,6 @@ H5O_move_cont(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned cont_u)
         nonnull_size = 0;
         for(v = 0, curr_msg = &oh->mesg[0]; v < oh->nmesgs; v++, curr_msg++) {
             if(curr_msg->chunkno == deleted_chunkno) {
-                /* If there's a locked message, we can't move all messages out of
-                 *  chunk to delete, so get out now.
-                 */
-                if(curr_msg->locked)
-                    HGOTO_DONE(FALSE)
-
                 /* Find size of all non-null messages in the chunk pointed to by the continuation message */
                 if(curr_msg->type->id != H5O_NULL_ID) {
                     HDassert(curr_msg->type->id != H5O_CONT_ID);
@@ -1555,211 +1718,203 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
                     } /* end else-if */
                 } /* end if */
 
-                /* Don't let locked messages be moved into earlier chunk */
-                if(!curr_msg->locked) {
-                    /* Loop over messages again, looking for large enough null message in earlier chunk */
-                    for(v = 0, null_msg = &oh->mesg[0]; v < oh->nmesgs; v++, null_msg++) {
-                        if(H5O_NULL_ID == null_msg->type->id && curr_msg->chunkno > null_msg->chunkno
-                                && curr_msg->raw_size <= null_msg->raw_size) {
-                            unsigned old_chunkno;   /* Old message information */
-                            uint8_t *old_raw;
-
-                            /* Keep old information about non-null message */
-                            old_chunkno = curr_msg->chunkno;
-                            old_raw = curr_msg->raw;
-
-                            /* Protect chunks */
-                            if(NULL == (null_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, null_msg->chunkno)))
-                                HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
-                            if(NULL == (curr_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
+                /* Loop over messages again, looking for large enough null message in earlier chunk */
+                for(v = 0, null_msg = &oh->mesg[0]; v < oh->nmesgs; v++, null_msg++) {
+                    if(H5O_NULL_ID == null_msg->type->id && curr_msg->chunkno > null_msg->chunkno
+                            && curr_msg->raw_size <= null_msg->raw_size) {
+                        unsigned old_chunkno;   /* Old message information */
+                        uint8_t *old_raw;
+
+                        /* Keep old information about non-null message */
+                        old_chunkno = curr_msg->chunkno;
+                        old_raw = curr_msg->raw;
+
+                        /* Protect chunks */
+                        if(NULL == (null_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, null_msg->chunkno)))
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+                        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(oh->swmr_write && (H5O_CONT_ID == curr_msg->type->id)) {
+                            void *null_chk_mdc_obj;     /* 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")
 
-                            /* 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->parent);
+                            HDassert(curr_chk_proxy);
+                            HDassert((void *)curr_chk_proxy == cont_targ_chk_proxy->parent);
 
-                                /* 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")
 
-                                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->parent = NULL;
 
-				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")
 
-                                /* 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));
 
-				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->parent = null_chk_mdc_obj;
 
-				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 */
 
-                                /* 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;
+                        /* 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));
+
+                        /* Point non-null message at null message's space */
+                        curr_msg->chunkno = null_msg->chunkno;
+                        curr_msg->raw = null_msg->raw;
+                        curr_chk_dirtied = TRUE;
+
+                        /* Change information for null message */
+                        if(curr_msg->raw_size == null_msg->raw_size) {
+                            /* Point null message at old non-null space */
+                            /* (Instead of freeing it and allocating new message) */
+                            null_msg->chunkno = old_chunkno;
+                            null_msg->raw = old_raw;
+
+                            /* Mark null message dirty */
+                            null_msg->dirty = TRUE;
+                            null_chk_dirtied = TRUE;
+
+                            /* Release current chunk, marking it dirty */
+                            if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                            curr_chk_proxy = NULL;
+                            curr_chk_dirtied = FALSE;
+
+                            /* Check for gap in null message's chunk */
+                            if(oh->chunk[old_chunkno].gap > 0) {
+                                /* Eliminate the gap in the chunk */
+                                if(H5O_eliminate_gap(oh, &null_chk_dirtied, null_msg,
+                                        ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
+                                        oh->chunk[old_chunkno].gap) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
                             } /* 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));
+                            /* Release null chunk, marking it dirty */
+                            if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                            null_chk_proxy = NULL;
+                            null_chk_dirtied = FALSE;
+                        } /* end if */
+                        else {
+                            size_t new_null_msg;          /* Message index for new null message */
 
-                            /* Point non-null message at null message's space */
-                            curr_msg->chunkno = null_msg->chunkno;
-                            curr_msg->raw = null_msg->raw;
-                            curr_chk_dirtied = TRUE;
+                            /* Check if null message is large enough to still exist */
+                            if((null_msg->raw_size - curr_msg->raw_size) < (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
+                                size_t gap_size = null_msg->raw_size - curr_msg->raw_size;     /* Size of gap produced */
 
-                            /* Change information for null message */
-                            if(curr_msg->raw_size == null_msg->raw_size) {
-                                /* Point null message at old non-null space */
-                                /* (Instead of freeing it and allocating new message) */
-                                null_msg->chunkno = old_chunkno;
-                                null_msg->raw = old_raw;
+                                /* Adjust the size of the null message being eliminated */
+                                null_msg->raw_size = curr_msg->raw_size;
 
                                 /* Mark null message dirty */
                                 null_msg->dirty = TRUE;
                                 null_chk_dirtied = TRUE;
 
-                                /* Release current chunk, marking it dirty */
-                                if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
-                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
-                                curr_chk_proxy = NULL;
-                                curr_chk_dirtied = FALSE;
-
-                                /* Check for gap in null message's chunk */
-                                if(oh->chunk[old_chunkno].gap > 0) {
-                                    /* Eliminate the gap in the chunk */
-                                    if(H5O_eliminate_gap(oh, &null_chk_dirtied, null_msg,
-                                            ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
-                                            oh->chunk[old_chunkno].gap) < 0)
-                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
-                                } /* end if */
+                                /* Add the gap to the chunk */
+                                if(H5O_add_gap(f, oh, null_msg->chunkno, &null_chk_dirtied, v, null_msg->raw + null_msg->raw_size, gap_size) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert gap in chunk")
 
-                                /* Release null chunk, marking it dirty */
-                                if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
-                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
-                                null_chk_proxy = NULL;
-                                null_chk_dirtied = FALSE;
+                                /* Re-use message # for new null message taking place of non-null message */
+                                new_null_msg = v;
                             } /* end if */
                             else {
-                                size_t new_null_msg;          /* Message index for new null message */
+                                /* Adjust null message's size & offset */
+                                null_msg->raw += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
+                                null_msg->raw_size -= curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
 
-                                /* Check if null message is large enough to still exist */
-                                if((null_msg->raw_size - curr_msg->raw_size) < (size_t)H5O_SIZEOF_MSGHDR_OH(oh)) {
-                                    size_t gap_size = null_msg->raw_size - curr_msg->raw_size;     /* Size of gap produced */
-
-                                    /* Adjust the size of the null message being eliminated */
-                                    null_msg->raw_size = curr_msg->raw_size;
-
-                                    /* Mark null message dirty */
-                                    null_msg->dirty = TRUE;
-                                    null_chk_dirtied = TRUE;
+                                /* Mark null message dirty */
+                                null_msg->dirty = TRUE;
+                                null_chk_dirtied = TRUE;
 
-                                    /* Add the gap to the chunk */
-                                    if(H5O_add_gap(f, oh, null_msg->chunkno, &null_chk_dirtied, v, null_msg->raw + null_msg->raw_size, gap_size) < 0)
-                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert gap in chunk")
+                                /* Create new null message for previous location of non-null message */
+                                if(oh->nmesgs >= oh->alloc_nmesgs) {
+                                    if(H5O_alloc_msgs(oh, (size_t)1) < 0)
+                                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
 
-                                    /* Re-use message # for new null message taking place of non-null message */
-                                    new_null_msg = v;
-                                } /* end if */
-                                else {
-                                    /* Adjust null message's size & offset */
-                                    null_msg->raw += curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
-                                    null_msg->raw_size -= curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh);
-
-                                    /* Mark null message dirty */
-                                    null_msg->dirty = TRUE;
-                                    null_chk_dirtied = TRUE;
-
-                                    /* Create new null message for previous location of non-null message */
-                                    if(oh->nmesgs >= oh->alloc_nmesgs) {
-                                        if(H5O_alloc_msgs(oh, (size_t)1) < 0)
-                                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate more space for messages")
-
-                                        /* "Retarget" 'curr_msg' pointer into newly re-allocated array of messages */
-                                        curr_msg = &oh->mesg[u];
-                                    } /* end if */
-
-                                    /* Get message # for new null message */
-                                    new_null_msg = oh->nmesgs++;
-                                } /* end else */
-
-                                /* Release null message's chunk, marking it dirty */
-                                if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
-                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
-                                null_chk_proxy = NULL;
-                                null_chk_dirtied = FALSE;
-
-                                /* Initialize new null message to take over non-null message's location */
-                                oh->mesg[new_null_msg].type = H5O_MSG_NULL;
-                                oh->mesg[new_null_msg].native = NULL;
-                                oh->mesg[new_null_msg].raw = old_raw;
-                                oh->mesg[new_null_msg].raw_size = curr_msg->raw_size;
-                                oh->mesg[new_null_msg].chunkno = old_chunkno;
-
-                                /* Mark new null message dirty */
-                                oh->mesg[new_null_msg].dirty = TRUE;
-                                curr_chk_dirtied = TRUE;
-
-                                /* Check for gap in new null message's chunk */
-                                if(oh->chunk[old_chunkno].gap > 0) {
-                                    /* Eliminate the gap in the chunk */
-                                    if(H5O_eliminate_gap(oh, &curr_chk_dirtied, &oh->mesg[new_null_msg],
-                                            ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
-                                            oh->chunk[old_chunkno].gap) < 0)
-                                        HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+                                    /* "Retarget" 'curr_msg' pointer into newly re-allocated array of messages */
+                                    curr_msg = &oh->mesg[u];
                                 } /* end if */
 
-                                /* Release new null message's chunk, marking it dirty */
-                                if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
-                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
-                                curr_chk_proxy = NULL;
-                                curr_chk_dirtied = FALSE;
+                                /* Get message # for new null message */
+                                new_null_msg = oh->nmesgs++;
                             } /* end else */
 
-                            /* Indicate that we packed messages */
-                            packed_msg = TRUE;
+                            /* Release null message's chunk, marking it dirty */
+                            if(H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                            null_chk_proxy = NULL;
+                            null_chk_dirtied = FALSE;
+
+                            /* Initialize new null message to take over non-null message's location */
+                            oh->mesg[new_null_msg].type = H5O_MSG_NULL;
+                            oh->mesg[new_null_msg].native = NULL;
+                            oh->mesg[new_null_msg].raw = old_raw;
+                            oh->mesg[new_null_msg].raw_size = curr_msg->raw_size;
+                            oh->mesg[new_null_msg].chunkno = old_chunkno;
+
+                            /* Mark new null message dirty */
+                            oh->mesg[new_null_msg].dirty = TRUE;
+                            curr_chk_dirtied = TRUE;
 
-                            /* Break out of loop */
-                            /* (If it's possible to move message to even earlier chunk
-                             *      we'll get it on the next pass - QAK)
-                             */
-                            break;
-                        } /* end if */
-                    } /* end for */
-                } /* end if */
+                            /* Check for gap in new null message's chunk */
+                            if(oh->chunk[old_chunkno].gap > 0) {
+                                /* Eliminate the gap in the chunk */
+                                if(H5O_eliminate_gap(oh, &curr_chk_dirtied, &oh->mesg[new_null_msg],
+                                        ((oh->chunk[old_chunkno].image + oh->chunk[old_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[old_chunkno].gap)),
+                                        oh->chunk[old_chunkno].gap) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTREMOVE, FAIL, "can't eliminate gap in chunk")
+                            } /* end if */
+
+                            /* Release new null message's chunk, marking it dirty */
+                            if(H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                            curr_chk_proxy = NULL;
+                            curr_chk_dirtied = FALSE;
+                        } /* end else */
+
+                        /* Indicate that we packed messages */
+                        packed_msg = TRUE;
+
+                        /* Break out of loop */
+                        /* (If it's possible to move message to even earlier chunk
+                         *      we'll get it on the next pass - QAK)
+                         */
+                        break;
+                    } /* end if */
+                } /* end for */
 
                 /* If we packed messages, get out of loop and start over */
                 /* (Don't know if this has any benefit one way or the other -QAK) */
@@ -1866,6 +2021,7 @@ H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
                         /* Second message has been merged, delete it */
                         if(merged_msg) {
                             H5O_chunk_proxy_t *curr_chk_proxy;        /* Chunk that message is in */
+                            htri_t result;
 
                             /* Release any information/memory for second message */
                             H5O_msg_free_mesg(curr_msg2);
@@ -1893,6 +2049,13 @@ H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
                             /* (Don't bother reducing size of message array for now -QAK) */
                             oh->nmesgs--;
 
+                            /* The merge null message might span the entire chunk: scan for empty chunk to remove */
+                            if((result = H5O_remove_empty_chunks(f, dxpl_id, oh)) < 0)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't remove empty chunk")
+                            else if(result > 0)
+                                /* Get out of loop */
+                                break;
+
                             /* If the merged message is too large, shrink the chunk */
                             if(curr_msg->raw_size >= H5O_MESG_MAX_SIZE)
                                 if(H5O_alloc_shrink_chunk(f, dxpl_id, oh, curr_msg->chunkno) < 0)
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 9cbcdc4..cb802ea 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #define H5A_FRIEND		/*suppress error about including H5Apkg   */
@@ -128,6 +126,9 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned H5_ATTR_UNUSED
     H5A_t		*attr = NULL;
     H5S_extent_t	*extent;	/*extent dimensionality information  */
     size_t		name_len;   	/*attribute name length */
+    size_t		dt_size;   	/* Datatype size */
+    hssize_t		sds_size;   	/* Signed Dataspace size */
+    hsize_t		ds_size;   	/* Dataspace size */
     unsigned            flags = 0;      /* Attribute flags */
     H5A_t		*ret_value = NULL;      /* Return value */
 
@@ -199,7 +200,7 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned H5_ATTR_UNUSED
 
     /* Decode attribute's dataspace extent */
     if((extent = (H5S_extent_t *)(H5O_MSG_SDSPACE->decode)(f, dxpl_id, open_oh,
-        ((flags & H5O_ATTR_FLAG_SPACE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), ioflags, p)) == NULL)
+            ((flags & H5O_ATTR_FLAG_SPACE_SHARED) ? H5O_MSG_FLAG_SHARED : 0), ioflags, p)) == NULL)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, NULL, "can't decode attribute dataspace")
 
     /* Copy the extent information to the dataspace */
@@ -217,8 +218,19 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned H5_ATTR_UNUSED
     else
         p += attr->shared->ds_size;
 
+    /* Get the datatype's size */
+    if(0 == (dt_size = H5T_get_size(attr->shared->dt)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "unable to get datatype size")
+
+    /* Get the datatype & dataspace sizes */
+    if(0 == (dt_size = H5T_get_size(attr->shared->dt)))
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "unable to get datatype size")
+    if((sds_size = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "unable to get dataspace size")
+    ds_size = (hsize_t)sds_size;
+
     /* Compute the size of the data */
-    H5_CHECKED_ASSIGN(attr->shared->data_size, size_t, H5S_GET_EXTENT_NPOINTS(attr->shared->ds) * H5T_get_size(attr->shared->dt), hsize_t);
+    H5_CHECKED_ASSIGN(attr->shared->data_size, size_t, ds_size * (hsize_t)dt_size, hsize_t);
 
     /* Go get the data */
     if(attr->shared->data_size) {
diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c
index 9b494a1..2223564 100644
--- a/src/H5Oattribute.c
+++ b/src/H5Oattribute.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -484,7 +482,7 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
     HDassert(name);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -633,7 +631,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	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
@@ -1284,7 +1282,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -1847,7 +1845,7 @@ H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
     HDassert(name);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -2001,7 +1999,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	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 d1085c8..a3531ed 100644
--- a/src/H5Obogus.c
+++ b/src/H5Obogus.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Obtreek.c b/src/H5Obtreek.c
index ac6fe37..4fd0577 100644
--- a/src/H5Obtreek.c
+++ b/src/H5Obtreek.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/src/H5Ocache.c b/src/H5Ocache.c
index 831b08a..8f4c155 100644
--- a/src/H5Ocache.c
+++ b/src/H5Ocache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -38,7 +36,6 @@
 #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                      */
 
@@ -47,12 +44,6 @@
 /* Local Macros */
 /****************/
 
-/* Set the object header size to speculatively read in */
-/* (needs to be more than the object header prefix size to work at all and
- *      should be larger than the largest object type's default object header
- *      size to save the extra I/O operations) */
-#define H5O_SPEC_READ_SIZE 512
-
 
 /******************/
 /* Local Typedefs */
@@ -69,35 +60,31 @@
 /********************/
 
 /* Metadata cache callbacks */
-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 herr_t H5O__cache_get_initial_load_size(void *udata, size_t *image_len);
+static herr_t H5O__cache_get_final_load_size(const void *image_ptr, size_t image_len,
+    void *udata, size_t *actual_len);
 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_image_len(const void *thing, size_t *image_len);
 static herr_t H5O__cache_serialize(const H5F_t *f, void *image, size_t len,
     void *thing); 
+static herr_t H5O__cache_notify(H5AC_notify_action_t action, 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 herr_t H5O__cache_chk_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
+/* Prefix routines */
+static herr_t H5O__prefix_deserialize(const uint8_t *image,
+    H5O_cache_ud_t *udata);
 
 /* Chunk routines */
 static herr_t H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len,
@@ -107,7 +94,6 @@ 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,
     const H5O_cont_t *cont);
-static herr_t H5O_decode_prefix(H5F_t *f, H5O_t *oh, const uint8_t *buf, void *_udata);
 
 
 /*********************/
@@ -120,15 +106,15 @@ const H5AC_class_t H5AC_OHDR[1] = {{
     "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_get_initial_load_size,   /* 'get_initial_load_size' callback */
+    H5O__cache_get_final_load_size,     /* 'get_final_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_notify,                  /* 'notify' callback */
     H5O__cache_free_icr,                /* 'free_icr' callback */
-    H5O__cache_clear,                   /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -138,7 +124,8 @@ const H5AC_class_t H5AC_OHDR_CHK[1] = {{
     "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_get_initial_load_size, /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -146,7 +133,6 @@ const H5AC_class_t H5AC_OHDR_CHK[1] = {{
     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 */
 }};
 
@@ -169,200 +155,78 @@ H5FL_SEQ_DEFINE(H5O_cont_t);
 /* Local Variables */
 /*******************/
 
+
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_decode_prefix
+ * Function:    H5O__cache_get_initial_load_size()
  *
- * Purpose:	To decode the object header prefix.
- *		The coding is extracted fromt H5O__cache_deserialize() to this routine.
+ * Purpose:	Tell the metadata cache how much data to read from file in 
+ *		the first speculative read for the object header.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Vailin Choi; Aug 2015
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_decode_prefix(H5F_t *f, H5O_t *oh, const uint8_t *buf, void *_udata)
+H5O__cache_get_initial_load_size(void H5_ATTR_UNUSED *_udata, size_t *image_len)
 {
-    H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;       /* User data for callback */
-    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
+    FUNC_ENTER_STATIC_NOERR
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(oh);
-    HDassert(buf);
-    HDassert(udata);
-
-    /* Check for presence of magic number */
-    /* (indicates version 2 or later) */
-    if(!HDmemcmp(p, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /* Magic number */
-        p += H5_SIZEOF_MAGIC;
-
-        /* Version */
-        oh->version = *p++;
-        if(H5O_VERSION_2 != oh->version)
-            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, FAIL, "unknown object header status flag(s)")
-
-        /* Number of links to object (unless overridden by refcount message) */
-        oh->nlink = 1;
-
-        /* Time fields */
-        if(oh->flags & H5O_HDR_STORE_TIMES) {
-            uint32_t tmp;       /* Temporary value */
-
-            UINT32DECODE(p, tmp);
-            oh->atime = (time_t)tmp;
-            UINT32DECODE(p, tmp);
-            oh->mtime = (time_t)tmp;
-            UINT32DECODE(p, tmp);
-            oh->ctime = (time_t)tmp;
-            UINT32DECODE(p, tmp);
-            oh->btime = (time_t)tmp;
-        } /* end if */
-        else
-            oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
-
-        /* Attribute fields */
-        if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
-            UINT16DECODE(p, oh->max_compact);
-            UINT16DECODE(p, oh->min_dense);
-            if(oh->max_compact < oh->min_dense)
-                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;
-            oh->min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF;
-        } /* end else */
-
-        /* First chunk size */
-        switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
-            case 0:     /* 1 byte size */
-                oh->chunk0_size = *p++;
-                break;
-
-            case 1:     /* 2 byte size */
-                UINT16DECODE(p, oh->chunk0_size);
-                break;
-
-            case 2:     /* 4 byte size */
-                UINT32DECODE(p, oh->chunk0_size);
-                break;
-
-            case 3:     /* 8 byte size */
-                UINT64DECODE(p, oh->chunk0_size);
-                break;
-
-            default:
-                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, 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, FAIL, "bad object header version number")
-
-        /* Flags */
-        oh->flags = H5O_CRT_OHDR_FLAGS_DEF;
-
-        /* Reserved */
-        p++;
-
-        /* Number of messages */
-        UINT16DECODE(p, udata->v1_pfx_nmesgs);
-
-        /* Link count */
-        UINT32DECODE(p, oh->nlink);
-
-        /* Reset unused time fields */
-        oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
-
-        /* Reset unused attribute fields */
-        oh->max_compact = 0;
-        oh->min_dense = 0;
-
-        /* First chunk size */
-        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, FAIL, "bad object header chunk size")
-
-        /* Reserved, in version 1 (for 8-byte alignment padding) */
-        p += 4;
-    } /* end else */
+    HDassert(image_len);
 
-    /* Determine object header prefix length */
-    prefix_size = (size_t)(p - buf);
-    HDassert((size_t)prefix_size == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+    /* Set the image length size */
+    *image_len = H5O_SPEC_READ_SIZE;
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O_decode_prefix() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__cache_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O__cache_get_load_size()
+ * Function:    H5O__cache_get_final_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.
+ * Purpose:	Tell the metadata cache the final size of an object header.
  *
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
  *
- * Programmer:  John Mainzer
- *              7/28/14
+ * Programmer:  Quincey Koziol
+ *              November 18, 2016
  *
  *-------------------------------------------------------------------------
  */
 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)
+H5O__cache_get_final_load_size(const void *image, size_t image_len,
+    void *_udata, size_t *actual_len)
 {
-    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 */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_STATIC_NOERR
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(image_len);
-
-    if(image == NULL)
-	*image_len = H5O_SPEC_READ_SIZE;
+    HDassert(image);
+    HDassert(udata);
+    HDassert(actual_len);
+    HDassert(*actual_len == image_len);
 
-    else { /* compute actual_len */
-	HDassert(udata);
-	HDassert(actual_len);
-	HDassert(*actual_len == *image_len);
+    /* Deserialize the object header prefix */
+    if(H5O__prefix_deserialize((const uint8_t *)image, udata) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "can't deserialize object header prefix")
 
-	/* Decode header prefix */
-	if(H5O_decode_prefix(udata->common.f, &oh, image, udata) < 0)
-	    HGOTO_DONE(FAIL)
+    /* Sanity check */
+    HDassert(udata->oh);
 
-	/* 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);
-    }
+    /* Set the final size for the cache image */
+    *actual_len = udata->chunk0_size + (size_t)H5O_SIZEOF_HDR(udata->oh);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O__cache_get_load_size() */
+} /* end H5O__cache_get_final_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -374,7 +238,8 @@ done:
  * Return:      Success:        TRUE/FALSE
  *              Failure:        Negative
  *
- * Programmer:  Vailin Choi; Aug 2015
+ * Programmer:  Vailin Choi
+ *              Aug 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -383,8 +248,6 @@ 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
@@ -392,16 +255,19 @@ H5O__cache_verify_chksum(const void *_image, size_t len, void *_udata)
     /* Check arguments */
     HDassert(image);
     HDassert(udata);
+    HDassert(udata->oh);
 
     /* There is no checksum for version 1 */
-    if(udata->version != H5O_VERSION_1) {
+    if(udata->oh->version != H5O_VERSION_1) {
+        uint32_t stored_chksum;     /* Stored metadata checksum value */
+        uint32_t computed_chksum;   /* Computed metadata checksum value */
 
 	/* Get stored and computed checksums */
 	H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
 
 	if(stored_chksum != computed_chksum)
 	    ret_value = FALSE;
-    }
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O__cache_verify_chksum() */
@@ -428,13 +294,11 @@ H5O__cache_verify_chksum(const void *_image, size_t len, void *_udata)
  *-------------------------------------------------------------------------
  */
 static void *
-H5O__cache_deserialize(const void *_image, size_t len, void *_udata,
+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
@@ -447,44 +311,38 @@ H5O__cache_deserialize(const void *_image, size_t len, void *_udata,
     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")
-
-    /* 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 partially deserialized object header */
+    /* (Object header prefix will be deserialized if the object header came
+     *  through the 'get_final_load_size' callback and not deserialized if
+     *  the object header is coming from a cache image - QAK, 2016/12/14)
+     */
+    if(NULL == udata->oh) {
+        /* Deserialize the object header prefix */
+        if(H5O__prefix_deserialize((const uint8_t *)image, udata) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't deserialize object header prefix")
 
-    /* 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")
+        /* Sanity check */
+        HDassert(udata->oh);
+    } /* end if */
 
-    /* Compute the size of the buffer used */
-    buf_size = oh->chunk0_size + (size_t)H5O_SIZEOF_HDR(oh);
+    /* Retrieve partially deserialized object header from user data */
+    oh = udata->oh;
 
+    /* Set SWMR flag, if appropriate */
     oh->swmr_write = !!(H5F_INTENT(udata->common.f) & H5F_ACC_SWMR_WRITE);
 
     /* 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")
+    if(oh->swmr_write) {
+        /* Create virtual entry, for use as proxy */
+        if(NULL == (oh->proxy = H5AC_proxy_entry_create()))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, NULL, "can't create object header proxy")
     } /* end if */
     else
-	oh->proxy_addr = HADDR_UNDEF;
+        oh->proxy = NULL;
 
-    /* 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);
+    /* Parse the first chunk */
+    if(H5O__chunk_deserialize(oh, udata->common.addr, udata->chunk0_size, (const uint8_t *)image, &(udata->common), dirty) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize first object header chunk")
 
     /* Note that we've loaded the object header from the file */
     udata->made_attempt = TRUE;
@@ -495,7 +353,7 @@ H5O__cache_deserialize(const void *_image, size_t len, void *_udata,
 done:
     /* Release the [possibly partially initialized] object header on errors */
     if(!ret_value && oh)
-        if(H5O_free(oh) < 0)
+        if(H5O__free(oh) < 0)
             HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header data")
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -518,8 +376,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5O__cache_image_len(const void *_thing, size_t *image_len)
 {
     const H5O_t *oh = (const H5O_t *)_thing;    /* Object header to query */
 
@@ -532,18 +389,11 @@ H5O__cache_image_len(const void *_thing, size_t *image_len,
     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;
+    *image_len = oh->chunk[0].size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5O__cache_image_len() */
 
-/********************************/
-/* no H5O_cache_pre_serialize() */
-/********************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5O__cache_serialize
@@ -687,132 +537,134 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O__cache_serialize() */
 
-/**********************************/
-/* no H5O_cache_notify() function */
-/**********************************/
-
 

 /*-------------------------------------------------------------------------
- * Function:    H5O__cache_free_icr
- *
- * Purpose:	Free the in core representation of the supplied object header.
+ * Function:    H5O__cache_notify
  *
- * 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).
+ * Purpose:     Handle cache action notifications
  *
- * Return:      Success:        SUCCEED
- *              Failure:        FAIL
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              7/28/14
+ * Programmer:  Quincey Koziol
+ *              Jul 23 2016
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O__cache_free_icr(void *_thing)
-{ 
-    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to destroy */
-    herr_t      ret_value = SUCCEED;    /* Return value */
+H5O__cache_notify(H5AC_notify_action_t action, void *_thing)
+{
+    H5O_t *oh = (H5O_t *)_thing;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /* Check arguments */
+    /*
+     * Check arguments.
+     */
     HDassert(oh);
-    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)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't destroy object header")
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            if(oh->swmr_write) {
+                /* Sanity check */
+                HDassert(oh->proxy);
+
+                /* Register the object header as a parent of the virtual entry */
+                if(H5AC_proxy_entry_add_parent(oh->proxy, oh) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't add object header as parent of proxy")
+            } /* end if */
+            break;
+
+        case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            {
+                unsigned            u;                      /* Local index variable */
+
+                /* Mark messages stored with the object header (i.e. messages in chunk 0) as clean */
+                for(u = 0; u < oh->nmesgs; u++)
+                    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 */
+            }
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+	case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+	case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            if(oh->swmr_write) {
+                /* Unregister the object header as a parent of the virtual entry */
+                if(H5AC_proxy_entry_remove_parent(oh->proxy, oh) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't remove object header as parent of proxy")
+            } /* end if */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+    } /* end switch */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O__cache_free_icr() */
+} /* end H5O__cache_notify() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O__cache_clear
- *
- * Purpose: 	Clear all dirty bits associated with this cache entry.
+ * Function:    H5O__cache_free_icr
  *
- *		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.
+ * Purpose:	Free the in core representation of the supplied object header.
  *
- *		This callback is also necessary for the parallel case.
+ * 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
- *              9/22/14
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-#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__cache_free_icr(void *_thing)
 { 
-    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to reset */
-    unsigned    u;                      /* Local index variable */
+    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to destroy */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-#ifdef H5_HAVE_PARALLEL
     FUNC_ENTER_STATIC
-#else
-    FUNC_ENTER_STATIC_NOERR
-#endif /* H5_HAVE_PARALLEL */
 
     /* Check arguments */
     HDassert(oh);
-    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
     HDassert(oh->cache_info.type == H5AC_OHDR);
 
-#ifdef H5_HAVE_PARALLEL
-    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.
-         */
-        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 stored with the object header (i.e. messages in chunk 0) as clean */
-    for(u = 0; u < oh->nmesgs; u++)
-        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 */
+    /* Destroy object header */
+    if(H5O__free(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't destroy object header")
 
-#ifdef H5_HAVE_PARALLEL
 done:
-#endif /* H5_HAVE_PARALLEL */
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O__cache_clear() */
+} /* end H5O__cache_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O__cache_chk_get_load_size()
+ * Function:    H5O__cache_chk_get_initial_load_size()
  *
  * 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,
+ *		deserialize call.
  *
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
@@ -823,11 +675,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5O__cache_chk_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
 
     FUNC_ENTER_STATIC_NOERR
@@ -837,16 +686,13 @@ H5O__cache_chk_get_load_size(const void *_image, void *_udata,
     HDassert(udata->oh);
     HDassert(image_len);
 
-    if(image == NULL)
-	*image_len = udata->size;
-    else {
-	HDassert(actual_len);
-        HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = udata->size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O__cache_chk_get_load_size() */
+} /* end H5O__cache_chk_get_initial_load_size() */
 
+

 /*-------------------------------------------------------------------------
  * Function:    H5B2__cache_chk_verify_chksum
  *
@@ -856,7 +702,8 @@ H5O__cache_chk_get_load_size(const void *_image, void *_udata,
  * Return:      Success:        TRUE/FALSE
  *              Failure:        Negative
  *
- * Programmer:  Vailin Choi; Aug 2015
+ * Programmer:  Vailin Choi
+ *		Aug 2015
  *
  *-------------------------------------------------------------------------
  */
@@ -865,8 +712,6 @@ 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
@@ -876,13 +721,15 @@ H5O__cache_chk_verify_chksum(const void *_image, size_t len, void *_udata)
 
     /* There is no checksum for version 1 */
     if(udata->oh->version != H5O_VERSION_1) {
+        uint32_t stored_chksum;     /* Stored metadata checksum value */
+        uint32_t computed_chksum;   /* Computed metadata checksum value */
 
 	/* Get stored and computed checksums */
 	H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
 
 	if(stored_chksum != computed_chksum)
 	    ret_value = FALSE;
-    }
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O__cache_chk_verify_chksum() */
@@ -924,12 +771,6 @@ H5O__cache_chk_deserialize(const void *image, size_t len, void *_udata,
     if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t))) 
         HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
 
-    /* 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) */
     if(udata->decoding) {
@@ -941,32 +782,35 @@ H5O__cache_chk_deserialize(const void *image, size_t len, void *_udata,
         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 */
-        chk_proxy->oh = udata->oh;
-        chk_proxy->chunkno = udata->oh->nchunks - 1;
+        /* Set the chunk number for the chunk proxy */
+        H5_CHECKED_ASSIGN(chk_proxy->chunkno, unsigned, udata->oh->nchunks - 1, size_t);
     } /* end if */
     else {
         /* Sanity check */
         HDassert(udata->chunkno < udata->oh->nchunks);
 
-        /* Set the fields for the chunk proxy */
-        chk_proxy->oh = udata->oh;
+        /* Set the chunk number for the chunk proxy */
         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.
          */
-        HDassert(0 == HDmemcmp(image, chk_proxy->oh->chunk[chk_proxy->chunkno].image, chk_proxy->oh->chunk[chk_proxy->chunkno].size));
+        HDassert(0 == HDmemcmp(image, udata->oh->chunk[chk_proxy->chunkno].image, udata->oh->chunk[chk_proxy->chunkno].size));
     } /* end else */
 
     /* Increment reference count of object header */
     if(H5O_inc_rc(udata->oh) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, NULL, "can't increment reference count on object header")
+    chk_proxy->oh = udata->oh;
 
     /* Set return value */
     ret_value = chk_proxy;
 
 done:
+    if(NULL == ret_value)
+        if(chk_proxy && H5O__chunk_dest(chk_proxy) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header chunk")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O__cache_chk_deserialize() */
 
@@ -986,8 +830,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5O__cache_chk_image_len(const void *_thing, size_t *image_len)
 {
     const H5O_chunk_proxy_t * chk_proxy = (const H5O_chunk_proxy_t *)_thing;    /* Chunk proxy to query */
 
@@ -1005,10 +848,6 @@ H5O__cache_chk_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5O__cache_chk_image_len() */
 
-/************************************/
-/* no H5O_cache_chk_pre_serialize() */
-/************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5O__cache_chk_serialize
@@ -1073,11 +912,10 @@ static herr_t
 H5O__cache_chk_notify(H5AC_notify_action_t action, void *_thing)
 {
     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
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments.
@@ -1085,69 +923,104 @@ H5O__cache_chk_notify(H5AC_notify_action_t action, void *_thing)
     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_read_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;
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            if(chk_proxy->oh->swmr_write) {
+                /* Add flush dependency on chunk parent */
+                {
+                    void *parent;       /* Chunk containing continuation message that points to this chunk */
+
+                    /* Determine the parent of the chunk */
+                    if(chk_proxy->cont_chunkno == 0)
+                        parent = chk_proxy->oh;
+                    else {
+                        if(NULL == (cont_chk_proxy = H5O_chunk_protect(chk_proxy->f, H5AC_ind_read_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 */
+
+                    /* 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));
+
+                    /* Add flush dependency from chunk containing the continuation message
+                     * that points to this chunk (either oh or another chunk proxy object)
+                     */
+                    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.
+                     */
+                    chk_proxy->parent = 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_read_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;
-
-            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(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;
+                {
+                    /* Sanity check */
+                    HDassert(chk_proxy->oh->proxy);
+
+                    /* Register the object header chunk as a parent of the virtual entry */
+                    if(H5AC_proxy_entry_add_parent(chk_proxy->oh->proxy, chk_proxy) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't add object header chunk as parent of proxy")
+                }
+            } /* end if */
+            break;
+
+        case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            {
+                unsigned            u;                      /* Local index variable */
+
+                /* 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;
+            }
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+	case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+	case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            if(chk_proxy->oh->swmr_write) {
+                /* Remove flush dependency on parent object header chunk */
+                {
+                    /* Sanity checks */
+                    HDassert(chk_proxy->parent != NULL);
+                    HDassert(((H5C_cache_entry_t *)(chk_proxy->parent))->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                    HDassert(((H5C_cache_entry_t *)(chk_proxy->parent))->type);
+                    HDassert((((H5C_cache_entry_t *)(chk_proxy->parent))->type->id == H5AC_OHDR_ID) || (((H5C_cache_entry_t *)(chk_proxy->parent))->type->id == H5AC_OHDR_CHK_ID));
+
+                    if(H5AC_destroy_flush_dependency(chk_proxy->parent, chk_proxy) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                }
+
+                /* Unregister the object header chunk as a parent of the virtual entry */
+                if(H5AC_proxy_entry_remove_parent(chk_proxy->oh->proxy, chk_proxy) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't remove object header chunk as parent of proxy")
+            } /* end if */
+            break;
 
-            default:
+        default:
 #ifdef NDEBUG
-                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
 #else /* NDEBUG */
-                HDassert(0 && "Unknown action?!?");
+            HDassert(0 && "Unknown action?!?");
 #endif /* NDEBUG */
-        } /* end switch */
-    } /* end if */
+    } /* end switch */
 
 done:
     if(cont_chk_proxy)
@@ -1190,7 +1063,7 @@ H5O__cache_chk_free_icr(void *_thing)
     HDassert(chk_proxy->cache_info.type == H5AC_OHDR_CHK);
 
     /* Destroy object header chunk proxy */
-    if(H5O__chunk_proxy_dest(chk_proxy) < 0)
+    if(H5O__chunk_dest(chk_proxy) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header chunk proxy")
 
 done:
@@ -1199,74 +1072,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O__cache_chk_clear
- *
- * Purpose: 	Clear all dirty bits associated with this cache entry.
- *
- *		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.
- *
- *		This callback is also necessary for the parallel case.
- *
- * Return:      Success:        SUCCEED
- *              Failure:        FAIL
- *
- * Programmer:  John Mainzer
- *              9/22/14
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-#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 */
-
-#ifdef H5_HAVE_PARALLEL
-    FUNC_ENTER_STATIC
-#else
-    FUNC_ENTER_STATIC_NOERR
-#endif /* H5_HAVE_PARALLEL */
-
-    /* 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);
-    oh = chk_proxy->oh;
-    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((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() */
-
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5O__add_cont_msg
  *
  * Purpose:	Add information from a continuation message to the list of
@@ -1316,6 +1121,163 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5O__prefix_deserialize()
+ *
+ * Purpose:	Deserialize an object header prefix
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              December 14, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__prefix_deserialize(const uint8_t *_image, H5O_cache_ud_t *udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;   	/* Pointer into raw data buffer */
+    H5O_t *oh = NULL;                   /* Object header read in */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+
+    /* Allocate space for the new object header data structure */
+    if(NULL == (oh = H5FL_CALLOC(H5O_t)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "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) */
+    if(!HDmemcmp(image, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /* Magic number */
+        image += H5_SIZEOF_MAGIC;
+
+        /* Version */
+        oh->version = *image++;
+        if(H5O_VERSION_2 != oh->version)
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, FAIL, "bad object header version number")
+
+        /* Flags */
+        oh->flags = *image++;
+        if(oh->flags & ~H5O_HDR_ALL_FLAGS)
+            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;
+
+        /* Time fields */
+        if(oh->flags & H5O_HDR_STORE_TIMES) {
+            uint32_t tmp;       /* Temporary value */
+
+            UINT32DECODE(image, tmp);
+            oh->atime = (time_t)tmp;
+            UINT32DECODE(image, tmp);
+            oh->mtime = (time_t)tmp;
+            UINT32DECODE(image, tmp);
+            oh->ctime = (time_t)tmp;
+            UINT32DECODE(image, tmp);
+            oh->btime = (time_t)tmp;
+        } /* end if */
+        else
+            oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+
+        /* Attribute fields */
+        if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
+            UINT16DECODE(image, oh->max_compact);
+            UINT16DECODE(image, oh->min_dense);
+            if(oh->max_compact < oh->min_dense)
+                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;
+            oh->min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF;
+        } /* end else */
+
+        /* First chunk size */
+        switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
+            case 0:     /* 1 byte size */
+                udata->chunk0_size = *image++;
+                break;
+
+            case 1:     /* 2 byte size */
+                UINT16DECODE(image, udata->chunk0_size);
+                break;
+
+            case 2:     /* 4 byte size */
+                UINT32DECODE(image, udata->chunk0_size);
+                break;
+
+            case 3:     /* 8 byte size */
+                UINT64DECODE(image, udata->chunk0_size);
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad size for chunk 0")
+        } /* end switch */
+        if(udata->chunk0_size > 0 && udata->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh))
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad object header chunk size")
+    } /* end if */
+    else {
+        /* Version */
+        oh->version = *image++;
+        if(H5O_VERSION_1 != oh->version)
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, FAIL, "bad object header version number")
+
+        /* Flags */
+        oh->flags = H5O_CRT_OHDR_FLAGS_DEF;
+
+        /* Reserved */
+        image++;
+
+        /* Number of messages */
+        UINT16DECODE(image, udata->v1_pfx_nmesgs);
+
+        /* Link count */
+        UINT32DECODE(image, oh->nlink);
+
+        /* Reset unused time fields */
+        oh->atime = oh->mtime = oh->ctime = oh->btime = 0;
+
+        /* Reset unused attribute fields */
+        oh->max_compact = 0;
+        oh->min_dense = 0;
+
+        /* First chunk size */
+        UINT32DECODE(image, udata->chunk0_size);
+        if((udata->v1_pfx_nmesgs > 0 && udata->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh)) ||
+                (udata->v1_pfx_nmesgs == 0 && udata->chunk0_size > 0))
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad object header chunk size")
+
+        /* Reserved, in version 1 (for 8-byte alignment padding) */
+        image += 4;
+    } /* end else */
+
+    /* Verify object header prefix length */
+    HDassert((size_t)(image - _image) == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+
+    /* Save the object header for later use in 'deserialize' callback */
+    udata->oh = oh;
+    oh = NULL;
+
+done:
+    /* Release the [possibly partially initialized] object header on errors */
+    if(ret_value < 0 && oh)
+        if(H5O__free(oh) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header data")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__prefix_deserialize() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5O__chunk_deserialize
  *
  * Purpose:	Deserialize a chunk for an object header
@@ -1335,12 +1297,12 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
 {
     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 */
     unsigned chunkno;           /* Current chunk's index */
 #ifndef NDEBUG
     unsigned nullcnt;           /* Count of null messages (for sanity checking gaps in chunks) */
 #endif /* NDEBUG */
+    hbool_t mesgs_modified = FALSE;     /* Whether any messages were modified when the object header was deserialized */
     herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_STATIC
@@ -1366,17 +1328,15 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
     /* Init the chunk data info */
     chunkno = (unsigned)oh->nchunks++;
     oh->chunk[chunkno].gap = 0;
-    if(chunkno == 0) {
+    oh->chunk[chunkno].addr = addr;
+    if(chunkno == 0)
         /* First chunk's 'image' includes room for the object header prefix */
-        oh->chunk[0].addr = addr;
         oh->chunk[0].size = len + (size_t)H5O_SIZEOF_HDR(oh);
-    } /* end if */
-    else {
-        oh->chunk[chunkno].addr = addr;
+    else
         oh->chunk[chunkno].size = len;
-    } /* end else */
     if(NULL == (oh->chunk[chunkno].image = H5FL_BLK_MALLOC(chunk_image, oh->chunk[chunkno].size)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "memory allocation failed")
+    oh->chunk[chunkno].chunk_proxy = NULL;
 
     /* Copy disk image into chunk's image */
     HDmemcpy(oh->chunk[chunkno].image, image, oh->chunk[chunkno].size);
@@ -1396,16 +1356,12 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
         chunk_image += H5_SIZEOF_MAGIC;
     } /* end if */
 
-    /* Save # of messages already inspected */
-    curmesg = oh->nmesgs;
-
     /* Decode messages from this chunk */
     eom_ptr = oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM_OH(oh));
 #ifndef NDEBUG
     nullcnt = 0;
 #endif /* NDEBUG */
     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 */
         uint8_t	flags;          /* Flags for current message */
@@ -1433,6 +1389,10 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "bad flag combination for message")
         if((flags & H5O_MSG_FLAG_WAS_UNKNOWN) && !(flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "bad flag combination for message")
+        if((flags & H5O_MSG_FLAG_SHAREABLE)
+                && H5O_msg_class_g[id]
+                && !(H5O_msg_class_g[id]->share_flags & H5O_SHARE_IS_SHARABLE))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "message of unsharable class flagged as sharable")
 
         /* Reserved bytes/creation index */
         if(oh->version == H5O_VERSION_1)
@@ -1460,39 +1420,45 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
                 H5O_NULL_ID == id && oh->nmesgs > 0 &&
                 H5O_NULL_ID == oh->mesg[oh->nmesgs - 1].type->id &&
                 oh->mesg[oh->nmesgs - 1].chunkno == chunkno) {
+            size_t mesgno;          /* Current message to operate on */
 
             /* Combine adjacent null messages */
             mesgno = oh->nmesgs - 1;
             oh->mesg[mesgno].raw_size += (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + mesg_size;
             oh->mesg[mesgno].dirty = TRUE;
             merged_null_msgs++;
-            udata->merged_null_msgs++;
         } /* end if */
         else {
+            H5O_mesg_t *mesg;       /* Pointer to new message */
+            unsigned ioflags = 0;   /* Flags for decode routine */
+
             /* Check if we need to extend message table to hold the new message */
             if(oh->nmesgs >= oh->alloc_nmesgs)
                 if(H5O_alloc_msgs(oh, (size_t)1) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate more space for messages")
 
-            /* Get index for message */
-            mesgno = oh->nmesgs++;
+            /* Get pointer to message to set up */
+            mesg = &oh->mesg[oh->nmesgs];
+
+            /* Increment # of messages */
+            oh->nmesgs++;
 
             /* Initialize information about message */
-            oh->mesg[mesgno].dirty = FALSE;
-            oh->mesg[mesgno].flags = flags;
-            oh->mesg[mesgno].crt_idx = crt_idx;
-            oh->mesg[mesgno].native = NULL;
-            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;
+            mesg->dirty = FALSE;
+            mesg->flags = flags;
+            mesg->crt_idx = crt_idx;
+            mesg->native = NULL;
+            mesg->raw = (uint8_t *)chunk_image;        /* Casting away const OK - QAK */
+            mesg->raw_size = mesg_size;
+            mesg->chunkno = chunkno;
 
             /* Point unknown messages at 'unknown' message class */
             /* (Usually from future versions of the library) */
 	    if(id >= H5O_UNKNOWN_ID ||
 #ifdef H5O_ENABLE_BOGUS
-	       id == H5O_BOGUS_VALID_ID ||
+                    id == H5O_BOGUS_VALID_ID ||
 #endif
-	       NULL == H5O_msg_class_g[id]) {
+                    NULL == H5O_msg_class_g[id]) {
 
 		H5O_unknown_t *unknown;     /* Pointer to "unknown" message info */
 
@@ -1504,10 +1470,10 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
                 *unknown = id;
 
                 /* Save 'native' form of unknown message */
-                oh->mesg[mesgno].native = unknown;
+                mesg->native = unknown;
 
                 /* Set message to "unknown" class */
-                oh->mesg[mesgno].type = H5O_msg_class_g[H5O_UNKNOWN_ID];
+                mesg->type = H5O_msg_class_g[H5O_UNKNOWN_ID];
 
                 /* Check for "fail if unknown" message flags */
                 if(((udata->file_intent & H5F_ACC_RDWR) && 
@@ -1530,17 +1496,66 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
                      * the metadata cache in some other "weird" way, like
                      * using H5Ocopy() - QAK
                      */
-                    oh->mesg[mesgno].flags |= H5O_MSG_FLAG_WAS_UNKNOWN;
+                    mesg->flags |= H5O_MSG_FLAG_WAS_UNKNOWN;
 
                     /* Mark the message and chunk as dirty */
-                    oh->mesg[mesgno].dirty = TRUE;
-                    udata->mesgs_modified = TRUE;
-                    *dirty = TRUE;
+                    mesg->dirty = TRUE;
+                    mesgs_modified = TRUE;
                 } /* end if */
             } /* end if */
             else
                 /* Set message class for "known" messages */
-                oh->mesg[mesgno].type = H5O_msg_class_g[id];
+                mesg->type = H5O_msg_class_g[id];
+
+            /* Do some inspection/interpretation of new messages from this chunk */
+            /* (detect continuation messages, ref. count messages, etc.) */
+
+            /* Check if message is a continuation message */
+            if(H5O_CONT_ID == id) {
+                H5O_cont_t *cont;
+
+                /* Decode continuation message */
+                cont = (H5O_cont_t *)(H5O_MSG_CONT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, mesg->raw);
+                H5_CHECKED_ASSIGN(cont->chunkno, unsigned, udata->cont_msg_info->nmsgs + 1, size_t); /* the next continuation message/chunk */
+
+                /* Save 'native' form of continuation message */
+                mesg->native = cont;
+
+                /* Add to continuation messages left to interpret */
+                if(H5O__add_cont_msg(udata->cont_msg_info, cont) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't add continuation message")
+            } /* end if */
+            /* Check if message is a ref. count message */
+            else if(H5O_REFCOUNT_ID == id) {
+                H5O_refcount_t *refcount;
+
+                /* Decode ref. count message */
+                HDassert(oh->version > H5O_VERSION_1);
+                refcount = (H5O_refcount_t *)(H5O_MSG_REFCOUNT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, mesg->raw);
+
+                /* Save 'native' form of ref. count message */
+                mesg->native = refcount;
+
+                /* Set object header values */
+                oh->has_refcount_msg = TRUE;
+                oh->nlink = *refcount;
+            } /* end if */
+            /* Check if message is a link message */
+            else if(H5O_LINK_ID == id) {
+                /* Increment the count of link messages */
+                oh->link_msgs_seen++;
+            } /* end if */
+            /* Check if message is an attribute message */
+            else if(H5O_ATTR_ID == id) {
+                /* Increment the count of attribute messages */
+                oh->attr_msgs_seen++;
+            } /* end if */
+
+            /* Mark the message & chunk as dirty if the message was changed by decoding */
+            if((ioflags & H5O_DECODEIO_DIRTY) && (udata->file_intent & H5F_ACC_RDWR)) {
+                mesg->dirty = TRUE;
+                mesgs_modified = TRUE;
+            } /* end if */
         } /* end else */
 
         /* Advance decode pointer past message */
@@ -1570,79 +1585,18 @@ H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image
 
         /* Metadata checksum */
         UINT32DECODE(chunk_image, stored_chksum);
-
     } /* end if */
 
     /* Sanity check */
     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.) */
-    while(curmesg < oh->nmesgs) {
-        /* Check if next message to examine is a continuation message */
-        if(H5O_CONT_ID == oh->mesg[curmesg].type->id) {
-            H5O_cont_t *cont;
-            unsigned ioflags = 0;   /* Flags for decode routine */
-
-            /* Decode continuation message */
-            cont = (H5O_cont_t *)(H5O_MSG_CONT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, oh->mesg[curmesg].raw);
-            cont->chunkno = udata->cont_msg_info->nmsgs + 1;	/*the next continuation message/chunk */
-
-            /* Save 'native' form of continuation message */
-            oh->mesg[curmesg].native = cont;
-
-            /* Add to continuation messages left to interpret */
-            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 */
-            if((ioflags & H5O_DECODEIO_DIRTY) && (udata->file_intent & H5F_ACC_RDWR)) {
-                oh->mesg[curmesg].dirty = TRUE;
-                udata->mesgs_modified = TRUE;
-                *dirty = TRUE;
-            } /* end if */
-        } /* end if */
-        /* Check if next message to examine is a ref. count message */
-        else if(H5O_REFCOUNT_ID == oh->mesg[curmesg].type->id) {
-            H5O_refcount_t *refcount;
-            unsigned ioflags = 0;   /* Flags for decode routine */
-
-            /* Decode ref. count message */
-            HDassert(oh->version > H5O_VERSION_1);
-            refcount = (H5O_refcount_t *)(H5O_MSG_REFCOUNT->decode)(udata->f, udata->dxpl_id, NULL, 0, &ioflags, oh->mesg[curmesg].raw);
-
-            /* Save 'native' form of ref. count message */
-            oh->mesg[curmesg].native = refcount;
-
-            /* Set object header values */
-            oh->has_refcount_msg = TRUE;
-            oh->nlink = *refcount;
-
-            /* Mark the message & chunk as dirty if the message was changed by decoding */
-            if((ioflags & H5O_DECODEIO_DIRTY) && (udata->file_intent & H5F_ACC_RDWR)) {
-                oh->mesg[curmesg].dirty = TRUE;
-                udata->mesgs_modified = TRUE;
-                *dirty = TRUE;
-            } /* end if */
-        } /* end if */
-        /* Check if next message to examine is a link message */
-        else if(H5O_LINK_ID == oh->mesg[curmesg].type->id) {
-            /* Increment the count of link messages */
-            oh->link_msgs_seen++;
-        } /* end if */
-        /* Check if next message to examine is an attribute message */
-        else if(H5O_ATTR_ID == oh->mesg[curmesg].type->id) {
-            /* Increment the count of attribute messages */
-            oh->attr_msgs_seen++;
-        } /* end if */
-
-        /* Advance to next message */
-        curmesg++;
-    } /* end while */
+    /* Mark the chunk dirty if we've modified messages */
+    if(mesgs_modified)
+	*dirty = TRUE;
 
     /* Mark the chunk dirty if we've merged null messages */
-    if(merged_null_msgs) {
-        udata->mesgs_modified = TRUE;
+    if(merged_null_msgs > 0) {
+        udata->merged_null_msgs += merged_null_msgs;
 	*dirty = TRUE;
     } /* end if */
 
@@ -1715,38 +1669,3 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5O__chunk_serialize() */
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5O__chunk_proxy_dest
- *
- * Purpose:	Destroy a chunk proxy object
- *
- * Return:	Success: SUCCEED
- *              Failure: FAIL
- *
- * Programmer:	Quincey Koziol
- *              koziol at hdfgroup.org
- *              July 13, 2008
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5O__chunk_proxy_dest(H5O_chunk_proxy_t *chk_proxy)
-{
-    herr_t ret_value = SUCCEED; /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /* Check arguments */
-    HDassert(chk_proxy);
-
-    /* Decrement reference count of object header */
-    if(chk_proxy->oh && H5O_dec_rc(chk_proxy->oh) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "can't decrement reference count on object header")
-
-    /* Release the chunk proxy object */
-    chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O__chunk_proxy_dest() */
diff --git a/src/H5Ocache_image.c b/src/H5Ocache_image.c
new file mode 100644
index 0000000..29b2503
--- /dev/null
+++ b/src/H5Ocache_image.c
@@ -0,0 +1,377 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Ocache_image.c
+ *              June 21, 2015
+ *              John Mainzer
+ *
+ * Purpose:     A message indicating that a metadata cache image block
+ *		of the indicated length exists at the specified offset
+ *		in the HDF5 file.
+ *
+ * 		The mdci_msg only appears in the superblock extension.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
+
+#include "H5private.h"          /* Generic Functions                     */
+#include "H5Eprivate.h"         /* Error handling                        */
+#include "H5Fprivate.h"		/* Files				*/
+#include "H5FLprivate.h"        /* Free Lists                            */
+#include "H5Opkg.h"             /* Object headers                        */
+#include "H5MFprivate.h"        /* File space management                 */
+
+/* Callbacks for message class */
+static void *H5O__mdci_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__mdci_encode(H5F_t *f, hbool_t disable_shared, 
+    uint8_t *p, const void *_mesg);
+static void *H5O__mdci_copy(const void *_mesg, void *_dest);
+static size_t H5O__mdci_size(const H5F_t *f, hbool_t disable_shared, 
+    const void *_mesg);
+static herr_t H5O__mdci_free(void *mesg);
+static herr_t H5O__mdci_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+    void *_mesg);
+static herr_t H5O__mdci_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_MDCI[1] = {{
+    H5O_MDCI_MSG_ID,            /* message id number              */
+    "mdci",                     /* message name for debugging     */
+    sizeof(H5O_mdci_t),         /* native message size            */
+    0,                          /* messages are sharable?         */
+    H5O__mdci_decode,           /* decode message                 */
+    H5O__mdci_encode,           /* encode message                 */
+    H5O__mdci_copy,             /* copy method                    */
+    H5O__mdci_size,             /* size of mdc image message      */
+    NULL,                       /* reset method                   */
+    H5O__mdci_free,             /* free method                    */
+    H5O__mdci_delete,		/* 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__mdci_debug             /* debugging                      */
+}};
+
+/* Only one version of the metadata cache image message at present */
+#define H5O_MDCI_VERSION_0 	0
+
+/* Declare the free list for H5O_mdci_t's */
+H5FL_DEFINE(H5O_mdci_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_decode
+ *
+ * Purpose:     Decode a metadata cache image  message and return a
+ * 		pointer to a newly allocated H5O_mdci_t struct.
+ *
+ * Return:      Success:        Ptr to new message in native struct.
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__mdci_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_mdci_t      *mesg;                  /* Native message        */
+    void            *ret_value = NULL;      /* Return value          */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_MDCI_VERSION_0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (mesg = (H5O_mdci_t *)H5FL_MALLOC(H5O_mdci_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for metadata cache image message")
+
+    /* Decode */
+    H5F_addr_decode(f, &p, &(mesg->addr));
+    H5F_DECODE_LENGTH(f, p, mesg->size);
+
+    /* Set return value */
+    ret_value = (void *)mesg;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__mdci_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_encode
+ *
+ * Purpose:     Encode metadata cache image message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__mdci_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, 
+    uint8_t *p, const void *_mesg)
+{
+    const H5O_mdci_t *mesg = (const H5O_mdci_t *)_mesg;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
+
+    /* encode */
+    *p++ = H5O_MDCI_VERSION_0;
+    H5F_addr_encode(f, &p, mesg->addr);
+    H5F_ENCODE_LENGTH(f, p, mesg->size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__mdci_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__mdci_copy(const void *_mesg, void *_dest)
+{
+    const H5O_mdci_t   *mesg = (const H5O_mdci_t *)_mesg;
+    H5O_mdci_t         *dest = (H5O_mdci_t *) _dest;
+    void               *ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(mesg);
+    if(!dest && NULL == (dest = H5FL_MALLOC(H5O_mdci_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *mesg;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_mdci__copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_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:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O__mdci_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, 
+    const void H5_ATTR_UNUSED *_mesg)
+{
+    size_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Set return value */
+    ret_value = (size_t)( 1 +                   /* Version number           */ 
+                          H5F_SIZEOF_ADDR(f) +  /* addr of metadata cache   */
+                                                /* image block              */
+                          H5F_SIZEOF_SIZE(f) ); /* length of metadata cache */
+                                                /* image block              */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__mdci_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_free
+ *
+ * Purpose:     Free the message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__mdci_free(void *mesg)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_mdci_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__mdci_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_delete
+ *
+ * Purpose:     Free file space referenced by message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, March 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__mdci_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+{
+    H5O_mdci_t *mesg = (H5O_mdci_t *)_mesg;
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check args */
+    HDassert(f);
+    HDassert(open_oh);
+    HDassert(mesg);
+
+    /* Free file space for cache image */
+    if(H5F_addr_defined(mesg->addr)) {
+        /* The space for the cache image block was allocated directly
+         * from the VFD layer at the end of file.  As this was the
+         * last file space allocation before shutdown, the cache image
+         * should still be the last item in the file.
+         *
+         * If the hack to work around the self referential free space
+         * manager issue is in use, file space for the non-empty self
+         * referential free space managers was also allocated from VFD
+         * layer at the end of file.  Since these allocations directly
+         * preceeded the cache image allocation they should be directly
+         * adjacent to the cache image block at the end of file.
+         *
+         * In this case, just call H5MF_tidy_self_referential_fsm_hack().
+         *
+         * That routine will float the self referential free space
+         * managers, and reduce the eoa to its value just prior to
+         * allocation of space for same.  Since the cache image appears
+         * just after the self referential free space managers, this
+         * will release the file space for the cache image as well.
+         *
+         * Note that in this case, there must not have been any file
+         * space allocations / deallocations prior to the free of the
+         * cache image.  Verify this to the extent possible.
+         *
+         * If the hack to work around the persistant self referential
+         * free space manager issue is NOT in use, just call H5MF_xfree()
+         * to release the cache iamge.  In principle, we should be able
+         * to just reduce the EOA to the base address of the cache
+         * image block, as there shouldn't be any file space allocation
+         * before the first metadata cache access.  However, given
+         * time constraints, I don't want to go there now.
+         */
+        if(H5F_FIRST_ALLOC_DEALLOC(f)) {
+            HDassert(HADDR_UNDEF !=H5F_EOA_PRE_FSM_FSALLOC(f));
+            HDassert(H5F_addr_ge(mesg->addr, H5F_EOA_PRE_FSM_FSALLOC(f)));
+            if(H5MF_tidy_self_referential_fsm_hack(f, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "tidy of self referential fsm hack failed")
+        } /* end if */
+        else {
+            if(H5MF_xfree(f, H5FD_MEM_SUPER, dxpl_id, mesg->addr, mesg->size) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free file space for cache image block")
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__mdci_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__mdci_debug
+ *
+ * Purpose:     Prints debugging info.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/22/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__mdci_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_mdci_t   *mdci = (const H5O_mdci_t *) _mesg;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(mdci);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+              "Metadata Cache Image Block address:", mdci->addr);
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+              "Metadata Cache Image Block size in bytes:", mdci->size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__mdci_debug() */
+
diff --git a/src/H5Ochunk.c b/src/H5Ochunk.c
index bec6a99..dbc894c 100644
--- a/src/H5Ochunk.c
+++ b/src/H5Ochunk.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -111,19 +109,16 @@ H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx,
     if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
 
+    /* Increment reference count on object header */
+    if(H5O_inc_rc(oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "can't increment reference count on object header")
+
     /* 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)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, FAIL, "can't increment reference count on object header")
-
     /* 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")
@@ -132,8 +127,8 @@ H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx,
 
 done:
     if(ret_value < 0)
-        if(chk_proxy)
-            chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+        if(chk_proxy && H5O__chunk_dest(chk_proxy) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header chunk")
 
     FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_chunk_add() */
@@ -207,8 +202,8 @@ H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
 done:
     /* Cleanup on error */
     if(!ret_value)
-        if(0 == idx && chk_proxy)
-            chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+        if(0 == idx && chk_proxy && H5O__chunk_dest(chk_proxy) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header chunk")
 
     FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_chunk_protect() */
@@ -406,15 +401,8 @@ H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
     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 */
+    /* Only free file space if not doing SWMR writes */
+    if(!oh->swmr_write)
         cache_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
     /* Release the chunk proxy from the cache, marking it deleted */
@@ -425,3 +413,39 @@ done:
     FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_chunk_delete() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__chunk_dest
+ *
+ * Purpose:	Destroy a chunk proxy object
+ *
+ * Return:	Success: SUCCEED
+ *              Failure: FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O__chunk_dest(H5O_chunk_proxy_t *chk_proxy)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check arguments */
+    HDassert(chk_proxy);
+
+    /* Decrement reference count of object header */
+    if(chk_proxy->oh && H5O_dec_rc(chk_proxy->oh) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEC, FAIL, "can't decrement reference count on object header")
+
+    /* Release the chunk proxy object */
+    chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O__chunk_dest() */
+
diff --git a/src/H5Ocont.c b/src/H5Ocont.c
index 63002c5..b002a32 100644
--- a/src/H5Ocont.c
+++ b/src/H5Ocont.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c
index c69d2c7..597af63 100644
--- a/src/H5Ocopy.c
+++ b/src/H5Ocopy.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -277,7 +275,7 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
 done:
     if(loc_found && H5G_loc_free(&src_loc) < 0)
         HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
-    if(obj_open && H5O_close(&src_oloc) < 0)
+    if(obj_open && H5O_close(&src_oloc, NULL) < 0)
         HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, FAIL, "unable to release object header")
 
     FUNC_LEAVE_API(ret_value)
@@ -351,9 +349,9 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
 
     /* 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 */
 
@@ -381,7 +379,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     } /* end if */
 
     /* Get source object header */
-    if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve user data for particular type of object to copy */
@@ -463,12 +461,13 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     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)
+    if(oh_dst->swmr_write) {
+        /* Create virtual entry, for use as proxy */
+        if(NULL == (oh_dst->proxy = H5AC_proxy_entry_create()))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create object header proxy")
     } /* end if */
     else
-        oh_dst->proxy_addr = HADDR_UNDEF;
+        oh_dst->proxy = NULL;
 
     /* 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
@@ -867,6 +866,10 @@ 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 */
 
+    /* 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 metadata tag for destination object's object header */
     H5_BEGIN_TAG(dxpl_id, oloc_dst->addr, FAIL);
 
@@ -879,10 +882,6 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     /* 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);
@@ -901,7 +900,7 @@ done:
 
     /* Free destination object header on failure */
     if(ret_value < 0 && oh_dst && !inserted) {
-        if(H5O_free(oh_dst) < 0)
+        if(H5O__free(oh_dst) < 0)
             HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
         if(H5O_loc_reset(oloc_dst) < 0)
             HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
diff --git a/src/H5Odbg.c b/src/H5Odbg.c
index d9d4b8b..483c5fd 100644
--- a/src/H5Odbg.c
+++ b/src/H5Odbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -578,7 +576,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* debug */
diff --git a/src/H5Odrvinfo.c b/src/H5Odrvinfo.c
index 2fdf494..b9dea26 100644
--- a/src/H5Odrvinfo.c
+++ b/src/H5Odrvinfo.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index e51d319..a1c24b6 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Omodule.h"          /* This source code file is part of the H5O module */
@@ -311,7 +309,11 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags/*in,out*/, const uint8_t **p
                     if(version == H5O_DTYPE_VERSION_1) {
                         /* Decode the number of dimensions */
                         ndims = *(*pp)++;
-                        HDassert(ndims <= 4);
+
+                        /* Check that ndims is valid */
+                        if(ndims > 4)
+                            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "invalid number of dimensions for array")
+
                         *pp += 3;		/*reserved bytes */
 
                         /* Skip dimension permutation */
@@ -519,7 +521,8 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags/*in,out*/, const uint8_t **p
             dt->shared->u.array.ndims = *(*pp)++;
 
             /* Double-check the number of dimensions */
-            HDassert(dt->shared->u.array.ndims <= H5S_MAX_RANK);
+            if(dt->shared->u.array.ndims > H5S_MAX_RANK)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "too many dimensions for array datatype")
 
             /* Skip reserved bytes, if version has them */
             if(version < H5O_DTYPE_VERSION_3)
@@ -1441,9 +1444,10 @@ H5O_dtype_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
         dt->shared->state = H5T_STATE_NAMED;
 
         /* Set up the object location for the datatype also */
+        if(H5O_loc_reset(&(dt->oloc)) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to reset location")
         dt->oloc.file = sh->file;
-        dt->oloc.addr = sh->u.loc.oh_addr;;
-        dt->oloc.holding_file = FALSE;
+        dt->oloc.addr = sh->u.loc.oh_addr;
     } /* end if */
 
 done:
@@ -1606,18 +1610,22 @@ H5O_dtype_shared_post_copy_upd(const H5O_loc_t H5_ATTR_UNUSED *src_oloc,
     hid_t H5_ATTR_UNUSED dxpl_id, H5O_copy_t H5_ATTR_UNUSED *cpy_info)
 {
     H5T_t       *dt_dst = (H5T_t *)mesg_dst;    /* Destination datatype */
+    herr_t ret_value = SUCCEED;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_NOAPI_NOINIT
 
     if(dt_dst->sh_loc.type == H5O_SHARE_TYPE_COMMITTED) {
         HDassert(H5T_committed(dt_dst));
+        if(H5O_loc_reset(&(dt_dst->oloc)) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to reset location")
         dt_dst->oloc.file = dt_dst->sh_loc.file;
         dt_dst->oloc.addr = dt_dst->sh_loc.u.loc.oh_addr;
     } /* end if */
     else
         HDassert(!H5T_committed(dt_dst));
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O_dtype_shared_post_copy_upd */
 
 

@@ -1707,62 +1715,64 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
         case H5T_NO_CLASS:
         case H5T_NCLASSES:
         default:
-            sprintf(buf, "H5T_CLASS_%d", (int)(dt->shared->type));
+            HDsprintf(buf, "H5T_CLASS_%d", (int)(dt->shared->type));
             s = buf;
             break;
     } /* end switch */
-    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
 	    "Type class:",
 	    s);
 
-    fprintf(stream, "%*s%-*s %lu byte%s\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %lu byte%s\n", indent, "", fwidth,
 	    "Size:",
 	    (unsigned long)(dt->shared->size), 1 == dt->shared->size ? "" : "s");
 
-    fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 		"Version:", dt->shared->version);
 
     if (H5T_COMPOUND == dt->shared->type) {
-	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-		"Number of members:",
-		dt->shared->u.compnd.nmembs);
-	for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
-	    sprintf(buf, "Member %u:", i);
-	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		    buf,
-		    dt->shared->u.compnd.memb[i].name);
-	    fprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX(0, fwidth-3),
-		    "Byte offset:",
-		    (unsigned long)(dt->shared->u.compnd.memb[i].offset));
-	    H5O_dtype_debug(f, dxpl_id, dt->shared->u.compnd.memb[i].type, stream,
-			    indent + 3, MAX(0, fwidth - 3));
-	}
-    } else if(H5T_ENUM == dt->shared->type) {
-	fprintf(stream, "%*s%s\n", indent, "", "Base type:");
-	H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent+3, MAX(0, fwidth-3));
-	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-		"Number of members:",
-		dt->shared->u.enumer.nmembs);
-	for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
-	    sprintf(buf, "Member %u:", i);
-	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		    buf,
-		    dt->shared->u.enumer.name[i]);
-	    fprintf(stream, "%*s%-*s 0x", indent, "", fwidth,
-		    "Raw bytes of value:");
-	    for(k = 0; k < dt->shared->parent->shared->size; k++)
-		fprintf(stream, "%02x",
-			dt->shared->u.enumer.value[i*dt->shared->parent->shared->size + k]);
-	    fprintf(stream, "\n");
-	} /* end for */
-
-    } else if(H5T_OPAQUE == dt->shared->type) {
-	fprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth,
-		"Tag:", dt->shared->u.opaque.tag);
-    } else if(H5T_REFERENCE == dt->shared->type) {
-	fprintf(stream, "%*s%-*s\n", indent, "", fwidth,
-		"Fix dumping reference types!");
-    } else if(H5T_STRING == dt->shared->type) {
+        HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+		    "Number of members:",
+            dt->shared->u.compnd.nmembs);
+        for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
+            HDsprintf(buf, "Member %u:", i);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                buf,
+                dt->shared->u.compnd.memb[i].name);
+            HDfprintf(stream, "%*s%-*s %lu\n", indent+3, "", MAX(0, fwidth-3),
+                "Byte offset:",
+                (unsigned long)(dt->shared->u.compnd.memb[i].offset));
+            H5O_dtype_debug(f, dxpl_id, dt->shared->u.compnd.memb[i].type, stream,
+                    indent + 3, MAX(0, fwidth - 3));
+        } /* end for */
+    } /* end if */
+    else if(H5T_ENUM == dt->shared->type) {
+        HDfprintf(stream, "%*s%s\n", indent, "", "Base type:");
+        H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent+3, MAX(0, fwidth-3));
+        HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+            "Number of members:",
+            dt->shared->u.enumer.nmembs);
+        for(i = 0; i < dt->shared->u.enumer.nmembs; i++) {
+            HDsprintf(buf, "Member %u:", i);
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                buf,
+                dt->shared->u.enumer.name[i]);
+            HDfprintf(stream, "%*s%-*s 0x", indent, "", fwidth,
+                "Raw bytes of value:");
+            for(k = 0; k < dt->shared->parent->shared->size; k++)
+                HDfprintf(stream, "%02x", dt->shared->u.enumer.value[i*dt->shared->parent->shared->size + k]);
+            HDfprintf(stream, "\n");
+        } /* end for */
+    } /* end else if */
+    else if(H5T_OPAQUE == dt->shared->type) {
+        HDfprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth,
+            "Tag:", dt->shared->u.opaque.tag);
+    } /* end else if */
+    else if(H5T_REFERENCE == dt->shared->type) {
+        HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth,
+            "Fix dumping reference types!");
+    } /* end else if */
+    else if(H5T_STRING == dt->shared->type) {
         switch(dt->shared->u.atomic.u.s.cset) {
             case H5T_CSET_ASCII:
                 s = "ASCII";
@@ -1786,17 +1796,17 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             case H5T_CSET_RESERVED_13:
             case H5T_CSET_RESERVED_14:
             case H5T_CSET_RESERVED_15:
-                sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.cset));
+                HDsprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.cset));
                 s = buf;
                 break;
 
             case H5T_CSET_ERROR:
             default:
-                sprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.atomic.u.s.cset));
+                HDsprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.atomic.u.s.cset));
                 s = buf;
                 break;
         } /* end switch */
-        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                 "Character Set:",
                 s);
 
@@ -1826,20 +1836,21 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             case H5T_STR_RESERVED_13:
             case H5T_STR_RESERVED_14:
             case H5T_STR_RESERVED_15:
-                sprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.pad));
+                HDsprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.atomic.u.s.pad));
                 s = buf;
                 break;
 
             case H5T_STR_ERROR:
             default:
-                sprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.atomic.u.s.pad));
+                HDsprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.atomic.u.s.pad));
                 s = buf;
                 break;
         } /* end switch */
-        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                 "String Padding:",
                 s);
-    } else if(H5T_VLEN == dt->shared->type) {
+    } /* end else if */
+    else if(H5T_VLEN == dt->shared->type) {
         switch(dt->shared->u.vlen.type) {
             case H5T_VLEN_SEQUENCE:
                 s = "sequence";
@@ -1852,11 +1863,11 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             case H5T_VLEN_BADTYPE:
             case H5T_VLEN_MAXTYPE:
             default:
-                sprintf(buf, "H5T_VLEN_%d", dt->shared->u.vlen.type);
+                HDsprintf(buf, "H5T_VLEN_%d", dt->shared->u.vlen.type);
                 s = buf;
                 break;
         } /* end switch */
-        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                 "Vlen type:", s);
 
         switch(dt->shared->u.vlen.loc) {
@@ -1871,11 +1882,11 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             case H5T_LOC_BADLOC:
             case H5T_LOC_MAXLOC:
             default:
-                sprintf(buf, "H5T_LOC_%d", (int)dt->shared->u.vlen.loc);
+                HDsprintf(buf, "H5T_LOC_%d", (int)dt->shared->u.vlen.loc);
                 s = buf;
                 break;
         } /* end switch */
-        fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                 "Location:", s);
 
         /* Extra information for VL-strings */
@@ -1903,17 +1914,17 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
                 case H5T_CSET_RESERVED_13:
                 case H5T_CSET_RESERVED_14:
                 case H5T_CSET_RESERVED_15:
-                    sprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.vlen.cset));
+                    HDsprintf(buf, "H5T_CSET_RESERVED_%d", (int)(dt->shared->u.vlen.cset));
                     s = buf;
                     break;
 
                 case H5T_CSET_ERROR:
                 default:
-                    sprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.vlen.cset));
+                    HDsprintf(buf, "Unknown character set: %d", (int)(dt->shared->u.vlen.cset));
                     s = buf;
                     break;
             } /* end switch */
-            fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                     "Character Set:",
                     s);
 
@@ -1943,32 +1954,34 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
                 case H5T_STR_RESERVED_13:
                 case H5T_STR_RESERVED_14:
                 case H5T_STR_RESERVED_15:
-                    sprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.vlen.pad));
+                    HDsprintf(buf, "H5T_STR_RESERVED_%d", (int)(dt->shared->u.vlen.pad));
                     s = buf;
                     break;
 
                 case H5T_STR_ERROR:
                 default:
-                    sprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.vlen.pad));
+                    HDsprintf(buf, "Unknown string padding: %d", (int)(dt->shared->u.vlen.pad));
                     s = buf;
                     break;
             } /* end switch */
-            fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                     "String Padding:",
                     s);
         } /* end if */
-    } else if(H5T_ARRAY == dt->shared->type) {
-	fprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-		"Rank:",
-		dt->shared->u.array.ndims);
-        fprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:");
+    } /* end else if */
+    else if(H5T_ARRAY == dt->shared->type) {
+        HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+            "Rank:",
+            dt->shared->u.array.ndims);
+        HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Dim Size:");
         for(i = 0; i < dt->shared->u.array.ndims; i++)
-            fprintf(stream, "%s%u", (i ? ", " : ""), (unsigned)dt->shared->u.array.dim[i]);
-        fprintf(stream, "}\n");
-	fprintf(stream, "%*s%s\n", indent, "", "Base type:");
-	H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent + 3, MAX(0, fwidth - 3));
-    } else {
-	switch (dt->shared->u.atomic.order) {
+            HDfprintf(stream, "%s%u", (i ? ", " : ""), (unsigned)dt->shared->u.array.dim[i]);
+        HDfprintf(stream, "}\n");
+        HDfprintf(stream, "%*s%s\n", indent, "", "Base type:");
+        H5O_dtype_debug(f, dxpl_id, dt->shared->parent, stream, indent + 3, MAX(0, fwidth - 3));
+    } /* end else if */
+    else {
+        switch (dt->shared->u.atomic.order) {
             case H5T_ORDER_LE:
                 s = "little endian";
                 break;
@@ -1991,25 +2004,25 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
 
             case H5T_ORDER_ERROR:
             default:
-                sprintf(buf, "H5T_ORDER_%d", dt->shared->u.atomic.order);
+                HDsprintf(buf, "H5T_ORDER_%d", dt->shared->u.atomic.order);
                 s = buf;
                 break;
-	} /* end switch */
-	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		"Byte order:",
-		s);
-
-	fprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
-		"Precision:",
-		(unsigned long)(dt->shared->u.atomic.prec),
-		1==dt->shared->u.atomic.prec?"":"s");
-
-	fprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
-		"Offset:",
-		(unsigned long)(dt->shared->u.atomic.offset),
-		1==dt->shared->u.atomic.offset?"":"s");
-
-	switch (dt->shared->u.atomic.lsb_pad) {
+        } /* end switch */
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            "Byte order:",
+            s);
+
+        HDfprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
+            "Precision:",
+            (unsigned long)(dt->shared->u.atomic.prec),
+            1==dt->shared->u.atomic.prec?"":"s");
+
+        HDfprintf(stream, "%*s%-*s %lu bit%s\n", indent, "", fwidth,
+            "Offset:",
+            (unsigned long)(dt->shared->u.atomic.offset),
+            1==dt->shared->u.atomic.offset?"":"s");
+
+        switch (dt->shared->u.atomic.lsb_pad) {
             case H5T_PAD_ZERO:
                 s = "zero";
                 break;
@@ -2027,11 +2040,11 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             default:
                 s = "pad?";
                 break;
-	} /* end switch */
-	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		"Low pad type:", s);
+        } /* end switch */
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            "Low pad type:", s);
 
-	switch (dt->shared->u.atomic.msb_pad) {
+        switch (dt->shared->u.atomic.msb_pad) {
             case H5T_PAD_ZERO:
                 s = "zero";
                 break;
@@ -2049,12 +2062,12 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
             default:
                 s = "pad?";
                 break;
-	} /* end switch */
-	fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		"High pad type:", s);
+        } /* end switch */
+        HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            "High pad type:", s);
 
-	if (H5T_FLOAT == dt->shared->type) {
-	    switch (dt->shared->u.atomic.u.f.pad) {
+        if (H5T_FLOAT == dt->shared->type) {
+            switch (dt->shared->u.atomic.u.f.pad) {
                 case H5T_PAD_ZERO:
                     s = "zero";
                     break;
@@ -2071,16 +2084,16 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
                 case H5T_NPAD:
                 default:
                     if (dt->shared->u.atomic.u.f.pad < 0)
-                        sprintf(buf, "H5T_PAD_%d", -(dt->shared->u.atomic.u.f.pad));
+                        HDsprintf(buf, "H5T_PAD_%d", -(dt->shared->u.atomic.u.f.pad));
                     else
-                        sprintf(buf, "bit-%d", dt->shared->u.atomic.u.f.pad);
+                        HDsprintf(buf, "bit-%d", dt->shared->u.atomic.u.f.pad);
                     s = buf;
                     break;
-	    } /* end switch */
-	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		    "Internal pad type:", s);
+            } /* end switch */
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Internal pad type:", s);
 
-	    switch (dt->shared->u.atomic.u.f.norm) {
+            switch (dt->shared->u.atomic.u.f.norm) {
                 case H5T_NORM_IMPLIED:
                     s = "implied";
                     break;
@@ -2095,38 +2108,39 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
 
                 case H5T_NORM_ERROR:
                 default:
-                    sprintf(buf, "H5T_NORM_%d", (int) (dt->shared->u.atomic.u.f.norm));
+                    HDsprintf(buf, "H5T_NORM_%d", (int) (dt->shared->u.atomic.u.f.norm));
                     s = buf;
-	    } /* end switch */
-	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		    "Normalization:", s);
+            } /* end switch */
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Normalization:", s);
 
-	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
-		    "Sign bit location:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.sign));
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                "Sign bit location:",
+                (unsigned long) (dt->shared->u.atomic.u.f.sign));
 
-	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
-		    "Exponent location:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.epos));
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                "Exponent location:",
+                (unsigned long) (dt->shared->u.atomic.u.f.epos));
 
-	    fprintf(stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth,
-		    "Exponent bias:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.ebias));
+            HDfprintf(stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth,
+                "Exponent bias:",
+                (unsigned long) (dt->shared->u.atomic.u.f.ebias));
 
-	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
-		    "Exponent size:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.esize));
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                "Exponent size:",
+                (unsigned long) (dt->shared->u.atomic.u.f.esize));
 
-	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
-		    "Mantissa location:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.mpos));
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                "Mantissa location:",
+                (unsigned long) (dt->shared->u.atomic.u.f.mpos));
 
-	    fprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
-		    "Mantissa size:",
-		    (unsigned long) (dt->shared->u.atomic.u.f.msize));
+            HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
+                "Mantissa size:",
+                (unsigned long) (dt->shared->u.atomic.u.f.msize));
 
-	} else if (H5T_INTEGER == dt->shared->type) {
-	    switch (dt->shared->u.atomic.u.i.sign) {
+        } /* end if */
+        else if (H5T_INTEGER == dt->shared->type) {
+            switch (dt->shared->u.atomic.u.i.sign) {
                 case H5T_SGN_NONE:
                     s = "none";
                     break;
@@ -2138,14 +2152,14 @@ H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream,
                 case H5T_SGN_ERROR:
                 case H5T_NSGN:
                 default:
-                    sprintf(buf, "H5T_SGN_%d", (int) (dt->shared->u.atomic.u.i.sign));
+                    HDsprintf(buf, "H5T_SGN_%d", (int) (dt->shared->u.atomic.u.i.sign));
                     s = buf;
                     break;
-	    } /* end switch */
-	    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-		    "Sign scheme:", s);
-	}
-    }
+            } /* end switch */
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                "Sign scheme:", s);
+        } /* end else if */
+    } /* end else */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5O_dtype_debug() */
diff --git a/src/H5Oefl.c b/src/H5Oefl.c
index 149c8b2..0456b00 100644
--- a/src/H5Oefl.c
+++ b/src/H5Oefl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index 745d027..5419762 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
diff --git a/src/H5Oflush.c b/src/H5Oflush.c
index 3fdc365..2d93221 100644
--- a/src/H5Oflush.c
+++ b/src/H5Oflush.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -51,6 +49,7 @@ static herr_t H5O_oh_tag(const H5O_loc_t *oloc, hid_t dxpl_id, haddr_t *tag);
 /* Functions */
 /*************/
 
+
 

 /*-------------------------------------------------------------------------
  * Function:   H5Oflush
@@ -161,7 +160,7 @@ H5O_oh_tag(const H5O_loc_t *oloc, hid_t dxpl_id, haddr_t *tag)
     HDassert(oloc);
 
     /* Get object header for object */
-    if(NULL == (oh = H5O_protect(oloc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(oloc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
         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) */
@@ -199,7 +198,7 @@ H5Orefresh(hid_t oid)
     H5TRACE1("e", "i", oid);
 
     /* Check args */
-    if((oloc = H5O_get_loc(oid)) == NULL)
+    if(NULL == (oloc = H5O_get_loc(oid)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object")
 
     /* Private function */
@@ -234,37 +233,36 @@ done:
 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")
+    /* If the file is opened with write access, no need to perform refresh actions. */
+    if(!(H5F_INTENT(oloc.file) & H5F_ACC_RDWR)) {
+        H5G_loc_t obj_loc;
+        H5O_loc_t obj_oloc;
+        H5G_name_t obj_path;
+
+        /* 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")
+    } /* end if */
 
 done:
     if(objs_incr)
@@ -296,9 +294,9 @@ done:
 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;
+    haddr_t tag = 0;            /* Tag for object */
+    hbool_t corked = FALSE;     /* Whether object's metadata is corked */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
     
@@ -311,10 +309,9 @@ H5O_refresh_metadata_close(hid_t oid, H5O_loc_t oloc, H5G_loc_t *obj_loc, hid_t
     } /* end if */
 
     /* Get object's type */
-    if(H5I_get_type(oid) == H5I_DATASET) {
+    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)
@@ -364,8 +361,8 @@ 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;
+    H5I_type_t type;            /* Type of object for the ID */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -374,28 +371,24 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hid_t dxpl_id, hbool_
 
     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)
+	    if(!start_swmr) /* No need to handle multiple opens when H5Fstart_swmr_write() */
+		if(H5D_mult_refresh_reopen((H5D_t *)object, dxpl_id) < 0)
 		    HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to finish refresh for dataset")
-	    }
             break;
 
         case(H5I_UNINIT):
@@ -414,7 +407,6 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hid_t dxpl_id, hbool_
         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 */
diff --git a/src/H5Ofsinfo.c b/src/H5Ofsinfo.c
index 1712857..89dc8ee 100644
--- a/src/H5Ofsinfo.c
+++ b/src/H5Ofsinfo.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -19,16 +17,17 @@
  *                      Feb 2009
  *			Vailin Choi
  *
- * Purpose:             Free space manager info message.
+ * Purpose:             File space info message.
  *
  *-------------------------------------------------------------------------
  */
-
+#define H5F_FRIEND              /*suppress error about including H5Fpkg   */
 #include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
 
 #include "H5private.h"		/* Generic Functions	*/
 #include "H5Eprivate.h"		/* Error handling	*/
+#include "H5Fpkg.h"             /* File access          */
 #include "H5FLprivate.h"	/* Free lists          	*/
 #include "H5Opkg.h"             /* Object headers	*/
 
@@ -66,7 +65,8 @@ const H5O_msg_class_t H5O_MSG_FSINFO[1] = {{
 }};
 
 /* Current version of free-space manager info information */
-#define H5O_FSINFO_VERSION 	0
+#define H5O_FSINFO_VERSION_0 	0
+#define H5O_FSINFO_VERSION_1 	1
 
 /* Declare a free list to manage the H5O_fsinfo_t struct */
 H5FL_DEFINE_STATIC(H5O_fsinfo_t);
@@ -85,12 +85,13 @@ H5FL_DEFINE_STATIC(H5O_fsinfo_t);
  *-------------------------------------------------------------------------
  */
 static void *
-H5O_fsinfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+H5O_fsinfo_decode(H5F_t *f, hid_t 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 */
+    H5O_fsinfo_t    *fsinfo = NULL;     /* File space info message */
+    H5F_mem_page_t  ptype;              /* Memory type for iteration */
+    unsigned        vers;               /* message version */
+    void            *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -98,26 +99,83 @@ H5O_fsinfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
     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 */
+    for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+        fsinfo->fs_addr[ptype - 1] = HADDR_UNDEF;
 
-    /* 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 */
+    /* Version of message */
+    vers = *p++;
+
+    if(vers == H5O_FSINFO_VERSION_0) {
+        H5F_file_space_type_t strategy;     /* Strategy */
+        hsize_t threshold;                  /* Threshold */
+        H5FD_mem_t type;                    /* Memory type for iteration */
+
+        fsinfo->persist = H5F_FREE_SPACE_PERSIST_DEF;
+        fsinfo->threshold = H5F_FREE_SPACE_THRESHOLD_DEF;
+        fsinfo->page_size = H5F_FILE_SPACE_PAGE_SIZE_DEF;
+        fsinfo->pgend_meta_thres = H5F_FILE_SPACE_PGEND_META_THRES;
+        fsinfo->eoa_pre_fsm_fsalloc = HADDR_UNDEF;
+
+        strategy = (H5F_file_space_type_t)*p++; /* File space strategy */
+        H5F_DECODE_LENGTH(f, p, threshold);     /* Free-space section threshold */
+
+        /* Map version 0 (deprecated) to version 1 message */
+        switch(strategy) {
+
+            case H5F_FILE_SPACE_ALL_PERSIST:
+                fsinfo->strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+                fsinfo->persist = TRUE;
+                fsinfo->threshold = threshold;
+                if(HADDR_UNDEF == (fsinfo->eoa_pre_fsm_fsalloc = H5F_get_eoa(f, H5FD_MEM_DEFAULT)) )
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to get file size")
+                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]));
+                break;
+
+            case H5F_FILE_SPACE_ALL:
+                fsinfo->strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+                fsinfo->threshold = threshold;
+                break;
+
+            case H5F_FILE_SPACE_AGGR_VFD:
+                fsinfo->strategy = H5F_FSPACE_STRATEGY_AGGR;
+                break;
+
+            case H5F_FILE_SPACE_VFD:
+                fsinfo->strategy = H5F_FSPACE_STRATEGY_NONE;
+                break;
+
+            case H5F_FILE_SPACE_NTYPES:
+            case H5F_FILE_SPACE_DEFAULT:
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file space strategy")
+        } /* end switch */
+
+        fsinfo->mapped = TRUE;
+       
+    } else {
+        HDassert(vers == H5O_FSINFO_VERSION_1);
+
+        fsinfo->strategy = (H5F_fspace_strategy_t)*p++; /* File space strategy */
+        fsinfo->persist = *p++;                         /* Free-space persist or not */
+        H5F_DECODE_LENGTH(f, p, fsinfo->threshold);     /* Free-space section threshold */
+
+        H5F_DECODE_LENGTH(f, p, fsinfo->page_size); /* File space page size */
+        UINT16DECODE(p, fsinfo->pgend_meta_thres);  /* Page end metdata threshold */
+        H5F_addr_decode(f, &p, &(fsinfo->eoa_pre_fsm_fsalloc)); /* EOA before free-space header and section info */
+
+        /* Decode addresses of free space managers, if persisting */
+        if(fsinfo->persist) {
+            for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+                H5F_addr_decode(f, &p, &(fsinfo->fs_addr[ptype - 1]));
+        } /* end if */
+
+        fsinfo->mapped = FALSE;
+    }
 
     /* Set return value */
     ret_value = fsinfo;
@@ -145,7 +203,7 @@ 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 */
+    H5F_mem_page_t 	ptype;  /* Memory type for iteration */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -154,14 +212,20 @@ H5O_fsinfo_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, c
     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 */
+    *p++ = H5O_FSINFO_VERSION_1;	/* message version */
+    *p++ = fsinfo->strategy;	    /* File space strategy */
+    *p++ = (unsigned char)fsinfo->persist;	/* Free-space persist or not */
+    H5F_ENCODE_LENGTH(f, p, fsinfo->threshold); /* Free-space section size threshold */
+
+    H5F_ENCODE_LENGTH(f, p, fsinfo->page_size);	/* File space page size */
+    UINT16ENCODE(p, fsinfo->pgend_meta_thres);	/* Page end metadata threshold */
+    H5F_addr_encode(f, &p, fsinfo->eoa_pre_fsm_fsalloc);    /* EOA before free-space header and section info */
 
-    /* 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]);
+    /* Store addresses of free-space managers, if persisting */
+    if(fsinfo->persist) {
+        /* Addresses of free-space managers */
+        for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+            H5F_addr_encode(f, &p, fsinfo->fs_addr[ptype - 1]);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -224,19 +288,19 @@ 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 */
+    ret_value = 3                       /* Version, strategy & persist */
+		+ (size_t)H5F_SIZEOF_SIZE(f)    /* Free-space section threshold */
+		+ (size_t)H5F_SIZEOF_SIZE(f)    /* File space page size */
+		+ 2                             /* Page end meta threshold */
+		+ (size_t)H5F_SIZEOF_ADDR(f);
+    
+    /* Free-space manager addresses */
+    if(fsinfo->persist)
+        ret_value += (H5F_MEM_PAGE_NTYPES - 1) * (size_t)H5F_SIZEOF_ADDR(f);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O_fsinfo_size() */
@@ -282,7 +346,7 @@ H5O_fsinfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const vo
 	       int indent, int fwidth)
 {
     const H5O_fsinfo_t	*fsinfo = (const H5O_fsinfo_t *) _mesg;
-    H5FD_mem_t 		type;	/* Memory type for iteration */
+    H5F_mem_page_t  ptype;      /* Free-space types for iteration */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -293,16 +357,48 @@ H5O_fsinfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const vo
     HDassert(indent >= 0);
     HDassert(fwidth >= 0);
 
-    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-              "File space strategy:", fsinfo->strategy);
+    HDfprintf(stream, "%*s%-*s ", indent, "", fwidth, "File space strategy:");
+    switch(fsinfo->strategy) {
+        case H5F_FSPACE_STRATEGY_FSM_AGGR:
+            HDfprintf(stream, "%s\n", "H5F_FSPACE_STRATEGY_FSM_AGGR");
+            break;
+
+        case H5F_FSPACE_STRATEGY_PAGE:
+            HDfprintf(stream, "%s\n", "H5F_FSPACE_STRATEGY_PAGE");
+            break;
+
+        case H5F_FSPACE_STRATEGY_AGGR:
+            HDfprintf(stream, "%s\n", "H5F_FSPACE_STRATEGY_AGGR");
+            break;
+
+        case H5F_FSPACE_STRATEGY_NONE:
+            HDfprintf(stream, "%s\n", "H5F_FSPACE_STRATEGY_NONE");
+            break;
+
+        case H5F_FSPACE_STRATEGY_NTYPES:
+        default:
+            HDfprintf(stream, "%s\n", "unknown");
+    } /* end switch */
+
+    HDfprintf(stream, "%*s%-*s %t\n", indent, "", fwidth,
+              "Free-space persist:", fsinfo->persist);
 
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-              "Free space section threshold:", fsinfo->threshold);
+              "Free-space section threshold:", fsinfo->threshold);
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+              "File space page size:", fsinfo->page_size);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+              "Page end metadata threshold:", fsinfo->pgend_meta_thres);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+              "eoa_pre_fsm_fsalloc:", fsinfo->eoa_pre_fsm_fsalloc);
 
-    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]);
+    if(fsinfo->persist) {
+        for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                "Free space manager address:", fsinfo->fs_addr[ptype-1]);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
diff --git a/src/H5Oginfo.c b/src/H5Oginfo.c
index 9cd0dc1..468e07a 100644
--- a/src/H5Oginfo.c
+++ b/src/H5Oginfo.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index 31a60e3..838a80f 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
@@ -31,7 +29,6 @@
 #include "H5MMprivate.h"        /* Memory management                        */
 #include "H5Opkg.h"             /* Object headers                           */
 #include "H5Pprivate.h"         /* Property lists                           */
-#include "H5Sprivate.h"         /* Dataspaces                               */
 
 
 /* Local macros */
@@ -125,7 +122,7 @@ H5O__layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED
         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++;
diff --git a/src/H5Olinfo.c b/src/H5Olinfo.c
index 62e63d4..cac4ed1 100644
--- a/src/H5Olinfo.c
+++ b/src/H5Olinfo.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Olink.c b/src/H5Olink.c
index fd4ee88..77872ad 100644
--- a/src/H5Olink.c
+++ b/src/H5Olink.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Omessage.c b/src/H5Omessage.c
index d42896c..158701b 100644
--- a/src/H5Omessage.c
+++ b/src/H5Omessage.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -477,7 +475,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
 
     /* Call the "real" read routine */
@@ -803,7 +801,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Count the messages of the correct type */
@@ -885,7 +883,7 @@ H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     HDassert(type_id < NELMTS(H5O_msg_class_g));
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Call the "real" exists routine */
@@ -1225,7 +1223,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Call the "real" iterate routine */
@@ -1323,10 +1321,9 @@ done:
          *  object header, the header will be condensed after each
          *  message removal)
          */
-	if(oh_modified & H5O_MODIFY_CONDENSE) {
+	if(oh_modified & H5O_MODIFY_CONDENSE)
 	    if(H5O_condense_header(f, oh, dxpl_id) < 0)
 		HDONE_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't pack object header")
-	}
 
         /* Mark object header as changed */
         if(H5O_touch_oh(f, dxpl_id, oh, FALSE) < 0)
@@ -2256,77 +2253,18 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_msg_chunkno
+ * Function:	H5O_msg_get_flags
  *
- * Purpose:	Queries the object header chunk index for a message.
- *
- * Return:	Success:	>=0 value indicating the chunk number for
- *                              the message
- *		Failure:	<0
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Apr 22 2010
- *
- *-------------------------------------------------------------------------
- */
-int
-H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
-{
-    H5O_t *oh = NULL;                   /* Object header to use */
-    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 = -1;                 /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* check args */
-    HDassert(loc);
-    HDassert(loc->file);
-    HDassert(H5F_addr_defined(loc->addr));
-    HDassert(type_id < NELMTS(H5O_msg_class_g));
-    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
-    HDassert(type);
-
-    /* Get the object header */
-    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 */
-    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
-	if(type == idx_msg->type)
-            break;
-    if(idx == oh->nmesgs)
-        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
-
-    /* Set return value */
-    H5_CHECKED_ASSIGN(ret_value, int, idx_msg->chunkno, unsigned);
-
-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)
-} /* end H5O_msg_get_chunkno() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5O_msg_lock
- *
- * Purpose:	Locks a message into a particular chunk, preventing it from
- *              being moved into another chunk.
+ * Purpose:	Queries a message's message flags in the object header
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Apr 22 2010
+ * Programmer:	Vailin; Jan 2013
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5O_msg_lock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+H5O_msg_get_flags(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id, uint8_t *flags)
 {
     H5O_t *oh = NULL;                   /* Object header to use */
     const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
@@ -2345,85 +2283,23 @@ 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_ONLY_FLAG)))
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Locate message of correct type */
     for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
-	if(type == idx_msg->type)
+        if(type == idx_msg->type)
             break;
-    if(idx == oh->nmesgs)
-        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
-
-    /* Fail if the message is already locked */
-    if(idx_msg->locked)
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOCK, FAIL, "message already locked")
-
-    /* Make the message locked */
-    idx_msg->locked = TRUE;
-
-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)
-} /* end H5O_msg_lock() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5O_msg_unlock
- *
- * Purpose:	Unlocks a message, allowing it to be moved into another chunk.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Apr 22 2010
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_msg_unlock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
-{
-    H5O_t *oh = NULL;                   /* Object header to use */
-    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 */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* check args */
-    HDassert(loc);
-    HDassert(loc->file);
-    HDassert(H5F_addr_defined(loc->addr));
-    HDassert(type_id < NELMTS(H5O_msg_class_g));
-    type = H5O_msg_class_g[type_id];    /* map the type ID to the actual type object */
-    HDassert(type);
 
-    /* Get the object header */
-    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 */
-    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
-	if(type == idx_msg->type)
-            break;
     if(idx == oh->nmesgs)
         HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message type not found")
 
-    /* Fail if the message is not locked */
-    if(!idx_msg->locked)
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTUNLOCK, FAIL, "message not locked")
-
-    /* Make the message unlocked */
-    idx_msg->locked = FALSE;
+    /* Set return value */
+    *flags = idx_msg->flags;
 
 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")
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_msg_unlock() */
-
+} /* end H5O_msg_get_flags() */
diff --git a/src/H5Omodule.h b/src/H5Omodule.h
index a8f1301..df3ab56 100644
--- a/src/H5Omodule.h
+++ b/src/H5Omodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Omtime.c b/src/H5Omtime.c
index c61fa66..7e7baea 100644
--- a/src/H5Omtime.c
+++ b/src/H5Omtime.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:	Robb Matzke <matzke at llnl.gov>
diff --git a/src/H5Oname.c b/src/H5Oname.c
index 6c4f76f..6292883 100644
--- a/src/H5Oname.c
+++ b/src/H5Oname.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Onull.c b/src/H5Onull.c
index 258f695..5697455 100644
--- a/src/H5Onull.c
+++ b/src/H5Onull.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index 7473397..b0c67d1 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #if !(defined H5O_FRIEND || defined H5O_MODULE)
@@ -31,7 +29,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   26              /* # of types of messages            */
+#define H5O_MSG_TYPES   27              /* # of types of messages            */
 #define H5O_MAX_CRT_ORDER_IDX 65535     /* Max. creation order index value   */
 
 /* Versions of object header structure */
@@ -48,17 +46,6 @@
  *      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
@@ -212,6 +199,7 @@
                                                                               \
         /* Set the message's "shared info", if it's shareable */	      \
         if((MSG)->flags & H5O_MSG_FLAG_SHAREABLE) {                           \
+            HDassert(msg_type->share_flags & H5O_SHARE_IS_SHARABLE);          \
             H5O_UPDATE_SHARED((H5O_shared_t *)(MSG)->native, H5O_SHARE_TYPE_HERE, (F), msg_type->id, (MSG)->crt_idx, (OH)->chunk[0].addr) \
         } /* end if */                                                        \
                                                                               \
@@ -227,6 +215,12 @@
 #define H5O_SHARE_IS_SHARABLE   0x01
 #define H5O_SHARE_IN_OHDR       0x02
 
+/* Set the object header size to speculatively read in */
+/* (needs to be more than the object header prefix size to work at all and
+ *      should be larger than the largest object type's default object header
+ *      size to save the extra I/O operations) */
+#define H5O_SPEC_READ_SIZE 512
+
 
 /* The "message class" type */
 struct H5O_msg_class_t {
@@ -255,7 +249,6 @@ struct H5O_msg_class_t {
 struct H5O_mesg_t {
     const H5O_msg_class_t	*type;	/*type of message		     */
     hbool_t		dirty;		/*raw out of date wrt native	     */
-    hbool_t		locked;		/*message is locked into chunk	     */
     uint8_t		flags;		/*message flags			     */
     H5O_msg_crt_idx_t   crt_idx;        /*message creation index	     */
     unsigned		chunkno;	/*chunk number for this mesg	     */
@@ -264,11 +257,23 @@ struct H5O_mesg_t {
     size_t		raw_size;	/*size with alignment		     */
 };
 
+/* Struct for storing information about "best" message to move to new chunk */
+typedef struct H5O_msg_alloc_info_t {
+    int msgno;                      /* Index in message array */
+    unsigned id;		    /* Message type ID on disk */
+    unsigned chunkno;               /* Index in chunk array */
+    size_t gap_size;                /* Size of any "gap" in the chunk immediately after message */
+    size_t null_size;               /* Size of any null message in the chunk immediately after message */
+    size_t total_size;              /* Total size of "available" space around message */
+    unsigned null_msgno;            /* Message index of null message immediately after message */
+} H5O_msg_alloc_info_t;
+
 typedef struct H5O_chunk_t {
     haddr_t	addr;			/*chunk file address		     */
     size_t	size;			/*chunk size			     */
     size_t	gap;			/*space at end of chunk too small for null message */
     uint8_t	*image;			/*image of file			     */
+    struct H5O_chunk_proxy_t *chunk_proxy;    /* Pointer to a chunk's proxy when chunk protected */
 } H5O_chunk_t;
 
 struct H5O_t {
@@ -293,9 +298,6 @@ struct H5O_t {
 
     /* Chunk management information (not stored) */
     size_t      rc;                     /* Reference count of [continuation] chunks using this structure */
-    size_t      chunk0_size;            /* Size of serialized first chunk    */
-    hbool_t     mesgs_modified;         /* Whether any messages were modified when the object header was deserialized */
-    hbool_t     prefix_modified;        /* Whether prefix was modified when the object header was deserialized */
 
     /* Object information (stored) */
     hbool_t     has_refcount_msg;       /* Whether the object has a ref. count message */
@@ -324,10 +326,10 @@ struct H5O_t {
     size_t	nchunks;		/*number of chunks		     */
     size_t	alloc_nchunks;		/*chunks allocated		     */
     H5O_chunk_t *chunk;			/*array of chunks		     */
+    hbool_t     chunks_pinned;          /* Whether chunks are pinned from ohdr protect */
 
     /* 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) */
+    H5AC_proxy_entry_t *proxy;          /* Proxy cache entry for all ohdr entries */
 };
 
 /* Class for types of objects in file */
@@ -367,7 +369,6 @@ typedef struct H5O_common_cache_ud_t {
     hid_t dxpl_id;                      /* DXPL for operation */
     unsigned file_intent;               /* Read/write intent for file */
     unsigned merged_null_msgs;          /* Number of null messages merged together */
-    hbool_t mesgs_modified;             /* Whether any messages were modified when the object header was deserialized */
     H5O_cont_msgs_t *cont_msg_info;     /* Pointer to continuation messages to work on */
     haddr_t addr;                       /* Address of the prefix or chunk */
 } H5O_common_cache_ud_t;
@@ -376,9 +377,8 @@ 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
-					 */ 
+    size_t chunk0_size;                 /* Size of serialized first chunk    */
+    H5O_t *oh;                          /* Partially deserialized object header, for later use */
     H5O_common_cache_ud_t common;       /* Common object header cache callback info */
 } H5O_cache_ud_t;
 
@@ -394,27 +394,17 @@ typedef struct H5O_chunk_proxy_t {
 
     /* 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.
+     * The following field is used to store a pointer 
+     * to the in-core representation of the chunk proxy's flush dependency
+     * parent -- if it exists.  If it does not exist, this field will
+     * contain NULL.
      *
      * 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.
-                                         */
+    void *parent;                       /* Pointer to flush dependency parent */
 } H5O_chunk_proxy_t;
 
 /* Callback information for loading object header chunk from disk */
@@ -426,71 +416,6 @@ 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];
-
-/* H5O object header chunk inherits cache-like properties from H5AC */
-H5_DLLVAR const H5AC_class_t H5AC_OHDR_CHK[1];
 
 /* Header message ID to class mapping */
 H5_DLLVAR const H5O_msg_class_t *const H5O_msg_class_g[H5O_MSG_TYPES];
@@ -611,7 +536,10 @@ H5_DLLVAR const H5O_msg_class_t H5O_MSG_REFCOUNT[1];
 /* Free-space Manager Info message. (0x0017) */
 H5_DLLVAR const H5O_msg_class_t H5O_MSG_FSINFO[1];
 
-/* Placeholder for unknown message. (0x0018) */
+/* Metadata Cache Image message. (0x0018) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_MDCI[1];
+
+/* Placeholder for unknown message. (0x0019) */
 H5_DLLVAR const H5O_msg_class_t H5O_MSG_UNKNOWN[1];
 
 
@@ -638,7 +566,7 @@ H5_DLL const H5O_obj_class_t * H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id
 H5_DLL int H5O_link_oh(H5F_t *f, int adjust, hid_t dxpl_id, H5O_t *oh, hbool_t *deleted);
 H5_DLL herr_t H5O_inc_rc(H5O_t *oh);
 H5_DLL herr_t H5O_dec_rc(H5O_t *oh);
-H5_DLL herr_t H5O_free(H5O_t *oh);
+H5_DLL herr_t H5O__free(H5O_t *oh);
 
 /* Object header message routines */
 H5_DLL herr_t H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
@@ -671,6 +599,7 @@ H5_DLL herr_t H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id,
 H5_DLL herr_t H5O_chunk_update_idx(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
 H5_DLL herr_t H5O_chunk_resize(H5O_t *oh, H5O_chunk_proxy_t *chk_proxy);
 H5_DLL herr_t H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
+H5_DLL herr_t H5O__chunk_dest(H5O_chunk_proxy_t *chunk_proxy);
 
 /* Collect storage info for btree and heap */
 H5_DLL herr_t H5O_attr_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
@@ -678,6 +607,8 @@ H5_DLL herr_t H5O_attr_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
 
 /* Object header allocation routines */
 H5_DLL herr_t H5O_alloc_msgs(H5O_t *oh, size_t min_alloc);
+H5_DLL herr_t H5O__alloc_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size,
+    size_t found_null, const H5O_msg_alloc_info_t *found_msg, size_t *new_idx);
 H5_DLL herr_t  H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     const H5O_msg_class_t *type, const void *mesg, size_t *mesg_idx);
 H5_DLL herr_t H5O_condense_header(H5F_t *f, H5O_t *oh, hid_t dxpl_id);
@@ -711,13 +642,6 @@ 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);
 
-/* 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
 H5_DLL htri_t H5O_is_attr_empty_test(hid_t oid);
@@ -727,6 +651,9 @@ H5_DLL herr_t H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *
 H5_DLL herr_t H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val);
 H5_DLL herr_t H5O_expunge_chunks_test(const H5O_loc_t *oloc, hid_t dxpl_id);
 H5_DLL herr_t H5O_get_rc(const H5O_loc_t *oloc, hid_t dxpl_id, unsigned *rc);
+H5_DLL herr_t H5O_msg_get_chunkno_test(hid_t oid, unsigned msg_type,
+    unsigned *chunk_num);
+H5_DLL herr_t H5O_msg_move_to_new_chunk_test(hid_t oid, unsigned msg_type);
 #endif /* H5O_TESTING */
 
 /* Object header debugging routines */
diff --git a/src/H5Opline.c b/src/H5Opline.c
index 95a82b5..2e52dbb 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 956c00d..0f798b2 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -47,7 +45,6 @@
 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
@@ -70,6 +67,7 @@ typedef struct H5O_proxy_t H5O_proxy_t;
 #define H5O_FIRST	(-2)		/* Operate on first message of type  */
 
 /* Flags needed when encoding messages */
+#define H5O_MSG_NO_FLAGS_SET	0x00u
 #define H5O_MSG_FLAG_CONSTANT	0x01u
 #define H5O_MSG_FLAG_SHARED	0x02u
 #define H5O_MSG_FLAG_DONTSHARE	0x04u
@@ -100,7 +98,7 @@ typedef struct H5O_proxy_t H5O_proxy_t;
 #define H5O_BOGUS_MSG_FLAGS_NAME        "bogus msg flags"       /* Flags for 'bogus' message */
 #define H5O_BOGUS_MSG_FLAGS_SIZE        sizeof(uint8_t)
 
-/* bogus ID can be either (a) H5O_BOGUS_VALID_ID 0x0009 or (b) H5O_BOGUS_INVALID_ID 0x0019 */
+/* bogus ID can be either (a) H5O_BOGUS_VALID_ID or (b) H5O_BOGUS_INVALID_ID */
 #define H5O_BOGUS_MSG_ID_NAME        "bogus msg id" 		/* ID for 'bogus' message */
 #define H5O_BOGUS_MSG_ID_SIZE        sizeof(unsigned)
 
@@ -204,10 +202,19 @@ 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_FSINFO_ID   0x0017          /* Free-space manager info message.  */
-#define H5O_UNKNOWN_ID  0x0018          /* Placeholder message ID for unknown message.  */
+#define H5O_FSINFO_ID   0x0017          /* File space info message.  */
+#define H5O_MDCI_MSG_ID 0x0018		/* Metadata Cache Image Message */
+#define H5O_UNKNOWN_ID  0x0019          /* Placeholder message ID for unknown message.  */
                                         /* (this should never exist in a file) */
-#define H5O_BOGUS_INVALID_ID	0x0019  /* "Bogus invalid" Message.  */
+/* 
+ * Note: Must increment H5O_MSG_TYPES in H5Opkg.h and update H5O_msg_class_g
+ *      in H5O.c when creating a new message type.  Also bump the value of
+ *      H5O_BOGUS_INVALID_ID, below, to be one greater than the value of
+ *      H5O_UNKNOWN_ID.
+ *
+ * (this should never exist in a file)
+ */
+#define H5O_BOGUS_INVALID_ID	0x001A  /* "Bogus invalid" Message.  */
 
 /* Shared object message types.
  * Shared objects can be committed, in which case the shared message contains
@@ -350,7 +357,7 @@ typedef struct H5O_link_t {
 typedef struct H5O_efl_entry_t {
     size_t	name_offset;		/*offset of name within heap	     */
     char	*name;			/*malloc'd name			     */
-    off_t	offset;			/*offset of data within file	     */
+    HDoff_t	offset;			/*offset of data within file	     */
     hsize_t	size;			/*size allocated within file	     */
 } H5O_efl_entry_t;
 
@@ -455,10 +462,10 @@ typedef struct H5O_storage_chunk_t {
     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_bt2_t btree2;    /* Information for v2 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 */
+        H5O_storage_chunk_single_filt_t single; /* Information for single chunk w/ filters index */
     } u;
 } H5O_storage_chunk_t;
 
@@ -575,6 +582,7 @@ typedef struct H5O_layout_chunk_earray_t {
     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 */
+    hsize_t     swizzled_max_down_chunks[H5O_LAYOUT_NDIMS]; /* swizzled max "down" size of number of chunks in each dimension */
 } H5O_layout_chunk_earray_t;
 
 typedef struct H5O_layout_chunk_bt2_t {
@@ -776,17 +784,34 @@ 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.
+ * File space 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 */
+    H5F_fspace_strategy_t   strategy;       /* File space strategy */
+    hbool_t persist;                        /* Persisting free-space or not */
+    hsize_t threshold;                      /* Free-space section threshold */
+    hsize_t page_size;                      /* For paged aggregation: file space page size */
+    size_t pgend_meta_thres;                /* For paged aggregation: page end metadata threshold */
+    haddr_t eoa_pre_fsm_fsalloc;            /* For paged aggregation: the eoa before free-space headers & sinfo */
+    haddr_t fs_addr[H5F_MEM_PAGE_NTYPES - 1];   /* 13 addresses of free-space managers */
+                                                /* For non-paged aggregation: only 6 addresses are used */
+    hbool_t mapped;                             /* Not stored */
+                                                /* Indicate the message is mapped from version 0 to version 1 */
 } H5O_fsinfo_t;
 
+/*
+ * Metadata Cache Image Message.
+ * Contains base address and length of the metadata cache image.
+ * (Data structure in memory)
+ */
+typedef struct H5O_mdci_t {
+    haddr_t	addr;			/* address of MDC image block */
+    hsize_t	size;			/* size of MDC image block    */
+} H5O_mdci_t;
+
 /* Typedef for "application" iteration operations */
 typedef herr_t (*H5O_operator_t)(const void *mesg/*in*/, unsigned idx,
     void *operator_data/*in,out*/);
@@ -828,9 +853,10 @@ H5_DLL herr_t H5O_init(void);
 H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint,
     size_t initial_rc, hid_t ocpl_id, H5O_loc_t *loc/*out*/);
 H5_DLL herr_t H5O_open(H5O_loc_t *loc);
-H5_DLL herr_t H5O_close(H5O_loc_t *loc);
+H5_DLL herr_t H5O_close(H5O_loc_t *loc, hbool_t *file_closed/*out*/);
 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, unsigned prot_flags);
+H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id,
+    unsigned prot_flags, hbool_t pin_all_chunks);
 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);
@@ -853,10 +879,7 @@ 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);
+H5_DLL H5AC_proxy_entry_t *H5O_get_proxy(const H5O_t *oh);
 
 /* Object header message routines */
 H5_DLL herr_t H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags,
@@ -903,9 +926,7 @@ H5_DLL void* H5O_msg_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     unsigned type_id, const unsigned char *buf);
 H5_DLL herr_t H5O_msg_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     unsigned type_id, void *mesg);
-H5_DLL int H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
-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);
+H5_DLL herr_t H5O_msg_get_flags(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id, uint8_t *flags);
 
 /* Object metadata flush/refresh routines */
 H5_DLL herr_t H5O_flush_common(H5O_loc_t *oloc, hid_t obj_id, hid_t dxpl_id);
diff --git a/src/H5Oproxy.c b/src/H5Oproxy.c
deleted file mode 100644
index a06f50a..0000000
--- a/src/H5Oproxy.c
+++ /dev/null
@@ -1,900 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*-------------------------------------------------------------------------
- *
- * 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__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__proxy_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty);
-static herr_t H5O__proxy_image_len(const void *thing, size_t *image_len, hbool_t *compressed_ptr,
-    size_t *compressed_image_len_ptr);
-static herr_t H5O__proxy_serialize(const H5F_t *f, void *image, size_t len, void *thing);
-static herr_t H5O__proxy_notify(H5AC_notify_action_t action, void *thing);
-static herr_t H5O__proxy_free_icr(void *thing);
-
-/* Helper routines */
-static herr_t H5O__proxy_depend_core(void *parent, H5O_proxy_t *proxy);
-static herr_t H5O__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__proxy_get_load_size,    	/* 'get_load_size' callback */
-    NULL,				/* 'verify_chksum' callback */
-    H5O__proxy_deserialize,    		/* 'deserialize' callback */
-    H5O__proxy_image_len,      		/* 'image_len' callback */
-    NULL,                               /* 'pre_serialize' callback */
-    H5O__proxy_serialize,       	/* 'serialize' callback */
-    H5O__proxy_notify,			/* 'notify' callback */
-    H5O__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__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__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_proxy_size) */
-	*image_len = 1;
-    }
-    /* Nothing to do for non-NULL image: no need to compute actual_len */
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O__proxy_get_load_size() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5O__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__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__proxy_dest(proxy) < 0)
-            HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, NULL, "unable to destroy object header proxy")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O__proxy_deserialize() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5O__proxy_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__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_proxy_size) */
-    *image_len = 1;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O__proxy_image_len() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5O__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__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__proxy_serialize() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5O__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__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 u;                         	/* Local index variable */
-    herr_t ret_value = SUCCEED;         	/* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /*
-     * 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(u = 1; u < proxy->oh->nchunks; u++) {
-                if(NULL == (chk_proxy = H5O_chunk_protect(proxy->f, H5AC_ind_read_dxpl_id, proxy->oh, u)))
-                    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_read_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) {
-		u = proxy->chk_fd_parent_count - 1;
-
-	        if(H5O__proxy_undepend_core(proxy->chk_fd_parent_ptrs[u], proxy)<0)
-                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency with object header continuation chunk")
-	    } /* end while */
-
-            /* 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_read_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__proxy_notify() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5O__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__proxy_free_icr(void *_thing)
-{
-    H5O_proxy_t *proxy = (H5O_proxy_t *)_thing;
-    herr_t ret_value = SUCCEED;     		/* Return value */
-
-    FUNC_ENTER_STATIC
-
-    if(H5O__proxy_dest(proxy) < 0)
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header proxy")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O__proxy_free_icr() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5O_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__proxy_dest(H5O_proxy_t *proxy)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_STATIC_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__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_PACKAGE
-
-    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_PACKAGE
-
-    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_PACKAGE
-
-    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_PACKAGE
-
-    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));
-
-    /* Protect the object header proxy */
-    udata.f = f;
-    udata.oh  = oh;
-    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 && 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")
-
-    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_STATIC
-
-    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_PACKAGE
-
-    /* Sanity checks */
-    HDassert(f);
-    HDassert(oh);
-    HDassert(H5F_addr_defined(oh->proxy_addr));
-    HDassert(parent);
-
-    /* Protect the object header proxy */
-    udata.f = f;
-    udata.oh  = oh;
-    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 && 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");
-
-    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 u;                         /* Local index variable */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    HDassert(parent);
-
-#ifndef NDEBUG
-    /* 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);
-    } /* end if */
-    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(u = 0; u < proxy->chk_fd_parent_count; u++)
-            if(proxy->chk_fd_parent_ptrs[u] == parent) {
-		found = TRUE;
-                break;
-            } /* end if */
-
-	HDassert(found);
-	HDassert(proxy->chk_fd_parent_addrs[u] == (((H5C_cache_entry_t *)(parent))->addr));
-    } /* end else */
-#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;
-    } /* end if */
-    else {
-	/* Find parent in parent ptrs array */
-	for(u = 0; u < proxy->chk_fd_parent_count; u++)
-            if(proxy->chk_fd_parent_ptrs[u] == parent)
-                break;
-        if(u == 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(u < proxy->chk_fd_parent_count - 1) {
-            HDmemmove(&proxy->chk_fd_parent_addrs[u],
-                      &proxy->chk_fd_parent_addrs[u + 1],
-                      (proxy->chk_fd_parent_count - u - 1) * sizeof(proxy->chk_fd_parent_addrs[0]));
-
-            HDmemmove(&proxy->chk_fd_parent_ptrs[u],
-                      &proxy->chk_fd_parent_ptrs[u + 1],
-                      (proxy->chk_fd_parent_count - u - 1) * sizeof(proxy->chk_fd_parent_ptrs[0]));
-	} /* end if */
-
-    	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;
-        }  /* end if */
-        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 */
-    } /* end else */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O__proxy_undepend_core() */
-
diff --git a/src/H5Opublic.h b/src/H5Opublic.h
index dec7b5b..8d6dda4 100644
--- a/src/H5Opublic.h
+++ b/src/H5Opublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Orefcount.c b/src/H5Orefcount.c
index ff7dfee..af68417 100644
--- a/src/H5Orefcount.c
+++ b/src/H5Orefcount.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index 28021de..3fe5652 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Omodule.h"          /* This source code file is part of the H5O module */
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index 25baa88..db2d0cc 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Oshared.h b/src/H5Oshared.h
index e8d620a..2465e65 100644
--- a/src/H5Oshared.h
+++ b/src/H5Oshared.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Oshmesg.c b/src/H5Oshmesg.c
index a506ce2..1cbfb05 100644
--- a/src/H5Oshmesg.c
+++ b/src/H5Oshmesg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
diff --git a/src/H5Ostab.c b/src/H5Ostab.c
index bb39e58..5c840a6 100644
--- a/src/H5Ostab.c
+++ b/src/H5Ostab.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Otest.c b/src/H5Otest.c
index c3e487d..f0deade 100644
--- a/src/H5Otest.c
+++ b/src/H5Otest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
@@ -108,7 +106,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_read_dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -173,7 +171,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_read_dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -266,7 +264,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_read_dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -361,7 +359,7 @@ H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count)
     H5_BEGIN_TAG(H5AC_ind_read_dxpl_id, loc->addr, FAIL);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -452,7 +450,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_read_dxpl_id, H5AC__READ_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Locate "unknown" message  */
@@ -511,7 +509,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__NO_FLAGS_SET)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Safety check */
@@ -571,7 +569,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_ONLY_FLAG)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Save the refcount for the object header */
@@ -585,3 +583,165 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5O_expunge_chunks_test() */
 
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_msg_get_chunkno_test
+ PURPOSE
+    Retrieve the chunk number for an object header message of a given type.
+ USAGE
+    herr_t H5O_check_msg_marked_test(oid, chunk_num)
+        hid_t oid;              IN: Object to check
+        unsigned msg_type;      IN: Object header message type to check
+        unsigned *chunk_num;    OUT: Object header chunk that the message is in
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Retrieves the chunk number for the first object header message of a given
+    type found in an object's header.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_msg_get_chunkno_test(hid_t oid, unsigned msg_type, unsigned *chunk_num)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5O_loc_t *loc;            /* Pointer to object's location */
+    H5O_mesg_t *idx_msg;        /* Pointer to message */
+    unsigned idx;               /* Index of message */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Locate first message of given type */
+    for(idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++)
+	if(idx_msg->type->id == msg_type) {
+            /* Set the chunk number for the message */
+            *chunk_num = idx_msg->chunkno;
+
+            /* Break out of loop, to indicate that the message was found */
+            break;
+        } /* end if */
+
+    /* Check for not finding a message of the given type*/
+    if(idx == oh->nmesgs)
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "message of type not found")
+
+done:
+    if(oh && H5O_unprotect(loc, H5AC_ind_read_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)
+}   /* H5O_msg_get_chunkno_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5O_msg_move_to_new_chunk_test
+ PURPOSE
+    Move a message into a new chunk
+ USAGE
+    herr_t H5O_msg_move_to_new_chunk_test(oid, msg_type)
+        hid_t oid;              IN: Object to check
+        unsigned msg_type;      IN: Object header message type to check
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Moves the first message of the given type to a new object header chunk.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5O_msg_move_to_new_chunk_test(hid_t oid, unsigned msg_type)
+{
+    H5O_t *oh = NULL;           /* Object header */
+    H5O_loc_t *loc;             /* Pointer to object's location */
+    H5O_mesg_t *curr_msg;       /* Pointer to current message */
+    unsigned idx;               /* Index of message */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object location for object */
+    if(NULL == (loc = H5O_get_loc(oid)))
+        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+
+    /* Get the object header */
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_read_dxpl_id, H5AC__NO_FLAGS_SET, FALSE)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+
+    /* Locate first message of given type */
+    for(idx = 0, curr_msg = &oh->mesg[0]; idx < oh->nmesgs; idx++, curr_msg++)
+	if(curr_msg->type->id == msg_type) {
+            H5O_msg_alloc_info_t found_msg;     /* Information about message to move */
+            unsigned msg_chunkno = curr_msg->chunkno;         /* Chunk that the message is in */
+            uint8_t *end_chunk_data = (oh->chunk[msg_chunkno].image + oh->chunk[msg_chunkno].size) - (H5O_SIZEOF_CHKSUM_OH(oh) + oh->chunk[msg_chunkno].gap);     /* End of message data in chunk */
+            uint8_t *end_msg = curr_msg->raw + curr_msg->raw_size;  /* End of current message */
+            size_t gap_size = 0;            /* Size of gap after current message */
+            size_t null_size = 0;           /* Size of NULL message after current message */
+            unsigned null_msgno = 0;        /* Index of NULL message after current message */
+            size_t total_size;              /* Total size of available space "around" current message */
+            size_t new_idx;                 /* Index of new null message */
+
+            /* Check if the message is the last one in the chunk */
+            if(end_msg == end_chunk_data)
+                gap_size = oh->chunk[msg_chunkno].gap;
+            else {
+                H5O_mesg_t *tmp_msg;    /* Temp. pointer to message to operate on */
+                unsigned v;             /* Local index variable */
+
+                /* Check for null message after this message, in same chunk */
+                for(v = 0, tmp_msg = &oh->mesg[0]; v < oh->nmesgs; v++, tmp_msg++) {
+                    if(tmp_msg->type->id == H5O_NULL_ID && (tmp_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh)) == end_msg) {
+                        null_msgno = v;
+                        null_size = (size_t)H5O_SIZEOF_MSGHDR_OH(oh) + tmp_msg->raw_size;
+                        break;
+                    } /* end if */
+
+                    /* XXX: Should also check for NULL message in front of current message... */
+
+                } /* end for */
+            } /* end else */
+
+            /* Add up current message's total available space */
+            total_size = curr_msg->raw_size + gap_size + null_size;
+
+            /* Set up "found message" info for moving the message */
+            found_msg.msgno = (int)idx;
+            found_msg.id = curr_msg->type->id;
+            found_msg.chunkno = msg_chunkno;
+            found_msg.gap_size = gap_size;
+            found_msg.null_size = null_size;
+            found_msg.total_size = total_size;
+            found_msg.null_msgno = null_msgno;
+
+            /* Allocate and initialize new chunk in the file, moving the found message */
+            /* (*new_idx returned from this routine is unused here) */
+            if(H5O__alloc_chunk(loc->file, H5AC_ind_read_dxpl_id, oh, 40, oh->nmesgs, &found_msg, &new_idx) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, FAIL, "can't allocate new object header chunk")
+
+            /* Break out of loop, the message was found */
+            break;
+        } /* end if */
+
+done:
+    if(oh && H5O_unprotect(loc, H5AC_ind_read_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)
+}   /* H5O_msg_get_chunkno_test() */
+
diff --git a/src/H5Ounknown.c b/src/H5Ounknown.c
index 546e839..1b3a997 100644
--- a/src/H5Ounknown.c
+++ b/src/H5Ounknown.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5P.c b/src/H5P.c
index f075b92..49bea0a 100644
--- a/src/H5P.c
+++ b/src/H5P.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -665,10 +663,10 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 herr_t
-H5Pset(hid_t plist_id, const char *name, void *value)
+H5Pset(hid_t plist_id, const char *name, const void *value)
 {
     H5P_genplist_t *plist;      /* Property list to modify */
-    herr_t ret_value=SUCCEED;   /* return value */
+    herr_t ret_value = SUCCEED; /* return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "i*s*x", plist_id, name, value);
@@ -678,11 +676,11 @@ H5Pset(hid_t plist_id, const char *name, void *value)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
     if(!name || !*name)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
-    if(value==NULL)
+    if(value == NULL)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalied property value");
 
     /* Go set the value */
-    if(H5P_set(plist,name,value) < 0)
+    if(H5P_set(plist, name, value) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to set value in plist");
 
 done:
diff --git a/src/H5PB.c b/src/H5PB.c
new file mode 100644
index 0000000..52576f8
--- /dev/null
+++ b/src/H5PB.c
@@ -0,0 +1,1537 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5PB.c
+ *
+ * Purpose:             Page Buffer routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5PBmodule.h"         /* This source code file is part of the H5PB module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5PBpkg.h"            /* File access				*/
+#include "H5SLprivate.h"	/* Skip List				*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+#define H5PB__PREPEND(page_ptr, head_ptr, tail_ptr, len) {              \
+        if((head_ptr) == NULL) {                                        \
+            (head_ptr) = (page_ptr);                                    \
+            (tail_ptr) = (page_ptr);                                    \
+        } /* end if */                                                  \
+        else {                                                          \
+            (head_ptr)->prev = (page_ptr);                              \
+            (page_ptr)->next = (head_ptr);                              \
+            (head_ptr) = (page_ptr);                                    \
+        } /* end else */                                                \
+        (len)++;                                                        \
+} /* H5PB__PREPEND() */
+
+#define H5PB__REMOVE(page_ptr, head_ptr, tail_ptr, len) {               \
+        if((head_ptr) == (page_ptr)) {                                  \
+            (head_ptr) = (page_ptr)->next;                              \
+            if((head_ptr) != NULL)                                      \
+                (head_ptr)->prev = NULL;                                \
+        } /* end if */                                                  \
+        else                                                            \
+            (page_ptr)->prev->next = (page_ptr)->next;                  \
+        if((tail_ptr) == (page_ptr)) {                                  \
+            (tail_ptr) = (page_ptr)->prev;                              \
+            if((tail_ptr) != NULL)                                      \
+                (tail_ptr)->next = NULL;                                \
+        } /* end if */                                                  \
+        else                                                            \
+            (page_ptr)->next->prev = (page_ptr)->prev;                  \
+        page_ptr->next = NULL;                                          \
+        page_ptr->prev = NULL;                                          \
+        (len)--;                                                        \
+}
+
+#define H5PB__INSERT_LRU(page_buf, page_ptr) {                          \
+        HDassert(page_buf);                                             \
+        HDassert(page_ptr);                                             \
+        /* insert the entry at the head of the list. */                 \
+        H5PB__PREPEND((page_ptr), (page_buf)->LRU_head_ptr,             \
+                      (page_buf)->LRU_tail_ptr, (page_buf)->LRU_list_len) \
+}
+
+#define H5PB__REMOVE_LRU(page_buf, page_ptr) {                          \
+        HDassert(page_buf);                                             \
+        HDassert(page_ptr);                                             \
+        /* remove the entry from the list. */                           \
+        H5PB__REMOVE((page_ptr), (page_buf)->LRU_head_ptr,              \
+                     (page_buf)->LRU_tail_ptr, (page_buf)->LRU_list_len) \
+}
+
+#define H5PB__MOVE_TO_TOP_LRU(page_buf, page_ptr) {                     \
+        HDassert(page_buf);                                             \
+        HDassert(page_ptr);                                             \
+        /* Remove entry and insert at the head of the list. */          \
+        H5PB__REMOVE((page_ptr), (page_buf)->LRU_head_ptr,              \
+                     (page_buf)->LRU_tail_ptr, (page_buf)->LRU_list_len) \
+        H5PB__PREPEND((page_ptr), (page_buf)->LRU_head_ptr,             \
+                       (page_buf)->LRU_tail_ptr, (page_buf)->LRU_list_len) \
+}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Iteration context for destroying page buffer */
+typedef struct {
+    H5PB_t *page_buf;
+    hbool_t actual_slist;
+} H5PB_ud1_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5PB__insert_entry(H5PB_t *page_buf, H5PB_entry_t *page_entry);
+static htri_t H5PB__make_space(const H5F_io_info2_t *fio_info, H5PB_t *page_buf, H5FD_mem_t inserted_type);
+static herr_t H5PB__write_entry(const H5F_io_info2_t *fio_info, H5PB_entry_t *page_entry);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+/* Declare a free list to manage the H5PB_t struct */
+H5FL_DEFINE_STATIC(H5PB_t);
+
+/* Declare a free list to manage the H5PB_entry_t struct */
+H5FL_DEFINE_STATIC(H5PB_entry_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_reset_stats
+ *
+ * Purpose:     This function was created without documentation.
+ *              What follows is my best understanding of Mohamad's intent.
+ *
+ *              Reset statistics collected for the page buffer layer.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5PB_reset_stats(H5PB_t *page_buf)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(page_buf);
+
+    page_buf->accesses[0] = 0;
+    page_buf->accesses[1] = 0;
+    page_buf->hits[0] = 0;
+    page_buf->hits[1] = 0;
+    page_buf->misses[0] = 0;
+    page_buf->misses[1] = 0;
+    page_buf->evictions[0] = 0;
+    page_buf->evictions[1] = 0;
+    page_buf->bypasses[0] = 0;
+    page_buf->bypasses[1] = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}  /* H5PB_reset_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_get_stats
+ *
+ * Purpose:     This function was created without documentation.
+ *              What follows is my best understanding of Mohamad's intent.
+ *
+ *              Retrieve statistics collected about page accesses for the page buffer layer.
+ *              --accesses: the number of metadata and raw data accesses to the page buffer layer
+ *              --hits: the number of metadata and raw data hits in the page buffer layer
+ *              --misses: the number of metadata and raw data misses in the page buffer layer
+ *              --evictions: the number of metadata and raw data evictions from the page buffer layer
+ *              --bypasses: the number of metadata and raw data accesses that bypass the page buffer layer
+ *
+ * Return:	    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5PB_get_stats(const H5PB_t *page_buf, unsigned accesses[2], unsigned hits[2],
+    unsigned misses[2], unsigned evictions[2], unsigned bypasses[2])
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(page_buf);
+
+    accesses[0] = page_buf->accesses[0];
+    accesses[1] = page_buf->accesses[1];
+    hits[0] = page_buf->hits[0];
+    hits[1] = page_buf->hits[1];
+    misses[0] = page_buf->misses[0];
+    misses[1] = page_buf->misses[1];
+    evictions[0] = page_buf->evictions[0];
+    evictions[1] = page_buf->evictions[1];
+    bypasses[0] = page_buf->bypasses[0];
+    bypasses[1] = page_buf->bypasses[1];
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+}  /* H5PB_get_stats */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_print_stats()
+ *
+ * Purpose:     This function was created without documentation.
+ *              What follows is my best understanding of Mohamad's intent.
+ *
+ *              Print out statistics collected for the page buffer layer.
+ *
+ * Return:	    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_print_stats(const H5PB_t *page_buf)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(page_buf);
+
+    printf("PAGE BUFFER STATISTICS:\n");
+
+    printf("******* METADATA\n");
+    printf("\t Total Accesses: %u\n", page_buf->accesses[0]);
+    printf("\t Hits: %u\n", page_buf->hits[0]);
+    printf("\t Misses: %u\n", page_buf->misses[0]);
+    printf("\t Evictions: %u\n", page_buf->evictions[0]);
+    printf("\t Bypasses: %u\n", page_buf->bypasses[0]);
+    printf("\t Hit Rate = %f%%\n", ((double)page_buf->hits[0]/(page_buf->accesses[0] - page_buf->bypasses[0]))*100);
+    printf("*****************\n\n");
+
+    printf("******* RAWDATA\n");
+    printf("\t Total Accesses: %u\n", page_buf->accesses[1]);
+    printf("\t Hits: %u\n", page_buf->hits[1]);
+    printf("\t Misses: %u\n", page_buf->misses[1]);
+    printf("\t Evictions: %u\n", page_buf->evictions[1]);
+    printf("\t Bypasses: %u\n", page_buf->bypasses[1]);
+    printf("\t Hit Rate = %f%%\n", ((double)page_buf->hits[1]/(page_buf->accesses[1]-page_buf->bypasses[0]))*100);
+    printf("*****************\n\n");
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5PB_print_stats */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_create
+ *
+ * Purpose:	Create and setup the PB on the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_create(H5F_t *f, size_t size, unsigned page_buf_min_meta_perc, unsigned page_buf_min_raw_perc)
+{
+    H5PB_t *page_buf = NULL;
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Check args */
+    if(f->shared->fs_strategy != H5F_FSPACE_STRATEGY_PAGE)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "Enabling Page Buffering requires PAGE file space strategy")
+    /* round down the size if it is larger than the page size */
+    else if(size > f->shared->fs_page_size) {
+        hsize_t temp_size;
+
+        temp_size = (size / f->shared->fs_page_size) * f->shared->fs_page_size;
+        H5_CHECKED_ASSIGN(size, size_t, temp_size, hsize_t);
+    } /* end if */
+    else if(0 != size % f->shared->fs_page_size)
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTINIT, FAIL, "Page Buffer size must be >= to the page size")
+
+    /* Allocate the new page buffering structure */
+    if(NULL == (page_buf = H5FL_CALLOC(H5PB_t)))
+	HGOTO_ERROR(H5E_PAGEBUF, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    page_buf->max_size = size;
+    H5_CHECKED_ASSIGN(page_buf->page_size, size_t, f->shared->fs_page_size, hsize_t);
+    page_buf->min_meta_perc = page_buf_min_meta_perc;
+    page_buf->min_raw_perc = page_buf_min_raw_perc;
+
+    /* Calculate the minimum page count for metadata and raw data
+     * based on the fractions provided 
+     */
+    page_buf->min_meta_count = (unsigned)((size * page_buf_min_meta_perc) / (f->shared->fs_page_size * 100));
+    page_buf->min_raw_count = (unsigned)((size * page_buf_min_raw_perc) / (f->shared->fs_page_size * 100));
+
+    if(NULL == (page_buf->slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTCREATE, FAIL, "can't create skip list")
+    if(NULL == (page_buf->mf_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTCREATE, FAIL, "can't create skip list")
+
+    if(NULL == (page_buf->page_fac = H5FL_fac_init(page_buf->page_size)))
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTINIT, FAIL, "can't create page factory")
+
+    f->shared->page_buf = page_buf;
+
+done:
+    if(ret_value < 0) {
+        if(page_buf != NULL) {
+            if(page_buf->slist_ptr != NULL)
+                H5SL_close(page_buf->slist_ptr);
+            if(page_buf->mf_slist_ptr != NULL)
+                H5SL_close(page_buf->mf_slist_ptr);
+            if(page_buf->page_fac != NULL)
+                H5FL_fac_term(page_buf->page_fac);
+            page_buf = H5FL_FREE(H5PB_t, page_buf);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB_create */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB__flush_cb
+ *
+ * Purpose:	Callback to flush PB skiplist entries.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PB__flush_cb(void *item, void H5_ATTR_UNUSED *key, void *_op_data)
+{
+    H5PB_entry_t *page_entry = (H5PB_entry_t *)item;    /* Pointer to page entry node */
+    const H5F_io_info2_t *fio_info = (const H5F_io_info2_t *)_op_data;
+    herr_t  ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(page_entry);
+    HDassert(fio_info);
+
+    /* Flush the page if it's dirty */
+    if(page_entry->is_dirty)
+        if(H5PB__write_entry(fio_info, page_entry) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_WRITEERROR, FAIL, "file write failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB__flush_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_flush
+ *
+ * Purpose:	Flush/Free all the PB entries to the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_flush(const H5F_io_info2_t *fio_info)
+{
+    herr_t  ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(fio_info->meta_dxpl);
+    HDassert(fio_info->raw_dxpl);
+
+    /* Flush all the entries in the PB skiplist, if we have write access on the file */
+    if(fio_info->f->shared->page_buf && (H5F_ACC_RDWR & H5F_INTENT(fio_info->f))) {
+        H5PB_t *page_buf = fio_info->f->shared->page_buf;
+
+        /* Iterate over all entries in page buffer skip list */
+        if(H5SL_iterate(page_buf->slist_ptr, H5PB__flush_cb, (void *)fio_info))
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_BADITER, FAIL, "can't flush page buffer skip list")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB_flush */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB__dest_cb
+ *
+ * Purpose:	Callback to free PB skiplist entries.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PB__dest_cb(void *item, void H5_ATTR_UNUSED *key, void *_op_data)
+{
+    H5PB_entry_t *page_entry = (H5PB_entry_t *)item;       /* Pointer to page entry node */
+    H5PB_ud1_t *op_data = (H5PB_ud1_t *)_op_data;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checking */
+    HDassert(page_entry);
+    HDassert(op_data);
+    HDassert(op_data->page_buf);
+
+    /* Remove entry from LRU list */
+    if(op_data->actual_slist) {
+        H5PB__REMOVE_LRU(op_data->page_buf, page_entry)
+        page_entry->page_buf_ptr = H5FL_FAC_FREE(op_data->page_buf->page_fac, page_entry->page_buf_ptr);
+    } /* end if */
+
+    /* Free page entry */
+    page_entry = H5FL_FREE(H5PB_entry_t, page_entry);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5PB__dest_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_dest
+ *
+ * Purpose:	Flush and destroy the PB on the file if it exists.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_dest(const H5F_io_info2_t *fio_info)
+{
+    herr_t  ret_value = SUCCEED;        /* Return value */
+    H5F_t  *f;                          /* file pointer */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(fio_info);
+    f = fio_info->f;
+    HDassert(f);
+
+    /* flush and destroy the page buffer, if it exists */
+    if(f->shared->page_buf) {
+        H5PB_t *page_buf = f->shared->page_buf;
+        H5PB_ud1_t op_data;                 /* Iteration context */
+
+        if(H5PB_flush(fio_info)<0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTFLUSH, FAIL, "can't flush page buffer")
+
+        /* Set up context info */
+        op_data.page_buf = page_buf;
+
+        /* Destroy the skip list containing all the entries in the PB */
+        op_data.actual_slist = TRUE;
+        if(H5SL_destroy(page_buf->slist_ptr, H5PB__dest_cb, &op_data))
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTCLOSEOBJ, FAIL, "can't destroy page buffer skip list")
+
+        /* Destroy the skip list containing the new entries */
+        op_data.actual_slist = FALSE;
+        if(H5SL_destroy(page_buf->mf_slist_ptr, H5PB__dest_cb, &op_data))
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTCLOSEOBJ, FAIL, "can't destroy page buffer skip list")
+
+        /* Destroy the page factory */
+        if(H5FL_fac_term(page_buf->page_fac) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTRELEASE, FAIL, "can't destroy page buffer page factory")
+
+#ifdef QAK
+H5PB_print_stats(page_buf);
+#endif /* QAK */
+
+        f->shared->page_buf = H5FL_FREE(H5PB_t, page_buf);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB_dest */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_add_new_page
+ *
+ * Purpose:	Add a new page to the new page skip list. This is called 
+ *              from the MF layer when a new page is allocated to 
+ *              indicate to the page buffer layer that a read of the page 
+ *              from the file is not necessary since it's an empty page.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5PB_add_new_page(H5F_t *f, H5FD_mem_t type, haddr_t page_addr)
+{
+    H5PB_t *page_buf = f->shared->page_buf;
+    H5PB_entry_t *page_entry = NULL;    /* pointer to the corresponding page entry */
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(page_buf);
+
+    /* If there is an existing page, this means that at some point the
+     * file free space manager freed and re-allocated a page at the same
+     * address.  No need to do anything here then...
+     */
+    /* MSC - to be safe, might want to dig in the MF layer and remove
+     * the page when it is freed from this list if it still exists and
+     * remove this check
+     */
+    if(NULL == H5SL_search(page_buf->mf_slist_ptr, &(page_addr))) {
+        /* Create the new PB entry */
+        if(NULL == (page_entry = H5FL_CALLOC(H5PB_entry_t)))
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+        /* Initialize page fields */
+        page_entry->addr = page_addr;
+        page_entry->type = (H5F_mem_page_t)type;
+        page_entry->is_dirty = FALSE;
+
+        /* Insert entry in skip list */
+        if(H5SL_insert(page_buf->mf_slist_ptr, page_entry, &(page_entry->addr)) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_BADVALUE, FAIL, "Can't insert entry in skip list")
+    } /* end if */
+
+done:
+    if(ret_value < 0)
+        if(page_entry)
+            page_entry = H5FL_FREE(H5PB_entry_t, page_entry);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB_add_new_page */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_update_entry
+ *
+ * Purpose:	In PHDF5, entries that are written by other processes and just 
+ *              marked clean by this process have to have their corresponding 
+ *              pages updated if they exist in the page buffer. 
+ *              This routine checks and update the pages.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t 
+H5PB_update_entry(H5PB_t *page_buf, haddr_t addr, size_t size, const void *buf)
+{
+    H5PB_entry_t *page_entry;   /* Pointer to the corresponding page entry */
+    haddr_t page_addr;
+
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Sanity checks */
+    HDassert(page_buf);
+    HDassert(size <= page_buf->page_size);
+    HDassert(buf);
+
+    /* calculate the aligned address of the first page */
+    page_addr = (addr / page_buf->page_size) * page_buf->page_size;
+
+    /* search for the page and update if found */
+    page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&page_addr));
+    if(page_entry) {
+        haddr_t offset;
+
+        HDassert(addr + size <= page_addr + page_buf->page_size);
+        offset = addr - page_addr;
+        HDmemcpy((uint8_t *)page_entry->page_buf_ptr + offset, buf, size);
+
+        /* move to top of LRU list */
+        H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5PB_update_entry */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PB_remove_entry
+ *
+ * Purpose:     Remove possible metadata entry with ADDR from the PB cache.
+ *              This is in response to the data corruption bug from fheap.c 
+ *              with page buffering + page strategy.
+ *              Note: Large metadata page bypasses the PB cache.
+ *              Note: Update of raw data page (large or small sized) is handled by the PB cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_remove_entry(const H5F_t *f, haddr_t addr)
+{
+    H5PB_t *page_buf = f->shared->page_buf;
+    H5PB_entry_t *page_entry = NULL;        /* pointer to the page entry being searched */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(page_buf);
+
+    /* Search for address in the skip list */
+    page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&addr));
+
+    /* If found, remove the entry from the PB cache */
+    if(page_entry) {
+        HDassert(page_entry->type != H5F_MEM_PAGE_DRAW);
+        if(NULL == H5SL_remove(page_buf->slist_ptr, &(page_entry->addr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Page Entry is not in skip list")
+
+        /* Remove from LRU list */
+        H5PB__REMOVE_LRU(page_buf, page_entry)
+        HDassert(H5SL_count(page_buf->slist_ptr) == page_buf->LRU_list_len);
+
+        page_buf->meta_count--;
+
+        page_entry->page_buf_ptr = H5FL_FAC_FREE(page_buf->page_fac, page_entry->page_buf_ptr);
+        page_entry = H5FL_FREE(H5PB_entry_t, page_entry);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5PB_remove_entry */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_read
+ *
+ * Purpose:	Reads in the data from the page containing it if it exists 
+ *              in the PB cache; otherwise reads in the page through the VFD.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_read(const H5F_io_info2_t *fio_info, H5FD_mem_t type, haddr_t addr,
+    size_t size, void *buf/*out*/)
+{
+    H5PB_t *page_buf;                   /* Page buffering info for this file */
+    H5PB_entry_t *page_entry;           /* Pointer to the corresponding page entry */
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
+    haddr_t first_page_addr, last_page_addr;    /* Addresses of the first and last pages covered by I/O */
+    haddr_t offset;
+    haddr_t search_addr;                /* Address of current page */
+    hsize_t num_touched_pages;          /* Number of pages accessed */
+    size_t access_size;
+    hbool_t bypass_pb = FALSE;          /* Whether to bypass page buffering */
+    hsize_t i;                          /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(fio_info);
+
+    /* Get pointer to page buffer info for this file */
+    page_buf = fio_info->f->shared->page_buf;
+
+#ifdef H5_HAVE_PARALLEL
+    if(H5F_HAS_FEATURE(fio_info->f, H5FD_FEAT_HAS_MPI)) {
+#if 1
+        bypass_pb = TRUE;
+#else
+        /* MSC - why this stopped working ? */
+        int mpi_size;
+
+        if((mpi_size = H5F_mpi_get_size(fio_info->f)) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "can't retrieve MPI communicator size")
+        if(1 != mpi_size)
+            bypass_pb = TRUE;
+#endif
+    } /* end if */
+#endif
+
+    /* If page buffering is disabled, or the I/O size is larger than that of a
+     * single page, or if this is a parallel raw data access, bypass page
+     * buffering.
+     */
+    if(NULL == page_buf || size >= page_buf->page_size ||
+           (bypass_pb && H5FD_MEM_DRAW == type)) {
+        if(H5F__accum_read(fio_info, type, addr, size, buf) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_READERROR, FAIL, "read through metadata accumulator failed")
+
+        /* Update statistics */
+        if(page_buf) {
+            if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                page_buf->bypasses[1] ++;
+            else
+                page_buf->bypasses[0] ++;
+        } /* end if */
+
+        /* If page buffering is disabled, or if this is a large metadata access, 
+         * or if this is parallel raw data access, we are done here
+         */
+        if(NULL == page_buf || (size >= page_buf->page_size && H5FD_MEM_DRAW != type) ||
+                (bypass_pb && H5FD_MEM_DRAW == type))
+            HGOTO_DONE(SUCCEED)
+    } /* end if */
+
+    /* Update statistics */
+    if(page_buf) {
+        if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+            page_buf->accesses[1]++;
+        else
+            page_buf->accesses[0]++;
+    } /* end if */
+
+    /* Calculate the aligned address of the first page */
+    first_page_addr = (addr / page_buf->page_size) * page_buf->page_size;
+
+    /* For Raw data calculate the aligned address of the last page and
+     * the number of pages accessed if more than 1 page is accessed
+     */
+    if(H5FD_MEM_DRAW == type) {
+        last_page_addr = ((addr + size - 1) / page_buf->page_size) * page_buf->page_size;
+
+        /* How many pages does this write span */
+        num_touched_pages = (last_page_addr / page_buf->page_size + 1) - 
+                (first_page_addr / page_buf->page_size);
+        if(first_page_addr == last_page_addr) {
+            HDassert(1 == num_touched_pages);
+            last_page_addr = HADDR_UNDEF;
+        } /* end if */
+    } /* end if */
+    /* Otherwise set last page addr to HADDR_UNDEF */
+    else {
+        num_touched_pages = 1;
+        last_page_addr = HADDR_UNDEF;
+    } /* end else */
+
+    /* Translate to file driver I/O info object */
+    fdio_info.file = fio_info->f->shared->lf;
+    fdio_info.meta_dxpl = fio_info->meta_dxpl;
+    fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
+    /* Copy raw data from dirty pages into the read buffer if the read
+       request spans pages in the page buffer*/
+    if(H5FD_MEM_DRAW == type && size >= page_buf->page_size) {
+        H5SL_node_t *node;
+
+        /* For each touched page in the page buffer, check if it
+         * exists in the page Buffer and is dirty. If it does, we
+         * update the buffer with what's in the page so we get the up
+         * to date data into the buffer after the big read from the file.
+         */
+        node = H5SL_find(page_buf->slist_ptr, (void *)(&first_page_addr));
+        for(i = 0; i < num_touched_pages; i++) {
+            search_addr = i*page_buf->page_size + first_page_addr;
+
+            /* if we still haven't located a starting page, search again */
+            if(!node && i!=0)
+                node = H5SL_find(page_buf->slist_ptr, (void *)(&search_addr));
+
+            /* if the current page is in the Page Buffer, do the updates */
+            if(node) {
+                page_entry = (H5PB_entry_t *)H5SL_item(node);
+
+                HDassert(page_entry);
+
+                /* If the current page address falls out of the access
+                   block, then there are no more pages to go over */
+                if(page_entry->addr >= addr + size)
+                    break;
+
+                HDassert(page_entry->addr == search_addr);
+
+                if(page_entry->is_dirty) {
+                    /* special handling for the first page if it is not a full page access */
+                    if(i == 0 && first_page_addr != addr) {
+                        offset = addr - first_page_addr;
+                        HDassert(page_buf->page_size > offset);
+
+                        HDmemcpy(buf, (uint8_t *)page_entry->page_buf_ptr + offset, 
+                                 page_buf->page_size - (size_t)offset);
+
+                        /* move to top of LRU list */
+                        H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+                    } /* end if */
+                    /* special handling for the last page if it is not a full page access */
+                    else if(num_touched_pages > 1 && i == num_touched_pages-1 && search_addr < addr+size) {
+                        offset = (num_touched_pages-2)*page_buf->page_size + 
+                            (page_buf->page_size - (addr - first_page_addr));
+
+                        HDmemcpy((uint8_t *)buf + offset, page_entry->page_buf_ptr,
+                                 (size_t)((addr + size) - last_page_addr));
+
+                        /* move to top of LRU list */
+                        H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+                    } /* end else-if */
+                    /* copy the entire fully accessed pages */
+                    else {
+                        offset = i*page_buf->page_size;
+
+                        HDmemcpy((uint8_t *)buf+(i*page_buf->page_size) , page_entry->page_buf_ptr, 
+                             page_buf->page_size);
+                    } /* end else */
+                } /* end if */
+                node = H5SL_next(node);
+            } /* end if */
+        } /* end for */
+    } /* end if */
+    else {
+        /* A raw data access could span 1 or 2 PB entries at this point so
+           we need to handle that */
+        HDassert(1 == num_touched_pages || 2 == num_touched_pages);
+        for(i = 0 ; i < num_touched_pages; i++) {
+            haddr_t buf_offset;
+
+            /* Calculate the aligned address of the page to search for it in the skip list */
+            search_addr = (0==i ? first_page_addr : last_page_addr);
+
+            /* Calculate the access size if the access spans more than 1 page */
+            if(1 == num_touched_pages)
+                access_size = size;
+            else
+                access_size = (0 == i ? (size_t)((first_page_addr + page_buf->page_size) - addr) : (size - access_size));
+
+            /* Lookup the page in the skip list */
+            page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&search_addr));
+
+            /* if found */
+            if(page_entry) {
+                offset = (0 == i ? addr - page_entry->addr : 0);
+                buf_offset = (0 == i ? 0 : size - access_size);
+
+                /* copy the requested data from the page into the input buffer */
+                HDmemcpy((uint8_t *)buf + buf_offset, (uint8_t *)page_entry->page_buf_ptr + offset, access_size);
+
+                /* Update LRU */
+                H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+
+                /* Update statistics */
+                if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                    page_buf->hits[1]++;
+                else
+                    page_buf->hits[0]++;
+            } /* end if */
+            /* if not found */ 
+            else {
+                void *new_page_buf = NULL;
+                size_t page_size = page_buf->page_size;
+                haddr_t eoa;
+
+                /* make space for new entry */
+                if((H5SL_count(page_buf->slist_ptr) * page_buf->page_size) >= page_buf->max_size) {
+                    htri_t can_make_space;
+
+                    /* check if we can make space in page buffer */
+                    if((can_make_space = H5PB__make_space(fio_info, page_buf, type)) < 0)
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_NOSPACE, FAIL, "make space in Page buffer Failed")
+
+                    /* if make_space returns 0, then we can't use the page
+                       buffer for this I/O and we need to bypass */
+                    if(0 == can_make_space) {
+                        /* make space can't return FALSE on second touched page since the first is of the same type */
+                        HDassert(0 == i);
+
+                        /* read entire block from VFD and return */
+                        if(H5FD_read(&fdio_info, type, addr, size, buf) < 0)
+                            HGOTO_ERROR(H5E_PAGEBUF, H5E_READERROR, FAIL, "driver read request failed")
+
+                        /* Break out of loop */
+                        break;
+                    } /* end if */
+                } /* end if */
+
+                /* Read page from VFD */
+                if(NULL == (new_page_buf = H5FL_FAC_MALLOC(page_buf->page_fac)))
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTALLOC, FAIL, "memory allocation failed for page buffer entry")
+
+                /* Read page through the VFD layer, but make sure we don't read past the EOA. */
+
+                /* Retrieve the 'eoa' for the file */
+                if(HADDR_UNDEF == (eoa = H5F_get_eoa(fio_info->f, type)))
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+                /* If the entire page falls outside the EOA, then fail */
+                if(search_addr > eoa)
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_BADVALUE, FAIL, "reading an entire page that is outside the file EOA")
+
+                /* Adjust the read size to not go beyond the EOA */
+                if(search_addr + page_size > eoa)
+                    page_size = (size_t)(eoa - search_addr);
+
+                /* Read page from VFD */
+                if(H5FD_read(&fdio_info, type, search_addr, page_size, new_page_buf) < 0)
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_READERROR, FAIL, "driver read request failed")
+
+                /* Copy the requested data from the page into the input buffer */
+                offset = (0 == i ? addr - search_addr : 0);
+                buf_offset = (0 == i ? 0 : size - access_size);
+                HDmemcpy((uint8_t *)buf + buf_offset, (uint8_t *)new_page_buf + offset, access_size);
+
+                /* Create the new PB entry */
+                if(NULL == (page_entry = H5FL_CALLOC(H5PB_entry_t)))
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                page_entry->page_buf_ptr = new_page_buf;
+                page_entry->addr = search_addr;
+                page_entry->type = (H5F_mem_page_t)type;
+                page_entry->is_dirty = FALSE;
+
+                /* Insert page into PB */
+                if(H5PB__insert_entry(page_buf, page_entry) < 0)
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTSET, FAIL, "error inserting new page in page buffer")
+
+                /* Update statistics */
+                if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                    page_buf->misses[1]++;
+                else
+                    page_buf->misses[0]++;
+            } /* end else */
+        } /* end for */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PB_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB_write
+ *
+ * Purpose: Write data into the Page Buffer. If the page exists in the
+ *          cache, update it; otherwise read it from disk, update it, and
+ *          insert into cache.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PB_write(const H5F_io_info2_t *fio_info, H5FD_mem_t type, haddr_t addr,
+    size_t size, const void *buf)
+{
+    H5PB_t *page_buf;                   /* Page buffering info for this file */
+    H5PB_entry_t *page_entry;           /* Pointer to the corresponding page entry */
+    H5FD_io_info_t fdio_info;           /* File driver I/O info */
+    haddr_t first_page_addr, last_page_addr;    /* Addresses of the first and last pages covered by I/O */
+    haddr_t offset;
+    haddr_t search_addr;                /* Address of current page */
+    hsize_t num_touched_pages;          /* Number of pages accessed */
+    size_t access_size;
+    hbool_t bypass_pb = FALSE;          /* Whether to bypass page buffering */
+    hsize_t i;                          /* Local index variable */
+    herr_t  ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+
+    /* Get pointer to page buffer info for this file */
+    page_buf = fio_info->f->shared->page_buf;
+
+#ifdef H5_HAVE_PARALLEL
+    if(H5F_HAS_FEATURE(fio_info->f, H5FD_FEAT_HAS_MPI)) {
+#if 1
+        bypass_pb = TRUE;
+#else
+        /* MSC - why this stopped working ? */
+        int mpi_size;
+
+        if((mpi_size = H5F_mpi_get_size(fio_info->f)) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "can't retrieve MPI communicator size")
+        if(1 != mpi_size)
+            bypass_pb = TRUE;
+#endif
+    } /* end if */
+#endif
+
+    /* If page buffering is disabled, or the I/O size is larger than that of a
+     * single page, or if this is a parallel raw data access, bypass page
+     * buffering.
+     */
+    if(NULL == page_buf || size >= page_buf->page_size || bypass_pb) {
+        if(H5F__accum_write(fio_info, type, addr, size, buf) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_WRITEERROR, FAIL, "write through metadata accumulator failed")
+
+        /* Update statistics */
+        if(page_buf) {
+            if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                page_buf->bypasses[1]++;
+            else
+                page_buf->bypasses[0]++;
+        } /* end if */
+
+        /* If page buffering is disabled, or if this is a large metadata access, 
+         * or if this is a parallel raw data access, we are done here
+         */
+        if(NULL == page_buf || (size >= page_buf->page_size && H5FD_MEM_DRAW != type) ||
+                (bypass_pb && H5FD_MEM_DRAW == type))
+            HGOTO_DONE(SUCCEED)
+
+#ifdef H5_HAVE_PARALLEL
+        if(bypass_pb) {
+            if(H5PB_update_entry(page_buf, addr, size, buf) > 0)
+                HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTUPDATE, FAIL, "failed to update PB with metadata cache")
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+#endif
+    } /* end if */
+
+    /* Update statistics */
+    if(page_buf) {
+        if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+            page_buf->accesses[1]++;
+        else
+            page_buf->accesses[0]++;
+    } /* end if */
+
+    /* Calculate the aligned address of the first page */
+    first_page_addr = (addr / page_buf->page_size) * page_buf->page_size;
+
+    /* For raw data calculate the aligned address of the last page and
+     * the number of pages accessed if more than 1 page is accessed
+     */
+    if(H5FD_MEM_DRAW == type) {
+        last_page_addr = (addr + size - 1) / page_buf->page_size * page_buf->page_size;
+
+        /* how many pages does this write span */
+        num_touched_pages = (last_page_addr/page_buf->page_size + 1) - 
+            (first_page_addr / page_buf->page_size);
+        if(first_page_addr == last_page_addr) {
+            HDassert(1 == num_touched_pages);
+            last_page_addr = HADDR_UNDEF;
+        } /* end if */
+    } /* end if */
+    /* Otherwise set last page addr to HADDR_UNDEF */
+    else {
+        num_touched_pages = 1;
+        last_page_addr = HADDR_UNDEF;
+    } /* end else */
+
+    /* Translate to file driver I/O info object */
+    fdio_info.file = fio_info->f->shared->lf;
+    fdio_info.meta_dxpl = fio_info->meta_dxpl;
+    fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
+    /* Check if existing pages for raw data need to be updated since raw data access is not atomic */
+    if(H5FD_MEM_DRAW == type && size >= page_buf->page_size) {
+        /* For each touched page, check if it exists in the page buffer, and
+         * update it with the data in the buffer to keep it up to date
+         */
+        for(i = 0; i < num_touched_pages; i++) {
+            search_addr = i * page_buf->page_size + first_page_addr;
+
+            /* Special handling for the first page if it is not a full page update */
+            if(i == 0 && first_page_addr != addr) {
+                /* Lookup the page in the skip list */
+                page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&search_addr));
+                if(page_entry) {
+                    offset = addr - first_page_addr;
+                    HDassert(page_buf->page_size > offset);
+
+                    /* Update page's data */
+                    HDmemcpy((uint8_t *)page_entry->page_buf_ptr + offset, buf, page_buf->page_size - (size_t)offset);
+
+                    /* Mark page dirty and push to top of LRU */
+                    page_entry->is_dirty = TRUE;
+                    H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+                } /* end if */
+            } /* end if */
+            /* Special handling for the last page if it is not a full page update */
+            else if(num_touched_pages > 1 && i == (num_touched_pages - 1) && 
+                    (search_addr + page_buf->page_size) != (addr + size)) {
+                HDassert(search_addr+page_buf->page_size > addr+size);
+
+                /* Lookup the page in the skip list */
+                page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&search_addr));
+                if(page_entry) {
+                    offset = (num_touched_pages - 2) * page_buf->page_size + 
+                        (page_buf->page_size - (addr - first_page_addr));
+
+                    /* Update page's data */
+                    HDmemcpy(page_entry->page_buf_ptr, (const uint8_t *)buf + offset, 
+                             (size_t)((addr + size) - last_page_addr));
+
+                    /* Mark page dirty and push to top of LRU */
+                    page_entry->is_dirty = TRUE;
+                    H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+                } /* end if */
+            } /* end else-if */
+            /* Discard all fully written pages from the page buffer */
+            else {
+                page_entry = (H5PB_entry_t *)H5SL_remove(page_buf->slist_ptr, (void *)(&search_addr));
+                if(page_entry) {
+                    /* Remove from LRU list */
+                    H5PB__REMOVE_LRU(page_buf, page_entry)
+
+                    /* Decrement page count of appropriate type */
+                    if(H5F_MEM_PAGE_DRAW == page_entry->type || H5F_MEM_PAGE_GHEAP == page_entry->type)
+                        page_buf->raw_count--;
+                    else
+                        page_buf->meta_count--;
+
+                    /* Free page info */
+                    page_entry->page_buf_ptr = H5FL_FAC_FREE(page_buf->page_fac, page_entry->page_buf_ptr);
+                    page_entry = H5FL_FREE(H5PB_entry_t, page_entry);
+                } /* end if */
+            } /* end else */
+        } /* end for */
+    } /* end if */
+    else {
+        /* An access could span 1 or 2 PBs at this point so we need to handle that */
+        HDassert(1 == num_touched_pages || 2 == num_touched_pages);
+        for(i = 0; i < num_touched_pages; i++) {
+            haddr_t buf_offset;
+
+            /* Calculate the aligned address of the page to search for it in the skip list */
+            search_addr = (0 == i ? first_page_addr : last_page_addr);
+
+            /* Calculate the access size if the access spans more than 1 page */
+            if(1 == num_touched_pages)
+                access_size = size;
+            else
+                access_size = (0 == i ? (size_t)(first_page_addr + page_buf->page_size - addr) : (size - access_size));
+
+            /* Lookup the page in the skip list */
+            page_entry = (H5PB_entry_t *)H5SL_search(page_buf->slist_ptr, (void *)(&search_addr));
+
+            /* If found */
+            if(page_entry) {
+                offset = (0 == i ? addr - page_entry->addr : 0);
+                buf_offset = (0 == i ? 0 : size - access_size);
+
+                /* Copy the requested data from the input buffer into the page */
+                HDmemcpy((uint8_t *)page_entry->page_buf_ptr + offset, (const uint8_t *)buf + buf_offset, access_size);
+
+                /* Mark page dirty and push to top of LRU */
+                page_entry->is_dirty = TRUE;
+                H5PB__MOVE_TO_TOP_LRU(page_buf, page_entry)
+
+                /* Update statistics */
+                if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                    page_buf->hits[1]++;
+                else
+                    page_buf->hits[0]++;
+            } /* end if */
+            /* If not found */ 
+            else {
+                void *new_page_buf;
+                size_t page_size = page_buf->page_size;
+
+                /* Make space for new entry */
+                if((H5SL_count(page_buf->slist_ptr) * page_buf->page_size) >= page_buf->max_size) {
+                    htri_t can_make_space;
+
+                    /* Check if we can make space in page buffer */
+                    if((can_make_space = H5PB__make_space(fio_info, page_buf, type)) < 0)
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_NOSPACE, FAIL, "make space in Page buffer Failed")
+
+                    /* If make_space returns 0, then we can't use the page
+                     * buffer for this I/O and we need to bypass
+                     */
+                    if(0 == can_make_space) {
+                        HDassert(0 == i);
+
+                        /* Write to VFD and return */
+                        if(H5FD_write(&fdio_info, type, addr, size, buf) < 0)
+                            HGOTO_ERROR(H5E_PAGEBUF, H5E_WRITEERROR, FAIL, "driver write request failed")
+                        
+                        /* Break out of loop */
+                        break;
+                    } /* end if */
+                } /* end if */
+
+                /* Don't bother searching if there is no write access */
+                if(H5F_ACC_RDWR & H5F_INTENT(fio_info->f))
+                    /* Lookup & remove the page from the new skip list page if
+                     * it exists to see if this is a new page from the MF layer
+                     */
+                    page_entry = (H5PB_entry_t *)H5SL_remove(page_buf->mf_slist_ptr, (void *)(&search_addr));
+
+                /* Calculate offset into the buffer of the page and the user buffer */
+                offset = (0 == i ? addr - search_addr : 0);
+                buf_offset = (0 == i ? 0 : size - access_size);
+
+                /* If found, then just update the buffer pointer to the newly allocate buffer */
+                if(page_entry) {
+                    /* Allocate space for the page buffer */
+                    if(NULL == (new_page_buf = H5FL_FAC_MALLOC(page_buf->page_fac)))
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTALLOC, FAIL, "memory allocation failed for page buffer entry")
+                    HDmemset(new_page_buf, 0, (size_t)offset);
+                    HDmemset((uint8_t *)new_page_buf + offset + access_size, 0, page_size - ((size_t)offset + access_size));
+
+                    page_entry->page_buf_ptr = new_page_buf;
+
+                    /* Update statistics */
+                    if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                        page_buf->hits[1]++;
+                    else
+                        page_buf->hits[0]++;
+                } /* end if */
+                /* Otherwise read page through the VFD layer, but make sure we don't read past the EOA. */
+                else {
+                    haddr_t eoa, eof = HADDR_UNDEF;
+
+                    /* Allocate space for the page buffer */
+                    if(NULL == (new_page_buf = H5FL_FAC_CALLOC(page_buf->page_fac)))
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTALLOC, FAIL, "memory allocation failed for page buffer entry")
+
+                    /* Create the new loaded PB entry */
+                    if(NULL == (page_entry = H5FL_CALLOC(H5PB_entry_t)))
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+                    page_entry->page_buf_ptr = new_page_buf;
+                    page_entry->addr = search_addr;
+                    page_entry->type = (H5F_mem_page_t)type;
+
+                    /* Retrieve the 'eoa' for the file */
+                    if(HADDR_UNDEF == (eoa = H5F_get_eoa(fio_info->f, type)))
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+                    /* If the entire page falls outside the EOA, then fail */
+                    if(search_addr > eoa)
+                        HGOTO_ERROR(H5E_PAGEBUF, H5E_BADVALUE, FAIL, "writing to a page that is outside the file EOA")
+
+                    /* Retrieve the 'eof' for the file - The MPI-VFD EOF
+                     * returned will most likely be HADDR_UNDEF, so skip
+                     * that check.
+                     */
+                    if(!H5F_HAS_FEATURE(fio_info->f, H5FD_FEAT_HAS_MPI))
+                        if(HADDR_UNDEF == (eof = H5FD_get_eof(fio_info->f->shared->lf, H5FD_MEM_DEFAULT)))
+                            HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "driver get_eof request failed")
+
+                    /* Adjust the read size to not go beyond the EOA */
+                    if(search_addr + page_size > eoa)
+                        page_size = (size_t)(eoa - search_addr);
+
+                    if(search_addr < eof) {
+                        if(H5FD_read(&fdio_info, type, search_addr, page_size, new_page_buf) < 0)
+                            HGOTO_ERROR(H5E_PAGEBUF, H5E_READERROR, FAIL, "driver read request failed")
+
+                        /* Update statistics */
+                        if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                            page_buf->misses[1]++;
+                        else
+                            page_buf->misses[0]++;
+                    } /* end if */
+                } /* end else */
+
+                /* Copy the requested data from the page into the input buffer */
+                HDmemcpy((uint8_t *)new_page_buf + offset, (const uint8_t *)buf+buf_offset, access_size);
+
+                /* Page is dirty now */
+                page_entry->is_dirty = TRUE;
+
+                /* Insert page into PB, evicting other pages as necessary */
+                if(H5PB__insert_entry(page_buf, page_entry) < 0)
+                    HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTSET, FAIL, "error inserting new page in page buffer")
+            } /* end else */
+        } /* end for */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PB_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB__insert_entry()
+ *
+ * Purpose: ??? 
+ *
+ *          This function was created without documentation.
+ *          What follows is my best understanding of Mohamad's intent.
+ *
+ *	    Insert the supplied page into the page buffer, both the
+ *          skip list and the LRU.
+ *
+ *          As best I can tell, this function imposes no limit on the
+ *          number of entries in the page buffer beyond an assertion
+ *          failure it the page count exceeds the limit.
+ *
+ *                                               JRM -- 12/22/16
+ *
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5PB__insert_entry(H5PB_t *page_buf, H5PB_entry_t *page_entry)
+{
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Insert entry in skip list */
+    if(H5SL_insert(page_buf->slist_ptr, page_entry, &(page_entry->addr)) < 0)
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTINSERT, FAIL, "can't insert entry in skip list")
+    HDassert(H5SL_count(page_buf->slist_ptr) * page_buf->page_size <= page_buf->max_size);
+
+    /* Increment appropriate page count */
+    if(H5F_MEM_PAGE_DRAW == page_entry->type || H5F_MEM_PAGE_GHEAP == page_entry->type)
+        page_buf->raw_count++;
+    else
+        page_buf->meta_count++;
+
+    /* Insert entry in LRU */
+    H5PB__INSERT_LRU(page_buf, page_entry)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PB__insert_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB__make_space()
+ *
+ * Purpose: ??? 
+ *
+ *          This function was created without documentation.
+ *          What follows is my best understanding of Mohamad's intent.
+ *
+ *          If necessary and if possible, evict a page from the page 
+ *          buffer to make space for the supplied page.  Depending on 
+ *	    the page buffer configuration and contents, and the page 
+ *          supplied this may or may not be possible.
+ *
+ *                                             JRM -- 12/22/16
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t 
+H5PB__make_space(const H5F_io_info2_t *fio_info, H5PB_t *page_buf,
+    H5FD_mem_t inserted_type)
+{
+    H5PB_entry_t *page_entry;   /* Pointer to page eviction candidate */
+    htri_t ret_value = TRUE;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(fio_info);
+    HDassert(page_buf);
+
+    /* Get oldest entry */
+    page_entry = page_buf->LRU_tail_ptr;
+
+    if(H5FD_MEM_DRAW == inserted_type) {
+        /* If threshould is 100% metadata and page buffer is full of
+           metadata, then we can't make space for raw data */
+        if(0 == page_buf->raw_count && page_buf->min_meta_count == page_buf->meta_count) {
+            HDassert(page_buf->meta_count * page_buf->page_size == page_buf->max_size);
+            HGOTO_DONE(FALSE)
+        } /* end if */
+
+        /* check the metadata threshold before evicting metadata items */
+        while(1) {
+            if(page_entry->prev && H5F_MEM_PAGE_META == page_entry->type && 
+                    page_buf->min_meta_count >= page_buf->meta_count)
+                page_entry = page_entry->prev;
+            else
+                break;
+        } /* end while */
+    } /* end if */
+    else {
+        /* If threshould is 100% raw data and page buffer is full of
+           raw data, then we can't make space for meta data */
+        if(0 == page_buf->meta_count && page_buf->min_raw_count == page_buf->raw_count) {
+            HDassert(page_buf->raw_count * page_buf->page_size == page_buf->max_size);
+            HGOTO_DONE(FALSE)
+        } /* end if */
+
+        /* check the raw data threshold before evicting raw data items */
+        while(1) {
+            if(page_entry->prev && (H5F_MEM_PAGE_DRAW == page_entry->type || H5F_MEM_PAGE_GHEAP == page_entry->type) && 
+                    page_buf->min_raw_count >= page_buf->raw_count)
+                page_entry = page_entry->prev;
+            else
+                break;
+        } /* end while */
+    } /* end else */
+
+    /* Remove from page index */
+    if(NULL == H5SL_remove(page_buf->slist_ptr, &(page_entry->addr)))
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_BADVALUE, FAIL, "Tail Page Entry is not in skip list")
+
+    /* Remove entry from LRU list */
+    H5PB__REMOVE_LRU(page_buf, page_entry)
+    HDassert(H5SL_count(page_buf->slist_ptr) == page_buf->LRU_list_len);
+
+    /* Decrement appropriate page type counter */
+    if(H5F_MEM_PAGE_DRAW == page_entry->type || H5F_MEM_PAGE_GHEAP == page_entry->type)
+        page_buf->raw_count--;
+    else
+        page_buf->meta_count--;
+
+    /* Flush page if dirty */
+    if(page_entry->is_dirty)
+        if(H5PB__write_entry(fio_info, page_entry) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_WRITEERROR, FAIL, "file write failed")
+
+    /* Update statistics */
+    if(page_entry->type == H5F_MEM_PAGE_DRAW || H5F_MEM_PAGE_GHEAP == page_entry->type)
+        page_buf->evictions[1]++;
+    else
+        page_buf->evictions[0]++;
+
+    /* Release page */
+    page_entry->page_buf_ptr = H5FL_FAC_FREE(page_buf->page_fac, page_entry->page_buf_ptr);
+    page_entry = H5FL_FREE(H5PB_entry_t, page_entry);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PB__make_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5PB__write_entry()
+ *
+ * Purpose: ??? 
+ *
+ *          This function was created without documentation.
+ *          What follows is my best understanding of Mohamad's intent.
+ *
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PB__write_entry(const H5F_io_info2_t *fio_info, H5PB_entry_t *page_entry)
+{
+    haddr_t eoa;                    /* Current EOA for the file */
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(fio_info);
+    HDassert(fio_info->f);
+    HDassert(page_entry);
+
+    /* Retrieve the 'eoa' for the file */
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(fio_info->f, page_entry->type)))
+        HGOTO_ERROR(H5E_PAGEBUF, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+    /* If the starting address of the page is larger than
+     * the EOA, then the entire page is discarded without writing.
+     */
+    if(page_entry->addr <= eoa) {
+        H5FD_io_info_t fdio_info;           /* File driver I/O info */
+        size_t page_size = fio_info->f->shared->page_buf->page_size;
+
+        /* Adjust the page length if it exceeds the EOA */
+        if((page_entry->addr + page_size) > eoa)
+            page_size = (size_t)(eoa - page_entry->addr);
+
+        /* Translate to file driver I/O info object */
+        fdio_info.file = fio_info->f->shared->lf;
+        fdio_info.meta_dxpl = fio_info->meta_dxpl;
+        fdio_info.raw_dxpl = fio_info->raw_dxpl;
+
+        if(H5FD_write(&fdio_info, page_entry->type, page_entry->addr, page_size, page_entry->page_buf_ptr) < 0)
+            HGOTO_ERROR(H5E_PAGEBUF, H5E_WRITEERROR, FAIL, "file write failed")
+    } /* end if */
+
+    page_entry->is_dirty = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PB__write_entry() */
+
diff --git a/src/H5PBmodule.h b/src/H5PBmodule.h
new file mode 100644
index 0000000..c8aabb6
--- /dev/null
+++ b/src/H5PBmodule.h
@@ -0,0 +1,32 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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
+ *		H5PB package.  Including this header means that the source file
+ *		is part of the H5PB package.
+ */
+#ifndef _H5PBmodule_H
+#define _H5PBmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5PB_MODULE
+#define H5_MY_PKG       H5PB
+#define H5_MY_PKG_ERR   H5E_RESOURCE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5PBmodule_H */
diff --git a/src/H5PBpkg.h b/src/H5PBpkg.h
new file mode 100644
index 0000000..6b9168b
--- /dev/null
+++ b/src/H5PBpkg.h
@@ -0,0 +1,58 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#if !(defined H5PB_FRIEND || defined H5PB_MODULE)
+#error "Do not include this file outside the H5PB package!"
+#endif
+
+#ifndef _H5PBpkg_H
+#define _H5PBpkg_H
+
+/* Get package's private header */
+#include "H5PBprivate.h"
+
+/* Other private headers needed by this file */
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+typedef struct H5PB_entry_t {
+    void            *page_buf_ptr;      /* Pointer to the buffer containing the data */
+    haddr_t	    addr;               /* Address of the page in the file */
+    H5F_mem_page_t  type;               /* Type of the page entry (H5F_MEM_PAGE_RAW/META) */
+    hbool_t         is_dirty;           /* Flag indicating whether the page has dirty data or not */
+
+    /* Fields supporting replacement policies */
+    struct H5PB_entry_t     *next;      /* next pointer in the LRU list */
+    struct H5PB_entry_t     *prev;      /* previous pointer in the LRU list */
+} H5PB_entry_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+
+#endif /* _H5PBpkg_H */
+
diff --git a/src/H5PBprivate.h b/src/H5PBprivate.h
new file mode 100644
index 0000000..e6f2874
--- /dev/null
+++ b/src/H5PBprivate.h
@@ -0,0 +1,106 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5PBprivate.h
+ *			June 2014
+ *			Mohamad Chaarawi
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5PBprivate_H
+#define _H5PBprivate_H
+
+/* Include package's public header */
+#ifdef NOT_YET
+#include "H5PBpublic.h"
+#endif /* NOT_YET */
+
+/* Private headers needed by this header */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5SLprivate.h"	/* Skip List				*/
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Forward declaration for a page buffer entry */
+struct H5PB_entry_t;
+
+/* Typedef for the main structure for the page buffer */
+typedef struct H5PB_t {
+    size_t              max_size;           /* The total page buffer size */
+    size_t              page_size;          /* Size of a single page */
+    unsigned            min_meta_perc;      /* Minimum ratio of metadata entries required before evicting meta entries */
+    unsigned            min_raw_perc;       /* Minimum ratio of raw data entries required before evicting raw entries */
+    unsigned            meta_count;         /* Number of entries for metadata */
+    unsigned            raw_count;          /* Number of entries for raw data */
+    unsigned            min_meta_count;     /* Minimum # of entries for metadata */
+    unsigned            min_raw_count;      /* Minimum # of entries for raw data */
+
+    H5SL_t              *slist_ptr;         /* Skip list with all the active page entries */
+    H5SL_t              *mf_slist_ptr;      /* Skip list containing newly allocated page entries inserted from the MF layer */
+
+    size_t              LRU_list_len;       /* Number of entries in the LRU (identical to slist_ptr count) */
+    struct H5PB_entry_t *LRU_head_ptr;      /* Head pointer of the LRU */
+    struct H5PB_entry_t *LRU_tail_ptr;      /* Tail pointer of the LRU */
+
+    H5FL_fac_head_t     *page_fac;           /* Factory for allocating pages */
+
+    /* Statistics */
+    unsigned            accesses[2];
+    unsigned            hits[2];
+    unsigned            misses[2];
+    unsigned            evictions[2];
+    unsigned            bypasses[2];
+} H5PB_t;
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General routines */
+H5_DLL herr_t H5PB_create(H5F_t *file, size_t page_buffer_size, unsigned page_buf_min_meta_perc, unsigned page_buf_min_raw_perc);
+H5_DLL herr_t H5PB_flush(const H5F_io_info2_t *fio_info);
+H5_DLL herr_t H5PB_dest(const H5F_io_info2_t *fio_info);
+H5_DLL herr_t H5PB_add_new_page(H5F_t *f, H5FD_mem_t type, haddr_t page_addr);
+H5_DLL herr_t H5PB_update_entry(H5PB_t *page_buf, haddr_t addr, size_t size, const void *buf);
+H5_DLL herr_t H5PB_remove_entry(const H5F_t *f, haddr_t addr);
+H5_DLL herr_t H5PB_read(const H5F_io_info2_t *fio_info, H5FD_mem_t type,
+    haddr_t addr, size_t size, void *buf/*out*/);
+H5_DLL herr_t H5PB_write(const H5F_io_info2_t *f, H5FD_mem_t type, haddr_t addr,
+    size_t size, const void *buf);
+
+/* Statistics routines */
+H5_DLL herr_t H5PB_reset_stats(H5PB_t *page_buf);
+H5_DLL herr_t H5PB_get_stats(const H5PB_t *page_buf, unsigned accesses[2],
+    unsigned hits[2], unsigned misses[2], unsigned evictions[2], unsigned bypasses[2]);
+H5_DLL herr_t H5PB_print_stats(const H5PB_t *page_buf);
+
+#endif /* !_H5PBprivate_H */
+
diff --git a/src/H5PL.c b/src/H5PL.c
index a196884..bc69a25 100644
--- a/src/H5PL.c
+++ b/src/H5PL.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -25,18 +23,36 @@
 #include "H5private.h"      /* Generic Functions            */
 #include "H5Eprivate.h"     /* Error handling               */
 #include "H5MMprivate.h"    /* Memory management            */
-#include "H5PLprivate.h"    /* Plugin                       */
+#include "H5PLpkg.h"        /* Plugin                       */
 #include "H5Zprivate.h"     /* Filter pipeline              */
 
 
 /****************/
 /* Local Macros */
 /****************/
-
-#define H5PL_MAX_PATH_NUM       16
+#ifdef H5_HAVE_WIN32_API
+#define H5PL_EXPAND_ENV_VAR {                                                            \
+        long bufCharCount;                                                               \
+        char *tempbuf;                                                                   \
+        if(NULL == (tempbuf = (char *)H5MM_malloc(H5PL_EXPAND_BUFFER_SIZE)))             \
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for expanded path")                          \
+        if((bufCharCount = ExpandEnvironmentStringsA(dl_path, tempbuf, H5PL_EXPAND_BUFFER_SIZE)) > H5PL_EXPAND_BUFFER_SIZE) { \
+            tempbuf = (char *)H5MM_xfree(tempbuf);                                       \
+            HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "expanded path is too long")      \
+        }                                                                                \
+        if(bufCharCount == 0) {                                                          \
+            tempbuf = (char *)H5MM_xfree(tempbuf);                                       \
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "failed to expand path")          \
+        }                                                                                \
+        dl_path = (char *)H5MM_xfree(dl_path);                                           \
+        dl_path = tempbuf;                                                               \
+ }
+#else
+#define H5PL_EXPAND_ENV_VAR
+#endif /* H5_HAVE_WIN32_API */
 
 /****************************/
-/* Macros for supporting 
+/* Macros for supporting
  * both Windows and Unix */
 /****************************/
 /* Windows support
@@ -70,6 +86,9 @@
 /* Clear error - nothing to do */
 #define H5PL_CLR_ERROR
 
+/* maximum size for expanding env vars */
+#define H5PL_EXPAND_BUFFER_SIZE 32767
+
 typedef const void *(__cdecl *H5PL_get_plugin_info_t)(void);
 
 /* Unix support */
@@ -81,7 +100,7 @@ typedef const void *(__cdecl *H5PL_get_plugin_info_t)(void);
 #define H5PL_HANDLE void *
 
 /* Get a handle to a plugin library.  Windows: TEXT macro handles Unicode strings */
-#define H5PL_OPEN_DLIB(S) dlopen(S, RTLD_NOW)
+#define H5PL_OPEN_DLIB(S) dlopen(S, RTLD_LAZY)
 
 /* Get the address of a symbol in dynamic library */
 #define H5PL_GET_LIB_FUNC(H,N) dlsym(H,N)
@@ -90,7 +109,7 @@ typedef const void *(__cdecl *H5PL_get_plugin_info_t)(void);
 #define H5PL_CLOSE_LIB(H) dlclose(H)
 
 /* Clear error */
-#define H5PL_CLR_ERROR dlerror()
+#define H5PL_CLR_ERROR HERROR(H5E_PLUGIN, H5E_CANTGET, "can't dlopen:%s", dlerror())
 
 typedef const void *(*H5PL_get_plugin_info_t)(void);
 #endif /* H5_HAVE_WIN32_API */
@@ -207,7 +226,7 @@ int
 H5PL_term_package(void)
 {
     int  n = 0;
-    
+
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     if(H5_PKG_INIT_VAR) {
@@ -363,12 +382,12 @@ H5PL_load(H5PL_type_t type, int id)
 
     /* If not found, iterate through the path table to find the right dynamic library */
     if(!found) {
-        size_t	   i;                   /* Local index variable */
+        size_t       i;                   /* Local index variable */
 
         for(i = 0; i < H5PL_num_paths_g; i++) {
             if((found = H5PL__find(type, id, H5PL_path_table_g[i], &plugin_info)) < 0)
                 HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in paths failed")
-     
+
             /* Break out if found */
             if(found) {
                 HDassert(plugin_info);
@@ -387,6 +406,258 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function: H5PLappend
+ *
+ * Purpose: Insert a plugin path at the end of the list.
+ *
+ * Return: Non-negative or success.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLappend(const char *plugin_path)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    char        *dl_path = NULL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*s", plugin_path);
+    if(H5PL_num_paths_g == H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
+    if(NULL == plugin_path)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
+    if(NULL == (dl_path = H5MM_strdup(plugin_path)))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+    H5PL_EXPAND_ENV_VAR
+
+    H5PL_path_table_g[H5PL_num_paths_g] = dl_path;
+    H5PL_num_paths_g++;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLappend() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLprepend
+ *
+ * Purpose: Insert a plugin path at the beginning of the list.
+ *
+ * Return: Non-negative or success.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLprepend(const char *plugin_path)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    char        *dl_path = NULL;
+    unsigned int plindex;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*s", plugin_path);
+    if(H5PL_num_paths_g == H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
+    if(NULL == plugin_path)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
+    if(NULL == (dl_path = H5MM_strdup(plugin_path)))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+    H5PL_EXPAND_ENV_VAR
+
+    for (plindex = (unsigned int)H5PL_num_paths_g; plindex > 0; plindex--)
+        H5PL_path_table_g[plindex] = H5PL_path_table_g[plindex - 1];
+    H5PL_path_table_g[0] = dl_path;
+    H5PL_num_paths_g++;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLprepend() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLreplace
+ *
+ * Purpose: Replace the path at the specified index.
+ *
+ * Return: Non-negative or success.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLreplace(const char *plugin_path, unsigned int index)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    char        *dl_path = NULL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "*sIu", plugin_path, index);
+    if(NULL == plugin_path)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
+    if(index >= H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "index path out of bounds for table")
+    if(NULL == (dl_path = H5MM_strdup(plugin_path)))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+    H5PL_EXPAND_ENV_VAR
+
+    if(H5PL_path_table_g[index])
+        H5PL_path_table_g[index] = (char *)H5MM_xfree(H5PL_path_table_g[index]);
+    H5PL_path_table_g[index] = dl_path;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLreplace() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLinsert
+ *
+ * Purpose: Insert a plugin path at the specified index, moving other paths after the index.
+ *
+ * Return: Non-negative or success.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLinsert(const char *plugin_path, unsigned int index)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    char        *dl_path = NULL;
+    unsigned int plindex;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "*sIu", plugin_path, index);
+    if(H5PL_num_paths_g == H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
+    if(NULL == plugin_path)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
+    if(index >= H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "index path out of bounds for table")
+    if(NULL == (dl_path = H5MM_strdup(plugin_path)))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+    H5PL_EXPAND_ENV_VAR
+
+    for(plindex = (unsigned int)H5PL_num_paths_g; plindex > index; plindex--)
+        H5PL_path_table_g[plindex] = H5PL_path_table_g[plindex - 1];
+    H5PL_path_table_g[index] = dl_path;
+    H5PL_num_paths_g++;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLinsert() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLremove
+ *
+ * Purpose: Remove the plugin path at the specifed index and compacting the list.
+ *
+ * Return: Non-negative or success.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLremove(unsigned int index)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+    unsigned int plindex;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "Iu", index);
+    if(H5PL_num_paths_g == 0)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "no directories in table")
+    if(index >= H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "index path out of bounds for table")
+    if(NULL == H5PL_path_table_g[index])
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no directory path at index")
+    H5PL_path_table_g[index] = (char *)H5MM_xfree(H5PL_path_table_g[index]);
+
+    H5PL_num_paths_g--;
+    for(plindex = index; plindex < (unsigned int)H5PL_num_paths_g; plindex++)
+        H5PL_path_table_g[plindex] = H5PL_path_table_g[plindex + 1];
+    H5PL_path_table_g[H5PL_num_paths_g] = NULL;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLremove() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLget
+ *
+ * Purpose: Query the plugin path at the specified index.
+ *
+ * Return: Success: The length of path.
+ *
+ *  If `pathname' is non-NULL then write up to `size' bytes into that
+ *  buffer and always return the length of the pathname.
+ *  Otherwise `size' is ignored and the function does not store the pathname,
+ *  just returning the number of characters required to store the pathname.
+ *  If an error occurs then the buffer pointed to by `pathname' (NULL or non-NULL)
+ *  is unchanged and the function returns a negative value.
+ *  If a zero is returned for the name's length, then there is no pathname
+ *  associated with the index.
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5PLget(unsigned int index, char *pathname/*out*/, size_t size)
+{
+    ssize_t      ret_value = 0;    /* Return value */
+    size_t       len = 0;          /* Length of pathname */
+    char        *dl_path = NULL;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Zs", "Iuxz", index, pathname, size);
+    if(H5PL_num_paths_g == 0)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "no directories in table")
+    if(index >= H5PL_MAX_PATH_NUM)
+        HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "index path out of bounds for table")
+    if(NULL == (dl_path = H5PL_path_table_g[index]))
+        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no directory path at index")
+    len = HDstrlen(dl_path);
+    if(pathname) {
+        HDstrncpy(pathname, dl_path, MIN((size_t)(len + 1), size));
+        if((size_t)len >= size)
+            pathname[size - 1] = '\0';
+    } /* end if */
+
+    /* Set return value */
+    ret_value = (ssize_t)len;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLget() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PLsize
+ *
+ * Purpose: Query the size of the current list of plugin paths.
+ *
+ * Return: Plugin path size
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5PLsize(unsigned int *listsize)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*Iu", listsize);
+
+    *listsize = (unsigned int)H5PL_num_paths_g;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5PLsize() */
+
+
+/*-------------------------------------------------------------------------
  * Function:    H5PL__init_path_table
  *
  * Purpose:     Initialize the path table.
@@ -419,6 +690,8 @@ H5PL__init_path_table(void)
     if(NULL == dl_path)
         HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
 
+    H5PL_EXPAND_ENV_VAR
+
     /* Put paths in the path table.  They are separated by ":" */
     dir = HDstrtok(dl_path, H5PL_PATH_SEPARATOR);
     while(dir) {
@@ -445,11 +718,11 @@ done:
  * Function:    H5PL__find
  *
  * Purpose:     Given a path, this function opens the directory and envokes
- *              another function to go through all files to find the right 
- *              plugin library. Two function definitions are for Unix and 
+ *              another function to go through all files to find the right
+ *              plugin library. Two function definitions are for Unix and
  *              Windows.
  *
- * Return:      TRUE on success, 
+ * Return:      TRUE on success,
  *              FALSE on not found,
  *              negative on failure
  *
@@ -469,17 +742,17 @@ H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info)
 
     FUNC_ENTER_STATIC
 
-    /* Open the directory */  
+    /* Open the directory */
     if(!(dirp = HDopendir(dir)))
-        HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory")
+        HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory: %s", dir)
 
     /* Iterates through all entries in the directory to find the right plugin library */
     while(NULL != (dp = HDreaddir(dirp))) {
-        /* The library we are looking for should be called libxxx.so... on Unix 
+        /* The library we are looking for should be called libxxx.so... on Unix
          * or libxxx.xxx.dylib on Mac.
-         */ 
+         */
 #ifndef __CYGWIN__
-        if(!HDstrncmp(dp->d_name, "lib", (size_t)3) && 
+        if(!HDstrncmp(dp->d_name, "lib", (size_t)3) &&
                 (HDstrstr(dp->d_name, ".so") || HDstrstr(dp->d_name, ".dylib"))) {
 #else
         if(!HDstrncmp(dp->d_name, "cyg", (size_t)3) &&
@@ -500,29 +773,24 @@ H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info)
             if(HDstat(pathname, &my_stat) == -1)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't stat file: %s", HDstrerror(errno))
 
-            /* If it is a directory, skip it */ 
+            /* If it is a directory, skip it */
             if(S_ISDIR(my_stat.st_mode))
                 continue;
 
             /* Attempt to open the dynamic library as a filter library */
             if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
                 HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
-            if(found_in_dir) {
-                /* Indicate success */
-                HGOTO_DONE(TRUE)
-            } /* end if */
-            else
-                HDassert(pathname);
-                pathname = (char *)H5MM_xfree(pathname);
+            if(found_in_dir)
+                HGOTO_DONE(TRUE)    /* Indicate success */
+            pathname = (char *)H5MM_xfree(pathname);
         } /* end if */
     } /* end while */
 
 done:
-    if(dirp) 
+    if(dirp)
         if(HDclosedir(dirp) < 0)
             HDONE_ERROR(H5E_FILE, H5E_CLOSEERROR, FAIL, "can't close directory: %s", HDstrerror(errno))
-    if(pathname) 
-        pathname = (char *)H5MM_xfree(pathname);
+    pathname = (char *)H5MM_xfree(pathname);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5PL__find() */
@@ -563,20 +831,16 @@ H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, const void **info)
 
             if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
                 HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
-            if(found_in_dir) {
-                /* Indicate success */
-                HGOTO_DONE(TRUE)
-            } /* end if */
-            else
-                HDassert(pathname);
-                pathname = (char *)H5MM_xfree(pathname);
+            if(found_in_dir)
+                HGOTO_DONE(TRUE)    /* Indicate success */
+            pathname = (char *)H5MM_xfree(pathname);
         } /* end if */
     } while(FindNextFileA(hFind, &fdFile)); /* Find the next file. */
 
 done:
-    if(hFind) 
+    if(hFind)
         FindClose(hFind);
-    if(pathname) 
+    if(pathname)
         pathname = (char *)H5MM_xfree(pathname);
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -588,10 +852,10 @@ done:
  * Function:    H5PL__open
  *
  * Purpose:     Iterates through all files to find the right plugin library.
- *              It loads the dynamic plugin library and keeps it on the list 
+ *              It loads the dynamic plugin library and keeps it on the list
  *              of loaded libraries.
  *
- * Return:      TRUE on success, 
+ * Return:      TRUE on success,
  *              FALSE on not found,
  *              negative on failure
  *
@@ -657,7 +921,7 @@ H5PL__open(H5PL_type_t pl_type, char *libname, int pl_id, const void **pl_info)
 
                 /* Set the plugin info to return */
                 *pl_info = (const void *)plugin_info;
-     
+
                 /* Indicate success */
                 ret_value = TRUE;
             } /* end if */
@@ -678,7 +942,7 @@ done:
  * Purpose:     Search in the list of already opened dynamic libraries
  *              to see if the one we are looking for is already opened.
  *
- * Return:      TRUE on success, 
+ * Return:      TRUE on success,
  *              FALSE on not found,
  *              Negative on failure
  *
@@ -704,7 +968,7 @@ H5PL__search_table(H5PL_type_t plugin_type, int type_id, const void **info)
                 const H5Z_class2_t   *plugin_info;
 
                 if(NULL == (get_plugin_info = (H5PL_get_plugin_info_t)H5PL_GET_LIB_FUNC((H5PL_table_g[i]).handle, "H5PLget_plugin_info")))
-                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get function for H5PLget_plugin_info")
+                    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get function for H5PLget_plugin_info")
 
                 if(NULL == (plugin_info = (const H5Z_class2_t *)(*get_plugin_info)()))
                     HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get plugin info")
@@ -723,7 +987,7 @@ done:
 /*-------------------------------------------------------------------------
  * Function:    H5PL__close
  *
- * Purpose:     Closes the handle for dynamic library	
+ * Purpose:     Closes the handle for dynamic library
  *
  * Return:      Non-negative on success/Negative on failure
  *
@@ -738,7 +1002,7 @@ H5PL__close(H5PL_HANDLE handle)
     FUNC_ENTER_STATIC_NOERR
 
     H5PL_CLOSE_LIB(handle);
-   
+
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5PL__close() */
 
diff --git a/src/H5PLextern.h b/src/H5PLextern.h
index 3264435..7547ad7 100644
--- a/src/H5PLextern.h
+++ b/src/H5PLextern.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5PLmodule.h b/src/H5PLmodule.h
index 0339737..b441aed 100644
--- a/src/H5PLmodule.h
+++ b/src/H5PLmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5PLpkg.h b/src/H5PLpkg.h
new file mode 100644
index 0000000..e356893
--- /dev/null
+++ b/src/H5PLpkg.h
@@ -0,0 +1,48 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#if !(defined H5PL_FRIEND || defined H5PL_MODULE)
+#error "Do not include this file outside the H5PL package!"
+#endif
+
+#ifndef _H5PLpkg_H
+#define _H5PLpkg_H
+
+/* Include private header file */
+#include "H5PLprivate.h"          /* Filter functions                */
+
+/* Other private headers needed by this file */
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+#define H5PL_MAX_PATH_NUM       16
+
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+#endif /* _H5PLpkg_H */
+
diff --git a/src/H5PLprivate.h b/src/H5PLprivate.h
index 77e115b..0ab8f8c 100644
--- a/src/H5PLprivate.h
+++ b/src/H5PLprivate.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Raymond Lu <songyulu at hdfgroup.org>
diff --git a/src/H5PLpublic.h b/src/H5PLpublic.h
index 0528945..9ce1fca 100644
--- a/src/H5PLpublic.h
+++ b/src/H5PLpublic.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Raymond Lu <songyulu at hdfgroup.org>
@@ -43,7 +41,14 @@ 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*/);
+H5_DLL herr_t H5PLappend(const char *plugin_path);
+H5_DLL herr_t H5PLprepend(const char *plugin_path);
+H5_DLL herr_t H5PLreplace(const char *plugin_path, unsigned int index);
+H5_DLL herr_t H5PLinsert(const char *plugin_path, unsigned int index);
+H5_DLL herr_t H5PLremove(unsigned int index);
+H5_DLL ssize_t H5PLget(unsigned int index, char *pathname/*out*/, size_t size);
+H5_DLL herr_t H5PLsize(unsigned int *listsize/*out*/);
 
 #ifdef __cplusplus
 }
diff --git a/src/H5Pacpl.c b/src/H5Pacpl.c
index bfed332..4368dd6 100644
--- a/src/H5Pacpl.c
+++ b/src/H5Pacpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Pdapl.c b/src/H5Pdapl.c
index c63bc84..3b0a8c5 100644
--- a/src/H5Pdapl.c
+++ b/src/H5Pdapl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -88,8 +86,6 @@
 #define H5D_ACS_EFILE_PREFIX_CMP                H5P__dapl_efile_pref_cmp
 #define H5D_ACS_EFILE_PREFIX_CLOSE              H5P__dapl_efile_pref_close
 
-
-
 /******************/
 /* Local Typedefs */
 /******************/
@@ -1107,10 +1103,10 @@ done:
 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 */
+    H5P_genplist_t *plist;      	/* Property list pointer */
+    H5D_append_flush_t info;            /* Property for append flush parameters */
+    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);
@@ -1121,7 +1117,7 @@ H5Pset_append_flush(hid_t plist_id, unsigned ndims, const hsize_t *boundary, H5D
     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")
+        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. */
diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c
index f729e68..3b4c159 100644
--- a/src/H5Pdcpl.c
+++ b/src/H5Pdcpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -774,12 +772,6 @@ H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2,
     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)
-
     /* Compare non-dataset-specific fields in layout info */
     switch(layout1->type) {
         case H5D_COMPACT:
@@ -1651,14 +1643,6 @@ H5P__dcrt_ext_file_list_cmp(const void *_efl1, const void *_efl2,
     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);
diff --git a/src/H5Pdeprec.c b/src/H5Pdeprec.c
index ecf2bea..7f96333 100644
--- a/src/H5Pdeprec.c
+++ b/src/H5Pdeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -488,5 +486,135 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_version() */
 
+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_file_space
+ *
+ * Purpose:	    It is mapped to H5Pset_file_space_strategy().
+ *
+ * Return:	    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Jan 2017
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_file_space(hid_t plist_id, H5F_file_space_type_t strategy, hsize_t threshold)
+{
+
+    H5F_fspace_strategy_t new_strategy;                     /* File space strategy type */
+    hbool_t new_persist = H5F_FREE_SPACE_PERSIST_DEF;       /* Persisting free-space or not */
+    hsize_t new_threshold = H5F_FREE_SPACE_THRESHOLD_DEF;   /* Free-space section threshold */
+    H5F_file_space_type_t in_strategy = strategy;           /* Input strategy */
+    hsize_t in_threshold = threshold;                       /* Input threshold */
+    herr_t ret_value = SUCCEED;                             /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iFfh", plist_id, strategy, threshold);
+
+    if((unsigned)in_strategy >= H5F_FILE_SPACE_NTYPES)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid strategy")
+    /*
+     *  For 1.10.0 H5Pset_file_space:
+     *      If strategy is zero, the property is not changed; 
+     *      the existing strategy is retained.
+     *      If threshold is zero, the property is not changed; 
+     *      the existing threshold is retained.
+     */
+    if(!in_strategy)
+        H5Pget_file_space(plist_id, &in_strategy, NULL);
+    if(!in_threshold)
+        H5Pget_file_space(plist_id, NULL, &in_threshold);
+
+    switch(in_strategy) {
+        case H5F_FILE_SPACE_ALL_PERSIST:
+            new_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+            new_persist = TRUE;
+            new_threshold = in_threshold;
+            break;
+    
+        case H5F_FILE_SPACE_ALL:
+            new_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+            new_threshold = in_threshold;
+            break;
+
+        case H5F_FILE_SPACE_AGGR_VFD:
+            new_strategy = H5F_FSPACE_STRATEGY_AGGR;
+            break;
+
+        case H5F_FILE_SPACE_VFD:
+            new_strategy = H5F_FSPACE_STRATEGY_NONE;
+            break;
+        
+        case H5F_FILE_SPACE_NTYPES:
+        case H5F_FILE_SPACE_DEFAULT:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file space strategy")
+    }
+
+    if(H5Pset_file_space_strategy(plist_id, new_strategy, new_persist, new_threshold) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file space strategy")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_file_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_file_space
+ *
+ * Purpose:	    It is mapped to H5Pget_file_space_strategy().
+ *
+ * Return:	    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Jan 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_file_space(hid_t plist_id, H5F_file_space_type_t *strategy, hsize_t *threshold)
+{
+    H5F_fspace_strategy_t new_strategy;     /* File space strategy type */
+    hbool_t new_persist;                    /* Persisting free-space or not */
+    hsize_t new_threshold;                  /* Free-space section threshold */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*Ff*h", plist_id, strategy, threshold);
+
+    /* Get current file space info */
+    if(H5Pget_file_space_strategy(plist_id, &new_strategy, &new_persist, &new_threshold) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file space strategy")
+
+    /* Get value(s) */
+    if(strategy) {
+        switch(new_strategy) {
+
+            case H5F_FSPACE_STRATEGY_FSM_AGGR:
+                if(new_persist)
+                    *strategy = H5F_FILE_SPACE_ALL_PERSIST;
+                else
+                    *strategy = H5F_FILE_SPACE_ALL;
+            break;
+
+            case H5F_FSPACE_STRATEGY_AGGR:
+                *strategy = H5F_FILE_SPACE_AGGR_VFD;
+                break;
+
+            case H5F_FSPACE_STRATEGY_NONE:
+                *strategy = H5F_FILE_SPACE_VFD;
+                break;
+
+            case H5F_FSPACE_STRATEGY_PAGE:
+            case H5F_FSPACE_STRATEGY_NTYPES:
+            default:
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file space strategy")
+        }
+    }
+
+    if(threshold)
+        *threshold = new_threshold;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_file_space() */
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5Pdxpl.c b/src/H5Pdxpl.c
index ac57e26..fdb402f 100644
--- a/src/H5Pdxpl.c
+++ b/src/H5Pdxpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -173,7 +171,7 @@
 #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_DEF       H5AC_RING_USER
 #define H5AC_XFER_RING_ENC       H5P__encode_unsigned
 #define H5AC_XFER_RING_DEC       H5P__decode_unsigned
 #ifdef H5_DEBUG_BUILD
@@ -273,6 +271,7 @@ static const void *H5D_def_vlen_alloc_info_g = H5D_XFER_VLEN_ALLOC_INFO_DEF;   /
 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 haddr_t H5D_def_tag_g = H5AC_TAG_DEF;                              /* Default value for cache entry tag */
 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;
@@ -314,7 +313,6 @@ static const H5FD_dxpl_type_t H5D_dxpl_type_g = H5FD_NOIO_DXPL; /* Default value
 static herr_t
 H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
 {
-    H5C_tag_t tag = H5C_TAG_DEF;                                /* Default value for cache entry tag */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -326,7 +324,8 @@ H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
         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)
+    if(H5P_register_real(pclass, H5AC_TAG_NAME, H5AC_TAG_SIZE, &H5D_def_tag_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 buffer property */
diff --git a/src/H5Pencdec.c b/src/H5Pencdec.c
index 1bcd19c..73c48d7 100644
--- a/src/H5Pencdec.c
+++ b/src/H5Pencdec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
diff --git a/src/H5Pfapl.c b/src/H5Pfapl.c
index dbf7422..1b0a4b9 100644
--- a/src/H5Pfapl.c
+++ b/src/H5Pfapl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -80,18 +78,18 @@
 #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_DEF                 H5F_ALIGN_THRHD_DEF
 #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_DEF                       H5F_ALIGN_DEF
 #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_DEF             H5F_META_BLOCK_SIZE_DEF
 #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
@@ -103,7 +101,7 @@
 /* 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_DEF            H5F_SDATA_BLOCK_SIZE_DEF
 #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 */
@@ -208,7 +206,11 @@
 #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
-
+/* Definition for evict on close property */
+#define H5F_ACS_EVICT_ON_CLOSE_FLAG_SIZE                sizeof(hbool_t)
+#define H5F_ACS_EVICT_ON_CLOSE_FLAG_DEF                 FALSE
+#define H5F_ACS_EVICT_ON_CLOSE_FLAG_ENC                 H5P__encode_hbool_t
+#define H5F_ACS_EVICT_ON_CLOSE_FLAG_DEC                 H5P__decode_hbool_t
 #ifdef H5_HAVE_PARALLEL
 /* Definition of collective metadata read mode flag */
 #define H5F_ACS_COLL_MD_READ_FLAG_SIZE   sizeof(H5P_coll_md_read_flag_t)
@@ -221,6 +223,28 @@
 #define H5F_ACS_COLL_MD_WRITE_FLAG_ENC    H5P__encode_hbool_t
 #define H5F_ACS_COLL_MD_WRITE_FLAG_DEC    H5P__decode_hbool_t
 #endif /* H5_HAVE_PARALLEL */
+/* Definitions for the initial metadata cache image configuration */
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_SIZE sizeof(H5AC_cache_image_config_t)
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_DEF  H5AC__DEFAULT_CACHE_IMAGE_CONFIG
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_ENC  H5P__facc_cache_image_config_enc
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_DEC  H5P__facc_cache_image_config_dec
+#define H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_CMP  H5P__facc_cache_image_config_cmp
+/* Definition for total size of page buffer(bytes) */
+#define H5F_ACS_PAGE_BUFFER_SIZE_SIZE           sizeof(size_t)
+#define H5F_ACS_PAGE_BUFFER_SIZE_DEF            0
+#define H5F_ACS_PAGE_BUFFER_SIZE_ENC            H5P__encode_size_t
+#define H5F_ACS_PAGE_BUFFER_SIZE_DEC            H5P__decode_size_t
+/* Definition for minimum metadata size of page buffer(bytes) */
+#define H5F_ACS_PAGE_BUFFER_MIN_META_PERC_SIZE           sizeof(unsigned)
+#define H5F_ACS_PAGE_BUFFER_MIN_META_PERC_DEF            0
+#define H5F_ACS_PAGE_BUFFER_MIN_META_PERC_ENC            H5P__encode_unsigned
+#define H5F_ACS_PAGE_BUFFER_MIN_META_PERC_DEC            H5P__decode_unsigned
+/* Definition for minimum raw data size of page buffer(bytes) */
+#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_SIZE           sizeof(unsigned)
+#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_DEF            0
+#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_ENC            H5P__encode_unsigned
+#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_DEC            H5P__decode_unsigned
+
 
 /******************/
 /* Local Typedefs */
@@ -275,6 +299,11 @@ static herr_t H5P_facc_mdc_log_location_copy(const char *name, size_t size, void
 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);
 
+/* Metadata cache image property callbacks */
+static int H5P__facc_cache_image_config_cmp(const void *_config1, const void *_config2, size_t H5_ATTR_UNUSED size);
+static herr_t H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__facc_cache_image_config_dec(const void **_pp, void *_value);
+
 
 /*********************/
 /* Package Variables */
@@ -337,10 +366,15 @@ static const hbool_t H5F_def_clear_status_flags_g = H5F_ACS_CLEAR_STATUS_FLAGS_D
 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 */
+static const hbool_t H5F_def_evict_on_close_flag_g = H5F_ACS_EVICT_ON_CLOSE_FLAG_DEF;         /* Default setting for evict on close property */
 #ifdef H5_HAVE_PARALLEL
 static const H5P_coll_md_read_flag_t H5F_def_coll_md_read_flag_g = H5F_ACS_COLL_MD_READ_FLAG_DEF;  /* Default setting for the collective metedata read flag */
 static const hbool_t H5F_def_coll_md_write_flag_g = H5F_ACS_COLL_MD_WRITE_FLAG_DEF;  /* Default setting for the collective metedata write flag */
 #endif /* H5_HAVE_PARALLEL */
+static const H5AC_cache_image_config_t H5F_def_mdc_initCacheImageCfg_g = H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_DEF;  /* Default metadata cache image settings */
+static const size_t H5F_def_page_buf_size_g = H5F_ACS_PAGE_BUFFER_SIZE_DEF;      /* Default page buffer size */
+static const unsigned H5F_def_page_buf_min_meta_perc_g = H5F_ACS_PAGE_BUFFER_MIN_META_PERC_DEF;      /* Default page buffer minimum metadata size */
+static const unsigned H5F_def_page_buf_min_raw_perc_g = H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_DEF;      /* Default page buffer minumum raw data size */
 
 

 /*-------------------------------------------------------------------------
@@ -530,6 +564,12 @@ H5P__facc_reg_prop(H5P_genclass_t *pclass)
             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")
 
+    /* Register the evict on close flag */
+    if(H5P_register_real(pclass, H5F_ACS_EVICT_ON_CLOSE_FLAG_NAME, H5F_ACS_EVICT_ON_CLOSE_FLAG_SIZE, &H5F_def_evict_on_close_flag_g, 
+            NULL, NULL, NULL, H5F_ACS_EVICT_ON_CLOSE_FLAG_ENC, H5F_ACS_EVICT_ON_CLOSE_FLAG_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 metadata collective read flag */
     if(H5P_register_real(pclass, H5_COLL_MD_READ_FLAG_NAME, H5F_ACS_COLL_MD_READ_FLAG_SIZE, &H5F_def_coll_md_read_flag_g, 
@@ -544,6 +584,28 @@ H5P__facc_reg_prop(H5P_genclass_t *pclass)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 #endif /* H5_HAVE_PARALLEL */
 
+    /* Register the initial metadata cache image configuration */
+    if(H5P_register_real(pclass, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_SIZE, &H5F_def_mdc_initCacheImageCfg_g, 
+            NULL, NULL, NULL, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_ENC, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_DEC, 
+            NULL, NULL, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_CMP, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the size of the page buffer size */
+    if(H5P_register_real(pclass, H5F_ACS_PAGE_BUFFER_SIZE_NAME, H5F_ACS_PAGE_BUFFER_SIZE_SIZE, &H5F_def_page_buf_size_g, 
+            NULL, NULL, NULL, H5F_ACS_PAGE_BUFFER_SIZE_ENC, H5F_ACS_PAGE_BUFFER_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    /* Register the size of the page buffer minimum metadata size */
+    if(H5P_register_real(pclass, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_SIZE, &H5F_def_page_buf_min_meta_perc_g, 
+            NULL, NULL, NULL, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_ENC, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    /* Register the size of the page buffer minimum raw data size */
+    if(H5P_register_real(pclass, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_SIZE, &H5F_def_page_buf_min_raw_perc_g, 
+            NULL, NULL, NULL, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_ENC, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_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() */
@@ -846,7 +908,7 @@ done:
 const void *
 H5P_peek_driver_info(H5P_genplist_t *plist)
 {
-    void *ret_value = NULL;     /* Return value */
+    const void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -856,7 +918,7 @@ H5P_peek_driver_info(H5P_genplist_t *plist)
 
         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;
+        ret_value = driver_prop.driver_info;
     } /* end if */
     else
         HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, NULL, "not a file access property list")
@@ -885,11 +947,11 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-void *
+const void *
 H5Pget_driver_info(hid_t plist_id)
 {
-    H5P_genplist_t *plist;      /* Property list pointer */
-    void *ret_value;            /* Return value */
+    H5P_genplist_t *plist = NULL;       /* Property list pointer            */
+    const void *ret_value = NULL;       /* Return value                     */
 
     FUNC_ENTER_API(NULL)
     H5TRACE1("*x", "i", plist_id);
@@ -898,7 +960,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 = (void *)H5P_peek_driver_info(plist)))
+    if(NULL == (ret_value = (const void *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver info")
 
 done:
@@ -1532,6 +1594,101 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5Pset_mdc_image_config
+ *
+ * Purpose:	Set the initial metadata cache image configuration in the
+ *		target FAPL.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	J. Mainzer
+ *              Thursday, June 25, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_mdc_image_config(hid_t plist_id, H5AC_cache_image_config_t *config_ptr)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", plist_id, config_ptr);
+
+    /* 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")
+
+    /* validate the new configuration */
+    if(H5AC_validate_cache_image_config(config_ptr) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid metadata cache image configuration")
+
+    /* set the modified metadata cache image config */
+
+    /* If we ever support multiple versions of H5AC_cache_image_config_t, we
+     * will have to test the version and do translation here.
+     */
+
+    if(H5P_set(plist, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME, config_ptr) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set metadata cache image initial config")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_mdc_image_config() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mdc_image_config
+ *
+ * Purpose:	Retrieve the metadata cache initial image configuration
+ *		from the target FAPL.
+ *
+ *		Observe that the function will fail if config_ptr is
+ *		NULL, or if config_ptr->version specifies an unknown
+ *		version of H5AC_cache_image_config_t.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	J. Mainzer
+ *              Friday, June 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mdc_image_config(hid_t plist_id, H5AC_cache_image_config_t *config_ptr)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", plist_id, config_ptr);
+
+    /* 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")
+
+    /* validate the config_ptr */
+    if(config_ptr == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
+
+    if(config_ptr->version != H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown image config version.")
+
+    /* If we ever support multiple versions of H5AC_cache_config_t, we
+     * will have to get the cannonical version here, and then translate
+     * to the version of the structure supplied.
+     */
+
+    /* Get the current initial metadata cache resize configuration */
+    if(H5P_get(plist, H5F_ACS_META_CACHE_INIT_IMAGE_CONFIG_NAME, config_ptr) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get metadata cache initial image config")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_mdc_image_config() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5Pset_mdc_config
  *
  * Purpose:	Set the initial metadata cache resize configuration in the
@@ -2743,6 +2900,147 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function: H5P__facc_cache_image_config_cmp
+ *
+ * Purpose: Compare two cache image 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:     John Mainzer
+ *                 June 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__facc_cache_image_config_cmp(const void *_config1, const void *_config2, size_t H5_ATTR_UNUSED size)
+{
+    const H5AC_cache_image_config_t *config1 = (const H5AC_cache_image_config_t *)_config1; /* Create local aliases for values */
+    const H5AC_cache_image_config_t *config2 = (const H5AC_cache_image_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->generate_image < config2->generate_image) HGOTO_DONE(-1);
+    if(config1->generate_image > config2->generate_image) HGOTO_DONE(1);
+
+    if(config1->save_resize_status < config2->save_resize_status) HGOTO_DONE(-1);
+    if(config1->save_resize_status > config2->save_resize_status) HGOTO_DONE(1);
+
+    if(config1->entry_ageout < config2->entry_ageout) HGOTO_DONE(-1);
+    if(config1->entry_ageout > config2->entry_ageout) HGOTO_DONE(1);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_cache_image_config_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_cache_image_config_enc
+ *
+ * Purpose:        Callback routine which is called whenever the default
+ *                 cache image config property in the file creation 
+ *		   property list is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     John Mainzer
+ *                 June 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5AC_cache_image_config_t *config = (const H5AC_cache_image_config_t *)value; /* Create local aliases for value */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    if(NULL != *pp) {
+        /* Encode type sizes (as a safety check) */
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        INT32ENCODE(*pp, (int32_t)config->version);
+
+        H5_ENCODE_UNSIGNED(*pp, config->generate_image);
+
+        H5_ENCODE_UNSIGNED(*pp, config->save_resize_status);
+
+        INT32ENCODE(*pp, (int32_t)config->entry_ageout);
+    } /* end if */
+
+    /* Compute encoded size of fixed-size values */
+    *size += (1 + (2 * sizeof(unsigned)) + (2 * sizeof(int32_t)));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_cache_image_config_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_cache_image_config_dec
+ *
+ * Purpose:        Callback routine which is called whenever the default
+ *                 cache image config property in the file creation property 
+ *		   list is  decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     John Mainzer
+ *                 June 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_cache_image_config_dec(const void **_pp, void *_value)
+{
+    H5AC_cache_image_config_t *config = (H5AC_cache_image_config_t *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;
+    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_initCacheImageCfg_g, sizeof(H5AC_cache_image_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")
+
+    INT32DECODE(*pp, config->version);
+
+    H5_DECODE_UNSIGNED(*pp, config->generate_image);
+
+    H5_DECODE_UNSIGNED(*pp, config->save_resize_status);
+
+    INT32DECODE(*pp, config->entry_ageout);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_cache_image_config_dec() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5P__facc_file_image_info_set
  *
  * Purpose:     Copies a file image property when it's set for a property list
@@ -4061,6 +4359,97 @@ H5P_facc_mdc_log_location_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5P_facc_mdc_log_location_close() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_evict_on_close
+ *
+ * Purpose:     Sets the evict_on_close property value.
+ *
+ *              When this property is set, closing an HDF5 object will
+ *              cause the object's metadata cache entries to be flushed
+ *              and evicted from the cache.
+ *
+ *              Currently only implemented for datasets.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_evict_on_close(hid_t fapl_id, hbool_t evict_on_close)
+{
+    H5P_genplist_t *plist;          /* property list pointer */
+    herr_t ret_value = SUCCEED;     /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ib", fapl_id, evict_on_close);
+
+    /* Compare the property list's class against the other class */
+    if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "property list is not a file access plist")
+
+    /* Get the plist structure */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+#ifndef H5_HAVE_PARALLEL
+    /* Set value */
+    if(H5P_set(plist, H5F_ACS_EVICT_ON_CLOSE_FLAG_NAME, &evict_on_close) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set evict on close property")
+#else
+    HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "evict on close is currently not supported in parallel HDF5")
+#endif /* H5_HAVE_PARALLEL */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_evict_on_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_evict_on_close
+ *
+ * Purpose:     Gets the evict_on_close property value.
+ *
+ *              When this property is set, closing an HDF5 object will
+ *              cause the object's metadata cache entries to be flushed
+ *              and evicted from the cache.
+ *
+ *              Currently only implemented for datasets.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_evict_on_close(hid_t fapl_id, hbool_t *evict_on_close)
+{
+    H5P_genplist_t *plist;          /* property list pointer */
+    herr_t ret_value = SUCCEED;     /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*b", fapl_id, evict_on_close);
+
+    /* Compare the property list's class against the other class */
+    if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "property list is not an access plist")
+
+    /* Get the plist structure */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    if(H5P_get(plist, H5F_ACS_EVICT_ON_CLOSE_FLAG_NAME, evict_on_close) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get evict on close property")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_evict_on_close() */
+
 #ifdef H5_HAVE_PARALLEL
 

 /*-------------------------------------------------------------------------
@@ -4328,3 +4717,93 @@ done:
 } /* end H5Pget_coll_metadata_write() */
 #endif /* H5_HAVE_PARALLEL */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_page_buffer_size
+ *
+ * Purpose:     Set the maximum page buffering size. This has to be a
+ *              multiple of the page allocation size which must be enabled;
+ *              otherwise file create/open will fail.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *              June 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_page_buffer_size(hid_t plist_id, size_t buf_size, unsigned min_meta_perc, unsigned min_raw_perc)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "izIuIu", plist_id, buf_size, min_meta_perc, min_raw_perc);
+
+    /* 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")
+
+    if(min_meta_perc > 100)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Minimum metadata fractions must be between 0 and 100 inclusive")
+    if(min_raw_perc > 100)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Minimum rawdata fractions must be between 0 and 100 inclusive")
+
+    if(min_meta_perc + min_raw_perc > 100)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Sum of minimum metadata and raw data fractions can't be bigger than 100");
+
+    /* Set size */
+    if(H5P_set(plist, H5F_ACS_PAGE_BUFFER_SIZE_NAME, &buf_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set page buffer size")
+    if(H5P_set(plist, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME, &min_meta_perc) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set percentage of min metadata entries")
+    if(H5P_set(plist, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME, &min_raw_perc) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set percentage of min rawdata entries")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_page_buffer_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_page_buffer_size
+ *
+ * Purpose:	Retrieves the maximum page buffer size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mohamad Chaarawi
+ *              June 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_page_buffer_size(hid_t plist_id, size_t *buf_size, unsigned *min_meta_perc, unsigned *min_raw_perc)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "i*z*Iu*Iu", plist_id, buf_size, min_meta_perc, min_raw_perc);
+
+    /* 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 size */
+
+    if(buf_size)
+        if(H5P_get(plist, H5F_ACS_PAGE_BUFFER_SIZE_NAME, buf_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get page buffer size")
+    if(min_meta_perc)
+        if(H5P_get(plist, H5F_ACS_PAGE_BUFFER_MIN_META_PERC_NAME, min_meta_perc) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get page buffer minimum metadata percent")
+    if(min_raw_perc)
+        if(H5P_get(plist, H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_NAME, min_raw_perc) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get page buffer minimum raw data percent")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_page_buffer_size() */
+
diff --git a/src/H5Pfcpl.c b/src/H5Pfcpl.c
index d451982..5383aae 100644
--- a/src/H5Pfcpl.c
+++ b/src/H5Pfcpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -97,14 +95,23 @@
 #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
+#define H5F_CRT_FILE_SPACE_STRATEGY_SIZE        sizeof(H5F_fspace_strategy_t)
+#define H5F_CRT_FILE_SPACE_STRATEGY_DEF         H5F_FILE_SPACE_STRATEGY_DEF
+#define H5F_CRT_FILE_SPACE_STRATEGY_ENC         H5P__fcrt_fspace_strategy_enc
+#define H5F_CRT_FILE_SPACE_STRATEGY_DEC         H5P__fcrt_fspace_strategy_dec
+#define H5F_CRT_FREE_SPACE_PERSIST_SIZE         sizeof(hbool_t)
+#define H5F_CRT_FREE_SPACE_PERSIST_DEF          H5F_FREE_SPACE_PERSIST_DEF
+#define H5F_CRT_FREE_SPACE_PERSIST_ENC          H5P__encode_hbool_t
+#define H5F_CRT_FREE_SPACE_PERSIST_DEC          H5P__decode_hbool_t
+#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
+/* Definitions for file space page size in support of level-2 page caching */
+#define H5F_CRT_FILE_SPACE_PAGE_SIZE_SIZE       sizeof(hsize_t)
+#define H5F_CRT_FILE_SPACE_PAGE_SIZE_DEF        H5F_FILE_SPACE_PAGE_SIZE_DEF
+#define H5F_CRT_FILE_SPACE_PAGE_SIZE_ENC        H5P__encode_hsize_t
+#define H5F_CRT_FILE_SPACE_PAGE_SIZE_DEC        H5P__decode_hsize_t
 
 
 /******************/
@@ -131,6 +138,8 @@ static herr_t H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, siz
 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);
+static herr_t H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__fcrt_fspace_strategy_dec(const void **_pp, void *_value);
 
 
 /*********************/
@@ -178,8 +187,10 @@ static const unsigned H5F_def_sohm_index_flags_g[H5O_SHMESG_MAX_NINDEXES]    = H
 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 H5F_fspace_strategy_t H5F_def_file_space_strategy_g = H5F_CRT_FILE_SPACE_STRATEGY_DEF;
+static const hbool_t H5F_def_free_space_persist_g = H5F_CRT_FREE_SPACE_PERSIST_DEF;
 static const hsize_t H5F_def_free_space_threshold_g = H5F_CRT_FREE_SPACE_THRESHOLD_DEF;
+static const hsize_t H5F_def_file_space_page_size_g = H5F_CRT_FILE_SPACE_PAGE_SIZE_DEF;
 
 
 

@@ -267,12 +278,24 @@ H5P_fcrt_reg_prop(H5P_genclass_t *pclass)
             NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
+    /* Register the free-space persist flag */
+    if(H5P_register_real(pclass, H5F_CRT_FREE_SPACE_PERSIST_NAME, H5F_CRT_FREE_SPACE_PERSIST_SIZE, &H5F_def_free_space_persist_g,
+            NULL, NULL, NULL, H5F_CRT_FREE_SPACE_PERSIST_ENC, H5F_CRT_FREE_SPACE_PERSIST_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")
 
+    /* Register the file space page size */
+    if(H5P_register_real(pclass, H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME, H5F_CRT_FILE_SPACE_PAGE_SIZE_SIZE, &H5F_def_file_space_page_size_g,
+            NULL, NULL, NULL, H5F_CRT_FILE_SPACE_PAGE_SIZE_ENC, H5F_CRT_FILE_SPACE_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_fcrt_reg_prop() */
@@ -1246,15 +1269,13 @@ H5Pget_shared_mesg_phase_change(hid_t plist_id, unsigned *max_list, unsigned *mi
     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 */
-    if (max_list) {
+    /* Get value(s) */
+    if(max_list)
         if(H5P_get(plist, H5F_CRT_SHMSG_LIST_MAX_NAME, max_list) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get list maximum");
-    }
-    if (min_btree) {
+    if(min_btree)
         if(H5P_get(plist, H5F_CRT_SHMSG_BTREE_MIN_NAME, min_btree) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get SOHM information");
-    }
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1262,15 +1283,12 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pset_file_space
+ * Function:	H5Pset_file_space_strategy
  *
- * 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.
+ * Purpose:	Sets the "strategy" that the library employs in managing file space
+ *		    Sets the "persist" value as to persist free-space or not
+ *		    Sets the "threshold" value that the free space manager(s) will use to track free space sections.
+ *          Ignore "persist" and "threshold" for strategies that do not use free-space managers
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -1279,15 +1297,16 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5Pset_file_space(hid_t plist_id, H5F_file_space_type_t strategy, hsize_t threshold)
+H5Pset_file_space_strategy(hid_t plist_id, H5F_fspace_strategy_t strategy, hbool_t persist, 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);
+    H5TRACE4("e", "iFfbh", plist_id, strategy, persist, threshold);
 
-    if((unsigned)strategy >= H5F_FILE_SPACE_NTYPES)
+    /* Check arguments */
+    if(strategy >= H5F_FSPACE_STRATEGY_NTYPES)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid strategy")
 
     /* Get the plist structure */
@@ -1295,24 +1314,28 @@ H5Pset_file_space(hid_t plist_id, H5F_file_space_type_t strategy, hsize_t thresh
         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")
+    if(H5P_set(plist, H5F_CRT_FILE_SPACE_STRATEGY_NAME, &strategy) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file space strategy")
+
+    /* Ignore persist and threshold settings for strategies that do not use FSM */
+    if(strategy ==  H5F_FSPACE_STRATEGY_FSM_AGGR || strategy == H5F_FSPACE_STRATEGY_PAGE) {
+        if(H5P_set(plist, H5F_CRT_FREE_SPACE_PERSIST_NAME, &persist) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set free-space persisting status")
+
+        if(H5P_set(plist, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, &threshold) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set free-space threshold")
+    } /* end if */
 
 done:
     FUNC_LEAVE_API(ret_value)
-} /* H5Pset_file_space() */
+} /* H5Pset_file_space_strategy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pget_file_space
+ * Function:	H5Pget_file_space_strategy
  *
- * 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.
+ * Purpose:	Retrieves the strategy, persist, and threshold that the library 
+ *          uses in managing file space.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -1321,13 +1344,13 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5Pget_file_space(hid_t plist_id, H5F_file_space_type_t *strategy, hsize_t *threshold)
+H5Pget_file_space_strategy(hid_t plist_id, H5F_fspace_strategy_t *strategy, hbool_t *persist, 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);
+    H5TRACE4("e", "i*Ff*b*h", plist_id, strategy, persist, threshold);
 
     /* Get the plist structure */
     if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
@@ -1337,11 +1360,158 @@ H5Pget_file_space(hid_t plist_id, H5F_file_space_type_t *strategy, hsize_t *thre
     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(persist)
+        if(H5P_get(plist, H5F_CRT_FREE_SPACE_PERSIST_NAME, persist) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get free-space persisting status")
     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() */
+} /* H5Pget_file_space_strategy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_fspace_strategy_enc
+ *
+ * Purpose:        Callback routine which is called whenever the free-space
+ *                 strategy property in the file creation property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, December 27, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5F_fspace_strategy_t *strategy = (const H5F_fspace_strategy_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(strategy);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode free-space strategy */
+        *(*pp)++ = (uint8_t)*strategy;
+
+    /* Size of free-space strategy */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__fcrt_fspace_strategy_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_fspace_strategy_dec
+ *
+ * Purpose:        Callback routine which is called whenever the free-space
+ *                 strategy property in the file creation property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, December 27, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_fspace_strategy_dec(const void **_pp, void *_value)
+{
+    H5F_fspace_strategy_t *strategy = (H5F_fspace_strategy_t *)_value;         /* Free-space strategy */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(strategy);
+
+    /* Decode free-space strategy */
+    *strategy = (H5F_fspace_strategy_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__fcrt_fspace_strategy_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_file_space_page_size
+ *
+ * Purpose:     Sets the file space page size for paged aggregation.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; August 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_file_space_page_size(hid_t plist_id, hsize_t fsp_size)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", plist_id, fsp_size);
+
+    /* 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")
+
+    if(fsp_size < H5F_FILE_SPACE_PAGE_SIZE_MIN)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "cannot set file space page size to less than 512")
+
+    /* Set the value*/
+    if(H5P_set(plist, H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME, &fsp_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set file space page size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_file_space_page_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_file_space_page_size
+ *
+ * Purpose:     Retrieves the file space page size for aggregating small metadata
+ *		or raw data in the parameter "fsp_size".
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; August 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_file_space_page_size(hid_t plist_id, hsize_t *fsp_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, fsp_size);
+
+    /* 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 */
+    if(fsp_size)
+        if(H5P_get(plist, H5F_CRT_FILE_SPACE_PAGE_SIZE_NAME, fsp_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file space page size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_file_space_page_size() */
 
diff --git a/src/H5Pfmpl.c b/src/H5Pfmpl.c
index de9fa3b..e858a79 100644
--- a/src/H5Pfmpl.c
+++ b/src/H5Pfmpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Pgcpl.c b/src/H5Pgcpl.c
index f028f7a..6f1fab1 100644
--- a/src/H5Pgcpl.c
+++ b/src/H5Pgcpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Pint.c b/src/H5Pint.c
index a222082..fe17a19 100644
--- a/src/H5Pint.c
+++ b/src/H5Pint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -524,7 +522,7 @@ H5P_term_package(void)
             if(nlist == 0 && nclass > 0) {
                 (void)H5I_clear_type(H5I_GENPROP_CLS, FALSE, FALSE);
 
-                /* Reset the default property lists, if they've been closed */
+                /* Reset the default property classes, if they've been closed */
                 if(H5I_nmembers(H5I_GENPROP_CLS) == 0) {
                         H5P_CLS_ROOT_g =
                         H5P_CLS_OBJECT_CREATE_g =
@@ -2997,7 +2995,7 @@ done:
     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
+        const void *value;      IN: Pointer to the value for the property
  RETURNS
     Returns non-negative on success, negative on failure.
  DESCRIPTION
diff --git a/src/H5Plapl.c b/src/H5Plapl.c
index a0ec7f1..18b81ac 100644
--- a/src/H5Plapl.c
+++ b/src/H5Plapl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Plcpl.c b/src/H5Plcpl.c
index f6e7793..6508a82 100644
--- a/src/H5Plcpl.c
+++ b/src/H5Plcpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Pmodule.h b/src/H5Pmodule.h
index ddf7c0f..d5c471a 100644
--- a/src/H5Pmodule.h
+++ b/src/H5Pmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Pocpl.c b/src/H5Pocpl.c
index 27044d5..0393f7f 100644
--- a/src/H5Pocpl.c
+++ b/src/H5Pocpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Pocpypl.c b/src/H5Pocpypl.c
index faa2a04..47bba05 100644
--- a/src/H5Pocpypl.c
+++ b/src/H5Pocpypl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Ppkg.h b/src/H5Ppkg.h
index 0fbd13d..13463ae 100644
--- a/src/H5Ppkg.h
+++ b/src/H5Ppkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -204,8 +202,6 @@ H5_DLL herr_t H5P_get_filter(const struct H5Z_filter_info_t *filter,
 #ifdef H5P_TESTING
 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 29fb919..a468464 100644
--- a/src/H5Pprivate.h
+++ b/src/H5Pprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index b5bde62..55b3877 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -234,7 +232,7 @@ H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size,
     void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
     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 H5Pset(hid_t plist_id, const char *name, void *value);
+H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, const 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);
@@ -300,8 +298,10 @@ 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);
+H5_DLL herr_t H5Pset_file_space_strategy(hid_t plist_id, H5F_fspace_strategy_t strategy, hbool_t persist, hsize_t threshold);
+H5_DLL herr_t H5Pget_file_space_strategy(hid_t plist_id, H5F_fspace_strategy_t *strategy, hbool_t *persist, hsize_t *threshold);
+H5_DLL herr_t H5Pset_file_space_page_size(hid_t plist_id, hsize_t fsp_size);
+H5_DLL herr_t H5Pget_file_space_page_size(hid_t plist_id, hsize_t *fsp_size);
 
 /* File access property list (FAPL) routines */
 H5_DLL herr_t H5Pset_alignment(hid_t fapl_id, hsize_t threshold,
@@ -311,7 +311,7 @@ H5_DLL herr_t H5Pget_alignment(hid_t fapl_id, hsize_t *threshold/*out*/,
 H5_DLL herr_t H5Pset_driver(hid_t plist_id, hid_t driver_id,
         const void *driver_info);
 H5_DLL hid_t H5Pget_driver(hid_t plist_id);
-H5_DLL void *H5Pget_driver_info(hid_t plist_id);
+H5_DLL const void *H5Pget_driver_info(hid_t plist_id);
 H5_DLL herr_t H5Pset_family_offset(hid_t fapl_id, hsize_t offset);
 H5_DLL herr_t H5Pget_family_offset(hid_t fapl_id, hsize_t *offset);
 H5_DLL herr_t H5Pset_multi_type(hid_t fapl_id, H5FD_mem_t type);
@@ -357,12 +357,18 @@ H5_DLL herr_t H5Pset_object_flush_cb(hid_t plist_id, H5F_flush_cb_t func, void *
 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);
+H5_DLL herr_t H5Pset_evict_on_close(hid_t fapl_id, hbool_t evict_on_close);
+H5_DLL herr_t H5Pget_evict_on_close(hid_t fapl_id, hbool_t *evict_on_close);
 #ifdef H5_HAVE_PARALLEL
 H5_DLL herr_t H5Pset_all_coll_metadata_ops(hid_t plist_id, hbool_t is_collective);
 H5_DLL herr_t H5Pget_all_coll_metadata_ops(hid_t plist_id, hbool_t *is_collective);
 H5_DLL herr_t H5Pset_coll_metadata_write(hid_t plist_id, hbool_t is_collective);
 H5_DLL herr_t H5Pget_coll_metadata_write(hid_t plist_id, hbool_t *is_collective);
 #endif /* H5_HAVE_PARALLEL */
+H5_DLL herr_t H5Pset_mdc_image_config(hid_t plist_id, H5AC_cache_image_config_t *config_ptr);
+H5_DLL herr_t H5Pget_mdc_image_config(hid_t plist_id, H5AC_cache_image_config_t *config_ptr /*out*/);
+H5_DLL herr_t H5Pset_page_buffer_size(hid_t plist_id, size_t buf_size, unsigned min_meta_per, unsigned min_raw_per);
+H5_DLL herr_t H5Pget_page_buffer_size(hid_t plist_id, size_t *buf_size, unsigned *min_meta_per, unsigned *min_raw_per);
 
 /* Dataset creation property list (DCPL) routines */
 H5_DLL herr_t H5Pset_layout(hid_t plist_id, H5D_layout_t layout);
@@ -530,6 +536,8 @@ H5_DLL herr_t H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id,
 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_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);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 #ifdef __cplusplus
diff --git a/src/H5Pstrcpl.c b/src/H5Pstrcpl.c
index 5a09cd7..fb91356 100644
--- a/src/H5Pstrcpl.c
+++ b/src/H5Pstrcpl.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Ptest.c b/src/H5Ptest.c
index 63708e7..475a164 100644
--- a/src/H5Ptest.c
+++ b/src/H5Ptest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -125,95 +123,3 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5P_open_class_path_test() */
 
-

-/*--------------------------------------------------------------------------
- NAME
-    H5P_reset_external_file_test
- PURPOSE
-    Routine to reset external file list
- USAGE
-    herr_t H5P_reset_external_file_test(plist)
-           hid_t dcpl_id; IN: the property list
-
- RETURNS
-    Non-negative on success/Negative on failure
-
- PROGRAMMER
-    Peter Cao
-    April 30, 2007
---------------------------------------------------------------------------*/
-herr_t
-H5P_reset_external_file_test(hid_t dcpl_id)
-{
-    H5O_efl_t       efl;                /* External file list */
-    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 external file list */
-    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 */
-    if(H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release external file list info")
-
-    /* set 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 43b0a91..73c1d55 100644
--- a/src/H5R.c
+++ b/src/H5R.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5RS.c b/src/H5RS.c
index 5bbdabd..0a3fff0 100644
--- a/src/H5RS.c
+++ b/src/H5RS.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5RSprivate.h b/src/H5RSprivate.h
index 757e0e4..f69624a 100644
--- a/src/H5RSprivate.h
+++ b/src/H5RSprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Rdeprec.c b/src/H5Rdeprec.c
index 9461327..109bbb4 100644
--- a/src/H5Rdeprec.c
+++ b/src/H5Rdeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Rmodule.h b/src/H5Rmodule.h
index 6799483..2eaf050 100644
--- a/src/H5Rmodule.h
+++ b/src/H5Rmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Rpkg.h b/src/H5Rpkg.h
index 8ed8d65..6d5036b 100644
--- a/src/H5Rpkg.h
+++ b/src/H5Rpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Rprivate.h b/src/H5Rprivate.h
index 60df636..7efa225 100644
--- a/src/H5Rprivate.h
+++ b/src/H5Rprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Rpublic.h b/src/H5Rpublic.h
index e990661..446b7cd 100644
--- a/src/H5Rpublic.h
+++ b/src/H5Rpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5S.c b/src/H5S.c
index 738a7da..dd390d9 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -37,7 +35,7 @@
 /* Local Macros */
 /****************/
 
-/* Version of datatype encoding */
+/* Version of dataspace encoding */
 #define H5S_ENCODE_VERSION      0
 
 
@@ -1550,7 +1548,7 @@ H5Sencode(hid_t obj_id, void *buf, size_t *nalloc)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
 
     if(H5S_encode(dspace, (unsigned char **)&buf, nalloc)<0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode dataspace")
 
 done:
     FUNC_LEAVE_API(ret_value)
diff --git a/src/H5SL.c b/src/H5SL.c
index 1cd64ec..c0934ca 100644
--- a/src/H5SL.c
+++ b/src/H5SL.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -1286,12 +1284,12 @@ done:
 void *
 H5SL_remove_first(H5SL_t *slist)
 {
-    void *ret_value = NULL;                     /* Return value */
-    H5SL_node_t *head = slist->header;          /* Skip list header */
-    H5SL_node_t *tmp = slist->header->forward[0]; /* Temporary node pointer */
-    H5SL_node_t *next;                          /* Next node to search for */
-    size_t      level = slist->curr_level;      /* Skip list level */
-    size_t      i;                              /* Index */
+    void        *ret_value = NULL;                  /* Return value             */
+    H5SL_node_t *head = slist->header;              /* Skip list header         */
+    H5SL_node_t *tmp = slist->header->forward[0];   /* Temporary node pointer   */
+    H5SL_node_t *next;                              /* Next node to search for  */
+    size_t      level;                              /* Skip list level          */
+    size_t      i;                                  /* Index                    */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1301,6 +1299,10 @@ H5SL_remove_first(H5SL_t *slist)
     /* Not currently supported */
     HDassert(!slist->safe_iterating);
 
+    /* Assign level */
+    H5_CHECK_OVERFLOW(slist->curr_level, int, size_t);
+    level = (size_t)slist->curr_level;
+
     /* Check internal consistency */
     /* (Pre-condition) */
 
diff --git a/src/H5SLmodule.h b/src/H5SLmodule.h
index d5bfbc2..34f08a1 100644
--- a/src/H5SLmodule.h
+++ b/src/H5SLmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5SLprivate.h b/src/H5SLprivate.h
index 856099b..1393a25 100644
--- a/src/H5SLprivate.h
+++ b/src/H5SLprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5SM.c b/src/H5SM.c
index 0b72e40..d5ede7e 100644
--- a/src/H5SM.c
+++ b/src/H5SM.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
@@ -144,11 +142,11 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d
     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)
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_USER, &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)))
+    if(NULL == (table = H5FL_CALLOC(H5SM_master_table_t)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTALLOC, FAIL, "memory allocation failed for SOHM table")
     table->num_indexes = H5F_SOHM_NINDEXES(f);
     table->table_size = H5SM_TABLE_SIZE(f);
@@ -657,7 +655,7 @@ H5SM_create_list(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
     num_entries = header->list_max;
 
     /* Allocate list in memory */
-    if(NULL == (list = H5FL_MALLOC(H5SM_list_t)))
+    if(NULL == (list = H5FL_CALLOC(H5SM_list_t)))
 	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
     if(NULL == (list->messages = (H5SM_sohm_t *)H5FL_ARR_CALLOC(H5SM_sohm_t, num_entries)))
 	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
@@ -2021,7 +2019,7 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id)
         cache_udata.f = f;
 
         /* Set the ring type in the DXPL */
-        if(H5AC_set_ring(dxpl_id, H5AC_RING_US, &dxpl, &orig_ring) < 0)
+        if(H5AC_set_ring(dxpl_id, H5AC_RING_USER, &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 */
@@ -2436,7 +2434,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_ONLY_FLAG)))
+            if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC__READ_ONLY_FLAG, FALSE)))
 	        HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load object header")
         } /* end if */
         else
@@ -2467,7 +2465,7 @@ done:
     if(oh && oh != open_oh) {
         if(oh && H5O_unprotect(&oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
             HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
-        if(H5O_close(&oloc) < 0)
+        if(H5O_close(&oloc, NULL) < 0)
             HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "unable to close object header")
     } /* end if */
 
diff --git a/src/H5SMbtree2.c b/src/H5SMbtree2.c
index 0110c1e..f0c4963 100644
--- a/src/H5SMbtree2.c
+++ b/src/H5SMbtree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5SMcache.c b/src/H5SMcache.c
index ff2b09f..f0b469a 100644
--- a/src/H5SMcache.c
+++ b/src/H5SMcache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -58,26 +56,20 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-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 herr_t H5SM__cache_table_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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 herr_t H5SM__cache_list_get_initial_load_size(void *udata, size_t *image_len);
 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_image_len(const void *thing, size_t *image_len);
 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);
@@ -93,7 +85,8 @@ const H5AC_class_t H5AC_SOHM_TABLE[1] = {{
     "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_get_initial_load_size,    /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -101,7 +94,6 @@ const H5AC_class_t H5AC_SOHM_TABLE[1] = {{
     H5SM__cache_table_serialize,        /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5SM__cache_table_free_icr,         /* 'free_icr' callback */
-    NULL,			        /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -110,7 +102,8 @@ const H5AC_class_t H5AC_SOHM_LIST[1] = {{
     "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_get_initial_load_size,     /* 'get_initial_load_size' callback */
+    NULL,				/* 'get_final_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 */
@@ -118,7 +111,6 @@ const H5AC_class_t H5AC_SOHM_LIST[1] = {{
     H5SM__cache_list_serialize,         /* 'serialize' callback */
     NULL,                               /* 'notify' callback */
     H5SM__cache_list_free_icr,          /* 'free_icr' callback */
-    NULL,			        /* 'clear' callback */
     NULL,                               /* 'fsf_size' callback */
 }};
 
@@ -135,11 +127,10 @@ const H5AC_class_t H5AC_SOHM_LIST[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5SM__cache_table_get_load_size()
+ * Function:    H5SM__cache_table_get_initial_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.
+ *		Message indexes on disk.
  *
  * Return:      Success:        SUCCEED
  *              Failure:        FAIL
@@ -150,11 +141,8 @@ const H5AC_class_t H5AC_SOHM_LIST[1] = {{
  *-------------------------------------------------------------------------
  */
 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)
+H5SM__cache_table_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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
@@ -164,15 +152,11 @@ H5SM__cache_table_get_load_size(const void *_image, void *_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);
-    }
+    /* Set the image length size */
+    *image_len = H5SM_TABLE_SIZE(udata->f);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM__cache_table_get_load_size() */
+} /* end H5SM__cache_table_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -309,7 +293,6 @@ H5SM__cache_table_deserialize(const void *_image, size_t len, void *_udata,
 
 	/* 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 */
@@ -348,8 +331,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5SM__cache_table_image_len(const void *_thing, size_t *image_len)
 {
     const H5SM_master_table_t *table = (const H5SM_master_table_t *)_thing;     /* Shared message table to query */
 
@@ -366,10 +348,6 @@ H5SM__cache_table_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5SM__cache_table_image_len() */
 
-/***************************************/
-/* no H5SM_cache_table_pre_serialize() */
-/***************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5SM__cache_table_serialize
@@ -498,7 +476,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5SM__cache_list_get_load_size()
+ * Function:    H5SM__cache_list_get_initial_load_size()
  *
  * 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
@@ -513,11 +491,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5SM__cache_list_get_initial_load_size(void *_udata, size_t *image_len)
 {
-    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 */
 
     FUNC_ENTER_STATIC_NOERR
@@ -528,15 +503,11 @@ H5SM__cache_list_get_load_size(const void *_image, void *_udata,
     HDassert(udata->header->list_size > 0);
     HDassert(image_len);
 
-    if(image == NULL)
-	*image_len = udata->header->list_size;
-    else {
-	HDassert(actual_len);
-        HDassert(*actual_len == *image_len);
-    }
+    /* Set the image length size */
+    *image_len = udata->header->list_size;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM__cache_list_get_load_size() */
+} /* end H5SM__cache_list_get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -682,8 +653,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-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)
+H5SM__cache_list_image_len(const void *_thing, size_t *image_len)
 {
     const H5SM_list_t *list = (const H5SM_list_t *)_thing;      /* Shared message list to query */
 
@@ -701,10 +671,6 @@ H5SM__cache_list_image_len(const void *_thing, size_t *image_len,
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5SM__cache_list_image_len() */
 
-/**************************************/
-/* no H5SM_cache_list_pre_serialize() */
-/**************************************/
-
 

 /*-------------------------------------------------------------------------
  * Function:    H5SM__cache_list_serialize
diff --git a/src/H5SMmessage.c b/src/H5SMmessage.c
index 92b6a75..7df9f8f 100644
--- a/src/H5SMmessage.c
+++ b/src/H5SMmessage.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5SMmodule.h b/src/H5SMmodule.h
index b6991b6..656c7dd 100644
--- a/src/H5SMmodule.h
+++ b/src/H5SMmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h
index 3b13e23..6dea7ae 100644
--- a/src/H5SMpkg.h
+++ b/src/H5SMpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -256,8 +254,6 @@ H5FL_ARR_EXTERN(H5SM_index_header_t);
 H5FL_EXTERN(H5SM_list_t);
 H5FL_ARR_EXTERN(H5SM_sohm_t);
 
-H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1];
-H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1];
 H5_DLLVAR const H5B2_class_t H5SM_INDEX[1];
 
 /****************************/
diff --git a/src/H5SMprivate.h b/src/H5SMprivate.h
index 57afacf..8f9f533 100644
--- a/src/H5SMprivate.h
+++ b/src/H5SMprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5SMtest.c b/src/H5SMtest.c
index 798203d..6a4b63a 100644
--- a/src/H5SMtest.c
+++ b/src/H5SMtest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5ST.c b/src/H5ST.c
index 7b61aa1..dd5b63c 100644
--- a/src/H5ST.c
+++ b/src/H5ST.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* TERNARY SEARCH TREE ALGS
@@ -23,6 +21,10 @@ Bentley and Robert Sedgewick in the April, 1998, Dr. Dobb's Journal.
 #include "H5FLprivate.h"	/* Free lists                           */
 #include "H5STprivate.h"        /* Ternary search trees                 */
 
+#ifdef H5ST_DEBUG
+static herr_t H5ST__dump_internal(H5ST_ptr_t p);
+#endif /* H5ST_DEBUG */
+
 /* Declare a free list to manage the H5ST_node_t struct */
 H5FL_DEFINE_STATIC(H5ST_node_t);
 
@@ -719,7 +721,7 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
-    H5ST_dump_internal
+    H5ST__dump_internal
  PURPOSE
     Dump all the nodes of a TST
  USAGE
@@ -735,30 +737,30 @@ done:
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-herr_t
-H5ST_dump_internal(H5ST_ptr_t p)
+static herr_t
+H5ST__dump_internal(H5ST_ptr_t p)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     if(p) {
-        printf("p=%p\n", p);
-        printf("\tp->up=%p\n", p->up);
-        printf("\tp->parent=%p\n", p->parent);
-        printf("\tp->lokid=%p\n", p->lokid);
-        printf("\tp->hikid=%p\n", p->hikid);
-        printf("\tp->eqkid=%p\n", p->eqkid);
+        printf("p=%p\n", (void *)p);
+        printf("\tp->up=%p\n", (void *)p->up);
+        printf("\tp->parent=%p\n", (void *)p->parent);
+        printf("\tp->lokid=%p\n", (void *)p->lokid);
+        printf("\tp->hikid=%p\n", (void *)p->hikid);
+        printf("\tp->eqkid=%p\n", (void *)p->eqkid);
         printf("\tp->splitchar=%c\n", p->splitchar);
 
-        H5ST_dump_internal(p->lokid);
+        H5ST__dump_internal(p->lokid);
         if(p->splitchar)
-            H5ST_dump_internal(p->eqkid);
+            H5ST__dump_internal(p->eqkid);
         else
             printf("%s\n", (char *)p->eqkid);
-        H5ST_dump_internal(p->hikid);
+        H5ST__dump_internal(p->hikid);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5ST_dump_internal() */
+} /* end H5ST__dump_internal() */
 
 

 /*--------------------------------------------------------------------------
@@ -785,7 +787,7 @@ H5ST_dump(H5ST_tree_t *tree)
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* Dump the tree */
-    H5ST_dump_internal(tree->root);
+    H5ST__dump_internal(tree->root);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5ST_dump() */
diff --git a/src/H5STprivate.h b/src/H5STprivate.h
index 9b49b07..07e9afe 100644
--- a/src/H5STprivate.h
+++ b/src/H5STprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Sall.c b/src/H5Sall.c
index fb6b45f..710727b 100644
--- a/src/H5Sall.c
+++ b/src/H5Sall.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Sdbg.c b/src/H5Sdbg.c
index b69604c..c9103f7 100644
--- a/src/H5Sdbg.c
+++ b/src/H5Sdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Shyper.c b/src/H5Shyper.c
index fe013a7..e6e6cff 100644
--- a/src/H5Shyper.c
+++ b/src/H5Shyper.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -145,6 +143,9 @@ H5FL_DEFINE_STATIC(H5S_hyper_span_t);
 /* Declare a free list to manage the H5S_hyper_span_info_t struct */
 H5FL_DEFINE_STATIC(H5S_hyper_span_info_t);
 
+/* Declare extern free list to manage the H5S_sel_iter_t struct */
+H5FL_EXTERN(H5S_sel_iter_t);
+
 /* #define H5S_HYPER_DEBUG */
 #ifdef H5S_HYPER_DEBUG
 static herr_t
@@ -9288,7 +9289,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_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 */
+    H5S_sel_iter_t      *ss_iter = NULL; /* 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 */
@@ -9296,7 +9297,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *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 */
+    H5S_sel_iter_t      *ds_iter = NULL; /* 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 */
@@ -9305,7 +9306,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_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 */
+    H5S_sel_iter_t      *sis_iter = NULL; /* 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 */
@@ -9384,35 +9385,47 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
     /* Set unlim_dim */
     proj_space->select.sel_info.hslab->unlim_dim = -1;
 
+    /* Allocate the source space iterator */
+    if(NULL == (ss_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate source space iterator")
+
     /* Initialize source space iterator */
-    if(H5S_select_iter_init(&ss_iter, src_space, (size_t)1) < 0)
+    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)
+    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);
 
+    /* Allocate the destination space iterator */
+    if(NULL == (ds_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate destination space iterator")
+
     /* Initialize destination space iterator */
-    if(H5S_select_iter_init(&ds_iter, dst_space, (size_t)1) < 0)
+    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)
+    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);
 
+    /* Allocate the source intersect space iterator */
+    if(NULL == (sis_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate source intersect space iterator")
+
     /* Initialize source intersect space iterator */
-    if(H5S_select_iter_init(&sis_iter, src_intersect_space, (size_t)1) < 0)
+    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)
+    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);
@@ -9427,7 +9440,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
             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)
+                    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);
 
@@ -9459,7 +9472,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
                     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)
+                        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);
 
@@ -9511,7 +9524,7 @@ H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
                         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)
+                        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);
 
@@ -9625,19 +9638,22 @@ loop_end:
 
 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")
+    if(ss_iter_init && H5S_SELECT_ITER_RELEASE(ss_iter) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(ss_iter)
+        ss_iter = H5FL_FREE(H5S_sel_iter_t, ss_iter);
 
     /* 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")
+    if(ds_iter_init && H5S_SELECT_ITER_RELEASE(ds_iter) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(ds_iter)
+        ds_iter = H5FL_FREE(H5S_sel_iter_t, ds_iter);
 
     /* 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")
+    if(sis_iter_init && H5S_SELECT_ITER_RELEASE(sis_iter) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(sis_iter)
+        sis_iter = H5FL_FREE(H5S_sel_iter_t, sis_iter);
 
     /* Cleanup on error */
     if(ret_value < 0) {
diff --git a/src/H5Smodule.h b/src/H5Smodule.h
index d4d94f2..962f0a2 100644
--- a/src/H5Smodule.h
+++ b/src/H5Smodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Smpio.c b/src/H5Smpio.c
index 1f97bc8..c24c455 100644
--- a/src/H5Smpio.c
+++ b/src/H5Smpio.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Snone.c b/src/H5Snone.c
index 3492325..104b0bb 100644
--- a/src/H5Snone.c
+++ b/src/H5Snone.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Spkg.h b/src/H5Spkg.h
index e57650a..315af29 100644
--- a/src/H5Spkg.h
+++ b/src/H5Spkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Spoint.c b/src/H5Spoint.c
index 0f85110..251a063 100644
--- a/src/H5Spoint.c
+++ b/src/H5Spoint.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -1125,10 +1123,10 @@ H5S_point_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
             if(((hssize_t)node->pnt[u] + space->select.offset[u]) < 0)
                 HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "offset moves selection out of bounds")
 
-            if(start[u] > (node->pnt[u] + space->select.offset[u]))
-                start[u] = node->pnt[u] + space->select.offset[u];
-            if(end[u] < (node->pnt[u] + space->select.offset[u]))
-                end[u] = node->pnt[u] + space->select.offset[u];
+            if(start[u] > (hsize_t)((hssize_t)node->pnt[u] + space->select.offset[u]))
+                start[u] = (hsize_t)((hssize_t)node->pnt[u] + space->select.offset[u]);
+            if(end[u] < (hsize_t)((hssize_t)node->pnt[u] + space->select.offset[u]))
+                end[u] = (hsize_t)((hssize_t)node->pnt[u] + space->select.offset[u]);
         } /* end for */
         node = node->next;
       } /* end while */
@@ -1703,7 +1701,7 @@ H5S_point_get_seq_list(const H5S_t *space, unsigned flags, H5S_sel_iter_t *iter,
     while(NULL != node) {
         /* Compute the offset of each selected point in the buffer */
         for(i = ndims - 1, acc = iter->elmt_size, loc = 0; i >= 0; i--) {
-            loc += (node->pnt[i] + space->select.offset[i]) * acc;
+            loc += (hsize_t)((hssize_t)node->pnt[i] + space->select.offset[i]) * acc;
             acc *= dims[i];
         } /* end for */
 
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index b00dc6b..60e0630 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -183,8 +181,8 @@ typedef struct H5S_sel_iter_op_t {
 #define H5S_SELECT_IS_SINGLE(S)         (H5S_select_is_single(S))
 #define H5S_SELECT_IS_REGULAR(S)        (H5S_select_is_regular(S))
 #define H5S_SELECT_ADJUST_U(S,O)        (H5S_select_adjust_u(S, O))
-#define H5S_SELECT_PROJECT_SCALAR(S,O)  (H5S_select_project_scalar)(S, O))
-#define H5S_SELECT_PROJECT_SIMPLE(S,NS,O) (H5S_select_project_simple)(S, NS, O))
+#define H5S_SELECT_PROJECT_SCALAR(S,O)  (H5S_select_project_scalar(S, O))
+#define H5S_SELECT_PROJECT_SIMPLE(S,NS,O) (H5S_select_project_simple(S, NS, O))
 #define H5S_SELECT_ITER_COORDS(ITER,COORDS)     (H5S_select_iter_coords(ITER,COORDS))
 #define H5S_SELECT_ITER_BLOCK(ITER,START,END)   (H5S_select_iter_block(ITER,START,END))
 #define H5S_SELECT_ITER_NELMTS(ITER)    (H5S_select_iter_nelmts(ITER))
diff --git a/src/H5Spublic.h b/src/H5Spublic.h
index 721c4bf..5ed6249 100644
--- a/src/H5Spublic.h
+++ b/src/H5Spublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Sselect.c b/src/H5Sselect.c
index d4a4d69..c34e1cc 100644
--- a/src/H5Sselect.c
+++ b/src/H5Sselect.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.ued>
@@ -39,6 +37,15 @@ static htri_t H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter);
 static herr_t H5S_select_iter_next_block(H5S_sel_iter_t *iter);
 #endif /* LATER */
 
+/* Declare a free list to manage the H5S_sel_iter_t struct */
+H5FL_DEFINE(H5S_sel_iter_t);
+
+/* Declare extern free list to manage sequences of size_t */
+H5FL_SEQ_EXTERN(size_t);
+
+/* Declare extern free list to manage sequences of hsize_t */
+H5FL_SEQ_EXTERN(hsize_t);
+
 
 

 /*--------------------------------------------------------------------------
@@ -1364,8 +1371,10 @@ 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)
 {
-    H5S_sel_iter_t iter;        /* Selection iteration info */
+    H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
     hbool_t iter_init = FALSE;  /* Selection iteration info has been initialized */
+    hsize_t *off = NULL;        /* Array to store sequence offsets */
+    size_t *len = NULL;         /* Array to store sequence lengths */
     hssize_t nelmts;            /* Number of elements in selection */
     hsize_t space_size[H5O_LAYOUT_NDIMS]; /* Dataspace size */
     size_t max_elem;            /* Maximum number of elements allowed in sequences */
@@ -1386,8 +1395,12 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
     if(0 == (elmt_size = H5T_get_size(type)))
         HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "datatype size invalid")
 
+    /* Allocate the selection iterator */
+    if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+
     /* Initialize iterator */
-    if(H5S_select_iter_init(&iter, space, elmt_size) < 0)
+    if(H5S_select_iter_init(iter, space, elmt_size) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
     iter_init = TRUE;	/* Selection iteration info has been initialized */
 
@@ -1408,16 +1421,20 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
     /* Compute the maximum number of bytes required */
     H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
 
+    /* Allocate the offset & length arrays */
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate offset vector array")
+
     /* Loop, while elements left in selection */
     while(max_elem > 0 && user_ret == 0) {
-        hsize_t off[H5D_IO_VECTOR_SIZE];        /* Array to store sequence offsets */
-        size_t len[H5D_IO_VECTOR_SIZE];         /* Array to store sequence lengths */
         size_t nelem;               /* Number of elements used in sequences */
         size_t nseq;                /* Number of sequences generated */
         size_t curr_seq;            /* Current sequence being worked on */
 
         /* Get the sequences of bytes */
-        if(H5S_SELECT_GET_SEQ_LIST(space, 0, &iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
 
         /* Loop, while sequences left to process */
@@ -1477,9 +1494,17 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
     ret_value = user_ret;
 
 done:
+    /* Release resources, if allocated */
+    if(len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
     /* Release selection iterator */
-    if(iter_init && H5S_SELECT_ITER_RELEASE(&iter) < 0)
+    if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
         HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(iter)
+        iter = H5FL_FREE(H5S_sel_iter_t, iter);
 
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5S_select_iterate() */
@@ -1583,8 +1608,8 @@ H5S_get_select_type(const H5S_t *space)
 htri_t
 H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
 {
-    H5S_sel_iter_t iter_a;    /* Selection a iteration info */
-    H5S_sel_iter_t iter_b;    /* Selection b iteration info */
+    H5S_sel_iter_t *iter_a = NULL;  /* Selection a iteration info */
+    H5S_sel_iter_t *iter_b = NULL;  /* Selection b iteration info */
     hbool_t iter_a_init = 0;  /* Selection a iteration info has been initialized */
     hbool_t iter_b_init = 0;  /* Selection b iteration info has been initialized */
     htri_t ret_value = TRUE; /* Return value */
@@ -1729,15 +1754,21 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
             hsize_t off_b[H5O_LAYOUT_NDIMS];   /* Offset of selection b blocks */
             hbool_t first_block = TRUE;        /* Flag to indicate the first block */
 
+            /* Allocate the selection iterators */
+            if(NULL == (iter_a = H5FL_MALLOC(H5S_sel_iter_t)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+            if(NULL == (iter_b = H5FL_MALLOC(H5S_sel_iter_t)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+
             /* Initialize iterator for each dataspace selection
              * Use '0' for element size instead of actual element size to indicate
              * that the selection iterator shouldn't be "flattened", since we
              * aren't actually going to be doing I/O with the iterators.
              */
-            if(H5S_select_iter_init(&iter_a, space_a, (size_t)0) < 0)
+            if(H5S_select_iter_init(iter_a, space_a, (size_t)0) < 0)
                 HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator a")
             iter_a_init = 1;
-            if(H5S_select_iter_init(&iter_b, space_b, (size_t)0) < 0)
+            if(H5S_select_iter_init(iter_b, space_b, (size_t)0) < 0)
                 HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator b")
             iter_b_init = 1;
 
@@ -1748,9 +1779,9 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
                 htri_t status_a, status_b;      /* Status from next block checks */
 
                 /* Get the current block for each selection iterator */
-                if(H5S_SELECT_ITER_BLOCK(&iter_a, start_a, end_a) < 0)
+                if(H5S_SELECT_ITER_BLOCK(iter_a, start_a, end_a) < 0)
                     HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block a")
-                if(H5S_SELECT_ITER_BLOCK(&iter_b, start_b, end_b) < 0)
+                if(H5S_SELECT_ITER_BLOCK(iter_b, start_b, end_b) < 0)
                     HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block b")
 
                 space_a_dim = (int)space_a_rank - 1;
@@ -1821,10 +1852,10 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
                 } /* end else */
 
                 /* Check if we are able to advance to the next selection block */
-                if((status_a = H5S_SELECT_ITER_HAS_NEXT_BLOCK(&iter_a)) < 0)
+                if((status_a = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_a)) < 0)
                     HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block a")
 
-                if((status_b = H5S_SELECT_ITER_HAS_NEXT_BLOCK(&iter_b)) < 0)
+                if((status_b = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_b)) < 0)
                     HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block b")
 
                 /* Did we run out of blocks at the same time? */
@@ -1834,10 +1865,10 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
                     HGOTO_DONE(FALSE)
                 else {
                     /* Advance to next block in selection iterators */
-                    if(H5S_SELECT_ITER_NEXT_BLOCK(&iter_a) < 0)
+                    if(H5S_SELECT_ITER_NEXT_BLOCK(iter_a) < 0)
                         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block a")
 
-                    if(H5S_SELECT_ITER_NEXT_BLOCK(&iter_b) < 0)
+                    if(H5S_SELECT_ITER_NEXT_BLOCK(iter_b) < 0)
                         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block b")
                 } /* end else */
             } /* end while */
@@ -1845,12 +1876,14 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
     } /* end else */
 
 done:
-    if(iter_a_init)
-        if(H5S_SELECT_ITER_RELEASE(&iter_a) < 0)
-            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator a")
-    if(iter_b_init)
-        if(H5S_SELECT_ITER_RELEASE(&iter_b) < 0)
-            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator b")
+    if(iter_a_init && H5S_SELECT_ITER_RELEASE(iter_a) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator a")
+    if(iter_a)
+        iter_a = H5FL_FREE(H5S_sel_iter_t, iter_a);
+    if(iter_b_init && H5S_SELECT_ITER_RELEASE(iter_b) < 0)
+        HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator b")
+    if(iter_b)
+        iter_b = H5FL_FREE(H5S_sel_iter_t, iter_b);
 
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5S_select_shape_same() */
@@ -2152,8 +2185,10 @@ done:
 herr_t
 H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_buf)
 {
-    H5S_sel_iter_t iter;        /* Selection iteration info */
+    H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
     hbool_t iter_init = 0;      /* Selection iteration info has been initialized */
+    hsize_t *off = NULL;        /* Array to store sequence offsets */
+    size_t *len = NULL;         /* Array to store sequence lengths */
     hssize_t nelmts;            /* Number of elements in selection */
     size_t max_elem;            /* Total number of elements in selection */
     herr_t ret_value = SUCCEED; /* Return value */
@@ -2166,8 +2201,12 @@ H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_b
     HDassert(space);
     HDassert(_buf);
 
+    /* Allocate the selection iterator */
+    if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+
     /* Initialize iterator */
-    if(H5S_select_iter_init(&iter, space, fill_size) < 0)
+    if(H5S_select_iter_init(iter, space, fill_size) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
     iter_init = 1;	/* Selection iteration info has been initialized */
 
@@ -2178,16 +2217,20 @@ H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_b
     /* Compute the number of bytes to process */
     H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
 
+    /* Allocate the offset & length arrays */
+    if(NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate length vector array")
+    if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate offset vector array")
+
     /* Loop, while elements left in selection */
     while(max_elem > 0) {
-        hsize_t off[H5D_IO_VECTOR_SIZE];          /* Array to store sequence offsets */
-        size_t len[H5D_IO_VECTOR_SIZE];           /* Array to store sequence lengths */
         size_t nseq;                /* Number of sequences generated */
         size_t curr_seq;            /* Current sequnce being worked on */
         size_t nelem;               /* Number of elements used in sequences */
 
         /* Get the sequences of bytes */
-        if(H5S_SELECT_GET_SEQ_LIST(space, 0, &iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+        if(H5S_SELECT_GET_SEQ_LIST(space, 0, iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
             HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
 
         /* Loop over sequences */
@@ -2207,9 +2250,17 @@ H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_b
     } /* end while */
 
 done:
-    /* Release resouces */
-    if(iter_init && H5S_SELECT_ITER_RELEASE(&iter) < 0)
+    /* Release resources, if allocated */
+    if(len)
+        len = H5FL_SEQ_FREE(size_t, len);
+    if(off)
+        off = H5FL_SEQ_FREE(hsize_t, off);
+
+    /* Release selection iterator */
+    if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
         HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+    if(iter)
+        iter = H5FL_FREE(H5S_sel_iter_t, iter);
 
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5S_select_fill() */
diff --git a/src/H5Stest.c b/src/H5Stest.c
index e1f4b61..a7bee2b 100644
--- a/src/H5Stest.c
+++ b/src/H5Stest.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/src/H5T.c b/src/H5T.c
index 194fa87..5e4171d 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -3036,8 +3034,10 @@ H5T__create(H5T_class_t type, size_t size)
                     subtype = H5T_NATIVE_INT_g;
                 else if(sizeof(long) == size)
                     subtype = H5T_NATIVE_LONG_g;
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
                 else if(sizeof(long long) == size)
                     subtype = H5T_NATIVE_LLONG_g;
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
                 else
                     HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "no applicable native integer type")
                 if(NULL == (dt = H5T__alloc()))
@@ -3523,7 +3523,7 @@ H5T__free(H5T_t *dt)
             HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
         if(H5FO_delete(dt->sh_loc.file, H5AC_ind_read_dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0)
             HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't remove datatype from list of open objects")
-        if(H5O_close(&dt->oloc) < 0)
+        if(H5O_close(&dt->oloc, NULL) < 0)
             HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to close data type object header")
         dt->shared->state = H5T_STATE_NAMED;
     } /* end if */
@@ -3602,7 +3602,6 @@ done:
 herr_t
 H5T_close(H5T_t *dt)
 {
-    hbool_t 	corked;			/* Whether the named datatype is corked or not */
     herr_t      ret_value = SUCCEED;   	/* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -3615,12 +3614,13 @@ H5T_close(H5T_t *dt)
     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) {
+            hbool_t 	corked;			/* Whether the named datatype is corked or not */
+
 	    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) {
+		HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, 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 */
+		    HGOTO_ERROR(H5E_DATATYPE, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
 	} /* end if */
 
         if(H5T__free(dt) < 0)
@@ -3643,7 +3643,7 @@ H5T_close(H5T_t *dt)
             /* Check reference count for this object in the top file */
             if(H5FO_top_count(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) == 0) {
                 /* Close object location for named datatype */
-                if(H5O_close(&dt->oloc) < 0)
+                if(H5O_close(&dt->oloc, NULL) < 0)
                     HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to close")
             } /* end if */
             else
@@ -5001,6 +5001,49 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 }
 
+/*-------------------------------------------------------------------------
+ * Function:    H5T_convert_committed_datatype
+ *
+ * Purpose:     To convert the committed datatype "dt" to a transient embedded
+ *		type if the file location associated with the committed datatype is 
+ *		different from the parameter "f".  
+ *		"f" is the file location where the dataset or attribute will be created.
+ *
+ * Notes:       See HDFFV-9940
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T_convert_committed_datatype(H5T_t *dt, H5F_t *f)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dt);
+    HDassert(f);
+
+    if(H5T_is_named(dt) && (dt->sh_loc.file != f)) {
+       HDassert(dt->sh_loc.type == H5O_SHARE_TYPE_COMMITTED);
+
+        H5O_msg_reset_share(H5O_DTYPE_ID, dt);
+        if(H5O_loc_free(&dt->oloc) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRESET, FAIL, "unable to initialize location")
+        if(H5G_name_free(&dt->path) < 0)
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to reset path")
+
+        dt->shared->state = H5T_STATE_TRANSIENT;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5T_convert_committed_datatype() */
+
 

 /*--------------------------------------------------------------------------
  NAME
diff --git a/src/H5TS.c b/src/H5TS.c
index 6a64a14..a0ca134 100644
--- a/src/H5TS.c
+++ b/src/H5TS.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* private headers */
@@ -256,7 +254,10 @@ H5TS_cancel_count_inc(void)
     if (!cancel_counter) {
         /*
          * First time thread calls library - create new counter and associate
-         * with key
+         * with key.
+         * 
+         * Don't use H5MM calls here since the destructor has to use HDfree in
+         * order to avoid codestack calls.
          */
         cancel_counter = (H5TS_cancel_t *)HDcalloc(1, sizeof(H5TS_cancel_t));
 
diff --git a/src/H5TSprivate.h b/src/H5TSprivate.h
index 5394b77..e5c41af 100644
--- a/src/H5TSprivate.h
+++ b/src/H5TSprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Tarray.c b/src/H5Tarray.c
index 4b2c7cf..beccfdb 100644
--- a/src/H5Tarray.c
+++ b/src/H5Tarray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tbit.c b/src/H5Tbit.c
index 8c53066..12d1fd1 100644
--- a/src/H5Tbit.c
+++ b/src/H5Tbit.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -514,22 +512,19 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5T__bit_inc
+ * Function:    H5T__bit_inc
  *
- * Purpose:	Increment part of a bit field by adding 1.  The bit field
+ * Purpose:     Increment part of a bit field by adding 1.  The bit field
  *              starts with bit position START and is SIZE bits long.
  *
- * Return:	Success:        The carry-out value.  One if overflows,
- *                              zero otherwise.
- *
- *		Failure:	Negative
+ * Return:      The carry-out value.  TRUE if overflows, FALSE otherwise.
  *
  * Programmer:	Robb Matzke
  *              Friday, June 26, 1998
  *
  *-------------------------------------------------------------------------
  */
-htri_t
+hbool_t
 H5T__bit_inc(uint8_t *buf, size_t start, size_t size)
 {
     size_t	idx = start / 8;
@@ -545,38 +540,38 @@ H5T__bit_inc(uint8_t *buf, size_t start, size_t size)
 
     /* The first partial byte */
     if(start) {
-	if(size + start < 8)
+        if(size + start < 8)
             mask = ((unsigned)1 << size) - 1;
-	else
+        else
             mask = ((unsigned)1 << (8 - start)) - 1;
-	acc = ((unsigned)buf[idx] >> start) & mask;
-	acc++;
-	carry = acc & ((unsigned)1 << MIN(size, 8 - start));
-	buf[idx] &= (uint8_t)(~(mask << start));
-	buf[idx] = (uint8_t)(buf[idx] | ((acc & mask) << start));
-	size -= MIN(size, 8 - start);
-	start = 0;
-	idx++;
+        acc = ((unsigned)buf[idx] >> start) & mask;
+        acc++;
+        carry = acc & ((unsigned)1 << MIN(size, 8 - start));
+        buf[idx] &= (uint8_t)(~(mask << start));
+        buf[idx] = (uint8_t)(buf[idx] | ((acc & mask) << start));
+        size -= MIN(size, 8 - start);
+        start = 0;
+        idx++;
     } /* end if */
 
     /* The middle */
     while(carry && size >= 8) {
-	acc = buf[idx];
-	acc++;
-	carry = acc & 0x100;
-	buf[idx] = acc & 0xff;
-	idx++;
-	size -= 8;
+        acc = buf[idx];
+        acc++;
+        carry = acc & 0x100;
+        buf[idx] = acc & 0xff;
+        idx++;
+        size -= 8;
     } /* end while */
 
     /* The last bits */
     if(carry && size > 0) {
-	mask = ((unsigned)1 << size) - 1;
-	acc = buf[idx] & mask;
-	acc++;
-	carry = acc & ((unsigned)1 << size);
-	buf[idx] &= (uint8_t)(~mask);
-	buf[idx] |= (uint8_t)(acc & mask);
+        mask = ((unsigned)1 << size) - 1;
+        acc = buf[idx] & mask;
+        acc++;
+        carry = acc & ((unsigned)1 << size);
+        buf[idx] &= (uint8_t)(~mask);
+        buf[idx] |= (uint8_t)(acc & mask);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(carry ? TRUE : FALSE)
@@ -586,20 +581,18 @@ H5T__bit_inc(uint8_t *buf, size_t start, size_t size)
 /*-------------------------------------------------------------------------
  * Function:	H5T__bit_dec
  *
- * Purpose:	decrement part of a bit field by substracting 1.  The bit
+ * Purpose:     Decrement part of a bit field by substracting 1.  The bit
  *              field starts with bit position START and is SIZE bits long.
  *
- * Return:	Success:        The "borrow-in" value. It's one if underflows,
- *                              zero otherwise.
+ * Return:      The "borrow-in" value. It's TRUE if underflows, FALSE
+ *              otherwise.
  *
- *		Failure:	Negative
- *
- * Programmer:	Raymond Lu
+ * Programmer:  Raymond Lu
  *              March 17, 2004
  *
  *-------------------------------------------------------------------------
  */
-htri_t
+hbool_t
 H5T__bit_dec(uint8_t *buf, size_t start, size_t size)
 {
     size_t	idx = start / 8;
diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c
index 07fe371..c28b508 100644
--- a/src/H5Tcommit.c
+++ b/src/H5Tcommit.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -203,7 +201,7 @@ done:
                 HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't remove dataset from list of open objects")
 
             /* Close the datatype object */
-	    if(H5O_close(&(dt->oloc)) < 0)
+	    if(H5O_close(&(dt->oloc), NULL) < 0)
                 HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release object header")
 
             /* Remove the datatype's object header from the file */
@@ -401,7 +399,7 @@ done:
         if((type->shared->state == H5T_STATE_TRANSIENT || type->shared->state == H5T_STATE_RDONLY) && (type->sh_loc.type == H5O_SHARE_TYPE_COMMITTED)) {
             if(H5O_dec_rc_by_loc(&(type->oloc), dxpl_id) < 0)
                 HDONE_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL, "unable to decrement refcount on newly created object")
-	    if(H5O_close(&(type->oloc)) < 0)
+	    if(H5O_close(&(type->oloc), NULL) < 0)
                 HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release object header")
             if(H5O_delete(file, dxpl_id, type->sh_loc.u.loc.oh_addr) < 0)
                 HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to delete object header")
@@ -823,7 +821,7 @@ H5T_open_oid(const H5G_loc_t *loc, hid_t dxpl_id)
 done:
     if(ret_value == NULL)
         if(dt == NULL)
-            H5O_close(loc->oloc);
+            H5O_close(loc->oloc, NULL);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5T_open_oid() */
diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c
index 1342770..169c146 100644
--- a/src/H5Tcompound.c
+++ b/src/H5Tcompound.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index 8b96d22..84a997e 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -4032,7 +4030,7 @@ H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
     size_t	mpos;			/*offset to useful mant is src	*/
     uint64_t    sign;                   /*source sign bit value         */
     size_t	mrsh;			/*amount to right shift mantissa*/
-    hbool_t	carry = 0;		/*carry after rounding mantissa	*/
+    hbool_t carry = FALSE;		/*carry after rounding mantissa	*/
     size_t	i;			/*miscellaneous counters	*/
     size_t	implied;		/*destination implied bits	*/
     hbool_t     denormalized = FALSE;   /*is either source or destination denormalized?*/
@@ -4408,7 +4406,7 @@ H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                         /* Don't do rounding if exponent is 111...110 and mantissa is 111...11.
                          * To do rounding and increment exponent in this case will create an infinity value.*/
                         if((H5T__bit_find(s, mpos + (size_t)bitno, msize - (size_t)bitno, H5T_BIT_LSB, FALSE) >= 0 || expo < expo_max - 1)) {
-                            carry = (hbool_t)H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
+                            carry = H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
                             if(carry)
                                 implied = 2;
                         }
@@ -4417,7 +4415,7 @@ H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                         H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
                 }
                 else
-                    carry=0;
+                    carry = FALSE;
 
                 /*
                  * Write the mantissa to the destination
@@ -4480,7 +4478,7 @@ H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                     }
                 }
                 /*reset CARRY*/
-                carry = 0;
+                carry = FALSE;
 
                 H5_CHECK_OVERFLOW(expo,hssize_t,hsize_t);
                 H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, (hsize_t)expo);
diff --git a/src/H5Tcset.c b/src/H5Tcset.c
index 95658ed..186e598 100644
--- a/src/H5Tcset.c
+++ b/src/H5Tcset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tdbg.c b/src/H5Tdbg.c
index 8a10cc6..f434543 100644
--- a/src/H5Tdbg.c
+++ b/src/H5Tdbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Tdeprec.c b/src/H5Tdeprec.c
index a769b72..c506ec1 100644
--- a/src/H5Tdeprec.c
+++ b/src/H5Tdeprec.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Tenum.c b/src/H5Tenum.c
index e80d748..f5263ed 100644
--- a/src/H5Tenum.c
+++ b/src/H5Tenum.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tfields.c b/src/H5Tfields.c
index 8818a73..be62d85 100644
--- a/src/H5Tfields.c
+++ b/src/H5Tfields.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tfixed.c b/src/H5Tfixed.c
index 62b8e79..bc1d84d 100644
--- a/src/H5Tfixed.c
+++ b/src/H5Tfixed.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tfloat.c b/src/H5Tfloat.c
index b8b1c07..85e8f30 100644
--- a/src/H5Tfloat.c
+++ b/src/H5Tfloat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tmodule.h b/src/H5Tmodule.h
index bfaab5e..d2ab08c 100644
--- a/src/H5Tmodule.h
+++ b/src/H5Tmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tnative.c b/src/H5Tnative.c
index 9dbce09..6304500 100644
--- a/src/H5Tnative.c
+++ b/src/H5Tnative.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Toffset.c b/src/H5Toffset.c
index cc45d8e..668e730 100644
--- a/src/H5Toffset.c
+++ b/src/H5Toffset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Toh.c b/src/H5Toh.c
index 9c8ad80..01cefe1 100644
--- a/src/H5Toh.c
+++ b/src/H5Toh.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /****************/
diff --git a/src/H5Topaque.c b/src/H5Topaque.c
index 9cc22c9..4e8f1d4 100644
--- a/src/H5Topaque.c
+++ b/src/H5Topaque.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Torder.c b/src/H5Torder.c
index 6c9c55c..877316d 100644
--- a/src/H5Torder.c
+++ b/src/H5Torder.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tpad.c b/src/H5Tpad.c
index e636a84..c96f42a 100644
--- a/src/H5Tpad.c
+++ b/src/H5Tpad.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index 0bd1e06..d075127 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -1288,8 +1286,8 @@ H5_DLL void H5T__bit_set_d(uint8_t *buf, size_t offset, size_t size,
 			   uint64_t val);
 H5_DLL ssize_t H5T__bit_find(uint8_t *buf, size_t offset, size_t size,
 			     H5T_sdir_t direction, hbool_t value);
-H5_DLL htri_t H5T__bit_inc(uint8_t *buf, size_t start, size_t size);
-H5_DLL htri_t H5T__bit_dec(uint8_t *buf, size_t start, size_t size);
+H5_DLL hbool_t H5T__bit_inc(uint8_t *buf, size_t start, size_t size);
+H5_DLL hbool_t H5T__bit_dec(uint8_t *buf, size_t start, size_t size);
 H5_DLL void H5T__bit_neg(uint8_t *buf, size_t start, size_t size);
 
 /* VL functions */
diff --git a/src/H5Tprecis.c b/src/H5Tprecis.c
index be85491..59bac8b 100644
--- a/src/H5Tprecis.c
+++ b/src/H5Tprecis.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h
index 93fe599..f2da62e 100644
--- a/src/H5Tprivate.h
+++ b/src/H5Tprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -120,6 +118,7 @@ H5_DLL struct H5O_loc_t *H5T_oloc(H5T_t *dt);
 H5_DLL H5G_name_t *H5T_nameof(H5T_t *dt);
 H5_DLL htri_t H5T_is_immutable(const H5T_t *dt);
 H5_DLL htri_t H5T_is_named(const H5T_t *dt);
+H5_DLL herr_t H5T_convert_committed_datatype(H5T_t *dt, H5F_t *f);
 H5_DLL htri_t H5T_is_relocatable(const H5T_t *dt);
 H5_DLL H5T_path_t *H5T_path_find(const H5T_t *src, const H5T_t *dst,
     const char *name, H5T_conv_t func, hid_t dxpl_id, hbool_t is_api);
@@ -137,6 +136,7 @@ H5_DLL htri_t H5T_is_sensible(const H5T_t *dt);
 H5_DLL uint32_t H5T_hash(H5F_t * file, const H5T_t *dt);
 H5_DLL herr_t H5T_set_latest_version(H5T_t *dt);
 H5_DLL herr_t H5T_patch_file(H5T_t *dt, H5F_t *f);
+H5_DLL herr_t H5T_patch_vlen_file(H5T_t *dt, H5F_t *f);
 H5_DLL htri_t H5T_is_variable_str(const H5T_t *dt);
 
 /* Reference specific functions */
diff --git a/src/H5Tpublic.h b/src/H5Tpublic.h
index df7ad41..fc3e4ee 100644
--- a/src/H5Tpublic.h
+++ b/src/H5Tpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tstrpad.c b/src/H5Tstrpad.c
index 2cd1db4..fa084f1 100644
--- a/src/H5Tstrpad.c
+++ b/src/H5Tstrpad.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tvisit.c b/src/H5Tvisit.c
index d732fb3..c706dee 100644
--- a/src/H5Tvisit.c
+++ b/src/H5Tvisit.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Tvlen.c b/src/H5Tvlen.c
index 0ed8209..00e61e5 100644
--- a/src/H5Tvlen.c
+++ b/src/H5Tvlen.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -243,7 +241,7 @@ H5T__vlen_set_loc(const H5T_t *dt, H5F_t *f, H5T_loc_t loc)
                  * of an address in this file, plus 4 bytes for the size of a heap
                  * ID.  Memory size is different
                  */
-                dt->shared->size = 4 + H5F_SIZEOF_ADDR(f) + 4;
+                dt->shared->size = 4 + (size_t)H5F_SIZEOF_ADDR(f) + 4;
 
                 /* Set up the function pointers to access the VL information on disk */
                 /* VL sequences and VL strings are stored identically on disk, so use the same functions */
@@ -801,7 +799,7 @@ H5T_vlen_disk_getptr(void H5_ATTR_UNUSED *vl)
 static htri_t
 H5T_vlen_disk_isnull(const H5F_t *f, void *_vl)
 {
-    uint8_t *vl=(uint8_t *)_vl; /* Pointer to the disk VL information */
+    uint8_t *vl = (uint8_t *)_vl; /* Pointer to the disk VL information */
     haddr_t addr;               /* Sequence's heap address */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -810,12 +808,12 @@ H5T_vlen_disk_isnull(const H5F_t *f, void *_vl)
     HDassert(vl);
 
     /* Skip the sequence's length */
-    vl+=4;
+    vl += 4;
 
     /* Get the heap address */
-    H5F_addr_decode(f,(const uint8_t **)&vl,&addr);
+    H5F_addr_decode(f, (const uint8_t **)&vl, &addr);
 
-    FUNC_LEAVE_NOAPI(addr==0 ? TRUE : FALSE)
+    FUNC_LEAVE_NOAPI(addr == 0 ? TRUE : FALSE)
 }   /* end H5T_vlen_disk_isnull() */
 
 

diff --git a/src/H5UC.c b/src/H5UC.c
index 5762cc5..2277818 100644
--- a/src/H5UC.c
+++ b/src/H5UC.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5UCprivate.h b/src/H5UCprivate.h
index a702c03..c451f31 100644
--- a/src/H5UCprivate.h
+++ b/src/H5UCprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5VM.c b/src/H5VM.c
index c546609..4c0b837 100644
--- a/src/H5VM.c
+++ b/src/H5VM.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5VMprivate.h b/src/H5VMprivate.h
index cbe108a..4d71b29 100644
--- a/src/H5VMprivate.h
+++ b/src/H5VMprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5WB.c b/src/H5WB.c
index 978ded4..8a85a3a 100644
--- a/src/H5WB.c
+++ b/src/H5WB.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5WBprivate.h b/src/H5WBprivate.h
index cfa3fcb..4460808 100644
--- a/src/H5WBprivate.h
+++ b/src/H5WBprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5Z.c b/src/H5Z.c
index e7a2186..ef34d7c 100644
--- a/src/H5Z.c
+++ b/src/H5Z.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
@@ -626,7 +624,7 @@ H5Z__flush_file_cb(void *obj_ptr, hid_t H5_ATTR_UNUSED obj_id, void H5_ATTR_UNUS
     /* Call the flush routine for mounted file hierarchies. Do a global flush 
      * if the file is opened for write */
     if(H5F_ACC_RDWR & H5F_INTENT((H5F_t *)obj_ptr)) {
-        if(H5F_flush_mounts((H5F_t *)obj_ptr, H5AC_ind_read_dxpl_id) < 0)
+        if(H5F_flush_mounts((H5F_t *)obj_ptr, H5AC_ind_read_dxpl_id, H5AC_rawdata_dxpl_id) < 0)
             HGOTO_ERROR(H5E_PLINE, H5E_CANTFLUSH, FAIL, "unable to flush file hierarchy")
     } /* end if */
 
diff --git a/src/H5Zdeflate.c b/src/H5Zdeflate.c
index 15aac27..34fdfec 100644
--- a/src/H5Zdeflate.c
+++ b/src/H5Zdeflate.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Zfletcher32.c b/src/H5Zfletcher32.c
index 9ff85cc..4cd77ef 100644
--- a/src/H5Zfletcher32.c
+++ b/src/H5Zfletcher32.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Zmodule.h b/src/H5Zmodule.h
index fa0ef8f..97e158c 100644
--- a/src/H5Zmodule.h
+++ b/src/H5Zmodule.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5Znbit.c b/src/H5Znbit.c
index e2fb300..373eb37 100644
--- a/src/H5Znbit.c
+++ b/src/H5Znbit.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
@@ -29,10 +27,10 @@
  * one nbit atomic datatype: integer or floating-point
  */
 typedef struct {
-   size_t size;   /* size of datatype */
-   int order;     /* datatype endianness order */
-   int precision; /* datatype precision */
-   int offset;    /* datatype offset */
+   unsigned size;         /* size of datatype */
+   unsigned order;      /* datatype endianness order */
+   unsigned precision;  /* datatype precision */
+   unsigned offset;     /* datatype offset */
 } parms_atomic;
 
 /* Local function prototypes */
@@ -41,41 +39,50 @@ static herr_t H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id);
 static size_t H5Z_filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
                               size_t nbytes, size_t *buf_size, void **buf);
 
-static void H5Z_calc_parms_nooptype(void);
-static void H5Z_calc_parms_atomic(void);
-static herr_t H5Z_calc_parms_array(const H5T_t *type);
-static herr_t H5Z_calc_parms_compound(const H5T_t *type);
-
-static herr_t H5Z_set_parms_nooptype(const H5T_t *type, unsigned cd_values[]);
-static herr_t H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[]);
-static herr_t H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[]);
-static herr_t H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[]);
-
-static void H5Z_nbit_next_byte(size_t *j, int *buf_len);
-static void H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
-int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
-static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
-int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
+static void H5Z_calc_parms_nooptype(size_t *cd_values_actual_nparms);
+static void H5Z_calc_parms_atomic(size_t *cd_values_actual_nparms);
+static herr_t H5Z_calc_parms_array(const H5T_t *type, size_t *cd_values_actual_nparms);
+static herr_t H5Z_calc_parms_compound(const H5T_t *type, size_t *cd_values_actual_nparms);
+
+static herr_t H5Z_set_parms_nooptype(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[]);
+static herr_t H5Z_set_parms_atomic(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress);
+static herr_t H5Z_set_parms_array(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress);
+static herr_t H5Z_set_parms_compound(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress);
+
+static void H5Z_nbit_next_byte(size_t *j, size_t *buf_len);
+static void H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset,
+    unsigned k, unsigned begin_i, unsigned end_i, unsigned char *buffer, size_t *j,
+    size_t *buf_len, const parms_atomic *p, size_t datatype_len);
+static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, unsigned k, unsigned begin_i,
+    unsigned end_i, unsigned char *buffer, size_t *j, size_t *buf_len, const parms_atomic *p, size_t datatype_len);
 static void H5Z_nbit_decompress_one_nooptype(unsigned char *data, size_t data_offset,
-                       unsigned char *buffer, size_t *j, int *buf_len, unsigned size);
+    unsigned char *buffer, size_t *j, size_t *buf_len, unsigned size);
 static void H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
-                    unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
-static void H5Z_nbit_decompress_one_array(unsigned char *data, size_t data_offset,
-           unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
-static void H5Z_nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
-              unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
-static void H5Z_nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
-                                const unsigned parms[]);
+    unsigned char *buffer, size_t *j, size_t *buf_len, const parms_atomic *p);
+static herr_t H5Z__nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index);
+static herr_t H5Z__nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index);
+static herr_t H5Z__nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+    const unsigned parms[]);
 static void H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offset,
-                     unsigned char *buffer, size_t *j, int *buf_len, unsigned size);
+    unsigned char *buffer, size_t *j, size_t *buf_len, unsigned size);
 static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
-                  unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
+    unsigned char *buffer, size_t *j, size_t *buf_len, const parms_atomic *p);
 static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset,
-         unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index);
 static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
-            unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index);
 static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
-                              size_t *buffer_size, const unsigned parms[]);
+    size_t *buffer_size, const unsigned parms[]);
 
 /* This message derives from H5Z */
 H5Z_class2_t H5Z_NBIT[1] = {{
@@ -99,16 +106,6 @@ H5Z_class2_t H5Z_NBIT[1] = {{
 #define H5Z_NBIT_ORDER_BE        1     /* Big endian for datatype byte order */
 
 /* Local variables */
-/*
- * cd_values_index: index of array cd_values inside function H5Z_set_local_nbit
- * cd_values_actual_nparms: number of parameters in array cd_values[]
- * need_not_compress: flag if TRUE indicating no need to do nbit compression
- * parms_index: index of array parms used by compression/decompression functions
- */
-static unsigned cd_values_index = 0;
-static size_t cd_values_actual_nparms = 0;
-static unsigned char need_not_compress = FALSE;
-static unsigned parms_index = 0;
 
 

 /*-------------------------------------------------------------------------
@@ -166,13 +163,14 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static void H5Z_calc_parms_nooptype(void)
+static void
+H5Z_calc_parms_nooptype(size_t *cd_values_actual_nparms)
 {
     /* Store datatype class code */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store datatype size */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 }
 
 

@@ -190,22 +188,23 @@ static void H5Z_calc_parms_nooptype(void)
  *
  *-------------------------------------------------------------------------
  */
-static void H5Z_calc_parms_atomic(void)
+static void
+H5Z_calc_parms_atomic(size_t *cd_values_actual_nparms)
 {
     /* Store datatype class code */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store datatype size */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store datatype endianness */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store datatype's precision */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store datatype's offset */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 }
 
 

@@ -227,7 +226,7 @@ static void H5Z_calc_parms_atomic(void)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_calc_parms_array(const H5T_t *type)
+H5Z_calc_parms_array(const H5T_t *type, size_t *cd_values_actual_nparms)
 {
     H5T_t *dtype_base = NULL;      /* Array datatype's base datatype */
     H5T_class_t dtype_base_class;  /* Array datatype's base datatype's class */
@@ -236,10 +235,10 @@ H5Z_calc_parms_array(const H5T_t *type)
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Store datatype class code */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store array datatype's size */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Get array datatype's base datatype */
     if(NULL == (dtype_base = H5T_get_super(type)))
@@ -253,16 +252,16 @@ H5Z_calc_parms_array(const H5T_t *type)
     switch(dtype_base_class) {
         case H5T_INTEGER:
         case H5T_FLOAT:
-            H5Z_calc_parms_atomic();
+            H5Z_calc_parms_atomic(cd_values_actual_nparms);
             break;
 
         case H5T_ARRAY:
-            if(H5Z_calc_parms_array(dtype_base) == FAIL)
+            if(H5Z_calc_parms_array(dtype_base, cd_values_actual_nparms) == FAIL)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
         case H5T_COMPOUND:
-            if(H5Z_calc_parms_compound(dtype_base) == FAIL)
+            if(H5Z_calc_parms_compound(dtype_base, cd_values_actual_nparms) == FAIL)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
@@ -274,7 +273,7 @@ H5Z_calc_parms_array(const H5T_t *type)
         case H5T_ENUM:
         case H5T_VLEN:
             /* Other datatype classes: nbit does no compression */
-            H5Z_calc_parms_nooptype();
+            H5Z_calc_parms_nooptype(cd_values_actual_nparms);
             break;
 
         case H5T_NO_CLASS:
@@ -312,31 +311,32 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_calc_parms_compound(const H5T_t *type)
+H5Z_calc_parms_compound(const H5T_t *type, size_t *cd_values_actual_nparms)
 {
     int         nmembers;           /* Compound datatype's number of members */
     H5T_t *dtype_member = NULL;     /* Compound datatype's member datatype */
-    H5T_class_t dtype_member_class; /* Compound datatype's member datatype's class */
     unsigned    u;                  /* Local index variable */
     herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Store compound datatype class code */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Store compound datatype's size */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* Get number of members */
     if((nmembers = H5T_get_nmembers(type)) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype number of members")
 
     /* Store number of members */
-    ++cd_values_actual_nparms;
+    *cd_values_actual_nparms += 1;
 
     /* For each member, calculate parameters */
     for(u = 0; u < (unsigned)nmembers; u++) {
+        H5T_class_t dtype_member_class; /* Compound datatype's member datatype's class */
+
         /* Get member datatype */
         if(NULL == (dtype_member = H5T_get_member_type(type, u, H5T_COPY_TRANSIENT)))
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype")
@@ -346,22 +346,22 @@ H5Z_calc_parms_compound(const H5T_t *type)
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype class")
 
         /* Store member offset */
-        ++cd_values_actual_nparms;
+        *cd_values_actual_nparms += 1;
 
         /* Calculate parameters according to member's datatype class */
         switch(dtype_member_class) {
             case H5T_INTEGER:
             case H5T_FLOAT:
-                H5Z_calc_parms_atomic();
+                H5Z_calc_parms_atomic(cd_values_actual_nparms);
                 break;
 
             case H5T_ARRAY:
-                if(H5Z_calc_parms_array(dtype_member) == FAIL)
+                if(H5Z_calc_parms_array(dtype_member, cd_values_actual_nparms) == FAIL)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
                 break;
 
             case H5T_COMPOUND:
-                if(H5Z_calc_parms_compound(dtype_member) == FAIL)
+                if(H5Z_calc_parms_compound(dtype_member, cd_values_actual_nparms) == FAIL)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
                 break;
 
@@ -373,7 +373,7 @@ H5Z_calc_parms_compound(const H5T_t *type)
             case H5T_ENUM:
             case H5T_VLEN:
                 /* Other datatype classes: nbit does no compression */
-                H5Z_calc_parms_nooptype();
+                H5Z_calc_parms_nooptype(cd_values_actual_nparms);
                 break;
 
             case H5T_NO_CLASS:
@@ -418,7 +418,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_set_parms_nooptype(const H5T_t *type, unsigned cd_values[])
+H5Z_set_parms_nooptype(const H5T_t *type, unsigned *cd_values_index, unsigned cd_values[])
 {
     size_t dtype_size;          /* No-op datatype's size (in bytes) */
     herr_t ret_value = SUCCEED; /* Return value */
@@ -426,14 +426,15 @@ H5Z_set_parms_nooptype(const H5T_t *type, unsigned cd_values[])
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Set datatype class code */
-    cd_values[cd_values_index++] = H5Z_NBIT_NOOPTYPE;
+    cd_values[(*cd_values_index)++] = H5Z_NBIT_NOOPTYPE;
 
     /* Get datatype's size */
     if((dtype_size = H5T_get_size(type)) == 0)
 	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for datatype size */
-    cd_values[cd_values_index++] = dtype_size;
+    H5_CHECK_OVERFLOW(dtype_size, size_t, unsigned);
+    cd_values[(*cd_values_index)++] = (unsigned)dtype_size;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -457,25 +458,28 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
+H5Z_set_parms_atomic(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress)
 {
     H5T_order_t dtype_order;    /* Atomic datatype's endianness order */
     size_t dtype_size;          /* Atomic datatype's size (in bytes) */
     size_t dtype_precision;     /* Atomic datatype's precision (in bits) */
-    int dtype_offset;           /* Atomic datatype's offset (in bits) */
+    int sdtype_offset;          /* Atomic datatype's offset (in bits) */
+    unsigned dtype_offset;      /* Atomic datatype's offset (in bits) */
     herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Set datatype class code */
-    cd_values[cd_values_index++] = H5Z_NBIT_ATOMIC;
+    cd_values[(*cd_values_index)++] = H5Z_NBIT_ATOMIC;
 
     /* Get datatype's size */
     if((dtype_size = H5T_get_size(type)) == 0)
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for datatype size */
-    cd_values[cd_values_index++] = dtype_size;
+    H5_CHECK_OVERFLOW(dtype_size, size_t, unsigned);
+    cd_values[(*cd_values_index)++] = (unsigned)dtype_size;
 
     /* Get datatype's endianness order */
     if((dtype_order = H5T_get_order(type)) == H5T_ORDER_ERROR)
@@ -484,11 +488,11 @@ H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
     /* Set "local" parameter for datatype endianness */
     switch(dtype_order) {
         case H5T_ORDER_LE:      /* Little-endian byte order */
-            cd_values[cd_values_index++] = H5Z_NBIT_ORDER_LE;
+            cd_values[(*cd_values_index)++] = H5Z_NBIT_ORDER_LE;
             break;
 
         case H5T_ORDER_BE:      /* Big-endian byte order */
-            cd_values[cd_values_index++] = H5Z_NBIT_ORDER_BE;
+            cd_values[(*cd_values_index)++] = H5Z_NBIT_ORDER_BE;
             break;
 
         case H5T_ORDER_VAX:
@@ -504,27 +508,28 @@ H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype precision")
 
     /* Get datatype's offset */
-    if((dtype_offset = H5T_get_offset(type)) < 0)
+    if((sdtype_offset = H5T_get_offset(type)) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype offset")
+    dtype_offset = (unsigned)sdtype_offset;
 
     /* Check values of precision and offset */
-    if(dtype_precision > dtype_size * 8 || (dtype_precision + dtype_offset) > dtype_size * 8
-            || dtype_precision <= 0 || dtype_offset < 0)
+    if(dtype_precision > dtype_size * 8 || (dtype_precision + dtype_offset) > dtype_size * 8)
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
 
     /* Set "local" parameter for datatype precision */
-    cd_values[cd_values_index++] = dtype_precision;
+    H5_CHECK_OVERFLOW(dtype_precision, size_t, unsigned);
+    cd_values[(*cd_values_index)++] = (unsigned)dtype_precision;
 
     /* Set "local" parameter for datatype offset */
-    cd_values[cd_values_index++] = dtype_offset;
+    cd_values[(*cd_values_index)++] = dtype_offset;
 
     /* If before this point, there is no need to compress, check the need to
      * compress at this point. If current datatype is not full-precision,
      * flag need_not_compress should be set to FALSE.
      */
-    if(need_not_compress) /* so far no need to compress */
+    if(*need_not_compress) /* so far no need to compress */
        if(dtype_offset != 0 || dtype_precision != dtype_size * 8)
-          need_not_compress = FALSE;
+          *need_not_compress = FALSE;
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5Z_set_parms_atomic() */
@@ -547,7 +552,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
+H5Z_set_parms_array(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress)
 {
     H5T_t *dtype_base = NULL;      /* Array datatype's base datatype */
     H5T_class_t dtype_base_class;  /* Array datatype's base datatype's class */
@@ -558,14 +564,15 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Set datatype class code */
-    cd_values[cd_values_index++] = H5Z_NBIT_ARRAY;
+    cd_values[(*cd_values_index)++] = H5Z_NBIT_ARRAY;
 
     /* Get array datatype's size */
     if((dtype_size = H5T_get_size(type)) == 0)
 	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for array datatype's size */
-    cd_values[cd_values_index++]=dtype_size;
+    H5_CHECK_OVERFLOW(dtype_size, size_t, unsigned);
+    cd_values[(*cd_values_index)++] = (unsigned)dtype_size;
 
     /* Get array datatype's base datatype */
     if(NULL == (dtype_base = H5T_get_super(type)))
@@ -579,17 +586,17 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
     switch(dtype_base_class) {
         case H5T_INTEGER:
         case H5T_FLOAT:
-            if(H5Z_set_parms_atomic(dtype_base, cd_values) == FAIL)
+            if(H5Z_set_parms_atomic(dtype_base, cd_values_index, cd_values, need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
         case H5T_ARRAY:
-            if(H5Z_set_parms_array(dtype_base, cd_values) == FAIL)
+            if(H5Z_set_parms_array(dtype_base, cd_values_index, cd_values, need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
         case H5T_COMPOUND:
-            if(H5Z_set_parms_compound(dtype_base, cd_values) == FAIL)
+            if(H5Z_set_parms_compound(dtype_base, cd_values_index, cd_values, need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
@@ -602,7 +609,7 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
             if(dtype_base_class == H5T_VLEN || is_vlstring)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype not supported by nbit")
 
-            if(H5Z_set_parms_nooptype(dtype_base, cd_values) == FAIL)
+            if(H5Z_set_parms_nooptype(dtype_base, cd_values_index, cd_values) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
@@ -612,7 +619,7 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
         case H5T_OPAQUE:
         case H5T_REFERENCE:
         case H5T_ENUM:
-            if(H5Z_set_parms_nooptype(dtype_base, cd_values) == FAIL)
+            if(H5Z_set_parms_nooptype(dtype_base, cd_values_index, cd_values) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
@@ -650,9 +657,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
+H5Z_set_parms_compound(const H5T_t *type, unsigned *cd_values_index,
+    unsigned cd_values[], hbool_t *need_not_compress)
 {
-    int         nmembers;           /* Compound datatype's number of members */
+    int snmembers;                  /* Compound datatype's number of members */
+    unsigned nmembers;              /* Compound datatype's number of members */
     H5T_t *dtype_member = NULL;     /* Compound datatype's member datatype */
     H5T_class_t dtype_member_class; /* Compound datatype's member datatype's class */
     size_t dtype_member_offset;     /* Compound datatype's current member datatype's offset (in bytes) */
@@ -665,24 +674,26 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Set "local" parameter for compound datatype class code */
-    cd_values[cd_values_index++] = H5Z_NBIT_COMPOUND;
+    cd_values[(*cd_values_index)++] = H5Z_NBIT_COMPOUND;
 
     /* Get datatype's size */
     if((dtype_size = H5T_get_size(type)) == 0)
 	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for compound datatype size */
-    cd_values[cd_values_index++] = dtype_size;
+    H5_CHECK_OVERFLOW(dtype_size, size_t, unsigned);
+    cd_values[(*cd_values_index)++] = (unsigned)dtype_size;
 
     /* Get number of members */
-    if((nmembers = H5T_get_nmembers(type)) < 0)
+    if((snmembers = H5T_get_nmembers(type)) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype number of members")
+    nmembers = (unsigned)snmembers;
 
     /* Set "local" parameter for number of members */
-    cd_values[cd_values_index++] = nmembers;
+    cd_values[(*cd_values_index)++] = nmembers;
 
     /* For each member, set parameters */
-    for(u = 0; u < (unsigned)nmembers; u++) {
+    for(u = 0; u < nmembers; u++) {
         /* Get member datatype */
         if(NULL == (dtype_member = H5T_get_member_type(type, u, H5T_COPY_TRANSIENT)))
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad member datatype")
@@ -695,23 +706,24 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
         dtype_member_offset =  H5T_get_member_offset(type, u);
 
         /* Set "local" parameter for member offset */
-        cd_values[cd_values_index++] = dtype_member_offset;
+        H5_CHECK_OVERFLOW(dtype_member_offset, size_t, unsigned);
+        cd_values[(*cd_values_index)++] = (unsigned)dtype_member_offset;
 
         /* Call appropriate function according to member's datatype class */
         switch(dtype_member_class) {
             case H5T_INTEGER:
             case H5T_FLOAT:
-                if(H5Z_set_parms_atomic(dtype_member, cd_values) == FAIL)
+                if(H5Z_set_parms_atomic(dtype_member, cd_values_index, cd_values, need_not_compress) < 0)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
                 break;
 
             case H5T_ARRAY:
-                if(H5Z_set_parms_array(dtype_member, cd_values) == FAIL)
+                if(H5Z_set_parms_array(dtype_member, cd_values_index, cd_values, need_not_compress) < 0)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
                 break;
 
             case H5T_COMPOUND:
-                if(H5Z_set_parms_compound(dtype_member, cd_values) == FAIL)
+                if(H5Z_set_parms_compound(dtype_member, cd_values_index, cd_values, need_not_compress) < 0)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
                 break;
 
@@ -721,22 +733,24 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
                     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 */
-                    cd_values[cd_values_index++] = H5Z_NBIT_NOOPTYPE;
+                    cd_values[(*cd_values_index)++] = H5Z_NBIT_NOOPTYPE;
 
-                    if(u != (unsigned)nmembers - 1)
+                    if(u != nmembers - 1)
                         dtype_next_member_offset = H5T_get_member_offset(type, u + 1);
                     else /* current member is the last member */
                         dtype_next_member_offset = dtype_size;
 
                     /* Set "local" parameter for datatype size */
-                    cd_values[cd_values_index++] = dtype_next_member_offset - dtype_member_offset;
+                    H5_CHECK_OVERFLOW(dtype_member_offset, size_t, unsigned);
+                    H5_CHECK_OVERFLOW(dtype_next_member_offset, size_t, unsigned);
+                    cd_values[(*cd_values_index)++] = (unsigned)dtype_next_member_offset - (unsigned)dtype_member_offset;
                 } 
                 break;
 
@@ -747,7 +761,7 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
             case H5T_REFERENCE:
             case H5T_ENUM:
                 /* other datatype that nbit does no compression */
-                if(H5Z_set_parms_nooptype(dtype_member, cd_values) == FAIL)
+                if(H5Z_set_parms_nooptype(dtype_member, cd_values_index, cd_values) < 0)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
                 break;
 
@@ -796,10 +810,13 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
     const H5T_t	*type;              /* Datatype */
     const H5S_t	*ds;                /* Dataspace */
     unsigned flags;                 /* Filter flags */
+    unsigned cd_values_index;       /* Index of array cd_values */
+    size_t cd_values_actual_nparms; /* Number of parameters in array cd_values[] */
     size_t cd_nelmts = H5Z_NBIT_USER_NPARMS;  /* Number of filter parameters */
     unsigned *cd_values = NULL;     /* Filter parameters */
     hssize_t npoints;               /* Number of points in the dataspace */
     H5T_class_t dtype_class;        /* Datatype's class */
+    hbool_t need_not_compress;      /* Flag if TRUE indicating no need to do nbit compression */
     herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -822,16 +839,16 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
     switch(dtype_class) {
         case H5T_INTEGER:
         case H5T_FLOAT:
-            H5Z_calc_parms_atomic();
+            H5Z_calc_parms_atomic(&cd_values_actual_nparms);
             break;
 
         case H5T_ARRAY:
-            if(H5Z_calc_parms_array(type) == FAIL)
+            if(H5Z_calc_parms_array(type, &cd_values_actual_nparms) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
         case H5T_COMPOUND:
-            if(H5Z_calc_parms_compound(type) == FAIL)
+            if(H5Z_calc_parms_compound(type, &cd_values_actual_nparms) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
@@ -882,7 +899,8 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
     cd_values_index = 2;
 
     /* Set "local" parameter for number of elements in the chunk */
-    H5_CHECKED_ASSIGN(cd_values[cd_values_index++], unsigned, npoints, hssize_t);
+    H5_CHECK_OVERFLOW(npoints, hssize_t, unsigned);
+    cd_values[cd_values_index++] = (unsigned)npoints;
 
     /* Assume no need to compress now, will be changed to FALSE later if not */
     need_not_compress = TRUE;
@@ -891,17 +909,17 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
     switch(dtype_class) {
         case H5T_INTEGER:
         case H5T_FLOAT:
-            if(H5Z_set_parms_atomic(type, cd_values) < 0)
+            if(H5Z_set_parms_atomic(type, &cd_values_index, cd_values, &need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
         case H5T_ARRAY:
-            if(H5Z_set_parms_array(type, cd_values) < 0)
+            if(H5Z_set_parms_array(type, &cd_values_index, cd_values, &need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
         case H5T_COMPOUND:
-            if(H5Z_set_parms_compound(type, cd_values) < 0)
+            if(H5Z_set_parms_compound(type, &cd_values_index, cd_values, &need_not_compress) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
@@ -927,8 +945,9 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
     HDassert(cd_values_actual_nparms == cd_values_index);
 
     /* Finally set the first two entries of cd_values[] */
-    cd_values[0] = cd_values_actual_nparms;
-    cd_values[1] = need_not_compress;
+    H5_CHECK_OVERFLOW(cd_values_actual_nparms, size_t, unsigned);
+    cd_values[0] = (unsigned)cd_values_actual_nparms;
+    cd_values[1] = (unsigned)need_not_compress;
 
     /* Modify the filter's parameters for this dataset */
     if(H5P_modify_filter(dcpl_plist, H5Z_FILTER_NBIT, flags, cd_values_actual_nparms, cd_values) < 0)
@@ -957,7 +976,7 @@ done:
  */
 static size_t
 H5Z_filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
-                size_t nbytes, size_t *buf_size, void **buf)
+    size_t nbytes, size_t *buf_size, void **buf)
 {
     unsigned char *outbuf;      /* pointer to new output buffer */
     size_t size_out  = 0;       /* size of output buffer */
@@ -990,7 +1009,8 @@ H5Z_filter_nbit(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for nbit decompression")
 
         /* decompress the buffer */
-        H5Z_nbit_decompress(outbuf, d_nelmts, (unsigned char *)*buf, cd_values);
+        if(H5Z__nbit_decompress(outbuf, d_nelmts, (unsigned char *)*buf, cd_values) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, 0, "can't decompress buffer")
     } /* end if */
     /* output; compress */
     else {
@@ -1027,63 +1047,64 @@ done:
  */
 
 static void
-H5Z_nbit_next_byte(size_t *j, int *buf_len)
+H5Z_nbit_next_byte(size_t *j, size_t *buf_len)
 {
    ++(*j);
    *buf_len = 8 * sizeof(unsigned char);
 }
 
 static void
-H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k,
-    int begin_i, int end_i, unsigned char *buffer, size_t *j, int *buf_len,
-    parms_atomic p, int datatype_len)
+H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, unsigned k,
+    unsigned begin_i, unsigned end_i, unsigned char *buffer, size_t *j, size_t *buf_len,
+    const parms_atomic *p, size_t datatype_len)
 {
-   int dat_len; /* dat_len is the number of bits to be copied in each data byte */
-   int uchar_offset;
+   size_t dat_len; /* dat_len is the number of bits to be copied in each data byte */
+   size_t dat_offset;
    unsigned char val; /* value to be copied in each data byte */
 
    /* initialize value and bits of unsigned char to be copied */
    val = buffer[*j];
-   uchar_offset = 0;
+   dat_offset = 0;
 
    if(begin_i != end_i) { /* significant bits occupy >1 unsigned char */
       if(k == begin_i)
-         dat_len = 8 - (datatype_len - p.precision - p.offset) % 8;
+         dat_len = 8 - (datatype_len - p->precision - p->offset) % 8;
       else if(k == end_i) {
-         dat_len = 8 - p.offset %8;
-         uchar_offset = 8 - dat_len;
+         dat_len = 8 - p->offset % 8;
+         dat_offset = 8 - dat_len;
       }
       else
          dat_len = 8;
    } else { /* all significant bits in one unsigned char */
-      uchar_offset = p.offset % 8;
-      dat_len = p.precision;
+      dat_offset = p->offset % 8;
+      dat_len = p->precision;
    }
 
    if(*buf_len > dat_len) {
-      data[data_offset + k] =
-      ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
+      data[data_offset + k] = (unsigned char)(
+          ((unsigned)(val >> (*buf_len - dat_len)) & (unsigned)(~((unsigned)(~0) << dat_len))) << dat_offset);
       *buf_len -= dat_len;
    } else {
-      data[data_offset + k] =
-      ((val & ~(~0 << *buf_len)) << (dat_len - *buf_len)) << uchar_offset;
+      data[data_offset + k] = (unsigned char)(
+          ((val & ~((unsigned)(~0) << *buf_len)) << (dat_len - *buf_len)) << dat_offset);
       dat_len -= *buf_len;
       H5Z_nbit_next_byte(j, buf_len);
-      if(dat_len == 0) return;
+      if(dat_len == 0)
+          return;
 
       val = buffer[*j];
-      data[data_offset + k] |=
-      ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
+      data[data_offset + k] |= (unsigned char)(
+          ((unsigned)(val >> (*buf_len - dat_len)) & (unsigned)(~((unsigned)(~0) << dat_len))) << dat_offset);
       *buf_len -= dat_len;
    }
 }
 
 static void
 H5Z_nbit_decompress_one_nooptype(unsigned char *data, size_t data_offset,
-                       unsigned char *buffer, size_t *j, int *buf_len, unsigned size)
+    unsigned char *buffer, size_t *j, size_t *buf_len, unsigned size)
 {
    unsigned i;        /* index */
-   unsigned dat_len;  /* dat_len is the number of bits to be copied in each data byte */
+   size_t dat_len;  /* dat_len is the number of bits to be copied in each data byte */
    unsigned char val; /* value to be copied in each data byte */
 
    for(i = 0; i < size; i++) {
@@ -1091,235 +1112,305 @@ H5Z_nbit_decompress_one_nooptype(unsigned char *data, size_t data_offset,
       val = buffer[*j];
       dat_len = sizeof(unsigned char) * 8;
 
-      data[data_offset + i] = ((val & ~(~0 << *buf_len)) << (dat_len - *buf_len));
+      data[data_offset + i] = (unsigned char)(((val & ~((unsigned)(~0) << *buf_len)) << (dat_len - *buf_len)));
       dat_len -= *buf_len;
       H5Z_nbit_next_byte(j, buf_len);
-      if(dat_len == 0) continue;
+      if(dat_len == 0)
+          continue;
 
       val = buffer[*j];
-      data[data_offset + i] |= ((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      data[data_offset + i] |= (unsigned char)((unsigned)(val >> (*buf_len - dat_len)) & (unsigned)(~((unsigned)(~0) << dat_len)));
       *buf_len -= dat_len;
    }
 }
 
 static void
 H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
-                    unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
+    unsigned char *buffer, size_t *j, size_t *buf_len, const parms_atomic *p)
 {
-   /* begin_i: the index of byte having first significant bit
-      end_i: the index of byte having last significant bit */
-   int k, begin_i, end_i, datatype_len;
-
-   datatype_len = p.size * 8;
-
-   if(p.order == H5Z_NBIT_ORDER_LE) { /* little endian */
-      /* calculate begin_i and end_i */
-      if((p.precision + p.offset) % 8 != 0)
-         begin_i = (p.precision + p.offset) / 8;
-      else
-         begin_i = (p.precision + p.offset) / 8 - 1;
-      end_i = p.offset / 8;
-
-      for(k = begin_i; k >= end_i; k--)
-         H5Z_nbit_decompress_one_byte(data, data_offset, k, begin_i, end_i,
-                                      buffer, j, buf_len, p, datatype_len);
-   }
-
-   if(p.order == H5Z_NBIT_ORDER_BE) { /* big endian */
-      /* calculate begin_i and end_i */
-      begin_i = (datatype_len - p.precision - p.offset) / 8;
-      if(p.offset % 8 != 0)
-         end_i = (datatype_len - p.offset) / 8;
-      else
-         end_i = (datatype_len - p.offset) / 8 - 1;
-
-      for(k = begin_i; k <= end_i; k++)
-         H5Z_nbit_decompress_one_byte(data, data_offset, k, begin_i, end_i,
-                                      buffer, j, buf_len, p, datatype_len);
-   }
+    /* begin_i: the index of byte having first significant bit
+       end_i: the index of byte having last significant bit */
+    int k;
+    unsigned begin_i, end_i;
+    size_t datatype_len;
+
+    datatype_len = p->size * 8;
+
+    if(p->order == H5Z_NBIT_ORDER_LE) { /* little endian */
+        /* calculate begin_i and end_i */
+        if((p->precision + p->offset) % 8 != 0)
+           begin_i = (p->precision + p->offset) / 8;
+        else
+           begin_i = (p->precision + p->offset) / 8 - 1;
+        end_i = p->offset / 8;
+
+        for(k = (int)begin_i; k >= (int)end_i; k--)
+            H5Z_nbit_decompress_one_byte(data, data_offset, (unsigned)k, begin_i, end_i,
+                                         buffer, j, buf_len, p, datatype_len);
+    }
+    else { /* big endian */
+        /* Sanity check */
+        HDassert(p->order == H5Z_NBIT_ORDER_BE);
+
+        /* calculate begin_i and end_i */
+        begin_i = ((unsigned)datatype_len - p->precision - p->offset) / 8;
+        if(p->offset % 8 != 0)
+           end_i = ((unsigned)datatype_len - p->offset) / 8;
+        else
+           end_i = ((unsigned)datatype_len - p->offset) / 8 - 1;
+
+        for(k = (int)begin_i; k <= (int)end_i; k++)
+            H5Z_nbit_decompress_one_byte(data, data_offset, (unsigned)k, begin_i, end_i,
+                                         buffer, j, buf_len, p, datatype_len);
+    }
 }
 
-static void
-H5Z_nbit_decompress_one_array(unsigned char *data, size_t data_offset,
-           unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+static herr_t
+H5Z__nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index)
 {
    unsigned i, total_size, base_class, base_size, n, begin_index;
    parms_atomic p;
+   herr_t ret_value = SUCCEED; /* Return value */
 
-   total_size = parms[parms_index++];
-   base_class = parms[parms_index++];
+   FUNC_ENTER_STATIC
+
+   total_size = parms[(*parms_index)++];
+   base_class = parms[(*parms_index)++];
 
    switch(base_class) {
       case H5Z_NBIT_ATOMIC:
-           p.size = parms[parms_index++];
-           p.order = parms[parms_index++];
-           p.precision = parms[parms_index++];
-           p.offset = parms[parms_index++];
-           n = total_size/p.size;
+           p.size = parms[(*parms_index)++];
+           p.order = parms[(*parms_index)++];
+           p.precision = parms[(*parms_index)++];
+           p.offset = parms[(*parms_index)++];
+
+           /* Check values of precision and offset */
+           if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+              HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+           n = total_size / p.size;
            for(i = 0; i < n; i++)
-              H5Z_nbit_decompress_one_atomic(data, data_offset + i*p.size,
-                                             buffer, j, buf_len, p);
+              H5Z_nbit_decompress_one_atomic(data, data_offset + i * p.size,
+                                             buffer, j, buf_len, &p);
            break;
+
       case H5Z_NBIT_ARRAY:
-           base_size = parms[parms_index]; /* read in advance */
-           n = total_size/base_size; /* number of base_type elements inside the array datatype */
-           begin_index = parms_index;
+           base_size = parms[*parms_index]; /* read in advance */
+           n = total_size / base_size; /* number of base_type elements inside the array datatype */
+           begin_index = *parms_index;
            for(i = 0; i < n; i++) {
-              H5Z_nbit_decompress_one_array(data, data_offset + i*base_size,
-                                            buffer, j, buf_len, parms);
-              parms_index = begin_index;
+              if(H5Z__nbit_decompress_one_array(data, data_offset + i * base_size,
+                                            buffer, j, buf_len, parms, parms_index) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
+              *parms_index = begin_index;
            }
            break;
+
       case H5Z_NBIT_COMPOUND:
-           base_size = parms[parms_index]; /* read in advance */
-           n = total_size/base_size; /* number of base_type elements inside the array datatype */
-           begin_index = parms_index;
+           base_size = parms[*parms_index]; /* read in advance */
+           n = total_size / base_size; /* number of base_type elements inside the array datatype */
+           begin_index = *parms_index;
            for(i = 0; i < n; i++) {
-              H5Z_nbit_decompress_one_compound(data, data_offset + i*base_size,
-                                               buffer, j, buf_len, parms);
-              parms_index = begin_index;
+              if(H5Z__nbit_decompress_one_compound(data, data_offset + i * base_size,
+                                               buffer, j, buf_len, parms, parms_index) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
+              *parms_index = begin_index;
            }
            break;
+
       case H5Z_NBIT_NOOPTYPE:
-           parms_index++; /* skip size of no-op type */
+           (*parms_index)++; /* skip size of no-op type */
            H5Z_nbit_decompress_one_nooptype(data, data_offset, buffer, j, buf_len, total_size);
            break;
+
       default:
           HDassert(0 && "This Should never be executed!");
    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 }
 
-static void
-H5Z_nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
-              unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+static herr_t
+H5Z__nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index)
 {
-   unsigned i, nmembers, member_offset, member_class, size;
+   unsigned i, nmembers, member_offset, member_class, member_size, used_size = 0, size;
    parms_atomic p;
+   herr_t ret_value = SUCCEED; /* Return value */
 
-   parms_index++; /* skip total size of compound datatype */
-   nmembers = parms[parms_index++];
+   FUNC_ENTER_STATIC
+
+   size = parms[(*parms_index)++];
+   nmembers = parms[(*parms_index)++];
 
    for(i = 0; i < nmembers; i++) {
-      member_offset = parms[parms_index++];
-      member_class = parms[parms_index++];
+      member_offset = parms[(*parms_index)++];
+      member_class = parms[(*parms_index)++];
+
+      /* Check for overflow */
+      member_size = parms[*parms_index];
+      used_size += member_size;
+      if(used_size > size)
+         HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "compound member offset overflowed compound size")
       switch(member_class) {
          case H5Z_NBIT_ATOMIC:
-              p.size = parms[parms_index++];
-              p.order = parms[parms_index++];
-              p.precision = parms[parms_index++];
-              p.offset = parms[parms_index++];
+              p.size = member_size;
+              /* Advance past member size */
+              (*parms_index)++;
+              p.order = parms[(*parms_index)++];
+              p.precision = parms[(*parms_index)++];
+              p.offset = parms[(*parms_index)++];
+
+              /* Check values of precision and offset */
+              if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
               H5Z_nbit_decompress_one_atomic(data, data_offset + member_offset,
-                                             buffer, j, buf_len, p);
+                                             buffer, j, buf_len, &p);
               break;
+
          case H5Z_NBIT_ARRAY:
-              H5Z_nbit_decompress_one_array(data, data_offset + member_offset,
-                                            buffer, j, buf_len, parms);
+              if(H5Z__nbit_decompress_one_array(data, data_offset + member_offset,
+                                            buffer, j, buf_len, parms, parms_index) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
               break;
+
          case H5Z_NBIT_COMPOUND:
-              H5Z_nbit_decompress_one_compound(data, data_offset+member_offset,
-                                               buffer, j, buf_len, parms);
+              if(H5Z__nbit_decompress_one_compound(data, data_offset+member_offset,
+                                            buffer, j, buf_len, parms, parms_index) < 0)
+                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
               break;
+
          case H5Z_NBIT_NOOPTYPE:
-              size = parms[parms_index++];
+              /* Advance past member size */
+              (*parms_index)++;
               H5Z_nbit_decompress_one_nooptype(data, data_offset+member_offset,
-                                               buffer, j, buf_len, size);
+                                               buffer, j, buf_len, member_size);
               break;
+
           default:
               HDassert(0 && "This Should never be executed!");
       } /* end switch */
    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 }
 
-static void
-H5Z_nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
-                                const unsigned parms[])
+static herr_t
+H5Z__nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+    const unsigned parms[])
 {
-   /* i: index of data, j: index of buffer,
-      buf_len: number of bits to be filled in current byte */
-   size_t i, j, size;
-   int buf_len;
-   parms_atomic p;
+    /* i: index of data, j: index of buffer,
+       buf_len: number of bits to be filled in current byte */
+    unsigned i;
+    size_t j, size;
+    size_t buf_len;
+    parms_atomic p;
+    unsigned parms_index; /* index in array parms used by compression/decompression functions */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-   /* may not have to initialize to zeros */
-   for(i = 0; i < d_nelmts*parms[4]; i++) data[i] = 0;
+    FUNC_ENTER_STATIC
 
-   /* initialization before the loop */
-   j = 0;
-   buf_len = sizeof(unsigned char) * 8;
+    /* may not have to initialize to zeros */
+    HDmemset(data, 0, d_nelmts * parms[4]);
 
-   switch(parms[3]) {
-      case H5Z_NBIT_ATOMIC:
-           /* set the index before goto function call */
-           p.size = parms[4];
-           p.order = parms[5];
-           p.precision = parms[6];
-           p.offset = parms[7];
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_decompress_one_atomic(data, i*p.size, buffer, &j, &buf_len, p);
-           }
-           break;
-      case H5Z_NBIT_ARRAY:
-           size = parms[4];
-           parms_index = 4;
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_decompress_one_array(data, i*size, buffer, &j, &buf_len, parms);
-              parms_index = 4;
-           }
-           break;
-      case H5Z_NBIT_COMPOUND:
-           size = parms[4];
-           parms_index = 4;
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_decompress_one_compound(data, i*size, buffer, &j, &buf_len, parms);
-              parms_index = 4;
-           }
-           break;
-      default:
-          HDassert(0 && "This Should never be executed!");
-   } /* end switch */
+    /* initialization before the loop */
+    j = 0;
+    buf_len = sizeof(unsigned char) * 8;
+
+    switch(parms[3]) {
+       case H5Z_NBIT_ATOMIC:
+            p.size = parms[4];
+            p.order = parms[5];
+            p.precision = parms[6];
+            p.offset = parms[7];
+
+            /* Check values of precision and offset */
+            if(p.precision > p.size * 8 || (p.precision + p.offset) > p.size * 8)
+               HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "invalid datatype precision/offset")
+
+            for(i = 0; i < d_nelmts; i++)
+               H5Z_nbit_decompress_one_atomic(data, i * p.size, buffer, &j, &buf_len, &p);
+            break;
+
+       case H5Z_NBIT_ARRAY:
+            size = parms[4];
+            parms_index = 4;    /* set the index before goto function call */
+            for(i = 0; i < d_nelmts; i++) {
+                if(H5Z__nbit_decompress_one_array(data, i * size, buffer, &j, &buf_len, parms, &parms_index) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress array")
+                parms_index = 4;
+            }
+            break;
+
+       case H5Z_NBIT_COMPOUND:
+            size = parms[4];
+            parms_index = 4;    /* set the index before goto function call */
+            for(i = 0; i < d_nelmts; i++) {
+                if(H5Z__nbit_decompress_one_compound(data, i * size, buffer, &j, &buf_len, parms, &parms_index) < 0)
+                    HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "can't decompress compound")
+                parms_index = 4;
+            }
+            break;
+
+       default:
+           HDassert(0 && "This Should never be executed!");
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 }
 
-static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
-int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len)
+static void
+H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, unsigned k,
+    unsigned begin_i, unsigned end_i, unsigned char *buffer, size_t *j, size_t *buf_len,
+    const parms_atomic *p, size_t datatype_len)
 {
-   int dat_len; /* dat_len is the number of bits to be copied in each data byte */
+   size_t dat_len; /* dat_len is the number of bits to be copied in each data byte */
    unsigned char val; /* value to be copied in each data byte */
 
    /* initialize value and bits of unsigned char to be copied */
    val = data[data_offset + k];
    if(begin_i != end_i) { /* significant bits occupy >1 unsigned char */
       if(k == begin_i)
-         dat_len = 8 - (datatype_len - p.precision - p.offset) % 8;
+         dat_len = 8 - (datatype_len - p->precision - p->offset) % 8;
       else if(k == end_i) {
-         dat_len = 8 - p.offset % 8;
-         val >>= 8 - dat_len;
+         dat_len = 8 - p->offset % 8;
+         val = (unsigned char)(val >> (8 - dat_len));
       }
       else
          dat_len = 8;
    } else { /* all significant bits in one unsigned char */
-      val >>= p.offset % 8;
-      dat_len = p.precision;
+      val = (unsigned char)(val >> (p->offset % 8));
+      dat_len = p->precision;
    }
 
    if(*buf_len > dat_len) {
-      buffer[*j] |= (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      buffer[*j] |= (unsigned char)((val & ~((unsigned)(~0) << dat_len)) << (*buf_len - dat_len));
       *buf_len -= dat_len;
    } else {
-      buffer[*j] |= (val >> (dat_len - *buf_len)) & ~(~0 << *buf_len);
+      buffer[*j] |= (unsigned char)((unsigned)(val >> (dat_len - *buf_len)) & ~((unsigned)(~0) << *buf_len));
       dat_len -= *buf_len;
       H5Z_nbit_next_byte(j, buf_len);
-      if(dat_len == 0) return;
+      if(dat_len == 0)
+          return;
 
-      buffer[*j] = (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      buffer[*j] = (unsigned char)((val & ~((unsigned)(~0) << dat_len)) << (*buf_len - dat_len));
       *buf_len -= dat_len;
    }
 }
 
-static void H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offset,
-                     unsigned char *buffer, size_t *j, int *buf_len, unsigned size)
+static void
+H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, unsigned size)
 {
    unsigned i;        /* index */
-   unsigned dat_len;  /* dat_len is the number of bits to be copied in each data byte */
+   size_t dat_len;  /* dat_len is the number of bits to be copied in each data byte */
    unsigned char val; /* value to be copied in each data byte */
 
    for(i = 0; i < size; i++) {
@@ -1327,192 +1418,214 @@ static void H5Z_nbit_compress_one_nooptype(unsigned char *data, size_t data_offs
       val = data[data_offset + i];
       dat_len = sizeof(unsigned char) * 8;
 
-      buffer[*j] |= (val >> (dat_len - *buf_len)) & ~(~0 << *buf_len);
+      buffer[*j] |= (unsigned char)((unsigned)(val >> (dat_len - *buf_len)) & ~((unsigned)(~0) << *buf_len));
       dat_len -= *buf_len;
       H5Z_nbit_next_byte(j, buf_len);
-      if(dat_len == 0) continue;
+      if(dat_len == 0)
+          continue;
 
-      buffer[*j] = (val & ~(~0 << dat_len)) << (*buf_len - dat_len);
+      buffer[*j] = (unsigned char)((val & ~((unsigned)(~0) << dat_len)) << (*buf_len - dat_len));
       *buf_len -= dat_len;
    }
 }
 
-static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
-                  unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
+static void
+H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const parms_atomic *p)
 {
-   /* begin_i: the index of byte having first significant bit
-      end_i: the index of byte having last significant bit */
-   int k, begin_i, end_i, datatype_len;
-
-   datatype_len = p.size * 8;
-
-   if(p.order == H5Z_NBIT_ORDER_LE) { /* little endian */
-      /* calculate begin_i and end_i */
-      if((p.precision + p.offset) % 8 != 0)
-         begin_i = (p.precision + p.offset) / 8;
-      else
-         begin_i = (p.precision + p.offset) / 8 - 1;
-      end_i = p.offset / 8;
-
-      for(k = begin_i; k >= end_i; k--)
-         H5Z_nbit_compress_one_byte(data, data_offset, k, begin_i, end_i,
-                                    buffer, j, buf_len, p, datatype_len);
-   }
-
-   if(p.order == H5Z_NBIT_ORDER_BE) { /* big endian */
-      /* calculate begin_i and end_i */
-      begin_i = (datatype_len - p.precision - p.offset) / 8;
-      if(p.offset % 8 != 0)
-         end_i = (datatype_len - p.offset) / 8;
-      else
-         end_i = (datatype_len - p.offset) / 8 - 1;
-
-      for(k = begin_i; k <= end_i; k++)
-         H5Z_nbit_compress_one_byte(data, data_offset, k, begin_i, end_i,
-                                    buffer, j, buf_len, p, datatype_len);
-   }
+    /* begin_i: the index of byte having first significant bit
+       end_i: the index of byte having last significant bit */
+    int k;
+    unsigned begin_i, end_i;
+    size_t datatype_len;
+
+    datatype_len = p->size * 8;
+
+    if(p->order == H5Z_NBIT_ORDER_LE) { /* little endian */
+        /* calculate begin_i and end_i */
+        if((p->precision + p->offset) % 8 != 0)
+           begin_i = (p->precision + p->offset) / 8;
+        else
+           begin_i = (p->precision + p->offset) / 8 - 1;
+        end_i = p->offset / 8;
+
+        for(k = (int)begin_i; k >= (int)end_i; k--)
+            H5Z_nbit_compress_one_byte(data, data_offset, (unsigned)k, begin_i, end_i,
+                                       buffer, j, buf_len, p, datatype_len);
+    }
+    else { /* big endian */
+        /* Sanity check */
+        HDassert(p->order == H5Z_NBIT_ORDER_BE);
+
+        /* calculate begin_i and end_i */
+        begin_i = ((unsigned)datatype_len - p->precision - p->offset) / 8;
+        if(p->offset % 8 != 0)
+           end_i = ((unsigned)datatype_len - p->offset) / 8;
+        else
+           end_i = ((unsigned)datatype_len - p->offset) / 8 - 1;
+
+        for(k = (int)begin_i; k <= (int)end_i; k++)
+            H5Z_nbit_compress_one_byte(data, data_offset, (unsigned)k, begin_i, end_i,
+                                       buffer, j, buf_len, p, datatype_len);
+    }
 }
 
-static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset, unsigned char *buffer,
-                                 size_t *j, int *buf_len, const unsigned parms[])
+static void
+H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index)
 {
    unsigned i, total_size, base_class, base_size, n, begin_index;
    parms_atomic p;
 
-   total_size = parms[parms_index++];
-   base_class = parms[parms_index++];
+   total_size = parms[(*parms_index)++];
+   base_class = parms[(*parms_index)++];
 
    switch(base_class) {
       case H5Z_NBIT_ATOMIC:
-           p.size = parms[parms_index++];
-           p.order = parms[parms_index++];
-           p.precision = parms[parms_index++];
-           p.offset = parms[parms_index++];
-           n = total_size/p.size;
+           p.size = parms[(*parms_index)++];
+           p.order = parms[(*parms_index)++];
+           p.precision = parms[(*parms_index)++];
+           p.offset = parms[(*parms_index)++];
+           n = total_size / p.size;
            for(i = 0; i < n; i++)
-              H5Z_nbit_compress_one_atomic(data, data_offset + i*p.size,
-                                           buffer, j, buf_len, p);
+              H5Z_nbit_compress_one_atomic(data, data_offset + i * p.size,
+                                           buffer, j, buf_len, &p);
            break;
+
       case H5Z_NBIT_ARRAY:
-           base_size = parms[parms_index]; /* read in advance */
-           n = total_size/base_size; /* number of base_type elements inside the array datatype */
-           begin_index = parms_index;
+           base_size = parms[*parms_index]; /* read in advance */
+           n = total_size / base_size; /* number of base_type elements inside the array datatype */
+           begin_index = *parms_index;
            for(i = 0; i < n; i++) {
-              H5Z_nbit_compress_one_array(data, data_offset + i*base_size,
-                                          buffer, j, buf_len, parms);
-              parms_index = begin_index;
+              H5Z_nbit_compress_one_array(data, data_offset + i * base_size,
+                                          buffer, j, buf_len, parms, parms_index);
+              *parms_index = begin_index;
            }
            break;
+
       case H5Z_NBIT_COMPOUND:
-           base_size = parms[parms_index]; /* read in advance */
-           n = total_size/base_size; /* number of base_type elements inside the array datatype */
-           begin_index = parms_index;
+           base_size = parms[*parms_index]; /* read in advance */
+           n = total_size / base_size; /* number of base_type elements inside the array datatype */
+           begin_index = *parms_index;
            for(i = 0; i < n; i++) {
-              H5Z_nbit_compress_one_compound(data, data_offset + i*base_size,
-                                             buffer, j, buf_len, parms);
-              parms_index = begin_index;
+              H5Z_nbit_compress_one_compound(data, data_offset + i * base_size,
+                                             buffer, j, buf_len, parms, parms_index);
+              *parms_index = begin_index;
            }
            break;
+
       case H5Z_NBIT_NOOPTYPE:
-           parms_index++; /* skip size of no-op type */
+           (*parms_index)++; /* skip size of no-op type */
            H5Z_nbit_compress_one_nooptype(data, data_offset, buffer, j, buf_len, total_size);
            break;
+
       default:
           HDassert(0 && "This Should never be executed!");
    } /* end switch */
 }
 
-static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
-            unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
+static void
+H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
+    unsigned char *buffer, size_t *j, size_t *buf_len, const unsigned parms[],
+    unsigned *parms_index)
 {
    unsigned i, nmembers, member_offset, member_class, size;
    parms_atomic p;
 
-   parms_index++; /* skip size of compound datatype */
-   nmembers = parms[parms_index++];
+   (*parms_index)++; /* skip size of compound datatype */
+   nmembers = parms[(*parms_index)++];
 
    for(i = 0; i < nmembers; i++) {
-      member_offset = parms[parms_index++];
-      member_class = parms[parms_index++];
+      member_offset = parms[(*parms_index)++];
+      member_class = parms[(*parms_index)++];
 
       switch(member_class) {
          case H5Z_NBIT_ATOMIC:
-              p.size = parms[parms_index++];
-              p.order = parms[parms_index++];
-              p.precision = parms[parms_index++];
-              p.offset = parms[parms_index++];
+              p.size = parms[(*parms_index)++];
+              p.order = parms[(*parms_index)++];
+              p.precision = parms[(*parms_index)++];
+              p.offset = parms[(*parms_index)++];
               H5Z_nbit_compress_one_atomic(data, data_offset + member_offset,
-                                           buffer, j, buf_len, p);
+                                           buffer, j, buf_len, &p);
               break;
+
          case H5Z_NBIT_ARRAY:
               H5Z_nbit_compress_one_array(data, data_offset + member_offset,
-                                          buffer, j, buf_len, parms);
+                                          buffer, j, buf_len, parms, parms_index);
               break;
+
          case H5Z_NBIT_COMPOUND:
               H5Z_nbit_compress_one_compound(data, data_offset+member_offset,
-                                             buffer, j, buf_len, parms);
+                                             buffer, j, buf_len, parms, parms_index);
               break;
+
          case H5Z_NBIT_NOOPTYPE:
-              size = parms[parms_index++];
+              size = parms[(*parms_index)++];
               H5Z_nbit_compress_one_nooptype(data, data_offset+member_offset,
                                              buffer, j, buf_len, size);
               break;
+
          default:
              HDassert(0 && "This Should never be executed!");
       } /* end switch */
    }
 }
 
-static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
-                              size_t *buffer_size, const unsigned parms[])
+static void
+H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+    size_t *buffer_size, const unsigned parms[])
 {
-   /* i: index of data, new_size: index of buffer,
-      buf_len: number of bits to be filled in current byte */
-   size_t i, size;
-   size_t new_size = 0;
-   int buf_len;
-   parms_atomic p;
+    /* i: index of data, new_size: index of buffer,
+       buf_len: number of bits to be filled in current byte */
+    unsigned i;
+    size_t size;
+    size_t new_size = 0;
+    size_t buf_len;
+    parms_atomic p;
+    unsigned parms_index; /* index in array parms used by compression/decompression functions */
+
+    /* must initialize buffer to be zeros */
+    HDmemset(buffer, 0, *buffer_size);
+
+    /* initialization before the loop */
+    buf_len = sizeof(unsigned char) * 8;
+
+    switch(parms[3]) {
+       case H5Z_NBIT_ATOMIC:
+            p.size = parms[4];
+            p.order = parms[5];
+            p.precision = parms[6];
+            p.offset = parms[7];
+
+            for(i = 0; i < d_nelmts; i++)
+                H5Z_nbit_compress_one_atomic(data, i * p.size, buffer, &new_size, &buf_len, &p);
+            break;
 
-   /* must initialize buffer to be zeros */
-   HDmemset(buffer, 0, *buffer_size);
+       case H5Z_NBIT_ARRAY:
+            size = parms[4];
+            parms_index = 4;
+            for(i = 0; i < d_nelmts; i++) {
+                H5Z_nbit_compress_one_array(data, i * size, buffer, &new_size, &buf_len, parms, &parms_index);
+                parms_index = 4;
+            }
+            break;
 
-   /* initialization before the loop */
-   buf_len = sizeof(unsigned char) * 8;
+       case H5Z_NBIT_COMPOUND:
+            size = parms[4];
+            parms_index = 4;
+            for(i = 0; i < d_nelmts; i++) {
+                H5Z_nbit_compress_one_compound(data, i * size, buffer, &new_size, &buf_len, parms, &parms_index);
+                parms_index = 4;
+            }
+            break;
 
-   switch(parms[3]) {
-      case H5Z_NBIT_ATOMIC:
-           /* set the index before goto function call */
-           p.size = parms[4];
-           p.order = parms[5];
-           p.precision = parms[6];
-           p.offset = parms[7];
-
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_compress_one_atomic(data, i*p.size, buffer, &new_size, &buf_len, p);
-           }
-           break;
-      case H5Z_NBIT_ARRAY:
-           size = parms[4];
-           parms_index = 4;
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_compress_one_array(data, i*size, buffer, &new_size, &buf_len, parms);
-              parms_index = 4;
-           }
-           break;
-      case H5Z_NBIT_COMPOUND:
-           size = parms[4];
-           parms_index = 4;
-           for(i = 0; i < d_nelmts; i++) {
-              H5Z_nbit_compress_one_compound(data, i*size, buffer, &new_size, &buf_len, parms);
-              parms_index = 4;
-           }
-           break;
-       default:
-           HDassert(0 && "This Should never be executed!");
-   } /* end switch */
+        default:
+            HDassert(0 && "This Should never be executed!");
+    } /* end switch */
 
-   /* Update the size to the new value after compression.  If there are any bits hanging over in
-    * the last byte, increment the value by 1. */
-   *buffer_size = new_size + 1;
+    /* Update the size to the new value after compression.  If there are any bits hanging over in
+     * the last byte, increment the value by 1. */
+    *buffer_size = new_size + 1;
 }
 
diff --git a/src/H5Zpkg.h b/src/H5Zpkg.h
index aa2ffe2..2aa17f2 100644
--- a/src/H5Zpkg.h
+++ b/src/H5Zpkg.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #if !(defined H5Z_FRIEND || defined H5Z_MODULE)
diff --git a/src/H5Zprivate.h b/src/H5Zprivate.h
index 73d85ac..fe182ad 100644
--- a/src/H5Zprivate.h
+++ b/src/H5Zprivate.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
diff --git a/src/H5Zpublic.h b/src/H5Zpublic.h
index 8daa5f4..f6b313e 100644
--- a/src/H5Zpublic.h
+++ b/src/H5Zpublic.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
diff --git a/src/H5Zscaleoffset.c b/src/H5Zscaleoffset.c
index 7c9dbf9..b86d785 100644
--- a/src/H5Zscaleoffset.c
+++ b/src/H5Zscaleoffset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
@@ -28,7 +26,7 @@
 
 /* Struct of parameters needed for compressing/decompressing one atomic datatype */
 typedef struct {
-   size_t size;        /* datatype size */
+   unsigned size;      /* datatype size */
    uint32_t minbits;   /* minimum bits to compress one value of such datatype */
    unsigned mem_order; /* current memory endianness order */
 } parms_atomic;
@@ -38,7 +36,6 @@ enum H5Z_scaleoffset_t {t_bad=0, t_uchar=1, t_ushort, t_uint, t_ulong, t_ulong_l
                            t_float, t_double};
 
 /* Local function prototypes */
-static double H5Z_scaleoffset_rnd(double val);
 static htri_t H5Z_can_apply_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id);
 static enum H5Z_scaleoffset_t H5Z_scaleoffset_get_type(unsigned dtype_class,
     unsigned dtype_size, unsigned dtype_sign);
@@ -48,7 +45,7 @@ static herr_t H5Z_scaleoffset_set_parms_fillval(H5P_genplist_t *dcpl_plist,
 static herr_t H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id);
 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 void H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, unsigned dtype_size);
 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[],
@@ -389,25 +386,28 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
 }
 
 /* Check and handle special situation for floating-point type */
-#define H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                    \
+#define H5Z_scaleoffset_check_3(i, type, pow_fun, round_fun, max, min, minbits, D_val)                    \
 {                                                                                     \
-   if(sizeof(type)==sizeof(int)) {                                                    \
-      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
-         > HDpow(2.0f, (double)(sizeof(int)*8 - 1))) {                                \
-         *minbits = sizeof(int)*8; goto done;                                         \
-      }                                                                               \
-   } else if(sizeof(type)==sizeof(long)) {                                            \
-      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
-         > HDpow(2.0f, (double)(sizeof(long)*8 - 1))) {                               \
-         *minbits = sizeof(long)*8; goto done;                                        \
-      }                                                                               \
-   } else if(sizeof(type)==sizeof(long long)) {                                       \
-      if(H5Z_scaleoffset_rnd(max*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val))       \
-         > HDpow(2.0f, (double)(sizeof(long long)*8 - 1))) {                          \
-         *minbits = sizeof(long long)*8; goto done;                                   \
-      }                                                                               \
-   } else                                                                             \
-      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+    if(sizeof(type) == sizeof(int)) {                                                 \
+        if(round_fun(max * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)) \
+                > pow_fun(2.0f, (type)(sizeof(int) * 8 - 1))) {                     \
+            *minbits = sizeof(int) * 8;                                               \
+            goto done;                                                                \
+        }                                                                             \
+    } else if(sizeof(type) == sizeof(long)) {                                         \
+        if(round_fun(max * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)) \
+                > pow_fun(2.0f, (type)(sizeof(long) * 8 - 1))) {                    \
+            *minbits = sizeof(long) * 8;                                              \
+            goto done;                                                                \
+        }                                                                             \
+    } else if(sizeof(type) == sizeof(long long)) {                                    \
+        if(round_fun(max * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)) \
+                > pow_fun(2.0f, (type)(sizeof(long long) * 8 - 1))) {               \
+            *minbits = sizeof(long long) * 8;                                         \
+            goto done;                                                                \
+        }                                                                             \
+    } else                                                                            \
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
 }
 
 /* Precompress for unsigned integer type */
@@ -477,53 +477,47 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
 }
 
 /* Modify values of data in precompression if fill value defined for floating-point type */
-#define H5Z_scaleoffset_modify_1(i, type, buf, d_nelmts, filval, minbits, min, D_val) \
+#define H5Z_scaleoffset_modify_1(i, type, pow_fun, abs_fun, lround_fun, llround_fun, buf, d_nelmts, filval, minbits, min, D_val) \
 {                                                                                     \
-   if(sizeof(type)==sizeof(int))                                                      \
+   if(sizeof(type) == sizeof(int))                                                    \
       for(i = 0; i < d_nelmts; i++) {                                                 \
-         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+         if(abs_fun(buf[i] - filval) < pow_fun(10.0f, (type)-D_val))                  \
             *(int *)&buf[i] = (int)(((unsigned int)1 << *minbits) - 1);               \
          else                                                                         \
-            *(int *)&buf[i] = H5Z_scaleoffset_rnd(                                    \
-                              buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));  \
+            *(int *)&buf[i] = (int)lround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val));  \
       }                                                                               \
-   else if(sizeof(type)==sizeof(long))                                                \
+   else if(sizeof(type) == sizeof(long))                                              \
       for(i = 0; i < d_nelmts; i++) {                                                 \
-         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+         if(abs_fun(buf[i] - filval) < pow_fun(10.0f, (type)-D_val))                  \
             *(long *)&buf[i] = (long)(((unsigned long)1 << *minbits) - 1);            \
          else                                                                         \
-            *(long *)&buf[i] = H5Z_scaleoffset_rnd(                                   \
-                               buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+            *(long *)&buf[i] = lround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)); \
       }                                                                               \
-   else if(sizeof(type)==sizeof(long long))                                           \
+   else if(sizeof(type) == sizeof(long long))                                         \
       for(i = 0; i < d_nelmts; i++) {                                                 \
-         if(HDfabs(buf[i] - filval) < HDpow(10.0f, -D_val))                           \
+         if(abs_fun(buf[i] - filval) < pow_fun(10.0f, (type)-D_val))                  \
             *(long long *)&buf[i] = (long long)(((unsigned long long)1 << *minbits) - 1); \
          else                                                                         \
-            *(long long *)&buf[i] = H5Z_scaleoffset_rnd(                              \
-                                    buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+            *(long long *)&buf[i] = llround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)); \
       }                                                                               \
    else                                                                               \
-      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
 }
 
 /* Modify values of data in precompression if fill value undefined for floating-point type */
-#define H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val)                  \
+#define H5Z_scaleoffset_modify_2(i, type, pow_fun, lround_fun, llround_fun, buf, d_nelmts, min, D_val)         \
 {                                                                                     \
-   if(sizeof(type)==sizeof(int))                                                      \
+   if(sizeof(type) == sizeof(int))                                                    \
       for(i = 0; i < d_nelmts; i++)                                                   \
-         *(int *)&buf[i] = H5Z_scaleoffset_rnd(                                       \
-                           buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));     \
-   else if(sizeof(type)==sizeof(long))                                                \
+         *(int *)&buf[i] = (int)lround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val));     \
+   else if(sizeof(type) == sizeof(long))                                              \
       for(i = 0; i < d_nelmts; i++)                                                   \
-         *(long *)&buf[i] = H5Z_scaleoffset_rnd(                                      \
-                            buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val));    \
-   else if(sizeof(type)==sizeof(long long))                                           \
+         *(long *)&buf[i] = lround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val));    \
+   else if(sizeof(type) == sizeof(long long))                                         \
       for(i = 0; i < d_nelmts; i++)                                                   \
-         *(long long *)&buf[i] = H5Z_scaleoffset_rnd(                                 \
-                                 buf[i]*HDpow(10.0f, D_val) - min*HDpow(10.0f, D_val)); \
+         *(long long *)&buf[i] = llround_fun(buf[i] * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)); \
    else                                                                               \
-      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\
+      HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
 }
 
 /* Save the minimum value for floating-point type */
@@ -546,7 +540,7 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
 }
 
 /* Precompress for floating-point type using variable-minimum-bits method */
-#define H5Z_scaleoffset_precompress_3(type, data, d_nelmts, filavail, cd_values,         \
+#define H5Z_scaleoffset_precompress_3(type, pow_fun, abs_fun, round_fun, lround_fun, llround_fun, data, d_nelmts, filavail, cd_values,         \
                                       minbits, minval, D_val)                            \
 {                                                                                        \
    type *buf = (type *)data, min = 0, max = 0, filval = 0;                               \
@@ -557,18 +551,18 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
    if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */               \
       H5Z_scaleoffset_get_filval_2(type, cd_values, filval)                              \
       H5Z_scaleoffset_max_min_3(i, d_nelmts, buf, filval, max, min, D_val)               \
-      H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                         \
-      span = H5Z_scaleoffset_rnd(max * HDpow(10.0f, D_val) - min * HDpow(10.0f, D_val)) + 1; \
-      *minbits = H5Z_scaleoffset_log2((unsigned long long)(span + 1));                   \
+      H5Z_scaleoffset_check_3(i, type, pow_fun, round_fun, max, min, minbits, D_val)                \
+      span = (unsigned long long)(llround_fun(max * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)) + 1); \
+      *minbits = H5Z_scaleoffset_log2(span + 1);                                         \
       if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */  \
-         H5Z_scaleoffset_modify_1(i, type, buf, d_nelmts, filval, minbits, min, D_val)   \
+         H5Z_scaleoffset_modify_1(i, type, pow_fun, abs_fun, lround_fun, llround_fun, buf, d_nelmts, filval, minbits, min, D_val)   \
    } else { /* fill value undefined */                                                   \
       H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min)                              \
-      H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val)                         \
-      span = H5Z_scaleoffset_rnd(max * HDpow(10.0f, D_val) - min * HDpow(10.0f, D_val)) + 1; \
-      *minbits = H5Z_scaleoffset_log2((unsigned long long)span);                         \
+      H5Z_scaleoffset_check_3(i, type, pow_fun, round_fun, max, min, minbits, D_val)                \
+      span = (unsigned long long)(llround_fun(max * pow_fun(10.0f, (type)D_val) - min * pow_fun(10.0f, (type)D_val)) + 1); \
+      *minbits = H5Z_scaleoffset_log2(span);                                             \
       if(*minbits != sizeof(type) * 8) /* change values if minbits != full precision */  \
-         H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val)                    \
+         H5Z_scaleoffset_modify_2(i, type, pow_fun, lround_fun, llround_fun, buf, d_nelmts, min, D_val)                    \
    }                                                                                     \
    H5Z_scaleoffset_save_min(i, type, minval, min)                                        \
 }
@@ -621,42 +615,42 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
 }
 
 /* Modify values of data in postdecompression if fill value defined for floating-point type */
-#define H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val)     \
+#define H5Z_scaleoffset_modify_3(i, type, pow_fun, buf, d_nelmts, filval, minbits, min, D_val)     \
 {                                                                                         \
-   if(sizeof(type)==sizeof(int))                                                          \
+   if(sizeof(type) == sizeof(int))                                                          \
       for(i = 0; i < d_nelmts; i++)                                                       \
          buf[i] = (type)((*(int *)&buf[i] == (int)(((unsigned int)1 << minbits) - 1)) ?   \
-                  filval : (double)(*(int *)&buf[i]) / HDpow(10.0f, D_val) + min);        \
-   else if(sizeof(type)==sizeof(long))                                                    \
+                  filval : (type)(*(int *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min);        \
+   else if(sizeof(type) == sizeof(long))                                                    \
       for(i = 0; i < d_nelmts; i++)                                                       \
          buf[i] = (type)((*(long *)&buf[i] == (long)(((unsigned long)1 << minbits) - 1)) ? \
-                  filval : (double)(*(long *)&buf[i]) / HDpow(10.0f, D_val) + min);       \
-   else if(sizeof(type)==sizeof(long long))                                               \
+                  filval : (type)(*(long *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min);       \
+   else if(sizeof(type) == sizeof(long long))                                               \
       for(i = 0; i < d_nelmts; i++)                                                       \
          buf[i] = (type)((*(long long *)&buf[i] == (long long)(((unsigned long long)1 << minbits) - 1)) ? \
-                  filval : (double)(*(long long *)&buf[i]) / HDpow(10.0f, D_val) + min);  \
+                  filval : (type)(*(long long *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min);  \
    else                                                                                   \
       HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")    \
 }
 
 /* Modify values of data in postdecompression if fill value undefined for floating-point type */
-#define H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val)                   \
+#define H5Z_scaleoffset_modify_4(i, type, pow_fun, buf, d_nelmts, min, D_val)                   \
 {                                                                                      \
    if(sizeof(type)==sizeof(int))                                                       \
       for(i = 0; i < d_nelmts; i++)                                                    \
-         buf[i] = (type)((double)(*(int *)&buf[i]) / HDpow(10.0f, D_val) + min);       \
+         buf[i] = ((type)(*(int *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min);       \
    else if(sizeof(type)==sizeof(long))                                                 \
       for(i = 0; i < d_nelmts; i++)                                                    \
-         buf[i] = (type)((double)(*(long *)&buf[i]) / HDpow(10.0f, D_val) + min);      \
+         buf[i] = ((type)(*(long *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min);      \
    else if(sizeof(type)==sizeof(long long))                                            \
       for(i = 0; i < d_nelmts; i++)                                                    \
-         buf[i] = (type)((double)(*(long long *)&buf[i]) / HDpow(10.0f, D_val) + min); \
+         buf[i] = ((type)(*(long long *)&buf[i]) / pow_fun(10.0f, (type)D_val) + min); \
    else                                                                                \
       HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \
 }
 
 /* Postdecompress for floating-point type using variable-minimum-bits method */
-#define H5Z_scaleoffset_postdecompress_3(type, data, d_nelmts, filavail, cd_values,    \
+#define H5Z_scaleoffset_postdecompress_3(type, pow_fun, data, d_nelmts, filavail, cd_values,    \
                                          minbits, minval, D_val)                       \
 {                                                                                      \
    type *buf = (type *)data, filval = 0, min = 0;                                      \
@@ -666,9 +660,9 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
                                                                                        \
    if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */             \
       H5Z_scaleoffset_get_filval_2(type, cd_values, filval)                            \
-      H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val)    \
+      H5Z_scaleoffset_modify_3(i, type, pow_fun, buf, d_nelmts, filval, minbits, min, D_val)    \
    } else /* fill value undefined */                                                   \
-      H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val)                     \
+      H5Z_scaleoffset_modify_4(i, type, pow_fun, buf, d_nelmts, min, D_val)                     \
 }
 
 

@@ -756,7 +750,9 @@ H5Z_scaleoffset_get_type(unsigned dtype_class, unsigned dtype_size, unsigned dty
             else if(dtype_size == sizeof(unsigned short))     type = t_ushort;
             else if(dtype_size == sizeof(unsigned int))       type = t_uint;
             else if(dtype_size == sizeof(unsigned long))      type = t_ulong;
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
             else if(dtype_size == sizeof(unsigned long long)) type = t_ulong_long;
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
             else
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, t_bad, "cannot find matched memory dataype")
         }
@@ -766,7 +762,9 @@ H5Z_scaleoffset_get_type(unsigned dtype_class, unsigned dtype_size, unsigned dty
             else if(dtype_size == sizeof(short))       type = t_short;
             else if(dtype_size == sizeof(int))         type = t_int;
             else if(dtype_size == sizeof(long))        type = t_long;
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
             else if(dtype_size == sizeof(long long))   type = t_long_long;
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
             else
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, t_bad, "cannot find matched memory dataype")
         }
@@ -935,7 +933,8 @@ H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id)
 	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for datatype size */
-    cd_values[H5Z_SCALEOFFSET_PARM_SIZE] = dtype_size;
+    H5_CHECK_OVERFLOW(dtype_size, size_t, unsigned);
+    cd_values[H5Z_SCALEOFFSET_PARM_SIZE] = (unsigned)dtype_size;
 
     if(dtype_class == H5T_INTEGER) {
         /* Get datatype's sign */
@@ -1196,7 +1195,7 @@ H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts, const unsigned cd_value
         }
 
         /* before postprocess, get memory type */
-        if((type = H5Z_scaleoffset_get_type(dtype_class, (unsigned)p.size, dtype_sign)) == 0)
+        if((type = H5Z_scaleoffset_get_type(dtype_class, p.size, dtype_sign)) == 0)
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "cannot use C integer datatype for cast")
 
         /* postprocess after decompression */
@@ -1224,7 +1223,7 @@ H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts, const unsigned cd_value
             H5Z_scaleoffset_convert(*buf, d_nelmts, p.size);
 
         /* before preprocess, get memory type */
-        if((type = H5Z_scaleoffset_get_type(dtype_class, (unsigned)p.size, dtype_sign))==0)
+        if((type = H5Z_scaleoffset_get_type(dtype_class, p.size, dtype_sign))==0)
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "cannot use C integer datatype for cast")
 
         /* preprocess before compression */
@@ -1316,10 +1315,10 @@ done:
  * or from big-endian to little-endian  2/21/2005
  */
 static void
-H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, size_t dtype_size)
+H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, unsigned dtype_size)
 {
    if(dtype_size > 1) {
-       unsigned i, j;
+       size_t i, j;
        unsigned char *buffer, temp;
 
        buffer = (unsigned char *)buf;
@@ -1333,32 +1332,6 @@ H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, size_t dtype_size)
     } /* end if */
 } /* end H5Z_scaleoffset_convert() */
 
-/* Round a floating-point value to the nearest integer value 4/19/05 */
-/* rounding to the bigger absolute value if val is in the middle,
- 0.5 -> 1, -0.5 ->-1
-5/9/05, KY */
-static double
-H5Z_scaleoffset_rnd(double val)
-{
-    double u_val, l_val;
-
-    u_val = HDceil(val);
-    l_val = HDfloor(val);
-
-    if(val > 0) {
-        if((u_val - val) <= (val - l_val))
-            return u_val;
-        else
-            return l_val;
-    } /* end if */
-    else {
-        if((val - l_val) <= (u_val - val))
-            return l_val;
-        else
-            return u_val;
-    }
-} /* H5Z_scaleoffset_rnd() */
-
 /* return ceiling of floating-point log2 function
  * receive unsigned integer as argument 3/10/2005
  */
@@ -1507,19 +1480,19 @@ H5Z_scaleoffset_precompress_fd(void *data, unsigned d_nelmts, enum H5Z_scaleoffs
     unsigned filavail, const unsigned cd_values[], uint32_t *minbits,
     unsigned long long *minval, double D_val)
 {
-   herr_t ret_value=SUCCEED; /* Return value */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-   FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT
 
-   if(type == t_float)
-      H5Z_scaleoffset_precompress_3(float, data, d_nelmts,
-                                    filavail, cd_values, minbits, minval, D_val)
-   else if(type == t_double)
-      H5Z_scaleoffset_precompress_3(double, data, d_nelmts,
-                                    filavail, cd_values, minbits, minval, D_val)
+    if(type == t_float)
+        H5Z_scaleoffset_precompress_3(float, HDpowf, HDfabsf, HDroundf, HDlroundf, HDllroundf, data, d_nelmts,
+                                      filavail, cd_values, minbits, minval, D_val)
+    else if(type == t_double)
+        H5Z_scaleoffset_precompress_3(double, HDpow, HDfabs, HDround, HDlround, HDllround, data, d_nelmts,
+                                      filavail, cd_values, minbits, minval, D_val)
 
 done:
-   FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI(ret_value)
 }
 
 /* postdecompress for floating-point type, variable-minimum-bits method
@@ -1535,10 +1508,10 @@ H5Z_scaleoffset_postdecompress_fd(void *data, unsigned d_nelmts, enum H5Z_scaleo
    FUNC_ENTER_NOAPI_NOINIT
 
    if(type == t_float)
-      H5Z_scaleoffset_postdecompress_3(float, data, d_nelmts, filavail,
+      H5Z_scaleoffset_postdecompress_3(float, HDpowf, data, d_nelmts, filavail,
                                        cd_values, minbits, sminval, D_val)
    else if(type == t_double)
-      H5Z_scaleoffset_postdecompress_3(double, data, d_nelmts, filavail,
+      H5Z_scaleoffset_postdecompress_3(double, HDpow, data, d_nelmts, filavail,
                                        cd_values, minbits, sminval, D_val)
 
 done:
@@ -1568,18 +1541,18 @@ H5Z_scaleoffset_decompress_one_byte(unsigned char *data, size_t data_offset,
       dat_len = 8;
 
    if(*buf_len > dat_len) {
-      data[data_offset + k] = (unsigned char)((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      data[data_offset + k] = (unsigned char)((unsigned)(val >> (*buf_len - dat_len)) & (unsigned)(~((unsigned)~0 << dat_len)));
       *buf_len -= dat_len;
    } /* end if */
    else {
-      data[data_offset + k] = (unsigned char)((val & ~(~0 << *buf_len)) << (dat_len - *buf_len));
+      data[data_offset + k] = (unsigned char)((val & ~((unsigned)(~0) << *buf_len)) << (dat_len - *buf_len));
       dat_len -= *buf_len;
       H5Z_scaleoffset_next_byte(j, buf_len);
       if(dat_len == 0)
           return;
 
       val = buffer[*j];
-      data[data_offset + k] |= (unsigned char)((val >> (*buf_len - dat_len)) & ~(~0 << dat_len));
+      data[data_offset + k] |= (unsigned char)((unsigned)(val >> (*buf_len - dat_len)) & ~((unsigned)(~0) << dat_len));
       *buf_len -= dat_len;
    } /* end else */
 }
@@ -1625,7 +1598,7 @@ H5Z_scaleoffset_decompress(unsigned char *data, unsigned d_nelmts,
     unsigned buf_len;
 
     /* must initialize to zeros */
-    for(i = 0; i < d_nelmts*p.size; i++)
+    for(i = 0; i < d_nelmts * p.size; i++)
         data[i] = 0;
 
     /* initialization before the loop */
@@ -1653,16 +1626,16 @@ H5Z_scaleoffset_compress_one_byte(unsigned char *data, size_t data_offset,
       dat_len = 8;
 
    if(*buf_len > dat_len) {
-      buffer[*j] |= (unsigned char)((val & ~(~0 << dat_len)) << (*buf_len - dat_len));
+      buffer[*j] |= (unsigned char)((val & ~((unsigned)(~0) << dat_len)) << (*buf_len - dat_len));
       *buf_len -= dat_len;
    } else {
-      buffer[*j] |= (unsigned char)((val >> (dat_len - *buf_len)) & ~(~0 << *buf_len));
+      buffer[*j] |= (unsigned char)((unsigned)(val >> (dat_len - *buf_len)) & ~((unsigned)(~0) << *buf_len));
       dat_len -= *buf_len;
       H5Z_scaleoffset_next_byte(j, buf_len);
       if(dat_len == 0)
           return;
 
-      buffer[*j] = (unsigned char)((val & ~(~0 << dat_len)) << (*buf_len - dat_len));
+      buffer[*j] = (unsigned char)((val & ~((unsigned)(~0) << dat_len)) << (*buf_len - dat_len));
       *buf_len -= dat_len;
    } /* end else */
 }
diff --git a/src/H5Zshuffle.c b/src/H5Zshuffle.c
index 4cf6adf..1fef1c1 100644
--- a/src/H5Zshuffle.c
+++ b/src/H5Zshuffle.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
diff --git a/src/H5Zszip.c b/src/H5Zszip.c
index 2c2ed07..dd35859 100644
--- a/src/H5Zszip.c
+++ b/src/H5Zszip.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
@@ -298,7 +296,7 @@ H5Z_filter_szip (unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
 
     /* Check arguments */
     if (cd_nelmts!=4)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid deflate aggression level")
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid number of filter parameters")
 
     /* Copy the filter parameters into the szip parameter block */
     H5_CHECKED_ASSIGN(sz_param.options_mask, int, cd_values[H5Z_SZIP_PARM_MASK], unsigned);
diff --git a/src/H5Ztrans.c b/src/H5Ztrans.c
index 2627a29..d4b59a6 100644
--- a/src/H5Ztrans.c
+++ b/src/H5Ztrans.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
@@ -124,8 +122,8 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
 	tree_val = ((RESR).type==H5Z_XFORM_INTEGER ? (double)(RESR).value.int_val : (RESR).value.float_val); \
 	p = (TYPE*)(RESL).value.dat_val;                                    \
                                                                             \
-	for(u=0; u<(SIZE); u++) {                                           \
-	    *p = *p OP tree_val;                                            \
+	for(u = 0; u < (SIZE); u++) {                                       \
+	    *p = (TYPE)((double)*p OP tree_val);                            \
             p++;                                                            \
         }                                                                   \
     }									    \
@@ -141,32 +139,31 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
 	    tree_val = ((RESL).type==H5Z_XFORM_INTEGER ? (double)(RESL).value.int_val : (RESL).value.float_val); \
                                                                             \
 	p = (TYPE*)(RESR).value.dat_val;                                    \
-	for(u=0; u<(SIZE); u++) {                                           \
-	    *p = tree_val OP *p;                                            \
+	for(u = 0; u < (SIZE); u++) {                                       \
+	    *p = (TYPE)(tree_val OP (double)*p);                            \
             p++;                                                            \
         }                                                                   \
     }									    \
-    else if( ((RESL).type == H5Z_XFORM_SYMBOL) && ((RESR).type==H5Z_XFORM_SYMBOL))  \
-    {										\
-	TYPE* pl = (TYPE*)(RESL).value.dat_val;                             	\
-	TYPE* pr = (TYPE*)(RESR).value.dat_val;                             	\
-										\
-	for(u=0; u<(SIZE); u++) {                                            	\
-	    *pl = *pl OP *pr;                                           	\
-            pl++; pr++;                                                         \
-        }                                                                       \
-    }										\
-    else									\
+    else if( ((RESL).type == H5Z_XFORM_SYMBOL) && ((RESR).type == H5Z_XFORM_SYMBOL))  \
+    {									    \
+	TYPE* pl = (TYPE*)(RESL).value.dat_val;                             \
+	TYPE* pr = (TYPE*)(RESR).value.dat_val;                             \
+									    \
+	for(u = 0; u < (SIZE); u++) {                                       \
+	    *pl = (TYPE)(*pl OP *pr);                                       \
+            pl++; pr++;                                                     \
+        }                                                                   \
+    }									    \
+    else								    \
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unexpected type conversion operation")	\
 }
 
-#if H5_SIZEOF_LONG_DOUBLE !=0
+#if H5_SIZEOF_LONG_DOUBLE != 0
+#if CHAR_MIN >= 0
 #define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
 {									\
     if((TYPE) == H5T_NATIVE_CHAR)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
-    else if((TYPE) == H5T_NATIVE_UCHAR)					\
-	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned char, OP, (SIZE))	\
     else if((TYPE) == H5T_NATIVE_SCHAR)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), signed char, OP, (SIZE))	\
     else if((TYPE) == H5T_NATIVE_SHORT)					\
@@ -182,7 +179,7 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
     else if((TYPE) == H5T_NATIVE_ULONG)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long, OP, (SIZE))	\
     else if((TYPE) == H5T_NATIVE_LLONG)					\
-	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	        \
     else if((TYPE) == H5T_NATIVE_ULLONG)				\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long long, OP, (SIZE)) \
     else if((TYPE) == H5T_NATIVE_FLOAT)					\
@@ -192,13 +189,43 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
     else if((TYPE) == H5T_NATIVE_LDOUBLE)				\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), long double, OP, (SIZE))	\
 }
-#else
+#else /* CHAR_MIN >= 0 */
 #define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
 {									\
     if((TYPE) == H5T_NATIVE_CHAR)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
     else if((TYPE) == H5T_NATIVE_UCHAR)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SHORT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), short, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_USHORT)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned short, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_INT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), int, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UINT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned int, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_ULONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LLONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	        \
+    else if((TYPE) == H5T_NATIVE_ULLONG)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long long, OP, (SIZE)) \
+    else if((TYPE) == H5T_NATIVE_FLOAT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), float, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_DOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), double, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_LDOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long double, OP, (SIZE))	\
+}
+#endif /* CHAR_MIN >= 0 */
+#else
+#if CHAR_MIN >= 0
+#define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
+{									\
+    if((TYPE) == H5T_NATIVE_CHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
     else if((TYPE) == H5T_NATIVE_SCHAR)					\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), signed char, OP, (SIZE))	\
     else if((TYPE) == H5T_NATIVE_SHORT)					\
@@ -222,6 +249,35 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
     else if((TYPE) == H5T_NATIVE_DOUBLE)				\
 	H5Z_XFORM_DO_OP1((RESL), (RESR), double, OP, (SIZE))		\
 }
+#else /* CHAR_MIN >= 0 */
+#define H5Z_XFORM_TYPE_OP(RESL,RESR,TYPE,OP,SIZE)			\
+{									\
+    if((TYPE) == H5T_NATIVE_CHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), char, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UCHAR)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned char, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_SHORT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), short, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_USHORT)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned short, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_INT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), int, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_UINT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned int, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_ULONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_LLONG)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), long long, OP, (SIZE))	\
+    else if((TYPE) == H5T_NATIVE_ULLONG)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), unsigned long long, OP, (SIZE)) \
+    else if((TYPE) == H5T_NATIVE_FLOAT)					\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), float, OP, (SIZE))		\
+    else if((TYPE) == H5T_NATIVE_DOUBLE)				\
+	H5Z_XFORM_DO_OP1((RESL), (RESR), double, OP, (SIZE))		\
+}
+#endif /* CHAR_MIN >= 0 */
 #endif /*H5_SIZEOF_LONG_DOUBLE */
 
 #define H5Z_XFORM_DO_OP3(OP)                                                                                                                    \
@@ -977,17 +1033,20 @@ H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void* array, size_t array_size
     if(tree->type == H5Z_XFORM_INTEGER || tree->type == H5Z_XFORM_FLOAT) {
         if(array_type == H5T_NATIVE_CHAR)
             H5Z_XFORM_DO_OP5(char, array_size)
-        else if(array_type ==  H5T_NATIVE_UCHAR)
-            H5Z_XFORM_DO_OP5(unsigned char, array_size)
+#if CHAR_MIN >= 0
         else if(array_type == H5T_NATIVE_SCHAR)
             H5Z_XFORM_DO_OP5(signed char, array_size)
+#else /* CHAR_MIN >= 0 */
+        else if(array_type == H5T_NATIVE_UCHAR)
+            H5Z_XFORM_DO_OP5(unsigned char, array_size)
+#endif /* CHAR_MIN >= 0 */
         else if(array_type == H5T_NATIVE_SHORT)
             H5Z_XFORM_DO_OP5(short, array_size)
         else if(array_type == H5T_NATIVE_USHORT)
             H5Z_XFORM_DO_OP5(unsigned short, array_size)
         else if(array_type == H5T_NATIVE_INT)
             H5Z_XFORM_DO_OP5(int, array_size)
-        else if(array_type ==  H5T_NATIVE_UINT)
+        else if(array_type == H5T_NATIVE_UINT)
             H5Z_XFORM_DO_OP5(unsigned int, array_size)
         else if(array_type == H5T_NATIVE_LONG)
             H5Z_XFORM_DO_OP5(long, array_size)
@@ -1106,34 +1165,32 @@ H5Z_xform_eval_full(H5Z_node *tree, const size_t array_size,  const hid_t array_
 	 * 1.  See if "x" is on left hand side, right hand side, or if both sides are "x"
 	 * 2.  Figure out what type of data we're going to be manipulating
 	 * 3.  Do the operation on the data. */
-
-
 	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:
+            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 */
diff --git a/src/H5api_adpt.h b/src/H5api_adpt.h
index 910bef9..0ff0f74 100644
--- a/src/H5api_adpt.h
+++ b/src/H5api_adpt.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/src/H5checksum.c b/src/H5checksum.c
index 48e4ce5..64d527e 100644
--- a/src/H5checksum.c
+++ b/src/H5checksum.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5config.h.in b/src/H5config.h.in
index a9a8034..36139cc 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -199,9 +199,21 @@
 /* Define to 1 if you have the `z' library (-lz). */
 #undef HAVE_LIBZ
 
+/* Define to 1 if you have the `llround' function. */
+#undef HAVE_LLROUND
+
+/* Define to 1 if you have the `llroundf' function. */
+#undef HAVE_LLROUNDF
+
 /* Define to 1 if you have the `longjmp' function. */
 #undef HAVE_LONGJMP
 
+/* Define to 1 if you have the `lround' function. */
+#undef HAVE_LROUND
+
+/* Define to 1 if you have the `lroundf' function. */
+#undef HAVE_LROUNDF
+
 /* Define to 1 if you have the `lstat' function. */
 #undef HAVE_LSTAT
 
@@ -238,6 +250,12 @@
 /* Define to 1 if you have the `rand_r' function. */
 #undef HAVE_RAND_R
 
+/* Define to 1 if you have the `round' function. */
+#undef HAVE_ROUND
+
+/* Define to 1 if you have the `roundf' function. */
+#undef HAVE_ROUNDF
+
 /* Define to 1 if you have the `setjmp' function. */
 #undef HAVE_SETJMP
 
@@ -289,6 +307,12 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if you have the `strtoll' function. */
+#undef HAVE_STRTOLL
+
+/* Define to 1 if you have the `strtoull' function. */
+#undef HAVE_STRTOULL
+
 /* Define if struct text_info is defined */
 #undef HAVE_STRUCT_TEXT_INFO
 
diff --git a/src/H5dbg.c b/src/H5dbg.c
index 2039a51..dd50034 100644
--- a/src/H5dbg.c
+++ b/src/H5dbg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/src/H5detect.c b/src/H5detect.c
index ee02c52..75a1dba 100644
--- a/src/H5detect.c
+++ b/src/H5detect.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*keep this declaration near the top of this file -RPM*/
@@ -22,12 +20,10 @@ static const char *FileHeader = "\n\
  *                                                                           *\n\
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
  * terms governing use, modification, and redistribution, is contained in    *\n\
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
- * of the source code distribution tree; Copyright.html can be found at the  *\n\
- * root level of an installed copy of the electronic HDF5 document set and   *\n\
- * is linked from the top-level documents page.  It can also be found at     *\n\
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
- * access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+ * the COPYING file, which can be found at the root of the source code       *\n\
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n\
+ * If you do not have access to either file, you may request a copy from     *\n\
+ * help at hdfgroup.org.                                                        *\n\
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *";
 /*
  *
@@ -1177,7 +1173,7 @@ imp_bit(unsigned int n, int *perm, void *_a, void *_b, const unsigned char *pad_
  *
  *-------------------------------------------------------------------------
  */
-static unsigned int
+H5_ATTR_PURE static unsigned int
 find_bias(unsigned int epos, unsigned int esize, int *perm, void *_a)
 {
     unsigned char *a = (unsigned char *) _a;
diff --git a/src/H5err.txt b/src/H5err.txt
index a156316..3f5801f 100644
--- a/src/H5err.txt
+++ b/src/H5err.txt
@@ -4,12 +4,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # This file is used to generate the various headers that are needed for the
@@ -77,6 +75,7 @@ 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_PAGEBUF, Page Buffering
 MAJOR, H5E_NONE_MAJOR, No error
 
 # Sections (for grouping minor errors)
@@ -157,6 +156,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_CANTUNSERIALIZE, Unable to mark metadata as unserialized
 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
@@ -169,7 +169,11 @@ MINOR, CACHE, H5E_CANTUNPROTECT, Unable to unprotect metadata
 MINOR, CACHE, H5E_CANTPIN, Unable to pin cache entry
 MINOR, CACHE, H5E_CANTUNPIN, Unable to un-pin cache entry
 MINOR, CACHE, H5E_CANTMARKDIRTY, Unable to mark a pinned entry as dirty
+MINOR, CACHE, H5E_CANTMARKCLEAN, Unable to mark a pinned entry as clean
+MINOR, CACHE, H5E_CANTMARKUNSERIALIZED, Unable to mark an entry as unserialized
+MINOR, CACHE, H5E_CANTMARKSERIALIZED, Unable to mark an entry as serialized
 MINOR, CACHE, H5E_CANTDIRTY, Unable to mark metadata as dirty
+MINOR, CACHE, H5E_CANTCLEAN, Unable to mark metadata as clean
 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
diff --git a/src/H5make_libsettings.c b/src/H5make_libsettings.c
index fa00c64..1892806 100644
--- a/src/H5make_libsettings.c
+++ b/src/H5make_libsettings.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*keep this declaration near the top of this file -RPM*/
@@ -22,12 +20,10 @@ static const char *FileHeader = "\n\
  *                                                                           *\n\
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *\n\
  * terms governing use, modification, and redistribution, is contained in    *\n\
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *\n\
- * of the source code distribution tree; Copyright.html can be found at the  *\n\
- * root level of an installed copy of the electronic HDF5 document set and   *\n\
- * is linked from the top-level documents page.  It can also be found at     *\n\
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *\n\
- * access to either file, you may request a copy from help at hdfgroup.org.     *\n\
+ * the COPYING file, which can be found at the root of the source code       *\n\
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *\n\
+ * If you do not have access to either file, you may request a copy from     *\n\
+ * help at hdfgroup.org.                                                        *\n\
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *";
 /*
  *
diff --git a/src/H5overflow.h b/src/H5overflow.h
index dc4ed2d..8532af6 100644
--- a/src/H5overflow.h
+++ b/src/H5overflow.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_overflow -- do not edit */
diff --git a/src/H5overflow.txt b/src/H5overflow.txt
index 3e9f069..a9e5099 100644
--- a/src/H5overflow.txt
+++ b/src/H5overflow.txt
@@ -4,12 +4,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # This file is used to generate the headers that is needed for detecting
diff --git a/src/H5private.h b/src/H5private.h
index e0ed6ef..c588154 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
@@ -657,6 +655,9 @@ typedef struct {
 #ifndef HDatol
     #define HDatol(S)    atol(S)
 #endif /* HDatol */
+#ifndef HDatoll
+    #define HDatoll(S)   atoll(S)
+#endif /* HDatol */
 #ifndef HDbsearch
     #define HDbsearch(K,B,N,Z,F)  bsearch(K,B,N,Z,F)
 #endif /* HDbsearch */
@@ -810,7 +811,8 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
     /* 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.
+     * it is not present at all (Windows uses a separate Wflock()
+     * function).
      */
     #if defined(H5_HAVE_FLOCK)
         #define HDflock(F,L)    flock(F,L)
@@ -1029,6 +1031,15 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDlink
     #define HDlink(OLD,NEW)    link(OLD,NEW)
 #endif /* HDlink */
+#ifndef HDllround
+    #define HDllround(V)     llround(V)
+#endif /* HDround */
+#ifndef HDllroundf
+    #define HDllroundf(V)    llroundf(V)
+#endif /* HDllroundf */
+#ifndef HDllroundl
+    #define HDllroundl(V)    llroundl(V)
+#endif /* HDllroundl */
 #ifndef HDlocaleconv
     #define HDlocaleconv()    localeconv()
 #endif /* HDlocaleconv */
@@ -1044,6 +1055,15 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDlongjmp
     #define HDlongjmp(J,N)    longjmp(J,N)
 #endif /* HDlongjmp */
+#ifndef HDlround
+    #define HDlround(V)     lround(V)
+#endif /* HDround */
+#ifndef HDlroundf
+    #define HDlroundf(V)    lroundf(V)
+#endif /* HDlroundf */
+#ifndef HDlroundl
+    #define HDlroundl(V)    lroundl(V)
+#endif /* HDroundl */
 #ifndef HDlseek
     #define HDlseek(F,O,W)  lseek(F,O,W)
 #endif /* HDlseek */
@@ -1093,6 +1113,9 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDmodf
     #define HDmodf(X,Y)    modf(X,Y)
 #endif /* HDmodf */
+#ifndef HDnanosleep
+    #define HDnanosleep(N, O)    nanosleep(N, O)
+#endif /* HDnanosleep */
 #ifndef HDopen
     #ifdef _O_BINARY
         #define HDopen(S,F,M)    open(S,F|_O_BINARY,M)
@@ -1118,7 +1141,12 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDpow
     #define HDpow(X,Y)    pow(X,Y)
 #endif /* HDpow */
-/* printf() variable arguments */
+#ifndef HDpowf
+    #define HDpowf(X,Y)   powf(X,Y)
+#endif /* HDpowf */
+#ifndef HDprintf
+    #define HDprintf(...)   HDfprintf(stdout, __VA_ARGS__)
+#endif /* HDprintf */
 #ifndef HDputc
     #define HDputc(C,F)    putc(C,F)
 #endif /* HDputc*/
@@ -1180,6 +1208,15 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDrewinddir
     #define HDrewinddir(D)    rewinddir(D)
 #endif /* HDrewinddir */
+#ifndef HDround
+    #define HDround(V)    round(V)
+#endif /* HDround */
+#ifndef HDroundf
+    #define HDroundf(V)    roundf(V)
+#endif /* HDroundf */
+#ifndef HDroundl
+    #define HDroundl(V)    roundl(V)
+#endif /* HDroundl */
 #ifndef HDrmdir
     #define HDrmdir(S)    rmdir(S)
 #endif /* HDrmdir */
@@ -1347,7 +1384,13 @@ typedef off_t               h5_stat_size_t;
 #ifndef HDstrtol
     #define HDstrtol(S,R,N)    strtol(S,R,N)
 #endif /* HDstrtol */
-H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
+#ifndef HDstrtoll
+    #ifdef H5_HAVE_STRTOLL
+        #define HDstrtoll(S,R,N)  strtoll(S,R,N)
+    #else
+        H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
+    #endif /* H5_HAVE_STRTOLL */
+#endif /* HDstrtoll */
 #ifndef HDstrtoul
     #define HDstrtoul(S,R,N)  strtoul(S,R,N)
 #endif /* HDstrtoul */
@@ -1515,7 +1558,7 @@ extern char *strdup(const char *s);
 #define H5_CHECK_OVERFLOW(var, vartype, casttype) \
 {                                                 \
     casttype _tmp_overflow = (casttype)(var);     \
-    assert((var) == (vartype)_tmp_overflow);      \
+    HDassert((var) == (vartype)_tmp_overflow);      \
 }
 #else /* NDEBUG */
 #define H5_CHECK_OVERFLOW(var, vartype, casttype)
@@ -1529,7 +1572,7 @@ extern char *strdup(const char *s);
 {                                                       \
     srctype _tmp_src = (srctype)(src);  \
     dsttype _tmp_dst = (dsttype)(_tmp_src);  \
-    assert(_tmp_src == (srctype)_tmp_dst);   \
+    HDassert(_tmp_src == (srctype)_tmp_dst);   \
     (dst) = _tmp_dst;                             \
 }
 
@@ -1540,8 +1583,8 @@ extern char *strdup(const char *s);
 {                                                       \
     srctype _tmp_src = (srctype)(src);  \
     dsttype _tmp_dst = (dsttype)(_tmp_src);  \
-    assert(_tmp_src >= 0);   \
-    assert(_tmp_src == _tmp_dst);   \
+    HDassert(_tmp_src >= 0);   \
+    HDassert(_tmp_src == _tmp_dst);   \
     (dst) = _tmp_dst;                             \
 }
 
@@ -1552,8 +1595,8 @@ extern char *strdup(const char *s);
 {                                                       \
     srctype _tmp_src = (srctype)(src);  \
     dsttype _tmp_dst = (dsttype)(_tmp_src);  \
-    assert(_tmp_dst >= 0);   \
-    assert(_tmp_src == (srctype)_tmp_dst);   \
+    HDassert(_tmp_dst >= 0);   \
+    HDassert(_tmp_src == (srctype)_tmp_dst);   \
     (dst) = _tmp_dst;                             \
 }
 
@@ -1561,8 +1604,8 @@ extern char *strdup(const char *s);
 {                                                       \
     srctype _tmp_src = (srctype)(src);  \
     dsttype _tmp_dst = (dsttype)(_tmp_src);  \
-    assert(_tmp_src >= 0);   \
-    assert(_tmp_src == (srctype)_tmp_dst);   \
+    HDassert(_tmp_src >= 0);   \
+    HDassert(_tmp_src == (srctype)_tmp_dst);   \
     (dst) = _tmp_dst;                             \
 }
 
@@ -1934,7 +1977,7 @@ extern hbool_t H5_MPEinit_g;   /* Has the MPE Library been initialized? */
                                                                               \
         if(!func_check) {                                                     \
             /* Check function naming status */                                \
-            HDassert(asrt);                                                   \
+            HDassert(asrt && "Function naming conventions are incorrect - check H5_IS_API|PUB|PRIV|PKG macros in H5private.h (this is usually due to an incorrect number of underscores)");                                                   \
                                                                               \
             /* Don't check again */                                           \
             func_check = TRUE;                                                \
@@ -2562,6 +2605,8 @@ H5_DLL uint32_t H5_hash_string(const char *str);
 
 /* Time related routines */
 H5_DLL time_t H5_make_time(struct tm *tm);
+H5_DLL void H5_nanosleep(uint64_t nanosec);
+H5_DLL double H5_get_time(void);
 
 /* Functions for building paths, etc. */
 H5_DLL herr_t   H5_build_extpath(const char *name, char **extpath /*out*/);
diff --git a/src/H5public.h b/src/H5public.h
index 44362b0..496d8ce 100644
--- a/src/H5public.h
+++ b/src/H5public.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -94,10 +92,10 @@ extern "C" {
 /* Version numbers */
 #define H5_VERS_MAJOR	1	/* For major interface/format changes  	     */
 #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 "patch1"	/* For pre-releases like snap0       */
+#define H5_VERS_RELEASE	1	/* For tweaks, bug-fixes, or development     */
+#define H5_VERS_SUBRELEASE ""	/* For pre-releases like snap0       */
 				/* Empty string for real releases.           */
-#define H5_VERS_INFO    "HDF5 library version: 1.10.0-patch1"      /* Full version string */
+#define H5_VERS_INFO    "HDF5 library version: 1.10.1"      /* Full version string */
 
 #define H5check()	H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR,	      \
 				        H5_VERS_RELEASE)
@@ -194,28 +192,21 @@ H5_GCC_DIAG_ON(long-long)
 /*
  * File addresses have their own types.
  */
-#if H5_SIZEOF_INT64_T>=8
-    typedef uint64_t                haddr_t;
-#   define HADDR_UNDEF              ((haddr_t)(int64_t)(-1))
-#   define H5_SIZEOF_HADDR_T        H5_SIZEOF_INT64_T
-#   ifdef H5_HAVE_PARALLEL
-#       define HADDR_AS_MPI_TYPE    MPI_LONG_LONG_INT
-#   endif  /* H5_HAVE_PARALLEL */
-#elif H5_SIZEOF_INT>=8
+#if H5_SIZEOF_INT >= 8
     typedef unsigned                haddr_t;
 #   define HADDR_UNDEF              ((haddr_t)(-1))
 #   define H5_SIZEOF_HADDR_T        H5_SIZEOF_INT
 #   ifdef H5_HAVE_PARALLEL
 #       define HADDR_AS_MPI_TYPE    MPI_UNSIGNED
 #   endif  /* H5_HAVE_PARALLEL */
-#elif H5_SIZEOF_LONG>=8
+#elif H5_SIZEOF_LONG >= 8
     typedef unsigned long           haddr_t;
 #   define HADDR_UNDEF              ((haddr_t)(long)(-1))
 #   define H5_SIZEOF_HADDR_T        H5_SIZEOF_LONG
 #   ifdef H5_HAVE_PARALLEL
 #       define HADDR_AS_MPI_TYPE    MPI_UNSIGNED_LONG
 #   endif  /* H5_HAVE_PARALLEL */
-#elif H5_SIZEOF_LONG_LONG>=8
+#elif H5_SIZEOF_LONG_LONG >= 8
     typedef unsigned long long      haddr_t;
 #   define HADDR_UNDEF              ((haddr_t)(long long)(-1))
 #   define H5_SIZEOF_HADDR_T        H5_SIZEOF_LONG_LONG
@@ -225,11 +216,11 @@ H5_GCC_DIAG_ON(long-long)
 #else
 #   error "nothing appropriate for haddr_t"
 #endif
-#if H5_SIZEOF_HADDR_T ==H5_SIZEOF_INT
+#if H5_SIZEOF_HADDR_T == H5_SIZEOF_INT
 #   define H5_PRINTF_HADDR_FMT  "%u"
-#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG
+#elif H5_SIZEOF_HADDR_T == H5_SIZEOF_LONG
 #   define H5_PRINTF_HADDR_FMT  "%lu"
-#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG_LONG
+#elif H5_SIZEOF_HADDR_T == H5_SIZEOF_LONG_LONG
 #   define H5_PRINTF_HADDR_FMT  "%" H5_PRINTF_LL_WIDTH "u"
 #else
 #   error "nothing appropriate for H5_PRINTF_HADDR_FMT"
diff --git a/src/H5system.c b/src/H5system.c
index e6ca5d4..7e25540 100644
--- a/src/H5system.c
+++ b/src/H5system.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -32,10 +30,10 @@
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5Fprivate.h"		/* File access				*/
-#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5private.h"        /* Generic Functions            */
+#include "H5Eprivate.h"        /* Error handling              */
+#include "H5Fprivate.h"        /* File access                */
+#include "H5MMprivate.h"    /* Memory management            */
 
 
 /****************/
@@ -172,7 +170,7 @@ HDfprintf(FILE *stream, const char *fmt, ...)
                 s = rest;
             } /* end if */
             else if ('*'==*s) {
-                fwidth = va_arg (ap, int);
+                fwidth = va_arg(ap, int);
                 if(fwidth < 0) {
                     leftjust = 1;
                     fwidth = -fwidth;
@@ -269,23 +267,22 @@ HDfprintf(FILE *stream, const char *fmt, ...)
                 len += HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%s", modifier);
             HDsnprintf(format_templ + len, (sizeof(format_templ) - (size_t)(len + 1)), "%c", conv);
 
-
             /* Conversion */
             switch (conv) {
                 case 'd':
                 case 'i':
                     if(!HDstrcmp(modifier, "h")) {
-                        short x = (short)va_arg (ap, int);
-                        n = fprintf (stream, format_templ, x);
+                        short x = (short)va_arg(ap, int);
+                        n = fprintf(stream, format_templ, x);
                     } else if(!*modifier) {
-                        int x = va_arg (ap, int);
-                        n = fprintf (stream, format_templ, x);
-                    } else if(!HDstrcmp (modifier, "l")) {
-                        long x = va_arg (ap, long);
-                        n = fprintf (stream, format_templ, x);
+                        int x = va_arg(ap, int);
+                        n = fprintf(stream, format_templ, x);
+                    } else if(!HDstrcmp(modifier, "l")) {
+                        long x = va_arg(ap, long);
+                        n = fprintf(stream, format_templ, x);
                     } else {
                         int64_t x = va_arg(ap, int64_t);
-                        n = fprintf (stream, format_templ, x);
+                        n = fprintf(stream, format_templ, x);
                     }
                     break;
 
@@ -294,13 +291,13 @@ HDfprintf(FILE *stream, const char *fmt, ...)
                 case 'x':
                 case 'X':
                     if(!HDstrcmp(modifier, "h")) {
-                        unsigned short x = (unsigned short)va_arg (ap, unsigned int);
+                        unsigned short x = (unsigned short)va_arg(ap, unsigned int);
                         n = fprintf(stream, format_templ, x);
                     } else if(!*modifier) {
-                        unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */
+                        unsigned int x = va_arg(ap, unsigned int); /*lint !e732 Loss of sign not really occuring */
                         n = fprintf(stream, format_templ, x);
                     } else if(!HDstrcmp(modifier, "l")) {
-                        unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
+                        unsigned long x = va_arg(ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
                         n = fprintf(stream, format_templ, x);
                     } else {
                         uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */
@@ -336,7 +333,7 @@ HDfprintf(FILE *stream, const char *fmt, ...)
 
                 case 'a':
                     {
-                        haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
+                        haddr_t x = va_arg(ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
 
                         if(H5F_addr_defined(x)) {
                             len = 0;
@@ -405,7 +402,7 @@ HDfprintf(FILE *stream, const char *fmt, ...)
                         htri_t tri_var = va_arg(ap, htri_t);
 
                         if(tri_var > 0)
-                            fprintf (stream, "TRUE");
+                            fprintf(stream, "TRUE");
                         else if(!tri_var)
                             fprintf(stream, "FALSE");
                         else
@@ -475,6 +472,7 @@ HDfprintf(FILE *stream, const char *fmt, ...)
  *
  *-------------------------------------------------------------------------
  */
+#ifndef HDstrtoll
 int64_t
 HDstrtoll(const char *s, const char **rest, int base)
 {
@@ -550,7 +548,7 @@ HDstrtoll(const char *s, const char **rest, int base)
         *rest = s;
     return acc;
 } /* end HDstrtoll() */
-
+#endif
 

 /*-------------------------------------------------------------------------
  * Function:  HDrand/HDsrand
@@ -605,7 +603,7 @@ void HDsrand(unsigned int seed)
 #ifdef H5_HAVE_FCNTL
 int
 Pflock(int fd, int operation) {
-    
+
     struct flock    flk;
 
     /* Set the lock type */
@@ -650,18 +648,18 @@ Nflock(int H5_ATTR_UNUSED fd, int H5_ATTR_UNUSED operation) {
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5_make_time
+ * Function:    H5_make_time
  *
- * Purpose:	Portability routine to abstract converting a 'tm' struct into
- *		a time_t value.
+ * 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.
+ * 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
+ * Return:    Success:  The value of timezone
+ *        Failure:  -1
  *
  * Programmer:  Quincey Koziol
  *              November 18, 2015
@@ -912,6 +910,76 @@ Wflock(int fd, int operation) {
     return 0;
 } /* end Wflock() */
 
+
+ /*--------------------------------------------------------------------------
+  * Function:    Wnanosleep
+  *
+  * Purpose:     Sleep for a given # of nanoseconds (Windows version)
+  *
+  * Return:      SUCCEED/FAIL
+  *
+  * Programmer:  Dana Robinson
+  *              Fall 2016
+  *--------------------------------------------------------------------------
+  */
+int
+Wnanosleep(const struct timespec *req, struct timespec *rem)
+{
+    /* XXX: Currently just a placeholder */
+    return 0;
+
+} /* end Wnanosleep() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    Wllround, Wllroundf, Wlround, Wlroundf, Wround, Wroundf
+ *
+ * Purpose:     Wrapper function for round functions for use with VS2012
+ *              and earlier.
+ *
+ * Return:      The rounded value that was passed in.
+ *
+ * Programmer:  Dana Robinson
+ *              December 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+long long
+Wllround(double arg)
+{
+    return (long long)(arg < 0.0 ? HDceil(arg - 0.5) : HDfloor(arg + 0.5));
+}
+
+long long
+Wllroundf(float arg)
+{
+    return (long long)(arg < 0.0F ? HDceil(arg - 0.5F) : HDfloor(arg + 0.5F));
+}
+
+long
+Wlround(double arg)
+{
+    return (long)(arg < 0.0 ? HDceil(arg - 0.5) : HDfloor(arg + 0.5));
+}
+
+long
+Wlroundf(float arg)
+{
+    return (long)(arg < 0.0F ? HDceil(arg - 0.5F) : HDfloor(arg + 0.5F));
+}
+
+double
+Wround(double arg)
+{
+    return arg < 0.0 ? HDceil(arg - 0.5) : HDfloor(arg + 0.5);
+}
+
+float
+Wroundf(float arg)
+{
+    return arg < 0.0F ? HDceil(arg - 0.5F) : HDfloor(arg + 0.5F);
+}
+
 #endif /* H5_HAVE_WIN32_API */
 
 

@@ -1069,7 +1137,7 @@ H5_combine_path(const char* path1, const char* path2, char **full_name /*out*/)
         if(NULL == (*full_name = (char *)H5MM_strdup(path2)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
 
-    } /* end if */ 
+    } /* end if */
     else if(H5_CHECK_ABS_PATH(path2)) {
 
         /* On windows path2 is a path absolute name */
@@ -1107,5 +1175,65 @@ H5_combine_path(const char* path1, const char* path2, char **full_name /*out*/)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5_combine_name() */
+} /* end H5_combine_path() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5_nanosleep
+ *
+ * Purpose:     Sleep for a given # of nanoseconds
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              October 01, 2016
+ *--------------------------------------------------------------------------
+ */
+void
+H5_nanosleep(uint64_t nanosec)
+{
+    struct timespec sleeptime;  /* Struct to hold time to sleep */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Set up time to sleep */
+    sleeptime.tv_sec = 0;
+    sleeptime.tv_nsec = (long)nanosec;
+
+    HDnanosleep(&sleeptime, NULL);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5_nanosleep() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5_get_time
+ *
+ * Purpose:     Get the current time, as the time of seconds after the UNIX epoch
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              October 05, 2016
+ *--------------------------------------------------------------------------
+ */
+double
+H5_get_time(void)
+{
+#ifdef H5_HAVE_GETTIMEOFDAY
+    struct timeval curr_time;
+#endif /* H5_HAVE_GETTIMEOFDAY */
+    double ret_value = (double)0.0f;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&curr_time, NULL);
+
+    ret_value = (double)curr_time.tv_sec + ((double)curr_time.tv_usec / (double)1000000.0f);
+#endif /* H5_HAVE_GETTIMEOFDAY */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5_get_time() */
+
 
diff --git a/src/H5timer.c b/src/H5timer.c
index d9be6bb..0ba8bd1 100644
--- a/src/H5timer.c
+++ b/src/H5timer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -127,16 +125,16 @@ H5_timer_begin (H5_timer_t *timer)
 #ifdef H5_HAVE_GETRUSAGE
     HDgetrusage (RUSAGE_SELF, &rusage);
     timer->utime = (double)rusage.ru_utime.tv_sec +
-                   ((double)rusage.ru_utime.tv_usec / 1e6F);
+                   ((double)rusage.ru_utime.tv_usec / (double)1e6F);
     timer->stime = (double)rusage.ru_stime.tv_sec +
-                   ((double)rusage.ru_stime.tv_usec / 1e6F);
+                   ((double)rusage.ru_stime.tv_usec / (double)1e6F);
 #else
     timer->utime = 0.0F;
     timer->stime = 0.0F;
 #endif
 #ifdef H5_HAVE_GETTIMEOFDAY
     HDgettimeofday (&etime, NULL);
-    timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec / 1e6F);
+    timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec / (double)1e6F);
 #else
     timer->etime = 0.0F;
 #endif
@@ -166,9 +164,9 @@ H5_timer_end (H5_timer_t *sum/*in,out*/, H5_timer_t *timer/*in,out*/)
     HDassert(timer);
     H5_timer_begin(&now);
 
-    timer->utime = MAX(0.0F, now.utime - timer->utime);
-    timer->stime = MAX(0.0F, now.stime - timer->stime);
-    timer->etime = MAX(0.0F, now.etime - timer->etime);
+    timer->utime = MAX((double)0.0F, now.utime - timer->utime);
+    timer->stime = MAX((double)0.0F, now.stime - timer->stime);
+    timer->etime = MAX((double)0.0F, now.etime - timer->etime);
 
     if (sum) {
         sum->utime += timer->utime;
@@ -208,28 +206,28 @@ H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds)
 {
     double	bw;
 
-    if(nseconds <= 0.0F)
+    if(nseconds <= (double)0.0F)
         HDstrcpy(buf, "       NaN");
     else {
         bw = nbytes/nseconds;
-        if(H5_DBL_ABS_EQUAL(bw, 0.0F))
-	        HDstrcpy(buf, "0.000  B/s");
-        else if(bw < 1.0F)
+        if(H5_DBL_ABS_EQUAL(bw, (double)0.0F))
+            HDstrcpy(buf, "0.000  B/s");
+        else if(bw < (double)1.0F)
             sprintf(buf, "%10.4e", bw);
-        else if(bw < H5_KB) {
+        else if(bw < (double)H5_KB) {
             sprintf(buf, "%05.4f", bw);
             HDstrcpy(buf+5, "  B/s");
-        } else if(bw < H5_MB) {
-            sprintf(buf, "%05.4f", bw / H5_KB);
+        } else if(bw < (double)H5_MB) {
+            sprintf(buf, "%05.4f", bw / (double)H5_KB);
             HDstrcpy(buf+5, " kB/s");
-        } else if(bw < H5_GB) {
-            sprintf(buf, "%05.4f", bw / H5_MB);
+        } else if(bw < (double)H5_GB) {
+            sprintf(buf, "%05.4f", bw / (double)H5_MB);
             HDstrcpy(buf+5, " MB/s");
-        } else if(bw < H5_TB) {
-            sprintf(buf, "%05.4f", bw / H5_GB);
+        } else if(bw < (double)H5_TB) {
+            sprintf(buf, "%05.4f", bw / (double)H5_GB);
             HDstrcpy(buf+5, " GB/s");
-        } else if(bw < H5_PB) {
-            sprintf(buf, "%05.4f", bw / H5_TB);
+        } else if(bw < (double)H5_PB) {
+            sprintf(buf, "%05.4f", bw / (double)H5_TB);
             HDstrcpy(buf+5, " TB/s");
         } else {
             sprintf(buf, "%10.4e", bw);
diff --git a/src/H5trace.c b/src/H5trace.c
index 44b2ed5..9fb8a72 100644
--- a/src/H5trace.c
+++ b/src/H5trace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -895,32 +893,28 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                                 fprintf(out, "NULL");
                         } /* end if */
                         else {
-                            H5F_file_space_type_t fs_type = (H5F_file_space_type_t)va_arg(ap, int);
+                            H5F_fspace_strategy_t fs_strategy = (H5F_fspace_strategy_t)va_arg(ap, int);
 
-                            switch(fs_type) {
-                                case H5F_FILE_SPACE_DEFAULT:
-                                    fprintf(out, "H5F_FILE_SPACE_DEFAULT");
+                            switch(fs_strategy) {
+                                case H5F_FSPACE_STRATEGY_FSM_AGGR:
+                                    fprintf(out, "H5F_FSPACE_STRATEGY_FSM_AGGR");
                                     break;
 
-                                case H5F_FILE_SPACE_ALL_PERSIST:
-                                    fprintf(out, "H5F_FILE_SPACE_ALL_PERSIST");
+                                case H5F_FSPACE_STRATEGY_PAGE:
+                                    fprintf(out, "H5F_FSPACE_STRATEGY_PAGE");
                                     break;
 
-                                case H5F_FILE_SPACE_ALL:
-                                    fprintf(out, "H5F_FILE_SPACE_ALL");
+                                case H5F_FSPACE_STRATEGY_AGGR:
+                                    fprintf(out, "H5F_FSPACE_STRATEGY_AGGR");
                                     break;
 
-                                case H5F_FILE_SPACE_AGGR_VFD:
-                                    fprintf(out, "H5F_FILE_SPACE_AGGR_VFD");
+                                case H5F_FSPACE_STRATEGY_NONE:
+                                    fprintf(out, "H5F_FSPACE_STRATEGY_NONE");
                                     break;
 
-                                case H5F_FILE_SPACE_VFD:
-                                    fprintf(out, "H5F_FILE_SPACE_VFD");
-                                    break;
-
-                                case H5F_FILE_SPACE_NTYPES:
+                                case H5F_FSPACE_STRATEGY_NTYPES:
                                 default:
-                                    fprintf(out, "%ld", (long)fs_type);
+                                    fprintf(out, "%ld", (long)fs_strategy);
                                     break;
                             } /* end switch */
                         } /* end else */
@@ -1003,6 +997,15 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                         } /* end else */
                         break;
 
+                    case 't':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        break;
+
                     case 'v':
                         if(ptr) {
                             if(vp)
diff --git a/src/H5vers.txt b/src/H5vers.txt
index 07d2c4b..0303bf5 100644
--- a/src/H5vers.txt
+++ b/src/H5vers.txt
@@ -4,12 +4,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 
 # This file is used to generate the various headers that are needed for
diff --git a/src/H5version.h b/src/H5version.h
index b955a8f..075274e 100644
--- a/src/H5version.h
+++ b/src/H5version.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Generated automatically by bin/make_vers -- do not edit */
diff --git a/src/H5win32defs.h b/src/H5win32defs.h
index a757832..0149faa 100644
--- a/src/H5win32defs.h
+++ b/src/H5win32defs.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Scott Wegner
@@ -23,6 +21,11 @@
  *
  */
 
+/*
+ * _MSC_VER = 1900 VS2015
+ * _MSC_VER = 1800 VS2013
+ * _MSC_VER = 1700 VS2012
+ */
 #ifdef H5_HAVE_WIN32_API
 
 typedef struct _stati64     h5_stat_t;
@@ -42,6 +45,7 @@ typedef __int64             h5_stat_size_t;
 #define HDlseek(F,O,W)      _lseeki64(F,O,W)
 #define HDlstat(S,B)        _lstati64(S,B)
 #define HDmkdir(S,M)        _mkdir(S)
+#define HDnanosleep(N, O)   Wnanosleep(N, O)
 #define HDoff_t             __int64
 /* _O_BINARY must be set in Windows to avoid CR-LF <-> LF EOL
  * transformations when performing I/O.
@@ -53,25 +57,54 @@ typedef __int64             h5_stat_size_t;
 #define HDsleep(S)          Sleep(S*1000)
 #define HDstat(S,B)         _stati64(S,B)
 #define HDstrcasecmp(A,B)   _stricmp(A,B)
-#define HDstrtoull(S,R,N)   _strtoui64(S,R,N)
 #define HDstrdup(S)         _strdup(S)
 #define HDtzset()           _tzset()
 #define HDunlink(S)         _unlink(S)
 #define HDwrite(F,M,Z)      _write(F,M,Z)
 
 #ifdef H5_HAVE_VISUAL_STUDIO
+
+#if (_MSC_VER < 1800)
+  #ifndef H5_HAVE_STRTOLL
+    #define HDstrtoll(S,R,N)    _strtoi64(S,R,N)
+  #endif /* H5_HAVE_STRTOLL */
+  #ifndef H5_HAVE_STRTOULL
+    #define HDstrtoull(S,R,N)   _strtoui64(S,R,N)
+  #endif /* H5_HAVE_STRTOULL */
+#endif /* MSC_VER < 1800 */
+
 /*
  * The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
  */
 #define HDmemset(X,C,Z)     memset((void*)(X),C,Z)
 
-#endif /* H5_HAVE_VISUAL_STUDIO */
-
 struct timezone {
     int tz_minuteswest;
     int tz_dsttime;
 };
 
+/* time.h before VS2015 does not include timespec */
+#if (_MSC_VER < 1900)
+struct timespec
+{
+    time_t tv_sec;  /* Seconds - >= 0 */
+    long   tv_nsec; /* Nanoseconds - [0, 999999999] */
+};
+#endif /* MSC_VER < 1900 */
+
+/* The round functions do not exist in VS2012 and earlier */
+#if (_MSC_VER <= 1700)
+#define HDllround(V)        Wllround(V)
+#define HDllroundf(V)       Wllroundf(V)
+#define HDlround(V)         Wlround(V)
+#define HDlroundf(V)        Wlroundf(V)
+#define HDround(V)          Wround(V)
+#define HDroundf(V)         Wroundf(V)
+#endif /* MSC_VER < 1700 */
+
+#endif /* H5_HAVE_VISUAL_STUDIO */
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -81,6 +114,19 @@ extern "C" {
     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);
+    H5_DLL int Wnanosleep(const struct timespec *req, struct timespec *rem);
+
+    /* Round functions only needed for VS2012 and earlier.
+     * They are always built to ensure they don't go stale and
+     * can be deleted (along with their #defines, above) when we
+     * drop VS2012 support.
+     */
+    H5_DLL long long Wllround(double arg);
+    H5_DLL long long Wllroundf(float arg);
+    H5_DLL long Wlround(double arg);
+    H5_DLL long Wlroundf(float arg);
+    H5_DLL double Wround(double arg);
+    H5_DLL float Wroundf(float arg);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/src/Makefile.am b/src/Makefile.am
index 7f8babd..0b664a7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -42,22 +40,25 @@ 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 H5AClog.c \
+        H5AC.c H5ACdbg.c H5AClog.c H5ACproxy_entry.c \
         H5B.c H5Bcache.c H5Bdbg.c \
-        H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2stat.c H5B2test.c \
-        H5C.c \
+        H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2internal.c \
+        H5B2leaf.c H5B2stat.c H5B2test.c \
+        H5C.c H5Cdbg.c H5Cepoch.c H5Cimage.c H5Clog.c H5Cprefetched.c \
+        H5Cquery.c H5Ctag.c H5Ctest.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 \
+        H5Ddeprec.c H5Dearray.c H5Defl.c H5Dfarray.c H5Dfill.c H5Dint.c \
+        H5Dio.c H5Dlayout.c H5Dnone.c \
+        H5Doh.c H5Dscatgath.c H5Dselect.c \
+        H5Dsingle.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 \
+        H5Fsfile.c H5Fspace.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  \
@@ -71,20 +72,21 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.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 \
+        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 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 \
+        H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c H5Ocache_image.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 \
+        H5Oname.c H5Onull.c H5Opline.c H5Orefcount.c \
         H5Osdspace.c H5Oshared.c \
         H5Oshmesg.c \
         H5Ostab.c \
@@ -94,6 +96,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
         H5Pfapl.c H5Pfcpl.c H5Pfmpl.c \
         H5Pgcpl.c H5Pint.c \
         H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c H5Ptest.c \
+        H5PB.c \
         H5PL.c \
         H5R.c H5Rdeprec.c \
         H5UC.c \
diff --git a/src/Makefile.in b/src/Makefile.in
index 8a4ad02..9dff057 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Makefile(.in)
 #
@@ -177,55 +175,57 @@ 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 \
+	H5Aint.c H5Atest.c H5AC.c H5ACdbg.c H5AClog.c \
+	H5ACproxy_entry.c H5B.c H5Bcache.c H5Bdbg.c H5B2.c H5B2cache.c \
+	H5B2dbg.c H5B2hdr.c H5B2int.c H5B2internal.c H5B2leaf.c \
+	H5B2stat.c H5B2test.c H5C.c H5Cdbg.c H5Cepoch.c H5Cimage.c \
+	H5Clog.c H5Cprefetched.c H5Cquery.c H5Ctag.c H5Ctest.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 H5Dfill.c H5Dint.c H5Dio.c H5Dlayout.c H5Dnone.c \
+	H5Doh.c H5Dscatgath.c H5Dselect.c H5Dsingle.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 H5Fspace.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 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 H5Ocache_image.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
+	H5Onull.c H5Opline.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 H5PB.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
 @BUILD_PARALLEL_CONDITIONAL_TRUE at am__objects_1 = H5ACmpio.lo \
 @BUILD_PARALLEL_CONDITIONAL_TRUE@	H5Cmpio.lo H5Dmpio.lo \
 @BUILD_PARALLEL_CONDITIONAL_TRUE@	H5Fmpi.lo H5FDmpi.lo \
@@ -233,58 +233,62 @@ am__libhdf5_la_SOURCES_DIST = H5.c H5checksum.c H5dbg.c H5system.c \
 @DIRECT_VFD_CONDITIONAL_TRUE at 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 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 \
+	H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5ACdbg.lo \
+	H5AClog.lo H5ACproxy_entry.lo H5B.lo H5Bcache.lo H5Bdbg.lo \
+	H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2hdr.lo H5B2int.lo \
+	H5B2internal.lo H5B2leaf.lo H5B2stat.lo H5B2test.lo H5C.lo \
+	H5Cdbg.lo H5Cepoch.lo H5Cimage.lo H5Clog.lo H5Cprefetched.lo \
+	H5Cquery.lo H5Ctag.lo H5Ctest.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 H5Dfill.lo \
+	H5Dint.lo H5Dio.lo H5Dlayout.lo H5Dnone.lo H5Doh.lo \
+	H5Dscatgath.lo H5Dselect.lo H5Dsingle.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 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)
+	H5Fquery.lo H5Fsfile.lo H5Fspace.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 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 \
+	H5Ocache_image.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 \
+	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 H5Pencdec.lo \
+	H5Pfapl.lo H5Pfcpl.lo H5Pfmpl.lo H5Pgcpl.lo H5Pint.lo \
+	H5Plapl.lo H5Plcpl.lo H5Pocpl.lo H5Pocpypl.lo H5Pstrcpl.lo \
+	H5Ptest.lo H5PB.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@)
@@ -589,6 +593,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -710,6 +715,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -855,32 +861,27 @@ 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
-
-# Add libtool shared library version numbers to the HDF5 library
-# See libtool versioning documentation online.
-# After making changes, run bin/reconfigure to update other configure related
-# files like Makefile.in.
-LT_VERS_INTERFACE = 100
-LT_VERS_REVISION = 1
+LT_VERS_INTERFACE = 101
+LT_VERS_REVISION = 0
 LT_VERS_AGE = 0
-LT_CXX_VERS_INTERFACE = 100
+LT_CXX_VERS_INTERFACE = 101
 LT_CXX_VERS_REVISION = 0
 LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 100
-LT_F_VERS_REVISION = 1
-LT_F_VERS_AGE = 0
+LT_F_VERS_INTERFACE = 101
+LT_F_VERS_REVISION = 0
+LT_F_VERS_AGE = 1
 LT_HL_VERS_INTERFACE = 100
-LT_HL_VERS_REVISION = 0
+LT_HL_VERS_REVISION = 1
 LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 100
+LT_HL_CXX_VERS_INTERFACE = 101
 LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
+LT_HL_CXX_VERS_AGE = 1
 LT_HL_F_VERS_INTERFACE = 100
-LT_HL_F_VERS_REVISION = 0
+LT_HL_F_VERS_REVISION = 1
 LT_HL_F_VERS_AGE = 0
-LT_JAVA_VERS_INTERFACE = 100
+LT_JAVA_VERS_INTERFACE = 101
 LT_JAVA_VERS_REVISION = 0
-LT_JAVA_VERS_AGE = 0
+LT_JAVA_VERS_AGE = 1
 LT_TOOLS_VERS_INTERFACE = 100
 LT_TOOLS_VERS_REVISION = 1
 LT_TOOLS_VERS_AGE = 0
@@ -899,54 +900,57 @@ 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 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 \
+	H5Atest.c H5AC.c H5ACdbg.c H5AClog.c H5ACproxy_entry.c H5B.c \
+	H5Bcache.c H5Bdbg.c H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c \
+	H5B2int.c H5B2internal.c H5B2leaf.c H5B2stat.c H5B2test.c \
+	H5C.c H5Cdbg.c H5Cepoch.c H5Cimage.c H5Clog.c H5Cprefetched.c \
+	H5Cquery.c H5Ctag.c H5Ctest.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 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 \
+	H5Dselect.c H5Dsingle.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 H5Fspace.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 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 H5Ocache_image.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)
+	H5Onull.c H5Opline.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 H5PB.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 \
@@ -967,18 +971,20 @@ include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5vers
 settingsdir = $(libdir)
 settings_DATA = libhdf5.settings
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1103,8 +1109,10 @@ 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)/H5ACdbg.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5AClog.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5ACmpio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5ACproxy_entry.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@
@@ -1116,13 +1124,23 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2dbg.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2hdr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2int.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2internal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2leaf.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2stat.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5B2test.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Bcache.Plo at am__quote@
 @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)/H5Cdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cepoch.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cimage.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Clog.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cmpio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cprefetched.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cquery.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ctag.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ctest.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@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dbtree2.Plo at am__quote@
@@ -1204,6 +1222,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fmpi.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fquery.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fsfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fspace.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fsuper.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fsuper_cache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ftest.Plo at am__quote@
@@ -1234,7 +1253,6 @@ 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@
@@ -1272,6 +1290,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Obogus.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Obtreek.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ocache.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ocache_image.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ochunk.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ocont.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ocopy.Plo at am__quote@
@@ -1291,7 +1310,6 @@ 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@
@@ -1300,6 +1318,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Otest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ounknown.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5P.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5PB.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5PL.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pacpl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pdapl.Plo at am__quote@
@@ -1383,22 +1402,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5trace.Plo 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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1828,19 +1850,6 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
 help:
 	@$(top_srcdir)/bin/makehelp
 
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-
 # Number format detection
 # The LD_LIBRARY_PATH setting is a kludge.
 # Things should have been all set during H5detect making.
@@ -1901,6 +1910,7 @@ trace: $(libhdf5_la_SOURCES)
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1908,7 +1918,7 @@ 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)
+lib dyn 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                           \
diff --git a/src/hdf5.h b/src/hdf5.h
index 7a10507..fc4541a 100644
--- a/src/hdf5.h
+++ b/src/hdf5.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 6f5dfa7..d7965cb 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_TEST)
 
 #-----------------------------------------------------------------------------
@@ -16,7 +16,7 @@ INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})
 #-----------------------------------------------------------------------------
 # Define Test Library Sources
 #-----------------------------------------------------------------------------
-set (TEST_LIB_SRCS
+set (TEST_LIB_SOURCES
     ${HDF5_TEST_SOURCE_DIR}/h5test.c
     ${HDF5_TEST_SOURCE_DIR}/testframe.c
     ${HDF5_TEST_SOURCE_DIR}/cache_common.c
@@ -29,14 +29,14 @@ set (TEST_LIB_HEADERS
     ${HDF5_TEST_SOURCE_DIR}/swmr_common.h
 )
 
-add_library (${HDF5_TEST_LIB_TARGET} STATIC ${TEST_LIB_SRCS} ${TEST_LIB_HEADERS})
+add_library (${HDF5_TEST_LIB_TARGET} STATIC ${TEST_LIB_SOURCES} ${TEST_LIB_HEADERS})
 TARGET_C_PROPERTIES (${HDF5_TEST_LIB_TARGET} STATIC " " " ")
 if (MSVC)
   target_link_libraries (${HDF5_TEST_LIB_TARGET} "ws2_32.lib")
-endif (MSVC)
+endif ()
 if (MINGW)
   target_link_libraries (${HDF5_TEST_LIB_TARGET} "wsock32.lib")
-endif (MINGW)
+endif ()
 target_link_libraries (${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET})
 H5_SET_LIB_OPTIONS (${HDF5_TEST_LIB_TARGET} ${HDF5_TEST_LIB_NAME} STATIC)
 set_target_properties (${HDF5_TEST_LIB_TARGET} PROPERTIES
@@ -45,14 +45,14 @@ set_target_properties (${HDF5_TEST_LIB_TARGET} PROPERTIES
 )
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_TEST_LIBSH_TARGET} SHARED ${TEST_LIB_SRCS} ${TEST_LIB_HEADERS})
+  add_library (${HDF5_TEST_LIBSH_TARGET} SHARED ${TEST_LIB_SOURCES} ${TEST_LIB_HEADERS})
   TARGET_C_PROPERTIES (${HDF5_TEST_LIBSH_TARGET} SHARED " " " ")
   if (MSVC)
     target_link_libraries (${HDF5_TEST_LIBSH_TARGET} "ws2_32.lib")
-  endif (MSVC)
+  endif ()
   if (MINGW)
     target_link_libraries (${HDF5_TEST_LIBSH_TARGET} "wsock32.lib")
-  endif (MINGW)
+  endif ()
   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})
   set_target_properties (${HDF5_TEST_LIBSH_TARGET} PROPERTIES
@@ -66,8 +66,8 @@ if (BUILD_SHARED_LIBS)
         APPEND PROPERTY COMPILE_DEFINITIONS
             "H5_HAVE_THREADSAFE"
     )
-  endif (HDF5_ENABLE_THREADSAFE)
-endif (BUILD_SHARED_LIBS)
+  endif ()
+endif ()
 
 #-----------------------------------------------------------------------------
 # If plugin library tests can be tested
@@ -85,6 +85,7 @@ endif (BUILD_SHARED_LIBS)
   )
   set (TEST2_PLUGIN_LIBS
       dynlib2
+      dynlib4
   )
 
   foreach (test_lib ${TEST_PLUGIN_LIBS})
@@ -111,7 +112,7 @@ endif (BUILD_SHARED_LIBS)
           "$<TARGET_FILE:${HDF5_TEST_PLUGIN_LIB_TARGET}>"
           "${CMAKE_BINARY_DIR}/testdir1/$<TARGET_FILE_NAME:${HDF5_TEST_PLUGIN_LIB_TARGET}>"
     )
-  endforeach (test_lib ${TEST_PLUGIN_LIBS})
+  endforeach ()
 
   foreach (test_lib ${TEST2_PLUGIN_LIBS})
     set (HDF5_TEST_PLUGIN_LIB_CORENAME         "${test_lib}")
@@ -137,9 +138,9 @@ endif (BUILD_SHARED_LIBS)
           "$<TARGET_FILE:${HDF5_TEST_PLUGIN_LIB_TARGET}>"
           "${CMAKE_BINARY_DIR}/testdir2/$<TARGET_FILE_NAME:${HDF5_TEST_PLUGIN_LIB_TARGET}>"
     )
-  endforeach (test_lib ${TEST2_PLUGIN_LIBS})
+  endforeach ()
 
-set (testhdf5_SRCS
+set (testhdf5_SOURCES
     ${HDF5_TEST_SOURCE_DIR}/testhdf5.c
     ${HDF5_TEST_SOURCE_DIR}/tarray.c
     ${HDF5_TEST_SOURCE_DIR}/tattr.c
@@ -168,18 +169,18 @@ set (testhdf5_SRCS
 )
 
 #-- Adding test for testhdf5
-add_executable (testhdf5 ${testhdf5_SRCS})
+add_executable (testhdf5 ${testhdf5_SOURCES})
 TARGET_NAMING (testhdf5 STATIC)
 TARGET_C_PROPERTIES (testhdf5 STATIC " " " ")
 target_link_libraries (testhdf5 ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET})
 set_target_properties (testhdf5 PROPERTIES FOLDER test)
 if (BUILD_SHARED_LIBS)
-  add_executable (testhdf5-shared ${testhdf5_SRCS})
+  add_executable (testhdf5-shared ${testhdf5_SOURCES})
   TARGET_NAMING (testhdf5-shared SHARED)
   TARGET_C_PROPERTIES (testhdf5-shared SHARED " " " ")
   target_link_libraries (testhdf5-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_target_properties (testhdf5-shared PROPERTIES FOLDER test)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 MACRO (ADD_H5_EXE file)
   add_executable (${file} ${HDF5_TEST_SOURCE_DIR}/${file}.c)
@@ -193,11 +194,10 @@ MACRO (ADD_H5_EXE file)
     TARGET_C_PROPERTIES (${file}-shared SHARED " " " ")
     target_link_libraries (${file}-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
     set_target_properties (${file}-shared PROPERTIES FOLDER test)
-  endif (BUILD_SHARED_LIBS)
-ENDMACRO (ADD_H5_EXE file)
+  endif ()
+ENDMACRO ()
 
 set (H5_TESTS
-    #testhdf5
     cache
     cache_api
     cache_tagging
@@ -205,13 +205,13 @@ set (H5_TESTS
     ohdr
     stab
     gheap
+    evict_on_close
     farray
     earray
     btree2
     fheap
     pool
     accum
-    #hyperslab
     istore
     bittests
     dt_arith
@@ -235,7 +235,6 @@ set (H5_TESTS
     app_ref
     enum
     set_extent
-    #ttsafe
     enc_dec_plist
     enc_dec_plist_cross_platform
     getname
@@ -247,6 +246,7 @@ set (H5_TESTS
     cross_read
     freespace
     mf
+    page_buffer
     vds
     file_image
     unregister
@@ -257,7 +257,7 @@ set (H5_TESTS
 
 foreach (test ${H5_TESTS})
   ADD_H5_EXE(${test})
-endforeach (test ${H5_TESTS})
+endforeach ()
 
 set (H5_SWMR_TESTS
     swmr_addrem_writer
@@ -274,7 +274,7 @@ set (H5_SWMR_TESTS
 
 foreach (test ${H5_SWMR_TESTS})
   ADD_H5_EXE(${test})
-endforeach (test ${H5_SWMR_TESTS})
+endforeach ()
 
 set (H5_VDS_SWMR_TESTS
     vds_swmr_gen
@@ -284,7 +284,7 @@ set (H5_VDS_SWMR_TESTS
 
 foreach (test ${H5_VDS_SWMR_TESTS})
   ADD_H5_EXE(${test})
-endforeach (test ${H5_VDS_SWMR_TESTS})
+endforeach ()
 
 ##############################################################################
 ##############################################################################
@@ -292,6 +292,26 @@ endforeach (test ${H5_VDS_SWMR_TESTS})
 ##############################################################################
 ##############################################################################
 
+#-- Adding test for cache_image
+add_executable (cache_image
+    ${HDF5_TEST_SOURCE_DIR}/cache_image.c
+    ${HDF5_TEST_SOURCE_DIR}/genall5.c
+)
+TARGET_NAMING (cache_image STATIC)
+TARGET_C_PROPERTIES (cache_image STATIC " " " ")
+target_link_libraries (cache_image ${HDF5_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+set_target_properties (cache_image PROPERTIES FOLDER test)
+if (BUILD_SHARED_LIBS)
+  add_executable (cache_image-shared
+    ${HDF5_TEST_SOURCE_DIR}/cache_image.c
+    ${HDF5_TEST_SOURCE_DIR}/genall5.c
+  )
+  TARGET_NAMING (cache_image-shared SHARED)
+  TARGET_C_PROPERTIES (cache_image-shared SHARED " " " ")
+  target_link_libraries (cache_image-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (cache_image-shared PROPERTIES FOLDER test)
+endif ()
+
 #-- Adding test for hyperslab
 add_executable (hyperslab ${HDF5_TEST_SOURCE_DIR}/hyperslab.c)
 TARGET_NAMING (hyperslab STATIC)
@@ -309,8 +329,8 @@ if (BUILD_SHARED_LIBS)
         APPEND PROPERTY COMPILE_DEFINITIONS
             "H5_HAVE_THREADSAFE"
     )
-  endif (HDF5_ENABLE_THREADSAFE)
-endif (BUILD_SHARED_LIBS)
+  endif ()
+endif ()
 
 #-- Adding test for ttsafe
 add_executable (ttsafe
@@ -341,27 +361,23 @@ if (BUILD_SHARED_LIBS)
         APPEND PROPERTY COMPILE_DEFINITIONS
             "H5_HAVE_THREADSAFE"
     )
-  endif (HDF5_ENABLE_THREADSAFE)
-endif (BUILD_SHARED_LIBS)
+  endif ()
+endif ()
 
 set (H5_CHECK_TESTS
     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
 )
 
 foreach (test ${H5_CHECK_TESTS})
   ADD_H5_EXE(${test})
-endforeach (test ${H5_CHECK_TESTS})
+endforeach ()
 
 #-- Adding test for accum_swmr_reader
 #   This has to be copied to the test directory for execve() to find it
@@ -376,7 +392,7 @@ set_target_properties (accum_swmr_reader PROPERTIES FOLDER test)
 set_target_properties (accum PROPERTIES DEPENDS accum_swmr_reader)
 if (BUILD_SHARED_LIBS)
   set_target_properties (accum-shared PROPERTIES DEPENDS accum_swmr_reader)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 #-- Adding test for libinfo
 set (GREP_RUNNER ${PROJECT_BINARY_DIR}/GrepRunner.cmake)
@@ -384,9 +400,9 @@ file (WRITE ${GREP_RUNNER}
   "file (STRINGS \${TEST_PROGRAM} TEST_RESULT REGEX \"SUMMARY OF THE HDF5 CONFIGURATION\")
 if (\${TEST_RESULT} STREQUAL \"0\")
   message (FATAL_ERROR \"Failed: The output: \${TEST_RESULT} of \${TEST_PROGRAM} did not contain SUMMARY OF THE HDF5 CONFIGURATION\")
-else (\${TEST_RESULT} STREQUAL \"0\")
+else ()
   message (STATUS \"COMMAND Result: \${TEST_RESULT}\")
-endif (\${TEST_RESULT} STREQUAL \"0\")
+endif ()
 "
 )
 
@@ -397,15 +413,15 @@ if (BUILD_SHARED_LIBS)
   add_executable (plugin ${HDF5_TEST_SOURCE_DIR}/plugin.c)
   TARGET_NAMING (plugin SHARED)
   TARGET_C_PROPERTIES (plugin SHARED " " " ")
-  target_link_libraries (plugin ${HDF5_TEST_PLUGIN_LIB_TARGET})
+  target_link_libraries (plugin ${HDF5_TEST_LIB_TARGET})
   set_target_properties (plugin PROPERTIES FOLDER test)
-else (BUILD_SHARED_LIBS)
+else ()
   add_executable (plugin ${HDF5_TEST_SOURCE_DIR}/plugin.c)
   TARGET_NAMING (plugin STATIC)
   TARGET_C_PROPERTIES (plugin STATIC " " " ")
-  target_link_libraries (plugin ${HDF5_TEST_PLUGIN_LIB_TARGET})
+  target_link_libraries (plugin ${HDF5_TEST_LIB_TARGET})
   set_target_properties (plugin PROPERTIES FOLDER test)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 ##############################################################################
 ###    U S E  C A S E S  T E S T S
@@ -422,7 +438,7 @@ if (BUILD_SHARED_LIBS)
   TARGET_C_PROPERTIES (use_append_chunk-shared SHARED " " " ")
   target_link_libraries (use_append_chunk-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_target_properties (use_append_chunk-shared PROPERTIES FOLDER test)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 set (use_append_mchunks_SOURCES ${HDF5_TEST_SOURCE_DIR}/use_append_mchunks.c ${HDF5_TEST_SOURCE_DIR}/use_common.c)
 add_executable (use_append_mchunks ${use_append_mchunks_SOURCES})
@@ -436,7 +452,7 @@ if (BUILD_SHARED_LIBS)
   TARGET_C_PROPERTIES (use_append_mchunks-shared SHARED " " " ")
   target_link_libraries (use_append_mchunks-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_target_properties (use_append_mchunks-shared PROPERTIES FOLDER test)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 set (use_disable_mdc_flushes_SOURCES ${HDF5_TEST_SOURCE_DIR}/use_disable_mdc_flushes.c)
 add_executable (use_disable_mdc_flushes ${use_disable_mdc_flushes_SOURCES})
@@ -450,6 +466,6 @@ if (BUILD_SHARED_LIBS)
   TARGET_C_PROPERTIES (use_disable_mdc_flushes-shared SHARED " " " ")
   target_link_libraries (use_disable_mdc_flushes-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_target_properties (use_disable_mdc_flushes-shared PROPERTIES FOLDER test)
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 include (CMakeTests.cmake)
diff --git a/test/CMakeTests.cmake b/test/CMakeTests.cmake
index c1adf40..94b099c 100644
--- a/test/CMakeTests.cmake
+++ b/test/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -13,7 +24,7 @@ if (BUILD_SHARED_LIBS)
   file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/H5TEST-shared")
   file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/H5TEST-shared/testfiles")
   file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/H5TEST-shared/testfiles/plist_files")
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 if (HDF5_TEST_VFD)
   set (VFD_LIST
@@ -27,14 +38,14 @@ if (HDF5_TEST_VFD)
   )
   if (DIRECT_VFD)
     set (VFD_LIST ${VFD_LIST} direct)
-  endif (DIRECT_VFD)
+  endif ()
   foreach (vfdtest ${VFD_LIST})
     file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/${vfdtest}")
     #if (BUILD_SHARED_LIBS)
     #  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/${vfdtest}-shared")
-    #endif (BUILD_SHARED_LIBS)
-  endforeach (vfdtest ${VFD_LIST})
-endif (HDF5_TEST_VFD)
+    #endif ()
+  endforeach ()
+endif ()
 
 # --------------------------------------------------------------------
 # Copy all the HDF5 files from the source directory into the test directory
@@ -56,48 +67,24 @@ if (BUILD_SHARED_LIBS)
       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)
+endif ()
 
 foreach (h5_tfile ${HDF5_TEST_FILES})
-  set (dest "${PROJECT_BINARY_DIR}/H5TEST/${h5_tfile}")
-  add_custom_command (
-      TARGET     ${HDF5_TEST_LIB_TARGET}
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_tfile} ${dest}
-  )
+  HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_tfile}" "${PROJECT_BINARY_DIR}/H5TEST/${h5_tfile}" "HDF5_TEST_LIB_files")
   if (BUILD_SHARED_LIBS)
-    set (dest "${PROJECT_BINARY_DIR}/H5TEST-shared/${h5_tfile}")
-    add_custom_command (
-        TARGET     ${HDF5_TEST_LIBSH_TARGET}
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_tfile} ${dest}
-    )
-  endif (BUILD_SHARED_LIBS)
-endforeach (h5_tfile ${HDF5_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_tfile}" "${PROJECT_BINARY_DIR}/H5TEST-shared/${h5_tfile}" "HDF5_TEST_LIBSH_files")
+  endif ()
+endforeach ()
 if (HDF5_TEST_VFD)
   foreach (vfdtest ${VFD_LIST})
     foreach (h5_tfile ${HDF5_TEST_FILES})
-      set (dest "${PROJECT_BINARY_DIR}/${vfdtest}/${h5_tfile}")
-      add_custom_command (
-          TARGET     ${HDF5_TEST_LIB_TARGET}
-          POST_BUILD
-          COMMAND    ${CMAKE_COMMAND}
-          ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_tfile} ${dest}
-      )
+      HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_tfile}" "${PROJECT_BINARY_DIR}/${vfdtest}/${h5_tfile}" "HDF5_TEST_LIB_files")
       if (BUILD_SHARED_LIBS)
-        set (dest "${PROJECT_BINARY_DIR}/${vfdtest}-shared/${h5_tfile}")
-        add_custom_command (
-            TARGET     ${HDF5_TEST_LIBSH_TARGET}
-            POST_BUILD
-            COMMAND    ${CMAKE_COMMAND}
-            ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_tfile} ${dest}
-        )
-      endif (BUILD_SHARED_LIBS)
-    endforeach (h5_tfile ${HDF5_TEST_FILES})
-  endforeach (vfdtest ${VFD_LIST})
-endif (HDF5_TEST_VFD)
+        HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_tfile}" "${PROJECT_BINARY_DIR}/${vfdtest}-shared/${h5_tfile}" "HDF5_TEST_LIBSH_files")
+      endif ()
+    endforeach ()
+  endforeach ()
+endif ()
 
 # --------------------------------------------------------------------
 # Copy all the HDF5 files from the test directory into the source directory
@@ -111,45 +98,21 @@ set (HDF5_REFERENCE_FILES
 )
 
 foreach (ref_file ${HDF5_REFERENCE_FILES})
-  set (dest "${PROJECT_BINARY_DIR}/H5TEST/${ref_file}")
-  add_custom_command (
-      TARGET     ${HDF5_TEST_LIB_TARGET}
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file} ${dest}
-  )
+  HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file}" "${PROJECT_BINARY_DIR}/H5TEST/${ref_file}" "HDF5_TEST_LIB_files")
   if (BUILD_SHARED_LIBS)
-    set (dest "${PROJECT_BINARY_DIR}/H5TEST-shared/${ref_file}")
-    add_custom_command (
-        TARGET     ${HDF5_TEST_LIBSH_TARGET}
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file} ${dest}
-    )
-  endif (BUILD_SHARED_LIBS)
-endforeach (ref_file ${HDF5_REFERENCE_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file}" "${PROJECT_BINARY_DIR}/H5TEST-shared/${ref_file}" "HDF5_TEST_LIBSH_files")
+  endif ()
+endforeach ()
 if (HDF5_TEST_VFD)
   foreach (vfdtest ${VFD_LIST})
     foreach (ref_file ${HDF5_REFERENCE_FILES})
-      set (dest "${PROJECT_BINARY_DIR}/${vfdtest}/${ref_file}")
-      add_custom_command (
-          TARGET     ${HDF5_TEST_LIB_TARGET}
-          POST_BUILD
-          COMMAND    ${CMAKE_COMMAND}
-          ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file} ${dest}
-      )
+      HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file}" "${PROJECT_BINARY_DIR}/${vfdtest}/${ref_file}" "HDF5_TEST_LIB_files")
       if (BUILD_SHARED_LIBS)
-        set (dest "${PROJECT_BINARY_DIR}/${vfdtest}-shared/${ref_file}")
-        add_custom_command (
-            TARGET     ${HDF5_TEST_LIB_TARGET}
-            POST_BUILD
-            COMMAND    ${CMAKE_COMMAND}
-            ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file} ${dest}
-        )
-      endif (BUILD_SHARED_LIBS)
-    endforeach (ref_file ${HDF5_REFERENCE_FILES})
-  endforeach (vfdtest ${VFD_LIST})
-endif (HDF5_TEST_VFD)
+        HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/${ref_file}" "${PROJECT_BINARY_DIR}/${vfdtest}-shared/${ref_file}" "HDF5_TEST_LIBSH_files")
+      endif ()
+    endforeach ()
+  endforeach ()
+endif ()
 
 # --------------------------------------------------------------------
 # Copy test files from test/testfiles/plist_files dir to test dir
@@ -206,40 +169,19 @@ set (HDF5_REFERENCE_PLIST_FILES
 )
 
 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}
-  )
+  HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/${plistfile}" "${PROJECT_BINARY_DIR}/H5TEST/testfiles/plist_files/${plistfile}" "HDF5_TEST_LIB_files")
+  HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/def_${plistfile}" "${PROJECT_BINARY_DIR}/H5TEST/testfiles/plist_files/def_${plistfile}" "HDF5_TEST_LIB_files")
   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})
+    HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/${plistfile}" "${PROJECT_BINARY_DIR}/H5TEST-shared/testfiles/plist_files/${plistfile}" "HDF5_TEST_LIBSH_files")
+    HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/def_${plistfile}" "${PROJECT_BINARY_DIR}/H5TEST-shared/testfiles/plist_files/def_${plistfile}" "HDF5_TEST_LIBSH_files")
+  endif ()
+endforeach ()
 
 # --------------------------------------------------------------------
 #-- Copy all the HDF5 files from the test directory into the source directory
 # --------------------------------------------------------------------
 set (HDF5_REFERENCE_TEST_FILES
+    aggr.h5
     bad_compound.h5
     be_data.h5
     be_extlink1.h5
@@ -257,7 +199,15 @@ set (HDF5_REFERENCE_TEST_FILES
     filespace_1_8.h5
     fill_old.h5
     filter_error.h5
+    fsm_aggr_nopersist.h5
+    fsm_aggr_persist.h5
     group_old.h5
+    h5fc_ext1_i.h5
+    h5fc_ext1_f.h5
+    h5fc_ext2_if.h5
+    h5fc_ext2_sf.h5
+    h5fc_ext3_isf.h5
+    h5fc_ext_none.h5
     le_data.h5
     le_extlink1.h5
     le_extlink2.h5
@@ -265,6 +215,9 @@ set (HDF5_REFERENCE_TEST_FILES
     multi_file_v16-r.h5
     multi_file_v16-s.h5
     noencoder.h5
+    none.h5
+    paged_nopersist.h5
+    paged_persist.h5
     specmetaread.h5
     tarrold.h5
     tbad_msg_count.h5
@@ -279,45 +232,25 @@ set (HDF5_REFERENCE_TEST_FILES
 )
 
 foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-  set (dest "${HDF5_TEST_BINARY_DIR}/H5TEST/${h5_file}")
-  add_custom_command (
-      TARGET     ${HDF5_TEST_LIB_TARGET}
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/${h5_file} ${dest}
-  )
+  HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/${h5_file}" "${HDF5_TEST_BINARY_DIR}/H5TEST/${h5_file}" "HDF5_TEST_LIB_files")
   if (BUILD_SHARED_LIBS)
-    set (dest "${HDF5_TEST_BINARY_DIR}/H5TEST-shared/${h5_file}")
-    add_custom_command (
-        TARGET     ${HDF5_TEST_LIBSH_TARGET}
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/${h5_file} ${dest}
-    )
-  endif (BUILD_SHARED_LIBS)
-endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/${h5_file}" "${HDF5_TEST_BINARY_DIR}/H5TEST-shared/${h5_file}" "HDF5_TEST_LIBSH_files")
+  endif ()
+endforeach ()
 if (HDF5_TEST_VFD)
   foreach (vfdtest ${VFD_LIST})
     foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-      set (dest "${HDF5_TEST_BINARY_DIR}/${vfdtest}/${h5_file}")
-      add_custom_command (
-          TARGET     ${HDF5_TEST_LIB_TARGET}
-          POST_BUILD
-          COMMAND    ${CMAKE_COMMAND}
-          ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/${h5_file} ${dest}
-      )
+      HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/${h5_file}" "${HDF5_TEST_BINARY_DIR}/${vfdtest}/${h5_file}" "HDF5_TEST_LIB_files")
       if (BUILD_SHARED_LIBS)
-        set (dest "${HDF5_TEST_BINARY_DIR}/${vfdtest}-shared/${h5_file}")
-        add_custom_command (
-            TARGET     ${HDF5_TEST_LIB_TARGET}
-            POST_BUILD
-            COMMAND    ${CMAKE_COMMAND}
-            ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/${h5_file} ${dest}
-        )
-      endif (BUILD_SHARED_LIBS)
-    endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-  endforeach (vfdtest ${VFD_LIST})
-endif (HDF5_TEST_VFD)
+        HDFTEST_COPY_FILE("${HDF5_TEST_SOURCE_DIR}/${h5_file}" "${HDF5_TEST_BINARY_DIR}/${vfdtest}-shared/${h5_file}" "HDF5_TEST_LIBSH_files")
+      endif ()
+    endforeach ()
+  endforeach ()
+endif ()
+add_custom_target(HDF5_TEST_LIB_files ALL COMMENT "Copying files needed by HDF5_TEST_LIB tests" DEPENDS ${HDF5_TEST_LIB_files_list})
+if (BUILD_SHARED_LIBS)
+  add_custom_target(HDF5_TEST_LIBSH_files ALL COMMENT "Copying files needed by HDF5_TEST_LIBSH tests" DEPENDS ${HDF5_TEST_LIBSH_files_list})
+endif ()
 
 # Remove any output file left over from previous test run
 add_test (NAME H5TEST-clear-testhdf5-objects
@@ -369,8 +302,17 @@ if (HDF5_ENABLE_USING_MEMCHECKER)
       ENVIRONMENT "HDF5_ALARM_SECONDS=3600;srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
       WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
   )
-else (HDF5_ENABLE_USING_MEMCHECKER)
-  add_test (NAME H5TEST-testhdf5 COMMAND $<TARGET_FILE:testhdf5>)
+else ()
+  add_test (NAME H5TEST-testhdf5 COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=testhdf5.txt"
+      #-D "TEST_REFERENCE=testhdf5.out"
+      -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
   set_tests_properties (H5TEST-testhdf5 PROPERTIES
       DEPENDS H5TEST-clear-testhdf5-objects
       ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
@@ -400,14 +342,23 @@ else (HDF5_ENABLE_USING_MEMCHECKER)
         WORKING_DIRECTORY
             ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-    add_test (NAME H5TEST-shared-testhdf5 COMMAND $<TARGET_FILE:testhdf5-shared>)
+    add_test (NAME H5TEST-shared-testhdf5 COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:testhdf5-shared>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=testhdf5.txt"
+        #-D "TEST_REFERENCE=testhdf5.out"
+        -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
     set_tests_properties (H5TEST-shared-testhdf5 PROPERTIES
         DEPENDS H5TEST-shared-clear-testhdf5-objects
         ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
         WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-  endif (BUILD_SHARED_LIBS)
-endif (HDF5_ENABLE_USING_MEMCHECKER)
+  endif ()
+endif ()
 
 ##############################################################################
 ##############################################################################
@@ -535,6 +486,13 @@ set (test_CLEANFILES
     tvlstr2.h5
     twriteorder.dat
     flush.h5
+    flush-swmr.h5
+    noflush.h5
+    noflush-swmr.h5
+    flush_extend.h5
+    flush_extend-swmr.h5
+    noflush_extend.h5
+    noflush_extend-swmr.h5
     enum1.h5
     titerate.h5
     ttsafe.h5
@@ -606,6 +564,7 @@ set (test_CLEANFILES
     use_use_append_chunk.h5
     use_append_mchunks.h5
     use_disable_mdc_flushes.h5
+    tbogus.h5.copy
     flushrefresh.h5
     flushrefresh_VERIFICATION_START
     flushrefresh_VERIFICATION_CHECKPOINT1
@@ -639,6 +598,7 @@ set (H5TEST_TESTS
     ohdr
     stab
     gheap
+    evict_on_close
     farray
     earray
     btree2
@@ -681,6 +641,7 @@ set (H5TEST_TESTS
     cross_read
     freespace
     mf
+    page_buffer
     vds
     file_image
     unregister
@@ -690,25 +651,43 @@ set (H5TEST_TESTS
 )
 
 foreach (test ${H5TEST_TESTS})
-  if (${test} STREQUAL "big" AND CYGWIN)
-    add_test (NAME H5TEST-${test}
-        COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${test}"
-    )
-  else (${test} STREQUAL "big" AND CYGWIN)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
     add_test (NAME H5TEST-${test} COMMAND $<TARGET_FILE:${test}>)
-  endif (${test} STREQUAL "big" AND CYGWIN)
-  set_tests_properties (H5TEST-${test} PROPERTIES
-      DEPENDS H5TEST-clear-objects
-      ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
-      WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
-  )
-endforeach (test ${H5TEST_TESTS})
+    set_tests_properties (H5TEST-${test} PROPERTIES
+        DEPENDS H5TEST-clear-objects
+        ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
+        WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
+    )
+  else ()
+    if (${test} STREQUAL "big" AND CYGWIN)
+      add_test (NAME H5TEST-${test}
+          COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${test}"
+      )
+    else ()
+      add_test (NAME H5TEST-${test} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:${test}>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=${test}.txt"
+          #-D "TEST_REFERENCE=${test}.out"
+          -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+    set_tests_properties (H5TEST-${test} PROPERTIES
+        DEPENDS H5TEST-clear-objects
+        ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
+        WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
+    )
+  endif ()
+endforeach ()
 
 set_tests_properties (H5TEST-flush2 PROPERTIES DEPENDS H5TEST-flush1)
 set_tests_properties (H5TEST-fheap PROPERTIES TIMEOUT 1800)
 set_tests_properties (H5TEST-big PROPERTIES TIMEOUT 1800)
 set_tests_properties (H5TEST-btree2 PROPERTIES TIMEOUT 1800)
-set_tests_properties (H5TEST-objcopy PROPERTIES TIMEOUT 2400)
+set_tests_properties (H5TEST-objcopy PROPERTIES TIMEOUT 1800)
 
 if (BUILD_SHARED_LIBS)
   # Remove any output file left over from previous test run
@@ -725,22 +704,31 @@ if (BUILD_SHARED_LIBS)
       add_test (NAME H5TEST-shared-${test}
           COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${test}-shared"
       )
-    else (${test} STREQUAL "big" AND CYGWIN)
-      add_test (NAME H5TEST-shared-${test} COMMAND $<TARGET_FILE:${test}-shared>)
-    endif (${test} STREQUAL "big" AND CYGWIN)
+    else ()
+      add_test (NAME H5TEST-shared-${test} COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:${test}-shared>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=${test}.txt"
+          #-D "TEST_REFERENCE=${test}.out"
+          -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     set_tests_properties (H5TEST-shared-${test} PROPERTIES
         DEPENDS H5TEST-shared-clear-objects
         ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
         WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-  endforeach (test ${H5TEST_TESTS})
+  endforeach ()
 
   set_tests_properties (H5TEST-shared-flush2 PROPERTIES DEPENDS H5TEST-shared-flush1)
   set_tests_properties (H5TEST-shared-fheap PROPERTIES TIMEOUT 1800)
   set_tests_properties (H5TEST-shared-big PROPERTIES TIMEOUT 1800)
   set_tests_properties (H5TEST-shared-btree2 PROPERTIES TIMEOUT 1800)
-  set_tests_properties (H5TEST-shared-objcopy PROPERTIES TIMEOUT 2400)
-endif (BUILD_SHARED_LIBS)
+  set_tests_properties (H5TEST-shared-objcopy PROPERTIES TIMEOUT 1800)
+endif ()
 
 ##############################################################################
 ##############################################################################
@@ -757,14 +745,43 @@ if (NOT CYGWIN)
       WORKING_DIRECTORY
           ${HDF5_TEST_BINARY_DIR}/H5TEST
   )
-  add_test (NAME H5TEST-cache COMMAND $<TARGET_FILE:cache>)
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (NAME H5TEST-cache COMMAND $<TARGET_FILE:cache>)
+  else ()
+    add_test (NAME H5TEST-cache COMMAND "${CMAKE_COMMAND}"
+        -D "TEST_PROGRAM=$<TARGET_FILE:cache>"
+        -D "TEST_ARGS:STRING="
+        -D "TEST_EXPECT=0"
+        -D "TEST_SKIP_COMPARE=TRUE"
+        -D "TEST_OUTPUT=cache.txt"
+        #-D "TEST_REFERENCE=cache.out"
+        -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST"
+        -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+    )
+  endif ()
   set_tests_properties (H5TEST-cache PROPERTIES
       DEPENDS H5TEST-clear-cache-objects
-      ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5TestExpress=${HDF_TEST_EXPRESS}"
+      ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5TestExpress=3"
       WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
   )
-  set_tests_properties (H5TEST-cache PROPERTIES TIMEOUT 2400)
-endif (NOT CYGWIN)
+  set_tests_properties (H5TEST-cache PROPERTIES TIMEOUT 1800)
+endif ()
+
+#-- Adding test for cache_image
+add_test (
+    NAME H5TEST-clear-cache_image-objects
+    COMMAND    ${CMAKE_COMMAND}
+        -E remove
+        cache_image_test.h5
+    WORKING_DIRECTORY
+        ${HDF5_TEST_BINARY_DIR}/H5TEST
+)
+add_test (NAME H5TEST-cache_image COMMAND $<TARGET_FILE:cache_image>)
+set_tests_properties (H5TEST-cache_image PROPERTIES
+    DEPENDS H5TEST-clear-cache_image-objects
+    ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5TestExpress=3"
+    WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
+)
 
 #-- Adding test for err_compat
 if (HDF5_ENABLE_DEPRECATED_SYMBOLS)
@@ -791,7 +808,7 @@ if (HDF5_ENABLE_DEPRECATED_SYMBOLS)
       ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
       WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
   )
-endif (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+endif ()
 
 #-- Adding test for error_test
 add_test (NAME H5TEST-clear-error_test-objects
@@ -856,7 +873,7 @@ add_test (NAME H5TEST-testlibinfo
 
 if (BUILD_SHARED_LIBS)
   #-- Adding test for cache
-  if (NOT CYGWIN)
+  if (NOT CYGWIN AND NOT WIN32)
     add_test (NAME H5TEST-shared-clear-cache-objects
         COMMAND    ${CMAKE_COMMAND}
             -E remove
@@ -864,14 +881,27 @@ if (BUILD_SHARED_LIBS)
         WORKING_DIRECTORY
             ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-    add_test (NAME H5TEST-shared-cache COMMAND $<TARGET_FILE:cache-shared>)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5TEST-shared-cache COMMAND $<TARGET_FILE:cache-shared>)
+    else ()
+      add_test (NAME H5TEST-shared-cache COMMAND "${CMAKE_COMMAND}"
+          -D "TEST_PROGRAM=$<TARGET_FILE:cache-shared>"
+          -D "TEST_ARGS:STRING="
+          -D "TEST_EXPECT=0"
+          -D "TEST_SKIP_COMPARE=TRUE"
+          -D "TEST_OUTPUT=cache-shared.txt"
+          #-D "TEST_REFERENCE=cache-shared.out"
+          -D "TEST_FOLDER=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
+          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
     set_tests_properties (H5TEST-shared-cache PROPERTIES
         DEPENDS H5TEST-shared-clear-cache-objects
         ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST-shared;HDF5TestExpress=${HDF_TEST_EXPRESS}"
         WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-    set_tests_properties (H5TEST-shared-cache PROPERTIES TIMEOUT 2400)
-  endif (NOT CYGWIN)
+    set_tests_properties (H5TEST-shared-cache PROPERTIES TIMEOUT 1800)
+  endif ()
 
   #-- Adding test for err_compat
   if (HDF5_ENABLE_DEPRECATED_SYMBOLS)
@@ -898,7 +928,7 @@ if (BUILD_SHARED_LIBS)
         ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
         WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
     )
-  endif (HDF5_ENABLE_DEPRECATED_SYMBOLS)
+  endif ()
 
   #-- Adding test for error_test
   add_test (NAME H5TEST-shared-clear-error_test-objects
@@ -960,16 +990,16 @@ if (BUILD_SHARED_LIBS)
       WORKING_DIRECTORY
           ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
   )
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 ##############################################################################
 ###    P L U G I N  T E S T S
 ##############################################################################
 if (WIN32)
   set (CMAKE_SEP "\;")
-else (WIN32)
+else ()
   set (CMAKE_SEP ":")
-endif (WIN32)
+endif ()
 
 add_test (NAME H5PLUGIN-plugin COMMAND $<TARGET_FILE:plugin>)
 set_tests_properties (H5PLUGIN-plugin PROPERTIES
@@ -995,15 +1025,20 @@ if (HDF5_TEST_VFD)
 
   set (H5_VFD_TESTS
       testhdf5
-#      accum
+#      cache
+      cache_api
+      cache_tagging
       lheap
       ohdr
       stab
       gheap
-#      cache
-      cache_api
-      cache_tagging
+      evict_on_close
       pool
+#      accum
+      farray
+      earray
+      btree2
+#      fheap
       hyperslab
       istore
       bittests
@@ -1037,10 +1072,6 @@ if (HDF5_TEST_VFD)
       cross_read
       freespace
       mf
-      farray
-      earray
-      btree2
-      #fheap
 #      error_test
 #      err_compat
       #tcheck_version
@@ -1050,9 +1081,10 @@ if (HDF5_TEST_VFD)
   )
   if (NOT CYGWIN)
     set (H5_VFD_TESTS ${H5_VFD_TESTS} big cache)
-  endif (NOT CYGWIN)
+  endif ()
 
-  MACRO (CHECK_VFD_TEST vfdtest vfdname resultcode)
+  # Windows only macro
+  macro (CHECK_VFD_TEST vfdtest vfdname resultcode)
     if (${vfdtest} STREQUAL "flush1" OR ${vfdtest} STREQUAL "flush2")
       if (${vfdname} STREQUAL "multi" OR ${vfdname} STREQUAL "split")
         if (NOT BUILD_SHARED_LIBS AND NOT CMAKE_BUILD_TYPE MATCHES Debug)
@@ -1085,8 +1117,8 @@ if (HDF5_TEST_VFD)
                 ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname}-shared"
                 WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}-shared
             )
-          endif (BUILD_SHARED_LIBS)
-        else (NOT BUILD_SHARED_LIBS AND NOT CMAKE_BUILD_TYPE MATCHES Debug)
+          endif ()
+        else ()
           add_test (NAME VFD-${vfdname}-${vfdtest}
               COMMAND ${CMAKE_COMMAND} -E echo "SKIP VFD-${vfdname}-${vfdtest}"
           )
@@ -1094,9 +1126,9 @@ if (HDF5_TEST_VFD)
             add_test (NAME VFD-${vfdname}-${test}-shared
                 COMMAND ${CMAKE_COMMAND} -E echo "SKIP VFD-${vfdname}-${vfdtest}-shared"
             )
-          endif (BUILD_SHARED_LIBS)
-        endif(NOT BUILD_SHARED_LIBS AND NOT CMAKE_BUILD_TYPE MATCHES Debug)
-      else (${vfdname} STREQUAL "multi" OR ${vfdname} STREQUAL "split")
+          endif ()
+        endif ()
+      else ()
         add_test (NAME VFD-${vfdname}-${vfdtest}
             COMMAND "${CMAKE_COMMAND}"
                 -D "TEST_PROGRAM=$<TARGET_FILE:${vfdtest}>"
@@ -1126,9 +1158,9 @@ if (HDF5_TEST_VFD)
               ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname}-shared"
               WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}-shared
           )
-        endif (BUILD_SHARED_LIBS)
-      endif (${vfdname} STREQUAL "multi" OR ${vfdname} STREQUAL "split")
-    else (${vfdtest} STREQUAL "flush1" OR ${vfdtest} STREQUAL "flush2")
+        endif ()
+      endif ()
+    else ()
       add_test (NAME VFD-${vfdname}-${vfdtest}
           COMMAND "${CMAKE_COMMAND}"
               -D "TEST_PROGRAM=$<TARGET_FILE:${vfdtest}>"
@@ -1143,7 +1175,7 @@ if (HDF5_TEST_VFD)
           ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname};HDF5TestExpress=${HDF_TEST_EXPRESS}"
           WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}
       )
-      if (BUILD_SHARED_LIBS)
+      if (BUILD_SHARED_LIBS AND NOT ${vfdtest} STREQUAL "cache")
         add_test (NAME VFD-${vfdname}-${vfdtest}-shared
             COMMAND "${CMAKE_COMMAND}"
                 -D "TEST_PROGRAM=$<TARGET_FILE:${vfdtest}-shared>"
@@ -1158,15 +1190,15 @@ if (HDF5_TEST_VFD)
             ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname}-shared;HDF5TestExpress=${HDF_TEST_EXPRESS}"
             WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}-shared
         )
-        endif (BUILD_SHARED_LIBS)
-    endif (${vfdtest} STREQUAL "flush1" OR ${vfdtest} STREQUAL "flush2")
-  ENDMACRO (CHECK_VFD_TEST vfdtest vfdname resultcode)
+        endif ()
+    endif ()
+  endmacro ()
 
-  MACRO (ADD_VFD_TEST vfdname resultcode)
+  macro (ADD_VFD_TEST vfdname resultcode)
     foreach (test ${H5_VFD_TESTS})
       if (WIN32)
         CHECK_VFD_TEST (${test} ${vfdname} ${resultcode})
-      else (WIN32)
+      else ()
         add_test (NAME VFD-${vfdname}-${test}
             COMMAND "${CMAKE_COMMAND}"
                 -D "TEST_PROGRAM=$<TARGET_FILE:${test}>"
@@ -1196,25 +1228,25 @@ if (HDF5_TEST_VFD)
               ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname}-shared"
               WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}-shared
           )
-        endif (BUILD_SHARED_LIBS)
-      endif (WIN32)
-    endforeach (test ${H5_VFD_TESTS})
+        endif ()
+      endif ()
+    endforeach ()
     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}-istore PROPERTIES TIMEOUT 1800)
-#    if (NOT CYGWIN)
-#      set_tests_properties (VFD-${vfdname}-cache PROPERTIES TIMEOUT 1800)
-#    endif (NOT CYGWIN)
+    if (NOT CYGWIN)
+      set_tests_properties (VFD-${vfdname}-cache PROPERTIES TIMEOUT 1800)
+    endif ()
     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}-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 (NOT CYGWIN AND NOT WIN32)
+        set_tests_properties (VFD-${vfdname}-cache-shared PROPERTIES TIMEOUT 1800)
+      endif ()
+    endif ()
     if (HDF5_TEST_FHEAP_VFD)
       add_test (NAME VFD-${vfdname}-fheap
           COMMAND "${CMAKE_COMMAND}"
@@ -1247,16 +1279,16 @@ if (HDF5_TEST_VFD)
           ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/${vfdname}-shared;HDF5TestExpress=${HDF_TEST_EXPRESS}"
           WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/${vfdname}-shared
       )
-      endif (BUILD_SHARED_LIBS)
-    endif (HDF5_TEST_FHEAP_VFD)
-  ENDMACRO (ADD_VFD_TEST)
+      endif ()
+    endif ()
+  endmacro ()
 
   # Run test with different Virtual File Driver
   foreach (vfd ${VFD_LIST})
     ADD_VFD_TEST (${vfd} 0)
-  endforeach (vfd ${VFD_LIST})
+  endforeach ()
 
-endif (HDF5_TEST_VFD)
+endif ()
 
 ##############################################################################
 ##############################################################################
@@ -1265,13 +1297,13 @@ endif (HDF5_TEST_VFD)
 ##############################################################################
 
 if (HDF5_BUILD_GENERATORS)
-  MACRO (ADD_H5_GENERATOR genfile)
+  macro (ADD_H5_GENERATOR genfile)
     add_executable (${genfile} ${HDF5_TEST_SOURCE_DIR}/${genfile}.c)
     TARGET_NAMING (${genfile} STATIC)
     TARGET_C_PROPERTIES (${genfile} STATIC " " " ")
     target_link_libraries (${genfile} ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET})
     set_target_properties (${genfile} PROPERTIES FOLDER generator/test)
-  ENDMACRO (ADD_H5_GENERATOR genfile)
+  endmacro ()
 
   # generator executables
   set (H5_GENERATORS
@@ -1280,7 +1312,6 @@ if (HDF5_BUILD_GENERATORS)
       gen_cross
       gen_deflate
       gen_filters
-      gen_idx
       gen_new_array
       gen_new_fill
       gen_new_group
@@ -1299,6 +1330,6 @@ if (HDF5_BUILD_GENERATORS)
 
   foreach (gen ${H5_GENERATORS})
     ADD_H5_GENERATOR (${gen})
-  endforeach (gen ${H5_GENERATORS})
+  endforeach ()
 
-endif (HDF5_BUILD_GENERATORS)
+endif ()
diff --git a/test/COPYING b/test/COPYING
index 6903daf..6497ace 100644
--- a/test/COPYING
+++ b/test/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/test/H5srcdir.h b/test/H5srcdir.h
index 81624d8..32fe8c9 100644
--- a/test/H5srcdir.h
+++ b/test/H5srcdir.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -31,26 +29,9 @@ static char srcdir_path[1024] = "";
 /* Buffer to construct file in and return pointer to */
 static char srcdir_testpath[1024] = "";
 
-/* Append the test file name to the srcdir path and return the whole string */
-static const char *H5_get_srcdir_filename(const char *filename)
-{
-    const char *srcdir = HDgetenv("srcdir");
-
-    /* Check for using the srcdir from configure time */
-    if(NULL == srcdir)
-        srcdir = config_srcdir;
-
-    /* Build path to test file */
-    if((HDstrlen(srcdir) + HDstrlen(filename) + 2) < sizeof(srcdir_testpath)) {
-        HDsnprintf(srcdir_testpath, sizeof(srcdir_testpath), "%s/%s", srcdir, filename);
-        return(srcdir_testpath);
-    } /* end if */
-    else
-        return(NULL);
-}
-
 /* Just return the srcdir path */
-static const char *H5_get_srcdir(void)
+static const char *
+H5_get_srcdir(void)
 {
     const char *srcdir = HDgetenv("srcdir");
 
@@ -65,6 +46,25 @@ static const char *H5_get_srcdir(void)
     } /* end if */
     else
         return(NULL);
-}
+} /* end H5_get_srcdir() */
+
+/* Append the test file name to the srcdir path and return the whole string */
+static const char *H5_get_srcdir_filename(const char *filename)
+{
+    const char *srcdir = H5_get_srcdir();
+
+    /* Check for error */
+    if(NULL == srcdir)
+        return(NULL);
+    else {
+        /* Build path to test file */
+        if((HDstrlen(srcdir) + HDstrlen(filename) + 1) < sizeof(srcdir_testpath)) {
+            HDsnprintf(srcdir_testpath, sizeof(srcdir_testpath), "%s%s", srcdir, filename);
+            return(srcdir_testpath);
+        } /* end if */
+        else
+            return(NULL);
+    } /* end else */
+} /* end H5_get_srcdir_filename() */
 #endif /* _H5SRCDIR_H */
 
diff --git a/test/H5srcdir_str.h.in b/test/H5srcdir_str.h.in
index d472124..bab1df3 100644
--- a/test/H5srcdir_str.h.in
+++ b/test/H5srcdir_str.h.in
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* If you are reading this file and it has a '.h' suffix, it was automatically
diff --git a/test/Makefile.am b/test/Makefile.am
index 127c891..20b63f6 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -51,9 +49,10 @@ 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.
-TEST_PROG= testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
-           farray earray btree2 fheap \
-           pool accum hyperslab istore bittests dt_arith \
+TEST_PROG= testhdf5 \
+           cache cache_api cache_image cache_tagging lheap ohdr stab gheap \
+           evict_on_close farray earray btree2 fheap \
+           pool accum hyperslab istore bittests dt_arith page_buffer \
            dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
            twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
            set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
@@ -90,7 +89,7 @@ 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 \
+BUILD_ALL_PROGS=gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters 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
@@ -99,23 +98,36 @@ if BUILD_ALL_CONDITIONAL
   noinst_PROGRAMS=$(BUILD_ALL_PROGS)
 endif
 
-if HAVE_SHARED_CONDITIONAL
-  # The libh5test library provides common support code for the tests.
-  noinst_LTLIBRARIES=libh5test.la
+# The libh5test library provides common support code for the tests.
+noinst_LTLIBRARIES=libh5test.la
 
-  # The libdynlib1 and libdynlib2 library for testing plugin module plugin.c.
+if HAVE_SHARED_CONDITIONAL
+  # The libdynlib1, libdynlib2, libdynlib3, and libdynlib4 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
+  dyn_LTLIBRARIES=libdynlib1.la libdynlib2.la libdynlib3.la libdynlib4.la
   libdynlib1_la_SOURCES=dynlib1.c
   libdynlib2_la_SOURCES=dynlib2.c
   libdynlib3_la_SOURCES=dynlib3.c
+  libdynlib4_la_SOURCES=dynlib4.c
+  libdynlib1_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+  libdynlib2_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+  libdynlib3_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+  libdynlib4_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+libdynlib1.la: $(libdynlib1_la_OBJECTS) $(libdynlib1_la_DEPENDENCIES) $(EXTRA_libdynlib1_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlib1_la_LINK) $(am_libdynlib1_la_rpath) $(libdynlib1_la_OBJECTS) $(libdynlib1_la_LIBADD)
+
+libdynlib2.la: $(libdynlib2_la_OBJECTS) $(libdynlib2_la_DEPENDENCIES) $(EXTRA_libdynlib2_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlib2_la_LINK) $(am_libdynlib2_la_rpath) $(libdynlib2_la_OBJECTS) $(libdynlib2_la_LIBADD)
+
+libdynlib3.la: $(libdynlib3_la_OBJECTS) $(libdynlib3_la_DEPENDENCIES) $(EXTRA_libdynlib3_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlib3_la_LINK) $(am_libdynlib3_la_rpath) $(libdynlib3_la_OBJECTS) $(libdynlib3_la_LIBADD)
 
-install-exec-hook:
-	$(RM) $(DESTDIR)$(libdir)/*dynlib*
+libdynlib4.la: $(libdynlib4_la_OBJECTS) $(libdynlib4_la_DEPENDENCIES) $(EXTRA_libdynlib4_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlib4_la_LINK) $(am_libdynlib4_la_rpath) $(libdynlib4_la_OBJECTS) $(libdynlib4_la_LIBADD) 
 
-else
-  # The libh5test library provides common support code for the tests.
-  noinst_LTLIBRARIES=libh5test.la
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
 endif
 
 libh5test_la_SOURCES=h5test.c testframe.c cache_common.c swmr_common.c
@@ -126,6 +138,7 @@ LDADD=libh5test.la $(LIBHDF5)
 # List the source files for tests that have more than one
 ttsafe_SOURCES=ttsafe.c ttsafe_dcreate.c ttsafe_error.c ttsafe_cancel.c       \
                ttsafe_acreate.c
+cache_image_SOURCES=cache_image.c genall5.c
 
 VFD_LIST = sec2 stdio core core_paged split multi family
 if DIRECT_VFD_CONDITIONAL
@@ -150,12 +163,14 @@ 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 chunk_fixed.h5 cache_logging.out \
+CHECK_CLEANFILES+=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_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 \
+    huge_chunks.h5 chunk_cache.h5 big_chunk.h5 chunk_fast.h5 chunk_expand.h5 \
+    chunk_fixed.h5 copy_dcpl_newfile.h5 partial_chunks.h5 layout_extend.h5 \
+    zero_chunk.h5 chunk_single.h5 swmr_non_latest.h5 \
+    earray_hdr_fd.h5 farray_hdr_fd.h5 bt2_hdr_fd.h5 \
+    storage_size.h5 dls_01_strings.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-5].h5 extern_[1-4][rw].raw gheap[0-4].h5 \
     dt_arith[1-2] links.h5 links[0-6]*.h5 extlinks[0-15].h5 tmp \
@@ -163,7 +178,9 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 \
     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 twriteorder.dat flush.h5 \
+    trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 twriteorder.dat \
+    flush.h5 flush-swmr.h5 noflush.h5 noflush-swmr.h5 flush_extend.h5 \
+    flush_extend-swmr.h5 noflush_extend.h5 noflush_extend-swmr.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           \
@@ -182,8 +199,9 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 \
     flushrefresh.h5 flushrefresh_VERIFICATION_START                  \
     flushrefresh_VERIFICATION_CHECKPOINT1 flushrefresh_VERIFICATION_CHECKPOINT2 \
     flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 ohdr_swmr.h5 \
-    tbogus.h5.copy test_swmr*.h5 cache_logging.h5 vds_swmr.h5 vds_swmr_src_*.h5 \
-    earray_hdr_fd.h5
+    test_swmr*.h5 cache_logging.h5 cache_logging.out vds_swmr.h5 vds_swmr_src_*.h5 \
+    swmr[0-2].h5 swmr_writer.out swmr_writer.log.* swmr_reader.out.* swmr_reader.log.* \
+    tbogus.h5.copy cache_image_test.h5
 
 # Sources for testhdf5 executable
 testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
diff --git a/test/Makefile.in b/test/Makefile.in
index 8a2aad6..4a07b73 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Test Makefile(.in)
 #
@@ -183,8 +181,8 @@ am__uninstall_files_from_dir = { \
     || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
-am__installdirs = "$(DESTDIR)$(libdir)"
-LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+am__installdirs = "$(DESTDIR)$(dyndir)"
+LTLIBRARIES = $(dyn_LTLIBRARIES) $(noinst_LTLIBRARIES)
 libdynlib1_la_LIBADD =
 am__libdynlib1_la_SOURCES_DIST = dynlib1.c
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib1_la_OBJECTS = dynlib1.lo
@@ -193,36 +191,54 @@ 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 = 
+libdynlib1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libdynlib1_la_LDFLAGS) $(LDFLAGS) -o $@
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib1_la_rpath = -rpath \
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(libdir)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
 libdynlib2_la_LIBADD =
 am__libdynlib2_la_SOURCES_DIST = dynlib2.c
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib2_la_OBJECTS = dynlib2.lo
 libdynlib2_la_OBJECTS = $(am_libdynlib2_la_OBJECTS)
+libdynlib2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libdynlib2_la_LDFLAGS) $(LDFLAGS) -o $@
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib2_la_rpath = -rpath \
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(libdir)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
 libdynlib3_la_LIBADD =
 am__libdynlib3_la_SOURCES_DIST = dynlib3.c
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib3_la_OBJECTS = dynlib3.lo
 libdynlib3_la_OBJECTS = $(am_libdynlib3_la_OBJECTS)
+libdynlib3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libdynlib3_la_LDFLAGS) $(LDFLAGS) -o $@
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib3_la_rpath = -rpath \
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(libdir)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+libdynlib4_la_LIBADD =
+am__libdynlib4_la_SOURCES_DIST = dynlib4.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlib4_la_OBJECTS = dynlib4.lo
+libdynlib4_la_OBJECTS = $(am_libdynlib4_la_OBJECTS)
+libdynlib4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libdynlib4_la_LDFLAGS) $(LDFLAGS) -o $@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlib4_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
 libh5test_la_LIBADD =
 am_libh5test_la_OBJECTS = h5test.lo testframe.lo cache_common.lo \
 	swmr_common.lo
 libh5test_la_OBJECTS = $(am_libh5test_la_OBJECTS)
- at HAVE_SHARED_CONDITIONAL_FALSE@am_libh5test_la_rpath =
- at HAVE_SHARED_CONDITIONAL_TRUE@am_libh5test_la_rpath =
 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) \
+	cache_image$(EXEEXT) cache_tagging$(EXEEXT) lheap$(EXEEXT) \
+	ohdr$(EXEEXT) stab$(EXEEXT) gheap$(EXEEXT) \
+	evict_on_close$(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) \
+	dt_arith$(EXEEXT) page_buffer$(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) \
@@ -234,7 +250,7 @@ am__EXEEXT_1 = testhdf5$(EXEEXT) cache$(EXEEXT) cache_api$(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) \
-	gen_idx$(EXEEXT) gen_new_array$(EXEEXT) gen_new_fill$(EXEEXT) \
+	gen_new_array$(EXEEXT) gen_new_fill$(EXEEXT) \
 	gen_new_group$(EXEEXT) gen_new_mtime$(EXEEXT) \
 	gen_new_super$(EXEEXT) gen_noencoder$(EXEEXT) \
 	gen_nullspace$(EXEEXT) gen_udlinks$(EXEEXT) \
@@ -282,6 +298,10 @@ cache_api_SOURCES = cache_api.c
 cache_api_OBJECTS = cache_api.$(OBJEXT)
 cache_api_LDADD = $(LDADD)
 cache_api_DEPENDENCIES = libh5test.la $(LIBHDF5)
+am_cache_image_OBJECTS = cache_image.$(OBJEXT) genall5.$(OBJEXT)
+cache_image_OBJECTS = $(am_cache_image_OBJECTS)
+cache_image_LDADD = $(LDADD)
+cache_image_DEPENDENCIES = libh5test.la $(LIBHDF5)
 cache_logging_SOURCES = cache_logging.c
 cache_logging_OBJECTS = cache_logging.$(OBJEXT)
 cache_logging_LDADD = $(LDADD)
@@ -351,6 +371,10 @@ error_test_SOURCES = error_test.c
 error_test_OBJECTS = error_test.$(OBJEXT)
 error_test_LDADD = $(LDADD)
 error_test_DEPENDENCIES = libh5test.la $(LIBHDF5)
+evict_on_close_SOURCES = evict_on_close.c
+evict_on_close_OBJECTS = evict_on_close.$(OBJEXT)
+evict_on_close_LDADD = $(LDADD)
+evict_on_close_DEPENDENCIES = libh5test.la $(LIBHDF5)
 extend_SOURCES = extend.c
 extend_OBJECTS = extend.$(OBJEXT)
 extend_LDADD = $(LDADD)
@@ -423,10 +447,6 @@ gen_filters_SOURCES = gen_filters.c
 gen_filters_OBJECTS = gen_filters.$(OBJEXT)
 gen_filters_LDADD = $(LDADD)
 gen_filters_DEPENDENCIES = libh5test.la $(LIBHDF5)
-gen_idx_SOURCES = gen_idx.c
-gen_idx_OBJECTS = gen_idx.$(OBJEXT)
-gen_idx_LDADD = $(LDADD)
-gen_idx_DEPENDENCIES = libh5test.la $(LIBHDF5)
 gen_new_array_SOURCES = gen_new_array.c
 gen_new_array_OBJECTS = gen_new_array.$(OBJEXT)
 gen_new_array_LDADD = $(LDADD)
@@ -523,6 +543,10 @@ ohdr_SOURCES = ohdr.c
 ohdr_OBJECTS = ohdr.$(OBJEXT)
 ohdr_LDADD = $(LDADD)
 ohdr_DEPENDENCIES = libh5test.la $(LIBHDF5)
+page_buffer_SOURCES = page_buffer.c
+page_buffer_OBJECTS = page_buffer.$(OBJEXT)
+page_buffer_LDADD = $(LDADD)
+page_buffer_DEPENDENCIES = libh5test.la $(LIBHDF5)
 plugin_SOURCES = plugin.c
 plugin_OBJECTS = plugin.$(OBJEXT)
 plugin_LDADD = $(LDADD)
@@ -700,23 +724,24 @@ am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 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 \
-	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 \
+	$(libdynlib3_la_SOURCES) $(libdynlib4_la_SOURCES) \
+	$(libh5test_la_SOURCES) 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_image_SOURCES) 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 \
+	err_compat.c error_test.c evict_on_close.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_filters.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 \
+	ntypes.c objcopy.c ohdr.c page_buffer.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 \
@@ -727,23 +752,25 @@ SOURCES = $(libdynlib1_la_SOURCES) $(libdynlib2_la_SOURCES) \
 	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) \
+	$(am__libdynlib3_la_SOURCES_DIST) \
+	$(am__libdynlib4_la_SOURCES_DIST) $(libh5test_la_SOURCES) \
 	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 \
+	$(cache_image_SOURCES) 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 evict_on_close.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_filters.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 \
+	ntypes.c objcopy.c ohdr.c page_buffer.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 \
@@ -1007,6 +1034,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -1128,6 +1156,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -1280,24 +1309,27 @@ 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 \
-	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-5].h5 \
-	extern_[1-4][rw].raw gheap[0-4].h5 dt_arith[1-2] links.h5 \
-	links[0-6]*.h5 extlinks[0-15].h5 tmp big.data \
-	big[0-9][0-9][0-9][0-9][0-9].h5 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 \
+	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 chunk_fixed.h5 copy_dcpl_newfile.h5 \
+	partial_chunks.h5 layout_extend.h5 zero_chunk.h5 \
+	chunk_single.h5 swmr_non_latest.h5 earray_hdr_fd.h5 \
+	farray_hdr_fd.h5 bt2_hdr_fd.h5 storage_size.h5 \
+	dls_01_strings.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-5].h5 extern_[1-4][rw].raw \
+	gheap[0-4].h5 dt_arith[1-2] links.h5 links[0-6]*.h5 \
+	extlinks[0-15].h5 tmp big.data big[0-9][0-9][0-9][0-9][0-9].h5 \
+	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 \
-	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 \
+	twriteorder.dat flush.h5 flush-swmr.h5 noflush.h5 \
+	noflush-swmr.h5 flush_extend.h5 flush_extend-swmr.h5 \
+	noflush_extend.h5 noflush_extend-swmr.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 \
@@ -1315,8 +1347,10 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 accum.h5 \
 	flushrefresh_VERIFICATION_CHECKPOINT1 \
 	flushrefresh_VERIFICATION_CHECKPOINT2 \
 	flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 \
-	ohdr_swmr.h5 tbogus.h5.copy test_swmr*.h5 cache_logging.h5 \
-	vds_swmr.h5 vds_swmr_src_*.h5 earray_hdr_fd.h5
+	ohdr_swmr.h5 test_swmr*.h5 cache_logging.h5 cache_logging.out \
+	vds_swmr.h5 vds_swmr_src_*.h5 swmr[0-2].h5 swmr_writer.out \
+	swmr_writer.log.* swmr_reader.out.* swmr_reader.log.* \
+	tbogus.h5.copy cache_image_test.h5
 
 # Test scripts--
 #       testerror.sh: err_compat, error_test
@@ -1346,9 +1380,10 @@ 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.
-TEST_PROG = testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
-           farray earray btree2 fheap \
-           pool accum hyperslab istore bittests dt_arith \
+TEST_PROG = testhdf5 \
+           cache cache_api cache_image cache_tagging lheap ohdr stab gheap \
+           evict_on_close farray earray btree2 fheap \
+           pool accum hyperslab istore bittests dt_arith page_buffer \
            dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
            twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
            set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
@@ -1363,17 +1398,26 @@ TEST_PROG = testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
 # --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 \
+BUILD_ALL_PROGS = gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters 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
 
- at HAVE_SHARED_CONDITIONAL_FALSE@noinst_LTLIBRARIES = libh5test.la
- at HAVE_SHARED_CONDITIONAL_TRUE@noinst_LTLIBRARIES = libh5test.la
- at HAVE_SHARED_CONDITIONAL_TRUE@lib_LTLIBRARIES = libdynlib1.la libdynlib2.la libdynlib3.la
+
+# The libh5test library provides common support code for the tests.
+noinst_LTLIBRARIES = libh5test.la
+ at HAVE_SHARED_CONDITIONAL_TRUE@dyn_LTLIBRARIES = libdynlib1.la libdynlib2.la libdynlib3.la libdynlib4.la
 @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
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib4_la_SOURCES = dynlib4.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib1_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib2_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib3_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib4_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
 libh5test_la_SOURCES = h5test.c testframe.c cache_common.c swmr_common.c
 
 # Use libhd5test.la to compile all of the tests
@@ -1383,6 +1427,7 @@ LDADD = libh5test.la $(LIBHDF5)
 ttsafe_SOURCES = ttsafe.c ttsafe_dcreate.c ttsafe_error.c ttsafe_cancel.c       \
                ttsafe_acreate.c
 
+cache_image_SOURCES = cache_image.c genall5.c
 VFD_LIST = sec2 stdio core core_paged split multi family \
 	$(am__append_4)
 
@@ -1403,18 +1448,20 @@ DISTCLEANFILES = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.
     testswmr.sh testvdsswmr.sh test_usecases.sh testflushrefresh.sh
 
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1477,33 +1524,33 @@ test_usecases.sh: $(top_builddir)/config.status $(srcdir)/test_usecases.sh.in
 testvdsswmr.sh: $(top_builddir)/config.status $(srcdir)/testvdsswmr.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+install-dynLTLIBRARIES: $(dyn_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
 	list2=; for p in $$list; do \
 	  if test -f $$p; then \
 	    list2="$$list2 $$p"; \
 	  else :; fi; \
 	done; \
 	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dyndir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dyndir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dyndir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dyndir)"; \
 	}
 
-uninstall-libLTLIBRARIES:
+uninstall-dynLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
 	for p in $$list; do \
 	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dyndir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dyndir)/$$f"; \
 	done
 
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; \
+clean-dynLTLIBRARIES:
+	-test -z "$(dyn_LTLIBRARIES)" || rm -f $(dyn_LTLIBRARIES)
+	@list='$(dyn_LTLIBRARIES)'; \
 	locs=`for p in $$list; do echo $$p; done | \
 	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
 	      sort -u`; \
@@ -1523,17 +1570,20 @@ clean-noinstLTLIBRARIES:
 	  rm -f $${locs}; \
 	}
 
-libdynlib1.la: $(libdynlib1_la_OBJECTS) $(libdynlib1_la_DEPENDENCIES) $(EXTRA_libdynlib1_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_libdynlib1_la_rpath) $(libdynlib1_la_OBJECTS) $(libdynlib1_la_LIBADD) $(LIBS)
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlib1.la: $(libdynlib1_la_OBJECTS) $(libdynlib1_la_DEPENDENCIES) $(EXTRA_libdynlib1_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlib1_la_LINK) $(am_libdynlib1_la_rpath) $(libdynlib1_la_OBJECTS) $(libdynlib1_la_LIBADD) $(LIBS)
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlib2.la: $(libdynlib2_la_OBJECTS) $(libdynlib2_la_DEPENDENCIES) $(EXTRA_libdynlib2_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlib2_la_LINK) $(am_libdynlib2_la_rpath) $(libdynlib2_la_OBJECTS) $(libdynlib2_la_LIBADD) $(LIBS)
 
-libdynlib2.la: $(libdynlib2_la_OBJECTS) $(libdynlib2_la_DEPENDENCIES) $(EXTRA_libdynlib2_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_libdynlib2_la_rpath) $(libdynlib2_la_OBJECTS) $(libdynlib2_la_LIBADD) $(LIBS)
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlib3.la: $(libdynlib3_la_OBJECTS) $(libdynlib3_la_DEPENDENCIES) $(EXTRA_libdynlib3_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlib3_la_LINK) $(am_libdynlib3_la_rpath) $(libdynlib3_la_OBJECTS) $(libdynlib3_la_LIBADD) $(LIBS)
 
-libdynlib3.la: $(libdynlib3_la_OBJECTS) $(libdynlib3_la_DEPENDENCIES) $(EXTRA_libdynlib3_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_libdynlib3_la_rpath) $(libdynlib3_la_OBJECTS) $(libdynlib3_la_LIBADD) $(LIBS)
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlib4.la: $(libdynlib4_la_OBJECTS) $(libdynlib4_la_DEPENDENCIES) $(EXTRA_libdynlib4_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlib4_la_LINK) $(am_libdynlib4_la_rpath) $(libdynlib4_la_OBJECTS) $(libdynlib4_la_LIBADD) $(LIBS)
 
 libh5test.la: $(libh5test_la_OBJECTS) $(libh5test_la_DEPENDENCIES) $(EXTRA_libh5test_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_libh5test_la_rpath) $(libh5test_la_OBJECTS) $(libh5test_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK)  $(libh5test_la_OBJECTS) $(libh5test_la_LIBADD) $(LIBS)
 
 clean-checkPROGRAMS:
 	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
@@ -1593,6 +1643,10 @@ 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_image$(EXEEXT): $(cache_image_OBJECTS) $(cache_image_DEPENDENCIES) $(EXTRA_cache_image_DEPENDENCIES) 
+	@rm -f cache_image$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cache_image_OBJECTS) $(cache_image_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)
@@ -1661,6 +1715,10 @@ error_test$(EXEEXT): $(error_test_OBJECTS) $(error_test_DEPENDENCIES) $(EXTRA_er
 	@rm -f error_test$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(error_test_OBJECTS) $(error_test_LDADD) $(LIBS)
 
+evict_on_close$(EXEEXT): $(evict_on_close_OBJECTS) $(evict_on_close_DEPENDENCIES) $(EXTRA_evict_on_close_DEPENDENCIES) 
+	@rm -f evict_on_close$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(evict_on_close_OBJECTS) $(evict_on_close_LDADD) $(LIBS)
+
 extend$(EXEEXT): $(extend_OBJECTS) $(extend_DEPENDENCIES) $(EXTRA_extend_DEPENDENCIES) 
 	@rm -f extend$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(extend_OBJECTS) $(extend_LDADD) $(LIBS)
@@ -1733,10 +1791,6 @@ gen_filters$(EXEEXT): $(gen_filters_OBJECTS) $(gen_filters_DEPENDENCIES) $(EXTRA
 	@rm -f gen_filters$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_filters_OBJECTS) $(gen_filters_LDADD) $(LIBS)
 
-gen_idx$(EXEEXT): $(gen_idx_OBJECTS) $(gen_idx_DEPENDENCIES) $(EXTRA_gen_idx_DEPENDENCIES) 
-	@rm -f gen_idx$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(gen_idx_OBJECTS) $(gen_idx_LDADD) $(LIBS)
-
 gen_new_array$(EXEEXT): $(gen_new_array_OBJECTS) $(gen_new_array_DEPENDENCIES) $(EXTRA_gen_new_array_DEPENDENCIES) 
 	@rm -f gen_new_array$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_new_array_OBJECTS) $(gen_new_array_LDADD) $(LIBS)
@@ -1833,6 +1887,10 @@ ohdr$(EXEEXT): $(ohdr_OBJECTS) $(ohdr_DEPENDENCIES) $(EXTRA_ohdr_DEPENDENCIES)
 	@rm -f ohdr$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ohdr_OBJECTS) $(ohdr_LDADD) $(LIBS)
 
+page_buffer$(EXEEXT): $(page_buffer_OBJECTS) $(page_buffer_DEPENDENCIES) $(EXTRA_page_buffer_DEPENDENCIES) 
+	@rm -f page_buffer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(page_buffer_OBJECTS) $(page_buffer_LDADD) $(LIBS)
+
 plugin$(EXEEXT): $(plugin_OBJECTS) $(plugin_DEPENDENCIES) $(EXTRA_plugin_DEPENDENCIES) 
 	@rm -f plugin$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(plugin_OBJECTS) $(plugin_LDADD) $(LIBS)
@@ -1978,6 +2036,7 @@ distclean-compile:
 @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_image.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache_logging.Po at am__quote@
 @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@
@@ -1991,6 +2050,7 @@ 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)/dynlib4.Plo at am__quote@
 @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@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/enc_dec_plist.Po at am__quote@
@@ -1998,6 +2058,7 @@ distclean-compile:
 @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@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evict_on_close.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@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/farray.Po at am__quote@
@@ -2016,7 +2077,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_file_image.Po at am__quote@
 @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@
- at 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@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_new_fill.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_new_group.Po at am__quote@
@@ -2028,6 +2088,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_sizes_lheap.Po at am__quote@
 @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@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/genall5.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@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5test.Plo at am__quote@
@@ -2042,6 +2103,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ntypes.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/objcopy.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ohdr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/page_buffer.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/plugin.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pool.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reserved.Po at am__quote@
@@ -2107,22 +2169,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -2336,6 +2401,13 @@ cache_api.log: cache_api$(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_image.log: cache_image$(EXEEXT)
+	@p='cache_image$(EXEEXT)'; \
+	b='cache_image'; \
+	$(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'; \
@@ -2371,6 +2443,13 @@ 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)
+evict_on_close.log: evict_on_close$(EXEEXT)
+	@p='evict_on_close$(EXEEXT)'; \
+	b='evict_on_close'; \
+	$(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)
 farray.log: farray$(EXEEXT)
 	@p='farray$(EXEEXT)'; \
 	b='farray'; \
@@ -2441,6 +2520,13 @@ dt_arith.log: dt_arith$(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)
+page_buffer.log: page_buffer$(EXEEXT)
+	@p='page_buffer$(EXEEXT)'; \
+	b='page_buffer'; \
+	$(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)
 dtypes.log: dtypes$(EXEEXT)
 	@p='dtypes$(EXEEXT)'; \
 	b='dtypes'; \
@@ -2758,7 +2844,7 @@ check-am: all-am
 check: check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local
 installdirs:
-	for dir in "$(DESTDIR)$(libdir)"; do \
+	for dir in "$(DESTDIR)$(dyndir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
@@ -2795,10 +2881,9 @@ 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."
- at HAVE_SHARED_CONDITIONAL_FALSE@install-exec-hook:
 clean: clean-am
 
-clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+clean-am: clean-checkPROGRAMS clean-dynLTLIBRARIES clean-generic \
 	clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
 	mostlyclean-am
 
@@ -2820,15 +2905,14 @@ info: info-am
 
 info-am:
 
-install-data-am:
+install-data-am: install-dynLTLIBRARIES
 
 install-dvi: install-dvi-am
 
 install-dvi-am:
 
-install-exec-am: install-libLTLIBRARIES
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+install-exec-am:
+
 install-html: install-html-am
 
 install-html-am:
@@ -2867,26 +2951,26 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-libLTLIBRARIES
+uninstall-am: uninstall-dynLTLIBRARIES
 
-.MAKE: check-am install-am install-exec-am install-strip
+.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-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
+	check-am clean clean-checkPROGRAMS clean-dynLTLIBRARIES \
+	clean-generic clean-libtool clean-noinstLTLIBRARIES \
 	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-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-exec-hook \
-	install-html install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-dvi-am install-dynLTLIBRARIES 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-libLTLIBRARIES
+	uninstall-dynLTLIBRARIES
 
 .PRECIOUS: Makefile
 
@@ -2902,15 +2986,20 @@ uninstall-am: uninstall-libLTLIBRARIES
 help:
 	@$(top_srcdir)/bin/makehelp
 
- at HAVE_SHARED_CONDITIONAL_TRUE@  # The libh5test library provides common support code for the tests.
-
- at HAVE_SHARED_CONDITIONAL_TRUE@  # The libdynlib1 and libdynlib2 library for testing plugin module plugin.c.
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # The libdynlib1, libdynlib2, libdynlib3, and libdynlib4 library for testing plugin module plugin.c.
 @HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
 
- at HAVE_SHARED_CONDITIONAL_TRUE@install-exec-hook:
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(RM) $(DESTDIR)$(libdir)/*dynlib*
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib1.la: $(libdynlib1_la_OBJECTS) $(libdynlib1_la_DEPENDENCIES) $(EXTRA_libdynlib1_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlib1_la_LINK) $(am_libdynlib1_la_rpath) $(libdynlib1_la_OBJECTS) $(libdynlib1_la_LIBADD)
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib2.la: $(libdynlib2_la_OBJECTS) $(libdynlib2_la_DEPENDENCIES) $(EXTRA_libdynlib2_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlib2_la_LINK) $(am_libdynlib2_la_rpath) $(libdynlib2_la_OBJECTS) $(libdynlib2_la_LIBADD)
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib3.la: $(libdynlib3_la_OBJECTS) $(libdynlib3_la_DEPENDENCIES) $(EXTRA_libdynlib3_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlib3_la_LINK) $(am_libdynlib3_la_rpath) $(libdynlib3_la_OBJECTS) $(libdynlib3_la_LIBADD)
 
- at HAVE_SHARED_CONDITIONAL_FALSE@  # The libh5test library provides common support code for the tests.
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlib4.la: $(libdynlib4_la_OBJECTS) $(libdynlib4_la_DEPENDENCIES) $(EXTRA_libdynlib4_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlib4_la_LINK) $(am_libdynlib4_la_rpath) $(libdynlib4_la_OBJECTS) $(libdynlib4_la_LIBADD) 
 
 # Additional target for running timing test
 timings _timings: testmeta
@@ -2926,6 +3015,7 @@ flush2.chkexe_: flush1.chkexe_
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -2933,7 +3023,7 @@ 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)
+lib dyn 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                           \
diff --git a/test/accum.c b/test/accum.c
index 1fcd051..d76c866 100644
--- a/test/accum.c
+++ b/test/accum.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Mike McGreevy
@@ -45,18 +43,18 @@
 H5F_t * f = NULL;
 
 /* Function Prototypes */
-unsigned test_write_read(const H5F_io_info_t *fio_info);
-unsigned test_write_read_nonacc_front(const H5F_io_info_t *fio_info);
-unsigned test_write_read_nonacc_end(const H5F_io_info_t *fio_info);
-unsigned test_accum_overlap(const H5F_io_info_t *fio_info);
-unsigned test_accum_overlap_clean(const H5F_io_info_t *fio_info);
-unsigned test_accum_overlap_size(const H5F_io_info_t *fio_info);
-unsigned test_accum_non_overlap_size(const H5F_io_info_t *fio_info);
-unsigned test_accum_adjust(const H5F_io_info_t *fio_info);
-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_write_read(const H5F_io_info2_t *fio_info);
+unsigned test_write_read_nonacc_front(const H5F_io_info2_t *fio_info);
+unsigned test_write_read_nonacc_end(const H5F_io_info2_t *fio_info);
+unsigned test_accum_overlap(const H5F_io_info2_t *fio_info);
+unsigned test_accum_overlap_clean(const H5F_io_info2_t *fio_info);
+unsigned test_accum_overlap_size(const H5F_io_info2_t *fio_info);
+unsigned test_accum_non_overlap_size(const H5F_io_info2_t *fio_info);
+unsigned test_accum_adjust(const H5F_io_info2_t *fio_info);
+unsigned test_read_after(const H5F_io_info2_t *fio_info);
+unsigned test_free(const H5F_io_info2_t *fio_info);
+unsigned test_big(const H5F_io_info2_t *fio_info);
+unsigned test_random_write(const H5F_io_info2_t *fio_info);
 unsigned test_swmr_write_big(hbool_t newest_format);
 
 /* Helper Function Prototypes */
@@ -90,7 +88,7 @@ void accum_printf(void);
 int
 main(void)
 {
-    H5F_io_info_t fio_info;             /* I/O info for operation */
+    H5F_io_info2_t fio_info;             /* I/O info for operation */
     unsigned nerrors = 0;        /* track errors */
     hid_t fid = -1;
 
@@ -109,7 +107,8 @@ main(void)
 
     /* Set up I/O info for operation */
     fio_info.f = f;
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id))) FAIL_STACK_ERROR
+    if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id))) FAIL_STACK_ERROR
+    if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id))) FAIL_STACK_ERROR
 
     /* Reset metadata accumulator for the file */
     if(accum_reset(&fio_info) < 0) FAIL_STACK_ERROR
@@ -166,7 +165,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_write_read(const H5F_io_info_t *fio_info)
+test_write_read(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int *write_buf, *read_buf;
@@ -222,7 +221,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_write_read_nonacc_front(const H5F_io_info_t *fio_info)
+test_write_read_nonacc_front(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int *write_buf, *read_buf;
@@ -281,7 +280,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_write_read_nonacc_end(const H5F_io_info_t *fio_info)
+test_write_read_nonacc_end(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int *write_buf, *read_buf;
@@ -340,7 +339,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_free(const H5F_io_info_t *fio_info)
+test_free(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int32_t *wbuf = NULL;
@@ -527,7 +526,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_accum_overlap(const H5F_io_info_t *fio_info)
+test_accum_overlap(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int32_t *wbuf, *rbuf;
@@ -699,7 +698,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_accum_overlap_clean(const H5F_io_info_t *fio_info)
+test_accum_overlap_clean(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int32_t *wbuf, *rbuf;
@@ -878,7 +877,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_accum_non_overlap_size(const H5F_io_info_t *fio_info)
+test_accum_non_overlap_size(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int32_t *wbuf, *rbuf;
@@ -945,7 +944,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_accum_overlap_size(const H5F_io_info_t *fio_info)
+test_accum_overlap_size(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int32_t *wbuf, *rbuf;
@@ -1023,7 +1022,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned
-test_accum_adjust(const H5F_io_info_t *fio_info)
+test_accum_adjust(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int s = 1048576;    /* size of buffer */
@@ -1279,7 +1278,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned 
-test_read_after(const H5F_io_info_t *fio_info)
+test_read_after(const H5F_io_info2_t *fio_info)
 {
     int i = 0;
     int s = 128;    /* size of buffer */
@@ -1358,7 +1357,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned 
-test_big(const H5F_io_info_t *fio_info)
+test_big(const H5F_io_info2_t *fio_info)
 {
     uint8_t *wbuf, *wbuf2, *rbuf, *zbuf;        /* Buffers for reading & writing, etc */
     unsigned u;                         /* Local index variable */
@@ -1666,7 +1665,7 @@ error:
  *-------------------------------------------------------------------------
  */
 unsigned 
-test_random_write(const H5F_io_info_t *fio_info)
+test_random_write(const H5F_io_info2_t *fio_info)
 {
     uint8_t *wbuf, *rbuf;       /* Buffers for reading & writing */
     unsigned seed = 0;          /* Random # seed */
@@ -1820,7 +1819,7 @@ test_swmr_write_big(hbool_t newest_format)
     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 */
+    H5F_io_info2_t fio_info;     /* I/O info for operation */
     char *new_argv[] = {NULL};
     char *driver = NULL;        /* VFD string (from env variable) */
 
@@ -1877,7 +1876,9 @@ test_swmr_write_big(hbool_t newest_format)
 
     /* Set up I/O info for operation */
     fio_info.f = rf;
-    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+    if(NULL == (fio_info.meta_dxpl = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id)))
+        FAIL_STACK_ERROR
+    if(NULL == (fio_info.raw_dxpl = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id)))
         FAIL_STACK_ERROR
 
     /* We'll be writing lots of garbage data, so extend the
diff --git a/test/accum_swmr_reader.c b/test/accum_swmr_reader.c
index d98fe70..c1a238d 100644
--- a/test/accum_swmr_reader.c
+++ b/test/accum_swmr_reader.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #include "h5test.h"
 
diff --git a/test/aggr.h5 b/test/aggr.h5
new file mode 100644
index 0000000..b24365d
Binary files /dev/null and b/test/aggr.h5 differ
diff --git a/test/app_ref.c b/test/app_ref.c
index 4b72bcb..3ef3fef 100644
--- a/test/app_ref.c
+++ b/test/app_ref.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/atomic_reader.c b/test/atomic_reader.c
index a0fb1e0..3e3a20a 100644
--- a/test/atomic_reader.c
+++ b/test/atomic_reader.c
@@ -4,16 +4,14 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*-------------------------------------------------------------------------
  *
- * Created:    	atomic_reader.c
+ * Created:     atomic_reader.c
  *
  * Purpose:     This is the "reader" part of the standalone test to check
  *              atomic read-write operation on a system.
@@ -85,23 +83,23 @@ usage(void)
  * 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
+ *              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
+ *              fd -- the file descriptor
+ *              k -- the number of integers to read
  *
  * Return:      
- *	positive on success
- *	negative on failure
+ *              positive on success
+ *              negative on failure
  *
  *-------------------------------------------------------------------------
  */
@@ -114,55 +112,57 @@ verify(int fd, unsigned int k)
 
     /* Allocate buffer for data read */
     if((buf = (unsigned int *)malloc(k * sizeof(unsigned int))) == NULL) {
-	printf("READER: error from malloc\n");
-	goto error;
-    }
+        printf("READER: error from malloc\n");
+        goto error;
+    } /* end if */
 
     /* Position the file at the beginning */
     if(lseek(fd, (off_t)0, SEEK_SET) < 0) {
-	printf("READER: error from lseek\n");
-	goto error;
-    }
+        printf("READER: error from lseek\n");
+        goto error;
+    } /* end if */
 
     /* Read the whole file */
     if((bytes_read = read(fd, buf, (k * sizeof(unsigned int)))) < 0) {
-	printf("READER: error from read\n");
-	goto error;
-    }
+        printf("READER: error from read\n");
+        goto error;
+    } /* end if */
 
     /* 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;
-    }
+        printf("READER: error from bytes read=%lu\n", (unsigned long)bytes_read);
+        goto error;
+    } /* end if */
 
     /* Verify data read */
     for(i=0; i < k; i++)  {
-	if(buf[i] != i)
-	    break;
-    }
+        if(buf[i] != i)
+            break;
+    } /* end for */
 
     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;
-	}
-    }
+        /* 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;
+        } /* end if */
+    } /* end if */
 
     /* Free the buffer */
-    if(buf) free(buf);
-    return(0);
+    if(buf)
+        free(buf);
+    return 0;
 
 error:
     /* Free the buffer */
-    if(buf) free(buf);
-    return(-1);
-} /* verify() */
+    if(buf)
+        free(buf);
+    return -1;
+} /* end verify() */
 
 
 

@@ -172,11 +172,11 @@ error:
  * 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
+ *              info -- the array storing the statistics for re-reads
+ *              lastr -- the last read completed
+ *              iteration -- the current iteration
  *
- * Return:     	void
+ * Return:      void
  *
  *-------------------------------------------------------------------------
  */
@@ -188,7 +188,7 @@ print_info(int *info, unsigned int lastr, unsigned iteration)
     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("# of %u re-tries = %u\n", j, info[j]);
 
     printf("--------end statistics for %u reads (iteration %u)--------\n", lastr, iteration);
 } /* print_info() */
@@ -198,12 +198,12 @@ print_info(int *info, unsigned int lastr, unsigned iteration)
  * 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
+ *              (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.
@@ -214,27 +214,27 @@ print_info(int *info, unsigned int lastr, unsigned iteration)
  *      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
+ * Return:      Success:    EXIT_SUCCESS
+ *              Failure:    EXIT_FAILURE
  *
  *-------------------------------------------------------------------------
  */
 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 */
+    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);
-    }
+        exit(EXIT_FAILURE);
+    } /* end if */
 
     /* Parse command line options */
     while((opt = getopt(argc, argv, "n:i:")) != -1) {
@@ -242,110 +242,110 @@ main(int argc, char *argv[])
             case 'n':
                 if((temp = atoi(optarg)) < 0) {
                     usage();
-		    exit(-1);
-		}
+                    exit(EXIT_FAILURE);
+                } /* end if */
                 num = (unsigned int)temp;
                 break;
             case 'i':
                 if((temp = atoi(optarg)) < 0) {
                     usage();
-		    exit(-1);
-		}
+                    exit(EXIT_FAILURE);
+                } /* end if */
                 iterations = (unsigned int)temp;
                 break;
             default:
                 printf("Invalid option encountered\n");
                 break;
-        }
-    }
+        } /* end switch */
+    } /* end while */
 
     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);
+    for(i = 1; i <= iterations; i++) {
+        unsigned opens = OPEN_TRIES;
+
+        printf("READER: *****start iteration %u*****\n", i);
+
+        /* Ensure open and file size are done properly */
+        while(opens--) {
+            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;
+                } /* end if */
+
+                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 EXIT_FAILURE;
+                } /* end if */
+                fd = -1;
+            } /* end else */
+
+        } /* end while */
+
+        if(fd < 0) {
+            printf("READER: *****open failure/incorrect file size for all %u tries, continue next iteration*****\n\n", OPEN_TRIES);
+            continue;
+        } /* end if */
+
+        memset(info, 0, sizeof(info));
+
+        /* Read and verify data */
+        for(j = 1; j <= num; j++) {
+
+            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++) {
+                    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 else */
+                } /* 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;
+                } /* end if */
+            } else {
+                ++info[0];
+                printf("READER: success from read %u\n", j);
+            } /* end else */
+
+        } /* 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 EXIT_FAILURE;
+        } /* end if */
+
+        printf("READER: *****end iteration %u*****\n\n", i);
 
     } /* end for */
 
-    return(0);
+    return EXIT_SUCCESS;
 }
 
 #else /* WIN32 / MINGW32 */
diff --git a/test/atomic_writer.c b/test/atomic_writer.c
index 44cdfb0..218d4da 100644
--- a/test/atomic_writer.c
+++ b/test/atomic_writer.c
@@ -4,24 +4,22 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
  *
- * Created:    	atomic_writer.c
+ * 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
  *
- * 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
- *		
  *-------------------------------------------------------------------------
  */
 
@@ -61,9 +59,9 @@ static void usage(void);
  *
  * Purpose:     To print information about the command line options
  *
- * Parameters: 	None
+ * Parameters:  None
  *
- * Return:   	void
+ * Return:      void
  *
  *-------------------------------------------------------------------------
  */
@@ -83,21 +81,21 @@ usage(void)
 /*-------------------------------------------------------------------------
  * 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)
+ * 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)
+ *              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.
@@ -107,129 +105,130 @@ usage(void)
  *      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
+ *
+ * Return:      Success:    EXIT_SUCCESS
+ *              Failure:    EXIT_FAILURE
  *
  *-------------------------------------------------------------------------
  */
 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 */
+    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);
-    }
+        exit(EXIT_FAILURE);
+    } /* end if */
 
     /* 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;
-	}
-    }
+        switch(opt) {
+            case 'n':
+                if((temp = atoi(optarg)) < 0) {
+                    usage();
+                    exit(EXIT_FAILURE);
+                } /* end if */
+                num = (unsigned int)temp;
+                break;
+            case 'i':
+                if((temp = atoi(optarg)) < 0) {
+                    usage();
+                    exit(EXIT_FAILURE);
+                } /* end if */
+                iterations = (unsigned int)temp;
+                break;
+            default:
+                printf("Invalid option encountered\n");
+                break;
+        } /* end switch */
+    } /* end while */
 
     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;
-	}
+        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;
+        } /* end else */
     } else
-	printf("WRITER: %s is removed\n", FILENAME);
+        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;
-    }
+        printf("WRITER: error from open\n");
+        goto error;
+    } /* end if */
 
     /* 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("WRITER: error from malloc\n");
+        if(fd >= 0 && close(fd) < 0)
+            printf("WRITER: error from close\n");
+        goto error;
+    } /* end if */
 
     printf("\n");
 
-    for(i = 1; i <= iterations; i++) { /* iteration loop */
-	printf("WRITER: *****start iteration %u*****\n", i);
+    for(i = 1; i <= iterations; i++) {
+        printf("WRITER: *****start iteration %u*****\n", i);
 
-	/* Write the series of integers to the file */
-	for(n = 0; n < num; n++)  { /* write loop */
+        /* Write the series of integers to the file */
+        for(n = 0; n < num; n++)  {
 
-	    /* Set up data to be written */
-	    for(u=0; u < num; u++)
-		buf[u] = n;
+            /* 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;
-	    }
+            /* 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;
+            } /* end if */
     
-	    /* Write the data */
-	    if((bytes_wrote = write(fd, buf, ((num-n) * sizeof(unsigned int)))) < 0) {
-		printf("WRITER: error from write\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;
+            } /* end if */
 
-	    /* 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 */
+            /* 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 if */
+        } /* end for */
 
-	printf("WRITER: *****end iteration %u*****\n\n", i);
+        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;
-    }
+        printf("WRITER: error from close\n");
+        goto error;
+    } /* end if */
 
     /* Free the buffer */
-    if(buf) free(buf);
+    if(buf)
+        free(buf);
 
-    return(0);
+    return EXIT_SUCCESS;
 
 error:
-    return(-1);
-} /* main() */
+    return EXIT_FAILURE;
+} /* end main() */
 
 #else /* WIN32 / MINGW32 */
 
diff --git a/test/bad_compound.h5 b/test/bad_compound.h5
index 1c96318..1834a2e 100644
Binary files a/test/bad_compound.h5 and b/test/bad_compound.h5 differ
diff --git a/test/big.c b/test/big.c
index 7a3fd21..3685821 100644
--- a/test/big.c
+++ b/test/big.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -129,8 +127,8 @@ randll(hsize_t limit, int current_index)
     /* does not overlap with any previous writes */
     while(overlap != 0 && tries < MAX_TRIES)
     {
-        acc = HDrandom();
-        acc *= HDrandom();
+        acc = (hsize_t)HDrandom();
+        acc *= (hsize_t)HDrandom();
         acc = acc % limit;
         overlap = 0;
 
@@ -508,7 +506,7 @@ reader(char *filename, hid_t fapl)
         if('#' != ln[0])
             break;
         i = (int)HDstrtol(ln + 1, &s, 10);
-        hs_offset[0] = HDstrtoll(s, NULL, 0);
+        hs_offset[0] = HDstrtoull(s, NULL, 0);
         HDfprintf(stdout, "#%03d 0x%016Hx%47s", i, hs_offset[0], "");
         HDfflush(stdout);
 
@@ -801,7 +799,7 @@ main (int ac, char **av)
     /* seed = (unsigned long)1155438845; */
     HDfprintf(stderr, "Random # seed was: %lu\n", seed);
 #endif /* QAK */
-    HDsrandom(seed);
+    HDsrandom((unsigned)seed);
 
     /* run VFD-specific test */
     if(H5FD_SEC2 == driver) {
diff --git a/test/bittests.c b/test/bittests.c
index c4dfe4c..ccd725c 100644
--- a/test/bittests.c
+++ b/test/bittests.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -88,7 +86,7 @@ test_find (void)
     /* Try all combinations of one byte */
     for(i = 0; i < 8 * (int)sizeof(v1); i++) {
 	HDmemset(v1, 0, sizeof v1);
-	v1[i / 8] = 1 << (i % 8);
+	v1[i / 8] = (uint8_t)(1 << (i % 8));
 	n = H5T__bit_find(v1, (size_t)0, 8 * sizeof(v1), H5T_BIT_LSB, TRUE);
 	if((ssize_t)i != n) {
 	    H5_FAILED();
@@ -120,8 +118,8 @@ test_find (void)
 
     /* Try all combinations of one byte */
     for (i=0; i<8*(int)sizeof(v1); i++) {
-	memset (v1, 0xff, sizeof v1);
-	v1[i/8] &= ~(1<<(i%8));
+	HDmemset(v1, 0xff, sizeof v1);
+	v1[i / 8] &= (uint8_t)~(1 << (i % 8));
 	n = H5T__bit_find (v1, (size_t)0, 8*sizeof(v1), H5T_BIT_LSB, FALSE);
 	if ((ssize_t)i!=n) {
 	    H5_FAILED();
@@ -175,12 +173,12 @@ test_copy (void)
     TESTING("bit copy operations");
 
     for (i=0; i<NTESTS; i++) {
-	s_offset = HDrand() % (8*sizeof v1);
-	d_offset = HDrand() % (8*sizeof v2);
+	s_offset = (size_t)HDrand() % (8 * sizeof v1);
+	d_offset = (size_t)HDrand() % (8 * sizeof v2);
 	size = (unsigned)HDrand() % MIN (8*sizeof(v1), 8*sizeof(v2));
 	size = MIN3 (size, 8*sizeof(v1)-s_offset, 8*sizeof(v2)-d_offset);
-	memset (v1, 0xff, sizeof v1);
-	memset (v2, 0x00, sizeof v2);
+	HDmemset(v1, 0xff, sizeof v1);
+	HDmemset(v2, 0x00, sizeof v2);
 
 	/* Copy some bits to v2 and make sure something was copied */
 	H5T__bit_copy (v2, d_offset, v1, s_offset, size);
@@ -297,21 +295,21 @@ test_shift (void)
     TESTING("bit shift operations");
 
     for (i=0; i<NTESTS; i++) {
-	offset = HDrand() % (8*sizeof vector);
-	size = (unsigned)HDrand() % (8*sizeof(vector)-offset);
+	offset = (size_t)HDrand() % (8 * sizeof vector);
+	size = (size_t)HDrand() % (8 * sizeof(vector) - offset);
         /* Don't want size to be 0 */
         if(size == 0) continue;
-        shift_dist = HDrand() % size;
+        shift_dist = (ssize_t)((size_t)HDrand() % size);
 
 	/*-------- LEFT-shift some bits and make sure something was shifted --------*/
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
         H5T__bit_set (vector, offset, size, 1);
 
         H5T__bit_shift (vector, shift_dist, offset, size);
 
 	/* Look for the ones */
 	n = H5T__bit_find (vector, (size_t)0, 8*sizeof(vector), H5T_BIT_LSB, 1);
-	if ((size_t)n!=offset+shift_dist) {
+	if(n != (ssize_t)offset + shift_dist) {
 	    H5_FAILED();
 	    printf ("    Unable to find first bit in destination "
 		    "(n=%d)\n", (int)n);
@@ -331,7 +329,7 @@ test_shift (void)
 	}
 
 	/*-------- RIGHT-shift some bits and make sure something was shifted --------*/
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
         H5T__bit_set (vector, offset, size, 1);
 
         H5T__bit_shift (vector, -shift_dist, offset, size);
@@ -350,7 +348,7 @@ test_shift (void)
 	 * that reverse searches work as expected.
 	 */
 	n = H5T__bit_find (vector, (size_t)0, 8*sizeof(vector), H5T_BIT_MSB, 1);
-	if (n!=(ssize_t)(offset+size-shift_dist-1)) {
+	if(n != (ssize_t)(offset + size) - shift_dist - 1) {
 	    H5_FAILED();
 	    printf ("    Unable to find last bit in destination "
 		    "(reverse, n=%d)\n", (int)n);
@@ -362,11 +360,11 @@ test_shift (void)
 
         /* Randomly decide shift direction */
         if(size % 2 == 0)
-            shift_dist = size;
+            shift_dist = (ssize_t)size;
         else
             shift_dist = -((ssize_t)size);
 
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
         H5T__bit_set (vector, offset, size, 1);
 
         H5T__bit_shift (vector, shift_dist, offset, size);
@@ -430,12 +428,12 @@ test_increment (void)
     TESTING("bit increment operations");
 
     for (i=0; i<NTESTS; i++) {
-	offset = HDrand() % (8*sizeof vector);
-	size = (unsigned)HDrand() % (8*sizeof(vector)-offset);
+	offset = (size_t)HDrand() % (8 * sizeof vector);
+	size = (size_t)HDrand() % (8 * sizeof(vector) - offset);
         /* Don't want size to be 0 */
         if(size == 0) continue;
 
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
         if(size>1)  /* if size=6, make a sequence like 011111 */
             H5T__bit_set (vector, offset, size-1, 1);
         else  /* if size=1, just set this one bit to 1 */
@@ -517,13 +515,13 @@ test_decrement (void)
     TESTING("bit decrement operations");
 
     for (i=0; i<NTESTS; i++) {
-	offset = HDrand() % (8*sizeof vector);
-	size = (unsigned)HDrand() % (8*sizeof(vector)-offset);
+	offset = (size_t)HDrand() % (8 * sizeof vector);
+	size = (size_t)HDrand() % (8 * sizeof(vector) - offset);
         /* Don't want size to be 0 */
         if(size == 0) continue;
 
         /* All-zero sequence will become 111111(size=6) after decrement */
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
 
 	/* decrement the sequence by one */
         H5T__bit_dec (vector, offset, size);
@@ -589,13 +587,13 @@ test_negate (void)
     TESTING("bit negate operations");
 
     for (i=0; i<NTESTS; i++) {
-	offset = HDrand() % (8*sizeof vector);
-	size = (unsigned)HDrand() % (8*sizeof(vector)-offset);
+	offset = (size_t)HDrand() % (8 * sizeof vector);
+	size = (size_t)HDrand() % (8 * sizeof(vector) - offset);
         /* Don't want size to be 0 */
         if(size == 0) continue;
 
         /* All-zero sequence will become 111111(size=6) after negating */
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
 
 	/* negate the sequence */
         H5T__bit_neg (vector, offset, size);
@@ -622,7 +620,7 @@ test_negate (void)
 	}
 
         /* All-one sequence will become 000000(size=6) after negating */
-	memset (vector, 0x00, sizeof vector);
+	HDmemset(vector, 0x00, sizeof vector);
         H5T__bit_set (vector, offset, size, 1);
 
 	/* negate the sequence */
@@ -689,10 +687,10 @@ test_set (void)
     TESTING("bit set operations");
 
     for (i=0; i<NTESTS; i++) {
-	d_offset = HDrand() % (8*sizeof v2);
-	size = (unsigned)HDrand() % (8*sizeof(v2));
+	d_offset = (size_t)HDrand() % (8 * sizeof v2);
+	size = (size_t)HDrand() % (8 * sizeof(v2));
 	size = MIN (size, 8*sizeof(v2)-d_offset);
-	memset (v2, 0x00, sizeof v2);
+	HDmemset(v2, 0x00, sizeof v2);
 
 	/* Set some bits in v2 */
 	H5T__bit_set (v2, d_offset, size, TRUE);
@@ -806,10 +804,10 @@ test_clear (void)
     TESTING("bit clear operations");
 
     for (i=0; i<NTESTS; i++) {
-	d_offset = HDrand() % (8*sizeof v2);
-	size = (unsigned)HDrand() % (8*sizeof(v2));
+	d_offset = (size_t)HDrand() % (8 * sizeof v2);
+	size = (size_t)HDrand() % (8 * sizeof(v2));
 	size = MIN (size, 8*sizeof(v2)-d_offset);
-	memset (v2, 0xff, sizeof v2);
+	HDmemset(v2, 0xff, sizeof v2);
 
 	/* Clear some bits in v2 */
 	H5T__bit_set (v2, d_offset, size, FALSE);
@@ -932,7 +930,7 @@ main(void)
     if(nerrors) {
         printf("***** %u FAILURE%s! *****\n",
                nerrors, 1 == nerrors ? "" : "S");
-        exit(1);
+        exit(EXIT_FAILURE);
     }
     printf("All bit tests passed.\n");
 
diff --git a/test/btree2.c b/test/btree2.c
index ea16583..ec3e20e 100644
--- a/test/btree2.c
+++ b/test/btree2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
diff --git a/test/cache.c b/test/cache.c
index 119f5bb..0896814 100644
--- a/test/cache.c
+++ b/test/cache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  John Mainzer
@@ -19,9 +17,6 @@
  *		This file contains tests for the cache implemented in
  *		H5C.c
  */
-#include "h5test.h"
-#include "H5Iprivate.h"
-#include "H5ACprivate.h"
 #include "cache_common.h"
 
 

@@ -93,37 +88,37 @@ struct move_entry_test_spec
 {
     int			entry_type;
     int			entry_index;
-    hbool_t		is_dirty;
     hbool_t		is_pinned;
+    hbool_t             is_protected;
 };
 
 

 /* private function declarations: */
 
-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 unsigned smoke_check_1(int express_test, unsigned paged);
+static unsigned smoke_check_2(int express_test, unsigned paged);
+static unsigned smoke_check_3(int express_test, unsigned paged);
+static unsigned smoke_check_4(int express_test, unsigned paged);
+static unsigned smoke_check_5(int express_test, unsigned paged);
+static unsigned smoke_check_6(int express_test, unsigned paged);
+static unsigned smoke_check_7(int express_test, unsigned paged);
+static unsigned smoke_check_8(int express_test, unsigned paged);
+static unsigned smoke_check_9(int express_test, unsigned paged);
+static unsigned smoke_check_10(int express_test, unsigned paged);
+static unsigned write_permitted_check(int express_test, unsigned paged);
+static unsigned check_insert_entry(unsigned paged);
+static unsigned check_flush_cache(unsigned paged);
 static void check_flush_cache__empty_cache(H5F_t * file_ptr);
 static void check_flush_cache__multi_entry(H5F_t * file_ptr);
 static void check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                                           int test_num,
                                           unsigned int flush_flags,
-                                          int spec_size,
+                                          unsigned int spec_size,
                                           struct flush_cache_test_spec spec[]);
 static void check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                                         int test_num,
                                         unsigned int flush_flags,
-                                        int spec_size,
+                                        unsigned int spec_size,
                                         struct pe_flush_cache_test_spec spec[]);
 static void check_flush_cache__single_entry(H5F_t * file_ptr);
 static void check_flush_cache__single_entry_test(H5F_t * file_ptr,
@@ -154,56 +149,57 @@ static void check_flush_cache__flush_op_test(H5F_t * file_ptr,
                                         int test_num,
                                         unsigned int flush_flags,
                                         int spec_size,
-                                        struct fo_flush_cache_test_spec spec[],
-				        int init_expected_index_len,
+                                        const struct fo_flush_cache_test_spec spec[],
+				        unsigned init_expected_index_len,
 				        size_t init_expected_index_size,
-				        int expected_index_len,
+				        unsigned expected_index_len,
 				        size_t expected_index_size,
 					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_get_entry_status(void);
-static unsigned check_expunge_entry(void);
-static unsigned check_multiple_read_protect(void);
-static unsigned check_move_entry(void);
-static void check_move_entry__run_test(H5F_t * file_ptr, int test_num,
-                                      struct move_entry_test_spec * spec_ptr);
-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);
-static unsigned check_move_err(void);
-static unsigned check_double_pin_err(void);
-static unsigned check_double_unpin_err(void);
-static unsigned check_pin_entry_errs(void);
-static unsigned check_double_protect_err(void);
-static unsigned check_double_unprotect_err(void);
-static unsigned check_mark_entry_dirty_errs(void);
-static unsigned check_expunge_entry_errs(void);
-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(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 unsigned check_get_entry_status(unsigned paged);
+static unsigned check_expunge_entry(unsigned paged);
+static unsigned check_multiple_read_protect(unsigned paged);
+static unsigned check_move_entry(unsigned paged);
+static void check_move_entry__run_test(H5F_t * file_ptr, unsigned test_num,
+    struct move_entry_test_spec * spec_ptr);
+static unsigned check_pin_protected_entry(unsigned paged);
+static unsigned check_resize_entry(unsigned paged);
+static unsigned check_evictions_enabled(unsigned paged);
+static unsigned check_flush_protected_err(unsigned paged);
+static unsigned check_destroy_pinned_err(unsigned paged);
+static unsigned check_destroy_protected_err(unsigned paged);
+static unsigned check_duplicate_insert_err(unsigned paged);
+static unsigned check_double_pin_err(unsigned paged);
+static unsigned check_double_unpin_err(unsigned paged);
+static unsigned check_pin_entry_errs(unsigned paged);
+static unsigned check_double_protect_err(unsigned paged);
+static unsigned check_double_unprotect_err(unsigned paged);
+static unsigned check_mark_entry_dirty_errs(unsigned paged);
+static unsigned check_expunge_entry_errs(unsigned paged);
+static unsigned check_move_entry_errs(unsigned paged);
+static unsigned check_resize_entry_errs(unsigned paged);
+static unsigned check_unprotect_ro_dirty_err(unsigned paged);
+static unsigned check_protect_ro_rw_err(unsigned paged);
+static unsigned check_protect_retries(unsigned paged);
+static unsigned check_check_evictions_enabled_err(unsigned paged);
+static unsigned check_auto_cache_resize(hbool_t cork_ageout, unsigned paged);
+static unsigned check_auto_cache_resize_disable(unsigned paged);
+static unsigned check_auto_cache_resize_epoch_markers(unsigned paged);
+static unsigned check_auto_cache_resize_input_errs(unsigned paged);
+static unsigned check_auto_cache_resize_aux_fcns(unsigned paged);
+static unsigned check_metadata_blizzard_absence(hbool_t fill_via_insertion, unsigned paged);
+static unsigned check_flush_deps(unsigned paged);
+static unsigned check_flush_deps_err(unsigned paged);
+static unsigned check_flush_deps_order(unsigned paged);
+static unsigned check_notify_cb(unsigned paged);
+static unsigned check_metadata_cork(hbool_t fill_via_insertion, unsigned paged);
+static unsigned check_entry_deletions_during_scans(unsigned paged);
 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);
+static unsigned check_stats(unsigned paged);
 #if H5C_COLLECT_CACHE_STATS
 static void check_stats__smoke_check_1(H5F_t * file_ptr);
 #endif /* H5C_COLLECT_CACHE_STATS */
@@ -231,7 +227,7 @@ static void check_stats__smoke_check_1(H5F_t * file_ptr);
  */
 
 static unsigned
-smoke_check_1(int express_test)
+smoke_check_1(int express_test, unsigned paged)
 {
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -242,9 +238,12 @@ smoke_check_1(int express_test)
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
-    TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache");
+    if(paged)
+        TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache, paged aggregation")
+    else
+        TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -267,20 +266,19 @@ smoke_check_1(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
-                            (size_t)(2 * 1024 * 1024));
+    file_ptr = setup_cache((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024), paged);
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -299,7 +297,7 @@ smoke_check_1(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -318,7 +316,7 @@ smoke_check_1(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -337,7 +335,7 @@ smoke_check_1(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -348,7 +346,7 @@ smoke_check_1(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -362,7 +360,7 @@ smoke_check_1(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -373,7 +371,7 @@ smoke_check_1(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -387,22 +385,22 @@ smoke_check_1(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -430,7 +428,7 @@ smoke_check_1(int express_test)
  */
 
 static unsigned
-smoke_check_2(int express_test)
+smoke_check_2(int express_test, unsigned paged)
 {
     hbool_t show_progress = FALSE;
     int dirty_unprotects = TRUE;
@@ -441,9 +439,12 @@ smoke_check_2(int express_test)
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
-    TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache");
+    if(paged)
+        TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache, paged aggregation")
+    else
+        TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -466,20 +467,19 @@ smoke_check_2(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
-                            (size_t)(2 * 1024 * 1024));
+    file_ptr = setup_cache((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024), paged);
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -498,7 +498,7 @@ smoke_check_2(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -517,7 +517,7 @@ smoke_check_2(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -536,7 +536,7 @@ smoke_check_2(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -547,7 +547,7 @@ smoke_check_2(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -561,7 +561,7 @@ smoke_check_2(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -572,7 +572,7 @@ smoke_check_2(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -586,22 +586,22 @@ smoke_check_2(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -628,7 +628,7 @@ smoke_check_2(int express_test)
  */
 
 static unsigned
-smoke_check_3(int express_test)
+smoke_check_3(int express_test, unsigned paged)
 {
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -639,9 +639,12 @@ smoke_check_3(int express_test)
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
-    TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache");
+    if(paged)
+        TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache, paged aggregation")
+    else
+        TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -664,20 +667,19 @@ smoke_check_3(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024),
-                            (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -696,7 +698,7 @@ smoke_check_3(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -715,7 +717,7 @@ smoke_check_3(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -734,7 +736,7 @@ smoke_check_3(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -745,7 +747,7 @@ smoke_check_3(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -759,7 +761,7 @@ smoke_check_3(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -770,7 +772,7 @@ smoke_check_3(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -784,22 +786,22 @@ smoke_check_3(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -827,7 +829,7 @@ smoke_check_3(int express_test)
  */
 
 static unsigned
-smoke_check_4(int express_test)
+smoke_check_4(int express_test, unsigned paged)
 {
     hbool_t show_progress = FALSE;
     int dirty_unprotects = TRUE;
@@ -838,9 +840,12 @@ smoke_check_4(int express_test)
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
-    TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache");
+    if(paged)
+        TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache, paged aggregation")
+    else
+        TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -863,20 +868,19 @@ smoke_check_4(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024),
-                            (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -895,7 +899,7 @@ smoke_check_4(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -914,7 +918,7 @@ smoke_check_4(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -933,7 +937,7 @@ smoke_check_4(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -944,7 +948,7 @@ smoke_check_4(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -958,7 +962,7 @@ smoke_check_4(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -969,7 +973,7 @@ smoke_check_4(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -983,22 +987,22 @@ smoke_check_4(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -1026,7 +1030,7 @@ smoke_check_4(int express_test)
  */
 
 static unsigned
-smoke_check_5(int express_test)
+smoke_check_5(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -1085,9 +1089,12 @@ smoke_check_5(int express_test)
         /* double      empty_reserve          = */ 0.5f
     };
 
-    TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1");
+    if(paged)
+        TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1, paged aggregation")
+    else
+        TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -1110,32 +1117,31 @@ smoke_check_5(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024),
-                            (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1147,7 +1153,7 @@ smoke_check_5(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1159,7 +1165,7 @@ smoke_check_5(int express_test)
                                /* display_detailed_stats */ FALSE,
                                /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1171,7 +1177,7 @@ smoke_check_5(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ TRUE);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1182,7 +1188,7 @@ smoke_check_5(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1195,7 +1201,7 @@ smoke_check_5(int express_test)
                               /* do_inserts             */ TRUE,
                               /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1206,7 +1212,7 @@ smoke_check_5(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1219,22 +1225,22 @@ smoke_check_5(int express_test)
                                /* do_inserts             */ TRUE,
                                /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -1262,7 +1268,7 @@ smoke_check_5(int express_test)
  */
 
 static unsigned
-smoke_check_6(int express_test)
+smoke_check_6(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -1321,11 +1327,14 @@ smoke_check_6(int express_test)
         /* double      empty_reserve          = */ 0.05f
     };
 
-    TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1");
+    if(paged)
+        TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1, paged aggregation")
+    else
+        TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1")
 
     pass = TRUE;
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -1346,32 +1355,31 @@ smoke_check_6(int express_test)
 	    break;
     }
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024),
-                            (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1383,7 +1391,7 @@ smoke_check_6(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1395,7 +1403,7 @@ smoke_check_6(int express_test)
                                /* display_detailed_stats */ FALSE,
                                /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1407,7 +1415,7 @@ smoke_check_6(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ TRUE);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1418,7 +1426,7 @@ smoke_check_6(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1431,7 +1439,7 @@ smoke_check_6(int express_test)
                               /* do_inserts             */ TRUE,
                               /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1442,7 +1450,7 @@ smoke_check_6(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1455,22 +1463,22 @@ smoke_check_6(int express_test)
                                /* do_inserts             */ TRUE,
                                /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -1498,7 +1506,7 @@ smoke_check_6(int express_test)
  */
 
 static unsigned
-smoke_check_7(int express_test)
+smoke_check_7(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -1558,9 +1566,12 @@ smoke_check_7(int express_test)
         /* double      empty_reserve          = */ 0.1f
     };
 
-    TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2");
+    if(paged)
+        TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2, paged aggregation")
+    else
+        TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -1583,32 +1594,31 @@ smoke_check_7(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024),
-                            (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1620,7 +1630,7 @@ smoke_check_7(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1632,7 +1642,7 @@ smoke_check_7(int express_test)
                                /* display_detailed_stats */ FALSE,
                                /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1644,7 +1654,7 @@ smoke_check_7(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ TRUE);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1655,7 +1665,7 @@ smoke_check_7(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1668,7 +1678,7 @@ smoke_check_7(int express_test)
                               /* do_inserts             */ TRUE,
                               /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1679,7 +1689,7 @@ smoke_check_7(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1692,22 +1702,22 @@ smoke_check_7(int express_test)
                                /* do_inserts             */ TRUE,
                                /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -1735,7 +1745,7 @@ smoke_check_7(int express_test)
  */
 
 static unsigned
-smoke_check_8(int express_test)
+smoke_check_8(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -1795,9 +1805,12 @@ smoke_check_8(int express_test)
         /* double      empty_reserve          = */ 0.1f
     };
 
-    TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2");
+    if(paged)
+        TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2, paged aggregation")
+    else
+        TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -1820,31 +1833,31 @@ smoke_check_8(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1856,7 +1869,7 @@ smoke_check_8(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1868,7 +1881,7 @@ smoke_check_8(int express_test)
                                /* display_detailed_stats */ FALSE,
                                /* do_inserts             */ FALSE);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1880,7 +1893,7 @@ smoke_check_8(int express_test)
                               /* display_detailed_stats */ FALSE,
                               /* do_inserts             */ TRUE);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1891,7 +1904,7 @@ smoke_check_8(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1904,7 +1917,7 @@ smoke_check_8(int express_test)
                               /* do_inserts             */ TRUE,
                               /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1915,7 +1928,7 @@ smoke_check_8(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -1928,22 +1941,22 @@ smoke_check_8(int express_test)
                                /* do_inserts             */ TRUE,
                                /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -1978,7 +1991,7 @@ smoke_check_8(int express_test)
  */
 
 static unsigned
-smoke_check_9(int express_test)
+smoke_check_9(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -1992,9 +2005,12 @@ smoke_check_9(int express_test)
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
 
-    TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked");
+    if(paged)
+        TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked, paged aggregation")
+    else
+        TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -2017,38 +2033,37 @@ smoke_check_9(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
-                            (size_t)(2 * 1024 * 1024));
+    file_ptr = setup_cache((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
     /* disable evictions */
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 1.\n";
 	}
     }
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2069,22 +2084,22 @@ smoke_check_9(int express_test)
 
     /* enable evictions */
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 1.\n";
 	}
     }
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2103,22 +2118,22 @@ smoke_check_9(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 2.\n";
 	}
     }
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled \n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2137,22 +2152,22 @@ smoke_check_9(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 2.\n";
 	}
     }
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2163,22 +2178,22 @@ smoke_check_9(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 3.\n";
 	}
     }
 
-    if ( show_progress ) /* 12 */
+    if(show_progress) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2192,7 +2207,7 @@ smoke_check_9(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 13 */
+    if(show_progress) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2203,22 +2218,22 @@ smoke_check_9(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 14 */
+    if(show_progress) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 3.\n";
 	}
     }
 
-    if ( show_progress ) /* 15 */
+    if(show_progress) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2232,15 +2247,15 @@ smoke_check_9(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 16 */
+    if(show_progress) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 4.\n";
@@ -2248,22 +2263,22 @@ smoke_check_9(int express_test)
     }
 
 
-    if ( show_progress ) /* 17 */
+    if(show_progress) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 18 */
+    if(show_progress) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -2298,7 +2313,7 @@ smoke_check_9(int express_test)
  */
 
 static unsigned
-smoke_check_10(int express_test)
+smoke_check_10(int express_test, unsigned paged)
 {
     herr_t result;
     hbool_t show_progress = FALSE;
@@ -2312,9 +2327,12 @@ smoke_check_10(int express_test)
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
 
-    TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked");
+    if(paged)
+        TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked, paged aggregation")
+    else
+        TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked")
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -2337,21 +2355,20 @@ smoke_check_10(int express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
-                            (size_t)(2 * 1024 * 1024));
+    file_ptr = setup_cache((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2370,22 +2387,22 @@ smoke_check_10(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 1.\n";
 	}
     }
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2404,22 +2421,22 @@ smoke_check_10(int express_test)
                             /* dirty_destroys         */ dirty_destroys,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 1.\n";
 	}
     }
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2438,22 +2455,22 @@ smoke_check_10(int express_test)
                            /* dirty_destroys         */ dirty_destroys,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 2.\n";
 	}
     }
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2464,22 +2481,22 @@ smoke_check_10(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 2.\n";
 	}
     }
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2493,22 +2510,22 @@ smoke_check_10(int express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 12 */
+    if(show_progress) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 3.\n";
 	}
     }
 
-    if ( show_progress ) /* 13 */
+    if(show_progress) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2519,22 +2536,22 @@ smoke_check_10(int express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 14 */
+    if(show_progress) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't enable evictions 3.\n";
 	}
     }
 
-    if ( show_progress ) /* 15 */
+    if(show_progress) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2548,37 +2565,37 @@ smoke_check_10(int express_test)
                             /* do_inserts             */ TRUE,
                             /* dirty_unprotects       */ dirty_unprotects);
 
-    if ( show_progress ) /* 16 */
+    if(show_progress) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
              pass = FALSE;
 	     failure_mssg = "can't disable evictions 4.\n";
 	}
     }
 
-    if ( show_progress ) /* 17 */
+    if(show_progress) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 18 */
+    if(show_progress) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -2612,7 +2629,7 @@ 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)
+express_test, unsigned paged)
 {
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
@@ -2626,11 +2643,14 @@ express_test)
 
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-    TESTING("write permitted check -- 1/0 MB cache");
+    if(paged)
+        TESTING("write permitted check -- 1/0 MB cache, paged aggregation")
+    else
+        TESTING("write permitted check -- 1/0 MB cache")
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-    switch ( express_test )
+    switch (express_test)
     {
 	case 0:
 	    max_index = (10 * 1024) - 1;
@@ -2653,20 +2673,19 @@ express_test)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    file_ptr = setup_cache((size_t)(1 * 1024 * 1024),
-                            (size_t)(0));
+    file_ptr = setup_cache((size_t)(1 * 1024 * 1024), (size_t)0, paged);
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2685,7 +2704,7 @@ express_test)
                            /* dirty_destroys         */ TRUE,
                            /* dirty_unprotects       */ TRUE);
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2706,7 +2725,7 @@ express_test)
                             /* dirty_destroys         */ FALSE,
                             /* dirty_unprotects       */ NO_CHANGE);
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2727,7 +2746,7 @@ express_test)
                            /* dirty_destroys         */ TRUE,
                            /* dirty_unprotects       */ TRUE);
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2738,7 +2757,7 @@ express_test)
                 /* dump_stats          */ FALSE,
                 /* dump_detailed_stats */ FALSE);
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2752,7 +2771,7 @@ express_test)
                            /* do_inserts             */ TRUE,
                            /* dirty_unprotects       */ TRUE);
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -2770,22 +2789,22 @@ express_test)
 
     write_permitted = TRUE;
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -2826,7 +2845,7 @@ express_test)
  */
 
 static unsigned
-check_insert_entry(void)
+check_insert_entry(unsigned paged)
 {
     int                        entry_type = PICO_ENTRY_TYPE;
     int                        i;
@@ -2842,8 +2861,10 @@ check_insert_entry(void)
     test_entry_t *             entry_ptr;
     struct H5C_cache_entry_t * search_ptr;
 
-
-    TESTING("H5C_insert_entry() functionality");
+    if(paged)
+        TESTING("H5C_insert_entry() functionality (paged aggregation)")
+    else
+        TESTING("H5C_insert_entry() functionality")
 
     pass = TRUE;
 
@@ -2857,16 +2878,15 @@ check_insert_entry(void)
      * used to be the case.)
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         insert_entry(file_ptr, entry_type, 0, H5C__NO_FLAGS_SET);
         insert_entry(file_ptr, entry_type, 1, H5C__SET_FLUSH_MARKER_FLAG);
@@ -2878,7 +2898,7 @@ check_insert_entry(void)
 
     i = 0;
     base_addr = entries[0];
-    while ( ( pass ) && ( i < 4 ) )
+    while(pass && (i < 4))
     {
 	entry_ptr = &(base_addr[i]);
 
@@ -2886,41 +2906,41 @@ check_insert_entry(void)
 
 	result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
 			              &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_entry_status() reports failure.";
         }
 
-	if ( pass ) {
+	if(pass) {
 
 	    /* check the universals */
-	    if ( ( ! in_cache ) || ( ! is_dirty ) || ( is_protected ) ||
-                 ( entry_size != entry_sizes[entry_type] ) ) {
+	    if((!in_cache) || (!is_dirty) || (is_protected) ||
+                 (entry_size != entry_sizes[entry_type])) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected insert results 1.";
             }
 	}
 
-	if ( pass ) {
+	if(pass) {
 
             /* verify that the pinned flag got set correctly */
-	    if ( ( i == 2 ) || ( i == 3 ) ) {
+	    if((i == 2) || (i == 3)) {
 
-		if ( ! is_pinned ) {
+		if(!is_pinned) {
 
                     pass = FALSE;
                     failure_mssg = "Unexpected insert results 2.";
 		}
-	    } else if ( is_pinned ) {
+	    } else if(is_pinned) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected insert results 3.";
 
-	    } else if ( is_pinned != ((entry_ptr->header).is_pinned) ) {
+	    } else if(is_pinned != ((entry_ptr->header).is_pinned)) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected insert results 4.";
@@ -2931,38 +2951,38 @@ check_insert_entry(void)
 	 * Now start looking at the cache data structures directly.
 	 */
 
-	if ( pass ) {
+	if(pass) {
 
             /* Verify that the flush marker got set correctly */
-	    if ( ( i == 1 ) || ( i == 3 ) ) {
+	    if((i == 1) || (i == 3)) {
 
-		if ( ! ((entry_ptr->header).flush_marker) ) {
+		if(!((entry_ptr->header).flush_marker)) {
 
                     pass = FALSE;
                     failure_mssg = "Unexpected insert results 5.";
 		}
-	    } else if ( (entry_ptr->header).flush_marker ) {
+	    } else if((entry_ptr->header).flush_marker) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected insert results 6.";
 	    }
 	}
 
-	if ( pass ) {
+	if(pass) {
 
 	    /* Verify that pinned entries are in the pinned entry list */
-	    if ( (entry_ptr->header).is_pinned ) {
+	    if((entry_ptr->header).is_pinned) {
 
 		search_ptr = cache_ptr->pel_head_ptr;
 
-		while ( ( search_ptr != NULL ) &&
-			( search_ptr !=
-			  (struct H5C_cache_entry_t *)entry_ptr ) )
+		while((search_ptr != NULL) &&
+			(search_ptr !=
+			  (struct H5C_cache_entry_t *)entry_ptr))
 		{
 		    search_ptr = search_ptr->next;
 		}
 
-		if ( search_ptr == NULL ) {
+		if(search_ptr == NULL) {
 
                     pass = FALSE;
                     failure_mssg = "Unexpected insert results 7.";
@@ -2970,21 +2990,21 @@ check_insert_entry(void)
 	    }
 	}
 
-	if ( pass ) {
+	if(pass) {
 
 	    /* Verify that unpinned entries are in the LRU list */
-	    if ( ! ((entry_ptr->header).is_pinned) ) {
+	    if(!((entry_ptr->header).is_pinned)) {
 
 		search_ptr = cache_ptr->LRU_head_ptr;
 
-		while ( ( search_ptr != NULL ) &&
-			( search_ptr !=
-			  (struct H5C_cache_entry_t *)entry_ptr ) )
+		while((search_ptr != NULL) &&
+			(search_ptr !=
+			  (struct H5C_cache_entry_t *)entry_ptr))
 		{
 		    search_ptr = search_ptr->next;
 		}
 
-		if ( search_ptr == NULL ) {
+		if(search_ptr == NULL) {
 
                     pass = FALSE;
                     failure_mssg = "Unexpected insert results 8.";
@@ -2993,21 +3013,21 @@ check_insert_entry(void)
 	}
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-	if ( pass ) {
+	if(pass) {
 
 	    /* Verify that unpinned entries are in the dirty LRU list */
-	    if ( ! ((entry_ptr->header).is_pinned) ) {
+	    if(!((entry_ptr->header).is_pinned)) {
 
 		search_ptr = cache_ptr->dLRU_head_ptr;
 
-		while ( ( search_ptr != NULL ) &&
-			( search_ptr !=
-			  (struct H5C_cache_entry_t *)entry_ptr ) )
+		while((search_ptr != NULL) &&
+			(search_ptr !=
+			  (struct H5C_cache_entry_t *)entry_ptr))
 		{
 		    search_ptr = search_ptr->aux_next;
 		}
 
-		if ( search_ptr == NULL ) {
+		if(search_ptr == NULL) {
 
                     pass = FALSE;
                     failure_mssg = "Unexpected insert results 9.";
@@ -3025,24 +3045,24 @@ check_insert_entry(void)
      * as expected.
      */
 
-    if ( pass ) {
-
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size != 4 * entry_sizes[entry_type] ) ||
-	     ( cache_ptr->slist_len != 4 ) ||
-	     ( cache_ptr->slist_size != 4 * entry_sizes[entry_type] ) ||
-	     ( cache_ptr->pl_len != 0 ) ||
-	     ( cache_ptr->pl_size != (size_t)0 ) ||
-	     ( cache_ptr->pel_len != 2 ) ||
-	     ( cache_ptr->pel_size != 2 * entry_sizes[entry_type] ) ||
-	     ( cache_ptr->LRU_list_len != 2 ) ||
-	     ( cache_ptr->LRU_list_size != 2 * entry_sizes[entry_type] ) ||
+    if(pass) {
+
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size != 4 * entry_sizes[entry_type]) ||
+	     (cache_ptr->slist_len != 4) ||
+	     (cache_ptr->slist_size != 4 * entry_sizes[entry_type]) ||
+	     (cache_ptr->pl_len != 0) ||
+	     (cache_ptr->pl_size != (size_t)0) ||
+	     (cache_ptr->pel_len != 2) ||
+	     (cache_ptr->pel_size != 2 * entry_sizes[entry_type]) ||
+	     (cache_ptr->LRU_list_len != 2) ||
+	     (cache_ptr->LRU_list_size != 2 * entry_sizes[entry_type]) ||
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-	     ( cache_ptr->dLRU_list_len != 2 ) ||
-	     ( cache_ptr->dLRU_list_size != 2 * entry_sizes[entry_type] ) ||
+	     (cache_ptr->dLRU_list_len != 2) ||
+	     (cache_ptr->dLRU_list_size != 2 * entry_sizes[entry_type]) ||
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-	     ( cache_ptr->cLRU_list_len != 0 ) ||
-	     ( cache_ptr->cLRU_list_size != (size_t)0 ) ) {
+	     (cache_ptr->cLRU_list_len != 0) ||
+	     (cache_ptr->cLRU_list_size != (size_t)0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected insert results 10.";
@@ -3053,21 +3073,21 @@ check_insert_entry(void)
      * stats are collected.
      */
 #if H5C_COLLECT_CACHE_STATS
-    if ( pass ) {
-
-	if ( ( cache_ptr->insertions[entry_type] != 4 ) ||
-	     ( cache_ptr->pinned_insertions[entry_type] != 2 ) ||
-	     ( cache_ptr->pins[entry_type] != 2 ) ||
-	     ( cache_ptr->unpins[entry_type] != 0 ) ||
-             ( cache_ptr->dirty_pins[entry_type] != 0 ) ||
-	     ( cache_ptr->max_index_len != 4 ) ||
-	     ( cache_ptr->max_index_size != 4 * entry_sizes[entry_type] ) ||
-	     ( cache_ptr->max_slist_len != 4 ) ||
-	     ( cache_ptr->max_slist_size != 4 * entry_sizes[entry_type] ) ||
-	     ( cache_ptr->max_pl_len != 0 ) ||
-	     ( cache_ptr->max_pl_size != (size_t)0 ) ||
-	     ( cache_ptr->max_pel_len != 2 ) ||
-	     ( cache_ptr->max_pel_size != 2 * entry_sizes[entry_type] ) ) {
+    if(pass) {
+
+	if((cache_ptr->insertions[entry_type] != 4) ||
+	     (cache_ptr->pinned_insertions[entry_type] != 2) ||
+	     (cache_ptr->pins[entry_type] != 2) ||
+	     (cache_ptr->unpins[entry_type] != 0) ||
+             (cache_ptr->dirty_pins[entry_type] != 0) ||
+	     (cache_ptr->max_index_len != 4) ||
+	     (cache_ptr->max_index_size != 4 * entry_sizes[entry_type]) ||
+	     (cache_ptr->max_slist_len != 4) ||
+	     (cache_ptr->max_slist_size != 4 * entry_sizes[entry_type]) ||
+	     (cache_ptr->max_pl_len != 0) ||
+	     (cache_ptr->max_pl_size != (size_t)0) ||
+	     (cache_ptr->max_pel_len != 2) ||
+	     (cache_ptr->max_pel_size != 2 * entry_sizes[entry_type])) {
 
             pass = FALSE;
             failure_mssg = "Unexpected insert results 11.";
@@ -3077,20 +3097,20 @@ check_insert_entry(void)
 
     /* Unpin the pinned entries so we can take down the cache cleanly. */
 
-    if ( pass ) {
+    if(pass) {
 
         unpin_entry(entry_type, 2);
 	unpin_entry(entry_type, 3);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -3118,11 +3138,14 @@ check_insert_entry(void)
  */
 
 static unsigned
-check_flush_cache(void)
+check_flush_cache(unsigned paged)
 {
     H5F_t *      file_ptr = NULL;
 
-    TESTING("H5C_flush_cache() functionality");
+    if(paged)
+        TESTING("H5C_flush_cache() functionality (paged aggregation)")
+    else
+        TESTING("H5C_flush_cache() functionality")
 
     pass = TRUE;
 
@@ -3131,19 +3154,18 @@ check_flush_cache(void)
      * place.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
     }
 
     /* first test behaviour on an empty cache.  Can't do much sanity
      * checking in this case, so simply check the return values.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__empty_cache(file_ptr);
     }
@@ -3152,29 +3174,29 @@ check_flush_cache(void)
      * Start with a clean entry, with no flags set.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__multi_entry(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	check_flush_cache__flush_ops(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -3207,13 +3229,13 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
     H5C_t * cache_ptr = file_ptr->shared->cache;
     herr_t	 result;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         failure_mssg = "cache_ptr NULL on entry to empty cache case.";
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         failure_mssg = "cache not empty at beginning of empty cache case.";
@@ -3224,33 +3246,33 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
      * checking in this case, so simply check the return values.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg = "flush with flags = 0x00 failed on empty cache.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg = "flush with flags = 0x04 failed on empty cache.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_CLEAR_ONLY_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg = "flush with flags = 0x08 failed on empty cache.\n";
@@ -3258,11 +3280,11 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
     }
 
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_MARKED_ENTRIES_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg = "flush with flags = 0x10 failed on empty cache.\n";
@@ -3296,23 +3318,23 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
 {
     H5C_t *cache_ptr = file_ptr->shared->cache;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         failure_mssg = "cache_ptr NULL on entry to multi entry case.";
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         failure_mssg = "cache not empty at beginning of multi entry case.";
     }
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 1;
         unsigned int flush_flags             = H5C__NO_FLAGS_SET;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3402,11 +3424,11 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 2;
         unsigned int flush_flags             = H5C__FLUSH_INVALIDATE_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3496,11 +3518,11 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 3;
         unsigned int flush_flags             = H5C__FLUSH_CLEAR_ONLY_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3590,11 +3612,11 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 4;
         unsigned int flush_flags             = H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3684,12 +3706,12 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 5;
         unsigned int flush_flags             = H5C__FLUSH_INVALIDATE_FLAG |
                                                H5C__FLUSH_CLEAR_ONLY_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3779,12 +3801,12 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 6;
         unsigned int flush_flags             = H5C__FLUSH_INVALIDATE_FLAG |
                                                H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3874,12 +3896,12 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 7;
         unsigned int flush_flags             = H5C__FLUSH_CLEAR_ONLY_FLAG |
                                                H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -3969,13 +3991,13 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 8;
         unsigned int flush_flags             = H5C__FLUSH_INVALIDATE_FLAG |
                                                H5C__FLUSH_CLEAR_ONLY_FLAG |
                                                H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -4066,14 +4088,14 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
 
 
     /* verify that all other flags are ignored */
-    if ( pass )
+    if(pass)
     {
         int test_num                         = 9;
         unsigned int flush_flags             = (unsigned)
                                                ~(H5C__FLUSH_INVALIDATE_FLAG |
                                                 H5C__FLUSH_CLEAR_ONLY_FLAG |
                                                 H5C__FLUSH_MARKED_ENTRIES_FLAG);
-        int spec_size                        = 8;
+        unsigned int spec_size               = 8;
         struct flush_cache_test_spec spec[8] =
         {
           {
@@ -4168,11 +4190,11 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
      * of the flush routine to unravel collections of pinned entries.
      */
 
-    if ( pass )
+    if(pass)
     {
         int test_num                            = 1;
         unsigned int flush_flags                = H5C__NO_FLAGS_SET;
-        int spec_size                           = 8;
+        unsigned int spec_size               = 8;
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
@@ -4314,11 +4336,11 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                            = 2;
         unsigned int flush_flags                = H5C__FLUSH_INVALIDATE_FLAG;
-        int spec_size                           = 8;
+        unsigned int spec_size               = 8;
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
@@ -4443,12 +4465,12 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
                                                flush_flags, spec_size, spec);
     }
 
-    if ( pass )
+    if(pass)
     {
         int test_num                            = 3;
         unsigned int flush_flags                = H5C__FLUSH_INVALIDATE_FLAG |
                                                   H5C__FLUSH_CLEAR_ONLY_FLAG;
-        int spec_size                           = 8;
+        unsigned int spec_size               = 8;
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
@@ -4565,12 +4587,12 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                            = 4;
         unsigned int flush_flags                = H5C__FLUSH_INVALIDATE_FLAG |
                                                  H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                           = 8;
+        unsigned int spec_size               = 8;
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
@@ -4695,13 +4717,13 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
     }
 
 
-    if ( pass )
+    if(pass)
     {
         int test_num                            = 5;
         unsigned int flush_flags                = H5C__FLUSH_INVALIDATE_FLAG |
                                                   H5C__FLUSH_CLEAR_ONLY_FLAG |
                                                  H5C__FLUSH_MARKED_ENTRIES_FLAG;
-        int spec_size                           = 8;
+        unsigned int spec_size               = 8;
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
@@ -4845,13 +4867,13 @@ static void
 check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                                     int test_num,
                                     unsigned int flush_flags,
-                                    int spec_size,
+                                    unsigned int spec_size,
                                     struct flush_cache_test_spec spec[])
 {
     H5C_t * cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     herr_t	   result;
-    int            i;
+    unsigned       u;
     size_t	   total_entry_size = 0;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
@@ -4863,7 +4885,7 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
 	      test_num);
 #endif /* JRM */
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -4871,8 +4893,8 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
 
@@ -4881,7 +4903,7 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( spec_size < 1 ) || ( spec == NULL ) ) {
+    else if((spec_size < 1) || (spec == NULL)) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -4890,50 +4912,50 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
         failure_mssg = msg;
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        if ( ( spec[i].entry_num != i ) ||
-             ( spec[i].entry_type < 0 ) ||
-             ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-             ( spec[i].entry_index < 0 ) ||
-             ( spec[i].entry_index > max_indices[spec[i].entry_type] ) ) {
+        if(((unsigned)spec[u].entry_num != u) ||
+             (spec[u].entry_type < 0) ||
+             (spec[u].entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+             (spec[u].entry_index < 0) ||
+             (spec[u].entry_index > max_indices[spec[u].entry_type])) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
-                       "bad data in spec[%d] on entry to multi entry test #%d.",
-                       i, test_num);
+                       "bad data in spec[%u] on entry to multi entry test #%d.",
+                       u, test_num);
             failure_mssg = msg;
         }
-        i++;
+        u++;
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        if ( spec[i].insert_flag ) {
+        if(spec[u].insert_flag) {
 
-            insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
-                    spec[i].flags);
+            insert_entry(file_ptr, spec[u].entry_type, spec[u].entry_index,
+                    spec[u].flags);
 
         } else {
 
-            protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index);
+            protect_entry(file_ptr, spec[u].entry_type, spec[u].entry_index);
 
-            unprotect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
-                    spec[i].flags);
+            unprotect_entry(file_ptr, spec[u].entry_type, spec[u].entry_index,
+                    spec[u].flags);
         }
 
-        total_entry_size += entry_sizes[spec[i].entry_type];
+        total_entry_size += entry_sizes[spec[u].entry_type];
 
-        i++;
+        u++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, flush_flags);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -4943,56 +4965,56 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
         }
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        base_addr = entries[spec[i].entry_type];
-        entry_ptr = &(base_addr[spec[i].entry_index]);
+        base_addr = entries[spec[u].entry_type];
+        entry_ptr = &(base_addr[spec[u].entry_index]);
 
-        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
-             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
-             ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
+        if((entry_ptr->deserialized != spec[u].expected_deserialized) ||
+             (entry_ptr->serialized != spec[u].expected_serialized) ||
+             (entry_ptr->destroyed != spec[u].expected_destroyed)) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around. */
 
             HDfprintf(stdout,
               "deslzd = %d(%d), slzd = %d(%d), dest = %d(%d)\n",
               (int)(entry_ptr->deserialized),
-              (int)(spec[i].expected_deserialized),
+              (int)(spec[u].expected_deserialized),
               (int)(entry_ptr->serialized),
-              (int)(spec[i].expected_serialized),
+              (int)(spec[u].expected_serialized),
               (int)(entry_ptr->destroyed),
-              (int)(spec[i].expected_destroyed));
+              (int)(spec[u].expected_destroyed));
 
 #endif
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
-                "Bad status on entry %d after flush in multi entry test #%d.",
-                i, test_num);
+                "Bad status on entry %u after flush in multi entry test #%d.",
+                u, test_num);
             failure_mssg = msg;
         }
-        i++;
+        u++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
+        if((((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0)
                &&
-               ( ( cache_ptr->index_len != spec_size )
+               ((cache_ptr->index_len != spec_size)
                  ||
-                 ( cache_ptr->index_size != total_entry_size )
-               )
-             )
+                 (cache_ptr->index_size != total_entry_size)
+              )
+            )
              ||
-             ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 )
+             (((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0)
                &&
-               ( ( cache_ptr->index_len != 0 )
+               ((cache_ptr->index_len != 0)
                  ||
-                 ( cache_ptr->index_size != 0 )
-               )
-             )
-           ) {
+                 (cache_ptr->index_size != 0)
+              )
+            )
+          ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5003,11 +5025,11 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
     }
 
     /* clean up the cache to prep for the next test */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5015,8 +5037,8 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                        test_num);
             failure_mssg = msg;
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        else if((cache_ptr->index_len != 0) ||
+                  (cache_ptr->index_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5027,17 +5049,17 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
         }
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        base_addr = entries[spec[i].entry_type];
-        entry_ptr = &(base_addr[spec[i].entry_index]);
+        base_addr = entries[spec[u].entry_type];
+        entry_ptr = &(base_addr[spec[u].entry_index]);
 
         entry_ptr->deserialized = FALSE;
         entry_ptr->serialized   = FALSE;
         entry_ptr->destroyed    = FALSE;
 
-        i++;
+        u++;
     }
 
     return;
@@ -5064,13 +5086,13 @@ static void
 check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                                        int test_num,
                                        unsigned int flush_flags,
-                                       int spec_size,
+                                       unsigned int spec_size,
                                        struct pe_flush_cache_test_spec spec[])
 {
     H5C_t *cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     herr_t	   result;
-    int            i;
+    unsigned       u;
     int            j;
     size_t	   total_entry_size = 0;
     test_entry_t * base_addr;
@@ -5083,7 +5105,7 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
 	      test_num);
 #endif /* JRM */
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -5091,8 +5113,8 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
 
@@ -5101,7 +5123,7 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( spec_size < 1 ) || ( spec == NULL ) ) {
+    else if((spec_size < 1) || (spec == NULL)) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -5110,61 +5132,61 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
         failure_mssg = msg;
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        if ( ( spec[i].entry_num != i ) ||
-             ( spec[i].entry_type < 0 ) ||
-             ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-             ( spec[i].entry_index < 0 ) ||
-             ( spec[i].entry_index > max_indices[spec[i].entry_type] ) ||
-	     ( spec[i].num_pins < 0 ) ||
-	     ( spec[i].num_pins > MAX_PINS ) ) {
+        if(((unsigned)spec[u].entry_num != u) ||
+             (spec[u].entry_type < 0) ||
+             (spec[u].entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+             (spec[u].entry_index < 0) ||
+             (spec[u].entry_index > max_indices[spec[u].entry_type]) ||
+	     (spec[u].num_pins < 0) ||
+	     (spec[u].num_pins > MAX_PINS)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
-                    "bad data in spec[%d] on entry to pe multi entry test #%d.",
-                    i, test_num);
+                    "bad data in spec[%u] on entry to pe multi entry test #%d.",
+                    u, test_num);
             failure_mssg = msg;
         }
-        i++;
+        u++;
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        if ( spec[i].insert_flag ) {
+        if(spec[u].insert_flag) {
 
-            insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
-                    spec[i].flags);
+            insert_entry(file_ptr, spec[u].entry_type, spec[u].entry_index,
+                    spec[u].flags);
 
         } else {
 
-            protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index);
+            protect_entry(file_ptr, spec[u].entry_type, spec[u].entry_index);
 
-            unprotect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
-                    spec[i].flags);
+            unprotect_entry(file_ptr, spec[u].entry_type, spec[u].entry_index,
+                    spec[u].flags);
         }
 
-        total_entry_size += entry_sizes[spec[i].entry_type];
+        total_entry_size += entry_sizes[spec[u].entry_type];
 
-	for ( j = 0; j < spec[i].num_pins; j++ )
+	for (j = 0; j < spec[u].num_pins; j++)
 	{
             create_pinned_entry_dependency(file_ptr,
-		                           spec[i].entry_type,
-					   spec[i].entry_index,
-					   spec[i].pin_type[j],
-					   spec[i].pin_idx[j]);
+		                           spec[u].entry_type,
+					   spec[u].entry_index,
+					   spec[u].pin_type[j],
+					   spec[u].pin_idx[j]);
 	}
 
-        i++;
+        u++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, flush_flags);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5174,56 +5196,56 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
         }
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        base_addr = entries[spec[i].entry_type];
-        entry_ptr = &(base_addr[spec[i].entry_index]);
+        base_addr = entries[spec[u].entry_type];
+        entry_ptr = &(base_addr[spec[u].entry_index]);
 
-        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
-             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
-             ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
+        if((entry_ptr->deserialized != spec[u].expected_deserialized) ||
+             (entry_ptr->serialized != spec[u].expected_serialized) ||
+             (entry_ptr->destroyed != spec[u].expected_destroyed)) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around. */
 
             HDfprintf(stdout,
               "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
               (int)(entry_ptr->deserialized),
-              (int)(spec[i].expected_deserialized),
+              (int)(spec[u].expected_deserialized),
               (int)(entry_ptr->serialized),
-              (int)(spec[i].expected_serialized),
+              (int)(spec[u].expected_serialized),
               (int)(entry_ptr->destroyed),
-              (int)(spec[i].expected_destroyed));
+              (int)(spec[u].expected_destroyed));
 
 #endif
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
-               "Bad status on entry %d after flush in pe multi entry test #%d.",
-               i, test_num);
+               "Bad status on entry %u after flush in pe multi entry test #%d.",
+               u, test_num);
             failure_mssg = msg;
         }
-        i++;
+        u++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
+        if((((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0)
                &&
-               ( ( cache_ptr->index_len != spec_size )
+               ((cache_ptr->index_len != spec_size)
                  ||
-                 ( cache_ptr->index_size != total_entry_size )
-               )
-             )
+                 (cache_ptr->index_size != total_entry_size)
+              )
+            )
              ||
-             ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 )
+             (((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0)
                &&
-               ( ( cache_ptr->index_len != 0 )
+               ((cache_ptr->index_len != 0)
                  ||
-                 ( cache_ptr->index_size != 0 )
-               )
-             )
-           ) {
+                 (cache_ptr->index_size != 0)
+              )
+            )
+          ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5234,11 +5256,11 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
     }
 
     /* clean up the cache to prep for the next test */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5246,8 +5268,8 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                        test_num);
             failure_mssg = msg;
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        else if((cache_ptr->index_len != 0) ||
+                  (cache_ptr->index_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -5258,17 +5280,17 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
         }
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    u = 0;
+    while(pass && (u < spec_size))
     {
-        base_addr = entries[spec[i].entry_type];
-        entry_ptr = &(base_addr[spec[i].entry_index]);
+        base_addr = entries[spec[u].entry_type];
+        entry_ptr = &(base_addr[spec[u].entry_index]);
 
         entry_ptr->deserialized = FALSE;
         entry_ptr->serialized   = FALSE;
         entry_ptr->destroyed    = FALSE;
 
-        i++;
+        u++;
     }
 
     return;
@@ -5302,19 +5324,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 {
     H5C_t *cache_ptr = file_ptr->shared->cache;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         failure_mssg = "cache_ptr NULL on entry to flush ops test.";
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         failure_mssg = "cache not empty at beginning of flush ops test.";
     }
 
-    if ( pass ) /* test #1 */
+    if(pass) /* test #1 */
     {
 	/* start with a very simple test, in which there are two entries
 	 * resident in cache, and the second entry dirties the first in
@@ -5323,9 +5345,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 1;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 2;
-	int init_expected_index_len	= 2;
+	unsigned init_expected_index_len	= 2;
 	size_t init_expected_index_size	= 2 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 2;
+	unsigned expected_index_len		= 2;
 	size_t expected_index_size	= 2 * PICO_ENTRY_SIZE;
 	struct fo_flush_cache_test_spec spec[2] =
 	{
@@ -5418,7 +5440,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #2 */
+    if(pass) /* test #2 */
     {
 	/* Same as test 1, only this time set the flush invalidate flag.
 	 * Note that we must repeat all tests with the flush invalidate flag
@@ -5430,9 +5452,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 2;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 2;
-	int init_expected_index_len	= 2;
+	unsigned init_expected_index_len	= 2;
 	size_t init_expected_index_size	= 2 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= 0;
 	struct fo_flush_cache_test_spec spec[2] =
 	{
@@ -5525,7 +5547,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #3 */
+    if(pass) /* test #3 */
     {
 	/* Single entry test verifying that the cache can handle the case in
 	 * which the call back function resizes the entry for which it has
@@ -5534,9 +5556,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 3;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE / 4;
-	int expected_index_len		= 1;
+	unsigned expected_index_len		= 1;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -5601,7 +5623,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #4 */
+    if(pass) /* test #4 */
     {
 	/* Repeat test #4 with the flush invalidate flag.
 	 *
@@ -5612,9 +5634,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 4;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE / 4;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= 0;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -5679,7 +5701,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #5 & #6 */
+    if(pass) /* test #5 & #6 */
     {
 	/* Single entry test verifying that the cache can handle the case in
 	 * which the call back function first resizes and then moves the
@@ -5697,9 +5719,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 5; /* and 6 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 1;
+	unsigned expected_index_len		= 1;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -5774,7 +5796,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * matter in this case.  But we will do similar tests later with
 	 * other entries in the cache.
 	 */
-	if ( pass ) {
+	if(pass) {
 
 	    spec[0].flush_ops[1].flag = TRUE;
 	    test_num = 6;
@@ -5793,7 +5815,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #7 & #8 */
+    if(pass) /* test #7 & #8 */
     {
 	/* Run tests 5 & 6 again, using the flush invalidate flag on the
 	 * second test.
@@ -5814,9 +5836,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 7; /* and 8 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 1;
+	unsigned expected_index_len		= 1;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -5892,7 +5914,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * other entries in the cache.
 	 */
 
-	if ( pass ) {
+	if(pass) {
 
             test_num = 8;
 	    flush_flags = H5C__FLUSH_INVALIDATE_FLAG;
@@ -5915,7 +5937,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #9 & #10 */
+    if(pass) /* test #9 & #10 */
     {
 	/* Single entry test verifying that the cache can handle the case in
 	 * which the call back function both resizes and moves the entry
@@ -5927,9 +5949,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 9; /* and 10 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
-	int expected_index_len		= 1;
+	unsigned expected_index_len		= 1;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 4;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -6004,7 +6026,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * matter in this case.  But we will do similar tests later with
 	 * other entries in the cache.
 	 */
-	if ( pass ) {
+	if(pass) {
 
 	    spec[0].flush_ops[1].flag = TRUE;
 	    test_num = 10;
@@ -6023,7 +6045,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #11 & #12 */
+    if(pass) /* test #11 & #12 */
     {
 	/* Repeat the previous test with the flush invalidate flag on the
 	 * second test.
@@ -6038,9 +6060,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 11; /* and 12 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
-	int expected_index_len		= 1;
+	unsigned expected_index_len		= 1;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 4;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -6115,7 +6137,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * matter in this case.  But we will do similar tests later with
 	 * other entries in the cache.
 	 */
-	if ( pass ) {
+	if(pass) {
 
             test_num = 12;
 	    flush_flags = H5C__FLUSH_INVALIDATE_FLAG;
@@ -6139,7 +6161,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #13 */
+    if(pass) /* test #13 */
     {
 	/* Test the ability of the cache to handle the case in which
 	 * the flush function of an entry that is resident in cache
@@ -6152,9 +6174,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 13;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 3;
+	unsigned expected_index_len		= 3;
 	size_t expected_index_size	= 3 * PICO_ENTRY_SIZE;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -6233,7 +6255,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #14 */
+    if(pass) /* test #14 */
     {
 	/* Repeat previous test with the flush invalidate flag.
 	 *
@@ -6248,9 +6270,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 14;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= (size_t)0;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -6329,7 +6351,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #15 */
+    if(pass) /* test #15 */
     {
 	/* Test the ability of the cache to handle the case in which
 	 * the flush function of an entry that is resident in cache
@@ -6341,9 +6363,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 15;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 3;
+	unsigned expected_index_len		= 3;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE +
 		                          (VARIABLE_ENTRY_SIZE / 4) +
 					  (VARIABLE_ENTRY_SIZE / 2);
@@ -6424,7 +6446,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #16 */
+    if(pass) /* test #16 */
     {
 	/* Repeat previous test with the flush invalidate flag.
 	 *
@@ -6438,9 +6460,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 16;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= (size_t)0;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
@@ -6519,7 +6541,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #17 & #18 */
+    if(pass) /* test #17 & #18 */
     {
 	/* Test the ability of the cache to handle the case in which
 	 * the flush function of an entry that is resident in cache
@@ -6531,9 +6553,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 17; /* and 18 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 3;
+	unsigned expected_index_len		= 3;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE +
 		                          (VARIABLE_ENTRY_SIZE / 4) +
 					  (VARIABLE_ENTRY_SIZE / 2);
@@ -6621,7 +6643,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * the moved entries are moved forward in the slist.  In the second
 	 * they are moved backwards.
 	 */
-	if ( pass ) {
+	if(pass) {
 
 	    test_num = 18;
 	    spec[0].flush_ops[2].flag = TRUE;
@@ -6643,7 +6665,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #19 & #20 */
+    if(pass) /* test #19 & #20 */
     {
 	/* Repeat the above test with the flush invalidate flag on the
 	 * second test.
@@ -6658,9 +6680,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 19; /* and 20 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 1;
-	int init_expected_index_len	= 1;
+	unsigned init_expected_index_len	= 1;
 	size_t init_expected_index_size	= 1 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 3;
+	unsigned expected_index_len		= 3;
 	size_t expected_index_size	= VARIABLE_ENTRY_SIZE +
 		                          (VARIABLE_ENTRY_SIZE / 4) +
 					  (VARIABLE_ENTRY_SIZE / 2);
@@ -6748,7 +6770,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 * the moved entries are moved forward in the slist.  In the second
 	 * they are moved backwards.
 	 */
-	if ( pass ) {
+	if(pass) {
 
 	    test_num = 20;
 	    flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
@@ -6778,7 +6800,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) /* test #21 */
+    if(pass) /* test #21 */
     {
 	/* Now mix things up a bit.
 	 *
@@ -6796,9 +6818,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 21;
 	unsigned int flush_flags	= H5C__FLUSH_MARKED_ENTRIES_FLAG;
 	int spec_size			= 4;
-	int init_expected_index_len	= 4;
+	unsigned init_expected_index_len	= 4;
 	size_t init_expected_index_size	= (2 * VARIABLE_ENTRY_SIZE) + (2 * PICO_ENTRY_SIZE);
-	int expected_index_len		= 6;
+	unsigned expected_index_len		= 6;
 	size_t expected_index_size	= (2 * VARIABLE_ENTRY_SIZE) +
 		                          (VARIABLE_ENTRY_SIZE / 4) +
 					  (VARIABLE_ENTRY_SIZE / 2) +
@@ -6993,7 +7015,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	reset_entries();
     }
 
-    if ( pass ) /* test #22 */
+    if(pass) /* test #22 */
     {
 	/* Mix things up some more.
 	 *
@@ -7007,9 +7029,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 22;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 6;
-	int init_expected_index_len	= 6;
+	unsigned init_expected_index_len	= 6;
 	size_t init_expected_index_size	= (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE);
-	int expected_index_len		= 10;
+	unsigned expected_index_len		= 10;
 	size_t expected_index_size	= (2 * VARIABLE_ENTRY_SIZE) +
 		                          (2 * (VARIABLE_ENTRY_SIZE / 4)) +
 					  (2 * (VARIABLE_ENTRY_SIZE / 2)) +
@@ -7260,7 +7282,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	reset_entries();
     }
 
-    if ( pass ) /* test #23 */
+    if(pass) /* test #23 */
     {
 	/* Repeat test #23 with the flush invalidate flag set.
 	 *
@@ -7276,9 +7298,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 23;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 6;
-	int init_expected_index_len	= 6;
+	unsigned init_expected_index_len	= 6;
 	size_t init_expected_index_size	= (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE);
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= 0;
 	struct fo_flush_cache_test_spec spec[6] =
 	{
@@ -7530,7 +7552,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
      *
      * Now create some tests mixing flush ops and pins.
      */
-    if ( pass ) /* test #24 */
+    if(pass) /* test #24 */
     {
 	/* Pico entries 50 and 150 pin pico entry 100, and also dirty
 	 * pico entry 100 on flush.
@@ -7538,9 +7560,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 24;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 3;
-	int init_expected_index_len	= 3;
+	unsigned init_expected_index_len	= 3;
 	size_t init_expected_index_size	= 3 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 3;
+	unsigned expected_index_len		= 3;
 	size_t expected_index_size	= 3 * PICO_ENTRY_SIZE;
 	struct fo_flush_cache_test_spec spec[3] =
 	{
@@ -7661,7 +7683,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #25 */
+    if(pass) /* test #25 */
     {
 	/* Repeat the previous test with the flush invalidate flag.
 	 *
@@ -7671,9 +7693,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 25;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 3;
-	int init_expected_index_len	= 3;
+	unsigned init_expected_index_len	= 3;
 	size_t init_expected_index_size	= 3 * PICO_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= (size_t)0;
 	struct fo_flush_cache_test_spec spec[3] =
 	{
@@ -7794,7 +7816,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 					 checks);
     }
 
-    if ( pass ) /* test #26 */
+    if(pass) /* test #26 */
     {
 	/* This one is complex.
 	 *
@@ -7874,9 +7896,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 26;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 10;
-	int init_expected_index_len	= 10;
+	unsigned init_expected_index_len	= 10;
 	size_t init_expected_index_size	= 10 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 13;
+	unsigned expected_index_len		= 13;
 	size_t expected_index_size	= 9 * VARIABLE_ENTRY_SIZE;
 	struct fo_flush_cache_test_spec spec[10] =
 	{
@@ -8224,7 +8246,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	reset_entries();
     }
 
-    if ( pass ) /* test #27 */
+    if(pass) /* test #27 */
     {
 	/* Repeat test #26 with the flush invalidate flag.
 	 *
@@ -8308,9 +8330,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 27;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 10;
-	int init_expected_index_len	= 10;
+	unsigned init_expected_index_len	= 10;
 	size_t init_expected_index_size	= 10 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= (size_t)0;
 	struct fo_flush_cache_test_spec spec[10] =
 	{
@@ -8658,7 +8680,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	reset_entries();
     }
 
-    if ( pass ) /* test #28 */
+    if(pass) /* test #28 */
     {
 	/* Test the expected fheap case, in which an entry dirties
 	 * and resizes itself, and dirties an entry which it has
@@ -8667,9 +8689,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 28;
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
 	int spec_size			= 5;
-	int init_expected_index_len	= 5;
+	unsigned init_expected_index_len	= 5;
 	size_t init_expected_index_size	= 3 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 5;
+	unsigned expected_index_len		= 5;
 	size_t expected_index_size	= 4 * VARIABLE_ENTRY_SIZE;
 	struct fo_flush_cache_test_spec spec[5] =
 	{
@@ -8848,7 +8870,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	reset_entries();
     }
 
-    if ( pass ) /* test #29 */
+    if(pass) /* test #29 */
     {
 	/* Repeat test #28 with the flush invalidate flag.
 	 *
@@ -8859,9 +8881,9 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
         int test_num			= 29;
 	unsigned int flush_flags	= H5C__FLUSH_INVALIDATE_FLAG;
 	int spec_size			= 5;
-	int init_expected_index_len	= 5;
+	unsigned init_expected_index_len	= 5;
 	size_t init_expected_index_size	= 3 * VARIABLE_ENTRY_SIZE;
-	int expected_index_len		= 0;
+	unsigned expected_index_len		= 0;
 	size_t expected_index_size	= 0;
 	struct fo_flush_cache_test_spec spec[5] =
 	{
@@ -9069,10 +9091,10 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
                                  int test_num,
                                  unsigned int flush_flags,
                                  int spec_size,
-                                 struct fo_flush_cache_test_spec spec[],
-				 int init_expected_index_len,
+                                 const struct fo_flush_cache_test_spec spec[],
+				 unsigned init_expected_index_len,
 				 size_t init_expected_index_size,
-				 int expected_index_len,
+				 unsigned expected_index_len,
 				 size_t expected_index_size,
 				 int check_size,
 				 struct fo_flush_entry_check check[])
@@ -9090,7 +9112,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 	      test_num);
 #endif
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -9098,8 +9120,8 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
 
@@ -9108,7 +9130,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( spec_size < 1 ) || ( spec == NULL ) ) {
+    else if((spec_size < 1) || (spec == NULL)) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -9118,17 +9140,17 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    while(pass && (i < spec_size))
     {
-        if ( ( spec[i].entry_num != i ) ||
-             ( spec[i].entry_type < 0 ) ||
-             ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-             ( spec[i].entry_index < 0 ) ||
-             ( spec[i].entry_index > max_indices[spec[i].entry_type] ) ||
-	     ( spec[i].num_pins < 0 ) ||
-	     ( spec[i].num_pins > MAX_PINS ) ||
-	     ( spec[i].num_flush_ops < 0 ) ||
-	     ( spec[i].num_flush_ops > MAX_FLUSH_OPS ) ) {
+        if((spec[i].entry_num != i) ||
+             (spec[i].entry_type < 0) ||
+             (spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+             (spec[i].entry_index < 0) ||
+             (spec[i].entry_index > max_indices[spec[i].entry_type]) ||
+	     (spec[i].num_pins < 0) ||
+	     (spec[i].num_pins > MAX_PINS) ||
+	     (spec[i].num_flush_ops < 0) ||
+	     (spec[i].num_flush_ops > MAX_FLUSH_OPS)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9140,30 +9162,36 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     i = 0;
-    while ( ( pass ) && ( i < check_size ) )
+    while(pass && (i < check_size))
     {
-        if ( ( check[i].entry_num != i ) ||
-             ( check[i].entry_type < 0 ) ||
-             ( check[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-             ( check[i].entry_index < 0 ) ||
-             ( check[i].entry_index > max_indices[check[i].entry_type] ) ||
-             ( check[i].expected_size <= (size_t)0 ) ||
-	     ( ( check[i].in_cache != TRUE ) &&
-	       ( check[i].in_cache != FALSE ) ) ||
-	     ( ( check[i].at_main_addr != TRUE ) &&
-	       ( check[i].at_main_addr != FALSE ) ) ||
-	     ( ( check[i].is_dirty != TRUE ) &&
-	       ( check[i].is_dirty != FALSE ) ) ||
-	     ( ( check[i].is_protected != TRUE ) &&
-	       ( check[i].is_protected != FALSE ) ) ||
-	     ( ( check[i].is_pinned != TRUE ) &&
-	       ( check[i].is_pinned != 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 ) ) ) {
+        if((check[i].entry_num != i) ||
+             (check[i].entry_type < 0) ||
+             (check[i].entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+             (check[i].entry_index < 0) ||
+             (check[i].entry_index > max_indices[check[i].entry_type]) ||
+#ifndef H5_HAVE_STDBOOL_H
+                /* Check for nonsense values if hbool_t is an integral
+                 * type instead of a real Boolean.
+                 */
+	         ((check[i].in_cache != TRUE) &&
+	           (check[i].in_cache != FALSE)) ||
+	         ((check[i].at_main_addr != TRUE) &&
+	           (check[i].at_main_addr != FALSE)) ||
+	         ((check[i].is_dirty != TRUE) &&
+	           (check[i].is_dirty != FALSE)) ||
+	         ((check[i].is_protected != TRUE) &&
+	           (check[i].is_protected != FALSE)) ||
+	         ((check[i].is_pinned != TRUE) &&
+	           (check[i].is_pinned != 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)) ||
+#endif /* H5_HAVE_STDBOOL_H */
+             (check[i].expected_size <= (size_t)0)
+        ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9175,9 +9203,9 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    while(pass && (i < spec_size))
     {
-        if ( spec[i].insert_flag ) {
+        if(spec[i].insert_flag) {
 
             insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
                          spec[i].flags);
@@ -9194,7 +9222,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 					     spec[i].flags);
         }
 
-	for ( j = 0; j < spec[i].num_pins; j++ )
+	for (j = 0; j < spec[i].num_pins; j++)
 	{
             create_pinned_entry_dependency(file_ptr,
 		                           spec[i].entry_type,
@@ -9203,7 +9231,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 					   spec[i].pin_idx[j]);
 	}
 
-	for ( j = 0; j < spec[i].num_flush_ops; j++ )
+	for (j = 0; j < spec[i].num_flush_ops; j++)
 	{
 	    add_flush_op(spec[i].entry_type,
 			 spec[i].entry_index,
@@ -9218,10 +9246,10 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         i++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->index_len != init_expected_index_len ) ||
-             ( cache_ptr->index_size != init_expected_index_size ) ) {
+        if((cache_ptr->index_len != init_expected_index_len) ||
+             (cache_ptr->index_size != init_expected_index_size)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9231,11 +9259,11 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, flush_flags);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9247,14 +9275,14 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 
 
     i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    while(pass && (i < spec_size))
     {
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
-             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
-             ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
+        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. */
 
@@ -9280,14 +9308,14 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         i++;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         i = 0;
-        while ( ( pass ) && ( i < check_size ) )
+        while(pass && (i < check_size))
         {
-	    if ( check[i].in_cache != entry_in_cache(cache_ptr,
+	    if(check[i].in_cache != entry_in_cache(cache_ptr,
 				                     check[i].entry_type,
-						     check[i].entry_index) ) {
+						     check[i].entry_index)) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128,
@@ -9299,87 +9327,87 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
             base_addr = entries[check[i].entry_type];
             entry_ptr = &(base_addr[check[i].entry_index]);
 
-	    if ( ( entry_ptr->size != check[i].expected_size ) ||
-		 ( ( ! entry_ptr->header.destroy_in_progress ) &&
-		   ( check[i].in_cache ) &&
-		   ( entry_ptr->header.size != check[i].expected_size ) ) ||
-		 ( entry_ptr->at_main_addr != check[i].at_main_addr ) ||
-		 ( entry_ptr->is_dirty != check[i].is_dirty ) ||
-		 ( entry_ptr->header.is_dirty != check[i].is_dirty ) ||
-		 ( entry_ptr->is_protected != check[i].is_protected ) ||
-		 ( 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->deserialized != check[i].expected_deserialized ) ||
-		 ( entry_ptr->serialized != check[i].expected_serialized ) ||
-		 ( entry_ptr->destroyed != check[i].expected_destroyed ) ) {
+	    if((entry_ptr->size != check[i].expected_size) ||
+		 ((!entry_ptr->header.destroy_in_progress) &&
+		   (check[i].in_cache) &&
+		   (entry_ptr->header.size != check[i].expected_size)) ||
+		 (entry_ptr->at_main_addr != check[i].at_main_addr) ||
+		 (entry_ptr->is_dirty != check[i].is_dirty) ||
+		 (entry_ptr->header.is_dirty != check[i].is_dirty) ||
+		 (entry_ptr->is_protected != check[i].is_protected) ||
+		 (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->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. */
 
-		if ( entry_ptr->size != check[i].expected_size ) {
+		if(entry_ptr->size != check[i].expected_size) {
 		    HDfprintf(stdout, "entry_ptr->size (expected) = %d (%d).\n",
 			      (int)(entry_ptr->size),
 			      (int)(check[i].expected_size));
 		}
-		if ( ( ! entry_ptr->header.destroy_in_progress ) &&
-		     ( check[i].in_cache ) &&
-                     ( entry_ptr->header.size != check[i].expected_size ) ) {
+		if((!entry_ptr->header.destroy_in_progress) &&
+		     (check[i].in_cache) &&
+                     (entry_ptr->header.size != check[i].expected_size)) {
                     HDfprintf(stdout,
                               "(!destroy in progress and in cache and size (expected) = %d (%d).\n",
                               (int)(entry_ptr->header.size),
 			      (int)(check[i].expected_size));
 		}
-		if ( entry_ptr->at_main_addr != check[i].at_main_addr ) {
+		if(entry_ptr->at_main_addr != check[i].at_main_addr) {
 		    HDfprintf(stdout, "(%d,%d) at main addr (expected) = %d (%d).\n",
 			      (int)(check[i].entry_type),
 			      (int)(check[i].entry_index),
                               (int)(entry_ptr->at_main_addr),
 			      (int)(check[i].at_main_addr));
                 }
-		if ( entry_ptr->is_dirty != check[i].is_dirty ) {
+		if(entry_ptr->is_dirty != check[i].is_dirty) {
 		    HDfprintf(stdout, "entry_ptr->is_dirty (expected) = %d (%d).\n",
 		              (int)(entry_ptr->is_dirty),
 			      (int)(check[i].is_dirty));
 		}
-		if ( entry_ptr->header.is_dirty != check[i].is_dirty ) {
+		if(entry_ptr->header.is_dirty != check[i].is_dirty) {
 		    HDfprintf(stdout, "entry_ptr->header.is_dirty (expected) = %d (%d).\n",
 		              (int)(entry_ptr->header.is_dirty),
 			      (int)(check[i].is_dirty));
 		}
-	        if ( entry_ptr->is_protected != check[i].is_protected ) {
+	        if(entry_ptr->is_protected != check[i].is_protected) {
                     HDfprintf(stdout, "entry_ptr->is_protected (expected) = %d (%d).\n",
 			      (int)(entry_ptr->is_protected),
 			      (int)(check[i].is_protected));
 		}
-	        if ( entry_ptr->header.is_protected != check[i].is_protected ) {
+	        if(entry_ptr->header.is_protected != check[i].is_protected) {
                     HDfprintf(stdout, "entry_ptr->header.is_protected (expected) = %d (%d).\n",
 			      (int)(entry_ptr->is_protected),
 			      (int)(check[i].is_protected));
 		}
-		if ( entry_ptr->is_pinned != check[i].is_pinned ) {
+		if(entry_ptr->is_pinned != check[i].is_pinned) {
 		    HDfprintf(stdout, "entry_ptr->is_pinned (expected) = %d (%d).\n",
 			      (int)(entry_ptr->is_pinned),
 			      (int)(check[i].is_pinned));
 		}
-		if ( entry_ptr->header.is_pinned != check[i].is_pinned ) {
+		if(entry_ptr->header.is_pinned != check[i].is_pinned) {
 		    HDfprintf(stdout, "entry_ptr->header.is_pinned (expected) = %d (%d).\n",
 			      (int)(entry_ptr->header.is_pinned),
 			      (int)(check[i].is_pinned));
 		}
-		if ( entry_ptr->deserialized !=
-				check[i].expected_deserialized ) {
+		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->serialized != check[i].expected_serialized ) {
+		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 ) {
+		if(entry_ptr->destroyed != check[i].expected_destroyed) {
 		    HDfprintf(stdout, "entry_ptr->destroyed (expected) = %d (%d).\n",
 			      (int)(entry_ptr->destroyed),
 			      (int)(check[i].expected_destroyed));
@@ -9395,24 +9423,24 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
+        if((((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0)
                &&
-               ( ( cache_ptr->index_len != expected_index_len )
+               ((cache_ptr->index_len != expected_index_len)
                  ||
-                 ( cache_ptr->index_size != expected_index_size )
-               )
-             )
+                 (cache_ptr->index_size != expected_index_size)
+              )
+            )
              ||
-             ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 )
+             (((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0)
                &&
-               ( ( cache_ptr->index_len != 0 )
+               ((cache_ptr->index_len != 0)
                  ||
-                 ( cache_ptr->index_size != 0 )
-               )
-             )
-           ) {
+                 (cache_ptr->index_size != 0)
+              )
+            )
+          ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9423,11 +9451,11 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     /* clean up the cache to prep for the next test */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9435,10 +9463,10 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
                        test_num);
             failure_mssg = msg;
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ||
-		  ( cache_ptr->clean_index_size != 0 ) ||
-		  ( cache_ptr->dirty_index_size != 0 ) ) {
+        else if((cache_ptr->index_len != 0) ||
+                  (cache_ptr->index_size != 0) ||
+		  (cache_ptr->clean_index_size != 0) ||
+		  (cache_ptr->dirty_index_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -9450,7 +9478,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     i = 0;
-    while ( ( pass ) && ( i < spec_size ) )
+    while(pass && (i < spec_size))
     {
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
@@ -9465,7 +9493,7 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     i = 0;
-    while ( ( pass ) && ( i < check_size ) )
+    while(pass && (i < check_size))
     {
         base_addr = entries[check[i].entry_type];
         entry_ptr = &(base_addr[check[i].entry_index]);
@@ -9526,7 +9554,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
        * 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 */
+      /* 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},
@@ -9584,21 +9612,21 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
       { 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 ) {
+    if(pass) {
 
-         if ( cache_ptr == NULL ) {
+         if(cache_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "cache_ptr NULL on entry to flush ops test.";
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        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 ) ) ) {
+        else if((cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+                  (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
 	    pass = FALSE;
 	    failure_mssg =
@@ -9614,7 +9642,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* the basic idea in this test is to insert a bunch of entries
          * with flush operations associated with them, and then load
@@ -9678,17 +9706,17 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	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)) +
+	if((cache_ptr->index_len != 10) ||
+             (cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 4)) +
 	                                (2 * (VARIABLE_ENTRY_SIZE / 2)) +
-	                                (4 * VARIABLE_ENTRY_SIZE) ) ) {
+	                                (4 * VARIABLE_ENTRY_SIZE))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 1.";
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Now set up the pinning relationships:
 	 *
@@ -9747,7 +9775,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
                      VARIABLE_ENTRY_TYPE, 8, FALSE, (size_t)0, NULL);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* to summarize, at present the following variable size entries
 	 * are in cache with the following characteristics:
@@ -9787,26 +9815,26 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 */
 
         /* Now fill up the cache with other, unrelated entries */
-	for ( i = 0; i < 31; i++ )
+	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);
 	}
 
-	for ( i = 0; i < 1; i++ )
+	for (i = 0; i < 1; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
 	/* The cache should now be exactly full */
-	if ( ( cache_ptr->index_len != 42 ) ||
-             ( cache_ptr->index_size != 2 * 1024 * 1024 ) ||
-	     ( cache_ptr->index_size != ((4 * VARIABLE_ENTRY_SIZE / 4) +
+	if((cache_ptr->index_len != 42) ||
+             (cache_ptr->index_size != 2 * 1024 * 1024) ||
+	     (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)) ) ) {
+					 (1 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 2.";
@@ -9822,8 +9850,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	}
     }
 
-
-    if ( pass ) {
+    if(pass) {
 
 	/* Now load a large entry.  This should result in the eviction
 	 * of (VET,2), and the increase in the size of (VET, 0) from .25
@@ -9871,17 +9898,17 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1);
 	unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, H5C__DIRTIED_FLAG);
 
-	if ( ( cache_ptr->index_len != 42 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 42) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (VARIABLE_ENTRY_SIZE) +
 	                                (VARIABLE_ENTRY_SIZE / 2) +
-	                                (LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((1 * (3 * VARIABLE_ENTRY_SIZE / 4)) +
+	                                (LARGE_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)) ) ) {
+					 (2 * LARGE_ENTRY_SIZE)))) {
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 3.";
 	}
@@ -9893,7 +9920,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Now load another large entry.  This should result in the eviction
 	 * of (VET, 4), the increase in the size of (VET, 0) from .75
@@ -9941,16 +9968,16 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2);
 	unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, H5C__DIRTIED_FLAG);
 
-	if ( ( cache_ptr->index_len != 42 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 42) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (2 * VARIABLE_ENTRY_SIZE) +
 	                                (3 * VARIABLE_ENTRY_SIZE / 4) +
-	                                (2 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((3 * VARIABLE_ENTRY_SIZE / 4) +
+	                                (2 * LARGE_ENTRY_SIZE)) ||
+	     (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)) ) ) {
+				         (3 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 4.";
@@ -9963,7 +9990,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* load two more large entries.  This should result in (VET, 5) being
 	 * flushed, and increasing its size from 1/4 VARIABLE_ENTRY_SIZE to
@@ -10023,17 +10050,17 @@ 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 != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (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) +
+	                                (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)) ) ) {
+				         (5 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 5.";
@@ -10046,7 +10073,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* now touch all the non VARIABLE_ENTRY_TYPE entries in the
 	 * cache to bring all the VARIABLE_ENTRY_TYPE entries to the
@@ -10055,30 +10082,30 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 * 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++ )
+	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);
 	}
 
-	for ( i = 0; i < 5; i++ )
+	for (i = 0; i < 5; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (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) +
+	                                (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)) ) ) {
+				         (5 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 6.";
@@ -10091,7 +10118,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Now load three more large entries.  This should result
 	 * in the evictions of (VET, 1), (VET, 3), and (VET, 5), and the
@@ -10136,23 +10163,23 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
         num_large_entries = 8;
 
-	for ( i = 5; i < 8; i++ )
+	for (i = 5; i < 8; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (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) +
+	                                (7 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 2) +
 					 (2 * VARIABLE_ENTRY_SIZE) +
 					 (31 * MONSTER_ENTRY_SIZE) +
-					 (8 * LARGE_ENTRY_SIZE)) ) ) {
+					 (8 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 7.";
@@ -10165,7 +10192,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* load another large entry.  (VET, 6) should be evicted.
 	 *
@@ -10203,22 +10230,22 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
         num_large_entries = 9;
 
-	for ( i = 8; i < 9; i++ )
+	for (i = 8; i < 9; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (3 * VARIABLE_ENTRY_SIZE) -
 					(VARIABLE_ENTRY_SIZE / 2) +
-	                                (8 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE / 2) +
+	                                (8 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE / 2) +
 				         (2 * VARIABLE_ENTRY_SIZE) +
 				         (31 * MONSTER_ENTRY_SIZE) +
-				         (9 * LARGE_ENTRY_SIZE)) ) ) {
+				         (9 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 8.";
@@ -10231,7 +10258,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Load another large entry.
 	 *
@@ -10272,20 +10299,20 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
         num_large_entries = 10;
 
-	for ( i = 9; i < 10; i++ )
+	for (i = 9; i < 10; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (4 * VARIABLE_ENTRY_SIZE) +
-	                                (9 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
+	                                (9 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
 				         (31 * MONSTER_ENTRY_SIZE) +
-				         (10 * LARGE_ENTRY_SIZE)) ) ) {
+				         (10 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 9.";
@@ -10298,7 +10325,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the
 	 * cache to bring all the VARIABLE_ENTRY_TYPE entries to the
@@ -10307,26 +10334,26 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 * Both (VET, 0) and (VET, 7) have been unpinned, so they are
 	 * now in the LRU list.
 	 */
-	for ( i = 0; i < 31; i++ )
+	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);
 	}
 
-	for ( i = 0; i < 10; i++ )
+	for (i = 0; i < 10; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 43 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 43) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (4 * VARIABLE_ENTRY_SIZE) +
-	                                (9 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
+	                                (9 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
 				         (31 * MONSTER_ENTRY_SIZE) +
-				         (10 * LARGE_ENTRY_SIZE)) ) ) {
+				         (10 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 10.";
@@ -10339,7 +10366,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* load two more large entries.  Things get a bit complicated here,
 	 * so I'll go through the operation step by step.
@@ -10367,14 +10394,28 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
          * 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, 
+	 * then attempts to evict entries to make space for it.  
+         *
+         * However, H5C_make_space_in_cache() now exits without taking
+         * any action on re-entrant calls.  Thus H5C_protect(VET, 8) simply
+         * loads the entry into the cache -- resulting in a cache that is
+         * 10 KB oversize.  The subsequent unprotect puts (VET, 8) at the 
+         * head of the LRU and marks it dirty.
+         *
+         * After (VET, 9) is serialized, it is flushed, and moved to the 
+         * head of the LRU.
+         *
+         * At this point, the H5C_make_space_in_cache() call made by 
+         * H5C_protect(LET, 11) now has 14 KB of space to make.
+         *
+         * The next entries on the LRU are (MET, 0) thru (MET, 30),
+         * (LET, 0) thru (LET, 10), and (VET, 8) -- 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).
+	 * is clean, and is therefore evicted, leaving H5C_make_space_in_cache()
+         * with 4 KB of space to create.
+         *
 	 * 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).
@@ -10383,22 +10424,10 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
          * 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.
+         * (VET, 0) is the next item on the LRU -- it is clean and is therefore
+         * evicted -- leaving 6 KB of free space after (LET, 11) is inserted
+         * into the cache.
          *
-         * 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.
-	 *
-	 * (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.
-	 *
 	 * H5C_unprotect(LET, 11) marks (LET, 11) as unprotected, and then
 	 * returns as well.
 	 *
@@ -10424,9 +10453,9 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 7)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 8)	Y	10 KB	Y	N	-	-
+	 * (VET, 8)	Y	10 KB	N	N	-	-
 	 *
-	 * (VET, 9)	Y	10 KB	N	N	-	-
+	 * (VET, 9)	N	10 KB	N	N	-	-
 	 *
 	 * Start by updating the expected table for the expected changes in
 	 * entry status:
@@ -10445,47 +10474,44 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	expected[0].serialized   = TRUE;
 	expected[0].destroyed    = TRUE;
 	expected[8].in_cache	 = TRUE;
-	expected[8].is_dirty     = TRUE;
+	expected[8].is_dirty     = FALSE;
 	expected[8].deserialized = TRUE;
-	expected[8].serialized   = FALSE;
+	expected[8].serialized   = TRUE;
 	expected[8].destroyed    = FALSE;
-	expected[9].in_cache     = TRUE;
+	expected[9].in_cache     = FALSE;
 	expected[9].is_dirty     = FALSE;
 	expected[9].serialized   = TRUE;
-	expected[9].destroyed    = FALSE;
+	expected[9].destroyed    = TRUE;
 
-	expected[10].in_cache     = FALSE;
+	expected[10].in_cache     = TRUE;
 	expected[10].is_dirty     = FALSE;
 	expected[10].serialized   = TRUE;
-	expected[10].destroyed    = TRUE;
+	expected[10].destroyed    = FALSE;
 
         num_large_entries = 12;
 
-	/* a newly loaded entry is not inserted in the cache until after
-	 * space has been made for it.  Thus (LET, 11) will not be flushed.
-	 */
-	for ( i = num_variable_entries;
+	for (i = num_variable_entries;
 	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
-	      i++ )
+	      i++)
 	{
             expected[i].is_dirty   = FALSE;
 	    expected[i].serialized = TRUE;
 	}
 
-	for ( i = 10; i < 12; i++ )
+	for (i = 10; i < 12; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size  */
-	if ( ( cache_ptr->index_len != 44 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
-                                        (2 * VARIABLE_ENTRY_SIZE) -
-                                        (10 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
-					 (30 * MONSTER_ENTRY_SIZE) +
-					 (12 * LARGE_ENTRY_SIZE)) ) ) {
+	if((cache_ptr->index_len != 44) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
+                                        (2 * 1024) -
+                                        (1 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) +
+					 (31 * MONSTER_ENTRY_SIZE) +
+					 (12 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 11.";
@@ -10494,15 +10520,27 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	/* verify entry status */
 	verify_entry_status(cache_ptr,
 			    9,
-                            (num_variable_entries + num_monster_entries + num_large_entries),
+                            (num_variable_entries + num_monster_entries + 
+                             num_large_entries),
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
+
+        /* protect and unprotect VET 9 to evict MET 0 */
+        protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 9);
+        unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 9, H5C__NO_FLAGS_SET);
+
+        /* protect and unprotect VET 8 to dirty it and move it to the 
+         * top of the LRU.  Since we are dirtying it again, reset its 
+         * serialized flag.
+         */
+        base_addr = entries[VARIABLE_ENTRY_TYPE];
+        entry_ptr = &(base_addr[8]);
+        entry_ptr->serialized = FALSE;
 
-        /* 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);
+        unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8, H5C__DIRTIED_FLAG);
 
 
         /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the
@@ -10514,40 +10552,48 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
         /* skip MET 0 in first pass so that we evict VET 9 when we 
          * reload MET 0 
+         *
+         * Since we are reloading MET 0, reset its destroyed flag.
          */
-	for ( i = 1; i < num_monster_entries; i++ )
+        base_addr = entries[MONSTER_ENTRY_TYPE];
+        entry_ptr = &(base_addr[0]);
+        entry_ptr->destroyed = FALSE;
+
+	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);
 	}
 
-	for ( i = 0; i < num_large_entries; i++ )
+	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);
 	}
 
-	for ( i = 0; i < num_monster_entries; i++ )
+	for (i = 0; i < num_monster_entries; i++)
 	{
 	    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++ )
+	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;
+	for (i = num_variable_entries;
 	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
-	      i++ )
+	      i++)
 	{
             expected[i].is_dirty = TRUE;
 	}
 
-        /* update MET 0 to set its in cache flag, and reset the its destroyed flag */
+        /* update MET 0 to set its in cache flag, and reset 
+         * its destroyed flag 
+         */
         expected[10].in_cache     = TRUE;
 
         /* pass through non variable entries will flush VET 8, and evict VET 9.
@@ -10564,13 +10610,13 @@ 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) -
+	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) +
+	                                (11 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) +
 					 (31 * MONSTER_ENTRY_SIZE) +
-					 (12 * LARGE_ENTRY_SIZE)) ) ) {
+					 (12 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 12.";
@@ -10589,7 +10635,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 			    expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* Load two more large entries.
 	 *
@@ -10639,27 +10685,27 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	/* a newly loaded entry is not inserted in the cache until after
 	 * space has been made for it.  Thus (LET, 13) will not be flushed.
 	 */
-	for ( i = num_variable_entries;
+	for (i = num_variable_entries;
 	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
-	      i++ )
+	      i++)
 	{
             expected[i].is_dirty   = FALSE;
 	    expected[i].serialized = TRUE;
 	}
 
-	for ( i = 12; i < 14; i++ )
+	for (i = 12; i < 14; i++)
 	{
 	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
         /* verify cache size  */
-	if ( ( cache_ptr->index_len != 45 ) ||
-             ( cache_ptr->index_size != (2 * 1024 * 1024) -
+	if((cache_ptr->index_len != 45) ||
+             (cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (6 * VARIABLE_ENTRY_SIZE) +
-	                                (13 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((31 * MONSTER_ENTRY_SIZE) +
-					 (14 * LARGE_ENTRY_SIZE)) ) ) {
+	                                (13 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->index_size != ((31 * MONSTER_ENTRY_SIZE) +
+					 (14 * LARGE_ENTRY_SIZE)))) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 13.";
@@ -10684,17 +10730,17 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
      * flush the cache and end the test.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        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";
@@ -10711,78 +10757,78 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
      * to start testing the stats whenever it is convenient to do
      * so.
      */
-    if ( pass ) {
-
-	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] != 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] != 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] != 6 ) ||
-             ( cache_ptr->entry_flush_size_changes[VARIABLE_ENTRY_TYPE] != 1 ) ||
-             ( cache_ptr->cache_flush_size_changes[VARIABLE_ENTRY_TYPE] != 0 ) ) {
+    if(pass) {
+
+	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] != 9) ||
+             (cache_ptr->evictions[VARIABLE_ENTRY_TYPE] != 12) ||
+             (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] != 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] != 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 in check_flush_cache__flush_op_eviction_test().";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	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] != 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 ) ||
-             ( cache_ptr->pins[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->unpins[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->dirty_pins[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->pinned_flushes[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->pinned_clears[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->size_increases[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->size_decreases[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->entry_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ) {
+	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] != 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) ||
+             (cache_ptr->pins[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->unpins[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->dirty_pins[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->pinned_flushes[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->pinned_clears[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->size_increases[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->size_decreases[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->entry_flush_size_changes[LARGE_ENTRY_TYPE] != 0) ||
+             (cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected large entry stats in check_flush_cache__flush_op_eviction_test().";
         }
     }
 
-    if ( pass ) {
+    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] != 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 ) ||
-             ( 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 ) ) {
+	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] != 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) ||
+             (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 check_flush_cache__flush_op_eviction_test().";
@@ -10790,7 +10836,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass ) {
+    if(pass) {
 
 	reset_entries();
     }
@@ -10828,19 +10874,19 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
 {
     H5C_t * cache_ptr = file_ptr->shared->cache;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         failure_mssg = "cache_ptr NULL on entry to single entry case.";
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         failure_mssg = "cache not empty at beginning of single entry case.";
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10854,10 +10900,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10871,10 +10917,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10888,10 +10934,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10905,10 +10951,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10922,10 +10968,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10939,10 +10985,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10956,10 +11002,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10973,10 +11019,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -10991,10 +11037,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11009,10 +11055,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11027,10 +11073,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11045,10 +11091,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11063,10 +11109,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11081,10 +11127,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11100,10 +11146,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11119,10 +11165,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11136,10 +11182,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11153,10 +11199,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11170,10 +11216,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11187,10 +11233,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11204,10 +11250,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11221,10 +11267,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11238,10 +11284,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11255,10 +11301,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11273,10 +11319,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11291,10 +11337,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11309,10 +11355,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11327,10 +11373,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11345,10 +11391,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11363,10 +11409,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11382,10 +11428,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11401,10 +11447,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ TRUE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11418,10 +11464,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11435,10 +11481,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11452,10 +11498,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11469,10 +11515,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11486,10 +11532,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11503,10 +11549,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11520,10 +11566,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11537,10 +11583,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11555,10 +11601,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11573,10 +11619,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11591,10 +11637,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11609,10 +11655,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11627,10 +11673,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11645,10 +11691,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11664,10 +11710,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11683,10 +11729,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11700,10 +11746,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11717,10 +11763,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11734,10 +11780,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11751,10 +11797,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11768,10 +11814,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11785,10 +11831,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11802,10 +11848,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11819,10 +11865,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11837,10 +11883,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11855,10 +11901,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11873,10 +11919,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11891,10 +11937,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ FALSE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11909,10 +11955,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11927,10 +11973,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ TRUE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11946,10 +11992,10 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
-    if ( pass ) {
+    if(pass) {
 
         check_flush_cache__single_entry_test
         (
@@ -11965,7 +12011,7 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             /* expected_deserialized */ FALSE,
             /* expected_serialized   */ FALSE,
             /* expected_destroyed    */ TRUE
-        );
+       );
     }
 
 
@@ -12028,7 +12074,7 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
      * H5C__SET_FLUSH_MARKER_FLAG apply here as well.
      */
 
-    if ( pass ) {
+    if(pass) {
 
 	int i;
 	struct pinned_single_entry_test_spec
@@ -12309,7 +12355,7 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
 	  { 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 ) )
+	while(pass && (i < 256))
 	{
 	    check_flush_cache__pinned_single_entry_test
 	    (
@@ -12326,7 +12372,7 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
                 /* flush_flags           */ spec[i].flush_flags,
                 /* expected_serialized   */ spec[i].expected_serialized,
                 /* expected_destroyed    */ spec[i].expected_destroyed
-            );
+           );
 	    i++;
 	}
     }
@@ -12369,7 +12415,7 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
     test_entry_t * base_addr;
     test_entry_t * entry_ptr = NULL;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12377,8 +12423,8 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12386,8 +12432,8 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-              ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) {
+    else if((entry_type < 0) || (entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+              (entry_idx < 0) || (entry_idx > max_indices[entry_type])) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12396,12 +12442,12 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
         failure_mssg = msg;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         base_addr = entries[entry_type];
         entry_ptr = &(base_addr[entry_idx]);
 
-        if ( insert_flag ) {
+        if(insert_flag) {
 
             insert_entry(file_ptr, entry_type, entry_idx, flags);
 
@@ -12413,11 +12459,11 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, flush_flags);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12425,9 +12471,9 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                        flush_flags, test_num);
             failure_mssg = msg;
         }
-        else if ( ( entry_ptr->deserialized != expected_deserialized ) ||
-                  ( entry_ptr->serialized != expected_serialized ) ||
-                  ( entry_ptr->destroyed != expected_destroyed ) ) {
+        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,
@@ -12445,22 +12491,22 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                 test_num);
             failure_mssg = msg;
         }
-        else if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
+        else if((((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0)
                     &&
-                    ( ( cache_ptr->index_len != 1 )
+                    ((cache_ptr->index_len != 1)
                       ||
-                      ( cache_ptr->index_size != entry_sizes[entry_type] )
-                    )
-                  )
+                      (cache_ptr->index_size != entry_sizes[entry_type])
+                   )
+                 )
                   ||
-                  ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 )
+                  (((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0)
                     &&
-                    ( ( cache_ptr->index_len != 0 )
+                    ((cache_ptr->index_len != 0)
                       ||
-                      ( cache_ptr->index_size != 0 )
-                    )
-                  )
-                ) {
+                      (cache_ptr->index_size != 0)
+                   )
+                 )
+               ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12472,11 +12518,11 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
 
 
     /* clean up the cache to prep for the next test */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12484,8 +12530,8 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                        test_num);
             failure_mssg = msg;
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        else if((cache_ptr->index_len != 0) ||
+                  (cache_ptr->index_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12551,7 +12597,7 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
     test_entry_t * base_addr;
     test_entry_t * entry_ptr = NULL;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12559,8 +12605,8 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                    test_num);
         failure_mssg = msg;
     }
-    else if ( ( cache_ptr->index_len != 0 ) ||
-              ( cache_ptr->index_size != 0 ) ) {
+    else if((cache_ptr->index_len != 0) ||
+              (cache_ptr->index_size != 0)) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12568,8 +12614,8 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                test_num);
         failure_mssg = msg;
     }
-    else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) ||
-              ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) {
+    else if((entry_type < 0) || (entry_type >= NUMBER_OF_ENTRY_TYPES) ||
+              (entry_idx < 0) || (entry_idx > max_indices[entry_type])) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
@@ -12578,14 +12624,14 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
         failure_mssg = msg;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         base_addr = entries[entry_type];
         entry_ptr = &(base_addr[entry_idx]);
 
         protect_entry(file_ptr, entry_type, entry_idx);
 
-	if ( pop_mark_dirty_prot ) {
+	if(pop_mark_dirty_prot) {
 
 	    mark_entry_dirty(entry_type, entry_idx);
 	}
@@ -12594,22 +12640,22 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                 (unprot_dirty_flag ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET) |
                 (flags | H5C__PIN_ENTRY_FLAG));
 
-	if ( mark_dirty ) {
+	if(mark_dirty) {
 
             mark_entry_dirty(entry_type, entry_idx);
 	}
 
-	if ( pop_mark_dirty_pinned ) {
+	if(pop_mark_dirty_pinned) {
 
 	    mark_entry_dirty(entry_type, entry_idx);
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, flush_flags);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12617,9 +12663,9 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                flush_flags, test_num);
             failure_mssg = msg;
         }
-        else if ( ( entry_ptr->deserialized != expected_deserialized ) ||
-                  ( entry_ptr->serialized != expected_serialized ) ||
-                  ( entry_ptr->destroyed != expected_destroyed ) ) {
+        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,
               "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
@@ -12636,22 +12682,22 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                 test_num);
             failure_mssg = msg;
         }
-        else if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
+        else if((((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0)
                     &&
-                    ( ( cache_ptr->index_len != 1 )
+                    ((cache_ptr->index_len != 1)
                       ||
-                      ( cache_ptr->index_size != entry_sizes[entry_type] )
-                    )
-                  )
+                      (cache_ptr->index_size != entry_sizes[entry_type])
+                   )
+                 )
                   ||
-                  ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 )
+                  (((flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0)
                     &&
-                    ( ( cache_ptr->index_len != 0 )
+                    ((cache_ptr->index_len != 0)
                       ||
-                      ( cache_ptr->index_size != 0 )
-                    )
-                  )
-                ) {
+                      (cache_ptr->index_size != 0)
+                   )
+                 )
+               ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12663,9 +12709,9 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 
 
     /* clean up the cache to prep for the next test */
-    if ( pass ) {
+    if(pass) {
 
-        if ( unprotect_unpin ) {
+        if(unprotect_unpin) {
 
             protect_entry(file_ptr, entry_type, entry_idx);
 
@@ -12680,11 +12726,11 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12692,8 +12738,8 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                     test_num);
             failure_mssg = msg;
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        else if((cache_ptr->index_len != 0) ||
+                  (cache_ptr->index_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -12730,7 +12776,7 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
  */
 
 static unsigned
-check_get_entry_status(void)
+check_get_entry_status(unsigned paged)
 {
     static char   msg[128];
     herr_t        result;
@@ -12743,18 +12789,20 @@ check_get_entry_status(void)
     test_entry_t * base_addr = NULL;
     test_entry_t * entry_ptr = NULL;
 
-    TESTING("H5C_get_entry_status() functionality");
+    if(paged)
+        TESTING("H5C_get_entry_status() functionality (paged aggregation)")
+    else
+        TESTING("H5C_get_entry_status() functionality")
 
     pass = TRUE;
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
 
-        if ( file_ptr == NULL ) {
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "file_ptr NULL from setup_cache.";
@@ -12768,23 +12816,23 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* entry not in cache -- only in_cache should be touched by
          * the call.  Thus, only check that boolean.
          */
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 1.");
             failure_mssg = msg;
 
-	} else if ( in_cache ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
@@ -12792,7 +12840,7 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 0);
 
@@ -12800,19 +12848,19 @@ check_get_entry_status(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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.");
@@ -12820,25 +12868,25 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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 || 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 3.");
@@ -12846,25 +12894,25 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         unprotect_entry(file_ptr, 0, 0, H5C__PIN_ENTRY_FLAG);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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 || 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 4.");
@@ -12872,25 +12920,25 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         mark_entry_dirty(0, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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.");
@@ -12898,25 +12946,25 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         unpin_entry(0, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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 || !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 6.");
@@ -12924,14 +12972,14 @@ check_get_entry_status(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -12959,7 +13007,7 @@ check_get_entry_status(void)
  */
 
 static unsigned
-check_expunge_entry(void)
+check_expunge_entry(unsigned paged)
 {
     static char   msg[128];
     herr_t        result;
@@ -12972,22 +13020,24 @@ check_expunge_entry(void)
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
 
-    TESTING("H5C_expunge_entry() functionality");
+    if(paged)
+        TESTING("H5C_expunge_entry() functionality (paged aggregation)")
+    else
+        TESTING("H5C_expunge_entry() functionality")
 
     pass = TRUE;
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
 
         base_addr = entries[0];
         entry_ptr = &(base_addr[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* entry not in cache -- only in_cache should be touched by
          * the status call.  Thus, only check that boolean.
@@ -12995,24 +13045,24 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 1.");
             failure_mssg = msg;
 
-	} else if ( in_cache ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
             failure_mssg = msg;
 
-        } else if ( ( entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 1.");
@@ -13025,7 +13075,7 @@ check_expunge_entry(void)
      * it without marking it dirty.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 0);
 
@@ -13033,27 +13083,27 @@ check_expunge_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( 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.");
@@ -13066,37 +13116,37 @@ check_expunge_entry(void)
      * Also verify that the entry was loaded and destroyed, but
      * not flushed.
      */
-    if ( pass ) {
+    if(pass) {
 
         expunge_entry(file_ptr, 0, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* entry shouldn't be in cache -- only in_cache should be touched
 	 * by the status call.  Thus, only check that boolean.
          */
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, 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;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! 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.");
@@ -13112,7 +13162,7 @@ check_expunge_entry(void)
     base_addr = entries[0];
     entry_ptr = &(base_addr[1]);
 
-    if ( pass ) {
+    if(pass) {
 
         /* entry not in cache -- only in_cache should be touched by
          * the status call.  Thus, only check that boolean.
@@ -13120,24 +13170,24 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, 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->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 4.");
@@ -13150,7 +13200,7 @@ check_expunge_entry(void)
      * it with the dirty flag set.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 1);
 
@@ -13158,28 +13208,28 @@ check_expunge_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, 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->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 5.");
@@ -13192,13 +13242,13 @@ check_expunge_entry(void)
      * Also verify that the entry was loaded and destroyed, but not
      * flushed.
      */
-    if ( pass ) {
+    if(pass) {
 
         expunge_entry(file_ptr, 0, 1);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* entry shouldn't be in cache -- only in_cache should be touched
 	 * by the status call.  Thus, only check that boolean.
@@ -13206,24 +13256,24 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, 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->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 6.");
@@ -13232,14 +13282,14 @@ check_expunge_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -13268,7 +13318,7 @@ check_expunge_entry(void)
  *-------------------------------------------------------------------------
  */
 static unsigned
-check_multiple_read_protect(void)
+check_multiple_read_protect(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
 #if H5C_COLLECT_CACHE_STATS
@@ -13276,7 +13326,10 @@ check_multiple_read_protect(void)
 #endif /* H5C_COLLECT_CACHE_STATS */
     test_entry_t * entry_ptr;
 
-    TESTING("multiple read only protects on a single entry");
+    if(paged)
+        TESTING("multiple read only protects on a single entry (paged aggregation)")
+    else
+        TESTING("multiple read only protects on a single entry")
 
     pass = TRUE;
 
@@ -13301,21 +13354,20 @@ check_multiple_read_protect(void)
      * Also, verify internal state of read protects at every step.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 #if H5C_COLLECT_CACHE_STATS
         cache_ptr = file_ptr->shared->cache;
 #endif /* H5C_COLLECT_CACHE_STATS */
 
         entry_ptr = &((entries[0])[0]);
 
-        if ( ( entry_ptr->header.is_protected ) ||
- 	     ( entry_ptr->header.is_read_only ) ||
-	     ( entry_ptr->header.ro_ref_count != 0 ) ) {
+        if((entry_ptr->header.is_protected) ||
+ 	     (entry_ptr->header.is_read_only) ||
+	     (entry_ptr->header.ro_ref_count != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 1.\n";
@@ -13323,22 +13375,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 0 ) ||
-	 ( cache_ptr->max_read_protects[0] != 0 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 0) ||
+	 (cache_ptr->max_read_protects[0] != 0)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 1.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         protect_entry_ro(file_ptr, 0, 0);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 1 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 1)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 2.\n";
@@ -13346,22 +13398,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 1 ) ||
-	 ( cache_ptr->max_read_protects[0] != 1 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 1) ||
+	 (cache_ptr->max_read_protects[0] != 1)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 2.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         protect_entry_ro(file_ptr, 0, 0);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 2 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 2)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 3.\n";
@@ -13369,22 +13421,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 2 ) ||
-	 ( cache_ptr->max_read_protects[0] != 2 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 2) ||
+	 (cache_ptr->max_read_protects[0] != 2)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 3.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 1 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 1)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 4.\n";
@@ -13392,22 +13444,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 2 ) ||
-	 ( cache_ptr->max_read_protects[0] != 2 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 2) ||
+	 (cache_ptr->max_read_protects[0] != 2)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 4.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         protect_entry_ro(file_ptr, 0, 0);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 2 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 2)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 5.\n";
@@ -13415,22 +13467,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 3 ) ||
-	 ( cache_ptr->max_read_protects[0] != 2 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 3) ||
+	 (cache_ptr->max_read_protects[0] != 2)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 5.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         protect_entry_ro(file_ptr, 0, 0);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 3 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 3)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 6.\n";
@@ -13438,22 +13490,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 6.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 2 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 2)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 7.\n";
@@ -13461,22 +13513,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 7.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( ! ( entry_ptr->header.is_read_only ) ) ||
-	     ( entry_ptr->header.ro_ref_count != 1 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (!(entry_ptr->header.is_read_only)) ||
+	     (entry_ptr->header.ro_ref_count != 1)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 8.\n";
@@ -13484,22 +13536,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 8.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( entry_ptr->header.is_protected ) ||
- 	     ( entry_ptr->header.is_read_only ) ||
-	     ( entry_ptr->header.ro_ref_count != 0 ) ) {
+        if((entry_ptr->header.is_protected) ||
+ 	     (entry_ptr->header.is_read_only) ||
+	     (entry_ptr->header.ro_ref_count != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 9.\n";
@@ -13507,9 +13559,9 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 0 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 0) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 9.\n";
@@ -13521,13 +13573,13 @@ check_multiple_read_protect(void)
      * that the stats are getting collected properly here as well.
      */
 
-    if ( pass )
+    if(pass)
     {
         protect_entry(file_ptr, 0, 0);
 
-        if ( ( ! ( entry_ptr->header.is_protected ) ) ||
- 	     ( entry_ptr->header.is_read_only ) ||
-	     ( entry_ptr->header.ro_ref_count != 0 ) ) {
+        if((!(entry_ptr->header.is_protected)) ||
+ 	     (entry_ptr->header.is_read_only) ||
+	     (entry_ptr->header.ro_ref_count != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 10.\n";
@@ -13535,22 +13587,22 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 1 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 1) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 10.\n";
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass )
+    if(pass)
     {
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( entry_ptr->header.is_protected ) ||
- 	     ( entry_ptr->header.is_read_only ) ||
-	     ( entry_ptr->header.ro_ref_count != 0 ) ) {
+        if((entry_ptr->header.is_protected) ||
+ 	     (entry_ptr->header.is_read_only) ||
+	     (entry_ptr->header.ro_ref_count != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected ro protected status 11.\n";
@@ -13558,9 +13610,9 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 1 ) ||
-	 ( cache_ptr->read_protects[0] != 4 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 1) ||
+	 (cache_ptr->read_protects[0] != 4) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 11.\n";
@@ -13576,7 +13628,7 @@ check_multiple_read_protect(void)
      * at the end to ensure that all is at it should be.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 2);		/* (0,2) write */
         protect_entry_ro(file_ptr, 0, 4);      /* (0,4) read only (1) */
@@ -13603,16 +13655,16 @@ check_multiple_read_protect(void)
         unprotect_entry(file_ptr, 0, 1,         /* (0,1) unprotect */
 			H5C__NO_FLAGS_SET);
 
-	if ( pass ) {
+	if(pass) {
 
 	    entry_ptr = &((entries[0])[4]);
 
-	    if ( H5C_pin_protected_entry((void *)entry_ptr) < 0 ) {
+	    if(H5C_pin_protected_entry((void *)entry_ptr) < 0) {
 
 	        pass = FALSE;
 	        failure_mssg = "H5C_pin_protected_entry() failed.\n";
 
-	    } else if ( ! (entry_ptr->header.is_pinned) ) {
+	    } else if(!(entry_ptr->header.is_pinned)) {
 
 	        pass = FALSE;
 	        failure_mssg = "entry (0,4) not pinned.\n";
@@ -13630,7 +13682,7 @@ check_multiple_read_protect(void)
         unprotect_entry(file_ptr, 0, 4,         /* (0,4) read only (1) */
 			H5C__UNPIN_ENTRY_FLAG);
 
-        if ( ( pass ) && ( entry_ptr->header.is_pinned ) ) {
+        if(pass && (entry_ptr->header.is_pinned)) {
 
             pass = FALSE;
             failure_mssg = "enty (0,4) still pinned.\n";
@@ -13646,9 +13698,9 @@ check_multiple_read_protect(void)
     }
 
 #if H5C_COLLECT_CACHE_STATS
-    if ( ( cache_ptr->write_protects[0] != 5 ) ||
-	 ( cache_ptr->read_protects[0] != 9 ) ||
-	 ( cache_ptr->max_read_protects[0] != 3 ) ) {
+    if((cache_ptr->write_protects[0] != 5) ||
+	 (cache_ptr->read_protects[0] != 9) ||
+	 (cache_ptr->max_read_protects[0] != 3)) {
 
 	pass = FALSE;
 	failure_mssg = "Unexpected protect stats 11.\n";
@@ -13656,14 +13708,14 @@ check_multiple_read_protect(void)
 #endif /* H5C_COLLECT_CACHE_STATS */
 
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -13686,45 +13738,46 @@ check_multiple_read_protect(void)
  * Programmer:	John Mainzer
  *              4/26/06
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-check_move_entry(void)
+check_move_entry(unsigned paged)
 {
-    int          i;
+    unsigned          u;
     H5F_t *      file_ptr = NULL;
     struct move_entry_test_spec test_specs[4] =
     {
       {
-        /* int     entry_type  = */ PICO_ENTRY_TYPE,
-        /* int     entry_index = */ 10,
-	/* hbool_t is_dirty    = */ FALSE,
-	/* hbool_t is_pinned   = */ FALSE
+        /* int     entry_type      = */ PICO_ENTRY_TYPE,
+        /* int     entry_index     = */ 10,
+	/* hbool_t is_pinned       = */ FALSE,
+	/* hbool_t is_protected    = */ FALSE
       },
       {
-        /* int     entry_type  = */ PICO_ENTRY_TYPE,
-        /* int     entry_index = */ 20,
-	/* hbool_t is_dirty    = */ TRUE,
-	/* hbool_t is_pinned   = */ FALSE
+        /* int     entry_type      = */ PICO_ENTRY_TYPE,
+        /* int     entry_index     = */ 20,
+	/* hbool_t is_pinned       = */ TRUE,
+	/* hbool_t is_protected    = */ FALSE
       },
       {
-        /* int     entry_type  = */ PICO_ENTRY_TYPE,
-        /* int     entry_index = */ 30,
-	/* hbool_t is_dirty    = */ FALSE,
-	/* hbool_t is_pinned   = */ TRUE
+        /* int     entry_type      = */ PICO_ENTRY_TYPE,
+        /* int     entry_index     = */ 30,
+	/* hbool_t is_pinned       = */ FALSE,
+	/* hbool_t is_protected    = */ TRUE
       },
       {
-        /* int     entry_type  = */ PICO_ENTRY_TYPE,
-        /* int     entry_index = */ 40,
-	/* hbool_t is_dirty    = */ TRUE,
-	/* hbool_t is_pinned   = */ TRUE
-      }
+        /* int     entry_type      = */ PICO_ENTRY_TYPE,
+        /* int     entry_index     = */ 40,
+	/* hbool_t is_pinned       = */ TRUE,
+	/* hbool_t is_protected    = */ TRUE
+      },
     };
 
-    TESTING("H5C_move_entry() functionality");
+    if(paged)
+        TESTING("H5C_move_entry() functionality (paged aggregation)")
+    else
+        TESTING("H5C_move_entry() functionality")
 
     pass = TRUE;
 
@@ -13734,13 +13787,13 @@ check_move_entry(void)
      *
      * At present, we should do the following tests:
      *
-     * 1) Move a clean, unprotected, unpinned entry.
+     * 1) Move an unprotected, unpinned entry.
      *
-     * 2) Move a dirty, unprotected, unpinned entry.
+     * 2) Move an unprotected, pinned entry.
      *
-     * 3) Move a clean, unprotected, pinned entry.
+     * 3) Move a protected, unpinned entry.
      *
-     * 4) Move a dirty, unprotected, pinned entry.
+     * 4) Move a protected, pinned entry.
      *
      * In all cases, the entry should have moved to its
      * new location, and have been marked dirty if it wasn't
@@ -13753,36 +13806,33 @@ check_move_entry(void)
      * list.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
     }
 
-    i = 0;
-    while ( ( pass ) && ( i < 4 ) )
+    u = 0;
+    while(pass && (u < NELMTS(test_specs)))
     {
-        check_move_entry__run_test(file_ptr, i, &(test_specs[i]));
-	i++;
+        check_move_entry__run_test(file_ptr, u, &(test_specs[u]));
+	u++;
     }
 
-    if ( pass ) {
-
+    if(pass)
         takedown_cache(file_ptr, FALSE, FALSE);
-    }
-
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(pass)
+        PASSED()
+    else
+        H5_FAILED()
 
+    if(!pass)
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
-    }
 
     return (unsigned)!pass;
-
 } /* check_move_entry() */
 
 

@@ -13807,7 +13857,7 @@ check_move_entry(void)
 
 static void
 check_move_entry__run_test(H5F_t * file_ptr,
-                             int test_num,
+                             unsigned test_num,
                              struct move_entry_test_spec * spec_ptr)
 {
     H5C_t *       cache_ptr = file_ptr->shared->cache;
@@ -13817,121 +13867,149 @@ check_move_entry__run_test(H5F_t * file_ptr,
     test_entry_t * entry_ptr = NULL;
     H5C_cache_entry_t * test_ptr = NULL;
 
-    if ( cache_ptr == NULL ) {
+    if(cache_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
-                   "cache_ptr NULL on entry to move test #%d.",
+                   "cache_ptr NULL on entry to move test #%u.",
                    test_num);
         failure_mssg = msg;
 
-    } else if ( spec_ptr == NULL ) {
+    } else if(spec_ptr == NULL) {
 
         pass = FALSE;
         HDsnprintf(msg, (size_t)128,
-                   "spec_ptr NULL on entry to move test #%d.",
+                   "spec_ptr NULL on entry to move test #%u.",
                    test_num);
         failure_mssg = msg;
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         base_addr = entries[spec_ptr->entry_type];
         entry_ptr = &(base_addr[spec_ptr->entry_index]);
 
-        if ( ( entry_ptr->self != entry_ptr ) ||
-             ( ( entry_ptr->cache_ptr != cache_ptr ) &&
-               ( entry_ptr->cache_ptr != NULL ) ) ||
-             ( ! ( entry_ptr->at_main_addr ) ) ||
-             ( entry_ptr->addr != entry_ptr->main_addr ) ) {
+        if((entry_ptr->self != entry_ptr) ||
+             ((entry_ptr->cache_ptr != cache_ptr) &&
+               (entry_ptr->cache_ptr != NULL)) ||
+             (!(entry_ptr->at_main_addr)) ||
+             (entry_ptr->addr != entry_ptr->main_addr)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
-                       "bad entry_ptr in move test #%d.",
+                       "bad entry_ptr in move test #%u.",
                        test_num);
             failure_mssg = msg;
 
-        } else if ( spec_ptr->is_pinned ) {
-
-            flags |= H5C__PIN_ENTRY_FLAG;
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index);
 
-        if(spec_ptr->is_dirty)
-            flags |= H5C__DIRTIED_FLAG;
+        if(spec_ptr->is_pinned)
+            pin_entry(spec_ptr->entry_type, spec_ptr->entry_index);
 
-        unprotect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index, flags);
+        if(!spec_ptr->is_protected)
+            unprotect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index, flags);
 
         move_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, FALSE);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* verify that the move took place, and that the cache's internal
          * structures are as expected.  Note that some sanity checking is
          * done by move_entry(), so we don't have to repeat it here.
          */
 
-        if ( spec_ptr->is_pinned ) {
+        if(spec_ptr->is_pinned) {
 
-            if ( ! ( entry_ptr->header.is_pinned ) ) {
+            if(!(entry_ptr->header.is_pinned)) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128,
-                           "Pinned entry not pinned after move in test #%d.",
+                           "Pinned entry not pinned after move in test #%u.",
                            test_num);
                 failure_mssg = msg;
             }
 
-            if ( pass ) {
+            if(pass) {
+
+                if(spec_ptr->is_protected) {
+                } /* end if */
+                else {
+                    /* Scan through the pinned entry list, looking for the entry */
+                    test_ptr = cache_ptr->pel_head_ptr;
+                    while((test_ptr != NULL) &&
+                            (test_ptr != (H5C_cache_entry_t *)entry_ptr))
+                        test_ptr = test_ptr->next;
+
+                    if(test_ptr == NULL) {
+
+                        pass = FALSE;
+                        HDsnprintf(msg, (size_t)128,
+                               "Pinned entry not in pel after move in test #%u.",
+                               test_num);
+                        failure_mssg = msg;
+                    }
+                } /* end else */
+            }
 
-                test_ptr = cache_ptr->pel_head_ptr;
+            unpin_entry(spec_ptr->entry_type, spec_ptr->entry_index);
 
-                while ( ( test_ptr != NULL ) &&
-                        ( test_ptr != (H5C_cache_entry_t *)entry_ptr ) )
-                {
-                    test_ptr = test_ptr->next;
-                }
+        } else {
 
-                if ( test_ptr == NULL ) {
+            if(entry_ptr->header.is_pinned) {
 
+                pass = FALSE;
+                HDsnprintf(msg, (size_t)128,
+                           "Unpinned entry pinned after move in test #%u.",
+                           test_num);
+                failure_mssg = msg;
+            }
+
+            if(spec_ptr->is_protected) {
+            } /* end if */
+            else {
+                if((entry_ptr->header.prev != NULL) ||
+                     (cache_ptr->LRU_head_ptr != (H5C_cache_entry_t *)entry_ptr))
+                {
                     pass = FALSE;
                     HDsnprintf(msg, (size_t)128,
-                           "Pinned entry not in pel after move in test #%d.",
-                           test_num);
+                               "Entry not at head of LRU after move in test #%u.",
+                               test_num);
                     failure_mssg = msg;
                 }
-            }
-
-            unpin_entry(spec_ptr->entry_type, spec_ptr->entry_index);
-
-        } else {
+            } /* end else */
+        }
 
-            if ( entry_ptr->header.is_pinned ) {
+        if(spec_ptr->is_protected) {
+            if(!(entry_ptr->header.is_protected)) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128,
-                           "Unpinned entry pinned after move in test #%d.",
+                           "Protected entry not protected after move in test #%u.",
                            test_num);
                 failure_mssg = msg;
             }
 
-            if ( ( entry_ptr->header.prev != NULL ) ||
-                 ( cache_ptr->LRU_head_ptr != (H5C_cache_entry_t *)entry_ptr ) )
-            {
+            unprotect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index, flags);
+
+        } /* end if */
+        else {
+            if(entry_ptr->header.is_protected) {
+
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128,
-                           "Entry not at head of LRU after move in test #%d.",
+                           "Unprotected entry not unprotected after move in test #%u.",
                            test_num);
                 failure_mssg = msg;
             }
-        }
+        } /* end else */
     }
 
     /* put the entry back where it started from */
@@ -13958,7 +14036,7 @@ check_move_entry__run_test(H5F_t * file_ptr,
  */
 
 static unsigned
-check_pin_protected_entry(void)
+check_pin_protected_entry(unsigned paged)
 {
     static char   msg[128];
     herr_t        result;
@@ -13966,7 +14044,10 @@ check_pin_protected_entry(void)
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
 
-    TESTING("H5C_pin_protected_entry() functionality");
+    if(paged)
+        TESTING("H5C_pin_protected_entry() functionality (paged aggregation)")
+    else
+        TESTING("H5C_pin_protected_entry() functionality")
 
     pass = TRUE;
 
@@ -13975,14 +14056,13 @@ check_pin_protected_entry(void)
      * to unpin it, and then destroy the cache.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
 
-        if ( file_ptr == NULL ) {
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "file_ptr NULL from setup_cache.";
@@ -13990,27 +14070,27 @@ check_pin_protected_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, 0, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         base_addr = entries[0];
         entry_ptr = &(base_addr[0]);
 
 	result = H5C_pin_protected_entry((void *)entry_ptr);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_pin_protected_entry() reports failure.");
             failure_mssg = msg;
 
-	} else if ( ! ( entry_ptr->header.is_pinned ) ) {
+	} else if(!(entry_ptr->header.is_pinned)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "entry not pinned when it should be.");
@@ -14024,14 +14104,14 @@ check_pin_protected_entry(void)
 
     unprotect_entry(file_ptr, 0, 0, H5C__UNPIN_ENTRY_FLAG);
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -14057,7 +14137,7 @@ check_pin_protected_entry(void)
  */
 
 static unsigned
-check_resize_entry(void)
+check_resize_entry(unsigned paged)
 {
     static char    msg[128];
     herr_t         result;
@@ -14072,7 +14152,10 @@ check_resize_entry(void)
     test_entry_t * base_addr;
     test_entry_t * entry_ptr = NULL;
 
-    TESTING("entry resize functionality");
+    if(paged)
+        TESTING("entry resize functionality (paged aggregation)")
+    else
+        TESTING("entry resize functionality")
 
     /* Setup a cache and verify that it is empty.
      *
@@ -14107,13 +14190,13 @@ check_resize_entry(void)
 
     /* tests with only one entry in the cache: */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
-        if ( file_ptr == NULL ) {
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
+
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "file_ptr NULL from setup_cache.";
@@ -14129,12 +14212,12 @@ check_resize_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ) {
+	if((cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 1.");
@@ -14143,18 +14226,18 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 1 ) ||
-	     ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ) {
+	if((cache_ptr->index_len != 1) ||
+	     (cache_ptr->index_size != LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0)) {
 
 
             pass = FALSE;
@@ -14164,29 +14247,29 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 1.");
             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 1.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 1.");
@@ -14195,11 +14278,11 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, (LARGE_ENTRY_SIZE / 2));
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "error(s) in H5C_resize_entry().");
@@ -14210,7 +14293,7 @@ check_resize_entry(void)
             result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                        entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-            if ( result < 0 ) {
+            if(result < 0) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 1.");
@@ -14228,12 +14311,12 @@ check_resize_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 1 ) ||
-	     ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 2) ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 2) ) ) {
+	if((cache_ptr->index_len != 1) ||
+	     (cache_ptr->index_size != (LARGE_ENTRY_SIZE / 2)) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 3.");
@@ -14242,30 +14325,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, 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 ||
-		    ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || is_pinned ||
+		    (reported_entry_size != (LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( 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.");
@@ -14274,17 +14357,17 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, LARGE_ENTRY_SIZE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "error(s) in H5C_resize_entry().");
@@ -14295,7 +14378,7 @@ check_resize_entry(void)
             result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                        entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-            if ( result < 0 ) {
+            if(result < 0) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 2.");
@@ -14313,12 +14396,12 @@ check_resize_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 1 ) ||
-	     ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 1) ||
+	     (cache_ptr->index_size != LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 4.");
@@ -14327,30 +14410,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, 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 || !is_dirty || is_protected || is_pinned ||
-		    ( reported_entry_size != LARGE_ENTRY_SIZE ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || is_pinned ||
+		    (reported_entry_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 3.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( 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.");
@@ -14359,7 +14442,7 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
 
@@ -14367,11 +14450,11 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, (LARGE_ENTRY_SIZE / 4));
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -14381,12 +14464,12 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 1 ) ||
-	     ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 4) ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 4) ) ) {
+	if((cache_ptr->index_len != 1) ||
+	     (cache_ptr->index_size != (LARGE_ENTRY_SIZE / 4)) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 4))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 5.");
@@ -14395,30 +14478,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, 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 || !is_dirty || is_protected || ! is_pinned ||
-		    ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || !is_pinned ||
+		    (reported_entry_size != (LARGE_ENTRY_SIZE / 4))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 4.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 4.");
@@ -14427,11 +14510,11 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, LARGE_ENTRY_SIZE);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -14441,12 +14524,12 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 1 ) ||
-	     ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 1) ||
+	     (cache_ptr->index_size != LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 6.");
@@ -14455,30 +14538,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, 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 ||
-		    ( reported_entry_size != LARGE_ENTRY_SIZE ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || !is_pinned ||
+		    (reported_entry_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 5.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 5.");
@@ -14487,7 +14570,7 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
 
@@ -14496,28 +14579,28 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, 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->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 6.");
@@ -14526,12 +14609,12 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ) {
+	if((cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 7.");
@@ -14543,12 +14626,12 @@ check_resize_entry(void)
 
     /* now repeat the above tests with several entries in the cache: */
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ) {
+	if((cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 8.");
@@ -14560,7 +14643,7 @@ check_resize_entry(void)
 	entry_size = LARGE_ENTRY_SIZE;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
@@ -14573,12 +14656,12 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 3 ) ||
-	     ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 3) ||
+	     (cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != LARGE_ENTRY_SIZE)) {
 
 
             pass = FALSE;
@@ -14588,18 +14671,18 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != LARGE_ENTRY_SIZE)) {
 
 
             pass = FALSE;
@@ -14609,29 +14692,29 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 7.");
             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 7.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 7.");
@@ -14640,11 +14723,11 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, (LARGE_ENTRY_SIZE / 2));
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "error(s) in H5C_resize_entry().");
@@ -14655,7 +14738,7 @@ check_resize_entry(void)
             result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                        entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-            if ( result < 0 ) {
+            if(result < 0) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 3.");
@@ -14673,14 +14756,14 @@ check_resize_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size !=
-	       ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 2)) ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size !=
-	       (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 2)) ) ) {
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size !=
+	       ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 2))) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size !=
+	       (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 2)))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 11.");
@@ -14689,30 +14772,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 8.");
             failure_mssg = msg;
 
-	} else if ( !in_cache || !is_dirty || is_protected || is_pinned ||
-		    ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || is_pinned ||
+		    (reported_entry_size != (LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 8.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 8.");
@@ -14721,17 +14804,17 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, LARGE_ENTRY_SIZE);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "error(s) in H5C_resize_entry().");
@@ -14742,7 +14825,7 @@ check_resize_entry(void)
             result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                        entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-            if ( result < 0 ) {
+            if(result < 0) {
 
                 pass = FALSE;
                 HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 4.");
@@ -14760,12 +14843,12 @@ check_resize_entry(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != 2 * LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != 2 * LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 12.");
@@ -14774,30 +14857,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 9.");
             failure_mssg = msg;
 
-	} else if ( !in_cache || !is_dirty || is_protected || is_pinned ||
-		    ( reported_entry_size != LARGE_ENTRY_SIZE ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || is_pinned ||
+		    (reported_entry_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 9.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 9.");
@@ -14806,7 +14889,7 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3);
 
@@ -14814,11 +14897,11 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, (LARGE_ENTRY_SIZE / 4));
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -14828,14 +14911,14 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size !=
-	       ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 4)) ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size !=
-	       (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 4)) ) ) {
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size !=
+	       ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 4))) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size !=
+	       (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 4)))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 13.");
@@ -14844,30 +14927,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 10.");
             failure_mssg = msg;
 
-	} else if ( !in_cache || !is_dirty || is_protected || ! is_pinned ||
-		    ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || !is_pinned ||
+		    (reported_entry_size != (LARGE_ENTRY_SIZE / 4))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 10.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 10.");
@@ -14876,11 +14959,11 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_resize_entry((void *)entry_ptr, LARGE_ENTRY_SIZE);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
@@ -14890,12 +14973,12 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 4 ) ||
-	     ( cache_ptr->index_size != (4 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != (2 * LARGE_ENTRY_SIZE) ) ) {
+	if((cache_ptr->index_len != 4) ||
+	     (cache_ptr->index_size != (4 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != (2 * LARGE_ENTRY_SIZE))) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 14.");
@@ -14904,30 +14987,30 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
 				      &is_dirty, &is_protected, &is_pinned,
-                                      NULL, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 11.");
             failure_mssg = msg;
 
-	} else if ( !in_cache || !is_dirty || is_protected || ! is_pinned ||
-		    ( reported_entry_size != LARGE_ENTRY_SIZE ) ) {
+	} else if(!in_cache || !is_dirty || is_protected || !is_pinned ||
+		    (reported_entry_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 11.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 11.");
@@ -14936,7 +15019,7 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3);
 
@@ -14945,28 +15028,28 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned, NULL, NULL, NULL);
+				      &is_pinned, NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 12.");
             failure_mssg = msg;
 
-	} else if ( in_cache ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 12.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 12.");
@@ -14975,12 +15058,12 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 3 ) ||
-	     ( cache_ptr->index_size != (3 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) {
+	if((cache_ptr->index_len != 3) ||
+	     (cache_ptr->index_size != (3 * LARGE_ENTRY_SIZE)) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != LARGE_ENTRY_SIZE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 15.");
@@ -14989,7 +15072,7 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, H5C__DELETED_FLAG);
@@ -15002,12 +15085,12 @@ check_resize_entry(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ) {
+	if((cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 16.");
@@ -15016,14 +15099,14 @@ check_resize_entry(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -15052,7 +15135,7 @@ check_resize_entry(void)
  */
 
 static unsigned
-check_evictions_enabled(void)
+check_evictions_enabled(unsigned paged)
 {
     static char    msg[128];
     herr_t         result;
@@ -15066,7 +15149,10 @@ check_evictions_enabled(void)
     test_entry_t * base_addr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("evictions enabled/disabled functionality");
+    if(paged)
+        TESTING("evictions enabled/disabled functionality (paged aggregation)")
+    else
+        TESTING("evictions enabled/disabled functionality")
 
     /* Setup a cache and verify that it is empty.
      *
@@ -15105,18 +15191,18 @@ check_evictions_enabled(void)
 
     pass = TRUE;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* create the cache */
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(1 * 1024 * 1024),
-                                (size_t)(     512 * 1024));
-        if ( file_ptr == NULL ) {
+        file_ptr = setup_cache((size_t)(1 * 1024 * 1024), (size_t)(512 * 1024), paged);
+
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "file_ptr NULL from setup_cache.";
@@ -15130,18 +15216,18 @@ check_evictions_enabled(void)
         }
     }
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that it is empty */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 1.");
@@ -15150,16 +15236,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that H5C_get_evictions_enabled() returns the expected value */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_evictions_enabled(cache_ptr, &evictions_enabled);
 
-	if ( ( result != SUCCEED ) || ( evictions_enabled != TRUE ) ) {
+	if((result != SUCCEED) || (evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected evictions enabled 1.");
@@ -15167,14 +15253,14 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* fill the cache */
-        for ( i = 0; i < 16 ; i++ )
+        for (i = 0; i < 16 ; i++)
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
@@ -15182,18 +15268,18 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache is full */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
 
             pass = FALSE;
@@ -15203,11 +15289,11 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect another entry */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 16);
@@ -15215,18 +15301,18 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that an entry has been evicted */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 0 ) ||
-	     ( cache_ptr->slist_size != 0 ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 0) ||
+	     (cache_ptr->slist_size != 0) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 3.");
@@ -15235,34 +15321,34 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( 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, NULL, NULL);
+                                      NULL, NULL, NULL, NULL);
 
-	if ( result < 0 ) {
+	if(result < 0) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 1.");
             failure_mssg = msg;
 
-	} else if ( in_cache ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 1.");
@@ -15271,29 +15357,29 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* insert an entry */
         insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 17, H5C__NO_FLAGS_SET);
 
     }
 
-    if ( show_progress ) /* 10 */
+    if(show_progress) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that another entry has been evicted */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 4.");
@@ -15302,33 +15388,33 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 11 */
+    if(show_progress) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( 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, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, 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 ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! 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.");
@@ -15337,16 +15423,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 12 */
+    if(show_progress) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* disable evictions */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "can't disable evictions 1.");
@@ -15354,18 +15440,18 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 13 */
+    if(show_progress) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that evictions are disabled */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != FALSE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != FALSE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 5.");
@@ -15374,11 +15460,11 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 14 */
+    if(show_progress) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect another entry */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 18);
@@ -15386,18 +15472,18 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 15 */
+    if(show_progress) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that no entry has been evicted */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 17 ) ||
-	     ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 1 ) ||
-	     ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != FALSE ) ) {
+	if((cache_ptr->index_len != 17) ||
+	     (cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 1) ||
+	     (cache_ptr->slist_size != MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != FALSE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 6.");
@@ -15406,29 +15492,29 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 16 */
+    if(show_progress) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* insert another entry */
         insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 19, H5C__NO_FLAGS_SET);
 
     }
 
-    if ( show_progress ) /* 17 */
+    if(show_progress) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that no entry has been evicted */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 18 ) ||
-	     ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != FALSE ) ) {
+	if((cache_ptr->index_len != 18) ||
+	     (cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != FALSE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 7.");
@@ -15437,16 +15523,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 18 */
+    if(show_progress) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* re-enable evictions */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "can't enable evictions 1.");
@@ -15454,11 +15540,11 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 19 */
+    if(show_progress) /* 19 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect an entry that is in the cache */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 19);
@@ -15466,18 +15552,18 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 20 */
+    if(show_progress) /* 20 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that no entries have been evicted */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 18 ) ||
-	     ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 18) ||
+	     (cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 8.");
@@ -15486,11 +15572,11 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 21 */
+    if(show_progress) /* 21 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect an entry that isn't in the cache */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 20);
@@ -15498,7 +15584,7 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 22 */
+    if(show_progress) /* 22 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -15506,13 +15592,13 @@ check_evictions_enabled(void)
      * cache back down to its normal size.
      */
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 9.");
@@ -15521,33 +15607,33 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 23 */
+    if(show_progress) /* 23 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( 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, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, 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;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! 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.");
@@ -15556,33 +15642,33 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 24 */
+    if(show_progress) /* 24 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( 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, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, 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->deserialized ) ||
-		    ( entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    (entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 4.");
@@ -15591,16 +15677,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 25 */
+    if(show_progress) /* 25 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* disable evictions again */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "can't disable evictions 2.");
@@ -15608,11 +15694,11 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 26 */
+    if(show_progress) /* 26 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect an entry that isn't in the cache, forcing
          * the cache to grow.
@@ -15622,18 +15708,18 @@ check_evictions_enabled(void)
 
     }
 
-    if ( show_progress ) /* 27 */
+    if(show_progress) /* 27 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache has grown */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 17 ) ||
-	     ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 2 ) ||
-	     ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != FALSE ) ) {
+	if((cache_ptr->index_len != 17) ||
+	     (cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 2) ||
+	     (cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != FALSE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 10.");
@@ -15642,16 +15728,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 28 */
+    if(show_progress) /* 28 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* re-enable evictions again */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "can't enable evictions 2.");
@@ -15659,29 +15745,29 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 29 */
+    if(show_progress) /* 29 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* insert an entry */
         insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 22, H5C__NO_FLAGS_SET);
 
     }
 
-    if ( show_progress ) /* 30 */
+    if(show_progress) /* 30 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache has returned to its maximum size */
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 16 ) ||
-	     ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->slist_len != 3 ) ||
-	     ( cache_ptr->slist_size != 3 * MONSTER_ENTRY_SIZE ) ||
-	     ( cache_ptr->evictions_enabled != TRUE ) ) {
+	if((cache_ptr->index_len != 16) ||
+	     (cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->slist_len != 3) ||
+	     (cache_ptr->slist_size != 3 * MONSTER_ENTRY_SIZE) ||
+	     (cache_ptr->evictions_enabled != TRUE)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected cache status 11.");
@@ -15690,33 +15776,33 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 31 */
+    if(show_progress) /* 31 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( 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, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, 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 ) {
+	} else if(in_cache) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 5.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->deserialized ) ||
-		    (  entry_ptr->serialized ) ||
-		    ( ! entry_ptr->destroyed ) ) {
+        } else if((!entry_ptr->deserialized) ||
+		    ( entry_ptr->serialized) ||
+		    (!entry_ptr->destroyed)) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 5.");
@@ -15725,16 +15811,16 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 32 */
+    if(show_progress) /* 32 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     /* disable evictions one last time before we shut down */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_evictions_enabled(cache_ptr, FALSE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "can't disable evictions 3.");
@@ -15742,22 +15828,22 @@ check_evictions_enabled(void)
 	}
     }
 
-    if ( show_progress ) /* 33 */
+    if(show_progress) /* 33 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( show_progress ) /* 34 */
+    if(show_progress) /* 34 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -15785,11 +15871,14 @@ check_evictions_enabled(void)
  */
 
 static unsigned
-check_flush_protected_err(void)
+check_flush_protected_err(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
 
-    TESTING("flush cache with protected entry error");
+    if(paged)
+        TESTING("flush cache with protected entry error (paged aggregation)")
+    else
+        TESTING("flush cache with protected entry error")
 
     pass = TRUE;
 
@@ -15798,16 +15887,15 @@ check_flush_protected_err(void)
      * succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
-        if ( H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET) >= 0 ) {
+        if(H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET) >= 0) {
 
             pass = FALSE;
             failure_mssg = "flush succeeded on cache with protected entry.\n";
@@ -15816,7 +15904,7 @@ check_flush_protected_err(void)
 
             unprotect_entry(file_ptr, 0, 0, H5C__DIRTIED_FLAG);
 
-            if ( H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET) < 0 ) {
+            if(H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET) < 0) {
 
                 pass = FALSE;
                 failure_mssg = "flush failed after unprotect.\n";
@@ -15828,9 +15916,9 @@ check_flush_protected_err(void)
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -15858,13 +15946,15 @@ check_flush_protected_err(void)
  *
  *-------------------------------------------------------------------------
  */
-
 static unsigned
-check_destroy_pinned_err(void)
+check_destroy_pinned_err(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
 
-    TESTING("destroy cache with permanently pinned entry error");
+    if(paged)
+        TESTING("destroy cache with permanently pinned entry error (paged aggregation)")
+    else
+        TESTING("destroy cache with permanently pinned entry error")
 
     pass = TRUE;
 
@@ -15872,58 +15962,51 @@ check_destroy_pinned_err(void)
      * should fail.  Unpin the entry and flush destroy again -- should
      * succeed.
      */
-
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 	unprotect_entry(file_ptr, 0, 0, H5C__PIN_ENTRY_FLAG);
 
-        if ( H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) >= 0 ) {
+        if(H5C_prep_for_file_close(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0) {
+            pass = FALSE;
+            failure_mssg = "unexpected failure of prep for file close.\n";
+        } /* end if */
 
+        if(H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) >= 0) {
             pass = FALSE;
             failure_mssg = "destroy succeeded on cache with pinned entry.\n";
-
-        } else {
-
+        } /* end if */
+	else {
 	    unpin_entry(0, 0);
 
-            if ( H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) < 0 ) {
-
+            if(H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) < 0) {
                 pass = FALSE;
                 failure_mssg = "destroy failed after unpin.\n";
-
-            } else {
+            } /* end if */
+            else
                 file_ptr->shared->cache = NULL;
-	    }
-        }
-
-        if ( saved_cache != NULL ) {
+        } /* end else */
 
+        if(saved_cache != NULL) {
             file_ptr->shared->cache = saved_cache;
             saved_cache = NULL;
-
-        }
+        } /* end if */
 
 	/* call takedown_cache() with a NULL file_ptr parameter.
 	 * This causes the function to close and delete the file,
 	 * while skipping the call to H5C_dest().
 	 */
 	takedown_cache(NULL, FALSE, FALSE);
+    } /* end if */
 
-    }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
-
-    if ( ! pass ) {
-
-        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
-    }
+    if(!pass)
+        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", FUNC, failure_mssg);
 
     return (unsigned)!pass;
 
@@ -15947,11 +16030,14 @@ check_destroy_pinned_err(void)
  */
 
 static unsigned
-check_destroy_protected_err(void)
+check_destroy_protected_err(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
 
-    TESTING("destroy cache with protected entry error");
+    if(paged)
+        TESTING("destroy cache with protected entry error (paged aggregation)")
+    else
+        TESTING("destroy cache with protected entry error")
 
     pass = TRUE;
 
@@ -15960,55 +16046,59 @@ check_destroy_protected_err(void)
      * succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
-        protect_entry(file_ptr, 0, 0);
+        /* Note: normally this call would go just before the series of
+         * flushes prior to file close -- in particular, all entries
+         * should be unprotected when this call is made.
+         *
+         * Thus H5C_prep_for_file_close() contains an assert to verify
+         * this.  Since this assert would be triggered by the condition
+         * we are trying to test, put the call to H5C_prep_for_file_close()
+         * prior to the final protect call.
+         */
+        if(H5C_prep_for_file_close(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0) {
+            pass = FALSE;
+            failure_mssg = "unexpected failure of prep for file close.\n";
+        } /* end if */
 
-        if ( H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) >= 0 ) {
+        protect_entry(file_ptr, 0, 0);
 
+        if(H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) >= 0) {
             pass = FALSE;
             failure_mssg = "destroy succeeded on cache with protected entry.\n";
-
-        } else {
-
+        } /* end if */
+	else {
             unprotect_entry(file_ptr, 0, 0, H5C__DIRTIED_FLAG);
-
-            if ( H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) < 0 ) {
-
+            if(H5C_dest(file_ptr, H5AC_ind_read_dxpl_id) < 0) {
                 pass = FALSE;
                 failure_mssg = "destroy failed after unprotect.\n";
-
-            } else {
+            } /* end if */
+	    else {
                 file_ptr->shared->cache = NULL;
-	    }
-        }
-
-        if ( saved_cache != NULL ) {
+	    } /* end else */
+	} /* end else */
 
+        if(saved_cache != NULL) {
             file_ptr->shared->cache = saved_cache;
             saved_cache = NULL;
-
-        }
+        } /* end if */
 
 	/* call takedown_cache() with a NULL file_ptr parameter.
 	 * This causes the function to close and delete the file,
 	 * while skipping the call to H5C_dest().
 	 */
 	takedown_cache(NULL, FALSE, FALSE);
-    }
-
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    } /* end if */
 
-    if ( ! pass ) {
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
-    }
+    if(!pass)
+        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", FUNC, failure_mssg);
 
     return (unsigned)!pass;
 
@@ -16032,14 +16122,17 @@ check_destroy_protected_err(void)
  */
 
 static unsigned
-check_duplicate_insert_err(void)
+check_duplicate_insert_err(unsigned paged)
 {
     herr_t result = -1;
     H5F_t * file_ptr = NULL;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
 
-    TESTING("duplicate entry insertion error");
+    if(paged)
+        TESTING("duplicate entry insertion error (paged aggregation)")
+    else
+        TESTING("duplicate entry insertion error")
 
     pass = TRUE;
 
@@ -16048,25 +16141,24 @@ check_duplicate_insert_err(void)
      * destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
-        if ( pass ) {
+        if(pass) {
 
             base_addr = entries[0];
             entry_ptr = &(base_addr[0]);
 
             result = H5C_insert_entry(file_ptr, H5AC_ind_read_dxpl_id,
-                                      &(types[0]), entry_ptr->addr,
+                                      types[0], entry_ptr->addr,
                                       (void *)entry_ptr, H5C__NO_FLAGS_SET);
 
-            if ( result >= 0 ) {
+            if(result >= 0) {
 
                 pass = FALSE;
                 failure_mssg = "insert of duplicate entry succeeded.\n";
@@ -16080,9 +16172,9 @@ check_duplicate_insert_err(void)
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16094,100 +16186,6 @@ check_duplicate_insert_err(void)
 
 

 /*-------------------------------------------------------------------------
- * Function:	check_move_err()
- *
- * Purpose:	Verify that an attempt to move an entry to the address
- *		of an existing entry will generate an error.
- *
- * Return:	void
- *
- * Programmer:	John Mainzer
- *              6/24/04
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-static unsigned
-check_move_err(void)
-{
-    herr_t result;
-    H5F_t * file_ptr = NULL;
-    H5C_t * cache_ptr = NULL;
-    test_entry_t * entry_0_0_ptr;
-    test_entry_t * entry_0_1_ptr;
-    test_entry_t * entry_1_0_ptr;
-
-    TESTING("move to existing entry errors");
-
-    pass = TRUE;
-
-    /* allocate a cache, and insert several entries.  Try to move
-     * entries to other entries resident in the cache.  This should
-     * fail.  Destroy the cache -- should succeed.
-     */
-
-    if ( pass ) {
-
-        reset_entries();
-
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
-        cache_ptr = file_ptr->shared->cache;
-
-        insert_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
-        insert_entry(file_ptr, 0, 1, H5C__NO_FLAGS_SET);
-        insert_entry(file_ptr, 1, 0, H5C__NO_FLAGS_SET);
-
-        entry_0_0_ptr = &((entries[0])[0]);
-        entry_0_1_ptr = &((entries[0])[1]);
-        entry_1_0_ptr = &((entries[1])[0]);
-    }
-
-    if ( pass ) {
-
-        result = H5C_move_entry(cache_ptr, &(types[0]),
-                                  entry_0_0_ptr->addr, entry_0_1_ptr->addr);
-
-        if ( result >= 0 ) {
-
-            pass = FALSE;
-            failure_mssg = "move to addr of same type succeeded.\n";
-        }
-    }
-
-    if ( pass ) {
-
-        result = H5C_move_entry(cache_ptr, &(types[0]),
-                                  entry_0_0_ptr->addr, entry_1_0_ptr->addr);
-
-        if ( result >= 0 ) {
-
-            pass = FALSE;
-            failure_mssg = "move to addr of different type succeeded.\n";
-        }
-    }
-
-    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);
-    }
-
-    return (unsigned)!pass;
-
-} /* check_move_err() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	check_double_pin_err()
  *
  * Purpose:	Verify that an attempt to pin an entry that is already
@@ -16206,13 +16204,16 @@ check_move_err(void)
  */
 
 static unsigned
-check_double_pin_err(void)
+check_double_pin_err(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("pin a pinned entry error");
+    if(paged)
+        TESTING("pin a pinned entry error (paged aggregation)")
+    else
+        TESTING("pin a pinned entry error")
 
     pass = TRUE;
 
@@ -16222,12 +16223,11 @@ check_double_pin_err(void)
      * -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
@@ -16238,12 +16238,12 @@ check_double_pin_err(void)
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                     entry_ptr->addr, (void *)entry_ptr, H5C__PIN_ENTRY_FLAG);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16255,14 +16255,14 @@ check_double_pin_err(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16292,13 +16292,16 @@ check_double_pin_err(void)
  */
 
 static unsigned
-check_double_unpin_err(void)
+check_double_unpin_err(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("unpin an unpinned entry error");
+    if(paged)
+        TESTING("unpin an unpinned entry error (paged aggregation)")
+    else
+        TESTING("unpin an unpinned entry error")
 
     pass = TRUE;
 
@@ -16310,24 +16313,23 @@ check_double_unpin_err(void)
      * Destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                     entry_ptr->addr, (void *)entry_ptr, H5C__UNPIN_ENTRY_FLAG);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16339,11 +16341,11 @@ check_double_unpin_err(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result =  H5C_unpin_entry((void *)entry_ptr);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16352,14 +16354,14 @@ check_double_unpin_err(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16389,13 +16391,16 @@ check_double_unpin_err(void)
  */
 
 static unsigned
-check_pin_entry_errs(void)
+check_pin_entry_errs(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("pin entry related errors");
+    if(paged)
+        TESTING("pin entry related errors (paged aggregation)")
+    else
+        TESTING("pin entry related errors")
 
     pass = TRUE;
 
@@ -16411,12 +16416,11 @@ check_pin_entry_errs(void)
      * Destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
@@ -16425,11 +16429,11 @@ check_pin_entry_errs(void)
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_pin_protected_entry((void *)entry_ptr);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16445,11 +16449,11 @@ check_pin_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_pin_protected_entry((void *)entry_ptr);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16462,14 +16466,14 @@ check_pin_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16495,13 +16499,16 @@ check_pin_entry_errs(void)
  */
 
 static unsigned
-check_double_protect_err(void)
+check_double_protect_err(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
     H5C_cache_entry_t * cache_entry_ptr;
 
-    TESTING("protect a protected entry error");
+    if(paged)
+        TESTING("protect a protected entry error (paged aggregation)")
+    else
+        TESTING("protect a protected entry error")
 
     pass = TRUE;
 
@@ -16510,44 +16517,43 @@ check_double_protect_err(void)
      * destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5AC_ind_read_dxpl_id,
-			               &(types[0]), entry_ptr->addr,
+			               types[0], entry_ptr->addr,
 				       &entry_ptr->addr, H5C__NO_FLAGS_SET);
 
-        if ( cache_entry_ptr != NULL ) {
+        if(cache_entry_ptr != NULL) {
 
             pass = FALSE;
             failure_mssg = "attempt to protect a protected entry succeeded.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16573,13 +16579,16 @@ check_double_protect_err(void)
  */
 
 static unsigned
-check_double_unprotect_err(void)
+check_double_unprotect_err(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("unprotect an unprotected entry error");
+    if(paged)
+        TESTING("unprotect an unprotected entry error (paged aggregation)")
+    else
+        TESTING("unprotect an unprotected entry error")
 
     pass = TRUE;
 
@@ -16588,12 +16597,11 @@ check_double_unprotect_err(void)
      * -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
@@ -16602,12 +16610,12 @@ check_double_unprotect_err(void)
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                     entry_ptr->addr, (void *)entry_ptr, H5C__NO_FLAGS_SET);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16615,14 +16623,14 @@ check_double_unprotect_err(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16651,13 +16659,16 @@ check_double_unprotect_err(void)
  */
 
 static unsigned
-check_mark_entry_dirty_errs(void)
+check_mark_entry_dirty_errs(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("mark entry dirty related errors");
+    if(paged)
+        TESTING("mark entry dirty related errors (paged aggregation)")
+    else
+        TESTING("mark entry dirty related errors")
 
     pass = TRUE;
 
@@ -16667,12 +16678,11 @@ check_mark_entry_dirty_errs(void)
      * Destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry(file_ptr, 0, 0);
 
@@ -16681,12 +16691,12 @@ check_mark_entry_dirty_errs(void)
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_mark_entry_dirty((void *)entry_ptr);
 
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16694,14 +16704,14 @@ check_mark_entry_dirty_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16731,20 +16741,23 @@ check_mark_entry_dirty_errs(void)
  */
 
 static unsigned
-check_expunge_entry_errs(void)
+check_expunge_entry_errs(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("expunge entry related errors");
+    if(paged)
+        TESTING("expunge entry related errors (paged aggregation)")
+    else
+        TESTING("expunge entry related errors")
 
     pass = TRUE;
 
     /* Allocate a cache, protect an entry, and then call H5C_expunge_entry()
      * to expunge it -- this should fail
      *
-     * Unprotect the the entry with the pinned flag, and then call
+     * Unprotect the entry with the pinned flag, and then call
      * H5C_expunge_entry() again.  This should fail too.
      *
      * Finally, unpin the entry and call H5C_expunge_entry() yet again.
@@ -16753,12 +16766,11 @@ check_expunge_entry_errs(void)
      * Destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         entry_ptr = &((entries[0])[0]);
 
@@ -16766,12 +16778,12 @@ check_expunge_entry_errs(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_expunge_entry(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
+                types[0], entry_ptr->addr, H5C__NO_FLAGS_SET);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16784,12 +16796,12 @@ check_expunge_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_expunge_entry(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
+                types[0], entry_ptr->addr, H5C__NO_FLAGS_SET);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16802,37 +16814,154 @@ check_expunge_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
+
+	result = H5C_expunge_entry(file_ptr, H5AC_ind_read_dxpl_id,
+                types[0], entry_ptr->addr, H5C__NO_FLAGS_SET);
+
+        if(result < 0) {
+
+            pass = FALSE;
+            failure_mssg =
+              "attempt to expunge an unpinned and unprotected entry failed.\n";
+
+	}
+    }
+
+
+    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);
+    }
+
+    return (unsigned)!pass;
+
+} /* check_expunge_entry_errs() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_move_entry_errs()
+ *
+ * Purpose:	Verify that invalid calls to H5C_move_entry()
+ * 		generates errors as expected.
+ *
+ * Return:	void
+ *
+ * Programmer:	Quincey Koziol
+ *              12/10/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+check_move_entry_errs(unsigned paged)
+{
+    herr_t result;
+    H5F_t * file_ptr = NULL;
+    H5C_t * cache_ptr = NULL;
+    test_entry_t * entry_ptr = NULL;
+    test_entry_t * entry_0_0_ptr;
+    test_entry_t * entry_0_1_ptr;
+    test_entry_t * entry_1_0_ptr;
+
+    if(paged)
+        TESTING("move entry related errors (paged aggregation)")
+    else
+        TESTING("move entry related errors")
+
+    pass = TRUE;
+
+    /* allocate a cache, and insert several entries.  Try to move
+     * entries to other entries resident in the cache.  This should
+     * fail.  Destroy the cache -- should succeed.
+     */
+
+    if(pass) {
+        reset_entries();
+
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
+        cache_ptr = file_ptr->shared->cache;
+
+        insert_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
+        insert_entry(file_ptr, 0, 1, H5C__NO_FLAGS_SET);
+        insert_entry(file_ptr, 1, 0, H5C__NO_FLAGS_SET);
+
+        entry_0_0_ptr = &((entries[0])[0]);
+        entry_0_1_ptr = &((entries[0])[1]);
+        entry_1_0_ptr = &((entries[1])[0]);
+    } /* end if */
+
+    if(pass) {
+        result = H5C_move_entry(cache_ptr, types[0], entry_0_0_ptr->addr, entry_0_1_ptr->addr);
+
+        if(result >= 0) {
+            pass = FALSE;
+            failure_mssg = "move to addr of same type succeeded.\n";
+        } /* end if */
+    } /* end if */
+
+    if(pass) {
+        result = H5C_move_entry(cache_ptr, types[0], entry_0_0_ptr->addr, entry_1_0_ptr->addr);
+
+        if(result >= 0) {
+            pass = FALSE;
+            failure_mssg = "move to addr of different type succeeded.\n";
+        } /* end if */
+    } /* end if */
+
+    if(pass)
+        takedown_cache(file_ptr, FALSE, FALSE);
+
+    /* Allocate a cache, protect an entry R/O, and then call
+     * H5C_move_entry() to move it -- this should fail.
+     *
+     * Finally, unprotect the entry and destroy the cache.
+     * This should succeed.
+     */
 
-	result = H5C_expunge_entry(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
+    if(pass) {
+        reset_entries();
 
-        if ( result < 0 ) {
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
+        cache_ptr = file_ptr->shared->cache;
 
-            pass = FALSE;
-            failure_mssg =
-              "attempt to expunge an unpinned and unprotected entry failed.\n";
+        insert_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
+        protect_entry_ro(file_ptr, 0, 0);
 
-	}
-    }
+        entry_ptr = &((entries[0])[0]);
+    } /* end if */
 
+    if(pass) {
+	result = H5C_move_entry(cache_ptr, types[0], entry_ptr->header.addr, entry_ptr->header.addr + 10);
 
-    if ( pass ) {
+        if(result >= 0) {
+            pass = FALSE;
+            failure_mssg = "Call to H5C_move_entry on a R/O protected entry succeeded.\n";
+        } /* end if */
+        else
+            unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
+    } /* end if */
 
+    if(pass)
         takedown_cache(file_ptr, FALSE, FALSE);
-    }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
-
-    if ( ! pass ) {
+    if(pass)
+        PASSED()
+    else {
+        H5_FAILED()
 
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
-    }
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    } /* end else */
 
     return (unsigned)!pass;
-
-} /* check_expunge_entry_errs() */
+} /* check_move_entry_errs() */
 
 

 /*-------------------------------------------------------------------------
@@ -16850,20 +16979,23 @@ check_expunge_entry_errs(void)
  */
 
 static unsigned
-check_resize_entry_errs(void)
+check_resize_entry_errs(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("resize entry related errors");
+    if(paged)
+        TESTING("resize entry related errors (paged aggregation)")
+    else
+        TESTING("resize entry related errors")
 
     pass = TRUE;
 
     /* Allocate a cache, protect an entry, and then call
      * H5C_resize_entry() to resize it -- this should succeed.
      *
-     * Unprotect the the entry with the pinned flag, and then call
+     * Unprotect the entry with the pinned flag, and then call
      * H5C_resize_entry() again with new size of zero.
      * This should fail.
      *
@@ -16871,12 +17003,11 @@ check_resize_entry_errs(void)
      * This should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         entry_ptr = &((entries[0])[0]);
 
@@ -16884,11 +17015,11 @@ check_resize_entry_errs(void)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_resize_entry((void *)entry_ptr, (size_t)1);
 
-        if ( result < 0 ) {
+        if(result < 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16901,11 +17032,11 @@ check_resize_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_resize_entry((void *)entry_ptr, (size_t)0);
 
-        if ( result >= 0 ) {
+        if(result >= 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16918,14 +17049,14 @@ check_resize_entry_errs(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -16951,13 +17082,16 @@ check_resize_entry_errs(void)
  */
 
 static unsigned
-check_unprotect_ro_dirty_err(void)
+check_unprotect_ro_dirty_err(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
 
-    TESTING("unprotect a read only entry dirty error");
+    if(paged)
+        TESTING("unprotect a read only entry dirty error (paged aggregation)")
+    else
+        TESTING("unprotect a read only entry dirty error")
 
     pass = TRUE;
 
@@ -16966,24 +17100,23 @@ check_unprotect_ro_dirty_err(void)
      * -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry_ro(file_ptr, 0, 0);
 
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                     entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-        if ( result >= 0 ) {
+        if(result >= 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -16991,13 +17124,13 @@ check_unprotect_ro_dirty_err(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
@@ -17008,12 +17141,11 @@ check_unprotect_ro_dirty_err(void)
      * This should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry_ro(file_ptr, 0, 0);
         protect_entry_ro(file_ptr, 0, 0);
@@ -17021,12 +17153,12 @@ check_unprotect_ro_dirty_err(void)
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_unprotect(file_ptr, H5AC_ind_read_dxpl_id,
                     entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
-        if ( result > 0 ) {
+        if(result > 0) {
 
             pass = FALSE;
             failure_mssg =
@@ -17034,21 +17166,21 @@ check_unprotect_ro_dirty_err(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 	unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -17078,13 +17210,16 @@ check_unprotect_ro_dirty_err(void)
  */
 
 static unsigned
-check_protect_ro_rw_err(void)
+check_protect_ro_rw_err(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
     void * thing_ptr = NULL;
 
-    TESTING("protect a read only entry rw error");
+    if(paged)
+        TESTING("protect a read only entry rw error (paged aggregation)")
+    else
+        TESTING("protect a read only entry rw error")
 
     pass = TRUE;
 
@@ -17094,44 +17229,43 @@ check_protect_ro_rw_err(void)
      * Unprotect the entry and destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
         protect_entry_ro(file_ptr, 0, 0);
 
         entry_ptr = &((entries[0])[0]);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         thing_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5AC_ind_read_dxpl_id,
-			         &(types[0]), entry_ptr->addr,
+			         types[0], entry_ptr->addr,
 				 &entry_ptr->addr, H5C__NO_FLAGS_SET);
 
-        if ( thing_ptr != NULL ) {
+        if(thing_ptr != NULL) {
 
             pass = FALSE;
             failure_mssg = "attempt to protect a ro entry rw succeeded.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	unprotect_entry(file_ptr, 0, 0, H5C__NO_FLAGS_SET);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -17155,7 +17289,7 @@ check_protect_ro_rw_err(void)
  *-------------------------------------------------------------------------
  */
 static unsigned
-check_protect_retries(void)
+check_protect_retries(unsigned paged)
 {
     H5F_t * file_ptr = NULL;
     H5C_t *cache_ptr = NULL;
@@ -17165,7 +17299,10 @@ check_protect_retries(void)
     int32_t type;
     int32_t idx;
 
-    TESTING("protect an entry to verify retries");
+    if(paged)
+        TESTING("protect an entry to verify retries (paged aggregation)")
+    else
+        TESTING("protect an entry to verify retries")
 
     pass = TRUE;
 
@@ -17174,8 +17311,7 @@ check_protect_retries(void)
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
 	/* Set up read attempts for verifying checksum */
 	file_ptr->shared->read_attempts = 10;
@@ -17202,24 +17338,24 @@ check_protect_retries(void)
         entry_ptr->verify_ct = 0;
 
 	cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
+                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 ) )  {
+	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 ) );
+            HDassert((entry_ptr->cache_ptr == NULL) ||
+                      (entry_ptr->cache_ptr == cache_ptr));
 
             entry_ptr->cache_ptr = cache_ptr;
             entry_ptr->file_ptr = file_ptr;
@@ -17228,7 +17364,7 @@ check_protect_retries(void)
             entry_ptr->ro_ref_count++;
         }
 
-        HDassert( ((entry_ptr->header).type)->id == type );
+        HDassert(((entry_ptr->header).type)->id == type);
     }
 
     if(pass)
@@ -17247,7 +17383,7 @@ check_protect_retries(void)
         entry_ptr->verify_ct = 0;
 
 	cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
+                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)
@@ -17258,9 +17394,9 @@ check_protect_retries(void)
     takedown_cache(file_ptr, FALSE, FALSE);
     reset_entries();
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_msg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -17290,14 +17426,17 @@ check_protect_retries(void)
  */
 
 static unsigned
-check_check_evictions_enabled_err(void)
+check_check_evictions_enabled_err(unsigned paged)
 {
     herr_t result;
     hbool_t evictions_enabled;
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
 
-    TESTING("get/set evictions enabled errors");
+    if(paged)
+        TESTING("get/set evictions enabled errors (paged aggregation)")
+    else
+        TESTING("get/set evictions enabled errors")
 
     pass = TRUE;
 
@@ -17314,42 +17453,41 @@ check_check_evictions_enabled_err(void)
      * Unprotect the entry and destroy the cache -- should succeed.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_get_evictions_enabled(NULL, &evictions_enabled);
 
-	if ( result == SUCCEED ) {
+	if(result == SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_evictions_enabled succeeded() 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_get_evictions_enabled(cache_ptr, NULL);
 
-	if ( result == SUCCEED ) {
+	if(result == SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_evictions_enabled succeeded() 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	result = H5C_set_evictions_enabled(cache_ptr, TRUE);
 
-	if ( result != SUCCEED ) {
+	if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_evictions_enabled failed().\n";
@@ -17357,31 +17495,31 @@ check_check_evictions_enabled_err(void)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         (cache_ptr->resize_ctl).incr_mode = H5C_incr__threshold;
 
 	result = H5C_get_evictions_enabled(cache_ptr, FALSE);
 
-	if ( result == SUCCEED ) {
+	if(result == SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_evictions_enabled succeeded() 1.\n";
 
-        } else if ( cache_ptr->evictions_enabled == TRUE ) {
+        } else if(cache_ptr->evictions_enabled == TRUE) {
 
 	}
 
         (cache_ptr->resize_ctl).incr_mode = H5C_incr__off;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         (cache_ptr->resize_ctl).decr_mode = H5C_decr__threshold;
 
 	result = H5C_get_evictions_enabled(cache_ptr, FALSE);
 
-	if ( result == SUCCEED ) {
+	if(result == SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_evictions_enabled succeeded() 2.\n";
@@ -17391,14 +17529,14 @@ check_check_evictions_enabled_err(void)
     }
 
 
-    if ( cache_ptr ) {
+    if(cache_ptr) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -17422,15 +17560,6 @@ check_check_evictions_enabled_err(void)
  * Programmer:	John Mainzer
  *              10/29/04
  *
- * Modifications:
- *
- *              John Mainzer 1/8/08
- *              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.
  *-------------------------------------------------------------------------
  */
 
@@ -17451,7 +17580,7 @@ static void test_rpt_fcn(H5_ATTR_UNUSED H5C_t * cache_ptr,
 }
 
 static unsigned
-check_auto_cache_resize(hbool_t cork_ageout)
+check_auto_cache_resize(hbool_t cork_ageout, unsigned paged)
 {
     hbool_t show_progress = FALSE;
     herr_t result;
@@ -17505,347 +17634,332 @@ check_auto_cache_resize(hbool_t cork_ageout)
         /* double      empty_reserve          = */ 0.05f
     };
 
-    TESTING("automatic cache resizing");
+    if(paged)
+        TESTING("automatic cache resizing (paged aggregation)")
+    else
+        TESTING("automatic cache resizing")
 
     pass = TRUE;
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* allocate a cache, enable automatic cache resizing, and then force
      * the cache through all its operational modes.  Verify that all
      * performs as expected.
      */
 
-    if ( pass ) {
-
+    if(pass) {
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
-
+    if(pass) {
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
-
-        if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+    if(pass) {
+        if((cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after initialization.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache not full -- should result in not
      * full status.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, PICO_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- should result in increase
      * of cache size from .5 to 1 meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (1 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache not full -- should result in not
      * full status.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, PICO_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (1 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 3.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full again -- should result in increase
      * of cache size from 1 to 2 meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 4.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full again -- should result in increase
      * of cache size from 2 to 4 meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full again -- should result in increase
      * of cache size from 4 to 8 meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 6.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full again -- should result in increase
      * of cache size from 8 to 12 meg.  Note that max increase reduced the
      * size of the increase.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (12 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (6 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (12 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (6 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 7.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full again -- should result in increase
      * of cache size from 12 to 14 meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (14 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (7 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 8.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full and at maximum size -- should
      * in no change in size and a result of at_max_size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (14 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (7 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 9.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate with cache full and at maximum size -- should
      * result in a decrease from 14 to 13 Meg -- note that max decrease
      * reduced the size of the reduction
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (13 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (13 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 10.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* the current cache configuration is inconvenient for testing cache
      * size reduction, so lets change it some something easier to work
      * with.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -17889,306 +18003,295 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.05f;
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10) ) ||
-             ( cache_ptr->min_clean_size != (400 * 1000 + 1) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10)) ||
+             (cache_ptr->min_clean_size != (400 * 1000 + 1))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate  -- should result in a decrease from ~4 to ~3
      * M -- note that max decrease reduces the size of the reduction
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10) ) ||
-             ( cache_ptr->min_clean_size != (300 * 1000 + 1) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10)) ||
+             (cache_ptr->min_clean_size != (300 * 1000 + 1))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 11.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again  -- should result in a decrease from ~3
      * to ~2 M -- again note that max decrease reduces the size of the
      * reduction.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10) ) ||
-             ( cache_ptr->min_clean_size != (200 * 1000 + 1) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10)) ||
+             (cache_ptr->min_clean_size != (200 * 1000 + 1))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 12.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again  -- should result in a decrease from ~2
      * to ~1 M -- again note that max decrease reduces the size of the
      * reduction, but only by five bites.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10) ) ||
-             ( cache_ptr->min_clean_size != (100 * 1000 + 1) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10)) ||
+             (cache_ptr->min_clean_size != (100 * 1000 + 1))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 13.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again  -- should result in a decrease from ~1
      * to ~0.5 M -- max decrease is no longer a factor.  New size is five
      * bytes above the minimum.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (500 * 1000 + 5) ) ||
-             ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (500 * 1000 + 5)) ||
+             (cache_ptr->min_clean_size != (50 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 14.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again  -- should result in a decrease of five
      * bytes to the minimum cache size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (500 * 1000) ) ||
-             ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (500 * 1000)) ||
+             (cache_ptr->min_clean_size != (50 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 15.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again -- Already at minimum size so no change in
      * cache size and result should be at_min_size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_min_size ) ||
-             ( cache_ptr->max_cache_size != (500 * 1000) ) ||
-             ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_min_size) ||
+             (cache_ptr->max_cache_size != (500 * 1000)) ||
+             (cache_ptr->min_clean_size != (50 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 16.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force in range hit rate  -- should be no change in cache size,
      * and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 900 ) )
+        while(pass && (i < 900))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i + 1000);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i + 1000, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (500 * 1000) ) ||
-             ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (500 * 1000)) ||
+             (cache_ptr->min_clean_size != (50 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 17.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- should
      * increase cache size from .5 to 1 M.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (1 * 1000 * 1000) ) ||
-             ( cache_ptr->min_clean_size != (100 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (1 * 1000 * 1000)) ||
+             (cache_ptr->min_clean_size != (100 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 18.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should result in a decrease to the
      * minimum cache size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
+      
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (500 * 1000) ) ||
-             ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (500 * 1000)) ||
+             (cache_ptr->min_clean_size != (50 * 1000))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 19.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /******************************************************************
      * now do some tests with the maximum increase and decrease sizes
      * disabled.
      ******************************************************************/
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -18232,141 +18335,135 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.05f;
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should result in a decrease to the
      * minimum cache size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 20.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- should increase cache size
      * from 1 to 4 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 21.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate again with cache full -- should increase cache
      * size from 4 to 16 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (16 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != ( 8 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (16 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (8 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 22.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should result in a decrease cache size from
      * 16 to 4 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 23.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /******************************************************************
      * We have tested the threshold increment and decrement modes.
@@ -18375,7 +18472,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * Reconfigure the cache for this testing.
      ******************************************************************/
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -18420,29 +18517,28 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.05f;
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 3.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    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
      *
@@ -18450,341 +18546,305 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * increase its size. Since we are already at max size, it will
      * not be able to.
      */
-    if ( pass ) { /* first epoch */
-
+    if(pass) { /* first epoch */
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 24.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { /* second epoch */
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(pass) { /* second epoch */
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
-        {
+        while(pass && (i < 2000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 25.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { /* third epoch */
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(pass) { /* third epoch */
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
-        {
+        while(pass && (i < 3000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 26.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourth epoch -- If the hit rate were above the lower threshold,
      * we would see cache size reduction now.  However, nothing will
      * happen until we get the hit rate above the lower threshold.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
-        {
+        while(pass && (i < 4000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 27.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifth epoch -- force the hit rate to 100%.  We should see cache size
      * reduction now.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
-        {
+        while(pass && (i < 4000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2001 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2001 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2001 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2001 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 28.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixth epoch -- force the hit rate to 100% again.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
-        {
+        while(pass && (i < 4000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1001 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(1001 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1001 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(1001 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 29.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* seventh epoch -- force the hit rate to 100% again.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
-        {
+        while(pass && (i < 4000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(1000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 30.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eigth epoch -- force the hit rate to 100% again -- should be steady
      * state.
      */
-    if ( pass ) {
-
+    if(pass) {
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
-        {
+        while(pass && (i < 4000)) {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(1000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 31.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* now just bang on one entry -- after three epochs, this should
      * get all entries other than the one evicted, and the cache size
      * should be decreased to the minimum.
      */
-    if ( pass ) { /* ninth epoch */
-
+    if(pass) { /* ninth epoch */
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(1000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 32.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { /* tenth epoch */
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(pass) { /* tenth epoch */
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(1000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 33.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { /* eleventh epoch -- cache size reduction */
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(pass) { /* eleventh epoch -- cache size reduction */
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 34.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(pass) { /* twelth epoch -- at minimum size so no more ageouts */
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
-        {
+        while(pass && (i < 1000)) {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_min_size ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_min_size) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 35.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     if(cork_ageout)
 	uncork_entry_type(file_ptr, MEDIUM_ENTRY_TYPE);
@@ -18795,7 +18855,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * the structure of the test a bit.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -18841,24 +18901,24 @@ check_auto_cache_resize(hbool_t cork_ageout)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 4.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* fill the cache with 1024 byte entries -- nothing should happen
@@ -18868,462 +18928,446 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * increase its size. Since we are already at max size, it will
      * not be able to.
      */
-    if ( pass ) { /* first epoch */
+    if(pass) { /* first epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 36.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* second epoch */
+    if(pass) { /* second epoch */
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 37.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* third epoch */
+    if(pass) { /* third epoch */
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 38.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourth epoch -- If the hit rate were above the lower threshold,
      * we would see cache size reduction now.  However, nothing will
      * happen until we get the hit rate above the lower threshold.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 39.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifth epoch -- force the hit rate to 100%.  We should see cache size
      * reduction now.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (7 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (7 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (7 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (7 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 40.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixth epoch -- force the hit rate to 100% again.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (6 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (6 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 41.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* seventh epoch -- keep hit rate at 100%, and keep 2K entries active.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (5 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (5 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (5 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (5 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 42.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eigth epoch -- still 100% hit rate
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 43.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* ninth epoch --hit rate at 100%.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (3 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (3 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 44.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* tenth epoch -- still 100% hit rate
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 512 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 45.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eleventh epoch -- hit rate at 100% -- starting to stableize
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 46.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* twelth epoch -- force the hit rate to 100% again -- should be steady
      * state.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 47.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* now just bang on one entry -- after three epochs, this should
      * get all entries other than the one evicted, and the cache size
      * should be decreased to the minimum.
      */
-    if ( pass ) { /* thirteenth epoch */
+    if(pass) { /* thirteenth epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 48.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* fourteenth epoch */
+    if(pass) { /* fourteenth epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size !=
-               (1001 * 1024 + MONSTER_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size !=
-               (1001 * 512 + MONSTER_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size !=
+               (1001 * 1024 + MONSTER_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size !=
+               (1001 * 512 + MONSTER_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 49.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* fifteenth epoch -- cache size reduction */
+    if(pass) { /* fifteenth epoch -- cache size reduction */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 50.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* sixteenth epoch -- at minimum size so no more ageouts */
+    if(pass) { /* sixteenth epoch -- at minimum size so no more ageouts */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_min_size ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_min_size) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 51.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* repeat the test yet again, this time with empty reserve enabled.
      * Again, some structural changes in the test are necessary.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -19369,24 +19413,24 @@ check_auto_cache_resize(hbool_t cork_ageout)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* fill the cache with 1024 byte entries -- nothing should happen
@@ -19396,341 +19440,329 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * increase its size. Since we are already at max size, it will
      * not be able to.
      */
-    if ( pass ) { /* first epoch */
+    if(pass) { /* first epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 52.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* second epoch */
+    if(pass) { /* second epoch */
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 53.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* third epoch */
+    if(pass) { /* third epoch */
 
         rpt_fcn_called = FALSE;
         i = 2000;
-        while ( ( pass ) && ( i < 3000 ) )
+        while(pass && (i < 3000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 54.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourth epoch -- If the hit rate were above the lower threshold,
      * we would see cache size reduction now.  However, nothing will
      * happen until we get the hit rate above the lower threshold.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 55.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifth epoch -- force the hit rate to 100%.  We should see cache size
      * reduction now.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (4002 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(4002 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (4002 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(4002 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 56.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixth epoch -- force the hit rate to 100% again.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2002 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2002 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2002 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2002 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 57.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* seventh epoch -- force the hit rate to 100% again.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 58.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eigth epoch -- force the hit rate to 100% again -- should be steady
      * state.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 3000;
-        while ( ( pass ) && ( i < 4000 ) )
+        while(pass && (i < 4000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 59.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* now just bang on one entry -- after three epochs, this should
      * get all entries other than the one evicted, and the cache size
      * should be decreased to the minimum.
      */
-    if ( pass ) { /* ninth epoch */
+    if(pass) { /* ninth epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (int)(2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 60.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* tenth epoch */
+    if(pass) { /* tenth epoch */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2000 * 512) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2000 * 1024)) ||
+             (cache_ptr->min_clean_size != (2000 * 512))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 61.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* eleventh epoch -- cache size reduction */
+    if(pass) { /* eleventh epoch -- cache size reduction */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 62.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */
+    if(pass) { /* twelth epoch -- at minimum size so no more ageouts */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_min_size ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size !=
-               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_min_size) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_len != 2) ||
+             (cache_ptr->index_size !=
+               MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 63.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* Repeat the test again, this time using the age out with threshold
@@ -19739,7 +19771,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * Again, there are some minor structural changes in the test.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -19787,217 +19819,208 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.05f;
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 6.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* fill the cache with 4K byte entries -- increment mode is off,
      * so cache size reduction should kick in as soon as we get the
      * hit rate above .999.
      */
-    if ( pass ) { /* first epoch -- hit rate 0 */
+    if(pass) { /* first epoch -- hit rate 0 */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 64.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* second epoch -- hit rate 0 */
+    if(pass) { /* second epoch -- hit rate 0 */
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 65.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* third epoch -- hit rate 1.0 -- should see decrease */
+    if(pass) { /* third epoch -- hit rate 1.0 -- should see decrease */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 66.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourth epoch -- load up the cache again -- hit rate 0 */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 67.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifth epoch -- still loading up the cache -- hit rate 0 */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 68.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixth epoch -- force hit rate to .998 -- should be no reduction */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1002;
-        while ( ( pass ) && ( i < 2002 ) )
+        while(pass && (i < 2002))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 69.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* seventh epoch -- force hit rate to .999 -- should see reduction
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1003;
-        while ( ( pass ) && ( i < 2003 ) )
+        while(pass && (i < 2003))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 70.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* We have now tested all the major ageout modes individually.
@@ -20005,7 +20028,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * and/or bugs.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -20050,81 +20073,77 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.5f; /* for ease of testing */
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 7.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fill the cache with 4K byte entries -- increment mode is threshold,
      * so the decrease code will not be executed until the hit rate exceeds
      * .75.
      */
-    if ( pass ) { /* first epoch -- hit rate 0 */
+    if(pass) { /* first epoch -- hit rate 0 */
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 71.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { /* second epoch -- hit rate 0 */
+    if(pass) { /* second epoch -- hit rate 0 */
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 72.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* third epoch -- force the hit rate to 1.0.  Should be no change
      * in the cache size due to the combination of the empty reserve
@@ -20134,420 +20153,406 @@ check_auto_cache_resize(hbool_t cork_ageout)
      *
      * In this epoch, all we should see is a reduction in the index size.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (7 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (7 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 73.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourth epoch -- hit rate still 1.0.  Index size should decrease,
      * but otherwise no change expected.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (6 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (6 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 74.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifth epoch -- hit rate still 1.0.  Index size should decrease,
      * but otherwise no change expected.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (5 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 75.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixth epoch -- hit rate still 1.0.  Index size should decrease,
      * but otherwise no change expected.  Note that the cache size is
      * now just on the edge of meeting the clean reserve.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 76.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* seventh epoch -- hit rate still 1.0.  No change in index size expected.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 77.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eighth epoch -- start loading 1 KB entries.  Hit rate 0 so
      * decrease code shouldn't be called.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != at_max_size ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != at_max_size) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (5 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 78.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* ninth epoch -- access the 1 KB entries again, driving the hit rate
      * to 1.0.  Decrease code should be triggered, but the max decrease
      * should prevent the empty reserve from being met in this epoch.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (4 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 79.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* tenth epoch -- access the 1 KB entries yet again, forcing hit rate
      * to 1.0.  Decrease code should be triggered, and the empty reserve
      * should finally be met.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (7 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2) ) ||
-             ( cache_ptr->index_size != (3 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (7 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2)) ||
+             (cache_ptr->index_size != (3 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 80.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* eleventh epoch -- access the 1 KB entries yet again, forcing hit rate
      * to 1.0.  Decrease code should be triggered, and the empty reserve
      * should be met again.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (6 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (2 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (6 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (2 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 81.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* twelth  epoch -- hit rate 1.0 -- decrease as before.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (5 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (5 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2)) ||
+             (cache_ptr->index_size != (1 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 82.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* thirteenth  epoch -- hit rate 1.0 -- decrease as before.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (4 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (4 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (1 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 83.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fourteenth  epoch -- hit rate 1.0 -- decrease as before.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (3 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (3 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2)) ||
+             (cache_ptr->index_size != (1 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 84.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* fifteenth  epoch -- hit rate 1.0 -- decrease as before.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (1 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 85.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* sixteenth  epoch -- hit rate 1.0 -- should be stable now
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2 * 1000 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1000 * 1024)) ||
+             (cache_ptr->index_size != (1 * 1000 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 86.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* now test the flash cache size increment code.  At least at present,
@@ -20561,7 +20566,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * code increases the cache size when and as expected.
      */
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* 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.
@@ -20570,20 +20575,18 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * modes.  Verify that all perform as expected.
      */
 
-    if ( pass ) {
-
+    if(pass) {
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
-
 	reset_entries();
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* now repeat the above tests using the add space flash cache size
      * increment algorithm.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -20628,154 +20631,148 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.5f; /* for ease of testing */
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-	     ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->cache_accesses != 0 ) ) {
+        if((cache_ptr->max_cache_size != (64 * 1024)) ||
+             (cache_ptr->min_clean_size != (32 * 1024)) ||
+	     (cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->cache_accesses != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (0).\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load a huge entry into the cache */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, HUGE_ENTRY_TYPE, 0);
 
-        if ( pass ) {
+        if(pass)
             unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-        }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-		 ( cache_ptr->index_len != 1 ) ||
-                 ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (64 * 1024)) ||
+		 (cache_ptr->min_clean_size != (32 * 1024)) ||
+		 (cache_ptr->index_len != 1) ||
+                 (cache_ptr->index_size != HUGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (1).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now load a monster entry.  Since a monster entry is larger than
      * half the size of the cache, and there is not sufficient space
      * for a monster entry in the cache, we will add space to the
      * cache to make room for the entry.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-        if ( pass ) {
+        if(pass)
             unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-        }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (40 * 1024) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size != (HUGE_ENTRY_SIZE +
-		                             MONSTER_ENTRY_SIZE) ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (80 * 1024)) ||
+		 (cache_ptr->min_clean_size != (40 * 1024)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size != (HUGE_ENTRY_SIZE +
+		                             MONSTER_ENTRY_SIZE)) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (2).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load a second monster entry.  Since the monster entry is larger
      * than half the size of the cache yet again, and there is not
      * sufficient space for the monster entry in the cache, we again
      * add space to the cache to make space for the entry.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1);
 
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
-		 ( cache_ptr->index_len != 3 ) ||
-                 ( cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) +
-					     HUGE_ENTRY_SIZE) ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (144 * 1024)) ||
+		 (cache_ptr->min_clean_size != (72 * 1024)) ||
+		 (cache_ptr->index_len != 3) ||
+                 (cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) +
+					     HUGE_ENTRY_SIZE)) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (3).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load a third moster entry.  Should be no cache size increase this
      * time.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 2);
 
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 2, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
-		 ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (144 * 1024)) ||
+		 (cache_ptr->min_clean_size != (72 * 1024)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE)) ||
+		 (cache_ptr->cache_accesses != 2)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (4).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* delete existing entries to prepare for next test, and reset
      * the size of the cache.
      */
-    if ( pass ) {
+    if(pass) {
 
 	expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 1);
 	expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 2);
 
-        if ( pass ) {
+        if(pass) {
 
             result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-            if ( result != SUCCEED ) {
-
+            if(result != SUCCEED) {
                 pass = FALSE;
                 failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
 	    }
         }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-		 ( cache_ptr->index_len != 0 ) ||
-                 ( cache_ptr->index_size != 0 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (64 * 1024)) ||
+		 (cache_ptr->min_clean_size != (32 * 1024)) ||
+		 (cache_ptr->index_len != 0) ||
+                 (cache_ptr->index_size != 0) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (5).\n";
@@ -20786,10 +20783,10 @@ check_auto_cache_resize(hbool_t cork_ageout)
      * entries to the cache, not protects.
      */
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* insert a huge entry into the cache */
-    if ( pass ) {
+    if(pass) {
 
         insert_entry(file_ptr, HUGE_ENTRY_TYPE, 1, H5C__NO_FLAGS_SET);
 
@@ -20799,94 +20796,94 @@ check_auto_cache_resize(hbool_t cork_ageout)
         protect_entry(file_ptr, HUGE_ENTRY_TYPE, 1);
         unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, 1, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-		 ( cache_ptr->index_len != 1 ) ||
-                 ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (64 * 1024)) ||
+		 (cache_ptr->min_clean_size != (32 * 1024)) ||
+		 (cache_ptr->index_len != 1) ||
+                 (cache_ptr->index_size != HUGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 2)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (6).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now insert a monster entry.  Since a monster entry is larger than
      * half the size of the cache, and there is not sufficient space
      * for a monster entry in the cache, we will add space to the
      * cache to make room for the entry.
      */
-    if ( pass ) {
+    if(pass) {
 
         insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 4, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (40 * 1024) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size !=
-		   HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (80 * 1024)) ||
+		 (cache_ptr->min_clean_size != (40 * 1024)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size !=
+		   HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (7).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Insert a second monster entry.  Cache size should increase again.
      */
-    if ( pass ) {
+    if(pass) {
 
         insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 5, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
-		 ( cache_ptr->index_len != 3 ) ||
-                 ( cache_ptr->index_size !=
-		   2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (144 * 1024)) ||
+		 (cache_ptr->min_clean_size != (72 * 1024)) ||
+		 (cache_ptr->index_len != 3) ||
+                 (cache_ptr->index_size !=
+		   2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (8).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Insert a third monster entry.  Should be no cache size increase this
      * time.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 6);
 
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 6, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (144 * 1024)) ||
+		 (cache_ptr->min_clean_size != (72 * 1024)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE)) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (9).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* delete existing entries to prepare for next test, and reset
      * the size of the cache.  We must also change the size of the needed
      * variable entries before we run the test, so will protect and
      * unprotect them now so as to get the correct initial size.
      */
-    if ( pass ) {
+    if(pass) {
 
 	expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 5);
 	expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 6);
@@ -20910,34 +20907,34 @@ check_auto_cache_resize(hbool_t cork_ageout)
 	flush_cache(file_ptr, TRUE, FALSE, FALSE);
 
 
-        if ( pass ) {
+        if(pass) {
 
             auto_size_ctl.initial_size           = 6 * 1024;
             result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-            if ( result != SUCCEED ) {
+            if(result != SUCCEED) {
 
                 pass = FALSE;
                 failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
 	    }
         }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (3 * 1024) ) ||
-		 ( cache_ptr->index_len != 0 ) ||
-                 ( cache_ptr->index_size != 0 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (3 * 1024)) ||
+		 (cache_ptr->index_len != 0) ||
+                 (cache_ptr->index_size != 0) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (10).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now load the variable entries into the cache */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__NO_FLAGS_SET);
@@ -20951,122 +20948,122 @@ check_auto_cache_resize(hbool_t cork_ageout)
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (3 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 4 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (3 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 4 * 1024) ||
+		 (cache_ptr->cache_accesses != 4)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (11).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect a variable entry, and re-size it to 3K.  Should be
      * no effect on the size of the cache.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, (3 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__DIRTIED_FLAG);
 
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (3 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 6 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 5 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (3 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 6 * 1024) ||
+		 (cache_ptr->cache_accesses != 5)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (12).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect the variable entry again, and re-size it to 10K.  Should
      * resize the cache to 13 KB.  Note that cache_accesses will be 0
      * in this case, since cache_accesses is incremented on the protect.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, (10 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__DIRTIED_FLAG);
 
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (13 * 512) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 13 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (13 * 1024)) ||
+		 (cache_ptr->min_clean_size != (13 * 512)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 13 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (13).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect a second variable entry, and re-size it to 10K.  Should
      * resize to 22 KB.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, (10 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, H5C__DIRTIED_FLAG);
 
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 22 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 22 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (14).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect a third variable entry, and re-size it to 10K.  Should
      * be no change in cache size.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, (10 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__DIRTIED_FLAG);
 
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 31 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 31 * 1024) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (15).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* re-size the variable entries back down to their initial size, and
      * restore the cache to its initial size as well, in preparation
      * for the next test.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, (1 * 1024), TRUE);
@@ -21080,116 +21077,116 @@ check_auto_cache_resize(hbool_t cork_ageout)
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, (1 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__DIRTIED_FLAG);
 
-        if ( pass ) {
+        if(pass) {
 
             auto_size_ctl.initial_size           = 6 * 1024;
             result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-            if ( result != SUCCEED ) {
+            if(result != SUCCEED) {
 
                 pass = FALSE;
                 failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n";
 	    }
         }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (3 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 4 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (3 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 4 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (16).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now test flash cache resizes with pinned entries...
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (6 * 512) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 5 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (6 * 512)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 5 * 1024) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (17).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (13 * 512) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 13 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (13 * 1024)) ||
+		 (cache_ptr->min_clean_size != (13 * 512)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 13 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (18).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 22 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 22 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (19).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 31 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 31 * 1024) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (20).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Unpin the entries.  Note that no entries are evicted as we don't
      * load any entries.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__UNPIN_ENTRY_FLAG);
@@ -21200,25 +21197,25 @@ check_auto_cache_resize(hbool_t cork_ageout)
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__UNPIN_ENTRY_FLAG);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 31 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 31 * 1024) ||
+		 (cache_ptr->cache_accesses != 4)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (21).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* re-size the variable entries back down to their initial size, and
      * restore the cache to its initial size as well, in preparation
      * for the next test.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, (1 * 1024), TRUE);
@@ -21232,112 +21229,112 @@ check_auto_cache_resize(hbool_t cork_ageout)
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, (1 * 1024), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__DIRTIED_FLAG);
 
-        if ( pass ) {
+        if(pass) {
 
             auto_size_ctl.initial_size           = 6 * 1024;
             result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-            if ( result != SUCCEED ) {
+            if(result != SUCCEED) {
 
                 pass = FALSE;
                 failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
 	    }
         }
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (3 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 4 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (3 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 4 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (22).\n";
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (6 * 512) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 5 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (6 * 1024)) ||
+		 (cache_ptr->min_clean_size != (6 * 512)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 5 * 1024) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (23).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (13 * 512) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 13 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (13 * 1024)) ||
+		 (cache_ptr->min_clean_size != (13 * 512)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 13 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (24).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 22 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 22 * 1024) ||
+		 (cache_ptr->cache_accesses != 0)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (25).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__PIN_ENTRY_FLAG);
         resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 31 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 31 * 1024) ||
+		 (cache_ptr->cache_accesses != 1)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (26).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Unpin the entries.  Note that no entries are evicted as we don't
      * load any entries.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, H5C__UNPIN_ENTRY_FLAG);
@@ -21348,12 +21345,12 @@ check_auto_cache_resize(hbool_t cork_ageout)
         protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
         unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, H5C__UNPIN_ENTRY_FLAG);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 4 ) ||
-                 ( cache_ptr->index_size != 31 * 1024 ) ||
-		 ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 4) ||
+                 (cache_ptr->index_size != 31 * 1024) ||
+		 (cache_ptr->cache_accesses != 4)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (27).\n";
@@ -21363,32 +21360,32 @@ check_auto_cache_resize(hbool_t cork_ageout)
     /* We have finished a basic check of the flash cache size increment
      * code.  Tidy up for a more extensive test...
      */
-    if ( pass ) {
+    if(pass) {
 
 	expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10);
 	expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11);
 	expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12);
 	expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (11 * 1024) ) ||
-		 ( cache_ptr->index_len != 0 ) ||
-                 ( cache_ptr->index_size != 0 ) ||
-		 ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (22 * 1024)) ||
+		 (cache_ptr->min_clean_size != (11 * 1024)) ||
+		 (cache_ptr->index_len != 0) ||
+                 (cache_ptr->index_size != 0) ||
+		 (cache_ptr->cache_accesses != 4)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (28).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* ...and then reconfigure.   Note that we change the flash_multiple
      * and flash_threshold just to make sure that such changed perform
      * as expected.
      */
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -21433,86 +21430,84 @@ check_auto_cache_resize(hbool_t cork_ageout)
         auto_size_ctl.empty_reserve          = 0.5f; /* for ease of testing */
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
-
-        if ( result != SUCCEED ) {
-
+        if(result != SUCCEED) {
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 512) ) ||
-	     ( cache_ptr->index_len != 0 ) ||
-	     ( cache_ptr->index_size != 0 ) ||
-	     ( cache_ptr->cache_accesses != 0 ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 512)) ||
+	     (cache_ptr->index_len != 0) ||
+	     (cache_ptr->index_size != 0) ||
+	     (cache_ptr->cache_accesses != 0)) {
 
             pass = FALSE;
             failure_mssg = "bad cache after initialization 15.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect and unprotect a large entry -- no change in cache size since
      * a large entry will just fill the available space in the cache.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (4 * 512) ) ||
-		 ( cache_ptr->index_len != 1 ) ||
-                 ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 1 )  ||
-		 ( rpt_fcn_called == TRUE ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (4 * 1024)) ||
+		 (cache_ptr->min_clean_size != (4 * 512)) ||
+		 (cache_ptr->index_len != 1) ||
+                 (cache_ptr->index_size != LARGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 1)  ||
+		 (rpt_fcn_called == TRUE)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (29).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect and unprotect another a large entry -- should trigger a
      * flash cache size increase to 12 KB (remember that flash_multiple is
      * set to 2.0).
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (12 * 512) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 1 )  ||
-		 ( rpt_fcn_called != TRUE ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (12 * 1024)) ||
+		 (cache_ptr->min_clean_size != (12 * 512)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 1)  ||
+		 (rpt_fcn_called != TRUE)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (30).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* protect and unprotect two more large entries -- shouldnt trigger a
      * flash cache size increase.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
@@ -21521,120 +21516,119 @@ check_auto_cache_resize(hbool_t cork_ageout)
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 3, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
-		 ( cache_ptr->min_clean_size != (12 * 512) ) ||
-		 ( cache_ptr->index_len != 3 ) ||
-                 ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 3 )  ||
-		 ( rpt_fcn_called != FALSE ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (12 * 1024)) ||
+		 (cache_ptr->min_clean_size != (12 * 512)) ||
+		 (cache_ptr->index_len != 3) ||
+                 (cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 3)  ||
+		 (rpt_fcn_called != FALSE)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (31).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* do many accesses of a single entry to talk the cache into reducing
      * its size to the minimum.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, TINY_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->max_cache_size != (4 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024)) ||
+             (cache_ptr->index_size != (1 * TINY_ENTRY_SIZE))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (32).\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Force another flash increase */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
 
-	if ( ( pass ) &&
-	     ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) ||
-		 ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) ||
-		 ( cache_ptr->index_len != 2 ) ||
-                 ( cache_ptr->index_size !=
-		   LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE ) ||
-		 ( cache_ptr->cache_accesses != 1 )  ||
-		 ( rpt_fcn_called == FALSE ) ||
-                 ( rpt_status != flash_increase ) ) ) ) {
+	if(pass &&
+	     (((cache_ptr->max_cache_size != (4 * 1024 + 128)) ||
+		 (cache_ptr->min_clean_size != (2 * 1024 + 64)) ||
+		 (cache_ptr->index_len != 2) ||
+                 (cache_ptr->index_size !=
+		   LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE) ||
+		 (cache_ptr->cache_accesses != 1)  ||
+		 (rpt_fcn_called == FALSE) ||
+                 (rpt_status != flash_increase)))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (33).\n";
 	}
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force regular size increase up to maximum */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 500 ) )
+        while(pass && (i < 500))
         {
             protect_entry(file_ptr, TINY_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass)
                 unprotect_entry(file_ptr, TINY_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
-            }
             i++;
         }
 
-        if ( ( cache_ptr->max_cache_size != (20 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (10 * 1024) ) ||
-	     ( rpt_fcn_called == FALSE ) ||
-             ( rpt_status != at_max_size ) ) {
+        if((cache_ptr->max_cache_size != (20 * 1024)) ||
+             (cache_ptr->min_clean_size != (10 * 1024)) ||
+	     (rpt_fcn_called == FALSE) ||
+             (rpt_status != at_max_size)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache config (34).\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
-
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( ! pass ) {
+    if(pass) {
+        PASSED();
+    } /* end if */
+    else {
+        H5_FAILED();
+    } /* end else */
 
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
-    }
+    if(!pass)
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
 
     return (unsigned)!pass;
-
 } /* check_auto_cache_resize() */
 
 

@@ -21659,7 +21653,7 @@ check_auto_cache_resize(hbool_t cork_ageout)
  */
 
 static unsigned
-check_auto_cache_resize_disable(void)
+check_auto_cache_resize_disable(unsigned paged)
 {
     hbool_t show_progress = FALSE;
     herr_t result;
@@ -21713,25 +21707,27 @@ check_auto_cache_resize_disable(void)
         /* double      empty_reserve          = */ 0.05f
     };
 
-    TESTING("automatic cache resize disable");
+    if(paged)
+        TESTING("automatic cache resize disable (paged aggregation)")
+    else
+        TESTING("automatic cache resize disable")
 
     pass = TRUE;
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* allocate a cache, enable automatic cache resizing, and then force
      * the cache through all its operational modes.  Verify that all
      * performs as expected.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
 
-        if ( file_ptr == NULL ) {
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "file_ptr NULL from setup_cache.";
@@ -21743,28 +21739,28 @@ check_auto_cache_resize_disable(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after initialization.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /******************************************************************
@@ -21774,7 +21770,7 @@ check_auto_cache_resize_disable(void)
      * modes.
      ******************************************************************/
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -21820,119 +21816,119 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- increase disabled so should
      * be no change in cache size, and result should be increase_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != increase_disabled ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != increase_disabled) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- make sure that we haven't disabled decreases.
      * should result in a decrease cache size from 4 to 2 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate again -- increase disabled so should
      * be no change in cache size, and result should be increase_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != increase_disabled ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != increase_disabled) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 3.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Repeat the above tests, disabling increase through the lower
      * threshold instead of the increment.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -21977,119 +21973,119 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- increase disabled so should
      * be no change in cache size, and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 4.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- make sure that we haven't disabled decreases.
      * should result in a decrease cache size from 4 to 2 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate again -- increase disabled so should
      * be no change in cache size, and result should be increase_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 6.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Repeat the above tests yet again, disabling increase through the
      * incr_mode.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22135,118 +22131,118 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 3.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate with cache full -- increase disabled so should
      * be no change in cache size, and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 7.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- make sure that we haven't disabled decreases.
      * should result in a decrease cache size from 4 to 2 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 8.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate again -- increase disabled so should
      * be no change in cache size, and result should be increase_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_increase_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 9.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now, disable size decreases, and repeat the above tests.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22292,118 +22288,118 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 4.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no change in cache size,
      * and result should be decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 10.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 11.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again -- should be no change in cache size,
      * and result should be decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 12.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Repeat the above tests, disabling decrease through the upper
      * threshold instead of the decrement.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22449,117 +22445,117 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no change in cache size,
      * and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 13.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 14.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again -- should be no change in cache size,
      * and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 15.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Repeat the above tests, disabling decrease through the decr_mode.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22605,119 +22601,119 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 6.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no change in cache size,
      * and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 16.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 17.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate again -- should be no change in cache size,
      * and result should be in_spec.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 18.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now do tests disabling size decrement in age out mode.
      *
      * Start by disabling size decrement by setting max_decrement to zero.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22763,188 +22759,188 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 7.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         /* 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++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* load up the cache with small entries.  Note that it will take an
      * epoch for the ageout code to initialize itself if it is enabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 19.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load up some more small entries.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 20.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now force a high hit rate so that the size increase code is
      * is satisfied.  We would see a decrease here if decrease were
      * possible.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 21.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 22.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* just bang on a single entry.  This will see to it that there are
      * many entries that could be aged out were decreases enabled.
      * Should be no change in cache size, and result should be
      * decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 23.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now disable size decrement in age out mode via the empty reserve.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -22990,183 +22986,183 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 9.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 8.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         /* 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++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* load up the cache with small entries.  Note that it will take an
      * epoch for the ageout code to initialize itself if it is enabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 24.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load up some more small entries.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 25.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now force a high hit rate so that the size increase code is
      * is satisfied.  We would see a decrease here if decrease were
      * possible.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 26.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 27.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* just bang on a single entry.  This will see to it that there are
      * many entries that could be aged out were decreases enabled.
      * Should be no change in cache size, and result should be
      * decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 28.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now work with age out with threshold.  One can argue that we should
      * repeat the above age out tests with age out with threshold, but the
@@ -23178,7 +23174,7 @@ check_auto_cache_resize_disable(void)
      * to 1.0.  Test this now.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23224,92 +23220,92 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 10.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 9.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         /* 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++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* load up the cache with small entries.  Note that it will take an
      * epoch for the ageout code to initialize itself if it is enabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 29.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Load up some more small entries.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 1000;
-        while ( ( pass ) && ( i < 2000 ) )
+        while(pass && (i < 2000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != not_full ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != not_full) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 30.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now force a high hit rate so that the size increase code is
      * is satisfied.  We would see a decrease here if decrease were
@@ -23317,62 +23313,62 @@ check_auto_cache_resize_disable(void)
      *
      * rpt_status should be decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->index_len != 2000 ) ||
-             ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->index_len != 2000) ||
+             (cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 31.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- cache size should increase from 4 to 6 Meg.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != increase ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != increase) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 32.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* just bang on a single entry.  This keeps the hit rate high, and sees
      * to it that there are many entries that could be aged out were
@@ -23381,32 +23377,32 @@ check_auto_cache_resize_disable(void)
      * Should be no change in cache size, and result should be
      * decrease_disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 999);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 999, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( rpt_status != decrease_disabled ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((!rpt_fcn_called) ||
+             (cache_ptr->size_decrease_possible) ||
+             (rpt_status != decrease_disabled) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 33.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /*********************************************************************
@@ -23416,7 +23412,7 @@ check_auto_cache_resize_disable(void)
      * check them all.
      *********************************************************************/
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23462,88 +23458,88 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 11.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 10.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 34.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 35.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23589,88 +23585,88 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 11.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 36.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 37.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23716,88 +23712,88 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 12.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 38.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (6 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (3 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 39.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23843,88 +23839,88 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 13.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 40.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 41.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -23971,88 +23967,88 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 14.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 42.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 43.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24099,86 +24095,86 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 16.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 15.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force low hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 44.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* force high hit rate -- should be no response as the auto-resize
      * code should be disabled.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( rpt_fcn_called ) ||
-             ( cache_ptr->resize_enabled ) ||
-             ( cache_ptr->size_increase_possible ) ||
-             ( cache_ptr->size_decrease_possible ) ||
-             ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+        if((rpt_fcn_called) ||
+             (cache_ptr->resize_enabled) ||
+             (cache_ptr->size_increase_possible) ||
+             (cache_ptr->size_decrease_possible) ||
+             (cache_ptr->max_cache_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (2 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 45.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* Now test the flash cache size increment code to verify that it
@@ -24208,7 +24204,7 @@ check_auto_cache_resize_disable(void)
      * code enabled.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24255,17 +24251,17 @@ check_auto_cache_resize_disable(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 17.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (32 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (64 * 1024)) ||
+             (cache_ptr->min_clean_size != (32 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 16.\n";
@@ -24276,19 +24272,19 @@ check_auto_cache_resize_disable(void)
      * size.  Protect and unprotect an entry to allow the cache to evict
      * entries and get within bounds
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( pass ) &&
-             ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-                 ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-                 ( cache_ptr->index_len != 1 ) ||
-                 ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
-                 ( rpt_fcn_called != FALSE ) ) ) ) {
+        if(pass &&
+             (((cache_ptr->max_cache_size != (64 * 1024)) ||
+                 (cache_ptr->min_clean_size != (32 * 1024)) ||
+                 (cache_ptr->index_len != 1) ||
+                 (cache_ptr->index_size != LARGE_ENTRY_SIZE) ||
+                 (rpt_fcn_called != FALSE)))) {
 
 	    HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
 		      (long)(cache_ptr->max_cache_size));
@@ -24306,7 +24302,7 @@ check_auto_cache_resize_disable(void)
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Now protect and unprotect a monster entry.  If the flash cache
      * size increment code was active, this would trigger an increase.
@@ -24315,19 +24311,19 @@ check_auto_cache_resize_disable(void)
      * This finishes the additional tests needed for the flash cache
      * size increase code.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
 
-        if ( ( pass ) &&
-             ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
-                 ( cache_ptr->min_clean_size != (32 * 1024) ) ||
-                 ( cache_ptr->index_len != 1 ) ||
-                 ( cache_ptr->index_size != MONSTER_ENTRY_SIZE ) ||
-                 ( rpt_fcn_called != FALSE ) ) ) ) {
+        if(pass &&
+             (((cache_ptr->max_cache_size != (64 * 1024)) ||
+                 (cache_ptr->min_clean_size != (32 * 1024)) ||
+                 (cache_ptr->index_len != 1) ||
+                 (cache_ptr->index_size != MONSTER_ENTRY_SIZE) ||
+                 (rpt_fcn_called != FALSE)))) {
 
 	    HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
 		      (long)(cache_ptr->max_cache_size));
@@ -24345,18 +24341,18 @@ check_auto_cache_resize_disable(void)
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -24384,7 +24380,7 @@ check_auto_cache_resize_disable(void)
  */
 
 static unsigned
-check_auto_cache_resize_epoch_markers(void)
+check_auto_cache_resize_epoch_markers(unsigned paged)
 {
     hbool_t show_progress = FALSE;
     herr_t result;
@@ -24439,49 +24435,51 @@ check_auto_cache_resize_epoch_markers(void)
         /* double      empty_reserve          = */ 0.05f
     };
 
-    TESTING("automatic cache resize epoch marker management");
+    if(paged)
+        TESTING("automatic cache resize epoch marker management (paged aggregation)")
+    else
+        TESTING("automatic cache resize epoch marker management")
 
     pass = TRUE;
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after initialization.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
     /* Now make sure that we are managing the epoch markers correctly.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24527,87 +24525,87 @@ check_auto_cache_resize_epoch_markers(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Since we just created the cache, there should be no epoch markers
      * active.  Verify that this is true.
      */
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 0 ) {
+        if(cache_ptr->epoch_markers_active != 0) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != in_spec ) ||
-             ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != in_spec) ||
+             (cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024)) ||
+             (cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 0.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
-    if ( pass ) {
+    if(pass) {
 
         j = 2;
-        while ( ( pass ) && ( j <= 10 ) )
+        while(pass && (j <= 10))
         {
 
             rpt_fcn_called = FALSE;
             i = (j - 2) * 1000;
-            while ( ( pass ) && ( i < (j - 1) * 1000 ) )
+            while(pass && (i < (j - 1) * 1000))
             {
                 protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-                if ( pass ) {
+                if(pass) {
                     unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
                 }
                 i++;
             }
 
-            if ( ( ! rpt_fcn_called ) ||
-                 ( rpt_status != in_spec ) ||
-                 ( cache_ptr->epoch_markers_active != j ) ) {
+            if((!rpt_fcn_called) ||
+                 (rpt_status != in_spec) ||
+                 (cache_ptr->epoch_markers_active != j)) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected # of epoch markers 2.\n";
@@ -24617,45 +24615,45 @@ check_auto_cache_resize_epoch_markers(void)
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* we now have a full complement of epoch markers -- see if
      * we get the expected reduction.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 9000;
-        while ( ( pass ) && ( i < 10000 ) )
+        while(pass && (i < 10000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size !=
-               (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ||
-             ( cache_ptr->min_clean_size !=
-               ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) ||
-             ( cache_ptr->index_size !=
-               (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size !=
+               (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE)) ||
+             (cache_ptr->min_clean_size !=
+               ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2)) ||
+             (cache_ptr->index_size !=
+               (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 1.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* now reduce the epochs before eviction, and see if the cache
      * deletes the extra markers
      */
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24701,30 +24699,30 @@ check_auto_cache_resize_epoch_markers(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* There should be exactly one active epoch marker at present.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 1 ) {
+        if(cache_ptr->epoch_markers_active != 1) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 3.\n";
@@ -24735,38 +24733,38 @@ check_auto_cache_resize_epoch_markers(void)
      * not accessed in this epoch gets evicted, and the cache size
      * is reduced.
      */
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 9000;
-        while ( ( pass ) && ( i < 10000 ) )
+        while(pass && (i < 10000))
         {
             protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
                 unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
             i++;
         }
 
-        if ( ( ! rpt_fcn_called ) ||
-             ( rpt_status != decrease ) ||
-             ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ||
-             ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) {
+        if((!rpt_fcn_called) ||
+             (rpt_status != decrease) ||
+             (cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024)) ||
+             (cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE))) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 2.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* There should be exactly one active epoch marker at present...
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 1 ) {
+        if(cache_ptr->epoch_markers_active != 1) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 4.\n";
@@ -24776,7 +24774,7 @@ check_auto_cache_resize_epoch_markers(void)
     /* shift the decrement mode to threshold, and verify that we remove
      * all epoch markers.
      */
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24822,17 +24820,17 @@ check_auto_cache_resize_epoch_markers(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after set resize re-config 3.\n";
@@ -24841,21 +24839,21 @@ check_auto_cache_resize_epoch_markers(void)
 
     /* ... and now there should be none.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 0 ) {
+        if(cache_ptr->epoch_markers_active != 0) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 5.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* shift the decrement mode to age out with threshold.  Set epochs
      * before eviction to 10 again.
      */
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -24901,7 +24899,7 @@ check_auto_cache_resize_epoch_markers(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
@@ -24910,39 +24908,39 @@ check_auto_cache_resize_epoch_markers(void)
 
     /* Verify that there are no active epoch markers.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 0 ) {
+        if(cache_ptr->epoch_markers_active != 0) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 6.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* build up a full set of epoch markers. */
-    if ( pass ) {
+    if(pass) {
 
         j = 1;
-        while ( ( pass ) && ( j <= 10 ) )
+        while(pass && (j <= 10))
         {
 
             rpt_fcn_called = FALSE;
             i = (j - 1) * 1000;
-            while ( ( pass ) && ( i < j * 1000 ) )
+            while(pass && (i < j * 1000))
             {
                 protect_entry(file_ptr, SMALL_ENTRY_TYPE, i);
 
-                if ( pass ) {
+                if(pass) {
                     unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
                 }
                 i++;
             }
 
-            if ( ( ! rpt_fcn_called ) ||
-                 ( rpt_status != in_spec ) ||
-                 ( cache_ptr->epoch_markers_active != j ) ) {
+            if((!rpt_fcn_called) ||
+                 (rpt_status != in_spec) ||
+                 (cache_ptr->epoch_markers_active != j)) {
 
                 pass = FALSE;
                 failure_mssg = "Unexpected # of epoch markers 7.\n";
@@ -24952,13 +24950,13 @@ check_auto_cache_resize_epoch_markers(void)
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* Verify that there are now 10 active epoch markers.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 10 ) {
+        if(cache_ptr->epoch_markers_active != 10) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 8.\n";
@@ -24968,7 +24966,7 @@ check_auto_cache_resize_epoch_markers(void)
     /* shift the decrement mode to off.  This should cause all epoch
      * markers to be removed.
      */
-    if ( pass ) {
+    if(pass) {
 
         auto_size_ctl.version                = H5C__CURR_AUTO_SIZE_CTL_VER;
         auto_size_ctl.rpt_fcn                = test_rpt_fcn;
@@ -25014,7 +25012,7 @@ check_auto_cache_resize_epoch_markers(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
@@ -25023,44 +25021,44 @@ check_auto_cache_resize_epoch_markers(void)
 
     /* Verify that there are now no active epoch markers.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( cache_ptr->epoch_markers_active != 0 ) {
+        if(cache_ptr->epoch_markers_active != 0) {
 
             pass = FALSE;
             failure_mssg = "Unexpected # of epoch markers 9.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
     /* verify that we still have the expected number of entries in the cache,
      * and that the cache is of the expected size.
      */
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )||
-             ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) ||
-             ( cache_ptr->index_len != 10000 ) ) {
+        if((cache_ptr->max_cache_size != (8 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (4 * 1024 * 1024))||
+             (cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE)) ||
+             (cache_ptr->index_len != 10000)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache size change results 3.\n";
         }
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+    if(show_progress) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -25093,7 +25091,7 @@ check_auto_cache_resize_epoch_markers(void)
  */
 
 static unsigned
-check_auto_cache_resize_input_errs(void)
+check_auto_cache_resize_input_errs(unsigned paged)
 {
     herr_t result;
     H5F_t * file_ptr = NULL;
@@ -25147,7 +25145,10 @@ check_auto_cache_resize_input_errs(void)
     H5C_auto_size_ctl_t invalid_auto_size_ctl;
     H5C_auto_size_ctl_t test_auto_size_ctl;
 
-    TESTING("automatic cache resize input errors");
+    if(paged)
+        TESTING("automatic cache resize input errors (paged aggregation)")
+    else
+        TESTING("automatic cache resize input errors")
 
     pass = TRUE;
 
@@ -25157,55 +25158,54 @@ check_auto_cache_resize_input_errs(void)
      * and that the configuration is not modified.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &ref_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (512 * 1024)) ||
+             (cache_ptr->min_clean_size != (256 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after initialization.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 1.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 1.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25251,7 +25251,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(NULL, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25259,18 +25259,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 2.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 2.";
@@ -25280,7 +25280,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* check bad version rejection. */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version                = -1; /* INVALID */
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25326,7 +25326,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25334,18 +25334,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 3.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 3.";
@@ -25355,7 +25355,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* check bad initial size rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25402,7 +25402,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25410,25 +25410,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 4.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 4.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25475,7 +25475,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25483,18 +25483,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 5.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 5.";
@@ -25504,7 +25504,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for invalid min clean fraction rejection. */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25550,7 +25550,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25558,25 +25558,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 6.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 6.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25622,7 +25622,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25630,18 +25630,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 7.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 7.";
@@ -25651,7 +25651,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for invalid max_size and/or min_size rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25698,7 +25698,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25706,25 +25706,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 8.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 8.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25770,7 +25770,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25778,25 +25778,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 9.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 9.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25842,7 +25842,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25850,18 +25850,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 10.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 10.";
@@ -25871,7 +25871,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for invalid epoch_length rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25917,7 +25917,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25925,25 +25925,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 11.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 11.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -25989,7 +25989,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -25997,18 +25997,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 12.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 12.";
@@ -26018,7 +26018,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad incr_mode rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26065,7 +26065,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26073,25 +26073,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 13.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 13.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26138,7 +26138,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26146,18 +26146,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 14.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 14.";
@@ -26167,7 +26167,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* check for bad upper and/or lower threshold rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26213,7 +26213,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26221,25 +26221,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 15.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 15.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26285,7 +26285,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26293,25 +26293,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 16.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 16.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26357,7 +26357,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26365,18 +26365,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 17.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 17.";
@@ -26386,7 +26386,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad increment rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26433,7 +26433,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26441,18 +26441,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 18.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 18.";
@@ -26461,7 +26461,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad flash_incr_mode rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26508,7 +26508,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26516,18 +26516,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 19.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 19.";
@@ -26536,7 +26536,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad flash_multiple rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26583,7 +26583,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26591,25 +26591,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 20.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 20.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26656,7 +26656,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26664,18 +26664,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 21.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 21.";
@@ -26684,7 +26684,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad flash_threshold rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26731,7 +26731,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26739,25 +26739,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 22.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 22.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26804,7 +26804,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26812,18 +26812,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 23.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 23.";
@@ -26833,7 +26833,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* test for bad decr_mode rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26880,7 +26880,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26888,25 +26888,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 24.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 24.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -26953,7 +26953,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -26961,18 +26961,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 25.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 25.";
@@ -26982,7 +26982,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* check for bad decrement rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27028,7 +27028,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -27036,25 +27036,25 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 26.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 26.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27100,7 +27100,7 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -27108,18 +27108,18 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 27.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 27.";
@@ -27129,7 +27129,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* check for rejection of bad epochs_before_eviction */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27175,32 +27175,32 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 28.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 28.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27247,25 +27247,25 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 29.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 29.";
@@ -27275,7 +27275,7 @@ check_auto_cache_resize_input_errs(void)
 
     /* Check for bad apply_empty_reserve rejection */
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27321,32 +27321,32 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 30.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 30.";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         invalid_auto_size_ctl.version            = H5C__CURR_AUTO_SIZE_CTL_VER;
         invalid_auto_size_ctl.rpt_fcn                = NULL;
@@ -27393,25 +27393,25 @@ check_auto_cache_resize_input_errs(void)
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &invalid_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 2.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr,
                                                   &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed 31.";
 
-        } else if ( ! resize_configs_are_equal(&test_auto_size_ctl, \
-                                               &ref_auto_size_ctl, FALSE) ) {
+        } else if(!resize_configs_are_equal(&test_auto_size_ctl, \
+                                               &ref_auto_size_ctl, FALSE)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected auto resize config 31.";
@@ -27423,11 +27423,11 @@ check_auto_cache_resize_input_errs(void)
      * H5C_get_cache_auto_resize_config invalid data.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(NULL, &test_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -27435,12 +27435,12 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config((const H5C_t *)&test_auto_size_ctl,
                                                   &test_auto_size_ctl);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -27448,11 +27448,11 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_auto_resize_config(cache_ptr, NULL);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
@@ -27460,14 +27460,14 @@ check_auto_cache_resize_input_errs(void)
         }
     }
 
-    if ( cache_ptr ) {
+    if(cache_ptr) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -27500,7 +27500,7 @@ check_auto_cache_resize_input_errs(void)
  */
 
 static unsigned
-check_auto_cache_resize_aux_fcns(void)
+check_auto_cache_resize_aux_fcns(unsigned paged)
 {
     herr_t result;
     int32_t i;
@@ -27510,7 +27510,7 @@ check_auto_cache_resize_aux_fcns(void)
     size_t max_size;
     size_t min_clean_size;
     size_t cur_size;
-    int32_t cur_num_entries;
+    uint32_t cur_num_entries;
     H5C_auto_size_ctl_t auto_size_ctl =
     {
         /* int32_t     version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
@@ -27561,37 +27561,39 @@ check_auto_cache_resize_aux_fcns(void)
     };
 
 
-    TESTING("automatic cache resize auxilary functions");
+    if(paged)
+        TESTING("automatic cache resize auxilary functions (paged aggregation)")
+    else
+        TESTING("automatic cache resize auxilary functions")
 
     pass = TRUE;
 
     /* allocate a cache, and then test the various auxilary functions.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
         cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
-             ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+        if((cache_ptr->max_cache_size != (1 * 1024 * 1024)) ||
+             (cache_ptr->min_clean_size != (512 * 1024))) {
 
             pass = FALSE;
             failure_mssg = "bad cache size after initialization.\n";
@@ -27602,26 +27604,26 @@ check_auto_cache_resize_aux_fcns(void)
      * H5C_reset_cache_hit_rate_stats() pair.
      */
 
-    if ( pass ) {
+    if(pass) {
 
-        if ( ( H5C_get_cache_hit_rate(NULL, &hit_rate) != FAIL ) ||
-             ( H5C_get_cache_hit_rate(cache_ptr, NULL) != FAIL ) ) {
+        if((H5C_get_cache_hit_rate(NULL, &hit_rate) != FAIL) ||
+             (H5C_get_cache_hit_rate(cache_ptr, NULL) != FAIL)) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate accepts bad params.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( !H5_DBL_ABS_EQUAL(hit_rate, (double)0.0f) ) {   /* 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 =
@@ -27629,15 +27631,15 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, PICO_ENTRY_TYPE, i);
 
-            if ( pass ) {
+            if(pass) {
 
                 unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
             }
@@ -27645,28 +27647,28 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( !H5_DBL_ABS_EQUAL(hit_rate, (double)0.0f) ) {   /* 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 =
                 "H5C_get_cache_hit_rate returned unexpected hit rate 2.\n";
 
-        } else if ( ( cache_ptr->cache_accesses != 1000 ) ||
-                    ( cache_ptr->cache_hits != 0 ) ) {
+        } else if((cache_ptr->cache_accesses != 1000) ||
+                    (cache_ptr->cache_hits != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache hit rate stats.\n";
 
-        } else if ( rpt_fcn_called ) {
+        } else if(rpt_fcn_called) {
 
             pass = FALSE;
             failure_mssg = "Report function called?.\n";
@@ -27674,15 +27676,15 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, PICO_ENTRY_TYPE, 0);
 
-            if ( pass ) {
+            if(pass) {
 
                 unprotect_entry(file_ptr, PICO_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
             }
@@ -27690,28 +27692,28 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( ! H5_DBL_ABS_EQUAL(hit_rate, (double)0.5f) ) { /* 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 =
                 "H5C_get_cache_hit_rate returned unexpected hit rate 3.\n";
 
-        } else if ( ( cache_ptr->cache_accesses != 2000 ) ||
-                    ( cache_ptr->cache_hits != 1000 ) ) {
+        } else if((cache_ptr->cache_accesses != 2000) ||
+                    (cache_ptr->cache_hits != 1000)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache hit rate stats.\n";
 
-        } else if ( rpt_fcn_called ) {
+        } else if(rpt_fcn_called) {
 
             pass = FALSE;
             failure_mssg = "Report function called?.\n";
@@ -27719,18 +27721,18 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_reset_cache_hit_rate_stats(NULL);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_reset_cache_hit_rate_stats accepted NULL cache_ptr.\n";
 
-        } else if ( ( cache_ptr->cache_accesses != 2000 ) ||
-                    ( cache_ptr->cache_hits != 1000 ) ) {
+        } else if((cache_ptr->cache_accesses != 2000) ||
+                    (cache_ptr->cache_hits != 1000)) {
 
             pass = FALSE;
             failure_mssg =
@@ -27738,17 +27740,17 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_reset_cache_hit_rate_stats(cache_ptr);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_reset_cache_hit_rate_stats failed.\n";
 
-        } else if ( ( cache_ptr->cache_accesses != 0 ) ||
-                    ( cache_ptr->cache_hits != 0 ) ) {
+        } else if((cache_ptr->cache_accesses != 0) ||
+                    (cache_ptr->cache_hits != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache hit rate stats.\n";
@@ -27756,15 +27758,15 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         rpt_fcn_called = FALSE;
         i = 0;
-        while ( ( pass ) && ( i < 1000 ) )
+        while(pass && (i < 1000))
         {
             protect_entry(file_ptr, PICO_ENTRY_TYPE, i + 500);
 
-            if ( pass ) {
+            if(pass) {
 
                 unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i + 500, H5C__NO_FLAGS_SET);
             }
@@ -27773,28 +27775,28 @@ check_auto_cache_resize_aux_fcns(void)
     }
 
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( ! H5_DBL_ABS_EQUAL(hit_rate, (double)0.5F) ) { /* 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 =
                 "H5C_get_cache_hit_rate returned unexpected hit rate 4.\n";
 
-        } else if ( ( cache_ptr->cache_accesses != 1000 ) ||
-                    ( cache_ptr->cache_hits != 500 ) ) {
+        } else if((cache_ptr->cache_accesses != 1000) ||
+                    (cache_ptr->cache_hits != 500)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache hit rate stats.\n";
 
-        } else if ( rpt_fcn_called ) {
+        } else if(rpt_fcn_called) {
 
             pass = FALSE;
             failure_mssg = "Report function called?.\n";
@@ -27808,19 +27810,19 @@ check_auto_cache_resize_aux_fcns(void)
      * H5C_get_cache_size().
      ***************************************************/
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_get_cache_size(NULL, &max_size, &min_clean_size,
                                     &cur_size, &cur_num_entries);
 
-        if ( result != FAIL ) {
+        if(result != FAIL) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size accepted NULL cache_ptr.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         max_size        = 0;
         min_clean_size  = 0;
@@ -27830,30 +27832,30 @@ check_auto_cache_resize_aux_fcns(void)
         result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size,
                                     &cur_size, &cur_num_entries);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 1.\n";
 
-        } else if ( max_size != (1 * 1024 * 1024) ) {
+        } else if(max_size != (1 * 1024 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected max_size 1.\n";
 
-        } else if ( min_clean_size != (512 * 1024) ) {
+        } else if(min_clean_size != (512 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected min_clean_size 1.\n";
 
-        } else if ( cur_size != (1500 * PICO_ENTRY_SIZE) ) {
+        } else if(cur_size != (1500 * PICO_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected cur_size 1.\n";
 
-        } else if ( cur_num_entries != 1500 ) {
+        } else if(cur_num_entries != 1500) {
 
             pass = FALSE;
             failure_mssg =
@@ -27864,16 +27866,16 @@ check_auto_cache_resize_aux_fcns(void)
     /* read a larger entry so that cur_size and cur_num_entries will be
      * different.
      */
-    if ( pass ) {
+    if(pass) {
 
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
     }
 
-    if ( pass ) {
+    if(pass) {
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__NO_FLAGS_SET);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         max_size        = 0;
         min_clean_size  = 0;
@@ -27883,31 +27885,31 @@ check_auto_cache_resize_aux_fcns(void)
         result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size,
                                     &cur_size, &cur_num_entries);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 2.\n";
 
-        } else if ( max_size != (1 * 1024 * 1024) ) {
+        } else if(max_size != (1 * 1024 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected max_size 2.\n";
 
-        } else if ( min_clean_size != (512 * 1024) ) {
+        } else if(min_clean_size != (512 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected min_clean_size 2.\n";
 
-        } else if ( cur_size !=
-                   ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) {
+        } else if(cur_size !=
+                   ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg =
                 "H5C_get_cache_size reports unexpected cur_size 2.\n";
 
-        } else if ( cur_num_entries != 1501 ) {
+        } else if(cur_num_entries != 1501) {
 
             pass = FALSE;
             failure_mssg =
@@ -27915,18 +27917,18 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         max_size        = 0;
 
         result = H5C_get_cache_size(cache_ptr, &max_size, NULL, NULL, NULL);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 3.\n";
 
-        } else if ( max_size != (1 * 1024 * 1024) ) {
+        } else if(max_size != (1 * 1024 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
@@ -27935,19 +27937,19 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         min_clean_size  = 0;
 
         result = H5C_get_cache_size(cache_ptr, NULL, &min_clean_size,
                                     NULL, NULL);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 4.\n";
 
-        } else if ( min_clean_size != (512 * 1024) ) {
+        } else if(min_clean_size != (512 * 1024)) {
 
             pass = FALSE;
             failure_mssg =
@@ -27956,19 +27958,19 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cur_size        = 0;
 
         result = H5C_get_cache_size(cache_ptr, NULL, NULL, &cur_size, NULL);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 5.\n";
 
-        } else if ( cur_size !=
-                   ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) {
+        } else if(cur_size !=
+                   ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE)) {
 
             pass = FALSE;
             failure_mssg =
@@ -27977,19 +27979,19 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cur_num_entries = 0;
 
         result = H5C_get_cache_size(cache_ptr, NULL, NULL, NULL,
                                     &cur_num_entries);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_size failed 6.\n";
 
-        } else if ( cur_num_entries != 1501 ) {
+        } else if(cur_num_entries != 1501) {
 
             pass = FALSE;
             failure_mssg =
@@ -27998,14 +28000,14 @@ check_auto_cache_resize_aux_fcns(void)
         }
     }
 
-    if ( cache_ptr ) {
+    if(cache_ptr) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -28045,7 +28047,7 @@ check_auto_cache_resize_aux_fcns(void)
  */
 
 static unsigned
-check_metadata_blizzard_absence(hbool_t fill_via_insertion)
+check_metadata_blizzard_absence(hbool_t fill_via_insertion, unsigned paged)
 {
     int entry_type = HUGE_ENTRY_TYPE;
     size_t entry_size = HUGE_ENTRY_SIZE; /* 16 KB */
@@ -28067,7 +28069,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
     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: */
+      /* 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},
@@ -28224,30 +28226,32 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     reset_entries();
 
-    if (fill_via_insertion) {
-
-        TESTING("to ensure metadata blizzard absence when inserting");
-
-    } else {
-
-        TESTING("to ensure metadata blizzard absence on protect/unprotect");
-    }
+    if(fill_via_insertion) {
+        if(paged)
+            TESTING("to ensure metadata blizzard absence when inserting (paged aggregation)")
+        else
+            TESTING("to ensure metadata blizzard absence when inserting")
+    } /* end if */
+    else {
+        if(paged)
+            TESTING("to ensure metadata blizzard absence on protect/unprotect (paged aggregation)")
+        else
+            TESTING("to ensure metadata blizzard absence on protect/unprotect")
+    } /* end else */
 
-    if ( show_progress) /* 0 */
-         HDfprintf(stdout, "\n%s: check point %d -- pass %d\n",
-                   FUNC, checkpoint++, pass);
+    if(show_progress) /* 0 */
+         HDfprintf(stdout, "\n%s: check point %d -- pass %d\n", FUNC, checkpoint++, pass);
 
-    if ( 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 */
+        file_ptr = setup_cache((size_t)(50 * entry_size), (size_t)(25 * entry_size), paged);
 
-        if ( file_ptr == NULL) {
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "bad return from cache intialization.\n";
@@ -28257,7 +28261,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
             cache_ptr = file_ptr->shared->cache;
     }
 
-    if ( show_progress) /* 1 */
+    if(show_progress) /* 1 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
@@ -28277,7 +28281,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert 26 entries (indexes 0 through 25) into the cache.
          *
@@ -28290,7 +28294,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
         for (entry_idx = 0; entry_idx < 26; entry_idx++) {
 
-            if (fill_via_insertion) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -28321,7 +28325,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
         }
     }
 
-    if ( show_progress) /* 2 */
+    if(show_progress) /* 2 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
@@ -28341,7 +28345,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 27th entry (index = 26) into the cache.
          *
@@ -28349,7 +28353,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
          * before the insertion because it doesn't satisfy the min_clean_size
          * constraint.
          */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -28391,11 +28395,11 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 3 */
+    if(show_progress) /* 3 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 28th entry (index = 27) into the cache.
          *
@@ -28403,7 +28407,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
          * recently used entry before the insertion as it again does not
          * satisfy the min_clean_size constraint.
          */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -28445,17 +28449,17 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 4 */
+    if(show_progress) /* 4 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -28491,14 +28495,14 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
         }
 
         /* Verify that the cache is now full */
-        if ( cache_ptr->cache_full != TRUE ) {
+        if(cache_ptr->cache_full != TRUE) {
 
             pass = FALSE;
             failure_mssg = "cache not completely filled.\n";
         }
     }
 
-    if ( show_progress) /* 5 */
+    if(show_progress) /* 5 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
@@ -28520,14 +28524,14 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 51st entry (index = 50) into the cache.
          *
          * The cache is full prior to the insertion, so it will
          * have to evict in order to make room for the new entry.
          */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -28573,12 +28577,12 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 6 */
+    if(show_progress) /* 6 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert 49 more entries (indices 51-99) into the cache.
          *
@@ -28590,7 +28594,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
          */
         for (entry_idx = entry_idx; entry_idx < 100; entry_idx++) {
 
-            if (fill_via_insertion) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,          /* int32_t idx */
@@ -28619,7 +28623,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
              * insertions in this loop, then the insertion will
              * have resulted in a flush of the entry inserted
              * 25 insertions ago. */
-            if (entry_idx < 75) {
+            if(entry_idx < 75) {
 
                 expected[entry_idx - 25].is_dirty = FALSE;
                 expected[entry_idx - 25].serialized = TRUE;
@@ -28645,7 +28649,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
         }
     }
 
-    if ( show_progress) /* 7 */
+    if(show_progress) /* 7 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
@@ -28670,7 +28674,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Flush the cache.
          *
@@ -28705,11 +28709,11 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 8 */
+    if(show_progress) /* 8 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert 26 entries (indexes 100 through 125) into the cache.
          *
@@ -28720,7 +28724,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
         for (entry_idx = 100; entry_idx < 126; entry_idx++) {
 
-            if (fill_via_insertion) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -28754,14 +28758,14 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
         }
     }
 
-    if ( show_progress) /* 9 */
+    if(show_progress) /* 9 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 127th entry (index = 126) into the cache. */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -28805,16 +28809,16 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 10 */
+    if(show_progress) /* 10 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -28853,22 +28857,22 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     }
 
-    if ( show_progress) /* 11 */
+    if(show_progress) /* 11 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( cache_ptr ) {
+    if(cache_ptr) {
 
         /* We're done with testing. We can take down the cache. */
         takedown_cache(file_ptr, FALSE, FALSE);
         reset_entries();
     }
 
-    if ( show_progress) /* 12 */
+    if(show_progress) /* 12 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    FUNC, checkpoint++, pass);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
     return (unsigned)!pass;
 
@@ -28889,7 +28893,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
  */
 
 static unsigned
-check_flush_deps(void)
+check_flush_deps(unsigned paged)
 {
     H5F_t * file_ptr = NULL;            /* File for this test */
     H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
@@ -28899,7 +28903,7 @@ check_flush_deps(void)
     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 */
+      /* 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},
@@ -28907,7 +28911,10 @@ check_flush_deps(void)
       { 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}
     };
 
-    TESTING("flush dependencies");
+    if(paged)
+        TESTING("flush dependencies (paged aggregation)")
+    else
+        TESTING("flush dependencies")
 
     pass = TRUE;
 
@@ -28916,16 +28923,16 @@ check_flush_deps(void)
      */
 
     reset_entries();
-    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
     base_addr = entries[entry_type];
 
-    if ( !pass ) CACHE_ERROR("setup_cache failed")
+    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")
+        if(!pass) CACHE_ERROR("insert_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each insertion
@@ -28938,7 +28945,7 @@ check_flush_deps(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     } /* end for */
 
 /* Test Case #1 - Single flush dependency relationship */
@@ -28949,12 +28956,12 @@ check_flush_deps(void)
         test_entry_t * entry_ptr;
 
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        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)
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child, NULL) < 0)
             CACHE_ERROR("H5C_get_entry_status() failed")
         if(!in_cache || is_flush_dep_parent || is_flush_dep_child)
             CACHE_ERROR("invalid entry status")
@@ -28962,18 +28969,18 @@ check_flush_deps(void)
         /* 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)
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child, NULL) < 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")
+        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)
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child, NULL) < 0)
             CACHE_ERROR("H5C_get_entry_status() failed")
         if(!in_cache || !is_flush_dep_parent || is_flush_dep_child)
             CACHE_ERROR("invalid entry status")
@@ -28981,7 +28988,7 @@ check_flush_deps(void)
         /* 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)
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child, NULL) < 0)
             CACHE_ERROR("H5C_get_entry_status() failed")
         if(!in_cache || is_flush_dep_parent || !is_flush_dep_child)
             CACHE_ERROR("invalid entry status")
@@ -29002,19 +29009,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -29030,7 +29037,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #2 - Multiple children for one parent flush dependency relationship */
@@ -29038,13 +29045,13 @@ check_flush_deps(void)
     /* Create flush dependency between entries 0, 1 (children) & 2 (parent) */
     {
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29065,22 +29072,22 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -29097,7 +29104,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3a1 - Single chain of flush dependencies, 4 entries tall
@@ -29107,10 +29114,10 @@ check_flush_deps(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29128,13 +29135,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29152,13 +29159,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29176,19 +29183,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29204,16 +29211,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29229,16 +29236,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29254,7 +29261,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3a2 - Single chain of flush dependencies, 4 entries tall
@@ -29264,10 +29271,10 @@ check_flush_deps(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29285,13 +29292,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29309,13 +29316,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29333,19 +29340,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29361,16 +29368,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29386,16 +29393,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29411,7 +29418,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3b1 - Single chain of flush dependencies, 4 entries tall
@@ -29421,10 +29428,10 @@ check_flush_deps(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29442,13 +29449,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29466,13 +29473,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29490,19 +29497,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29518,16 +29525,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29543,16 +29550,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29568,7 +29575,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3b2 - Single chain of flush dependencies, 4 entries tall
@@ -29578,10 +29585,10 @@ check_flush_deps(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29599,13 +29606,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29623,13 +29630,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29647,19 +29654,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29675,16 +29682,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29700,16 +29707,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29725,7 +29732,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #4 - Multiple children for a single parent */
@@ -29733,11 +29740,11 @@ check_flush_deps(void)
     /* 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")
+        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")
+            if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after creating flush dependency
@@ -29755,7 +29762,7 @@ check_flush_deps(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -29763,7 +29770,7 @@ check_flush_deps(void)
     {
         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")
+            if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after destroying flush dependency
@@ -29778,7 +29785,7 @@ check_flush_deps(void)
                                 entry_type,         /* int32_t type */
                                 4,                  /* int32_t idx */
                                 H5C__NO_FLAGS_SET); /* unsigned int flags */
-                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                if(!pass) CACHE_ERROR("unprotect_entry failed")
 
                 /* Change expected values, and verify the status of the entries
                  * after destroying flush dependency
@@ -29792,7 +29799,7 @@ check_flush_deps(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -29805,10 +29812,10 @@ check_flush_deps(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29826,13 +29833,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29850,13 +29857,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29874,20 +29881,20 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29903,16 +29910,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29928,16 +29935,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -29953,7 +29960,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #5b - Join two flush dependency chains together, creating a
@@ -29965,10 +29972,10 @@ check_flush_deps(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -29986,13 +29993,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30010,13 +30017,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30034,10 +30041,10 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30053,14 +30060,14 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30074,16 +30081,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30099,16 +30106,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30124,16 +30131,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30149,7 +30156,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #5c - Join two flush dependency chains together, creating a
@@ -30161,10 +30168,10 @@ check_flush_deps(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30182,13 +30189,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30206,13 +30213,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30230,10 +30237,10 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30249,14 +30256,14 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30270,16 +30277,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30295,16 +30302,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30320,16 +30327,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30345,7 +30352,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #6a - Make certain that flush dependency relationship with parent
@@ -30355,13 +30362,13 @@ check_flush_deps(void)
     /* Create flush dependency between entries 0 (child) & 1 (parent) */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         pin_entry(entry_type, 1);
-        if ( !pass ) CACHE_ERROR("pin_entry failed")
+        if(!pass) CACHE_ERROR("pin_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30379,22 +30386,22 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         unpin_entry(entry_type, 1);
-        if ( !pass ) CACHE_ERROR("unpin_entry failed")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -30410,7 +30417,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #6b - Make certain that flush dependency relationship with parent
@@ -30420,13 +30427,13 @@ check_flush_deps(void)
     /* Create flush dependency between entries 0 (child) & 1 (parent) */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         pin_entry(entry_type, 1);
-        if ( !pass ) CACHE_ERROR("pin_entry failed")
+        if(!pass) CACHE_ERROR("pin_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30444,29 +30451,29 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -30482,7 +30489,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #7 - Simple multiple parents
@@ -30492,10 +30499,10 @@ check_flush_deps(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30513,13 +30520,13 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30537,19 +30544,19 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30567,16 +30574,16 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -30592,7 +30599,7 @@ check_flush_deps(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 
@@ -30600,7 +30607,7 @@ done:
     if(file_ptr)
         takedown_cache(file_ptr, FALSE, FALSE);
 
-    if ( pass )
+    if(pass)
         PASSED()
     else {
         H5_FAILED();
@@ -30625,13 +30632,16 @@ done:
  */
 
 static unsigned
-check_flush_deps_err(void)
+check_flush_deps_err(unsigned paged)
 {
     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");
+    if(paged)
+        TESTING("flush dependency errors (paged aggregation)")
+    else
+        TESTING("flush dependency errors")
 
     pass = TRUE;
 
@@ -30644,13 +30654,13 @@ check_flush_deps_err(void)
 
         /* Allocate a cache */
         reset_entries();
-        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
-        if ( !pass ) CACHE_ERROR("setup_cache failed")
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
+        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")
+            if(!pass) CACHE_ERROR("insert_entry failed")
         } /* end for */
 
         /* Various test cases */
@@ -30658,152 +30668,152 @@ check_flush_deps_err(void)
             /* 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")
+                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")
+                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")
+                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")
+                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")
+                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")
+                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")
+                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")
+                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")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 0, entry_type, 1);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                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")
+                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")
+                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")
+                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")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 0, entry_type, 1);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
                 protect_entry(file_ptr, entry_type, 1);
-                if ( !pass ) CACHE_ERROR("protect_entry failed")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 1, entry_type, 2);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
                 protect_entry(file_ptr, entry_type, 3);
-                if ( !pass ) CACHE_ERROR("protect_entry failed")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 3, entry_type, 4);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                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")
+                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")
+                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")
+                if(!pass) CACHE_ERROR("unprotect_entry failed")
 
                 destroy_flush_dependency(entry_type, 1, entry_type, 2);
-                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+                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")
+                if(!pass) CACHE_ERROR("unprotect_entry failed")
 
                 destroy_flush_dependency(entry_type, 3, entry_type, 4);
-                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+                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")
+                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")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 0, entry_type, 1);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
                 protect_entry(file_ptr, entry_type, 2);
-                if ( !pass ) CACHE_ERROR("protect_entry failed")
+                if(!pass) CACHE_ERROR("protect_entry failed")
 
                 create_flush_dependency(entry_type, 2, entry_type, 3);
-                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+                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")
+                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")
+                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")
+                if(!pass) CACHE_ERROR("unprotect_entry failed")
 
                 destroy_flush_dependency(entry_type, 2, entry_type, 3);
-                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+                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")
+                if(!pass) CACHE_ERROR("unprotect_entry failed")
                 break;
 
             default:
@@ -30811,7 +30821,7 @@ check_flush_deps_err(void)
         } /* end switch */
 
         takedown_cache(file_ptr, FALSE, FALSE);
-        if ( !pass ) CACHE_ERROR("takedown_cache failed")
+        if(!pass) CACHE_ERROR("takedown_cache failed")
         file_ptr = NULL;
     } /* end for */
 
@@ -30820,7 +30830,7 @@ done:
     if(file_ptr)
         takedown_cache(file_ptr, FALSE, FALSE);
 
-    if ( pass )
+    if(pass)
         PASSED()
     else {
         H5_FAILED();
@@ -30846,7 +30856,7 @@ done:
  */
 
 static unsigned
-check_flush_deps_order(void)
+check_flush_deps_order(unsigned paged)
 {
     H5F_t * file_ptr = NULL;            /* File for this test */
     H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
@@ -30855,7 +30865,7 @@ check_flush_deps_order(void)
     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 */
+      /* 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},
@@ -30864,7 +30874,10 @@ check_flush_deps_order(void)
     };
     unsigned flush_order;       /* Index for tracking flush order */
 
-    TESTING("flush dependencies flush order");
+    if(paged)
+        TESTING("flush dependencies flush order (paged aggregation)")
+    else
+        TESTING("flush dependencies flush order")
 
     pass = TRUE;
 
@@ -30873,15 +30886,15 @@ check_flush_deps_order(void)
      */
 
     reset_entries();
-    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
     cache_ptr = file_ptr->shared->cache;
 
-    if ( !pass ) CACHE_ERROR("setup_cache failed")
+    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")
+        if(!pass) CACHE_ERROR("insert_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each insertion
@@ -30894,7 +30907,7 @@ check_flush_deps_order(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     } /* end for */
 
 /* Test Case #1a - Single flush dependency relationship, increasing addr order */
@@ -30902,10 +30915,10 @@ check_flush_deps_order(void)
     /* Create flush dependency between entries 0 (child) & 1 (parent) */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -30923,7 +30936,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -30939,13 +30952,13 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         1,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Reset index for tracking flush order */
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -30970,13 +30983,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -30990,7 +31003,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #1b - Single flush dependency relationship, decreasing addr order */
@@ -30998,10 +31011,10 @@ check_flush_deps_order(void)
     /* Create flush dependency between entries 0 (child) & 1 (parent) */
     {
         protect_entry(file_ptr, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31018,7 +31031,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -31034,12 +31047,12 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31051,7 +31064,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31069,13 +31082,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31089,7 +31102,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #2a - Multiple children for one parent flush dependency relationship
@@ -31099,13 +31112,13 @@ check_flush_deps_order(void)
     /* Create flush dependency between entries 0, 1 (children) & 2 (parent) */
     {
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31125,7 +31138,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -31143,13 +31156,13 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         2,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31163,7 +31176,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31184,16 +31197,16 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31208,7 +31221,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #2b - Multiple children for one parent flush dependency relationship
@@ -31218,13 +31231,13 @@ check_flush_deps_order(void)
     /* Create flush dependency between entries 1, 2 (children) & 0 (parent) */
     {
         protect_entry(file_ptr, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31244,7 +31257,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -31262,13 +31275,13 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31282,7 +31295,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31303,16 +31316,16 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31327,7 +31340,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3a - Single chain of flush dependencies, 4 entries tall,
@@ -31337,10 +31350,10 @@ check_flush_deps_order(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31357,13 +31370,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31380,13 +31393,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31403,7 +31416,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -31423,26 +31436,26 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         1,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31458,7 +31471,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31483,13 +31496,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31503,10 +31516,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31520,10 +31533,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31537,7 +31550,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #3b - Single chain of flush dependencies, 4 entries tall
@@ -31547,10 +31560,10 @@ check_flush_deps_order(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31567,13 +31580,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31590,13 +31603,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -31613,7 +31626,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
     /* Flush the cache and verify that the entries were flushed in correct order */
@@ -31633,26 +31646,26 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31668,7 +31681,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31694,13 +31707,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31714,10 +31727,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31731,10 +31744,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -31748,7 +31761,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #4a - Multiple children for a single parent, increasing addr order  */
@@ -31756,11 +31769,11 @@ check_flush_deps_order(void)
     /* 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")
+        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")
+            if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after creating flush dependency
@@ -31777,7 +31790,7 @@ check_flush_deps_order(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -31800,7 +31813,7 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         4,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Mark entries 0-4 dirty, so they are flushed */
         dirty_entry(file_ptr, entry_type, 0, FALSE);
@@ -31808,7 +31821,7 @@ check_flush_deps_order(void)
         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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31826,7 +31839,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31853,14 +31866,14 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+            if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after destroying flush dependency
@@ -31881,7 +31894,7 @@ check_flush_deps_order(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -31890,11 +31903,11 @@ check_flush_deps_order(void)
     /* 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")
+        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")
+            if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after creating flush dependency
@@ -31911,7 +31924,7 @@ check_flush_deps_order(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -31934,7 +31947,7 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Mark entries 0-4 dirty, so they are flushed */
         dirty_entry(file_ptr, entry_type, 0, TRUE);
@@ -31942,7 +31955,7 @@ check_flush_deps_order(void)
         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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -31960,7 +31973,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -31987,14 +32000,14 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+            if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
             /* Change expected values, and verify the status of the entries
              * after destroying flush dependency
@@ -32015,7 +32028,7 @@ check_flush_deps_order(void)
                                 (int)0,     /* int tag */
                                 (int)5,     /* int num_entries */
                                 expected);  /* struct expected_entry_staus[] */
-            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+            if(!pass) CACHE_ERROR("verify_entry_status failed")
         } /* end for */
     }
 
@@ -32028,10 +32041,10 @@ check_flush_deps_order(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32048,13 +32061,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32071,13 +32084,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32094,7 +32107,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
     }
 
@@ -32116,26 +32129,26 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -32153,7 +32166,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -32181,13 +32194,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32201,10 +32214,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32218,10 +32231,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32235,7 +32248,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #5b - Join two flush dependency chains together, creating a
@@ -32247,10 +32260,10 @@ check_flush_deps_order(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32267,13 +32280,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32290,13 +32303,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32313,10 +32326,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32331,7 +32344,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
     }
 
@@ -32354,19 +32367,19 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         1,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Mark entries 0-4 dirty, so they are flushed */
         dirty_entry(file_ptr, entry_type, 0, FALSE);
@@ -32374,7 +32387,7 @@ check_flush_deps_order(void)
         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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -32392,7 +32405,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -32422,13 +32435,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32441,10 +32454,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32458,10 +32471,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32475,10 +32488,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32492,7 +32505,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #5c - Join two flush dependency chains together, creating a
@@ -32504,10 +32517,10 @@ check_flush_deps_order(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32524,13 +32537,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32547,13 +32560,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 4);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 4, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32570,10 +32583,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32588,7 +32601,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
     }
 
@@ -32611,19 +32624,19 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         1,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Mark entries 0-4 dirty, so they are flushed */
         dirty_entry(file_ptr, entry_type, 0, FALSE);
@@ -32631,7 +32644,7 @@ check_flush_deps_order(void)
         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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'serialized' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -32649,7 +32662,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -32679,13 +32692,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32698,10 +32711,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32715,10 +32728,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32732,10 +32745,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32749,7 +32762,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #6a - Interlocked multiple parents, increasing addr order
@@ -32760,10 +32773,10 @@ check_flush_deps_order(void)
      */
     {
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32780,13 +32793,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32803,10 +32816,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32821,13 +32834,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 3, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32844,10 +32857,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32862,10 +32875,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -32880,7 +32893,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
     }
 
@@ -32901,26 +32914,26 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         1,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'flushed' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -32936,7 +32949,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -32963,13 +32976,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32982,10 +32995,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -32998,10 +33011,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33015,10 +33028,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33031,10 +33044,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33048,10 +33061,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33065,7 +33078,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 /* Test Case #6b - Interlocked multiple parents, decreasing addr order
@@ -33076,10 +33089,10 @@ check_flush_deps_order(void)
      */
     {
         protect_entry(file_ptr, entry_type, 2);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 2, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33096,13 +33109,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 1);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 1, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33119,10 +33132,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33137,13 +33150,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         protect_entry(file_ptr, entry_type, 0);
-        if ( !pass ) CACHE_ERROR("protect_entry failed")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         create_flush_dependency(entry_type, 0, entry_type, 3);
-        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33160,10 +33173,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33178,10 +33191,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("create_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after creating flush dependency
@@ -33196,7 +33209,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
     }
 
@@ -33217,26 +33230,26 @@ check_flush_deps_order(void)
                         entry_type,         /* int32_t type */
                         0,                  /* int32_t idx */
                         H5C__NO_FLAGS_SET); /* unsigned int flags */
-        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+        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")
+        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")
+        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")
+        if(!pass) CACHE_ERROR("dirty_entry failed")
 
         /* Reset 'flushed' flag & 'flush_order' value in expected array */
         expected[0].serialized = FALSE;
@@ -33252,7 +33265,7 @@ check_flush_deps_order(void)
         flush_order = 0;
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__NO_FLAGS_SET);
-        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+        if(result < 0) CACHE_ERROR("flushing entries with flush dependendices")
 
         /* Change expected values, and verify the status of the entries
          * after destroy flush dependency
@@ -33279,13 +33292,13 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33298,10 +33311,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33314,10 +33327,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33331,10 +33344,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33347,10 +33360,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33364,10 +33377,10 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        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")
+        if(!pass) CACHE_ERROR("destroy_flush_dependency failed")
 
         /* Change expected values, and verify the status of the entries
          * after destroying flush dependency
@@ -33381,7 +33394,7 @@ check_flush_deps_order(void)
                             (int)0,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
     }
 
 
@@ -33389,7 +33402,7 @@ done:
     if(file_ptr)
         takedown_cache(file_ptr, FALSE, FALSE);
 
-    if ( pass )
+    if(pass)
         PASSED()
     else {
         H5_FAILED();
@@ -33414,7 +33427,7 @@ done:
  */
 
 static unsigned
-check_notify_cb(void)
+check_notify_cb(unsigned paged)
 {
     H5F_t * file_ptr = NULL;            /* File for this test */
     H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
@@ -33425,7 +33438,7 @@ check_notify_cb(void)
     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: */
+      /* 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},
@@ -33433,7 +33446,10 @@ check_notify_cb(void)
       { 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");
+    if(paged)
+        TESTING("'notify' callback (paged)")
+    else
+        TESTING("'notify' callback")
 
     pass = TRUE;
 
@@ -33442,17 +33458,17 @@ check_notify_cb(void)
      */
 
     reset_entries();
-    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
-    if ( !file_ptr ) CACHE_ERROR("setup_cache returned NULL")
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024), paged);
+    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")
+    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")
+        if(!pass) CACHE_ERROR("insert_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each insertion
@@ -33465,7 +33481,7 @@ check_notify_cb(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         /* Check the entry's 'after insert' count */
 	entry_ptr = &(base_addr[u]);
@@ -33478,7 +33494,7 @@ check_notify_cb(void)
     /* 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")
+        if(!pass) CACHE_ERROR("expunge_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each expunge
@@ -33493,7 +33509,7 @@ check_notify_cb(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         /* Check the entry's 'before evict' count */
 	entry_ptr = &(base_addr[u]);
@@ -33506,7 +33522,7 @@ check_notify_cb(void)
     /* 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")
+        if(!pass) CACHE_ERROR("protect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each insertion
@@ -33521,7 +33537,7 @@ check_notify_cb(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         /* Check the entry's 'after insert' count */
 	entry_ptr = &(base_addr[u]);
@@ -33534,7 +33550,7 @@ check_notify_cb(void)
     /* 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")
+        if(!pass) CACHE_ERROR("unprotect_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each insertion
@@ -33548,7 +33564,7 @@ check_notify_cb(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         /* Check the entry's 'after insert' count */
 	entry_ptr = &(base_addr[u]);
@@ -33561,7 +33577,7 @@ check_notify_cb(void)
     /* 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")
+        if(!pass) CACHE_ERROR("expunge_entry failed")
 
         /* Change expected values, and verify the status of the entries
          * after each expunge
@@ -33576,7 +33592,7 @@ check_notify_cb(void)
                             (int)u,     /* int tag */
                             (int)5,     /* int num_entries */
                             expected);  /* struct expected_entry_staus[] */
-        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        if(!pass) CACHE_ERROR("verify_entry_status failed")
 
         /* Check the entry's 'before evict' count */
 	entry_ptr = &(base_addr[u]);
@@ -33589,7 +33605,7 @@ check_notify_cb(void)
 done:
     takedown_cache(file_ptr, FALSE, FALSE);
 
-    if ( pass )
+    if(pass)
         PASSED()
     else {
         H5_FAILED();
@@ -33615,7 +33631,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static unsigned
-check_metadata_cork(hbool_t fill_via_insertion)
+check_metadata_cork(hbool_t fill_via_insertion, unsigned paged)
 {
     const char * fcn_name = "check_metadata_cork";
     int entry_type = HUGE_ENTRY_TYPE;
@@ -33795,30 +33811,25 @@ check_metadata_cork(hbool_t fill_via_insertion)
 
     reset_entries();
 
-    if (fill_via_insertion) {
-
-        TESTING("to ensure cork/uncork metadata when inserting");
-
-    } else {
+    if(fill_via_insertion)
+        TESTING("to ensure cork/uncork metadata when inserting")
+    else
+        TESTING("to ensure cork/uncork metadata on protect/unprotect")
 
-        TESTING("to ensure cork/uncork metadata on protect/unprotect");
-    }
-
-    if ( show_progress) /* 0 */
+    if(show_progress) /* 0 */
          HDfprintf(stdout, "\n%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( 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 */
+        file_ptr = setup_cache((size_t)(50 * entry_size), (size_t)(25 * entry_size), paged);
 
-        if ( file_ptr == NULL) {
+        if(file_ptr == NULL) {
 
             pass = FALSE;
             failure_mssg = "bad return from cache intialization.\n";
@@ -33831,7 +33842,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
     /* Cork the cache entry type */
     cork_entry_type(file_ptr, entry_type);
 
-    if ( show_progress) /* 1 */
+    if(show_progress) /* 1 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
@@ -33848,12 +33859,12 @@ check_metadata_cork(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -33885,7 +33896,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
         }
     }
 
-    if ( show_progress) /* 2 */
+    if(show_progress) /* 2 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
@@ -33902,10 +33913,10 @@ check_metadata_cork(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 27th entry (index = 26) into the cache.  */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -33942,14 +33953,14 @@ check_metadata_cork(hbool_t fill_via_insertion)
     }
 
 
-    if ( show_progress) /* 3 */
+    if(show_progress) /* 3 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 28th entry (index = 27) into the cache.  */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           /* H5F_t * file_ptr */
                          entry_type,          /* int32_t type */
                          entry_idx++,          /* int32_t idx */
@@ -33984,17 +33995,17 @@ check_metadata_cork(hbool_t fill_via_insertion)
     }
 
 
-    if ( show_progress) /* 4 */
+    if(show_progress) /* 4 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -34026,14 +34037,14 @@ check_metadata_cork(hbool_t fill_via_insertion)
         }
 
         /* Verify that the cache is now full */
-        if ( cache_ptr->cache_full != TRUE ) {
+        if(cache_ptr->cache_full != TRUE) {
 
             pass = FALSE;
             failure_mssg = "cache not completely filled.\n";
         }
     }
 
-    if ( show_progress) /* 5 */
+    if(show_progress) /* 5 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
@@ -34047,16 +34058,16 @@ check_metadata_cork(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( show_progress) /* 6 */
+    if(show_progress) /* 6 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,          /* int32_t idx */
@@ -34086,7 +34097,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
         }
     }
 
-    if ( show_progress) /* 7 */
+    if(show_progress) /* 7 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
@@ -34102,7 +34113,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
      * ========================================================================
      */
 
-    if ( pass ) {
+    if(pass) {
 
         /* Flush the cache.
          *
@@ -34132,12 +34143,12 @@ check_metadata_cork(hbool_t fill_via_insertion)
                             expected); /* expected */
     }
 
-    if ( show_progress) /* 8 */
+    if(show_progress) /* 8 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Will evict 50 clean "corked" entries all at once when inserting the 100th entry */
 	for(i = 0; i < 51; i++) {
@@ -34147,7 +34158,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
 	}
 
 	/* Insert the 100th entry */
-	if (fill_via_insertion) {
+	if(fill_via_insertion) {
                 insert_entry(file_ptr,          /* H5F_t * file_ptr */
                              entry_type,        /* int32_t type */
                              100,            	/* int32_t idx */
@@ -34178,17 +34189,17 @@ check_metadata_cork(hbool_t fill_via_insertion)
 
     }
 
-    if ( show_progress) /* 9 */
+    if(show_progress) /* 9 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            	/* int32_t idx */
@@ -34225,15 +34236,15 @@ check_metadata_cork(hbool_t fill_via_insertion)
     }
 
 
-    if ( show_progress) /* 10 */
+    if(show_progress) /* 10 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
 
-    if ( pass ) {
+    if(pass) {
 
         /* Insert the 127th entry (index = 126) into the cache. */
-        if (fill_via_insertion) {
+        if(fill_via_insertion) {
             insert_entry(file_ptr,           	/* H5F_t * file_ptr */
                          entry_type,          	/* int32_t type */
                          126,          		/* int32_t idx */
@@ -34267,17 +34278,17 @@ check_metadata_cork(hbool_t fill_via_insertion)
     }
 
 
-    if ( show_progress) /* 11 */
+    if(show_progress) /* 11 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
 
-    if ( 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) {
+            if(fill_via_insertion) {
                 insert_entry(file_ptr,           /* H5F_t * file_ptr */
                              entry_type,          /* int32_t type */
                              entry_idx,            /* int32_t idx */
@@ -34314,7 +34325,7 @@ check_metadata_cork(hbool_t fill_via_insertion)
 
     }
 
-    if ( show_progress) /* 12 */
+    if(show_progress) /* 12 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
@@ -34323,11 +34334,11 @@ check_metadata_cork(hbool_t fill_via_insertion)
     takedown_cache(file_ptr, FALSE, FALSE);
     reset_entries();
 
-    if ( show_progress) /* 13 */
+    if(show_progress) /* 13 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
                    fcn_name, checkpoint++, pass);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
     return (unsigned)!pass;
 
@@ -34365,11 +34376,14 @@ check_metadata_cork(hbool_t fill_via_insertion)
  *-------------------------------------------------------------------------
  */
 static unsigned
-check_entry_deletions_during_scans(void)
+check_entry_deletions_during_scans(unsigned paged)
 {
     H5F_t *      file_ptr = NULL;
 
-    TESTING("entry deletion during list scan detection and adaption");
+    if(paged)
+        TESTING("entry deletion during list scan detection and adaption (paged aggregation)")
+    else
+        TESTING("entry deletion during list scan detection and adaption")
 
     pass = TRUE;
 
@@ -34378,12 +34392,11 @@ check_entry_deletions_during_scans(void)
      * place.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         reset_entries();
 
-        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                                (size_t)(1 * 1024 * 1024));
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
     }
 
     /* run the tests.  This set of tests is somewhat eclectic, as 
@@ -34392,22 +34405,22 @@ check_entry_deletions_during_scans(void)
      * a different entry could cause problems.
      */
 
-    if ( pass ) {
+    if(pass) {
 
         cedds__expunge_dirty_entry_in_flush_test(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cedds__H5C_make_space_in_cache(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cedds__H5C__autoadjust__ageout__evict_aged_out_entries(file_ptr);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         cedds__H5C_flush_invalidate_cache__bucket_scan(file_ptr);
     }
@@ -34416,9 +34429,9 @@ check_entry_deletions_during_scans(void)
 
     takedown_cache(file_ptr, FALSE, FALSE);
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -34472,28 +34485,28 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
        * 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: */
+      /* 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(pass) {
 
-         if ( cache_ptr == NULL ) {
+         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 ) ) {
+        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 ) ) ) {
+        else if((cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+                  (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
 	    pass = FALSE;
 	    failure_mssg =
@@ -34509,7 +34522,7 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* The basic idea of this test is to setup the cache such 
  	 * that:
@@ -34533,14 +34546,14 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_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++ ) {
+	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) ) ) {
+	if((cache_ptr->index_len != 4) ||
+             (cache_ptr->index_size != (4 * HUGE_ENTRY_SIZE))) {
 
             pass = FALSE;
 
@@ -34548,7 +34561,7 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Next, set up the flush operation:
 	 *
@@ -34560,7 +34573,7 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* to summarize, at present the following entries
 	 * are in cache with the following characteristics:
@@ -34587,17 +34600,17 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
 
     /* flush the cache to run the test.  In the process, clean up after test. */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        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";
@@ -34609,54 +34622,45 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
     /* 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 ) ) {
+    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 ) ) {
+        } /* end if */
 
+    if(pass)
+	if((cache_ptr->slist_scan_restarts != 1) ||
+             (cache_ptr->LRU_scan_restarts != 0) ||
+             (cache_ptr->index_scan_restarts != 0)) {
             pass = FALSE;
             failure_mssg = "unexpected scan restart stats in cedds__expunge_dirty_entry_in_flush_test().";
-        }
-    }
+        } /* end if */
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass ) {
-
-	reset_entries();
-    }
-
-    if ( pass ) {
+    if(pass)
+        reset_entries();
 
-	/* reset cache min clean size to its expected value */
+    if(pass)
+        /* reset cache min clean size to its expected value */
         cache_ptr->min_clean_size = (1 * 1024 * 1024);
-    }
 
     return;
 
@@ -34666,7 +34670,7 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
 /*-------------------------------------------------------------------------
  * Function:	cedds__H5C_make_space_in_cache()
  *
- * Purpose:	Verify that H5C_make_space_in_cache() can handle the 
+ * 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.  
  *
@@ -34676,7 +34680,7 @@ cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
  *		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 
+ *		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.
  *
@@ -34710,7 +34714,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
        * 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: */
+      /* 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},
@@ -34749,21 +34753,21 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
       { 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(pass) {
 
-         if ( cache_ptr == NULL ) {
+         if(cache_ptr == NULL) {
 
             pass = FALSE;
-            failure_mssg = "cache_ptr NULL on entry to cedds for H5C_make_space_in_cache() test.";
+            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 ) ) {
+        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 ) ) ) {
+        else if((cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+                  (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
 	    pass = FALSE;
 	    failure_mssg =
@@ -34779,7 +34783,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* The basic idea of this test is to setup the cache such 
  	 * that:
@@ -34807,14 +34811,14 @@ cedds__H5C_make_space_in_cache(H5F_t * file_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++ ) {
+	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) ) ) {
+	if((cache_ptr->index_len != 4) ||
+             (cache_ptr->index_size != (4 * HUGE_ENTRY_SIZE))) {
 
             pass = FALSE;
 
@@ -34822,7 +34826,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* Next, set up the flush operation:
 	 *
@@ -34834,7 +34838,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* to summarize, at present the following entries
 	 * are in cache with the following characteristics:
@@ -34858,17 +34862,17 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
         /* 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++ )
+	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)) ) ) {
+	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)";
@@ -34880,7 +34884,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 	}
     }
 
-    if ( pass ) {
+    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 
@@ -34894,15 +34898,15 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
          * 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
+         * 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(pass) {
 
         /* if the protect succeeded, unprotect and verify that all is at 
          * it should be.
@@ -34911,9 +34915,9 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
         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) ) ) {
+	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)";
@@ -34923,7 +34927,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 	    /* modify the expected table to match the new situation, and 
              * then call verify_entry_status().
              */
-            for ( i = 0; i < num_huge_entries; i++ )
+            for (i = 0; i < num_huge_entries; i++)
             {
 		expected[i].in_cache = FALSE;
 		expected[i].is_dirty = FALSE;
@@ -34935,7 +34939,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 	    expected[1].is_dirty = TRUE;
 	    expected[1].serialized = FALSE;
 
-            for ( i = num_huge_entries; i < num_huge_entries + num_monster_entries - 1; i++ )
+            for (i = num_huge_entries; i < num_huge_entries + num_monster_entries - 1; i++)
             {
 		expected[i].is_dirty = FALSE;
 		expected[i].serialized = TRUE;
@@ -34948,17 +34952,17 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
 
     /* flush the cache and end the test. */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        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";
@@ -34971,80 +34975,73 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
      * 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 ) ) {
+    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 ) ) {
+    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().";
-        }
-    }
+        } /* end if */
 
-    if ( pass ) {
-
-	if ( ( cache_ptr->slist_scan_restarts != 0 ) ||
-             ( cache_ptr->LRU_scan_restarts != 1 ) ||
-             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+    if(pass)
+	if((cache_ptr->slist_scan_restarts != 0) ||
+             (cache_ptr->LRU_scan_restarts != 1) ||
+             (cache_ptr->index_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 ) {
+        } /* end if */
 
-	reset_entries();
-    } 
+#endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass ) {
+    if(pass)
+        reset_entries();
 
-	/* reset cache min clean size to its expected value */
+    if(pass)
+        /* reset cache min clean size to its expected value */
         cache_ptr->min_clean_size = (1 * 1024 * 1024);
-    }
 
     return;
 
@@ -35064,7 +35061,7 @@ cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
  *		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 
+ *		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.
  *
@@ -35096,7 +35093,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
        * 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: */
+      /* 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},	
@@ -35177,21 +35174,21 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
         /* double      empty_reserve          = */ 0.05f
     };
 
-    if ( pass ) {
+    if(pass) {
 
-         if ( cache_ptr == NULL ) {
+         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 ) ) {
+        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 ) ) ) {
+        else if((cache_ptr->max_cache_size != (2 * 1024 * 1024)) ||
+                  (cache_ptr->min_clean_size != (1 * 1024 * 1024))) {
 
 	    pass = FALSE;
 	    failure_mssg =
@@ -35208,14 +35205,14 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
     }
 
     /* save the initial resize configuration so we can restore it later */
-    if ( pass ) {
+    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 ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_get_cache_auto_resize_config failed.";
@@ -35224,18 +35221,18 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
     }
 
     /* set the resize configuration we will be using in the test */
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_set_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl);
 
-        if ( result != SUCCEED ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* The basic idea of this test is to setup the cache such 
  	 * that:
@@ -35266,14 +35263,14 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
          *
          * Recall that the cache size is 2 MB and 32 * 64 KB == 2 MB.
          */
-	for ( i = 1; i < 32; i++ )
+	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 ) {
+    if(pass) {
 
 	/* Next, set up the flush operation:
 	 *
@@ -35285,7 +35282,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* to summarize, at present the following entries
 	 * are in cache with the following characteristics:
@@ -35303,9 +35300,9 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
 	 */
 
 	/* 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) ) ) {
+	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)";
@@ -35318,7 +35315,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
     }
 
     /* protect and unprotect (MET, 31) repeatedly until the end of the first epoch */
-    while ( ( pass ) && ( cache_ptr->cache_accesses > 0 ) ) {
+    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);
@@ -35326,7 +35323,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
 
     /* at this point, an epoch marker entry should have been inserted into the LRU */
 
-    if ( pass ) {
+    if(pass) {
 
         /* protect and unprotect (MET, 31) again to get cache_accesses > 0 */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
@@ -35334,7 +35331,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
     }
 
     /* protect and unprotect (MET, 31) repeatedly until the end of the second epoch */
-    while ( ( pass ) && ( cache_ptr->cache_accesses > 0 ) ) {
+    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);
@@ -35346,10 +35343,10 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
      * moved to the head of the LRU by the ageout algorithm.)
      */
 
-    if ( pass ) {
+    if(pass) {
 
-	if ( ( cache_ptr->index_len != 2 ) ||
-             ( cache_ptr->index_size != 2 * MONSTER_ENTRY_SIZE ) ) {
+	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)";
@@ -35363,7 +35360,7 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
             expected[0].is_dirty = FALSE;
 	    expected[0].serialized = TRUE;
 
-            for ( i = 1; i < 31; i++ )
+            for (i = 1; i < 31; i++)
             {
 		expected[i].in_cache = FALSE;
 		expected[i].is_dirty = FALSE;
@@ -35375,14 +35372,14 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
     }
 
     /* restore the initial resize configuration */
-    if ( pass ) {
+    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 ) {
+        if(result != SUCCEED) {
 
             pass = FALSE;
             failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
@@ -35391,17 +35388,17 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
 
     /* flush the cache and end the test. */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        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";
@@ -35414,54 +35411,47 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
      * 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 ) ) {
+    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 ) {
+        } /* end if */
 
-	if ( ( cache_ptr->slist_scan_restarts != 0 ) ||
-             ( cache_ptr->LRU_scan_restarts != 1 ) ||
-             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+    if(pass)
+	if((cache_ptr->slist_scan_restarts != 0) ||
+             (cache_ptr->LRU_scan_restarts != 1) ||
+             (cache_ptr->index_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 */
+        } /* end if */
 
-    if ( pass ) {
-
-	reset_entries();
-    }
+#endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass ) {
+    if(pass)
+        reset_entries();
 
-	/* reset cache min clean size to its expected value */
+    if(pass)
+        /* reset cache min clean size to its expected value */
         cache_ptr->min_clean_size = (1 * 1024 * 1024);
-    }
 
     return;
 
@@ -35471,11 +35461,30 @@ cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
 /*-------------------------------------------------------------------------
  * Function:	cedds__H5C_flush_invalidate_cache__bucket_scan()
  *
- * Purpose:	Verify that H5C_flush_invalidate_cache() can handle
+ * Purpose:	Note:  	We now use the index list when we scan the 
+ *			contents of the metadata cache, so in principal,
+ *			this test is obsolete.  However, even using the
+ *			index list, restarts are possible, and must be 
+ *			handled gracefully.
+ *
+ *			As it turns out, this test triggers index list
+ *			scan restarts, and thus with minor changes is 
+ *			still a useful test.
+ * 
+ *			For this reason, with the exception of changing
+ *			to check the index_scan_restart stat instead of 
+ *			hash bucket restarts, I'm leaving the test 
+ *			alone.  If and when it starts to fail due to
+ *			other changes, we can re-work it to test 
+ *			index list scan restarts explicitly.
+ *
+ *						JRM -- 11/2/16
+ *
+ *		Verify that H5C_flush_invalidate_cache() can handle
  *		the removal from the cache of the next item in 
  *		its scans of hash buckets.
  *
- *		!!!!!!!!!! WARNING !!!!!!!!!!
+ *		!!!!!!!!!!WARNING !!!!!!!!!!
  *
  *		This test may fail to function correctly if the hash 
  *		table size or hash function is altered.  
@@ -35560,7 +35569,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
        * 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 */
+      /* 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},
@@ -35568,25 +35577,25 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
       { 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(pass) {
 
-         if ( cache_ptr == NULL ) {
+         if(cache_ptr == NULL) {
 
             pass = FALSE;
-            failure_mssg = "cache_ptr NULL on entry to cedds for H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+            failure_mssg = "cache_ptr NULL on entry to cedds for cedds__H5C_flush_invalidate_cache__bucket_scan() test.";
         }
-        else if ( ( cache_ptr->index_len != 0 ) ||
-                  ( cache_ptr->index_size != 0 ) ) {
+        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.";
+            failure_mssg = "cache not empty at start cedds for cedds__H5C_flush_invalidate_cache__bucket_scan() test.";
         }
-        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
-                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+        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.";
+	        "unexpected cache config at start of cedds cedds__H5C_flush_invalidate_cache__bucket_scan() test.";
 
         } else {
 
@@ -35599,7 +35608,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
     }
 
 
-    if ( pass ) {
+    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.
@@ -35615,14 +35624,14 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
         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 )
+	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 ) {
+    if(pass) {
 
         /* verify that the above entries hash to the same bucket */
         base_addr = entries[MONSTER_ENTRY_TYPE];
@@ -35633,12 +35642,12 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 
         expected_hash_bucket = H5C__HASH_FCN(entry_addr);
 
-        for ( i = 8; i <= 24; i += 8 ) {
+        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) ) {
+            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?";
@@ -35646,7 +35655,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
         }
     }
 
-    if ( pass ) {
+    if(pass) {
 
        /* setup the expunge flush operation:
 	 *
@@ -35657,7 +35666,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
                      MONSTER_ENTRY_TYPE, 8, FALSE, (size_t)0, NULL);
     }
 
-    if ( pass ) {
+    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
@@ -35668,7 +35677,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 	unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__DIRTIED_FLAG);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* verify that the dirty entry doesn't map to the same 
          * hash bucket as the clean entries.
@@ -35677,14 +35686,14 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
         entry_ptr = &(base_addr[31]);
         entry_addr = entry_ptr->header.addr;
 
-        if ( expected_hash_bucket == H5C__HASH_FCN(entry_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 ) {
+    if(pass) {
 
 	/* Next, create the flush dependency requiring (MET, 31) to 
          * be flushed prior to (MET, 0).
@@ -35696,7 +35705,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* Then, setup the flush operation to take down the flush 
          * dependency when (MET, 31) is flushed.
@@ -35709,13 +35718,13 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 
     }
 
-    if ( pass ) {
+    if(pass) {
 
 	/* verify the expected status of all entries we have loaded to date: */
         verify_entry_status(cache_ptr, 0, 5, expected);
     }
 
-    if ( pass ) {
+    if(pass) {
 
         /* now do some protect / unprotect cycles to force the 
          * entries into the desired order in the hash bucket.
@@ -35723,14 +35732,14 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
          * hash bucket list on lookup.
          */
 
-	for ( i = 24; i >= 0; i -= 8 )
+	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 ) {
+    if(pass) {
 
         /* scan the hash bucket to verify that the expected entries appear
          * in the expected order.
@@ -35739,23 +35748,23 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 
         i = 0;
 
-        while ( ( pass ) && ( i <= 24 ) )
+        while(pass && (i <= 24))
 	{
             entry_ptr = &(base_addr[i]);
 
-            if ( scan_ptr == NULL ) {
+            if(scan_ptr == NULL) {
 
                 pass = FALSE;
                 failure_mssg = "premature end of hash bucket list?!?!";
 
-            } else if ( ( scan_ptr == NULL ) ||
-                        ( scan_ptr != &(entry_ptr->header) ) ) {
+            } else if((scan_ptr == NULL) ||
+                        (scan_ptr != &(entry_ptr->header))) {
 
                 pass = FALSE;
                 failure_mssg = "bad test hash bucket setup?!?!";
             }
 
-            if ( pass ) {
+            if(pass) {
 
                 scan_ptr = scan_ptr->ht_next;
                 i += 8;
@@ -35766,17 +35775,17 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
 
     /* test setup complete -- flush the cache to run and end the test. */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        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";
@@ -35789,54 +35798,50 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
      * 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 ) ) {
+    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 ) ) {
+        } /* end if */
 
+    if(pass)
+        /* as this test is now checking for index list scan restarts,
+         * the following has been modified to check this instead of 
+         * hash bucket scan restarts.
+         */
+	if((cache_ptr->slist_scan_restarts != 0) ||
+             (cache_ptr->LRU_scan_restarts != 0) ||
+             (cache_ptr->index_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();
-    }
+#endif /* H5C_COLLECT_CACHE_STATS */
 
-    if ( pass ) {
+    if(pass)
+        reset_entries();
 
-	/* reset cache min clean size to its expected value */
+    if(pass)
+        /* reset cache min clean size to its expected value */
         cache_ptr->min_clean_size = (1 * 1024 * 1024);
-    }
 
     return;
 
@@ -35865,7 +35870,7 @@ cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
  */
 
 static unsigned
-check_stats(void)
+check_stats(unsigned paged)
 {
 
 #if H5C_COLLECT_CACHE_STATS
@@ -35874,7 +35879,10 @@ check_stats(void)
 
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-    TESTING("metadata cache statistics collection");
+    if(paged)
+        TESTING("metadata cache statistics collection (paged aggregation)")
+    else
+        TESTING("metadata cache statistics collection")
 
 #if H5C_COLLECT_CACHE_STATS
 
@@ -35882,24 +35890,23 @@ check_stats(void)
 
     reset_entries();
 
-    file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
-                           (size_t)(1 * 1024 * 1024));
+    file_ptr = setup_cache((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024), paged);
 
-    if ( pass ) {
+    if(pass) {
 
         check_stats__smoke_check_1(file_ptr);
     }
 
 
 
-    if ( pass ) {
+    if(pass) {
 
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if(pass) { PASSED(); } else { H5_FAILED(); }
 
-    if ( ! pass ) {
+    if(!pass) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
                   FUNC, failure_mssg);
@@ -35952,225 +35959,200 @@ check_stats__smoke_check_1(H5F_t * file_ptr)
     int		   i;
     herr_t	   result;
 
-    if ( pass ) {
-
-         if ( cache_ptr == NULL ) {
+    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 ) ) {
+        } /* end if */
+        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 ) ) ) {
+        } /* end else-if */
+        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().";
+	    failure_mssg = "unexpected cache config at start of check_stats__smoke_check_1().";
 
-        } else {
+        } /* end else-if */
+	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 ) {
+        } /* end else */
+    } /* end if */
 
+    if(pass)
         /* first fill the cache with monster entryies via insertion */
-
-        for ( i = 0; i < 32; i++ )
-
+        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 ) ) {
+    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).";
-        }
-    }
+        } /* end if */
 
-    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 ) ) {
+    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->index_scan_restarts != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(1).";
-        }
-    }
+        } /* end if */
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
-    if ( pass ) {
-
+    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 ) ) {
+        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).";
-        }
-    }
+        } /* end if */
 #endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
 
-    if ( pass ) {
-
+    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++ )
-        {
+        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);
-        }
-    }
+        } /* end for */
 
-    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 ) ) {
+    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).";
-        }
-    }
+        } /* end if */
 
-    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 ) ) {
+    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->index_scan_restarts != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(2).";
-        }
-    }
+        } /* end if */
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
-    if ( pass ) {
-
+    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 ) ) {
+        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).";
-        }
-    }
+        } /* end if */
 #endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
 
-    if ( pass ) {
-
+    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 
@@ -36178,211 +36160,194 @@ check_stats__smoke_check_1(H5F_t * file_ptr)
          */
         protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 32);
         unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 32, H5C__DIRTIED_FLAG);
-    }
+    } /* end if */
 
-    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 ) ) {
+    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).";
-        }
-    }
+        } /* end if */
 
-    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 ) ) {
+    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->index_scan_restarts != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(3).";
-        }
-    }
+        } /* end if */
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
-    if ( pass ) {
-
+    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 ) ) {
+        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 */
+        } /* end if */
 
-    if ( pass ) {
+#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);
-    }
+    } /* end if */
 
     /* flush the cache to end the test and collect all entry stats */
 
-    if ( pass ) {
+    if(pass) {
 
         result = H5C_flush_cache(file_ptr, H5AC_ind_read_dxpl_id, H5C__FLUSH_INVALIDATE_FLAG);
 
-        if ( result < 0 ) {
+        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 ) ) {
+        } /* end if */
+        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 ) {
+        } /* end else-if */
+    } /* end if */
 
-        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 ) ) {
+    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).";
-        }
-    }
+        } /* end if */
 
-    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 ) ) {
+    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->index_scan_restarts != 0)) {
 
             pass = FALSE;
             failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(4).";
-        }
-    }
+        } /* end if */
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
-    if ( pass ) {
-
+    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 ) ) {
+        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 */
+        } /* end if */
 
-    if ( pass ) {
-
-	reset_entries();
-    }
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
 
-    if ( pass ) {
+    if(pass)
+        reset_entries();
 
-	/* reset cache min clean size to its expected value */
+    if(pass)
+        /* reset cache min clean size to its expected value */
         cache_ptr->min_clean_size = (1 * 1024 * 1024);
-    }
 
     return;
 
@@ -36392,19 +36357,13 @@ check_stats__smoke_check_1(H5F_t * file_ptr)
 
 

 /*-------------------------------------------------------------------------
- * Function:	main
- *
- * Purpose:	Run tests on the cache code contained in H5C.c
- *
- * Return:	Success:
+ * Function:    main
  *
- *		Failure:
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              6/24/04
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 
@@ -36412,6 +36371,7 @@ int
 main(void)
 {
     unsigned nerrs = 0;
+    unsigned paged;
     int express_test;
 
     H5open();
@@ -36423,62 +36383,77 @@ main(void)
     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);
+    if(create_entry_arrays() < 0) {
+
+        printf("ERROR: Unable to create entries arrays. Aborting.\n");
+        return EXIT_FAILURE;
+    } /* end if */
+
+    /* Test with paged aggregation enabled or not */
+    /* Each test will call setup_cache() which set up the file space strategy according to "paged" */
+    for(paged = FALSE; paged <= TRUE; paged++) {
+        nerrs += smoke_check_1(express_test, paged);
+        nerrs += smoke_check_2(express_test, paged);
+        nerrs += smoke_check_3(express_test, paged);
+        nerrs += smoke_check_4(express_test, paged);
+        nerrs += smoke_check_5(express_test, paged);
+        nerrs += smoke_check_6(express_test, paged);
+        nerrs += smoke_check_7(express_test, paged);
+        nerrs += smoke_check_8(express_test, paged);
+        nerrs += smoke_check_9(express_test, paged);
+        nerrs += smoke_check_10(express_test, paged);
+        nerrs += write_permitted_check(express_test, paged);
+        nerrs += check_insert_entry(paged);
+        nerrs += check_flush_cache(paged);
+        nerrs += check_get_entry_status(paged);
+        nerrs += check_expunge_entry(paged);
+        nerrs += check_multiple_read_protect(paged);
+        nerrs += check_move_entry(paged);
+        nerrs += check_pin_protected_entry(paged);
+        nerrs += check_resize_entry(paged);
+        nerrs += check_evictions_enabled(paged);
+        nerrs += check_flush_protected_err(paged);
+        nerrs += check_destroy_pinned_err(paged);
+        nerrs += check_destroy_protected_err(paged);
+        nerrs += check_duplicate_insert_err(paged);
+        nerrs += check_double_pin_err(paged);
+        nerrs += check_double_unpin_err(paged);
+        nerrs += check_pin_entry_errs(paged);
+        nerrs += check_double_protect_err(paged);
+        nerrs += check_double_unprotect_err(paged);
+        nerrs += check_mark_entry_dirty_errs(paged);
+        nerrs += check_expunge_entry_errs(paged);
+        nerrs += check_move_entry_errs(paged);
+        nerrs += check_resize_entry_errs(paged);
+        nerrs += check_unprotect_ro_dirty_err(paged);
+        nerrs += check_protect_ro_rw_err(paged);
+        nerrs += check_protect_retries(paged);
+        nerrs += check_check_evictions_enabled_err(paged);
+        nerrs += check_auto_cache_resize(FALSE, paged);
+        nerrs += check_auto_cache_resize(TRUE, paged);
+        nerrs += check_auto_cache_resize_disable(paged);
+        nerrs += check_auto_cache_resize_epoch_markers(paged);
+        nerrs += check_auto_cache_resize_input_errs(paged);
+        nerrs += check_auto_cache_resize_aux_fcns(paged);
+        nerrs += check_metadata_blizzard_absence(TRUE, paged);
+        nerrs += check_metadata_blizzard_absence(FALSE, paged);
+        nerrs += check_flush_deps(paged);
+        nerrs += check_flush_deps_err(paged);
+        nerrs += check_flush_deps_order(paged);
+        nerrs += check_notify_cb(paged);
+        nerrs += check_metadata_cork(TRUE, paged);
+        nerrs += check_metadata_cork(FALSE, paged);
+        nerrs += check_entry_deletions_during_scans(paged);
+        nerrs += check_stats(paged);
+    } /* end for */
+
+    /* can't fail, returns void */
+    free_entry_arrays();
+
+    if(nerrs > 0)
+        return EXIT_FAILURE;
+    else
+        return EXIT_SUCCESS;
+
 } /* main() */
 
diff --git a/test/cache_api.c b/test/cache_api.c
index eb4a7cc..7c0ffa3 100644
--- a/test/cache_api.c
+++ b/test/cache_api.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  John Mainzer
@@ -20,9 +18,6 @@
  *		with the cache implemented in H5C.c
  */
 
-#include "h5test.h"
-#include "H5Iprivate.h"
-#include "H5ACprivate.h"
 #include "cache_common.h"
 
 /* extern declarations */
@@ -33,15 +28,13 @@
 
 /* private function declarations: */
 
-static unsigned check_fapl_mdc_api_calls(void);
+static hbool_t check_fapl_mdc_api_calls(unsigned paged, hid_t fcpl_id);
+static hbool_t check_file_mdc_api_calls(unsigned paged, hid_t fcpl_id);
+static hbool_t mdc_api_call_smoke_check(int express_test, unsigned paged, hid_t fcpl_id);
+static H5AC_cache_config_t * init_invalid_configs(void);
+static hbool_t check_fapl_mdc_api_errs(void);
+static hbool_t check_file_mdc_api_errs(unsigned paged, hid_t fcpl_id);
 
-static unsigned check_file_mdc_api_calls(void);
-
-static unsigned mdc_api_call_smoke_check(int express_test);
-
-static unsigned check_fapl_mdc_api_errs(void);
-
-static unsigned check_file_mdc_api_errs(void);
 
 

 /**************************************************************************/
@@ -51,25 +44,25 @@ static unsigned check_file_mdc_api_errs(void);
 /**************************************************************************/
 
 /*-------------------------------------------------------------------------
- * Function:	check_fapl_mdc_api_calls()
+ * Function:    check_fapl_mdc_api_calls()
  *
- * Purpose:	Verify that the file access property list related
- *		metadata cache related API calls are functioning
- *		correctly.
+ * Purpose:     Verify that the file access property list related
+ *              metadata cache related API calls are functioning
+ *              correctly.
  *
- *		Since we have tested the H5C code elsewhere, it should
- *		be sufficient to verify that the desired configuration
- *		data is getting to the cache.
+ *              Since we have tested the H5C code elsewhere, it should
+ *              be sufficient to verify that the desired configuration
+ *              data is getting to the cache.
  *
- * Return:	void
+ * Return:      Test pass status (TRUE/FALSE)
  *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              4/12/04
  *
  *-------------------------------------------------------------------------
  */
-static unsigned
-check_fapl_mdc_api_calls(void)
+static hbool_t
+check_fapl_mdc_api_calls(unsigned paged, hid_t fcpl_id)
 {
     char filename[512];
     herr_t result;
@@ -118,7 +111,10 @@ check_fapl_mdc_api_calls(void)
     H5C_auto_size_ctl_t default_auto_size_ctl;
     H5C_auto_size_ctl_t mod_auto_size_ctl;
 
-    TESTING("MDC/FAPL related API calls");
+    if(paged)
+        TESTING("MDC/FAPL related API calls for paged aggregation strategy")
+    else
+        TESTING("MDC/FAPL related API calls")
 
     pass = TRUE;
 
@@ -131,13 +127,13 @@ check_fapl_mdc_api_calls(void)
 
     if ( pass ) {
 
-	fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
 
-	if ( fapl_id < 0 ) {
+        if ( fapl_id < 0 ) {
 
-	    pass = FALSE;
+            pass = FALSE;
             failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n";
-	}
+        }
     }
 
     if ( pass ) {
@@ -149,7 +145,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pget_mdc_config() failed.\n";
+            failure_mssg = "H5Pget_mdc_config() failed.\n";
 
         } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) {
 
@@ -170,7 +166,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pset_mdc_config() failed.\n";
+            failure_mssg = "H5Pset_mdc_config() failed.\n";
         }
     }
 
@@ -183,7 +179,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pget_mdc_config() failed.\n";
+            failure_mssg = "H5Pget_mdc_config() failed.\n";
 
         } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) {
 
@@ -197,7 +193,7 @@ check_fapl_mdc_api_calls(void)
         if ( H5Pclose(fapl_id) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pclose() failed.\n";
+            failure_mssg = "H5Pclose() failed.\n";
         }
     }
 
@@ -222,7 +218,7 @@ check_fapl_mdc_api_calls(void)
     /* create the file using the default FAPL */
     if ( pass ) {
 
-        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT);
 
         if ( file_id < 0 ) {
 
@@ -239,11 +235,11 @@ check_fapl_mdc_api_calls(void)
         if ( file_ptr == NULL ) {
 
             pass = FALSE;
-	    failure_mssg = "Can't get file_ptr.\n";
+            failure_mssg = "Can't get file_ptr.\n";
 
-	} else {
+        } else {
 
-	    cache_ptr = file_ptr->shared->cache;
+            cache_ptr = file_ptr->shared->cache;
         }
     }
 
@@ -262,10 +258,9 @@ check_fapl_mdc_api_calls(void)
     /* conpare the cache's internal configuration with the expected value */
     if ( pass ) {
 
-	if ( ! resize_configs_are_equal(&default_auto_size_ctl, \
+        if ( ! resize_configs_are_equal(&default_auto_size_ctl, \
                                         &cache_ptr->resize_ctl, TRUE) ) {
 
-
             pass = FALSE;
             failure_mssg = "Unexpected value(s) in cache resize_ctl 1.\n";
         }
@@ -295,7 +290,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pget_mdc_config() failed.\n";
+            failure_mssg = "H5Pget_mdc_config() failed.\n";
 
         } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) {
 
@@ -305,22 +300,22 @@ check_fapl_mdc_api_calls(void)
         } else if ( H5Pclose(fapl_id) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pclose() failed.\n";
+            failure_mssg = "H5Pclose() failed.\n";
         }
     }
 
     /* close the file and delete it */
     if ( pass ) {
 
-	if ( H5Fclose(file_id) < 0  ) {
+        if ( H5Fclose(file_id) < 0  ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Fclose() failed.\n";
+            failure_mssg = "H5Fclose() failed.\n";
 
         } else if ( HDremove(filename) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "HDremove() failed.\n";
+            failure_mssg = "HDremove() failed.\n";
         }
     }
 
@@ -335,13 +330,13 @@ check_fapl_mdc_api_calls(void)
     /* Create a FAPL */
     if ( pass ) {
 
-	fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
 
-	if ( fapl_id < 0 ) {
+        if ( fapl_id < 0 ) {
 
-	    pass = FALSE;
+            pass = FALSE;
             failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n";
-	}
+        }
     }
 
     /* Modify the initial mdc configuration in the FAPL. */
@@ -353,7 +348,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pset_mdc_config() failed.\n";
+            failure_mssg = "H5Pset_mdc_config() failed.\n";
         }
     }
 
@@ -371,7 +366,7 @@ check_fapl_mdc_api_calls(void)
     /* create the file using the modified FAPL */
     if ( pass ) {
 
-        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, fapl_id);
 
         if ( file_id < 0 ) {
 
@@ -388,7 +383,7 @@ check_fapl_mdc_api_calls(void)
         if ( file_ptr == NULL ) {
 
             pass = FALSE;
-	    failure_mssg = "Can't get file_ptr.\n";
+            failure_mssg = "Can't get file_ptr.\n";
 
         } else {
 
@@ -411,10 +406,9 @@ check_fapl_mdc_api_calls(void)
     /* conpare the cache's internal configuration with the expected value */
     if ( pass ) {
 
-	if ( ! resize_configs_are_equal(&mod_auto_size_ctl, \
+        if ( ! resize_configs_are_equal(&mod_auto_size_ctl, \
                                         &cache_ptr->resize_ctl, TRUE) ) {
 
-
             pass = FALSE;
             failure_mssg = "Unexpected value(s) in cache resize_ctl 2.\n";
         }
@@ -444,7 +438,7 @@ check_fapl_mdc_api_calls(void)
         if ( result < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pget_mdc_config() failed.\n";
+            failure_mssg = "H5Pget_mdc_config() failed.\n";
 
         } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) {
 
@@ -454,7 +448,7 @@ check_fapl_mdc_api_calls(void)
         } else if ( H5Pclose(test_fapl_id) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pclose() failed.\n";
+            failure_mssg = "H5Pclose() failed.\n";
         }
     }
 
@@ -464,62 +458,67 @@ check_fapl_mdc_api_calls(void)
         if ( H5Pclose(fapl_id) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Pclose() failed.\n";
+            failure_mssg = "H5Pclose() failed.\n";
         }
     }
 
     /* close the file and delete it */
     if ( pass ) {
 
-	if ( H5Fclose(file_id) < 0  ) {
+        if ( H5Fclose(file_id) < 0  ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Fclose() failed.\n";
+            failure_mssg = "H5Fclose() failed.\n";
 
         } else if ( HDremove(filename) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "HDremove() failed.\n";
+            failure_mssg = "HDremove() failed.\n";
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if ( pass ) {
+
+        PASSED();
 
-    if ( ! pass )
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
+    } else {
 
-    return !pass;
+        H5_FAILED();
+    }
+
+    if ( ! pass ) {
+
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    }
+
+    return pass;
 
 } /* check_fapl_mdc_api_calls() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	check_file_mdc_api_calls()
+ * Function:    check_file_mdc_api_calls()
  *
- * Purpose:	Verify that the file related metadata cache API calls are
- *		functioning correctly.
+ * Purpose:     Verify that the file related metadata cache API calls are
+ *              functioning correctly.
  *
- *		Since we have tested the H5C code elsewhere, it should
- *		be sufficient to verify that the desired configuration
- *		data is getting in and out of the cache.  Similarly,
- *		we need only verify that the cache monitoring calls
- *		return the data that the cache thinks they should return.
- *		We shouldn't need to verify data correctness beyond that
- *		point.
+ *              Since we have tested the H5C code elsewhere, it should
+ *              be sufficient to verify that the desired configuration
+ *              data is getting in and out of the cache.  Similarly,
+ *              we need only verify that the cache monitoring calls
+ *              return the data that the cache thinks they should return.
+ *              We shouldn't need to verify data correctness beyond that
+ *              point.
  *
- * Return:	void
+ * Return:      Test pass status (TRUE/FALSE)
  *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              4/14/04
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
-static unsigned
-check_file_mdc_api_calls(void)
+static hbool_t
+check_file_mdc_api_calls(unsigned paged, hid_t fcpl_id)
 {
     char filename[512];
     hid_t file_id = -1;
@@ -671,7 +670,10 @@ check_file_mdc_api_calls(void)
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
     };
 
-    TESTING("MDC/FILE related API calls");
+    if(paged)
+        TESTING("MDC/FILE related API calls for paged aggregation strategy")
+    else
+        TESTING("MDC/FILE related API calls")
 
     pass = TRUE;
 
@@ -697,7 +699,7 @@ check_file_mdc_api_calls(void)
     /* create the file using the default FAPL */
     if ( pass ) {
 
-        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT);
 
         if ( file_id < 0 ) {
 
@@ -822,25 +824,33 @@ check_file_mdc_api_calls(void)
     /* close the file and delete it */
     if ( pass ) {
 
-	if ( H5Fclose(file_id) < 0  ) {
+        if ( H5Fclose(file_id) < 0  ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Fclose() failed.\n";
+            failure_mssg = "H5Fclose() failed.\n";
 
         } else if ( HDremove(filename) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "HDremove() failed.\n";
+            failure_mssg = "HDremove() failed.\n";
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if ( pass ) {
+
+        PASSED();
 
-    if ( ! pass )
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
+    } else {
 
-    return !pass;
+        H5_FAILED();
+    }
+
+    if ( ! pass ) {
+        
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    }
+
+    return pass;
 
 } /* check_file_mdc_api_calls() */
 
@@ -848,17 +858,16 @@ check_file_mdc_api_calls(void)
 /*-------------------------------------------------------------------------
  * Function:	mdc_api_call_smoke_check()
  *
- * Purpose:
+ * Purpose:     Initial basic functional test to see if there are problems
+ *              with the cache API calls.
  *
- * Return:	void
+ *              NOTE: This test takes some time to run and checks the 
+ *                    HDF5TestExpress environment variable.
  *
- * Programmer:	John Mainzer
- *              4/14/04
- *
- * Modifications:
+ * Return:      Test pass status (TRUE/FALSE)
  *
- * 		JRM -- 7/12/06
- * 		Added progress reporting code.
+ * Programmer:  John Mainzer
+ *              4/14/04
  *
  *-------------------------------------------------------------------------
  */
@@ -868,8 +877,8 @@ check_file_mdc_api_calls(void)
 #define NUM_DSETS               6
 #define NUM_RANDOM_ACCESSES     200000
 
-static unsigned
-mdc_api_call_smoke_check(int express_test)
+static hbool_t
+mdc_api_call_smoke_check(int express_test, unsigned paged, hid_t fcpl_id)
 {
     char filename[512];
     hbool_t valid_chunk;
@@ -998,7 +1007,12 @@ mdc_api_call_smoke_check(int express_test)
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
     };
 
-    TESTING("MDC API smoke check");
+    if(paged)
+        TESTING("MDC API smoke check for paged aggregation strategy")
+    else
+        TESTING("MDC API smoke check")
+
+    pass = TRUE;
 
     if ( express_test > 0 ) {
 
@@ -1006,11 +1020,9 @@ mdc_api_call_smoke_check(int express_test)
 
         HDfprintf(stdout, "     Long tests disabled.\n");
 
-        return 0;
+        return pass;
     }
 
-    pass = TRUE;
-
     /* Open a file with the default FAPL.  Verify that the cache is
      * configured as per the default both by looking at its internal
      * configuration, and via the H5Fget_mdc_config() call.
@@ -1033,7 +1045,7 @@ mdc_api_call_smoke_check(int express_test)
     /* create the file using the default FAPL */
     if ( pass ) {
 
-        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT);
 
         if ( file_id < 0 ) {
 
@@ -1497,1320 +1509,249 @@ mdc_api_call_smoke_check(int express_test)
     /* close the file and delete it */
     if ( pass ) {
 
-	if ( H5Fclose(file_id) < 0  ) {
+        if ( H5Fclose(file_id) < 0  ) {
 
             pass = FALSE;
-	    failure_mssg = "H5Fclose() failed.\n";
+            failure_mssg = "H5Fclose() failed.\n";
 
         }
         else if ( HDremove(filename) < 0 ) {
 
             pass = FALSE;
-	    failure_mssg = "HDremove() failed.\n";
+            failure_mssg = "HDremove() failed.\n";
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if ( pass ) {
+        
+        PASSED();
+        
+    } else {
+
+        H5_FAILED();
+    }
+
+    if ( ! pass ) {
 
-    if ( ! pass )
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    }
 
-    return !pass;
+    return pass;
 
 } /* mdc_api_call_smoke_check() */
 
 
 
-/* The following array of invalid external MDC cache configurations is
- * used to test error rejection in the MDC related API calls.
+/*-------------------------------------------------------------------------
+ * Function:    init_invalid_configs()
+ *
+ * Purpose:     Initialize an array of invalid external MDC configurations
+ *              that will be used to test error rejection in the MDC-
+ *              related API calls.
+ *
+ *              Note: It is assumed that boolean parameters are only set
+ *                    to TRUE/FALSE.
+ *
+ * Return:      Success:    Pointer to an array of cache configurations.
+ *              Failure:    NULL
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
  *
- * Note: It is assumed that boolean parameters are only set to TRUE/FALSE.
+ *-------------------------------------------------------------------------
  */
 
 #define NUM_INVALID_CONFIGS	36
+static H5AC_cache_config_t * invalid_configs = NULL;
+
+static H5AC_cache_config_t *
+init_invalid_configs(void) {
+
+    int i;
+    H5AC_cache_config_t * configs = NULL;
+
+    /* Allocate memory */
+    if ( NULL == (configs = (H5AC_cache_config_t *)HDcalloc(
+            NUM_INVALID_CONFIGS, sizeof(H5AC_cache_config_t) ) ) ) {
+
+        return NULL;
+    }
+
+    /* Set defaults for all configs */
+    for ( i = 0; i < NUM_INVALID_CONFIGS; i++ ) {
+
+        configs[i].version                  = H5C__CURR_AUTO_SIZE_CTL_VER;
+        configs[i].rpt_fcn_enabled          = FALSE;
+        configs[i].open_trace_file          = FALSE;
+        configs[i].close_trace_file         = FALSE;
+        /* trace file name set to all ASCII NUL by calloc() */
+        configs[i].evictions_enabled        = TRUE;
+        configs[i].set_initial_size         = TRUE;
+        configs[i].initial_size             = (1 * 1024 * 1024);
+        configs[i].min_clean_fraction       = 0.25F;
+        configs[i].max_size                 = (16 * 1024 * 1024);
+        configs[i].min_size                 = (1 * 1024 * 1024);
+        configs[i].epoch_length             = 50000;
+        configs[i].incr_mode                = H5C_incr__threshold;
+        configs[i].lower_hr_threshold       = 0.9F;
+        configs[i].increment                = 2.0F;
+        configs[i].apply_max_increment      = TRUE;
+        configs[i].max_increment            = (4 * 1024 * 1024);
+        configs[i].flash_incr_mode          = H5C_flash_incr__off;
+        configs[i].flash_multiple           = 2.0F;
+        configs[i].flash_threshold          = 0.5F;
+        configs[i].decr_mode                = H5C_decr__age_out_with_threshold;
+        configs[i].upper_hr_threshold       = 0.999F;
+        configs[i].decrement                = 0.9F;
+        configs[i].apply_max_decrement      = TRUE;
+        configs[i].max_decrement            = (1 * 1024 * 1024);
+        configs[i].epochs_before_eviction   = 3;
+        configs[i].apply_empty_reserve      = TRUE;
+        configs[i].empty_reserve            = 0.1F;
+        configs[i].dirty_bytes_threshold    = (256 * 1024);
+        configs[i].metadata_write_strategy  = H5AC__DEFAULT_METADATA_WRITE_STRATEGY;
+    }
+
+    /* Set badness for each config */
 
-H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
-{
-  {
     /* 0 -- bad version */
-    /* int         version                = */ -1,
-    /* 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    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
+    configs[0].version                      = -1;
+
     /* 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,
-    /* 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
-  },
-  {
+    configs[1].open_trace_file              = TRUE;
+    /* trace file name set to all ASCII NUL by calloc() */
+
     /* 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,
-    /* 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               = */ H5C__MAX_MAX_CACHE_SIZE + 1,
-    /* 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
-  },
-  {
+    configs[2].max_size                     = H5C__MAX_MAX_CACHE_SIZE + 1;
+
     /* 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,
-    /* 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               = */ H5C__MIN_MAX_CACHE_SIZE - 1,
-    /* 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
-  },
-  {
+    configs[3].min_size                     = H5C__MIN_MAX_CACHE_SIZE - 1;
+
     /* 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,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ FALSE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ (16 * 1024 * 1024 + 1),
-    /* 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
-  },
-  {
+    configs[4].max_size                     = (16 * 1024 * 1024);
+    configs[4].min_size                     = (16 * 1024 * 1024 + 1);
+
     /* 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,
-    /* 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           = */ (16 * 1024 * 1024 + 1),
-    /* 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
-  },
-  {
+    configs[5].initial_size                 = (16 * 1024 * 1024 + 1);
+
     /* 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,
-    /* 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 - 1),
-    /* 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
-  },
-  {
+    configs[6].initial_size                 = (1 * 1024 * 1024 - 1);
+
     /* 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,
-    /* 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     = */ 1.000001f,
-    /* 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
-  },
-  {
+    configs[7].min_clean_fraction           = 1.000001f;
+
     /* 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,
-    /* 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.00000001f,
-    /* 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
-  },
-  {
+    configs[8].min_clean_fraction           = -0.00000001f;
+
     /* 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,
-    /* 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           = */ H5C__MIN_AR_EPOCH_LENGTH - 1,
-    /* 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
-  },
-  {
+    configs[9].epoch_length                 = H5C__MIN_AR_EPOCH_LENGTH - 1;
+
     /* 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,
-    /* 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           = */ H5C__MAX_AR_EPOCH_LENGTH + 1,
-    /* 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
-  },
-  {
+    configs[10].epoch_length                = H5C__MAX_AR_EPOCH_LENGTH + 1;
+
     /* 11 -- invalid incr_mode */
-    /* 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 = */ (enum H5C_cache_incr_mode)-1,
-    /* 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
-  },
-  {
+    configs[11].incr_mode                   = (enum H5C_cache_incr_mode)-1;
+
     /* 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,
-    /* 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.000001f,
-    /* 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
-  },
-  {
+    configs[12].lower_hr_threshold          = -0.000001f;
+
     /* 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,
-    /* 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     = */ 1.00000001f,
-    /* 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
-  },
-  {
+    configs[13].lower_hr_threshold          = 1.00000001f;
+
     /* 14 -- increment too small */
-    /* 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              = */ H5_DOUBLE(0.999999999999),
-    /* 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
-  },
-  {
+    configs[14].increment                   = H5_DOUBLE(0.999999999999);
+
     /* 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,
-    /* 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 = */ (enum H5C_cache_flash_incr_mode)-1,
-    /* 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
-  },
-  {
+    configs[15].flash_incr_mode             = (enum H5C_cache_flash_incr_mode)-1;
+
     /* 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,
-    /* 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__add_space,
-    /* double      flash_multiple         = */ 0.09f,
-    /* 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
-  },
-  {
+    configs[16].flash_incr_mode             = H5C_flash_incr__add_space;
+    configs[16].flash_multiple              = 0.09f;
+
     /* 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,
-    /* 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__add_space,
-    /* double      flash_multiple         = */ 10.001f,
-    /* 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
-  },
-  {
+    configs[17].flash_incr_mode             = H5C_flash_incr__add_space;
+    configs[17].flash_multiple              = 10.001f;
+
     /* 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,
-    /* 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__add_space,
-    /* double      flash_multiple         = */ 1.0f,
-    /* double      flash_threshold        = */ 0.099f,
-    /* 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
-  },
-  {
+    configs[18].flash_incr_mode             = H5C_flash_incr__add_space;
+    configs[18].flash_threshold             = 0.099f;
+
     /* 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,
-    /* 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__add_space,
-    /* double      flash_multiple         = */ 1.0f,
-    /* double      flash_threshold        = */ 1.001f,
-    /* 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
-  },
-  {
+    configs[19].flash_incr_mode             = H5C_flash_incr__add_space;
+    configs[19].flash_threshold             = 1.001f;
+
     /* 20 -- bad decr_mode */
-    /* 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 = */ (enum H5C_cache_decr_mode)-1,
-    /* 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
-  },
-  {
+    configs[20].decr_mode                   = (enum H5C_cache_decr_mode)-1;
+
     /* 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,
-    /* 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__threshold,
-    /* double      upper_hr_threshold     = */ 1.00001f,
-    /* 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
-  },
-  {
+    configs[21].upper_hr_threshold          = 1.00001f;
+
     /* 22 -- decrement too small */
-    /* 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__threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ -0.0000000001f,
-    /* 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
-  },
-  {
+    configs[22].decr_mode                   = H5C_decr__threshold;
+    configs[22].decrement                   = -0.0000000001f;
+
     /* 23 -- decrement too big */
-    /* 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__threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ H5_DOUBLE(1.0000000001),
-    /* 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
-  },
-  {
+    configs[23].decr_mode                   = H5C_decr__threshold;
+    configs[23].decrement                   = H5_DOUBLE(1.0000000001);
+
     /* 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,
-    /* 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,
-    /* 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 = */ 0,
-    /* 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
-  },
-  {
+    configs[24].epochs_before_eviction      = 0;
+
     /* 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,
-    /* 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,
-    /* 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 = */ H5C__MAX_EPOCH_MARKERS + 1,
-    /* 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
-  },
-  {
+    configs[25].epochs_before_eviction      = H5C__MAX_EPOCH_MARKERS + 1;
+
     /* 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,
-    /* 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.0000000001f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
+    configs[26].empty_reserve               = -0.0000000001f;
+
     /* 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,
-    /* 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          = */ H5_DOUBLE(1.00000000001),
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
+    configs[27].empty_reserve               = H5_DOUBLE(1.00000000001);
+
     /* 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,
-    /* 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.000000001f,
-    /* 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
-  },
-  {
+    configs[28].upper_hr_threshold          = -0.000000001f;
+
     /* 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,
-    /* 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     = */ H5_DOUBLE(1.00000001),
-    /* 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
-  },
-  {
+    configs[29].upper_hr_threshold          = H5_DOUBLE(1.00000001);
+
     /* 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,
-    /* 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.9f,
-    /* 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
-  },
-  {
+    configs[30].lower_hr_threshold          = 0.9f;
+    configs[30].upper_hr_threshold          = 0.9f;
+
     /* 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,
-    /* 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  = */ (H5C__MIN_MAX_CACHE_SIZE / 2) - 1,
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
+    configs[31].dirty_bytes_threshold       = (H5C__MIN_MAX_CACHE_SIZE / 2) - 1;
+
     /* 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,
-    /* 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.9f,
-    /* 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  = */ (H5C__MAX_MAX_CACHE_SIZE / 4) + 1,
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
+    configs[32].dirty_bytes_threshold       = (H5C__MAX_MAX_CACHE_SIZE / 4) + 1;
+
     /* 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,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ FALSE,
-    /* 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__off,
-    /* double      upper_hr_threshold     = */ 0.9f,
-    /* 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
-  },
-  {
+    configs[33].evictions_enabled           = FALSE;
+    configs[33].decr_mode                   = H5C_decr__off;
+
     /* 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,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ FALSE,
-    /* 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,
-    /* double      upper_hr_threshold     = */ 0.9f,
-    /* 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
-  },
-  {
+    configs[34].evictions_enabled           = FALSE;
+    configs[34].decr_mode                   = H5C_decr__age_out;
+
     /* 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,
-    /* 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 = */ -1
-  }
-};
+    configs[35].metadata_write_strategy     = -1;
+
+    return configs;
+
+} /* initialize_invalid_configs() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	check_fapl_mdc_api_errs()
+ * Function:    check_fapl_mdc_api_errs()
  *
- * Purpose:	Verify that the FAPL related MDC API calls reject input
- *		errors gracefully.
+ * Purpose:     Verify that the FAPL related MDC API calls reject input
+ *              errors gracefully.
  *
- * Return:	void
+ * Return:      Test pass status (TRUE/FALSE)
  *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              4/19/04
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
-static unsigned
+static hbool_t
 check_fapl_mdc_api_errs(void)
 {
     static char msg[128];
@@ -2824,7 +1765,6 @@ check_fapl_mdc_api_errs(void)
 
     pass = TRUE;
 
-
     /* first test H5Pget_mdc_config().
      */
 
@@ -2832,8 +1772,8 @@ check_fapl_mdc_api_errs(void)
     if  ( pass ) {
 
         H5E_BEGIN_TRY {
-	    result = H5Pget_mdc_config((hid_t)-1, &scratch);
-	} H5E_END_TRY;
+            result = H5Pget_mdc_config((hid_t)-1, &scratch);
+        } H5E_END_TRY;
 
         if ( result >= 0 ) {
 
@@ -2955,35 +1895,40 @@ check_fapl_mdc_api_errs(void)
         failure_mssg = "FAPL metadata cache config changed???.\n";
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if ( pass ) {
+
+        PASSED();
+
+    } else {
+
+        H5_FAILED();
+    }
+
+    if ( ! pass ) {
 
-    if ( ! pass )
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    }
 
-    return !pass;
+    return pass;
 
 } /* check_fapl_mdc_api_errs() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	check_file_mdc_api_errs()
+ * Function:    check_file_mdc_api_errs()
  *
- * Purpose:	Verify that the file related MDC API calls reject input
- *		errors gracefully.
+ * Purpose:     Verify that the file related MDC API calls reject input
+ *              errors gracefully.
  *
- * Return:	void
+ * Return:      Test pass status (TRUE/FALSE)
  *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              4/19/04
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
-static unsigned
-check_file_mdc_api_errs(void)
+static hbool_t
+check_file_mdc_api_errs(unsigned paged, hid_t fcpl_id)
 {
     char filename[512];
     static char msg[128];
@@ -2999,7 +1944,10 @@ check_file_mdc_api_errs(void)
     H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG;
     H5AC_cache_config_t scratch;
 
-    TESTING("MDC/FILE related API input errors");
+    if(paged)
+        TESTING("MDC/FILE related API input errors for paged aggregation strategy")
+    else
+        TESTING("MDC/FILE related API input errors")
 
     pass = TRUE;
 
@@ -3010,10 +1958,10 @@ check_file_mdc_api_errs(void)
     /* setup the file name */
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: calling h5_fixname().\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: calling h5_fixname().\n", FUNC);
+        }
 
         if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename))
             == NULL ) {
@@ -3025,12 +1973,12 @@ check_file_mdc_api_errs(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: calling H5Fcreate().\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: calling H5Fcreate().\n", FUNC);
+        }
 
-        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT);
 
         if ( file_id < 0 ) {
 
@@ -3047,10 +1995,10 @@ check_file_mdc_api_errs(void)
     scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER;
     if  ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_config((hid_t)-1, &scratch);
@@ -3065,10 +2013,10 @@ check_file_mdc_api_errs(void)
 
     if  ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_config(file_id, NULL);
@@ -3084,10 +2032,10 @@ check_file_mdc_api_errs(void)
     scratch.version = -1; /* a convenient, invalid value */
     if  ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_config(file_id, &scratch);
@@ -3106,10 +2054,10 @@ check_file_mdc_api_errs(void)
     scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER;
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fset_mdc_config((hid_t)-1, &default_config);
@@ -3124,10 +2072,10 @@ check_file_mdc_api_errs(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fset_mdc_config(file_id, NULL);
@@ -3143,12 +2091,12 @@ check_file_mdc_api_errs(void)
     i = 0;
     while ( ( pass ) && ( i < NUM_INVALID_CONFIGS ) )
     {
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout,
-		    "%s: testing H5Fset_mdc_config() with invalid config %d.\n",
-		    FUNC, i);
-	}
+            HDfprintf(stdout,
+                "%s: testing H5Fset_mdc_config() with invalid config %d.\n",
+                FUNC, i);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fset_mdc_config(file_id, &(invalid_configs[i]));
@@ -3173,11 +2121,11 @@ check_file_mdc_api_errs(void)
     /* test H5Fget_mdc_hit_rate() */
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 1.\n",
-		      FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 1.\n",
+                FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_hit_rate((hid_t)-1, &hit_rate);
@@ -3192,11 +2140,11 @@ check_file_mdc_api_errs(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 2.\n",
-		      FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 2.\n",
+                FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_hit_rate(file_id, NULL);
@@ -3213,11 +2161,11 @@ check_file_mdc_api_errs(void)
     /* test H5Freset_mdc_hit_rate_stats() */
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Freset_mdc_hit_rate_stats().\n",
-		      FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Freset_mdc_hit_rate_stats().\n",
+                FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Freset_mdc_hit_rate_stats((hid_t)-1);
@@ -3235,10 +2183,10 @@ check_file_mdc_api_errs(void)
     /* test H5Fget_mdc_size() */
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", FUNC);
+        }
 
         H5E_BEGIN_TRY {
             result = H5Fget_mdc_size((hid_t)-1, &max_size, &min_clean_size,
@@ -3254,10 +2202,10 @@ check_file_mdc_api_errs(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", FUNC);
+        }
 
         if ( ( H5Fget_mdc_size(file_id, &max_size, NULL, NULL, NULL) < 0 ) ||
              ( H5Fget_mdc_size(file_id, NULL, &min_clean_size,
@@ -3276,10 +2224,10 @@ check_file_mdc_api_errs(void)
     /* close the file and delete it */
     if ( pass ) {
 
-	if ( show_progress ) {
+        if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: cleaning up from tests.\n", FUNC);
-	}
+            HDfprintf(stdout, "%s: cleaning up from tests.\n", FUNC);
+        }
 
         if ( H5Fclose(file_id) < 0  ) {
 
@@ -3293,39 +2241,45 @@ check_file_mdc_api_errs(void)
         }
     }
 
-    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+    if ( pass ) {
 
-    if ( ! pass )
-        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  FUNC, failure_mssg);
+        PASSED();
 
-    return !pass;
+    } else {
+
+        H5_FAILED();
+    }
+
+    if ( ! pass ) {
+
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+    }
+
+    return pass;
 
 } /* check_file_mdc_api_errs() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	main
+ * Function:    main
  *
- * Purpose:	Run tests on the cache code contained in H5C.c
+ * Purpose:     Run tests on the cache code contained in H5C.c
  *
- * Return:	Success:
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
- *		Failure:
- *
- * Programmer:	John Mainzer
+ * Programmer:  John Mainzer
  *              6/24/04
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
 int
 main(void)
 {
     unsigned nerrs = 0;
     int express_test;
+    hid_t fcpl_id = -1;
+    hid_t fcpl2_id = -1;
+    unsigned paged;
 
     H5open();
 
@@ -3337,22 +2291,70 @@ main(void)
     printf("===================================\n");
 
 
-#if 1
-    nerrs += check_fapl_mdc_api_calls();
-#endif
-#if 1
-    nerrs += check_file_mdc_api_calls();
-#endif
-#if 1
-    nerrs += mdc_api_call_smoke_check(express_test);
-#endif
-#if 1
-    nerrs += check_fapl_mdc_api_errs();
-#endif
-#if 1
-    nerrs += check_file_mdc_api_errs();
-#endif
-
-    return( nerrs > 0 );
-
+    /* Initialize invalid configurations.
+     */
+    invalid_configs = init_invalid_configs();
+    if ( NULL == invalid_configs ) {
+        failure_mssg = "Unable to allocate memory for invalid configs.";
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+        return EXIT_FAILURE;
+    } /* end if */
+
+    if((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) {
+        failure_mssg = "H5Pcreate(H5P_FILE_CREATE) failed.\n";
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+        return EXIT_FAILURE;
+    } /* end if */
+
+    /* Set file space strategy to default or paged aggregation strategy */
+    if((fcpl2_id = H5Pcopy(fcpl_id)) < 0) {
+        failure_mssg = "H5Pcreate(H5P_FILE_CREATE) failed.\n";
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+        return EXIT_FAILURE;
+    } /* end if */
+
+    if(H5Pset_file_space_strategy(fcpl2_id, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)1) < 0) {
+        failure_mssg = "H5Pset_file_space_strategy() failed.\n";
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+        return EXIT_FAILURE;
+    } /* end if */
+
+    /* Test with paged aggregation enabled or not */
+    /* The "my_fcpl" passed to each test has the paged or non-paged strategy set up accordinly */
+    for(paged = FALSE; paged <= TRUE; paged++) {
+        hid_t my_fcpl = fcpl_id;
+
+        if(paged)
+            my_fcpl = fcpl2_id;
+
+        if(!check_fapl_mdc_api_calls(paged, my_fcpl))
+            nerrs += 1;
+
+        if(!check_file_mdc_api_calls(paged, my_fcpl))
+            nerrs += 1;
+
+        if(!mdc_api_call_smoke_check(express_test, paged, my_fcpl))
+            nerrs += 1;
+
+        if(!check_file_mdc_api_errs(paged, my_fcpl))
+            nerrs += 1;
+    } /* end for paged */
+
+    if(!check_fapl_mdc_api_errs())
+        nerrs += 1;
+
+    if(invalid_configs)
+        HDfree(invalid_configs);
+
+    if(H5Pclose(fcpl_id) < 0 ) {
+        failure_mssg = "H5Pclose() failed.\n";
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", FUNC, failure_mssg);
+        return EXIT_FAILURE;
+    } /* end if */
+
+    if(nerrs > 0)
+        return EXIT_FAILURE;
+    else
+        return EXIT_SUCCESS;
 } /* main() */
+
diff --git a/test/cache_common.c b/test/cache_common.c
index 96199f8..69bc26a 100644
--- a/test/cache_common.c
+++ b/test/cache_common.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  John Mainzer
@@ -19,10 +17,6 @@
  *		This file contains common code for tests of the cache
  *		implemented in H5C.c
  */
-#include "h5test.h"
-#include "H5Cprivate.h"
-#include "H5ACprivate.h"
-#include "H5Iprivate.h"
 #include "H5MFprivate.h"
 #include "H5MMprivate.h"
 #include "cache_common.h"
@@ -43,6 +37,12 @@ hid_t saved_fapl_id = H5P_DEFAULT; /* store the fapl id here between
 				    * close.
 				    */
 
+hid_t saved_fcpl_id = H5P_DEFAULT; /* store the fcpl id here between
+				    * cache setup and takedown.  Note
+				    * that if saved_fcpl_id == H5P_DEFAULT,
+				    * we assume that there is no fcpl to
+				    * close.
+				    */
 hid_t saved_fid = -1; /* store the file id here between cache setup
 		       * and takedown.
 		       */
@@ -63,42 +63,34 @@ hbool_t try_core_file_driver = FALSE;
 hbool_t core_file_driver_failed = FALSE;
 const char *failure_mssg = NULL;
 
-static test_entry_t pico_entries[NUM_PICO_ENTRIES], orig_pico_entries[NUM_PICO_ENTRIES];
-static test_entry_t nano_entries[NUM_NANO_ENTRIES], orig_nano_entries[NUM_NANO_ENTRIES];
-static test_entry_t micro_entries[NUM_MICRO_ENTRIES], orig_micro_entries[NUM_MICRO_ENTRIES];
-static test_entry_t tiny_entries[NUM_TINY_ENTRIES], orig_tiny_entries[NUM_TINY_ENTRIES];
-static test_entry_t small_entries[NUM_SMALL_ENTRIES], orig_small_entries[NUM_SMALL_ENTRIES];
-static test_entry_t medium_entries[NUM_MEDIUM_ENTRIES], orig_medium_entries[NUM_MEDIUM_ENTRIES];
-static test_entry_t large_entries[NUM_LARGE_ENTRIES], orig_large_entries[NUM_LARGE_ENTRIES];
-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];
+static test_entry_t *pico_entries = NULL,      *orig_pico_entries = NULL;
+static test_entry_t *nano_entries = NULL,      *orig_nano_entries = NULL;
+static test_entry_t *micro_entries = NULL,     *orig_micro_entries = NULL;
+static test_entry_t *tiny_entries = NULL,      *orig_tiny_entries = NULL;
+static test_entry_t *small_entries = NULL,     *orig_small_entries = NULL;
+static test_entry_t *medium_entries = NULL,    *orig_medium_entries = NULL;
+static test_entry_t *large_entries = NULL,     *orig_large_entries = NULL;
+static test_entry_t *huge_entries = NULL,      *orig_huge_entries = NULL;
+static test_entry_t *monster_entries = NULL,   *orig_monster_entries = NULL;
+static test_entry_t *variable_entries = NULL,  *orig_variable_entries = NULL;
+static test_entry_t *notify_entries = NULL,    *orig_notify_entries = NULL;
 
 hbool_t orig_entry_arrays_init = FALSE;
 
-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 herr_t pico_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t nano_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t micro_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t tiny_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t small_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t medium_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t large_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t huge_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t monster_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t variable_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+static herr_t notify_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr);
+
+static herr_t variable_get_final_load_size(const void *image, size_t image_len,
+    void *udata, size_t *actual_len);
 
 static htri_t variable_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
 
@@ -125,62 +117,51 @@ static void *variable_deserialize(const void *image_ptr, size_t len, void *udata
 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_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t nano_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t micro_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t tiny_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t small_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t medium_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t large_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t huge_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t monster_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t variable_image_len(const void *thing, size_t *image_len_ptr);
+static herr_t notify_image_len(const void *thing, size_t *image_len_ptr);
+
+static herr_t pico_pre_serialize(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 nano_pre_serialize(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 micro_pre_serialize(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 tiny_pre_serialize(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 small_pre_serialize(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 medium_pre_serialize(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 large_pre_serialize(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 huge_pre_serialize(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 monster_pre_serialize(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 variable_pre_serialize(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 notify_pre_serialize(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 pico_serialize(const H5F_t *f, void *image_ptr,
     size_t len, void *thing);
@@ -224,12 +205,14 @@ 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 herr_t get_initial_load_size(void *udata_ptr, size_t *image_len_ptr,
+    int32_t entry_type);
+static herr_t get_final_load_size(const void *image, size_t image_len,
+    void *udata, size_t *actual_len, 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,
+static herr_t image_len(const void *thing, size_t *image_len_ptr, int32_t entry_type);
+static herr_t pre_serialize(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, 
@@ -242,36 +225,9 @@ static herr_t free_icr(test_entry_t *entry, int32_t entry_type);
 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];
 
-test_entry_t *entries[NUMBER_OF_ENTRY_TYPES] =
-{
-    pico_entries,
-    nano_entries,
-    micro_entries,
-    tiny_entries,
-    small_entries,
-    medium_entries,
-    large_entries,
-    huge_entries,
-    monster_entries,
-    variable_entries,
-    notify_entries
-};
-
-test_entry_t *orig_entries[NUMBER_OF_ENTRY_TYPES] =
-{
-    orig_pico_entries,
-    orig_nano_entries,
-    orig_micro_entries,
-    orig_tiny_entries,
-    orig_small_entries,
-    orig_medium_entries,
-    orig_large_entries,
-    orig_huge_entries,
-    orig_monster_entries,
-    orig_variable_entries,
-    orig_notify_entries
-};
+test_entry_t *orig_entries[NUMBER_OF_ENTRY_TYPES];
 
 const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] =
 {
@@ -333,202 +289,209 @@ const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] =
     NOTIFY_ALT_BASE_ADDR
 };
 
-const char *entry_type_names[NUMBER_OF_ENTRY_TYPES] =
-{
-    "pico entries -- 1 B",
-    "nano entries -- 4 B",
-    "micro entries -- 16 B",
-    "tiny entries -- 64 B",
-    "small entries -- 256 B",
-    "medium entries -- 1 KB",
-    "large entries -- 4 KB",
-    "huge entries -- 16 KB",
-    "monster entries -- 64 KB",
-    "variable entries -- 1B - 10KB",
-    "notify entries -- 1B"
-};
-
 

-/* callback table declaration */
-
-const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] =
-{
-  {
+/* Callback classes */
+static const H5C_class_t pico_class[1] = {{
     PICO_ENTRY_TYPE,
     "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,
-  },
-  {
+    pico_get_initial_load_size,
+    NULL,
+    NULL,
+    pico_deserialize,
+    pico_image_len,
+    pico_pre_serialize,
+    pico_serialize,
+    NULL,
+    pico_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t nano_class[1] = {{
     NANO_ENTRY_TYPE,
     "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,
-  },
-  {
+    nano_get_initial_load_size,
+    NULL,
+    NULL,
+    nano_deserialize,
+    nano_image_len,
+    nano_pre_serialize,
+    nano_serialize,
+    NULL,
+    nano_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t micro_class[1] = {{
     MICRO_ENTRY_TYPE,
     "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,
-  },
-  {
+    micro_get_initial_load_size,
+    NULL,
+    NULL,
+    micro_deserialize,
+    micro_image_len,
+    micro_pre_serialize,
+    micro_serialize,
+    NULL,
+    micro_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t tiny_class[1] = {{
     TINY_ENTRY_TYPE,
     "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,
-  },
-  {
+    tiny_get_initial_load_size,
+    NULL,
+    NULL,
+    tiny_deserialize,
+    tiny_image_len,
+    tiny_pre_serialize,
+    tiny_serialize,
+    NULL,
+    tiny_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t small_class[1] = {{
     SMALL_ENTRY_TYPE,
     "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,
-  },
-  {
+    small_get_initial_load_size,
+    NULL,
+    NULL,
+    small_deserialize,
+    small_image_len,
+    small_pre_serialize,
+    small_serialize,
+    NULL,
+    small_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t medium_class[1] = {{
     MEDIUM_ENTRY_TYPE,
     "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,
-  },
-  {
+    medium_get_initial_load_size,
+    NULL,
+    NULL,
+    medium_deserialize,
+    medium_image_len,
+    medium_pre_serialize,
+    medium_serialize,
+    NULL,
+    medium_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t large_class[1] = {{
     LARGE_ENTRY_TYPE,
     "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,
-  },
-  {
+    large_get_initial_load_size,
+    NULL,
+    NULL,
+    large_deserialize,
+    large_image_len,
+    large_pre_serialize,
+    large_serialize,
+    NULL,
+    large_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t huge_class[1] = {{
     HUGE_ENTRY_TYPE,
     "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,
-  },
-  {
+    huge_get_initial_load_size,
+    NULL,
+    NULL,
+    huge_deserialize,
+    huge_image_len,
+    huge_pre_serialize,
+    huge_serialize,
+    NULL,
+    huge_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t monster_class[1] = {{
     MONSTER_ENTRY_TYPE,
     "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,
-  },
-  {
+    monster_get_initial_load_size,
+    NULL,
+    NULL,
+    monster_deserialize,
+    monster_image_len,
+    monster_pre_serialize,
+    monster_serialize,
+    NULL,
+    monster_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t variable_class[1] = {{
     VARIABLE_ENTRY_TYPE,
     "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,
-  },
-  {
+    variable_get_initial_load_size,
+    variable_get_final_load_size,
+    variable_verify_chksum,
+    variable_deserialize,
+    variable_image_len,
+    variable_pre_serialize,
+    variable_serialize,
+    NULL,
+    variable_free_icr,
+    NULL,
+}};
+
+static const H5C_class_t notify_class[1] = {{
     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,
-  }
+    notify_get_initial_load_size,
+    NULL,
+    NULL,
+    notify_deserialize,
+    notify_image_len,
+    notify_pre_serialize,
+    notify_serialize,
+    notify_notify,
+    notify_free_icr,
+    NULL,
+}};
+
+/* callback table declaration */
+
+const H5C_class_t *types[NUMBER_OF_ENTRY_TYPES] = {
+    pico_class,
+    nano_class,
+    micro_class,
+    tiny_class,
+    small_class,
+    medium_class,
+    large_class,
+    huge_class,
+    monster_class,
+    variable_class,
+    notify_class
 };
 
 /* address translation functions: */
@@ -644,10 +607,10 @@ check_write_permitted(const H5F_t H5_ATTR_UNUSED *f, hbool_t *write_permitted_pt
 
 

 /*-------------------------------------------------------------------------
- * Function:	get_load_size & friends
+ * Function:	get_initial_load_size & friends
  *
  * Purpose:	Query the image size for loading an entry.  The helper
- *              functions funnel into get_load_size proper.
+ *              functions funnel into get_initial_load_size proper.
  *
  * Return:	SUCCEED
  *
@@ -657,7 +620,7 @@ check_write_permitted(const H5F_t H5_ATTR_UNUSED *f, hbool_t *write_permitted_pt
  *-------------------------------------------------------------------------
  */
 static herr_t
-get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len, int32_t entry_type)
+get_initial_load_size(void *udata, size_t *image_length, int32_t entry_type)
 {
     test_entry_t *entry;
     test_entry_t *base_addr;
@@ -680,84 +643,133 @@ get_load_size(const void *image, void *udata, size_t *image_length, size_t *actu
     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;
-    }
+    *image_length = entry->size;
 
     return(SUCCEED);
-} /* get_load_size() */
+} /* get_initial_load_size() */
+
+static herr_t
+pico_get_initial_load_size(void *udata, size_t *image_length)
+{
+    return get_initial_load_size(udata, image_length, PICO_ENTRY_TYPE);
+}
 
 static herr_t
-pico_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+nano_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, PICO_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, NANO_ENTRY_TYPE);
 }
 
 static herr_t
-nano_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+micro_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, NANO_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, MICRO_ENTRY_TYPE);
 }
 
 static herr_t
-micro_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+tiny_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, MICRO_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, TINY_ENTRY_TYPE);
 }
 
 static herr_t
-tiny_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+small_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, TINY_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, SMALL_ENTRY_TYPE);
 }
 
 static herr_t
-small_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+medium_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, SMALL_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, MEDIUM_ENTRY_TYPE);
 }
 
 static herr_t
-medium_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+large_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, MEDIUM_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, LARGE_ENTRY_TYPE);
 }
 
 static herr_t
-large_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+huge_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, LARGE_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, HUGE_ENTRY_TYPE);
 }
 
 static herr_t
-huge_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+monster_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, HUGE_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, MONSTER_ENTRY_TYPE);
 }
 
 static herr_t
-monster_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+variable_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, MONSTER_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, VARIABLE_ENTRY_TYPE);
 }
 
 static herr_t
-variable_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+notify_get_initial_load_size(void *udata, size_t *image_length)
 {
-    return get_load_size(image, udata, image_length, actual_len, VARIABLE_ENTRY_TYPE);
+    return get_initial_load_size(udata, image_length, NOTIFY_ENTRY_TYPE);
 }
 
+

+/*-------------------------------------------------------------------------
+ * Function:	get_final_load_size & friends
+ *
+ * Purpose:	Query the final image size for loading an entry.  The helper
+ *              functions funnel into get_final_load_size proper.
+ *
+ * Return:	SUCCEED
+ *
+ * Programmer:	Quincey Koziol
+ *              11/18/16
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+get_final_load_size(const void H5_ATTR_UNUSED *image, size_t H5_ATTR_UNUSED image_len,
+    void *udata, 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;
+
+    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);
+    HDassert(type == VARIABLE_ENTRY_TYPE);
+
+    /* Simulate SPECULATIVE read with a specified actual_len */
+    if(entry->actual_len) {
+        *actual_len = entry->actual_len;
+        entry->size = entry->actual_len;
+    } /* end if */
+    else
+        *actual_len = entry->size;
+
+    return(SUCCEED);
+} /* get_final_load_size() */
+
 static herr_t
-notify_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+variable_get_final_load_size(const void *image, size_t image_len,
+    void *udata, size_t *actual_len)
 {
-    return get_load_size(image, udata, image_length, actual_len, NOTIFY_ENTRY_TYPE);
+    return get_final_load_size(image, image_len, udata, actual_len, VARIABLE_ENTRY_TYPE);
 }
 
 

@@ -860,17 +872,6 @@ deserialize(const void *image, size_t len, void *udata, hbool_t *dirty,
     HDassert( entry->flush_dep_npar == 0 );
     HDassert( entry->flush_dep_nchd == 0 );
 
-#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 */
-
     /* for now *dirty will always be FALSE */
     *dirty = FALSE;
 
@@ -999,9 +1000,9 @@ notify_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
  *-------------------------------------------------------------------------
  */
 herr_t
-image_len(void *thing, size_t *image_length, int32_t entry_type)
+image_len(const void *thing, size_t *image_length, int32_t entry_type)
 {
-    test_entry_t *entry;
+    const test_entry_t *entry;
     test_entry_t *base_addr;
     int32_t type;
     int32_t idx;
@@ -1009,7 +1010,7 @@ image_len(void *thing, size_t *image_length, int32_t entry_type)
     HDassert(thing);
     HDassert(image_length);
 
-    entry = (test_entry_t *)thing;
+    entry = (const test_entry_t *)thing;
 
     HDassert(entry->self == entry);
 
@@ -1036,78 +1037,67 @@ image_len(void *thing, size_t *image_length, int32_t entry_type)
 } /* image_len() */
 
 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)
+pico_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, PICO_ENTRY_TYPE);
 }
 
 herr_t
-nano_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+nano_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, NANO_ENTRY_TYPE);
 }
 
 herr_t
-micro_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+micro_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, MICRO_ENTRY_TYPE);
 }
 
 herr_t
-tiny_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+tiny_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, TINY_ENTRY_TYPE);
 }
 
 herr_t
-small_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+small_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, SMALL_ENTRY_TYPE);
 }
 
 herr_t
-medium_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+medium_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, MEDIUM_ENTRY_TYPE);
 }
 
 herr_t
-large_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+large_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, LARGE_ENTRY_TYPE);
 }
 
 herr_t
-huge_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+huge_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, HUGE_ENTRY_TYPE);
 }
 
 herr_t
-monster_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+monster_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, MONSTER_ENTRY_TYPE);
 }
 
 herr_t
-variable_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+variable_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, VARIABLE_ENTRY_TYPE);
 }
 
 herr_t
-notify_image_len(void *thing, size_t *image_length,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+notify_image_len(const void *thing, size_t *image_length)
 {
     return image_len(thing, image_length, NOTIFY_ENTRY_TYPE);
 }
@@ -1132,7 +1122,7 @@ notify_image_len(void *thing, size_t *image_length,
  *-------------------------------------------------------------------------
  */
 herr_t
-pre_serialize(const H5F_t *f,
+pre_serialize(H5F_t *f,
               hid_t H5_ATTR_UNUSED dxpl_id,
               void *thing,
               haddr_t addr,
@@ -1217,15 +1207,13 @@ pre_serialize(const H5F_t *f,
 } /* pre_serialize() */
 
 herr_t
-pico_pre_serialize(const H5F_t *f,
+pico_pre_serialize(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, 
@@ -1233,15 +1221,13 @@ pico_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-nano_pre_serialize(const H5F_t *f,
+nano_pre_serialize(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, 
@@ -1249,15 +1235,13 @@ nano_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-micro_pre_serialize(const H5F_t *f,
+micro_pre_serialize(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, 
@@ -1265,15 +1249,13 @@ micro_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-tiny_pre_serialize(const H5F_t *f,
+tiny_pre_serialize(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, 
@@ -1281,15 +1263,13 @@ tiny_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-small_pre_serialize(const H5F_t *f,
+small_pre_serialize(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, 
@@ -1297,15 +1277,13 @@ small_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-medium_pre_serialize(const H5F_t *f,
+medium_pre_serialize(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, 
@@ -1313,15 +1291,13 @@ medium_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-large_pre_serialize(const H5F_t *f,
+large_pre_serialize(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, 
@@ -1329,15 +1305,13 @@ large_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-huge_pre_serialize(const H5F_t *f,
+huge_pre_serialize(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, 
@@ -1345,15 +1319,13 @@ huge_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-monster_pre_serialize(const H5F_t *f,
+monster_pre_serialize(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, 
@@ -1361,15 +1333,13 @@ monster_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-variable_pre_serialize(const H5F_t *f,
+variable_pre_serialize(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, 
@@ -1377,15 +1347,13 @@ variable_pre_serialize(const H5F_t *f,
 }
 
 herr_t
-notify_pre_serialize(const H5F_t *f,
+notify_pre_serialize(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, 
@@ -1588,7 +1556,8 @@ notify(H5C_notify_action_t action, void *thing, int32_t entry_type)
     HDassert(entry->type == entry_type);
     HDassert(entry == &(base_addr[entry->index]));
     HDassert(entry == entry->self);
-    HDassert(entry->header.addr == entry->addr);
+    if(!(action == H5C_NOTIFY_ACTION_ENTRY_DIRTIED && entry->action == TEST_ENTRY_ACTION_MOVE))
+        HDassert(entry->header.addr == entry->addr);
     HDassert((entry->type == VARIABLE_ENTRY_TYPE) || \
               (entry->size == entry_sizes[entry->type]));
 
@@ -1600,6 +1569,12 @@ notify(H5C_notify_action_t action, void *thing, int32_t entry_type)
             break;
 
         case H5C_NOTIFY_ACTION_AFTER_FLUSH:
+        case H5C_NOTIFY_ACTION_ENTRY_DIRTIED:
+        case H5C_NOTIFY_ACTION_ENTRY_CLEANED:
+        case H5C_NOTIFY_ACTION_CHILD_DIRTIED:
+        case H5C_NOTIFY_ACTION_CHILD_CLEANED:
+        case H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+        case H5C_NOTIFY_ACTION_CHILD_SERIALIZED:
 	    /* do nothing */
 	    break;
 
@@ -1661,9 +1636,12 @@ free_icr(test_entry_t *entry, int32_t entry_type)
     HDassert(entry->cache_ptr->magic == H5C__H5C_T_MAGIC);
     HDassert((entry->header.destroy_in_progress) ||
               (entry->header.addr == entry->addr));
+    HDassert(entry->header.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
     HDassert(entry->header.size == entry->size);
     HDassert((entry->type == VARIABLE_ENTRY_TYPE) ||
 	      (entry->size == entry_sizes[entry->type]));
+    HDassert(entry->header.tl_next == NULL);
+    HDassert(entry->header.tl_prev == NULL);
 
     if(entry->num_pins > 0) {
         int i;
@@ -1817,8 +1795,13 @@ add_flush_op(int target_type,
 	      ( type == VARIABLE_ENTRY_TYPE ) );
     HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
     HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) );
-    HDassert( ( flag == TRUE ) || ( flag == FALSE ) );
     HDassert( new_size <= VARIABLE_ENTRY_SIZE );
+#ifndef H5_HAVE_STDBOOL_H
+    /* Check for TRUE or FALSE if we're using an integer type instead
+     * of a real Boolean type.
+     */
+    HDassert( ( flag == TRUE ) || ( flag == FALSE ) );
+#endif /* H5_HAVE_STDBOOL_H */
 
     if ( pass ) {
 
@@ -2044,8 +2027,13 @@ execute_flush_op(H5F_t * file_ptr,
               ( op_ptr->type < NUMBER_OF_ENTRY_TYPES ) );
     HDassert( ( 0 <= op_ptr->idx ) &&
               ( op_ptr->idx <= max_indices[op_ptr->type] ) );
-    HDassert( ( op_ptr->flag == FALSE ) || ( op_ptr->flag == TRUE ) );
     HDassert( flags_ptr != NULL );
+#ifndef H5_HAVE_STDBOOL_H
+    /* Check for TRUE or FALSE if we're using an integer type instead
+     * of a real Boolean type.
+     */
+    HDassert( ( op_ptr->flag == FALSE ) || ( op_ptr->flag == TRUE ) );
+#endif /* H5_HAVE_STDBOOL_H */
 
     if ( pass ) {
 
@@ -2208,6 +2196,188 @@ entry_in_cache(H5C_t * cache_ptr,
 
 

 /*-------------------------------------------------------------------------
+ * Function:    create_entry_arrays
+ *
+ * Purpose:     Create the entry arrays, both regular and original.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t
+create_entry_arrays(void)
+
+{
+    /* pico entries */
+    if(NULL == (pico_entries = (test_entry_t *)HDcalloc(NUM_PICO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_pico_entries = (test_entry_t *)HDcalloc(NUM_PICO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* nano entries */
+    if(NULL == (nano_entries = (test_entry_t *)HDcalloc(NUM_NANO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_nano_entries = (test_entry_t *)HDcalloc(NUM_NANO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* micro entries */
+    if(NULL == (micro_entries = (test_entry_t *)HDcalloc(NUM_MICRO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_micro_entries = (test_entry_t *)HDcalloc(NUM_MICRO_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* tiny entries */
+    if(NULL == (tiny_entries = (test_entry_t *)HDcalloc(NUM_TINY_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_tiny_entries = (test_entry_t *)HDcalloc(NUM_TINY_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* small entries */
+    if(NULL == (small_entries = (test_entry_t *)HDcalloc(NUM_SMALL_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_small_entries = (test_entry_t *)HDcalloc(NUM_SMALL_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* medium entries */
+    if(NULL == (medium_entries = (test_entry_t *)HDcalloc(NUM_MEDIUM_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_medium_entries = (test_entry_t *)HDcalloc(NUM_MEDIUM_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* large entries */
+    if(NULL == (large_entries = (test_entry_t *)HDcalloc(NUM_LARGE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_large_entries = (test_entry_t *)HDcalloc(NUM_LARGE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* huge entries */
+    if(NULL == (huge_entries = (test_entry_t *)HDcalloc(NUM_HUGE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_huge_entries = (test_entry_t *)HDcalloc(NUM_HUGE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* monster entries */
+    if(NULL == (monster_entries = (test_entry_t *)HDcalloc(NUM_MONSTER_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_monster_entries = (test_entry_t *)HDcalloc(NUM_MONSTER_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* variable entries */
+    if(NULL == (variable_entries = (test_entry_t *)HDcalloc(NUM_VARIABLE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_variable_entries = (test_entry_t *)HDcalloc(NUM_VARIABLE_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    /* notify entries */
+    if(NULL == (notify_entries = (test_entry_t *)HDcalloc(NUM_NOTIFY_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+    if(NULL == (orig_notify_entries = (test_entry_t *)HDcalloc(NUM_NOTIFY_ENTRIES, sizeof(test_entry_t))))
+        goto error;
+
+    entries[0] = pico_entries;
+    entries[1] = nano_entries;
+    entries[2] = micro_entries;
+    entries[3] = tiny_entries;
+    entries[4] = small_entries;
+    entries[5] = medium_entries;
+    entries[6] = large_entries;
+    entries[7] = huge_entries;
+    entries[8] = monster_entries;
+    entries[9] = variable_entries;
+    entries[10] = notify_entries;
+
+    orig_entries[0] = orig_pico_entries;
+    orig_entries[1] = orig_nano_entries;
+    orig_entries[2] = orig_micro_entries;
+    orig_entries[3] = orig_tiny_entries;
+    orig_entries[4] = orig_small_entries;
+    orig_entries[5] = orig_medium_entries;
+    orig_entries[6] = orig_large_entries;
+    orig_entries[7] = orig_huge_entries;
+    orig_entries[8] = orig_monster_entries;
+    orig_entries[9] = orig_variable_entries;
+    orig_entries[10] = orig_notify_entries;
+
+    return SUCCEED;
+
+error:
+    free_entry_arrays();
+    return FAIL;
+
+} /* create_entry_arrays() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    free_entry_arrays
+ *
+ * Purpose:     Free the entry arrays, both regular and original.
+ *
+ * Return:      void
+ *
+ * Programmer:	Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+free_entry_arrays(void)
+
+{
+    /* pico entries */
+    HDfree(pico_entries);
+    HDfree(orig_pico_entries);
+
+    /* nano entries */
+    HDfree(nano_entries);
+    HDfree(orig_nano_entries);
+
+    /* micro entries */
+    HDfree(micro_entries);
+    HDfree(orig_micro_entries);
+
+    /* tiny entries */
+    HDfree(tiny_entries);
+    HDfree(orig_tiny_entries);
+
+    /* small entries */
+    HDfree(small_entries);
+    HDfree(orig_small_entries);
+
+    /* medium entries */
+    HDfree(medium_entries);
+    HDfree(orig_medium_entries);
+
+    /* large entries */
+    HDfree(large_entries);
+    HDfree(orig_large_entries);
+
+    /* huge entries */
+    HDfree(huge_entries);
+    HDfree(orig_huge_entries);
+
+    /* monster entries */
+    HDfree(monster_entries);
+    HDfree(orig_monster_entries);
+
+    /* variable entries */
+    HDfree(variable_entries);
+    HDfree(orig_variable_entries);
+
+    /* notify entries */
+    HDfree(notify_entries);
+    HDfree(orig_notify_entries);
+
+    return;
+
+} /* free_entry_arrays() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	reset_entries
  *
  * Purpose:	reset the contents of the entries arrays to known values.
@@ -2426,9 +2596,8 @@ resize_entry(H5F_t * file_ptr,
 
                     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)
+
+                    if(entry_ptr->flush_dep_npar > 0 && !was_dirty)
                         mark_flush_dep_dirty(entry_ptr);
 
                     if ( result != SUCCEED ) {
@@ -3003,7 +3172,8 @@ verify_unprotected(void)
 
 H5F_t *
 setup_cache(size_t max_cache_size,
-            size_t min_clean_size)
+            size_t min_clean_size,
+            unsigned paged)
 {
     char filename[512];
     hbool_t show_progress = FALSE;
@@ -3015,58 +3185,78 @@ setup_cache(size_t max_cache_size,
     H5F_t * ret_val = NULL;
     haddr_t actual_base_addr;
     hid_t fapl_id = H5P_DEFAULT;
+    hid_t fcpl_id = H5P_DEFAULT;
 
-    if ( show_progress ) /* 1 */
+    if(show_progress) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
     saved_fid = -1;
 
-    /* setup the file name */
-    if ( pass ) {
+    if(pass) {
+        if((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) == FAIL) {
+            pass = FALSE;
+            failure_mssg = "H5Pcreate(H5P_FILE_CREATE) failed.\n";
+        }
+    }
+
+    if(pass && paged) {
+        /* Set up paged aggregation strategy */
+        if(H5Pset_file_space_strategy(fcpl_id, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)1) == FAIL) {
+            pass = FALSE;
+            failure_mssg = "H5Pset_file_space_strategy() failed.\n";
+            H5Pclose(fcpl_id);
+	    fcpl_id = H5P_DEFAULT;
+        }
+    }
+
+    if(pass && paged) {
+        /* Set up file space page size to BASE_ADDR */
+        if(H5Pset_file_space_page_size(fcpl_id, (hsize_t)BASE_ADDR) == FAIL) {
+            pass = FALSE;
+            failure_mssg = "H5Pset_file_space_page_size() failed.\n";
+            H5Pclose(fcpl_id);
+	    fcpl_id = H5P_DEFAULT;
+        }
+    }
 
-        if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename))
-            == NULL ) {
+    if(pass) 
+        saved_fcpl_id = fcpl_id;
 
+    /* setup the file name */
+    if(pass) {
+        if(NULL == h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename))) {
             pass = FALSE;
             failure_mssg = "h5_fixname() failed.\n";
         }
     }
 
-    if ( show_progress ) /* 2 */
+    if(show_progress) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( ( pass ) && ( try_core_file_driver ) ) {
-
-	if ( (fapl_id = H5Pcreate(H5P_FILE_ACCESS)) == FAIL ) {
-
+    if(pass && try_core_file_driver) {
+	if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) == FAIL) {
 	    pass = FALSE;
 	    failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n";
         }
-	else if ( H5Pset_fapl_core(fapl_id, MAX_ADDR, FALSE) < 0 ) {
-
+	else if(H5Pset_fapl_core(fapl_id, MAX_ADDR, FALSE) < 0) {
 	    H5Pclose(fapl_id);
 	    fapl_id = H5P_DEFAULT;
 	    pass = FALSE;
 	    failure_mssg = "H5P_set_fapl_core() failed.\n";
         }
-	else if ( (fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id))
-	          < 0 ) {
-
+	else if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, fapl_id)) < 0) {
 	    core_file_driver_failed = TRUE;
 
-            if ( verbose ) {
+            if(verbose)
                 HDfprintf(stdout, "%s: H5Fcreate() with CFD failed.\n", FUNC);
-            }
-
         } else {
-
 	    saved_fapl_id = fapl_id;
 	}
     }
 
-    if ( show_progress ) /* 3 */
+    if(show_progress) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -3074,63 +3264,49 @@ setup_cache(size_t max_cache_size,
      * with the core file driver failed, try again with a regular file.
      * If this fails, we are cooked.
      */
-    if ( ( pass ) && ( fid < 0 ) ) {
-
-        fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
-
-	saved_fid = fid;
-
-        if ( fid < 0 ) {
+    if(pass && fid < 0) {
+        fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, fapl_id);
+        saved_fid = fid;
 
+        if(fid < 0) {
             pass = FALSE;
             failure_mssg = "H5Fcreate() failed.";
 
-            if ( verbose ) {
+            if(verbose)
                 HDfprintf(stdout, "%s: H5Fcreate() failed.\n", FUNC);
-            }
-        }
-    }
+        } /* end if */
+    } /* end if */
 
-    if ( show_progress ) /* 4 */
+    if(show_progress) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
-
-	HDassert( fid >= 0 );
-
+    if(pass) {
+	HDassert(fid >= 0);
 	saved_fid = fid;
-
-        if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) {
-
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0) {
             pass = FALSE;
             failure_mssg = "H5Fflush() failed.";
 
-            if ( verbose ) {
+            if(verbose)
                 HDfprintf(stdout, "%s: H5Fflush() failed.\n", FUNC);
-            }
-
         } else {
-
             file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE);
-
-	    if ( file_ptr == NULL ) {
-
+	    if(file_ptr == NULL) {
                 pass = FALSE;
                 failure_mssg = "Can't get file_ptr.";
 
-                if ( verbose ) {
+                if(verbose)
                     HDfprintf(stdout, "%s: H5Fflush() failed.\n", FUNC);
-                }
 	    }
         }
     }
 
-    if ( show_progress ) /* 5 */
+    if(show_progress) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
+    if(pass) {
 
         /* A bit of fancy footwork here:
 	 *
@@ -3160,16 +3336,14 @@ setup_cache(size_t max_cache_size,
 	 * instance, and then close the file normally.
 	 */
 
-        HDassert( saved_cache == NULL );
-
+        HDassert(saved_cache == NULL);
 	saved_cache = file_ptr->shared->cache;
-
 	file_ptr->shared->cache = NULL;
 
         cache_ptr = H5C_create(max_cache_size,
                                min_clean_size,
                                (NUMBER_OF_ENTRY_TYPES - 1),
-			       (const char **)entry_type_names,
+                               types,
                                check_write_permitted,
                                TRUE,
                                NULL,
@@ -3178,52 +3352,41 @@ setup_cache(size_t max_cache_size,
         file_ptr->shared->cache = cache_ptr;
     }
 
-    if ( show_progress ) /* 6 */
+    if(show_progress) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
-
-	if ( cache_ptr == NULL ) {
-
+    if(pass) {
+	if(cache_ptr == NULL) {
             pass = FALSE;
             failure_mssg = "H5C_create() failed.";
 
-            if ( verbose ) {
+            if(verbose)
                  HDfprintf(stdout, "%s: H5C_create() failed.\n", FUNC);
-            }
-
-        } else if ( cache_ptr->magic != H5C__H5C_T_MAGIC ) {
-
+        } else if(cache_ptr->magic != H5C__H5C_T_MAGIC) {
             pass = FALSE;
 	    failure_mssg = "Bad cache_ptr magic.";
 
-            if ( verbose ) {
+            if(verbose)
                 HDfprintf(stdout, "%s: Bad cache_ptr magic.\n", FUNC);
-            }
 	}
     }
 
-    if ( show_progress ) /* 7 */
+    if(show_progress) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) { /* allocate space for test entries */
-
+    if(pass) { /* allocate space for test entries */
         actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5AC_ind_read_dxpl_id,
 			              (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR));
 
-	if ( actual_base_addr == HADDR_UNDEF ) {
-
+	if(actual_base_addr == HADDR_UNDEF) {
             pass = FALSE;
 	    failure_mssg = "H5MF_alloc() failed.";
 
-	    if ( verbose ) {
+	    if(verbose)
                 HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", FUNC);
-            }
-
-	} else if ( actual_base_addr > BASE_ADDR ) {
-
+	} 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.
@@ -3231,21 +3394,18 @@ setup_cache(size_t max_cache_size,
             pass = FALSE;
 	    failure_mssg = "actual_base_addr > BASE_ADDR";
 
-	    if ( verbose ) {
-                HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n",
-			  FUNC);
-            }
+	    if(verbose)
+                HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", FUNC);
         }
 
         saved_actual_base_addr = actual_base_addr;
     }
 
-    if ( show_progress ) /* 8 */
+    if(show_progress) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
-    if ( pass ) {
-
+    if(pass) {
         /* Need to set this else all cache tests will fail */
         cache_ptr->ignore_tags = TRUE;
 
@@ -3253,7 +3413,7 @@ setup_cache(size_t max_cache_size,
         ret_val = file_ptr;
     }
 
-    if ( show_progress ) /* 9 */
+    if(show_progress) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
                   FUNC, mile_stone++, (int)pass);
 
@@ -3293,6 +3453,12 @@ takedown_cache(H5F_t * file_ptr,
             H5C_stats(cache_ptr, "test cache", dump_detailed_stats);
         }
 
+	if ( H5C_prep_for_file_close(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected failure of prep for file close.\n";
+        }
+
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
 
         H5C_dest(file_ptr, H5AC_ind_read_dxpl_id);
@@ -3311,6 +3477,11 @@ takedown_cache(H5F_t * file_ptr,
 	saved_fapl_id = H5P_DEFAULT;
     }
 
+    if ( saved_fcpl_id != H5P_DEFAULT ) {
+        H5Pclose(saved_fcpl_id);
+	saved_fcpl_id = H5P_DEFAULT;
+    }
+
     if ( saved_fid != -1 ) {
 
         if ( H5F_addr_defined(saved_actual_base_addr) ) {
@@ -3410,7 +3581,7 @@ expunge_entry(H5F_t * file_ptr,
 	HDassert( ! ( entry_ptr->is_pinned ) );
 
         result = H5C_expunge_entry(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[type]), entry_ptr->addr, H5C__NO_FLAGS_SET);
+                types[type], entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( result < 0 ) {
 
@@ -3508,33 +3679,30 @@ flush_cache(H5F_t * file_ptr,
  *
  * Return:	void
  *
- * Programmer:	Vailin Choi; Jan 2014
+ * Programmer:	Vailin Choi
+ *		Jan 2014
  *
  *-------------------------------------------------------------------------
  */
 void
-cork_entry_type(H5F_t * file_ptr, int32_t type)
+cork_entry_type(H5F_t *file_ptr, int32_t type)
 {
-    H5C_t * cache_ptr;
-    haddr_t baddrs;
-    herr_t result;
-
     if(pass) {
+        H5C_t *cache_ptr;
+        haddr_t baddrs;
+
         cache_ptr = file_ptr->shared->cache;
 
-        HDassert( cache_ptr );
-        HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+        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) {
-
+        if(H5C_cork(cache_ptr, baddrs, H5C__SET_CORK, NULL) < 0) {
             pass = FALSE;
             failure_mssg = "error in H5C_cork().";
-        }
-    }
-    return;
+        } /* end if */
+    } /* end if */
+
 } /* cork_entry_type() */
 
 

@@ -3547,33 +3715,30 @@ cork_entry_type(H5F_t * file_ptr, int32_t type)
  *
  * Return:	void
  *
- * Programmer:	Vailin Choi; Jan 2014
+ * Programmer:	Vailin Choi
+ *		Jan 2014
  *
  *-------------------------------------------------------------------------
  */
 void
-uncork_entry_type(H5F_t * file_ptr, int32_t type)
+uncork_entry_type(H5F_t *file_ptr, int32_t type)
 {
-    H5C_t * cache_ptr;
-    haddr_t baddrs;
-    herr_t result;
-
     if(pass) {
+        H5C_t *cache_ptr;
+        haddr_t baddrs;
+
         cache_ptr = file_ptr->shared->cache;
 
-        HDassert( cache_ptr );
-        HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+        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) {
-
+        if(H5C_cork(cache_ptr, baddrs, H5C__UNCORK, NULL) < 0) {
             pass = FALSE;
             failure_mssg = "error in H5C_cork().";
-        }
-    }
-    return;
+        } /* end if */
+    } /* end if */
+
 } /* uncork_entry_type() */
 
 

@@ -3637,11 +3802,11 @@ insert_entry(H5F_t * file_ptr,
         }
 
         result = H5C_insert_entry(file_ptr, xfer,
-	        &(types[type]), entry_ptr->addr, (void *)entry_ptr, flags);
+	        types[type], entry_ptr->addr, (void *)entry_ptr, flags);
 
         if ( ( result < 0 ) ||
              ( entry_ptr->header.is_protected ) ||
-             ( entry_ptr->header.type != &(types[type]) ) ||
+             ( entry_ptr->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -3654,8 +3819,8 @@ insert_entry(H5F_t * file_ptr,
             HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n",
                       (int)(entry_ptr->header.is_protected));
             HDfprintf(stdout,
-		      "entry_ptr->header.type != &(types[type]) = %d\n",
-                      (int)(entry_ptr->header.type != &(types[type])));
+		      "entry_ptr->header.type != types[type] = %d\n",
+                      (int)(entry_ptr->header.type != types[type]));
             HDfprintf(stdout,
                       "entry_ptr->size != entry_ptr->header.size = %d\n",
                       (int)(entry_ptr->size != entry_ptr->header.size));
@@ -3676,11 +3841,11 @@ insert_entry(H5F_t * file_ptr,
         entry_ptr->is_pinned = insert_pinned;
         entry_ptr->pinned_from_client = insert_pinned;
 
-        if(entry_ptr->header.is_corked)
+        if(entry_ptr->header.tag_info && entry_ptr->header.tag_info->corked)
             entry_ptr->is_corked = TRUE;
 
-        HDassert( entry_ptr->header.is_dirty );
-        HDassert( ((entry_ptr->header).type)->id == type );
+        HDassert(entry_ptr->header.is_dirty);
+        HDassert(((entry_ptr->header).type)->id == type);
     } /* end if */
 
     return;
@@ -3728,9 +3893,8 @@ mark_entry_dirty(int32_t type,
 
         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)
+
+        if(entry_ptr->flush_dep_npar > 0 && !was_dirty)
             mark_flush_dep_dirty(entry_ptr);
 
         result = H5C_mark_entry_dirty((void *)entry_ptr);
@@ -3739,7 +3903,7 @@ mark_entry_dirty(int32_t type,
              ( !entry_ptr->header.is_protected && !entry_ptr->header.is_pinned ) ||
              ( entry_ptr->header.is_protected && !entry_ptr->header.dirtied ) ||
              ( !entry_ptr->header.is_protected && !entry_ptr->header.is_dirty ) ||
-             ( entry_ptr->header.type != &(types[type]) ) ||
+             ( entry_ptr->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -3798,8 +3962,8 @@ move_entry(H5C_t * cache_ptr,
         HDassert( entry_ptr->type == type );
         HDassert( entry_ptr == entry_ptr->self );
         HDassert( entry_ptr->cache_ptr == cache_ptr );
-        HDassert( !(entry_ptr->is_protected) );
-        HDassert( !(entry_ptr->header.is_protected) );
+        HDassert( !entry_ptr->is_read_only );
+        HDassert( !entry_ptr->header.is_read_only );
 
 
         if ( entry_ptr->at_main_addr && !main_addr ) {
@@ -3827,13 +3991,13 @@ move_entry(H5C_t * cache_ptr,
             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);
+            if(entry_ptr->flush_dep_npar > 0 && !was_dirty)
+                mark_flush_dep_dirty(entry_ptr);
+
+            entry_ptr->action = TEST_ENTRY_ACTION_MOVE;
+            result = H5C_move_entry(cache_ptr, types[type], old_addr, new_addr);
+            entry_ptr->action = TEST_ENTRY_ACTION_NUL;
         }
 
         if ( ! done ) {
@@ -3877,11 +4041,8 @@ move_entry(H5C_t * cache_ptr,
  *
  *-------------------------------------------------------------------------
  */
-
 void
-protect_entry(H5F_t * file_ptr,
-              int32_t type,
-              int32_t idx)
+protect_entry(H5F_t * file_ptr, int32_t type, int32_t idx)
 {
     H5C_t * cache_ptr;
     test_entry_t * base_addr;
@@ -3890,37 +4051,36 @@ protect_entry(H5F_t * file_ptr,
     hid_t xfer = H5AC_ind_read_dxpl_id;
     H5C_cache_entry_t * cache_entry_ptr;
 
-    if ( pass ) {
-
+    if(pass) {
         cache_ptr = file_ptr->shared->cache;
 
-        HDassert( cache_ptr );
-        HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
-        HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) );
+        HDassert(cache_ptr);
+        HDassert((0 <= type) && (type < NUMBER_OF_ENTRY_TYPES));
+        HDassert((0 <= idx) && (idx <= max_indices[type]));
 
         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->index == idx);
+        HDassert(entry_ptr->type == type);
+        HDassert(entry_ptr == entry_ptr->self);
+        HDassert(!(entry_ptr->is_protected));
 
         /* 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().";
-        }
+        } /* end if */
 
         cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, xfer,
-                &(types[type]), entry_ptr->addr, &entry_ptr->addr, 
+                types[type], entry_ptr->addr, &entry_ptr->addr, 
                 H5C__NO_FLAGS_SET);
 
         if ( ( cache_entry_ptr != (void *)entry_ptr ) ||
              ( !(entry_ptr->header.is_protected) ) ||
-             ( entry_ptr->header.type != &(types[type]) ) ||
+             ( entry_ptr->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -3937,8 +4097,8 @@ protect_entry(H5F_t * file_ptr,
             HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n",
                       (int)(entry_ptr->header.is_protected));
             HDfprintf(stdout,
-                      "( entry_ptr->header.type != &(types[type]) ) = %d\n",
-                      (int)( entry_ptr->header.type != &(types[type]) ));
+                      "( entry_ptr->header.type != types[type] ) = %d\n",
+                      (int)( entry_ptr->header.type != types[type] ));
             HDfprintf(stdout,
                       "entry_ptr->size = %d, entry_ptr->header.size = %d\n",
                       (int)(entry_ptr->size), (int)(entry_ptr->header.size));
@@ -3953,7 +4113,8 @@ protect_entry(H5F_t * file_ptr,
             pass = FALSE;
             failure_mssg = "error in H5C_protect().";
 
-        } else {
+        } /* end if */
+        else {
 
 	    HDassert( ( entry_ptr->cache_ptr == NULL ) ||
 		      ( entry_ptr->cache_ptr == cache_ptr ) );
@@ -3962,15 +4123,13 @@ protect_entry(H5F_t * file_ptr,
 	    entry_ptr->file_ptr = file_ptr;
             entry_ptr->is_protected = TRUE;
 
-        }
+        } /* end else */
 
-	if(entry_ptr->header.is_corked)
+        if(entry_ptr->header.tag_info && entry_ptr->header.tag_info->corked)
 	    entry_ptr->is_corked = TRUE;
 
-        HDassert( ((entry_ptr->header).type)->id == type );
-    }
-
-    return;
+        HDassert(((entry_ptr->header).type)->id == type);
+    } /* end if */
 
 } /* protect_entry() */
 
@@ -4020,13 +4179,13 @@ protect_entry_ro(H5F_t * file_ptr,
 		    ( entry_ptr->ro_ref_count > 0 ) ) );
 
         cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5AC_ind_read_dxpl_id,
-                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
+                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->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -4157,7 +4316,7 @@ unpin_entry(int32_t type,
         if ( ( result < 0 ) ||
              ( 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->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -4230,9 +4389,8 @@ unprotect_entry(H5F_t * file_ptr,
             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)
+
+            if(entry_ptr->flush_dep_npar > 0 && !was_dirty)
                 mark_flush_dep_dirty(entry_ptr);
         } /* end if */
 
@@ -4243,7 +4401,7 @@ unprotect_entry(H5F_t * file_ptr,
              ( ( entry_ptr->header.is_protected ) &&
 	       ( ( ! ( entry_ptr->is_read_only ) ) ||
 		 ( entry_ptr->ro_ref_count <= 0 ) ) ) ||
-             ( entry_ptr->header.type != &(types[type]) ) ||
+             ( entry_ptr->header.type != types[type] ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
 
@@ -4317,7 +4475,6 @@ unprotect_entry(H5F_t * file_ptr,
  *
  *-------------------------------------------------------------------------
  */
-
 void
 row_major_scan_forward(H5F_t * file_ptr,
                        int32_t max_index,
@@ -4339,343 +4496,274 @@ row_major_scan_forward(H5F_t * file_ptr,
     int32_t idx;
     int32_t local_max_index;
 
-    if ( verbose )
+    if(verbose)
         HDfprintf(stdout, "%s(): entering.\n", FUNC);
 
-    if ( pass ) {
-
+    if(pass) {
         cache_ptr = file_ptr->shared->cache;
+        HDassert(cache_ptr != NULL);
+        HDassert(lag >= 10);
 
-        HDassert( cache_ptr != NULL );
-
-        HDassert( lag >= 10 );
-
-        if ( reset_stats ) {
-
+        if(reset_stats)
             H5C_stats__reset(cache_ptr);
-        }
-    }
+    } /* end if */
 
-    while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) )
-    {
+    while(pass && type < NUMBER_OF_ENTRY_TYPES) {
         idx = -lag;
 
         local_max_index = MIN(max_index, max_indices[type]);
-
-        while ( ( pass ) && ( idx <= (local_max_index + lag) ) )
-        {
+        while(pass && idx <= (local_max_index + lag)) {
             int32_t tmp_idx;
 
-	    if ( verbose ) {
-
+	    if(verbose)
                 HDfprintf(stdout, "%d:%d: ", type, idx);
-	    }
 
             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(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 )
+                if(verbose)
                     HDfprintf(stdout, "1(i, %d, %d) ", type, tmp_idx);
 
                 insert_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
+            } /* end if */
 
             tmp_idx--;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 3 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                     (tmp_idx % 3) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "2(p, %d, %d) ", type, tmp_idx);
 
                 protect_entry(file_ptr, type, tmp_idx);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
+            } /* end if */
 
             tmp_idx--;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 3 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                    (tmp_idx % 3) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "3(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);
-            }
+            } /* end if */
 
             /* (don't decrement tmp_idx) */
-            if ( ( pass ) && ( do_moves ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 3 ) == 0 ) ) {
+            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(verbose)
+                    HDfprintf(stdout, "4(r, %d, %d, %d) ", type, tmp_idx, (int)move_to_main_addr);
 
                 move_entry(cache_ptr, type, tmp_idx, move_to_main_addr);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
+            } /* end if */
 
             tmp_idx--;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 5 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                    (tmp_idx % 5) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "5(p, %d, %d) ", type, tmp_idx);
 
                 protect_entry(file_ptr, type, tmp_idx);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
+            } /* end if */
 
             tmp_idx -= 2;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 5 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                    (tmp_idx % 5) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "6(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);
-            }
+            } /* end if */
 
-	    if ( do_mult_ro_protects )
-	    {
+	    if(do_mult_ro_protects) {
                 /* (don't decrement tmp_idx) */
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 9 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 9) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "7(p-ro, %d, %d) ", type, tmp_idx);
 
 		    protect_entry_ro(file_ptr, type, tmp_idx);
-
  		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-		}
+		} /* end if */
 
                 tmp_idx--;
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 11 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 11) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "8(p-ro, %d, %d) ", type, tmp_idx);
 
 		    protect_entry_ro(file_ptr, type, tmp_idx);
-
  		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-		}
+		} /* end if */
 
                 tmp_idx--;
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 13 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 13) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "9(p-ro, %d, %d) ", type, tmp_idx);
 
 		    protect_entry_ro(file_ptr, type, tmp_idx);
-
  		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-		}
+		} /* end if */
 
                 /* (don't decrement tmp_idx) */
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 9 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 9) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "10(u-ro, %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);
-		}
+		} /* end if */
 
                 tmp_idx--;
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 11 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 11) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "11(u-ro, %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);
-		}
+		} /* end if */
 
                 tmp_idx--;
-		if ( ( pass ) && ( tmp_idx >= 0 ) &&
-		     ( tmp_idx < local_max_index ) &&
-		     ( tmp_idx % 13 == 0 ) ) {
+		if(pass && (tmp_idx >= 0) && (tmp_idx < local_max_index) &&
+                        (tmp_idx % 13) == 0) {
 
-                    if ( verbose )
+                    if(verbose)
                         HDfprintf(stdout, "12(u-ro, %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);
-		}
+		} /* end if */
 	    } /* if ( do_mult_ro_protects ) */
 
-            if ( ( pass ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) {
-
-                if ( verbose )
+            if(pass && (idx >= 0) && (idx <= local_max_index)) {
+                if(verbose)
                     HDfprintf(stdout, "13(p, %d, %d) ", type, idx);
 
                 protect_entry(file_ptr, type, idx);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
+            } /* end if */
 
             tmp_idx = idx - lag + 2;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 7 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                    (tmp_idx % 7) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "14(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);
-            }
+            } /* end if */
 
             tmp_idx--;
-            if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                 ( tmp_idx <= local_max_index ) &&
-                 ( ( tmp_idx % 7 ) == 0 ) ) {
+            if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index) &&
+                    (tmp_idx % 7) == 0) {
 
-                if ( verbose )
+                if(verbose)
                     HDfprintf(stdout, "15(p, %d, %d) ", type, tmp_idx);
 
                 protect_entry(file_ptr, type, tmp_idx);
-
 		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
-            }
-
-
-            if ( do_destroys ) {
+            } /* end if */
 
+            if(do_destroys) {
                 tmp_idx = idx - lag;
-                if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                     ( tmp_idx <= local_max_index ) ) {
-
-                    switch ( tmp_idx %4 ) {
-
+                if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index)) {
+                    switch(tmp_idx % 4) {
                         case 0: /* we just did an insert */
-
-                            if ( verbose )
+                            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])[tmp_idx].is_dirty ) {
-
-                                if ( verbose )
+                            if((entries[type])[tmp_idx].is_dirty) {
+                                if(verbose)
                                     HDfprintf(stdout, "17(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);
-                            } else {
-
-                                if ( verbose )
+                            } /* end if */
+                            else {
+                                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));
-
+                                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);
-                            }
+                            } /* end else */
                             break;
 
                         case 2: /* we just did an insert */
-
-                            if ( verbose )
+                            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])[tmp_idx].is_dirty ) {
-
-                                if ( verbose )
+                            if((entries[type])[tmp_idx].is_dirty) {
+                                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 {
-
-                                if ( verbose )
+                            } /* end if */
+                            else {
+                                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);
-
+                                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);
-                            }
+                            } /* end else */
                             break;
 
                         default:
                             HDassert(0); /* this can't happen... */
                             break;
-                    }
-                }
-
-            } else {
-
+                    } /* end switch */
+                } /* end if */
+            } /* end if */
+            else {
                 tmp_idx = idx - lag;
-                if ( ( pass ) && ( tmp_idx >= 0 ) &&
-                     ( tmp_idx <= local_max_index ) ) {
-
-                    if ( verbose )
+                if(pass && (tmp_idx >= 0) && (tmp_idx <= local_max_index)) {
+                    if(verbose)
                         HDfprintf(stdout, "22(u, %d, %d) ", type, tmp_idx);
 
-                    unprotect_entry(file_ptr, type, tmp_idx,
-                            (dirty_unprotects ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET));
-
+                    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);
-                }
-            }
+                } /* end if */
+            } /* end elsef */
 
-            if ( verbose )
+            if(verbose)
                 HDfprintf(stdout, "\n");
 
             idx++;
-        }
-        type++;
-    }
+        } /* end while */
 
-    if ( ( pass ) && ( display_stats ) ) {
+        type++;
+    } /* end while */
 
+    if(pass && display_stats)
         H5C_stats(cache_ptr, "test cache", display_detailed_stats);
-    }
-
-    return;
 
 } /* row_major_scan_forward() */
 
@@ -5727,17 +5815,11 @@ create_flush_dependency(int32_t par_type,
         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() */
 
 

@@ -5829,9 +5911,6 @@ destroy_flush_dependency(int32_t par_type,
                 mark_flush_dep_clean(par_entry_ptr);
         } /* end if */
     } /* end if */
-
-    return;
-
 } /* destroy_flush_dependency() */
 
 

@@ -5843,7 +5922,7 @@ destroy_flush_dependency(int32_t par_type,
  *              becoming dirty or having its flush_dep_ndirty_children
  *              increased from 0.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      <none>
  *
  * Programmer:  Neil Fortner
  *              12/4/12
@@ -5853,21 +5932,19 @@ destroy_flush_dependency(int32_t par_type,
 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++) {
+        test_entry_t *par_base_addr;        /* Base entry of parent's entry array */
+        test_entry_t *par_entry_ptr;        /* Parent entry */
+        unsigned u;                         /* Local index variable */
+
+        for(u = 0; u < entry_ptr->flush_dep_npar; u++) {
             /* 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]]);
+            par_base_addr = entries[entry_ptr->flush_dep_par_type[u]];
+            par_entry_ptr = &(par_base_addr[entry_ptr->flush_dep_par_idx[u]]);
 
             /* Sanity check */
             HDassert(par_entry_ptr->flush_dep_ndirty_chd
@@ -5875,16 +5952,9 @@ mark_flush_dep_dirty(test_entry_t * entry_ptr)
 
             /* 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() */
+} /* end mark_flush_dep_dirty() */
 
 

 /*-------------------------------------------------------------------------
@@ -5895,7 +5965,7 @@ mark_flush_dep_dirty(test_entry_t * entry_ptr)
  *              becoming clean or having its flush_dep_ndirty_children
  *              reduced to 0.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      <none>
  *
  * Programmer:  Neil Fortner
  *              12/4/12
@@ -5905,36 +5975,29 @@ mark_flush_dep_dirty(test_entry_t * entry_ptr)
 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++) {
+        test_entry_t *par_base_addr;        /* Base entry of parent's entry array */
+        test_entry_t *par_entry_ptr;        /* Parent entry */
+        unsigned u;                         /* Local index variable */
+
+        for(u = 0; u < entry_ptr->flush_dep_npar; u++) {
             /* 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]]);
+            par_base_addr = entries[entry_ptr->flush_dep_par_type[u]];
+            par_entry_ptr = &(par_base_addr[entry_ptr->flush_dep_par_idx[u]]);
 
             /* 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() */
+} /* end mark_flush_dep_clean() */
 
 

 /*** H5AC level utility functions ***/
@@ -6113,7 +6176,7 @@ check_and_validate_cache_size(hid_t file_id,
     size_t min_clean_size;
     size_t expected_cur_size;
     size_t cur_size;
-    int32_t expected_cur_num_entries;
+    uint32_t expected_cur_num_entries;
     int cur_num_entries;
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
@@ -6210,7 +6273,7 @@ check_and_validate_cache_size(hid_t file_id,
 
 } /* check_and_validate_cache_size() */
 
-hbool_t
+H5_ATTR_PURE hbool_t
 resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
     const H5C_auto_size_ctl_t *b,
     hbool_t compare_init)
@@ -6419,7 +6482,7 @@ dump_LRU(H5F_t * file_ptr)
     entry_ptr = cache_ptr->LRU_head_ptr;
 
     HDfprintf(stdout, 
-              "\n\nIndex len/size/clean size/dirty size = %d/%lld/%lld/%lld\n",
+              "\n\nIndex len/size/clean size/dirty size = %u/%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));
diff --git a/test/cache_common.h b/test/cache_common.h
index 37b5883..8999e44 100644
--- a/test/cache_common.h
+++ b/test/cache_common.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  John Mainzer
@@ -211,6 +209,11 @@ typedef struct flush_op
                                          */
 } flush_op;
 
+typedef enum test_entry_action_t {
+    TEST_ENTRY_ACTION_NUL = 0,          /* No action on entry */
+    TEST_ENTRY_ACTION_MOVE              /* Entry is beging moved */
+} test_entry_action_t;
+
 typedef struct test_entry_t
 {
     H5C_cache_entry_t	  header;	/* entry data used by the cache
@@ -219,6 +222,7 @@ typedef struct test_entry_t
     struct test_entry_t * self; 	/* pointer to this entry -- used for
 					 * sanity checking.
                                          */
+    test_entry_action_t action;         /* Action being performed on a test entry */
     H5F_t               * file_ptr;     /* pointer to the file in which the
                                          * entry resides, or NULL if the entry
                                          * is not in a file.
@@ -343,20 +347,20 @@ typedef struct test_entry_t
     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 */
+    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 */
+    size_t		  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
@@ -378,7 +382,7 @@ if ( ( (cache_ptr) == NULL ) ||                              \
     HDfprintf(stdout, "Pre HT search SC failed.\n");         \
 }
 
-#define H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k) \
+#define H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k)  \
 if ( ( (cache_ptr) == NULL ) ||                                   \
      ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                \
      ( (cache_ptr)->index_len < 1 ) ||                            \
@@ -386,7 +390,6 @@ if ( ( (cache_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) ) &&              \
@@ -410,32 +413,29 @@ if ( ( (cache_ptr) == NULL ) ||                                        \
 #define H5C_TEST__SEARCH_INDEX(cache_ptr, Addr, entry_ptr)              \
 {                                                                       \
     int k;                                                              \
-    int depth = 0;                                                      \
     H5C_TEST__PRE_HT_SEARCH_SC(cache_ptr, Addr)                         \
     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 )                                                    \
+    while ( entry_ptr )                                                 \
     {                                                                   \
-        H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k)  \
-        if ( entry_ptr != ((cache_ptr)->index)[k] )                     \
+        if ( H5F_addr_eq(Addr, (entry_ptr)->addr) )                     \
         {                                                               \
-            if ( (entry_ptr)->ht_next )                                 \
+            H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k)    \
+            if ( entry_ptr != ((cache_ptr)->index)[k] )                 \
             {                                                           \
-                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;   \
+                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_TEST__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k) \
             }                                                           \
-            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_TEST__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k)   \
+            break;                                                      \
         }                                                               \
+        (entry_ptr) = (entry_ptr)->ht_next;                             \
     }                                                                   \
 }
 
@@ -551,11 +551,10 @@ H5TEST_DLLVAR const int32_t max_indices[NUMBER_OF_ENTRY_TYPES];
 H5TEST_DLLVAR const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES];
 H5TEST_DLLVAR const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES];
 H5TEST_DLLVAR const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES];
-H5TEST_DLLVAR const char * entry_type_names[NUMBER_OF_ENTRY_TYPES];
 
 /* callback table extern */
 
-H5TEST_DLLVAR const H5C_class_t types[NUMBER_OF_ENTRY_TYPES];
+H5TEST_DLLVAR const H5C_class_t *types[NUMBER_OF_ENTRY_TYPES];
 
 

 #ifdef __cplusplus
@@ -626,12 +625,15 @@ H5TEST_DLL void create_pinned_entry_dependency(H5F_t * file_ptr,
                             int pinned_type,
                             int pinned_idx);
 
+H5TEST_DLL herr_t create_entry_arrays(void);
+
+H5TEST_DLL void free_entry_arrays(void);
+
 H5TEST_DLL void reset_entries(void);
 
 H5TEST_DLL void cork_entry_type(H5F_t * file_ptr, int32_t type);
-H5TEST_DLL void uncork_entry_type(H5F_t * file_ptr, int32_t type);
-
 
+H5TEST_DLL void uncork_entry_type(H5F_t * file_ptr, int32_t type);
 
 H5TEST_DLL void resize_entry(H5F_t * file_ptr,
                   int32_t type,
@@ -639,7 +641,7 @@ H5TEST_DLL void resize_entry(H5F_t * file_ptr,
                   size_t new_size,
                   hbool_t in_cache);
 
-H5TEST_DLL H5F_t *setup_cache(size_t max_cache_size, size_t min_clean_size);
+H5TEST_DLL H5F_t *setup_cache(size_t max_cache_size, size_t min_clean_size, unsigned paged);
 
 H5TEST_DLL void row_major_scan_forward(H5F_t * file_ptr,
                             int32_t max_index,
@@ -745,7 +747,7 @@ H5TEST_DLL void unprotect_entry(H5F_t * file_ptr,
 H5TEST_DLL void verify_clean(void);
 
 H5TEST_DLL void verify_entry_status(H5C_t * cache_ptr,
-                int tag,
+		         int tag,
                          int num_entries,
                          struct expected_entry_status expected[]);
 
diff --git a/test/cache_image.c b/test/cache_image.c
new file mode 100644
index 0000000..58b0b8f
--- /dev/null
+++ b/test/cache_image.c
@@ -0,0 +1,8081 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  John Mainzer
+ *              7/13/15
+ *
+ *              This file contains tests specific to the cache image 
+ *		feature implemented in H5C.c
+ */
+#include "cache_common.h"
+#include "genall5.h"
+
+/* global variable declarations: */
+
+
+const char *FILENAMES[] = {
+        "cache_image_test",
+        NULL
+};
+
+/* local utility function declarations */
+static void create_datasets(hid_t file_id, int min_dset, int max_dset);
+static void delete_datasets(hid_t file_id, int min_dset, int max_dset);
+static void open_hdf5_file(hbool_t create_file, hbool_t mdci_sbem_expected,
+    hbool_t read_only, hbool_t set_mdci_fapl, hbool_t config_fsm,
+    hbool_t set_eoc, const char *hdf_file_name, unsigned cache_image_flags, 
+    hid_t *file_id_ptr, H5F_t **file_ptr_ptr, H5C_t **cache_ptr_ptr);
+static void attempt_swmr_open_hdf5_file(hbool_t create_file,
+    hbool_t set_mdci_fapl, const char *hdf_file_name);
+static void verify_datasets(hid_t file_id, int min_dset, int max_dset);
+
+/* local test function declarations */
+static unsigned check_cache_image_ctl_flow_1(void);
+static unsigned check_cache_image_ctl_flow_2(void);
+static unsigned check_cache_image_ctl_flow_3(void);
+static unsigned check_cache_image_ctl_flow_4(void);
+static unsigned check_cache_image_ctl_flow_5(void);
+static unsigned check_cache_image_ctl_flow_6(void);
+
+static unsigned cache_image_smoke_check_1(void);
+static unsigned cache_image_smoke_check_2(void);
+static unsigned cache_image_smoke_check_3(void);
+static unsigned cache_image_smoke_check_4(void);
+static unsigned cache_image_smoke_check_5(void);
+static unsigned cache_image_smoke_check_6(void);
+
+static unsigned cache_image_api_error_check_1(void);
+static unsigned cache_image_api_error_check_2(void);
+static unsigned cache_image_api_error_check_3(void);
+static unsigned cache_image_api_error_check_4(void);
+
+static unsigned get_free_sections_test(void);
+static unsigned evict_on_close_test(void);
+
+

+/****************************************************************************/
+/***************************** Utility Functions ****************************/
+/****************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    create_datasets()
+ *
+ * Purpose:     If pass is TRUE on entry, create the specified datasets
+ *		in the indicated file.
+ *
+ *		Datasets and their contents must be well known, as we 
+ *		will verify that they contain the expected data later.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define CHUNK_SIZE              10
+#define DSET_SIZE               (40 * CHUNK_SIZE)
+#define MAX_NUM_DSETS           256
+
+static void 
+create_datasets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "create_datasets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l, m;
+    int data_chunk[CHUNK_SIZE][CHUNK_SIZE];
+    herr_t status;
+    hid_t dataspace_id = -1;
+    hid_t filespace_ids[MAX_NUM_DSETS];
+    hid_t memspace_id = -1;
+    hid_t dataset_ids[MAX_NUM_DSETS];
+    hid_t properties = -1;
+    hsize_t dims[2];
+    hsize_t a_size[2];
+    hsize_t offset[2];
+    hsize_t chunk_size[2];
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    /* create the datasets */
+
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            /* create a dataspace for the chunked dataset */
+            dims[0] = DSET_SIZE;
+            dims[1] = DSET_SIZE;
+            dataspace_id = H5Screate_simple(2, dims, NULL);
+
+            if ( dataspace_id < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Screate_simple() failed.";
+            }
+
+            /* set the dataset creation plist to specify that the raw data is
+             * to be partioned into 10X10 element chunks.
+             */
+
+            if ( pass ) {
+
+                chunk_size[0] = CHUNK_SIZE;
+                chunk_size[1] = CHUNK_SIZE;
+                properties = H5Pcreate(H5P_DATASET_CREATE);
+
+                if ( properties < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Pcreate() failed.";
+                }
+            }
+
+            if ( pass ) {
+
+                if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Pset_chunk() failed.";
+                }
+            }
+
+            /* create the dataset */
+            if ( pass ) {
+
+                sprintf(dset_name, "/dset%03d", i);
+                dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE,
+                                            dataspace_id, H5P_DEFAULT,
+                                            properties, H5P_DEFAULT);
+
+                if ( dataset_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dcreate() failed.";
+                }
+            }
+
+            /* get the file space ID */
+            if ( pass ) {
+
+                filespace_ids[i] = H5Dget_space(dataset_ids[i]);
+
+                if ( filespace_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dget_space() failed.";
+                }
+            }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* create the mem space to be used to read and write chunks */
+    if ( pass ) {
+
+        dims[0] = CHUNK_SIZE;
+        dims[1] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(2, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;  /*offset of hyperslab in memory*/
+        offset[1] = 0;
+        a_size[0] = CHUNK_SIZE;  /*size of hyperslab*/
+        a_size[1] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* initialize all datasets on a round robin basis */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+                /* initialize the slab */
+                for ( k = 0; k < CHUNK_SIZE; k++ )
+                {
+                    for ( l = 0; l < CHUNK_SIZE; l++ )
+                    {
+                        data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) +
+                                           (DSET_SIZE * (i + k)) + j + l;
+                    }
+                }
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "disk H5Sselect_hyperslab() failed.";
+                }
+
+                /* write the chunk to file */
+                status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id,
+                                  filespace_ids[m], H5P_DEFAULT, data_chunk);
+
+                if ( status < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dwrite() failed.";
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* read data from datasets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "disk hyperslab create failed.";
+                }
+
+                /* read the chunk from file */
+                if ( pass ) {
+
+                    status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, 
+                                     memspace_id, filespace_ids[m], 
+                                     H5P_DEFAULT, data_chunk);
+
+                    if ( status < 0 ) {
+
+                       pass = FALSE;
+                       failure_mssg = "disk hyperslab create failed.";
+                    }
+                }
+
+                /* validate the slab */
+                if ( pass ) {
+
+                    valid_chunk = TRUE;
+                    for ( k = 0; k < CHUNK_SIZE; k++ )
+                    {
+                        for ( l = 0; l < CHUNK_SIZE; l++ )
+                        {
+                            if ( data_chunk[k][l]
+                                 !=
+                                 ((DSET_SIZE * DSET_SIZE * m) +
+                                  (DSET_SIZE * (i + k)) + j + l) ) {
+
+                                valid_chunk = FALSE;
+
+				if ( verbose ) {
+
+                                    HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[k][l],
+                                    ((DSET_SIZE * DSET_SIZE * m) +
+                                     (DSET_SIZE * (i + k)) + j + l));
+                                    HDfprintf(stdout,
+                                    "m = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                    m, i, j, k, l);
+				}
+                            }
+                        }
+                    }
+
+                    if ( ! valid_chunk ) {
+
+                        pass = FALSE;
+                        failure_mssg = "slab validation failed.";
+
+			if ( verbose ) {
+
+                            fprintf(stdout, 
+                                  "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                  i, j, m);
+			}
+                    }
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* close the file spaces */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Sclose(filespace_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose() failed.";
+        }
+        i++;
+    }
+
+
+    /* close the datasets */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Dclose(dataset_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dclose() failed.";
+        }
+        i++;
+    }
+
+    /* close the mem space */
+    if ( pass ) {
+
+        if ( H5Sclose(memspace_id) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose(memspace_id) failed.";
+        }
+    }
+
+    return;
+
+} /* create_datasets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    delete_datasets()
+ *
+ * Purpose:     If pass is TRUE on entry, verify and then delete the 
+ *		dataset(s) indicated by min_dset and max_dset in the 
+ *		indicated file.
+ *
+ *		Datasets and their contents must be well know, as we 
+ *		will verify that they contain the expected data later.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              10/31/16
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void 
+delete_datasets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "delete_datasets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    int cp = 0;
+    int i;
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* first, verify the contents of the target dataset(s) */
+    verify_datasets(file_id, min_dset, max_dset);
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* now delete the target datasets */
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            sprintf(dset_name, "/dset%03d", i);
+
+	    if ( H5Ldelete(file_id, dset_name, H5P_DEFAULT) < 0) {
+
+                pass = FALSE;
+                failure_mssg = "H5Ldelete() failed.";
+	    }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    return;
+
+} /* delete_datasets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_hdf5_file()
+ *
+ * Purpose:     If pass is true on entry, create or open the specified HDF5 
+ *		and test to see if it has a metadata cache image superblock 
+ *		extension message.  
+ *
+ *		Set pass to FALSE and issue a suitable failure 
+ *		message if either the file contains a metadata cache image
+ *		superblock extension and mdci_sbem_expected is TRUE, or 
+ *		vise versa.
+ *
+ *		If mdci_sbem_expected is TRUE, also verify that the metadata 
+ *		cache has been advised of this.
+ *
+ *		If read_only is TRUE, open the file read only.  Otherwise
+ *		open the file read/write.
+ *
+ *		If set_mdci_fapl is TRUE, set the metadata cache image 
+ *		FAPL entry when opening the file, and verify that the 
+ *		metadata cache is notified.
+ *
+ *		If config_fsm is TRUE, setup the persistant free space 
+ *		manager.  Note that this flag may only be set if 
+ *		create_file is also TRUE.
+ *
+ *              Return pointers to the cache data structure and file data
+ *              structures.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+open_hdf5_file(hbool_t create_file, hbool_t mdci_sbem_expected,
+    hbool_t read_only, hbool_t set_mdci_fapl, hbool_t config_fsm,
+    hbool_t set_eoc, const char *hdf_file_name, unsigned cache_image_flags,
+    hid_t *file_id_ptr, H5F_t ** file_ptr_ptr, H5C_t ** cache_ptr_ptr)
+{
+    const char * fcn_name = "open_hdf5_file()";
+    hbool_t show_progress = FALSE;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    hid_t fapl_id = -1;
+    hid_t fcpl_id = -1;
+    hid_t file_id = -1;
+    herr_t result;
+    H5F_t * file_ptr = NULL;
+    H5C_t * cache_ptr = NULL;
+    H5C_cache_image_ctl_t image_ctl;
+    H5AC_cache_image_config_t cache_image_config = {
+        H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+        TRUE,
+        FALSE,
+        H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE};
+
+    if ( pass )
+    {
+	/* opening the file both read only and with a cache image 
+         * requested is a contradiction.  We resolve it by ignoring 
+         * the cache image request silently.
+         */
+        if ( ( create_file && mdci_sbem_expected ) ||
+             ( create_file && read_only ) ||
+             ( config_fsm && !create_file ) ||
+             ( hdf_file_name == NULL ) ||
+             ( ( set_mdci_fapl ) && ( cache_image_flags == 0 ) ) ||
+             ( ( set_mdci_fapl ) &&
+               ( (cache_image_flags & ~H5C_CI__ALL_FLAGS) != 0 ) ) ||
+             ( file_id_ptr == NULL ) ||
+             ( file_ptr_ptr == NULL ) ||
+             ( cache_ptr_ptr == NULL ) ) {
+
+            failure_mssg =
+               "Bad param(s) on entry to open_hdf5_file().\n";
+            pass = FALSE;
+        } else  if ( verbose ) {
+
+            HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
+                      fcn_name, hdf_file_name);
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* create a file access propertly list. */
+    if ( pass ) {
+
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+
+        if ( fapl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* call H5Pset_libver_bounds() on the fapl_id */
+    if ( pass ) {
+
+        if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, 
+                                  H5F_LIBVER_LATEST) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_libver_bounds() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* get metadata cache image config -- verify that it is the default */
+    if ( pass ) {
+
+        result = H5Pget_mdc_image_config(fapl_id, &cache_image_config);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pget_mdc_image_config() failed.\n";
+        }
+
+        if ( ( cache_image_config.version !=
+               H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+             ( cache_image_config.generate_image != FALSE ) ||
+             ( cache_image_config.save_resize_status != FALSE ) ||
+             ( cache_image_config.entry_ageout != 
+               H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected default cache image config.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* set metadata cache image fapl entry if indicated */
+    if ( ( pass ) && ( set_mdci_fapl ) ) {
+
+        /* set cache image config fields to taste */
+        cache_image_config.generate_image = TRUE;
+        cache_image_config.save_resize_status = FALSE;
+        cache_image_config.entry_ageout = H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE;
+
+        result = H5Pset_mdc_image_config(fapl_id, &cache_image_config);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_mdc_image_config() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* setup the persistant free space manager if indicated */
+    if ( ( pass ) && ( config_fsm ) ) {
+
+	fcpl_id = H5Pcreate(H5P_FILE_CREATE);
+
+	if ( fcpl_id <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "H5Pcreate(H5P_FILE_CREATE) failed.";
+	}
+    }
+
+    if ( ( pass ) && ( config_fsm ) ) {
+        if(H5Pset_file_space_strategy(fcpl_id, H5F_FSPACE_STRATEGY_PAGE, 
+                                      TRUE, (hsize_t)1) < 0) {
+            pass = FALSE;
+            failure_mssg = "H5Pset_file_space_strategy() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* set evict on close if indicated */
+    if ( ( pass ) && ( set_eoc ) ) {
+
+        if ( H5Pset_evict_on_close(fapl_id, TRUE) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_evict_on_close() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* open the file */
+    if ( pass ) {
+
+        if ( create_file ) {
+
+	    if ( fcpl_id != -1 )
+
+                file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, 
+                                    fcpl_id, fapl_id);
+	    else
+
+		file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, 
+                                    H5P_DEFAULT, fapl_id);
+
+        } else {
+
+            if ( read_only )
+
+                file_id = H5Fopen(hdf_file_name, H5F_ACC_RDONLY, fapl_id);
+
+            else
+
+                file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id);
+        }
+
+        if ( file_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fcreate() or H5Fopen() failed.\n";
+
+        } else {
+
+            file_ptr = (struct H5F_t *)H5I_object_verify(file_id, H5I_FILE);
+
+            if ( file_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "Can't get file_ptr.";
+
+                if ( verbose ) {
+                    HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name);
+                }
+            }
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* get a pointer to the files internal data structure and then
+     * to the cache structure
+     */
+    if ( pass ) {
+
+        if ( file_ptr->shared->cache == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "can't get cache pointer(1).\n";
+
+        } else {
+
+            cache_ptr = file_ptr->shared->cache;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* verify expected metadata cache status */
+
+    /* get the cache image control structure from the cache, and verify
+     * that it contains the expected values.
+     *
+     * Then set the flags in this structure to the specified value.
+     */
+    if ( pass ) {
+
+        if ( H5C_get_cache_image_config(cache_ptr, &image_ctl) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "error returned by H5C_get_cache_image_config().";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    if ( pass ) {
+
+        if ( set_mdci_fapl ) {
+
+	    if ( read_only ) {
+
+                if ( ( image_ctl.version != 
+                       H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                     ( image_ctl.generate_image != FALSE ) ||
+                     ( image_ctl.save_resize_status != FALSE ) ||
+                     ( image_ctl.entry_ageout != 
+                       H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                     ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "Unexpected image_ctl values(1).\n";
+                }
+	    } else {
+
+                if ( ( image_ctl.version != 
+                       H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                     ( image_ctl.generate_image != TRUE ) ||
+                     ( image_ctl.save_resize_status != FALSE ) ||
+                     ( image_ctl.entry_ageout != 
+                       H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                     ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "Unexpected image_ctl values(2).\n";
+                }
+            }
+        } else {
+
+            if ( ( image_ctl.version != 
+                   H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                 ( image_ctl.generate_image != FALSE ) ||
+                 ( image_ctl.save_resize_status != FALSE ) ||
+                 ( image_ctl.entry_ageout != 
+                   H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                 ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                pass = FALSE;
+                failure_mssg = "Unexpected image_ctl values(3).\n";
+            }
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    if ( ( pass ) && ( set_mdci_fapl ) ) {
+
+        image_ctl.flags = cache_image_flags;
+
+        if ( H5C_set_cache_image_config(file_ptr, cache_ptr, &image_ctl) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "error returned by H5C_set_cache_image_config().";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    if ( pass ) {
+
+        if ( cache_ptr->close_warning_received == TRUE ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected value of close_warning_received.\n";
+        }
+
+        if ( mdci_sbem_expected ) {
+
+            if ( read_only ) {
+
+                if ( ( cache_ptr->load_image != TRUE ) ||
+                     ( cache_ptr->delete_image != FALSE ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "mdci sb extension message not present?\n";
+                }
+            } else {
+
+                if ( ( cache_ptr->load_image != TRUE ) ||
+                     ( cache_ptr->delete_image != TRUE ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "mdci sb extension message not present?\n";
+                }
+	    }
+        } else {
+
+	    if ( ( cache_ptr->load_image == TRUE ) ||
+                 ( cache_ptr->delete_image == TRUE ) ) {
+
+                pass = FALSE;
+                failure_mssg = "mdci sb extension message present?\n";
+	    }
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    if ( pass ) {
+
+        *file_id_ptr = file_id;
+        *file_ptr_ptr = file_ptr;
+        *cache_ptr_ptr = cache_ptr;
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++);
+
+    return;
+
+} /* open_hdf5_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    attempt_swmr_open_hdf5_file()
+ *
+ * Purpose:     If pass is true on entry, attempt to create or open the 
+ *		specified HDF5 file with SWMR, and also with cache image 
+ *              creation if requested.
+ *
+ *              In all cases, the attempted open or create should fail.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+attempt_swmr_open_hdf5_file(const hbool_t create_file,
+	                    const hbool_t set_mdci_fapl,
+	                    const char * hdf_file_name)
+{
+    const char * fcn_name = "attempt_swmr_open_hdf5_file()";
+    hbool_t show_progress = FALSE;
+    int cp = 0;
+    hid_t fapl_id = -1;
+    hid_t file_id = -1;
+    herr_t result;
+    H5AC_cache_image_config_t cache_image_config = {
+        H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+        TRUE,
+        FALSE,
+        H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE};
+
+    /* create a file access propertly list. */
+    if ( pass ) {
+
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+
+        if ( fapl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* call H5Pset_libver_bounds() on the fapl_id */
+    if ( pass ) {
+
+        if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) 
+                < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_libver_bounds() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* set metadata cache image fapl entry if indicated */
+    if ( ( pass ) && ( set_mdci_fapl ) ) {
+
+        /* set cache image config fields to taste */
+        cache_image_config.generate_image = TRUE;
+        cache_image_config.save_resize_status = FALSE;
+        cache_image_config.entry_ageout = H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE;
+
+        result = H5Pset_mdc_image_config(fapl_id, &cache_image_config);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_mdc_image_config() failed.\n";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* open the file */
+    if ( pass ) {
+
+        if ( create_file ) {
+
+            H5E_BEGIN_TRY {
+                file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC | H5F_ACC_SWMR_WRITE, 
+			            H5P_DEFAULT, fapl_id);
+            } H5E_END_TRY;
+        } else {
+
+            H5E_BEGIN_TRY {
+                file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl_id);
+            } H5E_END_TRY;
+        }
+
+        if ( file_id >= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "SWMR H5Fcreate() or H5Fopen() succeeded.\n";
+
+        } 
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    return;
+
+} /* attempt_swmr_open_hdf5_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_datasets()
+ *
+ * Purpose:     If pass is TRUE on entry, verify that the datasets in the 
+ *		file exist and contain the expected data.  
+ *
+ *		Note that these datasets were created by 
+ *		create_datasets() above.  Thus any changes in that 
+ *		function must be reflected in this function, and 
+ *		vise-versa.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void 
+verify_datasets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "verify_datasets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l, m;
+    int data_chunk[CHUNK_SIZE][CHUNK_SIZE];
+    herr_t status;
+    hid_t filespace_ids[MAX_NUM_DSETS];
+    hid_t memspace_id = -1;
+    hid_t dataset_ids[MAX_NUM_DSETS];
+    hsize_t dims[2];
+    hsize_t a_size[2];
+    hsize_t offset[2];
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    /* open the datasets */
+
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            /* open the dataset */
+            if ( pass ) {
+
+                sprintf(dset_name, "/dset%03d", i);
+                dataset_ids[i] = H5Dopen2(file_id, dset_name, H5P_DEFAULT);
+
+                if ( dataset_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dopen2() failed.";
+                }
+            }
+
+            /* get the file space ID */
+            if ( pass ) {
+
+                filespace_ids[i] = H5Dget_space(dataset_ids[i]);
+
+                if ( filespace_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dget_space() failed.";
+                }
+            }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* create the mem space to be used to read and write chunks */
+    if ( pass ) {
+
+        dims[0] = CHUNK_SIZE;
+        dims[1] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(2, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;  /*offset of hyperslab in memory*/
+        offset[1] = 0;
+        a_size[0] = CHUNK_SIZE;  /*size of hyperslab*/
+        a_size[1] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+
+    /* read data from datasets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "disk hyperslab create failed.";
+                }
+
+                /* read the chunk from file */
+                if ( pass ) {
+
+                    status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, 
+                                     memspace_id, filespace_ids[m], 
+                                     H5P_DEFAULT, data_chunk);
+
+                    if ( status < 0 ) {
+
+                       pass = FALSE;
+                       failure_mssg = "disk hyperslab create failed.";
+                    }
+                }
+
+                /* validate the slab */
+                if ( pass ) {
+
+                    valid_chunk = TRUE;
+                    for ( k = 0; k < CHUNK_SIZE; k++ )
+                    {
+                        for ( l = 0; l < CHUNK_SIZE; l++ )
+                        {
+                            if ( data_chunk[k][l]
+                                 !=
+                                 ((DSET_SIZE * DSET_SIZE * m) +
+                                  (DSET_SIZE * (i + k)) + j + l) ) {
+
+                                valid_chunk = FALSE;
+
+				if ( verbose ) {
+				
+                                    HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[k][l],
+                                    ((DSET_SIZE * DSET_SIZE * m) +
+                                     (DSET_SIZE * (i + k)) + j + l));
+                                    HDfprintf(stdout,
+                                     "m = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                     m, i, j, k, l);
+				}
+                            }
+                        }
+                    }
+
+                    if ( ! valid_chunk ) {
+
+                        pass = FALSE;
+                        failure_mssg = "slab validation failed.";
+
+			if ( verbose ) {
+
+                            fprintf(stdout, 
+                                  "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                  i, j, m);
+			}
+                    }
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* close the file spaces */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Sclose(filespace_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose() failed.";
+        }
+        i++;
+    }
+
+
+    /* close the datasets */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Dclose(dataset_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dclose() failed.";
+        }
+        i++;
+    }
+
+    /* close the mem space */
+    if ( pass ) {
+
+        if ( H5Sclose(memspace_id) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose(memspace_id) failed.";
+        }
+    }
+
+    return;
+
+} /* verify_datasets() */
+
+

+/****************************************************************************/
+/******************************* Test Functions *****************************/
+/****************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_1()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		This test is an initial smoke check, so the sequence of 
+ *		operations is relatively simple.  In particular, we are 
+ *		testing:
+ *
+ *			i) Creation of file with cache image FAPL entry set
+ *			   and insertion of metadata cache image superblock
+ *			   message on file close.
+ *
+ *		       ii) Open of file with metadata cache image superblock
+ *			   message, transmission of message to metadata cache,
+ *			   and deletion of superblock message prior to close.
+ *
+ *		Note that in all cases we are performing operations on the 
+ *		file.  While this is the typical case, we must repeat this 
+ *		test without operations on the file.
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file.  
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		5) Open a dataset.
+ *
+ *		   Verify that the metadata cache image superblock 
+ *		   extension message has been deleted.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *		8) Close the file.
+ *
+ *		9) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_1(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_1()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 1");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image super block 
+     *	  extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file.  
+     *
+     *    Verify that the metadata cache is instructed to load the 
+     *    metadata cache image, and that the supplied address and length 
+     *    are HADDR_UNDEF and zero respectively.  Note that these values 
+     *    indicate that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( pass ) {
+
+        /* think on how to verify that the superblock extension has been
+         * deleted, and if it is necessary to verify this directly.
+         */
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 8) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 9) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_2()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		This test is an initial smoke check, so the sequence of 
+ *		operations is relatively simple.  In particular, we are 
+ *		testing:
+ *
+ *			i) Creation of file with cache image FAPL entry set
+ *			   and insertion of metadata cache image superblock
+ *			   message on file close.
+ *
+ *		       ii) Open of file with metadata cache image superblock
+ *			   message, transmission of message to metadata cache,
+ *			   and deletion of superblock message prior to close.
+ *
+ *		Note that unlike the previous test, no operations are performed
+ *		on the file.  As a result of this, the metadata cache image 
+ *		message is not processed until the metadata cache receives
+ *		the file close warning.  (Under normal circumstances, it is 
+ *		processed as part of the first protect operation after the 
+ *		superblock is loaded.)
+ *
+ *		In this particular test, we preform the following operations:
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		2) Close the file.
+ *
+ *		3) Open the file.  
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *		8) Close the file.
+ *
+ *		9) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_2(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_2()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 2");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image super block 
+     *	  extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Open the file.  
+     *
+     *    Verify that the metadata cache is instructed to load the 
+     *    metadata cache image, and that the supplied address and length 
+     *    are HADDR_UNDEF and zero respectively.  Note that these values 
+     *    indicate that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 7) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_3()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		The objectives of this test are to:
+ *
+ *			i) Test operation of the metadata cache image FAPL 
+ *			   entry set on open of an existing file.  This 
+ *			   should result in the insertion of a metadata 
+ *			   cache image superblock message on file close.
+ *
+ *		       ii) Test operation of the metadata cache image super
+ *			   block extension message when it appears in a file
+ *			   that is opened READ ONLY.
+ *
+ *		Note that in all cases we are performing operations on the 
+ *		file between file open and close.  While this is the 
+ *		typical case, we must repeat this test without operations 
+ *		on the file.
+ *
+ *		1) Create a HDF5 file WITHOUT the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is NOT informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		2) Close the file.
+ *
+ *		3) Open the file WITH the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		4) Create some datasets.
+ *
+ *		5) Close the file.
+ *
+ *		6) Open the file READ ONLY.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		7) Verify the contents of the datasets.
+ *
+ *		8) Close the file.
+ *
+ *		9) Open the file READ/WRITE.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *	       10) Verify the contents of the datasets.
+ *
+ *	       11) Close the file.
+ *
+ *	       12) Open the file
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       13) Close the file.
+ *
+ *	       14) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/16/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_3(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_3()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 3");
+
+    pass = TRUE;
+
+    if ( show_progress ) /* 0 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 1 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+    /* 1) Create a HDF5 file WITHOUT the cache image FAPL entry.  
+     *
+     *    Verify that the cache is NOT informed of the cache image 
+     *    FAPL entry.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 2 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 3 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Open the file WITH the cache image FAPL entry.  
+     *
+     *    Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image super block 
+     *    extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 4 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 4) Create some datasets. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 5 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 6 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Open the file READ ONLY.
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 7 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 7) Verify the contents of the datasets. */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 8 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 8) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 9 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 9) Open the file READ/WRITE.
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 10 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 10) Verify the contents of the datasets. */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 11 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 11) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 12 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 12) Open the file
+     *
+     *	   Verify that the file doesn't contain a metadata cache
+     *	   image superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 13 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 13) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 14 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 14) Delete the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_4()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		The objectives of this test are to:
+ *
+ *			i) Test operation of the metadata cache image FAPL 
+ *			   entry set on open of an existing file.  This 
+ *			   should result in the insertion of a metadata 
+ *			   cache image superblock message on file close.
+ *
+ *		       ii) Test operation of the metadata cache image super
+ *			   block extension message when it appears in a file
+ *			   that is opened READ ONLY.
+ *
+ *		In this test we avoid all file access beyond file open 
+ *		and close.
+ *
+ *		1) Create a HDF5 file WITHOUT the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is NOT informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		2) Close the file.
+ *
+ *		3) Open the file WITH the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		4) Close the file.
+ *
+ *		5) Open the file READ ONLY.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file READ/WRITE.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *	        8) Close the file.
+ *
+ *	        9) Open the file
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       10) Close the file.
+ *
+ *	       11) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/16/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_4(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_4()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 4");
+
+    pass = TRUE;
+
+    if ( show_progress ) /* 0 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 1 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+    /* 1) Create a HDF5 file WITHOUT the cache image FAPL entry.  
+     *
+     *    Verify that the cache is NOT informed of the cache image 
+     *    FAPL entry.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 2 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 3 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Open the file WITH the cache image FAPL entry.  
+     *
+     *    Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image super block 
+     *    extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 4 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 4) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 5 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 5) Open the file READ ONLY.
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 6 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 7 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 7) Open the file READ/WRITE.
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 8 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 8) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 9 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 9) Open the file
+     *
+     *	   Verify that the file doesn't contain a metadata cache
+     *	   image superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 10 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 10) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 11 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 11) Delete the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_4() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_5()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		The objective of this test is verify correct control flow
+ *		when a file with a metadata cache image superblock extension
+ *		message is opened with the metadata cache image FAPL entry.
+ *
+ *		Note that in all cases we are performing operations on the 
+ *		file between file open and close.  While this is the 
+ *		typical case, we must repeat this test without operations 
+ *		on the file.
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		2) Create some datasets.
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file WITH the cache image FAPL entry.  
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		5) Verify the contents of the datasets.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *	        8) Verify the contents of the datasets.
+ *
+ *	        9) Close the file.
+ *
+ *	       10) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/17/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_5(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_5()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 5");
+
+    pass = TRUE;
+
+    if ( show_progress ) /* 0 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 1 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 1) Create a HDF5 file with the cache image FAPL entry.  
+     *
+     *    Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image 
+     *    super block extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 2 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 2) Create some datasets. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 3 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 4 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 4) Open the file WITH the cache image FAPL entry.  
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     *
+     *    Verify that the cache is informed of the cache image 
+     *    FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image 
+     *    super block extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 5 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* 5) Verify the contents of the datasets. */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 6 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 7 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 7) Open the file. 
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 8 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* 8) Verify the contents of the datasets. */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) /* 9 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 10 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 10) Delete the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_5() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_cache_image_ctl_flow_6()
+ *
+ * Purpose:     This test is one of a sequence of control flow tests intended
+ *		to verify that control flow for the cache image feature works
+ *		as expected.  
+ *
+ *		The objective of this test is verify correct control flow
+ *		when a file with a metadata cache image superblock extension
+ *		message is opened with the metadata cache image FAPL entry.
+ *
+ *		In this test we avoid all file activity other than open
+ *		and close.
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		2) Close the file.
+ *
+ *		3) Open the file WITH the cache image FAPL entry.  
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set flags forcing creation of metadata cache image 
+ *		   super block extension message only.
+ *
+ *		4) Close the file.
+ *
+ *		5) Open the file.
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image, and that the 
+ *		   supplied address and length are HADDR_UNDEF and 
+ *		   zero respectively.  Note that these values indicate
+ *		   that the metadata image block doesn't exist.
+ *
+ *	        6) Close the file.
+ *
+ *	        7) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/17/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_cache_image_ctl_flow_6(void)
+{
+    const char * fcn_name = "check_cache_image_ctl_flow_6()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image control flow test 6");
+
+    pass = TRUE;
+
+    if ( show_progress ) /* 0 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 1 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 1) Create a HDF5 file with the cache image FAPL entry.  
+     *
+     *    Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image 
+     *    super block extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 2 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 2) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 3 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 4) Open the file WITH the cache image FAPL entry.  
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     *
+     *    Verify that the cache is informed of the cache image 
+     *    FAPL entry.
+     *
+     *    Set flags forcing creation of metadata cache image 
+     *    super block extension message only.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__GEN_MDCI_SBE_MESG,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 4 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 5) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 5 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 5) Open the file. 
+     *
+     *    Verify that the metadata cache is instructed
+     *    to load the metadata cache image, and that the 
+     *    supplied address and length are HADDR_UNDEF and 
+     *    zero respectively.  Note that these values indicate
+     *    that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) /* 6 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) /* 7 */
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 7) Delete the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* check_cache_image_ctl_flow_6() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_1()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to exercise the cache image feature verifying that it 
+ *		works more or less correctly in common cases.
+ *
+ *		This test is an initial smoke check, so the sequence of 
+ *		operations is relatively simple.  In particular, we are 
+ *		testing:
+ *
+ *			i) Creation of file with metadata cache image 
+ *			   superblock extension message and cache image 
+ *			   block.
+ *
+ *		       ii) Open of file with metadata cache image superblock
+ *			   extension message and cache image block.  
+ *			   Deserialization and removal of both, insertion
+ *			   of prefetched cache entries, and deserialization 
+ *			   of prefetched cache entries as they are protected.
+ *
+ *		      iii) Subsequent write of file without metadata cache 
+ *			   image.
+ *
+ *		       iv) Open and close of file with metadata cache image
+ *			   image requested, but with no operations on the 
+ *			   file.
+ *
+ *		To do this:
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file.  
+ *
+ *		   Verify that the metadata cache is instructed
+ *		   to load the metadata cache image.
+ *
+ *		5) Open a dataset.
+ *
+ *		   Verify that it contains the expected data
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *		8) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		9) Close the file.
+ *
+ * 	       10) Open the file with the cache image FAPL entry.
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *	       11) Close the file.  Since there has been no access to 
+ *		   any entries that would be included in the cache image,
+ *		   there should be no cache image.
+ *
+ *	       12) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       13) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *	       14) Close the file.
+ *
+ *	       15) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              8/17/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_smoke_check_1(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_1()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image smoke check 1");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file.  
+     *
+     *    Verify that the metadata cache is instructed to load the 
+     *    metadata cache image, and that the supplied address and length 
+     *    are HADDR_UNDEF and zero respectively.  Note that these values 
+     *    indicate that the metadata image block doesn't exist.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 10) Open the file with the cache image FAPL entry.
+     *
+     *	   Verify that the cache is informed of the cache image 
+     *	   FAPL entry.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 11) Close the file.  Since there has been no access to 
+     *	   any entries that would be included in the cache image,
+     *	   there should be no cache image.
+     */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 12) Open the file.
+     *
+     *	   Verify that the file doesn't contain a metadata cache
+     *	   image superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 13) Open a dataset.
+     *
+     *	   Verify that it contains the expected data.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(3).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 14) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 15) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_2()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to exercise the cache image feature verifying that it 
+ *		works more or less correctly in common cases.
+ *
+ *		This test is an initial smoke check, so the sequence of 
+ *		operations is relatively simple.  In particular, we are 
+ *		testing:
+ *
+ *			i) Creation of file with metadata cache image 
+ *			   superblock extension message and cache image 
+ *			   block.
+ *
+ *		       ii) Open of file with metadata cache image superblock
+ *			   extension message and cache image block.  Write
+ *			   of prefetched entries to file on file close.
+ *
+ *		To do this:
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file.  
+ *
+ *		5) Close the file.
+ *
+ *		6) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *		7) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		8) Close the file.
+ *
+ *	        9) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              8/18/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_smoke_check_2(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_2()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image smoke check 2");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file.  
+     *
+     *    Verify that the metadata cache is instructed to load the 
+     *    metadata cache image.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    /* can't verify that metadata cache image has been loaded directly,
+     * as in this cache, the load will not happen until close, and thus 
+     * the images_created stat will not be readily available as it is 
+     * incremented just before the cache is shut down.
+     */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 6) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 8) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 9) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_3()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to exercise the cache image feature verifying that it 
+ *		works more or less correctly in common cases.
+ *
+ *		This test is an initial smoke check, so the sequence of 
+ *		operations is relatively simple.  In particular, we are 
+ *		testing:
+ *
+ *			i) Creation of file with metadata cache image 
+ *			   superblock extension message and cache image 
+ *			   block.
+ *
+ *		       ii) Read only open and close of file with metadata 
+ *			   cache image superblock extension message and 
+ *			   cache image block.
+ *
+ *		      iii) Subsequent R/W open and close of file with metadata 
+ *                         cache image superblock extension message and 
+ *                         cache image block.
+ *
+ *		To do this:
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file read only.  
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *		5 Open a dataset.
+ *
+ *		  Verify that it contains the expected data.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file.  
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *		8 Open a dataset.
+ *
+ *		  Verify that it contains the expected data.
+ *
+ *		9) Close the file.
+ *
+ *	       10) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       11) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *	       12) Close the file.
+ *
+ *	       13) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              8/18/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_smoke_check_3(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_3()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image smoke check 3");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file read only.  
+     *
+     *    Verify that the metadata cache is instructed to load the 
+     *    metadata cache image.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open the file. 
+     *
+     *    Verify that the file contains a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+ 
+ 
+    /* 10) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 11) Open and close a dataset.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 13) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_4()
+ *
+ * Purpose:     This test attempts to mimic the typical "poor man's 
+ *		parallel use case in which the file is passed between
+ *		processes, each of which open the file, write some data,
+ *		close the file, and then pass control on to the next 
+ *		process.
+ *
+ *		In this case, we only write one dataset per process.
+ *
+ *		Cycle of operation
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create and write a dataset in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file with the cache image FAPL entry.
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *		5 Create and write a new dataset
+ *
+ *		6) Close the file.
+ *
+ *		   If sufficient datasets have been created, continue to 
+ *                 7).  Otherwise goto 4)
+ *
+ *		7) Open the file.  
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *	        8) Open all datasets that have been created, and 
+ *		   verify that they contain the expected data.
+ *
+ *	        9) Close the file.
+ *
+ *	       10) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       11) Open all datasets that have been created, and
+ *                 verify that they contain the expected data.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *	       12) Close the file.
+ *
+ *	       13) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              8/18/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_smoke_check_4(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_4()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+    int min_dset = 0;
+    int max_dset = 0;
+
+    TESTING("metadata cache image smoke check 4");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create a dataset in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, min_dset++, max_dset++);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    while ( ( pass ) && ( max_dset < MAX_NUM_DSETS ) )
+    {
+ 
+        /* 4) Open the file.  
+         *
+         *    Verify that the metadata cache is instructed to load the 
+         *    metadata cache image.
+         */
+
+        if ( pass ) {
+
+            open_hdf5_file(/* create_file        */ FALSE,
+	 	           /* mdci_sbem_expected */ TRUE,
+                           /* read_only          */ FALSE,
+                           /* set_mdci_fapl      */ TRUE,
+		           /* config_fsm         */ FALSE,
+		           /* set_eoc            */ FALSE,
+                           /* hdf_file_name      */ filename,
+                           /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                           /* file_id_ptr        */ &file_id,
+                           /* file_ptr_ptr       */ &file_ptr,
+                           /* cache_ptr_ptr      */ &cache_ptr);
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L1 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp, max_dset, pass);
+
+ 
+        /* 5) Create a dataset in the file. */
+
+        if ( pass ) {
+
+            create_datasets(file_id, min_dset++, max_dset++);
+        }
+
+#if H5C_COLLECT_CACHE_STATS
+        if ( pass ) {
+
+            if ( cache_ptr->images_loaded == 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "metadata cache image block not loaded(1).";
+            }
+        }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L2 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp + 1, max_dset, pass);
+
+ 
+        /* 6) Close the file. */
+
+        if ( pass ) {
+
+            if ( H5Fclose(file_id) < 0  ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Fclose() failed.\n";
+
+            }
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L3 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp + 2, max_dset, pass);
+    } /* end while */
+    cp += 3;
+ 
+ 
+    /* 7) Open the file. 
+     *
+     *    Verify that the file contains a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open and close all datasets.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, max_dset - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+ 
+ 
+    /* 10) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 11) Open and close all datasets.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, max_dset - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* 13) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_4() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_5()
+ *
+ * Purpose:     This test attempts to mimic the typical "poor man's 
+ *		parallel use case in which the file is passed between
+ *		processes, each of which open the file, write some data,
+ *		close the file, and then pass control on to the next 
+ *		process.
+ *
+ *		In this case, we create one group for each process, and
+ *		populate it with a "zoo" of HDF5 objects selected to 
+ *		(ideally) exercise all HDF5 on disk data structures.
+ *
+ *		Cycle of operation
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create a process specific group.
+ *
+ *		3) Construct a "zoo" in the above group, and validate it.
+ *
+ *		4) Close the file.
+ *
+ *		5) Open the file with the cache image FAPL entry.
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *		6) Validate the "zoo" created in the previous file open.
+ *
+ *		7) Create a process specific group for this file open
+ *
+ *		8) Construct a "zoo" in the above group, and validate it.
+ *		
+ *		9) Close the file.
+ *
+ *		   If sufficient zoos have been created, continue to 
+ *                 10).  Otherwise goto 5)
+ *
+ *	       10) Open the file R/O.  
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       11) Validate all the zoos.
+ *
+ *	       12) Close the file.
+ *
+ *	       13) Open the file.
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       14) Validate all the zoos.
+ *
+ *	       15) Close the file.
+ *
+ *	       16) Open the file.
+ *
+ *		   Verify that the file doesn't contain a metadata cache
+ *		   image superblock extension message.
+ *
+ *	       17) Validate all the zoos.
+ *
+ *	       18) Close the file.
+ *
+ *	       19) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/15/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define MAX_NUM_GROUPS 128
+
+static unsigned
+cache_image_smoke_check_5(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_5()";
+    char filename[512];
+    char process_group_name[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    hid_t proc_gid = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+    int i;
+    int min_group = 0;
+    int max_group = 0;
+
+    TESTING("metadata cache image smoke check 5");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create a process specific group. */
+    if ( pass ) {
+
+	sprintf(process_group_name, "/process_%d", min_group);
+
+        proc_gid = H5Gcreate2(file_id, process_group_name, H5P_DEFAULT, 
+                              H5P_DEFAULT, H5P_DEFAULT);
+
+        if ( proc_gid < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "H5Gcreate2() failed (1).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Construct a "zoo" in the above group, and validate it. */
+    if ( pass ) 
+        create_zoo(file_id, process_group_name, min_group);
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Close the file. */
+
+    if ( pass ) {
+
+	if ( H5Gclose(proc_gid) < 0 ) {
+    
+            pass = FALSE;
+            failure_mssg = "H5Gclose(proc_gid) failed. (1)";
+        }
+    }
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    while ( ( pass ) && ( max_group < MAX_NUM_GROUPS ) )
+    {
+ 
+        /* 5) Open the file.  
+         *
+         *    Verify that the metadata cache is instructed to load the 
+         *    metadata cache image.
+         */
+
+        if ( pass ) {
+
+            open_hdf5_file(/* create_file        */ FALSE,
+	 	           /* mdci_sbem_expected */ TRUE,
+                           /* read_only          */ FALSE,
+                           /* set_mdci_fapl      */ TRUE,
+		           /* config_fsm         */ FALSE,
+		           /* set_eoc            */ FALSE,
+                           /* hdf_file_name      */ filename,
+                           /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                           /* file_id_ptr        */ &file_id,
+                           /* file_ptr_ptr       */ &file_ptr,
+                           /* cache_ptr_ptr      */ &cache_ptr);
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L1 cp = %d, max_group = %d, pass = %d.\n", 
+                      fcn_name, cp, max_group, pass);
+
+
+        /* 6) Validate the "zoo" created in the previous file open. */
+        if ( pass ) 
+            validate_zoo(file_id, process_group_name, max_group);
+
+#if H5C_COLLECT_CACHE_STATS
+        if ( pass ) {
+
+            if ( cache_ptr->images_loaded == 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "metadata cache image block not loaded(1).";
+            }
+        }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L2 cp = %d, max_group = %d, pass = %d.\n", 
+                      fcn_name, cp + 1, max_group, pass);
+
+
+	/* 7) Create a process specific group for this file open */
+        if ( pass ) {
+
+	    max_group++;
+	    sprintf(process_group_name, "/process_%d", max_group);
+
+            proc_gid = H5Gcreate2(file_id, process_group_name, H5P_DEFAULT, 
+                                  H5P_DEFAULT, H5P_DEFAULT);
+
+            if ( proc_gid < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "H5Gcreate2() failed (2).\n";
+            }
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L3 cp = %d, max_group = %d, pass = %d.\n", 
+                      fcn_name, cp + 2, max_group, pass);
+ 
+
+	/* 8) Construct a "zoo" in the above group, and validate it. */
+        if ( pass ) 
+            create_zoo(file_id, process_group_name, max_group);
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L4 cp = %d, max_group = %d, pass = %d.\n", 
+                      fcn_name, cp + 3, max_group, pass);
+
+ 
+        /* 9) Close the file. */
+
+        if ( pass ) {
+
+	    if ( H5Gclose(proc_gid) < 0 ) {
+    
+                pass = FALSE;
+                failure_mssg = "H5Gclose(process_gid) failed. (2)";
+            }
+        }
+
+        if ( pass ) {
+
+            if ( H5Fclose(file_id) < 0  ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Fclose() failed.\n";
+
+            }
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L5 cp = %d, max_group = %d, pass = %d.\n", 
+                      fcn_name, cp + 4, max_group, pass);
+    } /* end while */
+    cp += 5;
+ 
+    /* 10) Open the file read only. 
+     *
+     *    Verify that the file contains a metadata cache image 
+     *    superblock extension message.
+     */
+    if(pass) {
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if(show_progress)
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 11) Validate all the zoos. */
+    i = min_group;
+    while(pass && i <= max_group) {
+	sprintf(process_group_name, "/process_%d", i);
+        validate_zoo(file_id, process_group_name, i++);
+    }
+ 
+#if H5C_COLLECT_CACHE_STATS
+    if( pass) {
+        if(cache_ptr->images_loaded == 0) {
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if(show_progress)
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* 12) Close the file. */
+    if(pass) {
+        if(H5Fclose(file_id) < 0) {
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    /* 13) Open the file R/W. 
+     *
+     *    Verify that the file contains a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 14) Validate all the zoos. */
+    i = min_group;
+    while ( ( pass ) && ( i <= max_group ) ) {
+
+	sprintf(process_group_name, "/process_%d", i);
+        validate_zoo(file_id, process_group_name, i++);
+    }
+ 
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 15) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+ 
+ 
+    /* 16) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 17) Validate all the zoos.
+     *
+     *    Verify that the metadata cache image superblock 
+     *    extension message has been deleted.
+     */
+    i = min_group;
+    while ( ( pass ) && ( i <= max_group ) ) {
+
+	sprintf(process_group_name, "/process_%d", i);
+        validate_zoo(file_id, process_group_name, i++);
+    }
+ 
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 18) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 19) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_5() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_smoke_check_6()
+ *
+ * Purpose:     As the free space manager metadata is now included in the
+ *		cache image, a smoke check to verify generally correct 
+ *		behaviour of the persistent free space managers seems 
+ *		prudent.
+ *
+ *		The basic idea of this test is to construct a long 
+ *		sequence of dataset creations and deletions, all separated
+ *		by file open/close cycles with cache image enabled.  If the 
+ *		perisistant free space managers are performing as expected,
+ *		the size of the file should stabilize.
+ *
+ *		To implement this, proceed as outlined in the cycle of 
+ *		operation below:
+ *
+ *		Cycle of operation
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create and write a dataset in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file with the cache image FAPL entry.
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *		5) Create and write a new dataset.
+ *
+ *		6) Verify and delete the old dataset.
+ *
+ *		7) Close the file.
+ *
+ *		   If sufficient datasets have been created, and then 
+ *		   deleteded continue to 8).  Otherwise goto 4)
+ *
+ *		8) Open the file.  
+ *
+ *		   Verify that the file contains a metadata cache
+ *		   image superblock extension message.
+ *
+ *	        9) Verify the last dataset created.
+ *
+ *	       10) Close the file.
+ *
+ *	       11) Open the file.
+ *
+ *	       12) Verify and delete the last dataset.
+ *
+ *		   Verify that a metadata cache image is not loaded.
+ *
+ *	       13) Close the file.
+ *
+ *             14) Get the size of the file.  Verify that it is less 
+ *		   than 20 KB.  Without deletions and persistant free 
+ *		   space managers, size size is about 167 MB, so this 
+ *		   is sufficient to verify that the persistant free 
+ *		   space managers are more or less doing their job.
+ *
+ *                 Note that in the absence of paged allocation, file
+ *                 size gets below 1 KB.
+ *
+ *	       15) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              10/31/16
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_smoke_check_6(void)
+{
+    const char * fcn_name = "cache_image_smoke_check_6()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    h5_stat_size_t file_size;
+    int cp = 0;
+    int min_dset = 0;
+    int max_dset = 0;
+
+    TESTING("metadata cache image smoke check 6");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create a dataset in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, min_dset++, max_dset++);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    while ( ( pass ) && ( max_dset < MAX_NUM_DSETS ) )
+    {
+ 
+        /* 4) Open the file.  
+         *
+         *    Verify that the metadata cache is instructed to load the 
+         *    metadata cache image.
+         */
+
+        if ( pass ) {
+
+            open_hdf5_file(/* create_file        */ FALSE,
+	 	           /* mdci_sbem_expected */ TRUE,
+                           /* read_only          */ FALSE,
+                           /* set_mdci_fapl      */ TRUE,
+		           /* config_fsm         */ FALSE,
+		           /* set_eoc            */ FALSE,
+                           /* hdf_file_name      */ filename,
+                           /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                           /* file_id_ptr        */ &file_id,
+                           /* file_ptr_ptr       */ &file_ptr,
+                           /* cache_ptr_ptr      */ &cache_ptr);
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L1 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp, max_dset, pass);
+
+ 
+        /* 5) Create a dataset in the file. */
+
+        if ( pass ) {
+
+            create_datasets(file_id, min_dset++, max_dset++);
+        }
+
+#if H5C_COLLECT_CACHE_STATS
+        if ( pass ) {
+
+            if ( cache_ptr->images_loaded == 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "metadata cache image block not loaded(1).";
+            }
+        }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L2 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp + 1, max_dset, pass);
+
+
+	/* 6) Verify and delete the old dataset. */
+	if ( pass ) {
+
+	    delete_datasets(file_id, min_dset - 2, max_dset - 2);
+	}
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L3 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp + 2, max_dset, pass);
+
+ 
+        /* 7) Close the file. */
+
+        if ( pass ) {
+
+            if ( H5Fclose(file_id) < 0  ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Fclose() failed.\n";
+
+            }
+        }
+
+        if ( show_progress ) 
+            HDfprintf(stdout, "%s:L4 cp = %d, max_dset = %d, pass = %d.\n", 
+                      fcn_name, cp + 3, max_dset, pass);
+    } /* end while */
+    cp += 4;
+ 
+ 
+    /* 8) Open the file. 
+     *
+     *    Verify that the file contains a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 9) Verify the last dataset created. */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, min_dset - 1, max_dset - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 10) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+ 
+ 
+    /* 11) Open the file. 
+     *
+     *    Verify that the file doesn't contain a metadata cache image 
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Verify and delete the last dataset.
+     *
+     *     Verify that a metadata cache image is not loaded. 
+     */
+
+    if ( pass ) {
+
+       delete_datasets(file_id, min_dset - 1, max_dset - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+ 
+
+    /* 13) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 14) Get the size of the file.  Verify that it is less
+     *     than 20 KB.  Without deletions and persistant free
+     *     space managers, size size is about 167 MB, so this
+     *     is sufficient to verify that the persistant free
+     *     space managers are more or less doing their job.
+     *
+     *     Note that in the absence of paged allocation, file
+     *     size gets below 1 KB, but since this test is run both 
+     *     with and without paged allocation, we must leave some
+     *     extra space for the paged allocation case.
+     */
+    if(pass) {
+        if((file_size = h5_get_file_size(filename, H5P_DEFAULT)) < 0) {
+            pass = FALSE;
+            failure_mssg = "h5_get_file_size() failed.\n";
+        } else if(file_size > 20 * 1024) {
+            pass = FALSE;
+            failure_mssg = "unexpectedly large file size.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 15) Delete the file */
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_smoke_check_6() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_api_error_check_1()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to verify correct management of API errors.
+ *
+ *		The object of this test is to verify that a file without
+ *		a pre-existing cache image that is opened both read only
+ *		and with a cache image requested is handle correctly
+ *		(the cache image request should be ignored silently).
+ *
+ *		The test is set up as follows:
+ *
+ *		1) Create a HDF5 file.  
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file read only with a cache image FAPL entry
+ *		   requested.  
+ *
+ *		5) Open a dataset.
+ *
+ *		   Verify that it contains the expected data
+ *
+ *		   Verify that the cache image was not loaded.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file read only.
+ *
+ *		8) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		   Verify that the cache image was not loaded.
+ *
+ *		9) Close the file.
+ *
+ * 	       10) Open the file read write.
+ *
+ *	       11) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *	       12) Close the file.
+ *
+ *	       13) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/25/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_api_error_check_1(void)
+{
+    const char * fcn_name = "cache_image_api_error_check_1()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image api error check 1");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file read only with a cache image FAPL entry requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open and close a dataset.
+     *
+     *    Verify that it contains the expected data.
+     *
+     *    Verify that the cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open the file read only. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open and close a dataset.
+     *
+     *    Verify that it contains the expected data.
+     *
+     *    Verify that the cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(3).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 10) Open the file read / write. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+    /* 11) Open and close a dataset.
+     *
+     *     Verify that it contains the expected data.
+     *
+     *     Verify that the cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(4).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 12) Close the file.  */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 13) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_api_error_check_1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_api_error_check_2()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to verify correct management of API errors.
+ *
+ *		The object of this test is to verify that a file with
+ *		a pre-existing cache image that is opened both read only
+ *		and with a cache image requested is handled correctly
+ *		(the cache image request should be ignored silently).
+ *
+ *		The test is set up as follows:
+ *
+ *		1) Create a HDF5 file with a cache image requested..  
+ *
+ *		2) Create some datasets in the file. 
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file read only with a cache image FAPL entry
+ *		   requested.  
+ *
+ *		5) Open a dataset.
+ *
+ *		   Verify that it contains the expected data
+ *
+ *		   Verify that the cache image was loaded.
+ *
+ *		6) Close the file.
+ *
+ *		7) Open the file read only.
+ *
+ *		8) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		   Verify that the cache image was loaded.
+ *
+ *		9) Close the file.
+ *
+ * 	       10) Open the file read write.
+ *
+ *	       11) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		   Verify that the cache image was loaded.
+ *
+ *	       12) Close the file.
+ *
+ * 	       13) Open the file read write.
+ *
+ *	       14) Open a dataset.
+ *
+ *		   Verify that it contains the expected data.
+ *
+ *		   Verify that the cache image was NOT loaded.
+ *
+ *	       15) Close the file.
+ *
+ *	       16) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/25/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_api_error_check_2(void)
+{
+    const char * fcn_name = "cache_image_api_error_check_2()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image api error check 2");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with a cache image requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 2) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Open the file read only with a cache image FAPL entry requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open and close a dataset.
+     *
+     *    Verify that it contains the expected data.
+     *
+     *    Verify that the cache image was loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block was not loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 6) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 7) Open the file read only. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+		       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ 0,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open and close a dataset.
+     *
+     *    Verify that it contains the expected data.
+     *
+     *    Verify that the cache image was loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block was not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 10) Open the file read / write. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+    /* 11) Open and close a dataset.
+     *
+     *     Verify that it contains the expected data.
+     *
+     *     Verify that the cache image was loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block was not loaded(3).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 12) Close the file.  */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 13) Open the file read / write. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+    /* 14) Open and close a dataset.
+     *
+     *     Verify that it contains the expected data.
+     *
+     *     Verify that the cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block was loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 15) Close the file.  */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 13) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_api_error_check_2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_api_error_check_3()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to verify correct management of API errors.
+ *
+ *		At present, SWMR and cache image may not be active 
+ *		at the same time.  The purpose of this test is to 
+ *		verify that attempts to run SWMR and cache image 
+ *		at the same time will fail.
+ *
+ *		The test is set up as follows:
+ *
+ *		1) Create a HDF5 file with a cache image requested..  
+ *
+ *		2) Try to start SWMR write -- should fail.
+ *
+ *              3) Discard the file if necessary
+ *
+ *              4) Attempt to create a HDF5 file with SWMR write 
+ *		   access and cache image requested -- should fail.
+ *
+ *              5) Discard the file if necessary
+ *
+ *              6) Create a HDF5 file with a cache image requested.
+ *
+ *		7) Create some datasets in the file. 
+ *
+ *		8) Close the file.
+ *
+ *              9) Attempt to open the file with SWMR write access --
+ *                 should fail.
+ *
+ *             10) Discard the file if necessary.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              12/29/16
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_api_error_check_3(void)
+{
+    const char * fcn_name = "cache_image_api_error_check_3()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    TESTING("metadata cache image api error check 3");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with a cache image requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 2) Try to start SWMR write -- should fail. */
+
+    if ( pass ) {
+
+        H5E_BEGIN_TRY {
+            if ( H5Fstart_swmr_write(file_id) == SUCCEED ) {
+
+                pass = FALSE;
+                failure_mssg = "SWMR start succeeded in file with cache image.";
+            }
+        } H5E_END_TRY;
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 3) Discard the file if necessary */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 4) Attempt to create a HDF5 file with SWMR write 
+     *    access and cache image requested -- should fail.
+     */
+ 
+     attempt_swmr_open_hdf5_file(/* create_file   */ TRUE,
+                                 /* set_mdci_fapl */ TRUE, 
+                                 /* hdf_file_name */ filename);
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5) Discard the file if necessary */
+
+    if ( pass ) {
+
+        /* file probably doesn't exist, so don't 
+         * error check the remove call.
+         */
+        HDremove(filename);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Create a HDF5 file with a cache image requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 7) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 8) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 9) Attempt to open the file with SWMR write access -- should fail. */
+ 
+    attempt_swmr_open_hdf5_file(/* create_file   */ FALSE,
+                                /* set_mdci_fapl */ TRUE, 
+                                /* hdf_file_name */ filename);
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 10) Discard the file if necessary. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_api_error_check_3() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    cache_image_api_error_check_4()
+ *
+ * Purpose:     This test is one of a sequence of tests intended
+ *		to verify correct management of API errors.
+ *
+ *		The object of this test is to verify that a request for 
+ *		a cache image when a version 2 superblock is not available/
+ *		not requested is handled correctly.
+ *		(the cache image request should be ignored silently).
+ *
+ *		The test is set up as follows:
+ *
+ *		1) Create a FAPL requesting  a cache image, but WITHOUT
+ *		   specifying the latest file format.
+ *
+ *		2) Create a HDF5 file using the above FAPL.  
+ *
+ *		3) Create some datasets in the file. 
+ *
+ *		4) Close the file.
+ *
+ *		5) Open the file read only.  Verify that the file doesn't 
+ *		   contain a cache image.
+ *
+ *		6) Verify that the datasets exist and contain the 
+ *		   expected data
+ *
+ *		   Verify that the cache image was not loaded.
+ *
+ *		7) Close the file.
+ *
+ *		8) Open the file R/W using the FAPL defined in 1) above.  
+ *		   Verify that the file does not contain a cache image.
+ *
+ *		9) Close the file.
+ *
+ *	       10) Open the file R/W using the FAPL defined in 1) above.
+ *	           Verify that the file does not contain a cache image.
+ *
+ *	       11) Verify that the data sets contain the expected data
+ *
+ *		   Verify that a cache image was not loaded.
+ *
+ *	       12) Create several more data sets.
+ *
+ *	       13) Close the file.
+ *
+ * 	       14) Open the file read write.
+ * 	       
+ * 	           Verify that the file does not contain a cache image.
+ *
+ *	       15) Verify the data sets exist and contain the expected
+ *	           data.
+ *
+ *		   Verify that a cache image was not loaded.
+ *
+ *	       16) Close the file.
+ *
+ *	       17) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/25/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+cache_image_api_error_check_4(void)
+{
+    const char * fcn_name = "cache_image_api_error_check_4()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t fapl_id = -1;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+    H5AC_cache_image_config_t cache_image_config;
+
+    TESTING("metadata cache image api error check 4");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /*	1) Create a FAPL requesting  a cache image, but WITHOUT
+     *		   specifying the latest file format.
+     */
+    if ( pass ) {
+
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+
+        if ( fapl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        /* set cache image config fields to taste */
+        cache_image_config.version = H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION;
+        cache_image_config.generate_image = TRUE;
+        cache_image_config.save_resize_status = FALSE;
+        cache_image_config.entry_ageout = H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE;
+
+        if ( H5Pset_mdc_image_config(fapl_id, &cache_image_config) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_mdc_image_config() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create a HDF5 file using the above FAPL. */
+
+    if ( pass ) {
+
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
+
+        if ( file_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fcreate() failed.\n";
+
+        } else {
+
+            file_ptr = (struct H5F_t *)H5I_object_verify(file_id, H5I_FILE);
+
+            if ( file_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "Can't get file_ptr.";
+
+            }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get a pointer to the files internal data structure and then
+     * to the cache structure
+     */
+    if ( pass ) {
+
+        if ( file_ptr->shared->cache == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "can't get cache pointer(1).\n";
+
+        } else {
+
+            cache_ptr = file_ptr->shared->cache;
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 3) Create some datasets in the file. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        HDassert(cache_ptr);
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 4) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 5) Open the file read only. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 6) Verify that the datasets exist and contain the 
+     *    expected data
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 7) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 8) Open the file R/W using the FAPL defined in 1) above.  
+     *
+     *    Verify that the file does not contain a cache image.
+     */
+
+    if ( pass ) {
+
+        file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id);
+
+        if ( file_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fopen() failed.\n";
+
+        } else {
+
+            file_ptr = (struct H5F_t *)H5I_object_verify(file_id, H5I_FILE);
+
+            if ( file_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "Can't get file_ptr.";
+
+            }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get a pointer to the files internal data structure and then
+     * to the cache structure
+     */
+    if ( pass ) {
+
+        if ( file_ptr->shared->cache == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "can't get cache pointer(1).\n";
+
+        } else {
+
+            cache_ptr = file_ptr->shared->cache;
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->load_image == TRUE ) ||
+             ( cache_ptr->delete_image == TRUE ) ) {
+
+            pass = FALSE;
+            failure_mssg = "mdci sb extension message present?\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+
+    /* 10) Open the file R/W using the FAPL defined in 1) above.
+     *     Verify that the file does not contain a cache image.
+     */
+
+    if ( pass ) {
+
+        file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id);
+
+        if ( file_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fopen() failed.\n";
+
+        } else {
+
+            file_ptr = (struct H5F_t *)H5I_object_verify(file_id, H5I_FILE);
+
+            if ( file_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "Can't get file_ptr.";
+
+            }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get a pointer to the files internal data structure and then
+     * to the cache structure
+     */
+    if ( pass ) {
+
+        if ( file_ptr->shared->cache == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "can't get cache pointer(1).\n";
+
+        } else {
+
+            cache_ptr = file_ptr->shared->cache;
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->load_image == TRUE ) ||
+             ( cache_ptr->delete_image == TRUE ) ) {
+
+            pass = FALSE;
+            failure_mssg = "mdci sb extension message present?\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 11) Verify that the data sets contain the expected data
+     *
+     *     Verify that a cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 5);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Create several more data sets. */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 6, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 13) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 14) Open the file read write.
+     *             
+     *     Verify that the file does not contain a cache image.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+	 	       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+ 
+    /* 15) Verify the data sets exist and contain the expected  data.
+     *
+     *     Verify that a cache image was not loaded.
+     */
+
+    if ( pass ) {
+
+       verify_datasets(file_id, 0, 10);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 16) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+ 
+
+    /* 17) Delete the file */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* tidy up */
+    if ( fapl_id != -1 )
+        H5Pclose(fapl_id);
+
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* cache_image_api_error_check_4() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    get_free_sections_test()
+ *
+ * Purpose:     It is possible that H5Fget_free_sections() to be
+ *		called before any activity on the metadata cache.
+ *              This is a potential problem, as satisfying the 
+ *              H5Fget_free_sections() call requires access to all 
+ *              free space managers.  When persistant free space 
+ *              managers are enabled, this will require calling
+ *              H5MF_tidy_self_referential_fsm_hack().  This is a 
+ *              non issue in the absence of a cache image.  However,
+ *		this is a problem if a cache image exists, as 
+ *		the call to H5MF_tidy_self_referential_fsm_hack()
+ *		will free the file space allocated to the cache
+ *		image.
+ *
+ *		The objective of this test is to create a test file
+ *		with both non-empty self referential presistant 
+ *              free space managers, and a cache image, and then 
+ *              verify that this situation is handled correctly if 
+ *              H5Fget_free_sections() is called before the metadata
+ *              cache image is loaded.
+ *
+ *		The test is set up as follows:
+ *
+ *		 1) Create a HDF5 file with a cache image requested
+ *                  and persistant free space managers enabled.  
+ *
+ *		 2) Create some data sets, and then delete some of 
+ *                  of those near the beginning of the file.
+ *
+ *               3) Close the file.
+ *
+ *               4) Open the file read only.
+ *
+ *               5) Verify that a cache image exists, and has not
+ *                  been loaded.
+ *
+ *               6) Verify that one or more self referential FSMs
+ *                  have been stored at the end of the file just 
+ *                  before the cache image.
+ *
+ *               7) Call H5Fget_free_sections().
+ *
+ *               8) Verify that the cache image has been loaded and 
+ *                  that the self referential FSMs have been floated.
+ *
+ *               9) Verify that the remaining data sets contain the
+ *                  expected data.
+ *
+ *              10) Close the file.
+ *
+ *              11) Open the file R/W.
+ *
+ *              12) Verify that a cache image exists, and has not
+ *                  been loaded.
+ *
+ *              13) Verify that one or more self referential FSMs
+ *                  have been stored at the end of the file just 
+ *                  before the cache image.
+ *
+ *              14) Call H5Fget_free_sections().
+ *
+ *              15) Verify that the cache image has been loaded and 
+ *                  that the self referential FSMs have been floated.
+ *
+ *              16) Verify that the remaining data sets contain the
+ *                  expected data.
+ *
+ *              17) Delete the remaining data sets.
+ *
+ *		18) Close the file.
+ *
+ *              19) Verify that file space has been reclaimed.
+ *
+ *              20) Discard the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              1/10/17
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+get_free_sections_test(void)
+{
+    const char * fcn_name = "get_free_sections_test()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    h5_stat_size_t file_size;
+    int cp = 0;
+
+    TESTING("Cache image / H5Fget_free_sections() interaction");
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with a cache image requested
+     *    and persistant free space managers enabled.  
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create some data sets, and then delete some of 
+     *    of those near the beginning of the file.
+     */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 1, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        delete_datasets(file_id, 1, 5);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (1).\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 4) Open the file read only. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 5) Verify that a cache image exists, and has not been loaded. */
+
+    if ( pass ) {
+
+        if ( ( ! file_ptr->shared->cache->load_image ) ||
+             ( file_ptr->shared->cache->image_loaded ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected cache image status.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Verify that one or more self referential FSMs
+     *    have been stored at the end of the file just 
+     *    before the cache image.
+     */
+
+    if ( pass ) {
+
+        /* file_ptr->shared->first_alloc_dealloc is set to FALSE if the 
+         * file is opened R/O.
+         */
+        if ( ( file_ptr->shared->first_alloc_dealloc ) ||
+             ( ! H5F_addr_defined(file_ptr->shared->eoa_pre_fsm_fsalloc) ) ||
+             ( ! H5F_addr_defined(file_ptr->shared->cache->image_addr) ) ||
+             ( H5F_addr_gt(file_ptr->shared->eoa_pre_fsm_fsalloc,
+                           file_ptr->shared->cache->image_addr) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected cache image status (1).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 7) Call H5Fget_free_sections(). */
+
+    if ( pass ) {
+
+        if ( H5Fget_free_sections(file_id, H5FD_MEM_DEFAULT, (size_t)0, NULL) 
+             < 0 ){
+
+            pass = FALSE;
+            failure_mssg = "H5Fget_free_sections() failed (1).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 8) Verify that the cache image has been loaded and 
+     *    that the self referential FSMs have been floated.
+     */
+    if ( pass ) {
+
+        if ( ! file_ptr->shared->cache->image_loaded ) {
+
+            pass = FALSE;
+            failure_mssg = "cache image not loaded (1).\n";
+
+        } else if ( file_ptr->shared->first_alloc_dealloc ) {
+
+            pass = FALSE;
+            failure_mssg = "self referential FSMs not floated (1).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Verify that the remaining data sets contain the expected data. */
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 6, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 10) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (2).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 11) Open the file R/W. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 12) Verify that a cache image exists, and has not been loaded. */
+
+    if ( pass ) {
+
+        if ( ( ! file_ptr->shared->cache->load_image ) ||
+             ( file_ptr->shared->cache->image_loaded ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected cache image status.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 13) Verify that one or more self referential FSMs
+     *     have been stored at the end of the file just 
+     *     before the cache image.
+     */
+    if ( pass ) {
+
+        if ( ( ! file_ptr->shared->first_alloc_dealloc ) ||
+             ( ! H5F_addr_defined(file_ptr->shared->eoa_pre_fsm_fsalloc) ) ||
+             ( ! H5F_addr_defined(file_ptr->shared->cache->image_addr) ) ||
+             ( H5F_addr_gt(file_ptr->shared->eoa_pre_fsm_fsalloc,
+                           file_ptr->shared->cache->image_addr) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected cache image status (2).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 14) Call H5Fget_free_sections(). */
+
+    if ( pass ) {
+
+        if ( H5Fget_free_sections(file_id, H5FD_MEM_DEFAULT, (size_t)0, NULL) 
+             < 0 ){
+
+            pass = FALSE;
+            failure_mssg = "H5Fget_free_sections() failed (2).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 15) Verify that the cache image has been loaded and 
+     *     that the self referential FSMs have been floated.
+     */
+    if ( pass ) {
+
+        if ( ! file_ptr->shared->cache->image_loaded ) {
+
+            pass = FALSE;
+            failure_mssg = "cache image not loaded (2).\n";
+
+        } else if ( file_ptr->shared->first_alloc_dealloc ) {
+
+            pass = FALSE;
+            failure_mssg = "self referential FSMs not floated (2).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 16) Verify that the remaining data sets contain the expected data. */
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 6, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 17) Delete the remaining data sets. */
+
+    if ( pass ) {
+
+        delete_datasets(file_id, 6, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 18) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (3).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 19) Verify that file space has been reclaimed. */
+
+    if ( pass ) {
+
+        if((file_size = h5_get_file_size(filename, H5P_DEFAULT)) < 0) {
+
+            pass = FALSE;
+            failure_mssg = "h5_get_file_size() failed.\n";
+
+        } else if ( file_size > 20 * 1024 ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpectedly large file size.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 20) Discard the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+
+} /* get_free_sections_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    evict_on_close_test()
+ *
+ * Purpose:     If a file containing a cache image which in turn 
+ *              contains dirty entries is opened R/O, the metadata 
+ *              cache must refuse to evict the dirty entries, as 
+ *              it will not be able to reload them from file.  This
+ *              is a bit tricky, as the dirty entries must marked as
+ *              clean in the metadata cache so that the MDC will not 
+ *              attempt to flush then on file close.
+ *
+ *              The objective of this test is to verify that the 
+ *              metadata will not evict dirty entries in the above
+ *              context when the file is opened with the evict on close
+ *              FAPL entry.
+ *
+ *              Do this by creating a HDF5 file with a cache image 
+ *              containing dirty metadata.  
+ *
+ *              Then close the file, re-open it R/O, and scan its 
+ *              contents twice.  If evict on close succeeds in evicting
+ *              the dirty metadata, the second scan will fail, as valid 
+ *              versions of the dirty metadata will not be available.
+ *
+ *              To make the test more useful, enable persistant free 
+ *              space managers.
+ *
+ *		The test is set up as follows:
+ *
+ *		 1) Create a HDF5 file without a cache image requested
+ *                  and persistant free space managers enabled.  
+ *
+ *		 2) Create some data sets and verify them.
+ *
+ *               3) Close the file.
+ *
+ *               4) Open the file R/W, and with cache image requested.
+ *
+ *               5) Verify the datasets created in 2) above.  This will
+ *                  force their (clean) metadata into the metadata cache,
+ *                  and hence into the cache image.
+ *
+ *               6) Create some more datasets.
+ *
+ *               7) Close the file.
+ *
+ *               8) Open the file R/O and with evict on close enabled.
+ *
+ *               9) Verify all datasets twice.
+ *
+ *              10) Close the file.
+ *
+ *              11) Open the file R/W and with evict on close enabled.
+ *
+ *              12) Verify all datasets twice.
+ *
+ *              13) Close the file.
+ *
+ *              14) Discard the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/23/17
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+evict_on_close_test(void)
+{
+#ifndef H5_HAVE_PARALLEL
+    const char * fcn_name = "evict_on_close_test()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hbool_t verbose = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+#endif /* H5_HAVE_PARALLEL */
+
+    TESTING("Cache image / evict on close interaction");
+
+#ifdef H5_HAVE_PARALLEL
+    SKIPPED();
+    HDputs("    EoC not supported in the parallel library.");
+    return 0;
+#else
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file without a cache image requested
+     *    and persistant free space managers enabled.  
+     */
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ TRUE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ TRUE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create some data sets and verify them.  */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 1, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (1).\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 4) Open the file R/W, and with cache image requested. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ FALSE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ TRUE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ FALSE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5) Verify the datasets created in 2) above.  This will
+     *    force their (clean) metadata into the metadata cache,
+     *    and hence into the cache image.
+     */
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 10);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 6) Create some more datasets and verify them */
+
+    if ( pass ) {
+
+        create_datasets(file_id, 11, 20);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 11, 20);
+    }
+
+    if ( verbose ) {
+
+        HDassert(cache_ptr);
+        HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+        HDfprintf(stdout, "index size / index dirty size = %lld / %lld\n", 
+                  (long long)(cache_ptr->index_size),
+                  (long long)(cache_ptr->dirty_index_size));
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 7) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (2).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 8) Open the file R/O and with evict on close enabled. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ TRUE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ TRUE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s*: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Verify all datasets twice */
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 20);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 20);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 10) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (3).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ 
+    /* 11) Open the file R/w and with evict on close enabled. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file        */ FALSE,
+                       /* mdci_sbem_expected */ TRUE,
+                       /* read_only          */ FALSE,
+                       /* set_mdci_fapl      */ FALSE,
+		       /* config_fsm         */ FALSE,
+		       /* set_eoc            */ TRUE,
+                       /* hdf_file_name      */ filename,
+                       /* cache_image_flags  */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr        */ &file_id,
+                       /* file_ptr_ptr       */ &file_ptr,
+                       /* cache_ptr_ptr      */ &cache_ptr);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s*: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Verify all datasets twice */
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 20);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        verify_datasets(file_id, 1, 20);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 13) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed (3).\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 14) Discard the file. */
+
+    if ( pass ) {
+
+        if ( HDremove(filename) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass )
+        HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+
+    return !pass;
+#endif /* H5_HAVE_PARALLEL */
+
+} /* evict_on_close_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Run tests on the cache code contained in H5C.c
+ *
+ * Return:      Success:
+ *
+ *              Failure:
+ *
+ * Programmer:  John Mainzer
+ *              6/24/04
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    unsigned nerrs = 0;
+    int express_test;
+
+    H5open();
+
+    express_test = GetTestExpress();
+
+    printf("=========================================\n");
+    printf("Cache image tests\n");
+    printf("        express_test = %d\n", express_test);
+    printf("=========================================\n");
+
+    nerrs += check_cache_image_ctl_flow_1();
+    nerrs += check_cache_image_ctl_flow_2();
+    nerrs += check_cache_image_ctl_flow_3();
+    nerrs += check_cache_image_ctl_flow_4();
+    nerrs += check_cache_image_ctl_flow_5();
+    nerrs += check_cache_image_ctl_flow_6();
+
+    nerrs += cache_image_smoke_check_1();
+    nerrs += cache_image_smoke_check_2();
+    nerrs += cache_image_smoke_check_3();
+    nerrs += cache_image_smoke_check_4();
+    nerrs += cache_image_smoke_check_5();
+    nerrs += cache_image_smoke_check_6();
+
+    nerrs += cache_image_api_error_check_1();
+    nerrs += cache_image_api_error_check_2();
+    nerrs += cache_image_api_error_check_3();
+    nerrs += cache_image_api_error_check_4();
+
+    nerrs += get_free_sections_test();
+    nerrs += evict_on_close_test();
+
+    return(nerrs > 0);
+
+} /* main() */
+
diff --git a/test/cache_logging.c b/test/cache_logging.c
index a5e399c..b4ed53b 100644
--- a/test/cache_logging.c
+++ b/test/cache_logging.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 */
@@ -132,6 +130,7 @@ test_logging_api(void)
         TEST_ERROR;
 
     /* Clean up */
+    HDfree(location);
     if(H5Fclose(fid) < 0)
         TEST_ERROR;
 
diff --git a/test/cache_tagging.c b/test/cache_tagging.c
index 0cc200c..99ab49c 100644
--- a/test/cache_tagging.c
+++ b/test/cache_tagging.c
@@ -1,14 +1,13 @@
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Mike McGreevy
@@ -16,13 +15,13 @@
  *
  *              This file contains tests for metadata tagging.
  */
-#include "hdf5.h"
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5F_TESTING
+#include "H5Fpkg.h"
+
 #include "testhdf5.h"
-#include "h5test.h"
-#include "H5Iprivate.h"
-#include "H5ACprivate.h"
-#include "H5ACpublic.h"
 #include "cache_common.h"
+
 #include "H5HLprivate.h"
 
 /* ============ */
@@ -53,18 +52,19 @@
 /* ===================== */
 
 /* Helper Functions */
-static void print_entry_type_to_screen(int id);
-static int print_index(hid_t fid);
+#ifndef NDEBUG
+static int dump_cache(hid_t fid);
+#endif /* NDEBUG */ /* end debugging functions */
 static int verify_no_unknown_tags(hid_t fid);
 static int mark_all_entries_investigated(hid_t fid);
+static int reset_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);
+static int get_object_header_tag(hid_t loc_id, haddr_t *tag);
+static int get_sbe_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);
@@ -72,18 +72,20 @@ 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_group_creation_tags(void);
+static unsigned check_multi_group_creation_tags(void);
+static unsigned check_group_open_tags(void);
+static unsigned check_dataset_open_tags(void);
+static unsigned check_dataset_write_tags(void);
+static unsigned check_dataset_read_tags(void);
+static unsigned check_dataset_size_retrieval(void);
+static unsigned check_dataset_extend_tags(void);
+static unsigned check_object_info_tags(void);
+static unsigned check_object_copy_tags(void);
+static unsigned check_link_getname_tags(void);
+static unsigned check_external_link_creation_tags(void);
+static unsigned check_external_link_open_tags(void);
 static unsigned check_dense_attribute_tags(void);
 static unsigned check_link_iteration_tags(void);
 static unsigned check_invalid_tag_application(void);
@@ -93,129 +95,11 @@ 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 */
 
+#ifndef NDEBUG
 

 /*-------------------------------------------------------------------------
- * Function:    print_index()
+ * Function:    dump_cache()
  *
  * Purpose:     DEBUG CODE (for when verbose is set).
  *
@@ -229,50 +113,32 @@ print_entry_type_to_screen(int id)
  *
  *-------------------------------------------------------------------------
  */
-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 */
+static int dump_cache(hid_t fid)
+{
+    H5F_t *f;           /* File 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 */
+    if(NULL == (f = (H5F_t *)H5I_object(fid)))
+        TEST_ERROR;
 
-    } /* end for */
-    printf("\n");
+    /* Dump the cache */
+    if(H5AC_dump_cache(f) < 0)
+        TEST_ERROR;
 
     return 0;
     
 error:
-
     return -1;
-
-} /* print_index */
+} /* dump_cache */
+#endif /* NDEBUG */ /* end debugging functions */
 
 

 /*-------------------------------------------------------------------------
  * 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 
+ * Purpose:     Verifies that all tags in the provided cache have the
+ *		'dirtied' flag set.  Other verification functions in this
+ *		test file set this flag after checking them, so 
  *              this is handy to verify that tests have checked all entries
  *              in the cache.
  *
@@ -281,35 +147,32 @@ error:
  * Programmer:  Mike McGreevy
  *              January 25, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static int verify_no_unknown_tags(hid_t fid)
+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 */
+    H5F_t *f;           /* File Pointer */
+    H5C_t *cache_ptr;   /* Cache Pointer */
+    int i;              /* Iterator */
 
     /* Get Internal File / Cache Pointers */
-    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    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];
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        H5C_cache_entry_t *entry_ptr;      /* entry pointer */
 
-        while (next_entry_ptr != NULL) {
-
-            if ( next_entry_ptr->tag != H5AC__IGNORE_TAG ) TEST_ERROR;
-
-            next_entry_ptr = next_entry_ptr->ht_next;
+        entry_ptr = cache_ptr->index[i];
+        while(entry_ptr != NULL) {
+            if(!entry_ptr->dirtied)
+                TEST_ERROR;
 
+            entry_ptr = entry_ptr->ht_next;
         } /* end if */
-
-    } /* for */
+    } /* end for */
 
     return 0;
 
@@ -321,7 +184,7 @@ error:
 /*-------------------------------------------------------------------------
  * Function:    mark_all_entries_investigated()
  *
- * Purpose:     Marks all entries in the cache with the tag H5AC__IGNORE_TAG,
+ * Purpose:     Marks all entries in the cache with the 'dirtied' flag,
  *              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
@@ -333,46 +196,83 @@ error:
  * Programmer:  Mike McGreevy
  *              February 3, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static int mark_all_entries_investigated(hid_t fid)
+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 */
+    H5F_t *f;           /* File Pointer */
+    H5C_t *cache_ptr;   /* Cache Pointer */
+    int i;              /* Iterator */
 
     /* Get Internal File / Cache Pointers */
-    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    if(NULL == (f = (H5F_t *)H5I_object(fid)))
+        TEST_ERROR;
     cache_ptr = f->shared->cache;
 
-    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        H5C_cache_entry_t *entry_ptr;      /* entry pointer */
 
-        next_entry_ptr = cache_ptr->index[i];
+        entry_ptr = cache_ptr->index[i];
+        while(entry_ptr != NULL) {
+            if(!entry_ptr->dirtied)
+                entry_ptr->dirtied = TRUE;
 
-        while (next_entry_ptr != NULL) {
+            entry_ptr = entry_ptr->ht_next;
+        } /* end if */
+    } /* end for */
 
-            if ( next_entry_ptr->tag != H5AC__IGNORE_TAG ) {
+    return 0;
 
-                    next_entry_ptr->tag = H5AC__IGNORE_TAG;
+error:
+    return -1;
+} /* mark_all_entries_investigated */
 
-            } /* end if */
+

+/*-------------------------------------------------------------------------
+ * Function:    reset_all_entries_investigated()
+ *
+ * Purpose:     Resets all entries in the cache with the 'dirtied' flag,
+ *              which is a convention in this test file that indicates that
+ *              a tag has been checked and is valid. This resets the cache back
+ *              to the same state as just after a flush call.
+ *
+ * Return:      0 on Success, -1 on Failure
+ *
+ * Programmer:  Quincey Koziol
+ *              July 13, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+reset_all_entries_investigated(hid_t fid)
+{
+    H5F_t *f;           /* File Pointer */
+    H5C_t *cache_ptr;   /* Cache Pointer */
+    int i;              /* Iterator */
+
+    /* Get Internal File / Cache Pointers */
+    if(NULL == (f = (H5F_t *)H5I_object(fid)))
+        TEST_ERROR;
+    cache_ptr = f->shared->cache;
 
-            next_entry_ptr = next_entry_ptr->ht_next;
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        H5C_cache_entry_t *entry_ptr;      /* entry pointer */
 
-        } /* end if */
+        entry_ptr = cache_ptr->index[i];
+        while(entry_ptr != NULL) {
+            if(entry_ptr->dirtied)
+                entry_ptr->dirtied = FALSE;
 
-    } /* for */
+            entry_ptr = entry_ptr->ht_next;
+        } /* end if */
+    } /* end for */
 
     return 0;
 
 error:
     return -1;
-
-} /* mark_all_entries_investigated */
+} /* reset_all_entries_investigated */
 
 

 /*-------------------------------------------------------------------------
@@ -381,8 +281,8 @@ error:
  * 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 
+ *              set the entry's flush_marker flag, so future verification 
+ *              attempts can skip over this entry, knowing it has already been 
  *              checked.
  *
  * Return:      0 on Success, -1 on Failure
@@ -390,66 +290,58 @@ error:
  * Programmer:  Mike McGreevy
  *              January 25, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static int verify_tag(hid_t fid, int id, haddr_t tag)
+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 */
+    H5F_t *f;                   /* File Pointer */
+    H5C_t *cache_ptr;           /* Cache Pointer */
+    int i;                      /* Iterator */
 
     /* Get Internal File / Cache Pointers */
-    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    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];
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        H5C_cache_entry_t *entry_ptr; /* entry pointer */
 
-        while (next_entry_ptr != NULL) {
+        entry_ptr = cache_ptr->index[i];
+        while(entry_ptr != NULL) {
+            if(entry_ptr->type->id == id && !entry_ptr->dirtied) {
+                if(entry_ptr->tag_info->tag != tag)
+                    TEST_ERROR;
 
-            if ( (next_entry_ptr->type->id == id) && (next_entry_ptr->tag != H5AC__IGNORE_TAG) ) {
-                
-                if (!found) {
+                /* Mark the entry/tag pair as found */
+                entry_ptr->dirtied = TRUE;
 
-                    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;
-
-                }
-    
+                /* leave now that we've found the entry */
+                goto done;
             } /* end if */
 
-            next_entry_ptr = next_entry_ptr->ht_next;
-
+            entry_ptr = entry_ptr->ht_next;
         } /* end if */
+    } /* end for */
 
-    } /* for */
-
-    if (found == FALSE) 
-        TEST_ERROR;
+    /* Didn't find the tagged entry, throw an error */
+    TEST_ERROR;
     
+done:
     return 0;
 
 error:
     return -1;
 } /* verify_tag */
 
-static int evict_entries(hid_t fid)
+static int
+evict_entries(hid_t fid)
 {
-
-    H5F_t * f = NULL;         /* File Pointer */
+    H5F_t *f;         /* File Pointer */
 
     /* Get Internal File / Cache Pointers */
-    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    if(NULL == (f = (H5F_t *)H5I_object(fid)))
+        TEST_ERROR;
 
     /* Mark all entries investigated */
     mark_all_entries_investigated(fid);
@@ -462,71 +354,66 @@ static int evict_entries(hid_t fid)
     return 0;
 
 error:
-
     return -1;
-
 } /* evict entries */
 
 

 /*-------------------------------------------------------------------------
- * Function:    get_new_object_header_tag()
+ * Function:    get_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.
+ * Purpose:     This function retrieves the tag associated with an object.
  *
  * 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)
+static int
+get_object_header_tag(hid_t loc_id, 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 */
+    H5O_info_t oinfo;           /* Object info */
 
-    /* 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 */
+    /* Retrieve the info for the object */
+    if(H5Oget_info(loc_id, &oinfo) < 0)
+        TEST_ERROR;
 
-            next_entry_ptr = next_entry_ptr->ht_next;
+    /* Set the tag to return */
+    *tag = oinfo.addr;
 
-        } /* end if */
+    return 0;
 
-        if (found) break;
+error:
+    return -1;
+} /* get_object_header_tag */
 
-    } /* end for */
+

+/*-------------------------------------------------------------------------
+ * Function:    get_sbe_tag()
+ *
+ * Purpose:     This function retrieves the tag associated with the superblock
+ *		extension (the object header address stored in the superblock)
+ *
+ * Return:      0 on Success; 1 on Failure
+ *
+ * Programmer:  Quincey Koziol
+ *              July 10, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+get_sbe_tag(hid_t fid, haddr_t *tag)
+{
+    /* Retrieve the superblock extension's object header address for the file */
+    if(H5F_get_sbe_addr_test(fid, tag) < 0)
+        TEST_ERROR;
 
-    if (found == FALSE) TEST_ERROR;
-    
     return 0;
 
 error:
     return -1;
-} /* get_new_object_header_tag */
+} /* get_sbe_tag */
 
 /* ============== */
 /* Test Functions */
@@ -544,8 +431,6 @@ error:
  * Programmer:  Mike McGreevy
  *              January 25, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -563,32 +448,35 @@ check_file_creation_tags(hid_t fcpl_id, int type)
     /* Create a test file with provided fcpl_t */
     if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen before verification . */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
-    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;
+    /* verify there is a superblock entry with superblock tag */
+    if ( verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
 
-    } else if ( type == TEST_SHMESG ) {
+    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;
+        if ( get_sbe_tag(fid, &sbe_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 object header belonging to superblock extension */
+        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 there is a superblock entry with superblock tag */
-    if ( verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header belonging to superblock extension */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_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;
@@ -599,6 +487,9 @@ check_file_creation_tags(hid_t fcpl_id, int type)
     /* verify no other cache entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* Close the file */
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
 
@@ -607,7 +498,6 @@ check_file_creation_tags(hid_t fcpl_id, int type)
 
 error:
     return 1;
-
 } /* check_file_creation_tags */
 
 

@@ -622,8 +512,6 @@ error:
  * Programmer:  Mike McGreevy
  *              January 25, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -645,19 +533,14 @@ check_file_open_tags(hid_t fcpl, int type)
     /* 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;
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
-    } else if ( type == TEST_SHMESG ) {
+    /* Retrieve various tags */
+    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;
+        /* determine tag value of superblock extension object header */
+        if ( get_sbe_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
 
     } /* end if */
     
@@ -673,8 +556,10 @@ check_file_open_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen before verification . */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* verify there is a superblock entry with superblock tag. */
     if ( verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
@@ -701,6 +586,9 @@ check_file_open_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* ========== */
     /* Close file */
     /* ========== */
@@ -730,12 +618,10 @@ error:
  * Programmer:  Mike McGreevy
  *              January 27, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_group_creation_tags(hid_t fcpl, int type)
+check_group_creation_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;          /* File Identifier */
@@ -743,7 +629,6 @@ check_group_creation_tags(hid_t fcpl, int type)
     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");
@@ -753,23 +638,10 @@ check_group_creation_tags(hid_t fcpl, int type)
     /* ===== */
 
     /* 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;
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file */
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
@@ -788,8 +660,10 @@ check_group_creation_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
  
     /* Verify root group's tagged metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -798,13 +672,17 @@ check_group_creation_tags(hid_t fcpl, int type)
     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 ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
+    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 cache entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -835,12 +713,10 @@ error:
  * Programmer:  Mike McGreevy
  *              March 2, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_multi_group_creation_tags(hid_t fcpl, int type)
+check_multi_group_creation_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;          /* File Identifier */
@@ -849,9 +725,8 @@ check_multi_group_creation_tags(hid_t fcpl, int type)
     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 */
+    haddr_t g_tag = 0;       /* Group tag value */
+    haddr_t root_tag = 0;    /* Root group tag value */
 
     /* Testing Macro */
     TESTING("tag application during multiple group creation");
@@ -866,30 +741,17 @@ check_multi_group_creation_tags(hid_t fcpl, int type)
     /* 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;
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
-    /* Clear Metadata Tags (don't care about them for this test */
+    /* Clear Metadata Tags (don't care about them for this test) */
     mark_all_entries_investigated(fid);
 
-    /* ============ */
-    /* Create Group */
-    /* ============ */
+    /* ============= */
+    /* Create Groups */
+    /* ============= */
 
     for (i = 0; i < MULTIGROUPS; i++) {
 
@@ -903,19 +765,35 @@ check_multi_group_creation_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* 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;
+        /* Re-open the group */
+        sprintf(gname, "%d", i);
+        if ( (gid = H5Gopen2(fid, gname, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+        /* Verify object header for root group */
+        /* ('dirtied' flag on entry gets cleared with each open operation) */
+        if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+
+        /* Retrieve the object address for the group */
+        if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
+        /* Verify object header for group */
+        if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* Close the group */
+        if ( H5Gclose(gid) < 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;
+    if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, root_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;
@@ -930,6 +808,9 @@ check_multi_group_creation_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -959,8 +840,6 @@ error:
  * Programmer:  Mike McGreevy
  *              March 2, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -986,7 +865,7 @@ check_link_iteration_tags(void)
     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;
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Create dataspace */
     if ( (sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
@@ -1003,9 +882,6 @@ check_link_iteration_tags(void)
     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);
 
@@ -1023,22 +899,28 @@ check_link_iteration_tags(void)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
+
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
 
     /* Verify 112 symbol table nodes belonging to the root group */
-    for (i = 0; i < 112; i++) {
+    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++) {
+    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;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1070,8 +952,6 @@ error:
  * Programmer:  Mike McGreevy
  *              March 2, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -1086,9 +966,9 @@ check_dense_attribute_tags(void)
     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 */
+    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");
@@ -1105,8 +985,8 @@ check_dense_attribute_tags(void)
     /* =========== */
     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;
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Create dataspace */
     if ( (sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
@@ -1116,7 +996,7 @@ check_dense_attribute_tags(void)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
     
     /* get dataset object header */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &d_tag) < 0 ) TEST_ERROR;
     
     /* Clear Metadata Tags (don't care about them for this test */
     mark_all_entries_investigated(fid);
@@ -1138,12 +1018,17 @@ check_dense_attribute_tags(void)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* 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;
+    if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header belonging to dataset */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
 
     /* verify fractal heap header belonging to dataset */
     if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0 ) TEST_ERROR;
@@ -1151,7 +1036,6 @@ check_dense_attribute_tags(void)
     /* 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;
@@ -1162,6 +1046,9 @@ check_dense_attribute_tags(void)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1189,8 +1076,13 @@ check_dense_attribute_tags(void)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
+
+    /* verify object header belonging to dataset */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
 
     /* verify fractal heap header belonging to dataset */
     if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0 ) TEST_ERROR;
@@ -1209,6 +1101,9 @@ check_dense_attribute_tags(void)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1240,19 +1135,16 @@ error:
  * Programmer:  Mike McGreevy
  *              January 27, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_group_open_tags(hid_t fcpl, int type)
+check_group_open_tags(void)
 {
     /* 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 */
@@ -1263,29 +1155,16 @@ check_group_open_tags(hid_t fcpl, int type)
     /* ===== */
 
     /* 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;
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close Group */
     if (H5Gclose(gid) < 0) TEST_ERROR;
@@ -1307,8 +1186,10 @@ check_group_open_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -1322,6 +1203,9 @@ check_group_open_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1352,8 +1236,6 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -1366,7 +1248,6 @@ check_attribute_creation_tags(hid_t fcpl, int type)
     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 */
@@ -1381,27 +1262,14 @@ check_attribute_creation_tags(hid_t fcpl, int type)
     /* 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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file and group */
     if ( H5Gclose(gid) < 0 ) TEST_ERROR;
@@ -1424,8 +1292,10 @@ check_attribute_creation_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* verify object header belonging to group */
     if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
@@ -1449,8 +1319,8 @@ check_attribute_creation_tags(hid_t fcpl, int type)
         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;
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__SOHM_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;
@@ -1461,6 +1331,9 @@ check_attribute_creation_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
     
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1492,8 +1365,6 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -1506,7 +1377,6 @@ check_attribute_open_tags(hid_t fcpl, int type)
     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 */
@@ -1521,27 +1391,14 @@ check_attribute_open_tags(hid_t fcpl, int type)
     /* 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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Create attribute dataspace */
     if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
@@ -1571,8 +1428,10 @@ check_attribute_open_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* verify object header belonging to group */
     if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
@@ -1603,6 +1462,9 @@ check_attribute_open_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1634,10 +1496,6 @@ error:
  * 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 
@@ -1649,13 +1507,13 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     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 */
+    int *data = NULL;                       /* 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 */
+    hbool_t persistant_fsms = FALSE;
 
     /* Testing Macro */
     TESTING("tag application during attribute renaming");
@@ -1664,30 +1522,24 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     /* 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 ) {
+    /* check to see if the FCPL specified persistant free space managers */
+    if(H5Pget_file_space_strategy(fcpl, NULL, &persistant_fsms, NULL) < 0)
+        TEST_ERROR;
 
-        /* determine tag value of root group's object header */
-        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) 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;
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Set up attribute dataspace */
     if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
@@ -1696,12 +1548,9 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to attribute */
     if ( H5Awrite(aid, H5T_NATIVE_INT, data) < 0 ) TEST_ERROR;
@@ -1712,6 +1561,7 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     /* 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;
 
@@ -1728,8 +1578,10 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -1764,9 +1616,18 @@ check_attribute_rename_tags(hid_t fcpl, int type)
 	 * 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 
+	 *   one freespace section info 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;
+
+        /* If the free space managers are persistant, the
+         * H5MF_tidy_self_referential_fsm_hack() must have been run.
+         * Since this function floats all self referential free space
+         * managers, the H5FD_MEM_SUPER FSM will not be in the metadata
+         * cache.
+         */
+        if(!persistant_fsms && verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0) TEST_ERROR;
+        if(!persistant_fsms && 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, g_tag) < 0 ) TEST_ERROR;
@@ -1777,6 +1638,9 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1788,10 +1652,14 @@ check_attribute_rename_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_attribute_rename_tags */
 
@@ -1807,10 +1675,6 @@ error:
  * 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 
@@ -1822,13 +1686,13 @@ check_attribute_delete_tags(hid_t fcpl, int type)
     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 */
+    int *data = NULL;                       /* 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 */
+    hbool_t persistant_fsms = FALSE;
 
     /* Testing Macro */
     TESTING("tag application during attribute delete");
@@ -1837,30 +1701,24 @@ check_attribute_delete_tags(hid_t fcpl, int type)
     /* 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;
+    /* check to see if the FCPL specified persistant free space managers */
+    if ( H5Pget_file_space_strategy(fcpl, NULL, &persistant_fsms, NULL) < 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
 
-        /* determine tag value of root group's object header */
-        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Set up attribute dataspace */
     if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
@@ -1869,12 +1727,9 @@ check_attribute_delete_tags(hid_t fcpl, int type)
     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 */
+    for(i = 0;i < DIMS; i++)
+        for(j = 0;j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to attribute */
     if ( (H5Awrite(aid, H5T_NATIVE_INT, data)) < 0 ) TEST_ERROR;
@@ -1901,8 +1756,10 @@ check_attribute_delete_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* verify object header belonging to group */
     if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
@@ -1913,18 +1770,35 @@ check_attribute_delete_tags(hid_t fcpl, int type)
         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;
+         * 2 calls to verify_tag() for verifying free space: 
+         *   one freespace header tag for free-space header,
+         *   one freespace header tag for free-space section info
+         */
+        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;
+
+#if 0
+        /* If the free space managers are persistant, the 
+         * H5MF_tidy_self_referential_fsm_hack() must have been run.
+         * Since this function floats all self referential free space 
+         * managers, the H5FD_MEM_SUPER FSM will not be in the metadata 
+         * cache.
+         */
+        if ( ( ! persistant_fsms ) && 
+             ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) )
+            TEST_ERROR;
+#endif
 
     } /* end if */
 
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -1936,10 +1810,14 @@ check_attribute_delete_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_attribute_delete_tags */
 
@@ -1955,8 +1833,6 @@ error:
  * Programmer:  Mike McGreevy
  *              February 10, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -1971,7 +1847,6 @@ check_dataset_creation_tags(hid_t fcpl, int type)
     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 */
@@ -1985,21 +1860,8 @@ check_dataset_creation_tags(hid_t fcpl, int type)
 
     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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file */
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
@@ -2032,8 +1894,10 @@ check_dataset_creation_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -2042,7 +1906,10 @@ check_dataset_creation_tags(hid_t fcpl, int type)
     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 ( get_object_header_tag(did, &d_tag) < 0 ) TEST_ERROR;
+
+    /* Verify object header for group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
 
     if ( type == TEST_SHMESG ) {
 
@@ -2060,6 +1927,9 @@ check_dataset_creation_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2090,8 +1960,6 @@ error:
  * Programmer:  Mike McGreevy
  *              March 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -2106,7 +1974,6 @@ check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
     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 */
@@ -2121,21 +1988,8 @@ check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
 
     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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file */
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
@@ -2167,8 +2021,10 @@ check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -2177,7 +2033,10 @@ check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
     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 ( get_object_header_tag(did, &d_tag) < 0 ) TEST_ERROR;
+
+    /* Verify object header for group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
 
     if ( type == TEST_SHMESG ) {
 
@@ -2199,6 +2058,9 @@ check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2229,12 +2091,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 10, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_dataset_open_tags(hid_t fcpl, int type)
+check_dataset_open_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;                         /* File Identifier */
@@ -2245,7 +2105,6 @@ check_dataset_open_tags(hid_t fcpl, int type)
     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 */
@@ -2258,23 +2117,10 @@ check_dataset_open_tags(hid_t fcpl, int type)
     /* ========= */
 
     /* 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;
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Set up creation property list */
     dcpl = H5Pcreate(H5P_DATASET_CREATE);
@@ -2293,7 +2139,7 @@ check_dataset_open_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &d_tag) < 0 ) TEST_ERROR;
 
     /* Close Dataset */
     if (H5Dclose(did) < 0 ) TEST_ERROR;
@@ -2315,8 +2161,10 @@ check_dataset_open_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -2330,6 +2178,9 @@ check_dataset_open_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2360,12 +2211,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 10, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_dataset_write_tags(hid_t fcpl, int type)
+check_dataset_write_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;                         /* File Identifier */
@@ -2376,12 +2225,11 @@ check_dataset_write_tags(hid_t fcpl, int type)
     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 dims1[2] = {DIMS, DIMS};        /* dimensions */
     hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
-    int i,j,k = 0;           /* iterators */
-    int data[DIMS][DIMS];
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
 
     /* Testing Macro */
     TESTING("tag application during dataset write");
@@ -2390,24 +2238,14 @@ check_dataset_write_tags(hid_t fcpl, int type)
     /* 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
 
-        /* determine tag value of root group's object header */
-        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Set up creation property list */
     dcpl = H5Pcreate(H5P_DATASET_CREATE);
@@ -2426,7 +2264,7 @@ check_dataset_write_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &d_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file and dataset */
     if ( H5Dclose(did) < 0 ) TEST_ERROR;
@@ -2442,10 +2280,10 @@ check_dataset_write_tags(hid_t fcpl, int type)
     /* ============================== */
 
     /* fill out data buffer */
-    for(i=0;i<DIMS;i++) {
-        for(j=0;j<DIMS;j++) {
+    for(i = 0;i < DIMS; i++) {
+        for(j = 0;j < DIMS; j++) {
 
-            data[i][j] = k++;
+            data[(DIMS *i) + j] = k++;
         } /* end for */
     } /* end for */
 
@@ -2456,8 +2294,10 @@ check_dataset_write_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
  
     /* Verify 10 b-tree nodes belonging to dataset  */
     for (i=0; i<10; i++)
@@ -2469,6 +2309,9 @@ check_dataset_write_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2480,10 +2323,14 @@ check_dataset_write_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_dataset_write_tags */
 
@@ -2499,8 +2346,6 @@ error:
  * Programmer:  Mike McGreevy
  *              March 3, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -2512,10 +2357,9 @@ check_attribute_write_tags(hid_t fcpl, int type)
     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 */
+    int *data = NULL;                       /* 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 */
@@ -2527,30 +2371,20 @@ check_attribute_write_tags(hid_t fcpl, int type)
     /* Setup */
     /* ===== */
 
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
+
     /* 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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Create attribute dataspace */
     if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
@@ -2574,12 +2408,9 @@ check_attribute_write_tags(hid_t fcpl, int type)
     /* =========================== */
 
     /* fill out data buffer */
-    for(i=0;i<DIMS;i++) {
-        for(j=0;j<DIMS;j++) {
-
-            data[i][j] = k++;
-        } /* end for */
-    } /* end for */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0;j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write attribute */
     if ( (H5Awrite(aid, H5T_NATIVE_INT, data)) < 0 ) TEST_ERROR;
@@ -2588,8 +2419,10 @@ check_attribute_write_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
  
     /* Verify object header of group */
     if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
@@ -2623,6 +2456,9 @@ check_attribute_write_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2635,10 +2471,14 @@ check_attribute_write_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_attribute_write_tags */
 
@@ -2654,12 +2494,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 10, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_dataset_read_tags(hid_t fcpl, int type)
+check_dataset_read_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;                         /* File Identifier */
@@ -2670,12 +2508,11 @@ check_dataset_read_tags(hid_t fcpl, int type)
     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 dims1[2] = {DIMS, DIMS};        /* dimensions */
     hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
-    int i,j,k = 0;           /* iterators */
-    int data[DIMS][DIMS];
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
 
     /* Testing Macro */
     TESTING("tag application during dataset read");
@@ -2684,24 +2521,14 @@ check_dataset_read_tags(hid_t fcpl, int type)
     /* 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
 
-        /* determine tag value of root group's object header */
-        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Set up creation property list */
     dcpl = H5Pcreate(H5P_DATASET_CREATE);
@@ -2720,15 +2547,12 @@ check_dataset_read_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to dataset */
     if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
@@ -2752,8 +2576,10 @@ check_dataset_read_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
  
     /* Verify 19 b-tree nodes belonging to dataset  */
     for (i=0; i<19; i++)
@@ -2762,6 +2588,9 @@ check_dataset_read_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2773,10 +2602,14 @@ check_dataset_read_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_dataset_read_tags */
 
@@ -2792,12 +2625,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_dataset_size_retrieval(hid_t fcpl, int type)
+check_dataset_size_retrieval(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;                         /* File Identifier */
@@ -2808,12 +2639,11 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     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 dims1[2] = {DIMS, DIMS};        /* dimensions */
     hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
-    int i,j,k = 0;           /* iterators */
-    int data[DIMS][DIMS];
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
     hsize_t dsize = 0;
 
     /* Testing Macro */
@@ -2823,24 +2653,14 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     /* 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) 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;
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Set up creation property list */
     dcpl = H5Pcreate(H5P_DATASET_CREATE);
@@ -2859,15 +2679,12 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to dataset */
     if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
@@ -2891,8 +2708,10 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify 19 b-tree nodes belonging to dataset  */
     for (i=0; i<19; i++)
@@ -2901,6 +2720,9 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -2912,10 +2734,14 @@ check_dataset_size_retrieval(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_dataset_size_retrieval */
 
@@ -2931,12 +2757,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_dataset_extend_tags(hid_t fcpl, int type)
+check_dataset_extend_tags(void)
 {
 
     /* Variable Declarations */
@@ -2948,13 +2772,12 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     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 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 */
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
+    hsize_t newdims[2] = {DIMS*2, DIMS};    /* dimensions */
 
     /* Testing Macro */
     TESTING("tag application during dataset extend");
@@ -2963,24 +2786,14 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     /* 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
 
-        /* determine tag value of root group's object header */
-        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Set up creation property list */
     dcpl = H5Pcreate(H5P_DATASET_CREATE);
@@ -2999,15 +2812,12 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to dataset */
     if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
@@ -3033,8 +2843,10 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
@@ -3042,6 +2854,9 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3052,10 +2867,14 @@ check_dataset_extend_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_dataset_extend_tags */
 
@@ -3071,19 +2890,16 @@ error:
  * Programmer:  Mike McGreevy
  *              March 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_object_info_tags(hid_t fcpl, int type)
+check_object_info_tags(void)
 {
     /* 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 */    
 
@@ -3094,30 +2910,17 @@ check_object_info_tags(hid_t fcpl, int type)
     /* 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;
+    /* Create a test file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close Group */
     if (H5Gclose(gid) < 0) TEST_ERROR;
@@ -3139,8 +2942,10 @@ check_object_info_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group's tagged metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -3156,6 +2961,9 @@ check_object_info_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3185,19 +2993,16 @@ error:
  * Programmer:  Mike McGreevy
  *              March 3, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_object_copy_tags(hid_t fcpl, int type)
+check_object_copy_tags(void)
 {
     /* 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;
 
@@ -3208,30 +3013,17 @@ check_object_copy_tags(hid_t fcpl, int type)
     /* 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;
+    /* Create a test file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close Group */
     if (H5Gclose(gid) < 0) TEST_ERROR;
@@ -3247,14 +3039,21 @@ check_object_copy_tags(hid_t fcpl, int type)
     /* Copy Group */
     /* =========== */
 
-    H5Ocopy(fid, GROUPNAME, fid, GROUPNAMECOPY, H5P_DEFAULT, H5P_DEFAULT);
+    if ( H5Ocopy(fid, GROUPNAME, fid, GROUPNAMECOPY, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR;
 
+    /* Get tag for copied group */
+    if ( (gid = H5Gopen2(fid, GROUPNAMECOPY, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(gid, &copy_tag) < 0 ) TEST_ERROR;
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+  
     /* =================================== */
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group's tagged metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -3262,19 +3061,22 @@ check_object_copy_tags(hid_t fcpl, int type)
     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 */
+    /* Verify group'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;
+    /* Verify copied group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, 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;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3304,8 +3106,6 @@ error:
  * Programmer:  Mike McGreevy
  *              March 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
@@ -3321,13 +3121,12 @@ check_link_removal_tags(hid_t fcpl, int type)
     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 dims1[2] = {DIMS, DIMS};        /* dimensions */
     hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
-    int i,j,k = 0;           /* iterators */
-    int data[DIMS][DIMS];
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
 
     /* Testing Macro */
     TESTING("tag application during link removal");
@@ -3336,30 +3135,20 @@ check_link_removal_tags(hid_t fcpl, int type)
     /* Setup */
     /* ===== */
 
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) TEST_ERROR;
+
     /* 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 */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close Group */
     if (H5Gclose(gid) < 0) TEST_ERROR;
@@ -3381,15 +3170,12 @@ check_link_removal_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to dataset */
     if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
@@ -3416,8 +3202,10 @@ check_link_removal_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group's tagged metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -3434,6 +3222,9 @@ check_link_removal_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3444,10 +3235,14 @@ check_link_removal_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_link_removal_tags */
 
@@ -3463,12 +3258,10 @@ error:
  * Programmer:  Mike McGreevy
  *              March 2, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_link_getname_tags(hid_t fcpl, int type)
+check_link_getname_tags(void)
 {
     /* Variable Declarations */
     char name[500];
@@ -3481,13 +3274,12 @@ check_link_getname_tags(hid_t fcpl, int type)
     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 dims1[2] = {DIMS, DIMS};        /* dimensions */
     hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
-    int i,j,k = 0;           /* iterators */
-    int data[DIMS][DIMS];
+    int i,j,k = 0;                          /* iterators */
+    int *data = NULL;                       /* data buffer */
 
     /* Testing Macro */
     TESTING("tag application during link name retrieval");
@@ -3496,30 +3288,20 @@ check_link_getname_tags(hid_t fcpl, int type)
     /* 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;
+    /* Allocate array */
+    if ( (NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))) ) 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;
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* 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;
+    if ( get_object_header_tag(gid, &g_tag) < 0 ) TEST_ERROR;
 
     /* Close Group */
     if (H5Gclose(gid) < 0) TEST_ERROR;
@@ -3541,15 +3323,12 @@ check_link_getname_tags(hid_t fcpl, int type)
     if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
 
     /* Retrieve tag associated with this dataset */
-    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    if ( get_object_header_tag(did, &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 */
+    for(i = 0; i < DIMS; i++)
+        for(j = 0; j < DIMS; j++)
+            data[(DIMS * i) + j] = k++;
 
     /* Write to dataset */
     if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
@@ -3574,8 +3353,10 @@ check_link_getname_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
     /* Verify root group's tagged metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -3586,6 +3367,9 @@ check_link_getname_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3596,10 +3380,14 @@ check_link_getname_tags(hid_t fcpl, int type)
     /* Finished Test. Print status and return. */
     /* ========================================== */
 
+    HDfree(data);
+
     PASSED();
     return 0;
 
 error:
+    if(data)
+        HDfree(data);
     return 1;
 } /* check_link_getname_tags */
 
@@ -3615,12 +3403,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_external_link_creation_tags(hid_t fcpl, int type)
+check_external_link_creation_tags(void)
 {
     /* Variable Declarations */
     hid_t fid = -1;                         /* File Identifier */
@@ -3628,7 +3414,6 @@ check_external_link_creation_tags(hid_t fcpl, int type)
     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");
@@ -3637,24 +3422,11 @@ check_external_link_creation_tags(hid_t fcpl, int type)
     /* 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;
+    /* Create a test file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Close and Reopen the file */
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
@@ -3683,8 +3455,10 @@ check_external_link_creation_tags(hid_t fcpl, int type)
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
  
     /* Verify root group metadata */
     if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
@@ -3695,6 +3469,9 @@ check_external_link_creation_tags(hid_t fcpl, int type)
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
 
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
@@ -3724,12 +3501,10 @@ error:
  * Programmer:  Mike McGreevy
  *              February 24, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned 
-check_external_link_open_tags(hid_t fcpl, int type)
+check_external_link_open_tags(void)
 {
     /* Variable Declarations */
     haddr_t link_tag = 0;                  /* link tag */
@@ -3739,7 +3514,7 @@ check_external_link_open_tags(hid_t fcpl, int type)
     hid_t xid = -1;                         /* Dataspace Identifier */
     int verbose = FALSE;                    /* verbose file outout */
     haddr_t root_tag = 0;
-    haddr_t sbe_tag = 0;
+    haddr_t root2_tag = 0;
 
     /* Testing Macro */
     TESTING("tag application during external link open");
@@ -3748,28 +3523,18 @@ check_external_link_open_tags(hid_t fcpl, int type)
     /* 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;
+    /* Create a test file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
-    } /* end if */
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
 
     /* Create a second file */
     if ( (fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
+    /* determine tag value of root group's object header */
+    if ( get_object_header_tag(fid2, &root2_tag) < 0 ) TEST_ERROR;
+
     /* Create group in second file */
     if ( (gid = H5Gcreate2(fid2, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
@@ -3792,27 +3557,50 @@ check_external_link_open_tags(hid_t fcpl, int type)
     /* ================== */
   
     if ( (xid = H5Gopen2(fid, LINKNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
-    if ( (H5Gclose(xid)) < 0 ) TEST_ERROR;
+    if ( (fid2 = H5Iget_file_id(xid)) < 0) TEST_ERROR;
+    if ( get_object_header_tag(xid, &link_tag) < 0 ) TEST_ERROR;
   
     /* =================================== */
     /* Verification of Metadata Tag Values */
     /* =================================== */
 
+#ifndef NDEBUG
     /* if verbose, print cache index to screen for visual verification */
-    if ( verbose ) print_index(fid);
+    if ( verbose ) dump_cache(fid);
+#endif /* NDEBUG */ /* end debugging functions */
 
-    /* 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 tag value of first file's root group */
+    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;
+
+    /* verify there is a superblock entry with superblock tag. */
+    if ( verify_tag(fid2, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
+
+    /* verify tag value of linked file's root group */
+    if ( verify_tag(fid2, H5AC_OHDR_ID, root2_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid2, H5AC_LHEAP_PRFX_ID, root2_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid2, H5AC_BT_ID, root2_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid2, H5AC_SNODE_ID, root2_tag) < 0 ) TEST_ERROR;
+
+    /* verify tag value of linked group's object header */
+    if ( verify_tag(fid2, H5AC_OHDR_ID, link_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid2, H5AC_LHEAP_PRFX_ID, link_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid2, H5AC_BT_ID, link_tag) < 0 ) TEST_ERROR;
 
     /* verify no other entries present */
     if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+    if ( verify_no_unknown_tags(fid2) < 0 ) TEST_ERROR;
+
+    /* Reset the changes we've made to the cache's data structures */
+    if(reset_all_entries_investigated(fid) < 0) TEST_ERROR;
+    if(reset_all_entries_investigated(fid2) < 0) TEST_ERROR;
 
     /* =========================== */
     /* Close open objects and file */
     /* =========================== */
-
+    if ( (H5Gclose(xid)) < 0 ) TEST_ERROR;
     if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid2) < 0 ) TEST_ERROR;
 
     /* ========================================== */
     /* Finished Test. Print status and return. */
@@ -3838,8 +3626,6 @@ error:
  * Programmer:  Mike McGreevy
  *              May 27, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static unsigned
@@ -3854,7 +3640,7 @@ check_invalid_tag_application(void)
     /* Testing Macro */
     TESTING("failure on invalid tag application");
     
-    #if H5C_DO_TAGGING_SANITY_CHECKS
+#if H5C_DO_TAGGING_SANITY_CHECKS
     /* Create a test file */
     if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
 
@@ -3895,10 +3681,10 @@ check_invalid_tag_application(void)
 
     /* Finished Test. Print status and return. */
     PASSED();
-    #else
+#else
     SKIPPED();
     printf("    test skipped because sanity checking on tag value is disabled.\n");
-    #endif
+#endif
 
     return 0;
 
@@ -3919,11 +3705,8 @@ error:
  * Programmer:  Mike McGreevy
  *              January 15, 2009
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
 int 
 main(void) 
 {
@@ -3948,7 +3731,7 @@ main(void)
     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);
+    H5Pset_file_space_strategy(fcpl_shmesg_all, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)0);
 
     /* ========= */
     /* Run Tests */
@@ -3974,9 +3757,6 @@ main(void)
         /* 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);
@@ -3984,21 +3764,24 @@ main(void)
         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_group_creation_tags();
+    if (!nerrs) nerrs += check_multi_group_creation_tags();
+    if (!nerrs) nerrs += check_group_open_tags();
+    if (!nerrs) nerrs += check_dataset_open_tags();
+    if (!nerrs) nerrs += check_dataset_write_tags();
+    if (!nerrs) nerrs += check_dataset_read_tags();
+    if (!nerrs) nerrs += check_dataset_size_retrieval();
+    if (!nerrs) nerrs += check_dataset_extend_tags();
+    if (!nerrs) nerrs += check_object_info_tags();
+    if (!nerrs) nerrs += check_object_copy_tags();
+    if (!nerrs) nerrs += check_link_getname_tags();
+    if (!nerrs) nerrs += check_external_link_creation_tags();
+    if (!nerrs) nerrs += check_external_link_open_tags();
+    
     if (!nerrs) nerrs += check_dense_attribute_tags();
     if (!nerrs) nerrs += check_link_iteration_tags();
     if (!nerrs) nerrs += check_invalid_tag_application();
diff --git a/test/chunk_info.c b/test/chunk_info.c
index 68bf774..1f19963 100644
--- a/test/chunk_info.c
+++ b/test/chunk_info.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/cmpd_dset.c b/test/cmpd_dset.c
index 22bf3a2..5d6cfc7 100644
--- a/test/cmpd_dset.c
+++ b/test/cmpd_dset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -102,15 +100,18 @@ typedef struct {
     float f, g, h[16], i, j;
     double k, l, m, n;
 } stype1;
+
 typedef struct {
     int a, b, c[8], d, e;
     float f, g, h[16], i, j;
     double k, l, m, n;
     long o, p, q;
 } stype2;
+
 typedef struct {
     int a, b, c[8], d, e;
 } stype3;
+
 typedef struct {
     int a, b, c[8], d, e;
     float f, g, h[16], i, j;
@@ -147,34 +148,32 @@ typedef struct {
  *              Moved this part of code from MAIN to TEST_COMPOUND function.
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_compound (char *filename, hid_t fapl)
 {
     /* First dataset */
-    static s1_t		s1[NX*NY];
+    s1_t		*s1 = NULL;
     hid_t		s1_tid;
 
     /* Second dataset */
-    static s2_t		s2[NX*NY];
+    s2_t		*s2 = NULL;
     hid_t		s2_tid;
 
     /* Third dataset */
-    static s3_t		s3[NX*NY];
+    s3_t		*s3 = NULL;
     hid_t		s3_tid;
 
     /* Fourth dataset */
-    static s4_t		s4[NX*NY];
+    s4_t		*s4 = NULL;
     hid_t		s4_tid;
 
     /* Fifth dataset */
-    static s5_t		s5[NX*NY];
+    s5_t		*s5 = NULL;
     hid_t		s5_tid;
 
-    static s6_t		s6[NX*NY];
-    hid_t		s6_tid;
-
-
     /* Sixth dataset */
+    s6_t		*s6 = NULL;
+    hid_t		s6_tid;
 
     /* Seventh dataset */
     hid_t		s7_sid;
@@ -201,6 +200,20 @@ test_compound (char *filename, hid_t fapl)
     hsize_t		memb_size[1] = {4};
     int			ret_code;
 
+    /* Allocate buffers for datasets */
+    if(NULL == (s1 = (s1_t *)HDmalloc(sizeof(s1_t) * NX * NY)))
+        goto error;
+    if(NULL == (s2 = (s2_t *)HDmalloc(sizeof(s2_t) * NX * NY)))
+        goto error;
+    if(NULL == (s3 = (s3_t *)HDmalloc(sizeof(s3_t) * NX * NY)))
+        goto error;
+    if(NULL == (s4 = (s4_t *)HDmalloc(sizeof(s4_t) * NX * NY)))
+        goto error;
+    if(NULL == (s5 = (s5_t *)HDmalloc(sizeof(s5_t) * NX * NY)))
+        goto error;
+    if(NULL == (s6 = (s6_t *)HDmalloc(sizeof(s6_t) * NX * NY)))
+        goto error;
+
     /* Create the file */
     if ((file = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) {
 	goto error;
@@ -845,11 +858,34 @@ test_compound (char *filename, hid_t fapl)
     H5Dclose (dataset);
     H5Fclose (file);
 
+    /* Release buffers */
+    HDfree(s1);
+    HDfree(s2);
+    HDfree(s3);
+    HDfree(s4);
+    HDfree(s5);
+    HDfree(s6);
+
     PASSED();
     return 0;
 
 error:
     puts("*** DATASET TESTS FAILED ***");
+
+    /* Release resources */
+    if(s1) 
+        HDfree(s1);
+    if(s2) 
+        HDfree(s2);
+    if(s3) 
+        HDfree(s3);
+    if(s4) 
+        HDfree(s4);
+    if(s5) 
+        HDfree(s5);
+    if(s6) 
+        HDfree(s6);
+
     return 1;
 }
 
@@ -868,31 +904,31 @@ error:
  *-------------------------------------------------------------------------
  */
 static void
-initialize_stype1(unsigned char *buf, const size_t num)
+initialize_stype1(unsigned char *buf, size_t num)
 {
     int	  i, j;
     stype1 *s_ptr;
 
-    for (i=0; i<(int)num; i++) {
-	s_ptr = (stype1*)buf + i;
-	s_ptr->a    = i*8+0;
-	s_ptr->b    = i*8+1;
-        for(j=0; j<8; j++)
-	    s_ptr->c[j] = i*8+j;
-	s_ptr->d    = i*8+6;
-	s_ptr->e    = i*8+7;
-
-        s_ptr->f    = i*2/3;
-        s_ptr->g    = i*2/3+1;
-        for(j=0; j<16; j++)
-	    s_ptr->h[j] = i*j/5+j;
-        s_ptr->i    = i*2/3+2;
-        s_ptr->j    = i*2/3+3;
-
-        s_ptr->k    = i/7+1;
-        s_ptr->l    = i/7+2;
-        s_ptr->m    = i/7+3;
-        s_ptr->n    = i/7+4;
+    for(i = 0; i < (int)num; i++) {
+	s_ptr = (stype1 *)buf + i;
+	s_ptr->a    = i * 8 + 0;
+	s_ptr->b    = i * 8 + 1;
+        for(j = 0; j < 8; j++)
+	    s_ptr->c[j] = i * 8 + j;
+	s_ptr->d    = i * 8 + 6;
+	s_ptr->e    = i * 8 + 7;
+
+        s_ptr->f    = (float)(i * 2 / 3);
+        s_ptr->g    = (float)(i * 2 / 3 + 1);
+        for(j = 0; j < 16; j++)
+	    s_ptr->h[j] = (float)(i * j / 5 + j);
+        s_ptr->i    = (float)(i * 2 / 3 + 2);
+        s_ptr->j    = (float)(i * 2 / 3 + 3);
+
+        s_ptr->k    = i / 7 + 1;
+        s_ptr->l    = i / 7 + 2;
+        s_ptr->m    = i / 7 + 3;
+        s_ptr->n    = i / 7 + 4;
     }
 }
 
@@ -911,35 +947,35 @@ initialize_stype1(unsigned char *buf, const size_t num)
  *-------------------------------------------------------------------------
  */
 static void
-initialize_stype2(unsigned char *buf, const size_t num)
+initialize_stype2(unsigned char *buf, size_t num)
 {
     size_t i, j;
     stype2 *s_ptr;
 
-    for (i=0; i<num; i++) {
-	s_ptr = (stype2*)buf + i;
-	s_ptr->a    = i*8+0;
-	s_ptr->b    = i*8+1;
-        for(j=0; j<8; j++)
-	    s_ptr->c[j] = i*8+j;
-	s_ptr->d    = i*8+6;
-	s_ptr->e    = i*8+7;
-
-        s_ptr->f    = i*2/3;
-        s_ptr->g    = i*2/3+1;
-        for(j=0; j<16; j++)
-	    s_ptr->h[j] = i*j/5+j;
-        s_ptr->i    = i*2/3+2;
-        s_ptr->j    = i*2/3+3;
-
-        s_ptr->k    = i/7+1;
-        s_ptr->l    = i/7+2;
-        s_ptr->m    = i/7+3;
-        s_ptr->n    = i/7+4;
-
-        s_ptr->o    = i*3+0;
-        s_ptr->p    = i*3+1;
-        s_ptr->q    = i*3+2;
+    for(i = 0; i < num; i++) {
+	s_ptr = (stype2 *)buf + i;
+	s_ptr->a    = (int)(i * 8 + 0);
+	s_ptr->b    = (int)(i * 8 + 1);
+        for(j = 0; j < 8; j++)
+	    s_ptr->c[j] = (int)(i * 8 + j);
+	s_ptr->d    = (int)(i * 8 + 6);
+	s_ptr->e    = (int)(i * 8 + 7);
+
+        s_ptr->f    = (float)(i * 2 / 3);
+        s_ptr->g    = (float)(i * 2 / 3 + 1);
+        for(j = 0; j < 16; j++)
+	    s_ptr->h[j] = (float)(i * j / 5 + j);
+        s_ptr->i    = (float)(i * 2 / 3 + 2);
+        s_ptr->j    = (float)(i * 2 / 3 + 3);
+
+        s_ptr->k    = (double)(i / 7 + 1);
+        s_ptr->l    = (double)(i / 7 + 2);
+        s_ptr->m    = (double)(i / 7 + 3);
+        s_ptr->n    = (double)(i / 7 + 4);
+
+        s_ptr->o    = (long)(i * 3 + 0);
+        s_ptr->p    = (long)(i * 3 + 1);
+        s_ptr->q    = (long)(i * 3 + 2);
     }
 }
 
@@ -958,19 +994,19 @@ initialize_stype2(unsigned char *buf, const size_t num)
  *-------------------------------------------------------------------------
  */
 static void
-initialize_stype3(unsigned char *buf, const size_t num)
+initialize_stype3(unsigned char *buf, size_t num)
 {
     int	  i, j;
     stype3 *s_ptr;
 
-    for (i=0; i<(int)num; i++) {
-	s_ptr = (stype3*)buf + i;
-	s_ptr->a    = i*8+0;
-	s_ptr->b    = i*8+1;
-        for(j=0; j<8; j++)
-	    s_ptr->c[j] = i*8+j;
-	s_ptr->d    = i*8+6;
-	s_ptr->e    = i*8+7;
+    for(i = 0; i < (int)num; i++) {
+	s_ptr = (stype3 *)buf + i;
+	s_ptr->a    = i * 8 + 0;
+	s_ptr->b    = i * 8 + 1;
+        for(j = 0; j < 8; j++)
+	    s_ptr->c[j] = i * 8 + j;
+	s_ptr->d    = i * 8 + 6;
+	s_ptr->e    = i * 8 + 7;
     }
 }
 
@@ -989,39 +1025,39 @@ initialize_stype3(unsigned char *buf, const size_t num)
  *-------------------------------------------------------------------------
  */
 static void
-initialize_stype4(unsigned char *buf, const size_t num)
+initialize_stype4(unsigned char *buf, size_t num)
 {
     size_t i, j;
     stype4 *s_ptr;
 
-    for (i=0; i<num; i++) {
-	s_ptr = (stype4*)buf + i;
-	s_ptr->a    = i*8+0;
-	s_ptr->b    = i*8+1;
-        for(j=0; j<8; j++)
-	    s_ptr->c[j] = i*8+j;
-	s_ptr->d    = i*8+6;
-	s_ptr->e    = i*8+7;
-
-        s_ptr->f    = i*2/3;
-        s_ptr->g    = i*2/3+1;
-        for(j=0; j<16; j++)
-	    s_ptr->h[j] = i*j/5+j;
-        s_ptr->i    = i*2/3+2;
-        s_ptr->j    = i*2/3+3;
-
-        s_ptr->k    = i/7+1;
-        s_ptr->l    = i/7+2;
-        s_ptr->m    = i/7+3;
-        s_ptr->n    = i/7+4;
-
-        s_ptr->o    = i*3+0;
-        s_ptr->p    = i*3+1;
-        s_ptr->q    = i*3+2;
-
-        s_ptr->r    = i*5+1;
-        s_ptr->s    = i*5+2;
-        s_ptr->t    = i*5+3;
+    for(i = 0; i < num; i++) {
+	s_ptr = (stype4 *)buf + i;
+	s_ptr->a    = (int)(i * 8 + 0);
+	s_ptr->b    = (int)(i * 8 + 1);
+        for(j = 0; j < 8; j++)
+	    s_ptr->c[j] = (int)(i * 8 + j);
+	s_ptr->d    = (int)(i * 8 + 6);
+	s_ptr->e    = (int)(i * 8 + 7);
+
+        s_ptr->f    = (float)(i * 2 / 3);
+        s_ptr->g    = (float)(i * 2 / 3 + 1);
+        for(j = 0; j < 16; j++)
+	    s_ptr->h[j] = (float)(i * j / 5 + j);
+        s_ptr->i    = (float)(i * 2 / 3 + 2);
+        s_ptr->j    = (float)(i * 2 / 3 + 3);
+
+        s_ptr->k    = (double)(i / 7 + 1);
+        s_ptr->l    = (double)(i / 7 + 2);
+        s_ptr->m    = (double)(i / 7 + 3);
+        s_ptr->n    = (double)(i / 7 + 4);
+
+        s_ptr->o    = (long)(i * 3 + 0);
+        s_ptr->p    = (long)(i * 3 + 1);
+        s_ptr->q    = (long)(i * 3 + 2);
+
+        s_ptr->r    = (long long)(i * 5 + 1);
+        s_ptr->s    = (long long)(i * 5 + 2);
+        s_ptr->t    = (long long)(i * 5 + 3);
     }
 }
 
@@ -1349,7 +1385,7 @@ error:
  * Modifications:
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_hdf5_src_subset(char *filename, hid_t fapl)
 {
     hid_t   file;
@@ -1554,7 +1590,7 @@ error:
  * Modifications:
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_hdf5_dst_subset(char *filename, hid_t fapl)
 {
     hid_t   file;
@@ -1763,7 +1799,7 @@ error:
  * Modifications:
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_pack_ooo(void)
 {
     hid_t       cmpd, sub_cmpd;     /* Datatype IDs */
@@ -1788,7 +1824,7 @@ test_pack_ooo(void)
     for(i=0; i<PACK_NMEMBS; i++) {
         /* Generate index into free_order array */
         num_free = PACK_NMEMBS - i;
-        j = HDrand() % num_free;
+        j = (unsigned)HDrandom() % num_free;
 
         /* Update order array at the randomly generated (but guaranteed to be
          * free) location */
@@ -1800,7 +1836,7 @@ test_pack_ooo(void)
     } /* end for */
 
     /* Generate order to insert inner compound type */
-    sub_cmpd_order = HDrand() % PACK_NMEMBS;
+    sub_cmpd_order = (unsigned)HDrandom() % PACK_NMEMBS;
 
     for(extra_space=0; extra_space<2; extra_space ++) {
         if(extra_space)
@@ -1995,7 +2031,7 @@ error:
  * Modifications:
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_ooo_order(char *filename)
 {
     hid_t       file = -1;          /* File ID */
@@ -2181,7 +2217,7 @@ main (int argc, char *argv[])
     if (argc>1) {
 	if (argc>2 || strcmp("--noopt", argv[1])) {
 	    fprintf(stderr, "usage: %s [--noopt]\n", argv[0]);
-	    exit(1);
+	    exit(EXIT_FAILURE);
 	}
 	H5Tunregister(H5T_PERS_DONTCARE, NULL, (hid_t)-1, (hid_t)-1, H5T__conv_struct_opt);
     }
@@ -2214,7 +2250,7 @@ main (int argc, char *argv[])
     if (nerrors) {
         printf("***** %u FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     }
 
     h5_cleanup(FILENAME, fapl_id);
diff --git a/test/cork.c b/test/cork.c
index 6478723..8c685ee 100644
--- a/test/cork.c
+++ b/test/cork.c
@@ -1,14 +1,13 @@
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Vailin Choi
@@ -19,14 +18,16 @@
  *  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"
+
+/*
+ * This file needs to access private information from the H5C package.
+ * This file also needs to access the metadata cache testing code.
+ */
+#define H5C_FRIEND		/*suppress error about including H5Cpkg	  */
+#define H5C_TESTING		/*suppress warning about H5C testing funcs*/
+#include "H5Cpkg.h"		/* Cache				*/
+
 
 /* ============ */
 /* Test Defines */
@@ -63,247 +64,15 @@
 /* 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 */
+static unsigned test_objs_cork(hbool_t swmr, hbool_t new_format);
+static unsigned test_dset_cork(hbool_t swmr, hbool_t new_format);
+static unsigned verify_old_dset_cork(void);
+static unsigned verify_obj_dset_cork(hbool_t swmr);
+static unsigned verify_dset_cork(hbool_t swmr, hbool_t new_format);
+static unsigned verify_group_cork(hbool_t swmr);
+static unsigned verify_named_cork(hbool_t swmr);
+static unsigned verify_multiple_cork(hbool_t swmr);
 
 

 /*-------------------------------------------------------------------------
@@ -319,7 +88,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_old_dset_cork(void)
 {
     /* Variable Declarations */
@@ -339,46 +108,47 @@ verify_old_dset_cork(void)
     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;
+    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
+    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;
+        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;
+    if(H5Oget_info(did, &oinfo) < 0)
+        TEST_ERROR
     
     /* Cork the dataset: DSET_BT1 */
-    if(H5Odisable_mdc_flushes(did) < 0 ) TEST_ERROR;
+    if(H5Odisable_mdc_flushes(did) < 0)
+        TEST_ERROR
 
     /* Verify cork status */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-    TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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++) {
+    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;
+        TEST_ERROR
 
     /* Verify the cork status for DSET_BT1 */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-    TEST_ERROR;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, TRUE) < 0)
+        TEST_ERROR
 
     /* Create compact dataset: DSET_COMPACT */
     if((sid2 = H5Screate_simple(2, dims2, NULL)) < 0)
@@ -393,38 +163,47 @@ verify_old_dset_cork(void)
         FAIL_STACK_ERROR
 
     /* Get dataset object address */
-    if(H5Oget_info(did2, &oinfo2) < 0 ) TEST_ERROR;
+    if(H5Oget_info(did2, &oinfo2) < 0)
+        TEST_ERROR
     
     /* Cork the dataset: DSET_COMPACT */
-    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+    if(H5Odisable_mdc_flushes(did2) < 0)
+        TEST_ERROR
 
     /* Verify cork status */
-    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0 ) 
-    TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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(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(H5Dclose(did2) < 0)
+        TEST_ERROR
+    if(H5Sclose(sid2) < 0)
+        TEST_ERROR
+    if(H5Pclose(dcpl2) < 0)
+        TEST_ERROR
 
-    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
 
     /* Reopen the file */
-    if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    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++) {
+    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;
+    if((did = H5Dopen2(fid, DSET_BT1, H5P_DEFAULT)) < 0)
+        TEST_ERROR
 
     /* Create contiguous dataset: DSET_CONTIG */
     if((sid3 = H5Screate_simple(2, dims2, NULL)) < 0)
@@ -437,31 +216,38 @@ verify_old_dset_cork(void)
         FAIL_STACK_ERROR
 
     /* Get dataset object address: DSET_CONTIG */
-    if(H5Oget_info(did3, &oinfo3) < 0 ) TEST_ERROR;
+    if(H5Oget_info(did3, &oinfo3) < 0)
+        TEST_ERROR
 
     /* Cork the dataset: DSET_CONTIG */
-    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, FALSE) < 0) 
+        TEST_ERROR
 
     /* Un-cork the dataset: DSET_CONTIG */
-    if(H5Oenable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    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;
@@ -496,7 +282,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_obj_dset_cork(hbool_t swmr)
 {
     /* Variable Declarations */
@@ -521,58 +307,58 @@ verify_obj_dset_cork(hbool_t swmr)
     }
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-        TEST_ERROR;
+    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;
+    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;
+    if((fid = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
 
     /* Create dataspace */
-    if((sid = H5Screate(H5S_SCALAR)) < 0 )
-        TEST_ERROR;
+    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;
+        TEST_ERROR
 
     /* Get dataset object header address */
-    if(H5Oget_info(did, &oinfo) < 0 )
-        TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, FALSE) < 0)
+        TEST_ERROR
     
     /* Cork the dataset: DSET */
-    if(H5Odisable_mdc_flushes(did) < 0 )
-        TEST_ERROR;
+    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;
+        TEST_ERROR
 
     /* Verify cork status of the dataset: DSET */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, TRUE) < 0)
+        TEST_ERROR
 
     /* Close the attribute */
     if(H5Aclose(aid) < 0) 
-        TEST_ERROR;
+        TEST_ERROR
 
     /* Verify cork status of the dataset: DSET */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, TRUE) < 0)
+        TEST_ERROR
     
     /* Create dcpl */
-    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0 )
-        TEST_ERROR;
+    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
@@ -581,78 +367,89 @@ verify_obj_dset_cork(hbool_t swmr)
     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;
+        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;
+    if(H5Oget_info(did2, &oinfo2) < 0)
+        TEST_ERROR
 
     /* Cork the dataset: DSET_NONE */
-    if(H5Odisable_mdc_flushes(did2) < 0 )
-        TEST_ERROR;
+    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;
+        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) 
+    if(H5C__verify_cork_tag_test(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;
+    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;
+        TEST_ERROR
 
     /* Open the dataset object: DSET_NONE */
     if((oid = H5Oopen(fid, DSET_NONE, H5P_DEFAULT)) < 0) 
-        TEST_ERROR;
+        TEST_ERROR
 
     /* Verify cork status of the dataset: DSET */
-    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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;
+    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
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo2.addr, TRUE) < 0)
+        TEST_ERROR
 
     /* Close the attribute */
-    if(H5Aclose(aid) < 0 ) TEST_ERROR;
+    if(H5Aclose(aid) < 0)
+        TEST_ERROR
 
     /* Verify cork status of the dataset: DSET */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5Oclose(oid) < 0)
+        TEST_ERROR
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
 
     PASSED();
     return 0;
@@ -687,7 +484,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_dset_cork(hbool_t swmr, hbool_t new_format)
 {
     /* Variable Declarations */
@@ -711,159 +508,186 @@ verify_dset_cork(hbool_t swmr, hbool_t new_format)
             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)");
+        if(new_format) {
+            TESTING("cork status for chunked datasets with different indexing types (non-SWMR & latest)");
+        } else {
+            TESTING("cork status for chunked datasets with different indexing types (non-SWMR & non-latest)");
+        } /* end if */
     } /* end if */
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-        TEST_ERROR;
+    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;
+        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;
+    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
+    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;
+        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;
+    if(H5Oget_info(did, &oinfo) < 0)
+        TEST_ERROR
     
     /* Cork the dataset: DSET_EA */
-    if(H5Odisable_mdc_flushes(did) < 0 ) TEST_ERROR;
+    if(H5Odisable_mdc_flushes(did) < 0)
+        TEST_ERROR
 
     /* Verify cork status */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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;
+        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;
+    if(H5Oget_info(did2, &oinfo2) < 0)
+        TEST_ERROR
     
     /* Cork the dataset: DSET_FA */
-    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+    if(H5Odisable_mdc_flushes(did2) < 0)
+        TEST_ERROR
 
     /* Uncork the dataset: DSET_EA */
-    if(H5Oenable_mdc_flushes(did) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(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;
+        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;
+    if(H5Oget_info(did3, &oinfo3) < 0)
+        TEST_ERROR
 
     /* Cork the dataset: DSET_BT2 */
-    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo3.addr, TRUE) < 0)
+        TEST_ERROR
 
     /* Closing */
-    if(H5Dclose(did3) < 0 ) TEST_ERROR;
-    if(H5Sclose(sid3) < 0 ) TEST_ERROR;
+    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(did2) < 0)
+        TEST_ERROR
+    if(H5Sclose(sid2) < 0)
+        TEST_ERROR
 
-    if(H5Dclose(did) < 0 ) TEST_ERROR;
-    if(H5Sclose(sid) < 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;
+    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;
+    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++) {
+    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((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;
+        TEST_ERROR
 
     /* Verify the cork status for DSET_EA */
-    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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((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;
+        TEST_ERROR
 
     /* Cork the dataset: DSET_FA */
-    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(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((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;
+        TEST_ERROR
 
     /* Verify the cork status for DSET_BT2 */
-    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0 ) 
-        TEST_ERROR;
+    if(H5C__verify_cork_tag_test(fid, oinfo3.addr, FALSE) < 0)
+        TEST_ERROR
 
     /* Cork the dataset: DSET_BT2 */
-    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    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;
@@ -898,7 +722,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_group_cork(hbool_t swmr)
 {
     /* Variable Declarations */
@@ -914,109 +738,127 @@ verify_group_cork(hbool_t swmr)
 
     /* Testing Macro */
     if(swmr) {
-    TESTING("cork status for groups (SWMR)");
+        TESTING("cork status for groups (SWMR)");
     } else {
-    TESTING("cork status for groups");
+        TESTING("cork status for groups");
     }
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-    TEST_ERROR;
+    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;
+    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;
+        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;
+        TEST_ERROR
     if((gid2 = H5Gcreate2(gid, GRP2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
-    TEST_ERROR;
+        TEST_ERROR
     if((gid3 = H5Gcreate2(gid2, GRP3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
-    TEST_ERROR;
+        TEST_ERROR
 
     /* Cork the second group: GRP2 */
-    if(H5Odisable_mdc_flushes(gid2) < 0) TEST_ERROR
+    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;
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, FALSE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid, oinfo2.addr, TRUE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid, oinfo3.addr, FALSE) < 0) 
+        TEST_ERROR
     
     /* Close the second group: GRP2 */
-    if(H5Gclose(gid2) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid2) < 0)
+        TEST_ERROR
 
     /* Re-open the second group: GRP2 */
     if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     /* Verify cork status of the second group: GRP2 */
-    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0) 
-    TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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;
+    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
+        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
+        FAIL_STACK_ERROR
     if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
     if((gid3 = H5Gopen2(gid2, GRP3, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     /* Create dataspace */
-    if((sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+    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((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;
+            TEST_ERROR
+        /* Cork the third group while attaching attributes */
+        if(i == 3) {
+            if(H5Odisable_mdc_flushes(gid3) < 0)
+                TEST_ERROR
+            if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(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;
+    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;
@@ -1047,7 +889,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_named_cork(hbool_t swmr)
 {
     /* Variable Declarations */
@@ -1065,134 +907,155 @@ verify_named_cork(hbool_t swmr)
 
     /* Testing Macro */
     if(swmr) {
-    TESTING("cork status for named datatypes (SWMR)");
+        TESTING("cork status for named datatypes (SWMR)");
     } else {
-    TESTING("cork status for named datatypes");
+        TESTING("cork status for named datatypes");
     }
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-    TEST_ERROR;
+    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;
+    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;
+        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;
+    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;
+        TEST_ERROR
 
     /* Create /GRP */
     if((gid = H5Gcreate2(fid, GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
-    TEST_ERROR;
+        TEST_ERROR
     /* Commit datatype /GRP/DT2 */
     if(H5Tcommit2(gid, DT2, tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) 
-    TEST_ERROR;
+        TEST_ERROR
 
     /* Create /GRP/GRP2 */
     if((gid2 = H5Gcreate2(gid, GRP2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
-    TEST_ERROR;
+        TEST_ERROR
     /* Commit datatype /GRP/GRP2/DT3 */
     if(H5Tcommit2(gid2, DT3, tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) 
-    TEST_ERROR;
+        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
+    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;
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, TRUE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid, oinfo2.addr, FALSE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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;
+    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
+        FAIL_STACK_ERROR
     if((tid2 = H5Topen2(gid, DT2, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
     if((tid3 = H5Topen2(gid2, DT3, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        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;
+    if(H5C__verify_cork_tag_test(fid, oinfo.addr, FALSE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid, oinfo2.addr, FALSE) < 0) 
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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;
+    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
+        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
+        FAIL_STACK_ERROR
     if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     /* Re-open the named datatypes */
     if((tid = H5Topen2(fid, DT, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
     if((tid2 = H5Topen2(gid, DT2, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
     if((tid3 = H5Topen2(gid2, DT3, H5P_DEFAULT)) < 0) 
-    FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     /* Cork the datatype: DT2 */
-    if(H5Odisable_mdc_flushes(tid2) < 0) TEST_ERROR
+    if(H5Odisable_mdc_flushes(tid2) < 0)
+        TEST_ERROR
 
     /* Create dataspace */
-    if((sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+    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((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;
+            TEST_ERROR
+        /* Cork the datatype while attaching attributes */
+        if(i == 3) {
+            if(H5Odisable_mdc_flushes(tid3) < 0)
+                TEST_ERROR
+            if(H5C__verify_cork_tag_test(fid, oinfo3.addr, TRUE) < 0) 
+                TEST_ERROR
+        }
+        if(H5Aclose(aid) < 0)
+            TEST_ERROR
     } /* end for */
 
     /* Create a dataset with named datatype: DT */
@@ -1200,61 +1063,74 @@ verify_named_cork(hbool_t swmr)
         FAIL_STACK_ERROR
 
     /* Get dataset object header address */
-    if(H5Oget_info(did, &oinfo4) < 0) TEST_ERROR;
+    if(H5Oget_info(did, &oinfo4) < 0)
+        TEST_ERROR
 
     /* Cork the dataset: DSET */
-    if(H5Odisable_mdc_flushes(did) < 0) TEST_ERROR
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(fid, oinfo3.addr, TRUE) < 0) 
+        TEST_ERROR
 
     /* Un-cork the datatype: DT3 */
-    if(H5Oenable_mdc_flushes(tid3) < 0) TEST_ERROR
+    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;
+    if(H5C__verify_cork_tag_test(fid, oinfo3.addr, FALSE) < 0) 
+        TEST_ERROR
 
     /* Cork the datatype: DT */
-    if(H5Odisable_mdc_flushes(tid) < 0) TEST_ERROR
+    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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(fid, oinfo4.addr, TRUE) < 0) 
+        TEST_ERROR
 
     /* Close the dataset */
-    if(H5Dclose(did) < 0) TEST_ERROR
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
 
     /* Verify cork status of the datatype: DT */
-    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0) 
-    TEST_ERROR;
+    if(H5C__verify_cork_tag_test(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;
+    if(H5C__verify_cork_tag_test(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;
+    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;
@@ -1289,7 +1165,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 verify_multiple_cork(hbool_t swmr)
 {
     /* Variable Declarations */
@@ -1310,290 +1186,327 @@ verify_multiple_cork(hbool_t swmr)
 
     /* Testing Macro */
     if(swmr) {
-    TESTING("cork status for multiple opens (SWMR)");
+        TESTING("cork status for multiple opens (SWMR)");
     } else {
-    TESTING("cork status for multiple opens");
+        TESTING("cork status for multiple opens");
     }
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-    TEST_ERROR
+    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
+    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
+        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
+        TEST_ERROR
 
     /* Create and commit datatype */
     if((tid1 = H5Tcopy(H5T_STD_I32LE)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if(H5Tcommit2(fid1, DT, tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Create dataset */
     if((sid = H5Screate_simple(1, dim, NULL)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((did1 = H5Dcreate2(fid1, DSET, tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Create attribute on root group */
     if((aidg1 = H5Acreate2(gid1, GRP_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Create attribute on dataset */
     if((aidd1 = H5Acreate2(did1, DSET_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Create attribute on datatype */
     if((aidt1 = H5Acreate2(tid1, DT_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        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
+    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;
+        flags |= H5F_ACC_SWMR_WRITE;
     if((fid1 = H5Fopen(FILENAME, flags, fapl)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((fid2 = H5Fopen(FILENAME, flags, fapl)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Open the root group twice: gid1, gid2 */
     if((gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((gid2 = H5Gopen2(fid2, "/", H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Open the root group attribute twice: aidg1, aidg2 */
     if((aidg1 = H5Aopen(gid1, GRP_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((aidg2 = H5Aopen(gid2, GRP_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Cork the group: gid2 */
     if(H5Odisable_mdc_flushes(gid2) < 0)
-    TEST_ERROR
+        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
+    if(H5Oget_info(gid2, &oinfo1) < 0)
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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
+        TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Open the dataset twice: did1, did2 */
     if((did1 = H5Dopen2(fid1, DSET, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((did2 = H5Dopen2(fid2, DSET, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Open the dataset attribute twice: aidd1, aidd2 */
     if((aidd1 = H5Aopen(did1, DSET_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((aidd2 = H5Aopen(did2, DSET_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Cork the dataset: did1 */
     if(H5Odisable_mdc_flushes(did1) < 0)
-    TEST_ERROR
+        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
+    if(H5Oget_info(did1, &oinfo2) < 0)
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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
+        TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Open the datatype twice: tid1, tid2 */
     if((tid1 = H5Topen2(fid1, DT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((tid2 = H5Topen2(fid2, DT, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Open the datatype attribute twice: aidt1, aidt2 */
     if((aidt1 = H5Aopen(tid1, DT_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
     if((aidt2 = H5Aopen(tid2, DT_ATTR, H5P_DEFAULT)) < 0)
-    TEST_ERROR
+        TEST_ERROR
 
     /* Cork the datatype: tid2 */
     if(H5Odisable_mdc_flushes(tid2) < 0)
-    TEST_ERROR
+        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;
+    if(H5Oget_info(tid2, &oinfo3) < 0)
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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
+        TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Uncork the group: gid1 */
     if(H5Oenable_mdc_flushes(gid1) < 0)
-    TEST_ERROR
+        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
+    if(H5Oget_info(gid1, &oinfo1) < 0)
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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
+        TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Close the group: gid2 */
-    if(H5Gclose(gid2) < 0) TEST_ERROR
+    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
+        TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Verify cork status of the group: gid1 */
-    if(verify_cork_tag(fid1, oinfo1.addr, FALSE) < 0) 
-    TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid1, oinfo1.addr, FALSE) < 0) 
+        TEST_ERROR
 
     /* Close the group: gid1 */
-    if(H5Gclose(gid1) < 0) TEST_ERROR
+    if(H5Gclose(gid1) < 0)
+        TEST_ERROR
 
     /* Uncork the dataset: gid2 */
     if(H5Oenable_mdc_flushes(did2) < 0)
-    TEST_ERROR
+        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
+    if(H5Oget_info(did2, &oinfo2) < 0)
+        TEST_ERROR
+    if(H5C__verify_cork_tag_test(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
+        TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Close the dataset: did2 */
-    if(H5Dclose(did2) < 0) TEST_ERROR
+    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
+        TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Verify cork status of the dataset: did1 */
-    if(verify_cork_tag(fid1, oinfo2.addr, FALSE) < 0) 
-    TEST_ERROR
+    if(H5C__verify_cork_tag_test(fid1, oinfo2.addr, FALSE) < 0) 
+        TEST_ERROR
 
     /* Close the dataset: did1 */
-    if(H5Dclose(did1) < 0) TEST_ERROR
+    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
+        TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close datatype: tid1 */
-    if(H5Tclose(tid1) < 0) TEST_ERROR
+    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
+        TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close datatype: tid2 */
-    if(H5Tclose(tid2) < 0) TEST_ERROR
+    if(H5Tclose(tid2) < 0)
+        TEST_ERROR
 
     /* Should fail to cork the attribute: aidg2; not an object */
     H5E_BEGIN_TRY {
-    ret = H5Odisable_mdc_flushes(aidg2);
+        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);
+        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);
+        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
+    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);
+        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);
+        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
+    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);
+        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);
@@ -1613,8 +1526,8 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
-test_objs_cork(hbool_t new_format)
+static unsigned
+test_objs_cork(hbool_t swmr, hbool_t new_format)
 {
     hid_t       fid;                    /* HDF5 File ID */
     hid_t       fapl;                   /* File access property list */
@@ -1623,27 +1536,41 @@ test_objs_cork(hbool_t new_format)
     hid_t   aid;            /* Attribute ID */
     hsize_t     dims[RANK];     /* Dataset dimension sizes */
     hbool_t     corked;         /* Cork status of an object */
+    unsigned flags;             /* File access flags */
     herr_t      ret;                    /* Return value */
 
     /* Testing Macro */
     if(new_format) {
-        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (new library format)");
+        if(swmr) {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (new library format) (SWMR)");
+        } /* end if */
+        else {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (new library format)");
+        } /* end else */
     } else {
-        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (old library format)");
-    } /* end if */
+        if(swmr) {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (old library format) (SWMR)");
+        } /* end if */
+        else {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (old library format)");
+        } /* end else */
+    } /* end else */
 
     /* Create fapl */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
-        TEST_ERROR;
+    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;
+        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)
+    /* 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 group */
@@ -1653,7 +1580,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the group: not corked */
     if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Cork the group: an object */
     if(H5Odisable_mdc_flushes(gid) < 0)
@@ -1662,7 +1590,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the group: corked */
     if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close the group */
     if(H5Gclose(gid) < 0)
@@ -1686,7 +1615,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the named datatype: not corked */
     if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Cork the named datatype: an object */
     if(H5Odisable_mdc_flushes(tid) < 0)
@@ -1695,7 +1625,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the named datatype: corked */
     if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close the named datatype */
     if(H5Tclose(tid) < 0)
@@ -1732,7 +1663,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the dataset: not corked */
     if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Cork the dataset: an object */
     if(H5Odisable_mdc_flushes(did) < 0)
@@ -1741,7 +1673,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the dataset: corked */
     if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close the dataset and dataspace */
     if(H5Dclose(did) < 0)
@@ -1754,7 +1687,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the group */
     if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Cork the group */
     if(H5Odisable_mdc_flushes(gid) < 0)
@@ -1770,7 +1704,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the group */
     if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Open the named datatype */
     if((tid = H5Oopen(fid, "group/datatype", H5P_DEFAULT)) < 0)
@@ -1779,7 +1714,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the named datatype */
     if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Should fail to un-cork the named datatype that is not corked yet */
     H5E_BEGIN_TRY {
@@ -1795,7 +1731,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the named datatype */
     if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Open the dataset */
     if((did = H5Oopen(fid, "/dataset", H5P_DEFAULT)) < 0)
@@ -1804,7 +1741,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Cork the dataset */
     if(H5Odisable_mdc_flushes(did) < 0)
@@ -1813,7 +1751,8 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of dataset */
     if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Un-cork the dataset */
     if(H5Oenable_mdc_flushes(did) < 0)
@@ -1822,16 +1761,24 @@ test_objs_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
         TEST_ERROR
-    if(corked) 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
+    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;
@@ -1839,7 +1786,7 @@ test_objs_cork(hbool_t new_format)
 error:
     H5E_BEGIN_TRY {
         H5Sclose(sid);
-    H5Aclose(aid);
+        H5Aclose(aid);
         H5Dclose(did);
         H5Gclose(gid);
         H5Tclose(tid);
@@ -1847,7 +1794,6 @@ error:
         H5Fclose(fid);
     } H5E_END_TRY;
     return 1;
-
 } /* test_objs_cork() */
 
 

@@ -1863,8 +1809,8 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
-test_dset_cork(hbool_t new_format)
+static unsigned
+test_dset_cork(hbool_t swmr, hbool_t new_format)
 {
     hid_t       fid;                            /* File ID */
     hid_t       fapl;                           /* File access property list */
@@ -1881,26 +1827,40 @@ test_dset_cork(hbool_t new_format)
     int     data[DIMS0][DIMS1];     /* Data buffer */
     int     rbuf[DIMS0][DIMS1];     /* Data buffer */
     hbool_t     corked;             /* Cork status of an object */
+    unsigned flags;                 /* File access flags */
 
     /* Testing Macro */
     if(new_format) {
-        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (new library format)");
+        if(swmr) {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (new library format) (SWMR)");
+        } /* end if */
+        else {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (new library format)");
+        } /* end else */
     } else {
-        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (old library format)");
+        if(swmr) {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (old library format) (SWMR)");
+        } /* end if */
+        else {
+            TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (old library format)");
+        } /* end else */
     } /* end if */
 
     /* Create fapl */
     if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) 
-        TEST_ERROR;
+        TEST_ERROR
 
     /* Set to use latest format */
     if(new_format) {
-        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
-            TEST_ERROR;
+        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)
+    /* 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 a group */
@@ -1942,7 +1902,8 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the named datatype */
     if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Cork the dataset */
     if(H5Odisable_mdc_flushes(did1) < 0)
@@ -1951,12 +1912,14 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(!corked) 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
+    if(corked)
+        TEST_ERROR
 
     /* Initialize the buffer */
     for(i = 0; i < DIMS0;i++)
@@ -1974,12 +1937,14 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(!corked) 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
+    if(!corked)
+        TEST_ERROR
 
     /* Close the dataset */
     if(H5Dclose(did1) < 0)
@@ -1992,7 +1957,8 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(corked) TEST_ERROR
+    if(corked)
+        TEST_ERROR
 
     /* Read from the dataset */
     if(H5Dread(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
@@ -2009,10 +1975,12 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Close the dataset */
-    if(H5Oclose(did1) < 0) TEST_ERROR
+    if(H5Oclose(did1) < 0)
+        TEST_ERROR
 
     /* Create the dataset again */
     if((did1 = H5Dcreate2(gid, "dataset", tid1, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
@@ -2033,10 +2001,12 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
     
     /* Close the dataset */
-    if(H5Dclose(did1) < 0) TEST_ERROR
+    if(H5Dclose(did1) < 0)
+        TEST_ERROR
 
     /* First open of the dataset */
     if((did1 = H5Dopen2(gid, "dataset", H5P_DEFAULT)) < 0)
@@ -2053,28 +2023,34 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the first opened dataset */
     if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
         TEST_ERROR
-    if(!corked) 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
+    if(!corked)
+        TEST_ERROR
 
     /* Close the second opened dataset */
-    if(H5Dclose(did2) < 0) TEST_ERROR
+    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
+    if(!corked)
+        TEST_ERROR
 
     /* Close the first opened dastaset */
-    if(H5Dclose(did1) < 0) TEST_ERROR
+    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
+    if(!corked)
+        TEST_ERROR
 
     /* Second open of the named datatype */
     if((tid2 = H5Topen2(gid, "datatype", H5P_DEFAULT)) < 0) 
@@ -2083,7 +2059,8 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the second opened named datatype */
     if(H5Oare_mdc_flushes_disabled(tid2, &corked) < 0)
         TEST_ERROR
-    if(!corked) TEST_ERROR
+    if(!corked)
+        TEST_ERROR
 
     /* Uncork the second opened named datatype */
     if(H5Oenable_mdc_flushes(tid2) < 0)
@@ -2092,30 +2069,40 @@ test_dset_cork(hbool_t new_format)
     /* Check cork status of the second opened named datatype */
     if(H5Oare_mdc_flushes_disabled(tid2, &corked) < 0)
         TEST_ERROR
-    if(corked) 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
+    if(corked)
+        TEST_ERROR
 
     /* Close the first opened datatype */
-    if(H5Tclose(tid1) < 0) TEST_ERROR
+    if(H5Tclose(tid1) < 0)
+        TEST_ERROR
 
     /* Close the second opened datatype */
-    if(H5Tclose(tid2) < 0) TEST_ERROR
+    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
+    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
+    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;
@@ -2154,38 +2141,34 @@ error:
 int 
 main(void) 
 {
+    unsigned swmr;              /* Loop over SWMR/non-SWMR */
     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);
+    for(swmr = 0; swmr <= 1; swmr++) {
+        /* Tests with new/old library format */
+        /* This is the test moved from th5o.c: test_h5o_cork() */
+        nerrs += test_objs_cork(swmr, TRUE);
+        nerrs += test_objs_cork(swmr, FALSE);
+        /* This is the test moved from th5o.c: test_h5o_cork_dataset() */
+        nerrs += test_dset_cork(swmr, TRUE);
+        nerrs += test_dset_cork(swmr, FALSE);
+
+        /* Tests with/without SWMR access */
+        nerrs += verify_obj_dset_cork(swmr);
+        nerrs += verify_dset_cork(swmr, TRUE); 
+        nerrs += verify_dset_cork(swmr, FALSE); 
+        nerrs += verify_group_cork(swmr); 
+        nerrs += verify_named_cork(swmr); 
+        nerrs += verify_multiple_cork(swmr);
+    } /* end for */
 
     /* 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 a00616d..4fa287c 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 b2fae89..5d5ef07 100644
--- a/test/cross_read.c
+++ b/test/cross_read.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -64,9 +62,9 @@ const char *FILENAME[] = {
 
 

 /*-------------------------------------------------------------------------
- * Function:    open_dataset
+ * Function:    check_data_i
  *
- * Purpose:     Read and compare the data from a dataset.
+ * Purpose:     Read and compare the integer data from a dataset.
  *
  * Return:      Success:        0
  *              Failure:        1
@@ -74,112 +72,143 @@ const char *FILENAME[] = {
  * Programmer:  Raymond Lu
  *              17 May 2011
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static int check_data(const char *dsetname, hid_t fid, hbool_t floating_number)
+static int
+check_data_i(const char *dsetname, hid_t fid)
 {
-    hid_t       dataset;         /* handles */
-    double      data_in[NX+1][NY]; /* input buffer */
-    double      data_out[NX+1][NY]; /* output buffer */
-    long long   int_data_in[NX+1][NY]; /* input buffer */
-    long long   int_data_out[NX+1][NY]; /* output buffer */
-    int         i, j;
-    unsigned 	nerrors = 0;
-
-    /* 
-     * Open the regular dataset.
+    hid_t       did = -1;               /* dataset ID                       */
+    long long   data_in[NX+1][NY];      /* input buffer                     */
+    long long   data_out[NX+1][NY];     /* output buffer                    */
+    int         i, j;                   /* iterators                        */
+    int         nerrors = 0;            /* # errors in dataset values       */
+
+    /* Open the dataset. */
+    if((did = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Initialization. */
+    /* Input (last row is different) */
+    for(i = 0; i < NX; i++)
+        for(j = 0; j < NY; j++)
+            data_in[i][j] = i + j;
+    for(i = 0; i < NY; i++)
+        data_in[NX][i] = -2;
+    /* Output */
+    HDmemset(data_out, 0, (NX+1) * NY * sizeof(long long));
+
+    /* Read data from hyperslab in the file into the hyperslab in
+     * memory and display.
      */
-    if((dataset = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0)
-        TEST_ERROR;
+    if(H5Dread(did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Check results */
+    for(i = 0; i < (NX + 1); i++)
+        for(j = 0; j < NY; j++)
+            if(data_out[i][j] != data_in[i][j])
+                if(!nerrors++) {
+                    H5_FAILED();
+                    printf("element [%d][%d] is %lld but should have been %lld\n",
+                            (int)i, (int)j, data_out[i][j], data_in[i][j]);
+                } /* end if */
+
+    /* Close/release resources. */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
 
-    /*
-     * Data and output buffer initialization.
-     */
-    for (j = 0; j < NX; j++) {
-        for (i = 0; i < NY; i++) {
-            data_in[j][i] = ((double)(i + j + 1))/3;
-            data_out[j][i] = 0.0F;
-
-            int_data_in[j][i] = i + j;
-            int_data_out[j][i] = 0;
-        }
-    }
-    for (i = 0; i < NY; i++) {
-        data_in[NX][i] = -2.2F;
-        data_out[NX][i] = 0.0F;
+    /* Failure */
+    if(nerrors) {
+        printf("total of %d errors out of %d elements\n", nerrors, (int)(NX*NY));
+        return 1;
+    } /* end if */
+
+    PASSED();
+    return 0;
 
-        int_data_in[NX][i] = -2;
-        int_data_out[NX][i] = 0;
-    }
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+    } H5E_END_TRY;
+    return 1;
+} /* end check_data_i() */
 
-    /*
-     * Read data from hyperslab in the file into the hyperslab in
+

+/*-------------------------------------------------------------------------
+ * Function:    check_data_f
+ *
+ * Purpose:     Read and compare the floating-point data from a dataset.
+ *
+ * Return:      Success:        0
+ *              Failure:        1
+ *
+ * Programmer:  Raymond Lu
+ *              17 May 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_data_f(const char *dsetname, hid_t fid)
+{
+    hid_t       did = -1;               /* dataset ID                       */
+    double      data_in[NX+1][NY];      /* input buffer                     */
+    double      data_out[NX+1][NY];     /* output buffer                    */
+    int         i, j;                   /* iterators                        */
+    int         nerrors = 0;            /* # of errors in dataset values    */
+
+    /* Open the dataset. */
+    if((did = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Initialization. */
+    /* Input (last row is different) */
+    for(i = 0; i < NX; i++)
+        for(j = 0; j < NY; j++)
+            data_in[i][j] = ((double)(i + j + 1)) / (double)3.0F;
+    for(i = 0; i < NY; i++)
+        data_in[NX][i] = -2.2F;
+    /* Output */
+    HDmemset(data_out, 0, (NX+1) * NY * sizeof(double));
+
+    /* Read data from hyperslab in the file into the hyperslab in
      * memory and display.
      */
-    if(floating_number) {
-	if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-		data_out) < 0)
-	    TEST_ERROR;
-
-	/* Check results */
-	for (j=0; j<(NX+1); j++) {
-	    for (i=0; i<NY; i++) {
-		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",
-			       j, i, data_out[j][i], data_in[j][i]);
-		    }
-		}
-	    }
-	}
-    } else {
-	if(H5Dread(dataset, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-		int_data_out) < 0)
-	    TEST_ERROR;
-
-	/* Check results */
-	for (j=0; j<(NX+1); j++) {
-	    for (i=0; i<NY; i++) {
-		if (int_data_out[j][i] != int_data_in[j][i]) {
-		    if (!nerrors++) {
-			H5_FAILED();
-			printf("element [%d][%d] is %d but should have been %d\n",
-			       j, i, (int)int_data_out[j][i],
-			       (int)int_data_in[j][i]);
-		    }
-		}
-	    }
-	}
-    }
-
-    /*
-     * Close/release resources.
-     */
-    if(H5Dclose(dataset) < 0)
-        TEST_ERROR
+    if(H5Dread(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Check results */
+    for(i = 0; i < (NX + 1); i++)
+        for(j = 0; j < NY; j++)
+            if(!H5_DBL_REL_EQUAL(data_out[i][j], data_in[i][j], (double)0.001F))
+                if(!nerrors++) {
+                    H5_FAILED();
+                    printf("element [%d][%d] is %g but should have been %g\n",
+                        (int)i, (int)j, data_out[i][j], data_in[i][j]);
+                } /* end if */
+
+    /* Close/release resources. */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
 
     /* Failure */
-    if (nerrors) {
-        printf("total of %d errors out of %d elements\n", nerrors, NX*NY);
+    if(nerrors) {
+        printf("total of %d errors out of %d elements\n", nerrors, (int)(NX*NY));
         return 1;
-    }
+    } /* end if */
 
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
-        H5Dclose(dataset);
+        H5Dclose(did);
     } H5E_END_TRY;
     return 1;
-}
+} /* end check_data_f() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    open_dataset
+ * Function:    check_file
  *
  * Purpose:     Handle each dataset from the data file.
  *
@@ -189,125 +218,122 @@ error:
  * Programmer:  Raymond Lu
  *              21 January 2011
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static int open_dataset(char *fname)
+static int
+check_file(char *filename)
 {
-    const char *pathname = H5_get_srcdir_filename(fname); /* Corrected test file name */
-    hid_t       file;         /* handles */
-    unsigned 	nerrors = 0;
-    const char  *not_supported= "    filter is not enabled.";
+    const char *pathname = H5_get_srcdir_filename(filename);    /* Corrected test file name     */
+    hid_t       fid = -1;                                       /* file ID                      */
+    int         nerrors = 0;                                    /* # of datasets with errors    */
+    const char  *not_supported= "    filter is not enabled.";   /* no filter message            */
 
-    /*
-     * Open the file.
-     */
-    if((file = H5Fopen(pathname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
-        TEST_ERROR;
+    /* Open the file. */
+    if((fid = H5Fopen(pathname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
 
     TESTING("regular dataset of LE DOUBLE");
-    nerrors += check_data(DATASETNAME, file, TRUE);
+    nerrors += check_data_f(DATASETNAME, fid);
 
     TESTING("regular dataset of BE DOUBLE");
-    nerrors += check_data(DATASETNAME1, file, TRUE);
+    nerrors += check_data_f(DATASETNAME1, fid);
 
     TESTING("dataset of LE FLOAT with scale-offset filter");
-    nerrors += check_data(DATASETNAME2, file, TRUE);
+    nerrors += check_data_f(DATASETNAME2, fid);
  
     TESTING("dataset of BE FLOAT with scale-offset filter");
-    nerrors += check_data(DATASETNAME3, file, TRUE);
+    nerrors += check_data_f(DATASETNAME3, fid);
 
     TESTING("dataset of LE DOUBLE with scale-offset filter");
-    nerrors += check_data(DATASETNAME4, file, TRUE);
+    nerrors += check_data_f(DATASETNAME4, fid);
  
     TESTING("dataset of BE DOUBLE with scale-offset filter");
-    nerrors += check_data(DATASETNAME5, file, TRUE);
+    nerrors += check_data_f(DATASETNAME5, fid);
  
     TESTING("dataset of LE CHAR with scale-offset filter");
-    nerrors += check_data(DATASETNAME6, file, FALSE);
+    nerrors += check_data_i(DATASETNAME6, fid);
  
     TESTING("dataset of BE CHAR with scale-offset filter");
-    nerrors += check_data(DATASETNAME7, file, FALSE);
+    nerrors += check_data_i(DATASETNAME7, fid);
  
     TESTING("dataset of LE SHORT with scale-offset filter");
-    nerrors += check_data(DATASETNAME8, file, FALSE);
+    nerrors += check_data_i(DATASETNAME8, fid);
  
     TESTING("dataset of BE SHORT with scale-offset filter");
-    nerrors += check_data(DATASETNAME9, file, FALSE);
+    nerrors += check_data_i(DATASETNAME9, fid);
 
     TESTING("dataset of LE INT with scale-offset filter");
-    nerrors += check_data(DATASETNAME10, file, FALSE);
+    nerrors += check_data_i(DATASETNAME10, fid);
  
     TESTING("dataset of BE INT with scale-offset filter");
-    nerrors += check_data(DATASETNAME11, file, FALSE);
+    nerrors += check_data_i(DATASETNAME11, fid);
 
     TESTING("dataset of LE LONG LONG with scale-offset filter");
-    nerrors += check_data(DATASETNAME12, file, FALSE);
+    nerrors += check_data_i(DATASETNAME12, fid);
  
     TESTING("dataset of BE LONG LONG with scale-offset filter");
-    nerrors += check_data(DATASETNAME13, file, FALSE);
+    nerrors += check_data_i(DATASETNAME13, fid);
 
     TESTING("dataset of LE FLOAT with Fletcher32 filter");
-    nerrors += check_data(DATASETNAME14, file, TRUE);
+    nerrors += check_data_f(DATASETNAME14, fid);
  
     TESTING("dataset of BE FLOAT with Fletcher32 filter");
-    nerrors += check_data(DATASETNAME15, file, TRUE);
+    nerrors += check_data_f(DATASETNAME15, fid);
  
     TESTING("dataset of LE FLOAT with Deflate filter");
 #ifdef H5_HAVE_FILTER_DEFLATE
-    nerrors += check_data(DATASETNAME16, file, TRUE);
+    nerrors += check_data_f(DATASETNAME16, fid);
 #else /*H5_HAVE_FILTER_DEFLATE*/
     SKIPPED();
-    puts(not_supported);
+    HDputs(not_supported);
 #endif /*H5_HAVE_FILTER_DEFLATE*/
 
     TESTING("dataset of BE FLOAT with Deflate filter");
 #ifdef H5_HAVE_FILTER_DEFLATE
-    nerrors += check_data(DATASETNAME17, file, TRUE);
+    nerrors += check_data_f(DATASETNAME17, fid);
 #else /*H5_HAVE_FILTER_DEFLATE*/
     SKIPPED();
-    puts(not_supported);
+    HDputs(not_supported);
 #endif /*H5_HAVE_FILTER_DEFLATE*/
 
     TESTING("dataset of LE FLOAT with Szip filter");
 #ifdef H5_HAVE_FILTER_SZIP
-    nerrors += check_data(DATASETNAME18, file, TRUE);
+    nerrors += check_data_f(DATASETNAME18, fid);
 #else /*H5_HAVE_FILTER_SZIP*/
     SKIPPED();
-    puts(not_supported);
+    HDputs(not_supported);
 #endif /*H5_HAVE_FILTER_SZIP*/
 
     TESTING("dataset of BE FLOAT with Szip filter");
 #ifdef H5_HAVE_FILTER_SZIP
-    nerrors += check_data(DATASETNAME19, file, TRUE);
+    nerrors += check_data_f(DATASETNAME19, fid);
 #else /*H5_HAVE_FILTER_SZIP*/
     SKIPPED();
-    puts(not_supported);
+    HDputs(not_supported);
 #endif /*H5_HAVE_FILTER_SZIP*/
 
     TESTING("dataset of LE FLOAT with Shuffle filter");
-    nerrors += check_data(DATASETNAME20, file, TRUE);
+    nerrors += check_data_f(DATASETNAME20, fid);
 
     TESTING("dataset of BE FLOAT with Shuffle filter");
-    nerrors += check_data(DATASETNAME21, file, TRUE);
+    nerrors += check_data_f(DATASETNAME21, fid);
 
     TESTING("dataset of LE FLOAT with Nbit filter");
-    nerrors += check_data(DATASETNAME22, file, TRUE);
+    nerrors += check_data_f(DATASETNAME22, fid);
 
     TESTING("dataset of BE FLOAT with Nbit filter");
-    nerrors += check_data(DATASETNAME23, file, TRUE);
+    nerrors += check_data_f(DATASETNAME23, fid);
 
-    if(H5Fclose(file))
-        TEST_ERROR
-    return 0;
+    if(H5Fclose(fid))
+        FAIL_STACK_ERROR
+    return nerrors;
 
 error:
     H5E_BEGIN_TRY {
-        H5Fclose(file);
+        H5Fclose(fid);
     } H5E_END_TRY;
     return nerrors;
-}
+} /* end check_file() */
 
 

 /*-------------------------------------------------------------------------
@@ -315,35 +341,37 @@ error:
  *
  * Purpose:     Tests reading files created on LE and BE systems.
  *
- * Return:      Success:        exit(0)
- *              Failure:        exit(1)
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
  * Programmer:  Raymond Lu
  *              Thursday, March 23, 2006
  *
  *-------------------------------------------------------------------------
  */
-int main(void)
+int
+main(void)
 {
     char        filename[1024];
-    unsigned 	nerrors = 0;
+    int         nerrors = 0;
 
     h5_reset();
 
-    puts("Testing reading data created on Linux");
-    h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof filename);
-    nerrors += open_dataset(filename);
+    HDputs("\n");
+    HDputs("Testing reading data created on Linux");
+    h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename));
+    nerrors += check_file(filename);
 
-    puts("Testing reading data created on Solaris");
-    h5_fixname(FILENAME[2], H5P_DEFAULT, filename, sizeof filename);
-    nerrors += open_dataset(filename);
+    HDputs("\n");
+    HDputs("Testing reading data created on Solaris");
+    h5_fixname(FILENAME[2], H5P_DEFAULT, filename, sizeof(filename));
+    nerrors += check_file(filename);
 
-    if (nerrors) {
-        printf("***** %u FAILURE%s! *****\n",
-               nerrors, 1==nerrors?"":"S");
-        HDexit(1);
-    }
+    if(nerrors) {
+        printf("***** %d FAILURE%s! *****\n", nerrors, 1 == nerrors ? "" : "S");
+        return EXIT_FAILURE;
+    } /* end if */
 
     printf("All data type tests passed.\n");
-    return 0;
-}
+    return EXIT_SUCCESS;
+} /* end main() */
+
diff --git a/test/dangle.c b/test/dangle.c
index 4c8ce6b..1717d12 100644
--- a/test/dangle.c
+++ b/test/dangle.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/deflate.h5 b/test/deflate.h5
index e33af4f..2f62e25 100644
Binary files a/test/deflate.h5 and b/test/deflate.h5 differ
diff --git a/test/dsets.c b/test/dsets.c
index 9afea7c..ef58509 100644
--- a/test/dsets.c
+++ b/test/dsets.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -33,13 +31,11 @@
 #include "H5Dpkg.h"
 #include "H5FDpkg.h"
 #include "H5VMprivate.h"
-
 #include "H5Zpkg.h"
 #ifdef H5_HAVE_SZLIB_H
 #   include "szlib.h"
 #endif
 
-
 const char *FILENAME[] = {
     "dataset", 		/* 0 */
     "compact_dataset",	/* 1 */
@@ -62,8 +58,9 @@ const char *FILENAME[] = {
     "swmr_non_latest",  /* 18 */
     "earray_hdr_fd",    /* 19 */
     "farray_hdr_fd",    /* 20 */
-    "bt2_hdr_fd",    /* 21 */
-    "dls_01_strings.h5",/* 22 */ /* used by dls_01 test only */
+    "bt2_hdr_fd",       /* 21 */
+    "storage_size",	/* 22 */
+    "dls_01_strings",   /* 23 */
     NULL
 };
 #define FILENAME_BUF_SIZE       1024
@@ -239,6 +236,14 @@ const char *FILENAME[] = {
 #define EARRAY_EXTEND_INCR      15
 #define EARRAY_MAX_EXTEND       75
  
+/* Parameters for datasets in query storage size tests */
+#define STORAGE_SIZE_DIM1       12
+#define STORAGE_SIZE_DIM2       6
+#define STORAGE_SIZE_MAX_DIM1   100
+#define STORAGE_SIZE_MAX_DIM2   80
+#define STORAGE_SIZE_CHUNK_DIM1 5
+#define STORAGE_SIZE_CHUNK_DIM2 5
+
 /* Shared global arrays */
 #define DSET_DIM1       100
 #define DSET_DIM2       200
@@ -247,6 +252,10 @@ 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;
 
+/* Temporary buffer dimensions */
+#define DSET_TMP_DIM1   50
+#define DSET_TMP_DIM2   100
+
 /* Declarations for test_idx_compatible() */
 #define DSET            "dset"
 #define DSET_FILTER     "dset_filter"
@@ -496,7 +505,7 @@ test_simple_io(const char *env_h5_drvr, hid_t fapl)
 
     TESTING("simple I/O");
 
-    /* Can't run this test with multi-file VFDs */
+    /* Can't run this test with multi-file VFDs because of HDopen/read/seek the file directly */
     if(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi") && HDstrcmp(env_h5_drvr, "family")) {
         h5_fixname(FILENAME[4], fapl, filename, sizeof filename);
 
@@ -622,7 +631,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
+test_userblock_offset(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
 {
     char                filename[FILENAME_BUF_SIZE];
     hid_t		file = -1, fcpl = -1, dataset = -1, space = -1;
@@ -634,12 +643,15 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
 
     TESTING("dataset offset with user block");
 
-    /* Can't run this test with multi-file VFDs */
+    /* Can't run this test with multi-file VFDs because of HDopen/read/seek the file directly */
     if(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi") && HDstrcmp(env_h5_drvr, "family")) {
         h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
 
         if((fcpl=H5Pcreate(H5P_FILE_CREATE)) < 0) goto error;
         if(H5Pset_userblock(fcpl, (hsize_t)USER_BLOCK) < 0) goto error;
+	if(new_format)
+	    if(H5Pset_file_space_page_size(fcpl, (hsize_t)USER_BLOCK) < 0) 
+		goto error;
 
         if((file=H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
             goto error;
@@ -673,7 +685,8 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
 
         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++) {
@@ -1972,10 +1985,11 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl, int if_fletcher32,
         }
     }
 
-    PASSED();
-
     /* Get the storage size of the dataset */
     if((*dset_size=H5Dget_storage_size(dataset))==0) goto error;
+
+    PASSED();
+
     /* Clean up objects used for this test */
     if(H5Dclose (dataset) < 0) goto error;
     if(H5Sclose (sid) < 0) goto error;
@@ -2898,7 +2912,7 @@ test_nbit_int(hid_t file)
     mask = ~((unsigned)~0 << (precision + offset)) & ((unsigned)~0 << offset);
     for(i=0; i<(size_t)size[0]; i++) {
         for(j=0; j<(size_t)size[1]; j++) {
-            if((new_data[i][j] & mask) != (orig_data[i][j] & mask)) {
+            if(((unsigned)new_data[i][j] & mask) != ((unsigned)orig_data[i][j] & mask)) {
                 H5_FAILED();
                 printf("    Read different values than written.\n");
                 printf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
@@ -2920,6 +2934,7 @@ test_nbit_int(hid_t file)
     PASSED();
 
     return 0;
+
 error:
     return -1;
 }
@@ -2958,25 +2973,34 @@ test_nbit_float(hid_t file)
 
     /* Define user-defined single-precision floating-point type for dataset */
     datatype = H5Tcopy(H5T_IEEE_F32BE);
-    if(H5Tset_fields(datatype, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0) goto error;
+    if(H5Tset_fields(datatype, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0)
+        FAIL_STACK_ERROR
     offset = 7;
-    if(H5Tset_offset(datatype,offset) < 0) goto error;
+    if(H5Tset_offset(datatype,offset) < 0)
+        FAIL_STACK_ERROR
     precision = 20;
-    if(H5Tset_precision(datatype,precision) < 0) goto error;
-    if(H5Tset_size(datatype, (size_t)4) < 0) goto error;
-    if(H5Tset_ebias(datatype, (size_t)31) < 0) goto error;
+    if(H5Tset_precision(datatype,precision) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_size(datatype, (size_t)4) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_ebias(datatype, (size_t)31) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the data space */
-    if((space = H5Screate_simple(2, size, NULL)) < 0) goto error;
+    if((space = H5Screate_simple(2, size, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Use nbit filter  */
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_nbit(dc) < 0) goto error;
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_nbit(dc) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataset */
-    if((dataset = H5Dcreate2(file, DSET_NBIT_FLOAT_NAME, datatype,
-                             space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0) goto error;
+    if((dataset = H5Dcreate2(file, DSET_NBIT_FLOAT_NAME, datatype, space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -2986,9 +3010,8 @@ test_nbit_float(hid_t file)
      */
     TESTING("    nbit float (write)");
 
-    if(H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                 orig_data) < 0)
-        goto error;
+    if(H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -2999,17 +3022,17 @@ test_nbit_float(hid_t file)
     TESTING("    nbit float (read)");
 
     /* Read the dataset back */
-    if(H5Dread(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                new_data) < 0)
-        goto error;
+    if(H5Dread(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0)
+        FAIL_STACK_ERROR
 
     /* Check that the values read are the same as the values written
      * Assume size of int = size of float
      */
-    for(i=0; i<(size_t)size[0]; i++) {
-        for(j=0; j<(size_t)size[1]; j++) {
-            if(!(orig_data[i][j]==orig_data[i][j])) continue;  /* skip if value is NaN */
-            if(new_data[i][j] != orig_data[i][j]) {
+    for(i = 0; i < (size_t)size[0]; i++) {
+        for(j = 0; j < (size_t)size[1]; j++) {
+            if(!(orig_data[i][j] == orig_data[i][j]))
+                continue;  /* skip if value is NaN */
+            if(!H5_FLT_ABS_EQUAL(new_data[i][j], orig_data[i][j])) {
                 H5_FAILED();
                 printf("    Read different values than written.\n");
                 printf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
@@ -3022,10 +3045,14 @@ test_nbit_float(hid_t file)
      * Cleanup
      *----------------------------------------------------------------------
      */
-    if(H5Tclose(datatype) < 0) goto error;
-    if(H5Pclose(dc) < 0) goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Dclose(dataset) < 0) goto error;
+    if(H5Tclose(datatype) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dc) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(space) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(dataset) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -3083,25 +3110,34 @@ test_nbit_double(hid_t file)
 
     /* Define user-defined doule-precision floating-point type for dataset */
     datatype = H5Tcopy(H5T_IEEE_F64BE);
-    if(H5Tset_fields(datatype, (size_t)55, (size_t)46, (size_t)9, (size_t)5, (size_t)41) < 0) goto error;
+    if(H5Tset_fields(datatype, (size_t)55, (size_t)46, (size_t)9, (size_t)5, (size_t)41) < 0)
+        FAIL_STACK_ERROR
     offset = 5;
-    if(H5Tset_offset(datatype,offset) < 0) goto error;
+    if(H5Tset_offset(datatype,offset) < 0)
+        FAIL_STACK_ERROR
     precision = 51;
-    if(H5Tset_precision(datatype,precision) < 0) goto error;
-    if(H5Tset_size(datatype, (size_t)8) < 0) goto error;
-    if(H5Tset_ebias(datatype, (size_t)255) < 0) goto error;
+    if(H5Tset_precision(datatype,precision) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_size(datatype, (size_t)8) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_ebias(datatype, (size_t)255) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the data space */
-    if((space = H5Screate_simple(2, size, NULL)) < 0) goto error;
+    if((space = H5Screate_simple(2, size, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Use nbit filter  */
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_nbit(dc) < 0) goto error;
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_nbit(dc) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataset */
-    if((dataset = H5Dcreate2(file, DSET_NBIT_DOUBLE_NAME, datatype,
-                             space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0) goto error;
+    if((dataset = H5Dcreate2(file, DSET_NBIT_DOUBLE_NAME, datatype, space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -3112,9 +3148,8 @@ test_nbit_double(hid_t file)
      */
     TESTING("    nbit double (write)");
 
-    if(H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                 orig_data) < 0)
-        goto error;
+    if(H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0)
+        FAIL_STACK_ERROR
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -3124,17 +3159,17 @@ test_nbit_double(hid_t file)
     TESTING("    nbit double (read)");
 
     /* Read the dataset back */
-    if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                new_data) < 0)
-        goto error;
+    if(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0)
+        FAIL_STACK_ERROR
 
     /* Check that the values read are the same as the values written
      * Assume size of long long = size of double
      */
-    for(i=0; i<(size_t)size[0]; i++) {
-        for(j=0; j<(size_t)size[1]; j++) {
-            if(!(orig_data[i][j]==orig_data[i][j])) continue;  /* skip if value is NaN */
-            if(new_data[i][j] != orig_data[i][j]) {
+    for(i = 0; i < (size_t)size[0]; i++) {
+        for(j = 0; j < (size_t)size[1]; j++) {
+            if(!(orig_data[i][j] == orig_data[i][j]))
+                continue;  /* skip if value is NaN */
+            if(!H5_DBL_ABS_EQUAL(new_data[i][j], orig_data[i][j])) {
                 H5_FAILED();
                 printf("    Read different values than written.\n");
                 printf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
@@ -3147,10 +3182,14 @@ test_nbit_double(hid_t file)
      * Cleanup
      *----------------------------------------------------------------------
      */
-    if(H5Tclose(datatype) < 0) goto error;
-    if(H5Pclose(dc) < 0) goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Dclose(dataset) < 0) goto error;
+    if(H5Tclose(datatype) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dc) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(space) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(dataset) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -3336,73 +3375,103 @@ test_nbit_compound(hid_t file)
     TESTING("    nbit compound (setup)");
 
     /* Define datatypes of members of compound datatype */
-    i_tid=H5Tcopy(H5T_NATIVE_INT);
-    c_tid=H5Tcopy(H5T_NATIVE_CHAR);
-    s_tid=H5Tcopy(H5T_NATIVE_SHORT);
-    f_tid=H5Tcopy(H5T_IEEE_F32BE);
+    if((i_tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        FAIL_STACK_ERROR
+    if((c_tid = H5Tcopy(H5T_NATIVE_CHAR)) < 0)
+        FAIL_STACK_ERROR
+    if((s_tid = H5Tcopy(H5T_NATIVE_SHORT)) < 0)
+        FAIL_STACK_ERROR
+    if((f_tid = H5Tcopy(H5T_IEEE_F32BE)) < 0)
+        FAIL_STACK_ERROR
 
     /* Set precision and offset etc. */
-    if(H5Tset_precision(i_tid,precision[0]) < 0) goto error;
-    if(H5Tset_offset(i_tid,offset[0]) < 0) goto error;
+    if(H5Tset_precision(i_tid,precision[0]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(i_tid,offset[0]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_precision(c_tid,precision[1]) < 0) goto error;
-    if(H5Tset_offset(c_tid,offset[1]) < 0) goto error;
+    if(H5Tset_precision(c_tid,precision[1]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(c_tid,offset[1]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_precision(s_tid,precision[2]) < 0) goto error;
-    if(H5Tset_offset(s_tid,offset[2]) < 0) goto error;
+    if(H5Tset_precision(s_tid,precision[2]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(s_tid,offset[2]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_fields(f_tid, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0) goto error;
-    if(H5Tset_offset(f_tid, (size_t)7) < 0) goto error;
-    if(H5Tset_precision(f_tid, (size_t)20) < 0) goto error;
-    if(H5Tset_size(f_tid, (size_t)4) < 0) goto error;
-    if(H5Tset_ebias(f_tid, (size_t)31) < 0) goto error;
+    if(H5Tset_fields(f_tid, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(f_tid, (size_t)7) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_precision(f_tid, (size_t)20) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_size(f_tid, (size_t)4) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_ebias(f_tid, (size_t)31) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a memory compound datatype before setting the order */
-    mem_cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(atomic));
-    if(H5Tinsert(mem_cmpd_tid, "i", HOFFSET(atomic, i), i_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid, "c", HOFFSET(atomic, c), c_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid, "s", HOFFSET(atomic, s), s_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid, "f", HOFFSET(atomic, f), H5T_NATIVE_FLOAT) < 0) goto error;
+    if((mem_cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(atomic))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid, "i", HOFFSET(atomic, i), i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid, "c", HOFFSET(atomic, c), c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid, "s", HOFFSET(atomic, s), s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid, "f", HOFFSET(atomic, f), H5T_NATIVE_FLOAT) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a dataset compound datatype and insert some atomic types */
-    cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(atomic));
-    if(H5Tinsert(cmpd_tid, "i", HOFFSET(atomic, i), i_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid, "c", HOFFSET(atomic, c), c_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid, "s", HOFFSET(atomic, s), s_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid, "f", HOFFSET(atomic, f), f_tid) < 0) goto error;
+    if((cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(atomic))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid, "i", HOFFSET(atomic, i), i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid, "c", HOFFSET(atomic, c), c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid, "s", HOFFSET(atomic, s), s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid, "f", HOFFSET(atomic, f), f_tid) < 0)
+        FAIL_STACK_ERROR
 
     /* Set order of dataset compound datatype */
-    if(H5Tset_order(cmpd_tid, H5T_ORDER_BE) < 0) goto error;
+    if(H5Tset_order(cmpd_tid, H5T_ORDER_BE) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the data space */
-    if((space = H5Screate_simple(2, size, NULL)) < 0) goto error;
+    if((space = H5Screate_simple(2, size, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Use nbit filter  */
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_nbit(dc) < 0) goto error;
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_nbit(dc) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataset */
-    if((dataset = H5Dcreate2(file, DSET_NBIT_COMPOUND_NAME, cmpd_tid,
-                             space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0) goto error;
+    if((dataset = H5Dcreate2(file, DSET_NBIT_COMPOUND_NAME, cmpd_tid, space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* 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++) {
-        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 */
-        if((i*size[1]+j+1)%2 == 0) {
-            orig_data[i][j].i = -orig_data[i][j].i;
-            orig_data[i][j].s = (short)-orig_data[i][j].s;
+    for(i = 0; i < (size_t)size[0]; i++)
+        for(j = 0; j < (size_t)size[1]; j++) {
+            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 */
+            if((i * size[1] + j + 1) % 2 == 0) {
+                orig_data[i][j].i = -orig_data[i][j].i;
+                orig_data[i][j].s = (short)-orig_data[i][j].s;
+            }
         }
-      }
 
     PASSED();
 
@@ -3413,9 +3482,8 @@ test_nbit_compound(hid_t file)
      */
     TESTING("    nbit compound (write)");
 
-    if(H5Dwrite(dataset, mem_cmpd_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                 orig_data) < 0)
-        goto error;
+    if(H5Dwrite(dataset, mem_cmpd_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0)
+        FAIL_STACK_ERROR
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -3425,9 +3493,8 @@ test_nbit_compound(hid_t file)
     TESTING("    nbit compound (read)");
 
     /* Read the dataset back */
-    if(H5Dread(dataset, mem_cmpd_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                new_data) < 0)
-        goto error;
+    if(H5Dread(dataset, mem_cmpd_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0)
+        FAIL_STACK_ERROR
 
     /* Check that the values read are the same as the values written
      * Use mask for checking the significant bits, ignoring the padding bits
@@ -3435,12 +3502,12 @@ test_nbit_compound(hid_t file)
     i_mask = ~((unsigned)~0 << (precision[0] + offset[0])) & ((unsigned)~0 << offset[0]);
     c_mask = ~((unsigned)~0 << (precision[1] + offset[1])) & ((unsigned)~0 << offset[1]);
     s_mask = ~((unsigned)~0 << (precision[2] + offset[2])) & ((unsigned)~0 << offset[2]);
-    for(i=0; i<size[0]; i++) {
-        for(j=0; j<size[1]; j++) {
-            if((new_data[i][j].i & i_mask) != (orig_data[i][j].i & i_mask) ||
-                (new_data[i][j].c & c_mask) != (orig_data[i][j].c & c_mask) ||
-                (new_data[i][j].s & s_mask) != (orig_data[i][j].s & s_mask) ||
-                (orig_data[i][j].f==orig_data[i][j].f && new_data[i][j].f != orig_data[i][j].f))
+    for(i = 0; i < size[0]; i++) {
+        for(j = 0; j < size[1]; j++) {
+            if(((unsigned)new_data[i][j].i & i_mask) != ((unsigned)orig_data[i][j].i & i_mask) ||
+                ((unsigned)new_data[i][j].c & c_mask) != ((unsigned)orig_data[i][j].c & c_mask) ||
+                ((unsigned)new_data[i][j].s & s_mask) != ((unsigned)orig_data[i][j].s & s_mask) ||
+                (orig_data[i][j].f == orig_data[i][j].f && !H5_FLT_ABS_EQUAL(new_data[i][j].f, orig_data[i][j].f)))
             {
                 H5_FAILED();
                 printf("    Read different values than written.\n");
@@ -3454,15 +3521,24 @@ test_nbit_compound(hid_t file)
      * Cleanup
      *----------------------------------------------------------------------
      */
-    if(H5Tclose(i_tid) < 0) goto error;
-    if(H5Tclose(c_tid) < 0) goto error;
-    if(H5Tclose(s_tid) < 0) goto error;
-    if(H5Tclose(f_tid) < 0) goto error;
-    if(H5Tclose(cmpd_tid) < 0) goto error;
-    if(H5Tclose(mem_cmpd_tid) < 0) goto error;
-    if(H5Pclose(dc) < 0) goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Dclose(dataset) < 0) goto error;
+    if(H5Tclose(i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(f_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(cmpd_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(mem_cmpd_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dc) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(space) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(dataset) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -3531,119 +3607,169 @@ test_nbit_compound_2(hid_t file)
     TESTING("    nbit compound complex (setup)");
 
     /* Define datatypes of members of compound datatype */
-    i_tid=H5Tcopy(H5T_NATIVE_INT);
-    c_tid=H5Tcopy(H5T_NATIVE_CHAR);
-    s_tid=H5Tcopy(H5T_NATIVE_SHORT);
-    v_tid=H5Tcopy(H5T_NATIVE_UINT);
-    f_tid=H5Tcopy(H5T_IEEE_F32BE);
+    if((i_tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        FAIL_STACK_ERROR
+    if((c_tid = H5Tcopy(H5T_NATIVE_CHAR)) < 0)
+        FAIL_STACK_ERROR
+    if((s_tid = H5Tcopy(H5T_NATIVE_SHORT)) < 0)
+        FAIL_STACK_ERROR
+    if((v_tid = H5Tcopy(H5T_NATIVE_UINT)) < 0)
+        FAIL_STACK_ERROR
+    if((f_tid = H5Tcopy(H5T_IEEE_F32BE)) < 0)
+        FAIL_STACK_ERROR
 
     /* Set precision and offset etc. of atomic compound datatype members */
-    if(H5Tset_precision(i_tid,precision[0]) < 0) goto error;
-    if(H5Tset_offset(i_tid,offset[0]) < 0) goto error;
+    if(H5Tset_precision(i_tid,precision[0]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(i_tid,offset[0]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_precision(c_tid,precision[1]) < 0) goto error;
-    if(H5Tset_offset(c_tid,offset[1]) < 0) goto error;
+    if(H5Tset_precision(c_tid,precision[1]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(c_tid,offset[1]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_precision(s_tid,precision[2]) < 0) goto error;
-    if(H5Tset_offset(s_tid,offset[2]) < 0) goto error;
+    if(H5Tset_precision(s_tid,precision[2]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(s_tid,offset[2]) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Tset_fields(f_tid, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0) goto error;
-    if(H5Tset_offset(f_tid, (size_t)7) < 0) goto error;
-    if(H5Tset_precision(f_tid, (size_t)20) < 0) goto error;
-    if(H5Tset_size(f_tid, (size_t)4) < 0) goto error;
-    if(H5Tset_ebias(f_tid, (size_t)31) < 0) goto error;
+    if(H5Tset_fields(f_tid, (size_t)26, (size_t)20, (size_t)6, (size_t)7, (size_t)13) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(f_tid, (size_t)7) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_precision(f_tid, (size_t)20) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_size(f_tid, (size_t)4) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_ebias(f_tid, (size_t)31) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a memory atomic compound datatype before setting the order */
-    mem_cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(atomic));
-    if(H5Tinsert(mem_cmpd_tid1, "i", HOFFSET(atomic, i), i_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid1, "c", HOFFSET(atomic, c), c_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid1, "s", HOFFSET(atomic, s), s_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid1, "f", HOFFSET(atomic, f), H5T_NATIVE_FLOAT) < 0) goto error;
+    if((mem_cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(atomic))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid1, "i", HOFFSET(atomic, i), i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid1, "c", HOFFSET(atomic, c), c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid1, "s", HOFFSET(atomic, s), s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid1, "f", HOFFSET(atomic, f), H5T_NATIVE_FLOAT) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a dataset atomic compound datatype and insert some atomic types */
-    cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(atomic));
-    if(H5Tinsert(cmpd_tid1, "i", HOFFSET(atomic, i), i_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid1, "c", HOFFSET(atomic, c), c_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid1, "s", HOFFSET(atomic, s), s_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid1, "f", HOFFSET(atomic, f), f_tid) < 0) goto error;
+    if((cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(atomic))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid1, "i", HOFFSET(atomic, i), i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid1, "c", HOFFSET(atomic, c), c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid1, "s", HOFFSET(atomic, s), s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid1, "f", HOFFSET(atomic, f), f_tid) < 0)
+        FAIL_STACK_ERROR
 
     /* Set order of dataset compound datatype */
-    if(H5Tset_order(cmpd_tid1, H5T_ORDER_BE) < 0) goto error;
+    if(H5Tset_order(cmpd_tid1, H5T_ORDER_BE) < 0)
+        FAIL_STACK_ERROR
 
     /* Set precision and offset of the other data member */
-    if(H5Tset_precision(v_tid,precision[3]) < 0) goto error;
-    if(H5Tset_offset(v_tid,offset[3]) < 0) goto error;
+    if(H5Tset_precision(v_tid,precision[3]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(v_tid,offset[3]) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the simple array datatype */
-    base_tid = H5Tcopy(H5T_NATIVE_CHAR);
-    if(H5Tset_precision(base_tid,precision[4]) < 0) goto error;
-    if(H5Tset_offset(base_tid,offset[4]) < 0) goto error;
-    array_tid = H5Tarray_create2(base_tid, 2, array_dims);
+    if((base_tid = H5Tcopy(H5T_NATIVE_CHAR)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_precision(base_tid,precision[4]) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tset_offset(base_tid,offset[4]) < 0)
+        FAIL_STACK_ERROR
+    if((array_tid = H5Tarray_create2(base_tid, 2, array_dims)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the complex memory and dataset array datatype */
-    array_cmplx_tid = H5Tarray_create2(cmpd_tid1, 2, array_dims);
-    mem_array_cmplx_tid = H5Tarray_create2(mem_cmpd_tid1, 2, array_dims);
+    if((array_cmplx_tid = H5Tarray_create2(cmpd_tid1, 2, array_dims)) < 0)
+        FAIL_STACK_ERROR
+    if((mem_array_cmplx_tid = H5Tarray_create2(mem_cmpd_tid1, 2, array_dims)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a memory complex compound datatype before setting the order */
-    mem_cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(complex));
-    if(H5Tinsert(mem_cmpd_tid2, "a", HOFFSET(complex, a), mem_cmpd_tid1) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid2, "v", HOFFSET(complex, v), v_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid2, "b", HOFFSET(complex, b), array_tid) < 0) goto error;
-    if(H5Tinsert(mem_cmpd_tid2, "d", HOFFSET(complex, d), mem_array_cmplx_tid) < 0) goto error;
+    if((mem_cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(complex))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid2, "a", HOFFSET(complex, a), mem_cmpd_tid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid2, "v", HOFFSET(complex, v), v_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid2, "b", HOFFSET(complex, b), array_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(mem_cmpd_tid2, "d", HOFFSET(complex, d), mem_array_cmplx_tid) < 0)
+        FAIL_STACK_ERROR
 
     /* Set order of dataset other complex compound member datatype */
-    if(H5Tset_order(v_tid, H5T_ORDER_BE) < 0) goto error;
+    if(H5Tset_order(v_tid, H5T_ORDER_BE) < 0)
+        FAIL_STACK_ERROR
 
     /* Create a dataset complex compound datatype and insert members */
-    cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(complex));
-    if(H5Tinsert(cmpd_tid2, "a", HOFFSET(complex, a), cmpd_tid1) < 0) goto error;
-    if(H5Tinsert(cmpd_tid2, "v", HOFFSET(complex, v), v_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid2, "b", HOFFSET(complex, b), array_tid) < 0) goto error;
-    if(H5Tinsert(cmpd_tid2, "d", HOFFSET(complex, d), array_cmplx_tid) < 0) goto error;
+    if((cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(complex))) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid2, "a", HOFFSET(complex, a), cmpd_tid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid2, "v", HOFFSET(complex, v), v_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid2, "b", HOFFSET(complex, b), array_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tinsert(cmpd_tid2, "d", HOFFSET(complex, d), array_cmplx_tid) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the data space */
-    if((space = H5Screate_simple(2, size, NULL)) < 0) goto error;
+    if((space = H5Screate_simple(2, size, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Use nbit filter  */
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_nbit(dc) < 0) goto error;
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_nbit(dc) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataset */
-    if((dataset = H5Dcreate2(file, DSET_NBIT_COMPOUND_NAME_2, cmpd_tid2,
-                             space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0) goto error;
+    if((dataset = H5Dcreate2(file, DSET_NBIT_COMPOUND_NAME_2, cmpd_tid2, space, H5P_DEFAULT, dc, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* 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++) {
-        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];
-
-        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++) {
-            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++) {
+        for(j = 0; j < (size_t)size[1]; j++) {
             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]);
+            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].d[m][n].c = (char)(((long long)HDrandom() % (long long)power) << offset[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].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 */
+            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];
+
+            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++) {
+                    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++) {
+                    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();
 
@@ -3654,9 +3780,8 @@ test_nbit_compound_2(hid_t file)
      */
     TESTING("    nbit compound complex (write)");
 
-    if(H5Dwrite(dataset, mem_cmpd_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                 orig_data) < 0)
-        goto error;
+    if(H5Dwrite(dataset, mem_cmpd_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0)
+        FAIL_STACK_ERROR
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -3666,9 +3791,8 @@ test_nbit_compound_2(hid_t file)
     TESTING("    nbit compound complex (read)");
 
     /* Read the dataset back */
-    if(H5Dread(dataset, mem_cmpd_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                new_data) < 0)
-        goto error;
+    if(H5Dread(dataset, mem_cmpd_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0)
+        FAIL_STACK_ERROR
 
     /* Check that the values read are the same as the values written
      * Use mask for checking the significant bits, ignoring the padding bits
@@ -3689,63 +3813,77 @@ test_nbit_compound_2(hid_t file)
     s_mask = ~((unsigned)~0 << (precision[2] + offset[2])) & ((unsigned)~0 << offset[2]);
     b_mask = ~((unsigned)~0 << (precision[4] + offset[4])) & ((unsigned)~0 << offset[4]);
     for(i=0; i<(size_t)size[0]; i++) {
-      for(j=0; j<(size_t)size[1]; j++) {
-        b_failed = 0;
-        d_failed = 0;
+        for(j=0; j<(size_t)size[1]; j++) {
+            b_failed = 0;
+            d_failed = 0;
 
-        for(m = 0; m < (size_t)array_dims[0]; m++)
-          for(n = 0; n < (size_t)array_dims[1]; n++)
-             if((new_data[i][j].b[m][n]&b_mask)!=(orig_data[i][j].b[m][n]&b_mask)) {
+            for(m = 0; m < (size_t)array_dims[0]; m++)
+            for(n = 0; n < (size_t)array_dims[1]; n++)
+            if(((unsigned)new_data[i][j].b[m][n] & b_mask)!=((unsigned)orig_data[i][j].b[m][n] & b_mask)) {
                 b_failed = 1;
                 goto out;
-             }
-
-        for(m = 0; m < (size_t)array_dims[0]; m++)
-          for(n = 0; n < (size_t)array_dims[1]; n++)
-             if((new_data[i][j].d[m][n].i & i_mask)!=(orig_data[i][j].d[m][n].i & i_mask)||
-                (new_data[i][j].d[m][n].c & c_mask)!=(orig_data[i][j].d[m][n].c & c_mask)||
-                (new_data[i][j].d[m][n].s & s_mask)!=(orig_data[i][j].d[m][n].s & s_mask)||
-                (new_data[i][j].d[m][n].f==new_data[i][j].d[m][n].f &&
-                 new_data[i][j].d[m][n].f != new_data[i][j].d[m][n].f)) {
-                d_failed = 1;
-                goto out;
-             }
-
-        out:
-        if((new_data[i][j].a.i & i_mask)!=(orig_data[i][j].a.i & i_mask)||
-           (new_data[i][j].a.c & c_mask)!=(orig_data[i][j].a.c & c_mask)||
-           (new_data[i][j].a.s & s_mask)!=(orig_data[i][j].a.s & s_mask)||
-           (new_data[i][j].a.f==new_data[i][j].a.f &&
-            new_data[i][j].a.f != new_data[i][j].a.f)||
-            new_data[i][j].v != orig_data[i][j].v || b_failed || d_failed) {
-           H5_FAILED();
-           printf("    Read different values than written.\n");
-           printf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
-           goto error;
+            }
+
+            for(m = 0; m < (size_t)array_dims[0]; m++)
+                for(n = 0; n < (size_t)array_dims[1]; n++)
+                    if(((unsigned)new_data[i][j].d[m][n].i & i_mask) != ((unsigned)orig_data[i][j].d[m][n].i & i_mask)||
+                            ((unsigned)new_data[i][j].d[m][n].c & c_mask) != ((unsigned)orig_data[i][j].d[m][n].c & c_mask)||
+                            ((unsigned)new_data[i][j].d[m][n].s & s_mask) != ((unsigned)orig_data[i][j].d[m][n].s & s_mask)||
+                            (new_data[i][j].d[m][n].f == new_data[i][j].d[m][n].f && !H5_FLT_ABS_EQUAL(new_data[i][j].d[m][n].f, new_data[i][j].d[m][n].f))) {
+                        d_failed = 1;
+                        goto out;
+                    }
+
+out:
+            if(((unsigned)new_data[i][j].a.i & i_mask) != ((unsigned)orig_data[i][j].a.i & i_mask)||
+                    ((unsigned)new_data[i][j].a.c & c_mask) != ((unsigned)orig_data[i][j].a.c & c_mask)||
+                    ((unsigned)new_data[i][j].a.s & s_mask) != ((unsigned)orig_data[i][j].a.s & s_mask)||
+                    (new_data[i][j].a.f == new_data[i][j].a.f && !H5_FLT_ABS_EQUAL(new_data[i][j].a.f, new_data[i][j].a.f)) ||
+                    new_data[i][j].v != orig_data[i][j].v || b_failed || d_failed) {
+                H5_FAILED();
+                printf("    Read different values than written.\n");
+                printf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                goto error;
+            }
         }
-      }
     }
 
     /*----------------------------------------------------------------------
      * Cleanup
      *----------------------------------------------------------------------
      */
-    if(H5Tclose(i_tid) < 0) goto error;
-    if(H5Tclose(c_tid) < 0) goto error;
-    if(H5Tclose(s_tid) < 0) goto error;
-    if(H5Tclose(f_tid) < 0) goto error;
-    if(H5Tclose(v_tid) < 0) goto error;
-    if(H5Tclose(cmpd_tid2) < 0) goto error;
-    if(H5Tclose(cmpd_tid1) < 0) goto error;
-    if(H5Tclose(mem_cmpd_tid2) < 0) goto error;
-    if(H5Tclose(mem_cmpd_tid1) < 0) goto error;
-    if(H5Tclose(array_tid) < 0) goto error;
-    if(H5Tclose(base_tid) < 0) goto error;
-    if(H5Tclose(array_cmplx_tid) < 0) goto error;
-    if(H5Tclose(mem_array_cmplx_tid) < 0) goto error;
-    if(H5Pclose(dc) < 0) goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Dclose(dataset) < 0) goto error;
+    if(H5Tclose(i_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(c_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(s_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(f_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(v_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(cmpd_tid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(cmpd_tid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(mem_cmpd_tid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(mem_cmpd_tid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(array_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(base_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(array_cmplx_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(mem_array_cmplx_tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dc) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(space) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(dataset) < 0)
+        FAIL_STACK_ERROR
 
     PASSED();
 
@@ -3838,7 +3976,7 @@ test_nbit_compound_3(hid_t file)
     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)power;
+        orig_data[i].i = (int)(HDrandom() % (long)power);
         HDstrcpy(orig_data[i].str, "fixed-length C string");
         orig_data[i].vl_str = HDstrdup("variable-length C string");
 
@@ -4209,7 +4347,7 @@ test_nbit_flt_size(hid_t file)
    */
    for (i=0; i < DSET_DIM1; i++)
        for (j=0; j < DSET_DIM2; j++)
-           orig_data[i][j] = (rand() % 1234567) / 2;
+           orig_data[i][j] = (float)(HDrandom() % 1234567) / 2;
 
 
    /* Describe the dataspace. */
@@ -4593,7 +4731,7 @@ test_scaleoffset_float(hid_t file)
     /* Initialize data */
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[i][j] = (float)((HDrandom() % 100000) / 1000.0F);
+        orig_data[i][j] = (float)(HDrandom() % 100000) / 1000.0F;
 
         /* even-numbered values are negtive */
         if((i*size[1]+j+1)%2 == 0)
@@ -4724,10 +4862,10 @@ test_scaleoffset_float_2(hid_t file)
 
     /* Initialize data of hyperslab */
     for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[0][j] = (float)((HDrandom() % 100000) / 1000.0F);
+        orig_data[0][j] = (float)(HDrandom() % 100000) / 1000.0F;
 
         /* even-numbered values are negtive */
-        if((j+1)%2 == 0)
+        if((j + 1) % 2 == 0)
             orig_data[0][j] = -orig_data[0][j];
     }
 
@@ -4835,10 +4973,10 @@ test_scaleoffset_double(hid_t file)
     /* Initialize data */
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[i][j] = (HDrandom() % 10000000) / 10000000.0F;
+        orig_data[i][j] = (float)(HDrandom() % 10000000) / 10000000.0F;
 
         /* even-numbered values are negtive */
-        if((i*size[1]+j+1)%2 == 0)
+        if((i* size[1] + j + 1) % 2 == 0)
             orig_data[i][j] = -orig_data[i][j];
       }
 
@@ -4966,10 +5104,10 @@ test_scaleoffset_double_2(hid_t file)
 
     /* Initialize data of hyperslab */
     for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[0][j] = (HDrandom() % 10000000) / 10000000.0F;
+        orig_data[0][j] = (float)(HDrandom() % 10000000) / 10000000.0F;
 
         /* even-numbered values are negtive */
-        if((j+1)%2 == 0)
+        if((j + 1) % 2 == 0)
             orig_data[0][j] = -orig_data[0][j];
     }
 
@@ -5964,7 +6102,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(!H5_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], (double)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));
@@ -6531,6 +6669,9 @@ test_zero_dims(hid_t file)
     /* Get library format */
     if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) FAIL_STACK_ERROR
 
+    /* Close FAPL */
+    if(H5Pclose(fapl) < 0) TEST_ERROR
+
     /* 
      * One-dimensional dataset 
      */
@@ -6643,6 +6784,8 @@ test_zero_dims(hid_t file)
 
 error:
     H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+
         H5Pclose(dcpl);
         H5Dclose(d);
         H5Sclose(s);
@@ -6706,6 +6849,9 @@ test_missing_chunk(hid_t file)
     /* Get library format */
     if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) TEST_ERROR;
 
+    /* Close FAPL */
+    if(H5Pclose(fapl) < 0) TEST_ERROR
+
     /* Initialize data for 1-D dataset */
     for(u = 0; u < MISSING_CHUNK_DIM; u++) {
         wdata[u] = (int)u;
@@ -6715,7 +6861,7 @@ test_missing_chunk(hid_t file)
     /* 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);
+	    wdata2[i][j] = (int)(j + (i * MISSING_CHUNK_DIM));
 	    rdata2[i][j] = 911;
 	}
     } /* end for */
@@ -6831,6 +6977,8 @@ test_missing_chunk(hid_t file)
 
 error:
     H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+
         H5Pclose(dcpl);
         H5Pclose(dcpl2);
         H5Dclose(d);
@@ -7631,7 +7779,7 @@ test_chunk_cache(hid_t fapl)
     /* Set new rdcc settings on fapl */
     nslots_2 = nslots_1 * 2;
     nbytes_2 = nbytes_1 * 2;
-    w0_2 = w0_1 / 2.0F;
+    w0_2 = w0_1 / (double)2.0F;
     if (H5Pset_cache(fapl_local, 0, nslots_2, nbytes_2, w0_2) < 0) FAIL_STACK_ERROR
 
     h5_fixname(FILENAME[8], fapl, filename, sizeof filename);
@@ -7815,9 +7963,8 @@ test_big_chunks_bypass_cache(hid_t fapl)
     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];	
+		/* Buffers for reading and writing data (1-D) */
+    int         *wdata = NULL, *rdata1 = NULL, *rdata2 = NULL;	
 		/* 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];
@@ -7904,6 +8051,14 @@ test_big_chunks_bypass_cache(hid_t fapl)
     if(H5Sselect_hyperslab(t_sid, H5S_SELECT_SET, t_offset, t_stride, t_count, t_block) < 0)
         FAIL_STACK_ERROR
 
+    /* Allocate buffers */
+    if(NULL == (wdata = (int *)HDmalloc(sizeof(int) * (BYPASS_CHUNK_DIM / 2))))
+        TEST_ERROR
+    if(NULL == (rdata1 = (int *)HDmalloc(sizeof(int) * BYPASS_DIM)))
+        TEST_ERROR
+    if(NULL == (rdata2 = (int *)HDmalloc(sizeof(int) * (BYPASS_CHUNK_DIM / 2))))
+        TEST_ERROR
+
     /* Initialize data to write for 1-D dataset */
     for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
         wdata[i] = i;
@@ -8038,6 +8193,11 @@ test_big_chunks_bypass_cache(hid_t fapl)
     if(H5Pclose(fapl_local) < 0) FAIL_STACK_ERROR
     if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
 
+    /* Release buffers */
+    HDfree(wdata);
+    HDfree(rdata1);
+    HDfree(rdata2);
+
     PASSED();
     return 0;
 
@@ -8052,6 +8212,12 @@ error:
         H5Sclose(t_sid);
         H5Fclose(fid);
     } H5E_END_TRY;
+    if(wdata)
+        HDfree(wdata);
+    if(rdata1)
+        HDfree(rdata1);
+    if(rdata2)
+        HDfree(rdata2);
     return -1;
 } /* end test_big_chunks_bypass_cache() */
 
@@ -8128,9 +8294,8 @@ test_chunk_fast(const char *env_h5_driver, hid_t fapl)
         /* 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)) {
+        if(swmr && !H5FD_supports_swmr_test(env_h5_driver))
             continue;
-        }
 
 #ifdef H5_HAVE_FILTER_DEFLATE
         /* Loop over compressing chunks */
@@ -8143,7 +8308,7 @@ test_chunk_fast(const char *env_h5_driver, hid_t fapl)
             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++) {
+            for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; H5_INC_ENUM(H5D_alloc_time_t, alloc_time)) {
                 unsigned ndims;          /* Current # of dims to test */
 
                 /* Loop over dataspace ranks to test */
@@ -8443,7 +8608,7 @@ test_reopen_chunk_fast(hid_t fapl)
     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++) {
+    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
 
@@ -8574,7 +8739,7 @@ test_chunk_fast_bug1(hid_t fapl)
     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++) {
+    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
 
@@ -9150,9 +9315,9 @@ test_fixed_array(hid_t fapl)
     hsize_t     msize_big[1] = {POINTS_BIG};    /* Size of memory space for big dataset */
 
     int         wbuf[POINTS];           /* write buffer */
-    int         wbuf_big[POINTS_BIG];  	/* write buffer for big dataset */
+    int         *wbuf_big = NULL;  	/* write buffer for big dataset */
     int         rbuf[POINTS];          	/* read buffer */
-    int         rbuf_big[POINTS_BIG];  	/* read buffer for big dataset */
+    int         *rbuf_big = NULL;  	/* read buffer for big dataset */
 
     hsize_t     chunk_dim2[2] = {4, 3}; /* Chunk dimensions */
     int         chunks[12][6];          /* # of chunks for dataset dimensions */
@@ -9194,13 +9359,19 @@ test_fixed_array(hid_t fapl)
     if((empty_size = h5_get_file_size(filename, fapl)) < 0)
         TEST_ERROR
 
+    /* Allocate the "big" buffers */
+    if(NULL == (wbuf_big = (int *)HDmalloc(sizeof(int) * POINTS_BIG)))
+        TEST_ERROR
+    if(NULL == (rbuf_big = (int *)HDmalloc(sizeof(int) * POINTS_BIG)))
+        TEST_ERROR
+
 #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++) {
+        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
 
@@ -9452,7 +9623,7 @@ test_fixed_array(hid_t fapl)
 
 	    /* Verify that written and read data are the same */
 	    for(i = 0; i < POINTS_BIG; i++)
-		if(rbuf_big[i] != wbuf_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;
@@ -9484,6 +9655,10 @@ test_fixed_array(hid_t fapl)
     } /* end for */
 #endif /* H5_HAVE_FILTER_DEFLATE */
 
+    /* Release buffers */
+    HDfree(wbuf_big);
+    HDfree(rbuf_big);
+
     PASSED();
     return 0;
 
@@ -9495,6 +9670,10 @@ error:
         H5Sclose(mem_id);
         H5Fclose(fid);
     } H5E_END_TRY;
+    if(wbuf_big)
+        HDfree(wbuf_big);
+    if(rbuf_big)
+        HDfree(rbuf_big);
     return -1;
 } /* end test_fixed_array() */
 
@@ -9535,11 +9714,11 @@ test_single_chunk(hid_t fapl)
     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 */
+    hsize_t     t_dim2[2] = {DSET_TMP_DIM1, DSET_TMP_DIM2};   /* Dataset dimensions */
+    int         *wbuf = NULL;            /* write buffer */
+    int         *t_wbuf = NULL;          /* write buffer */
+    int         *rbuf = NULL;          	 /* read buffer */
+    int         *t_rbuf = NULL;          /* read buffer */
 
     H5D_chunk_index_t idx_type; 	/* Dataset chunk index type */
     H5F_libver_t low, high;     	/* File format bounds */
@@ -9571,11 +9750,21 @@ test_single_chunk(hid_t fapl)
     if((empty_size = h5_get_file_size(filename, fapl)) < 0)
         TEST_ERROR
 
+    /* Allocate the buffers */
+    if(NULL == (wbuf = (int *)HDmalloc(sizeof(int) * (DSET_DIM1 * DSET_DIM2))))
+        TEST_ERROR
+    if(NULL == (rbuf = (int *)HDmalloc(sizeof(int) * (DSET_DIM1 * DSET_DIM2))))
+        TEST_ERROR
+    if(NULL == (t_wbuf = (int *)HDmalloc(sizeof(int) * (DSET_TMP_DIM1 * DSET_TMP_DIM2))))
+        TEST_ERROR
+    if(NULL == (t_rbuf = (int *)HDmalloc(sizeof(int) * (DSET_TMP_DIM1 * DSET_TMP_DIM2))))
+        TEST_ERROR
+
     for(i = n = 0; i < (DSET_DIM1 * DSET_DIM2); i++)
-	wbuf[i] = n++;
+	wbuf[i] = (int)n++;
 
-    for(i = n = 0; i < (50* 100); i++)
-	t_wbuf[i] = n++;
+    for(i = n = 0; i < (DSET_TMP_DIM1* DSET_TMP_DIM2); i++)
+	t_wbuf[i] = (int)n++;
 
 #ifdef H5_HAVE_FILTER_DEFLATE
     /* Loop over compressing chunks */
@@ -9583,7 +9772,7 @@ test_single_chunk(hid_t fapl)
 #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++) {
+        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
 
@@ -9685,14 +9874,14 @@ test_single_chunk(hid_t fapl)
 	    /* Open the second dataset */
 	    if((did = H5Dopen2(fid, DSET_SINGLE_NOMAX, H5P_DEFAULT)) < 0) TEST_ERROR;
 
-	    HDmemset(rbuf, 0, sizeof(rbuf));
+	    HDmemset(rbuf, 0, sizeof(int) * (DSET_DIM1 * DSET_DIM2));
 
 	    /* 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]){
+	    for(i = 0; i < (DSET_TMP_DIM1* DSET_TMP_DIM2); 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;
@@ -9721,6 +9910,12 @@ test_single_chunk(hid_t fapl)
     } /* end for */
 #endif /* H5_HAVE_FILTER_DEFLATE */
 
+    /* Release buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(t_wbuf);
+    HDfree(t_rbuf);
+
     PASSED();
     return 0;
 
@@ -9734,6 +9929,14 @@ error:
         H5Sclose(sid_max);
         H5Fclose(fid);
     } H5E_END_TRY;
+    if(wbuf)
+        HDfree(wbuf);
+    if(rbuf)
+        HDfree(rbuf);
+    if(t_wbuf)
+        HDfree(t_wbuf);
+    if(t_rbuf)
+        HDfree(t_rbuf);
     return -1;
 } /* end test_single_chunk() */
 
@@ -9874,7 +10077,7 @@ test_unfiltered_edge_chunks(hid_t fapl)
     /* 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;
+            wbuf[i][j] = (char)((2 * i) - j);
 
     /* Reset byte counts */
     count_nbytes_read = (size_t)0;
@@ -10750,6 +10953,400 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function: test_storage_size
+ *
+ * Purpose:     Tests results from querying the storage size of a dataset,
+ *              before/after extending the dimensions.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, April 11, 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_storage_size(hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1, dcpl2 = -1;  /* Dataset creation property list IDs */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     dims[2], max_dims[2]; /* Dataset dimensions */
+    hsize_t     new_dims[2];    /* New dataset dimensions */
+    hsize_t     chunk_dims[2];  /* Chunk dimensions */
+    int         wdata[STORAGE_SIZE_DIM1][STORAGE_SIZE_DIM2];
+    hsize_t     ssize;          /* Dataset storage size */
+
+    TESTING("querying storage size");
+
+    h5_fixname(FILENAME[22], 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 chunk size */
+    chunk_dims[0] = STORAGE_SIZE_CHUNK_DIM1;
+    chunk_dims[1] = STORAGE_SIZE_CHUNK_DIM2;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0) FAIL_STACK_ERROR
+
+    /* Copy the DCPL, and set it to early allocation */
+    if((dcpl2 = H5Pcopy(dcpl)) < 0) FAIL_STACK_ERROR
+    if(H5Pset_alloc_time(dcpl2, H5D_ALLOC_TIME_EARLY) < 0) FAIL_STACK_ERROR
+
+    /* Create 2D dataspace, with max dims same as current dimensions */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = STORAGE_SIZE_DIM1;
+    max_dims[1] = STORAGE_SIZE_DIM2;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset */
+    if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset", fid, "dset_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (but not unlimited) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = STORAGE_SIZE_MAX_DIM1;
+    max_dims[1] = STORAGE_SIZE_MAX_DIM2;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset */
+    if((dsid = H5Dcreate2(fid, "dset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset2", fid, "dset2_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset2_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (but not unlimited) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = STORAGE_SIZE_MAX_DIM1;
+    max_dims[1] = STORAGE_SIZE_MAX_DIM2;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset, w/early allocation */
+    if((dsid = H5Dcreate2(fid, "dset2a", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset2a", fid, "dset2a_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset2a_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (and 1 unlimited dim) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = STORAGE_SIZE_MAX_DIM2;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset */
+    if((dsid = H5Dcreate2(fid, "dset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset3", fid, "dset3_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset3_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (and 1 unlimited dim) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = STORAGE_SIZE_MAX_DIM2;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset, w/early allocation */
+    if((dsid = H5Dcreate2(fid, "dset3a", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset3a", fid, "dset3a_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset3a_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (and 2 unlimited dims) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset */
+    if((dsid = H5Dcreate2(fid, "dset4", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset4", fid, "dset4_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset4_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Create 2D dataspace with max dims > current dims (and 2 unlimited dims) */
+    dims[0] = STORAGE_SIZE_DIM1;
+    dims[1] = STORAGE_SIZE_DIM2;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset, w/early allocation */
+    if((dsid = H5Dcreate2(fid, "dset4a", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer to zeroes */
+    HDmemset(wdata, 0, sizeof(wdata));
+
+    /* write elements to dataset */
+    if(H5Dwrite(dsid, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 6 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Extend dataset's dimensions */
+    new_dims[0] = STORAGE_SIZE_DIM1 * 2;
+    new_dims[1] = STORAGE_SIZE_DIM2 * 2;
+    if(H5Dset_extent(dsid, new_dims) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close dataset & dataspace */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+    /* Copy the dataset */
+    if(H5Ocopy(fid, "dset4a", fid, "dset4a_copy", H5P_DEFAULT, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+    /* Open the copied dataset */
+    if((dsid = H5Dopen2(fid, "dset4a_copy", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the storage size */
+    if(0 == (ssize = H5Dget_storage_size(dsid))) FAIL_STACK_ERROR
+    if((sizeof(int) * 15 * STORAGE_SIZE_CHUNK_DIM1 * STORAGE_SIZE_CHUNK_DIM2) != ssize) TEST_ERROR
+
+    /* Close copied dataset */
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+
+    /* Close rest */
+    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Pclose(dcpl2);
+        H5Dclose(dsid);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* end test_storage_size() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    test_scatter
  *
  * Purpose:     Tests H5Dscatter with a variety of different selections
@@ -11983,7 +12580,7 @@ dls_01_main( void ) {
 
     TESTING("Testing DLS bugfix 1");
 
-    if ( NULL == h5_fixname(FILENAME[22], H5P_DEFAULT, filename, 
+    if ( NULL == h5_fixname(FILENAME[23], H5P_DEFAULT, filename, 
                             sizeof(filename)) )
 	TEST_ERROR
 
@@ -12048,9 +12645,9 @@ error:
  *
  * Purpose:	Tests the dataset interface (H5D)
  *
- * Return:	Success:	exit(0)
+ * Return:	Success:	exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(1)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Robb Matzke
  *		Tuesday, December  9, 1997
@@ -12062,18 +12659,24 @@ main(void)
 {
     char		filename[FILENAME_BUF_SIZE];
     hid_t		file, grp, fapl, fapl2;
+    hid_t fcpl = -1, fcpl2 = -1;
     unsigned new_format;
+    unsigned paged;
     int mdc_nelmts;
     size_t rdcc_nelmts;
     size_t rdcc_nbytes;
     double rdcc_w0;
     int	nerrors = 0;
     const char *envval;
+    hbool_t contig_addr_vfd;    /* Whether VFD used has a contigous address space */
 
     /* Don't run this test using certain file drivers */
     envval = HDgetenv("HDF5_DRIVER");
     if(envval == NULL)
-        envval = "sec2";
+        envval = "nomatch";
+
+    /* Current VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(envval, "split") && HDstrcmp(envval, "multi"));
 
     /* Set the random # seed */
     HDsrandom((unsigned)HDtime(NULL));
@@ -12095,100 +12698,136 @@ main(void)
     /* 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
 
+    /* create a file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        TEST_ERROR
+    if((fcpl2 = H5Pcopy(fcpl)) < 0) TEST_ERROR
+
+    /* Set file space strategy to paged aggregation and persisting free-space */
+    if(H5Pset_file_space_strategy(fcpl2, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+        TEST_ERROR
+
     h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
 
-    /* Test with old & new format groups */
-    for(new_format = FALSE; new_format <= TRUE; new_format++) {
-        hid_t my_fapl;
+    /* Test with paged aggregation enabled or not */
+    for(paged = FALSE; paged <= TRUE; paged++) {
 
-        /* Set the FAPL for the type of format */
-        if(new_format) {
-            puts("\nTesting with new file format:");
-            my_fapl = fapl2;
-        } /* end if */
-        else {
-            puts("Testing with old file format:");
-            my_fapl = fapl;
-        } /* end else */
+        /* Temporary: skip testing for multi/split drivers:
+             fail file create when persisting free-space or using paged aggregation strategy */
+        if(!contig_addr_vfd && paged)
+            continue;
 
-        /* Create the file for this test */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, my_fapl)) < 0)
-            goto error;
+        /* Test with old & new format groups */
+        for(new_format = FALSE; new_format <= TRUE; new_format++) {
+            hid_t my_fapl, my_fcpl;
+
+            /* Set the FAPL for the type of format */
+            if(new_format) {
+                my_fapl = fapl2;
+                if(paged) {
+                    my_fcpl = fcpl2;
+                    puts("\nTesting with new file format and paged aggregation");
+                } else {
+                    my_fcpl = fcpl;
+                    puts("\nTesting with new file format and non-paged aggregation");
+                }
+            } /* end if */
+            else {
+                my_fapl = fapl;
+                if(paged) {
+                    my_fcpl = fcpl2;
+                    puts("Testing with old file format and paged aggregation:");
+                } else {
+                    my_fcpl = fcpl;
+                    puts("Testing with old file format and non-paged aggregation:");
+                }
+            } /* end else */
 
-        /* Cause the library to emit initial messages */
-        if((grp = H5Gcreate2(file, "emit diagnostics", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto error;
-        if(H5Oset_comment(grp, "Causes diagnostic messages to be emitted") < 0)
-            goto error;
-        if(H5Gclose(grp) < 0)
-            goto error;
+            /* Create the file for this test */
+            if((file = H5Fcreate(filename, H5F_ACC_TRUNC, my_fcpl, my_fapl)) < 0)
+                goto error;
+
+            /* Cause the library to emit initial messages */
+            if((grp = H5Gcreate2(file, "emit diagnostics", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                goto error;
+            if(H5Oset_comment(grp, "Causes diagnostic messages to be emitted") < 0)
+                goto error;
+            if(H5Gclose(grp) < 0)
+                goto error;
+
+            nerrors += (test_create(file) < 0 			? 1 : 0);
+            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_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_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_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, new_format) < 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_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_filter_delete(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);
 
-        nerrors += (test_create(file) < 0 			? 1 : 0);
-        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_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_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_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_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_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_filter_delete(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
-        nerrors += (test_deprec(file) < 0			? 1 : 0);
+            nerrors += (test_deprec(file) < 0			? 1 : 0);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
-        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_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;
-    } /* end for */
 
-    /* Close 2nd FAPL */
+            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_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_storage_size(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;
+        } /* end for new_format */
+    } /* end for paged */
+
+    /* Close property lists */
     if(H5Pclose(fapl2) < 0) TEST_ERROR
+    if(H5Pclose(fcpl) < 0) TEST_ERROR
+    if(H5Pclose(fcpl2) < 0) TEST_ERROR
 
     /* Tests that do not use files */
     nerrors += (test_scatter() < 0                          ? 1 : 0);
diff --git a/test/dt_arith.c b/test/dt_arith.c
index 76ad0f3..c7f2986 100644
--- a/test/dt_arith.c
+++ b/test/dt_arith.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,8 +18,6 @@
  * Purpose:     Tests the data type interface (H5T)
  */
 
-#include <math.h>
-#include <time.h>
 #include "h5test.h"
 
 /* Number of elements in each random test */
@@ -96,6 +92,9 @@ static int skip_overflow_tests_g = 0;
 #define TEST_DENORM     2
 #define TEST_SPECIAL    3
 
+/* Temporary buffer sizes */
+#define TMP_BUF_DIM1    32
+#define TMP_BUF_DIM2    100
 
 /* Don't use hardware conversions if set */
 static int without_hardware_g = 0;
@@ -127,39 +126,39 @@ static int without_hardware_g = 0;
     /*positive values, ascending order. VALUE1 starts from 00000001, to 00000010, until 10000000*/ \
     /*VALUE2 ascends from 00000000, to 00000011, 00000111,...,  until 11111111.*/               \
     for(n=0; n<SRC_PREC; n++) {                                                                 \
-        if(value1<=SRC_MAX && value1>=SRC_MIN) {                                                \
-            memcpy(buf_p, &value1, SRC_SIZE);                                                   \
-            memcpy(saved_p, &value1, SRC_SIZE);                                                 \
+        {                                                                                       \
+            HDmemcpy(buf_p, &value1, SRC_SIZE);                                                 \
+            HDmemcpy(saved_p, &value1, SRC_SIZE);                                               \
             buf_p += SRC_SIZE;                                                                  \
             saved_p += SRC_SIZE;                                                                \
         }                                                                                       \
-        if(value2<=SRC_MAX && value2>=SRC_MIN) {                                                \
-            memcpy(buf_p, &value2, SRC_SIZE);                                                   \
-            memcpy(saved_p, &value2, SRC_SIZE);                                                 \
+        {                                                                                       \
+            HDmemcpy(buf_p, &value2, SRC_SIZE);                                                 \
+            HDmemcpy(saved_p, &value2, SRC_SIZE);                                               \
             buf_p += SRC_SIZE;                                                                  \
             saved_p += SRC_SIZE;                                                                \
         }                                                                                       \
                                                                                                 \
         if(n<SRC_PREC-2) {                                                                      \
-            value1 <<= 1;                                                                       \
-            value2 = (value1 - 1) | value1;                                                     \
+            value1 = (TYPE)(value1 << 1);                                                       \
+            value2 = (TYPE)((value1 - 1) | value1);                                             \
         } else if(n==SRC_PREC-2) { /*to avoid overflow of negative values for signed integer*/  \
-            value1 <<= 1;                                                                       \
-            value2 = (~value1) | value1;                                                        \
+            value1 = (TYPE)(value1 << 1);                                                       \
+            value2 = (TYPE)((~value1) | value1);                                                \
         }                                                                                       \
     }                                                                                           \
                                                                                                 \
     /* negative values for signed; descending positive values for unsigned */                   \
     /* VALUE2 descends from 11111111 to 11111110, 11111100, ..., until 10000000. */             \
     for(n=0; n<SRC_PREC-1; n++) {                                                               \
-        if(value2<=SRC_MAX && value2>=SRC_MIN) {                                                \
-            memcpy(buf_p, &value2, SRC_SIZE);                                                   \
-            memcpy(saved_p, &value2, SRC_SIZE);                                                 \
+        {                                                                                       \
+            HDmemcpy(buf_p, &value2, SRC_SIZE);                                                 \
+            HDmemcpy(saved_p, &value2, SRC_SIZE);                                               \
             buf_p += SRC_SIZE;                                                                  \
             saved_p += SRC_SIZE;                                                                \
         }                                                                                       \
         if(n<SRC_PREC-1)                                                                        \
-            value2 <<= 1;                                                                       \
+            value2 = (TYPE)(value2 << 1);                                                       \
     }                                                                                           \
 }
 
@@ -242,15 +241,15 @@ static int without_hardware_g = 0;
     value2 = -SRC_MIN;                                                                          \
     for(n=0; n<num_norm; n++) {                                                                 \
         if(value1<SRC_MAX) { /*positive*/                                                       \
-            memcpy(buf_p, &value1, SRC_SIZE);                                                   \
-            memcpy(saved_p, &value1, SRC_SIZE);                                                 \
+            HDmemcpy(buf_p, &value1, SRC_SIZE);                                                 \
+            HDmemcpy(saved_p, &value1, SRC_SIZE);                                               \
             value1 *= multiply;                                                                 \
             buf_p += SRC_SIZE;                                                                  \
             saved_p += SRC_SIZE;                                                                \
         }                                                                                       \
         if(value2>-SRC_MAX) { /*negative*/                                                      \
-            memcpy(buf_p, &value2, SRC_SIZE);                                                   \
-            memcpy(saved_p, &value2, SRC_SIZE);                                                 \
+            HDmemcpy(buf_p, &value2, SRC_SIZE);                                                 \
+            HDmemcpy(saved_p, &value2, SRC_SIZE);                                               \
             value2 *= multiply;                                                                 \
             buf_p += SRC_SIZE;                                                                  \
             saved_p += SRC_SIZE;                                                                \
@@ -258,14 +257,14 @@ static int without_hardware_g = 0;
     }                                                                                           \
                                                                                                 \
     value1 = SRC_MAX;                              /*maximal value*/                            \
-    memcpy(buf_p, &value1, SRC_SIZE);                                                           \
-    memcpy(saved_p, &value1, SRC_SIZE);                                                         \
+    HDmemcpy(buf_p, &value1, SRC_SIZE);                                                         \
+    HDmemcpy(saved_p, &value1, SRC_SIZE);                                                       \
     buf_p += SRC_SIZE;                                                                          \
     saved_p += SRC_SIZE;                                                                        \
                                                                                                 \
     value2 = -SRC_MAX;                             /*negative value*/                           \
-    memcpy(buf_p, &value2, SRC_SIZE);                                                           \
-    memcpy(saved_p, &value2, SRC_SIZE);                                                         \
+    HDmemcpy(buf_p, &value2, SRC_SIZE);                                                         \
+    HDmemcpy(saved_p, &value2, SRC_SIZE);                                                       \
     buf_p += SRC_SIZE;                                                                          \
     saved_p += SRC_SIZE;                                                                        \
 }
@@ -290,37 +289,37 @@ static int without_hardware_g = 0;
     HDmemset(BUF, 0, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                           \
     HDmemset(SAVED, 0, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                         \
                                                                                                 \
-    tmp1 = (unsigned char*)HDcalloc((size_t)1, (size_t)SRC_SIZE);                                                 \
-    tmp2 = (unsigned char*)HDcalloc((size_t)1, (size_t)SRC_SIZE);                                                 \
+    tmp1 = (unsigned char*)HDcalloc((size_t)1, (size_t)SRC_SIZE);                               \
+    tmp2 = (unsigned char*)HDcalloc((size_t)1, (size_t)SRC_SIZE);                               \
                                                                                                 \
     buf_p = BUF;                                                                                \
     saved_p = SAVED;                                                                            \
                                                                                                 \
     /*Denormalized values. Exponent is 0. Let mantissa starts from 00000001, 00000011,          \
      *00000111,..., until 11111111.*/                                                           \
-    memset(tmp1, 0, SRC_SIZE);                                                                  \
-    memset(tmp2, 0, SRC_SIZE);                                                                  \
-    H5T__bit_set (tmp2, SRC_PREC-1, (size_t)1, TRUE);       /*the negative value*/                       \
+    HDmemset(tmp1, 0, SRC_SIZE);                                                                \
+    HDmemset(tmp2, 0, SRC_SIZE);                                                                \
+    H5T__bit_set (tmp2, SRC_PREC-1, (size_t)1, TRUE);       /*the negative value*/              \
     for(n=0; n<SRC_MANT_DIG-1; n++) {                                                           \
-        H5T__bit_set (tmp1, n, (size_t)1, TRUE);            /*turn on 1 bit each time*/                  \
+        H5T__bit_set (tmp1, n, (size_t)1, TRUE);            /*turn on 1 bit each time*/         \
         CHANGE_ORDER(tmp1, SRC_ORDR, SRC_SIZE);    /*change order for big endian*/              \
-        memcpy(buf_p, tmp1, SRC_SIZE);                                                          \
-        memcpy(saved_p, tmp1, SRC_SIZE);                                                        \
+        HDmemcpy(buf_p, tmp1, SRC_SIZE);                                                        \
+        HDmemcpy(saved_p, tmp1, SRC_SIZE);                                                      \
         CHANGE_ORDER(tmp1, SRC_ORDR, SRC_SIZE);    /*change back the order for bit operation*/  \
         buf_p += SRC_SIZE;                                                                      \
         saved_p += SRC_SIZE;                                                                    \
                                                                                                 \
         /*negative values*/                                                                     \
-        H5T__bit_set (tmp2, n, (size_t)1, TRUE);                                                         \
+        H5T__bit_set (tmp2, n, (size_t)1, TRUE);                                                \
         CHANGE_ORDER(tmp2, SRC_ORDR, SRC_SIZE);                                                 \
-        memcpy(buf_p, tmp2, SRC_SIZE);                                                          \
-        memcpy(saved_p, tmp2, SRC_SIZE);                                                        \
+        HDmemcpy(buf_p, tmp2, SRC_SIZE);                                                        \
+        HDmemcpy(saved_p, tmp2, SRC_SIZE);                                                      \
         CHANGE_ORDER(tmp2, SRC_ORDR, SRC_SIZE);                                                 \
         buf_p += SRC_SIZE;                                                                      \
         saved_p += SRC_SIZE;                                                                    \
     }                                                                                           \
-    HDfree(tmp1);                                                                                 \
-    HDfree(tmp2);                                                                                 \
+    HDfree(tmp1);                                                                               \
+    HDfree(tmp2);                                                                               \
 }
 
 /* Allocate buffer and initialize it with floating-point special values, +/-0, +/-infinity,
@@ -342,50 +341,50 @@ static int without_hardware_g = 0;
     SAVED = (unsigned char*)aligned_malloc( NELMTS*MAX(SRC_SIZE, DST_SIZE));                    \
     HDmemset(BUF, 0, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                           \
     HDmemset(SAVED, 0, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                         \
-    value = (unsigned char*)HDcalloc(SRC_SIZE, sizeof(unsigned char));                            \
+    value = (unsigned char*)HDcalloc(SRC_SIZE, sizeof(unsigned char));                          \
                                                                                                 \
     buf_p = BUF;                                                                                \
                                                                                                 \
     /* +0 */                                                                                    \
-    H5T__bit_set(value, (size_t)0, SRC_PREC, FALSE);                                                     \
-    memcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                       \
+    H5T__bit_set(value, (size_t)0, SRC_PREC, FALSE);                                            \
+    HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                     \
     buf_p += SRC_SIZE;                                                                          \
                                                                                                 \
     for(n=0; n<2; n++) {                                                                        \
         if(n==1) {                                                                              \
             memset(value, 0, SRC_SIZE*sizeof(unsigned char));                                   \
             /* -0 */                                                                            \
-            H5T__bit_set(value, (size_t)(SRC_PREC - 1), (size_t)1, TRUE);                                            \
+            H5T__bit_set(value, (size_t)(SRC_PREC - 1), (size_t)1, TRUE);                       \
             CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);/*change order for big endian*/             \
-            HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                               \
+            HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                             \
             CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);/*change back the order for bit operation*/ \
             buf_p += SRC_SIZE;                                                                  \
         }                                                                                       \
                                                                                                 \
         /* +/-infinity */                                                                       \
-        H5T__bit_set(value, (size_t)(SRC_MANT_DIG - 1), SRC_PREC-SRC_MANT_DIG, TRUE);                        \
+        H5T__bit_set(value, (size_t)(SRC_MANT_DIG - 1), SRC_PREC-SRC_MANT_DIG, TRUE);           \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change order for big endian*/             \
-        HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                   \
+        HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                 \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change back the order for bit operation*/ \
         buf_p += SRC_SIZE;                                                                      \
                                                                                                 \
         /* +/-SNaN */                                                                           \
-        H5T__bit_set(value, (size_t)0, (size_t)1, TRUE);                                                         \
+        H5T__bit_set(value, (size_t)0, (size_t)1, TRUE);                                        \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change order for big endian*/             \
-        HDmemcpy(buf_p, value, SRC_SIZE * sizeof(unsigned char));                                   \
+        HDmemcpy(buf_p, value, SRC_SIZE * sizeof(unsigned char));                               \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change back the order for bit operation*/ \
         buf_p += SRC_SIZE;                                                                      \
                                                                                                 \
         /* +/-QNaN */                                                                           \
-        H5T__bit_set(value, (size_t)(SRC_MANT_DIG - 2), (size_t)1, TRUE);                                            \
+        H5T__bit_set(value, (size_t)(SRC_MANT_DIG - 2), (size_t)1, TRUE);                       \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change order for big endian*/             \
-        HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                   \
+        HDmemcpy(buf_p, value, SRC_SIZE*sizeof(unsigned char));                                 \
         CHANGE_ORDER(value, SRC_ORDR, SRC_SIZE);    /*change back the order for bit operation*/ \
         buf_p += SRC_SIZE;                                                                      \
     }                                                                                           \
                                                                                                 \
-    HDmemcpy(SAVED, BUF, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                         \
-    HDfree(value);                                                                                \
+    HDmemcpy(SAVED, BUF, NELMTS*MAX(SRC_SIZE, DST_SIZE));                                       \
+    HDfree(value);                                                                              \
 }
 
 void some_dummy_func(float x);
@@ -566,7 +565,7 @@ generates_sigfpe(void)
     HDfflush(stderr);
     if ((pid=fork()) < 0) {
 	HDperror("fork");
-	HDexit(1);
+	HDexit(EXIT_FAILURE);
     } else if (0==pid) {
 	for (i=0; i<2000; i++) {
 	    for(j = 0; j < sizeof(double); j++)
@@ -574,7 +573,7 @@ generates_sigfpe(void)
 	    f = (float)d;
 	    some_dummy_func((float)f);
 	}
-	HDexit(0);
+	HDexit(EXIT_SUCCESS);
     }
 
     while (pid!=waitpid(pid, &status, 0))
@@ -2675,14 +2674,16 @@ test_conv_int_2(void)
 {
     int		i, j;
     hid_t	src_type, dst_type;
-    char	buf[32*100];
+    char	*buf;
 
     printf("%-70s", "Testing overlap calculations");
     HDfflush(stdout);
 
-    HDmemset(buf, 0, sizeof buf);
-    for (i=1; i<=32; i++) {
-	for (j=1; j<=32; j++) {
+    buf = (char *)HDcalloc(TMP_BUF_DIM1, TMP_BUF_DIM2);
+    HDassert(buf);
+
+    for(i = 1; i <= TMP_BUF_DIM1; i++) {
+	for(j = 1; j <= TMP_BUF_DIM1; j++) {
 
 	    /* Source type */
 	    src_type = H5Tcopy(H5T_NATIVE_CHAR);
@@ -2696,12 +2697,13 @@ test_conv_int_2(void)
 	     * Conversion. If overlap calculations aren't right then an
 	     * assertion will fail in H5T__conv_i_i()
 	     */
-	    H5Tconvert(src_type, dst_type, (size_t)100, buf, NULL, H5P_DEFAULT);
+	    H5Tconvert(src_type, dst_type, (size_t)TMP_BUF_DIM2, buf, NULL, H5P_DEFAULT);
 	    H5Tclose(src_type);
 	    H5Tclose(dst_type);
 	}
     }
     PASSED();
+    HDfree(buf);
     return 0;
 }
 
@@ -3094,8 +3096,8 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
             if (FLT_FLOAT==dst_type) {
                 hw_f = (float)(*((double*)aligned));
                 hw = (unsigned char*)&hw_f;
-                underflow = HDfabs(*((double*)aligned)) < FLT_MIN;
-                overflow = HDfabs(*((double*)aligned)) > FLT_MAX;
+                underflow = HDfabs(*((double*)aligned)) < (double)FLT_MIN;
+                overflow = HDfabs(*((double*)aligned)) > (double)FLT_MAX;
             } else if (FLT_DOUBLE==dst_type) {
                 hw_d = *((double*)aligned);
                 hw = (unsigned char*)&hw_d;
@@ -3109,12 +3111,12 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
         } else {
             HDmemcpy(aligned, saved+j*sizeof(long double), sizeof(long double));
             if (FLT_FLOAT==dst_type) {
-                hw_f = *((long double*)aligned);
+                hw_f = (float)*((long double*)aligned);
                 hw = (unsigned char*)&hw_f;
                 underflow = HDfabsl(*((long double*)aligned)) < FLT_MIN;
                 overflow = HDfabsl(*((long double*)aligned)) > FLT_MAX;
             } else if (FLT_DOUBLE==dst_type) {
-                hw_d = *((long double*)aligned);
+                hw_d = (double)*((long double*)aligned);
                 hw = (unsigned char*)&hw_d;
                 underflow = HDfabsl(*((long double*)aligned)) < DBL_MIN;
                 overflow = HDfabsl(*((long double*)aligned)) > DBL_MAX;
@@ -3227,15 +3229,15 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
                 long double x;
                 HDmemcpy(&x, &buf[j*dst_size], sizeof(long double));
                 /* dst is largest float, no need to check underflow. */
-                check_mant[0] = HDfrexpl(x, check_expo+0);
-                check_mant[1] = HDfrexpl(hw_ld, check_expo+1);
+                check_mant[0] = (double)HDfrexpl(x, check_expo+0);
+                check_mant[1] = (double)HDfrexpl(hw_ld, check_expo+1);
 #endif
             }
             /* Special check for denormalized values */
             if(check_expo[0]<(-(int)dst_ebias) || check_expo[1]<(-(int)dst_ebias)) {
-                int expo_diff=check_expo[0]-check_expo[1];
-                int valid_bits=(int)((dst_ebias+dst_msize)+MIN(check_expo[0],check_expo[1]))-1;
-                double epsilon=1.0F;
+                int expo_diff = check_expo[0] - check_expo[1];
+                int valid_bits = (int)((dst_ebias + dst_msize) + (size_t)MIN(check_expo[0], check_expo[1])) - 1;
+                double epsilon = 1.0F;
 
                 /* Re-scale the mantissas based on any exponent difference */
                 if(expo_diff!=0)
@@ -3249,8 +3251,8 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
                     continue;
             } /* end if */
             else {
-                if (check_expo[0]==check_expo[1] &&
-                        HDfabs(check_mant[0]-check_mant[1])<FP_EPSILON)
+                if(check_expo[0] == check_expo[1] &&
+                        HDfabs(check_mant[0] - check_mant[1]) < (double)FP_EPSILON)
                     continue;
             } /* end else */
         }
@@ -3342,7 +3344,7 @@ done:
     if(run_test==TEST_NOOP || run_test==TEST_NORMAL)
         HDexit(MIN((int)fails_all_tests, 254));
     else if(run_test==TEST_DENORM || run_test==TEST_SPECIAL)
-        HDexit(0);
+        HDexit(EXIT_SUCCESS);
     HDassert(0 && "Should not reach this point!");
     return 1;
 #else
@@ -3368,7 +3370,7 @@ error:
     if(run_test==TEST_NOOP || run_test==TEST_NORMAL)
         HDexit(MIN(MAX((int)fails_all_tests, 1), 254));
     else if(run_test==TEST_DENORM || run_test==TEST_SPECIAL)
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     HDassert(0 && "Should not reach this point!");
     return 1;
 #else
@@ -4217,10 +4219,10 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
          */
 #if H5_SIZEOF_LONG_DOUBLE !=0
         if(dendian==H5T_ORDER_LE && dst_type==FLT_LDOUBLE) {
-            unsigned int q;
-            for(q=dst_nbits/8; q<dst_size; q++) {
-                buf[j*dst_size+q] = 0x00;
-            }
+            size_t q;
+
+            for(q = dst_nbits / 8; q < dst_size; q++)
+                buf[j * dst_size + q] = 0x00;
         }
 #endif
 
@@ -4507,10 +4509,10 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
                 printf(" %29lu\n", *((unsigned long*)hw));
                 break;
             case INT_LLONG:
-                printf(" %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)hw));
+                HDfprintf(stdout, " %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)hw));
                 break;
             case INT_ULLONG:
-                printf(" %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)hw));
+                HDfprintf(stdout, " %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)hw));
                 break;
             case FLT_FLOAT:
                 printf(" %29f\n", (double)*((float*)hw));
@@ -5181,36 +5183,36 @@ main(void)
     /* Do the tests */
 
     /* Test H5Tcompiler_conv() for querying hard conversion. */
-    nerrors += test_hard_query();
+    nerrors += (unsigned long)test_hard_query();
 
     /* Test user-define, query functions and software conversion
      * for user-defined floating-point types */
-    nerrors += test_derived_flt();
+    nerrors += (unsigned long)test_derived_flt();
 
     /* Test user-define, query functions and software conversion
      * for user-defined integer types */
-    nerrors += test_derived_integer();
+    nerrors += (unsigned long)test_derived_integer();
 
     /* Does floating point overflow generate a SIGFPE? */
     generates_sigfpe();
 
     /* Test degenerate cases */
-    nerrors += run_fp_tests("noop");
+    nerrors += (unsigned long)run_fp_tests("noop");
 
     /* Test hardware floating-point conversion functions */
-    nerrors += run_fp_tests("hard");
+    nerrors += (unsigned long)run_fp_tests("hard");
 
     /* Test hardware integer conversion functions */
-    nerrors += run_integer_tests("hard");
+    nerrors += (unsigned long)run_integer_tests("hard");
 
     /* Test hardware integer-float conversion functions */
-    nerrors += run_int_fp_conv("hard");
+    nerrors += (unsigned long)run_int_fp_conv("hard");
 
     /* Test hardware float-integer conversion functions */
-    nerrors += run_fp_int_conv("hard");
+    nerrors += (unsigned long)run_fp_int_conv("hard");
 
     /* Test a few special values for hardware float-integer conversions */
-    nerrors += test_particular_fp_integer();
+    nerrors += (unsigned long)test_particular_fp_integer();
 
     /*----------------------------------------------------------------------
      * Software tests
@@ -5224,17 +5226,17 @@ main(void)
     reset_hdf5();
 
     /* Test software floating-point conversion functions */
-    nerrors += run_fp_tests("soft");
+    nerrors += (unsigned long)run_fp_tests("soft");
 
     /* Test software integer conversion functions */
-    nerrors += test_conv_int_2();
-    nerrors += run_integer_tests("soft");
+    nerrors += (unsigned long)test_conv_int_2();
+    nerrors += (unsigned long)run_integer_tests("soft");
 
     /* Test software float-integer conversion functions */
-    nerrors += run_fp_int_conv("soft");
+    nerrors += (unsigned long)run_fp_int_conv("soft");
 
     /* Test software integer-float conversion functions */
-    nerrors += run_int_fp_conv("soft");
+    nerrors += (unsigned long)run_int_fp_conv("soft");
 
     /* Restore the default error handler (set in h5_reset()) */
     h5_restore_err();
@@ -5247,7 +5249,7 @@ main(void)
     if (nerrors) {
         printf("***** %lu FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     }
     printf("All data type tests passed.\n");
     return 0;
diff --git a/test/dtransform.c b/test/dtransform.c
index 2769771..0381bb8 100644
--- a/test/dtransform.c
+++ b/test/dtransform.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5test.h"
diff --git a/test/dtypes.c b/test/dtypes.c
index 984b6c6..7e8047d 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,8 +18,6 @@
  * Purpose:     Tests the datatype interface (H5T)
  */
 
-#include <math.h>
-#include <time.h>
 #include "h5test.h"
 #include "H5srcdir.h"
 #include "H5Iprivate.h"     /* For checking that datatype id's don't leak */
@@ -1927,12 +1923,12 @@ test_compound_10(void)
     for(i=0; i<ARRAY_DIM; i++) {
         wdata[i].i1 = i*10+i;
         wdata[i].str = HDstrdup("C string A");
-        wdata[i].str[9] += (char)i;
+        wdata[i].str[9] = (char)(wdata[i].str[9] + i);
         wdata[i].i2 = i*1000+i*10;
 
         wdata[i].text.p   = (void*)HDstrdup("variable-length text A\0");
         len = wdata[i].text.len = HDstrlen((char*)wdata[i].text.p)+1;
-        ((char*)(wdata[i].text.p))[len-2] += (char)i;
+        ((char *)(wdata[i].text.p))[len - 2] = (char)(((char *)(wdata[i].text.p))[len - 2] + i);
         ((char*)(wdata[i].text.p))[len-1] = '\0';
     }
 
@@ -2185,7 +2181,7 @@ test_compound_11(void)
 
     /* Verify converted buffer is correct */
     for(u=0; u<NTESTELEM; u++) {
-        if(((big_t *)buf_orig)[u].d1!=((little_t *)buf)[u].d1) {
+        if(!H5_DBL_ABS_EQUAL(((big_t *)buf_orig)[u].d1, ((little_t *)buf)[u].d1)) {
             printf("Error, line #%d: buf_orig[%u].d1=%f, buf[%u].d1=%f\n",__LINE__,
                     (unsigned)u,((big_t *)buf_orig)[u].d1,(unsigned)u,((little_t *)buf)[u].d1);
             TEST_ERROR
@@ -2229,7 +2225,7 @@ test_compound_11(void)
 
     /* Verify converted buffer is correct */
     for(u=0; u<NTESTELEM; u++) {
-        if(((big_t *)buf_orig)[u].d1!=((little_t *)buf)[u].d1) {
+        if(!H5_DBL_ABS_EQUAL(((big_t *)buf_orig)[u].d1, ((little_t *)buf)[u].d1)) {
             printf("Error, line #%d: buf_orig[%u].d1=%f, buf[%u].d1=%f\n",__LINE__,
                     (unsigned)u,((big_t *)buf_orig)[u].d1,(unsigned)u,((little_t *)buf)[u].d1);
             TEST_ERROR
@@ -2267,7 +2263,7 @@ test_compound_11(void)
 
     /* Verify converted buffer is correct */
     for(u=0; u<NTESTELEM; u++) {
-        if(((big_t *)buf_orig)[u].d1!=((little_t *)buf)[u].d1) {
+        if(!H5_DBL_ABS_EQUAL(((big_t *)buf_orig)[u].d1, ((little_t *)buf)[u].d1)) {
             printf("Error, line #%d: buf_orig[%u].d1=%f, buf[%u].d1=%f\n",__LINE__,
                     (unsigned)u,((big_t *)buf_orig)[u].d1,(unsigned)u,((little_t *)buf)[u].d1);
             TEST_ERROR
@@ -2489,7 +2485,7 @@ test_compound_13(void)
     /* Check the data. */
     for (u = 0; u < COMPOUND13_ARRAY_SIZE + 1; u++)
         if(data_out.x[u] != data_in.x[u]) TEST_ERROR
-    if(data_out.y != data_in.y) TEST_ERROR
+    if(!H5_FLT_ABS_EQUAL(data_out.y, data_in.y)) TEST_ERROR
 
     /* Release all resources. */
     if(H5Aclose(attid) < 0) FAIL_STACK_ERROR
@@ -6115,7 +6111,7 @@ test_int_float_except(void)
     /* Check the buffer after conversion, as floats */
     for(u = 0; u < CONVERT_SIZE; u++) {
         floatp = (float *)&buf[u];
-        if(*floatp != buf_float[u]) TEST_ERROR
+        if(!H5_FLT_ABS_EQUAL(*floatp, buf_float[u])) TEST_ERROR
     } /* end for */
 
     /* Check for proper exceptions */
@@ -6136,7 +6132,7 @@ test_int_float_except(void)
     /* Check the buffer after conversion, as floats */
     for(u = 0; u < CONVERT_SIZE; u++) {
         floatp = (float *)&buf2[u];
-        if(*floatp != buf2_float[u]) TEST_ERROR
+        if(!H5_FLT_ABS_EQUAL(*floatp, buf2_float[u])) TEST_ERROR
     } /* end for */
 
     /* Check for proper exceptions */
@@ -7481,7 +7477,7 @@ main(void)
     if(nerrors) {
         printf("***** %lu FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     }
 
     printf("All datatype tests passed.\n");
diff --git a/test/dynlib1.c b/test/dynlib1.c
index 1ccc33a..e9137fb 100644
--- a/test/dynlib1.c
+++ b/test/dynlib1.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
  * Programmer:	Raymond Lu
diff --git a/test/dynlib2.c b/test/dynlib2.c
index 0d8be2b..2574d4d 100644
--- a/test/dynlib2.c
+++ b/test/dynlib2.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
  * Programmer:	Raymond Lu
diff --git a/test/dynlib3.c b/test/dynlib3.c
index e509a52..8871321 100644
--- a/test/dynlib3.c
+++ b/test/dynlib3.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
  * Programmer:	Raymond Lu
diff --git a/test/dynlib4.c b/test/dynlib4.c
new file mode 100644
index 0000000..06d90ff
--- /dev/null
+++ b/test/dynlib4.c
@@ -0,0 +1,102 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIB4      260
+
+#define PUSH_ERR(func, minor, str) H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, H5E_ERR_CLS, H5E_PLUGIN, minor, str)
+
+static size_t H5Z_filter_dynlib4(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_DYNLIB4[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIB4,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlib4",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlib4,    /* The actual filter function    */
+}};
+
+H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+const void    *H5PLget_plugin_info(void) {return H5Z_DYNLIB4;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlib4
+ *
+ * Purpose:    A dynlib4 filter method that adds on and subtract from
+ *              the original value with another value.  It will be built
+ *              as a shared library.  plugin.c test will load and use
+ *              this filter library. Designed to call a HDF function.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlib4(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    int *int_ptr = (int *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+    int add_on = 0;
+    unsigned ver_info[3];
+
+    /* Check for the library version */
+    if(H5get_libversion(&ver_info[0], &ver_info[1], &ver_info[2]) < 0) {
+        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion");
+        return(0);
+    }
+    /* Check for the correct number of parameters */
+    if(cd_nelmts == 0)
+        return(0);
+
+    /* Check that permanent parameters are set correctly */
+    if(cd_values[0] > 9)
+        return(0);
+
+    if(ver_info[0] != cd_values[1] || ver_info[1] != cd_values[2]) {
+        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion does not match");
+        return(0);
+    }
+
+    add_on = (int)cd_values[0];
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Substract the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ -= add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ += add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlib4() */
+
diff --git a/test/earray.c b/test/earray.c
index 39b58bf..1058565 100644
--- a/test/earray.c
+++ b/test/earray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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>
@@ -159,28 +157,6 @@ typedef struct 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[] = {
@@ -195,24 +171,6 @@ 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
@@ -632,247 +590,6 @@ error:
 
 

 /*-------------------------------------------------------------------------
- * 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
@@ -2711,11 +2428,6 @@ main(void)
     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();
@@ -2782,14 +2494,6 @@ main(void)
         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)) {
@@ -2883,7 +2587,7 @@ main(void)
 
     if(nerrors)
         goto error;
-    puts("All extensible array tests passed.");
+    HDputs("All extensible array tests passed.");
 
     /* Clean up file used */
     h5_cleanup(FILENAME, fapl);
@@ -2891,10 +2595,10 @@ main(void)
     return 0;
 
 error:
-    puts("*** TESTS FAILED ***");
+    HDputs("*** TESTS FAILED ***");
 
     H5E_BEGIN_TRY {
-	H5Pclose(fapl);
+        H5Pclose(fapl);
     } H5E_END_TRY;
 
     return 1;
diff --git a/test/efc.c b/test/efc.c
index 6a7c8d8..bd008c8 100644
--- a/test/efc.c
+++ b/test/efc.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Neil Fortner
@@ -104,7 +102,7 @@ test_single(void)
         FAIL_STACK_ERROR
     if(ftmp1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -261,13 +259,13 @@ test_single(void)
         TEST_ERROR
     if(f4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -294,7 +292,7 @@ test_single(void)
         FAIL_STACK_ERROR
     if(ftmp1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -375,9 +373,9 @@ test_single(void)
         TEST_ERROR
     if(ftmp2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -455,13 +453,13 @@ test_single(void)
         TEST_ERROR
     if(ftmp4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp4) < 0)
+    if(H5F_try_close(ftmp4, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -494,12 +492,12 @@ test_single(void)
         FAIL_STACK_ERROR
     if(ftmp1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
     /* Close parent file */
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
     PASSED();
@@ -576,9 +574,9 @@ test_graph_nocycle(void)
         FAIL_STACK_ERROR
     if(ftmp2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(NULL == (f0 = H5F_open(filename[0],
@@ -596,7 +594,7 @@ test_graph_nocycle(void)
     if(NULL == (f1 = H5F_efc_open(f0, filename[1], H5F_ACC_RDWR, fcpl_id,
             fapl_id, dxpl_id)))
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
     if(H5F_efc_close(f1, f2) < 0)
         FAIL_STACK_ERROR
@@ -611,9 +609,9 @@ test_graph_nocycle(void)
         FAIL_STACK_ERROR
     if(ftmp2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -667,11 +665,11 @@ test_graph_nocycle(void)
         TEST_ERROR
     if(ftmp4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp4) < 0)
+    if(H5F_try_close(ftmp4, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -731,11 +729,11 @@ test_graph_nocycle(void)
     if(ftmp3->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -780,9 +778,9 @@ test_graph_nocycle(void)
     if(ftmp3->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -868,15 +866,15 @@ test_graph_nocycle(void)
     if(ftmp3->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp4) < 0)
+    if(H5F_try_close(ftmp4, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -951,7 +949,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -960,7 +958,7 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -991,7 +989,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(NULL == (f1 = H5F_efc_open(f0, filename[1],
@@ -1007,7 +1005,7 @@ test_graph_cycle(void)
         TEST_ERROR
     if(H5F_efc_close(f0, f1) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1015,7 +1013,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1055,7 +1053,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1063,7 +1061,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1091,7 +1089,7 @@ test_graph_cycle(void)
         TEST_ERROR
     if(H5F_efc_close(f0, f1) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1099,7 +1097,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1132,7 +1130,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 3)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1140,7 +1138,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1177,7 +1175,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1221,7 +1219,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1229,7 +1227,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1277,7 +1275,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1304,11 +1302,11 @@ test_graph_cycle(void)
         TEST_ERROR
     if(f0->shared->nrefs != 3)
         TEST_ERROR
-    if(H5F_try_close(ftmp0) < 0)
+    if(H5F_try_close(ftmp0, NULL) < 0)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1316,7 +1314,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1344,7 +1342,7 @@ test_graph_cycle(void)
     if(ftmp1->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(ftmp1->shared->nrefs != 2)
         TEST_ERROR
@@ -1354,9 +1352,9 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp1) < 0)
+    if(H5F_try_close(ftmp1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1364,7 +1362,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1372,7 +1370,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1411,7 +1409,7 @@ test_graph_cycle(void)
     if(ftmp2->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(ftmp2->shared->nrefs != 2)
         TEST_ERROR
@@ -1421,9 +1419,9 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 3)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1431,7 +1429,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1439,7 +1437,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1447,7 +1445,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1499,9 +1497,9 @@ test_graph_cycle(void)
         TEST_ERROR
     if(ftmp2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp2) < 0)
+    if(H5F_try_close(ftmp2, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1551,7 +1549,7 @@ test_graph_cycle(void)
     if(ftmp3->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(ftmp3->shared->nrefs != 2)
         TEST_ERROR
@@ -1561,9 +1559,9 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1571,7 +1569,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1579,7 +1577,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1587,7 +1585,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1595,7 +1593,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1659,9 +1657,9 @@ test_graph_cycle(void)
         TEST_ERROR
     if(ftmp3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1701,7 +1699,7 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1709,7 +1707,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1717,7 +1715,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1725,7 +1723,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1733,7 +1731,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1777,7 +1775,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1785,7 +1783,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1793,7 +1791,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1801,7 +1799,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1844,7 +1842,7 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1852,12 +1850,12 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(ftmp3->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1865,7 +1863,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1873,7 +1871,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -1881,7 +1879,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -1937,14 +1935,14 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(H5F_efc_release(ftmp3->shared->efc) < 0)
@@ -1956,12 +1954,12 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(ftmp3) < 0)
+    if(H5F_try_close(ftmp3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2029,7 +2027,7 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2037,7 +2035,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2045,7 +2043,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2053,7 +2051,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2061,7 +2059,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f4 = H5F_open(filename[4],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2069,7 +2067,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f5 = H5F_open(filename[5],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2077,7 +2075,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f5->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f5) < 0)
+    if(H5F_try_close(f5, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2150,7 +2148,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2158,7 +2156,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2166,7 +2164,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2174,7 +2172,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f4 = H5F_open(filename[4],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2182,7 +2180,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f5 = H5F_open(filename[5],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2190,7 +2188,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f5->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f5) < 0)
+    if(H5F_try_close(f5, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2268,7 +2266,7 @@ test_graph_cycle(void)
     if(f5->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(f4->shared->nrefs != 2)
         TEST_ERROR
@@ -2280,14 +2278,14 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
     if(f5->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(f5->shared->nrefs != 2)
         TEST_ERROR
@@ -2296,10 +2294,10 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f5) < 0)
+    if(H5F_try_close(f5, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(NULL == (f0 = H5F_open(filename[0],
@@ -2308,7 +2306,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2316,7 +2314,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2324,7 +2322,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2332,7 +2330,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f4 = H5F_open(filename[4],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2340,7 +2338,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f4->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f5 = H5F_open(filename[5],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2348,7 +2346,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f5->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f5) < 0)
+    if(H5F_try_close(f5, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2440,7 +2438,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 3)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(H5F_efc_release(f4->shared->efc) < 0)
@@ -2456,7 +2454,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(H5F_efc_release(f5->shared->efc) < 0)
@@ -2472,14 +2470,14 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f4) < 0)
+    if(H5F_try_close(f4, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f5) < 0)
+    if(H5F_try_close(f5, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2577,7 +2575,7 @@ test_graph_cycle(void)
     if(H5F_efc_close(f0, f3) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2585,7 +2583,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2593,7 +2591,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2601,7 +2599,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2609,7 +2607,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2711,7 +2709,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2719,7 +2717,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2727,7 +2725,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3],
             H5F_ACC_RDWR | H5F_ACC_CREAT | H5F_ACC_TRUNC, fcpl_id, fapl_id,
@@ -2735,7 +2733,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2773,7 +2771,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2812,7 +2810,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -2853,7 +2851,7 @@ test_graph_cycle(void)
     if(f3->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 2)
         TEST_ERROR
@@ -2866,7 +2864,7 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(H5F_efc_close(f1, f3) < 0)
@@ -2880,14 +2878,14 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
     if(H5F_efc_close(f2, f1) < 0)
@@ -2899,52 +2897,52 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 3)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 2)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -3023,19 +3021,19 @@ test_graph_cycle(void)
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f3 = H5F_open(filename[3], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f3->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f3) < 0)
+    if(H5F_try_close(f3, NULL) < 0)
         FAIL_STACK_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -3066,21 +3064,21 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 1)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
 
 
@@ -3113,28 +3111,28 @@ test_graph_cycle(void)
     if(f0->shared->nrefs != 2)
         TEST_ERROR
 
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f0 = H5F_open(filename[0], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f0->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f0) < 0)
+    if(H5F_try_close(f0, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f1 = H5F_open(filename[1], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f1->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f1) < 0)
+    if(H5F_try_close(f1, NULL) < 0)
         FAIL_STACK_ERROR
     if(NULL == (f2 = H5F_open(filename[2], H5F_ACC_RDWR, fcpl_id, fapl_id,
             dxpl_id)))
         FAIL_STACK_ERROR
     if(f2->shared->nrefs != 1)
         TEST_ERROR
-    if(H5F_try_close(f2) < 0)
+    if(H5F_try_close(f2, NULL) < 0)
         FAIL_STACK_ERROR
 
 
diff --git a/test/enc_dec_plist.c b/test/enc_dec_plist.c
index 4f0147e..36db2d0 100644
--- a/test/enc_dec_plist.c
+++ b/test/enc_dec_plist.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -117,6 +115,11 @@ main(void)
         0.2f,
         (256 * 2048),
         H5AC__DEFAULT_METADATA_WRITE_STRATEGY};
+    H5AC_cache_image_config_t my_cache_image_config = {
+	H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+	TRUE,
+        FALSE,
+	-1};
 
     if(VERBOSE_MED)
 	printf("Encode/Decode DCPLs\n");
@@ -455,6 +458,8 @@ main(void)
         FAIL_STACK_ERROR
     if((H5Pset_mdc_config(fapl, &my_cache_config)) < 0)
         FAIL_STACK_ERROR
+    if((H5Pset_mdc_image_config(fapl, &my_cache_image_config)) < 0)
+        FAIL_STACK_ERROR
     if((H5Pset_core_write_tracking(fapl, TRUE, 1024 * 1024)) < 0)
         FAIL_STACK_ERROR
 
diff --git a/test/enc_dec_plist_cross_platform.c b/test/enc_dec_plist_cross_platform.c
index a5d5552..5511828 100644
--- a/test/enc_dec_plist_cross_platform.c
+++ b/test/enc_dec_plist_cross_platform.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/enum.c b/test/enum.c
index 29b702d..4e20713 100644
--- a/test/enum.c
+++ b/test/enum.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/err_compat.c b/test/err_compat.c
index 7779ddc..eee150b 100644
--- a/test/err_compat.c
+++ b/test/err_compat.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/error_test.c b/test/error_test.c
index ee181b1..9c39065 100644
--- a/test/error_test.c
+++ b/test/error_test.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -270,7 +268,7 @@ error:
 static herr_t
 error_stack(void)
 {
-    int err_num;
+    ssize_t err_num;
     const char          *FUNC_error_stack = "error_stack";
 
     if((err_num = H5Eget_num(H5E_DEFAULT)) < 0)
@@ -284,7 +282,7 @@ error_stack(void)
     /* Make it push error, force this function to fail */
     if((err_num = H5Eget_num(ERR_STACK)) == 0) {
         H5Epush(ERR_STACK, __FILE__, FUNC_error_stack, __LINE__, ERR_CLS, ERR_MAJ_API, ERR_MIN_GETNUM,
-                "Get number test failed, returned %d", err_num);
+                "Get number test failed, returned %d", (int)err_num);
         goto error;
     } /* end if */
 
@@ -354,7 +352,7 @@ test_long_desc(void)
 
     /* Create the long part of the error description */
     for(u = 0; u < LONG_DESC_SIZE; u++)
-        long_desc[u] = 'A' + (u % 26);
+        long_desc[u] = (char)('A' + (u % 26));
     long_desc[LONG_DESC_SIZE - 1] = '\0';
 
     /* Clear the default error stack */
@@ -487,7 +485,7 @@ test_create(void)
 {
     const char *err_func = "test_create";      /* Function name for pushing error */
     const char *err_msg = "Error message";     /* Error message for pushing error */
-    int         err_num;        /* Number of errors on stack */
+    ssize_t     err_num;        /* Number of errors on stack */
     hid_t       estack_id;      /* Error stack ID */
 
     /* Create an empty error stack */
@@ -538,7 +536,7 @@ test_copy(void)
 {
     const char *err_func = "test_copy";      /* Function name for pushing error */
     const char *err_msg = "Error message";     /* Error message for pushing error */
-    int         err_num;             /* Number of errors on stack */
+    ssize_t     err_num;             /* Number of errors on stack */
     hid_t       estack_id;           /* Error stack ID */
     herr_t      ret;                 /* Generic return value */
 
diff --git a/test/evict_on_close.c b/test/evict_on_close.c
new file mode 100644
index 0000000..6536837
--- /dev/null
+++ b/test/evict_on_close.c
@@ -0,0 +1,1091 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ * Purpose:     Tests the basic operation of the evict-on-close cache
+ *              behavior. Tests that ensure the tagging is handled correctly
+ *              are located in cache.c.
+ */
+
+#define H5C_FRIEND		/*suppress error about including H5Cpkg   */
+#define H5D_FRIEND		/*suppress error about including H5Dpkg	  */
+#define H5D_TESTING
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5F_TESTING
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
+#define H5I_FRIEND		/*suppress error about including H5Ipkg	  */
+#define H5I_TESTING
+
+
+#include "h5test.h"
+#include "H5Cpkg.h"
+#include "H5Dpkg.h"
+#include "H5Fpkg.h"
+#include "H5Gpkg.h"
+#include "H5Ipkg.h"
+
+/* Evict on close is not supported under parallel at this time.
+ * In the meantime, we just run a simple check that EoC can't be
+ * enabled in parallel HDF5.
+ */
+#ifndef H5_HAVE_PARALLEL
+
+/* Uncomment to manually inspect cache states */
+/* (Requires debug build of the library) */
+/* #define EOC_MANUAL_INSPECTION */
+
+const char *FILENAMES[] = {
+    "evict-on-close",           /* 0 */
+    NULL
+};
+#define FILENAME_BUF_SIZE       1024
+
+/* Group names */
+#define GROUP_OLD_STYLE_NAME        "old_style_groups"
+#define GROUP_NEW_STYLE_NAME        "new_style_groups"
+
+/* Dataset names */
+#define DSET_COMPACT_NAME           "compact"
+#define DSET_CONTIGUOUS_NAME        "contiguous"
+#define DSET_BTREE_NAME             "v1_btree"
+#define DSET_EARRAY_NAME            "earray"
+#define DSET_BT2_NAME               "v2_btree"
+#define DSET_FARRAY_NAME            "farray"
+#define DSET_SINGLE_NAME            "single"
+
+/* Number of data elements in a dataset */
+#define NELEMENTS                   1024
+
+/* Number of subgroups in each style of group */
+#define NSUBGROUPS                  128
+
+/* Max size of subgroup name, not including NULL */
+#define SUBGROUP_NAME_SIZE          16
+
+/* Prototypes */
+static hbool_t verify_tag_not_in_cache(H5F_t *f, haddr_t tag);
+static herr_t check_evict_on_close_api(void);
+static hid_t generate_eoc_test_file(hid_t fapl_id);
+static herr_t check_dset_scheme(hid_t fid, const char *dset_name);
+static herr_t check_group_layout(hid_t fid, const char *group_name);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_tag_not_in_cache()
+ *
+ * Purpose:     Ensure that metadata cache entries with a given tag are not
+ *              present in the cache.
+ *
+ * Return:      TRUE/FALSE
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+verify_tag_not_in_cache(H5F_t *f, haddr_t tag)
+{
+    H5C_t *cache_ptr = NULL;                /* cache pointer                */
+    int i = 0;                              /* iterator                     */
+
+    /* Get Internal Cache Pointers */
+    cache_ptr = f->shared->cache;
+
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        H5C_cache_entry_t *entry_ptr;    /* entry pointer                */
+
+        entry_ptr = cache_ptr->index[i];
+        while(entry_ptr != NULL) {
+            if(tag == entry_ptr->tag_info->tag)
+                return TRUE;
+            else
+                entry_ptr = entry_ptr->ht_next;
+        } /* end while */
+    } /* end for */
+
+    return FALSE;
+} /* end verify_tag_not_in_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    generate_eoc_test_file()
+ *
+ * Purpose:     Generate the evict-on-close test file.
+ *
+ * Return:      Success: The file ID of the created file
+ *              Failure: -1
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+generate_eoc_test_file(hid_t fapl_id)
+{
+    char    filename[FILENAME_BUF_SIZE];    /* decorated file name          */
+    hid_t   fid = -1;                       /* file ID (returned)           */
+    hid_t   fapl_copy_id = -1;              /* ID of copied fapl            */
+    hid_t   gid1 = -1, gid2 = -1;           /* group IDs                    */
+    hid_t   sid = -1;                       /* dataspace ID                 */
+    hid_t   dcpl_id = -1;                   /* dataset creation plist       */
+    hid_t   did = -1;                       /* dataset ID                   */
+    int     rank;                           /* # of array dimensions        */
+    hsize_t current_dims[2];                /* current dataset size         */
+    hsize_t maximum_dims[2];                /* maximum dataset size         */
+    hsize_t chunk_dims[2];                  /* chunk dimensions             */
+    H5D_chunk_index_t idx_type;             /* dataset chunk index type     */
+    H5D_layout_t layout_type;               /* dataset layout type          */
+    int     *data = NULL;                   /* buffer for fake data         */
+    int     n;                              /* # of data elements           */
+    int     i;                              /* iterator (# subgroups)       */
+
+    TESTING("generating evict-on-close test file");
+
+    /* Get a VFD-specific filename */
+    h5_fixname(FILENAMES[0], fapl_id, filename, sizeof(filename));
+
+    /* Copy the fapl and set the latest file format */
+    if((fapl_copy_id = H5Pcopy(fapl_id)) < 0)
+        TEST_ERROR;
+    if(H5Pset_libver_bounds(fapl_copy_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        TEST_ERROR;
+
+    /* Create a data buffer for dataset writes */
+    if(NULL == (data = (int *)HDcalloc(NELEMENTS, sizeof(int))))
+        TEST_ERROR;
+
+    /* Create file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
+        TEST_ERROR;
+
+
+    /*******************************************/
+    /* CREATE OBJECTS WITH THE OLD FILE FORMAT */
+    /*******************************************/
+
+    /*******************/
+    /* Generate groups */
+    /*******************/
+
+    /*********************************************/
+    /* Old-style (version 1 B-tree + local heap) */
+    /*********************************************/
+
+    /* A single group is created in the root group, followed
+     * by a large number of groups in the new group. This will
+     * ensure that the file data structures for groups include
+     * multiple cache entries.
+     */
+    if((gid1 = H5Gcreate2(fid, GROUP_OLD_STYLE_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Create sub-groups */
+    for(i = 0; i < NSUBGROUPS; i++) {
+        char subgroup_name[SUBGROUP_NAME_SIZE];
+
+        /* Create the group name */
+        HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
+        if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
+            TEST_ERROR
+
+        if((gid2 = H5Gcreate2(gid1, subgroup_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR;
+        if(H5Gclose(gid2) < 0)
+            TEST_ERROR;
+    } /* end for */
+
+    if(H5Gclose(gid1) < 0)
+        TEST_ERROR;
+
+    /********************************************************************/
+    /* Generate datasets and ensure that the chunking scheme is correct */
+    /********************************************************************/
+
+    /***********************************/
+    /* Old file format data structures */
+    /***********************************/
+
+    /********************/
+    /* Version 1 B-tree */
+    /********************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up chunking */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    chunk_dims[0] = 1;
+    if(H5Pset_chunk(dcpl_id, rank, chunk_dims) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_BTREE_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct chunk indexing scheme */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0)
+        TEST_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_BTREE)
+        FAIL_PUTS_ERROR("should be using version 1 B-tree as the chunk index");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+
+    /**********************************************/
+    /* CREATE OBJECTS WITH THE LATEST FILE FORMAT */
+    /**********************************************/
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+
+    /* Reopen the file with the "latest file format" fapl */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_copy_id)) < 0)
+        TEST_ERROR;
+
+    /*******************/
+    /* Generate groups */
+    /*******************/
+
+    /***********************************************/
+    /* New-style (version 2 B-tree + fractal heap) */
+    /***********************************************/
+
+    /* A single group is created in the root group, followed
+     * by a large number of groups in the new group. This will
+     * ensure that the file data structures for groups include
+     * multiple cache entries.
+     */
+    if((gid1 = H5Gcreate2(fid, GROUP_NEW_STYLE_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Create sub-groups */
+    for(i = 0; i < NSUBGROUPS; i++) {
+        char subgroup_name[SUBGROUP_NAME_SIZE];
+
+        /* Create the group name */
+        HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
+        if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
+            TEST_ERROR
+
+        if((gid2 = H5Gcreate2(gid1, subgroup_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR;
+        if(H5Gclose(gid2) < 0)
+            TEST_ERROR;
+    } /* end for */
+
+    if(H5Gclose(gid1) < 0)
+        TEST_ERROR;
+
+    /********************************************************************/
+    /* Generate datasets and ensure that the chunking scheme is correct */
+    /********************************************************************/
+
+    /********************/
+    /* Extensible Array */
+    /********************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up chunking */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    chunk_dims[0] = 1;
+    if(H5Pset_chunk(dcpl_id, rank, chunk_dims) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_EARRAY_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct chunk indexing scheme */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0)
+        TEST_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_EARRAY)
+        FAIL_PUTS_ERROR("should be using extensible array as the chunk index");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+    /********************/
+    /* Version 2 B-Tree */
+    /********************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 2;
+    current_dims[0] = (hsize_t)2;
+    current_dims[1] = (hsize_t)(n/2);
+    maximum_dims[0] = H5S_UNLIMITED;
+    maximum_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up chunking */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    chunk_dims[0] = 1;
+    chunk_dims[1] = 1;
+    if(H5Pset_chunk(dcpl_id, rank, chunk_dims) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_BT2_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct chunk indexing scheme */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0)
+        TEST_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_BT2)
+        FAIL_PUTS_ERROR("should be using version 2 B-tree as the chunk index");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+    /***************/
+    /* Fixed Array */
+    /***************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = (hsize_t)n;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up chunking */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    chunk_dims[0] = 1;
+    chunk_dims[1] = 1;
+    if(H5Pset_chunk(dcpl_id, rank, chunk_dims) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_FARRAY_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct chunk indexing scheme */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0)
+        TEST_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_FARRAY)
+        FAIL_PUTS_ERROR("should be using fixed array as the chunk index");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+    /****************/
+    /* Single Chunk */
+    /****************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = (hsize_t)n;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up chunking */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    chunk_dims[0] = (hsize_t)n;
+    chunk_dims[1] = (hsize_t)n;
+    if(H5Pset_chunk(dcpl_id, rank, chunk_dims) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_SINGLE_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct chunk indexing scheme */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0)
+        TEST_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_SINGLE)
+        FAIL_PUTS_ERROR("should be using single chunk as the chunk index");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+    /**************/
+    /* Contiguous */
+    /**************/
+
+    /* Create dataspace */
+    n = NELEMENTS;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = (hsize_t)n;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_CONTIGUOUS_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct layout scheme */
+    if(H5D__layout_type_test(did, &layout_type) < 0)
+        TEST_ERROR;
+    if(layout_type != H5D_CONTIGUOUS)
+        FAIL_PUTS_ERROR("should be using contiguous layout");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+
+    /***********/
+    /* Compact */
+    /***********/
+
+    /* Create dataspace */
+    n = 1;
+    rank = 1;
+    current_dims[0] = (hsize_t)n;
+    maximum_dims[0] = (hsize_t)n;
+    if((sid = H5Screate_simple(rank, current_dims, maximum_dims)) < 0)
+        TEST_ERROR;
+
+    /* Create dcpl and set up compact layout */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR;
+    if(H5Pset_layout(dcpl_id, H5D_COMPACT) < 0)
+        TEST_ERROR;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_COMPACT_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Ensure we're using the correct layout scheme */
+    if(H5D__layout_type_test(did, &layout_type) < 0)
+        TEST_ERROR;
+    if(layout_type != H5D_COMPACT)
+        FAIL_PUTS_ERROR("should be using compact layout");
+
+    /* Write a bunch of fake data */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Close IDs for this dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR;
+    if(H5Pclose(dcpl_id) < 0)
+        TEST_ERROR;
+
+    /********/
+    /* DONE */
+    /********/
+
+    /* Close/free everything else */
+    if(H5Pclose(fapl_copy_id) < 0)
+        TEST_ERROR;
+
+    HDfree(data);
+
+    PASSED();
+    return fid;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Gclose(gid1);
+        H5Gclose(gid2);
+        H5Fclose(fid);
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Pclose(dcpl_id);
+        H5Pclose(fapl_copy_id);
+    } H5E_END_TRY;
+
+    HDfree(data);
+
+    H5_FAILED();
+    return -1;
+
+} /* end generate_eoc_test_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_group_layout()
+ *
+ * Purpose:     Verify that the evict-on-close feature works for a given
+ *              group layout (new-style vs. old-style).
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+check_group_layout(hid_t fid, const char *group_name)
+{
+    H5F_t   *file_ptr = NULL;               /* ptr to internal file struct  */
+    hid_t   gid1 = -1, gid2 = -1;           /* group IDs                    */
+    H5G_t   *grp_ptr = NULL;                /* ptr to internal group struct */
+    haddr_t tag1, tag2;                     /* MD cache tags for groups     */
+    uint32_t before, during, after;         /* cache sizes                  */
+    int i;                                  /* iterator                     */
+
+    /* NOTE: The TESTING() macro is called in main() */
+
+    /* Get a pointer to the file struct */
+    if(NULL == (file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE)))
+        TEST_ERROR;
+
+    /* Record the number of cache entries */
+    before = file_ptr->shared->cache->index_len;
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE BEFORE GROUP OPEN:\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", before);
+#endif
+
+    /* Open the main group and get its tag */
+    if((gid1 = H5Gopen2(fid, group_name, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+    if(NULL == (grp_ptr = (H5G_t *)H5I_object_verify(gid1, H5I_GROUP)))
+        TEST_ERROR;
+    tag1 = grp_ptr->oloc.addr;
+
+
+    /* Open and close all sub-groups */
+    for(i = 0; i < NSUBGROUPS; i++) {
+        char subgroup_name[SUBGROUP_NAME_SIZE];
+
+        /* Create the group name */
+        HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
+        if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
+            TEST_ERROR
+
+        if((gid2 = H5Gopen2(gid1, subgroup_name, H5P_DEFAULT)) < 0)
+            TEST_ERROR;
+
+        if(NULL == (grp_ptr = (H5G_t *)H5I_object_verify(gid2, H5I_GROUP)))
+            TEST_ERROR;
+        tag2 = grp_ptr->oloc.addr;
+
+        if(H5Gclose(gid2) < 0)
+            TEST_ERROR;
+
+        if(TRUE == verify_tag_not_in_cache(file_ptr, tag2))
+            TEST_ERROR;
+    } /* end for */
+
+    /* Record the number of cache entries */
+    during = file_ptr->shared->cache->index_len;
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE AFTER OPENING GROUPS (WHILE OPEN):\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("MAIN GROUP TAG: %#X\n", tag1);
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", during);
+#endif
+
+    /* Close the main group */
+    if(H5Gclose(gid1) < 0)
+        TEST_ERROR;
+
+    /* Record the number of cache entries */
+    after = file_ptr->shared->cache->index_len;
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE AFTER CLOSING GROUPS:\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", after);
+#endif
+
+    /* Ensure that the cache does not contain entries with the tag */
+    if(TRUE == verify_tag_not_in_cache(file_ptr, tag1))
+        TEST_ERROR;
+    /* Compare the number of cache entries */
+    if(before != after || before == during)
+        TEST_ERROR;
+
+    PASSED();
+    return SUCCEED;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Gclose(gid1);
+        H5Gclose(gid2);
+    } H5E_END_TRY;
+
+    H5_FAILED();
+    return FAIL;
+
+} /* end check_group_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dset_scheme()
+ *
+ * Purpose:     Verify that the evict-on-close feature works for a given
+ *              dataset layout and/or chunk index.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+check_dset_scheme(hid_t fid, const char *dset_name)
+{
+    H5F_t   *file_ptr = NULL;               /* ptr to internal file struct  */
+    hid_t   did = -1;                       /* dataset ID                   */
+    H5D_t   *dset_ptr = NULL;               /* ptr to internal dset struct  */
+    haddr_t tag;                            /* MD cache tag for dataset     */
+    int     *data = NULL;                   /* buffer for fake data         */
+    uint32_t before, during, after;         /* cache sizes                  */
+
+    /* NOTE: The TESTING() macro is called in main() */
+
+    /* Get a pointer to the file struct */
+    if(NULL == (file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE)))
+        TEST_ERROR;
+
+    /* Create the data buffer */
+    if(NULL == (data = (int *)HDcalloc(NELEMENTS, sizeof(int))))
+        TEST_ERROR;
+
+    /* Record the number of cache entries */
+    before = file_ptr->shared->cache->index_len;
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE BEFORE DATASET OPEN:\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", before);
+#endif
+
+    /* Open dataset and get the metadata tag */
+    if((did = H5Dopen2(fid, dset_name, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+    if(NULL == (dset_ptr = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        TEST_ERROR;
+    tag = dset_ptr->oloc.addr;
+
+    /* Read data from the dataset so the cache gets populated with chunk entries
+     * and the like.
+     */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        TEST_ERROR;
+
+    /* Record the number of cache entries */
+    during = file_ptr->shared->cache->index_len; 
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE AFTER DATA READ (WHILE OPEN):\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("TAG: %#X\n", tag);
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", during);
+#endif
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+
+    /* Record the number of cache entries */
+    after = file_ptr->shared->cache->index_len;
+
+#ifdef EOC_MANUAL_INSPECTION
+    HDprintf("\nCACHE AFTER DATASET CLOSE:\n");
+    if(H5AC_dump_cache(file_ptr) < 0)
+        TEST_ERROR;
+    HDprintf("NUMBER OF CACHE ENTRIES: %u\n", after);
+#endif
+
+    /* Ensure that the cache does not contain entries with the tag */
+    if(TRUE == verify_tag_not_in_cache(file_ptr, tag))
+        TEST_ERROR;
+
+    /* Compare the number of cache entries */
+    if(before != after || before == during)
+        TEST_ERROR;
+
+    HDfree(data);
+
+    PASSED();
+    return SUCCEED;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+    } H5E_END_TRY;
+
+    H5_FAILED();
+    return FAIL;
+
+} /* check_dset_scheme() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_evict_on_close_api()
+ *
+ * Purpose:     Verify that the H5Pset/get_evict_on_close() calls behave
+ *              correctly.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+check_evict_on_close_api(void)
+{
+    hid_t       fapl_id = -1;
+    hid_t       dapl_id = -1;
+    hbool_t     evict_on_close;
+    herr_t      status;
+
+    TESTING("evict on close API");
+
+    /* Create a fapl */
+    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
+
+    /* Check the default */
+    evict_on_close = TRUE;
+    if(H5Pget_evict_on_close(fapl_id, &evict_on_close) < 0)
+        TEST_ERROR;
+    if(evict_on_close != FALSE)
+        FAIL_PUTS_ERROR("Incorrect default evict on close value.");
+
+    /* Set the evict on close property */
+    evict_on_close = TRUE;
+    if(H5Pset_evict_on_close(fapl_id, evict_on_close) < 0)
+        TEST_ERROR;
+
+    /* Make sure we can get it back out */
+    evict_on_close = FALSE;
+    if(H5Pget_evict_on_close(fapl_id, &evict_on_close) < 0)
+        TEST_ERROR;
+    if(evict_on_close != TRUE)
+        FAIL_PUTS_ERROR("Incorrect evict on close value.");
+
+    /* close fapl */
+    if(H5Pclose(fapl_id) < 0)
+        TEST_ERROR;
+
+    /**********************************************/
+    /* Trying passing in a non-fapl property list */
+    /**********************************************/
+
+    if((dapl_id = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        TEST_ERROR;
+
+    /* ensure using an incorrect access plist fails */
+    H5E_BEGIN_TRY {
+        status = H5Pset_evict_on_close(dapl_id, evict_on_close);
+    } H5E_END_TRY;
+    if(status >= 0)
+        FAIL_PUTS_ERROR("H5Pset_evict_on_close() accepted invalid access plist.");
+
+    /* ensure an invalid plist fails */
+    H5E_BEGIN_TRY {
+        status = H5Pget_evict_on_close((hid_t)-1, &evict_on_close);
+    } H5E_END_TRY;
+    if(status >= 0)
+        FAIL_PUTS_ERROR("H5Pget_evict_on_close() accepted invalid hid_t.");
+
+    /* close dapl */
+    if(H5Pclose(dapl_id) < 0)
+        TEST_ERROR;
+
+    PASSED();
+    return SUCCEED;
+
+error:
+    H5_FAILED();
+    return FAIL;
+
+} /* check_evict_on_close_api() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Return:      EXIT_FAILURE/EXIT_SUCCESS
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    hid_t       fapl_id = -1;       /* VFD-specific fapl                    */
+    hid_t       fid = -1;           /* file ID                              */
+    unsigned    nerrors = 0;        /* number of test errors                */
+
+    HDprintf("Testing evict-on-close cache behavior\n");
+
+    /* Initialize */
+    h5_reset();
+
+    /* Test H5P call to set up EoC (does not require VFD-specific fapl) */
+    nerrors += check_evict_on_close_api() < 0 ? 1 : 0;
+
+    /* Set up VFD-specific fapl */
+    if((fapl_id = h5_fileaccess()) < 0) {
+        nerrors++;
+        PUTS_ERROR("Unable to get VFD-specific fapl\n");
+    } /* end if */
+
+    /* Set evict-on-close property */
+    if(H5Pset_evict_on_close(fapl_id, TRUE) < 0) {
+        nerrors++;
+        PUTS_ERROR("Unable to set evict-on-close property\n");
+    } /* end if */
+
+    /* Generate the test file */
+    if((fid = generate_eoc_test_file(fapl_id)) < 0) {
+        nerrors++;
+        PUTS_ERROR("Unable to generate test file\n");
+    } /* end if */
+
+    /* Run tests with a variety of dataset configurations
+     * PASSED() and H5_FAILED() are handled in check_configuration()
+     */
+    TESTING("evict on close with version 1 B-tree chunk index");
+        nerrors += check_dset_scheme(fid, DSET_BTREE_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with extensible array chunk index");
+        nerrors += check_dset_scheme(fid, DSET_EARRAY_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with version 2 B-tree chunk index");
+        nerrors += check_dset_scheme(fid, DSET_BT2_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with fixed array chunk index");
+        nerrors += check_dset_scheme(fid, DSET_FARRAY_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with \'single chunk\' chunk index");
+        nerrors += check_dset_scheme(fid, DSET_SINGLE_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with contiguous layout");
+        nerrors += check_dset_scheme(fid, DSET_CONTIGUOUS_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with compact layout");
+        nerrors += check_dset_scheme(fid, DSET_COMPACT_NAME) < 0 ? 1 : 0;
+
+    /* Run tests with old- and new-style groups
+     * PASSED() and H5_FAILED() are handled in check_configuration()
+     */
+    TESTING("evict on close with old-style groups");
+        nerrors += check_group_layout(fid, GROUP_OLD_STYLE_NAME) < 0 ? 1 : 0;
+    TESTING("evict on close with new-style groups");
+        nerrors += check_group_layout(fid, GROUP_NEW_STYLE_NAME) < 0 ? 1 : 0;
+
+    /* Close the test file */
+    if(H5Fclose(fid) < 0) {
+        nerrors++;
+        PUTS_ERROR("Unable to close the test file.\n");
+    } /* end if */
+
+    /* Clean up files and close the VFD-specific fapl */
+    h5_delete_all_test_files(FILENAMES, fapl_id);
+    if(H5Pclose(fapl_id) < 0) {
+        nerrors++;
+        PUTS_ERROR("Unable to close VFD-specific fapl.\n");
+    } /* end if */
+
+    if(nerrors)
+        goto error;
+
+    HDprintf("All evict-on-close tests passed.\n");
+
+    return EXIT_SUCCESS;
+
+error:
+
+    HDprintf("***** %u evict-on-close test%s FAILED! *****\n",
+        nerrors, nerrors > 1 ? "S" : "");
+
+    h5_delete_all_test_files(FILENAMES, fapl_id);
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fapl_id);
+    } H5E_END_TRY;
+
+    return EXIT_FAILURE;
+
+} /* end main() */
+
+#else
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_evict_on_close_parallel_fail()
+ *
+ * Purpose:     Verify that the H5Pset_evict_on_close() call fails in
+ *              parallel HDF5.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+check_evict_on_close_parallel_fail(void)
+{
+    hid_t       fapl_id = -1;
+    hbool_t     evict_on_close;
+    herr_t      status;
+
+    TESTING("evict on close fails in parallel");
+
+    /* Create a fapl */
+    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
+
+    /* Set the evict on close property (should fail)*/
+    evict_on_close = TRUE;
+    H5E_BEGIN_TRY {
+        status = H5Pset_evict_on_close(fapl_id, evict_on_close);
+    } H5E_END_TRY;
+    if(status >= 0)
+        FAIL_PUTS_ERROR("H5Pset_evict_on_close() did not fail in parallel HDF5.");
+
+    /* close fapl */
+    if(H5Pclose(fapl_id) < 0)
+        TEST_ERROR;
+
+    PASSED();
+    return SUCCEED;
+
+error:
+    H5_FAILED();
+    return FAIL;
+
+} /* check_evict_on_close_parallel_fail() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main (parallel version)
+ *
+ * Return:      EXIT_FAILURE/EXIT_SUCCESS
+ *
+ * Programmer:  Dana Robinson
+ *              Spring 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    unsigned    nerrors = 0;        /* number of test errors                */
+
+    HDprintf("Testing evict-on-close cache behavior\n");
+
+    /* Initialize */
+    h5_reset();
+
+    /* Test that EoC fails in parallel HDF5 */
+    nerrors += check_evict_on_close_parallel_fail() < 0 ? 1 : 0;
+
+    if(nerrors)
+        goto error;
+
+    HDprintf("All evict-on-close tests passed.\n");
+    HDprintf("Note that EoC is not supported under parallel so most tests are skipped.\n");
+
+    return EXIT_SUCCESS;
+
+error:
+
+    HDprintf("***** %u evict-on-close test%s FAILED! *****\n",
+        nerrors, nerrors > 1 ? "S" : "");
+
+    return EXIT_FAILURE;
+
+} /* main() - parallel */
+
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/test/extend.c b/test/extend.c
index 5951e69..e5c3cb3 100644
--- a/test/extend.c
+++ b/test/extend.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -292,7 +290,7 @@ main (void)
 
     if(nerrors) {
         printf("***** %d FAILURE%s! *****\n", nerrors, (1 == nerrors) ? "" : "S");
-        exit(1);
+        exit(EXIT_FAILURE);
     } /* end if */
 
     printf("All extend tests passed.\n");
diff --git a/test/external.c b/test/external.c
index 1865e71..9502586 100644
--- a/test/external.c
+++ b/test/external.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -59,7 +57,7 @@ files_have_same_contents(const char *name1, const char *name2)
     int		fd1 = 0, fd2 = 0;
     ssize_t	n1, n2;
     char	buf1[1024], buf2[1024];
-    hbool_t ret = false;            /* not equal until proven otherwise */
+    hbool_t ret = FALSE;            /* not equal until proven otherwise */
 
     if((fd1 = HDopen(name1, O_RDONLY, 0666)) < 0)
         goto out;
@@ -82,7 +80,7 @@ files_have_same_contents(const char *name1, const char *name2)
             break;
 
         if(n1 == 0 && n2 == 0) {
-            ret = true;
+            ret = TRUE;
             break;
         }
 
diff --git a/test/family_v16_00000.h5 b/test/family_v16_00000.h5
index aaa3dad..ac75ea9 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
index e84bfae..f9f97bf 100644
--- a/test/farray.c
+++ b/test/farray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/fheap.c b/test/fheap.c
index 558cb44..4be6cb9 100644
--- a/test/fheap.c
+++ b/test/fheap.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -26,6 +24,10 @@
 #define H5HF_TESTING
 #include "H5HFpkg.h"		/* Fractal heaps			*/
 
+#define H5F_FRIEND      /*suppress error about including H5Fpkg   */
+#define H5F_TESTING
+#include "H5Fpkg.h"
+
 /* Other private headers that this test requires */
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MMprivate.h"	/* Memory management			*/
@@ -77,6 +79,10 @@
 #define DBLOCK_SIZE(fh, r) H5HF_get_dblock_size_test(fh, r)     /* Size of a direct block in a given row */
 #define DBLOCK_FREE(fh, r) H5HF_get_dblock_free_test(fh, r)     /* Free space in a direct block of a given row */
 
+/* The number of settings for testing: page buffering, file space strategy and persisting free-space */
+#define NUM_PB_FS                   6
+#define PAGE_BUFFER_PAGE_SIZE       4096 
+
 const char *FILENAME[] = {
     "fheap",
     NULL
@@ -126,6 +132,7 @@ typedef struct fheap_test_param_t {
     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 compress the blocks or not */
+    hid_t my_fcpl;                      /* File creation property list with file space strategy setting */
 } fheap_test_param_t;
 
 /* Heap state information */
@@ -498,7 +505,7 @@ get_del_string(const fheap_test_param_t *tparam)
  *
  *-------------------------------------------------------------------------
  */
-static size_t
+H5_ATTR_PURE static size_t
 get_fill_size(const fheap_test_param_t *tparam)
 {
     switch(tparam->fill) {
@@ -544,7 +551,7 @@ begin_test(fheap_test_param_t *tparam, const char *base_desc,
     del_str = get_del_string(tparam);
     HDassert(del_str);
     test_desc = (char *)H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc));
-    sprintf(test_desc, base_desc, del_str);
+    HDsprintf(test_desc, base_desc, del_str);
     TESTING(test_desc);
     H5MM_xfree(del_str);
     H5MM_xfree(test_desc);
@@ -642,7 +649,7 @@ open_heap(char *filename, hid_t fapl, hid_t dxpl, const H5HF_create_t *cparam,
     h5_fixname(FILENAME[0], fapl, filename, (size_t)FHEAP_FILENAME_LEN);
 
     /* Create the file to work on */
-    if((*file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    if((*file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Check for deleting the entire heap */
@@ -1827,7 +1834,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
+test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
     char	filename[FHEAP_FILENAME_LEN];         /* Filename to use */
@@ -1844,7 +1851,7 @@ test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC,  tparam->my_fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Close file */
@@ -1944,7 +1951,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
+test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
     char	filename[FHEAP_FILENAME_LEN];         /* Filename to use */
@@ -1956,12 +1963,13 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     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 */
+    hbool_t page = FALSE;               /* Paged aggregation strategy or not */
 
     /* 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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Close file */
@@ -1980,6 +1988,9 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    if(f->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE)
+        page = TRUE;
+
     /* Ignore metadata tags in the file's cache */
     if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
@@ -2058,8 +2069,9 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
         TEST_ERROR
 
     /* Verify the file is correct size */
-    if(file_size != empty_size)
-        TEST_ERROR
+    if(!page || (page && !tparam->reopen_heap))
+        if(file_size != empty_size)
+            TEST_ERROR
 
     /* All tests passed */
     PASSED()
@@ -2090,7 +2102,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
+test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
     hid_t	file2 = -1;             /* File ID */
@@ -2105,12 +2117,13 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
     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 */
+    hbool_t page = FALSE;               /* Paged aggregation strategy or not */
 
     /* 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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Close file */
@@ -2129,6 +2142,9 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    if(f->shared->fs_strategy == H5F_FSPACE_STRATEGY_PAGE)
+        page = TRUE;
+
     /* Ignore metadata tags in the file's cache */
     if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
@@ -2226,8 +2242,9 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
         TEST_ERROR
 
     /* Verify the file is correct size */
-    if(file_size != empty_size)
-        TEST_ERROR
+    if(!page || (page && !tparam->reopen_heap))
+        if(file_size != empty_size)
+            TEST_ERROR
 
     /* All tests passed */
     PASSED()
@@ -2262,7 +2279,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
+test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
     char	filename[FHEAP_FILENAME_LEN];         /* Filename to use */
@@ -2280,7 +2297,7 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_U
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Close file */
@@ -2433,7 +2450,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_id_limits(hid_t fapl, H5HF_create_t *cparam)
+test_id_limits(hid_t fapl, H5HF_create_t *cparam, hid_t fcpl)
 {
     hid_t	file = -1;              /* File ID */
     hid_t       dxpl = H5AC_ind_read_dxpl_id;     /* DXPL to use */
@@ -2451,7 +2468,7 @@ test_id_limits(hid_t fapl, H5HF_create_t *cparam)
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -2778,7 +2795,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
+test_filtered_create(hid_t fapl, H5HF_create_t *cparam, hid_t fcpl)
 {
     hid_t	file = -1;              /* File ID */
     hid_t       dxpl = H5AC_ind_read_dxpl_id;     /* DXPL to use */
@@ -2794,7 +2811,7 @@ test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -2901,7 +2918,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_size(hid_t fapl, H5HF_create_t *cparam)
+test_size(hid_t fapl, H5HF_create_t *cparam, hid_t fcpl)
 {
     hid_t	file = -1;              /* File ID */
     hid_t       dxpl = H5AC_ind_read_dxpl_id;     /* DXPL to use */
@@ -2917,7 +2934,7 @@ test_size(hid_t fapl, H5HF_create_t *cparam)
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3045,7 +3062,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static unsigned
-test_reopen_hdr(hid_t fapl, H5HF_create_t *cparam)
+test_reopen_hdr(hid_t fapl, H5HF_create_t *cparam, hid_t fcpl)
 {
     hid_t       file1 = -1;             /* File ID */
     hid_t       file2 = -2;             /* File ID */
@@ -3060,7 +3077,7 @@ test_reopen_hdr(hid_t fapl, H5HF_create_t *cparam)
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
     /* Create the file to work on */
-    if((file1 = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    if((file1 = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3199,7 +3216,7 @@ test_man_insert_weird(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3309,7 +3326,7 @@ test_man_insert_first(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3410,7 +3427,7 @@ test_man_insert_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tp
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3507,7 +3524,7 @@ test_man_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3606,7 +3623,7 @@ test_man_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_par
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3712,7 +3729,7 @@ test_man_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3819,7 +3836,7 @@ test_man_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -3930,7 +3947,7 @@ test_man_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4026,7 +4043,7 @@ test_man_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4129,7 +4146,7 @@ test_man_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4230,7 +4247,7 @@ test_man_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4341,7 +4358,7 @@ test_man_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4438,7 +4455,7 @@ test_man_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4534,7 +4551,7 @@ test_man_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4636,7 +4653,7 @@ test_man_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhe
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4746,7 +4763,7 @@ test_man_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4849,7 +4866,7 @@ test_man_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -4960,7 +4977,7 @@ test_man_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5068,7 +5085,7 @@ test_man_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5166,7 +5183,7 @@ test_man_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5275,7 +5292,7 @@ test_man_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5378,7 +5395,7 @@ test_man_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5488,7 +5505,7 @@ test_man_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5599,7 +5616,7 @@ test_man_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5706,7 +5723,7 @@ test_man_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5814,7 +5831,7 @@ test_man_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -5929,7 +5946,7 @@ test_man_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6049,7 +6066,7 @@ test_man_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6161,7 +6178,7 @@ test_man_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6276,7 +6293,7 @@ test_man_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6410,7 +6427,7 @@ test_man_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6563,7 +6580,7 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6727,7 +6744,7 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6920,7 +6937,7 @@ test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -7089,7 +7106,7 @@ test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -7333,7 +7350,7 @@ test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
@@ -7632,7 +7649,7 @@ test_man_incr_insert_remove(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
     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)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, tparam->my_fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -7664,10 +7681,10 @@ test_man_incr_insert_remove(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
     TESTING("incremental object insertion and removal")
 
     for(i = 0; i < 100; i++) {
-        sprintf(obj1.b, "%s%d", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", i);
+        HDsprintf(obj1.b, "%s%d", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", i);
 
         for(j = 0; j < i; j++) {
-            sprintf(obj2.b, "%s%d", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", j);
+            HDsprintf(obj2.b, "%s%d", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", j);
 
             if(H5HF_remove(fh, dxpl, heap_id[j]) < 0)
                 FAIL_STACK_ERROR
@@ -13758,7 +13775,7 @@ test_filtered_huge(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam
     unsigned char obj_type;             /* Type of storage for object */
     fheap_heap_state_t state;           /* State of fractal heap */
     unsigned    deflate_level;          /* Deflation level */
-    unsigned    old_actual_id_len = 0;  /* Old actual ID length */
+    size_t      old_actual_id_len =0 ;  /* Old actual ID length */
     hbool_t     huge_ids_direct;        /* Are 'huge' objects directly acccessed? */
     const char *base_desc = "insert 'huge' object into heap with I/O filters, then remove %s";       /* Test description */
 
@@ -15741,7 +15758,7 @@ HDfprintf(stderr, "Random # seed was: %lu\n", seed);
     /* Loop over adding objects to the heap, until the size limit is reached */
     total_obj_added = 0;
     while(total_obj_added < size_limit) {
-        unsigned size_range = (tmp_cparam.managed.start_block_size / 8);       /* Object size range */
+        size_t size_range = (tmp_cparam.managed.start_block_size / 8);       /* Object size range */
 
         /* Determine the size of the range for this object */
         /* (50% of the objects inserted will use the initial size range,
@@ -16061,9 +16078,9 @@ test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 
         /* Change size of data to write */
         if(u < 20)
-            obj_size = (size_t)(obj_size * 1.3F);
+            obj_size = (size_t)((float)obj_size * 1.3F);
         else
-            obj_size = (size_t)(obj_size / 1.3F);
+            obj_size = (size_t)((float)obj_size / 1.3F);
     } /* end for */
 
     /* Close the fractal heap */
@@ -16110,9 +16127,9 @@ test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 
         /* Change size of data to write */
         if(u < 20)
-            obj_size = (size_t)(obj_size * 1.3F);
+            obj_size = (size_t)((float)obj_size * 1.3F);
         else
-            obj_size = (size_t)(obj_size / 1.3F);
+            obj_size = (size_t)((float)obj_size / 1.3F);
     } /* end for */
 
     /* Close the fractal heap */
@@ -16352,18 +16369,40 @@ main(void)
     fheap_test_param_t tparam;          /* Testing parameters */
     H5HF_create_t small_cparam;         /* Creation parameters for "small" heap */
     H5HF_create_t large_cparam;         /* Creation parameters for "large" heap */
-    hid_t	fapl = -1;              /* File access property list for data files */
+    hid_t	fapl = -1, def_fapl = -1;   /* File access property list for data files */
+    hid_t	pb_fapl = -1;               /* File access property list for data files */
+    hid_t	fcpl = -1, def_fcpl = -1;   /* File creation property list for data files */
     fheap_test_type_t curr_test;        /* Current test being worked on */
-    unsigned    u;                      /* Local index variable */
+    unsigned    u, v;                   /* Local index variable */
     unsigned	nerrors = 0;            /* Cumulative error count */
-    int		ExpressMode;            /* Express testing level */
+    unsigned num_pb_fs = 1;             /* The number of settings to test for page buffering and file space handling */
+    int	ExpressMode;                    /* Express testing level */
 
     /* Reset library */
     h5_reset();
-    fapl = h5_fileaccess();
+
+    def_fapl = h5_fileaccess();
     ExpressMode = GetTestExpress();
+
+    /* 
+     * Caution when turning on ExpressMode 0:
+     *  It will activate testing with different combinations of
+     *       page buffering and file space strategy and the
+     *       running time will be long.
+     *  For parallel build, the last two tests for page buffering
+     *      are skipped because this feature is disabled in parallel.
+     *      Activate full testing when this feature is re-enabled
+     *      in the future for parallel build.
+     */
     if(ExpressMode > 1)
-	printf("***Express test mode on.  Some tests may be skipped\n");
+        HDprintf("***Express test mode on.  Some tests may be skipped\n");
+    else if(ExpressMode == 0) {
+#ifdef H5_HAVE_PARALLEL
+        num_pb_fs = NUM_PB_FS - 2;
+#else
+        num_pb_fs = NUM_PB_FS;
+#endif
+    }
 
     /* Initialize heap creation parameters */
     init_small_cparam(&small_cparam);
@@ -16374,458 +16413,419 @@ main(void)
     shared_wobj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g);
     shared_robj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g);
 
+    /* Create a copy def_fapl and enable page buffering */
+    if((pb_fapl = H5Pcopy(def_fapl)) < 0)
+        TEST_ERROR
+    if(H5Pset_page_buffer_size(pb_fapl, PAGE_BUFFER_PAGE_SIZE, 0, 0) < 0)
+        TEST_ERROR
+
+    /* Create a file creation property list */
+    if((def_fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        TEST_ERROR
+
     /* Initialize the shared write buffer for objects */
     for(u = 0; u < shared_obj_size_g; u++)
         shared_wobj_g[u] = (unsigned char)u;
 
-    /* Iterate over the testing parameters */
-#ifndef QAK
-    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;
-/* curr_test = FHEAP_TEST_REOPEN; */
-#endif /* QAK */
-        /* Clear the testing parameters */
-        HDmemset(&tparam, 0, sizeof(fheap_test_param_t));
-        tparam.actual_id_len = HEAP_ID_LEN;
-
-        /* Set appropriate testing parameters for each test */
-        switch(curr_test) {
-            /* "Normal" testing parameters */
-            case FHEAP_TEST_NORMAL:
-                puts("Testing with normal parameters");
-                break;
+    for(v = 0; v < num_pb_fs; v++) {
+
+        if((fcpl = H5Pcopy(def_fcpl)) < 0) 
+            TEST_ERROR
 
-            /* "Re-open heap" testing parameters */
-            case FHEAP_TEST_REOPEN:
-                puts("Testing with reopen heap flag set");
-                tparam.reopen_heap = FHEAP_TEST_REOPEN;
+        switch(v) {
+            case 0:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = def_fapl;
+                break;
+            case 1:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = def_fapl;
+                break;
+            case 2:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = def_fapl;
+                break;
+            case 3:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = def_fapl;
+                break;
+            case 4:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = pb_fapl;
+                break;
+            case 5:
+                if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+                    TEST_ERROR
+                fapl = pb_fapl;
                 break;
 
-            /* An unknown test? */
-            case FHEAP_TEST_NTESTS:
+            case NUM_PB_FS:
             default:
                 goto error;
-        } /* end switch */
+        }
 
-        /* Test fractal heap creation */
-#ifndef QAK
-        nerrors += test_create(fapl, &small_cparam, &tparam);
-        nerrors += test_reopen(fapl, &small_cparam, &tparam);
-        nerrors += test_open_twice(fapl, &small_cparam, &tparam);
-        nerrors += test_delete_open(fapl, &small_cparam, &tparam);
-        nerrors += test_id_limits(fapl, &small_cparam);
-        nerrors += test_filtered_create(fapl, &small_cparam);
-        nerrors += test_size(fapl, &small_cparam);
-        nerrors += test_reopen_hdr(fapl, &small_cparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+        /* Iterate over the testing parameters */
+        for(curr_test = FHEAP_TEST_NORMAL; curr_test < FHEAP_TEST_NTESTS; H5_INC_ENUM(fheap_test_type_t, curr_test)) {
+            /* Clear the testing parameters */
+            HDmemset(&tparam, 0, sizeof(fheap_test_param_t));
+            tparam.actual_id_len = HEAP_ID_LEN;
 
-#ifndef QAK2
-#ifndef QAK
-        {
-        fheap_test_fill_t fill;        /* Size of objects to fill heap blocks with */
-
-#ifndef QAK2
-        /* Filling with different sized objects */
-        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;
-/* fill = FHEAP_TEST_FILL_SINGLE; */
-#endif /* QAK2 */
-            tparam.fill = fill;
+            /* Set to run with different file space setting */
+            tparam.my_fcpl = fcpl;
 
             /* Set appropriate testing parameters for each test */
-            switch(fill) {
-                /* "Bulk fill" heap blocks with 'large' objects */
-                case FHEAP_TEST_FILL_LARGE:
-                    puts("Bulk-filling blocks w/large objects");
+            switch(curr_test) {
+                /* "Normal" testing parameters */
+                case FHEAP_TEST_NORMAL:
+                    HDputs("Testing with normal parameters");
                     break;
 
-                /* "Bulk fill" heap blocks with 'single' objects */
-                case FHEAP_TEST_FILL_SINGLE:
-                    puts("Bulk-filling blocks w/single object");
+                /* "Re-open heap" testing parameters */
+                case FHEAP_TEST_REOPEN:
+                    HDputs("Testing with reopen heap flag set");
+                    tparam.reopen_heap = FHEAP_TEST_REOPEN;
                     break;
 
                 /* An unknown test? */
-                case FHEAP_TEST_FILL_N:
+                case FHEAP_TEST_NTESTS:
                 default:
                     goto error;
             } /* end switch */
 
-            /*
-             * Test fractal heap managed object insertion
-             */
+            /* Test fractal heap creation */
+            nerrors += test_create(fapl, &small_cparam, &tparam);
+            nerrors += test_reopen(fapl, &small_cparam, &tparam);
+            nerrors += test_open_twice(fapl, &small_cparam, &tparam);
+            nerrors += test_delete_open(fapl, &small_cparam, &tparam);
 
-#ifndef QAK
-            /* "Weird" sized objects */
-            nerrors += test_man_insert_weird(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            nerrors += test_id_limits(fapl, &small_cparam, tparam.my_fcpl);
+            nerrors += test_filtered_create(fapl, &small_cparam, tparam.my_fcpl);
+            nerrors += test_size(fapl, &small_cparam, tparam.my_fcpl);
+            nerrors += test_reopen_hdr(fapl, &small_cparam, tparam.my_fcpl);
 
-#ifdef ALL_INSERT_TESTS
-            /* "Standard" sized objects, building from simple to complex heaps */
-            nerrors += test_man_insert_first(fapl, &small_cparam, &tparam);
-            nerrors += test_man_insert_second(fapl, &small_cparam, &tparam);
-            nerrors += test_man_insert_root_mult(fapl, &small_cparam, &tparam);
-            nerrors += test_man_insert_force_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_insert_fill_second(fapl, &small_cparam, &tparam);
-            nerrors += test_man_insert_third_direct(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_first_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_start_second_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_second_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_start_third_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_fourth_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_all_root_direct(fapl, &small_cparam, &tparam);
-            nerrors += test_man_first_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_second_direct_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_first_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_second_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_second_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_recursive_indirect_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_start_2nd_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_recursive_indirect_two_deep(fapl, &small_cparam, &tparam);
-            nerrors += test_man_start_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_first_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_3rd_recursive_indirect_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_all_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_start_4th_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_first_4th_recursive_indirect(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_4th_recursive_indirect_row(fapl, &small_cparam, &tparam);
-            nerrors += test_man_fill_all_4th_recursive_indirect(fapl, &small_cparam, &tparam);
-#endif /* ALL_INSERT_TESTS */
-            /* If this test fails, uncomment the tests above, which build up to this
-             * level of complexity gradually. -QAK
-             */
-#ifndef QAK
-            if(ExpressMode > 1)
-                printf("***Express test mode on.  test_man_start_5th_recursive_indirect is skipped\n");
-            else
-                nerrors += test_man_start_5th_recursive_indirect(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            {
+            fheap_test_fill_t fill;        /* Size of objects to fill heap blocks with */
 
-            /*
-             * Test fractal heap object deletion
-             */
-            /* Simple removal */
-#ifndef QAK
-            nerrors += test_man_remove_bogus(fapl, &small_cparam, &tparam);
-            nerrors += test_man_remove_one(fapl, &small_cparam, &tparam);
-            nerrors += test_man_remove_two(fapl, &small_cparam, &tparam);
-            nerrors += test_man_remove_one_larger(fapl, &small_cparam, &tparam);
-            tparam.del_dir = FHEAP_DEL_FORWARD;
-            nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam);
-            tparam.del_dir = FHEAP_DEL_REVERSE;
-            nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam);
-            tparam.del_dir = FHEAP_DEL_FORWARD;
-            nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam);
-            tparam.del_dir = FHEAP_DEL_REVERSE;
-            nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam);
-
-            /* Incremental insert & removal */
-            tparam.del_dir = FHEAP_DEL_FORWARD;
-            nerrors += test_man_incr_insert_remove(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            /* Filling with different sized objects */
+            for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; H5_INC_ENUM(fheap_test_fill_t, fill)) {
+                tparam.fill = fill;
 
-#ifndef QAK
-#ifndef QAK2
-            {
-            fheap_test_del_dir_t del_dir;        /* Deletion direction */
-            fheap_test_del_drain_t drain_half;   /* Deletion draining */
+                /* Set appropriate testing parameters for each test */
+                switch(fill) {
+                    /* "Bulk fill" heap blocks with 'large' objects */
+                    case FHEAP_TEST_FILL_LARGE:
+                        HDputs("Bulk-filling blocks w/large objects");
+                        break;
 
-            /* More complex removal patterns */
-            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; H5_INC_ENUM(fheap_test_del_drain_t, drain_half)) {
-                    tparam.drain_half = drain_half;
-#else /* QAK2 */
-HDfprintf(stderr, "Uncomment test loops!\n");
-/* tparam.del_dir = FHEAP_DEL_FORWARD; */
-/* tparam.del_dir = FHEAP_DEL_REVERSE; */
-tparam.del_dir = FHEAP_DEL_HEAP;
-tparam.drain_half = FHEAP_DEL_DRAIN_ALL;
-/* tparam.drain_half = FHEAP_DEL_DRAIN_HALF; */
-#endif /* QAK2 */
-                    /* Don't need to test deletion directions when deleting entire heap */
-                    if(tparam.del_dir == FHEAP_DEL_HEAP && tparam.drain_half > FHEAP_DEL_DRAIN_ALL)
+                    /* "Bulk fill" heap blocks with 'single' objects */
+                    case FHEAP_TEST_FILL_SINGLE:
+                        HDputs("Bulk-filling blocks w/single object");
                         break;
 
-#ifndef QAK
-                    /* Simple insertion patterns */
-                    nerrors += test_man_remove_root_direct(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_remove_two_direct(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_remove_first_row(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_remove_first_two_rows(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_remove_first_four_rows(fapl, &small_cparam, &tparam);
-                    if(ExpressMode > 1)
-                        printf("***Express test mode on.  Some tests skipped\n");
-                    else {
-                        nerrors += test_man_remove_all_root_direct(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_remove_2nd_indirect(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_remove_3rd_indirect(fapl, &small_cparam, &tparam);
-                    } /* end else */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+                    /* An unknown test? */
+                    case FHEAP_TEST_FILL_N:
+                    default:
+                        goto error;
+                } /* end switch */
 
-#ifndef QAK
-                    /* Skip blocks insertion */
-                    /* (covers insertion & deletion of skipped blocks) */
-                    nerrors += test_man_skip_start_block(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_skip_start_block_add_back(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_skip_2nd_block(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_one_partial_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_row_skip_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_direct_skip_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_2nd_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    if(ExpressMode > 1)
-                        printf("***Express test mode on.  Some tests skipped\n");
-                    else {
-                        nerrors += test_man_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                        nerrors += test_man_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
-                    } /* end else */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+                /*
+                 * Test fractal heap managed object insertion
+                 */
 
-#ifndef QAK
-                    /* Fragmented insertion patterns */
-                    /* (covers insertion & deletion of fragmented blocks) */
-                    nerrors += test_man_frag_simple(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_frag_direct(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_frag_2nd_direct(fapl, &small_cparam, &tparam);
-                    nerrors += test_man_frag_3rd_direct(fapl, &small_cparam, &tparam);
-#else /* QAK */
-    HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
-#ifndef QAK2
+                 /* "Weird" sized objects */
+                 nerrors += test_man_insert_weird(fapl, &small_cparam, &tparam);
+
+#ifdef ALL_INSERT_TESTS
+                 /* "Standard" sized objects, building from simple to complex heaps */
+                 nerrors += test_man_insert_first(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_insert_second(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_insert_root_mult(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_insert_force_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_insert_fill_second(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_insert_third_direct(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_first_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_start_second_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_second_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_start_third_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_fourth_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_all_root_direct(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_first_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_second_direct_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_first_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_second_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_second_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_recursive_indirect_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_start_2nd_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_recursive_indirect_two_deep(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_start_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_first_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_3rd_recursive_indirect_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_all_3rd_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_start_4th_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_first_4th_recursive_indirect(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_4th_recursive_indirect_row(fapl, &small_cparam, &tparam);
+                 nerrors += test_man_fill_all_4th_recursive_indirect(fapl, &small_cparam, &tparam);
+#endif /* ALL_INSERT_TESTS */
+                /* If this test fails, uncomment the tests above, which build up to this
+                 * level of complexity gradually. -QAK
+                 */
+                if(ExpressMode > 1)
+                    HDprintf("***Express test mode on.  test_man_start_5th_recursive_indirect is skipped\n");
+                else
+                    nerrors += test_man_start_5th_recursive_indirect(fapl, &small_cparam, &tparam);
+
+                /*
+                 * Test fractal heap object deletion
+                 */
+                /* Simple removal */
+                nerrors += test_man_remove_bogus(fapl, &small_cparam, &tparam);
+                nerrors += test_man_remove_one(fapl, &small_cparam, &tparam);
+                nerrors += test_man_remove_two(fapl, &small_cparam, &tparam);
+                nerrors += test_man_remove_one_larger(fapl, &small_cparam, &tparam);
+                tparam.del_dir = FHEAP_DEL_FORWARD;
+                nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam);
+                tparam.del_dir = FHEAP_DEL_REVERSE;
+                nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam);
+                tparam.del_dir = FHEAP_DEL_FORWARD;
+                nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam);
+                tparam.del_dir = FHEAP_DEL_REVERSE;
+                nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam);
+
+                /* Incremental insert & removal */
+                tparam.del_dir = FHEAP_DEL_FORWARD;
+                nerrors += test_man_incr_insert_remove(fapl, &small_cparam, &tparam);
+
+                {
+                fheap_test_del_dir_t del_dir;        /* Deletion direction */
+                fheap_test_del_drain_t drain_half;   /* Deletion draining */
+
+                /* More complex removal patterns */
+                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; H5_INC_ENUM(fheap_test_del_drain_t, drain_half)) {
+                        tparam.drain_half = drain_half;
+                        /* Don't need to test deletion directions when deleting entire heap */
+                        if(tparam.del_dir == FHEAP_DEL_HEAP && tparam.drain_half > FHEAP_DEL_DRAIN_ALL)
+                            break;
+
+                        /* Simple insertion patterns */
+                        nerrors += test_man_remove_root_direct(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_remove_two_direct(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_remove_first_row(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_remove_first_two_rows(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_remove_first_four_rows(fapl, &small_cparam, &tparam);
+                        if(ExpressMode > 1)
+                            HDprintf("***Express test mode on.  Some tests skipped\n");
+                        else {
+                            nerrors += test_man_remove_all_root_direct(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_remove_2nd_indirect(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_remove_3rd_indirect(fapl, &small_cparam, &tparam);
+                        } /* end else */
+
+                        /* Skip blocks insertion */
+                        /* (covers insertion & deletion of skipped blocks) */
+                        nerrors += test_man_skip_start_block(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_skip_start_block_add_back(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_skip_2nd_block(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_one_partial_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_row_skip_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_direct_skip_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_2nd_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        if(ExpressMode > 1)
+                            HDprintf("***Express test mode on.  Some tests skipped\n");
+                        else {
+                            nerrors += test_man_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                            nerrors += test_man_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam);
+                        } /* end else */
+
+                        /* Fragmented insertion patterns */
+                        /* (covers insertion & deletion of fragmented blocks) */
+                        nerrors += test_man_frag_simple(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_frag_direct(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_frag_2nd_direct(fapl, &small_cparam, &tparam);
+                        nerrors += test_man_frag_3rd_direct(fapl, &small_cparam, &tparam);
+                    } /* end for */
                 } /* end for */
-            } /* end for */
 
-            /* Reset deletion drain parameter */
-            tparam.drain_half = FHEAP_DEL_DRAIN_ALL;
+                /* Reset deletion drain parameter */
+                tparam.drain_half = FHEAP_DEL_DRAIN_ALL;
 
-            } /* end block */
-#endif /* QAK2 */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
-#ifndef QAK2
+                } /* end block */
             } /* end for */
-#endif /* QAK2 */
-        } /* end block */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            } /* end block */
 
-        /*
-         * Test fractal heap 'huge' & 'tiny' object insertion & deletion
-         */
-#ifndef QAK
-        {
-        fheap_test_del_dir_t del_dir;   /* Deletion direction */
-        unsigned id_len;                /* Length of heap IDs */
-
-        /* 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 = (uint16_t)id_len;
-
-            /* Print information about each test */
-            switch(id_len) {
-                /* Use "normal" form for 'huge' object's heap IDs */
-                case 0:
-                    puts("Using 'normal' heap ID format for 'huge' objects");
-                    break;
+            /*
+             * Test fractal heap 'huge' & 'tiny' object insertion & deletion
+             */
+            {
+            fheap_test_del_dir_t del_dir;   /* Deletion direction */
+            unsigned id_len;                /* Length of heap IDs */
+
+            /* 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 = (uint16_t)id_len;
+
+                /* Print information about each test */
+                switch(id_len) {
+                    /* Use "normal" form for 'huge' object's heap IDs */
+                    case 0:
+                        HDputs("Using 'normal' heap ID format for 'huge' objects");
+                        break;
 
-                /* Use "direct" form for 'huge' object's heap IDs */
-                case 1:
-                    puts("Using 'direct' heap ID format for 'huge' objects");
+                    /* Use "direct" form for 'huge' object's heap IDs */
+                    case 1:
+                        HDputs("Using 'direct' heap ID format for 'huge' objects");
 
-                    /* Adjust actual length of heap IDs for directly storing 'huge' object's file offset & length in heap ID */
-                    tparam.actual_id_len = 17;   /* 1 + 8 (file address size) + 8 (file length size) */
-                    break;
+                        /* Adjust actual length of heap IDs for directly storing 'huge' object's file offset & length in heap ID */
+                        tparam.actual_id_len = 17;   /* 1 + 8 (file address size) + 8 (file length size) */
+                        break;
 
-                /* Use "direct" storage for 'huge' objects and larger IDs for 'tiny' objects */
-                case 2:
-                    small_cparam.id_len = 37;
-                    puts("Using 'direct' heap ID format for 'huge' objects and larger IDs for 'tiny' objects");
-                    tparam.actual_id_len = 37;
-                    break;
+                    /* Use "direct" storage for 'huge' objects and larger IDs for 'tiny' objects */
+                    case 2:
+                        small_cparam.id_len = 37;
+                        HDputs("Using 'direct' heap ID format for 'huge' objects and larger IDs for 'tiny' objects");
+                        tparam.actual_id_len = 37;
+                        break;
 
-                /* An unknown test? */
-                default:
-                    goto error;
-            } /* end switch */
+                    /* An unknown test? */
+                    default:
+                        goto error;
+                } /* end switch */
+
+                /* Try several different methods of deleting objects */
+                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 */
+                    nerrors += test_huge_insert_one(fapl, &small_cparam, &tparam);
+                    nerrors += test_huge_insert_two(fapl, &small_cparam, &tparam);
+                    nerrors += test_huge_insert_three(fapl, &small_cparam, &tparam);
+                    nerrors += test_huge_insert_mix(fapl, &small_cparam, &tparam);
+                    nerrors += test_filtered_huge(fapl, &small_cparam, &tparam);
+
+                    /* Test 'tiny' object insert & delete */
+                    nerrors += test_tiny_insert_one(fapl, &small_cparam, &tparam);
+                    nerrors += test_tiny_insert_two(fapl, &small_cparam, &tparam);
+                    nerrors += test_tiny_insert_mix(fapl, &small_cparam, &tparam);
+                } /* end for */
+            } /* end for */
+
+            /* Reset the "normal" heap ID lengths */
+            small_cparam.id_len = 0;
+            tparam.actual_id_len = HEAP_ID_LEN;
+            } /* end block */
+
+            /* Test I/O filter support */
 
             /* Try several different methods of deleting objects */
+            {
+            fheap_test_del_dir_t del_dir;   /* Deletion direction */
+
             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 */
-#ifndef QAK
-                nerrors += test_huge_insert_one(fapl, &small_cparam, &tparam);
-                nerrors += test_huge_insert_two(fapl, &small_cparam, &tparam);
-                nerrors += test_huge_insert_three(fapl, &small_cparam, &tparam);
-                nerrors += test_huge_insert_mix(fapl, &small_cparam, &tparam);
-                nerrors += test_filtered_huge(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+                /* Controlled tests */
+                /* XXX: Re-enable file size checks in these tests, after the file has persistent free space tracking working */
+                nerrors += test_filtered_man_root_direct(fapl, &small_cparam, &tparam);
+                nerrors += test_filtered_man_root_indirect(fapl, &small_cparam, &tparam);
 
-#ifndef QAK
-                /* Test 'tiny' object insert & delete */
-                nerrors += test_tiny_insert_one(fapl, &small_cparam, &tparam);
-                nerrors += test_tiny_insert_two(fapl, &small_cparam, &tparam);
-                nerrors += test_tiny_insert_mix(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
-            } /* end for */
-        } /* end for */
+                /* Random tests, with compressed blocks */
+                tparam.comp = FHEAP_TEST_COMPRESS;
+                nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(25*1000*1000)), fapl, &small_cparam, &tparam);
+                nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(2*1000*1000)), fapl, &small_cparam, &tparam);
 
-        /* Reset the "normal" heap ID lengths */
-        small_cparam.id_len = 0;
-        tparam.actual_id_len = HEAP_ID_LEN;
-        } /* end block */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
-#else /* QAK2 */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK2 */
+                /* Reset block compression */
+                tparam.comp = FHEAP_TEST_NO_COMPRESS;
+            } /* end for */
+            } /* end block */
 
-        /* Test I/O filter support */
+            /* Random object insertion & deletion */
+            if(ExpressMode > 1)
+                HDprintf("***Express test mode on.  Some tests skipped\n");
+            else {
+                /* Random tests using "small" heap creation parameters */
+                HDputs("Using 'small' heap creation parameters");
 
-#ifndef QAK
-        /* Try several different methods of deleting objects */
-        {
-        fheap_test_del_dir_t del_dir;   /* Deletion direction */
+                /* (reduce size of tests when re-opening each time) */
+                /* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */
+                tparam.del_dir = FHEAP_DEL_FORWARD;
+                nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam);
+                nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam);
 
-        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;
+                tparam.del_dir = FHEAP_DEL_HEAP;
+                nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam);
+                nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam);
 
-            /* Controlled tests */
-/* XXX: Re-enable file size checks in these tests, after the file has persistent free space tracking working */
-            nerrors += test_filtered_man_root_direct(fapl, &small_cparam, &tparam);
-            nerrors += test_filtered_man_root_indirect(fapl, &small_cparam, &tparam);
+                /* Random tests using "large" heap creation parameters */
+                HDputs("Using 'large' heap creation parameters");
+                tparam.actual_id_len = LARGE_HEAP_ID_LEN;
 
-            /* Random tests, with compressed blocks */
-            tparam.comp = FHEAP_TEST_COMPRESS;
-            nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(25*1000*1000)), fapl, &small_cparam, &tparam);
-            nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(2*1000*1000)), fapl, &small_cparam, &tparam);
+                /* (reduce size of tests when re-opening each time) */
+                /* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */
+                tparam.del_dir = FHEAP_DEL_FORWARD;
+                nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam);
+                nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam);
 
-            /* Reset block compression */
-            tparam.comp = FHEAP_TEST_NO_COMPRESS;
-        } /* end for */
-        } /* end block */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+                tparam.del_dir = FHEAP_DEL_HEAP;
+                nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam);
+                nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam);
 
-#ifndef QAK
-        /* Random object insertion & deletion */
-        if(ExpressMode > 1)
-            printf("***Express test mode on.  Some tests skipped\n");
-        else {
-#ifndef QAK
-            /* Random tests using "small" heap creation parameters */
-            puts("Using 'small' heap creation parameters");
-
-            /* (reduce size of tests when re-opening each time) */
-/* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */
-            tparam.del_dir = FHEAP_DEL_FORWARD;
-            nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam);
-            nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam);
-
-            tparam.del_dir = FHEAP_DEL_HEAP;
-            nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam);
-            nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+                /* Reset the "normal" heap ID length */
+                tparam.actual_id_len = SMALL_HEAP_ID_LEN;
+            } /* end else */
 
-#ifndef QAK
-            /* Random tests using "large" heap creation parameters */
-            puts("Using 'large' heap creation parameters");
-            tparam.actual_id_len = LARGE_HEAP_ID_LEN;
-
-            /* (reduce size of tests when re-opening each time) */
-/* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */
-            tparam.del_dir = FHEAP_DEL_FORWARD;
-            nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam);
-            nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam);
-
-            tparam.del_dir = FHEAP_DEL_HEAP;
-            nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam);
-            nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            /* Test object writing support */
 
-            /* Reset the "normal" heap ID length */
-            tparam.actual_id_len = SMALL_HEAP_ID_LEN;
-        } /* end else */
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
+            /* Basic object writing */
+            nerrors += test_write(fapl, &small_cparam, &tparam);
 
-#ifndef QAK
-        /* Test object writing support */
+            /* Writing objects in heap with filters */
+            tparam.comp = FHEAP_TEST_COMPRESS;
+            nerrors += test_write(fapl, &small_cparam, &tparam);
 
-        /* Basic object writing */
-        nerrors += test_write(fapl, &small_cparam, &tparam);
+            /* Reset block compression */
+            tparam.comp = FHEAP_TEST_NO_COMPRESS;
+        } /* end for */
 
-        /* Writing objects in heap with filters */
-        tparam.comp = FHEAP_TEST_COMPRESS;
-        nerrors += test_write(fapl, &small_cparam, &tparam);
+        if(H5Pclose(fcpl) < 0)
+            TEST_ERROR
+    } /* end num_pb_fs */
 
-        /* Reset block compression */
-        tparam.comp = FHEAP_TEST_NO_COMPRESS;
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
-#ifndef QAK
-    } /* end for */
-#endif /* QAK */
+    /* Tests that address specific bugs */
+    tparam.my_fcpl = def_fcpl;
+    fapl = def_fapl;
 
     /* Tests that address specific bugs */
-#ifndef QAK
     nerrors += test_bug1(fapl, &small_cparam, &tparam);
-#else /* QAK */
-HDfprintf(stderr, "Uncomment tests!\n");
-#endif /* QAK */
 
     /* Verify symbol table messages are cached */
     nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
 
     if(nerrors)
         goto error;
-    puts("All fractal heap tests passed.");
+    HDputs("All fractal heap tests passed.");
 
     /* Release space for the shared objects */
     H5MM_xfree(shared_wobj_g);
@@ -16834,9 +16834,12 @@ HDfprintf(stderr, "Uncomment tests!\n");
     H5MM_xfree(shared_lens_g);
     H5MM_xfree(shared_offs_g);
 
+    if(H5Pclose(def_fcpl) < 0) TEST_ERROR
+    if(H5Pclose(pb_fapl) < 0) TEST_ERROR
+
     /* Clean up file used */
 #ifndef QAK
-    h5_cleanup(FILENAME, fapl);
+    h5_cleanup(FILENAME, def_fapl);
 #else /* QAK */
 HDfprintf(stderr, "Uncomment cleanup!\n");
 #endif /* QAK */
@@ -16844,14 +16847,17 @@ HDfprintf(stderr, "Uncomment cleanup!\n");
     return 0;
 
 error:
-    puts("*** TESTS FAILED ***");
+    HDputs("*** TESTS FAILED ***");
     H5E_BEGIN_TRY {
         H5MM_xfree(shared_wobj_g);
         H5MM_xfree(shared_robj_g);
         H5MM_xfree(shared_ids_g);
         H5MM_xfree(shared_lens_g);
         H5MM_xfree(shared_offs_g);
-	H5Pclose(fapl);
+        H5Pclose(def_fapl);
+        H5Pclose(pb_fapl);
+        H5Pclose(def_fcpl);
+        H5Pclose(fcpl);
     } H5E_END_TRY;
     return 1;
 } /* end main() */
diff --git a/test/file_image.c b/test/file_image.c
index 6d1845f..90b3233 100644
--- a/test/file_image.c
+++ b/test/file_image.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -22,7 +20,6 @@
 *************************************************************/
 
 #include "h5test.h"
-#include "H5srcdir.h"
 #include "H5Fprivate.h" /* required to test property removals */
 #define VERIFY(condition, string) do { if (!(condition)) FAIL_PUTS_ERROR(string) } while(0)
 
@@ -633,7 +630,8 @@ test_core(void)
     VERIFY(ret == 0, "fstat failed");
     size = (size_t)sb.st_size;
     file_image = (unsigned char *)HDmalloc(size);
-    HDread(fd, file_image, size);
+    if(HDread(fd, file_image, size) < 0)
+        FAIL_PUTS_ERROR("unable to read from file descriptor");
     ret = HDclose(fd);
     VERIFY(ret == 0, "close failed");
 
@@ -868,9 +866,11 @@ test_get_file_image(const char * test_banner,
         VERIFY(fd >= 0, "HDopen() failed.");
 
 	if(user) {
+            HDoff_t off;
+
             /* Position at userblock */
-            ret = HDlseek(fd, (off_t)USERBLOCK_SIZE, SEEK_SET);
-            VERIFY(ret >= 0, "HDlseek() failed.");
+            off = HDlseek(fd, (off_t)USERBLOCK_SIZE, SEEK_SET);
+            VERIFY(off >= 0, "HDlseek() failed.");
         }
 
         /* read the test file from disk into the buffer */
@@ -1317,7 +1317,7 @@ main(void)
 
     h5_reset();
 
-    printf("Testing File Image Functionality.\n");
+    HDprintf("Testing File Image Functionality.\n");
 
     errors += test_properties();
     errors += test_callbacks();
@@ -1378,12 +1378,12 @@ main(void)
     h5_restore_err();
 
     if(errors) { 
-        printf("***** %d File Image TEST%s FAILED! *****\n", 
+        HDprintf("***** %d File Image TEST%s FAILED! *****\n", 
             errors, errors > 1 ? "S" : ""); 
         return 1; 
     }
 
-    printf("All File Image tests passed.\n");
+    HDprintf("All File Image tests passed.\n");
     return 0;
 }
 
diff --git a/test/filespace_1_6.h5 b/test/filespace_1_6.h5
index c8aa9df..5afc718 100644
Binary files a/test/filespace_1_6.h5 and b/test/filespace_1_6.h5 differ
diff --git a/test/filespace_1_8.h5 b/test/filespace_1_8.h5
index 85138b0..3fa2822 100644
Binary files a/test/filespace_1_8.h5 and b/test/filespace_1_8.h5 differ
diff --git a/test/fill_old.h5 b/test/fill_old.h5
index 4dd7740..e77f519 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 1ea2ae6..ea13de0 100644
--- a/test/fillval.c
+++ b/test/fillval.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -623,7 +621,7 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout)
         if((dset9 = H5Dopen2(file, "dset9", H5P_DEFAULT)) < 0) goto error;
         if((dcpl = H5Dget_create_plist(dset9)) < 0) goto error;
         if(H5Pget_fill_value(dcpl, comp_type_id, &rd_c) < 0) goto error;
-        if( rd_c.a!=0 || rd_c.y != fill_ctype.y || rd_c.x != 0 || rd_c.z != '\0') {
+        if(!H5_FLT_ABS_EQUAL(rd_c.a, 0) || !H5_DBL_ABS_EQUAL(rd_c.y, fill_ctype.y) || rd_c.x != 0 || rd_c.z != '\0') {
            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",
@@ -696,7 +694,7 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout)
     if((dset8 = H5Dopen2(file, "dset8", H5P_DEFAULT)) < 0) goto error;
     if((dcpl = H5Dget_create_plist(dset8)) < 0) goto error;
     if(H5Pget_fill_value(dcpl, comp_type_id, &rd_c) < 0) goto error;
-    if(rd_c.a != 0 || rd_c.y != fill_ctype.y || rd_c.x != 0 || rd_c.z!='\0') {
+    if(!H5_FLT_ABS_EQUAL(rd_c.a, 0) || !H5_DBL_ABS_EQUAL(rd_c.y, fill_ctype.y) || rd_c.x != 0 || rd_c.z != '\0') {
         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",
@@ -789,7 +787,7 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
         goto error;
     for (i=0; i<1000; i++) {
 	for (j=0; j<5; j++)
-	    hs_offset[j] = rand() % cur_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % cur_size[j];
 	if(H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_offset, NULL,
 				one, NULL) < 0) goto error;
 
@@ -811,9 +809,9 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
 	} else if(datatype==H5T_COMPOUND) {
             if(H5Dread(dset2, ctype_id, mspace, fspace, H5P_DEFAULT,
                 &rd_c) < 0) goto error;
-            if(fill_time!=H5D_FILL_TIME_NEVER && (rd_c.a!=fill_c.a ||
-		rd_c.x!=fill_c.x || rd_c.y!=fill_c.y ||
-		rd_c.z!=fill_c.z)) {
+            if(fill_time != H5D_FILL_TIME_NEVER && (!H5_FLT_ABS_EQUAL(rd_c.a, fill_c.a) ||
+                    rd_c.x != fill_c.x || !H5_DBL_ABS_EQUAL(rd_c.y, fill_c.y) ||
+                    rd_c.z != fill_c.z)) {
                 H5_FAILED();
                 HDfprintf(stdout, "%u: Value read was not a fill value.\n", (unsigned)__LINE__);
                 HDfprintf(stdout,"    Elmt={%Hu,%Hu,%Hu,%Hu,%Hu}, read: %f, %d, %f, %c"
@@ -879,8 +877,8 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
         /* Verify values, except if no fill value written */
         if(fill_time != H5D_FILL_TIME_NEVER) {
             for(u = 0; u < nelmts; u++) {
-                if(buf_c[u].a != fill_c.a || buf_c[u].x != fill_c.x ||
-                        buf_c[u].y != fill_c.y || buf_c[u].z != fill_c.z) {
+                if(!H5_FLT_ABS_EQUAL(buf_c[u].a, fill_c.a) || buf_c[u].x != fill_c.x ||
+                        !H5_DBL_ABS_EQUAL(buf_c[u].y, fill_c.y) || buf_c[u].z != fill_c.z) {
                     H5_FAILED();
                     HDfprintf(stdout, "%u: Value read was not a fill value.\n", (unsigned)__LINE__);
                     HDfprintf(stdout,"    Elmt={%Hu, %Hu, %Hu, %Hu, %Hu}, read: %f, %d, %f, %c"
@@ -938,7 +936,7 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
         goto error;
     for(i = 0; i < 1000; i++) {
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % cur_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % cur_size[j];
 	    odd += (int)(hs_offset[j]%2);
 	} /* end for */
 	if(H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_offset, NULL, one, NULL) < 0)
@@ -993,8 +991,8 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
 		    should_be_c.y=buf_c[0].y;
 		    should_be_c.z=buf_c[0].z;
 		}
-		if( rd_c.a!=should_be_c.a || rd_c.x!=should_be_c.x ||
-		    rd_c.y!=should_be_c.y || rd_c.z!=should_be_c.z)  {
+		if(!H5_FLT_ABS_EQUAL(rd_c.a, should_be_c.a) || rd_c.x != should_be_c.x ||
+		    !H5_DBL_ABS_EQUAL(rd_c.y, should_be_c.y) || rd_c.z != should_be_c.z)  {
                     H5_FAILED();
                     HDfprintf(stdout, "%u: Value read was not correct.\n", (unsigned)__LINE__);
                     printf("    Elmt={%ld,%ld,%ld,%ld,%ld}, read: %f,%d,%f,%c "
@@ -1012,8 +1010,8 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
                 should_be_c.x=buf_c[0].x;
                 should_be_c.y=buf_c[0].y;
                 should_be_c.z=buf_c[0].z;
-                if( rd_c.a!=should_be_c.a || rd_c.x!=should_be_c.x ||
-                    rd_c.y!=should_be_c.y || rd_c.z!=should_be_c.z)  {
+		if(!H5_FLT_ABS_EQUAL(rd_c.a, should_be_c.a) || rd_c.x != should_be_c.x ||
+		    !H5_DBL_ABS_EQUAL(rd_c.y, should_be_c.y) || rd_c.z != should_be_c.z)  {
                     H5_FAILED();
                     HDfprintf(stdout, "%u: Value read was not correct.\n", (unsigned)__LINE__);
                     printf("    Elmt={%ld,%ld,%ld,%ld,%ld}, read: %f,%d,%f,%c "
@@ -1438,9 +1436,11 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     int         (*verify_rtn)(unsigned, const hsize_t *, const void *, const void *);
     int         (*release_rtn)(void *);
     size_t      val_size;               /* Size of element */
-    void        *val_rd, *should_be, *init_val, *odd_val, *even_val;
+    void        *val_rd, *odd_val;
+    const void  *init_val, *should_be, *even_val;
     int		val_rd_i, init_val_i = 9999;
-    comp_vl_datatype	val_rd_c, init_val_c = {87, "baz", "mumble", 129};
+    comp_vl_datatype init_val_c = {87, "baz", "mumble", 129};
+    comp_vl_datatype val_rd_c;
     void	*buf = NULL;
     unsigned	odd;                    /* Whether an odd or even coord. was read */
     unsigned	i, j;                   /* Local index variables */
@@ -1495,7 +1495,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0; j < 5; j++)
-	    hs_offset[j] = rand() % start_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % start_size[j];
 
         /* Select the random element */
 	if(H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_offset, NULL, one, NULL) < 0) TEST_ERROR
@@ -1548,7 +1548,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % start_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % start_size[j];
 	    odd += (unsigned)(hs_offset[j] % 2);
 	} /* end for */
 
@@ -1586,7 +1586,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % extend_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % extend_size[j];
 	    if(hs_offset[j] >= start_size[j])
 		odd = 1;
 	    else
@@ -1625,7 +1625,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % max_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % max_size[j];
 	    if(hs_offset[j] >= start_size[j])
 		odd = 1;
 	    else
@@ -1666,7 +1666,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % extend_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % extend_size[j];
 	    if(hs_offset[j] >= start_size[j])
 		odd = 1;
 	    else
@@ -1759,7 +1759,7 @@ test_extend_cases(hid_t file, hid_t _dcpl, const char *dset_name,
     for(i = 0; i < 1000; i++) {
         /* Set offset for random element */
 	for(j = 0, odd = 0; j < 5; j++) {
-	    hs_offset[j] = rand() % extend_size[j];
+	    hs_offset[j] = (hsize_t)HDrand() % extend_size[j];
 	    if(hs_offset[j] >= start_size[j])
 		odd = 1;
 	    else
@@ -2368,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 */
-    unsigned 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;
@@ -2381,7 +2381,7 @@ main(int argc, char *argv[])
                 test_compact =1;
             else {
                 fprintf(stderr, "usage: %s [contiguous] [chunked] [compact]\n", argv[0]);
-                exit(1);
+                exit(EXIT_FAILURE);
             }
         } /* end for */
     } /* end if */
diff --git a/test/filter_fail.c b/test/filter_fail.c
index 0b92abb..76b3106 100644
--- a/test/filter_fail.c
+++ b/test/filter_fail.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -22,7 +20,6 @@
  */
 
 #include "h5test.h"
-#include "H5srcdir.h"
 
 #define DSET_NAME 		"dset_fail"
 #define H5Z_FILTER_FAIL_TEST    312
@@ -350,8 +347,8 @@ error:
  * Purpose:     Tests the library's behavior when a mandate filter returns 
  *              failure.
  *
- * Return:      Success:        exit(0)
- *              Failure:        exit(1)
+ * Return:      Success:        exit(EXIT_SUCCESS)
+ *              Failure:        exit(EXIT_FAILURE)
  * 
  * Programmer:  Raymond Lu
  *              25 August 2010
@@ -407,6 +404,6 @@ error:
     if (nerrors) {
         printf("***** %u FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     }
 }
diff --git a/test/flush1.c b/test/flush1.c
index f15a05a..bdbd731 100644
--- a/test/flush1.c
+++ b/test/flush1.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,189 +18,326 @@
  * Purpose:	This is the first 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.  We simulate a crash by
- *		calling _exit(0) since this doesn't flush HDF5 caches but
+ *		calling _exit(EXIT_SUCCESS) since this doesn't flush HDF5 caches but
  *		still exits with success.
  */
 #include "h5test.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[] = {
     "flush",
+    "flush-swmr",
     "noflush",
+    "noflush-swmr",
+    "flush_extend",
+    "flush_extend-swmr",
     "noflush_extend",
+    "noflush_extend-swmr",
     NULL
 };
 
-static double	the_data[100][100];
+/* Number and size of dataset dims, chunk size, etc. */
+#define NDIMS       1
+#define NELEMENTS   10000
+#define CHUNK_SIZE  25
+#define FIRST_DSET_NAME     "dset1"
+#define SECOND_DSET_NAME    "dset2"
+
+/* Number of sub-groups created in the containing group */
+#define NGROUPS     100
 
+static hid_t create_file(const char *filename, hid_t fapl_id, hbool_t swmr);
+static herr_t add_dset_to_file(hid_t fid, const char *dset_name);
+
+

 /*-------------------------------------------------------------------------
- * Function:	create_file
- *
- * Purpose:	Creates files used in part 1 of the test
+ * Function:    create_file
  *
- * Return:	Success:	0
+ * Purpose:     Creates files and datasets used in part 1 of the test
  *
- *		Failure:	1
+ * Return:      Success:	a valid file ID
+ *              Failure:	-1
  *
  * Programmer:	Leon Arber
  *              Sept. 26, 2006
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static hid_t
-create_file(char* name, hid_t fapl)
+create_file(const char *filename, hid_t fapl_id, hbool_t swmr)
 {
-    hid_t	file, dcpl, space, dset, groups, grp;
-    hsize_t	ds_size[2] = {100, 100};
-    hsize_t	ch_size[2] = {5, 5};
-    size_t	i, j;
+    hid_t   fid = -1;               /* file ID                          */
+    hid_t   top_gid = -1;           /* containing group ID              */
+    hid_t   gid = -1;               /* subgroup ID                      */
+    char    group_name[16];         /* group name                       */
+    unsigned    flags;              /* file open flags                  */
+    int     i;                      /* iterator                         */
 
-    if((file = H5Fcreate(name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+    flags = H5F_ACC_TRUNC | (swmr ? H5F_ACC_SWMR_WRITE : 0);
 
-    /* Create a chunked dataset */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
-    if(H5Pset_chunk(dcpl, 2, ch_size) < 0) FAIL_STACK_ERROR
-    if((space = H5Screate_simple(2, ds_size, NULL)) < 0) FAIL_STACK_ERROR
-    if((dset = H5Dcreate2(file, "dset", H5T_NATIVE_FLOAT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+    if((fid = H5Fcreate(filename, flags, H5P_DEFAULT, fapl_id)) < 0)
+        STACK_ERROR
 
-    /* Write some data */
-    for(i = 0; i < ds_size[0]; i++)
-	/*
-	 * The extra cast in the following statement is a bug workaround
-	 * for the Win32 version 5.0 compiler.
-	 * 1998-11-06 ptl
-	 */
-        for(j = 0; j < (size_t)ds_size[1]; j++)
-	    the_data[i][j] = (double)(hssize_t)i/(hssize_t)(j+1);
-    if(H5Dwrite(dset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, the_data) < 0) FAIL_STACK_ERROR
+    /* Create a chunked dataset */
+    if(add_dset_to_file(fid, FIRST_DSET_NAME) < 0)
+        TEST_ERROR
 
     /* Create some groups */
-    if((groups = H5Gcreate2(file, "some_groups", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
-    for(i = 0; i < 100; i++) {
-	sprintf(name, "grp%02u", (unsigned)i);
-	if((grp = H5Gcreate2(groups, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
-	if(H5Gclose(grp) < 0) FAIL_STACK_ERROR
+    if((top_gid = H5Gcreate2(fid, "top_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        STACK_ERROR
+    for(i = 0; i < NGROUPS; i++) {
+        HDsprintf(group_name, "group%02d", i);
+        if((gid = H5Gcreate2(top_gid, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            STACK_ERROR
+        if(H5Gclose(gid) < 0)
+            STACK_ERROR
     } /* end for */
 
-    return file;
+    if(H5Gclose(top_gid) < 0)
+        STACK_ERROR
+    
+    return fid;
 
 error:
-    HD_exit(1);
-}
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Gclose(gid);
+        H5Gclose(top_gid);
+     } H5E_END_TRY;
 
+    return -1;
+} /* end create_file() */
 
+

 /*-------------------------------------------------------------------------
- * Function:	extend_file
+ * Function:    add_dset_to_file
  *
- * Purpose:	Add a small dataset to the file.
+ * Purpose:     Add a dataset to the file.
  *
- * Return:	Success:	0
- *
- *		Failure:	1
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:	Leon Arber
  *              Oct. 4, 2006
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static hid_t
-extend_file(hid_t file)
+static herr_t
+add_dset_to_file(hid_t fid, const char *dset_name)
 {
-    hid_t	dcpl, space, dset;
-    hsize_t	ds_size[2] = {100, 100};
-    hsize_t	ch_size[2] = {5, 5};
-    size_t	i, j;
+    hid_t   dcpl_id = -1;           /* dataset creation plist ID        */
+    hid_t   sid = -1;               /* dataspace ID                     */
+    hid_t   did = -1;               /* dataset ID                       */
+    int    *data = NULL;            /* data buffer                      */
+    hsize_t dims[1] = {NELEMENTS};  /* size of dataset                  */
+    hsize_t chunk_dims[1] = {CHUNK_SIZE};   /* chunk size               */
+    int     i;                      /* iterator                         */
 
     /* Create a chunked dataset */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dcpl, 2, ch_size) < 0) goto error;
-    if((space = H5Screate_simple(2, ds_size, NULL)) < 0) goto error;
-    if((dset = H5Dcreate2(file, "dset2", H5T_NATIVE_FLOAT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        STACK_ERROR
+    if(H5Pset_chunk(dcpl_id, NDIMS, chunk_dims) < 0)
+        STACK_ERROR
+    if((sid = H5Screate_simple(NDIMS, dims, NULL)) < 0)
+        STACK_ERROR
+    if((did = H5Dcreate2(fid, dset_name, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        STACK_ERROR
 
     /* Write some data */
-    for (i=0; i<ds_size[0]; i++) {
-	/*
-	 * The extra cast in the following statement is a bug workaround
-	 * for the Win32 version 5.0 compiler.
-	 * 1998-11-06 ptl
-	 */
-	for (j=0; j<(size_t)ds_size[1]; j++) {
-	    the_data[i][j] = (double)(hssize_t)i/(hssize_t)(j+1);
-	}
-    }
-    if (H5Dwrite(dset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT,
-		the_data) < 0) goto error;
-
-
-    return file;
+    if(NULL == (data = (int *)HDcalloc((size_t)NELEMENTS, sizeof(int))))
+        STACK_ERROR
+    for(i = 0; i < NELEMENTS; i++)
+        data[i] = i;
+    if(H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data) < 0)
+        STACK_ERROR
+
+    if(H5Pclose(dcpl_id) < 0)
+        STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        STACK_ERROR
+    if(H5Dclose(did) < 0)
+        STACK_ERROR
+
+    HDfree(data);
+
+    return SUCCEED;
 
 error:
-        HD_exit(1);
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl_id);
+        H5Sclose(sid);
+        H5Dclose(did);
+     } H5E_END_TRY;
+
+    HDfree(data);
 
-}
+    return FAIL;
+} /* end add_dset_to_file() */
 
+

 /*-------------------------------------------------------------------------
  * Function:	main
  *
- * Purpose:	Part 1 of a two-part H5Fflush() test.
+ * Purpose:     Creates files and datasets with and without flushing in
+ *              a variety of situations.
  *
- * Return:	Success:	0
- *
- *		Failure:	1
+ *              Part 1 of a two-part H5Fflush() test.
+ *   
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
  * Programmer:	Robb Matzke
  *              Friday, October 23, 1998
  *
- * Modifications:
- * 		Leon Arber
- * 		Sept. 26, 2006, expand test to check for failure if H5Fflush is not called.
- * 		Oct. 4 2006, expand test to check for partial failure in case file is flushed, but then
- * 				new datasets are created after the flush.
- *
- *
  *-------------------------------------------------------------------------
  */
 int
 main(void)
 {
-    hid_t file, fapl;
-    char	name[1024];
+    char   *driver = NULL;      /* name of current VFD (from env var)       */
+    hbool_t vfd_supports_swmr;  /* whether the current VFD supports SWMR    */
+    hid_t   fid = -1;           /* file ID                                  */
+    hid_t   fapl_id = -1;       /* file access proplist ID                  */
+    char    filename[1024];     /* filename                                 */
+    hbool_t use_swmr;           /* whether or not to use SWMR I/O           */
 
     h5_reset();
-    fapl = h5_fileaccess();
+    if((fapl_id = h5_fileaccess()) < 0)
+        TEST_ERROR
+
+    /* Check if the current VFD supports SWMR */
+    driver = HDgetenv("HDF5_DRIVER");
+    vfd_supports_swmr = H5FD_supports_swmr_test(driver);
 
-    TESTING("H5Fflush (part1)");
+    /*************************************************/
+    /* NOTE: Not closing the file ID is intentional! */
+    /*************************************************/
 
-    /* Create the file */
-    h5_fixname(FILENAME[0], fapl, name, sizeof name);
-    file = create_file(name, fapl);
-    /* Flush and exit without closing the library */
-    if (H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
+    /* Create a file and flush */
+    TESTING("H5Fflush (part1 with flush)");
+    h5_fixname(FILENAME[0], fapl_id, filename, sizeof(filename));
+    use_swmr = FALSE;
+    if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+        TEST_ERROR
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        FAIL_STACK_ERROR
+    PASSED();
 
-    /* Create the file */
-    h5_fixname(FILENAME[2], fapl, name, sizeof name);
-    file = create_file(name, fapl);
-    /* Flush and exit without closing the library */
-    if(H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
-    /* Add a bit to the file and don't flush the new part */
-    extend_file(file);
+    /* Create a file and flush w/ SWMR I/O */
+    TESTING("H5Fflush (part1 with flush + SWMR)");
+    if(vfd_supports_swmr) {
+        h5_fixname(FILENAME[1], fapl_id, filename, sizeof(filename));
+        use_swmr = TRUE;
+        if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+            TEST_ERROR
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+            FAIL_STACK_ERROR
+        PASSED();
+    } /* end if */
+    else
+        SKIPPED();
 
-    /* Create the other file which will not be flushed */
-    h5_fixname(FILENAME[1], fapl, name, sizeof name);
-    file = create_file(name, fapl);
+    /* Create a file which will not be flushed */
+    TESTING("H5Fflush (part1 without flush)");
+    h5_fixname(FILENAME[2], fapl_id, filename, sizeof(filename));
+    use_swmr = FALSE;
+    if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+        TEST_ERROR
+    PASSED();
 
+    /* Create a file which will not be flushed w/ SWMR I/O */
+    TESTING("H5Fflush (part1 without flush + SWMR)");
+    if(vfd_supports_swmr) {
+        h5_fixname(FILENAME[3], fapl_id, filename, sizeof(filename));
+        use_swmr = TRUE;
+        if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+            TEST_ERROR
+        PASSED();
+    } /* end if */
+    else
+        SKIPPED();
 
+    /* Create a file, flush, add a dataset, flush */
+    TESTING("H5Fflush (part1 with flush and later addition and another flush)");
+    h5_fixname(FILENAME[4], fapl_id, filename, sizeof(filename));
+    use_swmr = FALSE;
+    if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+        TEST_ERROR
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        FAIL_STACK_ERROR
+    if(add_dset_to_file(fid, SECOND_DSET_NAME) < 0)
+        TEST_ERROR
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        FAIL_STACK_ERROR
     PASSED();
-    fflush(stdout);
-    fflush(stderr);
 
-    HD_exit(0);
+    /* Create a file, flush, add a dataset, flush w/ SWMR I/O */
+    TESTING("H5Fflush (part1 with flush and later addition and another flush + SWMR)");
+    if(vfd_supports_swmr) {
+        h5_fixname(FILENAME[5], fapl_id, filename, sizeof(filename));
+        use_swmr = TRUE;
+        if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+            TEST_ERROR
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+            FAIL_STACK_ERROR
+        if(add_dset_to_file(fid, SECOND_DSET_NAME) < 0)
+            TEST_ERROR
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+            FAIL_STACK_ERROR
+        PASSED();
+    } /* end if */
+    else
+        SKIPPED();
+
+    /* Create a file, flush, add a dataset, (no flush) */
+    TESTING("H5Fflush (part1 with flush and later addition)");
+    h5_fixname(FILENAME[6], fapl_id, filename, sizeof(filename));
+    use_swmr = FALSE;
+    if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+        TEST_ERROR
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        FAIL_STACK_ERROR
+    if(add_dset_to_file(fid, SECOND_DSET_NAME) < 0)
+        TEST_ERROR
+    PASSED();
+
+    /* Create a file, flush, add a dataset, (no flush) w/ SWMR I/O */
+    TESTING("H5Fflush (part1 with flush and later addition + SWMR)");
+    if(vfd_supports_swmr) {
+        h5_fixname(FILENAME[7], fapl_id, filename, sizeof(filename));
+        use_swmr = TRUE;
+        if((fid = create_file(filename, fapl_id, use_swmr)) < 0)
+            TEST_ERROR
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+            FAIL_STACK_ERROR
+        if(add_dset_to_file(fid, SECOND_DSET_NAME) < 0)
+            TEST_ERROR
+        PASSED();
+    } /* end if */
+    else
+        SKIPPED();
+
+    if(!vfd_supports_swmr)
+        HDprintf("NOTE: Some tests were skipped since the current VFD lacks SWMR support\n");
+
+    /* Flush console output streams */
+    HDfflush(stdout);
+    HDfflush(stderr);
+
+    /* DO NOT CLOSE FILE ID! */
+    if(H5Pclose(fapl_id) < 0)
+        STACK_ERROR
+
+    /* _exit() is necessary since we want a hard close of the library */
+    HD_exit(EXIT_SUCCESS);
 
 error:
-    HD_exit(1);
-    return 1;
-}
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl_id);
+    } H5E_END_TRY;
+
+    HDexit(EXIT_FAILURE);
+} /* end main() */
+
diff --git a/test/flush2.c b/test/flush2.c
index ddb1c59..9fdf6c1 100644
--- a/test/flush2.c
+++ b/test/flush2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -24,6 +22,11 @@
  */
 #include "h5test.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             */
+
 /* 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"
@@ -31,270 +34,408 @@
 
 const char *FILENAME[] = {
     "flush",
+    "flush-swmr",
     "noflush",
+    "noflush-swmr",
+    "flush_extend",
+    "flush_extend-swmr",
     "noflush_extend",
+    "noflush_extend-swmr",
     NULL
 };
 
-static double	the_data[100][100];
+/* Number and size of dataset dims, chunk size, etc. */
+#define NELEMENTS   10000
+#define FIRST_DSET_NAME     "dset1"
+#define SECOND_DSET_NAME    "dset2"
+
+/* Number of sub-groups created in the containing group */
+#define NGROUPS     100
+
+static hbool_t dset_ok(hid_t fid, const char *dset_name);
+static hbool_t file_ok(const char *filename, hid_t fapl_id, hbool_t check_second_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.
+ * Function:    dset_ok
  *
- * Return:	Success:	0
+ * Purpose:     Checks if the data in a dataset is what it is supposed to be.
  *
- *		Failure:	1
+ * Return:      TRUE/FALSE
  *
  * Programmer:	Leon Arber
  *              Oct. 4, 2006.
  *
  *-------------------------------------------------------------------------
  */
-static int
-check_dset(hid_t file, const char* name)
+static hbool_t
+dset_ok(hid_t fid, const char *dset_name)
 {
-    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;
-    if((space = H5Dget_space(dset)) < 0) goto error;
-    if(H5Sget_simple_extent_dims(space, ds_size, NULL) < 0) goto error;
-    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;
-    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;
-	    }
-	}
-    if(H5Dclose(dset) < 0) goto error;
-    return 0;
+    hid_t   sid = -1;               /* dataspace ID                     */
+    hid_t   did = -1;               /* dataset ID                       */
+    int    *data = NULL;            /* data buffer                      */
+    hsize_t dims[1] = {0};          /* size of dataset                  */
+    int     i;                      /* iterator                         */
+
+    /* Open the dataset and check size */
+    if((did = H5Dopen2(fid, dset_name, H5P_DEFAULT)) < 0)
+        goto error;
+    if((sid = H5Dget_space(did)) < 0)
+        goto error;
+    if(H5Sget_simple_extent_dims(sid, dims, NULL) < 0)
+        goto error;
+    if(dims[0] != NELEMENTS)
+        goto error;
+
+    /* Read the data */
+    if(NULL == (data = (int *)HDcalloc((size_t)NELEMENTS, sizeof(int))))
+        goto error;
+    if(H5Dread(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data) < 0)
+        goto error;
+    for(i = 0; i < NELEMENTS; i++)
+        if(i != data[i])
+            goto error;
+
+    if(H5Sclose(sid) < 0)
+        goto error;
+    if(H5Dclose(did) < 0)
+        goto error;
+
+    HDfree(data);
+
+    return TRUE;
 
 error:
-    return 1;
-}
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Dclose(did);
+    } H5E_END_TRY;
+
+    HDfree(data);
+
+    return FALSE;
+} /* end dset_ok() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	check_file
- *
- * Purpose:	Part 2 of a two-part H5Fflush() test.
+ * Function:    file_ok
  *
- * Return:	Success:	0
+ * Purpose:     Checks that the contents of a file are what they should be.
  *
- *		Failure:	1
+ * Return:      TRUE/FALSE
  *
  * Programmer:	Leon Arber
  *              Sept. 26, 2006.
  *
  *-------------------------------------------------------------------------
  */
-static int
-check_file(char* filename, hid_t fapl, int flag)
+static hbool_t
+file_ok(const char *filename, hid_t fapl_id, hbool_t check_second_dset)
 {
-    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;
-
-    /* Open some groups */
-    if((groups = H5Gopen2(file, "some_groups", H5P_DEFAULT)) < 0) goto error;
-    for(i = 0; i < 100; i++) {
-        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 */
+    hid_t   fid = -1;               /* file ID                          */
+    hid_t   top_gid = -1;           /* containing group ID              */
+    hid_t   gid = -1;               /* subgroup ID                      */
+    char    group_name[16];         /* group name                       */
+    int     i;                      /* iterator                         */
+
+    /* open file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl_id)) < 0)
+        goto error;
 
-    /* Check to see if that last added dataset in the third file is accessible
-     * (it shouldn't be...but it might.  Flag an error in case it is for now */
-    if(flag && check_dset(file, "dset2")) goto error;
+    /* check datasets */
+    if(!dset_ok(fid, FIRST_DSET_NAME))
+        goto error;
+    if(check_second_dset)
+        if(!dset_ok(fid, SECOND_DSET_NAME))
+            goto error;
 
-    if(H5Gclose(groups) < 0) goto error;
-    if(H5Fclose(file) < 0) goto error;
+    /* check groups */
+    if((top_gid = H5Gopen2(fid, "top_group", H5P_DEFAULT)) < 0)
+        goto error;
+    for(i = 0; i < NGROUPS; i++) {
+        HDsprintf(group_name, "group%02d", i);
+        if((gid = H5Gopen2(top_gid, group_name, H5P_DEFAULT)) < 0)
+            goto error;
+        if(H5Gclose(gid) < 0)
+            goto error;
+    } /* end for */
 
-    return 0;
+    if(H5Gclose(top_gid) < 0)
+        goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+
+    return TRUE;
 
 error:
     H5E_BEGIN_TRY {
-        H5Gclose(groups);
-        H5Fclose(file);
+        H5Gclose(top_gid);
+        H5Gclose(gid);
+        H5Fclose(fid);
     } H5E_END_TRY;
 
-    return 1;
-} /* end check_file() */
+    return FALSE;
+} /* end file_ok() */
 
 /*-------------------------------------------------------------------------
- * Function:	clear_status_flags
+ * Function:    clear_status_flags
  *
- * Purpose:	To clear the status_flags in the superblock of the file.
- * 		It is smilar to the tool "h5clear".
+ * Purpose:     Clears the status_flags in the superblock of the file.
+ *              It is smilar to the tool "h5clear".
  *
- * Return:	Success:	0
- *		Failure:	1
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Vailin Choi
+ * Programmer:  Vailin Choi
  *              July 2013
  *
  *-------------------------------------------------------------------------
  */
-static int
-clear_status_flags(char *name, hid_t fapl)
+static herr_t
+clear_status_flags(const char *filename, hid_t fapl_id)
 {
-    hid_t new_fapl = -1;
-    hid_t fid = -1;
+    hid_t   new_fapl_id = -1;       /* copy of the file access plist ID */
+    hid_t   fid = -1;               /* file ID                          */
     hbool_t clear = TRUE;
 
     /* Get a copy of fapl */
-    if((new_fapl = H5Pcopy(fapl)) < 0)
-	FAIL_STACK_ERROR;
+    if((new_fapl_id = H5Pcopy(fapl_id)) < 0)
+        goto error;
 
     /* Set this private property */
-    if(H5Pset(new_fapl, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0)
-	FAIL_STACK_ERROR;
+    if(H5Pset(new_fapl_id, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0)
+        goto error;
 
     /* Has to open rw */
-    if((fid = H5Fopen(name, H5F_ACC_RDWR, new_fapl)) < 0)
-	FAIL_STACK_ERROR;
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, new_fapl_id)) < 0)
+        goto error;
+
+    /* CLose the property list */
+    if(H5Pclose(new_fapl_id) < 0)
+        goto error;
 
     /* Close the file */
     if(H5Fclose(fid) < 0)
-	FAIL_STACK_ERROR;
-
-    /* CLose the property list */
-    if(H5Pclose(new_fapl) < 0)
-	FAIL_STACK_ERROR;
+        goto error;
 
-    return 0;
+    return SUCCEED;
 
 error:
-    return 1;
-} /* clear_status_flags() */
+    H5E_BEGIN_TRY {
+        H5Pclose(new_fapl_id);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return FAIL;
+} /* end clear_status_flags() */
 
 

 /*-------------------------------------------------------------------------
  * Function:	main
  *
- * Purpose:	Part 2 of a two-part H5Fflush() test.
- *
- * Return:	Success:	0
+ * Purpose:     Confirms file contents in a variety of flush scenarios.
+ *              Part 2 of a two-part H5Fflush() test.
  *
- *		Failure:	1
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
  * Programmer:	Robb Matzke
  *              Friday, October 23, 1998
  *
- * Modifications:
- * 		Leon Arber
- * 		Sept. 26, 2006, expand to check for case where the was file not flushed.
- *
  *-------------------------------------------------------------------------
  */
 int
 main(void)
 {
-    hid_t fapl;
-    H5E_auto2_t func;
-    char	name[1024];
+    char   *driver = NULL;      /* name of current VFD (from env var)       */
+    hbool_t vfd_supports_swmr;  /* whether the current VFD supports SWMR    */
+    hid_t   fapl_id = -1;       /* file access proplist ID                  */
+    char    filename[1024];     /* filename                                 */
+    hbool_t check_second_dset;  /* whether or not to check the second dset  */
+    H5E_auto2_t func;           /* for shutting off error reporting         */
 
     h5_reset();
-    fapl = h5_fileaccess();
-    TESTING("H5Fflush (part2 with flush)");
+    if((fapl_id = h5_fileaccess()) < 0)
+        PUTS_ERROR("bad vfd-dependent fapl")
 
-    /* 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;
-    }
+    /* Check if the current VFD supports SWMR */
+    driver = HDgetenv("HDF5_DRIVER");
+    vfd_supports_swmr = H5FD_supports_swmr_test(driver);
 
-    if(check_file(name, fapl, FALSE)) {
-        H5_FAILED()
-        goto error;
-    }
+    /* TEST 1 */
+    /* Check the case where the file was flushed */
+    TESTING("H5Fflush (part2 with flush)");
+    h5_fixname(FILENAME[0], fapl_id, filename, sizeof(filename));
+    check_second_dset = FALSE;
+    if(file_ok(filename, fapl_id, check_second_dset))
+        PASSED()
     else
-        PASSED();
-
+        TEST_ERROR
+
+    /* TEST 2 */
+    /* Check the case where the file was flushed (w/SWMR) */
+    TESTING("H5Fflush (part2 with flush + SWMR)");
+    if(vfd_supports_swmr) {
+        h5_fixname(FILENAME[1], fapl_id, filename, sizeof(filename));
+        check_second_dset = FALSE;
+        if(clear_status_flags(filename, fapl_id) < 0)
+            TEST_ERROR
+        if(file_ok(filename, fapl_id, check_second_dset))
+            PASSED()
+        else
+            TEST_ERROR
+    } /* end if */
+    else
+        SKIPPED()
 
-    /* Check the case where the file was not flushed.  This should give an error
-     * so we turn off the error stack temporarily */
+    /* TEST 3 */
+    /* Check the case where the file was not flushed */
     TESTING("H5Fflush (part2 without flush)");
-    H5Eget_auto2(H5E_DEFAULT,&func,NULL);
-    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 {
+    /* Turn the error stack off (failures expected) */
+    if(H5Eget_auto2(H5E_DEFAULT, &func, NULL) < 0)
+        FAIL_STACK_ERROR
+    if(H5Eset_auto2(H5E_DEFAULT, NULL, NULL) < 0)
+        FAIL_STACK_ERROR
+    h5_fixname(FILENAME[2], fapl_id, filename, sizeof(filename));
+    check_second_dset = FALSE;
+    if(file_ok(filename, fapl_id, check_second_dset)) {
 #if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
         SKIPPED();
-        puts("   DLL will flush the file even when calling _exit, skip this test temporarily");
+        HDputs("   the DLL will flush the file even when calling _exit, skip this test temporarily");
 #else
-        H5_FAILED()
-        goto error;
+        TEST_ERROR
 #endif
-    }
-    H5Eset_auto2(H5E_DEFAULT, func, NULL);
+    } /* end if */
+    else
+        PASSED()
+    /* Turn the error stack back on */
+    if(H5Eset_auto2(H5E_DEFAULT, func, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* TEST 4 */
+    /* Check the case where the file was not flushed (w/SWMR) */
+    TESTING("H5Fflush (part2 without flush + SWMR)");
+    if(vfd_supports_swmr) {
+        /* Turn the error stack off (failures expected) */
+        if(H5Eget_auto2(H5E_DEFAULT, &func, NULL) < 0)
+            FAIL_STACK_ERROR
+        if(H5Eset_auto2(H5E_DEFAULT, NULL, NULL) < 0)
+            FAIL_STACK_ERROR
+        h5_fixname(FILENAME[3], fapl_id, filename, sizeof(filename));
+        check_second_dset = FALSE;
+        if(clear_status_flags(filename, fapl_id) < 0)
+            TEST_ERROR
+        if(file_ok(filename, fapl_id, check_second_dset)) {
+#if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
+            SKIPPED();
+            HDputs("   the DLL will flush the file even when calling _exit, skip this test temporarily");
+#else
+            TEST_ERROR
+#endif
+        } /* end if */
+        else
+            PASSED()
+        /* Turn the error stack back on */
+        if(H5Eset_auto2(H5E_DEFAULT, func, NULL) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+    else
+        SKIPPED()
+
+    /* TEST 5 */
+    /* Check the case where the file was flushed, but more data was
+     * added afterward and then flushed
+     */
+    TESTING("H5Fflush (part2 with flush and later addition and another flush)");
+    check_second_dset = TRUE;
+    h5_fixname(FILENAME[4], fapl_id, filename, sizeof(filename));
+    if(file_ok(filename, fapl_id, check_second_dset))
+        PASSED()
+    else
+        TEST_ERROR
+
+    /* TEST 6 */
+    /* Check the case where the file was flushed, but more data was
+     * added afterward and then flushed (w/SWMR) 
+     */
+    TESTING("H5Fflush (part2 with flush and later addition and another flush + SWMR)");
+    if(vfd_supports_swmr) {
+        check_second_dset = TRUE;
+        h5_fixname(FILENAME[5], fapl_id, filename, sizeof(filename));
+        if(clear_status_flags(filename, fapl_id) < 0)
+            TEST_ERROR
+        if(file_ok(filename, fapl_id, check_second_dset))
+            PASSED()
+        else
+            TEST_ERROR
+    } /* end if */
+    else
+        SKIPPED()
 
-    /* Check the case where the file was flushed, but more data was added afterward.  This should give an error
-     * so we turn off the error stack temporarily */
+    /* TEST 7 */
+    /* Check the case where the file was flushed, but more data was added
+     * afterward and not flushed.
+     */
     TESTING("H5Fflush (part2 with flush and later addition)");
-    H5Eget_auto2(H5E_DEFAULT,&func,NULL);
-    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))
+    /* Turn the error stack off (failures expected) */
+    if(H5Eget_auto2(H5E_DEFAULT, &func, NULL) < 0)
+        FAIL_STACK_ERROR
+    if(H5Eset_auto2(H5E_DEFAULT, NULL, NULL) < 0)
+        FAIL_STACK_ERROR
+    h5_fixname(FILENAME[6], fapl_id, filename, sizeof(filename));
+    check_second_dset = TRUE;
+    if(file_ok(filename, fapl_id, check_second_dset)) {
+#if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
+        SKIPPED()
+        HDputs("   the DLL will flush the file even when calling _exit, skip this test temporarily");
+#else
+        TEST_ERROR
+#endif
+    } /* end if */
+    else
         PASSED()
-    else {
+    /* Turn the error stack back on */
+    if(H5Eset_auto2(H5E_DEFAULT, func, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* TEST 8 */
+    /* Check the case where the file was flushed, but more data was added
+     * afterward and not flushed (w/ SWMR).
+     */
+    TESTING("H5Fflush (part2 with flush and later addition + SWMR)");
+    if(vfd_supports_swmr) {
+        /* Turn the error stack off (failures expected) */
+        if(H5Eget_auto2(H5E_DEFAULT, &func, NULL) < 0)
+            FAIL_STACK_ERROR
+        if(H5Eset_auto2(H5E_DEFAULT, NULL, NULL) < 0)
+            FAIL_STACK_ERROR
+        h5_fixname(FILENAME[7], fapl_id, filename, sizeof(filename));
+        check_second_dset = TRUE;
+        if(clear_status_flags(filename, fapl_id) < 0)
+            TEST_ERROR
+        if(file_ok(filename, fapl_id, check_second_dset)) {
 #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();
+            HDputs("   the DLL will flush the file even when calling _exit, skip this test temporarily");
 #else
-        H5_FAILED()
-        goto error;
+            TEST_ERROR
 #endif
-    }
+        } /* end if */
+        else
+            PASSED();
+        /* Turn the error stack back on */
+        if(H5Eset_auto2(H5E_DEFAULT, func, NULL) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+    else
+        SKIPPED()
 
-    H5Eset_auto2(H5E_DEFAULT, func, NULL);
+    if(!vfd_supports_swmr)
+        HDprintf("NOTE: Some tests were skipped since the current VFD lacks SWMR support\n");
 
-    h5_cleanup(FILENAME, fapl);
+    h5_cleanup(FILENAME, fapl_id);
 
-    return 0;
+    HDexit(EXIT_SUCCESS);
 
 error:
-    return 1;
-}
+    HDexit(EXIT_FAILURE);
+} /* end main() */
 
diff --git a/test/flushrefresh.c b/test/flushrefresh.c
index 0fc6e2f..f35ed5e 100644
--- a/test/flushrefresh.c
+++ b/test/flushrefresh.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of 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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 
 /*
  * Programmer: Mike McGreevy
@@ -24,11 +22,15 @@
  *
  */
 
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+
 /* ======== */
 /* Includes */
 /* ======== */
 
 #include "testhdf5.h"
+#include "H5FDpkg.h"		/* File Drivers				*/
 
 /* ======= */
 /* Defines */
@@ -43,9 +45,6 @@
 #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"
@@ -70,7 +69,8 @@
 FILE * errorfile;
 #define ERRFILE "flushrefresh_ERROR"
 #define PROCESS_ERROR                                            \
-    { errorfile = fopen(ERRFILE, "w+");                          \
+    {                                                            \
+      errorfile = HDfopen(ERRFILE, "w+");                        \
       HDfprintf(errorfile, "Error occurred in flushrefresh.\n"); \
       HDfflush(errorfile);                                       \
       HDfclose(errorfile);                                       \
@@ -108,8 +108,6 @@ 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 */
@@ -136,8 +134,6 @@ void send_signal(const char * send, const char * arg1, const char * arg2);
  * Programmer:  Mike McGreevy
  *              July 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int main(int argc, const char *argv[]) 
@@ -150,62 +146,42 @@ int main(int argc, const char *argv[])
         TEST_ERROR;
 
     /* Parse command line options */
-    if (argc == 1) {
-
+    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;
 
+        if(envval == NULL || H5FD_supports_swmr_test(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");
+            HDfprintf(stdout, "Skipping all flush/refresh tests (only run with SWMR-enabled 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;
-
+            if(end_verification() < 0) TEST_ERROR;
+            if(end_verification() < 0) TEST_ERROR;
         } /* end else */
-
-    } else if (argc == 3) {
-
+    } 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) {
-
+        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;
-    
+        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 */
 
 

@@ -220,8 +196,6 @@ error:
  * Programmer:  Mike McGreevy
  *              July 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t test_flush(void) 
@@ -293,43 +267,43 @@ herr_t test_flush(void)
     /* ================ */
 
     /* 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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    if((status = H5Tcommit2(gid3, "CommittedDatatype3", tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
 
     /* ============ */
     /* FLUSH GROUPS */
@@ -339,57 +313,57 @@ herr_t test_flush(void)
     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;
+    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;
+    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;
+    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;
+    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();
 
@@ -401,30 +375,30 @@ herr_t test_flush(void)
     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;
+    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;
+    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();
 
@@ -436,30 +410,30 @@ herr_t test_flush(void)
     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;
+    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;
+    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();
     
@@ -471,67 +445,66 @@ herr_t test_flush(void)
     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;
+    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;
+    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;
+    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;
+    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;
+    if(end_verification() < 0) TEST_ERROR;
 
     return SUCCEED;
 
 error:
     return FAIL;
-
 } /* end test_flush */
 
 

@@ -546,8 +519,6 @@ error:
  * Programmer:  Mike McGreevy
  *              August 17, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t test_refresh(void) 
@@ -623,70 +594,48 @@ herr_t test_refresh(void)
     /* ================ */
 
     /* 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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    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;
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0) TEST_ERROR;
 
     /* ================ */
     /* Refresh Datasets */
@@ -694,15 +643,25 @@ herr_t test_refresh(void)
 
     TESTING("to ensure that H5Drefresh correctly refreshes single datasets");
 
+    /* Create an attribute on each object before flush. */
+
     /* 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;
+    if(start_refresh_verification_process(D1) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(did, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 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;
+    if(start_refresh_verification_process(D2) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(did2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 0) TEST_ERROR;
+    if(H5Oflush(did2) < 0) TEST_ERROR;
+
+    if(end_refresh_verification_process() != 0) TEST_ERROR;
 
     PASSED();
 
@@ -713,14 +672,22 @@ herr_t test_refresh(void)
     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;
+    if(start_refresh_verification_process(G1) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(gid, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 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;
+    if(start_refresh_verification_process(G2) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(gid2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 0) TEST_ERROR;
+    if(H5Oflush(gid2) < 0) TEST_ERROR;
+
+    if(end_refresh_verification_process() != 0) TEST_ERROR;
 
     PASSED();
 
@@ -731,14 +698,22 @@ herr_t test_refresh(void)
     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;
+    if(start_refresh_verification_process(T1) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(tid1, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 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;
+    if(start_refresh_verification_process(T2) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(tid2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 0) TEST_ERROR;
+    if(H5Oflush(tid2) < 0) TEST_ERROR;
+
+    if(end_refresh_verification_process() != 0) TEST_ERROR;
 
     PASSED();
 
@@ -749,19 +724,31 @@ herr_t test_refresh(void)
     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;
+    if(start_refresh_verification_process(D3) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(did3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 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;
+    if(start_refresh_verification_process(G3) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(gid3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 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;
+    if(start_refresh_verification_process(T3) != 0) TEST_ERROR;
+
+    if((aid = H5Acreate2(tid3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if(H5Aclose(aid) < 0) TEST_ERROR;
+    if(H5Oflush(tid3) < 0) TEST_ERROR;
+
+    if(end_refresh_verification_process() != 0) TEST_ERROR;
 
     PASSED();
 
@@ -770,31 +757,30 @@ herr_t test_refresh(void)
     /* ================== */
 
     /* 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;
+    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;
+    if(end_verification() < 0) TEST_ERROR;
 
     return SUCCEED;
 
 error:
     /* Return */
     return FAIL;
-
 } /* test_refresh() */
 
 

@@ -810,27 +796,26 @@ error:
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t run_flush_verification_process(const char * obj_pathname, const char * expected) 
 {
+    HDremove(SIGNAL_FROM_SCRIPT);
+
     /* Send Signal to SCRIPT indicating that it should kick off a verification process. */
-    send_signal(SIGNAL_TO_SCRIPT, obj_pathname, expected);
+    h5_send_message(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;
+    if(h5_wait_message(SIGNAL_FROM_SCRIPT) < 0) TEST_ERROR;
 
     /* Check to see if any errors occurred */
-    if (check_for_errors() < 0) TEST_ERROR;
+    if(check_for_errors() < 0) TEST_ERROR;
 
     /* Return */
     return SUCCEED;
 
 error:
     return FAIL;
-
 } /* run_flush_verification_process */
 
 

@@ -849,8 +834,6 @@ error:
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t flush_verification(const char * obj_pathname, const char * expected) 
@@ -868,13 +851,13 @@ herr_t flush_verification(const char * obj_pathname, const char * expected)
     } H5E_END_TRY;
 
     /* Compare to expected result */
-    if (strcmp(expected, FLUSHED) == 0) {
-        if ((oid < 0) || (status < 0)) {
+    if(HDstrcmp(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)) {
+    } else if(HDstrcmp(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 */
@@ -893,7 +876,6 @@ herr_t flush_verification(const char * obj_pathname, const char * expected)
 
 error:
     return FAIL;
-
 } /* flush_verification */
 
 

@@ -909,29 +891,28 @@ error:
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t start_refresh_verification_process(const char * obj_pathname) 
 {
+    HDremove(SIGNAL_BETWEEN_PROCESSES_1);
+
     /* Send Signal to SCRIPT indicating that it should kick off a refresh 
        verification process */
-    send_signal(SIGNAL_TO_SCRIPT, obj_pathname, NULL);
+    h5_send_message(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;
+    if(h5_wait_message(SIGNAL_BETWEEN_PROCESSES_1) < 0) TEST_ERROR;
 
     /* Check to see if any errors occurred */
-    if (check_for_errors() < 0) TEST_ERROR;
+    if(check_for_errors() < 0) TEST_ERROR;
 
     /* Return */
     return SUCCEED;
 
 error:
     return FAIL;
-
 } /* start_refresh_verification_process */
 
 

@@ -948,31 +929,29 @@ error:
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t end_refresh_verification_process(void) 
-{
+{ 
+    HDremove(SIGNAL_FROM_SCRIPT);
+
     /* 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);
+    h5_send_message(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;
+    if(h5_wait_message(SIGNAL_FROM_SCRIPT) < 0) TEST_ERROR;
 
     /* Check to see if any errors occurred */
-    if (check_for_errors() < 0) TEST_ERROR;
+    if(check_for_errors() < 0) TEST_ERROR;
 
     /* Return */
-
     return SUCCEED;
 
 error:
     return FAIL;
-
 } /* end_refresh_verification_process */
 
 

@@ -991,8 +970,6 @@ error:
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t refresh_verification(const char * obj_pathname) 
@@ -1001,95 +978,112 @@ herr_t refresh_verification(const char * obj_pathname)
     hid_t oid,fid,status = 0;
     H5O_info_t flushed_oinfo;
     H5O_info_t refreshed_oinfo;
+    int tries = 800, sleep_tries = 400;
+    hbool_t ok = FALSE;
     
+    HDremove(SIGNAL_BETWEEN_PROCESSES_2);
+
     /* 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;
+    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;
+    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;
+    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);
+    h5_send_message(SIGNAL_BETWEEN_PROCESSES_1, obj_pathname, 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;
+    if(h5_wait_message(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;
+    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;
+    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;
+    do {
+
+	if((HDstrcmp(obj_pathname, D1) == 0) || (HDstrcmp(obj_pathname, D2) == 0)) {
+	    if(H5Drefresh(oid) < 0) PROCESS_ERROR;
+	} /* end if */
+	else if((HDstrcmp(obj_pathname, G1) == 0) || (HDstrcmp(obj_pathname, G2) == 0)) {
+	    if(H5Grefresh(oid) < 0) PROCESS_ERROR;
+	} /* end if */
+	else if((HDstrcmp(obj_pathname, T1) == 0) || (HDstrcmp(obj_pathname, T2) == 0)) {
+	    if(H5Trefresh(oid) < 0) PROCESS_ERROR;
+	} /* end if */
+	else if((HDstrcmp(obj_pathname, D3) == 0) || (HDstrcmp(obj_pathname, G3) == 0) ||
+                (HDstrcmp(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 (first 4) attributes are the same: */
+	/* Confirm following (last 4) attributes are different */
+	if( (flushed_oinfo.addr == refreshed_oinfo.addr) &&
+	    (flushed_oinfo.type == refreshed_oinfo.type) &&
+	    (flushed_oinfo.hdr.version == refreshed_oinfo.hdr.version) &&
+	    (flushed_oinfo.hdr.flags == refreshed_oinfo.hdr.flags) &&
+	    (flushed_oinfo.num_attrs != refreshed_oinfo.num_attrs) &&
+	    (flushed_oinfo.hdr.nmesgs != refreshed_oinfo.hdr.nmesgs) &&
+	    (flushed_oinfo.hdr.nchunks != refreshed_oinfo.hdr.nchunks) &&
+	    (flushed_oinfo.hdr.space.total != refreshed_oinfo.hdr.space.total) ) {
+		ok = TRUE;
+		break;
+	}
+	if(tries == sleep_tries)
+	    HDsleep(1);
+
+    } while(--tries);
+    
+    if(!ok) {
+	printf("FLUSHED: num_attrs=%d, nmesgs=%d, nchunks=%d, total=%d\n",
+	    (int)flushed_oinfo.num_attrs, (int)flushed_oinfo.hdr.nmesgs,
+	    (int)flushed_oinfo.hdr.nchunks, (int)flushed_oinfo.hdr.space.total);
+	printf("REFRESHED: num_attrs=%d, nmesgs=%d, nchunks=%d, total=%d\n",
+	    (int)refreshed_oinfo.num_attrs, (int)refreshed_oinfo.hdr.nmesgs,
+	    (int)refreshed_oinfo.hdr.nchunks, (int)refreshed_oinfo.hdr.space.total);
+	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;
+    if(H5Oclose(oid) < 0) PROCESS_ERROR;
+    if(H5Fclose(fid) < 0) PROCESS_ERROR;
 
     /* Return */
     return SUCCEED;
 
 error:
-
     return FAIL;
-
 } /* refresh_verification */
 
 

@@ -1108,23 +1102,19 @@ error:
  * Programmer:  Mike McGreevy
  *              July 1, 2010
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t check_for_errors(void) 
 {
     FILE * file;
 
-    if ((file = fopen(ERRFILE, "r")))
-    {
+    if((file = HDfopen(ERRFILE, "r"))) {
         HDfclose(file);
         HDremove(ERRFILE);
         return FAIL;
-    }
+    } /* end if */
 
     return SUCCEED;
-
 } /* check_for_errors */
 
 

@@ -1139,141 +1129,21 @@ herr_t check_for_errors(void)
  * Programmer:  Mike McGreevy
  *              July 16, 2010
  * 
- * Modifications:
- * 
  *-------------------------------------------------------------------------
  */
 herr_t end_verification(void) 
 {
+    HDremove(SIGNAL_FROM_SCRIPT);
+
     /* Send Signal to SCRIPT to indicate that we're done with verification. */
-    send_signal(SIGNAL_TO_SCRIPT, "VERIFICATION_DONE", "VERIFICATION_DONE");
+    h5_send_message(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;
+    if(h5_wait_message(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 2023724..39c5688 100644
--- a/test/freespace.c
+++ b/test/freespace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
  * Tests for free-space manager
@@ -86,7 +84,7 @@ typedef struct TEST_free_section_t {
 static herr_t TEST_sect_init_cls(H5FS_section_class_t *, void *);
 static herr_t TEST_sect_free(H5FS_section_info_t *_sect);
 static herr_t TEST_sect_can_merge(const H5FS_section_info_t *, const H5FS_section_info_t *, void H5_ATTR_UNUSED *);
-static herr_t TEST_sect_merging(H5FS_section_info_t *, H5FS_section_info_t *, void H5_ATTR_UNUSED *);
+static herr_t TEST_sect_merging(H5FS_section_info_t **, H5FS_section_info_t *, void H5_ATTR_UNUSED *);
 static herr_t TEST_sect_can_shrink(const H5FS_section_info_t *, void *);
 static herr_t TEST_sect_shrinking(H5FS_section_info_t **, void *);
 
@@ -214,14 +212,14 @@ TEST_sect_init_cls(H5FS_section_class_t *cls, void *_udata)
     init_flags = (unsigned *)_udata;
     cls->flags |= *init_flags;
 
-    return(ret_value);
+    return ret_value;
 } /* TEST_sect_init_cls() */
 
 /*
  * Check if the two sections can be merged:
  * 	true if second section adjoins the first section
  */
-static herr_t
+H5_ATTR_PURE static herr_t
 TEST_sect_can_merge(const H5FS_section_info_t *_sect1,
     const H5FS_section_info_t *_sect2, void H5_ATTR_UNUSED *_udata)
 {
@@ -238,39 +236,39 @@ TEST_sect_can_merge(const H5FS_section_info_t *_sect1,
     /* Check if second section adjoins first section */
     ret_value = H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr);
 
-    return(ret_value);
+    return ret_value;
 } /* TEST_sect_can_merge() */
 
 /*
  * Merge the two sections (second section is merged into the first section)
  */
 static herr_t
-TEST_sect_merging(H5FS_section_info_t *_sect1, H5FS_section_info_t *_sect2,
+TEST_sect_merging(H5FS_section_info_t **_sect1, H5FS_section_info_t *_sect2,
     void H5_ATTR_UNUSED *_udata)
 {
-    TEST_free_section_t *sect1 = (TEST_free_section_t *)_sect1;
+    TEST_free_section_t **sect1 = (TEST_free_section_t **)_sect1;
     TEST_free_section_t *sect2 = (TEST_free_section_t *)_sect2;
     herr_t ret_value = SUCCEED;         /* Return value */
 
     /* Check arguments. */
     HDassert(sect1);
-    HDassert((sect1->sect_info.type == TEST_FSPACE_SECT_TYPE) ||
-	     (sect1->sect_info.type == TEST_FSPACE_SECT_TYPE_NEW) ||
-	     (sect1->sect_info.type == TEST_FSPACE_SECT_TYPE_NONE));
+    HDassert(((*sect1)->sect_info.type == TEST_FSPACE_SECT_TYPE) ||
+	     ((*sect1)->sect_info.type == TEST_FSPACE_SECT_TYPE_NEW) ||
+	     ((*sect1)->sect_info.type == TEST_FSPACE_SECT_TYPE_NONE));
     HDassert(sect2);
     HDassert((sect2->sect_info.type == TEST_FSPACE_SECT_TYPE) ||
 	     (sect2->sect_info.type == TEST_FSPACE_SECT_TYPE_NEW) ||
 	     (sect2->sect_info.type == TEST_FSPACE_SECT_TYPE_NONE));
-    HDassert(H5F_addr_eq(sect1->sect_info.addr + sect1->sect_info.size, sect2->sect_info.addr));
+    HDassert(H5F_addr_eq((*sect1)->sect_info.addr + (*sect1)->sect_info.size, sect2->sect_info.addr));
 
     /* Add second section's size to first section */
-    sect1->sect_info.size += sect2->sect_info.size;
+    (*sect1)->sect_info.size += sect2->sect_info.size;
 
     /* Get rid of second section */
     if(TEST_sect_free((H5FS_section_info_t *)sect2) < 0)
-	TEST_ERROR
+        TEST_ERROR
 error:
-    return(ret_value);
+    return ret_value;
 } /* TEST_sect_merging() */
 
 /*
@@ -282,7 +280,7 @@ TEST_sect_free(H5FS_section_info_t *sect)
     /* Release the section */
     HDfree(sect);
 
-    return(0);
+    return 0;
 } /* TEST_sect_free() */
 
 /*
@@ -299,18 +297,18 @@ TEST_sect_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
     const TEST_free_section_t *sect = (const TEST_free_section_t *)_sect;
     haddr_t	end, eoa;
 
-    if (can_shrink == NULL)
-	return(FALSE);
+    if(can_shrink == NULL)
+        return FALSE;
 
     end = sect->sect_info.addr + sect->sect_info.size;
     eoa = TEST_get_eoa();
 
     if (end == eoa)
-	*can_shrink = TRUE;
+        *can_shrink = TRUE;
     else
-	*can_shrink = FALSE;
+        *can_shrink = FALSE;
 
-    return((htri_t)*can_shrink);
+    return (htri_t)*can_shrink;
 } /* TEST_sect_can_shrink() */
 
 /*
@@ -325,14 +323,14 @@ TEST_sect_shrinking(H5FS_section_info_t **_sect, void *_udata)
     /* address of the section is faked, so, doesn't need to do anything */
     /* just free the section node */
     if (*can_shrink) {
-	if (TEST_sect_free((H5FS_section_info_t *)*sect) < 0)
-	    TEST_ERROR
-	*sect = NULL;
-	return(TRUE);
-    }
+        if (TEST_sect_free((H5FS_section_info_t *)*sect) < 0)
+            TEST_ERROR
+        *sect = NULL;
+        return TRUE;
+    } /* end if */
 
 error:
-    return(FALSE);
+    return FALSE;
 }
 
 
@@ -359,7 +357,7 @@ TEST_sects_cb(H5FS_section_info_t *_sect, void *_udata)
 static haddr_t
 TEST_get_eoa(void)
 {
-    return(g_eoa);
+    return g_eoa;
 }
 
 /* supporting routine for shrinking */
@@ -431,10 +429,10 @@ check_stats(const H5F_t *f, const H5FS_t *frsp, frspace_state_t *state)
     } /* end if */
 
     /* All tests passed */
-    return(0);
+    return 0;
 
 error:
-    return(1);
+    return 1;
 } /* check_stats() */
 
 /*
@@ -448,6 +446,7 @@ static unsigned
 test_fs_create(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
@@ -455,7 +454,7 @@ test_fs_create(hid_t fapl)
     h5_stat_size_t      file_size, empty_size;  /* File size */
     frspace_state_t 	state;          	/* State of free space*/
     H5FS_create_t 	cparam, test_cparam; 	/* creation parameters */
-    size_t		nclasses;
+    uint16_t		nclasses;
     unsigned		init_flags=0;
 
     TESTING("the creation/close/reopen/deletion of the free-space manager");
@@ -487,14 +486,20 @@ test_fs_create(hid_t fapl)
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
     if (frsp->nclasses != nclasses)
-	TEST_ERROR
+        TEST_ERROR
 
     HDmemset(&state, 0, sizeof(frspace_state_t));
     if(check_stats(f, frsp, &state))
@@ -507,27 +512,27 @@ test_fs_create(hid_t fapl)
         FAIL_STACK_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
         FAIL_STACK_ERROR
     frsp = NULL;
 
     /* reopen the free-space manager */
-    if(NULL == (frsp = H5FS_open(f, H5AC_ind_read_dxpl_id, fs_addr,
+    if(NULL == (frsp = H5FS_open(f, dxpl_id, fs_addr,
 			nclasses, test_classes, NULL, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
     if (frsp->nclasses != nclasses)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
         FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
         FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -543,17 +548,22 @@ test_fs_create(hid_t fapl)
     if(file_size != empty_size)
         TEST_ERROR
 
+    /* Close the dxpl */
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR;
+
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_fs_create() */
 
 
@@ -585,11 +595,12 @@ static unsigned
 test_fs_sect_add(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl_id (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
 
@@ -625,7 +636,13 @@ test_fs_sect_add(hid_t fapl)
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
             &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
         FAIL_STACK_ERROR
 
@@ -637,7 +654,7 @@ test_fs_sect_add(hid_t fapl)
 
     init_sect_node(sect_node, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
             H5FS_ADD_RETURNED_SPACE, NULL) < 0)
         FAIL_STACK_ERROR
 
@@ -652,7 +669,7 @@ test_fs_sect_add(hid_t fapl)
     fr_meta_size = H5FS_HEADER_SIZE(f) + H5FS_SINFO_PREFIX_SIZE(f);
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
         FAIL_STACK_ERROR
     frsp = NULL;
 
@@ -687,7 +704,7 @@ test_fs_sect_add(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = H5FS_CLS_GHOST_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
             &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
         FAIL_STACK_ERROR
 
@@ -700,7 +717,7 @@ test_fs_sect_add(hid_t fapl)
 
     init_sect_node(sect_node, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
             0, NULL) < 0)
         FAIL_STACK_ERROR
 
@@ -715,7 +732,7 @@ test_fs_sect_add(hid_t fapl)
     fr_meta_size = H5FS_HEADER_SIZE(f);
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
         FAIL_STACK_ERROR
 
     /* Close the file */
@@ -759,7 +776,7 @@ test_fs_sect_add(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = 0;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -774,7 +791,7 @@ test_fs_sect_add(hid_t fapl)
      */
     init_sect_node(sect_node, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -785,13 +802,13 @@ test_fs_sect_add(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
+        FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
     /* Close the file */
@@ -828,22 +845,22 @@ test_fs_sect_add(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = 0;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
 
     if(NULL == (sect_node = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     /*
      * Add section A
      */
     init_sect_node(sect_node, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
 	    H5FS_ADD_DESERIALIZING, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -855,41 +872,44 @@ test_fs_sect_add(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node) < 0)
+        FAIL_STACK_ERROR
 
     /* Free the section node(s) */
     if(TEST_sect_free((H5FS_section_info_t *)sect_node) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
+        FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
+        FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
         if(sect_node)
             TEST_sect_free((H5FS_section_info_t *)sect_node);
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_fs_sect_add() */
 
 
@@ -917,11 +937,12 @@ static unsigned
 test_fs_sect_find(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
 
@@ -946,7 +967,13 @@ test_fs_sect_find(hid_t fapl)
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -958,9 +985,9 @@ test_fs_sect_find(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE30, (H5FS_section_info_t **)&node)) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
@@ -968,8 +995,8 @@ test_fs_sect_find(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
+        FAIL_STACK_ERROR
     frsp = NULL;
 
     PASSED()
@@ -977,26 +1004,26 @@ test_fs_sect_find(hid_t fapl)
     TESTING("H5FS_sect_find() a section equal to requested-size from free-space");
 
     /* reopen the free-space manager */
-    if(NULL == (frsp = H5FS_open(f, H5AC_ind_read_dxpl_id, fs_addr, nclasses,
+    if(NULL == (frsp = H5FS_open(f, dxpl_id, fs_addr, nclasses,
 			    test_classes, NULL, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
     if (frsp->nclasses != nclasses)
-	TEST_ERROR
+        TEST_ERROR
 
     /*
      * Add section A
      */
     if(NULL == (sect_node1 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     HDmemset(&state, 0, sizeof(frspace_state_t));
     state.tot_space += sect_node1->sect_info.size;
@@ -1011,13 +1038,13 @@ test_fs_sect_find(hid_t fapl)
      * Add section C
      */
     if(NULL == (sect_node3 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node3, (haddr_t)(TEST_SECT_ADDR200), (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     state.tot_space += sect_node3->sect_info.size;
     state.tot_sect_count += 1;
@@ -1030,13 +1057,13 @@ test_fs_sect_find(hid_t fapl)
      * Add section B
      */
     if(NULL == (sect_node2 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     state.tot_space += sect_node2->sect_info.size;
     state.tot_sect_count += 1;
@@ -1049,13 +1076,13 @@ test_fs_sect_find(hid_t fapl)
      * Add section D
      */
     if(NULL == (sect_node4 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node4, (haddr_t)TEST_SECT_ADDR300, (hsize_t)TEST_SECT_SIZE80, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     state.tot_space += sect_node4->sect_info.size;
     state.tot_sect_count += 1;
@@ -1064,40 +1091,40 @@ test_fs_sect_find(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE50, (H5FS_section_info_t **)&node)) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if (!node_found) TEST_ERROR
 
     if ((node->sect_info.addr != TEST_SECT_ADDR100) || (node->sect_info.size != TEST_SECT_SIZE50))
-	TEST_ERROR
+        TEST_ERROR
 
     if(TEST_sect_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+        TEST_ERROR
 
     /* remove sections A, C and D */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
-	FAIL_STACK_ERROR
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3) < 0)
-	FAIL_STACK_ERROR
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node4) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
+        FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3) < 0)
+        FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node4) < 0)
+        FAIL_STACK_ERROR
 
     /* Free the section node(s) */
     if(TEST_sect_free((H5FS_section_info_t *)sect_node1) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node1 = NULL;
     if(TEST_sect_free((H5FS_section_info_t *)sect_node3) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node3 = NULL;
     if(TEST_sect_free((H5FS_section_info_t *)sect_node4) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node4 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
+        FAIL_STACK_ERROR
     frsp = NULL;
 
     PASSED()
@@ -1105,26 +1132,26 @@ test_fs_sect_find(hid_t fapl)
     TESTING("H5FS_sect_find() a section greater than requested-size from free-space");
 
     /* reopen the free-space manager */
-    if(NULL == (frsp = H5FS_open(f, H5AC_ind_read_dxpl_id, fs_addr, nclasses,
+    if(NULL == (frsp = H5FS_open(f, dxpl_id, fs_addr, nclasses,
 			    test_classes, NULL, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
     if (frsp->nclasses != nclasses)
-	TEST_ERROR
+        TEST_ERROR
 
     /*
      * Add section A
      */
     if(NULL == (sect_node1 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     HDmemset(&state, 0, sizeof(frspace_state_t));
     state.tot_space += sect_node1->sect_info.size;
@@ -1138,13 +1165,13 @@ test_fs_sect_find(hid_t fapl)
      * Add section B
      */
     if(NULL == (sect_node2 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR200, (hsize_t)TEST_SECT_SIZE80, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     state.tot_space += sect_node2->sect_info.size;
     state.tot_sect_count += 1;
@@ -1153,30 +1180,31 @@ test_fs_sect_find(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE50, (H5FS_section_info_t **)&node)) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
-    if (!node_found) TEST_ERROR
+    if (!node_found)
+        TEST_ERROR
     if ((node->sect_info.addr != TEST_SECT_ADDR200) || (node->sect_info.size < TEST_SECT_SIZE50))
-	TEST_ERROR
+        TEST_ERROR
 
     if(TEST_sect_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+        TEST_ERROR
     node = NULL;
 
     /* remove sections A */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
+        FAIL_STACK_ERROR
 
     /* Free the section node(s) */
     if(TEST_sect_free((H5FS_section_info_t *)sect_node1) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node1 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
+        FAIL_STACK_ERROR
     frsp = NULL;
 
     PASSED()
@@ -1184,26 +1212,26 @@ test_fs_sect_find(hid_t fapl)
     TESTING("H5FS_sect_find(): cannot find a section with requested-size from free-space");
 
     /* reopen the free-space manager */
-    if(NULL == (frsp = H5FS_open(f, H5AC_ind_read_dxpl_id, fs_addr, nclasses,
+    if(NULL == (frsp = H5FS_open(f, dxpl_id, fs_addr, nclasses,
 			    test_classes, NULL, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
     if(!H5F_addr_defined(fs_addr))
         TEST_ERROR
     if (frsp->nclasses != nclasses)
-	TEST_ERROR
+        TEST_ERROR
 
     /*
      * Add section A
      */
     if(NULL == (sect_node1 = (TEST_free_section_t *)HDmalloc(sizeof(TEST_free_section_t))))
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     HDmemset(&state, 0, sizeof(frspace_state_t));
     state.tot_space += sect_node1->sect_info.size;
@@ -1213,38 +1241,40 @@ test_fs_sect_find(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE50, (H5FS_section_info_t **)&node)) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
     /* remove sections A */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
+        FAIL_STACK_ERROR
 
     /* Free the section node(s) */
     if(TEST_sect_free((H5FS_section_info_t *)sect_node1) < 0)
-	TEST_ERROR
+        TEST_ERROR
     sect_node1 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
+        FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
-	FAIL_STACK_ERROR
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
+        FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
@@ -1255,10 +1285,11 @@ error:
         if(sect_node4)
             TEST_sect_free((H5FS_section_info_t *)sect_node4);
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+	    H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_fs_sect_find() */
 
 
@@ -1298,11 +1329,12 @@ static unsigned
 test_fs_sect_merge(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
 
@@ -1330,7 +1362,13 @@ test_fs_sect_merge(hid_t fapl)
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -1345,7 +1383,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1365,7 +1403,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1383,7 +1421,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node3, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE10, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1401,7 +1439,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node4, (haddr_t)TEST_SECT_ADDR150, (hsize_t)TEST_SECT_SIZE80, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1413,7 +1451,7 @@ test_fs_sect_merge(hid_t fapl)
 
 
     /* should be able to find the merged section of A, B, C & D */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE10+TEST_SECT_SIZE30+TEST_SECT_SIZE50+TEST_SECT_SIZE80), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1426,12 +1464,12 @@ test_fs_sect_merge(hid_t fapl)
 	TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -1458,7 +1496,7 @@ test_fs_sect_merge(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = H5FS_CLS_SEPAR_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -1473,7 +1511,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1493,7 +1531,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1506,17 +1544,17 @@ test_fs_sect_merge(hid_t fapl)
         TEST_ERROR
 
     /* should not be able to find the merged section of A & B */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE30+TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
     /* remove section A from free-space */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
 	FAIL_STACK_ERROR
     /* remove section B from free-space */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2) < 0)
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2) < 0)
 	FAIL_STACK_ERROR
 
     /* Free the section node(s) */
@@ -1528,12 +1566,12 @@ test_fs_sect_merge(hid_t fapl)
     sect_node2 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -1560,7 +1598,7 @@ test_fs_sect_merge(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = 0; /* reset */
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -1575,7 +1613,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE10, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1595,7 +1633,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE_NEW, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1615,7 +1653,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node3, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE_NEW, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1633,7 +1671,7 @@ test_fs_sect_merge(hid_t fapl)
 
     init_sect_node(sect_node4, (haddr_t)TEST_SECT_ADDR150, (hsize_t)TEST_SECT_SIZE80, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node4,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -1649,14 +1687,14 @@ test_fs_sect_merge(hid_t fapl)
         TEST_ERROR
 
     /* should not be able to find a merged section of A, B, C & D */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE10+TEST_SECT_SIZE30+TEST_SECT_SIZE50+TEST_SECT_SIZE80), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
     /* should be able to find the merged section of B & C */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE30+TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1670,7 +1708,7 @@ test_fs_sect_merge(hid_t fapl)
 	TEST_ERROR
 
     /* should be able to find section A */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE10), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1683,7 +1721,7 @@ test_fs_sect_merge(hid_t fapl)
 	TEST_ERROR
 
     /* should be able to find section D */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE80), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1696,22 +1734,24 @@ test_fs_sect_merge(hid_t fapl)
 	TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
@@ -1720,10 +1760,11 @@ error:
         if(sect_node2)
             TEST_sect_free((H5FS_section_info_t *)sect_node2);
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Pclose(dxpl_id);
+        H5Fclose(file);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_fs_sect_merge() */
 
 /*
@@ -1764,11 +1805,12 @@ static unsigned
 test_fs_sect_shrink(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
 
@@ -1796,7 +1838,13 @@ test_fs_sect_shrink(hid_t fapl)
 
     TEST_set_eoa((haddr_t)TEST_SECT_ADDR150);  /* set end of file address for shrinking */
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -1812,7 +1860,7 @@ test_fs_sect_shrink(hid_t fapl)
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE_NEW, H5FS_SECT_LIVE);
 
     can_shrink = FALSE;
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -1825,7 +1873,7 @@ test_fs_sect_shrink(hid_t fapl)
         TEST_ERROR
 
     /* section A should still be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1846,7 +1894,7 @@ test_fs_sect_shrink(hid_t fapl)
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
     can_shrink = FALSE;
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -1857,19 +1905,19 @@ test_fs_sect_shrink(hid_t fapl)
         TEST_ERROR
 
     /* section A should not be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -1897,7 +1945,7 @@ test_fs_sect_shrink(hid_t fapl)
 
     /* does not allow merging */
     init_flags = H5FS_CLS_SEPAR_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -1912,7 +1960,7 @@ test_fs_sect_shrink(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -1932,7 +1980,7 @@ test_fs_sect_shrink(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -1941,18 +1989,19 @@ test_fs_sect_shrink(hid_t fapl)
         TEST_ERROR
 
     /* section B should not be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
-    if (node_found) TEST_ERROR
+    if (node_found)
+        TEST_ERROR
 
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
 
     /* section A should still be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE20), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
@@ -1965,12 +2014,12 @@ test_fs_sect_shrink(hid_t fapl)
 	TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -1996,7 +2045,7 @@ test_fs_sect_shrink(hid_t fapl)
     TEST_set_eoa((haddr_t)TEST_SECT_ADDR150);  /* set end of file address for shrinking */
 
     init_flags = 0; /* reset */
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2011,7 +2060,7 @@ test_fs_sect_shrink(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -2031,7 +2080,7 @@ test_fs_sect_shrink(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, &can_shrink) < 0)
 	FAIL_STACK_ERROR
 
@@ -2041,44 +2090,48 @@ test_fs_sect_shrink(hid_t fapl)
         TEST_ERROR
 
     /* section B should not be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE50), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
-    if (node_found) TEST_ERROR
+    if (node_found)
+        TEST_ERROR
 
     /* section A should not be there in free-space */
-    if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if((node_found = H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)(TEST_SECT_SIZE30), (H5FS_section_info_t **)&node)) < 0)
 	FAIL_STACK_ERROR
 
     if (node_found) TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+	        H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_sect_shrink() */
 
 /*
@@ -2102,11 +2155,12 @@ static unsigned
 test_fs_sect_change_class(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
 
@@ -2130,8 +2184,14 @@ test_fs_sect_change_class(hid_t fapl)
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
     init_flags = H5FS_CLS_GHOST_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2146,7 +2206,7 @@ test_fs_sect_change_class(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR60, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2166,7 +2226,7 @@ test_fs_sect_change_class(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE_NONE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2177,16 +2237,16 @@ test_fs_sect_change_class(hid_t fapl)
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if (H5FS_sect_change_class(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
-		    TEST_FSPACE_SECT_TYPE_NONE) < 0)
-	TEST_ERROR
+    if (H5FS_sect_change_class(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+            TEST_FSPACE_SECT_TYPE_NONE) < 0)
+        TEST_ERROR
 
     state.serial_sect_count += 1;
     state.ghost_sect_count -=1;
     if(check_stats(f, frsp, &state))
         TEST_ERROR
 
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if(H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE30, (H5FS_section_info_t **)&node) < 0)
 	FAIL_STACK_ERROR
 
@@ -2196,7 +2256,7 @@ test_fs_sect_change_class(hid_t fapl)
     if(TEST_sect_free((H5FS_section_info_t *)node) < 0)
 	TEST_ERROR
 
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2) < 0)
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2) < 0)
 	FAIL_STACK_ERROR
 
     /* Free the section node(s) */
@@ -2205,12 +2265,12 @@ test_fs_sect_change_class(hid_t fapl)
     sect_node2 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -2237,7 +2297,7 @@ test_fs_sect_change_class(hid_t fapl)
     nclasses = NELMTS(test_classes);
 
     init_flags = H5FS_CLS_SEPAR_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2252,7 +2312,7 @@ test_fs_sect_change_class(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE30, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2264,7 +2324,7 @@ test_fs_sect_change_class(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE50, TEST_FSPACE_SECT_TYPE_NONE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2276,17 +2336,17 @@ test_fs_sect_change_class(hid_t fapl)
 
     init_sect_node(sect_node3, (haddr_t)TEST_SECT_ADDR200, (hsize_t)TEST_SECT_SIZE80, TEST_FSPACE_SECT_TYPE_NONE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
     /* change the class of B to A's class */
-    if (H5FS_sect_change_class(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if (H5FS_sect_change_class(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 		    TEST_FSPACE_SECT_TYPE) < 0)
 	TEST_ERROR
 
     /* change the class of C to A's class */
-    if (H5FS_sect_change_class(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
+    if (H5FS_sect_change_class(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node3,
 		    TEST_FSPACE_SECT_TYPE) < 0)
 	TEST_ERROR
 
@@ -2296,7 +2356,7 @@ test_fs_sect_change_class(hid_t fapl)
 	    TEST_ERROR
 
     /* verify that section B has changed class */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if(H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE50, (H5FS_section_info_t **)&node) < 0)
 	FAIL_STACK_ERROR
 
@@ -2307,7 +2367,7 @@ test_fs_sect_change_class(hid_t fapl)
 	TEST_ERROR
 
     /* verify that section C has changed class */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, frsp,
+    if(H5FS_sect_find(f, dxpl_id, frsp,
             (hsize_t)TEST_SECT_SIZE80, (H5FS_section_info_t **)&node) < 0)
 	FAIL_STACK_ERROR
 
@@ -2318,7 +2378,7 @@ test_fs_sect_change_class(hid_t fapl)
 	TEST_ERROR
 
     /* remove section A from free-space */
-    if(H5FS_sect_remove(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
+    if(H5FS_sect_remove(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1) < 0)
 	FAIL_STACK_ERROR
 
     /* Free the section node(s) */
@@ -2327,22 +2387,24 @@ test_fs_sect_change_class(hid_t fapl)
     sect_node1 = NULL;
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
@@ -2351,10 +2413,11 @@ error:
         if(sect_node2)
             TEST_sect_free((H5FS_section_info_t *)sect_node2);
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_sect_change_class() */
 
 
@@ -2392,11 +2455,12 @@ static unsigned
 test_fs_sect_extend(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
     frspace_state_t 	state;          	/* State of free space*/
     TEST_free_section_t *sect_node1=NULL, *sect_node2=NULL;
@@ -2415,13 +2479,19 @@ test_fs_sect_extend(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
     /*
      * TEST 1
      */
     init_cparam(&cparam);
     nclasses = NELMTS(test_classes);
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2436,7 +2506,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE5, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2456,7 +2526,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE40, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2468,7 +2538,7 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Extend a block by requested-size */
-    if((status = H5FS_sect_try_extend(f, H5AC_ind_read_dxpl_id, frsp, (haddr_t)TEST_SECT_SIZE80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE40)) < 0)
+    if((status = H5FS_sect_try_extend(f, dxpl_id, frsp, (haddr_t)TEST_SECT_SIZE80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE40, 0, NULL)) < 0)
 	FAIL_STACK_ERROR
     if(FALSE == status)
         TEST_ERROR
@@ -2481,12 +2551,12 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -2497,7 +2567,7 @@ test_fs_sect_extend(hid_t fapl)
      */
     TESTING("a block's extension by requested-size which is > adjoining free section's size: Test 2");
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2512,7 +2582,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE5, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2532,7 +2602,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE40, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2544,7 +2614,7 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Extend the block by requested-size */
-    if((status = H5FS_sect_try_extend(f, H5AC_ind_read_dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE50)) < 0)
+    if((status = H5FS_sect_try_extend(f, dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE50, 0, NULL)) < 0)
 	FAIL_STACK_ERROR
     if(TRUE == status)
         TEST_ERROR
@@ -2554,12 +2624,12 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -2570,7 +2640,7 @@ test_fs_sect_extend(hid_t fapl)
      */
     TESTING("a block's extension by requested-size which is < adjoining free section's size: Test 3");
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2585,7 +2655,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE5, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2605,7 +2675,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE40, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2617,7 +2687,7 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Extend the block by requested-size */
-    if((status = H5FS_sect_try_extend(f, H5AC_ind_read_dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE30)) < 0)
+    if((status = H5FS_sect_try_extend(f, dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE20, (hsize_t)TEST_SECT_SIZE30, 0, NULL)) < 0)
 	TEST_ERROR
     if(FALSE == status)
         TEST_ERROR
@@ -2628,12 +2698,12 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
@@ -2644,7 +2714,7 @@ test_fs_sect_extend(hid_t fapl)
      */
     TESTING("a block's extension by requested-size which does not adjoin any free section: Test 4");
 
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2659,7 +2729,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node1, (haddr_t)TEST_SECT_ADDR70, (hsize_t)TEST_SECT_SIZE5, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node1,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2679,7 +2749,7 @@ test_fs_sect_extend(hid_t fapl)
 
     init_sect_node(sect_node2, (haddr_t)TEST_SECT_ADDR100, (hsize_t)TEST_SECT_SIZE40, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-    if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
+    if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node2,
 	    H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	FAIL_STACK_ERROR
 
@@ -2691,7 +2761,7 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Extend the block by requested-size */
-    if((status = H5FS_sect_try_extend(f, H5AC_ind_read_dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE15, (hsize_t)TEST_SECT_SIZE40)) < 0)
+    if((status = H5FS_sect_try_extend(f, dxpl_id, frsp, (haddr_t)TEST_SECT_ADDR80, (hsize_t)TEST_SECT_SIZE15, (hsize_t)TEST_SECT_SIZE40, 0, NULL)) < 0)
 	TEST_ERROR
     if(TRUE == status)
         TEST_ERROR
@@ -2701,30 +2771,33 @@ test_fs_sect_extend(hid_t fapl)
         TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
     PASSED()
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_sect_extend() */
 
 
@@ -2740,11 +2813,12 @@ static unsigned
 test_fs_sect_iterate(hid_t fapl)
 {
     hid_t		file = -1;              /* File ID */
+    hid_t       dxpl_id = -1;           /* dxpl ID (for tag) */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     H5FS_t      	*frsp = NULL;          	/* pointer to free space structure */
     haddr_t     	fs_addr=HADDR_UNDEF; 	/* address of free space */
-    size_t		nclasses;
+    uint16_t		nclasses;
     H5FS_create_t 	cparam; 		/* creation parameters */
 
     TEST_free_section_t 	*sect_node=NULL;
@@ -2771,8 +2845,14 @@ test_fs_sect_iterate(hid_t fapl)
     udata.tot_size = 0;
     udata.tot_sect_count = 0;
 
+    /* Create the dxpl and tag it with the global free space tag */
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+    if(H5AC_tag(dxpl_id, H5AC__FREESPACE_TAG, NULL) < 0)
+        FAIL_STACK_ERROR
+
     init_flags = H5FS_CLS_SEPAR_OBJ;
-    if(NULL == (frsp = H5FS_create(f, H5AC_ind_read_dxpl_id, &fs_addr,
+    if(NULL == (frsp = H5FS_create(f, dxpl_id, &fs_addr,
 	    &cparam, nclasses, test_classes, &init_flags, (hsize_t)FSPACE_THRHD_DEF, (hsize_t)FSPACE_ALIGN_DEF)))
 	FAIL_STACK_ERROR
 
@@ -2786,12 +2866,12 @@ test_fs_sect_iterate(hid_t fapl)
 	sect_size = (unsigned)((i-1) % 9) + 1;
 	init_sect_node(sect_node, (haddr_t)i*10, (hsize_t)sect_size, TEST_FSPACE_SECT_TYPE, H5FS_SECT_LIVE);
 
-	if(H5FS_sect_add(f, H5AC_ind_read_dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
+	if(H5FS_sect_add(f, dxpl_id, frsp, (H5FS_section_info_t *)sect_node,
 		H5FS_ADD_RETURNED_SPACE, NULL) < 0)
 	    FAIL_STACK_ERROR
-    }
+    } /* end for */
 
-    if(H5FS_sect_iterate(f, H5AC_ind_read_dxpl_id, frsp, TEST_sects_cb, &udata) < 0)
+    if(H5FS_sect_iterate(f, dxpl_id, frsp, TEST_sects_cb, &udata) < 0)
 	TEST_ERROR
 
     H5FS_sect_stats(frsp, &tot_space, &nsects);
@@ -2802,39 +2882,42 @@ test_fs_sect_iterate(hid_t fapl)
 	TEST_ERROR
 
     /* Close the free space manager */
-    if(H5FS_close(f, H5AC_ind_read_dxpl_id, frsp) < 0)
+    if(H5FS_close(f, dxpl_id, frsp) < 0)
 	FAIL_STACK_ERROR
     frsp = NULL;
 
     /* Delete free space manager */
-    if(H5FS_delete(f, H5AC_ind_read_dxpl_id, fs_addr) < 0)
+    if(H5FS_delete(f, dxpl_id, fs_addr) < 0)
 	FAIL_STACK_ERROR
     fs_addr = HADDR_UNDEF;
 
-    /* Close the file */
+    /* Close the file and dxpl */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(dxpl_id) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
-    return(0);
+    return 0;
 
 error:
     H5E_BEGIN_TRY {
         if(frsp)
-	    H5FS_close(f, H5AC_ind_read_dxpl_id, frsp);
-	H5Fclose(file);
+            H5FS_close(f, dxpl_id, frsp);
+        H5Fclose(file);
+        H5Pclose(dxpl_id);
     } H5E_END_TRY;
-    return(1);
+    return 1;
 } /* test_fs_sect_iterate() */
 
 
 int
 main(void)
 {
-    hid_t       	fapl = -1;	/* File access property list for data files */
-    unsigned    	nerrors = 0;    /* Cumulative error count */
-    const char *env_h5_drvr = NULL;     /* File Driver value from environment */
+    hid_t           fapl = -1;              /* File access property list for data files */
+    unsigned        nerrors = 0;            /* Cumulative error count */
+    const char     *env_h5_drvr = NULL;     /* File Driver value from environment */
 
     /* Get the VFD to use */
     env_h5_drvr = HDgetenv("HDF5_DRIVER");
@@ -2843,11 +2926,16 @@ main(void)
 
     h5_reset();
 
-    fapl = h5_fileaccess();
+    if((fapl = h5_fileaccess()) < 0) {
+        nerrors++;
+        PUTS_ERROR("Can't get VFD-dependent fapl")
+    } /* end if */
 
     /* make sure alignment is not set for tests to succeed */
-    if(H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1) < 0)
-        TEST_ERROR
+    if(H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1) < 0) {
+        nerrors++;
+        PUTS_ERROR("Can't set alignment")
+    } /* end if */
 
     nerrors += test_fs_create(fapl);
     nerrors += test_fs_sect_add(fapl);
@@ -2863,16 +2951,16 @@ main(void)
 
     if(nerrors)
         goto error;
-    puts("All free-space tests passed.");
+    HDputs("All free-space tests passed.");
 
     h5_cleanup(FILENAME, fapl);
-    return (0);
+    HDexit(EXIT_SUCCESS);
 
 error:
-    puts("*** TESTS FAILED ***");
+    HDputs("*** TESTS FAILED ***");
     H5E_BEGIN_TRY {
         H5Pclose(fapl);
     } H5E_END_TRY;
-    return (1);
+    HDexit(EXIT_FAILURE);
 } /* main() */
 
diff --git a/test/fsm_aggr_nopersist.h5 b/test/fsm_aggr_nopersist.h5
new file mode 100644
index 0000000..159e7f7
Binary files /dev/null and b/test/fsm_aggr_nopersist.h5 differ
diff --git a/test/fsm_aggr_persist.h5 b/test/fsm_aggr_persist.h5
new file mode 100644
index 0000000..1a837dd
Binary files /dev/null and b/test/fsm_aggr_persist.h5 differ
diff --git a/test/gen_bad_compound.c b/test/gen_bad_compound.c
index b864195..c52eb95 100644
--- a/test/gen_bad_compound.c
+++ b/test/gen_bad_compound.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_bad_ohdr.c b/test/gen_bad_ohdr.c
index 6d50230..36ba64a 100644
--- a/test/gen_bad_ohdr.c
+++ b/test/gen_bad_ohdr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_bogus.c b/test/gen_bogus.c
index fdd8744..ec29eb9 100644
--- a/test/gen_bogus.c
+++ b/test/gen_bogus.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_cross.c b/test/gen_cross.c
index 816064d..cf3fc35 100644
--- a/test/gen_cross.c
+++ b/test/gen_cross.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -401,7 +399,7 @@ create_scale_offset_dsets_char(hid_t fid, hid_t fsid, hid_t msid)
      */
     for (j = 0; j < NX; j++) {
         for (i = 0; i < NY; i++)
-            data[j][i] = i + j;
+            data[j][i] = (char)(i + j);
     }
     /*
      * 0 1 2 3 4 5
@@ -500,7 +498,7 @@ create_scale_offset_dsets_short(hid_t fid, hid_t fsid, hid_t msid)
      */
     for (j = 0; j < NX; j++) {
         for (i = 0; i < NY; i++)
-            data[j][i] = i + j;
+            data[j][i] = (short)(i + j);
     }
     /*
      * 0 1 2 3 4 5
@@ -1260,8 +1258,8 @@ error:
  *
  * Purpose:     Create a file for cross_read.c test.
  *
- * Return:      Success:        exit(0)
- *              Failure:        exit(1)
+ * Return:      Success:        exit(EXIT_SUCCESS)
+ *              Failure:        exit(EXIT_FAILURE)
  *
  * Programmer:  Raymond Lu
  *              Some time ago
diff --git a/test/gen_deflate.c b/test/gen_deflate.c
index 2d0b746..3409a81 100644
--- a/test/gen_deflate.c
+++ b/test/gen_deflate.c
@@ -5,25 +5,25 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have 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
  *              Thursday, November 14, 2002
  *
- * Purpose:	Create a dataset compressed with the deflate filter.
- *	This program is used to create the test file `tdeflate.h5' which has
- *      a dataset compressed with the "deflate" I/O filter.  This dataset will
- *      be used to verify the correct behavior of the library when a filter is
- *      not available for a dataset which requires it.
+ * Purpose:	    Create a dataset compressed with the deflate filter.
+ *              This program is used to create the test file `tdeflate.h5'
+ *              which has a dataset compressed with the "deflate" I/O filter.
+ *              This dataset will be used to verify the correct behavior of
+ *              the library when a filter is not available for a dataset which
+ *              requires it.
  */
-#include "hdf5.h"
+
+#include "h5test.h"
 
 #define TESTFILE   "deflate.h5"
 
@@ -34,80 +34,86 @@
 #define CHUNK_DIM1	50
 #define CHUNK_DIM2	50
 
-/* Dataset data */
-int data[SPACE_DIM1][SPACE_DIM2];
 
 

 /*-------------------------------------------------------------------------
  * Function:	main
  *
- * Purpose:
- *
- * Return:	Success:
- *
- *		Failure:
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
  * Programmer:	Quincey Koziol
  *              Thursday, November 14, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int
 main(void)
 {
-    hid_t	file, space, dset, dcpl;
-    hsize_t	dims[SPACE_RANK]={SPACE_DIM1,SPACE_DIM2};
-    hsize_t	chunk_dims[SPACE_RANK]={CHUNK_DIM1,CHUNK_DIM2};
-    size_t      i,j;            /* Local index variables */
+    hid_t       fid = -1, sid = -1, did = -1, dcpl_id = -1;
+    hsize_t     dims[SPACE_RANK] = {SPACE_DIM1, SPACE_DIM2};
+    hsize_t	    chunk_dims[SPACE_RANK] = {CHUNK_DIM1, CHUNK_DIM2};
+    size_t      i,j;                    /* Local index variables */
+    int        *data = NULL;            /* Dataset data */
 
     /* Initialize the data */
     /* (Try for something easily compressible) */
-    for(i=0; i<SPACE_DIM1; i++)
-        for(j=0; j<SPACE_DIM2; j++)
-            data[i][j] = (int)(j % 5);
+    if(NULL == (data = (int *)HDmalloc(SPACE_DIM1 * SPACE_DIM2 * sizeof(int))))
+        TEST_ERROR
+
+    for(i = 0; i < SPACE_DIM1; i++)
+        for(j = 0; j < SPACE_DIM2; j++)
+            data[(i * SPACE_DIM2) + j] = (int)(j % 5);
 
     /* Create the file */
-    file = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if(file<0)
-        printf("file<0!\n");
+    if((fid = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataspace */
-    space = H5Screate_simple(SPACE_RANK, dims, NULL);
-    if(space<0)
-        printf("space<0!\n");
+    if((sid = H5Screate_simple(SPACE_RANK, dims, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataset creation property list */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    if(dcpl<0)
-        printf("dcpl<0!\n");
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
 
     /* Set up for deflated data */
-    if(H5Pset_chunk(dcpl, 2, chunk_dims)<0)
-        printf("H5Pset_chunk() failed!\n");
-    if(H5Pset_deflate(dcpl, 9)<0)
-        printf("H5Pset_deflate() failed!\n");
+    if(H5Pset_chunk(dcpl_id, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_deflate(dcpl_id, 9) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the compressed dataset */
-    dset = H5Dcreate2(file, "Dataset1", H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
-    if(dset<0)
-        printf("dset<0!\n");
+    if((did = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* Write the data to the dataset */
-    if(H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data)<0)
-        printf("H5Dwrite() failed!\n");
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        FAIL_STACK_ERROR
 
     /* Close everything */
-    if(H5Pclose(dcpl)<0)
-        printf("H5Pclose() failed!\n");
-    if(H5Dclose(dset)<0)
-        printf("H5Dclose() failed!\n");
-    if(H5Sclose(space)<0)
-        printf("H5Sclose() failed!\n");
-    if(H5Fclose(file)<0)
-        printf("H5Fclose() failed!\n");
-
-    return 0;
-}
+    if(H5Pclose(dcpl_id) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    HDfree(data);
+
+    return EXIT_SUCCESS;
+
+error:
+    if(data)
+        HDfree(data);
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl_id);
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return EXIT_FAILURE;
+} /* end main() */
 
diff --git a/test/gen_file_image.c b/test/gen_file_image.c
index bc9de29..9607cc2 100644
--- a/test/gen_file_image.c
+++ b/test/gen_file_image.c
@@ -5,22 +5,20 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have 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
  *              Friday, March 30, 2012
  *
- * Purpose:	Create a simple file for use with the file image tests.
+ * Purpose:     Create a simple file for use with the file image tests.
  *
  */
-#include "hdf5.h"
+#include "h5test.h"
 
 #define TESTFILE   "file_image_core_test.h5"
 
@@ -29,18 +27,11 @@
 #define SPACE_DIM1	128
 #define SPACE_DIM2	32
 
-/* Dataset data */
-int data[SPACE_DIM1][SPACE_DIM2];
-
 

 /*-------------------------------------------------------------------------
  * Function:	main
  *
- * Purpose:
- *
- * Return:	Success:
- *
- *		Failure:
+ * Return:      EXIT_SUCCESS/EXIT_FAILURE
  *
  * Programmer:	Quincey Koziol
  *              Friday, March 30, 2012
@@ -50,42 +41,54 @@ int data[SPACE_DIM1][SPACE_DIM2];
 int
 main(void)
 {
-    hid_t	file, space, dset;
+    hid_t   fid = -1, sid = -1, did = -1;
     hsize_t	dims[SPACE_RANK] = {SPACE_DIM1, SPACE_DIM2};
-    size_t      i, j;            /* Local index variables */
+    size_t      i,j;                    /* Local index variables */
+    int        *data = NULL;            /* Dataset data */
 
     /* Initialize the data */
+    if(NULL == (data = (int *)HDmalloc(SPACE_DIM1 * SPACE_DIM2 * sizeof(int))))
+        TEST_ERROR
+
     for(i = 0; i < SPACE_DIM1; i++)
         for(j = 0; j < SPACE_DIM2; j++)
-            data[i][j] = (int)(j % 5);
+            data[(i * SPACE_DIM2) + j] = (int)(j % 5);
 
     /* Create the file */
-    file = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if(file < 0)
-        printf("file < 0!\n");
+    if((fid = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the dataspace */
-    space = H5Screate_simple(SPACE_RANK, dims, NULL);
-    if(space < 0)
-        printf("space < 0!\n");
+    if((sid = H5Screate_simple(SPACE_RANK, dims, NULL)) < 0)
+        FAIL_STACK_ERROR
 
     /* Create the compressed dataset */
-    dset = H5Dcreate2(file, "Dataset1", H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if(dset < 0)
-        printf("dset < 0!\n");
+    if((did = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
     /* Write the data to the dataset */
-    if(H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
-        printf("H5Dwrite() failed!\n");
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+        FAIL_STACK_ERROR
 
     /* Close everything */
-    if(H5Dclose(dset) < 0)
-        printf("H5Dclose() failed!\n");
-    if(H5Sclose(space) < 0)
-        printf("H5Sclose() failed!\n");
-    if(H5Fclose(file) < 0)
-        printf("H5Fclose() failed!\n");
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+    if(data)
+        HDfree(data);
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
 
-    return 0;
-}
+    return EXIT_FAILURE;
+} /* end main() */
 
diff --git a/test/gen_filespace.c b/test/gen_filespace.c
index e0c42e8..4397836 100644
--- a/test/gen_filespace.c
+++ b/test/gen_filespace.c
@@ -5,78 +5,112 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "hdf5.h"
+#include <assert.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 */
+    "fsm_aggr_nopersist.h5",	/* H5F_FSPACE_STRATEGY_FSM_AGGR + not persisting free-space */
+    "fsm_aggr_persist.h5",		/* H5F_FSPACE_STRATEGY_FSM_AGGR + persisting free-space */
+    "paged_nopersist.h5",	    /* H5F_FSPACE_STRATEGY_PAGE + not persisting free-space */
+    "paged_persist.h5",		    /* H5F_FSPACE_STRATEGY_PAGE + persisting free-space */
+    "aggr.h5",	                /* H5F_FSPACE_STRATEGY_AGGR */
+    "none.h5"		            /* H5F_FSPACE_STRATEGY_NONE */
 };
 
 #define DATASET		"dset"
 #define NUM_ELMTS	100
+#define FALSE		0
+#define TRUE		1
+#define INC_ENUM(TYPE,VAR) (VAR)=((TYPE)((VAR)+1))
 
 /*
- * 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
+ * Compile and run this program in the trunk to generate
+ * HDF5 files with combinations of 4 file space strategies
+ * and persist/not persist free-space.
+ * The library creates the file space info message with "mark if unknown"
+ * in these files.
+ *
+ * Move these files to 1.8 branch for compatibility testing:
+ * test_filespace_compatible() in test/tfile.c will use these files.
+ *
+ * Copy these files from the 1.8 branch back to the trunk for 
+ * compatibility testing via test_filespace_round_compatible() in test/tfile.c.
+ *
  */
-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();
+    hid_t fid = -1;         /* File ID */
+    hid_t fcpl = -1;        /* File creation property list */
+    hid_t did = -1;         /* Dataset ID */
+    hid_t sid = -1;		    /* Dataspace ID */
+    hsize_t dim[1];			/* Dimension sizes */
+    int data[NUM_ELMTS];	/* Buffer for data */
+    int i, j;			    /* Local index variables */
+    H5F_fspace_strategy_t fs_strategy;	/* File space handling strategy */
+    unsigned fs_persist;     /* Persisting free-space or not */
+
+    j = 0;
+    for(fs_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR; fs_strategy < H5F_FSPACE_STRATEGY_NTYPES; INC_ENUM(H5F_fspace_strategy_t, fs_strategy)) {
+        for(fs_persist = FALSE; fs_persist <= TRUE; fs_persist++) {
+
+            if(fs_persist && fs_strategy >= H5F_FSPACE_STRATEGY_AGGR)
+                continue;
+
+            /* Get a copy of the default file creation property */
+            if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+                goto error;
+
+            if(H5Pset_file_space_strategy(fcpl, fs_strategy, fs_persist, (hsize_t)1) < 0)
+                goto error;
+
+            /* Create the file with the file space info */
+            if((fid = H5Fcreate(FILENAMES[j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+                goto error;
+
+            /* Create the dataset */
+            dim[0] = NUM_ELMTS;
+            if((sid = H5Screate_simple(1, dim, NULL)) < 0)
+                goto error;
+            if((did = H5Dcreate2(fid, DATASET, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                goto error;
+
+            for(i = 0; i < NUM_ELMTS; i++)
+                data[i] = i;
+
+            /* Write the dataset */
+            if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+                goto error;
+
+            /* Closing */
+            if(H5Dclose(did) < 0)
+                goto error;
+            if(H5Sclose(sid) < 0)
+                goto error;
+            if(H5Fclose(fid) < 0)
+                goto error;
+            if(H5Pclose(fcpl) < 0)
+                goto error;
+            ++j;
+        }
+    }
+    assert(j == NELMTS(FILENAMES));
 
     return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Sclose(did);
+        H5Pclose(fcpl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
 }
diff --git a/test/gen_filters.c b/test/gen_filters.c
index f506602..fa66078 100644
--- a/test/gen_filters.c
+++ b/test/gen_filters.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5test.h"
diff --git a/test/gen_idx.c b/test/gen_idx.c
deleted file mode 100644
index 8c24198..0000000
--- a/test/gen_idx.c
+++ /dev/null
@@ -1,126 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Purpose:     This program is run to generate an HDF5 data file with datasets
- *              that use Fixed Array indexing method.
- *
- *              To test compatibility, compile and run this program
- *              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] = {
-    "fixed_idx.h5"	/* file with datasets that use Fixed Array indexing method */
-}; 
-
-#define DSET		"dset"
-#define DSET_FILTER	"dset_filter"
-
-/*
- * 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(void)
-{
-    hid_t	fapl;		    /* file access property id */
-    hid_t	fid;	            /* file id */
-    hid_t   	sid;	            /* space id */
-    hid_t	dcpl;	    	    /* dataset creation property 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 */
-    int		i;		    /* local index variable */
-    int     	buf[10];            /* data buffer */
-
-
-    /* Get a copy of the file aaccess property */
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    assert(fapl >= 0);
-
-    /* Set the "use the latest format" bounds for creating objects in the file */
-    status  = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
-    assert(status >= 0);
-
-     /* Create dataset */
-    fid = H5Fcreate(FILENAME[0], H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-    assert(fid >= 0);
-
-    /* Create data */
-    for(i = 0; i < 10; i++)
-	buf[i] = i;
-
-    /* Set chunk */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    assert(dcpl >= 0);
-    status = H5Pset_chunk(dcpl, 1, c_dims);
-    assert(status >= 0);
-
-    sid = H5Screate_simple(1, dims, NULL);
-    assert(sid >= 0);
-
-    /* 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);
-
-#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);
-    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 */
-    status = H5Dclose(did);
-    assert(status >= 0);
-    status = H5Sclose(sid);
-    assert(status >= 0);
-    status = H5Pclose(dcpl);
-    assert(status >= 0);
-    status = H5Pclose(fapl);
-    assert(status >= 0);
-    status = H5Fclose(fid);
-    assert(status >= 0);
-} /* gen_idx_file() */
-
-int main(void)
-{
-    gen_idx_file();
-
-    return 0;
-}
-
diff --git a/test/gen_mergemsg.c b/test/gen_mergemsg.c
index 5df5674..f158d57 100644
--- a/test/gen_mergemsg.c
+++ b/test/gen_mergemsg.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_new_array.c b/test/gen_new_array.c
index c78644d..27f162c 100644
--- a/test/gen_new_array.c
+++ b/test/gen_new_array.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_new_fill.c b/test/gen_new_fill.c
index 4ba85ad..5bdbf73 100644
--- a/test/gen_new_fill.c
+++ b/test/gen_new_fill.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_new_group.c b/test/gen_new_group.c
index b998913..6924291 100644
--- a/test/gen_new_group.c
+++ b/test/gen_new_group.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_new_mtime.c b/test/gen_new_mtime.c
index d7a0f32..b44d567 100644
--- a/test/gen_new_mtime.c
+++ b/test/gen_new_mtime.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_new_super.c b/test/gen_new_super.c
index f6d15f4..f6ce589 100644
--- a/test/gen_new_super.c
+++ b/test/gen_new_super.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_noencoder.c b/test/gen_noencoder.c
index 46a2036..e6ac9cf 100644
--- a/test/gen_noencoder.c
+++ b/test/gen_noencoder.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 #include "hdf5.h"
 
diff --git a/test/gen_nullspace.c b/test/gen_nullspace.c
index 8349a5c..9d76deb 100644
--- a/test/gen_nullspace.c
+++ b/test/gen_nullspace.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_old_array.c b/test/gen_old_array.c
index a4162f2..3fab657 100644
--- a/test/gen_old_array.c
+++ b/test/gen_old_array.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_old_group.c b/test/gen_old_group.c
index 1b33cea..d109329 100644
--- a/test/gen_old_group.c
+++ b/test/gen_old_group.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_old_layout.c b/test/gen_old_layout.c
index 312ee58..56c3e4e 100644
--- a/test/gen_old_layout.c
+++ b/test/gen_old_layout.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_old_mtime.c b/test/gen_old_mtime.c
index ca6012a..cbe3bdc 100644
--- a/test/gen_old_mtime.c
+++ b/test/gen_old_mtime.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_plist.c b/test/gen_plist.c
index ea3c6c7..41f232d 100644
--- a/test/gen_plist.c
+++ b/test/gen_plist.c
@@ -5,29 +5,16 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
  * generate plist file
  */
 
-#ifdef H5_STDC_HEADERS
-#   include <assert.h>
-#   include <fcntl.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-
 #include "H5private.h"
 #include "hdf5.h"
 
@@ -92,10 +79,16 @@ main(void)
         0.2f,
         (256 * 2048),
         H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY};
+    H5AC_cache_image_config_t my_cache_image_config = {
+        H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+        TRUE,
+	FALSE,
+        -1};
+
 
     /* check endianess */
     {
-        short int word = 0x0000;
+        short int word = 0x0001;
         char *byte = (char *) &word;
 
         if(byte[0] == 1)
@@ -367,6 +360,9 @@ main(void)
         assert(ret > 0);
     if((ret = H5Pset_mdc_config(fapl1, &my_cache_config)) < 0)
         assert(ret > 0);
+    if((ret = H5Pset_mdc_image_config(fapl1, &my_cache_image_config)) < 0)
+        assert(ret > 0);
+
     if((ret = H5Pset_core_write_tracking(fapl1, TRUE, (size_t)(1024 * 1024))) < 0)
         assert(ret > 0);
 
@@ -405,6 +401,12 @@ main(void)
     if((ret = H5Pset_sizes(fcpl1, 8, 4) < 0))
          assert(ret > 0);
 
+    if((ret = H5Pset_file_space_strategy(fcpl1, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1)) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_file_space_page_size(fcpl1, (hsize_t)4096)) < 0)
+         assert(ret > 0);
+
     if((ret = encode_plist(fcpl1, little_endian, word_length, "testfiles/plist_files/fcpl_")) < 0)
         assert(ret > 0);
 
diff --git a/test/gen_sizes_lheap.c b/test/gen_sizes_lheap.c
index de7e261..81742df 100644
--- a/test/gen_sizes_lheap.c
+++ b/test/gen_sizes_lheap.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_specmetaread.c b/test/gen_specmetaread.c
index f489119..d06bd59 100644
--- a/test/gen_specmetaread.c
+++ b/test/gen_specmetaread.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/gen_udlinks.c b/test/gen_udlinks.c
index 55abab0..e48d0e8 100644
--- a/test/gen_udlinks.c
+++ b/test/gen_udlinks.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/genall5.c b/test/genall5.c
new file mode 100644
index 0000000..a48f14b
--- /dev/null
+++ b/test/genall5.c
@@ -0,0 +1,3886 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  John Mainzer
+ *		9/23/15
+ *
+ *		This file contains a heavily edited and functionaly reduce 
+ *		version of the test code first written by Quincey in a file
+ *		of the same name.
+ */
+
+#include "cache_common.h"
+#include "genall5.h"
+
+#define DSET_DIMS (1024 * 1024)
+#define DSET_SMALL_DIMS (64 * 1024)
+#define DSET_CHUNK_DIMS 1024
+#define DSET_COMPACT_DIMS 4096
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ns_grp_0
+ *
+ * Purpose:     Create an empty "new style" group at the specified location
+ *		in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+ns_grp_0(hid_t fid, const char *group_name)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gcpl = H5Pcreate(H5P_GROUP_CREATE);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_0: H5Pcreate() failed";
+	}
+        assert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pset_link_creation_order(gcpl, H5P_CRT_ORDER_TRACKED);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_0: H5Pset_link_creation_order() failed";
+	}
+        assert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, gcpl, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_0: H5Gcreate2() failed";
+        }
+        assert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_0: H5Pclose(gcpl) failed";
+        }
+        assert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_0: H5Gclose(gid) failed";
+        }
+        assert(ret >= 0);
+    }
+
+    return;
+
+} /* ns_grp_0 */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ns_grp_0
+ *
+ * Purpose:     verify an empty "new style" group at the specified location
+ *              in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void vrfy_ns_grp_0(hid_t fid, const char *group_name)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    H5G_info_t grp_info;
+    unsigned crt_order_flags = 0;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gid = H5Gopen2(fid, group_name, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_0: H5Gopen2() failed";
+        }
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        gcpl = H5Gget_create_plist(gid);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_0: H5Gget_create_plist() failed";
+        }
+        HDassert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_link_creation_order(gcpl, &crt_order_flags);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_0: H5Pget_link_creation_order() failed";
+        }
+        else if ( H5P_CRT_ORDER_TRACKED != crt_order_flags ) {
+
+	    pass = FALSE;
+            failure_mssg = 
+		"vrfy_ns_grp_0: H5P_CRT_ORDER_TRACKED != crt_order_flags";
+        }
+        HDassert(ret >= 0);
+        HDassert(H5P_CRT_ORDER_TRACKED == crt_order_flags);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_0: H5Pclose() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        memset(&grp_info, 0, sizeof(grp_info));
+        ret = H5Gget_info(gid, &grp_info);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_0: H5Gget_info() failed";
+        }
+        else if ( H5G_STORAGE_TYPE_COMPACT != grp_info.storage_type ) {
+
+            pass = FALSE;
+            failure_mssg = 
+	     "vrfy_ns_grp_0: H5G_STORAGE_TYPE_COMPACT != grp_info.storage_type";
+        }
+	else if ( 0 != grp_info.nlinks ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_0: 0 != grp_info.nlinks";
+        }
+        else if ( 0 != grp_info.max_corder ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_0: 0 != grp_info.max_corder";
+        }
+        else if ( FALSE != grp_info.mounted ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_0: FALSE != grp_info.mounted";
+        }
+
+        HDassert(ret >= 0);
+        HDassert(H5G_STORAGE_TYPE_COMPACT == grp_info.storage_type);
+        HDassert(0 == grp_info.nlinks);
+        HDassert(0 == grp_info.max_corder);
+        HDassert(false == grp_info.mounted);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_0: H5Gclose() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ns_grp_0() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ns_grp_c
+ *
+ * Purpose:     Create a compact "new style" group, with 'nlinks' 
+ *		soft/hard/external links in it in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void 
+ns_grp_c(hid_t fid, const char *group_name, unsigned nlinks)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    unsigned max_compact;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gcpl = H5Pcreate(H5P_GROUP_CREATE);
+
+        if ( gcpl <= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: H5Pcreate(H5P_GROUP_CREATE) failed";
+        }
+        HDassert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pset_link_creation_order(gcpl, H5P_CRT_ORDER_TRACKED);
+
+        if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c:  H5Pset_link_creation_order() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, gcpl, H5P_DEFAULT);
+
+        if ( gid <= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: H5Gcreate2() failed";
+        }
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        max_compact = 0;
+        ret = H5Pget_link_phase_change(gcpl, &max_compact, NULL);
+
+        if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: H5Pget_link_phase_change() failed";
+        }
+	else if ( nlinks <= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: nlinks <= 0";
+        }
+	else if ( nlinks >= max_compact ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: nlinks >= max_compact";
+        }
+
+        HDassert(ret >= 0);
+        HDassert(nlinks > 0);
+        HDassert(nlinks < max_compact);
+    }
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        char linkname[16];
+
+        sprintf(linkname, "%u", u);
+
+        if(0 == (u % 3)) {
+
+            ret = H5Lcreate_soft(group_name, gid, linkname, H5P_DEFAULT, 
+                                 H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "ns_grp_c: H5Lcreate_soft() failed";
+            }
+            HDassert(ret >= 0);
+        } /* end if */
+        else if(1 == (u % 3)) {
+
+            ret = H5Lcreate_hard(fid, "/", gid, linkname, H5P_DEFAULT, 
+                                 H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "ns_grp_c: H5Lcreate_hard() failed";
+            }
+            HDassert(ret >= 0);
+        } /* end else-if */
+        else {
+
+            HDassert(2 == (u % 3));
+            ret = H5Lcreate_external("external.h5", "/ext", gid, linkname, 
+                                     H5P_DEFAULT, H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "ns_grp_c: H5Lcreate_external() failed";
+            }
+            HDassert(ret >= 0);
+        } /* end else */
+
+	u++;
+
+    } /* end while() */
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: H5Pclose(gcpl) failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "ns_grp_c: H5Gclose(gid) failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ns_grp_c() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ns_grp_c
+ *
+ * Purpose:     Verify a compact "new style" group, with 'nlinks' 
+ *		soft/hard/external links in it in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+vrfy_ns_grp_c(hid_t fid, const char *group_name, unsigned nlinks)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    H5G_info_t grp_info;
+    unsigned crt_order_flags = 0;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gid = H5Gopen2(fid, group_name, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Gopen2() failed";
+        }
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        gcpl = H5Gget_create_plist(gid);
+
+	if ( gcpl <= 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Gget_create_plist(gid) failed";
+        }
+        assert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_link_creation_order(gcpl, &crt_order_flags);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Pget_link_creation_order() failed";
+        }
+        else if ( H5P_CRT_ORDER_TRACKED != crt_order_flags ) {
+
+            pass = FALSE;
+            failure_mssg = 
+		"vrfy_ns_grp_c: H5P_CRT_ORDER_TRACKED != crt_order_flags";
+        }
+        HDassert(ret >= 0);
+        HDassert(H5P_CRT_ORDER_TRACKED == crt_order_flags);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Pclose() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        memset(&grp_info, 0, sizeof(grp_info));
+        ret = H5Gget_info(gid, &grp_info);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Gget_info() failed";
+        }
+        else if ( H5G_STORAGE_TYPE_COMPACT != grp_info.storage_type ) {
+
+            pass = FALSE;
+            failure_mssg = 
+	     "vrfy_ns_grp_c: H5G_STORAGE_TYPE_COMPACT != grp_info.storage_type";
+        }
+        else if ( nlinks != grp_info.nlinks ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: nlinks != grp_info.nlinks";
+        }
+        else if ( nlinks != grp_info.max_corder ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: nlinks != grp_info.max_corder";
+        }
+        else if ( FALSE != grp_info.mounted ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: FALSE != grp_info.mounted";
+        }
+
+        HDassert(ret >= 0);
+        HDassert(H5G_STORAGE_TYPE_COMPACT == grp_info.storage_type);
+        HDassert(nlinks == grp_info.nlinks);
+        HDassert(nlinks == grp_info.max_corder);
+        HDassert(false == grp_info.mounted);
+    }
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        H5L_info_t lnk_info;
+        char linkname[16];
+        htri_t link_exists;
+
+        sprintf(linkname, "%u", u);
+        link_exists = H5Lexists(gid, linkname, H5P_DEFAULT);
+
+	if ( link_exists < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Lexists() failed";
+        }
+        HDassert(link_exists >= 0);
+
+        memset(&lnk_info, 0, sizeof(grp_info));
+        ret = H5Lget_info(gid, linkname, &lnk_info, H5P_DEFAULT);
+
+	if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Lget_info() failed";
+        }
+        else if ( TRUE != lnk_info.corder_valid ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: TRUE != lnk_info.corder_valid";
+        }
+        else if ( u != lnk_info.corder ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: u != lnk_info.corder";
+        }
+        else if ( H5T_CSET_ASCII != lnk_info.cset ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5T_CSET_ASCII != lnk_info.cset";
+        }
+        HDassert(ret >= 0);
+        HDassert(true == lnk_info.corder_valid);
+        HDassert(u == lnk_info.corder);
+        HDassert(H5T_CSET_ASCII == lnk_info.cset);
+
+        if ( 0 == (u % 3) ) {
+
+            char *slinkval;
+
+	    if ( H5L_TYPE_SOFT != lnk_info.type ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5L_TYPE_SOFT != lnk_info.type";
+            }
+            else if ( (strlen(group_name) + 1) != lnk_info.u.val_size ) {
+
+                pass = FALSE;
+                failure_mssg = 
+	       "vrfy_ns_grp_c: (strlen(group_name) + 1) != lnk_info.u.val_size";
+            }
+            HDassert(H5L_TYPE_SOFT == lnk_info.type);
+            HDassert((strlen(group_name) + 1) == lnk_info.u.val_size);
+
+            slinkval = (char *)malloc(lnk_info.u.val_size);
+
+	    if ( ! slinkval ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: malloc of slinkval failed";
+            }
+            HDassert(slinkval);
+
+            ret = H5Lget_val(gid, linkname, slinkval, lnk_info.u.val_size, 
+                             H5P_DEFAULT);
+            if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5Lget_val() failed";
+            }
+	    else if ( 0 != strcmp(slinkval, group_name) ) {
+
+                pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_c: 0 != strcmp(slinkval, group_name)";
+            }
+            HDassert(ret >= 0);
+            HDassert(0 == strcmp(slinkval, group_name));
+
+            free(slinkval);
+        } /* end if */
+        else if(1 == (u % 3)) {
+
+            H5O_info_t root_oinfo;
+
+	    if ( H5L_TYPE_HARD != lnk_info.type ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5L_TYPE_HARD != lnk_info.type";
+            }
+            HDassert(H5L_TYPE_HARD == lnk_info.type);
+
+            memset(&root_oinfo, 0, sizeof(root_oinfo));
+            ret = H5Oget_info(fid, &root_oinfo);
+
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5Oget_info() failed.";
+            }
+            else if ( root_oinfo.addr != lnk_info.u.address ) {
+
+                pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_c: root_oinfo.addr != lnk_info.u.address";
+            }
+            HDassert(ret >= 0);
+            HDassert(root_oinfo.addr == lnk_info.u.address);
+        } /* end else-if */
+        else {
+            void *elinkval;
+            const char *file = NULL;
+            const char *path = NULL;
+
+            HDassert(2 == (u % 3));
+
+	    if ( H5L_TYPE_EXTERNAL != lnk_info.type ) {
+
+                pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_c: H5L_TYPE_EXTERNAL != lnk_info.type";
+            }
+            HDassert(H5L_TYPE_EXTERNAL == lnk_info.type);
+
+            elinkval = malloc(lnk_info.u.val_size);
+
+	    if ( ! elinkval ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: malloc of elinkval failed.";
+            }
+            HDassert(elinkval);
+
+            ret = H5Lget_val(gid, linkname, elinkval, lnk_info.u.val_size, 
+                             H5P_DEFAULT);
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5Lget_val() failed.";
+            }
+            HDassert(ret >= 0);
+
+            ret = H5Lunpack_elink_val(elinkval, lnk_info.u.val_size, 
+                                      NULL, &file, &path);
+	    if ( ret < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: H5Lunpack_elink_val() failed.";
+            }
+	    else if ( 0 != strcmp(file, "external.h5") ) {
+
+                pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_c: 0 != strcmp(file, \"external.h5\")";
+            }
+	    else if ( 0 != strcmp(path, "/ext") ) {
+
+                pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_c: 0 != strcmp(path, \"/ext\")";
+            }
+            HDassert(ret >= 0);
+            HDassert(0 == strcmp(file, "external.h5"));
+            HDassert(0 == strcmp(path, "/ext"));
+
+            free(elinkval);
+        } /* end else */
+
+	u++;
+
+    } /* end while */
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+        if ( ret < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "vrfy_ns_grp_c: H5Gclose() failed.";
+        }
+        assert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ns_grp_c() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ns_grp_d
+ *
+ * Purpose:     Create a dense "new style" group, with 'nlinks' 
+ *		(soft/hard/external) links in it in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+ns_grp_d(hid_t fid, const char *group_name, unsigned nlinks)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    unsigned max_compact;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gcpl = H5Pcreate(H5P_GROUP_CREATE);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Pcreate() failed.";
+	}
+        HDassert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pset_link_creation_order(gcpl, H5P_CRT_ORDER_TRACKED);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Pset_link_creation_order() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, gcpl, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Gcreate2() failed.";
+	}
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        max_compact = 0;
+        ret = H5Pget_link_phase_change(gcpl, &max_compact, NULL);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Pget_link_phase_change() failed.";
+	}
+        else if ( nlinks <= max_compact ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: nlinks <= max_compact";
+	}
+        HDassert(ret >= 0);
+        HDassert(nlinks > max_compact);
+    }
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        char linkname[16];
+
+        sprintf(linkname, "%u", u);
+
+        if(0 == (u % 3)) {
+
+            ret = H5Lcreate_soft(group_name, gid, linkname, 
+                                 H5P_DEFAULT, H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "ns_grp_d: H5Lcreate_soft() failed.";
+	    }
+            HDassert(ret >= 0);
+        } /* end if */
+        else if(1 == (u % 3)) {
+
+            ret = H5Lcreate_hard(fid, "/", gid, linkname, 
+                                 H5P_DEFAULT, H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "ns_grp_d: H5Lcreate_hard() failed.";
+	    }
+            HDassert(ret >= 0);
+        } /* end else-if */
+        else {
+
+            HDassert(2 == (u % 3));
+
+            ret = H5Lcreate_external("external.h5", "/ext", gid, linkname, 
+                                     H5P_DEFAULT, H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "ns_grp_d: H5Lcreate_external() failed.";
+	    }
+            HDassert(ret >= 0);
+        } /* end else */
+
+        u++;
+
+    } /* end while */
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ns_grp_d: H5Gclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ns_grp_d() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ns_grp_d
+ *
+ * Purpose:     Verify a dense "new style" group, with 'nlinks' 
+ *		soft/hard/external links in it in the specified file.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+void
+vrfy_ns_grp_d(hid_t fid, const char *group_name, unsigned nlinks)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    H5G_info_t grp_info;
+    unsigned crt_order_flags = 0;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gid = H5Gopen2(fid, group_name, H5P_DEFAULT);
+
+        if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Gopen2() failed.";
+        }
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        gcpl = H5Gget_create_plist(gid);
+
+        if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Gget_create_plist() failed.";
+        }
+        assert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_link_creation_order(gcpl, &crt_order_flags);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+		"vrfy_ns_grp_d: H5Pget_link_creation_order() failed.";
+        }
+	else if ( H5P_CRT_ORDER_TRACKED != crt_order_flags ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+		"vrfy_ns_grp_d: H5P_CRT_ORDER_TRACKED != crt_order_flags";
+        }
+        HDassert(ret >= 0);
+        HDassert(H5P_CRT_ORDER_TRACKED == crt_order_flags);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        memset(&grp_info, 0, sizeof(grp_info));
+        ret = H5Gget_info(gid, &grp_info);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Gget_info() failed.";
+	}
+	else if ( H5G_STORAGE_TYPE_DENSE != grp_info.storage_type ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	       "vrfy_ns_grp_d: H5G_STORAGE_TYPE_DENSE != grp_info.storage_type";
+	}
+	else if ( nlinks != grp_info.nlinks ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: nlinks != grp_info.nlinks";
+	}
+	else if ( nlinks != grp_info.max_corder ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: nlinks != grp_info.max_corder";
+	}
+	else if ( FALSE != grp_info.mounted ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: FALSE != grp_info.mounted";
+	}
+        HDassert(ret >= 0);
+        HDassert(H5G_STORAGE_TYPE_DENSE == grp_info.storage_type);
+        HDassert(nlinks == grp_info.nlinks);
+        HDassert(nlinks == grp_info.max_corder);
+        HDassert(false == grp_info.mounted);
+    }
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        H5L_info_t lnk_info;
+        char linkname[16];
+        htri_t link_exists;
+
+        sprintf(linkname, "%u", u);
+        link_exists = H5Lexists(gid, linkname, H5P_DEFAULT);
+
+        if ( link_exists < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Lexists() failed.";
+	}
+        HDassert(link_exists >= 0);
+
+        memset(&lnk_info, 0, sizeof(grp_info));
+        ret = H5Lget_info(gid, linkname, &lnk_info, H5P_DEFAULT);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Lget_info() failed.";
+	}
+        else if ( TRUE != lnk_info.corder_valid ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: TRUE != lnk_info.corder_valid";
+	}
+	else if ( u != lnk_info.corder ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: u != lnk_info.corder";
+	}
+	else if ( H5T_CSET_ASCII != lnk_info.cset ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5T_CSET_ASCII != lnk_info.cset";
+	}
+        HDassert(ret >= 0);
+        HDassert(true == lnk_info.corder_valid);
+        HDassert(u == lnk_info.corder);
+        HDassert(H5T_CSET_ASCII == lnk_info.cset);
+
+        if(0 == (u % 3)) {
+            char *slinkval;
+
+	    if ( H5L_TYPE_SOFT != lnk_info.type ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: H5L_TYPE_SOFT != lnk_info.type";
+	    }
+	    else if ( (strlen(group_name) + 1) != lnk_info.u.val_size ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: H5L_TYPE_SOFT != lnk_info.type";
+	    }
+            HDassert(H5L_TYPE_SOFT == lnk_info.type);
+            HDassert((strlen(group_name) + 1) == lnk_info.u.val_size);
+
+            slinkval = (char *)malloc(lnk_info.u.val_size);
+
+	    if ( ! slinkval ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: malloc of slinkval failed";
+	    }
+            HDassert(slinkval);
+
+            ret = H5Lget_val(gid, linkname, slinkval, lnk_info.u.val_size, 
+                             H5P_DEFAULT);
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: H5Lget_val() failed";
+	    }
+	    else if ( 0 != strcmp(slinkval, group_name) ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+		    "vrfy_ns_grp_d: 0 != strcmp(slinkval, group_name)";
+	    }
+            HDassert(ret >= 0);
+            HDassert(0 == strcmp(slinkval, group_name));
+
+            free(slinkval);
+        } /* end if */
+        else if(1 == (u % 3)) {
+            H5O_info_t root_oinfo;
+
+	    if ( H5L_TYPE_HARD != lnk_info.type ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: H5L_TYPE_HARD != lnk_info.type";
+	    }
+            HDassert(H5L_TYPE_HARD == lnk_info.type);
+
+            memset(&root_oinfo, 0, sizeof(root_oinfo));
+            ret = H5Oget_info(fid, &root_oinfo);
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: H5Oget_info() failed.";
+	    }
+	    else if ( root_oinfo.addr != lnk_info.u.address ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+		    "vrfy_ns_grp_d: root_oinfo.addr != lnk_info.u.address";
+	    }
+            HDassert(ret >= 0);
+            HDassert(root_oinfo.addr == lnk_info.u.address);
+        } /* end else-if */
+        else {
+            void *elinkval;
+            const char *file = NULL;
+            const char *path = NULL;
+
+            HDassert(2 == (u % 3));
+
+	    if ( H5L_TYPE_EXTERNAL != lnk_info.type ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+		    "vrfy_ns_grp_d: H5L_TYPE_EXTERNAL != lnk_info.type";
+	    }
+            HDassert(H5L_TYPE_EXTERNAL == lnk_info.type);
+
+            elinkval = malloc(lnk_info.u.val_size);
+
+	    if ( ! elinkval ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ns_grp_d: malloc of elinkval failed.";
+	    }
+            HDassert(elinkval);
+
+            ret = H5Lget_val(gid, linkname, elinkval, lnk_info.u.val_size, 
+                             H5P_DEFAULT);
+	    if ( ret < 0 ) {
+
+		pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_d: H5Lget_val failed.";
+            }
+            HDassert(ret >= 0);
+
+            ret = H5Lunpack_elink_val(elinkval, lnk_info.u.val_size, NULL, 
+				      &file, &path);
+	    if ( ret < 0 ) {
+
+		pass = FALSE;
+                failure_mssg = "vrfy_ns_grp_d: H5Lunpack_elink_val failed.";
+            }
+	    else if ( 0 != strcmp(file, "external.h5") ) {
+
+		pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_d: 0 != strcmp(file, \"external.h5\").";
+            }
+	    else if ( 0 != strcmp(path, "/ext") ) {
+
+		pass = FALSE;
+                failure_mssg = 
+		    "vrfy_ns_grp_d: 0 != strcmp(path, \"/ext\")";
+	    }
+            HDassert(ret >= 0);
+            HDassert(0 == strcmp(file, "external.h5"));
+            HDassert(0 == strcmp(path, "/ext"));
+
+            free(elinkval);
+
+        } /* end else */
+
+	u++;
+
+    } /* end while() */
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ns_grp_d: H5Gclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ns_grp_d() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    os_grp_0
+ *
+ * Purpose:     Create an empty "old style" group.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+os_grp_0(hid_t fid, const char *group_name)
+{
+    hid_t gid = -1;
+    herr_t ret;
+
+    if ( pass ) { /* turn file format latest off */
+
+	ret = H5Fset_latest_format(fid, FALSE);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_0: H5Fset_latest_format() failed(1).";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, H5P_DEFAULT, 
+                         H5P_DEFAULT);
+        if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_0: H5Gcreate2() failed.";
+	}
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_0: H5Gclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) { /* turn file format latest on */
+
+	ret = H5Fset_latest_format(fid, TRUE);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_0: H5Fset_latest_format() failed(2).";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* os_grp_0() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_os_grp_0
+ *
+ * Purpose:     Validate an empty "old style" group.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+vrfy_os_grp_0(hid_t fid, const char *group_name)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    H5G_info_t grp_info;
+    unsigned crt_order_flags = 0;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gid = H5Gopen2(fid, group_name, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Gopen2() failed.";
+	}
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        gcpl = H5Gget_create_plist(gid);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Gget_create_plist() failed.";
+	}
+        HDassert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_link_creation_order(gcpl, &crt_order_flags);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Pget_link_creation_order() failed";
+	}
+	else if ( 0 != crt_order_flags ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: 0 != crt_order_flags";
+	}
+        HDassert(ret >= 0);
+        HDassert(0 == crt_order_flags);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        memset(&grp_info, 0, sizeof(grp_info));
+        ret = H5Gget_info(gid, &grp_info);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Gget_info() failed.";
+	}
+	else if ( H5G_STORAGE_TYPE_SYMBOL_TABLE != grp_info.storage_type ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5G_STORAGE_TYPE_SYMBOL_TABLE != grp_info.storage_type";
+	}
+	else if ( 0 != grp_info.nlinks ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: 0 != grp_info.nlinks";
+	}
+	else if ( 0 != grp_info.max_corder ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: 0 != grp_info.max_corder";
+	}
+	else if ( FALSE != grp_info.mounted ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: FALSE != grp_info.mounted";
+	}
+        HDassert(ret >= 0);
+        HDassert(H5G_STORAGE_TYPE_SYMBOL_TABLE == grp_info.storage_type);
+        HDassert(0 == grp_info.nlinks);
+        HDassert(0 == grp_info.max_corder);
+        HDassert(false == grp_info.mounted);
+    }
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_0: H5Gclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_os_grp_0() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    os_grp_n
+ *
+ * Purpose:     Create an "old style" group, with 'nlinks' soft/hard 
+ *		links in it.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void 
+os_grp_n(hid_t fid, const char *group_name, int proc_num, unsigned nlinks)
+{
+    hid_t gid = -1;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) { /* turn file format latest off */
+
+	ret = H5Fset_latest_format(fid, FALSE);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_n: H5Fset_latest_format() failed(1).";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, H5P_DEFAULT, 
+                         H5P_DEFAULT);
+        if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_n: H5Gcreate2() failed.";
+        }
+        HDassert(gid > 0);
+    }
+
+    HDassert(nlinks > 0);
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        char linkname[32];
+
+        sprintf(linkname, "ln%d_%u", proc_num, u);
+
+        if(0 == (u % 2)) {
+
+            ret = H5Lcreate_soft(group_name, gid, linkname, H5P_DEFAULT, 
+                                 H5P_DEFAULT);
+            if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "os_grp_n: H5Lcreate_soft() failed.";
+            }
+            HDassert(ret >= 0);
+        } /* end if */
+        else {
+
+            HDassert(1 == (u % 2));
+
+            ret = H5Lcreate_hard(fid, "/", gid, linkname, H5P_DEFAULT, 
+                                 H5P_DEFAULT);
+            if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "os_grp_n: H5Lcreate_hard() failed.";
+            }
+            HDassert(ret >= 0);
+        } /* end else */
+
+	u++;
+
+    } /* end while */
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_n: H5Gclose() failed.";
+        }
+        assert(ret >= 0);
+    }
+
+    if ( pass ) { /* turn file format latest on */
+
+	ret = H5Fset_latest_format(fid, TRUE);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "os_grp_n: H5Fset_latest_format() failed(2).";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+} /* os_grp_n() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_os_grp_n
+ *
+ * Purpose:     Validate an "old style" group with 'nlinks' soft/hard
+ *              links in it.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+vrfy_os_grp_n(hid_t fid, const char *group_name, int proc_num, unsigned nlinks)
+{
+    hid_t gid = -1;
+    hid_t gcpl = -1;
+    H5G_info_t grp_info;
+    unsigned crt_order_flags = 0;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        gid = H5Gopen2(fid, group_name, H5P_DEFAULT);
+
+	if ( gid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Gopen2() failed";
+	}
+        HDassert(gid > 0);
+    }
+
+    if ( pass ) {
+
+        gcpl = H5Gget_create_plist(gid);
+
+	if ( gcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Gget_create_plist() failed";
+	}
+        HDassert(gcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_link_creation_order(gcpl, &crt_order_flags);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Pget_link_creation_order";
+	}
+	else if ( 0 != crt_order_flags ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: 0 != crt_order_flags";
+	}
+        HDassert(ret >= 0);
+        HDassert(0 == crt_order_flags);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(gcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Pclose() failed";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        memset(&grp_info, 0, sizeof(grp_info));
+
+        ret = H5Gget_info(gid, &grp_info);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Gget_info() failed";
+	}
+	else if ( H5G_STORAGE_TYPE_SYMBOL_TABLE != grp_info.storage_type ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	"vrfy_os_grp_n: H5G_STORAGE_TYPE_SYMBOL_TABLE != grp_info.storage_type";
+	}
+	else if ( nlinks != grp_info.nlinks ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: nlinks != grp_info.nlinks";
+	}
+	else if ( 0 != grp_info.max_corder ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: 0 != grp_info.max_corder";
+	}
+	else if ( FALSE != grp_info.mounted ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: FALSE != grp_info.mounted";
+	}
+        HDassert(ret >= 0);
+        HDassert(H5G_STORAGE_TYPE_SYMBOL_TABLE == grp_info.storage_type);
+        HDassert(nlinks == grp_info.nlinks);
+        HDassert(0 == grp_info.max_corder);
+        HDassert(false == grp_info.mounted);
+    }
+
+    u = 0;
+    while ( ( pass ) && ( u < nlinks ) ) {
+
+        H5L_info_t lnk_info;
+        char linkname[32];
+        htri_t link_exists;
+
+        sprintf(linkname, "ln%d_%u", proc_num, u);
+        link_exists = H5Lexists(gid, linkname, H5P_DEFAULT);
+
+	if ( link_exists < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Lexists() failed";
+        }
+        HDassert(link_exists >= 0);
+
+        memset(&lnk_info, 0, sizeof(grp_info));
+        ret = H5Lget_info(gid, linkname, &lnk_info, H5P_DEFAULT);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Lget_info() failed";
+        }
+	else if ( FALSE != lnk_info.corder_valid ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: FALSE != lnk_info.corder_valid";
+        }
+	else if ( H5T_CSET_ASCII != lnk_info.cset ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5T_CSET_ASCII != lnk_info.cset";
+        }
+        HDassert(ret >= 0);
+        HDassert(false == lnk_info.corder_valid);
+        HDassert(H5T_CSET_ASCII == lnk_info.cset);
+
+        if(0 == (u % 2)) {
+            char *slinkval;
+
+	    if ( H5L_TYPE_SOFT != lnk_info.type ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_os_grp_n: H5L_TYPE_SOFT != lnk_info.type";
+            }
+	    else if ( (strlen(group_name) + 1) != lnk_info.u.val_size ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+	    "vrfy_os_grp_n: (strlen(group_name) + 1) != lnk_info.u.val_size";
+            }
+            HDassert(H5L_TYPE_SOFT == lnk_info.type);
+            HDassert((strlen(group_name) + 1) == lnk_info.u.val_size);
+
+            slinkval = (char *)malloc(lnk_info.u.val_size);
+
+	    if ( ! slinkval ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_os_grp_n: malloc of slinkval failed";
+            }
+            HDassert(slinkval);
+
+            ret = H5Lget_val(gid, linkname, slinkval, lnk_info.u.val_size, 
+                             H5P_DEFAULT);
+
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_os_grp_n: H5Lget_val() failed";
+            }
+	    else if ( 0 != strcmp(slinkval, group_name) ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+		    "vrfy_os_grp_n: 0 != strcmp(slinkval, group_name)";
+            }
+            HDassert(ret >= 0);
+            HDassert(0 == strcmp(slinkval, group_name));
+
+            free(slinkval);
+        } /* end if */
+        else {
+            H5O_info_t root_oinfo;
+
+            HDassert(1 == (u % 2));
+
+	    if ( H5L_TYPE_HARD != lnk_info.type ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_os_grp_n: H5L_TYPE_HARD != lnk_info.type";
+            }
+            HDassert(H5L_TYPE_HARD == lnk_info.type);
+
+            memset(&root_oinfo, 0, sizeof(root_oinfo));
+            ret = H5Oget_info(fid, &root_oinfo);
+
+	    if ( ret < 0 ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_os_grp_n: H5Oget_info() failed.";
+            }
+	    else if ( root_oinfo.addr != lnk_info.u.address ) {
+
+	        pass = FALSE;
+	        failure_mssg = 
+		    "vrfy_os_grp_n: root_oinfo.addr != lnk_info.u.address";
+            }
+            HDassert(ret >= 0);
+            HDassert(root_oinfo.addr == lnk_info.u.address);
+        } /* end else */
+
+	u++;
+
+    } /* end while */
+
+    if ( pass ) {
+
+        ret = H5Gclose(gid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_os_grp_n: H5Gclose() failed.";
+        }
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_os_grp_n() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ds_ctg_i
+ *
+ * Purpose:     Create a contiguous dataset w/int datatype.  Write data
+ *		to the data set or not as indicated by the write_data 
+ *		parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+ds_ctg_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *wdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hsize_t dims[1] = {DSET_DIMS};
+    herr_t ret;
+
+    if ( pass ) {
+
+        sid = H5Screate_simple(1, dims, NULL);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: H5Screate_simple() failed";
+        }
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        dsid = H5Dcreate2(fid, dset_name, H5T_NATIVE_INT, sid, H5P_DEFAULT, 
+			  H5P_DEFAULT, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: H5Dcreate2() failed";
+        }
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: H5Sclose() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        wdata = (int *)malloc(sizeof(int) * DSET_DIMS);
+
+	if ( ! wdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: malloc of wdata failed.";
+        }
+        HDassert(wdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_DIMS; u++)
+
+            wdata[u] = (int)u;
+
+        ret = H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+                       H5P_DEFAULT, wdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: H5Dwrite() failed.";
+        }
+        HDassert(ret >= 0);
+
+        free(wdata);
+    } 
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_i: H5Dclose() failed";
+        }
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ds_ctg_i */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ds_ctg_i
+ *
+ * Purpose:     Validate a contiguous datasets w/int datatypes. Validate 
+ *		data if indicated via the write_data parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+vrfy_ds_ctg_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *rdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    H5D_space_status_t allocation;
+    H5D_layout_t layout;
+    int ndims;
+    hsize_t dims[1], max_dims[1];
+    htri_t type_equal;
+    herr_t ret;
+
+    if ( pass ) {
+
+        dsid = H5Dopen2(fid, dset_name, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dopen2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        sid = H5Dget_space(dsid);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dget_space() failed.";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        ndims = H5Sget_simple_extent_ndims(sid);
+
+	if ( 1 != ndims ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: 1 != ndims";
+	}
+        HDassert(1 == ndims);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sget_simple_extent_dims(sid, dims, max_dims);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Sget_simple_extent_dims() failed";
+	}
+	else if ( DSET_DIMS != dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: DSET_DIMS != dims[0]";
+	}
+	else if ( DSET_DIMS != max_dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: DSET_DIMS != max_dims[0]";
+	}
+        HDassert(ret >= 0);
+        HDassert(DSET_DIMS == dims[0]);
+        HDassert(DSET_DIMS == max_dims[0]);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        tid = H5Dget_type(dsid);
+
+	if ( tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dget_type() failed.";
+	}
+        HDassert(tid > 0);
+    }
+
+    if ( pass ) {
+
+        type_equal = H5Tequal(tid, H5T_NATIVE_INT);
+
+	if ( 1 != type_equal ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: type not H5T_NATIVE_INT";
+	}
+        HDassert(1 == type_equal);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Tclose() failed.";
+	}
+        assert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dget_space_status(dsid, &allocation);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dget_space_status() failed.";
+	}
+	else if ( write_data && ( allocation != H5D_SPACE_STATUS_ALLOCATED ) ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	"vrfy_ds_ctg_i: write_data && allocation != H5D_SPACE_STATUS_ALLOCATED";
+	}
+	else if ( !write_data && 
+                  ( allocation != H5D_SPACE_STATUS_NOT_ALLOCATED ) ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: !write_data && allocation != H5D_SPACE_STATUS_NOT_ALLOCATED";
+	}
+        HDassert(ret >= 0);
+        HDassert((write_data && allocation == H5D_SPACE_STATUS_ALLOCATED) ||
+                 (!write_data && allocation == H5D_SPACE_STATUS_NOT_ALLOCATED));
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Dget_create_plist(dsid);
+
+	if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dget_create_plist() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        layout = H5Pget_layout(dcpl);
+
+	if ( H5D_CONTIGUOUS != layout ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5D_CONTIGUOUS != layout";
+	}
+        HDassert(H5D_CONTIGUOUS == layout);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        rdata = (int *)malloc(sizeof(int) * DSET_DIMS);
+
+	if ( ! rdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: malloc of rdata failed.";
+	}
+        HDassert(rdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dread(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+                      H5P_DEFAULT, rdata);
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dread() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_DIMS; u++) {
+
+	    if ( (int)u != rdata[u] ) {
+
+		pass = FALSE;
+		failure_mssg = "vrfy_ds_ctg_i: u != rdata[u].";
+		break;
+	    }
+            HDassert((int)u == rdata[u]);
+	}
+
+        free(rdata);
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_i: H5Dclose() failed";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ds_ctg_i() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ds_chk_i
+ *
+ * Purpose:     Create a chunked dataset w/int datatype.  Write data
+ *		to the data set or not as indicated by the write_data 
+ *		parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+ds_chk_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *wdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t dcpl = -1;
+    hid_t sid = -1;
+    hsize_t dims[1] = {DSET_DIMS};
+    hsize_t chunk_dims[1] = {DSET_CHUNK_DIMS};
+    herr_t ret;
+
+    if ( pass ) {
+
+        sid = H5Screate_simple(1, dims, NULL);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Screate_simple() failed.";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+	if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Pcreate() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pset_chunk(dcpl, 1, chunk_dims);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Pset_chunk() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        dsid = H5Dcreate2(fid, dset_name, H5T_NATIVE_INT, sid, 
+                          H5P_DEFAULT, dcpl, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Dcreate2() failed";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        wdata = (int *)malloc(sizeof(int) * DSET_DIMS);
+
+	if ( ! wdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: malloc of wdata failed.";
+	}
+        HDassert(wdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_DIMS; u++)
+            wdata[u] = (int)u;
+
+        ret = H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+                       H5P_DEFAULT, wdata);
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Dwrite() failed.";
+	}
+        HDassert(ret >= 0);
+
+        free(wdata);
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_chk_i: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ds_chk_i */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ds_chk_i
+ *
+ * Purpose:     Validate a chunked datasets w/int datatypes. Validate 
+ *		data if indicated via the write_data parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+vrfy_ds_chk_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *rdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    H5D_space_status_t allocation;
+    H5D_layout_t layout;
+    int ndims;
+    hsize_t dims[1], max_dims[1], chunk_dims[1];
+    htri_t type_equal;
+    herr_t ret;
+
+    if ( pass ) {
+
+        dsid = H5Dopen2(fid, dset_name, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dopen2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        sid = H5Dget_space(dsid);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dget_space() failed.";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        ndims = H5Sget_simple_extent_ndims(sid);
+
+	if ( 1 != ndims ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: 1 != ndims";
+	}
+        HDassert(1 == ndims);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sget_simple_extent_dims(sid, dims, max_dims);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Sget_simple_extent_dims() failed";
+	}
+	else if ( DSET_DIMS != dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: DSET_DIMS != dims[0]";
+	}
+	else if ( DSET_DIMS != max_dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: DSET_DIMS != max_dims[0]";
+	}
+        HDassert(ret >= 0);
+        HDassert(DSET_DIMS == dims[0]);
+        HDassert(DSET_DIMS == max_dims[0]);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        tid = H5Dget_type(dsid);
+
+	if ( tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dget_type() failed.";
+	}
+        HDassert(tid > 0);
+    }
+
+    if ( pass ) {
+
+        type_equal = H5Tequal(tid, H5T_NATIVE_INT);
+
+	if ( 1 != type_equal ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: tid != H5T_NATIVE_INT";
+	}
+        HDassert(1 == type_equal);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Tclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dget_space_status(dsid, &allocation);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dget_space_status() failed.";
+	}
+	else if ( write_data && ( allocation != H5D_SPACE_STATUS_ALLOCATED ) ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	"vrfy_ds_chk_i: write_data && allocation != H5D_SPACE_STATUS_ALLOCATED";
+	}
+	else if ( !write_data && 
+                  ( allocation != H5D_SPACE_STATUS_NOT_ALLOCATED ) ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: !write_data && allocation != H5D_SPACE_STATUS_NOT_ALLOCATED";
+	}
+        HDassert(ret >= 0);
+        HDassert((write_data && allocation == H5D_SPACE_STATUS_ALLOCATED) ||
+                 (!write_data && allocation == H5D_SPACE_STATUS_NOT_ALLOCATED));
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Dget_create_plist(dsid);
+
+	if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dget_create_plist() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        layout = H5Pget_layout(dcpl);
+
+	if ( H5D_CHUNKED != layout ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5D_CHUNKED != layout";
+	}
+        HDassert(H5D_CHUNKED == layout);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pget_chunk(dcpl, 1, chunk_dims);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Pget_chunk";
+	}
+	else if ( DSET_CHUNK_DIMS != chunk_dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: ";
+	}
+        HDassert(ret >= 0);
+        HDassert(DSET_CHUNK_DIMS == chunk_dims[0]);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        rdata = (int *)malloc(sizeof(int) * DSET_DIMS);
+
+	if ( ! rdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: malloc of rdata failed.";
+	}
+        HDassert(rdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dread(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, 
+                      rdata);
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dread() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_DIMS; u++) {
+
+	    if ( (int)u != rdata[u] ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ds_chk_i: u != rdata[u]";
+		break;
+	    }
+            HDassert((int)u == rdata[u]);
+        }
+
+        free(rdata);
+    } /* end if */
+
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_chk_i: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ds_chk_i() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ds_cpt_i
+ *
+ * Purpose:     Create a compact dataset w/int datatype.  Write data
+ *		to the data set or not as indicated by the write_data 
+ *		parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+ds_cpt_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *wdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t dcpl = -1;
+    hid_t sid = -1;
+    hsize_t dims[1] = {DSET_COMPACT_DIMS};
+    herr_t ret;
+
+    if ( pass ) {
+
+        sid = H5Screate_simple(1, dims, NULL);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Screate_simple() failed.";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+	if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Pcreate() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pset_layout(dcpl, H5D_COMPACT);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Pset_layout() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        dsid = H5Dcreate2(fid, dset_name, H5T_NATIVE_INT, sid, 
+                          H5P_DEFAULT, dcpl, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Dcreate2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        wdata = (int *)malloc(sizeof(int) * DSET_COMPACT_DIMS);
+
+	if ( ! wdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: malloc of wdata failed.";
+	}
+        HDassert(wdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_COMPACT_DIMS; u++)
+            wdata[u] = (int)u;
+
+        ret = H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+                       H5P_DEFAULT, wdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Dwrite() failed.";
+	}
+        HDassert(ret >= 0);
+
+        free(wdata);
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_cpt_i: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ds_cpt_i() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ds_cpt_i
+ *
+ * Purpose:     Validate a compact datasets w/int datatypes. Validate 
+ *		data if indicated via the write_data parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+vrfy_ds_cpt_i(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    int *rdata = NULL;
+    unsigned u;
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    H5D_space_status_t allocation;
+    H5D_layout_t layout;
+    int ndims;
+    hsize_t dims[1], max_dims[1];
+    htri_t type_equal;
+    herr_t ret;
+
+    if ( pass ) {
+
+        dsid = H5Dopen2(fid, dset_name, H5P_DEFAULT);
+
+        if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dopen2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        sid = H5Dget_space(dsid);
+
+        if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dget_space() failed.";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        ndims = H5Sget_simple_extent_ndims(sid);
+
+        if ( 1 != ndims ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: 1 != ndims";
+	}
+        HDassert(1 == ndims);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sget_simple_extent_dims(sid, dims, max_dims);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Sget_simple_extent_dims() failed";
+	}
+        else if ( DSET_COMPACT_DIMS != dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: DSET_COMPACT_DIMS != dims[0]";
+	}
+        else if ( DSET_COMPACT_DIMS != max_dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: DSET_COMPACT_DIMS != max_dims[0]";
+	}
+        HDassert(ret >= 0);
+        HDassert(DSET_COMPACT_DIMS == dims[0]);
+        HDassert(DSET_COMPACT_DIMS == max_dims[0]);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        tid = H5Dget_type(dsid);
+
+        if ( tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dget_type() failed.";
+	}
+        HDassert(tid > 0);
+    }
+
+    if ( pass ) {
+
+        type_equal = H5Tequal(tid, H5T_NATIVE_INT);
+
+        if ( 1 != type_equal ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: type != H5T_NATIVE_INT";
+	}
+        HDassert(1 == type_equal);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tid);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Tclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dget_space_status(dsid, &allocation);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dget_space_status() failed.";
+	}
+        else if ( H5D_SPACE_STATUS_ALLOCATED != allocation ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	        "vrfy_ds_cpt_i: H5D_SPACE_STATUS_ALLOCATED != allocation";
+	}
+        HDassert(ret >= 0);
+        HDassert(H5D_SPACE_STATUS_ALLOCATED == allocation);
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Dget_create_plist(dsid);
+
+        if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dget_create_plist() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        layout = H5Pget_layout(dcpl);
+
+        if ( H5D_COMPACT != layout ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5D_COMPACT != layout";
+	}
+        HDassert(H5D_COMPACT == layout);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+     }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        rdata = (int *)malloc(sizeof(int) * DSET_COMPACT_DIMS);
+
+        if ( ! rdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: malloc of rdata failed.";
+	}
+        HDassert(rdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dread(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+                      H5P_DEFAULT, rdata);
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dread() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_COMPACT_DIMS; u++) {
+
+            if ( (int)u != rdata[u] ) {
+
+	        pass = FALSE;
+	        failure_mssg = "vrfy_ds_cpt_i: (int)u != rdata[u]";
+		break;
+	    }
+            HDassert((int)u == rdata[u]);
+        }
+
+        free(rdata);
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+        if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_cpt_i: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ds_cpt_i() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    ds_ctg_v
+ *
+ * Purpose:     Create a contiguous dataset w/variable-length datatype.  
+ *		Write data to the data set or not as indicated by the 
+ *		write_data parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+ds_ctg_v(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hid_t tid = -1;
+    hsize_t dims[1] = {DSET_SMALL_DIMS};
+    herr_t ret;
+    hvl_t *wdata = NULL;
+    unsigned u;
+
+    if ( pass ) {
+
+        sid = H5Screate_simple(1, dims, NULL);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Screate_simple";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        tid = H5Tvlen_create(H5T_NATIVE_INT);
+
+	if ( tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Tvlen_create() failed.";
+	}
+        HDassert(tid > 0);
+    }
+
+    if ( pass ) {
+
+        dsid = H5Dcreate2(fid, dset_name, tid, sid, H5P_DEFAULT, 
+                          H5P_DEFAULT, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Dcreate2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        wdata = (hvl_t *)malloc(sizeof(hvl_t) * DSET_SMALL_DIMS);
+
+	if ( ! wdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: malloc of wdata failed.";
+	}
+        HDassert(wdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_SMALL_DIMS; u++) {
+
+            int *tdata;
+            unsigned len;
+            unsigned v;
+
+            len = (u % 10) + 1;
+            tdata = (int *)malloc(sizeof(int) * len);
+
+	    if ( !tdata ) {
+
+	        pass = FALSE;
+	        failure_mssg = "ds_ctg_v: malloc of tdata failed.";
+		break;
+	    }
+            HDassert(tdata);
+
+            for(v = 0; v < len; v++)
+                tdata[v] = (int)(u + v);
+
+           wdata[u].len = len;
+           wdata[u].p = tdata;
+        } /* end for */
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dwrite(dsid, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Dwrite() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, wdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Dvlen_reclaim() failed.";
+	}
+        HDassert(ret >= 0);
+
+        free(wdata);
+
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( sid < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tid);
+
+	if ( tid < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Tclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "ds_ctg_v: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* ds_ctg_v() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    vrfy_ds_ctg_v
+ *
+ * Purpose:     Validate a contiguous datasets w/variable-length datatypes. 
+ *		Validate data if indicated via the write_data parameter.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void 
+vrfy_ds_ctg_v(hid_t fid, const char *dset_name, hbool_t write_data)
+{
+    hid_t dsid = -1;
+    hid_t sid = -1;
+    hid_t tid = -1;
+    hid_t tmp_tid = -1;
+    hid_t dcpl = -1;
+    H5D_space_status_t allocation;
+    H5D_layout_t layout;
+    int ndims;
+    hsize_t dims[1], max_dims[1];
+    htri_t type_equal;
+    hvl_t *rdata = NULL;
+    unsigned u;
+    herr_t ret;
+
+    if ( pass ) {
+
+        dsid = H5Dopen2(fid, dset_name, H5P_DEFAULT);
+
+	if ( dsid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dopen2() failed.";
+	}
+        HDassert(dsid > 0);
+    }
+
+    if ( pass ) {
+
+        sid = H5Dget_space(dsid);
+
+	if ( sid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dget_space() failed";
+	}
+        HDassert(sid > 0);
+    }
+
+    if ( pass ) {
+
+        ndims = H5Sget_simple_extent_ndims(sid);
+
+	if ( 1 != ndims ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: 1 != ndims";
+	}
+        HDassert(1 == ndims);
+    }
+
+    if ( pass ) {
+
+        ret = H5Sget_simple_extent_dims(sid, dims, max_dims);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Sget_simple_extent_dims() failed.";
+	}
+	else if ( DSET_SMALL_DIMS != dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: DSET_SMALL_DIMS != dims[0]";
+	}
+	else if ( DSET_SMALL_DIMS != max_dims[0] ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: DSET_SMALL_DIMS != max_dims[0]";
+	}
+        HDassert(ret >= 0);
+        HDassert(DSET_SMALL_DIMS == dims[0]);
+        HDassert(DSET_SMALL_DIMS == max_dims[0]);
+    }
+
+    if ( pass ) {
+
+        tid = H5Dget_type(dsid);
+
+	if ( tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dget_type() failed.";
+	}
+        HDassert(tid > 0);
+    }
+
+    if ( pass ) {
+
+        tmp_tid = H5Tvlen_create(H5T_NATIVE_INT);
+
+	if ( tmp_tid <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Tvlen_create() failed.";
+	}
+        HDassert(tmp_tid > 0);
+    }
+
+    if ( pass ) {
+
+        type_equal = H5Tequal(tid, tmp_tid);
+
+	if ( 1 != type_equal ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: type != vlen H5T_NATIVE_INT";
+	}
+        HDassert(1 == type_equal);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tmp_tid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Tclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dget_space_status(dsid, &allocation);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dget_space_status() failed";
+	}
+	else if ( write_data && (allocation != H5D_SPACE_STATUS_ALLOCATED) ) {
+
+	    pass = FALSE;
+	    failure_mssg = 
+	"vrfy_ds_ctg_v: write_data && allocation != H5D_SPACE_STATUS_ALLOCATED";
+	}
+	else if ( !write_data && 
+                  ( allocation != H5D_SPACE_STATUS_NOT_ALLOCATED ) ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: !write_data && allocation != H5D_SPACE_STATUS_NOT_ALLOCATED";
+	}
+        HDassert(ret >= 0);
+        HDassert((write_data && allocation == H5D_SPACE_STATUS_ALLOCATED) ||
+                 (!write_data && allocation == H5D_SPACE_STATUS_NOT_ALLOCATED));
+    }
+
+    if ( pass ) {
+
+        dcpl = H5Dget_create_plist(dsid);
+
+	if ( dcpl <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dget_create_plist() failed.";
+	}
+        HDassert(dcpl > 0);
+    }
+
+    if ( pass ) {
+
+        layout = H5Pget_layout(dcpl);
+
+	if ( H5D_CONTIGUOUS != layout ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5D_CONTIGUOUS != layout";
+	}
+        HDassert(H5D_CONTIGUOUS == layout);
+    }
+
+    if ( pass ) {
+
+        ret = H5Pclose(dcpl);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Pclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        rdata = (hvl_t *)malloc(sizeof(hvl_t) * DSET_SMALL_DIMS);
+
+	if ( !rdata ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: malloc of rdata failed.";
+	}
+        HDassert(rdata);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dread(dsid, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dread() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        for(u = 0; u < DSET_SMALL_DIMS; u++) {
+            unsigned len;
+            unsigned v;
+
+            len = (unsigned)rdata[u].len;
+            for(v = 0; v < len; v++) {
+                int *tdata = (int *)rdata[u].p;
+
+	        if ( !tdata ) {
+
+	            pass = FALSE;
+	            failure_mssg = "vrfy_ds_ctg_v: !tdata";
+		    break;
+	        }
+		else if ( (int)(u + v) != tdata[v] ) {
+
+	            pass = FALSE;
+	            failure_mssg = "vrfy_ds_ctg_v: (int)(u + v) != tdata[v]";
+		    break;
+	        }
+                HDassert(tdata);
+                HDassert((int)(u + v) == tdata[v]);
+            } /* end for */
+        } /* end for */
+    }
+
+    if ( ( pass ) && ( write_data ) ) {
+
+        ret = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dvlen_reclaim() failed.";
+	}
+        HDassert(ret >= 0);
+
+        free(rdata);
+    } /* end if */
+
+    if ( pass ) {
+
+        ret = H5Sclose(sid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Sclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Tclose(tid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Tclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    if ( pass ) {
+
+        ret = H5Dclose(dsid);
+
+	if ( ret < 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "vrfy_ds_ctg_v: H5Dclose() failed.";
+	}
+        HDassert(ret >= 0);
+    }
+
+    return;
+
+} /* vrfy_ds_ctg_v() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_zoo
+ *
+ * Purpose:     Given the path to a group, construct a variety of HDF5
+ *              data sets, groups, and other objects selected so as to
+ *              include instances of all on disk data structures used
+ *              in the HDF5 library.
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ *              This function was initially created to assist in testing
+ *              the cache image feature of the metadata cache.  Thus, it
+ *              only concerns itself with the version 2 superblock, and
+ *              on disk structures that can occur with this version of
+ *              the superblock.
+ *
+ *              Note the associated validate_zoo() function.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+create_zoo(hid_t fid, const char *base_path, int proc_num)
+{
+    char full_path[1024];
+
+    HDassert(base_path);
+
+    /* Add & verify an empty "new style" group */
+    if ( pass ) {
+        sprintf(full_path, "%s/A", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ns_grp_0(fid, full_path);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/A", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_0(fid, full_path);
+    }
+
+    /* Add & verify a compact "new style" group (3 link messages) */
+    if ( pass ) {
+	sprintf(full_path, "%s/B", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ns_grp_c(fid, full_path, 3);
+    }
+
+    if ( pass ) {
+	sprintf(full_path, "%s/B", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_c(fid, full_path, 3);
+    }
+
+    /* Add & verify a dense "new style" group (w/300 links, in v2 B-tree & 
+     * fractal heap)
+     */
+    if ( pass ) {
+	sprintf(full_path, "%s/C", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ns_grp_d(fid, full_path, 300);
+    }
+
+    if ( pass ) {
+	sprintf(full_path, "%s/C", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_d(fid, full_path, 300);
+    }
+
+    /* Add & verify an empty "old style" group to file */
+    if ( pass ) {
+        sprintf(full_path, "%s/D", base_path);
+        HDassert(strlen(full_path) < 1024);
+        os_grp_0(fid, full_path);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/D", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_os_grp_0(fid, full_path);
+    }
+
+    /* Add & verify an "old style" group (w/300 links, in v1 B-tree & 
+     * local heap) to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/E", base_path);
+        HDassert(strlen(full_path) < 1024);
+        os_grp_n(fid, full_path, proc_num, 300);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/E", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_os_grp_n(fid, full_path, proc_num, 300);
+    }
+
+    /* Add & verify a contiguous dataset w/integer datatype (but no data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/F", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_ctg_i(fid, full_path, FALSE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/F", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_i(fid, full_path, FALSE);
+    }
+
+    /* Add & verify a contiguous dataset w/integer datatype (with data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/G", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_ctg_i(fid, full_path, TRUE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/G", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_i(fid, full_path, TRUE);
+    }
+
+    /* Add & verify a chunked dataset w/integer datatype (but no data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/H", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_chk_i(fid, full_path, FALSE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/H", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_chk_i(fid, full_path, FALSE);
+    }
+
+    /* Add & verify a chunked dataset w/integer datatype (and data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/I", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_chk_i(fid, full_path, TRUE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/I", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_chk_i(fid, full_path, TRUE);
+    }
+
+    /* Add & verify a compact dataset w/integer datatype (but no data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/J", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_cpt_i(fid, full_path, FALSE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/J", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_cpt_i(fid, full_path, FALSE);
+    }
+
+    /* Add & verify a compact dataset w/integer datatype (and data) 
+     * to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/K", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_cpt_i(fid, full_path, TRUE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/K", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_cpt_i(fid, full_path, TRUE);
+    }
+
+    /* Add & verify a contiguous dataset w/variable-length datatype 
+     * (but no data) to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/L", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_ctg_v(fid, full_path, FALSE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/L", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_v(fid, full_path, FALSE);
+    }
+
+    /* Add & verify a contiguous dataset w/variable-length datatype 
+     * (and data) to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/M", base_path);
+        HDassert(strlen(full_path) < 1024);
+        ds_ctg_v(fid, full_path, TRUE);
+    }
+
+    if ( pass ) {
+        sprintf(full_path, "%s/M", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_v(fid, full_path, TRUE);
+    }
+
+    return;
+
+} /* create_zoo() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    validate_zoo
+ *
+ * Purpose:     Given the path to a group in which a "zoo" has been 
+ *		constructed, validate the objects in the "zoo".
+ *
+ *              If pass is false on entry, do nothing.
+ *
+ *              If an error is detected, set pass to FALSE, and set
+ *              failure_mssg to point to an appropriate error message.
+ *
+ *              This function was initially created to assist in testing
+ *              the cache image feature of the metadata cache.  Thus, it
+ *              only concerns itself with the version 2 superblock, and
+ *              on disk structures that can occur with this version of
+ *              the superblock.
+ *
+ *              Note the associated validate_zoo() function.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              9/14/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+validate_zoo(hid_t fid, const char *base_path, int proc_num)
+{
+    char full_path[1024];
+
+    HDassert(base_path);
+
+    /* validate an empty "new style" group */
+    if ( pass ) {
+        sprintf(full_path, "%s/A", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_0(fid, full_path);
+    }
+
+    /* validate a compact "new style" group (3 link messages) */
+    if ( pass ) {
+	sprintf(full_path, "%s/B", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_c(fid, full_path, 3);
+    }
+
+    /* validate a dense "new style" group (w/300 links, in v2 B-tree & 
+     * fractal heap)
+     */
+    if ( pass ) {
+	sprintf(full_path, "%s/C", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ns_grp_d(fid, full_path, 300);
+    }
+
+    /* validate an empty "old style" group in file */
+    if ( pass ) {
+        sprintf(full_path, "%s/D", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_os_grp_0(fid, full_path);
+    }
+
+    /* validate an "old style" group (w/300 links, in v1 B-tree & 
+     * local heap)
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/E", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_os_grp_n(fid, full_path, proc_num, 300);
+    }
+
+    /* validate a contiguous dataset w/integer datatype (but no data) 
+     * in file. 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/F", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_i(fid, full_path, FALSE);
+    }
+
+    /* validate a contiguous dataset w/integer datatype (with data) 
+     * in file. 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/G", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_i(fid, full_path, TRUE);
+    }
+
+    /* validate a chunked dataset w/integer datatype (but no data) 
+     * in file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/H", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_chk_i(fid, full_path, FALSE);
+    }
+
+    /* validate a chunked dataset w/integer datatype (and data) 
+     * in file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/I", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_chk_i(fid, full_path, TRUE);
+    }
+
+    /* Validate a compact dataset w/integer datatype (but no data) 
+     * in file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/J", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_cpt_i(fid, full_path, FALSE);
+    }
+
+    /* validate a compact dataset w/integer datatype (and data) 
+     * in file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/K", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_cpt_i(fid, full_path, TRUE);
+    }
+
+    /* validate a contiguous dataset w/variable-length datatype 
+     * (but no data) to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/L", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_v(fid, full_path, FALSE);
+    }
+
+    /* validate a contiguous dataset w/variable-length datatype 
+     * (and data) to file 
+     */
+    if ( pass ) {
+        sprintf(full_path, "%s/M", base_path);
+        HDassert(strlen(full_path) < 1024);
+        vrfy_ds_ctg_v(fid, full_path, TRUE);
+    }
+
+    return;
+
+} /* validate_zoo() */
+
diff --git a/test/genall5.h b/test/genall5.h
new file mode 100644
index 0000000..1dce195
--- /dev/null
+++ b/test/genall5.h
@@ -0,0 +1,51 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  John Mainzer
+ *              9/4/15
+ *
+ *              This file contains declarations of all functions defined
+ *		in genall5.c
+ */
+
+void create_zoo(hid_t fid, const char *base_path, int proc_num);
+void validate_zoo(hid_t fid, const char *base_path, int proc_num);
+
+void ns_grp_0(hid_t fid, const char *group_name);
+void vrfy_ns_grp_0(hid_t fid, const char *group_name);
+
+void ns_grp_c(hid_t fid, const char *group_name, unsigned nlinks);
+void vrfy_ns_grp_c(hid_t fid, const char *group_name, unsigned nlinks);
+
+void ns_grp_d(hid_t fid, const char *group_name, unsigned nlinks);
+void vrfy_ns_grp_d(hid_t fid, const char *group_name, unsigned nlinks);
+
+void os_grp_0(hid_t fid, const char *group_name);
+void vrfy_os_grp_0(hid_t fid, const char *group_name);
+
+void os_grp_n(hid_t fid, const char *group_name, int proc_num, unsigned nlinks);
+void vrfy_os_grp_n(hid_t fid, const char *group_name, int proc_num, 
+    unsigned nlinks);
+
+void ds_ctg_i(hid_t fid, const char *dset_name, hbool_t write_data);
+void vrfy_ds_ctg_i(hid_t fid, const char *dset_name, hbool_t write_data);
+
+void ds_chk_i(hid_t fid, const char *dset_name, hbool_t write_data);
+void vrfy_ds_chk_i(hid_t fid, const char *dset_name, hbool_t write_data);
+
+void ds_cpt_i(hid_t fid, const char *dset_name, hbool_t write_data);
+void vrfy_ds_cpt_i(hid_t fid, const char *dset_name, hbool_t write_data);
+
+void ds_ctg_v(hid_t fid, const char *dset_name, hbool_t write_data);
+void vrfy_ds_ctg_v(hid_t fid, const char *dset_name, hbool_t write_data);
+
diff --git a/test/getname.c b/test/getname.c
index 2700b49..c3f3c54 100644
--- a/test/getname.c
+++ b/test/getname.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -2433,6 +2431,7 @@ test_obj_ref(hid_t fapl)
     hsize_t	dims1[] = {SPACE1_DIM1};
     hobj_ref_t  wbuf[SPACE1_DIM1];      /* Buffer to write to disk */
     int         tu32[SPACE1_DIM1];      /* Int data */
+    ssize_t     namelen;                /* Length of the name */
     int         i;                      /* counting variables */
     char buf[100];
 
@@ -2575,104 +2574,104 @@ test_obj_ref(hid_t fapl)
     TESTING("getting path to normal dataset in root group");
     if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[0])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(i == 9))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(namelen == 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
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], NULL, 0);
+    if(namelen != 9) TEST_ERROR
     /* Make sure size parameter is ignored */
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], NULL, 200);
-    if(i != 9) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], NULL, 200);
+    if(namelen != 9) TEST_ERROR
     
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(i == 9))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(namelen == 9))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset in /Group1");
     if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[1])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1/Dataset2") == 0) &&(i == 16))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1/Dataset2") == 0) &&(namelen == 16))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[1], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1/Dataset2") == 0) &&(i == 16))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[1], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1/Dataset2") == 0) &&(namelen == 16))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to /Group1");
     if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[2])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(group, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1") == 0) &&(i == 7))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1") == 0) &&(namelen == 7))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[2], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1") == 0) &&(i == 7))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[2], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1") == 0) &&(namelen == 7))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to datatype in /Group1");
     if((tid1 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[3])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(tid1, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(tid1, (char*)buf, sizeof(buf));
     if(H5Tclose(tid1) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1/Datatype1") == 0) &&(i == 17))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1/Datatype1") == 0) &&(namelen == 17))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[3], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1/Datatype1") == 0) &&(i == 17))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[3], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1/Datatype1") == 0) &&(namelen == 17))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset in nested group");
     if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1/Group2/Dataset4") == 0) &&(i == 23))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1/Group2/Dataset4") == 0) &&(namelen == 23))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[4], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1/Group2/Dataset4") == 0) &&(i == 23))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[4], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1/Group2/Dataset4") == 0) &&(namelen == 23))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to nested group");
     if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[5])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(group, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1/Group2") == 0) &&(i == 14))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1/Group2") == 0) &&(namelen == 14))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[5], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1/Group2") == 0) &&(i == 14))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[5], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1/Group2") == 0) &&(namelen == 14))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset created via hard link");
     if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[6])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/Group1/Dataset5") == 0) &&(i == 16))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/Group1/Dataset5") == 0) &&(namelen == 16))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[6], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/Group1/Dataset5") == 0) &&(i == 16))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[6], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/Group1/Dataset5") == 0) &&(namelen == 16))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to root group");
     if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[7])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(group, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
-    if(!((HDstrcmp(buf, "/") == 0) &&(i == 1))) TEST_ERROR
+    if(!((HDstrcmp(buf, "/") == 0) &&(namelen == 1))) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[7], (char*)buf, sizeof(buf));
-    if(!((HDstrcmp(buf, "/") == 0) &&(i == 1))) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[7], (char*)buf, sizeof(buf));
+    if(!((HDstrcmp(buf, "/") == 0) &&(namelen == 1))) TEST_ERROR
     PASSED()
 
     /* Now we mount fid2 at /Group2 and look for dataset4.  It shouldn't be found */
@@ -2682,12 +2681,12 @@ test_obj_ref(hid_t fapl)
     TESTING("getting path to dataset hidden by a mounted file");
     if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(i != 0) TEST_ERROR
+    if(namelen != 0) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[4], (char*)buf, sizeof(buf));
-    if(i != 0) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[4], (char*)buf, sizeof(buf));
+    if(namelen != 0) TEST_ERROR
     PASSED()
 
     /* Now we try unlinking dataset2 from the file and searching for it.  It shouldn't be found */
@@ -2698,12 +2697,12 @@ test_obj_ref(hid_t fapl)
 
     TESTING("getting path to dataset that has been unlinked");
     *buf = '\0';
-    i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
+    namelen = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
-    if(i != 0) TEST_ERROR
+    if(namelen != 0) TEST_ERROR
     *buf = '\0';
-    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[1], (char*)buf, sizeof(buf));
-    if(i != 0) TEST_ERROR
+    namelen = H5Rget_name(dataset, H5R_OBJECT, &wbuf[1], (char*)buf, sizeof(buf));
+    if(namelen != 0) TEST_ERROR
     PASSED()
 
     /* Close disk dataspace */
diff --git a/test/gheap.c b/test/gheap.c
index 3f66d35..7564afa 100644
--- a/test/gheap.c
+++ b/test/gheap.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -35,6 +33,9 @@
  * GHEAP_REPEATED_ERR_LIM errors, and suppress the rest */
 #define GHEAP_REPEATED_ERR_LIM 20
 
+/* Number of heap objects to test */
+#define GHEAP_TEST_NOBJS        1024
+
 #define GHEAP_REPEATED_ERR(MSG)                                                \
 {                                                                              \
     nerrors++;                                                                 \
@@ -78,10 +79,10 @@ test_1 (hid_t fapl)
 {
     hid_t	file = -1;
     H5F_t 	*f = NULL;
-    H5HG_t	obj[1024];
-    uint8_t	out[1024];
-    uint8_t	in[1024];
-    int		i;
+    H5HG_t	*obj = NULL;
+    uint8_t	out[GHEAP_TEST_NOBJS];
+    uint8_t	in[GHEAP_TEST_NOBJS];
+    size_t	u;
     size_t	size;
     herr_t	status;
     int		nerrors = 0;
@@ -89,6 +90,10 @@ test_1 (hid_t fapl)
 
     TESTING("monotonically increasing lengths");
 
+    /* Allocate buffer for H5HG_t */
+    if(NULL == (obj = (H5HG_t *)HDmalloc(sizeof(H5HG_t) * GHEAP_TEST_NOBJS)))
+        goto error;
+
     /* Open a clean file */
     h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
@@ -104,16 +109,16 @@ test_1 (hid_t fapl)
      * a clean file, the addresses allocated for the collections should also
      * be monotonically increasing.
      */
-    for(i = 0; i < 1024; i++) {
-	size = i + 1;
-	HDmemset(out, 'A' + i % 26, size);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	size = u + 1;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	status = H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj + i);
+	status = H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj + u);
 	if(status < 0) {
 	    H5_FAILED();
 	    puts("    Unable to insert object into global heap");
 	    nerrors++;
-	} else if(i && H5F_addr_gt(obj[i - 1].addr, obj[i].addr)) {
+	} else if(u && H5F_addr_gt(obj[u - 1].addr, obj[u].addr)) {
 	    H5_FAILED();
 	    puts("    Collection addresses are not monotonically increasing");
 	    nerrors++;
@@ -123,11 +128,11 @@ test_1 (hid_t fapl)
     /*
      * Now try to read each object back.
      */
-    for(i = 0; i < 1024; i++) {
-	size = i + 1;
-	HDmemset(out, 'A' + i % 26, size);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	size = u + 1;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, obj + i, in, NULL)) {
+	if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, obj + u, in, NULL)) {
 	    H5_FAILED();
 	    puts("    Unable to read object");
 	    nerrors++;
@@ -138,6 +143,10 @@ test_1 (hid_t fapl)
 	}
     }
 
+    /* Release buffer */
+    HDfree(obj);
+    obj = NULL;
+
     if(H5Fclose(file) < 0) goto error;
     if(nerrors) goto error;
 
@@ -148,6 +157,8 @@ error:
     H5E_BEGIN_TRY {
 	H5Fclose(file);
     } H5E_END_TRY;
+    if(obj)
+        HDfree(obj);
     return MAX(1, nerrors);
 }
 
@@ -174,16 +185,20 @@ test_2 (hid_t fapl)
 {
     hid_t	file = -1;
     H5F_t 	*f = NULL;
-    H5HG_t	obj[1024];
-    uint8_t	out[1024];
-    uint8_t	in[1024];
-    int		i;
+    H5HG_t	*obj = NULL;
+    uint8_t	out[GHEAP_TEST_NOBJS];
+    uint8_t	in[GHEAP_TEST_NOBJS];
+    size_t	u;
     size_t	size;
     int		nerrors = 0;
     char	filename[1024];
 
     TESTING("monotonically decreasing lengths");
 
+    /* Allocate buffer for H5HG_t */
+    if(NULL == (obj = (H5HG_t *)HDmalloc(sizeof(H5HG_t) * GHEAP_TEST_NOBJS)))
+        goto error;
+
     /* Open a clean file */
     h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
@@ -197,11 +212,11 @@ test_2 (hid_t fapl)
     /*
      * Write the objects, monotonically decreasing in length.
      */
-    for (i=0; i<1024; i++) {
-	size = 1024-i;
-	memset (out, 'A'+i%26, size);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	size = GHEAP_TEST_NOBJS - u;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	if (H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i)<0) {
+	if (H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj + u) < 0) {
 	    H5_FAILED();
 	    puts("    Unable to insert object into global heap");
 	    nerrors++;
@@ -211,11 +226,11 @@ test_2 (hid_t fapl)
     /*
      * Now try to read each object back.
      */
-    for (i=0; i<1024; i++) {
-	size = 1024-i;
-	memset (out, 'A'+i%26, size);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	size = GHEAP_TEST_NOBJS - u;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	if (NULL==H5HG_read (f, H5AC_ind_read_dxpl_id, obj+i, in, NULL)) {
+	if (NULL==H5HG_read (f, H5AC_ind_read_dxpl_id, obj + u, in, NULL)) {
 	    H5_FAILED();
 	    puts("    Unable to read object");
 	    nerrors++;
@@ -226,8 +241,13 @@ test_2 (hid_t fapl)
 	}
     }
 
+    /* Release buffer */
+    HDfree(obj);
+    obj = NULL;
+
     if (H5Fclose(file)<0) goto error;
     if (nerrors) goto error;
+
     PASSED();
     return 0;
 
@@ -235,6 +255,8 @@ test_2 (hid_t fapl)
     H5E_BEGIN_TRY {
 	H5Fclose(file);
     } H5E_END_TRY;
+    if(obj)
+        HDfree(obj);
     return MAX(1, nerrors);
 }
 
@@ -261,9 +283,9 @@ test_3 (hid_t fapl)
 {
     hid_t	file = -1;
     H5F_t 	*f = NULL;
-    H5HG_t	obj[1024];
-    uint8_t	out[1024];
-    int		i;
+    H5HG_t	*obj = NULL;
+    uint8_t	out[GHEAP_TEST_NOBJS];
+    size_t	u;
     size_t	size;
     herr_t	status;
     int		nerrors = 0;
@@ -271,6 +293,10 @@ test_3 (hid_t fapl)
 
     TESTING("complete object removal");
 
+    /* Allocate buffer for H5HG_t */
+    if(NULL == (obj = (H5HG_t *)HDmalloc(sizeof(H5HG_t) * GHEAP_TEST_NOBJS)))
+        goto error;
+
     /* Open a clean file */
     h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
@@ -282,11 +308,11 @@ test_3 (hid_t fapl)
     }
 
     /* Create some stuff */
-    for (i=0; i<1024; i++) {
-	size = i%30+100;
-	memset (out, 'A'+i%26, size);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	size = u % 30 + 100;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i);
+	status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj + u);
 	if (status<0) {
 	    H5_FAILED();
 	    puts("    Unable to insert object into global heap");
@@ -295,8 +321,8 @@ test_3 (hid_t fapl)
     }
 
     /* Remove everything */
-    for (i=0; i<1024; i++) {
-	status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj+i);
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
+	status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj + u);
 	if (status<0) {
 	    H5_FAILED();
 	    puts("    Unable to remove object");
@@ -304,8 +330,13 @@ test_3 (hid_t fapl)
 	}
     }
 
+    /* Release buffer */
+    HDfree(obj);
+    obj = NULL;
+
     if (H5Fclose(file)<0) goto error;
     if (nerrors) goto error;
+
     PASSED();
     return 0;
 
@@ -313,6 +344,8 @@ test_3 (hid_t fapl)
     H5E_BEGIN_TRY {
 	H5Fclose(file);
     } H5E_END_TRY;
+    if(obj)
+        HDfree(obj);
     return MAX(1, nerrors);
 }
 
@@ -340,9 +373,9 @@ test_4 (hid_t fapl)
 {
     hid_t	file = -1;
     H5F_t 	*f = NULL;
-    H5HG_t	obj[1024];
-    uint8_t	out[1024];
-    int		i;
+    H5HG_t	*obj = NULL;
+    uint8_t	out[GHEAP_TEST_NOBJS];
+    size_t	u;
     size_t	size;
     herr_t	status;
     int		nerrors = 0;
@@ -350,6 +383,10 @@ test_4 (hid_t fapl)
 
     TESTING("partial object removal");
 
+    /* Allocate buffer for H5HG_t */
+    if(NULL == (obj = (H5HG_t *)HDmalloc(sizeof(H5HG_t) * GHEAP_TEST_NOBJS)))
+        goto error;
+
     /* Open a clean file */
     h5_fixname(FILENAME[3], fapl, filename, sizeof filename);
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
@@ -360,12 +397,12 @@ test_4 (hid_t fapl)
 	goto error;
     }
 
-    for (i=0; i<1024; i++) {
+    for(u = 0; u < GHEAP_TEST_NOBJS; u++) {
 	/* Insert */
-	size = i%30+100;
-	memset (out, 'A'+i%26, size);
+	size = u % 30 + 100;
+	HDmemset(out, (int)('A' + u % 26), size);
 	H5Eclear2(H5E_DEFAULT);
-	status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i);
+	status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj + u);
 	if (status<0) {
 	    H5_FAILED();
 	    puts("    Unable to insert object into global heap");
@@ -377,20 +414,25 @@ test_4 (hid_t fapl)
 	 * next one has already been inserted.  That is, insert A, B, C;
 	 * remove B, insert D, E, F; remove E; etc.
 	 */
-	if (1==i%3) {
+	if(1 == (u % 3)) {
 	    H5Eclear2(H5E_DEFAULT);
-	    status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj+i-1);
+	    status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj + u - 1);
 	    if (status<0) {
 		H5_FAILED();
 		puts("    Unable to remove object");
 		nerrors++;
 	    }
-	    memset (obj+i-1, 0, sizeof *obj);
+	    HDmemset(obj + u - 1, 0, sizeof *obj);
 	}
     }
 
+    /* Release buffer */
+    HDfree(obj);
+    obj = NULL;
+
     if (H5Fclose(file)<0) goto error;
     if (nerrors) goto error;
+
     PASSED();
     return 0;
 
@@ -398,6 +440,8 @@ test_4 (hid_t fapl)
     H5E_BEGIN_TRY {
 	H5Fclose(file);
     } H5E_END_TRY;
+    if(obj)
+        HDfree(obj);
     return MAX(1, nerrors);
 }
 
diff --git a/test/group_old.h5 b/test/group_old.h5
index 2440103..58f66f8 100644
Binary files a/test/group_old.h5 and b/test/group_old.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_f.h5 b/test/h5fc_ext1_f.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext1_f.h5
rename to test/h5fc_ext1_f.h5
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_i.h5 b/test/h5fc_ext1_i.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext1_i.h5
rename to test/h5fc_ext1_i.h5
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_if.h5 b/test/h5fc_ext2_if.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext2_if.h5
rename to test/h5fc_ext2_if.h5
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_sf.h5 b/test/h5fc_ext2_sf.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext2_sf.h5
rename to test/h5fc_ext2_sf.h5
diff --git a/tools/h5format_convert/testfiles/h5fc_ext3_isf.h5 b/test/h5fc_ext3_isf.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext3_isf.h5
rename to test/h5fc_ext3_isf.h5
diff --git a/tools/h5format_convert/testfiles/h5fc_ext_none.h5 b/test/h5fc_ext_none.h5
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_ext_none.h5
rename to test/h5fc_ext_none.h5
diff --git a/test/h5test.c b/test/h5test.c
index 146f3c0..2d77dc8 100644
--- a/test/h5test.c
+++ b/test/h5test.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -74,7 +72,7 @@ char  *paraprefix = NULL;  /* for command line option para-prefix */
 MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
 #endif
 
-#define READ_BUF_SIZE           4096
+#define READ_BUF_SIZE           65536
 
 /*
  * These are the letters that are appended to the file name when generating
@@ -90,6 +88,15 @@ MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
  */
 static const char *multi_letters = "msbrglo";
 
+/* Length of multi-file VFD filename buffers */
+#define H5TEST_MULTI_FILENAME_LEN       1024
+
+/* Temporary file for sending signal messages */
+#define TMP_SIGNAL_FILE "tmp_signal_file"
+
+/* The # of seconds to wait for the message file--used by h5_wait_message() */
+#define MESSAGE_TIMEOUT         300             /* Timeout in seconds */
+
 /* Previous error reporting function */
 static H5E_auto2_t err_func = NULL;
 
@@ -196,7 +203,7 @@ h5_clean_files(const char *base_name[], hid_t fapl)
  *
  * Purpose      Clean up temporary test files.
  *
- *              When a test calls h5_fixname() get a VFD-dependent
+ *              When a test calls h5_fixname() to get a VFD-dependent
  *              test file name, this function can be used to clean it up.
  *
  * Return:      void
@@ -767,36 +774,33 @@ h5_fixname_real(const char *base_name, hid_t fapl, const char *_suffix,
  *
  *-------------------------------------------------------------------------
  */
-const char *
+H5_ATTR_PURE const char *
 h5_rmprefix(const char *filename)
 {
     const char *ret_ptr;
 
     if ((ret_ptr = HDstrstr(filename, ":")) == NULL)
-  ret_ptr = filename;
+        ret_ptr = filename;
     else
-  ret_ptr++;
+        ret_ptr++;
 
     return(ret_ptr);
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:  h5_fileaccess
- *
- * Purpose:  Returns a file access template which is the default template
- *    but with a file driver set according to the constant or
- *    environment variable HDF5_DRIVER
+ * Function:    h5_fileaccess
  *
- * Return:  Success:  A file access property list
+ * Purpose:     Returns a file access template which is the default template
+ *              but with a file driver set according to the constant or
+ *              environment variable HDF5_DRIVER
  *
- *    Failure:  -1
+ * Return:      Success:  A file access property list
+ *              Failure:  -1
  *
  * Programmer:  Robb Matzke
  *              Thursday, November 19, 1998
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 hid_t
@@ -804,50 +808,61 @@ h5_fileaccess(void)
 {
     const char  *val = NULL;
     const char  *name;
-    char s[1024];
-    hid_t fapl = -1;
+    char        s[1024];
+    hid_t       fapl = -1;
 
     /* First use the environment variable, then the constant */
     val = HDgetenv("HDF5_DRIVER");
 #ifdef HDF5_DRIVER
-    if (!val)
+    if(!val)
         val = HDF5_DRIVER;
 #endif
 
-    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0)
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
         return -1;
-    if (!val || !*val)
-        return fapl; /*use default*/
+    if(!val || !*val)
+        return fapl; /* use default */
 
     HDstrncpy(s, val, sizeof s);
     s[sizeof(s)-1] = '\0';
-    if (NULL==(name=HDstrtok(s, " \t\n\r"))) return fapl;
+    if(NULL == (name = HDstrtok(s, " \t\n\r")))
+        return fapl;
 
-    if (!HDstrcmp(name, "sec2")) {
+    if(!HDstrcmp(name, "sec2")) {
         /* Unix read() and write() system calls */
-        if (H5Pset_fapl_sec2(fapl)<0) return -1;
-    } else if (!HDstrcmp(name, "stdio")) {
+        if (H5Pset_fapl_sec2(fapl) < 0)
+            return -1;
+    }
+    else if(!HDstrcmp(name, "stdio")) {
         /* Standard C fread() and fwrite() system calls */
-        if (H5Pset_fapl_stdio(fapl)<0) return -1;
-    } else if (!HDstrcmp(name, "core")) {
+        if (H5Pset_fapl_stdio(fapl) < 0)
+            return -1;
+    }
+    else if(!HDstrcmp(name, "core")) {
         /* In-memory driver settings (backing store on, 1 MB increment) */
-        if (H5Pset_fapl_core(fapl, (size_t)1, TRUE)<0) return -1;
-    } else if (!HDstrcmp(name, "core_paged")) {
+        if(H5Pset_fapl_core(fapl, (size_t)1, TRUE) < 0)
+            return -1;
+    }
+    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)4096)<0) return -1;
-     } else if (!HDstrcmp(name, "split")) {
+        if(H5Pset_fapl_core(fapl, (size_t)1, TRUE) < 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,
+        if(H5Pset_fapl_split(fapl,
             "-m.h5", H5P_DEFAULT,
-            "-r.h5", H5P_DEFAULT)<0)
+            "-r.h5", H5P_DEFAULT) < 0)
             return -1;
-    } else if (!HDstrcmp(name, "multi")) {
+    }
+    else if(!HDstrcmp(name, "multi")) {
         /* Multi-file driver, general case of the split driver */
         H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
         hid_t memb_fapl[H5FD_MEM_NTYPES];
         const char *memb_name[H5FD_MEM_NTYPES];
-        char sv[H5FD_MEM_NTYPES][1024];
+        char *sv[H5FD_MEM_NTYPES];
         haddr_t memb_addr[H5FD_MEM_NTYPES];
         H5FD_mem_t  mt;
 
@@ -858,45 +873,52 @@ h5_fileaccess(void)
 
         HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
         for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt)) {
-          memb_fapl[mt] = H5P_DEFAULT;
-            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+            memb_fapl[mt] = H5P_DEFAULT;
+            if(NULL == (sv[mt] = (char *)HDmalloc(H5TEST_MULTI_FILENAME_LEN)))
+                return -1;
+            HDsprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
             memb_name[mt] = sv[mt];
             memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
         } /* end for */
 
-        if (H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
-          memb_addr, FALSE)<0) {
+        if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0)
             return -1;
-        }
-    } else if (!HDstrcmp(name, "family")) {
+
+        for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+            HDfree(sv[mt]);
+    }
+    else if(!HDstrcmp(name, "family")) {
         hsize_t fam_size = 100*1024*1024; /*100 MB*/
 
         /* Family of files, each 1MB and using the default driver */
-        if ((val=HDstrtok(NULL, " \t\n\r")))
+        if((val = HDstrtok(NULL, " \t\n\r")))
             fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024);
-        if (H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT)<0)
+        if(H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT)<0)
             return -1;
-    } else if (!HDstrcmp(name, "log")) {
+    }
+    else if(!HDstrcmp(name, "log")) {
         unsigned log_flags = H5FD_LOG_LOC_IO | H5FD_LOG_ALLOC;
 
         /* Log file access */
-        if ((val = HDstrtok(NULL, " \t\n\r")))
+        if((val = HDstrtok(NULL, " \t\n\r")))
             log_flags = (unsigned)HDstrtol(val, NULL, 0);
-
-        if (H5Pset_fapl_log(fapl, NULL, log_flags, (size_t)0) < 0)
+        if(H5Pset_fapl_log(fapl, NULL, log_flags, (size_t)0) < 0)
             return -1;
-    } else if (!HDstrcmp(name, "direct")) {
+    }
+    else if(!HDstrcmp(name, "direct")) {
 #ifdef H5_HAVE_DIRECT
         /* Linux direct read() and write() system calls.  Set memory boundary, file block size,
          * and copy buffer size to the default values. */
-        if (H5Pset_fapl_direct(fapl, 1024, 4096, 8*4096)<0)
+        if(H5Pset_fapl_direct(fapl, 1024, 4096, 8 * 4096) < 0)
             return -1;
 #endif
-    } else if(!HDstrcmp(name, "latest")) {
+    }
+    else if(!HDstrcmp(name, "latest")) {
         /* use the latest format */
         if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
             return -1;
-    } else {
+    }
+    else {
         /* Unknown driver */
         return -1;
     }
@@ -979,7 +1001,7 @@ h5_get_vfd_fapl(void)
         H5FD_mem_t  memb_map[H5FD_MEM_NTYPES];
         hid_t       memb_fapl[H5FD_MEM_NTYPES];
         const char  *memb_name[H5FD_MEM_NTYPES];
-        char        sv[H5FD_MEM_NTYPES][1024];
+        char        *sv[H5FD_MEM_NTYPES];
         haddr_t     memb_addr[H5FD_MEM_NTYPES];
         H5FD_mem_t  mt;
 
@@ -991,15 +1013,18 @@ h5_get_vfd_fapl(void)
         HDassert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
         for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt)) {
             memb_fapl[mt] = H5P_DEFAULT;
+            sv[mt] = (char *)HDmalloc(H5TEST_MULTI_FILENAME_LEN);
+            HDassert(sv[mt]);
             HDsprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
             memb_name[mt] = sv[mt];
             memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
         } /* end for */
 
-        if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
-          memb_addr, FALSE) < 0) {
+        if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0)
             return -1;
-        } /* end if */
+
+        for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+            HDfree(sv[mt]);
     } else if(!HDstrcmp(tok, "family")) {
         /* Family of files, each 1MB and using the default driver */
         hsize_t fam_size = 100*1024*1024; /*100 MB*/
@@ -1563,25 +1588,43 @@ h5_make_local_copy(const char *origfilename, const char *local_copy_name)
 {
     int fd_old = (-1), fd_new = (-1);   /* File descriptors for copying data */
     ssize_t nread;                      /* Number of bytes read in */
-    char  buf[READ_BUF_SIZE];           /* Buffer for copying data */
-    const char *filename = H5_get_srcdir_filename(origfilename);;       /* Get the test file name to copy */
+    void  *buf = NULL;                  /* Buffer for copying data */
+    const char *filename = H5_get_srcdir_filename(origfilename);       /* Get the test file name to copy */
+
+    /* Allocate copy buffer */
+    if(NULL == (buf = HDcalloc((size_t)1, (size_t)READ_BUF_SIZE)))
+        goto error;
 
     /* Copy old file into temporary file */
     if((fd_old = HDopen(filename, O_RDONLY, 0666)) < 0)
-        return -1;
+        goto error;
     if((fd_new = HDopen(local_copy_name, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0)
-        return -1;
+        goto error;
 
     /* Copy data */
     while((nread = HDread(fd_old, buf, (size_t)READ_BUF_SIZE)) > 0)
         if(HDwrite(fd_new, buf, (size_t)nread) < 0)
-            return -1;
-
+            goto error;
+ 
     /* Close files */
-    if(HDclose(fd_old) < 0) return -1;
-    if(HDclose(fd_new) < 0) return -1;
+    if(HDclose(fd_old) < 0)
+        goto error;
+    if(HDclose(fd_new) < 0)
+        goto error;
+
+    /* Release memory */
+    HDfree(buf);
 
     return 0;
+
+error:
+    /* ignore return values since we're already noted the problem */
+    if(fd_old > 0)
+        HDclose(fd_old);
+    if(fd_new > 0)
+        HDclose(fd_new);
+    HDfree(buf);
+    return -1;
 } /* end h5_make_local_copy() */
 
 

@@ -1672,56 +1715,116 @@ 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
+/*-------------------------------------------------------------------------
+ * Function:    h5_send_message
+ * 
+ * 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
+ * 
+ *-------------------------------------------------------------------------
  */
 void
-h5_send_message(const char *file)
+h5_send_message(const char *send, const char *arg1, const char *arg2)
 {
-    FILE *id;
+    FILE *signalfile = NULL;
+
+    /* Create signal file (which will send signal to some other process) */
+    signalfile = HDfopen(TMP_SIGNAL_FILE, "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 */
 
-    id = HDfopen(file, "w+");
-    HDfclose(id);
+    HDfclose(signalfile);
+
+    HDrename(TMP_SIGNAL_FILE, send);
 } /* 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
+/*-------------------------------------------------------------------------
+ * Function:    h5_wait_message
+ * 
+ * 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 "h5_send_message" 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
+ * 
+ *-------------------------------------------------------------------------
  */
-int
-h5_wait_message(const char *file)
+herr_t
+h5_wait_message(const char *waitfor) 
 {
-    FILE *id;           /* File pointer */
-    time_t t0, t1;      /* Time info */
+    FILE *returnfile;
+    time_t t0,t1;
 
-    /* Start timer */
+    /* Start timer. If this function runs for too long (i.e., 
+        expected signal is never received), it will
+        return failure */
     HDtime(&t0);
 
-    /* Repeatedly check whether the file exists */
-    while((id = HDfopen(file, "r")) == NULL) {
-        /* Get current time */
+    /* Wait for return signal from some other process */
+    while ((returnfile = HDfopen(waitfor, "r")) == NULL) {
+
+        /* make note of 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);
+        /* 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(HDdifftime(t1, t0) > MESSAGE_TIMEOUT) {
+            HDfprintf(stdout, "Error communicating between processes. Make sure test script is running.\n");
+            TEST_ERROR;
+        } /* end if */
+    } /* end while */
+
+    HDfclose(returnfile);
+    HDunlink(waitfor);
 
-done:
-    return(-1);
+    return SUCCEED;
+
+error:
+    return FAIL;
 } /* h5_wait_message() */
+
diff --git a/test/h5test.h b/test/h5test.h
index 450099a..0e23255 100644
--- a/test/h5test.h
+++ b/test/h5test.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -118,9 +116,6 @@ H5TEST_DLLVAR MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
 #define ALARM_ON  TestAlarmOn()
 #define ALARM_OFF  HDalarm(0)
 
-/* 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
@@ -169,6 +164,7 @@ H5TEST_DLL void TestParseCmdLine(int argc, char *argv[]);
 H5TEST_DLL void PerformTests(void);
 H5TEST_DLL void TestSummary(void);
 H5TEST_DLL void TestCleanup(void);
+H5TEST_DLL void TestShutdown(void);
 H5TEST_DLL void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_parser)(int ac, char *av[]));
 H5TEST_DLL int  GetTestVerbosity(void);
 H5TEST_DLL int  SetTestVerbosity(int newval);
@@ -199,8 +195,8 @@ 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);
+H5TEST_DLL void h5_send_message(const char *file, const char *arg1, const char *arg2);
+H5TEST_DLL herr_t h5_wait_message(const char *file);
 
 #ifdef __cplusplus
 }
diff --git a/test/hyperslab.c b/test/hyperslab.c
index 2cf47b1..c28d872 100644
--- a/test/hyperslab.c
+++ b/test/hyperslab.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:	Robb Matzke <matzke at llnl.gov>
@@ -223,7 +221,7 @@ test_fill(size_t nx, size_t ny, size_t nz,
                                     for(v = (size_t)dst_offset[1]; v < dst_offset[1] + dy; v++)
                                         for(w = (size_t)dst_offset[2]; w < dst_offset[2] + dz; w++)
                                             ref_value -= dst[u * ny * nz + v * nz + w];
-                                ref_value += fill_value * dx * dy * dz;
+                                ref_value += fill_value * (unsigned)dx * (unsigned)dy * (unsigned)dz;
 
                                 /* Fill the hyperslab with some value */
                                 H5VM_hyper_fill(ndims, hs_size, dst_size, dst_offset, dst, fill_value);
@@ -819,8 +817,8 @@ test_transpose(size_t nx, size_t ny)
     size[1] = ny;
     src_stride[0] = 0;
     src_stride[1] = sizeof(*src);
-    dst_stride[0] = (ssize_t)((1 - nx * ny) * sizeof(*src));
-    dst_stride[1] = (ssize_t)(nx * sizeof(*src));
+    dst_stride[0] = (hsize_t)((1 - nx * ny) * sizeof(*src));
+    dst_stride[1] = (hsize_t)(nx * sizeof(*src));
 
     /* Copy and transpose */
     if(nx == ny)
@@ -923,7 +921,7 @@ test_sub_super(size_t nx, size_t ny)
     /* Setup */
     size[0] = nx;
     size[1] = ny;
-    src_stride[0] = (ssize_t)(2 * ny);
+    src_stride[0] = (hsize_t)(2 * ny);
     src_stride[1] = 2;
     dst_stride[0] = 0;
     dst_stride[1] = 1;
@@ -972,9 +970,9 @@ test_sub_super(size_t nx, size_t ny)
     src_stride[1] = 1;
     src_stride[2] = 0;
     src_stride[3] = 0;
-    dst_stride[0] = (ssize_t)(2 * ny);
-    dst_stride[1] = (ssize_t)(2 * sizeof(uint8_t) - 4 * ny);
-    dst_stride[2] = (ssize_t)(2 * ny - 2 * sizeof(uint8_t));
+    dst_stride[0] = (hsize_t)(2 * ny);
+    dst_stride[1] = (hsize_t)(2 * sizeof(uint8_t) - 4 * ny);
+    dst_stride[2] = (hsize_t)(2 * ny - 2 * sizeof(uint8_t));
     dst_stride[3] = sizeof(uint8_t);
 
     /* Copy */
@@ -1144,9 +1142,9 @@ test_array_offset_n_calc(size_t n, size_t x, size_t y, size_t z)
     /* Check offsets */
     for(u = 0; u < n; u++) {
         /* Get random coordinate */
-        coords[0] = (hssize_t)(HDrandom() % z);
-        coords[1] = (hssize_t)(HDrandom() % y);
-        coords[2] = (hssize_t)(HDrandom() % x);
+        coords[0] = (hsize_t)((size_t)HDrandom() % z);
+        coords[1] = (hsize_t)((size_t)HDrandom() % y);
+        coords[2] = (hsize_t)((size_t)HDrandom() % x);
 
         /* Get offset of coordinate */
         off = H5VM_array_offset(ARRAY_OFFSET_NDIMS, dims, coords);
@@ -1188,9 +1186,9 @@ error:
  *		`small' and/or `medium' on the command line or only `small'
  *		is assumed.
  *
- * Return:	Success:	exit(0)
+ * Return:	Success:	exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(non-zero)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Robb Matzke
  *		Friday, October 10, 1997
@@ -1217,7 +1215,7 @@ main(int argc, char *argv[])
                 size_of_test |= TEST_MEDIUM;
             else {
                 printf("unrecognized argument: %s\n", argv[i]);
-                HDexit(1);
+                HDexit(EXIT_FAILURE);
             } /* end else */
         } /* end for */
     } /* end else */
@@ -1437,7 +1435,7 @@ main(int argc, char *argv[])
                 == nerrors ? "" : "S");
         if(HDisatty(1))
             printf("(Redirect output to a pager or a file to see debug output)\n");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     } /* end if */
 
     printf("All hyperslab tests passed.\n");
diff --git a/test/istore.c b/test/istore.c
index ec7542a..8dc5efd 100644
--- a/test/istore.c
+++ b/test/istore.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:	Robb Matzke <matzke at llnl.gov>
@@ -529,9 +527,9 @@ test_sparse(hid_t f, const char *prefix, size_t nblocks,
     if((mspace=H5Screate_simple(ndims,size,NULL)) < 0) TEST_ERROR;
 
     for (ctr=0; ctr<nblocks; ctr++) {
-	offset[0] = (hsize_t)(HDrandom() % (TEST_SPARSE_SIZE-nx));
-	offset[1] = (hsize_t)(HDrandom() % (TEST_SPARSE_SIZE-ny));
-	offset[2] = (hsize_t)(HDrandom() % (TEST_SPARSE_SIZE-nz));
+        offset[0] = (hsize_t)(HDrandom() % (int)(TEST_SPARSE_SIZE-nx));
+        offset[1] = (hsize_t)(HDrandom() % (int)(TEST_SPARSE_SIZE-ny));
+        offset[2] = (hsize_t)(HDrandom() % (int)(TEST_SPARSE_SIZE-nz));
 
         /* Select region in file dataspace */
         if(H5Sselect_hyperslab(fspace,H5S_SELECT_SET,offset,NULL,size,NULL) < 0) TEST_ERROR;
@@ -585,9 +583,9 @@ error:
  *
  * Purpose:	Tests indexed storage stuff.
  *
- * Return:	Success:	exit(0)
+ * Return:	Success:	exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(non-zero)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Robb Matzke
  *		Wednesday, October 15, 1997
@@ -623,7 +621,7 @@ main(int argc, char *argv[])
             } else {
                 printf("unrecognized argument: %s\n", argv[i]);
 #if 0
-                exit(1);
+                exit(EXIT_FAILURE);
 #endif
             }
         }
@@ -658,7 +656,7 @@ main(int argc, char *argv[])
     h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
     if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) {
         printf("Cannot create file %s; test aborted\n", filename);
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     /* Initialize chunk dimensions */
@@ -726,7 +724,7 @@ main(int argc, char *argv[])
     if (nerrors) {
         printf("***** %d I-STORE TEST%s FAILED! *****\n",
                 nerrors, 1 == nerrors ? "" : "S");
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     printf("All i-store tests passed.\n");
diff --git a/test/lheap.c b/test/lheap.c
index 9c07ec6..f5b7f77 100644
--- a/test/lheap.c
+++ b/test/lheap.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -100,7 +98,7 @@ main(void)
     for(i = 0; i < NOBJS; i++) {
         sprintf(buf, "%03d-", i);
         for(j = 4; j < i; j++)
-            buf[j] = '0' + j % 10;
+            buf[j] = (char)('0' + j % 10);
         if(j > 4)
             buf[j] = '\0';
 
@@ -140,7 +138,7 @@ main(void)
     for(i = 0; i < NOBJS; i++) {
         sprintf(buf, "%03d-", i);
         for(j = 4; j < i; j++)
-            buf[j] = '0' + j % 10;
+            buf[j] = (char)('0' + j % 10);
         if(j > 4)
             buf[j] = '\0';
 
@@ -158,9 +156,9 @@ main(void)
 
         if (strcmp(s, buf)) {
             H5_FAILED();
-            printf("    i=%d, heap offset=%lu\n", i, (unsigned long)(obj[i]));
-            printf("    got: \"%s\"\n", s);
-            printf("    ans: \"%s\"\n", buf);
+            HDprintf("    i=%d, heap offset=%lu\n", i, (unsigned long)(obj[i]));
+            HDprintf("    got: \"%s\"\n", s);
+            HDprintf("    ans: \"%s\"\n", buf);
             goto error;
         }
 
@@ -191,7 +189,7 @@ main(void)
         }
         else {
             H5_FAILED();
-            printf("***cannot open the pre-created non-default sizes test file (%s)\n",
+            HDprintf("***cannot open the pre-created non-default sizes test file (%s)\n",
                 testfile);
             goto error;
         } /* end else */
@@ -201,13 +199,13 @@ main(void)
     /* Verify symbol table messages are cached */
     if(h5_verify_cached_stabs(FILENAME, fapl) < 0) TEST_ERROR
 
-    puts("All local heap tests passed.");
+    HDputs("All local heap tests passed.");
     h5_cleanup(FILENAME, fapl);
 
     return 0;
 
  error:
-    puts("*** TESTS FAILED ***");
+    HDputs("*** TESTS FAILED ***");
     H5E_BEGIN_TRY {
         H5Fclose(file);
     } H5E_END_TRY;
diff --git a/test/links.c b/test/links.c
index a791c89..2d1ef03 100644
--- a/test/links.c
+++ b/test/links.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -21,21 +19,25 @@
  */
 
 /*
+ * This file needs to access private information from the H5FD package.
+ * This file also needs to access the file driver testing code.
+ */
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+
+/*
  * This file needs to access private information from the H5G package.
  * This file also needs to access the group testing code.
  */
 #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 "H5FDpkg.h"        /* File drivers         */
-#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"
@@ -820,7 +822,7 @@ long_links(hid_t fapl, hbool_t new_format)
 static int
 toomany(hid_t fapl, hbool_t new_format)
 {
-    hid_t		fid = (-1);     /* File ID */
+    hid_t		fid = (-1);     	/* File ID */
     hid_t	gid = (-1), gid2 = (-1);	/* Group IDs */
     char                objname[NAME_BUF_SIZE];         /* Object name */
     char		filename[NAME_BUF_SIZE];
@@ -2623,7 +2625,6 @@ external_link_toomany(hid_t fapl, hbool_t new_format)
     /* Close first file */
     if(H5Fclose(fid) < 0) TEST_ERROR
 
-
     PASSED();
     return 0;
 
@@ -3955,15 +3956,13 @@ external_set_elink_fapl3(hbool_t new_format)
  *-------------------------------------------------------------------------
  */
 static int
-external_set_elink_acc_flags(const char H5_ATTR_UNUSED *env_h5_drvr,
-    hid_t fapl, hbool_t new_format)
+external_set_elink_acc_flags(const char *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)")
@@ -4053,8 +4052,7 @@ external_set_elink_acc_flags(const char H5_ATTR_UNUSED *env_h5_drvr,
     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)) {
+    if(H5FD_supports_swmr_test(env_h5_drvr)) {
 
         /* Reopen file1, with read-write and SWMR-write access */
         /* Only supported under the latest file format */
@@ -7403,6 +7401,281 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    external_link_with_committed_datatype
+ *
+ * Purpose:     Test to verify the problem described in HDFFV-9940 is resolved.
+ *              (A) Attach an attribute to an externally linked group in the target file.
+ *              The attribute's datatype is a committed datatype to the root group
+ *              in the main file.
+ *              (B) Create a dataset to an externally group in the target file.
+ *              The dataset's datatype is a committed datatype to the root group
+ *              in the main file.
+ *
+ * Return:      Success:        0
+ *              Failure:        -1
+ *
+ * Programmer:  This is copied and modified from the customer's test program that
+ *              exposed the problem.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+external_link_with_committed_datatype(hid_t fapl, hbool_t new_format)
+{
+    hid_t       fid1 = -1, fid2 = -1;		/* File IDs */
+    hid_t 	gid1 = -1, gid2 = -1;		/* Group IDs */
+    hid_t       tid = -1;                    	/* Datatype ID */
+    hid_t       sid = -1;                   	/* Dataspace ID */
+    hid_t       sid2 = -1;                   	/* Dataspace ID */
+    hid_t       aid = -1;                   	/* Attribute ID */
+    hid_t       atid = -1;                   	/* Attribute's datatype ID */
+    hid_t       did = -1;                   	/* Dataset ID */
+    hid_t       dtid = -1;                   	/* Dataset's datatype ID */
+    hid_t	dcpl = -1;			/* Dataset creation property list */
+    int		wdata = 99;			/* Attribute data written */
+    int		wbuf[60];			/* Data buffer for writing */
+    int		rbuf[60];			/* Data buffer for reading */
+    int		i;				/* Local index variable */
+    char        filename1[NAME_BUF_SIZE];	/* File name for main file */
+    char        filename2[NAME_BUF_SIZE];	/* File name for target file */
+    hsize_t     dims[2] = {5, 12};		/* Dimension sizes */
+    hsize_t     chunks[2] = {3, 7};		/* Chunk sizes */
+
+    if(new_format)
+        TESTING("attach committed datatype to external group's attribute/dataset(w/new group format)")
+    else
+        TESTING("attach committed datatype to external group's attribute/dataset")
+
+    /* Set up filenames */
+    h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1);
+    h5_fixname(FILENAME[1], fapl, filename2, sizeof filename2);
+
+
+    /* Main file */
+    if((fid1 = H5Fcreate(filename1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create external link from main file to target file */
+    if(H5Lcreate_external(filename2, "target_group", fid1, "link_to_2", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Create target file */
+    if((fid2 = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+    /* Create group in target file */
+    if((gid2 = H5Gcreate2(fid2, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the group */
+    if(H5Gclose(gid2) < 0)
+        FAIL_STACK_ERROR
+    /* Close the file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the group which is externally linked to target file */
+    if((gid1 = H5Gopen2(fid1, "link_to_2", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a copy of integer datatype */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Commit the datatype to the main file root group */
+    if(H5Tcommit2(fid1, "myDatatype", 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 with the committed datatype to the group */
+    if((aid = H5Acreate2(gid1, "myAttribute", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Write data to the attribute */
+    if(H5Awrite(aid, tid, &wdata) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the attribute's datatype */
+    if((atid = H5Aget_type(aid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the datatype is not committed */
+    if(H5Tcommitted(atid) == TRUE)
+        FAIL_STACK_ERROR
+
+    /* Close the attribute */
+    if(H5Aclose(aid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a chunked dataset */
+    if((sid2 = H5Screate_simple(2, dims, NULL)) < 0)
+        FAIL_STACK_ERROR
+
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunks) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize data buffers */
+    for(i = 0; i < 60; i++) {
+	wbuf[i] = i;
+	rbuf[i] = 0;
+    }
+
+    /* Create a dataset with the committed datatype in the group */
+    if((did = H5Dcreate2(gid1, "myDataset", tid, sid2, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Write to the dataset */
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the dataset's datatype */
+    if((dtid = H5Dget_type(did)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the datatype is not committed */
+    if(H5Tcommitted(dtid) == TRUE)
+        FAIL_STACK_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the dataset creation property list */
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the dataspaces */
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the datatypes */
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(atid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(dtid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the group */
+    if(H5Gclose(gid1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Open the mainfile */
+    if((fid1 = H5Fopen(filename1, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the committed datatype in the mainfile */
+    if((tid = H5Topen2(fid1, "myDatatype", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the datatype is committed */
+    if(H5Tcommitted(tid) == FALSE)
+        FAIL_STACK_ERROR
+
+    /* Open the group which is externally linked to target file */
+    if((gid1 = H5Gopen2(fid1, "link_to_2", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the attribute attached to the group */
+    if((aid = H5Aopen(gid1, "myAttribute", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the attribute's datatype */
+    if((atid = H5Aget_type(aid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the attribute's datatype is not committed */
+    if(H5Tcommitted(atid) == TRUE)
+        FAIL_STACK_ERROR
+
+    /* Close the attribute */
+    if(H5Aclose(aid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Delete the attribute */
+    if(H5Adelete(gid1, "myAttribute") < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset in the group */
+    if((did = H5Dopen2(gid1, "myDataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the dataset's datatype */
+    if((dtid = H5Dget_type(did)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the dataset's datatype is not committed */
+    if(H5Tcommitted(dtid) == TRUE)
+        FAIL_STACK_ERROR
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Compare the data read should be the same as wbuf */
+    if(HDmemcmp(wbuf, rbuf, sizeof(wbuf)) != 0)
+        FAIL_STACK_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the group */
+    if(H5Gclose(gid1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the datatypes */
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(atid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(dtid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid2);
+        H5Fclose(fid1);
+        H5Gclose(gid1);
+        H5Gclose(gid2);
+
+        H5Aclose(aid);
+        H5Dclose(did);
+
+        H5Sclose(sid);
+        H5Sclose(sid2);
+
+        H5Tclose(tid);
+        H5Aclose(atid);
+        H5Aclose(dtid);
+
+	H5Pclose(dcpl);
+    } H5E_END_TRY
+
+    return -1;
+} /* end external_link_with_committed_datatype() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    ud_hard_links
  *
  * Purpose:     Check that the functionality of hard links can be duplicated
@@ -10827,6 +11100,8 @@ corder_delete(hid_t fapl)
     for(reopen_file = FALSE; reopen_file <= TRUE; reopen_file++) {
         /* Create file */
         h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+	/* Creating file with latest format will enable paged aggregation with persistent fs */
         if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
 
         /* Close file */
@@ -14596,9 +14871,9 @@ error:
  *
  * Purpose:	Test links
  *
- * Return:	Success:	exit(0)
+ * Return:	Success:	exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(non-zero)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Robb Matzke
  *              Friday, August 14, 1998
@@ -14724,6 +14999,7 @@ main(void)
             nerrors += external_copy_invalid_object(my_fapl, new_format) < 0 ? 1 : 0;
             nerrors += external_dont_fail_to_source(my_fapl, new_format) < 0 ? 1 : 0;
             nerrors += external_open_twice(my_fapl, new_format) < 0 ? 1 : 0;
+	    nerrors += external_link_with_committed_datatype(my_fapl, new_format) < 0 ? 1 : 0;
         } /* end for */
 
         /* These tests assume that external links are a form of UD links,
@@ -14797,7 +15073,7 @@ main(void)
     if(nerrors) {
         printf("***** %d LINK TEST%s FAILED! *****\n",
                 nerrors, 1 == nerrors ? "" : "S");
-        HDexit(1);
+        HDexit(EXIT_FAILURE);
     }
     printf("All link tests passed.\n");
 
diff --git a/test/links_env.c b/test/links_env.c
index b3fec38..b32fb32 100644
--- a/test/links_env.c
+++ b/test/links_env.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -138,8 +136,8 @@ external_link_env(hid_t fapl, hbool_t new_format)
  *
  * Purpose:	Test external link with environment variable HDF5_EXT_PREFIX
  *
- * Return:	Success:	exit(0)
- *		Failure:	exit(non-zero)
+ * Return:	Success:	exit(EXIT_SUCCESS)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Vailin Choi; Nov 2010
  *
@@ -173,11 +171,11 @@ main(void)
 
     /* Results */
     if(nerrors) {
-        printf("***** %d External Link (HDF5_EXT_PREFIX) test%s FAILED! *****\n",
+        HDprintf("***** %d External Link (HDF5_EXT_PREFIX) test%s FAILED! *****\n",
                 nerrors, 1 == nerrors ? "" : "s");
-        exit(1);
+        HDexit(EXIT_FAILURE);
     }
-    printf("All external Link (HDF5_EXT_PREFIX) tests passed.\n");
+    HDprintf("All external Link (HDF5_EXT_PREFIX) tests passed.\n");
 
     /* clean up tmp directory created by external link tests */
     HDrmdir(TMPDIR);
@@ -185,6 +183,6 @@ main(void)
     return 0;
 
 error:
-    puts("*** TESTS FAILED ***");
+    HDputs("*** TESTS FAILED ***");
     return 1;
 }
diff --git a/test/mergemsg.h5 b/test/mergemsg.h5
index 55c3135..3a9e352 100644
Binary files a/test/mergemsg.h5 and b/test/mergemsg.h5 differ
diff --git a/test/mf.c b/test/mf.c
index a36b1ec..3197989 100644
--- a/test/mf.c
+++ b/test/mf.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,6 +18,7 @@
  *	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
+ * 	test_page_*() tests for file space paging
  */
 
 #include "h5test.h"
@@ -38,41 +37,63 @@
 #include "H5Iprivate.h"
 #include "H5VMprivate.h"
 
-#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
-#define TEST_BLOCK_SIZE50	50
-#define TEST_BLOCK_SIZE80	80
-#define TEST_BLOCK_SIZE200 	200
-#define TEST_BLOCK_SIZE600 	600
-#define TEST_BLOCK_SIZE700 	700
-#define TEST_BLOCK_SIZE1034 	1034
-#define TEST_BLOCK_SIZE1970	1970
-#define TEST_BLOCK_SIZE2058	2058
-#define TEST_BLOCK_SIZE8000	8000
-#define TEST_BLOCK_SIZE2048	2048
-
-#define TEST_BLOCK_ADDR70	70
-#define TEST_BLOCK_ADDR100	100
-
-#define TEST_ALIGN1024		1024
-#define TEST_ALIGN4096		4096
-
-#define TEST_THRESHOLD10	10
-#define TEST_THRESHOLD3		3
-
-#define CORE_INCREMENT  1024
-#define FAMILY_SIZE     1024
+#define FILENAME_LEN        1024
+
+#define TBLOCK_SIZE1    1
+#define TBLOCK_SIZE2    2
+#define TBLOCK_SIZE3    3
+#define TBLOCK_SIZE4    4
+#define TBLOCK_SIZE5    5
+#define TBLOCK_SIZE6    6
+#define TBLOCK_SIZE7    7
+#define TBLOCK_SIZE8    8
+#define TBLOCK_SIZE10   10
+#define TBLOCK_SIZE11   11
+#define TBLOCK_SIZE20   20
+#define TBLOCK_SIZE30   30
+#define TBLOCK_SIZE36   36
+#define TBLOCK_SIZE40   40
+#define TBLOCK_SIZE50   50
+#define TBLOCK_SIZE80   80
+#define TBLOCK_SIZE90   90
+#define TBLOCK_SIZE98   98
+#define TBLOCK_SIZE100  100
+#define TBLOCK_SIZE150  150
+#define TBLOCK_SIZE200  200
+#define TBLOCK_SIZE600  600
+#define TBLOCK_SIZE700  700
+#define TBLOCK_SIZE1034 1034
+#define TBLOCK_SIZE1970 1970
+#define TBLOCK_SIZE2048 2048
+#define TBLOCK_SIZE2058 2058
+#define TBLOCK_SIZE2192 2192
+#define TBLOCK_SIZE3080 3080
+#define TBLOCK_SIZE3088 3088
+#define TBLOCK_SIZE3198 3198
+#define TBLOCK_SIZE3286 3286
+#define TBLOCK_SIZE3248 3248
+#define TBLOCK_SIZE3900 3900
+#define TBLOCK_SIZE4020 4020
+#define TBLOCK_SIZE4086 4086
+#define TBLOCK_SIZE4096 4096
+#define TBLOCK_SIZE4106 4106
+#define TBLOCK_SIZE5000 5000
+#define TBLOCK_SIZE6000 6000
+#define TBLOCK_SIZE8000 8000
+#define TBLOCK_SIZE8100 8100
+#define TBLOCK_SIZE8192 8192
+#define TBLOCK_SIZE8190 8190
+#define TBLOCK_SIZE12000    12000
+
+#define TBLOCK_ADDR70   70
+#define TBLOCK_ADDR100  100
+
+#define TEST_ALIGN16        16
+#define TEST_ALIGN1024      1024
+#define TEST_ALIGN4096      4096
+
+#define TEST_THRESHOLD10    10
+#define TEST_THRESHOLD3     3
 
 const char *FILENAME[] = {
     "mf",
@@ -80,24 +101,17 @@ const char *FILENAME[] = {
 };
 
 typedef enum {
-    TEST_NORMAL,          	/* size of aggregator is >= alignment size */
-    TEST_AGGR_SMALL,          	/* size of aggregator is smaller than alignment size */
-    TEST_NTESTS           	/* The number of test types, must be last */
+    TEST_NORMAL,            /* size of aggregator is >= alignment size */
+    TEST_AGGR_SMALL,            /* size of aggregator is smaller than alignment size */
+    TEST_NTESTS             /* The number of test types, must be last */
 } test_type_t;
 
-typedef struct frspace_state_t {
-    hsize_t tot_space;          /* Total amount of space tracked              */
-    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      */
-} frspace_state_t;
+static int check_stats(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *state);
 
-
-static int check_stats(const H5F_t *, const H5FS_t *, frspace_state_t *);
 static unsigned test_mf_eoa(const char *env_h5_drvr, hid_t fapl);
 static unsigned test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl);
 static unsigned test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl);
-static unsigned test_mf_tmp(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_dichotomy(hid_t fapl);
 static unsigned test_mf_fs_start(hid_t fapl);
 static unsigned test_mf_fs_alloc_free(hid_t fapl);
 static unsigned test_mf_fs_extend(hid_t fapl);
@@ -119,21 +133,27 @@ 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);
+static unsigned test_mf_tmp(const char *env_h5_drvr, hid_t fapl, hbool_t new_format);
+static unsigned test_mf_fs_gone(const char *env_h5_drvr, hid_t fapl, hbool_t new_format); 
+static unsigned test_mf_strat_thres_gone(const char *env_h5_drvr, hid_t fapl, hbool_t new_format);
+static unsigned test_mf_fs_persist(const char *env_h5_drvr, hid_t fapl, hbool_t new_format);
+static unsigned test_mf_strat_thres_persist(const char *env_h5_drvr, hid_t fapl, hbool_t new_format);
+static unsigned test_mf_fs_persist_split(void);
+static unsigned test_mf_fs_persist_multi(void);
+static unsigned test_page_alloc_xfree(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_small(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_large(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_large_try_extend(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_small_try_extend(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_try_shrink(const char *env_h5_drvr, hid_t fapl);
+static unsigned test_page_alignment(const char *env_h5_drvr, hid_t fapl);
 
 /*
  * Verify statistics for the free-space manager
  *
- *  Modifications:
- *      Vailin Choi; July 2012
- *      To ensure "f" and "frsp" are valid pointers 
  */
 static int
-check_stats(const H5F_t *f, const H5FS_t *frsp, frspace_state_t *state)
+check_stats(const H5F_t *f, const H5FS_t *frsp, H5FS_stat_t *state)
 {
     H5FS_stat_t frspace_stats;             /* Statistics about the heap */
 
@@ -146,22 +166,22 @@ check_stats(const H5F_t *f, const H5FS_t *frsp, frspace_state_t *state)
 
     if(frspace_stats.tot_space != state->tot_space) {
         HDfprintf(stdout, "frspace_stats.tot_space = %Hu, state->tot_space = %Zu\n",
-	    frspace_stats.tot_space, state->tot_space);
+                  frspace_stats.tot_space, state->tot_space);
         TEST_ERROR
     } /* end if */
     if(frspace_stats.tot_sect_count != state->tot_sect_count) {
         HDfprintf(stdout, "frspace_stats.tot_sect_count = %Hu, state->tot_sect_count = %Hu\n",
-	    frspace_stats.tot_sect_count, state->tot_sect_count);
+                  frspace_stats.tot_sect_count, state->tot_sect_count);
         TEST_ERROR
     } /* end if */
     if(frspace_stats.serial_sect_count != state->serial_sect_count) {
         HDfprintf(stdout, "frspace_stats.serial_sect_count = %Hu, state->serial_sect_count = %Hu\n",
-	    frspace_stats.serial_sect_count, state->serial_sect_count);
+                  frspace_stats.serial_sect_count, state->serial_sect_count);
         TEST_ERROR
     } /* end if */
     if(frspace_stats.ghost_sect_count != state->ghost_sect_count) {
         HDfprintf(stdout, "frspace_stats.ghost_sect_count = %Hu, state->ghost_sect_count = %Hu\n",
-	    frspace_stats.ghost_sect_count, state->ghost_sect_count);
+                  frspace_stats.ghost_sect_count, state->ghost_sect_count);
         TEST_ERROR
     } /* end if */
 
@@ -173,13 +193,15 @@ error:
 } /* check_stats() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from file allocation
  *
  * Set up:
- * 	Turn off using meta/small data aggregator
- * 	There is nothing in free-space manager
+ *  Turn off using meta/small data aggregator
+ *  There is nothing in free-space manager
  *
  * Allocate two blocks which should be from file allocation
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_eoa(const char *env_h5_drvr, hid_t fapl)
@@ -234,7 +256,7 @@ test_mf_eoa(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* nothing should be changed in meta_aggr */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &ma_size);
@@ -244,7 +266,7 @@ test_mf_eoa(const char *env_h5_drvr, hid_t fapl)
         if (addr1 < (haddr_t)file_size)
             TEST_ERROR
 
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* nothing should be changed in meta_aggr */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &ma_size);
@@ -262,7 +284,7 @@ test_mf_eoa(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != (file_size+TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50))
+        if (new_file_size != (file_size+TBLOCK_SIZE30+TBLOCK_SIZE50))
             TEST_ERROR
 
         /* Re-open the file */
@@ -273,8 +295,8 @@ test_mf_eoa(const char *env_h5_drvr, hid_t fapl)
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -308,6 +330,7 @@ error:
 } /* test_mf_eoa() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that an allocated block from file allocation is shrunk.
  *
  * Set up:
@@ -323,6 +346,7 @@ error:
  *	Test 4: Allocate a block of 30 from file allocation
  * 		H5MF_try_shrink() the block by 20 from the end: succeed
  *
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
@@ -377,7 +401,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         if (addr < (haddr_t)file_size)
             TEST_ERROR
@@ -395,7 +419,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != (file_size+TEST_BLOCK_SIZE30))
+        if (new_file_size != (file_size+TBLOCK_SIZE30))
             TEST_ERROR
 
         /* Re-open the file */
@@ -409,7 +433,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         /* should succeed */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30) <= 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30) <= 0)
             TEST_ERROR
 
         /* nothing should be changed in meta_aggr */
@@ -453,13 +477,13 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         if (addr < (haddr_t)file_size)
             TEST_ERROR
 
         /* should not succeed in shrinking */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30 - 10) > 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30 - 10) > 0)
             TEST_ERROR
 
         /* nothing should be changed in meta_aggr */
@@ -475,7 +499,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if(new_file_size != (file_size + TEST_BLOCK_SIZE30))
+        if(new_file_size != (file_size + TBLOCK_SIZE30))
             TEST_ERROR
 
         PASSED()
@@ -503,7 +527,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         /* should not succeed in shrinking */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30 + 10) > 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30 + 10) > 0)
             TEST_ERROR
 
         /* nothing should be changed in meta_aggr */
@@ -519,7 +543,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if(new_file_size != (file_size + TEST_BLOCK_SIZE30))
+        if(new_file_size != (file_size + TBLOCK_SIZE30))
             TEST_ERROR
 
         PASSED()
@@ -546,7 +570,7 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         /* should succeed in shrinking */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr+10, (hsize_t)(TEST_BLOCK_SIZE30 - 10)) <= 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr+10, (hsize_t)(TBLOCK_SIZE30 - 10)) <= 0)
             TEST_ERROR
 
         /* nothing should be changed in meta_aggr */
@@ -588,6 +612,7 @@ error:
 } /* test_mf_eoa_shrink() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that an allocated block from file allocation is extended.
  *
  * Set up:
@@ -599,6 +624,7 @@ error:
  *
  * Test 2: Allocate a block of 30
  * 	H5MF_try_extend() the block of size 20 by 50: fail
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
@@ -656,7 +682,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         if (addr < (haddr_t)file_size)
             TEST_ERROR
 
@@ -673,7 +699,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if(new_file_size != (file_size + TEST_BLOCK_SIZE30))
+        if(new_file_size != (file_size + TBLOCK_SIZE30))
             TEST_ERROR
 
         /* Re-open the file */
@@ -685,7 +711,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
             FAIL_STACK_ERROR
 
         /* should succeed */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr, (hsize_t)TEST_BLOCK_SIZE30, (hsize_t)TEST_BLOCK_SIZE50);
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr, (hsize_t)TBLOCK_SIZE30, (hsize_t)TBLOCK_SIZE50);
 
         if(was_extended <= 0)
             TEST_ERROR
@@ -703,7 +729,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if(new_file_size != (file_size + TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50))
+        if(new_file_size != (file_size + TBLOCK_SIZE30 + TBLOCK_SIZE50))
             TEST_ERROR
 
         PASSED()
@@ -734,7 +760,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         if(addr < (haddr_t)file_size)
             TEST_ERROR
@@ -744,7 +770,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
         if(new_ma_addr != ma_addr)
             TEST_ERROR
 
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr, (hsize_t)(TEST_BLOCK_SIZE30-10), (hsize_t)(TEST_BLOCK_SIZE50));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr, (hsize_t)(TBLOCK_SIZE30-10), (hsize_t)(TBLOCK_SIZE50));
 
         /* should not succeed */
         if(was_extended > 0)
@@ -763,7 +789,7 @@ test_mf_eoa_extend(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if(new_file_size != file_size + TEST_BLOCK_SIZE30)
+        if(new_file_size != file_size + TBLOCK_SIZE30)
             TEST_ERROR
 
         if(H5Pclose(fapl_new) < 0)
@@ -787,6 +813,7 @@ error:
 } /* test_mf_eoa_extend() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that temporary blocks are allocated correctly
  *
  * Set up:
@@ -806,13 +833,19 @@ error:
  *              space fails
  *         - Check that allocating another 1/2 of the file as normal address
  *              space fails
+ *-------------------------------------------------------------------------
  */
 static unsigned
-test_mf_tmp(const char *env_h5_drvr, hid_t fapl)
+test_mf_tmp(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
 {
-    hid_t	file = -1;              /* File ID */
+    hid_t   file = -1;      /* File ID */
+    hid_t   fapl2 = -1;     /* File access property list */
+    hid_t   fcpl = -1;      /* File creation property list */
 
-    TESTING("'temporary' file space allocation");
+    if(new_format)
+        TESTING("'temporary' file space allocation with new library format")
+    else
+        TESTING("'temporary' file space allocation with old library format")
 
     /* Can't run this test with multi-file VFDs */
     if(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi") && HDstrcmp(env_h5_drvr, "family")) {
@@ -829,8 +862,22 @@ test_mf_tmp(const char *env_h5_drvr, hid_t fapl)
         /* Set the filename to use for this test */
         h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        if(new_format) {
+            /* Copy the file access property list */
+            if((fapl2 = H5Pcopy(fapl)) < 0) FAIL_STACK_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)
+                FAIL_STACK_ERROR
+
+            H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+        } /* end if */
+
         /* Create the file to work on */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, new_format?fapl2:fapl)) < 0)
             FAIL_STACK_ERROR
 
         /* Close file */
@@ -855,13 +902,13 @@ test_mf_tmp(const char *env_h5_drvr, hid_t fapl)
             FAIL_STACK_ERROR
 
         /* Allocate some temporary address space */
-        if(HADDR_UNDEF == (tmp_addr = H5MF_alloc_tmp(f, (hsize_t)TEST_BLOCK_SIZE30)))
+        if(HADDR_UNDEF == (tmp_addr = H5MF_alloc_tmp(f, (hsize_t)TBLOCK_SIZE30)))
             FAIL_STACK_ERROR
 
         /* Check if temporary file address is valid */
         if(!H5F_IS_TMP_ADDR(f, tmp_addr))
             TEST_ERROR
-        if(tmp_addr < (haddr_t)(maxaddr - TEST_BLOCK_SIZE30))
+        if(tmp_addr < (haddr_t)(maxaddr - TBLOCK_SIZE30))
             TEST_ERROR
 
         /* Reading & writing with a temporary address value should fail */
@@ -878,7 +925,7 @@ test_mf_tmp(const char *env_h5_drvr, hid_t fapl)
 
         /* Freeing a temporary address value should fail */
         H5E_BEGIN_TRY {
-            status = H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, tmp_addr, (hsize_t)TEST_BLOCK_SIZE30);
+            status = H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, tmp_addr, (hsize_t)TBLOCK_SIZE30);
         } H5E_END_TRY;
         if(status >= 0)
             TEST_ERROR
@@ -963,10 +1010,12 @@ error:
 } /* test_mf_tmp() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that the free-space manager is created or opened
  *
  * Set up:
  * 	Turn off using meta/small data aggregator
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_fs_start(hid_t fapl)
@@ -976,11 +1025,10 @@ test_mf_fs_start(hid_t 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 */
-    H5FD_mem_t 		type;
-    frspace_state_t 	state;
+    H5FS_stat_t         state;
 
 
-    TESTING("H5MF_alloc_create()/H5MF_alloc_open() of free-space manager");
+    TESTING("H5MF_create_fstype()/H5MF_open_fstype() of free-space manager");
 
     /* Set the filename to use for this test (dependent on fapl) */
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
@@ -1011,20 +1059,18 @@ test_mf_fs_start(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    /* Start up free-space manager */
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
 
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
-
-    HDmemset(&state, 0, sizeof(frspace_state_t));
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     if(H5Fclose(file) < 0)
@@ -1055,6 +1101,7 @@ error:
 
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block is allocated/freed from/to the free-space manager
  *
  * Set up:
@@ -1078,10 +1125,7 @@ error:
  *	The block is allocated from file allocation
  *	Deallocate the block which will be returned to free-space manager
  *	(the space is shrunk and freed since it is at end of file)
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Initialize the new field "allow_eoa_shrink_only" for user data.
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_fs_alloc_free(hid_t fapl)
@@ -1091,12 +1135,10 @@ test_mf_fs_alloc_free(hid_t 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 */
-    H5FD_mem_t 		type;
     H5MF_free_section_t *sect_node = NULL;
-    haddr_t		addr;
-    frspace_state_t 	state;
-    H5MF_sect_ud_t 	udata;
-    H5FS_section_info_t *node;
+    haddr_t     addr;
+    haddr_t     tmp;
+    H5FS_stat_t     state;
 
     TESTING("H5MF_alloc()/H5MF_xfree() of free-space manager:test 1");
 
@@ -1129,69 +1171,59 @@ test_mf_fs_alloc_free(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
     /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 30 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
     /* Verify that the allocated block is section A in free-space */
-    if (addr != TEST_BLOCK_ADDR70)
+    if(addr != TBLOCK_ADDR70)
 	TEST_ERROR
 
-    state.tot_space -= TEST_BLOCK_SIZE30;
+    state.tot_space -= TBLOCK_SIZE30;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the block to free-space */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
 
-    state.tot_space += TEST_BLOCK_SIZE30;
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove section A from free-space */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-            (hsize_t)TEST_BLOCK_SIZE30, (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30, f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
-    /* Free the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(tmp != TBLOCK_ADDR70)
+        TEST_ERROR
 
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -1216,67 +1248,57 @@ test_mf_fs_alloc_free(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
-    /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+     /* Add section A to free-space manager */
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 20 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE20));
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE20));
 
     /* Verify that the allocated block is section A in free-space manager */
-    if (addr != TEST_BLOCK_ADDR70)
+    if(addr != TBLOCK_ADDR70)
 	TEST_ERROR
 
     /* should still have 1 section of size 10 left in free-space manager */
-    state.tot_space -= (TEST_BLOCK_SIZE20);
+    state.tot_space -= (TBLOCK_SIZE20);
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the block to free-space manager */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE20));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE20));
 
     /* Still 1 section in free-space because of merging */
-    state.tot_space += TEST_BLOCK_SIZE20;
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    state.tot_space += TBLOCK_SIZE20;
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
-    /* Remove section A from free-space manager */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)TEST_BLOCK_SIZE30, (H5FS_section_info_t **)&node) < 0)
-	FAIL_STACK_ERROR
+    /* Remove section A from free-space */
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30, f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
-    /* Free the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(tmp != TBLOCK_ADDR70)
+        TEST_ERROR
 
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -1301,36 +1323,28 @@ test_mf_fs_alloc_free(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
     /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /*
@@ -1338,38 +1352,37 @@ test_mf_fs_alloc_free(hid_t fapl)
      * Since free-space manager cannot fulfull the request,
      * the block is obtained from file allocation
      */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE40));
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE40));
 
     /* Verify that the allocated block is not section A in free-space */
-    if (addr == TEST_BLOCK_ADDR70)
-	TEST_ERROR
+    if(addr == TBLOCK_ADDR70)
+        TEST_ERROR
 
     /* free-space info should be the same  */
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove section A from free-space */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)TEST_BLOCK_SIZE30, (H5FS_section_info_t **)&node) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30, f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
-    /* Free the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    /* Verify that the block is section A in free-space */
+    if(tmp != TBLOCK_ADDR70)
+        TEST_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the block of size 40 to free-space */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE40));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE40));
 
     /*
      * Free-space info is the same.
      * The block is returned to free-space.
      * It is shrunk and freed because it is at end of file.
      */
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     if(H5Fclose(file) < 0)
@@ -1400,6 +1413,7 @@ error:
 
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block allocated from the free-space manager can be extended
  *
  * Set up:
@@ -1435,10 +1449,7 @@ error:
  * 	Try to extend the allocated block by 50 from the free-space_manager:
  *	Fail: section A does not adjoin section B (70+20 != address of section B) even though
  *	      the requested-size (50) equal to size of section B (50)
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Initialize the new field "allow_eoa_shrink_only" for user data.
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_fs_extend(hid_t fapl)
@@ -1448,13 +1459,11 @@ test_mf_fs_extend(hid_t 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 */
-    H5FD_mem_t 		type;
     H5MF_free_section_t *sect_node1 = NULL, *sect_node2=NULL;
-    haddr_t		addr;
-    frspace_state_t 	state;          	/* State of free space*/
-    H5MF_sect_ud_t 	udata;
-    H5FS_section_info_t *node;
-    htri_t      	was_extended;
+    haddr_t     addr;
+    haddr_t     tmp;
+    H5FS_stat_t     state;              /* State of free space*/
+    htri_t          was_extended;
 
     TESTING("H5MF_try_extend() of free-space manager:test 1");
 
@@ -1487,101 +1496,91 @@ test_mf_fs_extend(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node1 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    sect_node1 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
     /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node1, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node1))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 30 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
     /* Verify that the allocated block is section A in free-space manager */
-    if (addr != TEST_BLOCK_ADDR70)
-	TEST_ERROR
+    if(addr != TBLOCK_ADDR70)
+        TEST_ERROR
 
-    state.tot_space -= TEST_BLOCK_SIZE30;
+    state.tot_space -= TBLOCK_SIZE30;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Create section B */
-    sect_node2 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR100, (hsize_t)TEST_BLOCK_SIZE50);
+    sect_node2 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR100, (hsize_t)TBLOCK_SIZE50);
 
     /* Add section B to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node2, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node2))
+        FAIL_STACK_ERROR
 
-    state.tot_space += TEST_BLOCK_SIZE50;
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Try to extend the allocated block */
-    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30, (hsize_t)TEST_BLOCK_SIZE50);
+    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_SUPER, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30, (hsize_t)TBLOCK_SIZE50);
 
     /* should succeed */
     if(was_extended <= 0)
 	TEST_ERROR
 
     /* Section B is removed from free-space manager */
-    state.tot_space -= TEST_BLOCK_SIZE50;
+    state.tot_space -= TBLOCK_SIZE50;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the extended block to free-space manager */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50));
 
     /* Verify that the extended block is back into free-space */
-    state.tot_space += TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50;
+    state.tot_space += (TBLOCK_SIZE30+TBLOCK_SIZE50);
     state.tot_sect_count = 1;
     state.serial_sect_count = 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove the extended block */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50), (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
-
-    /* Remove the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
+    if(tmp != TBLOCK_ADDR70)
+        TEST_ERROR
+    
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
 
@@ -1605,95 +1604,84 @@ test_mf_fs_extend(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node1 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
+    sect_node1 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
-
-    /* Add section A to free-space */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node1, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    /* Add section A to free-space manager */
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node1))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 30 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
     /* Verify that the allocated block is section A in free-space manager */
-    if (addr != TEST_BLOCK_ADDR70)
-	TEST_ERROR
+    if(addr != TBLOCK_ADDR70)
+        TEST_ERROR
 
-    state.tot_space -= TEST_BLOCK_SIZE30;
+    state.tot_space -= TBLOCK_SIZE30;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Create section B */
-    sect_node2 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR100, (hsize_t)TEST_BLOCK_SIZE50);
+    sect_node2 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR100, (hsize_t)TBLOCK_SIZE50);
 
     /* Add section B to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node2, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node2))
+        FAIL_STACK_ERROR
 
-    state.tot_space += TEST_BLOCK_SIZE50;
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Try to extend the allocated block */
-    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30, (hsize_t)(TEST_BLOCK_SIZE50+10));
+    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_SUPER, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30, (hsize_t)(TBLOCK_SIZE50+10));
 
     /* Should not be able to extend the allocated block */
     if(was_extended)
 	TEST_ERROR
 
     /* free-space info should remain the same */
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the allocated block A to free-space */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
 
     /* the returned section A is merged with section B in free-space */
     /* rest of the info remains the same */
-    state.tot_space += TEST_BLOCK_SIZE30;
+    state.tot_space += TBLOCK_SIZE30;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove the merged sections A & B from free-space */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50), (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
-    /* Remove the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(tmp != addr) TEST_ERROR
 
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -1718,95 +1706,84 @@ test_mf_fs_extend(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node1 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30);
+    sect_node1 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30);
 
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
-
-    /* Add section A to free-space */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node1, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    /* Add section A to free-space manager */
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node1))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE30;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE30;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 30 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
     /* Verify that the allocated block is section A in free-space manager */
-    if (addr != TEST_BLOCK_ADDR70)
-	TEST_ERROR
+    if(addr != TBLOCK_ADDR70)
+        TEST_ERROR
 
-    state.tot_space -= TEST_BLOCK_SIZE30;
+    state.tot_space -= TBLOCK_SIZE30;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Create section B */
-    sect_node2 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR100, (hsize_t)TEST_BLOCK_SIZE50);
+    sect_node2 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR100, (hsize_t)TBLOCK_SIZE50);
 
     /* Add section B to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node2, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node2))
+        FAIL_STACK_ERROR
 
-    state.tot_space += TEST_BLOCK_SIZE50;
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Try to extend the allocated block */
-    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE30, (hsize_t)(TEST_BLOCK_SIZE40));
+    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_SUPER, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE30, (hsize_t)(TBLOCK_SIZE40));
 
     /* Should succeed in extending the allocated block */
     if(was_extended <=0)
 	TEST_ERROR
 
     /* Should have 1 section of size=10 left in free-space manager */
-    state.tot_space -= (TEST_BLOCK_SIZE40);
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    state.tot_space -= (TBLOCK_SIZE40);
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the extended block  */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE40));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE40));
 
     /* rest info is same, the extended section returned is merged with the section in free-space */
-    state.tot_space += (TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE40);
+    state.tot_space += (TBLOCK_SIZE30+TBLOCK_SIZE40);
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove the merged sections A & B from free-space */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50), (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
-
-    /* Remove the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
+ 
+    if(tmp != addr) TEST_ERROR
 
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -1831,104 +1808,88 @@ test_mf_fs_extend(hid_t fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
 
     /* Create section A */
-    sect_node1 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)(TEST_BLOCK_SIZE30-10));
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    sect_node1 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)(TBLOCK_SIZE30-10));
 
     /* Add section A of size=20 to free-space */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node1, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node1))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += (TEST_BLOCK_SIZE30-10);
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += (TBLOCK_SIZE30-10);
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of size=20 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE30-10));
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30-10));
 
     /* Verify that the allocated block is section A in free-space manager */
-    if (addr != TEST_BLOCK_ADDR70)
-	TEST_ERROR
+    if(addr != TBLOCK_ADDR70)
+        TEST_ERROR
 
-    state.tot_space -= (TEST_BLOCK_SIZE30-10);
+    state.tot_space -= (TBLOCK_SIZE30-10);
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Create section B */
-    sect_node2 = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR100, (hsize_t)TEST_BLOCK_SIZE50);
+    sect_node2 = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR100, (hsize_t)TBLOCK_SIZE50);
 
     /* Add section B to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node2, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node2))
+        FAIL_STACK_ERROR
 
-    state.tot_space += TEST_BLOCK_SIZE50;
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Try to extend the allocated block */
-    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)TEST_BLOCK_ADDR70, (hsize_t)(TEST_BLOCK_SIZE30-10), (hsize_t)TEST_BLOCK_SIZE50);
+    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_SUPER, (haddr_t)TBLOCK_ADDR70, (hsize_t)(TBLOCK_SIZE30-10), (hsize_t)TBLOCK_SIZE50);
 
     /* Should not succeed in extending the allocated block */
     if(was_extended)
 	TEST_ERROR
 
     /* Free-space info should be the same */
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the allocated block */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE30-10));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE30-10));
 
-    state.tot_space += (TEST_BLOCK_SIZE30-10);
+    state.tot_space += (TBLOCK_SIZE30-10);
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Remove section A from free-space manger */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)(TEST_BLOCK_SIZE30-10), (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30-10), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
-    /* Remove the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(tmp != addr) TEST_ERROR
 
     /* Remove section B from free-space manager */
-    if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		    (hsize_t)TEST_BLOCK_SIZE50, (H5FS_section_info_t **)&node) < 0)
-	TEST_ERROR
-
-    /* Remove the free-space section node */
-    if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-	TEST_ERROR
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50, f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
+        TEST_ERROR
 
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -1957,6 +1918,7 @@ error:
 } /* test_mf_fs_extend() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that an aggregator is absorbed into a section.
  *
  *	Test 1: To aborb the aggregator onto the beginning of the section
@@ -1979,25 +1941,20 @@ error:
  *			which will absorb meta_aggr to the section:
  *			  section size + remaining size of aggregator is > aggr->alloc_size,
  *			  section is allowed to absorb an aggregator (allow_sect_absorb is true)
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Initialize the new field "allow_eoa_shrink_only" for user data.
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_fs_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 */
-    H5FD_mem_t 		type, stype;
-    haddr_t		addr, saddr;
-    haddr_t 		ma_addr=HADDR_UNDEF;
-    hsize_t 		ma_size=0;
+    hid_t       file = -1;              /* File ID */
+    char        filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t       *f = NULL;              /* Internal file object pointer */
+    haddr_t     addr, saddr;
+    haddr_t     tmp;
+    haddr_t     ma_addr=HADDR_UNDEF;
+    hsize_t     ma_size=0;
     H5MF_free_section_t *sect_node=NULL;
-    H5MF_sect_ud_t 	udata;
-    H5FS_section_info_t *node;
-    hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
+    hbool_t    contig_addr_vfd;         /* Whether VFD used has a contigous address space */ 
 
     TESTING("A free-space section absorbs an aggregator: test 1");
 
@@ -2023,53 +1980,39 @@ test_mf_fs_absorb(const char *env_h5_drvr, hid_t fapl)
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
 
-        type = H5FD_MEM_SUPER;
-
-        if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
-            TEST_ERROR
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-        if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
+        if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
             TEST_ERROR
-        if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
+        if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
             TEST_ERROR
 
         /* Allocate a section from meta_aggr */
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        /* Add a section to free-space that adjoins end of the aggregator */
-        sect_node = H5MF_sect_simple_new((haddr_t)(ma_addr+ma_size), (hsize_t)TEST_BLOCK_SIZE2048);
-
-        /* Construct user data for callbacks */
-        udata.f = f;
-        udata.dxpl_id = H5AC_ind_read_dxpl_id;
-        udata.alloc_type = type;
-        udata.allow_sect_absorb = TRUE;
-	udata.allow_eoa_shrink_only = FALSE;
+    /* Create a section */
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)(ma_addr+ma_size), (hsize_t)TBLOCK_SIZE2048);
 
-        /* When adding, meta_aggr is absorbed onto the beginning of the section */
-        if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-                FAIL_STACK_ERROR
+        /* Add a section to free-space that adjoins end of the aggregator */
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
         /* Verify that the section did absorb the aggregator */
-        if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-                        (hsize_t)TEST_BLOCK_SIZE2048, (H5FS_section_info_t **)&node) < 0)
+    if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(ma_addr+ma_size), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
             TEST_ERROR
 
-        if (node->addr != ma_addr)	TEST_ERROR
-        if (node->size != (ma_size + TEST_BLOCK_SIZE2048))	TEST_ERROR
-
-        /* Remove the free-space section node */
-        if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
-            TEST_ERROR
+        if(tmp != ma_addr)  TEST_ERROR
 
         /* Restore info for aggregator */
         f->shared->meta_aggr.addr = ma_addr;
         f->shared->meta_aggr.size = ma_size;
 
         /* Remove section from meta_aggr */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2093,48 +2036,34 @@ test_mf_fs_absorb(const char *env_h5_drvr, hid_t fapl)
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
 
-        type = H5FD_MEM_SUPER;
-
-        if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
-            TEST_ERROR
+        /* Start up H5FD_MEM_SUPER free-space manager */
+        if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+            FAIL_STACK_ERROR
 
-        if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
+        if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
             TEST_ERROR
-        if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
+        if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
             TEST_ERROR
 
         /* Allocate a section from meta_aggr */
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         /* Allocate a section from sdata_aggr */
-        stype = H5FD_MEM_DRAW;
-        saddr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Add a section to free-space that adjoins the beginning of meta_aggr */
-        sect_node = H5MF_sect_simple_new((haddr_t)addr, (hsize_t)TEST_BLOCK_SIZE30);
-
-        /* Construct user data for callbacks */
-        udata.f = f;
-        udata.dxpl_id = H5AC_ind_read_dxpl_id;
-        udata.alloc_type = type;
-        udata.allow_sect_absorb = TRUE;
-        udata.allow_eoa_shrink_only = FALSE;
+        sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)addr, (hsize_t)TBLOCK_SIZE30);
 
         /* When adding, meta_aggr is absorbed onto the end of the section */
-        if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-                FAIL_STACK_ERROR
+        if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+            FAIL_STACK_ERROR
 
         /* Verify that the section did absorb the aggregator */
-        if(H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-                        (hsize_t)(ma_size+TEST_BLOCK_SIZE30), (H5FS_section_info_t **)&node) < 0)
+        if(H5MF_find_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(ma_size+TBLOCK_SIZE30), f->shared->fs_man[H5FD_MEM_SUPER], &tmp) != TRUE)
             TEST_ERROR
 
-        if ((node->addr + TEST_BLOCK_SIZE30) != ma_addr)	TEST_ERROR
-        if (node->size != (ma_size + TEST_BLOCK_SIZE30))	TEST_ERROR
-
-        /* free the free-space section node */
-        if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
+        if((tmp + TBLOCK_SIZE30) != ma_addr) 
             TEST_ERROR
 
         /* restore info to meta_aggr */
@@ -2142,9 +2071,9 @@ test_mf_fs_absorb(const char *env_h5_drvr, hid_t fapl)
         f->shared->meta_aggr.size = ma_size;
 
         /* Remove section from meta_aggr */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
         /* Remove section from sdata_aggr */
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2166,6 +2095,7 @@ error:
 } /* test_mf_fs_absorb() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr: (nothing in the aggregator)
@@ -2180,6 +2110,7 @@ error:
  *	Result:
  *		The second block of 50 is allocated from meta_aggr
  *		There is space of 1968 left in meta_aggr
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc1(const char *env_h5_drvr, hid_t fapl)
@@ -2187,6 +2118,7 @@ test_mf_aggr_alloc1(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 */
+    hid_t       fcpl;                   /* File creation property list */
     h5_stat_size_t      file_size, new_file_size; /* file size */
     H5FD_mem_t 		type;
     haddr_t		addr1, addr2;
@@ -2202,13 +2134,21 @@ test_mf_aggr_alloc1(const char *env_h5_drvr, hid_t fapl)
         /* Set the filename to use for this test (dependent on fapl) */
         h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
+        /* File creation property list template */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            TEST_ERROR
+
+        /* Set to H5F_FSPACE_STRATEGY_AGGR strategy */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_AGGR, FALSE, (hsize_t)1) < 0)
+            TEST_ERROR
+
         /* Create the file to work on */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
             FAIL_STACK_ERROR
 
         /* Close file */
         if(H5Fclose(file) < 0)
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Get the size of a file  */
         if((file_size = h5_get_file_size(filename, fapl)) < 0)
@@ -2216,54 +2156,58 @@ test_mf_aggr_alloc1(const char *env_h5_drvr, hid_t fapl)
 
         /* Re-open the file */
         if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Get a pointer to the internal file object */
         if(NULL == (f = (H5F_t *)H5I_object(file)))
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Allocate first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        if((addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30)) == HADDR_UNDEF)
+            TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate second block from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        if((addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50)) == HADDR_UNDEF)
+            TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr2+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         if(H5Fclose(file) < 0)
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Get the size of the file */
         if((new_file_size = h5_get_file_size(filename, fapl)) < 0)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != (file_size+TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50))
+        if(new_file_size != (file_size+TBLOCK_SIZE30+TBLOCK_SIZE50))
             TEST_ERROR
 
         /* Re-open the file */
         if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Get a pointer to the internal file object */
         if(NULL == (f = (H5F_t *)H5I_object(file)))
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
-        /* Free the two blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
+        /* Free the two blocks: order matters because of H5F_FSPACE_STRATEGY_AGGR strategy */
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50) < 0)
+            TEST_ERROR
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30) < 0)
+            TEST_ERROR
 
         if(H5Fclose(file) < 0)
-            FAIL_STACK_ERROR
+            TEST_ERROR
 
         /* Get the size of the file */
         if((new_file_size = h5_get_file_size(filename, fapl)) < 0)
@@ -2273,6 +2217,9 @@ test_mf_aggr_alloc1(const char *env_h5_drvr, hid_t fapl)
         if (new_file_size != file_size)
             TEST_ERROR
 
+        if(H5Pclose(fcpl) < 0)
+            TEST_ERROR
+
         PASSED()
     } /* end if */
     else {
@@ -2285,11 +2232,13 @@ test_mf_aggr_alloc1(const char *env_h5_drvr, hid_t fapl)
 error:
     H5E_BEGIN_TRY {
 	H5Fclose(file);
+        H5Pclose(fcpl);
     } H5E_END_TRY;
     return(1);
 } /* test_mf_aggr_alloc1() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr: (nothing in the aggregator)
@@ -2311,6 +2260,7 @@ error:
  *		A block of request-size is extended via file allocation and is merged with meta_aggr
  *		The block of 2058 is allocated out of meta_aggr
  *		There is space of 1968 left in meta_aggr
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc2(const char *env_h5_drvr, hid_t fapl)
@@ -2354,29 +2304,29 @@ test_mf_aggr_alloc2(const char *env_h5_drvr, hid_t fapl)
             FAIL_STACK_ERROR
 
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr2+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if (ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2058);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2058);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr3+TEST_BLOCK_SIZE2058) != ma_addr)
+        if((addr3+TBLOCK_SIZE2058) != ma_addr)
             TEST_ERROR
 
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         if(H5Fclose(file) < 0)
@@ -2388,7 +2338,7 @@ test_mf_aggr_alloc2(const char *env_h5_drvr, hid_t fapl)
 
         /* Verify the file is the correct size */
         /* Unused space is freed from the end of the file */
-        if (new_file_size != (file_size+TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50+TEST_BLOCK_SIZE2058))
+        if(new_file_size != (file_size+TBLOCK_SIZE30+TBLOCK_SIZE50+TBLOCK_SIZE2058))
             TEST_ERROR
 
         /* Re-open the file */
@@ -2399,7 +2349,7 @@ test_mf_aggr_alloc2(const char *env_h5_drvr, hid_t fapl)
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50+TEST_BLOCK_SIZE2058);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30+TBLOCK_SIZE50+TBLOCK_SIZE2058);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2429,6 +2379,7 @@ error:
 } /* test_mf_aggr_alloc2() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr : (nothing in the aggregator)
@@ -2463,6 +2414,7 @@ error:
  *	Result:
  *		The fourth block of 50 is allocated from what is left in meta_aggr
  *		There is space of 1968 left in meta_aggr
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc3(const char *env_h5_drvr, hid_t fapl)
@@ -2509,55 +2461,55 @@ test_mf_aggr_alloc3(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate second block from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr2+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         /* Allocate first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr1+TEST_BLOCK_SIZE30) != sdata_addr)
+        if((saddr1+TBLOCK_SIZE30) != sdata_addr)
             TEST_ERROR
-        if (sdata_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30)) TEST_ERROR
+        if(sdata_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE30)) TEST_ERROR
 
         /* Allocate third block, which is from  file allocation not from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE2058));
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE2058));
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
         /* info for meta_aggr shouldn't be changed */
-        if (addr3 != (sdata_addr+sdata_size)) TEST_ERROR
-        if ((addr3+TEST_BLOCK_SIZE2058) == new_ma_addr) TEST_ERROR
-        if ((new_ma_addr != ma_addr) || (new_ma_size != ma_size)) TEST_ERROR
+        if(addr3 != (sdata_addr+sdata_size)) TEST_ERROR
+        if((addr3+TBLOCK_SIZE2058) == new_ma_addr) TEST_ERROR
+        if((new_ma_addr != ma_addr) || (new_ma_size != ma_size)) TEST_ERROR
 
         /* Allocate fourth block, which should be from meta_aggr */
-        addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr4+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr4+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50 + TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         /* Free all the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE2058);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE2058);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2567,7 +2519,7 @@ test_mf_aggr_alloc3(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != file_size)
+        if(new_file_size != file_size)
             TEST_ERROR
 
         PASSED()
@@ -2588,6 +2540,7 @@ error:
 
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr: (nothing in the aggregator)
@@ -2626,6 +2579,7 @@ error:
  *		The new block's address is returned
  *		The block does not adjoin meta_aggr
  *		meta_aggr's info is unchanged
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc4(const char *env_h5_drvr, hid_t fapl)
@@ -2670,59 +2624,59 @@ test_mf_aggr_alloc4(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30))
+        if(ma_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE30))
             TEST_ERROR
 
         /* Allocate first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr1+TEST_BLOCK_SIZE30) != sdata_addr)
+        if((saddr1+TBLOCK_SIZE30) != sdata_addr)
             TEST_ERROR
 
         /* Allocate second block from sdata_aggr */
-        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30));
+        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE2048 - TBLOCK_SIZE30));
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (saddr2+(TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30) != sdata_addr)
+        if(saddr2+(TBLOCK_SIZE2048 - TBLOCK_SIZE30) != sdata_addr)
             TEST_ERROR
 
         /* Allocate third block from sdata_aggr */
-        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
 
-        if ((saddr3+TEST_BLOCK_SIZE50) != sdata_addr)
+        if((saddr3+TBLOCK_SIZE50) != sdata_addr)
             TEST_ERROR
-        if(sdata_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE50))
+        if(sdata_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE50))
             TEST_ERROR
 
         /* Allocate second block of 2058, which is from file allocation, not from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2058);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2058);
 
-        if (addr2 != sdata_addr)
+        if(addr2 != sdata_addr)
             TEST_ERROR
 
         /* sdata_aggr is reset 0 */
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((sdata_addr != 0) && (sdata_size != 0))
+        if((sdata_addr != 0) && (sdata_size != 0))
             TEST_ERROR
 
         /* info is unchanged in meta_aggr */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
-        if ((new_ma_addr != ma_addr) && (new_ma_size != ma_size))
+        if((new_ma_addr != ma_addr) && (new_ma_size != ma_size))
             TEST_ERROR
 
         /* Free all the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE2058);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr2, (hsize_t)TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE2058);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr2, (hsize_t)TBLOCK_SIZE2048 - TBLOCK_SIZE30);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2732,7 +2686,7 @@ test_mf_aggr_alloc4(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != file_size)
+        if(new_file_size != file_size)
             TEST_ERROR
 
         PASSED()
@@ -2752,6 +2706,7 @@ error:
 } /* test_mf_aggr_alloc4() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr: (nothing in the aggregator)
@@ -2772,6 +2727,7 @@ error:
  *		The block of 1970 is allocated from there
  *		There is space of 2046 left in meta_aggr
  *
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc5(const char *env_h5_drvr, hid_t fapl)
@@ -2816,34 +2772,34 @@ test_mf_aggr_alloc5(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate second block from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if (addr2+TEST_BLOCK_SIZE50 != ma_addr)
+        if(addr2+TBLOCK_SIZE50 != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30+TBLOCK_SIZE50)))
             TEST_ERROR
 
         /* Allocate third block from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1970);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1970);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (addr3 != ma_addr) TEST_ERROR
-        if ((addr3+TEST_BLOCK_SIZE1970) != new_ma_addr) TEST_ERROR
-        if (new_ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE1970 - ma_size)))
+        if(addr3 != ma_addr) TEST_ERROR
+        if((addr3+TBLOCK_SIZE1970) != new_ma_addr) TEST_ERROR
+        if(new_ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE1970 - ma_size)))
             TEST_ERROR
 
         /* Free all the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE1970);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE1970);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -2853,7 +2809,7 @@ test_mf_aggr_alloc5(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != file_size)
+        if(new_file_size != file_size)
             TEST_ERROR
 
         PASSED()
@@ -2873,6 +2829,7 @@ error:
 } /* test_mf_aggr_alloc5() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
  *	Allocate first block (30) from meta_aggr: (nothing in the aggregator)
@@ -2903,6 +2860,7 @@ error:
  *		sdata_aggr is untouched
  *		meta_aggr's unused space of [880, 1968] is freed to free-space
  *		meta_aggr is updated to point to the new block
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc6(const char *env_h5_drvr, hid_t fapl)
@@ -2915,7 +2873,7 @@ test_mf_aggr_alloc6(const char *env_h5_drvr, hid_t fapl)
     haddr_t		addr1, addr2, addr3, saddr1;
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, new_ma_size=0, sdata_size=0;
-    frspace_state_t 	state;
+    H5FS_stat_t state;
     hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
 
     TESTING("H5MF_alloc() of meta/sdata aggregator:test 6");
@@ -2949,44 +2907,44 @@ test_mf_aggr_alloc6(const char *env_h5_drvr, hid_t fapl)
         type = H5FD_MEM_SUPER;
 
         /* Allocate first block from meta_aggr */
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate second block from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if (addr2+TEST_BLOCK_SIZE50 != ma_addr)
+        if(addr2+TBLOCK_SIZE50 != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if(ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         /* Allocate first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr1+TEST_BLOCK_SIZE30) != sdata_addr) TEST_ERROR
-        if (sdata_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30)) TEST_ERROR
+        if((saddr1+TBLOCK_SIZE30) != sdata_addr) TEST_ERROR
+        if(sdata_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE30)) TEST_ERROR
 
         /* Allocate third block from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1970);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1970);
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if ((addr3+TEST_BLOCK_SIZE1970) != new_ma_addr) TEST_ERROR
-        if (addr3 != (sdata_addr+sdata_size)) TEST_ERROR
+        if((addr3+TBLOCK_SIZE1970) != new_ma_addr) TEST_ERROR
+        if(addr3 != (sdata_addr+sdata_size)) TEST_ERROR
 
-        if ((ma_addr+TEST_BLOCK_SIZE1970) == new_ma_addr) TEST_ERROR
-        if (new_ma_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE1970))
+        if((ma_addr+TBLOCK_SIZE1970) == new_ma_addr) TEST_ERROR
+        if(new_ma_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE1970))
             TEST_ERROR
 
         /* Verify that meta_aggr's unused space of 1968 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t));
-        state.tot_space += (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50));
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
+        state.tot_space += (TBLOCK_SIZE2048 - (TBLOCK_SIZE30+TBLOCK_SIZE50));
         state.tot_sect_count += 1;
         state.serial_sect_count += 1;
 
@@ -2994,10 +2952,10 @@ test_mf_aggr_alloc6(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Free all the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE1970);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE1970);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3007,7 +2965,7 @@ test_mf_aggr_alloc6(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (new_file_size != file_size)
+        if(new_file_size != file_size)
             TEST_ERROR
 
         PASSED()
@@ -3027,13 +2985,14 @@ error:
 } /* test_mf_aggr_alloc6() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks are allocated from the aggregator
  *
- *	Allocate first block (30) from meta_aggr: (nothing in meta_aggr)
- *		request-size is > what is left in meta_aggr and < meta_aggr->alloc_size
- *	Result:
- *		A block of meta_aggr->alloc_size is obtained via file allocation
- *		The first block of 30 is allocated from there
+ *  Allocate first block (30) from meta_aggr: (nothing in meta_aggr)
+ *      request-size is > what is left in meta_aggr and < meta_aggr->alloc_size
+ *  Result:
+ *      A block of meta_aggr->alloc_size is obtained via file allocation
+ *      The first block of 30 is allocated from there
  *
  *	Allocate second block (50) from meta_aggr:
  *		request-size is <= what is left in meta_aggr
@@ -3068,6 +3027,7 @@ error:
  *		The block does not adjoin meta_aggr
  *		meta_aggr's unused space of [880, 1968] is freed to free-space
  *		meta_aggr is updated to point to the new block
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_alloc7(const char *env_h5_drvr, hid_t fapl)
@@ -3080,7 +3040,7 @@ test_mf_aggr_alloc7(const char *env_h5_drvr, hid_t fapl)
     haddr_t		addr1, addr2, addr3, saddr1, saddr2, saddr3;
     haddr_t 		ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, sdata_size=0;
-    frspace_state_t 	state;
+    H5FS_stat_t         state;
     hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
 
     TESTING("H5MF_alloc() of meta/sdata aggregator:test 7");
@@ -3113,51 +3073,51 @@ test_mf_aggr_alloc7(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate the first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate the second block from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if (addr2+TEST_BLOCK_SIZE50 != ma_addr)
+        if (addr2+TBLOCK_SIZE50 != ma_addr)
             TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50)))
+        if (ma_size != (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50)))
             TEST_ERROR
 
         /* Allocate the first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr1+TEST_BLOCK_SIZE30) != sdata_addr)
+        if ((saddr1+TBLOCK_SIZE30) != sdata_addr)
             TEST_ERROR
 
         /* Allocate the second block from sdata_aggr */
-        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30);
+        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2048 - TBLOCK_SIZE30);
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr2+(TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30)) != sdata_addr)
+        if ((saddr2+(TBLOCK_SIZE2048 - TBLOCK_SIZE30)) != sdata_addr)
             TEST_ERROR
         if (sdata_size != 0) TEST_ERROR
 
         /* Allocate the third block from sdata_aggr */
-        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr3+TEST_BLOCK_SIZE50) != sdata_addr)
+        if ((saddr3+TBLOCK_SIZE50) != sdata_addr)
             TEST_ERROR
-        if (sdata_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE50))
+        if (sdata_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE50))
             TEST_ERROR
 
         /* Allocate the third block from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1970);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1970);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
         if (addr3 != sdata_addr) TEST_ERROR
-        if ((addr3 + TEST_BLOCK_SIZE1970) != ma_addr) TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE1970)) TEST_ERROR
+        if ((addr3 + TBLOCK_SIZE1970) != ma_addr) TEST_ERROR
+        if (ma_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE1970)) TEST_ERROR
 
         /* sdata_aggr info is reset to 0 */
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
@@ -3165,8 +3125,8 @@ test_mf_aggr_alloc7(const char *env_h5_drvr, hid_t fapl)
         if (sdata_size != 0) TEST_ERROR
 
         /* Verify that meta_aggr's unused space of 1968 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t));
-        state.tot_space += (TEST_BLOCK_SIZE2048 - (TEST_BLOCK_SIZE30 + TEST_BLOCK_SIZE50));
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
+        state.tot_space += (TBLOCK_SIZE2048 - (TBLOCK_SIZE30 + TBLOCK_SIZE50));
         state.tot_sect_count += 1;
         state.serial_sect_count += 1;
 
@@ -3174,12 +3134,12 @@ test_mf_aggr_alloc7(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Free all the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE1970);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr2, (hsize_t)(TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30));
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE1970);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr2, (hsize_t)(TBLOCK_SIZE2048 - TBLOCK_SIZE30));
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3209,6 +3169,7 @@ error:
 } /* test_mf_aggr_alloc7() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block can be extended from the aggregator
  *
  *	Test 1: Allocate block A from meta_aggr which is at end of file
@@ -3229,6 +3190,7 @@ error:
  *		Allocate block B from sdata_aggr so that meta_aggr is not at end of file
  *		Try to extend a block which adjoins meta_aggr but meta_aggr cannot fulfill the extended-request
  *		H5MF_try_extend() fails
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
@@ -3274,9 +3236,9 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate the first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Adjust meta_aggr's info info for testing */
@@ -3286,7 +3248,7 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
         new_addr = addr - 10;
 
         /* Try to extend the block by an amount < (% * aggr->alloc_size) */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TEST_BLOCK_SIZE50));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TBLOCK_SIZE50));
 
         /* should succeed */
         if(!was_extended)
@@ -3294,15 +3256,15 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (new_ma_addr != (addr+TEST_BLOCK_SIZE50))
+        if(new_ma_addr != (addr+TBLOCK_SIZE50))
             TEST_ERROR
-        if (new_ma_size != (f->shared->meta_aggr.alloc_size - TEST_BLOCK_SIZE50)) TEST_ERROR
+        if(new_ma_size != (f->shared->meta_aggr.alloc_size - TBLOCK_SIZE50)) TEST_ERROR
 
         /* Free the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE50);
 
         /* Try to extend the block by an amount > (% * aggr->alloc_size) but amount < aggr->alloc_size */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TEST_BLOCK_SIZE700));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TBLOCK_SIZE700));
 
         /* should succeed */
         if(!was_extended)
@@ -3310,15 +3272,15 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (new_ma_addr != (addr + TEST_BLOCK_SIZE700))
+        if(new_ma_addr != (addr + TBLOCK_SIZE700))
             TEST_ERROR
-        if (new_ma_size != (f->shared->meta_aggr.alloc_size * 2 - TEST_BLOCK_SIZE700)) TEST_ERROR
+        if(new_ma_size != (f->shared->meta_aggr.alloc_size * 2 - TBLOCK_SIZE700)) TEST_ERROR
 
         /* Free the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE700);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE700);
 
         /* Try to extend the block by an amount > (% * aggr->alloc_size) but amount > aggr->alloc_size */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TEST_BLOCK_SIZE2058));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TBLOCK_SIZE2058));
 
         /* should succeed */
         if(!was_extended)
@@ -3326,12 +3288,12 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (new_ma_addr != (addr + TEST_BLOCK_SIZE2058))
+        if (new_ma_addr != (addr + TBLOCK_SIZE2058))
             TEST_ERROR
         if (new_ma_size != f->shared->meta_aggr.size) TEST_ERROR
 
         /* Free the allocated blocks */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE2058);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE2058);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3365,16 +3327,16 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate the first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate the first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr+TEST_BLOCK_SIZE50) != sdata_addr)
+        if((saddr+TBLOCK_SIZE50) != sdata_addr)
             TEST_ERROR
 
         /* Adjust meta_aggr's info info for testing */
@@ -3384,24 +3346,24 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
         new_addr = addr - 10;
 
         /* should be able to fulfill request from the aggreqator itself */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TEST_BLOCK_SIZE50));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TBLOCK_SIZE50));
 
         if(!was_extended)
             TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (new_ma_addr != (addr+TEST_BLOCK_SIZE50))
+        if(new_ma_addr != (addr+TBLOCK_SIZE50))
             TEST_ERROR
-        if (new_ma_size != (f->shared->meta_aggr.alloc_size-TEST_BLOCK_SIZE50))
+        if(new_ma_size != (f->shared->meta_aggr.alloc_size-TBLOCK_SIZE50))
             TEST_ERROR
 
         /* Restore info for meta_aggr */
         f->shared->meta_aggr.addr = ma_addr;
         f->shared->meta_aggr.size = ma_size;
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3411,7 +3373,7 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (file_size != empty_size)
+        if(file_size != empty_size)
             TEST_ERROR
 
         PASSED()
@@ -3435,16 +3397,16 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate first block from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr+TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate first block from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr+TEST_BLOCK_SIZE50) != sdata_addr)
+        if((saddr+TBLOCK_SIZE50) != sdata_addr)
             TEST_ERROR
 
         /* Adjust meta_aggr's info info for testing */
@@ -3454,7 +3416,7 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
         new_addr = addr - 10;
 
         /* unable to fulfill request from the aggreqator itself */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TEST_BLOCK_SIZE50));
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)new_addr, (hsize_t)10, (hsize_t)(TBLOCK_SIZE50));
 
         if(was_extended)
             TEST_ERROR
@@ -3468,8 +3430,8 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
         f->shared->meta_aggr.addr = ma_addr;
         f->shared->meta_aggr.size = ma_size;
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3479,7 +3441,7 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (file_size != empty_size)
+        if(file_size != empty_size)
             TEST_ERROR
 
         PASSED()
@@ -3499,6 +3461,7 @@ error:
 } /* test_mf_aggr_extend() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block is absorbed into an aggregator
  *
  * MF_try_shrink() only allows blocks to be absorbed into an aggregator
@@ -3517,10 +3480,7 @@ error:
  *		H5MF_alloc() block C from meta_aggr
  *		H5MF_try_shrink() block B should fail since it does not adjoin the
  *			beginning nor the end of meta_aggr
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Changes due to the switch to H5FD_FLMAP_DICHOTOMY
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
@@ -3567,20 +3527,20 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate block A from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
-        ma_addr = new_ma_addr - TEST_BLOCK_SIZE30;
+        ma_addr = new_ma_addr - TBLOCK_SIZE30;
 
-        if((addr1 + TEST_BLOCK_SIZE30) != new_ma_addr)
+        if((addr1 + TBLOCK_SIZE30) != new_ma_addr)
             TEST_ERROR
 
         /* should succeed */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30) <= 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30) <= 0)
             TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
 
-        if (new_ma_addr != ma_addr) TEST_ERROR
+        if(new_ma_addr != ma_addr) TEST_ERROR
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3590,7 +3550,7 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (file_size != empty_size)
+        if(file_size != empty_size)
             TEST_ERROR
 
         PASSED()
@@ -3614,32 +3574,32 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate block A from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr) TEST_ERROR
-        if (ma_size != (TEST_BLOCK_SIZE2048 - TEST_BLOCK_SIZE30)) TEST_ERROR
+        if((addr1+TBLOCK_SIZE30) != ma_addr) TEST_ERROR
+        if(ma_size != (TBLOCK_SIZE2048 - TBLOCK_SIZE30)) TEST_ERROR
 
         /* Allocate block B from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), NULL, &sdata_size);
 
         /* should succeed */
-        if(H5MF_try_shrink(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE50) <= 0)
+        if(H5MF_try_shrink(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE50) <= 0)
             TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &new_sdata_addr, &new_sdata_size);
-        if (new_sdata_addr != saddr1) TEST_ERROR
-        if (new_sdata_size != sdata_size + TEST_BLOCK_SIZE50) TEST_ERROR
+        if(new_sdata_addr != saddr1) TEST_ERROR
+        if(new_sdata_size != sdata_size + TBLOCK_SIZE50) TEST_ERROR
 
         /* meta_aggr info should be updated because the block is absorbed into the meta_aggr */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
         if (new_ma_addr != ma_addr) TEST_ERROR
         if (new_ma_size != (ma_size)) TEST_ERROR
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3649,7 +3609,7 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (file_size != empty_size)
+        if(file_size != empty_size)
             TEST_ERROR
 
         PASSED()
@@ -3673,35 +3633,35 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
 
         /* Allocate block A from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* Allocate block B from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr2+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
         /* Allocate block C from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50));
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50));
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr3+TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr3+TBLOCK_SIZE30+TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
         /* should not succeed */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50) > 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50) > 0)
             TEST_ERROR
 
         /* aggregator info should be the same as before */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &new_ma_addr, &new_ma_size);
-        if (new_ma_addr != ma_addr) TEST_ERROR
+        if(new_ma_addr != ma_addr) TEST_ERROR
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)(TEST_BLOCK_SIZE30+TEST_BLOCK_SIZE50));
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)(TBLOCK_SIZE30+TBLOCK_SIZE50));
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3711,7 +3671,7 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
             TEST_ERROR
 
         /* Verify the file is the correct size */
-        if (file_size != empty_size)
+        if(file_size != empty_size)
             TEST_ERROR
 
         PASSED()
@@ -3731,6 +3691,7 @@ error:
 } /* test_mf_aggr_absorb() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block allocated from file allocation is aligned, can be shrunk and extended
  *
  * Alignment = 1024 or 4096
@@ -3759,6 +3720,7 @@ error:
  * 	Allocate a block which should be from file allocation
  *	The return address should be aligned
  *	H5MF_try_extend() the block with aligned address should succeed
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -3773,7 +3735,7 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     haddr_t 		ma_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0;
     htri_t 		was_extended;
-    frspace_state_t 	state;
+    H5FS_stat_t state;
     hsize_t		alignment=0, mis_align=0, tmp=0, accum=0;
     hbool_t             have_alloc_vfd;        /* Whether VFD used has an 'alloc' callback */
 
@@ -3819,23 +3781,23 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
              mis_align = alignment - tmp;
 
-        accum = mis_align + TEST_BLOCK_SIZE30;
+        accum = mis_align + TBLOCK_SIZE30;
 
         /* Allocate a block of 30 from file allocation */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* there should be nothing in the aggregator */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if (ma_addr || ma_size) TEST_ERROR
+        if(ma_addr || ma_size) TEST_ERROR
 
-        HDmemset(&state, 0, sizeof(frspace_state_t));
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
         if (mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
@@ -3848,18 +3810,18 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         mis_align = 0;
         if ((tmp = ((hsize_t)file_size + accum) % alignment))
              mis_align = alignment - tmp;
-        accum += (mis_align + TEST_BLOCK_SIZE50);
+        accum += (mis_align + TBLOCK_SIZE50);
 
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
         if (addr2 % alignment) TEST_ERROR
 
         /* there should be nothing in the aggregator */
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if (ma_addr || ma_size) TEST_ERROR
+        if(ma_addr || ma_size) TEST_ERROR
 
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -3867,8 +3829,8 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
                 TEST_ERROR
         }
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3902,7 +3864,7 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         /* allocate a block of 50 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* address should be aligned */
         if (addr1 % alignment) TEST_ERROR
@@ -3923,7 +3885,7 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* shrink the block */
-        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE50) <= 0)
+        if(H5MF_try_shrink(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE50) <= 0)
             TEST_ERROR
 
         if(H5Fclose(file) < 0)
@@ -3932,7 +3894,7 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         if((new_file_size = h5_get_file_size(filename, fapl1)) < 0)
             TEST_ERROR
 
-        if (new_file_size != (file_size-TEST_BLOCK_SIZE50)) TEST_ERROR
+        if (new_file_size != (file_size-TBLOCK_SIZE50)) TEST_ERROR
 
         PASSED()
     } /* end if */
@@ -3957,10 +3919,10 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         /* allocate a block of 50 */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* address should be aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* Close file */
         if(H5Fclose(file) < 0)
@@ -3978,9 +3940,9 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* try to extend the block */
-        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr1, (hsize_t)TEST_BLOCK_SIZE50, (hsize_t)TEST_BLOCK_SIZE30);
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE50, (hsize_t)TBLOCK_SIZE30);
 
-        if (was_extended <=0) TEST_ERROR
+        if(was_extended <=0) TEST_ERROR
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -3988,7 +3950,7 @@ test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         if((new_file_size = h5_get_file_size(filename, fapl1)) < 0)
             TEST_ERROR
 
-        if (new_file_size != (file_size+TEST_BLOCK_SIZE30)) TEST_ERROR
+        if (new_file_size != (file_size+TBLOCK_SIZE30)) TEST_ERROR
 
         PASSED()
     } /* end if */
@@ -4007,6 +3969,7 @@ error:
 } /* test_mf_align_eoa() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that a block allocated from the free-space manager is aligned
  *
  * Alignment = 1024 or 4096
@@ -4035,10 +3998,7 @@ error:
  *	Allocate a block of size=40
  *	The free-space manager is unable to fulfill the request
  *	The block is allocated from file allocation and should be aligned
- *
- * Modifications:
- * 	Vailin Choi; July 2012
- *	Initialize the new field "allow_eoa_shrink_only" for user data.
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -4047,12 +4007,10 @@ test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     char		filename[FILENAME_LEN]; /* Filename to use */
     h5_stat_size_t      file_size;
     H5F_t		*f = NULL;              /* Internal file object pointer */
-    H5FD_mem_t 		type;
     H5MF_free_section_t *sect_node = NULL;
     haddr_t		addr;
-    frspace_state_t 	state;
-    H5MF_sect_ud_t 	udata;
-    htri_t 		was_extended;
+    H5FS_stat_t state;
+    htri_t      was_extended;
     hsize_t		alignment=0, tmp=0, mis_align=0;
     hbool_t             have_alloc_vfd;        /* Whether VFD used has an 'alloc' callback */
 
@@ -4081,58 +4039,51 @@ test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
-
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
-        TEST_ERROR
-
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    sect_node = H5MF_sect_simple_new((haddr_t)alignment, (hsize_t)TEST_BLOCK_SIZE50);
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+    TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
+    TEST_ERROR
 
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    /* Create section A */
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)alignment, (hsize_t)TBLOCK_SIZE50);
 
     /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE50;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 50 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
     /* Verify that the allocated block is section A in free-space */
-    if (addr != (haddr_t)alignment) TEST_ERROR
-    if (addr % alignment) TEST_ERROR
+    if(addr != (haddr_t)alignment) TEST_ERROR
+    if(addr % alignment) TEST_ERROR
 
-    state.tot_space -= TEST_BLOCK_SIZE50;
+    state.tot_space -= TBLOCK_SIZE50;
     state.tot_sect_count -= 1;
     state.serial_sect_count -= 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the block to free-space */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)TEST_BLOCK_SIZE50);
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)TBLOCK_SIZE50);
 
-    state.tot_space += TEST_BLOCK_SIZE50;
+    state.tot_space += TBLOCK_SIZE50;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     if(H5Fclose(file) < 0)
@@ -4151,70 +4102,63 @@ test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
-    type = H5FD_MEM_SUPER;
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
+        TEST_ERROR
+    if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
         TEST_ERROR
 
-    if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
-	TEST_ERROR
-    if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
-	TEST_ERROR
-
-    sect_node = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE8000);
-
-    /* Construct user data for callbacks */
-    udata.f = f;
-    udata.dxpl_id = H5AC_ind_read_dxpl_id;
-    udata.alloc_type = type;
-    udata.allow_sect_absorb = TRUE;
-    udata.allow_eoa_shrink_only = FALSE;
+    /* Create section A */
+    sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE8000);
 
     /* Add section A to free-space manager */
-    if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-	    FAIL_STACK_ERROR
+    if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+        FAIL_STACK_ERROR
 
-    HDmemset(&state, 0, sizeof(frspace_state_t));
-    state.tot_space += TEST_BLOCK_SIZE8000;
+    HDmemset(&state, 0, sizeof(H5FS_stat_t));
+    state.tot_space += TBLOCK_SIZE8000;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Allocate a block of 600 */
-    addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE600);
+    addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE600);
 
     /* Verify that the allocated block is aligned */
     if (addr % alignment) TEST_ERROR
 
     /* should have 1 more section in free-space */
-    state.tot_space -= TEST_BLOCK_SIZE600;
+    state.tot_space -= TBLOCK_SIZE600;
     state.tot_sect_count += 1;
     state.serial_sect_count += 1;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* try to extend the block */
-    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, type, (haddr_t)addr, (hsize_t)TEST_BLOCK_SIZE600, (hsize_t)TEST_BLOCK_SIZE200);
+    was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_SUPER, (haddr_t)addr, (hsize_t)TBLOCK_SIZE600, (hsize_t)TBLOCK_SIZE200);
 
-    if (was_extended <=0) TEST_ERROR
+    if(was_extended <=0) TEST_ERROR
 
     /* space should be decreased by 200, # of sections remain the same */
-    state.tot_space -= TEST_BLOCK_SIZE200;
+    state.tot_space -= TBLOCK_SIZE200;
 
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     /* Free the block to free-space manager */
-    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TEST_BLOCK_SIZE600+TEST_BLOCK_SIZE200));
+    H5MF_xfree(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, addr, (hsize_t)(TBLOCK_SIZE600+TBLOCK_SIZE200));
 
     /* only 1 section in free-space because of merging */
-    state.tot_space += (TEST_BLOCK_SIZE600+TEST_BLOCK_SIZE200);
+    state.tot_space += (TBLOCK_SIZE600+TBLOCK_SIZE200);
     state.tot_sect_count = 1;
     state.serial_sect_count = 1;
-    if(check_stats(f, f->shared->fs_man[type], &state))
+    if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
         TEST_ERROR
 
     if(H5Fclose(file) < 0)
@@ -4241,45 +4185,38 @@ test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
 
-        type = H5FD_MEM_SUPER;
-
-        if(H5MF_alloc_start(f, H5AC_ind_read_dxpl_id, type) < 0)
-            TEST_ERROR
+        /* Start up H5FD_MEM_SUPER free-space manager */
+        if(H5MF_start_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)H5FD_MEM_SUPER) < 0)
+            FAIL_STACK_ERROR
 
-        if (f->shared->fs_state[type] != H5F_FS_STATE_OPEN)
+        if(f->shared->fs_state[H5FD_MEM_SUPER] != H5F_FS_STATE_OPEN)
             TEST_ERROR
-        if (f->shared->fs_man[type]->client != H5FS_CLIENT_FILE_ID)
+        if(f->shared->fs_man[H5FD_MEM_SUPER]->client != H5FS_CLIENT_FILE_ID)
             TEST_ERROR
 
-        sect_node = H5MF_sect_simple_new((haddr_t)TEST_BLOCK_ADDR70, (hsize_t)TEST_BLOCK_SIZE700);
-
-        /* Construct user data for callbacks */
-        udata.f = f;
-        udata.dxpl_id = H5AC_ind_read_dxpl_id;
-        udata.alloc_type = type;
-        udata.allow_sect_absorb = TRUE;
-	udata.allow_eoa_shrink_only = FALSE;
+        /* Create section A */
+        sect_node = H5MF_sect_new(H5MF_FSPACE_SECT_SIMPLE, (haddr_t)TBLOCK_ADDR70, (hsize_t)TBLOCK_SIZE700);
 
         /* Add section A to free-space manager */
-        if (H5FS_sect_add(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type], (H5FS_section_info_t *)sect_node, H5FS_ADD_RETURNED_SPACE, &udata))
-                FAIL_STACK_ERROR
+        if(H5MF_add_sect(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, f->shared->fs_man[H5FD_MEM_SUPER], sect_node))
+            FAIL_STACK_ERROR
 
-        HDmemset(&state, 0, sizeof(frspace_state_t));
-        state.tot_space += TEST_BLOCK_SIZE700;
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
+        state.tot_space += TBLOCK_SIZE700;
         state.tot_sect_count += 1;
         state.serial_sect_count += 1;
 
-        if(check_stats(f, f->shared->fs_man[type], &state))
+        if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
             TEST_ERROR
         /*
          * Allocate a block of 40
          * Since free-space manager cannot fulfull the request because of alignment,
          * the block is obtained from file allocation
          */
-        addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)(TEST_BLOCK_SIZE40));
+        addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)(TBLOCK_SIZE40));
 
         /* Verify that the allocated block is aligned */
-        if (addr % alignment)
+        if(addr % alignment)
             TEST_ERROR
 
         /* verify that the allocated block is from file allocation, not section A in free-space */
@@ -4296,7 +4233,7 @@ test_mf_align_fs(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         }
 
         /* free-space info should be the same  */
-        if(check_stats(f, f->shared->fs_man[type], &state))
+        if(check_stats(f, f->shared->fs_man[H5FD_MEM_SUPER], &state))
             TEST_ERROR
 
         if(H5Fclose(file) < 0)
@@ -4319,6 +4256,7 @@ error:
 } /* test_mf_align_fs() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 1024 	aggr->alloc_size = 2048
@@ -4413,6 +4351,7 @@ error:
  *		Fragment from alignment of aggregator allocation is freed to free-space:[12368, 4016]
  *		There is space of 2018 left in meta_aggr
  *		EOA is at 20372
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -4424,7 +4363,7 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
     H5FD_mem_t 		type;
     haddr_t		addr1, addr2, addr3, addr4;
-    frspace_state_t 	state;
+    H5FS_stat_t state;
     haddr_t 		ma_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, mis_align=0;
     hsize_t		alignment=0, tmp=0;
@@ -4467,19 +4406,19 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t));
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -4487,22 +4426,22 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1 + TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr1 + TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 50 */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 50 from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
-        if (addr2 % alignment) TEST_ERROR
+        if(addr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 50 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -4510,7 +4449,7 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr2 + TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2 + TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 80 */
@@ -4518,13 +4457,13 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         if ((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE80);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
 
         /* Verify that the allocated block is aligned */
-        if (addr3 % alignment) TEST_ERROR
+        if(addr3 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 80 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -4532,22 +4471,22 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr3 + TEST_BLOCK_SIZE80) != ma_addr)
+        if((addr3 + TBLOCK_SIZE80) != ma_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 1970 */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 1970 from meta_aggr */
-        addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1970);
+        addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1970);
 
         /* Verify that the allocated block is aligned */
-        if (addr4 % alignment) TEST_ERROR
+        if(addr4 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 1970 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -4555,17 +4494,17 @@ test_mf_align_alloc1(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr4 + TEST_BLOCK_SIZE1970) != ma_addr)
+        if((addr4 + TBLOCK_SIZE1970) != ma_addr)
             TEST_ERROR
 
         /* Verify total size of free space after all the allocations */
         if(check_stats(f, f->shared->fs_man[type], &state))
             TEST_ERROR
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE80);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE1970);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE80);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE1970);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -4587,6 +4526,7 @@ error:
 } /* test_mf_align_alloc1() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 1024 	aggr->alloc_size = 2048
@@ -4669,10 +4609,7 @@ error:
  *		The third block of 80 is allocated from the aggregator and should be aligned
  *		There is space of 1968 left in meta_aggr
  *		EOA is at 18432
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Changes due to the switch to H5FD_FLMAP_DICHOTOMY
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -4683,7 +4620,7 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     h5_stat_size_t      file_size;              /* File size */
     H5FD_mem_t 		type, stype;
     haddr_t		addr1, addr2, addr3, saddr1;
-    frspace_state_t 	state[H5FD_MEM_NTYPES];
+    H5FS_stat_t state[H5FD_MEM_NTYPES];
     haddr_t 		ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, sdata_size=0, mis_align=0;
     hsize_t		alignment=0, tmp=0;
@@ -4725,19 +4662,19 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t) * H5FD_MEM_NTYPES);
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t) * H5FD_MEM_NTYPES);
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -4745,21 +4682,21 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1 + TEST_BLOCK_SIZE30) != ma_addr)
+        if((addr1 + TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* fragment for alignment of block 50 is freed to free-space */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
-        if (addr2 % alignment) TEST_ERROR
+        if(addr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 50 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -4767,7 +4704,7 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr2 + TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2 + TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
         /*
@@ -4782,17 +4719,17 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
          *	block 30 is allocated from ma_addr
          */
         mis_align = 0;
-        if ((alignment == TEST_ALIGN1024) && (tmp = ((ma_addr + ma_size) % alignment)))
+        if((alignment == TEST_ALIGN1024) && (tmp = ((ma_addr + ma_size) % alignment)))
             mis_align = alignment - tmp;
         else if ((alignment == TEST_ALIGN4096) && (tmp = (ma_addr % alignment)))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* fragment for alignment of block 30 for sdata_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[stype].tot_space += mis_align;
             state[stype].tot_sect_count += 1;
             state[stype].serial_sect_count += 1;
@@ -4804,7 +4741,7 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if (sdata_addr != (saddr1 + TEST_BLOCK_SIZE30)) TEST_ERROR
+        if(sdata_addr != (saddr1 + TBLOCK_SIZE30)) TEST_ERROR
 
         /*
          * Calculate fragment for the allocation of block 80 from meta_aggr:
@@ -4816,19 +4753,19 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
          *	block 30 is allocated from ma_addr
          */
         mis_align = 0;
-        if ((alignment == TEST_ALIGN1024) && (tmp = (ma_addr % alignment)))
+        if((alignment == TEST_ALIGN1024) && (tmp = (ma_addr % alignment)))
             mis_align = alignment - tmp;
         else if ((alignment == TEST_ALIGN4096) && (tmp = ((sdata_addr + sdata_size) % alignment)))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 80 from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE80);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
 
         /* Verify that the allocated block is aligned */
         if (addr3 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 80 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -4836,7 +4773,7 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr3 + TEST_BLOCK_SIZE80) != ma_addr)
+        if((addr3 + TBLOCK_SIZE80) != ma_addr)
             TEST_ERROR
 
         /* Verify total size of free space after all the allocations */
@@ -4850,10 +4787,10 @@ test_mf_align_alloc2(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 		TEST_ERROR
 	}
 
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TEST_BLOCK_SIZE50);
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE80);
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE50);
+        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE80);
+        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
 
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -4875,6 +4812,7 @@ error:
 } /* test_mf_align_alloc2() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 1024 	aggr->alloc_size = 2048
@@ -5008,11 +4946,7 @@ error:
  *		The meta_aggr is updated to point to the new space
  *		The block of 1034 is allocated from the new block and should be aligned
  *		There is space of 1014 left in meta_aggr
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Changes due to the switch to H5FD_FLMAP_DICHOTOMY
- *
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -5024,7 +4958,7 @@ test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     H5FD_mem_t 		type, stype;
     haddr_t		addr1, addr2, addr3;
     haddr_t		saddr1, saddr2, saddr3;
-    frspace_state_t 	state[H5FD_MEM_NTYPES];
+    H5FS_stat_t state[H5FD_MEM_NTYPES];
     haddr_t 		ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, sdata_size=0, mis_align=0;
     hsize_t		alignment=0, tmp=0;
@@ -5067,48 +5001,48 @@ test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             FAIL_STACK_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t) * H5FD_MEM_NTYPES);
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t) * H5FD_MEM_NTYPES);
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1 + TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr1 + TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 50 */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 50 from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
-        if (addr2 % alignment) TEST_ERROR
+        if(addr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 50 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr2 + TEST_BLOCK_SIZE50) != ma_addr)
+        if((addr2 + TBLOCK_SIZE50) != ma_addr)
             TEST_ERROR
 
         /*
@@ -5123,84 +5057,84 @@ test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
          *  block 30 is allocated from ma_addr
          */
         mis_align = 0;
-        if ((alignment == TEST_ALIGN1024) && (tmp = ((ma_addr + ma_size) % alignment)))
+        if((alignment == TEST_ALIGN1024) && (tmp = ((ma_addr + ma_size) % alignment)))
             mis_align = alignment - tmp;
         else if ((alignment == TEST_ALIGN4096) && (tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (saddr1 % alignment) TEST_ERROR
+        if(saddr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 for sdata_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[stype].tot_space += mis_align;
             state[stype].tot_sect_count += 1;
             state[stype].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (sdata_addr != (saddr1+TEST_BLOCK_SIZE30)) TEST_ERROR
+        if(sdata_addr != (saddr1+TBLOCK_SIZE30)) TEST_ERROR
 
         /* calculate fragment for alignment of block 50 in sdata_aggr */
         mis_align = 0;
-        if ((tmp = sdata_addr % alignment))
+        if((tmp = sdata_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 50 from sdata_aggr */
-        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
-        if (saddr2 % alignment) TEST_ERROR
+        if(saddr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 50 for sdata_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[stype].tot_space += mis_align;
             state[stype].tot_sect_count += 1;
             state[stype].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (sdata_addr != (saddr2 + TEST_BLOCK_SIZE50)) TEST_ERROR
+        if(sdata_addr != (saddr2 + TBLOCK_SIZE50)) TEST_ERROR
 
         /* calculate fragment for alignment of block 80 in sdata_aggr */
         mis_align = 0;
-        if ((tmp = sdata_addr % alignment))
+        if((tmp = sdata_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 80 from sdata_aggr */
-        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE80);
+        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
 
         /* Verify that the allocated block is aligned */
-        if (saddr3 % alignment) TEST_ERROR
+        if(saddr3 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 80 for sdata_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[stype].tot_space += mis_align;
             state[stype].tot_sect_count += 1;
             state[stype].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr3 + TEST_BLOCK_SIZE80) != sdata_addr)
+        if ((saddr3 + TBLOCK_SIZE80) != sdata_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 1034 */
         mis_align = 0;
-        if ((tmp = sdata_addr % alignment))
+        if((tmp = sdata_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 1034 for meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1034);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1034);
 
         /* Verify that the allocated block is aligned */
-        if (addr3 % alignment) TEST_ERROR
+        if(addr3 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 1034 for meta_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -5208,11 +5142,11 @@ test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         /* calculate unused space in meta_aggr that is freed to free-space after block 1034 */
         mis_align = 0;
-        if ((alignment == TEST_ALIGN1024) && (tmp = (ma_addr % alignment)))
+        if((alignment == TEST_ALIGN1024) && (tmp = (ma_addr % alignment)))
             mis_align = alignment - tmp;
 
         /* fragment for unused space in meta_aggr after block 1034 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -5220,7 +5154,7 @@ test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr3 + TEST_BLOCK_SIZE1034) != ma_addr)
+        if((addr3 + TBLOCK_SIZE1034) != ma_addr)
             TEST_ERROR
 
         /* Verify total size of free space after all allocations */
@@ -5255,6 +5189,7 @@ error:
 
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 4096 	aggr->alloc_size = 2048
@@ -5317,6 +5252,7 @@ error:
  *		Fragment from alignment of aggregator allocation is freed to free-space:[10250, 2038]
  *		There is space of 2023 left in meta_aggr
  *
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -5327,7 +5263,7 @@ test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     h5_stat_size_t      file_size;
     H5FD_mem_t 		type;
     haddr_t		addr1, addr2, addr3;
-    frspace_state_t 	state;
+    H5FS_stat_t     state;
     haddr_t 		ma_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, saved_ma_size=0;
     hsize_t		alignment=0, mis_align=0, tmp=0;
@@ -5370,19 +5306,19 @@ test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t));
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t));
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -5390,21 +5326,21 @@ test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
         saved_ma_size = ma_size;
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr) TEST_ERROR
+        if((addr1+TBLOCK_SIZE30) != ma_addr) TEST_ERROR
 
         /* calculate fragment for alignment of block 2058 */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 2058 from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2058);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2058);
 
         /* Verify that the allocated block is aligned */
-        if (addr2 % alignment) TEST_ERROR
+        if(addr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 2058 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
@@ -5412,28 +5348,28 @@ test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr2 + TEST_BLOCK_SIZE2058) != ma_addr) TEST_ERROR
+        if((addr2 + TBLOCK_SIZE2058) != ma_addr) TEST_ERROR
 
         /* meta_aggr->size remains the same */
-        if (ma_size != saved_ma_size) TEST_ERROR
+        if(ma_size != saved_ma_size) TEST_ERROR
 
         /* calculate fragment for alignment of block 5 from meta_aggr */
         mis_align = 0;
-        if ((tmp = ma_addr % alignment))
+        if((tmp = ma_addr % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 5 from meta_aggr */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5);
+        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5);
 
         /* fragment for alignment of block 5 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state.tot_space += mis_align;
             state.tot_sect_count += 1;
             state.serial_sect_count += 1;
         }
 
         /* Verify that the allocated block is aligned */
-        if (addr3 % alignment) TEST_ERROR
+        if(addr3 % alignment) TEST_ERROR
 
         /* Verify total size of free space after all allocations */
 	if(f->shared->fs_man[type]) {
@@ -5461,6 +5397,7 @@ error:
 } /* test_mf_align_alloc4() */
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 1024 	aggr->alloc_size = 2048
@@ -5525,10 +5462,7 @@ error:
  *		sdata_aggr is reset to 0
  *		EOA is 14346
  *		meta_aggr and sdata_aggr are all 0
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Changes due to the switch to H5FD_FLMAP_DICHOTOMY
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc5(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -5539,7 +5473,7 @@ test_mf_align_alloc5(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     h5_stat_size_t      file_size;
     H5FD_mem_t 		type, stype;
     haddr_t		addr1, addr2, saddr1;
-    frspace_state_t 	state[H5FD_MEM_NTYPES];
+    H5FS_stat_t state[H5FD_MEM_NTYPES];
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF;
     haddr_t 		sdata_addr=HADDR_UNDEF, new_sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, new_ma_size=0, sdata_size=0, new_sdata_size=0;
@@ -5583,23 +5517,23 @@ test_mf_align_alloc5(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (addr1 % alignment) TEST_ERROR
+        if(addr1 % alignment) TEST_ERROR
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
 
-        if ((addr1 + TEST_BLOCK_SIZE30) != ma_addr) TEST_ERROR
+        if((addr1 + TBLOCK_SIZE30) != ma_addr) TEST_ERROR
 
         /* fragment for alignment of block 30 is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t) * H5FD_MEM_NTYPES);
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t) * H5FD_MEM_NTYPES);
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -5607,39 +5541,39 @@ test_mf_align_alloc5(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         /* calculate fragment for alignment of block 30 from sdata_aggr */
         mis_align = 0;
-        if ((tmp = (ma_addr + ma_size) % alignment))
+        if((tmp = (ma_addr + ma_size) % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
-        if (saddr1 % alignment) TEST_ERROR
+        if(saddr1 % alignment) TEST_ERROR
 
         /* fragment of alignment for block 30 in sdata_aggr is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[stype].tot_space += mis_align;
             state[stype].tot_sect_count += 1;
             state[stype].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if ((saddr1+TEST_BLOCK_SIZE30) != sdata_addr) TEST_ERROR
+        if((saddr1+TBLOCK_SIZE30) != sdata_addr) TEST_ERROR
 
         /* calculate fragment for alignment of block 2058 from meta_aggr */
         mis_align = 0;
-        if ((tmp = (sdata_addr + sdata_size) % alignment))
+        if((tmp = (sdata_addr + sdata_size) % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 2058 from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2058);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2058);
 
         /* Verify that the allocated block is aligned */
         if (addr2 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 2058 is freed to free-space */
-        if (mis_align) {
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
@@ -5687,6 +5621,7 @@ error:
 
 
 /*
+ *-------------------------------------------------------------------------
  * To verify that blocks allocated from the aggregator are aligned
  *
  * Alignment = 1024 	aggr->alloc_size = 2048
@@ -5792,10 +5727,7 @@ error:
  *		Fragment from alignment of file allocation is freed to free-space:[16464, 4016]
  *		EOA is at 22538
  *		meta_aggr is unchanged
- *
- * Modifications:
- *	Vailin Choi; July 2012
- *	Changes due to the switch to H5FD_FLMAP_DICHOTOMY
+ *-------------------------------------------------------------------------
  */
 static unsigned
 test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
@@ -5807,7 +5739,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
     H5FD_mem_t 		type, stype;
     haddr_t		addr1, addr2;
     haddr_t		saddr1, saddr2, saddr3;
-    frspace_state_t 	state[H5FD_MEM_NTYPES];
+    H5FS_stat_t state[H5FD_MEM_NTYPES];
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, new_ma_size=0, sdata_size=0;
     hsize_t		alignment=0, mis_align=0, tmp=0;
@@ -5849,26 +5781,26 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 30 */
-        if ((tmp = (hsize_t)file_size % alignment))
+        if((tmp = (hsize_t)file_size % alignment))
             mis_align = alignment - tmp;
 
         /* Allocate a block of 30 from meta_aggr */
         type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
         if (addr1 % alignment) TEST_ERROR
 
         /* fragment for alignment of block 30 in meta_aggr is freed to free-space */
-        HDmemset(&state, 0, sizeof(frspace_state_t) * H5FD_MEM_NTYPES);
-        if (mis_align) {
+        HDmemset(&state, 0, sizeof(H5FS_stat_t) * H5FD_MEM_NTYPES);
+        if(mis_align) {
             state[type].tot_space += mis_align;
             state[type].tot_sect_count += 1;
             state[type].serial_sect_count += 1;
         }
 
         H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size);
-        if ((addr1+TEST_BLOCK_SIZE30) != ma_addr)
+        if ((addr1+TBLOCK_SIZE30) != ma_addr)
             TEST_ERROR
 
         /* calculate fragment for alignment of block 30 in sdata_aggr */
@@ -5878,7 +5810,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 
         /* Allocate a block of 30 from sdata_aggr */
         stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
 
         /* Verify that the allocated block is aligned */
         if (saddr1 % alignment) TEST_ERROR
@@ -5891,7 +5823,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (sdata_addr != (saddr1+TEST_BLOCK_SIZE30)) TEST_ERROR
+        if (sdata_addr != (saddr1+TBLOCK_SIZE30)) TEST_ERROR
 
         /* calculate fragment for alignment of block 50 in sdata_aggr */
         mis_align = 0;
@@ -5899,7 +5831,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             mis_align = alignment - tmp;
 
         /* Allocate a block of 50 from sdata_aggr */
-        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
 
         /* Verify that the allocated block is aligned */
         if (saddr2 % alignment) TEST_ERROR
@@ -5912,7 +5844,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (sdata_addr != (saddr2+TEST_BLOCK_SIZE50)) TEST_ERROR
+        if (sdata_addr != (saddr2+TBLOCK_SIZE50)) TEST_ERROR
 
         /* calculate fragment for alignment of block 80 in sdata_aggr */
         mis_align = 0;
@@ -5920,7 +5852,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             mis_align = alignment - tmp;
 
         /* Allocate a block of 80 from sdata_aggr */
-        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE80);
+        saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
 
         /* Verify that the allocated block is aligned */
         if (saddr3 % alignment) TEST_ERROR
@@ -5933,7 +5865,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
         }
 
         H5MF_aggr_query(f, &(f->shared->sdata_aggr), &sdata_addr, &sdata_size);
-        if (sdata_addr != (saddr3+TEST_BLOCK_SIZE80)) TEST_ERROR
+        if (sdata_addr != (saddr3+TBLOCK_SIZE80)) TEST_ERROR
 
         /* calculate fragment for alignment of block 2058 */
         /* remaining space in sdata_aggr is freed and shrunk */
@@ -5942,7 +5874,7 @@ test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
             mis_align = alignment - tmp;
 
         /* Allocate a block of 2058 from meta_aggr */
-        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2058);
+        addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2058);
 
         /* Verify that the allocated block is aligned */
         if (addr2 % alignment) TEST_ERROR
@@ -5993,289 +5925,228 @@ error:
     return(1);
 } /* test_mf_align_alloc6() */
 
-
 /*
- * Verify that the file's free-space manager persists where there are free sections in the manager
+ * Test a bug that occurs when an allocator with zero size left and an unaligned
+ * endpoint is extended to allocate an aligned object
  */
 static unsigned
-test_mf_fs_persist(hid_t fapl_new, hid_t fcpl)
+test_mf_bug1(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;			/* 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("file's free-space manager is persistent");
+    hid_t               file = -1;              /* File ID */
+    hid_t               copied_fapl = -1;       /* FAPL to use for this test */
+    char                filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t               *f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t          type;
+    haddr_t             addr1, addr2;
+    hsize_t             block_size;
+    hsize_t             align;
+    hbool_t             split = FALSE, multi = FALSE;
+
+    TESTING("H5MF_alloc() bug 1");
 
     /* 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 6 blocks */
-    type = H5FD_MEM_SUPER;
-    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (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, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr5, (hsize_t)TEST_BLOCK_SIZE5) < 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
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
-    /* Verify that H5FD_MEM_SUPER free-space manager is there */
-    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+    /* Copy fapl */
+    if((copied_fapl = H5Pcopy(fapl)) < 0)
         TEST_ERROR
 
-    /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
-        FAIL_STACK_ERROR
-
-    /* Get info for free-space manager */
-    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_BLOCK_SIZE5))
-	TEST_ERROR
-
-    if(fs_stat.serial_sect_count < 3)
-	TEST_ERROR
-
-    /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (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, H5AC_ind_read_dxpl_id, (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]))
+    /* Get metadata block size */
+    if(H5Pget_meta_block_size(copied_fapl, &block_size) < 0)
         TEST_ERROR
 
-    /* Retrieve block #5 from H5FD_MEM_SUPER free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5)))
-	FAIL_STACK_ERROR
-    if(tmp_addr != addr5)
+    /* Set alignment to equal block size / 2 */
+    align = block_size / 2;
+    if(H5Pset_alignment(copied_fapl, 0, align) < 0)
         TEST_ERROR
 
-    if(H5Fclose(file) < 0)
-        FAIL_STACK_ERROR
-
-    PASSED()
-
-    return(0);
+    /* Check for split or multi driver */
+    if(!HDstrcmp(env_h5_drvr, "split"))
+        split = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "multi"))
+        multi = TRUE;
 
-error:
-    H5E_BEGIN_TRY {
-	H5Fclose(file);
-    } H5E_END_TRY;
-    return(1);
-} /* test_mf_fs_persist() */
+    /* Add alignment to member files for split/multi driver */
+    if(split || multi) {
+        hid_t memb_fapl;
 
-/*
- * Verify that the free-space manager goes away
- */
-static unsigned
-test_mf_fs_gone(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;			/* 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 */
+        /* Creat fapl */
+        if((memb_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+            TEST_ERROR
 
-    TESTING("file's free-space manager is going away");
+        /* Set alignment. Note that it is the block size of the parent FAPL that
+         * is important here. */
+        if(H5Pset_alignment(memb_fapl, 0, align) < 0)
+            TEST_ERROR
 
-    /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+        if(split) {
+            /* Set split driver with new FAPLs */
+            if(H5Pset_fapl_split(copied_fapl, "-m.h5", memb_fapl, "-r.h5", memb_fapl) < 0)
+                TEST_ERROR
+        } /* end if */
+        else {
+            H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+            hid_t memb_fapl_arr[H5FD_MEM_NTYPES];
+            char *memb_name[H5FD_MEM_NTYPES];
+            haddr_t memb_addr[H5FD_MEM_NTYPES];
+            hbool_t relax;
+            H5FD_mem_t  mt;
+
+            /* Get current multi settings */
+            HDmemset(memb_name, 0, sizeof memb_name);
+            if(H5Pget_fapl_multi(copied_fapl, memb_map, NULL, memb_name, memb_addr, &relax) < 0)
+                TEST_ERROR
 
-    /* Create the file to work on */
-    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
-        FAIL_STACK_ERROR
+            /* Populate memb_fapl_arr, patch memb_addr so member file addresses
+             * are aligned */
+            for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt)) {
+                memb_fapl_arr[mt] = memb_fapl;
+                memb_addr[mt] = ((memb_addr[mt] + align - 1) / align) * align;
+            } /* end for */
 
-    /* Get a pointer to the internal file object */
-    if(NULL == (f = (H5F_t *)H5I_object(file)))
-        FAIL_STACK_ERROR
+            /* Set multi driver with new FAPLs */
+            if(H5Pset_fapl_multi(copied_fapl, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+                TEST_ERROR
 
-    /* Allocate 4 blocks */
-    type = H5FD_MEM_SUPER;
-    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
-
-    /* Put block #1, #3 to H5FD_MEM_SUPER free-space manager */
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
-
-    /* Retrieve block #1, #3 from H5FD_MEM_SUPER free-space manager */
-    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+            /* Free memb_name */
+            for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+                free(memb_name[mt]);
+        } /* end else */
 
-    if(H5Fclose(file) < 0)
-        FAIL_STACK_ERROR
+        /* Close memb_fapl */
+        if(H5Pclose(memb_fapl) < 0)
+            TEST_ERROR
+    } /* end if */
 
-    /* Re-open the file */
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
-        FAIL_STACK_ERROR
+    /* Reopen the file with alignment */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, copied_fapl)) < 0)
+        TEST_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
 
-    /* Put block #3 to H5FD_MEM_SUPER free-space manager */
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-        FAIL_STACK_ERROR
-
-    if(H5Fclose(file) < 0)
-        FAIL_STACK_ERROR
+    /* Allocate a block of size align from meta_aggr.  This should create an
+     * aggregator that extends to the end of the file, with
+     * block_size / 2 bytes remaining, and the end of the file aligned */
+    type = H5FD_MEM_SUPER;
+    addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, align);
 
-    /* Re-open the file */
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
-        FAIL_STACK_ERROR
+    /* Verify that the allocated block is aligned */
+    if(addr1 % align) TEST_ERROR
 
-    /* Get a pointer to the internal file object */
-    if(NULL == (f = (H5F_t *)H5I_object(file)))
-        FAIL_STACK_ERROR
+    /* Allocate a block of size align from meta_aggr.  This should force the
+     * aggregator to extend to the end of the file, with 0 bytes remaining, and
+     * the end of the file aligned */
+    type = H5FD_MEM_SUPER;
+    addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, align);
 
-    /* Verify that H5FD_MEM_SUPER free-space manager is there */
-    if(!H5F_addr_defined(f->shared->fs_addr[type]))
-        TEST_ERROR
+    /* Verify that the allocated block is aligned */
+    if(addr2 % align) TEST_ERROR
 
-    /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
-        FAIL_STACK_ERROR
+    /* Verify that the allocated block is placed align after the previous */
+    if((addr2 - addr1) != align) TEST_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
+    /* Allocate a block of size block_size + 1 from meta_aggr.  This should
+     * force the aggregator to extend to the end of the file, with 0 bytes
+     * remaining, and the end of the file unaligned */
+    type = H5FD_MEM_SUPER;
+    addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, block_size + (hsize_t)1);
 
-    /* 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
+    /* Verify that the allocated block is aligned */
+    if(addr1 % align) TEST_ERROR
 
-    /* Put block #4 to H5FD_MEM_SUPER free-space manager */
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TEST_BLOCK_SIZE4) < 0)
-        FAIL_STACK_ERROR
+    /* Verify that the allocated block is placed block_size / 2 after the
+     * previous */
+    if((addr1 - addr2) != align) TEST_ERROR
 
-    /* The H5FD_MEM_SUPER free-space manager will go away at H5MF_close() */
-    if(H5Fclose(file) < 0)
-        FAIL_STACK_ERROR
+    /* Allocate a block of size 1.  This should extend the aggregator from
+     * the previous allocation, and align the new block */
+    type = H5FD_MEM_SUPER;
+    addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)1);
 
-    /* Re-open the file */
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
-        FAIL_STACK_ERROR
+    /* Verify that the allocated block is aligned */
+    if(addr2 % align) TEST_ERROR
 
-    /* Get a pointer to the internal file object */
-    if(NULL == (f = (H5F_t *)H5I_object(file)))
-        FAIL_STACK_ERROR
+    /* Verify that the allocated block is placed 3 * (block_size / 2) after
+     * the previous */
+    if((addr2 - addr1) != (3 * align)) TEST_ERROR
 
-    /* Verify that the H5FD_MEM_SUPER free-space manager is not there */
-    if(H5F_addr_defined(f->shared->fs_addr[type]))
-        TEST_ERROR
+    PASSED()
 
+    /* Close file */
     if(H5Fclose(file) < 0)
-        FAIL_STACK_ERROR
-
-    PASSED()
+        TEST_ERROR
 
     return(0);
 
 error:
     H5E_BEGIN_TRY {
-	H5Fclose(file);
+        H5Fclose(file);
     } H5E_END_TRY;
     return(1);
-} /* test_mf_fs_gone() */
-
+} /* test_mf_bug1() */
 
 /*
  * 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)
+test_mf_fs_persist_split(void)
 {
-    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");
+    hid_t   file = -1;                  /* File ID */
+    hid_t   fcpl = -1;                  /* File creation property list ID */
+    hid_t   fapl = -1;                  /* File access property list 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");
+
+    /* for now, we don't support persistant free space managers 
+     * with the split file driver.
+     */
+    SKIPPED();
+    HDfprintf(stdout, " Persistant FSMs disabled in multi file driver.\n");
+    return 0;  /* <========== note return */
+
+    /* File creation property list template */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+
+    /* for now, we don't support persistant free space managers 
+     * with the split file driver.
+     */
+    SKIPPED();
+    HDfprintf(stdout, " Persistant FSMs disabled in multi file driver.\n");
+    return 0;  /* <========== note return */
+
+    /* File creation property list template */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Set up split driver */
+    if(H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT)<0)
+    FAIL_STACK_ERROR
+
+    /* File creation property list template */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+    FAIL_STACK_ERROR
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+    FAIL_STACK_ERROR
 
     /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
     /* Create the file to work on */
-    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6284,43 +6155,43 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
 
     /* Allocate 4 blocks of type H5FD_MEM_SUPER */
     type = H5FD_MEM_SUPER;
-    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+        FAIL_STACK_ERROR
 
     /* Put block #1, #3 into H5FD_MEM_SUPER free-space manager */
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+        FAIL_STACK_ERROR
 
     /* Put block #1, #3 into H5FD_MEM_DRAW free-space manager */
-    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE1) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TBLOCK_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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6332,7 +6203,7 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         TEST_ERROR
 
     /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6340,23 +6211,24 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3))
+        TEST_ERROR
     if(fs_stat.serial_sect_count < 2)
-	TEST_ERROR
+        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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+    /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager; block #3 still in free-space */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
     if(tmp_addr != addr1)
-	TEST_ERROR
+        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, H5AC_ind_read_dxpl_id, stype) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)stype) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6364,47 +6236,47 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3))
+        TEST_ERROR
     if(fs_stat.serial_sect_count < 2)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Retrieve blocks #1 from H5FD_MEM_DRAW free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
     if(tmp_addr != saddr1)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Retrieve blocks #3 from H5FD_MEM_DRAW free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
     if(tmp_addr != saddr3)
-	TEST_ERROR
+        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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr6 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE6)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr7 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE7)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr8 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE8)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr5 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr6 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE6)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr7 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE7)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr8 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8)))
+        FAIL_STACK_ERROR
 
     /* Put block #5 & #7 into H5FD_MEM_BTREE free-space manager */
-    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr5, (hsize_t)TEST_BLOCK_SIZE5) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr7, (hsize_t)TEST_BLOCK_SIZE7) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr5, (hsize_t)TBLOCK_SIZE5) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr7, (hsize_t)TBLOCK_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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6420,7 +6292,7 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         TEST_ERROR
 
     /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6428,27 +6300,27 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE3+TEST_BLOCK_SIZE5+TEST_BLOCK_SIZE7))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE3+TBLOCK_SIZE5+TBLOCK_SIZE7))
+        TEST_ERROR
 
     /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+    FAIL_STACK_ERROR
     if(tmp_addr != addr3)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Retrieve block #7 from H5FD_MEM_BTREE free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE7)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE7)))
+        FAIL_STACK_ERROR
     if(tmp_addr != baddr7)
-	TEST_ERROR
+        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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6457,10 +6329,10 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
 
     /* Verify that the H5FD_MEM_SUPER free-space manager is there */
     if(!H5F_addr_defined(f->shared->fs_addr[type]))
-	TEST_ERROR
+        TEST_ERROR
 
     /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6468,11 +6340,16 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < TEST_BLOCK_SIZE5)
-	TEST_ERROR
+    if(fs_stat.tot_space < TBLOCK_SIZE5)
+        TEST_ERROR
 
+    /* Closing */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
@@ -6480,37 +6357,113 @@ test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
 
 error:
     H5E_BEGIN_TRY {
-	H5Fclose(file);
+        H5Fclose(file);
+        H5Pclose(fcpl);
+        H5Pclose(fapl);
     } H5E_END_TRY;
     return(1);
-} /* test_mf_fs_split() */
+} /* test_mf_fs_persist_split() */
+
+#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;                   \
+}
 
 /*
+ *-------------------------------------------------------------------------
  * 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)
+test_mf_fs_persist_multi(void)
 {
-    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");
+    hid_t   file = -1;                  /* File ID */
+    hid_t   fcpl = -1;                  /* File creation property list ID */
+    hid_t   fapl = -1;                  /* File access property list 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 */
+    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 */
+
+
+    TESTING("File's free-space managers are persistent for multi-file");
+
+    /* for now, we don't support persistant free space managers 
+     * with the multi file driver.
+     */
+    SKIPPED();
+    HDfprintf(stdout, " Persistant FSMs disabled in multi file driver.\n");
+    return 0;  /* <========== note return */
+
+    /* for now, we don't support persistant free space managers 
+     * with the multi file driver.
+     */
+    SKIPPED();
+    HDfprintf(stdout, " Persistant FSMs disabled in multi file driver.\n");
+    return 0;  /* <========== note return */
+
+    /* File creation property list template */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+        FAIL_STACK_ERROR
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)
+
+    if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, TRUE) < 0)
+        TEST_ERROR;
 
     /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
     /* Create the file to work on */
-    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6519,43 +6472,43 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
 
     /* Allocate 4 blocks of type H5FD_MEM_SUPER */
     type = H5FD_MEM_SUPER;
-    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+        FAIL_STACK_ERROR
 
     /* Put block #1, #3 into H5FD_MEM_SUPER free-space manager */
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+        FAIL_STACK_ERROR
 
     /* Put block #1, #3 into H5FD_MEM_DRAW free-space manager */
-    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE1) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr3, (hsize_t)TBLOCK_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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6567,7 +6520,7 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         TEST_ERROR
 
     /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6575,23 +6528,23 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3))
+        TEST_ERROR
     if(fs_stat.serial_sect_count < 2)
-	TEST_ERROR
+        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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+    /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager; block #3 still in free-space */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
     if(tmp_addr != addr1)
-	TEST_ERROR
+        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, H5AC_ind_read_dxpl_id, stype) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)stype) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6599,45 +6552,45 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3))
+        TEST_ERROR
     if(fs_stat.serial_sect_count < 2)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Retrieve blocks #1 from H5FD_MEM_DRAW free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
     if(tmp_addr != saddr1)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Retrieve blocks #3 from H5FD_MEM_DRAW free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
     if(tmp_addr != saddr3)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Allocate 4 blocks of type H5FD_MEM_BTREE */
     btype = H5FD_MEM_BTREE;
-    if(HADDR_UNDEF == (baddr1 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr2 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr3 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (baddr4 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr1 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr2 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr3 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr4 = H5MF_alloc(f, btype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+        FAIL_STACK_ERROR
 
     /* Put block #1 & #3 into H5FD_MEM_BTREE free-space manager */
-    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-	FAIL_STACK_ERROR
-    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr1, (hsize_t)TBLOCK_SIZE1) < 0)
+        FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5AC_ind_read_dxpl_id, baddr3, (hsize_t)TBLOCK_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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6649,7 +6602,7 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         TEST_ERROR
 
     /* Start up H5FD_MEM_SUPER free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, type) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6657,14 +6610,14 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < TEST_BLOCK_SIZE3)
-	TEST_ERROR
+    if(fs_stat.tot_space < TBLOCK_SIZE3)
+        TEST_ERROR
 
     /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
-    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+        FAIL_STACK_ERROR
     if(tmp_addr != addr3)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Verify that the free-space manager for H5FD_MEM_DRAW is not there */
     if(H5F_addr_defined(f->shared->fs_addr[stype]))
@@ -6675,7 +6628,7 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         TEST_ERROR
 
     /* Start up H5FD_MEM_BTREE free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, btype) < 0)
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)btype) < 0)
         FAIL_STACK_ERROR
 
     /* Get free-space info */
@@ -6683,27 +6636,27 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
         FAIL_STACK_ERROR
 
     /* Verify free-space info */
-    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
-	TEST_ERROR
+    if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3))
+        TEST_ERROR
     if(fs_stat.serial_sect_count < 2)
-	TEST_ERROR
+        TEST_ERROR
 
     /* Allocate 2 blocks of type H5FD_MEM_GHEAP */
     gtype = H5FD_MEM_GHEAP;
-    if(HADDR_UNDEF == (gaddr2 = H5MF_alloc(f, gtype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	FAIL_STACK_ERROR
-    if(HADDR_UNDEF == (gaddr1 = H5MF_alloc(f, gtype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (gaddr2 = H5MF_alloc(f, gtype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+        FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (gaddr1 = H5MF_alloc(f, gtype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+        FAIL_STACK_ERROR
 
     /* Put block #2 into H5FD_MEM_GHEAP free-space manager */
-    if(H5MF_xfree(f, gtype, H5AC_ind_read_dxpl_id, gaddr2, (hsize_t)TEST_BLOCK_SIZE2) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, gtype, H5AC_ind_read_dxpl_id, gaddr2, (hsize_t)TBLOCK_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)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
@@ -6712,39 +6665,44 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
 
     /* 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, H5AC_ind_read_dxpl_id, type) < 0)
-	    FAIL_STACK_ERROR
-
-	if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
-		(hsize_t)TEST_BLOCK_SIZE3, (H5FS_section_info_t **)&node)) < 0)
-	    FAIL_STACK_ERROR
-	if(node_found) TEST_ERROR
+        /* Start up H5FD_MEM_SUPER free-space manager */
+        if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)type) < 0)
+            FAIL_STACK_ERROR
+
+        if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
+                         (hsize_t)TBLOCK_SIZE1, (H5FS_section_info_t **)&node)) < 0)
+            FAIL_STACK_ERROR
+        if(node_found) TEST_ERROR
+
+        if((node_found = H5FS_sect_find(f, H5AC_ind_read_dxpl_id, f->shared->fs_man[type],
+                         (hsize_t)TBLOCK_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
+        TEST_ERROR
 
     /* Start up H5FD_MEM_GHEAP free-space manager */
-    if(H5MF_alloc_open(f, H5AC_ind_read_dxpl_id, gtype) < 0)
-	FAIL_STACK_ERROR
+    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)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(fs_stat.tot_space < TBLOCK_SIZE2)
+        TEST_ERROR
 
+    /* Closing */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR
 
     PASSED()
 
@@ -6752,695 +6710,2142 @@ test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
 
 error:
     H5E_BEGIN_TRY {
-	H5Fclose(file);
+        H5Fclose(file);
+        H5Pclose(fcpl);
+        H5Pclose(fapl);
     } 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;					\
-}
+} /* test_mf_fs_persist_multi() */
 
 /*
- * Tests to verify that file's free-space managers are persistent or going away
- * for different drivers.
+ *-------------------------------------------------------------------------
+ * Verify that the file's free-space persists where there are free sections in the manager
+ *-------------------------------------------------------------------------
  */
 static unsigned
-test_mf_fs_drivers(hid_t fapl)
+test_mf_fs_persist(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
 {
-    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);
+    hid_t   file = -1;              /* File ID */
+    hid_t   fcpl = -1;              /* File creation property list ID */
+    hid_t   fapl2 = -1;             /* File access property list ID */
+    char    filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t   *f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t  type;               /* File allocation type */
+    H5FD_mem_t  tt;                 /* 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 */
+
+    if(new_format)
+        TESTING("File's free-space is persistent with new library format")
+    else
+        TESTING("File's free-space is persistent with old library format")
+    
+    if(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi")) {
+
+        /* File creation property list template */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Copy the file access property list */
+        if((fapl2 = H5Pcopy(fapl)) < 0) FAIL_STACK_ERROR
+
+        if(new_format) {
+            /* Latest format */
+            if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+                FAIL_STACK_ERROR
+            /* Set to paged aggregation and persisting free-space */
+            if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+                TEST_ERROR
+        } else {
+            /* Setting: aggregation with persisting free-space */
+            if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+                TEST_ERROR
+        }
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* 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, fcpl, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-	/* STDIO */
-	HDputs("Testing free-space managers with stdio driver");
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
-	    FAIL_STACK_ERROR
-	if(H5Pset_fapl_stdio(fapl_new) < 0)
-	    FAIL_STACK_ERROR
+        /* Allocate 6 blocks */
+        type = H5FD_MEM_SUPER;
+        if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE6)))
+            FAIL_STACK_ERROR
 
-	ret += test_mf_fs_gone(fapl_new, fcpl);
-	ret += test_mf_fs_persist(fapl_new, fcpl);
+        /* Put block #1, #3, #5 to H5FD_MEM_SUPER free-space manager */
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+            FAIL_STACK_ERROR
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE3) < 0)
+            FAIL_STACK_ERROR
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr5, (hsize_t)TBLOCK_SIZE5) < 0)
+            FAIL_STACK_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
 
-	/* CORE */
-	HDputs("Testing free-space managers with core driver");
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-	/* 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
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-	ret += test_mf_fs_gone(fapl_new, fcpl);
-	ret += test_mf_fs_persist(fapl_new, fcpl);
+        H5MF_alloc_to_fs_type(f, type, TBLOCK_SIZE6, (H5F_mem_page_t *)&tt);
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Verify that H5FD_MEM_SUPER free-space manager is there */
+        if(!H5F_addr_defined(f->shared->fs_addr[tt]))
+            TEST_ERROR
 
-	/* FAMILY */
-	HDputs("Testing free-space managers with family driver");
+        /* Since we are about to open a self referential free space 
+         * manager prior to the first file space allocation / deallocation
+         * call H5MF_tidy_self_referential_fsm_hack() first so as to avoid
+         * assertion failures on the first file space alloc / dealloc.
+         */
+        if((f->shared->first_alloc_dealloc) &&
+           (SUCCEED != 
+            H5MF_tidy_self_referential_fsm_hack(f, H5AC_ind_read_dxpl_id)))
+            FAIL_STACK_ERROR
 
-	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
+        /* Start up H5FD_MEM_SUPER free-space manager */
+        if(!(f->shared->fs_man[tt]))
+            if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)tt) < 0)
+                FAIL_STACK_ERROR
 
-	ret += test_mf_fs_persist(fapl_new, fcpl);
+        /* Get info for free-space manager */
+        if(H5FS_stat_info(f, f->shared->fs_man[tt], &fs_stat) < 0)
+            FAIL_STACK_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Verify free-space info */
+        if(fs_stat.tot_space < (TBLOCK_SIZE1+TBLOCK_SIZE3+TBLOCK_SIZE5))
+            TEST_ERROR
 
-	/* SPLIT */
-	HDputs("Testing free-space managers with split driver");
+        if(fs_stat.serial_sect_count < 3)
+            TEST_ERROR
 
-	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
+        /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
+        if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+            FAIL_STACK_ERROR
+        if(tmp_addr != addr3)
+            TEST_ERROR
 
-	ret += test_mf_fs_persist(fapl_new, fcpl);
-	ret += test_mf_fs_split(fapl_new, fcpl);
+        /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager */
+        if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+            FAIL_STACK_ERROR
+        if(tmp_addr != addr1)
+            TEST_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
 
-	/* MULTI */
-	HDputs("Testing free-space managers with multi driver");
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR
 
-	MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-	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;
+        /* Verify that H5FD_MEM_SUPER free-space manager is there */
+        if(!H5F_addr_defined(f->shared->fs_addr[tt]))
+            TEST_ERROR
 
-	ret += test_mf_fs_multi(fapl_new, fcpl);
+        /* Retrieve block #5 from H5FD_MEM_SUPER free-space manager */
+        if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5)))
+            FAIL_STACK_ERROR
+        if(tmp_addr != addr5)
+            TEST_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+        if(H5Pclose(fapl2) < 0)
+            FAIL_STACK_ERROR
 
-    } /* end for new_format */
+        PASSED()
 
-    if(H5Pclose(fcpl) < 0)
-        FAIL_STACK_ERROR
-    if(H5Pclose(fapl2) < 0)
-        FAIL_STACK_ERROR
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support persisting free-space or paged aggregation strategy");
+    }
 
-    return(ret);
+    return(0);
 
 error:
     H5E_BEGIN_TRY {
+	H5Fclose(file);
         H5Pclose(fcpl);
         H5Pclose(fapl2);
-        H5Pclose(fapl_new);
     } H5E_END_TRY;
     return(1);
-} /* test_mf_fs_drivers() */
-
+} /* test_mf_fs_persist() */
 
 /*
- * Verify that file space management performs according to the
- * file space strategy and free space threshold as specified.
+ *-------------------------------------------------------------------------
+ * Verify free-space are merged/shrunk away 
+ *-------------------------------------------------------------------------
  */
 static unsigned
-test_filespace_strategy_threshold(hid_t fapl_new)
+test_mf_fs_gone(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
 {
-    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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-		FAIL_STACK_ERROR
-	    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-		FAIL_STACK_ERROR
-	    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-		FAIL_STACK_ERROR
-	    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-		FAIL_STACK_ERROR
-	    if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5)))
-		FAIL_STACK_ERROR
-	    if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (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, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
-		FAIL_STACK_ERROR
-	    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-		FAIL_STACK_ERROR
-	    if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, 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
+    hid_t   file = -1;              /* File ID */
+    hid_t   fcpl = -1;              /* File creation property list */
+    hid_t   fapl2 = -1;             /* File access property list */
+    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 */
+    H5FD_mem_t  fs_type; 
+    hbool_t contig_addr_vfd;
+    hbool_t ran_H5MF_tidy_self_referential_fsm_hack = FALSE;
+
+    if(new_format)
+        TESTING("File's free-space is going away with new library format")
+    else
+        TESTING("File's free-space is going away with old library format")
+
+    /* Current VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
 
-	    /* 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, (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 */
+    if(contig_addr_vfd) {
 
-	    /* Closing */
-	    if(H5Fclose(file) < 0)
-		FAIL_STACK_ERROR
-	    if(H5Pclose(fcpl) < 0)
-		FAIL_STACK_ERROR
+        /* File creation property list template */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
 
-	} /* end for fs_type */
-    } /* end for fs_threshold */
+        /* Copy the file access property list */
+        if((fapl2 = H5Pcopy(fapl)) < 0) FAIL_STACK_ERROR
 
-    PASSED()
+        if(new_format)
+            if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+                FAIL_STACK_ERROR
 
-    return(0);
+        /* Set to aggregation and persisting free-space */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
 
-error:
-    H5E_BEGIN_TRY {
-        H5Pclose(fcpl);
-	H5Fclose(file);
-    } H5E_END_TRY;
-    return(1);
-} /* test_filespace_strategy_threshold() */
+        /* Set the filename to use for this test (dependent on fapl) */
+        h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
 
-/*
- * 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");
+        /* Create the file to work on */
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-    /* 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, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE1)))
-	    FAIL_STACK_ERROR
-	if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE2)))
-	    FAIL_STACK_ERROR
-	if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE3)))
-	    FAIL_STACK_ERROR
-	if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE4)))
-	    FAIL_STACK_ERROR
-	if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE5)))
-	    FAIL_STACK_ERROR
-	if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE6)))
-	    FAIL_STACK_ERROR
-
-	/* Put block #3, #5 to H5FD_MEM_SUPER free-space manager */
-	if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
-	    FAIL_STACK_ERROR
-	if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TEST_BLOCK_SIZE4) < 0)
-	    FAIL_STACK_ERROR
-
-	if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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 */
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-    PASSED()
+        /* Allocate 4 blocks */
+        type = H5FD_MEM_SUPER;
+        if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+            FAIL_STACK_ERROR
+    
+        /* Put block #1, #3 to H5FD_MEM_SUPER free-space manager */
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+            FAIL_STACK_ERROR
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE3) < 0)
+            FAIL_STACK_ERROR
 
-    return(0);
+        /* Retrieve block #1, #3 from H5FD_MEM_SUPER free-space manager */
+        if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+            FAIL_STACK_ERROR
+        if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+            FAIL_STACK_ERROR
 
-error:
-    H5E_BEGIN_TRY {
-        H5Pclose(fcpl);
-	H5Fclose(file);
-    } H5E_END_TRY;
-    return(1);
-} /* test_filespace_gone() */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
 
-/*
- * 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 */
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-    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 */
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-    /* Copy the file access property list */
-    if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
+        H5MF_alloc_to_fs_type(f, type, TBLOCK_SIZE4, (H5F_mem_page_t *)&fs_type);
 
-    /* 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
+        /* Verify that the H5FD_MEM_SUPER free-space manager is not there */
+        if(H5F_addr_defined(f->shared->fs_addr[fs_type]))
+            TEST_ERROR
 
-    /* Test with old and new format */
-    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+        /* Put block #3 to H5FD_MEM_SUPER free-space manager */
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE3) < 0)
+            FAIL_STACK_ERROR
 
-	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...");
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
 
-	/* SEC2 */
-	HDputs("Testing file space management with sec2 driver");
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
-	    FAIL_STACK_ERROR
-	if(H5Pset_fapl_sec2(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
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        /* Verify that H5FD_MEM_SUPER free-space manager is there */
+        if(!H5F_addr_defined(f->shared->fs_addr[fs_type]))
+            TEST_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Since we are about to open a self referential free space 
+         * manager prior to the first file space allocation / deallocation
+         * call H5MF_tidy_self_referential_fsm_hack() first so as to avoid
+         * assertion failures on the first file space alloc / dealloc.
+         */
+         if(f->shared->first_alloc_dealloc){
+             if(SUCCEED!=H5MF_tidy_self_referential_fsm_hack(f,H5AC_ind_read_dxpl_id))
+                FAIL_STACK_ERROR
+            ran_H5MF_tidy_self_referential_fsm_hack = TRUE;
+        }
 
-	/* STDIO */
-	HDputs("Testing file space management with stdio driver");
+        /* Start up H5FD_MEM_SUPER free-space manager */
+        if(!(f->shared->fs_man[fs_type]))
+            if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, (H5F_mem_page_t)fs_type) < 0)
+                FAIL_STACK_ERROR
 
-	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
-	    FAIL_STACK_ERROR
-	if(H5Pset_fapl_stdio(fapl_new) < 0)
-	    FAIL_STACK_ERROR
+        /* Get info for H5FD_MEM_SUPER free-space manager */
+        if(H5FS_stat_info(f, f->shared->fs_man[fs_type], &fs_stat) < 0)
+            FAIL_STACK_ERROR
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        /* if we ran H5MF_tidy_self_referential_fsm_hack(), the 
+         * H5FD_MEM_SUPER free space manager must be floating.
+         * Thus fs_stat.addr must be undefined.
+         */
+        if((!ran_H5MF_tidy_self_referential_fsm_hack) &&
+           (!H5F_addr_defined(fs_stat.addr)))
+            TEST_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        if(fs_stat.tot_space < TBLOCK_SIZE3)
+            TEST_ERROR
 
-	/* CORE */
-	HDputs("Testing file space management with core driver");
+        /* Put block #4 to H5FD_MEM_SUPER free-space manager */
+        if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TBLOCK_SIZE4) < 0)
+            FAIL_STACK_ERROR
 
-	/* 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
+        /* The H5FD_MEM_SUPER free-space manager will go away at H5MF_close() */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0)
+            FAIL_STACK_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
 
-	/* FAMILY */
-	HDputs("Testing file space managers with family driver");
+        /* Verify that the H5FD_MEM_SUPER free-space manager is not there */
+        if(H5F_addr_defined(f->shared->fs_addr[fs_type]))
+            TEST_ERROR
 
-	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
+        /* Closing */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+        if(H5Pclose(fapl2) < 0)
+            FAIL_STACK_ERROR
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        PASSED()
 
-	h5_clean_files(FILENAME, fapl_new);
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support persistent free-space manager");
+    }
 
+    return(0);
 
-	/* SPLIT */
-	HDputs("Testing file space managers with split driver");
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+        H5Pclose(fcpl);
+        H5Pclose(fapl2);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_fs_gone() */
+
+/*
+ *-------------------------------------------------------------------------
+ * Verify that free-space persist with combinations of
+ * file space strategy and free space threshold as specified.
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_mf_strat_thres_persist(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
+{
+    hid_t   file = -1;              /* File ID */
+    hid_t   fcpl = -1;              /* File creation property list template */
+    hid_t   fapl2 = -1;             /* File access 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 */
+    H5FD_mem_t  tt;                 /* File allocation type */
+    haddr_t addr1, addr2, addr3, addr4, addr5, addr6; /* File address for H5FD_MEM_SUPER */
+    H5F_fspace_strategy_t fs_type;  /* File space handling strategy */
+    hsize_t fs_threshold;           /* Free-space section threshold */
+    unsigned    fs_persist;         /* To persist free-space or not */
+    hbool_t contig_addr_vfd;
+
+    if(new_format)
+        TESTING("File space strategy/persisting/threshold with new library format")
+    else
+        TESTING("File space strategy/persisting/threshold with old library format")
+
+    /* Current VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
+
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Copy the file access property list */
+    if((fapl2 = H5Pcopy(fapl)) < 0)
+         FAIL_STACK_ERROR
+
+    if(new_format)
+        if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+    /* Test with TRUE or FALSE for persisting free-space */
+    for(fs_persist = FALSE; fs_persist <= TRUE; fs_persist++) {
+
+        for(fs_threshold = 0; fs_threshold <= TEST_THRESHOLD10; fs_threshold++) {
+
+            /* Testing for H5F_FSPACE_STRATEGY_FSM_AGGR and H5F_FSPACE_STRATEGY_PAGE strategies only */
+            for(fs_type = H5F_FSPACE_STRATEGY_FSM_AGGR; fs_type < H5F_FSPACE_STRATEGY_AGGR; H5_INC_ENUM(H5F_fspace_strategy_t, fs_type)) {
+
+                if(!contig_addr_vfd && (fs_persist || fs_type == H5F_FSPACE_STRATEGY_PAGE))
+                    continue;
+
+                /* Create file-creation template */
+                if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+                    FAIL_STACK_ERROR
+    
+                /* Set default file space information */
+                if(H5Pset_file_space_strategy(fcpl, fs_type, (hbool_t)fs_persist, fs_threshold) < 0)
+                    FAIL_STACK_ERROR
+    
+                /* Create the file to work on */
+                if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 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, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+                    FAIL_STACK_ERROR
+                if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+                    FAIL_STACK_ERROR
+                if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+                    FAIL_STACK_ERROR
+                if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+                    FAIL_STACK_ERROR
+                if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5)))
+                    FAIL_STACK_ERROR
+                if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE6)))
+                    FAIL_STACK_ERROR
+    
+                /* Put block #1, #3, #5 to H5FD_MEM_SUPER free-space manager */
+                if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+                    FAIL_STACK_ERROR
+                if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE3) < 0)
+                    FAIL_STACK_ERROR
+                if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr5, (hsize_t)TBLOCK_SIZE5) < 0)
+                    FAIL_STACK_ERROR
+
+
+                /* Close the file */
+                if(H5Fclose(file) < 0)
+                    FAIL_STACK_ERROR
+
+                /* Re-open the file */
+                if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0)
+                    FAIL_STACK_ERROR
+
+                /* Get a pointer to the internal file object */
+                if(NULL == (f = (H5F_t *)H5I_object(file)))
+                    FAIL_STACK_ERROR
+
+                H5MF_alloc_to_fs_type(f, type, TBLOCK_SIZE6, (H5F_mem_page_t *)&tt);
+
+                /* Get a pointer to the internal file object */
+                if(NULL == (f = (H5F_t *)H5I_object(file)))
+                    FAIL_STACK_ERROR
+
+                if(f->shared->fs_persist) {
+                    hssize_t nsects;            /* # of free-space sections */
+                    int      i;                 /* local index variable */
+                    H5F_sect_info_t *sect_info; /* array to hold the free-space information */
+    
+                    /* Get the # of free-space sections in the file */
+                    if((nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL)) < 0)
+                        FAIL_STACK_ERROR
+
+                    /* Verify no free-space sections */
+                    /* paged aggregation has 1 section for last_small */
+                    if(fs_threshold > TBLOCK_SIZE5 && nsects && fs_type != H5F_FSPACE_STRATEGY_PAGE)
+                        TEST_ERROR
+
+                    if(nsects) {
+                        /* Allocate storage for the free space section information */
+                        sect_info = (H5F_sect_info_t *)HDcalloc((size_t)nsects, sizeof(H5F_sect_info_t));
+
+                        H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)nsects, sect_info);
+    
+                        /* Verify the size of free-space sections */
+                        for(i = 0; i < nsects; i++)
+                            if(sect_info[i].size < fs_threshold)
+                                TEST_ERROR
+                        if(sect_info)
+                            HDfree(sect_info);
+                    }
+                } else {
+                    if(H5F_addr_defined(f->shared->fs_addr[tt]))
+                        TEST_ERROR
+                }
+
+                /* Closing */
+                if(H5Fclose(file) < 0)
+                    FAIL_STACK_ERROR
+                if(H5Pclose(fcpl) < 0)
+                    FAIL_STACK_ERROR
+            } /* end for fs_type */
+        } /* end for fs_threshold */
+    } /* end for fs_persist */
+
+    if(H5Pclose(fapl2) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+        H5Pclose(fapl2);
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_strat_thres_persist() */
+
+/*
+ *-------------------------------------------------------------------------
+ * Verify free-space are merged/shrunk away with file space settings:
+ *  --strategy, persist/not persist file space
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_mf_strat_thres_gone(const char *env_h5_drvr, hid_t fapl, hbool_t new_format)
+{
+    hid_t   file = -1;              /* File ID */
+    hid_t   fcpl = -1;              /* File creation property list template */
+    hid_t   fapl2 = -1;             /* File access 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 */
+    H5FD_mem_t  tt;                 /* File allocation type */
+    haddr_t addr1, addr2, addr3, addr4, addr5, addr6; /* File address for H5FD_MEM_SUPER */
+    H5F_fspace_strategy_t fs_type;  /* File space handling strategy */
+    unsigned    fs_persist;         /* To persist free-space or not */
+    H5FS_stat_t fs_state;           /* Information for free-space manager */
+    H5FS_stat_t fs_state_zero;      /* Information for free-space manager */
+    hbool_t contig_addr_vfd;
+
+    if(new_format)
+        TESTING("File space merge/shrink for section size < threshold with new library format")
+    else
+        TESTING("File space merge/shrink for section size < threshold with old library format")
+
+    /* Current VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
+
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    HDmemset(&fs_state_zero, 0, sizeof(H5FS_stat_t));
+
+    /* Copy the file access property list */
+    if((fapl2 = H5Pcopy(fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    if(new_format)
+        if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+    /* Test with TRUE or FALSE for persisting free-space */
+    for(fs_persist = FALSE; fs_persist <= TRUE; fs_persist++) {
+        /* Testing for H5F_FSPACE_STRATEGY_FSM_AGGR and H5F_FSPACE_STRATEGY_PAGE strategies only */
+        for(fs_type = H5F_FSPACE_STRATEGY_FSM_AGGR; fs_type < H5F_FSPACE_STRATEGY_AGGR; H5_INC_ENUM(H5F_fspace_strategy_t, fs_type)) {
+
+            /* Skip for multi/split driver: persisting free-space or paged aggregation strategy */
+            if(!contig_addr_vfd && (fs_persist || fs_type == H5F_FSPACE_STRATEGY_PAGE))
+                continue;
+
+            /* Clear out free-space statistics */
+            HDmemset(&fs_state, 0, sizeof(H5FS_stat_t));
+
+            /* Create file-creation template */
+            if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+                FAIL_STACK_ERROR
+
+            /* Set default file space information */
+            if(H5Pset_file_space_strategy(fcpl, fs_type, fs_persist, (hsize_t)TEST_THRESHOLD3) < 0)
+                FAIL_STACK_ERROR
+
+            /* Create the file to work on */
+            if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 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, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1)))
+                FAIL_STACK_ERROR
+            if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE2)))
+                FAIL_STACK_ERROR
+            if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3)))
+                FAIL_STACK_ERROR
+            if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4)))
+                FAIL_STACK_ERROR
+            if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5)))
+                FAIL_STACK_ERROR
+            if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE6)))
+                FAIL_STACK_ERROR
+
+            H5MF_alloc_to_fs_type(f, type, TBLOCK_SIZE6, (H5F_mem_page_t *)&tt);
+
+            /* For paged aggregation, the section in the page at EOF for small meta fs is not shrunk away */
+            if(fs_type == H5F_FSPACE_STRATEGY_PAGE) {
+                if(H5FS_stat_info(f, f->shared->fs_man[tt], &fs_state) < 0)
+                    FAIL_STACK_ERROR
+            } 
+
+            /* Put block #3, #5 to H5FD_MEM_SUPER free-space manager */
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE3) < 0)
+                FAIL_STACK_ERROR
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr5, (hsize_t)TBLOCK_SIZE5) < 0)
+                FAIL_STACK_ERROR
+
+            fs_state.tot_space += TBLOCK_SIZE3 + TBLOCK_SIZE5;
+            fs_state.tot_sect_count += 2;
+            fs_state.serial_sect_count += 2;
+
+            if(check_stats(f, f->shared->fs_man[tt], &fs_state))
+                TEST_ERROR
+
+            /* section #2 is less than threshold but is merged into section #3 */
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE2) < 0)
+                FAIL_STACK_ERROR
+
+            fs_state.tot_space += TBLOCK_SIZE2;
+            if(check_stats(f, f->shared->fs_man[tt], &fs_state))
+                TEST_ERROR
+
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr4, (hsize_t)TBLOCK_SIZE4) < 0)
+                FAIL_STACK_ERROR
+
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr6, (hsize_t)TBLOCK_SIZE6) < 0)
+                FAIL_STACK_ERROR
+
+            /* For paged aggregation, the sections in the page at EOF for small meta fs are merged but are not shrunk away */
+            if(fs_type == H5F_FSPACE_STRATEGY_PAGE) {
+                fs_state.tot_sect_count = fs_state.serial_sect_count = 1;
+                fs_state.tot_space += (TBLOCK_SIZE4 + TBLOCK_SIZE6);
+            } 
+
+            /* For old format: the sections at EOF are shrunk away */
+            if(check_stats(f, f->shared->fs_man[tt], (fs_type == H5F_FSPACE_STRATEGY_PAGE) ? &fs_state:&fs_state_zero))
+                TEST_ERROR
+
+            /* section #1 is less than threshold but is shrunk away */
+            if(H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE1) < 0)
+                FAIL_STACK_ERROR
+
+            /* For paged aggregation, the section in the page at EOF for small meta fs is not shrunk away */
+            if(fs_type == H5F_FSPACE_STRATEGY_PAGE)
+                fs_state.tot_space += TBLOCK_SIZE1;
+
+            /* For old format: the sections at EOF are shrunk away */
+            if(check_stats(f, f->shared->fs_man[tt], (fs_type == H5F_FSPACE_STRATEGY_PAGE) ? &fs_state : &fs_state_zero))
+                TEST_ERROR
+
+            if(H5Fclose(file) < 0)
+                FAIL_STACK_ERROR
+
+            /* Re-open the file */
+            if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 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(!(fs_type == H5F_FSPACE_STRATEGY_PAGE && fs_persist))
+                if(H5F_addr_defined(f->shared->fs_addr[tt]))
+                    TEST_ERROR
+
+            /* Closing */
+            if(H5Fclose(file) < 0)
+                FAIL_STACK_ERROR
+
+            if(H5Pclose(fcpl) < 0)
+                FAIL_STACK_ERROR
+        } /* end for fs_type */
+    } /* end for fs_persist */
+
+    if(H5Pclose(fapl2) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+        H5Pclose(fapl2);
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_strat_thres_gone() */
+
+/*
+ *-------------------------------------------------------------------------
+ * 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(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;
+
+    TESTING("Allocation from raw or metadata free-space manager");
+
+    /* 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, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+
+    /* Allocate the second block of type H5FD_MEM_SUPER */
+    H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+    /* Allocate the first block of type H5FD_MEM_DRAW */
+    stype = H5FD_MEM_DRAW;
+    saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+
+    /* Free the first block of type H5FD_MEM_SUPER */
+    H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE30);
+
+    /* Allocate the second block of type H5FD_MEM_DRAW */
+    saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_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, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
+
+    /* Allocate the third block of type H5FD_MEM_SUPER */
+    addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+
+    /* Verify that addr3 is not saddr1 */
+    if(addr3 == saddr1) TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_dichotomy() */
+
+/*
+ *-------------------------------------------------------------------------
+ *  set_multi_split():
+ *      Internal routine to set up page-aligned address space for multi/split driver
+ *      when testing paged aggregation.
+ *-------------------------------------------------------------------------
+ */
+static int
+set_multi_split(hid_t fapl, hsize_t pagesize, hbool_t multi, hbool_t split)
+{
+    H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+    hid_t memb_fapl_arr[H5FD_MEM_NTYPES];
+    char *memb_name[H5FD_MEM_NTYPES];
+    haddr_t memb_addr[H5FD_MEM_NTYPES];
+    hbool_t relax;
+    H5FD_mem_t  mt;
+
+    HDassert(multi || split);
+
+    HDmemset(memb_name, 0, sizeof memb_name);
+
+    /* Get current split settings */
+    if(H5Pget_fapl_multi(fapl, memb_map, memb_fapl_arr, memb_name, memb_addr, &relax) < 0)
+        TEST_ERROR
+
+    if(split) {
+        /* Set memb_addr aligned */
+        memb_addr[H5FD_MEM_SUPER] = ((memb_addr[H5FD_MEM_SUPER] + pagesize - 1) / pagesize) * pagesize;
+        memb_addr[H5FD_MEM_DRAW] = ((memb_addr[H5FD_MEM_DRAW] + pagesize - 1) / pagesize) * pagesize;
+    } else {
+        /* Set memb_addr aligned */
+        for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+            memb_addr[mt] = ((memb_addr[mt] + pagesize - 1) / pagesize) * pagesize;
+    } /* end else */
+
+    /* Set multi driver with new FAPLs */
+    if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+        TEST_ERROR
+
+    /* Free memb_name */
+    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+        free(memb_name[mt]);
+
+    return 0;
+
+error:
+    return(-1);
+} /* set_multi_split() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_alloc_xfree
+ *
+ * Purpose:     To verify allocations and de-allocations for large/small
+ *              sections are done properly when paged aggregation is enabled.
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_alloc_xfree(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;             /* File ID */
+    hid_t fcpl = -1;            /* File creation property list */
+    hid_t fapl_new = -1;        /* File access property list ID */
+    H5F_t *f = NULL;            /* Internal file object pointer */
+    haddr_t addr2, addr3;       /* Addresses for small meta data blocks */
+    haddr_t saddr1;             /* Addresses for small raw data blocks */
+    haddr_t gaddr1;             /* Addresses for large data blocks */
+    hbool_t split = FALSE, multi = FALSE;
+    char filename[FILENAME_LEN];    /* Filename to use */
+    haddr_t found_addr;         /* Address of the found section */
+    unsigned fs_persist;        /* To persist free-space or not */
+
+    TESTING("Paged aggregation for file space: H5MF_alloc/H5MF_xfree");
+
+    /* Check for split or multi driver */
+    if(!HDstrcmp(env_h5_drvr, "split"))
+        split = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "multi"))
+        multi = TRUE;
+
+    if(!multi && !split) {
+
+        /* Set the filename to use for this test (dependent on fapl) */
+        h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+        if((fapl_new = H5Pcopy(fapl)) < 0) TEST_ERROR
+
+        if(multi || split)
+            if(set_multi_split(fapl_new, 4096, multi, split) <  0)
+                TEST_ERROR;
+
+        /* Test with TRUE or FALSE for persisting free-space */
+        for(fs_persist = FALSE; fs_persist <= TRUE; fs_persist++) {
+            H5F_mem_page_t fs_type;
+
+            /* File creation property list */
+            if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+                TEST_ERROR
+
+            /* Set the strategy to paged aggregation */
+            if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, fs_persist, (hsize_t)1) < 0)
+                TEST_ERROR
+
+            /* Create the file to work on */
+            if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+                TEST_ERROR
+
+            /* Get a pointer to the internal file object */
+            if(NULL == (f = (H5F_t *)H5I_object(fid)))
+                TEST_ERROR
+    
+            /* Allocate 3 small meta data blocks: addr1, addr2, addr3 */
+            H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+            addr2 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1034);
+            addr3 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+            /* Free the block with addr2 */
+            H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE1034);
+
+            if(!fs_persist) {
+
+                H5MF_alloc_to_fs_type(f, H5FD_MEM_OHDR, TBLOCK_SIZE1034, (H5F_mem_page_t *)&fs_type);
+
+                /* Verify that the freed block with addr2 is found from the small meta data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1034, f->shared->fs_man[fs_type], &found_addr) < 0)
+                    TEST_ERROR
+                if(found_addr != addr2)
+                    TEST_ERROR
+            } /* end if */
+
+            /* Allocate 2 small raw data blocks: saddr1, saddr2 */
+            saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+            H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE1034);
+
+            /* Free the block with saddr1 */
+            H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
+
+            if(!fs_persist) {
+                /* Verify that the freed block with saddr1 is found from the small raw data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30, f->shared->fs_man[H5F_MEM_PAGE_DRAW], &found_addr) < 0)
+                    TEST_ERROR
+                if(found_addr != saddr1)
+                    TEST_ERROR
+            } /* end if */
+
+            /* Allocate 2 large data blocks: gaddr1, gaddr2 */
+            gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
+            H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8000);
+
+            /* Free the block with gaddr1 */
+            H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr1, (hsize_t)TBLOCK_SIZE5000);
+
+            if(!fs_persist) {
+
+                H5MF_alloc_to_fs_type(f, H5FD_MEM_DRAW, TBLOCK_SIZE5000, (H5F_mem_page_t *)&fs_type);
+
+                /* Verify that the freed block with gaddr1 is found from the large data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8192, f->shared->fs_man[fs_type], &found_addr) < 0)
+                    TEST_ERROR
+                if(found_addr != gaddr1)
+                    TEST_ERROR
+            } /* end if */
+
+            /* Close file */
+            if(H5Fclose(fid) < 0)
+                TEST_ERROR
+
+            /* Close the property list */
+            if(H5Pclose(fcpl) < 0)
+                TEST_ERROR
+
+            if(fs_persist) {
+                /* Re-open the file */
+                if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+                    TEST_ERROR
+        
+                /* Get a pointer to the internal file object */
+                if(NULL == (f = (H5F_t *)H5I_object(fid)))
+                    TEST_ERROR
+
+                /* Verify that the large generic manager is there */
+                H5MF_alloc_to_fs_type(f, H5FD_MEM_DRAW, TBLOCK_SIZE5000, (H5F_mem_page_t *)&fs_type);
+                if(!H5F_addr_defined(f->shared->fs_addr[fs_type]))
+                    TEST_ERROR
+
+                /* Verify that the small meta data manager is there */
+                H5MF_alloc_to_fs_type(f, H5FD_MEM_OHDR, f->shared->fs_page_size - 1, (H5F_mem_page_t *)&fs_type);
+                if(!H5F_addr_defined(f->shared->fs_addr[fs_type]))
+                    TEST_ERROR
+
+                  /* Since we are about to open a self referential free space
+                   * manager prior to the first file space allocation / deallocation
+                   * call H5MF_tidy_self_referential_fsm_hack() first so as to avoid
+                   * assertion failures on the first file space alloc / dealloc.
+                   */
+                if(f->shared->first_alloc_dealloc){
+                    if(SUCCEED!=H5MF_tidy_self_referential_fsm_hack(f,H5AC_ind_read_dxpl_id))
+                        FAIL_STACK_ERROR
+                }
+
+                /* Set up to use the small meta data manager */
+                if(!(f->shared->fs_man[fs_type]))
+                    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, fs_type) < 0)
+                        TEST_ERROR
+
+                /* Verify that the freed block with addr2 is found from the small meta data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)(f->shared->fs_page_size-(addr3+TBLOCK_SIZE50)), f->shared->fs_man[fs_type], &found_addr) < 0)
+                    TEST_ERROR
+
+                if(found_addr != (addr3+TBLOCK_SIZE50))
+                    TEST_ERROR
+
+                /* Verify that the small raw data manager is there */
+                if(!H5F_addr_defined(f->shared->fs_addr[H5F_MEM_PAGE_DRAW]))
+                    TEST_ERROR
+        
+                /* Set up to use the small raw data manager */
+                if(!(f->shared->fs_man[H5F_MEM_PAGE_DRAW]))
+                    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, H5F_MEM_PAGE_DRAW) < 0)
+                        TEST_ERROR
+
+                /* Verify that the freed block with saddr1 is found from the small raw data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30, f->shared->fs_man[H5F_MEM_PAGE_DRAW], &found_addr) < 0)
+                    TEST_ERROR
+                if(found_addr != saddr1)
+                    TEST_ERROR
+
+                H5MF_alloc_to_fs_type(f, H5FD_MEM_DRAW, TBLOCK_SIZE5000, (H5F_mem_page_t *)&fs_type);
+
+                if(!(f->shared->fs_man[fs_type]))
+                    /* Set up to use the large data manager */
+                    if(H5MF_open_fstype(f, H5AC_ind_read_dxpl_id, fs_type) < 0)
+                        TEST_ERROR
+
+                /* Verify that the freed block with gaddr1 is found from the large data manager */
+                if(H5MF_find_sect(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8192, f->shared->fs_man[fs_type], &found_addr) < 0)
+                    TEST_ERROR
+                if(found_addr != gaddr1)
+                    TEST_ERROR
+        
+                /* Close file */
+                if(H5Fclose(fid) < 0)
+                    TEST_ERROR
+            } /* end if fs_persist */
+        } /* end for */
+
+        if(H5Pclose(fapl_new) < 0)
+            TEST_ERROR
+
+        PASSED()
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support persisting free-space or paged aggregation strategy");
+    }
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fcpl);
+        H5Pclose(fapl_new);
+    } H5E_END_TRY;
+    return(1);
+
+} /* test_page_alloc_xfree() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_try_shrink
+ *
+ * Purpose:     To verify that shrinking via H5MF_try_shrink() work properly
+ *              when paged aggregation is enabled.
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_try_shrink(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;                 /* File ID */
+    hid_t fcpl = -1;                /* File creation property list */
+    H5F_t *f = NULL;                /* Internal file object pointer */
+    haddr_t addr1;                  /* Address for small meta data block */
+    haddr_t saddr1;                 /* Address for small raw data block */
+    haddr_t gaddr1;                 /* Address for large data block */
+    hbool_t contig_addr_vfd;        /* Whether VFD used has a contigous address space */
+    htri_t status;                  /* status from shrinking */
+    h5_stat_size_t file_size;       /* File size */
+    char filename[FILENAME_LEN];    /* Filename to use */
+
+    TESTING("Paged aggregation for file space: H5MF_try_shrink()");
+
+    /* Current VFD that does not support continuous address space */
+    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));
+
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set the strategy to paged aggregation */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            FAIL_STACK_ERROR
+
+        /* Allocate a small meta data block with addr1 */
+        addr1 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Try to shrink the block with addr1 */
+        if((status = H5MF_try_shrink(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE50)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Couldn't shrink due to the section (remaining space in the page) is in the small meta data free-space manager */
+        if(status == TRUE) TEST_ERROR
+
+        /* Allocate a small raw data block with saddr1 */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Try to shrink the block with saddr1 */
+        if((status = H5MF_try_shrink(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE50)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Couldn't shrink due to the section (remaining space in the page) is in the small raw data free-space manager */
+        if(status == TRUE) TEST_ERROR
+
+        /* Allocate a large data block with gaddr1 */
+        gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
+
+        /* Try to shrink the block with gaddr1 */
+        if((status = H5MF_try_shrink(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr1, (hsize_t)TBLOCK_SIZE5000)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Couldn't shrink due to the section (remaining space in the page) is in the large-sized free-space manager */
+        if(status == TRUE) TEST_ERROR
+
+        /* Free the block with saddr1--merge to become 1 page, then return to the large manager */
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE50);
+
+        /* Merge all 3 sections and shrunk */
+        H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, gaddr1, (hsize_t)TBLOCK_SIZE5000);
+
+        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
+
+        /* Should be on page boundary */
+        if(file_size % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Close the property list */
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+
+        PASSED()
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support paged aggregation");
+    }
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+    return(1);
+
+} /* test_page_try_shrink() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_small_try_extend
+ *
+ * Purpose:     To verify that extending a small block via H5MF_try_extend() works
+ *              properly when paged aggregation is enabled.
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_small_try_extend(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;                 /* File ID */
+    hid_t fcpl = -1;                /* File creation property list */
+    H5F_t *f = NULL;                /* Internal file object pointer */
+    haddr_t addr1, addr2, addr3;    /* Addresses for small meta data blocks */
+    haddr_t saddr1;                 /* Address for small raw data block */
+    hbool_t contig_addr_vfd;        /* Whether VFD used has a contigous address space */
+    htri_t was_extended;            /* Whether the block can be extended or not */
+    char filename[FILENAME_LEN];    /* Filename to use */
+
+    TESTING("Paged aggregation for file space: H5MF_try_extend() a small block");
+
+    /* Current VFD that does not support continuous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi") && HDstrcmp(env_h5_drvr, "family"));
+
+    if(contig_addr_vfd) {
+
+        /* Set the filename to use for this test (dependent on fapl) */
+        h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set the strategy to paged aggregation */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            FAIL_STACK_ERROR
+
+        /* Allocate a small meta data block with addr1 */
+        addr1 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE98);
+
+        /* Try extending the block with addr1 at EOF not crossing page boundary */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_OHDR, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE98, (hsize_t)3100);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+
+        /* Allocate 2 small meta data blocks with addr2 and addr3--will be on another meta data page */
+        addr2 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE100);
+        addr3 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE150);
+
+        /* The block with addr2 should be page aligned */
+        /* The block with addr3 resides right next to the block with addr2 */
+        if(addr2 % TBLOCK_SIZE4096)
+            TEST_ERROR
+        if(addr3 != (addr2 + TBLOCK_SIZE100))
+            TEST_ERROR
+
+        /* Free the block with addr2 */
+        H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, addr2, (hsize_t)TBLOCK_SIZE100);
+
+        /* Try extending the block with addr1 that will cross to the next page where the freed block with addr2 resides */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_OHDR, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE3198, (hsize_t)TBLOCK_SIZE100);
+        /* Shouldn't succeed--should not cross page boundary */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Try extending the block with addr1 into the free-space section that is big enough to fulfill the request */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_OHDR, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE3198, (hsize_t)TBLOCK_SIZE50);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+    
+        /* Free the block with addr1 */
+        H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TBLOCK_SIZE3248);
+
+        /* Allocate a new meta data block with addr1 */
+        /* There is a page end threshold of size H5F_FILE_SPACE_PGEND_META_THRES at the end of the block */
+        /* The block is right next to the threshold */ 
+        addr1 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3286);
+
+        /* Try extending the block into the threshold with size > H5F_FILE_SPACE_PGEND_META_THRES */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_OHDR, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE3286, (hsize_t)TBLOCK_SIZE11);
+        /* Shouldn't succeed */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Try extending the block into the threshold with size < H5F_FILE_SPACE_PGEND_META_THRES */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_OHDR, (haddr_t)addr1, (hsize_t)TBLOCK_SIZE3286, (hsize_t)TBLOCK_SIZE2);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+
+        /* Free the block with addr3--will merge with the remaining sections to become a page and then free the page */
+        H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, addr3, (hsize_t)TBLOCK_SIZE150);
+
+        /* Allocate a small raw data block with saddr1 */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4086);
+
+        /* Try extending the block crossing the page boundary */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)saddr1, (hsize_t)TBLOCK_SIZE4086, (hsize_t)TBLOCK_SIZE11);
+        /* Shouldn't succeed */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Try extending the block not crossing page boundary */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)saddr1, (hsize_t)TBLOCK_SIZE4086, (hsize_t)TBLOCK_SIZE10);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+
+        /* The extended block is now "large" in size */
+        /* Try extending the block */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)saddr1, (hsize_t)TBLOCK_SIZE4096, (hsize_t)TBLOCK_SIZE10);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+
+        /* Try extending the large-sized block */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)saddr1, (hsize_t)TBLOCK_SIZE4106, (hsize_t)TBLOCK_SIZE5000);
+        /* Should not succeed because the mis-aligned fragment in the page is in the large-sized free-space manager */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Close the file */
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close the property list */
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+
+        PASSED()
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support paged aggregation");
+    }
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+    return(1);
+
+} /* test_page_small_try_extend() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_large_try_extend
+ *
+ * Purpose:     To verify that extending a large block via H5MF_try_extend()
+ *              is done properly when paged aggregation is enabled.
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_large_try_extend(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;                         /* File ID */
+    hid_t fcpl = -1;                        /* File creation property list */
+    H5F_t *f = NULL;                        /* Internal file object pointer */
+    haddr_t gaddr1, gaddr2, gaddr3, gaddr4; /* Addresses for large data blocks */
+    hbool_t contig_addr_vfd;                /* Whether VFD used has a contigous address space */
+    htri_t was_extended;                    /* Whether the block can be extended or not */
+    char filename[FILENAME_LEN];            /* Filename to use */
+
+    TESTING("Paged aggregation for file space: H5MF_try_extend() a large block");
+
+    /* Current VFD that does not support continuous address space */
+    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));
+
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set the strategy to paged aggregation */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            FAIL_STACK_ERROR
+
+        /* Allocate a large data block with gaddr1 */
+        gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)6000);
+
+        /* Should be page aligned */
+        if(gaddr1 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Extending the block with gaddr1 at EOF to become 2 pages */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr1, (hsize_t)TBLOCK_SIZE6000, (hsize_t)TBLOCK_SIZE2192);
+        /* Should succeed */
+        if(was_extended != TRUE) TEST_ERROR
+
+        /* Allocate a large data block with gaddr2 */
+        gaddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8000);
+        /* Should be page aligned */
+        if(gaddr2 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Try extending the block with gaddr1 */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr1, (hsize_t)TBLOCK_SIZE8192, (hsize_t)TBLOCK_SIZE50);
+        /* Should not succeed */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Allocate a large data block with gaddr3 */
+        gaddr3 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8000);
+        /* Should be page aligned */
+        if(gaddr3 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Try extending the block with gaddr2--there is a free-space section big enough to fulfill the request */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr2, (hsize_t)TBLOCK_SIZE8000, (hsize_t)TBLOCK_SIZE100);
+        /* Should succeed */
+        if(was_extended == FALSE) TEST_ERROR
+
+        /* Try extending the block with gaddr2--there is no free-space section big enough to fulfill the request */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr2, (hsize_t)TBLOCK_SIZE8100, (hsize_t)TBLOCK_SIZE100);
+        /* Should not succeed */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Try extending the block with gaddr2--there is a free-space section big enough to fulfill the request */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr2, (hsize_t)TBLOCK_SIZE8100, (hsize_t)TBLOCK_SIZE90);
+        /* Should succeed */
+        if(was_extended == FALSE) TEST_ERROR
+
+        /* Try extending the block with gaddr2 */
+        /* There is no free-space section big enough to fulfill the request (request is < H5F_FILE_SPACE_PGEND_META_THRES) */ 
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr2, (hsize_t)TBLOCK_SIZE8190, (hsize_t)TBLOCK_SIZE5);
+        /* Should not succeed */
+        if(was_extended == TRUE) TEST_ERROR
+
+        /* Allocate a large data block with gaddr4 */
+        gaddr4 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
+        /* Should be page aligned */
+        if(gaddr4 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Free the block with gaddr3--will merge with remaining free space to become 2 pages + section (size 2) in previous page */
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr3, (hsize_t)TBLOCK_SIZE8000);
+
+        /* Try extending the block with gaddr2 crossing page boundary--there is free-space section big enough to fulfill the request */
+        was_extended = H5MF_try_extend(f, H5AC_ind_read_dxpl_id, H5FD_MEM_DRAW, (haddr_t)gaddr2, (hsize_t)TBLOCK_SIZE8190, (hsize_t)TBLOCK_SIZE5);
+        /* Should succeed */
+        if(was_extended == FALSE) TEST_ERROR
+
+        /* Close file */
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close the property list */
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+
+        PASSED()
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support paged aggregation strategy");
+    }
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+    return(1);
+
+} /* test_page_large_try_extend() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_large
+ *
+ * Purpose:     To verify that allocations and de-allocations for large data
+ *              are done properly when paged aggregation is enabled.
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_large(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;                         /* File ID */
+    hid_t fcpl = -1;                        /* File creation property list ID */
+    H5F_t *f = NULL;                        /* Internal file object pointer */
+    haddr_t gaddr1, gaddr2, gaddr3, gaddr4; /* Addresses for blocks */
+    hbool_t contig_addr_vfd;                /* Whether VFD used has a contigous address space */
+    H5FS_stat_t fs_stat;                    /* Information for free-space manager */
+    h5_stat_size_t file_size;               /* File size */
+    char filename[FILENAME_LEN];            /* Filename to use */
+
+    TESTING("Paged aggregation for file space: large allocations and de-allocations");
+
+    /* Current VFD that does not support continuous address space */
+    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));
+
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set the strategy to paged aggregation */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
+    
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+            FAIL_STACK_ERROR
 
-	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
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            FAIL_STACK_ERROR
+
+        /* Allocate a large data block with gaddr1 */
+        /* 1 page + 1904 bytes; 2192 bytes in free-space manager */
+        gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE6000);
+
+        /* Should be page aligned */
+        if(gaddr1 % TBLOCK_SIZE4096)
+            TEST_ERROR
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        /* Allocate a large data block with gaddr2--should be on another page */
+        /* Allocate 1 page + 3904 bytes; 192 bytes in free-space manager */
+        gaddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8000);
+        /* Should be page aligned */
+        if(gaddr2 % TBLOCK_SIZE4096)
+            TEST_ERROR
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Allocate a large data block with gaddr3--should be on another page */
+        /* Allocate 2 pages + 3808 bytes; 288 bytes in free-space manager */
+        gaddr3 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE12000);
+        if(!H5F_addr_defined(gaddr3))
+            TEST_ERROR
 
-	/* MULTI */
-	HDputs("Testing file space managers with multi driver");
+        /* Free the block with gaddr2 */
+        /* Merged sections: 2192 + 8000 + 192 = 10384 */
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr2, (hsize_t)TBLOCK_SIZE8000);
 
-	MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)
+        /* Get free-space info */
+        if(H5FS_stat_info(f, f->shared->fs_man[H5F_MEM_PAGE_GENERIC], &fs_stat) < 0)
+            FAIL_STACK_ERROR
 
-	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;
+        /* Verify that the manager contains 2 free-space sections: 10384 and 288 */
+        if(fs_stat.tot_sect_count != 2)
+            TEST_ERROR
+        if(fs_stat.tot_space != (10384+288))
+            TEST_ERROR
 
-	ret += test_filespace_strategy_threshold(fapl_new);
-	ret += test_filespace_gone(fapl_new);
+        /* Allocate a large data block with gaddr4--there is a free-space section able to fulfill the request */
+        /* Free-space sections: 2192 + 3192 + 288 = 5672 bytes */
+        gaddr4 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
 
-	h5_clean_files(FILENAME, fapl_new);
+        /* Should be page aligned */
+        if(gaddr4 % TBLOCK_SIZE4096)
+            TEST_ERROR
+        if(gaddr4 != gaddr2)
+            TEST_ERROR
 
-    } /* end for new_format */
+        /* Get free-space info */
+        if(H5FS_stat_info(f, f->shared->fs_man[H5F_MEM_PAGE_GENERIC], &fs_stat) < 0)
+            FAIL_STACK_ERROR
+        /* Verify that that there are 3 free-space sections */
+        if(fs_stat.tot_sect_count != 3)
+            TEST_ERROR
+        if(fs_stat.tot_space != (2192+3192+288))
+            TEST_ERROR
 
-    if (H5Pclose(fapl2) < 0)
-        FAIL_STACK_ERROR
+        /* Free the two blocks with gaddr1 and gaddr4 */
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr1, (hsize_t)TBLOCK_SIZE6000);
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, gaddr4, (hsize_t)TBLOCK_SIZE5000);
+
+        /* Get free-space info */
+        if(H5FS_stat_info(f, f->shared->fs_man[H5F_MEM_PAGE_GENERIC], &fs_stat) < 0)
+            FAIL_STACK_ERROR
+        /* Verify that that there are 2 free-space sections: 16384 (4 pages) + 288 */
+        if(fs_stat.tot_sect_count != 2)
+            TEST_ERROR
+        if(fs_stat.tot_space != (16384+288))
+            TEST_ERROR
+    
+        /* Close file */
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close the property list */
+        if(H5Pclose(fcpl) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get the size of the file */
+        if((file_size = h5_get_file_size(filename, fapl)) < 0)
+            TEST_ERROR
+
+        /* Verify that file size end on a page boundary */
+        if(file_size % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        PASSED()
 
-    return(ret);
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support paged aggregation strategy");
+    }
+
+    return(0);
 
 error:
     H5E_BEGIN_TRY {
-        H5Pclose(fapl_new);
-        H5Pclose(fapl2);
+        H5Fclose(fid);
     } 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
+} /* test_page_large() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_small
  *
- * (4) Free the first block (size 30) of type H5FD_MEM_SUPER
+ * Purpose:     To verify allocations and de-allocations for small meta/raw data
+ *              are done properly when paged aggregation is enabled.
  *
- * (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)
+ * Return:      Success:        0
+ *              Failure:        number of errors
  *
- * (7) Allocate the second block (size 30) of type H5FD_MEM_DRAW
- * (8) Free the first block (size 30) of type H5FD_MEM_DRAW
+ * Programmer:  Vailin Choi; Jan 2013
  *
- * (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)
+test_page_small(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");
+    hid_t fid = -1;                     /* File ID */
+    hid_t fcpl = -1;                    /* File creation property list */
+    H5F_t *f = NULL;                    /* Internal file object pointer */
+    haddr_t addr2, addr3, addr4, addr5; /* Addresses for blocks */
+    haddr_t addr9, addr10, addr11;      /* Address for small meta data blocks */
+    haddr_t saddr1, saddr2;             /* Addresses for small raw data blocks */
+    H5FS_stat_t fs_stat;                /* Information for free-space manager */
+    char filename[FILENAME_LEN];        /* Filename to use */
+    hbool_t multi= FALSE, split = FALSE, family = FALSE;
+
+    TESTING("Paged aggregation for file space: small allocations and de-allocations");
+
+    if(!HDstrcmp(env_h5_drvr, "split"))
+        split = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "multi"))
+        multi = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "family"))
+        family = TRUE;
+    
+    if(!multi && !split) {
 
-    /* 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));
 
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set the strategy to paged aggregation */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0)
+            FAIL_STACK_ERROR
+
         /* Create the file to work on */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
             FAIL_STACK_ERROR
 
         /* Get a pointer to the internal file object */
-        if(NULL == (f = (H5F_t *)H5I_object(file)))
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
             FAIL_STACK_ERROR
 
-        /* Allocate the first block of type H5FD_MEM_SUPER */
-        type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Allocate 2 small meta data blocks: addr1, addr2 */
+        H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+        addr2 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Allocate a small raw data block with saddr1 */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+        /* Should be on the second page and page aligned */
+        if(saddr1 % TBLOCK_SIZE4096)
+            TEST_ERROR
 
-        /* Allocate the second block of type H5FD_MEM_SUPER */
-        H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE50);
+        /* Allocate a small raw data block with saddr2 */
+        saddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+        /* Should not be page aligned */
+        if(!(saddr2 % TBLOCK_SIZE4096))
+            TEST_ERROR
+        /* Should be next to the block with saddr1 */
+        if(saddr2 != (saddr1 + TBLOCK_SIZE30))
+            TEST_ERROR
 
-        /* Allocate the first block of type H5FD_MEM_DRAW */
-        stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Allocate a small meta data block with addr3--there is no free-space section big enough to fulfill the request */
+        addr3 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE4020);
+        /* Should be on the third page and page aligned */
+        if(addr3 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Allocate a small meta data block with addr4--there is a free-space section big enough to fulfill the request */
+        addr4 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
+        /* Should not be page aligned */
+        if(!(addr4 % TBLOCK_SIZE4096))
+            TEST_ERROR
+        /* Should be next to the block with addr2 */
+        if(addr4 != (addr2 + TBLOCK_SIZE50))
+            TEST_ERROR
 
-	/* Free the first block of type H5FD_MEM_SUPER */
-        H5MF_xfree(f, type, H5AC_ind_read_dxpl_id, addr1, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Allocate a small meta data block with addr5--there is a free-space section big enough to fulfill the request */
+        addr5 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE40);
+        /* Should not be page aligned */
+        if(!(addr5 % TBLOCK_SIZE4096))
+            TEST_ERROR
 
-        /* Allocate the second block of type H5FD_MEM_DRAW */
-        saddr2 = H5MF_alloc(f, stype, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Should be next to the block with addr3 */
+        if(addr5 != (addr3 + TBLOCK_SIZE4020))
+            TEST_ERROR
 
-	/* Verify that saddr1 is not addr1 */
-	if(saddr2 == addr1) TEST_ERROR
+        /* Allocate a small meta data block with addr6--taking up the remaining space in the first page */
+        if(family)
+            H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3080);
+        else
+            H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3088);
 
-	/* Free the first block of type H5FD_MEM_DRAW */
-        H5MF_xfree(f, stype, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Allocate a small meta data block with addr7--taking up the remaining space in the third page */
+        H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE36);
 
-        /* Allocate the third block of type H5FD_MEM_SUPER */
-        addr3 = H5MF_alloc(f, type, H5AC_ind_read_dxpl_id, (hsize_t)TEST_BLOCK_SIZE30);
+        /* Allocate 2 small meta data blocks: addr8, addr9--there is no free-space to fulfill the request */
+        H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+        addr9 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
 
-	/* Verify that addr3 is not saddr1 */
-	if(addr3 == saddr1) TEST_ERROR
+        /* Free the block with saddr1 and saddr2--merge with remaining section to become a page which will be returned to the large manager */
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr1, (hsize_t)TBLOCK_SIZE30);
+        H5MF_xfree(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, saddr2, (hsize_t)TBLOCK_SIZE50);
 
-        if(H5Fclose(file) < 0)
+        /* Verify that the large manager does contain a section with file space page size (default is 4096) */
+        if(!f->shared->fs_man[H5F_MEM_PAGE_GENERIC])
+            TEST_ERROR
+        if(H5FS_stat_info(f, f->shared->fs_man[H5F_MEM_PAGE_GENERIC], &fs_stat) < 0)
+            FAIL_STACK_ERROR
+        if(fs_stat.tot_space != TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Allocate a small meta data block with addr10--there is a free-space section big enough to fulfill the request */
+        addr10 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE3900);
+        /* The block should be next to the block with addr9 */
+        if(addr10 != (addr9 + TBLOCK_SIZE80))
+            TEST_ERROR
+
+        /* Allocate a small meta data block with addr11 */
+        /* The current free-space section is unable to fulfill the request; obtain a page from the large manager */
+        addr11 = H5MF_alloc(f, H5FD_MEM_OHDR, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
+        /* The address of the block should be the same the freed block with saddr1 */
+        if(addr11 != saddr1)
+            TEST_ERROR
+
+        /* Close file */
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close the property list */
+        if(H5Pclose(fcpl) < 0)
             FAIL_STACK_ERROR
 
         PASSED()
-    } /* end if */
-    else {
-	SKIPPED();
-	puts("    Current VFD doesn't support metadata aggregator");
-    } /* end else */
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support paged aggregation strategy");
+    }
 
     return(0);
 
 error:
     H5E_BEGIN_TRY {
-	H5Fclose(file);
+        H5Fclose(fid);
+        H5Pclose(fcpl);
     } H5E_END_TRY;
     return(1);
-} /* test_dichotomy() */
+
+} /* test_page_small() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_page_alignment
+ *
+ * Purpose:     To verify the proper alignment is used when H5Pset_alignment()
+ *              is set and paged aggregation is enabled.  
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Vailin Choi; Jan 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_page_alignment(const char *env_h5_drvr, hid_t fapl)
+{
+
+    hid_t fid = -1;                 /* File ID */
+    hid_t fcpl = -1;                /* File creation property list ID */
+    hid_t fcpl2 = -1;               /* File creation property list ID */
+    hid_t fapl_new = -1;            /* File access property list ID */
+    H5F_t *f = NULL;                /* Internal file object pointer */
+    haddr_t addr1, addr2;           /* Addresses for small meta data blocks */
+    haddr_t saddr1, saddr2;         /* Addresses for small raw data blocks */
+    haddr_t gaddr1, gaddr2;         /* Addresses for blocks */
+    char filename[FILENAME_LEN];    /* Filename to use */
+    hbool_t split = FALSE, multi = FALSE;
+
+    TESTING("Paged aggregation and H5Pset_alignment: verify proper alignment is used");
+
+    /* Check for split or multi driver */
+    if(!HDstrcmp(env_h5_drvr, "split"))
+        split = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "multi"))
+        multi = TRUE;
+   
+    if(!multi && !split) {
+
+        /* Set the filename to use for this test (dependent on fapl) */
+        h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+        /*
+         * Case 1: Verify that the alignment in use is the default file space
+         *         page size when paged aggregation is enabled.
+         */
+
+        if((fapl_new = H5Pcopy(fapl)) < 0) TEST_ERROR
+
+        /* The alignment to use will be the library's default file space page size */
+        if(H5Pset_libver_bounds(fapl_new, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+        /* Set alignment value to 16 */
+        if(H5Pset_alignment(fapl_new, (hsize_t)0, (hsize_t)TEST_ALIGN16) < 0)
+            TEST_ERROR
+
+        if(split || multi) {
+            hid_t memb_fapl;
+            H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+            hid_t memb_fapl_arr[H5FD_MEM_NTYPES];
+            char *memb_name[H5FD_MEM_NTYPES];
+            haddr_t memb_addr[H5FD_MEM_NTYPES];
+            hbool_t relax;
+            H5FD_mem_t  mt;
+
+            /* Create fapl */
+            if((memb_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+                TEST_ERROR
+
+            /* Set alignment */
+            if(H5Pset_alignment(memb_fapl, 0, (hsize_t)TEST_ALIGN16) < 0)
+                TEST_ERROR
+
+            HDmemset(memb_name, 0, sizeof memb_name);
+
+            if(split) {
+                /* Set split driver with new FAPLs */
+                if(H5Pset_fapl_split(fapl_new, "-m.h5", memb_fapl, "-r.h5", memb_fapl) < 0)
+                    TEST_ERROR
+
+                /* Get current multi settings */
+                if(H5Pget_fapl_multi(fapl_new, memb_map, memb_fapl_arr, memb_name, memb_addr, &relax) < 0)
+                    TEST_ERROR
+
+                /* Set memb_addr aligned */
+                memb_addr[H5FD_MEM_SUPER] = ((memb_addr[H5FD_MEM_SUPER] + TBLOCK_SIZE4096 - 1) / TBLOCK_SIZE4096) * TBLOCK_SIZE4096;
+                memb_addr[H5FD_MEM_DRAW] = ((memb_addr[H5FD_MEM_DRAW] + TBLOCK_SIZE4096 - 1) / TBLOCK_SIZE4096) * TBLOCK_SIZE4096;
+
+                /* Set split driver with new FAPLs */
+                if(H5Pset_fapl_multi(fapl_new, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+                    TEST_ERROR
+
+            } else {
+                /* Get current multi settings */
+                if(H5Pget_fapl_multi(fapl_new, memb_map, NULL, memb_name, memb_addr, &relax) < 0)
+                    TEST_ERROR
+
+                /* Populate memb_fapl_arr */
+                /* Set memb_addr aligned */
+                for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt)) {
+                    memb_fapl_arr[mt] = memb_fapl;
+                    memb_addr[mt] = ((memb_addr[mt] + TBLOCK_SIZE4096 - 1) / TBLOCK_SIZE4096) * TBLOCK_SIZE4096;
+                }
+
+                /* Set multi driver with new FAPLs */
+                if(H5Pset_fapl_multi(fapl_new, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+                    TEST_ERROR
+
+            } /* end else */
+
+            /* Free memb_name */
+            for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+                free(memb_name[mt]);
+
+            /* Close memb_fapl */
+            if(H5Pclose(memb_fapl) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* File creation property list */
+        if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            TEST_ERROR
+
+        /* Set the strategy to paged aggregation and persisting free space */
+        /* The alignment to use will be the library's default file space page size */
+        if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+            TEST_ERROR
+    
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+            TEST_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            TEST_ERROR
+
+        /* Allocate 2 small raw data blocks */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+        saddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Should be on the second page and page aligned on 4096 (default file space page size) */
+        if(saddr1 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Should be next to the block with saddr1 */
+        if(saddr2 != (saddr1 + TBLOCK_SIZE30))
+            TEST_ERROR
+
+        /* Allocate 2 large raw data blocks */
+        gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
+        gaddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE8000);
+
+        /* Should be on the 3rd page and page aligned */
+        if(gaddr1 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Should be on the 4th page and page aligned */
+        if(gaddr2 % TBLOCK_SIZE4096)
+            TEST_ERROR
+
+        /* Close the file creation property list */
+        if(H5Pclose(fcpl) < 0)
+            TEST_ERROR
+
+        /* Close file */
+        if(H5Fclose(fid) < 0)
+            TEST_ERROR
+
+        /* 
+         * Case 2: Verify that the alignment in use is the alignment set
+         *         via H5Pset_alignment when paged aggregation not enabled.
+         */
+        /* fapl_new has latest format and H5Pset_alignment set */
+        /* Disable small data block mechanism */
+        if(H5Pset_small_data_block_size(fapl_new, (hsize_t)0) < 0)
+            TEST_ERROR
+        /* Disable meta data block mechanism */
+        if(H5Pset_meta_block_size(fapl_new, (hsize_t)0) < 0)
+            TEST_ERROR
+
+        /* Create the file to work on */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_new)) < 0)
+            TEST_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            TEST_ERROR
+
+        /* Allocate 2 small meta data blocks */
+        addr1 = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+        addr2 = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Should be aligned on 16 */
+        if(addr1 % TEST_ALIGN16 || addr2 % TEST_ALIGN16)
+            TEST_ERROR
+
+        /* addr2 should be right next to the block with addr1 */
+        if((addr1 + TBLOCK_SIZE30) % TEST_ALIGN16)
+            if(addr2 != (((addr1 + TBLOCK_SIZE30) / TEST_ALIGN16) + 1) * TEST_ALIGN16)
+                TEST_ERROR
+
+        /* Allocate 2 small raw data blocks */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE80);
+        saddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE100);
+
+        /* Should be aligned on 16 */
+        if(saddr1 % TEST_ALIGN16 || saddr2 % TEST_ALIGN16)
+            TEST_ERROR
+
+        if(!multi && !split) {
+            /* saddr1 should be right next to the block with addr2 */
+            if((addr2 + TBLOCK_SIZE50) % TEST_ALIGN16)
+                if(saddr1 != (((addr2 + TBLOCK_SIZE50) / TEST_ALIGN16) + 1) * TEST_ALIGN16)
+                    TEST_ERROR
+        }
+
+        /* saddr2 should be right next to the block with saddr1 */
+        if((saddr1 + TBLOCK_SIZE80) % TEST_ALIGN16)
+            if(saddr2 != (((saddr1 + TBLOCK_SIZE80) / TEST_ALIGN16) + 1) * TEST_ALIGN16)
+                TEST_ERROR
+
+        /* Close file */
+        if(H5Fclose(fid) < 0)
+            TEST_ERROR
+
+        /* 
+         * Case 3: Verify that the alignment in use is the alignment set
+         *         via H5Pset_alignment when paged aggregation not enabled.
+         */
+        /* File creation property list */
+        if((fcpl2 = H5Pcreate(H5P_FILE_CREATE)) < 0)
+            TEST_ERROR
+
+        /* Set file space page size */
+        if(H5Pset_file_space_page_size(fcpl2, (hsize_t)TBLOCK_SIZE8192) < 0)
+            TEST_ERROR
+
+        /* Set strategy to H5F_FSPACE_STRATEGY_AGGR but meta/raw data block is 0 as set in fapl_new */
+        if(H5Pset_file_space_strategy(fcpl2, H5F_FSPACE_STRATEGY_AGGR, FALSE, (hsize_t)1) < 0)
+            TEST_ERROR
+
+        /* fapl_new has latest format, H5Pset_alignment set, and disable meta/raw block */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl2, fapl_new)) < 0)
+            TEST_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(fid)))
+            TEST_ERROR
+    
+        /* Allocate 2 small raw data blocks */
+        saddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE30);
+        saddr2 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE50);
+
+        /* Should be aligned on 16 */
+        if(saddr1 % TEST_ALIGN16)
+            TEST_ERROR
+        if(saddr2 % TEST_ALIGN16)
+            TEST_ERROR
+
+        /* saddr2 should be right next to the block with saddr1 */
+        if((saddr1 + TBLOCK_SIZE30) % TEST_ALIGN16)
+            if(saddr2 != (((saddr1 + TBLOCK_SIZE30) / TEST_ALIGN16) + 1) * TEST_ALIGN16)
+                TEST_ERROR
+
+        /* Allocate a large raw data block */
+        gaddr1 = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, (hsize_t)TBLOCK_SIZE5000);
+
+        /* Should be aligned on 16 */
+        if(gaddr1 % TEST_ALIGN16)
+            TEST_ERROR
+
+        /* gaddr1 is right next to the block with saddr2 */
+        if((saddr2 + TBLOCK_SIZE50) % TEST_ALIGN16)
+            if(gaddr1 != (((saddr2 + TBLOCK_SIZE50) / TEST_ALIGN16) + 1) * TEST_ALIGN16)
+                TEST_ERROR
+
+        /* There is no free-space manager involved for H5F_FSPACE_STRATEGY_AGGR strategy */
+        if(f->shared->fs_man[H5FD_MEM_DRAW] || f->shared->fs_man[H5FD_MEM_SUPER])
+            TEST_ERROR
+
+        /* Closing */
+        if(H5Fclose(fid) < 0)
+            TEST_ERROR
+        if(H5Pclose(fcpl2) < 0)
+            TEST_ERROR
+        if(H5Pclose(fapl_new) < 0)
+            TEST_ERROR
+
+        PASSED()
+
+    } else {
+        SKIPPED();
+        puts("    Current VFD doesn't support persisting free-space or paged aggregation strategy");
+    }
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fcpl);
+        H5Pclose(fapl_new);
+    } H5E_END_TRY;
+    return(1);
+
+} /* test_page_alignment() */
 
 int
 main(void)
@@ -7462,33 +8867,21 @@ main(void)
 
     /* 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 */
+    /* For old library format--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);
+    /* For old library format */
+    nerrors += test_dichotomy(new_fapl);
 
-    /* interaction with free-space manager */
+    /* For old library format--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 */
+    /* For old library format--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);
@@ -7499,41 +8892,87 @@ main(void)
     nerrors += test_mf_aggr_extend(env_h5_drvr, fapl);
     nerrors += test_mf_aggr_absorb(env_h5_drvr, fapl);
 
-    /* Tests for alignment */
+    /* For old library format--tests for alignment */
     for(curr_test = TEST_NORMAL; curr_test < TEST_NTESTS; H5_INC_ENUM(test_type_t, curr_test)) {
 
-	switch(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
+                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
+                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);
+                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 for */
+
+    /* For old and new format--interaction with temporary file space allocation */
+    nerrors += test_mf_tmp(env_h5_drvr, fapl, FALSE);
+    nerrors += test_mf_tmp(env_h5_drvr, fapl, TRUE);
+
+    /* For old and new format--free-space merge/shrunk away */
+
+    /* Temporary: modify to skip testing for multi/split driver:
+         fail file create when persisting free-space or using paged aggregation strategy */
+    nerrors += test_mf_fs_gone(env_h5_drvr, fapl, FALSE);
+    nerrors += test_mf_fs_gone(env_h5_drvr, fapl, TRUE);
+
+    /* Temporary: modify to skip testing multi/split driver:
+         fail file create when persisting free-space or using paged aggregation strategy */
+    nerrors += test_mf_strat_thres_gone(env_h5_drvr, fapl, FALSE);
+    nerrors += test_mf_strat_thres_gone(env_h5_drvr, fapl, TRUE);
+
+    /* For old and new format--persisting free-space */
+
+    /* Temporary: Modify to skip testing for multi/split driver:
+         fail file create when persisting free-space or using paged aggregation strategy */
+    nerrors += test_mf_fs_persist(env_h5_drvr, fapl, FALSE);
+    nerrors += test_mf_fs_persist(env_h5_drvr, fapl, TRUE);
+
+    /* Temporary: modify to skip testing for multi/split driver:
+         fail file create when persisting free-space or using paged aggregation strategy */
+    nerrors += test_mf_strat_thres_persist(env_h5_drvr, fapl, FALSE);
+    nerrors += test_mf_strat_thres_persist(env_h5_drvr, fapl, TRUE);
+
+    /* Temporary skipped for multi/split drivers: 
+         fail file create when persisting free-space or using paged aggregation strategy */
+#ifdef PB_OUT
+    /* Tests specific for multi and split files--persisting free-space */
+    nerrors += test_mf_fs_persist_split();
+    nerrors += test_mf_fs_persist_multi();
+#endif
+
+    /* 
+     * Tests specific for file space paging
+     */
+    /* Temporary: The following 7 tests are modified to skip testing for multi/split driver:
+         fail file create when persisting free-space or using paged aggregation strategy */
+    nerrors += test_page_small(env_h5_drvr, fapl);
+    nerrors += test_page_large(env_h5_drvr, fapl);
+    nerrors += test_page_large_try_extend(env_h5_drvr, fapl);
+    nerrors += test_page_small_try_extend(env_h5_drvr, fapl);
+    nerrors += test_page_try_shrink(env_h5_drvr, fapl);
+    nerrors += test_page_alloc_xfree(env_h5_drvr, fapl);        /* can handle multi/split */
+    nerrors += test_page_alignment(env_h5_drvr, fapl);          /* can handle multi/split */
+
+    /* tests for specific bugs */
+    nerrors += test_mf_bug1(env_h5_drvr, fapl);
 
     if(H5Pclose(new_fapl) < 0)
         FAIL_STACK_ERROR
diff --git a/test/mount.c b/test/mount.c
index 2502bbe..d2c0d21 100644
--- a/test/mount.c
+++ b/test/mount.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/mtime.c b/test/mtime.c
index 0c0c923..38e3960 100644
--- a/test/mtime.c
+++ b/test/mtime.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -114,7 +112,7 @@ main(void)
         puts("    Modification times will be mantained in the file but");
         puts("    cannot be queried on this system.  See H5O_mtime_decode().");
         return 0;
-    } else if(HDfabs(HDdifftime(now, oi1.ctime)) > 60.0F) {
+    } else if(HDfabs(HDdifftime(now, oi1.ctime)) > (double)60.0F) {
         H5_FAILED();
         tm = HDlocaltime(&(oi1.ctime));
         HDstrftime((char*)buf1, sizeof buf1, "%Y-%m-%d %H:%M:%S", tm);
diff --git a/test/multi_file_v16-s.h5 b/test/multi_file_v16-s.h5
index 2d4de48..e990e95 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 6b973cd..84f8752 100644
Binary files a/test/noencoder.h5 and b/test/noencoder.h5 differ
diff --git a/test/none.h5 b/test/none.h5
new file mode 100644
index 0000000..bb6ff56
Binary files /dev/null and b/test/none.h5 differ
diff --git a/test/ntypes.c b/test/ntypes.c
index bb6c973..b6f4de7 100644
--- a/test/ntypes.c
+++ b/test/ntypes.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/objcopy.c b/test/objcopy.c
index f4b6a3e..b7f5673 100644
--- a/test/objcopy.c
+++ b/test/objcopy.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -20,8 +18,7 @@
  * Purpose:	Test H5Ocopy().
  */
 
-#include <time.h>
-#include "h5test.h"
+#include "testhdf5.h"
 #include "H5srcdir.h"
 
 /*
@@ -143,9 +140,6 @@ const char *FILENAME[] = {
 #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 */
@@ -169,6 +163,13 @@ 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);
 
+static int
+test_copy_attribute_compound_vlstr(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst_fapl);
+static int
+attach_attribute_compound_vlstr(hid_t loc_id);
+static int
+compare_attribute_compound_vlstr(hid_t loc, hid_t loc2);
+
 

 /*-------------------------------------------------------------------------
  * Function: addr_insert
@@ -548,6 +549,7 @@ done:
     return ret_value;
 } /* end of attach_attribute_vl */
 
+
 

 /*-------------------------------------------------------------------------
  * Function:    test_copy_attach_attributes
@@ -1189,25 +1191,12 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
     size_t elmt_size;                           /* Size of datatype */
     htri_t is_committed;                        /* If the datatype is committed */
     htri_t is_committed2;                       /* If the datatype is committed */
-    int ext_count;                              /* Number of external files in plist */
     int nfilters;                               /* Number of filters applied to dataset */
     hssize_t nelmts;                            /* # of elements in dataspace */
     void *rbuf = NULL;                          /* Buffer for reading raw data */
     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 */
 
@@ -1252,54 +1241,10 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
     /* Open the dataset creation property list for the destination dataset */
     if((dcpl2 = H5Dget_create_plist(did2)) < 0) TEST_ERROR
 
-    /* If external file storage is being used, the value stored in the
-     * dcpl will be a heap ID, which is not guaranteed to be the same in
-     * source and destination files.
-     * Instead, compare the actual external file values and then
-     * delete this property from the dcpls before comparing them.
-     */
-    if((ext_count = H5Pget_external_count(dcpl)) < 0) TEST_ERROR
-
-    if(ext_count > 0)
-    {
-        unsigned x;  /* Counter varaible */
-        char name1[NAME_BUF_SIZE];
-        char name2[NAME_BUF_SIZE];
-        off_t offset1=0;
-        off_t offset2=0;
-        hsize_t size1=0;
-        hsize_t size2=0;
-
-        if(H5Pget_external_count(dcpl2) != ext_count) TEST_ERROR
-
-        /* Ensure that all external file information is the same */
-        for(x=0; x < (unsigned) ext_count; ++x)
-        {
-            if(H5Pget_external(dcpl, x, (size_t)NAME_BUF_SIZE, name1, &offset1, &size1) < 0) TEST_ERROR
-            if(H5Pget_external(dcpl2, x, (size_t)NAME_BUF_SIZE, name2, &offset2, &size2) < 0) TEST_ERROR
-
-            if(offset1 != offset2) TEST_ERROR
-            if(size1 != size2) TEST_ERROR
-            if(HDstrcmp(name1, name2) != 0) TEST_ERROR
-        }
-
-        /* 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
 
-    /* Get the number of filters on dataset */
+    /* Get the number of filters on dataset (for later) */
     if((nfilters = H5Pget_nfilters(dcpl)) < 0) TEST_ERROR
 
     /* close the source dataset creation property list */
@@ -2632,7 +2577,6 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* 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
 
@@ -5589,6 +5533,312 @@ error:
     return 1;
 } /* end test_copy_dataset_simple_empty */
 
+/*-------------------------------------------------------------------------
+ * Function:    attach_attribute_compound_vlstr
+ *
+ * Purpose:     Attach a compound datatype with a variable length string to the object
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Aug 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+attach_attribute_compound_vlstr(hid_t loc_id)
+{
+    hid_t aid = -1; 		/* Attribute ID */
+    hid_t sid = -1; 		/* Dataspace ID */
+    hid_t tid = -1;		/* Datatype ID */
+    hid_t vl_str_tid = -1;	/* Variable length string datatype ID */
+    hid_t cmpd_tid = -1;	/* Compound datatype ID */
+    hsize_t dim1 = 1;		/* Dimension size */
+    typedef struct { 		/* Compound structure for the attribute */
+        int i;
+        char *v;
+    } s1;
+    s1 buf;                     /* Buffer */
+    int ret_value = -1;		/* Return value */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(1, &dim1, NULL)) < 0 )
+        goto done;
+
+    /* Create an integer datatype */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto done;
+
+    /* Create a variable length string */
+    if((vl_str_tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto done;
+    if(H5Tset_size(vl_str_tid, H5T_VARIABLE) < 0)
+        goto done;
+
+    /* Create a compound datatype with a variable length string and an integer */
+    if((cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1))) < 0)
+        goto done;
+    if(H5Tinsert(cmpd_tid, "i", HOFFSET(s1, i), tid) < 0)
+        goto done;
+    if(H5Tinsert(cmpd_tid, "v", HOFFSET(s1, v), vl_str_tid) < 0)
+        goto done;
+
+    /* Attach an attribute to the object */
+    if((aid = H5Acreate2(loc_id, "attr_cmpd_vlstr", cmpd_tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto done;
+
+    /* Write to the attribute */
+    buf.i = 9;
+    buf.v = "ThisIsAString";
+    if(H5Awrite(aid, cmpd_tid, &buf) < 0)
+        goto done;
+
+    ret_value = 0;
+
+done:
+    if(sid > 0)
+        H5Sclose(sid);
+    if(tid > 0)
+        H5Tclose(tid);
+    if(vl_str_tid > 0)
+        H5Tclose(vl_str_tid);
+    if(cmpd_tid > 0)
+        H5Tclose(cmpd_tid);
+    if(aid > 0)
+        H5Aclose(aid);
+    return ret_value;
+} /* attach_attribute_compound_vlstr */
+
+/*-------------------------------------------------------------------------
+ * Function:    compare_attribute_compound_vlstr
+ *
+ * Purpose:     Compare data of the attributes attached to the two objects.
+ *		The attribute is a  compound datatype with a variable length string.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Aug 2016
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+compare_attribute_compound_vlstr(hid_t loc, hid_t loc2)
+{
+    hid_t aid = -1, aid2 = -1;	/* Attribute IDs */
+    hid_t tid = -1, tid2 = -1;	/* Datatype IDs */
+    typedef struct {		/* Compound structure for the attribute */
+	int i;
+	char *v;
+    } s1;
+    s1 rbuf;			/* Buffer for data read */
+    s1 rbuf2;			/* Buffer for data read */
+    
+    /* Open the attributes attached to the objects */
+    if((aid = H5Aopen_by_idx(loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR	
+    if((aid2 = H5Aopen_by_idx(loc2, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR	
+
+    /* Get the attributes' datatypes */
+    if((tid = H5Aget_type(aid)) < 0) 
+	FAIL_STACK_ERROR	
+    if((tid2 = H5Aget_type(aid2)) < 0)
+	FAIL_STACK_ERROR	
+
+    /* Read the attributes */
+    if(H5Aread(aid, tid, &rbuf) < 0)
+	FAIL_STACK_ERROR	
+    if(H5Aread(aid2, tid2, &rbuf2) < 0)
+	FAIL_STACK_ERROR
+
+    /* Compare the attributes' data */
+    if(rbuf.i != rbuf2.i)
+	FAIL_STACK_ERROR
+    if(HDstrlen(rbuf.v) != HDstrlen(rbuf2.v)) 
+	FAIL_STACK_ERROR
+    if(HDmemcmp(rbuf.v, rbuf2.v, HDstrlen(rbuf.v))) 
+	FAIL_STACK_ERROR
+
+    /* Close the attributes */
+    if(H5Aclose(aid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Aclose(aid2) < 0)
+	FAIL_STACK_ERROR
+    return TRUE;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Aclose(aid);
+        H5Aclose(aid2);
+        H5Tclose(tid);
+        H5Tclose(tid2);
+    } H5E_END_TRY;
+    return FALSE;
+
+} /* compare_attribute_compound_vlstr() */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_copy_attribute_compound_vlstr
+ *
+ * Purpose:     Create a simple dataset and a group in SRC file.
+ *		Both has an attribute with a compound datatype consisting
+ *              of a variable length string
+ *              Copy the dataset and the group to DST file
+ *		This is for HDFFV-7991
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_copy_attribute_compound_vlstr(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 sid = -1;                             /* Dataspace ID */
+    hid_t did = -1, did2 = -1;                  /* Dataset IDs */
+    hid_t aid = -1, aid2 = -1;                  /* Attribute IDs */
+    hid_t gid = -1, gid2 = -1;			/* Group IDs */
+    hsize_t dim2d[2];                           /* Dataset dimensions */
+    char src_filename[NAME_BUF_SIZE];		/* Source file name */
+    char dst_filename[NAME_BUF_SIZE];		/* Destination file name */
+
+    TESTING("H5Ocopy(): attribute with compound datatype consisting of variable length string");
+
+    /* 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)
+	FAIL_STACK_ERROR
+
+    /* set dataspace dimensions */
+    dim2d[0] = DIM_SIZE_1;
+    dim2d[1] = DIM_SIZE_2;
+
+    /* create 2D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0)
+	FAIL_STACK_ERROR
+
+    /* create 2D int dataset at SRC file */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_SIMPLE, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR
+
+    /* attach an attribute to the dataset */
+    if(attach_attribute_compound_vlstr(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* create a group */
+    if((gid = H5Gcreate2(fid_src, NAME_GROUP_EMPTY, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* attach attribute to the group */
+    if(attach_attribute_compound_vlstr(gid) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the group */
+    if(H5Gclose(gid) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the SRC file */
+    if(H5Fclose(fid_src) < 0)
+	FAIL_STACK_ERROR
+
+
+    /* open the source file with read-only */
+    if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, src_fapl)) < 0)
+	FAIL_STACK_ERROR
+
+    /* create destination file */
+    if((fid_dst = H5Fcreate(dst_filename, H5F_ACC_TRUNC, fcpl_dst, dst_fapl)) < 0)
+	FAIL_STACK_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)
+	FAIL_STACK_ERROR
+
+    /* copy the dataset from SRC to DST */
+    if(H5Ocopy(fid_src, NAME_DATASET_SIMPLE, fid_dst, NAME_DATASET_SIMPLE, H5P_DEFAULT, H5P_DEFAULT) < 0)
+	FAIL_STACK_ERROR
+
+    /* open the src dataset */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_SIMPLE, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_SIMPLE, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* compare the data of the attributes attached to the two datasets */
+    if(compare_attribute_compound_vlstr(did, did2) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the datasets */
+    if(H5Dclose(did2) < 0)
+	FAIL_STACK_ERROR
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* Copy the group */
+    if(H5Ocopy(fid_src, NAME_GROUP_EMPTY, fid_dst, NAME_GROUP_EMPTY, H5P_DEFAULT, H5P_DEFAULT) < 0)
+	FAIL_STACK_ERROR
+
+    /* Open the src group */
+    if((gid = H5Gopen2(fid_src, NAME_GROUP_EMPTY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+    /* Open the destination group */
+    if((gid2 = H5Gopen2(fid_dst, NAME_GROUP_EMPTY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* compare the data of the attributes attached to the two groups */
+    if(compare_attribute_compound_vlstr(gid, gid2) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the groups */
+    if(H5Gclose(gid) < 0) 
+	FAIL_STACK_ERROR
+    if(H5Gclose(gid2) < 0) 
+	FAIL_STACK_ERROR
+
+    /* close the SRC file */
+    if(H5Fclose(fid_src) < 0)
+	FAIL_STACK_ERROR
+
+    /* close the DST file */
+    if(H5Fclose(fid_dst) < 0)
+	FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Aclose(aid2);
+        H5Aclose(aid);
+    	H5Dclose(did2);
+    	H5Dclose(did);
+    	H5Gclose(gid);
+    	H5Gclose(gid2);
+    	H5Sclose(sid);
+    	H5Fclose(fid_dst);
+    	H5Fclose(fid_src);
+    } H5E_END_TRY;
+    return 1;
+} /* end test_copy_attribute_compound_vlstr() */
+
 

 /*-------------------------------------------------------------------------
  * Function:    test_copy_dataset_compressed_vl
@@ -6948,7 +7198,7 @@ test_copy_ext_link(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst_fap
     if(H5Gclose(gid) < 0) TEST_ERROR
 
     /* create file to hold external links to the src file */
-    if((fid_ext = H5Fcreate(ext_filename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0) TEST_ERROR
+    if((fid_ext = H5Fcreate(ext_filename, H5F_ACC_TRUNC, fcpl_src, src_fapl)) < 0) TEST_ERROR
 
     /* create group in the file that will hold the external link */
     if((gid = H5Gcreate2(fid_ext, NAME_GROUP_LINK, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -13060,11 +13310,9 @@ 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];
@@ -13113,18 +13361,6 @@ 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 
      */
@@ -13139,7 +13375,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, ocpl, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13154,7 +13390,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, ocpl, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13181,7 +13417,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, ocpl, newbuf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, newbuf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in SRC file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13195,7 +13431,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, ocpl, newbuf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, newbuf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13235,7 +13471,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, ocpl, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in SRC file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13250,7 +13486,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, ocpl, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -13285,7 +13521,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, ocpl, -1, 0) != TRUE) TEST_ERROR
+    if(compare_groups(gid, gid2, H5P_DEFAULT, -1, 0) != TRUE) TEST_ERROR
 
     /* close the DST dataset */
     if(H5Gclose(gid2) < 0) TEST_ERROR
@@ -13300,7 +13536,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, ocpl, -1, 0) != TRUE) TEST_ERROR
+    if(compare_groups(gid, gid2, H5P_DEFAULT, -1, 0) != TRUE) TEST_ERROR
 
     /* close the group in DST file */
     if(H5Gclose(gid2) < 0) TEST_ERROR
@@ -13314,9 +13550,6 @@ 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
 
@@ -13333,7 +13566,6 @@ error:
     	H5Sclose(sid);
     	H5Gclose(gid);
     	H5Gclose(gid2);
-        H5Pclose(ocpl);
     	H5Fclose(fid_dst);
     	H5Fclose(fid_src);
     } H5E_END_TRY;
@@ -13519,6 +13751,7 @@ 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) {
@@ -13558,6 +13791,7 @@ main(void)
             nerrors += test_copy_dataset_compact_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_dataset_compressed_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_attribute_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
+            nerrors += test_copy_attribute_compound_vlstr(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_dataset_compact_named_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_dataset_contig_named_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_dataset_chunked_named_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
@@ -13575,6 +13809,7 @@ main(void)
             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);
 */
@@ -13590,18 +13825,31 @@ main(void)
     if(nerrors) {
         printf("***** %d OBJECT COPY TEST%s FAILED! *****\n",
                 nerrors, (1 == nerrors ? "" : "S"));
-        exit(1);
+        exit(EXIT_FAILURE);
     } /* end if */
 
     puts ("All object copying tests passed.");
 
-    /* call H5Pclose(fapl2) to mask property list management bug.
+    /* close property list.
+     * NOTE: if this property list is not closed and the test is
+     *          run with the split or multi driver, an interesting
+     *          problem is exposed in the property list shutdown code.
+     *
+     *          Namely, since the split/multi driver copies property
+     *          lists for internal use, there's a (high) chance that
+     *          leaving the FAPL open and having the library's shutdown
+     *          code close it will cause the underlying property lists
+     *          to be cleaned up first, causing the actual property list
+     *          close operation to fail (since it won't be able to close
+     *          the already closed underlying property list).
+     *
+     *          The could be addressed by converting the split/multi to
+     *          use non-public API routines, or putting some way into the
+     *          public H5I routines to indicate ordering at shutdown.
      *
-     * Needless to say, this bug must be fixed properly, but we 
-     * will sweep it under the rug for now.
+     *          For now, we just make certain to close the property list.
+     *          (QAK - 2016/04/06)
      *
-     * To expose the bug, delete this call, and run with either split
-     * or multi file driver.
      */
     H5Pclose(fapl2);
 
diff --git a/test/ohdr.c b/test/ohdr.c
index 0da6181..faec835 100644
--- a/test/ohdr.c
+++ b/test/ohdr.c
@@ -5,20 +5,18 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Robb Matzke <matzke at llnl.gov>
  *              Tuesday, November 24, 1998
  */
 #include "h5test.h"
-#include "H5srcdir.h"
 #include "H5Iprivate.h"
+
 /*
  * This file needs to access private datatypes from the H5O package.
  * This file also needs to access the object header testing code.
@@ -136,9 +134,9 @@ test_cont(char *filename, hid_t fapl)
     if(hdr_info.nchunks >= nchunks)
         TEST_ERROR
 
-    if(H5O_close(&oh_locA) < 0)
+    if(H5O_close(&oh_locA, NULL) < 0)
         FAIL_STACK_ERROR
-    if(H5O_close(&oh_locB) < 0)
+    if(H5O_close(&oh_locB, NULL) < 0)
         FAIL_STACK_ERROR
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
@@ -150,8 +148,8 @@ test_cont(char *filename, hid_t fapl)
 
 error:
     H5E_BEGIN_TRY {
-        H5O_close(&oh_locA);
-        H5O_close(&oh_locB);
+        H5O_close(&oh_locA, NULL);
+        H5O_close(&oh_locB, NULL);
         H5Fclose(file);
     } H5E_END_TRY;
 
@@ -205,7 +203,7 @@ test_ohdr_cache(char *filename, hid_t fapl)
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, my_fapl)) < 0)
         FAIL_STACK_ERROR
     if(H5Pclose(my_fapl) < 0)
-	FAIL_STACK_ERROR
+        FAIL_STACK_ERROR
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
     if(H5AC_ignore_tags(f) < 0)
@@ -277,7 +275,7 @@ test_ohdr_cache(char *filename, hid_t fapl)
         FAIL_STACK_ERROR
 
     /* Close object header created */
-    if(H5O_close(&oh_loc) < 0)
+    if(H5O_close(&oh_loc, NULL) < 0)
         FAIL_STACK_ERROR
 
     /* Unprotect local heap (which actually unpins it from the cache) */
@@ -304,8 +302,9 @@ error:
 /*
  *  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.
+ *  H5O_SPEC_READ_SIZE (512, currently)  bytes for decoding, then reads the
+ *  remaining bytes later if the object header is greater than H5O_SPEC_READ_SIZE
+ *  bytes.  For SWMR access, the read should be done all at one time.
  */
 static herr_t
 test_ohdr_swmr(hbool_t new_format)
@@ -340,10 +339,11 @@ test_ohdr_swmr(hbool_t new_format)
 
         if((fid = H5Fcreate(FILE_OHDR_SWMR, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
             TEST_ERROR
-        } else {
+    } /* end if */
+    else {
         if((fid = H5Fcreate(FILE_OHDR_SWMR, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
             TEST_ERROR
-    } /* end if */
+    } /* end else */
 
     /* Initialize data */
     wbuf = (int *)HDcalloc(compact_size, sizeof(int));
@@ -395,9 +395,9 @@ test_ohdr_swmr(hbool_t new_format)
     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 */
+    /* The size of object header should be greater than the speculative read size of H5O_SPEC_READ_SIZE */
     /* This will exercise the coding for the re-read of the object header for SWMR access */
-    if(obj_info.hdr.space.total < 512)
+    if(obj_info.hdr.space.total < H5O_SPEC_READ_SIZE)
         TEST_ERROR;
 
     /* Close the dataset */
@@ -472,8 +472,8 @@ test_unknown(unsigned bogus_id, char *filename, hid_t fapl)
     hid_t loc_bogus = -1;	/* location: bogus file or group ID */
     char testfile[256];
 
-    /* create a different name for a local copy of the data file to be 
-       opened with rd/wr file permissions in case build and test are 
+    /* create a different name for a local copy of the data file to be
+       opened with rd/wr file permissions in case build and test are
        done in the source directory. */
     HDstrncpy(testfile, FILE_BOGUS, strlen(FILE_BOGUS));
     testfile[strlen(FILE_BOGUS)]='\0';
@@ -755,13 +755,11 @@ int
 main(void)
 {
     hid_t	fapl = -1, file = -1;
-    hid_t	dset = -1;
     H5F_t	*f = NULL;
     char	filename[1024];
     H5O_hdr_info_t hdr_info;            /* Object info */
-    H5O_loc_t	oh_loc, oh_loc2;        /* Object header locations */
+    H5O_loc_t	oh_loc;                 /* Object header locations */
     time_t	time_new, ro;
-    int         chunkno;                /* Chunk index for message */
     int		i;                      /* Local index variable */
     unsigned    b;                      /* Index for "new format" loop */
     herr_t      ret;                    /* Generic return value */
@@ -882,7 +880,7 @@ main(void)
          *  works correctly - QAK)
          */
         TESTING("close & re-open object header");
-        if(H5O_close(&oh_loc) < 0)
+        if(H5O_close(&oh_loc, NULL) < 0)
             FAIL_STACK_ERROR
         if(H5Fclose(file) < 0)
             FAIL_STACK_ERROR
@@ -957,150 +955,8 @@ main(void)
 
         /* release resources */
         TESTING("object header closing");
-        if(H5O_close(&oh_loc) < 0)
-            FAIL_STACK_ERROR
-        PASSED();
-
-        /*
-         * Test moving message to first chunk
-         */
-        TESTING("locking messages");
-        HDmemset(&oh_loc, 0, sizeof(oh_loc));
-        if(H5O_create(f, H5AC_ind_read_dxpl_id, (size_t)64, (size_t)0, H5P_GROUP_CREATE_DEFAULT, &oh_loc/*out*/) < 0)
+        if(H5O_close(&oh_loc, NULL) < 0)
             FAIL_STACK_ERROR
-        if(1 != H5O_link(&oh_loc, 1, H5AC_ind_read_dxpl_id))
-            FAIL_STACK_ERROR
-
-        /* Create second object header, to guarantee that first object header uses multiple chunks */
-        HDmemset(&oh_loc2, 0, sizeof(oh_loc2));
-        if(H5O_create(f, H5AC_ind_read_dxpl_id, (size_t)64, (size_t)0, H5P_GROUP_CREATE_DEFAULT, &oh_loc2/*out*/) < 0)
-            FAIL_STACK_ERROR
-        if(1 != H5O_link(&oh_loc2, 1, H5AC_ind_read_dxpl_id))
-            FAIL_STACK_ERROR
-
-        /* Fill object header with messages, creating multiple chunks */
-        for(i = 0; i < 10; i++) {
-            time_new = (i + 1) * 1000 + 10;
-            if(H5O_msg_create(&oh_loc, H5O_MTIME_NEW_ID, 0, 0, &time_new, H5AC_ind_read_dxpl_id) < 0)
-                FAIL_STACK_ERROR
-        } /* end for */
-
-        /* Get # of object header chunks */
-        if(H5O_get_hdr_info(&oh_loc, H5AC_ind_read_dxpl_id, &hdr_info) < 0)
-            FAIL_STACK_ERROR
-        if(hdr_info.nchunks != 2)
-            TEST_ERROR
-
-        /* Add message to lock to object header */
-        time_new = 11111111;
-        if(H5O_msg_create(&oh_loc, H5O_MTIME_ID, 0, 0, &time_new, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Verify chunk index for message */
-        if((chunkno = H5O_msg_get_chunkno(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id)) < 0)
-            FAIL_STACK_ERROR
-        if(chunkno != 1)
-            TEST_ERROR
-
-        /* Lock the message into the chunk */
-        if(H5O_msg_lock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Attempt to lock the message twice */
-        H5E_BEGIN_TRY {
-            ret = H5O_msg_lock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id);
-        } H5E_END_TRY;
-        if(ret >= 0)
-            TEST_ERROR
-
-        /* Delete all the other messages, which would move the message into
-         * chunk #0, if it wasn't locked
-         */
-        if(H5O_msg_remove(&oh_loc, H5O_MTIME_NEW_ID, H5O_ALL, TRUE, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Verify chunk index for message */
-        if((chunkno = H5O_msg_get_chunkno(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id)) < 0)
-            FAIL_STACK_ERROR
-        if(chunkno != 1)
-            TEST_ERROR
-
-        /* Unlock the message */
-        if(H5O_msg_unlock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Attempt to unlock the message twice */
-        H5E_BEGIN_TRY {
-            ret = H5O_msg_unlock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id);
-        } H5E_END_TRY;
-        if(ret >= 0)
-            TEST_ERROR
-
-        /* Close object headers */
-        if(H5O_close(&oh_loc2) < 0)
-            FAIL_STACK_ERROR
-        if(H5O_close(&oh_loc) < 0)
-            FAIL_STACK_ERROR
-
-        /* Open first object header */
-        HDmemset(&oh_loc, 0, sizeof(oh_loc));
-        if(H5O_create(f, H5AC_ind_read_dxpl_id, (size_t)64, (size_t)0, H5P_GROUP_CREATE_DEFAULT, &oh_loc/*out*/) < 0)
-            FAIL_STACK_ERROR
-        if(1 != H5O_link(&oh_loc, 1, H5AC_ind_read_dxpl_id))
-            FAIL_STACK_ERROR
-
-        /* Create second object header, to guarantee that first object header uses multiple chunks */
-        HDmemset(&oh_loc2, 0, sizeof(oh_loc2));
-        if(H5O_create(f, H5AC_ind_read_dxpl_id, (size_t)64, (size_t)0, H5P_GROUP_CREATE_DEFAULT, &oh_loc2/*out*/) < 0)
-            FAIL_STACK_ERROR
-        if(1 != H5O_link(&oh_loc2, 1, H5AC_ind_read_dxpl_id))
-            FAIL_STACK_ERROR
-
-        /* Add message to move to object header */
-        time_new = 11111111;
-        if(H5O_msg_create(&oh_loc, H5O_MTIME_ID, 0, 0, &time_new, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Verify chunk index for message */
-        if((chunkno = H5O_msg_get_chunkno(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id)) < 0)
-            FAIL_STACK_ERROR
-        if(chunkno != 0)
-            TEST_ERROR
-
-        /* Lock the message into the chunk */
-        if(H5O_msg_lock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Fill object header with messages, creating multiple chunks */
-        /* (would normally move locked message to new chunk) */
-        for(i = 0; i < 10; i++) {
-            time_new = (i + 1) * 1000 + 10;
-            if(H5O_msg_create(&oh_loc, H5O_MTIME_NEW_ID, 0, 0, &time_new, H5AC_ind_read_dxpl_id) < 0)
-                FAIL_STACK_ERROR
-        } /* end for */
-
-        /* Get # of object header chunks */
-        if(H5O_get_hdr_info(&oh_loc, H5AC_ind_read_dxpl_id, &hdr_info) < 0)
-            FAIL_STACK_ERROR
-        if(hdr_info.nchunks != 2)
-            TEST_ERROR
-
-        /* Verify chunk index for message */
-        if((chunkno = H5O_msg_get_chunkno(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id)) < 0)
-            FAIL_STACK_ERROR
-        if(chunkno != 0)
-            TEST_ERROR
-
-        /* Unlock the message */
-        if(H5O_msg_unlock(&oh_loc, H5O_MTIME_ID, H5AC_ind_read_dxpl_id) < 0)
-            FAIL_STACK_ERROR
-
-        /* Close object headers */
-        if(H5O_close(&oh_loc2) < 0)
-            FAIL_STACK_ERROR
-        if(H5O_close(&oh_loc) < 0)
-            FAIL_STACK_ERROR
-
         PASSED();
 
         /* Close the file we created */
diff --git a/test/page_buffer.c b/test/page_buffer.c
new file mode 100644
index 0000000..853ef93
--- /dev/null
+++ b/test/page_buffer.c
@@ -0,0 +1,2206 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/***********************************************************
+*
+* Test program:	 cache_page_buffer
+*
+* Tests the Page Buffer Feature.
+*
+*************************************************************/
+
+#include "h5test.h"
+
+#include "H5PBprivate.h"
+#include "H5Iprivate.h"
+
+/*
+ * This file needs to access private information from the H5F package.
+ */
+#define H5MF_FRIEND		/*suppress error about including H5MFpkg	  */
+#include "H5MFpkg.h"
+
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5F_TESTING
+#include "H5Fpkg.h"
+
+
+#define FILENAME_LEN		1024
+#define NUM_DSETS               5
+#define NX                      100
+#define NY                      50
+
+/* helper routines */
+static unsigned create_file(char *filename, hid_t fcpl, hid_t fapl);
+static unsigned open_file(char *filename, hid_t fapl, hsize_t page_size, size_t page_buffer_size);
+
+/* test routines */
+static unsigned test_args(hid_t fapl, const char *env_h5_drvr);
+static unsigned test_raw_data_handling(hid_t orig_fapl, const char *env_h5_drvr);
+static unsigned test_lru_processing(hid_t orig_fapl, const char *env_h5_drvr);
+static unsigned test_min_threshold(hid_t orig_fapl, const char *env_h5_drvr);
+static unsigned test_stats_collection(hid_t orig_fapl, const char *env_h5_drvr);
+#ifdef H5_HAVE_PARALLEL
+static unsigned verify_page_buffering_disabled(hid_t orig_fapl, 
+    const char *env_h5_drvr);
+#endif /* H5_HAVE_PARALLEL */
+
+const char *FILENAME[] = {
+    "filepaged",
+    NULL
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_file()
+ *
+ * Purpose:     The purpose of this function appears to be a smoke check
+ *              intended to exercise the page buffer.
+ *
+ *              Specifically, the function creates a file, and then goes 
+ *              through a loop in which it creates four data sets, write 
+ *              data to one of them, verifies the data written, and then 
+ *              deletes the three that it didn't write to.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+create_file(char *filename, hid_t fcpl, hid_t fapl)
+{
+    hid_t       file_id = -1;
+    hid_t       dset_id = -1;
+    hid_t       grp_id = -1;
+    hid_t       filespace = -1;
+    hsize_t     dimsf[2] = {NX, NY};       /* dataset dimensions */
+    int         *data = NULL;                     /* pointer to data buffer to write */
+    hid_t       dcpl = -1;
+    int         i;
+    int         num_elements;
+    int         j;
+    char        dset_name[10];
+
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    if((grp_id = H5Gcreate2(file_id, "GROUP", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    num_elements  = NX * NY;
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR
+    for (i=0; i < (int)num_elements; i++)
+        data[i] = i;
+
+    if((filespace = H5Screate_simple(2, dimsf, NULL)) < 0)
+        FAIL_STACK_ERROR;
+
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+       FAIL_STACK_ERROR;
+    if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+        FAIL_STACK_ERROR;
+
+    for(i=0 ; i<NUM_DSETS; i++) {
+
+        HDsprintf(dset_name, "D1dset%d", i);
+        if((dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, filespace,
+                                 H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        HDsprintf(dset_name, "D2dset%d", i);
+        if((dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, filespace,
+                                 H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        HDsprintf(dset_name, "D3dset%d", i);
+        if((dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, filespace,
+                                 H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        HDsprintf(dset_name, "dset%d", i);
+        if((dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, filespace,
+                                 H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;
+
+        if(H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        HDmemset(data, 0, (size_t)num_elements * sizeof(int));
+        if((dset_id = H5Dopen2(grp_id, dset_name, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;        
+        if(H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        for (j=0; j < num_elements; j++) {
+            if(data[j] != j) {
+                HDfprintf(stderr, "Read different values than written\n");
+                FAIL_STACK_ERROR;
+            }
+        }
+
+        HDsprintf(dset_name, "D1dset%d", i);
+        if(H5Ldelete(grp_id, dset_name, H5P_DEFAULT) < 0)
+            FAIL_STACK_ERROR;
+        HDsprintf(dset_name, "D2dset%d", i);
+        if(H5Ldelete(grp_id, dset_name, H5P_DEFAULT) < 0)
+            FAIL_STACK_ERROR;
+        HDsprintf(dset_name, "D3dset%d", i);
+        if(H5Ldelete(grp_id, dset_name, H5P_DEFAULT) < 0)
+            FAIL_STACK_ERROR;
+    }
+
+    if(H5Gclose(grp_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(filespace) < 0)
+        FAIL_STACK_ERROR;
+
+    HDfree(data);
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(filespace);
+        H5Gclose(grp_id);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+    return(1);
+} /* create_file */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_file()
+ *
+ * Purpose:     The purpose of this function appears to be a smoke check
+ *              intended to exercise the page buffer.
+ *
+ *              Specifically, the function opens a file (created by 
+ *              create_file()?), and verify the contents of its datasets.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+open_file(char *filename, hid_t fapl, hsize_t page_size, 
+    size_t page_buffer_size)
+{
+    hid_t       file_id = -1;
+    hid_t       dset_id = -1;
+    hid_t       grp_id = -1;
+    int         *data = NULL;                    /* pointer to data buffer to write */
+    int         i;
+    int         j;
+    int         num_elements;
+    char        dset_name[10];
+    H5F_t       *f = NULL;
+
+    if((file_id = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf == NULL)
+        FAIL_STACK_ERROR;
+    if(f->shared->page_buf->page_size != page_size)
+        FAIL_STACK_ERROR;
+    if(f->shared->page_buf->max_size != page_buffer_size)
+        FAIL_STACK_ERROR;
+
+    if((grp_id = H5Gopen2(file_id, "GROUP", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    num_elements  = NX * NY;
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR
+
+    for(i=0 ; i<NUM_DSETS; i++) {
+
+        HDsprintf(dset_name, "dset%d", i);
+        if((dset_id = H5Dopen2(grp_id, dset_name, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR;
+
+        if(H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+            FAIL_STACK_ERROR;
+
+        if(H5Dclose(dset_id) < 0)
+            FAIL_STACK_ERROR;
+
+        for (j=0; j < num_elements; j++) {
+            if(data[j] != j) {
+                HDfprintf(stderr, "Read different values than written\n");
+                FAIL_STACK_ERROR;
+            }
+        }
+    }
+
+    if(H5Gclose(grp_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+    HDfree(data);
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Gclose(grp_id);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+    return 1;
+}
+
+/*
+ *
+ *  set_multi_split():
+ *      Internal routine to set up page-aligned address space for multi/split driver
+ *      when testing paged aggregation.
+ *
+ */
+static unsigned
+set_multi_split(const char *env_h5_drvr, hid_t fapl, hsize_t pagesize)
+{
+    hbool_t split = FALSE;
+    hbool_t multi = FALSE;
+    H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+    hid_t memb_fapl_arr[H5FD_MEM_NTYPES];
+    char *memb_name[H5FD_MEM_NTYPES];
+    haddr_t memb_addr[H5FD_MEM_NTYPES];
+    hbool_t relax;
+    H5FD_mem_t  mt;
+
+    /* Check for split or multi driver */
+    if(!HDstrcmp(env_h5_drvr, "split"))
+        split = TRUE;
+    else if(!HDstrcmp(env_h5_drvr, "multi"))
+        multi = TRUE;
+
+    if(split || multi) {
+
+        HDmemset(memb_name, 0, sizeof memb_name);
+
+        /* Get current split settings */
+        if(H5Pget_fapl_multi(fapl, memb_map, memb_fapl_arr, memb_name, memb_addr, &relax) < 0)
+            TEST_ERROR
+
+        if(split) {
+            /* Set memb_addr aligned */
+            memb_addr[H5FD_MEM_SUPER] = ((memb_addr[H5FD_MEM_SUPER] + pagesize - 1) / pagesize) * pagesize;
+            memb_addr[H5FD_MEM_DRAW] = ((memb_addr[H5FD_MEM_DRAW] + pagesize - 1) / pagesize) * pagesize;
+        } else {
+            /* Set memb_addr aligned */
+            for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+                memb_addr[mt] = ((memb_addr[mt] + pagesize - 1) / pagesize) * pagesize;
+        } /* end else */
+
+        /* Set multi driver with new FAPLs */
+        if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+            TEST_ERROR
+
+        /* Free memb_name */
+        for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+            free(memb_name[mt]);
+
+    } /* end if */
+
+    return 0;
+
+error:
+    return 1;
+
+} /* set_multi_split() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_args()
+ *
+ * Purpose:     This test appears to be a quick smoke check directed at:
+ *
+ *              1) verifying that API errors are caught.
+ *
+ *              2) verifying that the page buffer behaves more or less 
+ *                 as advertized.
+ *
+ *              Any data mis-matches or unexpected failures or successes
+ *              reported by the HDF5 library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_args(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+    herr_t ret;
+
+    TESTING("Settings for Page Buffering");
+
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0) TEST_ERROR
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        TEST_ERROR;
+
+
+    /* Test setting a page buffer without Paged Aggregation enabled - 
+     * should fail 
+     */
+    if(H5Pset_page_buffer_size(fapl, 512, 0, 0) < 0)
+        TEST_ERROR;
+
+    H5E_BEGIN_TRY {
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+
+    if(file_id >= 0)
+        TEST_ERROR;
+
+
+    /* Test setting a page buffer with a size smaller than a single 
+     * page size - should fail 
+     */
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 512) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_page_buffer_size(fapl, 511, 0, 0) < 0)
+        TEST_ERROR;
+
+    H5E_BEGIN_TRY {
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+
+    if(file_id >= 0)
+        TEST_ERROR;
+
+
+    /* Test setting a page buffer with sum of min meta and raw 
+     * data percentage > 100 - should fail 
+     */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_page_buffer_size(fapl, 512, 50, 51);
+    } H5E_END_TRY;
+
+    if(ret >= 0)
+        TEST_ERROR;
+
+    if(set_multi_split(env_h5_drvr, fapl, 512)  != 0)
+        TEST_ERROR;
+
+    /* Test setting a page buffer with a size equal to a single page size */
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 512) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_page_buffer_size(fapl, 512, 0, 0) < 0)
+        TEST_ERROR;
+
+    if(create_file(filename, fcpl, fapl) != 0)
+        TEST_ERROR;
+
+    if(open_file(filename, fapl, 512, 512) != 0)
+        TEST_ERROR;
+
+
+    /* Test setting a page buffer with a size slightly larger than a 
+     * single page size 
+     */
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 512) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_page_buffer_size(fapl, 513, 0, 0) < 0)
+        TEST_ERROR;
+
+    if(create_file(filename, fcpl, fapl) != 0)
+        TEST_ERROR;
+
+    if(open_file(filename, fapl, 512, 512) != 0)
+        TEST_ERROR;
+
+    if(set_multi_split(env_h5_drvr, fapl, 4194304)  != 0)
+        TEST_ERROR;
+
+
+    /* Test setting a large page buffer size and page size */
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 4194304) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_page_buffer_size(fapl, 16777216, 0, 0) < 0)
+        TEST_ERROR;
+
+    if(create_file(filename, fcpl, fapl) != 0)
+        TEST_ERROR;
+
+    if(open_file(filename, fapl, 4194304, 16777216) != 0)
+        TEST_ERROR;
+
+    if(set_multi_split(env_h5_drvr, fapl, 1)  != 0)
+        TEST_ERROR;
+
+
+    /* Test setting a 512 byte page buffer size and page size */
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 512) < 0)
+        TEST_ERROR;
+    if(H5Pset_page_buffer_size(fapl, 512, 0, 0) < 0)
+        TEST_ERROR;
+    if(create_file(filename, fcpl, fapl) != 0)
+        TEST_ERROR;
+    if(open_file(filename, fapl, 512, 512) != 0)
+        TEST_ERROR;
+
+
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED()
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+    return 1;
+} /* test_args */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_raw_data_handling()
+ *
+ * Purpose:     The purpose of this function appears to be a smoke check
+ *              of raw data reads and writes via the page buffer.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *              
+ * Changes:     Added base_page_cnt field as supporting code.  This allows
+ *              the test to adjust to the number of page buffer pages
+ *              accessed during file open / create.
+ *
+ *              The test for the value of base_page_cnt just after file 
+ *              open exists detect changes in library behavior.  Assuming
+ *              any such change is not indicative of other issues, these 
+ *              tests can be modified to reflect the change.
+ *
+ *                                                    JRM -- 2/23/17
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/* Changes due to file space page size has a minimum size of 512 */
+static unsigned
+test_raw_data_handling(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+    H5FD_io_info_t fdio_info;
+    H5P_genplist_t *meta_plist = (H5P_genplist_t *)H5I_object(H5AC_ind_read_dxpl_id);
+    H5P_genplist_t *raw_plist = (H5P_genplist_t *)H5I_object(H5AC_rawdata_dxpl_id);
+    size_t base_page_cnt;
+    size_t page_count = 0;
+    int i, num_elements = 2000;
+    haddr_t addr = HADDR_UNDEF;
+    int *data = NULL;
+    H5F_t *f = NULL;
+
+    TESTING("Raw Data Handling");
+
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0)
+        TEST_ERROR
+
+    if(set_multi_split(env_h5_drvr, fapl, sizeof(int)*200)  != 0)
+        TEST_ERROR;
+
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR;
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        TEST_ERROR;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+    if(H5Pset_file_space_page_size(fcpl, sizeof(int)*200) < 0)
+        TEST_ERROR;
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*2000, 0, 0) < 0)
+        TEST_ERROR;
+
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     * Get the number of pages inserted, and verify that it is the 
+     * the expected value.
+     */
+    base_page_cnt = H5SL_count(f->shared->page_buf->slist_ptr);
+    if(base_page_cnt != 1)
+        TEST_ERROR;
+
+    /* allocate space for a 2000 elements */
+    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* update the first 50 elements to have values 0-49 - this will be
+       a page buffer update with 1 page resulting in the page
+       buffer. */
+    /* Changes: 100 */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count ++;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* update elements 300 - 450, with values 300 -  - this will
+       bring two more pages into the page buffer. */
+    for(i=0 ; i<150 ; i++)
+        data[i] = i+300;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*300), sizeof(int)*150, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    page_count += 2;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* update elements 100 - 300, this will go to disk but also update
+       existing pages in the page buffer. */
+    for(i=0 ; i<200 ; i++)
+        data[i] = i+100;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*100), sizeof(int)*200, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* Update elements 225-300 - this will update an existing page in the PB */
+    /* Changes: 450 - 600; 150 */
+    for(i=0 ; i<150 ; i++)
+        data[i] = i+450;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*450), sizeof(int)*150, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* Do a full page write to block 600-800 - should bypass the PB */
+    for(i=0 ; i<200 ; i++)
+        data[i] = i+600;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*600), sizeof(int)*200, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* read elements 800 - 1200, this should not affect the PB, and should read -1s */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr+(sizeof(int)*800), sizeof(int)*400, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    for (i=0; i < 400; i++) {
+        if(data[i] != -1) {
+            HDfprintf(stderr, "Read different values than written\n");
+            FAIL_STACK_ERROR;
+        }
+    }
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        FAIL_STACK_ERROR;
+
+    /* read elements 1200 - 1201, this should read -1 and bring in an 
+     * entire page of addr 1200 
+     */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr+(sizeof(int)*1200), sizeof(int)*1, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    for (i=0; i < 1; i++) {
+        if(data[i] != -1) {
+            HDfprintf(stderr, "Read different values than written\n");
+            TEST_ERROR;
+        }
+    }
+    page_count ++;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+
+    /* read elements 175 - 225, this should use the PB existing pages */
+    /* Changes: 350 - 450 */
+    /* read elements 175 - 225, this should use the PB existing pages */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr+(sizeof(int)*350), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    for (i=0; i < 100; i++) {
+        if(data[i] != i+350) {
+            HDfprintf(stderr, "Read different values than written\n");
+            TEST_ERROR;
+        }
+    }
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+
+    /* read elements 0 - 800 using the VFD.. this should result in -1s
+       except for the writes that went through the PB (100-300 & 600-800) */
+    fdio_info.file = f->shared->lf;
+    fdio_info.meta_dxpl = meta_plist;
+    fdio_info.raw_dxpl = raw_plist;
+    if(H5FD_read(&fdio_info, H5FD_MEM_DRAW, addr, sizeof(int)*800, data) < 0)
+        FAIL_STACK_ERROR;
+    i = 0;
+    while (i < 800) {
+        if((i>=100 && i<300) || (i>=600)) {
+            if(data[i] != i) {
+                HDfprintf(stderr, "Read different values than written\n");
+                TEST_ERROR;
+            }
+        }
+        else {
+            if(data[i] != -1) {
+                HDfprintf(stderr, "Read different values than written\n");
+                TEST_ERROR;
+            }
+        }
+        i++;
+    }
+
+    /* read elements 0 - 800 using the PB.. this should result in all
+     * what we have written so far and should get the updates from the PB 
+     */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr, sizeof(int)*800, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+    for (i=0; i < 800; i++) {
+        if(data[i] != i) {
+            HDfprintf(stderr, "Read different values than written\n");
+            TEST_ERROR;
+        }
+    }
+
+    /* update elements 400 - 1400 to value 0, this will go to disk but
+     * also evict existing pages from the PB (page 400 & 1200 that are
+     * existing). 
+     */
+    for(i=0 ; i<1000 ; i++)
+        data[i] = 0;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*400), sizeof(int)*1000, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    page_count -= 2;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+
+    /* read elements 0 - 1000.. this should go to disk then update the
+     * buffer result 200-400 with existing pages
+     */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr, sizeof(int)*1000, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    i=0;
+    while (i < 1000) {
+        if(i<400) {
+            if(data[i] != i) {
+                HDfprintf(stderr, "Read different values than written\n");
+                TEST_ERROR;
+            }
+        }
+        else {
+            if(data[i] != 0) {
+                HDfprintf(stderr, "Read different values than written\n");
+                TEST_ERROR;
+            }
+        }
+        i++;
+    }
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    HDfree(data);
+
+    PASSED()
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+    return 1;
+} /* test_raw_data_handling */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_lru_processing()
+ *
+ * Purpose:     Basic set of tests verifying expected page buffer LRU
+ *              management.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *              
+ * Changes:     Added base_page_cnt field as supporting code.  This allows
+ *              the test to adjust to the number of page buffer pages
+ *              accessed during file open / create.
+ *
+ *              The test for the value of base_page_cnt just after file 
+ *              open exists detect changes in library behavior.  Assuming
+ *              any such change is not indicative of other issues, these 
+ *              tests can be modified to reflect the change.
+ *
+ *                                                    JRM -- 2/23/17
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+test_lru_processing(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+    size_t base_page_cnt;
+    size_t page_count = 0;
+    int i;
+    int num_elements = 2000;
+    haddr_t addr = HADDR_UNDEF;
+    haddr_t search_addr = HADDR_UNDEF;
+    int *data = NULL;
+    H5F_t *f = NULL;
+
+    TESTING("LRU Processing");
+
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    if(set_multi_split(env_h5_drvr, fapl, sizeof(int)*200)  != 0)
+        TEST_ERROR;
+
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR;
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, sizeof(int)*200) < 0)
+        FAIL_STACK_ERROR;
+
+    /* keep 2 pages at max in the page buffer */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*400, 20, 0) < 0)
+        FAIL_STACK_ERROR;
+
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     * Get the number of pages inserted, and verify that it is the 
+     * the expected value.
+     */
+    base_page_cnt = H5SL_count(f->shared->page_buf->slist_ptr);
+    if(base_page_cnt != 1)
+        TEST_ERROR;
+
+    /* allocate space for a 2000 elements */
+    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* update the first 100 elements to have values 0-99 - this will be
+     * a page buffer update with 1 page resulting in the page
+     * buffer. 
+     */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count ++;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count + base_page_cnt)
+        TEST_ERROR;
+
+    /* update elements 300 - 450, with values 300 - 449 - this will
+     * bring two pages into the page buffer and evict 0. 
+     */
+    for(i=0 ; i<150 ; i++)
+        data[i] = i+300;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*300), sizeof(int)*150, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count = 2;
+
+    /* at this point, the page buffer entry created at file open should
+     * have been evicted -- thus no further need to consider base_page_cnt.
+     */
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* The two pages should be the ones with address 100 and 200; 0
+       should have been evicted */
+    /* Changes: 200, 400 */
+    search_addr = addr;
+    if(NULL != H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+    search_addr = addr + sizeof(int)*200;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+    search_addr = addr + sizeof(int)*400;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* update elements 150-151, this will update existing pages in the
+       page buffer and move it to the top of the LRU. */
+    /* Changes: 300 - 301 */
+    for(i=0 ; i<1 ; i++)
+        data[i] = i+300;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*300), sizeof(int)*1, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* read elements 600 - 601, this should read -1 and bring in an
+       entire page of addr 600, and evict page 200 */
+    /* Changes: 1200 - 1201; 1200, 400 */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr+(sizeof(int)*1200), sizeof(int)*1, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    for (i=0; i < 1; i++) {
+        if(data[i] != -1) {
+            HDfprintf(stderr, "Read different values than written\n");
+            TEST_ERROR;
+        } /* end if */
+    } /* end for */
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* Changes: 400 */
+    search_addr = addr + sizeof(int)*400;
+    if(NULL != H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* Changes: 200 */
+    search_addr = addr + sizeof(int)*200;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* Changes: 1200 */
+    search_addr = addr + sizeof(int)*1200;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+    /* read elements 175 - 225, this should move 100 to the top, evict 600 and bring in 200 */
+    /* Changes: 350 - 450; 200, 1200, 400 */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, addr+(sizeof(int)*350), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    for (i=0; i < 100; i++) {
+        if(data[i] != i+350) {
+            HDfprintf(stderr, "Read different values than written\n");
+            TEST_ERROR;
+        } /* end if */
+    } /* end for */
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* Changes: 1200 */
+    search_addr = addr + sizeof(int)*1200;
+    if(NULL != H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* Changes: 200 */
+    search_addr = addr + sizeof(int)*200;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* Changes: 400 */
+    search_addr = addr + sizeof(int)*400;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* update elements 200 - 700 to value 0, this will go to disk but
+       also discarding existing pages from the PB (page 200). */
+    /* Changes: 400 - 1400; 400 */
+    for(i=0 ; i<1000 ; i++)
+        data[i] = 0;
+    if(H5F_block_write(f, H5FD_MEM_DRAW, addr+(sizeof(int)*400), sizeof(int)*1000, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+    page_count -= 1;
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* Changes: 200 */
+    search_addr = addr + sizeof(int)*200;
+    if(NULL == H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    /* Changes: 400 */
+    search_addr = addr + sizeof(int)*400;
+    if(NULL != H5SL_search(f->shared->page_buf->slist_ptr, &(search_addr)))
+        FAIL_STACK_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    HDfree(data);
+
+    PASSED()
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+    return 1;
+} /* test_lru_processing */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_min_threshold()
+ *
+ * Purpose:     Tests verifying observation of minimum and maximum 
+ *              raw and metadata page counts in the page buffer.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *              
+ * Changes:     Added the base_raw_cnt and base_meta_cnt fields and
+ *              supporting code.  This allows the test to adjust to the 
+ *              number of page buffer pages accessed during file open / 
+ *              create.
+ *
+ *              The tests for the values of base_raw_cnt and base_meta_cnt
+ *              just after file open exist detect changes in library 
+ *              behavior.  Assuming any such change is not indicative of 
+ *              other issues, these tests can be modified to reflect the 
+ *              change.
+ *
+ *                                                    JRM -- 2/23/17
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+test_min_threshold(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+    size_t base_raw_cnt = 0;
+    size_t base_meta_cnt = 0;
+    size_t page_count = 0;
+    int i;
+    int num_elements = 1000;
+    H5PB_t *page_buf;
+    haddr_t meta_addr = HADDR_UNDEF;
+    haddr_t raw_addr = HADDR_UNDEF;
+    int *data = NULL;
+    H5F_t *f = NULL;
+
+    TESTING("Minimum Metadata threshold Processing");
+    HDprintf("\n");
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0)
+        TEST_ERROR
+
+    if(set_multi_split(env_h5_drvr, fapl, sizeof(int)*200)  != 0)
+        TEST_ERROR;
+
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR;
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, sizeof(int)*200) < 0)
+        FAIL_STACK_ERROR;
+
+    HDprintf("\tMinimum metadata threshold = 100%%\n");
+
+    /* keep 5 pages at max in the page buffer and 5 meta page minimum */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 100, 0) < 0)
+        FAIL_STACK_ERROR;
+
+    /* create the file */
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     * Get the raw and meta counts now, so we can adjust tests accordingly.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->page_buf);
+
+    base_raw_cnt = f->shared->page_buf->raw_count;
+    base_meta_cnt = f->shared->page_buf->meta_count;
+
+    if(base_raw_cnt != 0)
+        TEST_ERROR;
+
+    if(base_meta_cnt != 1)
+        TEST_ERROR;
+
+    page_buf = f->shared->page_buf;
+
+    if(page_buf->min_meta_count != 5)
+        TEST_ERROR;
+
+    if(page_buf->min_raw_count != 0)
+        TEST_ERROR;
+
+    if(HADDR_UNDEF == (meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    /* write all raw data, this would end up in page buffer since there 
+     * is no metadata yet
+     *
+     * Not necessarily -- opening the file may may load a metadata page.
+     */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count += 5;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(page_buf->raw_count != 5 - base_meta_cnt)
+        TEST_ERROR;
+
+    /* write all meta data, this would end up in page buffer */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*400), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*600), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*800), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(page_buf->meta_count != 5)
+        TEST_ERROR;
+
+    if(page_buf->raw_count != 0)
+        TEST_ERROR;
+
+    /* write and read more raw data and make sure that they don't end up in
+     * page buffer since the minimum metadata is actually the entire
+     * page buffer 
+     */
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*350), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*500), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*750), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*900), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(page_buf->meta_count != 5)
+        TEST_ERROR;
+
+    if(page_buf->raw_count != 0)
+        TEST_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+
+    HDprintf("\tMinimum raw data threshold = 100%%\n");
+
+    page_count = 0;
+
+    /* keep 5 pages at max in the page buffer and 5 raw page minimum */
+    /* Changes: 1000 */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 0, 100) < 0)
+        TEST_ERROR;
+
+    /* create the file */
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     * Get the raw and meta counts now, so we can adjust tests accordingly.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->page_buf);
+
+    base_raw_cnt = f->shared->page_buf->raw_count;
+    base_meta_cnt = f->shared->page_buf->meta_count;
+
+    if(base_raw_cnt != 0)
+        TEST_ERROR;
+
+    if(base_meta_cnt != 1)
+        TEST_ERROR;
+
+    page_buf = f->shared->page_buf;
+
+    if(page_buf->min_meta_count != 0)
+        TEST_ERROR;
+    if(page_buf->min_raw_count != 5)
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        TEST_ERROR;
+
+    /* write all meta data, this would end up in page buffer since there 
+     * is no raw data yet
+     */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count += 5;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+    if(page_buf->meta_count != 5 - base_raw_cnt)
+        TEST_ERROR;
+
+    /* write/read all raw data, this would end up in page buffer */
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(page_buf->raw_count != 5)
+        TEST_ERROR;
+
+    if(page_buf->meta_count != 0)
+        TEST_ERROR;
+
+    /* write and read more meta data and make sure that they don't end up in
+     * page buffer since the minimum metadata is actually the entire
+     * page buffer 
+     */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*100), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*350), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*500), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*750), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*900), sizeof(int)*50, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(page_buf->raw_count != 5)
+        TEST_ERROR;
+
+    if(page_buf->meta_count != 0)
+        TEST_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+
+    HDprintf("\tMinimum metadata threshold = 40%%, Minimum rawdata threshold = 40%%\n");
+    page_count = 0;
+    /* keep 5 pages at max in the page buffer 2 meta pages, 2 raw pages  
+     * minimum 
+     */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 40, 40) < 0)
+        TEST_ERROR;
+
+    /* create the file */
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     *
+     * However, with the current 1 metadata page inserted into the 
+     * the page buffer, it is not necessary to track the base raw and 
+     * metadata entry counts.
+     */
+
+    if(base_raw_cnt != 0)
+        TEST_ERROR;
+
+    if(base_meta_cnt != 1)
+        TEST_ERROR;
+    page_buf = f->shared->page_buf;
+
+    if(page_buf->min_meta_count != 2)
+        TEST_ERROR;
+
+    if(page_buf->min_raw_count != 2)
+        TEST_ERROR;
+
+    if(HADDR_UNDEF == (meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* fill the page buffer with raw data */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count += 5;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 5 - base_meta_cnt)
+        TEST_ERROR;
+
+    /* add 3 meta entries evicting 3 raw entries */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 3)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 2)
+        TEST_ERROR;
+
+    /* adding more meta entires should replace meta entries since raw data 
+     * is at its minimum 
+     */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 3)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 2)
+        TEST_ERROR;
+
+    /* bring existing raw entires up the LRU */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*750), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* adding 2 raw entries (even with 1 call) should only evict 1 meta 
+     * entry and another raw entry 
+     */
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*350), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 2)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 3)
+        TEST_ERROR;
+
+    /* adding 2 meta entries should replace 2 entires at the bottom of the LRU */
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*98), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*242), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 2)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 3)
+        TEST_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+    HDprintf("\tMinimum metadata threshold = 20%%\n");
+    page_count = 0;
+    /* keep 5 pages at max in the page buffer and 1 meta page minimum */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 39, 0) < 0)
+        TEST_ERROR;
+    /* create the file */
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+    page_buf = f->shared->page_buf;
+
+    if(page_buf->min_meta_count != 1)
+        TEST_ERROR;
+    if(page_buf->min_raw_count != 0)
+        TEST_ERROR;
+
+    if(HADDR_UNDEF == (meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* fill the page buffer with raw data */
+    for(i=0 ; i<100 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    page_count += 5;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    /* add 2 meta entries evicting 2 raw entries */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 2)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 3)
+        TEST_ERROR;
+
+    /* bring the rest of the raw entries up the LRU */
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*500), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*700), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*900), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    /* write one more raw entry which replace one meta entry */
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 1)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 4)
+        TEST_ERROR;
+
+    /* write one more raw entry which should replace another raw entry 
+     * keeping min threshold of meta entries 
+     */
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*300), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 1)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 4)
+        TEST_ERROR;
+
+    /* write a metadata entry that should replace the metadata entry 
+     * at the bottom of the LRU 
+     */
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*500), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5SL_count(f->shared->page_buf->slist_ptr) != page_count)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->meta_count != 1)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->raw_count != 4)
+        TEST_ERROR;
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    HDfree(data);
+
+    PASSED()
+
+    return 0;
+
+error:
+
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+
+    return 1;
+
+} /* test_min_threshold */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_stats_collection()
+ *
+ * Purpose:     Tests verifying correct collection of statistics
+ *              by the page buffer.
+ *
+ *              Any data mis-matches or failures reported by the HDF5
+ *              library result in test failure.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *              
+ * Changes:     Added the base_raw_cnt and base_meta_cnt fields and
+ *              supporting code.  This allows the test to adjust to the 
+ *              number of page buffer pages accessed during file open / 
+ *              create.
+ *
+ *              The tests for the values of base_raw_cnt and base_meta_cnt
+ *              just after file open exist detect changes in library 
+ *              behavior.  Assuming any such change is not indicative of 
+ *              other issues, these tests can be modified to reflect the 
+ *              change.
+ *
+ *                                                    JRM -- 2/23/17
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_stats_collection(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+    int i;
+    int num_elements = 1000;
+    size_t base_raw_cnt = 0;
+    size_t base_meta_cnt = 0;
+    haddr_t meta_addr = HADDR_UNDEF;
+    haddr_t raw_addr = HADDR_UNDEF;
+    int *data = NULL;
+    H5F_t *f = NULL;
+
+    TESTING("Statistics Collection");
+
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0)
+        TEST_ERROR
+
+    if(set_multi_split(env_h5_drvr, fapl, sizeof(int)*200)  != 0)
+        TEST_ERROR;
+
+    if((data = (int *)HDcalloc((size_t)num_elements, sizeof(int))) == NULL)
+        TEST_ERROR
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        TEST_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, sizeof(int)*200) < 0)
+        TEST_ERROR;
+
+    /* keep 5 pages at max in the page buffer */
+    if(H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 20, 0) < 0)
+        TEST_ERROR;
+
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+        FAIL_STACK_ERROR;
+
+    /* opening the file inserts one or more pages into the page buffer.
+     * Get the raw and meta counts now, so we can adjust the expected 
+     * statistics accordingly.
+     */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->page_buf);
+
+    base_raw_cnt = f->shared->page_buf->raw_count;
+    base_meta_cnt = f->shared->page_buf->meta_count;
+
+    if(base_raw_cnt != 0)
+        TEST_ERROR;
+
+    if(base_meta_cnt != 1)
+        TEST_ERROR;
+
+    /* reset statistics before we begin the tests */
+    if(H5Freset_page_buffering_stats(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+    if(HADDR_UNDEF == (raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements)))
+        FAIL_STACK_ERROR;
+
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    for(i=0 ; i<200 ; i++)
+        data[i] = i;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*500), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*700), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*900), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*400), sizeof(int)*200, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*300), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*800), sizeof(int)*182, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*200), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*600), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_rawdata_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*400), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*600), sizeof(int)*200, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5F_block_read(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*800), sizeof(int)*100, H5AC_ind_read_dxpl_id, data) < 0)
+        FAIL_STACK_ERROR;
+
+    if(f->shared->page_buf->accesses[0] != 8)
+        TEST_ERROR;
+    if(f->shared->page_buf->accesses[1] != 16)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->bypasses[0] != 3)
+        TEST_ERROR;
+    if(f->shared->page_buf->bypasses[1] != 1)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->hits[0] != 0)
+        TEST_ERROR;
+    if(f->shared->page_buf->hits[1] != 4)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->misses[0] != 8)
+        TEST_ERROR;
+    if(f->shared->page_buf->misses[1] != 11)
+        TEST_ERROR;
+
+    if(f->shared->page_buf->evictions[0] != 5 + base_meta_cnt)
+        TEST_ERROR;
+    if(f->shared->page_buf->evictions[1] != 9 + base_raw_cnt)
+        TEST_ERROR;
+
+    {
+        unsigned accesses[2];
+        unsigned hits[2];
+        unsigned misses[2];
+        unsigned evictions[2];
+        unsigned bypasses[2];
+
+        if(H5Fget_page_buffering_stats(file_id, accesses, hits, misses, evictions, bypasses) < 0)
+            FAIL_STACK_ERROR;
+
+        if(accesses[0] != 8)
+            TEST_ERROR;
+        if(accesses[1] != 16)
+            TEST_ERROR;
+        if(bypasses[0] != 3)
+            TEST_ERROR;
+        if(bypasses[1] != 1)
+            TEST_ERROR;
+        if(hits[0] != 0)
+            TEST_ERROR;
+        if(hits[1] != 4)
+            TEST_ERROR;
+        if(misses[0] != 8)
+            TEST_ERROR;
+        if(misses[1] != 11)
+            TEST_ERROR;
+        if(evictions[0] != 5 + base_meta_cnt)
+            TEST_ERROR;
+        if(evictions[1] != 9 + base_raw_cnt)
+            TEST_ERROR;
+
+        if(H5Freset_page_buffering_stats(file_id) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Fget_page_buffering_stats(file_id, accesses, hits, misses, evictions, bypasses) < 0)
+            FAIL_STACK_ERROR;
+
+        if(accesses[0] != 0)
+            TEST_ERROR;
+        if(accesses[1] != 0)
+            TEST_ERROR;
+        if(bypasses[0] != 0)
+            TEST_ERROR;
+        if(bypasses[1] != 0)
+            TEST_ERROR;
+        if(hits[0] != 0)
+            TEST_ERROR;
+        if(hits[1] != 0)
+            TEST_ERROR;
+        if(misses[0] != 0)
+            TEST_ERROR;
+        if(misses[1] != 0)
+            TEST_ERROR;
+        if(evictions[0] != 0)
+            TEST_ERROR;
+        if(evictions[1] != 0)
+            TEST_ERROR;
+    } /* end block */
+
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    HDfree(data);
+
+
+    PASSED()
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(file_id);
+        if(data)
+            HDfree(data);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_stats_collection */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_page_buffering_disabled()
+ *
+ * Purpose:     This function should only be called in parallel 
+ *              builds.
+ *
+ *              At present, page buffering should be disabled in parallel
+ *              builds.  Verify this.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  John Mainzer
+ *              03/21/17
+ *              
+ * Changes:     None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef H5_HAVE_PARALLEL
+static unsigned
+verify_page_buffering_disabled(hid_t orig_fapl, const char *env_h5_drvr)
+{
+    char filename[FILENAME_LEN]; /* Filename to use */
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl = -1;
+    hid_t fapl = -1;
+
+    TESTING("Page Buffering Disabled");
+    h5_fixname(FILENAME[0], orig_fapl, filename, sizeof(filename));
+
+
+    /* first, try to create a file with page buffering enabled */
+
+    if((fapl = H5Pcopy(orig_fapl)) < 0)
+        TEST_ERROR
+
+    if(set_multi_split(env_h5_drvr, fapl, 4096)  != 0)
+        TEST_ERROR;
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 4096) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_page_buffer_size(fapl, 4096*8, 0, 0) < 0)
+        FAIL_STACK_ERROR;
+
+    /* try to create  the file -- should fail */
+    H5E_BEGIN_TRY {
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+
+    if(file_id >= 0)
+        TEST_ERROR;
+
+    /* now, create a file, close it, and then try to open it with page 
+     * buffering enabled.
+     */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pset_file_space_page_size(fcpl, 4096) < 0)
+        FAIL_STACK_ERROR;
+
+    /* create the file */
+    if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* close the file */
+    if(H5Fclose(file_id) < 0)
+        FAIL_STACK_ERROR;
+
+    /* try to open the file using the fapl prepared above which enables 
+     * page buffering.  Should fail.
+     */
+    H5E_BEGIN_TRY {
+        file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+    } H5E_END_TRY;
+
+    if(file_id >= 0)
+        TEST_ERROR;
+
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED()
+
+    return 0;
+
+error:
+
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(file_id);
+    } H5E_END_TRY;
+
+    return 1;
+
+} /* verify_page_buffering_disabled() */
+#endif /* H5_HAVE_PARALLEL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main()
+ *
+ * Purpose:     Main function for the page buffer tests.
+ *
+ * Return:      0 if test is sucessful
+ *              1 if test fails
+ *
+ * Programmer:  unknown
+ *              ?? / ?? / ??
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    hid_t       fapl = -1;              /* File access property list for data files */
+    unsigned    nerrors = 0;            /* Cumulative error count */
+    const char  *env_h5_drvr = NULL;    /* File Driver value from environment */
+
+    h5_reset();
+
+    /* Get the VFD to use */
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+
+    /* Temporary skip testing with multi/split drivers:
+     * Page buffering depends on paged aggregation which is
+     * currently disabled for multi/split drivers.
+     */
+    if((0 == HDstrcmp(env_h5_drvr, "multi")) || 
+       (0 == HDstrcmp(env_h5_drvr, "split"))) {
+
+        SKIPPED()
+        HDputs("Skip page buffering test because paged aggregation is disabled for multi/split drivers");
+        HDexit(EXIT_SUCCESS);
+    } /* end if */
+
+    if((fapl = h5_fileaccess()) < 0) {
+        nerrors++;
+        PUTS_ERROR("Can't get VFD-dependent fapl")
+    } /* end if */
+
+#ifdef H5_HAVE_PARALLEL 
+
+    HDputs("Page Buffering is disabled for parallel.");
+    nerrors += verify_page_buffering_disabled(fapl, env_h5_drvr);
+
+#else /* H5_HAVE_PARALLEL */
+
+    nerrors += test_args(fapl, env_h5_drvr);
+    nerrors += test_raw_data_handling(fapl, env_h5_drvr);
+    nerrors += test_lru_processing(fapl, env_h5_drvr);
+    nerrors += test_min_threshold(fapl, env_h5_drvr);
+    nerrors += test_stats_collection(fapl, env_h5_drvr);
+
+#endif /* H5_HAVE_PARALLEL */
+
+    h5_clean_files(FILENAME, fapl);
+
+    if(nerrors)
+        goto error;
+
+    HDputs("All Page Buffering tests passed.");
+
+    HDexit(EXIT_SUCCESS);
+
+error:
+
+    HDprintf("***** %d Page Buffering TEST%s FAILED! *****\n",
+        nerrors, nerrors > 1 ? "S" : "");
+
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+    } H5E_END_TRY;
+
+    HDexit(EXIT_FAILURE);
+
+} /* main() */
+
diff --git a/test/paged_nopersist.h5 b/test/paged_nopersist.h5
new file mode 100644
index 0000000..b6c945a
Binary files /dev/null and b/test/paged_nopersist.h5 differ
diff --git a/test/paged_persist.h5 b/test/paged_persist.h5
new file mode 100644
index 0000000..f0ae836
Binary files /dev/null and b/test/paged_persist.h5 differ
diff --git a/test/plugin.c b/test/plugin.c
index a3082d2..8b4324d 100644
--- a/test/plugin.c
+++ b/test/plugin.c
@@ -4,35 +4,34 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
- * Programmer:	Raymond Lu
- *		13 February 2013
+ * Programmer:    Raymond Lu
+ *        13 February 2013
  *
- * Purpose:	Tests the plugin module (H5PL)
+ * Purpose:    Tests the plugin module (H5PL)
  */
-#include <stdlib.h>
-#include <time.h>
 
 #include "h5test.h"
 #include "H5srcdir.h"
 
 /*
- * This file needs to access private datatypes from the H5Z package.
+ * This file needs to access private datatypes from the H5Z and H5PL package.
  */
+#define H5PL_FRIEND
+#include "H5PLpkg.h"
 #define H5Z_FRIEND
 #include "H5Zpkg.h"
 
 /* Filters for HDF5 internal test */
 #define H5Z_FILTER_DYNLIB1      257
-#define H5Z_FILTER_DYNLIB2      258 
+#define H5Z_FILTER_DYNLIB2      258
 #define H5Z_FILTER_DYNLIB3      259
+#define H5Z_FILTER_DYNLIB4      260
 
 const char *FILENAME[] = {
     "plugin",
@@ -41,9 +40,10 @@ const char *FILENAME[] = {
 #define FILENAME_BUF_SIZE       1024
 
 /* Dataset names for testing filters */
-#define DSET_DEFLATE_NAME	"deflate"
-#define DSET_DYNLIB1_NAME	"dynlib1"
-#define DSET_DYNLIB2_NAME       "dynlib2"
+#define DSET_DEFLATE_NAME    "deflate"
+#define DSET_DYNLIB1_NAME    "dynlib1"
+#define DSET_DYNLIB2_NAME    "dynlib2"
+#define DSET_DYNLIB4_NAME    "dynlib4"
 
 /* Parameters for internal filter test */
 #define FILTER_CHUNK_DIM1       2
@@ -62,64 +62,61 @@ const char *FILENAME[] = {
 
 #define GROUP_ITERATION 1000
 
-int	points_deflate[DSET_DIM1][DSET_DIM2], 
-        points_dynlib1[DSET_DIM1][DSET_DIM2],
-        points_dynlib2[DSET_DIM1][DSET_DIM2],
-        points_bzip2[DSET_DIM1][DSET_DIM2];
+int    points_deflate[DSET_DIM1][DSET_DIM2],
+       points_dynlib1[DSET_DIM1][DSET_DIM2],
+       points_dynlib2[DSET_DIM1][DSET_DIM2],
+       points_dynlib4[DSET_DIM1][DSET_DIM2],
+       points_bzip2[DSET_DIM1][DSET_DIM2];
 
 

 /*-------------------------------------------------------------------------
- * Function:	test_filter_internal
+ * Function:  test_filter_internal
  *
- * Purpose:	Tests writing entire data and partial data with filters  
- *
- * Return:	Success:	0
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *              27 February 2013
+ * Purpose:   Tests writing entire data and partial data with filters
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
 {
-    hid_t		dataset;        /* Dataset ID */
-    hid_t		dxpl;           /* Dataset xfer property list ID */
-    hid_t		write_dxpl;     /* Dataset xfer property list ID for writing */
-    hid_t		sid;            /* Dataspace ID */
-    const hsize_t	size[2] = {DSET_DIM1, DSET_DIM2};           /* Dataspace dimensions */
-    const hsize_t	hs_offset[2] = {FILTER_HS_OFFSET1, FILTER_HS_OFFSET2}; /* Hyperslab offset */
-    const hsize_t	hs_size[2] = {FILTER_HS_SIZE1, FILTER_HS_SIZE2};   /* Hyperslab size */
-    void		*tconv_buf = NULL;      /* Temporary conversion buffer */
-    int	                points[DSET_DIM1][DSET_DIM2], check[DSET_DIM1][DSET_DIM2];
-    size_t		i, j;        /* Local index variables */
-    int                 n = 0;
+    herr_t       ret_value = -1;
+    hid_t        dataset = -1;          /* Dataset ID */
+    hid_t        dxpl = -1;             /* Dataset xfer property list ID */
+    hid_t        write_dxpl = -1;       /* Dataset xfer property list ID for writing */
+    hid_t        sid = -1;              /* Dataspace ID */
+    const hsize_t    size[2] = {DSET_DIM1, DSET_DIM2};                      /* Dataspace dimensions */
+    const hsize_t    hs_offset[2] = {FILTER_HS_OFFSET1, FILTER_HS_OFFSET2}; /* Hyperslab offset */
+    const hsize_t    hs_size[2] = {FILTER_HS_SIZE1, FILTER_HS_SIZE2};       /* Hyperslab size */
+    void        *tconv_buf = NULL;      /* Temporary conversion buffer */
+    int          points[DSET_DIM1][DSET_DIM2], check[DSET_DIM1][DSET_DIM2];
+    size_t       i, j;                  /* Local index variables */
+    int          n = 0;
 
     /* Create the data space */
-    if((sid = H5Screate_simple(2, size, NULL)) < 0) goto error;
+    if((sid = H5Screate_simple(2, size, NULL)) < 0) TEST_ERROR
 
     /*
      * Create a small conversion buffer to test strip mining. We
      * might as well test all we can!
      */
-    if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0) goto error;
+    if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0) TEST_ERROR
     tconv_buf = HDmalloc((size_t)1000);
-    if(H5Pset_buffer(dxpl, (size_t)1000, tconv_buf, NULL) < 0) goto error;
+    if(H5Pset_buffer(dxpl, (size_t)1000, tconv_buf, NULL) < 0) TEST_ERROR
     if((write_dxpl = H5Pcopy(dxpl)) < 0) TEST_ERROR;
 
     TESTING("    filters (setup)");
 
     /* Check if all the filters are available */
-    if(H5Pall_filters_avail(dcpl)!=TRUE) {
+    if(H5Pall_filters_avail(dcpl) != TRUE) {
         H5_FAILED();
-        printf("    Line %d: Incorrect filter availability\n",__LINE__);
-        goto error;
+        HDprintf("    Line %d: Incorrect filter availability\n", __LINE__);
+        TEST_ERROR
     } /* end if */
 
     /* Create the dataset */
-    if((dataset = H5Dcreate2(fid, name, H5T_NATIVE_INT, sid, H5P_DEFAULT,
-			     dcpl, H5P_DEFAULT)) < 0) goto error;
+    if((dataset = H5Dcreate2(fid, name, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR
 
     PASSED();
 
@@ -129,20 +126,16 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
      */
     TESTING("    filters (uninitialized read)");
 
-    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0)
-	TEST_ERROR;
-
-    for(i=0; i<(size_t)size[0]; i++) {
-	for(j=0; j<(size_t)size[1]; j++) {
-	    if(0!=check[i][j]) {
-		H5_FAILED();
-		printf("    Read a non-zero value.\n");
-		printf("    At index %lu,%lu\n",
-		       (unsigned long)i, (unsigned long)j);
-		goto error;
-	    }
-	}
-    }
+    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0) TEST_ERROR;
+
+    for(i=0; i<(size_t)size[0]; i++)
+        for(j=0; j<(size_t)size[1]; j++)
+            if(0 != check[i][j]) {
+                H5_FAILED();
+                HDprintf("    Read a non-zero value.\n");
+                HDprintf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                TEST_ERROR
+            } /* end if */
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -153,14 +146,11 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
     TESTING("    filters (write)");
 
     n = 0;
-    for(i=0; i<size[0]; i++) {
-	for(j=0; j<size[1]; j++) {
-	    points[i][j] = (int)(n++);
-	}
-    }
+    for(i=0; i<size[0]; i++)
+        for(j=0; j<size[1]; j++)
+            points[i][j] = (int)(n++);
 
-    if(H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, write_dxpl, points) < 0)
-	TEST_ERROR;
+    if(H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, write_dxpl, points) < 0) TEST_ERROR;
 
     PASSED();
 
@@ -171,22 +161,19 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
     TESTING("    filters (read)");
 
     /* Read the dataset back */
-        if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0)
-	   TEST_ERROR;
-
-        /* Check that the values read are the same as the values written */
-        for(i=0; i<size[0]; i++) {
-	   for(j=0; j<size[1]; j++) {
-	       if(points[i][j] != check[i][j]) {
-		  H5_FAILED();
-		  fprintf(stderr,"    Read different values than written.\n");
-		  fprintf(stderr,"    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
-		  fprintf(stderr,"    At original: %d\n", (int)points[i][j]);
-		  fprintf(stderr,"    At returned: %d\n", (int)check[i][j]);
-		  goto error;
-	       }
-	   }
-        }
+    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0) TEST_ERROR;
+
+    /* Check that the values read are the same as the values written */
+    for(i=0; i<size[0]; i++)
+        for(j=0; j<size[1]; j++)
+            if(points[i][j] != check[i][j]) {
+                H5_FAILED();
+                HDfprintf(stderr,"    Read different values than written.\n");
+                HDfprintf(stderr,"    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                HDfprintf(stderr,"    At original: %d\n", (int)points[i][j]);
+                HDfprintf(stderr,"    At returned: %d\n", (int)check[i][j]);
+                TEST_ERROR
+            } /* end if */
 
     PASSED();
 
@@ -199,30 +186,24 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
      */
     TESTING("    filters (modify)");
 
-    for(i=0; i<size[0]; i++) {
-	for(j=0; j<size[1]/2; j++) {
-	    points[i][j] = (int)HDrandom () % RANDOM_LIMIT;
-	}
-    }
-    if(H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, write_dxpl, points) < 0)
-	TEST_ERROR;
-
-        /* Read the dataset back and check it */
-        if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0)
-	   TEST_ERROR;
-
-        /* Check that the values read are the same as the values written */
-        for(i=0; i<size[0]; i++) {
-	   for(j=0; j<size[1]; j++) {
-	       if(points[i][j] != check[i][j]) {
-		  H5_FAILED();
-		  printf("    Read different values than written.\n");
-		  printf("    At index %lu,%lu\n",
-		           (unsigned long)i, (unsigned long)j);
-		  goto error;
-	       }
-	   }
-        }
+    for(i=0; i<size[0]; i++)
+        for(j=0; j<size[1]/2; j++)
+            points[i][j] = (int)HDrandom () % RANDOM_LIMIT;
+
+    if(H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, write_dxpl, points) < 0) TEST_ERROR;
+
+    /* Read the dataset back and check it */
+    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0) TEST_ERROR;
+
+    /* Check that the values read are the same as the values written */
+    for(i=0; i<size[0]; i++)
+        for(j=0; j<size[1]; j++)
+            if(points[i][j] != check[i][j]) {
+                H5_FAILED();
+                HDprintf("    Read different values than written.\n");
+                HDprintf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                TEST_ERROR
+            } /* end if */
 
     PASSED();
 
@@ -237,19 +218,17 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
     if(H5Dclose(dataset) < 0) TEST_ERROR;
     if((dataset = H5Dopen2(fid, name, H5P_DEFAULT)) < 0) TEST_ERROR;
 
-        if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0)
-            TEST_ERROR;
+    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl, check) < 0) TEST_ERROR;
 
-        /* Check that the values read are the same as the values written */
-        for(i = 0; i < size[0]; i++)
-	   for(j = 0; j < size[1]; j++)
-	       if(points[i][j] != check[i][j]) {
-		  H5_FAILED();
-		  printf("    Read different values than written.\n");
-		  printf("    At index %lu,%lu\n",
-		        (unsigned long)i, (unsigned long)j);
-		  goto error;
-	       } /* end if */
+    /* Check that the values read are the same as the values written */
+    for(i = 0; i < size[0]; i++)
+        for(j = 0; j < size[1]; j++)
+            if(points[i][j] != check[i][j]) {
+                H5_FAILED();
+                HDprintf("    Read different values than written.\n");
+                HDprintf("    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                TEST_ERROR
+            } /* end if */
 
     PASSED();
 
@@ -261,225 +240,228 @@ test_filter_internal(hid_t fid, const char *name, hid_t dcpl)
      */
     TESTING("    filters (partial I/O)");
 
-    for(i=0; i<(size_t)hs_size[0]; i++) {
-	for(j=0; j<(size_t)hs_size[1]; j++) {
-	    points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j] = (int)HDrandom() % RANDOM_LIMIT;
-	}
-    }
-    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, hs_offset, NULL, hs_size,
-			    NULL) < 0) TEST_ERROR;
+    for(i=0; i<(size_t)hs_size[0]; i++)
+        for(j=0; j<(size_t)hs_size[1]; j++)
+            points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j] = (int)HDrandom() % RANDOM_LIMIT;
+
+    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0) TEST_ERROR;
     /* (Use the "read" DXPL because partial I/O on corrupted data test needs to ignore errors during writing) */
-    if(H5Dwrite (dataset, H5T_NATIVE_INT, sid, sid, dxpl, points) < 0)
-	TEST_ERROR;
-
-        if(H5Dread (dataset, H5T_NATIVE_INT, sid, sid, dxpl, check) < 0)
-	   TEST_ERROR;
-
-        /* Check that the values read are the same as the values written */
-        for(i=0; i<(size_t)hs_size[0]; i++) {
-	   for(j=0; j<(size_t)hs_size[1]; j++) {
-	       if(points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j] !=
-                      check[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]) {
-		  H5_FAILED();
-		  fprintf(stderr,"    Read different values than written.\n");
-		  fprintf(stderr,"    At index %lu,%lu\n",
-		         (unsigned long)((size_t)hs_offset[0]+i),
-		         (unsigned long)((size_t)hs_offset[1]+j));
-		  fprintf(stderr,"    At original: %d\n",
-		         (int)points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]);
-		  fprintf(stderr,"    At returned: %d\n",
-		         (int)check[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]);
-		  goto error;
-	       }
-	   }
-        }
+    if(H5Dwrite(dataset, H5T_NATIVE_INT, sid, sid, dxpl, points) < 0) TEST_ERROR;
+
+    if(H5Dread(dataset, H5T_NATIVE_INT, sid, sid, dxpl, check) < 0) TEST_ERROR;
+
+    /* Check that the values read are the same as the values written */
+    for(i=0; i<(size_t)hs_size[0]; i++)
+        for(j=0; j<(size_t)hs_size[1]; j++)
+            if(points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j] != check[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]) {
+                H5_FAILED();
+                HDfprintf(stderr,"    Read different values than written.\n");
+                HDfprintf(stderr,"    At index %lu,%lu\n", (unsigned long)((size_t)hs_offset[0]+i), (unsigned long)((size_t)hs_offset[1]+j));
+                HDfprintf(stderr,"    At original: %d\n", (int)points[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]);
+                HDfprintf(stderr,"    At returned: %d\n", (int)check[(size_t)hs_offset[0]+i][(size_t)hs_offset[1]+j]);
+                TEST_ERROR
+            } /* end if */
 
     PASSED();
 
-    /* Save the data written to the file for later comparison when the file 
+    /* Save the data written to the file for later comparison when the file
      * is reopened for read test */
-    for(i=0; i<size[0]; i++) {
-        for(j=0; j<size[1]; j++) {
-            if(!HDstrcmp(name, DSET_DEFLATE_NAME)) {
-	        points_deflate[i][j] = points[i][j];
-            } else if(!HDstrcmp(name, DSET_DYNLIB1_NAME)) {
-	        points_dynlib1[i][j] = points[i][j];
-            } else if(!HDstrcmp(name, DSET_DYNLIB2_NAME)) {
-	        points_dynlib2[i][j] = points[i][j];
-            }
-	}
-    }
+    for(i=0; i<size[0]; i++)
+        for(j=0; j<size[1]; j++)
+            if(!HDstrcmp(name, DSET_DEFLATE_NAME))
+                points_deflate[i][j] = points[i][j];
+            else if(!HDstrcmp(name, DSET_DYNLIB1_NAME))
+                points_dynlib1[i][j] = points[i][j];
+            else if(!HDstrcmp(name, DSET_DYNLIB2_NAME))
+                points_dynlib2[i][j] = points[i][j];
+            else if(!HDstrcmp(name, DSET_DYNLIB4_NAME))
+                points_dynlib4[i][j] = points[i][j];
+
+    ret_value = 0;
 
+error:
     /* Clean up objects used for this test */
-    if(H5Dclose (dataset) < 0) goto error;
-    if(H5Sclose (sid) < 0) goto error;
-    if(H5Pclose (dxpl) < 0) goto error;
-    free (tconv_buf);
-
-    return(0);
+    H5E_BEGIN_TRY {
+        H5Dclose(dataset);
+        H5Sclose(sid);
+        H5Pclose(dxpl);
+    } H5E_END_TRY
 
-error:
     if(tconv_buf)
-        free (tconv_buf);
-    return -1;
+        HDfree(tconv_buf);
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_filters_for_datasets
- *
- * Purpose:	Tests creating datasets and writing data with dynamically
- *              loaded filters
+ * Function:  test_filters_for_datasets
  *
- * Return:	Success:	0
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *              14 March 2013
+ * Purpose:   Tests creating datasets and writing data with dynamically loaded filters
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_filters_for_datasets(hid_t file)
 {
-    hid_t	dc;                 /* Dataset creation property list ID */
-    const hsize_t chunk_size[2] = {FILTER_CHUNK_DIM1, FILTER_CHUNK_DIM2};  /* Chunk dimensions */
-    unsigned int         compress_level = 9;
+    herr_t           ret_value = -1;
+    hid_t            dc = -1;    /* Dataset creation property list ID */
+    const hsize_t    chunk_size[2] = {FILTER_CHUNK_DIM1, FILTER_CHUNK_DIM2};  /* Chunk dimensions */
+    unsigned int     compress_level = 9;
+    unsigned int     dynlib4_values[4];
 
     /*----------------------------------------------------------
      * STEP 1: Test deflation by itself.
      *----------------------------------------------------------
      */
+    HDputs("Testing deflate filter");
 #ifdef H5_HAVE_FILTER_DEFLATE
-    puts("Testing deflate filter");
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk (dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_deflate (dc, 6) < 0) goto error;
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0) TEST_ERROR
+    if(H5Pset_deflate(dc, 6) < 0) TEST_ERROR
 
-    if(test_filter_internal(file,DSET_DEFLATE_NAME,dc) < 0) goto error;
+    if(test_filter_internal(file, DSET_DEFLATE_NAME, dc) < 0) TEST_ERROR
     /* Clean up objects used for this test */
-    if(H5Pclose (dc) < 0) goto error;
+    if(H5Pclose(dc) < 0) TEST_ERROR
 #else /* H5_HAVE_FILTER_DEFLATE */
-    TESTING("deflate filter");
     SKIPPED();
-    puts("    Deflate filter not enabled");
+    HDputs("    Deflate filter not enabled");
 #endif /* H5_HAVE_FILTER_DEFLATE */
 
     /*----------------------------------------------------------
      * STEP 2: Test DYNLIB1 by itself.
      *----------------------------------------------------------
      */
-    puts("Testing DYNLIB1 filter");
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk (dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_filter (dc, H5Z_FILTER_DYNLIB1, H5Z_FLAG_MANDATORY, (size_t)1, &compress_level) < 0) goto error;
+    HDputs("    DYNLIB1 filter");
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0) TEST_ERROR
+    if(H5Pset_filter(dc, H5Z_FILTER_DYNLIB1, H5Z_FLAG_MANDATORY, (size_t)1, &compress_level) < 0) TEST_ERROR
 
-    if(test_filter_internal(file,DSET_DYNLIB1_NAME,dc) < 0) goto error;
+    if(test_filter_internal(file, DSET_DYNLIB1_NAME, dc) < 0) TEST_ERROR
 
     /* Clean up objects used for this test */
-    if(H5Pclose (dc) < 0) goto error;
+    if(H5Pclose(dc) < 0) TEST_ERROR
 
-    /* Unregister the dynamic filter DYNLIB1 for testing purpose. The next time when this test is run for 
+    /* Unregister the dynamic filter DYNLIB1 for testing purpose. The next time when this test is run for
      * the new file format, the library's H5PL code has to search in the table of loaded plugin libraries
      * for this filter. */
-    if(H5Zunregister(H5Z_FILTER_DYNLIB1) < 0) goto error;
+    if(H5Zunregister(H5Z_FILTER_DYNLIB1) < 0) TEST_ERROR
 
     /*----------------------------------------------------------
      * STEP 3: Test DYNLIB2 by itself.
      *----------------------------------------------------------
      */
-    puts("Testing DYNLIB2 filter");
-    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk (dc, 2, chunk_size) < 0) goto error;
-    if(H5Pset_filter (dc, H5Z_FILTER_DYNLIB2, H5Z_FLAG_MANDATORY, 0, NULL) < 0) goto error;
+    HDputs("    DYNLIB2 filter");
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0) TEST_ERROR
+    if(H5Pset_filter(dc, H5Z_FILTER_DYNLIB2, H5Z_FLAG_MANDATORY, 0, NULL) < 0) TEST_ERROR
 
-    if(test_filter_internal(file,DSET_DYNLIB2_NAME,dc) < 0) goto error;
+    if(test_filter_internal(file,DSET_DYNLIB2_NAME,dc) < 0) TEST_ERROR
 
     /* Clean up objects used for this test */
-    if(H5Pclose (dc) < 0) goto error;
+    if(H5Pclose(dc) < 0) TEST_ERROR
 
-    /* Unregister the dynamic filter DYNLIB2 for testing purpose. The next time when this test is run for 
+    /* Unregister the dynamic filter DYNLIB2 for testing purpose. The next time when this test is run for
      * the new file format, the library's H5PL code has to search in the table of loaded plugin libraries
      * for this filter. */
-    if(H5Zunregister(H5Z_FILTER_DYNLIB2) < 0) goto error;
+    if(H5Zunregister(H5Z_FILTER_DYNLIB2) < 0) TEST_ERROR
 
-    return 0;
+    /*----------------------------------------------------------
+     * STEP 4: Test DYNLIB4 by itself.
+     *----------------------------------------------------------
+     */
+    HDputs("    DYNLIB4 filter");
+    if((dc = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(dc, 2, chunk_size) < 0) TEST_ERROR
+    dynlib4_values[0] = 9;
+    if(H5get_libversion(&dynlib4_values[1], &dynlib4_values[2], &dynlib4_values[3]) < 0) TEST_ERROR
+    if(H5Pset_filter(dc, H5Z_FILTER_DYNLIB4, H5Z_FLAG_MANDATORY, (size_t)4, dynlib4_values) < 0) TEST_ERROR
+
+    if(test_filter_internal(file, DSET_DYNLIB4_NAME, dc) < 0) TEST_ERROR
+
+    /* Clean up objects used for this test */
+    if(H5Pclose(dc) < 0) TEST_ERROR
+
+    /* Unregister the dynamic filter DYNLIB4 for testing purpose. The next time when this test is run for
+     * the new file format, the library's H5PL code has to search in the table of loaded plugin libraries
+     * for this filter. */
+    if(H5Zunregister(H5Z_FILTER_DYNLIB4) < 0) TEST_ERROR
+
+    ret_value = 0;
 
 error:
-    return -1;
+    /* Clean up objects used for this test */
+    H5E_BEGIN_TRY {
+        H5Pclose(dc);
+    } H5E_END_TRY
+
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_read_data
- *
- * Purpose:	Tests reading data and compares values
+ * Function:  test_read_data
  *
- * Return:	Success:	0
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *              14 March 2013
+ * Purpose:   Tests reading data and compares values
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_read_data(hid_t dataset, int *origin_data)
 {
-    int	                check[DSET_DIM1][DSET_DIM2];
-    const hsize_t	size[2] = {DSET_DIM1, DSET_DIM2};           /* Dataspace dimensions */
-    int                 *data_p = origin_data;
-    size_t		i, j;        /* Local index variables */
+    herr_t        ret_value = -1;
+    int           check[DSET_DIM1][DSET_DIM2];
+    const hsize_t size[2] = {DSET_DIM1, DSET_DIM2};   /* Dataspace dimensions */
+    int          *data_p = origin_data;
+    size_t        i, j;        /* Local index variables */
 
     /* Read the dataset back */
-    if(H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, check) < 0)
-        TEST_ERROR;
+    if(H5Dread(dataset, 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<size[0]; i++) {
+    for(i=0; i<size[0]; i++)
         for(j=0; j<size[1]; j++) {
-	   if(*data_p != check[i][j]) {
-	       H5_FAILED();
-	       fprintf(stderr,"    Read different values than written.\n");
-	       fprintf(stderr,"    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
-	       fprintf(stderr,"    At original: %d\n", *data_p);
-	       fprintf(stderr,"    At returned: %d\n", (int)check[i][j]);
-	       goto error;
-	   }
+            if(*data_p != check[i][j]) {
+                H5_FAILED();
+                HDfprintf(stderr,"    Read different values than written.\n");
+                HDfprintf(stderr,"    At index %lu,%lu\n", (unsigned long)i, (unsigned long)j);
+                HDfprintf(stderr,"    At original: %d\n", *data_p);
+                HDfprintf(stderr,"    At returned: %d\n", (int)check[i][j]);
+                TEST_ERROR
+            } /* end if */
            data_p++;
-	}
-    }
+        }
 
     PASSED();
-    return 0;
+    ret_value = 0;
 
 error:
-    return -1;
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:    test_read_with_filters
- *
- * Purpose: Tests reading dataset created with dynamically loaded filters
+ * Function:  test_read_with_filters
  *
- * Return:  Success:    0
- *      Failure:    -1
- *
- * Programmer:  Raymond Lu
- *              14 March 2013
+ * Purpose:   Tests reading dataset created with dynamically loaded filters
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_read_with_filters(hid_t file)
 {
-    hid_t   dset;                 /* Dataset ID */
+    herr_t  ret_value = -1;
+    hid_t   dset = -1;                 /* Dataset ID */
 
     /*----------------------------------------------------------
      * STEP 1: Test deflation by itself.
      *----------------------------------------------------------
      */
-#ifdef H5_HAVE_FILTER_DEFLATE
-    TESTING("Testing deflate filter");
+    TESTING("deflate filter");
 
+#ifdef H5_HAVE_FILTER_DEFLATE
     if(H5Zfilter_avail(H5Z_FILTER_DEFLATE) != TRUE) TEST_ERROR
 
     if((dset = H5Dopen2(file,DSET_DEFLATE_NAME,H5P_DEFAULT)) < 0) TEST_ERROR
@@ -490,18 +472,17 @@ test_read_with_filters(hid_t file)
 
     /* Clean up objects used for this test */
 #else /* H5_HAVE_FILTER_DEFLATE */
-    TESTING("deflate filter");
     SKIPPED();
-    puts("    Deflate filter not enabled");
+    HDputs("    Deflate filter not enabled");
 #endif /* H5_HAVE_FILTER_DEFLATE */
 
     /*----------------------------------------------------------
      * STEP 2: Test DYNLIB1 by itself.
      *----------------------------------------------------------
      */
-    TESTING("Testing DYNLIB1 filter");
+    TESTING("    DYNLIB1 filter");
 
-    if((dset = H5Dopen2(file,DSET_DYNLIB1_NAME,H5P_DEFAULT)) < 0) TEST_ERROR
+    if((dset = H5Dopen2(file, DSET_DYNLIB1_NAME, H5P_DEFAULT)) < 0) TEST_ERROR
 
     if(test_read_data(dset, (int *)points_dynlib1) < 0) TEST_ERROR
 
@@ -511,35 +492,53 @@ test_read_with_filters(hid_t file)
      * STEP 3: Test Bogus2 by itself.
      *----------------------------------------------------------
      */
-    TESTING("Testing DYNLIB2 filter");
+    TESTING("    DYNLIB2 filter");
 
-    if((dset = H5Dopen2(file,DSET_DYNLIB2_NAME,H5P_DEFAULT)) < 0) TEST_ERROR
+    if((dset = H5Dopen2(file, DSET_DYNLIB2_NAME, H5P_DEFAULT)) < 0) TEST_ERROR
 
     if(test_read_data(dset, (int *)points_dynlib2) < 0) TEST_ERROR
 
     if(H5Dclose(dset) < 0) TEST_ERROR
 
-    return 0;
+    /*----------------------------------------------------------
+     * STEP 4: Test DYNLIB4 by itself.
+     *----------------------------------------------------------
+     */
+    TESTING("    DYNLIB4 filter");
+
+    if((dset = H5Dopen2(file,DSET_DYNLIB4_NAME,H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(test_read_data(dset, (int *)points_dynlib4) < 0) TEST_ERROR
+
+    if(H5Dclose(dset) < 0) TEST_ERROR
+
+    ret_value = 0;
 
 error:
-    return -1;
+    /* Clean up objects used for this test */
+    H5E_BEGIN_TRY {
+        H5Dclose(dset);
+    } H5E_END_TRY
+
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:    test_noread_data
+ * Function:  test_noread_data
  *
- * Purpose: Tests not reading data
+ * Purpose:   Tests not reading data
  *
- * Return:  Success:    0
- *      Failure:    -1
+ * Return:    Success:    0
+ *            Failure:    -1
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_noread_data(hid_t dataset)
 {
+    herr_t     ret_value = -1;
     int        check[DSET_DIM1][DSET_DIM2];
-    herr_t     ret;
+    herr_t     ret = -1;
 
     /* Read the dataset back */
     H5E_BEGIN_TRY {
@@ -549,113 +548,122 @@ test_noread_data(hid_t dataset)
         TEST_ERROR
 
     PASSED();
-    return 0;
+    ret_value = 0;
 
 error:
-    return -1;
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_noread_with_filters
- *
- * Purpose:	Tests reading dataset created with dynamically loaded filters disabled
+ * Function:  test_noread_with_filters
  *
- * Return:	Success:	0
- *		Failure:	-1
+ * Purpose:   Tests reading dataset created with dynamically loaded filters disabled
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_noread_with_filters(hid_t file)
 {
-    hid_t	dset;                 /* Dataset ID */
-    unsigned     plugin_state;         /* status of plugins */
-    TESTING("Testing DYNLIB1 filter with plugins disabled");
+    herr_t      ret_value = -1;
+    hid_t       dset = -1;            /* Dataset ID */
+    unsigned    plugin_state;         /* status of plugins */
+
+    TESTING("DYNLIB1 filter with plugins disabled");
 
     /* disable filter plugin */
     if(H5PLget_loading_state(&plugin_state) < 0) TEST_ERROR
     plugin_state = plugin_state & ~H5PL_FILTER_PLUGIN;
     if(H5PLset_loading_state(plugin_state) < 0) TEST_ERROR
 
-    if((dset = H5Dopen2(file,DSET_DYNLIB1_NAME,H5P_DEFAULT)) < 0) TEST_ERROR
+    if((dset = H5Dopen2(file, DSET_DYNLIB1_NAME, H5P_DEFAULT)) < 0) TEST_ERROR
 
     if(test_noread_data(dset) < 0) TEST_ERROR
 
     if(H5Dclose(dset) < 0) TEST_ERROR
 
-    /* re-enable filter plugin */
-    plugin_state = plugin_state | H5PL_FILTER_PLUGIN;
-    if(H5PLset_loading_state(plugin_state) < 0) TEST_ERROR
-
-    return 0;
+    ret_value = 0;
 
 error:
     /* re-enable filter plugin */
     plugin_state = plugin_state | H5PL_FILTER_PLUGIN;
-    if(H5PLset_loading_state(plugin_state) < 0) TEST_ERROR
-    return -1;
+    H5PLset_loading_state(plugin_state);
+
+    /* Clean up objects used for this test */
+    H5E_BEGIN_TRY {
+        H5Dclose(dset);
+    } H5E_END_TRY
+
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_filters_for_groups
- *
- * Purpose:	Tests creating group with dynamically loaded filters
- *
- * Return:	Success:	0
- *		Failure:	-1
+ * Function:  test_filters_for_groups
  *
- * Programmer:	Raymond Lu
- *              1 April 2013
+ * Purpose:   Tests creating group with dynamically loaded filters
  *
+ * Return:    Success:    0
+ *            Failure:    -1
  *-------------------------------------------------------------------------
  */
 static herr_t
 test_filters_for_groups(hid_t file)
 {
-    hid_t	gcpl, gid, group;
-    int         i;
-    char        gname[256];
+    herr_t   ret_value = -1;
+    hid_t    gcpl = -1;
+    hid_t    gid = -1;
+    hid_t    group = -1;
+    int      i;
+    char     gname[256];
 
-    TESTING("Testing DYNLIB3 filter for group");
+    TESTING("DYNLIB3 filter for group");
 
-    if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) goto error;
-  
-    /* Use DYNLIB3 for creating groups */ 
-    if(H5Pset_filter (gcpl, H5Z_FILTER_DYNLIB3, H5Z_FLAG_MANDATORY, (size_t)0, NULL) < 0) goto error;
+    if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR
+
+    /* Use DYNLIB3 for creating groups */
+    if(H5Pset_filter (gcpl, H5Z_FILTER_DYNLIB3, H5Z_FLAG_MANDATORY, (size_t)0, NULL) < 0) TEST_ERROR
 
     /* Create a group using this filter */
-    if((gid = H5Gcreate2(file, "group1", H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0) goto error;
+    if((gid = H5Gcreate2(file, "group1", H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Create multiple groups under "group1" */
-    for (i=0; i < GROUP_ITERATION; i++) {
-        sprintf(gname, "group_%d", i);
-        if((group = H5Gcreate2(gid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
-        if(H5Gclose(group) < 0) goto error; 
+    for(i=0; i < GROUP_ITERATION; i++) {
+        HDsprintf(gname, "group_%d", i);
+        if((group = H5Gcreate2(gid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
+        if(H5Gclose(group) < 0) TEST_ERROR
     }
 
     /* Close the group */
-    if(H5Gclose(gid) < 0) goto error;
+    if(H5Gclose(gid) < 0) TEST_ERROR
 
     /* Clean up objects used for this test */
-    if(H5Pclose (gcpl) < 0) goto error;
+    if(H5Pclose(gcpl) < 0) TEST_ERROR
 
     PASSED();
 
-    return 0;
+    ret_value = 0;
 
 error:
-    return -1;
+    /* Clean up objects used for this test */
+    H5E_BEGIN_TRY {
+        H5Gclose(group);
+        H5Gclose(gid);
+        H5Pclose(gcpl);
+    } H5E_END_TRY
+
+    return ret_value;
 }
 
 /*-------------------------------------------------------------------------
- * Function:	test_groups_with_filters
+ * Function:    test_groups_with_filters
  *
- * Purpose:	Tests opening group with dynamically loaded filters
+ * Purpose:    Tests opening group with dynamically loaded filters
  *
- * Return:	Success:	0
- *		Failure:	-1
+ * Return:    Success:    0
+ *        Failure:    -1
  *
- * Programmer:	Raymond Lu
+ * Programmer:    Raymond Lu
  *              1 April 2013
  *
  *-------------------------------------------------------------------------
@@ -663,70 +671,323 @@ error:
 static herr_t
 test_groups_with_filters(hid_t file)
 {
-    hid_t	gid, group;
+    herr_t      ret_value = -1;
+    hid_t       gid;
+    hid_t       group;
     int         i;
     char        gname[256];
 
-    TESTING("Testing opening groups with DYNLIB3 filter");
+    TESTING("opening groups with DYNLIB3 filter");
 
     /* Open the top group */
-    if((gid = H5Gopen2(file, "group1", H5P_DEFAULT)) < 0) goto error;
+    if((gid = H5Gopen2(file, "group1", H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Create multiple groups under "group1" */
-    for (i=0; i < GROUP_ITERATION; i++) {
-        sprintf(gname, "group_%d", i);
-        if((group = H5Gopen2(gid, gname, H5P_DEFAULT)) < 0) goto error;
-        if(H5Gclose(group) < 0) goto error; 
+    for(i=0; i < GROUP_ITERATION; i++) {
+        HDsprintf(gname, "group_%d", i);
+        if((group = H5Gopen2(gid, gname, H5P_DEFAULT)) < 0) TEST_ERROR
+        if(H5Gclose(group) < 0) TEST_ERROR
     }
 
     /* Close the group */
-    if(H5Gclose(gid) < 0) goto error;
+    if(H5Gclose(gid) < 0) TEST_ERROR
 
     PASSED();
 
-    return 0;
+    ret_value = 0;
+
+error:
+    /* Clean up objects used for this test */
+    H5E_BEGIN_TRY {
+        H5Gclose(group);
+        H5Gclose(gid);
+    } H5E_END_TRY
+
+    return ret_value;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:  test_filter_path_apis
+ *
+ * Purpose:   Tests accessing the path table for dynamically loaded filters
+ *
+ * Return:    Success:    0
+ *            Failure:    -1
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_filter_path_apis(void)
+{
+    herr_t       ret_value = -1;
+    unsigned int i;
+    unsigned int ndx;
+    herr_t       ret;
+    ssize_t      pathlen = -1;
+    char         pathname[256];
+    char         tempname[256];
+
+    HDputs("Testing access to the filter path table");
+
+    if(H5Zfilter_avail(H5Z_FILTER_DYNLIB1) != TRUE) TEST_ERROR
+
+    H5PLsize(&ndx);
+
+    TESTING("    remove");
+    /* Remove all existing paths*/
+    for(i=ndx; i > 0; i--)
+        if(H5PLremove(i-1) < 0) {
+            HDfprintf(stderr,"    at %d: %s\n", i, pathname);
+            TEST_ERROR
+        } /* end if */
+    /* Verify the table is empty */
+    H5PLsize(&ndx);
+    if(ndx > 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    remove (exceed min)");
+    /* Exceed the min path removal */
+    H5E_BEGIN_TRY {
+        ret = H5PLremove(0);
+    } H5E_END_TRY
+    if(ret >= 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    append");
+    /* Create multiple paths to fill table */
+    for(i=0; i < H5PL_MAX_PATH_NUM; i++) {
+        HDsprintf(pathname, "a_path_%d", i);
+        if(H5PLappend(pathname) < 0) {
+            HDfprintf(stderr,"    at %d: %s\n", i, pathname);
+            TEST_ERROR
+        }
+    }
+    /* Verify the table is full */
+    H5PLsize(&ndx);
+    if(ndx != H5PL_MAX_PATH_NUM) TEST_ERROR
+    PASSED();
+
+    TESTING("    append (exceed)");
+    /* Exceed the max path append */
+    H5E_BEGIN_TRY {
+        HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM);
+        ret = H5PLappend(pathname);
+    } H5E_END_TRY
+    if(ret >= 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    remove (exceed max)");
+    /* Exceed the max path removal */
+    H5E_BEGIN_TRY {
+        ret = H5PLremove(H5PL_MAX_PATH_NUM);
+    } H5E_END_TRY
+    if(ret >= 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    get (path name)");
+    if((pathlen = H5PLget(0, NULL, 0)) <= 0) {
+        HDfprintf(stderr,"    get path 0 length failed\n");
+        TEST_ERROR
+    }
+    if(pathlen != 8) TEST_ERROR
+
+    if((pathlen = H5PLget(0, pathname, 256)) <= 0) {
+        HDfprintf(stderr,"    get 0 len: %d : %s\n", pathlen, pathname);
+        TEST_ERROR
+    }
+    if(HDstrcmp(pathname, "a_path_0") != 0) {
+        HDfprintf(stderr,"    get 0: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    TESTING("    get (bounds)");
+    if((pathlen = H5PLget(1, pathname, 256)) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_1") != 0) {
+        HDfprintf(stderr,"    get 1: %s\n", pathname);
+        TEST_ERROR
+    }
+    if((pathlen = H5PLget(H5PL_MAX_PATH_NUM - 1, pathname, 256)) <= 0) TEST_ERROR
+    HDsprintf(tempname, "a_path_%d", H5PL_MAX_PATH_NUM - 1);
+    if(HDstrcmp(pathname, tempname) != 0) {
+        HDfprintf(stderr,"    get %d: %s\n", H5PL_MAX_PATH_NUM - 1, pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    TESTING("    get (bounds exceed)");
+    H5E_BEGIN_TRY {
+        pathlen = H5PLget(H5PL_MAX_PATH_NUM, NULL, 0);
+    } H5E_END_TRY
+    if(pathlen > 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    remove (verify for prepend)");
+    /* Remove one path*/
+    if(H5PLremove(8) < 0) TEST_ERROR
+
+    /* Verify that the entries were moved */
+    if((pathlen = H5PLget(8, pathname, 256)) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_9") != 0) {
+        HDfprintf(stderr,"    get 8: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    /* Verify the table is not full */
+    H5PLsize(&ndx);
+    if (ndx != H5PL_MAX_PATH_NUM - 1) TEST_ERROR
+
+    TESTING("    prepend");
+    /* Prepend one path*/
+    HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM + 1);
+    if(H5PLprepend(pathname) < 0) {
+        HDfprintf(stderr,"    prepend %d: %s\n", H5PL_MAX_PATH_NUM + 1, pathname);
+        TEST_ERROR
+    }
+
+    /* Verify the table is full */
+    H5PLsize(&ndx);
+    if(ndx != H5PL_MAX_PATH_NUM) TEST_ERROR
+
+    /* Verify that the entries were moved */
+    if(H5PLget(8, pathname, 256) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_7") != 0) {
+        HDfprintf(stderr,"    get 8: %s\n", pathname);
+        TEST_ERROR
+    }
+    if(H5PLget(0, pathname, 256) <= 0) TEST_ERROR
+    HDsprintf(tempname, "a_path_%d", H5PL_MAX_PATH_NUM + 1);
+    if(HDstrcmp(pathname, tempname) != 0) {
+        HDfprintf(stderr,"    get 0: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    TESTING("    prepend (exceed)");
+    /* Exceed the max path prepend */
+    H5E_BEGIN_TRY {
+        HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM + 2);
+        ret = H5PLprepend(pathname);
+    } H5E_END_TRY
+    if(ret >= 0) TEST_ERROR
+    PASSED();
+
+    TESTING("    replace");
+    /* Replace one path*/
+    HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM + 4);
+    if(H5PLreplace(pathname, 1) < 0) {
+        HDfprintf(stderr,"    replace 1: %s\n", pathname);
+        TEST_ERROR
+    }
+
+    /* Verify the table is full */
+    H5PLsize(&ndx);
+    if(ndx != H5PL_MAX_PATH_NUM) TEST_ERROR
+
+    /* Verify that the entries were not moved */
+    if(H5PLget(0, pathname, 256) <= 0) TEST_ERROR
+    HDsprintf(tempname, "a_path_%d", H5PL_MAX_PATH_NUM + 1);
+    if(HDstrcmp(pathname, tempname) != 0) {
+        HDfprintf(stderr,"    get 0: %s\n", pathname);
+        TEST_ERROR
+    }
+    if(H5PLget(2, pathname, 256) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_1") != 0) {
+        HDfprintf(stderr,"    get 2: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    TESTING("    remove (verify for insert)");
+    /* Remove one path*/
+    if(H5PLremove(4) < 0) TEST_ERROR
+
+    /* Verify that the entries were moved */
+    if(H5PLget(4, pathname, 256) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_4") != 0) {
+        HDfprintf(stderr,"    get 4: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    /* Verify the table is not full */
+    H5PLsize(&ndx);
+    if(ndx != 15) TEST_ERROR
+
+    TESTING("    insert");
+    /* Insert one path*/
+    HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM + 5);
+    if(H5PLinsert(pathname, 3) < 0) {
+        HDfprintf(stderr,"    insert 3: %s\n", pathname);
+        TEST_ERROR
+    }
+
+    /* Verify that the entries were moved */
+    if(H5PLget(4, pathname, 256) <= 0) TEST_ERROR
+    if(HDstrcmp(pathname, "a_path_2") != 0) {
+        HDfprintf(stderr,"    get 4: %s\n", pathname);
+        TEST_ERROR
+    }
+    PASSED();
+
+    /* Verify the table is full */
+    H5PLsize(&ndx);
+    if(ndx != H5PL_MAX_PATH_NUM) TEST_ERROR
+
+    TESTING("    insert (exceed)");
+    /* Exceed the max path insert */
+    H5E_BEGIN_TRY {
+        HDsprintf(pathname, "a_path_%d", H5PL_MAX_PATH_NUM + 6);
+        ret = H5PLinsert(pathname, 12);
+    } H5E_END_TRY
+    if(ret >= 0) TEST_ERROR
+
+    PASSED();
+
+    ret_value = 0;
 
 error:
-    return -1;
+    return ret_value;
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:	main
+ * Function:    main
  *
- * Purpose:	Tests the plugin module (H5PL)
+ * Purpose:    Tests the plugin module (H5PL)
  *
- * Return:	Success:	exit(0)
+ * Return:    Success:    exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(1)
+ *        Failure:    exit(EXIT_FAILURE)
  *
- * Programmer:	Raymond Lu
- *		14 March 2013
+ * Programmer:    Raymond Lu
+ *        14 March 2013
  *
  *-------------------------------------------------------------------------
  */
 int
 main(void)
 {
-    char		filename[FILENAME_BUF_SIZE];
-    hid_t		file, fapl, fapl2;
-    unsigned new_format;
-    int mdc_nelmts;
-    size_t rdcc_nelmts;
-    size_t rdcc_nbytes;
-    double rdcc_w0;
-    int	nerrors = 0;
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       file = -1;
+    hid_t       fapl = -1;
+    hid_t       fapl2 = -1;
+    unsigned    new_format;
+    int         mdc_nelmts;
+    size_t      rdcc_nelmts;
+    size_t      rdcc_nbytes;
+    double      rdcc_w0;
+    int         nerrors = 0;
 
     /* Testing setup */
     h5_reset();
     fapl = h5_fileaccess();
 
     /* Turn off the chunk cache, so all the chunks are immediately written to disk */
-    if(H5Pget_cache(fapl, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0) < 0)
-        TEST_ERROR 
+    if(H5Pget_cache(fapl, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0) < 0) TEST_ERROR
     rdcc_nbytes = 0;
-    if(H5Pset_cache(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0) < 0)
-        TEST_ERROR 
+    if(H5Pset_cache(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0) < 0) TEST_ERROR
 
     /* Copy the file access property list */
     if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
@@ -742,50 +1003,47 @@ main(void)
 
         /* Set the FAPL for the type of format */
         if(new_format) {
-            puts("\nTesting with new file format:");
+            HDputs("\nTesting with new file format:");
             my_fapl = fapl2;
         } /* end if */
         else {
-            puts("Testing with old file format:");
+            HDputs("Testing with old file format:");
             my_fapl = fapl;
         } /* end else */
 
         /* Create the file for this test */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, my_fapl)) < 0)
-            TEST_ERROR 
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, my_fapl)) < 0) TEST_ERROR
 
         /* Test dynamically loaded filters for chunked dataset */
-        nerrors += (test_filters_for_datasets(file) < 0	? 1 : 0);
+        nerrors += (test_filters_for_datasets(file) < 0    ? 1 : 0);
 
         /* Test dynamically loaded filters for groups */
         nerrors += (test_filters_for_groups(file) < 0 ? 1 : 0);
 
-        if(H5Fclose(file) < 0)
-            TEST_ERROR 
+        if(H5Fclose(file) < 0) TEST_ERROR
     } /* end for */
 
     /* Close FAPL */
     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:");
+    HDputs("\nTesting reading data with with dynamic plugin filters:");
 
     /* Close the library so that all loaded plugin libraries are unloaded */
     h5_reset();
     fapl = h5_fileaccess();
 
     /* Reopen the file for testing data reading */
-    if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
-        TEST_ERROR 
+    if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
 
     /* Read the data with filters */
-    nerrors += (test_read_with_filters(file) < 0		? 1 : 0);
+    nerrors += (test_read_with_filters(file) < 0 ? 1 : 0);
 
     /* Open the groups with filters */
-    nerrors += (test_groups_with_filters(file) < 0	? 1 : 0);
+    nerrors += (test_groups_with_filters(file) < 0  ? 1 : 0);
 
     /* Restore the default error handler (set in h5_reset()) */
     h5_restore_err();
@@ -795,26 +1053,26 @@ main(void)
     fapl = h5_fileaccess();
 
     /* Reopen the file for testing data reading */
-    if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
-        TEST_ERROR
+    if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
 
     /* Read the data with disabled filters */
     nerrors += (test_noread_with_filters(file) < 0  ? 1 : 0);
 
-    if(H5Fclose(file) < 0)
-        TEST_ERROR 
+    if(H5Fclose(file) < 0) TEST_ERROR
+
+    /* Test the APIs for access to the filter plugin path table */
+    nerrors += (test_filter_path_apis() < 0  ? 1 : 0);
+
+    if(nerrors) TEST_ERROR
 
-    if(nerrors)
-        TEST_ERROR 
-    printf("All plugin tests passed.\n");
+    HDprintf("All plugin tests passed.\n");
     h5_cleanup(FILENAME, fapl);
 
     return 0;
 
 error:
     nerrors = MAX(1, nerrors);
-    printf("***** %d PLUGIN TEST%s FAILED! *****\n",
-            nerrors, 1 == nerrors ? "" : "S");
+    HDprintf("***** %d PLUGIN TEST%s FAILED! *****\n", nerrors, 1 == nerrors ? "" : "S");
     return 1;
 }
 
diff --git a/test/pool.c b/test/pool.c
index 83c862b..1851d6e 100644
--- a/test/pool.c
+++ b/test/pool.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
@@ -671,7 +669,7 @@ HDfprintf(stderr,"curr_time=%lu\n",(unsigned long)curr_time);
 
     /* Shuffle pointers to free */
     for(u = 0; u < MPOOL_NUM_RANDOM; u++) {
-        swap_idx = (size_t)(HDrandom() % (MPOOL_NUM_RANDOM - u)) + u;
+        swap_idx = (size_t)(HDrandom() % (int)(MPOOL_NUM_RANDOM - u)) + u;
         swap_ptr = spc[u];
         spc[u] = spc[swap_idx];
         spc[swap_idx] = swap_ptr;
diff --git a/test/reserved.c b/test/reserved.c
index bb6d328..d8d0c59 100644
--- a/test/reserved.c
+++ b/test/reserved.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5test.h"
diff --git a/test/set_extent.c b/test/set_extent.c
index 999a8ef..b9536e5 100644
--- a/test/set_extent.c
+++ b/test/set_extent.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -139,6 +137,15 @@ int main( void )
     unsigned new_format;         /* Whether to use the latest file format */
     unsigned chunk_cache;        /* Whether to enable chunk caching */
     int	  nerrors = 0;
+    const char  *env_h5_drvr;	/* File Driver value from environment */
+    hbool_t contig_addr_vfd;    /* Whether VFD used has a contigous address space */
+
+
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+    /* Current VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
 
     /* Initialize random number seed */
     HDsrandom((unsigned)HDtime(NULL));
@@ -194,12 +201,15 @@ int main( void )
                         H5F_LIBVER_LATEST) < 0) TEST_ERROR
 
             /* Tests which use chunked datasets */
-            nerrors += do_ranks( my_fapl, new_format ) < 0 ? 1 : 0;
+	    if(!new_format || (new_format && contig_addr_vfd))
+		nerrors += do_ranks( my_fapl, new_format ) < 0 ? 1 : 0;
         } /* end for */
 
         /* Tests which do not use chunked datasets */
-        nerrors += test_external( fapl ) < 0 ? 1 : 0;
-        nerrors += do_layouts( fapl ) < 0 ? 1 : 0;
+	if(!new_format || (new_format && contig_addr_vfd)) {
+	    nerrors += test_external( fapl ) < 0 ? 1 : 0;
+	    nerrors += do_layouts( fapl ) < 0 ? 1 : 0;
+	}
     } /* end for */
 
     /* Close 2nd FAPL */
@@ -348,11 +358,9 @@ static int do_ranks( hid_t fapl, hbool_t new_format )
 
         /* Iterate over different index types, but only if using the new format
          */
-        for(index_type = RANK4_INDEX_BTREE; index_type < RANK4_NINDICES;
-                index_type++) {
+        for(index_type = RANK4_INDEX_BTREE; index_type < RANK4_NINDICES; H5_INC_ENUM(rank4_index_t, index_type)) {
             /* Standard test */
-            if(test_random_rank4(fapl, dcpl, do_fillvalue, disable_edge_filters,
-                    FALSE, index_type) < 0) {
+            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"
@@ -472,7 +480,6 @@ static int test_rank1( hid_t fapl,
     else
         comp_value = 0;
 
-
     for(i = 0; i < DIM0; i++ )
         buf_o[i] = 2;
 
@@ -495,13 +502,13 @@ static int test_rank1( hid_t fapl,
         TEST_ERROR
 
     /* create the data space with unlimited dimensions. */
-    if ((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0)
+    if((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0)
         TEST_ERROR
 
     /* modify dataset creation properties, i.e. enable chunking. */
-    if ((my_dcpl = H5Pcopy (dcpl)) < 0)
+    if((my_dcpl = H5Pcopy (dcpl)) < 0)
         TEST_ERROR
-    if (H5Pset_chunk(my_dcpl, RANK1, dims_c) < 0)
+    if(H5Pset_chunk(my_dcpl, RANK1, dims_c) < 0)
         TEST_ERROR
     if(disable_edge_filters)
         if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
@@ -527,7 +534,7 @@ static int test_rank1( hid_t fapl,
     printf("\n");
 #endif
 
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /*-------------------------------------------------------------------------
@@ -536,18 +543,18 @@ static int test_rank1( hid_t fapl,
      */
 
     /* set new dimensions for the array. */
-    if (H5Dset_extent(did , dims_e) < 0)
+    if(H5Dset_extent(did , dims_e) < 0)
         TEST_ERROR
 
     /* get the space */
-    if ((sid = H5Dget_space(did)) < 0)
+    if((sid = H5Dget_space(did)) < 0)
         TEST_ERROR
 
     /* get dimensions */
-    if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
+    if(H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
         TEST_ERROR
 
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /* check dimensions */
@@ -589,18 +596,18 @@ static int test_rank1( hid_t fapl,
      */
 
     /* set new dimensions for the array. */
-    if (H5Dset_extent(did , dims_s) < 0)
+    if(H5Dset_extent(did , dims_s) < 0)
         TEST_ERROR
 
     /* get the space */
-    if ((sid = H5Dget_space(did)) < 0)
+    if((sid = H5Dget_space(did)) < 0)
         TEST_ERROR
 
     /* get dimensions */
-    if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
+    if(H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
         TEST_ERROR
 
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /* check dimensions */
@@ -609,16 +616,16 @@ static int test_rank1( hid_t fapl,
             TEST_ERROR
 
     /* for this case we close and reopen file */
-    if ( set_istore_k ) {
-        if (H5Dclose(did) < 0)
+    if(set_istore_k) {
+        if(H5Dclose(did) < 0)
             TEST_ERROR
-        if (H5Fclose(fid) < 0)
+        if(H5Fclose(fid) < 0)
             TEST_ERROR
 
-        if ((fid = H5Fopen( filename, H5F_ACC_RDWR, fapl ))<0)
+        if((fid = H5Fopen( filename, H5F_ACC_RDWR, fapl ))<0)
             TEST_ERROR
 
-        if ((did = H5Dopen2( fid , "dset1", H5P_DEFAULT ))<0)
+        if((did = H5Dopen2( fid , "dset1", H5P_DEFAULT ))<0)
             TEST_ERROR
     } /* end if */
 
@@ -629,7 +636,7 @@ static int test_rank1( hid_t fapl,
      */
 
     /* read */
-    if (H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_s ) < 0)
+    if(H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_s ) < 0)
         TEST_ERROR
 
 #if defined (H5_SET_EXTENT_DEBUG)
@@ -641,7 +648,7 @@ static int test_rank1( hid_t fapl,
 
     /* compare the read array with the shrinked array */
     for( i = 0; i < (int)dims_r[0]; i++ )
-        if (  buf_s[i] != buf_o[i] ) {
+        if(buf_s[i] != buf_o[i]) {
             printf("buf_s[%d] = %d\n", i, buf_s[i]);
             printf("buf_o[%d] = %d\n", i, buf_o[i]);
             TEST_ERROR
@@ -653,18 +660,18 @@ static int test_rank1( hid_t fapl,
      */
 
     /* set new dimensions for the array */
-    if (H5Dset_extent(did, dims_o) < 0)
+    if(H5Dset_extent(did, dims_o) < 0)
         TEST_ERROR
 
     /* get the space */
-    if ((sid = H5Dget_space(did)) < 0)
+    if((sid = H5Dget_space(did)) < 0)
         TEST_ERROR
 
     /* get dimensions. */
-    if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
+    if(H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
         TEST_ERROR
 
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /* check dimensions */
@@ -673,7 +680,7 @@ static int test_rank1( hid_t fapl,
             TEST_ERROR
 
     /* read */
-    if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0)
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0)
         TEST_ERROR
 
 #if defined (H5_SET_EXTENT_DEBUG)
@@ -684,8 +691,8 @@ static int test_rank1( hid_t fapl,
 #endif
 
     /* compare the read array with the original array */
-    for (i = 0; i < (int)dims_r[0]; i++ )
-        if (i >= DIMS0 ) {
+    for(i = 0; i < (int)dims_r[0]; i++ )
+        if(i >= DIMS0 ) {
             if(buf_r[i] != comp_value) {
                 printf("buf_r[%d] = %d\n", i, buf_r[i] );
                 printf("expected = %d\n", comp_value);
@@ -706,22 +713,22 @@ static int test_rank1( hid_t fapl,
     dims_s[0] = 0;
 
     /* set new dimensions for the array. */
-    if (H5Dset_extent(did , dims_s) < 0)
+    if(H5Dset_extent(did , dims_s) < 0)
         TEST_ERROR
 
     /* get the space */
-    if ((sid = H5Dget_space(did)) < 0)
+    if((sid = H5Dget_space(did)) < 0)
         TEST_ERROR
 
     /* get dimensions */
-    if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
+    if(H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0)
         TEST_ERROR
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /* check dimensions */
     for( i = 0; i < RANK1; i++ )
-        if (dims_r[i] != dims_s[i])
+        if(dims_r[i] != dims_s[i])
             TEST_ERROR
 
     /*-------------------------------------------------------------------------
@@ -729,7 +736,7 @@ static int test_rank1( hid_t fapl,
      *-------------------------------------------------------------------------
      */
 
-    if (H5Dclose(did) < 0)
+    if(H5Dclose(did) < 0)
         TEST_ERROR
 
     /*-------------------------------------------------------------------------
@@ -738,27 +745,28 @@ static int test_rank1( hid_t fapl,
      */
 
 
-    if ((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0)
+    if((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0)
         TEST_ERROR
-    if ((did = H5Dcreate2(fid , "dset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, my_dcpl, H5P_DEFAULT)) < 0)
+    if((did = H5Dcreate2(fid , "dset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, my_dcpl, H5P_DEFAULT)) < 0)
         TEST_ERROR
+
     /* set new dimensions for the array */
     dims_o[ 0 ] = 0;
-    if (H5Dset_extent( did , dims_o ) < 0)
+    if(H5Dset_extent( did , dims_o ) < 0)
         TEST_ERROR
 
-    if (H5Dclose(did) < 0)
+    if(H5Dclose(did) < 0)
         TEST_ERROR
-    if (H5Sclose(sid) < 0)
+    if(H5Sclose(sid) < 0)
         TEST_ERROR
 
     /*-------------------------------------------------------------------------
      * close property list
      *-------------------------------------------------------------------------
      */
-    if (H5Pclose(my_dcpl) < 0)
+    if(H5Pclose(my_dcpl) < 0)
         TEST_ERROR
-    if (H5Fclose( fid ) < 0)
+    if(H5Fclose(fid) < 0)
         TEST_ERROR
 
     return 0;
@@ -2593,13 +2601,6 @@ static int test_random_rank4( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
     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)
@@ -2804,12 +2805,6 @@ static int test_random_rank4_vl( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
     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;
diff --git a/test/space_overflow.c b/test/space_overflow.c
index f0e5e1d..15be9ba 100644
--- a/test/space_overflow.c
+++ b/test/space_overflow.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/stab.c b/test/stab.c
index f81bb5f..97abc16 100644
--- a/test/stab.c
+++ b/test/stab.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -96,7 +94,7 @@ const char *FILENAME[] = {
  *-------------------------------------------------------------------------
  */
 static int
-test_misc(hid_t fapl, hbool_t new_format)
+test_misc(hid_t fcpl, hid_t fapl, hbool_t new_format)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t	g1 = (-1), g2 = (-1), g3 = (-1);
@@ -110,7 +108,7 @@ test_misc(hid_t fapl, hbool_t new_format)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) TEST_ERROR
 
     /* Create initial groups for testing, then close */
     if((g1 = H5Gcreate2(fid, "test_1a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -177,7 +175,7 @@ test_misc(hid_t fapl, hbool_t new_format)
  *-------------------------------------------------------------------------
  */
 static int
-test_long(hid_t fapl, hbool_t new_format)
+test_long(hid_t fcpl, hid_t fapl, hbool_t new_format)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t       g1 = (-1), g2 = (-1);
@@ -192,7 +190,7 @@ test_long(hid_t fapl, hbool_t new_format)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) TEST_ERROR
 
     /* Group names */
     name1 = (char *)HDmalloc((size_t)LONG_NAME_LEN);
@@ -252,7 +250,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static int
-test_large(hid_t fapl, hbool_t new_format)
+test_large(hid_t fcpl, hid_t fapl, hbool_t new_format)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t       cwg = (-1), dir = (-1); /* Group IDs */
@@ -267,7 +265,7 @@ test_large(hid_t fapl, hbool_t new_format)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) TEST_ERROR
 
     /*
      * Create a directory that has so many entries that the root
@@ -318,7 +316,7 @@ test_large(hid_t fapl, hbool_t new_format)
  *-------------------------------------------------------------------------
  */
 static int
-lifecycle(hid_t fapl2)
+lifecycle(hid_t fcpl, hid_t fapl2)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t	gid = (-1);             /* Group ID */
@@ -341,7 +339,7 @@ lifecycle(hid_t fapl2)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 0) TEST_ERROR
 
     /* Close file */
     if(H5Fclose(fid) < 0) TEST_ERROR
@@ -532,7 +530,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static int
-long_compact(hid_t fapl2)
+long_compact(hid_t fcpl, hid_t fapl2)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t	gid = (-1);             /* Group ID */
@@ -546,7 +544,7 @@ long_compact(hid_t fapl2)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 0) TEST_ERROR
 
     /* Close file */
     if(H5Fclose(fid) < 0) TEST_ERROR
@@ -755,7 +753,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static int
-no_compact(hid_t fapl2)
+no_compact(hid_t fcpl, hid_t fapl2)
 {
     hid_t	fid = (-1);             /* File ID */
     hid_t	gid = (-1);             /* Group ID */
@@ -772,7 +770,7 @@ no_compact(hid_t fapl2)
 
     /* Create file */
     h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 0) TEST_ERROR
 
     /* Close file */
     if(H5Fclose(fid) < 0) TEST_ERROR
@@ -1165,9 +1163,20 @@ error:
 int
 main(void)
 {
-    hid_t	fapl, fapl2;    /* File access property list IDs */
-    unsigned new_format;    /* Whether to use the new format or not */
-    int	nerrors = 0;
+    hid_t	fapl, fapl2;    	/* File access property list IDs */
+    hid_t	fcpl, fcpl2;    	/* File creation property list ID */
+    unsigned 	new_format;     	/* Whether to use the new format or not */
+    const char  *env_h5_drvr;      	/* File Driver value from environment */
+    hbool_t 	contig_addr_vfd; 	/* Whether VFD used has a contigous address space */
+    int		nerrors = 0;
+
+    /* Get the VFD to use */
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+
+    /* VFD that does not support contigous address space */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
 
     /* Reset library */
     h5_reset();
@@ -1179,20 +1188,42 @@ main(void)
     /* 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
 
+    /* Set up file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) TEST_ERROR
+    if((fcpl2 = H5Pcopy(fcpl)) < 0) TEST_ERROR
+    
+    /* Set to use paged aggregation strategy and persisting free-space */
+    /* Skip testing for multi/split drivers */
+    if(H5Pset_file_space_strategy(fcpl2, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)1) < 0)
+        TEST_ERROR
+
     /* Loop over using new group format */
     for(new_format = FALSE; new_format <= TRUE; new_format++) {
+        hid_t my_fapl = fapl;
+        hid_t my_fcpl = fcpl;
+
+        if(!contig_addr_vfd)
+            continue;
+
+        if(new_format) {
+            my_fapl = fapl2;
+            my_fcpl = fcpl2;    /* Set to use paged aggregation and persisting free-space */
+        }
+
         /* Perform basic tests, with old & new style groups */
-        nerrors += test_misc((new_format ? fapl2 : fapl), new_format);
-        nerrors += test_long((new_format ? fapl2 : fapl), new_format);
-        nerrors += test_large((new_format ? fapl2 : fapl), new_format);
+        nerrors += test_misc(my_fcpl, my_fapl, new_format);
+        nerrors += test_long(my_fcpl, my_fapl, new_format);
+        nerrors += test_large(my_fcpl, my_fapl, new_format);
     } /* end for */
 
     /* New format group specific tests (require new format features) */
-    nerrors += lifecycle(fapl2);
-    nerrors += long_compact(fapl2);
-    nerrors += read_old();
-    nerrors += no_compact(fapl2);
-    nerrors += gcpl_on_root(fapl2);
+    if(contig_addr_vfd) {
+        nerrors += lifecycle(fcpl2, fapl2);
+        nerrors += long_compact(fcpl2, fapl2);
+        nerrors += read_old();
+        nerrors += no_compact(fcpl2, fapl2);
+        nerrors += gcpl_on_root(fapl2);
+    }
 
     /* Old group API specific tests */
     nerrors += old_api(fapl);
@@ -1200,6 +1231,8 @@ main(void)
 
     /* Close 2nd FAPL */
     H5Pclose(fapl2);
+    H5Pclose(fcpl);
+    H5Pclose(fcpl2);
 
     /* Verify symbol table messages are cached */
     nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
diff --git a/test/swmr.c b/test/swmr.c
index 1599acd..399a9ec 100644
--- a/test/swmr.c
+++ b/test/swmr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -32,25 +30,30 @@
 
 /*
  * This file needs to access private information from the H5F package.
- * This file also needs to access the file testing code.
+ * This file also needs to access the file, file driver, dataset,
+ * and object header 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_FRIEND      /*suppress error about including H5Dpkg          */
 #define H5D_TESTING
-#include "H5Dpkg.h"
+#include "H5Dpkg.h"    /* Datasets                 */
 
-/* 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             */
 
+#define H5O_FRIEND    /*suppress error about including H5Opkg      */
+#define H5O_TESTING
+#include "H5Opkg.h"     /* Object headers            */
+
 
 const char *FILENAME[] = {
     "swmr0",        /* 0 */
     "swmr1",        /* 1 */
+    "swmr2",        /* 2 */
     NULL
 };
 
@@ -65,6 +68,7 @@ static int test_metadata_read_retry_info(hid_t in_fapl);
 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);
+static int test_start_swmr_write_stress_ohdr(hid_t in_fapl);
 
 /* Tests for H5Pget/set_object_flush_cb() */
 static herr_t flush_cb(hid_t obj_id, void *_udata);
@@ -79,12 +83,15 @@ 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);         
+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);       
+static int test_file_lock_concur(hid_t fapl);
+static int test_file_lock_swmr_concur(hid_t fapl);
+
+/* Test file lock environment variable */
+static int test_file_lock_env_var(hid_t fapl);
 
 /* Tests for SWMR VFD flag */
 static int test_swmr_vfd_flag(void);
@@ -100,11 +107,11 @@ static int test_multiple_same(hid_t in_fapl, hbool_t new_format);
  */
 
 /*
- *  test_metadata_read_attempts(): 
+ *  test_metadata_read_attempts():
  *
  *  Checks the following two public routines work as specified:
- *  H5Pset_metadata_read_attempts() 
- *  H5Pget_metadata_read_attempts() 
+ *  H5Pset_metadata_read_attempts()
+ *  H5Pget_metadata_read_attempts()
  */
 static int
 test_metadata_read_attempts(hid_t in_fapl)
@@ -126,10 +133,10 @@ test_metadata_read_attempts(hid_t in_fapl)
     /* 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 
+     *    --setting/getting read attempts from a
      *      file access property list.
      */
     /* Get # of read attempts -- should be the default: 1 */
@@ -179,11 +186,11 @@ test_metadata_read_attempts(hid_t in_fapl)
     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 
+     *    --opening files with SWMR access
      *    --using default or non-default file access property list
      */
     /* Test 1 */
@@ -357,11 +364,11 @@ test_metadata_read_attempts(hid_t in_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 
+     *    --opening files with non-SWMR access
      *    --using default or non-default file access property list
      */
     /* Test 1 */
@@ -443,10 +450,10 @@ test_metadata_read_attempts(hid_t in_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 */
+    /* 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 != H5F_METADATA_READ_ATTEMPTS)
+    if(attempts != 9)
         TEST_ERROR
 
     /* Close the file */
@@ -603,11 +610,11 @@ test_metadata_read_attempts(hid_t in_fapl)
     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 
+     *    --opening files with SWMR access
      *    --H5reopen the files
      */
 
@@ -693,11 +700,11 @@ test_metadata_read_attempts(hid_t in_fapl)
     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 
+     *    --opening files with non-SWMR access
      *    --H5reopen the files
      */
 
@@ -809,9 +816,9 @@ error:
 } /* test_metadata_read_attempts() */
 
 /*
- *  test_metadata_read_retry_info(): 
+ *  test_metadata_read_retry_info():
  *
- *  Checks whether the public routine H5Fget_metadata_read_retry_info 
+ *  Checks whether the public routine H5Fget_metadata_read_retry_info
  *  works as specified.
  *
  */
@@ -1103,7 +1110,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
         FAIL_STACK_ERROR
 
 
-    /* 
+    /*
      * Case 2: tests on retries info
      */
 
@@ -1144,7 +1151,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
     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]
@@ -1191,10 +1198,10 @@ test_metadata_read_retry_info(hid_t in_fapl)
     /* 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]);
+            H5free_memory(info.retries[i]);
     }
 
-    /* 
+    /*
      * Increment 2nd set of retries for metadata items:
      *   a) Object header--retries[0][0]
      *   b) Extensive array datablock--retries[15][0]
@@ -1226,7 +1233,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
     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++) {
@@ -1244,7 +1251,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
                 if(info.retries[i][1] != 500)
                     TEST_ERROR
                 break;
-    
+
             case 15: /* Extensive array data block */
                 if(info.retries[i][0] != 1)
                     TEST_ERROR
@@ -1276,7 +1283,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
     /* 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]);
+            H5free_memory(info.retries[i]);
 
     /* Closing */
     if(H5Dclose(did1) < 0)
@@ -1336,7 +1343,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
     /* Free memory */
     for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
         if(info.retries[i] != NULL)
-            HDfree(info.retries[i]);
+            H5free_memory(info.retries[i]);
 
     /* Closing */
     if(H5Pclose(new_fapl) < 0)
@@ -1394,7 +1401,7 @@ test_metadata_read_retry_info(hid_t in_fapl)
 
     /*
      * Open a file with SWMR access, default # of read attempts:
-     *   --increment retries for metadata item: fixed array data block page (retries[19][0]) 
+     *   --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])--
      */
@@ -1469,9 +1476,9 @@ test_metadata_read_retry_info(hid_t in_fapl)
     /* 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]);
+            H5free_memory(info.retries[i]);
         if(info1.retries[i] != NULL)
-            HDfree(info1.retries[i]);
+            H5free_memory(info1.retries[i]);
     } /* end for */
 
     /* Closing */
@@ -1512,7 +1519,7 @@ error:
  *  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: 
+ *  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
@@ -1525,14 +1532,14 @@ error:
  *      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
+ *    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 
+ *    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
  */
@@ -1562,7 +1569,7 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
 
 
     /* Get a copy of the parameter fapl (non-latest-format) */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     if(new_format) {
@@ -1578,8 +1585,8 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     /* 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 
+    /*
+     * Case A: when creating a file
      */
 
     /* Create the file with SWMR write + non-latest-format */
@@ -1603,17 +1610,17 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     /* Create "dataset1" */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
         FAIL_STACK_ERROR
-    if(H5Pset_chunk(dcpl, 1, chunk_dim) < 0) 
+    if(H5Pset_chunk(dcpl, 1, chunk_dim) < 0)
         FAIL_STACK_ERROR
-    if((sid1 = H5Screate_simple(1, dim, max_dim)) < 0) 
+    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) 
+    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) 
+    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");
@@ -1628,7 +1635,7 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         ret = H5Fstart_swmr_write(fid);
     } H5E_END_TRY;
     if(new_format) {
-        if(ret < 0) TEST_ERROR  
+        if(ret < 0) TEST_ERROR
     } else if(ret >= 0)
         TEST_ERROR
 
@@ -1668,8 +1675,8 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR;
 
-    /* 
-     * Case B: when opening a file 
+    /*
+     * Case B: when opening a file
      */
 
     /* Open the file again with write + non-latest-format */
@@ -1714,17 +1721,17 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     /* Create "dataset2" in the group, keep it open */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
         FAIL_STACK_ERROR
-    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0) 
+    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0)
         FAIL_STACK_ERROR
-    if((sid2 = H5Screate_simple(2, dim2, max_dim2)) < 0) 
+    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) 
+    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) 
+    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");
@@ -1785,17 +1792,17 @@ test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR;
 
     /* Create "dataset3" */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
         FAIL_STACK_ERROR
-    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0) 
+    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0)
         FAIL_STACK_ERROR
-    if((sid3 = H5Screate_simple(2, dim2, max_dim2)) < 0) 
+    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) 
+    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) 
+    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");
@@ -1872,7 +1879,7 @@ error:
  *      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 
+ *      --Enable SWMR writing mode twice
  *      --First time succeed, second time fail
  *      --Close the file
         (2) --Open the file with write + with/without latest format
@@ -1912,12 +1919,12 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     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) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
-    if((new_fapl = H5Pcopy(in_fapl)) < 0) 
+    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)
@@ -1926,7 +1933,7 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     if(new_format) {
         TESTING("H5Fstart_swmr_write() on failure conditions for latest format");
 
-    if((fapl = H5Pcopy(new_fapl)) < 0) 
+    if((fapl = H5Pcopy(new_fapl)) < 0)
         FAIL_STACK_ERROR
     } else {
         TESTING("H5Fstart_swmr_write() on failure conditions for without latest format");
@@ -1936,7 +1943,7 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
 
 
-    /* 
+    /*
      * (A) When creating a file:
      */
 
@@ -2005,7 +2012,7 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
             FAIL_STACK_ERROR;
     } /* end if */
 
-    /* 
+    /*
      * (B) When opening a file which is created with the latest format
      */
 
@@ -2014,7 +2021,7 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR;
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR;
-    
+
     /* Case 1 */
 
     /* Open the file with SWMR write + with/without latest format */
@@ -2121,8 +2128,8 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR;
 
 
-    /* 
-     * (C) Failure cases for multiple opens 
+    /*
+     * (C) Failure cases for multiple opens
      */
 
     /* Case 1 */
@@ -2134,7 +2141,7 @@ test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
     /* 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;
@@ -2317,8 +2324,8 @@ error:
  *      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
+ *           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
@@ -2341,7 +2348,7 @@ test_start_swmr_write_concur(hid_t H5_ATTR_UNUSED in_fapl, hbool_t H5_ATTR_UNUSE
 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 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 */
@@ -2369,7 +2376,7 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         TESTING("H5Fstart_swmr_write()--concurrent access for non-latest-format");
     } /* end if */
 
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set the filename to use for this test (dependent on fapl) */
@@ -2413,10 +2420,10 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
     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() 
+     *  Verify concurrent file open with H5F_ACC_RDONLY|H5F_ACC_SWMR_READ
+     *  will fail without H5Fstart_swmr_write()
      */
 
     /* Fork child process */
@@ -2424,9 +2431,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
-	int child_notify = 0;
+    int child_notify = 0;
 
-	/* Close unused write end for out_pdf */
+    /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -2444,9 +2451,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         if(fid >= 0)
             HDexit(EXIT_FAILURE);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
-	    HDexit(EXIT_FAILURE);
+        HDexit(EXIT_FAILURE);
 
         HDexit(EXIT_SUCCESS);
     }
@@ -2483,10 +2490,10 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
     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() 
+     *  Verify concurrent file open with H5F_ACC_RDONLY|H5F_ACC_SWMR_READ
+     *  will succeed with H5Fstart_swmr_write()
      */
 
     /* Create 2 pipes */
@@ -2502,13 +2509,13 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
     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;
-	
+    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 */
+    /* close unused read end for in_pdf */
         if(HDclose(in_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -2524,23 +2531,23 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         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)
+    /* 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)
+    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)
+    /* 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)
+    if(rdata != 88)
             HDexit(EXIT_FAILURE);
 
-	/* Notify parent process */
+    /* Notify parent process */
         child_notify = 2;
-	if(HDwrite(in_pdf[1], &child_notify, sizeof(int)) < 0)
-	    HDexit(EXIT_FAILURE);
+    if(HDwrite(in_pdf[1], &child_notify, sizeof(int)) < 0)
+        HDexit(EXIT_FAILURE);
 
         /* Wait for notification from parent process */
         while(child_notify != 3) {
@@ -2548,41 +2555,41 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
                 HDexit(EXIT_FAILURE);
         }
 
-	/* Refresh "dataset" via child_did2 */
-	if(H5Drefresh(child_did2) < 0)
+    /* 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)
+    /* 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)
+    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)
+    /* 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)
+    if(rdata != 99)
             HDexit(EXIT_FAILURE);
 
-	/* Close the dataset */
-	if(H5Dclose(child_did1))
+    /* Close the dataset */
+    if(H5Dclose(child_did1))
             HDexit(EXIT_FAILURE);
-	if(H5Dclose(child_did2))
+    if(H5Dclose(child_did2))
             HDexit(EXIT_FAILURE);
 
-	/* Close the file */
+    /* Close the file */
         if(H5Fclose(child_fid1) < 0)
             HDexit(EXIT_FAILURE);
         if(H5Fclose(child_fid2) < 0)
             HDexit(EXIT_FAILURE);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
-	    HDexit(EXIT_FAILURE);
-	if(HDclose(in_pdf[1]) < 0)
-	    HDexit(EXIT_FAILURE);
+        HDexit(EXIT_FAILURE);
+    if(HDclose(in_pdf[1]) < 0)
+        HDexit(EXIT_FAILURE);
 
         HDexit(EXIT_SUCCESS);
     }
@@ -2678,10 +2685,10 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
 
-    /* 
+    /*
      *  Case (3):
      *  Verify concurrent file open with H5F_ACC_RDONLY
-     *  will fail with H5Fstart_swmr_write() 
+     *  will fail with H5Fstart_swmr_write()
      */
     /* Create 1 pipe */
     if(HDpipe(out_pdf) < 0)
@@ -2692,9 +2699,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
-	int child_notify = 0;
+    int child_notify = 0;
 
-	/* Close unused write end for out_pdf */
+    /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -2750,10 +2757,10 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      *  Case (4):
      *  Verify concurrent file open with H5F_ACC_RDWR
-     *  will fail with H5Fstart_swmr_write() 
+     *  will fail with H5Fstart_swmr_write()
      */
 
     /* Create 1 pipe */
@@ -2765,9 +2772,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
-	 int child_notify = 0;
+    int child_notify = 0;
 
-	/* Close unused write end for out_pdf */
+    /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -2784,9 +2791,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         if(fid >= 0)
             HDexit(EXIT_FAILURE);
 
-	/* Close the pipe */
-	if(HDclose(out_pdf[0]) < 0)
-	    HDexit(EXIT_FAILURE);
+    /* Close the pipe */
+    if(HDclose(out_pdf[0]) < 0)
+        HDexit(EXIT_FAILURE);
 
         HDexit(EXIT_SUCCESS);
     } /* end if */
@@ -2827,10 +2834,10 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
     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() 
+     *  will fail with H5Fstart_swmr_write()
      */
 
     /* Create 1 pipe */
@@ -2842,9 +2849,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
-	int child_notify = 0;
+    int child_notify = 0;
 
-	/* Close unused write end for out_pdf */
+    /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -2861,9 +2868,9 @@ test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
         if(fid >= 0)
             HDexit(EXIT_FAILURE);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
-	    HDexit(EXIT_FAILURE);
+        HDexit(EXIT_FAILURE);
 
         HDexit(EXIT_SUCCESS);
     }
@@ -2925,11 +2932,172 @@ error:
 #endif /* !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID)) */
 
 /*
- * Tests for H5Pset/get_object_flush_cb() 
+ * test_start_swmr_write_stress_ohdr():
+ *
+ * Verify that H5Fswmr_start_write() works correctly when the dataspace header
+ * message is not located in chunk #0 of the object header.
+ *
+ */
+static int
+test_start_swmr_write_stress_ohdr(hid_t in_fapl)
+{
+    hid_t fid = -1;            /* File IDs */
+    hid_t fapl;                         /* File access property list */
+    char filename[NAME_BUF_SIZE];       /* File name */
+    hid_t did = -1, did2 = -1;          /* Dataset IDs */
+    hid_t sid = -1;                     /* Dataspace ID */
+    hid_t tid = -1;                     /* Datatype ID */
+    hid_t dcpl = -1;                    /* Dataset creation property list ID */
+    hid_t aid = -1;                     /* Attribute ID */
+    hsize_t chunk_dims[2] = {10, 10};
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
+    char fill[256];                     /* Fill value for dataset */
+    char attr_data[32];                 /* Data value for attribute */
+    hsize_t dims[2] = {1,1};
+    unsigned chunk_num;                 /* Object header chunk # for dataspace message */
+
+    /* Output message about test being performed */
+    TESTING("H5Fstart_swmr_write()--stress object header messages");
+
+    /* Initialize buffers */
+    HDmemset(fill, 0, sizeof(fill));
+    HDmemset(attr_data, 0, sizeof(attr_data));
+
+    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 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
+
+    /* Create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(1, dims, maxdims)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_C_S1)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tset_size(tid, 256) < 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(H5Pset_fill_value(dcpl, tid, &fill) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, "dataset", tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Retrieve the chunk # for the dataspace message */
+    chunk_num = UINT_MAX;
+    if(H5O_msg_get_chunkno_test(did, H5O_SDSPACE_ID, &chunk_num) < 0)
+        FAIL_STACK_ERROR;
+    /* Should be in chunk #0 for now */
+    if(0 != chunk_num)
+        TEST_ERROR;
+
+    /* Create a second chunked dataset with 2 extendible dimensions */
+    /* (So that the original dataset's object header can't be extended) */
+    if((sid = H5Screate_simple(1, dims, maxdims)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_C_S1)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tset_size(tid, 256) < 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(H5Pset_fill_value(dcpl, tid, &fill) < 0)
+        FAIL_STACK_ERROR;
+    if((did2 = H5Dcreate2(fid, "dataset2", tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the second dataset */
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the objects for the dataset creation */
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create attribute on original dataset, to push dataspace header message out of header chunk #0 */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_C_S1)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tset_size(tid, 32) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tset_strpad(tid, H5T_STR_NULLTERM) < 0)
+        FAIL_STACK_ERROR;
+    if((aid = H5Acreate2(did, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Awrite(aid, tid, attr_data) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Aclose(aid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the chunk # for the dataspace message */
+    chunk_num = UINT_MAX;
+    if(H5O_msg_get_chunkno_test(did, H5O_SDSPACE_ID, &chunk_num) < 0)
+        FAIL_STACK_ERROR;
+    /* Should be in chunk #0 for now */
+    if(1 != chunk_num)
+        TEST_ERROR;
+
+    /* Enable SWMR write */
+    if(H5Fstart_swmr_write(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the FAPL */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(aid);
+        H5Sclose(tid);
+        H5Sclose(sid);
+        H5Sclose(did);
+        H5Sclose(did2);
+        H5Pclose(dcpl);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_start_swmr_write_stress_ohdr() */
+
+/*
+ * Tests for H5Pset/get_object_flush_cb()
  */
 
 /* The callback function for object flush property */
-static herr_t 
+static herr_t
 flush_cb(hid_t H5_ATTR_UNUSED obj_id, void *_udata)
 {
     unsigned *flush_ct = (unsigned*)_udata;
@@ -2939,10 +3107,10 @@ flush_cb(hid_t H5_ATTR_UNUSED obj_id, void *_udata)
 
 /*
  * 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 
+ *  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.
@@ -2972,9 +3140,9 @@ test_object_flush_cb(hid_t in_fapl)
     herr_t ret;                 /* Generic return value */
 
     TESTING("H5Pget/set_obj_flush_cb()");
-    
+
     /*
-     * Case (1) 
+     * 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 */
@@ -3037,7 +3205,7 @@ test_object_flush_cb(hid_t in_fapl)
     ret_ct = NULL;
 
     /* Make a copy of the input parameter in_fapl */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set to use the latest library format */
@@ -3090,11 +3258,11 @@ test_object_flush_cb(hid_t in_fapl)
         FAIL_STACK_ERROR;
 
     /* Create a dataset */
-    if((sid = H5Screate_simple(2, dims, dims)) < 0) 
+    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) 
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
 
     /* Initialize data buffer */
@@ -3122,7 +3290,7 @@ test_object_flush_cb(hid_t in_fapl)
         TEST_ERROR
 
     /* Create a group */
-    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
 
     /* Flush the group */
@@ -3138,7 +3306,7 @@ test_object_flush_cb(hid_t in_fapl)
         TEST_ERROR
 
     /* Create a dataset */
-    if((did2 = H5Dcreate2(gid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    if((did2 = H5Dcreate2(gid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
 
     /* Flush the dataset */
@@ -3188,7 +3356,7 @@ error:
 } /* test_object_flush_cb() */
 
 /*
- * Tests for H5Pset/get_append_flush() 
+ * Tests for H5Pset/get_append_flush()
  */
 
 
@@ -3245,14 +3413,14 @@ test_append_flush_generic(void)
     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) 
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
         FAIL_STACK_ERROR
 
     /* Retrieve the append flush property values */
@@ -3269,7 +3437,7 @@ test_append_flush_generic(void)
     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
@@ -3331,7 +3499,7 @@ test_append_flush_generic(void)
     } H5E_END_TRY;
     if(ret >= 0)
         TEST_ERROR
-    
+
     /*
      * Case (3)
      *  To verify the append flush property values retrieved from a non-default
@@ -3419,7 +3587,7 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
 
     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
@@ -3428,7 +3596,7 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
      */
 
     /* Get a copy of the input parameter in_fapl */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set to use the latest library format */
@@ -3444,13 +3612,13 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
         FAIL_STACK_ERROR
 
     /* Create a chunked dataset with 1 extendible dimension */
-    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0)
         FAIL_STACK_ERROR;
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+    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) 
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
         TEST_ERROR
 
     /* Get the dataset's access property list */
@@ -3460,18 +3628,18 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
     /* 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) 
+    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:
@@ -3481,7 +3649,7 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
      *      -- 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) 
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
         FAIL_STACK_ERROR
 
     /* Set boundary dimension rank > the rank of dataset to be created */
@@ -3521,7 +3689,7 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
     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
@@ -3529,7 +3697,7 @@ test_append_flush_dataset_chunked(hid_t in_fapl)
      *      -- 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)
@@ -3605,7 +3773,7 @@ error:
  * 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 
+ *  (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
  */
@@ -3632,7 +3800,7 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
 
     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
@@ -3641,7 +3809,7 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
      */
 
     /* Get a copy of the input parameter in_fapl */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set to use the latest library format */
@@ -3657,9 +3825,9 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
         FAIL_STACK_ERROR
 
     /* Create a dataset */
-    if((sid = H5Screate_simple(1, dims, dims)) < 0) 
+    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) 
+    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 */
@@ -3669,21 +3837,21 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
     /* 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) 
+    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 
+     *  --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
@@ -3691,7 +3859,7 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
      *      zero boundary, null callback function, null user data
      */
     /* Create a copy of dataset access property list */
-    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
         FAIL_STACK_ERROR
 
     boundary[0] = 1;
@@ -3743,14 +3911,14 @@ test_append_flush_dataset_fixed(hid_t in_fapl)
 
     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
@@ -3813,16 +3981,16 @@ error:
  *  (1) did1 = H5Dcreate(...dapl1...)
  *      did2 = H5Dopen2(...dapl2)
  *      H5Pget_append_flush(did1...)
- *      H5Pget_append_flush(did2...) 
+ *      H5Pget_append_flush(did2...)
  *      -- should return append flush property values set in dapl1
  *  (2) H5Dcreate(...H5P_DEFAULT...)
  *      H5Dclose()
  *      did1 = H5Dopen2(...dapl1)
- *      did2 = H5Dopen2(..dapl2) 
+ *      did2 = H5Dopen2(..dapl2)
  *      H5Pget_append_flush(did1, ...)
  *      H5Pget_append_flush(did2, ...)
  *      -- should return append flush property values set in dapl1
- *  NOTE: 
+ *  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
  */
@@ -3855,20 +4023,20 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
 
     TESTING("H5Fget/set_append_flush() for multiple opens of a chunked dataset");
 
-    /* 
-     *  Case (1) 
+    /*
+     *  Case (1)
      *  For a chunked dataset's access property list:
      *      did1 = H5Dcreate(...dapl1...)
      *          did2 = H5Dopen2(...dapl2)
      *          H5Pget_append_flush(did1...)
-     *          H5Pget_append_flush(did2...) 
+     *          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) 
+    if((dapl1 = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
         FAIL_STACK_ERROR
-    if((dapl2 = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+    if((dapl2 = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
         FAIL_STACK_ERROR
 
     boundary1[0] = 0;
@@ -3883,7 +4051,7 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
         FAIL_STACK_ERROR
 
     /* Get a copy of the input parameter in_fapl */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set to use the latest library format */
@@ -3898,13 +4066,13 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
         FAIL_STACK_ERROR
 
     /* Create a chunked dataset with 2 extendible dimensions */
-    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0)
         FAIL_STACK_ERROR;
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+    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) 
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl1)) < 0)
         FAIL_STACK_ERROR;
 
     /* Open the dataset */
@@ -3918,11 +4086,11 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
     /* 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) 
+    if(ret_cb != append_cb || ret_count != &count1)
         TEST_ERROR
 
     /* Close the dataset's access property list */
@@ -3936,11 +4104,11 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
     /* 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) 
+    if(ret_cb != append_cb || ret_count != &count1)
         TEST_ERROR
 
     /* Close the dataset's access property list */
@@ -3949,18 +4117,18 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
     H5Dclose(did1);
     H5Dclose(did2);
 
-    /* 
-     * Case (2) 
+    /*
+     * Case (2)
      *  For a chunked dataset's access property list:
      *      H5Dcreate(...H5P_DEFAULT...)
      *          H5Dclose()
      *          did1 = H5Dopen2(...dapl1)
-     *          did2 = H5Dopen2(..dapl2) 
+     *          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) 
+    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;
@@ -3980,11 +4148,11 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
     /* 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) 
+    if(ret_cb != append_cb2 || ret_count != &count2)
         TEST_ERROR
 
     /* Close the access property list */
@@ -3999,11 +4167,11 @@ test_append_flush_dataset_multiple(hid_t in_fapl)
     /* 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) 
+    if(ret_cb != append_cb2 || ret_count != &count2)
         TEST_ERROR
 
     /* Closing */
@@ -4073,8 +4241,8 @@ test_file_lock_same(hid_t in_fapl)
     /* 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 
+    /*
+     * Case 1: 1) RDWR 2) RDWR : should succeed
      */
     /* Create file */
     if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
@@ -4094,7 +4262,7 @@ test_file_lock_same(hid_t in_fapl)
     /* Get and check the intent */
     if(H5Fget_intent(fid2, &intent) < 0)
     FAIL_STACK_ERROR
-    if(intent != H5F_ACC_RDWR) 
+    if(intent != H5F_ACC_RDWR)
     TEST_ERROR
 
     /* Close file */
@@ -4105,8 +4273,8 @@ test_file_lock_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
     FAIL_STACK_ERROR
 
-    /* 
-     * Case 2: 1) RDWR 2) RDONLY : should succeed 
+    /*
+     * Case 2: 1) RDWR 2) RDONLY : should succeed
      */
     /* Open file with RDWR */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
@@ -4136,8 +4304,8 @@ test_file_lock_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
     FAIL_STACK_ERROR
 
-    /* 
-     * Case 3: 1) RDONLY 2) RDWR : should fail 
+    /*
+     * Case 3: 1) RDONLY 2) RDWR : should fail
      */
     /* Open file with RDONLY */
     if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
@@ -4160,8 +4328,8 @@ test_file_lock_same(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
     FAIL_STACK_ERROR
 
-    /* 
-     * Case 4: 1) RDONLY 2) RDONLY : should succeed 
+    /*
+     * Case 4: 1) RDONLY 2) RDONLY : should succeed
      */
     /* Open file with RDONLY */
     if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
@@ -4170,7 +4338,7 @@ test_file_lock_same(hid_t in_fapl)
     /* Get and check the intent */
     if(H5Fget_intent(fid, &intent) < 0)
     FAIL_STACK_ERROR
-    if(intent != H5F_ACC_RDONLY) 
+    if(intent != H5F_ACC_RDONLY)
     TEST_ERROR
 
     /* Open file with RDONLY */
@@ -4241,17 +4409,17 @@ test_file_lock_swmr_same(hid_t in_fapl)
     /* 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 
+    /*
+     * Cases a, b, c, d: H5Fopen failure cases
      */
 
-    /* 
-     * Case a: RDWR|SWRM_READ : should fail  
+    /*
+     * Case a: RDWR|SWRM_READ : should fail
      */
     H5E_BEGIN_TRY {
     fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_READ, fapl);
@@ -4259,8 +4427,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(fid >= 0)
     TEST_ERROR
 
-    /* 
-     * Case b: RDWR|SWMM_WRTE|SWMR_READ : should fail 
+    /*
+     * 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);
@@ -4268,8 +4436,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(fid >= 0)
     TEST_ERROR
 
-    /* 
-     * Case c: RDONLY|SWMM_WRITE : should fail 
+    /*
+     * Case c: RDONLY|SWMM_WRITE : should fail
      */
     H5E_BEGIN_TRY {
     fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_WRITE, fapl);
@@ -4277,8 +4445,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(fid >= 0)
     TEST_ERROR
 
-    /* 
-     * Case d: RDONLY|SWMM_WRITE|SWMR_READ : should fail 
+    /*
+     * 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);
@@ -4286,12 +4454,12 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(fid >= 0)
     TEST_ERROR
 
-    /* 
-     * Cases 1 - 12: combinations of different flags for 1st and 2nd opens 
+    /*
+     * Cases 1 - 12: combinations of different flags for 1st and 2nd opens
      */
 
-    /* 
-     * Case 1: 1) RDWR 2) RDWR|SWMR_WRITE : should fail 
+    /*
+     * Case 1: 1) RDWR 2) RDWR|SWMR_WRITE : should fail
      */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
@@ -4306,8 +4474,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 2: 1) RDWR 2) RDONLY|SWMR_READ : should succeed 
+    /*
+     * Case 2: 1) RDWR 2) RDONLY|SWMR_READ : should succeed
      */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
     TEST_ERROR
@@ -4320,8 +4488,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 3: 1) RDWR|SWMR_WRITE 2)RDWR : should succeed 
+    /*
+     * 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
@@ -4336,8 +4504,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 4: 1) RDWR|SWMR_WRITE 2) RDWR|SWMR_WRITE : should succeed 
+    /*
+     * 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
@@ -4352,8 +4520,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 5: 1) RDWR|SWMR_WRITE 2) RDONLY|SWMR_READ : should succeed 
+    /*
+     * 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
@@ -4368,8 +4536,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 6: 1) RDWR|SWMR_WRITE 2) RDONLY : should succeed 
+    /*
+     * 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
@@ -4384,8 +4552,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 7: 1) RDONLY|SWMR_READ 2)RDWR : should fail 
+    /*
+     * 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
@@ -4400,8 +4568,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 8: 1) RDONLY|SWMR_READ 2) RDWR|SWMR_WRITE : should fail 
+    /*
+     * 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
@@ -4416,8 +4584,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 9: 1) RDONLY|SWMR_READ 2) RDONLY|SWMR_READ : should succeed 
+    /*
+     * 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
@@ -4432,8 +4600,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 10: 1) RDONLY|SWMR_READ 2) RDONLY : should succeed 
+    /*
+     * 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
@@ -4448,8 +4616,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid2) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 11: 1) RDONLY 2) RDWR|SWMR_WRITE: should fail 
+    /*
+     * Case 11: 1) RDONLY 2) RDWR|SWMR_WRITE: should fail
      */
     if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
@@ -4464,8 +4632,8 @@ test_file_lock_swmr_same(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
-     * Case 12: 1) RDONLY 2) RDONLY|SWMR_READ : should fail 
+    /*
+     * Case 12: 1) RDONLY 2) RDONLY|SWMR_READ : should fail
      */
     if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
@@ -4514,14 +4682,14 @@ 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();
+    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)
 {
@@ -4542,7 +4710,7 @@ test_file_lock_concur(hid_t in_fapl)
 
     /* 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
@@ -4551,7 +4719,7 @@ test_file_lock_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 1: 1) RDWR 2) RDWR : should fail
      */
 
@@ -4565,7 +4733,7 @@ test_file_lock_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -4583,10 +4751,10 @@ test_file_lock_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -4616,9 +4784,9 @@ test_file_lock_concur(hid_t in_fapl)
 
     /* Check if child terminated normally */
     if(WIFEXITED(child_status)) {
-	/* Check exit status of the child */
-	if(WEXITSTATUS(child_status) != 0)
-	    TEST_ERROR
+    /* Check exit status of the child */
+    if(WEXITSTATUS(child_status) != 0)
+        TEST_ERROR
     } else
         FAIL_STACK_ERROR
 
@@ -4626,7 +4794,7 @@ test_file_lock_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 2: 1) RDWR 2) RDONLY : should fail
      */
     /* Create 1 pipe */
@@ -4639,7 +4807,7 @@ test_file_lock_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -4657,10 +4825,10 @@ test_file_lock_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -4700,7 +4868,7 @@ test_file_lock_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 3: 1) RDONLY 2) RDWR : should fail
      */
 
@@ -4714,7 +4882,7 @@ test_file_lock_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -4735,7 +4903,7 @@ test_file_lock_concur(hid_t in_fapl)
         if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -4749,7 +4917,7 @@ test_file_lock_concur(hid_t in_fapl)
     /* 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)
@@ -4775,7 +4943,7 @@ test_file_lock_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 4: 1) RDONLY 2) RDONLY : should succeed
      */
 
@@ -4789,7 +4957,7 @@ test_file_lock_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -4810,15 +4978,15 @@ test_file_lock_concur(hid_t in_fapl)
         if(child_fid >= 0) {
             /* Close the file */
             if(H5Fclose(child_fid) < 0)
-		HDexit(EXIT_FAILURE);
+        HDexit(EXIT_FAILURE);
 
-	    /* Close the pipe */
-	    if(HDclose(out_pdf[0]) < 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 */
 
@@ -4917,7 +5085,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         FAIL_STACK_ERROR
 
     /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+    h5_fixname(FILENAME[2], fapl, filename, sizeof(filename));
 
     /* Set to use latest library format */
     if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
@@ -4931,7 +5099,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 1: 1) RDWR 2) RDWR|SWMR_WRITE : should fail
      */
 
@@ -4945,7 +5113,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -4963,10 +5131,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5006,7 +5174,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 2: 1) RDWR 2) RDONLY|SWMR_READ: should fail
      */
 
@@ -5016,13 +5184,13 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     /* Fork child process */
     if((childpid = HDfork()) < 0)
-	FAIL_STACK_ERROR
+    FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
-	 /* Close unused write end for out_pdf */
+    /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5038,10 +5206,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5067,7 +5235,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     /* Wait for child process to complete */
     if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
-	FAIL_STACK_ERROR
+    FAIL_STACK_ERROR
 
     /* Check if child terminated normally */
     if(WIFEXITED(child_status)) {
@@ -5081,7 +5249,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 3: 1) RDWR|SWMR_WRITE 2) RDWR : should fail
      */
 
@@ -5095,7 +5263,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5113,10 +5281,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
-    
-	/* Close the pipe */
+
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5156,7 +5324,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 4: 1) RDWR|SWMR_WRITE 2) RDWR|SWMR_WRITE : should fail
      */
 
@@ -5169,7 +5337,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5187,10 +5355,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5203,7 +5371,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     /* Open the test file */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
-	FAIL_STACK_ERROR
+    FAIL_STACK_ERROR
 
     /* Notify child process */
     notify = 1;
@@ -5230,7 +5398,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 5: 1) RDWR|SWMR_WRITE 2) RDONLY|SWMR_READ : should succeed
      */
 
@@ -5239,11 +5407,11 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     /* Fork child process */
     if((childpid = HDfork()) < 0)
-	FAIL_STACK_ERROR
+    FAIL_STACK_ERROR
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5267,7 +5435,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
             HDexit(EXIT_SUCCESS);
         }
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5280,7 +5448,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     /* Open the test file */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
-	FAIL_STACK_ERROR
+    FAIL_STACK_ERROR
 
     /* Notify child process */
     notify = 1;
@@ -5307,7 +5475,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 6: 1) RDWR|SWMR_WRITE 2) RDONLY : should fail
      */
 
@@ -5320,7 +5488,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5338,10 +5506,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5381,7 +5549,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 7: 1) RDONLY|SWMR_READ 2) RDWR : should fail
      */
 
@@ -5395,7 +5563,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5413,10 +5581,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	 /* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5456,7 +5624,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 8: 1) RDONLY|SWMR_READ 2) RDWR|SWMR_WRITE : should fail
      */
 
@@ -5470,7 +5638,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5488,9 +5656,9 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
-	
+
         /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
@@ -5531,7 +5699,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 9: 1) RDONLY|SWMR_READ 2) RDONLY|SWMR_READ : should succeed
      */
 
@@ -5545,7 +5713,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5609,7 +5777,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 10: 1) RDONLY|SWMR_READ 2) RDONLY : should succeed
      */
 
@@ -5623,7 +5791,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5646,7 +5814,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
             HDexit(EXIT_SUCCESS);
         }
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5686,13 +5854,13 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     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
+    FAIL_STACK_ERROR
 
     /* Fork child process */
     if((childpid = HDfork()) < 0)
@@ -5700,7 +5868,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5718,10 +5886,10 @@ test_file_lock_swmr_concur(hid_t in_fapl)
         } H5E_END_TRY;
 
         /* Should fail */
-        if(child_fid == FAIL) 
+        if(child_fid == FAIL)
             HDexit(EXIT_SUCCESS);
 
-	/* Close the pipe */
+    /* Close the pipe */
         if(HDclose(out_pdf[0]) < 0)
             HDexit(EXIT_FAILURE);
 
@@ -5761,7 +5929,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     if(H5Fclose(fid) < 0)
         FAIL_STACK_ERROR
 
-    /* 
+    /*
      * Case 12: 1) RDONLY 2) RDONLY|SWMR_READ : should succeed
      */
 
@@ -5775,7 +5943,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
 
     if(childpid == 0) { /* Child process */
         hid_t child_fid;    /* File ID */
-	int child_notify = 0;
+    int child_notify = 0;
 
         /* Close unused write end for out_pdf */
         if(HDclose(out_pdf[1]) < 0)
@@ -5818,7 +5986,7 @@ test_file_lock_swmr_concur(hid_t in_fapl)
     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;
@@ -5857,8 +6025,155 @@ error:
 
 } /* end test_file_lock_swmr_concur() */
 
+
+
+#endif /* !(defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID)) */
+
+/****************************************************************
+**
+**  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.
+**
+*****************************************************************/
+static int
+test_file_lock_env_var(hid_t in_fapl)
+{
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
+    SKIPPED();
+    HDputs("    Test skipped due to fork or waitpid not defined.");
+    return 0;
+#else
+    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;
+
+
+    TESTING("File locking environment variable");
+
+
+    /* Set the environment variable */
+    if(HDsetenv("HDF5_USE_FILE_LOCKING", "FALSE", TRUE) < 0)
+        TEST_ERROR
+
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        TEST_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)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+
+    /* Open a file for read-only and then read-write. This would
+     * normally fail due to the file locking scheme but should
+     * pass when the environment variable is set to disable file
+     * locking.
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        TEST_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        TEST_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);
+        } /* end while */
+
+        /* Open the test file */
+        if((child_fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+        /* 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)
+        TEST_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        TEST_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        TEST_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        TEST_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        TEST_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } /* end if */
+    else
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+
+    /* Close the copied property list */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+
+
 #endif /* !(defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID)) */
 
+} /* end test_file_lock_env_var() */
+
+
 static int
 test_swmr_vfd_flag(void)
 {
@@ -5866,7 +6181,7 @@ test_swmr_vfd_flag(void)
     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. */
@@ -5921,7 +6236,7 @@ error:
 } /* 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.
@@ -5936,7 +6251,7 @@ test_bug_refresh(hid_t in_fapl)
     char filename[NAME_BUF_SIZE];   /* File name */
 
     /* Create a copy of the input parameter in_fapl */
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set to use the latest library format */
@@ -5977,7 +6292,7 @@ test_bug_refresh(hid_t in_fapl)
         FAIL_STACK_ERROR;
 
     if (H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
-        TEST_ERROR 
+        TEST_ERROR
 
     if(H5Grefresh(gid1) < 0) TEST_ERROR
     if(H5Grefresh(gid2) < 0) TEST_ERROR
@@ -6047,7 +6362,7 @@ error:
  *              (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 
+ *              (8) Verify the dataset's dimension and data are correct
  */
 #if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
 
@@ -6094,7 +6409,7 @@ test_refresh_concur(hid_t in_fapl, hbool_t new_format)
     } /* end if */
 
 
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set the filename to use for this test (dependent on fapl) */
@@ -6149,106 +6464,106 @@ test_refresh_concur(hid_t in_fapl, hbool_t new_format)
     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);
+    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 */
@@ -6283,10 +6598,15 @@ test_refresh_concur(hid_t in_fapl, hbool_t new_format)
 
     /* Wait for notification from child process */
     while(notify != 2) {
-	if(HDread(in_pdf[0], &notify, sizeof(int)) < 0)
-	    FAIL_STACK_ERROR;
+    if(HDread(in_pdf[0], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
     }
 
+    /* Cork the metadata cache, to prevent the object header from being
+     * flushed before the data has been written */
+    if(H5Odisable_mdc_flushes(did) < 0)
+        FAIL_STACK_ERROR;
+
     /* Extend the dataset */
     if(H5Dset_extent(did, new_dims) < 0)
         FAIL_STACK_ERROR;
@@ -6296,6 +6616,10 @@ test_refresh_concur(hid_t in_fapl, hbool_t new_format)
     if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
         FAIL_STACK_ERROR;
 
+    /* Uncork the metadata cache */
+    if(H5Oenable_mdc_flushes(did) < 0)
+        FAIL_STACK_ERROR;
+
     /* Flush to disk */
     if(H5Fflush(fid, H5F_SCOPE_LOCAL) < 0)
         FAIL_STACK_ERROR;
@@ -6387,7 +6711,7 @@ test_multiple_same(hid_t in_fapl, hbool_t new_format)
     } /* end if */
 
 
-    if((fapl = H5Pcopy(in_fapl)) < 0) 
+    if((fapl = H5Pcopy(in_fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Set the filename to use for this test (dependent on fapl) */
@@ -6691,6 +7015,8 @@ 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) */
+    char *lock_env_var = NULL; /* file locking env var pointer */
+    hbool_t use_file_locking;   /* read from env var */
 
     /* Skip this test if SWMR I/O is not supported for the VFD specified
      * by the environment variable.
@@ -6699,7 +7025,17 @@ main(void)
     if(!H5FD_supports_swmr_test(driver)) {
         printf("This VFD does not support SWMR I/O\n");
         return EXIT_SUCCESS;
-    }
+    } /* end if */
+
+    /* Check the environment variable that determines if we care
+     * about file locking. File locking should be used unless explicitly
+     * disabled.
+     */
+    lock_env_var = HDgetenv("HDF5_USE_FILE_LOCKING");
+    if(lock_env_var && !HDstrcmp(lock_env_var, "FALSE"))
+        use_file_locking = FALSE;
+    else
+        use_file_locking = TRUE;
 
     /* Set up */
     h5_reset();
@@ -6720,9 +7056,9 @@ main(void)
     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) 
+     *   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);
@@ -6731,6 +7067,7 @@ main(void)
     nerrors += test_err_start_swmr_write(fapl, FALSE);
     nerrors += test_start_swmr_write_concur(fapl, TRUE);
     nerrors += test_start_swmr_write_concur(fapl, FALSE);
+    nerrors += test_start_swmr_write_stress_ohdr(fapl);
 
     /* Tests for H5Pget/set_object_flush_cb() */
     nerrors += test_object_flush_cb(fapl);
@@ -6741,45 +7078,52 @@ main(void)
     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);       
+    if(use_file_locking) {
+        /*
+         * 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);
+    } /* end if */
 
     /* 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();
-    
+
+    /* This test changes the HDF5_USE_FILE_LOCKING environment variable
+     * so it should be run last.
+     */
+    nerrors += test_file_lock_env_var(fapl);
+
     if(nerrors)
-	goto error;
+        goto error;
 
     printf("All tests passed.\n");
 
     h5_cleanup(FILENAME, fapl);
 
-    return 0;
+    return EXIT_SUCCESS;
 
 error:
     nerrors = MAX(1, nerrors);
     printf("***** %d SWMR TEST%s FAILED! *****\n",
         nerrors, 1 == nerrors ? "" : "S");
-    return 1;
+    return EXIT_FAILURE;
 
-} /* main() */
+} /* end main() */
 
diff --git a/test/swmr_addrem_writer.c b/test/swmr_addrem_writer.c
index fb5cb8e..51caa3d 100644
--- a/test/swmr_addrem_writer.c
+++ b/test/swmr_addrem_writer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -171,8 +169,6 @@ addrem_records(hid_t fid, unsigned verbose, unsigned long nops, unsigned long fl
     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 */
 
@@ -189,17 +185,6 @@ addrem_records(hid_t fid, unsigned verbose, unsigned long nops, unsigned long fl
     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;
-    HDmemcpy(&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;
@@ -230,8 +215,8 @@ addrem_records(hid_t fid, unsigned verbose, unsigned long nops, unsigned long fl
 
             /* 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(H5Odisable_mdc_flushes(symbol->dsid) < 0)
+                return -1;
 
              /* Extend the dataset's dataspace to hold the new record */
             symbol->nrecords+= count[1];
@@ -252,8 +237,8 @@ addrem_records(hid_t fid, unsigned verbose, unsigned long nops, unsigned long fl
                 return -1;
 
             /* Uncork the metadata cache */
-            /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
-                return -1;*/
+            if(H5Oenable_mdc_flushes(symbol->dsid) < 0)
+                return -1;
 
             /* Close the dataset's dataspace */
             if(H5Sclose(file_sid) < 0)
@@ -420,7 +405,7 @@ int main(int argc, const char *argv[])
     } /* end if */
 
     /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
-    h5_send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Emit informational message */
     if(verbose)
diff --git a/test/swmr_check_compat_vfd.c b/test/swmr_check_compat_vfd.c
index 1bbfda3..1589f6e 100644
--- a/test/swmr_check_compat_vfd.c
+++ b/test/swmr_check_compat_vfd.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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
diff --git a/test/swmr_common.c b/test/swmr_common.c
index 8bd98b6..a0d79e3 100644
--- a/test/swmr_common.c
+++ b/test/swmr_common.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -98,7 +96,7 @@ choose_dataset(void)
     level = symbol_mapping[HDrandom() % NMAPPING];
 
     /* Determine the offset of the level */
-    offset = HDrandom() % symbol_count[level];
+    offset = (unsigned)(HDrandom() % (int)symbol_count[level]);
 
     return &symbol_info[level][offset];
 } /* end choose_dataset() */
@@ -284,7 +282,7 @@ print_metadata_retries_info(hid_t fid)
     /* Free memory for each non-NULL retries[i] */
     for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
         if(info.retries[i] != NULL)
-            HDfree(info.retries[i]);
+            H5free_memory(info.retries[i]);
 
     return 0;
 } /* print_metadata_retries_info() */
diff --git a/test/swmr_common.h b/test/swmr_common.h
index a2cee71..99d1cb2 100644
--- a/test/swmr_common.h
+++ b/test/swmr_common.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _SWMR_COMMON_H
diff --git a/test/swmr_generator.c b/test/swmr_generator.c
index 3b782da..1c2ec04 100644
--- a/test/swmr_generator.c
+++ b/test/swmr_generator.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -30,6 +28,14 @@
 #include "h5test.h"
 #include "swmr_common.h"
 
+/*
+ * This file needs to access testing codefrom the H5O package.
+ */
+#define H5O_FRIEND	/*suppress error about including H5Opkg	  */
+#define H5O_TESTING
+#include "H5Opkg.h"     /* Object headers			*/
+
+
 /****************/
 /* Local Macros */
 /****************/
@@ -40,8 +46,8 @@
 /* Local Prototypes */
 /********************/
 
-static int gen_skeleton(const char *filename, unsigned verbose,
-    unsigned swmr_write, int comp_level, const char *index_type,
+static int gen_skeleton(const char *filename, hbool_t verbose,
+    hbool_t swmr_write, int comp_level, const char *index_type,
     unsigned random_seed);
 static void usage(void);
 
@@ -55,9 +61,12 @@ static void usage(void);
  * Parameters:  const char *filename
  *              The SWMR test file's name.
  *
- *              unsigned verbose
+ *              hbool_t verbose
  *              Whether verbose console output is desired.
  *
+ *              hbool_t swmr_write
+ *              Whether to create the file with SWMR writing enabled
+ *
  *              int comp_level
  *              The zlib compression level to use. -1 = no compression.
  *
@@ -69,13 +78,12 @@ static void usage(void);
  *              this value.
  *
  * Return:      Success:    0
- *                          
  *              Failure:    Can't fail
  *
  *-------------------------------------------------------------------------
  */
 static int
-gen_skeleton(const char *filename, unsigned verbose, unsigned swmr_write,
+gen_skeleton(const char *filename, hbool_t verbose, hbool_t swmr_write,
     int comp_level, const char *index_type, unsigned random_seed)
 {
     hid_t fid;          /* File ID for new HDF5 file */
@@ -108,7 +116,7 @@ gen_skeleton(const char *filename, unsigned verbose, unsigned swmr_write,
 
     /* 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.
+     * type, with two unlimited dimensions, we get a v2 B-tree.
      */
     if(!HDstrcmp(index_type, "b2"))
         max_dims[0] = H5S_UNLIMITED;
@@ -207,11 +215,33 @@ gen_skeleton(const char *filename, unsigned verbose, unsigned swmr_write,
         for(v = 0; v < symbol_count[u]; v++) {
             hid_t dsid;         /* Dataset ID */
             char name_buf[64];
+            hbool_t move_dataspace_message = FALSE;     /* Whether to move the dataspace message out of object header chunk #0 */
 
             generate_name(name_buf, u, v);
             if((dsid = H5Dcreate2(fid, name_buf, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
                 return -1;
 
+            /* Determine if the dataspace message for this dataset should be
+             * moved out of chunk #0 of the object header
+             * (Set to TRUE for every fourth dataset)
+             */
+            move_dataspace_message = !(HDrandom() % 4);
+            if(move_dataspace_message) {
+                unsigned chunk_num;        /* Object header chunk # for dataspace message */
+
+                /* Move the dataspace message to a new object header chunk */
+                if(H5O_msg_move_to_new_chunk_test(dsid, H5O_SDSPACE_ID) < 0)
+                    return -1;
+
+                /* Retrieve the chunk # for the dataspace message */
+                chunk_num = UINT_MAX;
+                if(H5O_msg_get_chunkno_test(dsid, H5O_SDSPACE_ID, &chunk_num) < 0)
+                    return -1;
+                /* Should not be in chunk #0 for now */
+                if(0 == chunk_num)
+                    return -1;
+            } /* end if */
+
             if(H5Dclose(dsid) < 0)
                 return -1;
         } /* end for */
@@ -259,10 +289,10 @@ usage(void)
 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 */
+    hbool_t verbose = TRUE;         /* Whether to emit some informational messages */
+    hbool_t swmr_write = FALSE;     /* 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 */
+    hbool_t use_seed = FALSE;       /* Set to TRUE if a seed was set on the command line */
     unsigned random_seed = 0;       /* Random # seed */
     unsigned u;                     /* Local index variables */
     int temp;
@@ -292,7 +322,7 @@ int main(int argc, const char *argv[])
 
                     /* Random # seed */
                     case 'r':
-                        use_seed = 1;
+                        use_seed = TRUE;
                         temp = HDatoi(argv[u + 1]);
                         if(temp < 0)
                             usage();
@@ -303,13 +333,13 @@ int main(int argc, const char *argv[])
 
                     /* Be quiet */
                     case 'q':
-                        verbose = 0;
+                        verbose = FALSE;
                         u++;
                         break;
 
                     /* Run with SWMR_WRITE */
                     case 's':
-                        swmr_write = 1;
+                        swmr_write = TRUE;
                         u++;
                         break;
 
@@ -330,8 +360,9 @@ int main(int argc, const char *argv[])
     } /* end if */
     
     /* Set the random seed */
-    if(0 == use_seed) {
+    if(!use_seed) {
         struct timeval t;
+
         HDgettimeofday(&t, NULL);
         random_seed = (unsigned)(t.tv_usec);
     } /* end if */
diff --git a/test/swmr_reader.c b/test/swmr_reader.c
index 24b5366..e181d3a 100644
--- a/test/swmr_reader.c
+++ b/test/swmr_reader.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -37,10 +35,11 @@
 /* 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 int check_dataset(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    const char *sym_name, symbol_t *record, hid_t rec_sid);
+static int read_records(const char *filename, hbool_t verbose, FILE *verbose_file,
+    unsigned random_seed, unsigned long nseconds, unsigned poll_time,
+    unsigned ncommon, unsigned nrandom);
 
 /*******************/
 /* Local Variables */
@@ -59,9 +58,12 @@ static hid_t symbol_tid = -1;   /* The type ID for the SWMR datasets */
  * Parameters:  hid_t fid
  *              The SWMR test file's ID.
  *
- *              unsigned verbose
+ *              hbool_t verbose
  *              Whether verbose console output is desired.
  *
+ *              FILE *verbose_file
+ *              File handle for verbose output
+ *
  *              const char *sym_name
  *              The name of the dataset from which to read.
  *
@@ -79,8 +81,8 @@ static hid_t symbol_tid = -1;   /* The type ID for the SWMR datasets */
  *-------------------------------------------------------------------------
  */
 static int
-check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *record,
-    hid_t rec_sid)
+check_dataset(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    const char *sym_name, symbol_t *record, hid_t rec_sid)
 {
     hid_t dsid;                 /* Dataset ID */
     hid_t file_sid;             /* Dataset's space ID */
@@ -106,7 +108,7 @@ check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *recor
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Symbol = '%s', # of records = %lld\n", sym_name, (long long)snpoints);
+        HDfprintf(verbose_file, "Symbol = '%s', # of records = %lld\n", sym_name, (long long)snpoints);
 
     /* Check if there are records for symbol */
     if(snpoints > 0) {
@@ -122,9 +124,15 @@ check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *recor
 
         /* Verify record value */
         if(record->rec_id != start[1]) {
-            HDfprintf(stderr, "*** ERROR ***\n");
-            HDfprintf(stderr, "Incorrect record value!\n");
-            HDfprintf(stderr, "Symbol = '%s', # of records = %lld, record->rec_id = %llu\n", sym_name, (long long)snpoints, (unsigned long long)record->rec_id);
+            struct timeval tv;
+
+            HDgettimeofday(&tv, NULL);
+
+            if(verbose) {
+                HDfprintf(verbose_file, "*** ERROR ***\n");
+                HDfprintf(verbose_file, "Incorrect record value!\n");
+                HDfprintf(verbose_file, "Time = %llu.%llu, Symbol = '%s', # of records = %lld, record->rec_id = %llu\n", (unsigned long long)tv.tv_sec, (unsigned long long)tv.tv_usec, sym_name, (long long)snpoints, (unsigned long long)record->rec_id);
+            } /* end if */
             return -1;
         } /* end if */
     } /* end if */
@@ -156,9 +164,15 @@ check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *recor
  * Parameters:  const char *filename
  *              The SWMR test file's name.
  *
- *              unsigned verbose
+ *              hbool_t verbose
  *              Whether verbose console output is desired.
  *
+ *              FILE *verbose_file
+ *              File handle for verbose output
+ *
+ *              unsigned random_seed
+ *              Random seed for the file (used for verbose logging)
+ *
  *              unsigned long nseconds
  *              The amount of time to read records (ns).
  *
@@ -177,8 +191,9 @@ check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *recor
  *-------------------------------------------------------------------------
  */
 static int
-read_records(const char *filename, unsigned verbose, unsigned long nseconds,
-    unsigned poll_time, unsigned ncommon, unsigned nrandom)
+read_records(const char *filename, hbool_t verbose, FILE *verbose_file,
+    unsigned random_seed, unsigned long nseconds, unsigned poll_time,
+    unsigned ncommon, unsigned nrandom)
 {
     time_t start_time;          /* Starting time */
     time_t curr_time;           /* Current time */
@@ -189,6 +204,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
     hid_t fapl;                 /* file access property list */
     symbol_t record;            /* The record to read from the dataset */
     unsigned v;                 /* Local index variable */
+    hbool_t use_log_vfd = FALSE;    /* Use the log VFD (set this manually) */
 
     HDassert(filename);
     HDassert(nseconds != 0);
@@ -200,7 +216,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Choosing datasets\n");
+        HDfprintf(verbose_file, "Choosing datasets\n");
 
     /* Allocate space for 'common' datasets, if any */
     if(ncommon > 0) {
@@ -214,12 +230,12 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
             /* Determine the offset of the symbol, within level 0 symbols */
             /* (level 0 symbols are the most common symbols) */
-            offset = (unsigned)(HDrandom() % symbol_count[0]);
+            offset = (unsigned)((unsigned)HDrandom() % symbol_count[0]);
             sym_com[v] = &symbol_info[0][offset];
 
             /* Emit informational message */
             if(verbose)
-                HDfprintf(stderr, "Common symbol #%u = '%s'\n", v, symbol_info[0][offset].name);
+                HDfprintf(verbose_file, "Common symbol #%u = '%s'\n", v, symbol_info[0][offset].name);
         } /* end for */
     } /* end if */
 
@@ -240,7 +256,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
             /* Emit informational message */
             if(verbose)
-                HDfprintf(stderr, "Random symbol #%u = '%s'\n", v, sym->name);
+                HDfprintf(verbose_file, "Random symbol #%u = '%s'\n", v, sym->name);
         } /* end for */
     } /* end if */
 
@@ -250,7 +266,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Reading records\n");
+        HDfprintf(verbose_file, "Reading records\n");
 
     /* Get the starting time */
     start_time = HDtime(NULL);
@@ -260,12 +276,21 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
     if((fapl = h5_fileaccess()) < 0)
         return -1;
 
+    /* Log I/O when verbose output it enbabled */
+    if(use_log_vfd) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_reader.log.%u", random_seed);
+
+        H5Pset_fapl_log(fapl, verbose_name, H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+    } /* end if */
+
     /* 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)
-            HDfprintf(stderr, "Opening file: %s\n", filename);
+            HDfprintf(verbose_file, "Opening file: %s\n", filename);
 
         /* Open the file */
         if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
@@ -275,12 +300,12 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
         if(ncommon > 0) {
             /* Emit informational message */
             if(verbose)
-                HDfprintf(stderr, "Checking common symbols\n");
+                HDfprintf(verbose_file, "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)
+                if(check_dataset(fid, verbose, verbose_file, sym_com[v]->name, &record, mem_sid) < 0)
                     return -1;
                 HDmemset(&record, 0, sizeof(record));
             } /* end for */
@@ -290,12 +315,12 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
         if(nrandom > 0) {
             /* Emit informational message */
             if(verbose)
-                HDfprintf(stderr, "Checking random symbols\n");
+                HDfprintf(verbose_file, "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)
+                if(check_dataset(fid, verbose, verbose_file, sym_rand[v]->name, &record, mem_sid) < 0)
                     return -1;
                 HDmemset(&record, 0, sizeof(record));
             } /* end for */
@@ -303,7 +328,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
         /* Emit informational message */
         if(verbose)
-            HDfprintf(stderr, "Closing file\n");
+            HDfprintf(verbose_file, "Closing file\n");
             
         /* Close the file */
         if(H5Fclose(fid) < 0)
@@ -326,7 +351,7 @@ read_records(const char *filename, unsigned verbose, unsigned long nseconds,
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing datasets\n");
+        HDfprintf(verbose_file, "Closing datasets\n");
 
     /* Close 'random' datasets, if any */
     if(nrandom > 0) {
@@ -368,8 +393,9 @@ int main(int argc, const char *argv[])
     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 */
+    hbool_t verbose = TRUE; /* Whether to emit some informational messages */
+    FILE *verbose_file = NULL;  /* File handle for verbose output */
+    hbool_t use_seed = FALSE; /* 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;
@@ -400,13 +426,13 @@ int main(int argc, const char *argv[])
 
                     /* Be quiet */
                     case 'q':
-                        verbose = 0;
+                        verbose = FALSE;
                         u++;
                         break;
 
                     /* Random # seed */
                     case 'r':
-                        use_seed = 1;
+                        use_seed = TRUE;
                         temp = HDatoi(argv[u + 1]);
                         if(temp < 0)
                             usage();
@@ -443,28 +469,41 @@ int main(int argc, const char *argv[])
     if(poll_time >= nseconds)
         usage();
 
-    /* Emit informational message */
-    if(verbose) {
-        HDfprintf(stderr, "Parameters:\n");
-        HDfprintf(stderr, "\t# of seconds between polling = %d\n", poll_time);
-        HDfprintf(stderr, "\t# of common symbols to poll = %d\n", ncommon);
-        HDfprintf(stderr, "\t# of random symbols to poll = %d\n", nrandom);
-        HDfprintf(stderr, "\t# of seconds to test = %ld\n", nseconds);
-    } /* end if */
-
     /* Set the random seed */
-    if(0 == use_seed) {
+    if(!use_seed) {
         struct timeval t;
+
         HDgettimeofday(&t, NULL);
         random_seed = (unsigned)(t.tv_usec);
     } /* end if */
     HDsrandom(random_seed);
+
+    /* Open output file */
+    if(verbose) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_reader.out.%u", random_seed);
+        if(NULL == (verbose_file = HDfopen(verbose_name, "w"))) {
+            HDfprintf(stderr, "Can't open verbose output file!\n");
+            HDexit(1);
+        }
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose) {
+        HDfprintf(verbose_file, "Parameters:\n");
+        HDfprintf(verbose_file, "\t# of seconds between polling = %d\n", poll_time);
+        HDfprintf(verbose_file, "\t# of common symbols to poll = %d\n", ncommon);
+        HDfprintf(verbose_file, "\t# of random symbols to poll = %d\n", nrandom);
+        HDfprintf(verbose_file, "\t# of seconds to test = %ld\n", nseconds);
+    } /* end if */
+
     /* ALWAYS emit the random seed for possible debugging */
-    HDfprintf(stderr, "Using reader random seed: %u\n", random_seed);
+    HDfprintf(stdout, "Using reader random seed: %u\n", random_seed);
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Generating symbol names\n");
+        HDfprintf(verbose_file, "Generating symbol names\n");
 
     /* Generate dataset names */
     if(generate_symbols() < 0) {
@@ -477,14 +516,14 @@ int main(int argc, const char *argv[])
         return -1;
 
     /* Reading records from datasets */
-    if(read_records(FILENAME, verbose, (unsigned long)nseconds, (unsigned)poll_time, (unsigned)ncommon, (unsigned)nrandom) < 0) {
-        HDfprintf(stderr, "Error reading records from datasets!\n");
+    if(read_records(FILENAME, verbose, verbose_file, random_seed, (unsigned long)nseconds, (unsigned)poll_time, (unsigned)ncommon, (unsigned)nrandom) < 0) {
+        HDfprintf(stderr, "Error reading records from datasets (random_seed = %u)!\n", random_seed);
         HDexit(1);
     } /* end if */
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Releasing symbols\n");
+        HDfprintf(verbose_file, "Releasing symbols\n");
 
     /* Clean up the symbols */
     if(shutdown_symbols() < 0) {
@@ -494,7 +533,7 @@ int main(int argc, const char *argv[])
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing objects\n");
+        HDfprintf(verbose_file, "Closing objects\n");
 
     /* Close objects created */
     if(H5Tclose(symbol_tid) < 0) {
@@ -504,3 +543,4 @@ int main(int argc, const char *argv[])
 
     return 0;
 }
+
diff --git a/test/swmr_remove_reader.c b/test/swmr_remove_reader.c
index 689b010..11649e3 100644
--- a/test/swmr_remove_reader.c
+++ b/test/swmr_remove_reader.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/test/swmr_remove_writer.c b/test/swmr_remove_writer.c
index 8f111a2..82c2f8b 100644
--- a/test/swmr_remove_writer.c
+++ b/test/swmr_remove_writer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -345,7 +343,7 @@ int main(int argc, const char *argv[])
     } /* end if */
 
     /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
-    h5_send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Emit informational message */
     if(verbose)
diff --git a/test/swmr_sparse_reader.c b/test/swmr_sparse_reader.c
index f755cd2..3c98f48 100644
--- a/test/swmr_sparse_reader.c
+++ b/test/swmr_sparse_reader.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
diff --git a/test/swmr_sparse_writer.c b/test/swmr_sparse_writer.c
index 66afb3b..e46f54c 100644
--- a/test/swmr_sparse_writer.c
+++ b/test/swmr_sparse_writer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
  /*-------------------------------------------------------------------------
@@ -173,10 +171,10 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
     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 */
+#ifdef OUT
     volatile int dummy;                 /* Dummy varialbe for busy sleep */
+#endif /* OUT */
     hsize_t dim[2] = {1,0};             /* Dataspace dimensions */
     unsigned long u, v;                 /* Local index variables */
 
@@ -194,38 +192,29 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
     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;
-    HDmemcpy(&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 */
+        hbool_t corked;         /* Whether the dataset was corked */
 
         /* 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;
 
+            /* Cork the metadata cache, to prevent the object header from being
+             * flushed before the data has been written */
+            if(H5Odisable_mdc_flushes(symbol->dsid) < 0)
+                return -1;
+            corked = TRUE;
+
             if(H5Dset_extent(symbol->dsid, dim) < 0)
                 return -1;
 
@@ -236,8 +225,11 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
             if(H5Sclose(file_sid) < 0)
                 return -1;
         } /* end if */
-        else if((aid = H5Aopen(symbol->dsid, "seq", H5P_DEFAULT)) < 0)
-            return -1;
+        else {
+            if((aid = H5Aopen(symbol->dsid, "seq", H5P_DEFAULT)) < 0)
+                return -1;
+            corked = FALSE;
+        } /* end else */
 
         /* Get the coordinate to write */
         start[1] = (hsize_t)HDrandom() % symbol->nrecords;
@@ -270,9 +262,10 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
         if(H5Aclose(aid) < 0)
             return -1;
 
-        /* Uncork the metadata cache */
-        /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
-            return(-1);*/
+        /* Uncork the metadata cache, if it's been */
+        if(corked)
+            if(H5Oenable_mdc_flushes(symbol->dsid) < 0)
+                return -1;
 
         /* Close the dataset's dataspace */
         if(H5Sclose(file_sid) < 0)
@@ -423,7 +416,7 @@ int main(int argc, const char *argv[])
     } /* end if */
 
     /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
-    h5_send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Emit informational message */
     if(verbose)
diff --git a/test/swmr_start_write.c b/test/swmr_start_write.c
index fe8690f..2d5c3f9 100644
--- a/test/swmr_start_write.c
+++ b/test/swmr_start_write.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -38,15 +36,17 @@
 /* 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 hid_t create_file(const char *filename, hbool_t verbose,
+    FILE *verbose_file, unsigned random_seed);
+static int create_datasets(hid_t fid, int comp_level, hbool_t verbose,
+    FILE *verbose_file, const char *index_type);
+static int create_close_datasets(hid_t fid, int comp_level, hbool_t verbose,
+    FILE *verbose_file);
+static int open_datasets(hid_t fid, hbool_t verbose, FILE *verbose_file);
+static hid_t open_file(const char *filename, hbool_t verbose,
+    FILE *verbose_file);
+static int add_records(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    unsigned long nrecords, unsigned long flush_count);
 static void usage(void);
 
 #define CHUNK_SIZE      50      /* Chunk size for created datasets */
@@ -61,7 +61,7 @@ static void usage(void);
  * 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)
+ *              verbose_file: file pointer for verbose output
  *              random_seed: The random seed to store in the file.  
  *              The sparse tests use this value.
  *
@@ -71,21 +71,16 @@ static void usage(void);
  *-------------------------------------------------------------------------
  */
 static hid_t
-create_file(const char *filename, unsigned verbose,
-    const char *index_type, unsigned random_seed)
+create_file(const char *filename, hbool_t verbose, FILE *verbose_file,
+    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 */
 
     HDassert(filename);
-    HDassert(index_type);
 
     /* Create file access property list */
     if((fapl = h5_fileaccess()) < 0)
@@ -95,12 +90,15 @@ create_file(const char *filename, unsigned verbose,
     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(!HDstrcmp(index_type, "b2"))
-        max_dims[0] = H5S_UNLIMITED;
+#ifdef QAK
+    if(verbose) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_start_write.log.%u", random_seed);
+
+        H5Pset_fapl_log(fapl, verbose_name, H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+    } /* end if */
+#endif /* QAK */
 
     /* Create file creation property list */
     if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
@@ -108,7 +106,7 @@ create_file(const char *filename, unsigned verbose,
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Creating file without SWMR access\n");
+        HDfprintf(verbose_file, "Creating file without SWMR access\n");
 
     /* Create the file */
     if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
@@ -147,7 +145,9 @@ create_file(const char *filename, unsigned verbose,
  * Parameters:  
  *              fid: file ID for the SWMR test file
  *              comp_level: the compresssion level
+ *              index_type: The chunk index type (b1 | b2 | ea | fa)
  *              verbose: whether verbose console output is desired.
+ *              verbose_file: file pointer for verbose output
  *
  * Return:      Success:    0
  *              Failure:    -1
@@ -155,7 +155,8 @@ create_file(const char *filename, unsigned verbose,
  *-------------------------------------------------------------------------
  */
 static int
-create_datasets(hid_t fid, int comp_level, unsigned verbose)
+create_datasets(hid_t fid, int comp_level, hbool_t verbose, FILE *verbose_file,
+    const char *index_type)
 {
     hid_t dcpl;         /* Dataset creation property list */
     hid_t tid;          /* Datatype for dataset elements */
@@ -165,10 +166,19 @@ create_datasets(hid_t fid, int comp_level, unsigned verbose)
     hsize_t chunk_dims[2] = {1, CHUNK_SIZE}; /* Chunk dimensions */
     unsigned u, v;      /* Local index variable */
 
+    HDassert(index_type);
+
     /* Create datatype for creating datasets */
     if((tid = create_symbol_datatype()) < 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(!HDstrcmp(index_type, "b2"))
+        max_dims[0] = H5S_UNLIMITED;
+
     /* Create dataspace for creating datasets */
     if((sid = H5Screate_simple(2, dims, max_dims)) < 0)
         return -1;
@@ -185,7 +195,7 @@ create_datasets(hid_t fid, int comp_level, unsigned verbose)
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Creating datasets\n");
+        HDfprintf(verbose_file, "Creating datasets\n");
 
     /* Create the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -211,6 +221,7 @@ create_datasets(hid_t fid, int comp_level, unsigned verbose)
  *              fid: file ID for the SWMR test file
  *              comp_level: the compresssion level
  *              verbose: whether verbose console output is desired.
+ *              verbose_file: file pointer for verbose output
  *
  * Return:      Success:    0
  *              Failure:    -1
@@ -218,7 +229,7 @@ create_datasets(hid_t fid, int comp_level, unsigned verbose)
  *-------------------------------------------------------------------------
  */
 static int
-create_close_datasets(hid_t fid, int comp_level, unsigned verbose)
+create_close_datasets(hid_t fid, int comp_level, hbool_t verbose, FILE *verbose_file)
 {
     hid_t dcpl;         /* Dataset creation property list */
     hid_t tid;          /* Datatype for dataset elements */
@@ -248,7 +259,7 @@ create_close_datasets(hid_t fid, int comp_level, unsigned verbose)
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Creating datasets\n");
+        HDfprintf(verbose_file, "Creating datasets\n");
 
     /* Create the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -284,6 +295,7 @@ create_close_datasets(hid_t fid, int comp_level, unsigned verbose)
  * Parameters:  
  *              filename: The filename of the HDF5 file to open
  *              verbose: whether or not to emit verbose console messages
+ *              verbose_file: file pointer for verbose output
  *
  * Return:      Success: The file ID of the opened SWMR file
  *              Failure: -1
@@ -291,7 +303,7 @@ create_close_datasets(hid_t fid, int comp_level, unsigned verbose)
  *-------------------------------------------------------------------------
  */
 static hid_t
-open_file(const char *filename, unsigned verbose)
+open_file(const char *filename, hbool_t verbose, FILE *verbose_file)
 {
     hid_t fid;          /* File ID for new HDF5 file */
     hid_t fapl;         /* File access property list */
@@ -308,7 +320,7 @@ open_file(const char *filename, unsigned verbose)
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Opening the file without SWMR access: %s\n", filename);
+        HDfprintf(verbose_file, "Opening the file without SWMR access: %s\n", filename);
 
     /* Open the file */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
@@ -331,6 +343,7 @@ open_file(const char *filename, unsigned verbose)
  * Parameters:  
  *              filename: the filename of the SWMR HDF5 file to open
  *              verbose: whether or not to emit verbose console messages
+ *              verbose_file: file pointer for verbose output
  *
  * Return:      Success: 0
  *              Failure: -1
@@ -338,13 +351,13 @@ open_file(const char *filename, unsigned verbose)
  *-------------------------------------------------------------------------
  */
 static int
-open_datasets(hid_t fid, unsigned verbose)
+open_datasets(hid_t fid, hbool_t verbose, FILE *verbose_file)
 {
     unsigned u, v;      /* Local index variable */
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Opening datasets\n");
+        HDfprintf(verbose_file, "Opening datasets\n");
 
     /* Open the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -367,6 +380,7 @@ open_datasets(hid_t fid, unsigned verbose)
  * Parameters:  
  *              fid: The file ID of the SWMR HDF5 file
  *              verbose: Whether or not to emit verbose console messages
+ *              verbose_file: file pointer for verbose output
  *              nrecords: # of records to write to the datasets
  *              flush_count: # of records to write before flushing the file to disk
  *
@@ -376,15 +390,14 @@ open_datasets(hid_t fid, unsigned verbose)
  *-------------------------------------------------------------------------
  */
 static int
-add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long flush_count)
+add_records(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    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 */
 
@@ -402,17 +415,6 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
     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;
-    HDmemcpy(&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++) {
@@ -428,6 +430,11 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
         /* 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(H5Odisable_mdc_flushes(symbol->dsid) < 0)
+            return -1;
+
         /* Extend the dataset's dataspace to hold the new record */
         symbol->nrecords++;
         dim[1] = symbol->nrecords;
@@ -446,6 +453,10 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
         if(H5Dwrite(symbol->dsid, tid, mem_sid, file_sid, H5P_DEFAULT, &record) < 0)
             return -1;
 
+        /* Uncork the metadata cache */
+        if(H5Oenable_mdc_flushes(symbol->dsid) < 0)
+            return -1;
+
         /* Close the dataset's dataspace */
         if(H5Sclose(file_sid) < 0)
             return -1;
@@ -477,7 +488,7 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing datasets\n");
+        HDfprintf(verbose_file, "Closing datasets\n");
 
     /* Close the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -526,8 +537,9 @@ 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 */
+    hbool_t verbose = TRUE;         /* Whether to emit some informational messages */
+    FILE *verbose_file = NULL;      /* File handle for verbose output */
+    hbool_t use_seed = FALSE;       /* Set to TRUE 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 */
@@ -569,13 +581,13 @@ int main(int argc, const char *argv[])
 
                     /* Be quiet */
                     case 'q':
-                        verbose = 0;
+                        verbose = FALSE;
                         u++;
                         break;
                     
                     /* Random # seed */
                     case 'r':
-                        use_seed = 1;
+                        use_seed = TRUE;
                         temp = HDatoi(argv[u + 1]);
                         if(temp < 0)
                             usage();
@@ -605,41 +617,54 @@ int main(int argc, const char *argv[])
     if(flush_count >= nrecords)
         usage();
 
-    /* Emit informational message */
-    if(verbose) {
-        HDfprintf(stderr, "Parameters:\n");
-        HDfprintf(stderr, "\tindex type = %s\n", index_type);
-        HDfprintf(stderr, "\tcompression level = %d\n", comp_level);
-        HDfprintf(stderr, "\t# of records between flushes = %ld\n", flush_count);
-        HDfprintf(stderr, "\t# of records to write = %ld\n", nrecords);
-    } /* end if */
-
     /* Set the random seed */
-    if(0 == use_seed) {
+    if(!use_seed) {
         struct timeval t;
+
         HDgettimeofday(&t, NULL);
         random_seed = (unsigned)(t.tv_usec);
     } /* end if */
     HDsrandom(random_seed);
+
+    /* Open output file */
+    if(verbose) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_writer.out.%u", random_seed);
+        if(NULL == (verbose_file = HDfopen(verbose_name, "w"))) {
+            HDfprintf(stderr, "Can't open verbose output file!\n");
+            HDexit(1);
+        }
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose) {
+        HDfprintf(verbose_file, "Parameters:\n");
+        HDfprintf(verbose_file, "\tindex type = %s\n", index_type);
+        HDfprintf(verbose_file, "\tcompression level = %d\n", comp_level);
+        HDfprintf(verbose_file, "\t# of records between flushes = %ld\n", flush_count);
+        HDfprintf(verbose_file, "\t# of records to write = %ld\n", nrecords);
+    } /* end if */
+
     /* ALWAYS emit the random seed for possible debugging */
-    HDfprintf(stderr, "Using writer random seed: %u\n", random_seed);
+    HDfprintf(stdout, "Using writer random seed: %u\n", random_seed);
 
     /* Create the test file */
-    if((fid = create_file(FILENAME, verbose, index_type, random_seed)) < 0) {
+    if((fid = create_file(FILENAME, verbose, verbose_file, random_seed)) < 0) {
         HDfprintf(stderr, "Error creating the file...\n");
         HDexit(1);
     }
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Generating symbol names\n");
+        HDfprintf(verbose_file, "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) {
+    if(create_datasets(fid, comp_level, verbose, verbose_file, index_type) < 0) {
         HDfprintf(stderr, "Error creating datasets...\n");
         HDexit(1);
     }
@@ -650,72 +675,22 @@ int main(int argc, const char *argv[])
         HDexit(1);
     }
 
-#ifdef OUT
-    /* Emit informational message */
-    if(verbose)
-        HDfprintf(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) {
-        HDfprintf(stderr, "Error creating datasets...\n");
-        HDexit(1);
-    }
-
-    /* Close the file */
-    if(H5Fclose(fid) < 0) {
-        HDfprintf(stderr, "Error closing file!\n");
-        HDexit(1);
-    } /* end if */
-
-    /* Open the file */
-    if((fid = open_file(FILENAME, verbose)) < 0) {
-        HDfprintf(stderr, "Error opening the file...\n");
-        HDexit(1);
-    }
-
-
-    /* Emit informational message */
-    if(verbose)
-        HDfprintf(stderr, "Generating symbol names\n");
-
-    /* Generate dataset names */
-    if(generate_symbols() < 0)
-        return -1;
-
-    /* Emit informational message */
-    if(verbose)
-        HDfprintf(stderr, "Opening datasets: %s\n", FILENAME);
-
-    /* Open the file's datasets */
-    if(open_datasets(fid, verbose) < 0) {
-        HDfprintf(stderr, "Error opening datasets...\n");
-        HDexit(1);
-    } /* end if */
-
-
-    /* Enable SWMR writing mode */
-    if(H5Fstart_swmr_write(fid) < 0) {
-        HDfprintf(stderr, "Error starting SWMR writing mode...\n");
-        HDexit(1);
-    }
-#endif
-
     /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
-    h5_send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Adding records\n");
+        HDfprintf(verbose_file, "Adding records\n");
 
     /* Append records to datasets */
-    if(add_records(fid, verbose, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
+    if(add_records(fid, verbose, verbose_file, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
         HDfprintf(stderr, "Error appending records to datasets!\n");
         HDexit(1);
     } /* end if */
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Releasing symbols\n");
+        HDfprintf(verbose_file, "Releasing symbols\n");
 
     /* Clean up the symbols */
     if(shutdown_symbols() < 0) {
@@ -725,7 +700,7 @@ int main(int argc, const char *argv[])
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing the file\n");
+        HDfprintf(verbose_file, "Closing the file\n");
 
     /* Close objects opened */
     if(H5Fclose(fid) < 0) {
@@ -735,3 +710,4 @@ int main(int argc, const char *argv[])
 
     return 0;
 } /* main() */
+
diff --git a/test/swmr_writer.c b/test/swmr_writer.c
index afeab7e..ee7e32e 100644
--- a/test/swmr_writer.c
+++ b/test/swmr_writer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -37,9 +35,10 @@
 /* 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 hid_t open_skeleton(const char *filename, hbool_t verbose, FILE *verbose_file,
+    unsigned random_seed, hbool_t old);
+static int add_records(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    unsigned long nrecords, unsigned long flush_count);
 static void usage(void);
 
 

@@ -51,9 +50,18 @@ static void usage(void);
  * Parameters:  const char *filename
  *              The filename of the SWMR HDF5 file to open
  *
- *              unsigned verbose
+ *              hbool_t verbose
  *              Whether or not to emit verbose console messages
  *
+ *              FILE *verbose_file
+ *              File handle for verbose output
+ *
+ *              unsigned random_seed
+ *              Random seed for the file (used for verbose logging)
+ *
+ *              hbool_t old
+ *              Whether to write in "old" file format
+ *
  * Return:      Success:    The file ID of the opened SWMR file
  *                          The dataset IDs are stored in a global array
  *
@@ -62,11 +70,13 @@ static void usage(void);
  *-------------------------------------------------------------------------
  */
 static hid_t
-open_skeleton(const char *filename, unsigned verbose, unsigned old)
+open_skeleton(const char *filename, hbool_t verbose, FILE *verbose_file,
+    unsigned random_seed, hbool_t old)
 {
     hid_t fid;          /* File ID for new HDF5 file */
     hid_t fapl;         /* File access property list */
     unsigned u, v;      /* Local index variable */
+    hbool_t use_log_vfd = FALSE;    /* Use the log VFD (set this manually) */
 
     HDassert(filename);
 
@@ -96,9 +106,13 @@ open_skeleton(const char *filename, unsigned verbose, unsigned old)
     }
 #endif /* QAK */
 
-#ifdef QAK
-    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
-#endif /* QAK */
+    if(use_log_vfd) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_writer.log.%u", random_seed);
+
+        H5Pset_fapl_log(fapl, verbose_name, H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+    } /* end if */
 
     /* Open the file */
     if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
@@ -110,7 +124,7 @@ open_skeleton(const char *filename, unsigned verbose, unsigned old)
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Opening datasets\n");
+        HDfprintf(verbose_file, "Opening datasets\n");
 
     /* Open the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -133,9 +147,12 @@ open_skeleton(const char *filename, unsigned verbose, unsigned old)
  * Parameters:  hid_t fid
  *              The file ID of the SWMR HDF5 file
  *
- *              unsigned verbose
+ *              hbool_t verbose
  *              Whether or not to emit verbose console messages
  *
+ *              FILE *verbose_file
+ *              File handle for verbose output
+ *
  *              unsigned long nrecords
  *              # of records to write to the datasets
  *
@@ -148,15 +165,14 @@ 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)
+add_records(hid_t fid, hbool_t verbose, FILE *verbose_file,
+    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 */
 
@@ -174,17 +190,6 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
     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;
-    HDmemcpy(&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++) {
@@ -202,8 +207,8 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
 
         /* 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(H5Odisable_mdc_flushes(symbol->dsid) < 0)
+            return -1;
 
         /* Extend the dataset's dataspace to hold the new record */
         symbol->nrecords++;
@@ -224,8 +229,8 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
             return -1;
 
         /* Uncork the metadata cache */
-        /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
-            return -1;*/
+        if(H5Oenable_mdc_flushes(symbol->dsid) < 0)
+            return -1;
 
         /* Close the dataset's dataspace */
         if(H5Sclose(file_sid) < 0)
@@ -258,7 +263,7 @@ add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long f
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing datasets\n");
+        HDfprintf(verbose_file, "Closing datasets\n");
 
     /* Close the datasets */
     for(u = 0; u < NLEVELS; u++)
@@ -294,9 +299,10 @@ 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 */
+    hbool_t verbose = TRUE;     /* Whether to emit some informational messages */
+    FILE *verbose_file = NULL;  /* File handle for verbose output */
+    hbool_t old = FALSE;        /* Whether to use non-latest-format when opening file */
+    hbool_t use_seed = FALSE;   /* Set to TRUE if a seed was set on the command line */
     unsigned random_seed = 0;   /* Random # seed */
     unsigned u;                 /* Local index variable */
     int temp;
@@ -319,13 +325,13 @@ int main(int argc, const char *argv[])
 
                     /* Be quiet */
                     case 'q':
-                        verbose = 0;
+                        verbose = FALSE;
                         u++;
                         break;
                     
                     /* Random # seed */
                     case 'r':
-                        use_seed = 1;
+                        use_seed = TRUE;
                         temp = HDatoi(argv[u + 1]);
                         random_seed = (unsigned)temp;
                         u += 2;
@@ -333,7 +339,7 @@ int main(int argc, const char *argv[])
 
                     /* Use non-latest-format when opening file */
                     case 'o':
-                        old = 1;
+                        old = TRUE;
                         u++;
                         break;
 
@@ -357,26 +363,39 @@ int main(int argc, const char *argv[])
     if(flush_count >= nrecords)
         usage();
 
-    /* Emit informational message */
-    if(verbose) {
-        HDfprintf(stderr, "Parameters:\n");
-        HDfprintf(stderr, "\t# of records between flushes = %ld\n", flush_count);
-        HDfprintf(stderr, "\t# of records to write = %ld\n", nrecords);
-    } /* end if */
-
     /* Set the random seed */
-    if(0 == use_seed) {
+    if(!use_seed) {
         struct timeval t;
+
         HDgettimeofday(&t, NULL);
         random_seed = (unsigned)(t.tv_usec);
     } /* end if */
     HDsrandom(random_seed);
+
+    /* Open output file */
+    if(verbose) {
+        char verbose_name[1024];
+
+        HDsnprintf(verbose_name, sizeof(verbose_name), "swmr_writer.out.%u", random_seed);
+        if(NULL == (verbose_file = HDfopen(verbose_name, "w"))) {
+            HDfprintf(stderr, "Can't open verbose output file!\n");
+            HDexit(1);
+        }
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose) {
+        HDfprintf(verbose_file, "Parameters:\n");
+        HDfprintf(verbose_file, "\t# of records between flushes = %ld\n", flush_count);
+        HDfprintf(verbose_file, "\t# of records to write = %ld\n", nrecords);
+    } /* end if */
+
     /* ALWAYS emit the random seed for possible debugging */
-    HDfprintf(stderr, "Using writer random seed: %u\n", random_seed);
+    HDfprintf(stdout, "Using writer random seed: %u\n", random_seed);
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Generating symbol names\n");
+        HDfprintf(verbose_file, "Generating symbol names\n");
 
     /* Generate dataset names */
     if(generate_symbols() < 0)
@@ -384,30 +403,30 @@ int main(int argc, const char *argv[])
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Opening skeleton file: %s\n", FILENAME);
+        HDfprintf(verbose_file, "Opening skeleton file: %s\n", FILENAME);
 
     /* Open file skeleton */
-    if((fid = open_skeleton(FILENAME, verbose, old)) < 0) {
+    if((fid = open_skeleton(FILENAME, verbose, verbose_file, random_seed, old)) < 0) {
         HDfprintf(stderr, "Error opening skeleton file!\n");
         HDexit(1);
     } /* end if */
 
     /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
-    h5_send_message(WRITER_MESSAGE);
+    h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Adding records\n");
+        HDfprintf(verbose_file, "Adding records\n");
 
     /* Append records to datasets */
-    if(add_records(fid, verbose, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
+    if(add_records(fid, verbose, verbose_file, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
         HDfprintf(stderr, "Error appending records to datasets!\n");
         HDexit(1);
     } /* end if */
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Releasing symbols\n");
+        HDfprintf(verbose_file, "Releasing symbols\n");
 
     /* Clean up the symbols */
     if(shutdown_symbols() < 0) {
@@ -417,7 +436,7 @@ int main(int argc, const char *argv[])
 
     /* Emit informational message */
     if(verbose)
-        HDfprintf(stderr, "Closing objects\n");
+        HDfprintf(verbose_file, "Closing objects\n");
 
     /* Close objects opened */
     if(H5Fclose(fid) < 0) {
@@ -427,3 +446,4 @@ int main(int argc, const char *argv[])
 
     return 0;
 }
+
diff --git a/test/tarray.c b/test/tarray.c
index b05a975..a35b8a3 100644
--- a/test/tarray.c
+++ b/test/tarray.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -26,12 +24,12 @@
 
 #include "hdf5.h"
 
-#define FILENAME        "tarray1.h5"
-#define TESTFILE        "tarrold.h5"
+#define FILENAME   "tarray1.h5"
+#define TESTFILE   "tarrold.h5"
 
 /* 1-D array datatype */
-#define ARRAY1_RANK     1
-#define ARRAY1_DIM1     4
+#define ARRAY1_RANK	1
+#define ARRAY1_DIM1 4
 
 /* 3-D array datatype */
 #define ARRAY2_RANK     3
diff --git a/test/tarrold.h5 b/test/tarrold.h5
index 048838c..7747ce4 100644
Binary files a/test/tarrold.h5 and b/test/tarrold.h5 differ
diff --git a/test/tattr.c b/test/tattr.c
index 585246a..3b0c90e 100644
--- a/test/tattr.c
+++ b/test/tattr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -146,7 +144,7 @@ typedef struct {
     unsigned ncalled;           /* # of times callback is entered */
     unsigned nskipped;          /* # of attributes skipped */
     int stop;                   /* # of iterations to stop after */
-    int64_t curr;               /* Current creation order value */
+    hsize_t curr;               /* Current creation order value */
     size_t max_visit;           /* Size of "visited attribute" flag array */
     hbool_t *visited;           /* Pointer to array of "visited attribute" flags */
 } attr_iter_info_t;
@@ -522,7 +520,7 @@ test_attr_flush(hid_t fapl)
     ret=H5Aread(att, H5T_NATIVE_DOUBLE, &rdata);
     CHECK(ret, FAIL, "H5Awrite");
 
-    if(!H5_DBL_ABS_EQUAL(rdata,0.0F))
+    if(!H5_DBL_ABS_EQUAL(rdata, H5_DOUBLE(0.0)))
         TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,(double)0.0F);
 
     ret=H5Fflush(fil, H5F_SCOPE_GLOBAL);
@@ -531,7 +529,7 @@ test_attr_flush(hid_t fapl)
     ret=H5Aread(att, H5T_NATIVE_DOUBLE, &rdata);
     CHECK(ret, FAIL, "H5Awrite");
 
-    if(!H5_DBL_ABS_EQUAL(rdata,0.0F))
+    if(!H5_DBL_ABS_EQUAL(rdata, H5_DOUBLE(0.0)))
         TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,(double)0.0F);
 
     ret=H5Awrite(att, H5T_NATIVE_DOUBLE, &wdata);
@@ -780,7 +778,7 @@ test_attr_compound_read(hid_t fapl)
     size_t  offset;     /* Attribute datatype field offset */
     hid_t   field;      /* Attribute field datatype */
     struct attr4_struct read_data4[ATTR4_DIM1][ATTR4_DIM2]; /* Buffer for reading 4th attribute */
-    size_t  name_len;   /* Length of attribute name */
+    ssize_t  name_len;  /* Length of attribute name */
     H5O_info_t oinfo;   /* Object info */
     int     i, j;       /* Local index variables */
     herr_t  ret;	/* Generic return value	*/
@@ -1187,7 +1185,7 @@ test_attr_mult_read(hid_t fapl)
     int     read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */
     int     read_data2[ATTR2_DIM1][ATTR2_DIM2] = {{0}}; /* Buffer for reading 2nd attribute */
     double  read_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3] = {{{0}}}; /* Buffer for reading 3rd attribute */
-    size_t  name_len;   /* Length of attribute name */
+    ssize_t  name_len;  /* Length of attribute name */
     H5O_info_t oinfo;   /* Object info */
     int     i, j, k;    /* Local index values */
     herr_t  ret;	/* Generic return value */
@@ -1510,7 +1508,7 @@ test_attr_delete(hid_t fapl)
     hid_t   dataset;	/* Dataset ID			*/
     hid_t   attr;       /* Attribute ID			*/
     char    attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */
-    size_t  name_len;   /* Length of attribute name     */
+    ssize_t name_len;   /* Length of attribute name     */
     H5O_info_t oinfo;   /* Object info                  */
     herr_t  ret;	/* Generic return value		*/
 
@@ -2078,7 +2076,7 @@ test_attr_dense_verify(hid_t loc_id, unsigned max_attr)
 
     /* Re-open all the attributes by index and verify the data */
     for(u = 0; u < max_attr; u++) {
-        size_t name_len;                /* Length of attribute name */
+        ssize_t name_len;               /* Length of attribute name */
         char check_name[ATTR_NAME_LEN]; /* Buffer for checking attribute names */
 
         /* Open attribute */
@@ -5560,7 +5558,7 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n,
 
     /* Verify the name for new link, in increasing creation order */
     HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-    ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+    ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
     CHECK(ret, FAIL, "H5Aget_name_by_idx");
     if(HDstrcmp(attrname, tmpname))
         TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__);
@@ -5585,7 +5583,7 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n,
 
         /* Verify the name for new link, in increasing native order */
         HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-        ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+        ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
         CHECK(ret, FAIL, "H5Aget_name_by_idx");
         if(HDstrcmp(attrname, tmpname))
             TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__);
@@ -5606,7 +5604,7 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n,
 
     /* Verify the name for new link, in increasing creation order */
     HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-    ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+    ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
     CHECK(ret, FAIL, "H5Aget_name_by_idx");
     if(HDstrcmp(attrname, tmpname))
         TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__);
@@ -5626,7 +5624,7 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n,
 
     /* Verify the name for new link, in increasing name order */
     HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-    ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+    ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
     CHECK(ret, FAIL, "H5Aget_name_by_idx");
     if(HDstrcmp(attrname, tmpname))
         TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__);
@@ -5651,7 +5649,7 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n,
 
     /* Verify the name for new link, in increasing name order */
     HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-    ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+    ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
     CHECK(ret, FAIL, "H5Aget_name_by_idx");
     if(HDstrcmp(attrname, tmpname))
         TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__);
@@ -5760,7 +5758,7 @@ test_attr_info_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
             /* Check for query on non-existant attribute */
             ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, &ainfo, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_info_by_idx");
-            ret = H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+            ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_name_by_idx");
 
             /* Create attributes, up to limit of compact form */
@@ -5797,7 +5795,7 @@ test_attr_info_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
             VERIFY(ret, FAIL, "H5Aget_info_by_idx");
             ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_info_by_idx");
-            ret = H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+            ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_name_by_idx");
 
             /* Create more attributes, to push into dense form */
@@ -5847,7 +5845,7 @@ test_attr_info_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
             VERIFY(ret, FAIL, "H5Aget_info_by_idx");
             ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_info_by_idx");
-            ret = H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+            ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
             VERIFY(ret, FAIL, "H5Aget_name_by_idx");
         } /* end for */
 
@@ -6074,7 +6072,7 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
 
                         /* Verify the name for first attribute in appropriate order */
                         HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-                        ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+                        ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
                         if(order == H5_ITER_INC)
                             sprintf(attrname, "attr %02u", (u + 1));
                         else
@@ -6199,7 +6197,7 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
 
                         /* Verify the name for first attribute in appropriate order */
                         HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-                        ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+                        ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
                         if(order == H5_ITER_INC)
                             sprintf(attrname, "attr %02u", (u + 1));
                         else
@@ -6310,7 +6308,7 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
 
                         /* Verify the name for first attribute in appropriate order */
                         HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-                        ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+                        ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
                         if(order == H5_ITER_INC)
                             sprintf(attrname, "attr %02u", ((u * 2) + 1));
                         else
@@ -6359,7 +6357,7 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
 
                         /* Verify the name for first attribute in appropriate order */
                         HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-                        ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
+                        ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT);
                         if(order == H5_ITER_INC)
                             sprintf(attrname, "attr %02u", ((u * 2) + 3));
                         else
@@ -8029,7 +8027,7 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl)
     htri_t	is_shared;	/* Is attributes shared? */
     hsize_t     shared_refcount;        /* Reference count of shared attribute */
     unsigned    attr_value;     /* Attribute value */
-    unsigned	big_value[SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3];   /* Data for "big" attribute */
+    unsigned	*big_value;     /* Data for "big" attribute */
     size_t      mesg_count;     /* # of shared messages */
     unsigned    test_shared;    /* Index over shared component type */
     unsigned    u;              /* Local index variable */
@@ -8040,8 +8038,10 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl)
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Writing Shared & Unshared Attributes in Compact & Dense Storage\n"));
 
-    /* Initialize "big" attribute data */
-    HDmemset(big_value, 1, sizeof(big_value));
+    /* Allocate & initialize "big" attribute data */
+    big_value = (unsigned *)HDmalloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned));
+    CHECK(big_value, NULL, "HDmalloc");
+    HDmemset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3));
 
     /* Create dataspace for dataset */
     sid = H5Screate(H5S_SCALAR);
@@ -8328,6 +8328,9 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Sclose");
     ret = H5Sclose(big_sid);
     CHECK(ret, FAIL, "H5Sclose");
+
+    /* Release memory */
+    HDfree(big_value);
 }   /* test_attr_shared_write() */
 
 /****************************************************************
@@ -8355,7 +8358,7 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl)
     htri_t	is_shared;	/* Is attributes shared? */
     hsize_t     shared_refcount;        /* Reference count of shared attribute */
     unsigned    attr_value;     /* Attribute value */
-    unsigned	big_value[SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3];   /* Data for "big" attribute */
+    unsigned	*big_value;     /* Data for "big" attribute */
     size_t      mesg_count;     /* # of shared messages */
     unsigned    test_shared;    /* Index over shared component type */
     unsigned    u;              /* Local index variable */
@@ -8366,8 +8369,10 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl)
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage\n"));
 
-    /* Initialize "big" attribute data */
-    HDmemset(big_value, 1, sizeof(big_value));
+    /* Allocate & initialize "big" attribute data */
+    big_value = (unsigned *)HDmalloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned));
+    CHECK(big_value, NULL, "HDmalloc");
+    HDmemset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3));
 
     /* Create dataspace for dataset */
     sid = H5Screate(H5S_SCALAR);
@@ -8770,6 +8775,9 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Sclose");
     ret = H5Sclose(big_sid);
     CHECK(ret, FAIL, "H5Sclose");
+
+    /* Release memory */
+    HDfree(big_value);
 }   /* test_attr_shared_rename() */
 
 /****************************************************************
@@ -8796,7 +8804,7 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl)
     htri_t	is_shared;	/* Is attributes shared? */
     hsize_t     shared_refcount;        /* Reference count of shared attribute */
     unsigned    attr_value;     /* Attribute value */
-    unsigned	big_value[SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3];   /* Data for "big" attribute */
+    unsigned	*big_value;     /* Data for "big" attribute */
     size_t      mesg_count;     /* # of shared messages */
     unsigned    test_shared;    /* Index over shared component type */
     unsigned    u;              /* Local index variable */
@@ -8807,8 +8815,10 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl)
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage\n"));
 
-    /* Initialize "big" attribute data */
-    HDmemset(big_value, 1, sizeof(big_value));
+    /* Allocate & initialize "big" attribute data */
+    big_value = (unsigned *)HDmalloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned));
+    CHECK(big_value, NULL, "HDmalloc");
+    HDmemset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3));
 
     /* Create dataspace for dataset */
     sid = H5Screate(H5S_SCALAR);
@@ -9134,6 +9144,9 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Sclose");
     ret = H5Sclose(big_sid);
     CHECK(ret, FAIL, "H5Sclose");
+
+    /* Release memory */
+    HDfree(big_value);
 }   /* test_attr_shared_delete() */
 
 /****************************************************************
@@ -9160,7 +9173,7 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl)
     htri_t	is_shared;	/* Is attributes shared? */
     hsize_t     shared_refcount;        /* Reference count of shared attribute */
     unsigned    attr_value;     /* Attribute value */
-    unsigned	big_value[SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3];   /* Data for "big" attribute */
+    unsigned	*big_value;     /* Data for "big" attribute */
     size_t      mesg_count;     /* # of shared messages */
     unsigned    test_shared;    /* Index over shared component type */
     unsigned    u;              /* Local index variable */
@@ -9171,8 +9184,10 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl)
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Unlinking Object with Shared Attributes in Compact & Dense Storage\n"));
 
-    /* Initialize "big" attribute data */
-    HDmemset(big_value, 1, sizeof(big_value));
+    /* Allocate & initialize "big" attribute data */
+    big_value = (unsigned *)HDmalloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned));
+    CHECK(big_value, NULL, "HDmalloc");
+    HDmemset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3));
 
     /* Create dataspace for dataset */
     sid = H5Screate(H5S_SCALAR);
@@ -9484,6 +9499,9 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Sclose");
     ret = H5Sclose(big_sid);
     CHECK(ret, FAIL, "H5Sclose");
+
+    /* Release memory */
+    HDfree(big_value);
 }   /* test_attr_shared_unlink() */
 
 /****************************************************************
@@ -9864,7 +9882,7 @@ test_attr_bug3(hid_t fcpl, hid_t fapl)
             wdata1[u][v] = (int)((u * dims1[1]) + v);
     for(u = 0; u < dims2[0]; u++)
         for(v = 0; v < dims2[1]; v++)
-            wdata2[u][v] = (int)((u * dims2[1]) + v);
+            wdata2[u][v] = (unsigned)((u * dims2[1]) + v);
 
     /* Write data to the attributes */
     ret = H5Awrite(aid1, H5T_NATIVE_INT, wdata1);
diff --git a/test/tcheck_version.c b/test/tcheck_version.c
index a75d642..574d7c9 100644
--- a/test/tcheck_version.c
+++ b/test/tcheck_version.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -65,7 +63,7 @@ parse(int ac, char **av)
 	pt = *(++av);
 	if (*pt != '-') {
 	    fprintf(stderr, "Unknown option(%s). Aborted.\n", *av);
-	    exit(1);
+	    exit(EXIT_FAILURE);
 	}else{
 	    switch(*(++pt)) {
 		case 't': 	/* option -t */
@@ -81,15 +79,15 @@ parse(int ac, char **av)
 			    break;
 			default:
 			    fprintf(stderr, "Unknown -v parameter (%s). Aborted.\n", *av);
-			    exit(1);
+			    exit(EXIT_FAILURE);
 		    }
 		    break;
 		case 'h':	/* help page */
 		    showhelp();
-		    exit(0);
+		    exit(EXIT_SUCCESS);
 		default:
 		    fprintf(stderr, "Unknown option(%s). Aborted.\n", *av);
-		    exit(1);
+		    exit(EXIT_FAILURE);
 	    }
 	}
     }
@@ -104,7 +102,7 @@ parse(int ac, char **av)
  * some systems may produce extra messages and/or produce core dump.
  * This tries to eliminate those side effects.
  */
-void
+H5_ATTR_NORETURN void
 abort_intercept (int H5_ATTR_UNUSED sig)
 {
     HDexit(6);
diff --git a/test/tchecksum.c b/test/tchecksum.c
index 350a218..febaacc 100644
--- a/test/tchecksum.c
+++ b/test/tchecksum.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*-------------------------------------------------------------------------
@@ -37,7 +35,6 @@
 /*******************/
 /* Local variables */
 /*******************/
-uint8_t large_buf[BUF_LEN];
 
 

 /****************************************************************
@@ -184,33 +181,41 @@ test_chksum_size_four(void)
 static void
 test_chksum_large(void)
 {
+    uint8_t *large_buf;         /* Buffer for checksum calculations */
     uint32_t chksum;            /* Checksum value */
     size_t u;                   /* Local index variable */
 
+    /* Allocate the buffer */
+    large_buf = (uint8_t *)HDmalloc((size_t)BUF_LEN);
+    CHECK(large_buf, NULL, "HDmalloc");
+
     /* Initialize buffer w/known data */
     for(u = 0; u < BUF_LEN; u++)
-        large_buf[u] = u * 3;
+        large_buf[u] = (uint8_t)(u * 3);
 
     /* Buffer w/real data */
-    chksum = H5_checksum_fletcher32(large_buf, sizeof(large_buf));
+    chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN);
     VERIFY(chksum, 0x85b4e2a, "H5_checksum_fletcher32");
 
-    chksum = H5_checksum_crc(large_buf, sizeof(large_buf));
+    chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN);
     VERIFY(chksum, 0xfbd0f7c0, "H5_checksum_crc");
 
-    chksum = H5_checksum_lookup3(large_buf, sizeof(large_buf), 0);
+    chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0);
     VERIFY(chksum, 0x1bd2ee7b, "H5_checksum_lookup3");
 
     /* Buffer w/zero(s) for data */
-    HDmemset(large_buf, 0, sizeof(large_buf));
-    chksum = H5_checksum_fletcher32(large_buf, sizeof(large_buf));
+    HDmemset(large_buf, 0, (size_t)BUF_LEN);
+    chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN);
     VERIFY(chksum, 0, "H5_checksum_fletcher32");
 
-    chksum = H5_checksum_crc(large_buf, sizeof(large_buf));
+    chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN);
     VERIFY(chksum, 0xfac8b4c4, "H5_checksum_crc");
 
-    chksum = H5_checksum_lookup3(large_buf, sizeof(large_buf), 0);
+    chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0);
     VERIFY(chksum, 0x930c7afc, "H5_checksum_lookup3");
+
+    /* Release memory for buffer */
+    HDfree(large_buf);
 } /* test_chksum_large() */
 
 

@@ -247,7 +252,7 @@ test_checksum(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE H5_ATTR_CONST void
 cleanup_checksum(void)
 {
     /* no file to clean */
diff --git a/test/tconfig.c b/test/tconfig.c
index 14c863e..a9f3378 100644
--- a/test/tconfig.c
+++ b/test/tconfig.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -42,8 +40,8 @@
 /* Needs this extra step so that we can print the macro name. */
 #define vrfy_macrosize(type, macro, macroname) \
     if (sizeof(type) != macro) \
-	TestErrPrintf("Error: sizeof(%s) is %d but %s is %d\n", \
-	    #type, sizeof(type), macroname, macro);
+	TestErrPrintf("Error: sizeof(%s) is %zu but %s is %d\n", \
+	    #type, sizeof(type), macroname, (int)macro);
 
 /* local routine prototypes */
 void test_config_ctypes(void);
@@ -86,7 +84,7 @@ test_configure(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE void
 cleanup_configure(void)
 {
     /* no file to clean */
@@ -109,7 +107,7 @@ cleanup_configure(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE void
 test_config_ctypes(void)
 {
     /* standard C89 basic types */
@@ -218,7 +216,7 @@ test_config_ctypes(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE void
 test_exit_definitions(void)
 {
     /* Verify the EXIT_SUCCESS and EXIT_FAILURE are 0 and 1 respectively. */
diff --git a/test/tcoords.c b/test/tcoords.c
index 306c6b2..d729d4b 100644
--- a/test/tcoords.c
+++ b/test/tcoords.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
diff --git a/test/test_filters_be.h5 b/test/test_filters_be.h5
index aadb372..c4c127b 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 c29fa0a..ff8b846 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 43e76c4..2a1ceaf 100644
--- a/test/test_plugin.sh.in
+++ b/test/test_plugin.sh.in
@@ -5,12 +5,10 @@
 #                                                                          
 # This file is part of HDF5. The full HDF5 copyright notice, including     
 # terms governing use, modification, and redistribution, is contained in   
-# the files COPYING and Copyright.html.  COPYING can be found at 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.           
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 srcdir=@srcdir@
 TOP_BUILDDIR=@top_builddir@
@@ -31,11 +29,11 @@ FROM_DIR=`pwd`/.libs
 case $(uname) in
     CYGWIN* )
         PLUGIN_LIB1="$FROM_DIR/cygdynlib1* $FROM_DIR/cygdynlib3*"
-        PLUGIN_LIB2="$FROM_DIR/cygdynlib2*"
+        PLUGIN_LIB2="$FROM_DIR/cygdynlib2* $FROM_DIR/cygdynlib4*"
         ;;
     *)
         PLUGIN_LIB1="$FROM_DIR/libdynlib1.* $FROM_DIR/libdynlib3.*"
-        PLUGIN_LIB2="$FROM_DIR/libdynlib2.*"
+        PLUGIN_LIB2="$FROM_DIR/libdynlib2.* $FROM_DIR/libdynlib4.*"
         ;;
 esac
 PLUGIN_LIBDIR1=testdir1
diff --git a/test/test_usecases.sh.in b/test/test_usecases.sh.in
index 1cae191..8bc2078 100644
--- a/test/test_usecases.sh.in
+++ b/test/test_usecases.sh.in
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
 #
@@ -113,6 +111,33 @@ TOOLTEST() {
     fi
 }
 
+# HDF5 has several tests that create and delete signal files to communicate
+# between processes, and it seems that even though the names of the files are
+# different, occasionally the wrong file is deleted, interrupting the flow of
+# the test.  Running each of these tests in its own directory should eliminate
+# the problem.
+mkdir usecases_test
+cp twriteorder usecases_test
+for FILE in use_*; do
+    case "$FILE" in
+        *.o) continue ;;    ## don't copy the .o files
+    esac
+    cp $FILE usecases_test
+done
+
+# With the --disable-shared option, swmr program files are built in the test
+# directory, otherwise they are in test/.libs with a corresponding wrapper
+# script in the test directory.  The programs or wrapper scripts in test should
+# always be copied, swmr files in .libs should be copied only if they exists.
+if [ -f .libs/use_append_chunk ]; then
+    mkdir usecases_test/.libs
+    cp .libs/use_* usecases_test/.libs
+    cp .libs/twriteorder usecases_test/.libs
+fi
+
+cd usecases_test
+
+
 # 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
@@ -158,10 +183,14 @@ for p in $USECASES_PROGRAMS; do
     fi
 done
 
-
+cd ..
 # Report test results and exit
 if test $nerrors -eq 0 ; then
     echo "All $TESTNAME tests passed."
+    if test -z "$HDF5_NOCLEANUP"; then
+        # delete the test directory
+        rm -rf usecases_test
+    fi
 else
     echo "$TESTNAME tests failed with $nerrors errors."
     EXIT_VALUE=$EXIT_FAILURE
diff --git a/test/testcheck_version.sh.in b/test/testcheck_version.sh.in
index ed9845e..a5641f5 100644
--- a/test/testcheck_version.sh.in
+++ b/test/testcheck_version.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 #
 # Tests for the H5check_version function.
diff --git a/test/testerror.sh.in b/test/testerror.sh.in
index 7c03414..734b051 100644
--- a/test/testerror.sh.in
+++ b/test/testerror.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for test_error and err_compat 
 
diff --git a/test/testfiles/plist_files/dapl_32be b/test/testfiles/plist_files/dapl_32be
index 4df4e7f..4dedda2 100644
Binary files a/test/testfiles/plist_files/dapl_32be 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
index 4df4e7f..4dedda2 100644
Binary files a/test/testfiles/plist_files/dapl_32le 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
index 4df4e7f..4dedda2 100644
Binary files a/test/testfiles/plist_files/dapl_64be 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
index 4df4e7f..4dedda2 100644
Binary files a/test/testfiles/plist_files/dapl_64le and b/test/testfiles/plist_files/dapl_64le differ
diff --git a/test/testfiles/plist_files/def_dapl_32be b/test/testfiles/plist_files/def_dapl_32be
index c9b7ea9..3df7289 100644
Binary files a/test/testfiles/plist_files/def_dapl_32be 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
index c9b7ea9..3df7289 100644
Binary files a/test/testfiles/plist_files/def_dapl_32le 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
index c9b7ea9..3df7289 100644
Binary files a/test/testfiles/plist_files/def_dapl_64be 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
index c9b7ea9..3df7289 100644
Binary files a/test/testfiles/plist_files/def_dapl_64le and b/test/testfiles/plist_files/def_dapl_64le differ
diff --git a/test/testfiles/plist_files/def_dxpl_32be b/test/testfiles/plist_files/def_dxpl_32be
index b13f456..3b77a32 100644
Binary files a/test/testfiles/plist_files/def_dxpl_32be 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
index b13f456..3b77a32 100644
Binary files a/test/testfiles/plist_files/def_dxpl_32le 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
index b13f456..3b77a32 100644
Binary files a/test/testfiles/plist_files/def_dxpl_64be 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
index b13f456..3b77a32 100644
Binary files a/test/testfiles/plist_files/def_dxpl_64le 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
index 6b6baee..3b35501 100644
Binary files a/test/testfiles/plist_files/def_fapl_32be 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
index 6b6baee..3b35501 100644
Binary files a/test/testfiles/plist_files/def_fapl_32le 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
index 6b6baee..3b35501 100644
Binary files a/test/testfiles/plist_files/def_fapl_64be 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
index 6b6baee..3b35501 100644
Binary files a/test/testfiles/plist_files/def_fapl_64le 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
index 38dec23..9a67dd5 100644
Binary files a/test/testfiles/plist_files/def_fcpl_32be 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
index 38dec23..9a67dd5 100644
Binary files a/test/testfiles/plist_files/def_fcpl_32le 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
index 38dec23..9a67dd5 100644
Binary files a/test/testfiles/plist_files/def_fcpl_64be 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
index 38dec23..9a67dd5 100644
Binary files a/test/testfiles/plist_files/def_fcpl_64le and b/test/testfiles/plist_files/def_fcpl_64le differ
diff --git a/test/testfiles/plist_files/dxpl_32be b/test/testfiles/plist_files/dxpl_32be
index 5ff2ea0..22fbdc8 100644
Binary files a/test/testfiles/plist_files/dxpl_32be 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
index 5ff2ea0..22fbdc8 100644
Binary files a/test/testfiles/plist_files/dxpl_32le 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
index 5ff2ea0..22fbdc8 100644
Binary files a/test/testfiles/plist_files/dxpl_64be 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
index 5ff2ea0..22fbdc8 100644
Binary files a/test/testfiles/plist_files/dxpl_64le 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
index 65e2070..43e5e67 100644
Binary files a/test/testfiles/plist_files/fapl_32be 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
index 65e2070..43e5e67 100644
Binary files a/test/testfiles/plist_files/fapl_32le 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
index 65e2070..43e5e67 100644
Binary files a/test/testfiles/plist_files/fapl_64be 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
index 65e2070..43e5e67 100644
Binary files a/test/testfiles/plist_files/fapl_64le 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
index ffa5242..4a8ac8a 100644
Binary files a/test/testfiles/plist_files/fcpl_32be 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
index ffa5242..4a8ac8a 100644
Binary files a/test/testfiles/plist_files/fcpl_32le 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
index ffa5242..4a8ac8a 100644
Binary files a/test/testfiles/plist_files/fcpl_64be 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
index ffa5242..4a8ac8a 100644
Binary files a/test/testfiles/plist_files/fcpl_64le and b/test/testfiles/plist_files/fcpl_64le differ
diff --git a/test/testfiles/plist_files/lapl_32be b/test/testfiles/plist_files/lapl_32be
index e9f43e2..f3e9865 100644
Binary files a/test/testfiles/plist_files/lapl_32be 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
index e9f43e2..f3e9865 100644
Binary files a/test/testfiles/plist_files/lapl_32le 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
index e9f43e2..f3e9865 100644
Binary files a/test/testfiles/plist_files/lapl_64be 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
index e9f43e2..f3e9865 100644
Binary files a/test/testfiles/plist_files/lapl_64le and b/test/testfiles/plist_files/lapl_64le differ
diff --git a/test/testflushrefresh.sh.in b/test/testflushrefresh.sh.in
index e7593e3..75daab6 100644
--- a/test/testflushrefresh.sh.in
+++ b/test/testflushrefresh.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -79,20 +77,42 @@ if [ $rc -ne 0 ] ; then
     exit 0
 fi
 
-# ========================
-# Launch the Test Program.
-# ========================
-./flushrefresh &
-pid_main=$!
+# HDF5 has several tests that create and delete signal files to communicate
+# between processes, and it seems that even though the names of the files are
+# different, occasionally the wrong file is deleted, interrupting the flow of
+# the test.  Running each of these tests in its own directory should eliminate 
+# the problem.
+mkdir flushrefresh_test
+cp flushrefresh flushrefresh_test
+
+# With the --disable-shared option, flushrefresh is built in the test directory,
+# otherwise it is in test/.libs with a wrapper script named flushrefresh in 
+# the test directory.  test/flushrefresh should always be copied, 
+# .libs/flushrefresh should be copied only if it exists.
+if [ -f .libs/flushrefresh ]; then
+    mkdir flushrefresh_test/.libs
+    cp .libs/flushrefresh flushrefresh_test/.libs
+fi
+cd flushrefresh_test
 
 # =================================================
 # Set up/initialize some variables to be used later 
 # =================================================
+testfile=flushrefresh.h5
 startsignal=flushrefresh_VERIFICATION_START
 endsignal=flushrefresh_VERIFICATION_DONE
 timeout_length=300
 timedout=0
 verification_done=0
+if [ -e $testfile ]; then
+    rm $testfile
+fi
+
+# ========================
+# Launch the Test Program.
+# ========================
+./flushrefresh &
+pid_main=$!
 
 # =======================================
 # Run flush verification on test program.
@@ -114,7 +134,7 @@ until [ $verification_done -eq 1 ]; do
 
   # 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.
+    echo "timed out waiting for signal from test program (flush)."
     break
   fi
 
@@ -154,7 +174,7 @@ if [ $timedout -eq 0 ]; then
 
     # 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.
+      echo "timed out waiting for signal from test program (refresh)."
       break
     fi
 
@@ -189,6 +209,11 @@ fi
 
 if test $nerrors -eq 0 ; then
     echo "flush/refresh objects tests passed."
+    if test -z "$HDF5_NOCLEANUP"; then
+        # delete the test directory
+        cd ..
+        rm -rf flushrefresh_test
+    fi
     exit 0
 else
     echo "flush/refresh objects tests failed with $nerrors errors."
diff --git a/test/testframe.c b/test/testframe.c
index daa27c5..21f9ea3 100644
--- a/test/testframe.c
+++ b/test/testframe.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -26,7 +24,6 @@
 /*
  * Definitions for the testing structure.
  */
-#define MAXNUMOFTESTS   60
 #define MAXTESTNAME     16
 #define MAXTESTDESC     64
 
@@ -49,8 +46,9 @@ 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 TestStruct Test[MAXNUMOFTESTS];
-static int    Index = 0;
+static TestStruct *Test = NULL; /* Array of tests */
+static unsigned TestAlloc = 0;  /* Size of the Test array */
+static unsigned Index = 0;
 static const void *Test_parameters = NULL;
 static const char *TestProgName = NULL;
 static void (*TestPrivateUsage)(void) = NULL;
@@ -74,14 +72,9 @@ void
 AddTest(const char *TheName, void (*TheCall) (void), void (*Cleanup) (void), const char *TheDescr, const void *Parameters)
 {
     /* Sanity checking */
-    if (Index >= MAXNUMOFTESTS) {
-        printf("Too many tests added, increase MAXNUMOFTESTS(%d).\n",
-		MAXNUMOFTESTS);
-        exit(EXIT_FAILURE);
-    }                           /* end if */
     if (HDstrlen(TheDescr) >= MAXTESTDESC) {
-        printf("Test description too long, increase MAXTESTDESC(%d).\n",
-		MAXTESTDESC);
+        printf("Test description ('%s') too long, increase MAXTESTDESC(%d).\n",
+		TheDescr, MAXTESTDESC);
         exit(EXIT_FAILURE);
     } /* end if */
     if (HDstrlen(TheName) >= MAXTESTNAME) {
@@ -90,9 +83,25 @@ AddTest(const char *TheName, void (*TheCall) (void), void (*Cleanup) (void), con
         exit(EXIT_FAILURE);
     } /* end if */
 
+    /* Check for increasing the Test array size */
+    if(Index >= TestAlloc) {
+        TestStruct *newTest = Test;        /* New array of tests */
+        unsigned newAlloc = MAX(1, TestAlloc * 2);      /* New array size */
+
+        /* Reallocate array */
+        if(NULL == (newTest = (TestStruct *)HDrealloc(Test, newAlloc * sizeof(TestStruct)))) {
+            printf("Out of memory for tests, Index = %u, TestAlloc = %u, newAlloc = %u\n", Index, TestAlloc, newAlloc);
+            exit(EXIT_FAILURE);
+        } /* end if */
+
+        /* Update info */
+        Test = newTest;
+        TestAlloc = newAlloc;
+    } /* end if */
+
     /* Set up test function */
     HDstrcpy(Test[Index].Description, TheDescr);
-    if (*TheName != '-'){
+    if(*TheName != '-') {
 	HDstrcpy(Test[Index].Name, TheName);
 	Test[Index].SkipFlag = 0;
     }
@@ -153,7 +162,7 @@ void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_p
  */
 void TestUsage(void)
 {
-	int i;
+	unsigned i;
 
 	print_func("Usage: %s [-v[erbose] (l[ow]|m[edium]|h[igh]|0-9)] %s\n",
 	    TestProgName, (TestPrivateUsage ? "<extra options>" : ""));
@@ -250,7 +259,7 @@ void TestParseCmdLine(int argc, char *argv[])
 	else if (((HDstrcmp(*argv, "-only") == 0) ||
 				    (HDstrcmp(*argv, "-o") == 0))) {
 	    if(argc > 0) {
-		int Loop;
+		unsigned Loop;
 
 		--argc; ++argv;
 
@@ -296,7 +305,7 @@ void TestParseCmdLine(int argc, char *argv[])
  */
 void PerformTests(void)
 {
-    int                     Loop;
+    unsigned                     Loop;
 
     for (Loop = 0; Loop < Index; Loop++)
         if (Test[Loop].SkipFlag) {
@@ -329,7 +338,7 @@ void PerformTests(void)
  */
 void TestSummary(void)
 {
-    int                     Loop;
+    unsigned                     Loop;
 
     print_func("Summary of Test Results:\n");
     print_func("Name of Test     Errors Description of Test\n");
@@ -351,7 +360,7 @@ void TestSummary(void)
  */
 void TestCleanup(void)
 {
-    int                     Loop;
+    unsigned                     Loop;
 
     MESSAGE(2, ("\nCleaning Up temp files...\n\n"));
 
@@ -363,9 +372,19 @@ void TestCleanup(void)
 
 

 /*
+ * Shutdown the test infrastructure
+ */
+void TestShutdown(void)
+{
+    if(Test)
+        HDfree(Test);
+}
+
+

+/*
  * Retrieve the verbosity level for the testing framework
  */
-int GetTestVerbosity(void)
+H5_ATTR_PURE int GetTestVerbosity(void)
 {
     return(TestVerbosity);
 }
@@ -452,7 +471,7 @@ int SetTestExpress(int newval)
  * Retrieve Summary request value.
  *     0 means no summary, 1 means yes.
  */
-int GetTestSummary(void)
+H5_ATTR_PURE int GetTestSummary(void)
 {
     return(Summary);
 }
@@ -461,7 +480,7 @@ int GetTestSummary(void)
  * Retrieve Cleanup request value.
  *     0 means no Cleanup, 1 means yes.
  */
-int GetTestCleanup(void)
+H5_ATTR_PURE int GetTestCleanup(void)
 {
     return(CleanUp);
 }
@@ -498,7 +517,7 @@ void ParseTestVerbosity(char *argv)
 /*
  * Retrieve the number of testing errors for the testing framework
  */
-int GetTestNumErrs(void)
+H5_ATTR_PURE int GetTestNumErrs(void)
 {
     return(num_errs);
 }
@@ -516,7 +535,7 @@ void IncTestNumErrs(void)
 /*
  * Retrieve the current Test Parameters pointer.
  */
-const void *GetTestParameters(void)
+H5_ATTR_PURE const void *GetTestParameters(void)
 {
     return(Test_parameters);
 }
@@ -554,7 +573,7 @@ TestErrPrintf(const char *format, ...)
  */
 void SetTest(const char *testname, int action)
 {
-    int Loop;
+    unsigned Loop;
 
     switch (action){
 	case SKIPTEST:
diff --git a/test/testhdf5.c b/test/testhdf5.c
index eade815..713cccf 100644
--- a/test/testhdf5.c
+++ b/test/testhdf5.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -86,6 +84,9 @@ main(int argc, char *argv[])
     if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP"))
         TestCleanup();
 
+    /* Release test infrastructure */
+    TestShutdown();
+
     /* Exit failure if errors encountered; else exit success. */
     /* No need to print anything since PerformTests() already does. */
     if (GetTestNumErrs() > 0)
diff --git a/test/testhdf5.h b/test/testhdf5.h
index 62dadde..2cbe6c6 100644
--- a/test/testhdf5.h
+++ b/test/testhdf5.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/testlibinfo.sh.in b/test/testlibinfo.sh.in
index b7aa6c4..1dd744b 100644
--- a/test/testlibinfo.sh.in
+++ b/test/testlibinfo.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 
 
 #
diff --git a/test/testlinks_env.sh.in b/test/testlinks_env.sh.in
index 7120430..94e6c7e 100644
--- a/test/testlinks_env.sh.in
+++ b/test/testlinks_env.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Test for external link with environment variable: HDF5_EXT_PREFIX
 
diff --git a/test/testmeta.c b/test/testmeta.c
index e1d12e6..b97eb68 100644
--- a/test/testmeta.c
+++ b/test/testmeta.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/testswmr.sh.in b/test/testswmr.sh.in
index 32f80ff..f81a7d7 100644
--- a/test/testswmr.sh.in
+++ b/test/testswmr.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tests for the swmr feature.
 #
@@ -123,6 +121,37 @@ while [ $# -gt 0 ]; do
     esac
 done
 
+# HDF5 has several tests that create and delete signal files to communicate
+# between processes, and it seems that even though the names of the files are
+# different, occasionally the wrong file is deleted, interrupting the flow of
+# the test.  Running each of these tests in its own directory should eliminate
+# the problem.
+mkdir swmr_test
+for FILE in swmr*; do
+    case "$FILE" in
+        *.o) continue ;;    ## don't copy the .o files
+    esac
+    cp $FILE swmr_test
+done
+cp swmr* swmr_test
+
+# With the --disable-shared option, swmr program files are built in the test
+# directory, otherwise they are in test/.libs with a corresponding wrapper
+# script in the test directory.  The programs or wrapper scripts in test should
+# always be copied, swmr files in .libs should be copied only if they exists.
+if [ -f .libs/swmr ]; then
+    mkdir swmr_test/.libs
+    for FILE in .libs/swmr*; do
+        case "$FILE" in
+            *.o) continue ;;    ## don't copy the .o files
+        esac
+        cp $FILE swmr_test/.libs
+    done
+fi
+
+cd swmr_test
+
+
 # Loop over index types
 for index_type in "-i ea" "-i b2" 
 do
@@ -130,6 +159,11 @@ do
     for compress in "" "-c 5"
     do
         echo
+        echo "*******************************************************************************"
+        echo "** Loop testing parameters: $index_type $compress"
+        echo "*******************************************************************************"
+        echo
+        echo
         echo "###############################################################################"
         echo "## Generator test"
         echo "###############################################################################"
@@ -167,7 +201,7 @@ do
         # Launch the Writer
         echo launch the swmr_start_writer
         seed="" # Put -r <random seed> command here
-        ./swmr_start_write $compress $index_type $Nrecords $seed &
+        ./swmr_start_write $compress $index_type $Nrecords $seed 2>&1 |tee swmr_writer.out &
         pid_writer=$!
         $DPRINT pid_writer=$pid_writer
 
@@ -183,7 +217,7 @@ do
         while [ $n -lt $Nreaders ]; do
             #seed="-r ${seeds[$n]}"
             seed=""
-            ./swmr_reader $Nsecs_add $seed &
+            ./swmr_reader $Nsecs_add $seed 2>&1 |tee swmr_reader.out.$n &
             pid_readers="$pid_readers $!"
             n=`expr $n + 1`
         done
@@ -213,9 +247,14 @@ do
         $DPRINT nerrors=$nerrors
         if test $nerrors -ne 0 ; then
             echo "SWMR tests failed with $nerrors errors."
+            echo "(Writer and reader output preserved)"
             exit 1
         fi
 
+        # Clean up output files
+        rm -f swmr_writer.out
+        rm -f swmr_reader.out.*
+
         echo
         echo "###############################################################################"
         echo "## Writer test - test expanding the dataset"
@@ -235,7 +274,7 @@ do
         # Launch the Writer
         echo launch the swmr_writer
         seed="" # Put -r <random seed> command here
-        ./swmr_writer -o $Nrecords $seed &
+        ./swmr_writer -o $Nrecords $seed 2>&1 |tee swmr_writer.out &
         pid_writer=$!
         $DPRINT pid_writer=$pid_writer
 
@@ -250,7 +289,7 @@ do
         while [ $n -lt $Nreaders ]; do
             #seed="-r ${seeds[$n]}"
             seed=""
-            ./swmr_reader $Nsecs_add $seed &
+            ./swmr_reader $Nsecs_add $seed 2>&1 |tee swmr_reader.out.$n &
             pid_readers="$pid_readers $!"
             n=`expr $n + 1`
         done
@@ -280,9 +319,14 @@ do
         $DPRINT nerrors=$nerrors
         if test $nerrors -ne 0 ; then
             echo "SWMR tests failed with $nerrors errors."
+            echo "(Writer and reader output preserved)"
             exit 1
         fi
 
+        # Clean up output files
+        rm -f swmr_writer.out
+        rm -f swmr_reader.out.*
+
         echo
         echo "###############################################################################"
         echo "## Remove test - test shrinking the dataset"
@@ -293,7 +337,7 @@ do
         # Launch the Remove Writer
         echo launch the swmr_remove_writer
         seed="" # Put -r <random seed> command here
-        ./swmr_remove_writer -o $Nrecs_rem $seed &
+        ./swmr_remove_writer -o $Nrecs_rem $seed 2>&1 |tee swmr_writer.out &
         pid_writer=$!
         $DPRINT pid_writer=$pid_writer
 
@@ -308,7 +352,7 @@ do
         while [ $n -lt $Nreaders ]; do
             #seed="-r ${seeds[$n]}"
             seed=""
-            ./swmr_remove_reader $Nsecs_rem $seed &
+            ./swmr_remove_reader $Nsecs_rem $seed 2>&1 |tee swmr_reader.out.$n &
             pid_readers="$pid_readers $!"
             n=`expr $n + 1`
         done
@@ -338,9 +382,14 @@ do
         $DPRINT nerrors=$nerrors
         if test $nerrors -ne 0 ; then
             echo "SWMR tests failed with $nerrors errors."
+            echo "(Writer and reader output preserved)"
             exit 1
         fi
 
+        # Clean up output files
+        rm -f swmr_writer.out
+        rm -f swmr_reader.out.*
+
         echo
         echo "###############################################################################"
         echo "## Add/remove test - randomly grow or shrink the dataset"
@@ -369,7 +418,7 @@ do
         # Launch the Add/Remove Writer
         echo launch the swmr_addrem_writer
         seed="" # Put -r <random seed> command here
-        ./swmr_addrem_writer $Nrecords $seed &
+        ./swmr_addrem_writer $Nrecords $seed 2>&1 |tee swmr_writer.out &
         pid_writer=$!
         $DPRINT pid_writer=$pid_writer
 
@@ -384,7 +433,7 @@ do
         while [ $n -lt $Nreaders ]; do
             #seed="-r ${seeds[$n]}"
             seed=""
-            ./swmr_remove_reader $Nsecs_addrem $seed &
+            ./swmr_remove_reader $Nsecs_addrem $seed 2>&1 |tee swmr_reader.out.$n &
             pid_readers="$pid_readers $!"
             n=`expr $n + 1`
         done
@@ -414,9 +463,14 @@ do
         $DPRINT nerrors=$nerrors
         if test $nerrors -ne 0 ; then
             echo "SWMR tests failed with $nerrors errors."
+            echo "(Writer and reader output preserved)"
             exit 1
         fi
 
+        # Clean up output files
+        rm -f swmr_writer.out
+        rm -f swmr_reader.out.*
+
         echo
         echo "###############################################################################"
         echo "## Sparse writer test - test writing to random locations in the dataset"
@@ -437,7 +491,7 @@ do
         rm -f $WRITER_MESSAGE
         # Launch the Sparse writer
         echo launch the swmr_sparse_writer
-        nice -n 20 ./swmr_sparse_writer $Nrecs_spa &
+        nice -n 20 ./swmr_sparse_writer $Nrecs_spa 2>&1 |tee swmr_writer.out &
         pid_writer=$!
         $DPRINT pid_writer=$pid_writer
 
@@ -450,7 +504,7 @@ do
         echo launch $Nrdrs_spa swmr_sparse_readers
         while [ $n -lt $Nrdrs_spa ]; do
             # The sparse reader spits out a LOT of data so it's set to 'quiet'
-            ./swmr_sparse_reader -q $Nrecs_spa &
+            ./swmr_sparse_reader -q $Nrecs_spa 2>&1 |tee swmr_reader.out.$n &
             pid_readers="$pid_readers $!"
             n=`expr $n + 1`
         done
@@ -479,18 +533,27 @@ do
         $DPRINT nerrors=$nerrors
         if test $nerrors -ne 0 ; then
             echo "SWMR tests failed with $nerrors errors."
+            echo "(Writer and reader output preserved)"
             exit 1
         fi
+
+        # Clean up output files
+        rm -f swmr_writer.out
+        rm -f swmr_reader.out.*
     done
 done
 
 ###############################################################################
 ## Report and exit
 ###############################################################################
-
+cd ..
 $DPRINT nerrors=$nerrors
 if test $nerrors -eq 0 ; then
     echo "SWMR tests passed."
+    if test -z "$HDF5_NOCLEANUP"; then
+        # delete the test directory
+        rm -rf swmr_test
+    fi
     exit 0
 else
     echo "SWMR tests failed with $nerrors errors."
diff --git a/test/testvdsswmr.sh.in b/test/testvdsswmr.sh.in
index d69b8c0..32af072 100644
--- a/test/testvdsswmr.sh.in
+++ b/test/testvdsswmr.sh.in
@@ -6,12 +6,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
 #
@@ -109,6 +107,31 @@ while [ $# -gt 0 ]; do
     esac
 done
 
+# HDF5 has several tests that create and delete signal files to communicate
+# between processes, and it seems that even though the names of the files are
+# different, occasionally the wrong file is deleted, interrupting the flow of
+# the test.  Running each of these tests in its own directory should eliminate
+# the problem.
+mkdir vds_swmr_test
+for FILE in vds_swmr*; do
+    case "$FILE" in
+        *.o) continue ;;    ## don't copy the .o files
+    esac
+    cp $FILE vds_swmr_test
+done
+
+# With the --disable-shared option, swmr program files are built in the test
+# directory, otherwise they are in test/.libs with a corresponding wrapper
+# script in the test directory.  The programs or wrapper scripts in test should
+# always be copied, swmr files in .libs should be copied only if they exists.
+if [ -f .libs/vds_swmr_writer ]; then
+    mkdir vds_swmr_test/.libs
+    cp .libs/vds_swmr* vds_swmr_test/.libs
+fi
+
+cd vds_swmr_test
+
+
 echo
 echo "###############################################################################"
 echo "## Basic VDS SWMR test - writing to a tiled plane"
@@ -187,10 +210,14 @@ fi
 ###############################################################################
 ## Report and exit
 ###############################################################################
-
+cd ..
 $DPRINT nerrors=$nerrors
 if test $nerrors -eq 0 ; then
     echo "VDS SWMR tests passed."
+    if test -z "$HDF5_NOCLEANUP"; then
+        # delete the test directory
+        rm -rf vds_swmr_test
+    fi
     exit 0
 else
     echo "VDS SWMR tests failed with $nerrors errors."
diff --git a/test/tfile.c b/test/tfile.c
index 78ccfd0..7274c82 100644
--- a/test/tfile.c
+++ b/test/tfile.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -26,7 +24,6 @@
 #include "H5srcdir.h"
 
 #include "H5Bprivate.h"
-#include "H5Iprivate.h"
 #include "H5Pprivate.h"
 
 /*
@@ -104,38 +101,52 @@
 #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 */
+#define FILENAME_LEN        1024                        /* length of file name */
+#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 */
+#define FSP_SIZE_DEF        4096                        /* File space page size default */
+#define FSP_SIZE512         512                         /* File space page size */
 
 /* Declaration for test_libver_macros2() */
 #define FILE6			"tfile6.h5"	/* Test file */
 
 /* Declaration for test_get_obj_ids() */
 #define FILE7			"tfile7.h5"	/* Test file */
-#define N_GROUPS			2
+#define NGROUPS			2
 #define NDSETS			4
 
-const char *OLD_FILENAME[] = {  /* Files created under 1.6 branch and 1.8 branch */
+/* Files created under 1.6 branch and 1.8 branch--used in test_filespace_compatible() */
+const char *OLD_FILENAME[] = {  
     "filespace_1_6.h5",	/* 1.6 HDF5 file */
     "filespace_1_8.h5"	/* 1.8 HDF5 file */
 };
-const char *FILESPACE_NAME[] = {
-    "tfilespace",
-    NULL
+
+/* Files created in 1.10.0 release --used in test_filespace_1.10.0_compatible() */
+/* These files are copied from release 1.10.0 tools/h5format_convert/testfiles */
+const char *OLD_1_10_0_FILENAME[] = { 
+    "h5fc_ext1_i.h5",   /* 0 */
+    "h5fc_ext1_f.h5",   /* 1 */
+    "h5fc_ext2_if.h5",  /* 2 */
+    "h5fc_ext2_sf.h5",  /* 3 */
+    "h5fc_ext3_isf.h5", /* 4 */
+    "h5fc_ext_none.h5"  /* 5 */
 };
 
-const char *FILENAME[] = {
-    "sec2_tfile",
-    "split_tfile",
-    "stdio_tfile",
-    "core_tfile",
-    "family_tfile",
+/* Files used in test_filespace_round_compatible() */
+const char *FSPACE_FILENAMES[] = {
+    "fsm_aggr_nopersist.h5",    /* H5F_FILE_SPACE_AGGR, not persisting free-space */
+    "fsm_aggr_persist.h5",      /* H5F_FILE_SPACE_AGGR, persisting free-space */
+    "paged_nopersist.h5",       /* H5F_FILE_SPACE_PAGE, not persisting free-space */
+    "paged_persist.h5",         /* H5F_FILE_SPACE_PAGE, persisting free-space */
+    "aggr.h5",                  /* H5F_FILE_SPACE_AGGR */
+    "none.h5"                   /* H5F_FILE_SPACE_NONE */
+};
+
+const char *FILESPACE_NAME[] = {
+    "tfilespace",
     NULL
 };
 
@@ -889,9 +900,8 @@ test_file_close(void)
             ret = H5Gclose(group_id3);
             CHECK(ret, FAIL, "H5Gclose");
 	    break;
-
-    case H5F_CLOSE_DEFAULT:
-    default:
+        case H5F_CLOSE_DEFAULT:
+        default:
             CHECK(fc_degree, H5F_CLOSE_DEFAULT, "H5Pget_fclose_degree");
             break;
     }
@@ -1024,7 +1034,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[N_GROUPS], dset[NDSETS];
+    hid_t    fid, gid[NGROUPS], dset[NDSETS];
     hid_t    filespace;
     hsize_t  file_dims[F2_RANK] = {F2_DIM0, F2_DIM1};
     ssize_t  oid_count, ret_count;
@@ -1041,8 +1051,8 @@ test_get_obj_ids(void)
     filespace = H5Screate_simple(F2_RANK, file_dims,  NULL);
     CHECK(filespace, FAIL, "H5Screate_simple");
 
-    /* creates N_GROUPS groups under the root group */
-    for(m = 0; m < N_GROUPS; m++) {
+    /* creates NGROUPS groups under the root group */
+    for(m = 0; m < NGROUPS; m++) {
         sprintf(gname, "group%d", m);
         gid[m] = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
         CHECK(gid[m], FAIL, "H5Gcreate2");
@@ -1055,10 +1065,10 @@ test_get_obj_ids(void)
          CHECK(dset[n], FAIL, "H5Dcreate2");
     }
 
-    /* The number of opened objects should be N_GROUPS + NDSETS + 1.  One is opened file. */
+    /* The number of opened objects should be NGROUPS + 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, (N_GROUPS + NDSETS + 1), "H5Fget_obj_count");
+    VERIFY(oid_count, (NGROUPS + NDSETS + 1), "H5Fget_obj_count");
 
     oid_list = (hid_t *)HDcalloc((size_t)oid_list_size, sizeof(hid_t));
     CHECK(oid_list, NULL, "HDcalloc");
@@ -1079,11 +1089,11 @@ test_get_obj_ids(void)
         }
     }
 
-    /* The number of opened objects should be N_GROUPS + 1 + 1.  The first one is opened file. The second one
+    /* The number of opened objects should be NGROUPS + 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, N_GROUPS + 2, "H5Fget_obj_count");
+    VERIFY(oid_count, NGROUPS + 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);
@@ -1539,112 +1549,7 @@ test_file_perm2(void)
     CHECK(ret, FAIL, "H5Sclose");
 } /* end test_file_perm2() */
 
-/****************************************************************
-**
-**  test_file_freespace(): low-level file test routine.
-**      This test checks the free space available in a file in various
-**      situations.
-**
-**  Modifications:
-**	Vailin Choi; July 2012
-**	Remove datasets in reverse order so that all file spaces are shrunk.
-**	(A change due to H5FD_FLMAP_DICHOTOMY.)
-**
-*****************************************************************/
-static void
-test_file_freespace(void)
-{
-    hid_t    file;      /* File opened with read-write permission */
-    h5_stat_size_t empty_filesize;      /* Size of file when empty */
-    h5_stat_size_t mod_filesize;        /* Size of file after being modified */
-    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 */
-    int k;		/* Local index variable */
-    unsigned u;         /* Local index variable */
-    char     name[32];  /* Dataset name */
-    herr_t   ret;
-
-    /* Output message about test being performed */
-    MESSAGE(5, ("Testing Low-Level File Free Space\n"));
-
-    /* Create an "empty" file */
-    file = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    CHECK(file, FAIL, "H5Fcreate");
-
-    ret = H5Fclose(file);
-    CHECK_I(ret, "H5Fclose");
-
-    /* Get the "empty" file size */
-    empty_filesize = h5_get_file_size(FILE1, H5P_DEFAULT);
-
-    /* Re-open the file (with read-write permission) */
-    file = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
-    CHECK_I(file, "H5Fopen");
-
-    /* Check that the free space is 0 */
-    free_space = H5Fget_freespace(file);
-    CHECK(free_space, FAIL, "H5Fget_freespace");
-    VERIFY(free_space, 0, "H5Fget_freespace");
-
-    /* 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");
-
-    /* Check that there is the right amount of free space in the file */
-    free_space = H5Fget_freespace(file);
-    CHECK(free_space, FAIL, "H5Fget_freespace");
-    VERIFY(free_space, 2360, "H5Fget_freespace");
-
-    /* Delete datasets in file */
-    for(k = 9; k >= 0; k--) {
-        sprintf(name, "Dataset %u", (unsigned)k);
-        ret = H5Ldelete(file, name, H5P_DEFAULT);
-        CHECK(ret, FAIL, "H5Ldelete");
-    } /* end for */
-
-    /* Check that there is the right amount of free space in the file */
-    free_space = H5Fget_freespace(file);
-    CHECK(free_space, FAIL, "H5Fget_freespace");
-    VERIFY(free_space, 0, "H5Fget_freespace");
-
-    /* Close file */
-    ret = H5Fclose(file);
-    CHECK(ret, FAIL, "H5Fclose");
-
-    /* Get the file size after modifications*/
-    mod_filesize = h5_get_file_size(FILE1, H5P_DEFAULT);
 
-    /* Check that the file reverted to empty size */
-    VERIFY(mod_filesize, empty_filesize, "H5Fget_freespace");
-} /* end test_file_freespace() */
 
 /****************************************************************
 **
@@ -1864,7 +1769,7 @@ test_file_open_overlap(void)
     hid_t did1, did2;
     hid_t gid;
     hid_t sid;
-    int nobjs;          /* # of open objects */
+    ssize_t nobjs;      /* # of open objects */
     unsigned intent;
     herr_t ret;         /* Generic return value */
 
@@ -2188,7 +2093,7 @@ test_file_double_dataset_open(void)
 **
 *****************************************************************/
 static void
-test_file_double_file_dataset_open(hbool_t new)
+test_file_double_file_dataset_open(hbool_t new_format)
 {
     hid_t fapl = -1;				/* File access property list */
     hid_t dcpl = -1;				/* Dataset creation property list */
@@ -2196,13 +2101,17 @@ test_file_double_file_dataset_open(hbool_t new)
     hid_t did1 = -1, did2 = -1;			/* Dataset IDs */
     hid_t sid1 = -1, sid2 = -1;			/* Dataspace IDs */
     hid_t tid1 = -1, tid2 = -1;			/* Datatype IDs */
-    hsize_t dims[1] = {4}, dims2[2] = {1, 4};	/* Dimension sizes */
+    hsize_t dims[1] = {5}, dims2[2] = {1, 4};	/* Dimension sizes */
+    hsize_t e_ext_dims[1] = {7};		/* Expanded dimension sizes */
+    hsize_t s_ext_dims[1] = {3};		/* Shrunk dimension sizes */
     hsize_t max_dims0[1] = {8}; 		/* Maximum dimension sizes */
     hsize_t max_dims1[1] = {H5S_UNLIMITED}; 	/* Maximum dimesion sizes for extensible array index */
     hsize_t max_dims2[2] = {H5S_UNLIMITED, H5S_UNLIMITED};	/* Maximum dimension sizes for v2 B-tree index */
-    hsize_t chunks[1] = {4}, chunks2[2] = {4, 5};		/* Chunk dimension sizes */
-    char* data[] = {"String 1", "String 2", "String 3", "String 4"};	/* Input Data */
-    char* buffer[4];							/* Output buffer */
+    hsize_t chunks[1] = {2}, chunks2[2] = {4, 5};		/* Chunk dimension sizes */
+    hsize_t size;                               /* File size */
+    const char* data[] = {"String 1", "String 2", "String 3", "String 4", "String 5"};	/* Input Data */
+    const char* e_data[] = {"String 1", "String 2", "String 3", "String 4", "String 5", "String 6", "String 7"};	/* Input Data */
+    char* buffer[5];				/* Output buffer */
     int wbuf[4] = {1, 2, 3, 4};			/* Input data */
     herr_t ret;         			/* Generic return value */
 
@@ -2214,10 +2123,10 @@ test_file_double_file_dataset_open(hbool_t new)
     fapl = H5Pcreate(H5P_FILE_ACCESS);
     CHECK(fapl, FAIL, "H5Pcreate");
 
-    if(new) {
-	ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
-	CHECK(ret, FAIL, "H5Pset_libver_bounds");
-    }
+    if(new_format) {
+        ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+        CHECK(ret, FAIL, "H5Pset_libver_bounds");
+    } /* end if */
 
     /* Create the test file */
     fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
@@ -2270,12 +2179,11 @@ test_file_double_file_dataset_open(hbool_t new)
     CHECK(ret, FAIL, "H5Dwrite");
 
     /* Closing */
+    /* (Leave sid1 open for later use) */
     ret = H5Dclose(did1);
     CHECK(ret, FAIL, "H5Dclose");
     ret = H5Tclose(tid1);
     CHECK(ret, FAIL, "H5Tclose");
-    ret = H5Sclose(sid1);
-    CHECK(ret, FAIL, "H5Sclose");
     ret = H5Pclose(dcpl);
     CHECK(ret, FAIL, "H5Dclose");
 
@@ -2391,9 +2299,11 @@ test_file_double_file_dataset_open(hbool_t new)
     CHECK(tid1, FAIL, "H5Tcopy");
 
     /* Second file's dataset read */
-    HDmemset(buffer, 0, sizeof(char*) * 4);
+    HDmemset(buffer, 0, sizeof(char*) * 5);
     ret = H5Dread(did2, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer);
     CHECK(ret, FAIL, "H5Dread");
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, buffer);
+    CHECK(ret, FAIL, "H5Dvlen_reclaim");
 
     /* Second file's dataset close */
     ret = H5Dclose(did2);
@@ -2404,8 +2314,11 @@ test_file_double_file_dataset_open(hbool_t new)
     CHECK(ret, FAIL, "H5Fclose");
 
     /* First file's dataset read */
-    HDmemset(buffer, 0, sizeof(char*) * 4);
+    HDmemset(buffer, 0, sizeof(char*) * 5);
     ret = H5Dread(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer);
+    CHECK(ret, FAIL, "H5Dread");
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, buffer);
+    CHECK(ret, FAIL, "H5Dvlen_reclaim");
 
     /* First file's dataset close */
     ret = H5Dclose(did1);
@@ -2418,6 +2331,8 @@ test_file_double_file_dataset_open(hbool_t new)
     /* Closing */
     ret = H5Tclose(tid1);
     CHECK(ret, FAIL, "H5Tclose");
+    ret = H5Sclose(sid1);
+    CHECK(ret, FAIL, "H5Sclose");
 
     ret = H5Tclose(tid2);
     CHECK(ret, FAIL, "H5Tclose");
@@ -2435,8 +2350,8 @@ test_file_double_file_dataset_open(hbool_t new)
     CHECK(did1, FAIL, "H5Dopen2");
 
     /* First file's get storage size */
-    ret = H5Dget_storage_size(did1);
-    CHECK(ret, FAIL, "H5Dget_storage_size");
+    size = H5Dget_storage_size(did1);
+    CHECK(size, 0, "H5Dget_storage_size");
 
     /* Second file open */
     fid2 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
@@ -2455,8 +2370,60 @@ test_file_double_file_dataset_open(hbool_t new)
     CHECK(ret, FAIL, "H5Fclose");
 
     /* Second file's get storage size */
-    ret = H5Dget_storage_size(did2);
-    CHECK(ret, FAIL, "H5Dget_storage_size");
+    size = H5Dget_storage_size(did2);
+    CHECK(size, 0, "H5Dget_storage_size");
+
+    /* Second file's dataset close */
+    ret = H5Dclose(did2);
+    CHECK(ret, FAIL, "H5Dclose");
+
+    /* Second file close */
+    ret = H5Fclose(fid2);
+    CHECK(ret, FAIL, "H5Fclose");
+
+    /* 
+     * Scenario 4
+     * --trigger H5AC_protect: Assertion `f->shared' failed
+     *	 from second call to H5Dset_extent->...H5D__earray_idx_remove->H5EA_get...H5EA__iblock_protect...H5AC_protect
+     */
+    /* First file open */
+    fid1 = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
+    CHECK(fid1, FAIL, "H5Fopen");
+
+    /* First file's dataset open */
+    did1 = H5Dopen2(fid1, "/dset_ea", H5P_DEFAULT);
+    CHECK(did1, FAIL, "H5Dopen2");
+
+    tid1 = H5Tcopy(did1);
+    CHECK(tid1, FAIL, "H5Tcopy");
+
+    /* Extend the dataset */
+    ret = H5Dset_extent(did1, e_ext_dims);
+    CHECK(ret, FAIL, "H5Dset_extent");
+
+    /* Write to the dataset */
+    ret = H5Dwrite(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, e_data);
+    CHECK(ret, FAIL, "H5Dwrite");
+
+    /* Second file open */
+    fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
+    CHECK(fid2, FAIL, "H5Fopen");
+
+    /* Second file's dataset open */
+    did2 = H5Dopen2(fid2, "/dset_ea", H5P_DEFAULT );
+    CHECK(did2, FAIL, "H5Dopen2");
+
+    /* First file's dataset close */
+    ret = H5Dclose(did1);
+    CHECK(ret, FAIL, "H5Dclose");
+
+    /* First file close */
+    ret = H5Fclose(fid1);
+    CHECK(ret, FAIL, "H5Fclose");
+
+    /* Shrink the dataset */
+    ret = H5Dset_extent(did2, s_ext_dims);
+    CHECK(ret, FAIL, "H5Dset_extent");
 
     /* Second file's dataset close */
     ret = H5Dclose(did2);
@@ -2466,6 +2433,10 @@ test_file_double_file_dataset_open(hbool_t new)
     ret = H5Fclose(fid2);
     CHECK(ret, FAIL, "H5Fclose");
 
+    /* Close the data type */
+    ret = H5Tclose(tid1);
+    CHECK(ret, FAIL, "H5Tclose");
+
 } /* end test_file_double_dataset_open() */
 
 /****************************************************************
@@ -3120,314 +3091,453 @@ 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.
+**  test_userblock_alignment_paged(): low-level file test routine.
+**      This test checks to ensure that files with both a userblock and
+**      alignment interact properly:
+**		-- alignment via H5Pset_alignment  
+**		-- alignment via paged aggregation
+**
+**  Programmer: Vailin Choi; March 2013
 **
 *****************************************************************/
 static void
-test_free_sections(hid_t fapl, char *fname)
+test_userblock_alignment_paged(void)
 {
-    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 */
+    hid_t fid;          /* File ID */
+    hid_t fcpl;         /* File creation property list ID */
+    hid_t fapl;         /* File access property list ID */
+    herr_t ret;         /* Generic return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("Testing interaction between userblock and alignment (via paged aggregation and H5Pset_alignment)\n"));
+
+    /* 
+     * Case 1:
+     *  Userblock size = 0
+     *  Alignment in use = 4096
+     *    Strategy = H5F_FILE_SPACE_PAGE; fsp_size = alignment = 4096
+     * Outcome:
+     *  Should succeed: 
+     *	  userblock is 0 and alignment != 0
+     */
+    /* Create file creation property list with user block */
     fcpl = H5Pcreate(H5P_FILE_CREATE);
     CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)0);
+    CHECK(ret, FAIL, "H5Pset_userblock");
 
-    /* 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");
+    /* Create file access property list */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
 
-    /* Close the FCPL */
-    ret = H5Pclose(fcpl);
-    CHECK(ret, FAIL, "H5Pclose");
+    /* Set the "use the latest version of the format" bounds */
+    ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+    CHECK(ret, FAIL, "H5Pset_libver_bounds");
 
-    /* Create dataspace for datasets */
-    dspace = H5Screate(H5S_SCALAR);
-    CHECK(dspace, FAIL, "H5Screate");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
 
-    /* Create a dataset creation property list */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    CHECK(dcpl, FAIL, "H5Pcreate");
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
-    /* Set the space allocation time to early */
-    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY);
-    CHECK(ret, FAIL, "H5Pset_alloc_time");
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    /* 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");
+    /* 
+     * Case 2a:
+     *  Userblock size =  1024
+     *  Alignment in use = 512
+     *    Strategy = H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512 
+     *    H5Pset_alignment() is 3
+     * Outcome:
+     *  Should succeed: 
+     *    userblock (1024) is integral mult. of alignment (512)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
 
-        ret = H5Dclose(dset);
-        CHECK(ret, FAIL, "H5Dclose");
-    } /* end for */
+    /* Create file access property list */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* Close dataspace */
-    ret = H5Sclose(dspace);
-    CHECK(ret, FAIL, "H5Sclose");
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
-    /* Close dataset creation property list */
-    ret = H5Pclose(dcpl);
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
     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;
-    }
+    /* 
+     * Case 2b:
+     *  Userblock size =  1024
+     *  Alignment in use = 3
+     *    Strategy = H5F_FILE_SPACE_AGGR; fsp_size = 512 
+     *	  (via default file creation property)
+     *    H5Pset_alignment() is 3
+     * Outcome:
+     *  Should fail at file creation: 
+     *	  userblock (1024) is non-integral mult. of alignment (3)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
 
-    VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections");
-    HDfree(sect_info);
+    /* Create file access property list */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* 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");
+    /* Create a file with FAPL & FCPL */
+    H5E_BEGIN_TRY {
+        fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+    VERIFY(fid, FAIL, "H5Fcreate");
 
-    /* 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");
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    /* 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;
-    }
+    /* 
+     * Case 3a:
+     *  Userblock size =  512
+     *  Alignment in use = 512
+     *    Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512 
+     *    H5Pset_alignment() is 3
+     * Outcome:
+     *  Should succeed: 
+     *	  userblock (512) is equal to alignment (512)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_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);
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* 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");
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
-    /* Close file */
-    ret = H5Fclose(file);
-    CHECK(ret, FAIL, "H5Fclose");
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    HDfree(saved_sect_info);
+    /* 
+     * Case 3b:
+     *  Userblock size =  512
+     *  Alignment in use = 3
+     *    Strategy is H5F_FILE_SPACE_NONE; fsp_size = 512 
+     *    H5Pset_alignment() is 3
+     * Outcome:
+     *  Should fail at file creation: 
+     *	  userblock (512) is non-integral mult. of alignment (3)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
-} /* end test_free_sections() */
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-/****************************************************************
-**
-**  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));
+    /* Create a file with FAPL & FCPL */
+    H5E_BEGIN_TRY {
+        fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+    VERIFY(fid, FAIL, "H5Fcreate");
 
-    /* perform free space information test for file with split driver */
-    test_free_sections(fapl_split, filename);
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    /* close fapl and remove the file */
-    h5_clean_files(FILENAME, fapl_split);
+    /* 
+     * Case 4a:
+     *  Userblock size =  1024
+     *  Alignment in use = 1023
+     *    Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 1023
+     *    H5Pset_alignment() is 16
+     * Outcome:
+     *  Should fail at file creation: 
+     *	  userblock (1024) is non-integral multiple of alignment (1023)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1023);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* STDIO */
-    MESSAGE(5, ("Testing File free space information for a stdio file\n"));
+    /* Create a file with FAPL & FCPL */
+    H5E_BEGIN_TRY {
+        fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+    VERIFY(fid, FAIL, "H5Fcreate");
 
-    fapl_stdio = H5Pcreate(H5P_FILE_ACCESS);
-    CHECK(fapl_stdio, FAIL, "h5_fileaccess");
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    ret = H5Pset_fapl_stdio(fapl_stdio);
-    CHECK(ret, FAIL, "H5Pset_fapl_split");
+    /* 
+     * Case 4b:
+     *  Userblock size =  1024
+     *  Alignment in use = 16
+     *    Strategy is H5F_FILE_SPACE_FSM_AGGR; fsp_size = 1023
+     *    H5Pset_alignment() is 16
+     * Outcome:
+     *  Should succeed: 
+     *	  userblock (512) is integral multiple of alignment (16)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1023);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
-    /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[2], fapl_stdio, filename, sizeof(filename));
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* perform free space information test for file with stdio driver */
-    test_free_sections(fapl_stdio, filename);
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
-    /* close fapl and remove the file */
-    h5_clean_files(FILENAME, fapl_stdio);
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
+    /* 
+     * Case 5a:
+     *  Userblock size = 512
+     *  Alignment in use = 1024
+     *    Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 1024
+     *    H5Pset_alignment() is 16
+     * Outcome:
+     *  Should fail at file creation: 
+     *	  userblock (512) is less than alignment (1024)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
-    /* CORE */
-    MESSAGE(5, ("Testing File free space information for a core file\n"));
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    fapl_core = H5Pcreate(H5P_FILE_ACCESS);
-    CHECK(fapl_core, FAIL, "h5_fileaccess");
+    /* Create a file with FAPL & FCPL */
+    H5E_BEGIN_TRY {
+        fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+    VERIFY(fid, FAIL, "H5Fcreate");
 
-    ret = H5Pset_fapl_core(fapl_core, (size_t)CORE_INCREMENT, TRUE);
-    CHECK(ret, FAIL, "H5Pset_fapl_core");
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[3], fapl_core, filename, sizeof(filename));
+    /* 
+     * Case 5b:
+     *  Userblock size = 512
+     *  Alignment in use = 16
+     *    Strategy is H5F_FILE_SPACE_NONE; fsp_size = 1024
+     *    H5Pset_alignment() is 16
+     * Outcome:
+     *  Should succed:
+     *	  userblock (512) is integral multiple of alignment (16)
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
-    /* perform free space information test for file with core driver */
-    test_free_sections(fapl_core, filename);
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* close fapl_ and remove the file */
-    h5_clean_files(FILENAME, fapl_core);
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-    /* FAMILY */
-    MESSAGE(5, ("Testing File free space information for a family file\n"));
+    /* 
+     * Case 6:
+     *  Userblock size = 512
+     *  Alignment in use = 512
+     *    Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512
+     *    H5Pset_alignment() is 3
+     *	  Reopen the file; H5Pset_alignment() is 1024
+     * Outcome:
+     *  Should succed:
+     *	  Userblock (512) is the same as alignment (512);
+     *    The H5Pset_alignment() calls have no effect
+     */
+    /* Create file creation property list with user block */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+    ret = H5Pset_userblock(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_userblock");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
 
-    fapl_family = H5Pcreate(H5P_FILE_ACCESS);
-    CHECK(fapl_family, FAIL, "h5_fileaccess");
+    /* Create file access property list with alignment */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl, FAIL, "H5Pcreate");
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    ret = H5Pset_fapl_family(fapl_family, (hsize_t)FAMILY_SIZE, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Pset_fapl_family");
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper1(fcpl, fapl);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper1");
 
-    /* Set the filename to use for this test (dependent on fapl) */
-    h5_fixname(FILENAME[4], fapl_family, filename, sizeof(filename));
+    /* Change alignment in FAPL */
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
-    /* perform free space information test for file with family driver */
-    test_free_sections(fapl_family, filename);
+    /* Call helper routines to perform file manipulations */
+    ret = test_userblock_alignment_helper2(fapl, FALSE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
+    ret = test_userblock_alignment_helper2(fapl, TRUE);
+    CHECK(ret, FAIL, "test_userblock_alignment_helper2");
 
-    /* close fapl and remove the file */
-    h5_clean_files(FILENAME, fapl_family);
+    /* Release property lists */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 
-} /* end test_filespace_sects() */
+} /* end test_userblock_alignment_paged() */
 
 /****************************************************************
 **
 **  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.
+**	Verify the following public routines retrieve and set file space
+**	information correctly:
+**	  (1) H5Pget/set_file_space_strategy():
+**	      Retrieve and set file space strategy, persisting free-space,  
+**	      and free-space section threshold as specified
+**	  (2) H5Pget/set_file_space_page_size():
+**	      Retrieve and set the page size for paged aggregation
 **
 ****************************************************************/
 static void
-test_filespace_info(void)
+test_filespace_info(const char *env_h5_drvr)
 {
-    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	*/
+    hid_t fid;                          /* File IDs	*/
+    hid_t fapl, new_fapl;               /* File access property lists */
+    hid_t fcpl, fcpl1, fcpl2;           /* File creation property lists */
+    H5F_fspace_strategy_t strategy;     /* File space strategy */
+    hbool_t persist;                    /* Persist free-space or not */
+    hsize_t threshold;                  /* Free-space section threshold */
+    unsigned new_format;                /* New or old format */
+    H5F_fspace_strategy_t fs_strategy;  /* File space strategy--iteration variable */
+    unsigned fs_persist;                /* Persist free-space or not--iteration variable */
+    hsize_t fs_threshold;               /* Free-space section threshold--iteration variable */
+    hsize_t fsp_size;                   /* File space page size */
+    char filename[FILENAME_LEN];        /* Filename to use */
+    hbool_t contig_addr_vfd;            /* Whether VFD used has a contigous address space */
+    herr_t ret;                         /* Return value	*/
 
     /* Output message about test being performed */
-    MESSAGE(5, ("Testing File Space Management public routines: H5Pget/set_file_space()\n"));
+    MESSAGE(5, ("Testing file creation public routines: H5Pget/set_file_space_strategy & H5Pget/set_file_space_page_size\n"));
+
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
 
     fapl = h5_fileaccess();
     h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename);
 
+    /* Get a copy of the file access property list */
     new_fapl = H5Pcopy(fapl);
     CHECK(new_fapl, FAIL, "H5Pcopy");
 
@@ -3435,104 +3545,773 @@ test_filespace_info(void)
     ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
     CHECK(ret, FAIL, "H5Pset_libver_bounds");
 
-    /* Create file-creation template */
+    /* 
+     * Case (1)
+     *  Check file space information from a default file creation property list.
+     *  Values expected:
+     *	  strategy--H5F_FILE_SPACE_AGGR
+     *	  persist--FALSE
+     *	  threshold--1
+     *	  file space page size--4096
+     */
+    /* Create file creation property list template */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+
+    /* Retrieve file space information */
+    ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+    /* Verify file space information */
+    VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+    VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+    VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+
+    /* Retrieve file space page size */
+    ret = H5Pget_file_space_page_size(fcpl, &fsp_size);
+    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+    VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size");
+
+    /* Close property list */
+    H5Pclose(fcpl);
+
+    /* 
+     * Case (2)
+     *  File space page size has a minimum size of 512.
+     *  Setting value less than 512 will return an error;
+     *      --setting file space page size to 0
+     *      --setting file space page size to 511
+     */
+    /* Create file creation property list 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");
+    /* Setting to 0: should fail */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_file_space_page_size(fcpl, 0);
+    } H5E_END_TRY;
+    VERIFY(ret, FAIL, "H5Pset_file_space_page_size");
+
+    /* Setting to 511: should fail */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_file_space_page_size(fcpl, 511);
+    } H5E_END_TRY;
+    VERIFY(ret, FAIL, "H5Pset_file_space_page_size");
+
+    /* Setting to 512: should succeed */
+    ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE512);
+    CHECK(ret, FAIL, "H5Pset_file_space_page_size");
+    ret = H5Pget_file_space_page_size(fcpl, &fsp_size);
+    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+    VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size");
+
+    /* Close property list */
+    H5Pclose(fcpl);
+
+    /* 
+     * Case (3)
+     *  Check file space information when creating a file with default properties.
+     *  Values expected:
+     *	  strategy--H5F_FILE_SPACE_AGGR
+     *	  persist--FALSE
+     *	  threshold--1
+     *	  file space page size--4096
+     */
+    /* Create a file with default file creation and access property lists */
+    fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    CHECK(fid, FAIL, "H5Fcreate");
+
+    /* Get the file's creation property list */
+    fcpl1 = H5Fget_create_plist(fid);
+    CHECK(fcpl1, FAIL, "H5Fget_create_plist");
+
+    /* Retrieve file space information */
+    ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold);
+    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+    /* Verify file space information */
+    VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+    VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+    VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+
+    /* Retrieve file space page size */
+    ret = H5Pget_file_space_page_size(fcpl1, &fsp_size);
+    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+    VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size");
 
-    /* Test with old & new format groups */
+    /* Close property lists */
+    ret = H5Fclose(fid);
+    CHECK(ret, FAIL, "H5Fclose");
+    ret = H5Pclose(fcpl1);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* 
+     * Case (4)
+     *  Check file space information when creating a file with the
+     *  latest library format and default properties.
+     *  Values expected:
+     *	  strategy--H5F_FILE_SPACE_AGGR
+     *	  persist--FALSE
+     *	  threshold--1
+     *	  file space page size--4096
+     */
+    /* Create a file with the latest library format */
+    fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, new_fapl);
+    CHECK(fid, FAIL, "H5Fcreate");
+
+    /* Get the file's creation property */
+    fcpl1 = H5Fget_create_plist(fid);
+    CHECK(fcpl1, FAIL, "H5Fget_create_plist");
+
+    /* Retrieve file space information */
+    ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold);
+    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+    /* Verify file space information */
+    VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+    VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+    VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+
+    /* Retrieve file space page size */
+    ret = H5Pget_file_space_page_size(fcpl1, &fsp_size);
+    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+    VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size");
+
+    /* Close property lists */
+    ret = H5Fclose(fid);
+    CHECK(ret, FAIL, "H5Fclose");
+    ret = H5Pclose(fcpl1);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* 
+     * Case (5)
+     *  Check file space information with the following combinations:
+     *	Create file with --
+     *		New or old format
+     *		Persist or not persist free-space
+     *		Different sizes for free-space section threshold (0 to 10)
+     *		The four file space strategies: 
+     *		  H5F_FSPACE_STRATEGY_FSM_AGGR, H5F_FSPACE_STRATEGY_PAGE, 
+     *        H5F_FSPACE_STRATEGY_AGGR, H5F_FSPACE_STRATEGY_NONE
+     *		File space page size: set to 512
+     *  
+     */
     for(new_format = FALSE; new_format <= TRUE; new_format++) {
-        hid_t my_fapl;
+        hid_t my_fapl; 
 
         /* Set the FAPL for the type of format */
         if(new_format) {
-	    MESSAGE(5, ("Testing with new group format\n"));
+            MESSAGE(5, ("Testing with new group format\n"));
             my_fapl = new_fapl;
         } /* end if */
         else {
-	    MESSAGE(5, ("Testing with old group format\n"));
+            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 TRUE or FALSE for persisting free-space */
+        for(fs_persist = FALSE; fs_persist <= TRUE; fs_persist++) {
+
+            /* Test with free-space section threshold size: 0 to 10 */
+            for(fs_threshold = 0; fs_threshold <= TEST_THRESHOLD10; fs_threshold++) {
+
+                /* Test with 4 file space strategies */
+                for(fs_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR; fs_strategy < H5F_FSPACE_STRATEGY_NTYPES; H5_INC_ENUM(H5F_fspace_strategy_t, fs_strategy)) {
+
+                    if(!contig_addr_vfd && (fs_strategy == H5F_FSPACE_STRATEGY_PAGE || fs_persist))
+                        continue;
+
+                    /* Create file creation property list template */
+                    fcpl = H5Pcreate(H5P_FILE_CREATE);
+                    CHECK(fcpl, FAIL, "H5Pcreate");
+
+                    /* Set file space information */
+                    ret = H5Pset_file_space_strategy(fcpl, fs_strategy, (hbool_t)fs_persist, fs_threshold);
+                    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+
+                    ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE512);
+                    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+			
+                    /* Retrieve file space information */
+                    ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+                    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+                    /* Verify file space information */
+                    VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy");
+
+                    if(fs_strategy < H5F_FSPACE_STRATEGY_AGGR) {
+                        VERIFY(persist, (hbool_t)fs_persist, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy");
+                    } else {
+                        VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+                    }
+
+                    /* Retrieve and verify file space page size */
+                    ret = H5Pget_file_space_page_size(fcpl, &fsp_size);
+                    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+                    VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size");
+
+                    /* Create the file with the specified file space info */
+                    fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl);
+                    CHECK(fid, FAIL, "H5Fcreate");
+
+                    /* Get the file's creation property */
+                    fcpl1 = H5Fget_create_plist(fid);
+                    CHECK(fcpl1, FAIL, "H5Fget_create_plist");
+
+                    /* Retrieve file space information */
+                    ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold);
+                    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+                    /* Verify file space information */
+                    VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy");
+
+                    if(fs_strategy < H5F_FSPACE_STRATEGY_AGGR) {
+                        VERIFY(persist, fs_persist, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy");
+                    } else {
+                        VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+                    }
+
+                    /* Retrieve and verify file space page size */
+                    ret = H5Pget_file_space_page_size(fcpl1, &fsp_size);
+                    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+                    VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size");
+
+                    /* Close the file */
+                    ret = H5Fclose(fid);
+                    CHECK(ret, FAIL, "H5Fclose");
+
+                    /* Re-open the file */
+                    fid = H5Fopen(filename, H5F_ACC_RDWR, my_fapl);
+                    CHECK(ret, FAIL, "H5Fopen");
+
+                    /* Get the file's creation property */
+                    fcpl2 = H5Fget_create_plist(fid);
+                    CHECK(fcpl2, FAIL, "H5Fget_create_plist");
+
+                    /* Retrieve file space information */
+                    ret = H5Pget_file_space_strategy(fcpl2, &strategy, &persist, &threshold);
+                    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+                    /* Verify file space information */
+                    VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy");
+                    if(fs_strategy < H5F_FSPACE_STRATEGY_AGGR) {
+                        VERIFY(persist, fs_persist, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy");
+                    } else {
+                        VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+                        VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+                    }
+
+                    /* Retrieve and verify file space page size */
+                    ret = H5Pget_file_space_page_size(fcpl2, &fsp_size);
+                    CHECK(ret, FAIL, "H5Pget_file_space_page_size");
+                    VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size");
+
+                    /* Close the file */
+                    ret = H5Fclose(fid);
+                    CHECK(ret, FAIL, "H5Fclose");
+
+                    /* Release file creation property lists */
+                    ret = H5Pclose(fcpl);
+                    CHECK(ret, FAIL, "H5Pclose");
+                    ret = H5Pclose(fcpl1);
+                    CHECK(ret, FAIL, "H5Pclose");
+                    ret = H5Pclose(fcpl2);
+                    CHECK(ret, FAIL, "H5Pclose");
+                } /* end for file space strategy type */
+            } /* end for free-space section threshold */
+        } /* end for fs_persist */
+
+        /* close fapl_ and remove the file */
+        h5_clean_files(FILESPACE_NAME, my_fapl);
+    } /* end for new_format */
+
+}  /* test_filespace_info() */
+
+/****************************************************************
+**
+** set_multi_split():
+**  Internal routine to set up page-aligned address space for multi/split driver
+**  when testing paged aggregation.
+**  This is used by test_file_freespace() and test_sects_freespace().
+**
+*****************************************************************/
+static int
+set_multi_split(hid_t fapl, hsize_t pagesize, hbool_t multi, hbool_t split)
+{
+    H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+    hid_t memb_fapl_arr[H5FD_MEM_NTYPES];
+    char *memb_name[H5FD_MEM_NTYPES];
+    haddr_t memb_addr[H5FD_MEM_NTYPES];
+    hbool_t relax;
+    H5FD_mem_t  mt;
+
+    HDassert(split || multi);
 
-            /* 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)) {
+    HDmemset(memb_name, 0, sizeof memb_name);
 
-                /* Get a copy of the default file creation property */
-                fcpl1 = H5Pcopy(fcpl);
-                CHECK(fcpl1, FAIL, "H5Pcopy");
+    /* Get current split settings */
+    if(H5Pget_fapl_multi(fapl, memb_map, memb_fapl_arr, memb_name, memb_addr, &relax) < 0)
+        TEST_ERROR
 
-                /* Set file space strategy and free space section threshold */
-                ret = H5Pset_file_space(fcpl1, fs_type, fs_size);
-                CHECK(ret, FAIL, "H5Pget_file_space");
+    if(split) {
+        /* Set memb_addr aligned */
+        memb_addr[H5FD_MEM_SUPER] = ((memb_addr[H5FD_MEM_SUPER] + pagesize - 1) / pagesize) * pagesize;
+        memb_addr[H5FD_MEM_DRAW] = ((memb_addr[H5FD_MEM_DRAW] + pagesize - 1) / pagesize) * pagesize;
+    } else {
+        /* Set memb_addr aligned */
+        for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+            memb_addr[mt] = ((memb_addr[mt] + pagesize - 1) / pagesize) * pagesize;
+    } /* end else */
 
-                /* Get the file space info from the creation property */
-                ret = H5Pget_file_space(fcpl1, &strategy, &threshold);
-                CHECK(ret, FAIL, "H5Pget_file_space");
+    /* Set multi driver with new FAPLs */
+    if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl_arr, (const char * const *)memb_name, memb_addr, relax) < 0)
+        TEST_ERROR
 
-                /* 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");
+    /* Free memb_name */
+    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt))
+        free(memb_name[mt]);
 
-                /* Create the file with the specified file space info */
-                fid1 = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl1, my_fapl);
-                CHECK(fid1, FAIL, "H5Fcreate");
+    return 0;
 
-                /* Close the file */
-                ret = H5Fclose(fid1);
-                CHECK(ret, FAIL, "H5Fclose");
+error:
+    return(-1);
 
-                /* Re-open the file */
-                fid2 = H5Fopen(filename, H5F_ACC_RDWR, my_fapl);
-                CHECK(fid2, FAIL, "H5Fopen");
+} /* set_multi_split() */
 
-                /* Get the file's creation property */
-                fcpl2 = H5Fget_create_plist(fid2);
-                CHECK(fcpl2, FAIL, "H5Fget_create_plist");
+/****************************************************************
+**
+**  test_file_freespace():
+**      This routine checks the free space available in a file as
+**      returned by the public routine H5Fget_freespace().
+**
+**  Modifications:
+**	Vailin Choi; July 2012
+**	Remove datasets in reverse order so that all file spaces are shrunk.
+**	(A change due to H5FD_FLMAP_DICHOTOMY.)
+**
+**	Vailin Choi; Dec 2012
+**	Add changes due to paged aggregation via new format:
+**	the amount of freespace is different.
+**
+*****************************************************************/
+static void
+test_file_freespace(const char *env_h5_drvr)
+{
+    hid_t    file;                      /* File opened with read-write permission */
+    h5_stat_size_t empty_filesize;      /* Size of file when empty */
+    h5_stat_size_t mod_filesize;        /* Size of file after being modified */
+    hssize_t free_space;                /* Amount of free space in file */
+    hid_t    fcpl;                      /* File creation property list */
+    hid_t    fapl, new_fapl;            /* File access property list IDs */
+    hid_t    dspace;                    /* Dataspace ID */
+    hid_t    dset;                      /* Dataset ID */
+    hid_t    dcpl;                      /* Dataset creation property list */
+    int k;                              /* Local index variable */
+    unsigned u;                         /* Local index variable */
+    char     filename[FILENAME_LEN];    /* Filename to use */
+    char     name[32];                  /* Dataset name */
+    unsigned new_format;                /* To use old or new format */
+    hbool_t split_vfd, multi_vfd;       /* Indicate multi/split driver */
+    hsize_t expected_freespace;         /* Freespace expected */
+    hsize_t expected_fs_del;            /* Freespace expected after delete */
+    herr_t   ret;                       /* Return value */
+
+    split_vfd = !HDstrcmp(env_h5_drvr, "split");
+    multi_vfd = !HDstrcmp(env_h5_drvr, "multi");
+
+    if(!split_vfd && !multi_vfd) {
+        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");
+
+        fcpl = H5Pcreate(H5P_FILE_CREATE);
+        CHECK(fcpl, FAIL, "H5Pcreate");
+
+        /* Test with old & new format */
+        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;
+
+                if(multi_vfd || split_vfd) {
+                    ret = set_multi_split(new_fapl, FSP_SIZE_DEF, multi_vfd, split_vfd);
+                    CHECK(ret, FAIL, "set_multi_split");
+                }
+
+                ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+                CHECK(ret, FAIL, "H5P_set_file_space_strategy");
+
+                expected_freespace = 4534;
+                if(split_vfd) expected_freespace = 427;
+                if(multi_vfd) expected_freespace = 248;
+                expected_fs_del = 0;
+            } /* end if */
+            else {
+                MESSAGE(5, ("Testing with old group format\n"));
+                /* Default: non-paged aggregation, non-persistent free-space */
+                my_fapl = fapl;
+                expected_freespace = 2464;
+                if(split_vfd) expected_freespace = 264;
+                if(multi_vfd) expected_freespace = 0;
+                expected_fs_del = 4096;
+
+            } /* end else */
+
+            /* Create an "empty" file */
+            file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl);
+            CHECK(file, FAIL, "H5Fcreate");
+
+            ret = H5Fclose(file);
+            CHECK_I(ret, "H5Fclose");
+
+            /* Get the "empty" file size */
+            empty_filesize = h5_get_file_size(filename, H5P_DEFAULT);
+
+            /* Re-open the file (with read-write permission) */
+            file = H5Fopen(filename, H5F_ACC_RDWR, my_fapl);
+            CHECK_I(file, "H5Fopen");
+
+            /* Check that the free space is 0 */
+            free_space = H5Fget_freespace(file);
+            CHECK(free_space, FAIL, "H5Fget_freespace");
+            VERIFY(free_space, 0, "H5Fget_freespace");
+
+            /* 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 */
 
-                strategy = H5F_FILE_SPACE_DEFAULT;
-                threshold = 0;
+            /* Close dataspace */
+            ret = H5Sclose(dspace);
+            CHECK(ret, FAIL, "H5Sclose");
 
-                /* Get the file space info from the creation property list */
-                ret = H5Pget_file_space(fcpl2, &strategy, &threshold);
-                CHECK(ret, FAIL, "H5Pget_file_space");
+            /* Close dataset creation property list */
+            ret = H5Pclose(dcpl);
+            CHECK(ret, FAIL, "H5Pclose");
 
-                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");
+            /* Check that there is the right amount of free space in the file */
+            free_space = H5Fget_freespace(file);
+            CHECK(free_space, FAIL, "H5Fget_freespace");
+            VERIFY(free_space, expected_freespace, "H5Fget_freespace");
 
-                /* Close the file */
-                ret = H5Fclose(fid2);
-                CHECK(ret, FAIL, "H5Fclose");
+            /* Delete datasets in file */
+            for(k = 9; k >= 0; k--) {
+                sprintf(name, "Dataset %u", (unsigned)k);
+                ret = H5Ldelete(file, name, H5P_DEFAULT);
+                CHECK(ret, FAIL, "H5Ldelete");
+            } /* end for */
 
-                /* 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 */
+            /* Check that there is the right amount of free space in the file */
+            free_space = H5Fget_freespace(file);
+            CHECK(free_space, FAIL, "H5Fget_freespace");
+            if(new_format) 
+                VERIFY(free_space, expected_fs_del, "H5Fget_freespace");
+            else 
+                VERIFY(free_space, expected_fs_del, "H5Fget_freespace");
 
-        h5_clean_files(FILESPACE_NAME, my_fapl);
+            /* Close file */
+            ret = H5Fclose(file);
+            CHECK(ret, FAIL, "H5Fclose");
 
-    } /* end for new/old format */
+            /* Get the file size after modifications*/
+            mod_filesize = h5_get_file_size(filename, H5P_DEFAULT);
+
+            /* Check that the file reverted to empty size */
+            VERIFY(mod_filesize, empty_filesize, "H5Fget_freespace");
+
+            h5_clean_files(FILESPACE_NAME, my_fapl);
+
+        } /* end for */
+    }
+
+} /* end test_file_freespace() */
+
+/****************************************************************
+**
+**  test_sects_freespace():
+**      This routine checks free-space section information for the
+**	file as returned by the public routine H5Fget_free_sections().
+**
+*****************************************************************/
+static void
+test_sects_freespace(const char *env_h5_drvr, hbool_t new_format)
+{
+    char     filename[FILENAME_LEN];    /* Filename to use */
+    hid_t    file;                      /* File ID */
+    hid_t    fcpl;                      /* File creation property list template */
+    hid_t    fapl;                      /* File access property list template */
+    hssize_t free_space;                /* Amount of free-space in the file */
+    hid_t    dspace;                    /* Dataspace ID */
+    hid_t    dset;                      /* Dataset ID */
+    hid_t    dcpl;                      /* Dataset creation property list */
+    char     name[32];                  /* Dataset name */
+    hssize_t nsects = 0;                /* # of free-space sections */
+    hssize_t nall;                      /* # of free-space sections for all types of data */
+    hssize_t nmeta = 0, nraw = 0;       /* # of free-space sections for meta/raw/generic data */
+    H5F_sect_info_t sect_info[15];      /* Array to hold free-space information */
+    H5F_sect_info_t all_sect_info[15];  /* Array to hold free-space information for all types of data */
+    H5F_sect_info_t meta_sect_info[15]; /* Array to hold free-space information for metadata */
+    H5F_sect_info_t raw_sect_info[15];  /* Array to hold free-space information for raw data */
+    hsize_t  total = 0;        	        /* sum of the free-space section sizes */
+    hsize_t  tmp_tot = 0;               /* Sum of the free-space section sizes */
+    hsize_t  last_size;        	        /* Size of last free-space section */
+    hsize_t  dims[1];                   /* Dimension sizes */
+    unsigned u;                         /* Local index variable */
+    H5FD_mem_t type;
+    hbool_t split_vfd = FALSE, multi_vfd = FALSE;
+    herr_t   ret;                   /* Return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("Testing H5Fget_free_sections()--free-space section info in the file\n"));
+
+    split_vfd = !HDstrcmp(env_h5_drvr, "split");
+    multi_vfd = !HDstrcmp(env_h5_drvr, "multi");
+
+    if(!split_vfd && !multi_vfd) {
+
+        fapl = h5_fileaccess();
+        h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename);
+
+        /* Create file-creation template */
+        fcpl = H5Pcreate(H5P_FILE_CREATE);
+        CHECK(fcpl, FAIL, "H5Pcreate");
+
+        if(new_format) {
+            ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+            CHECK(ret, FAIL, "H5Pset_libver_bounds");
+
+            /* Set to paged aggregation and persistent free-space */
+            ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1);
+            CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+            /* Set up paged aligned address space for multi/split driver */
+            if(multi_vfd || split_vfd) {
+                ret = set_multi_split(fapl, FSP_SIZE_DEF, multi_vfd, split_vfd);
+                CHECK(ret, FAIL, "set_multi_split");
+            }
+
+        } else {
+            ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1);
+            CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+        } 
+
+        /* Create the file */
+        file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+        CHECK(file, FAIL, "H5Fcreate");
+
+        /* 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 1 large dataset */
+        dims[0] = 1200;
+        dspace = H5Screate_simple(1, dims, NULL);
+        dset = H5Dcreate2(file, "Dataset_large", H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+        CHECK(dset, FAIL, "H5Dcreate2");
+
+        /* Close dataset */
+        ret = H5Dclose(dset);
+        CHECK(ret, FAIL, "H5Dclose");
+
+        /* Close dataspace */
+        ret = H5Sclose(dspace);
+        CHECK(ret, FAIL, "H5Sclose");
+
+        /* Create dataspace for datasets */
+        dspace = H5Screate(H5S_SCALAR);
+        CHECK(dspace, FAIL, "H5Screate");
+
+        /* 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(filename, 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 total # of free-space sections in the file */
+        nall = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL);
+        CHECK(nall, FAIL, "H5Fget_free_sections");
+
+        /* Should return failure when nsects is 0 with a nonnull sect_info */
+        nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, all_sect_info);
+        VERIFY(nsects, FAIL, "H5Fget_free_sections");
+
+        /* Retrieve and verify free space info for all the sections */
+        HDmemset(all_sect_info, 0,  sizeof(all_sect_info));
+        nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)nall, all_sect_info);
+        VERIFY(nsects, nall, "H5Fget_free_sections");
+
+        /* Verify the amount of free-space is correct */
+        for(u = 0; u < nall; u++)
+            total += all_sect_info[u].size;
+        VERIFY(free_space, total, "H5Fget_free_sections");
+
+        /* Save the last section's size */
+        last_size = all_sect_info[nall-1].size;
+
+        /* Retrieve and verify free space info for -1 sections */
+        HDmemset(sect_info, 0,  sizeof(sect_info));
+        nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall - 1), sect_info);
+        VERIFY(nsects, nall, "H5Fget_free_sections");
+
+        /* Verify the amount of free-space is correct */
+        total = 0;
+        for(u = 0; u < (nall - 1); u++) {
+            VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections");
+            VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections");
+            total += sect_info[u].size;
+        }
+        VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections");
+
+        /* Retrieve and verify free-space info for +1 sections */
+        HDmemset(sect_info, 0,  sizeof(sect_info));
+        nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall + 1), sect_info);
+        VERIFY(nsects, nall, "H5Fget_free_sections");
+
+        /* Verify amount of free-space is correct */
+        total = 0;
+        for(u = 0; u < nall; u++) {
+            VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections");
+            VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections");
+            total += sect_info[u].size;
+        }
+        VERIFY(sect_info[nall].addr, 0, "H5Fget_free_sections");
+        VERIFY(sect_info[nall].size, 0, "H5Fget_free_sections");
+        VERIFY(free_space, total, "H5Fget_free_sections");
+
+        HDmemset(meta_sect_info, 0,  sizeof(meta_sect_info));
+        if(multi_vfd) {
+            hssize_t ntmp;       
+
+            for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+                if(type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP)
+                    continue;
+                /* Get the # of free-space sections in the file for metadata */
+                ntmp = H5Fget_free_sections(file, type, (size_t)0, NULL);
+                CHECK(ntmp, FAIL, "H5Fget_free_sections");
+
+                if(ntmp > 0) {
+                    nsects = H5Fget_free_sections(file, type, (size_t)ntmp, &meta_sect_info[nmeta]);
+                    VERIFY(nsects, ntmp, "H5Fget_free_sections");
+                    nmeta += ntmp;
+                }
+            }
+        } else {
+            /* Get the # of free-space sections in the file for metadata */
+            nmeta = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)0, NULL);
+            CHECK(nmeta, FAIL, "H5Fget_free_sections");
+
+            /* Retrieve and verify free-space sections for metadata */
+            nsects = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)nmeta, meta_sect_info);
+            VERIFY(nsects, nmeta, "H5Fget_free_sections");
+        }
+
+        /* Get the # of free-space sections in the file for raw data */
+        nraw = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)0, NULL);
+        CHECK(nraw, FAIL, "H5Fget_free_sections");
+
+        /* Retrieve and verify free-space sections for raw data */
+        HDmemset(raw_sect_info, 0,  sizeof(raw_sect_info));
+        nsects = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)nraw, raw_sect_info);
+        VERIFY(nsects, nraw, "H5Fget_free_sections");
+
+        /* Sum all the free-space sections */
+        for(u = 0; u < nmeta; u++)
+            tmp_tot += meta_sect_info[u].size;
+
+        for(u = 0; u < nraw; u++)
+            tmp_tot += raw_sect_info[u].size;
+
+        /* Verify free-space info */
+        VERIFY(nmeta+nraw, nall, "H5Fget_free_sections");
+        VERIFY(tmp_tot, total, "H5Fget_free_sections");
+
+        /* Closing */
+        ret = H5Fclose(file);
+        CHECK(ret, FAIL, "H5Fclose");
+        ret = H5Pclose(fcpl);
+        CHECK(fcpl, FAIL, "H5Pclose");
+
+        h5_clean_files(FILESPACE_NAME, fapl);
+    } 
+
+} /* end test_sects_freespace() */
 
-    /* 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
+**	Verify that the trunk with the latest file space management
 **	can open, read and modify 1.6 HDF5 file and 1.8 HDF5 file.
-**	Also verify the correct file space strategy/threshold in use
+**	Also verify the correct file space handling information
 **	and the amount of free space.
 **
 ****************************************************************/
@@ -3540,36 +4319,37 @@ 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 */
+    hid_t	fid = -1;		/* File id */
+    hid_t       did = -1;		/* Dataset id */
+    hid_t	fcpl;			/* File creation property list template */
+    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 */
+    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 */
+    hbool_t	persist;		/* Persist free-space or not */
+    hsize_t	threshold;		/* Free-space section threshold */
+    H5F_fspace_strategy_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"));
+    MESSAGE(5, ("File space compatibility testing 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 */
+        /* Open and copy the test file into a temporary 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 */
+        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);
@@ -3577,7 +4357,7 @@ test_filespace_compatible(void)
 	ret = HDclose(fd_new);
 	CHECK(ret, FAIL, "HDclose");
 
-	/* Open the test file */
+        /* Open the temporary test file */
 	fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT);
 	CHECK(fid, FAIL, "H5Fopen");
 
@@ -3586,17 +4366,20 @@ test_filespace_compatible(void)
 	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");
+        /* Get the file's file creation property list */
+        fcpl = H5Fget_create_plist(fid);
+        CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+        /* Retrieve the file space info */
+        ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space_strategy");
 
-	/* 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");
+        /* File space handling strategy should be H5F_FSPACE_STRATEGY_FSM_AGGR */
+        /* Persisting free-space should be FALSE */
+        /* Free-space section threshold should be 1 */
+        VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+        VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+        VERIFY(threshold, 1, "H5Pget_file_space_strategy");
 
 	/* Generate raw data */
 	for(i = 0; i < 100; i++)
@@ -3620,13 +4403,13 @@ test_filespace_compatible(void)
 	ret = H5Ldelete(fid, DSETNAME, H5P_DEFAULT);
 	CHECK(ret, FAIL, "H5Ldelete");
 
-    /* Close the plist */
-    ret = H5Pclose(fcpl);
-    CHECK(ret, FAIL, "H5Pclose");
+        /* Close the plist */
+        ret = H5Pclose(fcpl);
+        CHECK(ret, FAIL, "H5Pclose");
 
-    /* Close the file */
-    ret = H5Fclose(fid);
-    CHECK(ret, FAIL, "H5Fclose");
+        /* Close the file */
+        ret = H5Fclose(fid);
+        CHECK(ret, FAIL, "H5Fclose");
 
 	/* Re-Open the file */
 	fid = H5Fopen(FILE5, H5F_ACC_RDONLY, H5P_DEFAULT);
@@ -3649,6 +4432,383 @@ test_filespace_compatible(void)
 
 /****************************************************************
 **
+**  test_filespace_1.10.0_compatible():
+**	Verify that the latest file space management can open, read and
+**	modify 1.10.0 HDF5 files : 
+**    h5fc_ext1_i.h5:   H5F_FILE_SPACE_ALL, default threshold; has superblock extension but no fsinfo message
+**    h5fc_ext1_f.h5:   H5F_FILE_SPACE_ALL_PERSIST, default threshold; has superblock extension with fsinfo message
+**    h5fc_ext2_if.h5:  H5F_FILE_SPACE_ALL, non-default threshold; has superblock extension with fsinfo message
+**    h5fc_ext2_sf.h5:  H5F_FILE_SPACE_VFD, default threshold; has superblock extension with fsinfo message
+**    h5fc_ext3_isf.h5: H5F_FILE_SPACE_AGGR_VFD, default threshold; has superblock extension with fsinfo message
+**    h5fc_ext_none.h5: H5F_FILE_SPACE_ALL, default threshold; without superblock extension
+**  The above files are copied from release 1.10.0 tools/h5format_convert/testfiles.
+**
+****************************************************************/
+static void
+test_filespace_1_10_0_compatible(void)
+{
+    hid_t       fid = -1;               /* File id */
+    hid_t       did = -1;		/* Dataset id */
+    hid_t       fcpl;                   /* File creation property list */
+    hbool_t	persist;                /* Persist free-space or not */
+    hsize_t	threshold;              /* Free-space section threshold */
+    H5F_fspace_strategy_t strategy;     /* File space handling strategy */
+    int         wbuf[24]; 		/* Buffer for dataset data */
+    int         rdbuf[24];		/* Buffer for dataset data */
+    int         status;                 /* Status from copying the existing file */
+    unsigned    i, j;                   /* Local index variable */
+    herr_t	ret;			/* Return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("File space compatibility testing for 1.10.0 files\n"));
+
+    for(j = 0; j < NELMTS(OLD_1_10_0_FILENAME); j++) {
+        /* Make a copy of the test file */
+        status = h5_make_local_copy(OLD_1_10_0_FILENAME[j], FILE5);
+	CHECK(status, FAIL, "h5_make_local_copy");
+
+        /* Open the temporary test file */
+        fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT);
+        CHECK(fid, FAIL, "H5Fopen");
+
+        /* Get the file's file creation property list */
+        fcpl = H5Fget_create_plist(fid);
+        CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+        /* Retrieve the file space info */
+        ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+
+        switch(j) {
+            case 0:
+                VERIFY(strategy, H5F_FILE_SPACE_STRATEGY_DEF, "H5Pget_file_space_strategy");
+                VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy");
+                VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/DSET_EA", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 1:
+                VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+                VERIFY(persist, TRUE, "H5Pget_file_space_strategy");
+                VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/DSET_NDATA_BT2", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 2:
+                VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+                VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy");
+                VERIFY(threshold, 2, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/DSET_NONE", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 3:
+                VERIFY(strategy, H5F_FSPACE_STRATEGY_NONE, "H5Pget_file_space_strategy");
+                VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy");
+                VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_EA", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 4:
+                VERIFY(strategy, H5F_FSPACE_STRATEGY_AGGR, "H5Pget_file_space_strategy");
+                VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy");
+                VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_FA", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+            case 5:
+                VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+                VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy");
+                VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy");
+
+                /* Open the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_NONE", H5P_DEFAULT);
+                CHECK(did, FAIL, "H5Dopen");
+
+                for(i = 0; i < 24; i++)
+                    wbuf[i] = (int)j+1;
+
+                /* Write to the dataset */
+                ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+                CHECK(ret, FAIL, "H5Dwrite");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            default:
+               break; 
+        }
+
+        /* 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");
+
+        switch(j) {
+            case 0:
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/DSET_EA", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 1:
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/DSET_NDATA_BT2", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 2:
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/DSET_NONE", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 3:
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_EA", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 4:
+
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_FA", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            case 5:
+
+                /* Open and read the dataset */
+                did = H5Dopen2(fid, "/GROUP/DSET_NDATA_NONE", 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 < 24; i++)
+                    VERIFY(rdbuf[i], j+1, "test_compatible");
+
+                /* Close the dataset */
+                ret = H5Dclose(did);
+                CHECK(ret, FAIL, "H5Dclose");
+                break; 
+
+            default:
+               break; 
+        }
+
+        /* Close the file */
+        ret = H5Fclose(fid);
+        CHECK(ret, FAIL, "H5Fclose");
+    } /* end for */
+
+} /* test_filespace_1_10_0_compatible */
+
+/****************************************************************
+**
+**  test_filespace_round_compatible():
+**	Verify that the trunk can open, read and modify these files--
+**	  1) They are initially created (via gen_filespace.c) in the trunk 
+**	     with combinations of file space strategies, default/non-default
+**	     threshold, and file spacing paging enabled/disbled.  
+**	     The library creates the file space info message with 
+**	     "mark if unknown" in these files.
+**	  2) They are copied to the 1.8 branch, and are opened/read/modified 
+**	     there via test_filespace_compatible() in test/tfile.c. 
+**	     The 1.8 library marks the file space info message as "unknown"
+**	     in these files.
+**	  3) They are then copied back from the 1.8 branch to the trunk for
+**	     compatibility testing via this routine.
+**	  4) Upon encountering the file space info message which is marked
+**	     as "unknown", the library will use the default file space management
+**	     from then on: non-persistent free-space managers, default threshold,
+**	     and non-paging file space.
+**
+****************************************************************/
+static void
+test_filespace_round_compatible(void)
+{
+    hid_t	fid = -1;		/* File id */
+    hid_t	fcpl = -1;		/* File creation property list ID */
+    unsigned    j;			/* Local index variable */
+    H5F_fspace_strategy_t strategy;	/* File space strategy */
+    hbool_t 	persist;		/* Persist free-space or not */
+    hsize_t 	threshold;		/* Free-space section threshold */
+    hssize_t	free_space;		/* Amount of free space in the file */
+    int         status;                 /* Status from copying the existing file */
+    herr_t	ret;			/* Return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("File space compatibility testing for files from trunk to 1_8 to trunk\n"));
+
+    for(j = 0; j < NELMTS(FSPACE_FILENAMES); j++) {
+        /* Make a copy of the test file */
+        status = h5_make_local_copy(FSPACE_FILENAMES[j], FILE5);
+	CHECK(status, FAIL, "h5_make_local_copy");
+
+	/* Open the temporary test file */
+	fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT);
+	CHECK(fid, FAIL, "H5Fopen");
+
+	/* Get the file's creation property list */
+	fcpl = H5Fget_create_plist(fid);
+	CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+	ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+	CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+	VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy");
+	VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+	VERIFY(threshold, 1, "H5Pget_file_space_strategy");
+
+	/* 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");
+
+	/* Closing */
+	ret = H5Fclose(fid);
+	ret = H5Pclose(fcpl);
+	CHECK(ret, FAIL, "H5Fclose");
+    } /* end for */
+
+} /* test_filespace_round_compatible */
+
+
+/****************************************************************
+**
 **  test_libver_bounds_real():
 **      Verify that a file created and modified with the
 **      specified libver bounds has the specified object header
@@ -3875,7 +5035,7 @@ test_libver_macros2(void)
 
 /****************************************************************
 **
-**  test_deprec(): 
+**  test_deprec():
 **	Test deprecated functionality.
 **
 ****************************************************************/
@@ -3885,6 +5045,9 @@ test_deprec(void)
 {
     hid_t       file;           /* File IDs for old & new files */
     hid_t       fcpl;           /* File creation property list */
+    hid_t       fapl;           /* File creation property list */
+    hid_t new_fapl;
+    hsize_t align;
     unsigned    super;          /* Superblock version # */
     unsigned    freelist;       /* Free list version # */
     unsigned    stab;           /* Symbol table entry version # */
@@ -3937,17 +5100,25 @@ test_deprec(void)
     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");
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)0);
+    ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512);
+    CHECK(ret, FAIL, "H5Pset_file_space_strategy");
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024);
+    CHECK(ret, FAIL, "H5Pset_alignment");
 
     /* 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);
+    file= H5Fcreate(FILE1, H5F_ACC_TRUNC , fcpl, fapl);
     CHECK(file, FAIL, "H5Fcreate");
 
+    new_fapl = H5Fget_access_plist(file);
+    H5Pget_alignment(new_fapl, NULL, &align);
+
     /* Close FCPL */
     ret=H5Pclose(fcpl);
     CHECK(ret, FAIL, "H5Pclose");
@@ -3955,7 +5126,7 @@ test_deprec(void)
     /* 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.super_ext_size, 152,"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");
@@ -3987,7 +5158,7 @@ test_deprec(void)
     /* 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.super_ext_size, 152,"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");
@@ -4011,6 +5182,81 @@ test_deprec(void)
     /* Close file */
     ret=H5Fclose(file);
     CHECK(ret, FAIL, "H5Fclose");
+
+    { /* Test deprecated H5Pget/set_file_space() */
+
+        H5F_file_space_type_t old_strategy;
+        hsize_t old_threshold;
+        hid_t fid;
+        hid_t ffcpl;
+
+        fcpl = H5Pcreate(H5P_FILE_CREATE);
+        CHECK(fcpl, FAIL, "H5Pcreate");
+
+        ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+        VERIFY(old_strategy, H5F_FILE_SPACE_ALL, "H5Pget_file_space");
+        VERIFY(old_threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space");
+
+        /* 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");
+
+        /* Get the file space info from the creation property */
+        ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+        VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space");
+        VERIFY(old_threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space");
+
+        ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_DEFAULT, (hsize_t)3);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+
+        ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+        VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space");
+        VERIFY(old_threshold, 3, "H5Pget_file_space");
+
+        /* Create a file */
+        fid = H5Fcreate(FILE1, H5F_ACC_TRUNC , fcpl, H5P_DEFAULT);
+        CHECK(file, FAIL, "H5Fcreate");
+
+        old_strategy = H5F_FILE_SPACE_DEFAULT;
+        old_threshold = 0;
+        ffcpl = H5Fget_create_plist(fid);
+        ret = H5Pget_file_space(ffcpl, &old_strategy, &old_threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+        VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space");
+        VERIFY(old_threshold, 3, "H5Pget_file_space");
+
+        /* Close file */
+        ret=H5Fclose(fid);
+        CHECK(ret, FAIL, "H5Fclose");
+
+        ret = H5Pclose(ffcpl);
+        CHECK(ret, FAIL, "H5Pclose");
+
+        ret = H5Pclose(fcpl);
+        CHECK(ret, FAIL, "H5Pclose");
+
+        /* Reopen the file */
+        fid = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
+        CHECK(fid, FAIL, "H5Fcreate");
+
+        old_strategy = H5F_FILE_SPACE_DEFAULT;
+        old_threshold = 0;
+        ffcpl = H5Fget_create_plist(fid);
+        ret = H5Pget_file_space(ffcpl, &old_strategy, &old_threshold);
+        CHECK(ret, FAIL, "H5Pget_file_space");
+        VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space");
+        VERIFY(old_threshold, 3, "H5Pget_file_space");
+
+        ret = H5Pclose(ffcpl);
+        CHECK(ret, FAIL, "H5Pclose");
+
+        ret=H5Fclose(fid);
+        CHECK(ret, FAIL, "H5Fclose");
+    }
+
 } /* test_deprec */
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
@@ -4022,48 +5268,58 @@ test_deprec(void)
 void
 test_file(void)
 {
+    const char  *env_h5_drvr;     	/* File Driver value from environment */
+
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Low-Level File I/O\n"));
 
-    test_file_create();         /* Test file creation(also creation templates)*/
-    test_file_open();           /* Test file opening */
-    test_file_reopen();         /* Test file reopening */
-    test_file_close();          /* Test file close behavior */
-    test_get_file_id();         /* Test H5Iget_file_id */
-    test_get_obj_ids();         /* Test H5Fget_obj_ids for Jira Issue 8528 */
-    test_file_perm();           /* Test file access permissions */
-    test_file_perm2();          /* Test file access permission again */
-    test_file_freespace();      /* Test file free space information */
-    test_file_ishdf5();         /* Test detecting HDF5 files correctly */
-    test_file_open_dot();       /* Test opening objects with "." for a name */
-    test_file_open_overlap();   /* Test opening files in an overlapping manner */
-    test_file_getname();        /* Test basic H5Fget_name() functionality */
-    test_file_double_root_open();       /* Test opening root group from two files works properly */
-    test_file_double_group_open();      /* Test opening same group from two files works properly */
-    test_file_double_dataset_open();    /* Test opening same dataset from two files works properly */
-    test_file_double_datatype_open();   /* Test opening same named datatype from two files works properly */
+    /* Get the VFD to use */
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+
+    test_file_create();                         /* Test file creation(also creation templates)*/
+    test_file_open();                           /* Test file opening */
+    test_file_reopen();                         /* Test file reopening */
+    test_file_close();                          /* Test file close behavior */
+    test_get_file_id();                         /* Test H5Iget_file_id */
+    test_get_obj_ids();                         /* Test H5Fget_obj_ids for Jira Issue 8528 */
+    test_file_perm();                           /* Test file access permissions */
+    test_file_perm2();                          /* Test file access permission again */
+    test_file_ishdf5();                         /* Test detecting HDF5 files correctly */
+    test_file_open_dot();                       /* Test opening objects with "." for a name */
+    test_file_open_overlap();                   /* Test opening files in an overlapping manner */
+    test_file_getname();                        /* Test basic H5Fget_name() functionality */
+    test_file_double_root_open();               /* Test opening root group from two files works properly */
+    test_file_double_group_open();              /* Test opening same group from two files works properly */
+    test_file_double_dataset_open();            /* Test opening same dataset from two files works properly */
+    test_file_double_datatype_open();           /* Test opening same named datatype from two files works properly */
     test_file_double_file_dataset_open(TRUE);
     test_file_double_file_dataset_open(FALSE);
-    test_userblock_file_size(); /* Tests that files created with a userblock have the correct size */
-    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();      /* 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();
-     */
+    test_userblock_file_size();                 /* Tests that files created with a userblock have the correct size */
+    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_userblock_alignment_paged();           /* Tests files created with a userblock and alignment (via paged aggregation) interact properly */
+    test_filespace_info(env_h5_drvr);           /* Test file creation public routines: */
+                                                /* H5Pget/set_file_space_strategy() & H5Pget/set_file_space_page_size() */
+                                                /* Skipped testing for multi/split drivers */
+    test_file_freespace(env_h5_drvr);           /* Test file public routine H5Fget_freespace() */
+                                                /* Skipped testing for multi/split drivers */
+                                                /* Setup for multi/split drivers are there already */
+    test_sects_freespace(env_h5_drvr, TRUE);    /* Test file public routine H5Fget_free_sections() for new format */
+                                                /* Skipped testing for multi/split drivers */
+                                                /* Setup for multi/split drivers are there already */
+    test_sects_freespace(env_h5_drvr, FALSE);   /* Test file public routine H5Fget_free_sections() */
+                                                /* Skipped testing for multi/split drivers */
+    test_filespace_compatible();                /* Test compatibility for file space management */
+    test_filespace_round_compatible();          /* Testing file space compatibility for files from trunk to 1_8 to trunk */
+    test_filespace_1_10_0_compatible();          /* Testing file space compatibility for files from release 1.10.0 */
+    test_libver_bounds();                       /* Test compatibility for file space management */
+    test_libver_macros();                       /* Test the macros for library version comparison */
+    test_libver_macros2();                      /* Test the macros for library version comparison */
 #ifndef H5_NO_DEPRECATED_SYMBOLS
-    test_deprec();              /* Test deprecated routines */
+    test_deprec();                              /* Test deprecated routines */
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 } /* test_file() */
 
diff --git a/test/tgenprop.c b/test/tgenprop.c
index b670c0d..0e6b5c9 100644
--- a/test/tgenprop.c
+++ b/test/tgenprop.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -784,7 +782,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(!H5_FLT_ABS_EQUAL(prop4_value,(double)*PROP4_DEF_VALUE))
+    if(!H5_DBL_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__);
 
@@ -821,7 +819,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(!H5_FLT_ABS_EQUAL(prop4_value,*PROP4_DEF_VALUE))
+    if(!H5_DBL_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__);
 
@@ -1241,7 +1239,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(!H5_FLT_ABS_EQUAL(prop4_value,(double)*PROP4_DEF_VALUE))
+    if(!H5_DBL_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__);
 
diff --git a/test/th5o.c b/test/th5o.c
index 3be5d12..4baac20 100644
--- a/test/th5o.c
+++ b/test/th5o.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -777,15 +775,21 @@ test_h5o_link(void)
     hsize_t dims[2] = {TEST6_DIM1, TEST6_DIM2};
     htri_t committed;           /* Whether the named datatype is committed */
     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;
+    int *wdata;
+    int *rdata;
+    int i, n;
     herr_t ret;                 /* Value returned from API calls */
 
+    /* Allocate memory buffers */
+    /* (These are treated as 2-D buffers) */
+    wdata = (int *)HDmalloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int));
+    CHECK(wdata, NULL, "HDmalloc");
+    rdata = (int *)HDmalloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int));
+    CHECK(rdata, NULL, "HDmalloc");
+
     /* Initialize the raw data */
-    for(i = n = 0; i < TEST6_DIM1; i++)
-        for(j = 0; j < TEST6_DIM2; j++)
-          wdata[i][j] = n++;
+    for(i = n = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++)
+      wdata[i] = n++;
 
     /* Create the dataspace */
     space_id = H5Screate_simple(2 ,dims, NULL);
@@ -840,9 +844,8 @@ test_h5o_link(void)
         CHECK(ret, FAIL, "H5Dread");
 
         /* Verify the data */
-        for(i = 0; i < TEST6_DIM1; i++)
-            for(j = 0; j < TEST6_DIM2; j++)
-                VERIFY(wdata[i][j], rdata[i][j], "H5Dread");
+        for(i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++)
+            VERIFY(wdata[i], rdata[i], "H5Dread");
 
         /* Create a group with no name*/
         group_id = H5Gcreate_anon(file_id, H5P_DEFAULT, H5P_DEFAULT);
@@ -879,9 +882,8 @@ test_h5o_link(void)
         /* Read data from dataset */
         ret = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
         CHECK(ret, FAIL, "H5Dread");
-        for(i = 0; i < TEST6_DIM1; i++)
-            for(j = 0; j < TEST6_DIM2; j++)
-                VERIFY(wdata[i][j], rdata[i][j], "H5Dread");
+        for(i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++)
+            VERIFY(wdata[i], rdata[i], "H5Dread");
 
         /* Close open IDs */
         ret = H5Dclose(dset_id);
@@ -897,6 +899,10 @@ test_h5o_link(void)
     CHECK(ret, FAIL, "H5Sclose");
     ret = H5Pclose(lcpl_id);
     CHECK(ret, FAIL, "H5Pclose");
+
+    /* Release buffers */
+    HDfree(wdata);
+    HDfree(rdata);
 } /* end test_h5o_link() */
 
 

@@ -920,6 +926,7 @@ test_h5o_comment(void)
     const char  *dtype_comment = "datatype comment";
     char        check_comment[64];
     ssize_t     comment_len = 0;
+    ssize_t     len;
     herr_t      ret;                        /* Value returned from API calls */
     int         ret_value;
 
@@ -1008,8 +1015,8 @@ test_h5o_comment(void)
     comment_len = H5Oget_comment(fid, NULL, (size_t)0);
     CHECK(comment_len, FAIL, "H5Oget_comment");
 
-    ret = H5Oget_comment(fid, check_comment, (size_t)comment_len+1);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    len = H5Oget_comment(fid, check_comment, (size_t)comment_len+1);
+    CHECK(len, FAIL, "H5Oget_comment");
 
     ret_value = HDstrcmp(file_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment");
@@ -1022,8 +1029,8 @@ test_h5o_comment(void)
     comment_len = H5Oget_comment(grp, NULL, (size_t)0);
     CHECK(comment_len, FAIL, "H5Oget_comment");
 
-    ret = H5Oget_comment(grp, check_comment, (size_t)comment_len+1);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    len = H5Oget_comment(grp, check_comment, (size_t)comment_len+1);
+    CHECK(len, FAIL, "H5Oget_comment");
 
     ret_value = HDstrcmp(grp_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment");
@@ -1036,8 +1043,8 @@ test_h5o_comment(void)
     comment_len = H5Oget_comment(dtype, NULL, (size_t)0);
     CHECK(comment_len, FAIL, "H5Oget_comment");
 
-    ret = H5Oget_comment(dtype, check_comment, (size_t)comment_len+1);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    len = H5Oget_comment(dtype, check_comment, (size_t)comment_len+1);
+    CHECK(len, FAIL, "H5Oget_comment");
 
     ret_value = HDstrcmp(dtype_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment");
@@ -1050,8 +1057,8 @@ test_h5o_comment(void)
     comment_len = H5Oget_comment(dset, NULL, (size_t)0);
     CHECK(comment_len, FAIL, "H5Oget_comment");
 
-    ret = H5Oget_comment(dset, check_comment, (size_t)comment_len+1);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    len = H5Oget_comment(dset, check_comment, (size_t)comment_len+1);
+    CHECK(ret, len, "H5Oget_comment");
 
     ret_value = HDstrcmp(dset_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment");
@@ -1092,6 +1099,7 @@ test_h5o_comment_by_name(void)
     const char  *dtype_comment = "datatype comment by name";
     char        check_comment[64];
     ssize_t     comment_len = 0;
+    ssize_t     len;
     herr_t      ret;                        /* Value returned from API calls */
     int         ret_value;
 
@@ -1179,8 +1187,8 @@ test_h5o_comment_by_name(void)
     comment_len = H5Oget_comment_by_name(fid, ".", NULL, (size_t)0, H5P_DEFAULT);
     CHECK(comment_len, FAIL, "H5Oget_comment_by_name");
 
-    ret = H5Oget_comment_by_name(fid, ".", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Oget_comment_by_name");
+    len = H5Oget_comment_by_name(fid, ".", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
+    CHECK(len, FAIL, "H5Oget_comment_by_name");
 
     ret_value = HDstrcmp(file_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment_by_name");
@@ -1193,8 +1201,8 @@ test_h5o_comment_by_name(void)
     comment_len = H5Oget_comment_by_name(fid, "group", NULL, (size_t)0, H5P_DEFAULT);
     CHECK(comment_len, FAIL, "H5Oget_comment_by_name");
 
-    ret = H5Oget_comment_by_name(fid, "group", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Oget_comment_by_name");
+    len = H5Oget_comment_by_name(fid, "group", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
+    CHECK(len, FAIL, "H5Oget_comment_by_name");
 
     ret_value = HDstrcmp(grp_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment_by_name");
@@ -1203,8 +1211,8 @@ test_h5o_comment_by_name(void)
     comment_len = H5Oget_comment_by_name(grp, "datatype", NULL, (size_t)0, H5P_DEFAULT);
     CHECK(comment_len, FAIL, "H5Oget_comment_by_name");
 
-    ret = H5Oget_comment_by_name(grp, "datatype", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    len = H5Oget_comment_by_name(grp, "datatype", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
+    CHECK(len, FAIL, "H5Oget_comment");
 
     ret_value = HDstrcmp(dtype_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment_by_name");
@@ -1213,8 +1221,8 @@ test_h5o_comment_by_name(void)
     comment_len = H5Oget_comment_by_name(fid, "dataset", NULL, (size_t)0, H5P_DEFAULT);
     CHECK(comment_len, FAIL, "H5Oget_comment_by_name");
 
-    ret = H5Oget_comment_by_name(fid, "dataset", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Oget_comment_by_name");
+    len = H5Oget_comment_by_name(fid, "dataset", check_comment, (size_t)comment_len+1, H5P_DEFAULT);
+    CHECK(len, FAIL, "H5Oget_comment_by_name");
 
     ret_value = HDstrcmp(dset_comment, check_comment);
     VERIFY(ret_value, 0, "H5Oget_comment_by_name");
diff --git a/test/th5s.c b/test/th5s.c
index a478803..c63320a 100644
--- a/test/th5s.c
+++ b/test/th5s.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -551,18 +549,18 @@ test_h5s_zero_dim(void)
     MESSAGE(5, ("Testing Dataspace with zero dimension size\n"));
 
     /* Initialize the data */
-    for(i=0; i<SPACE1_DIM2; i++)
-        for(j=0; j<SPACE1_DIM3; j++) {
-            wdata[i][j] = i + j;
+    for(i = 0; i < SPACE1_DIM2; i++)
+        for(j = 0; j < SPACE1_DIM3; j++) {
+            wdata[i][j] = (int)(i + j);
             rdata[i][j] = 7;
-            wdata_short[i][j] = i + j;
+            wdata_short[i][j] = (short)(i + j);
             rdata_short[i][j] = 7;
         }
 
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<SPACE1_DIM2; j++)
-            for(k=0; k<SPACE1_DIM3; k++)
-                wdata_real[i][j][k] = i + j + k;
+    for(i = 0; i < SPACE1_DIM1; i++)
+        for(j = 0; j < SPACE1_DIM2; j++)
+            for(k = 0; k < SPACE1_DIM3; k++)
+                wdata_real[i][j][k] = (int)(i + j + k);
 
     /* Test with different space allocation times */
     for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; H5_INC_ENUM(H5D_alloc_time_t, alloc_time)) {
@@ -1647,7 +1645,7 @@ test_h5s_chunk(void)
     /* Initialize float array */
     for(i = 0; i < 50000; i++)
         for(j = 0; j < 3; j++)
-            chunk_data_flt[i][j] = (float)((i + 1) * 2.5F - j * 100.3F);
+            chunk_data_flt[i][j] = (float)(i + 1) * 2.5F - (float)j * 100.3F;
 
     status = H5Dwrite(dsetID, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_flt);
     CHECK(status, FAIL, "H5Dwrite");
@@ -1683,7 +1681,7 @@ 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(!H5_DBL_REL_EQUAL(chunk_data_dbl[i][j], chunk_data_flt[i][j], 0.00001F))
+            if(!H5_DBL_REL_EQUAL(chunk_data_dbl[i][j], (double)chunk_data_flt[i][j], (double)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 */
diff --git a/test/th5s.h5 b/test/th5s.h5
index bc2b666..7a0bfb3 100644
Binary files a/test/th5s.h5 and b/test/th5s.h5 differ
diff --git a/test/theap.c b/test/theap.c
index 230ec4d..3c23025 100644
--- a/test/theap.c
+++ b/test/theap.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -31,9 +29,6 @@
        2/18/03 - Started coding
  */
 
-#include <time.h>
-#include <stdlib.h>
-
 #include "testhdf5.h"
 #include "H5HPprivate.h"
 
@@ -47,13 +42,13 @@ typedef struct test_obj {
 } test_obj;
 
 /* Array of random element values */
-static test_obj rand_num[NUM_ELEMS];
+static test_obj *rand_num;
 
 /* Array of random elements values, sorted in increasing order */
-static test_obj inc_sort_num[NUM_ELEMS];
+static test_obj *inc_sort_num;
 
 /* Array of random elements values, sorted in decreasing order */
-static test_obj dec_sort_num[NUM_ELEMS];
+static test_obj *dec_sort_num;
 
 static int tst_dec_sort(const void *_i1, const void *_i2)
 {
@@ -91,21 +86,29 @@ test_heap_init(void)
     time_t curr_time;   /* Current time, for seeding random number generator */
     size_t u;           /* Local index variables */
 
+    /* Allocate arrays */
+    rand_num = (test_obj *)HDmalloc(sizeof(test_obj) * NUM_ELEMS);
+    CHECK(rand_num, NULL, "HDmalloc");
+    inc_sort_num = (test_obj *)HDmalloc(sizeof(test_obj) * NUM_ELEMS);
+    CHECK(inc_sort_num, NULL, "HDmalloc");
+    dec_sort_num = (test_obj *)HDmalloc(sizeof(test_obj) * NUM_ELEMS);
+    CHECK(dec_sort_num, NULL, "HDmalloc");
+
     /* Create randomized set of numbers */
-    curr_time=time(NULL);
+    curr_time = HDtime(NULL);
     HDsrandom((unsigned)curr_time);
-    for(u=0; u<NUM_ELEMS; u++)
+    for(u = 0; u < NUM_ELEMS; u++)
         /* Generate random numbers from -1000 to 1000 */
-        rand_num[u].val=(int)(HDrandom()%2001)-1001;
+        rand_num[u].val = (int)(HDrandom() % 2001) - 1001;
 
     /* Sort random numbers into increasing order */
-    HDmemcpy(inc_sort_num,rand_num,sizeof(test_obj)*NUM_ELEMS);
+    HDmemcpy(inc_sort_num, rand_num, sizeof(test_obj) * NUM_ELEMS);
     HDqsort(inc_sort_num, (size_t)NUM_ELEMS, sizeof(test_obj), tst_inc_sort);
 
     /* Sort random numbers into decreasing order */
-    HDmemcpy(dec_sort_num,rand_num,sizeof(test_obj)*NUM_ELEMS);
+    HDmemcpy(dec_sort_num, rand_num, sizeof(test_obj) * NUM_ELEMS);
     HDqsort(dec_sort_num, (size_t)NUM_ELEMS, sizeof(test_obj), tst_dec_sort);
-} /* end test_tst_init() */
+} /* end test_heap_init() */
 
 /****************************************************************
 **
@@ -1026,6 +1029,24 @@ test_heap_incdec(void)
 
 /****************************************************************
 **
+**  test_heap_term(): Test H5HP (heap) code.
+**      Release data for Heap testing
+**
+****************************************************************/
+static void
+test_heap_term(void)
+{
+    /* Release arrays */
+    if(rand_num)
+        HDfree(rand_num);
+    if(inc_sort_num)
+        HDfree(inc_sort_num);
+    if(dec_sort_num)
+        HDfree(dec_sort_num);
+} /* end test_tst_term() */
+
+/****************************************************************
+**
 **  test_heap(): Main H5HP testing routine.
 **
 ****************************************************************/
@@ -1047,5 +1068,8 @@ test_heap(void)
     test_heap_change();          /* Test changing priority of objects on Heap */
     test_heap_incdec();          /* Test incrementing & decrementing priority of objects on Heap */
 
+    /* Release Heap testing data */
+    test_heap_term();
+
 }   /* end test_heap() */
 
diff --git a/test/tid.c b/test/tid.c
index 6570b1c..494ee60 100644
--- a/test/tid.c
+++ b/test/tid.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Test user-created identifiers (hid_t's) and identifier types. */
diff --git a/test/titerate.c b/test/titerate.c
index 20a3940..aad62c9 100644
--- a/test/titerate.c
+++ b/test/titerate.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -72,7 +70,7 @@ herr_t aiter_cb(hid_t group, const char *name, const H5A_info_t *ainfo,
 **  iter_strcmp(): String comparison routine for qsort
 **
 ****************************************************************/
-int iter_strcmp(const void *s1, const void *s2)
+H5_ATTR_PURE int iter_strcmp(const void *s1, const void *s2)
 {
     return(HDstrcmp(*(const char * const *)s1,*(const char * const *)s2));
 }
@@ -283,7 +281,8 @@ test_iter_group(hid_t fapl, hbool_t new_format)
     /* Test all objects in group, when callback always returns 1 */
     /* This also tests the "restarting" ability, because the index changes */
     info.command = RET_TWO;
-    idx = i = 0;
+    i = 0;
+    idx = 0;
     while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) {
         /* Verify return value from iterator gets propagated correctly */
         VERIFY(ret, 2, "H5Literate");
@@ -308,7 +307,8 @@ test_iter_group(hid_t fapl, hbool_t new_format)
     /* Test all objects in group, when callback changes return value */
     /* This also tests the "restarting" ability, because the index changes */
     info.command = new_format ? RET_CHANGE2 : RET_CHANGE;
-    idx = i = 0;
+    i = 0;
+    idx = 0;
     while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) >= 0) {
         /* Verify return value from iterator gets propagated correctly */
         VERIFY(ret, 1, "H5Literate");
@@ -462,7 +462,8 @@ static void test_iter_attr(hid_t fapl, hbool_t new_format)
     /* Test all attributes on dataset, when callback always returns 1 */
     /* This also tests the "restarting" ability, because the index changes */
     info.command = RET_TWO;
-    idx = i = 0;
+    i = 0;
+    idx = 0;
     while((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) {
         /* Verify return value from iterator gets propagated correctly */
         VERIFY(ret, 2, "H5Aiterate2");
@@ -488,7 +489,8 @@ static void test_iter_attr(hid_t fapl, hbool_t new_format)
     /* Test all attributes on dataset, when callback changes return value */
     /* This also tests the "restarting" ability, because the index changes */
     info.command = new_format ? RET_CHANGE2 : RET_CHANGE;
-    idx = i = 0;
+    i = 0;
+    idx = 0;
     while((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) {
         /* Verify return value from iterator gets propagated correctly */
         VERIFY(ret, 1, "H5Aiterate2");
@@ -527,7 +529,7 @@ static void test_iter_attr(hid_t fapl, hbool_t new_format)
 **  iter_strcmp2(): String comparison routine for qsort
 **
 ****************************************************************/
-int iter_strcmp2(const void *s1, const void *s2)
+H5_ATTR_PURE int iter_strcmp2(const void *s1, const void *s2)
 {
     return(HDstrcmp((const char *)s1, (const char *)s2));
 } /* end iter_strcmp2() */
@@ -580,9 +582,9 @@ test_iter_group_large(hid_t fapl)
     hid_t		tid;       /* Datatype ID			*/
     hsize_t		dims[] = {SPACE1_DIM1};
     herr_t		ret;		/* Generic return value		*/
-    char gname[20];         /* Temporary group name */
-    iter_info names[ITER_NGROUPS+2]; /* Names of objects in the root group */
-    iter_info *curr_name;        /* Pointer to the current name in the root group */
+    char gname[20];             /* Temporary group name */
+    iter_info *names;           /* Names of objects in the root group */
+    iter_info *curr_name;       /* Pointer to the current name in the root group */
     int                 i;
 
     /* Compound datatype */
@@ -592,7 +594,9 @@ test_iter_group_large(hid_t fapl)
         float c;
     } s1_t;
 
-    HDmemset(names, 0, sizeof names);
+    /* Allocate & initialize array */
+    names = (iter_info *)HDcalloc(sizeof(iter_info), (ITER_NGROUPS + 2));
+    CHECK(names, NULL, "HDcalloc");
 
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Large Group Iteration Functionality\n"));
@@ -672,7 +676,7 @@ test_iter_group_large(hid_t fapl)
     ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, liter_cb2, curr_name);
     CHECK(ret, FAIL, "H5Literate");
     for(i = 1; i < 100; i++) {
-        hsize_t idx = i;
+        hsize_t idx = (hsize_t)i;
 
         curr_name = &names[i];
         ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb2, curr_name);
@@ -682,6 +686,9 @@ test_iter_group_large(hid_t fapl)
     /* Close file */
     ret = H5Fclose(file);
     CHECK(ret, FAIL, "H5Fclose");
+
+    /* Release memory */
+    HDfree(names);
 } /* test_iterate_group_large() */
 
 /****************************************************************
diff --git a/test/tlayouto.h5 b/test/tlayouto.h5
index 3322020..a038e68 100644
Binary files a/test/tlayouto.h5 and b/test/tlayouto.h5 differ
diff --git a/test/tmeta.c b/test/tmeta.c
index a7fd688..7eeb493 100644
--- a/test/tmeta.c
+++ b/test/tmeta.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -123,7 +121,7 @@ test_metadata(void)
  *
  *-------------------------------------------------------------------------
  */
-void
+H5_ATTR_PURE H5_ATTR_CONST void
 cleanup_metadata(void)
 {
     /* no file to clean */
diff --git a/test/tmisc.c b/test/tmisc.c
index 011486a..dc69e18 100644
--- a/test/tmisc.c
+++ b/test/tmisc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -466,7 +464,7 @@ static void test_misc2_write_attribute(void)
     CHECK(ret, FAIL, "H5Dvlen_reclaim");
 
     ret = H5Aclose(att1);
-    CHECK(ret, FAIL, "HAclose");
+    CHECK(ret, FAIL, "H5Aclose");
 
     ret = H5Gclose(root1);
     CHECK(ret, FAIL, "H5Gclose");
@@ -492,7 +490,7 @@ static void test_misc2_write_attribute(void)
     CHECK(ret, FAIL, "H5Dvlen_reclaim");
 
     ret = H5Aclose(att2);
-    CHECK(ret, FAIL, "HAclose");
+    CHECK(ret, FAIL, "H5Aclose");
 
     ret = H5Gclose(root2);
     CHECK(ret, FAIL, "H5Gclose");
@@ -1819,8 +1817,9 @@ test_misc11(void)
     unsigned    sym_lk;         /* Symbol table B-tree leaf 'K' value */
     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 */
+    H5F_fspace_strategy_t strategy;  /* File space strategy */
     hsize_t  	threshold;      /* Free-space section threshold */
+    hbool_t	persist;	/* To persist free-space or not */
     herr_t      ret;            /* Generic return value */
 
     /* Output message about test being performed */
@@ -1878,11 +1877,11 @@ 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);
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, FALSE, (hsize_t)1);
     CHECK(ret, FAIL, "H5Pset_file_space");
 
     /* Creating a file with the non-default file creation property list should
-     * create a version 1 superblock
+     * create a version 2 superblock
      */
 
     /* Create file with custom file creation property list */
@@ -1942,10 +1941,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");
+    ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold);
+    CHECK(ret, FAIL, "H5Pget_file_space_strategy");
+    VERIFY(strategy, 3, "H5Pget_file_space_strategy");
+    VERIFY(persist, FALSE, "H5Pget_file_space_strategy");
+    VERIFY(threshold, 1, "H5Pget_file_space_strategy");
 
     /* Close file */
     ret=H5Fclose(file);
@@ -2928,18 +2928,18 @@ test_misc18(void)
         CHECK(aid, FAIL, "H5Acreate2");
 
         ret = H5Aclose(aid);
-        CHECK(ret, FAIL, "HAclose");
+        CHECK(ret, FAIL, "H5Aclose");
 
         /* Create & close attribute on second dataset */
         aid = H5Acreate2(did2, attr_name, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT);
         CHECK(aid, FAIL, "H5Acreate2");
 
         ret = H5Aclose(aid);
-        CHECK(ret, FAIL, "HAclose");
+        CHECK(ret, FAIL, "H5Aclose");
 
         /* Flush file, to 'fix' size of dataset object headers */
         ret = H5Fflush(fid,H5F_SCOPE_GLOBAL);
-        CHECK(ret, FAIL, "HAclose");
+        CHECK(ret, FAIL, "H5Fflush");
     } /* end for */
 
     /* Get object information for dataset #1 now */
diff --git a/test/tmtimen.h5 b/test/tmtimen.h5
index 007a6b6..96e5fb3 100644
Binary files a/test/tmtimen.h5 and b/test/tmtimen.h5 differ
diff --git a/test/tmtimeo.h5 b/test/tmtimeo.h5
index c9dfcc4..8cacf4a 100644
Binary files a/test/tmtimeo.h5 and b/test/tmtimeo.h5 differ
diff --git a/test/trefer.c b/test/trefer.c
index cb0f44e..05c0130 100644
--- a/test/trefer.c
+++ b/test/trefer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -84,8 +82,8 @@ test_reference_params(void)
     int         i;          /* counting variables */
     const char *write_comment = "Foo!"; /* Comments for group */
     hid_t	ret_id;		/* Generic hid_t return value	*/
+    ssize_t     name_size;  /* Size of reference name */
     herr_t      ret;        /* Generic return value     */
-    size_t      name_size;  /* Size of reference name */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Reference Parameters\n"));
@@ -120,7 +118,7 @@ test_reference_params(void)
     CHECK(dataset, FAIL, "H5Dcreate2");
 
     for(tu32 = (unsigned *)wbuf, i = 0; i < SPACE1_DIM1; i++)
-        *tu32++=i*3;
+        *tu32++ = (unsigned)i * 3;
 
     /* Write selection to disk */
     ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
@@ -266,6 +264,7 @@ test_reference_obj(void)
     const char *write_comment="Foo!"; /* Comments for group */
     char read_comment[10];
     H5O_type_t          obj_type;   /* Object type */
+    ssize_t             size;       /* Comment length */
     herr_t		ret;	    /* Generic return value		*/
 
     /* Output message about test being performed */
@@ -301,7 +300,7 @@ test_reference_obj(void)
     CHECK(dataset, FAIL, "H5Dcreate2");
 
     for(tu32 = (unsigned *)wbuf, i = 0; i < SPACE1_DIM1; i++)
-        *tu32++=i*3;
+        *tu32++ = (unsigned)i * 3;
 
     /* Write selection to disk */
     ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
@@ -432,8 +431,8 @@ test_reference_obj(void)
     CHECK(group, FAIL, "H5Rdereference2");
 
     /* Get group's comment */
-    ret = H5Oget_comment(group, read_comment, (size_t)10);
-    CHECK(ret, FAIL, "H5Oget_comment");
+    size = H5Oget_comment(group, read_comment, (size_t)10);
+    CHECK(size, FAIL, "H5Oget_comment");
 
     /* Check for correct comment value */
     if(HDstrcmp(write_comment, read_comment) != 0)
@@ -557,7 +556,7 @@ test_reference_region(void)
     CHECK(dset2, FAIL, "H5Dcreate2");
 
     for(tu8 = dwbuf, i = 0; i < (SPACE2_DIM1 * SPACE2_DIM2); i++)
-        *tu8++ = i * 3;
+        *tu8++ = (uint8_t)(i * 3);
 
     /* Write selection to disk */
     ret = H5Dwrite(dset2, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
@@ -762,7 +761,7 @@ test_reference_region(void)
     VERIFY(ret, 36, "H5Sget_select_npoints");
     ret = (int)H5Sget_select_hyper_nblocks(sid2);
     VERIFY(ret, 1, "H5Sget_select_hyper_nblocks");
-    coords = (hsize_t *)HDmalloc(ret * SPACE2_RANK * sizeof(hsize_t) * 2); /* allocate space for the hyperslab blocks */
+    coords = (hsize_t *)HDmalloc((size_t)ret * SPACE2_RANK * sizeof(hsize_t) * 2); /* allocate space for the hyperslab blocks */
     ret = H5Sget_select_hyper_blocklist(sid2, (hsize_t)0, (hsize_t)ret, coords);
     CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist");
     VERIFY(coords[0], 2, "Hyperslab Coordinates");
@@ -790,7 +789,7 @@ test_reference_region(void)
     VERIFY(ret, 10, "H5Sget_select_npoints");
     ret = (int)H5Sget_select_elem_npoints(sid2);
     VERIFY(ret, 10, "H5Sget_select_elem_npoints");
-    coords = (hsize_t *)HDmalloc(ret * SPACE2_RANK * sizeof(hsize_t)); /* allocate space for the element points */
+    coords = (hsize_t *)HDmalloc((size_t)ret * SPACE2_RANK * sizeof(hsize_t)); /* allocate space for the element points */
     ret = H5Sget_select_elem_pointlist(sid2, (hsize_t)0, (hsize_t)ret, coords);
     CHECK(ret, FAIL, "H5Sget_select_elem_pointlist");
     VERIFY(coords[0], coord1[0][0], "Element Coordinates");
@@ -945,7 +944,7 @@ test_reference_region_1D(void)
     CHECK(dset3, FAIL, "H5Dcreate2");
 
     for(tu8 = dwbuf, i = 0; i < SPACE3_DIM1; i++)
-        *tu8++ = i * 3;
+        *tu8++ = (uint8_t)(i * 3);
 
     /* Write selection to disk */
     ret = H5Dwrite(dset3, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
@@ -1068,7 +1067,7 @@ test_reference_region_1D(void)
     VERIFY(ret, 30, "H5Sget_select_npoints");
     ret = (int)H5Sget_select_hyper_nblocks(sid3);
     VERIFY(ret, 15, "H5Sget_select_hyper_nblocks");
-    coords = (hsize_t *)HDmalloc(ret * SPACE3_RANK * sizeof(hsize_t) * 2); /* allocate space for the hyperslab blocks */
+    coords = (hsize_t *)HDmalloc((size_t)ret * SPACE3_RANK * sizeof(hsize_t) * 2); /* allocate space for the hyperslab blocks */
     ret = H5Sget_select_hyper_blocklist(sid3, (hsize_t)0, (hsize_t)ret, coords);
     CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist");
     VERIFY(coords[0],   2, "Hyperslab Coordinates");
@@ -1120,7 +1119,7 @@ test_reference_region_1D(void)
     VERIFY(ret, 10, "H5Sget_select_npoints");
     ret = (int)H5Sget_select_elem_npoints(sid3);
     VERIFY(ret, 10, "H5Sget_select_elem_npoints");
-    coords = (hsize_t *)HDmalloc(ret * SPACE3_RANK * sizeof(hsize_t)); /* allocate space for the element points */
+    coords = (hsize_t *)HDmalloc((size_t)ret * SPACE3_RANK * sizeof(hsize_t)); /* allocate space for the element points */
     ret = H5Sget_select_elem_pointlist(sid3, (hsize_t)0, (hsize_t)ret, coords);
     CHECK(ret, FAIL, "H5Sget_select_elem_pointlist");
     VERIFY(coords[0], coord1[0][0], "Element Coordinates");
@@ -1329,6 +1328,7 @@ test_reference_group(void)
     char objname[NAME_SIZE];    /* Buffer to store name */
     H5O_info_t oinfo;           /* Object info struct */
     int count = 0;              /* Count within iterated group */
+    ssize_t size;               /* Name length */
     herr_t ret;
 
     /* Create file with a group and a dataset containing an object reference to the group */
@@ -1409,8 +1409,8 @@ test_reference_group(void)
     CHECK(ret, FAIL, "H5Gget_info");
     VERIFY(ginfo.nlinks, 3, "H5Gget_info");
 
-    ret = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, objname, (size_t)NAME_SIZE, H5P_DEFAULT);
-    CHECK(ret, FAIL, "H5Lget_name_by_idx");
+    size = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, objname, (size_t)NAME_SIZE, H5P_DEFAULT);
+    CHECK(size, FAIL, "H5Lget_name_by_idx");
     VERIFY_STR(objname, DSETNAME2, "H5Lget_name_by_idx");
 
     ret = H5Oget_info_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, &oinfo, H5P_DEFAULT);
diff --git a/test/trefstr.c b/test/trefstr.c
index dd76cc1..40ce344 100644
--- a/test/trefstr.c
+++ b/test/trefstr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/tselect.c b/test/tselect.c
index 670406d..85c21bb 100644
--- a/test/tselect.c
+++ b/test/tselect.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -720,7 +718,7 @@ test_select_all(hid_t xfer_plist)
     for(i=0, tbuf=wbuf; i<SPACE4_DIM1; i++)
         for(j=0; j<SPACE4_DIM2; j++)
             for(k=0; k<SPACE4_DIM3; k++)
-                *tbuf++ = (uint8_t)(((i * SPACE4_DIM2) + j) * SPACE4_DIM3) + k;
+                *tbuf++ = (uint8_t)((((i * SPACE4_DIM2) + j) * SPACE4_DIM3) + k);
 
     /* Create file */
     fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
@@ -2630,7 +2628,7 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
 **	a selected or an unselected checker.
 **
 ****************************************************************/
-static hbool_t
+H5_ATTR_PURE static hbool_t
 test_select_hyper_checker_board_dr__verify_data(uint16_t * buf_ptr,
     unsigned rank, unsigned edge_size, unsigned checker_edge_size,
     uint16_t first_expected_val, hbool_t buf_starts_in_checker)
@@ -7188,8 +7186,8 @@ test_select_fill_point(hssize_t *offset)
 
     /* Add in the offset */
     for(u = 0; u < (unsigned)num_points; u++) {
-        points[u][0] = (hsize_t)(points[u][0] + real_offset[0]);
-        points[u][1] = (hsize_t)(points[u][1] + real_offset[1]);
+        points[u][0] = (hsize_t)((hssize_t)points[u][0] + real_offset[0]);
+        points[u][1] = (hsize_t)((hssize_t)points[u][1] + real_offset[1]);
     } /* end for */
 
     /* Iterate through selection, verifying correct data */
@@ -7269,8 +7267,8 @@ test_select_fill_hyper_simple(hssize_t *offset)
     /* Verify memory buffer the hard way... */
     for(u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++)
         for(v = 0; v < SPACE7_DIM2; v++, tbuf++) {
-            if((u >= (unsigned)(start[0] + real_offset[0]) && u < (unsigned)(start[0] + count[0] + real_offset[0]))
-                && (v >= (unsigned)(start[1] + real_offset[1]) && v < (unsigned)(start[1] + count[1] + real_offset[1]))) {
+            if((u >= (unsigned)((hssize_t)start[0] + real_offset[0]) && u < (unsigned)((hssize_t)(start[0] + count[0]) + real_offset[0]))
+                && (v >= (unsigned)((hssize_t)start[1] + real_offset[1]) && v < (unsigned)((hssize_t)(start[1] + count[1]) + real_offset[1]))) {
                     if(*tbuf != (unsigned)fill_value)
                         TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, (unsigned)fill_value);
                 } /* end if */
@@ -7288,8 +7286,8 @@ test_select_fill_hyper_simple(hssize_t *offset)
     /* Set the coordinates of the selection (with the offset) */
     for(u = 0, num_points = 0; u < (unsigned)count[0]; u++)
         for(v = 0; v < (unsigned)count[1]; v++, num_points++) {
-            points[num_points][0] = (hsize_t)(u + start[0] + real_offset[0]);
-            points[num_points][1] = (hsize_t)(v + start[1] + real_offset[1]);
+            points[num_points][0] = (hsize_t)((hssize_t)(u + start[0]) + real_offset[0]);
+            points[num_points][1] = (hsize_t)((hssize_t)(v + start[1]) + real_offset[1]);
         } /* end for */
 
     /* Iterate through selection, verifying correct data */
@@ -7379,7 +7377,7 @@ test_select_fill_hyper_regular(hssize_t *offset)
     for(u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++)
         for(v = 0; v < SPACE7_DIM2; v++, tbuf++) {
             for(w = 0; w < (unsigned)num_points; w++) {
-                if(u == (unsigned)(points[w][0] + real_offset[0]) && v == (unsigned)(points[w][1] + real_offset[1])) {
+                if(u == (unsigned)((hssize_t)points[w][0] + real_offset[0]) && v == (unsigned)((hssize_t)points[w][1] + real_offset[1])) {
                     if(*tbuf != (unsigned)fill_value)
                         TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, (unsigned)fill_value);
                     break;
@@ -7396,8 +7394,8 @@ test_select_fill_hyper_regular(hssize_t *offset)
 
     /* Add in the offset */
     for(u = 0; u < (unsigned)num_points; u++) {
-        points[u][0] = (hsize_t)(points[u][0] + real_offset[0]);
-        points[u][1] = (hsize_t)(points[u][1] + real_offset[1]);
+        points[u][0] = (hsize_t)((hssize_t)points[u][0] + real_offset[0]);
+        points[u][1] = (hsize_t)((hssize_t)points[u][1] + real_offset[1]);
     } /* end for */
 
     /* Iterate through selection, verifying correct data */
@@ -7502,7 +7500,7 @@ test_select_fill_hyper_irregular(hssize_t *offset)
     for(u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++)
         for(v = 0; v < SPACE7_DIM2; v++, tbuf++) {
             for(w = 0; w < (unsigned)num_points; w++) {
-                if(u == (unsigned)(points[w][0] + real_offset[0]) && v == (unsigned)(points[w][1] + real_offset[1])) {
+                if(u == (unsigned)((hssize_t)points[w][0] + real_offset[0]) && v == (unsigned)((hssize_t)points[w][1] + real_offset[1])) {
                     if(*tbuf != (unsigned)fill_value)
                         TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, (unsigned)fill_value);
                     break;
@@ -7519,8 +7517,8 @@ test_select_fill_hyper_irregular(hssize_t *offset)
 
     /* Add in the offset */
     for(u = 0; u < (unsigned)num_iter_points; u++) {
-        iter_points[u][0] = (hsize_t)(iter_points[u][0] + real_offset[0]);
-        iter_points[u][1] = (hsize_t)(iter_points[u][1] + real_offset[1]);
+        iter_points[u][0] = (hsize_t)((hssize_t)iter_points[u][0] + real_offset[0]);
+        iter_points[u][1] = (hsize_t)((hssize_t)iter_points[u][1] + real_offset[1]);
     } /* end for */
 
     /* Iterate through selection, verifying correct data */
@@ -13652,9 +13650,9 @@ test_hyper_unlim(void)
     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[0], (long)(start[0] + (stride[0] * (count[0] - 1)) + block[0] - 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");
+    VERIFY(count2[2], (long)(start[2] + (stride[2] * (count[2] - 1)) + block[2] - 1), "H5Sget_select_bounds");
 
     /* Close the dataspace */
     ret = H5Sclose(sid);
diff --git a/test/tskiplist.c b/test/tskiplist.c
index 62c5f8e..b9b00df 100644
--- a/test/tskiplist.c
+++ b/test/tskiplist.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -31,9 +29,6 @@
        11/15/04 - Started coding
  */
 
-#include <time.h>
-#include <stdlib.h>
-
 #include "testhdf5.h"
 #include "H5SLprivate.h"
 
@@ -41,9 +36,9 @@
 #define NUM_ELEMS       1000
 
 /* Random numbers */
-static int rand_num[NUM_ELEMS];
-static int sort_rand_num[NUM_ELEMS];
-static int rev_sort_rand_num[NUM_ELEMS];
+static int *rand_num;
+static int *sort_rand_num;
+static int *rev_sort_rand_num;
 
 static int tst_sort(const void *i1, const void *i2)
 {
@@ -69,23 +64,31 @@ test_skiplist_init(void)
     unsigned found;     /* Flag to indicate value was inserted already */
     size_t u,v;         /* Local index variables */
 
+    /* Allocate arrays */
+    rand_num = (int *)HDmalloc(sizeof(int) * NUM_ELEMS);
+    CHECK(rand_num, NULL, "HDmalloc");
+    sort_rand_num = (int *)HDmalloc(sizeof(int) * NUM_ELEMS);
+    CHECK(sort_rand_num, NULL, "HDmalloc");
+    rev_sort_rand_num = (int *)HDmalloc(sizeof(int) * NUM_ELEMS);
+    CHECK(rev_sort_rand_num, NULL, "HDmalloc");
+
     /* Initialize random number seed */
     curr_time = HDtime(NULL);
     HDsrandom((unsigned)curr_time);
 
     /* Create randomized set of numbers */
-    for(u=0; u<NUM_ELEMS; u++) {
+    for(u = 0; u < NUM_ELEMS; u++) {
         do {
             /* Reset flag */
-            found=0;
+            found = 0;
 
             /* Generate random numbers from -5000 to 5000 */
-            new_val=(int)(HDrandom()%10001)-5001;
+            new_val = (int)(HDrandom() % 10001) - 5001;
 
             /* Check if the value is already in the array */
-            for(v=0; v<u; v++)
-                if(rand_num[v]==new_val)
-                    found=1;
+            for(v = 0; v < u; v++)
+                if(rand_num[v] == new_val)
+                    found = 1;
         } while(found);
 
         /* Set unique value in array */
@@ -93,7 +96,7 @@ test_skiplist_init(void)
     } /* end for */
 
     /* Copy random values to sorted array */
-    HDmemcpy(sort_rand_num,rand_num,sizeof(int)*NUM_ELEMS);
+    HDmemcpy(sort_rand_num, rand_num, sizeof(int) * NUM_ELEMS);
 
     /* Sort random numbers */
     HDqsort(sort_rand_num, (size_t)NUM_ELEMS, sizeof(int), tst_sort);
@@ -103,7 +106,7 @@ test_skiplist_init(void)
 
     /* Sort random numbers */
     HDqsort(rev_sort_rand_num, (size_t)NUM_ELEMS, sizeof(int), tst_rev_sort);
-} /* end test_tst_init() */
+} /* end test_skiplist_init() */
 
 /****************************************************************
 **
@@ -1749,6 +1752,24 @@ test_skiplist_remove_first_many(void)
 
 /****************************************************************
 **
+**  test_skiplist_term(): Test H5SL (skiplist) code.
+**      Release data for skip list testing
+**
+****************************************************************/
+static void
+test_skiplist_term(void)
+{
+    /* Release arrays */
+    if(rand_num)
+        HDfree(rand_num);
+    if(sort_rand_num)
+        HDfree(sort_rand_num);
+    if(rev_sort_rand_num)
+        HDfree(rev_sort_rand_num);
+} /* end test_skiplist_term() */
+
+/****************************************************************
+**
 **  test_skiplist(): Main H5SL testing routine.
 **
 ****************************************************************/
@@ -1787,5 +1808,8 @@ test_skiplist(void)
     test_skiplist_remove_first();   /* Test 'remove first' operation */
     test_skiplist_remove_first_many();  /* Test 'remove first' operation on large skip lists */
 
+    /* Release skip list testing data */
+    test_skiplist_term();
+
 }   /* end test_skiplist() */
 
diff --git a/test/tsohm.c b/test/tsohm.c
index b3ffac7..133b196 100644
--- a/test/tsohm.c
+++ b/test/tsohm.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -1681,8 +1679,8 @@ size2_helper(hid_t fcpl_id, int test_file_closing, size2_helper_struct *ret_size
 
     for(x = 0; x < NUM_ATTRIBUTES; ++x) {
         /* Create a unique name and value for each attribute */
-        attr_string1[0] = attr_name[0] = (x / 10) + '0';
-        attr_string1[1] = attr_name[1] = (x % 10) + '0';
+        attr_string1[0] = attr_name[0] = (char)((x / 10) + '0');
+        attr_string1[1] = attr_name[1] = (char)((x % 10) + '0');
 
         /* Create an attribute on the group */
         attr_id = H5Acreate2(group_id, attr_name, attr_type_id, attr_space_id, H5P_DEFAULT, H5P_DEFAULT);
@@ -1721,8 +1719,8 @@ size2_helper(hid_t fcpl_id, int test_file_closing, size2_helper_struct *ret_size
     for(x=0; x<NUM_ATTRIBUTES; ++x)
     {
         /* Create the same name and value for each attribute as before */
-        attr_string1[0] = attr_name[0] = (x / 10) + '0';
-        attr_string1[1] = attr_name[1] = (x % 10) + '0';
+        attr_string1[0] = attr_name[0] = (char)((x / 10) + '0');
+        attr_string1[1] = attr_name[1] = (char)((x % 10) + '0');
 
         /* Create an attribute on the group */
         attr_id = H5Acreate2(group_id, attr_name, attr_type_id, attr_space_id, H5P_DEFAULT, H5P_DEFAULT);
@@ -1940,8 +1938,8 @@ static void size2_verify(void)
 
     for(x = 0; x < NUM_ATTRIBUTES; ++x) {
         /* Create the name and correct value for each attribute */
-        attr_correct_string[0] = attr_name[0] = (x / 10) + '0';
-        attr_correct_string[1] = attr_name[1] = (x % 10) + '0';
+        attr_correct_string[0] = attr_name[0] = (char)((x / 10) + '0');
+        attr_correct_string[1] = attr_name[1] = (char)((x % 10) + '0');
 
         attr1_id = H5Aopen(group1_id, attr_name, H5P_DEFAULT);
         CHECK_I(attr1_id, "H5Aopen");
@@ -2197,7 +2195,7 @@ static void test_sohm_size2(int close_reopen)
     /* The files with indexes shouldn't be that much bigger than an
      * empty file.
      */
-    if(list_index_med.empty_size > norm_sizes.empty_size * OVERHEAD_ALLOWED)
+    if(list_index_med.empty_size > (h5_stat_size_t)((float)norm_sizes.empty_size * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
 
 
@@ -2258,7 +2256,7 @@ static void test_sohm_size2(int close_reopen)
      */
     if(list_index_med.dsets2 >= btree_index.dsets2)
         VERIFY(list_index_med.dsets2, 1, "h5_get_file_size");
-    if(btree_index.dsets2 > list_index_small.dsets2 * OVERHEAD_ALLOWED)
+    if(btree_index.dsets2 > (h5_stat_size_t)((float)list_index_small.dsets2 * OVERHEAD_ALLOWED))
         VERIFY(btree_index.dsets2, list_index_small.dsets2, "h5_get_file_size");
     if(list_index_small.dsets2 >= norm_sizes.dsets2)
         VERIFY(btree_index.dsets2, 1, "h5_get_file_size");
@@ -2267,7 +2265,7 @@ static void test_sohm_size2(int close_reopen)
      * It seems that the small lists tends to be pretty big anyway.  Allow
      * for it to have twice as much overhead.
      */
-    if(list_index_small.dsets2 > btree_index.dsets2 * OVERHEAD_ALLOWED * OVERHEAD_ALLOWED)
+    if(list_index_small.dsets2 > (h5_stat_size_t)((float)btree_index.dsets2 * OVERHEAD_ALLOWED * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
     /* The lists should have grown the least since they share messages and
      * have no extra overhead.  The normal file should have grown more than
@@ -2291,7 +2289,7 @@ static void test_sohm_size2(int close_reopen)
      */
     if(list_index_med.interleaved >= btree_index.interleaved)
         VERIFY(0, 1, "h5_get_file_size");
-    if(btree_index.interleaved > list_index_small.interleaved * OVERHEAD_ALLOWED)
+    if(btree_index.interleaved > (h5_stat_size_t)((float)list_index_small.interleaved * OVERHEAD_ALLOWED))
         VERIFY(btree_index.interleaved, list_index_small.interleaved, "h5_get_file_size");
     if(list_index_small.interleaved >= norm_sizes.interleaved)
         VERIFY(0, 1, "h5_get_file_size");
@@ -2318,22 +2316,21 @@ static void test_sohm_size2(int close_reopen)
      * that started as a B-tree.
      * Add in OVERHEAD_ALLOWED as a fudge factor here, since the allocation
      * of file space can be hard to predict.
-
      */
-    if(btree_index.attrs1 > list_index_small.attrs1 * OVERHEAD_ALLOWED)
+    if(btree_index.attrs1 > (h5_stat_size_t)((float)list_index_small.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(btree_index.attrs1, list_index_small.attrs1, "h5_get_file_size");
-    if(btree_index.attrs1 > list_index_med.attrs1 * OVERHEAD_ALLOWED)
+    if(btree_index.attrs1 > (h5_stat_size_t)((float)list_index_med.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
-    if(list_index_med.attrs1 > btree_index.attrs1 * OVERHEAD_ALLOWED)
+    if(list_index_med.attrs1 > (h5_stat_size_t)((float)btree_index.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
-    if(list_index_small.attrs1 > btree_index.attrs1 * OVERHEAD_ALLOWED)
+    if(list_index_small.attrs1 > (h5_stat_size_t)((float)btree_index.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
     /* Neither of the converted lists should be too much bigger than
      * the index that was originally a B-tree.
      */
-    if(list_index_small.attrs1 > btree_index.attrs1 * OVERHEAD_ALLOWED)
+    if(list_index_small.attrs1 > (h5_stat_size_t)((float)btree_index.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
-    if(list_index_med.attrs1 > btree_index.attrs1 * OVERHEAD_ALLOWED)
+    if(list_index_med.attrs1 > (h5_stat_size_t)((float)btree_index.attrs1 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
     /* The "normal" file should have had less overhead, so should gain less
      * size than any of the other indexes since none of these attribute
@@ -2349,7 +2346,7 @@ static void test_sohm_size2(int close_reopen)
 
     /* Give it some overhead (for checkin to move messages into continuation message) */
     if((list_index_small.attrs1 - list_index_small.interleaved) >
-            ((btree_index.attrs1 - btree_index.interleaved) * OVERHEAD_ALLOWED))
+            (h5_stat_size_t)((float)(btree_index.attrs1 - btree_index.interleaved) * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
 
 
@@ -2357,13 +2354,13 @@ static void test_sohm_size2(int close_reopen)
      * of sizes.  The big list index is still too big to be smaller than a
      * normal file.  The B-tree indexes should all be about the same size.
      */
-    if(btree_index.attrs2 > list_index_small.attrs2 * OVERHEAD_ALLOWED)
+    if(btree_index.attrs2 > (h5_stat_size_t)((float)list_index_small.attrs2 * OVERHEAD_ALLOWED))
         VERIFY(btree_index.attrs2, list_index_small.attrs2, "h5_get_file_size");
-    if(list_index_small.attrs2 > btree_index.attrs2 * OVERHEAD_ALLOWED)
+    if(list_index_small.attrs2 > (h5_stat_size_t)((float)btree_index.attrs2 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
-    if(btree_index.attrs2 > list_index_med.attrs2 * OVERHEAD_ALLOWED)
+    if(btree_index.attrs2 > (h5_stat_size_t)((float)list_index_med.attrs2 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
-    if(list_index_med.attrs2 > btree_index.attrs2 * OVERHEAD_ALLOWED)
+    if(list_index_med.attrs2 > (h5_stat_size_t)((float)btree_index.attrs2 * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
     if(list_index_med.attrs2 >= norm_sizes.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
@@ -2451,17 +2448,17 @@ static void test_sohm_size2(int close_reopen)
         VERIFY((mult_index_btree.dsets1 - mult_index_btree.second_dset), (btree_index.dsets1 - btree_index.second_dset), "h5_get_file_size");
 
      if((mult_index_med.dsets2 - mult_index_med.dsets1) >
-            (list_index_med.dsets2 - list_index_med.dsets1) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(list_index_med.dsets2 - list_index_med.dsets1) * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
      if((mult_index_btree.dsets2 - mult_index_btree.dsets1) >
-            (btree_index.dsets2 - btree_index.dsets1) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(btree_index.dsets2 - btree_index.dsets1) * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
 
      if((mult_index_med.interleaved - mult_index_med.dsets2) >
-            (list_index_med.interleaved - list_index_med.dsets2) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(list_index_med.interleaved - list_index_med.dsets2) * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
      if((mult_index_btree.interleaved - mult_index_btree.dsets2) >
-            (btree_index.interleaved - btree_index.dsets2) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(btree_index.interleaved - btree_index.dsets2) * OVERHEAD_ALLOWED))
         VERIFY(0, 1, "h5_get_file_size");
 
     /* When all the attributes are added, only the index holding attributes
@@ -2470,10 +2467,10 @@ static void test_sohm_size2(int close_reopen)
      * will take.
      */
      if((mult_index_med.attrs2 - mult_index_med.attrs1) >
-            (list_index_med.attrs2 - list_index_med.attrs1) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(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) * OVERHEAD_ALLOWED)
+            (h5_stat_size_t)((float)(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
@@ -2483,9 +2480,9 @@ static void test_sohm_size2(int close_reopen)
         VERIFY(0, 1, "h5_get_file_size");
      if(mult_index_btree.attrs2 >= norm_sizes.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
-     if(mult_index_med.attrs2 * OVERHEAD_ALLOWED < btree_index.attrs2)
+     if((h5_stat_size_t)((float)mult_index_med.attrs2 * OVERHEAD_ALLOWED) < btree_index.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
-     if(mult_index_btree.attrs2 * OVERHEAD_ALLOWED < btree_index.attrs2)
+     if((h5_stat_size_t)((float)mult_index_btree.attrs2 * OVERHEAD_ALLOWED) < btree_index.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
 
 
@@ -2554,39 +2551,39 @@ static void test_sohm_size2(int close_reopen)
     if(share_tiny_index.empty_size != type_space_index.empty_size)
         VERIFY(share_tiny_index.empty_size, type_space_index.empty_size, "h5_get_file_size");
 
-    if(share_tiny_index.first_dset >= type_space_index.first_dset * OVERHEAD_ALLOWED)
+    if(share_tiny_index.first_dset >= (h5_stat_size_t)((float)type_space_index.first_dset * OVERHEAD_ALLOWED))
         VERIFY(share_tiny_index.first_dset, type_space_index.first_dset, "h5_get_file_size");
     if(share_tiny_index.first_dset < type_space_index.first_dset)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.second_dset >= type_space_index.second_dset)
         VERIFY(share_tiny_index.second_dset, type_space_index.second_dset, "h5_get_file_size");
-    if(share_tiny_index.second_dset * OVERHEAD_ALLOWED < type_space_index.second_dset)
+    if((h5_stat_size_t)((float)share_tiny_index.second_dset * OVERHEAD_ALLOWED) < type_space_index.second_dset)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.dsets1 >= type_space_index.dsets1)
         VERIFY(0, 1, "h5_get_file_size");
-    if(share_tiny_index.dsets1 * OVERHEAD_ALLOWED < type_space_index.dsets1)
+    if((h5_stat_size_t)((float)share_tiny_index.dsets1 * OVERHEAD_ALLOWED) < type_space_index.dsets1)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.dsets2 >= type_space_index.dsets2)
         VERIFY(0, 1, "h5_get_file_size");
-    if(share_tiny_index.dsets2 * OVERHEAD_ALLOWED < type_space_index.dsets2)
+    if((h5_stat_size_t)((float)share_tiny_index.dsets2 * OVERHEAD_ALLOWED) < type_space_index.dsets2)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.interleaved >= type_space_index.interleaved)
         VERIFY(0, 1, "h5_get_file_size");
-    if(share_tiny_index.interleaved * OVERHEAD_ALLOWED < type_space_index.interleaved)
+    if((h5_stat_size_t)((float)share_tiny_index.interleaved * OVERHEAD_ALLOWED) < type_space_index.interleaved)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.attrs1 >= type_space_index.attrs1)
         VERIFY(0, 1, "h5_get_file_size");
-    if(share_tiny_index.attrs1 * OVERHEAD_ALLOWED < type_space_index.attrs1)
+    if((h5_stat_size_t)((float)share_tiny_index.attrs1 * OVERHEAD_ALLOWED) < type_space_index.attrs1)
         VERIFY(0, 1, "h5_get_file_size");
 
     if(share_tiny_index.attrs2 >= type_space_index.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
-    if(share_tiny_index.attrs2 * OVERHEAD_ALLOWED < type_space_index.attrs2)
+    if((h5_stat_size_t)((float)share_tiny_index.attrs2 * OVERHEAD_ALLOWED) < type_space_index.attrs2)
         VERIFY(0, 1, "h5_get_file_size");
 } /* end test_sohm_size2() */
 
@@ -2616,7 +2613,7 @@ static void delete_helper_write(hid_t file_id, hid_t *dspace_id, hid_t *dcpl_id,
     CHECK_I(dset_id, "H5Dcreate2");
 
     /* Write data to dataset */
-    wdata = x + 'a';
+    wdata = (char)(x + 'a');
     ret = H5Dwrite(dset_id, H5T_NATIVE_CHAR, dspace_id[x], dspace_id[x], H5P_DEFAULT, &wdata);
     CHECK_I(ret, "H5Dwrite");
 
@@ -2764,9 +2761,9 @@ static void delete_helper(hid_t fcpl_id, hid_t *dspace_id, hid_t *dcpl_id)
     deleted_filesize = h5_get_file_size(FILENAME, H5P_DEFAULT);
 
     /* The two filesizes should be almost the same */
-    if(norm_filesize > deleted_filesize * OVERHEAD_ALLOWED)
+    if(norm_filesize > (h5_stat_size_t)((float)deleted_filesize * OVERHEAD_ALLOWED))
         VERIFY(norm_filesize, deleted_filesize, "h5_get_file_size");
-    if(deleted_filesize > norm_filesize * OVERHEAD_ALLOWED)
+    if(deleted_filesize > (h5_stat_size_t)((float)norm_filesize * OVERHEAD_ALLOWED))
         VERIFY(deleted_filesize, norm_filesize, "h5_get_file_size");
 }
 
@@ -3887,8 +3884,8 @@ test_sohm_external_dtype(void)
     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;
-        s_ptr->b = i*3 + 2;
+        s_ptr->a = (int)(i * 3 + 1);
+        s_ptr->b = (int)(i * 3 + 2);
     }
 
     /* Write the data to the dataset1 */
diff --git a/test/ttime.c b/test/ttime.c
index 16acd3e..2eb2117 100644
--- a/test/ttime.c
+++ b/test/ttime.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
diff --git a/test/ttsafe.c b/test/ttsafe.c
index d3c5cfb..ae4d7c5 100644
--- a/test/ttsafe.c
+++ b/test/ttsafe.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -45,7 +43,7 @@
 #define NAME_OFFSET 6         /* offset for "name<num>" */
 
 /* pre-condition: num must be a non-negative number */
-static unsigned
+H5_ATTR_PURE static unsigned
 num_digits(int num)
 {
     unsigned u;
@@ -143,6 +141,9 @@ int main(int argc, char *argv[])
     if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP"))
         TestCleanup();
 
+    /* Release test infrastructure */
+    TestShutdown();
+
     return GetTestNumErrs();
 
 } /* end main() */
diff --git a/test/ttsafe.h b/test/ttsafe.h
index f2e9e86..6cf449f 100644
--- a/test/ttsafe.h
+++ b/test/ttsafe.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/test/ttsafe_acreate.c b/test/ttsafe_acreate.c
index dec2eee..42d0851 100644
--- a/test/ttsafe_acreate.c
+++ b/test/ttsafe_acreate.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /********************************************************************
@@ -113,7 +111,7 @@ void tts_acreate(void)
      * with the dataset
      */
     for(i = 0; i < NUM_THREADS; i++) {
-        attrib_data = HDmalloc(sizeof(ttsafe_name_data_t));
+        attrib_data = (ttsafe_name_data_t *)HDmalloc(sizeof(ttsafe_name_data_t));
         attrib_data->dataset = dataset;
         attrib_data->datatype = datatype;
         attrib_data->dataspace = dataspace;
@@ -170,7 +168,7 @@ void *tts_acreate_thread(void *client_data)
                           H5P_DEFAULT, H5P_DEFAULT);
 
     /* Write data to the attribute */
-    attribute_data = HDmalloc(sizeof(int));
+    attribute_data = (int *)HDmalloc(sizeof(int));
     *attribute_data = attrib_data->current_index;
     H5Awrite(attribute, H5T_NATIVE_INT, attribute_data);
     H5Aclose(attribute);
diff --git a/test/ttsafe_cancel.c b/test/ttsafe_cancel.c
index 7f8cd53..4bbb326 100644
--- a/test/ttsafe_cancel.c
+++ b/test/ttsafe_cancel.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /********************************************************************
diff --git a/test/ttsafe_dcreate.c b/test/ttsafe_dcreate.c
index df51f72..65051c7 100644
--- a/test/ttsafe_dcreate.c
+++ b/test/ttsafe_dcreate.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /********************************************************************
diff --git a/test/ttsafe_error.c b/test/ttsafe_error.c
index a2f25db..889d64b 100644
--- a/test/ttsafe_error.c
+++ b/test/ttsafe_error.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /********************************************************************
diff --git a/test/ttst.c b/test/ttst.c
index b869b63..b26d582 100644
--- a/test/ttst.c
+++ b/test/ttst.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -33,9 +31,6 @@
        12/9/02 - Started coding
  */
 
-#include <time.h>
-#include <stdlib.h>
-
 #include "testhdf5.h"
 #include "H5STprivate.h"
 
@@ -126,7 +121,7 @@ test_tst_init(void)
     curr_time=HDtime(NULL);
     HDsrandom((unsigned)curr_time);
     for(u=0; u<num_uniq_words; u++) {
-        v=u+(HDrandom()%(num_uniq_words-u));
+        v = u + ((size_t)HDrandom() % (num_uniq_words - u));
         if(u!=v) {
             tmp_word=rand_uniq_words[u];
             rand_uniq_words[u]=rand_uniq_words[v];
diff --git a/test/tunicode.c b/test/tunicode.c
index 93c00c5..85f5af0 100644
--- a/test/tunicode.c
+++ b/test/tunicode.c
@@ -5,19 +5,13 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* Unicode test */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
 #include "testhdf5.h"
 
 #define NUM_CHARS 16
@@ -388,6 +382,7 @@ void test_objnames(hid_t fid, const char* string)
   char path_buf[MAX_PATH_LENGTH];
   hsize_t dims=1;
   hobj_ref_t obj_ref;
+  ssize_t size;
   herr_t ret;
 
   /* Create a group with a UTF-8 name */
@@ -399,8 +394,8 @@ void test_objnames(hid_t fid, const char* string)
    */
   ret = H5Oset_comment_by_name(fid, string, string, H5P_DEFAULT);
   CHECK(ret, FAIL, "H5Oset_comment_by_name");
-  ret = H5Oget_comment_by_name(fid, string, read_buf, (size_t)MAX_STRING_LENGTH, H5P_DEFAULT);
-  CHECK(ret, FAIL, "H5Oget_comment_by_name");
+  size = H5Oget_comment_by_name(fid, string, read_buf, (size_t)MAX_STRING_LENGTH, H5P_DEFAULT);
+  CHECK(size, FAIL, "H5Oget_comment_by_name");
 
   ret = H5Gclose(grp_id);
   CHECK(ret, FAIL, "H5Gclose");
@@ -514,6 +509,7 @@ void test_attrname(hid_t fid, const char * string)
   hid_t dtype_id, space_id;
   hsize_t dims=1;
   char read_buf[MAX_STRING_LENGTH];
+  ssize_t size;
   herr_t ret;
 
  /* Create a new group and give it an attribute whose
@@ -532,8 +528,8 @@ void test_attrname(hid_t fid, const char * string)
   /* Create the attribute and check that its name is correct */
   attr_id = H5Acreate2(group_id, string, dtype_id, space_id, H5P_DEFAULT, H5P_DEFAULT);
   CHECK(attr_id, FAIL, "H5Acreate2");
-  ret = H5Aget_name(attr_id, (size_t)MAX_STRING_LENGTH, read_buf);
-  CHECK(ret, FAIL, "H5Aget_name");
+  size = H5Aget_name(attr_id, (size_t)MAX_STRING_LENGTH, read_buf);
+  CHECK(size, FAIL, "H5Aget_name");
   ret = strcmp(read_buf, string);
   VERIFY(ret, 0, "strcmp");
   read_buf[0] = '\0';
@@ -744,25 +740,25 @@ static hid_t mkstr(size_t len, H5T_str_t strpad)
 unsigned int write_char(unsigned int c, char * test_string, unsigned int cur_pos)
 {
   if (c < 0x80) {
-    test_string[cur_pos] = c;
+    test_string[cur_pos] = (char)c;
     cur_pos++;
   }
   else if (c < 0x800) {
-    test_string[cur_pos] = (0xC0 | c>>6);
-    test_string[cur_pos+1] = (0x80 | (c & 0x3F));
+    test_string[cur_pos] = (char)(0xC0 | c >> 6);
+    test_string[cur_pos + 1] = (char)(0x80 | (c & 0x3F));
     cur_pos += 2;
   }
   else if (c < 0x10000) {
-    test_string[cur_pos] = (0xE0 | c>>12);
-    test_string[cur_pos+1] = (0x80 | (c>>6 & 0x3F));
-    test_string[cur_pos+2] = (0x80 | (c & 0x3F));
+    test_string[cur_pos] = (char)(0xE0 | c >> 12);
+    test_string[cur_pos + 1] = (char)(0x80 | (c >> 6 & 0x3F));
+    test_string[cur_pos + 2] = (char)(0x80 | (c & 0x3F));
     cur_pos += 3;
   }
   else if (c < 0x200000) {
-    test_string[cur_pos] = (0xF0 | c>>18);
-    test_string[cur_pos+1] = (0x80 | (c>>12 & 0x3F));
-    test_string[cur_pos+2] = (0x80 | (c>>6 & 0x3F));
-    test_string[cur_pos+3] = (0x80 | (c & 0x3F));
+    test_string[cur_pos] = (char)(0xF0 | c >> 18);
+    test_string[cur_pos + 1] = (char)(0x80 | (c >> 12 & 0x3F));
+    test_string[cur_pos + 2] = (char)(0x80 | (c >> 6 & 0x3F));
+    test_string[cur_pos + 3] = (char)(0x80 | (c & 0x3F));
     cur_pos += 4;
   }
 
@@ -775,13 +771,13 @@ unsigned int write_char(unsigned int c, char * test_string, unsigned int cur_pos
  * could confuse printf (e.g., '\n'). */
 void dump_string(const char * string)
 {
-  unsigned int length;
-  unsigned int x;
+  size_t length;
+  size_t x;
 
   printf("The string was:\n %s", string);
   printf("Or in hex:\n");
 
-  length = strlen(string);
+  length = HDstrlen(string);
 
   for(x=0; x<length; x++)
     printf("%x ", string[x] & (0x000000FF));
@@ -814,7 +810,7 @@ void test_unicode(void)
     /* We need to avoid unprintable characters (codes 0-31) and the
      * . and / characters, since they aren't allowed in path names.
      */
-    unicode_point = (HDrandom() % (MAX_CODE_POINT-32)) + 32;
+    unicode_point = (unsigned)(HDrandom() % (MAX_CODE_POINT-32)) + 32;
     if(unicode_point != 46 && unicode_point != 47)
       cur_pos = write_char(unicode_point, test_string, cur_pos);
   }
diff --git a/test/tvlstr.c b/test/tvlstr.c
index dbc3083..7b520f2 100644
--- a/test/tvlstr.c
+++ b/test/tvlstr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
diff --git a/test/tvltypes.c b/test/tvltypes.c
index b7bbaee..5121a66 100644
--- a/test/tvltypes.c
+++ b/test/tvltypes.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -169,7 +167,7 @@ static void
 test_vltypes_funcs(void)
 {
     hid_t               type;       /* Datatype ID          */
-    int                 size;
+    size_t              size;
     H5T_pad_t           inpad;
     H5T_norm_t          norm;
     H5T_cset_t          cset;
@@ -183,16 +181,16 @@ test_vltypes_funcs(void)
     type = H5Tvlen_create (H5T_IEEE_F32BE);
     CHECK(type, FAIL, "H5Tvlen_create");
 
-    size=H5Tget_precision(type);
-    CHECK(size, FAIL, "H5Tget_precision");
+    size = H5Tget_precision(type);
+    CHECK(size, 0, "H5Tget_precision");
 
-    size=H5Tget_size(type);
-    CHECK(size, FAIL, "H5Tget_size");
+    size = H5Tget_size(type);
+    CHECK(size, 0, "H5Tget_size");
 
-    size=H5Tget_ebias(type);
-    CHECK(size, FAIL, "H5Tget_ebias");
+    size = H5Tget_ebias(type);
+    CHECK(size, 0, "H5Tget_ebias");
 
-    ret=H5Tset_pad(type, H5T_PAD_ZERO, H5T_PAD_ONE);
+    ret = H5Tset_pad(type, H5T_PAD_ZERO, H5T_PAD_ONE);
     CHECK(ret, FAIL, "H5Tset_pad");
 
     inpad = H5Tget_inpad(type);
@@ -558,7 +556,7 @@ rewrite_vltypes_vlen_atomic(void)
     hsize_t     size;       /* Number of bytes which will be used */
     unsigned       i,j;        /* counting variables */
     size_t         mem_used=0; /* Memory used during allocation */
-    int			increment=4;
+    unsigned	increment=4;
     herr_t              ret;            /* Generic return value         */
 
     /* Output message about test being performed */
@@ -730,8 +728,8 @@ test_vltypes_vlen_compound(void)
         wdata[i].p=HDmalloc((i+1)*sizeof(s1));
         wdata[i].len=i+1;
         for(j=0; j<(i+1); j++) {
-            ((s1 *)wdata[i].p)[j].i=i*10+j;
-            ((s1 *)wdata[i].p)[j].f=(float)((i*20+j)/3.0F);
+            ((s1 *)wdata[i].p)[j].i = (int)(i * 10 + j);
+            ((s1 *)wdata[i].p)[j].f = (float)(i * 20 + j) / 3.0F;
           } /* end for */
     } /* end for */
 
@@ -865,7 +863,7 @@ rewrite_vltypes_vlen_compound(void)
     hsize_t     size;       /* Number of bytes which will be used */
     unsigned       i,j;        /* counting variables */
     size_t         mem_used=0; /* Memory used during allocation */
-    int 		increment=4;
+    unsigned 	increment=4;
     herr_t              ret;            /* Generic return value         */
 
     /* Output message about test being performed */
@@ -876,8 +874,8 @@ rewrite_vltypes_vlen_compound(void)
         wdata[i].p = HDmalloc((i + increment) * sizeof(s1));
         wdata[i].len = i + increment;
         for(j = 0; j < (i + increment); j++) {
-            ((s1 *)wdata[i].p)[j].i = i * 40 + j;
-            ((s1 *)wdata[i].p)[j].f = (float)((i * 60 + j) / 3.0F);
+            ((s1 *)wdata[i].p)[j].i = (int)(i * 40 + j);
+            ((s1 *)wdata[i].p)[j].f = (float)(i * 60 + j) / 3.0F;
           } /* end for */
     } /* end for */
 
@@ -1001,8 +999,8 @@ test_vltypes_compound_vlen_vlen(void)
         float f;
         hvl_t v;
     } s1;
-    s1 wdata[SPACE3_DIM1];              /* data to write */
-    s1 rdata[SPACE3_DIM1];              /* data to read */
+    s1          *wdata;                 /* data to write */
+    s1          *rdata;                 /* data to read */
     hid_t	fid1;		        /* HDF5 File IDs		*/
     hid_t	dataset;	        /* Dataset ID			*/
     hid_t	sid1;                   /* Dataspace ID			*/
@@ -1016,17 +1014,21 @@ test_vltypes_compound_vlen_vlen(void)
     MESSAGE(5, ("Testing Compound Datatypes with VL Atomic Datatype Component Functionality\n"));
 
     /* Allocate and initialize VL data to write */
-    for(i=0; i<SPACE3_DIM1; i++) {
-        wdata[i].i=i*10;
-        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=(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++)
-                ((unsigned int*)t1->p)[k] = i*100 + j*10 + k;
-        }
+    wdata = (s1 *)HDmalloc(sizeof(s1) * SPACE3_DIM1);
+    CHECK(wdata, NULL, "HDmalloc");
+    rdata = (s1 *)HDmalloc(sizeof(s1) * SPACE3_DIM1);
+    CHECK(rdata, NULL, "HDmalloc");
+    for(i = 0; i < SPACE3_DIM1; i++) {
+        wdata[i].i = (int)(i * 10);
+        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 = (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++)
+                ((unsigned int*)t1->p)[k] = i * 100 + j * 10 + k;
+        } /* end for */
     } /* end for */
 
     /* Create file */
@@ -1147,6 +1149,10 @@ test_vltypes_compound_vlen_vlen(void)
     /* Close file */
     ret = H5Fclose(fid1);
     CHECK(ret, FAIL, "H5Fclose");
+
+    /* Release buffers */
+    HDfree(wdata);
+    HDfree(rdata);
 } /* end test_vltypes_compound_vlen_vlen() */
 
 /****************************************************************
@@ -1477,13 +1483,13 @@ test_vltypes_compound_vlen_atomic(void)
     MESSAGE(5, ("Testing Compound Datatypes with VL Atomic Datatype Component Functionality\n"));
 
     /* Allocate and initialize VL data to write */
-    for(i=0; i<SPACE1_DIM1; i++) {
-        wdata[i].i=i*10;
-        wdata[i].f=(float)((i*20)/3.0F);
-        wdata[i].v.p=HDmalloc((i+1)*sizeof(unsigned int));
-        wdata[i].v.len=i+1;
-        for(j=0; j<(i+1); j++)
-            ((unsigned int *)wdata[i].v.p)[j]=i*10+j;
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        wdata[i].i = (int)(i * 10);
+        wdata[i].f = (float)(i * 20) / 3.0F;
+        wdata[i].v.p = HDmalloc((i + 1)*sizeof(unsigned int));
+        wdata[i].v.len = i + 1;
+        for(j = 0; j < (i + 1); j++)
+            ((unsigned int *)wdata[i].v.p)[j] = i * 10 + j;
     } /* end for */
 
     /* Create file */
@@ -1688,7 +1694,7 @@ rewrite_vltypes_compound_vlen_atomic(void)
     hsize_t     size;       /* Number of bytes which will be used */
     unsigned       i,j;        /* counting variables */
     size_t         mem_used=0; /* Memory used during allocation */
-    int			increment=4;
+    unsigned		increment=4;
     herr_t              ret;            /* Generic return value         */
 
     /* Output message about test being performed */
@@ -1696,8 +1702,8 @@ rewrite_vltypes_compound_vlen_atomic(void)
 
     /* Allocate and initialize VL data to write */
     for(i = 0; i < SPACE1_DIM1; i++) {
-        wdata[i].i = i * 40;
-        wdata[i].f = (float)((i * 50) / 3.0F);
+        wdata[i].i = (int)(i * 40);
+        wdata[i].f = (float)(i * 50) / 3.0F;
         wdata[i].v.p = HDmalloc((i + increment) * sizeof(unsigned int));
         wdata[i].v.len = i + increment;
         for(j = 0; j < (i + increment); j++)
@@ -1960,7 +1966,7 @@ test_vltypes_vlen_vlen_atomic(void)
 
     /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */
     /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */
-    VERIFY(size, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int), "H5Dvlen_get_buf_size");
+    VERIFY(size, (hsize_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), "H5Dvlen_get_buf_size");
 
     /* Read dataset from disk */
     ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata);
@@ -1969,7 +1975,7 @@ test_vltypes_vlen_vlen_atomic(void)
     /* Make certain the correct amount of memory has been used */
     /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */
     /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */
-    VERIFY(mem_used, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int), "H5Dread");
+    VERIFY(mem_used, (size_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), "H5Dread");
 
     /* Compare data read in */
     for(i=0; i<SPACE1_DIM1; i++) {
@@ -2048,7 +2054,7 @@ rewrite_longer_vltypes_vlen_vlen_atomic(void)
     hsize_t     size;       /* Number of bytes which will be used */
     unsigned       i,j,k;      /* counting variables */
     size_t         mem_used=0; /* Memory used during allocation */
-    int			increment=1;
+    unsigned		increment=1;
     herr_t              ret;            /* Generic return value         */
 
     /* Output message about test being performed */
@@ -2224,7 +2230,7 @@ rewrite_shorter_vltypes_vlen_vlen_atomic(void)
     hsize_t     size;       /* Number of bytes which will be used */
     unsigned       i,j,k;      /* counting variables */
     size_t         mem_used=0; /* Memory used during allocation */
-    int                 increment=1;
+    unsigned         increment=1;
     herr_t              ret;            /* Generic return value         */
 
     /* Output message about test being performed */
@@ -2316,7 +2322,7 @@ rewrite_shorter_vltypes_vlen_vlen_atomic(void)
 
     /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */
     /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */
-    VERIFY(size, ((SPACE1_DIM1*(SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int), "H5Dvlen_get_buf_size");
+    VERIFY(size, (hsize_t)(((SPACE1_DIM1*(SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), "H5Dvlen_get_buf_size");
 
     /* Read dataset from disk */
     ret=H5Dread(dataset,tid2,H5S_ALL,H5S_ALL,xfer_pid,rdata);
@@ -2325,7 +2331,7 @@ rewrite_shorter_vltypes_vlen_vlen_atomic(void)
     /* Make certain the correct amount of memory has been used */
     /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */
     /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */
-    VERIFY(mem_used,((SPACE1_DIM1*(SPACE1_DIM1+1))/2)*sizeof(hvl_t)+vlen_size_func((unsigned long)SPACE1_DIM1)*sizeof(unsigned int),"H5Dread");
+    VERIFY(mem_used, (size_t)(((SPACE1_DIM1*(SPACE1_DIM1+1))/2)*sizeof(hvl_t)+vlen_size_func((unsigned long)SPACE1_DIM1)*sizeof(unsigned int)),"H5Dread");
 
     /* Compare data read in */
     for(i=0; i<SPACE1_DIM1; i++) {
@@ -2597,6 +2603,10 @@ test_vltypes_fill_value(void)
                     }
                     break;
 
+                case H5D_VIRTUAL:
+                    assert(0 && "Invalid layout type!");
+                    break;
+
                 case H5D_LAYOUT_ERROR:
                 case H5D_NLAYOUTS:
                 default:
@@ -2700,6 +2710,10 @@ test_vltypes_fill_value(void)
                     dset_elmts = SPACE4_DIM_LARGE;
                     break;
 
+                case H5D_VIRTUAL:
+                    assert(0 && "Invalid layout type!");
+                    break;
+
                 case H5D_LAYOUT_ERROR:
                 case H5D_NLAYOUTS:
                 default:
@@ -2897,6 +2911,10 @@ test_vltypes_fill_value(void)
                     dset_elmts = SPACE4_DIM_LARGE;
                     break;
 
+                case H5D_VIRTUAL:
+                    assert(0 && "Invalid layout type!");
+                    break;
+
                 case H5D_LAYOUT_ERROR:
                 case H5D_NLAYOUTS:
                 default:
diff --git a/test/twriteorder.c b/test/twriteorder.c
index 5b22144..0e1d0d4 100644
--- a/test/twriteorder.c
+++ b/test/twriteorder.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /***********************************************************
@@ -105,15 +103,15 @@ part_t  launch_g;
 void
 usage(const char *prog)
 {
-    HDfprintf(stderr, "usage: %s [OPTIONS]\n", prog);
-    HDfprintf(stderr, "  OPTIONS\n");
-    HDfprintf(stderr, "     -h            Print a usage message and exit\n");
-    HDfprintf(stderr, "     -l w|r        launch writer or reader only. [default: launch both]\n");
-    HDfprintf(stderr, "     -b N          Block size [default: %d]\n", BLOCKSIZE_DFT);
-    HDfprintf(stderr, "     -p N          Partition size [default: %d]\n", PARTITION_DFT);
-    HDfprintf(stderr, "     -n N          Number of linked blocks [default: %d]\n", NLINKEDBLOCKS_DFT);
-    HDfprintf(stderr, "     where N is an integer value\n");
-    HDfprintf(stderr, "\n");
+    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.
@@ -136,25 +134,25 @@ parse_option(int argc, char * const argv[])
 	switch (c) {
 	  case 'h':
 	    usage(progname_g);
-	    HDexit(0);
+	    exit(0);
 	    break;
 	  case 'b':	/* number of planes to write/read */
 	    if ((blocksize_g = atoi(optarg)) <= 0){
-		HDfprintf(stderr, "bad blocksize %s, must be a positive integer\n", optarg);
+		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){
-		HDfprintf(stderr, "bad number of linked blocks %s, must be greater than 1.\n", optarg);
+		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){
-		HDfprintf(stderr, "bad partition size %s, must be a positive integer\n", optarg);
+		fprintf(stderr, "bad partition size %s, must be a positive integer\n", optarg);
 		usage(progname_g);
 		Hgoto_error(-1);
 	    };
@@ -168,7 +166,7 @@ parse_option(int argc, char * const argv[])
 		launch_g = UC_WRITER;
 		break;
 	      default:
-		HDfprintf(stderr, "launch value(%c) should be w or r only.\n", *optarg);
+		fprintf(stderr, "launch value(%c) should be w or r only.\n", *optarg);
 		usage(progname_g);
 		Hgoto_error(-1);
 		break;
@@ -176,19 +174,19 @@ parse_option(int argc, char * const argv[])
 	    printf("launch = %d\n", launch_g);
 	    break;
 	  case '?':
-	    HDfprintf(stderr, "getopt returned '%c'.\n", c);
+	    fprintf(stderr, "getopt returned '%c'.\n", c);
 	    usage(progname_g);
 	    Hgoto_error(-1);
 	  default:
-	    HDfprintf(stderr, "getopt returned unexpected value.\n");
-	    HDfprintf(stderr, "Unexpected value is %d\n", c);
+	    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 ){
-	HDfprintf(stderr, "Blocksize %d should not be bigger than partition size %d\n",
+	fprintf(stderr, "Blocksize %d should not be bigger than partition size %d\n",
 	    blocksize_g, part_size_g);
 	Hgoto_error(-1);                                                                  
     }
@@ -284,7 +282,9 @@ int write_wo_file(void)
     }
 
     /* all writes done. return succeess. */
+#ifdef DEBUG
     printf("wrote %d blocks\n", nlinkedblock_g);
+#endif
     return 0;
 }
 
@@ -329,7 +329,9 @@ int read_wo_file(void)
 #endif
     }
 
+#ifdef DEBUG
     printf("read %d blocks\n", linkedblocks_read);
+#endif
     return 0;
 }
 
@@ -369,7 +371,7 @@ main(int argc, char *argv[])
     if (launch_g != UC_READER){
 	printf("Creating skeleton data file for test...\n");
 	if (create_wo_file() < 0){
-	    HDfprintf(stderr, "***encounter error\n");
+	    fprintf(stderr, "***encounter error\n");
 	    Hgoto_error(1);
 	}else
 	    printf("File created.\n");
@@ -379,12 +381,12 @@ main(int argc, char *argv[])
 
     if (launch_g==UC_READWRITE){
 	/* fork process */
-	if((childpid = HDfork()) < 0) {
-	    HDperror("fork");
+	if((childpid = fork()) < 0) {
+	    perror("fork");
 	    Hgoto_error(1);
 	};
     };
-    mypid = HDgetpid();
+    mypid = getpid();
 
     /* ============= */
     /* launch reader */
@@ -394,12 +396,12 @@ main(int argc, char *argv[])
 	if(0 == childpid) {
 	    printf("%d: launch reader process\n", mypid);
 	    if (read_wo_file() < 0){
-		HDfprintf(stderr, "read_wo_file encountered error\n");
-		HDexit(1);
+		fprintf(stderr, "read_wo_file encountered error\n");
+		exit(1);
 	    }
 	    /* Reader is done. Clean up by removing the data file */
 	    HDremove(DATAFILE);
-	    HDexit(0);
+	    exit(0);
 	}
     }
 
@@ -407,9 +409,11 @@ main(int argc, char *argv[])
     /* launch writer */
     /* ============= */
     /* this process continues to launch the writer */
+#ifdef DEBUG
     printf("%d: continue as the writer process\n", mypid);
+#endif
     if (write_wo_file() < 0){
-	HDfprintf(stderr, "write_wo_file encountered error\n");
+	fprintf(stderr, "write_wo_file encountered error\n");
 	Hgoto_error(1);
     }
 
@@ -417,8 +421,8 @@ main(int argc, char *argv[])
     /* If readwrite, collect exit code of child process */
     /* ================================================ */
     if (launch_g == UC_READWRITE){
-	if ((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0){
-	    HDperror("waitpid");
+	if ((tmppid = waitpid(childpid, &child_status, child_wait_option)) < 0){
+	    perror("waitpid");
 	    Hgoto_error(1);
 	}
 	if (WIFEXITED(child_status)){
diff --git a/test/unlink.c b/test/unlink.c
index 7169365..f5754f8 100644
--- a/test/unlink.c
+++ b/test/unlink.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -25,7 +23,6 @@
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5G_TESTING
 
-#include <time.h>
 #include "h5test.h"
 #include "H5Gpkg.h"		/* Groups				*/
 
@@ -2441,9 +2438,9 @@ int
 main(void)
 {
     hid_t	fapl, fapl2, file;
-    int	nerrors = 0;
+    int		nerrors = 0;
     char	filename[1024];
-    unsigned new_format;
+    unsigned	new_format;
 
     /* Metadata cache parameters */
     int mdc_nelmts;
@@ -2554,7 +2551,7 @@ main(void)
 
     if (nerrors) {
         printf("***** %d FAILURE%s! *****\n", nerrors, 1==nerrors?"":"S");
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     puts("All unlink tests passed.");
diff --git a/test/unregister.c b/test/unregister.c
index be40383..a4bf24e 100644
--- a/test/unregister.c
+++ b/test/unregister.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5. The full HDF5 copyright notice, including      *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at 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.            *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /*
  * Programmer:	Raymond Lu
@@ -218,9 +216,9 @@ error:
  *
  * Purpose:	Tests unregistering filter with H5Zunregister
  *
- * Return:	Success:	exit(0)
+ * Return:	Success:	exit(EXIT_SUCCESS)
  *
- *		Failure:	exit(1)
+ *		Failure:	exit(EXIT_FAILURE)
  *
  * Programmer:	Raymond Lu
  *              11 April 2013
diff --git a/test/use.h b/test/use.h
index a207e26..0885cc5 100644
--- a/test/use.h
+++ b/test/use.h
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -36,16 +34,17 @@ typedef enum part_t {
     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 chunksize;		/* chunks are chunksize^2 planes	*/
+    hsize_t 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 		*/
+    hbool_t use_swmr;           /* use swmr open (1) or not 		*/
     int iterations;		/* iterations, default 1		*/
 } options_t;
 
@@ -61,3 +60,4 @@ 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
index 1dd76c9..005eb51 100644
--- a/test/use_append_chunk.c
+++ b/test/use_append_chunk.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -82,26 +80,26 @@ 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.use_swmr = TRUE;	/* use swmr open */
     UC_opts.iterations = 1;
     UC_opts.chunkplanes = 1;
 
     /* parse options */
-    if (parse_option(argc, argv) < 0){
+    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;
+    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;
+    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;
+        UC_opts.nplanes = (hsize_t)UC_opts.chunksize;
 
     /* show parameters and return */
     show_parameters();
@@ -125,7 +123,7 @@ main(int argc, char *argv[])
     int child_wait_option=0;
     int ret_value = 0;
     int child_ret_value;
-    hbool_t send_wait = 0;
+    hbool_t send_wait = FALSE;
 
     /* initialization */
     if (setup_parameters(argc, argv) < 0){
@@ -135,7 +133,7 @@ main(int argc, char *argv[])
     /* Determine the need to send/wait message file*/
     if(UC_opts.launch == UC_READWRITE) {
         HDunlink(WRITER_MESSAGE);
-        send_wait = 1;
+        send_wait = TRUE;
     }
 
     /* ==============================================================*/
@@ -157,12 +155,12 @@ main(int argc, char *argv[])
 
     if (UC_opts.launch==UC_READWRITE){
 	/* fork process */
-	if((childpid = fork()) < 0) {
-	    perror("fork");
+	if((childpid = HDfork()) < 0) {
+	    HDperror("fork");
 	    Hgoto_error(1);
 	};
     };
-    mypid = getpid();
+    mypid = HDgetpid();
 
     /* ============= */
     /* launch reader */
@@ -193,8 +191,8 @@ main(int argc, char *argv[])
     /* 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");
+	if ((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0){
+	    HDperror("waitpid");
 	    Hgoto_error(1);
 	}
 	if (WIFEXITED(child_status)){
diff --git a/test/use_append_mchunks.c b/test/use_append_mchunks.c
index 7728225..9ee37cb 100644
--- a/test/use_append_mchunks.c
+++ b/test/use_append_mchunks.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -84,17 +82,17 @@ int setup_parameters(int argc, char * const argv[])
 	return(-1);
     }
     /* set chunk dims */
-    UC_opts.chunkdims[0] = UC_opts.chunkplanes;
-    UC_opts.chunkdims[1]=UC_opts.chunkdims[2]=UC_opts.chunksize;
+    UC_opts.chunkdims[0] = (hsize_t)UC_opts.chunkplanes;
+    UC_opts.chunkdims[1] = UC_opts.chunkdims[2] = (hsize_t)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;
+    UC_opts.dims[1] = UC_opts.dims[2] = UC_opts.max_dims[1] = UC_opts.max_dims[2] = 2 * (hsize_t)UC_opts.chunksize;
 
     /* set nplanes */
     if (UC_opts.nplanes == 0)
-        UC_opts.nplanes = 2*UC_opts.chunksize;
+        UC_opts.nplanes = 2 * (hsize_t)UC_opts.chunksize;
 
     /* show parameters and return */
     show_parameters();
diff --git a/test/use_common.c b/test/use_common.c
index bedfb3a..908cac9 100644
--- a/test/use_common.c
+++ b/test/use_common.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "h5test.h"
@@ -69,7 +67,7 @@ parse_option(int argc, char * const argv[])
 	    UC_opts.filename = optarg;
 	    break;
 	  case 'i':	/* iterations */
-	    if ((UC_opts.iterations = atoi(optarg)) <= 0){
+	    if ((UC_opts.iterations = HDatoi(optarg)) <= 0) {
 		fprintf(stderr, "bad iterations number %s, must be a positive integer\n", optarg);
 		usage(progname_g);
 		Hgoto_error(-1);
@@ -91,28 +89,28 @@ parse_option(int argc, char * const argv[])
 	    }
 	    break;
 	  case 'n':	/* number of planes to write/read */
-	    if ((UC_opts.nplanes = atoi(optarg)) <= 0){
+	    if ((UC_opts.nplanes = HDstrtoul(optarg, NULL, 0)) <= 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){
+	    if ((UC_opts.use_swmr = HDatoi(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){
+	    if ((UC_opts.chunkplanes = HDstrtoul(optarg, NULL, 0)) <= 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){
+	    if ((UC_opts.chunksize = HDstrtoull(optarg, NULL, 0)) <= 0) {
 		fprintf(stderr, "bad chunksize %s, must be a positive integer\n", optarg);
 		usage(progname_g);
 		Hgoto_error(-1);
@@ -283,7 +281,7 @@ int write_uc_file(hbool_t tosend)
 
     if(tosend)
         /* Send a message that H5Fopen is complete--releasing the file lock */
-        h5_send_message(WRITER_MESSAGE);
+        h5_send_message(WRITER_MESSAGE, NULL, NULL);
 
     /* Open the dataset of the program name */
     if((dsid = H5Dopen2(fid, progname_g, H5P_DEFAULT)) < 0){
@@ -361,7 +359,14 @@ int write_uc_file(hbool_t tosend)
 	bufptr = buffer;
 	for (j=0; j<dims[1]; j++)
 	    for (k=0; k<dims[2]; k++)
-		*bufptr++ = i;
+		*bufptr++ = (UC_CTYPE)i;
+
+        /* Cork the dataset's metadata in the cache, if SWMR is enabled */
+        if(UC_opts.use_swmr)
+            if(H5Odisable_mdc_flushes(dsid) < 0) {
+                fprintf(stderr, "H5Odisable_mdc_flushes failed\n");
+                return -1;
+            }
 
 	/* extend the dataset by one for new plane */
 	dims[0]=i+1;
@@ -388,12 +393,16 @@ int write_uc_file(hbool_t tosend)
 	    fprintf(stderr, "Failed H5Dwrite\n");
             return -1;
 	}
+
+        /* Uncork the dataset's metadata from the cache, if SWMR is enabled */
+        if(UC_opts.use_swmr)
+            if(H5Oenable_mdc_flushes(dsid) < 0) {
+                fprintf(stderr, "H5Oenable_mdc_flushes failed\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;
diff --git a/test/use_disable_mdc_flushes.c b/test/use_disable_mdc_flushes.c
index 67739ac..340f578 100644
--- a/test/use_disable_mdc_flushes.c
+++ b/test/use_disable_mdc_flushes.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -506,33 +504,32 @@ main(int argc, char *argv[])
     int ret_value = 0;
 
     /* initialization */
-    if (setup_parameters(argc, argv) < 0){
+    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){
+    if(create_file() < 0) {
 	fprintf(stderr, "***encounter error\n");
 	Hgoto_error(1);
-    }else
+    } /* end if */
+    else
 	printf("File created.\n");
 
     printf("writing to the file\n");
-    if (write_file() < 0){
+    if(write_file() < 0) {
 	fprintf(stderr, "write_file encountered error\n");
 	Hgoto_error(1);
     }
 
 done:
     /* Print result and exit */
-    if (ret_value != 0){
+    if(ret_value != 0)
 	printf("Error(s) encountered\n");
-    }else{
+    else
 	printf("All passed\n");
-    }
 
     return(ret_value);
 }
diff --git a/test/vds.c b/test/vds.c
index 50523f0..c9b7a1b 100644
--- a/test/vds.c
+++ b/test/vds.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,7 +17,6 @@
  * Purpose:     Tests datasets with virtual layout.
  */
 #include "h5test.h"
-#include "H5srcdir.h"
 #include "H5Dprivate.h" /* For H5D_VIRTUAL_DEF_LIST_SIZE */
 
 typedef enum {
@@ -2813,7 +2810,7 @@ test_basic_io(unsigned config, hid_t fapl)
 
     /* Write data directly to source dataset */
     if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
-        TEST_ERROR 
+        TEST_ERROR
 
     /* Close srcdset and srcfile if config option specified */
     if(config & TEST_IO_CLOSE_SRC) {
@@ -7266,6 +7263,12 @@ test_printf(unsigned config, hid_t fapl)
     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)2)
+        TEST_ERROR
+
     /* Get VDS space */
     if((filespace = H5Dget_space(vdset)) < 0)
         TEST_ERROR
@@ -7330,6 +7333,12 @@ test_printf(unsigned config, hid_t fapl)
     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)3)
+        TEST_ERROR
+
     /* Get VDS space */
     if((filespace = H5Dget_space(vdset)) < 0)
         TEST_ERROR
@@ -7394,6 +7403,12 @@ test_printf(unsigned config, hid_t fapl)
     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)4)
+        TEST_ERROR
+
     /* Get VDS space */
     if((filespace = H5Dget_space(vdset)) < 0)
         TEST_ERROR
@@ -11122,23 +11137,23 @@ error:
 static int
 test_dapl_values(hid_t fapl_id)
 {
-    hid_t	fid = -1;           /* file to write to                     */
-    hid_t	dcpl_id = -1;       /* dataset creation properties          */
-    hid_t	dapl_id1 = -1;      /* dataset access properties            */
-    hid_t	dapl_id2 = -1;      /* dataset access properties            */
-    hid_t	vds_sid = -1;       /* vds data space                       */
-    hid_t	src_sid = -1;       /* source data space                    */
-    hid_t	did1 = -1;          /* dataset                              */
-    hid_t	did2 = -1;          /* dataset                              */
-    hsize_t start;              /* hyperslab start                      */
-    hsize_t stride;             /* hyperslab count                      */
-    hsize_t count;              /* hyperslab count                      */
-    hsize_t block;              /* hyperslab count                      */
-    hsize_t dims;               /* dataset size                         */
-    hsize_t max_dims;           /* dataset max size                     */
-    H5D_vds_view_t view;        /* view from dapl                       */
-    hsize_t gap_size;           /* gap size from dapl                   */
-    char    filename[1024];     /* file names                           */
+    hid_t    fid = -1;           /* file to write to                     */
+    hid_t    dcpl_id = -1;       /* dataset creation properties          */
+    hid_t    dapl_id1 = -1;      /* dataset access properties            */
+    hid_t    dapl_id2 = -1;      /* dataset access properties            */
+    hid_t    vds_sid = -1;       /* vds data space                       */
+    hid_t    src_sid = -1;       /* source data space                    */
+    hid_t    did1 = -1;          /* dataset                              */
+    hid_t    did2 = -1;          /* dataset                              */
+    hsize_t  start;              /* hyperslab start                      */
+    hsize_t  stride;             /* hyperslab count                      */
+    hsize_t  count;              /* hyperslab count                      */
+    hsize_t  block;              /* hyperslab count                      */
+    hsize_t  dims;               /* dataset size                         */
+    hsize_t  max_dims;           /* dataset max size                     */
+    H5D_vds_view_t  view;        /* view from dapl                       */
+    hsize_t  gap_size;           /* gap size from dapl                   */
+    char     filename[1024];     /* file names                           */
 
     TESTING("H5Dget_access_plist() returns dapl w/ correct values");
 
@@ -11222,6 +11237,7 @@ test_dapl_values(hid_t fapl_id)
     if(H5Pget_virtual_printf_gap(dapl_id2, &gap_size) < 0)
         FAIL_STACK_ERROR
     if(gap_size != 123)
+        TEST_ERROR
 
     /* Close everything */
     if(H5Sclose(vds_sid) < 0) FAIL_STACK_ERROR
diff --git a/test/vds_swmr.h b/test/vds_swmr.h
index c043fd6..a8e4d50 100644
--- a/test/vds_swmr.h
+++ b/test/vds_swmr.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef VDS_SWMR_H
diff --git a/test/vds_swmr_gen.c b/test/vds_swmr_gen.c
index 1706844..24c6131 100644
--- a/test/vds_swmr_gen.c
+++ b/test/vds_swmr_gen.c
@@ -5,19 +5,17 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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[])
+main(void)
 {
     hid_t faplid        = -1;   /* file access property list ID (all files) */
 
diff --git a/test/vds_swmr_reader.c b/test/vds_swmr_reader.c
index 7a08c62..1de0cc5 100644
--- a/test/vds_swmr_reader.c
+++ b/test/vds_swmr_reader.c
@@ -5,19 +5,17 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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[])
+main(void)
 {
     hid_t fid           = -1;   /* HDF5 file ID                     */
     hid_t did           = -1;   /* dataset ID                       */
@@ -36,8 +34,6 @@ main(int argc, char *argv[])
 
     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)
diff --git a/test/vds_swmr_writer.c b/test/vds_swmr_writer.c
index 1029192..7824aa0 100644
--- a/test/vds_swmr_writer.c
+++ b/test/vds_swmr_writer.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -80,7 +78,11 @@ main(int argc, char *argv[])
     /* Write planes to the dataset */
     for(i = 0; i < N_PLANES_TO_WRITE; i++) {
 
-        unsigned delay;     /* Time interval between plane writes */
+        time_t delay;           /* Time interval between plane writes */
+
+        /* Cork the dataset's metadata in the cache */
+        if(H5Odisable_mdc_flushes(did) < 0)
+            TEST_ERROR
 
         /* Set the dataset's extent. This is inefficient but that's ok here. */
         extent[0] = i + 1;
@@ -109,8 +111,12 @@ main(int argc, char *argv[])
         if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
             TEST_ERROR
 
+        /* Uncork the dataset's metadata from the cache */
+        if(H5Oenable_mdc_flushes(did) < 0)
+            TEST_ERROR
+
         /* Wait one second between writing planes */
-        delay = HDtime(0) + 1;
+        delay = HDtime(0) + (time_t)1;
         while(HDtime(0) < delay)
             ;
 
diff --git a/test/vfd.c b/test/vfd.c
index 708474c..1932d2c 100644
--- a/test/vfd.c
+++ b/test/vfd.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -27,8 +25,13 @@
 #define FAMILY_SIZE     (1*KB)
 #define FAMILY_SIZE2    (5*KB)
 #define MULTI_SIZE      128
+
 #define CORE_INCREMENT  (4*KB)
-#define CORE_PAGE_SIZE  (1024 * 1024)
+#define CORE_PAGE_SIZE  (1024*KB)
+#define CORE_DSET_NAME  "core dset"
+#define CORE_DSET_DIM1  1024
+#define CORE_DSET_DIM2  32
+
 #define DSET1_NAME   "dset1"
 #define DSET1_DIM1   1024
 #define DSET1_DIM2   32
@@ -80,68 +83,76 @@ const char *FILENAME[] = {
 static herr_t
 test_sec2(void)
 {
-    hid_t        file            = -1;
-    hid_t        fapl            = -1;
-    hid_t        access_fapl     = -1;
-    char         filename[1024];
-    int          *fhandle        = NULL;
-    hsize_t      file_size       = 0;
+    hid_t       fid = -1;                   /* file ID                      */
+    hid_t       fapl_id = -1;               /* file access property list ID */
+    hid_t       fapl_id_out = -1;           /* from H5Fget_access_plist     */
+    char        filename[1024];             /* filename                     */
+    void        *os_file_handle = NULL;     /* OS file handle               */
+    hsize_t     file_size;                  /* file size                    */
 
     TESTING("SEC2 file driver");
 
-    h5_reset();
-
     /* Set property list and file name for SEC2 driver. */
-    fapl = h5_fileaccess();
-    if(H5Pset_fapl_sec2(fapl) < 0)
+    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
         TEST_ERROR;
-    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+    if(H5Pset_fapl_sec2(fapl_id) < 0)
+        TEST_ERROR;
+    h5_fixname(FILENAME[0], fapl_id, filename, sizeof(filename));
 
-    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
         TEST_ERROR;
 
     /* Retrieve the access property list... */
-    if((access_fapl = H5Fget_access_plist(file)) < 0)
+    if((fapl_id_out = H5Fget_access_plist(fid)) < 0)
         TEST_ERROR;
 
     /* Check that the driver is correct */
-    if(H5FD_SEC2 != H5Pget_driver(access_fapl))
+    if(H5FD_SEC2 != H5Pget_driver(fapl_id_out))
         TEST_ERROR;
 
     /* ...and close the property list */
-    if(H5Pclose(access_fapl) < 0)
+    if(H5Pclose(fapl_id_out) < 0)
         TEST_ERROR;
 
-    /* Check file handle API */
-    if(H5Fget_vfd_handle(file, H5P_DEFAULT, (void **)&fhandle) < 0)
-        TEST_ERROR;
-    if(*fhandle < 0)
+    /* Check that we can get an operating-system-specific handle from
+     * the library.
+     */
+    if(H5Fget_vfd_handle(fid, H5P_DEFAULT, &os_file_handle) < 0)
         TEST_ERROR;
+    if(os_file_handle == NULL)
+        FAIL_PUTS_ERROR("NULL os-specific vfd/file handle was returned from H5Fget_vfd_handle");
 
-    /* Check file size API */
-    if(H5Fget_filesize(file, &file_size) < 0)
-        TEST_ERROR;
 
-    /* There is no guarantee the size of metadata in file is constant.
-     * Just try to check if it's reasonable.  It's 2KB right now.
+    /* There is no garantee the size of metadata in file is constant.
+     * Just try to check if it's reasonable.
+     * 
+     * Currently it should be around 2 KB.
      */
+    if(H5Fget_filesize(fid, &file_size) < 0)
+        TEST_ERROR;
     if(file_size < 1 * KB || file_size > 4 * KB)
+        FAIL_PUTS_ERROR("suspicious file size obtained from H5Fget_filesize");
+
+    /* Close and delete the file */
+    if(H5Fclose(fid) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[0], fapl_id);
 
-    if(H5Fclose(file) < 0)
+    /* Close the fapl */
+    if(H5Pclose(fapl_id) < 0)
         TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
-        H5Pclose(fapl);
-        H5Fclose(file);
+        H5Pclose(fapl_id);
+        H5Pclose(fapl_id_out);
+        H5Fclose(fid);
     } H5E_END_TRY;
     return -1;
-}
+} /* end test_sec2() */
 
 

 /*-------------------------------------------------------------------------
@@ -160,218 +171,318 @@ error:
 static herr_t
 test_core(void)
 {
-    hid_t       file=(-1), fapl, access_fapl = -1;
-    char        filename[1024];
-    void        *fhandle=NULL;
-    hsize_t     file_size;
-    hbool_t     use_write_tracking;
-    size_t      write_tracking_page_size;
-    int    *points = NULL, *check = NULL, *p1, *p2;
-    hid_t  dset1=-1, space1=-1;
-    hsize_t  dims1[2];
-    int    i, j, n;
+    hid_t       fid = -1;                   /* file ID                      */
+    hid_t       fapl_id = -1;               /* file access property list ID */
+    hid_t       fapl_id_out = -1;           /* from H5Fget_access_plist     */
+    hid_t       did = -1;                   /* dataset ID                   */
+    hid_t       sid = -1;                   /* dataspace ID                 */
+    char        filename[1024];             /* filename                     */
+    void        *os_file_handle = NULL;     /* OS file handle               */
+    hsize_t     file_size;                  /* file size                    */
+    size_t      increment;                  /* core VFD increment           */
+    hbool_t     backing_store;              /* use backing store?           */
+    hbool_t     use_write_tracking;         /* write tracking flag          */
+    size_t      write_tracking_page_size;   /* write tracking page size     */
+    int         *data_w = NULL;             /* data written to the dataset  */
+    int         *data_r = NULL;             /* data read from the dataset   */
+    int         val;                        /* data value                   */
+    int         *pw = NULL, *pr = NULL;     /* pointers for iterating over
+                                               data arrays (write & read)   */
+    hsize_t     dims[2];                    /* dataspace dimensions         */
+    int         i, j;                       /* iterators                    */
+    htri_t      status;                     /* return value from H5Lexists  */
 
     TESTING("CORE file driver");
 
-    h5_reset();
+    /* Get a file access property list and fix up the file name */
+    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
+    h5_fixname(FILENAME[1], fapl_id, filename, sizeof(filename));
 
-    /* Set property list and file name for CORE driver */
-    fapl = h5_fileaccess();
-    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, TRUE) < 0)
+    /************************************************************************
+     * Check that the backing store flag works by creating a file, close
+     * it, and ensure that the file does not exist.
+     ************************************************************************/
+
+    /* Make sure it's not present at the start of the test */
+    if(HDaccess(filename, F_OK) != -1)
+        if(HDremove(filename) < 0)
+            FAIL_PUTS_ERROR("unable to remove backing store file");
+    /* Create and close file w/ backing store off */
+    if(H5Pset_fapl_core(fapl_id, (size_t)CORE_INCREMENT, FALSE) < 0)
+        TEST_ERROR;
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
         TEST_ERROR;
-    if(H5Pset_core_write_tracking(fapl, TRUE, CORE_PAGE_SIZE) < 0)
+    if(H5Fclose(fid) < 0)
         TEST_ERROR;
-    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
+    /* Check for the backing store file */
+    if(HDaccess(filename, F_OK) != -1)
+        FAIL_PUTS_ERROR("file created when backing store set to FALSE");
 
-    if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+
+    /************************************************************************
+     * Check basic core VFD operation and properties. This is done with the
+     * backing store on so a file will be created for later use.
+     ************************************************************************/
+
+    /* Turn the backing store on */
+    if(H5Pset_fapl_core(fapl_id, (size_t)CORE_INCREMENT, TRUE) < 0)
+        TEST_ERROR;
+
+    /* Check that write tracking is off by default and that the default
+     * page size is non-zero.
+     */
+    if(H5Pget_core_write_tracking(fapl_id, &use_write_tracking, &write_tracking_page_size) < 0)
+        TEST_ERROR;
+    if(FALSE != use_write_tracking)
+        FAIL_PUTS_ERROR("write tracking should be off by default");
+    if(0 == write_tracking_page_size)
+        FAIL_PUTS_ERROR("write tracking page size should never be zero");
+
+    /* Set core VFD properties */
+    if(H5Pset_core_write_tracking(fapl_id, TRUE, CORE_PAGE_SIZE) < 0)
+        TEST_ERROR;
+
+    /* Create the file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
         TEST_ERROR;
 
     /* Retrieve the access property list... */
-    if ((access_fapl = H5Fget_access_plist(file)) < 0)
+    if((fapl_id_out = H5Fget_access_plist(fid)) < 0)
         TEST_ERROR;
 
     /* Check that the driver is correct */
-    if(H5FD_CORE != H5Pget_driver(access_fapl))
+    if(H5FD_CORE != H5Pget_driver(fapl_id_out))
         TEST_ERROR;
 
+    /* Get the basic VFD properties from the fapl and ensure that
+     * they are correct.
+     */
+    if(H5Pget_fapl_core(fapl_id_out, &increment, &backing_store) < 0)
+        TEST_ERROR
+    if(increment != (size_t)CORE_INCREMENT)
+        FAIL_PUTS_ERROR("incorrect increment from file fapl");
+    if(backing_store != TRUE)
+        FAIL_PUTS_ERROR("incorrect backing store flag from file fapl");
+
     /* Check that the backing store write tracking info was saved */
-    if(H5Pget_core_write_tracking(fapl, &use_write_tracking, &write_tracking_page_size) < 0)
+    /* TODO: There is a bug where H5Fget_access_plist() does not return
+     *       the write tracking properties. Until this bug is fixed, just
+     *       test the main fapl_id.
+     */
+    if(H5Pget_core_write_tracking(fapl_id, &use_write_tracking, &write_tracking_page_size) < 0)
         TEST_ERROR;
     if(TRUE != use_write_tracking)
-        TEST_ERROR;
+        FAIL_PUTS_ERROR("write tracking flag incorrect in fapl obtained from H5Fget_access_plist");
     if(CORE_PAGE_SIZE != write_tracking_page_size)
-        TEST_ERROR;
+        FAIL_PUTS_ERROR("write tracking page size incorrect in fapl obtained from H5Fget_access_plist");
 
-    /* ...and close the property list */
-    if (H5Pclose(access_fapl) < 0)
+    /* Close the property list */
+    if(H5Pclose(fapl_id_out) < 0)
         TEST_ERROR;
 
-    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)
+    /* Check that we can get an operating-system-specific handle from
+     * the library.
+     */
+    if(H5Fget_vfd_handle(fid, H5P_DEFAULT, &os_file_handle) < 0)
         TEST_ERROR;
+    if(os_file_handle == NULL)
+        FAIL_PUTS_ERROR("NULL os-specific vfd/file handle was returned from H5Fget_vfd_handle");
 
     /* There is no garantee the size of metadata in file is constant.
-     * Just try to check if it's reasonable.  Why is this 4KB?
+     * Just try to check if it's reasonable.
+     * 
+     * TODO: Needs justification of why is this is a reasonable size.
      */
-    if(file_size<2*KB || file_size>6*KB)
+    if(H5Fget_filesize(fid, &file_size) < 0)
         TEST_ERROR;
+    if(file_size < 2 * KB || file_size > 6 * KB)
+        FAIL_PUTS_ERROR("suspicious file size obtained from H5Fget_filesize");
 
-    if(H5Fclose(file) < 0)
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
         TEST_ERROR;
 
 
+    /************************************************************************
+     * Make changes to the file with the backing store flag OFF to ensure
+     * that they ARE NOT propagated.
+     ************************************************************************/
+
     /* 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)
+     * Changes won't be saved in file.
+     */
+    if(H5Pset_fapl_core(fapl_id, (size_t)CORE_INCREMENT, FALSE) < 0)
         TEST_ERROR;
-
-    if((file=H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 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;
+    if(NULL == (data_w = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+        FAIL_PUTS_ERROR("unable to allocate memory for input array");
+    if(NULL == (data_r = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+        FAIL_PUTS_ERROR("unable to allocate memory for output array");
 
-    /* Initialize the dset1 */
-    p1 = points;
-    for(i = n = 0; i < DSET1_DIM1; i++)
-        for(j = 0; j < DSET1_DIM2; j++)
-            *p1++ = n++;
+    /* Initialize the buffers */
+    val = 0;
+    pw = data_w;
+    for(i = 0; i < CORE_DSET_DIM1; i++)
+        for(j = 0; j < CORE_DSET_DIM2; j++)
+            *pw++ = val++;
+    HDmemset(data_r, 0, DSET1_DIM1 * DSET1_DIM2 * sizeof(int)); 
 
-    /* Create the data space1 */
-    dims1[0] = DSET1_DIM1;
-    dims1[1] = DSET1_DIM2;
-    if((space1 = H5Screate_simple(2, dims1, NULL)) < 0)
+    /* Create the dataspace */
+    dims[0] = CORE_DSET_DIM1;
+    dims[1] = CORE_DSET_DIM2;
+    if((sid = H5Screate_simple(2, dims, 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 dataset */
+    if((did = H5Dcreate2(fid, CORE_DSET_NAME, H5T_NATIVE_INT, sid, 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)
+    /* Write the data to the dataset */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_w) < 0)
         TEST_ERROR;
 
-    if(H5Dclose(dset1) < 0)
+    /* Close and reopen the dataset */
+    if(H5Dclose(did) < 0)
         TEST_ERROR;
-
-    if((dset1 = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT)) < 0)
+    if((did = H5Dopen2(fid, CORE_DSET_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(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_r) < 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++) {
+    pw = data_w;
+    pr = data_r;
+    for(i = 0; i < CORE_DSET_DIM1; i++)
+        for(j = 0; j < CORE_DSET_DIM2; j++)
+            if(*pr++ != *pw++) {
                 H5_FAILED();
-                printf("    Read different values than written in data set 1.\n");
+                printf("    Read different values than written in data set.\n");
                 printf("    At index %d,%d\n", i, j);
                 TEST_ERROR;
             } /* end if */
 
-    if(H5Dclose(dset1) < 0)
+    /* Close everything except the dataspace ID (needed below)*/
+    if(H5Dclose(did) < 0)
         TEST_ERROR;
-
-    if(H5Fclose(file) < 0)
+    if(H5Fclose(fid) < 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)
+    /* Reopen the file and ensure that the dataset does not exist */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
         TEST_ERROR;
-
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    status = H5Lexists(fid, CORE_DSET_NAME, H5P_DEFAULT);
+    if(status < 0)
         TEST_ERROR;
+    if(status > 0)
+        FAIL_PUTS_ERROR("core VFD dataset created in file when backing store disabled");
 
-    /* Create the dset1 */
-    if((dset1 = H5Dcreate2(file, DSET1_NAME, H5T_NATIVE_INT, space1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
         TEST_ERROR;
 
-    /* Write the data to the dset1 */
-    if(H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, points) < 0)
+
+    /************************************************************************
+     * Make changes to the file with the backing store flag ON to ensure
+     * that they ARE propagated.
+     ************************************************************************/
+
+    /* Open the file with backing store on for read and write.
+     * Changes will be saved in file.
+     */
+    if(H5Pset_fapl_core(fapl_id, (size_t)CORE_INCREMENT, TRUE) < 0)
+        TEST_ERROR;
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
         TEST_ERROR;
 
-    if(H5Dclose(dset1) < 0)
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, CORE_DSET_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         TEST_ERROR;
 
-    if((dset1 = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT)) < 0)
+    /* Write the data to the dataset */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_w) < 0)
         TEST_ERROR;
 
-    /* Reallocate memory for reading buffer. */
-    HDassert(check);
-    HDfree(check);
-    if(NULL == (check = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+    /* Close everything and reopen */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR;
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
+        TEST_ERROR;
+    if((did = H5Dopen2(fid, CORE_DSET_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)
+    /* Read the data back from the dataset */
+    HDmemset(data_r, 0, DSET1_DIM1 * DSET1_DIM2 * sizeof(int)); 
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_r) < 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++) {
+    pw = data_w;
+    pr = data_r;
+    for(i = 0; i < CORE_DSET_DIM1; i++)
+        for(j = 0; j < CORE_DSET_DIM2; j++)
+            if(*pw++ != *pr++) {
                 H5_FAILED();
-                printf("    Read different values than written in data set 1.\n");
+                printf("    Read different values than written in data set.\n");
                 printf("    At index %d,%d\n", i, j);
                 TEST_ERROR;
             } /* end if */
 
-    /* Check file size API */
-    if(H5Fget_filesize(file, &file_size) < 0)
+    /* Check file size API.
+     * There is no garantee the size of metadata in file is constant.
+     * Just try to check if it's reasonable.
+     * 
+     * TODO: Needs justification of why is this is a reasonable size.
+     */
+    if(H5Fget_filesize(fid, &file_size) < 0)
         TEST_ERROR;
+    if(file_size < 64 * KB || file_size > 256 * KB)
+        FAIL_PUTS_ERROR("suspicious file size obtained from H5Fget_filesize");
 
-    /* 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)
+    /* Close everything */
+    if(H5Sclose(sid) < 0)
         TEST_ERROR;
-
-    if(H5Sclose(space1) < 0)
+    if(H5Dclose(did) < 0)
         TEST_ERROR;
-    if(H5Dclose(dset1) < 0)
-        TEST_ERROR;
-    if(H5Fclose(file) < 0)
+
+    HDfree(data_w);
+    HDfree(data_r);
+
+    /* Close and delete the file */
+    if(H5Fclose(fid) < 0)
         TEST_ERROR;
-    HDassert(points);
-    HDfree(points);
-    HDassert(check);
-    HDfree(check);
+    h5_delete_test_file(FILENAME[1], fapl_id);
 
-    h5_cleanup(FILENAME, fapl);
+    /* Close the fapl */
+    if(H5Pclose(fapl_id) < 0)
+        TEST_ERROR;
 
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
-        H5Pclose(fapl);
-        H5Fclose(file);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Pclose(fapl_id_out);
+        H5Pclose(fapl_id);
+        H5Fclose(fid);
     } H5E_END_TRY;
 
-    if(points)
-        HDfree(points);
-    if(check)
-        HDfree(check);
+    if(data_w)
+        HDfree(data_w);
+    if(data_r)
+        HDfree(data_r);
 
     return -1;
-}
+} /* end test_core() */
 
 

 /*-------------------------------------------------------------------------
@@ -391,7 +502,7 @@ static herr_t
 test_direct(void)
 {
 #ifdef H5_HAVE_DIRECT
-    hid_t       file=(-1), fapl, access_fapl = -1;
+    hid_t       file=-1, fapl=-1, access_fapl = -1;
     hid_t  dset1=-1, dset2=-1, space1=-1, space2=-1;
     char        filename[1024];
     int         *fhandle=NULL;
@@ -400,7 +511,7 @@ test_direct(void)
     size_t  mbound;
     size_t  fbsize;
     size_t  cbsize;
-    int    *points = NULL, *check = NULL, *p1, *p2;
+    int    *points = NULL, *check = NULL, *p1 = NULL, *p2 = NULL;
     int    wdata2[DSET2_DIM] = {11,12,13,14};
     int    rdata2[DSET2_DIM];
     int    i, j, n;
@@ -413,11 +524,10 @@ test_direct(void)
     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((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_direct(fapl, MBOUNDARY, FBSIZE, CBSIZE) < 0)
         TEST_ERROR;
     h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
@@ -559,14 +669,19 @@ test_direct(void)
         TEST_ERROR;
     if(H5Dclose(dset2) < 0)
         TEST_ERROR;
-    if(H5Fclose(file) < 0)
-        TEST_ERROR;
-    HDassert(points);
+
     HDfree(points);
-    HDassert(check);
     HDfree(check);
 
-    h5_cleanup(FILENAME, fapl);
+    /* Close and delete the file */
+    if(H5Fclose(file) < 0)
+        TEST_ERROR;
+    h5_delete_test_file(FILENAME[5], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
+
     PASSED();
     return 0;
 
@@ -607,7 +722,7 @@ error:
 static herr_t
 test_family_opens(char *fname, hid_t fa_pl)
 {
-    hid_t file;
+    hid_t file=-1;
     char first_name[1024];
     char wrong_name[1024];
     int i;
@@ -678,7 +793,7 @@ error:
 static herr_t
 test_family(void)
 {
-    hid_t       file=(-1), fapl, fapl2=(-1), space=(-1), dset=(-1);
+    hid_t       file=-1, fapl=-1, fapl2=-1, space=-1, dset=-1;
     hid_t       access_fapl = -1;
     char        filename[1024];
     char        dname[]="dataset";
@@ -690,14 +805,12 @@ test_family(void)
 
     TESTING("FAMILY file driver");
 
-    h5_reset();
-
     /* Set property list and file name for FAMILY driver */
-    fapl = h5_fileaccess();
-
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT) < 0)
         TEST_ERROR;
-    h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
+    h5_fixname(FILENAME[2], fapl, filename, sizeof(filename));
 
     if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         TEST_ERROR;
@@ -804,10 +917,15 @@ test_family(void)
     if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[2], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
     return 0;
 
@@ -815,7 +933,8 @@ error:
     H5E_BEGIN_TRY {
         H5Sclose(space);
         H5Dclose(dset);
-        H5Pclose (fapl2);
+        H5Pclose(fapl);
+        H5Pclose(fapl2);
         H5Fclose(file);
     } H5E_END_TRY;
     return -1;
@@ -843,8 +962,8 @@ error:
 static herr_t
 test_family_compat(void)
 {
-    hid_t       file = (-1), fapl;
-    hid_t       dset;
+    hid_t       file = -1, fapl = -1;
+    hid_t       dset = -1;
     char        dname[]="dataset";
     char        filename[1024];
     char        pathname[1024], pathname_individual[1024];
@@ -853,16 +972,14 @@ test_family_compat(void)
 
     TESTING("FAMILY file driver backward compatibility");
 
-    h5_reset();
-
     /* Set property list and file name for FAMILY driver */
-    fapl = h5_fileaccess();
-
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE2, H5P_DEFAULT) < 0)
         TEST_ERROR;
 
-    h5_fixname(COMPAT_BASENAME, fapl, filename, sizeof filename);
-    h5_fixname(FILENAME[3], fapl, newname, sizeof newname);
+    h5_fixname(COMPAT_BASENAME, fapl, filename, sizeof(filename));
+    h5_fixname(FILENAME[3], fapl, newname, sizeof(newname));
 
     pathname[0] = '\0';
     HDstrcat(pathname, filename);
@@ -878,7 +995,7 @@ test_family_compat(void)
         counter++;
         HDsnprintf(newname_individual, sizeof(newname_individual), newname, counter);
         HDsnprintf(pathname_individual, sizeof(pathname_individual), pathname, counter);
-    }
+    } /* end while */
 
     /* Make sure we can open the file.  Use the read and write mode to flush the
      * superblock. */
@@ -904,10 +1021,14 @@ test_family_compat(void)
     if(H5Dclose(dset) < 0)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[3], fapl);
 
-    h5_cleanup(FILENAME, fapl);
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
     PASSED();
 
@@ -940,7 +1061,7 @@ error:
 static herr_t
 test_multi_opens(char *fname)
 {
-    hid_t file;
+    hid_t file=-1;
     char  super_name[1024];     /*name string "%%s-s.h5"*/
     char  sf_name[1024];        /*name string "multi_file-s.h5"*/
 
@@ -972,8 +1093,8 @@ test_multi_opens(char *fname)
 static herr_t
 test_multi(void)
 {
-    hid_t       file=(-1), fapl, fapl2=(-1), dset=(-1), space=(-1);
-    hid_t       root, attr, aspace, atype;
+    hid_t       file=-1, fapl=-1, fapl2=-1, dset=-1, space=-1;
+    hid_t       root=-1, attr=-1, aspace=-1, atype=-1;
     hid_t       access_fapl = -1;
     char        filename[1024];
     int         *fhandle2=NULL, *fhandle=NULL;
@@ -992,16 +1113,15 @@ test_multi(void)
 
     TESTING("MULTI file driver");
 
-    h5_reset();
-
     /* Set file access property list for MULTI driver */
-    fapl = h5_fileaccess();
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
 
-    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);
+    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_fapl[mt] = H5P_DEFAULT;
@@ -1118,7 +1238,7 @@ test_multi(void)
 
     /* Create and write attribute for the root group. */
     if((root = H5Gopen2(file, "/", H5P_DEFAULT)) < 0)
-        FAIL_STACK_ERROR
+        TEST_ERROR
 
     /* Attribute string. */
     if((atype = H5Tcopy(H5T_C_S1)) < 0)
@@ -1148,10 +1268,15 @@ test_multi(void)
     if(H5Aclose(attr) < 0)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[4], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
 
     return 0;
@@ -1191,7 +1316,7 @@ error:
 static herr_t
 test_multi_compat(void)
 {
-    hid_t       file=(-1), fapl, dset=(-1), space=(-1);
+    hid_t       file=-1, fapl=-1, dset=-1, space=-1;
     char        newname[1024];
     char        filename_s[1024], newname_s[1024];
     char        filename_r[1024], newname_r[1024];
@@ -1206,10 +1331,9 @@ test_multi_compat(void)
 
     TESTING("MULTI file driver backward compatibility");
 
-    h5_reset();
-
     /* Set file access property list for MULTI driver */
-    fapl = h5_fileaccess();
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
 
     HDmemset(memb_map, 0,  sizeof memb_map);
     HDmemset(memb_fapl, 0, sizeof memb_fapl);
@@ -1317,10 +1441,15 @@ test_multi_compat(void)
     if(H5Dclose(dset) < 0)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[9], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
 
     return 0;
@@ -1363,10 +1492,9 @@ test_log(void)
 
     TESTING("LOG file driver");
 
-    h5_reset();
-
     /* Set property list and file name for log driver. */
-    fapl = h5_fileaccess();
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_log(fapl, LOG_FILENAME, flags, buf_size) < 0)
         TEST_ERROR;
     h5_fixname(FILENAME[6], fapl, filename, sizeof filename);
@@ -1403,10 +1531,15 @@ test_log(void)
     if(file_size < 1 * KB || file_size > 4 * KB)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[6], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
     return 0;
 
@@ -1444,10 +1577,9 @@ test_stdio(void)
 
     TESTING("STDIO file driver");
 
-    h5_reset();
-
     /* Set property list and file name for STDIO driver. */
-    fapl = h5_fileaccess();
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_stdio(fapl) < 0)
         TEST_ERROR;
     h5_fixname(FILENAME[7], fapl, filename, sizeof filename);
@@ -1483,10 +1615,15 @@ test_stdio(void)
     if(file_size < 1 * KB || file_size > 4 * KB)
         TEST_ERROR;
 
+    /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[7], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
     return 0;
 
@@ -1536,10 +1673,9 @@ test_windows(void)
 
 #else /* H5_HAVE_WINDOWS */
 
-    h5_reset();
-
     /* Set property list and file name for WINDOWS driver. */
-    fapl = h5_fileaccess();
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
     if(H5Pset_fapl_windows(fapl) < 0)
         TEST_ERROR;
     h5_fixname(FILENAME[8], fapl, filename, sizeof filename);
@@ -1575,10 +1711,15 @@ test_windows(void)
     if(file_size < 1 * KB || file_size > 4 * KB)
         TEST_ERROR;
 
+   /* Close and delete the file */
     if(H5Fclose(file) < 0)
         TEST_ERROR;
+    h5_delete_test_file(FILENAME[8], fapl);
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
     PASSED();
     return 0;
 
@@ -1590,7 +1731,7 @@ error:
     return -1;
 
 #endif /* H5_HAVE_WINDOWS */
-}
+} /* end test_windows() */
 
 
 

@@ -1612,7 +1753,9 @@ main(void)
 {
     int nerrors = 0;
 
-    printf("Testing basic Virtual File Driver functionality.\n");
+    h5_reset();
+
+    HDprintf("Testing basic Virtual File Driver functionality.\n");
 
     nerrors += test_sec2() < 0           ? 1 : 0;
     nerrors += test_core() < 0           ? 1 : 0;
@@ -1626,12 +1769,13 @@ main(void)
     nerrors += test_windows() < 0        ? 1 : 0;
 
     if(nerrors) {
-        printf("***** %d Virtual File Driver TEST%s FAILED! *****\n",
+        HDprintf("***** %d Virtual File Driver TEST%s FAILED! *****\n",
             nerrors, nerrors > 1 ? "S" : "");
         return 1;
-    }
+    } /* end if */
+
+    HDprintf("All Virtual File Driver tests passed.\n");
 
-    printf("All Virtual File Driver tests passed.\n");
     return 0;
-}
+} /* end main() */
 
diff --git a/testpar/CMakeLists.txt b/testpar/CMakeLists.txt
index 634afe3..298d326 100644
--- a/testpar/CMakeLists.txt
+++ b/testpar/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_TEST_PAR)
 
 #-----------------------------------------------------------------------------
@@ -7,12 +7,12 @@ PROJECT (HDF5_TEST_PAR)
 add_definitions (${HDF_EXTRA_C_FLAGS})
 
 INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib )
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib )
 #-----------------------------------------------------------------------------
 # Define Tests
 #-----------------------------------------------------------------------------
 
-set (testphdf5_SRCS
+set (testphdf5_SOURCES
     ${HDF5_TEST_PAR_SOURCE_DIR}/testphdf5.c
     ${HDF5_TEST_PAR_SOURCE_DIR}/t_dset.c
     ${HDF5_TEST_PAR_SOURCE_DIR}/t_file.c
@@ -27,7 +27,7 @@ set (testphdf5_SRCS
 )
 
 #-- Adding test for testhdf5
-add_executable (testphdf5 ${testphdf5_SRCS})
+add_executable (testphdf5 ${testphdf5_SOURCES})
 TARGET_NAMING (testphdf5 STATIC)
 TARGET_C_PROPERTIES (testphdf5 STATIC " " " ")
 target_link_libraries (testphdf5 ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET} ${LINK_LIBS})
@@ -54,6 +54,6 @@ set (H5P_TESTS
 
 foreach (testp ${H5P_TESTS})
   ADD_H5P_EXE(${testp})
-endforeach (testp ${H5P_TESTS})
+endforeach ()
 
 include (CMakeTests.cmake)
diff --git a/testpar/CMakeTests.cmake b/testpar/CMakeTests.cmake
index 3716ee6..6e2b05e 100644
--- a/testpar/CMakeTests.cmake
+++ b/testpar/CMakeTests.cmake
@@ -1,3 +1,14 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
 
 ##############################################################################
 ##############################################################################
@@ -9,7 +20,7 @@ add_test (NAME TEST_PAR_testphdf5 COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEX
 
 foreach (testp ${H5P_TESTS})
   add_test (NAME TEST_PAR_${testp} COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:${testp}>)
-endforeach (testp ${H5P_TESTS})
+endforeach ()
 
 # The following will only be correct on windows shared
 #set_tests_properties (TEST_PAR_t_pflush1 PROPERTIES WILL_FAIL "true")
@@ -31,16 +42,16 @@ if (HDF5_TEST_VFD)
       t_pflush1
       t_pflush2
   )
-  
+
   if (DIRECT_VFD)
     set (VFD_LIST ${VFD_LIST} direct)
-  endif (DIRECT_VFD)
+  endif ()
 
-  MACRO (ADD_VFD_TEST vfdname resultcode)
+  macro (ADD_VFD_TEST vfdname resultcode)
     if (NOT HDF5_ENABLE_USING_MEMCHECKER)
       foreach (test ${H5P_VFD_TESTS})
         add_test (
-          NAME TEST_PAR_VFD-${vfdname}-${test} 
+          NAME TEST_PAR_VFD-${vfdname}-${test}
           COMMAND "${CMAKE_COMMAND}"
               -D "TEST_PROGRAM=$<TARGET_FILE:${test}>"
               -D "TEST_ARGS:STRING="
@@ -50,13 +61,13 @@ if (HDF5_TEST_VFD)
               -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
               -P "${HDF_RESOURCES_DIR}/vfdTest.cmake"
         )
-      endforeach (test ${H5P_VFD_TESTS})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_VFD_TEST)
-  
+      endforeach ()
+    endif ()
+  endmacro ()
+
   # Run test with different Virtual File Driver
   foreach (vfd ${VFD_LIST})
     ADD_VFD_TEST (${vfd} 0)
-  endforeach (vfd ${VFD_LIST})
+  endforeach ()
 
-endif (HDF5_TEST_VFD)
+endif ()
diff --git a/testpar/COPYING b/testpar/COPYING
index 6903daf..6497ace 100644
--- a/testpar/COPYING
+++ b/testpar/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/testpar/Makefile.am b/testpar/Makefile.am
index 4fe0ba8..b87c1df 100644
--- a/testpar/Makefile.am
+++ b/testpar/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -25,7 +23,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test
 
 # Test programs.  These are our main targets.
 #
-TEST_PROG_PARA=t_mpi testphdf5 t_cache t_pflush1 t_pflush2 t_pshutdown t_prestart t_init_term t_shapesame
+TEST_PROG_PARA=t_mpi testphdf5 t_cache t_cache_image t_pflush1 t_pflush2 t_pshutdown t_prestart t_init_term t_shapesame
 
 check_PROGRAMS = $(TEST_PROG_PARA)
 
diff --git a/testpar/Makefile.in b/testpar/Makefile.in
index 8a0b8b7..ed26624 100644
--- a/testpar/Makefile.in
+++ b/testpar/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # hdf5 Parallel Library Test Makefile(.in)
 #
@@ -135,8 +133,9 @@ CONFIG_HEADER = $(top_builddir)/src/H5config.h \
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = t_mpi$(EXEEXT) testphdf5$(EXEEXT) t_cache$(EXEEXT) \
-	t_pflush1$(EXEEXT) t_pflush2$(EXEEXT) t_pshutdown$(EXEEXT) \
-	t_prestart$(EXEEXT) t_init_term$(EXEEXT) t_shapesame$(EXEEXT)
+	t_cache_image$(EXEEXT) t_pflush1$(EXEEXT) t_pflush2$(EXEEXT) \
+	t_pshutdown$(EXEEXT) t_prestart$(EXEEXT) t_init_term$(EXEEXT) \
+	t_shapesame$(EXEEXT)
 t_cache_SOURCES = t_cache.c
 t_cache_OBJECTS = t_cache.$(OBJEXT)
 t_cache_LDADD = $(LDADD)
@@ -145,6 +144,10 @@ 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 = 
+t_cache_image_SOURCES = t_cache_image.c
+t_cache_image_OBJECTS = t_cache_image.$(OBJEXT)
+t_cache_image_LDADD = $(LDADD)
+t_cache_image_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
 t_init_term_SOURCES = t_init_term.c
 t_init_term_OBJECTS = t_init_term.$(OBJEXT)
 t_init_term_LDADD = $(LDADD)
@@ -215,10 +218,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 = t_cache.c t_init_term.c t_mpi.c t_pflush1.c t_pflush2.c \
-	t_prestart.c t_pshutdown.c t_shapesame.c $(testphdf5_SOURCES)
-DIST_SOURCES = t_cache.c t_init_term.c t_mpi.c t_pflush1.c t_pflush2.c \
-	t_prestart.c t_pshutdown.c t_shapesame.c $(testphdf5_SOURCES)
+SOURCES = t_cache.c t_cache_image.c t_init_term.c t_mpi.c t_pflush1.c \
+	t_pflush2.c t_prestart.c t_pshutdown.c t_shapesame.c \
+	$(testphdf5_SOURCES)
+DIST_SOURCES = t_cache.c t_cache_image.c t_init_term.c t_mpi.c \
+	t_pflush1.c t_pflush2.c t_prestart.c t_pshutdown.c \
+	t_shapesame.c $(testphdf5_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -494,6 +499,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -615,6 +621,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -771,7 +778,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 MPItest.h5 \
 
 # Test programs.  These are our main targets.
 #
-TEST_PROG_PARA = t_mpi testphdf5 t_cache t_pflush1 t_pflush2 t_pshutdown t_prestart t_init_term t_shapesame
+TEST_PROG_PARA = t_mpi testphdf5 t_cache t_cache_image 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_prop.c
@@ -780,18 +787,20 @@ testphdf5_SOURCES = testphdf5.c t_dset.c t_file.c t_file_image.c t_mdset.c \
 # The tests all depend on the hdf5 library and the test library
 LDADD = $(LIBH5TEST) $(LIBHDF5)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -847,6 +856,10 @@ t_cache$(EXEEXT): $(t_cache_OBJECTS) $(t_cache_DEPENDENCIES) $(EXTRA_t_cache_DEP
 	@rm -f t_cache$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(t_cache_OBJECTS) $(t_cache_LDADD) $(LIBS)
 
+t_cache_image$(EXEEXT): $(t_cache_image_OBJECTS) $(t_cache_image_DEPENDENCIES) $(EXTRA_t_cache_image_DEPENDENCIES) 
+	@rm -f t_cache_image$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(t_cache_image_OBJECTS) $(t_cache_image_LDADD) $(LIBS)
+
 t_init_term$(EXEEXT): $(t_init_term_OBJECTS) $(t_init_term_DEPENDENCIES) $(EXTRA_t_init_term_DEPENDENCIES) 
 	@rm -f t_init_term$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(t_init_term_OBJECTS) $(t_init_term_LDADD) $(LIBS)
@@ -886,6 +899,7 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_cache.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_cache_image.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_chunk_alloc.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_coll_chunk.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_dset.Po at am__quote@
@@ -906,22 +920,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/testphdf5.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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1301,6 +1318,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1308,7 +1326,7 @@ 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)
+lib dyn 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                           \
diff --git a/testpar/t_cache.c b/testpar/t_cache.c
index 602dfef..700e993 100644
--- a/testpar/t_cache.c
+++ b/testpar/t_cache.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -139,7 +137,8 @@ int total_writes           = 0;
  *		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 datum_clear().
+ *              dirty, and is cleared via a call to datum_notify with the
+ *              "entry cleaned" action.
  *
  *      flushed: Boolean flag that is set to true whenever the entry is
  *              dirty, and is flushed by the metadata cache.
@@ -332,7 +331,7 @@ struct mssg_t
     haddr_t	base_addr;
     unsigned	len;
     int		ver;
-    int		count;
+    unsigned	count;
     unsigned	magic;
 };
 
@@ -389,20 +388,16 @@ static hbool_t serve_rw_count_reset_request(struct mssg_t * mssg_ptr);
 
 /* call back functions & related data structures */
 
-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 herr_t datum_get_initial_load_size(void *udata_ptr,
+                                  size_t *image_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_image_len(const void *thing,
+                              size_t *image_len_ptr);
 
 static herr_t datum_serialize(const H5F_t *f,
                               void *image_ptr,
@@ -413,9 +408,8 @@ 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
+/* Masquerade as object header entries to the cache */
+#define DATUM_ENTRY_TYPE	H5AC_OHDR_ID
 
 #define NUMBER_OF_ENTRY_TYPES	1
 
@@ -439,18 +433,18 @@ const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] =
   {
     /* id            */ DATUM_ENTRY_TYPE,
     /* name          */ "datum",
-    /* mem_type      */ H5FD_MEM_DEFAULT,
+    /* mem_type      */ H5FD_MEM_OHDR,
     /* flags         */ H5AC__CLASS_SKIP_READS | H5AC__CLASS_SKIP_WRITES,
-    /* get_load_size */ (H5AC_get_load_size_func_t)datum_get_load_size,
+    /* get_initial_load_size */ datum_get_initial_load_size,
+    /* get_final_load_size */ NULL,
     /* 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,
+    /* deserialize   */ datum_deserialize,
+    /* image_len     */ datum_image_len,
+    /* pre_serialize */ NULL,
+    /* serialize     */ datum_serialize,
+    /* notify        */ datum_notify,
+    /* free_icr      */ datum_free_icr,
+    /* fsf_size      */ NULL,
   }
 };
 
@@ -489,8 +483,8 @@ 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);
-static hbool_t verify_total_writes(int expected_total_writes);
-static void verify_writes(int num_writes, haddr_t * written_entries_tbl);
+static hbool_t verify_total_writes(unsigned expected_total_writes);
+static void verify_writes(unsigned num_writes, haddr_t * written_entries_tbl);
 static void unlock_entry(H5F_t * file_ptr, int32_t type, unsigned int flags);
 static void unpin_entry(H5F_t * file_ptr, int32_t idx, hbool_t global,
                  hbool_t dirty, hbool_t via_unprotect);
@@ -1218,7 +1212,7 @@ setup_derived_types(void)
     int result;
     MPI_Datatype mpi_types[9] = {MPI_INT, MPI_INT, MPI_INT, MPI_LONG,
                                  HADDR_AS_MPI_TYPE, MPI_INT, MPI_INT,
-                                 MPI_INT, MPI_UNSIGNED};
+                                 MPI_UNSIGNED, MPI_UNSIGNED};
     int block_len[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
     MPI_Aint displs[9];
     struct mssg_t sample; /* used to compute displacements */
@@ -2325,7 +2319,7 @@ serve_rw_count_reset_request(struct mssg_t * mssg_ptr)
 
 

 /*-------------------------------------------------------------------------
- * Function:	datum_get_load_size
+ * Function:	datum_get_initial_load_size
  *
  * Purpose:	Query the image size for an entry before deserializing it
  *
@@ -2337,8 +2331,7 @@ serve_rw_count_reset_request(struct mssg_t * mssg_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)
+datum_get_initial_load_size(void *udata_ptr, size_t *image_len_ptr)
 {
     haddr_t addr = *(haddr_t *)udata_ptr;
     int idx;
@@ -2362,7 +2355,7 @@ datum_get_load_size(const void *image_ptr, const void *udata_ptr,
     if ( callbacks_verbose ) {
 
         HDfprintf(stdout,
-	  "%d: get_load_size() idx = %d, addr = %ld, len = %d.\n",
+	  "%d: get_initial_load_size() idx = %d, addr = %ld, len = %d.\n",
               world_mpi_rank, idx, (long)addr, (int)entry_ptr->local_len);
 	fflush(stdout);
     }
@@ -2371,7 +2364,7 @@ datum_get_load_size(const void *image_ptr, const void *udata_ptr,
     *image_len_ptr = entry_ptr->local_len;
 
     return(SUCCEED);
-} /* get_load_size() */
+} /* get_initial_load_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -2451,8 +2444,7 @@ datum_deserialize(const void * image_ptr,
  *-------------------------------------------------------------------------
  */
 static herr_t
-datum_image_len(void *thing, size_t *image_len,
-    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+datum_image_len(const void *thing, size_t *image_len)
 {
     int idx;
     struct datum * entry_ptr;
@@ -2529,7 +2521,6 @@ datum_serialize(const H5F_t *f,
 
     HDassert( aux_ptr );
     HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( entry_ptr->aux_ptr == NULL );
 
     entry_ptr->aux_ptr = aux_ptr;
 
@@ -2611,8 +2602,13 @@ datum_notify(H5C_notify_action_t action, void *thing)
     }
 
     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 ) );
+    /* Skip this check when the entry is being dirtied, since the resize
+     * operation sends the message before the len/local_len is updated
+     * (after the resize operation completes successfully) (QAK - 2016/10/19)
+     */
+    if(H5AC_NOTIFY_ACTION_ENTRY_DIRTIED != action)
+        HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
+                  ( entry_ptr->header.size == entry_ptr->local_len ) );
 
     switch ( action )
     {
@@ -2873,6 +2869,87 @@ datum_notify(H5C_notify_action_t action, void *thing)
             /* do nothing */
             break;
 
+        case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = entry dirty, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = entry clean, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            entry_ptr->cleared = TRUE;
+            entry_ptr->dirty = FALSE;
+
+            datum_clears++;
+
+            if(entry_ptr->header.is_pinned) {
+                datum_pinned_clears++;
+                HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned );
+            } /* end if */
+
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = child entry dirty, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = child entry clean, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = child entry unserialized, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            /* do nothing */
+            break;
+
+        case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = child entry serialized, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+
+            /* do nothing */
+            break;
+
 	default:
             nerrors++;
             ret_value = FAIL;
@@ -2944,62 +3021,6 @@ datum_free_icr(void * thing)
 } /* datum_free_icr() */
 
 

-/*-------------------------------------------------------------------------
- * Function:    datum_clear
- *
- * Purpose:     Mark the datum as clean.
- *
- *              Do not write it to the server, or increment the version.
- *
- * Return:      SUCCEED
- *
- * Programmer:  John Mainzer
- *              12/29/05
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-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 );
-
-    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 );
-
-    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->dirty ) ||
-              ( entry_ptr->header.is_dirty == entry_ptr->dirty ) );
-
-    entry_ptr->cleared = TRUE;
-    entry_ptr->dirty = FALSE;
-
-    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 ***************************/
 /*****************************************************************************/
@@ -3056,7 +3077,7 @@ 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, NULL, NULL);
+				      NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -4311,15 +4332,13 @@ setup_cache_for_test(hid_t * fid_ptr,
  *
  *****************************************************************************/
 static void
-verify_writes(int num_writes,
-	      haddr_t * written_entries_tbl)
+verify_writes(unsigned num_writes, haddr_t *written_entries_tbl)
 {
     const hbool_t report = FALSE;
     hbool_t proceed = TRUE;
-    int i = 0;
+    unsigned u = 0;
 
     HDassert( world_mpi_rank != world_server_mpi_rank );
-    HDassert( num_writes >= 0 );
     HDassert( ( num_writes == 0 ) ||
               ( written_entries_tbl != NULL ) );
 
@@ -4339,15 +4358,12 @@ verify_writes(int num_writes,
         }
     }
 
-    if ( proceed ) {
-
+    if(proceed)
         proceed = verify_total_writes(num_writes);
-    }
 
-    while ( ( proceed ) && ( i < num_writes ) ) 
-    {
-        proceed = verify_entry_writes(written_entries_tbl[i], 1);
-        i++;
+    while(proceed && u < num_writes) {
+        proceed = verify_entry_writes(written_entries_tbl[u], 1);
+        u++;
     }
 
     /* barrier to ensure that all other processes have finished verifying
@@ -4376,12 +4392,12 @@ verify_writes(int num_writes,
 
         if ( proceed ) {
 
-            HDfprintf(stdout, "%d:%s: verified %d writes.\n",
+            HDfprintf(stdout, "%d:%s: verified %u writes.\n",
                       world_mpi_rank, FUNC, num_writes);
 
         } else {
 
-            HDfprintf(stdout, "%d:%s: FAILED to verify %d writes.\n",
+            HDfprintf(stdout, "%d:%s: FAILED to verify %u writes.\n",
                       world_mpi_rank, FUNC, num_writes);
 
         }
@@ -4906,10 +4922,10 @@ verify_total_reads(int expected_total_reads)
  *
  *****************************************************************************/
 static hbool_t
-verify_total_writes(int expected_total_writes)
+verify_total_writes(unsigned expected_total_writes)
 {
     hbool_t success = TRUE; /* will set to FALSE if appropriate. */
-    long reported_total_writes;
+    unsigned reported_total_writes;
     struct mssg_t mssg;
 
     if ( success ) {
@@ -4974,7 +4990,7 @@ verify_total_writes(int expected_total_writes)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, 
-                   "%d:%s: reported/expected total writes mismatch (%ld/%ld).\n",
+                   "%d:%s: reported/expected total writes mismatch (%u/%u).\n",
                    world_mpi_rank, FUNC, 
                    reported_total_writes, expected_total_writes);
             }
@@ -5296,7 +5312,7 @@ server_smoke_check(void)
 
         if ( success ) {
 
-            success = verify_total_writes(world_mpi_size - 1);
+            success = verify_total_writes((unsigned)(world_mpi_size - 1));
         }
 
         if ( success ) {
@@ -5400,7 +5416,7 @@ server_smoke_check(void)
 
         if ( success ) {
 
-            success = verify_total_writes(world_mpi_size - 1);
+            success = verify_total_writes((unsigned)(world_mpi_size - 1));
         }
 
         if ( success ) {
diff --git a/testpar/t_cache_image.c b/testpar/t_cache_image.c
new file mode 100644
index 0000000..524a63f
--- /dev/null
+++ b/testpar/t_cache_image.c
@@ -0,0 +1,4275 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  John Mainzer
+ *              7/13/15
+ *
+ *              This file contains tests specific to the cache image 
+ *		feature implemented in H5C.c
+ */
+#include "h5test.h"
+#include "testphdf5.h"
+#include "testpar.h"
+#include "cache_common.h"
+#include "genall5.h"
+
+#define TEST_FILES_TO_CONSTRUCT 2
+#define CHUNK_SIZE              10
+#define DSET_SIZE               (40 * CHUNK_SIZE)
+#define MAX_NUM_DSETS           256
+#define PAR_NUM_DSETS           32
+#define PAGE_SIZE		(4 * 1024)
+#define PB_SIZE                 (64 * PAGE_SIZE)
+
+/* global variable declarations: */
+
+
+const char *FILENAMES[] = {
+        "t_cache_image_00",
+        "t_cache_image_01",
+        "t_cache_image_02",
+        NULL
+};
+
+/* local utility function declarations */
+
+static void create_data_sets(hid_t file_id, int min_dset, int max_dset);
+#if 0 /* keep pending full parallel cache image */
+static void delete_data_sets(hid_t file_id, int min_dset, int max_dset);
+#endif
+
+static void open_hdf5_file(const hbool_t create_file,
+    const hbool_t mdci_sbem_expected,
+    const hbool_t read_only,
+    const hbool_t set_mdci_fapl,
+    const hbool_t config_fsm,
+    const hbool_t enable_page_buffer,
+    const char * hdf_file_name,
+    const unsigned cache_image_flags,
+    hid_t * file_id_ptr,
+    H5F_t ** file_ptr_ptr,
+    H5C_t ** cache_ptr_ptr,
+    MPI_Comm comm, 
+    MPI_Info info, 
+   int l_facc_type,
+   const hbool_t all_coll_metadata_ops,
+   const hbool_t coll_metadata_write,
+   const int md_write_strat);
+
+static void verify_data_sets(hid_t file_id, int min_dset, int max_dset);
+
+/* local test function declarations */
+
+static hbool_t parse_flags(int argc, char * argv[], hbool_t * setup_ptr, 
+    hbool_t * ici_ptr, int * file_idx_ptr, int * mpi_size_ptr, hbool_t display);
+static void usage(void);
+static unsigned construct_test_file(int test_file_index);
+static void par_create_dataset(int dset_num, hid_t file_id, int mpi_rank, 
+    int mpi_size);
+static void par_delete_dataset(int dset_num, hid_t file_id, int mpi_rank);
+static void par_verify_dataset(int dset_num, hid_t file_id, int mpi_rank);
+
+static hbool_t serial_insert_cache_image(int file_name_idx, int mpi_size);
+static void serial_verify_dataset(int dset_num, hid_t file_id, int mpi_size);
+
+/* top level test function declarations */
+static unsigned verify_cache_image_RO(int file_name_id, 
+    int md_write_strat, int mpi_rank);
+static unsigned verify_cache_image_RW(int file_name_id, 
+    int md_write_strat, int mpi_rank);
+
+static hbool_t smoke_check_1(MPI_Comm mpi_comm, MPI_Info mpi_info, 
+    int mpi_rank, int mpi_size);
+
+

+/****************************************************************************/
+/***************************** Utility Functions ****************************/
+/****************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    construct_test_file()
+ *
+ * Purpose:     This function attempts to mimic the typical "poor man's 
+ *		parallel use case in which the file is passed between
+ *		processes, each of which open the file, write some data,
+ *		close the file, and then pass control on to the next 
+ *		process.
+ *
+ *		In this case, we create one group for each process, and
+ *		populate it with a "zoo" of HDF5 objects selected to 
+ *		(ideally) exercise all HDF5 on disk data structures.
+ *
+ *		The end result is a test file used verify that PHDF5 
+ *		can open a file with a cache image.
+ *
+ *		Cycle of operation
+ *
+ *		1) Create a HDF5 file with the cache image FAPL entry.  
+ *
+ *		   Verify that the cache is informed of the cache image 
+ *		   FAPL entry.
+ *
+ *		   Set all cache image flags, forcing full functionality.
+ *
+ *		2) Create a data set in the file.
+ *
+ *		3) Close the file.
+ *
+ *		4) Open the file.
+ *
+ *		   Verify that the metadata cache is instructed to load 
+ *                 the metadata cache image.
+ *
+ *		5) Create a data set in the file.
+ *
+ *		6) Close the file.  If enough datasets have been created
+ *                 goto 7.  Otherwise return to 4.
+ *
+ *		7) Open the file R/O.
+ *
+ *                 Verify that the file contains a metadata cache image
+ *                 superblock extension message.
+ *		
+ *		8) Verify all data sets.
+ *
+ *		   Verify that the cache image has been loaded.
+ *
+ *	        9) close the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              1/25/17
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+construct_test_file(int test_file_index)
+{
+    const char * fcn_name = "construct_test_file()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+    int min_dset = 0;
+    int max_dset = 0;
+    MPI_Comm dummy_comm = MPI_COMM_WORLD;
+    MPI_Info dummy_info = MPI_INFO_NULL;
+
+    pass = TRUE;
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        HDassert(FILENAMES[test_file_index]);
+
+        if ( h5_fixname(FILENAMES[test_file_index], H5P_DEFAULT, 
+                                  filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a HDF5 file with the cache image FAPL entry. 
+     *
+     *	  Verify that the cache is informed of the cache image FAPL entry.
+     *
+     *    Set flags forcing full function of the cache image feature.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ TRUE,
+                       /* mdci_sbem_expected    */ FALSE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ TRUE,
+		       /* config_fsm            */ TRUE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ dummy_comm,
+                       /* info                  */ dummy_info,
+                       /* l_facc_type           */ 0,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ 0);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create a data set in the file. */
+
+    if ( pass ) {
+
+        create_data_sets(file_id, min_dset++, max_dset++);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    while ( ( pass ) && ( max_dset < MAX_NUM_DSETS ) )
+    {
+
+        /* 4) Open the file.
+         *
+         *    Verify that the metadata cache is instructed to load the
+         *    metadata cache image.
+         */
+
+        if ( pass ) {
+
+            open_hdf5_file(/* create_file           */ FALSE,
+                           /* mdci_sbem_expected    */ TRUE,
+                           /* read_only             */ FALSE,
+                           /* set_mdci_fapl         */ TRUE,
+		           /* config_fsm            */ FALSE,
+                           /* enable_page_buffer    */ FALSE,
+                           /* hdf_file_name         */ filename,
+                           /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                           /* file_id_ptr           */ &file_id,
+                           /* file_ptr_ptr          */ &file_ptr,
+                           /* cache_ptr_ptr         */ &cache_ptr,
+                           /* comm                  */ dummy_comm,
+                           /* info                  */ dummy_info,
+                           /* l_facc_type           */ 0,
+                           /* all_coll_metadata_ops */ FALSE,
+                           /* coll_metadata_write   */ FALSE,
+                           /* md_write_strat        */ 0);
+        }
+
+        if ( show_progress )
+            HDfprintf(stdout, "%s:L1 cp = %d, max_dset = %d, pass = %d.\n",
+                      fcn_name, cp, max_dset, pass);
+
+
+        /* 5) Create a data set in the file. */
+
+        if ( pass ) {
+
+            create_data_sets(file_id, min_dset++, max_dset++);
+        }
+
+#if H5C_COLLECT_CACHE_STATS
+        if ( pass ) {
+
+            if ( cache_ptr->images_loaded == 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "metadata cache image block not loaded(1).";
+            }
+        }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+        if ( show_progress )
+            HDfprintf(stdout, "%s:L2 cp = %d, max_dset = %d, pass = %d.\n",
+                      fcn_name, cp + 1, max_dset, pass);
+
+
+        /* 6) Close the file. */
+
+        if ( pass ) {
+
+            if ( H5Fclose(file_id) < 0  ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Fclose() failed.\n";
+
+            }
+        }
+
+        if ( show_progress )
+            HDfprintf(stdout, "%s:L3 cp = %d, max_dset = %d, pass = %d.\n",
+                      fcn_name, cp + 2, max_dset, pass);
+    } /* end while */
+    cp += 3;
+
+
+    /* 7) Open the file R/O.
+     *
+     *    Verify that the file contains a metadata cache image
+     *    superblock extension message.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ TRUE,
+                       /* set_mdci_fapl         */ FALSE,
+	               /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ dummy_comm,
+                       /* info                  */ dummy_info,
+                       /* l_facc_type           */ 0,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ 0);
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 8) Open and close all data sets. 
+     *
+     *    Verify that the cache image has been loaded.
+     */
+
+    if ( pass ) {
+
+       verify_data_sets(file_id, 0, max_dset - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded == 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* 9) Close the file. */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    return !pass;
+
+} /* construct_test_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_data_sets()
+ *
+ * Purpose:     If pass is TRUE on entry, create the specified data sets
+ *		in the indicated file.
+ *
+ *		Data sets and their contents must be well know, as we 
+ *		will verify that they contain the expected data later.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ * Modifications:
+ *
+ *              Added min_dset and max_dset parameters and supporting 
+ *		code.  This allows the caller to specify a range of 
+ *		datasets to create.
+ *						JRM -- 8/20/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void 
+create_data_sets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "create_data_sets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l, m;
+    int data_chunk[CHUNK_SIZE][CHUNK_SIZE];
+    herr_t status;
+    hid_t dataspace_id = -1;
+    hid_t filespace_ids[MAX_NUM_DSETS];
+    hid_t memspace_id = -1;
+    hid_t dataset_ids[MAX_NUM_DSETS];
+    hid_t properties = -1;
+    hsize_t dims[2];
+    hsize_t a_size[2];
+    hsize_t offset[2];
+    hsize_t chunk_size[2];
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    /* create the datasets */
+
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            /* create a dataspace for the chunked dataset */
+            dims[0] = DSET_SIZE;
+            dims[1] = DSET_SIZE;
+            dataspace_id = H5Screate_simple(2, dims, NULL);
+
+            if ( dataspace_id < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Screate_simple() failed.";
+            }
+
+            /* set the dataset creation plist to specify that the raw data is
+             * to be partioned into 10X10 element chunks.
+             */
+
+            if ( pass ) {
+
+                chunk_size[0] = CHUNK_SIZE;
+                chunk_size[1] = CHUNK_SIZE;
+                properties = H5Pcreate(H5P_DATASET_CREATE);
+
+                if ( properties < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Pcreate() failed.";
+                }
+            }
+
+            if ( pass ) {
+
+                if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Pset_chunk() failed.";
+                }
+            }
+
+            /* create the dataset */
+            if ( pass ) {
+
+                sprintf(dset_name, "/dset%03d", i);
+                dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE,
+                                            dataspace_id, H5P_DEFAULT,
+                                            properties, H5P_DEFAULT);
+
+                if ( dataset_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dcreate() failed.";
+                }
+            }
+
+            /* get the file space ID */
+            if ( pass ) {
+
+                filespace_ids[i] = H5Dget_space(dataset_ids[i]);
+
+                if ( filespace_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dget_space() failed.";
+                }
+            }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* create the mem space to be used to read and write chunks */
+    if ( pass ) {
+
+        dims[0] = CHUNK_SIZE;
+        dims[1] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(2, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;  /*offset of hyperslab in memory*/
+        offset[1] = 0;
+        a_size[0] = CHUNK_SIZE;  /*size of hyperslab*/
+        a_size[1] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* initialize all datasets on a round robin basis */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+                /* initialize the slab */
+                for ( k = 0; k < CHUNK_SIZE; k++ )
+                {
+                    for ( l = 0; l < CHUNK_SIZE; l++ )
+                    {
+                        data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) +
+                                           (DSET_SIZE * (i + k)) + j + l;
+                    }
+                }
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "disk H5Sselect_hyperslab() failed.";
+                }
+
+                /* write the chunk to file */
+                status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id,
+                                  filespace_ids[m], H5P_DEFAULT, data_chunk);
+
+                if ( status < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dwrite() failed.";
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* read data from data sets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "disk hyperslab create failed.";
+                }
+
+                /* read the chunk from file */
+                if ( pass ) {
+
+                    status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, 
+                                     memspace_id, filespace_ids[m], 
+                                     H5P_DEFAULT, data_chunk);
+
+                    if ( status < 0 ) {
+
+                       pass = FALSE;
+                       failure_mssg = "disk hyperslab create failed.";
+                    }
+                }
+
+                /* validate the slab */
+                if ( pass ) {
+
+                    valid_chunk = TRUE;
+                    for ( k = 0; k < CHUNK_SIZE; k++ )
+                    {
+                        for ( l = 0; l < CHUNK_SIZE; l++ )
+                        {
+                            if ( data_chunk[k][l]
+                                 !=
+                                 ((DSET_SIZE * DSET_SIZE * m) +
+                                  (DSET_SIZE * (i + k)) + j + l) ) {
+
+                                valid_chunk = FALSE;
+
+				if ( verbose ) {
+
+                                    HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[k][l],
+                                    ((DSET_SIZE * DSET_SIZE * m) +
+                                     (DSET_SIZE * (i + k)) + j + l));
+                                    HDfprintf(stdout,
+                                    "m = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                    m, i, j, k, l);
+				}
+                            }
+                        }
+                    }
+
+                    if ( ! valid_chunk ) {
+
+                        pass = FALSE;
+                        failure_mssg = "slab validation failed.";
+
+			if ( verbose ) {
+
+                            fprintf(stdout, 
+                                  "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                  i, j, m);
+			}
+                    }
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* close the file spaces */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Sclose(filespace_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose() failed.";
+        }
+        i++;
+    }
+
+
+    /* close the datasets */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Dclose(dataset_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dclose() failed.";
+        }
+        i++;
+    }
+
+    /* close the mem space */
+    if ( pass ) {
+
+        if ( H5Sclose(memspace_id) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose(memspace_id) failed.";
+        }
+    }
+
+    return;
+
+} /* create_data_sets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    delete_data_sets()
+ *
+ * Purpose:     If pass is TRUE on entry, verify and then delete the 
+ *		dataset(s) indicated by min_dset and max_dset in the 
+ *		indicated file.
+ *
+ *		Data sets and their contents must be well know, as we 
+ *		will verify that they contain the expected data later.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              10/31/16
+ *
+ * Modifications:
+ *
+ *              None.
+ *						JRM -- 8/20/15
+ *
+ *-------------------------------------------------------------------------
+ */
+#if 0 
+/* this code will be needed to test full support of cache image
+ * in parallel -- keep it around against that day.
+ *
+ *                                      -- JRM
+ */
+static void 
+delete_data_sets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "delete_data_sets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    int cp = 0;
+    int i;
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* first, verify the contents of the target dataset(s) */
+    verify_data_sets(file_id, min_dset, max_dset);
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* now delete the target datasets */
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            sprintf(dset_name, "/dset%03d", i);
+
+	    if ( H5Ldelete(file_id, dset_name, H5P_DEFAULT) < 0) {
+
+                pass = FALSE;
+                failure_mssg = "H5Ldelete() failed.";
+	    }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    return;
+
+} /* delete_data_sets() */
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_hdf5_file()
+ *
+ * Purpose:     If pass is true on entry, create or open the specified HDF5 
+ *		and test to see if it has a metadata cache image superblock 
+ *		extension message.  
+ *
+ *		Set pass to FALSE and issue a suitable failure 
+ *		message if either the file contains a metadata cache image
+ *		superblock extension and mdci_sbem_expected is TRUE, or 
+ *		vise versa.
+ *
+ *		If mdci_sbem_expected is TRUE, also verify that the metadata 
+ *		cache has been advised of this.
+ *
+ *		If read_only is TRUE, open the file read only.  Otherwise
+ *		open the file read/write.
+ *
+ *		If set_mdci_fapl is TRUE, set the metadata cache image 
+ *		FAPL entry when opening the file, and verify that the 
+ *		metadata cache is notified.
+ *
+ *		If config_fsm is TRUE, setup the persistant free space 
+ *		manager.  Note that this flag may only be set if 
+ *		create_file is also TRUE.
+ *
+ *              Return pointers to the cache data structure and file data
+ *              structures.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/14/15
+ *
+ * Modifications:
+ *
+ *              Modified function to handle parallel file creates / opens.
+ *              
+ *                                                 JRM -- 2/1/17
+ *
+ *              Modified function to handle 
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+open_hdf5_file(const hbool_t create_file,
+               const hbool_t mdci_sbem_expected,
+	       const hbool_t read_only,
+	       const hbool_t set_mdci_fapl,
+	       const hbool_t config_fsm,
+               const hbool_t enable_page_buffer,
+	       const char * hdf_file_name,
+               const unsigned cache_image_flags,
+               hid_t * file_id_ptr,
+               H5F_t ** file_ptr_ptr,
+               H5C_t ** cache_ptr_ptr,
+               MPI_Comm comm, 
+               MPI_Info info, 
+               int l_facc_type,
+               const hbool_t all_coll_metadata_ops,
+               const hbool_t coll_metadata_write,
+               const int md_write_strat)
+{
+    const char * fcn_name = "open_hdf5_file()";
+    hbool_t show_progress = FALSE;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    hid_t fapl_id = -1;
+    hid_t fcpl_id = -1;
+    hid_t file_id = -1;
+    herr_t result;
+    H5F_t * file_ptr = NULL;
+    H5C_t * cache_ptr = NULL;
+    H5C_cache_image_ctl_t image_ctl;
+    H5AC_cache_image_config_t cache_image_config = {
+        H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+        TRUE,
+        FALSE,
+        H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE};
+
+    HDassert(!create_file || config_fsm);
+
+    if ( pass )
+    {
+	/* opening the file both read only and with a cache image 
+         * requested is a contradiction.  We resolve it by ignoring 
+         * the cache image request silently.
+         */
+        if ( ( create_file && mdci_sbem_expected ) ||
+             ( create_file && read_only ) ||
+             ( config_fsm && !create_file ) ||
+             ( create_file && enable_page_buffer && ! config_fsm ) ||
+             ( hdf_file_name == NULL ) ||
+             ( ( set_mdci_fapl ) && ( cache_image_flags == 0 ) ) ||
+             ( ( set_mdci_fapl ) &&
+               ( (cache_image_flags & ~H5C_CI__ALL_FLAGS) != 0 ) ) ||
+             ( file_id_ptr == NULL ) ||
+             ( file_ptr_ptr == NULL ) ||
+             ( cache_ptr_ptr == NULL ) ||
+             ( l_facc_type != (l_facc_type & (FACC_MPIO)) ) ) {
+
+            failure_mssg =
+               "Bad param(s) on entry to open_hdf5_file().\n";
+
+            pass = FALSE;
+        } else  if ( verbose ) {
+
+            HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
+                      fcn_name, hdf_file_name);
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* create a file access propertly list. */
+    if ( pass ) {
+
+        fapl_id = H5Pcreate(H5P_FILE_ACCESS);
+
+        if ( fapl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* call H5Pset_libver_bounds() on the fapl_id */
+    if ( pass ) {
+
+        if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) 
+                < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_libver_bounds() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get metadata cache image config -- verify that it is the default */
+    if ( pass ) {
+
+        result = H5Pget_mdc_image_config(fapl_id, &cache_image_config);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pget_mdc_image_config() failed.\n";
+        }
+
+        if ( ( cache_image_config.version !=
+               H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+             ( cache_image_config.generate_image != FALSE ) ||
+             ( cache_image_config.save_resize_status != FALSE ) ||
+             ( cache_image_config.entry_ageout != 
+               H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected default cache image config.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* set metadata cache image fapl entry if indicated */
+    if ( ( pass ) && ( set_mdci_fapl ) ) {
+
+        /* set cache image config fields to taste */
+        cache_image_config.generate_image = TRUE;
+        cache_image_config.save_resize_status = FALSE;
+        cache_image_config.entry_ageout = H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE;
+
+        result = H5Pset_mdc_image_config(fapl_id, &cache_image_config);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_mdc_image_config() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the persistant free space manager if indicated */
+    if ( ( pass ) && ( config_fsm ) ) {
+
+	fcpl_id = H5Pcreate(H5P_FILE_CREATE);
+
+	if ( fcpl_id <= 0 ) {
+
+	    pass = FALSE;
+	    failure_mssg = "H5Pcreate(H5P_FILE_CREATE) failed.";
+	}
+    }
+
+    if ( ( pass ) && ( config_fsm ) ) {
+
+        if ( H5Pset_file_space_strategy(fcpl_id, H5F_FSPACE_STRATEGY_PAGE, 
+                                        TRUE, (hsize_t)1) == FAIL ) {
+            pass = FALSE;
+            failure_mssg = "H5Pset_file_space_strategy() failed.\n";
+        }
+    }
+
+    if ( ( pass ) && ( config_fsm ) ) {
+
+        if ( H5Pset_file_space_page_size(fcpl_id, PAGE_SIZE) == FAIL ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_file_space_page_size() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the page buffer if indicated */
+    if ( ( pass ) && ( enable_page_buffer ) ) {
+
+        if ( H5Pset_page_buffer_size(fapl_id, PB_SIZE, 0, 0) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_page_buffer_size() failed.\n";
+        } 
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    if ( ( pass ) && ( l_facc_type == FACC_MPIO ) ) {
+
+        /* set Parallel access with communicator */
+        if ( H5Pset_fapl_mpio(fapl_id, comm, info) < 0 ) {
+ 
+            pass = FALSE;
+            failure_mssg = "H5Pset_fapl_mpio() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( ( pass ) && ( l_facc_type == FACC_MPIO ) ) {
+
+        if (H5Pset_all_coll_metadata_ops(fapl_id, all_coll_metadata_ops) < 0) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_all_coll_metadata_ops() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( ( pass ) && ( l_facc_type == FACC_MPIO ) ) {
+
+        if ( H5Pset_coll_metadata_write(fapl_id, coll_metadata_write) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_coll_metadata_write() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( ( pass ) && ( l_facc_type == FACC_MPIO ) ) {
+
+        /* set the desired parallel metadata write strategy */
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+        
+        if ( H5Pget_mdc_config(fapl_id, &mdc_config) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pget_mdc_config() failed.\n";
+        }
+
+        mdc_config.metadata_write_strategy = md_write_strat;
+
+        if ( H5Pset_mdc_config(fapl_id, &mdc_config) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_mdc_config() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* open the file */
+    if ( pass ) {
+
+        if ( create_file ) {
+
+	    if ( fcpl_id != -1 )
+
+                file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, 
+				    fcpl_id, fapl_id);
+	    else
+
+		file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, 
+                                    H5P_DEFAULT, fapl_id);
+
+        } else {
+
+            if ( read_only )
+
+                file_id = H5Fopen(hdf_file_name, H5F_ACC_RDONLY, fapl_id);
+
+            else
+
+                file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id);
+        }
+
+        if ( file_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fcreate() or H5Fopen() failed.\n";
+
+        } else {
+
+            file_ptr = (struct H5F_t *)H5I_object_verify(file_id, H5I_FILE);
+
+            if ( file_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "Can't get file_ptr.";
+
+                if ( verbose ) {
+                    HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name);
+                }
+            }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get a pointer to the files internal data structure and then
+     * to the cache structure
+     */
+    if ( pass ) {
+
+        if ( file_ptr->shared->cache == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "can't get cache pointer(1).\n";
+
+        } else {
+
+            cache_ptr = file_ptr->shared->cache;
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* verify expected page buffer status.  At present, page buffering 
+     * must be disabled in parallel -- hopefully this will change in the 
+     * future.
+     */
+    if ( pass ) {
+
+        if ( ( file_ptr->shared->page_buf ) &&
+             ( ( ! enable_page_buffer ) || ( l_facc_type == FACC_MPIO ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "page buffer unexepectedly enabled.";
+
+        } else if ( ( file_ptr->shared->page_buf != NULL ) &&
+             ( ( enable_page_buffer ) || ( l_facc_type != FACC_MPIO ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "page buffer unexepectedly disabled.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* verify expected metadata cache status */
+
+    /* get the cache image control structure from the cache, and verify
+     * that it contains the expected values.
+     *
+     * Then set the flags in this structure to the specified value.
+     */
+    if ( pass ) {
+
+        if ( H5C_get_cache_image_config(cache_ptr, &image_ctl) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "error returned by H5C_get_cache_image_config().";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    if ( pass ) {
+
+        if ( set_mdci_fapl ) {
+
+	    if ( read_only ) {
+
+                if ( ( image_ctl.version != 
+                       H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                     ( image_ctl.generate_image != FALSE ) ||
+                     ( image_ctl.save_resize_status != FALSE ) ||
+                     ( image_ctl.entry_ageout != 
+                       H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                     ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "Unexpected image_ctl values(1).\n";
+                }
+	    } else {
+
+                if ( ( image_ctl.version != 
+                       H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                     ( image_ctl.generate_image != TRUE ) || 
+                     ( image_ctl.save_resize_status != FALSE ) ||
+                     ( image_ctl.entry_ageout != 
+                       H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                     ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "Unexpected image_ctl values(2).\n";
+                }
+            }
+        } else {
+
+            if ( ( image_ctl.version != 
+                   H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION ) ||
+                 ( image_ctl.generate_image != FALSE ) ||
+                 ( image_ctl.save_resize_status != FALSE ) ||
+                 ( image_ctl.entry_ageout != 
+                   H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE ) ||
+                 ( image_ctl.flags != H5C_CI__ALL_FLAGS ) ) {
+
+                pass = FALSE;
+                failure_mssg = "Unexpected image_ctl values(3).\n";
+            }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( ( pass ) && ( set_mdci_fapl ) ) {
+
+        image_ctl.flags = cache_image_flags;
+
+        if ( H5C_set_cache_image_config(file_ptr, cache_ptr, &image_ctl) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "error returned by H5C_set_cache_image_config().";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        if ( cache_ptr->close_warning_received == TRUE ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected value of close_warning_received.\n";
+        }
+
+        if ( mdci_sbem_expected ) {
+
+            if ( read_only ) {
+
+                if ( ( cache_ptr->load_image != TRUE ) ||
+                     ( cache_ptr->delete_image != FALSE ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "mdci sb extension message not present?\n";
+                }
+            } else {
+
+                if ( ( cache_ptr->load_image != TRUE ) ||
+                     ( cache_ptr->delete_image != TRUE ) ) {
+
+                    pass = FALSE;
+                    failure_mssg = "mdci sb extension message not present?\n";
+                }
+	    }
+        } else {
+
+	    if ( ( cache_ptr->load_image == TRUE ) ||
+                 ( cache_ptr->delete_image == TRUE ) ) {
+
+                pass = FALSE;
+                failure_mssg = "mdci sb extension message present?\n";
+	    }
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        *file_id_ptr = file_id;
+        *file_ptr_ptr = file_ptr;
+        *cache_ptr_ptr = cache_ptr;
+    }
+
+    if ( show_progress ) {
+        HDfprintf(stdout, "%s: cp = %d, pass = %d -- exiting.\n", 
+                  fcn_name, cp++, pass);
+
+        if ( ! pass )
+            HDfprintf(stdout, "%s: failure_mssg = %s\n", 
+                      fcn_name, failure_mssg);
+    }
+
+    return;
+
+} /* open_hdf5_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    par_create_dataset()
+ *
+ * Purpose:     Collectively create a chunked dataset, and fill it with 
+ *              known values.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/4/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+par_create_dataset(int dset_num,
+                   hid_t file_id,
+                   int mpi_rank,
+                   int mpi_size)
+{
+    const char * fcn_name = "par_create_dataset()";
+    char dset_name[256];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l;
+    int data_chunk[1][CHUNK_SIZE][CHUNK_SIZE];
+    hsize_t dims[3];
+    hsize_t a_size[3];
+    hsize_t offset[3];
+    hsize_t chunk_size[3];
+    hid_t status;
+    hid_t dataspace_id = -1;
+    hid_t memspace_id = -1;
+    hid_t dset_id = -1;
+    hid_t filespace_id = -1;
+    hid_t dcpl_id = -1;
+    hid_t dxpl_id = -1;
+
+    show_progress = (show_progress && (mpi_rank == 0));
+    verbose       = (verbose && (mpi_rank == 0));
+
+    sprintf(dset_name, "/dset%03d", dset_num);
+
+    if ( show_progress ) {
+        HDfprintf(stdout, "%s: dset name = \"%s\".\n", fcn_name, dset_name);
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+    }
+
+    if ( pass ) {
+
+        /* create a dataspace for the chunked dataset */
+        dims[0] = (hsize_t)mpi_size;
+        dims[1] = DSET_SIZE;
+        dims[2] = DSET_SIZE;
+        dataspace_id = H5Screate_simple(3, dims, NULL);
+
+        if ( dataspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* set the dataset creation plist to specify that the raw data is
+     * to be partioned into 1X10X10 element chunks.
+     */
+
+    if ( pass ) {
+
+        dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
+
+        if ( dcpl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate(H5P_DATASET_CREATE) failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        chunk_size[0] = 1;
+        chunk_size[1] = CHUNK_SIZE;
+        chunk_size[2] = CHUNK_SIZE;
+
+        if ( H5Pset_chunk(dcpl_id, 3, chunk_size) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_chunk() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* create the dataset */
+    if ( pass ) {
+
+        dset_id = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE,
+                             dataspace_id, H5P_DEFAULT,
+                             dcpl_id, H5P_DEFAULT);
+
+        if ( dset_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dcreate() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* get the file space ID */
+    if ( pass ) {
+
+        filespace_id = H5Dget_space(dset_id);
+
+        if ( filespace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dget_space() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* create the mem space to be used to read and write chunks */
+    if ( pass ) {
+
+        dims[0] = 1;
+        dims[1] = CHUNK_SIZE;
+        dims[2] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(3, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;                  /* offset of hyperslab in memory */
+        offset[1] = 0;
+        offset[2] = 0;
+        a_size[0] = 1;                  /* size of hyperslab */
+        a_size[1] = CHUNK_SIZE;
+        a_size[2] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the DXPL for collective I/O */
+    if ( pass ) {
+
+        dxpl_id = H5Pcreate(H5P_DATASET_XFER);
+
+        if ( dxpl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate(H5P_DATASET_XFER) failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        if ( H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_COLLECTIVE) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_dxpl_mpio() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* initialize the dataset with collective writes */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: cp = %d.0, pass = %d.\n", 
+                          fcn_name, cp, pass);
+
+            /* initialize the slab */
+            for ( k = 0; k < CHUNK_SIZE; k++ )
+            {
+                for ( l = 0; l < CHUNK_SIZE; l++ )
+                {
+                    data_chunk[0][k][l] = (DSET_SIZE * DSET_SIZE * mpi_rank) +
+                                          (DSET_SIZE * (i + k)) + j + l +
+                                          dset_num;
+                }
+            }
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: cp = %d.1, pass = %d.\n", 
+                          fcn_name, cp, pass);
+
+            /* select on disk hyperslab */
+            offset[0] = (hsize_t)mpi_rank; /* offset of hyperslab in file */
+            offset[1] = (hsize_t)i;
+            offset[2] = (hsize_t)j;
+            a_size[0] = (hsize_t)1;        /* size of hyperslab */
+            a_size[1] = CHUNK_SIZE;  
+            a_size[2] = CHUNK_SIZE;
+            status = H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET,
+                                         offset, NULL, a_size, NULL);
+
+            if ( status < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "disk H5Sselect_hyperslab() failed.";
+            }
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: cp = %d.2, pass = %d.\n", 
+                          fcn_name, cp, pass);
+
+            /* write the chunk to file */
+            status = H5Dwrite(dset_id, H5T_NATIVE_INT, memspace_id,
+                              filespace_id, dxpl_id, data_chunk);
+
+            if ( status < 0 ) {
+
+                pass = FALSE;
+                failure_mssg = "H5Dwrite() failed.";
+            }
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: cp = %d.3, pass = %d.\n", 
+                          fcn_name, cp, pass);
+
+            j += CHUNK_SIZE;
+        }
+
+        i += CHUNK_SIZE;
+    }
+
+    cp++;
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* read data from data sets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            /* select on disk hyperslab */
+            offset[0] = (hsize_t)mpi_rank;
+            offset[1] = (hsize_t)i; /* offset of hyperslab in file */
+            offset[2] = (hsize_t)j;
+            a_size[0] = (hsize_t)1;
+            a_size[1] = CHUNK_SIZE; /* size of hyperslab */
+            a_size[2] = CHUNK_SIZE;
+
+            status = H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET,
+                                         offset, NULL, a_size, NULL);
+
+            if ( status < 0 ) {
+
+               pass = FALSE;
+               failure_mssg = "disk hyperslab create failed.";
+            }
+
+            /* read the chunk from file */
+            if ( pass ) {
+
+                status = H5Dread(dset_id, H5T_NATIVE_INT,
+                                 memspace_id, filespace_id,
+                                 dxpl_id, data_chunk);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "chunk read failed.";
+                }
+            }
+
+            /* validate the slab */
+            if ( pass ) {
+
+                valid_chunk = TRUE;
+                for ( k = 0; k < CHUNK_SIZE; k++ )
+                {
+                    for ( l = 0; l < CHUNK_SIZE; l++ )
+                    {
+                        if ( data_chunk[0][k][l]
+                             !=
+                             ((DSET_SIZE * DSET_SIZE * mpi_rank) +
+                              (DSET_SIZE * (i + k)) + j + l + dset_num) ) {
+
+                            valid_chunk = FALSE;
+
+                            if ( verbose ) {
+
+                                HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[0][k][l],
+                                    ((DSET_SIZE * DSET_SIZE * mpi_rank) +
+                                     (DSET_SIZE * (i + k)) + j + l + dset_num));
+                                    HDfprintf(stdout,
+                                    "dset_num = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                    dset_num, i, j, k, l);
+                            }
+                        }
+                    }
+                }
+
+                if ( ! valid_chunk ) {
+
+                    pass = FALSE;
+                    failure_mssg = "slab validation failed.";
+
+                    if ( verbose ) {
+
+                        fprintf(stdout,
+                                "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                i, j, dset_num);
+                    }
+                }
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* close the data space */
+    if ( ( pass ) && ( H5Sclose(dataspace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(dataspace_id) failed.";
+    }
+
+    /* close the file space */
+    if ( ( pass ) && ( H5Sclose(filespace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(filespace_id) failed.";
+    }
+
+    /* close the dataset */
+    if ( ( pass ) && ( H5Dclose(dset_id) < 0 ) )  {
+
+        pass = FALSE;
+        failure_mssg = "H5Dclose(dset_id) failed.";
+    }
+
+    /* close the mem space */
+    if ( ( pass ) && ( H5Sclose(memspace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(memspace_id) failed.";
+    }
+
+    /* close the dataset creation property list */
+    if ( ( pass ) && ( H5Pclose(dcpl_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Pclose(dcpl) failed.";
+    }
+
+    /* close the data access property list */
+    if ( ( pass ) && ( H5Pclose(dxpl_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Pclose(dxpl) failed.";
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    return;
+
+} /* par_create_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    par_delete_dataset()
+ *
+ * Purpose:     Collectively delete the specified dataset.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/6/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+par_delete_dataset(int dset_num,
+                   hid_t file_id,
+                   int mpi_rank)
+{
+    const char * fcn_name = "par_delete_dataset()";
+    char dset_name[256];
+    hbool_t show_progress = FALSE;
+    int cp = 0;
+
+    show_progress = (show_progress && (mpi_rank == 0));
+
+    sprintf(dset_name, "/dset%03d", dset_num);
+
+    if ( show_progress ) {
+        HDfprintf(stdout, "%s: dset name = \"%s\".\n", fcn_name, dset_name);
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+    }
+
+    /* verify the target dataset */
+    if ( pass ) {
+
+        par_verify_dataset(dset_num, file_id, mpi_rank);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* delete the target dataset */
+    if ( pass ) {
+
+        if ( H5Ldelete(file_id, dset_name, H5P_DEFAULT) < 0) {
+
+            pass = FALSE;
+            failure_mssg = "H5Ldelete() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    return;
+
+} /* par_delete_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    par_insert_cache_image()
+ *
+ * Purpose:     Insert a cache image in the supplied file.
+ *
+ *              At present, cache image is not enabled in the parallel 
+ *              so we have to insert the cache image with a serial 
+ *              process.  Do this via a fork and an execv from process 0.
+ *              All processes wait until the child process completes, and
+ *              then return.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/8/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+par_insert_cache_image(int file_name_idx, int mpi_rank, int mpi_size )
+{
+    hbool_t show_progress = FALSE;
+
+    if ( pass ) {
+
+        if ( mpi_rank == 0 ) { /* insert cache image in supplied test file */
+
+            char file_name_idx_str[32];
+            char mpi_size_str[32];
+            int child_status;
+            pid_t child_pid;
+
+            sprintf(file_name_idx_str, "%d", file_name_idx);
+            sprintf(mpi_size_str, "%d", mpi_size);
+
+            child_pid = fork();
+
+            if ( child_pid == 0 ) { /* this is the child process */
+
+                /* fun and games to shutup the compiler */
+                char param0[32] = "t_cache_image";
+                char param1[32] = "ici";
+                char * child_argv[] = {param0, 
+                                       param1, 
+                                       file_name_idx_str, 
+                                       mpi_size_str, 
+                                       NULL};
+
+                /* we may need to play with the path here */
+                if ( execv("t_cache_image", child_argv) == -1 ) {
+
+                    HDfprintf(stdout, 
+                             "execl() of ici process failed. errno = %d(%s)\n",
+                             errno, strerror(errno));
+                    exit(1);
+                }
+
+            } else if ( child_pid != -1 ) {  
+                /* this is the parent process -- wait until child is done */
+                if ( -1 == waitpid(child_pid, &child_status, WUNTRACED)) {
+
+                    HDfprintf(stdout, "can't wait on ici process.\n");
+                    pass = FALSE;
+
+                } else if ( ! WIFEXITED(child_status) ) {
+
+                    HDfprintf(stdout, "ici process hasn't exitied.\n");
+                    pass = FALSE;
+
+                } else if ( WEXITSTATUS(child_status) != 0 ) {
+
+                    HDfprintf(stdout, "ici process reports failure.\n");
+                    pass = FALSE;
+
+                } else if ( show_progress ) {
+
+                    HDfprintf(stdout, "cache image insertion complete.\n");
+                }
+            } else { /* fork failed */
+
+                HDfprintf(stdout, 
+                          "can't create process to insert cache image.\n");
+                pass = FALSE;
+            }
+        }
+    }
+
+    if ( pass ) {
+
+        /* make sure insertion of the cache image is complete 
+         * before proceeding 
+         */
+        MPI_Barrier(MPI_COMM_WORLD);
+    }
+
+    return;
+
+} /* par_insert_cache_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    par_verify_dataset()
+ *
+ * Purpose:     Collectively verify the contents of a chunked dataset.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/6/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+par_verify_dataset(int dset_num,
+                   hid_t file_id,
+                   int mpi_rank)
+{
+    const char * fcn_name = "par_verify_dataset()";
+    char dset_name[256];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l;
+    int data_chunk[1][CHUNK_SIZE][CHUNK_SIZE];
+    hsize_t dims[3];
+    hsize_t a_size[3];
+    hsize_t offset[3];
+    hid_t status;
+    hid_t memspace_id = -1;
+    hid_t dset_id = -1;
+    hid_t filespace_id = -1;
+    hid_t dxpl_id = -1;
+
+    show_progress = (show_progress && (mpi_rank == 0));
+    verbose       = (verbose && (mpi_rank == 0));
+
+    sprintf(dset_name, "/dset%03d", dset_num);
+
+    if ( show_progress ) {
+        HDfprintf(stdout, "%s: dset name = \"%s\".\n", fcn_name, dset_name);
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+    }
+
+    if ( pass ) {
+
+        /* open the dataset */
+
+        dset_id = H5Dopen2(file_id, dset_name, H5P_DEFAULT);
+
+        if ( dset_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dopen2() failed.";
+        }
+    }
+
+    /* get the file space ID */
+    if ( pass ) {
+
+        filespace_id = H5Dget_space(dset_id);
+
+        if ( filespace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dget_space() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* create the mem space to be used to read */
+    if ( pass ) {
+
+        dims[0] = 1;
+        dims[1] = CHUNK_SIZE;
+        dims[2] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(3, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;                  /* offset of hyperslab in memory */
+        offset[1] = 0;
+        offset[2] = 0;
+        a_size[0] = 1;                  /* size of hyperslab */
+        a_size[1] = CHUNK_SIZE;
+        a_size[2] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the DXPL for collective I/O */
+    if ( pass ) {
+
+        dxpl_id = H5Pcreate(H5P_DATASET_XFER);
+
+        if ( dxpl_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pcreate(H5P_DATASET_XFER) failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    if ( pass ) {
+
+        if ( H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_COLLECTIVE) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Pset_dxpl_mpio() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* read data from data sets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            /* select on disk hyperslab */
+            offset[0] = (hsize_t)mpi_rank;
+            offset[1] = (hsize_t)i; /* offset of hyperslab in file */
+            offset[2] = (hsize_t)j;
+            a_size[0] = (hsize_t)1;
+            a_size[1] = CHUNK_SIZE; /* size of hyperslab */
+            a_size[2] = CHUNK_SIZE;
+
+            status = H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET,
+                                         offset, NULL, a_size, NULL);
+
+            if ( status < 0 ) {
+
+               pass = FALSE;
+               failure_mssg = "disk hyperslab create failed.";
+            }
+
+            /* read the chunk from file */
+            if ( pass ) {
+
+                status = H5Dread(dset_id, H5T_NATIVE_INT,
+                                 memspace_id, filespace_id,
+                                 dxpl_id, data_chunk);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "chunk read failed.";
+                }
+            }
+
+            /* validate the slab */
+            if ( pass ) {
+
+                valid_chunk = TRUE;
+                for ( k = 0; k < CHUNK_SIZE; k++ )
+                {
+                    for ( l = 0; l < CHUNK_SIZE; l++ )
+                    {
+                        if ( data_chunk[0][k][l]
+                             !=
+                             ((DSET_SIZE * DSET_SIZE * mpi_rank) +
+                              (DSET_SIZE * (i + k)) + j + l + dset_num) ) {
+
+                            valid_chunk = FALSE;
+
+                            if ( verbose ) {
+
+                                HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[0][k][l],
+                                    ((DSET_SIZE * DSET_SIZE * mpi_rank) +
+                                     (DSET_SIZE * (i + k)) + j + l + dset_num));
+                                    HDfprintf(stdout,
+                                    "dset_num = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                    dset_num, i, j, k, l);
+                            }
+                        }
+                    }
+                }
+
+                if ( ! valid_chunk ) {
+
+                    pass = FALSE;
+                    failure_mssg = "slab validation failed.";
+
+                    if ( verbose ) {
+
+                        fprintf(stdout,
+                                "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                i, j, dset_num);
+                    }
+                }
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* close the file space */
+    if ( ( pass ) && ( H5Sclose(filespace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(filespace_id) failed.";
+    }
+
+    /* close the dataset */
+    if ( ( pass ) && ( H5Dclose(dset_id) < 0 ) )  {
+
+        pass = FALSE;
+        failure_mssg = "H5Dclose(dset_id) failed.";
+    }
+
+    /* close the mem space */
+    if ( ( pass ) && ( H5Sclose(memspace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(memspace_id) failed.";
+    }
+
+    /* close the data access property list */
+    if ( ( pass ) && ( H5Pclose(dxpl_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Pclose(dxpl) failed.";
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    return;
+
+} /* par_verify_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    serial_insert_cache_image()
+ *
+ * Purpose:     Insert a cache image in the supplied file.
+ *
+ * 		To populate the cache image, validate the contents 
+ * 		of the file before closing.
+ *
+ *              On failure, print an appropriate error message and 
+ *              return FALSE.
+ *
+ * Return:      TRUE if succussful, FALSE otherwise.
+ *
+ * Programmer:  John Mainzer
+ *              3/8/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static hbool_t
+serial_insert_cache_image(int file_name_idx, int mpi_size )
+{
+    const char * fcn_name = "serial_insert_cache_image()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    int cp = 0;
+    int i;
+    int num_dsets = PAR_NUM_DSETS;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    MPI_Comm dummy_comm = MPI_COMM_WORLD;
+    MPI_Info dummy_info = MPI_INFO_NULL;
+
+    pass = TRUE;
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) setup the file name */
+    if ( pass ) {
+
+        HDassert(FILENAMES[file_name_idx]);
+
+        if ( h5_fixname(FILENAMES[file_name_idx], H5P_DEFAULT,
+                                  filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            HDfprintf(stdout, "h5_fixname() failed.\n");
+        }
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Open the PHDF5 file with the cache image FAPL entry. 
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ FALSE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ TRUE,
+                       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ dummy_comm,
+                       /* info                  */ dummy_info,
+                       /* l_facc_type           */ 0,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ 1);
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Validate contents of the file */
+
+    i = 0;
+    while ( ( pass ) && ( i < num_dsets ) ) {
+
+        serial_verify_dataset(i, file_id, mpi_size);
+        i++;
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 4) Close the file */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+        }
+    }
+
+    if ( show_progress )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    return pass;
+
+} /* serial_insert_cache_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    serial_verify_dataset()
+ *
+ * Purpose:     Verify the contents of a chunked dataset.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/6/17
+ *
+ * Modifications:
+ *
+ *              None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+serial_verify_dataset(int dset_num,
+                      hid_t file_id,
+                      int mpi_size)
+{
+    const char * fcn_name = "serial_verify_dataset()";
+    char dset_name[256];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l, m;
+    int data_chunk[1][CHUNK_SIZE][CHUNK_SIZE];
+    hsize_t dims[3];
+    hsize_t a_size[3];
+    hsize_t offset[3];
+    hid_t status;
+    hid_t memspace_id = -1;
+    hid_t dset_id = -1;
+    hid_t filespace_id = -1;
+
+    sprintf(dset_name, "/dset%03d", dset_num);
+
+    if ( show_progress ) {
+        HDfprintf(stdout, "%s: dset name = \"%s\".\n", fcn_name, dset_name);
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+    }
+
+    if ( pass ) {
+
+        /* open the dataset */
+
+        dset_id = H5Dopen2(file_id, dset_name, H5P_DEFAULT);
+
+        if ( dset_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dopen2() failed.";
+        }
+    }
+
+    /* get the file space ID */
+    if ( pass ) {
+
+        filespace_id = H5Dget_space(dset_id);
+
+        if ( filespace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dget_space() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* create the mem space to be used to read */
+    if ( pass ) {
+
+        dims[0] = 1;
+        dims[1] = CHUNK_SIZE;
+        dims[2] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(3, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;                  /* offset of hyperslab in memory */
+        offset[1] = 0;
+        offset[2] = 0;
+        a_size[0] = 1;                  /* size of hyperslab */
+        a_size[1] = CHUNK_SIZE;
+        a_size[2] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* read data from data sets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < mpi_size ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            k = 0;
+            while ( ( pass ) && ( k < DSET_SIZE ) )
+            {
+                /* select on disk hyperslab */
+                offset[0] = (hsize_t)i; /* offset of hyperslab in file */
+                offset[1] = (hsize_t)j; /* offset of hyperslab in file */
+                offset[2] = (hsize_t)k;
+                a_size[0] = (hsize_t)1;
+                a_size[1] = CHUNK_SIZE; /* size of hyperslab */
+                a_size[2] = CHUNK_SIZE;
+
+                status = H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "disk hyperslab create failed.";
+                }
+
+                /* read the chunk from file */
+                if ( pass ) {
+
+                    status = H5Dread(dset_id, H5T_NATIVE_INT,
+                                     memspace_id, filespace_id,
+                                     H5P_DEFAULT, data_chunk);
+
+                    if ( status < 0 ) {
+
+                       pass = FALSE;
+                       failure_mssg = "chunk read failed.";
+                    }
+                }
+
+                /* validate the slab */
+                if ( pass ) {
+
+                    valid_chunk = TRUE;
+
+                    for ( l = 0; l < CHUNK_SIZE; l++ )
+                    {
+                        for ( m = 0; m < CHUNK_SIZE; m++ )
+                        {
+                            if ( data_chunk[0][l][m]
+                                 !=
+                                 ((DSET_SIZE * DSET_SIZE * i) +
+                                  (DSET_SIZE * (j + l)) + k + m + dset_num) ) {
+
+                                valid_chunk = FALSE;
+
+                                if ( verbose ) {
+
+                                    HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    j, k, data_chunk[0][j][k],
+                                    ((DSET_SIZE * DSET_SIZE * i) +
+                                     (DSET_SIZE * (j + l)) + k + m + dset_num));
+                                    HDfprintf(stdout,
+                                    "dset_num = %d, i = %d, j = %d, k = %d, l = %d, m = %d\n",
+                                    dset_num, i, j, k, l, m);
+                                }
+                            }
+                        }
+                    }
+
+                    if ( ! valid_chunk ) {
+
+                        pass = FALSE;
+                        failure_mssg = "slab validation failed.";
+
+                        if ( verbose ) {
+
+                            fprintf(stdout,
+                                  "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                   j, k, dset_num);
+                        }
+                    }
+                }
+                k += CHUNK_SIZE;
+            }
+            j += CHUNK_SIZE;
+        }
+        i++;
+    }
+
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* close the file space */
+    if ( ( pass ) && ( H5Sclose(filespace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(filespace_id) failed.";
+    }
+
+    /* close the dataset */
+    if ( ( pass ) && ( H5Dclose(dset_id) < 0 ) )  {
+
+        pass = FALSE;
+        failure_mssg = "H5Dclose(dset_id) failed.";
+    }
+
+    /* close the mem space */
+    if ( ( pass ) && ( H5Sclose(memspace_id) < 0 ) ) {
+
+        pass = FALSE;
+        failure_mssg = "H5Sclose(memspace_id) failed.";
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    return;
+
+} /* serial_verify_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    parse_flags
+ *
+ * Purpose:     Parse the flags passed to this program, and load the 
+ *              values into the supplied field.
+ *
+ * Return:      Success:        1
+ *              Failure:        0
+ *
+ * Programmer:  J Mainzer
+ *              4/28/11
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+parse_flags(int argc, char * argv[], hbool_t * setup_ptr, 
+    hbool_t * ici_ptr, int * file_idx_ptr, int * mpi_size_ptr, hbool_t display)
+{
+    const char * fcn_name = "parse_flags()";
+    const char * (ops[]) = {"setup", "ici"};
+    int success = TRUE;
+
+    HDassert(setup_ptr);
+    HDassert(*setup_ptr == FALSE);
+    HDassert(ici_ptr);
+    HDassert(*ici_ptr == FALSE);
+    HDassert(file_idx_ptr);
+    HDassert(mpi_size_ptr);
+
+    if ( setup_ptr == NULL ) {
+
+        success = FALSE;
+        HDfprintf(stdout, "%s: bad arg(s) on entry.\n", fcn_name);
+    }
+
+
+    if ( ( success ) && 
+         ( ( argc != 1 ) && ( argc != 2 ) && ( argc != 4 ) ) ) {
+
+        success = FALSE;
+        usage();
+    }
+
+
+    if ( ( success ) && ( argc >= 2 ) ) {
+
+        if ( strcmp(argv[1], ops[0]) == 0 ) {
+
+            if ( argc != 2 ) {
+
+                success = FALSE;
+                usage();
+
+            } else {
+
+                *setup_ptr = TRUE;
+
+            }
+        } else if ( strcmp(argv[1], ops[1]) == 0 ) {
+
+            if ( argc != 4 ) {
+
+                success = FALSE;
+                usage();
+
+            } else {
+
+                *ici_ptr = TRUE;
+                *file_idx_ptr = atoi(argv[2]);
+                *mpi_size_ptr = atoi(argv[3]);
+
+            }
+        }
+    }
+
+    if ( ( success ) && ( display ) ) {
+
+        if ( *setup_ptr )
+
+            HDfprintf(stdout, "t_cache_image setup\n");
+
+        else if ( *ici_ptr )
+
+            HDfprintf(stdout, "t_cache_image ici %d %d\n", 
+                      *file_idx_ptr, *mpi_size_ptr);
+
+        else
+
+            HDfprintf(stdout, "t_cache_image\n");
+    }
+
+    return(success);
+
+} /* parse_flags() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Display a brief message describing the purpose and use
+ *              of the program.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              4/28/11 
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+usage(void)
+{
+    const char * s[] =
+    {
+        "\n",
+        "t_cache_image:\n",
+        "\n",
+        "Run the parallel cache image tests.  \n"
+        "\n"
+        "In general, this program is run via MPI.  However, at present, files\n"
+        "with cache images can only be constructed by serial processes.\n",
+        "\n",
+        "To square this circle, one process in the parallel computation \n"
+        "forks a serial version of the test program to handle this detail.\n",
+        "The \"setup\" parameter indicates that t_cache_image is being \n",
+        "invokde for this purpose.\n",
+        "\n",
+        "Similarly, only a serial process can add a cache image to an\n",
+        "existing file.\n",
+        "\n",
+        "Here again, one process forks a serial version of the test program\n",
+        "with the \"ici\" parameter.\n"
+        "\n",
+        "usage: t_cache_image [setup|ici m n]\n",
+        "\n",
+        "where:\n",
+        "\n",
+        "       setup parameter forces creation of test file\n",
+        "\n",
+        "       ici parameter forces insertion of a cache image into the \n",
+        "       m   th test file, created by a parallel computation with .\n",
+        "       n   processes\n",
+        "\n",
+        "Returns 0 on success, 1 on failure.\n",
+        "\n",
+        NULL,
+    };
+    int i = 0;
+
+    while(s[i] != NULL) {
+        fprintf(stdout, "%s", s[i]);
+        i++;
+    }
+
+    return;
+} /* usage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_data_sets()
+ *
+ * Purpose:     If pass is TRUE on entry, verify that the data sets in the 
+ *		file exist and contain the expected data.  
+ *
+ *		Note that these data sets were created by 
+ *		create_data_sets() above.  Thus any changes in that 
+ *		function must be reflected in this function, and 
+ *		vise-versa.
+ *
+ *              On failure, set pass to FALSE, and set failure_mssg
+ *              to point to an appropriate failure message.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              7/15/15
+ *
+ * Modifications:
+ *
+ *              Added min_dset and max_dset parameters and supporting 
+ *		code.  This allows the caller to specify a range of 
+ *		datasets to verify.
+ *						JRM -- 8/20/15
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void 
+verify_data_sets(hid_t file_id, int min_dset, int max_dset)
+{
+    const char * fcn_name = "verify_data_sets()";
+    char dset_name[64];
+    hbool_t show_progress = FALSE;
+    hbool_t valid_chunk;
+    hbool_t verbose = FALSE;
+    int cp = 0;
+    int i, j, k, l, m;
+    int data_chunk[CHUNK_SIZE][CHUNK_SIZE];
+    herr_t status;
+    hid_t filespace_ids[MAX_NUM_DSETS];
+    hid_t memspace_id = -1;
+    hid_t dataset_ids[MAX_NUM_DSETS];
+    hsize_t dims[2];
+    hsize_t a_size[2];
+    hsize_t offset[2];
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    HDassert(0 <= min_dset);
+    HDassert(min_dset <= max_dset);
+    HDassert(max_dset < MAX_NUM_DSETS);
+
+    /* open the datasets */
+
+    if ( pass ) {
+
+        i = min_dset;
+
+        while ( ( pass ) && ( i <= max_dset ) )
+        {
+            /* open the dataset */
+            if ( pass ) {
+
+                sprintf(dset_name, "/dset%03d", i);
+                dataset_ids[i] = H5Dopen2(file_id, dset_name, H5P_DEFAULT);
+
+                if ( dataset_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dopen2() failed.";
+                }
+            }
+
+            /* get the file space ID */
+            if ( pass ) {
+
+                filespace_ids[i] = H5Dget_space(dataset_ids[i]);
+
+                if ( filespace_ids[i] < 0 ) {
+
+                    pass = FALSE;
+                    failure_mssg = "H5Dget_space() failed.";
+                }
+            }
+
+            i++;
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* create the mem space to be used to read and write chunks */
+    if ( pass ) {
+
+        dims[0] = CHUNK_SIZE;
+        dims[1] = CHUNK_SIZE;
+        memspace_id = H5Screate_simple(2, dims, NULL);
+
+        if ( memspace_id < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Screate_simple() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* select in memory hyperslab */
+    if ( pass ) {
+
+        offset[0] = 0;  /*offset of hyperslab in memory*/
+        offset[1] = 0;
+        a_size[0] = CHUNK_SIZE;  /*size of hyperslab*/
+        a_size[1] = CHUNK_SIZE;
+        status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL,
+                                     a_size, NULL);
+
+        if ( status < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sselect_hyperslab() failed.";
+        }
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+
+    /* read data from data sets and validate it */
+    i = 0;
+    while ( ( pass ) && ( i < DSET_SIZE ) )
+    {
+        j = 0;
+        while ( ( pass ) && ( j < DSET_SIZE ) )
+        {
+            m = min_dset;
+            while ( ( pass ) && ( m <= max_dset ) )
+            {
+
+                /* select on disk hyperslab */
+                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,
+                                             offset, NULL, a_size, NULL);
+
+                if ( status < 0 ) {
+
+                   pass = FALSE;
+                   failure_mssg = "disk hyperslab create failed.";
+                }
+
+                /* read the chunk from file */
+                if ( pass ) {
+
+                    status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, 
+                                     memspace_id, filespace_ids[m], 
+                                     H5P_DEFAULT, data_chunk);
+
+                    if ( status < 0 ) {
+
+                       pass = FALSE;
+                       failure_mssg = "disk hyperslab create failed.";
+                    }
+                }
+
+                /* validate the slab */
+                if ( pass ) {
+
+                    valid_chunk = TRUE;
+                    for ( k = 0; k < CHUNK_SIZE; k++ )
+                    {
+                        for ( l = 0; l < CHUNK_SIZE; l++ )
+                        {
+                            if ( data_chunk[k][l]
+                                 !=
+                                 ((DSET_SIZE * DSET_SIZE * m) +
+                                  (DSET_SIZE * (i + k)) + j + l) ) {
+
+                                valid_chunk = FALSE;
+
+				if ( verbose ) {
+				
+                                    HDfprintf(stdout,
+                                    "data_chunk[%0d][%0d] = %0d, expect %0d.\n",
+                                    k, l, data_chunk[k][l],
+                                    ((DSET_SIZE * DSET_SIZE * m) +
+                                     (DSET_SIZE * (i + k)) + j + l));
+                                    HDfprintf(stdout,
+                                     "m = %d, i = %d, j = %d, k = %d, l = %d\n",
+                                     m, i, j, k, l);
+				}
+                            }
+                        }
+                    }
+
+                    if ( ! valid_chunk ) {
+
+                        pass = FALSE;
+                        failure_mssg = "slab validation failed.";
+
+			if ( verbose ) {
+
+                            fprintf(stdout, 
+                                  "Chunk (%0d, %0d) in /dset%03d is invalid.\n",
+                                  i, j, m);
+			}
+                    }
+                }
+                m++;
+            }
+            j += CHUNK_SIZE;
+        }
+        i += CHUNK_SIZE;
+    }
+
+    if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
+
+    /* close the file spaces */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Sclose(filespace_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose() failed.";
+        }
+        i++;
+    }
+
+
+    /* close the datasets */
+    i = min_dset;
+    while ( ( pass ) && ( i <= max_dset ) )
+    {
+        if ( H5Dclose(dataset_ids[i]) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Dclose() failed.";
+        }
+        i++;
+    }
+
+    /* close the mem space */
+    if ( pass ) {
+
+        if ( H5Sclose(memspace_id) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Sclose(memspace_id) failed.";
+        }
+    }
+
+    return;
+
+} /* verify_data_sets() */
+
+

+/****************************************************************************/
+/******************************* Test Functions *****************************/
+/****************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    verify_cache_image_RO()
+ *
+ * Purpose:     Verify that a HDF5 file containing a cache image is 
+ *              opened R/O and read correctly by PHDF5 with the specified 
+ *              metadata write strategy.
+ *              
+ *              Basic cycle of operation is as follows:
+ *
+ *		1) Open the test file created at the beginning of this 
+ *		   test read only.
+ *
+ *		   Verify that the file contains a cache image.
+ *
+ *		   Verify that only process 0 reads the cache image.
+ *
+ *		   Verify that all other processes receive the cache 
+ *		   image block from process 0.
+ *
+ *              2) Verify that the file contains the expected data.
+ *
+ *              3) Close the file.
+ *
+ *              4) Open the file R/O, and verify that it still contains
+ *                 a cache image.
+ *
+ *              5) Verify that the file contains the expected data.
+ *
+ *              6) Close the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              3/11/17
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+verify_cache_image_RO(int file_name_id, int md_write_strat, int mpi_rank)
+{
+    const char * fcn_name = "verify_cache_image_RO()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    pass = TRUE;
+
+    if ( mpi_rank == 0 ) {
+
+        switch(md_write_strat) {
+
+            case H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
+                TESTING("parallel CI load test -- proc0 md write -- R/O");
+                break;
+
+            case H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
+                TESTING("parallel CI load test -- dist md write -- R/O");
+                break;
+
+            default:
+                TESTING("parallel CI load test -- unknown md write -- R/o");
+                pass = FALSE;
+                break;
+        }
+    }
+
+    show_progress = ( ( show_progress ) && ( mpi_rank == 0 ) );
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[file_name_id], H5P_DEFAULT, 
+                        filename, sizeof(filename)) == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Open the test file created at the beginning of this test.
+     *
+     *    Verify that the file contains a cache image.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ TRUE,
+                       /* set_mdci_fapl         */ FALSE,
+		       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ MPI_COMM_WORLD,
+                       /* info                  */ MPI_INFO_NULL,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ md_write_strat);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Verify that the file contains the expected data. 
+     *
+     *    Verify that only process 0 reads the cache image.
+     *
+     *    Verify that all other processes receive the cache 
+     *    image block from process 0.
+     */
+
+    if ( pass ) {
+
+       verify_data_sets(file_id, 0, MAX_NUM_DSETS - 1);
+    }
+
+    /* Verify that only process 0 reads the cache image. */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( ( ( mpi_rank == 0 ) && ( cache_ptr->images_read != 1 ) ) ||
+             ( ( mpi_rank > 0 )  && ( cache_ptr->images_read != 0 ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected images_read.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that all other processes receive the cache image block 
+     * from process 0.
+     * 
+     * Since we have alread verified that only process 0 has read the 
+     * image, it is sufficient to verify that the image was loaded on 
+     * all processes.
+     */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "Image not loaded?.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Close the file. */
+ 
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 4) Open the file, and verify that it doesn't contain a cache image. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ TRUE,
+                       /* set_mdci_fapl         */ FALSE,
+		       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ MPI_COMM_WORLD,
+                       /* info                  */ MPI_INFO_NULL,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ md_write_strat);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5) Verify that the file contains the expected data. */
+ 
+    if ( pass ) {
+
+       verify_data_sets(file_id, 0, MAX_NUM_DSETS - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block not loaded(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    /* 6) Close the file. */
+ 
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* report results */
+    if ( mpi_rank == 0 ) {
+
+        if ( pass ) {
+
+            PASSED();
+
+        } else {
+
+            H5_FAILED();
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: failure_mssg = \"%s\"\n", failure_mssg);
+        }
+    }
+
+
+    return !pass;
+
+} /* verify_cache_image_RO() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_cache_image_RW()
+ *
+ * Purpose:     Verify that a HDF5 file containing a cache image is 
+ *              opened and read correctly by PHDF5 with the specified 
+ *              metadata write strategy.
+ *              
+ *              Basic cycle of operation is as follows:
+ *
+ *		1) Open the test file created at the beginning of this 
+ *		   test.
+ *
+ *		   Verify that the file contains a cache image.
+ *
+ *              2) Verify that the file contains the expected data.
+ *
+ *		   Verify that only process 0 reads the cache image.
+ *
+ *		   Verify that all other processes receive the cache 
+ *		   image block from process 0.
+ *
+ *
+ *              3) Close the file.
+ *
+ *              4) Open the file, and verify that it doesn't contain 
+ *                 a cache image.
+ *
+ *              5) Verify that the file contains the expected data.
+ *
+ *              6) Close the file.
+ *
+ *              7) Delete the file.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              1/25/17
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+verify_cache_image_RW(int file_name_id, int md_write_strat, int mpi_rank)
+{
+    const char * fcn_name = "verify_cache_imageRW()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+
+    pass = TRUE;
+
+    if ( mpi_rank == 0 ) {
+
+        switch(md_write_strat) {
+
+            case H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
+                TESTING("parallel CI load test -- proc0 md write -- R/W");
+                break;
+
+            case H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
+                TESTING("parallel CI load test -- dist md write -- R/W");
+                break;
+
+            default:
+                TESTING("parallel CI load test -- unknown md write -- R/W");
+                pass = FALSE;
+                break;
+        }
+    }
+
+    show_progress = ( ( show_progress ) && ( mpi_rank == 0 ) );
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* setup the file name */
+    if ( pass ) {
+
+        if ( h5_fixname(FILENAMES[file_name_id], H5P_DEFAULT, 
+                        filename, sizeof(filename)) == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Open the test file created at the beginning of this test.
+     *
+     *    Verify that the file contains a cache image.
+     *
+     *    Verify that only process 0 reads the cache image.
+     *
+     *    Verify that all other processes receive the cache 
+     *    image block from process 0.
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ FALSE,
+		       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ MPI_COMM_WORLD,
+                       /* info                  */ MPI_INFO_NULL,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ md_write_strat);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Verify that the file contains the expected data.
+     *
+     *    Verify that only process 0 reads the cache image.
+     *
+     *    Verify that all other processes receive the cache 
+     *    image block from process 0.
+     */
+    if ( pass ) {
+
+       verify_data_sets(file_id, 0, MAX_NUM_DSETS - 1);
+    }
+
+    /* Verify that only process 0 reads the cache image. */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( ( ( mpi_rank == 0 ) && ( cache_ptr->images_read != 1 ) ) ||
+             ( ( mpi_rank > 0 )  && ( cache_ptr->images_read != 0 ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected images_read.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that all other processes receive the cache image block 
+     * from process 0.
+     * 
+     * Since we have alread verified that only process 0 has read the 
+     * image, it is sufficient to verify that the image was loaded on 
+     * all processes.
+     */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "Image not loaded?.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Close the file. */
+ 
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 4) Open the file, and verify that it doesn't contain a cache image. */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ FALSE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ FALSE,
+		       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ MPI_COMM_WORLD,
+                       /* info                  */ MPI_INFO_NULL,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ FALSE,
+                       /* md_write_strat        */ md_write_strat);
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5) Verify that the file contains the expected data. */
+ 
+    if ( pass ) {
+
+       verify_data_sets(file_id, 0, MAX_NUM_DSETS - 1);
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "metadata cache image block loaded(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+
+    /* 6) Close the file. */
+ 
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( show_progress ) 
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 7) Delete the file. */
+
+    if ( pass ) {
+
+        /* wait for everyone to close the file */
+        MPI_Barrier(MPI_COMM_WORLD);
+
+        if ( ( mpi_rank == 0 ) && ( HDremove(filename) < 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+
+    /* report results */
+    if ( mpi_rank == 0 ) {
+
+        if ( pass ) {
+
+            PASSED();
+
+        } else {
+
+            H5_FAILED();
+
+            if ( show_progress ) 
+                HDfprintf(stdout, "%s: failure_mssg = \"%s\"\n", failure_mssg);
+        }
+    }
+
+
+    return !pass;
+
+} /* verify_cache_imageRW() */
+
+

+/*****************************************************************************
+ *
+ * Function:    smoke_check_1()
+ *
+ * Purpose:     Initial smoke check to verify correct behaviour of cache 
+ *              image in combination with parallel.
+ *              
+ *              As cache image is currently disabled in the parallel case,
+ *              we construct a test file in parallel, verify it in serial
+ *              and generate a cache image in passing, and then verify
+ *              it again in parallel.
+ *
+ *              In passing, also verify that page buffering is silently 
+ *              disabled in the parallel case.  Needless to say, this part
+ *              of the test will have to be re-worked when and if page
+ *              buffering is supported in parallel.
+ *
+ * Return:      Success:        TRUE
+ *
+ *              Failure:        FALSE
+ *
+ * Programmer:  JRM -- 3/6/17
+ *
+ *****************************************************************************/
+static hbool_t
+smoke_check_1(MPI_Comm mpi_comm, MPI_Info mpi_info, int mpi_rank, int mpi_size)
+{
+    const char * fcn_name = "smoke_check_1()";
+    char filename[512];
+    hbool_t show_progress = FALSE;
+    hid_t file_id = -1;
+    H5F_t *file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    int cp = 0;
+    int i;
+    int num_dsets = PAR_NUM_DSETS;
+    int test_file_index = 2;
+    h5_stat_size_t file_size;
+
+    pass = TRUE;
+
+    if ( mpi_rank == 0 ) {
+
+        TESTING("parallel cache image smoke check 1");
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* setup the file name */
+    if ( pass ) {
+
+        HDassert(FILENAMES[test_file_index]);
+
+        if ( h5_fixname(FILENAMES[test_file_index], H5P_DEFAULT,
+                                  filename, sizeof(filename))
+            == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_fixname() failed.\n";
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 1) Create a PHDF5 file without the cache image FAPL entry. 
+     *
+     *    Verify that a cache image is not requested
+     */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ TRUE,
+                       /* mdci_sbem_expected    */ FALSE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ FALSE,
+                       /* config_fsm            */ TRUE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ mpi_comm,
+                       /* info                  */ mpi_info,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ TRUE,
+                       /* md_write_strat        */ 1);
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 2) Create datasets in the file */
+
+    i = 0;
+    while ( ( pass ) && ( i < num_dsets ) ) {
+
+        par_create_dataset(i, file_id, mpi_rank, mpi_size);
+        i++;
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 3) Verify the datasets in the file */
+
+    i = 0;
+    while ( ( pass ) && ( i < num_dsets ) ) {
+
+        par_verify_dataset(i, file_id, mpi_rank);
+        i++;
+    }
+
+
+    /* 4) Close the file */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.\n";
+
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 5 Insert a cache image into the file */
+
+    if ( pass ) {
+
+        par_insert_cache_image(test_file_index, mpi_rank,  mpi_size);
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 6) Open the file R/O */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ TRUE,
+                       /* set_mdci_fapl         */ FALSE,
+                       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ mpi_comm,
+                       /* info                  */ mpi_info,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ TRUE,
+                       /* md_write_strat        */ 1);
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 7) Verify the datasets in the file backwards 
+     *
+     *    Verify that only process 0 reads the cache image.
+     *
+     *    Verify that all other processes receive the cache 
+     *    image block from process 0.
+     */
+
+    i = num_dsets - 1;
+    while ( ( pass ) && ( i >= 0 ) ) {
+
+        par_verify_dataset(i, file_id, mpi_rank);
+        i--;
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that only process 0 reads the cache image. */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( ( ( mpi_rank == 0 ) && ( cache_ptr->images_read != 1 ) ) ||
+             ( ( mpi_rank > 0 )  && ( cache_ptr->images_read != 0 ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected images_read.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that all other processes receive the cache image block 
+     * from process 0.
+     * 
+     * Since we have alread verified that only process 0 has read the 
+     * image, it is sufficient to verify that the image was loaded on 
+     * all processes.
+     */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "Image not loaded?.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 8) Close the file */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.";
+
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 9) Open the file */
+
+    if ( pass ) {
+
+        open_hdf5_file(/* create_file           */ FALSE,
+                       /* mdci_sbem_expected    */ TRUE,
+                       /* read_only             */ FALSE,
+                       /* set_mdci_fapl         */ FALSE,
+                       /* config_fsm            */ FALSE,
+                       /* enable_page_buffer    */ FALSE,
+                       /* hdf_file_name         */ filename,
+                       /* cache_image_flags     */ H5C_CI__ALL_FLAGS,
+                       /* file_id_ptr           */ &file_id,
+                       /* file_ptr_ptr          */ &file_ptr,
+                       /* cache_ptr_ptr         */ &cache_ptr,
+                       /* comm                  */ mpi_comm,
+                       /* info                  */ mpi_info,
+                       /* l_facc_type           */ FACC_MPIO,
+                       /* all_coll_metadata_ops */ FALSE,
+                       /* coll_metadata_write   */ TRUE,
+                       /* md_write_strat        */ 1);
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 10) Verify the datasets in the file 
+     *
+     *     Verify that only process 0 reads the cache image.
+     *
+     *     Verify that all other processes receive the cache 
+     *     image block from process 0.
+     */
+
+    i = 0;
+    while ( ( pass ) && ( i < num_dsets ) ) {
+
+        par_verify_dataset(i, file_id, mpi_rank);
+        i++;
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that only process 0 reads the cache image. */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( ( ( mpi_rank == 0 ) && ( cache_ptr->images_read != 1 ) ) ||
+             ( ( mpi_rank > 0 )  && ( cache_ptr->images_read != 0 ) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected images_read.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+    /* Verify that all other processes receive the cache image block 
+     * from process 0.
+     * 
+     * Since we have alread verified that only process 0 has read the 
+     * image, it is sufficient to verify that the image was loaded on 
+     * all processes.
+     */
+#if H5C_COLLECT_CACHE_STATS
+    if ( pass ) {
+
+        if ( cache_ptr->images_loaded != 1 ) {
+
+            pass = FALSE;
+            failure_mssg = "Image not loaded?.";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 11) Delete the datasets in the file */
+
+    i = 0;
+    while ( ( pass ) && ( i < num_dsets ) ) {
+
+        par_delete_dataset(i, file_id, mpi_rank);
+        i++;
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 12) Close the file */
+
+    if ( pass ) {
+
+        if ( H5Fclose(file_id) < 0  ) {
+
+            pass = FALSE;
+            failure_mssg = "H5Fclose() failed.";
+
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 13) Get the size of the file.  Verify that it is less
+     *     than 20 KB.  Without deletions and persistant free
+     *     space managers, size size is about 30 MB, so this
+     *     is sufficient to verify that the persistant free
+     *     space managers are more or less doing their job.
+     *
+     *     Note that this test will have to change if we use
+     *     a larger page size.
+     */
+    if ( pass ) {
+
+        if ( ( file_size = h5_get_file_size(filename, H5P_DEFAULT) ) < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "h5_get_file_size() failed.";
+
+        } else if ( file_size > 20 * 1024 ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpectedly large file size.";
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* 14) Delete the file */
+
+    if ( pass ) {
+
+        /* wait for everyone to close the file */
+        MPI_Barrier(MPI_COMM_WORLD);
+
+        if ( ( mpi_rank == 0 ) && ( HDremove(filename) < 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "HDremove() failed.\n";
+        }
+    }
+
+    if ( ( mpi_rank == 0 ) && ( show_progress ) )
+        HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+    /* report results */
+    if ( mpi_rank == 0 ) {
+
+        if ( pass ) {
+
+            PASSED();
+
+        } else {
+
+            H5_FAILED();
+
+            HDfprintf(stdout, "%s: failure_mssg = \"%s\"\n", 
+                      fcn_name, failure_mssg);
+        }
+    }
+
+    return !pass;
+    
+} /* smoke_check_1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Run parallel tests on the cache image feature.
+ * 
+ *              At present, cache image is disabled in parallel, and 
+ *              thus these tests are restructed to verifying that a 
+ *              file with a cache image can be opened in the parallel
+ *              case, and verifying that instructions to create a 
+ *              cache image are ignored in the parallel case.
+ *
+ *              WARNING: This test uses fork() and execve(), and 
+ *                       therefore will not run on Windows.
+ *
+ * Return:      Success: 0
+ *
+ *              Failure: 1
+ *
+ * Programmer:  John Mainzer
+ *              1/25/17
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+main(int argc, char **argv)
+{
+    hbool_t setup = FALSE;
+    hbool_t ici = FALSE;
+    unsigned nerrs = 0;
+    MPI_Comm comm = MPI_COMM_WORLD;
+    MPI_Info info = MPI_INFO_NULL;
+    int file_idx;
+    int i;
+    int mpi_size;
+    int mpi_rank;
+
+    if ( ! parse_flags(argc, argv, &setup, &ici, &file_idx, &mpi_size, FALSE) )
+        exit(1);  /* exit now if unable to parse flags */
+
+    if ( setup ) { /* construct test files and exit */
+
+        H5open();
+        HDfprintf(stdout, "Constructing test files: \n");
+        HDfflush(stdout);
+
+        i = 0;
+        while ( ( FILENAMES[i] != NULL ) && ( i < TEST_FILES_TO_CONSTRUCT ) ) { 
+
+            HDfprintf(stdout, "   writing %s ... ", FILENAMES[i]);
+            HDfflush(stdout);
+            construct_test_file(i);
+
+            if ( pass ) {
+            
+                printf("done.\n");
+                HDfflush(stdout);
+
+            } else {
+
+                printf("failed.\n");
+                exit(1);
+            }
+            i++;
+        }
+
+        HDfprintf(stdout, "Test file construction complete.\n");
+        exit(0);
+
+    } else if ( ici ) {
+
+        if ( serial_insert_cache_image(file_idx, mpi_size) ) {
+
+            exit(0);
+
+        } else {
+
+            HDfprintf(stderr, "\n\nCache image insertion failed.\n");
+            HDfprintf(stderr, "  failure mssg = \"%s\"\n", failure_mssg);
+            exit(1);
+        }
+    }
+
+    HDassert(!setup);
+    HDassert(!ici);
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+
+    /* Attempt to turn off atexit post processing so that in case errors
+     * happen during the test and the process is aborted, it will not get
+     * hang in the atexit post processing in which it may try to make MPI
+     * calls.  By then, MPI calls may not work.
+     */
+    if (H5dont_atexit() < 0){
+        printf("%d:Failed to turn off atexit processing. Continue.\n",
+               mpi_rank);
+    };
+
+    H5open();
+
+    if ( mpi_rank == 0 ) {
+        printf("===================================\n");
+        printf("Parallel metadata cache image tests\n");
+        printf("        mpi_size     = %d\n", mpi_size);
+        printf("===================================\n");
+    }
+
+    if ( mpi_size < 2 ) {
+
+        if ( mpi_rank == 0 ) {
+
+            printf("    Need at least 2 processes.  Exiting.\n");
+        }
+        goto finish;
+    }
+
+    if ( mpi_rank == 0 ) { /* create test files */
+
+        int child_status;
+        pid_t child_pid;
+
+        child_pid = fork();
+
+        if ( child_pid == 0 ) { /* this is the child process */
+
+            /* fun and games to shutup the compiler */
+            char param0[32] = "t_cache_image";
+            char param1[32] = "setup";
+            char * child_argv[] = {param0, param1, NULL};
+
+            /* we may need to play with the path here */
+            if ( execv("t_cache_image", child_argv) == -1 ) {
+
+                HDfprintf(stdout, 
+                          "execl() of setup process failed. errno = %d(%s)\n",
+                          errno, strerror(errno));
+                exit(1);
+            }
+
+        } else if ( child_pid != -1 ) {  
+            /* this is the parent process -- wait until child is done */
+            if ( -1 == waitpid(child_pid, &child_status, WUNTRACED)) {
+
+                HDfprintf(stdout, "can't wait on setup process.\n");
+
+            } else if ( ! WIFEXITED(child_status) ) {
+
+                HDfprintf(stdout, "setup process hasn't exitied.\n");
+
+            } else if ( WEXITSTATUS(child_status) != 0 ) {
+
+                HDfprintf(stdout, "setup process reports failure.\n");
+
+            } else {
+
+                HDfprintf(stdout, 
+                 "testfile construction complete -- proceeding with tests.\n");
+            }
+        } else { /* fork failed */
+
+            HDfprintf(stdout, "can't create process to construct test file.\n");
+        }
+    }
+
+    /* can't start test until test files exist */
+    MPI_Barrier(MPI_COMM_WORLD);
+
+
+    nerrs += verify_cache_image_RO(0, 
+                     H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY, mpi_rank);
+#if 1
+    nerrs += verify_cache_image_RO(1, 
+                     H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, mpi_rank);
+    nerrs += verify_cache_image_RW(0, 
+                     H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY, mpi_rank);
+    nerrs += verify_cache_image_RW(1, 
+                     H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, mpi_rank);
+    nerrs += smoke_check_1(comm, info, mpi_rank, mpi_size);
+#endif
+finish:
+
+    /* make sure all processes are finished before final report, cleanup
+     * and exit.
+     */
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    if ( mpi_rank == 0 ) {           /* only process 0 reports */
+        sleep(10);
+        printf("===================================\n");
+        if ( nerrs > 0 ) {
+            printf("***metadata cache image tests detected %d failures***\n",
+                   nerrs);
+        }
+        else {
+            printf("metadata cache image tests finished with no failures\n");
+        }
+        printf("===================================\n");
+    }
+
+    /* takedown_derived_types(); */
+
+    /* close HDF5 library */
+    H5close();
+
+    /* MPI_Finalize must be called AFTER H5close which may use MPI calls */
+    MPI_Finalize();
+
+    /* cannot just return (nerrs) because exit code is limited to 1byte */
+    return(nerrs > 0);
+
+} /* main() */
+
diff --git a/testpar/t_chunk_alloc.c b/testpar/t_chunk_alloc.c
index 05fd2fc..2340ae0 100644
--- a/testpar/t_chunk_alloc.c
+++ b/testpar/t_chunk_alloc.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_coll_chunk.c b/testpar/t_coll_chunk.c
index ab9de09..c6fa3d4 100644
--- a/testpar/t_coll_chunk.c
+++ b/testpar/t_coll_chunk.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "testphdf5.h"
diff --git a/testpar/t_dset.c b/testpar/t_dset.c
index 249e5a3..b952bf3 100644
--- a/testpar/t_dset.c
+++ b/testpar/t_dset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -2625,10 +2623,10 @@ compress_readAll(void)
 
         /* Open dataset with compressed chunks */
         dataset = H5Dopen2(fid, "compressed_data", H5P_DEFAULT);
-        VRFY((dataset >= 0), "H5Dopen2 succeeded");
+        VRFY((dataset > 0), "H5Dopen2 succeeded");
 
         /* Try reading & writing data */
-        if(dataset>=0) {
+        if(dataset>0) {
             /* Create dataset transfer property list */
             xfer_plist = H5Pcreate(H5P_DATASET_XFER);
             VRFY((xfer_plist > 0), "H5Pcreate succeeded");
@@ -3308,7 +3306,7 @@ test_actual_io_mode(int selection_mode) {
         "reading and writing are the same for actual_chunk_opt_mode");
 
     /* Test values */
-    if(actual_chunk_opt_mode_expected != (unsigned) -1 && actual_io_mode_expected != (unsigned) -1) {
+    if(actual_chunk_opt_mode_expected != (H5D_mpio_actual_chunk_opt_mode_t) -1 && actual_io_mode_expected != (H5D_mpio_actual_io_mode_t) -1) {
         sprintf(message, "Actual Chunk Opt Mode has the correct value for %s.\n",test_name);
         VRFY((actual_chunk_opt_mode_write == actual_chunk_opt_mode_expected), message);
         sprintf(message, "Actual IO Mode has the correct value for %s.\n",test_name);
diff --git a/testpar/t_file.c b/testpar/t_file.c
index 0f1e63e..1b6978f 100644
--- a/testpar/t_file.c
+++ b/testpar/t_file.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -19,6 +17,30 @@
 
 #include "testphdf5.h"
 
+#include "H5PBprivate.h"
+#include "H5Iprivate.h"
+
+/*
+ * This file needs to access private information from the H5F package.
+ */
+#define H5C_FRIEND		/*suppress error about including H5Cpkg	  */
+#include "H5Cpkg.h"
+#define H5AC_FRIEND		/*suppress error about including H5ACpkg	  */
+#include "H5ACpkg.h"
+#define H5MF_FRIEND		/*suppress error about including H5MFpkg	  */
+#include "H5MFpkg.h"
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5F_TESTING
+#include "H5Fpkg.h"
+
+#define NUM_DSETS               5
+
+int mpi_size, mpi_rank;
+
+static int create_file(const char *filename, hid_t fcpl, hid_t fapl, int metadata_write_strategy);
+static int open_file(const char *filename, hid_t fapl, int metadata_write_strategy, 
+                     hsize_t page_size, size_t page_buffer_size);
+
 /*
  * test file access by communicator besides COMM_WORLD.
  * Split COMM_WORLD into two, one (even_comm) contains the original
@@ -33,7 +55,6 @@
 void
 test_split_comm_access(void)
 {
-    int mpi_size, mpi_rank;
     MPI_Comm comm;
     MPI_Info info = MPI_INFO_NULL;
     int is_old, mrc;
@@ -95,6 +116,595 @@ test_split_comm_access(void)
 }
 
 void
+test_page_buffer_access(void)
+{
+    hid_t file_id = -1;          /* File ID */
+    hid_t fcpl, fapl, fapl_self;
+    hid_t dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    size_t page_count = 0;
+    int i, num_elements = 200;
+    haddr_t raw_addr, meta_addr;
+    int *data;
+    H5F_t *f = NULL;
+    herr_t ret;			/* generic return value */
+    const char *filename;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
+
+    filename = (const char *)GetTestParameters();
+
+    if (VERBOSE_MED)
+	printf("Page Buffer Usage in Parallel %s\n", filename);
+
+    fapl = create_faccess_plist(MPI_COMM_WORLD, MPI_INFO_NULL, facc_type);
+    VRFY((fapl >= 0), "create_faccess_plist succeeded");
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    VRFY((fcpl >= 0), "");
+
+    ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)0);
+    VRFY((ret == 0), "");
+    ret = H5Pset_file_space_page_size(fcpl, sizeof(int)*100);
+    VRFY((ret == 0), "");
+    ret = H5Pset_page_buffer_size(fapl, sizeof(int)*100000, 0, 0);
+    VRFY((ret == 0), "");
+
+    /* This should fail because collective metadata writes are not supported with page buffering */
+    H5E_BEGIN_TRY {
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+    } H5E_END_TRY;
+    VRFY((file_id < 0), "H5Fcreate failed");
+
+    /* disable collective metadata writes for page buffering to work */
+    ret = H5Pset_coll_metadata_write(fapl, FALSE);
+    VRFY((ret >= 0), "");
+
+    ret = create_file(filename, fcpl, fapl, H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    VRFY((ret == 0), "");
+    ret = open_file(filename, fapl, H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, sizeof(int)*100, sizeof(int)*100000);
+    VRFY((ret == 0), "");
+
+    ret = create_file(filename, fcpl, fapl, H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
+    VRFY((ret == 0), "");
+    ret = open_file(filename, fapl, H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY, sizeof(int)*100, sizeof(int)*100000);
+    VRFY((ret == 0), "");
+
+    ret = H5Pset_file_space_page_size(fcpl, sizeof(int)*100);
+    VRFY((ret == 0), "");
+
+    data = (int *) HDmalloc(sizeof(int)*(size_t)num_elements);
+
+    /* intialize all the elements to have a value of -1 */
+    for(i=0 ; i<num_elements ; i++)
+        data[i] = -1;
+
+    /* MSC - why this stopped working ? */
+#if 0
+    if(MAINPROCESS) {
+        hid_t fapl_self;
+
+        fapl_self = create_faccess_plist(MPI_COMM_SELF, MPI_INFO_NULL, facc_type);
+
+        ret = H5Pset_page_buffer_size(fapl_self, sizeof(int)*1000, 0, 0);
+        VRFY((ret == 0), "");
+        /* collective metadata writes do not work with page buffering */
+        ret = H5Pset_coll_metadata_write(fapl_self, FALSE);
+        VRFY((ret >= 0), "");
+
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_self);
+        VRFY((file_id >= 0), "");
+
+        /* Get a pointer to the internal file object */
+        f = (H5F_t *)H5I_object(file_id);
+
+        VRFY((f->shared->page_buf != NULL), "Page Buffer created with 1 process");
+
+        /* allocate space for 200 raw elements */
+        raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements);
+        VRFY((raw_addr != HADDR_UNDEF), "");
+
+        /* allocate space for 200 metadata elements */
+        meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements);
+        VRFY((meta_addr != HADDR_UNDEF), "");
+
+        page_count = 0;
+
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data);
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update the first 50 elements */
+        for(i=0 ; i<50 ; i++)
+            data[i] = i;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        H5Eprint2(H5E_DEFAULT, stderr);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        page_count += 2;
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update the second 50 elements */
+        for(i=0 ; i<50 ; i++)
+            data[i] = i+50;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*50), sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*50), sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update 100 - 200 */
+        for(i=0 ; i<100 ; i++)
+            data[i] = i+100;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        ret = H5PB_flush(f, dxpl_id, FALSE);
+        VRFY((ret == 0), "");
+
+        /* read elements 0 - 200 */
+        ret = H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*200, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 200; i++)
+            VRFY((data[i] == i), "Read different values than written");
+        ret = H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*200, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 200; i++)
+            VRFY((data[i] == i), "Read different values than written");
+
+        /* read elements 0 - 50 */
+        ret = H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++)
+            VRFY((data[i] == i), "Read different values than written");
+        ret = H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++)
+            VRFY((data[i] == i), "Read different values than written");
+
+        /* close the file */
+        ret = H5Fclose(file_id);
+        VRFY((ret >= 0), "H5Fclose succeeded");
+        ret = H5Pclose(fapl_self);
+        VRFY((ret>=0), "H5Pclose succeeded");
+    }
+#endif
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    if(mpi_size > 1) {
+        ret = H5Pset_page_buffer_size(fapl, sizeof(int)*1000, 0, 0);
+        VRFY((ret == 0), "");
+        /* collective metadata writes do not work with page buffering */
+        ret = H5Pset_coll_metadata_write(fapl, FALSE);
+        VRFY((ret >= 0), "");
+
+        file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+        VRFY((file_id >= 0), "");
+
+        /* Get a pointer to the internal file object */
+        f = (H5F_t *)H5I_object(file_id);
+
+        VRFY((f->shared->page_buf != NULL), "Page Buffer created with 1 process");
+
+        /* allocate space for 200 raw elements */
+        raw_addr = H5MF_alloc(f, H5FD_MEM_DRAW, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements);
+        VRFY((raw_addr != HADDR_UNDEF), "");
+        /* allocate space for 200 metadata elements */
+        meta_addr = H5MF_alloc(f, H5FD_MEM_SUPER, H5AC_ind_read_dxpl_id, sizeof(int)*(size_t)num_elements);
+        VRFY((meta_addr != HADDR_UNDEF), "");
+
+        page_count = 0;
+
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*(size_t)num_elements, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*(size_t)num_elements, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update the first 50 elements */
+        for(i=0 ; i<50 ; i++)
+            data[i] = i;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update the second 50 elements */
+        for(i=0 ; i<50 ; i++)
+            data[i] = i+50;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*50), sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*50), sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* update 100 - 200 */
+        for(i=0 ; i<100 ; i++)
+            data[i] = i+100;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr+(sizeof(int)*100), sizeof(int)*100, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        ret = H5Fflush(file_id, H5F_SCOPE_GLOBAL);
+        VRFY((ret == 0), "");
+
+        /* read elements 0 - 200 */
+        ret = H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*200, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 200; i++)
+            VRFY((data[i] == i), "Read different values than written");
+        ret = H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*200, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 200; i++)
+            VRFY((data[i] == i), "Read different values than written");
+
+        /* read elements 0 - 50 */
+        ret = H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++)
+            VRFY((data[i] == i), "Read different values than written");
+        ret = H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        page_count += 1;
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++)
+            VRFY((data[i] == i), "Read different values than written");
+
+        MPI_Barrier(MPI_COMM_WORLD);
+        /* reset the first 50 elements to -1*/
+        for(i=0 ; i<50 ; i++)
+            data[i] = -1;
+        ret = H5F_block_write(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        ret = H5F_block_write(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+
+        /* read elements 0 - 50 */
+        ret = H5F_block_read(f, H5FD_MEM_DRAW, raw_addr, sizeof(int)*50, H5AC_rawdata_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++)
+            VRFY((data[i] == -1), "Read different values than written");
+        ret = H5F_block_read(f, H5FD_MEM_SUPER, meta_addr, sizeof(int)*50, H5AC_ind_read_dxpl_id, data);
+        VRFY((ret == 0), "");
+        VRFY((H5SL_count(f->shared->page_buf->slist_ptr) == page_count), "Wrong number of pages in PB");
+        for (i=0; i < 50; i++) 
+            VRFY((data[i] == -1), "Read different values than written");
+
+        /* close the file */
+        ret = H5Fclose(file_id);
+        VRFY((ret >= 0), "H5Fclose succeeded");
+    }
+
+    ret = H5Pclose(fapl);
+    VRFY((ret>=0), "H5Pclose succeeded");
+    ret = H5Pclose(fcpl);
+    VRFY((ret>=0), "H5Pclose succeeded");
+
+    HDfree(data);
+    data = NULL;
+    MPI_Barrier(MPI_COMM_WORLD);
+}
+
+static int
+create_file(const char *filename, hid_t fcpl, hid_t fapl, int metadata_write_strategy)
+{
+    hid_t       file_id, dset_id, grp_id;
+    hid_t       sid, mem_dataspace;
+    hsize_t     start[RANK];
+    hsize_t     count[RANK];
+    hsize_t     stride[RANK];
+    hsize_t     block[RANK];
+    DATATYPE   *data_array = NULL;
+    hsize_t     dims[RANK], i;
+    hsize_t     num_elements;
+    int         k;
+    char        dset_name[10];
+    H5F_t       *f = NULL;
+    H5C_t       *cache_ptr = NULL;
+    H5AC_cache_config_t config;
+    herr_t      ret;
+
+    file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
+    VRFY((file_id >= 0), "");
+
+    ret = H5Fflush(file_id, H5F_SCOPE_GLOBAL);
+    VRFY((ret == 0), "");
+
+    f = (H5F_t *)H5I_object(file_id);
+    VRFY((f != NULL), "");
+
+    cache_ptr = f->shared->cache;
+    VRFY((cache_ptr->magic == H5C__H5C_T_MAGIC), "");
+
+    cache_ptr->ignore_tags = TRUE;
+    H5C_stats__reset(cache_ptr);
+    config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+
+    ret = H5AC_get_cache_auto_resize_config(cache_ptr, &config);
+    VRFY((ret == 0), "");
+
+    config.metadata_write_strategy = metadata_write_strategy;
+
+    ret = H5AC_set_cache_auto_resize_config(cache_ptr, &config);
+    VRFY((ret == 0), "");
+
+    grp_id = H5Gcreate2(file_id, "GROUP", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    VRFY((grp_id >= 0), "");
+
+    dims[0] = ROW_FACTOR*mpi_size;
+    dims[1] = COL_FACTOR*mpi_size;
+    sid = H5Screate_simple (RANK, dims, NULL);
+    VRFY((sid >= 0), "H5Screate_simple succeeded");
+
+    /* Each process takes a slabs of rows. */
+    block[0] = dims[0]/mpi_size;
+    block[1] = dims[1];
+    stride[0] = block[0];
+    stride[1] = block[1];
+    count[0] = 1;
+    count[1] = 1;
+    start[0] = mpi_rank*block[0];
+    start[1] = 0;
+
+    num_elements = block[0] * block[1];
+    /* allocate memory for data buffer */
+    data_array = (DATATYPE *)HDmalloc(num_elements*sizeof(DATATYPE));
+    VRFY((data_array != NULL), "data_array HDmalloc succeeded");
+    /* put some trivial data in the data_array */
+    for(i=0 ; i<num_elements; i++)
+        data_array[i] = mpi_rank + 1;
+
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    VRFY((ret >= 0), "H5Sset_hyperslab succeeded");
+
+    /* create a memory dataspace independently */
+    mem_dataspace = H5Screate_simple (1, &num_elements, NULL);
+    VRFY((mem_dataspace >= 0), "");
+
+    for(k=0 ; k<NUM_DSETS; k++) {
+        sprintf(dset_name, "D1dset%d", k);
+        dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, sid,
+                             H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+        ret = H5Dclose(dset_id);
+        VRFY((ret == 0), "");
+
+        sprintf(dset_name, "D2dset%d", k);
+        dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, sid,
+                             H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+        ret = H5Dclose(dset_id);
+        VRFY((ret == 0), "");
+
+        sprintf(dset_name, "D3dset%d", k);
+        dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, sid,
+                             H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+        ret = H5Dclose(dset_id);
+        VRFY((ret == 0), "");
+
+        sprintf(dset_name, "dset%d", k);
+        dset_id = H5Dcreate2(grp_id, dset_name, H5T_NATIVE_INT, sid,
+                             H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+
+        ret = H5Dwrite(dset_id, H5T_NATIVE_INT, mem_dataspace, sid, H5P_DEFAULT, data_array);
+        VRFY((ret == 0), "");
+
+        ret = H5Dclose(dset_id);
+        VRFY((ret == 0), "");
+
+        HDmemset(data_array, 0, num_elements*sizeof(DATATYPE));
+        dset_id = H5Dopen2(grp_id, dset_name, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+
+        ret = H5Dread(dset_id, H5T_NATIVE_INT, mem_dataspace, sid, H5P_DEFAULT, data_array);
+        VRFY((ret == 0), "");
+
+        ret = H5Dclose(dset_id);
+        VRFY((ret == 0), "");
+
+        for (i=0; i < num_elements; i++)
+            VRFY((data_array[i] == mpi_rank+1), "Dataset Verify failed");
+
+        sprintf(dset_name, "D1dset%d", k);
+        ret = H5Ldelete(grp_id, dset_name, H5P_DEFAULT);
+        VRFY((ret == 0), "");
+        sprintf(dset_name, "D2dset%d", k);
+        ret = H5Ldelete(grp_id, dset_name, H5P_DEFAULT);
+        VRFY((ret == 0), "");
+        sprintf(dset_name, "D3dset%d", k);
+        ret = H5Ldelete(grp_id, dset_name, H5P_DEFAULT);
+        VRFY((ret == 0), "");
+    }
+
+    ret = H5Gclose(grp_id);
+    VRFY((ret == 0), "");
+    ret = H5Fclose(file_id);
+    VRFY((ret == 0), "");
+    ret = H5Sclose(sid);
+    VRFY((ret == 0), "");
+    ret = H5Sclose(mem_dataspace);
+    VRFY((ret == 0), "");
+
+    MPI_Barrier(MPI_COMM_WORLD);
+    HDfree(data_array);
+    return 0;
+} /* create_file */
+
+static int
+open_file(const char *filename, hid_t fapl, int metadata_write_strategy,
+          hsize_t page_size, size_t page_buffer_size)
+{
+    hid_t       file_id, dset_id, grp_id, grp_id2;
+    hid_t       sid, mem_dataspace;
+    DATATYPE   *data_array = NULL;
+    hsize_t     dims[RANK];
+    hsize_t     start[RANK];
+    hsize_t     count[RANK];
+    hsize_t     stride[RANK];
+    hsize_t     block[RANK];
+    int         i, k, ndims;
+    hsize_t     num_elements;
+    char        dset_name[10];
+    H5F_t       *f = NULL;
+    H5C_t       *cache_ptr = NULL;
+    H5AC_cache_config_t config;
+    herr_t      ret;
+
+    config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+    ret = H5Pget_mdc_config(fapl, &config);
+    VRFY((ret == 0), "");
+
+    config.metadata_write_strategy = metadata_write_strategy;
+
+    ret = H5Pget_mdc_config(fapl, &config);
+    VRFY((ret == 0), "");
+
+    file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+    H5Eprint2(H5E_DEFAULT, stderr);
+    VRFY((file_id >= 0), "");
+
+    ret = H5Fflush(file_id, H5F_SCOPE_GLOBAL);
+    VRFY((ret == 0), "");
+
+    f = (H5F_t *)H5I_object(file_id);
+    VRFY((f != NULL), "");
+
+    cache_ptr = f->shared->cache;
+    VRFY((cache_ptr->magic == H5C__H5C_T_MAGIC), "");
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    VRFY((f->shared->page_buf != NULL), "");
+    VRFY((f->shared->page_buf->page_size == page_size), "");
+    VRFY((f->shared->page_buf->max_size == page_buffer_size), "");
+
+    grp_id = H5Gopen2(file_id, "GROUP", H5P_DEFAULT);
+    VRFY((grp_id >= 0), "");
+
+    dims[0] = ROW_FACTOR*mpi_size;
+    dims[1] = COL_FACTOR*mpi_size;
+
+    /* Each process takes a slabs of rows. */
+    block[0] = dims[0]/mpi_size;
+    block[1] = dims[1];
+    stride[0] = block[0];
+    stride[1] = block[1];
+    count[0] = 1;
+    count[1] = 1;
+    start[0] = mpi_rank*block[0];
+    start[1] = 0;
+
+    num_elements = block[0] * block[1];
+    /* allocate memory for data buffer */
+    data_array = (DATATYPE *)HDmalloc(num_elements*sizeof(DATATYPE));
+    VRFY((data_array != NULL), "data_array HDmalloc succeeded");
+
+    /* create a memory dataspace independently */
+    mem_dataspace = H5Screate_simple (1, &num_elements, NULL);
+    VRFY((mem_dataspace >= 0), "");
+
+    for(k=0 ; k<NUM_DSETS; k++) {
+        sprintf(dset_name, "dset%d", k);
+        dset_id = H5Dopen2(grp_id, dset_name, H5P_DEFAULT);
+        VRFY((dset_id >= 0), "");
+
+        sid = H5Dget_space(dset_id);
+        VRFY((dset_id >= 0), "H5Dget_space succeeded");
+
+        ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
+        VRFY((ndims == 2), "H5Sget_simple_extent_dims succeeded");
+        VRFY(dims[0] == ROW_FACTOR*mpi_size, "Wrong dataset dimensions");
+        VRFY(dims[1] == COL_FACTOR*mpi_size, "Wrong dataset dimensions");
+
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+        VRFY((ret >= 0), "H5Sset_hyperslab succeeded");
+
+        ret = H5Dread(dset_id, H5T_NATIVE_INT, mem_dataspace, sid, H5P_DEFAULT, data_array);
+        VRFY((ret >= 0), "");
+
+        ret = H5Dclose(dset_id);
+        VRFY((ret >= 0), "");
+        ret = H5Sclose(sid);
+        VRFY((ret == 0), "");
+
+        for (i=0; i < num_elements; i++)
+            VRFY((data_array[i] == mpi_rank+1), "Dataset Verify failed");
+    }
+
+    grp_id2 = H5Gcreate2(file_id, "GROUP/GROUP2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    VRFY((grp_id2 >= 0), "");
+    ret = H5Gclose(grp_id2);
+    VRFY((ret == 0), "");
+
+    ret = H5Fflush(file_id, H5F_SCOPE_GLOBAL);
+    VRFY((ret == 0), "");
+
+    MPI_Barrier(MPI_COMM_WORLD);
+    /* flush invalidate each ring, starting from the outermost ring and
+     * working inward.
+     */
+    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) {
+        H5C_cache_entry_t * entry_ptr = NULL;
+
+        entry_ptr = cache_ptr->index[i];
+
+        while ( entry_ptr != NULL ) {
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(entry_ptr->is_dirty == FALSE);
+
+            if(!entry_ptr->is_pinned && !entry_ptr->is_protected) {
+                ret = H5AC_expunge_entry(f, H5AC_ind_read_dxpl_id, entry_ptr->type, entry_ptr->addr, 0);
+                VRFY((ret == 0), "");
+            }
+
+            entry_ptr = entry_ptr->ht_next;
+        }
+    }
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    grp_id2 = H5Gopen2(file_id, "GROUP/GROUP2", H5P_DEFAULT);
+    H5Eprint2(H5E_DEFAULT, stderr);
+    VRFY((grp_id2 >= 0), "");
+    ret = H5Gclose(grp_id2);
+    H5Eprint2(H5E_DEFAULT, stderr);
+    VRFY((ret == 0), "");
+
+    ret = H5Gclose(grp_id);
+    VRFY((ret == 0), "");
+    ret = H5Fclose(file_id);
+    VRFY((ret == 0), "");
+    ret = H5Sclose(mem_dataspace);
+    VRFY((ret == 0), "");
+    HDfree(data_array);
+
+    return nerrors;
+}
+
+void
 test_file_properties(void)
 {
     hid_t fid;                  /* HDF5 file ID */
@@ -103,7 +713,6 @@ test_file_properties(void)
     const char *filename;
     MPI_Comm comm = MPI_COMM_WORLD;
     MPI_Info info = MPI_INFO_NULL;
-    int mpi_size, mpi_rank;
     herr_t ret;                 /* Generic return value */
 
     filename = (const char *)GetTestParameters();
@@ -115,7 +724,7 @@ test_file_properties(void)
     /* setup file access plist */
     fapl_id = H5Pcreate(H5P_FILE_ACCESS);
     VRFY((fapl_id >= 0), "H5Pcreate");
-	ret = H5Pset_fapl_mpio(fapl_id, comm, info);
+    ret = H5Pset_fapl_mpio(fapl_id, comm, info);
     VRFY((ret >= 0), "H5Pset_fapl_mpio");
 
     /* create the file */
diff --git a/testpar/t_file_image.c b/testpar/t_file_image.c
index 96e65d5..62db11a 100644
--- a/testpar/t_file_image.c
+++ b/testpar/t_file_image.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -240,10 +238,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 14f37be..4556b01 100644
--- a/testpar/t_filter_read.c
+++ b/testpar/t_filter_read.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -360,7 +358,7 @@ test_filter_read(void)
      * STEP 4: Test shuffling by itself.
      *----------------------------------------------------------
      */
-#ifdef H5_HAVE_FILTER_SHUFFLE
+
     dc = H5Pcreate(H5P_DATASET_CREATE);
     VRFY(dc>=0, "H5Pcreate");
 
@@ -377,13 +375,12 @@ 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.
      *----------------------------------------------------------
      */
-#if defined H5_HAVE_FILTER_DEFLATE && defined H5_HAVE_FILTER_SHUFFLE && defined H5_HAVE_FILTER_FLETCHER32
+#ifdef H5_HAVE_FILTER_DEFLATE
     /* Testing shuffle+deflate+checksum filters (checksum first) */
     dc = H5Pcreate(H5P_DATASET_CREATE);
     VRFY(dc>=0, "H5Pcreate");
@@ -428,13 +425,13 @@ test_filter_read(void)
     hrc = H5Pclose (dc);
     VRFY(hrc>=0, "H5Pclose");
 
-#endif /* H5_HAVE_FILTER_DEFLATE && H5_HAVE_FILTER_SHUFFLE && H5_HAVE_FILTER_FLETCHER32 */
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
     /*----------------------------------------------------------
      * STEP 6: Test shuffle + szip + checksum in any order.
      *----------------------------------------------------------
      */
-#if defined H5_HAVE_FILTER_SZIP && defined H5_HAVE_FILTER_SHUFFLE && defined H5_HAVE_FILTER_FLETCHER32
+#ifdef H5_HAVE_FILTER_SZIP
 
     /* Testing shuffle+szip(with encoder)+checksum filters(checksum first) */
     dc = H5Pcreate(H5P_DATASET_CREATE);
@@ -486,6 +483,6 @@ test_filter_read(void)
         VRFY(hrc>=0, "H5Pclose");
     }
 
-#endif /* H5_HAVE_FILTER_SZIP && H5_HAVE_FILTER_SHUFFLE && H5_HAVE_FILTER_FLETCHER32 */
+#endif /* H5_HAVE_FILTER_SZIP */
 }
 
diff --git a/testpar/t_init_term.c b/testpar/t_init_term.c
index 824f773..933fbd2 100644
--- a/testpar/t_init_term.c
+++ b/testpar/t_init_term.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_mdset.c b/testpar/t_mdset.c
index c88cb86..5d989bb 100644
--- a/testpar/t_mdset.c
+++ b/testpar/t_mdset.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "testphdf5.h"
@@ -510,7 +508,7 @@ void big_dataset(void)
 
     /* Check that file of the correct size was created */
     file_size = h5_get_file_size(filename, fapl);
-    VRFY((file_size == 2147485792ULL), "File is correct size(~2GB)");
+    VRFY((file_size == 2147485696ULL), "File is correct size(~2GB)");
 
     /*
      * Create >4GB HDF5 file
@@ -539,7 +537,7 @@ void big_dataset(void)
 
     /* Check that file of the correct size was created */
     file_size = h5_get_file_size(filename, fapl);
-    VRFY((file_size == 4294969440ULL), "File is correct size(~4GB)");
+    VRFY((file_size == 4294969344ULL), "File is correct size(~4GB)");
 
     /*
      * Create >8GB HDF5 file
@@ -568,7 +566,7 @@ void big_dataset(void)
 
     /* Check that file of the correct size was created */
     file_size = h5_get_file_size(filename, fapl);
-    VRFY((file_size == 8589936736ULL), "File is correct size(~8GB)");
+    VRFY((file_size == 8589936640ULL), "File is correct size(~8GB)");
 
     /* Close fapl */
     ret = H5Pclose(fapl);
@@ -2610,6 +2608,92 @@ void rr_obj_hdr_flush_confusion_reader(MPI_Comm comm)
 #undef Writer_Root
 #undef Reader_Root
 
+
+/*
+ * Test creating a chunked dataset in parallel in a file with an alignment set
+ * and an alignment threshold large enough to avoid aligning the chunks but
+ * small enough that the raw data aggregator will be aligned if it is treated as
+ * an object that must be aligned by the library
+ */
+#define CHUNK_SIZE 72
+#define NCHUNKS 32
+#define AGGR_SIZE 2048
+#define EXTRA_ALIGN 100
+
+ void chunk_align_bug_1(void)
+ {
+    int                 mpi_rank;
+    hid_t               file_id, dset_id, fapl_id, dcpl_id, space_id;
+    hsize_t             dims = CHUNK_SIZE * NCHUNKS, cdims = CHUNK_SIZE;
+    h5_stat_size_t      file_size;
+    hsize_t             align;
+    herr_t              ret;
+    const char          *filename;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+
+    filename = (const char *)GetTestParameters();
+
+    /* Create file without alignment */
+    fapl_id = create_faccess_plist(MPI_COMM_WORLD, MPI_INFO_NULL, facc_type);
+    VRFY((fapl_id >= 0), "create_faccess_plist succeeded");
+    file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
+    VRFY((file_id >= 0), "H5Fcreate succeeded");
+
+    /* Close file */
+    ret = H5Fclose(file_id);
+    VRFY((ret >= 0), "H5Fclose succeeded");
+
+    /* Get file size */
+    file_size = h5_get_file_size(filename, fapl_id);
+    VRFY((file_size >= 0), "h5_get_file_size succeeded");
+
+    /* Calculate alignment value, set to allow a chunk to squeak in between the
+     * original EOF and the aligned location of the aggregator.  Add some space
+     * for the dataset metadata */
+    align = (hsize_t)file_size + CHUNK_SIZE + EXTRA_ALIGN;
+
+    /* Set aggregator size and alignment, disable metadata aggregator */
+    HDassert(AGGR_SIZE > CHUNK_SIZE);
+    ret = H5Pset_small_data_block_size(fapl_id, AGGR_SIZE);
+    VRFY((ret >= 0), "H5Pset_small_data_block_size succeeded");
+    ret = H5Pset_meta_block_size(fapl_id, 0);
+    VRFY((ret >= 0), "H5Pset_meta_block_size succeeded");
+    ret = H5Pset_alignment(fapl_id, CHUNK_SIZE + 1, align);
+    VRFY((ret >= 0), "H5Pset_small_data_block_size succeeded");
+
+    /* Reopen file with new settings */
+    file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id);
+    VRFY((file_id >= 0), "H5Fopen succeeded");
+
+    /* Create dataset */
+    space_id = H5Screate_simple(1, &dims, NULL);
+    VRFY((space_id >= 0), "H5Screate_simple succeeded");
+    dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
+    VRFY((dcpl_id >= 0), "H5Pcreate succeeded");
+    ret = H5Pset_chunk(dcpl_id, 1, &cdims);
+    VRFY((ret >= 0), "H5Pset_chunk succeeded");
+    dset_id = H5Dcreate2(file_id, "dset", H5T_NATIVE_CHAR, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
+    VRFY((dset_id >= 0), "H5Dcreate2 succeeded");
+
+    /* Close ids */
+    ret = H5Dclose(dset_id);
+    VRFY((dset_id >= 0), "H5Dclose succeeded");
+    ret = H5Sclose(space_id);
+    VRFY((space_id >= 0), "H5Sclose succeeded");
+    ret = H5Pclose(dcpl_id);
+    VRFY((dcpl_id >= 0), "H5Pclose succeeded");
+    ret = H5Pclose(fapl_id);
+    VRFY((fapl_id >= 0), "H5Pclose succeeded");
+
+    /* Close file */
+    ret = H5Fclose(file_id);
+    VRFY((ret >= 0), "H5Fclose succeeded");
+
+    return;
+} /* end chunk_align_bug_1() */
+
+
 /*=============================================================================
  *                         End of t_mdset.c
  *===========================================================================*/
diff --git a/testpar/t_mpi.c b/testpar/t_mpi.c
index c234257..3d501c9 100644
--- a/testpar/t_mpi.c
+++ b/testpar/t_mpi.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_pflush1.c b/testpar/t_pflush1.c
index 1bcfeb8..0782f3d 100644
--- a/testpar/t_pflush1.c
+++ b/testpar/t_pflush1.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_pflush2.c b/testpar/t_pflush2.c
index f9f8459..2051f4e 100644
--- a/testpar/t_pflush2.c
+++ b/testpar/t_pflush2.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_ph5basic.c b/testpar/t_ph5basic.c
index 76eeaef..574591c 100644
--- a/testpar/t_ph5basic.c
+++ b/testpar/t_ph5basic.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_prestart.c b/testpar/t_prestart.c
index fab4a7c..719d150 100644
--- a/testpar/t_prestart.c
+++ b/testpar/t_prestart.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_prop.c b/testpar/t_prop.c
index 2cc0f5e..d5efa94 100644
--- a/testpar/t_prop.c
+++ b/testpar/t_prop.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_pshutdown.c b/testpar/t_pshutdown.c
index be9734f..def7071 100644
--- a/testpar/t_pshutdown.c
+++ b/testpar/t_pshutdown.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/t_shapesame.c b/testpar/t_shapesame.c
index f6392aa..d81d2be 100644
--- a/testpar/t_shapesame.c
+++ b/testpar/t_shapesame.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -4764,7 +4762,7 @@ void pause_proc(void)
 	    }
 	    printf("waiting(%ds) for file %s ...\n", time_int, greenlight);
 	    fflush(stdout);
-	    HDsleep(time_int);
+            HDsleep(time_int);
 	}
     MPI_Barrier(MPI_COMM_WORLD);
 }
@@ -5078,24 +5076,24 @@ int main(int argc, char **argv)
     /* Shape Same tests using contigous hyperslab */
 #if 1
     AddTest("sscontig1", sscontig1, NULL,
-	"Shape Same, contigous hyperslab, ind IO, contig datasets", PARATESTFILE);
+	"Cntg hslab, ind IO, cntg dsets", PARATESTFILE);
     AddTest("sscontig2", sscontig2, NULL,
-	"Shape Same, contigous hyperslab, col IO, contig datasets", PARATESTFILE);
+	"Cntg hslab, col IO, cntg dsets", PARATESTFILE);
     AddTest("sscontig3", sscontig3, NULL,
-	"Shape Same, contigous hyperslab, ind IO, chunked datasets", PARATESTFILE);
+	"Cntg hslab, ind IO, chnk dsets", PARATESTFILE);
     AddTest("sscontig4", sscontig4, NULL,
-	"Shape Same, contigous hyperslab, col IO, chunked datasets", PARATESTFILE);
+	"Cntg hslab, col IO, chnk dsets", PARATESTFILE);
 #endif
 
     /* Shape Same tests using checker board hyperslab */
     AddTest("sschecker1", sschecker1, NULL,
-	"Shape Same, checker hyperslab, ind IO, contig datasets", PARATESTFILE);
+	"Check hslab, ind IO, cntg dsets", PARATESTFILE);
     AddTest("sschecker2", sschecker2, NULL,
-	"Shape Same, checker hyperslab, col IO, contig datasets", PARATESTFILE);
+	"Check hslab, col IO, cntg dsets", PARATESTFILE);
     AddTest("sschecker3", sschecker3, NULL,
-	"Shape Same, checker hyperslab, ind IO, chunked datasets", PARATESTFILE);
+	"Check hslab, ind IO, chnk dsets", PARATESTFILE);
     AddTest("sschecker4", sschecker4, NULL,
-	"Shape Same, checker hyperslab, col IO, chunked datasets", PARATESTFILE);
+	"Check hslab, col IO, chnk dsets", PARATESTFILE);
 
     /* Display testing information */
     TestInfo(argv[0]);
@@ -5147,6 +5145,12 @@ int main(int argc, char **argv)
 	printf("===================================\n");
     }
 
+    /* close HDF5 library */
+    H5close();
+
+    /* Release test infrastructure */
+    TestShutdown();
+
     MPI_Finalize();
 
     /* cannot just return (nerrors) because exit code is limited to 1byte */
diff --git a/testpar/t_span_tree.c b/testpar/t_span_tree.c
index f1487eb..a42df95 100644
--- a/testpar/t_span_tree.c
+++ b/testpar/t_span_tree.c
@@ -6,12 +6,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/testpar/testpar.h b/testpar/testpar.h
index 2c99103..84c073f 100644
--- a/testpar/testpar.h
+++ b/testpar/testpar.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* common definitions used by all parallel test programs. */
diff --git a/testpar/testphdf5.c b/testpar/testphdf5.c
index 2059bed..87d9056 100644
--- a/testpar/testphdf5.c
+++ b/testpar/testphdf5.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -88,7 +86,7 @@ void pause_proc(void)
 	    }
 	    printf("waiting(%ds) for file %s ...\n", time_int, greenlight);
 	    fflush(stdout);
-	    HDsleep(time_int);
+            HDsleep(time_int);
 	}
     MPI_Barrier(MPI_COMM_WORLD);
 }
@@ -351,6 +349,11 @@ int main(int argc, char **argv)
     AddTest("split", test_split_comm_access, NULL,
 	    "dataset using split communicators", PARATESTFILE);
 
+#ifdef PB_OUT /* temporary: disable page buffering when parallel */
+    AddTest("page_buffer", test_page_buffer_access, NULL,
+            "page buffer usage in parallel", PARATESTFILE);
+#endif
+
     AddTest("props", test_file_properties, NULL,
 	    "Coll Metadata file property settings", PARATESTFILE);
 
@@ -496,6 +499,11 @@ int main(int argc, char **argv)
                 &rr_obj_flush_confusion_params);
     }
 
+    AddTest("alnbg1",
+            chunk_align_bug_1, NULL,
+            "Chunk allocation with alignment bug.",
+            PARATESTFILE);
+
     AddTest("tldsc",
             lower_dim_size_comp_test, NULL,
             "test lower dim size comp in span tree to mpi derived type", 
@@ -589,9 +597,13 @@ int main(int argc, char **argv)
 	    printf("PHDF5 tests finished with no errors\n");
 	printf("===================================\n");
     }
+
     /* close HDF5 library */
     H5close();
 
+    /* Release test infrastructure */
+    TestShutdown();
+
     /* MPI_Finalize must be called AFTER H5close which may use MPI calls */
     MPI_Finalize();
 
diff --git a/testpar/testphdf5.h b/testpar/testphdf5.h
index 7d6ff22..322cb9b 100644
--- a/testpar/testphdf5.h
+++ b/testpar/testphdf5.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /* common definitions used by all parallel hdf5 test programs. */
@@ -246,6 +244,7 @@ void collective_group_write(void);
 void independent_group_read(void);
 void test_fapl_mpio_dup(void);
 void test_split_comm_access(void);
+void test_page_buffer_access(void);
 void dataset_atomicity(void);
 void dataset_writeInd(void);
 void dataset_writeAll(void);
@@ -285,6 +284,7 @@ void io_mode_confusion(void);
 void rr_obj_hdr_flush_confusion(void);
 void rr_obj_hdr_flush_confusion_reader(MPI_Comm comm);
 void rr_obj_hdr_flush_confusion_writer(MPI_Comm comm);
+void chunk_align_bug_1(void);
 void lower_dim_size_comp_test(void);
 void link_chunk_collective_io_test(void);
 void contig_hyperslab_dr_pio_test(ShapeSameTestMethods sstest_type);
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 0b6faa8..4b3b3d5 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_TOOLS)
 
 #-----------------------------------------------------------------------------
@@ -6,47 +6,22 @@ PROJECT (HDF5_TOOLS)
 #-----------------------------------------------------------------------------
 add_definitions (${HDF_EXTRA_C_FLAGS})
 
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SOURCE_DIR}/lib)
-
 # --------------------------------------------------------------------
 # If testing was NOT enabled, then we need to build the tools library
 # --------------------------------------------------------------------
 if (NOT BUILD_TESTING)
   add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/lib)
-endif (NOT BUILD_TESTING)
-
-#-- Add the h5diff and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5diff)
-
-#-- Add the h5ls executable
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5ls)
-
-#-- Misc Executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/misc)
-
-#-- Add the h5import and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5import)
+endif ()
 
-#-- h5Repack executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5repack)
-
-#-- Add the h5dump and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5jam)
-
-#-- Add the h5copy and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5copy)
-
-#-- Add the h5stat and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5stat)
-
-#-- Add the h5dump and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5dump)
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_SOURCE_DIR}/lib)
 
-#-- Add the h5dump and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/h5format_convert)
+#-- Add the test sources
+add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/src)
 
-#-- Add the perform and test executables
-add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/perform)
+#-- Add the tests
+if (BUILD_TESTING)
+  add_subdirectory (${HDF5_TOOLS_SOURCE_DIR}/test)
+endif ()
diff --git a/tools/COPYING b/tools/COPYING
index 6903daf..6497ace 100644
--- a/tools/COPYING
+++ b/tools/COPYING
@@ -5,12 +5,9 @@
 
   The files and subdirectories in this directory are part of HDF5.  
   The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
   help at hdfgroup.org. 
 
diff --git a/tools/Makefile.am b/tools/Makefile.am
index bffc14d..b0c33ed 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
@@ -24,6 +22,6 @@ include $(top_srcdir)/config/commence.am
 CONFIG=ordered
 
 # All subdirectories
-SUBDIRS=lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat h5format_convert perform
+SUBDIRS=lib src test
 
 include $(top_srcdir)/config/conclude.am
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 5604dbf..48d05a2 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # Tools HDF5 Makefile(.in)
 #
@@ -462,6 +460,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -583,6 +582,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -731,20 +731,22 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 CONFIG = ordered
 
 # All subdirectories
-SUBDIRS = lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat h5format_convert perform
+SUBDIRS = lib src test
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -1230,6 +1232,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1237,7 +1240,7 @@ 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)
+lib dyn 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                           \
diff --git a/tools/h5copy/CMakeLists.txt b/tools/h5copy/CMakeLists.txt
deleted file mode 100644
index 63b9b5d..0000000
--- a/tools/h5copy/CMakeLists.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5COPY)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5copy and test executables
-# --------------------------------------------------------------------
-add_executable (h5copy ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/h5copy.c)
-TARGET_NAMING (h5copy STATIC)
-TARGET_C_PROPERTIES (h5copy STATIC " " " ")
-target_link_libraries (h5copy  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5copy PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5copy)
-
-if (BUILD_TESTING)
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5copygentest ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/h5copygentest.c)
-    TARGET_NAMING (h5copygentest STATIC)
-    TARGET_C_PROPERTIES (h5copygentest STATIC " " " ")
-    target_link_libraries (h5copygentest ${HDF5_LIB_TARGET})
-    set_target_properties (h5copygentest PROPERTIES FOLDER generator/tools)
-
-    #add_test (NAME h5copygentest COMMAND $<TARGET_FILE:h5copygentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5copy ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-  
-install (
-    TARGETS
-        h5copy
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5copy/CMakeTests.cmake b/tools/h5copy/CMakeTests.cmake
deleted file mode 100644
index 4ef49ee..0000000
--- a/tools/h5copy/CMakeTests.cmake
+++ /dev/null
@@ -1,381 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-  
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the source directory into the test directory
-  # --------------------------------------------------------------------
-  set (LIST_HDF5_TEST_FILES
-      ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/testfiles/h5copy_extlinks_src.h5
-      ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/testfiles/h5copy_extlinks_trg.h5
-      ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/testfiles/h5copy_ref.h5
-      ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/testfiles/h5copytst.h5
-  )
-
-  set (LIST_OTHER_TEST_FILES
-      ${HDF5_TOOLS_H5COPY_SOURCE_DIR}/testfiles/h5copy_misc1.out
-  )
-
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-
-  foreach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
-    get_filename_component(fname "${listfiles}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${fname}")
-    #message (STATUS " Copying ${listfiles}")
-    add_custom_command (
-        TARGET     h5copy
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${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                               ###
-##############################################################################
-##############################################################################
-
-  #
-  # Perform h5copy according to passing parmeters
-  #
-  MACRO (ADD_H5_F_TEST testname resultcode infile fparam vparam sparam srcname dparam dstname)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5COPY_F-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove 
-              ./testfiles/${testname}.out.h5
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY_F-${testname}
-        COMMAND $<TARGET_FILE:h5copy> -f ${fparam} -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
-    )
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5COPY_F-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5COPY_F-${testname} PROPERTIES DEPENDS H5COPY_F-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-    # resultcode=2 will cause the test to skip the diff test
-    if (NOT ${resultcode} STREQUAL "2")
-      add_test (
-          NAME H5COPY_F-${testname}-DIFF
-          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
-      )
-      SET_TESTS_PROPERTIES(H5COPY_F-${testname}-DIFF PROPERTIES DEPENDS H5COPY_F-${testname})
-      if (${resultcode} STREQUAL "1")
-        set_tests_properties (H5COPY_F-${testname}-DIFF PROPERTIES WILL_FAIL "true")
-      endif (${resultcode} STREQUAL "1")
-    endif (NOT ${resultcode} STREQUAL "2")
-  ENDMACRO (ADD_H5_F_TEST)
-  
-  MACRO (ADD_H5_TEST testname resultcode infile vparam sparam srcname dparam dstname)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5COPY-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove 
-              ./testfiles/${testname}.out.h5
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY-${testname}
-        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
-    )
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS H5COPY-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-    # resultcode=2 will cause the test to skip the diff test
-    if (NOT ${resultcode} STREQUAL "2")
-      add_test (
-          NAME H5COPY-${testname}-DIFF
-          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
-      )
-      SET_TESTS_PROPERTIES(H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
-      if (${resultcode} STREQUAL "1")
-        set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
-      endif (${resultcode} STREQUAL "1")
-    endif (NOT ${resultcode} STREQUAL "2")
-  ENDMACRO (ADD_H5_TEST)
-  
-  MACRO (ADD_H5_TEST2 testname resultcode infile  psparam pdparam vparam sparam srcname dparam dstname)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5COPY-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove 
-              ./testfiles/${testname}.out.h5
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY-${testname}-prefill
-        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 -v -s ${psparam} -d ${pdparam}
-    )
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5COPY-${testname}-prefill PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5COPY-${testname}-prefill PROPERTIES DEPENDS H5COPY-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY-${testname}
-        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
-    )
-    set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS H5COPY-${testname}-prefill)
-    # resultcode=2 will cause the test to skip the diff test
-    if (NOT ${resultcode} STREQUAL "2")
-      add_test (
-          NAME H5COPY-${testname}-DIFF
-          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
-      )
-      SET_TESTS_PROPERTIES(H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
-      if (${resultcode} STREQUAL "1")
-        set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
-      endif (${resultcode} STREQUAL "1")
-    endif (NOT ${resultcode} STREQUAL "2")
-  ENDMACRO (ADD_H5_TEST2)
-  
-  MACRO (ADD_H5_TEST_SAME testname resultcode pfile psparam pdparam vparam sparam srcname dparam dstname)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5COPY_SAME-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove 
-              ./testfiles/${testname}.out.h5
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY_SAME-${testname}-prefill
-        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${pfile} -o ./testfiles/${testname}.out.h5 -v -s ${psparam} -d ${pdparam}
-    )
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5COPY_SAME-${testname}-prefill PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5COPY_SAME-${testname}-prefill PROPERTIES DEPENDS H5COPY_SAME-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5COPY_SAME-${testname}
-        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${testname}.out.h5 -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
-    )
-    set_tests_properties (H5COPY_SAME-${testname} PROPERTIES DEPENDS H5COPY_SAME-${testname}-prefill)
-    # resultcode=2 will cause the test to skip the diff test
-    if (NOT ${resultcode} STREQUAL "2")
-      add_test (
-          NAME H5COPY_SAME-${testname}-DIFF
-          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${testname}.out.h5 ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
-      )
-      SET_TESTS_PROPERTIES(H5COPY_SAME-${testname}-DIFF PROPERTIES DEPENDS H5COPY_SAME-${testname})
-      if (${resultcode} STREQUAL "1")
-        set_tests_properties (H5COPY_SAME-${testname}-DIFF PROPERTIES WILL_FAIL "true")
-      endif (${resultcode} STREQUAL "1")
-    endif (NOT ${resultcode} STREQUAL "2")
-  ENDMACRO (ADD_H5_TEST_SAME)
-
-  #
-  # Similiar to ADD_H5_TEST macro. Compare to outputs from source & target
-  # files instead of checking with h5ls.
-  #
-  MACRO (ADD_H5_CMP_TEST testname resultcode infile vparam sparam srcname dparam dstname)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5COPY-CMP-${testname} COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN})
-      if (${resultcode} STREQUAL "1")
-        set_tests_properties (H5COPY-CMP-${testname} PROPERTIES WILL_FAIL "true")
-      endif (${resultcode} STREQUAL "1")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5COPY-CMP-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5COPY-CMP-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove 
-              ./testfiles/${testname}.out.h5
-              ./testfiles/${testname}.out.out
-              ./testfiles/${testname}.out.out.err
-      )
-      add_test (
-          NAME H5COPY-CMP-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5copy>"
-              -D "TEST_ARGS=-i;./testfiles/${infile};-o;./testfiles/${testname}.out.h5;${vparam};${sparam};${srcname};${dparam};${dstname}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=./testfiles/${testname}.out.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=./testfiles/${testname}.out"
-              -D "TEST_MASK=true"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5COPY-CMP-${testname} PROPERTIES DEPENDS H5COPY-CMP-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_CMP_TEST)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # test file names 
-  # --------------------------------------------------------------------
-  set (HDF_FILE1 h5copytst)
-  set (HDF_FILE2 h5copy_ref)
-  set (HDF_EXT_SRC_FILE h5copy_extlinks_src)
-  set (HDF_EXT_TRG_FILE h5copy_extlinks_trg)
-
-  if (HDF5_ENABLE_USING_MEMCHECKER)
-    # Remove any output file left over from previous test run
-    add_test (
-        NAME H5COPY-clearall-objects
-        COMMAND    ${CMAKE_COMMAND}
-            -E remove 
-            simple.out.h5
-            chunk.out.h5
-            compact.out.h5
-            compound.out.h5
-            compressed.out.h5
-            named_vl.out.h5
-            nested_vl.out.h5
-            simple_top.out.h5
-            dsrename.out.h5
-            grp_empty.out.h5
-            grp_dsets.out.h5
-            grp_nested.out.h5
-            simple_group.out.h5
-            grp_rename.out.h5
-            grp_dsets_rename.out.h5
-            A_B1_simple.out.h5
-            A_B2_simple2.out.h5
-            C_D_simple.out.h5
-            E_F_grp_dsets.out.h5
-            G_H_grp_nested.out.h5
-            region_ref.out.h5
-            ext_link.out.h5
-            ext_link_f.out.h5
-            ext_dangle_noobj.out.h5
-            ext_dangle_noobj_f.out.h5
-            ext_dangle_nofile.out.h5
-            ext_dangle_nofile_f.out.h5
-            ext_link_group.out.h5
-            ext_link_group_f.out.h5
-            samefile1.out.h5
-            samefile2.out.h5
-            h5copy_misc1.out.h5
-            h5copy_misc1.out.out
-            h5copy_misc1.out.out.err
-    )
-    set_tests_properties (H5COPY-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5COPY-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5COPY-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-  
-  # "Test copying various forms of datasets"
-  ADD_H5_TEST (simple 0 ${HDF_FILE1}.h5 -v -s simple -d simple)
-  ADD_H5_TEST (chunk 0 ${HDF_FILE1}.h5 -v -s chunk -d chunk)
-  ADD_H5_TEST (compact 0 ${HDF_FILE1}.h5 -v -s compact -d compact)
-  ADD_H5_TEST (compound 0 ${HDF_FILE1}.h5 -v -s compound -d compound)
-  ADD_H5_TEST (compressed 0 ${HDF_FILE1}.h5 -v -s compressed -d compressed)
-  ADD_H5_TEST (named_vl 0 ${HDF_FILE1}.h5 -v -s named_vl -d named_vl)
-  ADD_H5_TEST (nested_vl 0 ${HDF_FILE1}.h5 -v -s nested_vl -d nested_vl)
-
-  # "Test copying dataset within group in source file to root of destination"
-  ADD_H5_TEST (simple_top 0 ${HDF_FILE1}.h5 -v -s grp_dsets/simple -d simple_top)
-
-  # "Test copying & renaming dataset"
-  ADD_H5_TEST (dsrename 0 ${HDF_FILE1}.h5 -v -s compound -d rename)
-
-  # "Test copying empty, 'full' & 'nested' groups"
-  ADD_H5_TEST (grp_empty 0 ${HDF_FILE1}.h5 -v -s grp_empty -d grp_empty)
-  ADD_H5_TEST (grp_dsets 0 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_dsets)
-  ADD_H5_TEST (grp_nested 0 ${HDF_FILE1}.h5 -v -s grp_nested -d grp_nested)
-
-  # "Test copying dataset within group in source file to group in destination"
-  ADD_H5_TEST2 (simple_group 0 ${HDF_FILE1}.h5 grp_dsets grp_dsets -v -s /grp_dsets/simple -d /grp_dsets/simple_group)
-
-  # "Test copying & renaming group"
-  ADD_H5_TEST (grp_rename 0 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_rename)
-
-  # "Test copying 'full' group hierarchy into group in destination file"
-  ADD_H5_TEST2 (grp_dsets_rename 0 ${HDF_FILE1}.h5 grp_dsets grp_rename -v -s grp_dsets -d /grp_rename/grp_dsets)
-
-  # "Test copying objects into group hier. that doesn't exist yet in destination file"
-  ADD_H5_TEST (A_B1_simple 0 ${HDF_FILE1}.h5 -vp -s simple -d /A/B1/simple)
-  ADD_H5_TEST (A_B2_simple2 0 ${HDF_FILE1}.h5 -vp -s simple -d /A/B2/simple2)
-  ADD_H5_TEST (C_D_simple 0 ${HDF_FILE1}.h5 -vp -s /grp_dsets/simple -d /C/D/simple)
-  ADD_H5_TEST (E_F_grp_dsets 0 ${HDF_FILE1}.h5 -vp -s /grp_dsets -d /E/F/grp_dsets)
-  ADD_H5_TEST (G_H_grp_nested 0 ${HDF_FILE1}.h5 -vp -s /grp_nested -d /G/H/grp_nested)
-  
-############# COPY REFERENCES ##############
-
-  # "Test copying object and region references"
-  ADD_H5_F_TEST (region_ref 2 ${HDF_FILE2}.h5 ref -v -s / -d /COPY)
-
-############# COPY EXT LINKS ############## 
-
-  # "Test copying external link directly without -f ext"
-  ADD_H5_TEST (ext_link 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_dset -d /copy1_dset)
-
-  # "Test copying external link directly with -f ext"
-  ADD_H5_F_TEST (ext_link_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_dset -d /copy2_dset)
-
-  # "Test copying dangling external link (no obj) directly without -f ext"
-  ADD_H5_TEST (ext_dangle_noobj 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_1)
-
-  # "Test copying dangling external link (no obj) directly with -f ext"
-  ADD_H5_F_TEST (ext_dangle_noobj_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_2)
-
-  # "Test copying dangling external link (no file) directly without -f ext"
-  ADD_H5_TEST (ext_dangle_nofile 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_1)
-
-  # "Test copying dangling external link (no file) directly with -f ext"
-  ADD_H5_F_TEST (ext_dangle_nofile_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_2)
-
-  # "Test copying a group contains external links without -f ext"
-  ADD_H5_TEST (ext_link_group 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext -d /copy1_group)
-
-  # "Test copying a group contains external links with -f ext"
-  ADD_H5_F_TEST (ext_link_group_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext -d /copy2_group) 
-
-############# Test misc. ############## 
-
-  #-----------------------------------------------------------------
-  # "Test copying object into group which doesn't exist, without -p"
-  #
-  ADD_H5_CMP_TEST (h5copy_misc1 1 ${HDF_FILE1}.h5 -v -s /simple -d /g1/g2/simple)
-  
-  #-------------------------------------------
-  # "Test copying objects to the same file "
-  #
-  # - dataset
-  ADD_H5_TEST_SAME (samefile1 0 ${HDF_FILE1}.h5 /simple /simple -v -s /simple -d /simple_cp)
-  # - group with some datasets
-  ADD_H5_TEST_SAME (samefile2 0 ${HDF_FILE1}.h5 /grp_dsets /grp_dsets -v -s /grp_dsets -d /grp_dsets_cp)
diff --git a/tools/h5copy/Makefile.am b/tools/h5copy/Makefile.am
deleted file mode 100644
index 9d326ce..0000000
--- a/tools/h5copy/Makefile.am
+++ /dev/null
@@ -1,50 +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.
-##
-## 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
-
-# Test programs and scripts
-TEST_PROG=h5copygentest
-TEST_SCRIPT=testh5copy.sh
-
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5copy$(EXEEXT)
-
-# This is our main target, the h5copy tool
-bin_PROGRAMS=h5copy
-check_PROGRAMS=$(TEST_PROG)
-
-# Add h5copy specific linker flags here
-h5copy_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# source file for the test file generator
-h5copygentest_SOURCES=h5copygentest.c
-
-# All programs depend on the hdf5 and h5tools libraries
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES+=*.h5
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5copy/Makefile.in b/tools/h5copy/Makefile.in
deleted file mode 100644
index a462395..0000000
--- a/tools/h5copy/Makefile.in
+++ /dev/null
@@ -1,1492 +0,0 @@
-# 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 = 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5copy.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-am__EXEEXT_1 = h5copygentest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-h5copy_SOURCES = h5copy.c
-h5copy_OBJECTS = h5copy.$(OBJEXT)
-h5copy_LDADD = $(LDADD)
-h5copy_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 = 
-h5copy_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5copy_LDFLAGS) $(LDFLAGS) -o $@
-am_h5copygentest_OBJECTS = h5copygentest.$(OBJEXT)
-h5copygentest_OBJECTS = $(am_h5copygentest_OBJECTS)
-h5copygentest_LDADD = $(LDADD)
-h5copygentest_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 = h5copy.c $(h5copygentest_SOURCES)
-DIST_SOURCES = h5copy.c $(h5copygentest_SOURCES)
-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)/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@
-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
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5dumpgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
-
-# Test programs and scripts
-TEST_PROG = h5copygentest
-TEST_SCRIPT = testh5copy.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5copy$(EXEEXT)
-
-# Add h5copy specific linker flags here
-h5copy_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# source file for the test file generator
-h5copygentest_SOURCES = h5copygentest.c
-
-# All programs depend on the hdf5 and h5tools libraries
-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/h5copy/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5copy/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):
-testh5copy.sh: $(top_builddir)/config.status $(srcdir)/testh5copy.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
-
-h5copy$(EXEEXT): $(h5copy_OBJECTS) $(h5copy_DEPENDENCIES) $(EXTRA_h5copy_DEPENDENCIES) 
-	@rm -f h5copy$(EXEEXT)
-	$(AM_V_CCLD)$(h5copy_LINK) $(h5copy_OBJECTS) $(h5copy_LDADD) $(LIBS)
-
-h5copygentest$(EXEEXT): $(h5copygentest_OBJECTS) $(h5copygentest_DEPENDENCIES) $(EXTRA_h5copygentest_DEPENDENCIES) 
-	@rm -f h5copygentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5copygentest_OBJECTS) $(h5copygentest_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5copy.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5copygentest.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 $$?
-h5copygentest.log: h5copygentest$(EXEEXT)
-	@p='h5copygentest$(EXEEXT)'; \
-	b='h5copygentest'; \
-	$(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)
-
-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/h5copy/h5copy.c b/tools/h5copy/h5copy.c
deleted file mode 100644
index 278cd3e..0000000
--- a/tools/h5copy/h5copy.c
+++ /dev/null
@@ -1,510 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include <string.h>
-#include <stdlib.h>
-
-/* Name of tool */
-#define PROGRAMNAME "h5copy"
-
-/* command-line options: short and long-named parameters */
-static const char *s_opts = "d:f:hi:o:ps:vV";
-static struct long_options l_opts[] = {
-    { "destination", require_arg, 'd' },
-    { "flag", require_arg, 'f' },
-    { "help", no_arg, 'h' },
-    { "input", require_arg, 'i' },
-    { "output", require_arg, 'o' },
-    { "parents", no_arg, 'p' },
-    { "source", require_arg, 's' },
-    { "verbose", no_arg, 'v' },
-    { "version", no_arg, 'V' },
-    { NULL, 0, '\0' }
-};
-char         *fname_src = NULL;
-char         *fname_dst = NULL;
-char         *oname_src = NULL;
-char         *oname_dst = NULL;
-char         *str_flag = NULL;
-
-/*-------------------------------------------------------------------------
- * Function:    leave
- *
- * Purpose:     Shutdown MPI & HDF5 and call exit()
- *
- * Return:      Does not return
- *
- * Programmer:  Quincey Koziol
- *              Saturday, 31. January 2004
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-leave(int ret)
-{
-    if (fname_src)
-        HDfree(fname_src);
-    if (fname_dst)
-        HDfree(fname_dst);
-    if (oname_dst)
-        HDfree(oname_dst);
-    if (oname_src)
-        HDfree(oname_src);
-    if (str_flag)
-        HDfree(str_flag);
-
-    h5tools_close();
-    HDexit(ret);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: Prints a usage message on stderr and then returns.
- *
- * Return: void
- *
- * Programmer: Pedro Vicente Nunes, 7/8/2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (void)
-{
-    HDfprintf(stdout, "\
-usage: h5copy [OPTIONS] [OBJECTS...]\n\
-   OBJECTS\n\
-      -i, --input        input file name\n\
-      -o, --output       output file name\n\
-      -s, --source       source object name\n\
-      -d, --destination  destination object name\n\
-   OPTIONS\n\
-      -h, --help         Print a usage message and exit\n\
-      -p, --parents      No error if existing, make parent groups as needed\n\
-      -v, --verbose      Print information about OBJECTS and OPTIONS\n\
-      -V, --version      Print version number and exit\n\
-      -f, --flag         Flag type\n\n\
-      Flag type is one of the following strings:\n\n\
-      shallow     Copy only immediate members for groups\n\n\
-      soft        Expand soft links into new objects\n\n\
-      ext         Expand external links into new objects\n\n\
-      ref         Copy references and any referenced objects, i.e., objects\n\
-                  that the references point to.\n\
-                    Referenced objects are copied in addition to the objects\n\
-                  specified on the command line and reference datasets are\n\
-                  populated with correct reference values. Copies of referenced\n\
-                  datasets outside the copy range specified on the command line\n\
-                  will normally have a different name from the original.\n\
-                    (Default:Without this option, reference value(s) in any\n\
-                  reference datasets are set to NULL and referenced objects are\n\
-                  not copied unless they are otherwise within the copy range\n\
-                  specified on the command line.)\n\n\
-      noattr      Copy object without copying attributes\n\n\
-      allflags    Switches all flags from the default to the non-default setting\n\n\
-      These flag types correspond to the following API symbols\n\n\
-      H5O_COPY_SHALLOW_HIERARCHY_FLAG\n\
-      H5O_COPY_EXPAND_SOFT_LINK_FLAG\n\
-      H5O_COPY_EXPAND_EXT_LINK_FLAG\n\
-      H5O_COPY_EXPAND_REFERENCE_FLAG\n\
-      H5O_COPY_WITHOUT_ATTR_FLAG\n\
-      H5O_COPY_ALL\n");
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: parse_flag
- *
- * Purpose: read the flag -f STRING
- *
- * STRING is one of the following (API symbol and description)
- *
- * shallow  H5O_COPY_SHALLOW_HIERARCHY_FLAG:  Copy only immediate members for groups
- * soft     H5O_COPY_EXPAND_SOFT_LINK_FLAG:  Expand soft links into new objects
- * ext      H5O_COPY_EXPAND_EXT_LINK_FLAG: Expand external links into new objects
- * ref      H5O_COPY_EXPAND_OBJ_REFERENCE_FLAG: Copy objects that are pointed by references
- * noattr   H5O_COPY_WITHOUT_ATTR_FLAG Copy object without copying attributes
- * allflags Switches all flags from the default to the non-default setting
- *
- * Return: Success:    SUCCEED
- *         Failure:    FAIL
- *
- * Programmer: Pedro Vicente Nunes, 7/8/2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-
-static int parse_flag(const char* s_flag, unsigned *flag)
-{
-    unsigned fla=0;
-
-    if (HDstrcmp(s_flag,"shallow")==0)
-    {
-        fla = H5O_COPY_SHALLOW_HIERARCHY_FLAG;
-    }
-    else  if (HDstrcmp(s_flag,"soft")==0)
-    {
-        fla = H5O_COPY_EXPAND_SOFT_LINK_FLAG;
-    }
-    else  if (HDstrcmp(s_flag,"ext")==0)
-    {
-        fla = H5O_COPY_EXPAND_EXT_LINK_FLAG;
-    }
-    else  if (HDstrcmp(s_flag,"ref")==0)
-    {
-        fla = H5O_COPY_EXPAND_REFERENCE_FLAG;
-    }
-    else  if (HDstrcmp(s_flag,"noattr")==0)
-    {
-        fla = H5O_COPY_WITHOUT_ATTR_FLAG;
-    }
-    else  if (HDstrcmp(s_flag,"allflags")==0)
-    {
-        fla = H5O_COPY_ALL;
-    }
-    else  if (HDstrcmp(s_flag,"nullmsg")==0)
-    {
-        fla = H5O_COPY_PRESERVE_NULL_FLAG;
-    }
-    else
-    {
-        error_msg("Error in input flag\n");
-        return -1;
-    }
-
-    *flag = (*flag) | fla;
-
-    return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: main program
- *
- * Programmer: Pedro Vicente Nunes
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-int
-main (int argc, const char *argv[])
-{
-    hid_t        fid_src = -1;
-    hid_t        fid_dst = -1;
-    unsigned     flag = 0;
-    unsigned     verbose = 0;
-    unsigned     parents = 0;
-    hid_t        ocpl_id = (-1);          /* Object copy property list */
-    hid_t        lcpl_id = (-1);          /* Link creation property list */
-    int          opt;
-    int          li_ret;
-    h5tool_link_info_t linkinfo;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* initialize h5tools lib */
-    h5tools_init();
-
-    /* init linkinfo struct */
-    HDmemset(&linkinfo, 0, sizeof(h5tool_link_info_t));
-
-    /* Check for no command line parameters */
-    if(argc == 1) 
-    {
-        usage();
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* parse command line options */
-    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
-    {
-        switch ((char)opt)
-        {
-        case 'd':
-            oname_dst = HDstrdup(opt_arg);
-            break;
-
-        case 'f':
-            /* validate flag */
-            if (parse_flag(opt_arg,&flag)<0)
-            {
-                usage();
-                leave(EXIT_FAILURE);
-            }
-            str_flag = HDstrdup(opt_arg);
-            break;
-
-        case 'h':
-            usage();
-            leave(EXIT_SUCCESS);
-            break;
-
-        case 'i':
-            fname_src = HDstrdup(opt_arg);
-            break;
-
-        case 'o':
-            fname_dst = HDstrdup(opt_arg);
-            break;
-
-        case 'p':
-            parents = 1;
-            break;
-
-        case 's':
-            oname_src = HDstrdup(opt_arg);
-            break;
-
-        case 'V':
-            print_version(h5tools_getprogname());
-            leave(EXIT_SUCCESS);
-            break;
-
-        case 'v':
-            verbose = 1;
-            break;
-
-        default:
-            usage();
-            leave(EXIT_FAILURE);
-        }
-    } /* end of while */
-
-/*-------------------------------------------------------------------------
- * check for missing file/object names
- *-------------------------------------------------------------------------*/
-
-    if (fname_src==NULL)
-    {
-        error_msg("Input file name missing\n");
-        usage();
-        leave(EXIT_FAILURE);
-    }
-
-    if (fname_dst==NULL)
-    {
-        error_msg("Output file name missing\n");
-        usage();
-        leave(EXIT_FAILURE);
-    }
-
-    if (oname_src==NULL)
-    {
-        error_msg("Source object name missing\n");
-        usage();
-        leave(EXIT_FAILURE);
-    }
-
-    if (oname_dst==NULL)
-    {
-        error_msg("Destination object name missing\n");
-        usage();
-        leave(EXIT_FAILURE);
-    }
-
-   /*-------------------------------------------------------------------------
-    * open output file
-    *-------------------------------------------------------------------------*/
-
-    /* Attempt to open an existing HDF5 file first. Need to open the dst file
-       before the src file just in case that the dst and src are the same file
-     */
-    fid_dst = h5tools_fopen(fname_dst, H5F_ACC_RDWR, H5P_DEFAULT, NULL, NULL, 0);
-
-   /*-------------------------------------------------------------------------
-    * open input file
-    *-------------------------------------------------------------------------*/
-
-    fid_src = h5tools_fopen(fname_src, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0);
-
-   /*-------------------------------------------------------------------------
-    * test for error in opening input file
-    *-------------------------------------------------------------------------*/
-    if (fid_src==-1)
-    {
-        error_msg("Could not open input file <%s>...Exiting\n", fname_src);
-        leave(EXIT_FAILURE);
-    }
-
-
-   /*-------------------------------------------------------------------------
-    * create an output file when failed to open it
-    *-------------------------------------------------------------------------*/
-
-    /* If we couldn't open an existing file, try creating file */
-    /* (use "EXCL" instead of "TRUNC", so we don't blow away existing non-HDF5 file) */
-    if(fid_dst < 0)
-        fid_dst = H5Fcreate(fname_dst, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
-
-   /*-------------------------------------------------------------------------
-    * test for error in opening output file
-    *-------------------------------------------------------------------------*/
-    if (fid_dst==-1)
-    {
-        error_msg("Could not open output file <%s>...Exiting\n", fname_dst);
-        leave(EXIT_FAILURE);
-    }
-
-   /*-------------------------------------------------------------------------
-    * print some info
-    *-------------------------------------------------------------------------*/
-
-    if (verbose)
-    {
-        printf("Copying file <%s> and object <%s> to file <%s> and object <%s>\n",
-        fname_src, oname_src, fname_dst, oname_dst);
-        if (flag) {
-            HDassert(str_flag);
-            printf("Using %s flag\n", str_flag);
-        }
-    }
-
-
-   /*-------------------------------------------------------------------------
-    * create property lists for copy
-    *-------------------------------------------------------------------------*/
-
-    /* create property to pass copy options */
-    if ( (ocpl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0)
-        goto error;
-
-    /* set options for object copy */
-    if (flag)
-    {
-        if ( H5Pset_copy_object(ocpl_id, flag) < 0)
-            goto error;
-    }
-
-    /* Create link creation property list */
-    if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) {
-        error_msg("Could not create link creation property list\n");
-        goto error;
-    } /* end if */
-
-    /* Check for creating intermediate groups */
-    if(parents) {
-        /* Set the intermediate group creation property */
-        if(H5Pset_create_intermediate_group(lcpl_id, 1) < 0) {
-            error_msg("Could not set property for creating parent groups\n");
-            goto error;
-        } /* end if */
-
-        /* Display some output if requested */
-        if(verbose)
-            printf("%s: Creating parent groups\n", h5tools_getprogname());
-    } /* end if */
-    else /* error, if parent groups doesn't already exist in destination file */
-    {
-        size_t        i, len;
-
-        len = HDstrlen(oname_dst);        
-
-        /* check if all the parents groups exist. skip root group */
-        for (i = 1; i < len; i++)
-        {
-            if ('/'==oname_dst[i])
-            {
-                char         *str_ptr;
-
-                str_ptr = (char *)HDcalloc(i + 1, sizeof(char));
-                HDstrncpy(str_ptr, oname_dst, i);
-                str_ptr[i]='\0';
-                if (H5Lexists(fid_dst, str_ptr, H5P_DEFAULT) <= 0)
-                {
-                    error_msg("group <%s> doesn't exist. Use -p to create parent groups.\n", str_ptr);
-                    HDfree(str_ptr);
-                    goto error;
-                }
-                HDfree(str_ptr);
-            }
-        }
-    }
-
-   /*-------------------------------------------------------------------------
-    * do the copy
-    *-------------------------------------------------------------------------*/
- 
-    if(verbose)
-        linkinfo.opt.msg_mode = 1;
- 
-    li_ret = H5tools_get_symlink_info(fid_src, oname_src, &linkinfo, 1);
-    if (li_ret == 0) /* dangling link */
-    {
-        if(H5Lcopy(fid_src, oname_src, 
-                   fid_dst, oname_dst,
-                   H5P_DEFAULT, H5P_DEFAULT) < 0)
-            goto error;
-    }
-    else /* valid link */
-    {
-        if (H5Ocopy(fid_src,          /* Source file or group identifier */
-                  oname_src,        /* Name of the source object to be copied */
-                  fid_dst,          /* Destination file or group identifier  */
-                  oname_dst,        /* Name of the destination object  */
-                  ocpl_id,          /* Object copy property list */
-                  lcpl_id)<0)       /* Link creation property list */
-            goto error;
-    }
-
-    /* free link info path */
-    if (linkinfo.trg_path)
-        HDfree(linkinfo.trg_path);
-
-    /* close propertis */
-    if(H5Pclose(ocpl_id)<0)
-        goto error;
-    if(H5Pclose(lcpl_id)<0)
-        goto error;
-
-    /* close files */
-    if (H5Fclose(fid_src)<0)
-        goto error;
-    if (H5Fclose(fid_dst)<0)
-        goto error;
-
-    leave(EXIT_SUCCESS);
-
-error:
-    printf("Error in copy...Exiting\n");
-
-    /* free link info path */
-    if (linkinfo.trg_path)
-        HDfree(linkinfo.trg_path);
-
- H5E_BEGIN_TRY {
-    H5Pclose(ocpl_id);
-    H5Pclose(lcpl_id);
-    H5Fclose(fid_src);
-    H5Fclose(fid_dst);
- } H5E_END_TRY;
-
- leave(EXIT_FAILURE);
-}
-
diff --git a/tools/h5copy/h5copygentest.c b/tools/h5copy/h5copygentest.c
deleted file mode 100644
index 45d4e16..0000000
--- a/tools/h5copy/h5copygentest.c
+++ /dev/null
@@ -1,920 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Generate the binary hdf5 file for the h5copy tests
- */
-#include <stdlib.h>
-#include "hdf5.h"
-#include "H5private.h"
-
-/* 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"
-
-/* objects in HDF_FILE1 */
-#define DATASET_SIMPLE          "simple"
-#define DATASET_CHUNK           "chunk"
-#define DATASET_COMPACT         "compact"
-#define DATASET_COMPOUND        "compound"
-#define DATASET_COMPRESSED      "compressed"
-#define DATASET_NAMED_VL        "named_vl"
-#define DATASET_NESTED_VL       "nested_vl"
-#define GROUP_EMPTY             "grp_empty"
-#define GROUP_DATASETS          "grp_dsets"
-#define GROUP_NESTED            "grp_nested"
-
-/* Obj reference */
-#define OBJ_REF_DS "Dset1"
-#define OBJ_REF_GRP "Group"
-/* Region reference */
-#define REG_REF_DS1 "Dset_REGREF"
-#define REG_REF_DS2 "Dset2"
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_simple
- *
- * Purpose:     Generate a simple dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_simple(hid_t loc_id)
-{
-    hid_t   sid, did;
-    hsize_t dims[1] = {6};
-    int     buf[6]  = {1,2,3,4,5,6};
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_SIMPLE, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Sclose(sid);
-    H5Dclose(did);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_chunked
- *
- * Purpose:     Generate a chunked dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_chunked(hid_t loc_id)
-{
-    hid_t   sid, did, pid;
-    hsize_t dims[1] = {6};
-    hsize_t chunk_dims[1] = {2};
-    int     buf[6]  = {1,2,3,4,5,6};
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create property plist */
-    pid = H5Pcreate(H5P_DATASET_CREATE);
-    H5Pset_chunk(pid, 1, chunk_dims);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_CHUNK, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Pclose(pid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_compact
- *
- * Purpose:     Generate a compact dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_compact(hid_t loc_id)
-{
-    hid_t   sid, did, pid;
-    hsize_t dims[1] = {6};
-    int     buf[6]  = {1,2,3,4,5,6};
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create property plist  */
-    pid = H5Pcreate(H5P_DATASET_CREATE);
-    H5Pset_layout (pid,H5D_COMPACT);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_COMPACT, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Pclose(pid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_compound
- *
- * Purpose:     Generate a compound dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_compound(hid_t loc_id)
-{
-    typedef struct s_t
-    {
-        char str1[20];
-        char str2[20];
-    } s_t;
-    hid_t   sid, did, tid_c, tid_s;
-    hsize_t dims[1] = {2};
-    s_t     buf[2]  = {{"str1", "str2"}, {"str3", "str4"}};
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create a compound type */
-    tid_c = H5Tcreate(H5T_COMPOUND, sizeof(s_t));
-    tid_s = H5Tcopy(H5T_C_S1);
-    H5Tset_size(tid_s, 20);
-
-    H5Tinsert(tid_c, "str1", HOFFSET(s_t,str1), tid_s);
-    H5Tinsert(tid_c, "str2", HOFFSET(s_t,str2), tid_s);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_COMPOUND, tid_c, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, tid_c, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Tclose(tid_c);
-    H5Tclose(tid_s);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_compressed
- *
- * Purpose:     Generate a compressed dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_compressed(hid_t loc_id)
-{
-    hid_t   sid, did, pid;
-    hsize_t dims[1] = {6};
-    hsize_t chunk_dims[1] = {2};
-    int     buf[6]  = {1,2,3,4,5,6};
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create property plist for chunk*/
-    pid = H5Pcreate(H5P_DATASET_CREATE);
-    H5Pset_chunk(pid, 1, chunk_dims);
-
-    /* set the deflate filter */
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    H5Pset_deflate(pid, 1);
-#endif
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_COMPRESSED, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Pclose(pid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_named_vl
- *
- * Purpose:     Generate a variable lenght named datatype for a dataset in
-                LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_named_vl(hid_t loc_id)
-{
-    hid_t   sid, did, tid;
-    hsize_t dims[1] = {2};
-    hvl_t   buf[2];
-
-    /* allocate and initialize VL dataset to write */
-    buf[0].len = 1;
-    buf[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf[0].p)[0]=1;
-    buf[1].len = 2;
-    buf[1].p = HDmalloc( 2 * sizeof(int));
-    ((int *)buf[1].p)[0]=2;
-    ((int *)buf[1].p)[1]=3;
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create datatype */
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-
-    /* create named datatype */
-    H5Tcommit2(loc_id, "vl", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_NAMED_VL, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf);
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Tclose(tid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_nested_vl
- *
- * Purpose:     Generate a nested variable length dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static void gent_nested_vl(hid_t loc_id)
-{
-    hid_t   sid, did, tid1, tid2;
-    hsize_t dims[1] = {2};
-    hvl_t   buf[2];
-    hvl_t   *tvl;
-
-    /* allocate and initialize VL dataset to write */
-    buf[0].len = 1;
-    buf[0].p = HDmalloc( 1 * sizeof(hvl_t));
-    tvl = (hvl_t *)buf[0].p;
-    tvl->p = HDmalloc( 1 * sizeof(int) );
-    tvl->len = 1;
-    ((int *)tvl->p)[0]=1;
-
-    buf[1].len = 1;
-    buf[1].p = HDmalloc( 1 * sizeof(hvl_t));
-    tvl = (hvl_t *)buf[1].p;
-    tvl->p = HDmalloc( 2 * sizeof(int) );
-    tvl->len = 2;
-    ((int *)tvl->p)[0]=2;
-    ((int *)tvl->p)[1]=3;
-
-    /* create dataspace */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create datatype */
-    tid1 = H5Tvlen_create(H5T_NATIVE_INT);
-
-    /* create nested VL datatype */
-    tid2 = H5Tvlen_create(tid1);
-
-    /* create dataset */
-    did = H5Dcreate2(loc_id, DATASET_NESTED_VL, tid2, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* close */
-    H5Dvlen_reclaim(tid2,sid,H5P_DEFAULT,buf);
-    H5Sclose(sid);
-    H5Dclose(did);
-    H5Tclose(tid1);
-    H5Tclose(tid2);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_datasets
- *
- * Purpose: Generate all datasets in a particular location
- *
- *-------------------------------------------------------------------------
- */
-static void gent_datasets(hid_t loc_id)
-{
-    gent_simple(loc_id);
-    gent_chunked(loc_id);
-    gent_compact(loc_id);
-    gent_compound(loc_id);
-    gent_compressed(loc_id);
-    gent_named_vl(loc_id);
-    gent_nested_vl(loc_id);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_empty_group
- *
- * Purpose: Generate an empty group in a location
- *
- *-------------------------------------------------------------------------
- */
-static void gent_empty_group(hid_t loc_id)
-{
-    hid_t   gid;
-
-    /* Create group in location */
-    gid = H5Gcreate2(loc_id, GROUP_EMPTY, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Release resources */
-    H5Gclose(gid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_nested_datasets
- *
- * Purpose: Generate a group in a location and populate it with the "standard"
- *    datasets
- *
- *-------------------------------------------------------------------------
- */
-static void gent_nested_datasets(hid_t loc_id)
-{
-    hid_t   gid;
-
-    /* Create group in location */
-    gid = H5Gcreate2(loc_id, GROUP_DATASETS, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Add datasets to group created */
-    gent_datasets(gid);
-
-    /* Release resources */
-    H5Gclose(gid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_nested_group
- *
- * Purpose: Generate a group in a location and populate it with another group
- *    containing the "standard" datasets
- *
- *-------------------------------------------------------------------------
- */
-static void gent_nested_group(hid_t loc_id)
-{
-    hid_t   gid;
-
-    /* Create group in location */
-    gid = H5Gcreate2(loc_id, GROUP_NESTED, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Add datasets to group created */
-    gent_nested_datasets(gid);
-
-    /* Release resources */
-    H5Gclose(gid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gen_obj_ref
- *
- * Purpose: Generate object references to dataset and group
- *
- * Programmer: Jonathan Kim (Feb 23, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_obj_ref(hid_t loc_id)
-{
-    hid_t sid=0, oid=0;
-    hsize_t dims1[1]={3};
-    hsize_t dims2[1]={2};
-    int data[3] = {10,20,30};
-    int status;
-
-    /*---------------------
-     * create obj references to the previously created objects.
-     * Passing -1 as reference is an object.*/
-    hobj_ref_t or_data[2];  /* write buffer */
-    herr_t ret = SUCCEED;
-
-    /*--------------
-     * add dataset */
-    sid = H5Screate_simple(1, dims1, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    oid = H5Dcreate2 (loc_id, OBJ_REF_DS, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (oid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(oid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    H5Dclose(oid);
-    H5Sclose(sid);
-
-    /*--------------
-     * add group  */
-    oid = H5Gcreate2 (loc_id, OBJ_REF_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (oid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    H5Gclose(oid);
-
-    status = H5Rcreate (&or_data[0], loc_id, OBJ_REF_DS, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    status = H5Rcreate (&or_data[1], loc_id, OBJ_REF_GRP, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    sid = H5Screate_simple (1, dims2, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    oid = H5Dcreate2 (loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (oid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, or_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if(oid > 0)
-        H5Dclose(oid);
-    if(sid > 0)
-        H5Sclose(sid);
-
-    return ret;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gen_region_ref
- *
- * Purpose: Generate dataset region references
- *
- * Programmer: Jonathan Kim (Feb 23, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_region_ref(hid_t loc_id)
-{
-    hid_t sid=0, oid1=0, oid2=0;
-    int status;
-    herr_t ret = SUCCEED;
-    char  data[3][16] = {"The quick brown", "fox jumps over ", "the 5 lazy dogs"};
-    hsize_t dims2[2] = {3,16};
-    hsize_t coords[4][2] = { {0,1}, {2,11}, {1,0}, {2,4} };
-    hdset_reg_ref_t  rr_data[2];
-    hsize_t start[2] = {0,0};
-    hsize_t stride[2] = {2,11};
-    hsize_t count[2] = {2,2};
-    hsize_t block[2] = {1,3};
-    hsize_t dims1[1] = {2};
-
-    sid = H5Screate_simple (2, dims2, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create normal dataset which is refered */
-    oid2 = H5Dcreate2 (loc_id, REG_REF_DS2, H5T_STD_I8LE, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (oid2 < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* write values to dataset */
-    status = H5Dwrite (oid2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* select elements space for reference */
-    status = H5Sselect_elements (sid, H5S_SELECT_SET, 4, coords[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference from elements space */
-    status = H5Rcreate (&rr_data[0], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* select hyperslab space for reference */
-    status = H5Sselect_hyperslab (sid, H5S_SELECT_SET, start, stride, count, block);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference from hyperslab space */
-    status = H5Rcreate (&rr_data[1], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    H5Sclose (sid);
-
-    /* Create dataspace. */
-    sid = H5Screate_simple (1, dims1, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference dataset */
-    oid1 = H5Dcreate2 (loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (oid1 < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* write data as region references */
-    status = H5Dwrite (oid1, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if (oid1 > 0)
-        H5Dclose (oid1);
-    if (oid2 > 0)
-        H5Dclose (oid2);
-    if (sid > 0)
-        H5Sclose (sid);
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function: Test_Obj_Copy
- *
- * Purpose: Testing with various objects
- *
- *------------------------------------------------------------------------*/
-static void Test_Obj_Copy(void)
-{
-    hid_t fid = (-1);		/* File id */
-    hid_t fapl_new = (-1);	/* File access property id */
-    unsigned new_format;		/* New format or old format */
-
-    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);
-
-        H5Fclose(fid);
-        fid = (-1);
-    } /* end for */
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *------------------------------------------------------------------------*/
-    if(fid > 0)
-        H5Fclose(fid);
-    if(fapl_new > 0)
-        H5Pclose(fapl_new);
-}
-
-/*-------------------------------------------------------------------------
- * Function: Test_Ref_Copy
- *
- * Purpose: Testing with various references
- *
- *------------------------------------------------------------------------*/
-static void Test_Ref_Copy(void)
-{
-    hid_t fid=0;
-    herr_t status;
-
-    fid = H5Fcreate (HDF_FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_FILE2);
-        goto out;
-    }
-
-    /* add object reference */
-    status = gen_obj_ref(fid);
-    if (status < 0)
-        fprintf(stderr, "Failed to generate object reference.\n");
-
-    /* add region reference */
-    status = gen_region_ref(fid);
-    if (status < 0)
-        fprintf(stderr, "Failed to generate region reference.\n");
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *------------------------------------------------------------------------*/
-    if(fid > 0)
-        H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gen_extlink_trg
- *
- * Purpose: generate target external link objs
- *
- * Programmer: Jonathan Kim (March 03, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_extlink_trg(hid_t loc_id)
-{
-    hid_t gid=0, tid=0;
-    int status;
-    herr_t ret = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    /*--------------
-     * target file */
-    gid = H5Gcreate2(loc_id, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*--------------
-     * add dataset */
-     gent_simple(loc_id);
-
-    /*--------------------
-     * add named datatype
-     */
-     tid = H5Tcopy(H5T_NATIVE_INT);
-     status = H5Tcommit2(loc_id, "datatype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if(gid > 0)
-        H5Gclose(gid);
-    if(tid > 0)
-        H5Tclose(tid);
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function: gen_extlink_src
- *
- * Purpose: generate source external link objs
- *
- * Programmer: Jonathan Kim (March 03, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_extlink_src(hid_t loc_id)
-{
-    hid_t gid=0;
-    int status;
-    herr_t ret = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    gid = H5Gcreate2(loc_id, "/group_ext", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * External links
-    *------------------------------------------------------------------------*/
-    /* link to dataset */
-    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/simple", gid, "extlink_dset", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* link to group */
-    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/group", gid, "extlink_grp", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* link to datatype */
-    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/datatype", gid, "extlink_datatype", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* dangling link - no obj*/
-    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "notyet", gid, "extlink_notyet1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* dangling link - no file */
-    status = H5Lcreate_external("notyet_file.h5", "notyet", gid, "extlink_notyet2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if(gid > 0)
-        H5Gclose(gid);
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function: Test_Extlink_Copy
- *
- * Purpose: gerenate external link files
- *
- *------------------------------------------------------------------------*/
-static void Test_Extlink_Copy(void)
-{
-    hid_t fid1=0;
-    hid_t fid2=0;
-    herr_t status;
-
-    fid1 = H5Fcreate (HDF_EXT_SRC_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_EXT_SRC_FILE);
-        goto out;
-    }
-
-    fid2 = H5Fcreate (HDF_EXT_TRG_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_EXT_TRG_FILE);
-        goto out;
-    }
-
-    /* add links to source external link file */
-    status = gen_extlink_src(fid1);
-    if (status < 0)
-        fprintf(stderr, "Error: %s> gen_extlink_src failed.\n", HDF_EXT_SRC_FILE);
-
-    /* add objs to target external link file */
-    status = gen_extlink_trg(fid2);
-    if (status < 0)
-        fprintf(stderr, "Error: %s> gen_extlink_trg failed.\n", HDF_EXT_TRG_FILE);
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *------------------------------------------------------------------------*/
-    if(fid1 > 0)
-        H5Fclose(fid1);
-    if(fid2 > 0)
-        H5Fclose(fid2);
-}
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- *-------------------------------------------------------------------------
- */
-
-int main(void)
-{
-    Test_Obj_Copy();
-    Test_Ref_Copy();
-    Test_Extlink_Copy();
-
-    return 0;
-}
-
diff --git a/tools/h5copy/testfiles/h5copy_extlinks_src.out.ls b/tools/h5copy/testfiles/h5copy_extlinks_src.out.ls
deleted file mode 100644
index 0134714..0000000
--- a/tools/h5copy/testfiles/h5copy_extlinks_src.out.ls
+++ /dev/null
@@ -1,43 +0,0 @@
-Opened "./testfiles/h5copy_extlinks_src.out.h5" with sec2 driver.
-/                        Group
-    Location:  1:96
-    Links:     1
-/copy1_dset              Dataset {6/6}
-    Location:  1:800
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/copy1_group             Group
-    Location:  1:4696
-    Links:     1
-/copy1_group/extlink_datatype External Link {h5copy_extlinks_trg.h5//datatype}
-/copy1_group/extlink_dset External Link {h5copy_extlinks_trg.h5//simple}
-/copy1_group/extlink_grp External Link {h5copy_extlinks_trg.h5//group}
-/copy1_group/extlink_notyet1 External Link {h5copy_extlinks_trg.h5//notyet}
-/copy1_group/extlink_notyet2 External Link {notyet_file.h5//notyet}
-/copy2_dset              Dataset {6/6}
-    Location:  1:4216
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/copy2_group             Group
-    Location:  1:5128
-    Links:     1
-/copy2_group/extlink_datatype Type
-    Location:  1:6328
-    Links:     1
-    Type:      shared-1:6328 32-bit little-endian integer
-/copy2_group/extlink_dset Dataset {6/6}
-    Location:  1:5496
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/copy2_group/extlink_grp Group
-    Location:  1:6288
-    Links:     1
-/copy2_group/extlink_notyet1 External Link {h5copy_extlinks_trg.h5//notyet}
-/copy2_group/extlink_notyet2 External Link {notyet_file.h5//notyet}
-/copy_dangle1_1          External Link {h5copy_extlinks_trg.h5//notyet}
-/copy_dangle1_2          External Link {h5copy_extlinks_trg.h5//notyet}
-/copy_dangle2_1          External Link {notyet_file.h5//notyet}
-/copy_dangle2_2          External Link {notyet_file.h5//notyet}
diff --git a/tools/h5copy/testfiles/h5copy_ref.out.ls b/tools/h5copy/testfiles/h5copy_ref.out.ls
deleted file mode 100644
index d685af2..0000000
--- a/tools/h5copy/testfiles/h5copy_ref.out.ls
+++ /dev/null
@@ -1,31 +0,0 @@
-Opened "./testfiles/h5copy_ref.out.h5" with sec2 driver.
-/                        Group
-    Location:  1:96
-    Links:     1
-/COPY                    Group
-    Location:  1:1464
-    Links:     1
-/COPY/Dset1              Dataset {3/3}
-    Location:  1:1504
-    Links:     2
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/COPY/Dset2              Dataset {3/3, 16/16}
-    Location:  1:1960
-    Links:     3
-    Storage:   <details removed for portability>
-    Type:      8-bit integer
-/COPY/Dset_OBJREF        Dataset {2/2}
-    Location:  1:5184
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      object reference
-/COPY/Dset_REGREF        Dataset {2/2}
-    Location:  1:5304
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      dataset region reference
-/COPY/Group              Group
-    Location:  1:2096
-    Links:     3
-/~obj_pointed_by_2096    Group, same as /COPY/Group
diff --git a/tools/h5copy/testfiles/h5copytst.h5 b/tools/h5copy/testfiles/h5copytst.h5
deleted file mode 100644
index 0f10410..0000000
Binary files a/tools/h5copy/testfiles/h5copytst.h5 and /dev/null differ
diff --git a/tools/h5copy/testfiles/h5copytst.out.ls b/tools/h5copy/testfiles/h5copytst.out.ls
deleted file mode 100644
index 4044aaf..0000000
--- a/tools/h5copy/testfiles/h5copytst.out.ls
+++ /dev/null
@@ -1,429 +0,0 @@
-Opened "./testfiles/h5copytst.out.h5" with sec2 driver.
-/                        Group
-    Location:  1:96
-    Links:     1
-/A                       Group
-    Location:  1:84304
-    Links:     1
-/A/B1                    Group
-    Location:  1:85008
-    Links:     1
-/A/B1/simple             Dataset {6/6}
-    Location:  1:84176
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/A/B2                    Group
-    Location:  1:88544
-    Links:     1
-/A/B2/simple2            Dataset {6/6}
-    Location:  1:88416
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/C                       Group
-    Location:  1:91752
-    Links:     1
-/C/D                     Group
-    Location:  1:92456
-    Links:     1
-/C/D/simple              Dataset {6/6}
-    Location:  1:91624
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/E                       Group
-    Location:  1:106368
-    Links:     1
-/E/F                     Group
-    Location:  1:107072
-    Links:     1
-/E/F/grp_dsets           Group
-    Location:  1:94568
-    Links:     1
-/E/F/grp_dsets/chunk     Dataset {6/6}
-    Location:  1:98752
-    Links:     1
-    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:99208
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/E/F/grp_dsets/compound  Dataset {2/2}
-    Location:  1:99344
-    Links:     1
-    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:101656
-    Links:     1
-    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:105920
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:106048 variable length of
-                   32-bit little-endian integer
-/E/F/grp_dsets/nested_vl Dataset {2/2}
-    Location:  1:106096
-    Links:     1
-    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:106240
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/E/F/grp_dsets/vl        Type
-    Location:  1:106048
-    Links:     2
-    Type:      shared-1:106048 variable length of
-                   32-bit little-endian integer
-/G                       Group
-    Location:  1:122016
-    Links:     1
-/G/H                     Group
-    Location:  1:122720
-    Links:     1
-/G/H/grp_nested          Group
-    Location:  1:109096
-    Links:     1
-/G/H/grp_nested/grp_dsets Group
-    Location:  1:109888
-    Links:     1
-/G/H/grp_nested/grp_dsets/chunk Dataset {6/6}
-    Location:  1:114072
-    Links:     1
-    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:114528
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/G/H/grp_nested/grp_dsets/compound Dataset {2/2}
-    Location:  1:114664
-    Links:     1
-    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:116976
-    Links:     1
-    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:121240
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:121368 variable length of
-                   32-bit little-endian integer
-/G/H/grp_nested/grp_dsets/nested_vl Dataset {2/2}
-    Location:  1:121416
-    Links:     1
-    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:121560
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/G/H/grp_nested/grp_dsets/vl Type
-    Location:  1:121368
-    Links:     2
-    Type:      shared-1:121368 variable length of
-                   32-bit little-endian integer
-/chunk                   Dataset {6/6}
-    Location:  1:6312
-    Links:     1
-    Chunks:    {2} 8 bytes
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/compact                 Dataset {6/6}
-    Location:  1:6440
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/compound                Dataset {2/2}
-    Location:  1:8624
-    Links:     1
-    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:12984
-    Links:     1
-    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:28128
-    Links:     1
-/grp_dsets/chunk         Dataset {6/6}
-    Location:  1:32312
-    Links:     1
-    Chunks:    {2} 8 bytes
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_dsets/compact       Dataset {6/6}
-    Location:  1:32768
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_dsets/compound      Dataset {2/2}
-    Location:  1:32904
-    Links:     1
-    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:35216
-    Links:     1
-    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:39480
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:39608 variable length of
-                   32-bit little-endian integer
-/grp_dsets/nested_vl     Dataset {2/2}
-    Location:  1:39656
-    Links:     1
-    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:39800
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_dsets/simple_group  Dataset {6/6}
-    Location:  1:55912
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_dsets/vl            Type
-    Location:  1:39608
-    Links:     2
-    Type:      shared-1:39608 variable length of
-                   32-bit little-endian integer
-/grp_empty               Group
-    Location:  1:27336
-    Links:     1
-/grp_nested              Group
-    Location:  1:40592
-    Links:     1
-/grp_nested/grp_dsets    Group
-    Location:  1:41384
-    Links:     1
-/grp_nested/grp_dsets/chunk Dataset {6/6}
-    Location:  1:45568
-    Links:     1
-    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:46024
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_nested/grp_dsets/compound Dataset {2/2}
-    Location:  1:46160
-    Links:     1
-    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:48472
-    Links:     1
-    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:52736
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:52864 variable length of
-                   32-bit little-endian integer
-/grp_nested/grp_dsets/nested_vl Dataset {2/2}
-    Location:  1:52912
-    Links:     1
-    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:53056
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_nested/grp_dsets/vl Type
-    Location:  1:52864
-    Links:     2
-    Type:      shared-1:52864 variable length of
-                   32-bit little-endian integer
-/grp_rename              Group
-    Location:  1:57120
-    Links:     1
-/grp_rename/chunk        Dataset {6/6}
-    Location:  1:61304
-    Links:     1
-    Chunks:    {2} 8 bytes
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_rename/compact      Dataset {6/6}
-    Location:  1:61760
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_rename/compound     Dataset {2/2}
-    Location:  1:61896
-    Links:     1
-    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:64208
-    Links:     1
-    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:70000
-    Links:     1
-/grp_rename/grp_dsets/chunk Dataset {6/6}
-    Location:  1:74184
-    Links:     1
-    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:74640
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_rename/grp_dsets/compound Dataset {2/2}
-    Location:  1:74776
-    Links:     1
-    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:77088
-    Links:     1
-    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:81352
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:81480 variable length of
-                   32-bit little-endian integer
-/grp_rename/grp_dsets/nested_vl Dataset {2/2}
-    Location:  1:81528
-    Links:     1
-    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:81672
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_rename/grp_dsets/vl Type
-    Location:  1:81480
-    Links:     2
-    Type:      shared-1:81480 variable length of
-                   32-bit little-endian integer
-/grp_rename/named_vl     Dataset {2/2}
-    Location:  1:68472
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:68600 variable length of
-                   32-bit little-endian integer
-/grp_rename/nested_vl    Dataset {2/2}
-    Location:  1:68648
-    Links:     1
-    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:68792
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/grp_rename/vl           Type
-    Location:  1:68600
-    Links:     2
-    Type:      shared-1:68600 variable length of
-                   32-bit little-endian integer
-/named_vl                Dataset {2/2}
-    Location:  1:17280
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      shared-1:17408 variable length of
-                   32-bit little-endian integer
-/nested_vl               Dataset {2/2}
-    Location:  1:21760
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      variable length of
-                   variable length of
-                       32-bit little-endian integer
-/rename                  Dataset {2/2}
-    Location:  1:26128
-    Links:     1
-    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
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
-/simple_top              Dataset {6/6}
-    Location:  1:23952
-    Links:     1
-    Storage:   <details removed for portability>
-    Type:      32-bit little-endian integer
diff --git a/tools/h5copy/testfiles/h5copytst_new.h5 b/tools/h5copy/testfiles/h5copytst_new.h5
deleted file mode 100644
index 57e1805..0000000
Binary files a/tools/h5copy/testfiles/h5copytst_new.h5 and /dev/null differ
diff --git a/tools/h5copy/testh5copy.sh.in b/tools/h5copy/testh5copy.sh.in
deleted file mode 100644
index 77c64c4..0000000
--- a/tools/h5copy/testh5copy.sh.in
+++ /dev/null
@@ -1,605 +0,0 @@
-#! /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 h5copy tool
-#
-# Pedro Vicente Nunes (pvn at hdfgroup.org), Albert Cheng (acheng at hdfgroup.org)
-# Thursday, July 20, 2006
-#
-
-srcdir=@srcdir@
-
-# 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"
-
-TESTNAME=h5copy
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-######################################################################
-# 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 of files that will be copied over to local test dir
-LIST_HDF5_TEST_FILES="
-$SRC_H5COPY_TESTFILES/h5copytst.h5
-$SRC_H5COPY_TESTFILES/h5copy_ref.h5
-$SRC_H5COPY_TESTFILES/h5copy_extlinks_src.h5
-$SRC_H5COPY_TESTFILES/h5copy_extlinks_trg.h5
-"
-
-# List of expect files that will be copied over to local test dir
-LIST_OTHER_TEST_FILES="
-$SRC_H5COPY_TESTFILES/h5copy_misc1.out
-"
-
-H5COPY=h5copy               # The tool name
-H5COPY_BIN=`pwd`/$H5COPY    # The path of the tool binary
-H5DIFF=h5diff               # The h5diff tool name 
-H5DIFF_BIN=`pwd`/../h5diff/$H5DIFF    # The path of the h5diff tool binary
-H5LS=h5ls                   # The h5ls tool name 
-H5LS_ARGS=-Svr              # Arguments to the h5ls tool
-H5LS_BIN=`pwd`/../h5ls/$H5LS # The path of the h5ls tool binary
-
-RM='rm -rf'
-CMP='cmp -s'
-DIFF='diff -c'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-nerrors=0
-verbose=yes
-h5haveexitcode=yes	    # default is yes
-
-TESTDIR=./testfiles
-test -d $TESTDIR || mkdir $TESTDIR
-
-# 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 "SKIP" message
-SKIP() {
-	 TESTING $H5COPY $@
-	  echo  " -SKIP-"
-}
-
-# 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'
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Verifying".
-#
-VERIFY() 
-{
-    SPACES="                                                               "
-    echo "Verifying h5diff output $* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Verifying".
-#
-VERIFY_OUTPUT() 
-{
-    SPACES="                                                               "
-    echo "Verifying output files $* $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 h5copy can complete
-# with exit status 0, consider it pass. If a test fails then increment
-# the `nerrors' global variable.
-# Assumed arguments:
-# $1 is -i
-# $2 is input file
-# $3 is -o
-# $4 is output file
-# $* everything else arguments for h5copy.
-
-TOOLTEST() 
-{
-    actualout="$TESTDIR/tooltest.actualout"
-    actualerr="$TESTDIR/tooltest.actualerr"
-    runh5diff=yes
-    if [ "$1" = -i ]; then
-        inputfile=$2
-    else
-        if [ "$1" = -f ]; then
-            inputfile=$4
-        else
-            inputfile=$3
-        fi
-        runh5diff=no
-    fi
-    if [ "$3" = -o ]; then
-        outputfile=$4
-    else 
-        if [ "$1" = -f ]; then
-            outputfile=$6
-        else
-            outputfile=$5
-        fi
-        runh5diff=no
-    fi
-  
-    TESTING $H5COPY $@
-    (
-        echo "#############################"
-        echo " output for '$H5COPY $@'"
-        echo "#############################"
-        $RUNSERIAL $H5COPY_BIN $@
-    ) > $actualout 2> $actualerr
-    RET=$?
-    if [ $RET != 0 ]; then
-        echo "*FAILED*"
-        echo "failed result is:"
-        cat $actualout
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-    
-        if [ $runh5diff != no ]; then
-            H5DIFFTEST $inputfile $outputfile $7 $9
-        fi
-
-        # Clean up output file
-        if test -z "$HDF5_NOCLEANUP"; then
-            rm -f $actualout $actualerr $outputfile
-        fi
-    fi
-}
-
-# TOOLTEST back-to-back
-TOOLTEST_PREFILL() 
-{
-    actualout="$TESTDIR/tooltest.actualout"
-    actualerr="$TESTDIR/tooltest.actualerr"
-    runh5diff=yes
-    if [ "$1" = -i ]; then
-        inputfile=$2
-    else
-        runh5diff=no
-    fi
-    if [ "$3" = -o ]; then
-        outputfile=$4
-    else 
-        runh5diff=no
-    fi
-    
-    grp_name=$5
-    grp_name2=$6
-    obj_name=$7
-    obj_name2=$8
-  
-    TESTING $H5COPY $@
-    (
-        echo "#############################"
-        echo " output for '$H5COPY $@'"
-        echo "#############################"
-        $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $grp_name -d $grp_name2 
-    ) > $actualout 2> $actualerr
-    RET=$?
-    if [ $RET != 0 ]; then
-        echo "*FAILED*"
-        echo "failed result is:"
-        cat $actualout
-        nerrors="`expr $nerrors + 1`"
-    else
-        TESTING $H5COPY $@
-        (
-            echo "#############################"
-            echo " output for '$H5COPY $@'"
-            echo "#############################"
-            $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $obj_name -d $obj_name2 
-        ) > $actualout 2> $actualerr
-        RET=$?
-        if [ $RET != 0 ]; then
-            echo "*FAILED*"
-            echo "failed result is:"
-            cat $actualout
-            nerrors="`expr $nerrors + 1`"
-        else
-            echo " PASSED"
-    
-            if [ $runh5diff != no ]; then
-                H5DIFFTEST $inputfile $outputfile $obj_name $obj_name2
-            fi
-        
-            # Clean up output file
-            if test -z "$HDF5_NOCLEANUP"; then
-                rm -f $actualout $actualerr $outputfile
-            fi
-        fi
-    fi
-}
-
-# TOOLTEST back-to-back
-TOOLTEST_SAME() 
-{
-    actualout="$TESTDIR/tooltest.actualout"
-    actualerr="$TESTDIR/tooltest.actualerr"
-    runh5diff=yes
-    if [ "$1" = -i ]; then
-        inputfile=$2
-    else
-        runh5diff=no
-    fi
-    if [ "$3" = -o ]; then
-        outputfile=$4
-    else 
-        runh5diff=no
-    fi
-    
-    grp_name=$5
-    grp_name2=$6
-  
-    TESTING $H5COPY $@
-    (
-        echo "#############################"
-        echo " output for '$H5COPY $@'"
-        echo "#############################"
-        $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $grp_name -d $grp_name 
-    ) > $actualout 2> $actualerr
-    RET=$?
-    if [ $RET != 0 ]; then
-        echo "*FAILED*"
-        echo "failed result is:"
-        cat $actualout
-        nerrors="`expr $nerrors + 1`"
-    else
-        TESTING $H5COPY $@
-        (
-            echo "#############################"
-            echo " output for '$H5COPY $@'"
-            echo "#############################"
-            $RUNSERIAL $H5COPY_BIN  -i $outputfile -o $outputfile -v -s $grp_name -d $grp_name2 
-        ) > $actualout 2> $actualerr
-        RET=$?
-        if [ $RET != 0 ]; then
-            echo "*FAILED*"
-            echo "failed result is:"
-            cat $actualout
-            nerrors="`expr $nerrors + 1`"
-        else
-            echo " PASSED"
-    
-            if [ $runh5diff != no ]; then
-                H5DIFFTEST $outputfile $outputfile $grp_name $grp_name2
-            fi
-        
-            # Clean up output file
-            if test -z "$HDF5_NOCLEANUP"; then
-                rm -f $actualout $actualerr $outputfile
-            fi
-        fi
-    fi
-}
-
-
-# Compare the two text files
-# PASS if same
-# FAIL if different, and show the diff
-#
-# Assumed arguments:
-# $1 is text file1 (expected output)
-# $2 is text file2 (actual output)
-CMP_OUTPUT()
-{
-    expect=$1
-    actual=$2
-
-    VERIFY_OUTPUT $@
-    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 output differs from actual output"
-        nerrors="`expr $nerrors + 1`"
-        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
-    fi
-}
-
-TOOLTEST_FAIL() 
-{
-    expectout="$TESTDIR/$1"
-    actualout="$TESTDIR/$1.actualout"
-    actualerr="$TESTDIR/$1.actualerr"
-    actualout_sav=${actualout}-sav
-    actualerr_sav=${actualerr}-sav
-    shift
-    if [ "$1" = -i ]; then
-        inputfile=$2
-    fi
-    if [ "$3" = -o ]; then
-        outputfile=$4
-    fi
-
-    TESTING $H5COPY $@
-    (
-        #echo "#############################"
-        #echo " output for '$H5COPY $@'"
-        #echo "#############################"
-        $RUNSERIAL $H5COPY_BIN $@
-    ) > $actualout 2> $actualerr
-
-    RET=$?
-    # save actualout and actualerr in case they are needed later.
-    cp $actualout $actualout_sav
-    STDOUT_FILTER $actualout
-    cp $actualerr $actualerr_sav
-    STDERR_FILTER $actualerr
-    if [ $RET != 0 ]; then
-        echo " PASSED"
-        # Verifying output text from h5copy
-        if [ "$expectout" != "SKIP" ]; then
-            # combine stderr to stdout to compare the output at once.
-            # We may seperate stdout and stderr later.
-            cat $actualerr >> $actualout
-            CMP_OUTPUT $expectout $actualout
-        fi
-    else
-        echo "*FAILED*"
-        echo "failed result is:"
-        cat $actualout
-        nerrors="`expr $nerrors + 1`"
-    fi
-   
-
-    # Clean up output file
-    if test -z "$HDF5_NOCLEANUP"; then
-        rm -f $actualout $actualerr $actualout_sav $actualerr_sav $outputfile
-    fi
-}
-
-
-# Call the h5diff tool
-#
-H5DIFFTEST() 
-{
-    VERIFY  $@
-    $RUNSERIAL $H5DIFF_BIN -q "$@" 
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-    fi
-}
-
-# Call the h5diff tool with a call that is expected to fail
-#
-H5DIFFTEST_FAIL() 
-{
-    VERIFY  $@
-    $RUNSERIAL $H5DIFF_BIN -q "$@" 
-    RET=$?
-
-    if [ $h5haveexitcode = 'yes' -a $RET != 1 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-    fi
-}
-
-# Copy single datasets of various forms from one group to another,
-#       adding object copied to the destination file each time
-#
-# Assumed arguments:
-# <none>
-COPY_OBJECTS() 
-{
-    TESTFILE="$TESTDIR/h5copytst.h5"
-
-    echo "Test copying various forms of datasets"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/simple.out.h5 -v -s simple     -d simple
-    TOOLTEST -i $TESTFILE -o $TESTDIR/chunk.out.h5 -v -s chunk      -d chunk
-    TOOLTEST -i $TESTFILE -o $TESTDIR/compact.out.h5 -v -s compact    -d compact
-    TOOLTEST -i $TESTFILE -o $TESTDIR/compound.out.h5 -v -s compound   -d compound
-    TOOLTEST -i $TESTFILE -o $TESTDIR/compressed.out.h5 -v -s compressed -d compressed
-    TOOLTEST -i $TESTFILE -o $TESTDIR/named_vl.out.h5 -v -s named_vl   -d named_vl
-    TOOLTEST -i $TESTFILE -o $TESTDIR/nested_vl.out.h5 -v -s nested_vl  -d nested_vl
-
-    echo "Test copying dataset within group in source file to root of destination"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/simple_top.out.h5 -v -s grp_dsets/simple  -d simple_top
-
-    echo "Test copying & renaming dataset"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/dsrename.out.h5 -v -s compound   -d rename
-
-    echo "Test copying empty, 'full' & 'nested' groups"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_empty.out.h5 -v -s grp_empty  -d grp_empty
-    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_dsets.out.h5 -v -s grp_dsets  -d grp_dsets
-    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_nested.out.h5 -v -s grp_nested -d grp_nested
-
-    echo "Test copying dataset within group in source file to group in destination"
-    TOOLTEST_PREFILL -i $TESTFILE -o $TESTDIR/simple_group.out.h5 grp_dsets grp_dsets /grp_dsets/simple /grp_dsets/simple_group
-
-    echo "Test copying & renaming group"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_rename.out.h5 -v -s grp_dsets  -d grp_rename
-
-    echo "Test copying 'full' group hierarchy into group in destination file"
-    TOOLTEST_PREFILL -i $TESTFILE -o $TESTDIR/grp_dsets_rename.out.h5 grp_dsets grp_rename grp_dsets /grp_rename/grp_dsets
-
-    echo "Test copying objects into group hier. that doesn't exist yet in destination file"
-    TOOLTEST -i $TESTFILE -o $TESTDIR/A_B1_simple.out.h5 -vp -s simple    -d /A/B1/simple
-    TOOLTEST -i $TESTFILE -o $TESTDIR/A_B2_simple2.out.h5 -vp -s simple    -d /A/B2/simple2
-    TOOLTEST -i $TESTFILE -o $TESTDIR/C_D_simple.out.h5 -vp -s /grp_dsets/simple    -d /C/D/simple
-    TOOLTEST -i $TESTFILE -o $TESTDIR/E_F_grp_dsets.out.h5 -vp -s /grp_dsets -d /E/F/grp_dsets
-    TOOLTEST -i $TESTFILE -o $TESTDIR/G_H_grp_nested.out.h5 -vp -s /grp_nested -d /G/H/grp_nested
-}
-
-# Copy references in various way.
-#
-# Assumed arguments:
-# <none>
-COPY_REFERENCES() 
-{
-    TESTFILE="$TESTDIR/h5copy_ref.h5"
-
-    echo "Test copying object and region references"
-    TOOLTEST -f ref -i $TESTFILE -o $TESTDIR/region_ref.out.h5 -v -s / -d /COPY
-}
-
-# Copy external links.
-# adding to the destination file each time compare the result
-#
-# Assumed arguments:
-# <none>
-COPY_EXT_LINKS() 
-{
-    TESTFILE="$TESTDIR/h5copy_extlinks_src.h5"
-
-    echo "Test copying external link directly without -f ext"
-    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_link.out.h5 -s /group_ext/extlink_dset -d /copy1_dset
-
-    echo "Test copying external link directly with -f ext"
-    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_link_f.out.h5 -v -s /group_ext/extlink_dset -d /copy2_dset
-
-    echo "Test copying dangling external link (no obj) directly without -f ext"
-    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_dangle_noobj.out.h5 -s /group_ext/extlink_notyet1 -d /copy_dangle1_1
-
-    echo "Test copying dangling external link (no obj) directly with -f ext"
-    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_dangle_noobj_f.out.h5 -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_2
-
-    echo "Test copying dangling external link (no file) directly without -f ext"
-    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_dangle_nofile.out.h5 -s /group_ext/extlink_notyet2 -d /copy_dangle2_1
-
-    echo "Test copying dangling external link (no file) directly with -f ext"
-    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_dangle_nofile_f.out.h5 -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_2
-
-    echo "Test copying a group contains external links without -f ext"
-    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_link_group.out.h5 -s /group_ext -d /copy1_group
-
-    echo "Test copying a group contains external links with -f ext"
-    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_link_group_f.out.h5 -v -s /group_ext -d /copy2_group
-}
-
-# Test misc.
-#
-# Assumed arguments:
-# <none>
-TEST_MISC() 
-{
-    TESTFILE="$TESTDIR/h5copytst.h5"
-
-    echo "Test copying object into group which doesn't exist, without -p"
-    TOOLTEST_FAIL h5copy_misc1.out -i $TESTFILE -o $TESTDIR/h5copy_misc1.out.h5 -v -s /simple  -d /g1/g2/simple
-
-    echo "Test copying objects to the same file "
-    TOOLTEST_SAME -i $TESTFILE -o $TESTDIR/samefile1.out.h5 /simple /simple_cp 
-    TOOLTEST_SAME -i $TESTFILE -o $TESTDIR/samefile2.out.h5 /grp_dsets /grp_dsets_cp
-}
-
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-# Start tests
-COPY_OBJECTS 
-COPY_REFERENCES
-COPY_EXT_LINKS
-TEST_MISC
-
-# 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/h5diff/CMakeLists.txt b/tools/h5diff/CMakeLists.txt
deleted file mode 100644
index 59a3241..0000000
--- a/tools/h5diff/CMakeLists.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5DIFF)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5diff executables
-# --------------------------------------------------------------------
-add_executable (h5diff
-    ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diff_common.c
-    ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diff_main.c
-)
-TARGET_NAMING (h5diff STATIC)
-TARGET_C_PROPERTIES (h5diff STATIC " " " ")
-target_link_libraries (h5diff  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5diff PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5diff)
-
-if (H5_HAVE_PARALLEL)
-  add_executable (ph5diff
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diff_common.c
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/ph5diff_main.c
-  )
-  TARGET_NAMING (ph5diff STATIC)
-  TARGET_C_PROPERTIES (ph5diff STATIC " " " ")
-  target_link_libraries (ph5diff  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-  set_target_properties (ph5diff PROPERTIES FOLDER tools)
-endif (H5_HAVE_PARALLEL)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5diff and test executables
-  # --------------------------------------------------------------------
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5diffgentest ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diffgentest.c)
-    TARGET_NAMING (h5diffgentest STATIC)
-    TARGET_C_PROPERTIES (h5diffgentest STATIC " " " ")
-    target_link_libraries (h5diffgentest ${HDF5_LIB_TARGET})
-    set_target_properties (h5diffgentest PROPERTIES FOLDER generator/tools)
-    
-    #add_test (NAME h5diffgentest COMMAND $<TARGET_FILE:h5diffgentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
- 
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5diff ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5diff
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
-
-if (H5_HAVE_PARALLEL)
-
-  #INSTALL_PROGRAM_PDB (ph5diff ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-  install (
-      TARGETS
-          ph5diff
-      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-  )
-endif (H5_HAVE_PARALLEL)
diff --git a/tools/h5diff/CMakeTests.cmake b/tools/h5diff/CMakeTests.cmake
deleted file mode 100644
index e58f90c..0000000
--- a/tools/h5diff/CMakeTests.cmake
+++ /dev/null
@@ -1,1446 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the test directory into the source directory
-  # --------------------------------------------------------------------
-  set (LIST_HDF5_TEST_FILES
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_basic1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_basic2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_types.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dtypes.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_hyper1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_hyper2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_empty.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_links.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_softlinks.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_linked_softlink.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_extlink_src.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_extlink_trg.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_ext2softlink_src.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_ext2softlink_trg.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset_zero_dim_size1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset_zero_dim_size2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_danglelinks1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_danglelinks2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-3.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude1-1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude1-2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude2-1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude2-2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude3-1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude3-2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_comp_vl_strs.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/compounds_array_vlen1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/compounds_array_vlen2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr_v_level1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr_v_level2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_enum_invalid_values.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/non_comparables1.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/non_comparables2.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/tmptest.he5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/tmptest2.he5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/tmpSingleSiteBethe.reference.h5
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/tmpSingleSiteBethe.output.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
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_10.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_100.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_101.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_102.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_103.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_104.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_11.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_12.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_13.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_14.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_15.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_1.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_2.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_3.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_17.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_171.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_172.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_18_1.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_18.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_20.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_200.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_201.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_202.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_203.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_204.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_205.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_206.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_207.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_208.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_220.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_221.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_222.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_223.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_224.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_21.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_22.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_23.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_24.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_25.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_26.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_27.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_28.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_30.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_300.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_400.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_401.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_402.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_403.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_404.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_405.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_406.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_407.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_408.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_409.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_410.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_411.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_412.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_413.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_414.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_415.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_416.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_417.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_418.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_419.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_420.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_421.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_422.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_423.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_424.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_425.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_450.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_451.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_452.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_453.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_454.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_455.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_456.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_457.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_458.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_459.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_465.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_466.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_467.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_468.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_469.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_471.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_472.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_473.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_474.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_475.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_480.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_481.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_482.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_483.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_484.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_485.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_486.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_487.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_50.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_51.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_52.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_53.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_54.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_55.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_56.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_57.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_58.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_59.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_500.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_501.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_502.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_503.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_504.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_505.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_506.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_507.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_508.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_509.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_510.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_511.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_512.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_513.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_514.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_515.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_516.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_517.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_518.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_530.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_540.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_600.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_601.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_603.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_604.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_605.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_606.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_607.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_608.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_609.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_610.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_612.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_613.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_614.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_615.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_616.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_617.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_618.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_619.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_621.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_622.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_623.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_624.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_625.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_626.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_627.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_628.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_629.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_630.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_631.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_640.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_641.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_642.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_643.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_644.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_645.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_646.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_70.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_700.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_701.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_702.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_703.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_704.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_705.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_706.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_707.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_708.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_709.txt
-      ${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_tmp1.txt
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_tmp2.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
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-
-  #
-  # copy test files from source to build dir
-  #
-  foreach (h5_tstfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
-    get_filename_component(fname "${h5_tstfiles}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${fname}")
-    #message (STATUS " Copying ${fname}")
-    add_custom_command (
-        TARGET     h5diff
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${h5_tstfiles} ${dest}
-    )
-  endforeach (h5_tstfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
-
-
-  #
-  # Overwrite system dependent files (Windows) and not VS2015
-  #
-  if (WIN32 AND MSVC_VERSION LESS 1900)
-    add_custom_command (
-        TARGET     h5diff
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_101w.txt ${PROJECT_BINARY_DIR}/testfiles/h5diff_101.txt
-    )
-
-    add_custom_command (
-        TARGET     h5diff
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_102w.txt ${PROJECT_BINARY_DIR}/testfiles/h5diff_102.txt
-    )
-    add_custom_command (
-        TARGET     h5diff
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_103w.txt ${PROJECT_BINARY_DIR}/testfiles/h5diff_103.txt
-    )
-
-    add_custom_command (
-        TARGET     h5diff
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_104w.txt ${PROJECT_BINARY_DIR}/testfiles/h5diff_104.txt
-    )
-  endif (WIN32 AND MSVC_VERSION LESS 1900)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_H5_TEST resultfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DIFF-${resultfile} COMMAND $<TARGET_FILE:h5diff> ${ARGN})
-      set_tests_properties (H5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DIFF-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${resultfile}.out ./testfiles/${resultfile}.out.err
-      )
-      add_test (
-          NAME H5DIFF-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.txt"
-              -D "TEST_APPEND=EXIT CODE:"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS "H5DIFF-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-    if (H5_HAVE_PARALLEL)
-      ADD_PH5_TEST (${resultfile} ${resultcode} ${ARGN})
-    endif (H5_HAVE_PARALLEL)
-  ENDMACRO (ADD_H5_TEST file)
-
-  MACRO (ADD_PH5_TEST resultfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME PH5DIFF-${resultfile} COMMAND $<TARGET_FILE:ph5diff> ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} ${ARGN})
-      set_tests_properties (PH5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (PH5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (PH5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME PH5DIFF-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${resultfile}_p.out ./testfiles/${resultfile}_p.out.err
-      )
-      add_test (
-          NAME PH5DIFF-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=${MPIEXEC};${MPIEXEC_PREFLAGS};${MPIEXEC_NUMPROC_FLAG};${MPIEXEC_MAX_NUMPROCS};${MPIEXEC_POSTFLAGS};$<TARGET_FILE:ph5diff>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=P_${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.txt"
-#              -D "TEST_APPEND=EXIT CODE: [0-9]"
-#              -D "TEST_REF_FILTER=EXIT CODE: 0"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -P "${HDF_RESOURCES_EXT_DIR}/prunTest.cmake"
-      )
-      set_tests_properties (PH5DIFF-${resultfile} PROPERTIES DEPENDS "PH5DIFF-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_PH5_TEST file)
-
-   # ADD_H5_NO_OUTPUT_TEST
-   # Purpose to verify only exitcode without output comparison
-   # Don't use this if possible; this may be removed.
-   MACRO (ADD_H5_NO_OUTPUT_TEST testname resultcode)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DIFF-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${testname}.out ./testfiles/${testname}.out.err
-      )
-      # if there was a previous test
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DIFF-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (NAME H5DIFF-${testname} COMMAND $<TARGET_FILE:h5diff> ${ARGN})
-    if (NOT ${resultcode} STREQUAL "0")
-      set_tests_properties (H5DIFF-${testname} PROPERTIES WILL_FAIL "true")
-    endif (NOT ${resultcode} STREQUAL "0")
-
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DIFF-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5DIFF-${testname} PROPERTIES DEPENDS H5DIFF-${testname}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_NO_OUTPUT_TEST)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # test file names
-  # --------------------------------------------------------------------
-  set (FILE1 h5diff_basic1.h5)
-  set (FILE2 h5diff_basic2.h5)
-  set (FILE3 h5diff_types.h5)
-  set (FILE4 h5diff_dtypes.h5)
-  set (FILE5 h5diff_attr1.h5)
-  set (FILE6 h5diff_attr2.h5)
-  set (FILE7 h5diff_dset1.h5)
-  set (FILE8 h5diff_dset2.h5)
-  set (FILE9 h5diff_hyper1.h5)
-  set (FILE10 h5diff_hyper2.h5)
-  set (FILE11 h5diff_empty.h5)
-  set (FILE12 h5diff_links.h5)
-  set (FILE13 h5diff_softlinks.h5)
-  set (FILE14 h5diff_linked_softlink.h5)
-  set (FILE15 h5diff_extlink_src.h5)
-  set (FILE16 h5diff_extlink_trg.h5)
-  set (FILE17 h5diff_ext2softlink_src.h5)
-  set (FILE18 h5diff_ext2softlink_trg.h5)
-  set (FILE19 h5diff_dset_zero_dim_size1.h5)
-  set (FILE20 h5diff_dset_zero_dim_size2.h5)
-  set (DANGLE_LINK_FILE1 h5diff_danglelinks1.h5)
-  set (DANGLE_LINK_FILE2 h5diff_danglelinks2.h5)
-  set (GRP_RECURSE_FILE1 h5diff_grp_recurse1.h5)
-  set (GRP_RECURSE_FILE2 h5diff_grp_recurse2.h5)
-  # group recursive - same structure via external links through files
-  set (GRP_RECURSE1_EXT h5diff_grp_recurse_ext1.h5)
-  set (GRP_RECURSE2_EXT1 h5diff_grp_recurse_ext2-1.h5)
-  set (GRP_RECURSE2_EXT2 h5diff_grp_recurse_ext2-2.h5)
-  set (GRP_RECURSE2_EXT3 h5diff_grp_recurse_ext2-3.h5)
-  # same structure, same obj name with different value
-  set (EXCLUDE_FILE1_1 h5diff_exclude1-1.h5)
-  set (EXCLUDE_FILE1_2 h5diff_exclude1-2.h5)
-  # different structure and obj names
-  set (EXCLUDE_FILE2_1 h5diff_exclude2-1.h5)
-  set (EXCLUDE_FILE2_2 h5diff_exclude2-2.h5)
-  # Only one file contains unique objs. Common objs are same.
-  set (EXCLUDE_FILE3_1 h5diff_exclude3-1.h5)
-  set (EXCLUDE_FILE3_2 h5diff_exclude3-2.h5)
-  # compound type with multiple vlen string types
-  set (COMP_VL_STRS_FILE h5diff_comp_vl_strs.h5)
-  # container types (array,vlen) with multiple nested compound types
-  set (COMPS_ARRAY_VLEN_FILE1 compounds_array_vlen1.h5)
-  set (COMPS_ARRAY_VLEN_FILE2 compounds_array_vlen2.h5)
-  # 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
-    add_test (
-      NAME H5DIFF-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove
-          h5diff_10.out
-          h5diff_10.out.err
-          h5diff_100.out
-          h5diff_100.out.err
-          h5diff_101.out
-          h5diff_101.out.err
-          h5diff_102.out
-          h5diff_102.out.err
-          h5diff_103.out
-          h5diff_103.out.err
-          h5diff_104.out
-          h5diff_104.out.err
-          h5diff_11.out
-          h5diff_11.out.err
-          h5diff_12.out
-          h5diff_12.out.err
-          h5diff_13.out
-          h5diff_13.out.err
-          h5diff_14.out
-          h5diff_14.out.err
-          h5diff_15.out
-          h5diff_15.out.err
-          h5diff_16_1.out
-          h5diff_16_1.out.err
-          h5diff_16_2.out
-          h5diff_16_2.out.err
-          h5diff_16_3.out
-          h5diff_16_3.out.err
-          h5diff_17.out
-          h5diff_17.out.err
-          h5diff_171.out
-          h5diff_171.out.err
-          h5diff_172.out
-          h5diff_172.out.err
-          h5diff_18_1.out
-          h5diff_18_1.out.err
-          h5diff_18.out
-          h5diff_18.out.err
-          h5diff_20.out
-          h5diff_20.out.err
-          h5diff_200.out
-          h5diff_200.out.err
-          h5diff_201.out
-          h5diff_201.out.err
-          h5diff_202.out
-          h5diff_202.out.err
-          h5diff_203.out
-          h5diff_203.out.err
-          h5diff_204.out
-          h5diff_204.out.err
-          h5diff_205.out
-          h5diff_205.out.err
-          h5diff_206.out
-          h5diff_206.out.err
-          h5diff_207.out
-          h5diff_207.out.err
-          h5diff_208.out
-          h5diff_208.out.err
-          h5diff_220.out
-          h5diff_220.out.err
-          h5diff_221.out
-          h5diff_221.out.err
-          h5diff_222.out
-          h5diff_222.out.err
-          h5diff_223.out
-          h5diff_223.out.err
-          h5diff_224.out
-          h5diff_224.out.err
-          h5diff_21.out
-          h5diff_21.out.err
-          h5diff_22.out
-          h5diff_22.out.err
-          h5diff_23.out
-          h5diff_23.out.err
-          h5diff_24.out
-          h5diff_24.out.err
-          h5diff_25.out
-          h5diff_25.out.err
-          h5diff_26.out
-          h5diff_26.out.err
-          h5diff_27.out
-          h5diff_27.out.err
-          h5diff_28.out
-          h5diff_28.out.err
-          h5diff_300.out
-          h5diff_300.out.err
-          h5diff_400.out
-          h5diff_400.out.err
-          h5diff_401.out
-          h5diff_401.out.err
-          h5diff_402.out
-          h5diff_402.out.err
-          h5diff_403.out
-          h5diff_403.out.err
-          h5diff_404.out
-          h5diff_404.out.err
-          h5diff_405.out
-          h5diff_405.out.err
-          h5diff_406.out
-          h5diff_406.out.err
-          h5diff_407.out
-          h5diff_407.out.err
-          h5diff_408.out
-          h5diff_408.out.err
-          h5diff_409.out
-          h5diff_409.out.err
-          h5diff_410.out
-          h5diff_410.out.err
-          h5diff_411.out
-          h5diff_411.out.err
-          h5diff_412.out
-          h5diff_412.out.err
-          h5diff_413.out
-          h5diff_413.out.err
-          h5diff_414.out
-          h5diff_414.out.err
-          h5diff_415.out
-          h5diff_415.out.err
-          h5diff_416.out
-          h5diff_416.out.err
-          h5diff_417.out
-          h5diff_417.out.err
-          h5diff_418.out
-          h5diff_418.out.err
-          h5diff_419.out
-          h5diff_419.out.err
-          h5diff_420.out
-          h5diff_420.out.err
-          h5diff_421.out
-          h5diff_421.out.err
-          h5diff_422.out
-          h5diff_422.out.err
-          h5diff_423.out
-          h5diff_423.out.err
-          h5diff_424.out
-          h5diff_424.out.err
-          h5diff_425.out
-          h5diff_425.out.err
-          h5diff_450.out
-          h5diff_450.out.err
-          h5diff_451.out
-          h5diff_451.out.err
-          h5diff_452.out
-          h5diff_452.out.err
-          h5diff_453.out
-          h5diff_453.out.err
-          h5diff_454.out
-          h5diff_454.out.err
-          h5diff_455.out
-          h5diff_455.out.err
-          h5diff_456.out
-          h5diff_456.out.err
-          h5diff_457.out
-          h5diff_457.out.err
-          h5diff_458.out
-          h5diff_458.out.err
-          h5diff_459.out
-          h5diff_459.out.err
-          h5diff_465.out
-          h5diff_465.out.err
-          h5diff_466.out
-          h5diff_466.out.err
-          h5diff_467.out
-          h5diff_467.out.err
-          h5diff_468.out
-          h5diff_468.out.err
-          h5diff_469.out
-          h5diff_469.out.err
-          h5diff_471.out
-          h5diff_471.out.err
-          h5diff_472.out
-          h5diff_472.out.err
-          h5diff_473.out
-          h5diff_473.out.err
-          h5diff_474.out
-          h5diff_474.out.err
-          h5diff_475.out
-          h5diff_475.out.err
-          h5diff_480.out
-          h5diff_480.out.err
-          h5diff_481.out
-          h5diff_481.out.err
-          h5diff_482.out
-          h5diff_482.out.err
-          h5diff_483.out
-          h5diff_483.out.err
-          h5diff_484.out
-          h5diff_484.out.err
-          h5diff_50.out
-          h5diff_50.out.err
-          h5diff_51.out
-          h5diff_51.out.err
-          h5diff_52.out
-          h5diff_52.out.err
-          h5diff_53.out
-          h5diff_53.out.err
-          h5diff_54.out
-          h5diff_54.out.err
-          h5diff_55.out
-          h5diff_55.out.err
-          h5diff_56.out
-          h5diff_56.out.err
-          h5diff_57.out
-          h5diff_57.out.err
-          h5diff_58.out
-          h5diff_58.out.err
-          h5diff_59.out
-          h5diff_59.out.err
-          h5diff_500.out
-          h5diff_500.out.err
-          h5diff_501.out
-          h5diff_501.out.err
-          h5diff_502.out
-          h5diff_502.out.err
-          h5diff_503.out
-          h5diff_503.out.err
-          h5diff_504.out
-          h5diff_504.out.err
-          h5diff_505.out
-          h5diff_505.out.err
-          h5diff_506.out
-          h5diff_506.out.err
-          h5diff_507.out
-          h5diff_507.out.err
-          h5diff_508.out
-          h5diff_508.out.err
-          h5diff_509.out
-          h5diff_509.out.err
-          h5diff_510.out
-          h5diff_510.out.err
-          h5diff_511.out
-          h5diff_511.out.err
-          h5diff_512.out
-          h5diff_512.out.err
-          h5diff_513.out
-          h5diff_513.out.err
-          h5diff_514.out
-          h5diff_514.out.err
-          h5diff_515.out
-          h5diff_515.out.err
-          h5diff_516.out
-          h5diff_516.out.err
-          h5diff_517.out
-          h5diff_517.out.err
-          h5diff_518.out
-          h5diff_518.out.err
-          h5diff_530.out
-          h5diff_530.out.err
-          h5diff_540.out
-          h5diff_540.out.err
-          h5diff_600.out
-          h5diff_600.out.err
-          h5diff_601.out
-          h5diff_601.out.err
-          h5diff_603.out
-          h5diff_603.out.err
-          h5diff_604.out
-          h5diff_604.out.err
-          h5diff_605.out
-          h5diff_605.out.err
-          h5diff_606.out
-          h5diff_606.out.err
-          h5diff_607.out
-          h5diff_607.out.err
-          h5diff_608.out
-          h5diff_608.out.err
-          h5diff_609.out
-          h5diff_609.out.err
-          h5diff_610.out
-          h5diff_610.out.err
-          h5diff_612.out
-          h5diff_612.out.err
-          h5diff_613.out
-          h5diff_613.out.err
-          h5diff_614.out
-          h5diff_614.out.err
-          h5diff_615.out
-          h5diff_615.out.err
-          h5diff_616.out
-          h5diff_616.out.err
-          h5diff_617.out
-          h5diff_617.out.err
-          h5diff_618.out
-          h5diff_618.out.err
-          h5diff_619.out
-          h5diff_619.out.err
-          h5diff_621.out
-          h5diff_621.out.err
-          h5diff_622.out
-          h5diff_622.out.err
-          h5diff_623.out
-          h5diff_623.out.err
-          h5diff_624.out
-          h5diff_624.out.err
-          h5diff_625.out
-          h5diff_625.out.err
-          h5diff_626.out
-          h5diff_626.out.err
-          h5diff_627.out
-          h5diff_627.out.err
-          h5diff_628.out
-          h5diff_628.out.err
-          h5diff_629.out
-          h5diff_629.out.err
-          h5diff_640.out
-          h5diff_640.out.err
-          h5diff_641.out
-          h5diff_641.out.err
-          h5diff_642.out
-          h5diff_642.out.err
-          h5diff_643.out
-          h5diff_643.out.err
-          h5diff_644.out
-          h5diff_644.out.err
-          h5diff_645.out
-          h5diff_645.out.err
-          h5diff_646.out
-          h5diff_646.out.err
-          h5diff_70.out
-          h5diff_70.out.err
-          h5diff_700.out
-          h5diff_700.out.err
-          h5diff_701.out
-          h5diff_701.out.err
-          h5diff_702.out
-          h5diff_702.out.err
-          h5diff_703.out
-          h5diff_703.out.err
-          h5diff_704.out
-          h5diff_704.out.err
-          h5diff_705.out
-          h5diff_705.out.err
-          h5diff_706.out
-          h5diff_706.out.err
-          h5diff_707.out
-          h5diff_707.out.err
-          h5diff_708.out
-          h5diff_708.out.err
-          h5diff_709.out
-          h5diff_709.out.err
-          h5diff_710.out
-          h5diff_710.out.err
-          h5diff_80.out
-          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 "")
-      set_tests_properties (H5DIFF-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5DIFF-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-# ############################################################################
-# # Common usage
-# ############################################################################
-
-# 1.0
-ADD_H5_TEST (h5diff_10 0 -h)
-
-# 1.1 normal mode
-ADD_H5_TEST (h5diff_11 1  ${FILE1} ${FILE2})
-
-# 1.2 normal mode with objects
-ADD_H5_TEST (h5diff_12 1  ${FILE1} ${FILE2}  g1/dset1 g1/dset2)
-
-# 1.3 report mode
-ADD_H5_TEST (h5diff_13 1 -r ${FILE1} ${FILE2})
-
-# 1.4 report  mode with objects
-ADD_H5_TEST (h5diff_14 1  -r ${FILE1} ${FILE2} g1/dset1 g1/dset2)
-
-# 1.5 with -d
-ADD_H5_TEST (h5diff_15 1 --report --delta=5 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 1.6.1 with -p (int)
-ADD_H5_TEST (h5diff_16_1 1 -v -p 0.02 ${FILE1} ${FILE1} g1/dset5 g1/dset6)
-
-# 1.6.2 with -p (unsigned long_long)
-ADD_H5_TEST (h5diff_16_2 1 --verbose --relative=0.02 ${FILE1} ${FILE1} g1/dset7 g1/dset8)
-
-# 1.6.3 with -p (double)
-ADD_H5_TEST (h5diff_16_3 1 -v -p 0.02 ${FILE1} ${FILE1} g1/dset9 g1/dset10)
-
-# 1.7 verbose mode
-ADD_H5_TEST (h5diff_17 1 -v ${FILE1} ${FILE2})
-
-# 1.7 test 32-bit INFINITY
-ADD_H5_TEST (h5diff_171 0 -v ${FILE1} ${FILE1} /g1/fp19 /g1/fp19_COPY)
-
-# 1.7 test 64-bit INFINITY
-ADD_H5_TEST (h5diff_172 0 -v ${FILE1} ${FILE1} /g1/fp20 /g1/fp20_COPY)
-
-# 1.8 quiet mode
-ADD_H5_TEST (h5diff_18 1 -q ${FILE1} ${FILE2})
-
-# 1.8 -v and -q
-ADD_H5_TEST (h5diff_18_1 2 -v -q ${FILE1} ${FILE2})
-
-# ##############################################################################
-# # not comparable types
-# ##############################################################################
-
-# 2.0
-ADD_H5_TEST (h5diff_20 0 -v ${FILE3} ${FILE3}  dset g1)
-
-# 2.1
-ADD_H5_TEST (h5diff_21 0 -v ${FILE3} ${FILE3} dset l1)
-
-# 2.2
-ADD_H5_TEST (h5diff_22 0 -v  ${FILE3} ${FILE3} dset t1)
-
-# ##############################################################################
-# # compare groups, types, links (no differences and differences)
-# ##############################################################################
-
-# 2.3
-ADD_H5_TEST (h5diff_23 0 -v ${FILE3} ${FILE3} g1 g1)
-
-# 2.4
-ADD_H5_TEST (h5diff_24 0 -v ${FILE3} ${FILE3} t1 t1)
-
-# 2.5
-ADD_H5_TEST (h5diff_25 0 -v ${FILE3} ${FILE3} l1 l1)
-
-# 2.6
-ADD_H5_TEST (h5diff_26 0 -v ${FILE3} ${FILE3} g1 g2)
-
-# 2.7
-ADD_H5_TEST (h5diff_27 1 -v ${FILE3} ${FILE3} t1 t2)
-
-# 2.8
-ADD_H5_TEST (h5diff_28 1 -v ${FILE3} ${FILE3} l1 l2)
-
-# ##############################################################################
-# # Enum value tests (may become more comprehensive in the future)
-# ##############################################################################
-
-# 3.0
-# test enum types which may have invalid values
-ADD_H5_TEST (h5diff_30 1 -v h5diff_enum_invalid_values.h5 h5diff_enum_invalid_values.h5 dset1 dset2)
-
-
-# ##############################################################################
-# # Dataset datatypes
-# ##############################################################################
-
-# 5.0
-ADD_H5_TEST (h5diff_50 1 -v ${FILE4} ${FILE4} dset0a dset0b)
-
-# 5.1
-ADD_H5_TEST (h5diff_51 1 -v ${FILE4} ${FILE4} dset1a dset1b)
-
-# 5.2
-ADD_H5_TEST (h5diff_52 1 -v ${FILE4} ${FILE4} dset2a dset2b)
-
-# 5.3
-ADD_H5_TEST (h5diff_53 1 -v ${FILE4} ${FILE4} dset3a dset4b)
-
-# 5.4
-ADD_H5_TEST (h5diff_54 1 -v ${FILE4} ${FILE4} dset4a dset4b)
-
-# 5.5
-ADD_H5_TEST (h5diff_55 1 -v ${FILE4} ${FILE4} dset5a dset5b)
-
-# 5.6
-ADD_H5_TEST (h5diff_56 1 -v ${FILE4} ${FILE4} dset6a dset6b)
-
-# 5.7
-ADD_H5_TEST (h5diff_57 0 -v ${FILE4} ${FILE4} dset7a dset7b)
-
-# 5.8 (region reference)
-ADD_H5_TEST (h5diff_58 1 -v ${FILE7} ${FILE8} refreg)
-
-# test for both dset and attr with same type but with different size
-# ( HDDFV-7942 )
-ADD_H5_TEST (h5diff_59 0 -v ${FILE4} ${FILE4} dset11a dset11b)
-
-# ##############################################################################
-# # Error messages
-# ##############################################################################
-
-# 6.0: Check if the command line number of arguments is less than 3
-ADD_H5_TEST (h5diff_600 1 ${FILE1})
-
-# 6.1: Check if non-exist object name is specified
-ADD_H5_TEST (h5diff_601 2 ${FILE1} ${FILE1} nono_obj)
-
-# ##############################################################################
-# # -d
-# ##############################################################################
-
-# 6.3: negative value
-ADD_H5_TEST (h5diff_603 1 -d -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.4: zero
-ADD_H5_TEST (h5diff_604 1 -d 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.5: non number
-ADD_H5_TEST (h5diff_605 1 -d u ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.6: hexadecimal
-ADD_H5_TEST (h5diff_606 1 -d 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.7: string
-ADD_H5_TEST (h5diff_607 1 -d "1" ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.8: use system epsilon
-ADD_H5_TEST (h5diff_608 1 --use-system-epsilon ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
-
-# 6.9: number larger than biggest difference
-ADD_H5_TEST (h5diff_609 0 -d 200 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.10: number smaller than smallest difference
-ADD_H5_TEST (h5diff_610 1 -d 1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# ##############################################################################
-# # -p
-# ##############################################################################
-
-# 6.12: negative value
-ADD_H5_TEST (h5diff_612 1 -p -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.13: zero
-ADD_H5_TEST (h5diff_613 1 -p 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.14: non number
-ADD_H5_TEST (h5diff_614 1 -p u ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
-
-# 6.15: hexadecimal
-ADD_H5_TEST (h5diff_615 1 -p 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.16: string
-ADD_H5_TEST (h5diff_616 1 -p "0.21" ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.17: repeated option
-ADD_H5_TEST (h5diff_617 1 -p 0.21 -p 0.22 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.18: number larger than biggest difference
-ADD_H5_TEST (h5diff_618 0 -p 2 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.19: number smaller than smallest difference
-ADD_H5_TEST (h5diff_619 1 -p 0.005 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# ##############################################################################
-# # -n
-# ##############################################################################
-
-# 6.21: negative value
-ADD_H5_TEST (h5diff_621 1 -n -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.22: zero
-ADD_H5_TEST (h5diff_622 1 -n 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.23: non number
-ADD_H5_TEST (h5diff_623 1 -n u ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.24: hexadecimal
-ADD_H5_TEST (h5diff_624 1 -n 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.25: string
-ADD_H5_TEST (h5diff_625 1 -n "2" ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
-
-# 6.26: repeated option
-ADD_H5_TEST (h5diff_626 1 -n 2 -n 3 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.27: number larger than biggest difference
-ADD_H5_TEST (h5diff_627 1 --count=200 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# 6.28: number smaller than smallest difference
-ADD_H5_TEST (h5diff_628 1 -n 1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
-
-# Disabling this test as it hangs - LRK 20090618
-# 6.29  non valid files
-#ADD_H5_TEST (h5diff_629 2 file1.h6 file2.h6)
-
-# ##############################################################################
-# # NaN
-# ##############################################################################
-# 6.30: test (NaN == NaN) must be true based on our documentation -- XCAO
-ADD_H5_TEST (h5diff_630 0 -v -d "0.0001" ${FILE1} ${FILE1} g1/fp18 g1/fp18_COPY)
-ADD_H5_TEST (h5diff_631 0 -v --use-system-epsilon ${FILE1} ${FILE1} g1/fp18 g1/fp18_COPY)
-
-# ##############################################################################
-# 7.  attributes
-# ##############################################################################
-ADD_H5_TEST (h5diff_70 1 -v ${FILE5} ${FILE6})
-# temporary test to verify HDF5-8625
-ADD_H5_TEST (h5diff_tmp1 0 tmptest2.he5 tmptest.he5)
-# temporary test to verify HDF5-8639
-ADD_H5_TEST (h5diff_tmp2 1 tmpSingleSiteBethe.output.h5 tmpSingleSiteBethe.reference.h5)
-
-# ##################################################
-#  attrs with verbose option level
-# ##################################################
-ADD_H5_TEST (h5diff_700 1 -v1 ${FILE5} ${FILE6})
-ADD_H5_TEST (h5diff_701 1 -v2 ${FILE5} ${FILE6})
-ADD_H5_TEST (h5diff_702 1 --verbose=1 ${FILE5} ${FILE6})
-ADD_H5_TEST (h5diff_703 1 --verbose=2 ${FILE5} ${FILE6})
-
-# same attr number , all same attr name
-ADD_H5_TEST (h5diff_704 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g)
-
-# same attr number , some same attr name
-ADD_H5_TEST (h5diff_705 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /dset)
-
-# same attr number , all different attr name
-ADD_H5_TEST (h5diff_706 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /ntype)
-
-# different attr number , same attr name (intersected)
-ADD_H5_TEST (h5diff_707 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g2)
-
-# different attr number , all different attr name
-ADD_H5_TEST (h5diff_708 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g3)
-
-# when no attributes exist in both objects
-ADD_H5_TEST (h5diff_709 0 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g4)
-
-# file vs file
-ADD_H5_TEST (h5diff_710 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2})
-
-# ##############################################################################
-# 8.  all dataset datatypes
-# ##############################################################################
-ADD_H5_TEST (h5diff_80 1 -v ${FILE7} ${FILE8})
-
-# 9. compare a file with itself
-ADD_H5_TEST (h5diff_90 0 -v ${FILE2} ${FILE2})
-
-# 10. read by hyperslab, print indexes
-ADD_H5_TEST (h5diff_100 1 -v ${FILE9} ${FILE10})
-
-# 11. floating point comparison
-# double value
-ADD_H5_TEST (h5diff_101 1 -v ${FILE1} ${FILE1} g1/d1  g1/d2)
-
-# float value
-ADD_H5_TEST (h5diff_102 1 -v ${FILE1} ${FILE1} g1/fp1 g1/fp2)
-
-# with --use-system-epsilon for double value. expect less differences
-ADD_H5_TEST (h5diff_103 1 -v --use-system-epsilon ${FILE1} ${FILE1} g1/d1
-g1/d2)
-
-# with --use-system-epsilon for float value. expect less differences
-ADD_H5_TEST (h5diff_104 1 -v --use-system-epsilon ${FILE1} ${FILE1} g1/fp1
-g1/fp2)
-
-# not comparable -c flag
-ADD_H5_TEST (h5diff_200 0 ${FILE2} ${FILE2} g2/dset1  g2/dset2)
-
-ADD_H5_TEST (h5diff_201 0 -c ${FILE2} ${FILE2} g2/dset1  g2/dset2)
-
-ADD_H5_TEST (h5diff_202 0 -c ${FILE2} ${FILE2} g2/dset2  g2/dset3)
-
-ADD_H5_TEST (h5diff_203 0 -c ${FILE2} ${FILE2} g2/dset3  g2/dset4)
-
-ADD_H5_TEST (h5diff_204 0 -c ${FILE2} ${FILE2} g2/dset4  g2/dset5)
-
-ADD_H5_TEST (h5diff_205 0 -c ${FILE2} ${FILE2} g2/dset5  g2/dset6)
-
-# not comparable in compound
-ADD_H5_TEST (h5diff_206 0 -c ${FILE2} ${FILE2} g2/dset7  g2/dset8)
-
-ADD_H5_TEST (h5diff_207 0 -c ${FILE2} ${FILE2} g2/dset8  g2/dset9)
-
-# not comparable in dataspace of zero dimension size
-ADD_H5_TEST (h5diff_208 0 -c ${FILE19} ${FILE20})
-
-# non-comparable dataset with comparable attribute, and other comparable datasets.
-# All the rest comparables should display differences.
-ADD_H5_TEST (h5diff_220 1 -c non_comparables1.h5 non_comparables2.h5 /g1)
-
-# comparable dataset with non-comparable attribute and other comparable attributes.
-# Also test non-compatible attributes with different type, dimention, rank.
-# All the rest comparables should display differences.
-ADD_H5_TEST (h5diff_221 1 -c non_comparables1.h5 non_comparables2.h5 /g2)
-
-# entire file
-# All the rest comparables should display differences
-ADD_H5_TEST (h5diff_222 1 -c non_comparables1.h5 non_comparables2.h5)
-
-# non-comparable test for common objects (same name) with different object types
-# (HDFFV-7644)
-ADD_H5_TEST (h5diff_223 0 -c non_comparables1.h5 non_comparables2.h5 /diffobjtypes)
-# swap files
-ADD_H5_TEST (h5diff_224 0 -c non_comparables2.h5 non_comparables1.h5 /diffobjtypes)
-
-# ##############################################################################
-# # Links compare without --follow-symlinks nor --no-dangling-links
-# ##############################################################################
-# test for bug1749
-ADD_H5_TEST (h5diff_300 1 -v ${FILE12} ${FILE12} /link_g1 /link_g2)
-
-# ##############################################################################
-# # Links compare with --follow-symlinks Only
-# ##############################################################################
-# soft links file to file
-ADD_H5_TEST (h5diff_400 0 --follow-symlinks -v ${FILE13} ${FILE13})
-
-# softlink vs dset"
-ADD_H5_TEST (h5diff_401 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset1_1 /target_dset2)
-
-# dset vs softlink"
-ADD_H5_TEST (h5diff_402 1 --follow-symlinks -v ${FILE13} ${FILE13} /target_dset2 /softlink_dset1_1)
-
-# softlink vs softlink"
-ADD_H5_TEST (h5diff_403 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset1_1 /softlink_dset2)
-
-# extlink vs extlink (FILE)"
-ADD_H5_TEST (h5diff_404 0 --follow-symlinks -v ${FILE15} ${FILE15})
-
-# extlink vs dset"
-ADD_H5_TEST (h5diff_405 1 --follow-symlinks -v ${FILE15} ${FILE16} /ext_link_dset1 /target_group2/x_dset)
-
-# dset vs extlink"
-ADD_H5_TEST (h5diff_406 1 --follow-symlinks -v ${FILE16} ${FILE15} /target_group2/x_dset /ext_link_dset1)
-
-# extlink vs extlink"
-ADD_H5_TEST (h5diff_407 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_dset2)
-
-# softlink vs extlink"
-ADD_H5_TEST (h5diff_408 1 --follow-symlinks -v ${FILE13} ${FILE15} /softlink_dset1_1 /ext_link_dset2)
-
-# extlink vs softlink "
-ADD_H5_TEST (h5diff_409 1 --follow-symlinks -v ${FILE15} ${FILE13} /ext_link_dset2 /softlink_dset1_1)
-
-# linked_softlink vs linked_softlink (FILE)"
-ADD_H5_TEST (h5diff_410 0 --follow-symlinks -v ${FILE14} ${FILE14})
-
-# dset2 vs linked_softlink_dset1"
-ADD_H5_TEST (h5diff_411 1 --follow-symlinks -v ${FILE14} ${FILE14} /target_dset2 /softlink1_to_slink2)
-
-# linked_softlink_dset1 vs dset2"
-ADD_H5_TEST (h5diff_412 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink1_to_slink2 /target_dset2)
-
-# linked_softlink_to_dset1 vs linked_softlink_to_dset2"
-ADD_H5_TEST (h5diff_413 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink1_to_slink2 /softlink2_to_slink2)
-
-# group vs linked_softlink_group1"
-ADD_H5_TEST (h5diff_414 1 --follow-symlinks -v ${FILE14} ${FILE14} /target_group /softlink3_to_slink2)
-
-# linked_softlink_group1 vs group"
-ADD_H5_TEST (h5diff_415 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink3_to_slink2 /target_group)
-
-# linked_softlink_to_group1 vs linked_softlink_to_group2"
-ADD_H5_TEST (h5diff_416 0 --follow-symlinks -v ${FILE14} ${FILE14} /softlink3_to_slink2 /softlink4_to_slink2)
-
-# non-exist-softlink vs softlink"
-ADD_H5_TEST (h5diff_417 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_noexist /softlink_dset2)
-
-# softlink vs non-exist-softlink"
-ADD_H5_TEST (h5diff_418 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset2 /softlink_noexist)
-
-# non-exist-extlink_file vs extlink"
-ADD_H5_TEST (h5diff_419 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_noexist2 /ext_link_dset2)
-
-# exlink vs non-exist-extlink_file"
-ADD_H5_TEST (h5diff_420 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset2 /ext_link_noexist2)
-
-# extlink vs non-exist-extlink_obj"
-ADD_H5_TEST (h5diff_421 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset2 /ext_link_noexist1)
-
-# non-exist-extlink_obj vs extlink"
-ADD_H5_TEST (h5diff_422 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_noexist1 /ext_link_dset2)
-
-# extlink_to_softlink_to_dset1 vs dset2"
-ADD_H5_TEST (h5diff_423 1 --follow-symlinks -v ${FILE17} ${FILE18} /ext_link_to_slink1 /dset2)
-
-# dset2 vs extlink_to_softlink_to_dset1"
-ADD_H5_TEST (h5diff_424 1 --follow-symlinks -v ${FILE18} ${FILE17} /dset2 /ext_link_to_slink1)
-
-# extlink_to_softlink_to_dset1 vs extlink_to_softlink_to_dset2"
-ADD_H5_TEST (h5diff_425 1 --follow-symlinks -v ${FILE17} ${FILE17} /ext_link_to_slink1 /ext_link_to_slink2)
-
-# ##############################################################################
-# # Dangling links compare (--follow-symlinks and --no-dangling-links)
-# ##############################################################################
-# dangling links --follow-symlinks (FILE to FILE)
-ADD_H5_TEST (h5diff_450 1  --follow-symlinks -v ${DANGLE_LINK_FILE1} ${DANGLE_LINK_FILE2})
-
-# dangling links --follow-symlinks and --no-dangling-links (FILE to FILE)
-ADD_H5_TEST (h5diff_451 2  --follow-symlinks -v --no-dangling-links  ${DANGLE_LINK_FILE1} ${DANGLE_LINK_FILE2})
-
-# try --no-dangling-links without --follow-symlinks options
-ADD_H5_TEST (h5diff_452 2  --no-dangling-links  ${FILE13} ${FILE13})
-
-# dangling link found for soft links (FILE to FILE)
-ADD_H5_TEST (h5diff_453 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13})
-
-# dangling link found for soft links (obj to obj)
-ADD_H5_TEST (h5diff_454 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13} /softlink_dset2 /softlink_noexist)
-
-# dangling link found for soft links (obj to obj) Both dangle links
-ADD_H5_TEST (h5diff_455 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13} /softlink_noexist /softlink_noexist)
-
-# dangling link found for ext links (FILE to FILE)
-ADD_H5_TEST (h5diff_456 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15})
-
-# dangling link found for ext links (obj to obj). target file exist
-ADD_H5_TEST (h5diff_457 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_noexist1)
-
-# dangling link found for ext links (obj to obj). target file NOT exist
-ADD_H5_TEST (h5diff_458 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_noexist2)
-
-# dangling link found for ext links (obj to obj). Both dangle links
-ADD_H5_TEST (h5diff_459 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_noexist1 /ext_link_noexist2)
-
-# dangling link --follow-symlinks (obj vs obj)
-# (HDFFV-7836)
-ADD_H5_TEST (h5diff_465 0 --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
-# (HDFFV-7835)
-# soft dangling vs. soft dangling
-ADD_H5_TEST (h5diff_466 0 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
-# soft link  vs. soft dangling
-ADD_H5_TEST (h5diff_467 1 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link2)
-# ext dangling vs. ext dangling
-ADD_H5_TEST (h5diff_468 0 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4)
-# ext link vs. ext dangling
-ADD_H5_TEST (h5diff_469 1 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link2)
-
-#---------------------------------------------------
-# dangling links without follow symlink
-# (HDFFV-7998)
-# test - soft dangle links (same and different paths),
-#      - external dangle links (same and different paths)
-ADD_H5_TEST (h5diff_471 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5)
-ADD_H5_TEST (h5diff_472 0 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
-ADD_H5_TEST (h5diff_473 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link4)
-ADD_H5_TEST (h5diff_474 0 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4)
-ADD_H5_TEST (h5diff_475 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link1)
-
-
-# ##############################################################################
-# # test for group diff recursivly
-# ##############################################################################
-# root
-ADD_H5_TEST (h5diff_500 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
-ADD_H5_TEST (h5diff_501 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
-
-# root vs group
-ADD_H5_TEST (h5diff_502 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /grp1/grp2/grp3)
-
-# group vs group (same name and structure)
-ADD_H5_TEST (h5diff_503 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /grp1)
-
-# group vs group (different name and structure)
-ADD_H5_TEST (h5diff_504 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /grp1/grp2/grp3)
-
-# groups vs soft-link
-ADD_H5_TEST (h5diff_505 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /slink_grp1)
-ADD_H5_TEST (h5diff_506 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /slink_grp2)
-
-# groups vs ext-link
-ADD_H5_TEST (h5diff_507 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
-ADD_H5_TEST (h5diff_508 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
-
-# soft-link vs ext-link
-ADD_H5_TEST (h5diff_509 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
-ADD_H5_TEST (h5diff_510 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
-
-# circled ext links
-ADD_H5_TEST (h5diff_511 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
-ADD_H5_TEST (h5diff_512 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
-
-# circled soft2ext-link vs soft2ext-link
-ADD_H5_TEST (h5diff_513 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
-ADD_H5_TEST (h5diff_514 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
-
-###############################################################################
-# Test for group recursive diff via multi-linked external links
-# With follow-symlinks, file $GRP_RECURSE1_EXT and $GRP_RECURSE2_EXT1 should
-# be same with the external links.
-###############################################################################
-# file vs file
-ADD_H5_TEST (h5diff_515 1 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
-ADD_H5_TEST (h5diff_516 0 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
-# group vs group
-ADD_H5_TEST (h5diff_517 1 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
-ADD_H5_TEST (h5diff_518 0 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
-
-# ##############################################################################
-# # Exclude objects (--exclude-path)
-# ##############################################################################
-#
-# Same structure, same names and different value.
-#
-# Exclude the object with different value. Expect return - same
-ADD_H5_TEST (h5diff_480 0 -v --exclude-path /group1/dset3 ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
-# Verify different by not excluding. Expect return - diff
-ADD_H5_TEST (h5diff_481 1 -v ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
-
-#
-# Different structure, different names.
-#
-# Exclude all the different objects. Expect return - same
-ADD_H5_TEST (h5diff_482 0 -v --exclude-path "/group1" --exclude-path "/dset1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
-# Exclude only some different objects. Expect return - diff
-ADD_H5_TEST (h5diff_483 1 -v --exclude-path "/group1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
-
-# Exclude from group compare
-ADD_H5_TEST (h5diff_484 0 -v --exclude-path "/dset3" ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2} /group1)
-
-#
-# Only one file contains unique objs. Common objs are same.
-# (HDFFV-7837)
-#
-ADD_H5_TEST (h5diff_485 0 -v --exclude-path "/group1" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5)
-ADD_H5_TEST (h5diff_486 0 -v --exclude-path "/group1" h5diff_exclude3-2.h5 h5diff_exclude3-1.h5)
-ADD_H5_TEST (h5diff_487 1 -v --exclude-path "/group1/dset" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5)
-
-
-
-# ##############################################################################
-# # diff various multiple vlen and fixed strings in a compound type dataset
-# ##############################################################################
-ADD_H5_TEST (h5diff_530 0 -v  ${COMP_VL_STRS_FILE} ${COMP_VL_STRS_FILE} /group /group_copy)
-
-# ##############################################################################
-# # Test container types (array,vlen) with multiple nested compound types
-# # Complex compound types in dataset and attribute
-# ##############################################################################
-ADD_H5_TEST (h5diff_540 1 -v ${COMPS_ARRAY_VLEN_FILE1} ${COMPS_ARRAY_VLEN_FILE2})
-
-# ##############################################################################
-# # Test mutually exclusive options
-# ##############################################################################
-#
-# Test with -d , -p and --use-system-epsilon.
-ADD_H5_TEST (h5diff_640 1 -v -d 5 -p 0.05 --use-system-epsilon ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
-ADD_H5_TEST (h5diff_641 1 -v -d 5 -p 0.05 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
-ADD_H5_TEST (h5diff_642 1 -v -p 0.05 -d 5 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
-ADD_H5_TEST (h5diff_643 1 -v -d 5 --use-system-epsilon ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
-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.am b/tools/h5diff/Makefile.am
deleted file mode 100644
index 7e3b620..0000000
--- a/tools/h5diff/Makefile.am
+++ /dev/null
@@ -1,61 +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.
-##
-## 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
-
-# Always build and test h5diff but build and test ph5diff only if parallel
-# is enabled.
-if BUILD_PARALLEL_CONDITIONAL
-  H5PDIFF=ph5diff
-  TEST_SCRIPT_PARA=testph5diff.sh
-endif
-
-# Our main target, h5diff
-bin_PROGRAMS=h5diff $(H5PDIFF)
-
-# Add h5diff specific linker flags here
-h5diff_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Test programs and scripts
-TEST_PROG=h5diffgentest
-TEST_SCRIPT=testh5diff.sh
-
-check_PROGRAMS=$(TEST_PROG)
-check_SCRIPTS=$(TEST_SCRIPT) $(TEST_SCRIPT_PARA)
-# The parallel test script testph5diff.sh actually depends on testh5diff.sh.
-SCRIPT_DEPEND=h5diff$(EXEEXT) $(H5PDIFF) testh5diff.sh
-
-# Source files for the program
-h5diff_SOURCES=h5diff_main.c h5diff_common.c
-ph5diff_SOURCES=ph5diff_main.c h5diff_common.c
-h5diffgentest_SOURCES=h5diffgentest.c
-
-# Programs depend on the main HDF5 library and tools library
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# Temporary files.  *.h5 are generated by h5diff.  They should
-# be copied to the testfiles/ directory if update is required
-CHECK_CLEANFILES+=*.h5 expect_sorted actual_sorted
-
-include $(top_srcdir)/config/conclude.am
-
diff --git a/tools/h5diff/Makefile.in b/tools/h5diff/Makefile.in
deleted file mode 100644
index 1f9abe3..0000000
--- a/tools/h5diff/Makefile.in
+++ /dev/null
@@ -1,1516 +0,0 @@
-# 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 = 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5diff.sh testph5diff.sh
-CONFIG_CLEAN_VPATH_FILES =
- at BUILD_PARALLEL_CONDITIONAL_TRUE@am__EXEEXT_1 = ph5diff$(EXEEXT)
-am__installdirs = "$(DESTDIR)$(bindir)"
-am__EXEEXT_2 = h5diffgentest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-am_h5diff_OBJECTS = h5diff_main.$(OBJEXT) h5diff_common.$(OBJEXT)
-h5diff_OBJECTS = $(am_h5diff_OBJECTS)
-h5diff_LDADD = $(LDADD)
-h5diff_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 = 
-h5diff_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5diff_LDFLAGS) $(LDFLAGS) -o $@
-am_h5diffgentest_OBJECTS = h5diffgentest.$(OBJEXT)
-h5diffgentest_OBJECTS = $(am_h5diffgentest_OBJECTS)
-h5diffgentest_LDADD = $(LDADD)
-h5diffgentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-am_ph5diff_OBJECTS = ph5diff_main.$(OBJEXT) h5diff_common.$(OBJEXT)
-ph5diff_OBJECTS = $(am_ph5diff_OBJECTS)
-ph5diff_LDADD = $(LDADD)
-ph5diff_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 = $(h5diff_SOURCES) $(h5diffgentest_SOURCES) \
-	$(ph5diff_SOURCES)
-DIST_SOURCES = $(h5diff_SOURCES) $(h5diffgentest_SOURCES) \
-	$(ph5diff_SOURCES)
-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)/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@
-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
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5diff.  They should
-# be copied to the testfiles/ directory if update is required
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 expect_sorted \
-	actual_sorted
-
-# Always build and test h5diff but build and test ph5diff only if parallel
-# is enabled.
- at BUILD_PARALLEL_CONDITIONAL_TRUE@H5PDIFF = ph5diff
- at BUILD_PARALLEL_CONDITIONAL_TRUE@TEST_SCRIPT_PARA = testph5diff.sh
-
-# Add h5diff specific linker flags here
-h5diff_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Test programs and scripts
-TEST_PROG = h5diffgentest
-TEST_SCRIPT = testh5diff.sh
-check_SCRIPTS = $(TEST_SCRIPT) $(TEST_SCRIPT_PARA)
-# The parallel test script testph5diff.sh actually depends on testh5diff.sh.
-SCRIPT_DEPEND = h5diff$(EXEEXT) $(H5PDIFF) testh5diff.sh
-
-# Source files for the program
-h5diff_SOURCES = h5diff_main.c h5diff_common.c
-ph5diff_SOURCES = ph5diff_main.c h5diff_common.c
-h5diffgentest_SOURCES = h5diffgentest.c
-
-# Programs depend on the main HDF5 library and tools 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/h5diff/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5diff/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):
-testh5diff.sh: $(top_builddir)/config.status $(srcdir)/testh5diff.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-testph5diff.sh: $(top_builddir)/config.status $(srcdir)/testph5diff.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
-
-h5diff$(EXEEXT): $(h5diff_OBJECTS) $(h5diff_DEPENDENCIES) $(EXTRA_h5diff_DEPENDENCIES) 
-	@rm -f h5diff$(EXEEXT)
-	$(AM_V_CCLD)$(h5diff_LINK) $(h5diff_OBJECTS) $(h5diff_LDADD) $(LIBS)
-
-h5diffgentest$(EXEEXT): $(h5diffgentest_OBJECTS) $(h5diffgentest_DEPENDENCIES) $(EXTRA_h5diffgentest_DEPENDENCIES) 
-	@rm -f h5diffgentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5diffgentest_OBJECTS) $(h5diffgentest_LDADD) $(LIBS)
-
-ph5diff$(EXEEXT): $(ph5diff_OBJECTS) $(ph5diff_DEPENDENCIES) $(EXTRA_ph5diff_DEPENDENCIES) 
-	@rm -f ph5diff$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(ph5diff_OBJECTS) $(ph5diff_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diff_common.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diff_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diffgentest.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ph5diff_main.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 $$?
-h5diffgentest.log: h5diffgentest$(EXEEXT)
-	@p='h5diffgentest$(EXEEXT)'; \
-	b='h5diffgentest'; \
-	$(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)
-
-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/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c
deleted file mode 100644
index a371cc0..0000000
--- a/tools/h5diff/h5diff_common.c
+++ /dev/null
@@ -1,606 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdlib.h>
-#include <string.h>
-#include "H5private.h"
-#include "h5diff.h"
-#include "h5diff_common.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-static int check_n_input( const char* );
-static int check_p_input( const char* );
-static int check_d_input( const char* );
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters.
- */
-static const char *s_opts = "hVrv:qn:d:p:Nc";
-static struct long_options l_opts[] = {
-    { "help", no_arg, 'h' },
-    { "version", no_arg, 'V' },
-    { "report", no_arg, 'r' },
-    { "verbose", optional_arg, 'v' },
-    { "quiet", no_arg, 'q' },
-    { "count", require_arg, 'n' },
-    { "delta", require_arg, 'd' },
-    { "relative", require_arg, 'p' },
-    { "nan", no_arg, 'N' },
-    { "compare", no_arg, 'c' },
-    { "use-system-epsilon", no_arg, 'e' },
-    { "follow-symlinks", no_arg, 'l' },
-    { "no-dangling-links", no_arg, 'x' },
-    { "exclude-path", require_arg, 'E' },
-    { NULL, 0, '\0' }
-};
-
-/*-------------------------------------------------------------------------
- * Function: check_options
- *
- * Purpose: parse command line input
- *
- *-------------------------------------------------------------------------
- */
-static void check_options(diff_opt_t* options)
-{
-    /*--------------------------------------------------------------
-     * check for mutually exclusive options 
-     *--------------------------------------------------------------*/
-
-    /* check between -d , -p, --use-system-epsilon.
-     * These options are mutually exclusive.
-     */
-    if ((options->d + options->p + options->use_system_epsilon) > 1)
-    {
-        printf("%s error: -d, -p and --use-system-epsilon options are mutually-exclusive;\n", PROGRAMNAME);
-        printf("use no more than one.\n");
-        printf("Try '-h' or '--help' option for more information or see the %s entry in the 'HDF5 Reference Manual'.\n", PROGRAMNAME);
-        h5diff_exit(EXIT_FAILURE);
-    }
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: parse_command_line
- *
- * Purpose: parse command line input
- *
- *-------------------------------------------------------------------------
- */
-
-void parse_command_line(int argc,
-                        const char* argv[],
-                        const char** fname1,
-                        const char** fname2,
-                        const char** objname1,
-                        const char** objname2,
-                        diff_opt_t* options)
-{
-    int i;
-    int opt;
-    struct exclude_path_list *exclude_head, *exclude_prev, *exclude_node;
-
-    /* process the command-line */
-    memset(options, 0, sizeof (diff_opt_t));
-
-    /* assume equal contents initially */
-    options->contents = 1;
-
-    /* NaNs are handled by default */
-    options->do_nans = 1;
-
-    /* not Listing objects that are not comparable */
-    options->m_list_not_cmp = 0;
-
-    /* initially no not-comparable. */
-    /**this is bad in mixing option with results**/
-    options->not_cmp=0;
-
-    /* init for exclude-path option */
-    exclude_head = NULL;
-
-    /* parse command line options */
-    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
-    {
-        switch ((char)opt)
-        {
-        default:
-            usage();
-            h5diff_exit(EXIT_FAILURE);
-        case 'h':
-            usage();
-            h5diff_exit(EXIT_SUCCESS);
-        case 'V':
-            print_version(h5tools_getprogname());
-            h5diff_exit(EXIT_SUCCESS);
-        case 'v':
-            options->m_verbose = 1;
-            /* This for loop is for handling style like 
-             * -v, -v1, --verbose, --verbose=1.
-             */
-            for (i = 1; i < argc; i++)
-            {                
-                /* 
-                 * short opt 
-                 */
-                if (!strcmp (argv[i], "-v"))  /* no arg */
-            {
-                    opt_ind--;
-                    options->m_verbose_level = 0;
-                    break;
-            }
-                else if (!strncmp (argv[i], "-v", (size_t)2))
-            {
-                    options->m_verbose_level = atoi(&argv[i][2]);
-                    break;
-            }    
-
-                /* 
-                 * long opt 
-                 */
-                if (!strcmp (argv[i], "--verbose"))  /* no arg */
-            {
-                    options->m_verbose_level = 0;
-                    break;
-            }
-            else if ( !strncmp (argv[i], "--verbose", (size_t)9) && argv[i][9]=='=')
-            {
-                    options->m_verbose_level = atoi(&argv[i][10]);
-                    break;
-                }
-            }
-            break;
-        case 'q':
-            /* use quiet mode; supress the message "0 differences found" */
-            options->m_quiet = 1;
-            break;
-        case 'r':
-            options->m_report = 1;
-            break;
-        case 'l':
-            options->follow_links = TRUE;
-            break;
-        case 'x':
-            options->no_dangle_links = 1;
-            break;
-        case 'E':
-            options->exclude_path = 1;
-            
-            /* create linked list of excluding objects */
-            if( (exclude_node = (struct exclude_path_list*) HDmalloc(sizeof(struct exclude_path_list))) == NULL)
-            {
-                printf("Error: lack of memory!\n");
-                h5diff_exit(EXIT_FAILURE);
-            }
-
-            /* init */
-            exclude_node->obj_path = (char*)opt_arg;
-            exclude_node->obj_type = H5TRAV_TYPE_UNKNOWN;
-            exclude_prev = exclude_head;
-            
-            if (NULL == exclude_head)            
-            {
-                exclude_head = exclude_node;
-                exclude_head->next = NULL;
-            }
-            else
-            {
-                while(NULL != exclude_prev->next)
-                    exclude_prev=exclude_prev->next;
-
-                exclude_node->next = NULL;
-                exclude_prev->next = exclude_node;
-            }            
-            break;
-        case 'd':
-            options->d=1;
-
-            if ( check_d_input( opt_arg )==-1)
-            {
-                printf("<-d %s> is not a valid option\n", opt_arg );
-                usage();
-                h5diff_exit(EXIT_FAILURE);
-            }
-            options->delta = atof( opt_arg );
-
-            /* -d 0 is the same as default */
-            if (options->delta == 0)
-            options->d=0;
-
-            break;
-
-        case 'p':
-
-            options->p=1;
-            if ( check_p_input( opt_arg )==-1)
-            {
-                printf("<-p %s> is not a valid option\n", opt_arg );
-                usage();
-                h5diff_exit(EXIT_FAILURE);
-            }
-            options->percent = atof( opt_arg );
-
-            /* -p 0 is the same as default */
-            if (options->percent == 0)
-            options->p = 0;
-
-            break;
-
-        case 'n':
-
-            options->n=1;
-            if ( check_n_input( opt_arg )==-1)
-            {
-                printf("<-n %s> is not a valid option\n", opt_arg );
-                usage();
-                h5diff_exit(EXIT_FAILURE);
-            }
-            options->count = atol( opt_arg );
-
-            break;
-
-        case 'N':
-            options->do_nans = 0;
-            break;
-        case 'c':
-            options->m_list_not_cmp = 1;
-            break;
-        case 'e':
-            options->use_system_epsilon = 1;
-            break;
-        }
-    }
-
-    /* check options */
-    check_options(options);
-
-    /* if exclude-path option is used, keep the exclude path list */
-    if (options->exclude_path)
-        options->exclude = exclude_head;
-
-    /* check for file names to be processed */
-    if (argc <= opt_ind || argv[ opt_ind + 1 ] == NULL)
-    {
-        error_msg("missing file names\n");
-        usage();
-        h5diff_exit(EXIT_FAILURE);
-    }
-
-    *fname1 = argv[ opt_ind ];
-    *fname2 = argv[ opt_ind + 1 ];
-    *objname1 = argv[ opt_ind + 2 ];
-
-    if ( *objname1 == NULL )
-    {
-        *objname2 = NULL;
-        return;
-    }
-
-    if ( argv[ opt_ind + 3 ] != NULL)
-    {
-        *objname2 = argv[ opt_ind + 3 ];
-    }
-    else
-    {
-        *objname2 = *objname1;
-    }
-
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: print_info
- *
- * Purpose: print several information messages after h5diff call
- *
- *-------------------------------------------------------------------------
- */
-
- void  print_info(diff_opt_t* options)
- {
-     if (options->m_quiet || options->err_stat )
-         return;
-
-     if (options->cmn_objs==0)
-     {
-         printf("No common objects found. Files are not comparable.\n");
-         if (!options->m_verbose)
-             printf("Use -v for a list of objects.\n");
-     }
-
-     if (options->not_cmp==1)
-     {
-         if ( options->m_list_not_cmp == 0 )
-         {
-             printf("--------------------------------\n");
-             printf("Some objects are not comparable\n");
-             printf("--------------------------------\n");
-             if (options->m_verbose)
-                 printf("Use -c for a list of objects without details of differences.\n");
-             else
-                 printf("Use -c for a list of objects.\n");
-         }
-
-
-     }
-
- }
-
-/*-------------------------------------------------------------------------
- * Function: check_n_input
- *
- * Purpose: check for valid input
- *
- * Return: 1 for ok, -1 for fail
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-check_n_input( const char *str )
-{
-    unsigned i;
-    char c;
-
-    for ( i = 0; i < strlen(str); i++)
-    {
-        c = str[i];
-        if ( i==0 )
-        {
-            if ( c < 49 || c > 57  ) /* ascii values between 1 and 9 */
-                return -1;
-        }
-        else
-            if ( c < 48 || c > 57  ) /* 0 also */
-                return -1;
-    }
-    return 1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: check_p_input
- *
- * Purpose: check for a valid p option input
- *
- * Return: 1 for ok, -1 for fail
- *
- * Date: May 9, 2003
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-check_p_input( const char *str )
-{
-    double x;
-
-    /*
-    the atof return value on a hexadecimal input is different
-    on some systems; we do a character check for this
-    */
-    if (strlen(str)>2 && str[0]=='0' && str[1]=='x')
-        return -1;
-
-    x=atof(str);
-    if (x<0)
-        return -1;
-
-    return 1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: check_d_input
- *
- * Purpose: check for a valid d option input
- *
- * Return: 1 for ok, -1 for fail
- *
- * Date: November 11, 2007
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-check_d_input( const char *str )
-{
-    double x;
-
-    /*
-    the atof return value on a hexadecimal input is different
-    on some systems; we do a character check for this
-    */
-    if (strlen(str)>2 && str[0]=='0' && str[1]=='x')
-        return -1;
-
-    x=atof(str);
-    if (x <0)
-        return -1;
-
-    return 1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: print a usage message
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-
-void usage(void)
-{
- printf("usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]] \n");
- printf("  file1             File name of the first HDF5 file\n");
- printf("  file2             File name of the second HDF5 file\n");
- printf("  [obj1]            Name of an HDF5 object, in absolute path\n");
- printf("  [obj2]            Name of an HDF5 object, in absolute path\n");
- printf("\n");
- printf("  OPTIONS\n");
- printf("   -h, --help\n");
- printf("         Print a usage message and exit.\n");
- printf("   -V, --version\n");
- printf("         Print version number and exit.\n");
- printf("   -r, --report\n");
- printf("         Report mode. Print differences.\n");
- printf("   -v --verbose\n");
- printf("         Verbose mode. Print differences information and list of objects.\n");
- printf("   -vN --verbose=N\n");
- printf("         Verbose mode with level. Print differences and list of objects.\n");
- printf("         Level of detail depends on value of N:\n");
- printf("          0 : Identical to '-v' or '--verbose'.\n");
- printf("          1 : All level 0 information plus one-line attribute\n");
- printf("              status summary.\n");
- printf("          2 : All level 1 information plus extended attribute\n");
- printf("              status report.\n");
- printf("   -q, --quiet\n");
- printf("         Quiet mode. Do not produce output.\n");
- printf("   --follow-symlinks\n");
- printf("         Follow symbolic links (soft links and external links and compare the)\n");
- printf("         links' target objects.\n");
- printf("         If symbolic link(s) with the same name exist in the files being\n");
- printf("         compared, then determine whether the target of each link is an existing\n");
- printf("         object (dataset, group, or named datatype) or the link is a dangling\n");
- printf("         link (a soft or external link pointing to a target object that does\n");
- printf("         not yet exist).\n");
- printf("         - If both symbolic links are dangling links, they are treated as being\n");
- printf("           the same; by default, h5diff returns an exit code of 0.\n");
- printf("           If, however, --no-dangling-links is used with --follow-symlinks,\n");
- printf("           this situation is treated as an error and h5diff returns an\n");
- printf("           exit code of 2.\n");
- printf("         - If only one of the two links is a dangling link,they are treated as\n");
- printf("           being different and h5diff returns an exit code of 1.\n");
- printf("           If, however, --no-dangling-links is used with --follow-symlinks,\n");
- printf("           this situation is treated as an error and h5diff returns an\n");
- printf("           exit code of 2.\n");
- printf("         - If both symbolic links point to existing objects, h5diff compares the\n");
- printf("           two objects.\n");
- printf("         If any symbolic link specified in the call to h5diff does not exist,\n");
- printf("         h5diff treats it as an error and returns an exit code of 2.\n");
- printf("   --no-dangling-links\n");
- printf("         Must be used with --follow-symlinks option; otherwise, h5diff shows\n");
- printf("         error message and returns an exit code of 2.\n");
- printf("         Check for any symbolic links (soft links or external links) that do not\n");
- printf("         resolve to an existing object (dataset, group, or named datatype).\n");
- printf("         If any dangling link is found, this situation is treated as an error\n");
- printf("         and h5diff returns an exit code of 2.\n");
- printf("   -c, --compare\n");
- printf("         List objects that are not comparable\n");
- printf("   -N, --nan\n");
- printf("         Avoid NaNs detection\n");
- printf("   -n C, --count=C\n");
- printf("         Print differences up to C. C must be a positive integer.\n");
- printf("   -d D, --delta=D\n");
- printf("         Print difference if (|a-b| > D). D must be a positive number.\n");
- printf("         Can not use with '-p' or '--use-system-epsilon'.\n");
- printf("   -p R, --relative=R\n");
- printf("         Print difference if (|(a-b)/b| > R). R must be a positive number.\n");
- printf("         Can not use with '-d' or '--use-system-epsilon'.\n");
- printf("   --use-system-epsilon\n");
- printf("         Print difference if (|a-b| > EPSILON), EPSILON is system defined value.\n");
- printf("         If the system epsilon is not defined,one of the following predefined\n");
- printf("         values will be used:\n");
- printf("           FLT_EPSILON = 1.19209E-07 for floating-point type\n");
- printf("           DBL_EPSILON = 2.22045E-16 for double precision type\n");
- printf("         Can not use with '-p' or '-d'.\n");
- printf("   --exclude-path \"path\" \n");
- printf("         Exclude the specified path to an object when comparing files or groups.\n");
- printf("         If a group is excluded, all member objects will also be excluded.\n");
- printf("         The specified path is excluded wherever it occurs.\n");
- printf("         This flexibility enables the same option to exclude either objects that\n");
- printf("         exist only in one file or common objects that are known to differ.\n");
- printf("\n");
- printf("         When comparing files, \"path\" is the absolute path to the excluded;\n");
- printf("         object; when comparing groups, \"path\" is similar to the relative\n");
- printf("         path from the group to the excluded object. This \"path\" can be\n");
- printf("         taken from the first section of the output of the --verbose option.\n");
- printf("         For example, if you are comparing the group /groupA in two files and\n");
- printf("         you want to exclude /groupA/groupB/groupC in both files, the exclude\n");
- printf("         option would read as follows:\n");
- printf("           --exclude-path \"/groupB/groupC\"\n");
- printf("\n");
- printf("         If there are multiple paths to an object, only the specified path(s)\n");
- printf("         will be excluded; the comparison will include any path not explicitly\n");
- printf("         excluded.\n");
- printf("         This option can be used repeatedly to exclude multiple paths.\n");
- printf("\n");
-
- printf(" Modes of output:\n");
- printf("  Default mode: print the number of differences found and where they occured\n");
- printf("  -r Report mode: print the above plus the differences\n");
- printf("  -v Verbose mode: print the above plus a list of objects and warnings\n");
- printf("  -q Quiet mode: do not print output\n");
-
- printf("\n");
-
- printf(" File comparison:\n");
- printf("  If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as\n");
- printf("  a comparison of the two files' root groups.  That is, h5diff first compares\n");
- printf("  the names of root group members, generates a report of root group objects\n");
- printf("  that appear in only one file or in both files, and recursively compares\n");
- printf("  common objects.\n");
- printf("\n");
-
- printf(" Object comparison:\n");
- printf("  1) Groups \n");
- printf("      First compares the names of member objects (relative path, from the\n");
- printf("      specified group) and generates a report of objects that appear in only\n");
- printf("      one group or in both groups. Common objects are then compared recursively.\n");
- printf("  2) Datasets \n");
- printf("      Array rank and dimensions, datatypes, and data values are compared.\n");
- printf("  3) Datatypes \n");
- printf("      The comparison is based on the return value of H5Tequal.\n");
- printf("  4) Symbolic links \n");
- printf("      The paths to the target objects are compared.\n");
- printf("      (The option --follow-symlinks overrides the default behavior when\n");
- printf("       symbolic links are compared.).\n");
- printf("\n");
-
- printf(" Exit code:\n");
- printf("  0 if no differences, 1 if differences found, 2 if error\n");
- printf("\n");
- printf(" Examples of use:\n");
- printf(" 1) h5diff file1 file2 /g1/dset1 /g1/dset2\n");
- printf("    Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2\n");
- printf("\n");
- printf(" 2) h5diff file1 file2 /g1/dset1\n");
- printf("    Compares object '/g1/dset1' in both files\n");
- printf("\n");
- printf(" 3) h5diff file1 file2\n");
- printf("    Compares all objects in both files\n");
- printf("\n");
- printf(" Notes:\n");
- printf("  file1 and file2 can be the same file.\n");
- printf("  Use h5diff file1 file1 /g1/dset1 /g1/dset2 to compare\n");
- printf("  '/g1/dset1' and '/g1/dset2' in the same file\n");
- printf("\n");
-}
diff --git a/tools/h5diff/h5diff_common.h b/tools/h5diff/h5diff_common.h
deleted file mode 100644
index 5b1317f..0000000
--- a/tools/h5diff/h5diff_common.h
+++ /dev/null
@@ -1,36 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef H5DIFFCOMMON_H__
-#define H5DIFFCOMMON_H__
-
-#include "h5tools.h"
-/* Name of tool */
-#define PROGRAMNAME "h5diff"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void usage(void);
-void parse_command_line(int argc, const char* argv[], const char** fname1, const char** fname2, const char** objname1, const char** objname2, diff_opt_t* options);
-void h5diff_exit(int status);
-void print_info(diff_opt_t* options);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* H5DIFFCOMMON_H__ */
diff --git a/tools/h5diff/h5diff_main.c b/tools/h5diff/h5diff_main.c
deleted file mode 100644
index a916ec5..0000000
--- a/tools/h5diff/h5diff_main.c
+++ /dev/null
@@ -1,143 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdlib.h>
-#include <assert.h>
-#include <memory.h>
-#include "h5diff.h"
-#include "h5diff_common.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: h5diff main program
- *
- * Return: An  exit status of 0 means no differences were found, 1 means some
- *   differences were found.
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- * Comments:
- *
- * Modifications: July 2004
- *  Introduced the four modes:
- *   Normal mode: print the number of differences found and where they occured
- *   Report mode: print the above plus the differences
- *   Verbose mode: print the above plus a list of objects and warnings
- *   Quiet mode: do not print output
- *
- * November 2004: Leon Arber (larber at uiuc.edu)
- *     Additions that allow h5diff to be run in parallel
- *
- * February 2005: Leon Arber (larber at uiuc.edu)
- *   h5diff and ph5diff split into two files, one that is used
- *   to build a serial h5diff and one used to build a parallel h5diff
- *   Common functions have been moved to h5diff_common.c
- *
- * October 2005
- *  Introduced a new field 'not_cmp' to 'diff_opt_t' that detects
- *  if some objects are not comparable and prints the message
- *  "Some objects are not comparable"
- *
- * February 2007
- *  Added comparison for dataset regions.
- *  Added support for reading and comparing by hyperslabs for large files.
- *  Inclusion of a relative error formula to compare floating
- *   point numbers in order to deal with floating point uncertainty.
- *  Printing of dataset dimensions along with dataset name
- *
- *  November 19, 2007
- *    adopted the syntax h5diff  [OPTIONS]  file1 file2  [obj1[obj2]]
- *
- *-------------------------------------------------------------------------
- */
-
-
-int main(int argc, const char *argv[])
-{
-    int        ret;
-    const char *fname1 = NULL;
-    const char *fname2 = NULL;
-    const char *objname1  = NULL;
-    const char *objname2  = NULL;
-    hsize_t    nfound=0;
-    diff_opt_t options;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    /*-------------------------------------------------------------------------
-    * process the command-line
-    *-------------------------------------------------------------------------
-    */
-    parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
-
-    /*-------------------------------------------------------------------------
-    * do the diff
-    *-------------------------------------------------------------------------
-    */
-
-    nfound = h5diff(fname1,fname2,objname1,objname2,&options);
-
-    print_info(&options);
-
-   /*-------------------------------------------------------------------------
-    * exit code
-    *   1 if differences, 0 if no differences, 2 if error
-    *-------------------------------------------------------------------------
-    */
-
-    ret = (nfound == 0 ? 0 : 1 );
-
-    /* if graph difference return 1 for differences  */
-    if ( options.contents == 0 )
-        ret = 1;
-
-    /* and return 2 for error */
-    if (options.err_stat)
-        ret = 2;
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5diff_exit
- *
- * Purpose: dismiss phdiff worker processes and exit
- *
- * Return: none
- *
- * Programmer: Albert Cheng
- * Date: Feb 6, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void h5diff_exit(int status)
-{
-    exit(status);
-}
-
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c
deleted file mode 100644
index 937bd32..0000000
--- a/tools/h5diff/h5diffgentest.c
+++ /dev/null
@@ -1,7400 +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.     *
-* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "hdf5.h"
-#include "H5private.h"
-
-/*
- * The output functions need a temporary buffer to hold a piece of the
- * dataset while it's being printed. This constant sets the limit on the
- * size of that temporary buffer in bytes. For efficiency's sake, choose the
- * largest value suitable for your machine (for testing use a small value).
- */
-/* Maximum size used in a call to malloc for a dataset 
- * NOTE: this value should stay in sync with the value defined in the tools
- *       library file: h5tools_utils.h 
- */
-hsize_t H5TOOLS_MALLOCSIZE = (128 * 1024 * 1024);
-
-/*-------------------------------------------------------------------------
-* Program: h5diffgentest
-*
-* Purpose: generate files for h5diff testing
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-
-#define FILE1    "h5diff_basic1.h5"
-#define FILE2    "h5diff_basic2.h5"
-#define FILE3    "h5diff_types.h5"
-#define FILE4    "h5diff_dtypes.h5"
-#define FILE5    "h5diff_attr1.h5"
-#define FILE6    "h5diff_attr2.h5"
-#define FILE7    "h5diff_dset1.h5"
-#define FILE8    "h5diff_dset2.h5"
-#define FILE9    "h5diff_hyper1.h5"
-#define FILE10   "h5diff_hyper2.h5"
-#define FILE11   "h5diff_empty.h5"
-#define FILE12   "h5diff_links.h5"
-#define FILE13   "h5diff_softlinks.h5"
-#define FILE14   "h5diff_linked_softlink.h5"
-#define FILE15   "h5diff_extlink_src.h5"
-#define FILE16   "h5diff_extlink_trg.h5"
-#define FILE17   "h5diff_ext2softlink_src.h5"
-#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"
-#define GRP_RECURSE_FILE2   "h5diff_grp_recurse2.h5"
-/* same structure via external links through files */
-#define GRP_RECURSE1_EXT    "h5diff_grp_recurse_ext1.h5"
-#define GRP_RECURSE2_EXT1   "h5diff_grp_recurse_ext2-1.h5"
-#define GRP_RECURSE2_EXT2   "h5diff_grp_recurse_ext2-2.h5"
-#define GRP_RECURSE2_EXT3   "h5diff_grp_recurse_ext2-3.h5"
-/* same structure, same obj name with different value */
-#define EXCLUDE_FILE1_1     "h5diff_exclude1-1.h5"
-#define EXCLUDE_FILE1_2     "h5diff_exclude1-2.h5"
-/* different structure and obj names */
-#define EXCLUDE_FILE2_1     "h5diff_exclude2-1.h5"
-#define EXCLUDE_FILE2_2     "h5diff_exclude2-2.h5"
-/* only one file has unique objs  */
-#define EXCLUDE_FILE3_1     "h5diff_exclude3-1.h5"
-#define EXCLUDE_FILE3_2     "h5diff_exclude3-2.h5"
-/* compound type with multiple vlen string types */
-#define COMP_VL_STRS_FILE   "h5diff_comp_vl_strs.h5"
-/* attribute compre with verbose level */
-#define ATTR_VERBOSE_LEVEL_FILE1 "h5diff_attr_v_level1.h5"
-#define ATTR_VERBOSE_LEVEL_FILE2 "h5diff_attr_v_level2.h5"
-/* file containing valid/invalid enum value mix */
-#define ENUM_INVALID_VALUES "h5diff_enum_invalid_values.h5"
-/* file with container types (array,vlen) with multiple compounds */
-#define COMPS_COMPLEX1   "compounds_array_vlen1.h5"
-#define COMPS_COMPLEX2   "compounds_array_vlen2.h5"
-/* non-comparable dataset and attribute */
-#define NON_COMPARBLES1 "non_comparables1.h5"
-#define NON_COMPARBLES2 "non_comparables2.h5"
-
-#define UIMAX    4294967295u /*Maximum value for a variable of type unsigned int */
-#define STR_SIZE 3
-#define GBLL    ((unsigned long long) 1024 * 1024 *1024 )
-
-#define MY_LINKCLASS 187
-
-/* Dataspace of 0 dimension size */
-#define SPACE1_RANK 2
-#define SPACE1_DIM1 0
-#define SPACE1_DIM2 0
-
-/* A UD link traversal function.  Shouldn't actually be called. */
-static hid_t UD_traverse(H5_ATTR_UNUSED const char * link_name, H5_ATTR_UNUSED hid_t cur_group,
-                         H5_ATTR_UNUSED const void * udata, H5_ATTR_UNUSED size_t udata_size, H5_ATTR_UNUSED hid_t lapl_id)
-{
-    return -1;
-}
-const H5L_class_t UD_link_class[1] = {{
-    H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
-        (H5L_type_t)MY_LINKCLASS,             /* Link type id number            */
-        "UD link class",          /* name for debugging             */
-        NULL,                     /* Creation callback              */
-        NULL,                     /* Move/rename callback           */
-        NULL,                     /* Copy callback                  */
-        UD_traverse,              /* The actual traversal function  */
-        NULL,                     /* Deletion callback              */
-        NULL                      /* Query callback                 */
-}};
-
-
-/*-------------------------------------------------------------------------
-* prototypes
-*-------------------------------------------------------------------------
-*/
-
-/* tests called in main() */
-static int test_basic(const char *fname1, const char *fname2, const char *fname3);
-static int test_types(const char *fname);
-static int test_datatypes(const char *fname);
-static int test_attributes(const char *fname,int make_diffs);
-static int test_datasets(const char *fname,int make_diffs);
-static int test_special_datasets(const char *fname,int make_diffs);
-static int test_hyperslab(const char *fname,int make_diffs);
-static int test_link_name(const char *fname1);
-static int test_soft_links(const char *fname1);
-static int test_linked_softlinks(const char *fname1);
-static int test_external_links(const char *fname1, const char *fname2);
-static int test_ext2soft_links(const char *fname1, const char *fname2);
-static int test_dangle_links(const char *fname1, const char *fname2);
-static int test_group_recurse(const char *fname1, const char *fname2);
-static int test_group_recurse2(void);
-static int test_exclude_obj1(const char *fname1, const char *fname2);
-static int test_exclude_obj2(const char *fname1, const char *fname2);
-static int test_exclude_obj3(const char *fname1, const char *fname2);
-static int test_comp_vlen_strings(const char *fname1, const char *grp_name, int is_file_new);
-static int test_attributes_verbose_level(const char *fname1, const char *fname2);
-static int test_enums(const char *fname);
-static void test_comps_array (const char *fname, const char *dset, const char *attr,int diff, int is_file_new);
-static void test_comps_vlen (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
-static void test_comps_array_vlen (const char *fname, const char *dset, const char *attr, int diff, int is_file_new);
-static void test_comps_vlen_arry (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
-static void test_data_nocomparables (const char *fname, int diff);
-static void test_objs_nocomparables (const char *fname1, const char *fname2);
-
-/* called by test_attributes() and test_datasets() */
-static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
-static void write_dset_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
-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);
-
-
-/*-------------------------------------------------------------------------
-* Function: main
-*
-* Purpose: main program
-*
-*-------------------------------------------------------------------------
-*/
-
-int main(void)
-{
-    test_basic(FILE1, FILE2, FILE11);
-
-    test_types (FILE3);
-    test_datatypes(FILE4);
-
-    /* generate 2 files, the second call creates a similar file with differences */
-    test_attributes(FILE5,0);
-    test_attributes(FILE6,1);
-
-    /* test attributes with verbose level */
-    test_attributes_verbose_level(ATTR_VERBOSE_LEVEL_FILE1, ATTR_VERBOSE_LEVEL_FILE2);
-
-    /* generate 2 files, the second call creates a similar file with differences */
-    test_datasets(FILE7,0);
-    test_datasets(FILE8,1);
-
-    /* generate 2 files, the second call creates a similar file with differences */
-    test_hyperslab(FILE9,0);
-    test_hyperslab(FILE10,1);
-
-    test_link_name(FILE12);
-
-    test_soft_links(FILE13);
-
-    test_linked_softlinks(FILE14);
-
-    test_external_links(FILE15, FILE16);
-
-    test_ext2soft_links(FILE17, FILE18);
-
-    /* generate 2 files, the second call creates a similar file with differences */
-    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);
-    test_group_recurse2();
-
-    test_exclude_obj1(EXCLUDE_FILE1_1, EXCLUDE_FILE1_2);
-    test_exclude_obj2(EXCLUDE_FILE2_1, EXCLUDE_FILE2_2);
-    test_exclude_obj3(EXCLUDE_FILE3_1, EXCLUDE_FILE3_2);
-
-    /* diff various multiple vlen and fixlen string types in a compound dataset */
-    test_comp_vlen_strings(COMP_VL_STRS_FILE, "group", 1);
-    test_comp_vlen_strings(COMP_VL_STRS_FILE, "group_copy", 0);
-
-    /* diff when invalid enum values are present.
-     * This will probably grow to involve more extensive testing of
-     * enums so it has been given its own test file and test (apart
-     * from the basic type testing).
-     */
-    test_enums(ENUM_INVALID_VALUES);
-
-    /* -------------------------------------------------
-     * Create test files with dataset and attribute with container types 
-     * (array, vlen) with multiple nested compound types.
-     */
-    /* file1 */
-    test_comps_array(COMPS_COMPLEX1,"dset1", "attr1", 0, 1);
-    test_comps_vlen(COMPS_COMPLEX1,"dset2", "attr2", 0, 0);
-    test_comps_array_vlen(COMPS_COMPLEX1,"dset3", "attr3", 0, 0);
-    test_comps_vlen_arry(COMPS_COMPLEX1,"dset4", "attr4", 0, 0);
-    /* file2 */
-    test_comps_array(COMPS_COMPLEX2,"dset1", "attr1", 5, 1);
-    test_comps_vlen(COMPS_COMPLEX2,"dset2", "attr2",5, 0);
-    test_comps_array_vlen(COMPS_COMPLEX2,"dset3", "attr3", 5, 0);
-    test_comps_vlen_arry(COMPS_COMPLEX2,"dset4", "attr4", 5, 0);
-
-    /*-------------------------------------------------
-     * Create test files with non-comparable dataset and attributes with 
-     * comparable datasets and attributes.  All the comparables should display 
-     * differences.
-     */
-    test_data_nocomparables(NON_COMPARBLES1,0);
-    test_data_nocomparables(NON_COMPARBLES2,5);
-
-    /* common objects (same name) with different object types. HDFFV-7644 */
-    test_objs_nocomparables(NON_COMPARBLES1, NON_COMPARBLES2);
-
-    return 0;
-}
-
-/*-------------------------------------------------------------------------
-* Function: test_basic
-*
-* Purpose: Create basic test files, first two contains different data, the
-* third one is just an empty file.
-*
-*-------------------------------------------------------------------------
-*/
-
-static
-int test_basic(const char *fname1, const char *fname2, const char *fname3)
-{
-    hid_t   fid1, fid2;
-    hid_t   gid1, gid2, gid3;
-    hsize_t dims1[1] = { 6 };
-    hsize_t dims2[2] = { 3,2 };
-
-    /* create the empty file */
-    if ((fid1=H5Fcreate(fname3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0){
-        fprintf(stderr, "empty file (%s) creation failed.\n", fname3);
-        goto out;
-    }
-    if (H5Fclose(fid1) < 0){
-        fprintf(stderr, "empty file (%s) close failed.\n", fname3);
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * create two files
-    *-------------------------------------------------------------------------
-    */
-
-    if (( fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 )
-        goto out;
-    if (( fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 )
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * create groups
-    *-------------------------------------------------------------------------
-    */
-
-    gid1 = H5Gcreate2(fid1, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid2 = H5Gcreate2(fid2, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid3 = H5Gcreate2(fid2, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * tests:
-    * # 1.1 normal mode
-    * # 1.2 normal mode with objects
-    * # 1.3 report mode
-    * # 1.4 report mode with objects
-    * # 1.5 with -d
-    *-------------------------------------------------------------------------
-    */
-
-    {
-        double data1[3][2] = {{  1.0F,   1.0F}, {  1.00F,   1.000F}, {  0.0F,   0.0F}};
-        double data2[3][2] = {{  0.0F,   1.1F}, {  1.01F,   1.001F}, {  0.0F,   1.0F}};
-        double data3[3][2] = {{100.0F, 100.0F}, {100.00F, 100.000F}, {100.0F, 100.0F}};
-        double data4[3][2] = {{105.0F, 120.0F}, {160.00F,  95.000F}, { 80.0F,  40.0F}};
-
-        write_dset(gid1,2,dims2,"dset1",H5T_NATIVE_DOUBLE,data1);
-        write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_DOUBLE,data2);
-        write_dset(gid1,2,dims2,"dset3",H5T_NATIVE_DOUBLE,data3);
-        write_dset(gid2,2,dims2,"dset4",H5T_NATIVE_DOUBLE,data4);
-        write_dset(gid2,2,dims2,"dset1",H5T_NATIVE_DOUBLE,data2);
-
-    }
-    /*-------------------------------------------------------------------------
-    * relative error, compare divide by zero, both zero
-    * # 1.6.1 with -p (int)
-    *-------------------------------------------------------------------------
-    */
-    {
-        int data5[3][2] = {{100,100},{100,0},{0,100}};
-        int data6[3][2] = {{120,80}, {0,100},{0,50}};
-
-        write_dset(gid1,2,dims2,"dset5",H5T_NATIVE_INT,data5);
-        write_dset(gid1,2,dims2,"dset6",H5T_NATIVE_INT,data6);
-
-    }
-
-    /*-------------------------------------------------------------------------
-    * relative error, compare divide by zero, both zero
-    * # 1.6.2 with -p (unsigned long long)
-    *-------------------------------------------------------------------------
-    */
-    {
-        unsigned long long data7[3][2] = {{100,100},{100,0},{0,100}};
-        unsigned long long data8[3][2] = {{120,80}, {0,100},{0,50}};
-
-        write_dset(gid1,2,dims2,"dset7",H5T_NATIVE_ULLONG,data7);
-        write_dset(gid1,2,dims2,"dset8",H5T_NATIVE_ULLONG,data8);
-
-    }
-
-    /*-------------------------------------------------------------------------
-    * relative error, compare divide by zero, both zero
-    * # 1.6.3 with -p (double)
-    *
-    *   A   B   1-B/A   %
-    *   100 120 0.2     20
-    *   100 80  0.2     20
-    *   100 0   1       100
-    *   0   100 #DIV/0! #DIV/0!
-    *   0   0   #DIV/0! #DIV/0!
-    *   100 50  0.5     50
-    *-------------------------------------------------------------------------
-    */
-    {
-        double data9[3][2] = {{100.0F, 100.0F}, {100.0F,   0.0F}, {0.0F, 100.0F}};
-        double data10[3][2] ={{120.0F,  80.0F}, {  0.0F, 100.0F}, {0.0F,  50.0F}};
-
-        write_dset(gid1,2,dims2,"dset9",H5T_NATIVE_DOUBLE,data9);
-        write_dset(gid1,2,dims2,"dset10",H5T_NATIVE_DOUBLE,data10);
-
-    }
-
-
-    /*-------------------------------------------------------------------------
-    * test floating point comparison
-    *-------------------------------------------------------------------------
-    */
-    {
-        /* epsilon = 0.0000001 = 1e-7
-         * system epsilon for float : FLT_EPSILON = 1.19209E-07
-         */
-        float  data11[3][2] ={{0.000000f,0.0000001f},{0.0000001f, 0.00000022f},{0.0000001f,0.0000001f}};
-        float  data12[3][2] ={{0.000000f,0.0000002f},{0.0000003f,0.0000001f},{0.000000f,0.0000001f}};
-        /* epsilon = 0.0000000000000001 = 1e-16
-         * system epsilon for double : DBL_EPSILON = 2.22045E-16
-         */
-        double data13[3][2] ={
-            {H5_DOUBLE(0.0000000000000000),  H5_DOUBLE(0.0000000000000001)},
-            {H5_DOUBLE(0.0000000000000001),  H5_DOUBLE(0.0000000000000000)},
-            {H5_DOUBLE(0.00000000000000033), H5_DOUBLE(0.0000000000000001)}};
-        double data14[3][2] ={
-            {H5_DOUBLE(0.0000000000000000), H5_DOUBLE(0.0000000000000004)},
-            {H5_DOUBLE(0.0000000000000002), H5_DOUBLE(0.0000000000000001)},
-            {H5_DOUBLE(0.0000000000000001), H5_DOUBLE(0.00000000000000000)}};
-
-        write_dset(gid1,2,dims2,"fp1",H5T_NATIVE_FLOAT,data11);
-        write_dset(gid1,2,dims2,"fp2",H5T_NATIVE_FLOAT,data12);
-        write_dset(gid1,2,dims2,"d1",H5T_NATIVE_DOUBLE,data13);
-        write_dset(gid1,2,dims2,"d2",H5T_NATIVE_DOUBLE,data14);
-
-    }
-
-
-#if H5_SIZEOF_LONG_DOUBLE !=0
-    {
-
-        /*-------------------------------------------------------------------------
-        * H5T_NATIVE_LDOUBLE
-        *-------------------------------------------------------------------------
-        */
-
-        long double data15[3][2] ={{1.0L,1.0L},{1.0L,1.0L},{1.0L,1.0L}};
-
-        write_dset(gid1,2,dims2,"ld",H5T_NATIVE_LDOUBLE,data15);
-
-    }
-#endif
-
-
-
-    /*-------------------------------------------------------------------------
-    * NaNs in H5T_NATIVE_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    {
-
-        float data15[6];
-        float data16[6];
-
-        data15[0] = (float)HDsqrt(-1.0F);
-        data15[1] = 1.0F;
-        data15[2] = (float)HDsqrt(-1.0F);
-        data15[3] = 1.0F;
-        data15[4] = 1.0F;
-        data15[5] = 1.0F;
-
-        data16[0] = (float)HDsqrt(-1.0F);
-        data16[1] = (float)HDsqrt(-1.0F);
-        data16[2] = 1.0F;
-        data16[3] = 1.0F;
-        data16[4] = 1.0F;
-        data16[5] = 1.0F;
-
-        write_dset(gid1,1,dims1,"fp15",H5T_NATIVE_FLOAT,data15);
-        write_dset(gid1,1,dims1,"fp16",H5T_NATIVE_FLOAT,data16);
-
-    }
-
-    /*-------------------------------------------------------------------------
-    * NaNs in H5T_NATIVE_DOUBLE
-    *-------------------------------------------------------------------------
-    */
-    {
-
-        double data17[6];
-        double data18[6];
-
-        data17[0] = HDsqrt(-1.0F);
-        data17[1] = 1.0F;
-        data17[2] = HDsqrt(-1.0F);
-        data17[3] = 1.0F;
-        data17[4] = 1.0F;
-        data17[5] = 1.0F;
-
-        data18[0] = HDsqrt(-1.0F);
-        data18[1] = HDsqrt(-10000.0F);
-        data18[2] = 1.0F;
-        data18[3] = 1.0F;
-        data18[4] = 1.0F;
-        data18[5] = 1.0F;
-
-        write_dset(gid1,1,dims1,"fp17",H5T_NATIVE_DOUBLE,data17);
-        write_dset(gid1,1,dims1,"fp18",H5T_NATIVE_DOUBLE,data18);
-        write_dset(gid1,1,dims1,"fp18_COPY",H5T_NATIVE_DOUBLE,data18);
-    }
-
-    /*------------------------------------------------------------------------
-     *            INFINITY values
-     *------------------------------------------------------------------------
-     */
-    {
-        float  data19[6];
-        double data20[6];
-
-        data19[0] = data19[1] = data19[2] = (float)HDlog(0.0F);
-        data19[3] = data19[4] = data19[5] = (float)-HDlog(0.0F);
-
-        data20[0] = data20[1] = data20[2] = HDlog(0.0F);
-        data20[3] = data20[4] = data20[5] = -HDlog(0.0F);
-
-        write_dset(gid1,1,dims1,"fp19",H5T_NATIVE_FLOAT,data19);
-        write_dset(gid1,1,dims1,"fp19_COPY",H5T_NATIVE_FLOAT,data19);
-        write_dset(gid1,1,dims1,"fp20",H5T_NATIVE_DOUBLE,data20);
-        write_dset(gid1,1,dims1,"fp20_COPY",H5T_NATIVE_DOUBLE,data20);
-    }
-
-    /*-------------------------------------------------------------------------
-    * NaNs in H5T_NATIVE_DOUBLE and H5T_NATIVE_FLOAT inside H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-    {
-        typedef struct cmp1_t
-        {
-            double d;
-            float  f;
-        } cmp1_t;
-
-        cmp1_t   buf1[2];
-        cmp1_t   buf2[2];
-        hsize_t  dims[1] = {2};
-        size_t   type_size;
-        hid_t    tid;
-
-        buf1[0].d = HDsqrt(-1.0F);
-        buf1[0].f = (float)HDsqrt(-1.0F);
-        buf2[0].d = HDsqrt(-1.0F);
-        buf2[0].f = (float)HDsqrt(-1.0F);
-
-        buf1[1].d = HDsqrt(-1.0F);
-        buf1[1].f = (float)HDsqrt(-1.0F);
-        buf2[1].d = 0.0F;
-        buf2[1].f = 0.0F;
-
-        type_size = sizeof( cmp1_t );
-        tid = H5Tcreate (H5T_COMPOUND, type_size );
-        H5Tinsert(tid, "d", HOFFSET( cmp1_t, d ), H5T_NATIVE_DOUBLE );
-        H5Tinsert(tid, "f", HOFFSET( cmp1_t, f ), H5T_NATIVE_FLOAT );
-        write_dset(gid1,1,dims,"dset11",tid,buf1);
-        write_dset(gid1,1,dims,"dset12",tid,buf2);
-        H5Tclose(tid);
-
-
-    }
-
-    /* not comparable objects */
-    {
-
-        typedef struct cmp1_t
-        {
-            double d;
-            int    i;
-        } cmp1_t;
-
-        typedef struct cmp2_t
-        {
-            int    i;
-            double d;
-        } cmp2_t;
-
-        typedef struct cmp3_t
-        {
-            int i;
-        } cmp3_t;
-
-        double       data2[6] = {0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F};
-        int          data3[6] = {0,0,0,0,0,0};
-        int          data4[3][2] = {{0,0},{0,0},{0,0}};
-        int          data5[2][2] = {{0,0},{0,0}};
-        unsigned int data6[3][2] = {{0,0},{0,0},{0,0}};
-        cmp1_t       data7[1] = {{1.0f, 2}};
-        cmp2_t       data8[1] = {{1, 2.0f}};
-        hsize_t      dims3[2] = {2, 2};
-        hsize_t      dims4[1] = {1};
-        size_t       type_size;
-        hid_t        tid;
-
-
-
-        write_dset(gid3,1,dims1,"dset1",H5T_NATIVE_DOUBLE,NULL);
-        write_dset(gid3,1,dims1,"dset2",H5T_NATIVE_DOUBLE,data2);
-        write_dset(gid3,1,dims1,"dset3",H5T_NATIVE_INT,data3);
-        write_dset(gid3,2,dims2,"dset4",H5T_NATIVE_INT,data4);
-        write_dset(gid3,2,dims3,"dset5",H5T_NATIVE_INT,data5);
-        write_dset(gid3,2,dims2,"dset6",H5T_NATIVE_UINT,data6);
-
-        /* case of compound with different type members */
-        type_size = sizeof( cmp1_t );
-        tid = H5Tcreate (H5T_COMPOUND, type_size );
-        H5Tinsert(tid, "d", HOFFSET( cmp1_t, d ), H5T_NATIVE_DOUBLE );
-        H5Tinsert(tid, "i", HOFFSET( cmp1_t, i ), H5T_NATIVE_INT );
-        write_dset(gid3,1,dims4,"dset7",tid,data7);
-        H5Tclose(tid);
-
-        type_size = sizeof( cmp2_t );
-        tid = H5Tcreate (H5T_COMPOUND, type_size );
-        H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT  );
-        H5Tinsert(tid, "d", HOFFSET( cmp2_t, d ), H5T_NATIVE_DOUBLE );
-        write_dset(gid3,1,dims4,"dset8",tid,data8);
-        H5Tclose(tid);
-
-        /* case of compound with different number of members */
-        type_size = sizeof( cmp3_t );
-        tid = H5Tcreate (H5T_COMPOUND, type_size );
-        H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT  );
-        write_dset(gid3,1,dims4,"dset9",tid,NULL);
-        H5Tclose(tid);
-
-    }
-
-
-    /*-------------------------------------------------------------------------
-    * close
-    *-------------------------------------------------------------------------
-    */
-    H5Gclose(gid1);
-    H5Gclose(gid2);
-    H5Gclose(gid3);
-    H5Fclose(fid1);
-    H5Fclose(fid2);
-    return SUCCEED;
-
-out:
-
-    return FAIL;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: test_types
-*
-* Purpose: Compare different HDF5 object & link types:
-* H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK
-*
-*-------------------------------------------------------------------------
-*/
-static
-int test_types(const char *fname)
-{
-    hid_t   fid1;
-    hid_t   gid1;
-    hid_t   gid2;
-    hid_t   tid1;
-    hid_t   tid2;
-    herr_t  status;
-    hsize_t dims[1]={1};
-    typedef struct s1_t
-    {
-        int    a;
-        float  b;
-    } s1_t;
-    typedef struct s2_t
-    {
-        int    a;
-    } s2_t;
-
-    /*-------------------------------------------------------------------------
-    * Create one file
-    *-------------------------------------------------------------------------
-    */
-    fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * H5G_DATASET
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0);
-
-    /*-------------------------------------------------------------------------
-    * H5G_GROUP
-    *-------------------------------------------------------------------------
-    */
-    gid1 = H5Gcreate2(fid1, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Gclose(gid1);
-    gid2 = H5Gcreate2(fid1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Gclose(gid2);
-
-    /*-------------------------------------------------------------------------
-    * H5G_TYPE
-    *-------------------------------------------------------------------------
-    */
-
-    /* create and commit datatype 1 */
-    tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
-    H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT);
-    H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
-    H5Tcommit2(fid1, "t1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Tclose(tid1);
-    /* create and commit datatype 2 */
-    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
-    H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT);
-    H5Tcommit2(fid1, "t2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Tclose(tid2);
-
-    /*-------------------------------------------------------------------------
-    * H5G_LINK
-    *-------------------------------------------------------------------------
-    */
-
-    status = H5Lcreate_soft("g1", fid1, "l1", H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Lcreate_soft("g2", fid1, "l2", H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * H5G_UDLINK
-    *-------------------------------------------------------------------------
-    */
-    H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lregister(UD_link_class);
-    H5Lcreate_ud(fid1, "ud_link", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * Close
-    *-------------------------------------------------------------------------
-    */
-    status = H5Fclose(fid1);
-    return status;
-}
-
-
-/*
-
-# ##############################################################################
-# # not comparable types
-# ##############################################################################
-
-# 2.0
-TOOLTEST h5diff_20.txt file3.h5 file3.h5 -v dset g1
-
-# 2.1
-TOOLTEST h5diff_21.txt file3.h5 file3.h5 -v dset l1
-
-# 2.2
-TOOLTEST h5diff_22.txt file3.h5 file3.h5 -v dset t1
-
-# ##############################################################################
-# # compare groups, types, links (no differences and differences)
-# ##############################################################################
-
-# 2.3
-TOOLTEST h5diff_23.txt file3.h5 file3.h5 -v g1 g1
-
-# 2.4
-TOOLTEST h5diff_24.txt file3.h5 file3.h5 -v t1 t1
-
-# 2.5
-TOOLTEST h5diff_25.txt file3.h5 file3.h5 -v l1 l1
-
-# 2.6
-TOOLTEST h5diff_26.txt file3.h5 file3.h5 -v g1 g2
-
-# 2.7
-TOOLTEST h5diff_27.txt file3.h5 file3.h5 -v t1 t2
-
-# 2.8
-TOOLTEST h5diff_28.txt file3.h5 file3.h5 -v l1 l2
-*/
-
-/*-------------------------------------------------------------------------
-* Function: test_datatypes
-*
-* Purpose: test dataset datatypes
-*
-*-------------------------------------------------------------------------
-*/
-static
-int test_datatypes(const char *fname)
-{
-
-    hid_t   fid1;
-    hid_t   dset;
-    hsize_t dims[2]={3,2};
-    herr_t  status;
-    char    buf1a[3][2] = {{1,1},{1,1},{1,1}};
-    char    buf1b[3][2] = {{1,1},{3,4},{5,6}};
-    short   buf2a[3][2] = {{1,1},{1,1},{1,1}};
-    short   buf2b[3][2] = {{1,1},{3,4},{5,6}};
-    int     buf3a[3][2] = {{1,1},{1,1},{1,1}};
-    int     buf3b[3][2] = {{1,1},{3,4},{5,6}};
-    long    buf4a[3][2] = {{1,1},{1,1},{1,1}};
-    long    buf4b[3][2] = {{1,1},{3,4},{5,6}};
-    float   buf5a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
-    float   buf5b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
-    double  buf6a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
-    double  buf6b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
-
-    /*unsigned/signed test
-    signed char -128 to 127
-    unsigned char 0 to 255
-    */
-    char          buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}};
-    unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}};
-
-    /* long long test */
-    long long            buf8a[3][2] = {{1,1},{1,1},{1,1}};
-    long long            buf8b[3][2] = {{1,1},{3,4},{5,6}};
-    unsigned long long   buf9a[3][2] = {{1,1},{1,1},{1,1}};
-    unsigned long long   buf9b[3][2] = {{1,1},{3,4},{5,6}};
-
-    unsigned int    buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
-    unsigned int    buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
-
-    unsigned short     buf11a[3][2] = {{204,205},{2,3},{1,1}};
-    unsigned int     buf11b[3][2] = {{204,205},{2,3},{1,1}};
-
-
-    /*-------------------------------------------------------------------------
-    * Create a file
-    *-------------------------------------------------------------------------
-    */
-    fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * Check for different storage order. Give a warning if they are different
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
-    write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_CHAR
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
-    write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_SHORT
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
-    write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_INT
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
-    write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_LONG
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
-    write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
-    write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_DOUBLE
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
-    write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
-    write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_LLONG
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
-    write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_ULLONG
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
-    write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
-
-    /*-------------------------------------------------------------------------
-    * H5T_NATIVE_INT
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
-    write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
-
-    /*-------------------------------------------------------------------------
-    * Same type class, different size
-    *-------------------------------------------------------------------------
-    */
-    write_dset(fid1,2,dims,"dset11a",H5T_STD_U16LE,buf11a);
-    dset=H5Dopen2 (fid1, "dset11a", H5P_DEFAULT);
-    write_attr(dset,2,dims,"attr",H5T_STD_U16LE,buf11a);
-    H5Dclose (dset);
-
-    write_dset(fid1,2,dims,"dset11b",H5T_STD_U32LE,buf11b);
-    dset=H5Dopen2 (fid1, "dset11b", H5P_DEFAULT);
-    write_attr(dset,2,dims,"attr",H5T_STD_U32LE,buf11b);
-    H5Dclose (dset);
-
-    /*-------------------------------------------------------------------------
-    * Close
-    *-------------------------------------------------------------------------
-    */
-    status = H5Fclose(fid1);
-    return status;
-}
-
-/*
-# ##############################################################################
-# # Dataset datatypes
-# ##############################################################################
-
-# 5.0
-TOOLTEST h5diff_50.txt file4.h5 file4.h5 -v dset0a dset0b
-
-# 5.1
-TOOLTEST h5diff_51.txt file4.h5 file4.h5 -v dset1a dset1b
-
-# 5.2
-TOOLTEST h5diff_52.txt file4.h5 file4.h5 -v dset2a dset2b
-
-# 5.3
-TOOLTEST h5diff_53.txt file4.h5 file4.h5 -v dset3a dset4b
-
-# 5.4
-TOOLTEST h5diff_54.txt file4.h5 file4.h5 -v dset4a dset4b
-
-# 5.5
-TOOLTEST h5diff_55.txt file4.h5 file4.h5 -v dset5a dset5b
-
-# 5.6
-TOOLTEST h5diff_56.txt file4.h5 file4.h5 -v dset6a dset6b
-
-# 5.7
-TOOLTEST h5diff_57.txt file4.h5 file4.h5 -v dset7a dset7b
-
-# 5.8 (region reference)
-TOOLTEST h5diff_58.txt file7.h5 file8.h5 -v refreg
-*/
-
-/*-------------------------------------------------------------------------
-* Function: test_attributes
-*
-* Purpose: test attributes
-*
-*-------------------------------------------------------------------------
-*/
-static
-int test_attributes(const char *file,
-                    int make_diffs /* flag to modify data buffers */)
-{
-    hid_t   fid;
-    hid_t   did;
-    hid_t   gid;
-    hid_t   root_id;
-    hid_t   sid;
-    hsize_t dims[1]={2};
-    herr_t  status;
-
-    /* Create a file  */
-    if((fid  = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    /* Create a 1D dataset */
-    sid = H5Screate_simple(1, dims, NULL);
-    did = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Sclose(sid);
-    assert(status >= 0);
-
-    /* Create groups */
-    gid  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    root_id   = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * write a series of attributes on the dataset, group, and root group
-    *-------------------------------------------------------------------------
-    */
-
-    write_attr_in(did,"dset",fid,make_diffs);
-    write_attr_in(gid,NULL,(hid_t)0,make_diffs);
-    write_attr_in(root_id,NULL,(hid_t)0,make_diffs);
-
-
-    /* Close */
-    status = H5Dclose(did);
-    assert(status >= 0);
-    status = H5Gclose(gid);
-    assert(status >= 0);
-    status = H5Gclose(root_id);
-    assert(status >= 0);
-
-    /* Close file */
-    status = H5Fclose(fid);
-    assert(status >= 0);
-    return status;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: test_attributes_verbose_level
-*
-* Purpose: Cresting test files for testing attributes along with
-* levels of verbos option
-*
-*-------------------------------------------------------------------------
-*/
-static int test_attributes_verbose_level(const char *fname1, const char *fname2)
-{
-    herr_t  status = SUCCEED;
-    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};
-
-    /* common attrs dim */
-    hsize_t attr_dims[1]={2};
-
-    /* file1 attr */
-    int    f1_attr_idata[2]= {1,2};        /* integer */
-    float  f1_attr_fdata[2]= {1.1F,2.2F};    /* float */
-    /* file2 attr */
-    int    f2_attr_idata[2]= {2,3};        /* integer */
-    float  f2_attr_fdata[2]= {2.1F,3.2F};    /* float */
-
-
-    /*----------------------------------------------------------------------
-    * Create file1
-    *-----------------------------------------------------------------------*/
-    if((fid1  = H5Fcreate(fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Groups
-    */
-    f1_gid = H5Gcreate2(fid1, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f1_gid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    f1_gid2 = H5Gcreate2(fid1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f1_gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    f1_gid3 = H5Gcreate2(fid1, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f1_gid3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    f1_gid4 = H5Gcreate2(fid1, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f1_gid4 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Datasets
-    */
-    f1_sid = H5Screate_simple(1, dset_dims, NULL);
-    f1_did = H5Dcreate2(fid1, "dset", H5T_NATIVE_INT, f1_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f1_did == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    status = H5Dwrite(f1_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Named Datatype
-    */
-    f1_tid = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(fid1, "ntype", f1_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-
-
-
-    /*----------------------------------------------------------------------
-    * Create file2
-    *-----------------------------------------------------------------------*/
-    if((fid2  = H5Fcreate(fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Groups
-    */
-    f2_gid = H5Gcreate2(fid2, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f2_gid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    f2_gid2 = H5Gcreate2(fid2, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f2_gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    f2_gid3 = H5Gcreate2(fid2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f2_gid3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    f2_gid4 = H5Gcreate2(fid2, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f2_gid4 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Datasets
-    */
-    f2_sid = H5Screate_simple(1, dset_dims, NULL);
-    f2_did = H5Dcreate2(fid2, "dset", H5T_NATIVE_INT, f2_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (f2_did == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-    status = H5Dwrite(f2_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * Named Datatype
-    */
-    f2_tid = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(fid2, "ntype", f2_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-   /*----------------------------------
-    * CASE1 - Same attr number, all Same attr name
-    * add attr to group
-    */
-    write_attr(f1_gid,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
-    write_attr(f1_gid,1,attr_dims,"float1",H5T_NATIVE_FLOAT,f1_attr_fdata);
-
-    write_attr(f2_gid,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
-    write_attr(f2_gid,1,attr_dims,"float1",H5T_NATIVE_FLOAT,f2_attr_fdata);
-
-   /*----------------------------------
-    * CASE2 - Same attr number, some Same attr name
-    * add attr to dset
-    */
-    write_attr(f1_did,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
-    write_attr(f1_did,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
-
-    write_attr(f2_did,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
-    write_attr(f2_did,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f2_attr_fdata);
-
-   /*----------------------------------
-    * CASE3 - Same attr number, all different attr name
-    * add attr to ntype
-    */
-    write_attr(f1_tid,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
-    write_attr(f1_tid,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
-    write_attr(f1_tid,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f1_attr_fdata);
-
-    write_attr(f2_tid,1,attr_dims,"integer4",H5T_NATIVE_INT,f2_attr_idata);
-    write_attr(f2_tid,1,attr_dims,"float5",H5T_NATIVE_FLOAT,f2_attr_fdata);
-    write_attr(f2_tid,1,attr_dims,"float6",H5T_NATIVE_FLOAT,f2_attr_fdata);
-
-   /*----------------------------------
-    * CASE4 - Different attr number, some same attr name (vs file2-g2)
-    * add attr to g2
-    */
-    write_attr(f1_gid2,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
-    write_attr(f1_gid2,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
-    write_attr(f1_gid2,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f1_attr_fdata);
-
-    write_attr(f2_gid2,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
-    write_attr(f2_gid2,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f2_attr_fdata);
-
-
-   /*----------------------------------
-    * CASE5 - Different attr number, all different attr name
-    * add attr to g3
-    */
-    write_attr(f1_gid3,1,attr_dims,"integer10",H5T_NATIVE_INT,f1_attr_idata);
-    write_attr(f1_gid3,1,attr_dims,"float11",H5T_NATIVE_FLOAT,f1_attr_fdata);
-    write_attr(f1_gid3,1,attr_dims,"float12",H5T_NATIVE_FLOAT,f1_attr_fdata);
-
-    write_attr(f2_gid3,1,attr_dims,"integer3",H5T_NATIVE_INT,f2_attr_idata);
-    write_attr(f2_gid3,1,attr_dims,"float4",H5T_NATIVE_FLOAT,f2_attr_fdata);
-
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1 > 0)
-        H5Fclose(fid1);
-    if(fid2 > 0)
-        H5Fclose(fid2);
-    if(f1_gid > 0)
-        H5Gclose(f1_gid);
-    if(f2_gid > 0)
-        H5Gclose(f2_gid);
-    if(f1_gid2 > 0)
-        H5Gclose(f1_gid2);
-    if(f2_gid2 > 0)
-        H5Gclose(f2_gid2);
-    if(f1_gid3 > 0)
-        H5Gclose(f1_gid3);
-    if(f2_gid3 > 0)
-        H5Gclose(f2_gid3);
-    if(f1_gid4 > 0)
-        H5Gclose(f1_gid4);
-    if(f2_gid4 > 0)
-        H5Gclose(f2_gid4);
-    if(f1_did > 0)
-        H5Dclose(f1_did);
-    if(f2_did > 0)
-        H5Dclose(f2_did);
-    if(f1_sid > 0)
-        H5Sclose(f1_sid);
-    if(f2_sid > 0)
-        H5Sclose(f2_sid);
-    if(f1_tid > 0)
-        H5Tclose(f1_tid);
-    if(f2_tid > 0)
-        H5Tclose(f2_tid);
-
-    return status;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: test_datasets
-*
-* Purpose: Check all HDF5 classes
-* H5T_INTEGER, H5T_FLOAT
-* H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE,
-* H5T_ENUM, H5T_VLEN, H5T_ARRAY
-*
-*-------------------------------------------------------------------------
-*/
-static
-int test_datasets(const char *file,
-                  int make_diffs /* flag to modify data buffers */)
-{
-    hid_t   fid;
-    hid_t   did;
-    hid_t   gid;
-    hid_t   sid;
-    hsize_t dims[1]={2};
-    herr_t  status;
-    int     buf[2]={1,2};
-
-    if(make_diffs)
-        memset(buf, 0, sizeof buf);
-
-    /* Create a file  */
-    if((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    /* Create a 1D dataset */
-    sid = H5Screate_simple(1, dims, NULL);
-    did  = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-    status = H5Sclose(sid);
-    assert(status >= 0);
-
-    /* Create a group */
-    gid  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-    * write a series of datasets on the group
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset_in(gid,"/dset",fid,make_diffs);
-
-    /* close */
-    status = H5Dclose(did);
-    assert(status >= 0);
-    status = H5Gclose(gid);
-    assert(status >= 0);
-
-    /* close file */
-    status = H5Fclose(fid);
-    assert(status >= 0);
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-* Function: test_special_datasets
-*
-* Purpose: Check datasets with datasapce of zero dimension size.
-*-------------------------------------------------------------------------
-*/
-static
-int test_special_datasets(const char *file,
-                  int make_diffs /* flag to modify data buffers */)
-{
-    hid_t   fid;
-    hid_t   did;
-    hid_t   sid0, sid;
-    hsize_t dims0[SPACE1_RANK]={SPACE1_DIM1, SPACE1_DIM2};
-    hsize_t dims[SPACE1_RANK]={SPACE1_DIM1, SPACE1_DIM2};
-    herr_t  status;
-
-    /* Create a file  */
-    if((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    /* Create a dataset with zero dimension size */
-    sid0 = H5Screate_simple(SPACE1_RANK, dims0, NULL);
-    did  = H5Dcreate2(fid, "dset1", H5T_NATIVE_INT, sid0, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* close dataset */
-    status = H5Dclose(did);
-    assert(status >= 0);
-
-    /* close dataspace */
-    status = H5Sclose(sid0);
-    assert(status >= 0);
-
-    /* Create a dataset with zero dimension size in one file but the other one
-     * has a dataset with a non-zero dimension size */
-    if(make_diffs) {
-        dims[1] = SPACE1_DIM2 + 4;
-    }
-
-    sid = H5Screate_simple(SPACE1_RANK, dims, NULL);
-    did  = H5Dcreate2(fid, "dset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* close dataspace */
-    status = H5Sclose(sid);
-    assert(status >= 0);
-
-    /* close dataset */
-    status = H5Dclose(did);
-    assert(status >= 0);
-
-    /* close file */
-    status = H5Fclose(fid);
-    assert(status >= 0);
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files to compare links, one has longer name than
-*          the other and short name is subset of long name.
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_link_name(const char *fname1)
-{
-    hid_t   fid1=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    gid1 = H5Gcreate2(fid1, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    gid2 = H5Gcreate2(fid1, "group_longname", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Soft Links
-    *------------------------------------------------------------------------*/
-    status = H5Lcreate_soft("group", fid1, "link_g1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("group_longname", fid1, "link_g2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *------------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files to compare soft links in various way
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_soft_links(const char *fname1)
-{
-    hid_t   fid1=0;
-    hid_t   gid1=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    gid1 = H5Gcreate2(fid1, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"target_dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Soft Links
-    *------------------------------------------------------------------------*/
-    /* file 1 */
-    status = H5Lcreate_soft("/target_dset1", fid1, "softlink_dset1_1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/target_dset1", fid1, "softlink_dset1_2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/target_dset2", fid1, "softlink_dset2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/target_group", fid1, "softlink_group1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/target_group", fid1, "softlink_group2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/no_obj", fid1, "softlink_noexist", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(gid1)
-        H5Gclose(gid1);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files to compare linked soft links in various way
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_linked_softlinks(const char *fname1)
-{
-    hid_t   fid1=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    hid_t   gid3=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    gid1 = H5Gcreate2(fid1, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2 = H5Gcreate2(fid1, "target_group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid3 = H5Gcreate2(fid1, "target_group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"target_dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Soft Links (Linked)
-    *------------------------------------------------------------------------*/
-    /*---------
-     * file 1 */
-    status = H5Lcreate_soft("/target_dset1", fid1, "softlink1_to_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink1_to_dset1", fid1, "softlink1_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink1_to_slink1", fid1, "softlink1_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/target_dset2", fid1, "softlink2_to_dset2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink2_to_dset2", fid1, "softlink2_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink2_to_slink1", fid1, "softlink2_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("target_group1", fid1, "softlink3_to_group1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink3_to_group1", fid1, "softlink3_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink3_to_slink1", fid1, "softlink3_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("target_group2", fid1, "softlink4_to_group2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink4_to_group2", fid1, "softlink4_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("softlink4_to_slink1", fid1, "softlink4_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-    if(gid3)
-        H5Gclose(gid3);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files to compare external links in various way
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_external_links(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    /* source file */
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* target file */
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    /*--------------
-     * target file */
-    gid1 = H5Gcreate2(fid2, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2 = H5Gcreate2(fid2, "target_group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /*--------------
-     * target file */
-    status = write_dset(fid2,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"x_dset",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2,2,dims2,"x_dset",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * External Links
-    *------------------------------------------------------------------------*/
-    /*--------------*/
-    /* source file */
-    status = H5Lcreate_external(fname2, "/target_group/x_dset", fid1, "ext_link_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/target_group2/x_dset", fid1, "ext_link_dset2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/target_group", fid1, "/ext_link_grp1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/target_group2", fid1, "/ext_link_grp2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link_noexist1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external("no_file.h5", "no_obj", fid1, "ext_link_noexist2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files to compare external links which point to
-*          soft link in various way
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_ext2soft_links(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid2=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    /* source file */
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* target file */
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    /* target file */
-    gid2 = H5Gcreate2(fid2, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /*--------------
-     * target file */
-    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Soft Links (Linked)
-    *------------------------------------------------------------------------*/
-    /*---------------
-     * target file */
-    status = H5Lcreate_soft("/dset1", fid2, "softlink_to_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/dset2", fid2, "softlink_to_dset2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * External Links
-    *------------------------------------------------------------------------*/
-    /*---------------
-     * source file */
-    status = H5Lcreate_external(fname2, "/target_group", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/softlink_to_dset1", fid1, "ext_link_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/softlink_to_dset2", fid1, "ext_link_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid2)
-        H5Gclose(gid2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-* 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
-*
-* Programmer: Jonathan Kim (Feb 17, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_dangle_links(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Soft Links
-    *------------------------------------------------------------------------*/
-    /* file 1 */
-    status = H5Lcreate_soft("no_obj", fid1, "soft_link1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/dset1", fid1, "soft_link2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("no_obj", fid1, "soft_link3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("no_obj1", fid1, "soft_link4", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file 2 */
-    status = H5Lcreate_soft("no_obj", fid2, "soft_link1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("no_obj", fid2, "soft_link2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/dset2", fid2, "soft_link3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("no_obj2", fid2, "soft_link4", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * External Links
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/dset1", fid1, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external("no_file.h5", "no_obj", fid1, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = H5Lcreate_external(fname1, "no_obj", fid2, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname1, "no_obj", fid2, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname1, "/dset2", fid2, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external("no_file.h5", "no_obj", fid2, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: For testing comparing group member objects recursively
-*
-* Programmer: Jonathan Kim (Aug 19, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_group_recurse(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid1_f1=0, gid2_f1=0, gid3_f1=0, gid10_f1=0;
-    hid_t   gid1_f2=0, gid2_f2=0, gid3_f2=0, gid11_f2=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,1},{0,1},{1,0},{1,0}};
-    int data2[4][2] = {{0,2},{0,2},{2,0},{2,0}};
-    int data3[4][2] = {{0,3},{0,3},{3,0},{3,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    gid1_f1 = H5Gcreate2(fid1, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1_f1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2_f1 = H5Gcreate2(fid1, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2_f1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid3_f1 = H5Gcreate2(fid1, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid3_f1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid10_f1 = H5Gcreate2(fid1, "/grp10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid10_f1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    gid1_f2 = H5Gcreate2(fid2, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1_f2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2_f2 = H5Gcreate2(fid2, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2_f2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    gid3_f2 = H5Gcreate2(fid2, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid3_f2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    gid11_f2 = H5Gcreate2(fid2, "/grp11", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid11_f2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets under root
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets under group
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(gid1_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(gid2_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid3_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(gid3_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid3_f1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid10_f1,2,dims2,"dset4",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid10_f1,2,dims2,"dset5",H5T_NATIVE_INT,data3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = write_dset(gid1_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(gid2_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid3_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(gid3_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid3_f2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid11_f2,2,dims2,"dset4",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid11_f2,2,dims2,"dset5",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-    /*-----------------------------------------------------------------------
-    * Soft Links
-    *------------------------------------------------------------------------*/
-    /* file 1 */
-    status = H5Lcreate_soft("/grp1", fid1, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp1/grp2", fid1, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp1/grp2/grp3", fid1, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp10", fid1, "slink_grp10", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file 2 */
-    status = H5Lcreate_soft("/grp1", fid2, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp1/grp2", fid2, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp1/grp2/grp3", fid2, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_soft("/grp11", fid2, "slink_grp11", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * External Links
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = H5Lcreate_external(fname2, "/grp1", fid1, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/grp1/grp2", fid1, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname2, "/grp1/grp2/grp3", fid1, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = H5Lcreate_external(fname1, "/grp1", fid2, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname1, "/grp1/grp2", fid2, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Lcreate_external(fname1, "/grp1/grp2/grp3", fid2, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*------------------------------
-     * external circle route test
-     * file1/grp11 <-> file2/grp10  via elink_grp_circle link
-     */
-    /* file1 */
-    status = H5Lcreate_external(fname2, "/grp11", gid10_f1, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    /* file2 */
-    status = H5Lcreate_external(fname1, "/grp10", gid11_f2, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid1_f1)
-        H5Gclose(gid1_f1);
-    if(gid2_f1)
-        H5Gclose(gid2_f1);
-    if(gid3_f1)
-        H5Gclose(gid3_f1);
-    if(gid1_f2)
-        H5Gclose(gid1_f2);
-    if(gid2_f2)
-        H5Gclose(gid2_f2);
-    if(gid3_f2)
-        H5Gclose(gid3_f2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose:
-*   For testing comparing group member objects recursively via multiple
-*   linked external links
-*
-* Programmer: Jonathan Kim (Sep 16, 2010)
-*
-*-------------------------------------------------------------------------*/
-#define GRP_R_DSETNAME1 "dset1"
-#define GRP_R_DSETNAME2 "dset2"
-static int test_group_recurse2(void)
-{
-    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}};
-    int data2[4][2] = {{0,0},{0,1},{0,2},{3,3}};
-
-   /*-----------------------------------------------------------------------
-    * FILE 1
-    *------------------------------------------------------------------------*/
-    /*
-     * Create a new file using H5F_ACC_TRUNC access,
-     * default file creation properties, and default file
-     * access properties.
-     */
-    fileid1 = H5Fcreate(GRP_RECURSE1_EXT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-   /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    grp1 = H5Gcreate2(fileid1, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-    grp2 = H5Gcreate2(grp1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-    grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-    grp4 = H5Gcreate2(grp3, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp4 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-
-   /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /*
-     * Describe the size of the array and create the data space for fixed
-     * size dataset.
-     */
-    dimsf[0] = 4;
-    dimsf[1] = 2;
-    dataspace = H5Screate_simple(2, dimsf, NULL);
-
-    /*
-     * Define datatype for the data in the file.
-     * We will store little endian INT numbers.
-     */
-    datatype = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tset_order(datatype, H5T_ORDER_LE);
-
-    /*---------------
-     * dset1
-     */
-    /*
-     * Create a new dataset within the file using defined dataspace and
-     * datatype and default dataset creation properties.
-     */
-    dset1 = H5Dcreate2(fileid1, GRP_R_DSETNAME1, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
-    H5Dclose(dset1);
-
-    /*---------------
-     * dset1
-     */
-    /*
-     * Create a new dataset within the file using defined dataspace and
-     * datatype and default dataset creation properties.
-     */
-    dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
-
-    /*---------------
-     * dset2
-     */
-    /*
-     * Create a new dataset within the fileid1 using defined dataspace and
-     * datatype and default dataset creation properties.
-     */
-    dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
-
-   /*-----------------------------------------------------------------------
-    * Soft links
-    *------------------------------------------------------------------------*/
-    /*
-     * under  '/' root
-     */
-    /* link to dset1 */
-    status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-    H5Dclose(dset1);
-    H5Dclose(dset2);
-    H5Gclose(grp1);
-    H5Gclose(grp2);
-    H5Gclose(grp3);
-    H5Gclose(grp4);
-
-   /*-----------------------------------------------------------------------
-    * FILE 2-3
-    *------------------------------------------------------------------------*/
-
-    /* crate target file */
-    fileid4 = H5Fcreate(GRP_RECURSE2_EXT3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-   /*-----------------------------------------------
-    * Groups
-    */
-    grp4 = H5Gcreate2(fileid4, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp4 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT3);
-        status = FAIL;
-        goto out;
-    }
-
-    /*---------------
-     * dset2
-     */
-    /*
-     * Create a new dataset within the fileid1 using defined dataspace and
-     * datatype and default dataset creation properties.
-     */
-    dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
-
-    H5Gclose(grp4);
-    H5Dclose(dset2);
-
-
-   /*-----------------------------------------------------------------------
-    * FILE 2-2
-    *------------------------------------------------------------------------*/
-
-    /* crate target file */
-    fileid3 = H5Fcreate(GRP_RECURSE2_EXT2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-   /*-----------------------------------------------
-    * Groups
-    */
-    grp2 = H5Gcreate2(fileid3, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
-        status = FAIL;
-        goto out;
-    }
-
-    grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*---------------
-     * dset1
-     */
-    /*
-     * Create a new dataset within the fileid1 using defined dataspace and
-     * datatype and default dataset creation properties.
-     */
-    dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
-
-   /*-----------------------------------------------
-    * extlink to  $GRP_RECURSE2_EXT3/g4
-    */
-    status = H5Lcreate_external(GRP_RECURSE2_EXT3, "/g4", fileid3, "/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT2);
-        status = FAIL;
-        goto out;
-    }
-
-    H5Dclose(dset1);
-    H5Gclose(grp2);
-    H5Gclose(grp3);
-
-   /*-----------------------------------------------------------------------
-    * FILE 2-1
-    *------------------------------------------------------------------------*/
-
-    /* crate target file */
-    fileid2 = H5Fcreate(GRP_RECURSE2_EXT1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-   /*-----------------------------------------------
-    * Groups
-    */
-    grp1 = H5Gcreate2(fileid2, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (grp1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
-        status = FAIL;
-        goto out;
-    }
-
-    /*---------------
-     * dset1
-     */
-    dset1 = H5Dcreate2(fileid2, GRP_R_DSETNAME1, datatype, dataspace,
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write the data to the dataset using default transfer properties.
-     */
-    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
-
-   /*-----------------------------------------------------------------------
-    * Soft links
-    *------------------------------------------------------------------------*/
-    /*
-     * under  '/' root
-     */
-    /* link to dset1 */
-    status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid2, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE2_EXT1);
-        status = FAIL;
-        goto out;
-    }
-
-   /*-----------------------------------------------
-    * extlink to  $GRP_RECURSE2_EXT2/g2
-    */
-    status = H5Lcreate_external(GRP_RECURSE2_EXT2, "/g2", fileid2, "/g1/g2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT1);
-        status = FAIL;
-        goto out;
-    }
-
-    H5Gclose(grp1);
-    H5Dclose(dset1);
-
-out:
-    /*
-     * Close/release resources.
-     */
-    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;
-}
-
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files for excluding obj.
-*          Same structure, same obj names
-* Test : exclude obj with different value to verify the rest are same
-*
-* Programmer: Jonathan Kim (July, 21, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_exclude_obj1(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-   /*-----------------------------------------------------------------------
-    * Group
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    gid2 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"dset3",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-
-    /* file2 */
-    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2,2,dims2,"dset3",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files for excluding obj.
-*          different structure and name
-* Test : exclude different objs to verify the rest are same
-*
-* Programmer: Jonathan Kim (July, 21, 2010)
-*
-*-------------------------------------------------------------------------*/
-static int test_exclude_obj2(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    hid_t   gid3=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-   /*-----------------------------------------------------------------------
-    * Group
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    gid1 = H5Gcreate2(fid1, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    gid2 = H5Gcreate2(fid2, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /* subset name from group10 */
-    gid3 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    if (gid3 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"dset10",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-
-    /* file2 */
-    status = write_dset(fid2,2,dims2,"dset10",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid3,2,dims2,"dset3",H5T_NATIVE_INT,data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-    if(gid3)
-        H5Gclose(gid3);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files for excluding obj.
-*          Only one file contains unique objs. Common objs are same.
-* Test : exclude unique objs to verify the rest are same
-*  - HDFFV-7837
-*
-* Programmer: Jonathan Kim (Mar, 19, 2012)
-*
-*-------------------------------------------------------------------------*/
-static int test_exclude_obj3(const char *fname1, const char *fname2)
-{
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   gid1=0;
-    hsize_t dims2[2] = {2,4};
-    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
-    herr_t  status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-
-   /*-----------------------------------------------------------------------
-    * Group
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(gid1)
-        H5Gclose(gid1);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Create test files for multiple variable length string/string array
-*          along with fixed length string/string array types in
-*          a compound type dataset.
-*
-* Programmer: Jonathan Kim (Oct, 26, 2010)
-*
-*-------------------------------------------------------------------------*/
-#define STR_RANK 1
-#define VLEN_STR_DIM 1
-#define FIXLEN_STR_SIZE 21
-#define FIXLEN_STR_DIM 1
-#define VLEN_STR_ARRY_DIM 3
-#define FIXLEN_STR_ARRY_DIM 3
-#define FIXLEN_STR_ARRY_SIZE 30
-#define COMP_RANK 1
-#define COMP_DIM 1
-static int test_comp_vlen_strings(const char *fname1, const char *grp_name, int is_file_new)
-{
-    int i;
-
-    hid_t    fid1   = -1;      /* file id */
-    hid_t    gid    = -1;
-
-    /* compound1 datatype */
-    typedef struct comp1_t
-    {
-        char   *str_vlen;  /* vlen string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-    } comp1_t;
-
-    /* compound2 datatype */
-    typedef struct comp2_t
-    {
-        char   *str_vlen;  /* vlen string */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-    } comp2_t;
-
-    /* compound3 datatype */
-    typedef struct comp3_t
-    {
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen;  /* vlen string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-    } comp3_t;
-
-    /* compound4 datatype */
-    typedef struct comp4_t
-    {
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen;  /* vlen string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-    } comp4_t;
-
-    /* compound5 datatype */
-    typedef struct comp5_t
-    {
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen;  /* vlen string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-    } comp5_t;
-
-    /* compound6 datatype */
-    typedef struct comp6_t
-    {
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen;  /* vlen string */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen_repeat;  /* vlen string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-    } comp6_t;
-
-    /* compound7 datatype */
-    typedef struct comp7_t
-    {
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen;  /* vlen string */
-        char   *str_vlen_repeat;  /* vlen string */
-    } comp7_t;
-
-    /* compound8 datatype */
-    typedef struct comp8_t
-    {
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen;  /* vlen string */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        char   *str_vlen_repeat;  /* vlen string */
-    } comp8_t;
-
-    /* compound9 datatype */
-    typedef struct comp9_t
-    {
-        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
-        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
-        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
-        int    int_data1;
-        hobj_ref_t objref1;                  /* reference */
-        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
-        hobj_ref_t objref2;                  /* reference */
-        char   *str_vlen;  /* vlen string */
-        int    int_data2;
-        char   *str_vlen_repeat;  /* vlen string */
-        hobj_ref_t objref3;                  /* reference */
-        int    int_data3;
-    } comp9_t;
-
-    /* vlen string */
-    hid_t    sid_vlen_str=0;      /* dataspace ID */
-    hid_t    tid_vlen_str=0;      /* datatype ID */
-    const char vlen_str_buf[]= {
-        "Variable length string"
-        };
-    hsize_t dims_vlen_str[]  = {VLEN_STR_DIM};
-
-    /* fixlen string */
-    hid_t    sid_fixlen_str=0;      /* dataspace ID */
-    hid_t    tid_fixlen_str=0;      /* datatype ID */
-    const char fixlen_str_buf[FIXLEN_STR_SIZE]= {
-        "Fixed length string"
-        };
-    hsize_t dims_fixlen_str[]  = {FIXLEN_STR_DIM};
-
-    /* vlen string array */
-    hid_t    sid_vlen_str_array=0;      /* dataspace ID */
-    hid_t    tid_vlen_str_array_pre=0;      /* datatype ID */
-    hid_t    tid_vlen_str_array=0; /* datatype ID */
-    const char *vlen_str_array_buf[VLEN_STR_ARRY_DIM]= {
-        "1 - Variable length string Array",
-        "2 - Testing variable length string array in compound type",
-        "3 - Four score and seven\n years ago our forefathers brought forth on this continent a new nation,"
-        };
-    hsize_t dims_vlen_str_array[]  = {VLEN_STR_ARRY_DIM};
-
-    /* fixlen string array  */
-    hid_t    sid_fixlen_str_array=0;      /* dataspace ID */
-    hid_t    tid_fixlen_str_array_pre=0;      /* datatype ID */
-    hid_t    tid_fixlen_str_array=0; /* datatype ID */
-    const char *fixlen_str_array_buf[FIXLEN_STR_ARRY_DIM]= {
-        "1 - Fixed length string Array",
-        "2 - Fixed length string Array",
-        "3 - Fixed length string Array"
-        };
-    hsize_t dims_fixlen_str_array[]  = {FIXLEN_STR_ARRY_DIM};
-
-    /*------------------------------------------
-     * compound dataset
-     *------------------------------------------*/
-    hid_t    sid_comp=0;      /* dataspace ID */
-    hid_t    tid1_comp=0;      /* datatype ID */
-    hid_t    tid2_comp=0;      /* datatype ID */
-    hid_t    tid3_comp=0;      /* datatype ID */
-    hid_t    tid4_comp=0;      /* datatype ID */
-    hid_t    tid5_comp=0;      /* datatype ID */
-    hid_t    tid6_comp=0;      /* datatype ID */
-    hid_t    tid7_comp=0;      /* datatype ID */
-    hid_t    tid8_comp=0;      /* datatype ID */
-    hid_t    tid9_comp=0;      /* datatype ID */
-    hid_t    did_comp=0;      /* dataset ID */
-    hsize_t dims_comp[]  = {COMP_DIM};
-    herr_t  status = SUCCEED;
-
-    /* make compound strings data */
-    comp1_t comp1_buf;
-    comp2_t comp2_buf;
-    comp3_t comp3_buf;
-    comp4_t comp4_buf;
-    comp5_t comp5_buf;
-    comp6_t comp6_buf;
-    comp7_t comp7_buf;
-    comp8_t comp8_buf;
-    comp9_t comp9_buf;
-
-    /* copy vlen string data to compound buffers */
-    comp1_buf.str_vlen = comp1_buf.str_vlen_repeat = vlen_str_buf;
-    comp2_buf.str_vlen = comp2_buf.str_vlen_repeat = vlen_str_buf;
-    comp3_buf.str_vlen = comp3_buf.str_vlen_repeat = vlen_str_buf;
-    comp4_buf.str_vlen = comp4_buf.str_vlen_repeat = vlen_str_buf;
-    comp5_buf.str_vlen = comp5_buf.str_vlen_repeat = vlen_str_buf;
-    comp6_buf.str_vlen = comp6_buf.str_vlen_repeat = vlen_str_buf;
-    comp7_buf.str_vlen = comp7_buf.str_vlen_repeat = vlen_str_buf;
-    comp8_buf.str_vlen = comp8_buf.str_vlen_repeat = vlen_str_buf;
-    comp9_buf.str_vlen = comp9_buf.str_vlen_repeat = vlen_str_buf;
-
-    /* copy fixlen string data to compound buffers */
-    HDstrcpy(comp1_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp1_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp2_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp2_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp3_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp3_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp3_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp3_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp4_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp4_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp5_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp5_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp6_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp6_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp7_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp7_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp8_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp8_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    HDstrcpy(comp9_buf.str_fixlen, fixlen_str_buf);
-    HDstrcpy(comp9_buf.str_fixlen_repeat, fixlen_str_buf);
-
-    /* copy vlen string array data to compound buffers */
-    for (i=0; i < VLEN_STR_ARRY_DIM; i++)
-    {
-        comp1_buf.str_array_vlen[i] = comp1_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp2_buf.str_array_vlen[i] = comp2_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp3_buf.str_array_vlen[i] = comp3_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp4_buf.str_array_vlen[i] = comp4_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp5_buf.str_array_vlen[i] = comp5_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp6_buf.str_array_vlen[i] = comp6_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp7_buf.str_array_vlen[i] = comp7_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp8_buf.str_array_vlen[i] = comp8_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-        comp9_buf.str_array_vlen[i] = comp9_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
-
-    }
-
-    /* copy fixlen string attay data to compound buffers */
-    for (i=0; i < FIXLEN_STR_ARRY_DIM; i++)
-    {
-        HDstrcpy(comp1_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp1_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp2_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp2_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp3_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp3_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp4_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp4_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp5_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp5_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp6_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp6_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp7_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp7_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp8_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp8_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-
-        HDstrcpy(comp9_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
-        HDstrcpy(comp9_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
-    }
-
-    /* int data */
-    comp9_buf.int_data1 = 10;
-    comp9_buf.int_data2 = 20;
-    comp9_buf.int_data3 = 30;
-
-
-    /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    if (is_file_new == 1)
-    {
-        fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-        if (fid1 < 0)
-        {
-            fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
-            status = FAIL;
-            goto out;
-        }
-    }
-    else
-    {
-        fid1 = H5Fopen (fname1, H5F_ACC_RDWR, H5P_DEFAULT);
-        if (fid1 < 0)
-        {
-            fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname1);
-            status = FAIL;
-            goto out;
-        }
-    }
-
-    /*-----------------------------------------------------------------------
-    * Create group
-    *------------------------------------------------------------------------*/
-    gid = H5Gcreate2(fid1, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Variable length String1 - Create space and type
-    *------------------------------------------------------------------------*/
-    sid_vlen_str = H5Screate_simple(STR_RANK, dims_vlen_str, NULL);
-    if (sid_vlen_str < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    tid_vlen_str = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(tid_vlen_str, H5T_VARIABLE);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Fixed length String2 - Create space and type
-    *------------------------------------------------------------------------*/
-    sid_fixlen_str = H5Screate_simple(STR_RANK, dims_fixlen_str, NULL);
-    if (sid_fixlen_str < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    tid_fixlen_str = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(tid_fixlen_str, FIXLEN_STR_SIZE);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Fixed length String3 array - Create space and type
-    *------------------------------------------------------------------------*/
-    sid_vlen_str_array = H5Screate_simple(STR_RANK, dims_vlen_str_array, NULL);
-    if (sid_vlen_str_array < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    tid_vlen_str_array_pre = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(tid_vlen_str_array_pre, H5T_VARIABLE);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-     /* Create the array data type for the string array                */
-    tid_vlen_str_array = H5Tarray_create2(tid_vlen_str_array_pre, COMP_RANK, dims_vlen_str_array);
-    if (tid_vlen_str_array < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tarray_create2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Variable length String4 array - Create space and type
-    *------------------------------------------------------------------------*/
-    sid_fixlen_str_array = H5Screate_simple(STR_RANK, dims_fixlen_str_array, NULL);
-    if (sid_fixlen_str_array < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    tid_fixlen_str_array_pre = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(tid_fixlen_str_array_pre, FIXLEN_STR_ARRY_SIZE);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-     /* Create the array data type for the string array                */
-    tid_fixlen_str_array = H5Tarray_create2(tid_fixlen_str_array_pre, COMP_RANK, dims_fixlen_str_array);
-    if (tid_fixlen_str_array < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tarray_create2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-   /*-------------------------------------------------------------------------
-    * Compound dataset
-    *------------------------------------------------------------------------*/
-    sid_comp = H5Screate_simple(COMP_RANK, dims_comp, NULL);
-    if (sid_comp < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    tid1_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp1_t));
-    tid2_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp2_t));
-    tid3_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp3_t));
-    tid4_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp4_t));
-    tid5_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp5_t));
-    tid6_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp6_t));
-    tid7_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp7_t));
-    tid8_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp8_t));
-    tid9_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp9_t));
-
-    /* compound 1 */
-    H5Tinsert(tid1_comp, "VLEN_STR1", HOFFSET(comp1_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid1_comp, "VLEN_STR2", HOFFSET(comp1_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid1_comp, "FIXLEN_STR1", HOFFSET(comp1_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid1_comp, "FIXLEN_STR2", HOFFSET(comp1_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid1_comp, "VLEN_STR_ARRAY1", HOFFSET(comp1_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid1_comp, "VLEN_STR_ARRAY2", HOFFSET(comp1_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid1_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp1_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid1_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp1_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 2 */
-    H5Tinsert(tid2_comp, "VLEN_STR1", HOFFSET(comp2_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid2_comp, "VLEN_STR2", HOFFSET(comp2_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid2_comp, "FIXLEN_STR1", HOFFSET(comp2_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid2_comp, "FIXLEN_STR2", HOFFSET(comp2_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid2_comp, "VLEN_STR_ARRAY1", HOFFSET(comp2_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid2_comp, "VLEN_STR_ARRAY2", HOFFSET(comp2_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid2_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp2_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid2_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp2_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 3 */
-    H5Tinsert(tid3_comp, "VLEN_STR1", HOFFSET(comp3_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid3_comp, "VLEN_STR2", HOFFSET(comp3_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid3_comp, "FIXLEN_STR1", HOFFSET(comp3_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid3_comp, "FIXLEN_STR2", HOFFSET(comp3_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid3_comp, "VLEN_STR_ARRAY1", HOFFSET(comp3_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid3_comp, "VLEN_STR_ARRAY2", HOFFSET(comp3_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid3_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp3_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid3_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp3_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 4 */
-    H5Tinsert(tid4_comp, "VLEN_STR1", HOFFSET(comp4_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid4_comp, "VLEN_STR2", HOFFSET(comp4_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid4_comp, "FIXLEN_STR1", HOFFSET(comp4_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid4_comp, "FIXLEN_STR2", HOFFSET(comp4_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid4_comp, "VLEN_STR_ARRAY1", HOFFSET(comp4_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid4_comp, "VLEN_STR_ARRAY2", HOFFSET(comp4_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid4_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp4_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid4_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp4_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 5 */
-    H5Tinsert(tid5_comp, "VLEN_STR1", HOFFSET(comp5_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid5_comp, "VLEN_STR2", HOFFSET(comp5_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid5_comp, "FIXLEN_STR1", HOFFSET(comp5_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid5_comp, "FIXLEN_STR2", HOFFSET(comp5_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid5_comp, "VLEN_STR_ARRAY1", HOFFSET(comp5_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid5_comp, "VLEN_STR_ARRAY2", HOFFSET(comp5_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid5_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp5_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid5_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp5_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 6 */
-    H5Tinsert(tid6_comp, "VLEN_STR1", HOFFSET(comp6_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid6_comp, "VLEN_STR2", HOFFSET(comp6_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid6_comp, "FIXLEN_STR1", HOFFSET(comp6_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid6_comp, "FIXLEN_STR2", HOFFSET(comp6_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid6_comp, "VLEN_STR_ARRAY1", HOFFSET(comp6_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid6_comp, "VLEN_STR_ARRAY2", HOFFSET(comp6_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid6_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp6_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid6_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp6_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 7 */
-    H5Tinsert(tid7_comp, "VLEN_STR1", HOFFSET(comp7_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid7_comp, "VLEN_STR2", HOFFSET(comp7_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid7_comp, "FIXLEN_STR1", HOFFSET(comp7_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid7_comp, "FIXLEN_STR2", HOFFSET(comp7_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid7_comp, "VLEN_STR_ARRAY1", HOFFSET(comp7_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid7_comp, "VLEN_STR_ARRAY2", HOFFSET(comp7_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid7_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp7_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid7_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp7_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 8 */
-    H5Tinsert(tid8_comp, "VLEN_STR1", HOFFSET(comp8_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid8_comp, "VLEN_STR2", HOFFSET(comp8_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid8_comp, "FIXLEN_STR1", HOFFSET(comp8_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid8_comp, "FIXLEN_STR2", HOFFSET(comp8_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid8_comp, "VLEN_STR_ARRAY1", HOFFSET(comp8_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid8_comp, "VLEN_STR_ARRAY2", HOFFSET(comp8_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid8_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp8_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid8_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp8_t, str_fixlen_array_again), tid_fixlen_str_array);
-
-    /* compound 9 */
-    H5Tinsert(tid9_comp, "VLEN_STR1", HOFFSET(comp9_t, str_vlen), tid_vlen_str );
-    H5Tinsert(tid9_comp, "VLEN_STR2", HOFFSET(comp9_t, str_vlen_repeat), tid_vlen_str );
-    H5Tinsert(tid9_comp, "FIXLEN_STR1", HOFFSET(comp9_t, str_fixlen), tid_fixlen_str );
-    H5Tinsert(tid9_comp, "FIXLEN_STR2", HOFFSET(comp9_t, str_fixlen_repeat), tid_fixlen_str );
-    H5Tinsert(tid9_comp, "VLEN_STR_ARRAY1", HOFFSET(comp9_t, str_array_vlen), tid_vlen_str_array);
-    H5Tinsert(tid9_comp, "VLEN_STR_ARRAY2", HOFFSET(comp9_t, str_vlen_array_again), tid_vlen_str_array);
-    H5Tinsert(tid9_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp9_t, str_array_fixlen), tid_fixlen_str_array);
-    H5Tinsert(tid9_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp9_t, str_fixlen_array_again), tid_fixlen_str_array);
-    H5Tinsert(tid9_comp, "INT_DATA1", HOFFSET(comp9_t, int_data1), H5T_STD_I32LE);
-    H5Tinsert(tid9_comp, "INT_DATA2", HOFFSET(comp9_t, int_data2), H5T_STD_I32BE);
-    H5Tinsert(tid9_comp, "INT_DATA3", HOFFSET(comp9_t, int_data3), H5T_STD_I32LE);
-    H5Tinsert(tid9_comp, "OBJREF1", HOFFSET(comp9_t, objref1), H5T_STD_REF_OBJ);
-    H5Tinsert(tid9_comp, "OBJREF2", HOFFSET(comp9_t, objref2), H5T_STD_REF_OBJ);
-    H5Tinsert(tid9_comp, "OBJREF3", HOFFSET(comp9_t, objref3), H5T_STD_REF_OBJ);
-
-
-    /* Write data to compound 1 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset1", tid1_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid1_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp1_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 2 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset2", tid2_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid2_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp2_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 3 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset3", tid3_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid3_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp3_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 4 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset4", tid4_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid4_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp4_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 5 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset5", tid5_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid5_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp5_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 6 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset6", tid6_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid6_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp6_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 7 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset7", tid7_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid7_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp7_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 8 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset8", tid8_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did_comp, tid8_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp8_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-    H5Dclose(did_comp);
-
-    /* Write data to compound 9 dataset buffer */
-    did_comp = H5Dcreate2(gid, "Compound_dset9", tid9_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* obj references */
-    status=H5Rcreate(&(comp9_buf.objref1),gid,"Compound_dset2",H5R_OBJECT,(hid_t)-1);
-    status=H5Rcreate(&(comp9_buf.objref2),gid,"Compound_dset3",H5R_OBJECT,(hid_t)-1);
-    status=H5Rcreate(&(comp9_buf.objref3),gid,"Compound_dset4",H5R_OBJECT,(hid_t)-1);
-
-    status = H5Dwrite(did_comp, tid9_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp9_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-
-    H5Dclose(did_comp);
-
-    did_comp=0;
-out:
-   /*-----------------------------------------------------------------------
-    * Close
-    *-----------------------------------------------------------------------*/
-    if(fid1 > 0)
-        H5Fclose(fid1);
-    if(gid > 0)
-        H5Gclose(gid);
-    /* vlen string */
-    if(tid_vlen_str > 0)
-        H5Tclose(tid_vlen_str);
-    if(sid_vlen_str > 0)
-        H5Sclose(sid_vlen_str);
-    /* fixed len string */
-    if(tid_fixlen_str > 0)
-        H5Tclose(tid_fixlen_str);
-    if(sid_fixlen_str > 0)
-        H5Sclose(sid_fixlen_str);
-    /* vlen string array */
-    if(tid_vlen_str_array_pre > 0)
-        H5Tclose(tid_vlen_str_array_pre);
-    if(tid_vlen_str_array > 0)
-        H5Tclose(tid_vlen_str_array);
-    if(sid_vlen_str_array > 0)
-        H5Sclose(sid_vlen_str_array);
-    /* fixed len string array */
-    if(tid_fixlen_str_array_pre > 0)
-        H5Tclose(tid_fixlen_str_array_pre);
-    if(tid_fixlen_str_array > 0)
-        H5Tclose(tid_fixlen_str_array);
-    if(sid_fixlen_str_array > 0)
-        H5Sclose(sid_fixlen_str_array);
-    /* compound */
-    if(tid1_comp > 0)
-        H5Tclose(tid1_comp);
-    if(tid2_comp > 0)
-        H5Tclose(tid2_comp);
-    if(tid3_comp > 0)
-        H5Tclose(tid3_comp);
-    if(tid4_comp > 0)
-        H5Tclose(tid4_comp);
-    if(tid5_comp > 0)
-        H5Tclose(tid5_comp);
-    if(tid6_comp > 0)
-        H5Tclose(tid6_comp);
-    if(tid7_comp > 0)
-        H5Tclose(tid7_comp);
-    if(tid8_comp > 0)
-        H5Tclose(tid8_comp);
-    if(tid9_comp > 0)
-        H5Tclose(tid9_comp);
-    if(did_comp > 0)
-        H5Dclose(did_comp);
-    if(sid_comp > 0)
-        H5Sclose(sid_comp);
-
-    return status;
-} /* end test_comp_vlen_strings() */
-
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: Test diffs of enum values which may include invalid values.
-*
-* Programmer: Dana Robinson
-*
-*-------------------------------------------------------------------------*/
-
-static int
-test_enums(const char *fname)
-{
-    hid_t       fid  = -1;
-
-    hid_t       tid       = -1;
-    int         enum_val  = -1;
-
-    /* The data in the two arrays cover the following cases:
-     *
-     *   V = valid enum value, I = invalid enum value
-     *
-     *   0:  I-I (same value)
-     *   1:  V-I
-     *   2:  I-V
-     *   3:  V-V (same value)
-     *   4:  I-I (different values) SKIPPED FOR NOW
-     *   5:  V-V (different values)
-     */
-    /* *** NOTE ***
-     *
-     * There is a bug in H5Dread() where invalid enum values are always
-     * returned as -1 so two different invalid enum values cannot be
-     * properly compared.  Test 4 has been adjusted to pass here
-     * while we fix the issue.
-     */
-    int         data1[6] = {9, 0, 9, 0, 9, 0};
-    /*int         data1[6] = {9, 0, 9, 0, 8, 0};  */
-    int         data2[6] = {9, 9, 0, 0, 9, 1};
-
-    hsize_t     dims = 6;
-
-    herr_t      status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-     * Create the file
-     *---------------------------------------------------------------------*/
-
-    fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-----------------------------------------------------------------------
-     * Create enum types
-     *---------------------------------------------------------------------*/
-
-    tid = H5Tenum_create(H5T_NATIVE_INT);
-    enum_val = 0;
-    status = H5Tenum_insert(tid, "YIN", &enum_val);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tenum_insert failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-    enum_val = 1;
-    status = H5Tenum_insert(tid, "YANG", &enum_val);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tenum_insert failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-     * Create datasets containing enum data.
-     *---------------------------------------------------------------------*/
-
-    status = write_dset(fid, 1, &dims, "dset1", tid, data1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-    status = write_dset(fid, 1, &dims, "dset2", tid, data2);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-     * Close
-     *---------------------------------------------------------------------*/
-    if(fid)
-        H5Fclose(fid);
-    if(tid)
-        H5Tclose(tid);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
-*
-* Purpose: 
-*   Create test files with dataset and attribute with container types 
-*   (array, vlen) with multiple nested compound types.
-*
-* Function: test_comps_array()
-*  - type: compound->array->compound
-*
-* Function: test_comps_vlen()
-*  - type: compound->vlen->compound
-*
-* Function: test_comps_array_vlen()
-*  - type: compound->array->compound->vlen->compound
-*
-* Function: test_comps_vlen_arry()
-*  - type: compound->vlen->compound->array->compound
-*
-* Programmer: Jonathan Kim (Sep, 1, 2011)
-*
-*-------------------------------------------------------------------------*/
-#define SDIM_DSET 2
-#define SDIM_CMPD_ARRAY 2
-
-static void test_comps_array (const char *fname, const char *dset, const char *attr,int diff, int is_file_new)
-{
-    /* sub compound 2 */
-    typedef struct {        
-        int i2;
-        float f2;
-    } cmpd2_t;
-
-    /* top compound 1 */
-    typedef struct {
-        int i1;
-        cmpd2_t cmpd2[SDIM_CMPD_ARRAY];
-    } cmpd1_t;
-
-    cmpd1_t wdata[SDIM_DSET];   /* dataset with compound1 */
-
-    hid_t  fid;  /* HDF5 File IDs  */
-    hid_t  did_dset; /* Dataset ID   */
-    hid_t  sid_dset;       /* Dataset space ID   */
-    hid_t  tid_cmpd1;       /* Compound1 type ID   */
-    hid_t  tid_arry1;       /* Array type ID in compound1   */
-    hid_t  tid_cmpd2;       /* Compound2 type ID   */
-    hid_t  tid_attr;
-    hsize_t  sdims_dset[] = {SDIM_DSET};
-    hsize_t  sdims_cmpd_arry[] = {SDIM_CMPD_ARRAY};
-    int     i,j;       
-    herr_t  ret;  /* Generic return value  */
-
-    /* Initialize array data to write */
-    for(i=0; i < SDIM_DSET; i++)
-    {
-        wdata[i].i1 = i;
-        for(j=0; j < SDIM_CMPD_ARRAY; j++) 
-        {
-            wdata[i].cmpd2[j].i2 = i*10 + diff;
-            wdata[i].cmpd2[j].f2 = (float)(i*10.5F) + diff;
-        } /* end for */
-    }
-
-   /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    if (is_file_new == 1)
-        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    else
-        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
-
-
-    /* -------------------------------
-     * Create a sub compound2 datatype  */
-    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
-
-    /* Insert integer field */
-    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
-    assert(ret >= 0);
-
-    /* Insert float field */
-    ret = H5Tinsert(tid_cmpd2, "float2", HOFFSET(cmpd2_t, f2), H5T_NATIVE_FLOAT);
-    assert(ret >= 0);
-
-    /*-----------------------------------
-     * Create a top compound1.
-     */
-    tid_cmpd1 = H5Tcreate (H5T_COMPOUND, sizeof(cmpd1_t));
-
-    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
-    assert(ret >= 0);
-
-    /* Create an array datatype */
-    tid_arry1 = H5Tarray_create2(tid_cmpd2, 1, sdims_cmpd_arry);
-    /* insert the array */
-    ret = H5Tinsert(tid_cmpd1, "array_cmpd1", HOFFSET(cmpd1_t, cmpd2), tid_arry1);
-    assert(ret >= 0);
-
-
-    /* -------------------
-     * Create a dataset 
-     */
-    /* Create dataspace for datasets */
-    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
-
-    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /*-----------------------------------
-     * Create an attribute in root group
-     */
-    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
-    assert(tid_attr > 0);
-    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
-    assert(ret >= 0);
-
-    /* ----------------
-     * Close Dataset */
-    ret = H5Aclose(tid_attr);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_arry1);
-    assert(ret >= 0);
-    ret = H5Dclose(did_dset);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2);
-    assert(ret >= 0);
-    ret = H5Sclose(sid_dset);
-    assert(ret >= 0);
-    ret = H5Fclose(fid);
-    assert(ret >= 0);
-}
-
-
-
-static void test_comps_vlen (const char * fname, const char *dset, const char *attr, int diff, int is_file_new)
-{
-    /* sub compound 2 */
-    typedef struct {       
-        int i2;
-        float f2;
-    } cmpd2_t;
-
-    /* top compound 1 */
-    typedef struct { 
-        int i1;
-        hvl_t vl;   /* VL information for compound2 */
-    } cmpd1_t;
-
-    cmpd1_t wdata[SDIM_DSET];   /* Dataset for compound1 */ 
-
-    hid_t  fid;  /* HDF5 File ID */
-    hid_t  did_dset; /* dataset ID   */
-    hid_t  sid_dset;  /* dataset space ID */
-    hid_t  tid_attr;
-    hid_t  tid_cmpd2; /* compound2 type ID */
-    hid_t  tid_cmpd1; /* compound1 type ID */
-    hid_t  tid_cmpd1_vlen;
-    hsize_t  sdims_dset[] = {SDIM_DSET};
-
-    unsigned       i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize VL data to write */
-    for(i=0; i<SDIM_DSET; i++)
-    {
-        wdata[i].i1 = i;
-        wdata[i].vl.p = HDmalloc((i+1)*sizeof(cmpd2_t));
-        wdata[i].vl.len = i+1;
-        for(j=0; j<(i+1); j++)
-        {
-            ((cmpd2_t *)wdata[i].vl.p)[j].i2 = i*10 + diff;
-            ((cmpd2_t *)wdata[i].vl.p)[j].f2 = (float)(i*10.5F) + diff;
-        } /* end for */
-    } /* end for */
-
-    /*-----------------------------------------------------------------------
-     * Create file(s)
-     *------------------------------------------------------------------------*/
-    if (is_file_new == 1)
-        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    else
-        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
-
-    /* -----------------------------
-     * Create sub compound2 type */
-    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
-
-    /* Insert fields */
-    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
-    assert(ret >= 0);
-    ret = H5Tinsert(tid_cmpd2, "float2", HOFFSET(cmpd2_t, f2), H5T_NATIVE_FLOAT);
-    assert(ret >= 0);
-
-    /* ---------------------------
-     * Create top compound1 type */
-    tid_cmpd1 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd1_t));
-    /* Insert fields */
-    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
-    assert(ret >= 0);
-    /* Create a VL datatype */
-    tid_cmpd1_vlen = H5Tvlen_create(tid_cmpd2);
-
-    ret = H5Tinsert(tid_cmpd1, "vlen_cmpd1", HOFFSET(cmpd1_t, vl), tid_cmpd1_vlen);
-    assert(ret >= 0);
-
-    /* -------------------------------
-     * Create dataset with compound1 
-     */
-    /* Create dataspace for dataset */
-    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
-
-    /* Create a dataset */
-    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /*-----------------------------------
-     * Create an attribute in root group
-     */
-    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
-    assert(tid_attr > 0);
-    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
-    assert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /* ----------------
-     * Close IDs */
-    ret = H5Aclose(tid_attr);
-    assert(ret >= 0);
-    ret = H5Dclose(did_dset);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1);
-    assert(ret >= 0);
-    ret = H5Sclose(sid_dset);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1_vlen);
-    assert(ret >= 0);
-    ret = H5Fclose(fid);
-    assert(ret >= 0);
-}
-
-
-static void test_comps_array_vlen (const char * fname, const char *dset,const char *attr, int diff, int is_file_new)
-{
-    typedef struct {       
-        int i3;
-        float f3;
-    } cmpd3_t;
- 
-    typedef struct {        /* Typedef for compound datatype */
-        int i2;
-        hvl_t vl;   /* VL information to write */
-    } cmpd2_t;
-
-    typedef struct {
-        int i1;
-        cmpd2_t cmpd2[SDIM_CMPD_ARRAY];
-    } cmpd1_t;
-
-    cmpd1_t wdata[SDIM_DSET];   /* Information to write */
-    hid_t  fid;  /* HDF5 File IDs  */
-    hid_t  did_dset; /* Dataset ID   */
-    hid_t  sid_dset;       /* Dataspace ID   */
-    hid_t  tid_attr;
-    hid_t  tid_cmpd1;       /* Compound1 Datatype ID   */
-    hid_t  tid_arry1;       /* Array Datatype ID   */
-    hid_t  tid_cmpd2;       /* Compound2 Datatype ID   */
-    hid_t  tid_cmpd2_vlen;
-    hid_t  tid_cmpd3;       /* Compound3 Datatype ID   */
-    hsize_t  sdims_dset[] = {SDIM_DSET};
-    hsize_t  sdims_arry[] = {SDIM_CMPD_ARRAY};
-    int        i,j,k;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-
-
-    /* Initialize array data to write in compound1 */
-    for(i=0; i < SDIM_DSET; i++)
-    {
-        wdata[i].i1 = i;
-        /* Allocate and initialize VL data to write in compound2 */
-        for(j=0; j < SDIM_CMPD_ARRAY; j++) 
-        {
-            wdata[i].cmpd2[j].i2 = j*10;
-            wdata[i].cmpd2[j].vl.p = HDmalloc((j+1)*sizeof(cmpd3_t));
-            wdata[i].cmpd2[j].vl.len = j+1;
-            for(k=0; k<(j+1); k++) 
-            {
-                /* Initialize data of compound3 */
-                ((cmpd3_t *)wdata[i].cmpd2[j].vl.p)[k].i3 = j*10 + diff;
-                ((cmpd3_t *)wdata[i].cmpd2[j].vl.p)[k].f3 = (float)(j*10.5F) + diff;
-            } /* end for */
-        } /* end for */
-    }
-
-    /*-----------------------------------------------------------------------
-     * Create file(s)
-     *------------------------------------------------------------------------*/
-    if (is_file_new == 1)
-        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    else
-        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
-
-    /*-------------------------------------
-     * Create a sub compound3 datatype  */
-    tid_cmpd3 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd3_t));
-
-    /* Insert integer field */
-    ret = H5Tinsert(tid_cmpd3, "int", HOFFSET(cmpd3_t, i3), H5T_NATIVE_INT);
-    assert(ret >= 0);
-
-    /* Insert float field */
-    ret = H5Tinsert(tid_cmpd3, "float", HOFFSET(cmpd3_t, f3), H5T_NATIVE_FLOAT);
-    assert(ret >= 0);
-
-
-    /*-------------------------------------
-     * Create a sub compound2 datatype  */
-    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
-
-    /* Insert integer field */
-    ret = H5Tinsert(tid_cmpd2, "int", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
-    assert(ret >= 0);
-    /* Create a VL datatype */
-    tid_cmpd2_vlen = H5Tvlen_create(tid_cmpd3);
-    ret = H5Tinsert(tid_cmpd2, "vlen", HOFFSET(cmpd2_t, vl), tid_cmpd2_vlen);
-    assert(ret >= 0);
-
-
-    /*-----------------------------------
-     * Create a top compound1 datatype for dataset.
-     */
-    tid_cmpd1 = H5Tcreate (H5T_COMPOUND, sizeof(cmpd1_t));
-
-    /* Create an array datatype */
-    tid_arry1 = H5Tarray_create2(tid_cmpd2, 1, sdims_arry);
-    /* insert the array */
-    H5Tinsert(tid_cmpd1, "array_comp", HOFFSET(cmpd1_t, cmpd2), tid_arry1);
-
-
-    /* ----------------------
-     * Create a dataset */
-    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /*-----------------------------------
-     * Create an attribute in root group
-     */
-    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
-    assert(tid_attr > 0);
-    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
-    assert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /*-------------------
-     * Close IDs */
-    ret = H5Aclose(tid_attr);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_arry1);
-    assert(ret >= 0);
-    ret = H5Dclose(did_dset);
-    assert(ret >= 0);
-    ret = H5Sclose(sid_dset);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd3);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2_vlen);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1);
-    assert(ret >= 0);
-    ret = H5Fclose(fid);
-    assert(ret >= 0);
-}
-
-
-static void test_comps_vlen_arry (const char * fname, const char *dset, const char *attr, int diff, int is_file_new)
-{
-    /* sub compound 3 */
-    typedef struct {       
-        int i3;
-        float f3;
-    } cmpd3_t;
-
-    /* sub compound 2 */
-    typedef struct {       
-        int i2;
-        cmpd3_t cmpd3[SDIM_CMPD_ARRAY];
-    } cmpd2_t;
-
-    /* top compound 1 */
-    typedef struct { 
-        int i1;
-        hvl_t vl;   /* VL information for compound2 */
-    } cmpd1_t;
-
-    cmpd1_t wdata[SDIM_DSET];   /* Dataset for compound1 */
-
-    hid_t  fid;  /* HDF5 File ID */
-    hid_t  did_dset; /* dataset ID   */
-    hid_t  sid_dset;  /* dataset space ID */
-    hid_t  tid_attr;
-    hid_t  tid_cmpd3; /* compound3 type ID */
-    hid_t  tid_cmpd2; /* compound2 type ID */
-    hid_t  tid_cmpd2_arry;
-    hid_t  tid_cmpd1; /* compound1 type ID */
-    hid_t  tid_cmpd1_vlen;
-    hsize_t  sdims_dset[] = {SDIM_DSET};
-    hsize_t  sdims_cmpd_arry[] = {SDIM_CMPD_ARRAY};
-
-    unsigned       i,j,k;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize VL data to write */
-    for(i=0; i<SDIM_DSET; i++)
-    {
-        /* compound 1 data */
-        wdata[i].i1 = i;
-        wdata[i].vl.p = HDmalloc((i+1)*sizeof(cmpd2_t));
-        wdata[i].vl.len = i+1;
-        for(j=0; j<(i+1); j++)
-        {
-            /* compound2 data */
-            ((cmpd2_t *)wdata[i].vl.p)[j].i2 = i*10 + diff;
-            for (k=0; k < SDIM_CMPD_ARRAY; k++)
-            {
-                /* compound 3 data */
-                ((cmpd2_t *)(wdata[i].vl.p))[j].cmpd3[k].i3 = k*10.5F + diff;
-                ((cmpd2_t *)(wdata[i].vl.p))[j].cmpd3[k].f3 = (float)(k*10.5F) + diff;
-            }
-        } /* end for */
-    } /* end for */
-
-    /*-----------------------------------------------------------------------
-     * Create file(s)
-     *------------------------------------------------------------------------*/
-    if (is_file_new == 1)
-        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    else
-        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
-
-    /* -----------------------------
-     * Create sub compound3 type */
-    tid_cmpd3 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd3_t));
-
-    /* Insert fields */
-    ret = H5Tinsert(tid_cmpd3, "int3", HOFFSET(cmpd3_t, i3), H5T_NATIVE_INT);
-    assert(ret >= 0);
-    ret = H5Tinsert(tid_cmpd3, "float3", HOFFSET(cmpd3_t, f3), H5T_NATIVE_FLOAT);
-    assert(ret >= 0);
-
-    /* -----------------------------
-     * Create sub compound2 type */
-    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
-
-    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
-    assert(ret >= 0);
-
-    tid_cmpd2_arry = H5Tarray_create2(tid_cmpd3, 1, sdims_cmpd_arry);
-    ret = H5Tinsert(tid_cmpd2, "array_cmpd2", HOFFSET(cmpd2_t, cmpd3), tid_cmpd2_arry);
-    assert(ret >= 0);
-
-    /* ---------------------------
-     * Create top compound1 type
-     */
-    /* Create a VL datatype */
-    tid_cmpd1 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd1_t));
-    /* Insert fields */
-    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
-    assert(ret >= 0);
-    tid_cmpd1_vlen = H5Tvlen_create(tid_cmpd2);
-    ret = H5Tinsert(tid_cmpd1, "vlen_cmpd1", HOFFSET(cmpd1_t, vl), tid_cmpd1_vlen);
-    assert(ret >= 0);
-
-    /* -------------------------------
-     * Create dataset with compound1 
-     */
-    /* Create dataspace for dataset */
-    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
-
-    /* Create a dataset */
-    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /*-----------------------------------
-     * Create an attribute in root group
-     */
-    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
-    assert(tid_attr > 0);
-    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
-    assert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
-    assert(ret >= 0);
-
-    /* ----------------
-     * Close IDs */
-    ret = H5Aclose(tid_attr);
-    assert(ret >= 0);
-    ret = H5Dclose(did_dset);
-    assert(ret >= 0);
-    ret = H5Sclose(sid_dset);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd3);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2_arry);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd2);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1_vlen);
-    assert(ret >= 0);
-    ret = H5Tclose(tid_cmpd1);
-    assert(ret >= 0);
-    ret = H5Fclose(fid);
-    assert(ret >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: test_data_nocomparables
-*
-* Purpose: 
-*   Create test files with non-comparable dataset and attributes with 
-*   comparable datasets and attributes.  All the comparables should display 
-*   differences.
-*
-*-------------------------------------------------------------------------*/
-#define DIM_ARRY 3
-static void test_data_nocomparables (const char * fname, int make_diffs)
-{
-    hid_t   fid=0;
-    hid_t   gid1=0;
-    hid_t   gid2=0;
-    hid_t   did1=0;
-    hid_t   did2=0;
-    hid_t   sid1=0;
-    hid_t   tid_dset1=0;
-    hid_t   tid_attr1=0;
-    hsize_t dims1_1[1] = {DIM_ARRY};
-    hsize_t dims1_2[1] = {DIM_ARRY+1};
-    hsize_t dims2[2] = {DIM_ARRY, 1};
-    int data1[DIM_ARRY] = {0,0,0};
-    int data2[DIM_ARRY] = {1,1,1};
-    int data3[DIM_ARRY+1] = {1,1,1,1};
-    int data1_dim2[DIM_ARRY][1] = {{0},{0},{0}};
-    int rank_attr;
-    char data1_str[DIM_ARRY][STR_SIZE]= {"ab","cd","ef"};
-    herr_t  status = SUCCEED;
-    void *dset_data_ptr1=NULL;
-    void *dset_data_ptr2=NULL;
-    void *dset_data_ptr3=NULL;
-    void *attr_data_ptr1=NULL;
-    void *attr_data_ptr2=NULL;
-    void *attr_data_ptr3=NULL;
-    void *attr_data_ptr4=NULL;
-    void *attr2_dim_ptr=NULL;
-    void *attr3_dim_ptr=NULL;
-
-    /* init */
-    tid_dset1=H5Tcopy(H5T_NATIVE_INT);
-    dset_data_ptr1=(int*)&data1;
-    dset_data_ptr2=(int*)&data1;
-    dset_data_ptr3=(int*)&data1;
-    tid_attr1=H5Tcopy(H5T_NATIVE_INT);
-    attr_data_ptr1=(int*)&data1;
-    attr_data_ptr3=(int*)&data1;
-    attr_data_ptr4=(int*)&data1;
-    attr2_dim_ptr=(hsize_t*)&dims1_1;
-    attr3_dim_ptr=(hsize_t*)&dims1_1;
-    rank_attr=1;
-
-    if (make_diffs)
-    {
-        /* ------------
-         * group1 */
-        tid_dset1=H5Tcopy(H5T_C_S1);
-        H5Tset_size(tid_dset1, (size_t)STR_SIZE);
-        dset_data_ptr1=(char*)&data1_str;
-        dset_data_ptr2=(int*)&data2;
-        attr_data_ptr1=(int*)&data2;
-
-        /* ----------- 
-         * group2 
-         */
-        dset_data_ptr3=(int*)&data2;
-        /* dset1/attr1 */
-        tid_attr1=H5Tcopy(H5T_C_S1);
-        H5Tset_size(tid_attr1, (size_t)STR_SIZE);
-        attr_data_ptr2=(char*)&data1_str;
-
-        /* dset1/attr2 */
-        attr2_dim_ptr=(hsize_t*)&dims1_2;
-
-        /* dset1/attr3 */
-        attr_data_ptr3=(int*)&data1_dim2;
-        attr3_dim_ptr=(hsize_t*)&dims2;
-        rank_attr=2;
-
-        /* dset1/attr4 */
-        attr_data_ptr4=(int*)&data2;
-
-    }
-
-
-   /*-----------------------------------------------------------------------
-    * Create file(s)
-    *------------------------------------------------------------------------*/
-    fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Groups
-    *------------------------------------------------------------------------*/
-    gid1 = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2 = H5Gcreate2(fid, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets in /g1
-    *------------------------------------------------------------------------*/
-    if((sid1 = H5Screate_simple(1, dims1_1, NULL)) < 0)
-         goto out;
-
-    /*  dset1 */
-    if((did1 = H5Dcreate2(gid1, "dset1", tid_dset1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", "dset1");
-        status = FAIL;
-        goto out;
-    }
-
-    if(H5Dwrite(did1, tid_dset1, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data_ptr1) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", "dset1");
-        status = FAIL;
-        goto out;
-    }
-    write_attr(did1,1,dims1_1,"attr", H5T_NATIVE_INT, attr_data_ptr1);
-
-    /*  dset2 */
-    status = write_dset(gid1, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname);
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * Datasets in /g2
-    *------------------------------------------------------------------------*/
-    /* ---------
-     *  dset1 */
-    if((did2 = H5Dcreate2(gid2, "dset1", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", "dset1");
-        status = FAIL;
-        goto out;
-    }
-
-    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data_ptr3) < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", "dset1");
-        status = FAIL;
-        goto out;
-    }
-    /* attr1 - non-compatible : different type */
-    write_attr(did2,1,dims1_1,"attr1", tid_attr1, attr_data_ptr2);
-
-
-    /* attr2 - non-compatible : same rank, different dimention */
-    write_attr(did2,1,(hsize_t *)attr2_dim_ptr,"attr2", H5T_NATIVE_INT, data3);
-
-    /* attr3 - non-compatible : different rank */
-    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);
-
-    /*----------
-     * dset2 */
-    status = write_dset(gid2, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr3);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname);
-        goto out;
-    }
-
-    
-
-out:
-    
-    /*-----------------------------------------------------------------------
-    * Close IDs
-    *-----------------------------------------------------------------------*/
-    if(fid)
-        H5Fclose(fid);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-    if(did1)
-        H5Dclose(did1);
-    if(did2)
-        H5Dclose(did2);
-    if(sid1)
-        H5Sclose(sid1);
-    if(tid_dset1)
-        H5Tclose(tid_dset1);
-    if(tid_attr1)
-        H5Tclose(tid_attr1);
-}
-
-/*-------------------------------------------------------------------------
-* Function: test_objs_nocomparables
-*
-* Purpose: 
-*   Create test files with common objects (same name) but different object
-*   types. 
-*   h5diff should show non-comparable output from these common objects.
-*-------------------------------------------------------------------------*/
-static void test_objs_nocomparables(const char *fname1, const char *fname2)
-{
-    herr_t  status = SUCCEED;
-    hid_t   fid1=0;
-    hid_t   fid2=0;
-    hid_t   topgid1=0;
-    hid_t   topgid2=0;
-    hid_t   gid1=0;
-    hid_t   did1=0;
-    hid_t   tid1=0;
-    hid_t   gid2=0;
-    hid_t   did2=0;
-    hid_t   tid2=0;
-    hsize_t dims[1] = {DIM_ARRY};
-    int data1[DIM_ARRY] = {1,1,1};
-    int data2[DIM_ARRY] = {2,2,2};
-
-   /*-----------------------------------------------------------------------
-    * Open file(s) to add objects
-    *------------------------------------------------------------------------*/
-    /* file1 */
-    fid1 = H5Fopen (fname1, H5F_ACC_RDWR, H5P_DEFAULT);
-    if (fid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* file2 */
-    fid2 = H5Fopen (fname2, H5F_ACC_RDWR, H5P_DEFAULT);
-    if (fid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * in file1 : add member objects
-    *------------------------------------------------------------------------*/
-    /* parent group */
-    topgid1 = H5Gcreate2(fid1, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (topgid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* dataset */
-    status = write_dset(topgid1, 1, dims,"obj1", H5T_NATIVE_INT, data1);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
-        goto out;
-    }
-
-    /* group */
-    gid1 = H5Gcreate2(topgid1, "obj2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* committed type */
-    tid1 = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(topgid1, "obj3", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname1);
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-    * in file2 : add member objects
-    *------------------------------------------------------------------------*/
-    /* parent group */
-    topgid2 = H5Gcreate2(fid2, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (topgid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /* group */
-    gid2 = H5Gcreate2(topgid2, "obj1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
-        status = FAIL;
-        goto out;
-    }
-
-    /* committed type */
-    tid2 = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(topgid2, "obj2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname2);
-        goto out;
-    }
-
-    /* dataset */
-    status = write_dset(topgid2, 1, dims,"obj3", H5T_NATIVE_INT, data2);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
-        goto out;
-    }
-
-out:
-    /*-----------------------------------------------------------------------
-    * Close IDs
-    *-----------------------------------------------------------------------*/
-    if(fid1)
-        H5Fclose(fid1);
-    if(fid2)
-        H5Fclose(fid2);
-    if(topgid1)
-        H5Gclose(topgid1);
-    if(topgid2)
-        H5Gclose(topgid2);
-    if(did1)
-        H5Dclose(did1);
-    if(did2)
-        H5Dclose(did2);
-    if(gid1)
-        H5Gclose(gid1);
-    if(gid2)
-        H5Gclose(gid2);
-    if(tid1)
-        H5Tclose(tid1);
-    if(tid2)
-        H5Tclose(tid2);
-
-}
-
-/*-------------------------------------------------------------------------
-* Function: write_attr_in
-*
-* Purpose: write attributes in LOC_ID (dataset, group, named datatype)
-*
-*-------------------------------------------------------------------------
-*/
-static
-void write_attr_in(hid_t loc_id,
-                   const char* dset_name, /* for saving reference to dataset*/
-                   hid_t fid,
-                   int make_diffs /* flag to modify data buffers */)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-        char   a;
-        double b;
-    } s_t;
-
-    typedef enum
-    {
-        RED,
-        GREEN
-    } e_t;
-
-    hid_t   aid;
-    hid_t   sid;
-    hid_t   tid;
-    herr_t  status;
-    int     val, i, j, k, l, n;
-    float   f;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    char       buf1[2][STR_SIZE]= {"ab","de"};        /* string */
-    char       *buf1a[2];                             /* VL string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2.0F},{3,4.0F}};         /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    e_t        buf45[2]= {RED,RED};            /* enum */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1.0F, 2.0F};                 /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    char       buf12[3][2][STR_SIZE]= {{"ab","cd"},{"ef","gh"},{"ij","kl"}};            /* string */
-    char       *buf12a[3][2];                                                           /* VL string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                                        /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2.0F},{3,4.0F},{5,6.0F},{7,8.0F},{9,10.0F},{11,12.0F}};    /* compound */
-    hobj_ref_t buf42[3][2];                                                             /* reference */
-    e_t        buf452[3][2];                                                            /* enum */
-    hvl_t      buf52[3][2];                                                             /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                                        /* integer */
-    float      buf82[3][2]= {{1.0F,2.0F},{3.0F,4.0F},{5.0F,6.0F}};                      /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    char       buf13[4][3][2][STR_SIZE]= {{{"ab","cd"},{"ef","gh"},{"ij","kl"}},
-    {{"mn","pq"},{"rs","tu"},{"vw","xz"}},
-    {{"AB","CD"},{"EF","GH"},{"IJ","KL"}},
-    {{"MN","PQ"},{"RS","TU"},{"VW","XZ"}}};  /* string */
-    char       *buf13a[4][3][2];   /* VL string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[4][3][2];    /* reference */
-    e_t        buf453[4][3][2];   /* enum */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-    * 1D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            for (j=0; j<2; j++)
-            {
-                buf1[i][j]='z';
-            }
-        }
-    }
-    /*
-    buf1[2][2]= {"ab","de"};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <string> and <string>
-    position      string of </g1>  string of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          a                z
-    [ 0 ]          b                z
-    [ 1 ]          d                z
-    [ 1 ]          e                z
-    */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, (size_t)STR_SIZE);
-    write_attr(loc_id,1,dims,"string",tid,buf1);
-    status = H5Tclose(tid);
-
-    for (i=0; i<2; i++)
-        buf1a[i]=buf1[i];
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_attr(loc_id,1,dims,"VLstring",tid,buf1a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            buf2[i]=buf2[1]=0;
-    }
-    /*
-    buf2[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <bitfield> and <bitfield>
-    position      bitfield of </g1> bitfield of </g1> difference
-    position        opaque of </g1> opaque of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,1,dims,"bitfield",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    /*
-    buf2[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <opaque> and <opaque>
-    position     opaque of </g1> opaque of </g1> difference
-    position        opaque of </g1> opaque of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,1,dims,"opaque",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf3[i].a=0; buf3[i].b=0;
-        }
-    }
-
-    /*
-    buf3[2]= {{1,2},{3,4}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <compound> and <compound>
-    position        compound of </g1> compound of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               5               4
-    [ 0 ]          2               5               3
-    [ 1 ]          3               5               2
-    [ 1 ]          4               5               1
-    */
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,1,dims,"compound",tid,buf3);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        write_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf45[i]=GREEN;
-        }
-    }
-    /*
-    buf45[2]= {RED,RED};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <enum> and <enum>
-    position     enum of </g1>   enum of </g1>   difference
-    ------------------------------------------------------------
-    [ 0 ]          RED              GREEN
-    [ 1 ]          RED              GREEN
-    */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,1,dims,"enum",tid,buf45);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf5[0].p)[0]=1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc( 2 * sizeof(int));
-    ((int *)buf5[1].p)[0]=2;
-    ((int *)buf5[1].p)[1]=3;
-
-    if (make_diffs)
-    {
-        ((int *)buf5[0].p)[0]=0;
-        ((int *)buf5[1].p)[0]=0;
-        ((int *)buf5[1].p)[1]=0;
-    }
-    /*
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    position        vlen of </g1>   vlen of </g1>   difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    [ 1 ]          3               0               3
-    */
-
-    sid = H5Screate_simple(1, dims, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf5);
-    assert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
-    assert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<3; j++)
-            {
-                buf6[i][j]=0;
-            }
-    }
-    /*
-    buf6[2][3]= {{1,2,3},{4,5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <array> and <array>
-    position        array of </g1>  array of </g1>  difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 0 ]          2               0               2
-    [ 0 ]          3               0               3
-    [ 1 ]          4               0               4
-    [ 1 ]          5               0               5
-    [ 1 ]          6               0               6
-    */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 1, dims, "array", tid, buf6);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf7[i]=0;
-            buf8[i]=0;
-        }
-    }
-    /*
-    buf7[2]= {1,2};
-    buf8[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    position        integer of </g1> integer of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    position        float of </g1>  float of </g1>  difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-    write_attr(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
-    write_attr(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
-
-
-    /*-------------------------------------------------------------------------
-    * 2D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        for (i=0; i<3; i++)
-            for (j=0; j<2; j++)
-                for (k=0; k<2; k++)
-                    buf12[i][j][k]='z';
-    }
-
-    /*
-    buf12[6][2]= {"ab","cd","ef","gh","ij","kl"};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <string2D> and <string2D>
-    position        string2D of </g1> string2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          a                z
-    [ 0 0 ]          b                z
-    [ 0 1 ]          c                z
-    [ 0 1 ]          d                z
-    [ 1 0 ]          e                z
-    [ 1 0 ]          f                z
-    [ 1 1 ]          g                z
-    [ 1 1 ]          h                z
-    [ 2 0 ]          i                z
-    [ 2 0 ]          j                z
-    [ 2 1 ]          k                z
-    [ 2 1 ]          l                z
-    */
-
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, (size_t)STR_SIZE);
-    write_attr(loc_id,2,dims2,"string2D",tid,buf12);
-    status = H5Tclose(tid);
-
-    for (i=0; i<3; i++)
-    {
-        for (j=0; j<2; j++)
-        {
-
-            buf12a[i][j]=buf12[i][j];
-        }
-    }
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_attr(loc_id,2,dims2,"VLstring2D",tid,buf12a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        memset(buf22,0,sizeof buf22);
-    }
-
-    /*
-    buf22[3][2]= {{1,2},{3,4},{5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <bitfield2D> and <bitfield2D>
-    position        bitfield2D of </g1> bitfield2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,2,dims2,"bitfield2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    /*
-    buf22[3][2]= {{1,2},{3,4},{5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <opaque2D> and <opaque2D>
-    position        opaque2D of </g1> opaque2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,2,dims2,"opaque2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        memset(buf32,0,sizeof buf32);
-    }
-
-    /*
-    buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <opaque2D> and <opaque2D>
-    position        opaque2D of </g1> opaque2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,2,dims2,"compound2D",tid,buf32);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 3; i++) {
-            for (j = 0; j < 2; j++) {
-                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    for (i=0; i<3; i++)
-    {
-        for (j=0; j<2; j++)
-        {
-            if (make_diffs) buf452[i][j]=GREEN; else buf452[i][j]=RED;
-        }
-    }
-
-    /*
-    Attribute:   <enum2D> and <enum2D>
-    position        enum2D of </g1> enum2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          RED              GREEN
-    [ 0 1 ]          RED              GREEN
-    [ 1 0 ]          RED              GREEN
-    [ 1 1 ]          RED              GREEN
-    [ 2 0 ]          RED              GREEN
-    [ 2 1 ]          RED              GREEN
-    */
-
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,2,dims2,"enum2D",tid,buf452);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for (i = 0; i < 3; i++) {
-        for (j = 0; j < 2; j++) {
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = i + 1;
-            for (l = 0; l < i + 1; l++)
-                if (make_diffs)((int *)buf52[i][j].p)[l] = 0;
-                else ((int *)buf52[i][j].p)[l] = n++;
-        }
-    }
-
-    /*
-    position        vlen2D of </g1> vlen2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 1 ]          1               0               1
-    [ 1 0 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 1 1 ]          5               0               5
-    [ 2 0 ]          6               0               6
-    [ 2 0 ]          7               0               7
-    [ 2 0 ]          8               0               8
-    [ 2 1 ]          9               0               9
-    [ 2 1 ]          10              0               10
-    [ 2 1 ]          11              0               11
-    */
-
-    sid = H5Screate_simple(2, dims2, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf52);
-    assert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
-    assert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        memset(buf62,0,sizeof buf62);
-    }
-    /*
-    buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <array2D> and <array2D>
-    position        array2D of </g1> array2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 0 ]          2               0               2
-    [ 0 0 ]          3               0               3
-    [ 0 1 ]          4               0               4
-    [ 0 1 ]          5               0               5
-    [ 0 1 ]          6               0               6
-    [ 1 0 ]          7               0               7
-    [ 1 0 ]          8               0               8
-    [ 1 0 ]          9               0               9
-    [ 1 1 ]          10              0               10
-    [ 1 1 ]          11              0               11
-    [ 1 1 ]          12              0               12
-    [ 2 0 ]          13              0               13
-    [ 2 0 ]          14              0               14
-    [ 2 0 ]          15              0               15
-    [ 2 1 ]          16              0               16
-    [ 2 1 ]          17              0               17
-    [ 2 1 ]          18              0               18
-    */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 2, dims2, "array2D", tid, buf62);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        memset(buf72,0,sizeof buf72);
-        memset(buf82,0,sizeof buf82);
-    }
-    /*
-    Attribute:   <integer2D> and <integer2D>
-    position        integer2D of </g1> integer2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    6 differences found
-    Attribute:   <float2D> and <float2D>
-    position        float2D of </g1> float2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-    write_attr(loc_id,2,dims2,"integer2D",H5T_NATIVE_INT,buf72);
-    write_attr(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
-
-
-    /*-------------------------------------------------------------------------
-    * 3D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<4; i++)
-            for (j=0; j<3; j++)
-                for (k=0; k<2; k++)
-                    for (l=0; l<2; l++)
-                        buf13[i][j][k][l]='z';
-    }
-
-    /*
-    buf13[24][2]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-    "rs","tu","vw","xz","AB","CD","EF","GH",
-    "IJ","KL","MN","PQ","RS","TU","VW","XZ"};
-
-    Attribute:   <string3D> and <string3D>
-    position        string3D of </g1> string3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          a                z
-    [ 0 0 0 ]          b                z
-    [ 0 0 1 ]          c                z
-    [ 0 0 1 ]          d                z
-    [ 0 1 0 ]          e                z
-    [ 0 1 0 ]          f                z
-    [ 0 1 1 ]          g                z
-    [ 0 1 1 ]          h                z
-    [ 0 2 0 ]          i                z
-    [ 0 2 0 ]          j                z
-    [ 0 2 1 ]          k                z
-    [ 0 2 1 ]          l                z
-    [ 1 0 0 ]          m                z
-    [ 1 0 0 ]          n                z
-    [ 1 0 1 ]          p                z
-    [ 1 0 1 ]          q                z
-    [ 1 1 0 ]          r                z
-    [ 1 1 0 ]          s                z
-    [ 1 1 1 ]          t                z
-    [ 1 1 1 ]          u                z
-    [ 1 2 0 ]          v                z
-    [ 1 2 0 ]          w                z
-    [ 1 2 1 ]          x                z
-    [ 2 0 0 ]          A                z
-    [ 2 0 0 ]          B                z
-    [ 2 0 1 ]          C                z
-    [ 2 0 1 ]          D                z
-    [ 2 1 0 ]          E                z
-    [ 2 1 0 ]          F                z
-    [ 2 1 1 ]          G                z
-    [ 2 1 1 ]          H                z
-    [ 2 2 0 ]          I                z
-    [ 2 2 0 ]          J                z
-    [ 2 2 1 ]          K                z
-    [ 2 2 1 ]          L                z
-    [ 3 0 0 ]          M                z
-    [ 3 0 0 ]          N                z
-    [ 3 0 1 ]          P                z
-    [ 3 0 1 ]          Q                z
-    [ 3 1 0 ]          R                z
-    [ 3 1 0 ]          S                z
-    [ 3 1 1 ]          T                z
-    [ 3 1 1 ]          U                z
-    [ 3 2 0 ]          V                z
-    [ 3 2 0 ]          W                z
-    [ 3 2 1 ]          X                z
-    [ 3 2 1 ]          Z                z
-    */
-
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, (size_t)STR_SIZE);
-    write_attr(loc_id,3,dims3,"string3D",tid,buf13);
-    status = H5Tclose(tid);
-
-    for (i=0; i<4; i++)
-    {
-        for (j=0; j<3; j++)
-        {
-            for (k=0; k<2; k++)
-            {
-                buf13a[i][j][k]=buf13[i][j][k];
-            }
-        }
-    }
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_attr(loc_id,3,dims3,"VLstring3D",tid,buf13a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) buf23[i][j][k]=0;
-                else buf23[i][j][k]=n++;
-            }
-        }
-    }
-
-    /*
-    position        bitfield3D of </g1> bitfield3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 1 ]          2               0               2
-    [ 0 1 0 ]          3               0               3
-    [ 0 1 1 ]          4               0               4
-    [ 0 2 0 ]          5               0               5
-    [ 0 2 1 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 1 0 ]          9               0               9
-    [ 1 1 1 ]          10              0               10
-    [ 1 2 0 ]          11              0               11
-    [ 1 2 1 ]          12              0               12
-    [ 2 0 0 ]          13              0               13
-    [ 2 0 1 ]          14              0               14
-    [ 2 1 0 ]          15              0               15
-    [ 2 1 1 ]          16              0               16
-    [ 2 2 0 ]          17              0               17
-    [ 2 2 1 ]          18              0               18
-    [ 3 0 0 ]          19              0               19
-    [ 3 0 1 ]          20              0               20
-    [ 3 1 0 ]          21              0               21
-    [ 3 1 1 ]          22              0               22
-    [ 3 2 0 ]          23              0               23
-    [ 3 2 1 ]          24              0               24
-    */
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,3,dims3,"bitfield3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,3,dims3,"opaque3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) {
-                    buf33[i][j][k].a=0;
-                    buf33[i][j][k].b=0.0F;
-                }
-                else {
-                    buf33[i][j][k].a=n++;
-                    buf33[i][j][k].b=n++;
-                }
-            }
-        }
-    }
-    /*position        compound3D of </g1> compound3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 0 ]          2               0               2
-    [ 0 0 1 ]          3               0               3
-    [ 0 0 1 ]          4               0               4
-    [ 0 1 0 ]          5               0               5
-    [ 0 1 0 ]          6               0               6
-    [ 0 1 1 ]          7               0               7
-    [ 0 1 1 ]          8               0               8
-    [ 0 2 0 ]          9               0               9
-    [ 0 2 0 ]          10              0               10
-    [ 0 2 1 ]          11              0               11
-    [ 0 2 1 ]          12              0               12
-    [ 1 0 0 ]          13              0               13
-    [ 1 0 0 ]          14              0               14
-    [ 1 0 1 ]          15              0               15
-    [ 1 0 1 ]          16              0               16
-    [ 1 1 0 ]          17              0               17
-    [ 1 1 0 ]          18              0               18
-    [ 1 1 1 ]          19              0               19
-    [ 1 1 1 ]          20              0               20
-    [ 1 2 0 ]          21              0               21
-    [ 1 2 0 ]          22              0               22
-    [ 1 2 1 ]          23              0               23
-    [ 1 2 1 ]          24              0               24
-    [ 2 0 0 ]          25              0               25
-    [ 2 0 0 ]          26              0               26
-    [ 2 0 1 ]          27              0               27
-    [ 2 0 1 ]          28              0               28
-    [ 2 1 0 ]          29              0               29
-    [ 2 1 0 ]          30              0               30
-    [ 2 1 1 ]          31              0               31
-    [ 2 1 1 ]          32              0               32
-    [ 2 2 0 ]          33              0               33
-    [ 2 2 0 ]          34              0               34
-    [ 2 2 1 ]          35              0               35
-    [ 2 2 1 ]          36              0               36
-    [ 3 0 0 ]          37              0               37
-    [ 3 0 0 ]          38              0               38
-    [ 3 0 1 ]          39              0               39
-    [ 3 0 1 ]          40              0               40
-    [ 3 1 0 ]          41              0               41
-    [ 3 1 0 ]          42              0               42
-    [ 3 1 1 ]          43              0               43
-    [ 3 1 1 ]          44              0               44
-    [ 3 2 0 ]          45              0               45
-    [ 3 2 0 ]          46              0               46
-    [ 3 2 1 ]          47              0               47
-    [ 3 2 1 ]          48              0               48
-    */
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,3,dims3,"compound3D",tid,buf33);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 4; i++) {
-            for (j = 0; j < 3; j++) {
-                for (k = 0; k < 2; k++)
-                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) buf453[i][j][k]=RED; else buf453[i][j][k]=GREEN;
-            }
-        }
-    }
-
-    /*
-    position        enum3D of </g1> enum3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          GREEN            RED
-    [ 0 0 1 ]          GREEN            RED
-    [ 0 1 0 ]          GREEN            RED
-    [ 0 1 1 ]          GREEN            RED
-    [ 0 2 0 ]          GREEN            RED
-    [ 0 2 1 ]          GREEN            RED
-    [ 1 0 0 ]          GREEN            RED
-    [ 1 0 1 ]          GREEN            RED
-    [ 1 1 0 ]          GREEN            RED
-    [ 1 1 1 ]          GREEN            RED
-    [ 1 2 0 ]          GREEN            RED
-    [ 1 2 1 ]          GREEN            RED
-    [ 2 0 0 ]          GREEN            RED
-    [ 2 0 1 ]          GREEN            RED
-    [ 2 1 0 ]          GREEN            RED
-    [ 2 1 1 ]          GREEN            RED
-    [ 2 2 0 ]          GREEN            RED
-    [ 2 2 1 ]          GREEN            RED
-    [ 3 0 0 ]          GREEN            RED
-    [ 3 0 1 ]          GREEN            RED
-    [ 3 1 0 ]          GREEN            RED
-    [ 3 1 1 ]          GREEN            RED
-    [ 3 2 0 ]          GREEN            RED
-    [ 3 2 1 ]          GREEN            RED
-    */
-
-
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,3,dims3,"enum3D",tid,buf453);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = i + 1;
-                for (l = 0; l < i + 1; l++)
-                    if (make_diffs)((int *)buf53[i][j][k].p)[l] = 0;
-                    else ((int *)buf53[i][j][k].p)[l] = n++;
-            }
-        }
-    }
-    /*
-    position        vlen3D of </g1> vlen3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 1 ]          1               0               1
-    [ 0 1 0 ]          2               0               2
-    [ 0 1 1 ]          3               0               3
-    [ 0 2 0 ]          4               0               4
-    [ 0 2 1 ]          5               0               5
-    [ 1 0 0 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 0 1 ]          9               0               9
-    [ 1 1 0 ]          10              0               10
-    etc
-    */
-    sid = H5Screate_simple(3, dims3, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf53);
-    assert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
-    assert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-    n=1;
-    for (i = 0; i < 24; i++) {
-        for (j = 0; j < (int)dimarray[0]; j++) {
-            if (make_diffs) buf63[i][j]=0;
-            else buf63[i][j]=n++;
-        }
-    }
-    /*
-    position        array3D of </g1> array3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 0 ]          2               0               2
-    [ 0 0 0 ]          3               0               3
-    [ 0 0 1 ]          4               0               4
-    [ 0 0 1 ]          5               0               5
-    [ 0 0 1 ]          6               0               6
-    [ 0 1 0 ]          7               0               7
-    etc
-    */
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 3, dims3, "array3D", tid, buf63);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    n=1; f=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) {
-                    buf73[i][j][k]=0;
-                    buf83[i][j][k]=0.0F;
-                }
-                else {
-                    buf73[i][j][k]=n++;
-                    buf83[i][j][k]=f++;
-                }
-            }
-        }
-    }
-
-    /*
-    position        integer3D of </g1> integer3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 1 ]          2               0               2
-    [ 0 1 0 ]          3               0               3
-    [ 0 1 1 ]          4               0               4
-    [ 0 2 0 ]          5               0               5
-    [ 0 2 1 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 1 0 ]          9               0               9
-    [ 1 1 1 ]          10              0               10
-    etc
-    */
-    write_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
-    write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
-}
-
-
-
-/*-------------------------------------------------------------------------
-* Function: write_dset_in
-*
-* Purpose: write datasets in LOC_ID
-*
-*-------------------------------------------------------------------------
-*/
-static
-void write_dset_in(hid_t loc_id,
-                   const char* dset_name, /* for saving reference to dataset*/
-                   hid_t fid,
-                   int make_diffs /* flag to modify data buffers */)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-        char   a;
-        double b;
-    } s_t;
-
-    typedef enum
-    {
-        RED,
-        GREEN
-    } e_t;
-
-    hid_t   did;
-    hid_t   sid;
-    hid_t   tid;
-    hid_t   dcpl;
-    herr_t  status;
-    int     val, i, j, k, l, n;
-    float   f;
-    int     fillvalue=2;
-    int     scalar_data = 2;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    char       buf1[2][STR_SIZE]= {"ab","de"}; /* string */
-    char       *buf1a[2];                      /* VL string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2.0F},{3,4.0F}};   /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    e_t        buf45[2]= {RED,GREEN};          /* enum */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1.0F,2.0F};           /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    char       buf12[3][2][STR_SIZE]= {{"ab","cd"},{"ef","gh"},{"ij","kl"}};     /* string */
-    char       *buf12a[3][2];                                        /* VL string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2.0F},{3,4.0F},{5,6.0F},{7,8.0F},{9,10.0F},{11,12.0F}};   /* compound */
-    hobj_ref_t buf42[3][2];                                          /* reference */
-    hvl_t      buf52[3][2];                                          /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
-    float      buf82[3][2]= {{1.0F,2.0F},{3.0F,4.0F},{5.0F,6.0F}};                     /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    char       buf13[4][3][2][STR_SIZE]= {{{"ab","cd"},{"ef","gh"},{"ij","kl"}},
-    {{"mn","pq"},{"rs","tu"},{"vw","xz"}},
-    {{"AB","CD"},{"EF","GH"},{"IJ","KL"}},
-    {{"MN","PQ"},{"RS","TU"},{"VW","XZ"}}};  /* string */
-    char       *buf13a[4][3][2];  /* VL string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[4][3][2];    /* reference */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-    * H5S_SCALAR
-    *-------------------------------------------------------------------------
-    */
-
-
-
-    if ( make_diffs )
-    {
-
-        scalar_data = 1;
-    }
-
-    /* create a space  */
-    sid = H5Screate(H5S_SCALAR);
-
-    /* create a dataset */
-    did = H5Dcreate2(loc_id, "scalar", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* write */
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &scalar_data);
-
-    /* close */
-    H5Dclose(did);
-    H5Sclose(sid);
-
-
-    /*-------------------------------------------------------------------------
-    * 1D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<2; j++)
-                buf1[i][j]='z';
-    }
-
-
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid,(size_t)STR_SIZE);
-    write_dset(loc_id,1,dims,"string",tid,buf1);
-    status = H5Tclose(tid);
-
-    for (i=0; i<2; i++)
-    {
-        buf1a[i]=buf1[i];
-    }
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_dset(loc_id,1,dims,"VLstring",tid,buf1a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            buf2[i]=buf2[1]=0;
-    }
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,1,dims,"bitfield",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf3[i].a=0; buf3[i].b=0;
-        }
-    }
-
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,1,dims,"opaque",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf45[i]=GREEN;
-        }
-    }
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,1,dims,"compound",tid,buf3);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference)
-    *-------------------------------------------------------------------------
-    */
-
-    gen_datareg(fid,make_diffs);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,1,dims,"enum",tid,buf45);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf5[0].p)[0]=1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc( 2 * sizeof(int));
-    ((int *)buf5[1].p)[0]=2;
-    ((int *)buf5[1].p)[1]=3;
-
-    if(make_diffs) {
-        ((int *)buf5[0].p)[0] = 0;
-        ((int *)buf5[1].p)[0] = 0;
-        ((int *)buf5[1].p)[1]=0;
-    }
-
-    sid = H5Screate_simple(1, dims, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
-    HDassert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<3; j++)
-            {
-                buf6[i][j]=0;
-            }
-    }
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 1, dims, "array", tid, buf6);
-    status = H5Tclose(tid);
-
-    {
-
-        double  *dbuf;                           /* information to write */
-        hid_t   did;                             /* dataset ID   */
-        hid_t   sid;                             /* dataspace ID   */
-        hid_t   tid;                             /* datatype ID   */
-        size_t  size;
-        hsize_t sdims[] = {1};
-        hsize_t tdims[] = {H5TOOLS_MALLOCSIZE / sizeof(double) + 1};
-        int     j;
-
-        /* allocate and initialize array data to write */
-        size = ( H5TOOLS_MALLOCSIZE / sizeof(double) + 1 ) * sizeof(double);
-        dbuf = (double *)HDmalloc( size );
-
-        for( j = 0; j < H5TOOLS_MALLOCSIZE / sizeof(double) + 1; j++)
-            dbuf[j] = j;
-
-        if (make_diffs)
-        {
-            dbuf[5] = 0;
-            dbuf[6] = 0;
-        }
-
-        /* create a type larger than H5TOOLS_MALLOCSIZE */
-        tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, 1, tdims);
-        size = H5Tget_size(tid);
-        sid = H5Screate_simple(1, sdims, NULL);
-        did = H5Dcreate2(loc_id, "arrayd", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-#if defined(WRITE_ARRAY)
-        H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
-#endif
-
-        /* close */
-        H5Dclose(did);
-        H5Tclose(tid);
-        H5Sclose(sid);
-        HDfree( dbuf );
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf7[i]=0;
-            buf8[i]=0;
-        }
-    }
-
-    write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
-    write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
-
-
-    /*-------------------------------------------------------------------------
-    * 2D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<3; i++)
-            for (j=0; j<2; j++)
-                for (k=0; k<2; k++)
-                    buf12[i][j][k]='z';
-    }
-
-
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid,(size_t)STR_SIZE);
-    write_dset(loc_id,2,dims2,"string2D",tid,buf12);
-    status = H5Tclose(tid);
-
-    for (i=0; i<3; i++)
-    {
-        for (j=0; j<2; j++)
-        {
-            buf12a[i][j]=buf12[i][j];
-        }
-    }
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_dset(loc_id,2,dims2,"VLstring2D",tid,buf12a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        memset(buf22,0,sizeof buf22);
-    }
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        memset(buf32,0,sizeof buf32);
-    }
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 3; i++) {
-            for (j = 0; j < 2; j++) {
-                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,2,dims2,"enum2D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n = 0;
-    for(i = 0; i < 3; i++)
-    {
-        for(j = 0; j < 2; j++)
-        {
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = i + 1;
-            for(l = 0; l < i + 1; l++)
-            {
-                if (make_diffs)
-                    ((int *)buf52[i][j].p)[l] = 0;
-                else
-                    ((int *)buf52[i][j].p)[l] = n++;
-            }
-        }
-    }
-
-    sid = H5Screate_simple(2, dims2, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52);
-    assert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
-    assert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        memset(buf62,0,sizeof buf62);
-    }
-
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 2, dims2, "array2D", tid, buf62);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER, write a fill value
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        memset(buf72, 0, sizeof buf72);
-        memset(buf82, 0, sizeof buf82);
-    }
-
-
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue);
-    sid = H5Screate_simple(2, dims2, NULL);
-    did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
-    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72);
-    status = H5Pclose(dcpl);
-    status = H5Dclose(did);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
-
-
-    /*-------------------------------------------------------------------------
-    * 3D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<4; i++)
-            for (j=0; j<3; j++)
-                for (k=0; k<2; k++)
-                    for (l=0; l<2; l++)
-                        buf13[i][j][k][l]='z';
-    }
-
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid,(size_t)STR_SIZE);
-    write_dset(loc_id,3,dims3,"string3D",tid,buf13);
-    status = H5Tclose(tid);
-
-    for (i=0; i<4; i++)
-    {
-        for (j=0; j<3; j++)
-        {
-            for (k=0; k<2; k++)
-            {
-                buf13a[i][j][k]=buf13[i][j][k];
-            }
-        }
-    }
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, H5T_VARIABLE);
-    write_dset(loc_id,3,dims3,"VLstring3D",tid,buf13a);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-
-    n=1;
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                if (make_diffs)
-                    buf23[i][j][k]=0;
-                else buf23[i][j][k]=n++;
-            }
-        }
-    }
-
-
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                if (make_diffs)
-                {
-                    buf33[i][j][k].a=0;
-                    buf33[i][j][k].b=0.0F;
-                }
-                else {
-                    buf33[i][j][k].a=n++;
-                    buf33[i][j][k].b=n++;
-                }
-            }
-        }
-    }
-
-
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE (H5R_OBJECT object reference)
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 4; i++) {
-            for (j = 0; j < 3; j++) {
-                for (k = 0; k < 2; k++)
-                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,3,dims3,"enum3D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for(i = 0; i < 4; i++)
-    {
-        for(j = 0; j < 3; j++)
-        {
-            for(k = 0; k < 2; k++)
-            {
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = i + 1;
-                for(l = 0; l < i + 1; l++)
-                {
-                    if(make_diffs)
-                        ((int *)buf53[i][j][k].p)[l] = 0;
-                    else
-                        ((int *)buf53[i][j][k].p)[l] = n++;
-                }
-            }
-        }
-    }
-
-    sid = H5Screate_simple(3, dims3, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53);
-    assert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
-    assert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-
-    n=1;
-    for (i = 0; i < 24; i++) {
-        for (j = 0; j < (int)dimarray[0]; j++) {
-            if (make_diffs) buf63[i][j]=0;
-            else buf63[i][j]=n++;
-        }
-    }
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 3, dims3, "array3D", tid, buf63);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    n=1; f=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) {
-                    buf73[i][j][k]=0;
-                    buf83[i][j][k]=0.0F;
-                }
-                else {
-                    buf73[i][j][k]=n++;
-                    buf83[i][j][k]=f++;
-                }
-            }
-        }
-    }
-    write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
-    write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
-}
-
-/*-------------------------------------------------------------------------
-* Function: gen_datareg
-*
-* Purpose: generate a dataset region and its reference
-*
-* Date: April 19, 2006
-*
-*-------------------------------------------------------------------------
-*/
-
-static
-void gen_datareg(hid_t fid,
-                 int make_diffs /* flag to modify data buffers */)
-{
-    /* data dataset */
-    hid_t           did1;              /* dataset ID   */
-    hid_t           sid1;              /* dataspace ID  */
-    hsize_t         dims1[2] = {10,10};/* dimensions */
-    int             *buf;              /* dataset buffer */
-    /* reference dataset */
-    hid_t           did2;              /* dataset ID   */
-    hid_t           sid2;              /* dataspace ID  */
-    hsize_t         dims2[] = {2};     /* 2 references */
-    hdset_reg_ref_t *rbuf;             /* buffer for write the references  */
-    hsize_t         start[10];         /* starting location of hyperslab */
-    hsize_t         count[10];         /* element count of hyperslab */
-    hsize_t         coord[5][2];       /* coordinates for point selection */
-    herr_t          status;
-    int             i;
-
-    /* allocate the buffer for write the references */
-    rbuf = (hdset_reg_ref_t *)HDcalloc((size_t)2, sizeof(hdset_reg_ref_t));
-
-    /* allocate the buffer for write the data dataset */
-    buf = (int *)HDmalloc(10 * 10 * sizeof(int));
-
-    for(i = 0; i < 10 * 10; i++)
-        buf[i] = i;
-
-    /* create the data dataset */
-    sid1   = H5Screate_simple(2, dims1, NULL);
-    did1   = H5Dcreate2(fid, "dsetref", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-    HDassert(status >= 0);
-
-    /* create the reference dataset */
-    sid2   = H5Screate_simple(1, dims2, NULL);
-    did2   = H5Dcreate2(fid, "refreg", H5T_STD_REF_DSETREG, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* create the references */
-    /* select hyperslab for first reference */
-
-    start[0] = 2; start[1] = 2;
-    count[0] = 6; count[1] = 6;
-    if(make_diffs) {
-        start[0] = 0; start[1] = 0;
-        count[0] = 3; count[1] = 3;
-    }
-
-    status = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL);
-    HDassert(status >= 0);
-    H5Sget_select_npoints(sid1);
-
-    /* store first dataset region */
-    status = H5Rcreate(&rbuf[0], fid, "dsetref", H5R_DATASET_REGION, sid1);
-    HDassert(status >= 0);
-
-    /* select sequence of five points for second reference */
-    coord[0][0]=6; coord[0][1]=9;
-    coord[1][0]=2; coord[1][1]=2;
-    coord[2][0]=8; coord[2][1]=4;
-    coord[3][0]=1; coord[3][1]=6;
-    coord[4][0]=2; coord[4][1]=8;
-    if (make_diffs)
-    {
-        coord[1][0]=3; coord[1][1]=3;
-        coord[3][0]=2; coord[3][1]=5;
-        coord[4][0]=1; coord[4][1]=7;
-    }
-    H5Sselect_elements(sid1,H5S_SELECT_SET,(size_t)5,(const hsize_t *)coord);
-    H5Sget_select_npoints(sid1);
-
-    /* store second dataset region */
-    H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1);
-
-    /* write */
-    status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf);
-    HDassert(status >= 0);
-
-    /* close, free memory buffers */
-    status = H5Dclose(did1);
-    HDassert(status >= 0);
-    status = H5Sclose(sid1);
-    HDassert(status >= 0);
-    status = H5Dclose(did2);
-    HDassert(status >= 0);
-    status = H5Sclose(sid2);
-    HDassert(status >= 0);
-
-    HDfree(rbuf);
-    HDfree(buf);
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: test_hyperslab
-*
-* Purpose: test diff by hyperslabs. create a dataset with 1GB dimensions
-*  by iterating trough 1KB hyperslabs
-*
-*-------------------------------------------------------------------------
-*/
-static
-int test_hyperslab(const char *fname,
-                   int make_diffs /* flag to modify data buffers */)
-{
-    hid_t   did=-1;
-    hid_t   fid=-1;
-    hid_t   f_sid=-1;
-    hid_t   m_sid=-1;
-    hid_t   tid=-1;
-    hid_t   dcpl=-1;
-    hsize_t dims[1]={GBLL};                  /* dataset dimensions */
-    hsize_t hs_size[1]={GBLL/(1024*1024)};   /* hyperslab dimensions */
-    hsize_t chunk_dims[1]={GBLL/1024};       /* chunk dimensions */
-    hsize_t hs_start[1];
-    size_t  size;
-    size_t  nelmts=(size_t)GBLL/(1024*1024); /* elements in each hyperslab */
-    char    fillvalue=-1;
-    char    *buf=NULL;
-    int     i, j, s;
-    char    c;
-
-    /* create */
-    fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_fill_value(dcpl, H5T_NATIVE_CHAR, &fillvalue) < 0)
-        goto out;
-    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
-        goto out;
-    if((f_sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if((did = H5Dcreate2(fid, "big", H5T_NATIVE_CHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
-        goto out;
-    if((tid = H5Dget_type(did)) < 0)
-        goto out;
-    if((size = H5Tget_size(tid)) <= 0)
-        goto out;
-
-    /* create a evenly divided buffer from 0 to 127  */
-    buf = (char *)HDmalloc((size_t)(nelmts * size));
-    s = 1024 * 1024 / 127;
-    for(i = 0, j = 0, c = 0; i < 1024 * 1024; j++, i++) {
-        if(j == s) {
-            c++;
-            j = 0;
-        }
-
-        /* set the hyperslab values */
-        HDmemset(buf, c, nelmts);
-
-        /* make a different hyperslab at this position */
-        if(make_diffs && i == 512 * 512)
-            HDmemset(buf, 0, nelmts);
-
-        hs_start[0] = i * GBLL/(1024*1024);
-        if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL) < 0)
-            goto out;
-
-        /* write only one hyperslab */
-        if ( i==512*512)
-        {
-            if (H5Dwrite (did,H5T_NATIVE_CHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
-                goto out;
-        }
-
-    }
-    HDfree(buf);
-    buf=NULL;
-
-    /* close */
-    if(H5Sclose(f_sid) < 0)
-        goto out;
-    if(H5Sclose(m_sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-    H5Fclose(fid);
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(f_sid);
-        H5Sclose(m_sid);
-        H5Dclose(did);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: write_attr
-*
-* Purpose: utility function to write an attribute in LOC_ID
-*
-*-------------------------------------------------------------------------
-*/
-static
-int write_attr(hid_t loc_id,
-               int rank,
-               hsize_t *dims,
-               const char *name,
-               hid_t tid,
-               void *buf)
-{
-    hid_t   aid=-1;
-    hid_t   sid=-1;
-
-    /* create a space  */
-    if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
-        goto out;
-
-    /* create the attribute */
-    if((aid = H5Acreate2(loc_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* write */
-    if(buf)
-    {
-        if(H5Awrite(aid, tid, buf) < 0)
-            goto out;
-    }
-
-    /* close */
-    H5Aclose(aid);
-    H5Sclose(sid);
-
-    return SUCCEED;
-
-out:
-
-    H5Aclose(aid);
-    H5Sclose(sid);
-    return FAIL;
-}
-
-/*-------------------------------------------------------------------------
-* Function: write_dset
-*
-* Purpose: utility function to create and write a dataset in LOC_ID
-*
-*-------------------------------------------------------------------------
-*/
-static
-int write_dset( hid_t loc_id,
-               int rank,
-               hsize_t *dims,
-               const char *name,
-               hid_t tid,
-               void *buf )
-{
-    hid_t   did=-1;
-    hid_t   sid=-1;
-
-    /* create a space  */
-    if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
-        goto out;
-
-    /* create the dataset */
-    if((did = H5Dcreate2(loc_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* write */
-    if(buf)
-    {
-        if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-            goto out;
-    }
-
-    /* close */
-    H5Dclose(did);
-    H5Sclose(sid);
-
-    return SUCCEED;
-
-out:
-
-    H5Dclose(did);
-    H5Sclose(sid);
-    return FAIL;
-}
-
diff --git a/tools/h5diff/ph5diff_main.c b/tools/h5diff/ph5diff_main.c
deleted file mode 100644
index a26b6e9..0000000
--- a/tools/h5diff/ph5diff_main.c
+++ /dev/null
@@ -1,329 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include "H5private.h"
-#include "h5diff.h"
-#include "ph5diff.h"
-#include "h5diff_common.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5diff"
-
-static void ph5diff_worker(int );
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: ph5diff main program
- *
- * Return: An exit status of 0 means no differences were found, 1 means some
- *   differences were found.
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- * Comments:
- *
- * This function drives the diff process and will do a serial or parallel diff depending
- * on the value of the global variable g_Parallel (default is 0), set to 1 when the program
- * is run as "ph5diff"
- *-------------------------------------------------------------------------
- */
-
-int main(int argc, const char *argv[])
-{
-    int        nID = 0;
-    const char *fname1 = NULL;
-    const char *fname2 = NULL;
-    const char *objname1  = NULL;
-    const char *objname2  = NULL;
-    diff_opt_t options;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    outBuffOffset = 0;
-    g_Parallel = 1;
-
-    MPI_Init(&argc, (char***) &argv);
-
-    MPI_Comm_rank(MPI_COMM_WORLD, &nID);
-    MPI_Comm_size(MPI_COMM_WORLD, &g_nTasks);
-
-    if(g_nTasks == 1)
-    {
-        printf("Only 1 task available...doing serial diff\n");
-
-        g_Parallel = 0;
-
-        parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
-
-        h5diff(fname1, fname2, objname1, objname2, &options);
-
-        print_info(&options);
-    }
-    /* Parallel h5diff */
-    else {
-
-        /* Have the manager process the command-line */
-        if(nID == 0)
-        {
-            parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
-
-            h5diff(fname1, fname2, objname1, objname2, &options);
-
-            MPI_Barrier(MPI_COMM_WORLD);
-
-            print_info(&options);
-            print_manager_output();
-        }
-        /* All other tasks become workers and wait for assignments. */
-        else {
-            ph5diff_worker(nID);
-
-            MPI_Barrier(MPI_COMM_WORLD);
-        } /* end else */
-
-    } /* end else */
-
-    MPI_Finalize();
-
-    return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: ph5diff_worker
- *
- * Purpose: worker process of ph5diff
- *
- * Return: none
- *
- * Programmer: Leon Arber
- * Date: January 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-ph5diff_worker(int nID)
-{
-    hid_t file1_id = -1, file2_id = -1;
-
-    while(1)
-    {
-        MPI_Status Status;
-
-        MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
-
-        /* Check for filenames */
-        if(Status.MPI_TAG == MPI_TAG_PARALLEL)
-        {
-            char    filenames[2][MAX_FILENAME];
-
-            /* Retrieve filenames */
-            MPI_Recv(filenames, MAX_FILENAME*2, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
-
-            /* disable error reporting */
-            H5E_BEGIN_TRY
-            {
-                /* Open the files */
-                if ((file1_id = H5Fopen (filenames[0], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
-                {
-                    printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[0]);
-                    MPI_Abort(MPI_COMM_WORLD, 0);
-                }
-                if ((file2_id = H5Fopen (filenames[1], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
-                {
-                    printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[1]);
-                    MPI_Abort(MPI_COMM_WORLD, 0);
-                }
-                /* enable error reporting */
-            }
-            H5E_END_TRY;
-        }
-        /* Check for work */
-        else if(Status.MPI_TAG == MPI_TAG_ARGS)
-        {
-            struct diff_mpi_args args;
-            struct diffs_found  diffs;
-            int i;
-
-            /* Make certain we've received the filenames and opened the files already */
-            if(file1_id < 0 || file2_id < 0)
-            {
-                printf("ph5diff_worker: ERROR: work received before/without filenames\n");
-                break;
-            }
-
-            /* Recv parameters for diff from manager task */
-            MPI_Recv(&args, sizeof(args), MPI_BYTE, 0, MPI_TAG_ARGS, MPI_COMM_WORLD, &Status);
-
-            /* Do the diff */
-            diffs.nfound = diff(file1_id, args.name1, file2_id, args.name2, &(args.options), &(args.argdata));
-            diffs.not_cmp = args.options.not_cmp;
-
-            /* If print buffer has something in it, request print token.*/
-            if(outBuffOffset>0)
-            {
-                MPI_Send(NULL, 0, MPI_BYTE, 0, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD);
-
-                /* Wait for print token. */
-                MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD, &Status);
-
-                /* When get token, send all of our output to the manager task and then return the token */
-                for(i=0; i<outBuffOffset; i+=PRINT_DATA_MAX_SIZE)
-                    MPI_Send(outBuff+i, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
-
-                /* An overflow file exists, so we send it's output to the manager too and then delete it */
-                if(overflow_file)
-                {
-                    char out_data[PRINT_DATA_MAX_SIZE];
-                    int tmp;
-
-                    memset(out_data, 0, PRINT_DATA_MAX_SIZE);
-                    i=0;
-
-                    rewind(overflow_file);
-                    while((tmp = getc(overflow_file)) >= 0)
-                    {
-                        *(out_data + i++) = (char)tmp;
-                        if(i==PRINT_DATA_MAX_SIZE)
-                        {
-                            MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
-                            i=0;
-                            memset(out_data, 0, PRINT_DATA_MAX_SIZE);
-                        }
-                    }
-
-                    if(i>0)
-                        MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
-
-                    fclose(overflow_file);
-                    overflow_file = NULL;
-                }
-
-                fflush(stdout);
-                memset(outBuff, 0, OUTBUFF_SIZE);
-                outBuffOffset = 0;
-
-                MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD);
-            }
-            else
-                MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD);
-        }
-        /* Check for leaving */
-        else if(Status.MPI_TAG == MPI_TAG_END)
-        {
-            MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_END, MPI_COMM_WORLD, &Status);
-            break;
-        }
-        else
-        {
-            printf("ph5diff_worker: ERROR: invalid tag (%d) received\n", Status.MPI_TAG);
-            break;
-        }
-
-    }
-
-    return;
-}
-
-/*-------------------------------------------------------------------------
- * Function: print_manager_output
- *
- * Purpose: special function that prints any output accumulated by the
- *      manager task.
- *
- * Return: none
- *
- * Programmer: Leon Arber
- *
- * Date: Feb 7, 2005
- *
- *-------------------------------------------------------------------------
- */
-void print_manager_output(void)
-{
-    /* If there was something we buffered, let's print it now */
-    if( (outBuffOffset>0) && g_Parallel)
-    {
-        printf("%s", outBuff);
-
-        if(overflow_file)
-        {
-            int     tmp;
-            rewind(overflow_file);
-            while((tmp = getc(overflow_file)) >= 0)
-                putchar(tmp);
-            fclose(overflow_file);
-            overflow_file = NULL;
-        }
-
-        HDfflush(stdout);
-        HDmemset(outBuff, 0, OUTBUFF_SIZE);
-        outBuffOffset = 0;
-    }
-    else if( (outBuffOffset>0) && !g_Parallel)
-    {
-        HDfprintf(stderr, "h5diff error: outBuffOffset>0, but we're not in parallel!\n");
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5diff_exit
- *
- * Purpose: dismiss phdiff worker processes and exit
- *
- * Return: none
- *
- * Programmer: Albert Cheng
- * Date: Feb 6, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void h5diff_exit(int status)
-{
-    /* if in parallel mode, dismiss workers, close down MPI, then exit */
-    if(g_Parallel) {
-        if(g_nTasks > 1) {
-            phdiff_dismiss_workers();
-            MPI_Barrier(MPI_COMM_WORLD);
-        }
-        MPI_Finalize();
-        status = EXIT_SUCCESS;  /* Reset exit status, since some mpiexec commands generate output on failure status */
-    }
-
-    /* Always exit(0), since MPI implementations do weird stuff when they
-     *  receive a non-zero exit value. - QAK
-     */
-    exit(0);
-}
-
diff --git a/tools/h5diff/testfiles/h5diff_dset_idx1.h5 b/tools/h5diff/testfiles/h5diff_dset_idx1.h5
deleted file mode 100644
index 3252303..0000000
Binary files a/tools/h5diff/testfiles/h5diff_dset_idx1.h5 and /dev/null differ
diff --git a/tools/h5diff/testfiles/h5diff_dset_idx2.h5 b/tools/h5diff/testfiles/h5diff_dset_idx2.h5
deleted file mode 100644
index db7584d..0000000
Binary files a/tools/h5diff/testfiles/h5diff_dset_idx2.h5 and /dev/null differ
diff --git a/tools/h5diff/testfiles/h5diff_hyper1.h5 b/tools/h5diff/testfiles/h5diff_hyper1.h5
deleted file mode 100644
index 1fd47e1..0000000
Binary files a/tools/h5diff/testfiles/h5diff_hyper1.h5 and /dev/null differ
diff --git a/tools/h5diff/testfiles/h5diff_hyper2.h5 b/tools/h5diff/testfiles/h5diff_hyper2.h5
deleted file mode 100644
index ad2f468..0000000
Binary files a/tools/h5diff/testfiles/h5diff_hyper2.h5 and /dev/null differ
diff --git a/tools/h5diff/testfiles/h5diff_idx.txt b/tools/h5diff/testfiles/h5diff_idx.txt
deleted file mode 100644
index 754d3ea..0000000
--- a/tools/h5diff/testfiles/h5diff_idx.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-
-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/tmptest.he5 b/tools/h5diff/testfiles/tmptest.he5
deleted file mode 100644
index 7dedfc1..0000000
Binary files a/tools/h5diff/testfiles/tmptest.he5 and /dev/null differ
diff --git a/tools/h5diff/testfiles/tmptest2.he5 b/tools/h5diff/testfiles/tmptest2.he5
deleted file mode 100644
index 0ce63dc..0000000
Binary files a/tools/h5diff/testfiles/tmptest2.he5 and /dev/null differ
diff --git a/tools/h5diff/testh5diff.sh.in b/tools/h5diff/testh5diff.sh.in
deleted file mode 100644
index 0dfdaa2..0000000
--- a/tools/h5diff/testh5diff.sh.in
+++ /dev/null
@@ -1,1160 +0,0 @@
-#! /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 h5diff tool
-#
-# Modification:
-#   Albert Cheng, 2005/08/17
-#   Added the SKIP feature.
-#   Albert Cheng, 2005/2/3
-#   Added -p option for parallel h5diff tests.
-#   Pedro Vicente Nunes:
-#    10/25/2005: Added test #9
-#    11/27/2006: Added test #10, #11
-#   Jonathan Kim:
-#    Improved to use single line
-#    Improved to check exit code (only serial mode, not necessary for parallel)
-#    Added test 400 - 425  (links with --follow-symlinks option)
-#    Added test 450 - 459  (dangling links)
-
-srcdir=@srcdir@
-
-TESTNAME=h5diff
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-H5DIFF=h5diff               # The tool name
-H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the tool binary
-
-RM='rm -rf'
-CMP='cmp -s'
-DIFF='diff -c'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-nerrors=0
-verbose=yes
-h5haveexitcode=yes	    # default is yes
-pmode=			    # default to run h5diff tests
-mydomainname=`domainname 2>/dev/null`
-
-# 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"
-
-TESTDIR=./testfiles
-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_H5DIFF_TESTFILES/h5diff_basic1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_basic2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_types.h5
-$SRC_H5DIFF_TESTFILES/h5diff_dtypes.h5
-$SRC_H5DIFF_TESTFILES/h5diff_attr1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_attr2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_dset1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_dset2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_hyper1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_hyper2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_empty.h5
-$SRC_H5DIFF_TESTFILES/h5diff_links.h5
-$SRC_H5DIFF_TESTFILES/h5diff_softlinks.h5
-$SRC_H5DIFF_TESTFILES/h5diff_linked_softlink.h5
-$SRC_H5DIFF_TESTFILES/h5diff_extlink_src.h5
-$SRC_H5DIFF_TESTFILES/h5diff_extlink_trg.h5
-$SRC_H5DIFF_TESTFILES/h5diff_ext2softlink_src.h5
-$SRC_H5DIFF_TESTFILES/h5diff_ext2softlink_trg.h5
-$SRC_H5DIFF_TESTFILES/h5diff_dset_zero_dim_size1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_dset_zero_dim_size2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_danglelinks1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_danglelinks2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-3.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude1-1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude1-2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude2-1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude2-2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude3-1.h5
-$SRC_H5DIFF_TESTFILES/h5diff_exclude3-2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_comp_vl_strs.h5
-$SRC_H5DIFF_TESTFILES/compounds_array_vlen1.h5
-$SRC_H5DIFF_TESTFILES/compounds_array_vlen2.h5
-$SRC_H5DIFF_TESTFILES/h5diff_attr_v_level1.h5
-$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_H5DIFF_TESTFILES/tmptest.he5
-$SRC_H5DIFF_TESTFILES/tmptest2.he5
-$SRC_H5DIFF_TESTFILES/tmpSingleSiteBethe.reference.h5
-$SRC_H5DIFF_TESTFILES/tmpSingleSiteBethe.output.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="
-$SRC_H5DIFF_TESTFILES/h5diff_10.txt
-$SRC_H5DIFF_TESTFILES/h5diff_100.txt
-$SRC_H5DIFF_TESTFILES/h5diff_101.txt
-$SRC_H5DIFF_TESTFILES/h5diff_102.txt
-$SRC_H5DIFF_TESTFILES/h5diff_103.txt
-$SRC_H5DIFF_TESTFILES/h5diff_104.txt
-$SRC_H5DIFF_TESTFILES/h5diff_11.txt
-$SRC_H5DIFF_TESTFILES/h5diff_12.txt
-$SRC_H5DIFF_TESTFILES/h5diff_13.txt
-$SRC_H5DIFF_TESTFILES/h5diff_14.txt
-$SRC_H5DIFF_TESTFILES/h5diff_15.txt
-$SRC_H5DIFF_TESTFILES/h5diff_16_1.txt
-$SRC_H5DIFF_TESTFILES/h5diff_16_2.txt
-$SRC_H5DIFF_TESTFILES/h5diff_16_3.txt
-$SRC_H5DIFF_TESTFILES/h5diff_17.txt
-$SRC_H5DIFF_TESTFILES/h5diff_171.txt
-$SRC_H5DIFF_TESTFILES/h5diff_172.txt
-$SRC_H5DIFF_TESTFILES/h5diff_18_1.txt
-$SRC_H5DIFF_TESTFILES/h5diff_18.txt
-$SRC_H5DIFF_TESTFILES/h5diff_20.txt
-$SRC_H5DIFF_TESTFILES/h5diff_200.txt
-$SRC_H5DIFF_TESTFILES/h5diff_201.txt
-$SRC_H5DIFF_TESTFILES/h5diff_202.txt
-$SRC_H5DIFF_TESTFILES/h5diff_203.txt
-$SRC_H5DIFF_TESTFILES/h5diff_204.txt
-$SRC_H5DIFF_TESTFILES/h5diff_205.txt
-$SRC_H5DIFF_TESTFILES/h5diff_206.txt
-$SRC_H5DIFF_TESTFILES/h5diff_207.txt
-$SRC_H5DIFF_TESTFILES/h5diff_208.txt
-$SRC_H5DIFF_TESTFILES/h5diff_220.txt
-$SRC_H5DIFF_TESTFILES/h5diff_221.txt
-$SRC_H5DIFF_TESTFILES/h5diff_222.txt
-$SRC_H5DIFF_TESTFILES/h5diff_223.txt
-$SRC_H5DIFF_TESTFILES/h5diff_224.txt
-$SRC_H5DIFF_TESTFILES/h5diff_21.txt
-$SRC_H5DIFF_TESTFILES/h5diff_22.txt
-$SRC_H5DIFF_TESTFILES/h5diff_23.txt
-$SRC_H5DIFF_TESTFILES/h5diff_24.txt
-$SRC_H5DIFF_TESTFILES/h5diff_25.txt
-$SRC_H5DIFF_TESTFILES/h5diff_26.txt
-$SRC_H5DIFF_TESTFILES/h5diff_27.txt
-$SRC_H5DIFF_TESTFILES/h5diff_28.txt
-$SRC_H5DIFF_TESTFILES/h5diff_30.txt
-$SRC_H5DIFF_TESTFILES/h5diff_300.txt
-$SRC_H5DIFF_TESTFILES/h5diff_400.txt
-$SRC_H5DIFF_TESTFILES/h5diff_401.txt
-$SRC_H5DIFF_TESTFILES/h5diff_402.txt
-$SRC_H5DIFF_TESTFILES/h5diff_403.txt
-$SRC_H5DIFF_TESTFILES/h5diff_404.txt
-$SRC_H5DIFF_TESTFILES/h5diff_405.txt
-$SRC_H5DIFF_TESTFILES/h5diff_406.txt
-$SRC_H5DIFF_TESTFILES/h5diff_407.txt
-$SRC_H5DIFF_TESTFILES/h5diff_408.txt
-$SRC_H5DIFF_TESTFILES/h5diff_409.txt
-$SRC_H5DIFF_TESTFILES/h5diff_410.txt
-$SRC_H5DIFF_TESTFILES/h5diff_411.txt
-$SRC_H5DIFF_TESTFILES/h5diff_412.txt
-$SRC_H5DIFF_TESTFILES/h5diff_413.txt
-$SRC_H5DIFF_TESTFILES/h5diff_414.txt
-$SRC_H5DIFF_TESTFILES/h5diff_415.txt
-$SRC_H5DIFF_TESTFILES/h5diff_416.txt
-$SRC_H5DIFF_TESTFILES/h5diff_417.txt
-$SRC_H5DIFF_TESTFILES/h5diff_418.txt
-$SRC_H5DIFF_TESTFILES/h5diff_419.txt
-$SRC_H5DIFF_TESTFILES/h5diff_420.txt
-$SRC_H5DIFF_TESTFILES/h5diff_421.txt
-$SRC_H5DIFF_TESTFILES/h5diff_422.txt
-$SRC_H5DIFF_TESTFILES/h5diff_423.txt
-$SRC_H5DIFF_TESTFILES/h5diff_424.txt
-$SRC_H5DIFF_TESTFILES/h5diff_425.txt
-$SRC_H5DIFF_TESTFILES/h5diff_450.txt
-$SRC_H5DIFF_TESTFILES/h5diff_451.txt
-$SRC_H5DIFF_TESTFILES/h5diff_452.txt
-$SRC_H5DIFF_TESTFILES/h5diff_453.txt
-$SRC_H5DIFF_TESTFILES/h5diff_454.txt
-$SRC_H5DIFF_TESTFILES/h5diff_455.txt
-$SRC_H5DIFF_TESTFILES/h5diff_456.txt
-$SRC_H5DIFF_TESTFILES/h5diff_457.txt
-$SRC_H5DIFF_TESTFILES/h5diff_458.txt
-$SRC_H5DIFF_TESTFILES/h5diff_459.txt
-$SRC_H5DIFF_TESTFILES/h5diff_465.txt
-$SRC_H5DIFF_TESTFILES/h5diff_466.txt
-$SRC_H5DIFF_TESTFILES/h5diff_467.txt
-$SRC_H5DIFF_TESTFILES/h5diff_468.txt
-$SRC_H5DIFF_TESTFILES/h5diff_469.txt
-$SRC_H5DIFF_TESTFILES/h5diff_471.txt
-$SRC_H5DIFF_TESTFILES/h5diff_472.txt
-$SRC_H5DIFF_TESTFILES/h5diff_473.txt
-$SRC_H5DIFF_TESTFILES/h5diff_474.txt
-$SRC_H5DIFF_TESTFILES/h5diff_475.txt
-$SRC_H5DIFF_TESTFILES/h5diff_480.txt
-$SRC_H5DIFF_TESTFILES/h5diff_481.txt
-$SRC_H5DIFF_TESTFILES/h5diff_482.txt
-$SRC_H5DIFF_TESTFILES/h5diff_483.txt
-$SRC_H5DIFF_TESTFILES/h5diff_484.txt
-$SRC_H5DIFF_TESTFILES/h5diff_485.txt
-$SRC_H5DIFF_TESTFILES/h5diff_486.txt
-$SRC_H5DIFF_TESTFILES/h5diff_487.txt
-$SRC_H5DIFF_TESTFILES/h5diff_50.txt
-$SRC_H5DIFF_TESTFILES/h5diff_51.txt
-$SRC_H5DIFF_TESTFILES/h5diff_52.txt
-$SRC_H5DIFF_TESTFILES/h5diff_53.txt
-$SRC_H5DIFF_TESTFILES/h5diff_54.txt
-$SRC_H5DIFF_TESTFILES/h5diff_55.txt
-$SRC_H5DIFF_TESTFILES/h5diff_56.txt
-$SRC_H5DIFF_TESTFILES/h5diff_57.txt
-$SRC_H5DIFF_TESTFILES/h5diff_58.txt
-$SRC_H5DIFF_TESTFILES/h5diff_59.txt
-$SRC_H5DIFF_TESTFILES/h5diff_500.txt
-$SRC_H5DIFF_TESTFILES/h5diff_501.txt
-$SRC_H5DIFF_TESTFILES/h5diff_502.txt
-$SRC_H5DIFF_TESTFILES/h5diff_503.txt
-$SRC_H5DIFF_TESTFILES/h5diff_504.txt
-$SRC_H5DIFF_TESTFILES/h5diff_505.txt
-$SRC_H5DIFF_TESTFILES/h5diff_506.txt
-$SRC_H5DIFF_TESTFILES/h5diff_507.txt
-$SRC_H5DIFF_TESTFILES/h5diff_508.txt
-$SRC_H5DIFF_TESTFILES/h5diff_509.txt
-$SRC_H5DIFF_TESTFILES/h5diff_510.txt
-$SRC_H5DIFF_TESTFILES/h5diff_511.txt
-$SRC_H5DIFF_TESTFILES/h5diff_512.txt
-$SRC_H5DIFF_TESTFILES/h5diff_513.txt
-$SRC_H5DIFF_TESTFILES/h5diff_514.txt
-$SRC_H5DIFF_TESTFILES/h5diff_515.txt
-$SRC_H5DIFF_TESTFILES/h5diff_516.txt
-$SRC_H5DIFF_TESTFILES/h5diff_517.txt
-$SRC_H5DIFF_TESTFILES/h5diff_518.txt
-$SRC_H5DIFF_TESTFILES/h5diff_530.txt
-$SRC_H5DIFF_TESTFILES/h5diff_540.txt
-$SRC_H5DIFF_TESTFILES/h5diff_600.txt
-$SRC_H5DIFF_TESTFILES/h5diff_601.txt
-$SRC_H5DIFF_TESTFILES/h5diff_603.txt
-$SRC_H5DIFF_TESTFILES/h5diff_604.txt
-$SRC_H5DIFF_TESTFILES/h5diff_605.txt
-$SRC_H5DIFF_TESTFILES/h5diff_606.txt
-$SRC_H5DIFF_TESTFILES/h5diff_607.txt
-$SRC_H5DIFF_TESTFILES/h5diff_608.txt
-$SRC_H5DIFF_TESTFILES/h5diff_609.txt
-$SRC_H5DIFF_TESTFILES/h5diff_610.txt
-$SRC_H5DIFF_TESTFILES/h5diff_612.txt
-$SRC_H5DIFF_TESTFILES/h5diff_613.txt
-$SRC_H5DIFF_TESTFILES/h5diff_614.txt
-$SRC_H5DIFF_TESTFILES/h5diff_615.txt
-$SRC_H5DIFF_TESTFILES/h5diff_616.txt
-$SRC_H5DIFF_TESTFILES/h5diff_617.txt
-$SRC_H5DIFF_TESTFILES/h5diff_618.txt
-$SRC_H5DIFF_TESTFILES/h5diff_619.txt
-$SRC_H5DIFF_TESTFILES/h5diff_621.txt
-$SRC_H5DIFF_TESTFILES/h5diff_622.txt
-$SRC_H5DIFF_TESTFILES/h5diff_623.txt
-$SRC_H5DIFF_TESTFILES/h5diff_624.txt
-$SRC_H5DIFF_TESTFILES/h5diff_625.txt
-$SRC_H5DIFF_TESTFILES/h5diff_626.txt
-$SRC_H5DIFF_TESTFILES/h5diff_627.txt
-$SRC_H5DIFF_TESTFILES/h5diff_628.txt
-$SRC_H5DIFF_TESTFILES/h5diff_629.txt
-$SRC_H5DIFF_TESTFILES/h5diff_630.txt
-$SRC_H5DIFF_TESTFILES/h5diff_631.txt
-$SRC_H5DIFF_TESTFILES/h5diff_640.txt
-$SRC_H5DIFF_TESTFILES/h5diff_641.txt
-$SRC_H5DIFF_TESTFILES/h5diff_642.txt
-$SRC_H5DIFF_TESTFILES/h5diff_643.txt
-$SRC_H5DIFF_TESTFILES/h5diff_644.txt
-$SRC_H5DIFF_TESTFILES/h5diff_645.txt
-$SRC_H5DIFF_TESTFILES/h5diff_646.txt
-$SRC_H5DIFF_TESTFILES/h5diff_70.txt
-$SRC_H5DIFF_TESTFILES/h5diff_700.txt
-$SRC_H5DIFF_TESTFILES/h5diff_701.txt
-$SRC_H5DIFF_TESTFILES/h5diff_702.txt
-$SRC_H5DIFF_TESTFILES/h5diff_703.txt
-$SRC_H5DIFF_TESTFILES/h5diff_704.txt
-$SRC_H5DIFF_TESTFILES/h5diff_705.txt
-$SRC_H5DIFF_TESTFILES/h5diff_706.txt
-$SRC_H5DIFF_TESTFILES/h5diff_707.txt
-$SRC_H5DIFF_TESTFILES/h5diff_708.txt
-$SRC_H5DIFF_TESTFILES/h5diff_709.txt
-$SRC_H5DIFF_TESTFILES/h5diff_710.txt
-$SRC_H5DIFF_TESTFILES/h5diff_80.txt
-$SRC_H5DIFF_TESTFILES/h5diff_90.txt
-$SRC_H5DIFF_TESTFILES/h5diff_tmp1.txt
-$SRC_H5DIFF_TESTFILES/h5diff_tmp2.txt
-$SRC_H5DIFF_TESTFILES/h5diff_v1.txt
-$SRC_H5DIFF_TESTFILES/h5diff_v2.txt
-$SRC_H5DIFF_TESTFILES/h5diff_v3.txt
-"
-
-#
-# copy test files and expected output files from source dirs to test dir
-#
-COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES $LIST_HDF5_TEST_FILES_XML $LIST_OTHER_TEST_FILES_XML"
-
-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
-}
-
-# Parse option
-#   -p   run ph5diff tests
-#   -h   print help page
-while [ $# -gt 0 ]; do
-    case "$1" in
-    -p)	# reset the tool name and bin to run ph5diff tests
-	TESTNAME=ph5diff
-	H5DIFF=ph5diff               # The tool name
-	H5DIFF_BIN=`pwd`/$H5DIFF
-	pmode=yes
-	shift
-	;;
-    -h) # print help page
-	echo "$0 [-p] [-h]"
-	echo "    -p   run ph5diff tests"
-	echo "    -h   print help page"
-	shift
-	exit 0
-	;;
-    *)  # unknown option
-        echo "$0: Unknown option ($1)"
-	exit 1
-	;;
-    esac
-done
-
-# 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
-
-# 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.
-#
-# Need eval before the RUNCMD command because some machines like
-# AIX, has RUNPARALLEL in the style as
-#   MP_PROCS=3 MP_TASKS_PER_NODE=3 poe ./a.out
-# that throws the shell script off.
-#
-TOOLTEST() {
-    expect="$TESTDIR/$1"
-    actual="$TESTDIR/`basename $1 .txt`.out"
-    actual_err="$TESTDIR/`basename $1 .txt`.err"
-    actual_sav=${actual}-sav
-    actual_err_sav=${actual_err}-sav
-    shift
-    if test -n "$pmode"; then
-        RUNCMD=$RUNPARALLEL
-    else
-        RUNCMD=$RUNSERIAL
-    fi
-
-    # Run test.
-    TESTING $H5DIFF $@
-    (
-	#echo "#############################"
-	#echo "Expected output for '$H5DIFF $@'" 
-	#echo "#############################"
-	cd $TESTDIR
-	eval $RUNCMD $H5DIFF_BIN "$@"
-    ) >$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
-    # 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
-    # serial mode, so the test is fullfilled.
-    if test $h5haveexitcode = 'yes' -a -z "$pmode"; then
-      echo "EXIT CODE: $EXIT_CODE" >> $actual
-    fi
-
-    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"
-    elif test $h5haveexitcode = 'yes' -a -z "$pmode"; then
-        echo "*FAILED*"
-        echo "    Expected result ($expect) differs from actual result ($actual)"
-        nerrors="`expr $nerrors + 1`"
-        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
-    else
-        # 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
-        actual_sorted=actual_sorted
-        sort $expect -o $expect_sorted
-        sort $actual -o $actual_sorted
-        # remove "EXIT CODE:" line from expect file. test for exit code
-        # is done by serial mode.
-        grep -v "EXIT CODE:" $expect_sorted > $expect_sorted.noexit
-        mv $expect_sorted.noexit $expect_sorted
-	if $CMP $expect_sorted $actual_sorted; then
-	    echo " PASSED"
-	else
-	    echo "*FAILED*"
-	    nerrors="`expr $nerrors + 1`"
-	    if test yes = "$verbose"; then
-		echo "====Expected result ($expect_sorted) differs from actual result ($actual_sorted)"
-		$DIFF $expect_sorted $actual_sorted |sed 's/^/    /'
-		echo "====The actual output ($actual_sav)"
-		sed 's/^/    /' < $actual_sav 
-		echo "====The actual stderr ($actual_err_sav)"
-		sed 's/^/    /' < $actual_err_sav 
-		echo "====End of actual stderr ($actual_err_sav)"
-		echo ""
-	    fi
-	fi
-    fi
-
-    # 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
-    fi
-}
-
-
-# Print a "SKIP" message
-SKIP() {
-   TESTING $H5DIFF $@
-    echo  " -SKIP-"
-}
-
-
-
-##############################################################################
-# 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
-# is done first in
-# TESTING with the name only of the test file $TOOL, not its full path $TESTFILE
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-# ############################################################################
-# # Common usage
-# ############################################################################
-
-# 1.0
-TOOLTEST h5diff_10.txt -h
-
-# 1.1 normal mode
-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
-
-# 1.4 report  mode with objects
-TOOLTEST h5diff_14.txt  -r h5diff_basic1.h5 h5diff_basic2.h5 g1/dset1 g1/dset2
-
-# 1.5 with -d
-TOOLTEST h5diff_15.txt --report --delta=5 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 1.6.1 with -p (int)
-TOOLTEST h5diff_16_1.txt -v -p 0.02 h5diff_basic1.h5 h5diff_basic1.h5 g1/dset5 g1/dset6
-
-# 1.6.2 with -p (unsigned long_long)
-TOOLTEST h5diff_16_2.txt --verbose --relative=0.02 h5diff_basic1.h5 h5diff_basic1.h5 g1/dset7 g1/dset8
-
-# 1.6.3 with -p (double)
-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
-
-# 1.7 test 32-bit INFINITY
-TOOLTEST h5diff_171.txt -v h5diff_basic1.h5 h5diff_basic1.h5 /g1/fp19 /g1/fp19_COPY
-
-# 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 -v and -q
-TOOLTEST h5diff_18_1.txt -v -q h5diff_basic1.h5 h5diff_basic2.h5
-
-
-# ##############################################################################
-# # not comparable types
-# ##############################################################################
-
-# 2.0
-TOOLTEST h5diff_20.txt -v h5diff_types.h5 h5diff_types.h5  dset g1
-
-# 2.1
-TOOLTEST h5diff_21.txt -v h5diff_types.h5 h5diff_types.h5 dset l1
-
-# 2.2
-TOOLTEST h5diff_22.txt -v  h5diff_types.h5 h5diff_types.h5 dset t1
-
-# ##############################################################################
-# # compare groups, types, links (no differences and differences)
-# ##############################################################################
-
-# 2.3
-TOOLTEST h5diff_23.txt -v h5diff_types.h5 h5diff_types.h5 g1 g1
-
-# 2.4
-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
-
-# 2.6
-TOOLTEST h5diff_26.txt -v h5diff_types.h5 h5diff_types.h5 g1 g2
-
-# 2.7
-TOOLTEST h5diff_27.txt -v h5diff_types.h5 h5diff_types.h5 t1 t2
-
-# 2.8
-TOOLTEST h5diff_28.txt -v h5diff_types.h5 h5diff_types.h5 l1 l2
-
-
-# ##############################################################################
-# # Enum value tests (may become more comprehensive in the future)
-# ##############################################################################
-
-# 3.0
-# test enum types which may have invalid values
-TOOLTEST h5diff_30.txt -v h5diff_enum_invalid_values.h5 h5diff_enum_invalid_values.h5 dset1 dset2
-
-
-
-
-# ##############################################################################
-# # Dataset datatypes
-# ##############################################################################
-
-# 5.0
-TOOLTEST h5diff_50.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset0a dset0b
-
-# 5.1
-TOOLTEST h5diff_51.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset1a dset1b
-
-# 5.2
-TOOLTEST h5diff_52.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset2a dset2b
-
-# 5.3
-TOOLTEST h5diff_53.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset3a dset4b
-
-# 5.4
-TOOLTEST h5diff_54.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset4a dset4b
-
-# 5.5
-TOOLTEST h5diff_55.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset5a dset5b
-
-# 5.6
-TOOLTEST h5diff_56.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset6a dset6b
-
-# 5.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
-# ( HDDFV-7942 )
-TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b
-
-# ##############################################################################
-# # Error messages
-# ##############################################################################
-
-
-# 6.0: Check if the command line number of arguments is less than 3
-TOOLTEST h5diff_600.txt h5diff_basic1.h5
-
-# 6.1: Check if non-exist object name is specified
-TOOLTEST h5diff_601.txt h5diff_basic1.h5 h5diff_basic1.h5 nono_obj
-
-
-# ##############################################################################
-# # -d
-# ##############################################################################
-
-
-# 6.3: negative value
-TOOLTEST h5diff_603.txt -d -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.4: zero
-TOOLTEST h5diff_604.txt -d 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.5: non number
-TOOLTEST h5diff_605.txt -d u h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.6: hexadecimal
-TOOLTEST h5diff_606.txt -d 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.7: string
-TOOLTEST h5diff_607.txt -d "1" h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 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
-TOOLTEST h5diff_609.txt -d 200 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.10: number smaller than smallest difference
-TOOLTEST h5diff_610.txt -d 1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-
-# ##############################################################################
-# # -p
-# ##############################################################################
-
-
-# 6.12: negative value
-TOOLTEST h5diff_612.txt -p -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.13: zero
-TOOLTEST h5diff_613.txt -p 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.14: non number
-TOOLTEST h5diff_614.txt -p u h5diff_basic1.h5 h5diff_basic2.h5  g1/dset3 g1/dset4
-
-# 6.15: hexadecimal
-TOOLTEST h5diff_615.txt -p 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.16: string
-TOOLTEST h5diff_616.txt -p "0.21" h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.17: repeated option
-TOOLTEST h5diff_617.txt -p 0.21 -p 0.22 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.18: number larger than biggest difference
-TOOLTEST h5diff_618.txt -p 2 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.19: number smaller than smallest difference
-TOOLTEST h5diff_619.txt -p 0.005 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-
-
-# ##############################################################################
-# # -n
-# ##############################################################################
-
-# 6.21: negative value
-TOOLTEST h5diff_621.txt -n -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.22: zero
-TOOLTEST h5diff_622.txt -n 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.23: non number
-TOOLTEST h5diff_623.txt -n u h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.24: hexadecimal
-TOOLTEST h5diff_624.txt -n 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.25: string
-TOOLTEST h5diff_625.txt -n "2" h5diff_basic1.h5 h5diff_basic2.h5  g1/dset3 g1/dset4
-
-# 6.26: repeated option
-TOOLTEST h5diff_626.txt -n 2 -n 3 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.27: number larger than biggest difference
-TOOLTEST h5diff_627.txt --count=200 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# 6.28: number smaller than smallest difference
-TOOLTEST h5diff_628.txt -n 1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
-
-# Disabling this test as it hangs - LRK 20090618
-# 6.29  non valid files
-#TOOLTEST h5diff_629.txt file1.h6 file2.h6
-
-# ##############################################################################
-# # NaN
-# ##############################################################################
-# 6.30: test (NaN == NaN) must be true based on our documentation -- XCAO
-TOOLTEST h5diff_630.txt -v -d "0.0001" h5diff_basic1.h5 h5diff_basic1.h5 g1/fp18 g1/fp18_COPY
-TOOLTEST h5diff_631.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/fp18 g1/fp18_COPY
-
-
-# ##############################################################################
-# 7.  attributes
-# ##############################################################################
-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
-TOOLTEST h5diff_tmp2.txt tmpSingleSiteBethe.output.h5 tmpSingleSiteBethe.reference.h5
-
-# ##################################################
-#  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
-
-# same attr number , all same attr name
-TOOLTEST h5diff_704.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g
-
-# same attr number , some same attr name
-TOOLTEST h5diff_705.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /dset
-
-# same attr number , all different attr name
-TOOLTEST h5diff_706.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /ntype
-
-# 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
-TOOLTEST h5diff_708.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g3
-
-# when no attributes exist in both objects
-TOOLTEST h5diff_709.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g4
-
-# file vs file
-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
-
-# 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
-
-# 11. floating point comparison
-# double value
-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
-
-# 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
-
-
-# not comparable -c flag
-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_202.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset2  g2/dset3
-
-TOOLTEST h5diff_203.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset3  g2/dset4
-
-TOOLTEST h5diff_204.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset4  g2/dset5
-
-TOOLTEST h5diff_205.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset5  g2/dset6
-
-# not comparable in compound
-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
-
-# 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
-
-# comparable dataset with non-comparable attribute and other comparable attributes.
-# All the comparables should display differences.
-TOOLTEST h5diff_221.txt -c non_comparables1.h5 non_comparables2.h5 /g2
-
-# entire file
-# All the comparables should display differences.
-TOOLTEST h5diff_222.txt -c non_comparables1.h5 non_comparables2.h5
-
-# non-comparable test for common objects (same name) with different object types
-# (HDFFV-7644)
-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
-# ##############################################################################
-# test for bug1749
-TOOLTEST h5diff_300.txt -v h5diff_links.h5 h5diff_links.h5 /link_g1 /link_g2
-
-# ##############################################################################
-# # Links compare with --follow-symlinks Only
-# ##############################################################################
-# soft links file to file
-TOOLTEST h5diff_400.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5
-
-# softlink vs dset"
-TOOLTEST h5diff_401.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset1_1 /target_dset2
-
-# dset vs softlink"
-TOOLTEST h5diff_402.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /target_dset2 /softlink_dset1_1
-
-# softlink vs softlink"
-TOOLTEST h5diff_403.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset1_1 /softlink_dset2
-
-# extlink vs extlink (FILE)"
-TOOLTEST h5diff_404.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5
-
-# extlink vs dset"
-TOOLTEST h5diff_405.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_trg.h5 /ext_link_dset1 /target_group2/x_dset
-
-# dset vs extlink"
-TOOLTEST h5diff_406.txt --follow-symlinks -v h5diff_extlink_trg.h5 h5diff_extlink_src.h5 /target_group2/x_dset /ext_link_dset1
-
-# extlink vs extlink"
-TOOLTEST h5diff_407.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_dset2
-
-# softlink vs extlink"
-TOOLTEST h5diff_408.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_extlink_src.h5 /softlink_dset1_1 /ext_link_dset2
-
-# extlink vs softlink "
-TOOLTEST h5diff_409.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_softlinks.h5 /ext_link_dset2 /softlink_dset1_1
-
-# linked_softlink vs linked_softlink (FILE)"
-TOOLTEST h5diff_410.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5
-
-# dset2 vs linked_softlink_dset1"
-TOOLTEST h5diff_411.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /target_dset2 /softlink1_to_slink2
-
-# linked_softlink_dset1 vs dset2"
-TOOLTEST h5diff_412.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink1_to_slink2 /target_dset2
-
-# linked_softlink_to_dset1 vs linked_softlink_to_dset2"
-TOOLTEST h5diff_413.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink1_to_slink2 /softlink2_to_slink2
-
-# group vs linked_softlink_group1"
-TOOLTEST h5diff_414.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /target_group /softlink3_to_slink2
-
-# linked_softlink_group1 vs group"
-TOOLTEST h5diff_415.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink3_to_slink2 /target_group
-
-# linked_softlink_to_group1 vs linked_softlink_to_group2"
-TOOLTEST h5diff_416.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink3_to_slink2 /softlink4_to_slink2
-
-# non-exist-softlink vs softlink"
-TOOLTEST h5diff_417.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_noexist /softlink_dset2
-
-# softlink vs non-exist-softlink"
-TOOLTEST h5diff_418.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset2 /softlink_noexist
-
-# non-exist-extlink_file vs extlink"
-TOOLTEST h5diff_419.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_noexist2 /ext_link_dset2
-
-# exlink vs non-exist-extlink_file"
-TOOLTEST h5diff_420.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset2 /ext_link_noexist2
-
-# extlink vs non-exist-extlink_obj"
-TOOLTEST h5diff_421.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset2 /ext_link_noexist1
-
-# non-exist-extlink_obj vs extlink"
-TOOLTEST h5diff_422.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_noexist1 /ext_link_dset2
-
-# extlink_to_softlink_to_dset1 vs dset2"
-TOOLTEST h5diff_423.txt --follow-symlinks -v h5diff_ext2softlink_src.h5 h5diff_ext2softlink_trg.h5 /ext_link_to_slink1 /dset2
-
-# dset2 vs extlink_to_softlink_to_dset1"
-TOOLTEST h5diff_424.txt --follow-symlinks -v h5diff_ext2softlink_trg.h5 h5diff_ext2softlink_src.h5 /dset2 /ext_link_to_slink1
-
-# extlink_to_softlink_to_dset1 vs extlink_to_softlink_to_dset2"
-TOOLTEST h5diff_425.txt --follow-symlinks -v h5diff_ext2softlink_src.h5 h5diff_ext2softlink_src.h5 /ext_link_to_slink1 /ext_link_to_slink2
-
-
-# ##############################################################################
-# # Dangling links compare (--follow-symlinks and --no-dangling-links)
-# ##############################################################################
-# dangling links --follow-symlinks (FILE to FILE)
-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
-
-# 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
-
-# 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
-
-# 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
-
-# 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
-
-# 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
-
-# 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
-
-# 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
-
-# dangling link --follow-symlinks (obj vs obj)
-# (HDFFV-7836)
-TOOLTEST h5diff_465.txt --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1
-# (HDFFV-7835)
-# soft dangling vs. soft dangling
-TOOLTEST h5diff_466.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1
-# 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
-# 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
-# (HDFFV-7998)
-# 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
-TOOLTEST h5diff_473.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link4
-TOOLTEST h5diff_474.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4
-TOOLTEST h5diff_475.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link1
-
-# ##############################################################################
-# # test for group diff recursivly
-# ##############################################################################
-# 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 / /
-
-# root vs group
-TOOLTEST h5diff_502.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 / /grp1/grp2/grp3
-
-# group vs group (same name and structure)
-TOOLTEST h5diff_503.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /grp1
-
-# group vs group (different name and structure)
-TOOLTEST h5diff_504.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1/grp2 /grp1/grp2/grp3
-
-# groups vs soft-link
-TOOLTEST h5diff_505.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /slink_grp1
-TOOLTEST h5diff_506.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1/grp2 /slink_grp2
-
-# groups vs ext-link
-TOOLTEST h5diff_507.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /elink_grp1
-TOOLTEST h5diff_508.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /elink_grp1
-
-# soft-link vs ext-link
-TOOLTEST h5diff_509.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp1 /elink_grp1
-TOOLTEST h5diff_510.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp1 /elink_grp1
-
-# circled ext links
-TOOLTEST h5diff_511.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp10 /grp11
-TOOLTEST h5diff_512.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp10 /grp11
-
-# circled soft2ext-link vs soft2ext-link
-TOOLTEST h5diff_513.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp10 /slink_grp11
-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
-# With follow-symlinks, file h5diff_grp_recurse_ext1.h5 and h5diff_grp_recurse_ext2-1.h5 should
-# be same with the external links.
-###############################################################################
-# file vs file
-TOOLTEST h5diff_515.txt -v h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5
-TOOLTEST h5diff_516.txt -v --follow-symlinks h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5
-# group vs group
-TOOLTEST h5diff_517.txt -v h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5 /g1
-TOOLTEST h5diff_518.txt -v --follow-symlinks h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5 /g1
-
-# ##############################################################################
-# # Exclude objects (--exclude-path)
-# ##############################################################################
-#
-# Same structure, same names and different value.
-#
-# Exclude the object with different value. Expect return - same
-TOOLTEST h5diff_480.txt -v --exclude-path /group1/dset3 h5diff_exclude1-1.h5 h5diff_exclude1-2.h5
-# Verify different by not excluding. Expect return - diff
-TOOLTEST h5diff_481.txt -v h5diff_exclude1-1.h5 h5diff_exclude1-2.h5
-
-#
-# 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
-# Exclude only some different objects. Expect return - diff
-TOOLTEST h5diff_483.txt -v --exclude-path "/group1" h5diff_exclude2-1.h5 h5diff_exclude2-2.h5
-
-# Exclude from group compare
-TOOLTEST h5diff_484.txt -v --exclude-path "/dset3" h5diff_exclude1-1.h5 h5diff_exclude1-2.h5 /group1
-
-#
-# Only one file contains unique objs. Common objs are same.
-# (HDFFV-7837)
-#
-TOOLTEST h5diff_485.txt -v --exclude-path "/group1" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5
-TOOLTEST h5diff_486.txt -v --exclude-path "/group1" h5diff_exclude3-2.h5 h5diff_exclude3-1.h5
-TOOLTEST h5diff_487.txt -v --exclude-path "/group1/dset" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5
-
-
-# ##############################################################################
-# # diff various multiple vlen and fixed strings in a compound type dataset
-# ##############################################################################
-TOOLTEST h5diff_530.txt -v  h5diff_comp_vl_strs.h5 h5diff_comp_vl_strs.h5 /group /group_copy
-
-# ##############################################################################
-# # Test container types (array,vlen) with multiple nested compound types
-# # Complex compound types in dataset and attribute
-# ##############################################################################
-TOOLTEST h5diff_540.txt -v compounds_array_vlen1.h5 compounds_array_vlen2.h5
-
-# ##############################################################################
-# # Test mutually exclusive options
-# ##############################################################################
-# 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
-TOOLTEST h5diff_643.txt -v -d 5 --use-system-epsilon h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
-TOOLTEST h5diff_644.txt -v --use-system-epsilon -d 5 h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
-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
-# ##############################################################################
-
-# 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/h5diff/testph5diff.sh.in b/tools/h5diff/testph5diff.sh.in
deleted file mode 100644
index ca212a1..0000000
--- a/tools/h5diff/testph5diff.sh.in
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /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.
-#
-
-srcdir=@srcdir@
-
-TESTNAME=ph5diff
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-TOOL=testh5diff.sh
-
-nerrors=0
-
-# 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'
-}
-
-# Run a test.  If a test fails then increment the `nerrors' global variable.
-#
-TOOLTEST() {
-    # Run test.
-    echo $TOOL "$@"
-    /bin/sh $TOOL "$@"
-
-    # Check if the command failed and increment nerrors if so.
-    if test $? -ne 0 ; then
-        nerrors="`expr $nerrors + 1`"
-    fi
-}
-
-##############################################################################
-##############################################################################
-###			  T H E   T E S T S                                ###
-##############################################################################
-##############################################################################
-
-# Invoke the regular h5diff testing script, with the -p parameter to indicate
-#       that it should run the parallel version of the tests
-TOOLTEST -p
-
-# no need to print any message since this is just a shell to invoke
-# testh5diff.sh which has already printed the result.  Just exit.
-if test $nerrors -eq 0 ; then
-    exit $EXIT_SUCCESS
-else
-    exit $EXIT_FAILURE
-fi
diff --git a/tools/h5dump/CMakeLists.txt b/tools/h5dump/CMakeLists.txt
deleted file mode 100644
index be08e2a..0000000
--- a/tools/h5dump/CMakeLists.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5DUMP)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5dump executables
-# --------------------------------------------------------------------
-add_executable (h5dump
-    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump.c
-    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump_ddl.c
-    ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dump_xml.c
-)
-TARGET_NAMING (h5dump STATIC)
-TARGET_C_PROPERTIES (h5dump STATIC " " " ")
-target_link_libraries (h5dump  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5dump PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5dump)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5dump test executable
-  # --------------------------------------------------------------------
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5dumpgentest ${HDF5_TOOLS_H5DUMP_SOURCE_DIR}/h5dumpgentest.c)
-    TARGET_NAMING (h5dumpgentest STATIC)
-    TARGET_C_PROPERTIES (h5dumpgentest STATIC " " " ")
-    target_link_libraries (h5dumpgentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-    set_target_properties (h5dumpgentest PROPERTIES FOLDER generator/tools)
-    
-    #add_test (NAME h5dumpgentest COMMAND $<TARGET_FILE:h5dumpgentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
-
-  include (CMakeTestsPBITS.cmake)
-
-  include (CMakeTestsVDS.cmake)
-
-  include (CMakeTestsXML.cmake)
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5dump ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5dump
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5dump/CMakeTests.cmake b/tools/h5dump/CMakeTests.cmake
deleted file mode 100644
index 7897311..0000000
--- a/tools/h5dump/CMakeTests.cmake
+++ /dev/null
@@ -1,1465 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the test directory into the source directory
-  # --------------------------------------------------------------------
-  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/non_existing.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/packedbits.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2A.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2A0.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2B.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-4s.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-5s.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-6.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-7.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-7N.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tallfilters.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1_big.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray5.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray6.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray7.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray8.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr-3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr-4_be.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrcontents1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrcontents2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrintsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrregR.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbin1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbin1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbin2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbin3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbin4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbinregR.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbigdims.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbitnopaque.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tboot1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tboot2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tboot2A.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tboot2B.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tchar1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tchunked.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdattrintsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdintarray.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdints.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdintsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompact.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcontents.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcontiguos.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdataregR.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdeflate.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset-3s.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/texceedsubstart.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/texceedsubcount.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/texceedsubstride.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/texceedsubblock.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/texternal.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinkfar.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfill.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfletcher32.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfpformat.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-5.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thyperslab.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicesno.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicessub1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicessub2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicessub3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicessub4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tindicesyes.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dims.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dimsBlock2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dimsBlockEq.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dimsCount2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dimsCountEq.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dimsStride2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tintsattrs.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tlarge_objname.ddl
-      #${HDF5_TOOLS_SRC_DIR}/testfiles/tldouble.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tlonglinks.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmultifile.ddl
-      #${HDF5_TOOLS_SRC_DIR}/testfiles/tqmarkfile.ddl
-      #${HDF5_TOOLS_SRC_DIR}/testfiles/tstarfile.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnamed_dtype_attr.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcmpddt.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnbit.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnoattrdata.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnoattrddl.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnodata.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnoddl.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnoddlfile.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tno-subset.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnullspace.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr5.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordercontents1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordercontents2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderlinks1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderlinks2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tperror.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/trawdatafile.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/trawssetfile.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/treadfilter.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/treadintfilter.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/treference.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarattrintsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarintattrsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarintsize.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarstring.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscaleoffset.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tshuffle.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink-D.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsplit_file.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstringe.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tszip.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink-1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink-2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tuserfilter.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes3.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes4.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes5.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvlstr.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvms.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/twidedisplay.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/twithddlfile.ddl
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/h5dump-help.txt
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/out3.h5import
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/zerodim.ddl
-  )
-  set (HDF5_REFERENCE_EXP_FILES
-      tall-6.exp
-      tnoddlfile.exp
-      trawdatafile.exp
-      trawssetfile.exp
-      tstr2bin2.exp
-      tstr2bin6.exp
-      twithddl.exp
-      twithddlfile.exp
-  )
-  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
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1_big.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray3.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray4.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray5.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray6.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray7.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray8.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr4_be.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrintsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbigdims.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbinary.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbitnopaque.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tchar.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdattrintsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdintarray.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdints.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcmpdintsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound_complex.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinkfar.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinktar.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00000.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00001.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00002.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00003.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00004.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00005.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00006.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00007.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00008.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00009.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00010.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfcontents1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfcontents2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfilters.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfpformat.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfvalues.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thyperslab.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tints4dims.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tintsattrs.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tlarge_objname.h5
-      #${HDF5_TOOLS_SRC_DIR}/testfiles/tldouble.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tlonglinks.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-b.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-g.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-l.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-o.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-r.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmulti-s.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnamed_dtype_attr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcomp.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcmpddt.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tno-subset.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnullspace.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tordergr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarattrintsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarintattrsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarintsize.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tscalarstring.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsplit_file-m.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsplit_file-r.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr3.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes3.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes4.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes5.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvlstr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvms.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/zerodim.h5
-  )
-  set (HDF5_ERROR_REFERENCE_TEST_FILES
-      ${PROJECT_SOURCE_DIR}/errfiles/filter_fail.err
-      ${PROJECT_SOURCE_DIR}/errfiles/non_existing.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tall-1.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tall-2A.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tall-2A0.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tall-2B.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tarray1_big.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tattrregR.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tattr-3.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tcomp-3.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tdataregR.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tdset-2.err
-      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubblock.err
-      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubcount.err
-      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubstart.err
-      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubstride.err
-      ${PROJECT_SOURCE_DIR}/errfiles/textlink.err
-      ${PROJECT_SOURCE_DIR}/errfiles/textlinkfar.err
-      ${PROJECT_SOURCE_DIR}/errfiles/textlinksrc.err
-      ${PROJECT_SOURCE_DIR}/errfiles/torderlinks1.err
-      ${PROJECT_SOURCE_DIR}/errfiles/torderlinks2.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tgroup-2.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tperror.err
-      ${PROJECT_SOURCE_DIR}/errfiles/tslink-D.err
-  )
-
-  # make test dir
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-
-  #
-  # copy test files from source dir to test dir
-  #
-  foreach (tst_h5_file ${HDF5_REFERENCE_TEST_FILES})
-    get_filename_component (fname "${tst_h5_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/std/${fname}")
-    #message (STATUS " Copying ${tst_h5_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${tst_h5_file} ${dest}
-    )
-  endforeach (tst_h5_file ${HDF5_REFERENCE_TEST_FILES})
-
-  foreach (tst_exp_file ${HDF5_REFERENCE_EXP_FILES})
-    if (WIN32)
-      file (READ ${HDF5_TOOLS_SRC_DIR}/testfiles/${tst_exp_file} TEST_STREAM)
-      file (WRITE ${PROJECT_BINARY_DIR}/testfiles/std/${tst_exp_file} "${TEST_STREAM}")
-    else (WIN32)
-      add_custom_command (
-          TARGET     h5dump
-          POST_BUILD
-          COMMAND    ${CMAKE_COMMAND}
-          ARGS       -E copy_if_different  ${HDF5_TOOLS_SRC_DIR}/testfiles/${tst_exp_file}  ${PROJECT_BINARY_DIR}/testfiles/std/${tst_exp_file}
-      )
-    endif (WIN32)
-  endforeach (tst_exp_file ${HDF5_REFERENCE_EXP_FILES})
-
-  foreach (tst_other_file ${HDF5_REFERENCE_FILES})
-    get_filename_component (fname "${tst_other_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/std/${fname}")
-    #message (STATUS " Copying ${tst_other_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${tst_other_file} ${dest}
-    )
-  endforeach (tst_other_file ${HDF5_REFERENCE_FILES})
-
-  foreach (tst_error_file ${HDF5_ERROR_REFERENCE_TEST_FILES})
-    get_filename_component (fname "${tst_error_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/std/${fname}")
-    #message (STATUS " Copying ${tst_error_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${tst_error_file} ${dest}
-    )
-  endforeach (tst_error_file ${HDF5_ERROR_REFERENCE_TEST_FILES})
-
-  # --------------------------------------------------------------------
-  # Special file handling
-  # --------------------------------------------------------------------
-  add_custom_command (
-      TARGET     h5dump
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different  ${HDF5_TOOLS_SOURCE_DIR}/testfiles/tbin1.ddl  ${PROJECT_BINARY_DIR}/testfiles/std/tbin1LE.ddl
-  )
-
-  if (WIN32)
-    file (READ ${HDF5_TOOLS_SRC_DIR}/testfiles/tbinregR.exp TEST_STREAM)
-    file (WRITE ${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp "${TEST_STREAM}")
-  else (WIN32)
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different  ${HDF5_TOOLS_SRC_DIR}/testfiles/tbinregR.exp  ${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp
-    )
-  endif (WIN32)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_HELP_TEST testname resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DUMP-${testname} COMMAND $<TARGET_FILE:h5dump> ${ARGN})
-      set_tests_properties (H5DUMP-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      set (last_test "H5DUMP-${testname}")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-h5dump-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove h5dump-${testname}.out h5dump-${testname}.out.err
-      )
-      set_tests_properties (H5DUMP-h5dump-${testname}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-h5dump-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
-              -D "TEST_OUTPUT=h5dump-${testname}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=h5dump-${testname}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-h5dump-${testname} PROPERTIES DEPENDS "H5DUMP-h5dump-${testname}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_HELP_TEST)
-
-  MACRO (ADD_SKIP_H5_TEST skipresultfile skipresultcode testtype)
-    if (${testtype} STREQUAL "SKIP")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5DUMP-${skipresultfile}-SKIPPED
-            COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${skipresultfile} ${ARGN}"
-        )
-      endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
-      ADD_H5_TEST (${skipresultfile} ${skipresultcode} ${ARGN})
-    endif (${testtype} STREQUAL "SKIP")
-  ENDMACRO (ADD_SKIP_H5_TEST)
-
-  MACRO (ADD_H5_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}/testfiles/std")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}.bin ${resultfile}.out ${resultfile}.out.err
-      )
-      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      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/std"
-              -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_TEST file)
-
-  MACRO (ADD_H5_TEST_N resultfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DUMP-N-${resultfile} COMMAND $<TARGET_FILE:h5dump> ${ARGN})
-      set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-N-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}-N.bin ${resultfile}-N.out ${resultfile}-N.out.err
-      )
-      set_tests_properties (H5DUMP-N-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-N-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
-              -D "TEST_OUTPUT=${resultfile}-N.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.ddl"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES DEPENDS "H5DUMP-N-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST_N file)
-
-  MACRO (ADD_H5_TEST_EXPORT resultfile targetfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> ${ARGN} ${resultfile}.txt ${targetfile})
-      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}.txt ${resultfile}.out ${resultfile}.out.err
-      )
-      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${ARGN};${resultfile}.txt;${targetfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
-              -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")
-      add_test (
-          NAME H5DUMP-${resultfile}-output-cmp
-          COMMAND ${CMAKE_COMMAND}
-                -E compare_files ${resultfile}.txt ${resultfile}.exp
-      )
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile})
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST_EXPORT file)
-
-  MACRO (ADD_H5_TEST_EXPORT_DDL resultfile targetfile resultcode ddlfile)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> --ddl=${ddlfile}.txt ${ARGN} ${resultfile}.txt ${targetfile})
-      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${ddlfile}.txt ${resultfile}.txt ${resultfile}.out ${resultfile}.out.err
-      )
-      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=--ddl=${ddlfile}.txt;${ARGN};${resultfile}.txt;${targetfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
-              -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")
-      add_test (
-          NAME H5DUMP-${resultfile}-output-cmp
-          COMMAND ${CMAKE_COMMAND}
-                -E compare_files ${resultfile}.txt ${resultfile}.exp
-      )
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile})
-      add_test (
-          NAME H5DUMP-${resultfile}-output-cmp-ddl
-          COMMAND ${CMAKE_COMMAND}
-                -E compare_files ${ddlfile}.txt ${ddlfile}.exp
-      )
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp-ddl PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-${resultfile}-output-cmp-ddl PROPERTIES DEPENDS H5DUMP-${resultfile}-output-cmp)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST_EXPORT_DDL file)
-
-  MACRO (ADD_H5_EXPORT_TEST resultfile targetfile resultcode)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-output-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}.txt
-      )
-      set_tests_properties (H5DUMP-output-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-output-${resultfile}
-          COMMAND $<TARGET_FILE:h5dump> ${ARGN} ${resultfile}.txt ${targetfile}
-      )
-      set_tests_properties (H5DUMP-output-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-output-${resultfile} PROPERTIES DEPENDS H5DUMP-output-${resultfile}-clear-objects)
-      add_test (
-          NAME H5DUMP-output-cmp-${resultfile}
-          COMMAND ${CMAKE_COMMAND}
-                -E compare_files ${resultfile}.txt ${resultfile}.exp
-      )
-      set_tests_properties (H5DUMP-output-cmp-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-output-cmp-${resultfile} PROPERTIES DEPENDS H5DUMP-output-${resultfile})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_EXPORT_TEST file)
-
-  MACRO (ADD_H5_MASK_TEST resultfile resultcode)
-    if (NOT 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/std")
-      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/std"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.ddl"
-              -D "TEST_MASK_ERROR=true"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS "H5DUMP-${resultfile}-clear-objects")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_MASK_TEST file)
-
-  MACRO (ADD_H5ERR_MASK_TEST resultfile resultcode)
-    if (NOT 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/std")
-      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/std"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.ddl"
-              -D "TEST_ERRREF=${resultfile}.err"
-              -D "TEST_MASK_ERROR=true"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS "H5DUMP-${resultfile}-clear-objects")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5ERR_MASK_TEST file)
-
-  MACRO (ADD_H5ERR_MASK_ENV_TEST resultfile resultcode envvar envval)
-    if (NOT 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/std")
-      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/std"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.ddl"
-              -D "TEST_ERRREF=${resultfile}.err"
-              -D "TEST_MASK_ERROR=true"
-              -D "TEST_ENV_VAR:STRING=${envvar}"
-              -D "TEST_ENV_VALUE:STRING=${envval}"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS "H5DUMP-${resultfile}-clear-objects")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5ERR_MASK_ENV_TEST)
-
-  MACRO (ADD_H5_TEST_IMPORT conffile resultfile testfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-IMPORT-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${conffile}.out ${conffile}.out.err ${resultfile}.bin ${resultfile}.h5
-      )
-      set_tests_properties (H5DUMP-IMPORT-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      add_test (
-          NAME H5DUMP-IMPORT-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${ARGN};-o;${resultfile}.bin;${testfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
-              -D "TEST_OUTPUT=${conffile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${conffile}.ddl"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-IMPORT-${resultfile} PROPERTIES DEPENDS "H5DUMP-IMPORT-${resultfile}-clear-objects")
-      add_test (NAME H5DUMP-IMPORT-h5import-${resultfile} COMMAND h5import ${resultfile}.bin -c ${conffile}.out -o ${resultfile}.h5)
-      set_tests_properties (H5DUMP-IMPORT-h5import-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-IMPORT-h5import-${resultfile} PROPERTIES DEPENDS H5DUMP-IMPORT-${resultfile})
-      add_test (NAME H5DUMP-IMPORT-h5diff-${resultfile} COMMAND h5diff ${testfile} ${resultfile}.h5 /integer /integer)
-      set_tests_properties (H5DUMP-IMPORT-h5diff-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-      set_tests_properties (H5DUMP-IMPORT-h5diff-${resultfile} PROPERTIES DEPENDS H5DUMP-IMPORT-h5import-${resultfile})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST_IMPORT file)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                          HDF5_ENABLE_USING_MEMCHECKER  ###
-##############################################################################
-##############################################################################
-
-  if (HDF5_ENABLE_USING_MEMCHECKER)
-    # Remove any output file left over from previous test run
-    add_test (
-      NAME H5DUMP-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove
-          h5dump-help.out
-          charsets.out
-          charsets.out.err
-          file_space.out
-          file_space.out.err
-          filter_fail.out
-          filter_fail.out.err
-          non_existing.out
-          non_existing.out.err
-          packedbits.out
-          packedbits.out.err
-          tall-1.out
-          tall-1.out.err
-          tall-2.out
-          tall-2.out.err
-          tall-2A.out
-          tall-2A.out.err
-          tall-2A0.out
-          tall-2A0.out.err
-          tall-2B.out
-          tall-2B.out.err
-          tall-3.out
-          tall-3.out.err
-          tall-4s.out
-          tall-4s.out.err
-          tall-5s.out
-          tall-5s.out.err
-          tall-6.txt
-          tall-6.out
-          tall-6.out.err
-          tall-7.out
-          tall-7.out.err
-          tall-7N.out
-          tall-7N.out.err
-          tallfilters.out
-          tallfilters.out.err
-          tarray1.out
-          tarray1.out.err
-          tarray1_big.out
-          tarray1_big.out.err
-          tarray2.out
-          tarray2.out.err
-          tarray3.out
-          tarray3.out.err
-          tarray4.out
-          tarray4.out.err
-          tarray5.out
-          tarray5.out.err
-          tarray6.out
-          tarray6.out.err
-          tarray7.out
-          tarray7.out.err
-          tarray8.out
-          tarray8.out.err
-          tattr-1.out
-          tattr-1.out.err
-          tattr-2.out
-          tattr-2.out.err
-          tattr-3.out
-          tattr-3.out.err
-          tattr-4_be.out
-          tattr-4_be.out.err
-          tattrcontents1.out
-          tattrcontents1.out.err
-          tattrcontents2.out
-          tattrcontents2.out.err
-          tattrintsize.out
-          tattrintsize.out.err
-          tattrreg.out
-          tattrreg.out.err
-          tattrregR.out
-          tattrregR.out.err
-          tbin1LE.bin
-          tbinregR.txt
-          tbinregR.out
-          tbinregR.out.err
-          tbigdims.out
-          tbigdims.out.err
-          tbitnopaque.out
-          tbitnopaque.out.err
-          tboot1.out
-          tboot1.out.err
-          tboot2.out
-          tboot2.out.err
-          tboot2A.out
-          tboot2A.out.err
-          tboot2B.out
-          tboot2B.out.err
-          tchar1.out
-          tchar1.out.err
-          tchunked.out
-          tchunked.out.err
-          tcmpdattrintsize.out
-          tcmpdattrintsize.out.err
-          tcmpdintarray.out
-          tcmpdintarray.out.err
-          tcmpdints.out
-          tcmpdints.out.err
-          tcmpdintsize.out
-          tcmpdintsize.out.err
-          tcomp-1.out
-          tcomp-1.out.err
-          tcomp-2.out
-          tcomp-2.out.err
-          tcomp-3.out
-          tcomp-3.out.err
-          tcomp-4.out
-          tcomp-4.out.err
-          tcompact.out
-          tcompact.out.err
-          tcontents.out
-          tcontents.out.err
-          tcontiguos.out
-          tcontiguos.out.err
-          tdatareg.out
-          tdatareg.out.err
-          tdataregR.out
-          tdataregR.out.err
-          tdeflate.out
-          tdeflate.out.err
-          tdset-1.out
-          tdset-1.out.err
-          tdset-2.out
-          tdset-2.out.err
-          tdset-3s.out
-          tdset-3s.out.err
-          tempty.out
-          tempty.out.err
-          texternal.out
-          texternal.out.err
-          textlinksrc.out
-          textlinksrc.out.err
-          textlinkfar.out
-          textlinkfar.out.err
-          textlink.out
-          textlink.out.err
-          tfamily.out
-          tfamily.out.err
-          tfill.out
-          tfill.out.err
-          tfletcher32.out
-          tfletcher32.out.err
-          tfpformat.out
-          tfpformat.out.err
-          tgroup-1.out
-          tgroup-1.out.err
-          tgroup-2.out
-          tgroup-2.out.err
-          tgrp_comments.out
-          tgrp_comments.out.err
-          thlink-1.out
-          thlink-1.out.err
-          thlink-2.out
-          thlink-2.out.err
-          thlink-3.out
-          thlink-3.out.err
-          thlink-4.out
-          thlink-4.out.err
-          thlink-5.out
-          thlink-5.out.err
-          thyperslab.out
-          thyperslab.out.err
-          tindicesno.out
-          tindicesno.out.err
-          tindicessub1.out
-          tindicessub1.out.err
-          tindicessub2.out
-          tindicessub2.out.err
-          tindicessub3.out
-          tindicessub3.out.err
-          tindicessub4.out
-          tindicessub4.out.err
-          texceedsubstart.out
-          texceedsubstart.out.err
-          texceedsubcount.out
-          texceedsubcount.out.err
-          texceedsubstride.out
-          texceedsubstride.out.err
-          texceedsubblock.out
-          texceedsubblock.out.err
-          tindicesyes.out
-          tindicesyes.out.err
-          tints4dims.out
-          tints4dims.out.err
-          tints4dimsBlock2.out
-          tints4dimsBlock2.out.err
-          tints4dimsBlockEq.out
-          tints4dimsBlockEq.out.err
-          tints4dimsCount2.out
-          tints4dimsCount2.out.err
-          tints4dimsCountEq.out
-          tints4dimsCountEq.out.err
-          tints4dimsStride2.out
-          tints4dimsStride2.out.err
-          tintsattrs.out
-          tintsattrs.out.err
-          tlarge_objname.out
-          tlarge_objname.out.err
-          tldouble.out
-          tldouble.out.err
-          tlonglinks.out
-          tlonglinks.out.err
-          tloop-1.out
-          tloop-1.out.err
-          tmulti.out
-          tmulti.out.err
-          tmultifile.out
-          tmultifile.out.err
-#          tqmarkfile.out
-#          tqmarkfile.out.err
-#          tstarfile.out
-#          tstarfile.out.err
-          tnamed_dtype_attr.out
-          tnamed_dtype_attr.out.err
-          tnbit.out
-          tnbit.out.err
-          tnestcomp-1.out
-          tnestcomp-1.out.err
-          tnestedcmpddt.out
-          tnestedcmpddt.out.err
-          tnoattrdata.out
-          tnoattrdata.out.err
-          tnoattrddl.out
-          tnoattrddl.out.err
-          tnodata.out
-          tnodata.out.err
-          tnoddl.out
-          tnoddl.out.err
-          tnoddlfile.out
-          tnoddlfile.out.err
-          tno-subset.out
-          tno-subset.out.err
-          tnullspace.out
-          tnullspace.out.err
-          tordergr1.out
-          tordergr1.out.err
-          tordergr2.out
-          tordergr2.out.err
-          tordergr3.out
-          tordergr3.out.err
-          tordergr4.out
-          tordergr4.out.err
-          tordergr5.out
-          tordergr5.out.err
-          torderattr1.out
-          torderattr1.out.err
-          torderattr2.out
-          torderattr2.out.err
-          torderattr3.out
-          torderattr3.out.err
-          torderattr4.out
-          torderattr4.out.err
-          tordercontents1.out
-          tordercontents1.out.err
-          tordercontents2.out
-          tordercontents2.out.err
-          torderlinks1.out
-          torderlinks1.out.err
-          torderlinks2.out
-          torderlinks2.out.err
-          tperror.out
-          tperror.out.err
-          trawdatafile.out
-          trawdatafile.out.err
-          trawdatafile.txt
-          trawssetfile.out
-          trawssetfile.out.err
-          trawssetfile.txt
-          treadfilter.out
-          treadfilter.out.err
-          treadintfilter.out
-          treadintfilter.out.err
-          treference.out
-          treference.out.err
-          tsaf.out
-          tsaf.out.err
-          tscalarattrintsize.out
-          tscalarattrintsize.out.err
-          tscalarintattrsize.out
-          tscalarintattrsize.out.err
-          tscalarintsize.out
-          tscalarintsize.out.err
-          tscalarstring.out
-          tscalarstring.out.err
-          tscaleoffset.out
-          tscaleoffset.out.err
-          tshuffle.out
-          tshuffle.out.err
-          tslink-1.out
-          tslink-1.out.err
-          tslink-2.out
-          tslink-2.out.err
-          tslink-D.out
-          tslink-D.out.err
-          tsplit_file.out
-          tsplit_file.out.err
-          tstr-1.out
-          tstr-1.out.err
-          tstr-2.out
-          tstr-2.out.err
-          tstr2bin2.txt
-          tstr2bin6.txt
-          tstring.out
-          tstring.out.err
-          tstring2.out
-          tstring2.out.err
-          tstringe.out
-          tstringe.out.err
-          tszip.out
-          tszip.out.err
-          tudlink-1.out
-          tudlink-1.out.err
-          tudlink-2.out
-          tudlink-2.out.err
-          tuserfilter.out
-          tuserfilter.out.err
-          tvldtypes1.out
-          tvldtypes1.out.err
-          tvldtypes2.out
-          tvldtypes2.out.err
-          tvldtypes3.out
-          tvldtypes3.out.err
-          tvldtypes4.out
-          tvldtypes4.out.err
-          tvldtypes5.out
-          tvldtypes5.out.err
-          tvlstr.out
-          tvlstr.out.err
-          tvms.out
-          tvms.out.err
-          twidedisplay.out
-          twidedisplay.out.err
-          twithddl.txt
-          twithddlfile.out
-          twithddlfile.out.err
-          twithddlfile.txt
-          zerodim.out
-          zerodim.out.err
-    )
-    set_tests_properties (H5DUMP-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5DUMP-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5DUMP-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  ADD_HELP_TEST(help 0 -h)
-
-  # test data output redirection
-  #ADD_H5_TEST (tnoddl 0 --enable-error-stack -O -y packedbits.h5)
-  ADD_H5_TEST (tnoddl 0 --enable-error-stack --ddl -y packedbits.h5)
-  #ADD_H5_TEST (tnodata 0 --enable-error-stack -o packedbits.h5)
-  ADD_H5_TEST (tnodata 0 --enable-error-stack --output packedbits.h5)
-  ADD_H5_TEST (tnoattrddl 0 --enable-error-stack -O -y tattr.h5)
-  ADD_H5_TEST (tnoattrdata 0 --enable-error-stack -A -o tattr.h5)
-  ADD_H5_TEST_EXPORT (trawdatafile packedbits.h5 0 --enable-error-stack -y -o)
-  ADD_H5_TEST_EXPORT (tnoddlfile packedbits.h5 0 --enable-error-stack -O -y -o)
-  ADD_H5_TEST_EXPORT (trawssetfile tdset.h5 0 --enable-error-stack -d "/dset1[1,1;;;]" -y -o)
-
-  ADD_H5_TEST_EXPORT_DDL (twithddlfile packedbits.h5 0 twithddl --enable-error-stack --ddl=twithddl.txt -y -o)
-
-  # test for maximum display datasets
-  ADD_H5_TEST (twidedisplay 0 --enable-error-stack -w0 packedbits.h5)
-
-  # test for signed/unsigned datasets
-  ADD_H5_TEST (packedbits 0 --enable-error-stack packedbits.h5)
-  # test for compound signed/unsigned datasets
-  ADD_H5_TEST (tcmpdintarray 0 --enable-error-stack tcmpdintarray.h5)
-  ADD_H5_TEST (tcmpdints 0 --enable-error-stack tcmpdints.h5)
-  ADD_H5_TEST (tcmpdintsize 0 --enable-error-stack tcmpdintsize.h5)
-  # test for signed/unsigned scalar datasets
-  ADD_H5_TEST (tscalarintsize 0 --enable-error-stack tscalarintsize.h5)
-  # test for signed/unsigned attributes
-  ADD_H5_TEST (tattrintsize 0 --enable-error-stack tattrintsize.h5)
-  # test for compound signed/unsigned attributes
-  ADD_H5_TEST (tcmpdattrintsize 0 --enable-error-stack tcmpdattrintsize.h5)
-  # test for signed/unsigned scalar attributes
-  ADD_H5_TEST (tscalarattrintsize 0 --enable-error-stack tscalarattrintsize.h5)
-  # test for string scalar dataset and attribute
-  ADD_H5_TEST (tscalarstring 0 --enable-error-stack tscalarstring.h5)
-  # test for signed/unsigned scalar datasets with attributes
-  ADD_H5_TEST (tscalarintattrsize 0 --enable-error-stack tscalarintattrsize.h5)
-  # test for signed/unsigned datasets attributes
-  ADD_H5_TEST (tintsattrs 0 --enable-error-stack tintsattrs.h5)
-  # test for displaying groups
-  ADD_H5_TEST (tgroup-1 0 --enable-error-stack tgroup.h5)
-  # test for displaying the selected groups
-  ADD_H5ERR_MASK_TEST (tgroup-2 1 --enable-error-stack --group=/g2 --group / -g /y tgroup.h5)
-
-  # test for displaying simple space datasets
-  ADD_H5_TEST (tdset-1 0 --enable-error-stack tdset.h5)
-  # test for displaying selected datasets
-  ADD_H5ERR_MASK_TEST (tdset-2 1 --enable-error-stack -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5)
-
-  # test for displaying attributes
-  ADD_H5_TEST (tattr-1 0 --enable-error-stack tattr.h5)
-  # test for displaying the selected attributes of string type and scalar space
-  ADD_H5_TEST (tattr-2 0 --enable-error-stack -a /\\\\/attr1 --attribute /attr4 --attribute=/attr5 tattr.h5)
-  ADD_H5_TEST_N (tattr-2 0 --enable-error-stack -N /\\\\/attr1 --any_path /attr4 --any_path=/attr5 tattr.h5)
-  # test for header and error messages
-  ADD_H5ERR_MASK_TEST (tattr-3 1 --enable-error-stack --header -a /attr2 --attribute=/attr tattr.h5)
-  # test for displaying at least 9 attributes on root from a be machine
-  ADD_H5_TEST (tattr-4_be 0 --enable-error-stack tattr4_be.h5)
-  # test for displaying attributes in shared datatype (also in group and dataset)
-  ADD_H5_TEST (tnamed_dtype_attr 0 --enable-error-stack tnamed_dtype_attr.h5)
-
-  # test for displaying soft links and user-defined links
-  ADD_H5_TEST (tslink-1 0 --enable-error-stack tslink.h5)
-  ADD_H5_TEST (tudlink-1 0 --enable-error-stack tudlink.h5)
-  # test for displaying the selected link
-  ADD_H5_TEST (tslink-2 0 --enable-error-stack -l slink2 tslink.h5)
-  ADD_H5_TEST_N (tslink-2 0 --enable-error-stack -N slink2 tslink.h5)
-  ADD_H5_TEST (tudlink-2 0 --enable-error-stack -l udlink2 tudlink.h5)
-  # test for displaying dangling soft links
-  ADD_H5ERR_MASK_TEST (tslink-D 0 --enable-error-stack -d /slink1 tslink.h5)
-
-  # tests for hard links
-  ADD_H5_TEST (thlink-1 0 --enable-error-stack thlink.h5)
-  ADD_H5_TEST (thlink-2 0 --enable-error-stack -d /g1/dset2 --dataset /dset1 --dataset=/g1/g1.1/dset3 thlink.h5)
-  ADD_H5_TEST (thlink-3 0 --enable-error-stack -d /g1/g1.1/dset3 --dataset /g1/dset2 --dataset=/dset1 thlink.h5)
-  ADD_H5_TEST (thlink-4 0 --enable-error-stack -g /g1 thlink.h5)
-  ADD_H5_TEST_N (thlink-4 0 --enable-error-stack -N /g1 thlink.h5)
-  ADD_H5_TEST (thlink-5 0 --enable-error-stack -d /dset1 -g /g2 -d /g1/dset2 thlink.h5)
-  ADD_H5_TEST_N (thlink-5 0 --enable-error-stack -N /dset1 -N /g2 -N /g1/dset2 thlink.h5)
-
-  # tests for compound data types
-  ADD_H5_TEST (tcomp-1 0 --enable-error-stack tcompound.h5)
-  # test for named data types
-  ADD_H5_TEST (tcomp-2 0 --enable-error-stack -t /type1 --datatype /type2 --datatype=/group1/type3 tcompound.h5)
-  ADD_H5_TEST_N (tcomp-2 0 --enable-error-stack -N /type1 --any_path /type2 --any_path=/group1/type3 tcompound.h5)
-  # test for unamed type
-  ADD_H5ERR_MASK_TEST (tcomp-3 0 "--enable-error-stack;-t;/#6632;-g;/group2;tcompound.h5")
-  # test complicated compound datatype
-  ADD_H5_TEST (tcomp-4 0 --enable-error-stack tcompound_complex.h5)
-  # tests for bitfields and opaque data types
-  ADD_H5_TEST (tbitnopaque 0 --enable-error-stack tbitnopaque.h5)
-
-  #test for the nested compound type
-  ADD_H5_TEST (tnestcomp-1 0 --enable-error-stack tnestedcomp.h5)
-  ADD_H5_TEST (tnestedcmpddt 0 --enable-error-stack tnestedcmpddt.h5)
-
-  # test for options
-  ADD_H5ERR_MASK_TEST (tall-1 0 --enable-error-stack tall.h5)
-  ADD_H5_TEST (tall-2 0 --enable-error-stack --header -g /g1/g1.1 -a attr2 tall.h5)
-  ADD_H5_TEST (tall-3 0 --enable-error-stack -d /g2/dset2.1 -l /g1/g1.2/g1.2.1/slink tall.h5)
-  ADD_H5_TEST_N (tall-3 0 --enable-error-stack -N /g2/dset2.1 -N /g1/g1.2/g1.2.1/slink tall.h5)
-  ADD_H5_TEST (tall-7 0 --enable-error-stack -a attr1 tall.h5)
-  ADD_H5_TEST (tall-7N 0 --enable-error-stack -N attr1 tall.h5)
-
-  # test for loop detection
-  ADD_H5_TEST (tloop-1 0 --enable-error-stack tloop.h5)
-
-  # test for string
-  ADD_H5_TEST (tstr-1 0 --enable-error-stack tstr.h5)
-  ADD_H5_TEST (tstr-2 0 --enable-error-stack tstr2.h5)
-
-  # test for file created by Lib SAF team
-  ADD_H5_TEST (tsaf 0 --enable-error-stack tsaf.h5)
-
-  # test for file with variable length data
-  ADD_H5_TEST (tvldtypes1 0 --enable-error-stack tvldtypes1.h5)
-  ADD_H5_TEST (tvldtypes2 0 --enable-error-stack tvldtypes2.h5)
-  ADD_H5_TEST (tvldtypes3 0 --enable-error-stack tvldtypes3.h5)
-  ADD_H5_TEST (tvldtypes4 0 --enable-error-stack tvldtypes4.h5)
-  ADD_H5_TEST (tvldtypes5 0 --enable-error-stack tvldtypes5.h5)
-
-  #test for file with variable length string data
-  ADD_H5_TEST (tvlstr 0 --enable-error-stack tvlstr.h5)
-
-  # test for files with array data
-  ADD_H5_TEST (tarray1 0 --enable-error-stack tarray1.h5)
-  # # added for bug# 2092 - tarray1_big.h5
-  ADD_H5ERR_MASK_TEST (tarray1_big 0 --enable-error-stack -R tarray1_big.h5)
-  ADD_H5_TEST (tarray2 0 --enable-error-stack tarray2.h5)
-  ADD_H5_TEST (tarray3 0 --enable-error-stack tarray3.h5)
-  ADD_H5_TEST (tarray4 0 --enable-error-stack tarray4.h5)
-  ADD_H5_TEST (tarray5 0 --enable-error-stack tarray5.h5)
-  ADD_H5_TEST (tarray6 0 --enable-error-stack tarray6.h5)
-  ADD_H5_TEST (tarray7 0 --enable-error-stack tarray7.h5)
-  ADD_H5_TEST (tarray8 0 --enable-error-stack tarray8.h5)
-
-  # test for wildcards in filename (does not work with cmake)
-  #ADD_H5_MASK_TEST (tstarfile 0 --enable-error-stack -H -d Dataset1 tarr*.h5)
-  #ADD_H5_MASK_TEST (tqmarkfile 0 --enable-error-stack -H -d Dataset1 tarray?.h5)
-  ADD_H5_TEST (tmultifile 0 --enable-error-stack -H -d Dataset1 tarray2.h5 tarray3.h5 tarray4.h5 tarray5.h5 tarray6.h5 tarray7.h5)
-
-  # test for files with empty data
-  ADD_H5_TEST (tempty 0 --enable-error-stack tempty.h5)
-
-  # test for files with groups that have comments
-  ADD_H5_TEST (tgrp_comments 0 --enable-error-stack tgrp_comments.h5)
-
-  # test the --filedriver flag
-  ADD_H5_TEST (tsplit_file 0 --enable-error-stack --filedriver=split tsplit_file)
-  ADD_H5_TEST (tfamily 0 --enable-error-stack --filedriver=family tfamily%05d.h5)
-  ADD_H5_TEST (tmulti 0 --enable-error-stack --filedriver=multi tmulti)
-
-  # test for files with group names which reach > 1024 bytes in size
-  ADD_H5_TEST (tlarge_objname 0 --enable-error-stack -w157 tlarge_objname.h5)
-
-  # test '-A' to suppress data but print attr's
-  ADD_H5ERR_MASK_TEST (tall-2A 0 --enable-error-stack -A tall.h5)
-
-  # test '-A' to suppress attr's but print data
-  ADD_H5ERR_MASK_TEST (tall-2A0 0 --enable-error-stack -A 0 tall.h5)
-
-  # test '-r' to print attributes in ASCII instead of decimal
-  ADD_H5ERR_MASK_TEST (tall-2B 0 --enable-error-stack -A -r tall.h5)
-
-  # test Subsetting
-  ADD_H5_TEST (tall-4s 0 --enable-error-stack --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5)
-  ADD_H5_TEST (tall-5s 0 --enable-error-stack -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5)
-  ADD_H5_TEST (tdset-3s 0 --enable-error-stack -d "/dset1[1,1;;;]" tdset.h5)
-  ADD_H5_TEST (tno-subset 0 --enable-error-stack --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0" tno-subset.h5)
-
-  ADD_H5_TEST (tints4dimsCount2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 2,2,2,2 tints4dims.h5)
-  ADD_H5_TEST (tints4dimsBlock2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 1,1,1,1 -k 2,2,2,2 tints4dims.h5)
-  ADD_H5_TEST (tints4dimsStride2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,2,2 -c 2,2,2,2 tints4dims.h5)
-  ADD_H5_TEST (tints4dimsCountEq 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -k 1,2,1,1 -c 2,2,4,4 tints4dims.h5)
-  ADD_H5_TEST (tints4dimsBlockEq 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -c 2,2,1,1 -k 1,2,4,4 tints4dims.h5)
-
-  # test printing characters in ASCII instead of decimal
-  ADD_H5_TEST (tchar1 0 --enable-error-stack -r tchar.h5)
-
-  # test datatypes in ASCII and UTF8
-  ADD_H5_TEST (charsets 0 --enable-error-stack charsets.h5)
-
-  # rev. 2004
-  # tests for super block
-  ADD_H5_TEST (tboot1 0 --enable-error-stack -H -B -d dset tfcontents1.h5)
-  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)
-
-  # test for file contents
-  ADD_H5_TEST (tcontents 0 --enable-error-stack -n tfcontents1.h5)
-  ADD_H5_TEST (tordercontents1 0 --enable-error-stack -n --sort_by=name --sort_order=ascending tfcontents1.h5)
-  ADD_H5_TEST (tordercontents2 0 --enable-error-stack -n --sort_by=name --sort_order=descending tfcontents1.h5)
-  ADD_H5_TEST (tattrcontents1 0 --enable-error-stack -n 1 --sort_order=ascending tall.h5)
-  ADD_H5_TEST (tattrcontents2 0 --enable-error-stack -n 1 --sort_order=descending tall.h5)
-
-  # tests for storage layout
-  # compact
-  ADD_H5_TEST (tcompact 0 --enable-error-stack -H -p -d compact tfilters.h5)
-  # contiguous
-  ADD_H5_TEST (tcontiguos 0 --enable-error-stack -H -p -d contiguous tfilters.h5)
-  # chunked
-  ADD_H5_TEST (tchunked 0 --enable-error-stack -H -p -d chunked tfilters.h5)
-  # external
-  ADD_H5_TEST (texternal 0 --enable-error-stack -H -p -d external tfilters.h5)
-
-  # fill values
-  ADD_H5_TEST (tfill 0 --enable-error-stack -p tfvalues.h5)
-
-  # several datatype, with references , print path
-  ADD_H5_TEST (treference 0 --enable-error-stack  tattr2.h5)
-
-  # escape/not escape non printable characters
-  ADD_H5_TEST (tstringe 0 --enable-error-stack -e tstr3.h5)
-  ADD_H5_TEST (tstring 0 --enable-error-stack tstr3.h5)
-  # char data as ASCII with non escape
-  ADD_H5_TEST (tstring2 0 --enable-error-stack -r -d str4 tstr3.h5)
-
-  # array indices print/not print
-  ADD_H5_TEST (tindicesyes 0 --enable-error-stack taindices.h5)
-  ADD_H5_TEST (tindicesno 0 --enable-error-stack -y taindices.h5)
-
-  ########## array indices with subsetting
-  # 1D case
-  ADD_H5_TEST (tindicessub1 0 --enable-error-stack -d 1d -s 1 -S 10 -c 2  -k 3 taindices.h5)
-
-  # 2D case
-  ADD_H5_TEST (tindicessub2 0 --enable-error-stack -d 2d -s 1,2  -S 3,3 -c 3,2 -k 2,2 taindices.h5)
-
-  # 3D case
-  ADD_H5_TEST (tindicessub3 0 --enable-error-stack -d 3d -s 0,1,2 -S 1,3,3 -c 2,2,2  -k 1,2,2  taindices.h5)
-
-  # 4D case
-  ADD_H5_TEST (tindicessub4 0 --enable-error-stack -d 4d -s 0,0,1,2  -c 2,2,3,2 -S 1,1,3,3 -k 1,1,2,2  taindices.h5)
-
-  # Exceed the dimensions for subsetting
-  ADD_H5_TEST (texceedsubstart 1 --enable-error-stack -d 1d -s 1,3 taindices.h5)
-  ADD_H5_TEST (texceedsubcount 1 --enable-error-stack -d 1d -c 1,3 taindices.h5)
-  ADD_H5_TEST (texceedsubstride 1 --enable-error-stack -d 1d -S 1,3 taindices.h5)
-  ADD_H5_TEST (texceedsubblock 1 --enable-error-stack -d 1d -k 1,3 taindices.h5)
-
-  # tests for filters
-  # SZIP
-  ADD_H5_TEST (tszip 0 --enable-error-stack -H -p -d szip tfilters.h5)
-
-  # deflate
-  ADD_H5_TEST (tdeflate 0 --enable-error-stack -H -p -d deflate tfilters.h5)
-
-  # shuffle
-  ADD_H5_TEST (tshuffle 0 --enable-error-stack -H -p -d shuffle tfilters.h5)
-
-  # fletcher32
-  ADD_H5_TEST (tfletcher32 0 --enable-error-stack -H -p -d fletcher32  tfilters.h5)
-
-  # nbit
-  ADD_H5_TEST (tnbit 0 --enable-error-stack -H -p -d nbit  tfilters.h5)
-
-  # scaleoffset
-  ADD_H5_TEST (tscaleoffset 0 --enable-error-stack -H -p -d scaleoffset  tfilters.h5)
-
-  # all
-  ADD_H5_TEST (tallfilters 0 --enable-error-stack -H -p -d all  tfilters.h5)
-
-  # user defined
-  ADD_H5_TEST (tuserfilter 0 --enable-error-stack -H  -p -d myfilter  tfilters.h5)
-
-
-# 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)
-
-  if (USE_FILTER_DEFLATE)
-    # data read internal filters
-    ADD_H5_TEST (treadintfilter 0 --enable-error-stack -d deflate -d shuffle -d fletcher32 -d nbit -d scaleoffset tfilters.h5)
-    if (HDF5_ENABLE_SZIP_SUPPORT)
-      # data read all filters
-      ADD_H5_TEST (treadfilter 0 --enable-error-stack -d all -d szip tfilters.h5)
-    endif (HDF5_ENABLE_SZIP_SUPPORT)
-  endif (USE_FILTER_DEFLATE)
-
-  # test for displaying objects with very long names
-  ADD_H5_TEST (tlonglinks 0 --enable-error-stack tlonglinks.h5)
-
-  # dimensions over 4GB, print boundary
-  ADD_H5_TEST (tbigdims 0 --enable-error-stack -d dset4gb -s 4294967284 -c 22 tbigdims.h5)
-
-  # hyperslab read
-  ADD_H5_TEST (thyperslab 0 --enable-error-stack thyperslab.h5)
-
-  # test for displaying dataset and attribute of null space
-  ADD_H5_TEST (tnullspace 0 --enable-error-stack tnullspace.h5)
-
-  # test for displaying dataset and attribute of space with 0 dimension size
-  ADD_H5_TEST (zerodim 0 --enable-error-stack zerodim.h5)
-
-  # test for long double (some systems do not have long double)
-  #ADD_H5_TEST (tldouble 0 --enable-error-stack tldouble.h5)
-
-  # test for vms
-  ADD_H5_TEST (tvms 0 --enable-error-stack tvms.h5)
-
-  # test for binary output
-  ADD_H5_TEST (tbin1LE 0 --enable-error-stack -d integer -o tbin1LE.bin -b LE tbinary.h5)
-
-  # test for string binary output
-  ADD_H5_EXPORT_TEST (tstr2bin2 tstr2.h5 0 --enable-error-stack -d /g2/dset2 -b -o)
-  ADD_H5_EXPORT_TEST (tstr2bin6 tstr2.h5 0 --enable-error-stack -d /g6/dset6 -b -o)
-
-  # NATIVE default. the NATIVE test can be validated with h5import/h5diff
-  ADD_H5_TEST_IMPORT (tbin1 out1D tbinary.h5 0 --enable-error-stack -d integer -b)
-
-  if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    ADD_H5_TEST (tbin2 0 --enable-error-stack -b BE -d float -o tbin2.bin tbinary.h5)
-  endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-  # the NATIVE test can be validated with h5import/h5diff
-  ADD_H5_TEST_IMPORT (tbin3 out3D tbinary.h5 0 --enable-error-stack -d integer -b NATIVE)
-
-  if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    ADD_H5_TEST (tbin4 0 --enable-error-stack -d double -b FILE -o tbin4.bin tbinary.h5)
-  endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-  # test for dataset region references
-  ADD_H5_TEST (tdatareg 0 --enable-error-stack tdatareg.h5)
-  ADD_H5ERR_MASK_TEST (tdataregR 0 --enable-error-stack -R tdatareg.h5)
-  ADD_H5_TEST (tattrreg 0 --enable-error-stack tattrreg.h5)
-  ADD_H5ERR_MASK_TEST (tattrregR 0 -R --enable-error-stack tattrreg.h5)
-  ADD_H5_EXPORT_TEST (tbinregR tdatareg.h5 0 --enable-error-stack -d /Dataset1 -s 0 -R -y -o)
-
-  # tests for group creation order
-  # "1" tracked, "2" name, root tracked
-  ADD_H5_TEST (tordergr1 0 --enable-error-stack --group=1 --sort_by=creation_order --sort_order=ascending tordergr.h5)
-  ADD_H5_TEST (tordergr2 0 --enable-error-stack --group=1 --sort_by=creation_order --sort_order=descending tordergr.h5)
-  ADD_H5_TEST (tordergr3 0 --enable-error-stack -g 2 -q name -z ascending tordergr.h5)
-  ADD_H5_TEST (tordergr4 0 --enable-error-stack -g 2 -q name -z descending tordergr.h5)
-  ADD_H5_TEST (tordergr5 0 --enable-error-stack -q creation_order tordergr.h5)
-
-  # tests for attribute order
-  ADD_H5_TEST (torderattr1 0 --enable-error-stack -H --sort_by=name --sort_order=ascending torderattr.h5)
-  ADD_H5_TEST (torderattr2 0 --enable-error-stack -H --sort_by=name --sort_order=descending torderattr.h5)
-  ADD_H5_TEST (torderattr3 0 --enable-error-stack -H --sort_by=creation_order --sort_order=ascending torderattr.h5)
-  ADD_H5_TEST (torderattr4 0 --enable-error-stack -H --sort_by=creation_order --sort_order=descending torderattr.h5)
-
-  # tests for link references and order
-  ADD_H5ERR_MASK_TEST (torderlinks1 0 --enable-error-stack --sort_by=name --sort_order=ascending tfcontents1.h5)
-  ADD_H5ERR_MASK_TEST (torderlinks2 0 --enable-error-stack --sort_by=name --sort_order=descending tfcontents1.h5)
-
-  # tests for floating point user defined printf format
-  ADD_H5_TEST (tfpformat 0 --enable-error-stack -m %.7f tfpformat.h5)
-
-  # tests for traversal of external links
-  ADD_H5ERR_MASK_TEST (textlinksrc 0 --enable-error-stack textlinksrc.h5)
-  ADD_H5ERR_MASK_TEST (textlinkfar 0 --enable-error-stack textlinkfar.h5)
-
-  # test for dangling external links
-  ADD_H5ERR_MASK_TEST (textlink 0 --enable-error-stack textlink.h5)
-
-  # test for error stack display (BZ2048)
-  ADD_H5ERR_MASK_ENV_TEST (filter_fail 1 "HDF5_PLUGIN_PRELOAD" "::" --enable-error-stack filter_fail.h5)
-
-  # test for -o -y for dataset with attributes
-  ADD_H5_TEST_EXPORT (tall-6 tall.h5 0 --enable-error-stack -d /g1/g1.1/dset1.1.1 -y -o)
-
-  # test for non-existing file
-  ADD_H5_TEST (non_existing 1 --enable-error-stack tgroup.h5 non_existing.h5)
diff --git a/tools/h5dump/CMakeTestsPBITS.cmake b/tools/h5dump/CMakeTestsPBITS.cmake
deleted file mode 100644
index 745d5b1..0000000
--- a/tools/h5dump/CMakeTestsPBITS.cmake
+++ /dev/null
@@ -1,367 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Packed Bits
-  # --------------------------------------------------------------------
-  #-- Copy all the HDF5 files from the test directory into the source directory
-  set (HDF5_REFERENCE_PBITS
-      tnofilename-with-packed-bits.ddl
-      tpbitsArray.ddl
-      tpbitsCompound.ddl
-      tpbitsIncomplete.ddl
-      tpbitsLengthExceeded.ddl
-      tpbitsCharLengthExceeded.ddl
-      tpbitsIntLengthExceeded.ddl
-      tpbitsLongLengthExceeded.ddl
-      tpbitsLengthPositive.ddl
-      tpbitsMax.ddl
-      tpbitsMaxExceeded.ddl
-      tpbitsOffsetExceeded.ddl
-      tpbitsCharOffsetExceeded.ddl
-      tpbitsIntOffsetExceeded.ddl
-      tpbitsLongOffsetExceeded.ddl
-      tpbitsOffsetNegative.ddl
-      tpbitsOverlapped.ddl
-      tpbitsSigned.ddl
-      tpbitsUnsigned.ddl
-      tpbitsSignedInt.ddl
-      tpbitsUnsignedInt.ddl
-      tpbitsSignedLong.ddl
-      tpbitsUnsignedLong.ddl
-      tpbitsSignedLongLong.ddl
-      tpbitsUnsignedLongLong.ddl
-      tpbitsSignedWhole.ddl
-      tpbitsUnsignedWhole.ddl
-      tpbitsSignedIntWhole.ddl
-      tpbitsUnsignedIntWhole.ddl
-      tpbitsSignedLongWhole.ddl
-      tpbitsUnsignedLongWhole.ddl
-      tpbitsSignedLongLongWhole.ddl
-      tpbitsUnsignedLongLongWhole.ddl
-      tpbitsSignedLongLongWhole1.ddl
-      tpbitsUnsignedLongLongWhole1.ddl
-      tpbitsSignedLongLongWhole63.ddl
-      tpbitsUnsignedLongLongWhole63.ddl
-      tpbitsSigned4.ddl
-      tpbitsUnsigned4.ddl
-      tpbitsSignedInt8.ddl
-      tpbitsUnsignedInt8.ddl
-      tpbitsSignedLong16.ddl
-      tpbitsUnsignedLong16.ddl
-      tpbitsSignedLongLong32.ddl
-      tpbitsUnsignedLongLong32.ddl
-      tpbitsSigned2.ddl
-      tpbitsUnsigned2.ddl
-      tpbitsSignedInt4.ddl
-      tpbitsUnsignedInt4.ddl
-      tpbitsSignedLong8.ddl
-      tpbitsUnsignedLong8.ddl
-      tpbitsSignedLongLong16.ddl
-      tpbitsUnsignedLongLong16.ddl
-  )
-  set (HDF5_REFERENCE_TEST_PBITS
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/packedbits.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5
-  )
-  set (HDF5_ERROR_REFERENCE_PBITS
-      tnofilename-with-packed-bits.err
-      tpbitsCharLengthExceeded.err
-      tpbitsCharOffsetExceeded.err
-      tpbitsIncomplete.err
-      tpbitsIntLengthExceeded.err
-      tpbitsIntOffsetExceeded.err
-      tpbitsLengthExceeded.err
-      tpbitsLengthPositive.err
-      tpbitsLongLengthExceeded.err
-      tpbitsLongOffsetExceeded.err
-      tpbitsMaxExceeded.err
-      tpbitsOffsetExceeded.err
-      tpbitsOffsetNegative.err
-  )
-
-  foreach (pbits_h5_file ${HDF5_REFERENCE_TEST_PBITS})
-    get_filename_component(fname "${pbits_h5_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}")
-    #message (STATUS " Copying ${pbits_h5_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${pbits_h5_file} ${dest}
-    )
-  endforeach (pbits_h5_file ${HDF5_REFERENCE_TEST_PBITS})
-
-
-  foreach (ddl_pbits ${HDF5_REFERENCE_PBITS})
-    get_filename_component(fname "${ddl_pbits}" NAME)
-    set (ddldest "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}")
-    #message (STATUS " Copying ${ddl_pbits}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/pbits/${ddl_pbits} ${ddldest}
-    )
-  endforeach (ddl_pbits ${HDF5_REFERENCE_PBITS})
-
-  foreach (ddl_pbits ${HDF5_ERROR_REFERENCE_PBITS})
-    get_filename_component(fname "${ddl_pbits}" NAME)
-    set (ddldest "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}")
-    #message (STATUS " Copying ${ddl_pbits}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/errfiles/${ddl_pbits} ${ddldest}
-    )
-  endforeach (ddl_pbits ${HDF5_ERROR_REFERENCE_PBITS})
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_H5_PBITS_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}/testfiles/pbits")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_pbits_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_pbits_test})
-      endif (NOT "${last_pbits_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/pbits")
-      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/pbits"
-              -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_PBITS_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 H5DUMP_PACKED_BITS-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove
-          tnofilename-with-packed-bits.out
-          tnofilename-with-packed-bits.out.err
-          tpbitsArray.out
-          tpbitsArray.out.err
-          tpbitsCompound.out
-          tpbitsCompound.out.err
-          tpbitsIncomplete.out
-          tpbitsIncomplete.out.err
-          tpbitsLengthExceeded.out
-          tpbitsLengthExceeded.out.err
-          tpbitsCharLengthExceeded.out
-          tpbitsCharLengthExceeded.out.err
-          tpbitsIntLengthExceeded.out
-          tpbitsIntLengthExceeded.out.err
-          tpbitsLongLengthExceeded.out
-          tpbitsLongLengthExceeded.out.err
-          tpbitsLengthPositive.out
-          tpbitsLengthPositive.out.err
-          tpbitsMax.out
-          tpbitsMax.out.err
-          tpbitsMaxExceeded.out
-          tpbitsMaxExceeded.out.err
-          tpbitsOffsetExceeded.out
-          tpbitsOffsetExceeded.out.err
-          tpbitsCharOffsetExceeded.out
-          tpbitsCharOffsetExceeded.out.err
-          tpbitsIntOffsetExceeded.out
-          tpbitsIntOffsetExceeded.out.err
-          tpbitsLongOffsetExceeded.out
-          tpbitsLongOffsetExceeded.out.err
-          tpbitsOffsetNegative.out
-          tpbitsOffsetNegative.out.err
-          tpbitsOverlapped.out
-          tpbitsOverlapped.out.err
-          tpbitsSigned.out
-          tpbitsSigned.out.err
-          tpbitsUnsigned.out
-          tpbitsUnsigned.out.err
-          tpbitsSignedInt.out
-          tpbitsSignedInt.out.err
-          tpbitsUnsignedInt.out
-          tpbitsUnsignedInt.out.err
-          tpbitsSignedLong.out
-          tpbitsSignedLong.out.err
-          tpbitsUnsignedLong.out
-          tpbitsUnsignedLong.out.err
-          tpbitsSignedLongLong.out
-          tpbitsSignedLongLong.out.err
-          tpbitsUnsignedLongLong.out
-          tpbitsUnsignedLongLong.out.err
-          tpbitsSignedWhole.out
-          tpbitsSignedWhole.out.err
-          tpbitsUnsignedWhole.out
-          tpbitsUnsignedWhole.out.err
-          tpbitsSignedIntWhole.out
-          tpbitsSignedIntWhole.out.err
-          tpbitsUnsignedIntWhole.out
-          tpbitsUnsignedIntWhole.out.err
-          tpbitsSignedLongWhole.out
-          tpbitsSignedLongWhole.out.err
-          tpbitsUnsignedLongWhole.out
-          tpbitsUnsignedLongWhole.out.err
-          tpbitsSignedLongLongWhole.out
-          tpbitsSignedLongLongWhole.out.err
-          tpbitsUnsignedLongLongWhole.out
-          tpbitsUnsignedLongLongWhole.out.err
-          tpbitsSignedLongLongWhole1.out
-          tpbitsSignedLongLongWhole1.out.err
-          tpbitsUnsignedLongLongWhole1.out
-          tpbitsUnsignedLongLongWhole1.out.err
-          tpbitsSignedLongLongWhole63.out
-          tpbitsSignedLongLongWhole63.out.err
-          tpbitsUnsignedLongLongWhole63.out
-          tpbitsUnsignedLongLongWhole63.out.err
-          tpbitsSigned4.out
-          tpbitsSigned4.out.err
-          tpbitsUnsigned4.out
-          tpbitsUnsigned4.out.err
-          tpbitsSignedInt8.out
-          tpbitsSignedInt8.out.err
-          tpbitsUnsignedInt8.out
-          tpbitsUnsignedInt8.out.err
-          tpbitsSignedLong16.out
-          tpbitsSignedLong16.out.err
-          tpbitsUnsignedLong16.out
-          tpbitsUnsignedLong16.out.err
-          tpbitsSignedLongLong32.out
-          tpbitsSignedLongLong32.out.err
-          tpbitsUnsignedLongLong32.out
-          tpbitsUnsignedLongLong32.out.err
-          tpbitsSigned2.out
-          tpbitsSigned2.out.err
-          tpbitsUnsigned2.out
-          tpbitsUnsigned2.out.err
-          tpbitsSignedInt4.out
-          tpbitsSignedInt4.out.err
-          tpbitsUnsignedInt4.out
-          tpbitsUnsignedInt4.out.err
-          tpbitsSignedLong8.out
-          tpbitsSignedLong8.out.err
-          tpbitsUnsignedLong8.out
-          tpbitsUnsignedLong8.out.err
-          tpbitsSignedLongLong16.out
-          tpbitsSignedLongLong16.out.err
-          tpbitsUnsignedLongLong16.out
-          tpbitsUnsignedLongLong16.out.err
-    )
-    set_tests_properties (H5DUMP_PACKED_BITS-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/pbits")
-    if (NOT "${last_pbits_test}" STREQUAL "")
-      set_tests_properties (H5DUMP_PACKED_BITS-clearall-objects PROPERTIES DEPENDS ${last_pbits_test})
-    endif (NOT "${last_pbits_test}" STREQUAL "")
-    set (last_pbits_test "H5DUMP_PACKED_BITS-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  # test failure handling
-  # Missing file name
-  ADD_H5_PBITS_TEST (tnofilename-with-packed-bits 1 --enable-error-stack)
-  # Limits:
-  # Maximum number of packed bits is 8 (for now).
-  # Maximum integer size is 8*sizeof(long long).
-  # Maximun Offset is Maximum size - 1.
-  # Maximum Offset+Length is Maximum size.
-  # Tests:
-  # Normal operation on both signed and unsigned int datasets.
-  # Sanity check
-  # Their rawdata output should be the same.
-  ADD_H5_PBITS_TEST (tpbitsSignedWhole 0 --enable-error-stack -d /DS08BITS -M 0,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedWhole 0 --enable-error-stack -d /DU08BITS -M 0,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedIntWhole 0 --enable-error-stack -d /DS16BITS -M 0,16 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedIntWhole 0 --enable-error-stack -d /DU16BITS -M 0,16 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongWhole 0 --enable-error-stack -d /DS32BITS -M 0,32 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongWhole 0 --enable-error-stack -d /DU32BITS -M 0,32 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole 0 --enable-error-stack -d /DS64BITS -M 0,64 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole 0 --enable-error-stack -d /DU64BITS -M 0,64 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole63 0 --enable-error-stack -d /DS64BITS -M 0,63 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole63 0 --enable-error-stack -d /DU64BITS -M 0,63 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole1 0 --enable-error-stack -d /DS64BITS -M 1,63 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole1 0 --enable-error-stack -d /DU64BITS -M 1,63 packedbits.h5)
-  # Half sections
-  ADD_H5_PBITS_TEST (tpbitsSigned4 0 --enable-error-stack -d /DS08BITS -M 0,4,4,4 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsigned4 0 --enable-error-stack -d /DU08BITS -M 0,4,4,4 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedInt8 0 --enable-error-stack -d /DS16BITS -M 0,8,8,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedInt8 0 --enable-error-stack -d /DU16BITS -M 0,8,8,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLong16 0 --enable-error-stack -d /DS32BITS -M 0,16,16,16 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLong16 0 --enable-error-stack -d /DU32BITS -M 0,16,16,16 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLong32 0 --enable-error-stack -d /DS64BITS -M 0,32,32,32 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong32 0 --enable-error-stack -d /DU64BITS -M 0,32,32,32 packedbits.h5)
-  # Quarter sections
-  ADD_H5_PBITS_TEST (tpbitsSigned2 0 --enable-error-stack -d /DS08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsigned2 0 --enable-error-stack -d /DU08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedInt4 0 --enable-error-stack -d /DS16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedInt4 0 --enable-error-stack -d /DU16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLong8 0 --enable-error-stack -d /DS32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLong8 0 --enable-error-stack -d /DU32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLong16 0 --enable-error-stack -d /DS64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong16 0 --enable-error-stack -d /DU64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5)
-  # Begin and End
-  ADD_H5_PBITS_TEST (tpbitsSigned 0 --enable-error-stack -d /DS08BITS -M 0,2,2,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsigned 0 --enable-error-stack -d /DU08BITS -M 0,2,2,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedInt 0 --enable-error-stack -d /DS16BITS -M 0,2,10,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedInt 0 --enable-error-stack -d /DU16BITS -M 0,2,10,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLong 0 --enable-error-stack -d /DS32BITS -M 0,2,26,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLong 0 --enable-error-stack -d /DU32BITS -M 0,2,26,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsSignedLongLong 0 --enable-error-stack -d /DS64BITS -M 0,2,58,6 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong 0 --enable-error-stack -d /DU64BITS -M 0,2,58,6 packedbits.h5)
-  # Overlapped packed bits.
-  ADD_H5_PBITS_TEST (tpbitsOverlapped 0 --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,0,3 packedbits.h5)
-  # Maximum number of packed bits.
-  ADD_H5_PBITS_TEST (tpbitsMax 0 --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5)
-  # Compound type.
-  ADD_H5_PBITS_TEST (tpbitsCompound 0 --enable-error-stack -d /dset1 -M 0,1,1,1 tcompound.h5)
-  # Array type.
-  ADD_H5_PBITS_TEST (tpbitsArray 0 --enable-error-stack -d /Dataset1 -M 0,1,1,1 tarray1.h5)
-  # Test Error handling.
-  # Too many packed bits requested. Max is 8 for now.
-  ADD_H5_PBITS_TEST (tpbitsMaxExceeded 1 --enable-error-stack -d /DS08BITS -M 0,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5)
-  # Offset too large. Max is 8*sizeof(long long.
-  ADD_H5_PBITS_TEST (tpbitsOffsetExceeded 1 --enable-error-stack -d /DS08BITS -M 64,1 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsCharOffsetExceeded 0 --enable-error-stack -d /DS08BITS -M 8,1 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsIntOffsetExceeded 0 --enable-error-stack -d /DS16BITS -M 16,1 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsLongOffsetExceeded 0 --enable-error-stack -d /DS32BITS -M 32,1 packedbits.h5)
-  # Bad offset, must not be negative.
-  ADD_H5_PBITS_TEST (tpbitsOffsetNegative 1 --enable-error-stack -d /DS08BITS -M -1,1 packedbits.h5)
-  # Bad length, must not be positive.
-  ADD_H5_PBITS_TEST (tpbitsLengthPositive 1 --enable-error-stack -d /DS08BITS -M 4,0 packedbits.h5)
-  # Offset+Length is too large. Max is 8*sizeof(long long).
-  ADD_H5_PBITS_TEST (tpbitsLengthExceeded 1 --enable-error-stack -d /DS08BITS -M 37,28 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsCharLengthExceeded 0 --enable-error-stack -d /DS08BITS -M 2,7 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsIntLengthExceeded 0 --enable-error-stack -d /DS16BITS -M 10,7 packedbits.h5)
-  ADD_H5_PBITS_TEST (tpbitsLongLengthExceeded 0 --enable-error-stack -d /DS32BITS -M 26,7 packedbits.h5)
-  # Incomplete pair of packed bits request.
-  ADD_H5_PBITS_TEST (tpbitsIncomplete 1 --enable-error-stack -d /DS08BITS -M 0,2,2,1,0,2,2, packedbits.h5)
diff --git a/tools/h5dump/CMakeTestsVDS.cmake b/tools/h5dump/CMakeTestsVDS.cmake
deleted file mode 100644
index dcb90e0..0000000
--- a/tools/h5dump/CMakeTestsVDS.cmake
+++ /dev/null
@@ -1,266 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           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
-      vds-first.ddl
-      vds-gap1.ddl
-      vds-gap2.ddl
-      vds_layout-eiger.ddl
-      vds_layout-maxmin.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
-      a.h5
-      b.h5
-      c.h5
-      d.h5
-      vds-percival-unlim-maxmin.h5
-      f-0.h5
-      f-3.h5
-      vds-eiger.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}/testfiles/vds")
-      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}/testfiles/vds")
-      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
-          vds-first.out
-          vds-first.out.err
-          vds-gap1.out
-          vds-gap1.out.err
-          vds-gap2.out
-          vds-gap2.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
-          vds_layout-eiger.out
-          vds_layout-eiger.out.err
-          vds_layout-maxmin.out
-          vds_layout-maxmin.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)
-    ADD_H5_VDS_TEST (vds-first 0 --vds-view-first-missing --enable-error-stack vds-percival-unlim-maxmin.h5)
-    ADD_H5_VDS_TEST (vds-gap1 0 -d /VDS-Eiger --vds-gap-size=1 --enable-error-stack vds-eiger.h5)
-    ADD_H5_VDS_TEST (vds-gap2 0 --vds-gap-size=2 --enable-error-stack vds-eiger.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)
-    ADD_H5_VDS_LAYOUT (vds_layout-eiger 0 --enable-error-stack vds-eiger.h5)
-    ADD_H5_VDS_LAYOUT (vds_layout-maxmin 0 --enable-error-stack vds-percival-unlim-maxmin.h5)
-  endif (USE_FILTER_DEFLATE)
diff --git a/tools/h5dump/CMakeTestsXML.cmake b/tools/h5dump/CMakeTestsXML.cmake
deleted file mode 100644
index fc6cae7..0000000
--- a/tools/h5dump/CMakeTestsXML.cmake
+++ /dev/null
@@ -1,434 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  #
-  # copy XML test files from source dir to test dir
-  #
-  set (HDF5_XML_REFERENCE_TEST_FILES
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray3.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray6.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray7.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbitfields.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound_complex.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tenum.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfpformat.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmany.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-amp.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-apos.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-gt.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-lt.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-quot.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-sp.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnamed_dtype_attr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcomp.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnodata.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tobjref.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/topaque.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref-escapes.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref-escapes-at.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring-at.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes3.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes4.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes5.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvlstr.h5
-  )
-  set (HDF5_XML_REFERENCE_FILES
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2A.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray3.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray6.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray7.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tbitfields.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound_complex.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-dtd.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-dtd-2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-dtd-uri.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-nons.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-nons-2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-nons-uri.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-ns.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty-ns-2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tenum.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfpformat.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmany.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-amp.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-apos.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnamed_dtype_attr.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-gt.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-lt.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-quot.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tname-sp.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcomp.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnodata.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tobjref.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/topaque.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr1.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr3.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/torderattr4.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref-escapes.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tref-escapes-at.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstring-at.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes3.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes4.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes5.h5.xml
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvlstr.h5.xml
-  )
-
-  foreach (tst_xml_h5_file ${HDF5_XML_REFERENCE_TEST_FILES})
-    get_filename_component(fname "${tst_xml_h5_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/xml/${fname}")
-    #message (STATUS " Copying ${tst_xml_h5_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${tst_xml_h5_file} ${dest}
-    )
-  endforeach (tst_xml_h5_file ${HDF5_XML_REFERENCE_TEST_FILES})
-  
-  foreach (tst_xml_other_file ${HDF5_XML_REFERENCE_FILES})
-    get_filename_component(fname "${tst_xml_other_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/xml/${fname}")
-    #message (STATUS " Copying ${tst_xml_other_file}")
-    add_custom_command (
-        TARGET     h5dump
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${tst_xml_other_file} ${dest}
-    )
-  endforeach (tst_xml_other_file ${HDF5_XML_REFERENCE_FILES})
-  
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_XML_SKIP_H5_TEST skipresultfile skipresultcode testtype)
-    if (${testtype} STREQUAL "SKIP")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5DUMP-XML-${skipresultfile}-SKIPPED
-            COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${skipresultfile}.xml --xml ${ARGN}"
-        )
-      endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
-      ADD_XML_H5_TEST (${skipresultfile} ${skipresultcode} ${ARGN})
-    endif (${testtype} STREQUAL "SKIP")
-  ENDMACRO (ADD_XML_SKIP_H5_TEST)
-
-  MACRO (ADD_XML_H5_TEST resultfile resultcode)
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5DUMP-XML-${resultfile} COMMAND $<TARGET_FILE:h5dump> --xml ${ARGN})
-      set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/xml")
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_xml_test}" STREQUAL "")
-        set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES DEPENDS ${last_xml_test})
-      endif (NOT "${last_xml_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5DUMP-XML-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}.out ${resultfile}.out.err
-      )
-      set_tests_properties (H5DUMP-XML-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/xml")
-      add_test (
-          NAME H5DUMP-XML-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=--xml;${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/xml"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.xml"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES DEPENDS "H5DUMP-XML-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_XML_H5_TEST file)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                          HDF5_ENABLE_USING_MEMCHECKER  ###
-##############################################################################
-##############################################################################
-   
-  if (HDF5_ENABLE_USING_MEMCHECKER)
-    # Remove any output file left over from previous test run
-    add_test (
-      NAME H5DUMP-XML-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove 
-          tall.h5.out
-          tall.h5.out.err
-          tall-2A.h5.out
-          tall-2A.h5.out.err
-          tarray1.h5.out
-          tarray1.h5.out.err
-          tarray2.h5.out
-          tarray2.h5.out.err
-          tarray3.h5.out
-          tarray3.h5.out.err
-          tarray6.h5.out
-          tarray6.h5.out.err
-          tarray7.h5.out
-          tarray7.h5.out.err
-          tattr.h5.out
-          tattr.h5.out.err
-          tbitfields.h5.out
-          tbitfields.h5.out.err
-          tcompound.h5.out
-          tcompound.h5.out.err
-          tcompound2.h5.out
-          tcompound2.h5.out.err
-          tcompound_complex.h5.out
-          tcompound_complex.h5.out.err
-          tdatareg.h5.out
-          tdatareg.h5.out.err
-          tdset.h5.out
-          tdset.h5.out.err
-          tdset2.h5.out
-          tdset2.h5.out.err
-          tempty-dtd-2.h5.out
-          tempty-dtd-2.h5.out.err
-          tempty-dtd-uri.h5.out
-          tempty-dtd-uri.h5.out.err
-          tempty-dtd.h5.out
-          tempty-dtd.h5.out.err
-          tempty-nons-2.h5.out
-          tempty-nons-2.h5.out.err
-          tempty-nons-uri.h5.out
-          tempty-nons-uri.h5.out.err
-          tempty-nons.h5.out
-          tempty-nons.h5.out.err
-          tempty-ns-2.h5.out
-          tempty-ns-2.h5.out.err
-          tempty-ns.h5.out
-          tempty-ns.h5.out.err
-          tempty.h5.out
-          tempty.h5.out.err
-          tenum.h5.out
-          tenum.h5.out.err
-          textlink.h5.out
-          textlink.h5.out.err
-          tfpformat.h5.out
-          tfpformat.h5.out.err
-          tgroup.h5.out
-          tgroup.h5.out.err
-          thlink.h5.out
-          thlink.h5.out.err
-          tloop.h5.out
-          tloop.h5.out.err
-          tloop2.h5.out
-          tloop2.h5.out.err
-          tmany.h5.out
-          tmany.h5.out.err
-          tname-amp.h5.out
-          tname-amp.h5.out.err
-          tname-apos.h5.out
-          tname-apos.h5.out.err
-          tname-gt.h5.out
-          tname-gt.h5.out.err
-          tname-lt.h5.out
-          tname-lt.h5.out.err
-          tname-quot.h5.out
-          tname-quot.h5.out.err
-          tname-sp.h5.out
-          tname-sp.h5.out.err
-          tnamed_dtype_attr.h5.out
-          tnamed_dtype_attr.h5.out.err
-          tnestedcomp.h5.out
-          tnestedcomp.h5.out.err
-          tnodata.h5.out
-          tnodata.h5.out.err
-          tnoname.h5.out
-          tnoname.h5.out.err
-          tobjref.h5.out
-          tobjref.h5.out.err
-          topaque.h5.out
-          topaque.h5.out.err
-          torderattr1.h5.out
-          torderattr1.h5.out.err
-          torderattr2.h5.out
-          torderattr2.h5.out.err
-          torderattr3.h5.out
-          torderattr3.h5.out.err
-          torderattr4.h5.out
-          torderattr4.h5.out.err
-          tref-escapes-at.h5.out
-          tref-escapes-at.h5.out.err
-          tref-escapes.h5.out
-          tref-escapes.h5.out.err
-          tref.h5.out
-          tref.h5.out.err
-          tsaf.h5.out
-          tsaf.h5.out.err
-          tslink.h5.out
-          tslink.h5.out.err
-          tstr.h5.out
-          tstr.h5.out.err
-          tstr2.h5.out
-          tstr2.h5.out.err
-          tstring.h5.out
-          tstring.h5.out.err
-          tstring-at.h5.out
-          tstring-at.h5.out.err
-          tudlink.h5.out
-          tudlink.h5.out.err
-          tvldtypes1.h5.out
-          tvldtypes1.h5.out.err
-          tvldtypes2.h5.out
-          tvldtypes2.h5.out.err
-          tvldtypes3.h5.out
-          tvldtypes3.h5.out.err
-          tvldtypes4.h5.out
-          tvldtypes4.h5.out.err
-          tvldtypes5.h5.out
-          tvldtypes5.h5.out.err
-          tvlstr.h5.out
-          tvlstr.h5.out.err
-    )
-    set_tests_properties (H5DUMP-XML-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/xml")
-    if (NOT "${last_xml_test}" STREQUAL "")
-      set_tests_properties (H5DUMP-XML-clearall-objects PROPERTIES DEPENDS ${last_xml_test})
-    endif (NOT "${last_xml_test}" STREQUAL "")
-    set (last_test "H5DUMP-XML-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  ########## test XML
-  ADD_XML_H5_TEST (tall.h5 0 tall.h5)
-  ADD_XML_H5_TEST (tattr.h5 0 tattr.h5)
-  ADD_XML_H5_TEST (tbitfields.h5 0 tbitfields.h5)
-  ADD_XML_H5_TEST (tcompound.h5 0 tcompound.h5)
-  ADD_XML_H5_TEST (tcompound2.h5 0 tcompound2.h5)
-  ADD_XML_H5_TEST (tdatareg.h5 0 tdatareg.h5)
-  ADD_XML_H5_TEST (tdset.h5 0 tdset.h5)
-  ADD_XML_H5_TEST (tdset2.h5 0 tdset2.h5)
-  ADD_XML_H5_TEST (tenum.h5 0 tenum.h5)
-  ADD_XML_H5_TEST (tgroup.h5 0 tgroup.h5)
-  ADD_XML_H5_TEST (thlink.h5 0 thlink.h5)
-  ADD_XML_H5_TEST (tloop.h5 0 tloop.h5)
-  ADD_XML_H5_TEST (tloop2.h5 0 tloop2.h5)
-  ADD_XML_H5_TEST (tmany.h5 0 tmany.h5)
-  ADD_XML_H5_TEST (tnestedcomp.h5 0 tnestedcomp.h5)
-  ADD_XML_H5_TEST (tcompound_complex.h5 0 tcompound_complex.h5)
-  ADD_XML_H5_TEST (tobjref.h5 0 tobjref.h5)
-  ADD_XML_H5_TEST (topaque.h5 0 topaque.h5)
-  ADD_XML_H5_TEST (tslink.h5 0 tslink.h5)
-  ADD_XML_H5_TEST (tudlink.h5 0 tudlink.h5)
-  ADD_XML_H5_TEST (textlink.h5 0 textlink.h5)
-  ADD_XML_H5_TEST (tstr.h5 0 tstr.h5)
-  ADD_XML_H5_TEST (tstr2.h5 0 tstr2.h5)
-  ADD_XML_H5_TEST (tref.h5 0 tref.h5)
-  ADD_XML_H5_TEST (tname-amp.h5 0 tname-amp.h5)
-  ADD_XML_H5_TEST (tname-apos.h5 0 tname-apos.h5)
-  ADD_XML_H5_TEST (tname-gt.h5 0 tname-gt.h5)
-  ADD_XML_H5_TEST (tname-lt.h5 0 tname-lt.h5)
-  ADD_XML_H5_TEST (tname-quot.h5 0 tname-quot.h5)
-  ADD_XML_H5_TEST (tname-sp.h5 0 tname-sp.h5)
-  ADD_XML_H5_TEST (tstring.h5 0 tstring.h5)
-  ADD_XML_H5_TEST (tstring-at.h5 0 tstring-at.h5)
-  ADD_XML_H5_TEST (tref-escapes.h5 0 tref-escapes.h5)
-  ADD_XML_H5_TEST (tref-escapes-at.h5 0 tref-escapes-at.h5)
-  ADD_XML_H5_TEST (tnodata.h5 0 tnodata.h5)
-  ADD_XML_H5_TEST (tarray1.h5 0 tarray1.h5)
-  ADD_XML_H5_TEST (tarray2.h5 0 tarray2.h5)
-  ADD_XML_H5_TEST (tarray3.h5 0 tarray3.h5)
-  ADD_XML_H5_TEST (tarray6.h5 0 tarray6.h5)
-  ADD_XML_H5_TEST (tarray7.h5 0 tarray7.h5)
-  ADD_XML_H5_TEST (tvldtypes1.h5 0 tvldtypes1.h5)
-  ADD_XML_H5_TEST (tvldtypes2.h5 0 tvldtypes2.h5)
-  ADD_XML_H5_TEST (tvldtypes3.h5 0 tvldtypes3.h5)
-  ADD_XML_H5_TEST (tvldtypes4.h5 0 tvldtypes4.h5)
-  ADD_XML_H5_TEST (tvldtypes5.h5 0 tvldtypes5.h5)
-  ADD_XML_H5_TEST (tvlstr.h5 0 tvlstr.h5)
-  ADD_XML_H5_TEST (tsaf.h5 0 tsaf.h5)
-  ADD_XML_H5_TEST (tempty.h5 0 tempty.h5)
-  ADD_XML_H5_TEST (tnamed_dtype_attr.h5 0 tnamed_dtype_attr.h5)
-  ##Test dataset and attribute of null space.  Commented out:
-  ## wait until the XML schema is updated for null space. 
-  ##  ADD_XML_H5_TEST (tnullspace.h5 0 tnulspace.h5)
-  ## So is dataspace with 0 dimension size.
-  ##  ADD_XML_H5_TEST (zerodim.h5 0 zerodim.h5)
-
-  # other options for xml
-
-  ADD_XML_H5_TEST (tempty-dtd.h5 0 --use-dtd tempty.h5)
-  ADD_XML_H5_TEST (tempty-dtd-2.h5 0 -u tempty.h5)
-
-  ADD_XML_H5_TEST (tempty-nons-2.h5 0 --xml-ns=: tempty.h5)
-
-  ## Some of these combinations are syntactically correct but
-  ##  the URLs are dummies 
-  ADD_XML_H5_TEST (tempty-ns.h5 0 -X thing: tempty.h5)
-  ADD_XML_H5_TEST (tempty-ns-2.h5 0 --xml-ns=thing: tempty.h5)
-  ADD_XML_H5_TEST (tempty-nons-uri.h5 0 --xml-ns=: --xml-dtd=http://somewhere.net tempty.h5)
-  ADD_XML_H5_TEST (tempty-dtd-uri.h5 0 --use-dtd --xml-dtd=http://somewhere.net tempty.h5)
-
-  ADD_XML_H5_TEST (tall-2A.h5 0 -A tall.h5)
-
-
-  # tests for attribute order
-  ADD_XML_H5_TEST (torderattr1.h5 0 -H --sort_by=name --sort_order=ascending torderattr.h5)
-  ADD_XML_H5_TEST (torderattr2.h5 0 -H --sort_by=name --sort_order=descending torderattr.h5)
-  ADD_XML_H5_TEST (torderattr3.h5 0 -H --sort_by=creation_order --sort_order=ascending torderattr.h5)
-  ADD_XML_H5_TEST (torderattr4.h5 0 -H --sort_by=creation_order --sort_order=descending torderattr.h5)
-
-  # tests for floating point user defined printf format
-  ADD_XML_H5_TEST (tfpformat.h5 0 -u -m %.7f tfpformat.h5)
-   
diff --git a/tools/h5dump/Makefile.am b/tools/h5dump/Makefile.am
deleted file mode 100644
index 93ba195..0000000
--- a/tools/h5dump/Makefile.am
+++ /dev/null
@@ -1,51 +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.
-##
-## Makefile.am
-## Run automake to generate a Makefile.in from this file.
-#
-# HDF5 Library Makefile(.in)
-#
-
-include $(top_srcdir)/config/commence.am
-
-# Include files in /src directory and /tools/lib directory
-AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
-
-# Test programs and scripts
-TEST_PROG=h5dumpgentest
-TEST_SCRIPT=testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh testh5dumpxml.sh
-
-check_PROGRAMS=$(TEST_PROG) binread
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5dump$(EXEEXT)
-
-# Our main target, the h5dump tool.
-bin_PROGRAMS=h5dump
-
-# Add h5dump specific linker flags here
-h5dump_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All the programs depend on the hdf5 and h5tools libraries
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# Source files for the program
-h5dump_SOURCES=h5dump.c h5dump_ddl.c h5dump_xml.c
-
-# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES+=*.h5 *.bin
-DISTCLEANFILES=testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5dump/Makefile.in b/tools/h5dump/Makefile.in
deleted file mode 100644
index 6b8866e..0000000
--- a/tools/h5dump/Makefile.in
+++ /dev/null
@@ -1,1514 +0,0 @@
-# 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) 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh \
-	testh5dumpxml.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-am__EXEEXT_1 = h5dumpgentest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-binread_SOURCES = binread.c
-binread_OBJECTS = binread.$(OBJEXT)
-binread_LDADD = $(LDADD)
-binread_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 = 
-am_h5dump_OBJECTS = h5dump.$(OBJEXT) h5dump_ddl.$(OBJEXT) \
-	h5dump_xml.$(OBJEXT)
-h5dump_OBJECTS = $(am_h5dump_OBJECTS)
-h5dump_LDADD = $(LDADD)
-h5dump_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5dump_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5dump_LDFLAGS) $(LDFLAGS) -o $@
-h5dumpgentest_SOURCES = h5dumpgentest.c
-h5dumpgentest_OBJECTS = h5dumpgentest.$(OBJEXT)
-h5dumpgentest_LDADD = $(LDADD)
-h5dumpgentest_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 = binread.c $(h5dump_SOURCES) h5dumpgentest.c
-DIST_SOURCES = binread.c $(h5dump_SOURCES) h5dumpgentest.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)/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@
-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 files in /src directory and /tools/lib 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_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5dumpgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.bin
-
-# Test programs and scripts
-TEST_PROG = h5dumpgentest
-TEST_SCRIPT = testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh testh5dumpxml.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5dump$(EXEEXT)
-
-# Add h5dump specific linker flags here
-h5dump_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All the programs depend on the hdf5 and h5tools libraries
-LDADD = $(LIBH5TOOLS) $(LIBHDF5)
-
-# Source files for the program
-h5dump_SOURCES = h5dump.c h5dump_ddl.c h5dump_xml.c
-DISTCLEANFILES = testh5dump.sh testh5dumppbits.sh testh5dumpxml.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 tools/h5dump/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5dump/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):
-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)
-	@$(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
-
-binread$(EXEEXT): $(binread_OBJECTS) $(binread_DEPENDENCIES) $(EXTRA_binread_DEPENDENCIES) 
-	@rm -f binread$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(binread_OBJECTS) $(binread_LDADD) $(LIBS)
-
-h5dump$(EXEEXT): $(h5dump_OBJECTS) $(h5dump_DEPENDENCIES) $(EXTRA_h5dump_DEPENDENCIES) 
-	@rm -f h5dump$(EXEEXT)
-	$(AM_V_CCLD)$(h5dump_LINK) $(h5dump_OBJECTS) $(h5dump_LDADD) $(LIBS)
-
-h5dumpgentest$(EXEEXT): $(h5dumpgentest_OBJECTS) $(h5dumpgentest_DEPENDENCIES) $(EXTRA_h5dumpgentest_DEPENDENCIES) 
-	@rm -f h5dumpgentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5dumpgentest_OBJECTS) $(h5dumpgentest_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/binread.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump_ddl.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump_xml.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dumpgentest.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 $$?
-h5dumpgentest.log: h5dumpgentest$(EXEEXT)
-	@p='h5dumpgentest$(EXEEXT)'; \
-	b='h5dumpgentest'; \
-	$(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/h5dump/binread.c b/tools/h5dump/binread.c
deleted file mode 100644
index 74db92c..0000000
--- a/tools/h5dump/binread.c
+++ /dev/null
@@ -1,97 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/*
- This program reads binary output from h5dump (-b option).
- To use change the following 3 symbols accordingly.
- For example, to read 2 elements of a float type , define
-
-  #define NELMTS     2
-  #define TYPE       float
-  #define FORMAT     "%f "
-
-*/
-
-#define NELMTS     6
-#define TYPE       int
-#define FORMAT     "%d "
-
-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: Prints a usage message on stderr and then returns.
- *
- * Return: void
- *
- * Programmer:  Pedro Vicente Nunes
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (void)
-{
-    fprintf(stderr, "usage: binread FILE_NAME\n");
-}
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: main program.
- *
- *-------------------------------------------------------------------------
- */
-
-int
-main (int argc, const char *argv[])
-{
-    FILE  *stream;
-    size_t numread;
-    TYPE   buf[NELMTS];
-    size_t i, nelmts = NELMTS;
-    char  *fname=NULL;
-
-    if (argc != 2) {
-        usage();
-        exit(1);
-    }
-
-    fname = strdup(argv[1]);
-
-    if((stream = fopen(fname, "rb")) != NULL) {
-        numread = fread(buf, sizeof( TYPE ), nelmts, stream);
-        printf("Number of items read = %llu\n", (unsigned long long)numread);
-
-        for (i = 0; i < nelmts; i++) {
-            printf(FORMAT,buf[i]);
-        }
-        printf("\n");
-
-        fclose(stream);
-    }
-    else
-        printf("File %s could not be opened\n", fname);
-
-    free(fname);
-
-    return 0;
-}
-
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c
deleted file mode 100644
index 553db93..0000000
--- a/tools/h5dump/h5dump.c
+++ /dev/null
@@ -1,1800 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "h5dump.h"
-#include "h5dump_ddl.h"
-#include "h5dump_xml.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5dump"
-
-static const char   *driver = NULL;      /* The driver to open the file with. */
-const char          *outfname=NULL;
-static int           doxml = 0;
-static int           useschema = 1;
-static const char   *xml_dtd_uri = NULL;
-
-/* module-scoped variables for XML option */
-#define DEFAULT_XSD     "http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd"
-#define DEFAULT_DTD     "http://www.hdfgroup.org/HDF5/XML/DTD/HDF5-File.dtd"
-
-/* Standard DDL output */
-static const dump_functions ddl_function_table = {
-    dump_group,
-    dump_named_datatype,
-    dump_dataset,
-    dump_dataspace,
-    dump_datatype,
-    dump_attr_cb,
-    dump_data
-};
-
-/* XML output */
-static const dump_functions xml_function_table = {
-    xml_dump_group,
-    xml_dump_named_datatype,
-    xml_dump_dataset,
-    xml_dump_dataspace,
-    xml_dump_datatype,
-    xml_dump_attr,
-    xml_dump_data
-};
-
-/* internal functions */
-static void     init_prefix(char **prfx, size_t prfx_len);
-
-/* a structure for handling the order command-line parameters come in */
-struct handler_t {
-    void (*func)(hid_t, const char *, void *, int, const char *);
-    char *obj;
-    struct subset_t *subset_info;
-};
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters. The long-named ones can be partially spelled. When
- * adding more, make sure that they don't clash with each other.
- */
-/* The following initialization makes use of C language cancatenating */
-/* "xxx" "yyy" into "xxxyyy". */
-static const char *s_opts = "hn*peyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o*b*F:s:S:A*q:z:m:RECM:O*N:vG:";
-static struct long_options l_opts[] = {
-    { "help", no_arg, 'h' },
-    { "hel", no_arg, 'h' },
-    { "contents", optional_arg, 'n' },
-    { "properties", no_arg, 'p' },
-    { "superblock", no_arg, 'B' },
-    { "boot-block", no_arg, 'B' },
-    { "boot-bloc", no_arg, 'B' },
-    { "boot-blo", no_arg, 'B' },
-    { "boot-bl", no_arg, 'B' },
-    { "boot-b", no_arg, 'B' },
-    { "boot", no_arg, 'B' },
-    { "boo", no_arg, 'B' },
-    { "bo", no_arg, 'B' },
-    { "header", no_arg, 'H' },
-    { "heade", no_arg, 'H' },
-    { "head", no_arg, 'H' },
-    { "hea", no_arg, 'H' },
-    { "object-ids", no_arg, 'i' },
-    { "object-id", no_arg, 'i' },
-    { "object-i", no_arg, 'i' },
-    { "object", no_arg, 'i' },
-    { "objec", no_arg, 'i' },
-    { "obje", no_arg, 'i' },
-    { "obj", no_arg, 'i' },
-    { "ob", no_arg, 'i' },
-    { "version", no_arg, 'V' },
-    { "versio", no_arg, 'V' },
-    { "versi", no_arg, 'V' },
-    { "vers", no_arg, 'V' },
-    { "ver", no_arg, 'V' },
-    { "ve", no_arg, 'V' },
-    { "attribute", require_arg, 'a' },
-    { "attribut", require_arg, 'a' },
-    { "attribu", require_arg, 'a' },
-    { "attrib", require_arg, 'a' },
-    { "attri", require_arg, 'a' },
-    { "attr", require_arg, 'a' },
-    { "att", require_arg, 'a' },
-    { "at", require_arg, 'a' },
-    { "block", require_arg, 'k' },
-    { "bloc", require_arg, 'k' },
-    { "blo", require_arg, 'k' },
-    { "bl", require_arg, 'k' },
-    { "count", require_arg, 'c' },
-    { "coun", require_arg, 'c' },
-    { "cou", require_arg, 'c' },
-    { "co", require_arg, 'c' },
-    { "dataset", require_arg, 'd' },
-    { "datase", require_arg, 'd' },
-    { "datas", require_arg, 'd' },
-    { "datatype", require_arg, 't' },
-    { "datatyp", require_arg, 't' },
-    { "dataty", require_arg, 't' },
-    { "datat", require_arg, 't' },
-    { "filedriver", require_arg, 'f' },
-    { "filedrive", require_arg, 'f' },
-    { "filedriv", require_arg, 'f' },
-    { "filedri", require_arg, 'f' },
-    { "filedr", require_arg, 'f' },
-    { "filed", require_arg, 'f' },
-    { "file", require_arg, 'f' },
-    { "fil", require_arg, 'f' },
-    { "fi", require_arg, 'f' },
-    { "group", require_arg, 'g' },
-    { "grou", require_arg, 'g' },
-    { "gro", require_arg, 'g' },
-    { "gr", require_arg, 'g' },
-    { "output", optional_arg, 'o' },
-    { "outpu", optional_arg, 'o' },
-    { "outp", optional_arg, 'o' },
-    { "out", optional_arg, 'o' },
-    { "ou", optional_arg, 'o' },
-    { "soft-link", require_arg, 'l' },
-    { "soft-lin", require_arg, 'l' },
-    { "soft-li", require_arg, 'l' },
-    { "soft-l", require_arg, 'l' },
-    { "soft", require_arg, 'l' },
-    { "sof", require_arg, 'l' },
-    { "start", require_arg, 's' },
-    { "star", require_arg, 's' },
-    { "sta", require_arg, 's' },
-    { "stride", require_arg, 'S' },
-    { "strid", require_arg, 'S' },
-    { "string", no_arg, 'r' },
-    { "strin", no_arg, 'r' },
-    { "use-dtd", no_arg, 'u' },
-    { "use-dt", no_arg, 'u' },
-    { "use-d", no_arg, 'u' },
-    { "use-", no_arg, 'u' },
-    { "use", no_arg, 'u' },
-    { "us", no_arg, 'u' },
-    { "u", no_arg, 'u' },
-    { "width", require_arg, 'w' },
-    { "widt", require_arg, 'w' },
-    { "wid", require_arg, 'w' },
-    { "wi", require_arg, 'w' },
-    { "xml-dtd", require_arg, 'D' },
-    { "xml-dt", require_arg, 'D' },
-    { "xml-d", require_arg, 'D' },
-    { "xml-ns", require_arg, 'X' },
-    { "xml-n", require_arg, 'X' },
-    { "xml", no_arg, 'x' },
-    { "xm", no_arg, 'x' },
-    { "onlyattr", optional_arg, 'A' },
-    { "escape", no_arg, 'e' },
-    { "noindex", no_arg, 'y' },
-    { "binary", optional_arg, 'b' },
-    { "form", require_arg, 'F' },
-    { "sort_by", require_arg, 'q' },
-    { "sort_order", require_arg, 'z' },
-    { "format", require_arg, 'm' },
-    { "region", no_arg, 'R' },
-    { "enable-error-stack", no_arg, 'E' },
-    { "packed-bits", require_arg, 'M' },
-    { "no-compact-subset", no_arg, 'C' },
-    { "ddl", optional_arg, 'O' },
-    { "any_path", require_arg, 'N' },
-    { "vds-view-first-missing", no_arg, 'v' },
-    { "vds-gap-size", require_arg, 'G' },
-    { NULL, 0, '\0' }
-};
-
-

-/*-------------------------------------------------------------------------
- * Function:    leave
- *
- * Purpose:     Shutdown MPI & HDF5 and call exit()
- *
- * Return:      Does not return
- *
- * Programmer:  Quincey Koziol
- *              Saturday, 31. January 2004
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-leave(int ret)
-{
-    h5tools_close();
-
-    HDexit(ret);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    usage
- *
- * Purpose:     Print the usage message about dumper
- *
- * Return:      void
- *-------------------------------------------------------------------------
- */
-static void
-usage(const char *prog)
-{
-    FLUSHSTREAM(rawoutstream);
-    PRINTSTREAM(rawoutstream, "usage: %s [OPTIONS] files\n", prog);
-    PRINTVALSTREAM(rawoutstream, "  OPTIONS\n");
-    PRINTVALSTREAM(rawoutstream, "     -h,   --help         Print a usage message and exit\n");
-    PRINTVALSTREAM(rawoutstream, "     -V,   --version      Print version number and exit\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- File Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "     -n,   --contents     Print a list of the file contents and exit\n");
-    PRINTVALSTREAM(rawoutstream, "                          Optional value 1 also prints attributes.\n");
-    PRINTVALSTREAM(rawoutstream, "     -B,   --superblock   Print the content of the super block\n");
-    PRINTVALSTREAM(rawoutstream, "     -H,   --header       Print the header only; no data is displayed\n");
-    PRINTVALSTREAM(rawoutstream, "     -f D, --filedriver=D Specify which driver to open the file with\n");
-    PRINTVALSTREAM(rawoutstream, "     -o F, --output=F     Output raw data into file F\n");
-    PRINTVALSTREAM(rawoutstream, "     -b B, --binary=B     Binary file output, of form B\n");
-    PRINTVALSTREAM(rawoutstream, "     -O F, --ddl=F        Output ddl text into file F\n");
-    PRINTVALSTREAM(rawoutstream, "                          Use blank(empty) filename F to suppress ddl display\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Object Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "     -a P, --attribute=P  Print the specified attribute\n");
-    PRINTVALSTREAM(rawoutstream, "                          If an attribute name contains a slash (/), escape the\n");
-    PRINTVALSTREAM(rawoutstream, "                          slash with a preceding backslash (\\).\n");
-    PRINTVALSTREAM(rawoutstream, "                          (See example section below.)\n");
-    PRINTVALSTREAM(rawoutstream, "     -d P, --dataset=P    Print the specified dataset\n");
-    PRINTVALSTREAM(rawoutstream, "     -g P, --group=P      Print the specified group and all members\n");
-    PRINTVALSTREAM(rawoutstream, "     -l P, --soft-link=P  Print the value(s) of the specified soft link\n");
-    PRINTVALSTREAM(rawoutstream, "     -t P, --datatype=P   Print the specified named datatype\n");
-    PRINTVALSTREAM(rawoutstream, "     -N P, --any_path=P   Print any attribute, dataset, group, datatype, or link that matches P\n");
-    PRINTVALSTREAM(rawoutstream, "                          P can be the absolute path or just a relative path.\n");
-    PRINTVALSTREAM(rawoutstream, "     -A,   --onlyattr     Print the header and value of attributes\n");
-    PRINTVALSTREAM(rawoutstream, "                          Optional value 0 suppresses printing attributes.\n");
-    PRINTVALSTREAM(rawoutstream, "     --vds-view-first-missing Set the VDS bounds to first missing mapped elements.\n");
-    PRINTVALSTREAM(rawoutstream, "     --vds-gap-size=N     Set the missing file gap size, N=non-negative integers\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Object Property Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "     -i,   --object-ids   Print the object ids\n");
-    PRINTVALSTREAM(rawoutstream, "     -p,   --properties   Print dataset filters, storage layout and fill value\n");
-    PRINTVALSTREAM(rawoutstream, "     -M L, --packedbits=L Print packed bits as unsigned integers, using mask\n");
-    PRINTVALSTREAM(rawoutstream, "                          format L for an integer dataset specified with\n");
-    PRINTVALSTREAM(rawoutstream, "                          option -d. L is a list of offset,length values,\n");
-    PRINTVALSTREAM(rawoutstream, "                          separated by commas. Offset is the beginning bit in\n");
-    PRINTVALSTREAM(rawoutstream, "                          the data value and length is the number of bits of\n");
-    PRINTVALSTREAM(rawoutstream, "                          the mask.\n");
-    PRINTVALSTREAM(rawoutstream, "     -R,   --region       Print dataset pointed by region references\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Formatting Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "     -e,   --escape       Escape non printing characters\n");
-    PRINTVALSTREAM(rawoutstream, "     -r,   --string       Print 1-byte integer datasets as ASCII\n");
-    PRINTVALSTREAM(rawoutstream, "     -y,   --noindex      Do not print array indices with the data\n");
-    PRINTVALSTREAM(rawoutstream, "     -m T, --format=T     Set the floating point output format\n");
-    PRINTVALSTREAM(rawoutstream, "     -q Q, --sort_by=Q    Sort groups and attributes by index Q\n");
-    PRINTVALSTREAM(rawoutstream, "     -z Z, --sort_order=Z Sort groups and attributes by order Z\n");
-    PRINTVALSTREAM(rawoutstream, "     --enable-error-stack Prints messages from the HDF5 error stack as they\n");
-    PRINTVALSTREAM(rawoutstream, "                          occur.\n");
-    PRINTVALSTREAM(rawoutstream, "     --no-compact-subset  Disable compact form of subsetting and allow the use\n");
-    PRINTVALSTREAM(rawoutstream, "                          of \"[\" in dataset names.\n");
-    PRINTVALSTREAM(rawoutstream, "     -w N, --width=N      Set the number of columns of output. A value of 0 (zero)\n");
-    PRINTVALSTREAM(rawoutstream, "                          sets the number of columns to the maximum (65535).\n");
-    PRINTVALSTREAM(rawoutstream, "                          Default width is 80 columns.\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- XML Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "     -x,   --xml          Output in XML using Schema\n");
-    PRINTVALSTREAM(rawoutstream, "     -u,   --use-dtd      Output in XML using DTD\n");
-    PRINTVALSTREAM(rawoutstream, "     -D U, --xml-dtd=U    Use the DTD or schema at U\n");
-    PRINTVALSTREAM(rawoutstream, "     -X S, --xml-ns=S     (XML Schema) Use qualified names n the XML\n");
-    PRINTVALSTREAM(rawoutstream, "                          \":\": no namespace, default: \"hdf5:\"\n");
-    PRINTVALSTREAM(rawoutstream, "                          E.g., to dump a file called `-f', use h5dump -- -f\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Subsetting Options ---------------\n");
-    PRINTVALSTREAM(rawoutstream, " Subsetting is available by using the following options with a dataset\n");
-    PRINTVALSTREAM(rawoutstream, " option. Subsetting is done by selecting a hyperslab from the data.\n");
-    PRINTVALSTREAM(rawoutstream, " Thus, the options mirror those for performing a hyperslab selection.\n");
-    PRINTVALSTREAM(rawoutstream, " One of the START, COUNT, STRIDE, or BLOCK parameters are mandatory if you do subsetting.\n");
-    PRINTVALSTREAM(rawoutstream, " The STRIDE, COUNT, and BLOCK parameters are optional and will default to 1 in\n");
-    PRINTVALSTREAM(rawoutstream, " each dimension. START is optional and will default to 0 in each dimension.\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      -s START,  --start=START    Offset of start of subsetting selection\n");
-    PRINTVALSTREAM(rawoutstream, "      -S STRIDE, --stride=STRIDE  Hyperslab stride\n");
-    PRINTVALSTREAM(rawoutstream, "      -c COUNT,  --count=COUNT    Number of blocks to include in selection\n");
-    PRINTVALSTREAM(rawoutstream, "      -k BLOCK,  --block=BLOCK    Size of block in hyperslab\n");
-    PRINTVALSTREAM(rawoutstream, "  START, COUNT, STRIDE, and BLOCK - is a list of integers the number of which are equal to the\n");
-    PRINTVALSTREAM(rawoutstream, "      number of dimensions in the dataspace being queried\n");
-    PRINTVALSTREAM(rawoutstream, "      (Alternate compact form of subsetting is described in the Reference Manual)\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Option Argument Conventions ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "  D - is the file driver to use in opening the file. Acceptable values\n");
-    PRINTVALSTREAM(rawoutstream, "      are \"sec2\", \"family\", \"split\", \"multi\", \"direct\", and \"stream\". Without\n");
-    PRINTVALSTREAM(rawoutstream, "      the file driver flag, the file will be opened with each driver in\n");
-    PRINTVALSTREAM(rawoutstream, "      turn and in the order specified above until one driver succeeds\n");
-    PRINTVALSTREAM(rawoutstream, "      in opening the file.\n");
-    PRINTVALSTREAM(rawoutstream, "      See examples below for family, split, and multi driver special file name usage.\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  F - is a filename.\n");
-    PRINTVALSTREAM(rawoutstream, "  P - is the full path from the root group to the object.\n");
-    PRINTVALSTREAM(rawoutstream, "  N - is an integer greater than 1.\n");
-    PRINTVALSTREAM(rawoutstream, "  T - is a string containing the floating point format, e.g '%%.3f'\n");
-    PRINTVALSTREAM(rawoutstream, "  U - is a URI reference (as defined in [IETF RFC 2396],\n");
-    PRINTVALSTREAM(rawoutstream, "        updated by [IETF RFC 2732])\n");
-    PRINTVALSTREAM(rawoutstream, "  B - is the form of binary output: NATIVE for a memory type, FILE for the\n");
-    PRINTVALSTREAM(rawoutstream, "        file type, LE or BE for pre-existing little or big endian types.\n");
-    PRINTVALSTREAM(rawoutstream, "        Must be used with -o (output file) and it is recommended that\n");
-    PRINTVALSTREAM(rawoutstream, "        -d (dataset) is used. B is an optional argument, defaults to NATIVE\n");
-    PRINTVALSTREAM(rawoutstream, "  Q - is the sort index type. It can be \"creation_order\" or \"name\" (default)\n");
-    PRINTVALSTREAM(rawoutstream, "  Z - is the sort order type. It can be \"descending\" or \"ascending\" (default)\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "--------------- Examples ---------------\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  1) Attribute foo of the group /bar_none in file quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -a /bar_none/foo quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "     Attribute \"high/low\" of the group /bar_none in the file quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -a \"/bar_none/high\\/low\" quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  2) Selecting a subset from dataset /foo in file quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -s \"0,1\" -S \"1,1\" -c \"2,3\" -k \"2,2\" quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  3) Saving dataset 'dset' in file quux.h5 to binary file 'out.bin'\n");
-    PRINTVALSTREAM(rawoutstream, "        using a little-endian type\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -b LE -o out.bin quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  4) Display two packed bits (bits 0-1 and bits 4-6) in the dataset /dset\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -M 0,1,4,3 quux.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  5) Dataset foo in files file1.h5 file2.h5 file3.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo file1.h5 file2.h5 file3.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  6) Dataset foo in split files splitfile-m.h5 splitfile-r.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f split splitfile\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  7) Dataset foo in multi files mf-s.h5, mf-b.h5, mf-r.h5, mf-g.h5, mf-l.h5 and mf-o.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f multi mf\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "  8) Dataset foo in family files fam00000.h5 fam00001.h5 and fam00002.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f family fam%%05d.h5\n");
-    PRINTVALSTREAM(rawoutstream, "\n");
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: table_list_add
- *
- * Purpose: Add a new set of tables
- *
- * Return: index of added table on success, -1 on failure
- *
- * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
- *             Adapted from trav_addr_add in h5trav.c by Quincey Koziol
- *
- * Date: October 13, 2008
- *
- *-------------------------------------------------------------------------
- */
-ssize_t
-table_list_add(hid_t oid, unsigned long file_no)
-{
-    size_t      idx;         /* Index of table to use */
-    find_objs_t info;
-
-    /* Allocate space if necessary */
-    if(table_list.nused == table_list.nalloc) {
-        h5dump_table_items_t    *tmp_ptr;
-
-        table_list.nalloc = MAX(1, table_list.nalloc * 2);
-        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 */
-
-    /* Append it */
-    idx = table_list.nused++;
-    table_list.tables[idx].fileno = file_no;
-    table_list.tables[idx].oid = oid;
-    if(H5Iinc_ref(oid) < 0) {
-        table_list.nused--;
-        return -1;
-    }
-    if(init_objs(oid, &info, &table_list.tables[idx].group_table,
-                 &table_list.tables[idx].dset_table, &table_list.tables[idx].type_table) < 0) {
-        H5Idec_ref(oid);
-        table_list.nused--;
-        return -1;
-    }
-
-#ifdef H5DUMP_DEBUG
-    dump_tables(&info);
-#endif /* H5DUMP_DEBUG */
-
-    return((ssize_t) idx);
-} /* end table_list_add() */
-
-

-/*-------------------------------------------------------------------------
- * Function: table_list_visited
- *
- * Purpose: Check if a table already exists for the specified fileno
- *
- * Return: The index of the matching table, or -1 if no matches found
- *
- * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
- *             Adapted from trav_addr_visited in h5trav.c by Quincey Koziol
- *
- * Date: October 13, 2008
- *
- *-------------------------------------------------------------------------
- */
-ssize_t
-table_list_visited(unsigned long file_no)
-{
-    size_t u;           /* Local index variable */
-
-    /* Look for table */
-    for(u = 0; u < table_list.nused; u++)
-        /* Check for fileno value already in array */
-        if(table_list.tables[u].fileno == file_no)
-            return((ssize_t) u);
-
-    /* Didn't find table */
-    return(-1);
-} /* end table_list_visited() */
-
-

-/*-------------------------------------------------------------------------
- * Function: table_list_free
- *
- * Purpose: Frees the table list
- *
- * Return: void
- *
- * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
- *
- * Date: October 13, 2008
- *
- *-------------------------------------------------------------------------
- */
-static void
-table_list_free(void)
-{
-    size_t u;           /* Local index variable */
-
-    /* Iterate over tables */
-    for(u = 0; u < table_list.nused; u++) {
-        /* Release object id */
-        if(H5Idec_ref(table_list.tables[u].oid) < 0)
-            h5tools_setstatus(EXIT_FAILURE);
-
-        /* Free each table */
-        free_table(table_list.tables[u].group_table);
-        HDfree(table_list.tables[u].group_table);
-        free_table(table_list.tables[u].dset_table);
-        HDfree(table_list.tables[u].dset_table);
-        free_table(table_list.tables[u].type_table);
-        HDfree(table_list.tables[u].type_table);
-    }
-
-    /* Free the table list */
-    HDfree(table_list.tables);
-    table_list.tables = NULL;
-    table_list.nalloc = table_list.nused = 0;
-} /* end table_list_free() */
-
-/*-------------------------------------------------------------------------
- * Function:    set_binary_form
- *
- * Purpose: set the binary form of output by translating from a string input
- *          parameter to a integer return value
- *
- * Return: integer form of binary output or -1 if none found
- *
- * Programmer:  Pedro Vicente Nunes
- *             June 28, 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-set_binary_form(const char *form)
-{
-    int bform = -1;
-
-    if (HDstrcmp(form,"NATIVE") == 0 || HDstrcmp(form,"MEMORY") == 0) {
-        /* native form */
-        bform = 0;
-    }
-    else if (HDstrcmp(form,"FILE") == 0) /* file type form */
-        bform = 1;
-    else if (HDstrcmp(form,"LE") == 0) /* convert to little endian */
-        bform = 2;
-    else if (HDstrcmp(form,"BE") == 0) /* convert to big endian */
-        bform = 3;
-
-    return bform;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    set_sort_by
- *
- * Purpose: set the "by" form of sorting by translating from a string input
- *          parameter to a H5_index_t return value
- *          current sort values are [creation_order | name]
- *
- * Return: H5_index_t form of sort or H5_INDEX_UNKNOWN if none found
- *
- * Programmer:  Pedro Vicente Nunes
- *              October 1, 2007
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static H5_index_t
-set_sort_by(const char *form)
-{
-    H5_index_t idx_type = H5_INDEX_UNKNOWN;
-
-    if (HDstrcmp(form,"name")==0) /* H5_INDEX_NAME */
-        idx_type = H5_INDEX_NAME;
-    else if (HDstrcmp(form,"creation_order")==0) /* H5_INDEX_CRT_ORDER */
-        idx_type = H5_INDEX_CRT_ORDER;
-
-    return idx_type;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    set_sort_order
- *
- * Purpose: set the order of sorting by translating from a string input
- *          parameter to a H5_iter_order_t return value
- *          current order values are [ascending | descending ]
- *
- * Return: H5_iter_order_t form of order or H5_ITER_UNKNOWN if none found
- *
- * Programmer:  Pedro Vicente Nunes
- *              October 1, 2007
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static H5_iter_order_t
-set_sort_order(const char *form)
-{
-    H5_iter_order_t iter_order = H5_ITER_UNKNOWN;
-
-    if (HDstrcmp(form,"ascending")==0) /* H5_ITER_INC */
-        iter_order = H5_ITER_INC;
-    else if (HDstrcmp(form,"descending")==0) /* H5_ITER_DEC */
-        iter_order = H5_ITER_DEC;
-
-    return iter_order;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_hsize_list
- *
- * Purpose:     Parse a list of comma or space separated integers and return
- *              them in a list. The string being passed into this function
- *              should be at the start of the list you want to parse. You are
- *              responsible for freeing the array returned from here.
- *
- *              Lists in the so-called "terse" syntax are separated by
- *              semicolons (;). The lists themselves can be separated by
- *              either commas (,) or white spaces.
- *
- * Return:      <none>
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 6. February 2001
- *
- *-------------------------------------------------------------------------
- */
-static void
-parse_hsize_list(const char *h_list, subset_d *d)
-{
-    hsize_t        *p_list;
-    const char     *ptr;
-    unsigned int    size_count = 0;
-    unsigned int    i = 0;
-    unsigned int    last_digit = 0;
-
-    if (!h_list || !*h_list || *h_list == ';')
-        return;
-
-    /* count how many integers do we have */
-    for (ptr = h_list; ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
-        if (HDisdigit(*ptr)) {
-            if (!last_digit)
-                /* the last read character wasn't a digit */
-                size_count++;
-
-            last_digit = 1;
-        }
-        else {
-            last_digit = 0;
-        }
-
-    if (size_count == 0)
-        /* there aren't any integers to read */
-        return;
-
-    /* allocate an array for the integers in the list */
-    p_list = (hsize_t *)HDcalloc(size_count, sizeof(hsize_t));
-
-    for (ptr = h_list; i < size_count && ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
-        if(HDisdigit(*ptr)) {
-            /* we should have an integer now */
-            p_list[i++] = (hsize_t)HDatof(ptr);
-
-            while (HDisdigit(*ptr))
-                /* scroll to end of integer */
-                ptr++;
-        }
-    d->data = p_list;
-    d->len = size_count;
-
-    return;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_subset_params
- *
- * Purpose:     Parse the so-called "terse" syntax for specifying subsetting
- *              parameters.
- *
- * Return:      Success:    struct subset_t object
- *              Failure:    NULL
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 6. February 2001
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static struct subset_t *
-parse_subset_params(char *dset)
-{
-    struct subset_t *s = NULL;
-    register char   *brace;
-
-    if (!disable_compact_subset && ((brace = HDstrrchr(dset, '[')) != NULL)) {
-        *brace++ = '\0';
-
-        s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
-        parse_hsize_list(brace, &s->start);
-
-        while (*brace && *brace != ';')
-            brace++;
-
-        if (*brace) brace++;
-
-        parse_hsize_list(brace, &s->stride);
-
-        while (*brace && *brace != ';')
-            brace++;
-
-        if (*brace) brace++;
-
-        parse_hsize_list(brace, &s->count);
-
-        while (*brace && *brace != ';')
-            brace++;
-
-        if (*brace) brace++;
-
-        parse_hsize_list(brace, &s->block);
-    }
-
-    return s;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_mask_list
- *
- * Purpose:     Parse a list of comma or space separated integers and fill
- *              the packed_bits list and counter. The string being passed into this function
- *              should be at the start of the list you want to parse.
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- *
- *-------------------------------------------------------------------------
- */
-static int
-parse_mask_list(const char *h_list)
-{
-    int                offset_value;
-    int                length_value;
-    unsigned long long temp_mask;
-    const char        *ptr = NULL;
-
-    /* sanity check */
-    HDassert(h_list);
-
-    HDmemset(packed_mask,0,sizeof(packed_mask));
-
-    packed_bits_num = 0;
-    /* scan in pair of offset,length separated by commas. */
-    ptr = h_list;
-    while (*ptr) {
-        /* scan for an offset which is an unsigned int */
-        if (!HDisdigit(*ptr)) {
-            error_msg("Bad mask list(%s)\n", h_list);
-            return FAIL;
-        }
-        offset_value = HDatoi(ptr);
-        if (offset_value < 0 || offset_value >= PACKED_BITS_SIZE_MAX) {
-            error_msg("Packed Bit offset value(%d) must be between 0 and %d\n",
-                    offset_value, PACKED_BITS_SIZE_MAX - 1);
-            return FAIL;
-        }
-
-        /* skip to end of integer */
-        while (HDisdigit(*++ptr))
-            ;
-        /* Look for the common separator */
-        if (*ptr++ != ',') {
-            error_msg("Bad mask list(%s), missing expected comma separator.\n", h_list);
-            return FAIL;
-        }
-
-        /* scan for a length which is a positive int */
-        if (!HDisdigit(*ptr)) {
-            error_msg("Bad mask list(%s)\n", h_list);
-            return FAIL;
-        }
-        length_value = HDatoi(ptr);
-        if (length_value <= 0) {
-            error_msg("Packed Bit length value(%d) must be positive.\n", length_value);
-            return FAIL;
-        }
-        if ((offset_value + length_value) > PACKED_BITS_SIZE_MAX){
-            error_msg("Packed Bit offset+length value(%d) too large. Max is %d\n",
-                       offset_value+length_value, PACKED_BITS_SIZE_MAX);
-            return FAIL;
-        }
-
-        /* skip to end of int */
-        while (HDisdigit(*++ptr))
-            ;
-
-        /* store the offset,length pair */
-        if (packed_bits_num >= PACKED_BITS_MAX) {
-            /* too many requests */
-            error_msg("Too many masks requested (max. %d). Mask list(%s)\n", PACKED_BITS_MAX, h_list);
-            return FAIL;
-        }
-        packed_offset[packed_bits_num] = offset_value;
-        packed_length[packed_bits_num] = length_value;
-        /* create the bit mask by left shift 1's by length, then negate it. */
-        /* After packed_mask is calculated, packed_length is not needed but  */
-        /* keep it for debug purpose. */
-        temp_mask = ~0L;
-        if(length_value<8*sizeof(unsigned long long)) {
-            temp_mask = temp_mask << length_value;
-            packed_mask[packed_bits_num] = ~temp_mask;
-        }
-        else
-            packed_mask[packed_bits_num] = temp_mask;
-        packed_bits_num++;
-
-        /* skip a possible comma separator */
-        if (*ptr == ',') {
-            if (!(*++ptr)) {
-                /* unexpected end of string */
-                error_msg("Bad mask list(%s), unexpected end of string.\n", h_list);
-                return FAIL;
-            }
-        }
-    }
-    HDassert(packed_bits_num <= PACKED_BITS_MAX);
-    if (packed_bits_num == 0) {
-        /* got no masks! */
-        error_msg("Bad mask list(%s)\n", h_list);
-        return FAIL;
-    }
-    return SUCCEED;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    free_handler
- *
- * Purpose:     Convenience function to free the handler_t structures. Needs a
- *              length variable (LEN) to know how many in the array it needs
- *              to free
- *
- * Return:      Nothing
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 20. February 2001
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-free_handler(struct handler_t *hand, int len)
-{
-    int i;
-
-    if(hand) {
-        for (i = 0; i < len; i++) {
-            if(hand[i].obj) {
-                HDfree(hand[i].obj);
-                hand[i].obj=NULL;
-            }
-
-            if (hand[i].subset_info) {
-                if(hand[i].subset_info->start.data)
-                    HDfree(hand[i].subset_info->start.data);
-                if(hand[i].subset_info->stride.data)
-                    HDfree(hand[i].subset_info->stride.data);
-                if(hand[i].subset_info->count.data)
-                    HDfree(hand[i].subset_info->count.data);
-                if(hand[i].subset_info->block.data)
-                    HDfree(hand[i].subset_info->block.data);
-
-                HDfree(hand[i].subset_info);
-                hand[i].subset_info=NULL;
-            }
-        }
-
-        HDfree(hand);
-    }
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    parse_command_line
- *
- * Purpose:     Parse the command line for the h5dumper.
- *
- * Return:      Success:    A pointer to an array of handler_t structures.
- *                          These contain all the information needed to dump
- *                          the necessary object.
- *
- *              Failure:    Exits program with EXIT_FAILURE value.
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 20. February 2001
- *
- * Modifications:
- *  pvn June, 1, 2006. Add a switch for binary output
- *
- *-------------------------------------------------------------------------
- */
-static struct handler_t *
-parse_command_line(int argc, const char *argv[])
-{
-    struct handler_t   *hand = NULL;
-    struct handler_t   *last_dset = NULL;
-    int                 i;
-    int                 opt;
-    int                 last_was_dset = FALSE;
-
-     /* no arguments */
-    if (argc == 1) {
-        usage(h5tools_getprogname());
-        goto error;
-    }
-
-    /* this will be plenty big enough to hold the info */
-    if((hand = (struct handler_t *)HDcalloc((size_t)argc, sizeof(struct handler_t)))==NULL) {
-        goto error;
-    }
-
-    /* parse command line options */
-    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
-parse_start:
-        switch ((char)opt) {
-        case 'R':
-            display_region = TRUE;
-            region_output = TRUE;
-            break;
-        case 'B':
-            display_bb = TRUE;
-            last_was_dset = FALSE;
-            break;
-        case 'n':
-            display_fi = TRUE;
-            last_was_dset = FALSE;
-            if ( opt_arg != NULL) {
-                h5trav_set_verbose(HDatoi(opt_arg));
-            }
-            break;
-        case 'p':
-            display_dcpl = TRUE;
-            break;
-        case 'y':
-            display_ai = FALSE;
-            break;
-        case 'e':
-            display_escape = TRUE;
-            break;
-        case 'H':
-            display_data = FALSE;
-            display_attr_data = FALSE;
-            last_was_dset = FALSE;
-            break;
-        case 'A':
-            if ( opt_arg != NULL) {
-                if(0 == HDatoi(opt_arg)) include_attrs = FALSE;
-            }
-            else {
-                display_data = FALSE;
-                display_attr_data = TRUE;
-                last_was_dset = FALSE;
-            }
-            break;
-        case 'i':
-            display_oid = TRUE;
-            last_was_dset = FALSE;
-            break;
-        case 'r':
-            display_char = TRUE;
-            break;
-        case 'V':
-            print_version(h5tools_getprogname());
-            free_handler(hand, argc);
-            hand = NULL;
-            h5tools_setstatus(EXIT_SUCCESS);
-            goto done;
-            break;
-        case 'w':
-            h5tools_nCols = HDatoi(opt_arg);
-            if (h5tools_nCols <= 0) {
-                h5tools_nCols = 65535;
-            }
-            last_was_dset = FALSE;
-            break;
-        case 'N':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_paths;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    break;
-                }
-
-            last_was_dset = FALSE;
-            break;
-        case 'a':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_attributes;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    break;
-                }
-
-            last_was_dset = FALSE;
-            break;
-        case 'd':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_datasets;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    hand[i].subset_info = parse_subset_params(hand[i].obj);
-                    last_dset = &hand[i];
-                    break;
-                }
-
-            last_was_dset = TRUE;
-            break;
-        case 'f':
-            driver = opt_arg;
-            break;
-        case 'g':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_groups;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    break;
-                }
-
-            last_was_dset = FALSE;
-            break;
-        case 'l':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_links;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    break;
-                }
-
-            last_was_dset = FALSE;
-            break;
-        case 't':
-            display_all = 0;
-
-            for (i = 0; i < argc; i++)
-                if (!hand[i].func) {
-                    hand[i].func = handle_datatypes;
-                    hand[i].obj = HDstrdup(opt_arg);
-                    break;
-                }
-
-            last_was_dset = FALSE;
-            break;
-
-        case 'O':
-            if (h5tools_set_output_file(opt_arg, 0) < 0) {
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            break;
-
-        case 'o':
-            if ( bin_output ) {
-                if (h5tools_set_data_output_file(opt_arg, 1) < 0) {
-                    usage(h5tools_getprogname());
-                    goto error;
-                }
-            }
-            else {
-                if(display_attr_data && !display_data) {
-                    if (h5tools_set_attr_output_file(opt_arg, 0) < 0) {
-                        usage(h5tools_getprogname());
-                        goto error;
-                    }
-                }
-                if(display_data || display_all) {
-                    if (h5tools_set_data_output_file(opt_arg, 0) < 0) {
-                        usage(h5tools_getprogname());
-                        goto error;
-                    }
-                }
-            }
-
-            usingdasho = TRUE;
-            last_was_dset = FALSE;
-            outfname = opt_arg;
-            break;
-
-        case 'b':
-            if ( opt_arg != NULL) {
-                if ( ( bin_form = set_binary_form(opt_arg)) < 0) {
-                    /* failed to set binary form */
-                    usage(h5tools_getprogname());
-                    goto error;
-                }
-            }
-            bin_output = TRUE;
-            if (outfname!=NULL) {
-                if (h5tools_set_data_output_file(outfname, 1) < 0)  {
-                    /* failed to set output file */
-                    usage(h5tools_getprogname());
-                    goto error;
-                }
-
-                last_was_dset = FALSE;
-            }
-            break;
-
-        case 'q':
-            if ( ( sort_by = set_sort_by(opt_arg)) < 0) {
-                /* failed to set "sort by" form */
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            break;
-
-        case 'z':
-            if ( ( sort_order = set_sort_order(opt_arg)) < 0) {
-                /* failed to set "sort order" form */
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            break;
-
-        case 'M':
-            if (!last_was_dset) {
-                error_msg("option `-%c' can only be used after --dataset option\n", opt);
-                goto error;
-            }
-            if (parse_mask_list(opt_arg) != SUCCEED){
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            display_packed_bits = TRUE;
-            break;
-        case 'v':
-            display_vds_first = TRUE;
-            break;
-        case 'G':
-            vds_gap_size = HDatoi(opt_arg);
-            if (vds_gap_size < 0) {
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            break;
-
-        /** begin XML parameters **/
-        case 'x':
-            /* select XML output */
-            doxml = TRUE;
-            useschema = TRUE;
-            h5tools_dump_header_format = NULL;
-            dump_function_table = &xml_function_table;
-            h5tools_nCols = 0;
-            break;
-        case 'u':
-            doxml = TRUE;
-            useschema = FALSE;
-            xmlnsprefix = "";
-            h5tools_dump_header_format = NULL;
-            dump_function_table = &xml_function_table;
-            h5tools_nCols = 0;
-            break;
-        case 'D':
-            /* specify alternative XML DTD or schema */
-            /* To Do: check format of this value?  */
-            xml_dtd_uri = opt_arg;
-            h5tools_nCols = 0;
-            break;
-
-        case 'm':
-            /* specify alternative floating point printing format */
-            fp_format = opt_arg;
-            h5tools_nCols = 0;
-            break;
-
-        case 'X':
-            /* specify XML namespace (default="hdf5:"), or none */
-            /* To Do: check format of this value?  */
-            if (!useschema) {
-                usage(h5tools_getprogname());
-                goto error;
-            }
-            if (HDstrcmp(opt_arg,":") == 0) {
-                xmlnsprefix = "";
-            }
-            else {
-                xmlnsprefix = opt_arg;
-            }
-            h5tools_nCols = 0;
-            break;
-        /** end XML parameters **/
-
-        /** begin subsetting parameters **/
-        case 's':
-        case 'S':
-        case 'c':
-        case 'k': {
-            struct subset_t *s;
-
-            if (!last_was_dset) {
-                error_msg("option `-%c' can only be used after --dataset option\n", opt);
-                goto error;
-            }
-
-            if (last_dset->subset_info) {
-                /*
-                 * This overrides the "terse" syntax if they actually mixed
-                 * the two.
-                 */
-                s = last_dset->subset_info;
-            }
-            else {
-                last_dset->subset_info = s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
-            }
-
-            /*
-             * slightly convoluted, but...we are only interested in options
-             * for subsetting: "--start", "--stride", "--count", and "--block"
-             * which can come in any order. If we run out of parameters (EOF)
-             * or run into one which isn't a subsetting parameter (NOT s, S,
-             * c, or K), then we exit the do-while look, set the subset_info
-             * to the structure we've been filling. If we've reached the end
-             * of the options, we exit the parsing (goto parse_end) otherwise,
-             * since we've "read" the next option, we need to parse it. So we
-             * jump to the beginning of the switch statement (goto parse_start).
-             */
-            do {
-                switch ((char)opt) {
-                case 's':
-                    if (s->start.data) {
-                        HDfree(s->start.data);
-                        s->start.data = NULL;
-                    }
-                    parse_hsize_list(opt_arg, &s->start);
-                    break;
-                case 'S':
-                    if (s->stride.data) {
-                        HDfree(s->stride.data);
-                        s->stride.data = NULL;
-                    }
-                    parse_hsize_list(opt_arg, &s->stride);
-                    break;
-                case 'c':
-                    if (s->count.data) {
-                        HDfree(s->count.data);
-                        s->count.data = NULL;
-                    }
-                    parse_hsize_list(opt_arg, &s->count);
-                    break;
-                case 'k':
-                    if (s->block.data) {
-                        HDfree(s->block.data);
-                        s->block.data = NULL;
-                    }
-                    parse_hsize_list(opt_arg, &s->block);
-                    break;
-                default:
-                    goto end_collect;
-                }
-            } while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF);
-
-end_collect:
-            last_was_dset = FALSE;
-
-            if (opt != EOF)
-                goto parse_start;
-            else
-                goto parse_end;
-        }
-        /** end subsetting parameters **/
-
-        case 'E':
-            enable_error_stack = TRUE;
-            break;
-        case 'C':
-            disable_compact_subset = TRUE;
-            break;
-        case 'h':
-            usage(h5tools_getprogname());
-            free_handler(hand, argc);
-            hand = NULL;
-            h5tools_setstatus(EXIT_SUCCESS);
-            goto done;
-        case '?':
-        default:
-            usage(h5tools_getprogname());
-            goto error;
-        }
-    }
-
-parse_end:
-    /* check for file name to be processed */
-    if (argc <= opt_ind) {
-        error_msg("missing file name\n");
-        usage(h5tools_getprogname());
-        goto error;
-    }
-done:
-    return hand;
-
-error:
-    if (hand) {
-        free_handler(hand, argc);
-        hand = NULL;
-    }
-    h5tools_setstatus(EXIT_FAILURE);
-
-    return hand;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    main
- *
- * Purpose:     HDF5 dumper
- *
- * Return:      Success:    0
- *              Failure:    1
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *        Albert Cheng
- *        30. September 2000
- *        Add the -o option--output file for datasets raw data
- *
- *        REMcG
- *        November 2000
- *        Changes to support XML.
- *
- *        Bill Wendling
- *        Wednesday, 10. January 2001
- *        Modified the way command line parameters are interpreted. They go
- *        through one function call now (get_option).
- *
- *        Bill Wendling
- *        Tuesday, 20. February 2001
- *        Moved command line parsing to separate function. Made various
- *        "display_*" flags global.
- *
- *        REMcG
- *        August 2003
- *        Major upgrade to XML support.
- *
- *        Pedro Vicente
- *        September 2007
- *        list objects in requested order (creation order or alphabetically)
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, const char *argv[])
-{
-    hid_t               fid = -1;
-    hid_t               gid = -1;
-    H5E_auto2_t         func;
-    H5E_auto2_t         tools_func;
-    H5O_info_t          oi;
-    struct handler_t   *hand = NULL;
-    int                 i;
-    unsigned            u;
-    void               *edata;
-    void               *tools_edata;
-    char               *fname = NULL;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-    h5tools_dump_header_format = &h5tools_standardformat;
-    dump_function_table = &ddl_function_table;
-    dump_indent = 0;
-
-    /* Disable error reporting */
-    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
-    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    /* Disable tools error reporting */
-    H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
-    H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL);
-
-    if((hand = parse_command_line(argc, argv))==NULL) {
-        goto done;
-    }
-
-    if (bin_output && outfname == NULL) {
-        error_msg("binary output requires a file name, use -o <filename>\n");
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    if (enable_error_stack) {
-        H5Eset_auto2(H5E_DEFAULT, func, edata);
-        H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata);
-    }
-
-    /* Check for conflicting options */
-    if (doxml) {
-        if (!display_all) {
-            error_msg("option \"%s\" not available for XML\n",
-                    "to display selected objects");
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        else if (display_bb) {
-            error_msg("option \"%s\" not available for XML\n", "--boot-block");
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        else if (display_oid == 1) {
-            error_msg("option \"%s\" not available for XML\n", "--object-ids");
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        else if (display_char == TRUE) {
-            error_msg("option \"%s\" not available for XML\n", "--string");
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        else if (usingdasho) {
-            error_msg("option \"%s\" not available for XML\n", "--output");
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-    }
-    else {
-        if (xml_dtd_uri) {
-            warn_msg("option \"%s\" only applies with XML: %s\n", "--xml-dtd", xml_dtd_uri);
-        }
-    }
-
-    if (argc <= opt_ind) {
-        error_msg("missing file name\n");
-        usage(h5tools_getprogname());
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-    /* Initialize indexing options */
-    h5trav_set_index(sort_by, sort_order);
-
-    while(opt_ind < argc) {
-        fname = HDstrdup(argv[opt_ind++]);
-
-        fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, driver, NULL, 0);
-
-        if (fid < 0) {
-            error_msg("unable to open file \"%s\"\n", fname);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-
-        /* allocate and initialize internal data structure */
-        init_prefix(&prefix, prefix_len);
-
-        /* Prepare to find objects that might be targets of a reference */
-        fill_ref_path_table(fid);
-
-        if(doxml) {
-            /* initialize XML */
-            /* reset prefix! */
-            HDstrcpy(prefix, "");
-
-            /* make sure the URI is initialized to something */
-            if (xml_dtd_uri == NULL) {
-                if (useschema) {
-                    xml_dtd_uri = DEFAULT_XSD;
-                }
-                else {
-                    xml_dtd_uri = DEFAULT_DTD;
-                    xmlnsprefix = "";
-                }
-            }
-            else {
-                if (useschema && HDstrcmp(xmlnsprefix,"")) {
-                    error_msg("Cannot set Schema URL for a qualified namespace--use -X or -U option with -D \n");
-                    h5tools_setstatus(EXIT_FAILURE);
-                    goto done;
-                }
-            }
-        }
-
-        /* Get object info for root group */
-        if(H5Oget_info_by_name(fid, "/", &oi, H5P_DEFAULT) < 0) {
-            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-
-        /* Initialize object tables */
-        if(table_list_add(fid, oi.fileno) < 0) {
-            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        group_table = table_list.tables[0].group_table;
-        dset_table = table_list.tables[0].dset_table;
-        type_table = table_list.tables[0].type_table;
-
-        /* does there exist unamed committed datatype */
-        for (u = 0; u < type_table->nobjs; u++)
-            if (!type_table->objs[u].recorded) {
-                unamedtype = 1;
-                break;
-            } /* end if */
-
-        /* start to dump - display file header information */
-        if (!doxml) {
-            begin_obj(h5tools_dump_header_format->filebegin, fname, h5tools_dump_header_format->fileblockbegin);
-        }
-        else {
-            PRINTVALSTREAM(rawoutstream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-
-            /* alternative first element, depending on schema or DTD. */
-            if (useschema) {
-                if (HDstrcmp(xmlnsprefix,"") == 0) {
-                    PRINTSTREAM(rawoutstream, "<HDF5-File xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"%s\">\n",
-                            xml_dtd_uri);
-                }
-                else {
-                    /*  TO DO: make -url option work in this case (may need new option) */
-                    char *ns;
-                    char *indx;
-
-                    ns = HDstrdup(xmlnsprefix);
-                    indx = HDstrrchr(ns,(int)':');
-                    if (indx) *indx = '\0';
-
-                    PRINTSTREAM(rawoutstream, "<%sHDF5-File xmlns:%s=\"http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd\" "
-                            "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\">\n",xmlnsprefix,ns);
-                    HDfree(ns);
-                }
-            }
-            else {
-                PRINTSTREAM(rawoutstream, "<!DOCTYPE HDF5-File PUBLIC \"HDF5-File.dtd\" \"%s\">\n", xml_dtd_uri);
-                PRINTVALSTREAM(rawoutstream, "<HDF5-File>\n");
-            }
-        }
-
-        if (!doxml) {
-            if (display_fi) {
-                PRINTVALSTREAM(rawoutstream, "\n");
-                dump_fcontents(fid);
-                end_obj(h5tools_dump_header_format->fileend,h5tools_dump_header_format->fileblockend);
-                PRINTVALSTREAM(rawoutstream, "\n");
-                goto done;
-            }
-
-            if (display_bb)
-                dump_fcpl(fid);
-        }
-
-        if(display_all) {
-            if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
-                error_msg("unable to open root group\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            }
-            else {
-                if (!doxml)
-                    dump_indent += COL;
-                dump_function_table->dump_group_function(gid, "/" );
-                if (!doxml)
-                    dump_indent -= COL;
-                PRINTVALSTREAM(rawoutstream, "\n");
-            }
-
-            if(H5Gclose(gid) < 0) {
-                error_msg("unable to close root group\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            }
-
-        }
-        else {
-            /* Note: this option is not supported for XML */
-            if(doxml) {
-                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-                h5tools_setstatus(EXIT_FAILURE);
-                goto done;
-            } /* end if */
-
-            for(i = 0; i < argc; i++) {
-                if(hand[i].func) {
-                    hand[i].func(fid, hand[i].obj, hand[i].subset_info, 1, NULL);
-                }
-            }
-            PRINTVALSTREAM(rawoutstream, "\n");
-        }
-
-        if (!doxml) {
-            end_obj(h5tools_dump_header_format->fileend, h5tools_dump_header_format->fileblockend);
-            PRINTVALSTREAM(rawoutstream, "\n");
-        }
-        else {
-            PRINTSTREAM(rawoutstream, "</%sHDF5-File>\n", xmlnsprefix);
-        }
-        /* Free tables for objects */
-        table_list_free();
-
-        if(fid >=0)
-            if (H5Fclose(fid) < 0)
-                h5tools_setstatus(EXIT_FAILURE);
-
-        if(prefix) {
-            HDfree(prefix);
-            prefix = NULL;
-        }
-        if(fname) {
-            HDfree(fname);
-            fname = NULL;
-        }
-    } /* end while */
-
-    if(hand)
-        free_handler(hand, argc);
-
-    /* To Do:  clean up XML table */
-
-    leave(h5tools_getstatus());
-
-done:
-    /* Free tables for objects */
-    table_list_free();
-
-    if(fid >=0)
-        if (H5Fclose(fid) < 0)
-            h5tools_setstatus(EXIT_FAILURE);
-
-    if(prefix) {
-        HDfree(prefix);
-        prefix = NULL;
-    }
-    if(fname) {
-        HDfree(fname);
-        fname = NULL;
-    }
-
-    if(hand)
-        free_handler(hand, argc);
-
-    /* To Do:  clean up XML table */
-
-    H5Eset_auto2(H5E_DEFAULT, func, edata);
-
-    leave(h5tools_getstatus());
-}
-
-/*-------------------------------------------------------------------------
- * Function:    h5_fileaccess
- *
- * Purpose: Returns a file access template which is the default template
- *      but with a file driver set according to the constant or
- *      environment variable HDF5_DRIVER
- *
- * Return:  Success:    A file access property list
- *
- *      Failure:    -1
- *
- * Programmer:  Robb Matzke
- *              Thursday, November 19, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-hid_t
-h5_fileaccess(void)
-{
-    static const char *multi_letters = "msbrglo";
-    const char  *val = NULL;
-    const char  *name;
-    char         s[1024];
-    hid_t        fapl = -1;
-
-    /* First use the environment variable, then the constant */
-    val = HDgetenv("HDF5_DRIVER");
-#ifdef HDF5_DRIVER
-    if (!val) val = HDF5_DRIVER;
-#endif
-
-    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1;
-    if (!val || !*val) return fapl; /*use default*/
-
-    HDstrncpy(s, val, sizeof s);
-    s[sizeof(s)-1] = '\0';
-    if (NULL==(name=HDstrtok(s, " \t\n\r"))) return fapl;
-
-    if (!HDstrcmp(name, "sec2")) {
-        /* Unix read() and write() system calls */
-        if (H5Pset_fapl_sec2(fapl)<0) return -1;
-    }
-    else if (!HDstrcmp(name, "stdio")) {
-        /* Standard C fread() and fwrite() system calls */
-        if (H5Pset_fapl_stdio(fapl)<0) return -1;
-    }
-    else if (!HDstrcmp(name, "core")) {
-        /* In-core temporary file with 1MB increment */
-        if (H5Pset_fapl_core(fapl, 1024*1024, FALSE)<0) return -1;
-    }
-    else if (!HDstrcmp(name, "split")) {
-        /* Split meta data and raw data each using default driver */
-        if (H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT) < 0)
-            return -1;
-    }
-    else if (!HDstrcmp(name, "multi")) {
-        /* Multi-file driver, general case of the split driver */
-        H5FD_mem_t      memb_map[H5FD_MEM_NTYPES];
-        hid_t           memb_fapl[H5FD_MEM_NTYPES];
-        const char     *memb_name[H5FD_MEM_NTYPES];
-        char            sv[H5FD_MEM_NTYPES][1024];
-        haddr_t         memb_addr[H5FD_MEM_NTYPES];
-        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);
-
-        HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
-        for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
-            memb_fapl[mt] = H5P_DEFAULT;
-            memb_map[mt] = mt;
-            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
-            memb_name[mt] = sv[mt];
-            memb_addr[mt] = MAX(mt-1,0)*(HADDR_MAX/10);
-        }
-
-        if (H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0)
-            return -1;
-    }
-    else if (!HDstrcmp(name, "family")) {
-        hsize_t fam_size = 100*1024*1024; /*100 MB*/
-
-        /* Family of files, each 1MB and using the default driver */
-        if ((val=HDstrtok(NULL, " \t\n\r")))
-            fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024);
-        if (H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT)<0)
-            return -1;
-    }
-    else if (!HDstrcmp(name, "log")) {
-        long log_flags = H5FD_LOG_LOC_IO;
-
-        /* Log file access */
-        if ((val = HDstrtok(NULL, " \t\n\r")))
-            log_flags = HDstrtol(val, NULL, 0);
-
-        if (H5Pset_fapl_log(fapl, NULL, (unsigned)log_flags, 0) < 0)
-            return -1;
-    }
-    else if (!HDstrcmp(name, "direct")) {
-        /* Substitute Direct I/O driver with sec2 driver temporarily because
-         * some output has sec2 driver as the standard. */
-        if (H5Pset_fapl_sec2(fapl)<0) return -1;
-    }
-    else {
-        /* Unknown driver */
-        return -1;
-    }
-
-    return fapl;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    init_prefix
- *
- * Purpose:     allocate and initialize prefix
- *
- * Return:      void
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-init_prefix(char **prfx, size_t prfx_len)
-{
-    HDassert(prfx_len > 0);
-    *prfx = (char *)HDcalloc(prfx_len, 1);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    add_prefix
- *
- * Purpose:     Add object to prefix
- *
- * Return:      void
- *
- *-------------------------------------------------------------------------
- */
-void
-add_prefix(char **prfx, size_t *prfx_len, const char *name)
-{
-    size_t new_len = HDstrlen(*prfx) + HDstrlen(name) + 2;
-
-    /* Check if we need more space */
-    if(*prfx_len <= new_len) {
-        *prfx_len = new_len + 1;
-        *prfx = (char *)HDrealloc(*prfx, *prfx_len);
-    }
-
-    /* Append object name to prefix */
-    HDstrcat(HDstrcat(*prfx, "/"), name);
-} /* end add_prefix */
-
diff --git a/tools/h5dump/h5dump.h b/tools/h5dump/h5dump.h
deleted file mode 100644
index 7cf4efd..0000000
--- a/tools/h5dump/h5dump.h
+++ /dev/null
@@ -1,116 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef H5DUMP_H__
-#define H5DUMP_H__
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5tools_ref.h"
-#include "h5trav.h"
-#include "h5dump_defines.h"
-
-/**
- **  This is the global dispatch table for the dump functions.
- **/
-/* the table of dump functions */
-typedef struct dump_functions_t {
-    void     (*dump_group_function) (hid_t, const char *);
-    void     (*dump_named_datatype_function) (hid_t, const char *);
-    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
-    void     (*dump_dataspace_function) (hid_t);
-    void     (*dump_datatype_function) (hid_t);
-    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
-    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
-} 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;
-    h5dump_table_items_t    *tables;
-} h5dump_table_list_t;
-
-h5dump_table_list_t  table_list = {0, 0, NULL};
-table_t             *group_table = NULL, *dset_table = NULL, *type_table = NULL;
-int                  dump_indent = 0;              /*how far in to indent the line         */
-
-int          unamedtype = 0;     /* shared datatype with no name */
-hbool_t      hit_elink = FALSE;  /* whether we have traversed an external link */
-size_t       prefix_len = 1024;
-char         *prefix = NULL;
-const char   *fp_format = NULL;
-
-/* things to display or which are set via command line parameters */
-int          display_all       = TRUE;
-int          display_oid       = FALSE;
-int          display_data      = TRUE;
-int          display_attr_data = TRUE;
-int          display_char      = FALSE; /*print 1-byte numbers as ASCII */
-int          usingdasho        = FALSE;
-int          display_bb        = FALSE; /*superblock */
-int          display_dcpl      = FALSE; /*dcpl */
-int          display_fi        = FALSE; /*file index */
-int          display_ai        = TRUE;  /*array index */
-int          display_escape    = FALSE; /*escape non printable characters */
-int          display_region    = FALSE; /*print region reference data */
-int          enable_error_stack= FALSE; /* re-enable error stack */
-int          disable_compact_subset= FALSE; /* disable compact form of subset notation */
-int          display_packed_bits = FALSE; /*print 1-8 byte numbers as packed bits*/
-int          include_attrs     = TRUE; /* Display attributes */
-int          display_vds_first = FALSE; /* vds display to all by default*/
-int          vds_gap_size       = 0; /* vds skip missing files default is none */
-
-/* sort parameters */
-H5_index_t   sort_by           = H5_INDEX_NAME; /*sort_by [creation_order | name]  */
-H5_iter_order_t sort_order     = H5_ITER_INC; /*sort_order [ascending | descending]   */
-
-#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
-#define PACKED_BITS_SIZE_MAX    8*sizeof(long long)  /* Maximum bits size of integer types of packed-bits */
-/* mask list for packed bits */
-unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
-
-/* packed bits display parameters */
-int packed_offset[PACKED_BITS_MAX];
-int packed_length[PACKED_BITS_MAX];
-
-/*
- * The global table is set to either ddl_function_table or
- * xml_function_table in the initialization.
- */
-const dump_functions *dump_function_table;
-
-#ifdef __cplusplus
-"C" {
-#endif
-
-void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
-hid_t    h5_fileaccess(void);
-ssize_t  table_list_add(hid_t oid, unsigned long file_no);
-ssize_t  table_list_visited(unsigned long file_no);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* !H5DUMP_H__ */
diff --git a/tools/h5dump/h5dump_ddl.c b/tools/h5dump/h5dump_ddl.c
deleted file mode 100644
index 09751ab..0000000
--- a/tools/h5dump/h5dump_ddl.c
+++ /dev/null
@@ -1,2176 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_dump.h"
-#include "h5tools_utils.h"
-#include "h5tools_ref.h"
-#include "h5trav.h"
-#include "h5dump_extern.h"
-#include "h5dump_ddl.h"
-
-typedef struct {
-    hid_t fid;                      /* File ID being traversed */
-    char *op_name;                    /* Object name wanted */
-} trav_handle_udata_t;
-
-typedef struct {
-    char *path;                     /* Path of object being searched */
-    char *op_name;                    /* Object name wanted */
-} trav_attr_udata_t;
-
-/* callback function used by H5Literate() */
-static herr_t   dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void *op_data);
-static int      dump_extlink(hid_t group, const char *linkname, const char *objname);
-
-/*-------------------------------------------------------------------------
- * Function:    dump_datatype
- *
- * Purpose:     Dump the datatype. Datatype can be HDF5 predefined
- *              atomic datatype or committed/transient datatype.
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_datatype(hid_t type)
-{
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    h5dump_type_table = type_table;
-    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
-    h5dump_type_table = NULL;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_dataspace
- *
- * Purpose:     Dump the dataspace. Dataspace can be named dataspace,
- *              array, or others.
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_dataspace(hid_t space)
-{
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    dump_attr_cb
- *
- * Purpose:     attribute function callback called by H5Aiterate2, displays the attribute
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications: Pedro Vicente, October 4, 2007
- *  Added H5A_info_t parameter to conform with H5Aiterate2
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-dump_attr_cb(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info, void H5_ATTR_UNUSED *_op_data)
-{
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-
-    hid_t       attr_id;
-    herr_t      ret = SUCCEED;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
-    oid_output = display_oid;
-    data_output = display_data;
-    attr_data_output = display_attr_data;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    h5dump_type_table = type_table;
-    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
-    h5dump_type_table = NULL;
-
-    if(attr_id < 0) {
-        h5tools_setstatus(EXIT_FAILURE);
-        ret = FAIL;
-    }
-
-    return ret;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    dump_all_cb
- *
- * Purpose:     function callback called by H5Literate,
- *                displays everything in the specified object
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *  RMcG, November 2000
- *   Added XML support. Also, optionally checks the op_data argument
- *
- * PVN, May 2008
- *   Dump external links
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
-{
-    hid_t       obj;
-    hid_t       dapl_id = H5P_DEFAULT;  /* dataset access property list ID */
-    herr_t      ret = SUCCEED;
-    char       *obj_path = NULL;    /* Full path of object */
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    /* Build the object's path name */
-    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
-    if(!obj_path) {
-        ret = FAIL;
-        goto done;
-    }
-
-    HDstrcpy(obj_path, prefix);
-    HDstrcat(obj_path, "/");
-    HDstrcat(obj_path, name);
-
-    if(linfo->type == H5L_TYPE_HARD) {
-        H5O_info_t  oinfo;
-
-        /* Stat the object */
-        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
-            error_msg("unable to get object information for \"%s\"\n", name);
-            h5tools_setstatus(EXIT_FAILURE);
-            ret = FAIL;
-            goto done;
-        } /* end if */
-
-        switch(oinfo.type) {
-        case H5O_TYPE_GROUP:
-            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
-                error_msg("unable to dump group \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            else {
-                char *old_prefix; /* Pointer to previous prefix */
-
-                /* Keep copy of prefix before iterating into group */
-                old_prefix = HDstrdup(prefix);
-                HDassert(old_prefix);
-
-                /* Append group name to prefix */
-                add_prefix(&prefix, &prefix_len, name);
-
-                /* Iterate into group */
-                dump_function_table->dump_group_function(obj, name);
-
-                /* Restore old prefix name */
-                HDstrcpy(prefix, old_prefix);
-                HDfree(old_prefix);
-
-                /* Close group */
-                H5Gclose(obj);
-            }
-            break;
-
-        case H5O_TYPE_DATASET:
-            if(display_data) {
-                if ((dapl_id = H5Pcreate(H5P_DATASET_ACCESS)) < 0) {
-                    error_msg("error in creating default access property list ID\n");
-                }
-                if (display_vds_first) {
-                    if(H5Pset_virtual_view(dapl_id, H5D_VDS_FIRST_MISSING) < 0)
-                        error_msg("error in setting access property list ID, virtual_view\n");
-                }
-                if (vds_gap_size > 0) {
-                    if(H5Pset_virtual_printf_gap(dapl_id, (hsize_t)vds_gap_size) < 0)
-                        error_msg("error in setting access property list ID, virtual_printf_gap\n");
-                }
-            }
-            if((obj = H5Dopen2(group, name, dapl_id)) >= 0) {
-                if(oinfo.rc > 1 || hit_elink) {
-                    obj_t  *found_obj;    /* Found object */
-
-                    found_obj = search_obj(dset_table, oinfo.addr);
-
-                    if(found_obj == NULL) {
-                        ctx.indent_level++;
-
-                        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, "%s \"%s\" %s",
-                                h5tools_dump_header_format->datasetbegin, name,
-                                h5tools_dump_header_format->datasetblockbegin);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-
-                        ctx.need_prefix = TRUE;
-                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-                        /* Render the element */
-                        h5tools_str_reset(&buffer);
-                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
-                            if(HDstrlen(h5tools_dump_header_format->datasetend))
-                                h5tools_str_append(&buffer, " ");
-                        }
-                        if(HDstrlen(h5tools_dump_header_format->datasetend))
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        ctx.indent_level--;
-
-                        h5tools_setstatus(EXIT_FAILURE);
-                        ret = FAIL;
-                        if (dapl_id != H5P_DEFAULT)
-                            H5Pclose(dapl_id);
-                        H5Dclose(obj);
-                        goto done;
-                    }
-                    else if(found_obj->displayed) {
-                        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, "%s \"%s\" %s",
-                                h5tools_dump_header_format->datasetbegin, name,
-                                h5tools_dump_header_format->datasetblockbegin);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        ctx.indent_level++;
-
-                        ctx.need_prefix = TRUE;
-
-                        /* Render the element */
-                        h5tools_str_reset(&buffer);
-                        h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        ctx.indent_level--;
-
-                        ctx.need_prefix = TRUE;
-                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-                        /* Render the element */
-                        h5tools_str_reset(&buffer);
-                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
-                            if(HDstrlen(h5tools_dump_header_format->datasetend))
-                                h5tools_str_append(&buffer, " ");
-                        }
-                        if(HDstrlen(h5tools_dump_header_format->datasetend))
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        if (dapl_id != H5P_DEFAULT)
-                            H5Pclose(dapl_id);
-                        H5Dclose(obj);
-                        goto done;
-                    }
-                    else {
-                        found_obj->displayed = TRUE;
-                    }
-                } /* end if */
-
-                dump_function_table->dump_dataset_function(obj, name, NULL);
-                if (dapl_id != H5P_DEFAULT)
-                    H5Pclose(dapl_id);
-                H5Dclose(obj);
-            }
-            else {
-                if (dapl_id)
-                    H5Pclose(dapl_id && dapl_id != H5P_DEFAULT);
-                error_msg("unable to dump dataset \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            break;
-
-        case H5O_TYPE_NAMED_DATATYPE:
-            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
-                error_msg("unable to dump datatype \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            else {
-                dump_function_table->dump_named_datatype_function(obj, name);
-                H5Tclose(obj);
-            }
-            break;
-
-        case H5O_TYPE_UNKNOWN:
-        case H5O_TYPE_NTYPES:
-        default:
-            error_msg("unknown object \"%s\"\n", name);
-            h5tools_setstatus(EXIT_FAILURE);
-            ret = FAIL;
-        }
-    } /* end if */
-    else {
-        char       *targbuf;
-
-        switch(linfo->type) {
-        case H5L_TYPE_SOFT:
-            targbuf = (char *)HDmalloc(linfo->u.val_size);
-            HDassert(targbuf);
-
-            ctx.need_prefix = TRUE;
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s \"%s\" %s",
-                    h5tools_dump_header_format->softlinkbegin, name,
-                    h5tools_dump_header_format->softlinkblockbegin);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level++;
-
-            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
-                error_msg("unable to get link value\n");
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            else {
-                /* print the value of a soft link */
-                /* Standard DDL: no modification */
-                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, "LINKTARGET \"%s\"", targbuf);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-
-            ctx.indent_level--;
-
-            ctx.need_prefix = TRUE;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            if(HDstrlen(h5tools_dump_header_format->softlinkblockend)) {
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkblockend);
-                if(HDstrlen(h5tools_dump_header_format->softlinkend))
-                    h5tools_str_append(&buffer, " ");
-            }
-            if(HDstrlen(h5tools_dump_header_format->softlinkend))
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkend);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            HDfree(targbuf);
-            break;
-
-        case H5L_TYPE_EXTERNAL:
-            targbuf = (char *)HDmalloc(linfo->u.val_size);
-            HDassert(targbuf);
-
-            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, "%s \"%s\" %s",
-                    h5tools_dump_header_format->extlinkbegin, name,
-                    h5tools_dump_header_format->extlinkblockbegin);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
-                indentation(dump_indent);
-                error_msg("unable to get external link value\n");
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            } /* end if */
-            else {
-                const char *filename;
-                const char *targname;
-
-                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
-                    indentation(dump_indent);
-                    error_msg("unable to unpack external link value\n");
-                    h5tools_setstatus(EXIT_FAILURE);
-                    ret = FAIL;
-                } /* end if */
-                else {
-                    ctx.indent_level++;
-
-                    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, "TARGETFILE \"%s\"", filename);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "TARGETPATH \"%s\"", targname);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                    /* dump the external link */
-                    dump_extlink(group, name, targname);
-                    ctx.indent_level--;
-                } /* end else */
-            } /* end else */
-            ctx.need_prefix = TRUE;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            if(HDstrlen(h5tools_dump_header_format->extlinkblockend)) {
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkblockend);
-                if(HDstrlen(h5tools_dump_header_format->extlinkend))
-                    h5tools_str_append(&buffer, " ");
-            }
-            if(HDstrlen(h5tools_dump_header_format->extlinkend))
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkend);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            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);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s \"%s\" %s",
-                    h5tools_dump_header_format->udlinkbegin, name,
-                    h5tools_dump_header_format->udlinkblockbegin);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level++;
-
-            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, "LINKCLASS %d", linfo->type);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level--;
-
-            ctx.need_prefix = TRUE;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            if(HDstrlen(h5tools_dump_header_format->udlinkblockend)) {
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkblockend);
-                if(HDstrlen(h5tools_dump_header_format->udlinkend))
-                    h5tools_str_append(&buffer, " ");
-            }
-            if(HDstrlen(h5tools_dump_header_format->udlinkend))
-                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkend);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            break;
-        } /* end switch */
-    } /* end else */
-
-done:
-
-    h5tools_str_close(&buffer);
-
-    if(obj_path)
-        HDfree(obj_path);
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    attr_iteration
- *
- * Purpose:     Iterate and display attributes within the specified group
- *
- * Return:      void
- *
- *-------------------------------------------------------------------------
- */
-void
-attr_iteration(hid_t gid, unsigned attr_crt_order_flags)
-{
-    /* attribute iteration: if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
-       in the group for attributes, then, sort by creation order, otherwise by name */
-    if(include_attrs) {
-        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
-            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_attr_cb, NULL) < 0) {
-                error_msg("error getting attribute information\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            } /* end if */
-        } /* end if */
-        else {
-            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_attr_cb, NULL) < 0) {
-                error_msg("error getting attribute information\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            } /* end if */
-        } /* end else */
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function:    link_iteration
- *
- * Purpose:     Iterate and display links within the specified group
- *
- * Return:      void
- *
- *-------------------------------------------------------------------------
- */
-void
-link_iteration(hid_t gid, unsigned crt_order_flags)
-{
-
-    /* if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
-       in the group, then, sort by creation order, otherwise by name */
-    if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
-        H5Literate(gid, sort_by, sort_order, NULL, dump_all_cb, NULL);
-    else
-        H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, dump_all_cb, NULL);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_named_datatype
- *
- * Purpose:     Dump named datatype
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *  Pedro Vicente, March 27, 2006
- *   added display of attributes
- *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
- *   other iteration orders
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_named_datatype(hid_t tid, const char *name)
-{
-    H5O_info_t        oinfo;
-    unsigned          attr_crt_order_flags;
-    hid_t             tcpl_id = -1;  /* datatype creation property list ID */
-    hsize_t           curr_pos = 0;        /* total data element position   */
-    h5tools_str_t     buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    if ((tcpl_id = H5Tget_create_plist(tid)) < 0) {
-        error_msg("error in getting creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the creation properties for attributes */
-    if (H5Pget_attr_creation_order(tcpl_id, &attr_crt_order_flags) < 0) {
-        error_msg("error in getting creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    if(H5Pclose(tcpl_id) < 0) {
-        error_msg("error in closing creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    ctx.need_prefix = TRUE;
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    h5tools_str_append(&buffer, "%s \"%s\" %s",
-                        h5tools_dump_header_format->datatypebegin, name,
-                        h5tools_dump_header_format->datatypeblockbegin);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    H5Oget_info(tid, &oinfo);
-
-    /* Must check for uniqueness of all objects if we've traversed an elink,
-     * otherwise only check if the reference count > 1.
-     */
-    if(oinfo.rc > 1 || hit_elink) {
-        obj_t  *found_obj;    /* Found object */
-
-        found_obj = search_obj(type_table, oinfo.addr);
-
-        if (found_obj == NULL) {
-            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-        else if (found_obj->displayed) {
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            goto done;
-        }
-        else
-            found_obj->displayed = TRUE;
-    } /* end if */
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    h5tools_print_datatype(rawoutstream, &buffer, outputformat, &ctx, tid, FALSE);
-
-    if(H5Tget_class(tid) != H5T_COMPOUND) {
-        h5tools_str_append(&buffer, ";");
-    }
-
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    /* print attributes */
-    dump_indent += COL;
-
-    attr_iteration(tid, attr_crt_order_flags);
-
-    dump_indent -= COL;
-
-done:
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    if(HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeblockend);
-        if(HDstrlen(h5tools_dump_header_format->datatypeend))
-            h5tools_str_append(&buffer, " ");
-    }
-    if(HDstrlen(h5tools_dump_header_format->datatypeend))
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeend);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_group
- *
- * Purpose:     Dump everything within the specified group
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *
- * Call to dump_all_cb -- add parameter to select everything.
- *
- * Pedro Vicente, October 1, 2007
- *  handle several iteration orders for attributes and groups
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_group(hid_t gid, const char *name)
-{
-    H5O_info_t  oinfo;
-    hid_t       dset;
-    hid_t       type;
-    hid_t       gcpl_id;
-    unsigned    crt_order_flags;
-    unsigned    attr_crt_order_flags;
-    char        type_name[1024];
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
-        error_msg("error in getting group creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the group creation properties for attributes */
-    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
-        error_msg("error in getting group creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the group creation properties */
-    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
-        error_msg("error in getting group creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    if(H5Pclose(gcpl_id) < 0) {
-        error_msg("error in closing group creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    ctx.need_prefix = TRUE;
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    h5tools_str_append(&buffer, "%s \"%s\" %s",
-                        h5tools_dump_header_format->groupbegin, name,
-                        h5tools_dump_header_format->groupblockbegin);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    if(!HDstrcmp(name, "/") && unamedtype) {
-        unsigned    u;  /* Local index variable */
-
-        /* dump unamed type in root group */
-        for(u = 0; u < type_table->nobjs; u++)
-            if(!type_table->objs[u].recorded) {
-                dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
-                type = H5Dget_type(dset);
-                sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
-                dump_function_table->dump_named_datatype_function(type, type_name);
-                H5Tclose(type);
-                H5Dclose(dset);
-            }
-    } /* end if */
-
-    if(display_oid) {
-        h5tools_dump_oid(rawoutstream, outputformat, &ctx, gid);
-    }
-
-    h5tools_dump_comment(rawoutstream, outputformat, &ctx, gid);
-
-    H5Oget_info(gid, &oinfo);
-
-    /* Must check for uniqueness of all objects if we've traversed an elink,
-     * otherwise only check if the reference count > 1.
-     */
-    if(oinfo.rc > 1 || hit_elink) {
-        obj_t  *found_obj;    /* Found object */
-
-        found_obj = search_obj(group_table, oinfo.addr);
-
-        if (found_obj == NULL) {
-            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-        else if (found_obj->displayed) {
-            ctx.need_prefix = TRUE;
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-        else {
-            found_obj->displayed = TRUE;
-            attr_iteration(gid, attr_crt_order_flags);
-            link_iteration(gid, crt_order_flags);
-        }
-    }
-    else {
-        attr_iteration(gid, attr_crt_order_flags);
-        link_iteration(gid, crt_order_flags);
-    }
-
-    dump_indent -= COL;
-    ctx.indent_level--;
-
-    ctx.need_prefix = TRUE;
-    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    if(HDstrlen(h5tools_dump_header_format->groupblockend)) {
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupblockend);
-        if(HDstrlen(h5tools_dump_header_format->groupend))
-            h5tools_str_append(&buffer, " ");
-    }
-    if(HDstrlen(h5tools_dump_header_format->groupend))
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupend);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_dataset
- *
- * Purpose:     Dump the specified data set
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *  Pedro Vicente, 2004, added dataset creation property list display
- *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
- *   other  iteration orders
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_dataset(hid_t did, const char *name, struct subset_t *sset)
-{
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-    hid_t       type, space;
-    unsigned    attr_crt_order_flags;
-    hid_t       dcpl_id;  /* dataset creation property list ID */
-    h5tools_str_t buffer;          /* string into which to render   */
-    hsize_t       curr_pos = 0;        /* total data element position   */
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    if ((dcpl_id = H5Dget_create_plist(did)) < 0) {
-        error_msg("error in getting creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the creation properties for attributes */
-    if (H5Pget_attr_creation_order(dcpl_id, &attr_crt_order_flags) < 0) {
-        error_msg("error in getting creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    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, "%s \"%s\" %s",
-                        h5tools_dump_header_format->datasetbegin, name,
-                        h5tools_dump_header_format->datasetblockbegin);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_dump_comment(rawoutstream, outputformat, &ctx, did);
-
-    dump_indent += COL;
-    ctx.indent_level++;
-
-    type = H5Dget_type(did);
-    h5dump_type_table = type_table;
-    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
-    h5dump_type_table = NULL;
-
-    space = H5Dget_space(did);
-    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
-    H5Sclose(space);
-
-    if(display_oid) {
-        h5tools_dump_oid(rawoutstream, outputformat, &ctx, did);
-    }
-
-    if(display_dcpl) {
-        h5dump_type_table = type_table;
-        h5tools_dump_dcpl(rawoutstream, outputformat, &ctx, dcpl_id, type, did);
-        h5dump_type_table = NULL;
-    }
-    H5Pclose(dcpl_id);
-
-    if(display_data) {
-        int  data_loop = 1;
-        int  i;
-
-        if(display_packed_bits)
-            data_loop = packed_bits_num;
-        for(i=0; i<data_loop; i++) {
-            if(display_packed_bits) {
-                ctx.need_prefix = TRUE;
-                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-                /* Render the element */
-                h5tools_str_reset(&buffer);
-                packed_data_mask = packed_mask[i];
-                packed_data_offset = packed_offset[i];
-                packed_data_length = packed_length[i];
-                h5tools_print_packed_bits(&buffer, type);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-            switch(H5Tget_class(type)) {
-            case H5T_TIME:
-                ctx.indent_level++;
-
-                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, "DATA{ not yet implemented.}");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                ctx.indent_level--;
-                break;
-
-            case H5T_INTEGER:
-            case H5T_FLOAT:
-            case H5T_STRING:
-            case H5T_BITFIELD:
-            case H5T_OPAQUE:
-            case H5T_COMPOUND:
-            case H5T_REFERENCE:
-            case H5T_ENUM:
-            case H5T_VLEN:
-            case H5T_ARRAY:
-                {
-                    h5tools_dump_data(rawoutstream, outputformat, &ctx, did, TRUE, sset, display_ai, display_char);
-                }
-                break;
-
-            case H5T_NO_CLASS:
-            case H5T_NCLASSES:
-            default:
-                HDassert(0);
-                break;
-            } /* end switch */
-        } /* for(i=0;i<data_loop;i++) */
-    }
-    H5Tclose(type);
-
-    if (!bin_output) {
-        attr_iteration(did, attr_crt_order_flags);
-    }
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    ctx.need_prefix = TRUE;
-    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
-        if(HDstrlen(h5tools_dump_header_format->datasetend))
-            h5tools_str_append(&buffer, " ");
-    }
-    if(HDstrlen(h5tools_dump_header_format->datasetend))
-        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_data
- *
- * Purpose:     Dump attribute or dataset data
- *
- * Return:      void
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications: pvn, print the matrix indices
- *  Albert Cheng, 2004/11/18
- *  Add --string printing for attributes too.
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_data(hid_t obj_id, int obj_data, struct subset_t *sset, int display_index)
-{
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-    int               print_dataset = FALSE;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    if(obj_data == DATASET_DATA)
-        print_dataset = TRUE;
-    h5tools_dump_data(rawoutstream, outputformat, &ctx, obj_id, print_dataset, sset, display_index, display_char);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    dump_fcpl
- *
- * Purpose:     prints file creation property list information
- *
- * Return:      void
- *
- * Programmer:  pvn
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_fcpl(hid_t fid)
-{
-    hid_t    fcpl;      /* file creation property list ID */
-    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 */
-    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 */
-    char     dname[32]; /* buffer to store driver name */
-#endif
-    unsigned sym_lk;    /* symbol table B-tree leaf 'K' value */
-    unsigned sym_ik;    /* symbol table B-tree internal 'K' value */
-    unsigned istore_ik; /* indexed storage B-tree internal 'K' value */
-
-    fcpl=H5Fget_create_plist(fid);
-    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();
-    fdriver=H5Pget_driver(fapl);
-    H5Pclose(fapl);
-#endif
-
-   /*-------------------------------------------------------------------------
-    * SUPER_BLOCK
-    *-------------------------------------------------------------------------
-    */
-    PRINTSTREAM(rawoutstream, "\n%s %s\n",SUPER_BLOCK, BEGIN);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","SUPERBLOCK_VERSION", finfo.super.version);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","FREELIST_VERSION", finfo.free.version);
-    indentation(dump_indent + COL);
-    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", finfo.sohm.version);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream,"%s %zu\n","OFFSET_SIZE", off_size);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream,"%s %zu\n","LENGTH_SIZE", len_size);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","BTREE_RANK", sym_ik);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %d\n","BTREE_LEAF", sym_lk);
-
-#ifdef SHOW_FILE_DRIVER
-    if(H5FD_CORE==fdriver)
-        HDstrcpy(dname,"H5FD_CORE");
-#ifdef H5_HAVE_DIRECT
-    else if(H5FD_DIRECT==fdriver)
-        HDstrcpy(dname,"H5FD_DIRECT");
-#endif
-    else if(H5FD_FAMILY==fdriver)
-        HDstrcpy(dname,"H5FD_FAMILY");
-    else if(H5FD_LOG==fdriver)
-        HDstrcpy(dname,"H5FD_LOG");
-    else if(H5FD_MPIO==fdriver)
-        HDstrcpy(dname,"H5FD_MPIO");
-    else if(H5FD_MULTI==fdriver)
-        HDstrcpy(dname,"H5FD_MULTI");
-    else if(H5FD_SEC2==fdriver)
-        HDstrcpy(dname,"H5FD_SEC2");
-    else if(H5FD_STDIO==fdriver)
-        HDstrcpy(dname,"H5FD_STDIO");
-    else
-        HDstrcpy(dname,"Unknown driver");
-
-    /* Take out this because the driver used can be different from the
-     * standard output. */
-    /*indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %s\n","FILE_DRIVER", dname);*/
-#endif
-    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
-    *-------------------------------------------------------------------------
-    */
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "USER_BLOCK %s\n",BEGIN);
-    indentation(dump_indent + COL + COL);
-    PRINTSTREAM(rawoutstream,"%s %Hu\n","USERBLOCK_SIZE", userblock);
-    indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s\n",END);
-
-    PRINTSTREAM(rawoutstream, "%s",END);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    dump_fcontents
- *
- * Purpose:     prints all objects
- *
- * Return:      void
- *
- * Programmer:  pvn
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-dump_fcontents(hid_t fid)
-{
-    PRINTSTREAM(rawoutstream, "%s %s\n",FILE_CONTENTS, BEGIN);
-
-    /* special case of unamed types in root group */
-    if (unamedtype) {
-        unsigned u;
-
-        for (u = 0; u < type_table->nobjs; u++) {
-            if (!type_table->objs[u].recorded)
-                PRINTSTREAM(rawoutstream, " %-10s /#"H5_PRINTF_HADDR_FMT"\n", "datatype", type_table->objs[u].objno);
-        }
-    }
-
-    /* print objects in the files */
-    h5trav_print(fid);
-
-    PRINTSTREAM(rawoutstream, " %s\n",END);
-}
-
-static herr_t
-attr_search(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *_op_data)
-{
-    herr_t              ret = SUCCEED;
-    int                 i;
-    int                 j;
-    int                 k;
-    char               *obj_op_name;
-    char               *obj_name;
-    trav_attr_udata_t  *attr_data = (trav_attr_udata_t*)_op_data;
-    char               *buf = attr_data->path;
-    char               *op_name = attr_data->op_name;
-
-    j = (int)HDstrlen(op_name) - 1;
-    /* find the last / */
-    while(j >= 0) {
-        if (op_name[j] == '/' && (j==0 || (j>0 && op_name[j-1]!='\\')))
-            break;
-        j--;
-    }
-
-    obj_op_name = h5tools_str_replace(op_name + j + 1, "\\/", "/");
-
-    if(obj_op_name == NULL) {
-        h5tools_setstatus(EXIT_FAILURE);
-        ret = FAIL;
-    }
-    else {
-        if(HDstrcmp(attr_name, obj_op_name)==0) {
-            /* object name */
-            i = (int)HDstrlen(buf);
-            j = (int)HDstrlen(op_name);
-            k = (size_t)i + 1 + (size_t)j + 1 + 2;
-            obj_name = (char *)HDmalloc((size_t)k);
-            if(obj_name == NULL) {
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            else {
-                HDmemset(obj_name, '\0', (size_t)k);
-                if(op_name[0] != '/') {
-                    HDstrncat(obj_name, buf, (size_t)i + 1);
-                    if(buf[i-1] != '/')
-                        HDstrncat(obj_name, "/", (size_t)2);
-                }
-                HDstrncat(obj_name, op_name, (size_t)j + 1);
-
-                handle_attributes(oid, obj_name, NULL, 0, NULL);
-                HDfree(obj_name);
-            }
-        }
-        HDfree(obj_op_name);
-    }
-    return ret;
-} /* end attr_search() */
-
-static herr_t
-obj_search(const char *path, const H5O_info_t *oi, const char H5_ATTR_UNUSED *already_visited, void *_op_data)
-{
-    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
-    char *op_name = (char*)handle_data->op_name;
-
-    trav_attr_udata_t  attr_data;
-    attr_data.path = (char*)path;
-    attr_data.op_name = op_name;
-    H5Aiterate_by_name(handle_data->fid, path, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_search, (void*)&attr_data, H5P_DEFAULT);
-
-    if(HDstrcmp(path, op_name)==0) {
-        switch(oi->type) {
-        case H5O_TYPE_GROUP:
-            handle_groups(handle_data->fid, path, NULL, 0, NULL);
-            break;
-        case H5O_TYPE_DATASET:
-            handle_datasets(handle_data->fid, path, NULL, 0, NULL);
-            break;
-        case H5O_TYPE_NAMED_DATATYPE:
-            handle_datatypes(handle_data->fid, path, NULL, 0, NULL);
-            break;
-        case H5O_TYPE_UNKNOWN:
-        case H5O_TYPE_NTYPES:
-        default:
-            error_msg("unknown object type value\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        } /* end switch */
-    }
-
-    return 0;
-} /* end obj_search() */
-
-static herr_t
-lnk_search(const char *path, const H5L_info_t *li, void *_op_data)
-{
-    int         search_len;
-    int            k;
-    char       *search_name;
-    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
-    char *op_name = (char*)handle_data->op_name;
-
-    search_len = HDstrlen(op_name);
-    if(search_len > 0 && op_name[0] != '/') {
-        k = 2;
-    }
-    else
-        k = 1;
-    search_name = (char *)HDmalloc((size_t)(search_len + k));
-    if(search_name == NULL) {
-        error_msg("creating temporary link\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-    else {
-        if (k == 2) {
-            HDstrcpy(search_name, "/");
-            HDstrncat(search_name, op_name, (size_t)search_len + 1);
-        }
-        else
-            HDstrncpy(search_name, op_name, (size_t)search_len + 1);
-        search_name[search_len + k - 1] = '\0';
-
-        if(HDstrcmp(path, search_name) == 0) {
-            switch(li->type) {
-            case H5L_TYPE_SOFT:
-            case H5L_TYPE_EXTERNAL:
-                handle_links(handle_data->fid, op_name, NULL, 0, NULL);
-                break;
-
-            case H5L_TYPE_HARD:
-            case H5L_TYPE_MAX:
-            case H5L_TYPE_ERROR:
-            default:
-                error_msg("unknown link type value\n");
-                h5tools_setstatus(EXIT_FAILURE);
-                break;
-            } /* end switch() */
-        }
-        HDfree(search_name);
-    }
-    return 0;
-} /* end lnk_search() */
-
-/*-------------------------------------------------------------------------
- * Function:    handle_paths
- *
- * Purpose:     Handle objects from the command.
- *
- * Return:      void
- *
- *-------------------------------------------------------------------------
- */
-void
-handle_paths(hid_t fid, const char *path_name, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
-{
-    hid_t  gid = -1;
-
-    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
-        error_msg("unable to open root group\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-    else {
-        hid_t       gcpl_id;
-        unsigned    crt_order_flags;
-        unsigned    attr_crt_order_flags;
-        trav_handle_udata_t handle_udata;     /* User data for traversal */
-
-        if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
-            error_msg("error in getting group creation property list ID\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-
-        /* query the group creation properties for attributes */
-        if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
-            error_msg("error in getting group creation properties\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-
-        /* query the group creation properties */
-        if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
-            error_msg("error in getting group creation properties\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-
-        if(H5Pclose(gcpl_id) < 0) {
-            error_msg("error in closing group creation property list ID\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-
-        handle_udata.fid = fid;
-        handle_udata.op_name = (char*)path_name;
-        if(h5trav_visit(fid, "/", TRUE, TRUE, obj_search, lnk_search, &handle_udata) < 0) {
-            error_msg("error traversing information\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function:    handle_attributes
- *
- * Purpose:     Handle the attributes from the command.
- *
- * Return:      void
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 9. January 2001
- *
- * Modifications:
- *
- * PVN, May 2008
- *   add an extra parameter PE, to allow printing/not printing of error messages
- *
- *-------------------------------------------------------------------------
- */
-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      = NULL;
-    char *attr_name     = NULL;
-    int j;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &h5tools_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    j = (int)HDstrlen(attr) - 1;
-    obj_name = (char *)HDmalloc((size_t)j + 2);
-    if(obj_name == NULL)
-        goto error;
-
-    /* find the last / */
-    while(j >= 0) {
-        if (attr[j] == '/' && (j==0 || (j>0 && attr[j-1]!='\\')))
-            break;
-        j--;
-    }
-
-    /* object name */
-    if(j == -1)
-        HDstrcpy(obj_name, "/");
-    else {
-        HDstrncpy(obj_name, attr, (size_t)j + 1);
-        obj_name[j + 1] = '\0';
-    } /* end else */
-
-    dump_indent += COL;
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    attr_name = h5tools_str_replace(attr + j + 1, "\\/", "/");
-
-    /* handle error case: cannot open the object with the attribute */
-    if((oid = H5Oopen(fid, obj_name, H5P_DEFAULT)) < 0) {
-        /* setup */
-        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-        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, "%s \"%s\" %s",
-                h5tools_dump_header_format->attributebegin, attr,
-                h5tools_dump_header_format->attributeblockbegin);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        error_msg("unable to open object \"%s\"\n", obj_name);
-
-        ctx.need_prefix = TRUE;
-        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-        /* Render the element */
-        h5tools_str_reset(&buffer);
-        if(HDstrlen(h5tools_dump_header_format->attributeblockend)) {
-            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeblockend);
-            if(HDstrlen(h5tools_dump_header_format->attributeend))
-                h5tools_str_append(&buffer, " ");
-        }
-        if(HDstrlen(h5tools_dump_header_format->attributeend))
-            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeend);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        h5tools_str_close(&buffer);
-
-        goto error;
-    } /* end if */
-
-    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
-    oid_output = display_oid;
-    data_output = display_data;
-    attr_data_output = display_attr_data;
-
-    h5dump_type_table = type_table;
-    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
-    h5dump_type_table = NULL;
-
-    if(attr_id < 0) {
-        goto error;
-    }
-
-    /* Close object */
-    if(H5Oclose(oid) < 0) {
-        goto error;
-    } /* end if */
-
-    HDfree(obj_name);
-    HDfree(attr_name);
-    dump_indent -= COL;
-    return;
-
-error:
-    h5tools_setstatus(EXIT_FAILURE);
-    if(obj_name)
-        HDfree(obj_name);
-
-    if (attr_name)
-        HDfree(attr_name);
-
-    H5E_BEGIN_TRY {
-        H5Oclose(oid);
-        H5Aclose(attr_id);
-    } H5E_END_TRY;
-    dump_indent -= COL;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    handle_datasets
- *
- * Purpose:     Handle the datasets from the command.
- *
- * Return:      void
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 9. January 2001
- *
- * Modifications:
- *  Pedro Vicente, Tuesday, January 15, 2008
- *  check for block overlap\
- *
- *  Pedro Vicente, May 8, 2008
- *   added a flag PE that prints/not prints error messages
- *   added for cases of external links not found, to avoid printing of
- *    objects not found, since external links are dumped on a trial error basis
- *
- *-------------------------------------------------------------------------
- */
-void
-handle_datasets(hid_t fid, const char *dset, void *data, int pe, const char *display_name)
-{
-    H5O_info_t       oinfo;
-    hid_t            dsetid;
-    hid_t            dapl_id = H5P_DEFAULT;  /* dataset access property list ID */
-    struct subset_t *sset = (struct subset_t *)data;
-    const char      *real_name = display_name ? display_name : dset;
-
-    if(display_data) {
-        if ((dapl_id = H5Pcreate(H5P_DATASET_ACCESS)) < 0) {
-            error_msg("error in creating default access property list ID\n");
-        }
-        if (display_vds_first) {
-            if(H5Pset_virtual_view(dapl_id, H5D_VDS_FIRST_MISSING) < 0)
-                error_msg("error in setting access property list ID, virtual_view\n");
-        }
-        if (vds_gap_size > 0) {
-            if(H5Pset_virtual_printf_gap(dapl_id, (hsize_t)vds_gap_size) < 0)
-                error_msg("error in setting access property list ID, virtual_printf_gap\n");
-        }
-    }
-    if((dsetid = H5Dopen2(fid, dset, dapl_id)) < 0) {
-        if (pe) {
-            handle_links(fid, dset, data, pe, display_name);
-        }
-        return;
-    } /* end if */
-
-    if(sset) {
-        unsigned int i;
-        unsigned int ndims;
-        hid_t sid = H5Dget_space(dsetid);
-        int ndims_res = H5Sget_simple_extent_ndims(sid);
-
-        H5Sclose(sid);
-        if(ndims_res < 0) {
-            error_msg("H5Sget_simple_extent_ndims failed\n");
-            h5tools_setstatus(EXIT_FAILURE);
-            return;
-        }
-        else
-            ndims = ndims_res;
-
-        if(!sset->start.data || !sset->stride.data || !sset->count.data || !sset->block.data) {
-            /* they didn't specify a ``stride'' or ``block''. default to 1 in all
-             * dimensions */
-            if(!sset->start.data) {
-                /* default to (0, 0, ...) for the start coord */
-                sset->start.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
-                sset->start.len = ndims;
-            }
-
-            if(!sset->stride.data) {
-                sset->stride.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
-                sset->stride.len = ndims;
-                for (i = 0; i < ndims; i++)
-                    sset->stride.data[i] = 1;
-            }
-
-            if(!sset->count.data) {
-                sset->count.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
-                sset->count.len = ndims;
-                for (i = 0; i < ndims; i++)
-                    sset->count.data[i] = 1;
-            }
-
-            if(!sset->block.data) {
-                sset->block.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
-                sset->block.len = ndims;
-                for (i = 0; i < ndims; i++)
-                    sset->block.data[i] = 1;
-            }
-        }
-
-        /*-------------------------------------------------------------------------
-         * check for dimension overflow
-         *-------------------------------------------------------------------------
-         */
-        if(sset->start.len > ndims) {
-            error_msg("number of start dims (%u) exceed dataset dims (%u)\n", sset->start.len, ndims);
-            h5tools_setstatus(EXIT_FAILURE);
-            return;
-        }
-        if(sset->stride.len > ndims) {
-            error_msg("number of stride dims (%u) exceed dataset dims (%u)\n", sset->stride.len, ndims);
-            h5tools_setstatus(EXIT_FAILURE);
-            return;
-        }
-        if(sset->count.len > ndims) {
-            error_msg("number of count dims (%u) exceed dataset dims (%u)\n", sset->count.len, ndims);
-            h5tools_setstatus(EXIT_FAILURE);
-            return;
-        }
-        if(sset->block.len > ndims) {
-            error_msg("number of block dims (%u) exceed dataset dims (%u)\n", sset->block.len, ndims);
-            h5tools_setstatus(EXIT_FAILURE);
-            return;
-        }
-
-        /*-------------------------------------------------------------------------
-         * check for block overlap
-         *-------------------------------------------------------------------------
-         */
-        for(i = 0; i < ndims; i++) {
-            if(sset->count.data[i] > 1) {
-                if(sset->stride.data[i] < sset->block.data[i]) {
-                    error_msg("wrong subset selection; blocks overlap\n");
-                    h5tools_setstatus(EXIT_FAILURE);
-                    return;
-                } /* end if */
-            } /* end if */
-        } /* end for */
-    } /* end if */
-
-
-    H5Oget_info(dsetid, &oinfo);
-    if(oinfo.rc > 1 || hit_elink) {
-        obj_t  *found_obj;    /* Found object */
-
-        found_obj = search_obj(dset_table, oinfo.addr);
-
-        if(found_obj) {
-            if (found_obj->displayed) {
-                PRINTVALSTREAM(rawoutstream, "\n");
-                indentation(dump_indent);
-                begin_obj(h5tools_dump_header_format->datasetbegin, real_name, h5tools_dump_header_format->datasetblockbegin);
-                PRINTVALSTREAM(rawoutstream, "\n");
-                indentation(dump_indent + COL);
-                PRINTSTREAM(rawoutstream, "%s \"%s\"\n", HARDLINK, found_obj->objname);
-                indentation(dump_indent);
-                end_obj(h5tools_dump_header_format->datasetend, h5tools_dump_header_format->datasetblockend);
-            }
-            else {
-                found_obj->displayed = TRUE;
-                dump_indent += COL;
-                dump_dataset(dsetid, real_name, sset);
-                dump_indent -= COL;
-            }
-        }
-        else
-            h5tools_setstatus(EXIT_FAILURE);
-    }
-    else {
-        dump_indent += COL;
-        dump_dataset(dsetid, real_name, sset);
-        dump_indent -= COL;
-    }
-    if (dapl_id != H5P_DEFAULT)
-        H5Pclose(dapl_id);
-    if(H5Dclose(dsetid) < 0)
-        h5tools_setstatus(EXIT_FAILURE);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    handle_groups
- *
- * Purpose:     Handle the groups from the command.
- *
- * Return:      void
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 9. January 2001
- *
- * Modifications: Pedro Vicente, September 26, 2007
- *  handle creation order
- *
- * Pedro Vicente, May 8, 2008
- *   added a flag PE that prints/not prints error messages
- *   added for cases of external links not found, to avoid printing of
- *    objects not found, since external links are dumped on a trial error basis
- *
- *-------------------------------------------------------------------------
- */
-void
-handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name)
-{
-    hid_t       gid;
-    const char  *real_name = display_name ? display_name : group;
-
-    if((gid = H5Gopen2(fid, group, H5P_DEFAULT)) < 0) {
-        if (pe) {
-            PRINTVALSTREAM(rawoutstream, "\n");
-            begin_obj(h5tools_dump_header_format->groupbegin, real_name, h5tools_dump_header_format->groupblockbegin);
-            PRINTVALSTREAM(rawoutstream, "\n");
-            indentation(COL);
-            error_msg("unable to open group \"%s\"\n", real_name);
-            end_obj(h5tools_dump_header_format->groupend, h5tools_dump_header_format->groupblockend);
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-    }
-    else {
-        size_t new_len = HDstrlen(group) + 1;
-
-        if(prefix_len <= new_len) {
-            prefix_len = new_len;
-            prefix = (char *)HDrealloc(prefix, prefix_len);
-        } /* end if */
-
-        HDstrcpy(prefix, group);
-
-        dump_indent += COL;
-        dump_group(gid, real_name);
-        dump_indent -= COL;
-
-        if(H5Gclose(gid) < 0)
-            h5tools_setstatus(EXIT_FAILURE);
-    } /* end else */
-} /* end handle_groups() */
-
-/*-------------------------------------------------------------------------
- * Function:    handle_links
- *
- * Purpose:     Handle soft or UD links from the command.
- *
- * Return:      void
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 9. January 2001
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
-{
-    H5L_info_t linfo;
-
-    if(H5Lget_info(fid, links, &linfo, H5P_DEFAULT) < 0) {
-        error_msg("unable to get link info from \"%s\"\n", links);
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-    else if(linfo.type == H5L_TYPE_HARD) {
-        error_msg("\"%s\" is a hard link\n", links);
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-    else {
-        char *buf = (char *)HDmalloc(linfo.u.val_size);
-        PRINTVALSTREAM(rawoutstream, "\n");
-
-        switch(linfo.type) {
-        case H5L_TYPE_SOFT:    /* Soft link */
-            begin_obj(h5tools_dump_header_format->softlinkbegin, links, h5tools_dump_header_format->softlinkblockbegin);
-            PRINTVALSTREAM(rawoutstream, "\n");
-            indentation(COL);
-            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
-                PRINTSTREAM(rawoutstream, "LINKTARGET \"%s\"\n", buf);
-            }
-            else {
-                error_msg("h5dump error: unable to get link value for \"%s\"\n", links);
-                h5tools_setstatus(EXIT_FAILURE);
-            }
-            end_obj(h5tools_dump_header_format->softlinkend, h5tools_dump_header_format->softlinkblockend);
-            break;
-
-        case H5L_TYPE_EXTERNAL:
-            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
-            PRINTVALSTREAM(rawoutstream, "\n");
-            indentation(COL);
-            begin_obj(h5tools_dump_header_format->extlinkbegin, links, h5tools_dump_header_format->extlinkblockbegin);
-            PRINTVALSTREAM(rawoutstream, "\n");
-            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
-                const char *elink_file;
-                const char *elink_path;
-
-                if(H5Lunpack_elink_val(buf, linfo.u.val_size, NULL, &elink_file, &elink_path)>=0) {
-                    indentation(COL);
-                    PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
-                    indentation(COL);
-                    PRINTSTREAM(rawoutstream, "TARGETFILE \"%s\"\n", elink_file);
-                    indentation(COL);
-                    PRINTSTREAM(rawoutstream, "TARGETPATH \"%s\"\n", elink_path);
-                }
-                else {
-                    error_msg("h5dump error: unable to unpack external link value for \"%s\"\n", links);
-                    h5tools_setstatus(EXIT_FAILURE);
-                }
-            }
-            else {
-                error_msg("h5dump error: unable to get external link value for \"%s\"\n", links);
-                h5tools_setstatus(EXIT_FAILURE);
-            }
-            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");
-            indentation(COL);
-            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
-            PRINTVALSTREAM(rawoutstream, "\n");
-            indentation(COL);
-            PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
-            end_obj(h5tools_dump_header_format->udlinkend, h5tools_dump_header_format->udlinkblockend);
-            break;
-        } /* end switch */
-        HDfree(buf);
-    } /* end else */
-}
-
-/*-------------------------------------------------------------------------
- * Function:    handle_datatypes
- *
- * Purpose:     Handle the datatypes from the command.
- *
- * Return:      void
- *
- * Programmer:  Bill Wendling
- *              Tuesday, 9. January 2001
- *
- * Modifications:
- *
- *  Pedro Vicente, May 8, 2008
- *   added a flag PE that prints/not prints error messages
- *   added for cases of external links not found, to avoid printing of
- *    objects not found, since external links are dumped on a trial error basis
- *
- *-------------------------------------------------------------------------
- */
-void
-handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name)
-{
-    hid_t       type_id;
-    const char  *real_name = display_name ? display_name : type;
-
-    if((type_id = H5Topen2(fid, type, H5P_DEFAULT)) < 0) {
-        /* check if type is unamed datatype */
-        unsigned idx = 0;
-
-        while(idx < type_table->nobjs ) {
-            char name[128];
-
-            if(!type_table->objs[idx].recorded) {
-                /* unamed datatype */
-                sprintf(name, "/#"H5_PRINTF_HADDR_FMT, type_table->objs[idx].objno);
-
-                if(!HDstrcmp(name, real_name))
-                    break;
-            } /* end if */
-
-            idx++;
-        } /* end while */
-
-        if(idx == type_table->nobjs) {
-            if (pe) {
-                /* unknown type */
-                PRINTVALSTREAM(rawoutstream, "\n");
-                begin_obj(h5tools_dump_header_format->datatypebegin, real_name, h5tools_dump_header_format->datatypeblockbegin);
-                PRINTVALSTREAM(rawoutstream, "\n");
-                indentation(COL);
-                error_msg("unable to open datatype \"%s\"\n", real_name);
-                end_obj(h5tools_dump_header_format->datatypeend, h5tools_dump_header_format->datatypeblockend);
-                h5tools_setstatus(EXIT_FAILURE);
-            }
-        }
-        else {
-            hid_t dsetid = H5Dopen2(fid, type_table->objs[idx].objname, H5P_DEFAULT);
-            type_id = H5Dget_type(dsetid);
-
-            dump_indent += COL;
-            dump_named_datatype(type_id, real_name);
-            dump_indent -= COL;
-
-            H5Tclose(type_id);
-            H5Dclose(dsetid);
-        }
-    }
-    else {
-        dump_indent += COL;
-        dump_named_datatype(type_id, real_name);
-        dump_indent -= COL;
-
-        if(H5Tclose(type_id) < 0)
-            h5tools_setstatus(EXIT_FAILURE);
-    }
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    dump_extlink
- *
- * made by: PVN
- *
- * Purpose:     Dump an external link
- *  Since external links are soft links, they are dumped on a trial error
- *   basis, attempting to dump as a dataset, as a group and as a named datatype
- *   Error messages are supressed
- *
- * Modifications:
- *      Neil Fortner
- *      13 October 2008
- *      Function basically rewritten.  No longer directly opens the target file,
- *      now initializes a new set of tables for the external file.  No longer
- *      dumps on a trial and error basis, but errors are still suppressed.
- *
- *-------------------------------------------------------------------------
- */
-static int
-dump_extlink(hid_t group, const char *linkname, const char *objname)
-{
-    hid_t       oid;
-    H5O_info_t  oi;
-    table_t     *old_group_table = group_table;
-    table_t     *old_dset_table = dset_table;
-    table_t     *old_type_table = type_table;
-    hbool_t     old_hit_elink;
-    ssize_t     idx;
-
-    /* Open target object */
-    if ((oid = H5Oopen(group, linkname, H5P_DEFAULT)) < 0)
-        goto fail;
-
-    /* Get object info */
-    if (H5Oget_info(oid, &oi) < 0) {
-        H5Oclose(oid);
-        goto fail;
-    }
-
-    /* Check if we have visited this file already */
-    if ((idx = table_list_visited(oi.fileno)) < 0) {
-        /* We have not visited this file, build object tables */
-        if ((idx = table_list_add(oid, oi.fileno)) < 0) {
-            H5Oclose(oid);
-            goto fail;
-        }
-    }
-
-    /* Do not recurse through an external link into the original file (idx=0) */
-    if (idx) {
-        /* Update table pointers */
-        group_table = table_list.tables[idx].group_table;
-        dset_table = table_list.tables[idx].dset_table;
-        type_table = table_list.tables[idx].type_table;
-
-        /* We will now traverse the external link, set this global to indicate this */
-        old_hit_elink = hit_elink;
-        hit_elink = TRUE;
-
-        /* add some indentation to distinguish that these objects are external */
-        dump_indent += COL;
-
-        /* Recurse into the external file */
-        switch (oi.type) {
-            case H5O_TYPE_GROUP:
-                handle_groups(group, linkname, NULL, 0, objname);
-                break;
-            case H5O_TYPE_DATASET:
-                handle_datasets(group, linkname, NULL, 0, objname);
-                break;
-            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);
-        }
-
-        dump_indent -= COL;
-
-        /* Reset table pointers */
-        group_table = old_group_table;
-        dset_table = old_dset_table;
-        type_table = old_type_table;
-
-        /* Reset hit_elink */
-        hit_elink = old_hit_elink;
-    } /* end if */
-
-    if (H5Idec_ref(oid) < 0)
-        h5tools_setstatus(EXIT_FAILURE);
-
-    return SUCCEED;
-
-fail:
-    return FAIL;
-}
-
diff --git a/tools/h5dump/h5dump_ddl.h b/tools/h5dump/h5dump_ddl.h
deleted file mode 100644
index 2b3f61e..0000000
--- a/tools/h5dump/h5dump_ddl.h
+++ /dev/null
@@ -1,52 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef H5DUMP_DDL_H__
-#define H5DUMP_DDL_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The dump functions of the dump_function_table */
-/* standard format:  no change */
-void      dump_group(hid_t, const char *);
-void      dump_named_datatype(hid_t, const char *);
-void      dump_dataset(hid_t, const char *, struct subset_t *);
-void      dump_dataspace(hid_t space);
-void      dump_datatype(hid_t type);
-void      dump_data(hid_t, int, struct subset_t *, int);
-void      dump_fcpl(hid_t fid);
-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);
-void handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name);
-void handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name);
-void handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* !H5DUMP_DDL_H__ */
diff --git a/tools/h5dump/h5dump_defines.h b/tools/h5dump/h5dump_defines.h
deleted file mode 100644
index 2be2dcc..0000000
--- a/tools/h5dump/h5dump_defines.h
+++ /dev/null
@@ -1,56 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef H5DUMP_DEFINES_H__
-#define H5DUMP_DEFINES_H__
-
-#define H5DUMP_MAX_RANK     H5S_MAX_RANK
-
-#define ATTRIBUTE_DATA  0
-#define DATASET_DATA    1
-#define ENUM_DATA       2
-#define COL             3
-
-/* Macros for displaying objects */
-#define begin_obj(obj,name,begin)                                           \
-    do {                                                                    \
-        if ((name)) {                                                       \
-            PRINTSTREAM(rawoutstream, "%s \"%s\" %s", (obj), (name), (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);                           \
-    } while(0);
-
-
-/* 3 private values: can't be set, but can be read.
-   Note: these are defined in H5Zprivate, they are
-   duplicated here.
- */
-#define H5_SZIP_LSB_OPTION_MASK         8
-#define H5_SZIP_MSB_OPTION_MASK         16
-#define H5_SZIP_RAW_OPTION_MASK         128
-
-#endif  /* !H5DUMP_DEFINES_H__ */
diff --git a/tools/h5dump/h5dump_extern.h b/tools/h5dump/h5dump_extern.h
deleted file mode 100644
index 62477d0..0000000
--- a/tools/h5dump/h5dump_extern.h
+++ /dev/null
@@ -1,115 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef H5DUMP_EXTERN_H__
-#define H5DUMP_EXTERN_H__
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5tools_ref.h"
-#include "h5trav.h"
-#include "h5dump_defines.h"
-
-/**
- **  This is the global dispatch table for the dump functions.
- **/
-/* the table of dump functions */
-typedef struct dump_functions_t {
-    void     (*dump_group_function) (hid_t, const char *);
-    void     (*dump_named_datatype_function) (hid_t, const char *);
-    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
-    void     (*dump_dataspace_function) (hid_t);
-    void     (*dump_datatype_function) (hid_t);
-    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
-    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
-} dump_functions;
-
-/* List of table structures.  There is one table structure for each file */
-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;
-} h5dump_table_list_t;
-
-extern h5dump_table_list_t  table_list;
-extern table_t             *group_table, *dset_table, *type_table;
-extern int                  dump_indent;              /*how far in to indent the line         */
-
-extern int          unamedtype;     /* shared datatype with no name */
-extern hbool_t      hit_elink;  /* whether we have traversed an external link */
-extern size_t       prefix_len;
-extern char         *prefix;
-extern const char   *fp_format;
-
-/* things to display or which are set via command line parameters */
-extern int          display_all;
-extern int          display_oid;
-extern int          display_data;
-extern int          display_attr_data;
-extern int          display_char; /*print 1-byte numbers as ASCII */
-extern int          usingdasho;
-extern int          display_bb; /*superblock */
-extern int          display_dcpl; /*dcpl */
-extern int          display_fi; /*file index */
-extern int          display_ai;  /*array index */
-extern int          display_escape; /*escape non printable characters */
-extern int          display_region; /*print region reference data */
-extern int          enable_error_stack; /* re-enable error stack */
-extern int          disable_compact_subset; /* disable compact form of subset notation */
-extern int          display_packed_bits; /*print 1-8 byte numbers as packed bits*/
-extern int          include_attrs; /* Display attributes */
-extern int          display_vds_first; /* vds display to first missing */
-extern int          vds_gap_size; /* vds skip missing files */
-
-/* sort parameters */
-extern H5_index_t   sort_by; /*sort_by [creation_order | name]  */
-extern H5_iter_order_t sort_order; /*sort_order [ascending | descending]   */
-
-#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
-#define PACKED_BITS_SIZE_MAX    8*sizeof(long long)  /* Maximum bits size of integer types of packed-bits */
-/* mask list for packed bits */
-extern unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
-
-/* packed bits display parameters */
-extern int packed_offset[PACKED_BITS_MAX];
-extern int packed_length[PACKED_BITS_MAX];
-
-/*
- * The global table is set to either ddl_function_table or
- * xml_function_table in the initialization.
- */
-extern const dump_functions *dump_function_table;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
-hid_t    h5_fileaccess(void);
-ssize_t  table_list_add(hid_t oid, unsigned long file_no);
-ssize_t  table_list_visited(unsigned long file_no);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* !H5DUMP_EXTERN_H__ */
diff --git a/tools/h5dump/h5dump_xml.c b/tools/h5dump/h5dump_xml.c
deleted file mode 100644
index 00f894b..0000000
--- a/tools/h5dump/h5dump_xml.c
+++ /dev/null
@@ -1,4584 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_dump.h"
-#include "h5tools_utils.h"
-#include "h5tools_ref.h"
-#include "h5trav.h"
-#include "h5dump_extern.h"
-#include "h5dump_xml.h"
-
-const char       *xmlnsprefix="hdf5:";
-
-/*
- *  Alternative formating for data dumped to XML
- *  In general, the numbers are the same, but separators
- *  except spaces are not used.
- *
- *  Some of these are not used, as some kinds of data are
- *  dumped in completely new subroutines.
- *
- *  Some of this formatting may yet need to change.
- *
- *  This table only affects XML output.
- */
-static h5tool_format_t         xml_dataformat = {
-    0,              /*raw */
-
-    "",             /*fmt_raw */
-    "%d",           /*fmt_int */
-    "%u",           /*fmt_uint */
-    "%hhd",           /*fmt_schar */
-    "%u",           /*fmt_uchar */
-    "%d",           /*fmt_short */
-    "%u",           /*fmt_ushort */
-    "%ld",          /*fmt_long */
-    "%lu",          /*fmt_ulong */
-    NULL,           /*fmt_llong */
-    NULL,           /*fmt_ullong */
-    "%g",           /*fmt_double */
-    "%g",           /*fmt_float */
-
-    0,              /*ascii */
-    0,              /*str_locale */
-    0,              /*str_repeat */
-
-    "",            /*arr_pre */
-    "",             /*arr_sep */
-    "",             /*arr_suf */
-    1,              /*arr_linebreak */
-
-    "",             /*cmpd_name */
-    "",             /*cmpd_sep */
-    "",             /*cmpd_pre */
-    "",             /*cmpd_suf */
-    "",             /*cmpd_end */
-    "",             /*cmpd_listv */
-
-    " ",            /*vlen_sep */
-    " ",            /*vlen_pre */
-    "",             /*vlen_suf */
-    "",             /*vlen_end */
-
-    "%s",           /*elmt_fmt */
-    "",             /*elmt_suf1 */
-    " ",            /*elmt_suf2 */
-
-    "",             /*idx_n_fmt */
-    "",             /*idx_sep */
-    "",             /*idx_fmt */
-
-    80,             /*line_ncols *//*standard default columns */
-    0,              /*line_per_line */
-    "",             /*line_pre */
-    "%s",           /*line_1st */
-    "%s",           /*line_cont */
-    "",             /*line_suf */
-    "",             /*line_sep */
-    1,              /*line_multi_new */
-    "   ",          /*line_indent */
-
-    1,              /*skip_first */
-
-    1,              /*obj_hidefileno */
-    " "H5_PRINTF_HADDR_FMT, /*obj_format */
-
-    1,              /*dset_hidefileno */
-    "DATASET %s ",  /*dset_format */
-    "%s",           /*dset_blockformat_pre */
-    "%s",           /*dset_ptformat_pre */
-    "%s",           /*dset_ptformat */
-     0,             /*array indices */
-     0              /*escape non printable characters */
-};
-
-
-/* internal functions */
-static int      xml_name_to_XID(const char *, char *, int , int );
-
-/* internal functions used by XML option */
-static void             xml_print_datatype(hid_t, unsigned);
-static void             xml_print_enum(hid_t);
-static int              xml_print_refs(hid_t, int);
-static int              xml_print_strs(hid_t, int);
-static char            *xml_escape_the_string(const char *, int);
-static char            *xml_escape_the_name(const char *);
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_all_cb
- *
- * Purpose:     function callback called by H5Literate,
- *                displays everything in the specified object
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- * Programmer:  Ruey-Hsia Li
- *
- * Modifications:
- *  RMcG, November 2000
- *   Added XML support. Also, optionally checks the op_data argument
- *
- * PVN, May 2008
- *   Dump external links
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
-{
-    hid_t       obj;
-    herr_t      ret = SUCCEED;
-    char       *obj_path = NULL;    /* Full path of object */
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    /* Build the object's path name */
-    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
-    if(!obj_path) {
-        ret = FAIL;
-        goto done;
-    } 
-
-    HDstrcpy(obj_path, prefix);
-    HDstrcat(obj_path, "/");
-    HDstrcat(obj_path, name);
-
-    if(linfo->type == H5L_TYPE_HARD) {
-        H5O_info_t  oinfo;
-
-        /* Stat the object */
-        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
-            error_msg("unable to get object information for \"%s\"\n", name);
-            h5tools_setstatus(EXIT_FAILURE);
-            ret = FAIL;
-            goto done;
-        } /* end if */
-
-        switch(oinfo.type) {
-        case H5O_TYPE_GROUP:
-            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
-                error_msg("unable to dump group \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            else {
-                char *old_prefix; /* Pointer to previous prefix */
-
-                /* Keep copy of prefix before iterating into group */
-                old_prefix = HDstrdup(prefix);
-                HDassert(old_prefix);
-
-                /* Append group name to prefix */
-                add_prefix(&prefix, &prefix_len, name);
-
-                /* Iterate into group */
-                dump_function_table->dump_group_function(obj, name);
-
-                /* Restore old prefix name */
-                HDstrcpy(prefix, old_prefix);
-                HDfree(old_prefix);
-
-                /* Close group */
-                H5Gclose(obj);
-            }
-            break;
-
-        case H5O_TYPE_DATASET:
-            if((obj = H5Dopen2(group, name, H5P_DEFAULT)) >= 0) {
-                if(oinfo.rc > 1 || hit_elink) {
-                    obj_t  *found_obj;    /* Found object */
-
-                    found_obj = search_obj(dset_table, oinfo.addr);
-
-                    if(found_obj == NULL) {
-                        ctx.indent_level++;
-
-                        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, "%s \"%s\" %s",
-                                h5tools_dump_header_format->datasetbegin, name,
-                                h5tools_dump_header_format->datasetblockbegin);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-
-                        ctx.need_prefix = TRUE;
-                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-                        /* Render the element */
-                        h5tools_str_reset(&buffer);
-                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
-                            if(HDstrlen(h5tools_dump_header_format->datasetend))
-                                h5tools_str_append(&buffer, " ");
-                        }
-                        if(HDstrlen(h5tools_dump_header_format->datasetend))
-                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        ctx.indent_level--;
-
-                        h5tools_setstatus(EXIT_FAILURE);
-                        ret = FAIL;
-                        H5Dclose(obj);
-                        goto done;
-                    } 
-                    else if(found_obj->displayed) {
-                        /* the XML version */
-                        char *t_obj_path = xml_escape_the_name(obj_path);
-                        char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
-                        char *t_name = xml_escape_the_name(name);
-                        char *t_objname = xml_escape_the_name(found_obj->objname);
-                        char dsetxid[100];
-                        char parentxid[100];
-                        char pointerxid[100];
-
-                        /* Create OBJ-XIDs for the parent and object */
-                        xml_name_to_XID(obj_path, dsetxid, (int)sizeof(dsetxid), 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);
-
-                        /* Render the element */
-                        h5tools_str_reset(&buffer);
-                        h5tools_str_append(&buffer, "<%sDataset Name=\"%s\" OBJ-XID=\"%s-%d\" "
-                                "H5Path=\"%s\" Parents=\"%s\" "
-                                "H5ParentPaths=\"%s\">",
-                                xmlnsprefix,
-                                t_name,                     /* Dataset Name */
-                                dsetxid, get_next_xid(),    /* OBJ-XID */
-                                t_obj_path,                 /* H5Path */
-                                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);
-
-                        xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
-
-                        ctx.indent_level++;
-
-                        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, "<%sDatasetPtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
-                                xmlnsprefix,
-                                pointerxid,t_objname);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        ctx.indent_level--;
-
-                        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, "</%sDataset>", xmlnsprefix);
-                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                        HDfree(t_name);
-                        HDfree(t_obj_path);
-                        HDfree(t_prefix);
-                        HDfree(t_objname);
-
-                        H5Dclose(obj);
-                        goto done;
-                    } 
-                    else {
-                        found_obj->displayed = TRUE;
-                    }
-                } /* end if */
-
-                dump_function_table->dump_dataset_function(obj, name, NULL);
-                H5Dclose(obj);
-            } 
-            else {
-                error_msg("unable to dump dataset \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            }
-            break;
-
-        case H5O_TYPE_NAMED_DATATYPE:
-            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
-                error_msg("unable to dump datatype \"%s\"\n", name);
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            } 
-            else {
-                dump_function_table->dump_named_datatype_function(obj, name);
-                H5Tclose(obj);
-            }
-            break;
-
-        case H5O_TYPE_UNKNOWN:
-        case H5O_TYPE_NTYPES:
-        default:
-            error_msg("unknown object \"%s\"\n", name);
-            h5tools_setstatus(EXIT_FAILURE);
-            ret = FAIL;
-        }
-    } /* end if */
-    else {
-        char       *targbuf;
-
-        switch(linfo->type) {
-        case H5L_TYPE_SOFT:
-            targbuf = (char *)HDmalloc(linfo->u.val_size);
-            HDassert(targbuf);
-
-            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
-                error_msg("unable to get link value\n");
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            } 
-            else {
-                /* print the value of a soft link */
-                /* XML */
-                char linkxid[100];
-                char parentxid[100];
-                char targetxid[100];
-                char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
-                char *t_name = xml_escape_the_name(name);
-                char *t_targbuf = xml_escape_the_name(targbuf);
-                char *t_obj_path = xml_escape_the_name(obj_path);
-                char *t_link_path;
-                int res;
-
-                t_link_path = (char *)HDmalloc(HDstrlen(prefix) + linfo->u.val_size + 1);
-                if(targbuf[0] == '/')
-                    HDstrcpy(t_link_path, targbuf);
-                else {
-                    HDstrcpy(t_link_path, prefix);
-                    HDstrcat(HDstrcat(t_link_path, "/"), targbuf);
-                } /* end else */
-
-                /* 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);
-
-                /* Try to create an OBJ-XID for the object pointed to */
-                res = xml_name_to_XID(t_link_path, targetxid, (int)sizeof(targetxid), 0);
-                if (res == 0) {
-                    /* target obj found */
-                    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, "<%sSoftLink LinkName=\"%s\" "
-                            "OBJ-XID=\"%s\" "
-                            "H5SourcePath=\"%s\" "
-                            "TargetPath=\"%s\" TargetObj=\"%s\" "
-                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
-                            xmlnsprefix,
-                            t_name,         /* LinkName */
-                            linkxid,        /* OBJ-XID */
-                            t_obj_path,     /* H5SourcePath */
-                            t_targbuf,      /* TargetPath */
-                            targetxid,      /* TargetObj */
-                            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);
-                } 
-                else {
-                    /* dangling link -- omit from xml attributes */
-                    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, "<%sSoftLink LinkName=\"%s\" "
-                            "OBJ-XID=\"%s\" "
-                            "H5SourcePath=\"%s\" "
-                            "TargetPath=\"%s\"  "
-                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
-                            xmlnsprefix,
-                            t_name,         /* LinkName */
-                            linkxid,        /* OBJ-XID */
-                            t_obj_path,     /* H5SourcePath */
-                            t_targbuf,      /* TargetPath */
-                            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_targbuf);
-                HDfree(t_obj_path);
-                HDfree(t_link_path);
-            }
-
-            HDfree(targbuf);
-            break;
-
-        case H5L_TYPE_EXTERNAL:
-            targbuf = (char *)HDmalloc(linfo->u.val_size);
-            HDassert(targbuf);
-
-            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
-                error_msg("unable to get external link value\n");
-                h5tools_setstatus(EXIT_FAILURE);
-                ret = FAIL;
-            } /* end if */
-            else {
-                const char *filename;
-                const char *targname;
-
-                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
-                    error_msg("unable to unpack external link value\n");
-                    h5tools_setstatus(EXIT_FAILURE);
-                    ret = FAIL;
-                } /* end if */
-                else {
-                    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 *t_filename = xml_escape_the_name(filename);
-                    char *t_targname = xml_escape_the_name(targname);
-
-                    /* 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);
-
-                    /* Render the element */
-                    h5tools_str_reset(&buffer);
-                    h5tools_str_append(&buffer, "<%sExternalLink LinkName=\"%s\" "
-                            "OBJ-XID=\"%s\" "
-                            "H5SourcePath=\"%s\" "
-                            "TargetFilename=\"%s\"  "
-                            "TargetPath=\"%s\"  "
-                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
-                            xmlnsprefix,
-                            t_name,         /* LinkName */
-                            linkxid,        /* OBJ-XID */
-                            t_obj_path,     /* H5SourcePath */
-                            filename,       /* TargetFilename */
-                            targname,       /* TargetPath*/
-                            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_filename);
-                    HDfree(t_targname);
-                    HDfree(t_obj_path);
-                } /* end else */
-            } /* end else */
-            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);
-
-                /* 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);
-
-                /* 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 */
-
-done:
-
-    h5tools_str_close(&buffer);
-
-    if(obj_path)
-        HDfree(obj_path);
-    return ret;
-}
-
-/*
- * create a string suitable for and XML NCNAME.  Uses the
- * object reference to create the string.
- *
- *  'gen'; 0 - return null if not found
- *         1 - generate a fake entry and return fake id.
- */
-int
-xml_name_to_XID(const char *str , char *outstr, int outlen, int gen)
-{
-    haddr_t objno;      /* Object ID for object at path */
-
-    if (outlen < 22) return 1;
-
-    objno = ref_path_table_lookup(str);
-    if (objno == HADDR_UNDEF) {
-        if (HDstrlen(str) == 0) {
-            objno = ref_path_table_lookup("/");
-            if (objno == HADDR_UNDEF) {
-                if (gen) {
-                    objno = ref_path_table_gen_fake(str);
-                    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
-                    return 0;
-                } 
-                else {
-                    return 1;
-                }
-            }
-        } 
-        else {
-            if (gen) {
-                objno = ref_path_table_gen_fake(str);
-                sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
-                return 0;
-            } 
-            else {
-                return 1;
-            }
-        }
-    }
-
-    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
-
-    return(0);
-}
-
-static const char      *quote = """;
-static const char      *amp = "&";
-static const char      *lt = "<";
-static const char      *gt = ">";
-static const char      *apos = "'";
-
-/*-------------------------------------------------------------------------
- * Function:    xml_escape_the_name
- *
- * Purpose:     Escape XML reserved chars in a name, so HDF5 strings
- *              and paths can be correctly read back in XML element.
- *
- * Return:      The revised string.
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static char                   *
-xml_escape_the_name(const char *str)
-{
-    size_t      extra;
-    size_t      len;
-    size_t      i;
-    const char *cp;
-    char       *ncp;
-    char       *rcp;
-    size_t      ncp_len;
-
-    if (!str)
-        return NULL;
-
-    cp = str;
-    len = HDstrlen(str);
-    extra = 0;
-
-    for (i = 0; i < len; i++) {
-        if (*cp == '\"')
-            extra += (HDstrlen(quote) - 1);
-        else if (*cp == '\'')
-            extra += (HDstrlen(apos) - 1);
-        else if (*cp == '<')
-            extra += (HDstrlen(lt) - 1);
-        else if (*cp == '>')
-            extra += (HDstrlen(gt) - 1);
-        else if (*cp == '&')
-            extra += (HDstrlen(amp) - 1);
-
-        cp++;
-    }
-
-    if (extra == 0)
-        return HDstrdup(str);
-
-    cp = str;
-    ncp_len = len + extra + 1;
-    rcp = ncp = (char *)HDmalloc(ncp_len);
-
-    if (!ncp)
-        return NULL;    /* ?? */
-
-    for (i = 0; i < len; i++) {
-        size_t esc_len;
-
-        HDassert(ncp_len);
-        if (*cp == '\'') {
-            HDstrncpy(ncp, apos, ncp_len);
-            esc_len = HDstrlen(apos);
-        } 
-        else if (*cp == '<') {
-            HDstrncpy(ncp, lt, ncp_len);
-            esc_len = HDstrlen(lt);
-        } 
-        else if (*cp == '>') {
-            HDstrncpy(ncp, gt, ncp_len);
-            esc_len = HDstrlen(gt);
-        } 
-        else if (*cp == '\"') {
-            HDstrncpy(ncp, quote, ncp_len);
-            esc_len = HDstrlen(quote);
-        } 
-        else if (*cp == '&') {
-            HDstrncpy(ncp, amp, ncp_len);
-            esc_len = HDstrlen(amp);
-        } 
-        else {
-            *ncp = *cp;
-            esc_len = 1;
-        }
-        ncp += esc_len;
-        ncp_len -= esc_len;
-        cp++;
-    }
-
-    *ncp = '\0';
-    return rcp;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_escape_the_string
- *
- * Purpose:     Escape XML reserved chars in a string, so HDF5 strings
- *              and paths can be correctly read back in XML CDATA.
- *
- * Return:      The revised string.
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static char                   *
-xml_escape_the_string(const char *str, int slen)
-{
-    size_t      extra;
-    size_t      len;
-    size_t      i;
-    const char *cp;
-    char       *ncp;
-    char       *rcp;
-    size_t      ncp_len;
-
-    if (!str)
-        return NULL;
-
-    cp = str;
-
-    if (slen < 0)
-        len = HDstrlen(str);
-    else
-        len = slen;
-
-    extra = 0;
-
-    for (i = 0; i < len; i++) {
-        if (*cp == '\\')
-            extra++;
-        else if (*cp == '\"')
-            extra++;
-        else if (*cp == '\'')
-            extra += (HDstrlen(apos) - 1);
-        else if (*cp == '<')
-            extra += (HDstrlen(lt) - 1);
-        else if (*cp == '>')
-            extra += (HDstrlen(gt) - 1);
-        else if (*cp == '&')
-            extra += (HDstrlen(amp) - 1);
-        cp++;
-    }
-
-    cp = str;
-    ncp_len = len + extra + 1;
-    rcp = ncp = (char *) HDcalloc(ncp_len, sizeof(char));
-
-    if (ncp == NULL)
-        return NULL; /* ?? */
-
-    for (i = 0; i < len; i++) {
-        size_t esc_len;
-
-        HDassert(ncp_len);
-        if (*cp == '\\') {
-            *ncp++ = '\\';
-            *ncp = *cp;
-            esc_len = 1;
-        }
-        else if (*cp == '\"') {
-            *ncp++ = '\\';
-            *ncp = *cp;
-            esc_len = 1;
-        }
-        else if (*cp == '\'') {
-            HDstrncpy(ncp, apos, ncp_len);
-            esc_len = HDstrlen(apos);
-        }
-        else if (*cp == '<') {
-            HDstrncpy(ncp, lt, ncp_len);
-            esc_len = HDstrlen(lt);
-        }
-        else if (*cp == '>') {
-            HDstrncpy(ncp, gt, ncp_len);
-            esc_len = HDstrlen(gt);
-        }
-        else if (*cp == '&') {
-            HDstrncpy(ncp, amp, ncp_len);
-            esc_len = HDstrlen(amp);
-        }
-        else {
-            *ncp = *cp;
-            esc_len = 1;
-        }
-        ncp += esc_len;
-        ncp_len -= esc_len;
-        cp++;
-    }
-
-    *ncp = '\0';
-    return rcp;
-}
-
-/**
- **  XML print functions--these replace some functions in the
- **  h5tools.c suite.
- **/
-
-/*-------------------------------------------------------------------------
- * Function:    xml_print_datatype
- *
- * Purpose:     Print description of a datatype in XML.
- *              Note:  this is called inside a <DataType> element.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-xml_print_datatype(hid_t type, unsigned in_group)
-{
-    char                   *mname;
-    hid_t                   mtype;
-    unsigned                nmembers;
-    unsigned                ndims;
-    unsigned                i;
-    size_t                  size;
-    hsize_t                 dims[H5DUMP_MAX_RANK];
-    H5T_str_t               str_pad;
-    H5T_cset_t              cset;
-    hid_t                   super;
-    H5T_order_t             ord;
-    H5T_sign_t              sgn;
-    size_t                  sz;
-    size_t                  spos;
-    size_t                  epos;
-    size_t                  esize;
-    size_t                  mpos;
-    size_t                  msize;
-    int                     nmembs;
-    htri_t                  is_vlstr=FALSE;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    if(!in_group && H5Tcommitted(type) > 0) {
-        H5O_info_t oinfo;
-        obj_t  *found_obj;    /* Found object */
-
-        /* detect a shared datatype, output only once */
-        H5Oget_info(type, &oinfo);
-        found_obj = search_obj(type_table, oinfo.addr);
-
-        if(found_obj) {
-            /* This should be defined somewhere else */
-            /* These 2 cases are handled the same right now, but
-               probably will have something different eventually */
-            char * dtxid = (char *)HDmalloc((size_t)100);
-
-            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
-            if (!found_obj->recorded) {
-                /* 'anonymous' NDT.  Use it's object num.
-                   as it's name.  */
-
-                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, "<%sNamedDataTypePtr OBJ-XID=\"/%s\"/>",
-                        xmlnsprefix, dtxid);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            } 
-            else {
-                /* point to the NDT by name */
-                char *t_objname = xml_escape_the_name(found_obj->objname);
-
-                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
-                        xmlnsprefix, dtxid, t_objname);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                HDfree(t_objname);
-            }
-            HDfree(dtxid);
-        } 
-        else {
-            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, "<!-- h5dump error: unknown committed type. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-    } 
-    else {
-
-        switch (H5Tget_class(type)) {
-        case H5T_INTEGER:
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-
-            /* <hdf5:IntegerType ByteOrder="bo" Sign="torf" Size="bytes"/> */
-            ord = H5Tget_order(type);
-            sgn = H5Tget_sign(type);
-
-            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, "<%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:
-                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;
-                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);
-            h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
-            h5tools_str_append(&buffer, "\" />");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_FLOAT:
-            /* <hdf5:FloatType ByteOrder="bo" Size="bytes"
-               SignBitLocation="bytes"
-               ExponentBits="eb" ExponentLocation="el"
-               MantissaBits="mb" MantissaLocation="ml" /> */
-            ord = H5Tget_order(type);
-
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-
-            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, "<%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;
-                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);
-            h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
-            H5Tget_fields(type, &spos, &epos, &esize, &mpos, &msize);
-            h5tools_str_append(&buffer, "\" SignBitLocation=\"%lu\" ", (unsigned long)spos);
-            h5tools_str_append(&buffer, "ExponentBits=\"%lu\" ExponentLocation=\"%lu\" ", (unsigned long)esize, (unsigned long)epos);
-            h5tools_str_append(&buffer, "MantissaBits=\"%lu\" MantissaLocation=\"%lu\" />", (unsigned long)msize, (unsigned long)mpos);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_TIME:
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-
-            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, "<%sTimeType />",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            h5tools_str_append(&buffer, "<!-- H5T_TIME: not yet implemented -->");
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_STRING:
-            /* <hdf5:StringType Cset="cs" StrSize="chars" StrPad="pad" /> */
-            size = H5Tget_size(type);
-            str_pad = H5Tget_strpad(type);
-            cset = H5Tget_cset(type);
-            is_vlstr = H5Tis_variable_str(type);
-
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level++;
-
-            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, "<%sStringType Cset=\"",xmlnsprefix);
-            if (cset == H5T_CSET_ASCII) {
-                h5tools_str_append(&buffer, "H5T_CSET_ASCII\" ");
-            } 
-            else {
-                h5tools_str_append(&buffer, "unknown_cset\" ");
-            }
-            if(is_vlstr)
-                h5tools_str_append(&buffer, "StrSize=\"H5T_VARIABLE\" StrPad=\"");
-            else
-                h5tools_str_append(&buffer, "StrSize=\"%d\" StrPad=\"", (int) size);
-            if (str_pad == H5T_STR_NULLTERM) {
-                h5tools_str_append(&buffer, "H5T_STR_NULLTERM\"/>");
-            } 
-            else if (str_pad == H5T_STR_NULLPAD) {
-                h5tools_str_append(&buffer, "H5T_STR_NULLPAD\"/>");
-            } 
-            else if (str_pad == H5T_STR_SPACEPAD) {
-                h5tools_str_append(&buffer, "H5T_STR_SPACEPAD\"/>");
-            } 
-            else {
-                h5tools_str_append(&buffer, "H5T_STR_ERROR\"/>");
-            }
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_BITFIELD:
-            /* <hdf5:BitfieldType ByteOrder="bo" Size="bytes"/> */
-            ord = H5Tget_order(type);
-
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-
-            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, "<%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:
-                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);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_OPAQUE:
-            /* <hdf5:OpaqueType Tag="tag" Size="bytes" /> */
-
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-            mname = H5Tget_tag(type);
-
-            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, "<%sOpaqueType Tag=\"%s\" ",xmlnsprefix, mname);
-            H5free_memory(mname);
-            size = H5Tget_size(type);
-            h5tools_str_append(&buffer, "Size=\"%lu\"/>", (unsigned long)size);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_COMPOUND:
-            /* recursively describe the components of a compound datatype */
-
-            /* type of a dataset */
-            nmembers = H5Tget_nmembers(type);
-
-            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, "<%sCompoundType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            /* List each member Field of the type */
-            /*   <hdf5:Field FieldName="name" > */
-            /*   <hdf5:DataType > */
-            ctx.indent_level++;
-            dump_indent += COL;
-            for (i = 0; i < nmembers; i++) {
-                char *t_fname;
-
-                mname = H5Tget_member_name(type, i);
-                mtype = H5Tget_member_type(type, i);
-                t_fname = xml_escape_the_name(mname);
-
-                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, "<%sField FieldName=\"%s\">",xmlnsprefix, t_fname);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                H5free_memory(mname);
-                HDfree(t_fname);
-                dump_indent += COL;
-                ctx.indent_level++;
-
-                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, "<%sDataType>",xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                ctx.indent_level++;
-                dump_indent += COL;
-                xml_print_datatype(mtype,0);
-                dump_indent -= COL;
-                ctx.indent_level--;
-
-                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, "</%sDataType>",xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                dump_indent -= COL;
-                ctx.indent_level--;
-
-                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, "</%sField>",xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sCompoundType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_REFERENCE:
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-            /*  Only Object references supported at this time */
-
-            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, "<%sReferenceType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-
-            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, "<%sObjectReferenceType />",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sReferenceType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_ENUM:
-            /*  <hdf5:EnumType Nelems="ne" > list Name, values of enum */
-            nmembs = H5Tget_nmembers(type);
-
-            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, "<%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent += COL;
-            ctx.indent_level++;
-
-            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, "<%sEnumType Nelems=\"%d\">",xmlnsprefix, nmembs);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            xml_print_enum(type);
-
-            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, "</%sEnumType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sAtomicType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_VLEN:
-            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, "<%sVLType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            super = H5Tget_super(type);
-            dump_indent += COL;
-            ctx.indent_level++;
-
-            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, "<%sDataType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent += COL;
-            ctx.indent_level++;
-            xml_print_datatype(super,0);
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sDataType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sVLType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            H5Tclose(super);
-
-            break;
-
-        case H5T_ARRAY:
-            /* Get array base type */
-            super = H5Tget_super(type);
-
-            /* Print lead-in */
-            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, "<%sArrayType Ndims=\"",xmlnsprefix);
-            ndims = H5Tget_array_ndims(type);
-            h5tools_str_append(&buffer, "%u\">", ndims);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            /* Get array information */
-            H5Tget_array_dims2(type, dims);
-
-            /* list of dimensions */
-            ctx.indent_level++;
-            for (i = 0; i < ndims; i++) {
-                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, "<%sArrayDimension DimSize=\"%u\"/>", xmlnsprefix, (int) dims[i]);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-            ctx.indent_level--;
-
-            dump_indent += COL;
-            ctx.indent_level++;
-
-            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, "<%sDataType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent += COL;
-            ctx.indent_level++;
-            xml_print_datatype(super,0);
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sDataType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            dump_indent -= COL;
-            ctx.indent_level--;
-
-            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, "</%sArrayType>",xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            /* Close array base type */
-            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);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "<!-- unknown datatype -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            h5tools_setstatus(EXIT_FAILURE);
-            break;
-        }
-    } /* end else */
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_datatype
- *
- * Purpose:     Dump description of a datatype in XML.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_datatype(hid_t type)
-{
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    if(H5Tcommitted(type) > 0) {
-        H5O_info_t oinfo;
-        obj_t  *found_obj;    /* Found object */
-
-        /* Datatype is a shared or named datatype */
-        H5Oget_info(type, &oinfo);
-        found_obj = search_obj(type_table, oinfo.addr);
-
-        if(found_obj) {
-            /* Shared datatype, must be entered as an object  */
-            /* These 2 cases are the same now, but may change */
-            char *dtxid = (char *)HDmalloc((size_t)100);
-
-            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
-            if (!found_obj->recorded) {
-                /* anonymous stored datatype:
-                   following the dumper's current
-                   practice:
-                   use it's object ref as its name
-                 */
-
-                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\"/>",
-                        xmlnsprefix, dtxid);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            } 
-            else {
-                /* pointer to a named datatype already in XML */
-                char *t_objname = xml_escape_the_name(found_obj->objname);
-
-                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\" />",
-                        xmlnsprefix, dtxid, t_objname);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                HDfree(t_objname);
-            }
-            HDfree(dtxid);
-        } 
-        else {
-            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, "<!-- h5dump error: unknown committed type. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-    }
-    else {
-        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, "<%sDataType>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-        dump_indent += COL;
-        xml_print_datatype(type, 0);
-        ctx.indent_level--;
-        dump_indent -= COL;
-
-        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, "</%sDataType>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_dataspace
- *
- * Purpose:     Dump description of a dataspace in XML.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_dataspace(hid_t space)
-{
-    hsize_t         size[H5DUMP_MAX_RANK];
-    hsize_t         maxsize[H5DUMP_MAX_RANK];
-    int             i;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-    
-    int             ndims = H5Sget_simple_extent_dims(space, size, maxsize);
-    H5S_class_t     space_type = H5Sget_simple_extent_type(space);
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    ctx.indent_level++;
-
-    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, "<%sDataspace>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    ctx.indent_level++;
-
-    switch (space_type) {
-    case H5S_SCALAR:
-        /* scalar dataspace (just a tag, no XML attrs. defined */
-
-        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, "<%sScalarDataspace />",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        break;
-
-    case H5S_SIMPLE:
-        /* simple dataspace */
-        /* <hdf5:SimpleDataspace Ndims="nd"> */
-
-        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, "<%sSimpleDataspace Ndims=\"%d\">",xmlnsprefix, ndims);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        /* print the <hdf5:Dimension> elements */
-        ctx.indent_level++;
-        for (i = 0; i < ndims; i++) {
-            if (maxsize[i] == H5S_UNLIMITED) {
-                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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"UNLIMITED\"/>",
-                        xmlnsprefix,size[i]);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            } 
-            else if (maxsize[i] == (hsize_t) 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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
-                        xmlnsprefix,size[i], size[i]);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            } 
-            else {
-                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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
-                        xmlnsprefix, size[i], maxsize[i]);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-        }
-        ctx.indent_level--;
-
-        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, "</%sSimpleDataspace>", xmlnsprefix );
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        break;
-
-#ifdef TMP
-        /* Commented out: wait until the schema is updated first */
-    case H5S_NULL:
-        /* null dataspace (just a tag, no XML attrs. defined */
-
-        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, "<%sNullDataspace />",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-       break;
-#endif /* TMP */
-
-    case H5S_NULL:
-    case H5S_NO_CLASS:
-    default:
-        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, "<!-- unknown dataspace -->");
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-
-    ctx.indent_level--;
-
-    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, "</%sDataspace>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    ctx.indent_level--;
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_data
- *
- * Purpose:     Dump description of data in XML.
- *              Note that this calls the h5dump_xxx calls in
- *              the h5tools library.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_data(hid_t obj_id, int obj_data, struct subset_t H5_ATTR_UNUSED * sset, int H5_ATTR_UNUSED pindex)
-{
-    hid_t               space = -1;
-    hid_t               type = -1;
-    hid_t               p_type = -1;
-    hsize_t             size[64];
-    hsize_t             nelmts = 1;
-    int                 ndims;
-    int                 i;
-    int                 status = -1;
-    void               *buf = NULL;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *outputformat = &xml_dataformat;
-    h5tool_format_t     string_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    /* Print all the values. */
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-    string_dataformat.cmpd_sep = " ";
-    string_dataformat.cmpd_pre = "";
-    string_dataformat.cmpd_suf = "";
-    string_dataformat.cmpd_end = "";
-    string_dataformat.arr_linebreak = 0;
-    string_dataformat.arr_pre = "";
-    outputformat = &string_dataformat;
-
-    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, "<%sData>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level++;
-
-    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, "<%sDataFromFile>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level--;
-    
-    dump_indent += COL;
-    ctx.indent_level++;
-
-    if (obj_data == DATASET_DATA) {
-        type = H5Dget_type(obj_id);
-        if (H5Tget_class(type) == H5T_REFERENCE) {
-            status = xml_print_refs(obj_id, DATASET_DATA);
-        } 
-        else if (H5Tget_class(type) == H5T_STRING) {
-            status = xml_print_strs(obj_id, DATASET_DATA);
-        } 
-        else {
-            h5tools_context_t datactx;
-            HDmemset(&datactx, 0, sizeof(datactx));
-            datactx.need_prefix = TRUE;
-            datactx.indent_level = ctx.indent_level;
-            datactx.cur_column = ctx.cur_column;
-            status = h5tools_dump_dset(rawoutstream, outputformat, &datactx, obj_id, NULL);
-        }
-    } 
-    else {
-        /* Attribute data */
-        type = H5Aget_type(obj_id);
-
-        if (H5Tget_class(type) == H5T_REFERENCE) {
-            /* references are done differently than
-               the standard output:
-               XML dumps a path to the object
-               referenced.
-             */
-            status = xml_print_refs(obj_id, ATTRIBUTE_DATA);
-            H5Tclose(type);
-        } 
-        else if (H5Tget_class(type) == H5T_STRING) {
-            status = xml_print_strs(obj_id, ATTRIBUTE_DATA);
-        } 
-        else {  /* all other data */
-            /* VL data special information */
-            unsigned int vl_data = 0; /* contains VL datatypes */
-            
-            p_type = h5tools_get_native_type(type);
-
-            /* Check if we have VL data in the dataset's datatype */
-            if (h5tools_detect_vlen(p_type) == TRUE)
-                vl_data = TRUE;
-
-            H5Tclose(type);
-
-            space = H5Aget_space(obj_id);
-
-            ndims = H5Sget_simple_extent_dims(space, size, NULL);
-
-            for (i = 0; i < ndims; i++)
-                nelmts *= size[i];
-
-            buf = HDmalloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))));
-            HDassert(buf);
-            
-            if (H5Aread(obj_id, p_type, buf) >= 0) {
-                h5tools_context_t datactx;
-                HDmemset(&datactx, 0, sizeof(datactx));
-                datactx.need_prefix = TRUE;
-                datactx.indent_level = ctx.indent_level;
-                datactx.cur_column = ctx.cur_column;
-                status = h5tools_dump_mem(rawoutstream, outputformat, &datactx, obj_id, p_type, space, buf);
-            }
-            /* Reclaim any VL memory, if necessary */
-            if (vl_data)
-                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
-
-            HDfree(buf);
-            H5Tclose(p_type);
-            H5Sclose(space);
-            H5Tclose(type);
-        }
-    }
-
-    if (status == FAIL) {
-        ctx.indent_level++;
-
-        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, "Unable to print data.");
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        ctx.indent_level--;
-
-        status = 1;
-    }
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    ctx.indent_level++;
-
-    ctx.need_prefix = TRUE;
-    
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    h5tools_str_append(&buffer, "</%sDataFromFile>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level--;
-
-    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, "</%sData>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_attr
- *
- * Purpose:     Dump a description of an HDF5 attribute in XML.
- *
- * Return:      herr_t
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-xml_dump_attr(hid_t attr, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info,
-    void H5_ATTR_UNUSED * op_data)
-{
-    hid_t             attr_id = -1;
-    hid_t             type = -1;
-    hid_t             space = -1;
-    H5S_class_t       space_type;
-    hsize_t           curr_pos = 0;        /* total data element position   */
-    h5tools_str_t     buffer;          /* string into which to render   */
-    h5tools_context_t ctx;           /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    
-    char *t_aname = xml_escape_the_name(attr_name);
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    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, "<%sAttribute Name=\"%s\">", xmlnsprefix, t_aname);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    HDfree(t_aname);
-
-    if ((attr_id = H5Aopen(attr, attr_name, H5P_DEFAULT)) >= 0) {
-        type = H5Aget_type(attr_id);
-        space = H5Aget_space(attr_id);
-        space_type = H5Sget_simple_extent_type(space);
-
-        dump_function_table->dump_dataspace_function(space);
-        dump_function_table->dump_datatype_function(type);
-
-        ctx.indent_level++;
-        dump_indent += COL;
-
-        if (display_attr_data && space_type != H5S_NULL) {
-            switch (H5Tget_class(type)) {
-            case H5T_INTEGER:
-            case H5T_FLOAT:
-            case H5T_STRING:
-            case H5T_BITFIELD:
-            case H5T_OPAQUE:
-            case H5T_ENUM:
-            case H5T_ARRAY:
-                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
-                break;
-
-            case H5T_TIME:
-                ctx.indent_level++;
-                dump_indent += COL;
-
-                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, "<%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Time data not yet implemented. -->");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<hdf5:Data>");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                ctx.indent_level--;
-                dump_indent -= COL;
-                break;
-
-            case H5T_COMPOUND:
-                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, "<!-- Note: format of compound data not specified -->");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
-                break;
-
-            case H5T_REFERENCE:
-                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, "<%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
-                    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, "<!-- Note: Region references not supported -->");
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                }
-                else {
-                    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, "<%sDataFromFile>", xmlnsprefix);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                    xml_print_refs(attr_id, ATTRIBUTE_DATA);
-
-                    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, "</%sDataFromFile>", xmlnsprefix);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-
-            case H5T_VLEN:
-                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, "<!-- Note: format of VL data not specified -->");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                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);
-                
-                /* Render the element */
-                h5tools_str_reset(&buffer);
-                h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-            }
-        }
-        else {
-            /* The case of an attribute never yet written ??
-             * Or dataspace is H5S_NULL. */
-            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, "<%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level++;
-
-            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, "<%sNoData/>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level--;
-
-            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, "</%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-        ctx.indent_level--;
-        dump_indent -= COL;
-
-        H5Tclose(type);
-        H5Sclose(space);
-        H5Aclose(attr_id);
-
-        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, "</%sAttribute>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        h5tools_str_close(&buffer);
-        return SUCCEED;
-    }
-    else {
-        /* ?? failed */
-        ctx.indent_level++;
-
-        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, "<!-- h5dump error: unable to open attribute. -->");
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        ctx.indent_level--;
-
-        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, "</%sAttribute>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        h5tools_str_close(&buffer);
-        
-        h5tools_setstatus(EXIT_FAILURE);
-        return FAIL;
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_named_datatype
- *
- * Purpose:     Dump a description of an HDF5 NDT in XML.
- *
- * Return:      herr_t
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_named_datatype(hid_t type, const char *name)
-{
-    hsize_t           curr_pos = 0;        /* total data element position   */
-    h5tools_str_t     buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    char             *tmp;
-    char             *dtxid;
-    char             *parentxid;
-    char             *t_tmp;
-    char             *t_prefix;
-    char             *t_name;
-
-    tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
-    HDstrcpy(tmp, prefix);
-    HDstrcat(tmp, "/");
-    HDstrcat(tmp, name);
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    dtxid = (char *)HDmalloc((size_t)100);
-    parentxid = (char *)HDmalloc((size_t)100);
-    t_tmp = xml_escape_the_name(tmp);
-    t_prefix = xml_escape_the_name(prefix);
-    t_name = xml_escape_the_name(name);
-
-    xml_name_to_XID(tmp, dtxid, 100, 1);
-    xml_name_to_XID(prefix, parentxid, 100, 1);
-    if(HDstrncmp(name, "#", (size_t)1) == 0) {
-        /*  Special:  this is an 'anonymous' NDT, deleted but
-           still in use.
-           We follow the dumper's undocumented practice, and
-           use its object id as its name.
-           Exactly the same as normal, but a separate case
-           in the event we want to do something else in
-           the future.
-         */
-
-        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, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
-                "Parents=\"%s\" H5ParentPaths=\"%s\">",
-                xmlnsprefix,
-                name, dtxid,
-                parentxid, HDstrcmp(prefix,"") ? t_prefix : "/");
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    } 
-    else {
-        H5O_info_t  oinfo;          /* Object info */
-
-        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, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
-                "H5Path=\"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
-                xmlnsprefix,
-                t_name, dtxid,
-                t_tmp, parentxid, (HDstrcmp(prefix, "") ? t_prefix : "/"));
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        /* Check uniqueness of named datatype */
-        H5Oget_info(type, &oinfo);
-        if(oinfo.rc > 1) {
-            obj_t       *found_obj;     /* Found object */
-
-            /* Group with more than one link to it... */
-            found_obj = search_obj(type_table, oinfo.addr);
-
-            if (found_obj == NULL) {
-                indentation(dump_indent);
-                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-                h5tools_setstatus(EXIT_FAILURE);
-                goto done;
-            } 
-            else if(found_obj->displayed) {
-                /* We have already printed this named datatype, print it as a
-                 * NamedDatatypePtr
-                 */
-                char pointerxid[100];
-                char *t_objname = xml_escape_the_name(found_obj->objname);
-
-                ctx.indent_level++;
-                
-                xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
-
-                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, "<%sNamedDatatypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>", xmlnsprefix, pointerxid, t_objname);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                
-                ctx.indent_level--;
-
-                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, "</%sNamedDataType>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                HDfree(t_objname);
-                goto done;
-            } 
-            else
-                found_obj->displayed = TRUE;
-        }
-    }
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    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, "<%sDataType>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level++;
-    dump_indent += COL;
-    xml_print_datatype(type,1);
-    ctx.indent_level--;
-    dump_indent -= COL;
-    
-    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, "</%sDataType>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    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, "</%sNamedDataType>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-done:
-
-    h5tools_str_close(&buffer);
-
-    HDfree(dtxid);
-    HDfree(parentxid);
-    HDfree(t_tmp);
-    HDfree(t_prefix);
-    HDfree(t_name);
-    HDfree(tmp);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_group
- *
- * Purpose:     Dump a description of an HDF5 Group (and its members) in XML.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *  Pedro Vicente, October 9, 2007
- *   added parameters to H5A(L)iterate to allow for other iteration orders
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_group(hid_t gid, const char *name)
-{
-    H5O_info_t              oinfo;
-    hid_t                   gcpl_id;
-    hid_t                   dset, type;
-    unsigned                crt_order_flags;
-    unsigned                attr_crt_order_flags;
-    int                     isRoot = 0;
-    char                    type_name[1024];
-    char                   *t_objname = NULL;
-    char                   *par_name = NULL;
-    char                   *cp = NULL;
-    char                   *tmp = NULL;
-    char                   *par = NULL;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
-        error_msg("error in getting group creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the group creation properties for attributes */
-    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
-        error_msg("error in getting group creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* query the group creation properties */
-    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
-        error_msg("error in getting group creation properties\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    if(H5Pclose(gcpl_id) < 0) {
-        error_msg("error in closing group creation property list ID\n");
-        h5tools_setstatus(EXIT_FAILURE);
-    }
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    if(HDstrcmp(name, "/") == 0) {
-        isRoot = 1;
-        tmp = HDstrdup("/");
-    }
-    else {
-        tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
-        HDstrcpy(tmp, prefix);
-        par = HDstrdup(tmp);
-        cp = HDstrrchr(par, '/');
-        if(cp) {
-            if((cp == par) && HDstrlen(par) > 1)
-                *(cp + 1) = '\0';
-            else
-                *cp = '\0';
-        }
-    }
-
-    H5Oget_info(gid, &oinfo);
-
-    if(oinfo.rc > 1) {
-        obj_t *found_obj;    /* Found object */
-
-        /* Group with more than one link to it... */
-        found_obj = search_obj(group_table, oinfo.addr);
-
-        if (found_obj == NULL) {
-            indentation(dump_indent);
-            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
-            h5tools_setstatus(EXIT_FAILURE);
-        }
-        else {
-            char *t_name = xml_escape_the_name(name);
-            char *grpxid = (char *)HDmalloc((size_t)100);
-            char *parentxid = (char *)HDmalloc((size_t)100);
-
-            if(found_obj->displayed) {
-                char *ptrstr = (char *)HDmalloc((size_t)100);
-
-                /* already seen: enter a groupptr */
-                if(isRoot) {
-                    /* probably can't happen! */
-                    xml_name_to_XID("/", grpxid, 100, 1);
-
-                    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, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
-                            xmlnsprefix, grpxid, "/");
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                }
-                else {
-                    t_objname = xml_escape_the_name(found_obj->objname);
-                    par_name = xml_escape_the_name(par);
-                    xml_name_to_XID(tmp, grpxid, 100, 1);
-                    xml_name_to_XID(par, parentxid, 100, 1);
-
-                    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, "<%sGroup Name=\"%s\" OBJ-XID=\"%s-%d\" H5Path=\"%s\" "
-                            "Parents=\"%s\" H5ParentPaths=\"%s\">",
-                            xmlnsprefix,t_name, grpxid, get_next_xid(),
-                            t_objname, parentxid, par_name);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                    HDfree(t_objname);
-                    HDfree(par_name);
-                    
-                    ctx.indent_level++;
-
-                    t_objname = xml_escape_the_name(found_obj->objname);/* point to the NDT by name */
-                    par_name = xml_escape_the_name(par);
-                    xml_name_to_XID(found_obj->objname, ptrstr, 100, 1);
-                    xml_name_to_XID(par, parentxid, 100, 1);
-
-                    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, "<%sGroupPtr OBJ-XID=\"%s\" H5Path=\"%s\" "
-                                "Parents=\"%s\" H5ParentPaths=\"%s\" />",
-                                xmlnsprefix,
-                                ptrstr, t_objname, parentxid, par_name);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                    
-                    ctx.indent_level--;
-
-                    HDfree(t_objname);
-                    HDfree(par_name);
-                }
-                HDfree(ptrstr);
-            }
-            else {
-
-                /* first time this group has been seen -- describe it  */
-                if(isRoot) {
-                    xml_name_to_XID("/", grpxid, 100, 1);
-
-                    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, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
-                            xmlnsprefix, grpxid, "/");
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                }
-                else {
-                    char *t_tmp = xml_escape_the_name(tmp);
-
-                    par_name = xml_escape_the_name(par);
-                    xml_name_to_XID(tmp, grpxid, 100, 1);
-                    xml_name_to_XID(par, parentxid, 100, 1);
-
-                    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, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
-                            "Parents=\"%s\" H5ParentPaths=\"%s\" >",
-                            xmlnsprefix,t_name, grpxid, t_tmp, parentxid, par_name);
-                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                    HDfree(t_tmp);
-                    HDfree(par_name);
-                }
-                found_obj->displayed = TRUE;
-
-                /* 1.  do all the attributes of the group */
-                
-                ctx.indent_level++;
-                dump_indent += COL;
-
-                if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
-                    if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-                        error_msg("error getting attribute information\n");
-                        h5tools_setstatus(EXIT_FAILURE);
-                    } /* end if */
-                } /* end if */
-                else {
-                    if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-                        error_msg("error getting attribute information\n");
-                        h5tools_setstatus(EXIT_FAILURE);
-                    } /* end if */
-                } /* end else */
-
-                if(isRoot && unamedtype) {
-                    unsigned u;
-
-                    /* Very special case: dump unamed type in root group */
-                    for(u = 0; u < type_table->nobjs; u++) {
-                        if(!type_table->objs[u].recorded) {
-                            dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
-                            type = H5Dget_type(dset);
-                            sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
-                            dump_function_table->dump_named_datatype_function(type, type_name);
-                            H5Tclose(type);
-                            H5Dclose(dset);
-                        }
-                    }
-                }
-
-                /* iterate through all the links */
-
-                if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
-                    H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
-                else
-                    H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
-
-                dump_indent -= COL;
-                ctx.indent_level--;
-            }
-            HDfree(t_name);
-            HDfree(grpxid);
-            HDfree(parentxid);
-        }
-    }
-    else {
-        /* only link -- must be first time! */
-        char *t_name = xml_escape_the_name(name);
-        char *grpxid = (char *)HDmalloc((size_t)100);
-        char *parentxid = (char *)HDmalloc((size_t)100);
-
-        ctx.need_prefix = TRUE;
-        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-        /* Render the element */
-        h5tools_str_reset(&buffer);
-
-        if(isRoot) {
-            xml_name_to_XID("/", grpxid, 100, 1);
-            h5tools_str_append(&buffer, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">", xmlnsprefix, grpxid, "/");
-        }
-        else {
-            char *t_tmp = xml_escape_the_name(tmp);
-
-            par_name = xml_escape_the_name(par);
-            xml_name_to_XID(tmp, grpxid, 100, 1);
-            xml_name_to_XID(par, parentxid, 100, 1);
-            h5tools_str_append(&buffer, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
-                    "Parents=\"%s\" H5ParentPaths=\"%s\" >",
-                    xmlnsprefix, t_name, grpxid, t_tmp, parentxid, par_name);
-            HDfree(t_tmp);
-            HDfree(par_name);
-        }
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        HDfree(t_name);
-        HDfree(grpxid);
-        HDfree(parentxid);
-
-        /* 1.  do all the attributes of the group */
-        
-        ctx.indent_level++;
-        dump_indent += COL;
-
-        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
-            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-                error_msg("error getting attribute information\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            } /* end if */
-        } /* end if */
-        else {
-            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-                error_msg("error getting attribute information\n");
-                h5tools_setstatus(EXIT_FAILURE);
-            } /* end if */
-        } /* end else */
-
-        if(isRoot && unamedtype) {
-            unsigned u;
-
-            /* Very special case: dump unamed type in root group */
-            for(u = 0; u < type_table->nobjs; u++) {
-                if(!type_table->objs[u].recorded) {
-                    dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
-                    type = H5Dget_type(dset);
-                    sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
-                    dump_function_table->dump_named_datatype_function(type, type_name);
-                    H5Tclose(type);
-                    H5Dclose(dset);
-                }
-            }
-        }
-
-        /* iterate through all the links */
-
-        if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
-            H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
-        else
-            H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
-
-        dump_indent -= COL;
-        ctx.indent_level--;
-    }
-
-    ctx.need_prefix = TRUE;
-    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-    /* Render the element */
-    h5tools_str_reset(&buffer);
-    if(isRoot)
-        h5tools_str_append(&buffer, "</%sRootGroup>", xmlnsprefix);
-    else
-        h5tools_str_append(&buffer, "</%sGroup>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-    
-    if(par)
-        HDfree(par);
-    if(tmp)
-        HDfree(tmp);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_print_refs
- *
- * Purpose:     Print a path to the objects referenced by HDF5 Referneces.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-xml_print_refs(hid_t did, int source)
-{
-    herr_t      e;
-    hid_t       type    = -1;
-    hid_t       space   = -1;
-    hssize_t    ssiz    = -1;
-    hsize_t     i;
-    size_t      tsiz;
-    hobj_ref_t *refbuf = NULL;
-    char       *buf = NULL;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    if (source == DATASET_DATA) {
-        type = H5Dget_type(did);
-    }
-    else if (source == ATTRIBUTE_DATA) {
-        type = H5Aget_type(did);
-    }
-    else {
-        /* return an error */
-        return FAIL;
-    }
-    if (H5Tget_class(type) != H5T_REFERENCE) {
-        /* return an error */
-        goto error;
-    }
-    if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
-        /* region ref not supported yet... */
-        /* return an error */
-        goto error;
-    }
-    if (source == DATASET_DATA) {
-        space = H5Dget_space(did);
-        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
-            goto error;
-        if ((tsiz = H5Tget_size(type)) == 0)
-            goto error;
-
-        buf = (char *) HDcalloc((size_t)(ssiz * tsiz), sizeof(char));
-        if (buf == NULL)
-            goto error;
-        e = H5Dread(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-        /* need to check result here */
-        if (e < 0) {
-            goto error;
-        }
-    }
-    else if (source == ATTRIBUTE_DATA) {
-        space = H5Aget_space(did);
-        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
-            goto error;
-        if ((tsiz = H5Tget_size(type)) == 0)
-            goto error;
-
-        buf = (char *) HDcalloc((size_t)(ssiz * tsiz), sizeof(char));
-        if (buf == NULL) {
-            goto error;
-        }
-        e = H5Aread(did, H5T_STD_REF_OBJ, buf);
-        /* need to check the result here */
-        if (e < 0) {
-            goto error;
-        }
-    }
-
-    refbuf = (hobj_ref_t *) buf;
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    for (i = 0; i < (hsize_t)ssiz; i++) {
-        const char *path = lookup_ref_path(*refbuf);
-        ctx.indent_level++;
-
-        if (!path) {
-            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, "\"%s\"", "NULL");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-        else {
-            char *t_path = xml_escape_the_string(path, -1);
-
-            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, "\"%s\"", t_path);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            HDfree(t_path);
-        }
-        ctx.indent_level--;
-
-        refbuf++;
-    }
-
-    h5tools_str_close(&buffer);
-
-    HDfree(buf);
-    H5Tclose(type);
-    H5Sclose(space);
-    return SUCCEED;
-    
-error:
-    if(buf)
-        HDfree(buf);
-
-    H5E_BEGIN_TRY {
-        H5Tclose(type);
-        H5Sclose(space);
-    } H5E_END_TRY;
-    return FAIL;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_print_strs
- *
- * Purpose:     Print strings.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-xml_print_strs(hid_t did, int source)
-{
-    herr_t      e;
-    hid_t       type    = -1;
-    hid_t       space   = -1;
-    hssize_t    ssiz    = -1;
-    htri_t      is_vlstr = FALSE;
-    size_t      tsiz    = 0;
-    size_t      i;
-    size_t      str_size = 0;
-    char       *bp = NULL;
-    char       *onestring = NULL;
-    void       *buf = NULL;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    if (source == DATASET_DATA) {
-        type = H5Dget_type(did);
-    }
-    else if (source == ATTRIBUTE_DATA) {
-        type = H5Aget_type(did);
-    }
-    else {
-        /* return an error */
-        return FAIL;
-    }
-    if (H5Tget_class(type) != H5T_STRING) {
-        /* return an error */
-        goto error;
-    }
-    /* Check if we have VL data in the dataset's datatype */
-    is_vlstr = H5Tis_variable_str(type);
-
-    if (source == DATASET_DATA) {
-        space = H5Dget_space(did);
-        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
-            goto error;
-        if((tsiz = H5Tget_size(type)) == 0)
-            goto error;
-
-        buf = HDmalloc((size_t)(ssiz * tsiz));
-        if (buf == NULL)
-            goto error;
-
-        e = H5Dread(did, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-        if (e < 0) {
-            goto error;
-        }
-    }
-    else if (source == ATTRIBUTE_DATA) {
-        space = H5Aget_space(did);
-        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
-            goto error;
-        if((tsiz = H5Tget_size(type)) == 0)
-            goto error;
-
-        buf = HDmalloc((size_t)(ssiz * tsiz));
-        if (buf == NULL)
-            goto error;
-
-        e = H5Aread(did, type, buf);
-        if (e < 0) {
-            goto error;
-        }
-    }
-
-    bp = (char*) buf;
-    if (!is_vlstr)
-        onestring = (char *) HDcalloc(tsiz, sizeof(char));
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    for (i = 0; i < ssiz; i++) {
-        if (is_vlstr) {
-            onestring = *(char **) bp;
-            if (onestring)
-                str_size = (size_t) HDstrlen(onestring);
-        }
-        else {
-            HDstrncpy(onestring, bp, tsiz);
-            str_size = tsiz;
-        }
-
-        if (!onestring) {
-            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, "NULL");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-        else {
-            char *t_onestring = xml_escape_the_string(onestring, (int) str_size);
-            if (t_onestring) {
-                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, "\"%s\"", t_onestring);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-                HDfree(t_onestring);
-            }
-        }
-        bp += tsiz;
-    }
-
-    h5tools_str_close(&buffer);
-
-    /* Reclaim any VL memory, if necessary */
-    if (!is_vlstr)
-        if (onestring)
-            HDfree(onestring);
-    if (buf) {
-        if (is_vlstr)
-            H5Dvlen_reclaim(type, space, H5P_DEFAULT, buf);
-        HDfree(buf);
-    }
-    H5Tclose(type);
-    H5Sclose(space);
-    return SUCCEED;
-    
-error:
-    if(buf)
-        HDfree(buf);
-
-    H5E_BEGIN_TRY {
-        H5Tclose(type);
-        H5Sclose(space);
-    } H5E_END_TRY;
-    return FAIL;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    check_filters
- *
- * Purpose:     private function to check for the filters and
- *              put tags in the XML.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-check_filters(hid_t dcpl)
-{
-    int             nfilt;
-    int             i;
-    H5Z_filter_t    filter;
-    char            namebuf[120];
-    size_t          cd_nelmts = 20;
-    unsigned int    cd_values[20];
-    unsigned int    flags;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    nfilt = H5Pget_nfilters(dcpl);
-    if (nfilt <= 0)
-        return;
-    for (i = 0; i < nfilt; i++) {
-        filter = H5Pget_filter2(dcpl, (unsigned) i, &flags, (size_t *) &cd_nelmts, cd_values, (size_t)120, namebuf, NULL);
-        if (filter == H5Z_FILTER_DEFLATE) {
-            ctx.indent_level++;
-            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, "<%sDeflate Level=\"", xmlnsprefix);
-            if (cd_nelmts < 1) {
-                /* not sure what this means? */
-                h5tools_str_append(&buffer, "6");
-            }
-            else {
-                h5tools_str_append(&buffer, "%d", cd_values[0]);
-            }
-            h5tools_str_append(&buffer, "\"/>");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-        }
-        else if (filter == H5Z_FILTER_FLETCHER32) {
-            ctx.indent_level++;
-            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, "<%sFletcher32 />", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-        }
-        else if (filter == H5Z_FILTER_SHUFFLE) {
-            ctx.indent_level++;
-            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, "<%sShuffle />", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-        }
-        else if (filter == H5Z_FILTER_SZIP) {
-            ctx.indent_level++;
-
-            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, "<%sSZIP ", xmlnsprefix);
-            if (cd_nelmts < 2) {
-                /* no pixels ? */
-                h5tools_str_append(&buffer, "Pixels_per_block=\"-1\" ");
-            }
-            else {
-                h5tools_str_append(&buffer, "Pixels_per_block=\"%d\" ", cd_values[1]);
-            }
-            /* analyse the options mask */
-            if (cd_values[0] & H5_SZIP_CHIP_OPTION_MASK) {
-                h5tools_str_append(&buffer, "Mode =\"Hardware\" ");
-            }
-            else if (cd_values[0] & H5_SZIP_ALLOW_K13_OPTION_MASK) {
-                h5tools_str_append(&buffer, "Mode =\"K13\" ");
-            }
-            h5tools_str_append(&buffer, "Coding=\"");
-            if (cd_values[0] & H5_SZIP_EC_OPTION_MASK) {
-                h5tools_str_append(&buffer, "Entropy");
-            }
-            else if (cd_values[0] & H5_SZIP_NN_OPTION_MASK) {
-                h5tools_str_append(&buffer, "NN");
-            }
-            h5tools_str_append(&buffer, "\" ");
-
-            h5tools_str_append(&buffer, "ByteOrder=\"");
-            if (cd_values[0] & H5_SZIP_LSB_OPTION_MASK) {
-                h5tools_str_append(&buffer, "LSB");
-            }
-            else if (cd_values[0] & H5_SZIP_MSB_OPTION_MASK) {
-                h5tools_str_append(&buffer, "MSB");
-            }
-            h5tools_str_append(&buffer, "\" ");
-
-            if (cd_values[0] & H5_SZIP_RAW_OPTION_MASK) {
-                h5tools_str_append(&buffer, "Header=\"Raw\"");
-            }
-            h5tools_str_append(&buffer, "/>");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level--;
-        }
-        else {
-            /* unknown option */
-        }
-    }
-
-    h5tools_str_close(&buffer);
-}
-
-static void
-xml_dump_fill_value(hid_t dcpl, hid_t type)
-{
-    size_t      sz;
-    size_t      i;
-    hsize_t     space;
-    void       *buf;
-    char       *name;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t           curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else 
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    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, "<%sData>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    space = H5Tget_size(type);
-    buf = HDmalloc((size_t) space);
-
-    H5Pget_fill_value(dcpl, type, buf);
-
-    if (H5Tget_class(type) == H5T_REFERENCE) {
-        const char * path = lookup_ref_path(*(hobj_ref_t *) buf);
-
-        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, "<%sDataFromFile>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        if (!path) {
-            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, "\"%s\"", "NULL");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-        else {
-            char *t_path = xml_escape_the_string(path, -1);
-
-            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, "\"%s\"", t_path);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            HDfree(t_path);
-        }
-
-        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, "</%sDataFromFile>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-    else if (H5Tget_class(type) == H5T_STRING) {
-        /* ????? */
-        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, "<!-- String fill values not yet implemented. -->");
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-    else {
-        /* all other data */
-        switch (H5Tget_class(type)) {
-        case H5T_INTEGER:
-            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, "<%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "\"%d\"", *(int *) 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;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        case H5T_FLOAT:
-            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, "<%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "\"%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;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        case H5T_BITFIELD:
-        case H5T_OPAQUE:
-            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, "<%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            sz = H5Tget_size(type);
-
-            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, "\"");
-            for (i = 0; i < sz; i++) {
-                h5tools_str_append(&buffer, "%x ", *(unsigned int *) buf);
-                buf = (char *) buf + sizeof(unsigned int);
-            }
-            h5tools_str_append(&buffer, "\"");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        case H5T_ENUM:
-            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, "<%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            name = H5Tget_member_name(type, *(unsigned *) buf);
-
-            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, "\"%s\"", name);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            if(name)
-                H5free_memory(name);
-            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, "</%sDataFromFile>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        case H5T_ARRAY:
-            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, "<!-- Array fill values not yet implemented. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_TIME:
-            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, "<!-- Time fill not yet implemented. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_COMPOUND:
-            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, "<!-- Compound fill not yet implemented. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_VLEN:
-            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, "<!-- VL fill not yet implemented. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "<!-- Unknown fill datatype: %d -->", H5Tget_class(type));
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        }
-    }
-    HDfree(buf);
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    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, "</%sData>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_dump_dataset
- *
- * Purpose:     Dump a description of an HDF5 dataset in XML.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *  Pedro Vicente, October 9, 2007
- *   added parameters to H5Aiterate2 to allow for other iteration orders
- *
- *-------------------------------------------------------------------------
- */
-void
-xml_dump_dataset(hid_t did, const char *name, struct subset_t H5_ATTR_UNUSED * sset)
-{
-    hid_t               type;
-    hid_t               space;
-    hid_t               dcpl;
-    H5D_fill_value_t    fvstatus;
-    int                 maxdims;
-    hsize_t            *chsize;
-    int                 ndims;
-    int                 i;
-    H5D_alloc_time_t    at;
-    H5D_fill_time_t     ft;
-    hsize_t             tempi;
-    char               *tmp;
-    char               *t_name;
-    char               *t_tmp;
-    char               *t_prefix;
-    unsigned            attr_crt_order_flags;
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;            /* print context  */
-    h5tool_format_t    *outputformat = &xml_dataformat;
-    h5tool_format_t     string_dataformat;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    
-    char *rstr = (char*) HDmalloc((size_t)100);
-    char *pstr = (char*) HDmalloc((size_t)100);
-
-    tmp = (char*) HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
-    HDstrcpy(tmp, prefix);
-    HDstrcat(tmp, "/");
-    HDstrcat(tmp, name);
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-
-    t_name = xml_escape_the_name(name);
-    t_tmp = xml_escape_the_name(tmp);
-    t_prefix = xml_escape_the_name(prefix);
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    xml_name_to_XID(tmp, rstr, 100, 1);
-    xml_name_to_XID(prefix, pstr, 100, 1);
-
-    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, "<%sDataset Name=\"%s\" OBJ-XID=\"%s\" H5Path= \"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
-            xmlnsprefix, t_name, rstr, t_tmp, pstr,
-            strcmp(prefix, "") ? t_prefix : "/");
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    HDfree(t_name);
-    HDfree(t_tmp);
-    HDfree(t_prefix);
-    HDfree(rstr);
-    HDfree(pstr);
-    HDfree(tmp);
-
-    dcpl = H5Dget_create_plist(did);
-    type = H5Dget_type(did);
-    space = H5Dget_space(did);
-
-    /* query the creation properties for attributes */
-    H5Pget_attr_creation_order(dcpl, &attr_crt_order_flags);
-
-    /* Print information about storage layout */
-    if (H5D_CHUNKED == H5Pget_layout(dcpl)) {
-        maxdims = H5Sget_simple_extent_ndims(space);
-        HDassert(maxdims >= 0);
-        chsize = (hsize_t *)HDmalloc((size_t)maxdims * sizeof(hsize_t));
-        ctx.indent_level++;
-        dump_indent += COL;
-
-        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, "<%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-        dump_indent += COL;
-
-        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, "<%sChunkedLayout ", xmlnsprefix);
-        ndims = H5Pget_chunk(dcpl, maxdims, chsize);
-        h5tools_str_append(&buffer, "Ndims=\"%d\">", ndims);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        ctx.indent_level++;
-        dump_indent += COL;
-
-        for (i = 0; i < ndims; i++) {
-
-            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, "<%sChunkDimension DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" />", xmlnsprefix, chsize[i]);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sRequiredFilter>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        ctx.indent_level++;
-        dump_indent += COL;
-        check_filters(dcpl);
-        ctx.indent_level--;
-        dump_indent -= COL;
-
-        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, "</%sRequiredFilter>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        ctx.indent_level--;
-        dump_indent -= COL;
-        
-        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, "</%sChunkedLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-        dump_indent -= COL;
-
-        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, "</%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-        dump_indent -= COL;
-        HDfree(chsize);
-    }
-    else if (H5D_CONTIGUOUS == H5Pget_layout(dcpl)) {
-        ctx.indent_level++;
-
-        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, "<%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-
-        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, "<%sContiguousLayout/>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-
-        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, "</%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-    }
-    else if (H5D_COMPACT == H5Pget_layout(dcpl)) {
-        ctx.indent_level++;
-
-        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, "<%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-
-        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, "<%sCompactLayout/>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-
-        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, "</%sStorageLayout>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-    }
-    /* and check for external.... ?? */
-
-    /* fill value */
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    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, "<%sFillValueInfo ", xmlnsprefix);
-    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;
-        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:
-        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);
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    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, "<%sFillValue>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    H5Pfill_value_defined(dcpl, &fvstatus);
-    if (fvstatus == H5D_FILL_VALUE_UNDEFINED || (fvstatus == H5D_FILL_VALUE_DEFAULT && ft == H5D_FILL_TIME_IFSET)) {
-        ctx.indent_level++;
-
-        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, "<%sNoFill/>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-    }
-    else {
-        xml_dump_fill_value(dcpl, type);
-    }
-
-    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, "</%sFillValue>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    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, "</%sFillValueInfo>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    dump_function_table->dump_dataspace_function(space);
-    dump_function_table->dump_datatype_function(type);
-
-    ctx.indent_level++;
-    dump_indent += COL;
-
-    if ((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
-        if (H5Aiterate2(did, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-            error_msg("error getting attribute information\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        } /* end if */
-    } /* end if */
-    else {
-        if (H5Aiterate2(did, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
-            error_msg("error getting attribute information\n");
-            h5tools_setstatus(EXIT_FAILURE);
-        } /* end if */
-    } /* end else */
-
-    ctx.indent_level--;
-    dump_indent -= COL;
-    tempi = H5Dget_storage_size(did);
-
-    if (display_data && (tempi > 0)) {
-        switch (H5Tget_class(type)) {
-        case H5T_INTEGER:
-        case H5T_FLOAT:
-        case H5T_STRING:
-        case H5T_BITFIELD:
-        case H5T_OPAQUE:
-        case H5T_ENUM:
-        case H5T_ARRAY:
-            ctx.indent_level++;
-            dump_indent += COL;
-            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
-            ctx.indent_level--;
-            dump_indent -= COL;
-            break;
-
-        case H5T_TIME:
-            ctx.indent_level++;
-
-            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, "<%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Time data not yet implemented. -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level--;
-            break;
-
-        case H5T_COMPOUND:
-            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, "<!-- Note: format of compound data not specified -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            ctx.indent_level++;
-            dump_indent += COL;
-            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
-            ctx.indent_level--;
-            dump_indent -= COL;
-            break;
-
-        case H5T_REFERENCE:
-            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, "<%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
-                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, "<!-- Note: Region references not supported -->");
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-            else {
-                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, "<%sDataFromFile>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                xml_print_refs(did, DATASET_DATA);
-
-                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, "</%sDataFromFile>", xmlnsprefix);
-                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-
-        case H5T_VLEN:
-            ctx.indent_level--;
-            dump_indent -= COL;
-            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, "<!-- Note: format of VL data not specified -->");
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            ctx.indent_level++;
-            dump_indent += COL;
-
-            ctx.indent_level++;
-            dump_indent += COL;
-            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
-            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);
-
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-        }
-    }
-    else {
-        /* no data written */
-        ctx.indent_level++;
-
-        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, "<%sData>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-
-        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, "<%sNoData/>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-
-        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, "</%sData>", xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-    }
-
-    H5Tclose(type);
-    H5Sclose(space);
-    H5Pclose(dcpl);
-
-    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, "</%sDataset>", xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    h5tools_str_close(&buffer);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    xml_print_enum
- *
- * Purpose:     Print the values of an HDF5 ENUM in XML.
- *              Very similar to regular DDL output.
- *
- * Return:      void
- *
- * Programmer:  REMcG
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-xml_print_enum(hid_t type)
-{
-    char              **name = NULL;    /*member names                   */
-    unsigned char      *value = NULL;   /*value array                    */
-    unsigned            nmembs;         /*number of members              */
-    hid_t               super;          /*enum base integer type         */
-    hid_t               native = -1;    /*native integer datatype        */
-    size_t              dst_size;       /*destination value type size    */
-    unsigned            i;              /*miscellaneous counters         */
-    size_t              j;
-    h5tools_str_t buffer;          /* string into which to render   */
-    h5tools_context_t ctx;            /* print context  */
-    h5tool_format_t  *outputformat = &xml_dataformat;
-    h5tool_format_t   string_dataformat;
-    hsize_t     curr_pos = 0;        /* total data element position   */
-
-    /* setup */
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    ctx.indent_level = dump_indent/COL;
-    ctx.cur_column = dump_indent;
-    
-    string_dataformat = *outputformat;
-
-    if (fp_format) {
-        string_dataformat.fmt_double = fp_format;
-        string_dataformat.fmt_float = fp_format;
-    }
-
-    if (h5tools_nCols==0) {
-        string_dataformat.line_ncols = 65535;
-        string_dataformat.line_per_line = 1;
-    }
-    else
-        string_dataformat.line_ncols = h5tools_nCols;
-
-    string_dataformat.do_escape = display_escape;
-    outputformat = &string_dataformat;
-
-    nmembs = (unsigned)H5Tget_nmembers(type);
-    super = H5Tget_super(type);
-
-    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, "<%sDataType>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    xml_print_datatype(super,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, "</%sDataType>",xmlnsprefix);
-    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    /*
-     * Determine what datatype to use for the native values.  To simplify
-     * things we entertain three possibilities:
-     *  1. long long -- the largest native signed integer
-     *    2. unsigned long long -- the largest native unsigned integer
-     *    3. raw format
-     */
-    if (H5Tget_size(type) <= sizeof(long long)) {
-        dst_size = sizeof(long long);
-
-        if (H5T_SGN_NONE == H5Tget_sign(type)) {
-            native = H5T_NATIVE_ULLONG;
-        } 
-        else {
-            native = H5T_NATIVE_LLONG;
-        }
-    } 
-    else {
-        dst_size = H5Tget_size(type);
-    }
-
-    /* Get the names and raw values of all members */
-    name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
-    value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
-
-    for (i = 0; i < nmembs; i++) {
-        name[i] = H5Tget_member_name(type, i);
-        H5Tget_member_value(type, i, value + i * H5Tget_size(type));
-    }
-
-    /* Convert values to native datatype */
-    if (native > 0)
-        H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT);
-
-    /* Sort members by increasing value */
-    /*not implemented yet */
-
-    /* Print members */
-    ctx.indent_level++;
-    dump_indent += COL;
-    for (i = 0; i < nmembs; i++) {
-        char *t_name = xml_escape_the_name(name[i]);
-
-        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, "<%sEnumElement>",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-        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, "%s", t_name);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        HDfree(t_name);
-        ctx.indent_level--;
-
-        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, "</%sEnumElement>",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sEnumValue>",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level++;
-        ctx.need_prefix = TRUE;
-        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
-
-        /* Render the element */
-        h5tools_str_reset(&buffer);
-        if (native < 0) {
-            h5tools_str_append(&buffer, "0x");
-
-            for (j = 0; j < dst_size; j++)
-                h5tools_str_append(&buffer, "%02x", value[i * dst_size + j]);
-        } 
-        else if (H5T_SGN_NONE == H5Tget_sign(native)) {
-            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "u", *((unsigned long long *)
-                       ((void *) (value + i * dst_size))));
-        } 
-        else {
-            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "d",
-                      *((long long *) ((void *) (value + i * dst_size))));
-        }
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-        ctx.indent_level--;
-
-        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, "</%sEnumValue>",xmlnsprefix);
-        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-    ctx.indent_level--;
-    dump_indent -= COL;
-
-    h5tools_str_close(&buffer);
-
-    /* Release resources */
-    for (i = 0; i < nmembs; i++)
-        H5free_memory(name[i]);
-
-    HDfree(name);
-    HDfree(value);
-    H5Tclose(super);
-}
-
diff --git a/tools/h5dump/h5dump_xml.h b/tools/h5dump/h5dump_xml.h
deleted file mode 100644
index c1d6c62..0000000
--- a/tools/h5dump/h5dump_xml.h
+++ /dev/null
@@ -1,39 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef H5DUMP_XML_H__
-#define H5DUMP_XML_H__
-
-extern const char       *xmlnsprefix;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The dump functions of the dump_function_table */
-/* XML format:   same interface, alternative output */
-
-void      xml_dump_group(hid_t, const char *);
-void      xml_dump_named_datatype(hid_t, const char *);
-void      xml_dump_dataset(hid_t, const char *, struct subset_t *);
-void      xml_dump_dataspace(hid_t space);
-void      xml_dump_datatype(hid_t type);
-herr_t    xml_dump_attr(hid_t, const char *, const H5A_info_t *, void *);
-void      xml_dump_data(hid_t, int, struct subset_t *, int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* !H5DUMP_XML_H__ */
diff --git a/tools/h5dump/h5dumpgentest.c b/tools/h5dump/h5dumpgentest.c
deleted file mode 100644
index 46386a0..0000000
--- a/tools/h5dump/h5dumpgentest.c
+++ /dev/null
@@ -1,9948 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Generate the binary hdf5 files for the h5dump tests.
- * Usage: just execute the program without any arguments will
- * generate all the binary hdf5 files in the local directory.
- *
- * 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 <limits.h>
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-
-#define FILE1 "tgroup.h5"
-#define FILE2 "tdset.h5"
-#define FILE3 "tattr.h5"
-#define FILE4 "tslink.h5"
-#define FILE4_1 "tsoftlinks.h5"
-#define FILE5 "thlink.h5"
-#define FILE6 "tcompound.h5"
-#define FILE7 "tall.h5"
-#define FILE8 "tdset2.h5"
-#define FILE9 "tcompound2.h5"
-#define FILE10 "tloop.h5"
-#define FILE11 "tloop2.h5"
-#define FILE12 "tmany.h5"
-#define FILE13 "tstr.h5"
-#define FILE14 "tstr2.h5"
-#define FILE15 "tenum.h5"
-#define FILE16 "tobjref.h5"
-#define FILE17 "tdatareg.h5"
-#define FILE18 "tnestedcomp.h5"
-#define FILE19 "topaque.h5"
-#define FILE20 "tbitfields.h5"
-#define FILE21 "tvldtypes1.h5"
-#define FILE22 "tvldtypes2.h5"
-#define FILE23 "tvldtypes3.h5"
-#define FILE24 "tvldtypes4.h5"
-#define FILE25 "tarray1.h5"
-#define FILE25_BIG "tarray1_big.h5"
-#define FILE26 "tarray2.h5"
-#define FILE27 "tarray3.h5"
-#define FILE28 "tarray4.h5"
-#define FILE29 "tarray5.h5"
-#define FILE30 "tarray6.h5"
-#define FILE31 "tarray7.h5"
-#define FILE32 "tempty.h5"
-#define FILE33  "tgrp_comments.h5"
-#define FILE34  "tsplit_file"
-#define FILE35  "tfamily%05d.h5"
-#define FILE36  "tmulti"
-#define FILE37  "tlarge_objname.h5"
-#define FILE38  "tvlstr.h5"
-#define FILE39  "tchar.h5"
-#define FILE40  "tattr2.h5"
-#define FILE41  "tcompound_complex.h5"
-#define FILE42  "tnamed_dtype_attr.h5"
-#define FILE43  "tvldtypes5.h5"
-#define FILE44  "tfilters.h5"
-#define FILE45  "tnullspace.h5"
-#define FILE46  "tfcontents1.h5"
-#define FILE47  "tfcontents2.h5"
-#define FILE48  "tfvalues.h5"
-#define FILE49  "tstr3.h5"
-#define FILE50  "taindices.h5"
-#define FILE51  "tlonglinks.h5"
-#define FILE52  "tldouble.h5"
-#define FILE53  "textlink.h5"
-#define FILE54  "tudlink.h5"
-#define FILE55  "tbinary.h5"
-#define FILE56  "tbigdims.h5"
-#define FILE57  "thyperslab.h5"
-#define FILE58  "tordergr.h5"
-#define FILE59  "torderattr.h5"
-#define FILE60  "tfpformat.h5"
-#define FILE61  "textlinksrc.h5"
-#define FILE62  "textlinktar.h5"
-#define FILE63  "textlinkfar.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"
-#define FILE72  "tnestedcmpddt.h5"
-#define FILE73  "tscalarintsize.h5"
-#define FILE74  "tscalarattrintsize.h5"
-#define FILE75  "tscalarstring.h5"
-#define FILE76  "tcmpdintarray.h5"
-#define FILE77  "tcmpdints.h5"
-#define FILE78  "tscalarintattrsize.h5"
-#define FILE79  "tintsattrs.h5"
-#define FILE80  "tbitnopaque.h5"
-#define FILE81  "tints4dims.h5"
-
-/*-------------------------------------------------------------------------
- * prototypes
- *-------------------------------------------------------------------------
- */
-
-/* utility functions */
-static int
-make_dset(hid_t loc_id, const char *name, hid_t sid, hid_t tid, hid_t dcpl, void *buf);
-static int
-write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
-        hid_t tid, void *buf);
-static int
-write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
-        hid_t tid, void *buf );
-
-/* a filter operation callback function */
-static size_t
-myfilter(unsigned int H5_ATTR_UNUSED 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);
-
-/* a "set local" callback     */
-static herr_t
-set_local_myfilter(hid_t dcpl_id, hid_t tid, hid_t H5_ATTR_UNUSED sid);
-
-#define MYFILTER_ID 405
-
-/* This message derives from H5Z */
-const H5Z_class2_t H5Z_MYFILTER[1] = {{
-        H5Z_CLASS_T_VERS,
-        MYFILTER_ID,               /* Filter id number      */
-        1, 1,
-        "myfilter",                /* Filter name for debugging */
-        NULL,                /* The "can apply" callback     */
-        set_local_myfilter,  /* The "set local" callback     */
-        myfilter,            /* The actual filter function */
-}};
-
-
-/* A UD link traversal function.  Shouldn't actually be called. */
-static hid_t UD_traverse(H5_ATTR_UNUSED const char * link_name, H5_ATTR_UNUSED hid_t cur_group,
-        H5_ATTR_UNUSED const void * udata, H5_ATTR_UNUSED size_t udata_size, H5_ATTR_UNUSED hid_t lapl_id)
-{
-    return -1;
-}
-
-#define MY_LINKCLASS 187
-
-const H5L_class_t UD_link_class[1] = {{
-        H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
-        (H5L_type_t)MY_LINKCLASS, /* Link type id number            */
-        "UD link class",          /* name for debugging             */
-        NULL,                     /* Creation callback              */
-        NULL,                     /* Move/rename callback           */
-        NULL,                     /* Copy callback                  */
-        UD_traverse,              /* The actual traversal function  */
-        NULL,                     /* Deletion callback              */
-        NULL                      /* Query callback                 */
-}};
-
-
-#define LENSTR  50
-#define LENSTR2  11
-
-#define SPACE2_RANK 2
-#define SPACE2_DIM1 10
-#define SPACE2_DIM2 10
-
-#define SPACE1_RANK 1
-#define SPACE1_DIM1 4
-
-#define DIM1  20
-#define DIM2  10
-#define CDIM1 DIM1/2
-#define CDIM2 DIM2/2
-#define RANK  2
-
-/* Dataspace of 0 dimension size */
-#define SPACE3_RANK 2
-#define SPACE3_DIM1 0
-#define SPACE3_DIM2 0
-
-/* Element selection information */
-#define POINT1_NPOINTS 10
-
-typedef enum{
-    RED,
-    GREEN,
-    BLUE,
-    WHITE,
-    BLACK
-} enumtype;
-
-/* Compound datatype */
-typedef struct s1_t {
-        unsigned int a;
-        unsigned int b;
-        float c;
-} s1_t;
-
-
-/* 1-D array datatype */
-#define ARRAY1_RANK 1
-#define ARRAY1_DIM1 4
-
-/* 3-D array datatype */
-#define ARRAY2_RANK 3
-#define ARRAY2_DIM1 3
-#define ARRAY2_DIM2 4
-#define ARRAY2_DIM3 5
-
-/* 2-D array datatype */
-#define ARRAY3_RANK 2
-#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"
-/* Dataset dimensions                                                 */
-#define F41_LENGTH         6
-#define F41_RANK           1
-#define F41_ARRAY_RANK     1
-#define F41_ARRAY_RANKd    2
-#define F41_DIMb           4
-#define F41_ARRAY_DIMc     6
-#define F41_ARRAY_DIMd1    5
-#define F41_ARRAY_DIMd2    6
-#define F41_ARRAY_DIMf     10
-
-/* "File 42" macros */
-/* Name of dataset to create in datafile                              */
-#define F42_DSETNAME "Dataset"
-#define F42_TYPENAME "Datatype"
-#define F42_ATTRNAME "Attribute"
-#define F42_LINKNAME "Link_to_Datatype"
-
-/* "File 43" macros */
-/* Name of dataset to create in datafile                              */
-#define F43_DSETNAME "Dataset"
-
-/* "File 51" macros */
-#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"
-#define F66_DATASETS08        "DS08BITS"
-#define F66_YDIM8        8
-#define F66_DATASETU16       "DU16BITS"
-#define F66_DATASETS16       "DS16BITS"
-#define F66_YDIM16        16
-#define F66_DATASETU32       "DU32BITS"
-#define F66_DATASETS32       "DS32BITS"
-#define F66_YDIM32        32
-#define F66_DATASETU64       "DU64BITS"
-#define F66_DATASETS64       "DS64BITS"
-#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"
-#define F70_LENGTH      4
-#define F70_RANK        1
-#define F70_ARRAY_RANK  2
-#define F70_XDIM        8
-#define F70_DATASETU08        "DU08BITS"
-#define F70_DATASETS08        "DS08BITS"
-#define F70_YDIM8       8
-#define F70_DATASETU16       "DU16BITS"
-#define F70_DATASETS16       "DS16BITS"
-#define F70_YDIM16      16
-#define F70_DATASETU32       "DU32BITS"
-#define F70_DATASETS32       "DS32BITS"
-#define F70_YDIM32      32
-#define F70_DATASETU64       "DU64BITS"
-#define F70_DATASETS64       "DS64BITS"
-#define F70_YDIM64      64
-#define F70_DUMMYDBL        "DummyDBL"
-/* Name of dataset to create in datafile   */
-#define F71_DATASETNAME   "CompoundAttrIntSize"
-
-/* "FILE73" macros and for FILE69 and FILE78 */
-#define F73_ARRAY_RANK  2
-#define F73_XDIM        8
-#define F73_DATASETU08        "DU08BITS"
-#define F73_DATASETS08        "DS08BITS"
-#define F73_YDIM8       8
-#define F73_DATASETU16       "DU16BITS"
-#define F73_DATASETS16       "DS16BITS"
-#define F73_YDIM16      16
-#define F73_DATASETU32       "DU32BITS"
-#define F73_DATASETS32       "DS32BITS"
-#define F73_YDIM32      32
-#define F73_DATASETU64       "DU64BITS"
-#define F73_DATASETS64       "DS64BITS"
-#define F73_YDIM64      64
-#define F73_DUMMYDBL        "DummyDBL"
-
-/* "FILE76 and FILE77 */
-/* Name of dataset to create in datafile   */
-#define F76_DATASETNAME   "CompoundIntArray"
-#define F76_LENGTH      4
-#define F76_RANK        1
-#define F76_ARRAY_RANK  1
-#define F76_DATASETU08        "DU08BITS"
-#define F76_DATASETS08        "DS08BITS"
-#define F76_DIM8       8
-#define F76_DATASETU16       "DU16BITS"
-#define F76_DATASETS16       "DS16BITS"
-#define F76_DIM16      16
-#define F76_DATASETU32       "DU32BITS"
-#define F76_DATASETS32       "DS32BITS"
-#define F76_DIM32      32
-#define F76_DATASETU64       "DU64BITS"
-#define F76_DATASETS64       "DS64BITS"
-#define F76_DIM64      64
-#define F76_DUMMYDBL        "DummyDBL"
-/* Name of dataset to create in datafile   */
-#define F77_DATASETNAME1   "CompoundInts"
-#define F77_DATASETNAME2   "CompoundRInts"
-#define F77_LENGTH      64
-
-#define F80_DIM32      32
-
-#define F81_DATASETNAME   "FourDimInts"
-#define F81_RANK        4
-#define F81_WDIM        10
-#define F81_XDIM        8
-#define F81_YDIM        6
-#define F81_ZDIM        4
-
-static void
-gent_group(void)
-{
-    hid_t fid, group;
-
-    fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* / */
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g1 */
-    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g2 */
-    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g3 */
-    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g2/g2.1 */
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    H5Fclose(fid);
-}
-
-static void
-gent_dataset(void)
-{
-    hid_t fid, dataset, space;
-    hsize_t dims[2];
-    int dset1[10][20];
-    double dset2[30][20];
-    int i, j;
-
-    fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* dset1 */
-    dims[0] = 10; dims[1] = 20;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 20; j++)
-            dset1[i][j] = j + i;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* dset2 */
-    dims[0] = 30; dims[1] = 20;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 30; i++)
-        for(j = 0; j < 20; j++)
-            dset2[i][j] = 0.0001F * j + i;
-
-    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-}
-
-static void
-gent_dataset2(void)
-{
-    hid_t fid, dataset, space, create_plist;
-    hsize_t dims[2];
-    hsize_t maxdims[2];
-    int dset1[10][20];
-    double dset2[30][10];
-    int i, j;
-
-    fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    create_plist = H5Pcreate(H5P_DATASET_CREATE);
-    dims[0] = 5; dims[1] = 5;
-    H5Pset_chunk(create_plist, 2, dims);
-
-    /* dset1 */
-    dims[0] = 10; dims[1] = 20;
-    maxdims[0] = H5S_UNLIMITED; maxdims[1] = 20;
-    space = H5Screate_simple(2, dims,  maxdims);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 20; j++)
-            dset1[i][j] = j;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* dset2 */
-    dims[0] = 30; dims[1] = 10;
-    maxdims[0] = 30; maxdims[1] = H5S_UNLIMITED;
-    space = H5Screate_simple(2, dims, maxdims);
-    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    for(i = 0; i < 30; i++)
-        for(j = 0; j < 10; j++)
-            dset2[i][j] = j;
-
-    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Pclose(create_plist);
-    H5Fclose(fid);
-}
-
-static void
-gent_attribute(void)
-{
-    hid_t fid, root, space, attr, type;
-    hsize_t dims[2];
-    char buf[60];
-    int i, data[10];
-    double d[10];
-    char string[]= "string attribute";
-    int point = 100;
-
-    fid = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* attribute 1 */
-    dims[0] = 24;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(root, "/attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(buf, "attribute of root group");
-    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* attribute 2 */
-    dims[0] = 10;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(root, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++) data[i] = i+1;
-
-    H5Awrite(attr, H5T_NATIVE_INT, data);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* attribute 3 */
-    dims[0] = 10;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(root, "attr3", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++) d[i] = 0.1F * i;
-
-    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* attribute 4 */
-    space = H5Screate(H5S_SCALAR);
-    attr = H5Acreate2(root, "attr4", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT, &point);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* attribute 5 */
-    space = H5Screate(H5S_SCALAR);
-    type = H5Tcopy(H5T_C_S1);
-    H5Tset_size(type, 17);
-    attr = H5Acreate2(root, "attr5", type, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, type, string);
-
-    H5Tclose(type);
-    H5Sclose(space);
-    H5Aclose(attr);
-    H5Gclose(root);
-    H5Fclose(fid);
-}
-
-static void gent_softlink(void)
-{
-    hid_t fid, root;
-
-    fid = H5Fcreate(FILE4, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-    H5Lcreate_soft("somevalue", root, "slink1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_soft("linkvalue", root, "slink2", H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Gclose(root);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_softlink2
- *
- * Purpose: Create soft links to various objects.
- * Return:
- *    SUCCEED
- *    FAIL
- * Programmer: Jonathan Kim
- * Date: May 26, 2010
- *-------------------------------------------------------------------------*/
-#define NX 4
-#define NY 2
-static int gent_softlink2(void)
-{
-    hid_t       fileid1 = -1;
-    hid_t       gid1 = -1, gid2 = -1;
-    hid_t       datatype = -1;
-    hid_t       dset1 = -1, dset2 = -1;
-    hid_t       dataspace = -1;
-    hsize_t     dimsf[2];              /* dataset dimensions */
-    int data1[NX][NY] = {{0,0},{1,1},{2,2},{3,3}};
-    int data2[NX][NY] = {{0,0},{0,1},{0,2},{3,3}};
-    herr_t      status = SUCCEED;
-
-    /*-----------------------------------------------------------------------
-     * FILE
-     *------------------------------------------------------------------------*/
-    /* Create a new file */
-    fileid1 = H5Fcreate(FILE4_1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fileid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-     * Groups
-     *------------------------------------------------------------------------*/
-    gid1 = H5Gcreate2(fileid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    gid2 = H5Gcreate2(fileid1, "group_empty", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-     * Named datatype
-     *------------------------------------------------------------------------*/
-    datatype = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(fileid1, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-     * Datasets
-     *------------------------------------------------------------------------*/
-    /*
-     * Describe the size of the array and create the data space for fixed
-     * size dataset.
-     */
-    dimsf[0] = NX;
-    dimsf[1] = NY;
-    dataspace = H5Screate_simple(2, dimsf, NULL);
-
-    /*
-     * We will store little endian INT numbers.
-     */
-
-    /*---------------
-     * dset1
-     */
-    /* Create a new dataset as sample object */
-    dset1 = H5Dcreate2(fileid1, "/dset1", H5T_NATIVE_INT, dataspace,
-            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (dset1 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*---------------
-     * dset2
-     */
-    /* Create a new dataset as sample object */
-    dset2 = H5Dcreate2(fileid1, "/dset2", H5T_NATIVE_INT, dataspace,
-            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (dset2 < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------------------------------------
-     * Soft links
-     *------------------------------------------------------------------------*/
-    /*
-     * create various soft links under  '/' root
-     */
-    /* link to dset1 */
-    status = H5Lcreate_soft("/dset1", fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to data type */
-    status = H5Lcreate_soft("/dtype", fileid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to group1 */
-    status = H5Lcreate_soft("/group1", fileid1, "soft_group1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to empty group */
-    status = H5Lcreate_soft("/group_empty", fileid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* dangling link */
-    status = H5Lcreate_soft("not_yet", fileid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /*-----------------------------------------
-     * create various soft links under a group
-     */
-    /* link to dset1 */
-    status = H5Lcreate_soft("/dset1", gid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to dset2 */
-    status = H5Lcreate_soft("/dset2", gid1, "soft_dset2", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to data type */
-    status = H5Lcreate_soft("/dtype", gid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* link to empty group */
-    status = H5Lcreate_soft("/group_empty", gid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    /* dangling link  */
-    status = H5Lcreate_soft("not_yet", gid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
-        status = FAIL;
-        goto out;
-    }
-
-    out:
-    /*
-     * Close/release resources.
-     */
-    if(dataspace >= 0 && H5Sclose(dataspace) < 0) {
-        fprintf(stderr, "Error: %s> H5Sclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(gid1 >= 0 && H5Gclose(gid1) < 0) {
-        fprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(gid2 >= 0 && H5Gclose(gid2) < 0) {
-        fprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(datatype >= 0 && H5Tclose(datatype) < 0) {
-        fprintf(stderr, "Error: %s> H5Tclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(dset1 >= 0 && H5Dclose(dset1) < 0) {
-        fprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(dset2 >= 0 && H5Dclose(dset2) < 0) {
-        fprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-    if(fileid1 >= 0 && H5Fclose(fileid1) < 0) {
-        fprintf(stderr, "Error: %s> H5Fclose failed.\n", FILE4_1);
-        status = FAIL;
-    }
-
-    return status;
-}
-
-/*
-            /
-
-       /    |   \      the dataset is hardlinked to three names
-                       /dset1, /g1/dset2, and /g1/g1.1/dset3
-     dset1 g1    g2
-                       /g2 and /g1/g1.1 are hardlinked to the same object.
-          /  \
-       dset2 g1.1
-              |
-             dset3
- */
-
-static void gent_hardlink(void)
-{
-    hid_t fid, group, dataset, space;
-    hsize_t dim = 5;
-    int i, dset[5];
-
-    fid = H5Fcreate(FILE5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    space = H5Screate_simple(1, &dim, NULL);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 5; i++) dset[i] = i;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gopen2(fid, "/g1", H5P_DEFAULT);
-    H5Lcreate_hard(group, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* create a link to the root group */
-    H5Lcreate_hard(fid, "/", H5L_SAME_LOC, "g3", H5P_DEFAULT, H5P_DEFAULT);
-    H5Fclose(fid);
-}
-
-static void gent_extlink(void)
-{
-    hid_t fid;
-
-    /* This external link will dangle, but that's okay */
-    fid = H5Fcreate(FILE53, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external("filename", "objname", fid, "extlink1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external("anotherfile", "anotherobj", fid, "extlink2", H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Fclose(fid);
-}
-
-static void gent_udlink(void)
-{
-    hid_t fid;
-    char buf[4];
-
-    H5Lregister(UD_link_class);
-
-    /* This ud link will dangle, but that's okay */
-    fid = H5Fcreate(FILE54, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_ud(fid, "udlink1", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
-    strcpy(buf, "foo");
-    H5Lcreate_ud(fid, "udlink2", (H5L_type_t)MY_LINKCLASS, buf, 4, H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Fclose(fid);
-}
-
-
-/*
-               /
-     /     |       \     \
-   dset1  group1  type1 type2
-           |
-          dset2
-
- */
-static void gent_compound_dt(void) {       /* test compound data type */
-    hid_t fid, group, dataset, space, space3, type, type2;
-    hid_t array_dt;
-    typedef struct {
-            int a;
-            float b;
-            double c;
-    } dset1_t;
-    dset1_t dset1[5];
-
-    typedef struct {
-            int a;
-            float b;
-    } dset2_t;
-    dset2_t dset2[5];
-
-    typedef struct {
-            int a[4];
-            float b[5][6];
-    } dset3_t;
-    dset3_t dset3[3][6];
-
-    typedef struct {
-            int a;
-            float b;
-    } dset4_t;
-    dset4_t dset4[5];
-
-    typedef struct {
-            int a;
-            float b;
-    } dset5_t;
-    dset5_t dset5[5];
-
-    int i, j, k, l;
-    unsigned ndims;
-    hsize_t dim[2];
-
-    hsize_t sdim = 5;
-    hsize_t dset3_dim[2];
-
-
-    for(i = 0; i < (int)sdim; i++) {
-        dset1[i].a = i;
-        dset1[i].b = (float)(i*i);
-        dset1[i].c = (float)(1.0F/(i+1));
-
-        dset2[i].a = i;
-        dset2[i].b = (float)(i+ i*0.1F);
-
-        dset4[i].a = i;
-        dset4[i].b = (float)(i+3);
-
-        dset5[i].a = i;
-        dset5[i].b = (float)(i*0.1F);
-    }
-
-
-    fid = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    space = H5Screate_simple(1, &sdim, NULL);
-
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset1[0]));
-    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
-    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
-    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
-    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
-    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-    H5Tclose(type2);
-    H5Tclose(type);
-    H5Dclose(dataset);
-
-    /* shared data type 1 */
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
-    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
-    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
-    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-    H5Tclose(type2);
-    H5Tclose(type);
-    H5Dclose(dataset);
-
-
-    /* shared data type 2 */
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
-
-    ndims = 1; dim[0] = 4;
-
-    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
-    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_INT, ndims, dim);
-    H5Tinsert(type2, "int_array", HOFFSET(dset3_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    ndims = 2; dim[0] = 5; dim[1] = 6;
-
-    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
-    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, dim);
-    H5Tinsert(type2, "float_array", HOFFSET(dset3_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-
-    dset3_dim[0] = 3;  dset3_dim[1] = 6;
-    space3 = H5Screate_simple(2, dset3_dim, NULL);
-    dataset = H5Dcreate2(group, "dset3", type, space3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < (int)dset3_dim[0]; i++)
-        for(j = 0; j < (int)dset3_dim[1]; j++) {
-            for(k = 0; k < 4; k++)
-                dset3[i][j].a[k] = k + j + i;
-            for(k = 0; k < 5; k++)
-                for(l = 0; l < 6; l++)
-                    dset3[i][j].b[k][l] = (float)((k + 1) + l + j + i);
-        }
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
-    H5Sclose(space3);
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-
-    /* shared data type 3 */
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
-    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
-    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-
-    /* unamed data type */
-    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
-    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
-    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
-    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
-
-    H5Ldelete(group, "type4", H5P_DEFAULT);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-    H5Sclose(space);
-    H5Gclose(group);
-
-    H5Fclose(fid);
-}
-
-/*
-               /
-     /     |       \     \
-   dset1  group1  type1 type2
-           |
-          dset2
-
- */
-static void gent_compound_dt2(void) {       /* test compound data type */
-    hid_t fid, group, dataset, space, type, create_plist, type2;
-    hid_t array_dt;
-
-    typedef struct {
-            int a;
-            float b;
-            double c;
-    } dset1_t;
-    dset1_t dset1[10];
-
-    typedef struct {
-            int a;
-            float b;
-    } dset2_t;
-    dset2_t dset2[10];
-
-    typedef struct {
-            int a[4];
-            float b[5][6];
-    } dset3_t;
-
-    typedef struct {
-            int a;
-            float b;
-    } dset4_t;
-    dset4_t dset4[10];
-
-    typedef struct {
-            int a;
-            float b;
-    } dset5_t;
-    dset5_t dset5[10];
-
-    int i;
-    unsigned ndims;
-    hsize_t dim[2];
-
-    hsize_t sdim, maxdim;
-
-    sdim = 10;
-    for(i = 0; i < (int)sdim; i++) {
-        dset1[i].a = i;
-        dset1[i].b = (float)(i*i);
-        dset1[i].c = (float)(1.0F/(i+1));
-
-        dset2[i].a = i;
-        dset2[i].b = (float)(i+ i*0.1F);
-
-        dset4[i].a = i;
-        dset4[i].b = (float)(i*1.0F);
-
-        dset5[i].a = i;
-        dset5[i].b = (float)(i*1.0F);
-    }
-
-    fid = H5Fcreate(FILE9, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    create_plist = H5Pcreate(H5P_DATASET_CREATE);
-
-    sdim = 2;
-    H5Pset_chunk(create_plist, 1, &sdim);
-
-    sdim = 6;
-    maxdim = H5S_UNLIMITED;
-
-    space = H5Screate_simple(1, &sdim, &maxdim);
-
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-
-    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
-    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
-
-    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-
-    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
-    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
-
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    sdim = 6;
-    maxdim = 10;
-
-    space = H5Screate_simple(1, &sdim, &maxdim);
-
-    /* shared data type 1 */
-    type = H5Tcreate(H5T_COMPOUND, sizeof(dset2_t));
-    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
-    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-
-
-    /* shared data type 2 */
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
-
-    ndims = 1; dim[0] = 4;
-    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
-    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    ndims = 2; dim[0] = 5; dim[1] = 6;
-    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
-    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Tclose(type);
-
-    /* shared data type 3 */
-    type = H5Tcreate(H5T_COMPOUND, sizeof(dset4_t));
-    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
-    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-
-    /* unamed data type */
-    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
-    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
-    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
-    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
-    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
-
-    H5Ldelete(group, "type4", H5P_DEFAULT);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Dclose(dataset);
-    H5Sclose(space);
-    H5Gclose(group);
-    H5Pclose(create_plist);
-
-    H5Fclose(fid);
-
-}
-
-
-/*
-
-/ : g1  g2  attr1  attr2
-g1 : g1.1  g1.2
-g1.1 : dset1.1.1(attr1, attr2)   dset1.1.2
-g1.2 : g1.2.1 extlink
-g1.2.1 : slink
-g2 : dset2.1  dset2.2 udlink
-
- */
-
-static void gent_all(void)
-{
-    hid_t fid, group, attr, dataset, space;
-    hsize_t dims[2];
-    int data[2][2], dset1[10][10], dset2[20];
-    char buf[60];
-    int i, j;
-    float dset2_1[10], dset2_2[3][5];
-
-    fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* create groups */
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* root attributes */
-    group = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    dims[0] = 10;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(buf, "abcdefghi");
-    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    dims[0] = 2; dims[1] = 2;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
-    H5Awrite(attr, H5T_NATIVE_INT, data);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    H5Gclose(group);
-
-    group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
-
-    /* dset1.1.1 */
-    dims[0] = 10; dims[1] = 10;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 10; j++)
-            dset1[i][j] = j * i;
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-    H5Sclose(space);
-
-    /* attributes of dset1.1.1 */
-    dims[0] = 27;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(buf, "1st attribute of dset1.1.1");
-    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    dims[0] = 27;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(buf, "2nd attribute of dset1.1.1");
-    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    H5Dclose(dataset);
-
-    /* dset1.1.2 */
-    dims[0] = 20;
-    space = H5Screate_simple(1, dims, NULL);
-    dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 20; i++)
-        dset2[i] = i;
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    H5Gclose(group);
-
-    /* external link */
-    H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
-
-    /* soft link */
-    group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
-    H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
-
-    /* dset2.1 */
-    dims[0] = 10;
-    space = H5Screate_simple(1, dims, NULL);
-    dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 10; i++)
-        dset2_1[i] = (float)(i * 0.1F + 1);
-    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* dset2.2 */
-    dims[0] = 3; dims[1] = 5;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 3; i++)
-        for(j = 0; j < 5; j++)
-            dset2_2[i][j] = (float)((i + 1) * j * 0.1F);
-    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    H5Gclose(group);
-
-    /* user-defined link */
-    H5Lregister(UD_link_class);
-    H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Fclose(fid);
-}
-
-/*
-            o
-          /___\
-      g1 o/   \o g2
-          \___/
-
-
-o - group objects
-
- */
-
-static void gent_loop(void) {
-    hid_t fid, group;
-
-    fid = H5Fcreate(FILE10, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(fid, "/g1", H5L_SAME_LOC, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Fclose(fid);
-}
-
-static void gent_loop2(void)
-{
-    hid_t fid, group;
-
-    fid = H5Fcreate(FILE11, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* create group object g1 and implcit path from root object */
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* create group object g2 and implcit path from root object */
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* create path from object at /g1 to object at /g2 and name it g1.1 */
-    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
-
-    /* create path from object at /g2 to object at /g1 and name it g2.1 */
-    H5Lcreate_soft("/g1", fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Fclose(fid);
-}
-
-/*
-                  /
-     |       |       |   \    \    \     \      \
-     g1     g2      g3   g4   g5    g6    g7     g8
-    / \      |       |    \     \    \      \      \
- g1.1 g1.2 slink2  link3 dset2 slink4 dset3 slink5   elink
-  |    |    (g1)  (dset2)      (dset3)      (elink)  udlink
- dset1 link1                                slink6
-      (dset1)                               (udlink)
- */
-
-static void
-gent_many(void)
-{
-    hid_t fid, group, attr, dataset, space, space2, type, create_plist, type2;
-    hid_t array_dt;
-    hsize_t dims[2];
-    int data[2][2], dset2[10][10], dset3[10][10];
-    double d[10];
-
-    char buf[60];
-    int i, j;
-    int i0, i1, i2, i3;
-    hsize_t sdim, maxdim;
-
-    typedef struct { /* compound type has members with rank > 1 */
-            int a[2][2][2][2]; /* arrays are 2x2x2x2    */
-            double b[2][2][2][2];
-            double c[2][2][2][2];
-    } dset1_t;
-    dset1_t dset1[6];
-
-    hsize_t dim[4];
-    herr_t ret;
-
-    fid = H5Fcreate(FILE12, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    create_plist = H5Pcreate(H5P_DATASET_CREATE);
-
-    sdim = 2;
-    H5Pset_chunk(create_plist, 1, &sdim);
-
-    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-
-    dim[0] = dim[1] = dim[2] = dim[3] = 2;
-    array_dt = H5Tarray_create2(H5T_STD_I32BE, 4, dim);
-    H5Tinsert(type, "a_array", HOFFSET(dset1_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
-    H5Tinsert(type, "b_array", HOFFSET(dset1_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
-    H5Tinsert(type, "c_array", HOFFSET(dset1_t, c), array_dt);
-    H5Tclose(array_dt);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 4, dim);
-    H5Tinsert(type2, "a_array", HOFFSET(dset1_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
-    H5Tinsert(type2, "b_array", HOFFSET(dset1_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
-    H5Tinsert(type2, "c_array", HOFFSET(dset1_t, c), array_dt);
-    H5Tclose(array_dt);
-
-
-    /* dset1 */
-    sdim = 6;
-    maxdim = H5S_UNLIMITED;
-    space = H5Screate_simple(1, &sdim, &maxdim);
-    dataset = H5Dcreate2(group, "dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    /* add attributes to dset1 */
-    dims[0] = 10;
-    space2 = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space2, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(buf, "abcdefghi");
-    H5Awrite(attr, H5T_NATIVE_CHAR, buf);
-    H5Sclose(space2);
-    H5Aclose(attr);
-
-    dims[0] = 2; dims[1] = 2;
-    space2 = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(dataset, "attr2", H5T_STD_I32BE, space2, H5P_DEFAULT, H5P_DEFAULT);
-    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
-    H5Awrite(attr, H5T_NATIVE_INT, data);
-    H5Sclose(space2);
-    H5Aclose(attr);
-
-    dims[0] = 10;
-    space2 = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(dataset, "attr3", H5T_IEEE_F64BE, space2, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 10; i++)
-        d[i] = 0.1F * i;
-    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
-    H5Sclose(space2);
-    H5Aclose(attr);
-
-    for(j=0; j<(int)sdim; j++) {
-        for(i3 = 0; i3 < 2; i3++) {
-            for(i2 = 0; i2 < 2; i2++) {
-                for(i1 = 0; i1 < 2; i1++) {
-                    for(i0 = 0; i0 < 2; i0++) {
-                        dset1[j].a[i3][i2][i1][i0] = i0+j;
-                        dset1[j].b[i3][i2][i1][i0] = (double)(i0+j);
-                        dset1[j].c[i3][i2][i1][i0] = (double)(i0+j+sdim);
-                    }
-                }
-            }
-        }
-    }
-
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-
-    H5Dclose(dataset);
-    H5Sclose(space);
-
-    H5Tclose(type);
-    H5Tclose(type2);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(group, "/g1/g1.1/dset1", H5L_SAME_LOC, "link1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_soft("/g1", group, "slink2", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* dset2 */
-    dims[0] = 10; dims[1] = 10;
-    space = H5Screate_simple(2, dims, NULL);
-
-    dataset = H5Dcreate2(group, "dset2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 10; j++)
-            dset2[i][j] = j;
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-
-    H5Dclose(dataset);
-
-    H5Sclose(space);
-    H5Gclose(group);
-
-    group = H5Gopen2(fid, "/g3", H5P_DEFAULT);
-    H5Lcreate_hard(group, "/g4/dset2", H5L_SAME_LOC, "link3", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* dset3 */
-    dims[0] = 10; dims[1] = 10;
-    space = H5Screate_simple(2, dims, NULL);
-
-    dataset = H5Dcreate2(group, "dset3", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 10; j++)
-            dset3[i][j] = i;
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
-
-    H5Dclose(dataset);
-
-    H5Sclose(space);
-    H5Gclose(group);
-
-    group = H5Gopen2(fid, "/g5", H5P_DEFAULT);
-    H5Lcreate_soft("/g6/dset3", group, "slink4", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    H5Pclose(create_plist);
-
-    group = H5Gcreate2(fid, "/g7", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g8", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* Create dangling external and UD links */
-    H5Lcreate_external("somefile", "somepath", fid, "/g8/elink", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lregister(UD_link_class);
-    H5Lcreate_ud(fid, "/g8/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create links to external and UD links */
-    ret = H5Lcreate_soft("/g8/elink", fid, "/g7/slink5", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-    ret = H5Lcreate_soft("/g8/udlink", fid, "/g7/slink6", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    H5Fclose(fid);
-}
-
-static hid_t mkstr(int size, H5T_str_t pad) {
-    hid_t type;
-
-    if((type=H5Tcopy(H5T_C_S1)) < 0) return -1;
-    if(H5Tset_size(type, (size_t)size) < 0) return -1;
-    if(H5Tset_strpad(type, pad) < 0) return -1;
-
-    return type;
-}
-
-static void gent_str(void) {
-    hid_t fid, dataset, space, f_type, m_type, str_type, f_type2;
-    hid_t array_dt;
-
-    hsize_t dims1[] = { 3, 4};
-    char string1[12][3] = {"s1","s2","s3","s4","s5","s6","s7","s8","s9",
-            "s0","s1","s2"};
-
-    hsize_t dims2[]={20};
-    char string2[20][10] = {"ab cd ef1", "ab cd ef2", "ab cd ef3", "ab cd ef4",
-            "ab cd ef5", "ab cd ef6", "ab cd ef7", "ab cd ef8",
-            "ab cd ef9", "ab cd ef0", "ab cd ef1", "ab cd ef2",
-            "ab cd ef3", "ab cd ef4", "ab cd ef5", "ab cd ef6",
-            "ab cd ef7", "ab cd ef8", "ab cd ef9", "ab cd ef0"};
-
-    hsize_t dims3[] = { 27};
-    char string3[27][6] = {"abcd0", "abcd1", "abcd2", "abcd3",
-            "abcd4", "abcd5", "abcd6", "abcd7",
-            "abcd8", "abcd9", "abcd0", "abcd1",
-            "abcd2", "abcd3", "abcd4", "abcd5",
-            "abcd6", "abcd7", "abcd8", "abcd9",
-            "abcd0", "abcd1", "abcd2", "abcd3",
-            "abcd4", "abcd5", "abcd6"};
-
-    int i, j, k, l;
-
-    hsize_t dims4[] = { 3 };
-    char string4[3][21] = { "s1234567890123456789", "s1234567890123456789",
-            "s1234567890123456789"};
-
-    hsize_t dims5[] = { 3, 6};
-    typedef struct {
-            int a[8][10];
-            char s[12][33];
-    } compound_t;
-    compound_t comp1[3][6];
-    hsize_t mdims[2];
-
-    fid = H5Fcreate(FILE13, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* string 1 : nullterm string */
-    space = H5Screate_simple(2, dims1, NULL);
-    f_type = mkstr(5, H5T_STR_NULLTERM);
-    m_type = mkstr(3, H5T_STR_NULLTERM);
-    dataset = H5Dcreate2(fid, "/string1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string1);
-    H5Tclose(m_type);
-    H5Tclose(f_type);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* string 2 : space pad string */
-    space = H5Screate_simple(1, dims2, NULL);
-    f_type = mkstr(11, H5T_STR_SPACEPAD);
-    m_type = mkstr(10, H5T_STR_NULLTERM);
-    dataset = H5Dcreate2(fid, "/string2", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string2);
-    H5Tclose(m_type);
-    H5Tclose(f_type);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* string 3 : null pad string */
-    space = H5Screate_simple(1, dims3, NULL);
-    f_type = mkstr(8, H5T_STR_NULLPAD);
-    m_type = mkstr(6, H5T_STR_NULLTERM);
-    dataset = H5Dcreate2(fid, "/string3", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string3);
-    H5Tclose(m_type);
-    H5Tclose(f_type);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* string 4 : space pad long string */
-    space = H5Screate_simple(1, dims4, NULL);
-    f_type = mkstr(168, H5T_STR_SPACEPAD);
-    m_type = mkstr(21, H5T_STR_NULLTERM);
-    dataset = H5Dcreate2(fid, "/string4", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string4);
-    H5Tclose(m_type);
-    H5Tclose(f_type);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* compound data */
-    space = H5Screate_simple(2, dims5, NULL);
-    f_type = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
-    f_type2 = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
-
-    mdims[0] = 8; mdims[1] = 10;
-
-    array_dt = H5Tarray_create2(H5T_STD_I32BE, 2, mdims);
-    H5Tinsert(f_type, "int_array", HOFFSET(compound_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 2, mdims);
-    H5Tinsert(f_type2, "int_array", HOFFSET(compound_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    mdims[0] = 3; mdims[1] = 4;
-
-    str_type = mkstr(32, H5T_STR_SPACEPAD);
-    array_dt = H5Tarray_create2(str_type, 2, mdims);
-    H5Tinsert(f_type, "string", HOFFSET(compound_t, s), array_dt);
-    H5Tclose(array_dt);
-    H5Tclose(str_type);
-
-    str_type = mkstr(33, H5T_STR_NULLTERM);
-    array_dt = H5Tarray_create2(str_type, 2, mdims);
-    H5Tinsert(f_type2, "string", HOFFSET(compound_t, s), array_dt);
-    H5Tclose(array_dt);
-    H5Tclose(str_type);
-
-    for(i = 0; i < 3; i++)
-        for(j = 0; j < 6; j++) {
-            for(k = 0 ; k < 8; k++)
-                for(l = 0; l < 10; l++)
-                    comp1[i][j].a[k][l] = (l + j + k) * (l + j + k);
-            for(k = 0 ; k < 12; k++)
-                strcpy(comp1[i][j].s[k], "abcdefgh12345678abcdefgh12345678");
-        }
-
-    dataset = H5Dcreate2(fid, "/comp1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, f_type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, comp1);
-
-    H5Tclose(f_type);
-    H5Tclose(f_type2);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    H5Fclose(fid);
-}
-
-/*
-                      /
-       /     /     |    \    \     \
-     g1     g2    g3    g4    g5    g6
-     |       |     |     |     \     \
-  string1       string3       string5
-         string2       string4       string6
- */
-
-static void gent_str2(void)
-{
-    hid_t fid, group, attr, dataset, space, space2, mem_space, hyper_space;
-    hid_t fxdlenstr, fxdlenstr2, memtype;
-    hsize_t dims[1], size[1], stride[1], count[1], block[1];
-    hsize_t start[1];
-
-
-    int i;
-    char buf[LENSTR+10];
-    char buf2[3*LENSTR2];
-    hsize_t sdim;
-
-    fid = H5Fcreate(FILE14, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    fxdlenstr = H5Tcopy(H5T_C_S1);
-    H5Tset_size(fxdlenstr, LENSTR);
-    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
-    H5Tset_strpad(fxdlenstr, H5T_STR_NULLTERM);
-
-    memtype = H5Tcopy(H5T_C_S1);
-    H5Tset_size(memtype, LENSTR);
-    H5Tset_cset(memtype, H5T_CSET_ASCII);
-    H5Tset_strpad(memtype, H5T_STR_NULLTERM);
-
-    sdim = 10;
-    size[0] = sdim;
-    space = H5Screate_simple(1, size, NULL);
-    size[0] = 1;
-    mem_space = H5Screate_simple(1,size,NULL);
-    hyper_space = H5Scopy(space);
-
-    /* dset1 */
-
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset1", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* add attributes to dset1 */
-
-    fxdlenstr2 = H5Tcopy(H5T_C_S1);
-    H5Tset_size(fxdlenstr2, LENSTR2);
-    H5Tset_cset(fxdlenstr2, H5T_CSET_ASCII);
-    H5Tset_strpad(fxdlenstr2, H5T_STR_NULLTERM);
-
-    dims[0] = 3;
-    space2 = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(dataset, "attr1", fxdlenstr2, space2, H5P_DEFAULT, H5P_DEFAULT);
-    sprintf(&(buf2[0*LENSTR2]), "0123456789");
-    sprintf(&(buf2[1*LENSTR2]), "abcdefghij");
-    sprintf(&(buf2[2*LENSTR2]), "ABCDEFGHIJ");
-    H5Awrite(attr, fxdlenstr2, buf2);
-    H5Sclose(space2);
-    H5Tclose(fxdlenstr2);
-    H5Aclose(attr);
-
-    stride[0]=1;
-    count[0]=1;
-    block[0]=1;
-
-    for(i = 0; (hsize_t)i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of", i);
-        H5Tset_size(memtype, HDstrlen(buf)+1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset2", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; (hsize_t)i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of string array", i);
-        H5Tset_size(memtype, HDstrlen(buf)+1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-
-    H5Tclose(fxdlenstr);
-    fxdlenstr = H5Tcopy(H5T_C_S1);
-    H5Tset_size(fxdlenstr, LENSTR);
-    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
-    H5Tset_strpad(fxdlenstr, H5T_STR_NULLPAD);
-
-    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset3", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0;(hsize_t) i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of", i);
-        H5Tset_size(memtype, HDstrlen(buf)+1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-
-    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset4", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; (hsize_t)i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of string array", i);
-        H5Tset_size(memtype, HDstrlen(buf)+1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-    H5Tclose(fxdlenstr);
-    fxdlenstr = H5Tcopy(H5T_C_S1);
-    H5Tset_size(fxdlenstr, LENSTR);
-    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
-    H5Tset_strpad(fxdlenstr, H5T_STR_SPACEPAD);
-
-    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset5", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; (hsize_t)i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of", i);
-        H5Tset_size(memtype, HDstrlen(buf) + 1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-
-    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    dataset = H5Dcreate2(group, "dset6", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; (hsize_t)i < sdim; i++) {
-        start[0] = i;
-        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of string array", i);
-        H5Tset_size(memtype, HDstrlen(buf) + 1);
-        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
-        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
-    }
-
-    H5Dclose(dataset);
-    H5Gclose(group);
-    H5Tclose(fxdlenstr);
-    H5Tclose(memtype);
-    H5Sclose(mem_space);
-    H5Sclose(hyper_space);
-    H5Sclose(space);
-    H5Fclose(fid);
-}
-
-static void gent_enum(void)
-{
-    /*some code is taken from enum.c in the test dir */
-    hid_t file, type, space, dset;
-    int val;
-    enumtype data[] = {RED,   GREEN, BLUE,  GREEN, WHITE,
-            WHITE, BLACK, GREEN, BLUE,  RED,
-            RED,   BLUE,  GREEN, BLACK, WHITE,
-            RED,   WHITE, GREEN, GREEN, BLUE};
-    hsize_t size[1] = {NELMTS(data)};
-
-    file = H5Fcreate(FILE15,H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Try to test names with special characters */
-    type = H5Tcreate(H5T_ENUM, sizeof(enumtype));
-    H5Tenum_insert(type, "RED",   (val = 0, &val));
-    H5Tenum_insert(type, "GREEN\ngreen", (val = 1, &val));
-    H5Tenum_insert(type, "BLUE blue",  (val = 2, &val));
-    H5Tenum_insert(type, "WHITE \"white\"", (val = 3, &val));
-    H5Tenum_insert(type, "BLACK \'black\'", (val = 4, &val));
-    H5Tcommit2(file, "enum normal", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    space = H5Screate_simple(1,size,NULL);
-    dset = H5Dcreate2(file,"table",type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dset, type, space, space, H5P_DEFAULT, data);
-
-    H5Dclose(dset);
-    H5Sclose(space);
-    H5Fclose(file);
-}
-
-static void gent_objref(void)
-{
-    /*some code is taken from enum.c in the test dir */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-
-    hid_t  group;      /* Group ID             */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Datatype ID   */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    hobj_ref_t *wbuf,      /* buffer to write to disk */
-    *rbuf,       /* buffer read from disk */
-    *tbuf;       /* temp. buffer read from disk */
-    uint32_t   *tu32;      /* Temporary pointer to uint32 data */
-    int        i;          /* counting variables */
-    const char *write_comment = "Foo!"; /* Comments for group */
-
-    /* Allocate write & read buffers */
-    wbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
-    rbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
-    tbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE16, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create a group */
-    group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Set group's comment */
-    H5Oset_comment(group, write_comment);
-
-    /* Create a dataset (inside Group1) */
-    dataset = H5Dcreate2(group, "Dataset1", H5T_STD_U32BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(tu32 = (uint32_t *)((void*)wbuf), i = 0; i < SPACE1_DIM1; i++)
-        *tu32++ = i * 3;
-
-    /* Write selection to disk */
-    H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
-
-    /* Close Dataset */
-    H5Dclose(dataset);
-
-    /* Create another dataset (inside Group1) */
-    dataset = H5Dcreate2(group, "Dataset2", H5T_STD_U8BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Close Dataset */
-    H5Dclose(dataset);
-
-    /* Create a datatype to refer to */
-    tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
-
-    /* Insert fields */
-    H5Tinsert(tid1, "a", HOFFSET(s1_t,a), H5T_STD_I32BE);
-
-    H5Tinsert(tid1, "b", HOFFSET(s1_t,b), H5T_IEEE_F32BE);
-
-    H5Tinsert(tid1, "c", HOFFSET(s1_t,c), H5T_IEEE_F32BE);
-
-    /* Save datatype for later */
-    H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Close datatype */
-    H5Tclose(tid1);
-
-    /* Close group */
-    H5Gclose(group);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create reference to dataset */
-    H5Rcreate(&wbuf[0], fid1, "/Group1/Dataset1", H5R_OBJECT, (hid_t)-1);
-
-    /* Create reference to dataset */
-    H5Rcreate(&wbuf[1], fid1, "/Group1/Dataset2", H5R_OBJECT, (hid_t)-1);
-
-    /* Create reference to group */
-    H5Rcreate(&wbuf[2], fid1, "/Group1", H5R_OBJECT, (hid_t)-1);
-
-    /* Create reference to named datatype */
-    H5Rcreate(&wbuf[3], fid1, "/Group1/Datatype1", H5R_OBJECT, (hid_t)-1);
-
-    /* Write selection to disk */
-    H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
-
-    /* Close disk dataspace */
-    H5Sclose(sid1);
-
-    /* Close Dataset */
-    H5Dclose(dataset);
-
-    /* Close file */
-    H5Fclose(fid1);
-
-    /* Free memory buffers */
-    HDfree(wbuf);
-    HDfree(rbuf);
-    HDfree(tbuf);
-}
-
-static void gent_datareg(void)
-{
-    /*some code is taken from enum.c in the test dir */
-
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dset1, /* Dataset ID   */
-    dset2;      /* Dereferenced dataset ID */
-    hid_t  sid1,       /* Dataspace ID #1  */
-    sid2;       /* Dataspace ID #2  */
-    hsize_t  dims1[] = {SPACE1_DIM1},
-            dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
-    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
-    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
-    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
-    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
-    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
-    hdset_reg_ref_t      *wbuf,      /* buffer to write to disk */
-    *rbuf;       /* buffer read from disk */
-    uint8_t    *dwbuf,      /* Buffer for writing numeric data to disk */
-    *drbuf;      /* Buffer for reading numeric data from disk */
-    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
-    int        i;          /* counting variables */
-
-    /* Allocate write & read buffers */
-    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
-    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
-    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
-    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE17, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
-
-    /* Create a dataset */
-    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
-        *tu8++=i*3;
-
-    /* Write selection to disk */
-    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
-
-    /* Close Dataset */
-    H5Dclose(dset2);
-
-    /* Create dataspace for the reference dataset */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create a dataset */
-    dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create references */
-
-    /* Select 6x6 hyperslab for first reference */
-    start[0] = 2; start[1] = 2;
-    stride[0] = 1; stride[1] = 1;
-    count[0] = 6; count[1] = 6;
-    block[0] = 1; block[1] = 1;
-    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
-
-    H5Sget_select_npoints(sid2);
-
-    /* Store first dataset region */
-    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
-
-    /* Select sequence of ten points for second reference */
-    coord1[0][0]=6; coord1[0][1]=9;
-    coord1[1][0]=2; coord1[1][1]=2;
-    coord1[2][0]=8; coord1[2][1]=4;
-    coord1[3][0]=1; coord1[3][1]=6;
-    coord1[4][0]=2; coord1[4][1]=8;
-    coord1[5][0]=3; coord1[5][1]=2;
-    coord1[6][0]=0; coord1[6][1]=4;
-    coord1[7][0]=9; coord1[7][1]=0;
-    coord1[8][0]=7; coord1[8][1]=1;
-    coord1[9][0]=3; coord1[9][1]=3;
-    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
-
-    H5Sget_select_npoints(sid2);
-
-    /* Store second dataset region */
-    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
-
-    /* Write selection to disk */
-    H5Dwrite(dset1,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
-
-    /* Close disk dataspace */
-    H5Sclose(sid1);
-
-    /* Close Dataset */
-    H5Dclose(dset1);
-
-    /* Close uint8 dataset dataspace */
-    H5Sclose(sid2);
-
-    /* Close file */
-    H5Fclose(fid1);
-
-    /* Free memory buffers */
-    HDfree(wbuf);
-    HDfree(rbuf);
-    HDfree(dwbuf);
-    HDfree(drbuf);
-}
-
-static void gent_attrreg(void)
-{
-    /*some code is taken from enum.c in the test dir */
-
-    hid_t  fid1;        /* HDF5 File IDs  */
-    hid_t  dset1;       /* Dataset ID   */
-    hid_t  dset2;       /* Dereferenced dataset ID */
-    hid_t  sid1;        /* Dataspace ID #1  */
-    hid_t  sid2;        /* Dataspace ID #2  */
-    hid_t  sid3;        /* Dataspace ID #3  */
-    hid_t  attr1;       /* Attribute ID  */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    hsize_t  dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
-    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
-    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
-    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
-    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
-    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
-    hdset_reg_ref_t      *wbuf;      /* buffer to write to disk */
-    hdset_reg_ref_t      *rbuf;      /* buffer read from disk */
-    uint8_t    *dwbuf;      /* Buffer for writing numeric data to disk */
-    uint8_t    *drbuf;      /* Buffer for reading numeric data from disk */
-    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
-    int        i;           /* counting variables */
-
-    /* Allocate write & read buffers */
-    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
-    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
-    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
-    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE64, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
-
-    /* Create a dataset */
-    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
-        *tu8++=i*3;
-
-    /* Write selection to disk */
-    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
-
-    /* Close Dataset */
-    H5Dclose(dset2);
-
-    /*
-     * Create dataset with a null dataspace to serve as the parent for
-     * the attribute.
-     */
-    sid1 = H5Screate (H5S_NULL);
-    dset1 = H5Dcreate2 (fid1, "Dataset1", H5T_STD_I32LE, sid1, H5P_DEFAULT,
-            H5P_DEFAULT, H5P_DEFAULT);
-    H5Sclose (sid1);
-
-    /* Create references */
-
-    /* Select 6x6 hyperslab for first reference */
-    start[0] = 2; start[1] = 2;
-    stride[0] = 1; stride[1] = 1;
-    count[0] = 6; count[1] = 6;
-    block[0] = 1; block[1] = 1;
-    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
-
-    H5Sget_select_npoints(sid2);
-
-    /* Store first dataset region */
-    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
-
-    /* Select sequence of ten points for second reference */
-    coord1[0][0]=6; coord1[0][1]=9;
-    coord1[1][0]=2; coord1[1][1]=2;
-    coord1[2][0]=8; coord1[2][1]=4;
-    coord1[3][0]=1; coord1[3][1]=6;
-    coord1[4][0]=2; coord1[4][1]=8;
-    coord1[5][0]=3; coord1[5][1]=2;
-    coord1[6][0]=0; coord1[6][1]=4;
-    coord1[7][0]=9; coord1[7][1]=0;
-    coord1[8][0]=7; coord1[8][1]=1;
-    coord1[9][0]=3; coord1[9][1]=3;
-    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
-
-    H5Sget_select_npoints(sid2);
-
-    /* Store second dataset region */
-    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
-
-    /* Create dataspace for the attribute */
-    sid3 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create the attribute and write the region references to it. */
-    attr1 = H5Acreate2 (dset1, "Attribute1", H5T_STD_REF_DSETREG, sid3, H5P_DEFAULT,
-            H5P_DEFAULT);
-    H5Awrite (attr1, H5T_STD_REF_DSETREG, wbuf);
-
-    /* Close attribute dataspace */
-    H5Sclose(sid3);
-
-    /* Close attribute */
-    H5Aclose (attr1);
-
-    /* Close Dataset */
-    H5Dclose(dset1);
-
-    /* Close uint8 dataset dataspace */
-    H5Sclose(sid2);
-
-    /* Close file */
-    H5Fclose(fid1);
-
-    /* Free memory buffers */
-    HDfree(wbuf);
-    HDfree(rbuf);
-    HDfree(dwbuf);
-    HDfree(drbuf);
-}
-
-/*taken from Elena's compound test file*/
-static void gent_nestcomp(void)
-{
-    /* Compound memeber of the compound datatype*/
-    typedef struct cmp_t {
-            char   a;
-            float  b[2];
-    } cmp_t;
-
-    /* First structure  and dataset*/
-    typedef struct s1_t {
-            int    a;
-            float  b;
-            double c;
-            cmp_t  d;
-    } s2_t;
-    hid_t      cmp_tid;    /* Handle for the compound datatype */
-    hid_t      char_id;    /* Handle for the string datatype */
-    hid_t      array_dt;
-    hsize_t     array_dims[] = {2};    /* Dataspace dimensions */
-    unsigned    ndims = 1;    /* Number of dimensions in the array field */
-
-    s2_t       s1[10];
-    hid_t      s2_tid;     /* File datatype identifier */
-
-    int        i;
-    hid_t      file, dataset, space; /* Handles */
-    herr_t     status;
-    hsize_t    dim[] = {10};   /* Dataspace dimensions */
-
-    char datasetname[] = "ArrayOfStructures";
-
-
-    /*
-     * Initialize the data
-     */
-    for(i = 0; i< 10; i++) {
-        s1[i].a = i;
-        s1[i].b = (float)(i*i);
-        s1[i].c = 1.0F/(i+1);
-        s1[i].d.a = 65 + i;
-        s1[i].d.b[0] = -100.0F;
-        s1[i].d.b[1] =  100.0F;
-    }
-
-    /*
-     * Create the data space.
-     */
-    space = H5Screate_simple(1, dim, NULL);
-
-    /*
-     * Create the file.
-     */
-    file = H5Fcreate(FILE18, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Create the memory data type.
-     */
-    /*
-     * Create a datatype for compound field first.
-     */
-    cmp_tid = H5Tcreate (H5T_COMPOUND, sizeof(cmp_t));
-
-    /* We are using C string of length one to represent "real" character */
-    char_id = H5Tcopy(H5T_C_S1);
-    H5Tset_strpad(char_id, H5T_STR_NULLTERM);
-    H5Tinsert(cmp_tid, "char_name", HOFFSET(cmp_t, a), char_id);
-
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, array_dims);
-    H5Tinsert(cmp_tid, "array_name", HOFFSET(cmp_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
-    H5Tinsert(s2_tid, "a_name", HOFFSET(s2_t, a), H5T_NATIVE_INT);
-    H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE);
-    H5Tinsert(s2_tid, "b_name", HOFFSET(s2_t, b), H5T_NATIVE_FLOAT);
-
-    /* Insert compound memeber created above */
-    H5Tinsert(s2_tid, "d_name", HOFFSET(s2_t, d), cmp_tid);
-
-    /*
-     * Create the dataset.
-     */
-    dataset = H5Dcreate2(file, datasetname, s2_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Wtite data to the dataset;
-     */
-    status = H5Dwrite(dataset, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1);
-    if(status < 0)
-        fprintf(stderr, "gent_nestcomp H5Dwrite failed\n");
-
-    /*
-     * Release resources
-     */
-    H5Tclose(s2_tid);
-    H5Tclose(cmp_tid);
-    H5Tclose(char_id);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(file);
-}
-
-static void gent_opaque(void)
-{
-    hid_t file, type, dataset, space;
-    char test[100][2];
-    int x;
-    hsize_t dim = 2;
-
-    for(x = 0; x < 100; x++){
-        test[x][0] = x;
-        test[x][1] = 99 - x;
-    }
-
-    /*
-     * Create the data space.
-     */
-    space = H5Screate_simple(1, &dim, NULL);
-
-    /*
-     * Create the file.
-     */
-    file = H5Fcreate(FILE19, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Create the memory datatype.
-     */
-    type = H5Tcreate(H5T_OPAQUE, sizeof(char) * 100 * 2);
-    H5Tset_tag(type, "test opaque type");
-
-    /*
-     * Create the dataset.
-     */
-    dataset = H5Dcreate2(file, "opaque test", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Write data to the dataset;
-     */
-    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, test);
-
-    H5Tclose(type);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(file);
-}
-
-static void gent_bitfields(void)
-{
-    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
-    size_t  i;
-    hsize_t  nelmts;
-    unsigned char buf[32];
-
-    file = H5Fcreate(FILE20, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    if((grp = H5Gcreate2(file, "typetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
-
-    /* bitfield_1 */
-    nelmts = sizeof(buf);
-    if((type = H5Tcopy(H5T_STD_B8LE)) < 0 ||
-            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
-            (dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto error;
-
-    for(i = 0; i < sizeof buf; i++)
-        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
-    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Tclose(type) < 0) goto error;
-    if(H5Dclose(dset) < 0) goto error;
-
-    /* bitfield_2 */
-    nelmts = sizeof(buf)/2;
-    if((type = H5Tcopy(H5T_STD_B16LE)) < 0 ||
-            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
-            (dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto error;
-    for(i = 0; i < sizeof buf; i++)
-        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
-    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto error;
-    if(H5Sclose(space) < 0) goto error;
-    if(H5Tclose(type) < 0) goto error;
-    if(H5Dclose(dset) < 0) goto error;
-    if(H5Gclose(grp) < 0) goto error;
-    H5Fclose(file);
-
-    error:
-    H5E_BEGIN_TRY {
-        H5Gclose(grp);
-        H5Tclose(type);
-        H5Sclose(space);
-        H5Dclose(dset);
-    } H5E_END_TRY;
-}
-
-static void gent_vldatatypes(void)
-{
-    hvl_t adata, wdata[SPACE1_DIM1];
-    hid_t file, dset, space, type;
-    hsize_t dims[] = { SPACE1_DIM1 };
-    int i;
-    herr_t ret=0;
-
-    file = H5Fcreate(FILE21, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Allocate and initialize VL dataset to write */
-    for(i = 0; i < SPACE1_DIM1; i++) {
-        int j;
-
-        wdata[i].p = HDmalloc((i + 1) * sizeof(int));
-        wdata[i].len = i + 1;
-
-        for(j = 0; j < i + 1; j++)
-            ((int *)wdata[i].p)[j] = i * 10 + j;
-    }
-
-    /* write out the integers in little-endian format */
-    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
-    type = H5Tvlen_create(H5T_NATIVE_INT);
-    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-    ret = H5Sclose(space);
-    HDassert(ret >= 0);
-
-    /* Allocate and initialize VL dataset to write */
-    for(i = 0; i < SPACE1_DIM1; i++) {
-        int j;
-
-        wdata[i].p = HDmalloc((i + 1) * sizeof(float));
-        wdata[i].len = i + 1;
-
-        for(j = 0; j < i + 1; j++)
-            ((float *)wdata[i].p)[j] = (float)(i * 10 + ((float)j) / 10.0F);
-    }
-
-    /* write out the floats in little-endian format */
-    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
-    type = H5Tvlen_create(H5T_NATIVE_FLOAT);
-    dset = H5Dcreate2(file, "Dataset2.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-    ret = H5Sclose(space);
-    HDassert(ret >= 0);
-
-    /* Allocate and initialize a scalar VL dataset to write */
-    adata.p = HDmalloc(37 * sizeof(int));
-    adata.len = 37;
-
-    for(i = 0; i < 37; i++)
-        ((int *)adata.p)[i] = i * 2;
-
-    /* write out scalar VL dataset in little-endian format */
-    space = H5Screate_simple(0, NULL, NULL);
-    type = H5Tvlen_create(H5T_NATIVE_INT);
-    dset = H5Dcreate2(file, "Dataset3.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &adata);
-    HDassert(ret >= 0);
-    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, &adata);
-    HDassert(ret >= 0);
-
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-    ret = H5Sclose(space);
-    HDassert(ret >= 0);
-    ret = H5Fclose(file);
-    HDassert(ret >= 0);
-}
-
-static void
-gent_vldatatypes2(void)
-{
-    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
-    hvl_t *t1;              /* Temporary pointer to VL information */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1, tid2; /* Datatype IDs         */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    unsigned       i,j,k;      /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize VL data to write */
-    for(i = 0; i < SPACE1_DIM1; i++) {
-        wdata[i].p = (hvl_t *)HDmalloc((i + 1) * sizeof(hvl_t));
-        if(wdata[i].p == NULL) {
-            printf("Cannot allocate memory for VL data! i=%u\n", i);
-            return;
-        } /* end if */
-        wdata[i].len = i + 1;
-        for(t1 = (hvl_t *)wdata[i].p, j = 0; j < (i + 1); j++, t1++) {
-            t1->p = (unsigned *)HDmalloc((j + 1) * sizeof(unsigned));
-            if(t1->p == NULL) {
-                printf("Cannot allocate memory for VL data! i=%u, j=%u\n",i,j);
-                return;
-            } /* end if */
-            t1->len=j+1;
-            for(k=0; k<(j+1); k++)
-                ((unsigned int *)t1->p)[k]=i*100+j*10+k;
-        } /* end for */
-    } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE22, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create a VL datatype to refer to */
-    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
-
-    /* Create the base VL type */
-    tid2 = H5Tvlen_create(tid1);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-
-}
-
-static void gent_vldatatypes3(void)
-{
-    typedef struct {             /* Struct that the VL sequences are composed of */
-            int i;
-            float f;
-            hvl_t v;
-    } s1;
-    s1 wdata[SPACE1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1, tid2; /* Datatype IDs         */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    unsigned       i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize VL data to write */
-    for(i=0; i<SPACE1_DIM1; i++) {
-        wdata[i].i=i*10;
-        wdata[i].f=(float)((i*20)/3.0F);
-        wdata[i].v.p=HDmalloc((i+1)*sizeof(unsigned int));
-        wdata[i].v.len=i+1;
-        for(j=0; j<(i+1); j++)
-            ((unsigned int *)wdata[i].v.p)[j]=i*10+j;
-    } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE23, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create a VL datatype to refer to */
-    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
-
-    /* Create the base compound type */
-    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
-
-    /* Insert fields */
-    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
-    HDassert(ret >= 0);
-    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
-    HDassert(ret >= 0);
-    ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1);
-    HDassert(ret >= 0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-static void gent_vldatatypes4(void)
-{
-    typedef struct {             /* Struct that the VL sequences are composed of */
-            int i;
-            float f;
-    } s1;
-    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1, tid2; /* Datatype IDs         */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    unsigned       i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize VL data to write */
-    for(i=0; i<SPACE1_DIM1; i++) {
-        wdata[i].p=HDmalloc((i+1)*sizeof(s1));
-        wdata[i].len=i+1;
-        for(j=0; j<(i+1); j++) {
-            ((s1 *)wdata[i].p)[j].i=i*10+j;
-            ((s1 *)wdata[i].p)[j].f=(float)((i*20+j)/3.0F);
-        } /* end for */
-    } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE24, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create the base compound type */
-    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
-
-    /* Insert fields */
-    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
-    HDassert(ret >= 0);
-    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
-    HDassert(ret >= 0);
-
-    /* Create a datatype to refer to */
-    tid1 = H5Tvlen_create(tid2);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-/* Generate a variable-length dataset with NULL values in it */
-static void gent_vldatatypes5(void)
-{
-    hvl_t wdata [SPACE1_DIM1];
-    hid_t  fid1;
-    hid_t  dataset;
-    hid_t  sid1;
-    hid_t  tid1;
-    hsize_t  dims1[] = {SPACE1_DIM1};
-    int                 i,j;          /* counting variable */
-    herr_t  ret;  /* Generic return value  */
-
-    /* initialize data for dataset */
-    for(i=0; i<SPACE1_DIM1; i++) {
-        if(i%2) {
-            wdata[i].len=0;
-            wdata[i].p=NULL;
-        } /* end if */
-        else {
-            wdata[i].len=i+5;
-            wdata[i].p=HDmalloc(sizeof(unsigned)*(i+5));
-            for(j=0; j<i+5; j++)
-                ((unsigned *)wdata[i].p)[j]=j*2;
-        } /* end else */
-    } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE43, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid1>0);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-    HDassert(sid1>0);
-
-    /* Create a datatype to refer to */
-    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
-    HDassert(tid1>0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, F43_DSETNAME, tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(dataset>0);
-
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-
-    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-
-    ret = H5Sclose (sid1);
-    HDassert(ret >= 0);
-
-    ret = H5Fclose (fid1);
-    HDassert(ret >= 0);
-}
-
-/* This is big enough to make h5dump to use hyperslap to read
-   from file and display portion by portion. This also prints out array indices
-   via region reference for testing refion reference output.
-   Note: this was added originally prepared for bug2092. before the fix h5dump didn't
-         display array indices every 262 x N (N > 0) based on 2000x1000 dims.
- */
-#define SPACE_ARRAY1BIG_DIM 2000
-#define ARRAY1BIG_DIM 1000
-
-static void gent_array1_big(void)
-{
-    int *wdata;   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Datatype ID   */
-    hsize_t  sdims1[] = {SPACE_ARRAY1BIG_DIM};
-    hsize_t  tdims1[] = {ARRAY1BIG_DIM};
-    int        i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-
-    /* for region reference dataset */
-    hid_t  dset2;
-    hid_t  sid2;
-    hsize_t  dims2[] = {SPACE1_DIM1};
-    hsize_t  start[SPACE1_RANK];     /* Starting location of hyperslab */
-    hsize_t  stride[SPACE1_RANK];    /* Stride of hyperslab */
-    hsize_t  count[SPACE1_RANK];     /* Element count of hyperslab */
-    hsize_t  block[SPACE1_RANK];     /* Block size of hyperslab */
-    hdset_reg_ref_t   *wbuf;         /* buffer to write to disk */
-
-    start[0] = 0;
-    stride[0] = 1;
-    count[0] = 999;
-    block[0] = 1;
-
-    /* Allocate write & read buffers */
-    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
-    wdata = (int *)HDmalloc(sizeof(int) * (size_t)(SPACE_ARRAY1BIG_DIM * ARRAY1BIG_DIM));
-
-    /* Allocate and initialize array data to write */
-    for(i = 0; i < SPACE_ARRAY1BIG_DIM; i++)
-        for(j = 0; j < ARRAY1BIG_DIM; j++)
-            *(wdata + (i * ARRAY1BIG_DIM) + j) = i * 1;
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE25_BIG, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------
-     * Array type dataset
-     */
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a datatype to refer to */
-    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /*---------------------------
-     * Region Reference dataset
-     */
-    /* Create dataspace for the reference dataset */
-    sid2 = H5Screate_simple(SPACE1_RANK, dims2, NULL);
-
-    /* Create a dataset */
-    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_REF_DSETREG, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create references */
-    H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block);
-
-    H5Sget_select_npoints(sid1);
-
-    /* Create Dataset1 region */
-    H5Rcreate(&wbuf[0], fid1, "/Dataset1", H5R_DATASET_REGION, sid1);
-
-    /* Write selection to disk */
-    H5Dwrite(dset2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-
-    /* Release memory */
-    HDfree(wbuf);
-    HDfree(wdata);
-}
-
-static void gent_array1(void)
-{
-    int wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Datatype ID   */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    int        i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++)
-            wdata[i][j]=i*10+j;
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE25, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a datatype to refer to */
-    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-static void gent_array2(void)
-{
-    int wdata[SPACE1_DIM1][ARRAY2_DIM1][ARRAY2_DIM2][ARRAY2_DIM3];   /* Information to write */
-    hid_t  fid;        /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid;        /* Dataspace ID   */
-    hid_t  tid;        /* Datatype ID   */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims2[] = {ARRAY2_DIM1,ARRAY2_DIM2,ARRAY2_DIM3};
-    int        i,j,k,l;    /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY2_DIM1; j++)
-            for(k=0; k<ARRAY2_DIM2; k++)
-                for(l=0; l<ARRAY2_DIM3; l++)
-                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
-
-    /* Create file */
-    fid = H5Fcreate(FILE26, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a datatype to refer to */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, ARRAY2_RANK, tdims2);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid, "Dataset1", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-static void gent_array3(void)
-{
-    int wdata[SPACE1_DIM1][ARRAY1_DIM1][ARRAY3_DIM1][ARRAY3_DIM2];   /* Information to write */
-    hid_t  fid;        /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid;        /* Dataspace ID   */
-    hid_t  tid1;       /* 1-D array Datatype ID */
-    hid_t  tid2;       /* 2-D array Datatype ID */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    hsize_t  tdims2[] = {ARRAY3_DIM1,ARRAY3_DIM2};
-    int        i,j,k,l;    /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Allocate and initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++)
-            for(k=0; k<ARRAY3_DIM1; k++)
-                for(l=0; l<ARRAY3_DIM2; l++)
-                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
-
-    /* Create file */
-    fid = H5Fcreate(FILE27, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a 2-D datatype to refer to */
-    tid2 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY3_RANK, tdims2);
-
-    /* Create a 1-D datatype to refer to */
-    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-static void gent_array4(void)
-{
-    typedef struct {        /* Typedef for compound datatype */
-            int i;
-            float f;
-    } s2_t;
-    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Array Datatype ID   */
-    hid_t  tid2;       /* Compound Datatype ID   */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    int        i,j;        /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++) {
-            wdata[i][j].i=i*10+j;
-            wdata[i][j].f=(float)(i*2.5F+j);
-        } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE28, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a compound datatype to refer to */
-    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
-
-    /* Insert integer field */
-    ret = H5Tinsert(tid2, "i", HOFFSET(s2_t, i), H5T_NATIVE_INT);
-    HDassert(ret >= 0);
-
-    /* Insert float field */
-    ret = H5Tinsert(tid2, "f", HOFFSET(s2_t, f), H5T_NATIVE_FLOAT);
-    HDassert(ret >= 0);
-
-    /* Create an array datatype to refer to */
-    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
-
-    /* Close compound datatype */
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-static void gent_array5(void)
-{
-    typedef struct {        /* Typedef for compound datatype */
-            int i;
-            float f[ARRAY1_DIM1];
-    } s2_t;
-    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Array Datatype ID */
-    hid_t  tid2;       /* Compound Datatype ID */
-    hid_t  tid3;       /* Nested Array Datatype ID */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    int        i,j,k;      /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++) {
-            wdata[i][j].i=i*10+j;
-            for(k=0; k<ARRAY1_DIM1; k++)
-                wdata[i][j].f[k]=(float)(i*10+j*2.5F+k);
-        } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE29, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a compound datatype to refer to */
-    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
-
-    /* Insert integer field */
-    ret = H5Tinsert (tid2, "i", HOFFSET(s2_t,i), H5T_NATIVE_INT);
-    HDassert(ret >= 0);
-
-    /* Create an array of floats datatype */
-    tid3 = H5Tarray_create2(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1);
-
-    /* Insert float array field */
-    ret = H5Tinsert (tid2, "f", HOFFSET(s2_t,f), tid3);
-    HDassert(ret >= 0);
-
-    /* Close array of floats field datatype */
-    ret = H5Tclose(tid3);
-    HDassert(ret >= 0);
-
-    /* Create an array datatype to refer to */
-    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
-
-    /* Close compound datatype */
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-static void gent_array6(void)
-{
-    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Array Datatype ID   */
-    hid_t  tid2;       /* VL Datatype ID       */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    int        i,j,k;      /* counting variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++) {
-            wdata[i][j].p=HDmalloc((i+j+1)*sizeof(unsigned int));
-            wdata[i][j].len=i+j+1;
-            for(k=0; k<(i+j+1); k++)
-                ((unsigned int *)wdata[i][j].p)[k]=i*100+j*10+k;
-        } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE30, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create a compound datatype to refer to */
-    tid2 = H5Tvlen_create(H5T_NATIVE_UINT);
-
-    /* Create an array datatype to refer to */
-    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
-
-    /* Close VL datatype */
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-static void gent_array7(void)
-{
-    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset; /* Dataset ID   */
-    hid_t  sid1;       /* Dataspace ID   */
-    hid_t  tid1;       /* Array Datatype ID   */
-    hid_t  tid2;       /* VL Datatype ID       */
-    hid_t  tid3;       /* Nested Array Datatype ID   */
-    hsize_t  sdims1[] = {SPACE1_DIM1};
-    hsize_t  tdims1[] = {ARRAY1_DIM1};
-    int        i,j,k,l;    /* Index variables */
-    herr_t  ret;  /* Generic return value  */
-
-    /* Initialize array data to write */
-    for(i=0; i<SPACE1_DIM1; i++)
-        for(j=0; j<ARRAY1_DIM1; j++) {
-            wdata[i][j].p=HDmalloc((i+j+1)*(sizeof(unsigned int)*ARRAY1_DIM1));
-            wdata[i][j].len=i+j+1;
-            for(k=0; k<(i+j+1); k++)
-                for(l=0; l<ARRAY1_DIM1; l++)
-                    ((unsigned int *)wdata[i][j].p)[k*ARRAY1_DIM1+l]=i*1000+j*100+k*10+l;
-        } /* end for */
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE31, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create dataspace for datasets */
-    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
-
-    /* Create the nested array datatype to refer to */
-    tid3 = H5Tarray_create2(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1);
-
-    /* Create a VL datatype of 1-D arrays to refer to */
-    tid2 = H5Tvlen_create(tid3);
-
-    /* Close nested array datatype */
-    ret = H5Tclose(tid3);
-    HDassert(ret >= 0);
-
-    /* Create an array datatype to refer to */
-    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
-
-    /* Close VL datatype */
-    ret = H5Tclose(tid2);
-    HDassert(ret >= 0);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write dataset to disk */
-    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Reclaim the write VL data */
-    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
-    HDassert(ret >= 0);
-
-    /* Close Dataset */
-    ret = H5Dclose(dataset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid1);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid1);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid1);
-    HDassert(ret >= 0);
-}
-
-/* Test the boundary of the display output buffer at the reallocation event */
-static void gent_array8(void)
-{
-    hid_t       file = -1; /* Handles */
-    hid_t       filetype = -1; /* Handles */
-    hid_t       space = -1; /* Handles */
-    hid_t       dset = -1; /* Handles */
-    herr_t      status = -1;
-    hsize_t sdims[] = {F64_DIM0};
-    hsize_t tdims[] = {F64_DIM1};
-    int         wdata[(F64_DIM1) * sizeof(int)];      /* Write buffer */
-    unsigned int i;
-
-    /*
-     * Initialize data.  i is the element in the dataspace, j and k the
-     * elements within the array datatype.
-     */
-    for (i=0; i<F64_DIM1; i++)
-        wdata[i] = i;
-
-    /*
-     * Create a new file using the default properties.
-     */
-    file = H5Fcreate (F64_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /*
-     * Create array datatypes for file and memory.
-     */
-    filetype = H5Tarray_create2 (H5T_NATIVE_INT, 1, tdims);
-
-    /*
-     * Create dataspace.  Setting maximum size to NULL sets the maximum
-     * size to be the current size.
-     */
-    space = H5Screate_simple (1, sdims, NULL);
-
-    /*
-     * Create the dataset and write the array data to it.
-     */
-    if(file>=0 && filetype>=0 && space>=0) {
-        dset = H5Dcreate2 (file, F64_DATASET, filetype, space, H5P_DEFAULT, H5P_DEFAULT,
-                H5P_DEFAULT);
-        if(dset>=0)
-            status = H5Dwrite (dset, filetype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-            HDassert(status >= 0);
-    }
-    /*
-     * Close and release resources.
-     */
-    status = H5Dclose (dset);
-    HDassert(status >= 0);
-    status = H5Sclose (space);
-    HDassert(status >= 0);
-    status = H5Tclose (filetype);
-    HDassert(status >= 0);
-    status = H5Fclose (file);
-    HDassert(status >= 0);
-}
-
-static void gent_empty(void)
-{
-    typedef struct {
-            int a;
-            float b;
-            char c;
-    } empty_struct;
-    hid_t file, dset, space, type;
-    hsize_t dims[] = { SPACE1_DIM1 };
-    herr_t ret=0;
-
-    file = H5Fcreate(FILE32, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
-
-    /* write out an empty vlen dataset */
-    type = H5Tvlen_create(H5T_NATIVE_INT);
-    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* Don't write any data */
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-
-    /* write out an empty native integer dataset dataset */
-    dset = H5Dcreate2(file, "Dataset2.0", H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* Don't write any data */
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-
-    /* write out an empty native floating-point dataset dataset */
-    dset = H5Dcreate2(file, "Dataset3.0", H5T_NATIVE_FLOAT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* Don't write any data */
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-
-    /* write out an empty array dataset */
-    type = H5Tarray_create2(H5T_NATIVE_INT, SPACE1_RANK, dims);
-    dset = H5Dcreate2(file, "Dataset4.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* Don't write any data */
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-
-    /* write out an empty compound dataset */
-    type = H5Tcreate(H5T_COMPOUND,sizeof(empty_struct));
-    H5Tinsert(type, "a", HOFFSET(empty_struct, a),H5T_NATIVE_INT);
-    H5Tinsert(type, "b", HOFFSET(empty_struct, b),H5T_NATIVE_FLOAT);
-    H5Tinsert(type, "c", HOFFSET(empty_struct, c),H5T_NATIVE_CHAR);
-    dset = H5Dcreate2(file, "Dataset5.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* Don't write any data */
-    ret = H5Dclose(dset);
-    HDassert(ret >= 0);
-    ret = H5Tclose(type);
-    HDassert(ret >= 0);
-
-    ret = H5Sclose(space);
-    HDassert(ret >= 0);
-
-    ret = H5Fclose(file);
-    HDassert(ret >= 0);
-}
-
-static void
-gent_group_comments(void)
-{
-    hid_t fid, group;
-
-    fid = H5Fcreate(FILE33, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* / */
-    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g1", "Comment for group /g1", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g2", "Comment for group /g2", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g3", "Comment for group /g3", H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g1 */
-    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g1/g1.1", "Comment for group /g1/g1.1", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g1/g1.2", "Comment for group /g1/g1.2", H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g2 */
-    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g2/g2.1", "Comment for group /g2/g2.1", H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g3 */
-    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g3/g3.1", "Comment for group /g3/g3.1", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g3/g3.2", "Comment for group /g3/g3.2", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g3/g3.3", "Comment for group /g3/g3.3", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g3/g3.4", "Comment for group /g3/g3.4", H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /g2/g2.1 */
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.1", "Comment for group /g2/g2.1/g2.1.1", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.2", "Comment for group /g2/g2.1/g2.1.2", H5P_DEFAULT);
-    H5Gclose(group);
-    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.3", "Comment for group /g2/g2.1/g2.1.3", H5P_DEFAULT);
-    H5Gclose(group);
-
-    /* /glongcomment */
-    group = H5Gcreate2(fid, "/glongcomment", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Oset_comment_by_name(group, "/glongcomment", "Comment for group /glongcomment with a really, really, really long, long, long comment", H5P_DEFAULT);
-    H5Gclose(group);
-
-    H5Fclose(fid);
-}
-
-static
-void gent_split_file(void)
-{
-    hid_t fapl, fid, root, attr, space, dataset, atype;
-    char meta[] = "this is some metadata on this file";
-    hsize_t dims[2];
-    int i, j, dset[10][15];
-
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
-    fid = H5Fcreate(FILE34, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    atype = H5Tcopy(H5T_C_S1);
-    H5Tset_size(atype, HDstrlen(meta) + 1);
-    H5Tset_strpad(atype, H5T_STR_NULLTERM);
-
-    dims[0] = 1;
-    space = H5Screate_simple(1, dims, NULL);
-    attr = H5Acreate2(root, "Metadata", atype, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, atype, meta);
-    H5Tclose(atype);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* create dataset */
-    dims[0] = 10;
-    dims[1] = 15;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 15; j++)
-            dset[i][j] = i + j;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Gclose(root);
-    H5Fclose(fid);
-    H5Pclose(fapl);
-}
-
-static
-void gent_family(void)
-{
-    hid_t fapl, fid, space, dataset;
-    hsize_t dims[2];
-    int i, j, dset[10][15];
-
-#define FAMILY_SIZE     256
-
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT);
-
-    fid = H5Fcreate(FILE35, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-
-    /* create dataset */
-    dims[0] = 10;
-    dims[1] = 15;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 15; j++)
-            dset[i][j] = i + j;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-    H5Pclose(fapl);
-}
-
-static const char *multi_letters = "msbrglo";
-
-static
-void gent_multi(void)
-{
-    hid_t fapl, fid, space, dataset;
-    hsize_t dims[2];
-    int i, j, dset[10][15];
-
-    /* Multi-file driver, general case of the split driver */
-    H5FD_mem_t mt, memb_map[H5FD_MEM_NTYPES];
-    hid_t memb_fapl[H5FD_MEM_NTYPES];
-    const char *memb_name[H5FD_MEM_NTYPES];
-    char sv[H5FD_MEM_NTYPES][1024];
-    haddr_t memb_addr[H5FD_MEM_NTYPES];
-
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-
-    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);
-
-    HDassert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
-
-    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
-        memb_fapl[mt] = H5P_DEFAULT;
-        memb_map[mt] = mt;
-        sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
-        memb_name[mt] = sv[mt];
-        /*printf("memb_name[%d]=%s, memb_map[%d]=%d; ", mt, memb_name[mt], mt, memb_map[mt]);*/
-        memb_addr[mt] = MAX(mt - 1,0) * (HADDR_MAX / 10);
-    }
-    memb_map[H5FD_MEM_DEFAULT] = H5FD_MEM_SUPER;
-
-    H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
-            memb_addr, FALSE);
-
-    fid = H5Fcreate(FILE36, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-
-    /* create dataset */
-    dims[0] = 10;
-    dims[1] = 15;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 10; i++)
-        for(j = 0; j < 15; j++)
-            dset[i][j] = i + j;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
-
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-    H5Pclose(fapl);
-}
-
-static void gent_large_objname(void)
-{
-    hid_t fid, group, group2;
-    char grp_name[128];
-    register int i;
-
-    fid = H5Fcreate(FILE37, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    group = H5Gcreate2(fid, "this_is_a_large_group_name", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < 50; ++i) {
-        sprintf(grp_name, "this_is_a_large_group_name%d", i);
-        group2 = H5Gcreate2(group, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-        H5Gclose(group2);
-    }
-
-    H5Gclose(group);
-    H5Fclose(fid);
-}
-
-static void gent_vlstr(void)
-{
-    const char *wdata[SPACE1_DIM1]= {
-            "Four score and seven years ago our forefathers brought forth on this continent a new nation,",
-            "conceived in liberty and dedicated to the proposition that all men are created equal.",
-            "",
-            NULL
-    };   /* Information to write */
-    const char *string_att= "This is the string for the attribute";
-    hid_t  fid1;  /* HDF5 File IDs  */
-    hid_t  dataset, root; /* Dataset ID   */
-    hid_t  sid1, dataspace;/* Dataspace ID   */
-    hid_t  tid1, att;      /* Datatype ID   */
-    hsize_t  dims1[] = {SPACE1_DIM1};
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE38, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-
-    /* Create a VL string datatype to refer to */
-    tid1 = H5Tcopy (H5T_C_S1);
-    H5Tset_size (tid1, H5T_VARIABLE);
-
-    /* Create a dataset and write VL string to it. */
-    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-    H5Dclose(dataset);
-
-    /* Create a named VL string type.  Change padding of datatype */
-    H5Tset_strpad(tid1, H5T_STR_NULLPAD);
-    H5Tcommit2(fid1, "vl_string_type", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create an group attribute of VL string type */
-    root = H5Gopen2(fid1, "/", H5P_DEFAULT);
-    dataspace = H5Screate(H5S_SCALAR);
-
-    att = H5Acreate2(root, "test_scalar", tid1, dataspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(att, tid1, &string_att);
-
-    /* Close */
-    H5Tclose(tid1);
-    H5Sclose(sid1);
-    H5Sclose(dataspace);
-    H5Aclose(att);
-    H5Gclose(root);
-    H5Fclose(fid1);
-}
-
-static void gent_char(void)
-{
-    const char *wdata =
-            "Four score and seven years ago our forefathers brought "
-            "forth on this continent a new nation, conceived in "
-            "liberty and dedicated to the proposition that all "
-            "men are created equal. Now we are engaged in a great "
-            "civil war, testing whether that nation or any nation "
-            "so conceived and so dedicated can long endure.";
-    hid_t       fid1;               /* HDF5 File IDs    */
-    hid_t       dataset;            /* Dataset ID       */
-    hid_t       sid1;               /* Dataspace ID     */
-    hsize_t     dims1[1];
-
-    dims1[0] = HDstrlen(wdata);
-
-    /* Create file */
-    fid1 = H5Fcreate(FILE39, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    sid1 = H5Screate_simple(1, dims1, NULL);
-
-    /* Create a dataset */
-    dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_CHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write some characters to it. */
-    H5Dwrite(dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-
-    /* Close */
-    H5Dclose(dataset);
-    H5Sclose(sid1);
-    H5Fclose(fid1);
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: write_attr_in
- *
- * Purpose: write attributes in LOC_ID (dataset, group, named datatype)
- *
- * Return: void
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: May 28, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static void write_attr_in(hid_t loc_id,
-        const char* dset_name, /* for saving reference to dataset*/
-        hid_t fid)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-            char   a;
-            double b;
-    } s_t;
-
-    typedef enum
-    {
-        E_RED,
-        E_GREEN
-    } e_t;
-
-    hid_t   aid;
-    hid_t   sid;
-    hid_t   tid;
-    herr_t  status;
-    int     val, i, j, k, n;
-    float   f;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    char       buf1[2][3]= {"ab","de"};        /* string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1,2};                 /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
-    hobj_ref_t buf42[3][2];                                          /* reference */
-    hvl_t      buf52[3][2];                                          /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
-    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-            "rs","tu","vw","xz","AB","CD","EF","GH",
-            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[4][3][2];    /* reference */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-     * 1D attributes
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_attr(loc_id,1,dims,"string",tid,buf1);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,1,dims,"bitfield",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,1,dims,"opaque",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,1,dims,"compound",tid,buf3);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        write_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,1,dims,"enum",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc(1 * sizeof(int));
-    ((int *)buf5[0].p)[0] = 1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc(2 * sizeof(int));
-    ((int *)buf5[1].p)[0] = 2;
-    ((int *)buf5[1].p)[1] = 3;
-
-    sid = H5Screate_simple(1, dims, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf5);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
-    HDassert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 1, dims, "array", tid, buf6);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER and H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-    write_attr(loc_id, 1, dims, "integer", H5T_NATIVE_INT, buf7);
-    write_attr(loc_id, 1, dims, "float", H5T_NATIVE_FLOAT, buf8);
-
-
-    /*-------------------------------------------------------------------------
-     * 2D attributes
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_attr(loc_id,2,dims2,"string2D",tid,buf12);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,2,dims2,"bitfield2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,2,dims2,"opaque2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,2,dims2,"compound2D",tid,buf32);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        for(i = 0; i < 3; i++) {
-            for(j = 0; j < 2; j++) {
-                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,2,dims2,"enum2D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for(i = 0; i < 3; i++) {
-        for(j = 0; j < 2; j++) {
-            int l;
-
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = i + 1;
-            for(l = 0; l < i + 1; l++)
-                ((int *)buf52[i][j].p)[l] = n++;
-        }
-    }
-
-    sid = H5Screate_simple(2, dims2, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf52);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
-    HDassert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 2, dims2, "array2D", tid, buf62);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER and H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-    write_attr(loc_id, 2, dims2, "integer2D", H5T_NATIVE_INT, buf72);
-    write_attr(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
-
-
-    /*-------------------------------------------------------------------------
-     * 3D attributes
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_attr(loc_id,3,dims3,"string3D",tid,buf13);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-
-    n=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf23[i][j][k]=n++;
-            }
-        }
-    }
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_attr(loc_id,3,dims3,"bitfield3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_attr(loc_id,3,dims3,"opaque3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-
-    n=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf33[i][j][k].a=n++;
-                buf33[i][j][k].b=n++;
-            }
-        }
-    }
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_attr(loc_id,3,dims3,"compound3D",tid,buf33);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        for(i = 0; i < 4; i++) {
-            for(j = 0; j < 3; j++) {
-                for(k = 0; k < 2; k++)
-                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_attr(loc_id,3,dims3,"enum3D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-    n = 0;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                int l;
-
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = i + 1;
-                for(l = 0; l < i + 1; l++)
-                    ((int *)buf53[i][j][k].p)[l] = n++;
-            }
-        }
-    }
-
-    sid = H5Screate_simple(3, dims3, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(aid, tid, buf53);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
-    HDassert(status >= 0);
-    status = H5Aclose(aid);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    n = 1;
-    for(i = 0; i < 24; i++)
-        for(j = 0; j < (int)dimarray[0]; j++)
-            buf63[i][j] = n++;
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_attr(loc_id, 3, dims3, "array3D", tid, buf63);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER and H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-    n=1; f=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf73[i][j][k]=n++;
-                buf83[i][j][k]=f++;
-            }
-        }
-    }
-    write_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
-    write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: write_dset_in
- *
- * Purpose: write datasets in LOC_ID
- *
- * Return: void
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: May 28, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static void write_dset_in(hid_t loc_id,
-        const char* dset_name, /* for saving reference to dataset*/
-        hid_t fid)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-            char   a;
-            double b;
-    } s_t;
-
-    typedef enum
-    {
-        E_RED,
-        E_GREEN
-    } e_t;
-
-    hid_t   did;
-    hid_t   sid;
-    hid_t   tid;
-    hid_t   plist_id;
-    herr_t  status;
-    int     val, i, j, k, n;
-    float   f;
-    int     fillvalue=2;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    char       buf1[2][3]= {"ab","de"};        /* string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1,2};                 /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
-    hobj_ref_t buf42[3][2];                                          /* reference */
-    hvl_t      buf52[3][2];                                          /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
-    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-            "rs","tu","vw","xz","AB","CD","EF","GH",
-            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[4][3][2];    /* reference */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-     * 1D
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_dset(loc_id,1,dims,"string",tid,buf1);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,1,dims,"bitfield",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,1,dims,"opaque",tid,buf2);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,1,dims,"compound",tid,buf3);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-        write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,1,dims,"enum",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf5[0].p)[0]=1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc( 2 * sizeof(int));
-    ((int *)buf5[1].p)[0]=2;
-    ((int *)buf5[1].p)[1]=3;
-
-    sid = H5Screate_simple(1, dims, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
-    HDassert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 1, dims, "array", tid, buf6);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER and H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-    write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
-    write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
-
-
-    /*-------------------------------------------------------------------------
-     * 2D
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_dset(loc_id,2,dims2,"string2D",tid,buf12);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        for(i = 0; i < 3; i++) {
-            for(j = 0; j < 2; j++) {
-                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,2,dims2,"enum2D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for(i = 0; i < 3; i++)
-        for(j = 0; j < 2; j++) {
-            int l;
-
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = i + 1;
-            for(l = 0; l < i + 1; l++)
-                ((int *)buf52[i][j].p)[l] = n++;
-        }
-
-    sid = H5Screate_simple(2, dims2, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
-    HDassert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 2, dims2, "array2D", tid, buf62);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER, write a fill value
-     *-------------------------------------------------------------------------
-     */
-    plist_id = H5Pcreate(H5P_DATASET_CREATE);
-    status = H5Pset_fill_value(plist_id, H5T_NATIVE_INT, &fillvalue);
-    sid = H5Screate_simple(2, dims2, NULL);
-    did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, plist_id, H5P_DEFAULT);
-    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72);
-    status = H5Pclose(plist_id);
-    status = H5Dclose(did);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-
-    write_dset(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
-
-
-    /*-------------------------------------------------------------------------
-     * 3D
-     *-------------------------------------------------------------------------
-     */
-
-    /*-------------------------------------------------------------------------
-     * H5T_STRING
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_C_S1);
-    status  = H5Tset_size(tid, 2);
-    write_dset(loc_id,3,dims3,"string3D",tid,buf13);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_BITFIELD
-     *-------------------------------------------------------------------------
-     */
-
-    n=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf23[i][j][k]=n++;
-            }
-        }
-    }
-    tid = H5Tcopy(H5T_STD_B8LE);
-    write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_OPAQUE
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_OPAQUE, 1);
-    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
-    write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_COMPOUND
-     *-------------------------------------------------------------------------
-     */
-
-    n=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf33[i][j][k].a=n++;
-                buf33[i][j][k].b=n++;
-            }
-        }
-    }
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
-    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
-    write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_REFERENCE
-     *-------------------------------------------------------------------------
-     */
-    /* Create references to dataset */
-    if(dset_name)
-    {
-        for(i = 0; i < 4; i++) {
-            for(j = 0; j < 3; j++) {
-                for(k = 0; k < 2; k++)
-                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
-            }
-        }
-        write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
-    }
-
-    /*-------------------------------------------------------------------------
-     * H5T_ENUM
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
-    H5Tenum_insert(tid, "RED",   (val = 0, &val));
-    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
-    write_dset(loc_id,3,dims3,"enum3D",tid,0);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_VLEN
-     *-------------------------------------------------------------------------
-     */
-
-    /* Allocate and initialize VL dataset to write */
-    n = 0;
-    for(i = 0; i < 4; i++)
-        for(j = 0; j < 3; j++)
-            for(k = 0; k < 2; k++) {
-                int l;
-
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = i + 1;
-                for(l = 0; l < i + 1; l++)
-                    ((int *)buf53[i][j][k].p)[l] = n++;
-            }
-
-    sid = H5Screate_simple(3, dims3, NULL);
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53);
-    HDassert(status >= 0);
-    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
-    HDassert(status >= 0);
-    status = H5Dclose(did);
-    status = H5Tclose(tid);
-    status = H5Sclose(sid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_ARRAY
-     *-------------------------------------------------------------------------
-     */
-    n=1;
-    for(i = 0; i < 24; i++) {
-        for(j = 0; j < (int)dimarray[0]; j++) {
-            buf63[i][j]=n++;
-        }
-    }
-
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(loc_id, 3, dims3, "array3D", tid, buf63);
-    status = H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * H5T_INTEGER and H5T_FLOAT
-     *-------------------------------------------------------------------------
-     */
-    n=1; f=1;
-    for(i = 0; i < 4; i++) {
-        for(j = 0; j < 3; j++) {
-            for(k = 0; k < 2; k++) {
-                buf73[i][j][k]=n++;
-                buf83[i][j][k]=f++;
-            }
-        }
-    }
-    write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
-    write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
-}
-
-
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_attr_all
- *
- * Purpose: generate all datatype attributes
- *
- * Return: void
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: May 19, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static void gent_attr_all(void)
-{
-    hid_t   fid;
-    hid_t   did;
-    hid_t   group_id;
-    hid_t   group2_id;
-    hid_t   root_id;
-    hid_t   sid;
-    hsize_t dims[1] = {2};
-    herr_t  status;
-
-    /* Create a file and a dataset */
-    fid = H5Fcreate(FILE40, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create a 1D dataset */
-    sid = H5Screate_simple(1,dims,NULL);
-    did = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Sclose(sid);
-    HDassert(status >= 0);
-
-    /* Create groups */
-    group_id  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    group2_id = H5Gcreate2(fid, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    root_id   = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-     * write a series of attributes on the dataset, group
-     *-------------------------------------------------------------------------
-     */
-
-    write_attr_in(did,"dset",fid);
-    write_attr_in(group_id,NULL,(hid_t)0);
-    write_attr_in(root_id,NULL,(hid_t)0);
-
-    /*-------------------------------------------------------------------------
-     * write a series of datasets on group 2
-     *-------------------------------------------------------------------------
-     */
-
-    write_dset_in(group2_id,"/dset",fid);
-
-    /* Close */
-    status = H5Dclose(did);
-    HDassert(status >= 0);
-    status = H5Gclose(group_id);
-    HDassert(status >= 0);
-    status = H5Gclose(group2_id);
-    HDassert(status >= 0);
-    status = H5Gclose(root_id);
-    HDassert(status >= 0);
-
-    /* Close file */
-    status = H5Fclose(fid);
-    HDassert(status >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: write_attr
- *
- * Purpose: utility function to write an attribute
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: May 19, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static
-int write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
-        hid_t tid, void *buf)
-{
-    hid_t   aid;
-    hid_t   sid;
-    herr_t  status;
-
-    /* Create a buf space  */
-    sid = H5Screate_simple(rank, dims, NULL);
-
-    /* Create the attribute */
-    aid = H5Acreate2(loc_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write the buf */
-    if(buf)
-        status = H5Awrite(aid, tid, buf);
-
-    /* Close */
-    status = H5Aclose(aid);
-    status = H5Sclose(sid);
-
-    return status;
-}
-
-/*-------------------------------------------------------------------------
- * Function: write_dset
- *
- * Purpose: utility function to create and write a dataset in LOC_ID
- *
- * Return:
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: May 27, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static
-int write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
-        hid_t tid, void *buf )
-{
-    hid_t   did;
-    hid_t   sid;
-    herr_t  status;
-
-    /* Create a buf space  */
-    sid = H5Screate_simple(rank, dims, NULL);
-
-    /* Create a dataset */
-    did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write the buf */
-    if(buf)
-        status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-    /* Close */
-    status = H5Dclose(did);
-    status = H5Sclose(sid);
-
-    return status;
-}
-
-
-static void gent_compound_complex(void)
-{
-    /* Structure and array for compound types                             */
-    typedef struct Array1Struct {
-            int                a;
-            const char         *b[F41_DIMb];
-            char               c[F41_ARRAY_DIMc];
-            short              d[F41_ARRAY_DIMd1][F41_ARRAY_DIMd2];
-            float              e;
-            double             f[F41_ARRAY_DIMf];
-            char               g;
-    } Array1Struct;
-    Array1Struct       Array1[F41_LENGTH];
-
-    /* Define the value of the string array                           */
-    const char *quote [F41_DIMb] = {
-            "A fight is a contract that takes two people to honor.",
-            "A combative stance means that you've accepted the contract.",
-            "In which case, you deserve what you get.",
-            "  --  Professor Cheng Man-ch'ing"
-    };
-
-    /* Define the value of the character array                        */
-    char chararray [F41_ARRAY_DIMc] = {'H', 'e', 'l', 'l', 'o', '!'};
-
-
-    hid_t      Array1Structid;            /* File datatype identifier */
-    hid_t      array_tid;                 /* Array datatype handle    */
-    hid_t      array1_tid;                /* Array datatype handle    */
-    hid_t      array2_tid;                /* Array datatype handle    */
-    hid_t      array4_tid;                /* Array datatype handle    */
-    hid_t      datafile, dataset;         /* Datafile/dataset handles */
-    hid_t      dataspace;                 /* Dataspace handle         */
-    herr_t     status;                    /* Error checking variable */
-    hsize_t    dim[] = {F41_LENGTH};          /* Dataspace dimensions     */
-    hsize_t    array_dimb[] = {F41_DIMb};     /* Array dimensions         */
-    hsize_t    array_dimd[]={F41_ARRAY_DIMd1,F41_ARRAY_DIMd2}; /* Array dimensions         */
-    hsize_t    array_dimf[]={F41_ARRAY_DIMf}; /* Array dimensions         */
-    hid_t      str_array_id;
-
-    int        m, n, o;                   /* Array init loop vars     */
-
-    /* Initialize the data in the arrays/datastructure                */
-    for(m = 0; m< F41_LENGTH; m++) {
-        Array1[m].a = m;
-
-        for(n = 0; n < F41_DIMb; n++) {
-            Array1[m].b[n] = quote[n];
-        }
-
-        for(n = 0; n < F41_ARRAY_DIMc; n++) {
-            Array1[m].c[n] = chararray[n];
-        }
-
-        for(n = 0; n < F41_ARRAY_DIMd1; n++) {
-            for(o = 0; o < F41_ARRAY_DIMd2; o++){
-                Array1[m].d[n][o] = m + n + o;
-            }
-        }
-
-        Array1[m].e = (float)( m * 0.96F );
-
-        for(n = 0; n < F41_ARRAY_DIMf; n++) {
-            Array1[m].f[n] = ( m * 1024.9637F );
-        }
-
-        Array1[m].g = 'm';
-    }
-
-    /* Create the dataspace                                           */
-    dataspace = H5Screate_simple(F41_RANK, dim, NULL);
-    HDassert(dataspace >= 0);
-
-    /* Create the file                                                */
-    datafile = H5Fcreate(FILE41, H5F_ACC_TRUNC, H5P_DEFAULT,
-            H5P_DEFAULT);
-    HDassert(datafile >= 0);
-
-    /* Copy the array data type for the string array                  */
-    array_tid = H5Tcopy (H5T_C_S1);
-    HDassert(array_tid >= 0);
-
-    /* Set the string array size to Variable                          */
-    status = H5Tset_size (array_tid,H5T_VARIABLE);
-    HDassert(status >= 0);
-
-    /* Create the array data type for the string array                */
-    str_array_id = H5Tarray_create2(array_tid, F41_ARRAY_RANK, array_dimb);
-    HDassert(str_array_id >= 0);
-
-    /* Copy the array data type for the character array               */
-    array1_tid = H5Tcopy (H5T_C_S1);
-    HDassert(array1_tid >= 0);
-
-    /* Set the character array size                                   */
-    status = H5Tset_size (array1_tid, F41_ARRAY_DIMc);
-    HDassert(status >= 0);
-
-    /* Create the array data type for the character array             */
-    array2_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F41_ARRAY_RANKd, array_dimd);
-    HDassert(array2_tid >= 0);
-
-    /* Create the array data type for the character array             */
-    array4_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F41_ARRAY_RANK, array_dimf);
-    HDassert(array4_tid >= 0);
-
-    /* Create the memory data type                                    */
-    Array1Structid = H5Tcreate (H5T_COMPOUND, sizeof(Array1Struct));
-    HDassert(Array1Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Array1Structid, "a_name",
-            HOFFSET(Array1Struct, a), H5T_NATIVE_INT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "b_name",
-            HOFFSET(Array1Struct, b), str_array_id);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "c_name",
-            HOFFSET(Array1Struct, c), array1_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "d_name",
-            HOFFSET(Array1Struct, d), array2_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "e_name",
-            HOFFSET(Array1Struct, e), H5T_NATIVE_FLOAT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "f_name",
-            HOFFSET(Array1Struct, f), array4_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, "g_name",
-            HOFFSET(Array1Struct, g), H5T_NATIVE_CHAR);
-    HDassert(status >= 0);
-
-    /* Create the dataset                                             */
-    dataset = H5Dcreate2(datafile, F41_DATASETNAME, Array1Structid,
-            dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the dataset                                      */
-    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL,
-            H5P_DEFAULT, Array1);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Array1Structid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array1_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array2_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array4_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(str_array_id);
-    HDassert(status >= 0);
-
-    status = H5Sclose(dataspace);
-    HDassert(status >= 0);
-
-    status = H5Dclose(dataset);
-    HDassert(status >= 0);
-
-    status = H5Fclose(datafile);
-    HDassert(status >= 0);
-}
-
-
-static void gent_named_dtype_attr(void)
-{
-    hid_t fid;
-    hid_t did;
-    hid_t sid;
-    hid_t tid;
-    hid_t aid;
-    hid_t gid;
-    int data=8;
-    herr_t ret;
-
-    /* Create a file */
-    fid=H5Fcreate(FILE42, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>0);
-
-    /*-------------------------------------------------------------------------
-     * datatype
-     *-------------------------------------------------------------------------
-     */
-
-    /* Create a datatype to commit and use */
-    tid=H5Tcopy(H5T_NATIVE_INT);
-    HDassert(tid>0);
-
-    /* Commit datatype to file */
-    ret = H5Tcommit2(fid, F42_TYPENAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /* Create a hard link to the datatype */
-    ret = H5Lcreate_hard(fid, F42_TYPENAME, fid, F42_LINKNAME, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /* Create a scalar dataspace used for all objects */
-    sid = H5Screate(H5S_SCALAR);
-    HDassert(sid > 0);
-
-    /* Create attribute on commited datatype */
-    aid = H5Acreate2(tid, F42_ATTRNAME, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(aid > 0);
-
-    /* Write data into the attribute */
-    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * dataset
-     *-------------------------------------------------------------------------
-     */
-
-    /* Create dataset */
-    did = H5Dcreate2(fid, F42_DSETNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(did > 0);
-
-    /* Create attribute on dataset */
-    aid = H5Acreate2(did, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(aid > 0);
-
-    /* Write data into the attribute */
-    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * group
-     *-------------------------------------------------------------------------
-     */
-
-    /* Create a group */
-    gid = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(gid > 0);
-
-    /* Create attribute on group */
-    aid = H5Acreate2(gid, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(aid > 0);
-
-    /* Write data into the attribute */
-    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-
-    /* Close attribute */
-    ret = H5Aclose(aid);
-    HDassert(ret >= 0);
-
-    /* Close dataset */
-    ret = H5Dclose(did);
-    HDassert(ret >= 0);
-
-    /* Close dataspace */
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    /* Close datatype */
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-    /* Close file */
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_null_space
- *
- * Purpose: generates dataset and attribute of null dataspace
- *-------------------------------------------------------------------------
- */
-static void gent_null_space(void)
-{
-    hid_t fid, root, dataset, space, attr;
-    int dset_buf = 10;
-    int point = 4;
-
-    fid = H5Fcreate(FILE45, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* null space */
-    space = H5Screate(H5S_NULL);
-
-    /* dataset */
-    dataset = H5Dcreate2(fid, "dset", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    /* nothing should be written */
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
-
-    /* attribute */
-    attr = H5Acreate2(root, "attr", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
-
-    H5Dclose(dataset);
-    H5Aclose(attr);
-    H5Gclose(root);
-    H5Sclose(space);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_zero_dim_size
- *
- * Purpose: generates dataset and attribute with dataspace of 0 dimension size
- *-------------------------------------------------------------------------
- */
-static void gent_zero_dim_size(void)
-{
-    hid_t fid, root, dataset, space, attr;
-    hsize_t  dims1[] = {SPACE3_DIM1, SPACE3_DIM2};
-    int dset_buf = 10;
-    int point = 4;
-
-    fid = H5Fcreate(FILE67, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* dataspace of 0 dimension size */
-    space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
-
-    /* dataset */
-    dataset = H5Dcreate2(fid, "dset of 0 dimension size", H5T_STD_I32BE, space, H5P_DEFAULT,
-            H5P_DEFAULT, H5P_DEFAULT);
-    /* nothing should be written */
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
-
-    /* attribute */
-    attr = H5Acreate2(root, "attr of 0 dimension size", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
-
-    H5Dclose(dataset);
-    H5Aclose(attr);
-    H5Gclose(root);
-    H5Sclose(space);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: make_dset
- *
- * Purpose: utility function to create and write a dataset in LOC_ID
- *
- *-------------------------------------------------------------------------
- */
-static
-int make_dset(hid_t loc_id,
-        const char *name,
-        hid_t sid,
-        hid_t tid,
-        hid_t dcpl,
-        void *buf)
-{
-    hid_t   dsid;
-
-    /* create the dataset */
-    if((dsid = H5Dcreate2(loc_id, name, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        return -1;
-
-    /* write */
-    if(H5Dwrite(dsid, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto out;
-
-    /* close */
-    if(H5Dclose(dsid) < 0)
-        return -1;
-
-    return 0;
-
-    out:
-    H5E_BEGIN_TRY {
-        H5Dclose(dsid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: make_external
- *
- * Purpose: make a dataset with external storage
- *
- *-------------------------------------------------------------------------
- */
-static void
-make_external(hid_t fid)
-{
-    hid_t   dcpl;         /*dataset creation property list */
-    hid_t   sid;          /*dataspace ID */
-    hid_t   dsid;         /*dataset ID   */
-    hsize_t cur_size[1];  /*data space current size */
-    hsize_t max_size[1];  /*data space maximum size */
-    hsize_t size;         /*bytes reserved for data in the external file*/
-    int     ret;
-
-    cur_size[0] = max_size[0] = 100;
-    size = (max_size[0]*sizeof(int)/2);
-
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    ret = H5Pset_external(dcpl, "ext1.bin", (off_t)0, size);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_external(dcpl, "ext2.bin", (off_t)0, size);
-    HDassert(ret >= 0);
-
-    sid = H5Screate_simple(1, cur_size, max_size);
-    HDassert(ret >= 0);
-
-    dsid = H5Dcreate2(fid, "external", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    H5Dclose(dsid);
-    HDassert(ret >= 0);
-
-    H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    H5Pclose(dcpl);
-    HDassert(ret >= 0);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_filters
- *
- * Purpose: make several datasets with filters, external dataset
- *
- *-------------------------------------------------------------------------
- */
-static void gent_filters(void)
-{
-    hid_t    fid;  /* file id */
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hid_t    tid;  /* datatype ID */
-#ifdef H5_HAVE_FILTER_SZIP
-    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
-    unsigned szip_pixels_per_block=4;
-#endif /* H5_HAVE_FILTER_SZIP */
-    hsize_t  dims1[RANK]      = {DIM1,DIM2};
-    hsize_t  chunk_dims[RANK] = {CDIM1,CDIM2};
-    int      buf1[DIM1][DIM2];
-    int      i, j, n, ret;
-
-    for(i=n=0; i<DIM1; i++){
-        for(j=0; j<DIM2; j++){
-            buf1[i][j]=n++;
-        }
-    }
-
-    /* create a file */
-    fid  = H5Fcreate(FILE44, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-    /* create a space */
-    sid = H5Screate_simple(SPACE2_RANK, dims1, NULL);
-
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-
-    /*-------------------------------------------------------------------------
-     * create a compact and contiguous storage layout dataset
-     * add a comment to the datasets
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_layout(dcpl, H5D_COMPACT);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"compact",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    ret = H5Oset_comment_by_name(fid, "compact", "This is a dataset with compact storage", H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_layout(dcpl, H5D_CONTIGUOUS);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"contiguous",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    ret = H5Oset_comment_by_name(fid, "contiguous", "This is a dataset with contiguous storage", H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_layout(dcpl, H5D_CHUNKED);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"chunked",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    ret = H5Oset_comment_by_name(fid, "chunked", "This is a dataset with chunked storage", H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * make several dataset with filters
-     *-------------------------------------------------------------------------
-     */
-
-    /* set up chunk */
-    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * SZIP
-     *-------------------------------------------------------------------------
-     */
-#ifdef H5_HAVE_FILTER_SZIP
-    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
-        /* remove the filters from the dcpl */
-        ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-        HDassert(ret >= 0);
-
-        /* set szip data */
-        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
-        HDassert(ret >= 0);
-
-        ret=make_dset(fid,"szip",sid,H5T_NATIVE_INT,dcpl,buf1);
-        HDassert(ret >= 0);
-    }
-#endif /* H5_HAVE_FILTER_SZIP */
-
-    /*-------------------------------------------------------------------------
-     * GZIP
-     *-------------------------------------------------------------------------
-     */
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set deflate data */
-    ret = H5Pset_deflate(dcpl, 9);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"deflate",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-#endif
-
-
-    /*-------------------------------------------------------------------------
-     * shuffle
-     *-------------------------------------------------------------------------
-     */
-
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set the shuffle filter */
-    ret = H5Pset_shuffle(dcpl);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"shuffle",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-
-    /*-------------------------------------------------------------------------
-     * checksum
-     *-------------------------------------------------------------------------
-     */
-
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set the checksum filter */
-    ret = H5Pset_fletcher32(dcpl);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"fletcher32",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * nbit
-     *-------------------------------------------------------------------------
-     */
-
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set the checksum filter */
-    ret = H5Pset_nbit(dcpl);
-    HDassert(ret >= 0);
-
-    tid=H5Tcopy(H5T_NATIVE_INT);
-    H5Tset_precision(tid,H5Tget_size(tid)-1);
-    ret=make_dset(fid,"nbit",sid,tid,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * scaleoffset
-     *-------------------------------------------------------------------------
-     */
-
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set the scaleoffset filter */
-    ret = H5Pset_scaleoffset(dcpl,H5Z_SO_INT,(int)H5Tget_size(H5T_NATIVE_INT));
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"scaleoffset",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * all filters
-     *-------------------------------------------------------------------------
-     */
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /* set the shuffle filter */
-    ret = H5Pset_shuffle(dcpl);
-    HDassert(ret >= 0);
-
-#ifdef H5_HAVE_FILTER_SZIP
-    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
-        szip_options_mask=H5_SZIP_CHIP_OPTION_MASK | H5_SZIP_EC_OPTION_MASK;
-        /* set szip data */
-        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
-        HDassert(ret >= 0);
-    }
-#endif /* H5_HAVE_FILTER_SZIP */
-
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    /* set deflate data */
-    ret = H5Pset_deflate(dcpl, 5);
-    HDassert(ret >= 0);
-#endif
-
-    /* set the checksum filter */
-    ret = H5Pset_fletcher32(dcpl);
-    HDassert(ret >= 0);
-
-    /* set the nbit filter */
-    ret = H5Pset_nbit(dcpl);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"all",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-
-    /*-------------------------------------------------------------------------
-     * user defined filter
-     *-------------------------------------------------------------------------
-     */
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    ret = H5Zregister (H5Z_MYFILTER);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_filter (dcpl, MYFILTER_ID, 0, 0, NULL);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"myfilter",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /* remove the filters from the dcpl */
-    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * make an external dataset
-     *-------------------------------------------------------------------------
-     */
-    make_external(fid);
-
-    /*-------------------------------------------------------------------------
-     * H5D_ALLOC_TIME_EARLY
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY);
-    HDassert(ret >= 0);
-    ret=make_dset(fid,"alloc_time_early",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * H5D_ALLOC_TIME_INCR
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR);
-    HDassert(ret >= 0);
-    ret=make_dset(fid,"alloc_time_incr",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * H5D_ALLOC_TIME_LATE
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE);
-    HDassert(ret >= 0);
-    ret=make_dset(fid,"alloc_time_late",sid,H5T_NATIVE_INT,dcpl,buf1);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * commit a H5G_TYPE type with a comment
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_STD_B8LE);
-    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    ret = H5Oset_comment_by_name(fid, "mytype", "This is a commited datatype", H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    ret = H5Pclose(dcpl);
-    HDassert(ret >= 0);
-
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: myfilter
- *
- * Purpose: filter operation callback function; the filter does nothing
- *
- *-------------------------------------------------------------------------
- */
-static size_t
-myfilter(unsigned int H5_ATTR_UNUSED 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)
-{
-    return nbytes;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: set_local_myfilter
- *
- * Purpose: filter operation "set local" callback
- *
- *-------------------------------------------------------------------------
- */
-
-static herr_t
-set_local_myfilter(hid_t dcpl_id, hid_t H5_ATTR_UNUSED tid, hid_t H5_ATTR_UNUSED sid)
-{
-    unsigned flags;                        /* Filter flags */
-    size_t   cd_nelmts = 0;                /* Number of filter parameters */
-    unsigned cd_values[2] = {5, 6};        /* Filter parameters */
-
-    /* Get the filter's current parameters */
-    if(H5Pget_filter_by_id2(dcpl_id, MYFILTER_ID, &flags, &cd_nelmts, cd_values, 0, NULL, NULL) < 0)
-        return(FAIL);
-
-    cd_nelmts = 2;
-
-    /* Modify the filter's parameters for this dataset */
-    if(H5Pmodify_filter(dcpl_id, MYFILTER_ID, flags, cd_nelmts, cd_values) < 0)
-        return(FAIL);
-
-    return(SUCCEED);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_fcontents
- *
- * Purpose: generate several files to list its contents
- *
- *-------------------------------------------------------------------------
- */
-static void gent_fcontents(void)
-{
-    hid_t    fid;   /* file id */
-    hid_t    gid1;  /* group ID */
-    hid_t    tid;   /* datatype ID */
-    hsize_t  dims[1]={4};
-    int      buf[4]={1,2,3,4};
-    int      ret;
-
-
-    /* create a file */
-    fid  = H5Fcreate(FILE46, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-
-    write_dset(fid,1,dims,"dset",H5T_NATIVE_INT,buf);
-
-
-    /*-------------------------------------------------------------------------
-     * links
-     *-------------------------------------------------------------------------
-     */
-
-
-    /* hard link to "dset" */
-    gid1 = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(gid1);
-
-
-    /* hard link to "dset" */
-    gid1 = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(gid1);
-
-
-    /* hard link to "g2" */
-    gid1 = H5Gopen2(fid, "/g1", H5P_DEFAULT);
-    H5Lcreate_hard(gid1, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(gid1);
-
-
-    /* hard link to "dset" */
-    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-
-    /* hard link to "dset" */
-    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset4", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-
-    /* soft link to itself */
-    ret = H5Lcreate_soft("mylink", fid, "mylink", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-
-    /* soft link to "dset" */
-    ret = H5Lcreate_soft("/dset", fid, "softlink", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /* dangling external link */
-    ret = H5Lcreate_external("fname", "oname", fid, "extlink", H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /* dangling udlink */
-    ret = H5Lcreate_ud(fid, "udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * datatypes
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tcopy(H5T_NATIVE_INT);
-    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-
-    /* no name datatype */
-    tid = H5Tcopy(H5T_NATIVE_INT);
-    ret = H5Tcommit2(fid, "mytype2", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(ret >= 0);
-    write_dset(fid, 1, dims, "dsetmytype2", tid, buf);
-    ret = H5Ldelete(fid, "mytype2", H5P_DEFAULT);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-
-
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-
-
-    /* create a file for the bootblock test */
-    fid  = H5Fcreate(FILE47, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_fvalues
- *
- * Purpose: generate a file for the fill values test
- *
- *-------------------------------------------------------------------------
- */
-static void gent_fvalues(void)
-{
-    /* compound datatype */
-    typedef struct c_t
-    {
-            char   a;
-            double b;
-    } c_t;
-
-
-    hid_t      fid;  /* file id */
-    hid_t      dcpl; /* dataset creation property list */
-    hid_t      sid;  /* dataspace ID */
-    hid_t      tid;  /* datatype ID */
-    hid_t      did;  /* datasetID */
-    hsize_t    dims[1]={2};
-    int        buf[2]={1,2};                   /* integer */
-    int        fillval1=-99;                   /* integer fill value */
-    c_t        buf2[2]={{1,2},{3,4}};          /* compound */
-    c_t        fillval2[1]={{1,2}};            /* compound fill value */
-    hvl_t      buf3[2];                        /* vlen */
-    hvl_t      fillval3;                       /* vlen fill value */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf4[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        ret;
-
-    /* create a file */
-    fid  = H5Fcreate(FILE48, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-    /* create a space */
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /* create a dataset creation property list */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-
-    /*-------------------------------------------------------------------------
-     * make datasets with fill value combinations
-     * H5D_FILL_TIME_IFSET
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_IFSET);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"fill_time_ifset",sid,H5T_NATIVE_INT,dcpl,buf);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * H5D_FILL_TIME_NEVER
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"fill_time_never",sid,H5T_NATIVE_INT,dcpl,buf);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * H5D_FILL_TIME_ALLOC
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC);
-    HDassert(ret >= 0);
-
-    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
-    HDassert(ret >= 0);
-
-    ret=make_dset(fid,"fill_time_alloc",sid,H5T_NATIVE_INT,dcpl,buf);
-    HDassert(ret >= 0);
-
-    ret = H5Pclose(dcpl);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * dataset with no fill value
-     *-------------------------------------------------------------------------
-     */
-    write_dset(fid,1,dims,"no_fill",H5T_NATIVE_INT,buf);
-
-    /*-------------------------------------------------------------------------
-     * dataset with a H5T_COMPOUND fill value
-     *-------------------------------------------------------------------------
-     */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
-    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_CHAR);
-    H5Tinsert(tid, "b", HOFFSET(c_t, b), H5T_NATIVE_DOUBLE);
-    ret = H5Pset_fill_value(dcpl, tid, &fillval2);
-    HDassert(ret >= 0);
-    ret=make_dset(fid,"fill_compound",sid,tid,dcpl,buf2);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-    ret = H5Pclose(dcpl);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * dataset with a H5T_VLEN fill value
-     *-------------------------------------------------------------------------
-     */
-    buf3[0].len = 1;
-    buf3[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf3[0].p)[0]=1;
-    buf3[1].len = 2;
-    buf3[1].p = HDmalloc(2 * sizeof(int));
-    ((int *)buf3[1].p)[0] = 2;
-    ((int *)buf3[1].p)[1] = 3;
-
-    tid = H5Tvlen_create(H5T_NATIVE_INT);
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-
-    fillval3.p=NULL; fillval3.len=0;
-    ret = H5Pset_fill_value(dcpl, tid, &fillval3);
-    HDassert(ret >= 0);
-
-    did = H5Dcreate2(fid, "fill_vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
-    HDassert(ret >= 0);
-    ret = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf3);
-    HDassert(ret >= 0);
-    ret = H5Dclose(did);
-    ret = H5Tclose(tid);
-    ret = H5Pclose(dcpl);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * dataset with a H5T_ARRAY fill value
-     *-------------------------------------------------------------------------
-     */
-    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
-    write_dset(fid, 1, dims, "fill_array", tid, buf4);
-    ret = H5Tclose(tid);
-
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_string
- *
- * Purpose: make several datasets for the string with escape/not escape test
- *
- *-------------------------------------------------------------------------
- */
-static void gent_string(void)
-{
-    /* compound datatype */
-    typedef struct c_t
-    {
-            int    a;
-            char   str[255];
-    } c_t;
-
-    hid_t    fid;      /* file id */
-    hid_t    sid;      /* dataspace ID */
-    hid_t    tid;      /* datatype ID */
-    hid_t    str_tid;  /* datatype ID */
-    hid_t    did;      /* dataset ID */
-    char     buf1[]={"quote \"  backspace\b form feed\f new line\n tab\t new line\n carriage return\r"};
-    const char *buf2[SPACE1_DIM1]= {
-            "Four score and seven\n years ago our forefathers brought forth on this continent a new nation,",
-            "conceived in liberty\n and dedicated to the proposition that all men are created equal.",
-            "Now we are engaged\n in a great civil war,",
-            "testing whether that\n nation or any nation so conceived and so dedicated can long endure."
-    };
-    c_t      buf3 = {24, "Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
-    char     buf4[] = {"Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
-    hsize_t  dims1[]  = {1};
-    hsize_t        dims2[]  = {SPACE1_DIM1};
-    hsize_t        dims4[1];
-    int      ret;
-
-    dims4[0] = sizeof(buf4);
-
-    /* create a file */
-    fid  = H5Fcreate(FILE49, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-    /*-------------------------------------------------------------------------
-     * str1
-     *-------------------------------------------------------------------------
-     */
-
-    tid=H5Tcopy(H5T_C_S1);
-    ret = H5Tset_size(tid, sizeof(buf1));
-    HDassert(ret >= 0);
-    write_dset(fid,1,dims1,"str1",tid,buf1);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * str2
-     *-------------------------------------------------------------------------
-     */
-    sid = H5Screate_simple(SPACE1_RANK, dims2, NULL);
-    tid = H5Tcopy(H5T_C_S1);
-    ret = H5Tset_size(tid, H5T_VARIABLE);
-    HDassert(ret >= 0);
-    did = H5Dcreate2(fid, "str2", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-    ret = H5Dclose(did);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * str3
-     *-------------------------------------------------------------------------
-     */
-    sid = H5Screate_simple(SPACE1_RANK, dims1, NULL);
-    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
-    str_tid = H5Tcopy( H5T_C_S1 );
-    H5Tset_size( str_tid, 255 );
-    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_INT);
-    H5Tinsert(tid, "str", HOFFSET(c_t, str), str_tid );
-    ret=make_dset(fid,"str3",sid,tid,H5P_DEFAULT,&buf3);
-    HDassert(ret >= 0);
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-    ret = H5Tclose(str_tid);
-    HDassert(ret >= 0);
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * str4
-     *-------------------------------------------------------------------------
-     */
-    sid = H5Screate_simple(SPACE1_RANK, dims4, NULL);
-    ret=make_dset(fid,"str4",sid,H5T_NATIVE_CHAR,H5P_DEFAULT,buf4);
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_aindices
- *
- * Purpose: make several datasets for the array indices and subsetting tests
- *
- *-------------------------------------------------------------------------
- */
-static void gent_aindices(void)
-{
-    hid_t    fid;     /* file id */
-    hid_t    gid[6];  /* group ids */
-    hsize_t  dims1[1]  = {100};
-    hsize_t  dims2[2]  = {10,10};
-    hsize_t  dims3[3]  = {2,10,10};
-    hsize_t  dims4[4]  = {2,2,10,10};
-    int      buf1[100];
-    int      buf2[10][10];
-    int      buf3[2][10][10];
-    int      buf4[2][2][10][10];
-    int      i, j, k, l, n, ret;
-
-    for(i = n = 0; i < 100; i++)
-        buf1[i] = n++;
-
-    for(i = n = 0; i < 10; i++)
-        for(j = 0; j < 10; j++)
-            buf2[i][j] = n++;
-    for(i = n = 0; i < 2; i++)
-        for(j = 0; j < 10; j++)
-            for(k = 0; k < 10; k++)
-                buf3[i][j][k] = n++;
-    for(i = n = 0; i < 2; i++)
-        for(j = 0; j < 2; j++)
-            for(k = 0; k < 10; k++)
-                for(l = 0; l < 10; l++)
-                    buf4[i][j][k][l] = n++;
-
-    /* create a file */
-    fid  = H5Fcreate(FILE50, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-    /*-------------------------------------------------------------------------
-     * root datasets
-     *-------------------------------------------------------------------------
-     */
-    write_dset(fid,1,dims1,"1d",H5T_NATIVE_INT,buf1);
-    write_dset(fid,2,dims2,"2d",H5T_NATIVE_INT,buf2);
-    write_dset(fid,3,dims3,"3d",H5T_NATIVE_INT,buf3);
-    write_dset(fid,4,dims4,"4d",H5T_NATIVE_INT,buf4);
-
-    /*-------------------------------------------------------------------------
-     * test with group indentation
-     *-------------------------------------------------------------------------
-     */
-    gid[0] = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid[1] = H5Gcreate2(fid, "g1/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid[2] = H5Gcreate2(fid, "g1/g2/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid[3] = H5Gcreate2(fid, "g1/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid[4] = H5Gcreate2(fid, "g1/g2/g3/g4/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    gid[5] = H5Gcreate2(fid, "g1/g2/g3/g4/g5/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    write_dset(gid[5],1,dims1,"1d",H5T_NATIVE_INT,buf1);
-    write_dset(gid[5],2,dims2,"2d",H5T_NATIVE_INT,buf2);
-    write_dset(gid[5],3,dims3,"3d",H5T_NATIVE_INT,buf3);
-    write_dset(gid[5],4,dims4,"4d",H5T_NATIVE_INT,buf4);
-    for(i = 0; i < 6; i++)
-        H5Gclose(gid[i]);
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_longlinks
- *
- * Purpose: make file with very long names for objects
- *
- *-------------------------------------------------------------------------
- */
-static void gent_longlinks(void)
-{
-    hid_t       fid = (-1);     /* File ID */
-    hid_t       gid = (-1);     /* Group ID */
-    hid_t       gid2 = (-1);    /* Datatype ID */
-    char               *objname = NULL; /* Name of object [Long] */
-    size_t              u;              /* Local index variable */
-
-    /* Create files */
-    fid = H5Fcreate(FILE51, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* Create group with short name in file (used as target for hard links) */
-    gid = H5Gcreate2(fid, "grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(gid >= 0);
-
-    /* Construct very long file name */
-    objname = (char*) HDmalloc((size_t)(F51_MAX_NAME_LEN + 1));
-    HDassert(objname);
-    for(u = 0; u < F51_MAX_NAME_LEN; u++)
-        objname[u] = 'a';
-    objname[F51_MAX_NAME_LEN] = '\0';
-
-    /* Create hard link to existing object */
-    HDassert(H5Lcreate_hard(fid, "grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
-
-    /* Create soft link to existing object */
-    objname[0] = 'b';
-    HDassert(H5Lcreate_soft("grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
-
-    /* Create group with long name in existing group */
-    gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(gid2 >= 0);
-
-    /* Close objects */
-    HDassert(H5Gclose(gid2) >= 0);
-    HDassert(H5Gclose(gid) >= 0);
-    HDassert(H5Fclose(fid) >= 0);
-
-    /* Release memory */
-    HDfree(objname);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_ldouble
- *
- * Purpose: make file with a long double dataset
- *
- *-------------------------------------------------------------------------
- */
-static int gent_ldouble(void)
-{
-    hid_t       fid;
-    hid_t       did;
-    hid_t       tid;
-    hid_t       sid;
-    hsize_t     dims[1] = {3};
-    long double buf[3] = {1,2,3};
-
-    if((fid = H5Fcreate(FILE52, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto error;
-
-    if((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto error;
-
-    if((tid = H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0)
-        goto error;
-
-    if(H5Tget_size(tid) == 0)
-        goto error;
-
-    if((did = H5Dcreate2(fid, "dset", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto error;
-
-    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto error;
-
-    if(H5Sclose(sid) < 0)
-        goto error;
-    if(H5Tclose(tid) < 0)
-        goto error;
-    if(H5Dclose(did) < 0)
-        goto error;
-    if(H5Fclose(fid) < 0)
-        goto error;
-
-    return 0;
-
-    error:
-    printf("error !\n");
-    return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    gent_binary
- *
- * Purpose:     Generate a file to be used in the binary output test
- *              Contains:
- *              1) an integer dataset
- *              2) a float dataset
- *              3) a double dataset
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_binary(void)
-{
-    hid_t    fid, sid, did, aid;
-    hsize_t  dims[1]  = {6};
-    int      ibuf[6]  = {1,2,3,4,5,6};
-    float    fbuf[6]  = {1,2,3,4,5,6};
-    double   dbuf[6]  = {1,2,3,4,5,6};
-
-    fid = H5Fcreate(FILE55, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    sid = H5Screate_simple(1, dims, NULL);
-
-
-    /*-------------------------------------------------------------------------
-     * integer
-     *-------------------------------------------------------------------------
-     */
-
-    did = H5Dcreate2(fid, "integer", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf);
-    H5Dclose(did);
-
-    /*-------------------------------------------------------------------------
-     * float
-     *-------------------------------------------------------------------------
-     */
-    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
-    H5Dclose(did);
-
-    /*-------------------------------------------------------------------------
-     * double
-     *-------------------------------------------------------------------------
-     */
-    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
-    /* create an attribute */
-    aid = H5Acreate2(did, "attr", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT);
-    H5Aclose(aid);
-    H5Dclose(did);
-
-
-    /* close */
-    H5Sclose(sid);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gen_bigdims
- *
- * Purpose: generate a dataset with dimensions greater than 4GB
- *          and write one hyperslab on the boundary
- *
- *-------------------------------------------------------------------------
- */
-#define GB4LL    ((unsigned long long) 4*1024*1024*1024)
-#define DIM_4GB  (GB4LL + 10)
-
-static void
-gent_bigdims(void)
-{
-    hid_t   fid = -1;
-    hid_t   did = -1;
-    hid_t   f_sid = -1;
-    hid_t   m_sid = -1;
-    hid_t   tid = -1;
-    hid_t   dcpl = -1;
-    hsize_t dims[1]={DIM_4GB};                 /* dataset dimensions */
-    hsize_t chunk_dims[1]={1024};              /* chunk dimensions */
-    hsize_t hs_start[1];
-    hsize_t hs_size[1];                        /* hyperslab dimensions */
-    size_t  size;
-    char    fillvalue=0;
-    char    *buf=NULL;
-    hsize_t i;
-    char    c;
-    size_t  nelmts;
-    int     ret;
-
-    /* create a file */
-    fid  = H5Fcreate(FILE56, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* create dataset */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_fill_value(dcpl, H5T_NATIVE_SCHAR, &fillvalue) < 0)
-        goto out;
-    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
-        goto out;
-    if((f_sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if((did = H5Dcreate2(fid, "dset4gb", H5T_NATIVE_SCHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if((tid = H5Dget_type(did)) < 0)
-        goto out;
-    if((size = H5Tget_size(tid)) <= 0)
-        goto out;
-
-    /* select an hyperslab */
-    nelmts = 20;
-    hs_start[0] = GB4LL - 10;
-    hs_size[0]  = nelmts;
-
-    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
-        goto out;
-
-    buf=(char *) HDmalloc((unsigned)(nelmts*size));
-
-    for(i=0, c=0; i<nelmts; i++, c++)
-    {
-        buf[i] = c;
-    }
-
-    if(H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size,NULL) < 0)
-        goto out;
-    if(H5Dwrite (did,H5T_NATIVE_SCHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
-        goto out;
-
-
-    HDfree(buf);
-    buf=NULL;
-
-    /* close */
-    if(H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-    if(H5Sclose(f_sid) < 0)
-        goto out;
-    f_sid = -1;
-    if(H5Sclose(m_sid) < 0)
-        goto out;
-    m_sid = -1;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    dcpl = -1;
-    if(H5Dclose(did) < 0)
-        goto out;
-    did = -1;
-
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-
-    return;
-
-    out:
-    printf("Error.....\n");
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(f_sid);
-        H5Sclose(m_sid);
-        H5Tclose(tid);
-        H5Dclose(did);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-    return;
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: gent_hyperslab
- *
- * Purpose: make a dataset for hyperslab read
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_hyperslab(void)
-{
-    hid_t    fid;     /* file id */
-    hsize_t  dims[2]  = {32,4097}; /* big enough data size to force a second stripmine read */
-    double   *buf;
-    int      i, ret;
-
-    buf = (double*) HDmalloc(32 * 4097 * sizeof(double) );
-    for(i = 0; i < 32 * 4097; i++)
-        buf[i] = 1;
-
-    /* create a file */
-    fid  = H5Fcreate(FILE57, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid>=0);
-
-    write_dset(fid,2,dims,"stripmine",H5T_NATIVE_DOUBLE,buf);
-
-    ret = H5Fclose(fid);
-    HDassert(ret >= 0);
-
-    HDfree(buf);
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_group_creation_order
- *
- * Purpose: generate a file with several groups with creation order set and not
- *  set tru its hierarchy
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_group_creation_order(void)
-{
-    hid_t    fid = -1;      /* file ID */
-    hid_t    gid = -1;      /* group ID */
-    hid_t    gcpl_id = -1;  /* group creation property list ID */
-    hid_t    fcpl_id = -1;  /* file creation property list ID (to set root group order) */
-
-    if((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0)
-        goto out;
-
-    if(H5Pset_link_creation_order(fcpl_id, H5P_CRT_ORDER_TRACKED ) < 0)
-        goto out;
-
-    if((fid = H5Fcreate(FILE58, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-
-
-    /* create group creation property list */
-    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-     * create a group "2"
-     *-------------------------------------------------------------------------
-     */
-
-
-    if((gid = H5Gcreate2(fid, "2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "2/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "2/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "2/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "2/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "2/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "2/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "2/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-
-    /*-------------------------------------------------------------------------
-     * create a group "1" with H5P_CRT_ORDER_TRACKED set
-     *-------------------------------------------------------------------------
-     */
-    if(H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
-        goto out;
-
-
-    if((gid = H5Gcreate2(fid, "1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "1/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "1/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "1/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "1/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "1/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    if((gid = H5Gcreate2(fid, "1/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-    if((gid = H5Gcreate2(fid, "1/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-
-    if(H5Pclose(gcpl_id) < 0)
-        goto out;
-    gcpl_id = -1;
-    if(H5Pclose(fcpl_id) < 0)
-        goto out;
-    fcpl_id = -1;
-    if(H5Fclose(fid) < 0)
-        goto out;
-    fid = -1;
-
-    return;
-
-    out:
-    printf("Error.....\n");
-    H5E_BEGIN_TRY {
-        H5Gclose(gid);
-        H5Pclose(gcpl_id);
-        H5Pclose(fcpl_id);
-        H5Fclose(fid);
-
-    } H5E_END_TRY;
-    return;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: gent_attr_creation_order
- *
- * Purpose: generate a file with several objects with attributes with creation
- *  order set and not set
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_attr_creation_order(void)
-{
-    hid_t    fid = -1;      /* file id */
-    hid_t    gid = -1;      /* group id */
-    hid_t    did = -1;      /* dataset id */
-    hid_t    sid = -1;      /* space id */
-    hid_t    aid = -1;      /* attribute id */
-    hid_t    tid = -1;      /* datatype id */
-    hid_t    gcpl_id = -1;  /* group creation property list ID */
-    hid_t    dcpl_id = -1;  /* dataset creation property list ID */
-    hid_t    tcpl_id = -1;  /* datatype creation property list ID */
-    int      i;
-    const char *attr_name[3] = {"c", "b", "a" };
-
-    if((fid = H5Fcreate(FILE59, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* create group creation property list */
-    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
-        goto out;
-
-    /* create dataset creation property list */
-    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-
-    /* create dataset creation property list */
-    if((tcpl_id = H5Pcreate(H5P_DATATYPE_CREATE)) < 0)
-        goto out;
-
-    /* enable attribute creation order tracking on dataset property list */
-    if(H5Pset_attr_creation_order(dcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
-        goto out;
-
-    /* enable attribute creation order tracking on group property list */
-    if(H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
-        goto out;
-
-    /* enable attribute creation order tracking on datatype property list */
-    if(H5Pset_attr_creation_order(tcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
-        goto out;
-
-    /* create a dataspace */
-    if((sid = H5Screate(H5S_SCALAR)) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-     * create a dataset with creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    /* create a dataset */
-    if((did = H5Dcreate2(fid, "dt", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Dclose(did) < 0)
-        goto out;
-    did = -1;
-
-
-    /*-------------------------------------------------------------------------
-     * create a dataset without creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    /* create a dataset */
-    if((did = H5Dcreate2(fid, "d", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Dclose(did) < 0)
-        goto out;
-    did = -1;
-
-
-
-    /*-------------------------------------------------------------------------
-     * create a group with creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    if((gid = H5Gcreate2(fid, "gt", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    /*-------------------------------------------------------------------------
-     * create a group without creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    if((gid = H5Gcreate2(fid, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    /*-------------------------------------------------------------------------
-     * create a named datatype with creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
-        goto out;
-
-    if((H5Tcommit2(fid, "tt", tid, H5P_DEFAULT, tcpl_id, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-     * create a named datatype without creation order tracked for attributes and atributes in it
-     *-------------------------------------------------------------------------
-     */
-
-    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
-        goto out;
-
-    if((H5Tcommit2(fid, "t", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-     * add some attributes to the root group
-     *-------------------------------------------------------------------------
-     */
-    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* add attributes */
-    for(i = 0; i < 3; i++)
-    {
-        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-
-        /* close attribute */
-        if(H5Aclose(aid) < 0)
-            goto out;
-        aid = -1;
-    } /* end for */
-
-    if(H5Gclose(gid) < 0)
-        goto out;
-    gid = -1;
-
-    /*-------------------------------------------------------------------------
-     * close
-     *-------------------------------------------------------------------------
-     */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    sid = -1;
-    if(H5Pclose(dcpl_id) < 0)
-        goto out;
-    dcpl_id = -1;
-    if(H5Pclose(gcpl_id) < 0)
-        goto out;
-    gcpl_id = -1;
-    if(H5Pclose(tcpl_id) < 0)
-        goto out;
-    tcpl_id = -1;
-    if(H5Fclose(fid) < 0)
-        goto out;
-    fid = -1;
-
-
-
-    return;
-
-    out:
-    printf("Error.....\n");
-    H5E_BEGIN_TRY {
-        H5Gclose(gid);
-        H5Dclose(did);
-        H5Sclose(sid);
-        H5Pclose(gcpl_id);
-        H5Pclose(dcpl_id);
-        H5Pclose(tcpl_id);
-        H5Fclose(fid);
-
-    } H5E_END_TRY;
-    return;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_fpformat
- *
- * Purpose:     Generate a file to be used in the floating point format test
- *              Contains:
- *              1) a float dataset
- *              2) a double dataset
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_fpformat(void)
-{
-    hid_t    fid, sid, did;
-    hsize_t  dims[1]  = {6};
-    double   dbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
-    float    fbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
-
-    fid = H5Fcreate(FILE60, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    sid = H5Screate_simple(1, dims, NULL);
-
-    /*-------------------------------------------------------------------------
-     * double
-     *-------------------------------------------------------------------------
-     */
-    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
-    H5Dclose(did);
-
-
-    /*-------------------------------------------------------------------------
-     * float
-     *-------------------------------------------------------------------------
-     */
-    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
-    H5Dclose(did);
-
-
-    /* close */
-    H5Sclose(sid);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_extlinks
- *
- * Purpose:     Generate 3 files to be used in the external links test
- *   External links point from one HDF5 file to an object (Group, Dataset,
- *    or committed Datatype) in another file.  Try to create cycles.
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_extlinks(void)
-{
-    hid_t    source_fid, target_fid, far_fid, sid, did, gid, gid2, tid;
-    hsize_t  dims[1]  = {6};
-    int      buf[6]  = {1, 2, 3, 4, 5, 6};
-
-    /* create two files, a source and a target */
-    source_fid = H5Fcreate(FILE61, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    target_fid = H5Fcreate(FILE62, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    far_fid = H5Fcreate(FILE63, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-
-    /*-------------------------------------------------------------------------
-     * create Groups, a Dataset, a committed Datatype, external links, and a
-     * cycle in the target
-     *-------------------------------------------------------------------------
-     */
-
-    gid = H5Gcreate2(target_fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Gclose(H5Gcreate2(target_fid, "empty_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT));
-    sid = H5Screate_simple(1, dims, NULL);
-    did = H5Dcreate2(gid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-    H5Lcreate_external(FILE61, "/", gid, "elink_t1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external(FILE61, "/ext_link4", gid, "elink_t2", H5P_DEFAULT, H5P_DEFAULT);
-
-    gid2 = H5Gcreate2(gid, "subgroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_hard(target_fid, "/group", gid2, "link_to_group", H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Dclose(did);
-    H5Sclose(sid);
-    H5Gclose(gid2);
-    H5Gclose(gid);
-
-
-    sid = H5Screate_simple(1, dims, NULL);
-    did = H5Dcreate2(target_fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-    H5Dclose(did);
-    H5Sclose(sid);
-
-    tid = H5Tcopy(H5T_NATIVE_INT);
-    H5Tcommit2(target_fid, "type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    H5Tclose(tid);
-
-    /*-------------------------------------------------------------------------
-     * create external links in the source file pointing to the target objects
-     *-------------------------------------------------------------------------
-     */
-
-    H5Lcreate_external(FILE62, "group", source_fid, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external(FILE62, "dset", source_fid, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external(FILE62, "type", source_fid, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external(FILE62, "group/elink_t2", source_fid, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
-    H5Lcreate_external(FILE62, "empty_group", source_fid, "ext_link5", H5P_DEFAULT, H5P_DEFAULT);
-    /* external link to soft link which linked to a dataset */
-    H5Lcreate_external(FILE4_1, "/soft_dset1", source_fid, "ext2soft_link1", H5P_DEFAULT, H5P_DEFAULT);
-
-    /* external link to dangle soft link  */
-    H5Lcreate_external(FILE4_1, "/soft_dangle", source_fid, "ext2softdangle_link1", H5P_DEFAULT, H5P_DEFAULT);
-
-    /*-------------------------------------------------------------------------
-     * create external link in the "far" file pointing to the source file
-     *-------------------------------------------------------------------------
-     */
-    H5Lcreate_external(FILE61, "/", far_fid, "src_file", H5P_DEFAULT, H5P_DEFAULT);
-
-    /* close */
-    H5Fclose(source_fid);
-    H5Fclose(target_fid);
-    H5Fclose(far_fid);
-}
-
-/*-------------------------------------------------------------------------
- * 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.
- *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- * Created:  Albert Cheng, 2010/5/10.
- * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
- *-------------------------------------------------------------------------
- */
-static void
-gent_packedbits(void)
-{
-    hid_t fid, dataset, space;
-    hsize_t dims[2];
-    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
-    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
-    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
-    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
-    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
-    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
-    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
-    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
-    double  dsetdbl[F66_XDIM][F66_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE66, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Dataset of 8 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++)
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        valu8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++)
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        valu16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++)
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        valu32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++)
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        valu64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 8 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++)
-            dset8[i][j] = dset8[i][j-1] << 1;
-        val8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++)
-            dset16[i][j] = dset16[i][j-1] << 1;
-        val16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++)
-            dset32[i][j] = dset32[i][j-1] << 1;
-        val32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++)
-            dset64[i][j] = dset64[i][j-1] << 1;
-        val64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++)
-            dsetdbl[i][j] = 0.0001F * j + i;
-
-    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
-
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_attr_packedbits
- *
- * Purpose:     Generate a file to be used in the h5dump packed bits tests.
- *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
- *-------------------------------------------------------------------------
- */
-static void
-gent_attr_intsize(void)
-{
-    hid_t fid, attr, space, root;
-    hsize_t dims[2];
-    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
-    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
-    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
-    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
-    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
-    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
-    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
-    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
-    double  dsetdbl[F66_XDIM][F66_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE69, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* Attribute of 8 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        }
-        valu8bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_UINT8, dsetu8);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 16 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        }
-        valu16bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_UINT16, dsetu16);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 32 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        }
-        valu32bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_UINT32, dsetu32);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 64 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        }
-        valu64bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_UINT64, dsetu64);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 8 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0; /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset8[i][j] = dset8[i][j-1] << 1;
-        }
-        val8bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_INT8, dset8);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 16 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset16[i][j] = dset16[i][j-1] << 1;
-        }
-        val16bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_INT16, dset16);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 32 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset32[i][j] = dset32[i][j-1] << 1;
-        }
-        val32bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_INT32, dset32);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 64 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset64[i][j] = dset64[i][j-1] << 1;
-        }
-        val64bits <<= 1;
-    }
-
-    H5Awrite(attr, H5T_NATIVE_INT64, dset64);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    attr = H5Acreate2(root, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++)
-            dsetdbl[i][j] = 0.0001F * j + i;
-
-    H5Awrite(attr, H5T_NATIVE_DOUBLE, dsetdbl);
-
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    H5Gclose(root);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_charsets
- *
- * Purpose:     Generate a file to be used in the character set test
- *              Contains:
- *              1) a ascii datatype
- *              2) a utf8 datatype
- *
- *-------------------------------------------------------------------------
- */
-static void
-gent_charsets(void)
-{
-    hid_t fid, did, sid;
-    herr_t status;
-    hsize_t dim[] = {1}; /* Dataspace dimensions */
-    typedef struct CharSetInfo {
-            const char *ascii_p_;
-            const char *utf8_p_;
-    } CharSetInfo;
-
-    hid_t charset_dtid = H5Tcreate( H5T_COMPOUND, sizeof( CharSetInfo ) );
-    hid_t ascii_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
-    hid_t utf8_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
-    const char * writeData[] = { "ascii", "utf8", };
-
-    sid = H5Screate_simple( 1, dim, NULL );
-    fid = H5Fcreate( FILE68, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
-    status = H5Tset_cset( ascii_dtid, H5T_CSET_ASCII );
-    HDassert(status >= 0);
-    H5Tinsert( charset_dtid, "ascii", HOFFSET(CharSetInfo, ascii_p_ ), ascii_dtid );
-
-    status = H5Tset_cset( utf8_dtid, H5T_CSET_UTF8 );
-    HDassert(status >= 0);
-    H5Tinsert( charset_dtid, "utf8", HOFFSET( CharSetInfo, utf8_p_ ), utf8_dtid );
-
-    did = H5Dcreate2( fid, "CharSets", charset_dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
-
-    status = H5Dwrite( did, charset_dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, writeData );
-    HDassert(status >= 0);
-
-    H5Tclose( charset_dtid );
-    H5Tclose( ascii_dtid );
-    H5Tclose( utf8_dtid );
-    H5Sclose( sid );
-    H5Dclose( did );
-    H5Fclose( fid );
-}
-
-static void gent_compound_intsizes(void) {
-    hid_t fid, dataset, space;
-    hsize_t dims[2];
-    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
-    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
-    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
-    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
-    hid_t      arrayu8_tid;                 /* Array datatype handle    */
-    hid_t      arrayu16_tid;                /* Array datatype handle    */
-    hid_t      arrayu32_tid;                /* Array datatype handle    */
-    hid_t      arrayu64_tid;                /* Array datatype handle    */
-    hid_t      array8_tid;                 /* Array datatype handle    */
-    hid_t      array16_tid;                /* Array datatype handle    */
-    hid_t      array32_tid;                /* Array datatype handle    */
-    hid_t      array64_tid;                /* Array datatype handle    */
-    hid_t      arraydbl_tid;                /* Array datatype handle    */
-    uint8_t  valu8bits;
-    uint16_t valu16bits;
-    uint32_t valu32bits;
-    uint64_t valu64bits;
-    int8_t  val8bits;
-    int16_t val16bits;
-    int32_t val32bits;
-    int64_t val64bits;
-    /* Structure and array for compound types                             */
-    typedef struct Array1Struct {
-            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
-            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
-            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
-            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
-            int8_t  dset8[F70_XDIM][F70_YDIM8];
-            int16_t dset16[F70_XDIM][F70_YDIM16];
-            int32_t dset32[F70_XDIM][F70_YDIM32];
-            int64_t dset64[F70_XDIM][F70_YDIM64];
-            double  dsetdbl[F70_XDIM][F70_YDIM8];
-    } Array1Struct;
-    Array1Struct Array1[F70_LENGTH];
-
-    hid_t Array1Structid; /* File datatype identifier */
-    herr_t status; /* Error checking variable */
-    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
-
-    int m, n, o; /* Array init loop vars     */
-
-    /* Initialize the data in the arrays/datastructure                */
-    for (m = 0; m < F70_LENGTH; m++) {
-
-        /* Array of 8 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        valu8bits = (uint8_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu8[n][0] = valu8bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu8[n][o] = Array1[m].dsetu8[n][o-1] << 1;
-            }
-            valu8bits <<= 1;
-        }
-
-        /* Array of 16 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
-
-        valu16bits = (uint16_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu16[n][0] = valu16bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu16[n][o] = Array1[m].dsetu16[n][o-1] << 1;
-            }
-            valu16bits <<= 1;
-        }
-
-        /* Array of 32 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
-
-        valu32bits = (uint32_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu32[n][0] = valu32bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
-            }
-            valu32bits <<= 1;
-        }
-
-        /* Array of 64 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
-
-        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu64[n][0] = valu64bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
-            }
-            valu64bits <<= 1;
-        }
-
-        /* Array of 8 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        val8bits = (int8_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset8[n][0] = val8bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset8[n][o] = Array1[m].dset8[n][o-1] << 1;
-            }
-            val8bits <<= 1;
-        }
-
-        /* Array of 16 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
-
-        val16bits = (int16_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset16[n][0] = val16bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset16[n][o] = Array1[m].dset16[n][o-1] << 1;
-            }
-            val16bits <<= 1;
-        }
-
-        /* Array of 32 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
-
-        val32bits = (int32_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset32[n][0] = val32bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
-            }
-            val32bits <<= 1;
-        }
-
-        /* Array of 64 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
-
-        val64bits = (int64_t) ~0L;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset64[n][0] = val64bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
-            }
-            val64bits <<= 1;
-        }
-
-        /* Double Dummy set for failure tests */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        for(n = 0; n < dims[0]; n++)
-            for(o = 0; o < dims[1]; o++)
-                Array1[m].dsetdbl[n][o] = 0.0001F * o + n;
-    }
-
-    /* Create the array data type for the 8 bits signed int array             */
-    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
-    HDassert(array8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
-    HDassert(array16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
-    HDassert(array32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
-    HDassert(array64_tid >= 0);
-
-    /* Create the array data type for the 8 bits signed int array             */
-    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
-    HDassert(arrayu8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
-    HDassert(arrayu16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
-    HDassert(arrayu32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
-    HDassert(arrayu64_tid >= 0);
-
-    /* Create the array data type for the 32 bits double array             */
-    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
-    HDassert(arraydbl_tid >= 0);
-
-    /* Create the dataspace                                           */
-    space = H5Screate_simple(F70_RANK, dim, NULL);
-    HDassert(space >= 0);
-
-    /* Create the file                                                */
-    fid = H5Fcreate(FILE70, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* Create the memory data type                                    */
-    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
-    HDassert(Array1Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
-    HDassert(status >= 0);
-
-    /* Create the dataset                                             */
-    dataset = H5Dcreate2(fid, F70_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the dataset                                      */
-    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Array1);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Array1Structid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arraydbl_tid);
-    HDassert(status >= 0);
-
-    status = H5Sclose(space);
-    HDassert(status >= 0);
-
-    status = H5Dclose(dataset);
-    HDassert(status >= 0);
-
-    status = H5Fclose(fid);
-    HDassert(status >= 0);
-}
-
-static void gent_compound_attr_intsizes(void) {
-    hid_t fid, attr, space, root;
-    hsize_t dims[2];
-    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
-    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
-    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
-    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
-    hid_t      arrayu8_tid;                 /* Array datatype handle    */
-    hid_t      arrayu16_tid;                /* Array datatype handle    */
-    hid_t      arrayu32_tid;                /* Array datatype handle    */
-    hid_t      arrayu64_tid;                /* Array datatype handle    */
-    hid_t      array8_tid;                 /* Array datatype handle    */
-    hid_t      array16_tid;                /* Array datatype handle    */
-    hid_t      array32_tid;                /* Array datatype handle    */
-    hid_t      array64_tid;                /* Array datatype handle    */
-    hid_t      arraydbl_tid;                /* Array datatype handle    */
-    uint8_t  valu8bits;
-    uint16_t valu16bits;
-    uint32_t valu32bits;
-    uint64_t valu64bits;
-    int8_t  val8bits;
-    int16_t val16bits;
-    int32_t val32bits;
-    int64_t val64bits;
-    /* Structure and array for compound types                             */
-    typedef struct Array1Struct {
-            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
-            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
-            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
-            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
-            int8_t  dset8[F70_XDIM][F70_YDIM8];
-            int16_t dset16[F70_XDIM][F70_YDIM16];
-            int32_t dset32[F70_XDIM][F70_YDIM32];
-            int64_t dset64[F70_XDIM][F70_YDIM64];
-            double  dsetdbl[F70_XDIM][F70_YDIM8];
-    } Array1Struct;
-    Array1Struct Array1[F70_LENGTH];
-
-    hid_t Array1Structid; /* File datatype identifier */
-    herr_t status; /* Error checking variable */
-    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
-
-    int m, n, o; /* Array init loop vars     */
-
-    /* Initialize the data in the arrays/datastructure                */
-    for (m = 0; m < F70_LENGTH; m++) {
-
-        /* Array of 8 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        valu8bits = (uint8_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu8[n][0] = valu8bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu8[n][o] = Array1[m].dsetu8[n][o-1] << 1;
-            }
-            valu8bits <<= 1;
-        }
-
-        /* Array of 16 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
-
-        valu16bits = (uint16_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu16[n][0] = valu16bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu16[n][o] = Array1[m].dsetu16[n][o-1] << 1;
-            }
-            valu16bits <<= 1;
-        }
-
-        /* Array of 32 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
-
-        valu32bits = (uint32_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu32[n][0] = valu32bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
-            }
-            valu32bits <<= 1;
-        }
-
-        /* Array of 64 bits unsigned int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
-
-        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dsetu64[n][0] = valu64bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
-            }
-            valu64bits <<= 1;
-        }
-
-        /* Array of 8 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        val8bits = (int8_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset8[n][0] = val8bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset8[n][o] = Array1[m].dset8[n][o-1] << 1;
-            }
-            val8bits <<= 1;
-        }
-
-        /* Array of 16 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
-
-        val16bits = (int16_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset16[n][0] = val16bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset16[n][o] = Array1[m].dset16[n][o-1] << 1;
-            }
-            val16bits <<= 1;
-        }
-
-        /* Array of 32 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
-
-        val32bits = (int32_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset32[n][0] = val32bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
-            }
-            val32bits <<= 1;
-        }
-
-        /* Array of 64 bits signed int */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
-
-        val64bits = (int64_t) ~0L;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Array1[m].dset64[n][0] = val64bits;
-            for(o = 1; o < dims[1]; o++) {
-                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
-            }
-            val64bits <<= 1;
-        }
-
-        /* Double Dummy set for failure tests */
-        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
-
-        for(n = 0; n < dims[0]; n++)
-            for(o = 0; o < dims[1]; o++)
-                Array1[m].dsetdbl[n][o] = 0.0001F * o + n;
-    }
-
-    /* Create the array data type for the 8 bits signed int array             */
-    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
-    HDassert(array8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
-    HDassert(array16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
-    HDassert(array32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
-    HDassert(array64_tid >= 0);
-
-    /* Create the array data type for the 8 bits signed int array             */
-    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
-    HDassert(arrayu8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
-    HDassert(arrayu16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
-    HDassert(arrayu32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
-    HDassert(arrayu64_tid >= 0);
-
-    /* Create the array data type for the 32 bits double array             */
-    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
-    HDassert(arraydbl_tid >= 0);
-
-    /* Create the dataspace                                           */
-    space = H5Screate_simple(F70_RANK, dim, NULL);
-    HDassert(space >= 0);
-
-    /* Create the file                                                */
-    fid = H5Fcreate(FILE71, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* Create the memory data type                                    */
-    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
-    HDassert(Array1Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
-    HDassert(status >= 0);
-
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* Create the Attribute  */
-    attr = H5Acreate2(root, F71_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the attribute                                      */
-    status = H5Awrite(attr, Array1Structid, Array1);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arraydbl_tid);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Array1Structid);
-    HDassert(status >= 0);
-
-    status = H5Sclose(space);
-    HDassert(status >= 0);
-
-    status = H5Aclose(attr);
-    HDassert(status >= 0);
-
-    status = H5Fclose(fid);
-    HDassert(status >= 0);
-}
-
-static void gent_nested_compound_dt(void) {       /* test nested data type */
-    hid_t fid, group, dataset, space, type, create_plist, type1, type2;
-    hid_t array_dt, enum_dt;
-    enumtype val;
-
-    typedef struct {
-            int a;
-            float b;
-    } dset1_t;
-    dset1_t dset1[10];
-
-    typedef struct {
-            int a;
-            float b;
-            enumtype c;
-    } dset2_t;
-    dset2_t dset2[10];
-
-    typedef struct {
-            int a[5];
-            float b[5][6];
-            dset1_t c;
-    } dset3_t;
-    dset3_t dset3[10];
-
-    enumtype dset4[] = {RED, GREEN, BLUE, GREEN, WHITE, BLUE};
-
-    int i, j, k;
-    unsigned ndims;
-    hsize_t dim[2];
-
-    hsize_t sdim, maxdim;
-
-    sdim = 10;
-    for(i = 0; i < (int)sdim; i++) {
-        dset1[i].a = i;
-        dset1[i].b = (float)(i*i);
-
-        dset2[i].a = i;
-        dset2[i].b = (float)(i+i*0.1F);
-        dset2[i].c = GREEN;
-
-        for(j = 0; j < 5; j++) {
-            dset3[i].a[j] = i*j;
-            for(k = 0; k < 6; k++) {
-                dset3[i].b[j][k] = (float)(i*j*k*1.0F);
-            }
-        }
-        dset3[i].c.a = i;
-        dset3[i].c.b = (float)(i*1.0F);
-    }
-
-    fid = H5Fcreate(FILE72, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    create_plist = H5Pcreate(H5P_DATASET_CREATE);
-
-    sdim = 2;
-    H5Pset_chunk(create_plist, 1, &sdim);
-
-
-    sdim = 6;
-    maxdim = H5S_UNLIMITED;
-
-    space = H5Screate_simple(1, &sdim, &maxdim);
-
-    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
-    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
-    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
-
-    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-
-    H5Tclose(type);
-    H5Dclose(dataset);
-
-    /* Create the shared enumerated datatype. */
-    enum_dt = H5Tenum_create (H5T_NATIVE_INT);
-    val = (enumtype) RED;
-    H5Tenum_insert (enum_dt, "Red", &val);
-    val = (enumtype) GREEN;
-    H5Tenum_insert (enum_dt, "Green", &val);
-    val = (enumtype) BLUE;
-    H5Tenum_insert (enum_dt, "Blue", &val);
-    val = (enumtype) WHITE;
-    H5Tenum_insert (enum_dt, "White", &val);
-    val = (enumtype) BLACK;
-    H5Tenum_insert (enum_dt, "Black", &val);
-    H5Tcommit2(fid, "enumtype", enum_dt,  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2[0]));
-
-    H5Tinsert(type2, "a_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
-    H5Tinsert(type2, "b_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
-    H5Tinsert(type2, "c_name", HOFFSET(dset2_t, c), enum_dt);
-
-    dataset = H5Dcreate2(fid, "/dset2", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-
-    H5Tclose(type2);
-
-    dataset = H5Dcreate2(fid, "/dset4", enum_dt, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-    H5Dwrite(dataset, enum_dt, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
-
-    H5Tclose(enum_dt);
-    H5Dclose(dataset);
-
-    /* shared data type 1 */
-    type1 = H5Tcreate(H5T_COMPOUND, sizeof(dset1_t));
-    H5Tinsert(type1, "int_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
-    H5Tinsert(type1, "float_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
-    H5Tcommit2(fid, "type1", type1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
-
-    ndims = 1; dim[0] = 5;
-    array_dt = H5Tarray_create2(H5T_STD_I32LE, ndims, dim);
-    H5Tinsert(type2, "int_name", HOFFSET(dset3_t, a), array_dt);
-    H5Tclose(array_dt);
-
-    ndims = 2; dim[0] = 5; dim[1] = 6;
-    array_dt = H5Tarray_create2(H5T_IEEE_F32LE, ndims, dim);
-    H5Tinsert(type2, "float_name", HOFFSET(dset3_t, b), array_dt);
-    H5Tclose(array_dt);
-
-    H5Tinsert (type2, "cmpd_name", HOFFSET (dset3_t, c), type1);
-
-    dataset = H5Dcreate2(group, "dset3", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-
-    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
-
-    dataset = H5Dcreate2(fid, "/dset5", type1, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
-    H5Dwrite(dataset, type1, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-
-    H5Tclose(type1);
-    H5Tclose(type2);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Gclose(group);
-
-    H5Pclose(create_plist);
-
-    H5Fclose(fid);
-
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_intscalars
- *
- * Purpose:     Generate a file to be used in the h5dump scalar tests.
- *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- *-------------------------------------------------------------------------
- */
-static void
-gent_intscalars(void)
-{
-    hid_t fid, dataset, space, tid;
-    hsize_t dims[2];
-    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
-    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
-    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
-    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
-    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
-    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
-    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
-    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
-    double  dsetdbl[F73_XDIM][F73_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE73, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Dataset of 8 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        }
-        valu8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        }
-        valu16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        }
-        valu32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        }
-        valu64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 8 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0; /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset8[i][j] = dset8[i][j-1] << 1;
-        }
-        val8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset16[i][j] = dset16[i][j-1] << 1;
-        }
-        val16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset32[i][j] = dset32[i][j-1] << 1;
-        }
-        val32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset64[i][j] = dset64[i][j-1] << 1;
-        }
-        val64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++)
-            dsetdbl[i][j] = 0.0001F * j + i;
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
-
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_attr_intscalars
- *
- * Purpose:     Generate a file to be used in the h5dump attribute scalar tests.
- *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
- *-------------------------------------------------------------------------
- */
-static void
-gent_attr_intscalars(void)
-{
-    hid_t fid, attr, space, root, tid;
-    hsize_t dims[2];
-    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
-    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
-    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
-    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
-    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
-    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
-    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
-    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
-    double  dsetdbl[F73_XDIM][F73_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE74, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* Attribute of 8 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        }
-        valu8bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dsetu8);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 16 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        }
-        valu16bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dsetu16);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 32 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        }
-        valu32bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dsetu32);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 64 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        }
-        valu64bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dsetu64);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 8 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0; /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset8[i][j] = dset8[i][j-1] << 1;
-        }
-        val8bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dset8);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 16 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset16[i][j] = dset16[i][j-1] << 1;
-        }
-        val16bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dset16);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 32 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset32[i][j] = dset32[i][j-1] << 1;
-        }
-        val32bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dset32);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Attribute of 64 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset64[i][j] = dset64[i][j-1] << 1;
-        }
-        val64bits <<= 1;
-    }
-
-    H5Awrite(attr, tid, dset64);
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
-    attr = H5Acreate2(root, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++)
-            dsetdbl[i][j] = 0.0001F * j + i;
-
-    H5Awrite(attr, tid, dsetdbl);
-
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    H5Gclose(root);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_string_scalars
- *
- * Purpose:     Generate a file to be used in the h5dump string scalar tests.
- *   A dataset of string types are created.
- *   An attribute of string types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *-------------------------------------------------------------------------
- */
-static void
-gent_string_scalars(void)
-{
-    hid_t fid, attr, dataset, space, tid, root;
-    hsize_t dims[2];
-    char  string[F73_XDIM][F73_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE75, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    root = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-    /* string scalar */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tcopy(H5T_C_S1);
-    H5Tset_size(tid, F73_XDIM * F73_YDIM8);
-
-    memset(string, ' ', F73_XDIM * F73_YDIM8);
-    for(i = 0; i < dims[0]; i++) {
-        string[i][0] = 'A' + i;
-        for(j = 1; j < dims[1]; j++) {
-            string[i][j] = string[i][j-1] + 1;
-        }
-    }
-    string[dims[0]-1][dims[1]-1] = 0;
-
-    /* Dataset of string scalar */
-    dataset = H5Dcreate2(fid, "the_str", tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, string);
-    H5Dclose(dataset);
-
-    /* attribute of string scalar */
-    attr = H5Acreate2(root, "attr_str", tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, string);
-
-    H5Sclose(space);
-    H5Aclose(attr);
-
-    H5Gclose(root);
-    H5Fclose(fid);
-}
-
-static void gent_compound_int_array(void) {
-    hid_t fid, dataset, space;
-    hsize_t dims[1];
-    uint8_t  valu8bits;
-    uint16_t valu16bits;
-    uint32_t valu32bits;
-    uint64_t valu64bits;
-    int8_t  val8bits;
-    int16_t val16bits;
-    int32_t val32bits;
-    int64_t val64bits;
-    hsize_t    array_dim8[]={F76_DIM8}; /* Array dimensions         */
-    hsize_t    array_dim16[]={F76_DIM16}; /* Array dimensions         */
-    hsize_t    array_dim32[]={F76_DIM32}; /* Array dimensions         */
-    hsize_t    array_dim64[]={F76_DIM64}; /* Array dimensions         */
-    hid_t      arrayu8_tid;                 /* Array datatype handle    */
-    hid_t      arrayu16_tid;                /* Array datatype handle    */
-    hid_t      arrayu32_tid;                /* Array datatype handle    */
-    hid_t      arrayu64_tid;                /* Array datatype handle    */
-    hid_t      array8_tid;                 /* Array datatype handle    */
-    hid_t      array16_tid;                /* Array datatype handle    */
-    hid_t      array32_tid;                /* Array datatype handle    */
-    hid_t      array64_tid;                /* Array datatype handle    */
-    hid_t      arraydbl_tid;                /* Array datatype handle    */
-    /* Structure and array for compound types                             */
-    typedef struct Cmpd1Struct {
-            uint8_t  dsetu8[F76_DIM8];
-            uint16_t dsetu16[F76_DIM16];
-            uint32_t dsetu32[F76_DIM32];
-            uint64_t dsetu64[F76_DIM64];
-            int8_t  dset8[F76_DIM8];
-            int16_t dset16[F76_DIM16];
-            int32_t dset32[F76_DIM32];
-            int64_t dset64[F76_DIM64];
-            double  dsetdbl[F76_DIM8];
-    } Cmpd1Struct;
-    Cmpd1Struct Cmpd1[F76_LENGTH];
-
-    hid_t Cmpd1Structid; /* File datatype identifier */
-    herr_t status; /* Error checking variable */
-    hsize_t dim[] = { F76_LENGTH }; /* Dataspace dimensions     */
-
-    int m, n; /* Array init loop vars     */
-
-    /* Initialize the data in the arrays/datastructure                */
-    for (m = 0; m < F76_LENGTH; m++) {
-
-        /* Array of 8 bits unsigned int */
-        dims[0] = F76_DIM8;
-
-        valu8bits = (uint8_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dsetu8[n] = valu8bits;
-            valu8bits <<= 1;
-        }
-
-        /* Array of 16 bits unsigned int */
-        dims[0] = F76_DIM16;
-
-        valu16bits = (uint16_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dsetu16[n] = valu16bits;
-            valu16bits <<= 1;
-        }
-
-        /* Array of 32 bits unsigned int */
-        dims[0] = F76_DIM32;
-
-        valu32bits = (uint32_t) ~0u;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dsetu32[n] = valu32bits;
-            valu32bits <<= 1;
-        }
-
-        /* Array of 64 bits unsigned int */
-        dims[0] = F76_DIM64;
-
-        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dsetu64[n] = valu64bits;
-            valu64bits <<= 1;
-        }
-
-        /* Array of 8 bits signed int */
-        dims[0] = F76_DIM8;
-
-        val8bits = (int8_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dset8[n] = val8bits;
-            val8bits <<= 1;
-        }
-
-        /* Array of 16 bits signed int */
-        dims[0] = F76_DIM16;
-
-        val16bits = (int16_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dset16[n] = val16bits;
-            val16bits <<= 1;
-        }
-
-        /* Array of 32 bits signed int */
-        dims[0] = F76_DIM32;
-
-        val32bits = (int32_t) ~0;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dset32[n] = val32bits;
-            val32bits <<= 1;
-        }
-
-        /* Array of 64 bits signed int */
-        dims[0] = F76_DIM64;
-
-        val64bits = (int64_t) ~0L;  /* all 1s */
-        for(n = 0; n < dims[0]; n++){
-            Cmpd1[m].dset64[n] = val64bits;
-            val64bits <<= 1;
-        }
-
-        /* Double Dummy set for failure tests */
-        dims[0] = F76_DIM8;
-
-        for(n = 0; n < dims[0]; n++)
-            Cmpd1[m].dsetdbl[n] = 0.0001F + n;
-    }
-
-    /* Create the array data type for the 8 bits signed int array             */
-    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F76_ARRAY_RANK, array_dim8);
-    HDassert(array8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F76_ARRAY_RANK, array_dim16);
-    HDassert(array16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F76_ARRAY_RANK, array_dim32);
-    HDassert(array32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F76_ARRAY_RANK, array_dim64);
-    HDassert(array64_tid >= 0);
-
-    /* Create the array data type for the 8 bits signed int array             */
-    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F76_ARRAY_RANK, array_dim8);
-    HDassert(arrayu8_tid >= 0);
-
-    /* Create the array data type for the 16 bits signed int array             */
-    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F76_ARRAY_RANK, array_dim16);
-    HDassert(arrayu16_tid >= 0);
-
-    /* Create the array data type for the 32 bits signed int array             */
-    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F76_ARRAY_RANK, array_dim32);
-    HDassert(arrayu32_tid >= 0);
-
-    /* Create the array data type for the 64 bits signed int array             */
-    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F76_ARRAY_RANK, array_dim64);
-    HDassert(arrayu64_tid >= 0);
-
-    /* Create the array data type for the 32 bits double array             */
-    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F76_ARRAY_RANK, array_dim8);
-    HDassert(arraydbl_tid >= 0);
-
-    /* Create the dataspace                                           */
-    space = H5Screate_simple(F76_RANK, dim, NULL);
-    HDassert(space >= 0);
-
-    /* Create the file                                                */
-    fid = H5Fcreate(FILE76, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* Create the memory data type                                    */
-    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
-    HDassert(Cmpd1Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), arraydbl_tid);
-    HDassert(status >= 0);
-
-    /* Create the dataset                                             */
-    dataset = H5Dcreate2(fid, F76_DATASETNAME, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the dataset                                      */
-    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Cmpd1Structid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arrayu64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array8_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array16_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array32_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(array64_tid);
-    HDassert(status >= 0);
-
-    status = H5Tclose(arraydbl_tid);
-    HDassert(status >= 0);
-
-    status = H5Sclose(space);
-    HDassert(status >= 0);
-
-    status = H5Dclose(dataset);
-    HDassert(status >= 0);
-
-    status = H5Fclose(fid);
-    HDassert(status >= 0);
-}
-
-static void gent_compound_ints(void) {
-    hid_t fid, dataset, space;
-    uint8_t  valu8bits = (uint8_t) ~0u;  /* all 1s */
-    uint16_t valu16bits = (uint16_t) ~0u;  /* all 1s */
-    uint32_t valu32bits = (uint32_t) ~0u;  /* all 1s */
-    uint64_t valu64bits = (uint64_t) ~0Lu;  /* all 1s */
-    int8_t  val8bits = (int8_t) ~0;  /* all 1s */
-    int16_t val16bits = (int16_t) ~0;  /* all 1s */
-    int32_t val32bits = (int32_t) ~0;  /* all 1s */
-    int64_t val64bits = (int64_t) ~0L;  /* all 1s */
-    /* Structure and array for compound types                             */
-    typedef struct Cmpd1Struct {
-            uint8_t  dsetu8;
-            uint16_t dsetu16;
-            uint32_t dsetu32;
-            uint64_t dsetu64;
-            int8_t  dset8;
-            int16_t dset16;
-            int32_t dset32;
-            int64_t dset64;
-            double  dsetdbl;
-    } Cmpd1Struct;
-    Cmpd1Struct Cmpd1[F77_LENGTH];
-
-    typedef struct Cmpd2Struct {
-            uint64_t dsetu64;
-            uint32_t dsetu32;
-            uint16_t dsetu16;
-            uint8_t  dsetu8;
-            int64_t dset64;
-            int32_t dset32;
-            int16_t dset16;
-            int8_t  dset8;
-            double  dsetdbl;
-    } Cmpd2Struct;
-    Cmpd2Struct Cmpd2[F77_LENGTH];
-
-    hid_t Cmpd1Structid; /* File datatype identifier */
-    hid_t Cmpd2Structid; /* File datatype identifier */
-    herr_t status; /* Error checking variable */
-    hsize_t dim[] = { F77_LENGTH }; /* Dataspace dimensions     */
-
-    int m; /* Array init loop vars     */
-
-    /* Initialize the data in the arrays/datastructure                */
-    for (m = 0; m < F77_LENGTH; m++) {
-
-        /* Array of 8 bits unsigned int */
-        if((m % F76_DIM8) == 0)
-            valu8bits = (uint8_t) ~0u;  /* all 1s */
-        Cmpd1[m].dsetu8 = valu8bits;
-        Cmpd2[m].dsetu8 = valu8bits;
-        valu8bits <<= 1;
-
-        /* Array of 16 bits unsigned int */
-        if((m % F76_DIM16) == 0)
-            valu16bits = (uint16_t) ~0u;  /* all 1s */
-        Cmpd1[m].dsetu16 = valu16bits;
-        Cmpd2[m].dsetu16 = valu16bits;
-        valu16bits <<= 1;
-
-        /* Array of 32 bits unsigned int */
-        if((m % F76_DIM32) == 0)
-            valu32bits = (uint32_t) ~0u;  /* all 1s */
-        Cmpd1[m].dsetu32 = valu32bits;
-        Cmpd2[m].dsetu32 = valu32bits;
-        valu32bits <<= 1;
-
-        /* Array of 64 bits unsigned int */
-        if((m % F76_DIM64) == 0)
-            valu64bits = (uint64_t) ~0Lu;  /* all 1s */
-        Cmpd1[m].dsetu64 = valu64bits;
-        Cmpd2[m].dsetu64 = valu64bits;
-        valu64bits <<= 1;
-
-        /* Array of 8 bits signed int */
-        if((m % F76_DIM8) == 0)
-            val8bits = (int8_t) ~0;  /* all 1s */
-        Cmpd1[m].dset8 = val8bits;
-        Cmpd2[m].dset8 = val8bits;
-        val8bits <<= 1;
-
-        /* Array of 16 bits signed int */
-        if((m % F76_DIM16) == 0)
-            val16bits = (int16_t) ~0;  /* all 1s */
-        Cmpd1[m].dset16 = val16bits;
-        Cmpd2[m].dset16 = val16bits;
-        val16bits <<= 1;
-
-        /* Array of 32 bits signed int */
-        if((m % F76_DIM32) == 0)
-            val32bits = (int32_t) ~0;  /* all 1s */
-        Cmpd1[m].dset32 = val32bits;
-        Cmpd2[m].dset32 = val32bits;
-        val32bits <<= 1;
-
-        /* Array of 64 bits signed int */
-        if((m % F76_DIM64) == 0)
-            val64bits = (int64_t) ~0L;  /* all 1s */
-        Cmpd1[m].dset64 = val64bits;
-        Cmpd2[m].dset64 = val64bits;
-        val64bits <<= 1;
-
-        /* Double Dummy set for failure tests */
-        Cmpd1[m].dsetdbl = 0.0001F + m;
-        Cmpd2[m].dsetdbl = 0.0001F + m;
-    }
-
-    /* Create the dataspace                                           */
-    space = H5Screate_simple(F76_RANK, dim, NULL);
-    HDassert(space >= 0);
-
-    /* Create the file                                                */
-    fid = H5Fcreate(FILE77, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    HDassert(fid >= 0);
-
-    /* Create the memory data type                                    */
-    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
-    HDassert(Cmpd1Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), H5T_NATIVE_UCHAR);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), H5T_NATIVE_USHORT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), H5T_NATIVE_UINT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), H5T_NATIVE_ULONG);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), H5T_NATIVE_SCHAR);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), H5T_NATIVE_SHORT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), H5T_NATIVE_INT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), H5T_NATIVE_LONG);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), H5T_NATIVE_DOUBLE);
-    HDassert(status >= 0);
-
-    /* Create the dataset                                             */
-    dataset = H5Dcreate2(fid, F77_DATASETNAME1, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the dataset                                      */
-    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Cmpd1Structid);
-    HDassert(status >= 0);
-
-    status = H5Sclose(space);
-    HDassert(status >= 0);
-
-    status = H5Dclose(dataset);
-    HDassert(status >= 0);
-
-    /* Create the dataspace                                           */
-    space = H5Screate_simple(F76_RANK, dim, NULL);
-    HDassert(space >= 0);
-
-    /* Create the memory data type                                    */
-    Cmpd2Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd2Struct));
-    HDassert(Cmpd2Structid >= 0);
-
-    /* Insert the arrays and variables into the structure             */
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETU64, HOFFSET(Cmpd2Struct, dsetu64), H5T_NATIVE_ULONG);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETU32, HOFFSET(Cmpd2Struct, dsetu32), H5T_NATIVE_UINT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETU16, HOFFSET(Cmpd2Struct, dsetu16), H5T_NATIVE_USHORT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETU08, HOFFSET(Cmpd2Struct, dsetu8), H5T_NATIVE_UCHAR);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETS64, HOFFSET(Cmpd2Struct, dset64), H5T_NATIVE_LONG);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETS32, HOFFSET(Cmpd2Struct, dset32), H5T_NATIVE_INT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETS16, HOFFSET(Cmpd2Struct, dset16), H5T_NATIVE_SHORT);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DATASETS08, HOFFSET(Cmpd2Struct, dset8), H5T_NATIVE_SCHAR);
-    HDassert(status >= 0);
-
-    status = H5Tinsert(Cmpd2Structid, F76_DUMMYDBL, HOFFSET(Cmpd2Struct, dsetdbl), H5T_NATIVE_DOUBLE);
-    HDassert(status >= 0);
-
-    /* Create the dataset                                             */
-    dataset = H5Dcreate2(fid, F77_DATASETNAME2, Cmpd2Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Write data to the dataset                                      */
-    status = H5Dwrite(dataset, Cmpd2Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd2);
-    HDassert(status >= 0);
-
-    /* Release resources                                              */
-    status = H5Tclose(Cmpd2Structid);
-    HDassert(status >= 0);
-
-    status = H5Sclose(space);
-    HDassert(status >= 0);
-
-    status = H5Dclose(dataset);
-    HDassert(status >= 0);
-
-    status = H5Fclose(fid);
-    HDassert(status >= 0);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_intscalars
- *
- * Purpose:     Generate a file to be used in the h5dump scalar with attribute tests.
- *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- *-------------------------------------------------------------------------
- */
-static void
-gent_intattrscalars(void)
-{
-    hid_t fid, attr, dataset, space, tid;
-    hsize_t dims[2];
-    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
-    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
-    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
-    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
-    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
-    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
-    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
-    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
-    double  dsetdbl[F73_XDIM][F73_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE78, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Dataset of 8 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        }
-        valu8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
-    /* Attribute of 8 bits unsigned int */
-    attr = H5Acreate2(dataset, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dsetu8);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        }
-        valu16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
-    /* Attribute of 16 bits unsigned int */
-    attr = H5Acreate2(dataset, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dsetu16);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        }
-        valu32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
-    /* Attribute of 32 bits unsigned int */
-    attr = H5Acreate2(dataset, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dsetu32);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits unsigned int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        }
-        valu64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
-    /* Attribute of 64 bits unsigned int */
-    attr = H5Acreate2(dataset, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dsetu64);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 8 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0; /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset8[i][j] = dset8[i][j-1] << 1;
-        }
-        val8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
-    /* Attribute of 8 bits signed int */
-    attr = H5Acreate2(dataset, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dset8);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset16[i][j] = dset16[i][j-1] << 1;
-        }
-        val16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
-    /* Attribute of 16 bits signed int */
-    attr = H5Acreate2(dataset, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dset16);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset32[i][j] = dset32[i][j-1] << 1;
-        }
-        val32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
-    /* Attribute of 32 bits signed int */
-    attr = H5Acreate2(dataset, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dset32);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits signed int */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++) {
-            dset64[i][j] = dset64[i][j-1] << 1;
-        }
-        val64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
-    /* Attribute of 64 bits signed int */
-    attr = H5Acreate2(dataset, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dset64);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
-    space = H5Screate(H5S_SCALAR);
-    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
-    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++)
-            dsetdbl[i][j] = 0.0001F * j + i;
-
-    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
-    /* Attribute of double */
-    attr = H5Acreate2(dataset, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, tid, dsetdbl);
-    H5Aclose(attr);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_packedbits
- *
- * Purpose:     Generate a file to be used in the h5dump packed bits tests.
- *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
- *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
- *   Fill them with raw data such that no bit will be all zero in a dataset.
- *   A dummy dataset of double type is created for failure test.
- * Created:  Albert Cheng, 2010/5/10.
- * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
- *-------------------------------------------------------------------------
- */
-static void
-gent_intsattrs(void)
-{
-    hid_t fid, attr, dataset, space, aspace;
-    hsize_t dims[2], adims[1];
-    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   asetu8[F66_XDIM*F66_YDIM8],   valu8bits;
-    uint16_t dsetu16[F66_XDIM][F66_YDIM16], asetu16[F66_XDIM*F66_YDIM16], valu16bits;
-    uint32_t dsetu32[F66_XDIM][F66_YDIM32], asetu32[F66_XDIM*F66_YDIM32], valu32bits;
-    uint64_t dsetu64[F66_XDIM][F66_YDIM64], asetu64[F66_XDIM*F66_YDIM64], valu64bits;
-    int8_t  dset8[F66_XDIM][F66_YDIM8],   aset8[F66_XDIM*F66_YDIM8],   val8bits;
-    int16_t dset16[F66_XDIM][F66_YDIM16], aset16[F66_XDIM*F66_YDIM16], val16bits;
-    int32_t dset32[F66_XDIM][F66_YDIM32], aset32[F66_XDIM*F66_YDIM32], val32bits;
-    int64_t dset64[F66_XDIM][F66_YDIM64], aset64[F66_XDIM*F66_YDIM64], val64bits;
-    double  dsetdbl[F66_XDIM][F66_YDIM8], asetdbl[F66_XDIM*F66_YDIM8];
-    unsigned int i, j;
-
-    fid = H5Fcreate(FILE79, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Dataset of 8 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu8bits = (uint8_t) ~0u;  /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu8[i][0] = valu8bits;
-        asetu8[i*dims[1]] = dsetu8[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dsetu8[i][j] = dsetu8[i][j-1] << 1;
-            asetu8[i*dims[1]+j] = dsetu8[i][j];
-        }
-        valu8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
-    /* Attribute of 8 bits unsigned int */
-    adims[0] = F66_XDIM * F66_YDIM8;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETU08, H5T_STD_U8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_UINT8, asetu8);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu16bits = (uint16_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu16[i][0] = valu16bits;
-        asetu16[i*dims[1]] = dsetu16[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dsetu16[i][j] = dsetu16[i][j-1] << 1;
-            asetu16[i*dims[1]+j] = dsetu16[i][j];
-        }
-        valu16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
-    /* Attribute of 16 bits unsigned int */
-    adims[0] = F66_XDIM * F66_YDIM16;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETU16, H5T_STD_U16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_UINT16, asetu16);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu32bits = (uint32_t) ~0u;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu32[i][0] = valu32bits;
-        asetu32[i*dims[1]] = dsetu32[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dsetu32[i][j] = dsetu32[i][j-1] << 1;
-            asetu32[i*dims[1]+j] = dsetu32[i][j];
-        }
-        valu32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
-    /* Attribute of 32 bits unsigned int */
-    adims[0] = F66_XDIM * F66_YDIM32;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETU32, H5T_STD_U32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_UINT32, asetu32);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits unsigned int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dsetu64[i][0] = valu64bits;
-        asetu64[i*dims[1]] = dsetu64[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dsetu64[i][j] = dsetu64[i][j-1] << 1;
-            asetu64[i*dims[1]+j] = dsetu64[i][j];
-        }
-        valu64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
-    /* Attribute of 64 bits unsigned int */
-    adims[0] = F66_XDIM * F66_YDIM64;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETU64, H5T_STD_U64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_UINT64, asetu64);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 8 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val8bits = (int8_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset8[i][0] = val8bits;
-        aset8[i*dims[1]] = dset8[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dset8[i][j] = dset8[i][j-1] << 1;
-            aset8[i*dims[1]+j] = dset8[i][j];
-        }
-        val8bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
-    /* Attribute of 8 bits signed int */
-    adims[0] = F66_XDIM * F66_YDIM8;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETS08, H5T_STD_I8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT8, aset8);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 16 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val16bits = (int16_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset16[i][0] = val16bits;
-        aset16[i*dims[1]] = dset16[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dset16[i][j] = dset16[i][j-1] << 1;
-            aset16[i*dims[1]+j] = dset16[i][j];
-        }
-        val16bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
-    /* Attribute of 16 bits signed int */
-    adims[0] = F66_XDIM * F66_YDIM16;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETS16, H5T_STD_I16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT16, aset16);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 32 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val32bits = (int32_t) ~0;    /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset32[i][0] = val32bits;
-        aset32[i*dims[1]] = dset32[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dset32[i][j] = dset32[i][j-1] << 1;
-            aset32[i*dims[1]+j] = dset32[i][j];
-        }
-        val32bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
-    /* Attribute of 32 bits signed int */
-    adims[0] = F66_XDIM * F66_YDIM32;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETS32, H5T_STD_I32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT32, aset32);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Dataset of 64 bits signed int */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    val64bits = (int64_t) ~0L;   /* all 1s */
-    for(i = 0; i < dims[0]; i++){
-        dset64[i][0] = val64bits;
-        aset64[i*dims[1]] = dset64[i][0];
-        for(j = 1; j < dims[1]; j++) {
-            dset64[i][j] = dset64[i][j-1] << 1;
-            aset64[i*dims[1]+j] = dset64[i][j];
-        }
-        val64bits <<= 1;
-    }
-
-    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
-    /* Attribute of 64 bits signed int */
-    adims[0] = F66_XDIM * F66_YDIM64;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DATASETS64, H5T_STD_I64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_INT64, aset64);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    /* Double Dummy set for failure tests */
-    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
-    space = H5Screate_simple(2, dims, NULL);
-    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < dims[0]; i++)
-        for(j = 0; j < dims[1]; j++) {
-            dsetdbl[i][j] = 0.0001F * j + i;
-            asetdbl[i*dims[1]+j] = dsetdbl[i][j];
-        }
-
-    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
-    /* Attribute of double */
-    adims[0] = F66_XDIM * F66_YDIM8;
-    aspace = H5Screate_simple(1, adims, NULL);
-    attr = H5Acreate2(dataset, F66_DUMMYDBL, H5T_IEEE_F64BE, aspace, H5P_DEFAULT, H5P_DEFAULT);
-    H5Awrite(attr, H5T_NATIVE_DOUBLE, asetdbl);
-    H5Aclose(attr);
-    H5Sclose(aspace);
-    H5Sclose(space);
-    H5Dclose(dataset);
-    H5Fclose(fid);
-}
-
-static void gent_bitnopaquefields(void)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-        unsigned char   a;
-        unsigned int    b;
-        unsigned long    c;
-        unsigned long long    d;
-    } s_t;
-    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
-    size_t  i;
-    hsize_t  nelmts = F80_DIM32;
-    unsigned char buf[F80_DIM32];    /* bitfield, opaque */
-    unsigned int buf2[F80_DIM32];    /* bitfield, opaque */
-    unsigned long buf3[F80_DIM32];    /* bitfield, opaque */
-    unsigned long long buf4[F80_DIM32];    /* bitfield, opaque */
-    s_t      buf5[F80_DIM32];        /* compound */
-
-    file = H5Fcreate(FILE80, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    if ((grp = H5Gcreate2(file, "bittypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-        /* bitfield_1 */
-        if ((type = H5Tcopy(H5T_STD_B8LE)) >= 0) {
-            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                if ((dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                    for (i = 0; i < nelmts; i++) {
-                        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
-                    }
-                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-                    H5Dclose(dset);
-                }
-                H5Sclose(space);
-            }
-            H5Tclose(type);
-        }
-
-        /* bitfield_2 */
-        if ((type = H5Tcopy(H5T_STD_B16LE)) >= 0) {
-            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                if ((dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                    for (i = 0; i < nelmts; i++) {
-                        buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
-                    }
-                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
-                    H5Dclose(dset);
-                }
-                H5Sclose(space);
-            }
-            H5Tclose(type);
-        }
-
-        /* bitfield_3 */
-        if ((type = H5Tcopy(H5T_STD_B32LE)) >= 0) {
-            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                if ((dset = H5Dcreate2(grp, "bitfield_3", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                    for (i = 0; i < nelmts; i++) {
-                        buf3[i] = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
-                    }
-                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
-                    H5Dclose(dset);
-                }
-                H5Sclose(space);
-            }
-            H5Tclose(type);
-        }
-
-        /* bitfield_4 */
-        if ((type = H5Tcopy(H5T_STD_B64LE)) >= 0) {
-            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                if ((dset = H5Dcreate2(grp, "bitfield_4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                    for (i = 0; i < nelmts; i++) {
-                        buf4[i] = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
-                    }
-                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf4);
-                    H5Dclose(dset);
-                }
-                H5Sclose(space);
-            }
-            H5Tclose(type);
-        }
-
-        H5Gclose(grp);
-    }
-
-    if ((grp = H5Gcreate2(file, "opaquetypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-        /* opaque_1 */
-        if ((type = H5Tcreate(H5T_OPAQUE, 1)) >= 0) {
-            if ((H5Tset_tag(type, "1-byte opaque type")) >= 0) {
-                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                    if ((dset = H5Dcreate2(grp, "opaque_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                        for(i = 0; i < nelmts; i++)
-                            buf[i] = (unsigned char)0xff ^ (unsigned char)i;
-                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-                        H5Dclose(dset);
-                    }
-                    H5Sclose(space);
-                }
-            }
-            H5Tclose(type);
-        }
-
-        /* opaque_2 */
-        if ((type = H5Tcreate(H5T_OPAQUE, 2)) >= 0) {
-            if ((H5Tset_tag(type, "2-byte opaque type")) >= 0) {
-                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                    if ((dset = H5Dcreate2(grp, "opaque_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                        for(i = 0; i < nelmts; i++)
-                            buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
-
-                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
-                        H5Dclose(dset);
-                    }
-                    H5Sclose(space);
-                }
-            }
-            H5Tclose(type);
-        }
-        H5Gclose(grp);
-    }
-
-    if ((grp = H5Gcreate2(file, "cmpdtypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-        /* compound_1 */
-        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
-            H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
-            H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
-            H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
-            H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
-            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
-                if ((dset = H5Dcreate2(grp, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
-                    for(i = 0; i < nelmts; i++) {
-                        buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
-                        buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
-                        buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
-                        buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
-                    }
-
-                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
-                    H5Dclose(dset);
-                }
-                H5Sclose(space);
-            }
-            H5Tclose(type);
-        }
-        H5Gclose(grp);
-    }
-
-    H5Fclose(file);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    gent_intsfourdims
- *
- * Purpose:     Generate a file to be used in the h5dump subsetting tests.
- *   One datasets of unsigned int types are created in four dimensions 2,4,6,10.
- *-------------------------------------------------------------------------
- */
-static void
-gent_intsfourdims(void)
-{
-    hid_t fid, dataset, space, tid;
-    hsize_t dims[F81_RANK];
-    uint32_t dset1[F81_ZDIM][F81_YDIM][F81_XDIM][F81_WDIM];
-    unsigned int i, j, k, l;
-
-    fid = H5Fcreate(FILE81, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Dataset of 32 bits unsigned int */
-    dims[0] = F81_ZDIM; dims[1] = F81_YDIM; dims[2] = F81_XDIM; dims[3] = F81_WDIM;
-    space = H5Screate_simple(F81_RANK, dims, NULL);
-    dataset = H5Dcreate2(fid, F81_DATASETNAME, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    for(i = 0; i < F81_ZDIM; i++)
-        for(j = 0; j < F81_YDIM; j++)
-            for(k = 0; k < F81_XDIM; k++)
-                for(l = 0; l < F81_WDIM; l++)
-            dset1[i][j][k][l] = i*F81_YDIM*F81_XDIM*F81_WDIM + j*F81_XDIM*F81_WDIM + k*F81_WDIM + l;
-
-    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-    H5Sclose(space);
-    H5Dclose(dataset);
-
-    H5Fclose(fid);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- *-------------------------------------------------------------------------
- */
-
-int main(void)
-{
-    gent_group();
-    gent_attribute();
-    gent_softlink();
-    gent_softlink2();
-    gent_dataset();
-    gent_hardlink();
-    gent_extlink();
-    gent_udlink();
-    gent_compound_dt();
-    gent_all();
-    gent_loop();
-    gent_dataset2();
-    gent_compound_dt2();
-    gent_loop2();
-    gent_many();
-    gent_str();
-    gent_str2();
-    gent_enum();
-    gent_objref();
-    gent_datareg();
-    gent_attrreg();
-    gent_nestcomp();
-    gent_opaque();
-    gent_bitfields();
-    gent_vldatatypes();
-    gent_vldatatypes2();
-    gent_vldatatypes3();
-    gent_vldatatypes4();
-    gent_vldatatypes5();
-    gent_array1_big();
-    gent_array1();
-    gent_array2();
-    gent_array3();
-    gent_array4();
-    gent_array5();
-    gent_array6();
-    gent_array7();
-    gent_array8();
-    gent_empty();
-    gent_group_comments();
-    gent_split_file();
-    gent_family();
-    gent_multi();
-    gent_large_objname();
-    gent_vlstr();
-    gent_char();
-    gent_attr_all();
-    gent_compound_complex();
-    gent_named_dtype_attr();
-    gent_null_space();
-    gent_zero_dim_size();
-
-    gent_filters();
-    gent_fvalues();
-    gent_fcontents();
-    gent_string();
-    gent_aindices();
-    gent_longlinks();
-    gent_ldouble();
-    gent_binary();
-    gent_bigdims();
-    gent_hyperslab();
-    gent_group_creation_order();
-    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();
-    gent_compound_attr_intsizes();
-
-    gent_nested_compound_dt();
-    gent_intscalars();
-    gent_attr_intscalars();
-    gent_string_scalars();
-    gent_compound_int_array();
-    gent_compound_ints();
-    gent_intattrscalars();
-    gent_intsattrs();
-    gent_bitnopaquefields();
-
-    gent_intsfourdims();
-
-    return 0;
-}
-
diff --git a/tools/h5dump/testh5dump.sh.in b/tools/h5dump/testh5dump.sh.in
deleted file mode 100644
index 944fb85..0000000
--- a/tools/h5dump/testh5dump.sh.in
+++ /dev/null
@@ -1,1339 +0,0 @@
-#! /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
-
-srcdir=@srcdir@
-
-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'
-DIFF='diff -c'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-# Skip plugin module to test missing filter
-ENVCMD="env HDF5_PLUGIN_PRELOAD=::"
-
-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/std
-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/charsets.h5
-$SRC_H5DUMP_TESTFILES/file_space.h5
-$SRC_H5DUMP_TESTFILES/filter_fail.h5
-$SRC_H5DUMP_TESTFILES/packedbits.h5
-$SRC_H5DUMP_TESTFILES/taindices.h5
-$SRC_H5DUMP_TESTFILES/tall.h5
-$SRC_H5DUMP_TESTFILES/tarray1.h5
-$SRC_H5DUMP_TESTFILES/tarray1_big.h5
-$SRC_H5DUMP_TESTFILES/tarray2.h5
-$SRC_H5DUMP_TESTFILES/tarray3.h5
-$SRC_H5DUMP_TESTFILES/tarray4.h5
-$SRC_H5DUMP_TESTFILES/tarray5.h5
-$SRC_H5DUMP_TESTFILES/tarray6.h5
-$SRC_H5DUMP_TESTFILES/tarray7.h5
-$SRC_H5DUMP_TESTFILES/tarray8.h5
-$SRC_H5DUMP_TESTFILES/tattr.h5
-$SRC_H5DUMP_TESTFILES/tattr2.h5
-$SRC_H5DUMP_TESTFILES/tattr4_be.h5
-$SRC_H5DUMP_TESTFILES/tattrintsize.h5
-$SRC_H5DUMP_TESTFILES/tattrreg.h5
-$SRC_H5DUMP_TESTFILES/tbigdims.h5
-$SRC_H5DUMP_TESTFILES/tbinary.h5
-$SRC_H5DUMP_TESTFILES/tchar.h5
-$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.h5
-$SRC_H5DUMP_TESTFILES/tcmpdintsize.h5
-$SRC_H5DUMP_TESTFILES/tcompound.h5
-$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
-$SRC_H5DUMP_TESTFILES/tdatareg.h5
-$SRC_H5DUMP_TESTFILES/tdset.h5
-$SRC_H5DUMP_TESTFILES/tempty.h5
-$SRC_H5DUMP_TESTFILES/tsoftlinks.h5
-$SRC_H5DUMP_TESTFILES/textlinkfar.h5
-$SRC_H5DUMP_TESTFILES/textlinksrc.h5
-$SRC_H5DUMP_TESTFILES/textlinktar.h5
-$SRC_H5DUMP_TESTFILES/textlink.h5
-$SRC_H5DUMP_TESTFILES/tfamily00000.h5
-$SRC_H5DUMP_TESTFILES/tfamily00001.h5
-$SRC_H5DUMP_TESTFILES/tfamily00002.h5
-$SRC_H5DUMP_TESTFILES/tfamily00003.h5
-$SRC_H5DUMP_TESTFILES/tfamily00004.h5
-$SRC_H5DUMP_TESTFILES/tfamily00005.h5
-$SRC_H5DUMP_TESTFILES/tfamily00006.h5
-$SRC_H5DUMP_TESTFILES/tfamily00007.h5
-$SRC_H5DUMP_TESTFILES/tfamily00008.h5
-$SRC_H5DUMP_TESTFILES/tfamily00009.h5
-$SRC_H5DUMP_TESTFILES/tfamily00010.h5
-$SRC_H5DUMP_TESTFILES/tfcontents1.h5
-$SRC_H5DUMP_TESTFILES/tfcontents2.h5
-$SRC_H5DUMP_TESTFILES/tfilters.h5
-$SRC_H5DUMP_TESTFILES/tfpformat.h5
-$SRC_H5DUMP_TESTFILES/tfvalues.h5
-$SRC_H5DUMP_TESTFILES/tgroup.h5
-$SRC_H5DUMP_TESTFILES/tgrp_comments.h5
-$SRC_H5DUMP_TESTFILES/thlink.h5
-$SRC_H5DUMP_TESTFILES/thyperslab.h5
-$SRC_H5DUMP_TESTFILES/tintsattrs.h5
-$SRC_H5DUMP_TESTFILES/tints4dims.h5
-$SRC_H5DUMP_TESTFILES/tlarge_objname.h5
-#$SRC_H5DUMP_TESTFILES/tldouble.h5
-$SRC_H5DUMP_TESTFILES/tlonglinks.h5
-$SRC_H5DUMP_TESTFILES/tloop.h5
-$SRC_H5DUMP_TESTFILES/tmulti-b.h5
-$SRC_H5DUMP_TESTFILES/tmulti-g.h5
-$SRC_H5DUMP_TESTFILES/tmulti-l.h5
-$SRC_H5DUMP_TESTFILES/tmulti-o.h5
-$SRC_H5DUMP_TESTFILES/tmulti-r.h5
-$SRC_H5DUMP_TESTFILES/tmulti-s.h5
-$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
-$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
-$SRC_H5DUMP_TESTFILES/tnestedcmpddt.h5
-$SRC_H5DUMP_TESTFILES/tno-subset.h5
-$SRC_H5DUMP_TESTFILES/tnullspace.h5
-$SRC_H5DUMP_TESTFILES/zerodim.h5
-$SRC_H5DUMP_TESTFILES/torderattr.h5
-$SRC_H5DUMP_TESTFILES/tordergr.h5
-$SRC_H5DUMP_TESTFILES/tsaf.h5
-$SRC_H5DUMP_TESTFILES/tscalarattrintsize.h5
-$SRC_H5DUMP_TESTFILES/tscalarintattrsize.h5
-$SRC_H5DUMP_TESTFILES/tscalarintsize.h5
-$SRC_H5DUMP_TESTFILES/tscalarstring.h5
-$SRC_H5DUMP_TESTFILES/tslink.h5
-$SRC_H5DUMP_TESTFILES/tsplit_file-m.h5
-$SRC_H5DUMP_TESTFILES/tsplit_file-r.h5
-$SRC_H5DUMP_TESTFILES/tstr.h5
-$SRC_H5DUMP_TESTFILES/tstr2.h5
-$SRC_H5DUMP_TESTFILES/tstr3.h5
-$SRC_H5DUMP_TESTFILES/tudlink.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
-$SRC_H5DUMP_TESTFILES/tvlstr.h5
-$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/non_existing.ddl
-$SRC_H5DUMP_TESTFILES/packedbits.ddl
-$SRC_H5DUMP_TESTFILES/tall-1.ddl
-$SRC_H5DUMP_TESTFILES/tall-2.ddl
-$SRC_H5DUMP_TESTFILES/tall-2A.ddl
-$SRC_H5DUMP_TESTFILES/tall-2A0.ddl
-$SRC_H5DUMP_TESTFILES/tall-2B.ddl
-$SRC_H5DUMP_TESTFILES/tall-3.ddl
-$SRC_H5DUMP_TESTFILES/tall-4s.ddl
-$SRC_H5DUMP_TESTFILES/tall-5s.ddl
-$SRC_H5DUMP_TESTFILES/tall-6.ddl
-$SRC_H5DUMP_TESTFILES/tall-6.exp
-$SRC_H5DUMP_TESTFILES/tall-7.ddl
-$SRC_H5DUMP_TESTFILES/tall-7N.ddl
-$SRC_H5DUMP_TESTFILES/tallfilters.ddl
-$SRC_H5DUMP_TESTFILES/tarray1.ddl
-$SRC_H5DUMP_TESTFILES/tarray1_big.ddl
-$SRC_H5DUMP_TESTFILES/tarray2.ddl
-$SRC_H5DUMP_TESTFILES/tarray3.ddl
-$SRC_H5DUMP_TESTFILES/tarray4.ddl
-$SRC_H5DUMP_TESTFILES/tarray5.ddl
-$SRC_H5DUMP_TESTFILES/tarray6.ddl
-$SRC_H5DUMP_TESTFILES/tarray7.ddl
-$SRC_H5DUMP_TESTFILES/tarray8.ddl
-$SRC_H5DUMP_TESTFILES/tattr-1.ddl
-$SRC_H5DUMP_TESTFILES/tattr-2.ddl
-$SRC_H5DUMP_TESTFILES/tattr-3.ddl
-$SRC_H5DUMP_TESTFILES/tattr-4_be.ddl
-$SRC_H5DUMP_TESTFILES/tattrcontents1.ddl
-$SRC_H5DUMP_TESTFILES/tattrcontents2.ddl
-$SRC_H5DUMP_TESTFILES/tattrintsize.ddl
-$SRC_H5DUMP_TESTFILES/tattrreg.ddl
-$SRC_H5DUMP_TESTFILES/tattrregR.ddl
-$SRC_H5DUMP_TESTFILES/tbin1.ddl
-$SRC_H5DUMP_TESTFILES/tbin1.ddl
-$SRC_H5DUMP_TESTFILES/tbin2.ddl
-$SRC_H5DUMP_TESTFILES/tbin3.ddl
-$SRC_H5DUMP_TESTFILES/tbin4.ddl
-$SRC_H5DUMP_TESTFILES/tbinregR.ddl
-$SRC_H5DUMP_TESTFILES/tbigdims.ddl
-$SRC_H5DUMP_TESTFILES/tboot1.ddl
-$SRC_H5DUMP_TESTFILES/tboot2.ddl
-$SRC_H5DUMP_TESTFILES/tboot2A.ddl
-$SRC_H5DUMP_TESTFILES/tboot2B.ddl
-$SRC_H5DUMP_TESTFILES/tchar1.ddl
-$SRC_H5DUMP_TESTFILES/tchunked.ddl
-$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.ddl
-$SRC_H5DUMP_TESTFILES/tcmpdintsize.ddl
-$SRC_H5DUMP_TESTFILES/tcomp-1.ddl
-$SRC_H5DUMP_TESTFILES/tcomp-2.ddl
-$SRC_H5DUMP_TESTFILES/tcomp-3.ddl
-$SRC_H5DUMP_TESTFILES/tcomp-4.ddl
-$SRC_H5DUMP_TESTFILES/tcompact.ddl
-$SRC_H5DUMP_TESTFILES/tcontents.ddl
-$SRC_H5DUMP_TESTFILES/tcontiguos.ddl
-$SRC_H5DUMP_TESTFILES/tdatareg.ddl
-$SRC_H5DUMP_TESTFILES/tdataregR.ddl
-$SRC_H5DUMP_TESTFILES/tdeflate.ddl
-$SRC_H5DUMP_TESTFILES/tdset-1.ddl
-$SRC_H5DUMP_TESTFILES/tdset-2.ddl
-$SRC_H5DUMP_TESTFILES/tdset-3s.ddl
-$SRC_H5DUMP_TESTFILES/tempty.ddl
-$SRC_H5DUMP_TESTFILES/texceedsubstart.ddl
-$SRC_H5DUMP_TESTFILES/texceedsubcount.ddl
-$SRC_H5DUMP_TESTFILES/texceedsubstride.ddl
-$SRC_H5DUMP_TESTFILES/texceedsubblock.ddl
-$SRC_H5DUMP_TESTFILES/texternal.ddl
-$SRC_H5DUMP_TESTFILES/textlinksrc.ddl
-$SRC_H5DUMP_TESTFILES/textlinkfar.ddl
-$SRC_H5DUMP_TESTFILES/textlink.ddl
-$SRC_H5DUMP_TESTFILES/tfamily.ddl
-$SRC_H5DUMP_TESTFILES/tfill.ddl
-$SRC_H5DUMP_TESTFILES/tfletcher32.ddl
-$SRC_H5DUMP_TESTFILES/tfpformat.ddl
-$SRC_H5DUMP_TESTFILES/tgroup-1.ddl
-$SRC_H5DUMP_TESTFILES/tgroup-2.ddl
-$SRC_H5DUMP_TESTFILES/tgrp_comments.ddl
-$SRC_H5DUMP_TESTFILES/thlink-1.ddl
-$SRC_H5DUMP_TESTFILES/thlink-2.ddl
-$SRC_H5DUMP_TESTFILES/thlink-3.ddl
-$SRC_H5DUMP_TESTFILES/thlink-4.ddl
-$SRC_H5DUMP_TESTFILES/thlink-5.ddl
-$SRC_H5DUMP_TESTFILES/thyperslab.ddl
-$SRC_H5DUMP_TESTFILES/tindicesno.ddl
-$SRC_H5DUMP_TESTFILES/tindicessub1.ddl
-$SRC_H5DUMP_TESTFILES/tindicessub2.ddl
-$SRC_H5DUMP_TESTFILES/tindicessub3.ddl
-$SRC_H5DUMP_TESTFILES/tindicessub4.ddl
-$SRC_H5DUMP_TESTFILES/tindicesyes.ddl
-$SRC_H5DUMP_TESTFILES/tints4dims.ddl
-$SRC_H5DUMP_TESTFILES/tints4dimsBlock2.ddl
-$SRC_H5DUMP_TESTFILES/tints4dimsBlockEq.ddl
-$SRC_H5DUMP_TESTFILES/tints4dimsCount2.ddl
-$SRC_H5DUMP_TESTFILES/tints4dimsCountEq.ddl
-$SRC_H5DUMP_TESTFILES/tints4dimsStride2.ddl
-$SRC_H5DUMP_TESTFILES/tintsattrs.ddl
-$SRC_H5DUMP_TESTFILES/tlarge_objname.ddl
-#$SRC_H5DUMP_TESTFILES/tldouble.ddl
-$SRC_H5DUMP_TESTFILES/tlonglinks.ddl
-$SRC_H5DUMP_TESTFILES/tloop-1.ddl
-$SRC_H5DUMP_TESTFILES/tmulti.ddl
-$SRC_H5DUMP_TESTFILES/tmultifile.ddl
-$SRC_H5DUMP_TESTFILES/tqmarkfile.ddl
-$SRC_H5DUMP_TESTFILES/tstarfile.ddl
-$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.ddl
-$SRC_H5DUMP_TESTFILES/tnestcomp-1.ddl
-$SRC_H5DUMP_TESTFILES/tnestedcmpddt.ddl
-$SRC_H5DUMP_TESTFILES/tnbit.ddl
-$SRC_H5DUMP_TESTFILES/tnoattrdata.ddl
-$SRC_H5DUMP_TESTFILES/tnoattrddl.ddl
-$SRC_H5DUMP_TESTFILES/tnodata.ddl
-$SRC_H5DUMP_TESTFILES/tnoddl.ddl
-$SRC_H5DUMP_TESTFILES/tnoddlfile.ddl
-$SRC_H5DUMP_TESTFILES/tnoddlfile.exp
-$SRC_H5DUMP_TESTFILES/tno-subset.ddl
-$SRC_H5DUMP_TESTFILES/tnullspace.ddl
-$SRC_H5DUMP_TESTFILES/trawdatafile.ddl
-$SRC_H5DUMP_TESTFILES/trawdatafile.exp
-$SRC_H5DUMP_TESTFILES/trawssetfile.ddl
-$SRC_H5DUMP_TESTFILES/trawssetfile.exp
-$SRC_H5DUMP_TESTFILES/zerodim.ddl
-$SRC_H5DUMP_TESTFILES/tordergr1.ddl
-$SRC_H5DUMP_TESTFILES/tordergr2.ddl
-$SRC_H5DUMP_TESTFILES/tordergr3.ddl
-$SRC_H5DUMP_TESTFILES/tordergr4.ddl
-$SRC_H5DUMP_TESTFILES/tordergr5.ddl
-$SRC_H5DUMP_TESTFILES/torderattr1.ddl
-$SRC_H5DUMP_TESTFILES/torderattr2.ddl
-$SRC_H5DUMP_TESTFILES/torderattr3.ddl
-$SRC_H5DUMP_TESTFILES/torderattr4.ddl
-$SRC_H5DUMP_TESTFILES/tordercontents1.ddl
-$SRC_H5DUMP_TESTFILES/tordercontents2.ddl
-$SRC_H5DUMP_TESTFILES/torderlinks1.ddl
-$SRC_H5DUMP_TESTFILES/torderlinks2.ddl
-$SRC_H5DUMP_TESTFILES/tperror.ddl
-$SRC_H5DUMP_TESTFILES/treadfilter.ddl
-$SRC_H5DUMP_TESTFILES/treadintfilter.ddl
-$SRC_H5DUMP_TESTFILES/treference.ddl
-$SRC_H5DUMP_TESTFILES/tsaf.ddl
-$SRC_H5DUMP_TESTFILES/tscalarattrintsize.ddl
-$SRC_H5DUMP_TESTFILES/tscalarintattrsize.ddl
-$SRC_H5DUMP_TESTFILES/tscalarintsize.ddl
-$SRC_H5DUMP_TESTFILES/tscalarstring.ddl
-$SRC_H5DUMP_TESTFILES/tscaleoffset.ddl
-$SRC_H5DUMP_TESTFILES/tshuffle.ddl
-$SRC_H5DUMP_TESTFILES/tslink-1.ddl
-$SRC_H5DUMP_TESTFILES/tslink-2.ddl
-$SRC_H5DUMP_TESTFILES/tslink-D.ddl
-$SRC_H5DUMP_TESTFILES/tsplit_file.ddl
-$SRC_H5DUMP_TESTFILES/tstr-1.ddl
-$SRC_H5DUMP_TESTFILES/tstr-2.ddl
-$SRC_H5DUMP_TESTFILES/tstr2bin2.exp
-$SRC_H5DUMP_TESTFILES/tstr2bin6.exp
-$SRC_H5DUMP_TESTFILES/tstring.ddl
-$SRC_H5DUMP_TESTFILES/tstring2.ddl
-$SRC_H5DUMP_TESTFILES/tstringe.ddl
-$SRC_H5DUMP_TESTFILES/tszip.ddl
-$SRC_H5DUMP_TESTFILES/tudlink-1.ddl
-$SRC_H5DUMP_TESTFILES/tudlink-2.ddl
-$SRC_H5DUMP_TESTFILES/tuserfilter.ddl
-$SRC_H5DUMP_TESTFILES/tvldtypes1.ddl
-$SRC_H5DUMP_TESTFILES/tvldtypes2.ddl
-$SRC_H5DUMP_TESTFILES/tvldtypes3.ddl
-$SRC_H5DUMP_TESTFILES/tvldtypes4.ddl
-$SRC_H5DUMP_TESTFILES/tvldtypes5.ddl
-$SRC_H5DUMP_TESTFILES/tvlstr.ddl
-$SRC_H5DUMP_TESTFILES/tvms.ddl
-$SRC_H5DUMP_TESTFILES/twidedisplay.ddl
-$SRC_H5DUMP_TESTFILES/twithddl.exp
-$SRC_H5DUMP_TESTFILES/twithddlfile.ddl
-$SRC_H5DUMP_TESTFILES/twithddlfile.exp
-$SRC_H5DUMP_TESTFILES/h5dump-help.txt
-$SRC_H5DUMP_TESTFILES/out3.h5import
-$SRC_H5DUMP_TESTFILES/tbinregR.exp
-"
-
-LIST_ERROR_TEST_FILES="
-${SRC_H5DUMP_ERRORFILES}/filter_fail.err
-${SRC_H5DUMP_ERRORFILES}/non_existing.err
-${SRC_H5DUMP_ERRORFILES}/tall-1.err
-${SRC_H5DUMP_ERRORFILES}/tall-2A.err
-${SRC_H5DUMP_ERRORFILES}/tall-2A0.err
-${SRC_H5DUMP_ERRORFILES}/tall-2B.err
-${SRC_H5DUMP_ERRORFILES}/tarray1_big.err
-${SRC_H5DUMP_ERRORFILES}/tattr-3.err
-${SRC_H5DUMP_ERRORFILES}/tattrregR.err
-${SRC_H5DUMP_ERRORFILES}/tcomp-3.err
-${SRC_H5DUMP_ERRORFILES}/tdataregR.err
-${SRC_H5DUMP_ERRORFILES}/tdset-2.err
-${SRC_H5DUMP_ERRORFILES}/texceedsubblock.err
-${SRC_H5DUMP_ERRORFILES}/texceedsubcount.err
-${SRC_H5DUMP_ERRORFILES}/texceedsubstart.err
-${SRC_H5DUMP_ERRORFILES}/texceedsubstride.err
-${SRC_H5DUMP_ERRORFILES}/textlink.err
-${SRC_H5DUMP_ERRORFILES}/textlinkfar.err
-${SRC_H5DUMP_ERRORFILES}/textlinksrc.err
-${SRC_H5DUMP_ERRORFILES}/tgroup-2.err
-${SRC_H5DUMP_ERRORFILES}/torderlinks1.err
-${SRC_H5DUMP_ERRORFILES}/torderlinks2.err
-${SRC_H5DUMP_ERRORFILES}/tperror.err
-${SRC_H5DUMP_ERRORFILES}/tqmarkfile.err
-${SRC_H5DUMP_ERRORFILES}/tslink-D.err
-"
-
-#
-# 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.
-# If $1 == ignorecase then do caseless CMP and DIFF.
-# ADD_H5_TEST
-TOOLTEST() {
-    # check if caseless compare and diff requested
-    if [ "$1" = ignorecase ]; then
-    caseless="-i"
-    # replace cmp with diff which runs much longer.
-    xCMP="$DIFF -i"
-    shift
-    else
-    caseless=""
-    # stick with faster cmp if ignorecase is not requested.
-    xCMP="$CMP"
-    fi
-
-    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 $xCMP $expect $actual > /dev/null 2>&1 ; then
-     echo " PASSED"
-    else
-     echo "*FAILED*"
-     echo "    Expected result (*.ddl) differs from actual result (*.out)"
-     nerrors="`expr $nerrors + 1`"
-     test yes = "$verbose" && $DIFF $caseless $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
-# ADD_H5_EXPORT_TEST
-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 TOOLTEST2 but compares generated file to expected ddl file
-#                   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
-# ADD_H5_TEST_EXPORT
-TOOLTEST2A() {
-
-    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
-    expectmeta="$TESTDIR/$1"
-    actualmeta="$TESTDIR/`basename $1 .exp`.txt"
-    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 $DIFF $expectdata $actualdata; then
-        if [ ! -f $expectmeta ]; then
-        # Create the expect meta file if it doesn't yet exist.
-          echo " CREATED"
-          cp $actualmeta $expectmeta
-        elif $CMP $expectmeta $actualmeta; then
-          echo " PASSED"
-        else
-          echo "*FAILED*"
-          echo "    Expected metafile (*.ddl) differs from actual metafile (*.txt)"
-          nerrors="`expr $nerrors + 1`"
-          test yes = "$verbose" && $DIFF $expectmeta $actualmeta |sed 's/^/    /'
-        fi
-      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 $actualmeta
-    fi
-
-}
-
-# same as TOOLTEST2 but only compares the generated data file to the expected data file
-# used for the binary tests that expect a full path in -o with -b
-# ADD_H5_EXPORT_TEST
-TOOLTEST2B() {
-
-    expectdata="$TESTDIR/$1"
-    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 $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
-
-    # 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
-# ADD_H5ERR_MASK_TEST
-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
-
-}
-
-# same as TOOLTEST4 but disables plugin filter loading
-# silences extra error output on some platforms
-# ADD_H5ERR_MASK_TEST
-TOOLTEST5() {
-
-    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
-      $ENVCMD $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
-
-}
-# ADD_HELP_TEST
-TOOLTEST_HELP() {
-
-    expect="$TESTDIR/$1"
-    actual="$TESTDIR/`basename $1 .txt`.out"
-    actual_err="$TESTDIR/`basename $1 .txt`.err"
-    shift
-
-    # Run test.
-    TESTING $DUMPER $@
-    (
-      cd $TESTDIR
-      $RUNSERIAL $DUMPER_BIN "$@"
-    ) >$actual 2>$actual_err
-    cat $actual_err >> $actual
-
-    if [ ! -f $expectdata ]; then
-    # Create the expect data file if it doesn't yet exist.
-      echo " CREATED"
-      cp $actual $expect-CREATED
-    elif $CMP $expect $actual; then
-      echo " PASSED"
-    else
-      echo "*FAILED*"
-      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
-    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
-
-TOOLTEST_HELP h5dump-help.txt -h
-
-# test data output redirection
-TOOLTEST tnoddl.ddl --enable-error-stack --ddl -y packedbits.h5
-TOOLTEST tnodata.ddl --enable-error-stack --output packedbits.h5
-TOOLTEST tnoattrddl.ddl --enable-error-stack -O -y tattr.h5
-TOOLTEST tnoattrdata.ddl --enable-error-stack -A -o tattr.h5
-TOOLTEST2 trawdatafile.exp --enable-error-stack -y -o trawdatafile.txt packedbits.h5
-TOOLTEST2 tnoddlfile.exp --enable-error-stack -O -y -o tnoddlfile.txt packedbits.h5
-TOOLTEST2A twithddlfile.exp twithddl.exp --enable-error-stack --ddl=twithddl.txt -y -o twithddlfile.txt packedbits.h5
-TOOLTEST2 trawssetfile.exp --enable-error-stack -d "/dset1[1,1;;;]" -y -o trawssetfile.txt tdset.h5
-
-# test for maximum display datasets
-TOOLTEST twidedisplay.ddl --enable-error-stack -w0 packedbits.h5
-
-# test for signed/unsigned datasets
-TOOLTEST packedbits.ddl --enable-error-stack packedbits.h5
-# test for compound signed/unsigned datasets
-TOOLTEST tcmpdintsize.ddl --enable-error-stack tcmpdintsize.h5
-# test for signed/unsigned scalar datasets
-TOOLTEST tscalarintsize.ddl --enable-error-stack tscalarintsize.h5
-# test for signed/unsigned attributes
-TOOLTEST tattrintsize.ddl --enable-error-stack tattrintsize.h5
-# test for compound signed/unsigned attributes
-TOOLTEST tcmpdattrintsize.ddl --enable-error-stack tcmpdattrintsize.h5
-# test for signed/unsigned scalar attributes
-TOOLTEST tscalarattrintsize.ddl --enable-error-stack tscalarattrintsize.h5
-# test for signed/unsigned scalar datasets with attributes
-TOOLTEST tscalarintattrsize.ddl --enable-error-stack tscalarintattrsize.h5
-# test for signed/unsigned datasets attributes
-TOOLTEST tintsattrs.ddl --enable-error-stack tintsattrs.h5
-# test for string scalar dataset attribute
-TOOLTEST tscalarstring.ddl --enable-error-stack tscalarstring.h5
-# test for displaying groups
-TOOLTEST tgroup-1.ddl --enable-error-stack tgroup.h5
-# test for displaying the selected groups
-TOOLTEST4 tgroup-2.ddl --enable-error-stack --group=/g2 --group / -g /y tgroup.h5
-
-# test for displaying simple space datasets
-TOOLTEST tdset-1.ddl --enable-error-stack tdset.h5
-# test for displaying selected datasets
-TOOLTEST4 tdset-2.ddl --enable-error-stack -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5
-
-# test for displaying attributes
-TOOLTEST tattr-1.ddl --enable-error-stack tattr.h5
-# test for displaying the selected attributes of string type and scalar space
-TOOLTEST tattr-2.ddl --enable-error-stack -a "/\/attr1" --attribute /attr4 --attribute=/attr5 tattr.h5
-TOOLTEST tattr-2.ddl --enable-error-stack -N "/\/attr1" --any_path /attr4 --any_path=/attr5 tattr.h5
-# test for header and error messages
-TOOLTEST4 tattr-3.ddl --enable-error-stack --header -a /attr2 --attribute=/attr tattr.h5
-# test for displaying at least 9 attributes on root from a BE machine
-TOOLTEST tattr-4_be.ddl --enable-error-stack tattr4_be.h5
-# test for displaying attributes in shared datatype (also in group and dataset)
-TOOLTEST tnamed_dtype_attr.ddl --enable-error-stack tnamed_dtype_attr.h5
-
-# test for displaying soft links and user-defined links
-TOOLTEST tslink-1.ddl --enable-error-stack tslink.h5
-TOOLTEST tudlink-1.ddl --enable-error-stack tudlink.h5
-# test for displaying the selected link
-TOOLTEST tslink-2.ddl --enable-error-stack -l slink2 tslink.h5
-TOOLTEST tslink-2.ddl --enable-error-stack -N slink2 tslink.h5
-TOOLTEST tudlink-2.ddl --enable-error-stack -l udlink2 tudlink.h5
-# test for displaying dangling soft links
-TOOLTEST4 tslink-D.ddl --enable-error-stack -d /slink1 tslink.h5
-
-# tests for hard links
-TOOLTEST thlink-1.ddl --enable-error-stack thlink.h5
-TOOLTEST thlink-2.ddl --enable-error-stack -d /g1/dset2 --dataset /dset1 --dataset=/g1/g1.1/dset3 thlink.h5
-TOOLTEST thlink-3.ddl --enable-error-stack -d /g1/g1.1/dset3 --dataset /g1/dset2 --dataset=/dset1 thlink.h5
-TOOLTEST thlink-4.ddl --enable-error-stack -g /g1 thlink.h5
-TOOLTEST thlink-4.ddl --enable-error-stack -N /g1 thlink.h5
-TOOLTEST thlink-5.ddl --enable-error-stack -d /dset1 -g /g2 -d /g1/dset2 thlink.h5
-TOOLTEST thlink-5.ddl --enable-error-stack -N /dset1 -N /g2 -N /g1/dset2 thlink.h5
-
-# tests for compound data types
-TOOLTEST tcomp-1.ddl --enable-error-stack tcompound.h5
-# test for named data types
-TOOLTEST tcomp-2.ddl --enable-error-stack -t /type1 --datatype /type2 --datatype=/group1/type3 tcompound.h5
-TOOLTEST tcomp-2.ddl --enable-error-stack -N /type1 --any_path /type2 --any_path=/group1/type3 tcompound.h5
-# test for unamed type
-TOOLTEST4 tcomp-3.ddl --enable-error-stack -t /#6632 -g /group2 tcompound.h5
-# test complicated compound datatype
-TOOLTEST tcomp-4.ddl --enable-error-stack tcompound_complex.h5
-# tests for bitfields and opaque data types
-TOOLTEST tbitnopaque.ddl --enable-error-stack tbitnopaque.h5
-
-#test for the nested compound type
-TOOLTEST tnestcomp-1.ddl --enable-error-stack tnestedcomp.h5
-TOOLTEST tnestedcmpddt.ddl --enable-error-stack tnestedcmpddt.h5
-
-# test for options
-TOOLTEST4 tall-1.ddl --enable-error-stack tall.h5
-TOOLTEST tall-2.ddl --enable-error-stack --header -g /g1/g1.1 -a attr2 tall.h5
-TOOLTEST tall-3.ddl --enable-error-stack -d /g2/dset2.1 -l /g1/g1.2/g1.2.1/slink tall.h5
-TOOLTEST tall-3.ddl --enable-error-stack -N /g2/dset2.1 -N /g1/g1.2/g1.2.1/slink tall.h5
-TOOLTEST tall-7.ddl --enable-error-stack -a attr1 tall.h5
-TOOLTEST tall-7N.ddl --enable-error-stack -N attr1 tall.h5
-
-# test for loop detection
-TOOLTEST tloop-1.ddl --enable-error-stack tloop.h5
-
-# test for string
-TOOLTEST tstr-1.ddl --enable-error-stack tstr.h5
-TOOLTEST tstr-2.ddl --enable-error-stack tstr2.h5
-
-# test for file created by Lib SAF team
-TOOLTEST tsaf.ddl --enable-error-stack tsaf.h5
-
-# test for file with variable length data
-TOOLTEST tvldtypes1.ddl --enable-error-stack tvldtypes1.h5
-TOOLTEST tvldtypes2.ddl --enable-error-stack tvldtypes2.h5
-TOOLTEST tvldtypes3.ddl --enable-error-stack tvldtypes3.h5
-TOOLTEST tvldtypes4.ddl --enable-error-stack tvldtypes4.h5
-TOOLTEST tvldtypes5.ddl --enable-error-stack tvldtypes5.h5
-
-#test for file with variable length string data
-TOOLTEST tvlstr.ddl --enable-error-stack tvlstr.h5
-
-# test for files with array data
-TOOLTEST tarray1.ddl --enable-error-stack tarray1.h5
-# # added for bug# 2092 - tarray1_big.h
-TOOLTEST4 tarray1_big.ddl --enable-error-stack -R tarray1_big.h5
-TOOLTEST tarray2.ddl --enable-error-stack tarray2.h5
-TOOLTEST tarray3.ddl --enable-error-stack tarray3.h5
-TOOLTEST tarray4.ddl --enable-error-stack tarray4.h5
-TOOLTEST tarray5.ddl --enable-error-stack tarray5.h5
-TOOLTEST tarray6.ddl --enable-error-stack tarray6.h5
-TOOLTEST tarray7.ddl --enable-error-stack tarray7.h5
-TOOLTEST tarray8.ddl --enable-error-stack tarray8.h5
-
-# test for wildcards in filename (does not work with cmake)
-# inconsistent across platforms TOOLTEST3 tstarfile.ddl --enable-error-stack -H -d Dataset1 tarr*.h5
-#TOOLTEST4 tqmarkfile.ddl --enable-error-stack -H -d Dataset1 tarray?.h5
-TOOLTEST tmultifile.ddl --enable-error-stack -H -d Dataset1 tarray2.h5 tarray3.h5 tarray4.h5 tarray5.h5 tarray6.h5 tarray7.h5
-
-# test for files with empty data
-TOOLTEST tempty.ddl --enable-error-stack tempty.h5
-
-# test for files with groups that have comments
-TOOLTEST tgrp_comments.ddl --enable-error-stack tgrp_comments.h5
-
-# test the --filedriver flag
-TOOLTEST tsplit_file.ddl --enable-error-stack --filedriver=split tsplit_file
-TOOLTEST tfamily.ddl --enable-error-stack --filedriver=family tfamily%05d.h5
-TOOLTEST tmulti.ddl --enable-error-stack --filedriver=multi tmulti
-
-# test for files with group names which reach > 1024 bytes in size
-TOOLTEST tlarge_objname.ddl --enable-error-stack -w157 tlarge_objname.h5
-
-# test '-A' to suppress data but print attr's
-TOOLTEST4 tall-2A.ddl --enable-error-stack -A tall.h5
-
-# test '-A' to suppress attr's but print data
-TOOLTEST4 tall-2A0.ddl --enable-error-stack -A 0 tall.h5
-
-# test '-r' to print attributes in ASCII instead of decimal
-TOOLTEST4 tall-2B.ddl --enable-error-stack -A -r tall.h5
-
-# test Subsetting
-TOOLTEST tall-4s.ddl --enable-error-stack --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5
-TOOLTEST tall-5s.ddl --enable-error-stack -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5
-TOOLTEST tdset-3s.ddl --enable-error-stack -d "/dset1[1,1;;;]" tdset.h5
-TOOLTEST tno-subset.ddl --enable-error-stack --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0" tno-subset.h5
-
-TOOLTEST tints4dimsCount2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 2,2,2,2 tints4dims.h5
-TOOLTEST tints4dimsBlock2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 1,1,1,1 -k 2,2,2,2 tints4dims.h5
-TOOLTEST tints4dimsStride2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,2,2 -c 2,2,2,2 tints4dims.h5
-TOOLTEST tints4dimsCountEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -k 1,2,1,1 -c 2,2,4,4 tints4dims.h5
-TOOLTEST tints4dimsBlockEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -c 2,2,1,1 -k 1,2,4,4 tints4dims.h5
-
-# test printing characters in ASCII instead of decimal
-TOOLTEST tchar1.ddl --enable-error-stack -r tchar.h5
-
-# test datatypes in ASCII and UTF8
-TOOLTEST charsets.ddl --enable-error-stack charsets.h5
-
-# rev. 2004
-
-# tests for super block
-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
-
-# test for file contents
-TOOLTEST tcontents.ddl --enable-error-stack -n tfcontents1.h5
-TOOLTEST tordercontents1.ddl --enable-error-stack -n --sort_by=name --sort_order=ascending tfcontents1.h5
-TOOLTEST tordercontents2.ddl --enable-error-stack -n --sort_by=name --sort_order=descending tfcontents1.h5
-TOOLTEST tattrcontents1.ddl --enable-error-stack -n 1 --sort_order=ascending tall.h5
-TOOLTEST tattrcontents2.ddl --enable-error-stack -n 1 --sort_order=descending tall.h5
-
-# tests for storage layout
-# compact
-TOOLTEST tcompact.ddl --enable-error-stack -H -p -d compact tfilters.h5
-# contiguous
-TOOLTEST tcontiguos.ddl --enable-error-stack -H -p -d contiguous tfilters.h5
-# chunked
-TOOLTEST tchunked.ddl --enable-error-stack -H -p -d chunked tfilters.h5
-# external
-TOOLTEST texternal.ddl --enable-error-stack -H -p -d external tfilters.h5
-
-# fill values
-TOOLTEST tfill.ddl --enable-error-stack -p tfvalues.h5
-
-# several datatype, with references , print path
-TOOLTEST treference.ddl --enable-error-stack tattr2.h5
-
-# escape/not escape non printable characters
-TOOLTEST tstringe.ddl --enable-error-stack -e tstr3.h5
-TOOLTEST tstring.ddl --enable-error-stack tstr3.h5
-# char data as ASCII with non escape
-TOOLTEST tstring2.ddl --enable-error-stack -r -d str4 tstr3.h5
-
-# array indices print/not print
-TOOLTEST tindicesyes.ddl --enable-error-stack taindices.h5
-TOOLTEST tindicesno.ddl --enable-error-stack -y taindices.h5
-
-########## array indices with subsetting
-# 1D case
-TOOLTEST tindicessub1.ddl --enable-error-stack -d 1d -s 1 -S 10 -c 2  -k 3 taindices.h5
-
-# 2D case
-TOOLTEST tindicessub2.ddl --enable-error-stack -d 2d -s 1,2  -S 3,3 -c 3,2 -k 2,2 taindices.h5
-
-# 3D case
-TOOLTEST tindicessub3.ddl --enable-error-stack -d 3d -s 0,1,2 -S 1,3,3 -c 2,2,2  -k 1,2,2  taindices.h5
-
-# 4D case
-TOOLTEST tindicessub4.ddl --enable-error-stack -d 4d -s 0,0,1,2  -c 2,2,3,2 -S 1,1,3,3 -k 1,1,2,2  taindices.h5
-
-#Exceed the dimensions for subsetting
-TOOLTEST texceedsubstart.ddl --enable-error-stack -d 1d -s 1,3 taindices.h5
-TOOLTEST texceedsubcount.ddl --enable-error-stack -d 1d -c 1,3 taindices.h5
-TOOLTEST texceedsubstride.ddl --enable-error-stack -d 1d -S 1,3 taindices.h5
-TOOLTEST texceedsubblock.ddl --enable-error-stack -d 1d -k 1,3 taindices.h5
-
-
-# tests for filters
-# SZIP
-TOOLTEST tszip.ddl --enable-error-stack -H -p -d szip tfilters.h5
-# deflate
-TOOLTEST tdeflate.ddl --enable-error-stack -H -p -d deflate tfilters.h5
-# shuffle
-TOOLTEST tshuffle.ddl --enable-error-stack -H -p -d shuffle tfilters.h5
-# fletcher32
-TOOLTEST tfletcher32.ddl --enable-error-stack -H -p -d fletcher32  tfilters.h5
-# nbit
-TOOLTEST tnbit.ddl --enable-error-stack -H -p -d nbit  tfilters.h5
-# scaleoffset
-TOOLTEST tscaleoffset.ddl --enable-error-stack -H -p -d scaleoffset  tfilters.h5
-# all
-TOOLTEST tallfilters.ddl --enable-error-stack -H -p -d all  tfilters.h5
-# user defined
-TOOLTEST tuserfilter.ddl --enable-error-stack -H  -p -d myfilter  tfilters.h5
-
-if test $USE_FILTER_DEFLATE = "yes" ; then
-  # data read internal filters
-  TOOLTEST treadintfilter.ddl --enable-error-stack -d deflate -d shuffle -d fletcher32 -d nbit -d scaleoffset tfilters.h5
-  if test $USE_FILTER_SZIP = "yes"; then
-    # data read
-    TOOLTEST treadfilter.ddl --enable-error-stack -d all -d szip tfilters.h5
-  fi
-fi
-
-# test for displaying objects with very long names
-TOOLTEST tlonglinks.ddl --enable-error-stack tlonglinks.h5
-
-# dimensions over 4GB, print boundary
-TOOLTEST tbigdims.ddl --enable-error-stack -d dset4gb -s 4294967284 -c 22 tbigdims.h5
-
-# hyperslab read
-TOOLTEST thyperslab.ddl --enable-error-stack thyperslab.h5
-
-
-#
-
-# test for displaying dataset and attribute of null space
-TOOLTEST tnullspace.ddl --enable-error-stack tnullspace.h5
-
-# test for displaying dataset and attribute of space with 0 dimension size
-TOOLTEST zerodim.ddl --enable-error-stack zerodim.h5
-
-# test for long double (some systems do not have long double)
-#TOOLTEST tldouble.ddl --enable-error-stack tldouble.h5
-
-# test for vms
-TOOLTEST tvms.ddl --enable-error-stack tvms.h5
-
-# test for binary output
-TOOLTEST tbin1.ddl --enable-error-stack -d integer -o out1.bin -b LE tbinary.h5
-
-# test for string binary output
-TOOLTEST2B tstr2bin2.exp --enable-error-stack -d /g2/dset2 -b -o tstr2bin2.txt tstr2.h5
-TOOLTEST2B tstr2bin6.exp --enable-error-stack -d /g6/dset6 -b -o tstr2bin6.txt tstr2.h5
-
-# NATIVE default. the NATIVE test can be validated with h5import/h5diff
-TOOLTEST   tbin1.ddl --enable-error-stack -d integer -o out1.bin  -b  tbinary.h5
-IMPORTTEST out1.bin -c out3.h5import -o out1.h5
-DIFFTEST   tbinary.h5 out1.h5 /integer /integer
-# Same but use h5dump as input to h5import
-IMPORTTEST out1.bin -c tbin1.ddl -o out1D.h5
-DIFFTEST   tbinary.h5 out1D.h5 /integer /integer
-
-TOOLTEST   tbin2.ddl --enable-error-stack -b BE -d float  -o out2.bin  tbinary.h5
-
-# the NATIVE test can be validated with h5import/h5diff
-TOOLTEST   tbin3.ddl --enable-error-stack -d integer -o out3.bin -b NATIVE tbinary.h5
-IMPORTTEST out3.bin -c out3.h5import -o out3.h5
-DIFFTEST   tbinary.h5 out3.h5 /integer /integer
-# Same but use h5dump as input to h5import
-IMPORTTEST out3.bin -c tbin3.ddl -o out3D.h5
-DIFFTEST   tbinary.h5 out3D.h5 /integer /integer
-
-TOOLTEST   tbin4.ddl --enable-error-stack -d double  -b FILE -o out4.bin    tbinary.h5
-
-# Clean up binary output files
-if test -z "$HDF5_NOCLEANUP"; then
- rm -f out[1-4].bin
- rm -f out1.h5
- rm -f out3.h5
-fi
-
-# test for dataset region references
-TOOLTEST  tdatareg.ddl --enable-error-stack tdatareg.h5
-TOOLTEST4 tdataregR.ddl --enable-error-stack -R tdatareg.h5
-TOOLTEST  tattrreg.ddl --enable-error-stack tattrreg.h5
-TOOLTEST4 tattrregR.ddl --enable-error-stack -R tattrreg.h5
-TOOLTEST2 tbinregR.exp --enable-error-stack -d /Dataset1 -s 0 -R -y -o tbinregR.txt    tdatareg.h5
-
-# Clean up text output files
-if test -z "$HDF5_NOCLEANUP"; then
- rm -f tbinregR.txt
-fi
-
-# tests for group creation order
-# "1" tracked, "2" name, root tracked
-TOOLTEST tordergr1.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=ascending tordergr.h5
-TOOLTEST tordergr2.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=descending tordergr.h5
-TOOLTEST tordergr3.ddl --enable-error-stack -g 2 -q name -z ascending tordergr.h5
-TOOLTEST tordergr4.ddl --enable-error-stack -g 2 -q name -z descending tordergr.h5
-TOOLTEST tordergr5.ddl --enable-error-stack -q creation_order tordergr.h5
-
-# tests for attribute order
-TOOLTEST torderattr1.ddl --enable-error-stack -H --sort_by=name --sort_order=ascending torderattr.h5
-TOOLTEST torderattr2.ddl --enable-error-stack -H --sort_by=name --sort_order=descending torderattr.h5
-TOOLTEST torderattr3.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=ascending torderattr.h5
-TOOLTEST torderattr4.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=descending torderattr.h5
-
-# tests for link references and order
-TOOLTEST4 torderlinks1.ddl --enable-error-stack --sort_by=name --sort_order=ascending tfcontents1.h5
-TOOLTEST4 torderlinks2.ddl --enable-error-stack --sort_by=name --sort_order=descending tfcontents1.h5
-
-# tests for floating point user defined printf format
-TOOLTEST tfpformat.ddl --enable-error-stack -m %.7f tfpformat.h5
-
-# tests for traversal of external links
-TOOLTEST4 textlinksrc.ddl --enable-error-stack textlinksrc.h5
-TOOLTEST4 textlinkfar.ddl --enable-error-stack textlinkfar.h5
-
-# test for dangling external links
-TOOLTEST4 textlink.ddl --enable-error-stack textlink.h5
-
-# test for error stack display (BZ2048)
-TOOLTEST5 filter_fail.ddl --enable-error-stack filter_fail.h5
-
-# test for -o -y for dataset with attributes
-TOOLTEST2 tall-6.exp --enable-error-stack -y -o tall-6.txt -d /g1/g1.1/dset1.1.1 tall.h5
-
-# test for non-existing file
-TOOLTEST3 non_existing.ddl --enable-error-stack tgroup.h5 non_existing.h5
-
-# 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/h5dump/testh5dumppbits.sh.in b/tools/h5dump/testh5dumppbits.sh.in
deleted file mode 100644
index 4211c63..0000000
--- a/tools/h5dump/testh5dumppbits.sh.in
+++ /dev/null
@@ -1,598 +0,0 @@
-#! /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 packed bits 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/pbits
-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/packedbits.h5
-$SRC_H5DUMP_TESTFILES/tarray1.h5
-$SRC_H5DUMP_TESTFILES/tcompound.h5
-"
-
-LIST_OTHER_TEST_FILES="
-$SRC_H5DUMP_TESTFILES/pbits/tnofilename-with-packed-bits.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsArray.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsCompound.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsIncomplete.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharLengthExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntLengthExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongLengthExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthPositive.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsMax.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsMaxExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharOffsetExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntOffsetExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongOffsetExceeded.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetNegative.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsOverlapped.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedIntWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedIntWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole1.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole1.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole63.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole63.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned4.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned4.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt8.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt8.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong16.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong16.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong32.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong32.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned2.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned2.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt4.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt4.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong8.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong8.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong16.ddl
-$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong16.ddl
-"
-
-LIST_ERROR_TEST_FILES="
-${SRC_H5DUMP_ERRORFILES}/tnofilename-with-packed-bits.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsCharLengthExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsCharOffsetExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsIncomplete.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsIntLengthExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsIntOffsetExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsLengthExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsLengthPositive.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsLongLengthExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsLongOffsetExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsMaxExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetExceeded.err
-${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetNegative.err
-"
-
-#
-# 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 packed bits ######
-
-# test failure handling
-# Missing file name
-TOOLTEST tnofilename-with-packed-bits.ddl --enable-error-stack
-# Limits:
-# Maximum number of packed bits is 8 (for now).
-# Maximum integer size is 64 (for now).
-# Maximun Offset is 63 (Maximum size - 1).
-# Maximum Offset+Length is 64 (Maximum size).
-# Tests:
-# Normal operation on both signed and unsigned int datasets.
-# Sanity check
-# Their rawdata output should be the same.
-TOOLTEST tpbitsSignedWhole.ddl --enable-error-stack -d /DS08BITS -M 0,8 packedbits.h5
-TOOLTEST tpbitsUnsignedWhole.ddl --enable-error-stack -d /DU08BITS -M 0,8 packedbits.h5
-TOOLTEST tpbitsSignedIntWhole.ddl --enable-error-stack -d /DS16BITS -M 0,16 packedbits.h5
-TOOLTEST tpbitsUnsignedIntWhole.ddl --enable-error-stack -d /DU16BITS -M 0,16 packedbits.h5
-TOOLTEST tpbitsSignedLongWhole.ddl --enable-error-stack -d /DS32BITS -M 0,32 packedbits.h5
-TOOLTEST tpbitsUnsignedLongWhole.ddl --enable-error-stack -d /DU32BITS -M 0,32 packedbits.h5
-TOOLTEST tpbitsSignedLongLongWhole.ddl --enable-error-stack -d /DS64BITS -M 0,64 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLongWhole.ddl --enable-error-stack -d /DU64BITS -M 0,64 packedbits.h5
-TOOLTEST tpbitsSignedLongLongWhole63.ddl --enable-error-stack -d /DS64BITS -M 0,63 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLongWhole63.ddl --enable-error-stack -d /DU64BITS -M 0,63 packedbits.h5
-TOOLTEST tpbitsSignedLongLongWhole1.ddl --enable-error-stack -d /DS64BITS -M 1,63 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLongWhole1.ddl --enable-error-stack -d /DU64BITS -M 1,63 packedbits.h5
-# Half sections
-TOOLTEST tpbitsSigned4.ddl --enable-error-stack -d /DS08BITS -M 0,4,4,4 packedbits.h5
-TOOLTEST tpbitsUnsigned4.ddl --enable-error-stack -d /DU08BITS -M 0,4,4,4 packedbits.h5
-TOOLTEST tpbitsSignedInt8.ddl --enable-error-stack -d /DS16BITS -M 0,8,8,8 packedbits.h5
-TOOLTEST tpbitsUnsignedInt8.ddl --enable-error-stack -d /DU16BITS -M 0,8,8,8 packedbits.h5
-TOOLTEST tpbitsSignedLong16.ddl --enable-error-stack -d /DS32BITS -M 0,16,16,16 packedbits.h5
-TOOLTEST tpbitsUnsignedLong16.ddl --enable-error-stack -d /DU32BITS -M 0,16,16,16 packedbits.h5
-TOOLTEST tpbitsSignedLongLong32.ddl --enable-error-stack -d /DS64BITS -M 0,32,32,32 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLong32.ddl --enable-error-stack -d /DU64BITS -M 0,32,32,32 packedbits.h5
-# Quarter sections
-TOOLTEST tpbitsSigned2.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
-TOOLTEST tpbitsUnsigned2.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
-TOOLTEST tpbitsSignedInt4.ddl --enable-error-stack -d /DS16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
-TOOLTEST tpbitsUnsignedInt4.ddl --enable-error-stack -d /DU16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
-TOOLTEST tpbitsSignedLong8.ddl --enable-error-stack -d /DS32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
-TOOLTEST tpbitsUnsignedLong8.ddl --enable-error-stack -d /DU32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
-TOOLTEST tpbitsSignedLongLong16.ddl --enable-error-stack -d /DS64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLong16.ddl --enable-error-stack -d /DU64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
-# Begin and End
-TOOLTEST tpbitsSigned.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,6 packedbits.h5
-TOOLTEST tpbitsUnsigned.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,6 packedbits.h5
-TOOLTEST tpbitsSignedInt.ddl --enable-error-stack -d /DS16BITS -M 0,2,10,6 packedbits.h5
-TOOLTEST tpbitsUnsignedInt.ddl --enable-error-stack -d /DU16BITS -M 0,2,10,6 packedbits.h5
-TOOLTEST tpbitsSignedLong.ddl --enable-error-stack -d /DS32BITS -M 0,2,26,6 packedbits.h5
-TOOLTEST tpbitsUnsignedLong.ddl --enable-error-stack -d /DU32BITS -M 0,2,26,6 packedbits.h5
-TOOLTEST tpbitsSignedLongLong.ddl --enable-error-stack -d /DS64BITS -M 0,2,58,6 packedbits.h5
-TOOLTEST tpbitsUnsignedLongLong.ddl --enable-error-stack -d /DU64BITS -M 0,2,58,6 packedbits.h5
-# Overlapped packed bits.
-TOOLTEST tpbitsOverlapped.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,0,3 packedbits.h5
-# Maximum number of packed bits.
-TOOLTEST tpbitsMax.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
-# Compound type.
-TOOLTEST tpbitsCompound.ddl --enable-error-stack -d /dset1 -M 0,1,1,1 tcompound.h5
-# Array type.
-TOOLTEST tpbitsArray.ddl --enable-error-stack -d /Dataset1 -M 0,1,1,1 tarray1.h5
-# Test Error handling.
-# Too many packed bits requested. Max is 8 for now.
-TOOLTEST tpbitsMaxExceeded.ddl --enable-error-stack -d /DS08BITS -M 0,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
-# Offset too large. Max is 7 (8-1) for now.
-TOOLTEST tpbitsOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 64,1 packedbits.h5
-TOOLTEST tpbitsCharOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 8,1 packedbits.h5
-TOOLTEST tpbitsIntOffsetExceeded.ddl --enable-error-stack -d /DS16BITS -M 16,1 packedbits.h5
-TOOLTEST tpbitsLongOffsetExceeded.ddl --enable-error-stack -d /DS32BITS -M 32,1 packedbits.h5
-# Bad offset, must not be negative.
-TOOLTEST tpbitsOffsetNegative.ddl --enable-error-stack -d /DS08BITS -M -1,1 packedbits.h5
-# Bad length, must not be positive.
-TOOLTEST tpbitsLengthPositive.ddl --enable-error-stack -d /DS08BITS -M 4,0 packedbits.h5
-# Offset+Length is too large. Max is 8 for now.
-TOOLTEST tpbitsLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 37,28 packedbits.h5
-TOOLTEST tpbitsCharLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 2,7 packedbits.h5
-TOOLTEST tpbitsIntLengthExceeded.ddl --enable-error-stack -d /DS16BITS -M 10,7 packedbits.h5
-TOOLTEST tpbitsLongLengthExceeded.ddl --enable-error-stack -d /DS32BITS -M 26,7 packedbits.h5
-# Incomplete pair of packed bits request.
-TOOLTEST tpbitsIncomplete.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,1,0,2,2, packedbits.h5
-
-# 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/h5dump/testh5dumpvds.sh.in b/tools/h5dump/testh5dumpvds.sh.in
deleted file mode 100644
index 850c03a..0000000
--- a/tools/h5dump/testh5dumpvds.sh.in
+++ /dev/null
@@ -1,523 +0,0 @@
-#! /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
-$SRC_H5DUMP_TESTFILES/vds/a.h5
-$SRC_H5DUMP_TESTFILES/vds/b.h5
-$SRC_H5DUMP_TESTFILES/vds/c.h5
-$SRC_H5DUMP_TESTFILES/vds/d.h5
-$SRC_H5DUMP_TESTFILES/vds/vds-percival-unlim-maxmin.h5
-$SRC_H5DUMP_TESTFILES/vds/f-0.h5
-$SRC_H5DUMP_TESTFILES/vds/f-3.h5
-$SRC_H5DUMP_TESTFILES/vds/vds-eiger.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
-$SRC_H5DUMP_TESTFILES/vds/vds-first.ddl
-$SRC_H5DUMP_TESTFILES/vds/vds-gap1.ddl
-$SRC_H5DUMP_TESTFILES/vds/vds-gap2.ddl
-$SRC_H5DUMP_TESTFILES/vds/vds_layout-eiger.ddl
-$SRC_H5DUMP_TESTFILES/vds/vds_layout-maxmin.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
-    TOOLTEST vds-first.ddl --vds-view-first-missing --enable-error-stack vds-percival-unlim-maxmin.h5
-    TOOLTEST vds-gap1.ddl -d /VDS-Eiger --vds-gap-size=1 --enable-error-stack vds-eiger.h5
-    TOOLTEST vds-gap2.ddl --vds-gap-size=2 --enable-error-stack vds-eiger.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
-    TOOLTEST vds_layout-eiger.ddl -p --enable-error-stack vds-eiger.h5
-    TOOLTEST vds_layout-maxmin.ddl -p --enable-error-stack vds-percival-unlim-maxmin.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/h5dump/testh5dumpxml.sh.in b/tools/h5dump/testh5dumpxml.sh.in
deleted file mode 100644
index 1efde85..0000000
--- a/tools/h5dump/testh5dumpxml.sh.in
+++ /dev/null
@@ -1,388 +0,0 @@
-#! /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
-
-srcdir=@srcdir@
-
-TESTNAME=h5dumpxml
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-DUMPER=h5dump               # The tool name
-DUMPER_BIN=`pwd`/$DUMPER    # The path of the 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_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/xml
-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_XML="
-$SRC_H5DUMP_TESTFILES/tall.h5
-$SRC_H5DUMP_TESTFILES/tarray1.h5
-$SRC_H5DUMP_TESTFILES/tarray2.h5
-$SRC_H5DUMP_TESTFILES/tarray3.h5
-$SRC_H5DUMP_TESTFILES/tarray6.h5
-$SRC_H5DUMP_TESTFILES/tarray7.h5
-$SRC_H5DUMP_TESTFILES/tattr.h5
-$SRC_H5DUMP_TESTFILES/tbitfields.h5
-$SRC_H5DUMP_TESTFILES/tcompound.h5
-$SRC_H5DUMP_TESTFILES/tcompound2.h5
-$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
-$SRC_H5DUMP_TESTFILES/tdatareg.h5
-$SRC_H5DUMP_TESTFILES/tdset.h5
-$SRC_H5DUMP_TESTFILES/tdset2.h5
-$SRC_H5DUMP_TESTFILES/tempty.h5
-$SRC_H5DUMP_TESTFILES/tenum.h5
-$SRC_H5DUMP_TESTFILES/textlink.h5
-$SRC_H5DUMP_TESTFILES/tfpformat.h5
-$SRC_H5DUMP_TESTFILES/tgroup.h5
-$SRC_H5DUMP_TESTFILES/thlink.h5
-$SRC_H5DUMP_TESTFILES/tloop.h5
-$SRC_H5DUMP_TESTFILES/tloop2.h5
-$SRC_H5DUMP_TESTFILES/tmany.h5
-$SRC_H5DUMP_TESTFILES/tname-amp.h5
-$SRC_H5DUMP_TESTFILES/tname-apos.h5
-$SRC_H5DUMP_TESTFILES/tname-gt.h5
-$SRC_H5DUMP_TESTFILES/tname-lt.h5
-$SRC_H5DUMP_TESTFILES/tname-quot.h5
-$SRC_H5DUMP_TESTFILES/tname-sp.h5
-$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
-$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
-$SRC_H5DUMP_TESTFILES/tnodata.h5
-$SRC_H5DUMP_TESTFILES/tobjref.h5
-$SRC_H5DUMP_TESTFILES/topaque.h5
-$SRC_H5DUMP_TESTFILES/torderattr.h5
-$SRC_H5DUMP_TESTFILES/tref.h5
-$SRC_H5DUMP_TESTFILES/tref-escapes.h5
-$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5
-$SRC_H5DUMP_TESTFILES/tsaf.h5
-$SRC_H5DUMP_TESTFILES/tslink.h5
-$SRC_H5DUMP_TESTFILES/tstring.h5
-$SRC_H5DUMP_TESTFILES/tstring-at.h5
-$SRC_H5DUMP_TESTFILES/tstr.h5
-$SRC_H5DUMP_TESTFILES/tstr2.h5
-$SRC_H5DUMP_TESTFILES/tudlink.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
-$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
-$SRC_H5DUMP_TESTFILES/tvlstr.h5
-"
-
-LIST_OTHER_TEST_FILES_XML="
-$SRC_H5DUMP_TESTFILES/tall.h5.xml
-$SRC_H5DUMP_TESTFILES/tall-2A.h5.xml
-$SRC_H5DUMP_TESTFILES/tarray1.h5.xml
-$SRC_H5DUMP_TESTFILES/tarray2.h5.xml
-$SRC_H5DUMP_TESTFILES/tarray3.h5.xml
-$SRC_H5DUMP_TESTFILES/tarray6.h5.xml
-$SRC_H5DUMP_TESTFILES/tarray7.h5.xml
-$SRC_H5DUMP_TESTFILES/tattr.h5.xml
-$SRC_H5DUMP_TESTFILES/tbitfields.h5.xml
-$SRC_H5DUMP_TESTFILES/tcompound_complex.h5.xml
-$SRC_H5DUMP_TESTFILES/tcompound.h5.xml
-$SRC_H5DUMP_TESTFILES/tcompound2.h5.xml
-$SRC_H5DUMP_TESTFILES/tdatareg.h5.xml
-$SRC_H5DUMP_TESTFILES/tdset.h5.xml
-$SRC_H5DUMP_TESTFILES/tdset2.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-dtd.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-dtd-2.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-dtd-uri.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-nons.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-nons-2.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-nons-uri.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-ns.h5.xml
-$SRC_H5DUMP_TESTFILES/tempty-ns-2.h5.xml
-$SRC_H5DUMP_TESTFILES/tenum.h5.xml
-$SRC_H5DUMP_TESTFILES/textlink.h5.xml
-$SRC_H5DUMP_TESTFILES/tfpformat.h5.xml
-$SRC_H5DUMP_TESTFILES/tgroup.h5.xml
-$SRC_H5DUMP_TESTFILES/thlink.h5.xml
-$SRC_H5DUMP_TESTFILES/tloop.h5.xml
-$SRC_H5DUMP_TESTFILES/tloop2.h5.xml
-$SRC_H5DUMP_TESTFILES/tmany.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-amp.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-apos.h5.xml
-$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-gt.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-lt.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-quot.h5.xml
-$SRC_H5DUMP_TESTFILES/tname-sp.h5.xml
-$SRC_H5DUMP_TESTFILES/tnestedcomp.h5.xml
-$SRC_H5DUMP_TESTFILES/tnodata.h5.xml
-$SRC_H5DUMP_TESTFILES/tobjref.h5.xml
-$SRC_H5DUMP_TESTFILES/topaque.h5.xml
-$SRC_H5DUMP_TESTFILES/torderattr1.h5.xml
-$SRC_H5DUMP_TESTFILES/torderattr2.h5.xml
-$SRC_H5DUMP_TESTFILES/torderattr3.h5.xml
-$SRC_H5DUMP_TESTFILES/torderattr4.h5.xml
-$SRC_H5DUMP_TESTFILES/tref.h5.xml
-$SRC_H5DUMP_TESTFILES/tref-escapes.h5.xml
-$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5.xml
-$SRC_H5DUMP_TESTFILES/tsaf.h5.xml
-$SRC_H5DUMP_TESTFILES/tslink.h5.xml
-$SRC_H5DUMP_TESTFILES/tstr.h5.xml
-$SRC_H5DUMP_TESTFILES/tstr2.h5.xml
-$SRC_H5DUMP_TESTFILES/tstring.h5.xml
-$SRC_H5DUMP_TESTFILES/tstring-at.h5.xml
-$SRC_H5DUMP_TESTFILES/tudlink.h5.xml
-$SRC_H5DUMP_TESTFILES/tvldtypes1.h5.xml
-$SRC_H5DUMP_TESTFILES/tvldtypes2.h5.xml
-$SRC_H5DUMP_TESTFILES/tvldtypes3.h5.xml
-$SRC_H5DUMP_TESTFILES/tvldtypes4.h5.xml
-$SRC_H5DUMP_TESTFILES/tvldtypes5.h5.xml
-$SRC_H5DUMP_TESTFILES/tvlstr.h5.xml
-"
-
-#
-# copy test files and expected output files from source dirs to test dir
-#
-COPY_TESTFILES="$LIST_HDF5_TEST_FILES_XML $LIST_OTHER_TEST_FILES_XML"
-
-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 .xml`.out"
-   actual_err="$TESTDIR/`basename $1 .xml`.err"
-   shift
-
-    # Run test.
-    TESTING $DUMPER $@
-    (
-    cd $TESTDIR
-      $RUNSERIAL $DUMPER_BIN "$@"
-    ) >$actual 2>$actual_err
-
-
-   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 (*.xml) 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
-   fi
-}
-
-# Print a "SKIP" message    
-SKIP() {
-         TESTING $DUMPER $@
-          echo  " -SKIP-"
-}
-
-
-##############################################################################
-##############################################################################
-###        T H E   T E S T S                                ###
-##############################################################################
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-# test XML
-TOOLTEST tall.h5.xml --xml tall.h5
-TOOLTEST tattr.h5.xml --xml tattr.h5
-TOOLTEST tbitfields.h5.xml --xml tbitfields.h5
-TOOLTEST tcompound.h5.xml --xml tcompound.h5
-TOOLTEST tcompound2.h5.xml --xml tcompound2.h5
-TOOLTEST tdatareg.h5.xml --xml tdatareg.h5
-TOOLTEST tdset.h5.xml --xml tdset.h5
-TOOLTEST tdset2.h5.xml --xml tdset2.h5
-TOOLTEST tenum.h5.xml --xml tenum.h5
-TOOLTEST tgroup.h5.xml --xml tgroup.h5
-TOOLTEST thlink.h5.xml --xml thlink.h5
-TOOLTEST tloop.h5.xml --xml tloop.h5
-TOOLTEST tloop2.h5.xml --xml tloop2.h5
-TOOLTEST tmany.h5.xml --xml tmany.h5
-TOOLTEST tnestedcomp.h5.xml --xml tnestedcomp.h5
-TOOLTEST tcompound_complex.h5.xml --xml tcompound_complex.h5
-TOOLTEST tobjref.h5.xml --xml tobjref.h5
-TOOLTEST topaque.h5.xml --xml topaque.h5
-TOOLTEST tslink.h5.xml --xml tslink.h5
-TOOLTEST tudlink.h5.xml --xml tudlink.h5
-TOOLTEST textlink.h5.xml --xml textlink.h5
-TOOLTEST tstr.h5.xml --xml tstr.h5
-TOOLTEST tstr2.h5.xml --xml tstr2.h5
-TOOLTEST tref.h5.xml --xml tref.h5
-TOOLTEST tname-amp.h5.xml --xml tname-amp.h5
-TOOLTEST tname-apos.h5.xml --xml tname-apos.h5
-TOOLTEST tname-gt.h5.xml --xml tname-gt.h5
-TOOLTEST tname-lt.h5.xml --xml tname-lt.h5
-TOOLTEST tname-quot.h5.xml --xml tname-quot.h5
-TOOLTEST tname-sp.h5.xml --xml tname-sp.h5
-TOOLTEST tstring.h5.xml --xml tstring.h5
-TOOLTEST tstring-at.h5.xml --xml tstring-at.h5
-TOOLTEST tref-escapes.h5.xml --xml tref-escapes.h5
-TOOLTEST tref-escapes-at.h5.xml --xml tref-escapes-at.h5
-TOOLTEST tnodata.h5.xml --xml tnodata.h5
-TOOLTEST tarray1.h5.xml --xml tarray1.h5
-TOOLTEST tarray2.h5.xml --xml tarray2.h5
-TOOLTEST tarray3.h5.xml --xml tarray3.h5
-TOOLTEST tarray6.h5.xml --xml tarray6.h5
-TOOLTEST tarray7.h5.xml --xml tarray7.h5
-TOOLTEST tvldtypes1.h5.xml --xml tvldtypes1.h5
-TOOLTEST tvldtypes2.h5.xml --xml tvldtypes2.h5
-TOOLTEST tvldtypes3.h5.xml --xml tvldtypes3.h5
-TOOLTEST tvldtypes4.h5.xml --xml tvldtypes4.h5
-TOOLTEST tvldtypes5.h5.xml --xml tvldtypes5.h5
-TOOLTEST tvlstr.h5.xml --xml tvlstr.h5
-TOOLTEST tsaf.h5.xml --xml tsaf.h5
-TOOLTEST tempty.h5.xml --xml tempty.h5
-TOOLTEST tnamed_dtype_attr.h5.xml --xml tnamed_dtype_attr.h5
-##Test dataset and attribute of null space.  Commented out:
-## wait until the XML schema is updated for null space. 
-##TOOLTEST tnullspace.h5.xml --xml tnulspace.h5
-
-# other options for xml
-
-TOOLTEST tempty-dtd.h5.xml --xml --use-dtd tempty.h5
-TOOLTEST tempty-dtd-2.h5.xml --xml -u tempty.h5
-TOOLTEST tempty-nons.h5.xml --xml -X ":" tempty.h5
-TOOLTEST tempty-nons-2.h5.xml --xml --xml-ns=":" tempty.h5
-
-## Some of these combinations are syntactically correct but
-##  the URLs are dummies 
-TOOLTEST tempty-ns.h5.xml --xml -X "thing:" tempty.h5
-TOOLTEST tempty-ns-2.h5.xml --xml --xml-ns="thing:" tempty.h5
-TOOLTEST tempty-nons-uri.h5.xml --xml --xml-ns=":" --xml-dtd="http://somewhere.net" tempty.h5
-TOOLTEST tempty-dtd-uri.h5.xml --xml --use-dtd --xml-dtd="http://somewhere.net" tempty.h5
-
-TOOLTEST tall-2A.h5.xml --xml -A tall.h5
-
-
-# tests for attribute order
-TOOLTEST torderattr1.h5.xml --xml -H --sort_by=name --sort_order=ascending torderattr.h5
-TOOLTEST torderattr2.h5.xml --xml -H --sort_by=name --sort_order=descending torderattr.h5
-TOOLTEST torderattr3.h5.xml --xml -H --sort_by=creation_order --sort_order=ascending torderattr.h5
-TOOLTEST torderattr4.h5.xml --xml -H --sort_by=creation_order --sort_order=descending torderattr.h5
-
-# tests for floating point user defined printf format
-TOOLTEST tfpformat.h5.xml -u -m %.7f tfpformat.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/h5format_convert/CMakeLists.txt b/tools/h5format_convert/CMakeLists.txt
deleted file mode 100644
index 4f6fdea..0000000
--- a/tools/h5format_convert/CMakeLists.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5FC)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5format_convert executables
-# --------------------------------------------------------------------
-add_executable (h5format_convert ${HDF5_TOOLS_H5FC_SOURCE_DIR}/h5format_convert.c)
-TARGET_NAMING (h5format_convert STATIC)
-TARGET_C_PROPERTIES (h5format_convert STATIC " " " ")
-target_link_libraries (h5format_convert  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5format_convert PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5format_convert)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5format_convert test executables
-  # --------------------------------------------------------------------
-  add_executable (h5fc_chk_idx ${HDF5_TOOLS_H5FC_SOURCE_DIR}/h5fc_chk_idx.c)
-  TARGET_NAMING (h5fc_chk_idx STATIC)
-  TARGET_C_PROPERTIES (h5fc_chk_idx STATIC " " " ")
-  target_link_libraries (h5fc_chk_idx ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (h5fc_chk_idx PROPERTIES FOLDER tools)
-
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5fc_gentest ${HDF5_TOOLS_H5FC_SOURCE_DIR}/h5fc_gentest.c)
-    TARGET_NAMING (h5fc_gentest STATIC)
-    TARGET_C_PROPERTIES (h5fc_gentest STATIC " " " ")
-    target_link_libraries (h5fc_gentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-    set_target_properties (h5fc_gentest PROPERTIES FOLDER generator/tools)
-
-    #add_test (NAME h5fc_gentest COMMAND $<TARGET_FILE:h5fc_gentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5format_convert ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5format_convert
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5format_convert/CMakeTests.cmake b/tools/h5format_convert/CMakeTests.cmake
deleted file mode 100644
index 5771aa5..0000000
--- a/tools/h5format_convert/CMakeTests.cmake
+++ /dev/null
@@ -1,463 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the test directory into the source directory
-  # --------------------------------------------------------------------
-  set (HDF5_REFERENCE_FILES
-      h5fc_help.ddl
-      h5fc_nooption.ddl
-      h5fc_nonexistfile.ddl
-      h5fc_d_file.ddl
-      h5fc_dname.ddl
-      h5fc_nonexistdset_file.ddl
-      h5fc_v_non_chunked.ddl
-      h5fc_v_bt1.ddl
-      h5fc_v_ndata_bt1.ddl
-      h5fc_v_all.ddl
-      h5fc_v_n_1d.ddl
-      h5fc_v_n_all.ddl
-      h5fc_ext1_i.ddl
-      h5fc_ext1_s.ddl
-      h5fc_ext1_f.ddl
-      h5fc_ext2_if.ddl
-      h5fc_ext2_is.ddl
-      h5fc_ext2_sf.ddl
-      h5fc_ext3_isf.ddl
-      old_h5fc_ext1_i.ddl
-      old_h5fc_ext1_s.ddl
-      old_h5fc_ext1_f.ddl
-      old_h5fc_ext2_if.ddl
-      old_h5fc_ext2_is.ddl
-      old_h5fc_ext2_sf.ddl
-      old_h5fc_ext3_isf.ddl
-  )
-  set (HDF5_REFERENCE_TEST_FILES
-      h5fc_non_v3.h5
-      h5fc_edge_v3.h5
-      h5fc_ext_none.h5
-      old_h5fc_ext_none.h5
-      h5fc_ext1_i.h5
-      h5fc_ext1_s.h5
-      h5fc_ext1_f.h5
-      h5fc_ext2_if.h5
-      h5fc_ext2_is.h5
-      h5fc_ext2_sf.h5
-      h5fc_ext3_isf.h5
-      old_h5fc_ext1_i.h5
-      old_h5fc_ext1_s.h5
-      old_h5fc_ext1_f.h5
-      old_h5fc_ext2_if.h5
-      old_h5fc_ext2_is.h5
-      old_h5fc_ext2_sf.h5
-      old_h5fc_ext3_isf.h5
-  )
-
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-  add_custom_target(h5fc-files ALL COMMENT "Copying files needed by h5fc tests")
-
-  foreach (ddl_file ${HDF5_REFERENCE_FILES})
-    set (ddldest "${PROJECT_BINARY_DIR}/testfiles/${ddl_file}")
-    #message (STATUS " Translating ${ddl_file}")
-    add_custom_command (
-        TARGET     h5fc-files
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${ddl_file} ${ddldest}
-    )
-  endforeach (ddl_file ${HDF5_REFERENCE_FILES})
-
-  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${h5_file}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5fc-files
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${h5_file} ${dest}
-    )
-  endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_H5_OUTPUT testname resultfile resultcode testfile)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5FC-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${testname}.out ./testfiles/${testname}.out.err ./testfiles/outtmp.h5
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      if (NOT "${testfile}" STREQUAL "")
-          add_test (
-              NAME H5FC-${testname}-${testfile}-tmpfile
-              COMMAND    ${CMAKE_COMMAND}
-                  -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${testfile} ./testfiles/outtmp.h5
-          )
-          set_tests_properties (H5FC-${testname}-${testfile}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
-          add_test (
-              NAME H5FC-${testname}-${testfile}
-              COMMAND "${CMAKE_COMMAND}"
-                  -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
-                  -D "TEST_ARGS=${ARGN};outtmp.h5"
-                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                  -D "TEST_OUTPUT=${testname}.out"
-                  -D "TEST_EXPECT=${resultcode}"
-                  -D "TEST_REFERENCE=${resultfile}"
-                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-          )
-          set_tests_properties (H5FC-${testname}-${testfile} PROPERTIES DEPENDS "H5FC-${testname}-${testfile}-tmpfile")
-          set (last_test "H5FC-${testname}-${testfile}")
-      else (NOT "${testfile}" STREQUAL "")
-          add_test (
-              NAME H5FC-${testname}-NA
-              COMMAND "${CMAKE_COMMAND}"
-                  -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
-                  -D "TEST_ARGS=${ARGN}"
-                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                  -D "TEST_OUTPUT=${testname}.out"
-                  -D "TEST_EXPECT=${resultcode}"
-                  -D "TEST_REFERENCE=${resultfile}"
-                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-          )
-          set_tests_properties (H5FC-${testname}-NA PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
-          set (last_test "H5FC-${testname}-NA")
-      endif (NOT "${testfile}" STREQUAL "")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_OUTPUT)
-
-  MACRO (ADD_H5_TEST testname resultcode testfile)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5FC-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${testname}.out ./testfiles/${testname}.out.err ./testfiles/tmp.h5
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5FC-${testname}-tmpfile
-          COMMAND    ${CMAKE_COMMAND}
-              -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${testfile} testfiles/tmp.h5
-      )
-      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
-      add_test (
-          NAME H5FC-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
-              -D "TEST_ARGS=${ARGN};./testfiles/tmp.h5"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=testfiles/${testname}.out"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -D "TEST_EXPECT=${resultcode}"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
-      set (last_test "H5FC-${testname}")
-     endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST)
-
-  MACRO (ADD_H5_CHECK_IDX dependtest testname)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5FC_CHECK_IDX-${testname}
-          COMMAND "$<TARGET_FILE:h5fc_chk_idx>" "./testfiles/tmp.h5" "${ARGN}"
-      )
-      set_tests_properties (H5FC_CHECK_IDX-${testname} PROPERTIES DEPENDS "H5FC-${dependtest}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_CHECK_IDX)
-
-  MACRO (ADD_H5_TEST_CHECK_IDX testname resultcode testfile)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5FC-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${testname}.out ./testfiles/${testname}.out.err ./testfiles/chktmp.h5
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5FC-${testname}-tmpfile
-          COMMAND    ${CMAKE_COMMAND}
-              -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${testfile} testfiles/chktmp.h5
-      )
-      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
-      add_test (
-          NAME H5FC-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
-              -D "TEST_ARGS=-d;${ARGN};./testfiles/chktmp.h5"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=testfiles/${testname}.out"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -D "TEST_EXPECT=${resultcode}"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
-      add_test (
-          NAME H5FC_CHECK_IDX-${testname}
-          COMMAND "$<TARGET_FILE:h5fc_chk_idx>" "./testfiles/chktmp.h5" "${ARGN}"
-      )
-      set_tests_properties (H5FC_CHECK_IDX-${testname} PROPERTIES DEPENDS "H5FC-${testname}")
-      set (last_test "H5FC_CHECK_IDX-${testname}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST_CHECK_IDX)
-
-  MACRO (ADD_H5_H5DUMP_CHECK testname)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5FC-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ./testfiles/${testname}.out ./testfiles/${testname}.out.err ./testfiles/dmptmp.h5
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5FC-${testname}-tmpfile
-          COMMAND    ${CMAKE_COMMAND}
-              -E copy_if_different ${HDF5_TOOLS_H5FC_SOURCE_DIR}/testfiles/${testname}.h5 testfiles/dmptmp.h5
-      )
-      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
-      add_test (
-          NAME H5FC-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
-              -D "TEST_ARGS=${ARGN};./testfiles/dmptmp.h5"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=testfiles/${testname}.out"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -D "TEST_EXPECT=0"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
-      add_test (
-          NAME H5FC_CHECK_DUMP-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=-BH;./testfiles/dmptmp.h5"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=testfiles/${testname}.out"
-              -D "TEST_EXPECT=0"
-              -D "TEST_REFERENCE=testfiles/${testname}.ddl"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5FC_CHECK_DUMP-${testname} PROPERTIES DEPENDS "H5FC-${testname}")
-      set (last_test "H5FC_CHECK_DUMP-${testname}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_H5DUMP_CHECK)
-
-##############################################################################
-##############################################################################
-###           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 H5FC-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove
-          h5fc_help.out
-          h5fc_help.out.err
-          h5fc_nooption.out
-          h5fc_nooption.out.err
-          h5fc_nonexistfile.out
-          h5fc_nonexistfile.out.err
-          h5fc_d_file.out
-          h5fc_d_file.out.err
-          h5fc_d_file-d.out
-          h5fc_d_file-d.out.err
-          h5fc_dname.out
-          h5fc_dname.out.err
-          h5fc_nonexistdset_file.out
-          h5fc_nonexistdset_file.out.err
-          h5fc_v_non_chunked.out
-          h5fc_v_non_chunked.out.err
-          h5fc_v_bt1.out
-          h5fc_v_bt1.out.err
-          h5fc_v_ndata_bt1.out
-          h5fc_v_ndata_bt1.out.err
-          h5fc_v_all.out
-          h5fc_v_all.out.err
-          h5fc_v_n_1d.out
-          h5fc_v_n_1d.out.err
-          h5fc_v_n_all.out
-          h5fc_v_n_all.out.err
-          h5fc_ext1_i.out
-          h5fc_ext1_i.out.err
-          h5fc_ext1_s.out
-          h5fc_ext1_s.out.err
-          h5fc_ext1_f.out
-          h5fc_ext1_f.out.err
-          h5fc_ext2_if.out
-          h5fc_ext2_if.out.err
-          h5fc_ext2_is.out
-          h5fc_ext2_is.out.err
-          h5fc_ext2_sf.out
-          h5fc_ext2_sf.out.err
-          h5fc_ext3_isf.out
-          h5fc_ext3_isf.out.err
-          old_h5fc_ext1_i.out
-          old_h5fc_ext1_i.out.err
-          old_h5fc_ext1_s.out
-          old_h5fc_ext1_s.out.err
-          old_h5fc_ext1_f.out
-          old_h5fc_ext1_f.out.err
-          old_h5fc_ext2_if.out
-          old_h5fc_ext2_is.out.err
-          old_h5fc_ext2_is.out
-          old_h5fc_ext2_sf.out.err
-          old_h5fc_ext3_isf.out
-          old_h5fc_ext3_isf.out.err
-          outtmp.h5
-          tmp.h5
-          chktmp.h5
-          dmptmp.h5
-    )
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5FC-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5FC-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-# h5format_convert --help
-# h5format_convert (no options)
-# h5format_convert nonexist.h5  (no options, file does not exist)
-  ADD_H5_OUTPUT (h5fc_help h5fc_help.ddl 0 "" --help)
-  ADD_H5_OUTPUT (h5fc_nooption h5fc_nooption.ddl 1 "")
-  ADD_H5_OUTPUT (h5fc_nonexistfile h5fc_nonexistfile.ddl 1 "" nonexist.h5)
-#
-#
-# h5format_convert -d old_h5fc_ext_none.h5 (just -d option, file exists)
-# h5format_convert --dname old_h5fc_ext_none.h5 (just --dname option, file exists)
-# h5format_convert --dname (just --dname option)
-# h5format_convert --dname=nonexist old_h5fc_ext_none.h5 (dataset does not exist, file exists)
-  ADD_H5_OUTPUT (h5fc_d_file-d h5fc_d_file.ddl 1 old_h5fc_ext_none.h5 -d)
-  ADD_H5_OUTPUT (h5fc_d_file h5fc_d_file.ddl 1 old_h5fc_ext_none.h5 --dname)
-  ADD_H5_OUTPUT (h5fc_dname h5fc_dname.ddl 1 "" --dname)
-  ADD_H5_OUTPUT (h5fc_nonexistdset_file h5fc_nonexistdset_file.ddl 1 old_h5fc_ext_none.h5 --dname=nonexist)
-#
-#
-#
-# h5format_convert -d /DSET_CONTIGUOUS -v old_h5fc_ext_none.h5 (verbose, contiguous dataset)
-# h5format_convert -d /GROUP/DSET_BT2 --verbose old_h5fc_ext_none.h5 (verbose, bt1 dataset)
-# h5format_convert -d /DSET_NDATA_BT2 -v -n old_h5fc_ext_none.h5 (verbose, noop, bt1+nodata dataset)
-# h5format_convert -v old_h5fc_ext_none.h5 (verbose, all datasets)
-  ADD_H5_OUTPUT (h5fc_v_non_chunked h5fc_v_non_chunked.ddl 0 old_h5fc_ext_none.h5 -d /DSET_CONTIGUOUS -v)
-  ADD_H5_OUTPUT (h5fc_v_bt1 h5fc_v_bt1.ddl 0 old_h5fc_ext_none.h5 -d /GROUP/DSET_BT2 --verbose)
-  ADD_H5_OUTPUT (h5fc_v_ndata_bt1 h5fc_v_ndata_bt1.ddl 0 old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2 -v -n)
-  ADD_H5_OUTPUT (h5fc_v_all h5fc_v_all.ddl 0 old_h5fc_ext_none.h5 -v)
-#
-#
-#
-# h5format_convert -d /DSET_EA -v -n h5fc_ext_none.h5 (verbose, noop, one ea dataset)
-# h5format_convert -v -n h5fc_non_v3.h5 (verbose, noop, all datasets)
-  ADD_H5_OUTPUT (h5fc_v_n_1d h5fc_v_n_1d.ddl 0 h5fc_ext_none.h5 -d /DSET_EA -v -n)
-  ADD_H5_OUTPUT (h5fc_v_n_all h5fc_v_n_all.ddl 0 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_ext_none.h5
-# h5format_convert -d /GROUP/DSET_NDATA_EA h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_BT2 h5fc_ext_none.h5
-# h5format_convert -d /DSET_NDATA_BT2 h5fc_ext_none.h5
-# h5format_convert -d /DSET_FA h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_FA h5fc_ext_none.h5
-# h5format_convert -d /DSET_NONE h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_NDATA_NONE h5fc_ext_none.h5
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_EA 0 h5fc_ext_none.h5 /DSET_EA)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_EA 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_EA)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_BT 0 h5fc_ext_none.h5 /GROUP/DSET_BT2)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_BT 0 h5fc_ext_none.h5 /DSET_NDATA_BT2)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_FA 0 h5fc_ext_none.h5 /DSET_FA)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_FA 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_FA)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_NONE 0 h5fc_ext_none.h5 /DSET_NONE)
-#
-  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_NONE 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_NONE)
-#
-#
-#
-# No output from tests: just check exit code
-# h5format_convert -d /DSET_NDATA_BT2 old_h5fc_ext_none.h5 (v1-btree dataset)
-# h5format_convert -d /DSET_CONTIGUOUS h5fc_non_v3.h5 (non-chunked dataset)
-  ADD_H5_TEST (old_h5fc_ext_none 0 old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2)
-  ADD_H5_TEST (old_h5fc_ext_none_CONT 0 h5fc_non_v3.h5 -d /DSET_CONTIGUOUS)
-#
-#
-#
-# 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)
-  ADD_H5_TEST (h5fc_non_v3_BT 0 h5fc_non_v3.h5 -d /GROUP/DSET_BT2 -n)
-  ADD_H5_TEST (h5fc_non_v3-n 0 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
-  ADD_H5_TEST (h5fc_non_v3 0 h5fc_non_v3.h5)
-  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-NEA /DSET_NDATA_EA)
-  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-NBT /DSET_NDATA_BT2)
-  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-BT /GROUP/DSET_BT2)
-  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-EA /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
-  ADD_H5_TEST_CHECK_IDX (h5fc_edge_v3 0 h5fc_edge_v3.h5 /DSET_EDGE)
-#
-#
-
-# The following test files have messages in the superblock extension.
-# Verify h5dump output for correctness after conversion
-  ADD_H5_H5DUMP_CHECK (h5fc_ext1_i)
-  ADD_H5_H5DUMP_CHECK (h5fc_ext1_s)
-  ADD_H5_H5DUMP_CHECK (h5fc_ext1_f)
-#
-  ADD_H5_H5DUMP_CHECK (h5fc_ext2_if)
-  ADD_H5_H5DUMP_CHECK (h5fc_ext2_is)
-  ADD_H5_H5DUMP_CHECK (h5fc_ext2_sf)
-#
-  ADD_H5_H5DUMP_CHECK (h5fc_ext3_isf)
-#
-#
-#
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_i)
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_s)
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_f)
-#
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_if)
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_is)
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_sf)
-#
-  ADD_H5_H5DUMP_CHECK (old_h5fc_ext3_isf)
diff --git a/tools/h5format_convert/Makefile.am b/tools/h5format_convert/Makefile.am
deleted file mode 100644
index d3aef7d..0000000
--- a/tools/h5format_convert/Makefile.am
+++ /dev/null
@@ -1,49 +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.
-##
-## 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
deleted file mode 100644
index de362a4..0000000
--- a/tools/h5format_convert/Makefile.in
+++ /dev/null
@@ -1,1502 +0,0 @@
-# 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/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
deleted file mode 100644
index 3114379..0000000
--- a/tools/h5format_convert/h5fc_chk_idx.c
+++ /dev/null
@@ -1,101 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index 54ef3df..0000000
--- a/tools/h5format_convert/h5fc_gentest.c
+++ /dev/null
@@ -1,664 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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"
-#include "H5private.h"
-
-#define NON_V3_FILE		"h5fc_non_v3.h5"
-#define EDGE_V3_FILE		"h5fc_edge_v3.h5"
-
-const char *FILENAME[] = {
-    "h5fc_ext1_i.h5",	/* 0 */
-    "h5fc_ext1_s.h5",	/* 1 */
-    "h5fc_ext1_f.h5",	/* 2 */
-    "h5fc_ext2_is.h5", 	/* 3 */
-    "h5fc_ext2_if.h5",	/* 4 */
-    "h5fc_ext2_sf.h5", 	/* 5 */
-    "h5fc_ext3_isf.h5",	/* 6 */ 
-    "h5fc_ext_none.h5",	/* 7 */ 
-    NULL
-};
-
-#define GROUP			"GROUP"
-
-#define DSET_BT1		"DSET_BT1"
-#define DSET_NDATA_BT1		"DSET_NDATA_BT1"
-#define DSET_COMPACT		"DSET_COMPACT"
-#define DSET_CONTIGUOUS		"DSET_CONTIGUOUS"
-
-#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 DSET_EDGE		"DSET_EDGE"
-
-#define ISTORE_IK  64
-
-/*
- * 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)
- */
-
-/*
- * 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 compact and 1 contiguous datasets
- */
-static void
-gen_non(const char *fname)
-{
-    hid_t	fid = -1;		/* file id */
-    hid_t	fcpl = -1;		/* file creation 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 	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 */
-
-    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
-        goto error;
-    if(H5Pset_shared_mesg_nindexes(fcpl, 4) < 0)
-        goto error;
-    if(H5Pset_istore_k(fcpl, 64) < 0)
-        goto error;
-
-    /* Create a new file with SWMR_WRITE + non-latest-format */
-    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, fcpl, 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 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(H5Pclose(dcpl) < 0)
-	goto error;
-    if(H5Dclose(did1) < 0)
-	goto error;
-    if(H5Dclose(did2) < 0)
-	goto error;
-
-    /* 
-     * Create a compact dataset in the group
-     */
-
-    /* Create dataspace */
-    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
-	goto error;
-
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-	goto error;
-    if(H5Pset_layout(dcpl, H5D_COMPACT) < 0)
-	goto error;
-
-    /* Create the dataset */
-    if((did1  = H5Dcreate2(gid, DSET_COMPACT, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Closing */
-    if(H5Dclose(did1) < 0)
-	goto error;
-    if(H5Pclose(dcpl) < 0)
-	goto error;
-    if(H5Sclose(sid) < 0)
-	goto error;
-
-    /* 
-     * Create a contiguous dataset with (2d with data) in the file
-     */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-	goto error;
-    if(H5Pset_layout(dcpl, H5D_CONTIGUOUS) < 0)
-	goto error;
-
-    if((sid = H5Screate_simple(2, dims2, NULL)) < 0)
-	goto error;
-
-    /* Create the dataset */
-    if((did2  = H5Dcreate2(fid, DSET_CONTIGUOUS, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, 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(H5Dclose(did2) < 0)
-	goto error;
-    if(H5Pclose(dcpl) < 0)
-	goto error;
-    if(H5Sclose(sid) < 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_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() */
-
-
-/*
- * Function: gen_ext() 
- *
- * Create a file with/without latest format with:
- *	1) 1 contiguous dataset (without data)
- *	2) 2 chunked datasets with extensible array chunk indexing type (with/without data)
- *	3) 2 chunked datasets with version 2 B-tree chunk indexing type (with/without data)
- *	4) 2 chunked datasets with fixed array chunk indexing type (with/without data)
- *	5) 2 chunked datasets with implicit array chunk indexing type (with/without data)
- * It will create the file with/without messages in the superblock extension depending
- * on the parameter "what".
- */
-static void
-gen_ext(const char *fname, unsigned new, unsigned what)
-{
-    hid_t	fid = -1;	 	/* file id */
-    hid_t	fapl = -1;	       	/* file access property list */
-    hid_t	fcpl = -1;	       	/* file creation 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 	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 */
-
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
-	goto error;
-
-    if(new) {
-	/* Create a new format file */
-	if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-	    goto error;
-    }
-
-    /* Create a file creation property list */
-    fcpl = H5Pcreate(H5P_FILE_CREATE);
-
-    /* Generate messages that might be placed in superblock extension */
-    switch(what) {
-	case 0:
-	    H5Pset_istore_k(fcpl, ISTORE_IK);
-	    break;
-	case 1:
-	    H5Pset_shared_mesg_nindexes(fcpl, 4);
-	    break;
-	case 2:
-	    H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0);
-	    break;
-	case 3:
-	    H5Pset_istore_k(fcpl, ISTORE_IK);
-	    H5Pset_shared_mesg_nindexes(fcpl, 4);
-	    break;
-	case 4:
-	    H5Pset_istore_k(fcpl, ISTORE_IK);
-	    H5Pset_file_space(fcpl, 0, (hsize_t)2);
-	    break;
-	case 5:
-	    H5Pset_shared_mesg_nindexes(fcpl, 4);
-	    H5Pset_file_space(fcpl, H5F_FILE_SPACE_VFD, (hsize_t)0);
-	    break;
-	case 6:
-	    H5Pset_istore_k(fcpl, ISTORE_IK);
-	    H5Pset_shared_mesg_nindexes(fcpl, 4);
-	    H5Pset_file_space(fcpl, H5F_FILE_SPACE_AGGR_VFD, (hsize_t)0);
-	    break;
-	default:
-	    break;
-    }
-
-    /* Create the file */
-    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, 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 a contiguous dataset 
-     */
-
-    /* Create dataspace */
-    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
-	goto error;
-
-    /* Create the dataset */
-    if((did1  = H5Dcreate2(fid, DSET_CONTIGUOUS, 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 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);
-        H5Pclose(fcpl);
-    } H5E_END_TRY;
-
-} /* gen_ext() */
-
-int main(void)
-{
-    unsigned i, new;
-
-    /* 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 */
-    gen_edge(EDGE_V3_FILE);
-
-    /* Generate old/new format file with/without messages in the superblock extension */
-    for(new = FALSE; new <= TRUE; new++) {
-	for(i = 0; i < 8; i++) {
-            char filename[50];
-
-	    HDmemset(filename, 0, sizeof(filename));
-	    if(!new)
-		HDstrcat(filename, "old_");
-	    HDstrcat(filename, FILENAME[i]);
-
-	    gen_ext(filename, new, i);
-	}
-    } /* end for new */
-
-    return 0;
-}
diff --git a/tools/h5format_convert/h5format_convert.c b/tools/h5format_convert/h5format_convert.c
deleted file mode 100644
index 75c3713..0000000
--- a/tools/h5format_convert/h5format_convert.c
+++ /dev/null
@@ -1,476 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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 dataset </group/dataset> in the HDF5 file <file_name>:\n");
-    printf("    a. chunked dataset: convert the chunk indexing type to version 1 B-tree\n");
-    printf("    b. compact/contiguous dataset: downgrade the layout version to 3\n");
-    printf("    c. virtual dataset: no action\n");
-    printf("\n");
-    printf("h5format_convert file_name\n");
-    printf("  Convert all datasets in the HDF5 file <file_name>:\n");
-    printf("    a. chunked dataset: convert the chunk indexing type to version 1 B-tree\n");
-    printf("    b. compact/contiguous dataset: downgrade the layout version to 3\n");
-    printf("    c. virtual dataset: no action\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 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 downgrade a dataset's indexing type or layout version:
- *		For chunked:
- *		  Downgrade the chunk indexing type to version 1 B-tree
- *	    	  If type is already version 1 B-tree, no further action
- *		For compact/contiguous:
- *		  Downgrade the layout version from 4 to 3
- *		  If version is already <= 3, no further action
- *		For virtual:
- *		  No further action
- *
- * 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");
-
-    switch(layout_type) {
-	case H5D_CHUNKED:
-	    if(verbose_g)
-		printf("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");
-
-	    if(idx_type == H5D_CHUNK_IDX_BTREE) {
-		if(verbose_g)
-		    printf("Dataset's chunk indexing type is already version 1 B-tree: no further action\n");
-		h5tools_setstatus(EXIT_SUCCESS);
-		goto done;
-	    } else if (verbose_g)
-		printf("Dataset's chunk indexing type is not version 1 B-tree\n");
-	    break;
-
-	case H5D_CONTIGUOUS:
-	    if(verbose_g)
-		printf("Dataset is a contiguous dataset: downgrade layout version as needed\n");
-	    break;
-
-        case H5D_COMPACT:
-	    if(verbose_g)
-		printf("Dataset is a compact dataset: downgrade layout version as needed\n");
-	    break;
-
-        case H5D_VIRTUAL:
-	    if(verbose_g)
-		printf("No further action for virtual dataset\n");
-	    goto done;
-
-	default:
-	    error_msg("unknown layout type for \"%s\"\n", dname);
-	    h5tools_setstatus(EXIT_FAILURE);
-	    goto error;
-
-    } /* end switch */
-
-    /* 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");
-
-    /* Downgrade the dataset */
-    if(H5Dformat_convert(did) < 0) {
-	error_msg("unable to downgrade dataset 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;
-    }
-
-    if(verbose_g) {
-        if(noop_g) {
-            printf("Not processing the file's superblock...\n");
-            h5tools_setstatus(EXIT_SUCCESS);
-            goto done;
-        }
-        printf("Processing the file's superblock...\n");
-    }
-
-    /* Process superblock */
-    if(H5Fformat_convert(fid) < 0) {
-        error_msg("unable to convert file's superblock\"%s\"\n", fname_g);
-        h5tools_setstatus(EXIT_FAILURE);
-        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_edge_v3.h5 b/tools/h5format_convert/testfiles/h5fc_edge_v3.h5
deleted file mode 100644
index debeda4..0000000
Binary files a/tools/h5format_convert/testfiles/h5fc_edge_v3.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_f.ddl b/tools/h5format_convert/testfiles/h5fc_ext1_f.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext1_f.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_i.ddl b/tools/h5format_convert/testfiles/h5fc_ext1_i.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext1_i.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_s.ddl b/tools/h5format_convert/testfiles/h5fc_ext1_s.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext1_s.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext1_s.h5 b/tools/h5format_convert/testfiles/h5fc_ext1_s.h5
deleted file mode 100644
index 103bde6..0000000
Binary files a/tools/h5format_convert/testfiles/h5fc_ext1_s.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_if.ddl b/tools/h5format_convert/testfiles/h5fc_ext2_if.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext2_if.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_is.ddl b/tools/h5format_convert/testfiles/h5fc_ext2_is.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext2_is.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_is.h5 b/tools/h5format_convert/testfiles/h5fc_ext2_is.h5
deleted file mode 100644
index 4d76436..0000000
Binary files a/tools/h5format_convert/testfiles/h5fc_ext2_is.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/h5fc_ext2_sf.ddl b/tools/h5format_convert/testfiles/h5fc_ext2_sf.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext2_sf.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_ext3_isf.ddl b/tools/h5format_convert/testfiles/h5fc_ext3_isf.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/h5fc_ext3_isf.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/h5fc_non_v3.h5 b/tools/h5format_convert/testfiles/h5fc_non_v3.h5
deleted file mode 100644
index af2e8c4..0000000
Binary files a/tools/h5format_convert/testfiles/h5fc_non_v3.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_f.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_f.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext1_f.h5
deleted file mode 100644
index 3cbc7f4..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext1_f.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_i.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
deleted file mode 100644
index d1768c8..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.h5" {
-SUPER_BLOCK {
-   SUPERBLOCK_VERSION 1
-   FREELIST_VERSION 0
-   SYMBOLTABLE_VERSION 0
-   OBJECTHEADER_VERSION 0
-   OFFSET_SIZE 8
-   LENGTH_SIZE 8
-   BTREE_RANK 16
-   BTREE_LEAF 4
-   ISTORE_K 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_i.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext1_i.h5
deleted file mode 100644
index a2c9187..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext1_i.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_s.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext1_s.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext1_s.h5
deleted file mode 100644
index fdf4f33..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext1_s.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_if.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_if.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext2_if.h5
deleted file mode 100644
index 6bf0a2f..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext2_if.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_is.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_is.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext2_is.h5
deleted file mode 100644
index c0c7ecc..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext2_is.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
deleted file mode 100644
index dae9284..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.h5
deleted file mode 100644
index 055cabf..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext2_sf.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl b/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
deleted file mode 100644
index 8ec4656..0000000
--- a/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
+++ /dev/null
@@ -1,58 +0,0 @@
-HDF5 "./testfiles/dmptmp.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 64
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
-   USER_BLOCK {
-      USERBLOCK_SIZE 0
-   }
-}
-GROUP "/" {
-   DATASET "DSET_CONTIGUOUS" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
-   }
-   DATASET "DSET_EA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_FA" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-   }
-   DATASET "DSET_NDATA_BT2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-   }
-   DATASET "DSET_NONE" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-   }
-   GROUP "GROUP" {
-      DATASET "DSET_BT2" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_EA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
-      }
-      DATASET "DSET_NDATA_FA" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
-      }
-      DATASET "DSET_NDATA_NONE" {
-         DATATYPE  H5T_STD_I32LE
-         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
-      }
-   }
-}
-}
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.h5
deleted file mode 100644
index f4caaf4..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext3_isf.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testfiles/old_h5fc_ext_none.h5 b/tools/h5format_convert/testfiles/old_h5fc_ext_none.h5
deleted file mode 100644
index d0bf344..0000000
Binary files a/tools/h5format_convert/testfiles/old_h5fc_ext_none.h5 and /dev/null differ
diff --git a/tools/h5format_convert/testh5fc.sh.in b/tools/h5format_convert/testh5fc.sh.in
deleted file mode 100644
index 15dba6d..0000000
--- a/tools/h5format_convert/testh5fc.sh.in
+++ /dev/null
@@ -1,527 +0,0 @@
-#! /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'
-H5DUMP=../h5dump/h5dump         # The h5dump tool name
-H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
-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
-TMPOUTFILE=outtmp.h5
-TMPFILE=tmp.h5
-TMPCHKFILE=chktmp.h5
-TMPDMPFILE=dmptmp.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_non_v3.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_edge_v3.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext_none.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext_none.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_i.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_s.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_f.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_if.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_is.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_sf.h5
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext3_isf.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_i.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_s.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_f.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_if.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_is.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_sf.h5
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext3_isf.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
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_i.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_s.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_f.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_if.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_is.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_sf.ddl
-$SRC_H5FORMCONV_TESTFILES/h5fc_ext3_isf.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_i.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_s.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_f.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_if.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_is.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_sf.ddl
-$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext3_isf.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=$SRC_H5FORMCONV_TESTFILES
-    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/$TMPOUTFILE
-    TFILE=$2
-    if [ ! -z "$2" ] && [ -e $TESTDIR/$2 ] ; then
-    $CP $TESTDIR/$2 $TESTDIR/$TMPOUTFILE
-    TFILE=$TMPOUTFILE
-    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
-    COMPARE_OUT $expect $actual
-
-    # 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
-}
-# Like TOOLTEST but tmpfile is for IDX_CHECK
-TOOLTEST_CHK() {
-    TESTING $FORMCONV $2 $3 $4 $1
-    $RM $TESTDIR/$TMPCHKFILE
-    $CP $TESTDIR/$1 $TESTDIR/$TMPCHKFILE
-    $RUNSERIAL $FORMCONV_BIN $2 $3 $4 $TESTDIR/$TMPCHKFILE
-    exitcode=$?
-    if [ $exitcode -ne 0 ]; then
-    echo "*FAILED*"
-    echo "    The tool exits failure"
-    nerrors="`expr $nerrors + 1`"
-    else
-    echo " PASSED"
-    fi
-}
-# Like TOOLTEST but tmpfile is for H5DUMP_CHECK
-TOOLTEST_DMP() {
-    TESTING $FORMCONV $2 $3 $4 $1
-    $RM $TESTDIR/$TMPDMPFILE
-    $CP $TESTDIR/$1 $TESTDIR/$TMPDMPFILE
-    $RUNSERIAL $FORMCONV_BIN $2 $3 $4 $TESTDIR/$TMPDMPFILE
-    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'
-}
-
-# Assume $TESTDIR/$TMPFILE is the converted test file
-# $1 dataset name
-IDX_CHECK() {
-    CHECKING $1
-    $RUNSERIAL $CHK_IDX_BIN $TESTDIR/$TMPCHKFILE $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
-}
-
-# $1 is the expected output
-# $2 is the output from testing
-COMPARE_OUT() {
-    if $CMP $1 $2; 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
-}
-
-# Assume $TESTDIR/$TMPFILE is the converted test file
-# $1 is the test file for verifying h5dump output
-# $2 is the expected output from h5dump
-H5DUMP_CHECK() {
-    CHECKING h5dump output for $1
-    expect="$TESTDIR/$2"
-    actual="$TESTDIR/`basename $2 .ddl`.out"
-    actual_err="$TESTDIR/`basename $2 .ddl`.err"
-    $RUNSERIAL $H5DUMP_BIN -BH $TESTDIR/$TMPDMPFILE > $actual 2>$actual_err
-    cat $actual_err >> $actual
-
-    # Compare output
-    COMPARE_OUT $expect $actual
-
-    # Clean up output file
-    if test -z "$HDF5_NOCLEANUP"; then
-	$RM $actual $actual_err
-    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 old_h5fc_ext_none.h5 (just -d option, file exists)
-# h5format_convert --dname old_h5fc_ext_none.h5 (just --dname option, file exists)
-# h5format_convert --dname (just --dname option)
-# h5format_convert --dname=nonexist old_h5fc_ext_none.h5 (dataset does not exist, file exists)
-TOOLTEST_OUT h5fc_d_file.ddl old_h5fc_ext_none.h5 -d
-TOOLTEST_OUT h5fc_d_file.ddl old_h5fc_ext_none.h5 --dname
-TOOLTEST_OUT h5fc_dname.ddl '' --dname
-TOOLTEST_OUT h5fc_nonexistdset_file.ddl old_h5fc_ext_none.h5 --dname=nonexist
-#
-#
-#
-# h5format_convert -d /DSET_CONTIGUOUS -v old_h5fc_ext_none.h5 (verbose, contiguous dataset)
-# h5format_convert -d /GROUP/DSET_BT2 --verbose old_h5fc_ext_none.h5 (verbose, bt1 dataset)
-# h5format_convert -d /DSET_NDATA_BT2 -v -n old_h5fc_ext_none.h5 (verbose, noop, bt1+nodata dataset)
-# h5format_convert -v old_h5fc_ext_none.h5 (verbose, all datasets)
-TOOLTEST_OUT h5fc_v_non_chunked.ddl old_h5fc_ext_none.h5 -d /DSET_CONTIGUOUS -v
-TOOLTEST_OUT h5fc_v_bt1.ddl old_h5fc_ext_none.h5 -d /GROUP/DSET_BT2 --verbose
-TOOLTEST_OUT h5fc_v_ndata_bt1.ddl old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2 -v -n
-TOOLTEST_OUT h5fc_v_all.ddl old_h5fc_ext_none.h5 -v
-#
-#
-#
-# h5format_convert -d /DSET_EA -v -n h5fc_ext_none.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_ext_none.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_ext_none.h5
-# h5format_convert -d /GROUP/DSET_NDATA_EA h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_BT2 h5fc_ext_none.h5
-# h5format_convert -d /DSET_NDATA_BT2 h5fc_ext_none.h5
-# h5format_convert -d /DSET_FA h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_FA h5fc_ext_none.h5
-# h5format_convert -d /DSET_NONE h5fc_ext_none.h5
-# h5format_convert -d /GROUP/DSET_NDATA_NONE h5fc_ext_none.h5
-TOOLTEST_CHK h5fc_ext_none.h5 -d /DSET_EA
-IDX_CHECK /DSET_EA
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /GROUP/DSET_NDATA_EA
-IDX_CHECK /GROUP/DSET_NDATA_EA
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /GROUP/DSET_BT2
-IDX_CHECK /GROUP/DSET_BT2
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /DSET_NDATA_BT2
-IDX_CHECK /DSET_NDATA_BT2
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /DSET_FA
-IDX_CHECK /DSET_FA
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /GROUP/DSET_NDATA_FA
-IDX_CHECK /GROUP/DSET_NDATA_FA
-#
-TOOLTEST_CHK h5fc_ext_none.h5 -d /DSET_NONE
-IDX_CHECK /DSET_NONE
-#
-TOOLTEST_CHK h5fc_ext_none.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_BT2 old_h5fc_ext_none.h5 (v1-btree dataset)
-# h5format_convert -d /DSET_CONTIGUOUS h5fc_non_v3.h5 (non-chunked dataset)
-TOOLTEST old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2
-TOOLTEST h5fc_non_v3.h5 -d /DSET_CONTIGUOUS
-#
-#
-#
-# 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_CHK 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_CHK h5fc_edge_v3.h5
-IDX_CHECK /DSET_EDGE
-#
-#
-
-# The following test files have messages in the superblock extension.
-# Verify h5dump output for correctness after conversion
-TOOLTEST_DMP h5fc_ext1_i.h5
-H5DUMP_CHECK h5fc_ext1_i.h5 h5fc_ext1_i.ddl
-TOOLTEST_DMP h5fc_ext1_s.h5
-H5DUMP_CHECK h5fc_ext1_s.h5 h5fc_ext1_s.ddl
-TOOLTEST_DMP h5fc_ext1_f.h5
-H5DUMP_CHECK h5fc_ext1_f.h5 h5fc_ext1_f.ddl
-#
-TOOLTEST_DMP h5fc_ext2_if.h5
-H5DUMP_CHECK h5fc_ext2_if.h5 h5fc_ext2_if.ddl
-TOOLTEST_DMP h5fc_ext2_is.h5
-H5DUMP_CHECK h5fc_ext2_is.h5 h5fc_ext2_is.ddl
-TOOLTEST_DMP h5fc_ext2_sf.h5
-H5DUMP_CHECK h5fc_ext2_sf.h5 h5fc_ext2_sf.ddl
-#
-TOOLTEST_DMP h5fc_ext3_isf.h5
-H5DUMP_CHECK h5fc_ext3_isf.h5 h5fc_ext3_isf.ddl
-#
-#
-#
-TOOLTEST_DMP old_h5fc_ext1_i.h5
-H5DUMP_CHECK old_h5fc_ext1_i.h5 old_h5fc_ext1_i.ddl
-TOOLTEST_DMP old_h5fc_ext1_s.h5
-H5DUMP_CHECK old_h5fc_ext1_s.h5 old_h5fc_ext1_s.ddl
-TOOLTEST_DMP old_h5fc_ext1_f.h5
-H5DUMP_CHECK old_h5fc_ext1_f.h5 old_h5fc_ext1_f.ddl
-#
-TOOLTEST_DMP old_h5fc_ext2_if.h5
-H5DUMP_CHECK old_h5fc_ext2_if.h5 old_h5fc_ext2_if.ddl
-TOOLTEST_DMP old_h5fc_ext2_is.h5
-H5DUMP_CHECK old_h5fc_ext2_is.h5 old_h5fc_ext2_is.ddl
-TOOLTEST_DMP old_h5fc_ext2_sf.h5
-H5DUMP_CHECK old_h5fc_ext2_sf.h5 old_h5fc_ext2_sf.ddl
-#
-TOOLTEST_DMP old_h5fc_ext3_isf.h5
-H5DUMP_CHECK old_h5fc_ext3_isf.h5 old_h5fc_ext3_isf.ddl
-#
-# 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/CMakeLists.txt b/tools/h5import/CMakeLists.txt
deleted file mode 100644
index b885a76..0000000
--- a/tools/h5import/CMakeLists.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5IMPORT)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5import executables
-# --------------------------------------------------------------------
-add_executable (h5import ${HDF5_TOOLS_H5IMPORT_SOURCE_DIR}/h5import.c)
-TARGET_NAMING (h5import STATIC)
-TARGET_C_PROPERTIES (h5import STATIC " " " ")
-target_link_libraries (h5import  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-#set_target_properties (h5import PROPERTIES COMPILE_DEFINITIONS H5DEBUGIMPORT)
-set_target_properties (h5import PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5import)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5import executables
-  # --------------------------------------------------------------------
-  add_executable (h5importtest ${HDF5_TOOLS_H5IMPORT_SOURCE_DIR}/h5importtest.c)
-  TARGET_NAMING (h5importtest STATIC)
-  TARGET_C_PROPERTIES (h5importtest STATIC " " " ")
-  target_link_libraries (h5importtest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (h5importtest PROPERTIES FOLDER tools)
-
-  include (CMakeTests.cmake)
-
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5import ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5import
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5import/CMakeTests.cmake b/tools/h5import/CMakeTests.cmake
deleted file mode 100644
index 6986aee..0000000
--- a/tools/h5import/CMakeTests.cmake
+++ /dev/null
@@ -1,495 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  set (HDF5_REFERENCE_CONF_FILES
-      binfp64.conf
-      binin8.conf
-      binin8w.conf
-      binin16.conf
-      binin32.conf
-      binuin16.conf
-      binuin32.conf
-      txtfp32.conf
-      txtfp64.conf
-      txtin8.conf
-      txtin16.conf
-      txtin32.conf
-      txtuin16.conf
-      txtuin32.conf
-      textpfe.conf
-      txtstr.conf
-  )
-  set (HDF5_REFERENCE_TXT_FILES
-      txtfp32.txt
-      txtfp64.txt
-      txtuin16.txt
-      txtuin32.txt
-      txtin8.txt
-      txtin16.txt
-      txtin32.txt
-      textpfe64.txt
-      txtstr.txt
-      dbinfp64.h5.txt
-      dbinin8.h5.txt
-      dbinin8w.h5.txt
-      dbinin16.h5.txt
-      dbinin32.h5.txt
-      dbinuin16.h5.txt
-      dbinuin32.h5.txt
-      dtxtstr.h5.txt
-  )
-  set (HDF5_REFERENCE_TEST_FILES
-      binfp64.h5
-      binin8.h5
-      binin8w.h5
-      binin16.h5
-      binin32.h5
-      binuin16.h5
-      binuin32.h5
-      txtfp32.h5
-      txtfp64.h5
-      txtin8.h5
-      txtin16.h5
-      txtin32.h5
-      txtuin16.h5
-      txtuin32.h5
-      txtstr.h5
-      textpfe.h5
-  )
-
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-  foreach (conf_file ${HDF5_REFERENCE_CONF_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${conf_file}")
-    #message (STATUS " Copying ${conf_file}")
-    add_custom_command (
-        TARGET     h5import
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5IMPORT_SOURCE_DIR}/testfiles/${conf_file} ${dest}
-    )
-  endforeach (conf_file ${HDF5_REFERENCE_CONF_FILES})
-
-  foreach (txt_file ${HDF5_REFERENCE_TXT_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${txt_file}")
-    #message (STATUS " Copying ${txt_file}")
-    add_custom_command (
-        TARGET     h5import
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5IMPORT_SOURCE_DIR}/testfiles/${txt_file} ${dest}
-    )
-  endforeach (txt_file ${HDF5_REFERENCE_TXT_FILES})
-
-  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${h5_file}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5import
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5IMPORT_SOURCE_DIR}/testfiles/${h5_file} ${dest}
-    )
-  endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-  
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-  MACRO (ADD_H5_TEST testname importfile conffile testfile)
-    # If using memchecker skip macro based tests
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5IMPORT-${testname} COMMAND $<TARGET_FILE:h5import> ${importfile} -c ${conffile} -o ${testfile})
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5IMPORT-${testname} PROPERTIES DEPENDS H5IMPORT-h5importtest)
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5IMPORT-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${testfile}
-              ${testfile}.new
-              ${testfile}.new.err
-              ${testfile}.out
-              ${testfile}.out.err
-      )
-      set_tests_properties (H5IMPORT-${testname}-clear-objects PROPERTIES DEPENDS H5IMPORT-h5importtest)
-
-      add_test (NAME H5IMPORT-${testname} COMMAND $<TARGET_FILE:h5import> ${importfile} -c ${conffile} -o ${testfile})
-      set_tests_properties (H5IMPORT-${testname} PROPERTIES DEPENDS H5IMPORT-${testname}-clear-objects)
-
-      add_test (
-          NAME H5IMPORT-${testname}-H5DMP
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${testfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${testfile}.new"
-              -D "TEST_EXPECT=0"
-              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5IMPORT-${testname}-H5DMP PROPERTIES DEPENDS H5IMPORT-${testname})
-      add_test (
-          NAME H5IMPORT-${testname}-H5DMP_CMP
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=testfiles/${testfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${testfile}.out"
-              -D "TEST_EXPECT=0"
-              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
-              -D "TEST_REFERENCE=${testfile}.new"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5IMPORT-${testname}-H5DMP_CMP PROPERTIES DEPENDS H5IMPORT-${testname}-H5DMP)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST testname importfile conffile testfile)
-
-  MACRO (ADD_H5_DUMPTEST testname datasetname testfile)
-    # If using memchecker skip tests
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5IMPORT-DUMP-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              d${testfile}
-              d${testfile}.bin
-              d${testfile}.imp
-              d${testfile}.imp.err
-              d${testfile}.dmp
-              d${testfile}.dmp.err
-              d${testfile}.dff
-              d${testfile}.dff.err
-      )
-      set_tests_properties (H5IMPORT-DUMP-${testname}-clear-objects PROPERTIES DEPENDS H5IMPORT-h5importtest)
-
-      if ("${ARGN}" STREQUAL "BINARY")
-        add_test (
-            NAME H5IMPORT-DUMP-${testname}-H5DMP
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                -D "TEST_ARGS:STRING=-p;-d;${datasetname};-o;d${testfile}.bin;-b;testfiles/${testfile}"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-                -D "TEST_OUTPUT=d${testfile}.dmp"
-                -D "TEST_EXPECT=0"
-                -D "TEST_SKIP_COMPARE=TRUE"
-                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-        )
-      else ("${ARGN}" STREQUAL "BINARY")
-        add_test (
-            NAME H5IMPORT-DUMP-${testname}-H5DMP
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                -D "TEST_ARGS:STRING=-p;-d;${datasetname};-o;d${testfile}.bin;-y;--width=1;testfiles/${testfile}"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-                -D "TEST_OUTPUT=d${testfile}.dmp"
-                -D "TEST_EXPECT=0"
-                -D "TEST_SKIP_COMPARE=TRUE"
-                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-        )
-      endif ("${ARGN}" STREQUAL "BINARY")
-      set_tests_properties (H5IMPORT-DUMP-${testname}-H5DMP PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}-clear-objects")
-      
-      add_test (
-          NAME H5IMPORT-DUMP-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5import>"
-              -D "TEST_ARGS:STRING=d${testfile}.bin;-c;d${testfile}.dmp;-o;d${testfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=d${testfile}.imp"
-              -D "TEST_EXPECT=0"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5IMPORT-DUMP-${testname} PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}-H5DMP")
-
-      add_test (
-          NAME H5IMPORT-DUMP-${testname}-H5DFF
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
-              -D "TEST_ARGS:STRING=-r;d${testfile};testfiles/${testfile};${datasetname};${datasetname}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=d${testfile}.dff"
-              -D "TEST_EXPECT=0"
-              -D "TEST_FILTER=(^(Warning)[^\n]*)"
-              -D "TEST_REFERENCE=testfiles/d${testfile}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5IMPORT-DUMP-${testname}-H5DFF PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_DUMPTEST testname datasetname testfile)
-
-  MACRO (ADD_H5_SKIP_DUMPTEST testname datasetname testfile)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5IMPORT-DUMP-${testname}-SKIPPED
-          COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${testname} ${datasetname} ${testfile} --- DEFLATE filter not available"
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_SKIP_DUMPTEST testname datasetname testfile)
-
-  # --------------------------------------------------------------------
-  # Determine if filter is available for h5diff
-  # --------------------------------------------------------------------
-  if (H5_HAVE_FILTER_DEFLATE)
-    set (USE_FILTER_DEFLATE "true")
-  endif (H5_HAVE_FILTER_DEFLATE)
-
-##############################################################################
-##############################################################################
-###           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 H5IMPORT-clear-objects
-        COMMAND    ${CMAKE_COMMAND}
-            -E remove 
-            binfp64.bin
-            binin8.bin
-            binin8w.bin
-            binin16.bin
-            binin32.bin
-            binuin16.bin
-            binuin32.bin
-            txtin32.h5
-            txtin32.h5.new
-            txtin32.h5.new.err
-            txtin32.h5.out
-            txtin32.h5.out.err
-            txtin16.h5
-            txtin16.h5.new
-            txtin16.h5.new.err
-            txtin16.h5.out
-            txtin16.h5.out.err
-            txtin8.h5
-            txtin8.h5.new
-            txtin8.h5.new.err
-            txtin8.h5.out
-            txtin8.h5.out.err
-            txtuin16.h5
-            txtuin16.h5.new
-            txtuin16.h5.new.err
-            txtuin16.h5.out
-            txtuin16.h5.out.err
-            txtuin32.h5
-            txtuin32.h5.new
-            txtuin32.h5.new.err
-            txtuin32.h5.out
-            txtuin32.h5.out.err
-            txtfp32.h5
-            txtfp32.h5.new
-            txtfp32.h5.new.err
-            txtfp32.h5.out
-            txtfp32.h5.out.err
-            txtfp64.h5
-            txtfp64.h5.new
-            txtfp64.h5.new.err
-            txtfp64.h5.out
-            txtfp64.h5.out.err
-            binfp64.h5
-            binfp64.h5.new
-            binfp64.h5.new.err
-            binfp64.h5.out
-            binfp64.h5.out.err
-            binin8.h5
-            binin8.h5.new
-            binin8.h5.new.err
-            binin8.h5.out
-            binin8.h5.out.err
-            binin8w.h5
-            binin8w.h5.new
-            binin8w.h5.new.err
-            binin8w.h5.out
-            binin8w.h5.out.err
-            binin16.h5
-            binin16.h5.new
-            binin16.h5.new.err
-            binin16.h5.out
-            binin16.h5.out.err
-            binin32.h5
-            binin32.h5.new
-            binin32.h5.new.err
-            binin32.h5.out
-            binin32.h5.out.err
-            binuin16.h5
-            binuin16.h5.new
-            binuin16.h5.new.err
-            binuin16.h5.out
-            binuin16.h5.out.err
-            binuin32.h5
-            binuin32.h5.new
-            binuin32.h5.new.err
-            binuin32.h5.out
-            binuin32.h5.out.err
-            txtstr.h5
-            txtstr.h5.new
-            txtstr.h5.new.err
-            txtstr.h5.out
-            txtstr.h5.out.err
-            textpfe.h5
-            textpfe.h5.new
-            textpfe.h5.new.err
-            textpfe.h5.out
-            textpfe.h5.out.err
-            dbinfp64.h5
-            dbinfp64.h5.bin
-            dbinfp64.h5.imp
-            dbinfp64.h5.imp.err
-            dbinfp64.h5.dmp
-            dbinfp64.h5.dmp.err
-            dbinfp64.h5.dff
-            dbinfp64.h5.dff.err
-            dbinin8.h5
-            dbinin8.h5.bin
-            dbinin8.h5.imp
-            dbinin8.h5.imp.err
-            dbinin8.h5.dmp
-            dbinin8.h5.dmp.err
-            dbinin8.h5.dff
-            dbinin8.h5.dff.err
-            dbinin8w.h5
-            dbinin8w.h5.bin
-            dbinin8w.h5.imp
-            dbinin8w.h5.imp.err
-            dbinin8w.h5.dmp
-            dbinin8w.h5.dmp.err
-            dbinin8w.h5.dff
-            dbinin8w.h5.dff.err
-            dbinin16.h5
-            dbinin16.h5.bin
-            dbinin16.h5.imp
-            dbinin16.h5.imp.err
-            dbinin16.h5.dmp
-            dbinin16.h5.dmp.err
-            dbinin16.h5.dff
-            dbinin16.h5.dff.err
-            dbinin32.h5
-            dbinin32.h5.bin
-            dbinin32.h5.imp
-            dbinin32.h5.imp.err
-            dbinin32.h5.dmp
-            dbinin32.h5.dmp.err
-            dbinin32.h5.dff
-            dbinin32.h5.dff.err
-            dbinuin16.h5
-            dbinuin16.h5.bin
-            dbinuin16.h5.imp
-            dbinuin16.h5.imp.err
-            dbinuin16.h5.dmp
-            dbinuin16.h5.dmp.err
-            dbinuin16.h5.dff
-            dbinuin16.h5.dff.err
-            dbinuin32.h5
-            dbinuin32.h5.bin
-            dbinuin32.h5.imp
-            dbinuin32.h5.imp.err
-            dbinuin32.h5.dmp
-            dbinuin32.h5.dmp.err
-            dbinuin32.h5.dff
-            dbinuin32.h5.dff.err
-            dtxtstr.h5
-            dtxtstr.h5.bin
-            dtxtstr.h5.imp
-            dtxtstr.h5.imp.err
-            dtxtstr.h5.dmp
-            dtxtstr.h5.dmp.err
-            dtxtstr.h5.dff
-            dtxtstr.h5.dff.err
-    )
-    set (last_test "H5IMPORT-clear-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  add_test (
-      NAME H5IMPORT-h5importtest-clear-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove 
-          binfp64.bin
-          binin8.bin
-          binin8w.bin
-          binin16.bin
-          binin32.bin
-          binuin16.bin
-          binuin32.bin
-  )
-  if (NOT "${last_test}" STREQUAL "")
-    set_tests_properties (H5IMPORT-h5importtest-clear-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
-  set (last_test "H5IMPORT-clear-objects")
-
-  add_test (NAME H5IMPORT-h5importtest COMMAND $<TARGET_FILE:h5importtest>)
-  set_tests_properties (H5IMPORT-h5importtest PROPERTIES DEPENDS H5IMPORT-h5importtest-clear-objects)
-
-  # ----- TESTING "ASCII I32 rank 3 - Output BE " ;
-  ADD_H5_TEST (ASCII_I32 testfiles/txtin32.txt testfiles/txtin32.conf txtin32.h5)
-
-  # ----- TESTING "ASCII I16 rank 3 - Output LE - CHUNKED - extended" 
-  ADD_H5_TEST (ASCII_I16 testfiles/txtin16.txt testfiles/txtin16.conf txtin16.h5)
-
-  # ----- TESTING "ASCII I8 - rank 3 - Output I8 LE-Chunked+Extended+Compressed " 
-  ADD_H5_TEST (ASCII_I8 testfiles/txtin8.txt testfiles/txtin8.conf txtin8.h5)
-
-  # ----- TESTING "ASCII UI16 - rank 2 - Output LE+Chunked+Compressed " 
-  ADD_H5_TEST (ASCII_UI16 testfiles/txtuin16.txt testfiles/txtuin16.conf txtuin16.h5)
-
-  # ----- TESTING "ASCII UI32 - rank 3 - Output BE" 
-  ADD_H5_TEST (ASCII_UI32 testfiles/txtuin32.txt testfiles/txtuin32.conf txtuin32.h5)
-
-  # ----- TESTING "ASCII F32 - rank 3 - Output LE " 
-  ADD_H5_TEST (ASCII_F32 testfiles/txtfp32.txt testfiles/txtfp32.conf txtfp32.h5)
-
-  # ----- TESTING "ASCII F64 - rank 3 - Output BE + CHUNKED+Extended+Compressed " 
-  ADD_H5_TEST (ASCII_F64 testfiles/txtfp64.txt testfiles/txtfp64.conf txtfp64.h5)
-
-  # ----- TESTING "BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed " 
-  ADD_H5_TEST (BINARY_F64 binfp64.bin testfiles/binfp64.conf binfp64.h5)
-  if (NOT USE_FILTER_DEFLATE)
-    ADD_H5_SKIP_DUMPTEST (BINARY_F64 "/fp/bin/64-bit" binfp64.h5 BINARY)
-  else (NOT USE_FILTER_DEFLATE)
-    ADD_H5_DUMPTEST (BINARY_F64 "/fp/bin/64-bit" binfp64.h5 BINARY)
-  endif (NOT USE_FILTER_DEFLATE)
-
-  # ----- TESTING "BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed " 
-  ADD_H5_TEST (BINARY_I8 binin8.bin testfiles/binin8.conf binin8.h5)
-  if (NOT USE_FILTER_DEFLATE)
-    ADD_H5_SKIP_DUMPTEST (BINARY_I8 "/int/bin/8-bit" binin8.h5 BINARY)
-  else (NOT USE_FILTER_DEFLATE)
-    ADD_H5_DUMPTEST (BINARY_I8 "/int/bin/8-bit" binin8.h5 BINARY)
-  endif (NOT USE_FILTER_DEFLATE)
-
-  # ----- TESTING "BINARY I16 - rank 3 - Output order LE + CHUNKED + extended " 
-  ADD_H5_TEST (BINARY_I16 binin16.bin testfiles/binin16.conf binin16.h5)
-  ADD_H5_DUMPTEST (BINARY_I16 "/int/bin/16-bit" binin16.h5 BINARY)
-
-  # ----- TESTING "BINARY I32 - rank 3 - Output BE + CHUNKED " 
-  ADD_H5_TEST (BINARY_I32 binin32.bin testfiles/binin32.conf binin32.h5)
-  ADD_H5_DUMPTEST (BINARY_I32 "/int/bin/32-bit" binin32.h5 BINARY)
-
-  # ----- TESTING "BINARY UI16 - rank 3 - Output byte BE + CHUNKED " 
-  ADD_H5_TEST (BINARY_UI16 binuin16.bin testfiles/binuin16.conf binuin16.h5)
-  ADD_H5_DUMPTEST (BINARY_UI16 "/int/buin/16-bit" binuin16.h5 BINARY)
-
-  # ----- TESTING "BINARY UI32 - rank 3 - Output LE " 
-  ADD_H5_TEST (BINARY_UI32 binuin32.bin testfiles/binuin32.conf binuin32.h5)
-  ADD_H5_DUMPTEST (BINARY_UI32 "/int/buin/32-bit" binuin32.h5 BINARY)
-
-  # ----- TESTING "STR" 
-  ADD_H5_TEST (STR testfiles/txtstr.txt testfiles/txtstr.conf txtstr.h5)
-  ADD_H5_DUMPTEST (STR "/mytext/data" txtstr.h5)
-
-  # ----- TESTING "BINARY I8 CR LF EOF" 
-  ADD_H5_TEST (BINARY_I8_EOF binin8w.bin testfiles/binin8w.conf binin8w.h5)
-  ADD_H5_DUMPTEST (BINARY_I8_EOF "/dataset0" binin8w.h5 BINARY)
-
-  # ----- TESTING "ASCII F64 - rank 1 - INPUT-CLASS TEXTFPE " 
-  ADD_H5_TEST (ASCII_F64_R1 testfiles/textpfe64.txt testfiles/textpfe.conf textpfe.h5)
-
diff --git a/tools/h5import/Makefile.am b/tools/h5import/Makefile.am
deleted file mode 100644
index af60478..0000000
--- a/tools/h5import/Makefile.am
+++ /dev/null
@@ -1,46 +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.
-##
-## 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
-
-# Test programs and scripts
-TEST_PROG=h5importtest
-TEST_SCRIPT=h5importtestutil.sh
-
-check_PROGRAMS=$(TEST_PROG)
-check_SCRIPT=h5importtestutil.sh
-SCRIPT_DEPEND=h5import$(EXEEXT)
-
-# Our main targets
-bin_PROGRAMS=h5import
-
-# Add h5import specific linker flags here
-h5import_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All programs depend on the main hdf5 library and the tools library
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# Temporary files from h5importtest
-CHECK_CLEANFILES+=*.bin
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5import/Makefile.in b/tools/h5import/Makefile.in
deleted file mode 100644
index dd401fa..0000000
--- a/tools/h5import/Makefile.in
+++ /dev/null
@@ -1,1488 +0,0 @@
-# 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)
-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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = h5importtestutil.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-am__EXEEXT_1 = h5importtest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-h5import_SOURCES = h5import.c
-h5import_OBJECTS = h5import.$(OBJEXT)
-h5import_LDADD = $(LDADD)
-h5import_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 = 
-h5import_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5import_LDFLAGS) $(LDFLAGS) -o $@
-h5importtest_SOURCES = h5importtest.c
-h5importtest_OBJECTS = h5importtest.$(OBJEXT)
-h5importtest_LDADD = $(LDADD)
-h5importtest_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 = h5import.c h5importtest.c
-DIST_SOURCES = h5import.c h5importtest.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)/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@
-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
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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 from h5importtest
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.bin
-
-# Test programs and scripts
-TEST_PROG = h5importtest
-TEST_SCRIPT = h5importtestutil.sh
-check_SCRIPT = h5importtestutil.sh
-SCRIPT_DEPEND = h5import$(EXEEXT)
-
-# Add h5import specific linker flags here
-h5import_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All programs depend on the main hdf5 library and the tools 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/h5import/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5import/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):
-h5importtestutil.sh: $(top_builddir)/config.status $(srcdir)/h5importtestutil.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
-
-h5import$(EXEEXT): $(h5import_OBJECTS) $(h5import_DEPENDENCIES) $(EXTRA_h5import_DEPENDENCIES) 
-	@rm -f h5import$(EXEEXT)
-	$(AM_V_CCLD)$(h5import_LINK) $(h5import_OBJECTS) $(h5import_LDADD) $(LIBS)
-
-h5importtest$(EXEEXT): $(h5importtest_OBJECTS) $(h5importtest_DEPENDENCIES) $(EXTRA_h5importtest_DEPENDENCIES) 
-	@rm -f h5importtest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5importtest_OBJECTS) $(h5importtest_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5import.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5importtest.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 $$?
-h5importtest.log: h5importtest$(EXEEXT)
-	@p='h5importtest$(EXEEXT)'; \
-	b='h5importtest'; \
-	$(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 $(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)
-
-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/h5import/h5import.c b/tools/h5import/h5import.c
deleted file mode 100644
index 9617df3..0000000
--- a/tools/h5import/h5import.c
+++ /dev/null
@@ -1,4393 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "hdf5.h"
-#include "H5private.h"
-#include <stdio.h>
-#include <math.h>
-#include <string.h>
-#include <ctype.h>
-#include "h5import.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5import"
-
-#ifdef H5_HAVE_WIN32_API
-#define READ_OPEN_FLAGS "rb"
-#else
-#define READ_OPEN_FLAGS "r"
-#endif
-
-/* Local function declarations */
-static int  gtoken(char *s);
-static int  process(struct Options *opt);
-static int  processConfigurationFile(char *infile, struct Input *in);
-static int  mapKeywordToIndex(char *key);
-static int  parsePathInfo(struct path_info *path, char *strm);
-static int  parseDimensions(struct Input *in, char *strm);
-static int  getInputSize(struct Input *in, int ival);
-static int  getInputClass(struct Input *in, char * strm);
-static int  getInputClassType(struct Input *in, char * strm);
-static int  InputClassStrToInt(char *temp);
-static int  getRank(struct Input *in, FILE *strm);
-static int  getDimensionSizes(struct Input *in, FILE *strm);
-static int  getOutputSize(struct Input *in, FILE *strm);
-static int  getOutputClass(struct Input *in, FILE *strm);
-static int  OutputClassStrToInt(char *temp);
-static int  getOutputArchitecture(struct Input *in, FILE *strm);
-static int  OutputArchStrToInt(const char *temp);
-static int  getOutputByteOrder(struct Input *in, FILE *strm);
-static int  OutputByteOrderStrToInt(const char *temp);
-static int  getChunkedDimensionSizes(struct Input *in, FILE *strm);
-static int  getCompressionType(struct Input *in, FILE *strm);
-static int  CompressionTypeStrToInt(char *temp);
-static int  getCompressionParameter(struct Input *in, FILE *strm);
-static int  getExternalFilename(struct Input *in, FILE *strm);
-static int  getMaximumDimensionSizes(struct Input *in, FILE *strm);
-static int  processDataFile(char *infile, struct Input *in, hid_t file_id);
-static int  readIntegerData(FILE *strm, struct Input *in);
-static int  readFloatData(FILE *strm, struct Input *in);
-static int  allocateIntegerStorage(struct Input *in);
-static int  allocateFloatStorage(struct Input *in);
-static int  readUIntegerData(FILE *strm, struct Input *in);
-static int  allocateUIntegerStorage(struct Input *in);
-static int  validateConfigurationParameters(struct Input *in);
-static int  processStrData(FILE *strm, struct Input *in, hid_t file_id);
-static int  processStrHDFData(FILE *strm, struct Input *in, hid_t file_id);
-
-int main(int argc, char *argv[])
-{
-    struct Options  opt;
-    int             outfile_named = FALSE;
-    int             token;
-    int             i;
-    int             state = 0;
-    struct Input   *in = NULL;
-
-    const char     *err1 = "Invalid number of arguments:  %d.\n";
-    const char     *err2 = "Error in state table.\n";
-    const char     *err3 = "No output file given.\n";
-    const char     *err4 = "Program aborted.\n";
-    const char     *err5 = "Invalid path %s.\n";
-    const char     *err6 = "Invalid dimensions - %s.\n";
-    const char     *err7 = "Invalid type of data - %s.\n";
-    const char     *err8 = "Invalid size of data - %s.\n";
-    const char     *err9 = "Cannot specify more than 30 input files in one call to h5import.\n";
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    (void) HDsetvbuf(stderr, (char *) NULL, _IOLBF, 0);
-    (void) HDsetvbuf(stdout, (char *) NULL, _IOLBF, 0);
-
-    if (argv[1] && (HDstrcmp("-V", argv[1]) == 0)) {
-        print_version(PROGRAMNAME);
-        HDexit(EXIT_SUCCESS);
-    }
-
-    /*
-     * validate the number of command line arguments
-     */
-    if (argc < 2) {
-        (void) HDfprintf(stderr, err1, argc);
-        usage(argv[0]);
-        goto err;
-    }
-
-    /* Initialize the file structure to 0 */
-    HDmemset(&opt, 0, sizeof(struct Options));
-
-    /*
-     * parse the command line
-     */
-    for (i = 1; i < argc; i++) {
-        if ((token = gtoken(argv[i])) == ERR) {
-            usage(argv[0]);
-            goto err;
-        }
-
-        state = state_table[state][token];
-
-        switch (state) {
-
-        case 1: /* counting input files */
-            if (opt.fcount < 29) {
-                (void) HDstrcpy(opt.infiles[opt.fcount].datafile, argv[i]);
-                in = &(opt.infiles[opt.fcount].in);
-                opt.infiles[opt.fcount].config = 0;
-                setDefaultValues(in, opt.fcount);
-                opt.fcount++;
-            }
-            else {
-                (void) HDfprintf(stderr, err9, argv[i]);
-                goto err;
-            }
-
-            break;
-
-        case 2: /* -c found; look for configfile */
-            break;
-
-        case 3: /* get configfile name */
-            (void) HDstrcpy(opt.infiles[opt.fcount-1].configfile, argv[i]);
-            opt.infiles[opt.fcount - 1].config = 1;
-            break;
-
-        case 4: /* -o found; look for outfile */
-            break;
-
-        case 5: /* get outfile found */
-            (void) HDstrcpy(opt.outfile, argv[i]);
-            outfile_named = TRUE;
-            break;
-
-        case 6: /* -h found; help, then exit */
-            help(argv[0]);
-            HDexit(EXIT_SUCCESS);
-            break;
-
-        case 7: /* -d found; look for dimensions */
-            break;
-
-        case 8: /* read dimensions */
-            if (parseDimensions(in, argv[i]) == -1) {
-                (void) HDfprintf(stderr, err6, argv[i]);
-                goto err;
-            }
-            break;
-
-        case 9: /* -p found; look for path name */
-            break;
-
-        case 10: /* read path name */
-            if (parsePathInfo(&in->path, argv[i]) == -1) {
-                (void) HDfprintf(stderr, err5, argv[i]);
-                goto err;
-            }
-            break;
-
-        case 11: /* -t found; look for data type */
-            break;
-
-        case 12: /* read data type */
-            if (getInputClass(in, argv[i]) == -1) {
-                (void) HDfprintf(stderr, err7, argv[i]);
-                goto err;
-            }
-
-            if (in->inputClass == 0 || in->inputClass == 4)
-                in->outputClass = 0;
-            if (in->inputClass == 1 || in->inputClass == 2 || in->inputClass == 3)
-                in->outputClass = 1;
-            if (in->inputClass == 6 || in->inputClass == 7)
-                in->outputClass = 2;
-            break;
-
-        case 13: /* -s found; look for data size */
-            break;
-
-        case 14: /* read data size */
-            if (getInputSize(in, (int) HDstrtol(argv[i], NULL, BASE_10)) == -1) {
-                (void) HDfprintf(stderr, err8, argv[i]);
-                goto err;
-            }
-            /*set default value for output-size */
-            in->outputSize = in->inputSize;
-            break;
-
-        case ERR: /* command syntax error */
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            usage(argv[0]);
-            goto err;
-        }
-    }
-
-    if (FALSE == outfile_named) {
-        (void) HDfprintf(stderr, "%s", err3);
-        usage(argv[0]);
-        goto err;
-    }
-
-    if (process(&opt) == -1)
-        goto err;
-    
-    for (i = 0; i < opt.fcount; i++) {
-        in = &(opt.infiles[i].in);
-        if (in->sizeOfDimension)
-            HDfree(in->sizeOfDimension);
-        if (in->sizeOfChunk)
-            HDfree(in->sizeOfChunk);
-        if (in->maxsizeOfDimension)
-            HDfree(in->maxsizeOfDimension);
-        if (in->externFilename)
-            HDfree(in->externFilename);
-        if (in->data)
-            HDfree(in->data);
-    }
-
-    return (EXIT_SUCCESS);
-err: 
-    (void) HDfprintf(stderr, "%s", err4);
-    for (i = 0; i < opt.fcount; i++) {
-        in = &(opt.infiles[i].in);
-        if (in->sizeOfDimension)
-            HDfree(in->sizeOfDimension);
-        if (in->sizeOfChunk)
-            HDfree(in->sizeOfChunk);
-        if (in->maxsizeOfDimension)
-            HDfree(in->maxsizeOfDimension);
-        if (in->externFilename)
-            HDfree(in->externFilename);
-        if (in->data)
-            HDfree(in->data);
-    }
-    return (EXIT_FAILURE);
-}
-
-static int gtoken(char *s)
-{
-    size_t      len;
-    int         token = ERR;
-
-    const char *err1 = "Illegal argument: %s.\n";
-
-    /*
-     * identify the token type
-     */
-    if (s[0] == '-') { /* option name (or negative number) */
-        len = HDstrlen(&s[1]);
-        switch (s[1]) {
-        case 'o':
-            if (!HDstrncmp("outfile", &s[1], len))
-                token = OPT_o;
-            break;
-
-        case 'c':
-            if (!HDstrncmp("config", &s[1], len))
-                token = OPT_c;
-            break;
-
-        case 'h':
-            if (!HDstrncmp("help", &s[1], len))
-                token = OPT_h;
-            break;
-
-        case 'd':
-            if (!HDstrncmp("dims", &s[1], len))
-                token = OPT_d;
-            break;
-
-        case 'p':
-            if (!HDstrncmp("path", &s[1], len))
-                token = OPT_p;
-            break;
-
-        case 't':
-            if (!HDstrncmp("type", &s[1], len))
-                token = OPT_t;
-            break;
-
-        case 's':
-            if (!HDstrncmp("size", &s[1], len))
-                token = OPT_s;
-            break;
-        default:
-            token = ERR; /* not a supported option tag */
-            break;
-        }
-
-        if (token == ERR)
-            (void) HDfprintf(stderr, err1, s);
-    }
-    else { /* filename */
-        token = FILNAME;
-    }
-    return (token);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    processDataFile
- *
- * Purpose:     allocate memory and read data file
- *
- * Return:      0, success, -1, error
- *
- * Programmer:  pkmat
- *
- * Modifications: pvn
- *  7/23/2007. Added support for STR type, extra parameter FILE_ID
- *
- *-------------------------------------------------------------------------
- */
-
-static int processDataFile(char *infile, struct Input *in, hid_t file_id)
-{
-    FILE       *strm = NULL;
-    const char *err1 = "Unable to open the input file  %s for reading.\n";
-    const char *err2 = "Error in allocating integer data storage.\n";
-    const char *err3 = "Error in allocating floating-point data storage.\n";
-    const char *err4 = "Error in reading integer data.\n";
-    const char *err5 = "Error in reading floating-point data.\n";
-    const char *err6 = "Error in allocating unsigned integer data storage.\n";
-    const char *err7 = "Error in reading unsigned integer data.\n";
-    const char *err10 = "Unrecognized input class type.\n";
-    const char *err11 = "Error in reading string data.\n";
-    int retval = -1;
-
-    /*-------------------------------------------------------------------------
-     * special case for opening binary classes in H5_HAVE_WIN32_API
-     * "FP" denotes a floating point binary file,
-     * "IN" denotes a signed integer binary file,
-     * "UIN" denotes an unsigned integer binary file,
-     *-------------------------------------------------------------------------
-     */
-    if (in->inputClass == 4 /* "IN" */|| in->inputClass == 3 /* "FP" */|| in->inputClass == 7 /* "UIN" */) {
-
-        if ((strm = HDfopen(infile, READ_OPEN_FLAGS)) == NULL) {
-            (void) HDfprintf(stderr, err1, infile);
-            goto error;
-        }
-    }
-    /*-------------------------------------------------------------------------
-     * if the input class is not binary, just use "r"
-     *-------------------------------------------------------------------------
-     */
-    else {
-        if ((strm = HDfopen(infile, "r")) == NULL) {
-            (void) HDfprintf(stderr, err1, infile);
-            goto error;
-        }
-    }
-
-    switch (in->inputClass) {
-    case 0: /*  TEXTIN */
-    case 4: /*  IN  */
-        if (allocateIntegerStorage(in) == -1) {
-            (void) HDfprintf(stderr, err2, infile);
-            goto error;
-        }
-
-        if (readIntegerData(strm, in) == -1) {
-            (void) HDfprintf(stderr, err4, infile);
-            goto error;
-        }
-        break;
-
-    case 1: /*  TEXTFP */
-    case 2: /*  TEXTFPE  */
-    case 3: /*  FP  */
-        if (allocateFloatStorage(in) == -1) {
-            (void) HDfprintf(stderr, err3, infile);
-            goto error;
-
-        }
-
-        if (readFloatData(strm, in) == -1) {
-            (void) HDfprintf(stderr, err5, infile);
-            goto error;
-        }
-        break;
-
-    case 5: /*  STR  */
-        if (in->h5dumpInput) {
-            if (processStrHDFData(strm, in, file_id) == -1) {
-                (void) HDfprintf(stderr, err11, infile);
-                goto error;
-            }
-        }
-        else {
-            if (processStrData(strm, in, file_id) == -1) {
-                (void) HDfprintf(stderr, err11, infile);
-                goto error;
-            }
-        }
-
-        break;
-
-    case 6: /* TEXTUIN */
-    case 7: /* UIN */
-        if (allocateUIntegerStorage(in) == -1) {
-            (void) HDfprintf(stderr, err6, infile);
-            goto error;
-        }
-        if (readUIntegerData(strm, in) == -1) {
-            (void) HDfprintf(stderr, err7, infile);
-            goto error;
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err10);
-        goto error;
-    }
-
-    /* Set success return value */
-    retval = 0;
-
-error:
-    if(strm)
-        HDfclose(strm);
-    return(retval);
-}
-
-static int readIntegerData(FILE *strm, struct Input *in)
-{
-    H5DT_INT8  *in08;
-    H5DT_INT16 *in16;
-    H5DT_INT16  temp;
-    H5DT_INT32 *in32;
-#ifdef H5_SIZEOF_LONG_LONG
-    H5DT_INT64 *in64;
-    char        buffer[256];
-#endif
-    hsize_t     len = 1;
-    hsize_t     i;
-    int         j;
-
-    const char *err1 = "Unable to get integer value from file.\n";
-    const char *err2 = "Unrecognized input class type.\n";
-    const char *err3 = "Invalid input size.\n";
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 8:
-        switch (in->inputClass) {
-        case 0: /* TEXTIN */
-            in08 = (H5DT_INT8 *) in->data;
-            for (i = 0; i < len; i++, in08++) {
-                if (fscanf(strm, "%hd", &temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-                (*in08) = (H5DT_INT8) temp;
-            }
-            break;
-
-        case 4: /* IN */
-            in08 = (H5DT_INT8 *) in->data;
-            for (i = 0; i < len; i++, in08++) {
-                if (HDfread((char *) in08, sizeof(H5DT_INT8), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 16:
-        in16 = (H5DT_INT16 *) in->data;
-        switch (in->inputClass) {
-        case 0: /* TEXTIN */
-            for (i = 0; i < len; i++, in16++) {
-                if (fscanf(strm, "%hd", in16) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            in16 = (H5DT_INT16 *) in->data;
-            break;
-
-        case 4: /* IN */
-            for (i = 0; i < len; i++, in16++) {
-                if (HDfread((char *) in16, sizeof(H5DT_INT16), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 32:
-        in32 = (H5DT_INT32 *) in->data;
-        switch (in->inputClass) {
-        case 0: /* TEXTIN */
-            for (i = 0; i < len; i++, in32++) {
-                if (fscanf(strm, "%d", in32) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        case 4: /* IN */
-            for (i = 0; i < len; i++, in32++) {
-                if (HDfread((char *) in32, sizeof(H5DT_INT32), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-#ifdef H5_SIZEOF_LONG_LONG
-    case 64:
-        in64 = (H5DT_INT64 *) in->data;
-        switch (in->inputClass) {
-        case 0: /* TEXTIN */
-            for (i = 0; i < len; i++, in64++) {
-                if (fscanf(strm, "%s", buffer) < 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-                *in64 = (H5DT_INT64) HDstrtoll(buffer, NULL, 10);
-            }
-            break;
-
-        case 4: /* IN */
-            for (i = 0; i < len; i++, in64++) {
-                if (HDfread((char *) in64, sizeof(H5DT_INT64), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-#endif /* ifdef H5_SIZEOF_LONG_LONG */
-
-    default:
-        (void) HDfprintf(stderr, "%s", err3);
-        break;
-    }
-    return (0);
-}
-
-static int readUIntegerData(FILE *strm, struct Input *in)
-{
-    H5DT_UINT8  *in08;
-    H5DT_UINT16 *in16;
-    H5DT_UINT16  temp;
-    H5DT_UINT32 *in32;
-#ifdef H5_SIZEOF_LONG_LONG
-    H5DT_UINT64 *in64;
-    char        buffer[256];
-#endif
-    hsize_t     len = 1;
-    hsize_t     i;
-    int         j;
-    const char *err1 = "Unable to get unsigned integer value from file.\n";
-    const char *err2 = "Unrecognized input class type.\n";
-    const char *err3 = "Invalid input size.\n";
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 8:
-        switch (in->inputClass) {
-        case 6: /* TEXTUIN */
-            in08 = (H5DT_UINT8 *) in->data;
-            for (i = 0; i < len; i++, in08++) {
-                if (fscanf(strm, "%hu", &temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-                (*in08) = (H5DT_UINT8) temp;
-            }
-            break;
-
-        case 7: /* UIN */
-            in08 = (H5DT_UINT8 *) in->data;
-            for (i = 0; i < len; i++, in08++) {
-                if (HDfread((char *) in08, sizeof(H5DT_UINT8), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 16:
-        in16 = (H5DT_UINT16 *) in->data;
-        switch (in->inputClass) {
-        case 6: /* TEXTUIN */
-            for (i = 0; i < len; i++, in16++) {
-                if (fscanf(strm, "%hu", in16) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        case 7: /* UIN */
-            for (i = 0; i < len; i++, in16++) {
-                if (HDfread((char *) in16, sizeof(H5DT_UINT16), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 32:
-        in32 = (H5DT_UINT32 *) in->data;
-        switch (in->inputClass) {
-        case 6: /* TEXTUIN */
-            for (i = 0; i < len; i++, in32++) {
-                if (fscanf(strm, "%u", in32) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        case 7: /* UIN */
-            for (i = 0; i < len; i++, in32++) {
-                if (HDfread((char *) in32, sizeof(H5DT_UINT32), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-#ifdef H5_SIZEOF_LONG_LONG
-    case 64:
-        in64 = (H5DT_UINT64 *) in->data;
-        switch (in->inputClass) {
-        case 6: /* TEXTUIN */
-            for (i = 0; i < len; i++, in64++) {
-                if (fscanf(strm, "%s", buffer) < 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-                *in64 = (H5DT_UINT64) HDstrtoll(buffer, NULL, 10);
-            }
-            break;
-
-        case 7: /* UIN */
-            for (i = 0; i < len; i++, in64++) {
-                if (HDfread((char *) in64, sizeof(H5DT_UINT64), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-#endif /* ifdef H5_SIZEOF_LONG_LONG */
-
-    default:
-        (void) HDfprintf(stderr, "%s", err3);
-        break;
-    }
-    return (0);
-}
-
-static int readFloatData(FILE *strm, struct Input *in)
-{
-    H5DT_FLOAT32 *fp32;
-    H5DT_FLOAT64 *fp64;
-
-    hsize_t     len = 1;
-    hsize_t     i;
-    int         j;
-    const char *err1 = "Unable to get integer value from file.\n";
-    const char *err2 = "Unrecognized input class type.\n";
-    const char *err3 = "Invalid input size type.\n";
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 32:
-        fp32 = (H5DT_FLOAT32 *) in->data;
-        switch (in->inputClass) {
-        case 1: /* TEXTFP */
-            for (i = 0; i < len; i++, fp32++) {
-                if (fscanf(strm, "%f", fp32) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-
-            fp32 = (H5DT_FLOAT32 *) in->data;
-            break;
-
-            /* same as TEXTFP */
-        case 2: /*TEXTFPE */
-
-            for (i = 0; i < len; i++, fp32++) {
-                if (fscanf(strm, "%f", fp32) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-
-            fp32 = (H5DT_FLOAT32 *) in->data;
-            break;
-
-        case 3: /* FP */
-            for (i = 0; i < len; i++, fp32++) {
-                if (HDfread((char *) fp32, sizeof(H5DT_FLOAT32), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 64:
-        fp64 = (H5DT_FLOAT64 *) in->data;
-        switch (in->inputClass) {
-        case 1: /* TEXTFP */
-            for (i = 0; i < len; i++, fp64++) {
-                if (fscanf(strm, "%lf", fp64) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-
-            fp64 = (H5DT_FLOAT64 *) in->data;
-            break;
-
-            /* same as TEXTFP */
-        case 2: /*TEXTFPE */
-
-            for (i = 0; i < len; i++, fp64++) {
-                if (fscanf(strm, "%lf", fp64) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-
-            fp64 = (H5DT_FLOAT64 *) in->data;
-            break;
-
-        case 3: /* FP */
-            for (i = 0; i < len; i++, fp64++) {
-                if (HDfread((char *) fp64, sizeof(H5DT_FLOAT64), 1, strm) != 1) {
-                    (void) HDfprintf(stderr, "%s", err1);
-                    return (-1);
-                }
-            }
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err3);
-        break;
-    }
-    return (0);
-}
-
-/*-------------------------------------------------------------------------
- * Function: processStrData
- *
- * Purpose: read an ASCII file with string data and generate an HDF5 dataset
- *  with a variable length type
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at hdfgroup.org
- *
- * Date: July, 26, 2007
- *
- *-------------------------------------------------------------------------
- */
-static int processStrData(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;
-    hsize_t dims[1];
-    char    str[1024];
-    int     c;
-    int     i = 0;
-    int     j;
-    hsize_t nlines = 0;
-    hsize_t line;
-
-    /*-------------------------------------------------------------------------
-     * get number of lines in the input file
-     *-------------------------------------------------------------------------
-     */
-
-    while(EOF != (c = HDfgetc(strm)))
-        if (c == 10)    /* eol */
-            nlines++;
-
-    if (!nlines)
-        return 0;
-
-    /* number of records */
-    dims[0] = nlines;
-
-    /* rewind */
-    HDfseek(strm, 0L, 0);
-
-    /*-------------------------------------------------------------------------
-     * read file again and generate an HDF5 dataset
-     *-------------------------------------------------------------------------
-     */
-
-    if ((type_id = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-
-    if (H5Tset_size(type_id, H5T_VARIABLE) < 0)
-        goto out;
-
-    /* disable error reporting */
-    H5E_BEGIN_TRY 
-    {
-        /* create parent groups */
-        if (in->path.count > 1) {
-            j = 0;
-            handle = file_id;
-            while (j < in->path.count - 1) {
-                if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
-                    group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                    for (; j < in->path.count - 1; j++)
-                        group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                    handle = group_id;
-                    break;
-                }
-                handle = group_id;
-                j++;
-            }
-        }
-        else {
-            handle = file_id;
-            j = 0;
-        }
-
-        /*enable error reporting */
-    }
-    H5E_END_TRY;
-
-    if ((space_id = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-
-    if ((mspace_id = H5Screate(H5S_SCALAR)) < 0)
-        goto out;
-
-    if ((dset_id = H5Dcreate2(handle, in->path.group[j], type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    line = 0;
-
-    while(EOF != (c = HDfgetc(strm))) {
-        str[i] = (char)c;
-
-        i++;
-
-        if (c == 10) { /* eol */
-            char *str2 = str;
-            hid_t fspace_id;
-            hsize_t start[1];
-            hsize_t count[1] = { 1 };
-
-            str[i - 1] = '\0'; /* terminate string */
-
-            if ((fspace_id = H5Dget_space(dset_id)) < 0)
-                goto out;
-
-            start[0] = line++;
-
-            if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
-                goto out;
-
-            if (H5Dwrite(dset_id, type_id, mspace_id, fspace_id, H5P_DEFAULT, &str2) < 0)
-                goto out;
-
-            if (H5Sclose(fspace_id) < 0)
-                goto out;
-
-            i = 0;
-            str[0] = '\0';
-
-        }
-    }
-
-    /* close */
-    H5Dclose(dset_id);
-    H5Sclose(space_id);
-    H5Sclose(mspace_id);
-    H5Tclose(type_id);
-
-    return (0);
-
-out:
-
-    return (-1);
-}
-
-/*-------------------------------------------------------------------------
- * Function: processStrData
- *
- * Purpose: read an ASCII file with string data and generate an HDF5 dataset
- *  with a variable length type
- *
- * Return: 0, ok, -1 no
- *
- *-------------------------------------------------------------------------
- */
-static int processStrHDFData(FILE *strm, struct Input *in, hid_t file_id)
-{
-    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;
-
-    /*-------------------------------------------------------------------------
-     * read file and generate an HDF5 dataset
-     *-------------------------------------------------------------------------
-     */
-#ifdef H5DEBUGIMPORT
-    printf("processStrHDFData DATATYPE STRING\n");
-#endif
-
-    if ((type_id = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-
-    if (H5Tset_size(type_id, H5T_VARIABLE) < 0)
-        goto out;
-
-    /* disable error reporting */
-    H5E_BEGIN_TRY
-    {
-        /* create parent groups */
-        if (in->path.count > 1) {
-            j = 0;
-            handle = file_id;
-            while (j < in->path.count - 1) {
-                if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
-                    group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                    for (; j < in->path.count - 1; j++)
-                        group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                    handle = group_id;
-                    break;
-                }
-                handle = group_id;
-                j++;
-            }
-        }
-        else {
-            handle = file_id;
-            j = 0;
-        }
-
-        /*enable error reporting */
-    }
-    H5E_END_TRY;
-#ifdef H5DEBUGIMPORT
-    printf("processStrHDFData DATATYPE STRING groups created\n");
-#endif
-
-    if ((space_id = H5Screate_simple(in->rank, in->sizeOfDimension, NULL)) < 0)
-        goto out;
-
-    if ((mspace_id = H5Screate(H5S_SCALAR)) < 0)
-        goto out;
-
-    if ((dset_id = H5Dcreate2(handle, in->path.group[j], type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-#ifdef H5DEBUGIMPORT
-    printf("processStrHDFData DATATYPE STRING ready to process strings\n");
-#endif
-    line = 0;
-    j = 0;
-
-    while (HDfgets(str,sizeof(str),strm)) {
-        str1 = str;
-        str2 = NULL;
-        str3 = NULL;
-#ifdef H5DEBUGIMPORT
-            printf("processStrHDFData DATATYPE STRING[%llu]={%s}\n", (unsigned long long)line, str1);
-#endif
-            /* process string to remove the first and last quote char */
-            str2 = strchr(str1, '"');
-            if (str2 != NULL) {
-#ifdef H5DEBUGIMPORT
-                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
-#endif
-                str2++;
-#ifdef H5DEBUGIMPORT
-                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
-#endif
-                str3 = strrchr(str2, '"');
-                if (str3 != NULL) {
-#ifdef H5DEBUGIMPORT
-                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str3), str3);
-#endif
-                    *str3 = '\0';
-
-#ifdef H5DEBUGIMPORT
-                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
-#endif
-
-                    if(strlen(str2) > 0) {
-                        hid_t fspace_id;
-                        hsize_t start[1];
-                        hsize_t count[1] = { 1 };
-
-#ifdef H5DEBUGIMPORT
-                        printf("processStrHDFData DATATYPE STRING[%llu] store %s\n", (unsigned long long)line, str2);
-#endif
-                        if ((fspace_id = H5Dget_space(dset_id)) < 0)
-                            goto out;
-
-                        start[0] = line++;
-
-                        if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
-                            goto out;
-
-                        if (H5Dwrite(dset_id, type_id, mspace_id, fspace_id, H5P_DEFAULT, &str2) < 0)
-                            goto out;
-
-                        if (H5Sclose(fspace_id) < 0)
-                            goto out;
-                    }
-                }
-            }
-        str[0] = '\0';
-        j++;
-    }
-#ifdef H5DEBUGIMPORT
-    printf("processStrHDFData DATATYPE STRING eof reached\n");
-#endif
-
-    /* close */
-    H5Dclose(dset_id);
-    H5Sclose(space_id);
-    H5Sclose(mspace_id);
-    H5Tclose(type_id);
-
-    return (0);
-
-out:
-#ifdef H5DEBUGIMPORT
-    printf("processStrHDFData DATATYPE STRING error exit\n");
-#endif
-/* disable error reporting */
-H5E_BEGIN_TRY
-{
-    /* close */
-    H5Dclose(dset_id);
-    H5Sclose(space_id);
-    H5Sclose(mspace_id);
-    H5Tclose(type_id);
-}
-H5E_END_TRY;
-
-    return (-1);
-}
-
-static int allocateIntegerStorage(struct Input *in)
-{
-    hsize_t     len = 1;
-    int         j;
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "Invalid storage size for integer input data.\n";
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 8:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT8))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 16:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT16))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 32:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT32))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 64:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT64))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err2);
-        break;
-    }
-    return (0);
-}
-
-static int allocateUIntegerStorage(struct Input *in)
-{
-    hsize_t     len = 1;
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "Invalid storage size for unsigned integer input data.\n";
-    int         j;
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 8:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT8))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 16:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT16))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 32:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT32))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 64:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT64))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err2);
-        break;
-    }
-    return (0);
-}
-
-static int allocateFloatStorage(struct Input *in)
-{
-    hsize_t     len = 1;
-    int         j;
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "Invalid storage size for float input data.\n";
-
-    for (j = 0; j < in->rank; j++)
-        len *= in->sizeOfDimension[j];
-
-    switch (in->inputSize) {
-    case 32:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_FLOAT32))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    case 64:
-        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_FLOAT64))) == NULL) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err2);
-        break;
-    }
-    return (0);
-}
-
-static int processConfigurationFile(char *infile, struct Input *in)
-{
-    FILE       *strm = NULL;
-    char        key[255];
-    int         kindex;
-    char        temp[255];
-    int         ival;
-    int         scanret;
-    int         retval = -1;
-
-    const char *err1 = "Unable to open the configuration file:  %s for reading.\n";
-    const char *err2 = "Unknown keyword in configuration file: %s\n";
-    const char *err3a = "PATH keyword appears twice in %s.\n";
-    const char *err3b = "Error in parsing the path information from %s.\n";
-    const char *err4a = "INPUT-CLASS keyword appears twice in %s.\n";
-    const char *err4b = "Error in retrieving the input class from %s.\n";
-    const char *err5a = "INPUT-SIZE keyword appears twice in %s.\n";
-    const char *err5b = "Error in retrieving the input size from %s.\n";
-    const char *err6a = "RANK keyword appears twice in %s.\n";
-    const char *err6b = "Error in retrieving the rank from %s.\n";
-    const char *err7a = "DIMENSION-SIZES keyword appears twice in %s.\n";
-    const char *err7b = "DIMENSION-SIZES cannot appear before RANK is provided.\n";
-    const char *err7c = "Error in retrieving the dimension sizes from %s.\n";
-    const char *err8a = "OUTPUT-CLASS keyword appears twice in %s.\n";
-    const char *err8b = "Error in retrieving the output class from %s.\n";
-    const char *err9a = "OUTPUT-SIZE keyword appears twice in %s.\n";
-    const char *err9b = "Error in retrieving the output size from %s.\n";
-    const char *err10a = "OUTPUT-ARCHITECTURE keyword appears twice in %s.\n";
-    const char *err10b = "Error in retrieving the output architecture from %s.\n";
-    const char *err11a = "OUTPUT-BYTE-ORDER keyword appears twice in %s.\n";
-    const char *err11b = "Error in retrieving the output byte order from %s.\n";
-    const char *err12a = "CHUNKED-DIMENSION-SIZES keyword appears twice in %s.\n";
-    const char *err12b = "CHUNKED-DIMENSION-SIZES cannot appear before DIMENSION-SIZES are provided.\n";
-    const char *err12c = "Error in retrieving the chunked dimension sizes from %s.\n";
-    const char *err13a = "COMPRESSION-TYPE keyword appears twice in %s.\n";
-    const char *err13b = "Error in retrieving the compression type from %s.\n";
-    const char *err14a = "COMPRESSION-PARAM keyword appears twice in %s.\n";
-    const char *err14b = "Error in retrieving the compression parameter from %s.\n";
-    const char *err15a = "EXTERNAL-STORAGE keyword appears twice in %s.\n";
-    const char *err15b = "Error in retrieving the external storage paramters from %s.\n";
-    const char *err16a = "MAXIMUM-DIMENSIONS keyword appears twice in %s.\n";
-    const char *err16b = "MAXIMUM-DIMENSIONS cannot appear before DIMENSION-SIZES are provided.\n";
-    const char *err16c = "Error in retrieving the maximum dimension sizes from %s.\n";
-    const char *err17 = "Configuration parameters are invalid in %s.\n";
-    const char *err18 = "Unable to get string value.\n";
-    const char *err19 = "Unable to get integer value.\n";
-
-    /* create vector to map which keywords have been found
-     check vector after each keyword to check for violation
-     at the end check vector to see if required fields have been provided
-     process the output file according to the options
-     */
-
-    if ((strm = HDfopen(infile, "r")) == NULL) {
-        (void) HDfprintf(stderr, err1, infile);
-        goto error;
-    }
-
-    scanret = fscanf(strm, "%s", key);
-    if((scanret == 1) && !HDstrcmp("HDF5", key)) {
-#ifdef H5DEBUGIMPORT
-        int pndx;
-        printf("\nh5dump file\n");
-#endif
-        in->h5dumpInput = 1;
-        scanret = fscanf(strm, "%s", temp); /* filename */
-        scanret = fscanf(strm, "%s", temp); /* start bracket */
-        scanret = fscanf(strm, "%s", key); /* DATASET */
-        while (scanret == 1) {
-            if(!HDstrcmp("DATASET", key)) { /* PATH */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATASET key\n");
-#endif
-                if (in->configOptionVector[PATH] == 1) {
-                    (void) HDfprintf(stderr, err3a, infile);
-                    goto error;
-                }
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATASET %s found\n", temp);
-#endif
-                if (parsePathInfo(&in->path, temp) == -1) {
-                    (void) HDfprintf(stderr, err3b, infile);
-                    goto error;
-                }
-                in->configOptionVector[PATH] = 1;
-                scanret = fscanf(strm, "%s", temp); /* start bracket */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATASET %s found\n", temp);
-#endif
-            } /* if(!HDstrcmp("DATASET", key))  PATH */
-            else if(!HDstrcmp("DATATYPE", key)) { /* INPUT-CLASS */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATATYPE key\n");
-#endif
-                if (in->configOptionVector[INPUT_CLASS] == 1) {
-                    (void) HDfprintf(stderr, err4a, infile);
-                    goto error;
-                }
-
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATATYPE %s found\n", temp);
-#endif
-                if ((kindex = getInputClassType(in, temp)) == -1) {
-                    (void) HDfprintf(stderr, err4b, infile);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATATYPE type %d inputClass\n", in->inputClass);
-#endif
-
-                in->configOptionVector[INPUT_CLASS] = 1;
-
-                /*set default value for output-class */
-                if (in->configOptionVector[OUTPUT_CLASS] == 0) {
-                    if (in->inputClass == 0 || in->inputClass == 4)
-                        in->outputClass = 0;
-                    if (in->inputClass == 1 || in->inputClass == 2
-                            || in->inputClass == 3)
-                        in->outputClass = 1;
-                    if (in->inputClass == 6 || in->inputClass == 7)
-                        in->outputClass = 2;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATATYPE type %d outputClass\n", in->outputClass);
-#endif
-
-                if(in->inputClass == 5) { /* STRING */
-                    int get_next_prop = 1;
-                    in->outputClass = -1;
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATATYPE STRING found\n");
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATATYPE STRING %s found\n", temp);
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* string properties */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-                    while (get_next_prop) {
-                        if(!HDstrcmp("STRSIZE", temp)) { /* STRSIZE */
-                            if (fscanf(strm, "%s", temp) != 1) {
-                                (void) HDfprintf(stderr, "%s", err19);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATATYPE STRING STRSIZE %s found\n", temp);
-#endif
-                            if (HDstrcmp("H5T_VARIABLE;", temp)) {
-                                char *more = temp;
-                                ival = HDstrtol(more, &more, 10);
-                                if (getInputSize(in, ival) == -1) {
-                                    (void) HDfprintf(stderr, err5b, infile);
-                                    goto error;
-                                }
-#ifdef H5DEBUGIMPORT
-                                printf("h5dump DATATYPE STRING %d InputSize\n", in->inputSize);
-#endif
-                            }
-                        }
-                        else if(!HDstrcmp("STRPAD", temp)) { /* STRPAD */
-                            if (fscanf(strm, "%s", temp) != 1) { /* STRPAD type */
-                                (void) HDfprintf(stderr, "%s", err18);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATATYPE STRING STRPAD %s found\n", temp);
-#endif
-                        }
-                        else if(!HDstrcmp("CSET", key)) { /* CSET */
-                            if (fscanf(strm, "%s", temp) != 1) { /* CSET type */
-                                (void) HDfprintf(stderr, "%s", err18);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATATYPE STRING CSET %s found\n", temp);
-#endif
-
-                        }
-                        else if(!HDstrcmp("CTYPE", temp)) { /* CTYPE */
-                            if (fscanf(strm, "%s", temp) != 1) { /* CTYPE type */
-                                (void) HDfprintf(stderr, "%s", err18);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATATYPE STRING  CTYPE %s found\n", temp);
-#endif
-                        } /* if(!HDstrcmp("CSET", key)) */
-                        if (fscanf(strm, "%s", temp) != 1) {
-                            (void) HDfprintf(stderr, "%s", err18);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATATYPE STRING %s found\n", temp);
-#endif
-                        if(!HDstrcmp("}", temp)) { /* end bracket */
-                            get_next_prop = 0;
-                        }
-                    } /* while (get_next_prop) */
-                } /* if(kindex == 5)  STRING */
-             } /* else if(!HDstrcmp("DATATYPE", key))  INPUT-CLASS */
-            else if(!HDstrcmp("DATASPACE", key)) { /* RANK and DIMENSIONS */
-                hsize_t     temp_dims[MAX_NUM_DIMENSION];
-
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATASPACE key\n");
-#endif
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-                if(!HDstrcmp("SCALAR", temp)) { /* SCALAR */
-                    in->rank = 0;
-                } /* if(!HDstrcmp("SCALAR", key)) */
-                else if(!HDstrcmp("NULL", temp)) { /* NULL */
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                } /* else if(!HDstrcmp("NULL", key)) */
-                else if(!HDstrcmp("SIMPLE", temp)) { /* SIMPLE */
-                    int icount = 0;
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATASPACE SIMPLE found\n");
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
-                        (void) HDfprintf(stderr, err6b, infile);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* start paren */
-                        (void) HDfprintf(stderr, err6b, infile);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                    if(!HDstrcmp("(", temp)) { /* start paren */
-                        int get_next_dim = 1;
-                        int i = 0;
-
-                        if (fscanf(strm, "%s", temp) != 1) { /* Dimension with optional comma */
-                            (void) HDfprintf(stderr, err16c, infile);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                        while (get_next_dim) {
-                            char *more = temp;
-                            temp_dims[icount] = HDstrtoull(more, &more, 10);
-                            if (fscanf(strm, "%s", temp) != 1) { /* Dimension or end paren */
-                                (void) HDfprintf(stderr, err6b, infile);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                            if(!HDstrcmp(")", temp)) { /* end paren */
-                                in->rank = ++icount;
-                                in->configOptionVector[RANK] = 1;
-                                get_next_dim = 0;
-                            }
-                            else { /* Dimension */
-                                icount++;
-                                if (icount > MAX_NUM_DIMENSION) {
-                                    (void) HDfprintf(stderr, "Invalid value for rank.\n");
-                                    goto error;
-                                }
-                            }
-                        } /* while (get_next_dim) */
-
-                        if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATASPACE SIMPLE %d rank\n", in->rank);
-#endif
-                        for (i = 0; i < in->rank; i++) {
-                            in->sizeOfDimension[i] = temp_dims[i];
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATASPACE SIMPLE dims:", in->rank);
-                        for (pndx = 0; pndx < in->rank; pndx++) {
-                            printf(" %d", in->sizeOfDimension[pndx]);
-                        }
-                        printf("\n");
-#endif
-                        in->configOptionVector[DIM] = 1;
-                    } /* if(!HDstrcmp("(", key))  start paren */
-                    else {
-                        (void) HDfprintf(stderr, err5b, infile);
-                        goto error;
-                    }
-                    if (fscanf(strm, "%s", temp) != 1) {
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                    if(!HDstrcmp("/", temp)) { /* / max dims */
-                        if ((in->maxsizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-                            goto error;
-                        }
-                        if (fscanf(strm, "%s", temp) != 1) { /* start paren */
-                            (void) HDfprintf(stderr, err6b, infile);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                        if(!HDstrcmp("(", temp)) { /* start paren */
-                            int get_next_dim = 1;
-                            int i = 0;
-
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATASPACE SIMPLE process max dim values\n");
-#endif
-                            if (fscanf(strm, "%s", temp) != 1) { /* max dim with optional comma */
-                                (void) HDfprintf(stderr, err16c, infile);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                            while (get_next_dim) {
-#ifdef H5DEBUGIMPORT
-                                printf("h5dump DATASPACE SIMPLE get max dim value\n");
-#endif
-                                if(!HDstrcmp("H5S_UNLIMITED", temp) || !HDstrcmp("H5S_UNLIMITED,", temp)) { /* unlimited */
-                                    in->maxsizeOfDimension[i] = H5S_UNLIMITED;
-                                    in->configOptionVector[EXTEND] = 1;
-                                }
-                                else {
-                                    char *more = temp;
-                                    in->maxsizeOfDimension[i] = HDstrtoull(more, &more, 10);
-                                }
-                                if (fscanf(strm, "%s", temp) != 1) { /* max dim or end paren */
-                                    (void) HDfprintf(stderr, err16c, infile);
-                                    goto error;
-                                }
-#ifdef H5DEBUGIMPORT
-                                printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                                if(!HDstrcmp(")", temp)) { /* end paren */
-                                    get_next_dim = 0;
-                                }
-                                else { /* comma */
-                                    i++;
-                                    if (i > MAX_NUM_DIMENSION) {
-                                        (void) HDfprintf(stderr, "Invalid value for rank.\n");
-                                        goto error;
-                                    }
-                                }
-                            } /* while (get_next_dim) */
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump DATASPACE SIMPLE maxdims:", in->rank);
-                            for (pndx = 0; pndx < in->rank; pndx++) {
-                                printf(" %d", in->maxsizeOfDimension[pndx]);
-                            }
-                            printf("\n");
-                            printf("h5dump DATASPACE SIMPLE get max dim finished\n");
-#endif
-                        } /* if(!HDstrcmp("(", key))  start paren */
-                        else {
-                            (void) HDfprintf(stderr, err16c, infile);
-                            goto error;
-                        }
-                        scanret = fscanf(strm, "%s", temp); /* end bracket */
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
-#endif
-                    } /* if(!HDstrcmp("/", key)) max dims separator */
-                } /* else if(!HDstrcmp("SIMPLE", key)) */
-                else {
-                    (void) HDfprintf(stderr, err5b, infile);
-                    goto error;
-                }
-            } /* else if(!HDstrcmp("DATASPACE", key))  RANK and DIMENSIONS */
-            else if(!HDstrcmp("STORAGE_LAYOUT", key)) { /* CHUNKED-DIMENSION-SIZES */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump STORAGE_LAYOUT key\n");
-#endif
-                if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump STORAGE_LAYOUT %s found\n", temp);
-#endif
-                if (fscanf(strm, "%s", temp) != 1) { /* CHUNKED */
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump STORAGE_LAYOUT %s found\n", temp);
-#endif
-                if(!HDstrcmp("CHUNKED", temp)) { /* CHUNKED */
-                    if ((in->sizeOfChunk = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-                        (void) HDfprintf(stderr, "Unable to allocate dynamic memory.\n");
-                        goto error;
-                    }
-                    if (fscanf(strm, "%s", temp) != 1) { /* start paren */
-                        (void) HDfprintf(stderr, err6b, infile);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
-#endif
-                    if(!HDstrcmp("(", temp)) { /* start paren */
-                        int get_next_dim = 1;
-                        int icount = 0;
-
-                        if (fscanf(strm, "%s", temp) != 1) { /* Dimension with optional comma */
-                            (void) HDfprintf(stderr, err16c, infile);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
-#endif
-                        while (get_next_dim) {
-                            char *more = temp;
-                            in->sizeOfChunk[icount] = HDstrtoull(more, &more, 10);
-                            if (fscanf(strm, "%s", temp) != 1) { /* Dimension or end paren */
-                                (void) HDfprintf(stderr, err6b, infile);
-                                goto error;
-                            }
-#ifdef H5DEBUGIMPORT
-                            printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
-#endif
-                            if(!HDstrcmp(")", temp)) { /* end paren */
-                                in->configOptionVector[RANK] = 1;
-                                get_next_dim = 0;
-                            }
-                            else { /* Dimension */
-                                icount++;
-                                if (icount > MAX_NUM_DIMENSION) {
-                                    (void) HDfprintf(stderr, "Invalid value for rank.\n");
-                                    goto error;
-                                }
-                            }
-                        } /* while (get_next_dim) */
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump STORAGE_LAYOUT CHUNKED dims:", in->rank);
-                        for (pndx = 0; pndx < in->rank; pndx++) {
-                            printf(" %d", in->sizeOfChunk[pndx]);
-                        }
-                        printf("\n");
-#endif
-                        in->configOptionVector[DIM] = 1;
-                    } /* if(!HDstrcmp("(", key))  start paren */
-                    else {
-                        (void) HDfprintf(stderr, err5b, infile);
-                        goto error;
-                    }
-                    if (fscanf(strm, "%s", temp) != 1) { /* SIZE */
-                        (void) HDfprintf(stderr, err6b, infile);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
-#endif
-                    if(!HDstrcmp("SIZE", temp)) { /* SIZE */
-                        if (fscanf(strm, "%d", (&ival)) != 1) {
-                            (void) HDfprintf(stderr, "%s", err19);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump STORAGE_LAYOUT CHUNKED SIZE %d found\n", ival);
-#endif
-                    }
-                    while (HDstrcmp("}", temp)) {
-                        if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
-                            (void) HDfprintf(stderr, "%s", err18);
-                            goto error;
-                        }
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
-#endif
-                    }
-                    in->configOptionVector[CHUNK] = 1;
-                } /* if(!HDstrcmp("CHUNKED", key))  CHUNKED */
-            } /* else if(!HDstrcmp("STORAGE_LAYOUT", key))  CHUNKED-DIMENSION-SIZES */
-            else if(!HDstrcmp("FILTERS", key)) { /* FILTERS */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump FILTERS key\n");
-#endif
-                if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump FILTERS %s found\n", temp);
-#endif
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump FILTERS %s found\n", temp);
-#endif
-                if(!HDstrcmp("COMPRESSION", temp)) { /* COMPRESSION */
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION found\n");
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* DEFLATE */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* bgin bracket */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
-#endif
-                    if (fscanf(strm, "%s", temp) != 1) { /* LEVEL */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
-#endif
-                    if (fscanf(strm, "%d", (&ival)) != 1) {
-                        (void) HDfprintf(stderr, "%s", err19);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION LEVEL %d found\n", ival);
-#endif
-                    in->compressionParam = ival;
-                    if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
-                        (void) HDfprintf(stderr, "%s", err18);
-                        goto error;
-                    }
-#ifdef H5DEBUGIMPORT
-                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
-#endif
-                    in->compressionType = 0; /* ONLY GZIP supported */
-                    in->configOptionVector[COMPRESS] = 1;
-                }
-                else if(!HDstrcmp("CONTIGUOUS", temp)) { /* CONTIGUOUS */
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump FILTERS CONTIGUOUS found\n");
-#endif
-                    in->configOptionVector[COMPRESS] = 0;
-                }
-                else if(!HDstrcmp("NONE", temp)) { /* NONE */
-#ifdef H5DEBUGIMPORT
-                        printf("h5dump FILTERS NONE found\n");
-#endif
-                    in->configOptionVector[COMPRESS] = 0;
-                }
-                if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-#ifdef H5DEBUGIMPORT
-                printf("h5dump FILTERS %s found\n", temp);
-#endif
-            }
-            else if(!HDstrcmp("DATA", key)) { /* FINSHED */
-#ifdef H5DEBUGIMPORT
-                printf("h5dump DATA key\n");
-#endif
-                scanret = 0;
-                break;
-            }
-            scanret = fscanf(strm, "%s", key);
-        }
-#ifdef H5DEBUGIMPORT
-        printf("h5dump path");
-        for (pndx = 0; pndx < in->path.count; pndx++) {
-            printf(" : %s", in->path.group[pndx]);
-        }
-        printf("\n");
-        printf("h5dump inputClass=%d\n", in->inputClass);
-        printf("h5dump inputSize=%d\n", in->inputSize);
-        printf("h5dump rank=%d\n", in->rank);
-        printf("h5dump outputClass=%d\n", in->outputClass);
-        printf("h5dump outputSize=%d\n", in->outputSize);
-        printf("h5dump outputArchitecture=%d\n", in->outputArchitecture);
-        printf("h5dump outputByteOrder=%d\n", in->outputByteOrder);
-        printf("h5dump compressionType=%d\n", in->compressionType);
-        printf("h5dump compressionParam=%d\n", in->compressionParam);
-        printf("h5dump externFilename=%s\n", in->externFilename);
-        printf("h5dump configOptionVector:\n");
-        for (pndx = 0; pndx < NUM_KEYS; pndx++) {
-            printf("    %s=%d\n", keytable[pndx], in->configOptionVector[pndx]);
-        }
-#endif
-    }
-    else {
-        while (scanret == 1) {
-            if ((kindex = mapKeywordToIndex(key)) == -1) {
-                (void) HDfprintf(stderr, err2, infile);
-                goto error;
-            }
-            switch (kindex) {
-            case 0: /* PATH */
-                if (in->configOptionVector[PATH] == 1) {
-                    (void) HDfprintf(stderr, err3a, infile);
-                    goto error;
-                }
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-                if (parsePathInfo(&in->path, temp) == -1) {
-                    (void) HDfprintf(stderr, err3b, infile);
-                    goto error;
-                }
-                in->configOptionVector[PATH] = 1;
-                break;
-
-            case 1: /* INPUT-CLASS */
-                if (in->configOptionVector[INPUT_CLASS] == 1) {
-                    (void) HDfprintf(stderr, err4a, infile);
-                    goto error;
-                }
-
-                if (fscanf(strm, "%s", temp) != 1) {
-                    (void) HDfprintf(stderr, "%s", err18);
-                    goto error;
-                }
-                if (getInputClass(in, temp) == -1) {
-                    (void) HDfprintf(stderr, err4b, infile);
-                    goto error;
-                }
-
-                in->configOptionVector[INPUT_CLASS] = 1;
-
-                /*set default value for output-class */
-                if (in->configOptionVector[OUTPUT_CLASS] == 0) {
-                    if (in->inputClass == 0 || in->inputClass == 4)
-                        in->outputClass = 0;
-                    if (in->inputClass == 1 || in->inputClass == 2
-                            || in->inputClass == 3)
-                        in->outputClass = 1;
-                    if (in->inputClass == 6 || in->inputClass == 7)
-                        in->outputClass = 2;
-                }
-                break;
-
-            case 2: /* INPUT-SIZE */
-                if (in->configOptionVector[INPUT_SIZE] == 1) {
-                    (void) HDfprintf(stderr, err5a, infile);
-                    goto error;
-                }
-                if (fscanf(strm, "%d", (&ival)) != 1) {
-                    (void) HDfprintf(stderr, "%s", err19);
-                    goto error;
-                }
-                if (getInputSize(in, ival) == -1) {
-                    (void) HDfprintf(stderr, err5b, infile);
-                    goto error;
-                }
-                in->configOptionVector[INPUT_SIZE] = 1;
-
-                /*set default value for output-size */
-                if (in->configOptionVector[OUTPUT_SIZE] == 0)
-                    in->outputSize = in->inputSize;
-                break;
-
-            case 3: /* RANK */
-                if (in->configOptionVector[RANK] == 1) {
-                    (void) HDfprintf(stderr, err6a, infile);
-                    goto error;
-                }
-
-                if (getRank(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err6b, infile);
-                    goto error;
-                }
-                in->configOptionVector[RANK] = 1;
-                break;
-
-            case 4: /* DIMENSION-SIZES */
-                if (in->configOptionVector[DIM] == 1) {
-                    (void) HDfprintf(stderr, err7a, infile);
-                    goto error;
-                }
-
-                if (in->configOptionVector[RANK] == 0) {
-                    (void) HDfprintf(stderr, err7b, infile);
-                    goto error;
-                }
-                if (getDimensionSizes(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err7c, infile);
-                    goto error;
-                }
-                in->configOptionVector[DIM] = 1;
-                break;
-
-            case 5: /* OUTPUT-CLASS */
-                if (in->configOptionVector[OUTPUT_CLASS] == 1) {
-                    (void) HDfprintf(stderr, err8a, infile);
-                    goto error;
-                }
-
-                if (getOutputClass(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err8b, infile);
-                    goto error;
-                }
-                in->configOptionVector[OUTPUT_CLASS] = 1;
-                break;
-
-            case 6: /* OUTPUT-SIZE */
-                if (in->configOptionVector[OUTPUT_SIZE] == 1) {
-                    (void) HDfprintf(stderr, err9a, infile);
-                    goto error;
-                }
-
-                if (getOutputSize(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err9b, infile);
-                    goto error;
-                }
-                in->configOptionVector[OUTPUT_SIZE] = 1;
-                break;
-
-            case 7: /* OUTPUT-ARCHITECTURE */
-                if (in->configOptionVector[OUTPUT_ARCH] == 1) {
-                    (void) HDfprintf(stderr, err10a, infile);
-                    goto error;
-                }
-
-                if (getOutputArchitecture(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err10b, infile);
-                    goto error;
-                }
-                in->configOptionVector[OUTPUT_ARCH] = 1;
-                break;
-
-            case 8: /* OUTPUT-BYTE-ORDER */
-                if (in->configOptionVector[OUTPUT_B_ORDER] == 1) {
-                    (void) HDfprintf(stderr, err11a, infile);
-                    goto error;
-                }
-
-                if (getOutputByteOrder(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err11b, infile);
-                    goto error;
-                }
-                in->configOptionVector[OUTPUT_B_ORDER] = 1;
-                break;
-
-            case 9: /* CHUNKED-DIMENSION-SIZES */
-                if (in->configOptionVector[CHUNK] == 1) {
-                    (void) HDfprintf(stderr, err12a, infile);
-                    goto error;
-                }
-                /* cant appear before dimension sizes have been provided */
-                if (in->configOptionVector[DIM] == 0) {
-                    (void) HDfprintf(stderr, err12b, infile);
-                    goto error;
-                }
-
-                if (getChunkedDimensionSizes(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err12c, infile);
-                    goto error;
-                }
-                in->configOptionVector[CHUNK] = 1;
-                break;
-
-            case 10: /* COMPRESSION-TYPE */
-                if (in->configOptionVector[COMPRESS] == 1) {
-                    (void) HDfprintf(stderr, err13a, infile);
-                    goto error;
-                }
-
-                if (getCompressionType(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err13b, infile);
-                    goto error;
-                }
-                in->configOptionVector[COMPRESS] = 1;
-
-                if (in->configOptionVector[COMPRESS_PARAM] == 0) {
-                    if (in->compressionType == 0)
-                        in->compressionParam = 6; /* default value if compressionType is GZIP */
-                }
-                break;
-
-            case 11: /* COMPRESSION-PARAM */
-                if (in->configOptionVector[COMPRESS_PARAM] == 1) {
-                    (void) HDfprintf(stderr, err14a, infile);
-                    goto error;
-                }
-
-                if (getCompressionParameter(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err14b, infile);
-                    goto error;
-                }
-
-                in->configOptionVector[COMPRESS_PARAM] = 1;
-
-                if (in->configOptionVector[COMPRESS] == 0)
-                    in->compressionType = 0;
-
-                break;
-
-            case 12: /* EXTERNAL-STORAGE */
-                if (in->configOptionVector[EXTERNALSTORE] == 1) {
-                    (void) HDfprintf(stderr, err15a, infile);
-                    goto error;
-                }
-
-                if (getExternalFilename(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err15b, infile);
-                    goto error;
-                }
-                in->configOptionVector[EXTERNALSTORE] = 1;
-                break;
-
-            case 13: /* MAXIMUM-DIMENSIONS */
-                if (in->configOptionVector[EXTEND] == 1) {
-                    (void) HDfprintf(stderr, err16a, infile);
-                    goto error;
-                }
-                /* cant appear before dimension sizes have been provided */
-                if (in->configOptionVector[DIM] == 0) {
-                    (void) HDfprintf(stderr, err16b, infile);
-                    goto error;
-                }
-                if (getMaximumDimensionSizes(in, strm) == -1) {
-                    (void) HDfprintf(stderr, err16c, infile);
-                    goto error;
-                }
-                in->configOptionVector[EXTEND] = 1;
-                break;
-
-            default:
-                break;
-            }
-            scanret = fscanf(strm, "%s", key);
-        }
-    }
-
-    /*
-         check if keywords obtained are valid
-         if yes, return 0 else error
-     */
-
-    if (validateConfigurationParameters(in) == -1) {
-        (void) HDfprintf(stderr, err17, infile);
-        goto error;
-    }
-
-    /* Set success return value */
-    retval = 0;
-
-error:
-    if(strm)
-        HDfclose(strm);
-    return(retval);
-}
-
-static int validateConfigurationParameters(struct Input *in)
-{
-    const char *err1 = "One or more of the required fields (RANK, DIMENSION-SIZES) missing.\n";
-    const char *err2 = "Cannot specify chunking or compression or extendible data sets with the external file option.\n";
-    const char *err3 = "Cannot specify the compression or the extendible data sets without the chunking option.\n";
-    const char *err4a = "OUTPUT-ARCHITECTURE cannot be STD if OUTPUT-CLASS is floating point (FP).\n";
-    const char *err4b = "OUTPUT-ARCHITECTURE cannot be IEEE if OUTPUT-CLASS is integer (IN).\n";
-    const char *err5 = "For OUTPUT-CLASS FP, valid values for OUTPUT-SIZE are (32, 64) .\n";
-#ifndef H5_SIZEOF_LONG_LONG
-    const char *err6 = "No support for reading 64-bit integer (INPUT-CLASS: IN, TEXTIN, UIN, TEXTUIN files\n";
-#endif
-
-    /* for class STR other parameters are ignored */
-    if (in->inputClass == 5) /* STR */
-        return (0);
-
-    if ((in->configOptionVector[DIM] != 1) || (in->configOptionVector[RANK] != 1)) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    if (in->configOptionVector[EXTERNALSTORE] == 1) {
-        if ((in->configOptionVector[COMPRESS] == 1) || (in->configOptionVector[CHUNK] == 1) || (in->configOptionVector[EXTEND] == 1)) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-    }
-
-    if ((in->configOptionVector[COMPRESS] == 1) || (in->configOptionVector[EXTEND] == 1)) {
-        if (in->configOptionVector[CHUNK] != 1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-    }
-
-    /* Arch cant be STD if O/p class is FP */
-    if (in->outputArchitecture == 1)
-        if (in->outputClass == 1) {
-            (void) HDfprintf(stderr, "%s", err4a);
-            return (-1);
-        }
-
-    /* Arch cant be IEEE if O/p class is IN */
-    if (in->outputArchitecture == 2)
-        if (in->outputClass == 0) {
-            (void) HDfprintf(stderr, "%s", err4b);
-            return (-1);
-        }
-
-    if (in->outputClass == 1)
-        if (in->outputSize != 32 && in->outputSize != 64) {
-            (void) HDfprintf(stderr, "%s", err5);
-            return (-1);
-        }
-
-#ifndef H5_SIZEOF_LONG_LONG
-    if (in->inputSize == 64 && (in->inputClass == 0 || in->inputClass == 4 || in->inputClass == 6 || in->inputClass == 7) ) {
-        (void) HDfprintf(stderr, "%s", err6);
-        return -1;
-    }
-#endif
-    return (0);
-}
-
-static int mapKeywordToIndex(char *key)
-{
-    int i;
-
-    for (i = 0; i < NUM_KEYS; i++)
-        if (!HDstrcmp(keytable[i], key))
-            return i;
-    return -1;
-}
-
-static int parsePathInfo(struct path_info *path, char *temp)
-{
-    const char  delimiter[] = "/\"";
-    char       *token;
-    int         i = 0;
-    const char *err1 = "Path string larger than MAX_PATH_NAME_LENGTH.\n";
-
-    token = HDstrtok (temp, delimiter);
-    if (HDstrlen(token) >= MAX_PATH_NAME_LENGTH) {
-        (void) HDfprintf(stderr, err1);
-        return (-1);
-    }
-    HDstrcpy(path->group[i++],token);
-
-    while (1) {
-        token = HDstrtok (NULL, delimiter);
-        if (token == NULL)
-            break;
-        if (HDstrlen(token) >= MAX_PATH_NAME_LENGTH) {
-            (void) HDfprintf(stderr, err1);
-            return (-1);
-        }
-        HDstrcpy(path->group[i++],token);
-    }
-    path->count = i;
-    return (0);
-}
-
-static int parseDimensions(struct Input *in, char *strm)
-{
-    const char  delimiter[] = ",";
-    char        temp[255];
-    char       *token;
-    int         i = 0;
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-
-    HDstrncpy(temp, strm, sizeof(temp));
-    temp[sizeof(temp) - 1] = '\0';
-    HDstrtok (temp, delimiter);
-
-    while (1) {
-        token = HDstrtok (NULL, delimiter);
-        if (token == NULL)
-            break;
-        i++;
-    }
-    in->rank = i + 1;
-    if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    i = 0;
-    HDstrncpy(temp, strm, sizeof(temp));
-    temp[sizeof(temp) - 1] = '\0';
-    in->sizeOfDimension[i++]
-            = HDstrtol(HDstrtok (temp, delimiter), NULL, BASE_10);
-
-    while (1) {
-        token = HDstrtok (NULL, delimiter);
-        if (token == NULL)
-            break;
-        in->sizeOfDimension[i++] = HDstrtol(token, NULL, BASE_10);
-    }
-    return (0);
-}
-
-static int getOutputClass(struct Input *in, FILE *strm)
-{
-    char        temp[255];
-    int         kindex;
-    const char *err1 = "Unable to get 'string' value.\n";
-    const char *err2 = "Invalid value for output class.\n";
-
-    if (fscanf(strm, "%s", temp) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    if ((kindex = OutputClassStrToInt(temp)) == -1) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    in->outputClass = kindex;
-    return (0);
-}
-
-static int OutputClassStrToInt(char *temp)
-{
-    int     i;
-    char    classKeywordTable[3][15] = { "IN", "FP", "UIN" };
-    for (i = 0; i < 3; i++)
-        if (!HDstrcmp(classKeywordTable[i], temp))
-            return i;
-
-    return -1;
-}
-/* same as getInputSize. But defined separately for extensibility */
-static int getOutputSize(struct Input *in, FILE *strm)
-{
-    int         ival;
-    int         i;
-    int         outputSizeValidValues[4] = { 8, 16, 32, 64 };
-    const char *err1 = "Unable to get integer value.\n";
-    const char *err2 = "Invalid value for output size.\n";
-
-    if (fscanf(strm, "%d", (&ival)) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    for (i = 0; i < 4; i++)
-        if (outputSizeValidValues[i] == ival) {
-            in->outputSize = ival;
-            return (0);
-        }
-    (void) HDfprintf(stderr, "%s", err2);
-    return (-1);
-}
-
-static int getInputClass(struct Input *in, char * temp)
-{
-    int         kindex;
-    const char *err1 = "Invalid value for input class.\n";
-
-    if ((kindex = InputClassStrToInt(temp)) == -1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    in->inputClass = kindex;
-    return (0);
-}
-
-static int getInputClassType(struct Input *in, char * buffer)
-{
-    int         kindex = -1;
-    const char *err1 = "Invalid value for input class.\n";
-    const char *err2 = "Invalid value for output architecture.\n";
-    const char *err3 = "Invalid value for output byte-order.\n";
-
-    if (!HDstrcmp(buffer, "H5T_STD_I8BE")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I8LE")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I16BE")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I16LE")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I32BE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I32LE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I64BE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_I64LE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U8BE")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U8LE")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U16BE")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U16LE")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U32BE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U32LE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U64BE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_U64LE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_SCHAR")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_UCHAR")) {
-        in->inputSize = 8;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_SHORT")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_USHORT")) {
-        in->inputSize = 16;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_INT")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_UINT")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_LONG")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_ULONG")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_LLONG")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 4;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_ULLONG")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 7;
-    }
-    else if (!HDstrcmp(buffer, "H5T_IEEE_F32BE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_IEEE_F32LE")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_IEEE_F64BE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_IEEE_F64LE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_VAX_F32")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_VAX_F64")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_FLOAT")) {
-        in->inputSize = 32;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 3;
-    }
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_DOUBLE")) {
-        in->inputSize = 64;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 3;
-    }
-#if H5_SIZEOF_LONG_DOUBLE !=0
-    else if (!HDstrcmp(buffer, "H5T_NATIVE_LDOUBLE")) {
-        in->inputSize = H5_SIZEOF_LONG_DOUBLE;
-        in->configOptionVector[INPUT_SIZE] = 1;
-
-        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        kindex = 3;
-    }
-#endif
-    else if(!HDstrcmp(buffer, "H5T_TIME: not yet implemented")) {
-        kindex = -1;
-    }
-    else if(!HDstrcmp(buffer, "H5T_STRING")) {
-        kindex = 5;
-    }
-    /*    case H5T_BITFIELD: */
-    else if (!HDstrcmp(buffer, "H5T_STD_B8BE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B8LE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B16BE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B16LE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B32BE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B32LE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B64BE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    else if (!HDstrcmp(buffer, "H5T_STD_B64LE")) {
-
-        if ((kindex = OutputArchStrToInt("STD")) == -1) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->outputArchitecture = kindex;
-
-        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-        in->outputByteOrder = kindex;
-
-        kindex = -1;
-    }
-    /*    case H5T_OPAQUE: */
-    else if(!HDstrcmp(buffer, "H5T_OPAQUE")) {
-        kindex = -1;
-    }
-    /*    case H5T_COMPOUND: */
-    else if(!HDstrcmp(buffer, "H5T_COMPOUND")) {
-        kindex = -1;
-    }
-    /*    case H5T_REFERENCE: */
-    else if(!HDstrcmp(buffer, "H5T_REFERENCE")) {
-        kindex = -1;
-    }
-    /*    case H5T_ENUM: */
-    else if(!HDstrcmp(buffer, "H5T_ENUM")) {
-        kindex = -1;
-    }
-    /*    case H5T_VLEN: */
-    else if(!HDstrcmp(buffer, "H5T_VLEN")) {
-        kindex = -1;
-    }
-    /*    case H5T_ARRAY: */
-    else if(!HDstrcmp(buffer, "H5T_ARRAY")) {
-        kindex = -1;
-    }
-
-    if (kindex == -1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    /*set default value for output-size */
-    if (in->configOptionVector[OUTPUT_SIZE] == 0)
-        in->outputSize = in->inputSize;
-#ifdef H5DEBUGIMPORT
-    printf("h5dump DATATYPE STRING %d inputSize\n", in->inputSize);
-    printf("h5dump DATATYPE STRING %d outputSize\n", in->outputSize);
-#endif
-
-    in->inputClass = kindex;
-    return (0);
-}
-
-static int InputClassStrToInt(char *temp)
-{
-    int     i;
-    char    classKeywordTable[8][15] = { "TEXTIN", "TEXTFP", "TEXTFPE", "FP", "IN", "STR", "TEXTUIN", "UIN" };
-    for (i = 0; i < 8; i++)
-        if (!HDstrcmp(classKeywordTable[i], temp))
-            return i;
-    return -1;
-}
-
-/* same as getOutputSize. But defined separately for extensibility */
-static int getInputSize(struct Input *in, int ival)
-{
-    int         i;
-    int         inputSizeValidValues[4] = { 8, 16, 32, 64 };
-    const char *err1 = "Invalid value for input size.\n";
-
-    for (i = 0; i < 4; i++)
-        if (inputSizeValidValues[i] == ival) {
-            in->inputSize = ival;
-            return (0);
-        }
-    (void) HDfprintf(stderr, "%s", err1);
-    return (-1);
-}
-
-static int getRank(struct Input *in, FILE *strm)
-{
-    int         ival;
-
-    const char *err1 = "Unable to get integer value.\n";
-    const char *err2 = "Invalid value for rank.\n";
-
-    if (fscanf(strm, "%d", (&ival)) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-    if (ival >= MIN_NUM_DIMENSION && ival <= MAX_NUM_DIMENSION) {
-        in->rank = ival;
-        return (0);
-    }
-
-    (void) HDfprintf(stderr, "%s", err2);
-    return (-1);
-}
-
-/* same as getChunkedDimensionSizes. But defined separately for extensibility */
-static int getDimensionSizes(struct Input *in, FILE *strm)
-{
-    int         ival;
-    int         i = 0;
-
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "No. of dimensions for which dimension sizes provided is not equal to provided rank.\n";
-
-    if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    while (fscanf(strm, "%d", (&ival)) == 1)
-        in->sizeOfDimension[i++] = ival;
-
-    if (in->rank != i) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-    return (0);
-}
-/* same as getDimensionSizes. But defined separately for extensibility */
-static int getChunkedDimensionSizes(struct Input *in, FILE *strm)
-{
-    int         ival;
-    int         i = 0;
-
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "No. of dimensions for which chunked dimension sizes provided is not equal to provided rank.\n";
-    const char *err3 = "The CHUNKED-DIMENSION-SIZES cannot exceed the sizes of DIMENSION-SIZES\n";
-
-    if ((in->sizeOfChunk = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    while (fscanf(strm, "%d", (&ival)) == 1)
-        in->sizeOfChunk[i++] = ival;
-
-    if (in->rank != i) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    for (i = 0; i < in->rank; i++)
-        if (in->sizeOfChunk[i] > in->sizeOfDimension[i]) {
-            (void) HDfprintf(stderr, "%s", err3);
-            return (-1);
-        }
-    return (0);
-}
-
-static int getMaximumDimensionSizes(struct Input *in, FILE *strm)
-{
-    int         ival;
-    int         i = 0;
-
-    const char *err1 = "Unable to allocate dynamic memory.\n";
-    const char *err2 = "No. of dimensions for which maximum dimension sizes provided is not equal to provided rank.\n";
-    const char *err3 = "The MAXIMUM-DIMENSIONS cannot be less than the sizes of DIMENSION-SIZES. Exception: can be -1 to indicate unlimited size\n";
-
-    if ((in->maxsizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    while (fscanf(strm, "%d", (&ival)) == 1) {
-        if (ival == -1)
-            in->maxsizeOfDimension[i++] = H5S_UNLIMITED;
-        else
-            in->maxsizeOfDimension[i++] = ival;
-    }
-
-    if (in->rank != i) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    for (i = 0; i < in->rank; i++) {
-        if (in->maxsizeOfDimension[i] != H5S_UNLIMITED)
-            if (in->maxsizeOfDimension[i] < in->sizeOfDimension[i]) {
-                (void) HDfprintf(stderr, "%s", err3);
-                return (-1);
-            }
-    }
-    return (0);
-}
-
-static int getOutputArchitecture(struct Input *in, FILE *strm)
-{
-    char        temp[255];
-    int         kindex;
-    const char *err1 = "Unable to get 'string' value.\n";
-    const char *err2 = "Invalid value for output architecture.\n";
-
-    if (fscanf(strm, "%s", temp) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    if ((kindex = OutputArchStrToInt(temp)) == -1) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    in->outputArchitecture = kindex;
-    return (0);
-}
-
-static int OutputArchStrToInt(const char *temp)
-{
-    int     i;
-    char    outputArchKeywordTable[8][15] = { "NATIVE", "STD", "IEEE", "INTEL",
-            "CRAY", "MIPS", "ALPHA", "UNIX" };
-    for (i = 0; i < 8; i++)
-        if (!HDstrcmp(outputArchKeywordTable[i], temp))
-            return i;
-    return -1;
-}
-
-static int getOutputByteOrder(struct Input *in, FILE *strm)
-{
-    char        temp[255];
-    int         kindex;
-    const char *err1 = "Unable to get 'string' value.\n";
-    const char *err2 = "Invalid value for output byte-order.\n";
-
-    if (fscanf(strm, "%s", temp) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    if ((kindex = OutputByteOrderStrToInt(temp)) == -1) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    in->outputByteOrder = kindex;
-    return (0);
-}
-
-static int OutputByteOrderStrToInt(const char *temp)
-{
-    int     i;
-    char    outputByteOrderKeywordTable[2][15] = { "BE", "LE" };
-    for (i = 0; i < 2; i++)
-        if (!HDstrcmp(outputByteOrderKeywordTable[i], temp))
-            return i;
-    return -1;
-}
-
-static int getCompressionType(struct Input *in, FILE *strm)
-{
-    char        temp[255];
-    int         kindex;
-    const char *err1 = "Unable to get 'string' value.\n";
-    const char *err2 = "Invalid value for compression.\n";
-
-    if (fscanf(strm, "%s", temp) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    if ((kindex = CompressionTypeStrToInt(temp)) == -1) {
-        (void) HDfprintf(stderr, "%s", err2);
-        return (-1);
-    }
-
-    in->compressionType = kindex;
-    return (0);
-
-}
-
-static int CompressionTypeStrToInt(char *temp)
-{
-    /* currently supports only GZIP */
-    /* can be extended by adding fields to the table */
-
-    int     i;
-    char    CompressionTypeKeywordTable[1][15] = { "GZIP" };
-    for (i = 0; i < 1; i++)
-        if (!HDstrcmp(CompressionTypeKeywordTable[i], temp))
-            return i;
-    return -1;
-}
-
-static int getCompressionParameter(struct Input *in, FILE *strm)
-{
-    /*  currently supports only GZIP */
-    /*  can be extended by adding more values to COMPRESSION-TYPE and */
-    /*  handling the paramters here by adding more cases  */
-
-    int         ival;
-    const char *err1 = "Unable to get integer value.\n";
-    const char *err2 = "Invalid value for compression paramter.\n";
-    const char *err3 = "Unsupported Compression Type.\n";
-
-    switch (in->compressionType) {
-    case 0: /* GZIP */
-        if (fscanf(strm, "%d", (&ival)) != 1) {
-            (void) HDfprintf(stderr, "%s", err1);
-            return (-1);
-        }
-
-        if (ival < 0 || ival > 9) {
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        in->compressionParam = ival;
-        return (0);
-
-    default:
-        (void) HDfprintf(stderr, "%s", err3);
-        return (-1);
-    }
-}
-
-static int getExternalFilename(struct Input *in, FILE *strm)
-{
-    char        temp[255];
-    const char *err1 = "Unable to get 'string' value.\n";
-
-    if (fscanf(strm, "%s", temp) != 1) {
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-
-    in->externFilename = (char *) HDmalloc ((size_t) (HDstrlen(temp)) * sizeof(char));
-    (void) HDstrcpy(in->externFilename, temp);
-    return (0);
-}
-
-void setDefaultValues(struct Input *in, int count)
-{
-    int     i;
-    char    temp[255];
-    char    num[255];
-
-    in->h5dumpInput = 0;
-    in->inputClass = 3; /* FP */
-    in->inputSize = 32;
-    in->outputClass = 1; /* FP */
-    in->outputSize = 32;
-    in->rank = 0;
-    in->path.count = 1;
-
-    HDstrcpy(temp, "dataset");
-    sprintf(num, "%d", count);
-    HDstrcat(temp, num);
-    HDstrcpy(in->path.group[0], temp);
-
-    in->outputArchitecture = 0; /* NATIVE */
-    in->outputByteOrder = -1; /* use default    */
-    in->compressionType = 0; /* GZIP   */
-    for (i = 0; i < NUM_KEYS; i++)
-        in->configOptionVector[i] = 0;
-}
-
-hid_t createOutputDataType(struct Input *in)
-{
-    hid_t       new_type = (-1);
-    const char *err1 = "Invalid value for output class.\n";
-    const char *err2 = "Invalid value for output size.\n";
-    const char *err3 = "Invalid value for output byte order.\n";
-	const char *err4 = "Invalid value for output architecture.\n";
-    const char *err5 = "STD not supported for float.\n";
-    const char *err6 = "IEEE not supported for INT.\n";
-
-    switch (in->outputClass) {
-    case 0:
-        switch (in->outputArchitecture) {
-        case 0: /* NATIVE */
-            switch (in->outputSize) {
-            case 8:
-                new_type = H5Tcopy(H5T_NATIVE_CHAR);
-                break;
-
-            case 16:
-                new_type = H5Tcopy(H5T_NATIVE_SHORT);
-                break;
-
-            case 32:
-                new_type = H5Tcopy(H5T_NATIVE_INT);
-                break;
-
-            case 64:
-                new_type = H5Tcopy(H5T_NATIVE_LLONG);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            switch (in->outputByteOrder) {
-            case -1: /* default */
-                break;
-            case 0:
-                H5Tset_order(new_type, H5T_ORDER_BE);
-                break;
-
-            case 1:
-                H5Tset_order(new_type, H5T_ORDER_LE);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err3);
-                return (-1);
-            }
-            break;
-
-        case 1: /* STD */
-            switch (in->outputSize) {
-            case 8:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_I8BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_I8LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 16:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_I16BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_I16LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 32:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_I32BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_I32LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 64:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_I64BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_I64LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            break;
-
-		default:
-			(void) HDfprintf(stderr, "%s", err4);
-			return (-1);
-        }
-        break;
-
-    case 1:
-        switch (in->outputArchitecture) {
-        case 0:
-            switch (in->outputSize) {
-            case 32:
-                new_type = H5Tcopy(H5T_NATIVE_FLOAT);
-                break;
-
-            case 64:
-                new_type = H5Tcopy(H5T_NATIVE_DOUBLE);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            switch (in->outputByteOrder) {
-            case -1: /* DEFAULT */
-                break;
-            case 0:
-                H5Tset_order(new_type, H5T_ORDER_BE);
-                break;
-
-            case 1:
-                H5Tset_order(new_type, H5T_ORDER_LE);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err3);
-                return (-1);
-            }
-            break;
-
-        case 1:
-            (void) HDfprintf(stderr, "%s", err5);
-            return (-1);
-
-        case 2:
-            switch (in->outputSize) {
-            case 32:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_IEEE_F32BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_IEEE_F32LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 64:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_IEEE_F64BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_IEEE_F64LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            break;
-
-		default:
-			(void) HDfprintf(stderr, "%s", err4);
-			return (-1);
-        }
-        break;
-
-    case 2:
-        switch (in->outputArchitecture) {
-        case 0:
-            switch (in->outputSize) {
-            case 8:
-                new_type = H5Tcopy(H5T_NATIVE_UCHAR);
-                break;
-
-            case 16:
-                new_type = H5Tcopy(H5T_NATIVE_USHORT);
-                break;
-
-            case 32:
-                new_type = H5Tcopy(H5T_NATIVE_UINT);
-                break;
-
-            case 64:
-                new_type = H5Tcopy(H5T_NATIVE_ULLONG);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            switch (in->outputByteOrder) {
-            case -1: /* Default */
-                break;
-            case 0:
-                H5Tset_order(new_type, H5T_ORDER_BE);
-                break;
-
-            case 1:
-                H5Tset_order(new_type, H5T_ORDER_LE);
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err3);
-                return (-1);
-            }
-            break;
-
-        case 1:
-            switch (in->outputSize) {
-            case 8:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_U8BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_U8LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 16:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_U16BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_U16LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 32:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_U32BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_U32LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            case 64:
-                switch (in->outputByteOrder) {
-                case -1:
-                case 0:
-                    new_type = H5Tcopy(H5T_STD_U64BE);
-                    break;
-
-                case 1:
-                    new_type = H5Tcopy(H5T_STD_U64LE);
-                    break;
-
-                default:
-                    (void) HDfprintf(stderr, "%s", err3);
-                    return (-1);
-                }
-                break;
-
-            default:
-                (void) HDfprintf(stderr, "%s", err2);
-                return (-1);
-            }
-            break;
-
-        case 2:
-            (void) HDfprintf(stderr, "%s", err6);
-            return (-1);
-
-        default:
-            (void) HDfprintf(stderr, "%s", err4);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-    return new_type;
-}
-
-hid_t createInputDataType(struct Input *in)
-{
-    hid_t       new_type = (-1);
-    const char *err1 = "Invalid value for input class.\n";
-    const char *err2 = "Invalid value for output size.\n";
-
-    switch (in->inputClass) {
-    case 0:
-    case 4:
-        switch (in->inputSize) {
-        case 8:
-            new_type = H5Tcopy(H5T_NATIVE_CHAR);
-            break;
-
-        case 16:
-            new_type = H5Tcopy(H5T_NATIVE_SHORT);
-            break;
-
-        case 32:
-            new_type = H5Tcopy(H5T_NATIVE_INT);
-            break;
-
-        case 64:
-            new_type = H5Tcopy(H5T_NATIVE_LLONG);
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 1:
-    case 2:
-    case 3:
-        switch (in->inputSize) {
-        case 32:
-            new_type = H5Tcopy(H5T_NATIVE_FLOAT);
-            break;
-
-        case 64:
-            new_type = H5Tcopy(H5T_NATIVE_DOUBLE);
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    case 5:
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-        break;
-
-    case 6:
-    case 7:
-        switch (in->inputSize) {
-        case 8:
-            new_type = H5Tcopy(H5T_NATIVE_UCHAR);
-            break;
-
-        case 16:
-            new_type = H5Tcopy(H5T_NATIVE_USHORT);
-            break;
-
-        case 32:
-            new_type = H5Tcopy(H5T_NATIVE_UINT);
-            break;
-
-        case 64:
-            new_type = H5Tcopy(H5T_NATIVE_ULLONG);
-            break;
-
-        default:
-            (void) HDfprintf(stderr, "%s", err2);
-            return (-1);
-        }
-        break;
-
-    default:
-        (void) HDfprintf(stderr, "%s", err1);
-        return (-1);
-    }
-    return new_type;
-}
-
-static int process(struct Options *opt)
-{
-    struct Input   *in;
-    FILE           *extfile;
-    hid_t           file_id;
-    hid_t           group_id;
-    hid_t           handle;
-    hid_t           dataset;
-    hid_t           dataspace = (-1);
-    hid_t           intype;
-    hid_t           outtype;
-    hid_t           proplist;
-    hsize_t         numOfElements = 1;
-    int             j;
-    int             k;
-
-    const char *err1 = "Error creating HDF output file: %s.\n";
-    const char *err2 = "Error in processing the configuration file: %s.\n";
-    const char *err3 = "Error in reading the input file: %s.\n";
-    const char *err4 = "Error in creating or opening external file.\n";
-    const char *err5 = "Error in creating the output data set. Dataset with the same name may exist at the specified path\n";
-    const char *err6 = "Error in writing the output data set.\n";
-
-    H5E_BEGIN_TRY
-    {
-        if ((file_id = H5Fopen(opt->outfile, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
-            if ((file_id = H5Fcreate(opt->outfile, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) == FAIL) {
-                (void) HDfprintf(stderr, err1, opt->outfile);
-                return (-1);
-            }
-        }
-    }
-    H5E_END_TRY;
-
-    for (k = 0; k < opt->fcount; k++) {
-        in = &(opt->infiles[k].in);
-        if (opt->infiles[k].config == 1) {
-            if (processConfigurationFile(opt->infiles[k].configfile, in) == -1) {
-                (void) HDfprintf(stderr, err2, opt->infiles[k].configfile);
-                return (-1);
-            }
-        }
-
-        if (processDataFile(opt->infiles[k].datafile, in, file_id) == -1) {
-            (void) HDfprintf(stderr, err3, opt->infiles[k].datafile);
-            return (-1);
-        }
-
-        if (in->inputClass != 5) { /* STR */
-            for (j = 0; j < in->rank; j++)
-                numOfElements *= in->sizeOfDimension[j];
-
-            /* disable error reporting */
-            H5E_BEGIN_TRY
-            {
-                /* create parent groups */
-                if (in->path.count > 1) {
-                    j = 0;
-                    handle = file_id;
-                    while (j < in->path.count - 1) {
-                        if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
-                            group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                            for (; j < in->path.count - 1; j++)
-                                group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-                            handle = group_id;
-                            break;
-                        }
-                        handle = group_id;
-                        j++;
-                    }
-                }
-                else {
-                    handle = file_id;
-                    j = 0;
-                }
-
-                /*enable error reporting */
-            }
-            H5E_END_TRY;
-
-            /*create data type */
-            intype = createInputDataType(in);
-            outtype = createOutputDataType(in);
-#ifdef H5DEBUGIMPORT
-            printf("process intype %d outtype %d\n", intype, outtype);
-#endif
-
-            /* create property list */
-            proplist = H5Pcreate(H5P_DATASET_CREATE);
-            if (in->configOptionVector[CHUNK] == 1) {
-                H5Pset_layout(proplist, H5D_CHUNKED);
-                /* not reqd chunking is implied if set_chunk is used  */
-                H5Pset_chunk(proplist, in->rank, in->sizeOfChunk);
-            }
-
-            if (in->configOptionVector[COMPRESS] == 1) {
-                H5Pset_deflate(proplist, (unsigned) in->compressionParam);
-            }
-
-            if (in->configOptionVector[EXTERNALSTORE] == 1) {
-                /* creating the external file if it doesnt exist */
-                if ((extfile = HDfopen(in->externFilename, "ab")) == NULL) {
-                    (void) HDfprintf(stderr, "%s", err4);
-                    H5Pclose(proplist);
-                    H5Sclose(dataspace);
-                    H5Fclose(file_id);
-                    return (-1);
-                }
-                HDfclose(extfile);
-                H5Pset_external(proplist, in->externFilename, (off_t) 0, numOfElements * in->inputSize / 8);
-            }
-
-            /* create dataspace */
-            if (in->configOptionVector[EXTEND] == 1)
-                dataspace = H5Screate_simple(in->rank, in->sizeOfDimension, in->maxsizeOfDimension);
-            else
-                dataspace = H5Screate_simple(in->rank, in->sizeOfDimension, NULL);
-
-            /* disable error reporting */
-            H5E_BEGIN_TRY
-            {
-                /* create data set */
-                if ((dataset = H5Dcreate2(handle, in->path.group[j], outtype, dataspace, H5P_DEFAULT, proplist, H5P_DEFAULT)) < 0) {
-                    (void) HDfprintf(stderr, "%s", err5);
-                    H5Pclose(proplist);
-                    H5Sclose(dataspace);
-                    H5Fclose(file_id);
-                    return (-1);
-                }
-
-                /*enable error reporting */
-            }
-            H5E_END_TRY;
-
-            /* write dataset */
-            if (H5Dwrite(dataset, intype, H5S_ALL, H5S_ALL, H5P_DEFAULT, (VOIDP) in->data) < 0) {
-                (void) HDfprintf(stderr, "%s", err6);
-                H5Dclose(dataset);
-                H5Pclose(proplist);
-                H5Sclose(dataspace);
-                H5Fclose(file_id);
-                return (-1);
-            }
-
-            H5Dclose(dataset);
-            H5Pclose(proplist);
-            H5Sclose(dataspace);
-        }
-
-    } /* STR */
-
-    H5Fclose(file_id);
-    return (0);
-}
-
-/*
- * Name:
- *      help
- *
- * Purpose:
- *      Print a helpful summary of command usage and features.
- */
-
-void help(char *name)
-{
-    (void) HDfprintf(stdout, "Name:\n\n");
-    (void) HDfprintf(stdout, "\t%s\n\n", name);
-    (void) HDfprintf(stdout, "\t  TOOL NAME:\n");
-    (void) HDfprintf(stdout, "\t   %s\n", name);
-    (void) HDfprintf(stdout, "\t   SYNTAX:\n");
-    (void) HDfprintf(stdout, "\t   %s -h[elp], OR\n", name);
-    (void) HDfprintf(stdout,
-            "\t   %s <infile> -c[onfig] <configfile> [<infile> -c[config] <configfile>...]", name);
-    (void) HDfprintf(stdout, "\t\t\t\t      -o[utfile] <outfile>\n\n");
-    (void) HDfprintf(stdout, "\t   PURPOSE:\n");
-    (void) HDfprintf(stdout,
-            "\t   To convert data stored in one or more ASCII or binary files\n");
-    (void) HDfprintf(stdout,
-            "\t  into one or more datasets (in accordance with the \n");
-    (void) HDfprintf(stdout,
-            "\t  user-specified type and storage properties) in an existing \n");
-    (void) HDfprintf(stdout, "\t  or new HDF5 file.\n\n");
-    (void) HDfprintf(stdout, "\t   DESCRIPTION:\n");
-    (void) HDfprintf(stdout,
-            "\t  The primary objective of the utility is to convert floating\n");
-    (void) HDfprintf(stdout,
-            "\t  point or integer data stored in ASCII text or binary form \n");
-    (void) HDfprintf(stdout,
-            "\t  into a data-set according to the type and storage properties\n");
-    (void) HDfprintf(stdout,
-            "\t  specified by the user. The utility can also accept ASCII\n");
-    (void) HDfprintf(stdout,
-            "\t  text files and store the contents in a compact form as an\n");
-    (void) HDfprintf(stdout, "\t  array of one-dimensional strings.\n\n");
-    (void) HDfprintf(stdout,
-            "\t  The input data to be written as a data-set can be provided\n");
-    (void) HDfprintf(stdout, "\t  to the utility in one of the following forms:\n");
-    (void) HDfprintf(stdout,
-            "\t  1. ASCII text file with numeric data (floating point or \n");
-    (void) HDfprintf(stdout, "\t  integer data). \n");
-    (void) HDfprintf(stdout,
-            "\t  2. Binary file with native floating point data (32-bit or \n");
-    (void) HDfprintf(stdout, "\t  64-bit) \n");
-    (void) HDfprintf(stdout,
-            "\t  3. Binary file with native integer (signed or unsigned)\n");
-    (void) HDfprintf(stdout, "\t  data (8-bit or 16-bit or 32-bit or 64-bit). \n");
-    (void) HDfprintf(stdout,
-            "\t  4. ASCII text file containing strings (text data).\n");
-    (void) HDfprintf(stdout, "\t    \n");
-    (void) HDfprintf(stdout,
-            "\t  Every input file is associated with a configuration file \n");
-    (void) HDfprintf(stdout,
-            "\t  also provided as an input to the utility. (See Section \n");
-    (void) HDfprintf(stdout,
-            "\t  \"CONFIGURATION FILE\" to know how it is to be organized).\n");
-    (void) HDfprintf(stdout,
-            "\t  The class, size and dimensions of the input data is \n");
-    (void) HDfprintf(stdout,
-            "\t  specified in this configuration file. A point to note is\n");
-    (void) HDfprintf(stdout,
-            "\t  that the floating point data in the ASCII text file may be\n");
-    (void) HDfprintf(stdout,
-            "\t  organized in the fixed floating form (for example 323.56)\n");
-    (void) HDfprintf(stdout,
-            "\t  or in a scientific notation (for example 3.23E+02). A \n");
-    (void) HDfprintf(stdout,
-            "\t  different input-class specification is to be used for both\n");
-    (void) HDfprintf(stdout, "\t  forms.\n\n");
-    (void) HDfprintf(stdout,
-            "\t  The utility extracts the input data from the input file \n");
-    (void) HDfprintf(stdout,
-            "\t  according to the specified parameters and saves it into \n");
-    (void) HDfprintf(stdout, "\t  an H5 dataset. \n\n");
-    (void) HDfprintf(stdout,
-            "\t  The user can specify output type and storage properties in \n");
-    (void) HDfprintf(stdout,
-            "\t  the configuration file. The user is required to specify the \n");
-    (void) HDfprintf(stdout,
-            "\t  path of the dataset. If the groups in the path leading to \n");
-    (void) HDfprintf(stdout,
-            "\t  the data-set do not exist, the groups will be created by the\n");
-    (void) HDfprintf(stdout,
-            "\t  utility. If no group is specified, the dataset will be\n");
-    (void) HDfprintf(stdout, "\t  created under the root group.\n\n");
-    (void) HDfprintf(stdout,
-            "\t  In addition to the name, the user is also required to \n");
-    (void) HDfprintf(stdout,
-            "\t  provide the class and size of output data to be written to \n");
-    (void) HDfprintf(stdout,
-            "\t  the dataset and may optionally specify the output-architecture,\n");
-    (void) HDfprintf(stdout,
-            "\t  and the output-byte-order. If output-architecture is not \n");
-    (void) HDfprintf(stdout,
-            "\t  specified the default is NATIVE. Output-byte-orders are fixed\n");
-    (void) HDfprintf(stdout,
-            "\t  for some architectures and may be specified only if output-\n");
-    (void) HDfprintf(stdout, "\t  architecture is IEEE, UNIX or STD.\n\n");
-    (void) HDfprintf(stdout,
-            "\t   Also, layout and other storage properties such as \n");
-    (void) HDfprintf(stdout,
-            "\t  compression, external storage and extendible data-sets may be\n");
-    (void) HDfprintf(stdout,
-            "\t  optionally specified.  The layout and storage properties \n");
-    (void) HDfprintf(stdout,
-            "\t  denote how raw data is to be organized on the disk. If these \n");
-    (void) HDfprintf(stdout,
-            "\t  options are not specified the default is Contiguous layout \n");
-    (void) HDfprintf(stdout, "\t  and storage.\n\n");
-    (void) HDfprintf(stdout,
-            "\t  The dataset can be organized in any of the following ways:\n");
-    (void) HDfprintf(stdout, "\t  1. Contiguous.\n");
-    (void) HDfprintf(stdout, "\t  2. Chunked.\n");
-    (void) HDfprintf(stdout,
-            "\t  3. External Storage File    (has to be contiguous)\n");
-    (void) HDfprintf(stdout,
-            "\t  4. Extendible data sets     (has to be chunked)\n");
-    (void) HDfprintf(stdout, "\t  5. Compressed.        (has to be chunked)\n");
-    (void) HDfprintf(stdout,
-            "\t  6. Compressed & Extendible  (has to be chunked)\n\n");
-    (void) HDfprintf(stdout,
-            "\t  If the user wants to store raw data in a non-HDF file then \n");
-    (void) HDfprintf(stdout,
-            "\t  the external storage file option is to be used and the name \n");
-    (void) HDfprintf(stdout, "\t  of the file is to be specified. \n\n");
-    (void) HDfprintf(stdout,
-            "\t  If the user wants the dimensions of the data-set to be\n");
-    (void) HDfprintf(stdout,
-            "\t  unlimited, the extendible data set option can be chosen. \n\n");
-    (void) HDfprintf(stdout,
-            "\t  The user may also specify the type of compression and the \n");
-    (void) HDfprintf(stdout,
-            "\t  level to which the data set must be compresses by setting \n");
-    (void) HDfprintf(stdout, "\t  the compressed option.\n\n");
-    (void) HDfprintf(stdout, "\t   SYNOPSIS:\n");
-    (void) HDfprintf(stdout, "\t  h5import -h[elp], OR\n");
-    (void) HDfprintf( stdout,
-            "\t  h5import <infile> -c[onfig] <configfile> \
-                    [<infile> -c[config] <confile2>...] -o[utfile] <outfile>\n\n");
-    (void) HDfprintf(stdout, "\t   -h[elp]:\n");
-    (void) HDfprintf(stdout,
-            "\t           Prints this summary of usage, and exits.\n\n");
-    (void) HDfprintf(stdout, "\t   <infile(s)>:\n");
-    (void) HDfprintf(stdout,
-            "\t           Name of the Input file(s), containing a \n");
-    (void) HDfprintf(stdout,
-            "\t    single n-dimensional floating point or integer array \n");
-    (void) HDfprintf(stdout,
-            "\t    in either ASCII text, native floating point(32-bit \n");
-    (void) HDfprintf(stdout,
-            "\t    or 64-bit) or native integer(8-bit or 16-bit or \n");
-    (void) HDfprintf(stdout,
-            "\t    32-bit or 64-bit). Data to be specified in the order\n");
-    (void) HDfprintf(stdout, "\t    of fastest changing dimensions first.\n\n");
-    (void) HDfprintf(stdout, "\t  -c[config] <configfile>:\n");
-    (void) HDfprintf(stdout,
-            "\t    Every input file should be associated with a \n");
-    (void) HDfprintf(stdout,
-            "\t    configuration file and this is done by the -c option.\n");
-    (void) HDfprintf(stdout,
-            "\t    <configfile> is the name of the configuration file.\n");
-    (void) HDfprintf(stdout, "\t    (See Section \"CONFIGURATION FILE\")\n\n");
-    (void) HDfprintf(stdout, "\t   -o[utfile] <outfile>:\n");
-    (void) HDfprintf(stdout,
-            "\t           Name of the HDF5 output file. Data from one or more \n");
-    (void) HDfprintf(stdout,
-            "\t    input files are stored as one or more data sets in \n");
-    (void) HDfprintf(stdout,
-            "\t    <outfile>. The output file may be an existing file or \n");
-    (void) HDfprintf(stdout,
-            "\t    it maybe new in which case it will be created.\n\n\n");
-    (void) HDfprintf(stdout, "\t   CONFIGURATION FILE:\n");
-    (void) HDfprintf(stdout,
-            "\t  The configuration file is an ASCII text file and must be \n");
-    (void) HDfprintf(stdout,
-            "\t  the ddl formatted file (without data values) produced by h5dump \n");
-    (void) HDfprintf(stdout,
-            "\t  when used with the options '-o outfilename -b' of a single dataset (-d) \n");
-    (void) HDfprintf(stdout,
-            "\t  OR organized as \"CONFIG-KEYWORD VALUE\" pairs, one pair on each \n");
-    (void) HDfprintf(stdout, "\t  line.\n\n");
-    (void) HDfprintf(stdout,
-            "\t   The configuration file may have the following keywords each \n");
-    (void) HDfprintf(stdout, "\t   followed by an acceptable value.\n\n");
-    (void) HDfprintf(stdout, "\t  Required KEYWORDS:\n");
-    (void) HDfprintf(stdout, "\t    PATH\n");
-    (void) HDfprintf(stdout, "\t    INPUT-CLASS\n");
-    (void) HDfprintf(stdout, "\t    INPUT-SIZE\n");
-    (void) HDfprintf(stdout, "\t    RANK\n");
-    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE\n\n");
-    (void) HDfprintf(stdout, "\t  Optional KEYWORDS:\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER\n");
-    (void) HDfprintf(stdout, "\t    CHUNKED-DIMENSION-SIZES\n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE\n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM\n");
-    (void) HDfprintf(stdout, "\t    EXTERNAL-STORAGE\n");
-    (void) HDfprintf(stdout, "\t    MAXIMUM-DIMENSIONS\n\n\n");
-    (void) HDfprintf(stdout, "\t    Values for keywords:\n");
-    (void) HDfprintf(stdout, "\t    PATH:\n");
-    (void) HDfprintf(stdout, "\t      Strings separated by spaces to represent\n");
-    (void) HDfprintf(stdout, "\t      the path of the data-set. If the groups in\n");
-    (void) HDfprintf(stdout,
-            "\t      the path do not exist, they will be created. \n");
-    (void) HDfprintf(stdout, "\t      For example,\n");
-    (void) HDfprintf(stdout, "\t        PATH grp1/grp2/dataset1\n");
-    (void) HDfprintf(stdout, "\t        PATH: keyword\n");
-    (void) HDfprintf(stdout, "\t        grp1: group under the root. If\n");
-    (void) HDfprintf(stdout, "\t              non-existent will be created.\n");
-    (void) HDfprintf(stdout, "\t        grp2: group under grp1. If \n");
-    (void) HDfprintf(stdout, "\t              non-existent will be created \n");
-    (void) HDfprintf(stdout, "\t              under grp1.\n");
-    (void) HDfprintf(stdout, "\t        dataset1: the name of the data-set \n");
-    (void) HDfprintf(stdout, "\t            to be created.\n\n");
-    (void) HDfprintf(stdout, "\t               INPUT-CLASS:\n");
-    (void) HDfprintf(stdout, "\t      String denoting the type of input data.\n");
-    (void) HDfprintf(stdout, "\t      (\"TEXTIN\", \"TEXTFP\", \"FP\", \"IN\", \n");
-    (void) HDfprintf(stdout, "\t      \"STR\", \"TEXTUIN\", \"UIN\"). \n");
-    (void) HDfprintf(stdout,
-            "\t      INPUT-CLASS \"TEXTIN\" denotes an ASCII text \n");
-    (void) HDfprintf(stdout,
-            "\t      file with signed integer data in ASCII form,\n");
-    (void) HDfprintf(stdout,
-            "\t      INPUT-CLASS \"TEXTUIN\" denotes an ASCII text \n");
-    (void) HDfprintf(stdout,
-            "\t      file with unsigned integer data in ASCII form,\n");
-    (void) HDfprintf(stdout,
-            "\t      \"TEXTFP\" denotes an ASCII text file containing\n");
-    (void) HDfprintf(stdout, "\t      floating point data in the fixed notation\n");
-    (void) HDfprintf(stdout, "\t      (325.34),\n");
-    (void) HDfprintf(stdout,
-            "\t      \"FP\" denotes a floating point binary file,\n");
-    (void) HDfprintf(stdout,
-            "\t      \"IN\" denotes a signed integer binary file,\n");
-    (void) HDfprintf(stdout,
-            "\t      \"UIN\" denotes an unsigned integer binary file,\n");
-    (void) HDfprintf(stdout, "\t       & \"STR\" denotes an ASCII text file the \n");
-    (void) HDfprintf(stdout,
-            "\t      contents of which should be stored as an 1-D \n");
-    (void) HDfprintf(stdout, "\t      array of strings.\n");
-    (void) HDfprintf(stdout, "\t      If INPUT-CLASS is \"STR\", then RANK, \n");
-    (void) HDfprintf(stdout,
-            "\t      DIMENSION-SIZES, OUTPUT-CLASS, OUTPUT-SIZE, \n");
-    (void) HDfprintf(stdout, "\t      OUTPUT-ARCHITECTURE and OUTPUT-BYTE-ORDER \n");
-    (void) HDfprintf(stdout, "\t      will be ignored.\n\n\n");
-    (void) HDfprintf(stdout, "\t    INPUT-SIZE:\n");
-    (void) HDfprintf(stdout,
-            "\t      Integer denoting the size of the input data \n");
-    (void) HDfprintf(stdout, "\t      (8, 16, 32, 64). \n\n");
-    (void) HDfprintf(stdout, "\t      For floating point,\n");
-    (void) HDfprintf(stdout, "\t      INPUT-SIZE can be 32 or 64.\n");
-    (void) HDfprintf(stdout, "\t      For integers (signed and unsigned)\n");
-    (void) HDfprintf(stdout, "\t      INPUT-SIZE can be 8, 16, 32 or 64.\n\n");
-    (void) HDfprintf(stdout, "\t    RANK:\n");
-    (void) HDfprintf(stdout,
-            "\t      Integer denoting the number of dimensions.\n\n");
-    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES:\n");
-    (void) HDfprintf(stdout,
-            "\t            Integers separated by spaces to denote the \n");
-    (void) HDfprintf(stdout, "\t      dimension sizes for the no. of dimensions \n");
-    (void) HDfprintf(stdout, "\t      determined by rank.\n\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS:\n");
-    (void) HDfprintf(stdout,
-            "\t      String dentoting data type of the dataset to \n");
-    (void) HDfprintf(stdout, "\t      be written (\"IN\",\"FP\", \"UIN\")\n\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE:\n");
-    (void) HDfprintf(stdout,
-            "\t      Integer denoting the size of the data in the \n");
-    (void) HDfprintf(stdout, "\t      output dataset to be written.\n");
-    (void) HDfprintf(stdout,
-            "\t      If OUTPUT-CLASS is \"FP\", OUTPUT-SIZE can be \n");
-    (void) HDfprintf(stdout, "\t      32 or 64.\n");
-    (void) HDfprintf(stdout,
-            "\t      If OUTPUT-CLASS is \"IN\" or \"UIN\", OUTPUT-SIZE\n");
-    (void) HDfprintf(stdout, "\t      can be 8, 16, 32 or 64.\n\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE:\n");
-    (void) HDfprintf(stdout, "\t      STRING denoting the type of output \n");
-    (void) HDfprintf(stdout,
-            "\t      architecture. Can accept the following values\n");
-    (void) HDfprintf(stdout, "\t      STD\n");
-    (void) HDfprintf(stdout, "\t      IEEE\n");
-    (void) HDfprintf(stdout, "\t      INTEL\n");
-    (void) HDfprintf(stdout, "\t      CRAY\n");
-    (void) HDfprintf(stdout, "\t      MIPS\n");
-    (void) HDfprintf(stdout, "\t      ALPHA\n");
-    (void) HDfprintf(stdout, "\t      NATIVE (default)\n");
-    (void) HDfprintf(stdout, "\t      UNIX\n\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER:\n");
-    (void) HDfprintf(stdout,
-            "\t      String denoting the output-byte-order. Ignored\n");
-    (void) HDfprintf(stdout,
-            "\t      if the OUTPUT-ARCHITECTURE is not specified or\n");
-    (void) HDfprintf(stdout, "\t      if it is IEEE, UNIX or STD. Can accept the \n");
-    (void) HDfprintf(stdout, "\t      following values.\n");
-    (void) HDfprintf(stdout, "\t      BE (default)\n");
-    (void) HDfprintf(stdout, "\t      LE\n\n");
-    (void) HDfprintf(stdout, "\t    CHUNKED-DIMENSION-SIZES:\n");
-    (void) HDfprintf(stdout, "\t      Integers separated by spaces to denote the \n");
-    (void) HDfprintf(stdout,
-            "\t      dimension sizes of the chunk for the no. of \n");
-    (void) HDfprintf(stdout,
-            "\t      dimensions determined by rank. Required field\n");
-    (void) HDfprintf(stdout,
-            "\t      to denote that the dataset will be stored with\n");
-    (void) HDfprintf(stdout,
-            "\t      chunked storage. If this field is absent the\n");
-    (void) HDfprintf(stdout,
-            "\t      dataset will be stored with contiguous storage.\n\n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE:\n");
-    (void) HDfprintf(stdout,
-            "\t      String denoting the type of compression to be\n");
-    (void) HDfprintf(stdout, "\t      used with the chunked storage. Requires the\n");
-    (void) HDfprintf(stdout,
-            "\t      CHUNKED-DIMENSION-SIZES to be specified. The only \n");
-    (void) HDfprintf(stdout,
-            "\t      currently supported compression method is GZIP. \n");
-    (void) HDfprintf(stdout, "\t      Will accept the following value\n");
-    (void) HDfprintf(stdout, "\t      GZIP\n\n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM:\n");
-    (void) HDfprintf(stdout,
-            "\t      Integer used to denote compression level and \n");
-    (void) HDfprintf(stdout, "\t      this option is to be always specified when \n");
-    (void) HDfprintf(stdout,
-            "\t      the COMPRESSION-TYPE option is specified. The\n");
-    (void) HDfprintf(stdout, "\t      values are applicable only to GZIP \n");
-    (void) HDfprintf(stdout, "\t      compression.\n");
-    (void) HDfprintf(stdout, "\t      Value 1-9: The level of Compression. \n");
-    (void) HDfprintf(stdout, "\t        1 will result in the fastest \n");
-    (void) HDfprintf(stdout, "\t        compression while 9 will result in \n");
-    (void) HDfprintf(stdout, "\t        the best compression ratio. The default\n");
-    (void) HDfprintf(stdout, "\t        level of compression is 6.\n\n");
-    (void) HDfprintf(stdout, "\t    EXTERNAL-STORAGE:\n");
-    (void) HDfprintf(stdout,
-            "\t      String to denote the name of the non-HDF5 file \n");
-    (void) HDfprintf(stdout,
-            "\t      to store data to. Cannot be used if CHUNKED-\n");
-    (void) HDfprintf(stdout,
-            "\t      DIMENSIONS or COMPRESSION-TYPE or EXTENDIBLE-\n");
-    (void) HDfprintf(stdout, "\t      DATASET is specified.\n");
-    (void) HDfprintf(stdout, "\t      Value <external-filename>: the name of the \n");
-    (void) HDfprintf(stdout, "\t      external file as a string to be used.\n\n");
-    (void) HDfprintf(stdout, "\t    MAXIMUM-DIMENSIONS:\n");
-    (void) HDfprintf(stdout, "\t      Integers separated by spaces to denote the \n");
-    (void) HDfprintf(stdout, "\t      maximum dimension sizes of all the \n");
-    (void) HDfprintf(stdout, "\t      dimensions determined by rank. Requires the\n");
-    (void) HDfprintf(stdout,
-            "\t      CHUNKED-DIMENSION-SIZES to be specified. A value of \n");
-    (void) HDfprintf(stdout, "\t      -1 for any dimension implies UNLIMITED \n");
-    (void) HDfprintf(stdout,
-            "\t      DIMENSION size for that particular dimension.\n\n");
-    (void) HDfprintf(stdout, "\t   EXAMPLES:\n");
-    (void) HDfprintf(stdout, "\t  1. Configuration File may look like:\n\n");
-    (void) HDfprintf(stdout, "\t    PATH work h5 pkamat First-set\n");
-    (void) HDfprintf(stdout, "\t    INPUT-CLASS TEXTFP\n");
-    (void) HDfprintf(stdout, "\t    RANK 3\n");
-    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES 5 2 4\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS FP\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE 64\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE IEEE\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER LE\n");
-    (void) HDfprintf(stdout, "\t      CHUNKED-DIMENSION-SIZES 2 2 2 \n\n");
-    (void) HDfprintf(stdout,
-            "\t  The above configuration will accept a floating point array \n");
-    (void) HDfprintf(stdout,
-            "\t  (5 x 2 x 4)  in an ASCII file with the rank and dimension sizes \n");
-    (void) HDfprintf(stdout,
-            "\t  specified and will save it in a chunked data-set (of pattern \n");
-    (void) HDfprintf(stdout,
-            "\t  2 X 2 X 2) of 64-bit floating point in the little-endian order \n");
-    (void) HDfprintf(stdout,
-            "\t  and IEEE architecture. The dataset will be stored at\n");
-    (void) HDfprintf(stdout, "\t  \"/work/h5/pkamat/First-set\"\n\n");
-    (void) HDfprintf(stdout, "\t  2. Another configuration could be:\n\n");
-    (void) HDfprintf(stdout, "\t    PATH Second-set\n");
-    (void) HDfprintf(stdout, "\t    INPUT-CLASS IN  \n");
-    (void) HDfprintf(stdout, "\t    RANK 5\n");
-    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES 6 3 5 2 4\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS IN\n");
-    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE 32\n");
-    (void) HDfprintf(stdout, "\t      CHUNKED-DIMENSION-SIZES 2 2 2 2 2\n");
-    (void) HDfprintf(stdout, "\t    EXTENDIBLE-DATASET 1 3 \n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE GZIP\n");
-    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM 7\n\n\n");
-    (void) HDfprintf(stdout,
-            "\t  The above configuration will accept an integer array \n");
-    (void) HDfprintf(stdout,
-            "\t  (6 X 3 X 5 x 2 x 4)  in a binary file with the rank and \n");
-    (void) HDfprintf(stdout,
-            "\t  dimension sizes specified and will save it in a chunked data-set\n");
-    (void) HDfprintf(stdout,
-            "\t  (of pattern 2 X 2 X 2 X 2 X 2) of 32-bit floating point in \n");
-    (void) HDfprintf(stdout,
-            "\t  native format (as output-architecture is not specified). The \n");
-    (void) HDfprintf(stdout,
-            "\t  first and the third dimension will be defined as unlimited. The \n");
-    (void) HDfprintf(stdout,
-            "\t  data-set will be compressed using GZIP and a compression level \n");
-    (void) HDfprintf(stdout, "\t  of 7.\n");
-    (void) HDfprintf(stdout,
-            "\t  The dataset will be stored at \"/Second-set\"\n\n");
-    return;
-}
-
-void usage(char *name)
-{
-    (void) HDfprintf(stdout, "\nUsage:\t%s -h[elp], OR\n", name);
-    (void) HDfprintf(stdout,
-            "\t%s <infile> -c[onfig] <configfile> \
-  [<infile> -c[config] <configfile>...] -o[utfile] <outfile> \n\n", name);
-    return;
-}
-
diff --git a/tools/h5import/h5import.h b/tools/h5import/h5import.h
deleted file mode 100644
index c242483..0000000
--- a/tools/h5import/h5import.h
+++ /dev/null
@@ -1,198 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- *
- * Data and structure definitions for h5import
- *
- */
-
-#ifndef H5IMPORT_H__
-#define H5IMPORT_H__
-
-/*
- * state table tokens
- */
-#define FILNAME 0
-/* filename */
-#define OPT_o   1
-/* output filename */
-#define OPT_c   2   /* configuration filename */
-#define OPT_h   3   /* request for explanation */
-#define OPT_d   4   /* dimensions */
-#define OPT_p   5   /* pathname */
-#define OPT_t   6   /* data type */
-#define OPT_s   7   /* data size */
-#define ERR    20  /* invalid token */
-
-#define MAX_GROUPS_IN_PATH  20
-#define MAX_PATH_NAME_LENGTH 255
-#define NUM_KEYS 14
-#define MIN_NUM_DIMENSION  1
-#define MAX_NUM_DIMENSION  32
-#define BASE_10 10
-
-#define PATH             0
-#define INPUT_CLASS      1
-#define INPUT_SIZE       2
-#define RANK             3
-#define DIM              4
-#define OUTPUT_CLASS     5
-#define OUTPUT_SIZE      6
-#define OUTPUT_ARCH      7
-#define OUTPUT_B_ORDER   8
-#define CHUNK            9
-#define COMPRESS         10
-#define COMPRESS_PARAM   11
-#define EXTERNALSTORE    12
-#define EXTEND           13
-
-/* data types */
-#define H5DT_INT8      signed char
-#define H5DT_INT16     short
-#define H5DT_INT32     int
-#define H5DT_FLOAT32   float
-#define H5DT_FLOAT64   double
-#define VOIDP          void*
-#define H5DT_UINT8     unsigned char
-#define H5DT_UINT16    unsigned short
-#define H5DT_UINT32    unsigned int
-#define H5DT_INT64     long long
-#define H5DT_UINT64    unsigned H5DT_INT64
-
-struct path_info
-{
-    char group[MAX_GROUPS_IN_PATH][MAX_PATH_NAME_LENGTH];
-    int count;
-};
-
-struct Input
-{
-    int h5dumpInput;
-    struct path_info path;
-    int inputClass;
-    int inputSize;
-    int rank;
-    hsize_t* sizeOfDimension;
-    int outputClass;
-    int outputSize;
-    int outputArchitecture;
-    int outputByteOrder;
-    hsize_t* sizeOfChunk;
-    hsize_t* maxsizeOfDimension;
-    int compressionType;
-    int compressionParam;
-    char *externFilename;
-    VOIDP data;
-    int configOptionVector[NUM_KEYS];
-};
-
-struct infilesformat
-{
-    char datafile[255];
-    char configfile[255];
-    struct Input in;
-    int config; /* Configfile present? No - 0. Yes - 1 */
-};
-
-struct Options
-{
-    struct infilesformat  infiles[30];  /* structure to hold the list of input file names. Limited to 30*/
-    char   outfile[256];  /* output file name */
-    int    fcount;       /* number of input files */
-};
-
-char keytable[NUM_KEYS][30] = {
-        "PATH",
-        "INPUT-CLASS",
-        "INPUT-SIZE",
-        "RANK",
-        "DIMENSION-SIZES",
-        "OUTPUT-CLASS",
-        "OUTPUT-SIZE",
-        "OUTPUT-ARCHITECTURE",
-        "OUTPUT-BYTE-ORDER",
-        "CHUNKED-DIMENSION-SIZES",
-        "COMPRESSION-TYPE",
-        "COMPRESSION-PARAM",
-        "EXTERNAL-STORAGE",
-        "MAXIMUM-DIMENSIONS"
-};
-
-static int  state_table[15][8] =
-{
-    /* token ordering: FILNAME      OPT_o   OPT_c  OPT_h  OPT_d  OPT_p  OPT_t  OPT_s   */
-
-    /* state 0: start */
-    {1, ERR, ERR, 6, ERR, ERR, ERR, ERR},
-
-    /* state 1: input files */
-    {ERR, ERR, 2, ERR, 7, ERR, ERR, ERR},
-
-    /* state 2: -c[onfigfile] */
-    {3, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 3: configfile */
-    {1, 4, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 4: -o[utfile] */
-    {5, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 5: outfile */
-    {ERR, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 6: -h[elp] */
-    {ERR, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 7: -d[ims] */
-    {8, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 8: dimensions */
-    {1, 4, ERR, ERR, ERR, 9, 11, 13},
-
-    /* state 9: -p[ath] */
-    {10, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 10: path name */
-    {1, 4, ERR, ERR, ERR, ERR, 11, 13},
-
-    /* state 11: -t[ype] */
-    {12, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 12: data type */
-    {1, 4, ERR, ERR, ERR, ERR, ERR, 13},
-
-    /* state 13: -s[ize] */
-    {14, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
-
-    /* state 14: data size */
-    {1, 4, ERR, ERR, ERR, ERR, ERR, ERR}
-
-};
-
-/*
- *
- *  Function declarations for h5import
- *
- */
-void  usage(char *);
-void  setDefaultValues(struct Input *in, int count);
-void  help(char *);
-
-hid_t       createOutputDataType(struct Input *in);
-hid_t       createInputDataType(struct Input *in);
-
-#endif  /* H5IMPORT_H__ */
-
diff --git a/tools/h5import/h5importtest.c b/tools/h5import/h5importtest.c
deleted file mode 100644
index ac839fb..0000000
--- a/tools/h5import/h5importtest.c
+++ /dev/null
@@ -1,371 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdio.h>
-#include "H5private.h"
-
-#ifdef H5_HAVE_WIN32_API
-#define OPEN_FLAGS "wb"
-#else
-#define OPEN_FLAGS "w"
-#endif
-
-/*
- * Name:
- *      h5importtest
- *
- * Description:
- *      This program creates that can be
- *      used to test the h5import program.
- *
- */
-
-int
-main(void)
-{
-    int       nrow = 3, ncol = 4, npln = 5;
-    int       i, j, k;
-    FILE      *sp;
-
-    float     row4[3], col4[4], pln4[5];
-    float     rowo4 = 11.0F, colo4 = 21.0F, plno4 = 51.0F;
-    float     rowi4 = 1.0F, coli4 = 2.0F, plni4 = 5.0F;
-
-    int       b32i3[5][3][4];
-    int       row4i[3], col4i[4], pln4i[5];
-    int       rowo4i = 11 , colo4i = 21 , plno4i = 51 ;
-    int       rowi4i = 1 , coli4i = 2 , plni4i = 5 ;
-
-#ifdef H5_SIZEOF_LONG_LONG
-    long long row4i64[3], col4i64[4], pln4i64[5];
-    long long rowo4i64 = (long long)11 , colo4i64 = (long long)21 , plno4i64 = (long long)51 ;
-    long long rowi4i64 = (long long)1 , coli4i64 = (long long)2 , plni4i64 = (long long)5 ;
-#endif
-
-    short     b16i3[5][3][4];
-    short     row4i16[3], col4i16[4], pln4i16[5];
-    short     rowo4i16 = (short)11 , colo4i16 = (short)21 , plno4i16 = (short)51 ;
-    short     rowi4i16 = (short)1 , coli4i16 = (short)2 , plni4i16 = (short)5 ;
-
-    char      b8i3[5][3][4];
-    char      row4i8[3], col4i8[4], pln4i8[5];
-    char      rowo4i8 = (char)11 , colo4i8 = (char)21 , plno4i8 = (char)51 ;
-    char      rowi4i8 = (char)1 , coli4i8 = (char)2 , plni4i8 = (char)5 ;
-
-    double    b64r3[5][3][4];
-    double    row8[3], col8[4], pln8[5];
-    double    rowo8 = 11.0F, colo8 = 21.0F, plno8 = 51.0F;
-    double    rowi8 = 1.0F, coli8 = 2.0F, plni8 = 5.0F;
-
-
-    /*
-    * initialize the row, column, and plane vectors
-    *
-    * row values start at 11 and increment by 1 => 11, 12, 13
-    * column values start at 21 and increment by 2 => 21, 23, 25, 27
-    * plane values start at 51 and increment by 5 => 51, 56, 61, 66, 71
-    */
-
-
-    /*
-    * build array elements - rank 2
-    *
-    * element value = sum of row value and col values
-    */
-
-    row4[0] = rowo4;
-    col4[0] = colo4;
-    pln4[0] = plno4;
-
-    row8[0] = rowo8;
-    col8[0] = colo8;
-    pln8[0] = plno8;
-
-    row4i[0] = rowo4i;
-    col4i[0] = colo4i;
-    pln4i[0] = plno4i;
-
-#ifdef H5_SIZEOF_LONG_LONG
-    row4i64[0] = rowo4i64;
-    col4i64[0] = colo4i64;
-    pln4i64[0] = plno4i64;
-#endif
-
-    row4i16[0] = rowo4i16;
-    col4i16[0] = colo4i16;
-    pln4i16[0] = plno4i16;
-
-    row4i8[0] = rowo4i8;
-    col4i8[0] = colo4i8;
-    pln4i8[0] = plno4i8;
-
-    for (i = 1; i < nrow; i++)
-    {
-        row4[i] = row4[i - 1] + rowi4;
-        row8[i] = row8[i - 1] + rowi8;
-        row4i[i] = row4i[i - 1] + rowi4i;
-#ifdef H5_SIZEOF_LONG_LONG
-        row4i64[i] = row4i64[i - 1] + rowi4i64;
-#endif
-        row4i16[i] = row4i16[i - 1] + rowi4i16;
-        row4i8[i] = row4i8[i - 1] + rowi4i8;
-    }
-
-    for (j = 1; j < ncol; j++)
-    {
-        col4[j] = col4[j - 1] + coli4;
-        col8[j] = col8[j - 1] + coli8;
-        col4i[j] = col4i[j - 1] + coli4i;
-#ifdef H5_SIZEOF_LONG_LONG
-        col4i64[j] = col4i64[j - 1] + coli4i64;
-#endif
-        col4i16[j] = col4i16[j - 1] + coli4i16;
-        col4i8[j] = col4i8[j - 1] + coli4i8;
-    }
-    for (k = 1; k < npln; k++)
-    {
-        pln4[k] = pln4[k - 1] + plni4;
-        pln8[k] = pln8[k - 1] + plni8;
-        pln4i[k] = pln4i[k - 1] + plni4i;
-#ifdef H5_SIZEOF_LONG_LONG
-        pln4i64[k] = pln4i64[k - 1] + plni4i64;
-#endif
-        pln4i16[k] = pln4i16[k - 1] + plni4i16;
-        pln4i8[k] = pln4i8[k - 1] + plni4i8;
-    }
-
-    /*
-    * build array elements - rank 3
-    *
-    * element value = sum of row value, col, and plane values
-    */
-
-    for (i = 0; i < nrow; i++)
-        for (j = 0; j < ncol; j++)
-            for (k = 0; k < npln; k++) {
-                b64r3[k][i][j] = row8[i] + col8[j] + pln8[k];
-                b32i3[k][i][j] = row4i[i] + col4i[j] + pln4i[k];
-                b16i3[k][i][j] = row4i16[i] + col4i16[j] + pln4i16[k];
-                b8i3[k][i][j] = row4i8[i] + col4i8[j] + pln4i8[k];
-            }
-
-
-
-#ifndef UNICOS
-
-#ifdef REBUILDTEXTFILES
- /*-------------------------------------------------------------------------
-  * TOOLTEST txtin8.txt -c $srcdir/testfiles/txtin8.conf -o txtin8.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("txtin8.txt", "w");
-    for (k = 0; k < npln; k++)
-    {
-       for (i = 0; i < nrow; i++)
-       {
-           for (j = 0; j < ncol; j++)
-               (void) fprintf(sp, "%10u", b8i3[k][i][j]);
-           (void) fprintf(sp, "\n");
-       }
-    }
-    (void) HDfclose(sp);
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST txtin16.txt -c $srcdir/testfiles/txtin16.conf -o txtin16.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("txtin16.txt", "w");
-    for (k = 0; k < npln; k++)
-    {
-      for (i = 0; i < nrow; i++)
-      {
-          for (j = 0; j < ncol; j++)
-              (void) fprintf(sp, "%10u", b16i3[k][i][j]);
-          (void) fprintf(sp, "\n");
-      }
-    }
-    (void) HDfclose(sp);
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST txtin32.txt -c $srcdir/testfiles/textin32.conf -o textin32.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("txtin32.txt", "w");
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-                (void) fprintf(sp, "%10d", b32i3[k][i][j]);
-            (void) fprintf(sp, "\n");
-        }
-    }
-    (void) HDfclose(sp);
-#endif
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binin32.bin -c $srcdir/testfiles/binin32.conf -o binin32.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("binin32.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b32i3[k][i][j], sizeof(int), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binuin32.bin -c $srcdir/testfiles/binuin32.conf -o binuin32.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("binuin32.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b32i3[k][i][j], sizeof(unsigned int), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
-
-
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binin16.bin -c $srcdir/testfiles/binin16.conf -o binin16.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("binin16.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b16i3[k][i][j], sizeof(short), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binuin16.bin -c $srcdir/testfiles/binuin16.conf -o binuin16.h5
-  *-------------------------------------------------------------------------
-  */
-    sp = HDfopen("binuin16.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b16i3[k][i][j], sizeof(unsigned short), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
-
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binin8.bin -c $srcdir/testfiles/binin8.conf  -o binin8.h5
-  *-------------------------------------------------------------------------
-  */
-
-    sp = HDfopen("binin8.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b8i3[k][i][j], sizeof(char), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
-#endif /* UNICOS */
-
-
-
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binfp64.bin -c $srcdir/testfiles/binfp64.conf -o binfp64.h5
-  *-------------------------------------------------------------------------
-  */
-
- /*
-  * binary 64-bit file - rank 2 & 3
-  */
-
-    sp = HDfopen("binfp64.bin", OPEN_FLAGS);
-    for (k = 0; k < npln; k++)
-    {
-        for (i = 0; i < nrow; i++)
-        {
-            for (j = 0; j < ncol; j++)
-            {
-                (void) HDfwrite((char *) &b64r3[k][i][j], sizeof(double), 1, sp);
-            }
-        }
-    }
-    (void) HDfclose(sp);
-
-
-
- /*-------------------------------------------------------------------------
-  * TOOLTEST binin8w.bin -c $srcdir/testfiles/binin8w.conf -o binin8w.h5
-  *-------------------------------------------------------------------------
-  */
-
-    {
-        /* test CR+LF (13,10) and EOF (26) in windows */
-        char bin8w[4] = {13,10,26,0};
-
-        sp = HDfopen("binin8w.bin", OPEN_FLAGS);
-        for (i = 0; i < 4; i++)
-        {
-            char c = bin8w[i];
-            if ( HDfwrite( &c, sizeof(char), 1, sp) != 1 )
-                printf("error writing file\n");
-        }
-        HDfclose(sp);
-
-
-    }
-
-
-
-
-
-    return (EXIT_SUCCESS);
-}
-
diff --git a/tools/h5import/h5importtestutil.sh.in b/tools/h5import/h5importtestutil.sh.in
deleted file mode 100644
index f2694a0..0000000
--- a/tools/h5import/h5importtestutil.sh.in
+++ /dev/null
@@ -1,384 +0,0 @@
-#!/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  h5import tool
-
-srcdir=@srcdir@
-
-# Determine which filters are available
-USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
-
-TESTNAME=h5import
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-DUMPER=../h5dump/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     # The h5import tool name
-H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
-
-RM='rm -rf'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-# initialize errors variable
-nerrors=0
-
-# 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"
-
-TESTDIR=./testfiles
-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_H5IMPORT_TESTFILES/binfp64.h5
-$SRC_H5IMPORT_TESTFILES/binin8.h5
-$SRC_H5IMPORT_TESTFILES/binin8w.h5
-$SRC_H5IMPORT_TESTFILES/binin16.h5
-$SRC_H5IMPORT_TESTFILES/binin32.h5
-$SRC_H5IMPORT_TESTFILES/binuin16.h5
-$SRC_H5IMPORT_TESTFILES/binuin32.h5
-$SRC_H5IMPORT_TESTFILES/txtfp32.h5
-$SRC_H5IMPORT_TESTFILES/txtfp64.h5
-$SRC_H5IMPORT_TESTFILES/txtin8.h5
-$SRC_H5IMPORT_TESTFILES/txtin16.h5
-$SRC_H5IMPORT_TESTFILES/txtin32.h5
-$SRC_H5IMPORT_TESTFILES/txtuin16.h5
-$SRC_H5IMPORT_TESTFILES/txtuin32.h5
-$SRC_H5IMPORT_TESTFILES/txtstr.h5
-$SRC_H5IMPORT_TESTFILES/textpfe.h5
-"
-
-LIST_OTHER_TEST_FILES="
-$SRC_H5IMPORT_TESTFILES/binfp64.conf
-$SRC_H5IMPORT_TESTFILES/binin8.conf
-$SRC_H5IMPORT_TESTFILES/binin8w.conf
-$SRC_H5IMPORT_TESTFILES/binin16.conf
-$SRC_H5IMPORT_TESTFILES/binin32.conf
-$SRC_H5IMPORT_TESTFILES/binuin16.conf
-$SRC_H5IMPORT_TESTFILES/binuin32.conf
-$SRC_H5IMPORT_TESTFILES/txtfp32.conf
-$SRC_H5IMPORT_TESTFILES/txtfp64.conf
-$SRC_H5IMPORT_TESTFILES/txtin8.conf
-$SRC_H5IMPORT_TESTFILES/txtin16.conf
-$SRC_H5IMPORT_TESTFILES/txtin32.conf
-$SRC_H5IMPORT_TESTFILES/txtuin16.conf
-$SRC_H5IMPORT_TESTFILES/txtuin32.conf
-$SRC_H5IMPORT_TESTFILES/textpfe.conf
-$SRC_H5IMPORT_TESTFILES/txtstr.conf
-$SRC_H5IMPORT_TESTFILES/txtfp32.txt
-$SRC_H5IMPORT_TESTFILES/txtfp64.txt
-$SRC_H5IMPORT_TESTFILES/txtuin16.txt
-$SRC_H5IMPORT_TESTFILES/txtuin32.txt
-$SRC_H5IMPORT_TESTFILES/txtin8.txt
-$SRC_H5IMPORT_TESTFILES/txtin16.txt
-$SRC_H5IMPORT_TESTFILES/txtin32.txt
-$SRC_H5IMPORT_TESTFILES/textpfe64.txt
-$SRC_H5IMPORT_TESTFILES/txtstr.txt
-$SRC_H5IMPORT_TESTFILES/dbinfp64.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinin8.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinin8w.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinin16.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinin32.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinuin16.h5.txt
-$SRC_H5IMPORT_TESTFILES/dbinuin32.h5.txt
-$SRC_H5IMPORT_TESTFILES/dtxtstr.h5.txt
-"
-
-#
-# 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'
-}
-
-# Print a "SKIP" message
-SKIP() {
-   TESTING $TESTNAME $@
-    echo  " -SKIP-"
-}
-
-TOOLTEST()
-{
-err=0
-$RUNSERIAL $H5IMPORT_BIN $*
-$RUNSERIAL $DUMPER_BIN $5 >log2
-
-cd tmp_testfiles
-$RUNSERIAL $DUMPER_BIN $5 >log1
-cd ..
-
-cmp -s tmp_testfiles/log1 log2 || err=1
-rm -f log2 tmp_testfiles/log1
-if [ $err -eq 1 ]; then
-nerrors="` expr $nerrors + 1 `";
-  echo "*FAILED*"
-else
-  echo " PASSED"
-fi
-}
-
-# Use h5dump output as input to h5import for binary numbers
-# Use h5diff to verify results
-TOOLTEST2()
-{
-err=0
-$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -b tmp_testfiles/$2 > d$2.dmp
-$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
-$RUNSERIAL $H5DIFF_BIN -v d$2 tmp_testfiles/$2 $1 $1 > log2
-$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
-
-cmp -s log1 log2 || err=1
-rm -f log1 log2
-if [ $err -eq 1 ]; then
-nerrors="` expr $nerrors + 1 `";
-  echo "*FAILED*"
-else
-  echo " PASSED"
-fi
-}
-
-# Same as TOOLTEST2 except for strings
-# Use h5dump output as input to h5import for strings
-# Use h5diff to verify results
-TOOLTEST3()
-{
-err=0
-$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -y --width=1 tmp_testfiles/$2 > d$2.dmp
-$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
-$RUNSERIAL $H5DIFF_BIN -v d$2 tmp_testfiles/$2 $1 $1 > log2
-$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
-
-cmp -s log1 log2 || err=1
-rm -f log1 log2
-if [ $err -eq 1 ]; then
-nerrors="` expr $nerrors + 1 `";
-  echo "*FAILED*"
-else
-  echo " PASSED"
-fi
-}
-
-# Same as TOOLTEST3 except for h5diff uses report mode without warnings
-# Use h5dump output as input to h5import for strings
-# Use h5diff to verify results
-TOOLTEST4()
-{
-err=0
-$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -y --width=1 tmp_testfiles/$2 > d$2.dmp
-$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
-$RUNSERIAL $H5DIFF_BIN -r d$2 tmp_testfiles/$2 $1 $1 > log2
-$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
-
-
-cmp -s log1 log2 || err=1
-rm -f log1 log2
-if [ $err -eq 1 ]; then
-nerrors="` expr $nerrors + 1 `";
-  echo "*FAILED*"
-else
-  echo " PASSED"
-fi
-}
-
-echo "" 
-echo "=============================="
-echo "H5IMPORT tests started"
-echo "=============================="
-
-#echo "** Testing h5import  ***"
-
-rm -f  output.h5 log1 tx* b* *.dat
-
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-mkdir tmp_testfiles
-$CP $TESTDIR/*.h5 ./tmp_testfiles/
-
-$RUNSERIAL ./h5importtest
-
-################################################
-###        T H E   T E S T S
-################################################
-
-TESTING "ASCII I32 rank 3 - Output BE " ;
-TOOLTEST $TESTDIR/txtin32.txt -c $TESTDIR/txtin32.conf -o txtin32.h5
-
-TESTING "ASCII I16 rank 3 - Output LE - CHUNKED - extended" 
-TOOLTEST $TESTDIR/txtin16.txt -c $TESTDIR/txtin16.conf -o txtin16.h5
-
-TESTING "ASCII I8 - rank 3 - Output I8 LE-Chunked+Extended+Compressed " 
-TOOLTEST $TESTDIR/txtin8.txt -c $TESTDIR/txtin8.conf  -o txtin8.h5
-
-
-TESTING "ASCII UI16 - rank 2 - Output LE+Chunked+Compressed " 
-TOOLTEST $TESTDIR/txtuin16.txt -c $TESTDIR/txtuin16.conf -o txtuin16.h5
-
-TESTING "ASCII UI32 - rank 3 - Output BE" 
-TOOLTEST $TESTDIR/txtuin32.txt -c $TESTDIR/txtuin32.conf -o txtuin32.h5
-
-
-TESTING "ASCII F32 - rank 3 - Output LE " 
-TOOLTEST $TESTDIR/txtfp32.txt -c $TESTDIR/txtfp32.conf -o txtfp32.h5
-
-TESTING "ASCII F64 - rank 3 - Output BE + CHUNKED+Extended+Compressed " 
-TOOLTEST $TESTDIR/txtfp64.txt -c $TESTDIR/txtfp64.conf -o txtfp64.h5
-
-
-TESTING "BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed " 
-TOOLTEST binfp64.bin -c $TESTDIR/binfp64.conf -o binfp64.h5
-TESTING "H5DUMP-BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed " 
-if test $USE_FILTER_DEFLATE != "yes"; then
- SKIP "/fp/bin/64-bit" binfp64.h5
-else
- TOOLTEST2 "/fp/bin/64-bit" binfp64.h5
-fi
-
-
-TESTING "BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed " 
-TOOLTEST binin8.bin -c $TESTDIR/binin8.conf -o binin8.h5
-TESTING "H5DUMP-BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed " 
-if test $USE_FILTER_DEFLATE != "yes"; then
- SKIP "/int/bin/8-bit" binin8.h5
-else
- TOOLTEST2 "/int/bin/8-bit" binin8.h5
-fi
-
-TESTING "BINARY I16 - rank 3 - Output order LE + CHUNKED + extended " 
-TOOLTEST binin16.bin -c $TESTDIR/binin16.conf -o binin16.h5
-TESTING "H5DUMP-BINARY I16 - rank 3 - Output order LE + CHUNKED + extended " 
-TOOLTEST2 "/int/bin/16-bit" binin16.h5
-
-TESTING "BINARY I32 - rank 3 - Output BE + CHUNKED " 
-TOOLTEST binin32.bin -c $TESTDIR/binin32.conf -o binin32.h5
-TESTING "H5DUMP-BINARY I32 - rank 3 - Output BE + CHUNKED " 
-TOOLTEST2 "/int/bin/32-bit" binin32.h5
-
-
-TESTING "BINARY UI16 - rank 3 - Output byte BE + CHUNKED " 
-TOOLTEST binuin16.bin -c $TESTDIR/binuin16.conf -o binuin16.h5
-TESTING "H5DUMP-BINARY UI16 - rank 3 - Output byte BE + CHUNKED " 
-TOOLTEST2 "/int/buin/16-bit" binuin16.h5
-
-TESTING "BINARY UI32 - rank 3 - Output LE + CHUNKED " 
-TOOLTEST binuin32.bin -c $TESTDIR/binuin32.conf -o binuin32.h5
-TESTING "H5DUMP-BINARY UI32 - rank 3 - Output LE + CHUNKED " 
-TOOLTEST2 "/int/buin/32-bit" binuin32.h5
-
-
-TESTING "STR" 
-TOOLTEST $TESTDIR/txtstr.txt -c $TESTDIR/txtstr.conf -o txtstr.h5
-TESTING "H5DUMP-STR" 
-TOOLTEST4 "/mytext/data" txtstr.h5
-
-
-TESTING "BINARY I8 CR LF EOF" 
-TOOLTEST binin8w.bin -c $TESTDIR/binin8w.conf -o binin8w.h5
-TESTING "H5DUMP-BINARY I8 CR LF EOF" 
-TOOLTEST2 "/dataset0" binin8w.h5
-
-TESTING "ASCII F64 - rank 1 - INPUT-CLASS TEXTFPE " 
-TOOLTEST $TESTDIR/textpfe64.txt -c $TESTDIR/textpfe.conf -o textpfe.h5
-
-
-rm -f  txtin32.txt txtin16.txt txtin8.txt txtuin32.txt txtuin16.txt *.bin *.dmp *.imp *.h5
-rm -rf tmp_testfiles
-
-# Clean up temporary files/directories
-CLEAN_TESTFILES_AND_TESTDIR
-
-#
-# Check errors result
-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/testfiles/binfp64.h5 b/tools/h5import/testfiles/binfp64.h5
deleted file mode 100644
index 5426edb..0000000
Binary files a/tools/h5import/testfiles/binfp64.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/binin16.h5 b/tools/h5import/testfiles/binin16.h5
deleted file mode 100644
index 6d89c63..0000000
Binary files a/tools/h5import/testfiles/binin16.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/binin32.h5 b/tools/h5import/testfiles/binin32.h5
deleted file mode 100644
index 61cc507..0000000
Binary files a/tools/h5import/testfiles/binin32.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/binin8.h5 b/tools/h5import/testfiles/binin8.h5
deleted file mode 100644
index efd3ae0..0000000
Binary files a/tools/h5import/testfiles/binin8.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/binuin16.h5 b/tools/h5import/testfiles/binuin16.h5
deleted file mode 100644
index 1af804c..0000000
Binary files a/tools/h5import/testfiles/binuin16.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/binuin32.h5 b/tools/h5import/testfiles/binuin32.h5
deleted file mode 100644
index e7d12d9..0000000
Binary files a/tools/h5import/testfiles/binuin32.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtfp32.h5 b/tools/h5import/testfiles/txtfp32.h5
deleted file mode 100644
index bd41f06..0000000
Binary files a/tools/h5import/testfiles/txtfp32.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtfp64.h5 b/tools/h5import/testfiles/txtfp64.h5
deleted file mode 100644
index 41c4e9e..0000000
Binary files a/tools/h5import/testfiles/txtfp64.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtin16.h5 b/tools/h5import/testfiles/txtin16.h5
deleted file mode 100644
index 5089c97..0000000
Binary files a/tools/h5import/testfiles/txtin16.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtin32.h5 b/tools/h5import/testfiles/txtin32.h5
deleted file mode 100644
index 8d547cf..0000000
Binary files a/tools/h5import/testfiles/txtin32.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtin8.h5 b/tools/h5import/testfiles/txtin8.h5
deleted file mode 100644
index 61b7165..0000000
Binary files a/tools/h5import/testfiles/txtin8.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtuin16.h5 b/tools/h5import/testfiles/txtuin16.h5
deleted file mode 100644
index c43b875..0000000
Binary files a/tools/h5import/testfiles/txtuin16.h5 and /dev/null differ
diff --git a/tools/h5import/testfiles/txtuin32.h5 b/tools/h5import/testfiles/txtuin32.h5
deleted file mode 100644
index aec3b0f..0000000
Binary files a/tools/h5import/testfiles/txtuin32.h5 and /dev/null differ
diff --git a/tools/h5jam/CMakeLists.txt b/tools/h5jam/CMakeLists.txt
deleted file mode 100644
index c01f8f7..0000000
--- a/tools/h5jam/CMakeLists.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5JAM)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5jam executables
-# --------------------------------------------------------------------
-add_executable (h5jam ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/h5jam.c)
-TARGET_NAMING (h5jam STATIC)
-TARGET_C_PROPERTIES (h5jam STATIC " " " ")
-target_link_libraries (h5jam  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5jam PROPERTIES FOLDER tools)
-
-add_executable (getub ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/getub.c)
-TARGET_NAMING (getub STATIC)
-TARGET_C_PROPERTIES (getub STATIC " " " ")
-target_link_libraries (getub  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (getub PROPERTIES FOLDER tools)
-
-add_executable (tellub ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/tellub.c)
-TARGET_NAMING (tellub STATIC)
-TARGET_C_PROPERTIES (tellub STATIC " " " ")
-target_link_libraries (tellub  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (tellub PROPERTIES FOLDER tools)
-
-add_executable (h5unjam ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/h5unjam.c)
-TARGET_NAMING (h5unjam STATIC)
-TARGET_C_PROPERTIES (h5unjam STATIC " " " ")
-target_link_libraries (h5unjam  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5unjam PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES
-    h5jam
-    getub
-    tellub
-    h5unjam
-)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5jam test executables
-  # --------------------------------------------------------------------
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5jamgentest ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/h5jamgentest.c)
-    TARGET_NAMING (h5jamgentest STATIC)
-    TARGET_C_PROPERTIES (testhdf5 STATIC " " " ")
-    target_link_libraries (h5jamgentest ${HDF5_LIB_TARGET})
-    set_target_properties (h5jamgentest PROPERTIES FOLDER generator/tools)
-    
-    #add_test (NAME h5jamgentest COMMAND $<TARGET_FILE:h5jamgentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
-
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5jam ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5jam h5unjam
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5jam/CMakeTests.cmake b/tools/h5jam/CMakeTests.cmake
deleted file mode 100644
index b5dc256..0000000
--- a/tools/h5jam/CMakeTests.cmake
+++ /dev/null
@@ -1,428 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  set (HDF5_REFERENCE_TXT_FILES
-      u10.txt
-      u511.txt
-      u512.txt
-      u513.txt
-      h5jam-help.txt
-      h5unjam-help.txt
-      h5jam-ub-nohdf5.txt
-  )
-  set (HDF5_REFERENCE_TEST_FILES
-      tall.h5
-      twithub.h5
-      twithub513.h5
-  )
-
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${h5_file}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5jam
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/testfiles/${h5_file} ${dest}
-    )
-  endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-
-  foreach (txt_file ${HDF5_REFERENCE_TXT_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${txt_file}")
-    #message (STATUS " Copying ${txt_file}")
-    add_custom_command (
-        TARGET     h5jam
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/testfiles/${txt_file} ${dest}
-    )
-  endforeach (txt_file ${HDF5_REFERENCE_TXT_FILES})
-    
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  # ============================================================
-  # TEST_H5JAM_OUTPUT
-  # For the purpose to verify only output & exitcode from h5jam
-  #
-  MACRO (TEST_H5JAM_OUTPUT expectfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5JAM-${expectfile} COMMAND $<TARGET_FILE:h5jam> ${ARGN})
-      if (NOT "${resultcode}" STREQUAL "0")
-        set_tests_properties (H5JAM-${expectfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT "${resultcode}" STREQUAL "0")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-${expectfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${expectfile}.out
-              ${expectfile}.out.err
-      )
-      add_test (
-          NAME H5JAM-${expectfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5jam>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${expectfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=testfiles/${expectfile}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5JAM-${expectfile} PROPERTIES DEPENDS H5JAM-${expectfile}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (TEST_H5JAM_OUTPUT)
-
-  # ============================================================
-  # TEST_H5UNJAM_OUTPUT
-  # For the purpose to verify only output & exitcode from h5unjam
-  #
-  MACRO (TEST_H5UNJAM_OUTPUT expectfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5JAM-UNJAM-${expectfile} COMMAND $<TARGET_FILE:h5unjam> ${ARGN})
-      if (NOT "${resultcode}" STREQUAL "0")
-        set_tests_properties (H5JAM-UNJAM-${expectfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT "${resultcode}" STREQUAL "0")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-UNJAM-${expectfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${expectfile}.out
-              ${expectfile}.out.err
-      )
-      add_test (
-          NAME H5JAM-UNJAM-${expectfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5unjam>"
-              -D "TEST_ARGS=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${expectfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=testfiles/${expectfile}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5JAM-UNJAM-${expectfile} PROPERTIES DEPENDS H5JAM-UNJAM-${expectfile}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (TEST_H5UNJAM_OUTPUT)
-
-  MACRO (CHECKFILE testname testdepends expected actual)
-    # If using memchecker add tests without using scripts
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-${testname}-CHECKFILE-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${actual}.new
-              ${actual}.new.err
-              ${actual}.out
-              ${actual}.out.err
-      )
-      set_tests_properties (H5JAM-${testname}-CHECKFILE-clear-objects PROPERTIES DEPENDS ${testdepends})
-      add_test (
-          NAME H5JAM-${testname}-CHECKFILE-H5DMP
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=testfiles/${expected}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${actual}.new"
-              -D "TEST_EXPECT=0"
-              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
-              -D "TEST_SKIP_COMPARE=TRUE"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5JAM-${testname}-CHECKFILE-H5DMP PROPERTIES DEPENDS H5JAM-${testname}-CHECKFILE-clear-objects)
-      add_test (
-          NAME H5JAM-${testname}-CHECKFILE-H5DMP_CMP
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=${actual}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${actual}.out"
-              -D "TEST_EXPECT=0"
-              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
-              -D "TEST_REFERENCE=${actual}.new"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5JAM-${testname}-CHECKFILE-H5DMP_CMP PROPERTIES DEPENDS H5JAM-${testname}-CHECKFILE-H5DMP)
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO(CHECKFILE testname testdepends expected actual)
-
-  MACRO (UNJAMTEST testname setfile infile ufile chkfile outfile)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-${testname}-UNJAM-SETUP-clear-objects
-          COMMAND ${CMAKE_COMMAND} -E remove ${infile}
-      )
-      add_test (
-          NAME H5JAM-${testname}-UNJAM-SETUP
-          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${HDF5_TOOLS_H5JAM_SOURCE_DIR}/testfiles/${setfile} ${PROJECT_BINARY_DIR}/${infile}
-      )
-      set_tests_properties (H5JAM-${testname}-UNJAM-SETUP PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-SETUP-clear-objects)
-      add_test (
-          NAME H5JAM-${testname}-UNJAM-clear-objects
-          COMMAND ${CMAKE_COMMAND} -E remove ${outfile}
-      )
-      set_tests_properties (H5JAM-${testname}-UNJAM-clear-objects PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-SETUP)
-      if (NOT "${ufile}" STREQUAL "NONE")
-        add_test (
-            NAME H5JAM-${testname}-UNJAM_D-clear-objects
-            COMMAND ${CMAKE_COMMAND} -E remove ${ufile}
-        )
-        set_tests_properties (H5JAM-${testname}-UNJAM_D-clear-objects PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
-        add_test (NAME H5JAM-${testname}-UNJAM COMMAND $<TARGET_FILE:h5unjam> -i ${infile} -u ${ufile} -o ${outfile})
-        set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM_D-clear-objects)
-        set (compare_test ${ufile})
-      else (NOT "${ufile}" STREQUAL "NONE")
-        if (NOT "${ARGN}" STREQUAL "--delete")
-          add_test (
-              NAME H5JAM-${testname}-UNJAM_D-clear-objects
-              COMMAND ${CMAKE_COMMAND} -E remove ${outfile}.ufile.txt ${outfile}.ufile.txt.err
-          )
-          set_tests_properties (H5JAM-${testname}-UNJAM_D-clear-objects PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
-          add_test (
-              NAME H5JAM-${testname}-UNJAM
-              COMMAND "${CMAKE_COMMAND}"
-                  -D "TEST_PROGRAM=$<TARGET_FILE:h5unjam>"
-                  -D "TEST_ARGS:STRING=-i;${infile};-o;${outfile}"
-                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-                  -D "TEST_OUTPUT=${outfile}.ufile.txt"
-                  -D "TEST_EXPECT=0"
-                  -D "TEST_SKIP_COMPARE=TRUE"
-                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-          )
-          set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM_D-clear-objects)
-          set (compare_test "${outfile}.ufile.txt")
-        else (NOT "${ARGN}" STREQUAL "--delete")
-          add_test (NAME H5JAM-${testname}-UNJAM COMMAND $<TARGET_FILE:h5unjam> -i ${infile} -o ${outfile})
-          set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
-          set (compare_test "")
-        endif (NOT "${ARGN}" STREQUAL "--delete")
-      endif (NOT "${ufile}" STREQUAL "NONE")
-      if (NOT "${compare_test}" STREQUAL "")
-        add_test (
-            NAME H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects
-            COMMAND    ${CMAKE_COMMAND}
-                -E remove
-                ${infile}.len.txt
-                ${infile}.cmp
-                ${infile}-ub.cmp
-        )
-        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}-UNJAM")
-        add_test (
-            NAME H5JAM-${testname}-UNJAM-CHECK_UB_1
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
-                -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
-                -D "TEST_CHECKUB=YES"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-                -D "TEST_HFILE=${infile}"
-                -D "TEST_UFILE=${compare_test}"
-                -D "TEST_EXPECT=0"
-                -D "TEST_OFILE="
-                -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
-        )
-        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects)
-      endif (NOT "${compare_test}" STREQUAL "")
-
-      add_test (
-          NAME H5JAM-${testname}-UNJAM-CHECK_NOUB
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
-              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
-              -D "TEST_CHECKUB=NO"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_HFILE=${outfile}"
-              -D "TEST_EXPECT=0"
-              -D "TEST_UFILE=NULL"
-              -D "TEST_OFILE=NULL"
-              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
-      )
-      if (NOT "${compare_test}" STREQUAL "")
-        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_NOUB PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-CHECK_UB_1)
-      else (NOT "${compare_test}" STREQUAL "")
-        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_NOUB PROPERTIES DEPENDS H5JAM-${testname}-UNJAM)
-      endif (NOT "${compare_test}" STREQUAL "")
-
-      CHECKFILE (${testname} "H5JAM-${testname}-UNJAM-CHECK_NOUB" ${chkfile} ${outfile})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO(UNJAMTEST testname infile ufile outfile)
-
-  MACRO (JAMTEST testname jamfile infile chkfile outfile)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-${testname}-clear-objects
-          COMMAND ${CMAKE_COMMAND} -E remove ${outfile} ${infile}.cpy.h5
-      )
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    add_test (NAME H5JAM-${testname} COMMAND $<TARGET_FILE:h5jam> -u testfiles/${jamfile} -i testfiles/${infile} -o ${outfile} ${ARGN})
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5JAM-${testname} PROPERTIES DEPENDS H5JAM-${testname}-clear-objects)
-      set (compare_test ${outfile})
-      set (compare_orig testfiles/${infile})
-      if ("${ARGN}" STREQUAL "--clobber")
-        set (compare_orig "")
-      endif ("${ARGN}" STREQUAL "--clobber")
-
-      add_test (
-          NAME H5JAM-${testname}-CHECK_UB_1-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${compare_test}.len.txt
-              ${compare_test}.cmp
-              ${compare_test}-ub.cmp
-      )
-      set_tests_properties (H5JAM-${testname}-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}")
-      add_test (
-          NAME H5JAM-${testname}-CHECK_UB_1
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
-              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
-              -D "TEST_CHECKUB=YES"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_HFILE=${compare_test}"
-              -D "TEST_UFILE=testfiles/${jamfile}"
-              -D "TEST_EXPECT=0"
-              -D "TEST_OFILE=${compare_orig}"
-              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
-      )
-      set_tests_properties (H5JAM-${testname}-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}-CHECK_UB_1-clear-objects)
-      CHECKFILE (${testname} "H5JAM-${testname}-CHECK_UB_1" ${chkfile} ${outfile})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (JAMTEST testname jamfile infile outfile)
-
-  MACRO (JAMTEST_NONE testname jamfile infile setfile chkfile)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5JAM-${testname}_NONE-clear-objects
-          COMMAND ${CMAKE_COMMAND} -E remove 
-              ${chkfile} ${chkfile}.cpy.h5
-      )
-      add_test (
-          NAME H5JAM-${testname}_NONE-SETUP
-          COMMAND ${CMAKE_COMMAND} -E copy_if_different testfiles/${setfile} ${chkfile}
-      )
-      set_tests_properties (H5JAM-${testname}_NONE-SETUP PROPERTIES DEPENDS H5JAM-${testname}_NONE-clear-objects)
-
-      add_test (
-          NAME H5JAM-${testname}_NONE_COPY
-          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${chkfile} ${chkfile}.cpy.h5
-      )
-      set_tests_properties (H5JAM-${testname}_NONE_COPY PROPERTIES DEPENDS H5JAM-${testname}_NONE-SETUP)
-
-      add_test (NAME H5JAM-${testname}_NONE COMMAND $<TARGET_FILE:h5jam> -u testfiles/${jamfile} -i ${chkfile} ${ARGN})
-      set_tests_properties (H5JAM-${testname}_NONE PROPERTIES DEPENDS H5JAM-${testname}_NONE_COPY)
-
-      set (compare_test ${chkfile})
-      set (compare_orig ${chkfile}.cpy.h5)
-      if ("${ARGN}" STREQUAL "--clobber")
-        set (compare_orig "")
-      endif ("${ARGN}" STREQUAL "--clobber")
-
-      add_test (
-          NAME H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              ${compare_test}.len.txt
-              ${compare_test}.cmp
-              ${compare_test}-ub.cmp
-      )
-      set_tests_properties (H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}_NONE")
-      add_test (
-          NAME H5JAM-${testname}_NONE-CHECK_UB_1
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
-              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
-              -D "TEST_CHECKUB=YES"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_HFILE=${compare_test}"
-              -D "TEST_UFILE=testfiles/${jamfile}"
-              -D "TEST_EXPECT=0"
-              -D "TEST_OFILE=${compare_orig}"
-              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
-      )
-      set_tests_properties (H5JAM-${testname}_NONE-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects)
-      CHECKFILE (${testname} "H5JAM-${testname}_NONE-CHECK_UB_1" ${infile} ${chkfile})
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (JAMTEST_NONE testname jamfile infile setfile chkfile)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-##############################################################################
-
-#-------------------------------
-# Testing h5jam
-#-------------------------------
-  # help page
-  TEST_H5JAM_OUTPUT(h5jam-help 0 -h)
-
-  # don't allow HDF5 format file as an user block file
-  TEST_H5JAM_OUTPUT(h5jam-ub-nohdf5 1 -i testfiles/tall.h5 -u testfiles/tall.h5 -o tall-tmp.h5)
-
-  JAMTEST (tall_u10 u10.txt tall.h5 tall.h5 ta2.h5)
-  JAMTEST (tall_u511 u511.txt tall.h5 tall.h5 ta3.h5)
-  JAMTEST (tall_u512 u512.txt tall.h5 tall.h5 ta4.h5)
-  JAMTEST (tall_u513 u513.txt tall.h5 tall.h5 ta5.h5)
-
-  JAMTEST_NONE (N_ta_u10 u10.txt tall.h5 tall.h5 ta6.h5)
-  JAMTEST_NONE (N_ta_u511 u511.txt tall.h5 tall.h5 ta7.h5)
-  JAMTEST_NONE (N_ta_u512 u512.txt tall.h5 tall.h5 ta8.h5)
-  JAMTEST_NONE (N_ta_u513 u513.txt tall.h5 tall.h5 ta9.h5)
-
-  JAMTEST (twithub_u10 u10.txt twithub.h5 tall.h5 tax2.h5)
-  JAMTEST (twithub_u511 u511.txt twithub.h5 tall.h5 tax3.h5)
-  JAMTEST (twithub_u512 u512.txt twithub.h5 tall.h5 tax4.h5)
-  JAMTEST (twithub_u513 u513.txt twithub.h5 tall.h5 tax5.h5)
-
-  JAMTEST (twithub513_u10 u10.txt twithub513.h5 tall.h5 tax6.h5)
-  JAMTEST (twithub513_u511 u511.txt twithub513.h5 tall.h5 tax7.h5)
-  JAMTEST (twithub513_u512 u512.txt twithub513.h5 tall.h5 tax8.h5)
-  JAMTEST (twithub513_u513 u513.txt twithub513.h5 tall.h5 tax9.h5)
-
-  JAMTEST (twithub_u10_c u10.txt twithub.h5 tall.h5 taz2.h5 --clobber)
-  JAMTEST (twithub_u511_c u511.txt twithub.h5 tall.h5 taz3.h5 --clobber)
-  JAMTEST (twithub_u512_c u512.txt twithub.h5 tall.h5 taz4.h5 --clobber)
-  JAMTEST (twithub_u513_c u513.txt twithub.h5 tall.h5 taz5.h5 --clobber)
-
-  JAMTEST (twithub513_u10_c u10.txt twithub513.h5 tall.h5 taz6.h5 --clobber)
-  JAMTEST (twithub513_u511_c u511.txt twithub513.h5 tall.h5 taz7.h5 --clobber)
-  JAMTEST (twithub513_u512_c u512.txt twithub513.h5 tall.h5 taz8.h5 --clobber)
-  JAMTEST (twithub513_u513_c u513.txt twithub513.h5 tall.h5 taz9.h5 --clobber)
-
-  JAMTEST_NONE (N_twithub_u10_c u10.txt tall.h5 twithub.h5 tay2.h5 --clobber)
-  JAMTEST_NONE (N_twithub_u511_c u511.txt tall.h5 twithub.h5 tay3.h5 --clobber)
-  JAMTEST_NONE (N_twithub_u512_c u512.txt tall.h5 twithub.h5 tay4.h5 --clobber)
-  JAMTEST_NONE (N_twithub_u513_c u513.txt tall.h5 twithub.h5 tay5.h5 --clobber)
-
-  JAMTEST_NONE (N_twithub513_u10_c u10.txt tall.h5 twithub513.h5 tay6.h5 --clobber)
-  JAMTEST_NONE (N_twithub513_u511_c u511.txt tall.h5 twithub513.h5 tay7.h5 --clobber)
-  JAMTEST_NONE (N_twithub513_u512_c u512.txt tall.h5 twithub513.h5 tay8.h5 --clobber)
-  JAMTEST_NONE (N_twithub513_u513_c u513.txt tall.h5 twithub513.h5 tay9.h5 --clobber)
-
-#-------------------------------
-# Testing h5unjam
-#-------------------------------
-  # help page
-  TEST_H5UNJAM_OUTPUT(h5unjam-help 0 -h)
-
-  UNJAMTEST (twithub_tall twithub.h5 tai1.h5 o10.txt tall.h5 taa1.h5)
-  UNJAMTEST (twithub513_tall twithub513.h5 tai2.h5 o512.txt tall.h5 taa2.h5)
-
-  UNJAMTEST (N_twithub_tall twithub.h5 tai3.h5 NONE tall.h5 taa3.h5)
-  UNJAMTEST (N_twithub513_tall twithub513.h5 tai4.h5 NONE tall.h5 taa4.h5)
-
-  UNJAMTEST (D_twithub_tall twithub.h5 taj2.h5 NONE tall.h5 tac2.h5 --delete)
-  UNJAMTEST (D_twithub513_tall twithub513.h5 taj3.h5 NONE tall.h5 tac3.h5 --delete)
diff --git a/tools/h5jam/Makefile.am b/tools/h5jam/Makefile.am
deleted file mode 100644
index 60a62b9..0000000
--- a/tools/h5jam/Makefile.am
+++ /dev/null
@@ -1,45 +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.
-##
-## 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
-
-bin_PROGRAMS=h5jam h5unjam
-check_PROGRAMS=tellub h5jamgentest getub
-TEST_SCRIPT=testh5jam.sh
-
-# Add h5jam and h5unjam specific linker flags here
-h5jam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-h5unjam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5jam$(EXEEXT) h5unjam$(EXEEXT)
-
-# Link against the main HDF5 library and tools library
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# Temporary files.  *.h5 are generated by jamgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES+=*.h5 testfiles/h5jam-*-sav testfiles/h5unjam-*-sav
-DISTCLEANFILES=testh5jam.sh
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5jam/Makefile.in b/tools/h5jam/Makefile.in
deleted file mode 100644
index 9d3a3e4..0000000
--- a/tools/h5jam/Makefile.in
+++ /dev/null
@@ -1,1510 +0,0 @@
-# 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 = 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5jam.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-getub_SOURCES = getub.c
-getub_OBJECTS = getub.$(OBJEXT)
-getub_LDADD = $(LDADD)
-getub_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 = 
-h5jam_SOURCES = h5jam.c
-h5jam_OBJECTS = h5jam.$(OBJEXT)
-h5jam_LDADD = $(LDADD)
-h5jam_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5jam_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5jam_LDFLAGS) $(LDFLAGS) -o $@
-h5jamgentest_SOURCES = h5jamgentest.c
-h5jamgentest_OBJECTS = h5jamgentest.$(OBJEXT)
-h5jamgentest_LDADD = $(LDADD)
-h5jamgentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5unjam_SOURCES = h5unjam.c
-h5unjam_OBJECTS = h5unjam.$(OBJEXT)
-h5unjam_LDADD = $(LDADD)
-h5unjam_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5unjam_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5unjam_LDFLAGS) $(LDFLAGS) -o $@
-tellub_SOURCES = tellub.c
-tellub_OBJECTS = tellub.$(OBJEXT)
-tellub_LDADD = $(LDADD)
-tellub_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 = getub.c h5jam.c h5jamgentest.c h5unjam.c tellub.c
-DIST_SOURCES = getub.c h5jam.c h5jamgentest.c h5unjam.c tellub.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)/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@
-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
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by jamgentest.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 \
-	testfiles/h5jam-*-sav testfiles/h5unjam-*-sav
-TEST_SCRIPT = testh5jam.sh
-
-# Add h5jam and h5unjam specific linker flags here
-h5jam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-h5unjam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5jam$(EXEEXT) h5unjam$(EXEEXT)
-
-# Link against the main HDF5 library and tools library
-LDADD = $(LIBH5TOOLS) $(LIBHDF5)
-DISTCLEANFILES = testh5jam.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 tools/h5jam/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5jam/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):
-testh5jam.sh: $(top_builddir)/config.status $(srcdir)/testh5jam.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
-
-getub$(EXEEXT): $(getub_OBJECTS) $(getub_DEPENDENCIES) $(EXTRA_getub_DEPENDENCIES) 
-	@rm -f getub$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(getub_OBJECTS) $(getub_LDADD) $(LIBS)
-
-h5jam$(EXEEXT): $(h5jam_OBJECTS) $(h5jam_DEPENDENCIES) $(EXTRA_h5jam_DEPENDENCIES) 
-	@rm -f h5jam$(EXEEXT)
-	$(AM_V_CCLD)$(h5jam_LINK) $(h5jam_OBJECTS) $(h5jam_LDADD) $(LIBS)
-
-h5jamgentest$(EXEEXT): $(h5jamgentest_OBJECTS) $(h5jamgentest_DEPENDENCIES) $(EXTRA_h5jamgentest_DEPENDENCIES) 
-	@rm -f h5jamgentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5jamgentest_OBJECTS) $(h5jamgentest_LDADD) $(LIBS)
-
-h5unjam$(EXEEXT): $(h5unjam_OBJECTS) $(h5unjam_DEPENDENCIES) $(EXTRA_h5unjam_DEPENDENCIES) 
-	@rm -f h5unjam$(EXEEXT)
-	$(AM_V_CCLD)$(h5unjam_LINK) $(h5unjam_OBJECTS) $(h5unjam_LDADD) $(LIBS)
-
-tellub$(EXEEXT): $(tellub_OBJECTS) $(tellub_DEPENDENCIES) $(EXTRA_tellub_DEPENDENCIES) 
-	@rm -f tellub$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(tellub_OBJECTS) $(tellub_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/getub.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5jam.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5jamgentest.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5unjam.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tellub.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 $$?
-.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/h5jam/getub.c b/tools/h5jam/getub.c
deleted file mode 100644
index 4e02e6b..0000000
--- a/tools/h5jam/getub.c
+++ /dev/null
@@ -1,157 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-void parse_command_line(int argc, const char *argv[]);
-
-/* Name of tool */
-#define PROGRAM_NAME "getub"
-char *nbytes = NULL;
-
-static const char *s_opts = "c:";  /* add more later ? */
-static struct long_options l_opts[] = {
-  {"c", require_arg, 'c'},  /* input file */
-  {NULL, 0, '\0'}
-};
-
-/*-------------------------------------------------------------------------
- * Function:    usage
- *
- * Purpose:     Print the usage message
- *
- * Return:      void
- *-------------------------------------------------------------------------
- */
-static void
-usage (const char *prog)
-{
-    HDfflush(stdout);
-    HDfprintf(stdout, "usage: %s -c nb file] \n", prog);
-    HDfprintf(stdout, "           print first 'nb' byts of file to stdoug.\n");
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_command_line
- *
- * Purpose:     Parse the command line for the h5dumper.
- *
- * Return:      Success:
- *
- *              Failure:    Exits program with EXIT_FAILURE value.
- *-------------------------------------------------------------------------
- */
-void
-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());
-            HDexit(EXIT_FAILURE);
-        } /* end switch */
-    } /* end while */
-
-    if(argc <= opt_ind) {
-      error_msg("missing file name\n");
-      usage(h5tools_getprogname());
-      HDexit(EXIT_FAILURE);
-    } /* end if */
-} /* end parse_command_line() */
-
-int
-main(int argc, const char *argv[])
-{
-    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());
-      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
deleted file mode 100644
index 4509734..0000000
--- a/tools/h5jam/h5jam.c
+++ /dev/null
@@ -1,558 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5jam"
-
-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);
-void parse_command_line (int, const char *[]);
-
-int do_clobber = FALSE;
-char *output_file = NULL;
-char *input_file = NULL;
-char *ub_file = NULL;
-
-/*
- * Command-line options: The user can specify short or 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 = "hi:u:o:c:V";  /* add more later ? */
-static struct long_options l_opts[] = {
-  {"help", no_arg, 'h'},
-  {"hel", no_arg, 'h'},
-  {"i", require_arg, 'i'},  /* input file */
-  {"u", require_arg, 'u'},  /* user block file */
-  {"o", require_arg, 'o'},  /* output file */
-  {"clobber", no_arg, 'c'},  /* clobber existing UB */
-  {"clobbe", no_arg, 'c'},
-  {"clobb", no_arg, 'c'},
-  {"clob", no_arg, 'c'},
-  {"clo", no_arg, 'c'},
-  {"cl", no_arg, 'c'},
-  {NULL, 0, '\0'}
-};
-
-/*-------------------------------------------------------------------------
- * Function:    usage
- *
- * Purpose:     Print the usage message
- *
- * Return:      void
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (const char *prog)
-{
-    HDfflush (stdout);
-    HDfprintf (stdout,
-    "usage: %s -i <in_file.h5> -u <in_user_file> [-o <out_file.h5>] [--clobber]\n", prog);
-    HDfprintf (stdout, "\n");
-    HDfprintf (stdout,
-    "Adds user block to front of an HDF5 file and creates a new concatenated file.\n");
-    HDfprintf (stdout, "\n");
-    HDfprintf (stdout, 
-    "OPTIONS\n");
-    HDfprintf (stdout, 
-    "  -i in_file.h5    Specifies the input HDF5 file.\n");
-    HDfprintf (stdout, 
-    "  -u in_user_file  Specifies the file to be inserted into the user block.\n");
-    HDfprintf (stdout, 
-    "                   Can be any file format except an HDF5 format.\n");
-    HDfprintf (stdout,
-    "  -o out_file.h5   Specifies the output HDF5 file.\n");
-    HDfprintf (stdout,
-    "                   If not specified, the user block will be concatenated in\n");
-    HDfprintf (stdout,
-    "                   place to the input HDF5 file.\n");
-    HDfprintf (stdout,
-    "  --clobber        Wipes out any existing user block before concatenating\n");
-    HDfprintf (stdout,
-    "                   the given user block.\n");
-    HDfprintf (stdout,
-    "                   The size of the new user block will be the larger of;\n");
-    HDfprintf (stdout,
-    "                    - the size of existing user block in the input HDF5 file\n");
-    HDfprintf (stdout,
-    "                    - the size of user block required by new input user file\n");
-    HDfprintf (stdout,
-    "                   (size = 512 x 2N,  N is positive integer.)\n");
-    HDfprintf (stdout, "\n");
-    HDfprintf (stdout,
-    "  -h               Prints a usage message and exits.\n");
-    HDfprintf (stdout,
-    "  -V               Prints the HDF5 library version and exits.\n");
-    HDfprintf (stdout, "\n");
-    HDfprintf (stdout,
-    "Exit Status:\n");
-    HDfprintf (stdout,
-    "   0   Succeeded.\n");
-    HDfprintf (stdout,
-    "   >0  An error occurred.\n");
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    leave
- *
- * Purpose:     Shutdown and call exit()
- *
- * Return:      Does not return
- *
- *-------------------------------------------------------------------------
- */
-static void
-leave(int ret)
-{
-    if (ub_file)
-        HDfree (ub_file);
-    if (input_file)
-        HDfree (input_file);
-    if (output_file)
-        HDfree (output_file);
-
-    h5tools_close();
-
-    HDexit(ret);
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_command_line
- *
- * Purpose:     Parse the command line for the h5dumper.
- *
- * Return:      Success:
- *
- *              Failure:    Exits program with EXIT_FAILURE value.
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-void
-parse_command_line (int argc, const char *argv[])
-{
-  int opt = FALSE;
-
-  /* parse command line options */
-  while ((opt = get_option (argc, argv, s_opts, l_opts)) != EOF)
-    {
-      switch ((char) opt)
-      {
-      case 'o':
-          output_file = HDstrdup (opt_arg);
-          break;
-      case 'i':
-          input_file = HDstrdup (opt_arg);
-          break;
-      case 'u':
-          ub_file = HDstrdup (opt_arg);
-          break;
-      case 'c':
-          do_clobber = TRUE;
-          break;
-      case 'h':
-          usage (h5tools_getprogname());
-          leave (EXIT_SUCCESS);
-      case 'V':
-          print_version (h5tools_getprogname());
-          leave (EXIT_SUCCESS);
-      case '?':
-      default:
-          usage (h5tools_getprogname());
-          leave (EXIT_FAILURE);
-      }
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function:    main
- *
- * Purpose:     HDF5 user block jammer
- *
- * Return:      Success:    0
- *              Failure:    1
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main (int argc, const char *argv[])
-{
-    int         ufid = -1;
-    int         h5fid = -1;
-    int         ofid = -1;
-    void       *edata;
-    H5E_auto2_t func;
-    hid_t       ifile = -1;
-    hid_t       plist = -1;
-    herr_t      status;
-    htri_t      testval;
-    hsize_t     usize;
-    hsize_t     h5fsize;
-    hsize_t     startub;
-    hsize_t     where;
-    hsize_t     newubsize;
-    off_t       fsize;
-    h5_stat_t   sbuf;
-    h5_stat_t   sbuf2;
-    int         res;
-
-    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 (argc, argv);
-
-    if (ub_file == NULL) {
-        /* no user block */
-        error_msg("missing arguemnt for -u <user_file>.\n");
-        help_ref_msg(stderr);
-        leave (EXIT_FAILURE);
-    }
-
-    testval = H5Fis_hdf5 (ub_file);
-
-    if (testval > 0) {
-        error_msg("-u <user_file> cannot be HDF5 file, but it appears to be an HDF5 file.\n");
-        help_ref_msg(stderr);
-        leave (EXIT_FAILURE);
-    }
-
-    if (input_file == NULL) {
-        error_msg("missing arguemnt for -i <HDF5 file>.\n");
-        help_ref_msg(stderr);
-        leave (EXIT_FAILURE);
-    }
-
-    testval = H5Fis_hdf5 (input_file);
-
-    if (testval <= 0) {
-        error_msg("Input HDF5 file \"%s\" is not HDF5 format.\n", input_file);
-        help_ref_msg(stderr);
-        leave (EXIT_FAILURE);
-    }
-
-    ifile = H5Fopen (input_file, H5F_ACC_RDONLY, H5P_DEFAULT);
-
-    if (ifile < 0) {
-        error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
-        leave (EXIT_FAILURE);
-    }
-
-    plist = H5Fget_create_plist (ifile);
-    if (plist < 0) {
-        error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
-        H5Fclose(ifile);
-        leave (EXIT_FAILURE);
-    }
-
-    status = H5Pget_userblock (plist, &usize);
-    if (status < 0) {
-        error_msg("Can't get user block for file \"%s\"\n", input_file);
-        H5Pclose(plist);
-        H5Fclose(ifile);
-        leave (EXIT_FAILURE);
-    }
-
-    H5Pclose(plist);
-    H5Fclose(ifile);
-
-    ufid = HDopen(ub_file, O_RDONLY, 0);
-    if(ufid < 0) {
-        error_msg("unable to open user block file \"%s\"\n", ub_file);
-        leave (EXIT_FAILURE);
-    }
-
-    res = HDfstat(ufid, &sbuf);
-    if(res < 0) {
-        error_msg("Can't stat file \"%s\"\n", ub_file);
-        HDclose (ufid);
-        leave (EXIT_FAILURE);
-    }
-
-    fsize = (off_t)sbuf.st_size;
-
-    h5fid = HDopen(input_file, O_RDONLY, 0);
-    if(h5fid < 0) {
-        error_msg("unable to open HDF5 file for read \"%s\"\n", input_file);
-        HDclose (ufid);
-        leave (EXIT_FAILURE);
-    }
-
-    res = HDfstat(h5fid, &sbuf2);
-    if(res < 0) {
-        error_msg("Can't stat file \"%s\"\n", input_file);
-        HDclose (h5fid);
-        HDclose (ufid);
-        leave (EXIT_FAILURE);
-    }
-
-    h5fsize = (hsize_t)sbuf2.st_size;
-
-    if (output_file == NULL) {
-        ofid = HDopen (input_file, O_WRONLY, 0);
-
-        if (ofid < 0) {
-            error_msg("unable to open output file \"%s\"\n", output_file);
-            HDclose (h5fid);
-            HDclose (ufid);
-            leave (EXIT_FAILURE);
-        }
-    }
-    else {
-        ofid = HDopen (output_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-
-        if (ofid < 0) {
-            error_msg("unable to create output file \"%s\"\n", output_file);
-            HDclose (h5fid);
-            HDclose (ufid);
-            leave (EXIT_FAILURE);
-        }
-    }
-
-    newubsize = compute_user_block_size ((hsize_t) fsize);
-
-    startub = usize;
-
-    if (usize > 0) {
-        if (do_clobber == TRUE) {
-            /* where is max of the current size or the new UB */
-            if (usize > newubsize) {
-                newubsize = usize;
-            }
-            startub = 0;    /*blast the old */
-        }
-        else {
-            /* add new ub to current ublock, pad to new offset */
-            newubsize += usize;
-            newubsize = compute_user_block_size ((hsize_t) newubsize);
-        }
-    }
-
-    /* copy the HDF5 from starting at usize to starting at newubsize:
-     *  makes room at 'from' for new ub */
-    /* if no current ub, usize is 0 */
-    copy_some_to_file (h5fid, ofid, usize, newubsize, (ssize_t) (h5fsize - usize));
-
-    /* copy the old ub to the beginning of the new file */
-    if (!do_clobber) {
-        where = copy_some_to_file (h5fid, ofid, (hsize_t) 0, (hsize_t) 0, (ssize_t) usize);
-    }
-
-    /* copy the new ub to the end of the ub */
-    where = copy_some_to_file (ufid, ofid, (hsize_t) 0, startub, (ssize_t) - 1);
-
-    /* pad the ub */
-    where = write_pad (ofid, where);
-
-    if(ub_file)
-        HDfree (ub_file);
-    if(input_file)
-        HDfree (input_file);
-    if(output_file)
-        HDfree (output_file);
-    
-    if(ufid >= 0)
-        HDclose (ufid);
-    if(h5fid >= 0)
-        HDclose (h5fid);
-    if(ofid >= 0)
-        HDclose (ofid);
-
-    return h5tools_getstatus();
-}
-
-/*-------------------------------------------------------------------------
- * Function:    copy_some_to_file
- *
- * Purpose:     Copy part of the input file to output.
- *      infid: fd of file to read
- *      outfid: fd of file to write
- *      startin: offset of where to read from infid
- *      startout: offset of where to write to outfid
- *      limit: bytes to read/write
- *
- *    If limit is < 0, the entire input file is copied.
- *
- *    Note: this routine can be used to copy within
- *    the same file, i.e., infid and outfid can be the
- *    same file.
- *
- * Return:      Success:    last byte written in the output.
- *              Failure:    Exits program with EXIT_FAILURE value.
- *
- *-------------------------------------------------------------------------
- */
-hsize_t
-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;
-    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);
-        }
-
-        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;
-} /* end copy_some_to_file() */
-
-
-/*-------------------------------------------------------------------------
- * Function:    compute_user_block_size
- *
- * Purpose:     Find the offset of the HDF5 header after the user block:
- *                 align at 0, 512, 1024, etc.
- *      ublock_size: the size of the user block (bytes).
- *
- * Return:      Success:    the location of the header == the size of the
- *        padded user block.
- *              Failure:    none
- *
- * Return:      Success:    last byte written in the output.
- *              Failure:    Exits program with EXIT_FAILURE value.
- *-------------------------------------------------------------------------
- */
-H5_ATTR_CONST hsize_t
-compute_user_block_size(hsize_t ublock_size)
-{
-    hsize_t where = 512;
-
-    if(0 == ublock_size)
-        return 0;
-
-    while(where < ublock_size)
-        where *= 2;
-
-    return where;
-} /* end compute_user_block_size() */
-
-/*
- *  Write zeroes to fill the file from 'where' to 512, 1024, etc. bytes.
- *
- *  Returns the size of the padded file.
- */
-hsize_t
-write_pad(int ofile, hsize_t where)
-{
-    unsigned int i;
-    char buf[1];
-    hsize_t psize;
-
-    buf[0] = '\0';
-
-    HDlseek(ofile, (off_t) where, SEEK_SET);
-
-    psize = compute_user_block_size (where);
-    psize -= where;
-
-    for(i = 0; i < psize; i++)
-        HDwrite (ofile, buf, 1);
-
-    return(where + psize);  /* the new size of the file. */
-}
-
diff --git a/tools/h5jam/h5jamgentest.c b/tools/h5jam/h5jamgentest.c
deleted file mode 100644
index d3166b5..0000000
--- a/tools/h5jam/h5jamgentest.c
+++ /dev/null
@@ -1,384 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Generate the binary hdf5 files and user block data for the jam/unjam tests.
- * Usage: just execute the program without any arguments will
- * generate all the files in the local directory.
- *
- * 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 <assert.h>
-#include <limits.h>
-
-#include "hdf5.h"
-#include "H5private.h"
-
-/* not used yet
-#define UBTXT1 "u0.txt"
-*/
-#define UBTXT2 "u10.txt"
-#define UBTXT3 "u511.txt"
-#define UBTXT4 "u512.txt"
-#define UBTXT5 "u513.txt"
-/* not used yet
-#define UBTXT6 "u1023.txt"
-#define UBTXT7 "u1024.txt"
-#define UBTXT8 "u1025.txt"
-#define UBTXT9 "u2047.txt"
-#define UBTXT10 "u2048.txt"
-#define UBTXT11 "u2049.txt"
-#define UBBIN1 "u0.dat"
-#define UBBIN2 "u10.dat"
-#define UBBIN3 "u511.dat"
-#define UBBIN4 "u512.dat"
-#define UBBIN5 "u513.dat"
-*/
-
-/* not used yet
-#define FILE1 "tnull.h5"
-#define FILE2 "tnullwithub.h5"
-*/
-/* tall is same as dumper test */
-#define FILE7 "tall.h5"
-#define FILE8 "twithub.h5"
-#define FILE9 "twithub513.h5"
-
-/*
- * This pattern is used to fill text files
- */
-char pattern[11] = "abcdefghij";
-
-/*-------------------------------------------------------------------------
- * prototypes
- *-------------------------------------------------------------------------
- */
-
-
-#define BUF_SIZE 1024
-
-/* Element selection information */
-
-typedef enum{
-     RED,
-     GREEN,
-     BLUE,
-     WHITE,
-     BLACK
-} enumtype;
-
-/* Compound datatype */
-typedef struct s1_t {
-    unsigned int a;
-    unsigned int b;
-    float c;
-} s1_t;
-
-
-/* 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)
-{
-    return -1;
-}
-
-#define MY_LINKCLASS 187
-const H5L_class_t UD_link_class[1] = {{
-    H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
-    (H5L_type_t)MY_LINKCLASS, /* Link type id number            */
-    "UD link class",          /* name for debugging             */
-    NULL,                     /* Creation callback              */
-    NULL,                     /* Move/rename callback           */
-    NULL,                     /* Copy callback                  */
-    UD_traverse,              /* The actual traversal function  */
-    NULL,                     /* Deletion callback              */
-    NULL                      /* Query callback                 */
-}};
-
-
-
-/* gent_ub
-    with no ub, identical to gent_all from h5dumpgentest.c
-
-    FILENAME is the name of the file to create
-    UB_SIZE is the size the buffer should be
-    UB_FILL characters will be set to the PATTERN array,
-        the rest of the user block will be NULL.
-
-/ : g1  g2  attr1  attr2
-g1 : g1.1  g1.2
-g1.1 : dset1.1.1(attr1, attr2)   dset1.1.2
-g1.2 : g1.2.1 extlink
-g1.2.1 : slink
-g2 : dset2.1  dset2.2 udlink
-
-*/
-
-static void
-gent_ub(const char * filename, size_t ub_size, size_t ub_fill)
-{
-    hid_t fid, group, attr, dataset, space;
-    hid_t create_plist;
-    hsize_t dims[2];
-    int data[2][2], dset1[10][10], dset2[20];
-    char buf[BUF_SIZE];
-    int i, j;
-    size_t u;
-    float dset2_1[10], dset2_2[3][5];
-    int fd;
-    char *bp;
-
-  if(ub_size > 0)
-  {
-      create_plist = H5Pcreate(H5P_FILE_CREATE);
-      H5Pset_userblock(create_plist, (hsize_t)ub_size);
-      fid = H5Fcreate(filename, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT);
-  }
-  else
-  {
-      fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-  }
-
-  /* create groups */
-  group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  /* root attributes */
-  group = H5Gopen2(fid, "/", H5P_DEFAULT);
-
-  dims[0] = 10;
-  space = H5Screate_simple(1, dims, NULL);
-  attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-  sprintf(buf, "abcdefghi");
-  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-  H5Sclose(space);
-  H5Aclose(attr);
-
-  dims[0] = 2; dims[1] = 2;
-  space = H5Screate_simple(2, dims, NULL);
-  attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
-  data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
-  H5Awrite(attr, H5T_NATIVE_INT, data);
-  H5Sclose(space);
-  H5Aclose(attr);
-
-  H5Gclose(group);
-
-  group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
-
-  /* dset1.1.1 */
-  dims[0] = 10; dims[1] = 10;
-  space = H5Screate_simple(2, dims, NULL);
-  dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  for (i = 0; i < 10; i++)
-       for (j = 0; j < 10; j++)
-            dset1[i][j] = j*i;
-  H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
-  H5Sclose(space);
-
-  /* attributes of dset1.1.1 */
-  dims[0] = 27;
-  space = H5Screate_simple(1, dims, NULL);
-  attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-  sprintf(buf, "1st attribute of dset1.1.1");
-  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-  H5Sclose(space);
-  H5Aclose(attr);
-
-  dims[0] = 27;
-  space = H5Screate_simple(1, dims, NULL);
-  attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
-  sprintf(buf, "2nd attribute of dset1.1.1");
-  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
-  H5Sclose(space);
-  H5Aclose(attr);
-
-  H5Dclose(dataset);
-
-  /* dset1.1.2 */
-  dims[0] = 20;
-  space = H5Screate_simple(1, dims, NULL);
-  dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  for (i = 0; i < 20; i++)
-       dset2[i] = i;
-  H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
-  H5Sclose(space);
-  H5Dclose(dataset);
-
-  H5Gclose(group);
-
-  /* external link */
-  H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
-
-  /* soft link */
-  group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
-  H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(group);
-
-  group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
-
-  /* dset2.1 */
-  dims[0] = 10;
-  space = H5Screate_simple(1, dims, NULL);
-  dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  for (i = 0; i < 10; i++)
-       dset2_1[i] = (float)(i*0.1F+1);
-  H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
-  H5Sclose(space);
-  H5Dclose(dataset);
-
-  /* dset2.2 */
-  dims[0] = 3; dims[1] = 5;
-  space = H5Screate_simple(2, dims, NULL);
-  dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  for (i = 0; i < 3; i++)
-       for (j = 0; j < 5; j++)
-            dset2_2[i][j] = (float)((i+1)*j*0.1F);
-  H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
-  H5Sclose(space);
-  H5Dclose(dataset);
-
-  H5Gclose(group);
-
-  /* user-defined link */
-  H5Lregister(UD_link_class);
-  H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT);
-
-  H5Fclose(fid);
-
-  /* If a user block is being used, write to it here */
-  if(ub_size > 0)
-  {
-        HDassert(ub_size <= BUF_SIZE);
-
-  fd = HDopen(filename, O_RDWR, 0);
-        HDassert(fd >= 0);
-
-  /* fill buf with pattern */
-  HDmemset(buf, '\0', ub_size);
-  bp = buf;
-  for (u = 0; u < ub_fill; u++)
-            *bp++ = pattern[u % 10];
-
-  HDwrite(fd, buf, ub_size);
-
-  HDclose(fd);
-  }
-}
-
-static void
-create_textfile(const char *name, size_t size)
-{
-    char *buf;
-    int fd;
-    size_t i;
-    char *bp;
-
-    fd = HDcreat(name,0777);
-    HDassert(fd >= 0);
-    buf = (char *)HDcalloc(size, (size_t)1);
-    HDassert(buf);
-
-    /* fill buf with pattern */
-    bp = buf;
-    for(i = 0; i < size; i++)
-        *bp++ = pattern[i % 10];
-
-    HDwrite(fd, buf, size);
-
-    HDfree(buf);
-
-    HDclose(fd);
-}
-
-#ifdef notdef
-/* not used yet */
-void
-create_binfile(char *name, off_t size)
-{
-    char *buf;
-    int fd;
-    int i;
-    char *bp;
-
-    fd = creat(name,0777);
-    HDassert(fd >= 0);
-
-    buf = HDcalloc(size,1);
-    HDassert(buf);
-
-    /* fill buf with pattern */
-    bp = buf;
-    for (i = 0; i < size; i++)
-        *bp++ = (char) i & 0xff;
-
-    HDwrite(fd,buf,size);
-
-    HDclose(fd);
-}
-#endif
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- *-------------------------------------------------------------------------
- */
-
-
-int main(void)
-{
-
-/*
-create_textfile(UBTXT1, (size_t)0);
-*/
-create_textfile(UBTXT2, (size_t)10);
-create_textfile(UBTXT3, (size_t)511);
-create_textfile(UBTXT4, (size_t)512);
-create_textfile(UBTXT5, (size_t)513);
-/*
-create_textfile(UBTXT6, (size_t)1023);
-create_textfile(UBTXT7, (size_t)1024);
-create_textfile(UBTXT8, (size_t)1025);
-create_textfile(UBTXT9, (size_t)2047);
-create_textfile(UBTXT10, (size_t)2048);
-create_textfile(UBTXT11, (size_t)2049);
-
-create_binfile(UBBIN1, (off_t)0);
-create_binfile(UBBIN2, (off_t)10);
-create_binfile(UBBIN3, (off_t)511);
-create_binfile(UBBIN4, (off_t)512);
-create_binfile(UBBIN5, (off_t)513);
-
-*/
-    gent_ub(FILE7, (size_t)0, (size_t)0);
-    gent_ub(FILE8, (size_t)512, HDstrlen(pattern));
-    gent_ub(FILE9, (size_t)1024, (size_t)513);
-
-    return 0;
-}
diff --git a/tools/h5jam/h5unjam.c b/tools/h5jam/h5unjam.c
deleted file mode 100644
index 8e4eac4..0000000
--- a/tools/h5jam/h5unjam.c
+++ /dev/null
@@ -1,409 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5unjam"
-
-#define COPY_BUF_SIZE 1024
-
-hsize_t write_pad( int , hsize_t );
-hsize_t compute_pad( hsize_t );
-herr_t copy_to_file( FILE *, FILE * , ssize_t, ssize_t );
-
-int do_delete = FALSE;
-char *output_file = NULL;
-char *input_file = NULL;
-char *ub_file = NULL;
-
-/*
- * Command-line options: The user can specify short or 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 = "hu:i:o:d:V";
-static struct long_options l_opts[] = {
-    { "help", no_arg, 'h' },
-    { "hel", no_arg, 'h' },
-    {"i", require_arg, 'i'},    /* input file */
-    {"u", require_arg, 'u'},    /* user block file */
-    {"o", require_arg, 'o'},    /* output file */
-    {"delete", no_arg, 'd'},    /* delete ub */
-    {"delet", no_arg, 'd'},
-    {"dele", no_arg, 'd'},
-    {"del", no_arg, 'd'},
-    {"de", no_arg, 'd'},
-    { NULL, 0, '\0' }
-};
-
-/*-------------------------------------------------------------------------
- * Function:    usage
- *
- * Purpose:     Print the usage message
- *
- * Return:      void
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage(const char *prog)
-{
-    HDfflush(stdout);
-    HDfprintf(stdout,
-    "usage: %s -i <in_file.h5>  [-o <out_file.h5> ] [-u <out_user_file> | --delete]\n", prog);
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout,
-    "Splits user file and HDF5 file into two files: user block data and HDF5 data.\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout,
-    "OPTIONS\n");
-    HDfprintf(stdout,
-    "  -i in_file.h5   Specifies the HDF5 as input.  If the input HDF5 file\n");
-    HDfprintf(stdout,
-    "                  contains no user block, exit with an error message.\n");
-    HDfprintf(stdout,
-    "  -o out_file.h5  Specifies output HDF5 file without a user block.\n");
-    HDfprintf(stdout,
-    "                  If not specified, the user block will be removed from the\n");
-    HDfprintf(stdout,
-    "                  input HDF5 file.\n");
-    HDfprintf(stdout,
-    "  -u out_user_file\n");
-    HDfprintf(stdout,
-    "                  Specifies the output file containing the data from the\n");
-    HDfprintf(stdout,
-    "                  user block.\n");
-    HDfprintf(stdout,
-    "                  Cannot be used with --delete option.\n");
-    HDfprintf(stdout,
-    "  --delete        Remove the user block from the input HDF5 file. The content\n");
-    HDfprintf(stdout,
-    "                  of the user block is discarded.\n");
-    HDfprintf(stdout,
-    "                  Cannot be used with the -u option.\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout,
-    "  -h              Prints a usage message and exits.\n");
-    HDfprintf(stdout,
-    "  -V              Prints the HDF5 library version and exits.\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout,
-    "  If neither --delete nor -u is specified, the user block from the input file\n");
-    HDfprintf(stdout,
-    "  will be displayed to stdout.\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout,
-    "Exit Status:\n");
-    HDfprintf(stdout,
-    "  0      Succeeded.\n");
-    HDfprintf(stdout,
-    "  >0    An error occurred.\n");
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_command_line
- *
- * Purpose:     Parse the command line for the h5dumper.
- *
- * Return:      Success:    EXIT_SUCCESS;
- *
- *              Failure:    Exits function with EXIT_FAILURE value.
- *
- *-------------------------------------------------------------------------
- */
-static int
-parse_command_line(int argc, const char *argv[])
-{
-    int opt = FALSE;
-	
-   /* parse command line options */
-    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
-        switch((char)opt) {
-            case 'o':
-                output_file = HDstrdup(opt_arg);
-				if (output_file)
-				    h5tools_set_data_output_file(output_file, 1);
-	            break;
-
-            case 'i':
-                input_file = HDstrdup(opt_arg);
-				if (input_file)
-   				    h5tools_set_input_file(input_file, 1);
-	            break;;
-
-            case 'u':
-                ub_file = HDstrdup(opt_arg);
-				if (ub_file)
-				    h5tools_set_output_file(ub_file, 1);
-				else 
-				    rawoutstream = stdout;			
-                break;
-
-            case 'd':
-                do_delete = TRUE;
-                break;
-
-            case 'h':
-                usage(h5tools_getprogname());
-                h5tools_setstatus(EXIT_SUCCESS);
-                goto done;
-
-            case 'V':
-                print_version (h5tools_getprogname());
-                h5tools_setstatus(EXIT_SUCCESS);
-                goto done;
-
-            case '?':
-            default:
-                usage(h5tools_getprogname());
-                h5tools_setstatus(EXIT_FAILURE);
-                goto done;
-        }
-    }
-
-    return EXIT_SUCCESS;
-    
-done:
-    if(input_file)
-        HDfree(input_file);
-    if(output_file)
-        HDfree(output_file);
-    if(ub_file)
-        HDfree(ub_file);
-
-    return EXIT_FAILURE;
-}
-
-/*-------------------------------------------------------------------------
- * Function:    main
- *
- * Purpose:     HDF5 user block unjammer
- *
- * Return:      Success:    0
- *              Failure:    1
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, const char *argv[])
-{
-    void               *edata;
-    H5E_auto2_t         func;
-    hid_t               ifile = -1;
-    hid_t               plist = -1;
-    off_t               fsize;
-    hsize_t             usize;
-    htri_t              testval;
-    herr_t              status;
-    int                 res;
-    h5_stat_t           sbuf;
-
-    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();
-
-    if(EXIT_FAILURE == parse_command_line(argc, argv))
-        goto done;
-
-    if (input_file == NULL) {
-        /* no user block  */
-        error_msg("missing arguemnt for HDF5 file input.\n");
-        help_ref_msg(stderr);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-  
-    testval = H5Fis_hdf5(input_file);
-
-    if (testval <= 0) {
-        error_msg("Input HDF5 file \"%s\" is not HDF\n", input_file);
-        help_ref_msg (stderr);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    ifile = H5Fopen(input_file, H5F_ACC_RDONLY , H5P_DEFAULT);
-
-    if (ifile < 0) {
-        error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    plist = H5Fget_create_plist(ifile);
-    if (plist < 0) {
-        error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    status = H5Pget_userblock(plist, & usize);
-    if (status < 0) {
-        error_msg("Can't get user block for file \"%s\"\n", input_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    status = H5Pclose(plist);
-    HDassert(status >= 0);
-    status = H5Fclose(ifile);
-    HDassert(status >= 0);
-
-    if (usize == 0) {
-  /* no user block to remove: message? */
-        error_msg("\"%s\" has no user block: no change to file\n", input_file);
-        h5tools_setstatus(EXIT_SUCCESS);
-        goto done;
-    }
-
-    res = HDfstat(HDfileno(rawinstream), &sbuf);
-    if(res < 0) {
-        error_msg("Can't stat file \"%s\"\n", input_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    fsize = sbuf.st_size;
-
-    if (do_delete && (ub_file != NULL)) {
-        error_msg("??\"%s\"\n", ub_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
-
-    if (output_file == NULL) {
-            error_msg("unable to open output HDF5 file \"%s\"\n", input_file);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-    } 
-
-    /* copy from 0 to 'usize - 1' into ufid  */
-    if (!do_delete) {
-        if(copy_to_file(rawinstream, rawoutstream, 0, (ssize_t) usize) < 0) {
-            error_msg("unable to copy user block to output file \"%s\"\n", ub_file);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        }
-    }
-
-    /* copy from usize to end of file into h5fid,
-     * starting at end of user block if present */
-   if(copy_to_file(rawinstream, rawdatastream, (ssize_t) usize, (ssize_t)(fsize - (ssize_t)usize)) < 0) {
-        error_msg("unable to copy hdf5 data to output file \"%s\"\n", output_file);
-        h5tools_setstatus(EXIT_FAILURE);
-        goto done;
-    }
- 
-done:
-    if(input_file)
-        HDfree(input_file);
-		
-    if(output_file)
-        HDfree(output_file);
-		
-    if(ub_file) {
-        HDfree(ub_file);
-    }
-	   
-    h5tools_close();
-
-    return h5tools_getstatus();
-}
-
-/*
- *  Copy 'how_much' bytes from the input file to the output file,
- *  starting at byte 'where' in the input file.
- *
- *  Returns 0 on success, -1 on failure.
- */
-herr_t
-copy_to_file( FILE *infid, FILE *ofid, ssize_t _where, ssize_t how_much )
-{
-    static char buf[COPY_BUF_SIZE];
-    off_t where = (off_t)_where;
-    off_t to;
-    off_t from;
-    herr_t ret_value = 0;
-
-    /* nothing to copy */
-    if(how_much <= 0)
-        goto done;
-
-    /* rewind */
-    HDfseek(infid, 0L, 0);
-
-    from = where;
-    to = 0;
-    while(how_much > 0) {
-        size_t bytes_in        = 0;    /* # of bytes to read       */
-        size_t bytes_read      = 0;    /* # of bytes actually read */
-        size_t bytes_wrote     = 0;    /* # of bytes written   */
-
-        if (how_much > COPY_BUF_SIZE)
-            bytes_in = COPY_BUF_SIZE;
-        else
-            bytes_in = how_much;
-
-			/* Seek to correct position in input file */
-        HDfseek(infid, from, SEEK_SET);
-
-        /* Read data to buffer */
-        bytes_read = HDfread(buf, (size_t)1, bytes_in, infid);
-        if(0 == bytes_read && HDferror(infid)) {
-            ret_value = -1;
-            goto done;
-        } /* end if */
-        if(0 == bytes_read && HDfeof(infid)) {
-            goto done;
-        } /* end if */
-
-        /* Seek to correct position in output file */
-        HDfseek(ofid, to, SEEK_SET);
-
-        /* Update positions/size */
-        how_much -= bytes_read;
-        from += bytes_read;
-        to += bytes_read;
-
-       /* Write nchars bytes to output file */
-		bytes_wrote = HDfwrite(buf, (size_t)1, bytes_read, ofid);
-		if(bytes_wrote != bytes_read || (0 == bytes_wrote && HDferror(ofid))) { /* error */
-			ret_value = -1;
-			goto done;
-		} /* end if */
-    } /* end while */
-
-done:
-    return ret_value;
-}  /* end copy_to_file */
-
diff --git a/tools/h5jam/tellub.c b/tools/h5jam/tellub.c
deleted file mode 100644
index b4f87af..0000000
--- a/tools/h5jam/tellub.c
+++ /dev/null
@@ -1,196 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdio.h>
-
-#ifdef H5_HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* Name of tool */
-#define PROGRAMNAME "tellub"
-
-/*
- * Command-line options: The user can specify short or 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 = "h";
-static struct long_options l_opts[] = {
-  {"help", no_arg, 'h'},
-  {"hel", no_arg, 'h'},
-  {NULL, 0, '\0'}
-};
-
-/*-------------------------------------------------------------------------
- * Function:    usage
- *
- * Purpose:     Print the usage message
- *
- * Return:      void
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (const char *prog)
-{
-  fflush (stdout);
-  fprintf (stdout, "usage: %s h5_file\n", prog);
-  fprintf (stdout,
-     "           Check that h5_fil is HDF5 file and print size of user block \n");
-  fprintf (stdout, "       %s -h\n", prog);
-  fprintf (stdout, "           Print a usage message and exit\n");
-}
-
-/*-------------------------------------------------------------------------
- * Function:    parse_command_line
- *
- * Purpose:     Parse the command line for the h5dumper.
- *
- * Return:      Success:
- *
- *              Failure:    Exits program with EXIT_FAILURE value.
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-static void
-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 'h':
-        usage (h5tools_getprogname());
-        exit (EXIT_SUCCESS);
-      case '?':
-      default:
-        usage (h5tools_getprogname());
-        exit (EXIT_FAILURE);
-      }
-    }
-
-  /* check for file name to be processed */
-  if (argc <= opt_ind)
-    {
-      error_msg("missing file name\n");
-      usage (h5tools_getprogname());
-      exit (EXIT_FAILURE);
-    }
-}
-
-/*-------------------------------------------------------------------------
- * Function:    main
- *
- * Purpose:     HDF5 user block unjammer
- *
- * Return:      Success:    0
- *              Failure:    1
- *
- * Programmer:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main (int argc, const char *argv[])
-{
-  char *ifname;
-  void *edata;
-  H5E_auto2_t func;
-  hid_t ifile;
-  hsize_t usize;
-  htri_t testval;
-  herr_t status;
-  hid_t plist;
-
-  h5tools_setprogname(PROGRAMNAME);
-  h5tools_setstatus(EXIT_SUCCESS);
-
-  /* Initialize h5tools lib */
-  h5tools_init();
-
-  /* Disable error reporting */
-  H5Eget_auto2(H5E_DEFAULT, &func, &edata);
-  H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-
-  parse_command_line (argc, argv);
-
-  if (argc <= (opt_ind))
-    {
-      error_msg("missing file name\n");
-      usage (h5tools_getprogname());
-      return (EXIT_FAILURE);
-    }
-
-  ifname = HDstrdup (argv[opt_ind]);
-
-  testval = H5Fis_hdf5 (ifname);
-
-  if (testval <= 0)
-    {
-      error_msg("Input HDF5 file is not HDF \"%s\"\n", ifname);
-      return (EXIT_FAILURE);
-    }
-
-  ifile = H5Fopen (ifname, H5F_ACC_RDONLY, H5P_DEFAULT);
-
-  if (ifile < 0)
-    {
-      error_msg("Can't open input HDF5 file \"%s\"\n", ifname);
-      return (EXIT_FAILURE);
-    }
-
-  plist = H5Fget_create_plist (ifile);
-  if (plist < 0)
-    {
-      error_msg("Can't get file creation plist for file \"%s\"\n",
-     ifname);
-      return (EXIT_FAILURE);
-    }
-
-  status = H5Pget_userblock (plist, &usize);
-  if (status < 0)
-    {
-      error_msg("Can't get user block for file \"%s\"\n", ifname);
-      return (EXIT_FAILURE);
-    }
-
-  printf ("%ld\n", (long) usize);
-
-  H5Pclose (plist);
-  H5Fclose (ifile);
-
-  return (EXIT_SUCCESS);
-}
-
diff --git a/tools/h5jam/testh5jam.sh.in b/tools/h5jam/testh5jam.sh.in
deleted file mode 100644
index 1664d6b..0000000
--- a/tools/h5jam/testh5jam.sh.in
+++ /dev/null
@@ -1,699 +0,0 @@
-#! /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 h5jam/h5unjam tools
-
-srcdir=@srcdir@
-
-# Determine which filters are available
-USE_FILTER_SZIP="@USE_FILTER_SZIP@"
-USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
-
-TESTNAME=h5jam/h5unjam
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-DUMPER=h5dump               # The dumper to use
-DUMPER_BIN=`pwd`/../$DUMPER    # The path of the dumper binary
-JAM=h5jam                     # Tool to test
-UNJAM=h5unjam                     # Tool to test
-JAM_BIN="$RUNSERIAL "`pwd`    # The path of the jam binary
-UNJAM_BIN=`pwd`    # The path of the jam binary
-
-RM='rm -rf'
-CMP='cmp -s'
-DIFF='diff -c'
-AWK='awk'
-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"
-
-TESTDIR=./testfiles
-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_H5JAM_TESTFILES/tall.h5
-$SRC_H5JAM_TESTFILES/twithub.h5
-$SRC_H5JAM_TESTFILES/twithub513.h5
-"
-LIST_OTHER_TEST_FILES="
-$SRC_H5JAM_TESTFILES/u10.txt
-$SRC_H5JAM_TESTFILES/u511.txt
-$SRC_H5JAM_TESTFILES/u512.txt
-$SRC_H5JAM_TESTFILES/u513.txt
-$SRC_H5JAM_TESTFILES/h5jam-help.txt
-$SRC_H5JAM_TESTFILES/h5unjam-help.txt
-$SRC_H5JAM_TESTFILES/h5jam-ub-nohdf5.txt
-"
-
-# Source in the output filter function definitions.
-. $srcdir/../../bin/output_filter.sh
-
-#
-# 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'
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Compare".
-#
-COMPARE() {
-   SPACES="                                                               "
-   echo "Compare $* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# Print a "SKIP" message
-SKIP() {
- TESTING $JAM $@
- echo  " -SKIP-"
-}
-
-# 
-#  COMPARE_FILES a.h5 b.h5
-#    Compare two files, skipping the first line.  This is used to 
-#    compare the output of the dumper, skipping the file name which
-#    is different.
-#    The result is stored in 'compval'.
-#
-cmpval=0;
-COMPARE_FILES() {
-	$AWK 'NR > 1' $1 > $1.cmp
-	$AWK 'NR > 1' $2 > $2.cmp
- 	$CMP $1.cmp $2.cmp 
- 	cmpval=$?
-        rm -f $1.cmp $2.cmp
-}
-
-#  CLEANUP files
-#     Clean up named files.
-CLEANUP() {
-   if test -z "$HDF5_NOCLEANUP"; then
-	for i in $*
-	do
-		rm -f $i
-	done
-   fi
-}
-
-#  SETUP file tocopy
-#    Clone a standard input file in the test directory
-#  Modification:
-#    Was using "cp" command which means file $2 will inherit the permission
-#    setting of file $1.  If $1 is read-only, so will $2.  That will cause
-#    failure when the test attempts to write it later on.  Changed to use
-#    the "cat" command.
-#
-SETUP() {
-	cat < $1 > $2
-}
-
-#
-#  CHECKFILE orig.h5 compar.h5
-#     Check that the test file is the same as an original.
-#     The two files are dumped with the dumper, and the output
-#     compared with COMPARE_FILES.
-#     If the files are the same, the test reports " PASSED",
-#     otherwise, it reports "*FAILED*"
-CHECKFILE() {
-   expected="`dirname $2`/`basename $2 .h5`.out"
-   expected_err="`dirname $2`/`basename $2 .h5`.err"
-   actual="`basename $1 .h5`.out"
-   actual_err="`basename $1 .h5`.err"
-
-   $RUNSERIAL $DUMPER_BIN/$DUMPER $1 >$expected 2>$expected_err
-   cat $expected_err >> $expected
-
-   # dump the test file
-   COMPARE $2 to $1
-   $RUNSERIAL $DUMPER_BIN/$DUMPER $2 >$actual 2>$actual_err
-   cat $actual_err >> $actual
-
-   # compare the two files (ignore line 1)
-   COMPARE_FILES $actual $expected
-   if [ "$cmpval" = 0 ] ; then
-      echo " PASSED"
-   else
-      echo "*FAILED*"
-      echo "    Expected result (*.ddl) differs from actual result (*.out)"
-      nerrors="`expr $nerrors + 1`"
-      test yes = "$verbose" && $DIFF $expected $actual |sed 's/^/    /'
-   fi
-
-   # Clean up output files
-   if test -z "$HDF5_NOCLEANUP"; then
-      rm -f $actual $actual_err
-      rm -f $expected $expected_err
-   fi
-}
-
-#
-# CHECK_UB file.h5 user_block_file origfile.h5 
-#
-#   Check the user block in 'file.h5' is the same as
-#   'user_block' (allowing for padding).
-#
-#   If the original file had a user block before the test
-#   then 'compare.h5' is passed.  The user block must be extracted
-#   and the test file compared to:
-#      cat compare_ub user_block_file.
-#
-#   This test uses './getub' to extract the user block from 
-#   'file.h5', which is compared to the file described above.
-#
-#   The result is set in variable 'result1'.
-#
-result1=0;
-CHECK_UB_1() {
-	hfile="$1"
-	ufile="$2"
-
-	# check for third argument (the original file)
-	origfile="";
-	if [ -n "$3" ];
-	then
-		origfile="$3"
-	fi
-
-	# find the length of the user block to check
-	s1=`cat $ufile | wc -c | sed -e 's/ //g'`
-	if [ "$s1" = "0" ];
-	then
-		echo "File "$ufile" is empty"
-		result1=1;
-	fi
-
-	# Get the size of the original user block, if any.
-	if [ -n "$origfile" ];
-	then
-		# 'tellub' calls H5Fget_user_block to get the size
-		#  of the user block
-		s2=`$JAM_BIN/tellub $origfile`
-		if [ "$s2" = "0" ];
-		then
-			size=$s1;
-			cmpfile=$ufile
-		else
-			cmpfile="tt2"
-			size=`expr $s2 + $s1`
-			$JAM_BIN/getub -c $s2 $origfile > $cmpfile
-			cat $ufile >> $cmpfile
-		fi
-	else
-		# assume no user block
-		s2="0"
-		size=$s1;
-		cmpfile=$ufile
-	fi
-
-	# Extract 'size' bytes from the front of 'hfile'
-	# Compare to 'cmpfile', result is set in result1
-	tfile="tt1"
-	$JAM_BIN/getub -c $size $hfile > $tfile
-	res=`cmp $cmpfile $tfile`
-	if [ "$?" != "0" ];
-	then
-		echo $res
-		result1=1;
-	else
-		result1=0;
-	fi
-
-	# clean up
-	rm -f  $tfile
-	if [ "$s2" != "0" ] ;
-	then
-		rm -f $cmpfile
-	fi
-}
-
-
-#  CHECK_NOUB file.h5
-#
-#  Check that 'file.h5' has no user block.
-#  Setst result2 to 1 if there is a user block (fail), 0 if none (pass)
-
-result2=0;
-
-CHECK_NOUB() {
-	hfile="$1"
-
-	# call 'ubsize' to get the size of the user block
-	ubsize=`$JAM_BIN/tellub $hfile`
-
-	if [ "$?" != "0" ];
-	then
-		# error
-		result2=1;
-	else
-	if [ "$ubsize" = "0" ];
-	then
-		# pass
-		result2=0;
-	else
-		# fail
-		result2=1;
-	fi
-	fi
-}
-
-#  JAMTEST user_block file.h5 [--clobber] [ofile.h5]
-#
-#    Test the 'jam' tool:
-#      1. figure out the input and output, and the comparision
-#         that will be done.
-#      2. call 'jam' with the appropriate arguments
-#      3. check the user block is correct in the output (Check_UB)
-#    If the user block is correct, print "PASSED", else "*FAILED*"
-JAMTEST() {
-	ufile="$1"
-	ifile="$2"
-	compare_test=""   # the file to test
-	compare_orig=""   # the comparison to test against
-	cleanup=""
-
-	# sort out the arguments for the test and the check
-	do_clobber="no"
-	if [ "$3" = "--clobber" ];
-	then
-		#  clobber overwrites any existing user block
-		do_clobber="yes"
-		clobber="--clobber"
-		compare_orig=""
-		if [ -z "$4" ];
-		then
-			# output goes to infile, compare ubfile to infile
-			ofile=""
-			compare_test="$ifile"
-		else
-			# output goes to $4,  compare ofile to ubfile
-			ofile="$4"
-			compare_test="$ofile"
-		fi
-	else
-		clobber=""
-		# add user block to existing ub, if any 
-		if [ -z "$3" ];
-		then
-			# output goes to infile, compare ubfile to infile
-			ofile=""
-			compare_test="$ifile"
-			cp $ifile xxofile.h5
-			compare_orig="xxofile.h5"
-			cleanup="$cleanup $compare_orig"
-		else
-			# output goes to $3,  compare ofile to ubfile
-			ofile="$3"
-			compare_test="$ofile"
-			compare_orig="$ifile"
-		fi
-	fi
-
-	# call 'jam' with the appropriate arguments
-	if [ -n "$ofile" ];
-	then
-		TESTING h5jam -u `basename $ufile` -i `basename $ifile` -o `basename $ofile` $clobber
-		$JAM_BIN/$JAM -u $ufile -i $ifile -o $ofile $clobber
-	else
-		TESTING jam -u `basename $ufile` -i `basename $ifile` $clobber
-		$JAM_BIN/$JAM -u $ufile -i $ifile $clobber
-	fi
-
-	#echo "CHECK_UB_1 $compare_test $ufile $compare_orig"
-	CHECK_UB_1 $compare_test $ufile $compare_orig
-
-	if [ "$result1" = "0" ] ;
-	then
-		echo " PASSED"
-	else
-		echo " *FAILED*"
-      		nerrors="`expr $nerrors + 1`"
-	fi
- 	CLEANUP $cleanup
-}
-	
-# UNJAMTEST  file.h5 [- | --delete] ofile
-#
-#  Test the 'unjam' tool
-#
-###fix the working directory here and in jamtest
-UNJAMTEST () {
-	infile="$1"
-	ofile="$3"
-	if [ "$2" = "-" ];
-	then
-		uofile="uofile"
-		TESTING h5unjam -i `basename $infile` -o `basename $ofile` "> "`basename $uofile`
-		$JAM_BIN/$UNJAM -i $infile -o $ofile > $uofile
-	else
-	if [ "$2" = "--delete" ];
-	then
-		uofile="none"
-		TESTING h5unjam -i `basename $infile` -o `basename $ofile` --delete
-		$JAM_BIN/$UNJAM  -i $infile -o $ofile --delete 
-
-	else
-		uofile="$2"
-		TESTING h5unjam -i `basename $infile` -u `basename $uofile` -o `basename $ofile`
-		$JAM_BIN/$UNJAM  -i $infile -u $uofile -o $ofile
-	fi
-	fi
-
-	result1=0
-	result2=0
-	cleanup=""
-	if [ "$uofile" != "none" ];
-	then
-		# sets result1
-		CHECK_UB_1 $infile $uofile
-		CLEANUP $uofile
-	fi
-
-	# sets result2
-	CHECK_NOUB $ofile
-
-	if [ "$result1" = "0" -a "$result2" = "0" ];
-	then
-		echo " PASSED"
-	else
-		echo " *FAILED*"
-	      nerrors="`expr $nerrors + 1`"
-	fi
-}
-
-
-#
-# TOOLTEST_OUTPUT < JAM | UNJAM > expect-output.txt exit-code options
-#
-# Only verify stdout/stderr output from h5jam and j5unjam
-#
-
-TOOLTEST_OUTPUT() {
-    if [ "$1" == "JAM" ]; then
-        TOOLCMD=$JAM_BIN/$JAM
-    elif [ "$1" == "UNJAM" ]; then
-        TOOLCMD=$JAM_BIN/$UNJAM
-    fi
-    shift
-    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
-
-    TESTING h5jam $@
-    (
-        cd $TESTDIR
-        $TOOLCMD "$@"
-    ) >$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
-    # combine stderr to stdout for output compare 
-    cat $actual_err >> $actual
-
-    if [ ! -f $expect ]; then
-	    # Create the expect file if it doesn't yet exist.
-        echo " CREATED"
-        cp $actual $expect
-	    rm -f $actual $actual_sav $actual_err $actual_err_sav
-    elif $CMP $expect $actual; then
-        echo " PASSED"
-	    rm -f $actual $actual_sav $actual_err $actual_err_sav
-    else
-        echo "*FAILED*"
-	    echo "    Expected result differs from actual result"
-	    nerrors="`expr $nerrors + 1`"
-        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
-    fi
-}
-
-##############################################################################
-##############################################################################
-###			  T H E   T E S T S                                ###
-##############################################################################
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-#-------------------------------
-# Testing h5jam
-#-------------------------------
-# help page
-TOOLTEST_OUTPUT JAM h5jam-help.txt 0 -h
-
-# don't allow HDF5 format file as an user block file
-TOOLTEST_OUTPUT JAM h5jam-ub-nohdf5.txt 1 -i tall.h5 -u tall.h5 -o tall-tmp.h5
-
-JAMTEST $TESTDIR/u10.txt $TESTDIR/tall.h5 ta2.h5
-CHECKFILE $TESTDIR/tall.h5 ta2.h5
-CLEANUP ta2.h5
-JAMTEST $TESTDIR/u511.txt $TESTDIR/tall.h5 ta3.h5
-CHECKFILE $TESTDIR/tall.h5 ta3.h5
-CLEANUP ta3.h5
-JAMTEST $TESTDIR/u512.txt $TESTDIR/tall.h5 ta4.h5
-CHECKFILE $TESTDIR/tall.h5 ta4.h5
-CLEANUP ta4.h5
-JAMTEST $TESTDIR/u513.txt $TESTDIR/tall.h5 ta5.h5
-CHECKFILE $TESTDIR/tall.h5 ta5.h5
-CLEANUP ta5.h5
-
-SETUP $TESTDIR/tall.h5 ta6.h5
-JAMTEST $TESTDIR/u10.txt ta6.h5 
-CHECKFILE $TESTDIR/tall.h5 ta6.h5
-CLEANUP ta6.h5
-SETUP $TESTDIR/tall.h5 ta7.h5
-JAMTEST $TESTDIR/u511.txt ta7.h5 
-CHECKFILE $TESTDIR/tall.h5 ta7.h5
-CLEANUP ta7.h5
-SETUP $TESTDIR/tall.h5 ta8.h5
-JAMTEST $TESTDIR/u512.txt ta8.h5 
-CHECKFILE $TESTDIR/tall.h5 ta8.h5
-CLEANUP ta8.h5
-SETUP $TESTDIR/tall.h5 ta9.h5
-JAMTEST $TESTDIR/u513.txt ta9.h5 
-CHECKFILE $TESTDIR/tall.h5 ta9.h5
-CLEANUP ta9.h5
-
-JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub.h5 tax2.h5
-CHECKFILE $TESTDIR/tall.h5 tax2.h5
-CLEANUP tax2.h5
-JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub.h5 tax3.h5
-CHECKFILE $TESTDIR/tall.h5 tax3.h5
-CLEANUP tax3.h5
-JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub.h5 tax4.h5
-CHECKFILE $TESTDIR/tall.h5 tax4.h5
-CLEANUP tax4.h5
-JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub.h5 tax5.h5
-CHECKFILE $TESTDIR/tall.h5 tax5.h5
-CLEANUP tax5.h5
-
-JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub513.h5 tax6.h5
-CHECKFILE $TESTDIR/tall.h5 tax6.h5
-CLEANUP tax6.h5
-JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub513.h5 tax7.h5
-CHECKFILE $TESTDIR/tall.h5 tax7.h5
-CLEANUP tax7.h5
-JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub513.h5 tax8.h5
-CHECKFILE $TESTDIR/tall.h5 tax8.h5
-CLEANUP tax8.h5
-JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub513.h5 tax9.h5
-CHECKFILE $TESTDIR/tall.h5 tax9.h5
-CLEANUP tax9.h5
-
-JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub.h5 --clobber taz2.h5 
-CHECKFILE $TESTDIR/tall.h5 taz2.h5
-CLEANUP taz2.h5
-JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub.h5 --clobber taz3.h5
-CHECKFILE $TESTDIR/tall.h5 taz3.h5
-CLEANUP taz3.h5
-JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub.h5 --clobber taz4.h5 
-CHECKFILE $TESTDIR/tall.h5 taz4.h5
-CLEANUP taz4.h5
-JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub.h5 --clobber taz5.h5 
-CHECKFILE $TESTDIR/tall.h5 taz5.h5
-CLEANUP taz5.h5
-
-JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub513.h5 --clobber taz6.h5 
-CHECKFILE $TESTDIR/tall.h5 taz6.h5
-CLEANUP taz6.h5
-JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub513.h5 --clobber taz7.h5
-CHECKFILE $TESTDIR/tall.h5 taz7.h5
-CLEANUP taz7.h5
-JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub513.h5 --clobber taz8.h5 
-CHECKFILE $TESTDIR/tall.h5 taz8.h5
-CLEANUP taz8.h5
-JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub513.h5 --clobber taz9.h5 
-CHECKFILE $TESTDIR/tall.h5 taz9.h5
-CLEANUP taz9.h5
-
-SETUP $TESTDIR/twithub.h5 tay2.h5
-JAMTEST $TESTDIR/u10.txt tay2.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay2.h5
-CLEANUP tay2.h5
-SETUP $TESTDIR/twithub.h5 tay3.h5
-JAMTEST $TESTDIR/u511.txt tay3.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay3.h5
-CLEANUP tay3.h5
-SETUP $TESTDIR/twithub.h5 tay4.h5
-JAMTEST $TESTDIR/u512.txt tay4.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay4.h5
-CLEANUP tay4.h5
-SETUP $TESTDIR/twithub.h5 tay5.h5
-JAMTEST $TESTDIR/u513.txt tay5.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay5.h5
-CLEANUP tay5.h5
-
-SETUP $TESTDIR/twithub513.h5 tay6.h5
-JAMTEST $TESTDIR/u10.txt tay6.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay6.h5
-CLEANUP tay6.h5
-SETUP $TESTDIR/twithub513.h5 tay7.h5
-JAMTEST $TESTDIR/u511.txt tay7.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay7.h5
-CLEANUP tay7.h5
-SETUP $TESTDIR/twithub513.h5 tay8.h5
-JAMTEST $TESTDIR/u512.txt tay8.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay8.h5
-CLEANUP tay8.h5
-SETUP $TESTDIR/twithub513.h5 tay9.h5
-JAMTEST $TESTDIR/u513.txt tay9.h5 --clobber
-CHECKFILE $TESTDIR/tall.h5 tay9.h5
-CLEANUP tay9.h5
-
-#---------------------------------
-# Testing h5unjam 
-#---------------------------------
-# help page
-TOOLTEST_OUTPUT UNJAM h5unjam-help.txt 0 -h
-
-SETUP $TESTDIR/twithub.h5 tai1.h5
-UNJAMTEST tai1.h5 o10.txt taa1.h5
-CHECKFILE $TESTDIR/tall.h5 taa1.h5
-CLEANUP taa1.h5 tai1.h5 o10.txt
-SETUP $TESTDIR/twithub513.h5 tai2.h5
-UNJAMTEST tai2.h5 o512.txt taa2.h5
-CHECKFILE $TESTDIR/tall.h5 taa2.h5
-CLEANUP taa2.h5 tai2.h5 o512.txt
-
-SETUP $TESTDIR/twithub.h5 tai3.h5
-UNJAMTEST tai3.h5 - taa3.h5
-CHECKFILE $TESTDIR/tall.h5 taa3.h5
-CLEANUP taa3.h5 tai3.h5
-SETUP $TESTDIR/twithub513.h5 tai4.h5
-UNJAMTEST tai4.h5 - taa4.h5
-CHECKFILE $TESTDIR/tall.h5 taa4.h5
-CLEANUP taa4.h5 tai4.h5
-
-SETUP $TESTDIR/twithub.h5 taj2.h5
-UNJAMTEST taj2.h5 --delete tac2.h5
-CHECKFILE $TESTDIR/tall.h5 tac2.h5
-CLEANUP tac2.h5 taj2.h5
-SETUP $TESTDIR/twithub513.h5 taj3.h5
-UNJAMTEST taj3.h5 --delete tac3.h5
-CHECKFILE $TESTDIR/tall.h5 tac3.h5
-CLEANUP tac3.h5 taj3.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/h5ls/CMakeLists.txt b/tools/h5ls/CMakeLists.txt
deleted file mode 100644
index 6e7f00c..0000000
--- a/tools/h5ls/CMakeLists.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5LS)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-#-----------------------------------------------------------------------------
-# Add the h5ls executable
-#-----------------------------------------------------------------------------
-add_executable (h5ls ${HDF5_TOOLS_H5LS_SOURCE_DIR}/h5ls.c)
-TARGET_NAMING (h5ls STATIC)
-TARGET_C_PROPERTIES (h5ls STATIC " " " ")
-target_link_libraries (h5ls  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5ls PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES
-    h5ls
-)
-
-if (BUILD_TESTING)
-
-  include (CMakeTests.cmake)
-
-  include (CMakeTestsVDS.cmake)
-
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5ls ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5ls
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5ls/CMakeTests.cmake b/tools/h5ls/CMakeTests.cmake
deleted file mode 100644
index 2e3d398..0000000
--- a/tools/h5ls/CMakeTests.cmake
+++ /dev/null
@@ -1,409 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Copy all the test files from source directory to test directory
-  # --------------------------------------------------------------------
-  set (LIST_HDF5_TEST_FILES
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr2.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcompound.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdatareg.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinktar.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestedcomp.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset_idx.h5
-  )
-
-  set (LIST_OTHER_TEST_FILES
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/help-3.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/nosuchfile.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tarray1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattr2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg_le.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tattrreg_be.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tcomp-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdataregbe.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdataregle.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tempty.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlink-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-3.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-4.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-5.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-6.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-7.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-1-old.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-2-old.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-3-old.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-6-old.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-7-old.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-3.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-4.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-5.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-nodangle-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/textlinksrc-nodangle-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgrp_comments.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsoftlinks-nodangle-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlinks-nodangle-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tgroup-3.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/thlink-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tloop-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tmultifile.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-2.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-3.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tnestcomp-4.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tsaf.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tslink-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tstr-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tudlink-1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes1.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2le.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tvldtypes2be.ls
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tdset_idx.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/${fname}")
-    #message (STATUS " Copying ${listfiles} to ${dest}")
-    add_custom_command (
-        TARGET     h5ls
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${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_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")
-      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/${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"
-              -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-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_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-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove 
-          help-1.out
-          help-1.out.err
-          help-2.out
-          help-2.out.err
-          help-3.out
-          help-3.out.err
-          nosuchfile.out
-          nosuchfile.out.err
-          tall-1.out
-          tall-1.out.err
-          tall-2.out
-          tall-2.out.err
-          tarray1.out
-          tarray1.out.err
-          tattr2.out
-          tattr2.out.err
-          tcomp-1.out
-          tcomp-1.out.err
-          tdataregbe.out
-          tdataregbe.out.err
-          tdataregle.out
-          tdataregle.out.err
-          tdset-1.out
-          tdset-1.out.err
-          tempty.out
-          tempty.out.err
-          textlink-1.out
-          textlink-1.out.err
-          textlinksrc-1.out
-          textlinksrc-1.out.err
-          textlinksrc-2.out
-          textlinksrc-2.out.err
-          textlinksrc-3.out
-          textlinksrc-3.out.err
-          textlinksrc-4.out
-          textlinksrc-4.out.err
-          textlinksrc-5.out
-          textlinksrc-5.out.err
-          textlinksrc-6.out
-          textlinksrc-6.out.err
-          textlinksrc-7.out
-          textlinksrc-7.out.err
-          textlinksrc-1-old.out
-          textlinksrc-1-old.out.err
-          textlinksrc-2-old.out
-          textlinksrc-2-old.out.err
-          textlinksrc-3-old.out
-          textlinksrc-3-old.out.err
-          textlinksrc-6-old.out
-          textlinksrc-6-old.out.err
-          textlinksrc-7-old.out
-          textlinksrc-7-old.out.err
-          tgrp_comments.out
-          tgrp_comments.out.err
-          tsoftlinks-1.out
-          tsoftlinks-1.out.err
-          tsoftlinks-2.out
-          tsoftlinks-2.out.err
-          tsoftlinks-3.out
-          tsoftlinks-3.out.err
-          tsoftlinks-4.out
-          tsoftlinks-4.out.err
-          tsoftlinks-5.out
-          tsoftlinks-5.out.err
-          textlinksrc-nodangle-1.out
-          textlinksrc-nodangle-1.out.err
-          textlinksrc-nodangle-2.out
-          textlinksrc-nodangle-2.out.err
-          tsoftlinks-nodangle-1.out
-          tsoftlinks-nodangle-1.out.err
-          thlinks-nodangle-1.out
-          thlinks-nodangle-1.out.err
-          tgroup.out
-          tgroup.out.err
-          tgroup-1.out
-          tgroup-1.out.err
-          tgroup-2.out
-          tgroup-2.out.err
-          tgroup-3.out
-          tgroup-3.out.err
-          thlink-1.out
-          thlink-1.out.err
-          tloop-1.out
-          tloop-1.out.err
-          tnestcomp-1.out
-          tnestcomp-1.out.err
-          tnestcomp-2.out
-          tnestcomp-2.out.err
-          tnestcomp-3.out
-          tnestcomp-3.out.err
-          tnestcomp-4.out
-          tnestcomp-4.out.err
-          tsaf.out
-          tsaf.out.err
-          tslink-1.out
-          tslink-1.out.err
-          tstr-1.out
-          tstr-1.out.err
-          tudlink-1.out
-          tudlink-1.out.err
-          tvldtypes1.out
-          tvldtypes1.out.err
-          tvldtypes2le.out
-          tvldtypes2le.out.err
-          tvldtypes2be.out
-          tvldtypes2be.out.err
-    )
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5LS-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5LS-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  # test the help syntax
-  ADD_H5_TEST (help-1 0 -w80 -h)
-  ADD_H5_TEST (help-2 0 -w80 --help)
-  ADD_H5_TEST (help-3 0 -w80 -?)
-
-  # test simple command
-  ADD_H5_TEST (tall-1 0 -w80 tall.h5)
-  ADD_H5_TEST (tall-2 0 -w80 -r -d tall.h5)
-  ADD_H5_TEST (tgroup 0 -w80 tgroup.h5)
-  ADD_H5_TEST (tgroup-3 0 -w80 tgroup.h5/g1)
-
-  # test for displaying groups
-  # The following combination of arguments is expected to return an error message
-  # and return value 1
-  ADD_H5_TEST (tgroup-1 1 -w80 -r -g tgroup.h5)
-  ADD_H5_TEST (tgroup-2 0 -w80 -g tgroup.h5/g1)
-
-  # test for files with groups that have long comments
-  ADD_H5_TEST (tgrp_comments 0 -w80 -v -g tgrp_comments.h5/glongcomment)
-
-  # test for displaying simple space datasets
-  ADD_H5_TEST (tdset-1 0 -w80 -r -d tdset.h5)
-
-  # test for displaying soft links (dangle)
-  ADD_H5_TEST (tslink-1 0 -w80 -r tslink.h5)
-
-  # test for displaying more soft links with --follow-symlinks
-  ADD_H5_TEST (tsoftlinks-1 0 --follow-symlinks tsoftlinks.h5)
-  ADD_H5_TEST (tsoftlinks-2 0 --follow-symlinks -r tsoftlinks.h5)
-  ADD_H5_TEST (tsoftlinks-3 0 --follow-symlinks tsoftlinks.h5/group1)
-  ADD_H5_TEST (tsoftlinks-4 0 --follow-symlinks -r tsoftlinks.h5/group1)
-  ADD_H5_TEST (tsoftlinks-5 0 --follow-symlinks tsoftlinks.h5/soft_dset1)
-
-  # test for displaying external and user-defined links with --follow-symlinks
-  ADD_H5_TEST (textlink-1 0 -w80 -r textlink.h5)
-  ADD_H5_TEST (textlinksrc-1 0 -w80 --follow-symlinks -r textlinksrc.h5)
-  ADD_H5_TEST (textlinksrc-2 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5)
-  ADD_H5_TEST (textlinksrc-3 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1)
-  ADD_H5_TEST (textlinksrc-4 0 -w80 -r textlinksrc.h5)
-  ADD_H5_TEST (textlinksrc-5 0 -w80 -r textlinksrc.h5/ext_link1)
-  ADD_H5_TEST (textlinksrc-6 0 -w80 --follow-symlinks textlinksrc.h5)
-  ADD_H5_TEST (textlinksrc-7 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1)
-  ADD_H5_TEST (tudlink-1 0 -w80 -r tudlink.h5)
-
-  # test for displaying external links with -E
-  # the option -E will be depriciated but keep it for backward compatibility
-  ADD_H5_TEST (textlinksrc-1-old 0 -w80 -Er textlinksrc.h5)
-  ADD_H5_TEST (textlinksrc-2-old 0 -w80 -Erv textlinksrc.h5/ext_link5)
-  ADD_H5_TEST (textlinksrc-3-old 0 -w80 -Er textlinksrc.h5/ext_link1)
-  ADD_H5_TEST (textlinksrc-6-old 0 -w80 -E textlinksrc.h5)
-  ADD_H5_TEST (textlinksrc-7-old 0 -w80 -E textlinksrc.h5/ext_link1)
-
-  # tests for no-dangling-links 
-  # if this option is given on dangling link, h5ls should return exit code 1
-  # when used alone , expect to print out help and return exit code 1
-  ADD_H5_TEST (textlinksrc-nodangle-1 1 -w80 --no-dangling-links textlinksrc.h5)
-  # external dangling link - expected exit code 1
-  ADD_H5_TEST (textlinksrc-nodangle-2 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5)
-  # soft dangling link - expected exit code 1
-  ADD_H5_TEST (tsoftlinks-nodangle-1 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5)
-  # when used file with no dangling links - expected exit code 0
-  ADD_H5_TEST (thlinks-nodangle-1 0 -w80 --follow-symlinks --no-dangling-links thlink.h5)
-
-# test for wildcards in filename (does not work with cmake)
-#  ADD_H5_TEST (tstarfile 0 -w80 t*link.h5)
-#  ADD_H5_TEST (tqmarkfile 0 -w80 t?link.h5)
-  ADD_H5_TEST (tmultifile 0 -w80 thlink.h5 tslink.h5)
-
-  # tests for hard links
-  ADD_H5_TEST (thlink-1 0 -w80 thlink.h5)
-
-  # tests for compound data types
-  ADD_H5_TEST (tcomp-1 0 -w80 -r -d tcompound.h5)
-
-  #test for the nested compound type
-  ADD_H5_TEST (tnestcomp-1 0 -w80 -r -d tnestedcomp.h5)
-
-  ADD_H5_TEST (tnestcomp-2 0 -w80 -r -d -S tnestedcomp.h5)
-
-  ADD_H5_TEST (tnestcomp-3 0 -w80 -r -d -l tnestedcomp.h5)
-
-  ADD_H5_TEST (tnestcomp-4 0 -w80 -r -d -l -S tnestedcomp.h5)
-
-  # test for loop detection
-  ADD_H5_TEST (tloop-1 0 -w80 -r -d tloop.h5)
-
-  # test for string
-  ADD_H5_TEST (tstr-1 0 -w80 -r -d tstr.h5)
-
-  # test test file created from lib SAF team
-  ADD_H5_TEST (tsaf 0 -w80 -r -d tsaf.h5)
-
-  # test for variable length data types
-  ADD_H5_TEST (tvldtypes1 0 -w80 -r -d tvldtypes1.h5)
-
-  # test for array data types
-  ADD_H5_TEST (tarray1 0 -w80 -r -d tarray1.h5)
-
-  # test for empty data
-  ADD_H5_TEST (tempty 0 -w80 -d tempty.h5)
-
-  # test for all dataset types written to attributes
-  # enable -S for avoiding printing NATIVE types
-  ADD_H5_TEST (tattr2 0 -w80 -v -S tattr2.h5)
-
-  # test for attribute with region references wo verbose mode
-  # ( HDFFV-7838, )
-  if (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tattrreg_be 0 -w80 -v -d tattrreg.h5)
-  else (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tattrreg_le 0 -w80 -v -d tattrreg.h5)
-  endif (H5_WORDS_BIGENDIAN)
-
-  # test for non-existing file
-  ADD_H5_TEST (nosuchfile 1 nosuchfile.h5)
-
-  # test for variable length data types in verbose mode
-  if (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tvldtypes2be 0 -v tvldtypes1.h5)
-  else (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tvldtypes2le 0 -v tvldtypes1.h5)
-  endif (H5_WORDS_BIGENDIAN)
-
-  # test for dataset region references data types in verbose mode
-  if (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tdataregbe 0 -v tdatareg.h5)
-  else (H5_WORDS_BIGENDIAN)
-    ADD_H5_TEST (tdataregle 0 -v tdatareg.h5)
-  endif (H5_WORDS_BIGENDIAN)
-
-# test for file with datasets that use Fixed Array chunk indices
-#echo "***skip testing tdset_idx.h5"
-#ADD_H5_TEST (tdset_idx 0 -w80 -d tdset_idx.h5)
-  
\ No newline at end of file
diff --git a/tools/h5ls/CMakeTestsVDS.cmake b/tools/h5ls/CMakeTestsVDS.cmake
deleted file mode 100644
index 3e85803..0000000
--- a/tools/h5ls/CMakeTestsVDS.cmake
+++ /dev/null
@@ -1,149 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           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
deleted file mode 100644
index 54a06f1..0000000
--- a/tools/h5ls/Makefile.am
+++ /dev/null
@@ -1,40 +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.
-##
-## 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
-
-# Test programs and scripts
-TEST_SCRIPT=testh5ls.sh testh5lsvds.sh
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5ls$(EXEEXT)
-
-# This is our main target, the h5ls tool
-bin_PROGRAMS=h5ls
-
-# Add h5ls specific linker flags here
-h5ls_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All programs depend on the hdf5 and h5tools libraries
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5ls/Makefile.in b/tools/h5ls/Makefile.in
deleted file mode 100644
index fe76617..0000000
--- a/tools/h5ls/Makefile.in
+++ /dev/null
@@ -1,1456 +0,0 @@
-# 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 = 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5ls.sh testh5lsvds.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-h5ls_SOURCES = h5ls.c
-h5ls_OBJECTS = h5ls.$(OBJEXT)
-h5ls_LDADD = $(LDADD)
-h5ls_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 = 
-h5ls_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5ls_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 = h5ls.c
-DIST_SOURCES = h5ls.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)/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@
-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
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
-
-# Test programs and scripts
-TEST_SCRIPT = testh5ls.sh testh5lsvds.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5ls$(EXEEXT)
-
-# Add h5ls specific linker flags here
-h5ls_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# All programs depend on the hdf5 and h5tools libraries
-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/h5ls/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5ls/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):
-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=; \
-	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
-
-h5ls$(EXEEXT): $(h5ls_OBJECTS) $(h5ls_DEPENDENCIES) $(EXTRA_h5ls_DEPENDENCIES) 
-	@rm -f h5ls$(EXEEXT)
-	$(AM_V_CCLD)$(h5ls_LINK) $(h5ls_OBJECTS) $(h5ls_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5ls.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)
-
-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 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 \
-	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/h5ls/h5ls.c b/tools/h5ls/h5ls.c
deleted file mode 100644
index 91e1c93..0000000
--- a/tools/h5ls/h5ls.c
+++ /dev/null
@@ -1,2941 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Robb Matzke <matzke at llnl.gov>
- *              Monday, March 23, 1998
- */
-
-
-/*
- * We include the private header file so we can get to the uniform
- * programming environment it declares.  Other than that, h5ls only calls
- * HDF5 API functions (except for H5G_basename())
- */
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5tools_dump.h"
-#include "h5trav.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5ls"
-
-#define NAME_BUF_SIZE   2048
-/*
- *  Alternative formating for data dumped by H5LS
- *
- *  This table only affects H5LS output.
- */
-static h5tool_format_t         ls_dataformat = {
-        0, /*raw */
-
-        "", /*fmt_raw */
-        "%d", /*fmt_int */
-        "%u", /*fmt_uint */
-        "%hhd", /*fmt_schar */
-        "%u", /*fmt_uchar */
-        "%d", /*fmt_short */
-        "%u", /*fmt_ushort */
-        "%ld", /*fmt_long */
-        "%lu", /*fmt_ulong */
-        NULL, /*fmt_llong */
-        NULL, /*fmt_ullong */
-        "%g", /*fmt_double */
-        "%g", /*fmt_float */
-
-        0, /*ascii */
-        0, /*str_locale */
-        0, /*str_repeat */
-
-        "[", /*arr_pre */
-        ",", /*arr_sep */
-        "]", /*arr_suf */
-        1, /*arr_linebreak */
-
-        "", /*cmpd_name */
-        ",", /*cmpd_sep */
-        "{", /*cmpd_pre */
-        "}", /*cmpd_suf */
-        "", /*cmpd_end */
-        NULL, /* cmpd_listv */
-
-        ",", /*vlen_sep */
-        "(", /*vlen_pre */
-        ")", /*vlen_suf */
-        "", /*vlen_end */
-
-        "%s", /*elmt_fmt */
-        ",", /*elmt_suf1 */
-        " ", /*elmt_suf2 */
-
-        HSIZE_T_FORMAT, /*idx_n_fmt */
-        ",", /*idx_sep */
-        "(%s)", /*idx_fmt */
-
-        65535, /*line_ncols *//*standard default columns */
-        0, /*line_per_line */
-        "", /*line_pre */
-        "%s", /*line_1st */
-        "%s", /*line_cont */
-        "", /*line_suf */
-        "", /*line_sep */
-        1, /*line_multi_new */
-        "", /*line_indent */
-
-        0, /*skip_first */
-
-        0, /*obj_hidefileno */
-        "-%lu:"H5_PRINTF_HADDR_FMT, /*obj_format */
-
-        0, /*dset_hidefileno */
-        "DSET-%s ", /*dset_format */
-        "%sBlk%lu: ", /*dset_blockformat_pre */
-        "%sPt%lu: ", /*dset_ptformat_pre */
-        "%s", /*dset_ptformat */
-        1, /*array indices */
-        1 /*escape non printable characters */
-};
-
-/* Struct to pass through to visitors */
-typedef struct {
-    const char *fname;                  /* Filename */
-    hid_t fid;                          /* File ID */
-    hid_t gid;                          /* Group ID */
-    hbool_t symlink_target;                 /* Whether this is the target of an symbolic link */
-    symlink_trav_t *symlink_list;       /* List of visited symbolic links */
-    size_t base_len;                    /* Length of base path name, if not root */
-    size_t name_start;                  /* # of leading characters to strip off path names on output */
-}iter_t;
-
-/* Command-line switches */
-static int      verbose_g = 0;            /* lots of extra output */
-static int      width_g = 80;             /* output width in characters */
-static hbool_t  address_g = FALSE;        /* print raw data addresses */
-static hbool_t  data_g = FALSE;           /* display dataset values? */
-static hbool_t  label_g = FALSE;          /* label compound values? */
-static hbool_t  string_g = FALSE;         /* print 1-byte numbers as ASCII? */
-static hbool_t  fullname_g = FALSE;       /* print full path names */
-static hbool_t  recursive_g = FALSE;      /* recursive descent listing */
-static hbool_t  follow_symlink_g = FALSE; /* follow symbolic links */
-static hbool_t  no_dangling_link_g = FALSE; /* treat dangling link is error */
-static hbool_t  follow_elink_g = FALSE;   /* follow external links */
-static hbool_t  grp_literal_g = FALSE;    /* list group, not contents */
-static hbool_t  hexdump_g = FALSE;        /* show data as raw hexadecimal */
-static hbool_t  show_errors_g = FALSE;    /* print HDF5 error messages */
-static hbool_t  simple_output_g = FALSE;  /* make output more machine-readable */
-static hbool_t  show_file_name_g = FALSE; /* show file name for full names */
-static hbool_t  no_line_wrap_g = FALSE;   /* show data content without line wrap */
-static hbool_t  display_root_g = FALSE;   /* show root group in output? */
-
-/* Information about how to display each type of object */
-static struct dispatch_t {
-    const char *name;
-    hid_t (*open)(hid_t loc, const char *name, hid_t apl_id);
-    herr_t (*close)(hid_t obj);
-    herr_t (*list1)(hid_t obj);
-    herr_t (*list2)(hid_t obj, const char *name);
-} dispatch_g[H5O_TYPE_NTYPES];
-
-#define DISPATCH(TYPE, NAME, LIST1, LIST2) {         \
-    dispatch_g[TYPE].name = (NAME);             \
-    dispatch_g[TYPE].list1 = (LIST1);           \
-    dispatch_g[TYPE].list2 = (LIST2);           \
-}
-
-static void print_type(h5tools_str_t *buffer, hid_t type, int ind);
-static hbool_t print_int_type(h5tools_str_t *buffer, hid_t type, int ind);
-static hbool_t print_float_type(h5tools_str_t *buffer, hid_t type, int ind);
-static herr_t visit_obj(hid_t file, const char *oname, iter_t *iter);
-
-

-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: Prints a usage message on stderr and then returns.
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- *              Thursday, July 16, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (void)
-{
-    HDfprintf(rawerrorstream, "\
-usage: %s [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]\n\
-  OPTIONS\n\
-   -h, -?, --help  Print a usage message and exit\n\
-   -a, --address   Print raw data address.  If dataset is contiguous, address\n\
-                   is offset in file of beginning of raw data. If chunked,\n\
-                   returned list of addresses indicates offset of each chunk.\n\
-                   Must be used with -v, --verbose option.\n\
-                   Provides no information for non-dataset objects.\n\
-   -d, --data      Print the values of datasets\n\
-   --enable-error-stack\n\
-                   Prints messages from the HDF5 error stack as they occur.\n\
-   --follow-symlinks\n\
-                   Follow symbolic links (soft links and external links)\n\
-                   to display target object information.\n\
-                   Without this option, h5ls identifies a symbolic link\n\
-                   as a soft link or external link and prints the value\n\
-                   assigned to the symbolic link; it does not provide any\n\
-                   information regarding the target object or determine\n\
-                   whether the link is a dangling link.\n\
-   --no-dangling-links\n\
-                   Must be used with --follow-symlinks option;\n\
-                   otherwise, h5ls shows error message and returns an exit\n\
-                   code of 1. \n\
-                   Check for any symbolic links (soft links or external links)\n\
-                   that do not resolve to an existing object (dataset, group,\n\
-                   or named datatype).\n\
-                   If any dangling link is found, this situation is treated\n\
-                   as an error and h5ls returns an exit code of 1.\n\
-   -f, --full      Print full path names instead of base names\n\
-   -g, --group     Show information about a group, not its contents\n\
-   -l, --label     Label members of compound datasets\n\
-   -r, --recursive List all groups recursively, avoiding cycles\n\
-   -s, --string    Print 1-byte integer datasets as ASCII\n\
-   -S, --simple    Use a machine-readable output format\n\
-   -wN, --width=N  Set the number of columns of output\n\
-   -v, --verbose   Generate more verbose output\n\
-   -V, --version   Print version number and exit\n\
-   --vfd=DRIVER    Use the specified virtual file driver\n\
-   -x, --hexdump   Show raw data in hexadecimal format\n\
-\n\
-  file/OBJECT\n\
-    Each object consists of an HDF5 file name optionally followed by a\n\
-    slash and an object name within the file (if no object is specified\n\
-    within the file then the contents of the root group are displayed).\n\
-    The file name may include a printf(3C) integer format such as\n\
-    \"%%05d\" to open a file family.\n\
-\n\
-  Deprecated Options\n\
-    The following options have been deprecated in HDF5. While they remain\n\
-    available, they have been superseded as indicated and may be removed\n\
-    from HDF5 in the future. Use the indicated replacement option in all\n\
-    new work; where possible, existing scripts, et cetera, should also be\n\
-    updated to use the replacement option.\n\
-\n\
-   -E or --external   Follow external links.\n\
-                      Replaced by --follow-symlinks.\n\
-   -e, --errors       Show all HDF5 error reporting\n\
-                      Replaced by --enable-error-stack.\n",
-     h5tools_getprogname());
-}
-
-

-
-/*-------------------------------------------------------------------------
- * Function: print_string
- *
- * Purpose: Print a string value by escaping unusual characters. If
- *  STREAM is null then we only count how large the output would
- *  be.
- *
- * Return: Number of characters printed.
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-print_string(h5tools_str_t *buffer, const char *s, hbool_t escape_spaces)
-{
-    int  nprint=0;
-
-    for (/*void*/; s && *s; s++) {
-        switch (*s) {
-            case '"':
-                if (buffer) h5tools_str_append(buffer, "\\\"");
-                nprint += 2;
-                break;
-            case '\\':
-                if (buffer) h5tools_str_append(buffer, "\\\\");
-                nprint += 2;
-                break;
-            case '\b':
-                if (buffer) h5tools_str_append(buffer, "\\b");
-                nprint += 2;
-                break;
-            case '\f':
-                if (buffer) h5tools_str_append(buffer, "\\f");
-                nprint += 2;
-                break;
-            case '\n':
-                if (buffer) h5tools_str_append(buffer, "\\n");
-                nprint += 2;
-                break;
-            case '\r':
-                if (buffer) h5tools_str_append(buffer, "\\r");
-                nprint += 2;
-                break;
-            case '\t':
-                if (buffer) h5tools_str_append(buffer, "\\t");
-                nprint += 2;
-                break;
-            case ' ':
-                if (escape_spaces) {
-                    if (buffer) h5tools_str_append(buffer, "\\ ");
-                    nprint += 2;
-                }
-                else {
-                    if (buffer) h5tools_str_append(buffer, " ");
-                    nprint++;
-                }
-                break;
-            default:
-                if (isprint((int)*s)) {
-                    if (buffer) h5tools_str_append(buffer, "%c", *s);
-                    nprint++;
-                }
-                else {
-                    if (buffer) h5tools_str_append(buffer, "\\%03o", *((const unsigned char*)s));
-                    nprint += 4;
-                }
-                break;
-        }
-    }
-    return nprint;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_obj_name
- *
- * Purpose: Print an object name and another string.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Quincey Koziol
- *              Tuesday, November  6, 2007
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-print_obj_name(h5tools_str_t *buffer, const iter_t *iter, const char *oname,
-    const char *s)
-{
-    static char fullname[NAME_BUF_SIZE];     /* Buffer for file and/or object name */
-    const char *name = fullname;                /* Pointer to buffer for printing */
-    int  n;
-
-    if(show_file_name_g)
-        HDsnprintf(fullname, sizeof(fullname), "%s/%s", iter->fname, oname + iter->name_start);
-    else
-        name = oname + iter->name_start;
-
-    /* Print the object name, either full name or base name */
-    if(fullname_g)
-        n = print_string(buffer, name, TRUE);
-    else {
-        const char *last_sep;   /* The location of the last group separator */
-
-        /* Find the last component of the path name */
-        if(NULL == (last_sep = HDstrrchr(name, '/')))
-            last_sep = name;
-        else {
-            last_sep++;
-        } /* end else */
-        n = print_string(buffer, last_sep, TRUE);
-    } /* end else */
-    h5tools_str_append(buffer, "%*s ", MAX(0, (24 - n)), s);
-
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_native_type
- *
- * Purpose: Prints the name of a native C data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed.
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *   Robb Matzke, 1999-06-11
- *  Added the C9x types, but we still prefer to display the types
- *  from the C language itself (like `int' vs. `int32_t').
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_native_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    if(!simple_output_g) {
-        if (H5Tequal(type, H5T_NATIVE_SCHAR)==TRUE) {
-            h5tools_str_append(buffer, "native signed char");
-        } else if (H5Tequal(type, H5T_NATIVE_UCHAR)==TRUE) {
-            h5tools_str_append(buffer, "native unsigned char");
-        } else if (H5Tequal(type, H5T_NATIVE_INT)==TRUE) {
-            h5tools_str_append(buffer, "native int");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT)==TRUE) {
-            h5tools_str_append(buffer, "native unsigned int");
-        } else if (H5Tequal(type, H5T_NATIVE_SHORT)==TRUE) {
-            h5tools_str_append(buffer, "native short");
-        } else if (H5Tequal(type, H5T_NATIVE_USHORT)==TRUE) {
-            h5tools_str_append(buffer, "native unsigned short");
-        } else if (H5Tequal(type, H5T_NATIVE_LONG)==TRUE) {
-            h5tools_str_append(buffer, "native long");
-        } else if (H5Tequal(type, H5T_NATIVE_ULONG)==TRUE) {
-            h5tools_str_append(buffer, "native unsigned long");
-        } else if (H5Tequal(type, H5T_NATIVE_LLONG)==TRUE) {
-            h5tools_str_append(buffer, "native long long");
-        } else if (H5Tequal(type, H5T_NATIVE_ULLONG)==TRUE) {
-            h5tools_str_append(buffer, "native unsigned long long");
-        } else if (H5Tequal(type, H5T_NATIVE_FLOAT)==TRUE) {
-            h5tools_str_append(buffer, "native float");
-        } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)==TRUE) {
-            h5tools_str_append(buffer, "native double");
-#if H5_SIZEOF_LONG_DOUBLE !=0
-        } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)==TRUE) {
-            h5tools_str_append(buffer, "native long double");
-#endif
-        } else if (H5Tequal(type, H5T_NATIVE_INT8)==TRUE) {
-            h5tools_str_append(buffer, "native int8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT8)==TRUE) {
-            h5tools_str_append(buffer, "native uint8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT16)==TRUE) {
-            h5tools_str_append(buffer, "native int16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT16)==TRUE) {
-            h5tools_str_append(buffer, "native uint16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT32)==TRUE) {
-            h5tools_str_append(buffer, "native int32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT32)==TRUE) {
-            h5tools_str_append(buffer, "native uint32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT64)==TRUE) {
-            h5tools_str_append(buffer, "native int64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT64)==TRUE) {
-            h5tools_str_append(buffer, "native uint64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST8)==TRUE) {
-            h5tools_str_append(buffer, "native int_least8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST8)==TRUE) {
-            h5tools_str_append(buffer, "native uint_least8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST16)==TRUE) {
-            h5tools_str_append(buffer, "native int_least16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST16)==TRUE) {
-            h5tools_str_append(buffer, "native uint_least16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST32)==TRUE) {
-            h5tools_str_append(buffer, "native int_least32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST32)==TRUE) {
-            h5tools_str_append(buffer, "native uint_least32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST64)==TRUE) {
-            h5tools_str_append(buffer, "native int_least64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST64)==TRUE) {
-            h5tools_str_append(buffer, "native uint_least64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST8)==TRUE) {
-            h5tools_str_append(buffer, "native int_fast8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST8)==TRUE) {
-            h5tools_str_append(buffer, "native uint_fast8_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST16)==TRUE) {
-            h5tools_str_append(buffer, "native int_fast16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST16)==TRUE) {
-            h5tools_str_append(buffer, "native uint_fast16_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST32)==TRUE) {
-            h5tools_str_append(buffer, "native int_fast32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST32)==TRUE) {
-            h5tools_str_append(buffer, "native uint_fast32_t");
-        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST64)==TRUE) {
-            h5tools_str_append(buffer, "native int_fast64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST64)==TRUE) {
-            h5tools_str_append(buffer, "native uint_fast64_t");
-        } else if (H5Tequal(type, H5T_NATIVE_B8)==TRUE) {
-            h5tools_str_append(buffer, "native 8-bit field");
-        } else if (H5Tequal(type, H5T_NATIVE_B16)==TRUE) {
-            h5tools_str_append(buffer, "native 16-bit field");
-        } else if (H5Tequal(type, H5T_NATIVE_B32)==TRUE) {
-            h5tools_str_append(buffer, "native 32-bit field");
-        } else if (H5Tequal(type, H5T_NATIVE_B64)==TRUE) {
-            h5tools_str_append(buffer, "native 64-bit field");
-        } else if (H5Tequal(type, H5T_NATIVE_HSIZE)==TRUE) {
-            h5tools_str_append(buffer, "native hsize_t");
-        } else if (H5Tequal(type, H5T_NATIVE_HSSIZE)==TRUE) {
-            h5tools_str_append(buffer, "native hssize_t");
-        } else if (H5Tequal(type, H5T_NATIVE_HERR)==TRUE) {
-            h5tools_str_append(buffer, "native herr_t");
-        } else if (H5Tequal(type, H5T_NATIVE_HBOOL)==TRUE) {
-            h5tools_str_append(buffer, "native hbool_t");
-        } else {
-            return print_int_type(buffer, type, ind);
-        }
-    } else {
-        return print_int_type(buffer, type, ind);
-    }
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_ieee_type
- *
- * Purpose: Print the name of an IEEE floating-point data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-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");
-    }
-    else if (H5Tequal(type, H5T_IEEE_F32LE)==TRUE) {
-        h5tools_str_append(buffer, "IEEE 32-bit little-endian float");
-    }
-    else if (H5Tequal(type, H5T_IEEE_F64BE)==TRUE) {
-        h5tools_str_append(buffer, "IEEE 64-bit big-endian float");
-    }
-    else if (H5Tequal(type, H5T_IEEE_F64LE)==TRUE) {
-        h5tools_str_append(buffer, "IEEE 64-bit little-endian float");
-    }
-    else {
-        return print_float_type(buffer, type, ind);
-    }
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_precision
- *
- * Purpose: Prints information on the next line about precision and
- *  padding if the precision is less than the total data type
- *  size.
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-print_precision(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    size_t      prec;           /* precision */
-    H5T_pad_t   plsb, pmsb;     /* lsb and msb padding */
-    const char  *plsb_s=NULL;   /* lsb padding string */
-    const char  *pmsb_s=NULL;   /* msb padding string */
-    size_t      nbits;          /* number of bits */
-
-    /* If the precision is less than the total size then show the precision
-     * and offset on the following line.  Also display the padding
-     * information. */
-    if(8 * H5Tget_size(type) != (prec = H5Tget_precision(type))) {
-        h5tools_str_append(buffer, "\n%*s(%lu bit%s of precision beginning at bit %lu)",
-            ind, "", (unsigned long)prec, 1 == prec ? "" : "s",
-            (unsigned long)H5Tget_offset(type));
-
-        H5Tget_pad(type, &plsb, &pmsb);
-        if(H5Tget_offset(type) > 0) {
-            switch(plsb) {
-                case H5T_PAD_ZERO:
-                    plsb_s = "zero";
-                    break;
-                case H5T_PAD_ONE:
-                    plsb_s = "one";
-                    break;
-                case H5T_PAD_BACKGROUND:
-                    plsb_s = "bkg";
-                    break;
-                case H5T_PAD_ERROR:
-                case H5T_NPAD:
-                    plsb_s = "unknown";
-                    break;
-                default:
-                    break;
-            }
-        }
-        if((unsigned)H5Tget_offset(type) + prec < 8 * H5Tget_size(type)) {
-            switch(pmsb) {
-                case H5T_PAD_ZERO:
-                    pmsb_s = "zero";
-                    break;
-                case H5T_PAD_ONE:
-                    pmsb_s = "one";
-                    break;
-                case H5T_PAD_BACKGROUND:
-                    pmsb_s = "bkg";
-                    break;
-                case H5T_PAD_ERROR:
-                case H5T_NPAD:
-                    pmsb_s = "unknown";
-                    break;
-                default:
-                    break;
-            }
-        }
-        if (plsb_s || pmsb_s) {
-            h5tools_str_append(buffer, "\n%*s(", ind, "");
-            if (plsb_s) {
-                nbits = (unsigned)H5Tget_offset(type);
-                h5tools_str_append(buffer, "%lu %s bit%s at bit 0",
-                        (unsigned long)nbits, plsb_s, 1 == nbits ? "" : "s");
-            }
-            if (plsb_s && pmsb_s) h5tools_str_append(buffer, ", ");
-            if (pmsb_s) {
-                nbits = (8 * H5Tget_size(type)) - ((unsigned)H5Tget_offset(type) + prec);
-                h5tools_str_append(buffer, "%lu %s bit%s at bit %lu",
-                        (unsigned long)nbits, pmsb_s, 1 == nbits ? "" : "s",
-                        (unsigned long)(8 * H5Tget_size(type) - nbits));
-            }
-            h5tools_str_append(buffer, ")");
-        }
-    }
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_int_type
- *
- * Purpose: Print the name of an integer data type.  Common information
- *  like number of bits, byte order, and sign scheme appear on
- *  the first line. Additional information might appear in
- *  parentheses on the following lines.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_int_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    H5T_order_t order;          /* byte order value */
-    const char  *order_s=NULL;  /* byte order string */
-    H5T_sign_t  sign;           /* sign scheme value */
-    const char  *sign_s=NULL;   /* sign scheme string */
-
-    if (H5T_INTEGER!=H5Tget_class(type)) return FALSE;
-
-    /* Byte order */
-    if (H5Tget_size(type)>1) {
-        order = H5Tget_order(type);
-        if (H5T_ORDER_LE==order) {
-            order_s = " little-endian";
-        }
-        else if (H5T_ORDER_BE==order) {
-            order_s = " big-endian";
-        }
-        else if (H5T_ORDER_VAX==order) {
-            order_s = " mixed-endian";
-        }
-        else {
-            order_s = " unknown-byte-order";
-        }
-    }
-    else {
-        order_s = "";
-    }
-
-    /* Sign */
-    if ((sign=H5Tget_sign(type))>=0) {
-        if (H5T_SGN_NONE==sign) {
-            sign_s = " unsigned";
-        }
-        else if (H5T_SGN_2==sign) {
-            sign_s = "";
-        }
-        else {
-            sign_s = " unknown-sign";
-        }
-    }
-    else {
-        sign_s = " unknown-sign";
-    }
-
-    /* Print size, order, and sign on first line, precision and padding
-     * information on the subsequent lines */
-    h5tools_str_append(buffer, "%lu-bit%s%s integer",
-            (unsigned long)(8*H5Tget_size(type)), order_s, sign_s);
-    print_precision(buffer, type, ind);
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_float_type
- *
- * Purpose: Print info about a floating point data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_float_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    H5T_order_t order;          /* byte order value */
-    const char  *order_s=NULL;  /* byte order string */
-    size_t      spos;           /* sign bit position */
-    size_t      esize, epos;    /* exponent size and position */
-    size_t      msize, mpos;    /* significand size and position */
-    size_t      ebias;          /* exponent bias */
-    H5T_norm_t  norm;           /* significand normalization */
-    const char  *norm_s=NULL;   /* normalization string */
-    H5T_pad_t   pad;            /* internal padding value */
-    const char  *pad_s=NULL;    /* internal padding string */
-
-    if (H5T_FLOAT!=H5Tget_class(type)) return FALSE;
-
-    /* Byte order */
-    if (H5Tget_size(type)>1) {
-        order = H5Tget_order(type);
-        if (H5T_ORDER_LE==order) {
-            order_s = " little-endian";
-        }
-        else if (H5T_ORDER_BE==order) {
-            order_s = " big-endian";
-        }
-        else if (H5T_ORDER_VAX==order) {
-            order_s = " mixed-endian";
-        }
-        else {
-            order_s = " unknown-byte-order";
-        }
-    }
-    else {
-        order_s = "";
-    }
-
-    /* Print size and byte order on first line, precision and padding on
-     * subsequent lines. */
-    h5tools_str_append(buffer, "%lu-bit%s floating-point",
-        (unsigned long)(8*H5Tget_size(type)), order_s);
-    print_precision(buffer, type, ind);
-
-    /* Print sizes, locations, and other information about each field */
-    H5Tget_fields (type, &spos, &epos, &esize, &mpos, &msize);
-    ebias = H5Tget_ebias(type);
-    norm = H5Tget_norm(type);
-    switch (norm) {
-        case H5T_NORM_IMPLIED:
-            norm_s = ", msb implied";
-            break;
-        case H5T_NORM_MSBSET:
-            norm_s = ", msb always set";
-            break;
-        case H5T_NORM_NONE:
-            norm_s = ", no normalization";
-            break;
-        case H5T_NORM_ERROR:
-            norm_s = ", unknown normalization";
-            break;
-        default:
-            ;
-        break;
-    }
-    h5tools_str_append(buffer, "\n%*s(significant for %lu bit%s at bit %lu%s)", ind, "",
-            (unsigned long)msize, 1==msize?"":"s", (unsigned long)mpos,
-            norm_s);
-    h5tools_str_append(buffer, "\n%*s(exponent for %lu bit%s at bit %lu, bias is 0x%lx)",
-            ind, "", (unsigned long)esize, 1==esize?"":"s",
-            (unsigned long)epos, (unsigned long)ebias);
-    h5tools_str_append(buffer, "\n%*s(sign bit at %lu)", ind, "", (unsigned long)spos);
-
-    /* Display internal padding */
-    if (1+esize+msize<H5Tget_precision(type)) {
-        pad = H5Tget_inpad(type);
-        switch (pad) {
-            case H5T_PAD_ZERO:
-                pad_s = "zero";
-                break;
-            case H5T_PAD_ONE:
-                pad_s = "one";
-                break;
-            case H5T_PAD_BACKGROUND:
-                pad_s = "bkg";
-                break;
-            case H5T_PAD_ERROR:
-            case H5T_NPAD:
-                pad_s = "unknown";
-                break;
-            default:
-                ;
-            break;
-        }
-        h5tools_str_append(buffer, "\n%*s(internal padding bits are %s)", ind, "", pad_s);
-    }
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_cmpd_type
- *
- * Purpose: Print info about a compound data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_cmpd_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    char        *name=NULL;     /* member name */
-    size_t      size;           /* total size of type in bytes */
-    hid_t       subtype;        /* member data type */
-    int         nmembs;         /* number of members */
-    int         n;              /* miscellaneous counters */
-    unsigned    i;              /* miscellaneous counters */
-
-    if(H5T_COMPOUND != H5Tget_class(type))
-        return FALSE;
-    if((nmembs = H5Tget_nmembers(type)) < 0)
-        return FALSE;
-
-    h5tools_str_append(buffer, "struct {");
-    for(i = 0; i < (unsigned)nmembs; i++) {
-
-        /* Name and offset */
-        name = H5Tget_member_name(type, i);
-        h5tools_str_append(buffer, "\n%*s\"", ind+4, "");
-        n = print_string(buffer, name, FALSE);
-        h5tools_str_append(buffer, "\"%*s +%-4lu ", MAX(0, 16-n), "",
-               (unsigned long)H5Tget_member_offset(type, i));
-        H5free_memory(name);
-
-        /* Member's type */
-        subtype = H5Tget_member_type(type, i);
-        print_type(buffer, subtype, ind+4);
-        H5Tclose(subtype);
-    }
-    size = H5Tget_size(type);
-    h5tools_str_append(buffer, "\n%*s} %lu byte%s",
-                ind, "", (unsigned long)size, 1==size?"":"s");
-
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_enum_type
- *
- * Purpose: Print info about an enumeration data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Wednesday, December 23, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_enum_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    int         nmembs;         /* number of members */
-    hid_t       super;          /* enum base integer type */
-
-    if(H5T_ENUM != H5Tget_class(type))
-        return FALSE;
-    if((nmembs = H5Tget_nmembers(type)) < 0)
-        return FALSE;
-
-    super = H5Tget_super(type);
-    h5tools_str_append(buffer, "enum ");
-    print_type(buffer, super, ind + 4);
-    h5tools_str_append(buffer, " {");
-
-    if(nmembs > 0) {
-        char        **name;         /* member names */
-        unsigned char *value;       /* value array */
-        hid_t       native = -1;    /* native integer data type */
-        size_t      dst_size;       /* destination value type size */
-        unsigned    i;              /* miscellaneous counters */
-
-        /* Determine what data type to use for the native values.  To simplify
-         * things we entertain three possibilities:
-         *  1. long long -- the largest native signed integer
-         *  2. unsigned long long -- the largest native unsigned integer
-         *  3. raw format */
-        if(H5Tget_size(type) <= sizeof(long long)) {
-            dst_size = sizeof(long long);
-            if(H5T_SGN_NONE == H5Tget_sign(type))
-                native = H5T_NATIVE_ULLONG;
-            else
-                native = H5T_NATIVE_LLONG;
-        } /* end if */
-        else
-            dst_size = H5Tget_size(type);
-
-        /* Get the names and raw values of all members */
-        name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
-        value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
-        for(i = 0; i < (unsigned)nmembs; i++) {
-            name[i] = H5Tget_member_name(type, i);
-            H5Tget_member_value(type, i, value + i * H5Tget_size(type));
-        }
-
-        /* Convert values to native data type */
-        if(native > 0)
-            if(H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT) < 0) {
-                /* Release resources */
-                for(i = 0; i < (unsigned)nmembs; i++)
-                    H5free_memory(name[i]);
-                HDfree(name);
-                HDfree(value);
-
-                return FALSE;
-            }
-
-        /* Sort members by increasing value */
-        /*not implemented yet*/
-
-        /* Print members */
-        for(i = 0; i < (unsigned)nmembs; i++) {
-            unsigned char *copy;        /* a pointer to value array */
-            int         nchars;         /* number of output characters */
-
-            h5tools_str_append(buffer, "\n%*s", ind+4, "");
-            nchars = print_string(buffer, name[i], TRUE);
-            h5tools_str_append(buffer, "%*s = ", MAX(0, 16 - nchars), "");
-
-            if(native < 0) {
-                size_t j;
-
-                h5tools_str_append(buffer, "0x");
-                for(j = 0; j < dst_size; j++)
-                    h5tools_str_append(buffer, "%02x", value[i*dst_size+j]);
-            }
-            else if(H5T_SGN_NONE == H5Tget_sign(native)) {
-                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
-                 *strangely, unless use another pointer "copy".*/
-                copy = value + i * dst_size;
-                h5tools_str_append(buffer, HSIZE_T_FORMAT, *((unsigned long long*)((void*)copy)));
-            }
-            else {
-                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
-                 *strangely, unless use another pointer "copy".*/
-                copy = value + i * dst_size;
-                h5tools_str_append(buffer, "%"H5_PRINTF_LL_WIDTH"d",
-                        *((long long*)((void*)copy)));
-            }
-        }
-
-        /* Release resources */
-        for(i = 0; i < (unsigned)nmembs; i++)
-            H5free_memory(name[i]);
-        HDfree(name);
-        HDfree(value);
-    }
-    else
-        h5tools_str_append(buffer, "\n%*s <empty>", ind+4, "");
-
-    h5tools_str_append(buffer, "\n%*s}", ind, "");
-
-    H5Tclose(super);
-
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_string_type
- *
- * Purpose: Print information about a string data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_string_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
-{
-    H5T_str_t  pad;
-    const char  *pad_s=NULL;
-    H5T_cset_t  cset;
-    const char  *cset_s=NULL;
-
-    if (H5T_STRING!=H5Tget_class(type)) return FALSE;
-
-    /* Padding */
-    pad = H5Tget_strpad(type);
-    switch (pad) {
-        case H5T_STR_NULLTERM:
-            pad_s = "null-terminated";
-            break;
-        case H5T_STR_NULLPAD:
-            pad_s = "null-padded";
-            break;
-        case H5T_STR_SPACEPAD:
-            pad_s = "space-padded";
-            break;
-        case H5T_STR_RESERVED_3:
-        case H5T_STR_RESERVED_4:
-        case H5T_STR_RESERVED_5:
-        case H5T_STR_RESERVED_6:
-        case H5T_STR_RESERVED_7:
-        case H5T_STR_RESERVED_8:
-        case H5T_STR_RESERVED_9:
-        case H5T_STR_RESERVED_10:
-        case H5T_STR_RESERVED_11:
-        case H5T_STR_RESERVED_12:
-        case H5T_STR_RESERVED_13:
-        case H5T_STR_RESERVED_14:
-        case H5T_STR_RESERVED_15:
-        case H5T_STR_ERROR:
-            pad_s = "unknown-format";
-            break;
-        default:
-            ;
-        break;
-    }
-
-    /* Character set */
-    cset = H5Tget_cset(type);
-    switch (cset) {
-        case H5T_CSET_ASCII:
-            cset_s = "ASCII";
-            break;
-        case H5T_CSET_UTF8:
-            cset_s = "UTF-8";
-            break;
-        case H5T_CSET_RESERVED_2:
-        case H5T_CSET_RESERVED_3:
-        case H5T_CSET_RESERVED_4:
-        case H5T_CSET_RESERVED_5:
-        case H5T_CSET_RESERVED_6:
-        case H5T_CSET_RESERVED_7:
-        case H5T_CSET_RESERVED_8:
-        case H5T_CSET_RESERVED_9:
-        case H5T_CSET_RESERVED_10:
-        case H5T_CSET_RESERVED_11:
-        case H5T_CSET_RESERVED_12:
-        case H5T_CSET_RESERVED_13:
-        case H5T_CSET_RESERVED_14:
-        case H5T_CSET_RESERVED_15:
-        case H5T_CSET_ERROR:
-            cset_s = "unknown-character-set";
-            break;
-        default:
-            ;
-        break;
-    }
-
-    if (H5Tis_variable_str(type)) {
-        h5tools_str_append(buffer, "variable-length");
-    }
-    else {
-        h5tools_str_append(buffer, "%lu-byte", (unsigned long)H5Tget_size(type));
-    }
-    h5tools_str_append(buffer, " %s %s string", pad_s, cset_s);
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_reference_type
- *
- * Purpose: Prints information about a reference data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *   Robb Matzke, 1999-06-04
- *  Knows about object and dataset region references.
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_reference_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
-{
-    if (H5T_REFERENCE!=H5Tget_class(type)) return FALSE;
-
-    if (H5Tequal(type, H5T_STD_REF_OBJ)==TRUE) {
-        h5tools_str_append(buffer, "object reference");
-    }
-    else if (H5Tequal(type, H5T_STD_REF_DSETREG)==TRUE) {
-        h5tools_str_append(buffer, "dataset region reference");
-    }
-    else {
-        h5tools_str_append(buffer, "%lu-byte unknown reference",
-                (unsigned long)H5Tget_size(type));
-    }
-
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_opaque_type
- *
- * Purpose: Prints information about an opaque data type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Robb Matzke
- *              Monday, June  7, 1999
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_opaque_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    char *tag;
-    size_t size;
-
-    if (H5T_OPAQUE!=H5Tget_class(type)) return FALSE;
-
-    size = H5Tget_size(type);
-    h5tools_str_append(buffer, "%lu-byte opaque type", (unsigned long)size);
-    if ((tag=H5Tget_tag(type))) {
-        h5tools_str_append(buffer, "\n%*s(tag = \"", ind, "");
-        print_string(buffer, tag, FALSE);
-        h5tools_str_append(buffer, "\")");
-        H5free_memory(tag);
-    }
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    print_vlen_type
- *
- * Purpose:     Print information about a variable-length type
- *
- * Return:      Success:        TRUE
- *
- *              Failure:        FALSE
- *
- * Programmer:  Robb Matzke
- *              Friday, December  1, 2000
- *
- * Modifications:
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_vlen_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    hid_t       super;
-
-    if (H5T_VLEN!=H5Tget_class(type)) return FALSE;
-
-    h5tools_str_append(buffer, "variable length of\n%*s", ind+4, "");
-    super = H5Tget_super(type);
-    print_type(buffer, super, ind+4);
-    H5Tclose(super);
-    return TRUE;
-}
-
-

-/*---------------------------------------------------------------------------
- * Purpose:     Print information about an array type
- *
- * Return:      Success:        TRUE
- *
- *              Failure:        FALSE
- *
- * Programmer:  Robb Matzke
- *              Thursday, January 31, 2002
- *
- * Modifications:
- *---------------------------------------------------------------------------
- */
-static hbool_t
-print_array_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    hid_t       super;
-    int         ndims, i;
-    hsize_t     *dims=NULL;
-
-    if (H5T_ARRAY!=H5Tget_class(type))
-        return FALSE;
-    ndims = H5Tget_array_ndims(type);
-    if (ndims) {
-        dims = (hsize_t *)HDmalloc((unsigned)ndims * sizeof(dims[0]));
-        H5Tget_array_dims2(type, dims);
-
-        /* Print dimensions */
-        for (i=0; i<ndims; i++)
-            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT , i?",":"[", dims[i]);
-        h5tools_str_append(buffer, "]");
-
-        HDfree(dims);
-    }
-    else
-        h5tools_str_append(buffer, " [SCALAR]\n", rawoutstream);
-
-
-    /* Print parent type */
-    h5tools_str_append(buffer, " ");
-    super = H5Tget_super(type);
-    print_type(buffer, super, ind+4);
-    H5Tclose(super);
-    return TRUE;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: print_bitfield_type
- *
- * Purpose: Print information about a bitfield type.
- *
- * Return: Success: TRUE
- *
- *  Failure: FALSE, nothing printed
- *
- * Programmer: Pedro Vicente
- *              Tuesday, May  20, 2003
- *
- * Modifications:
- *              Robb Matzke, LLNL 2003-06-05
- *              Generalized Pedro's original if/then/else.  Also display
- *              precision/offset information.
- *-------------------------------------------------------------------------
- */
-static hbool_t
-print_bitfield_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    H5T_order_t order;          /* byte order value */
-    const char  *order_s=NULL;  /* byte order string */
-
-    if (H5T_BITFIELD!=H5Tget_class(type)) return FALSE;
-    if (H5Tget_size(type)>1) {
-        order = H5Tget_order(type);
-        if (H5T_ORDER_LE==order) {
-            order_s = " little-endian";
-        } else if (H5T_ORDER_BE==order) {
-            order_s = " big-endian";
-        } else if (H5T_ORDER_VAX==order) {
-            order_s = " mixed-endian";
-        } else {
-            order_s = "unknown-byte-order";
-        }
-    } else {
-        order_s = "";
-    }
-
-    h5tools_str_append(buffer, "%lu-bit%s bitfield",
-           (unsigned long)(8*H5Tget_size(type)), order_s);
-    print_precision(buffer, type, ind);
-    return TRUE;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: print_type
- *
- * Purpose: Prints a data type definition.  The definition is printed
- *  without any leading space or trailing line-feed (although
- *  there might be line-feeds inside the type definition).  The
- *  first line is assumed to have IND characters before it on
- *  the same line (printed by the caller).
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *   Robb Matzke, 1999-06-11
- *  Prints the OID of shared data types.
- *
- *-------------------------------------------------------------------------
- */
-static void
-print_type(h5tools_str_t *buffer, hid_t type, int ind)
-{
-    H5T_class_t  data_class = H5Tget_class(type);
-
-    /* Bad data type */
-    if (type<0) {
-        h5tools_str_append(buffer,"<ERROR>");
-        return;
-    }
-
-    /* Shared? If so then print the type's OID */
-    if(H5Tcommitted(type)) {
-        H5O_info_t  oi;
-
-        if(H5Oget_info(type, &oi) >= 0)
-            h5tools_str_append(buffer,"shared-%lu:"H5_PRINTF_HADDR_FMT" ",
-                    oi.fileno, oi.addr);
-        else
-            h5tools_str_append(buffer,"shared ");
-    } /* end if */
-
-    /* Print the type */
-    if(print_native_type(buffer, type, ind) ||
-            print_ieee_type(buffer, type, ind) ||
-            print_cmpd_type(buffer, type, ind) ||
-            print_enum_type(buffer, type, ind) ||
-            print_string_type(buffer, type, ind) ||
-            print_reference_type(buffer, type, ind) ||
-            print_vlen_type(buffer, type, ind) ||
-            print_array_type(buffer, type, ind) ||
-            print_opaque_type(buffer, type, ind) ||
-            print_bitfield_type(buffer, type, ind))
-        return;
-
-    /* Unknown type */
-    h5tools_str_append(buffer,"%lu-byte class-%u unknown",
-            (unsigned long)H5Tget_size(type), (unsigned)data_class);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: dump_dataset_values
- *
- * Purpose: Prints all values of a dataset.
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- *              Tuesday, July 21, 1998
- *
- * Modifications:
- *  Robb Matzke, 1999-09-27
- *  Understands the simple_output_g switch which causes data to
- *  be displayed in a more machine-readable format.
- *-------------------------------------------------------------------------
- */
-static void
-dump_dataset_values(hid_t dset)
-{
-    char                string_prefix[64];
-    static char         fmt_double[16];
-    static char         fmt_float[16];
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t     outputformat;
-    h5tool_format_t    *info = &ls_dataformat;
-
-    hid_t  f_type = H5Dget_type(dset);
-    size_t  size = H5Tget_size(f_type);
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    outputformat = *info;
-    outputformat.line_1st  = NULL;
-    if (simple_output_g) {
-        outputformat.idx_fmt = "";
-        outputformat.line_per_line = 1;
-        outputformat.line_multi_new = 0;
-        outputformat.line_pre  = "        ";
-        outputformat.line_cont = "         ";
-
-        outputformat.arr_pre = "";
-        outputformat.arr_suf = "";
-        outputformat.arr_sep = " ";
-
-        if (!label_g) {
-            outputformat.cmpd_pre = "";
-            outputformat.cmpd_suf = "";
-        }
-        outputformat.cmpd_sep = " ";
-
-        if (label_g) outputformat.cmpd_name = "%s=";
-
-        outputformat.elmt_suf1 = " ";
-        outputformat.str_locale = ESCAPE_HTML;
-
-    }
-    else {
-        if (no_line_wrap_g) {
-            outputformat.line_per_line = 1;
-        }
-        else {
-            outputformat.line_ncols = (unsigned)width_g;
-        }
-        if (label_g) outputformat.cmpd_name = "%s=";
-        outputformat.line_pre  = "        %s ";
-        outputformat.line_cont = "        %s  ";
-        outputformat.str_repeat = 8;
-
-        outputformat.arr_pre = NULL;
-        outputformat.arr_suf = NULL;
-        outputformat.arr_sep = NULL;
-
-        outputformat.cmpd_pre = NULL;
-        outputformat.cmpd_suf = NULL;
-        outputformat.cmpd_sep = NULL;
-
-        outputformat.vlen_sep = NULL;
-        outputformat.vlen_pre = NULL;
-        outputformat.vlen_suf = NULL;
-        outputformat.vlen_end = NULL;
-    }
-    outputformat.arr_linebreak = 0;
-    /* Floating point types should display full precision */
-    HDsnprintf(fmt_float, sizeof(fmt_float), "%%1.%dg", FLT_DIG);
-    outputformat.fmt_float = fmt_float;
-    HDsnprintf(fmt_double, sizeof(fmt_double), "%%1.%dg", DBL_DIG);
-    outputformat.fmt_double = fmt_double;
-
-    if (hexdump_g) {
-        /* Print all data in hexadecimal format if the `-x' or `--hexdump'
-         * command line switch was given. */
-        outputformat.raw = TRUE;
-    }
-    else if (string_g && 1==size && H5T_INTEGER==H5Tget_class(f_type)) {
-        /* Print 1-byte integer data as an ASCI character string instead of
-         * integers if the `-s' or `--string' command-line option was given. */
-        outputformat.ascii = TRUE;
-        outputformat.elmt_suf1 = "";
-        outputformat.elmt_suf2 = "";
-        HDsnprintf(string_prefix, sizeof(string_prefix), "%s\"", outputformat.line_pre);
-        outputformat.line_pre = string_prefix;
-        outputformat.line_suf = "\"";
-    }
-    info = &outputformat;
-
-    ctx.indent_level = 2;
-    ctx.cur_column = (size_t)curr_pos;
-    /* Print all the values. */
-    h5tools_str_reset(&buffer);
-    h5tools_str_append(&buffer, "    Data:\n");
-    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-    ctx.need_prefix = TRUE;
-    ctx.cur_column = (size_t)curr_pos;
-    if (h5tools_dump_dset(rawoutstream, info, &ctx, dset, NULL) < 0) {
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "        Unable to print data.");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-    }
-
-    H5Tclose(f_type);
-
-    h5tools_str_close(&buffer);
-
-    PRINTVALSTREAM(rawoutstream, "\n");
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: list_attr
- *
- * Purpose: Prints information about attributes.
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Robb Matzke
- *              Friday, June  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-list_attr(hid_t obj, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo,
-    void H5_ATTR_UNUSED *op_data)
-{
-    hid_t               attr = -1;
-    hid_t               space = -1;
-    hid_t               type = -1;
-    hid_t               p_type = -1;
-    hsize_t             size[H5S_MAX_RANK];
-    hsize_t             nelmts = 1;
-    hsize_t             temp_need;
-    size_t              need;
-    int                 ndims;
-    int                 i;
-    void               *buf;
-    H5S_class_t         space_type;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-    h5tool_format_t     outputformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-    h5tools_str_append(&buffer, "    Attribute: ");
-
-    print_string(&buffer, attr_name, TRUE);
-
-    if((attr = H5Aopen(obj, attr_name, H5P_DEFAULT))) {
-        space = H5Aget_space(attr);
-        type = H5Aget_type(attr);
-
-        /* Data space */
-        ndims = H5Sget_simple_extent_dims(space, size, NULL);
-        space_type = H5Sget_simple_extent_type(space);
-        switch(space_type) {
-            case H5S_SCALAR:
-                /* scalar dataspace */
-                h5tools_str_append(&buffer, " scalar\n");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-
-            case H5S_SIMPLE:
-                /* simple dataspace */
-                h5tools_str_append(&buffer, " {");
-                for (i=0; i<ndims; i++) {
-                    h5tools_str_append(&buffer, "%s" HSIZE_T_FORMAT, i?", ":"", size[i]);
-                    nelmts *= size[i];
-                }
-                h5tools_str_append(&buffer, "}\n");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-
-            case H5S_NULL:
-                /* null dataspace */
-                h5tools_str_append(&buffer, " null\n");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-
-            case H5S_NO_CLASS:
-            default:
-                /* Unknown dataspace type */
-                h5tools_str_append(&buffer, " unknown\n");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                break;
-        } /* end switch */
-
-        /* Data type */
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "        Type:      ");
-        print_type(&buffer, type, 15);
-        h5tools_str_append(&buffer, "\n");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        /* Data */
-        outputformat = *info;
-
-        if(nelmts < 5) {
-            outputformat.idx_fmt = "";
-            outputformat.line_1st  = "        Data:  ";
-            outputformat.line_pre  = "               ";
-            outputformat.line_cont = "                ";
-            outputformat.str_repeat = 8;
-
-        }
-        else {
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "        Data:\n");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            outputformat.line_1st  = NULL;
-            outputformat.line_pre  = "            %s ";
-            outputformat.line_cont = "            %s  ";
-            outputformat.str_repeat = 8;
-        }
-
-        outputformat.line_ncols = (unsigned)width_g;
-        if(label_g)
-            outputformat.cmpd_name = "%s=";
-        if(string_g && 1==H5Tget_size(type) &&
-                H5T_INTEGER==H5Tget_class(type)) {
-            outputformat.ascii = TRUE;
-            outputformat.elmt_suf1 = "";
-            outputformat.elmt_suf2 = "";
-            outputformat.line_pre = "            %s \"";
-            outputformat.line_suf = "\"";
-        } /* end if */
-
-
-        outputformat.arr_pre = NULL;
-        outputformat.arr_suf = NULL;
-        outputformat.arr_sep = NULL;
-
-        outputformat.cmpd_pre = NULL;
-        outputformat.cmpd_suf = NULL;
-        outputformat.cmpd_sep = NULL;
-
-        outputformat.vlen_sep = NULL;
-        outputformat.vlen_pre = NULL;
-        outputformat.vlen_suf = NULL;
-        outputformat.vlen_end = NULL;
-
-        info = &outputformat;
-
-        if(hexdump_g)
-           p_type = H5Tcopy(type);
-        else
-           p_type = h5tools_get_native_type(type);
-
-        if(p_type >= 0) {
-            /* VL data special information */
-            unsigned int        vl_data = 0; /* contains VL datatypes */
-
-            /* Check if we have VL data in the dataset's datatype */
-            if (h5tools_detect_vlen(p_type) == TRUE)
-                vl_data = TRUE;
-
-            temp_need= nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
-            HDassert(temp_need == (hsize_t)((size_t)temp_need));
-            need = (size_t)temp_need;
-            buf = HDmalloc(need);
-            HDassert(buf);
-            if(H5Aread(attr, p_type, buf) >= 0) {
-                ctx.need_prefix = TRUE;
-                ctx.indent_level = 2;
-                ctx.cur_column = (size_t)curr_pos;
-                h5tools_dump_mem(rawoutstream, info, &ctx, attr, p_type, space, buf);
-            }
-
-            /* Reclaim any VL memory, if necessary */
-            if (vl_data)
-                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
-
-            HDfree(buf);
-            H5Tclose(p_type);
-        } /* end if */
-
-        H5Sclose(space);
-        H5Tclose(type);
-        H5Aclose(attr);
-    }
-    h5tools_str_close(&buffer);
-
-    PRINTVALSTREAM(rawoutstream, "\n");
-
-    return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: dataset_list1
- *
- * Purpose: List information about a dataset which should appear on the
- *  same line as the dataset name.  This information will precede
- *  information which is applicable to all objects which will be
- *  printed by the caller.
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Robb Matzke
- *              Thursday, August 27, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-dataset_list1(hid_t dset)
-{
-    hsize_t     cur_size[H5S_MAX_RANK];   /* current dataset dimensions */
-    hsize_t     max_size[H5S_MAX_RANK];   /* maximum dataset dimensions */
-    hid_t       space;          /* data space                 */
-    int         ndims;          /* dimensionality             */
-    H5S_class_t space_type;     /* type of dataspace          */
-    int   i;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-
-    /* Information that goes on the same row as the name.  The name has
-     * already been printed. */
-    space = H5Dget_space(dset);
-    space_type = H5Sget_simple_extent_type(space);
-    ndims = H5Sget_simple_extent_dims(space, cur_size, max_size);
-    h5tools_str_append(&buffer, " {");
-    for (i=0; i<ndims; i++) {
-        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", cur_size[i]);
-        if (max_size[i]==H5S_UNLIMITED) {
-            h5tools_str_append(&buffer, "/%s", "Inf");
-        }
-        else if (max_size[i]!=cur_size[i] || verbose_g>0) {
-            h5tools_str_append(&buffer, "/"HSIZE_T_FORMAT, max_size[i]);
-        }
-    }
-    if (space_type==H5S_SCALAR) h5tools_str_append(&buffer, "SCALAR");
-    else if (space_type==H5S_NULL) h5tools_str_append(&buffer, "NULL");
-    h5tools_str_append(&buffer, "}");
-    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-    H5Sclose (space);
-
-    h5tools_str_close(&buffer);
-
-    return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: dataset_list2
- *
- * Purpose: List information about a dataset which should appear after
- *  information which is general to all objects.
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Robb Matzke
- *              Thursday, August 27, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-dataset_list2(hid_t dset, const char H5_ATTR_UNUSED *name)
-{
-    hid_t       dcpl;           /* dataset creation property list */
-    hid_t       type;           /* data type of dataset */
-    hid_t       space;          /* data space of dataset */
-    int         nf;             /* number of filters */
-    unsigned    filt_flags;     /* filter flags */
-    H5Z_filter_t filt_id;       /* filter identification number */
-    unsigned    cd_values[20];  /* filter client data values */
-    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        s[64];          /* temporary string buffer */
-    off_t       f_offset;       /* offset in external file */
-    hsize_t     f_size;         /* bytes used in external file */
-    hsize_t     total, used;    /* total size or offset */
-    int         ndims;          /* dimensionality */
-    int         n, max_len;     /* max extern file name length */
-    double      utilization;    /* percent utilization of storage */
-    H5T_class_t tclass;         /* datatype class identifier */
-    int         i;
-    H5D_layout_t     stl;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-
-    if(verbose_g > 0) {
-        dcpl = H5Dget_create_plist(dset);
-        space = H5Dget_space(dset);
-        type = H5Dget_type(dset);
-
-        stl = H5Pget_layout(dcpl);
-        switch (stl) {
-            case H5D_CHUNKED:
-                {
-                    hsize_t     chsize[64];     /* chunk size in elements */
-
-                    ndims = H5Pget_chunk(dcpl, (int)NELMTS(chsize), chsize/*out*/);
-                    h5tools_str_append(&buffer, "    %-10s {", "Chunks:");
-                    total = H5Tget_size(type);
-                    for (i=0; i<ndims; i++) {
-                        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", chsize[i]);
-                        total *= chsize[i];
-                    }
-                    h5tools_str_append(&buffer, "} "HSIZE_T_FORMAT" bytes\n", total);
-                }
-                break;
-            case H5D_COMPACT:
-                break;
-            case H5D_CONTIGUOUS:
-                /* Print information about external storage */
-                if((nf = H5Pget_external_count(dcpl)) > 0) {
-                    for(i = 0, max_len = 0; i < nf; i++) {
-                        if(H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, NULL, NULL) < 0)
-                            continue;
-                        n = print_string(NULL, f_name, TRUE);
-                        max_len = MAX(max_len, n);
-                    } /* end for */
-                    h5tools_str_append(&buffer, "    %-10s %d external file%s\n",
-                            "Extern:", nf, 1==nf?"":"s");
-                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s %s\n",
-                            "ID", "DSet-Addr", "File-Addr", "Bytes", "File");
-                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
-                            "----", "----------", "----------", "----------");
-                    for (i=0; i<max_len; i++) h5tools_str_append(&buffer, "-");
-                    h5tools_str_append(&buffer, "\n");
-                    for (i=0, total=0; i<nf; i++) {
-                        if (H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, &f_offset, &f_size)<0) {
-                            h5tools_str_append(&buffer,
-                                    "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10s %10s ***ERROR*** %s\n",
-                                    i, total, "", "",
-                                    i+1<nf?"Following addresses are incorrect":"");
-                        }
-                        else if (H5S_UNLIMITED==f_size) {
-                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10s ",
-                                    i, total, (hsize_t)f_offset, "INF");
-                            print_string(&buffer, f_name, TRUE);
-                        }
-                        else {
-                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u ",
-                                    i, total, (hsize_t)f_offset, f_size);
-                            print_string(&buffer, f_name, TRUE);
-                        }
-                        h5tools_str_append(&buffer, "\n");
-                        total += f_size;
-                    }
-                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
-                            "----", "----------", "----------", "----------");
-                    for (i=0; i<max_len; i++)
-                        h5tools_str_append(&buffer, "-");
-                    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;
-
-                        h5tools_str_append(&buffer, "    %-10s {%ld} Source {\n", "Maps:", vmaps);
-                        for (next = 0; next < (unsigned) vmaps; next++) {
-                            H5Pget_virtual_filename(dcpl, next, f_name, sizeof(f_name));
-                            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 */
-        total = (hsize_t)H5Sget_simple_extent_npoints(space) * H5Tget_size(type);
-        used = H5Dget_storage_size(dset);
-        tclass = H5Tget_class(type);
-        h5tools_str_append(&buffer, "    %-10s ", "Storage:");
-        switch (tclass)
-        {
-
-        case H5T_VLEN:
-            h5tools_str_append(&buffer, "information not available");
-            break;
-
-        case H5T_REFERENCE:
-            if ( H5Tequal(type, H5T_STD_REF_DSETREG))
-            {
-                h5tools_str_append(&buffer, "information not available");
-            }
-            break;
-
-        case H5T_NO_CLASS:
-        case H5T_INTEGER:
-        case H5T_FLOAT:
-        case H5T_TIME:
-        case H5T_STRING:
-        case H5T_BITFIELD:
-        case H5T_OPAQUE:
-        case H5T_COMPOUND:
-        case H5T_ENUM:
-        case H5T_ARRAY:
-        case H5T_NCLASSES:
-        default:
-            h5tools_str_append(&buffer, HSIZE_T_FORMAT" logical byte%s, "HSIZE_T_FORMAT" allocated byte%s",
-                total, 1==total?"":"s",
-                used, 1==used?"":"s");
-            if (used>0)
-            {
-                utilization = ((double)total * (double)100.0f) / (double)used;
-                h5tools_str_append(&buffer, ", %1.2f%% utilization", utilization);
-            }
-        }
-
-        h5tools_str_append(&buffer, "\n");
-
-        /* Print information about raw data filters */
-        if((nf = H5Pget_nfilters(dcpl)) > 0) {
-            for(i = 0; i < nf; i++) {
-                cd_nelmts = NELMTS(cd_values);
-                filt_id = H5Pget_filter2(dcpl, (unsigned)i, &filt_flags, &cd_nelmts,
-                        cd_values, sizeof(f_name), f_name, NULL);
-                f_name[sizeof(f_name) - 1] = '\0';
-                HDsnprintf(s, sizeof(s), "Filter-%d:", i);
-                h5tools_str_append(&buffer, "    %-10s %s-%u %s {", s,
-                        (f_name[0] ? f_name : "method"),
-                        (unsigned)filt_id,
-                        ((filt_flags & H5Z_FLAG_OPTIONAL) ? "OPT" : ""));
-                for(cd_num = 0; cd_num < cd_nelmts; cd_num++)
-                    h5tools_str_append(&buffer, "%s%u", (cd_num ? ", " : ""), cd_values[cd_num]);
-                h5tools_str_append(&buffer, "}\n");
-            } /* end for */
-        } /* end if */
-
-        /* Print data type */
-        h5tools_str_append(&buffer, "    %-10s ", "Type:");
-        print_type(&buffer, type, 15);
-        h5tools_str_append(&buffer, "\n");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        /* Print address information */
-        if(address_g)
-            H5Ddebug(dset);
-
-        /* Close stuff */
-        H5Tclose(type);
-        H5Sclose(space);
-        H5Pclose(dcpl);
-    } /* end if */
-
-    h5tools_str_close(&buffer);
-
-    if(data_g)
-        dump_dataset_values(dset);
-
-    return 0;
-} /* end dataset_list2() */
-
-

-/*-------------------------------------------------------------------------
- * Function: datatype_list2
- *
- * Purpose: List information about a datatype which should appear after
- *  information which is general to all objects.
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Robb Matzke
- *              Thursday, November  5, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-datatype_list2(hid_t type, const char H5_ATTR_UNUSED *name)
-{
-    if (verbose_g>0) {
-        hsize_t             curr_pos = 0;        /* total data element position   */
-        h5tools_str_t       buffer;          /* string into which to render   */
-        h5tools_context_t   ctx;             /* print context  */
-        h5tool_format_t    *info = &ls_dataformat;
-
-        HDmemset(&ctx, 0, sizeof(ctx));
-        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-        h5tools_str_reset(&buffer);
-
-        h5tools_str_append(&buffer, "    %-10s ", "Type:");
-        print_type(&buffer, type, 15);
-        h5tools_str_append(&buffer, "\n");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-        h5tools_str_close(&buffer);
-    }
-    return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: list_obj
- *
- * Purpose: Prints information about an object
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Quincey Koziol
- *              Tuesday, November 6, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-list_obj(const char *name, const H5O_info_t *oinfo, const char *first_seen, void *_iter)
-{
-    H5O_type_t          obj_type = oinfo->type;          /* Type of the object */
-    iter_t             *iter = (iter_t*)_iter;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-
-    /* Print the link's name, either full name or base name */
-    if(!iter->symlink_target)
-        print_obj_name(&buffer, iter, name, "");
-
-    /* Check object information */
-    if(oinfo->type < 0 || oinfo->type >= H5O_TYPE_NTYPES) {
-        h5tools_str_append(&buffer, "Unknown type(%d)", (int)oinfo->type);
-        obj_type = H5O_TYPE_UNKNOWN;
-    }
-    if(iter->symlink_target)
-        h5tools_str_append(&buffer, "{");
-    if(obj_type >= 0 && dispatch_g[obj_type].name)
-        h5tools_str_append(&buffer, "%s", dispatch_g[obj_type].name);
-    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-    /* Check if we've seen this object before */
-    if(first_seen) {
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, ", same as ");
-        print_string(&buffer, first_seen, TRUE);
-        if(!iter->symlink_target) {
-            h5tools_str_append(&buffer, "\n");
-        }
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-    } /* end if */
-    else {
-        hid_t obj = (-1);               /* ID of object opened */
-
-        /* Open the object.  Not all objects can be opened.  If this is the case
-         * then return right away.
-         */
-        if(obj_type >= 0 && (obj = H5Oopen(iter->fid, name, H5P_DEFAULT)) < 0) {
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, " *ERROR*\n");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            goto done;
-        } /* end if */
-
-        /* List the first line of information for the object. */
-        if(obj_type >= 0 && dispatch_g[obj_type].list1)
-            (dispatch_g[obj_type].list1)(obj);
-        if(!iter->symlink_target || (verbose_g > 0)) {
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "\n");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-        }
-
-        /* Show detailed information about the object, beginning with information
-         * which is common to all objects. */
-        if(verbose_g > 0) {
-            size_t buf_size = 0;
-            char* comment = NULL;
-            ssize_t cmt_bufsize = -1;
-
-            /* Display attributes */
-            if(obj_type >= 0)
-                H5Aiterate2(obj, H5_INDEX_NAME, H5_ITER_INC, NULL, list_attr, NULL);
-
-            /* Object location & reference count */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "    %-10s %lu:"H5_PRINTF_HADDR_FMT"\n", "Location:", oinfo->fileno, oinfo->addr);
-            h5tools_str_append(&buffer, "    %-10s %u\n", "Links:", (unsigned)oinfo->rc);
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            /* Modification time */
-            if(oinfo->mtime > 0) {
-                char buf[256];
-                struct tm *tm;
-
-                if(simple_output_g)
-                    tm = HDgmtime(&(oinfo->mtime));
-                else
-                    tm = HDlocaltime(&(oinfo->mtime));
-                if(tm) {
-                    HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
-                    h5tools_str_reset(&buffer);
-                    h5tools_str_append(&buffer, "    %-10s %s\n", "Modified:", buf);
-                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                } /* end if */
-            } /* end if */
-
-            /* Object comment */
-            cmt_bufsize = H5Oget_comment(obj, comment, buf_size);
-
-            /* if the actual length of the comment is longer than cmt_bufsize, then call
-             * H5Oget_comment again with the correct value.
-             * If the call to H5Oget_comment returned an error, skip this block */
-            if (cmt_bufsize > 0) {
-                comment = (char *)HDmalloc((size_t)cmt_bufsize + 1); /* new_size including null terminator */
-                if(comment) {
-                    cmt_bufsize = H5Oget_comment(obj, comment, (size_t)cmt_bufsize);
-                    if(cmt_bufsize > 0) {
-                        comment[cmt_bufsize] = 0;
-                        h5tools_str_reset(&buffer);
-                        h5tools_str_append(&buffer, "    %-10s \"", "Comment:");
-                        print_string(&buffer, comment, FALSE);
-                        h5tools_str_append(&buffer, "\"\n");
-                        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                    } /* end if */
-                    HDfree(comment);
-                }
-            }
-        } /* end if */
-
-        /* Detailed list for object */
-        if(obj_type >= 0 && dispatch_g[obj_type].list2)
-            (dispatch_g[obj_type].list2)(obj, name);
-
-        /* Close the object. */
-        if(obj_type >= 0)
-            H5Oclose(obj);
-    } /* end else */
-
-done:
-    if(iter->symlink_target) {
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "}\n");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-        iter->symlink_target = FALSE;
-    }
-    h5tools_str_close(&buffer);
-
-    return 0;
-} /* end list_obj() */
-
-
-

-/*-------------------------------------------------------------------------
- * Function: list_lnk
- *
- * Purpose: Prints information about a link
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Quincey Koziol
- *              Thursday, November 8, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-list_lnk(const char *name, const H5L_info_t *linfo, void *_iter)
-{
-    char *buf=NULL;
-    iter_t *iter = (iter_t*)_iter;
-    int ret;
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tool_link_info_t lnk_info;
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-
-    /* init linkinfo struct */
-    HDmemset(&lnk_info, 0, sizeof(h5tool_link_info_t));
-
-    /* if verbose, make H5tools_get_symlink_info() display more */
-    if (verbose_g)
-        lnk_info.opt.msg_mode=1;
-
-    /* Print the link's name, either full name or base name */
-    print_obj_name(&buffer, iter, name, "");
-
-    switch(linfo->type) {
-        case H5L_TYPE_SOFT:
-            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_symlink_g);
-            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
-             * so it will be freed via buf later */
-            buf = (char*)lnk_info.trg_path;
-            /* error */
-            if (ret < 0)
-                goto done;
-            /* no dangling link option given and detect dangling link */
-            else if (no_dangling_link_g && ret == 0)
-                iter->symlink_list->dangle_link = TRUE;
-
-            h5tools_str_append(&buffer, "Soft Link {");
-            h5tools_str_append(&buffer, buf);
-            h5tools_str_append(&buffer, "}");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            if(follow_symlink_g)
-            {
-                hbool_t orig_grp_literal = grp_literal_g;
-                h5tools_str_reset(&buffer);
-                h5tools_str_append(&buffer, " ");
-
-                /* Check if we have already seen this softlink */
-                if(symlink_is_visited(iter->symlink_list, linfo->type, NULL, buf))
-                {
-                    h5tools_str_append(&buffer, "{Already Visited}\n");
-                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                    goto done;
-                }
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                /* Add this link to the list of seen softlinks */
-                if(symlink_visit_add(iter->symlink_list, linfo->type, NULL, buf) < 0)
-                    goto done;
-
-                /* Adjust user data to specify that we are operating on the
-                 * target of an soft link */
-                iter->symlink_target = TRUE;
-
-                /* Prevent recursive listing of soft link target if
-                 * recursive_g is off */
-                if(!recursive_g)
-                    grp_literal_g = TRUE;
-                /* Recurse through the soft link */
-                if(visit_obj(iter->fid, name, iter) < 0)
-                {
-                    grp_literal_g = orig_grp_literal;
-                    goto done;
-                }
-
-                grp_literal_g = orig_grp_literal;
-            }
-            else {
-                h5tools_str_reset(&buffer);
-                h5tools_str_append(&buffer, "\n");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            }
-
-            break;
-
-        case H5L_TYPE_EXTERNAL:
-            {
-            const char *filename;
-            const char *path;
-            hbool_t follow_link = follow_symlink_g || follow_elink_g;
-
-            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_link);
-            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
-             * so it will be freed via buf later */
-            buf = (char*)lnk_info.trg_path;
-            /* error */
-            if (ret < 0)
-                goto done;
-            /* no dangling link option given and detect dangling link */
-            else if (no_dangling_link_g && ret == 0)
-                iter->symlink_list->dangle_link = TRUE;
-
-            if(H5Lunpack_elink_val(buf, linfo->u.val_size, NULL, &filename, &path) < 0)
-                goto done;
-
-            h5tools_str_append(&buffer, "External Link {");
-            h5tools_str_append(&buffer, filename);
-            h5tools_str_append(&buffer, "/");
-            if(*path != '/')
-                h5tools_str_append(&buffer, "/");
-                        h5tools_str_append(&buffer, path);
-            h5tools_str_append(&buffer, "}");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-            /* Recurse through the external link */
-            /* keep the follow_elink_g for backward compatibility with -E */
-            if(follow_link)
-            {
-                hbool_t orig_grp_literal = grp_literal_g;
-                h5tools_str_reset(&buffer);
-                h5tools_str_append(&buffer, " ");
-
-                /* Check if we have already seen this elink */
-                if(symlink_is_visited(iter->symlink_list, linfo->type, filename, path))
-                {
-                    h5tools_str_append(&buffer, "{Already Visited}\n");
-                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                    goto done;
-                }
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-
-                /* Add this link to the list of seen elinks */
-                if(symlink_visit_add(iter->symlink_list, linfo->type, filename, path) < 0)
-                {
-                    goto done;
-                }
-
-                /* Adjust user data to specify that we are operating on the
-                 * target of an external link */
-                iter->symlink_target = TRUE;
-
-                /* Prevent recursive listing of external link target if
-                 * recursive_g is off */
-                if(!recursive_g)
-                    grp_literal_g = TRUE;
-
-                /* Recurse through the external link */
-                if(visit_obj(iter->fid, name, iter) < 0) {
-                    grp_literal_g = orig_grp_literal;
-                    goto done;
-                }
-
-                grp_literal_g = orig_grp_literal;
-            }
-            else
-                PRINTVALSTREAM(rawoutstream, "\n");
-            }
-            break;
-
-        case H5L_TYPE_ERROR:
-        case H5L_TYPE_HARD:
-        case H5L_TYPE_MAX:
-        default:
-            h5tools_str_append(&buffer, "UD Link {cannot follow UD links}\n");
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            break;
-    } /* end switch */
-
-done:
-    h5tools_str_close(&buffer);
-
-    if (buf)
-        HDfree(buf);
-    return 0;
-} /* end list_lnk() */
-
-

-/*-------------------------------------------------------------------------
- * Function: visit_obj
- *
- * Purpose: Begins iteration on an object
- *
- * Return:
- *  Success: 0
- *  Failure: -1
- *
- * Programmer: Neil Fortner
- *              Wednesday, August 21, 2008
- *             Mostly copied from main()
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-visit_obj(hid_t file, const char *oname, iter_t *iter)
-{
-    int retval = 0;
-    H5O_info_t oi;              /* Information for object */
-    hsize_t             curr_pos = 0;        /* total data element position   */
-    h5tools_str_t       buffer;          /* string into which to render   */
-    h5tools_context_t   ctx;             /* print context  */
-    h5tool_format_t    *info = &ls_dataformat;
-
-    HDmemset(&ctx, 0, sizeof(ctx));
-    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-    h5tools_str_reset(&buffer);
-
-    /* Retrieve info for object to list */
-    if(H5Oget_info_by_name(file, oname, &oi, H5P_DEFAULT) < 0) {
-        if(iter->symlink_target) {
-            h5tools_str_append(&buffer, "{**NOT FOUND**}\n");
-            iter->symlink_target = FALSE;
-        }
-        else
-            print_obj_name(&buffer, iter, oname, "**NOT FOUND**");
-        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-        retval = -1;
-        goto done;
-    } /* end if */
-
-    /* Check for group iteration */
-    if(H5O_TYPE_GROUP == oi.type && !grp_literal_g) {
-        /* Get ID for group */
-        if(!iter->symlink_target && (iter->gid = H5Gopen2(file, oname, H5P_DEFAULT)) < 0) {
-            h5tools_str_append(&buffer, "%s: unable to open '%s' as group\n", iter->fname, oname);
-            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-            goto done;   /* Previously "continue", when this code was in main().
-                         * We don't "continue" here in order to close the file
-                         * and free the file name properly. */
-        } /* end if */
-
-        /* Delay specifying the name start point so the original object name is
-         * displayed if it is a link or non-group object */
-        iter->name_start = iter->base_len;
-
-        /* Specified name is a group. List the complete contents of the group. */
-        h5trav_visit(file, oname, (hbool_t) (display_root_g || iter->symlink_target), recursive_g, list_obj, list_lnk, iter);
-
-        /* Close group */
-        if(!iter->symlink_target)
-            H5Gclose(iter->gid);
-    } /* end if */
-    else {
-        /* Use file ID for root group ID */
-        iter->gid = file;
-
-        /* Specified name is a non-group object -- list that object */
-        list_obj(oname, &oi, NULL, iter);
-    } /* end else */
-
-done:
-    h5tools_str_close(&buffer);
-
-    return retval;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: get_width
- *
- * Purpose: Figure out how wide the screen is.  This is highly
- *  unportable, but the user can always override the width we
- *  detect by giving a command-line option. These code snippets
- *  were borrowed from the GNU less(1).
- *
- * Return: Success: Number of columns.
- *
- *  Failure: Some default number of columms.
- *
- * Programmer: Robb Matzke
- *              Friday, November  6, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-get_width(void)
-{
-    int  width = 80;  /*the default   */
-    char *s;
-
-    /* Try to get it from the COLUMNS environment variable first since it's
-     * value is sometimes wrong. */
-    if ((s=HDgetenv("COLUMNS")) && *s && isdigit((int)*s))
-        width = (int)HDstrtol(s, NULL, 0);
-
-#if defined(H5_HAVE_STRUCT_VIDEOCONFIG) && defined(H5_HAVE__GETVIDEOCONFIG)
-    {
-        /* Microsoft C */
-        struct videoconfig w;
-        _getvideoconfig(&w);
-        width = w.numtextcols;
-    }
-#elif defined(H5_HAVE_STRUCT_TEXT_INFO) && defined(H5_HAVE_GETTEXTINFO)
-    {
-        /* Borland C or DJGPPC */
-        struct text_info w;
-        gettextinfo(&w);
-        width = w.screenwidth;
-    }
-#elif defined(H5_HAVE_GETCONSOLESCREENBUFFERINFO)
-    {
-        /* Win32 C */
-        CONSOLE_SCREEN_BUFFER_INFO scr;
-        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &scr);
-        width = scr.srWindow.Right - scr.srWindow.Left + 1;
-    }
-#elif defined(H5_HAVE__SCRSIZE)
-    {
-        /* OS/2 */
-        int w[2];
-        _scrsize(w);
-        width = w[0];
-    }
-#elif defined(H5_HAVE_TIOCGWINSZ) && defined(H5_HAVE_IOCTL)
-    {
-        /* Unix with ioctl(TIOCGWINSZ) */
-        struct winsize w;
-        if (ioctl(2, (int)TIOCGWINSZ, &w)>=0 && w.ws_col>0)
-            width = w.ws_col;
-    }
-#elif defined(H5_HAVE_TIOCGETD) && defined(H5_HAVE_IOCTL)
-    {
-        /* Unix with ioctl(TIOCGETD) */
-        struct uwdata w;
-        if (ioctl(2, WIOCGETD, &w)>=0 && w.uw_width>0)
-            width = w.uw_width / w.uw_hs;
-    }
-#endif
-
-    /* Set to at least 1 */
-    if (width<1) width = 1;
-    return width;
-}
-
-/*-------------------------------------------------------------------------
- * Function: is_valid_args
- *
- * Purpose: check if command line arguments are valid
- *
- * Return:
- *  Success: TRUE (1)
- *  Failure: FALSE (0)
- *
- * Programmer:
- *  Jonathan Kim  (06/15/2010)
- *
- *-------------------------------------------------------------------------*/
-static hbool_t
-is_valid_args(void)
-{
-    hbool_t ret = TRUE;
-
-    if(recursive_g && grp_literal_g)
-    {
-        HDfprintf(rawerrorstream, "Error: 'recursive' option not compatible with 'group info' option!\n\n");
-        ret = FALSE;
-        goto out;
-    }
-
-    if(no_dangling_link_g && !follow_symlink_g)
-    {
-        HDfprintf(rawerrorstream, "Error: --no-dangling-links must be used along with --follow-symlinks option!\n\n");
-        ret = FALSE;
-        goto out;
-    }
-
-out:
-    return ret;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: leave
- *
- * Purpose: Close HDF5 and MPI and call exit()
- *
- * Return: Does not return
- *
- * Programmer: Quincey Koziol
- *              Saturday, January 31, 2004
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-leave(int ret)
-{
-    h5tools_close();
-
-    HDexit(ret);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: Opens a file and lists the specified group
- *
- * Return: Success: 0
- *
- *  Failure: 1
- *
- * Programmer: Robb Matzke
- *              Monday, March 23, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, const char *argv[])
-{
-    hid_t file = -1;
-    char *fname = NULL, *oname = NULL, *x;
-    const char *s = NULL;
-    char *rest;
-    int  argno;
-    static char root_name[] = "/";
-    char        drivername[50];
-    const char *preferred_driver = NULL;
-    int err_exit = 0;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    /* Build object display table */
-    DISPATCH(H5O_TYPE_GROUP, "Group", NULL, NULL);
-    DISPATCH(H5O_TYPE_DATASET, "Dataset", dataset_list1, dataset_list2);
-    DISPATCH(H5O_TYPE_NAMED_DATATYPE, "Type", NULL, datatype_list2);
-
-    /* Default output width */
-    width_g = get_width();
-
-    /* Switches come before non-switch arguments */
-    for(argno = 1; argno < argc && '-' == argv[argno][0]; argno++) {
-        if(!HDstrcmp(argv[argno], "--")) {
-            /* Last switch */
-            argno++;
-            break;
-        } else if(!HDstrcmp(argv[argno], "--help")) {
-            usage();
-            leave(EXIT_SUCCESS);
-        } else if(!HDstrcmp(argv[argno], "--address")) {
-            address_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--data")) {
-            data_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--enable-error-stack")) {
-            show_errors_g = TRUE;
-        /* deprecated --errors */
-        } else if(!HDstrcmp(argv[argno], "--errors")) {
-            show_errors_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--follow-symlinks")) {
-            follow_symlink_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--no-dangling-links")) {
-            no_dangling_link_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--external")) {
-            follow_elink_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--full")) {
-            fullname_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--group")) {
-            grp_literal_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--label")) {
-            label_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--recursive")) {
-            recursive_g = TRUE;
-            fullname_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--simple")) {
-            simple_output_g = TRUE;
-        } else if(!HDstrcmp(argv[argno], "--string")) {
-            string_g = TRUE;
-        } else if(!HDstrncmp(argv[argno], "--vfd=", (size_t)6)) {
-            preferred_driver = argv[argno]+6;
-        } else if(!HDstrncmp(argv[argno], "--width=", (size_t)8)) {
-            width_g = (int)HDstrtol(argv[argno]+8, &rest, 0);
-
-            if(0 == width_g)
-                no_line_wrap_g = TRUE;
-            else if(width_g < 0 || *rest) {
-                usage();
-                leave(EXIT_FAILURE);
-            }
-        } else if(!HDstrcmp(argv[argno], "--width")) {
-            if((argno + 1) >= argc) {
-                usage();
-                leave(EXIT_FAILURE);
-            } else {
-                s = argv[++argno];
-            }
-            width_g = (int)HDstrtol(s, &rest, 0);
-            if(width_g <= 0 || *rest) {
-                usage();
-                leave(EXIT_FAILURE);
-            }
-        } else if(!HDstrcmp(argv[argno], "--verbose")) {
-            verbose_g++;
-        } else if(!HDstrcmp(argv[argno], "--version")) {
-            print_version(h5tools_getprogname());
-            leave(EXIT_SUCCESS);
-        } else if(!HDstrcmp(argv[argno], "--hexdump")) {
-            hexdump_g = TRUE;
-        } else if(!HDstrncmp(argv[argno], "-w", (size_t)2)) {
-            if(argv[argno][2]) {
-                s = argv[argno] + 2;
-            } else if((argno + 1) >= argc) {
-                usage();
-                leave(EXIT_FAILURE);
-            } else {
-                s = argv[++argno];
-            }
-            width_g = (int)HDstrtol(s, &rest, 0);
-
-            if(0 == width_g)
-                no_line_wrap_g = TRUE;
-            else if(width_g < 0 || *rest) {
-                usage();
-                leave(EXIT_FAILURE);
-            }
-        } else if('-'!=argv[argno][1]) {
-            /* Single-letter switches */
-            for(s = argv[argno] + 1; *s; s++) {
-                switch(*s) {
-                    case '?':
-                    case 'h': /* --help */
-                        usage();
-                        leave(EXIT_SUCCESS);
-
-                    case 'a': /* --address */
-                        address_g = TRUE;
-                        break;
-
-                    case 'd': /* --data */
-                        data_g = TRUE;
-                        break;
-
-                    /* deprecated -e */
-                    case 'e': /* --errors */
-                        show_errors_g = TRUE;
-                        break;
-
-                    case 'E': /* --external */
-                        follow_elink_g = TRUE;
-                        break;
-
-                    case 'f': /* --full */
-                        fullname_g = TRUE;
-                        break;
-
-                    case 'g': /* --group */
-                        grp_literal_g = TRUE;
-                        break;
-
-                    case 'l': /* --label */
-                        label_g = TRUE;
-                        break;
-
-                    case 'r': /* --recursive */
-                        recursive_g = TRUE;
-                        fullname_g = TRUE;
-                        break;
-
-                    case 'S': /* --simple */
-                        simple_output_g = TRUE;
-                        break;
-
-                    case 's': /* --string */
-                        string_g = TRUE;
-                        break;
-
-                    case 'v': /* --verbose */
-                        verbose_g++;
-                        break;
-
-                    case 'V': /* --version */
-                        print_version(h5tools_getprogname());
-                        leave(EXIT_SUCCESS);
-
-                    case 'x': /* --hexdump */
-                        hexdump_g = TRUE;
-                        break;
-
-                    default:
-                        usage();
-                        leave(EXIT_FAILURE);
-                } /* end switch */
-            } /* end for */
-        } else {
-            usage();
-            leave(EXIT_FAILURE);
-        }
-    } /* end for */
-
-    /* If no arguments remain then print a usage message (instead of doing
-     * absolutely nothing ;-) */
-    if(argno >= argc) {
-        usage();
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Check for conflicting arguments */
-    if (!is_valid_args())
-    {
-        usage();
-        leave(EXIT_FAILURE);
-    }
-
-    /* Turn off HDF5's automatic error printing unless you're debugging h5ls */
-    if(!show_errors_g)
-        H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-
-
-    /* Each remaining argument is an hdf5 file followed by an optional slash
-     * and object name.
-     *
-     * Example: ../dir1/foo/bar/baz
-     *          \_________/\______/
-     *             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). */
-    show_file_name_g = (argc-argno > 1); /*show file names if more than one*/
-    while(argno < argc) {
-        H5L_info_t li;
-        iter_t iter;
-        symlink_trav_t symlink_list;
-        size_t u;
-
-        fname = HDstrdup(argv[argno++]);
-        oname = NULL;
-        file = -1;
-
-        while(fname && *fname) {
-            file = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, preferred_driver, drivername, sizeof drivername);
-
-            if(file >= 0) {
-                if(verbose_g)
-                    PRINTSTREAM(rawoutstream, "Opened \"%s\" with %s driver.\n", fname, drivername);
-                break; /*success*/
-            } /* end if */
-
-            /* Shorten the file name; lengthen the object name */
-            x = oname;
-            oname = HDstrrchr(fname, '/');
-            if(x)
-                *x = '/';
-            if(!oname)
-                break;
-            *oname = '\0';
-        } /* end while */
-
-        if(file < 0) {
-            HDfprintf(rawerrorstream, "%s: unable to open file\n", argv[argno-1]);
-            HDfree(fname);
-            err_exit = 1;
-            continue;
-        } /* end if */
-        if(oname) {
-            /* Always use absolute paths to avoid confusion, keep track of where
-             * to begin path name output */
-            *oname = '/';
-            iter.base_len = HDstrlen(oname);
-            iter.base_len -= oname[iter.base_len-1] == '/';
-            x = oname;
-            if(NULL == (oname = HDstrdup(oname))) {
-                HDfprintf(rawerrorstream, "memory allocation failed\n");
-                leave(EXIT_FAILURE);
-            }
-            *x = '\0';
-            /* Delay specifying the name start point so the original object name
-             * is displayed if it is a link or non-group object */
-            iter.name_start = 1;
-        }
-        if(!oname || !*oname) {
-            oname = root_name;
-            if(recursive_g)
-                display_root_g = TRUE;
-            iter.base_len = 0;
-            iter.name_start = 0;
-            /* Use x to remember if we have allocated space in oname */
-            x = NULL;
-        } /* end if */
-
-        /* Remember the file information for later */
-        iter.fname = fname;
-        iter.fid = file;
-        iter.gid = -1;
-        iter.symlink_target = FALSE;
-        iter.symlink_list = &symlink_list;
-        iter.symlink_list->dangle_link = FALSE;
-
-        /* Initialize list of visited symbolic links */
-        symlink_list.nused = symlink_list.nalloc = 0;
-        symlink_list.objs = NULL;
-
-        /* Check for root group as object name */
-        if(HDstrcmp(oname, root_name)) {
-            /* Check the type of link given */
-            if(H5Lget_info(file, oname, &li, H5P_DEFAULT) < 0) {
-                hsize_t             curr_pos = 0;        /* total data element position   */
-                h5tools_str_t       buffer;          /* string into which to render   */
-                h5tools_context_t   ctx;             /* print context  */
-                h5tool_format_t    *info = &ls_dataformat;
-
-                HDmemset(&ctx, 0, sizeof(ctx));
-                HDmemset(&buffer, 0, sizeof(h5tools_str_t));
-
-                h5tools_str_reset(&buffer);
-                print_obj_name(&buffer, &iter, oname, "**NOT FOUND**");
-                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
-                leave(EXIT_FAILURE);
-            } /* end if */
-        } /* end if */
-        else
-            li.type = H5L_TYPE_HARD;
-
-        /* Open the object and display it's information */
-        if(li.type == H5L_TYPE_HARD) {
-            if(visit_obj(file, oname, &iter) < 0)
-                leave(EXIT_FAILURE);
-        } /* end if(li.type == H5L_TYPE_HARD) */
-        else {
-            /* Specified name is not for object -- list that link */
-            /* Use file ID for root group ID */
-            iter.gid = file;
-            list_lnk(oname, &li, &iter);
-        }
-        H5Fclose(file);
-        HDfree(fname);
-        if(x)
-            HDfree(oname);
-
-        for(u=0; u < symlink_list.nused; u++)
-        {
-            if (symlink_list.objs[u].type == H5L_TYPE_EXTERNAL)
-                HDfree(symlink_list.objs[u].file);
-
-            HDfree(symlink_list.objs[u].path);
-        }
-        HDfree(symlink_list.objs);
-
-        /* if no-dangling-links option specified and dangling link found */
-        if (no_dangling_link_g && iter.symlink_list->dangle_link)
-            err_exit = 1;
-    } /* end while */
-
-    if (err_exit)
-        leave(EXIT_FAILURE);
-    else
-        leave(EXIT_SUCCESS);
-} /* end main() */
-
diff --git a/tools/h5ls/testh5ls.sh.in b/tools/h5ls/testh5ls.sh.in
deleted file mode 100644
index 68b317c..0000000
--- a/tools/h5ls/testh5ls.sh.in
+++ /dev/null
@@ -1,435 +0,0 @@
-#! /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"
-
-TESTDIR=./testfiles
-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/tall.h5
-$SRC_H5LS_TESTFILES/tarray1.h5
-$SRC_H5LS_TESTFILES/tattr2.h5
-$SRC_H5LS_TESTFILES/tattrreg.h5
-$SRC_H5LS_TESTFILES/tcompound.h5
-$SRC_H5LS_TESTFILES/tdatareg.h5
-$SRC_H5LS_TESTFILES/tdset.h5
-$SRC_H5LS_TESTFILES/tempty.h5
-$SRC_H5LS_TESTFILES/textlink.h5
-$SRC_H5LS_TESTFILES/textlinksrc.h5
-$SRC_H5LS_TESTFILES/textlinktar.h5
-$SRC_H5LS_TESTFILES/tgroup.h5
-$SRC_H5LS_TESTFILES/tgrp_comments.h5
-$SRC_H5LS_TESTFILES/thlink.h5
-$SRC_H5LS_TESTFILES/tloop.h5
-$SRC_H5LS_TESTFILES/tnestedcomp.h5
-$SRC_H5LS_TESTFILES/tsaf.h5
-$SRC_H5LS_TESTFILES/tslink.h5
-$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="
-$SRC_H5LS_TESTFILES/help-1.ls
-$SRC_H5LS_TESTFILES/help-2.ls
-$SRC_H5LS_TESTFILES/help-3.ls
-$SRC_H5LS_TESTFILES/nosuchfile.ls
-$SRC_H5LS_TESTFILES/tall-1.ls
-$SRC_H5LS_TESTFILES/tall-2.ls
-$SRC_H5LS_TESTFILES/tarray1.ls
-$SRC_H5LS_TESTFILES/tattr2.ls
-$SRC_H5LS_TESTFILES/tattrreg_le.ls
-$SRC_H5LS_TESTFILES/tattrreg_be.ls
-$SRC_H5LS_TESTFILES/tcomp-1.ls
-$SRC_H5LS_TESTFILES/tdataregbe.ls
-$SRC_H5LS_TESTFILES/tdataregle.ls
-$SRC_H5LS_TESTFILES/tdset-1.ls
-$SRC_H5LS_TESTFILES/tempty.ls
-$SRC_H5LS_TESTFILES/textlink-1.ls
-$SRC_H5LS_TESTFILES/textlinksrc-1.ls
-$SRC_H5LS_TESTFILES/textlinksrc-2.ls
-$SRC_H5LS_TESTFILES/textlinksrc-3.ls
-$SRC_H5LS_TESTFILES/textlinksrc-4.ls
-$SRC_H5LS_TESTFILES/textlinksrc-5.ls
-$SRC_H5LS_TESTFILES/textlinksrc-6.ls
-$SRC_H5LS_TESTFILES/textlinksrc-7.ls
-$SRC_H5LS_TESTFILES/textlinksrc-1-old.ls
-$SRC_H5LS_TESTFILES/textlinksrc-2-old.ls
-$SRC_H5LS_TESTFILES/textlinksrc-3-old.ls
-$SRC_H5LS_TESTFILES/textlinksrc-6-old.ls
-$SRC_H5LS_TESTFILES/textlinksrc-7-old.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-1.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-2.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-3.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-4.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-5.ls
-$SRC_H5LS_TESTFILES/textlinksrc-nodangle-1.ls
-$SRC_H5LS_TESTFILES/textlinksrc-nodangle-2.ls
-$SRC_H5LS_TESTFILES/tgrp_comments.ls
-$SRC_H5LS_TESTFILES/tsoftlinks-nodangle-1.ls
-$SRC_H5LS_TESTFILES/thlinks-nodangle-1.ls
-$SRC_H5LS_TESTFILES/tgroup.ls
-$SRC_H5LS_TESTFILES/tgroup-1.ls
-$SRC_H5LS_TESTFILES/tgroup-2.ls
-$SRC_H5LS_TESTFILES/tgroup-3.ls
-$SRC_H5LS_TESTFILES/thlink-1.ls
-$SRC_H5LS_TESTFILES/tloop-1.ls
-$SRC_H5LS_TESTFILES/tmultifile.ls
-$SRC_H5LS_TESTFILES/tnestcomp-1.ls
-$SRC_H5LS_TESTFILES/tnestcomp-2.ls
-$SRC_H5LS_TESTFILES/tnestcomp-3.ls
-$SRC_H5LS_TESTFILES/tnestcomp-4.ls
-$SRC_H5LS_TESTFILES/tsaf.ls
-$SRC_H5LS_TESTFILES/tslink-1.ls
-$SRC_H5LS_TESTFILES/tstr-1.ls
-$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
-"
-
-
-# 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
-
-# Toss in a bunch of tests.  Not sure if they are the right kinds.
-# test the help syntax
-TOOLTEST help-1.ls 0 -w80 -h
-TOOLTEST help-2.ls 0 -w80 -help
-TOOLTEST help-3.ls 0 -w80 -?
-
-# test simple command
-TOOLTEST tall-1.ls 0 -w80 tall.h5
-TOOLTEST tall-2.ls 0 -w80 -r -d tall.h5
-TOOLTEST tgroup.ls 0 -w80 tgroup.h5
-TOOLTEST tgroup-3.ls 0 -w80 tgroup.h5/g1
-
-# test for displaying groups
-# 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
-TOOLTEST tgroup-2.ls 0 -w80 -g tgroup.h5/g1
-
-# test for files with groups that have long comments
-TOOLTEST tgrp_comments.ls 0 -w80 -v -g tgrp_comments.h5/glongcomment
-
-# test for displaying simple space datasets
-TOOLTEST tdset-1.ls 0 -w80 -r -d tdset.h5
-
-# test for displaying soft links
-TOOLTEST tslink-1.ls 0 -w80 -r tslink.h5
-
-# test for displaying more soft links with --follow-symlinks
-TOOLTEST tsoftlinks-1.ls 0 --follow-symlinks tsoftlinks.h5
-TOOLTEST tsoftlinks-2.ls 0 --follow-symlinks -r tsoftlinks.h5
-TOOLTEST tsoftlinks-3.ls 0 --follow-symlinks tsoftlinks.h5/group1
-TOOLTEST tsoftlinks-4.ls 0 --follow-symlinks -r tsoftlinks.h5/group1
-TOOLTEST tsoftlinks-5.ls 0 --follow-symlinks tsoftlinks.h5/soft_dset1
-
-# test for displaying external and user-defined links with --follow-symlinks
-TOOLTEST textlink-1.ls 0 -w80 -r textlink.h5
-TOOLTEST textlinksrc-1.ls 0 -w80 --follow-symlinks -r textlinksrc.h5
-TOOLTEST textlinksrc-2.ls 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5
-TOOLTEST textlinksrc-3.ls 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1
-TOOLTEST textlinksrc-4.ls 0 -w80 -r textlinksrc.h5
-TOOLTEST textlinksrc-5.ls 0 -w80 -r textlinksrc.h5/ext_link1
-TOOLTEST textlinksrc-6.ls 0 -w80 --follow-symlinks textlinksrc.h5
-TOOLTEST textlinksrc-7.ls 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1
-TOOLTEST tudlink-1.ls 0 -w80 -r tudlink.h5
-
-# test for displaying external links with -E
-# the option -E will be depriciated but keep it for backward compatibility
-TOOLTEST textlinksrc-1-old.ls 0 -w80 -Er textlinksrc.h5
-TOOLTEST textlinksrc-2-old.ls 0 -w80 -Erv textlinksrc.h5/ext_link5
-TOOLTEST textlinksrc-3-old.ls 0 -w80 -Er textlinksrc.h5/ext_link1
-TOOLTEST textlinksrc-6-old.ls 0 -w80 -E textlinksrc.h5
-TOOLTEST textlinksrc-7-old.ls 0 -w80 -E textlinksrc.h5/ext_link1
-
-# tests for no-dangling-links 
-# if this option is given on dangling link, h5ls should return exit code 1
-# when used alone , expect to print out help and return exit code 1
-TOOLTEST textlinksrc-nodangle-1.ls 1 -w80 --no-dangling-links textlinksrc.h5
-# external dangling link - expected exit code 1
-TOOLTEST textlinksrc-nodangle-2.ls 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5
-# soft dangling link - expected exit code 1
-TOOLTEST tsoftlinks-nodangle-1.ls 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5
-# when used file with no dangling links - expected exit code 0
-TOOLTEST thlinks-nodangle-1.ls 0 -w80 --follow-symlinks --no-dangling-links thlink.h5
-
-# test for wildcards in filename (does not work with cmake)
-# this h5ls test script does not pass the filename properly like the h5dump test script???
-#TOOLTEST tstarfile.ls 0 -w80 t*link.h5
-#TOOLTEST tqmarkfile.ls 0 -w80 t?link.h5
-TOOLTEST tmultifile.ls 0 -w80 thlink.h5 tslink.h5
-
-# tests for hard links
-TOOLTEST thlink-1.ls 0 -w80 thlink.h5
-
-# tests for compound data types
-TOOLTEST tcomp-1.ls 0 -w80 -r -d tcompound.h5
-
-#test for the nested compound type
-TOOLTEST tnestcomp-1.ls 0 -w80 -r -d tnestedcomp.h5
-
-TOOLTEST tnestcomp-2.ls 0 -w80 -r -d -S tnestedcomp.h5
-
-TOOLTEST tnestcomp-3.ls 0 -w80 -r -d -l tnestedcomp.h5
-
-TOOLTEST tnestcomp-4.ls 0 -w80 -r -d -l -S tnestedcomp.h5
-
-# test for loop detection
-TOOLTEST tloop-1.ls 0 -w80 -r -d tloop.h5
-
-# test for string 
-TOOLTEST tstr-1.ls 0 -w80 -r -d tstr.h5
-
-# test test file created from lib SAF team
-TOOLTEST tsaf.ls 0 -w80 -r -d tsaf.h5
-
-# test for variable length data types
-TOOLTEST tvldtypes1.ls 0 -w80 -r -d tvldtypes1.h5
-
-# test for array data types
-TOOLTEST tarray1.ls 0 -w80 -r -d tarray1.h5
-
-# test for empty data
-TOOLTEST tempty.ls 0 -w80 -d tempty.h5
-
-# test for all dataset types written to attributes
-# enable -S for avoiding printing NATIVE types
-TOOLTEST tattr2.ls 0 -w80 -v -S tattr2.h5
-
-# test for attribute with region references without verbose mode
-# ( HDFFV-7838, )
-if test $WORDS_BIGENDIAN != "yes"; then
-TOOLTEST tattrreg_le.ls 0 -w80 -v -d tattrreg.h5
-else
-TOOLTEST tattrreg_be.ls 0 -w80 -v -d tattrreg.h5
-fi
-
-# tests for error handling.
-# test for non-existing file
-TOOLTEST nosuchfile.ls 1 nosuchfile.h5
-
-# test for variable length data types in verbose mode 
-if test $WORDS_BIGENDIAN != "yes"; then
- TOOLTEST tvldtypes2le.ls 0 -v tvldtypes1.h5
-else
- TOOLTEST tvldtypes2be.ls 0 -v tvldtypes1.h5
-fi 
-
-
-# test for dataset region references data types in verbose mode 
-if test $WORDS_BIGENDIAN != "yes"; then
- TOOLTEST tdataregle.ls 0 -v tdatareg.h5
-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
-
-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/h5ls/testh5lsvds.sh.in b/tools/h5ls/testh5lsvds.sh.in
deleted file mode 100644
index d194992..0000000
--- a/tools/h5ls/testh5lsvds.sh.in
+++ /dev/null
@@ -1,258 +0,0 @@
-#! /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
deleted file mode 100644
index d8542a4..0000000
--- a/tools/h5repack/CMakeLists.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5REPACK)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
-
-# --------------------------------------------------------------------
-# Add h5Repack executables
-# --------------------------------------------------------------------
-set (REPACK_COMMON_SRCS
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_copy.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_filters.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_opttable.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_parse.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_refs.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_verify.c
-    ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack.c
-)
-
-add_executable (h5repack ${REPACK_COMMON_SRCS} ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repack_main.c)
-TARGET_NAMING (h5repack STATIC)
-TARGET_C_PROPERTIES (h5repack STATIC " " " ")
-target_link_libraries (h5repack  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5repack PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5repack)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add h5Repack test executables
-  # --------------------------------------------------------------------
-  add_executable (testh5repack_detect_szip ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testh5repack_detect_szip.c)
-  TARGET_NAMING (testh5repack_detect_szip STATIC)
-  TARGET_C_PROPERTIES (testh5repack_detect_szip STATIC " " " ")
-  target_link_libraries (testh5repack_detect_szip ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
-  set_target_properties (testh5repack_detect_szip PROPERTIES FOLDER tools)
-
-  add_executable (h5repacktest ${REPACK_COMMON_SRCS} ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/h5repacktst.c)
-  TARGET_NAMING (h5repacktest STATIC)
-  TARGET_C_PROPERTIES (h5repacktest STATIC " " " ")
-  target_link_libraries (h5repacktest  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
-  set_target_properties (h5repacktest PROPERTIES FOLDER tools)
-
-  #-----------------------------------------------------------------------------
-  # If plugin library tests can be tested
-  #-----------------------------------------------------------------------------
-  set (HDF5_TOOL_PLUGIN_LIB_CORENAME         "dynlibadd")
-  set (HDF5_TOOL_PLUGIN_LIB_NAME             "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_CORENAME}")
-  set (HDF5_TOOL_PLUGIN_LIB_TARGET           ${HDF5_TOOL_PLUGIN_LIB_CORENAME})
-  add_definitions (${HDF_EXTRA_C_FLAGS})
-  INCLUDE_DIRECTORIES (${HDF5_SRC_DIR})
-
-  add_library (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_rpk.c)
-  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED " " " ")
-  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})
-
-  # make plugins dir
-  file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins")
-  #-----------------------------------------------------------------------------
-  # Copy plugin library to a plugins folder
-  #-----------------------------------------------------------------------------
-  add_custom_command (
-      TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      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)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5repack ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5repack
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5repack/CMakeTests.cmake b/tools/h5repack/CMakeTests.cmake
deleted file mode 100644
index c836fd4..0000000
--- a/tools/h5repack/CMakeTests.cmake
+++ /dev/null
@@ -1,1131 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  if (HDF5_TEST_VFD)
-    set (VFD_LIST
-        sec2
-        stdio
-        core
-        split
-        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
-        COMMAND "${CMAKE_COMMAND}"
-            -D "TEST_PROGRAM=$<TARGET_FILE:h5repacktest>"
-            -D "TEST_ARGS:STRING="
-            -D "TEST_VFD:STRING=${vfdname}"
-            -D "TEST_EXPECT=${resultcode}"
-            -D "TEST_OUTPUT=h5repacktest"
-            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-            -P "${HDF_RESOURCES_DIR}/vfdTest.cmake"
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK-VFD-${vfdname}-h5repacktest PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      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
-  # --------------------------------------------------------------------
-  set (LIST_HDF5_TEST_FILES
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr_refs.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_deflate.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_early.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_ext.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_fill.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_filters.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_fletcher.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_hlink.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layouto.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout2.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout3.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.UD.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_named_dtypes.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum_deflated.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nbit.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_objs.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_refs.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_shuffle.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_soffset.h5
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_szip.h5
-      # h5diff/testfile
-      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr1.h5
-      # tools/testfiles
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00000.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00001.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00002.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00003.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00004.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00005.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00006.h5
-      ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00007.h5
-      ${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
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack-help.txt
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_ext.bin
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/ublock.bin
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack.info
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/deflate_limit.h5repack_layout.h5.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_filters.h5.tst
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5-plugin_test.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/plugin_test.h5repack_layout.h5.tst
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/plugin_none.h5repack_layout.UD.h5.tst
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/4_vds.h5-vds_compa-v.ddl
-      ${HDF5_TOOLS_H5REPACK_SOURCE_DIR}/testfiles/4_vds.h5-vds_conti-v.ddl
-  )
-
-  foreach (h5_file ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
-    get_filename_component(fname "${h5_file}" NAME)
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${fname}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5repack
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${h5_file} ${dest}
-    )
-  endforeach (h5_file ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_HELP_TEST testname resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5REPACK-${testname} COMMAND $<TARGET_FILE:h5repack> ${ARGN})
-      set_tests_properties (H5REPACK-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      set (last_test "H5REPACK-${testname}")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5REPACK-h5repack-${testname}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove h5repack-${testname}.out h5repack-${testname}.out.err
-      )
-      set_tests_properties (H5REPACK-h5repack-${testname}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      add_test (
-          NAME H5REPACK-h5repack-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=h5repack-${testname}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=h5repack-${testname}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5REPACK-h5repack-${testname} PROPERTIES DEPENDS "H5REPACK-h5repack-${testname}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_HELP_TEST)
-
-  MACRO (ADD_H5_TEST_OLD testname testtype testfile)
-    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")
-      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}
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK_OLD-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5REPACK_OLD-${testname}_DFF
-          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")
-  ENDMACRO (ADD_H5_TEST_OLD)
-
-  MACRO (ADD_H5_TEST testname testtype testfile)
-    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")
-      add_test (
-          NAME H5REPACK-${testname}
-          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5REPACK-${testname}_DFF
-          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")
-  ENDMACRO (ADD_H5_TEST)
-
-  MACRO (ADD_H5_CMP_TEST testname testfilter testtype resultcode resultfile)
-    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")
-      # If using memchecker add tests without using scripts
-      if (HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_CMP-${testname}
-            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile})
-      else (HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_CMP-${testname}
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
-                -D "TEST_ARGS:STRING=${ARGN};${resultfile};out-${testname}.${resultfile}"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                -D "TEST_OUTPUT=${resultfile}-${testname}.out"
-                -D "TEST_EXPECT=${resultcode}"
-                -D "TEST_FILTER:STRING=${testfilter}"
-                -D "TEST_REFERENCE=${resultfile}.tst"
-                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-        )
-      endif (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK_CMP-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    endif ("${testtype}" STREQUAL "SKIP")
-  ENDMACRO (ADD_H5_CMP_TEST)
-
-  MACRO (ADD_H5_DMP_TEST testname testtype resultcode resultfile)
-    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")
-      # If using memchecker add tests without using scripts
-      add_test (
-          NAME H5REPACK_DMP-${testname}
-          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile})
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK_DMP-${testname} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_DMP-h5dump-${testname}
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                -D "TEST_ARGS:STRING=-pH;out-${testname}.${resultfile}"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                -D "TEST_OUTPUT=${resultfile}-${testname}.out"
-                -D "TEST_EXPECT=${resultcode}"
-                -D "TEST_REFERENCE=${testname}.${resultfile}.ddl"
-                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-        )
-        set_tests_properties (H5REPACK_DMP-h5dump-${testname} PROPERTIES DEPENDS "H5REPACK_DMP-${testname}")
-      endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    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 (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")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_VERIFY_LAYOUT-${testname}
-            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
-        )
-        if (NOT "${last_test}" STREQUAL "")
-          set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname} PROPERTIES DEPENDS ${last_test})
-        endif (NOT "${last_test}" STREQUAL "")
-        add_test (
-            NAME H5REPACK_VERIFY_LAYOUT-${testname}_DFF
-            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")
-          add_test (
-              NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
-              COMMAND "${CMAKE_COMMAND}"
-                  -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                  -D "TEST_ARGS:STRING=-d;${testdset};-pH;out-${testname}.${testfile}"
-                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                  -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
-                  -D "TEST_EXPECT=${resultcode}"
-                  -D "TEST_FILTER:STRING=${testfilter}"
-                  -D "TEST_REFERENCE=${testfilter}"
-                  -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")
-            set (nottestfilter "(CONTIGUOUS|COMPACT)")
-          endif ("${testfilter}" STREQUAL "CHUNKED")
-          if ("${testfilter}" STREQUAL "CONTIGUOUS")
-            set (nottestfilter "(CHUNK|COMPACT)")
-          endif ("${testfilter}" STREQUAL "CONTIGUOUS")
-          if ("${testfilter}" STREQUAL "COMPACT")
-            set (nottestfilter "(CONTIGUOUS|CHUNK)")
-          endif ("${testfilter}" STREQUAL "COMPACT")
-          add_test (
-              NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
-              COMMAND "${CMAKE_COMMAND}"
-                  -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                  -D "TEST_ARGS:STRING=-pH;out-${testname}.${testfile}"
-                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                  -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
-                  -D "TEST_EXPECT=${resultcode}"
-                  -D "TEST_FILTER:STRING=${nottestfilter}"
-                  -D "TEST_REFERENCE=${testfilter}"
-                  -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 (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    endif ("${testtype}" STREQUAL "SKIP")
-  ENDMACRO (ADD_H5_VERIFY_TEST)
-
-  MACRO (ADD_H5_VERIFY_VDS testname testtype resultcode testfile testdset testfilter)
-    if ("${testtype}" STREQUAL "SKIP")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_VERIFY_LAYOUT_VDS-${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")
-      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-        add_test (
-            NAME H5REPACK_VERIFY_LAYOUT_VDS-${testname}
-            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
-        )
-        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-        if (NOT "${last_test}" STREQUAL "")
-          set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname} PROPERTIES DEPENDS ${last_test})
-        endif (NOT "${last_test}" STREQUAL "")
-        add_test (
-            NAME H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP
-            COMMAND "${CMAKE_COMMAND}"
-                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-                -D "TEST_ARGS:STRING=-d;${testdset};-p;out-${testname}.${testfile}"
-                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-                -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
-                -D "TEST_EXPECT=${resultcode}"
-                -D "TEST_REFERENCE=${testfile}-${testname}-v.ddl"
-                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-        )
-        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT_VDS-${testname})
-      endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    endif ("${testtype}" STREQUAL "SKIP")
-  ENDMACRO (ADD_H5_VERIFY_VDS)
-
-  MACRO (ADD_H5_TEST_META testname testfile)
-      add_test (
-          NAME H5REPACK_META-${testname}_N
-          COMMAND $<TARGET_FILE:h5repack> ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_N.${testname}.h5
-      )
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5REPACK_META-${testname}_N PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-      add_test (
-          NAME H5REPACK_META-${testname}_M
-          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_M.${testname}.h5
-      )
-      set_tests_properties (H5REPACK_META-${testname}_M PROPERTIES DEPENDS H5REPACK_META-${testname}_N)
-
-      add_test (NAME H5REPACK_META-${testname} COMMAND ${CMAKE_COMMAND} -E compare_files ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_N.${testname}.h5 ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_M.${testname}.h5)
-      set_tests_properties (H5REPACK_META-${testname} PROPERTIES WILL_FAIL "true")
-      set_tests_properties (H5REPACK_META-${testname} PROPERTIES DEPENDS H5REPACK_META-${testname}_M)
-  ENDMACRO (ADD_H5_TEST_META)
-
-  MACRO (ADD_H5_UD_TEST testname resultcode resultfile)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      # Remove any output file left over from previous test run
-      add_test (
-          NAME H5REPACK_UD-${testname}-clearall-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-              testfiles/out-${testname}.${resultfile}
-              testfiles/${testname}.${resultfile}.out
-              testfiles/${testname}.${resultfile}.out.err
-              testfiles/${resultfile}-${testname}.out
-              testfiles/${resultfile}-${testname}.out.err
-      )
-      add_test (
-          NAME H5REPACK_UD-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
-              -D "TEST_ARGS:STRING=${ARGN};${resultfile};out-${testname}.${resultfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_FILTER:STRING=O?...ing file[^\n]+\n"
-              -D "TEST_OUTPUT=${testname}.${resultfile}.out"
-              -D "TEST_REFERENCE=${testname}.${resultfile}.tst"
-              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
-              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5REPACK_UD-${testname} PROPERTIES DEPENDS H5REPACK_UD-${testname}-clearall-objects)
-      add_test (
-          NAME H5REPACK_UD-h5dump-${testname}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-              -D "TEST_ARGS:STRING=-pH;out-${testname}.${resultfile}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=${resultfile}-${testname}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}-${testname}.ddl"
-              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
-              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5REPACK_UD-h5dump-${testname} PROPERTIES DEPENDS "H5REPACK_UD-${testname}")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_UD_TEST)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # test file names
-  # --------------------------------------------------------------------
-  set (INFO_FILE testfiles/h5repack.info)
-
-  set (FILE0 h5repack_fill.h5)
-  set (FILE1 h5repack_objs.h5)
-  set (FILE2 h5repack_attr.h5)
-  set (FILE3 h5repack_hlink.h5)
-  set (FILE4 h5repack_layout.h5)
-  set (FILE5 h5repack_early.h5)
-  set (FILE7 h5repack_szip.h5)
-  set (FILE8 h5repack_deflate.h5)
-  set (FILE9 h5repack_shuffle.h5)
-  set (FILE10 h5repack_fletcher.h5)
-  set (FILE11 h5repack_filters.h5)
-  set (FILE12 h5repack_nbit.h5)
-  set (FILE13 h5repack_soffset.h5)
-  set (FILE14 h5repack_layouto.h5 )     # A file with an older version of the layout message (copy of test/tlayouto.h5)
-  set (FILE15 h5repack_named_dtypes.h5)
-  set (FILE16 tfamily%05d.h5)           # located in common testfiles folder
-  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
-         ./testfiles/h5dump-help.out
-         ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out
-         ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out.err
-         ./testfiles/h5repack_layout.h5-chunk_18x13-v.out
-         ./testfiles/h5repack_layout.h5-chunk_18x13-v.out.err
-         ./testfiles/h5repack_layout.h5-chunk_20x10-v.out
-         ./testfiles/h5repack_layout.h5-chunk_20x10-v.out.err
-         ./testfiles/h5repack_layout.h5-chunk_compa-v.out
-         ./testfiles/h5repack_layout.h5-chunk_compa-v.out.err
-         ./testfiles/h5repack_layout.h5-chunk_conti-v.out
-         ./testfiles/h5repack_layout.h5-chunk_conti-v.out.err
-         ./testfiles/h5repack_layout.h5-compa-v.out
-         ./testfiles/h5repack_layout.h5-compa-v.out.err
-         ./testfiles/h5repack_layout.h5-conti-v.out
-         ./testfiles/h5repack_layout.h5-conti-v.out.err
-         ./testfiles/h5repack_layout.h5-deflate_limit.out
-         ./testfiles/h5repack_layout.h5-deflate_limit.out.err
-         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-v.out
-         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-v.out.err
-         ./testfiles/h5repack_layout.h5-dset2_compa-v.out
-         ./testfiles/h5repack_layout.h5-dset2_compa-v.out.err
-         ./testfiles/h5repack_layout.h5-dset2_conti-v.out
-         ./testfiles/h5repack_layout.h5-dset2_conti-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_compa_chunk-v.out
-         ./testfiles/h5repack_layout.h5-dset_compa_chunk-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_compa_compa-v.out
-         ./testfiles/h5repack_layout.h5-dset_compa_compa-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_compa_conti-v.out
-         ./testfiles/h5repack_layout.h5-dset_compa_conti-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_conti_chunk-v.out
-         ./testfiles/h5repack_layout.h5-dset_conti_chunk-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_conti_compa-v.out
-         ./testfiles/h5repack_layout.h5-dset_conti_compa-v.out.err
-         ./testfiles/h5repack_layout.h5-dset_conti_conti-v.out
-         ./testfiles/h5repack_layout.h5-dset_conti_conti-v.out.err
-         ./testfiles/h5repack_layout.h5-layout_long_switches-v.out
-         ./testfiles/h5repack_layout.h5-layout_long_switches-v.out.err
-         ./testfiles/h5repack_layout.h5-layout_short_switches-v.out
-         ./testfiles/h5repack_layout.h5-layout_short_switches-v.out.err
-         ./testfiles/h5repack_layout.h5-plugin_test.out
-         ./testfiles/h5repack_layout.h5-plugin_test.out.err
-         ./testfiles/h5repack_layout2.h5-contig_small_compa-v.out
-         ./testfiles/h5repack_layout2.h5-contig_small_compa-v.out.err
-         ./testfiles/h5repack_layout2.h5-contig_small_fixed_compa-v.out
-         ./testfiles/h5repack_layout2.h5-contig_small_fixed_compa-v.out.err
-         ./testfiles/h5repack_layout3.h5-ckdim_biger-v.out
-         ./testfiles/h5repack_layout3.h5-ckdim_biger-v.out.err
-         ./testfiles/h5repack_layout3.h5-ckdim_smaller-v.out
-         ./testfiles/h5repack_layout3.h5-ckdim_smaller-v.out.err
-         ./testfiles/h5repack_layout3.h5-chunk2chunk-v.out
-         ./testfiles/h5repack_layout3.h5-chunk2chunk-v.out.err
-         ./testfiles/h5repack_layout3.h5-chunk2compa-v.out
-         ./testfiles/h5repack_layout3.h5-chunk2compa-v.out.err
-         ./testfiles/h5repack_layout3.h5-chunk2conti-v.out
-         ./testfiles/h5repack_layout3.h5-chunk2conti-v.out.err
-         ./testfiles/h5repack_layout3.h5-error1-v.out
-         ./testfiles/h5repack_layout3.h5-error1-v.out.err
-         ./testfiles/h5repack_layout3.h5-error2-v.out
-         ./testfiles/h5repack_layout3.h5-error2-v.out.err
-         ./testfiles/h5repack_layout3.h5-error3-v.out
-         ./testfiles/h5repack_layout3.h5-error3-v.out.err
-         ./testfiles/out-family.tfamily%05d.h5
-         ./testfiles/out-HDFFV-7840.h5diff_attr1.h5
-         ./testfiles/out-attr.h5repack_attr.h5
-         ./testfiles/out-native_attr.h5repack_attr.h5
-         ./testfiles/out-HDFFV-5932.h5repack_attr_refs.h5
-         ./testfiles/out-deflate_copy.h5repack_deflate.h5
-         ./testfiles/out-deflate_remove.h5repack_deflate.h5
-         ./testfiles/out-early.h5repack_early.h5
-         ./testfiles/out-fill.h5repack_fill.h5
-         ./testfiles/out-native_fill.h5repack_fill.h5
-         ./testfiles/out-gzip_verbose_filters.h5repack_filters.h5
-         ./testfiles/out-fletcher_copy.h5repack_fletcher.h5
-         ./testfiles/out-fletcher_remove.h5repack_fletcher.h5
-         ./testfiles/out-hlink.h5repack_hlink.h5
-         ./testfiles/out-chunk_18x13.h5repack_layout.h5
-         ./testfiles/out-chunk_20x10.h5repack_layout.h5
-         ./testfiles/out-chunk_compa.h5repack_layout.h5
-         ./testfiles/out-chunk_conti.h5repack_layout.h5
-         ./testfiles/out-compa.h5repack_layout.h5
-         ./testfiles/out-conti.h5repack_layout.h5
-         ./testfiles/out-deflate_file.h5repack_layout.h5
-         ./testfiles/out-deflate_limit.h5repack_layout.h5
-         ./testfiles/out-dset2_chunk_20x10.h5repack_layout.h5
-         ./testfiles/out-dset2_compa.h5repack_layout.h5
-         ./testfiles/out-dset2_conti.h5repack_layout.h5
-         ./testfiles/out-dset_compa_chunk.h5repack_layout.h5
-         ./testfiles/out-dset_compa_compa.h5repack_layout.h5
-         ./testfiles/out-dset_compa_conti.h5repack_layout.h5
-         ./testfiles/out-dset_conti_chunk.h5repack_layout.h5
-         ./testfiles/out-dset_conti_compa.h5repack_layout.h5
-         ./testfiles/out-dset_conti_conti.h5repack_layout.h5
-         ./testfiles/out-fletcher_all.h5repack_layout.h5
-         ./testfiles/out-fletcher_individual.h5repack_layout.h5
-         ./testfiles/out-global_filters.h5repack_layout.h5
-         ./testfiles/out-gzip_all.h5repack_layout.h5
-         ./testfiles/out-gzip_individual.h5repack_layout.h5
-         ./testfiles/out-layout.h5repack_layout.h5
-         ./testfiles/out-layout_long_switches.h5repack_layout.h5
-         ./testfiles/out-layout_short_switches.h5repack_layout.h5
-         ./testfiles/out-old_style_layout_short_switches.h5repack_layout.h5
-         ./testfiles/out-plugin_test.h5repack_layout.h5
-         ./testfiles/out-shuffle_all.h5repack_layout.h5
-         ./testfiles/out-shuffle_individual.h5repack_layout.h5
-         ./testfiles/out-upgrade_layout.h5repack_layouto.h5
-         ./testfiles/out-contig_small_compa.h5repack_layout2.h5
-         ./testfiles/out-contig_small_fixed_compa.h5repack_layout2.h5
-         ./testfiles/out-ckdim_biger.h5repack_layout3.h5
-         ./testfiles/out-ckdim_smaller.h5repack_layout3.h5
-         ./testfiles/out-chunk2chunk.h5repack_layout3.h5
-         ./testfiles/out-chunk2compa.h5repack_layout3.h5
-         ./testfiles/out-chunk2conti.h5repack_layout3.h5
-         ./testfiles/out-error1.h5repack_layout3.h5
-         ./testfiles/out-error2.h5repack_layout3.h5
-         ./testfiles/out-error3.h5repack_layout3.h5
-         ./testfiles/out-error4.h5repack_layout3.h5
-         ./testfiles/out-committed_dt.h5repack_named_dtypes.h5
-         ./testfiles/out-nbit_add.h5repack_nbit.h5
-         ./testfiles/out-nbit_copy.h5repack_nbit.h5
-         ./testfiles/out-nbit_remove.h5repack_nbit.h5
-         ./testfiles/out-add_alignment.h5repack_objs.h5
-         ./testfiles/out-add_userblock.h5repack_objs.h5
-         ./testfiles/out-objs.h5repack_objs.h5
-         ./testfiles/out-gt_mallocsize.h5repack_objs.h5
-         ./testfiles/out-bug1814.h5repack_refs.h5
-         ./testfiles/out-shuffle_copy.h5repack_shuffle.h5
-         ./testfiles/out-shuffle_remove.h5repack_shuffle.h5
-         ./testfiles/out-scale_add.h5repack_soffset.h5
-         ./testfiles/out-scale_copy.h5repack_soffset.h5
-         ./testfiles/out-scale_remove.h5repack_soffset.h5
-         ./testfiles/out-meta_short_M.meta_short.h5
-         ./testfiles/out-meta_short_N.meta_short.h5
-         ./testfiles/out-meta_long_M.meta_long.h5
-         ./testfiles/out-meta_long_N.meta_long.h5
-         ./testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.out
-         ./testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.out.err
-         ./testfiles/2_vds.h5-vds_chunk3x6x9-v.out
-         ./testfiles/2_vds.h5-vds_chunk3x6x9-v.out.err
-         ./testfiles/3_1_vds.h5-vds_chunk2x5x8-v.out
-         ./testfiles/3_1_vds.h5-vds_chunk2x5x8-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_conti-v.out
-         ./testfiles/4_vds.h5-vds_conti-v.out.err
-         ./testfiles/out-vds_compa.4_vds.h5
-         ./testfiles/out-vds_conti.4_vds.h5
-         ./testfiles/out-vds_chunk2x5x8.3_1_vds.h5
-         ./testfiles/out-vds_chunk3x6x9.2_vds.h5
-         ./testfiles/out-vds_dset_chunk20x10x5.1_vds.h5
-         h5repack_attr.h5
-         h5repack_attr_out.h5
-         h5repack_attr_refs.h5
-         h5repack_big.h5
-         h5repack_deflate.h5
-         h5repack_deflate_out.h5
-         h5repack_early2.h5
-         h5repack_early.h5
-         h5repack_early_out.h5
-         h5repack_ext.h5
-         h5repack_ext_out.h5
-         h5repack_fill.h5
-         h5repack_fill_out.h5
-         h5repack_filters.h5
-         h5repack_filters_out.h5
-         h5repack_fletcher.h5
-         h5repack_fletcher_out.h5
-         h5repack_hlink.h5
-         h5repack_hlink_out.h5
-         h5repack_layout.h5
-         h5repack_layout_out.h5
-         h5repack_layout2.h5
-         h5repack_layout3.h5
-         h5repack_named_dtypes.h5
-         h5repack_named_dtypes_out.h5
-         h5repack_nbit.h5
-         h5repack_nbit_out.h5
-         h5repack_objs.h5
-         h5repack_objs_out.h5
-         h5repack_refs.h5
-         h5repack_shuffle.h5
-         h5repack_shuffle_out.h5
-         h5repack_soffset.h5
-         h5repack_soffset_out.h5
-         h5repack_szip.h5
-         h5repack_szip_out.h5
-         h5repack_ub.h5
-         h5repack_ub_out.h5
-         h5repack_ext.bin
-         ublock.bin
-  )
-  if (NOT "${last_test}" STREQUAL "")
-    set_tests_properties (H5REPACK-clearall-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
-
-  ADD_HELP_TEST(help 0 -h)
-
-  add_test (NAME H5REPACK-testh5repack_detect_szip COMMAND $<TARGET_FILE:testh5repack_detect_szip>)
-  if (HDF5_ENABLE_SZIP_SUPPORT)
-    if (HDF5_ENABLE_SZIP_ENCODING)
-      set (passRegex "yes")
-      set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "yes")
-    else (HDF5_ENABLE_SZIP_ENCODING)
-      set (passRegex "no")
-      set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "no")
-    endif (HDF5_ENABLE_SZIP_ENCODING)
-  else (HDF5_ENABLE_SZIP_SUPPORT)
-    set (passRegex "no")
-    set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "no")
-  endif (HDF5_ENABLE_SZIP_SUPPORT)
-  set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES DEPENDS H5REPACK-clearall-objects)
-
-  add_test (NAME H5REPACK-h5repacktest COMMAND $<TARGET_FILE:h5repacktest>)
-  set_tests_properties (H5REPACK-h5repacktest PROPERTIES DEPENDS H5REPACK-testh5repack_detect_szip)
-  set (last_test "H5REPACK-h5repacktest")
-
-#
-# The tests
-# We use the files generated by h5repacktst
-# 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
-#
-
-# 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.
-  set (USE_FILTER_SZIP_ENCODER "no")
-  if (HDF5_ENABLE_SZIP_ENCODING)
-    set (USE_FILTER_SZIP_ENCODER ${testh5repack_detect_szip})
-  endif (HDF5_ENABLE_SZIP_ENCODING)
-
-  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)
-
-# 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})
-  ADD_H5_TEST (hlink "TEST" ${FILE3})
-  ADD_H5_TEST (layout "TEST" ${FILE4})
-  ADD_H5_TEST (early "TEST" ${FILE5})
-
-# nested 8bit enum in both deflated and non-deflated datafiles
-  if (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (nested_8bit_enum "TEST" h5repack_nested_8bit_enum.h5)
-  else (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (nested_8bit_enum "TEST" h5repack_nested_8bit_enum_deflated.h5)
-  endif (NOT USE_FILTER_DEFLATE)
-
-# use $FILE4 to write some filters  (this file has  no filters)
-
-# gzip with individual object
-  set (arg ${FILE4} -f dset1:GZIP=1  -l dset1:CHUNK=20x10)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (gzip_individual ${TESTTYPE} ${arg})
-
-# gzip for all
-  set (arg ${FILE4} -f GZIP=1)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (gzip_all ${TESTTYPE} ${arg})
-
-# szip with individual object
-  set (arg ${FILE4} -f dset2:SZIP=8,EC  -l dset2:CHUNK=20x10)
-  set (TESTTYPE "TEST")
-  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})
-
-# szip for all
-  set (arg ${FILE4} -f SZIP=8,NN)
-  set (TESTTYPE "TEST")
-  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})
-
-# shuffle with individual object
-  set (arg ${FILE4} -f dset2:SHUF  -l dset2:CHUNK=20x10)
-  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})
-
-# fletcher32 for all
-  set (arg ${FILE4} -f FLET)
-  ADD_H5_TEST (fletcher_all "TEST" ${arg})
-
-# all filters
-  set (arg ${FILE4} -f dset2:SHUF -f dset2:FLET -f dset2:SZIP=8,NN -f dset2:GZIP=1 -l dset2:CHUNK=20x10)
-  set (TESTTYPE "TEST")
-  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 (all_filters ${TESTTYPE} ${arg})
-
-# verbose gzip with individual object
-  set (arg ${FILE11} -v -f /dset_deflate:GZIP=9)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    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
-###########################################################
-
-# szip copy
-  set (arg ${FILE7})
-  set (TESTTYPE "TEST")
-  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_copy ${TESTTYPE} ${arg})
-
-# szip remove
-  set (arg ${FILE7} --filter=dset_szip:NONE)
-  set (TESTTYPE "TEST")
-  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_remove ${TESTTYPE} ${arg})
-
-# deflate copy
-  set (arg ${FILE8})
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (deflate_copy ${TESTTYPE} ${arg})
-
-# deflate remove
-  set (arg ${FILE8} -f dset_deflate:NONE)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    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})
-
-# shuffle remove
-  set (arg ${FILE9} -f dset_shuffle:NONE)
-  ADD_H5_TEST (shuffle_remove "TEST" ${arg})
-
-# fletcher32 copy
-  set (arg ${FILE10})
-  ADD_H5_TEST (fletcher_copy "TEST" ${arg})
-
-# fletcher32 remove
-  set (arg ${FILE10} -f dset_fletcher32:NONE)
-  ADD_H5_TEST (fletcher_remove "TEST" ${arg})
-
-# nbit copy
-  set (arg ${FILE12})
-  ADD_H5_TEST (nbit_copy "TEST" ${arg})
-
-# nbit remove
-  set (arg ${FILE12} -f dset_nbit:NONE)
-  ADD_H5_TEST (nbit_remove "TEST" ${arg})
-
-# nbit add
-  set (arg ${FILE12} -f dset_int31:NBIT)
-  ADD_H5_TEST (nbit_add "TEST" ${arg})
-
-# scaleoffset copy
-  set (arg ${FILE13})
-  ADD_H5_TEST (scale_copy "TEST" ${arg})
-
-# scaleoffset add
-  set (arg ${FILE13} -f dset_none:SOFF=31,IN)
-  ADD_H5_TEST (scale_add "TEST" ${arg})
-
-# scaleoffset remove
-  set (arg ${FILE13} -f dset_scaleoffset:NONE)
-  ADD_H5_TEST (scale_remove "TEST" ${arg})
-
-# remove all  filters
-  set (arg ${FILE11} -f NONE)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_SZIP_ENCODER)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_SZIP_ENCODER)
-  ADD_H5_TEST (remove_all ${TESTTYPE} ${arg})
-
-#filter conversions
-  set (arg ${FILE8} -f dset_deflate:SZIP=8,NN)
-  set (TESTTYPE "TEST")
-  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})
-
-  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})
-
-#limit
-  set (arg ${FILE4} -f GZIP=1 -m 1024)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_DMP_TEST (deflate_limit ${TESTTYPE} 0 ${arg})
-
-#file
-  set (arg ${FILE4} -e ${INFO_FILE})
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (deflate_file ${TESTTYPE} ${arg})
-
-#########################################################
-# layout options (these files have no filters)
-#########################################################
-  ADD_H5_VERIFY_TEST (dset2_chunk_20x10 "TEST" 0 ${FILE4} dset2 CHUNKED --layout=dset2:CHUNK=20x10)
-  ADD_H5_VERIFY_TEST (chunk_20x10 "TEST" 1 ${FILE4} null CHUNKED -l CHUNK=20x10)
-  ADD_H5_VERIFY_TEST (dset2_conti "TEST" 0 ${FILE4} dset2 CONTIGUOUS -l dset2:CONTI)
-  ADD_H5_VERIFY_TEST (conti "TEST" 1 ${FILE4} null CONTIGUOUS -l CONTI)
-  ADD_H5_VERIFY_TEST (dset2_compa "TEST" 0 ${FILE4} dset2 COMPACT -l dset2:COMPA)
-  ADD_H5_VERIFY_TEST (compa "TEST" 1 ${FILE4} null COMPACT -l COMPA)
-
-################################################################
-# layout conversions (file has no filters)
-###############################################################
-  ADD_H5_VERIFY_TEST (dset_compa_conti "TEST" 0 ${FILE4} dset_compact CONTIGUOUS -l dset_compact:CONTI)
-  ADD_H5_VERIFY_TEST (dset_compa_chunk "TEST" 0 ${FILE4} dset_compact CHUNKED -l dset_compact:CHUNK=2x5)
-  ADD_H5_VERIFY_TEST (dset_compa_compa "TEST" 0 ${FILE4} dset_compact COMPACT -l dset_compact:COMPA)
-  ADD_H5_VERIFY_TEST (dset_conti_compa "TEST" 0 ${FILE4} dset_contiguous COMPACT -l dset_contiguous:COMPA)
-  ADD_H5_VERIFY_TEST (dset_conti_chunk "TEST" 0 ${FILE4} dset_contiguous CHUNKED -l dset_contiguous:CHUNK=3x6)
-  ADD_H5_VERIFY_TEST (dset_conti_conti "TEST" 0 ${FILE4} dset_contiguous CONTIGUOUS -l dset_contiguous:CONTI)
-  ADD_H5_VERIFY_TEST (chunk_compa "TEST" 0 ${FILE4} dset_chunk COMPACT -l dset_chunk:COMPA)
-  ADD_H5_VERIFY_TEST (chunk_conti "TEST" 0 ${FILE4} dset_chunk CONTIGUOUS -l dset_chunk:CONTI)
-  ADD_H5_VERIFY_TEST (chunk_18x13 "TEST" 0 ${FILE4} dset_chunk CHUNKED -l dset_chunk:CHUNK=18x13)
-
-# test convert small size dataset ( < 1k) to compact layout without -m
-  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
-# 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
-  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,
-# should remain as original layout (chunk)
-  ADD_H5_VERIFY_TEST (chunk2compa "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA)
-
-#--------------------------------------------------------------------------
-# Test -f for some specific cases. Chunked dataset with unlimited max dims.
-# (HDFFV-8012)
-#--------------------------------------------------------------------------
-# - should not fail
-# - should not change max dims from unlimit
-
-# chunk dim is bigger than dataset dim. ( dset size < 64k )
-  ADD_H5_VERIFY_TEST (error1 "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 H5S_UNLIMITED -f chunk_unlimit1:NONE)
-
-# chunk dim is bigger than dataset dim. ( dset size > 64k )
-  ADD_H5_VERIFY_TEST (error2 "TEST" 0 h5repack_layout3.h5 chunk_unlimit2 H5S_UNLIMITED -f chunk_unlimit2:NONE)
-
-# chunk dims are smaller than dataset dims. ( dset size < 64k )
-  ADD_H5_VERIFY_TEST (error3 "TEST" 0 h5repack_layout3.h5 chunk_unlimit3 H5S_UNLIMITED -f chunk_unlimit3:NONE)
-
-# file input - should not fail
-  ADD_H5_TEST (error4 "TEST" h5repack_layout3.h5 -f NONE)
-
-#--------------------------------------------------------------------------
-# 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.
-  ADD_H5_VERIFY_TEST (ckdim_smaller "TEST" 0 h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI)
-
-
-
-# Native option
-# Do not use FILE1, as the named dtype will be converted to native, and h5diff will
-# report a difference.
-  ADD_H5_TEST (native_fill "TEST" ${FILE0} -n)
-  ADD_H5_TEST (native_attr "TEST" ${FILE2} -n)
-
-# latest file format with long switches. use FILE4=h5repack_layout.h5 (no filters)
-  set (arg --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype])
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_TEST (layout_long_switches ${TESTTYPE} 1 ${FILE4} null CHUNKED ${arg})
-
-# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
-  set (arg -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype])
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_TEST (layout_short_switches ${TESTTYPE} 1 ${FILE4} null CHUNKED ${arg})
-
-# several global filters
-  set (arg ${FILE4} --filter GZIP=1 --filter SHUF)
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (global_filters ${TESTTYPE} ${arg})
-
-# syntax of -i infile -o outfile
-# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
-  set (arg ${FILE4} -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype])
-  set (TESTTYPE "LEGACY")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST_OLD (old_style_layout_short_switches ${TESTTYPE} ${arg})
-
-# add a userblock to file
-  set (arg ${FILE1} -u ${PROJECT_BINARY_DIR}/testfiles/ublock.bin -b 2048)
-  ADD_H5_TEST (add_userblock "TEST" ${arg})
-
-# add alignment
-  set (arg ${FILE1} -t 1 -a 1)
-  ADD_H5_TEST (add_alignment "TEST" ${arg})
-
-# Check repacking file with old version of layout message (should get upgraded
-# to new version and be readable, etc.)
-  ADD_H5_TEST (upgrade_layout "TEST" ${FILE14})
-
-# test for datum size > H5TOOLS_MALLOCSIZE
-  ADD_H5_TEST (gt_mallocsize "TEST" ${FILE1} -f GZIP=1)
-
-# Check repacking file with committed datatypes in odd configurations
-  ADD_H5_TEST (committed_dt "TEST" ${FILE15})
-
-# tests family driver (file is located in common testfiles folder, uses TOOLTEST1
-  ADD_H5_TEST (family "TEST" ${FILE16})
-
-# test various references (bug 1814 and 1726)
-  ADD_H5_TEST (bug1814 "TEST" ${FILE_REF})
-
-# test attribute with various references (bug1797 / HDFFV-5932)
-# 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
-# 2. leak from compound type without reference member
-# (HDFFV-7840, )
-# Note: this test is experimental for sharing test file among tools
-  ADD_H5_TEST (HDFFV-7840 "TEST" h5diff_attr1.h5)
-
-# tests for metadata block size option ('-M')
-  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 conversions
-###############################################################
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_VDS (vds_dset_chunk20x10x5 ${TESTTYPE} 0 ${FILEV1} vds_dset CHUNKED -l vds_dset:CHUNK=20x10x5)
-
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_VDS (vds_chunk2x5x8 ${TESTTYPE} 0 ${FILEV3_1} vds_dset CHUNKED -l vds_dset:CHUNK=2x5x8)
-
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_VDS (vds_chunk3x6x9 ${TESTTYPE} 0 ${FILEV2} vds_dset CHUNKED -l vds_dset:CHUNK=3x6x9)
-
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_VDS (vds_compa ${TESTTYPE} 0 ${FILEV4} vds_dset COMPACT -l vds_dset:COMPA)
-
-  set (TESTTYPE "TEST")
-  if (NOT USE_FILTER_DEFLATE)
-    set (TESTTYPE "SKIP")
-  endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_VERIFY_VDS (vds_conti ${TESTTYPE} 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
-
-##############################################################################
-###    P L U G I N  T E S T S
-##############################################################################
-  ADD_H5_UD_TEST (plugin_test 0 h5repack_layout.h5 -v -f UD=257,1,9)
-  ADD_H5_UD_TEST (plugin_none 0 h5repack_layout.UD.h5 -v -f NONE)
-
-  if (HDF5_TEST_VFD)
-    # Run test with different Virtual File Driver
-    foreach (vfd ${VFD_LIST})
-      ADD_VFD_TEST (${vfd} 0)
-    endforeach (vfd ${VFD_LIST})
-  endif (HDF5_TEST_VFD)
diff --git a/tools/h5repack/Makefile.am b/tools/h5repack/Makefile.am
deleted file mode 100644
index 21ac362..0000000
--- a/tools/h5repack/Makefile.am
+++ /dev/null
@@ -1,78 +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.
-##
-## Makefile.am
-## Run automake to generate a Makefile.in from this file.
-#
-# HDF5 Library Makefile(.in)
-#
-
-include $(top_srcdir)/config/commence.am
-
-# Include src, test, and tools/lib directories
-AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
-
-# Test programs and scripts
-TEST_SCRIPT=h5repack.sh
-TEST_PROG=h5repacktst
-noinst_PROGRAMS=testh5repack_detect_szip
-
-SCRIPT_DEPEND=h5repack$(EXEEXT)
-if HAVE_SHARED_CONDITIONAL
-if USE_PLUGINS_CONDITIONAL
-   TEST_SCRIPT += h5repack_plugin.sh
-endif
-endif
-
-check_SCRIPTS=$(TEST_SCRIPT)
-check_PROGRAMS=$(TEST_PROG)
-
-# Our main target, h5repack tool
-bin_PROGRAMS=h5repack
-
-# Add h5repack specific linker flags here
-h5repack_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Depend on the hdf5 library, the tools library, the test library
-LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-
-# Source files
-COMMON_SOURCES=h5repack.c h5repack_copy.c h5repack_filters.c \
-               h5repack_opttable.c h5repack_parse.c h5repack_refs.c \
-               h5repack_verify.c
-
-h5repack_SOURCES=$(COMMON_SOURCES) h5repack_main.c
-
-h5repacktst_SOURCES=$(COMMON_SOURCES) h5repacktst.c 
-
-testh5repack_detect_szip_SOURCES=testh5repack_detect_szip.c
-
-# The h5repack.sh script needs h5repacktst to run first.
-h5repack.sh.chkexe_: h5repacktst.chkexe_
-
-if HAVE_SHARED_CONDITIONAL
-  # Build it as shared library if configure is enabled for shared library.
-  lib_LTLIBRARIES=libdynlibadd.la
-  libdynlibadd_la_SOURCES=dynlib_rpk.c
-
-install-exec-hook:
-	$(RM) $(DESTDIR)$(libdir)/*dynlib*
-endif
-
-# Temporary files.  *.h5 are generated by h5repack.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES+=*.h5 *.bin testfiles/h5diff_attr1.h5 testfiles/tfamily*.h5
-DISTCLEANFILES=h5repack.sh h5repack_plugin.sh
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5repack/Makefile.in b/tools/h5repack/Makefile.in
deleted file mode 100644
index 7fb265c..0000000
--- a/tools/h5repack/Makefile.in
+++ /dev/null
@@ -1,1604 +0,0 @@
-# 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@
-noinst_PROGRAMS = testh5repack_detect_szip$(EXEEXT)
- at HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5repack_plugin.sh
-check_PROGRAMS = $(am__EXEEXT_1)
-bin_PROGRAMS = h5repack$(EXEEXT)
-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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = h5repack.sh h5repack_plugin.sh
-CONFIG_CLEAN_VPATH_FILES =
-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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libdynlibadd_la_LIBADD =
-am__libdynlibadd_la_SOURCES_DIST = dynlib_rpk.c
- at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibadd_la_OBJECTS =  \
- at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_rpk.lo
-libdynlibadd_la_OBJECTS = $(am_libdynlibadd_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 HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibadd_la_rpath = -rpath \
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(libdir)
-am__EXEEXT_1 = h5repacktst$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
-am__objects_1 = h5repack.$(OBJEXT) h5repack_copy.$(OBJEXT) \
-	h5repack_filters.$(OBJEXT) h5repack_opttable.$(OBJEXT) \
-	h5repack_parse.$(OBJEXT) h5repack_refs.$(OBJEXT) \
-	h5repack_verify.$(OBJEXT)
-am_h5repack_OBJECTS = $(am__objects_1) h5repack_main.$(OBJEXT)
-h5repack_OBJECTS = $(am_h5repack_OBJECTS)
-h5repack_LDADD = $(LDADD)
-h5repack_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5repack_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5repack_LDFLAGS) $(LDFLAGS) -o $@
-am_h5repacktst_OBJECTS = $(am__objects_1) h5repacktst.$(OBJEXT)
-h5repacktst_OBJECTS = $(am_h5repacktst_OBJECTS)
-h5repacktst_LDADD = $(LDADD)
-h5repacktst_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-am_testh5repack_detect_szip_OBJECTS =  \
-	testh5repack_detect_szip.$(OBJEXT)
-testh5repack_detect_szip_OBJECTS =  \
-	$(am_testh5repack_detect_szip_OBJECTS)
-testh5repack_detect_szip_LDADD = $(LDADD)
-testh5repack_detect_szip_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) \
-	$(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 = $(libdynlibadd_la_SOURCES) $(h5repack_SOURCES) \
-	$(h5repacktst_SOURCES) $(testh5repack_detect_szip_SOURCES)
-DIST_SOURCES = $(am__libdynlibadd_la_SOURCES_DIST) $(h5repack_SOURCES) \
-	$(h5repacktst_SOURCES) $(testh5repack_detect_szip_SOURCES)
-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__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)/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@
-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, test, and tools/lib directories
-AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
-	-I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5repack.  They should
-# copied to the testfiles/ directory if update is required.
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.bin \
-	testfiles/h5diff_attr1.h5 testfiles/tfamily*.h5
-
-# Test programs and scripts
-TEST_SCRIPT = h5repack.sh $(am__append_1)
-TEST_PROG = h5repacktst
-SCRIPT_DEPEND = h5repack$(EXEEXT)
-check_SCRIPTS = $(TEST_SCRIPT)
-
-# Add h5repack specific linker flags here
-h5repack_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Depend on the hdf5 library, the tools library, the test library
-LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-
-# Source files
-COMMON_SOURCES = h5repack.c h5repack_copy.c h5repack_filters.c \
-               h5repack_opttable.c h5repack_parse.c h5repack_refs.c \
-               h5repack_verify.c
-
-h5repack_SOURCES = $(COMMON_SOURCES) h5repack_main.c
-h5repacktst_SOURCES = $(COMMON_SOURCES) h5repacktst.c 
-testh5repack_detect_szip_SOURCES = testh5repack_detect_szip.c
- at HAVE_SHARED_CONDITIONAL_TRUE@lib_LTLIBRARIES = libdynlibadd.la
- at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibadd_la_SOURCES = dynlib_rpk.c
-DISTCLEANFILES = h5repack.sh h5repack_plugin.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 tools/h5repack/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5repack/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):
-h5repack.sh: $(top_builddir)/config.status $(srcdir)/h5repack.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-h5repack_plugin.sh: $(top_builddir)/config.status $(srcdir)/h5repack_plugin.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
-
-libdynlibadd.la: $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_DEPENDENCIES) $(EXTRA_libdynlibadd_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_libdynlibadd_la_rpath) $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_LIBADD) $(LIBS)
-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
-
-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
-
-h5repack$(EXEEXT): $(h5repack_OBJECTS) $(h5repack_DEPENDENCIES) $(EXTRA_h5repack_DEPENDENCIES) 
-	@rm -f h5repack$(EXEEXT)
-	$(AM_V_CCLD)$(h5repack_LINK) $(h5repack_OBJECTS) $(h5repack_LDADD) $(LIBS)
-
-h5repacktst$(EXEEXT): $(h5repacktst_OBJECTS) $(h5repacktst_DEPENDENCIES) $(EXTRA_h5repacktst_DEPENDENCIES) 
-	@rm -f h5repacktst$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5repacktst_OBJECTS) $(h5repacktst_LDADD) $(LIBS)
-
-testh5repack_detect_szip$(EXEEXT): $(testh5repack_detect_szip_OBJECTS) $(testh5repack_detect_szip_DEPENDENCIES) $(EXTRA_testh5repack_detect_szip_DEPENDENCIES) 
-	@rm -f testh5repack_detect_szip$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(testh5repack_detect_szip_OBJECTS) $(testh5repack_detect_szip_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_rpk.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_copy.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_filters.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_opttable.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_parse.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_refs.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_verify.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repacktst.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/testh5repack_detect_szip.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 $$?
-h5repacktst.log: h5repacktst$(EXEEXT)
-	@p='h5repacktst$(EXEEXT)'; \
-	b='h5repacktst'; \
-	$(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 $(LTLIBRARIES) $(PROGRAMS) all-local
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(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."
- at HAVE_SHARED_CONDITIONAL_FALSE@install-exec-hook:
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-	clean-libLTLIBRARIES 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-libLTLIBRARIES
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
-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 uninstall-libLTLIBRARIES
-
-.MAKE: check-am install-am install-exec-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-libLTLIBRARIES 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-exec-hook 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 \
-	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-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
-# 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
-
-# The h5repack.sh script needs h5repacktst to run first.
-h5repack.sh.chkexe_: h5repacktst.chkexe_
-
- at HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
-
- at HAVE_SHARED_CONDITIONAL_TRUE@install-exec-hook:
- at HAVE_SHARED_CONDITIONAL_TRUE@	$(RM) $(DESTDIR)$(libdir)/*dynlib*
-
-# 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/h5repack/dynlib_rpk.c b/tools/h5repack/dynlib_rpk.c
deleted file mode 100644
index 6e8a7b6..0000000
--- a/tools/h5repack/dynlib_rpk.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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.            *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-/*
- * Programmer:	Raymond Lu
- *		13 February 2013
- *
- * Purpose:	Tests the plugin module (H5PL)
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "H5PLextern.h"
-
-#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);
-
-/* This message derives from H5Z */
-const H5Z_class2_t H5Z_DYNLIB1[1] = {{
-    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
-    H5Z_FILTER_DYNLIB1,		     /* Filter id number		*/
-    1, 1,                            /* Encoding and decoding enabled   */
-    "dynlib1",			     /* Filter name for debugging	*/
-    NULL,                            /* The "can apply" callback        */
-    NULL,                            /* The "set local" callback        */
-    (H5Z_func_t)H5Z_filter_dynlib1,    /* The actual filter function	*/
-}};
-
-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
- *
- * Purpose:	A dynlib1 filter method that adds on and subtract from
- *              the original value with another value.  It will be built 
- *              as a shared library.  plugin.c test will load and use 
- *              this filter library.    
- *
- * Return:	Success:	Data chunk size
- *
- *		Failure:	0
- *
- * Programmer:	Raymond Lu
- *              29 March 2013
- *
- *-------------------------------------------------------------------------
- */
-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)
-{
-    int *int_ptr = (int *)*buf;          /* Pointer to the data values */
-    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
-    int add_on = 0;
-
-    /* Check for the correct number of parameters */
-    if(cd_nelmts == 0)
-        return(0);
-
-    /* Check that permanent parameters are set correctly */
-    if(cd_values[0] > 9)
-        return(0);
-  
-    add_on = (int)cd_values[0];
-
-    if(flags & H5Z_FLAG_REVERSE) { /*read*/
-        /* Substract the "add on" value to all the data values */
-        while(buf_left > 0) {
-            *int_ptr++ -= add_on;
-            buf_left -= sizeof(int);
-        } /* end while */
-    } /* end if */
-    else { /*write*/
-        /* Add the "add on" value to all the data values */
-        while(buf_left > 0) {
-            *int_ptr++ += add_on;
-            buf_left -= sizeof(int);
-        } /* end while */
-    } /* end else */
-
-    return nbytes;
-} /* end H5Z_filter_dynlib1() */
-
diff --git a/tools/h5repack/h5repack.c b/tools/h5repack/h5repack.c
deleted file mode 100644
index 286d7f0..0000000
--- a/tools/h5repack/h5repack.c
+++ /dev/null
@@ -1,943 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "H5private.h"
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/*-------------------------------------------------------------------------
- * File: h5repack.c
- * Purpose: Public API functions
- *-------------------------------------------------------------------------
- */
-
-static int check_options(pack_opt_t *options);
-static int check_objects(const char* fname, pack_opt_t *options);
-static const char* get_sfilter(H5Z_filter_t filtn);
-static int have_request(pack_opt_t *options);
-
-/*-------------------------------------------------------------------------
- * Function: h5repack
- *
- * Purpose: locate all high-level HDF5 objects in the file
- *  and compress/chunk them using options
- *
- * Algorithm: 2 traversals are made to the file; the 1st builds a list of
- *  the objects, the 2nd makes a copy of them, using the options;
- *  the reason for the 1st traversal is to check for invalid
- *  object name requests
- *
- * Return: 0, ok, -1, fail
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: September, 22, 2003
- *
- *-------------------------------------------------------------------------
- */
-int h5repack(const char* infile, const char* outfile, pack_opt_t *options) {
-	/* check input */
-	if (check_options(options) < 0)
-		return -1;
-
-	/* check for objects in input that are in the file */
-	if (check_objects(infile, options) < 0)
-		return -1;
-
-	/* copy the objects  */
-	if (copy_objects(infile, outfile, options) < 0)
-		return -1;
-
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_init
- *
- * Purpose: initialize options
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-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++) {
-		options->filter_g[n].filtn = -1;
-		options->filter_g[n].cd_nelmts = 0;
-		for (k = 0; k < CD_VALUES; k++)
-			options->filter_g[n].cd_values[k] = 0;
-	}
-
-	options->fs_strategy = strategy;
-	options->fs_threshold = threshold;
-
-	return (options_table_init(&(options->op_tbl)));
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_end
- *
- * Purpose: free options table
- *
- *-------------------------------------------------------------------------
- */
-
-int h5repack_end(pack_opt_t *options) {
-	return options_table_free(options->op_tbl);
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_addfilter
- *
- * Purpose: add a compression -f option to table
- *   Example: -f dset:GZIP=6
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-int h5repack_addfilter(const char* str, pack_opt_t *options) {
-	obj_list_t *obj_list = NULL; /* one object list for the -f and -l option entry */
-	filter_info_t filter; /* filter info for the current -f option entry */
-	int n_objs; /* number of objects in the current -f or -l option entry */
-	int is_glb; /* is the filter global */
-
-	/* parse the -f option */
-	if (NULL == (obj_list = parse_filter(str, &n_objs, &filter, options, &is_glb)))
-		return -1;
-
-	/* if it applies to all objects */
-	if (is_glb) {
-		int n;
-
-		n = options->n_filter_g++; /* increase # of global filters */
-
-		if (options->n_filter_g > H5_REPACK_MAX_NFILTERS) {
-			error_msg("maximum number of filters exceeded for <%s>\n", str);
-			HDfree(obj_list);
-			return -1;
-		}
-
-		options->filter_g[n] = filter;
-	}
-	else
-		options_add_filter(obj_list, n_objs, filter, options->op_tbl);
-
-	HDfree(obj_list);
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_addlayout
- *
- * Purpose: add a layout option
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-
-int h5repack_addlayout(const char* str, pack_opt_t *options) {
-
-	obj_list_t *obj_list = NULL; /*one object list for the -t and -c option entry */
-	int n_objs; /*number of objects in the current -t or -c option entry */
-	pack_info_t pack; /*info about layout to extract from parse */
-	int j;
-	int ret_value = -1;
-
-	init_packobject(&pack);
-
-	if (options->all_layout == 1) {
-		error_msg(
-				"invalid layout input: 'all' option \
-                            is present with other objects <%s>\n",
-				str);
-		return ret_value;
-	}
-
-	/* parse the layout option */
-	obj_list = parse_layout(str, &n_objs, &pack, options);
-	if (obj_list) {
-
-		/* set layout option */
-		options->layout_g = pack.layout;
-
-		/* no individual dataset specified */
-		if (options->all_layout == 1) {
-			if (pack.layout == H5D_CHUNKED) {
-				/* -2 means the NONE option, remove chunking
-				 and set the global layout to contiguous */
-				if (pack.chunk.rank == -2) {
-					options->layout_g = H5D_CONTIGUOUS;
-				}
-				/* otherwise set the global chunking type */
-				else {
-					options->chunk_g.rank = pack.chunk.rank;
-					for (j = 0; j < pack.chunk.rank; j++)
-						options->chunk_g.chunk_lengths[j] =
-								pack.chunk.chunk_lengths[j];
-				}
-			}
-		}
-
-		/* individual dataset specified */
-		if (options->all_layout == 0)
-			ret_value = options_add_layout(obj_list, n_objs, &pack, options->op_tbl);
-
-		HDfree(obj_list);
-		ret_value = 0;
-	}
-
-	return ret_value;
-}
-
-/* Note: The below copy_named_datatype(), named_datatype_free(), copy_attr()
- * were located in h5repack_copy.c as static prior to bugfix1726.
- * Made shared functions as copy_attr() was needed in h5repack_refs.c.
- * However copy_attr() may be obsoleted when H5Acopy is available and put back
- * others to static in h5repack_copy.c.
- */
-/*-------------------------------------------------------------------------
- * Function: copy_named_datatype
- *
- * Purpose: Copies the specified datatype anonymously, and returns an open
- *          id for that datatype in the output file.  The first time this
- *          is called it scans every named datatype in travt into a
- *          private stack, afterwards it simply scans that stack.  The id
- *          returned must be closed after it is no longer needed.
- *          named_datatype_free must be called before the program exits
- *          to free the stack.
- *
- * Programmer: Neil Fortner
- *
- * Date: April 14, 2009
- *
- *-------------------------------------------------------------------------
- */
-hid_t copy_named_datatype(hid_t type_in, hid_t fidout,
-		named_dt_t **named_dt_head_p, trav_table_t *travt, pack_opt_t *options) {
-	named_dt_t *dt = *named_dt_head_p; /* Stack pointer */
-	named_dt_t *dt_ret = NULL; /* Datatype to return */
-	H5O_info_t oinfo; /* Object info of input dtype */
-	hid_t ret_value = -1; /* The identifier of the named dtype in the out file */
-
-	if (H5Oget_info(type_in, &oinfo) < 0)
-		goto done;
-
-	if (*named_dt_head_p) {
-		/* Stack already exists, search for the datatype */
-		while (dt && dt->addr_in != oinfo.addr)
-			dt = dt->next;
-
-		dt_ret = dt;
-	}
-	else {
-		/* Create the stack */
-		size_t i;
-
-		for (i = 0; i < travt->nobjs; i++) {
-			if (travt->objs[i].type == H5TRAV_TYPE_NAMED_DATATYPE) {
-				/* Push onto the stack */
-				if (NULL == (dt = (named_dt_t *) HDmalloc(sizeof(named_dt_t)))) {
-					goto done;
-				}
-				dt->next = *named_dt_head_p;
-				*named_dt_head_p = dt;
-
-				/* Update the address and id */
-				dt->addr_in = travt->objs[i].objno;
-				dt->id_out = -1;
-
-				/* Check if this type is the one requested */
-				if (oinfo.addr == dt->addr_in) {
-					HDassert(!dt_ret);
-					dt_ret = dt;
-				} /* end if */
-			} /* end if */
-		} /* end for */
-	} /* end else */
-
-	/* Handle the case that the requested datatype was not found.  This is
-	 * possible if the datatype was committed anonymously in the input file. */
-	if (!dt_ret) {
-		/* Push the new datatype onto the stack */
-		if (NULL == (dt_ret = (named_dt_t *) HDmalloc(sizeof(named_dt_t)))) {
-			goto done;
-		}
-		dt_ret->next = *named_dt_head_p;
-		*named_dt_head_p = dt_ret;
-
-		/* Update the address and id */
-		dt_ret->addr_in = oinfo.addr;
-		dt_ret->id_out = -1;
-	} /* end if */
-
-	/* If the requested datatype does not yet exist in the output file, copy it
-	 * anonymously */
-	if (dt_ret->id_out < 0) {
-		if (options->use_native == 1)
-			dt_ret->id_out = h5tools_get_native_type(type_in);
-		else
-			dt_ret->id_out = H5Tcopy(type_in);
-		if (dt_ret->id_out < 0)
-			goto done;
-		if (H5Tcommit_anon(fidout, dt_ret->id_out, H5P_DEFAULT, H5P_DEFAULT) < 0)
-			goto done;
-	} /* end if */
-
-	/* Set return value */
-	ret_value = dt_ret->id_out;
-
-	/* Increment the ref count on id_out, because the calling function will try
-	 * to close it */
-	if(H5Iinc_ref(ret_value) < 0) {
-		ret_value = -1;
-	}
-
-done:
-	return (ret_value);
-} /* end copy_named_datatype */
-
-/*-------------------------------------------------------------------------
- * Function: named_datatype_free
- *
- * Purpose: Frees the stack of named datatypes.
- *
- * Programmer: Neil Fortner
- *
- * Date: April 14, 2009
- *
- *-------------------------------------------------------------------------
- */
-int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err) {
-	named_dt_t *dt = *named_dt_head_p;
-	int ret_value = -1;
-
-	while (dt) {
-		/* Pop the datatype off the stack and free it */
-		if (H5Tclose(dt->id_out) < 0 && !ignore_err)
-			goto done;
-		dt = dt->next;
-		HDfree(*named_dt_head_p);
-		*named_dt_head_p = dt;
-	} /* end while */
-
-	ret_value = 0;
-
-done:
-	return (ret_value);
-} /* end named_datatype_free */
-
-/*-------------------------------------------------------------------------
- * Function: copy_attr
- *
- * Purpose: copy attributes located in LOC_IN, which is obtained either from
- * loc_id = H5Gopen2( fid, name);
- * loc_id = H5Dopen2( fid, name);
- * loc_id = H5Topen2( fid, name);
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: October, 28, 2003
- *
- *-------------------------------------------------------------------------
- */
-int copy_attr(hid_t loc_in, hid_t loc_out, named_dt_t **named_dt_head_p,
-		trav_table_t *travt, pack_opt_t *options) {
-	hid_t attr_id = -1; /* attr ID */
-	hid_t attr_out = -1; /* attr ID */
-	hid_t space_id = -1; /* space ID */
-	hid_t ftype_id = -1; /* file type ID */
-	hid_t wtype_id = -1; /* read/write type ID */
-	size_t msize; /* size of type */
-	void *buf = NULL; /* data buffer */
-	hsize_t nelmts; /* number of elements in dataset */
-	int rank; /* rank of dataset */
-	htri_t is_named; /* Whether the datatype is named */
-	hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
-	char name[255];
-	H5O_info_t oinfo; /* object info */
-	int j;
-	unsigned u;
-	hbool_t is_ref = 0;
-	H5T_class_t type_class = -1;
-
-	if (H5Oget_info(loc_in, &oinfo) < 0)
-		goto error;
-
-	/*-------------------------------------------------------------------------
-	 * copy all attributes
-	 *-------------------------------------------------------------------------
-	 */
-	for (u = 0; u < (unsigned) oinfo.num_attrs; u++) {
-		/* open attribute */
-		if ((attr_id = H5Aopen_by_idx(loc_in, ".", H5_INDEX_CRT_ORDER,
-				H5_ITER_INC, (hsize_t) u, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-			goto error;
-
-		/* get name */
-		if (H5Aget_name(attr_id, (size_t) 255, name) < 0)
-			goto error;
-
-		/* get the file datatype  */
-		if ((ftype_id = H5Aget_type(attr_id)) < 0)
-			goto error;
-
-		/* Check if the datatype is committed */
-		if ((is_named = H5Tcommitted(ftype_id)) < 0)
-			goto error;
-		if (is_named && travt) {
-			hid_t fidout;
-
-			/* Create out file id */
-			if ((fidout = H5Iget_file_id(loc_out)) < 0)
-				goto error;
-
-			/* Copy named dt */
-			if ((wtype_id = copy_named_datatype(ftype_id, fidout,
-					named_dt_head_p, travt, options)) < 0) {
-				H5Fclose(fidout);
-				goto error;
-			} /* end if */
-
-			if (H5Fclose(fidout) < 0)
-				goto error;
-		} /* end if */
-		else {
-			if (options->use_native == 1)
-				wtype_id = h5tools_get_native_type(ftype_id);
-			else
-				wtype_id = H5Tcopy(ftype_id);
-		} /* end else */
-
-		/* get the dataspace handle  */
-		if ((space_id = H5Aget_space(attr_id)) < 0)
-			goto error;
-
-		/* get dimensions  */
-		if ((rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0)
-			goto error;
-
-		nelmts = 1;
-		for (j = 0; j < rank; j++)
-			nelmts *= dims[j];
-
-		if ((msize = H5Tget_size(wtype_id)) == 0)
-			goto error;
-
-		/*-------------------------------------------------------------------------
-		 * object references are a special case. We cannot just copy the buffers,
-		 * but instead we recreate the reference.
-		 * This is done on a second sweep of the file that just copies the referenced
-		 * objects at copy_refs_attr()
-		 *-------------------------------------------------------------------------
-		 */
-		type_class = H5Tget_class(wtype_id);
-		is_ref = (type_class == H5T_REFERENCE);
-		if (type_class == H5T_VLEN || type_class == H5T_ARRAY) {
-			hid_t base_type = -1;
-			base_type = H5Tget_super(ftype_id);
-			is_ref = (is_ref || (H5Tget_class(base_type) == H5T_REFERENCE));
-			H5Tclose(base_type);
-		}
-
-		if (type_class == H5T_COMPOUND) {
-			int nmembers = H5Tget_nmembers(wtype_id);
-			for (j = 0; j < nmembers; j++) {
-				hid_t mtid = H5Tget_member_type(wtype_id, (unsigned) j);
-				H5T_class_t mtclass = H5Tget_class(mtid);
-				H5Tclose(mtid);
-
-				if (mtclass == H5T_REFERENCE) {
-					is_ref = 1;
-					break;
-				}
-			} /* for (j=0; i<nmembers; j++) */
-		} /* if (type_class == H5T_COMPOUND) */
-
-		if (is_ref) {
-			; /* handled by copy_refs_attr() */
-		}
-		else {
-			/*-------------------------------------------------------------------------
-			 * read to memory
-			 *-------------------------------------------------------------------------
-			 */
-
-			buf = (void *) HDmalloc((size_t)(nelmts * msize));
-			if (buf == NULL) {
-				error_msg("h5repack", "cannot read into memory\n");
-				goto error;
-			} /* end if */
-			if (H5Aread(attr_id, wtype_id, buf) < 0)
-				goto error;
-
-			/*-------------------------------------------------------------------------
-			 * copy
-			 *-------------------------------------------------------------------------
-			 */
-
-			if ((attr_out = H5Acreate2(loc_out, name, wtype_id, space_id,
-					H5P_DEFAULT, H5P_DEFAULT)) < 0)
-				goto error;
-			if (H5Awrite(attr_out, wtype_id, buf) < 0)
-				goto error;
-
-			/*close*/
-			if (H5Aclose(attr_out) < 0)
-				goto error;
-
-			/* Check if we have VL data and string in the attribute's  datatype that must
-			 * be reclaimed */
-			if (TRUE == h5tools_detect_vlen(wtype_id))
-				H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
-			HDfree(buf);
-			buf = NULL;
-		} /*H5T_REFERENCE*/
-
-		if (options->verbose)
-			printf(FORMAT_OBJ_ATTR, "attr", name);
-
-		/*-------------------------------------------------------------------------
-		 * close
-		 *-------------------------------------------------------------------------
-		 */
-
-		if (H5Tclose(ftype_id) < 0)
-			goto error;
-		if (H5Tclose(wtype_id) < 0)
-			goto error;
-		if (H5Sclose(space_id) < 0)
-			goto error;
-		if (H5Aclose(attr_id) < 0)
-			goto error;
-	} /* u */
-
-	return 0;
-
-error:
-	H5E_BEGIN_TRY
-		{
-			if (buf) {
-				/* Check if we have VL data and string in the attribute's  datatype that must
-				 * be reclaimed */
-				if (TRUE == h5tools_detect_vlen(wtype_id))
-					H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
-
-				/* Free buf */
-				HDfree(buf);
-			} /* end if */
-
-			H5Tclose(ftype_id);
-			H5Tclose(wtype_id);
-			H5Sclose(space_id);
-			H5Aclose(attr_id);
-			H5Aclose(attr_out);
-		} H5E_END_TRY;
-
-	return -1;
-} /* end copy_attr() */
-
-/*-------------------------------------------------------------------------
- * Function: check_options
- *
- * Purpose: print options, checks for invalid options
- *
- * Return: void, return -1 on error
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: September, 22, 2003
- *
- * Modification:
- *   Peter Cao, July 9, 2007
- *   Add "-L, --latest" and other options to pack a file with the latest file format
- *
- *-------------------------------------------------------------------------
- */
-static int check_options(pack_opt_t *options) {
-	unsigned int i;
-	int k, j, has_cp = 0, has_ck = 0;
-	char slayout[30];
-
-	/*-------------------------------------------------------------------------
-	 * objects to layout
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->verbose && have_request(options) /* only print if requested */) {
-		printf("Objects to modify layout are...\n");
-		if (options->all_layout == 1) {
-			switch (options->layout_g) {
-			case H5D_COMPACT:
-				strcpy(slayout, "compact");
-				break;
-			case H5D_CONTIGUOUS:
-				strcpy(slayout, "contiguous");
-				break;
-			case H5D_CHUNKED:
-				strcpy(slayout, "chunked");
-				break;
-			case H5D_LAYOUT_ERROR:
-			case H5D_NLAYOUTS:
-				error_msg("invalid layout\n");
-				return -1;
-			default:
-				strcpy(slayout, "invalid layout\n");
-				return -1;
-			}
-			printf(" Apply %s layout to all\n", slayout);
-			if (H5D_CHUNKED == options->layout_g) {
-				printf("with dimension [");
-				for (j = 0; j < options->chunk_g.rank; j++)
-					printf("%d ", (int) options->chunk_g.chunk_lengths[j]);
-				printf("]\n");
-			}
-		}
-	}/* verbose */
-
-	for (i = 0; i < options->op_tbl->nelems; i++) {
-		char* name = options->op_tbl->objs[i].path;
-
-		if (options->op_tbl->objs[i].chunk.rank > 0) {
-			if (options->verbose) {
-				printf(" <%s> with chunk size ", name);
-				for (k = 0; k < options->op_tbl->objs[i].chunk.rank; k++)
-					printf("%d ",
-							(int) options->op_tbl->objs[i].chunk.chunk_lengths[k]);
-				printf("\n");
-			}
-			has_ck = 1;
-		}
-		else if (options->op_tbl->objs[i].chunk.rank == -2) {
-			if (options->verbose)
-				printf(" <%s> %s\n", name, "NONE (contigous)");
-			has_ck = 1;
-		}
-	}
-
-	if (options->all_layout == 1 && has_ck) {
-		error_msg(
-				"invalid chunking input: 'all' option\
-                            is present with other objects\n");
-		return -1;
-	}
-
-	/*-------------------------------------------------------------------------
-	 * objects to filter
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (options->verbose && have_request(options) /* only print if requested */) {
-		printf("Objects to apply filter are...\n");
-		if (options->all_filter == 1) {
-			for (k = 0; k < options->n_filter_g; k++) {
-				H5Z_filter_t filtn = options->filter_g[k].filtn;
-				switch (filtn) {
-				case H5Z_FILTER_NONE:
-					printf(" Uncompress all\n");
-					break;
-				case H5Z_FILTER_SHUFFLE:
-				case H5Z_FILTER_FLETCHER32:
-					printf(" All with %s\n", get_sfilter(filtn));
-					break;
-				case H5Z_FILTER_SZIP:
-				case H5Z_FILTER_DEFLATE:
-					printf(" All with %s, parameter %d\n", get_sfilter(filtn),
-							options->filter_g[k].cd_values[0]);
-					break;
-				default:
-					printf(" User Defined %d\n", filtn);
-					break;
-				} /* k */
-			};
-		}
-	} /* verbose */
-
-	for (i = 0; i < options->op_tbl->nelems; i++) {
-		pack_info_t pack = options->op_tbl->objs[i];
-		char* name = pack.path;
-
-		for (j = 0; j < pack.nfilters; j++) {
-			if (options->verbose) {
-				printf(" <%s> with %s filter\n", name,
-						get_sfilter(pack.filter[j].filtn));
-			}
-
-			has_cp = 1;
-
-		} /* j */
-	} /* i */
-
-	if (options->all_filter == 1 && has_cp) {
-		error_msg(
-				"invalid compression input: 'all' option\
-                            is present with other objects\n");
-		return -1;
-	}
-
-	/*-------------------------------------------------------------------------
-	 * check options for the latest format
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (options->grp_compact < 0) {
-		error_msg(
-				"invalid maximum number of links to store as header messages\n");
-		return -1;
-	}
-	if (options->grp_indexed < 0) {
-		error_msg(
-				"invalid minimum number of links to store in the indexed format\n");
-		return -1;
-	}
-	if (options->grp_indexed > options->grp_compact) {
-		error_msg(
-				"minimum indexed size is greater than the maximum compact size\n");
-		return -1;
-	}
-	for (i = 0; i < 8; i++) {
-		if (options->msg_size[i] < 0) {
-			error_msg("invalid shared message size\n");
-			return -1;
-		}
-	}
-
-	/*--------------------------------------------------------------------------------
-	 * verify new user userblock options; file name must be present
-	 *---------------------------------------------------------------------------------
-	 */
-	if (options->ublock_filename != NULL && options->ublock_size == 0) {
-		if (options->verbose) {
-			printf(
-					"Warning: user block size missing for file %s. Assigning a default size of 1024...\n",
-					options->ublock_filename);
-			options->ublock_size = 1024;
-		}
-	}
-
-	if (options->ublock_filename == NULL && options->ublock_size != 0) {
-		error_msg("file name missing for user block\n",
-				options->ublock_filename);
-		return -1;
-	}
-
-	/*--------------------------------------------------------------------------------
-	 * verify alignment options; threshold is zero default but alignment not
-	 *---------------------------------------------------------------------------------
-	 */
-
-	if (options->alignment == 0 && options->threshold != 0) {
-		error_msg("alignment for H5Pset_alignment missing\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: check_objects
- *
- * Purpose: locate all HDF5 objects in the file and compare with user
- *  supplied list
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: September, 23, 2003
- *
- *-------------------------------------------------------------------------
- */
-static int check_objects(const char* fname, pack_opt_t *options) {
-	hid_t fid;
-	unsigned int i;
-	trav_table_t *travt = NULL;
-
-	/* nothing to do */
-	if (options->op_tbl->nelems == 0)
-		return 0;
-
-	/*-------------------------------------------------------------------------
-	 * open the file
-	 *-------------------------------------------------------------------------
-	 */
-	if ((fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0))
-			< 0) {
-		printf("<%s>: %s\n", fname, H5FOPENERROR);
-		return -1;
-	}
-
-	/*-------------------------------------------------------------------------
-	 * get the list of objects in the file
-	 *-------------------------------------------------------------------------
-	 */
-
-	/* init table */
-	trav_table_init(&travt);
-
-	/* get the list of objects in the file */
-	if (h5trav_gettable(fid, travt) < 0)
-		goto out;
-
-	/*-------------------------------------------------------------------------
-	 * compare with user supplied list
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (options->verbose)
-		printf("Opening file <%s>. Searching for objects to modify...\n",
-				fname);
-
-	for (i = 0; i < options->op_tbl->nelems; i++) {
-		char* name = options->op_tbl->objs[i].path;
-		if (options->verbose)
-			printf(" <%s>", name);
-
-		/* the input object names are present in the file and are valid */
-		if (h5trav_getindext(name, travt) < 0) {
-			error_msg("%s Could not find <%s> in file <%s>. Exiting...\n",
-					(options->verbose ? "\n" : ""), name, fname);
-			goto out;
-		}
-		if (options->verbose)
-			printf("...Found\n");
-
-		/* check for extra filter conditions */
-		switch (options->op_tbl->objs[i].filter->filtn) {
-		/* chunk size must be smaller than pixels per block */
-		case H5Z_FILTER_SZIP:
-			{
-				int j;
-				hsize_t csize = 1;
-				unsigned ppb = options->op_tbl->objs[i].filter->cd_values[0];
-				hsize_t dims[H5S_MAX_RANK];
-				int rank;
-				hid_t did;
-				hid_t sid;
-
-				if (options->op_tbl->objs[i].chunk.rank > 0) {
-					rank = options->op_tbl->objs[i].chunk.rank;
-					for (j = 0; j < rank; j++)
-						csize *= options->op_tbl->objs[i].chunk.chunk_lengths[j];
-				}
-				else {
-					if ((did = H5Dopen2(fid, name, H5P_DEFAULT)) < 0)
-						goto out;
-					if ((sid = H5Dget_space(did)) < 0)
-						goto out;
-					if ((rank = H5Sget_simple_extent_ndims(sid)) < 0)
-						goto out;
-					HDmemset(dims, 0, sizeof dims);
-					if (H5Sget_simple_extent_dims(sid, dims, NULL) < 0)
-						goto out;
-					for (j = 0; j < rank; j++)
-						csize *= dims[j];
-					if (H5Sclose(sid) < 0)
-						goto out;
-					if (H5Dclose(did) < 0)
-						goto out;
-				}
-
-				if (csize < ppb) {
-					printf(
-							" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
-					goto out;
-				}
-			}
-			break;
-		default:
-			break;
-		}
-	} /* i */
-
-	/*-------------------------------------------------------------------------
-	 * close
-	 *-------------------------------------------------------------------------
-	 */
-	H5Fclose(fid);
-	trav_table_free(travt);
-	return 0;
-
-out:
-	H5Fclose(fid);
-	trav_table_free(travt);
-	return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: have_request
- *
- * Purpose: check if a filter or layout was requested
- *
- * Return: 1 yes, 0 no
- *
- * Date: May, 24, 2007
- *
- *-------------------------------------------------------------------------
- */
-static int have_request(pack_opt_t *options) {
-
-	if (options->all_filter || options->all_layout || options->op_tbl->nelems)
-		return 1;
-
-	return 0;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: get_sfilter
- *
- * Purpose: return the filter as a string name
- *
- * Return: name of filter, exit on error
- *
- *-------------------------------------------------------------------------
- */
-
-static const char* get_sfilter(H5Z_filter_t filtn) {
-	if (filtn == H5Z_FILTER_NONE)
-		return "NONE";
-	else if (filtn == H5Z_FILTER_DEFLATE)
-		return "GZIP";
-	else if (filtn == H5Z_FILTER_SZIP)
-		return "SZIP";
-	else if (filtn == H5Z_FILTER_SHUFFLE)
-		return "SHUFFLE";
-	else if (filtn == H5Z_FILTER_FLETCHER32)
-		return "FLETCHER32";
-	else if (filtn == H5Z_FILTER_NBIT)
-		return "NBIT";
-	else if (filtn == H5Z_FILTER_SCALEOFFSET)
-		return "SOFF";
-	else
-		return "UD";
-}
-
diff --git a/tools/h5repack/h5repack.h b/tools/h5repack/h5repack.h
deleted file mode 100644
index 329be1f..0000000
--- a/tools/h5repack/h5repack.h
+++ /dev/null
@@ -1,243 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-#ifndef H5REPACK_H__
-#define H5REPACK_H__
-
-#include "H5private.h"
-#include "hdf5.h"
-#include "h5trav.h"
-
-#define H5FOPENERROR "unable to open file"
-#define PFORMAT  "%-7s %-7s %-7s\n"   /* chunk info, compression info, name*/
-#define PFORMAT1 "%-7s %-7s %-7s"     /* chunk info, compression info, name*/
-#define MAX_NC_NAME 256               /* max length of a name */
-#define MAX_VAR_DIMS 32               /* max per variable dimensions */
-#define FORMAT_OBJ      " %-27s %s\n"   /* obj type, name */
-#define FORMAT_OBJ_ATTR "  %-27s %s\n"  /* obj type, name */
-#define MAX_COMPACT_DSIZE  64512  /* max data size for compact layout. -1k for header size */
-
-/*-------------------------------------------------------------------------
- * data structures for command line options
- *-------------------------------------------------------------------------
- */
-
-/* a list of names */
-typedef struct {
- char obj[MAX_NC_NAME];
-} obj_list_t;
-
-/*
- the type of filter and additional parameter
- type can be one of the filters
- H5Z_FILTER_NONE        0,  uncompress if compressed
- H5Z_FILTER_DEFLATE     1 , deflation like gzip
- H5Z_FILTER_SHUFFLE     2 , shuffle the data
- H5Z_FILTER_FLETCHER32  3 , letcher32 checksum of EDC
- H5Z_FILTER_SZIP        4 , szip compression
- H5Z_FILTER_NBIT        5 , nbit compression
- H5Z_FILTER_SCALEOFFSET 6 , scaleoffset compression
-*/
-
-#define CD_VALUES 20
-
-typedef struct {
- H5Z_filter_t filtn;                           /* filter identification number */
- unsigned     cd_values[CD_VALUES];            /* filter client data values */
- size_t       cd_nelmts;                       /* filter client number of values */
-} filter_info_t;
-
-/* chunk lengths along each dimension and rank */
-typedef struct {
- hsize_t chunk_lengths[MAX_VAR_DIMS];
- int     rank;
-} chunk_info_t;
-
-/* we currently define a maximum value for the filters array,
-   that corresponds to the current library filters */
-#define H5_REPACK_MAX_NFILTERS 6
-
-/* information for one object, contains PATH, CHUNK info and FILTER info */
-typedef struct {
- char          path[MAX_NC_NAME];               /* name of object */
- filter_info_t filter[H5_REPACK_MAX_NFILTERS];  /* filter array */
- int           nfilters;                        /* current number of filters */
- H5D_layout_t  layout;                          /* layout information */
- chunk_info_t  chunk;                           /* chunk information */
- hid_t         refobj_id;                       /* object ID, references */
-} pack_info_t;
-
-/* store a table of all objects */
-typedef struct {
- unsigned int size;
- unsigned int nelems;
- pack_info_t  *objs;
-} pack_opttbl_t;
-
-
-/*-------------------------------------------------------------------------
- * command line options
- *-------------------------------------------------------------------------
- */
-
-/* all the above, ready to go to the hrepack call */
-typedef struct {
- pack_opttbl_t   *op_tbl;     /*table with all -c and -f options */
- int             all_layout;  /*apply the layout to all objects */
- int             all_filter;  /*apply the filter to all objects */
- filter_info_t   filter_g[H5_REPACK_MAX_NFILTERS];    /*global filter array for the ALL case */
- int             n_filter_g;  /*number of global filters */
- chunk_info_t    chunk_g;     /*global chunk INFO for the ALL case */
- H5D_layout_t    layout_g;    /*global layout information for the ALL case */
- int             verbose;     /*verbose mode */
- hsize_t         min_comp;    /*minimum size to compress, in bytes */
- int             use_native;  /*use a native type in write */
- 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,
-                                 datatype, fill value, filter pipleline, attribute */
- const char      *ublock_filename; /* user block file name */
- hsize_t         ublock_size;      /* user block size */
- 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;
-
-
-typedef struct named_dt_t {
-    haddr_t             addr_in;    /* Address of the named dtype in the in file */
-    hid_t               id_out;     /* Open identifier for the dtype in the out file */
-    struct named_dt_t   *next;      /* Next dtype */
-} named_dt_t;
-
-/*-------------------------------------------------------------------------
- * public functions
- *-------------------------------------------------------------------------
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-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, hbool_t latest,
-    H5F_file_space_type_t strategy, hsize_t threshold);
-int h5repack_end(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() 
- * and struct named_dt_t were located in h5repack_copy.c as static prior to 
- * bugfix1726. 
- * Made shared functions as copy_attr() was needed in h5repack_refs.c. 
- * However copy_attr() may be obsoleted when H5Acopy is available and put back
- * others to static in h5repack_copy.c.
- */
-hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_head_p, trav_table_t *travt, pack_opt_t *options);
-int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err);
-int copy_attr(hid_t loc_in, hid_t loc_out, named_dt_t **named_dt_head_p,
-              trav_table_t *travt, pack_opt_t *options);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-/*-------------------------------------------------------------------------
- * private functions
- *-------------------------------------------------------------------------
- */
-
-
-/*-------------------------------------------------------------------------
- * copy module
- *-------------------------------------------------------------------------
- */
-
-int copy_objects   (const char* fnamein,
-                    const char* fnameout,
-                    pack_opt_t *options);
-
-int do_copy_refobjs(hid_t fidin,
-                    hid_t fidout,
-                    trav_table_t *travt,
-                    pack_opt_t *options);
-
-/*-------------------------------------------------------------------------
- * filters and verify module
- *-------------------------------------------------------------------------
- */
-void init_packobject(pack_info_t *obj);
-
-
-/*-------------------------------------------------------------------------
- * filters and copy module
- *-------------------------------------------------------------------------
- */
-
-int apply_filters(const char* name,    /* object name from traverse list */
-                  int rank,            /* rank of dataset */
-                  hsize_t *dims,       /* dimensions of dataset */
-                  size_t msize,        /* size of type */
-                  hid_t dcpl_id,       /* dataset creation property list */
-                  pack_opt_t *options, /* repack options */
-                  int *has_filter);    /* (OUT) object NAME has a filter */
-
-
-/*-------------------------------------------------------------------------
- * options table
- *-------------------------------------------------------------------------
- */
-int          options_table_init( pack_opttbl_t **tbl );
-int          options_table_free( pack_opttbl_t *table );
-int          options_add_layout( obj_list_t *obj_list,
-                                 int n_objs,
-                                 pack_info_t *pack,
-                                 pack_opttbl_t *table );
-int          options_add_filter ( obj_list_t *obj_list,
-                                 int n_objs,
-                                 filter_info_t filt,
-                                 pack_opttbl_t *table );
-pack_info_t* options_get_object( const char *path,
-                                 pack_opttbl_t *table);
-
-/*-------------------------------------------------------------------------
- * parse functions
- *-------------------------------------------------------------------------
- */
-
-obj_list_t* parse_filter(const char *str,
-                         int *n_objs,
-                         filter_info_t *filt,
-                         pack_opt_t *options,
-                         int *is_glb);
-
-obj_list_t* parse_layout(const char *str,
-                         int *n_objs,
-                         pack_info_t *pack,    /* info about object */
-                         pack_opt_t *options);
-
-
-
-
-#endif  /* H5REPACK_H__ */
-
diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in
deleted file mode 100644
index 5ff0f50..0000000
--- a/tools/h5repack/h5repack.sh.in
+++ /dev/null
@@ -1,1205 +0,0 @@
-#! /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 h5repack tool
-#
-# Modification:
-#  Pedro Vicente Nunes, 11/15/2006
-#  Added $FILEN variables for file names
-#
-
-srcdir=@srcdir@
-
-USE_FILTER_SZIP="@USE_FILTER_SZIP@"
-USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
-
-TESTNAME=h5repack
-EXIT_SUCCESS=0
-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_BIN=`pwd`/$H5DIFF        # The path of the h5diff tool binary
-
-H5DUMP=../h5dump/h5dump         # The h5dump tool name
-H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
-
-RM='rm -rf'
-CMP='cmp'
-DIFF='diff -c'
-GREP='grep'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-H5DETECTSZIP=testh5repack_detect_szip
-H5DETECTSZIP_BIN=`pwd`/$H5DETECTSZIP
-
-
-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"
-
-TESTDIR=./testpack
-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_H5REPACK_TESTFILES/h5repack_attr.h5
-$SRC_H5REPACK_TESTFILES/h5repack_attr_refs.h5
-$SRC_H5REPACK_TESTFILES/h5repack_deflate.h5
-$SRC_H5REPACK_TESTFILES/h5repack_early.h5
-$SRC_H5REPACK_TESTFILES/h5repack_ext.h5
-$SRC_H5REPACK_TESTFILES/h5repack_fill.h5
-$SRC_H5REPACK_TESTFILES/h5repack_filters.h5
-$SRC_H5REPACK_TESTFILES/h5repack_fletcher.h5
-$SRC_H5REPACK_TESTFILES/h5repack_hlink.h5
-$SRC_H5REPACK_TESTFILES/h5repack_layout.h5
-$SRC_H5REPACK_TESTFILES/h5repack_layouto.h5
-$SRC_H5REPACK_TESTFILES/h5repack_layout2.h5
-$SRC_H5REPACK_TESTFILES/h5repack_layout3.h5
-$SRC_H5REPACK_TESTFILES/h5repack_named_dtypes.h5
-$SRC_H5REPACK_TESTFILES/h5repack_nested_8bit_enum.h5
-$SRC_H5REPACK_TESTFILES/h5repack_nested_8bit_enum_deflated.h5
-$SRC_H5REPACK_TESTFILES/h5repack_nbit.h5
-$SRC_H5REPACK_TESTFILES/h5repack_objs.h5
-$SRC_H5REPACK_TESTFILES/h5repack_refs.h5
-$SRC_H5REPACK_TESTFILES/h5repack_shuffle.h5
-$SRC_H5REPACK_TESTFILES/h5repack_soffset.h5
-$SRC_H5REPACK_TESTFILES/h5repack_szip.h5
-$SRC_H5DIFF_TESTFILES/h5diff_attr1.h5
-$SRC_TOOLS_TESTFILES/tfamily00000.h5
-$SRC_TOOLS_TESTFILES/tfamily00001.h5
-$SRC_TOOLS_TESTFILES/tfamily00002.h5
-$SRC_TOOLS_TESTFILES/tfamily00003.h5
-$SRC_TOOLS_TESTFILES/tfamily00004.h5
-$SRC_TOOLS_TESTFILES/tfamily00005.h5
-$SRC_TOOLS_TESTFILES/tfamily00006.h5
-$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="
-$SRC_H5REPACK_TESTFILES/h5repack-help.txt
-$SRC_H5REPACK_TESTFILES/h5repack_ext.bin
-$SRC_H5REPACK_TESTFILES/ublock.bin
-$SRC_H5REPACK_TESTFILES/h5repack.info
-$SRC_H5REPACK_TESTFILES/deflate_limit.h5repack_layout.h5.ddl
-$SRC_H5REPACK_TESTFILES/h5repack_layout.h5.ddl
-$SRC_H5REPACK_TESTFILES/h5repack_filters.h5.tst
-$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-plugin_test.ddl
-$SRC_H5REPACK_TESTFILES/plugin_test.h5repack_layout.h5.tst
-$SRC_H5REPACK_TESTFILES/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
-$SRC_H5REPACK_TESTFILES/2_vds.h5-vds_chunk3x6x9-v.ddl
-$SRC_H5REPACK_TESTFILES/3_1_vds.h5-vds_chunk2x5x8-v.ddl
-$SRC_H5REPACK_TESTFILES/4_vds.h5-vds_compa-v.ddl
-$SRC_H5REPACK_TESTFILES/4_vds.h5-vds_conti-v.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=$SRC_H5REPACK_TESTFILES
-    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 $* message left justified in a field of 70 characters
-#
-MESSAGE() {
-   SPACES="                                                               "
-   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Testing".
-#
-TESTING() {
-    MESSAGE "Testing $*"
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Verifying".
-#
-VERIFY() {
-    MESSAGE "Verifying $*"
-}
-
-# Print a message that a test has been skipped (because a required filter
-# was unavailable)
-SKIP() {
-    TESTING $H5REPACK $@
-    echo " -SKIP-"
-}
-
-# Call the h5diff tool
-#
-DIFFTEST()
-{
-    VERIFY h5diff output $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5DIFF_BIN -q  "$@"
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-         echo "*FAILED*"
-         nerrors="`expr $nerrors + 1`"
-    else
-         echo " PASSED"
-    fi
-
-}
-
-# Call h5repack
-#
-
-
-# call TOOLTEST_MAIN and delete $output file
-TOOLTEST()
-{
-    echo $@
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-    rm -f $outfile
-}
-
-#------------------------------------------
-# Verifying layouts of a dataset
-VERIFY_LAYOUT_DSET()
-{
-    layoutfile=layout-$1.$2
-    dset=$3
-    expectlayout=$4
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-    shift
-    shift
-
-    TESTING  $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-
-    #---------------------------------
-    # check the layout from a dataset
-    VERIFY  "a dataset layout"
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5DUMP_BIN -d $dset -pH $outfile > $layoutfile
-    )
-    $GREP $expectlayout $TESTDIR/$layoutfile > /dev/null
-    if [ $? -eq 0 ]; then
-        echo " PASSED"
-    else
-        echo " FAILED"
-        nerrors="`expr $nerrors + 1`"
-    fi
-
-    # clean up tmp files
-    rm -f $outfile
-    rm -f $layoutfile
-}
-
-#------------------------------------------
-# Verifying layouts of a dataset
-VERIFY_LAYOUT_VDS()
-{
-    layoutfile=layout-$1.$2
-    dset=$3
-    expectlayout=$4
-    infile=$2
-    outfile=out-$1.$2
-
-    expect="$TESTDIR/$2-$1-v.ddl"
-    actual="$TESTDIR/$2-$1-v.out"
-    actual_err="$TESTDIR/$2-$1-v.err"
-
-    shift
-    shift
-    shift
-    shift
-
-    TESTING  $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-    fi
-
-    #---------------------------------
-    # check the layout from a dataset
-    VERIFY  "a dataset layout"
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5DUMP_BIN -d $dset -p $outfile
-    ) >$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 > /dev/null 2>&1 ; then
-     echo " PASSED"
-    else
-     echo "*FAILED*"
-     echo "    Expected result (*.ddl) differs from actual result (*.out)"
-     nerrors="`expr $nerrors + 1`"
-     test yes = "$verbose" && $DIFF $caseless $expect $actual |sed 's/^/    /'
-    fi
-
-    # Clean up output file
-    if test -z "$HDF5_NOCLEANUP"; then
-     rm -f $actual $actual_err
-    fi
-
-    # clean up tmp files
-    rm -f $outfile
-}
-
-#----------------------------------------
-# Verifying layouts from entire file
-VERIFY_LAYOUT_ALL()
-{
-    infile=$2
-    outfile=out-$1.$2
-    layoutfile=layout-$1.$2
-    expectlayout=$3
-    shift
-    shift
-    shift
-
-    TESTING  $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-
-
-    #---------------------------------
-    # check the layout from a dataset
-    # check if the other layouts still exsit
-    VERIFY  "layouts"
-    (
-        cd $TESTDIR
-        echo
-        # if CONTIGUOUS
-        if [ $expectlayout = "CONTIGUOUS" ]; then
-            TESTING $H5DUMP_BIN -pH $outfile
-            (
-                $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
-            )
-            $GREP "COMPACT" $layoutfile  > /dev/null
-            if [ $? -eq 0 ]; then
-                echo " FAILED"
-                nerrors="`expr $nerrors + 1`"
-            else
-                $GREP "CHUNKED" $layoutfile  > /dev/null
-                if [ $? -eq 0 ]; then
-                    echo " FAILED"
-                    nerrors="`expr $nerrors + 1`"
-                else
-                    echo " PASSED"
-                fi
-            fi
-        else
-            # if COMPACT
-            if [ $expectlayout = "COMPACT" ]; then
-                TESTING $H5DUMP_BIN -pH $outfile
-                (
-                    $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
-                )
-                $GREP "CHUNKED" $layoutfile  > /dev/null
-                if [ $? -eq 0 ]; then
-                    echo " FAILED"
-                    nerrors="`expr $nerrors + 1`"
-                else
-                    $GREP "CONTIGUOUS" $layoutfile  > /dev/null
-                    if [ $? -eq 0 ]; then
-                        echo " FAILED"
-                        nerrors="`expr $nerrors + 1`"
-                    else
-                        echo " PASSED"
-                    fi
-                fi
-            else
-                # if CHUNKED
-                if [ $expectlayout = "CHUNKED" ]; then
-                    TESTING $H5DUMP_BIN -pH $outfile
-                    (
-                        $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
-                    )
-                    $GREP "CONTIGUOUS" $layoutfile  > /dev/null
-                    if [ $? -eq 0 ]; then
-                        echo " FAILED"
-                        nerrors="`expr $nerrors + 1`"
-                    else
-                        $GREP "COMPACT" $layoutfile  > /dev/null
-                        if [ $? -eq 0 ]; then
-                            echo " FAILED"
-                            nerrors="`expr $nerrors + 1`"
-                        else
-                            echo " PASSED"
-                        fi
-                    fi
-                fi
-           fi
-        fi
-    )
-
-    # clean up tmp files
-    rm -f $outfile
-    rm -f $layoutfile
-}
-
-# same as TOOLTEST, but it uses the old syntax -i input_file -o output_file
-#
-TOOLTEST0()
-{
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN -i $infile -o $outfile "$@"
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-    rm -f $outfile
-}
-
-
-# same as TOOLTEST, but it uses without -i -o options
-# used to test the family driver, where these files reside
-#
-TOOLTEST1()
-{
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-	echo "*FAILED*"
-	nerrors="`expr $nerrors + 1`"
-    else
-	echo " PASSED"
-	DIFFTEST $infile $outfile
-    fi
-    rm -f $outfile
-}
-
-# This is same as TOOLTEST() with comparing display output
-# from -v option
-#
-TOOLTESTV()
-{
-    expect="$TESTDIR/$2.tst"
-    actual="$TESTDIR/`basename $2 .ddl`.out"
-    actual_err="$TESTDIR/`basename $2 .ddl`.err"
-
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    ) >$actual 2>$actual_err
-    RET=$?
-    if [ $RET != 0 ] ; then
-	echo "*FAILED*"
-	nerrors="`expr $nerrors + 1`"
-    else
-	echo " PASSED"
-	DIFFTEST $infile $outfile
-    fi
-
-    # display output compare
-    STDOUT_FILTER $actual
-    cat $actual_err >> $actual
-
-    VERIFY output from $H5REPACK $@
-    if cmp -s $expect $actual; then
-     echo " PASSED"
-    else
-     echo "*FAILED*"
-     echo "    Expected result (*.tst) differs from actual result (*.out)"
-     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()
-{
-    infile=$2
-    outfile=out-$1.$2
-    expect="$TESTDIR/$1.$2.ddl"
-    actual="$TESTDIR/out-$1.$2.out"
-    actual_err="$TESTDIR/out-$1.$2.err"
-
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    ) >$actual 2>$actual_err
-    RET=$?
-    if [ $RET != 0 ] ; then
-    echo "*FAILED*"
-    nerrors="`expr $nerrors + 1`"
-    else
-     echo " PASSED"
-     VERIFY h5dump output $@
-     (
-        cd $TESTDIR
-        $RUNSERIAL $H5DUMP_BIN -pH $outfile
-     ) >$actual 2>$actual_err
-     cat $actual_err >> $actual
-
-     RET=$?
-
-    fi
-
-    if cmp -s $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 -c $expect $actual |sed 's/^/    /'
-    fi
-
-   rm -f $actual $actual_err
-   rm -f $outfile
-}
-
-# TOOLTEST_META:
-# Test metadata block size option.
-# Reason to create a function here is to localize all special steps related to
-# metadata block size option in one place.  This is a quick solution.  More
-# thought out solution needed when there is more time.
-#
-# $1: test input file
-# $2:$: metadata options (either "-M size" or "--metadata_block_size=size")
-#
-# Algorithm:
-# Run it once without the metadata option ($2-$);
-# Save the result output file;
-# Run it second time with the metadata option;
-# Verify the output file of second run is larger than the one of 1st run.
-TOOLTEST_META()
-{
-    infile=$2
-    outfile=out-$1.$2
-    shift
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-    # get the size of the first output file
-    size1=`wc -c $TESTDIR/$outfile | cut -d' ' -f1`
-
-    # 2nd run with metadata option
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-        cd $TESTDIR
-        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
-    )
-    RET=$?
-    if [ $RET != 0 ] ; then
-        echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-        DIFFTEST $infile $outfile
-    fi
-    # get the size of the second output file
-    size2=`wc -c $TESTDIR/$outfile | cut -d' ' -f1`
-
-    # verify sizes.
-    MESSAGE "Verify the sizes of both output files ($size1 vs $size2)"
-    if [ $size1 -lt $size2 ]; then
-    	# pass
-	echo " PASSED"
-    else
-	#fail
-	echo "*FAILED*"
-        nerrors="`expr $nerrors + 1`"
-    fi
-
-    rm -f $outfile
-}
-# ADD_HELP_TEST
-TOOLTEST_HELP() {
-
-    expect="$TESTDIR/$1"
-    actual="$TESTDIR/`basename $1 .txt`.out"
-    actual_err="$TESTDIR/`basename $1 .txt`.err"
-    shift
-
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-      cd $TESTDIR
-      $RUNSERIAL $H5REPACK_BIN "$@"
-    ) >$actual 2>$actual_err
-    cat $actual_err >> $actual
-
-    if [ ! -f $expect ]; then
-    # Create the expect data file if it doesn't yet exist.
-      echo " CREATED"
-      cp $actual $expect-CREATED
-    elif cmp -s $expect $actual; then
-      echo " PASSED"
-    else
-      echo "*FAILED*"
-      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
-    fi
-
-}
-
-# This is different from $srcdir/../../bin/output_filter.sh
-STDOUT_FILTER() {
-    result_file=$1
-    tmp_file=/tmp/h5test_tmp_$$
-    # Filter name of files.
-    cp $result_file $tmp_file
-    sed -e '/^Opening file/d' -e '/^Making file/d' \
-    < $tmp_file > $result_file
-    # cleanup
-    rm -f $tmp_file
-}
-
-#
-# The tests
-# We use the files generated by h5repacktst
-# 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
-#
-
-# 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.
-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
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-TOOLTEST_HELP h5repack-help.txt -h
-
-# copy files (these files have no filters)
-TOOLTEST fill h5repack_fill.h5
-TOOLTEST objs h5repack_objs.h5
-TOOLTEST attr h5repack_attr.h5
-TOOLTEST hlink h5repack_hlink.h5
-TOOLTEST layout h5repack_layout.h5
-TOOLTEST early h5repack_early.h5
-
-# nested 8bit enum in both deflated and non-deflated datafiles
-if [ $USE_FILTER_DEFLATE != "yes" ]; then
-TOOLTEST nested_8bit_enum h5repack_nested_8bit_enum.h5
-else
-TOOLTEST nested_8bit_enum h5repack_nested_8bit_enum_deflated.h5
-fi
-
-# use h5repack_layout.h5 to write some filters  (this file has  no filters)
-
-# gzip with individual object
-arg="h5repack_layout.h5 -f dset1:GZIP=1  -l dset1:CHUNK=20x10"
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST gzip_individual $arg
-fi
-
-# gzip for all
-arg="h5repack_layout.h5 -f GZIP=1"
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST gzip_all $arg
-fi
-
-# szip with individual object
-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
-fi
-
-# szip for all
-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
-fi
-
-# shuffle with individual object
-arg="h5repack_layout.h5 -f dset2:SHUF  -l dset2:CHUNK=20x10"
-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
-
-# fletcher32 for all
-arg="h5repack_layout.h5 -f FLET"
-TOOLTEST fletcher_all $arg
-
-# all filters
-arg="h5repack_layout.h5 -f dset2:SHUF -f dset2:FLET -f dset2:SZIP=8,NN -f dset2:GZIP=1 -l dset2:CHUNK=20x10"
-if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST all_filters $arg
-fi
-
-# verbose gzip with individual object
-arg="h5repack_filters.h5 -v -f /dset_deflate:GZIP=9"
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- # compare output
- TOOLTESTV gzip_verbose_filters $arg
-fi
-
-###########################################################
-# the following tests assume the input files have filters
-###########################################################
-
-# szip copy
-arg="h5repack_szip.h5"
-if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
- SKIP $arg
-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
- SKIP $arg
-else
- TOOLTEST szip_remove $arg
-fi
-
-# deflate copy
-arg="h5repack_deflate.h5"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST deflate_copy $arg
-fi
-
-# deflate remove
-arg="h5repack_deflate.h5 -f dset_deflate:NONE"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST deflate_remove $arg
-fi
-
-# shuffle copy
-arg="h5repack_shuffle.h5"
-TOOLTEST shuffle_copy $arg
-
-# shuffle remove
-arg="h5repack_shuffle.h5 -f dset_shuffle:NONE"
-TOOLTEST shuffle_remove $arg
-
-# fletcher32 copy
-arg="h5repack_fletcher.h5"
-TOOLTEST fletcher_copy $arg
-
-# fletcher32 remove
-arg="h5repack_fletcher.h5 -f dset_fletcher32:NONE"
-TOOLTEST fletcher_remove $arg
-
-# nbit copy
-arg="h5repack_nbit.h5"
-TOOLTEST nbit_copy $arg
-
-# nbit remove
-arg="h5repack_nbit.h5 -f dset_nbit:NONE"
-TOOLTEST nbit_remove $arg
-
-# nbit add
-arg="h5repack_nbit.h5 -f dset_int31:NBIT"
-TOOLTEST nbit_add $arg
-
-# scaleoffset copy
-arg="h5repack_soffset.h5"
-TOOLTEST scale_copy $arg
-
-# scaleoffset add
-arg="h5repack_soffset.h5 -f dset_none:SOFF=31,IN"
-TOOLTEST scale_add $arg
-
-# scaleoffset remove
-arg="h5repack_soffset.h5 -f dset_scaleoffset:NONE"
-TOOLTEST scale_remove $arg
-
-# remove all  filters
-arg="h5repack_filters.h5 -f NONE"
-if test $USE_FILTER_DEFLATE != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SZIP_ENCODER != "yes" ; then
- SKIP $arg
-else
- TOOLTEST remove_all $arg
-fi
-
-#filter conversions
-
-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
-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
-fi
-
-
-#limit
-arg="h5repack_layout.h5 -f GZIP=1 -m 1024"
-if test $USE_FILTER_DEFLATE != "yes"  ; then
- SKIP $arg
-else
- TOOLTEST_DUMP deflate_limit $arg
-fi
-
-#file
-arg="h5repack_layout.h5 -e h5repack.info"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST deflate_file $arg
-fi
-
-#########################################################
-# layout options (these files have no filters)
-#########################################################
-VERIFY_LAYOUT_DSET dset2_chunk_20x10 h5repack_layout.h5 dset2 CHUNKED --layout dset2:CHUNK=20x10
-
-VERIFY_LAYOUT_ALL chunk_20x10 h5repack_layout.h5 CHUNKED -l CHUNK=20x10
-
-VERIFY_LAYOUT_DSET dset2_conti h5repack_layout.h5 dset2 CONTIGUOUS -l dset2:CONTI
-
-VERIFY_LAYOUT_ALL conti h5repack_layout.h5 CONTIGUOUS -l CONTI
-
-VERIFY_LAYOUT_DSET dset2_compa h5repack_layout.h5 dset2 COMPACT -l dset2:COMPA
-
-VERIFY_LAYOUT_ALL compa h5repack_layout.h5 COMPACT -l COMPA
-
-################################################################
-# layout conversions (file has no filters)
-###############################################################
-
-VERIFY_LAYOUT_DSET dset_compa_conti h5repack_layout.h5 dset_compact CONTIGUOUS -l dset_compact:CONTI
-
-VERIFY_LAYOUT_DSET dset_compa_chunk h5repack_layout.h5 dset_compact CHUNKED -l dset_compact:CHUNK=2x5
-
-VERIFY_LAYOUT_DSET dset_compa_compa h5repack_layout.h5 dset_compact COMPACT -l dset_compact:COMPA
-
-VERIFY_LAYOUT_DSET dset_conti_compa h5repack_layout.h5 dset_contiguous COMPACT -l dset_contiguous:COMPA
-
-VERIFY_LAYOUT_DSET dset_conti_chunk h5repack_layout.h5 dset_contiguous CHUNKED -l dset_contiguous:CHUNK=3x6
-
-VERIFY_LAYOUT_DSET dset_conti_conti h5repack_layout.h5 dset_contiguous CONTIGUOUS -l dset_contiguous:CONTI
-
-VERIFY_LAYOUT_DSET chunk_compa h5repack_layout.h5 dset_chunk COMPACT -l dset_chunk:COMPA
-
-VERIFY_LAYOUT_DSET chunk_conti h5repack_layout.h5 dset_chunk CONTIGUOUS -l dset_chunk:CONTI
-
-VERIFY_LAYOUT_DSET chunk_18x13 h5repack_layout.h5 dset_chunk CHUNKED -l dset_chunk:CHUNK=18x13
-
-# test convert small size dataset ( < 1k) to compact layout without -m
-VERIFY_LAYOUT_DSET contig_small_compa h5repack_layout2.h5 contig_small COMPACT -l contig_small:COMPA
-
-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
-# 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
-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,
-# should remain as original layout (chunk)
-VERIFY_LAYOUT_DSET chunk2compa h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA
-
-#--------------------------------------------------------------------------
-# Test -f for some specific cases. Chunked dataset with unlimited max dims.
-# (HDFFV-8012)
-#--------------------------------------------------------------------------
-# - should not fail
-# - should not change max dims from unlimit
-
-# chunk dim is bigger than dataset dim. ( dset size < 64k )
-VERIFY_LAYOUT_DSET error1 h5repack_layout3.h5 chunk_unlimit1 H5S_UNLIMITED -f chunk_unlimit1:NONE
-# chunk dim is bigger than dataset dim. ( dset size > 64k )
-VERIFY_LAYOUT_DSET error2 h5repack_layout3.h5 chunk_unlimit2 H5S_UNLIMITED -f chunk_unlimit2:NONE
-
-# chunk dims are smaller than dataset dims. ( dset size < 64k )
-#TOOLTEST_MAIN h5repack_layout3.h5  -f chunk_unlimit3:NONE
-VERIFY_LAYOUT_DSET error3 h5repack_layout3.h5 chunk_unlimit3 H5S_UNLIMITED -f chunk_unlimit3:NONE
-
-# file input - should not fail
-TOOLTEST error4 h5repack_layout3.h5 -f NONE
-
-#--------------------------------------------------------------------------
-# 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.
-VERIFY_LAYOUT_DSET ckdim_smaller h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI
-
-
-# Native option
-# Do not use FILE1, as the named dtype will be converted to native, and h5diff will
-# report a difference.
-TOOLTEST native_fill h5repack_fill.h5 -n
-TOOLTEST native_attr h5repack_attr.h5 -n
-
-
-# latest file format with long switches. use FILE4=h5repack_layout.h5 (no filters)
-arg="h5repack_layout.h5 --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype]"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- VERIFY_LAYOUT_ALL layout_long_switches h5repack_layout.h5 CHUNKED --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype]
-fi
-
-# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
-arg="h5repack_layout.h5 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- VERIFY_LAYOUT_ALL layout_short_switches h5repack_layout.h5 CHUNKED -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]
-fi
-
-# several global filters
-
-arg="h5repack_layout.h5 --filter GZIP=1 --filter SHUF"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST global_filters $arg
-fi
-
-# syntax of -i infile -o outfile
-# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
-arg="h5repack_layout.h5 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
-if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg
-else
- TOOLTEST0 old_style_layout_short_switches $arg
-fi
-
-# add a userblock to file
-arg="h5repack_objs.h5 -u ublock.bin -b 2048"
-TOOLTEST add_userblock $arg
-
-# add alignment
-arg="h5repack_objs.h5 -t 1 -a 1 "
-TOOLTEST add_alignment $arg
-
-# Check repacking file with old version of layout message (should get upgraded
-#       to new version and be readable, etc.)
-TOOLTEST upgrade_layout h5repack_layouto.h5
-
-# test for datum size > H5TOOLS_MALLOCSIZE
-TOOLTEST gt_mallocsize h5repack_objs.h5 -f GZIP=1
-
-# Check repacking file with committed datatypes in odd configurations
-TOOLTEST committed_dt h5repack_named_dtypes.h5
-
-# tests family driver (file is located in common testfiles folder, uses TOOLTEST1
-TOOLTEST1 family tfamily%05d.h5
-
-# test various references (bug 1814 and 1726)
-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
-
-# 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
-TOOLTEST_META meta_short h5repack_layout.h5 -M 8192
-TOOLTEST_META meta_long h5repack_layout.h5 --metadata_block_size=8192
-
-# VDS tests
-
-################################################################
-# layout conversions
-###############################################################
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP vds_dset_chunk_20x10x5
-else
- VERIFY_LAYOUT_VDS vds_dset_chunk_20x10x5 1_vds.h5 vds_dset CHUNKED --layout vds_dset:CHUNK=20x10x5
-fi
-
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP vds_chunk2x5x8
-else
- VERIFY_LAYOUT_VDS vds_chunk2x5x8 3_1_vds.h5 vds_dset CHUNKED -l vds_dset:CHUNK=2x5x8
-fi
-
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP vds_chunk3x6x9
-else
- VERIFY_LAYOUT_VDS vds_chunk3x6x9 2_vds.h5 vds_dset CHUNKED -l vds_dset:CHUNK=3x6x9
-fi
-
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP vds_compa 4_vds.h5
-else
- VERIFY_LAYOUT_VDS vds_compa 4_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
-fi
-
-if test  $USE_FILTER_DEFLATE != "yes" ; then
- SKIP vds_conti 4_vds.h5
-else
- VERIFY_LAYOUT_VDS vds_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
-fi
-
-# 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/h5repack_copy.c b/tools/h5repack/h5repack_copy.c
deleted file mode 100644
index 1171ab8..0000000
--- a/tools/h5repack/h5repack_copy.c
+++ /dev/null
@@ -1,1677 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/*-------------------------------------------------------------------------
- * typedefs
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * globals
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * macros
- *-------------------------------------------------------------------------
- */
-
-/* size of buffer/# of bytes to xfer at a time when copying userblock */
-#define USERBLOCK_XFER_SIZE     512     
-
-/* check H5Dread()/H5Dwrite() error, e.g. memory allocation error inside the library. */
-#define CHECK_H5DRW_ERROR(_fun, _did, _mtid, _msid, _fsid, _pid, _buf)  {  \
-    H5E_BEGIN_TRY {  \
-        if(_fun(_did, _mtid, _msid, _fsid, _pid, _buf) < 0) {  \
-            hid_t _err_num = 0; \
-            char _msg[80]; \
-            H5Ewalk2(H5E_DEFAULT, H5E_WALK_DOWNWARD, walk_error_callback, &_err_num); \
-            H5Eget_msg(_err_num, NULL, _msg, (size_t)80); \
-            error_msg("%s %s -- %s\n", #_fun, "failed", _msg); \
-            goto error; \
-        } \
-    } H5E_END_TRY; \
-}
-
-/*-------------------------------------------------------------------------
- * local functions
- *-------------------------------------------------------------------------
- */
-static int Get_hyperslab(hid_t dcpl_id, int rank_dset, hsize_t dims_dset[],
-		size_t size_datum, hsize_t dims_hslab[], hsize_t * hslab_nbytes_p);
-static void print_dataset_info(hid_t dcpl_id, char *objname, double per, int pr);
-static int do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt,
-		pack_opt_t *options);
-static int copy_user_block(const char *infile, const char *outfile,
-		hsize_t size);
-#if defined (H5REPACK_DEBUG_USER_BLOCK)
-static void print_user_block(const char *filename, hid_t fid);
-#endif
-static herr_t walk_error_callback(unsigned n, const H5E_error2_t *err_desc, void *udata);
-
-/* 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)
-		*((hid_t *) udata) = err_desc->maj_num;
-
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: copy_objects
- *
- * Purpose: duplicate all HDF5 objects in the file
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: October, 23, 2003
- *
- * Modification:
- *   Peter Cao, June 13, 2007
- *   Add "-L, --latest" and other options to pack a file with the latest file format
- *
- *   Peter Cao, September 25, 2007
- *   Copy user block when repacking a file
- *
- *   Pedro Vicente, August 20, 2008
- *   Add a user block to file if requested
- *
- *-------------------------------------------------------------------------
- */
-
-int copy_objects(const char* fnamein, const char* fnameout, pack_opt_t *options) {
-	hid_t fidin;
-	hid_t fidout = -1;
-	trav_table_t *travt = NULL;
-	hsize_t ub_size = 0; /* size of user block */
-	hid_t fcpl = H5P_DEFAULT; /* file creation property list ID */
-	hid_t fapl = H5P_DEFAULT; /* file access property list ID */
-
-	/*-------------------------------------------------------------------------
-	 * open input file
-	 *-------------------------------------------------------------------------
-	 */
-	if ((fidin = h5tools_fopen(fnamein, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL,
-			(size_t) 0)) < 0) {
-		error_msg("<%s>: %s\n", fnamein, H5FOPENERROR);
-		goto out;
-	}
-
-	/* get user block size and file space strategy/threshold */
-	{
-		hid_t fcpl_in; /* file creation property list ID for input file */
-
-		if ((fcpl_in = H5Fget_create_plist(fidin)) < 0) {
-			error_msg("failed to retrieve file creation property list\n");
-			goto out;
-		}
-
-		if (H5Pget_userblock(fcpl_in, &ub_size) < 0) {
-			error_msg("failed to retrieve userblock size\n");
-			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;
-		}
-	}
-
-	/* Check if we need to create a non-default file creation property list */
-	if (options->latest || ub_size > 0) {
-		/* Create file creation property list */
-		if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) {
-			error_msg("fail to create a file creation property list\n");
-			goto out;
-		}
-
-		if (ub_size > 0) {
-			if (H5Pset_userblock(fcpl, ub_size) < 0) {
-				error_msg("failed to set non-default userblock size\n");
-				goto out;
-			}
-		}
-
-		if (options->latest) {
-			unsigned i = 0, nindex = 0, mesg_type_flags[5], min_mesg_sizes[5];
-
-			/* Adjust group creation parameters for root group */
-			/* (So that it is created in "dense storage" form) */
-			if (H5Pset_link_phase_change(fcpl, (unsigned) options->grp_compact,
-					(unsigned) options->grp_indexed) < 0) {
-				error_msg(
-						"fail to adjust group creation parameters for root group\n");
-				goto out;
-			}
-
-			for (i = 0; i < 5; i++) {
-				if (options->msg_size[i] > 0) {
-					switch (i) {
-					case 0:
-						mesg_type_flags[nindex] = H5O_SHMESG_SDSPACE_FLAG;
-						break;
-
-					case 1:
-						mesg_type_flags[nindex] = H5O_SHMESG_DTYPE_FLAG;
-						break;
-
-					case 2:
-						mesg_type_flags[nindex] = H5O_SHMESG_FILL_FLAG;
-						break;
-
-					case 3:
-						mesg_type_flags[nindex] = H5O_SHMESG_PLINE_FLAG;
-						break;
-
-					case 4:
-						mesg_type_flags[nindex] = H5O_SHMESG_ATTR_FLAG;
-						break;
-					default:
-						break;
-					} /* end switch */
-					min_mesg_sizes[nindex] = (unsigned) options->msg_size[i];
-
-					nindex++;
-				} /* end if */
-			} /* end for */
-
-			if (nindex > 0) {
-				if (H5Pset_shared_mesg_nindexes(fcpl, nindex) < 0) {
-					error_msg(
-							"fail to set the number of shared object header message indexes\n");
-					goto out;
-				}
-
-				/* msg_size[0]=dataspace, 1=datatype, 2=file value, 3=filter pipleline, 4=attribute */
-				for (i = 0; i < (nindex - 1); i++) {
-					if (H5Pset_shared_mesg_index(fcpl, i, mesg_type_flags[i],
-							min_mesg_sizes[i]) < 0) {
-						error_msg(
-								"fail to configure the specified shared object header message index\n");
-						goto out;
-					} /* end if */
-				} /* end for */
-			} /* if (nindex>0) */
-
-			/* Create file access property list */
-			if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-				error_msg("Could not create file access property list\n");
-				goto out;
-			} /* end if */
-
-			if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) {
-				error_msg(
-						"Could not set property for using latest version of the format\n");
-				goto out;
-			} /* end if */
-		} /* end if */
-	} /* end if */
-#if defined (H5REPACK_DEBUG_USER_BLOCK)
-	print_user_block(fnamein, fidin);
-#endif
-
-	/*-------------------------------------------------------------------------
-	 * set the new user userblock options in the FCPL (before H5Fcreate )
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->ublock_size > 0) {
-		/* 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 user block size */
-		if (H5Pset_userblock(fcpl, options->ublock_size) < 0) {
-			error_msg("failed to set userblock size\n");
-			goto out;
-		}
-	}
-
-	/*-------------------------------------------------------------------------
-	 * set alignment options
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->alignment > 0) {
-		/* either use the FAPL already created or create a new one */
-		if (fapl == H5P_DEFAULT) {
-			/* create a file access property list */
-			if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-				error_msg("Could not create file access property list\n");
-				goto out;
-			}
-		}
-
-		if (H5Pset_alignment(fapl, options->threshold, options->alignment) < 0) {
-			error_msg("failed to set alignment\n");
-			goto out;
-		}
-	}
-
-	/*-------------------------------------------------------------------------
-	 * set metadata block size option
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->meta_block_size > 0) {
-		/* either use the FAPL already created or create a new one */
-		if (fapl == H5P_DEFAULT) {
-			/* create a file access property list */
-			if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-				error_msg("Could not create file access property list\n");
-				goto out;
-			}
-		}
-
-		if (H5Pset_meta_block_size(fapl, options->meta_block_size) < 0) {
-			error_msg("failed to set metadata block size\n");
-			goto out;
-		}
-	}
-
-	/*-------------------------------------------------------------------------
-	 * 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
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->verbose)
-		printf("Making file <%s>...\n", fnameout);
-
-	if ((fidout = H5Fcreate(fnameout, H5F_ACC_TRUNC, fcpl, fapl)) < 0) {
-		error_msg("<%s>: Could not create file\n", fnameout);
-		goto out;
-	}
-
-	/*-------------------------------------------------------------------------
-	 * write a new user block if requested
-	 *-------------------------------------------------------------------------
-	 */
-	if (options->ublock_size > 0) {
-		if (copy_user_block(options->ublock_filename, fnameout,
-				options->ublock_size) < 0) {
-			error_msg("Could not copy user block. Exiting...\n");
-			goto out;
-
-		}
-	}
-
-	/*-------------------------------------------------------------------------
-	 * get list of objects
-	 *-------------------------------------------------------------------------
-	 */
-
-	/* init table */
-	trav_table_init(&travt);
-
-	/* get the list of objects in the file */
-	if (h5trav_gettable(fidin, travt) < 0)
-		goto out;
-
-	/*-------------------------------------------------------------------------
-	 * do the copy
-	 *-------------------------------------------------------------------------
-	 */
-	if (do_copy_objects(fidin, fidout, travt, options) < 0) {
-		error_msg("<%s>: Could not copy data to: %s\n", fnamein, fnameout);
-		goto out;
-	} /* end if */
-
-	/*-------------------------------------------------------------------------
-	 * do the copy of referenced objects
-	 * and create hard links
-	 *-------------------------------------------------------------------------
-	 */
-	if (do_copy_refobjs(fidin, fidout, travt, options) < 0) {
-		printf("h5repack: <%s>: Could not copy data to: %s\n", fnamein,
-				fnameout);
-		goto out;
-	}
-
-	/*-------------------------------------------------------------------------
-	 * close
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (fapl > 0)
-		H5Pclose(fapl);
-
-	if (fcpl > 0)
-		H5Pclose(fcpl);
-
-	H5Fclose(fidin);
-	H5Fclose(fidout);
-
-	/* free table */
-	trav_table_free(travt);
-	travt = NULL;
-
-	/*-------------------------------------------------------------------------
-	 * write only the input file user block if there is no user block file input
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (ub_size > 0 && options->ublock_size == 0) {
-		if (copy_user_block(fnamein, fnameout, ub_size) < 0) {
-			error_msg("Could not copy user block. Exiting...\n");
-			goto out;
-
-		}
-	}
-
-	return 0;
-
-	/*-------------------------------------------------------------------------
-	 * out
-	 *-------------------------------------------------------------------------
-	 */
-
-out:
-	H5E_BEGIN_TRY
-		{
-			H5Pclose(fapl);
-			H5Pclose(fcpl);
-			H5Fclose(fidin);
-			H5Fclose(fidout);
-		}H5E_END_TRY;
-	if (travt)
-		trav_table_free(travt);
-
-	return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: Get_hyperslab
- *
- * Purpose: Calulate a hyperslab from a dataset for higher performance.
- *          The size of hyperslab is limitted by H5TOOLS_BUFSIZE.
- *          Return the hyperslab dimentions and size in byte.
- *
- * Return: 0 - SUCCEED, -1 FAILED
- *
- * Parameters:
- *   dcpl_id : [IN] dataset creation property.
- *   rank_dset : [IN] dataset rank
- *   dims_dset[] : [IN] dataset dimentions
- *   size_datum : [IN] size of a data element in byte
- *   dims_hslab[] : [OUT] calculated hyperslab dimentions
- *   * hslab_nbytes_p : [OUT] total byte of the hyperslab
- *
- * Programmer: Jonathan Kim
- * Date: Feburary, 2012
- * Update:
- *   The hyperslab calucation would be depend on if the dataset is chunked
- *   or not.
- *
- *   There care 3 conditions to cover:
- *   1. If chunked and a chunk fits in buffer, each chunk would be a unit of
- *      collection and the boundary would be dataset's dims.
- *   2. If chunked but a chunk doesn't fit in buffer, each data element would
- *      be a unit of collection and the boundary would be the chunk itself.
- *   3. If not chunked, each data element would be a unit of collection and
- *      the boundary would be dataset's dims.
- *
- *   The calulation starts from the last dimention (h5dump dims output).
- *
- * Note:
- *   Added for JIRA HDFFV-7862.
- *-----------------------------------------*/
-
-int Get_hyperslab(hid_t dcpl_id, int rank_dset, hsize_t dims_dset[],
-		size_t size_datum, hsize_t dims_hslab[], hsize_t * hslab_nbytes_p) {
-	int status = 0;
-	int k;
-	H5D_layout_t dset_layout;
-	int rank_chunk;
-	hsize_t dims_chunk[H5S_MAX_RANK];
-	hsize_t size_chunk = 1;
-	hsize_t nchunk_fit; /* number of chunks that fits in hyperslab buffer (H5TOOLS_BUFSIZE) */
-	hsize_t ndatum_fit; /* number of dataum that fits in hyperslab buffer (H5TOOLS_BUFSIZE) */
-	hsize_t chunk_dims_map[H5S_MAX_RANK]; /* mapped chunk dimentions */
-	hsize_t hs_dims_map[H5S_MAX_RANK]; /* mapped hyperslab dimentions */
-	hsize_t hslab_nbytes; /* size of hyperslab in byte */
-
-	/* init to set as size of a data element */
-	hslab_nbytes = size_datum;
-
-	/* get layout of dataset */
-	dset_layout = H5Pget_layout(dcpl_id);
-
-	/* if dataset is chunked */
-	if (dset_layout == H5D_CHUNKED) {
-		/* get chunk dims */
-		rank_chunk = H5Pget_chunk(dcpl_id, rank_dset, dims_chunk);
-		if (rank_chunk < 0) {
-			status = -1;
-			goto out;
-		}
-
-		for (k = rank_dset; k > 0; --k)
-			size_chunk *= dims_chunk[k - 1];
-
-		/* figure out how many chunks can fit in the hyperslab buffer */
-		nchunk_fit = (H5TOOLS_BUFSIZE / size_datum) / size_chunk;
-
-		/* 1. if a chunk fit in hyperslab buffer */
-		if (nchunk_fit >= 1) {
-			/* Calulate a hyperslab that contains as many chunks that can fit
-			 * in hyperslab buffer. Hyperslab will be increased starting from
-			 * the last dimention of the dataset (see h5dump's dims output).
-			 * The calculation boundary is dataset dims.
-			 * In the loop, used mapping from a datum to a chunk to figure out
-			 * chunk based hyperslab.
-			 */
-			for (k = rank_dset; k > 0; --k) {
-				/* map dataset dimentions with a chunk dims */
-				chunk_dims_map[k - 1] = dims_dset[k - 1] / dims_chunk[k - 1];
-
-				/* if reminder exist, increse by 1 to cover partial edge chunks */
-				if (dims_dset[k - 1] % dims_chunk[k - 1] > 0)
-					chunk_dims_map[k - 1]++;
-
-				/* get mapped hyperslab dims */
-				hs_dims_map[k - 1] = MIN (nchunk_fit, chunk_dims_map[k-1]);
-
-				/* prepare next round */
-				nchunk_fit = nchunk_fit / chunk_dims_map[k - 1];
-				/* if a chunk is bigger than the rest of buffer */
-				if (nchunk_fit == 0)
-					nchunk_fit = 1;
-
-				/* get hyperslab dimentions as unmapping to actual size */
-				dims_hslab[k - 1] =
-						MIN( (hs_dims_map[k-1] * dims_chunk[k-1]), dims_dset[k-1]);
-
-				/* calculate total size for the hyperslab */
-				hslab_nbytes *= dims_hslab[k - 1];
-			}
-		}
-		/* 2. if a chunk is bigger than hyperslab buffer */
-		else {
-			/* Calulate a hyperslab that contains as many data elements that
-			 * can fit in hyperslab buffer. Hyperslab will be increased
-			 * starting from the last dimention of the chunk (see h5dump's dims
-			 * output).
-			 * The calculation boundary is a chunk dims.
-			 */
-			for (k = rank_dset; k > 0; --k) {
-				ndatum_fit = H5TOOLS_BUFSIZE / hslab_nbytes;
-
-				/* if a datum is bigger than rest of buffer */
-				if (ndatum_fit == 0)
-					ndatum_fit = 1;
-				/* get hyperslab dimentions within a chunk boundary */
-				dims_hslab[k - 1] = MIN (dims_chunk[k-1], ndatum_fit);
-
-				/* calculate total size for the hyperslab */
-				hslab_nbytes *= dims_hslab[k - 1];
-
-				if (hslab_nbytes <= 0) {
-					status = -1;
-					goto out;
-				}
-			}
-		}
-	}
-	/* 3. if dataset is not chunked */
-	else {
-		/* Calulate a hyperslab that contains as many data elements that can
-		 * fit in hyperslab buffer. Hyperslab will be increased starting from
-		 * the last dimention of the dataset (see h5dump's dims output).
-		 * The calculation boundary is dataset dims.
-		 */
-		for (k = rank_dset; k > 0; --k) {
-			ndatum_fit = H5TOOLS_BUFSIZE / hslab_nbytes;
-
-			/* if a datum is bigger than rest of buffer */
-			if (ndatum_fit == 0)
-				ndatum_fit = 1;
-			/* get hyperslab dimentions within dataset boundary */
-			dims_hslab[k - 1] = MIN(dims_dset[k - 1], ndatum_fit);
-
-			/* calculate total size for the hyperslab */
-			hslab_nbytes *= dims_hslab[k - 1];
-
-			if (hslab_nbytes <= 0) {
-				status = -1;
-				goto out;
-			}
-		}
-	}
-
-	/* pass out the hyperslab size*/
-	*hslab_nbytes_p = hslab_nbytes;
-
-out:
-	return status;
-}
-
-/*-------------------------------------------------------------------------
- * Function: do_copy_objects
- *
- * Purpose: duplicate all HDF5 objects in the file
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: October, 23, 2003
- *
- * Modifications:
- *
- *  July 2004:     Introduced the extra EC or NN option for SZIP
- *
- *  December 2004: Added a check for H5Dcreate; if the dataset cannot be created
- *                  with the requested filter, use the input one
- *
- *  October 2006:  Read/write using the file type by default.
- *
- *  October 2006:  Read by hyperslabs for big datasets.
- *
- *  A threshold of H5TOOLS_MALLOCSIZE (128 MB) is the limit upon which I/O hyperslab is done
- *  i.e., if the memory needed to read a dataset is greater than this limit,
- *  then hyperslab I/O is done instead of one operation I/O
- *  For each dataset, the memory needed is calculated according to
- *
- *  memory needed = number of elements * size of each element
- *
- *  if the memory needed is lower than H5TOOLS_MALLOCSIZE, then the following operations
- *  are done
- *
- *  H5Dread( input_dataset1 )
- *  H5Dread( input_dataset2 )
- *
- *  with all elements in the datasets selected. If the memory needed is greater than
- *  H5TOOLS_MALLOCSIZE, then the following operations are done instead:
- *
- *  a strip mine is defined for each dimension k (a strip mine is defined as a
- *  hyperslab whose size is memory manageable) according to the formula
- *
- *  (1) strip_mine_size[k ] = MIN(dimension[k ], H5TOOLS_BUFSIZE / size of memory type)
- *
- *  where H5TOOLS_BUFSIZE is a constant currently defined as 1MB. This formula assures
- *  that for small datasets (small relative to the H5TOOLS_BUFSIZE constant), the strip
- *  mine size k is simply defined as its dimension k, but for larger datasets the
- *  hyperslab size is still memory manageable.
- *  a cycle is done until the number of elements in the dataset is reached. In each
- *  iteration, two parameters are defined for the function H5Sselect_hyperslab,
- *  the start and size of each hyperslab, according to
- *
- *  (2) hyperslab_size [k] = MIN(dimension[k] - hyperslab_offset[k], strip_mine_size [k])
- *
- *  where hyperslab_offset [k] is initially set to zero, and later incremented in
- *  hyperslab_size[k] offsets. The reason for the operation
- *
- *  dimension[k] - hyperslab_offset[k]
- *
- *  in (2) is that, when using the strip mine size, it assures that the "remaining" part
- *  of the dataset that does not fill an entire strip mine is processed.
- *
- *  November 2006:  Use H5Ocopy in the copy of objects. The logic for using
- *   H5Ocopy or not is if a change of filters or layout is requested by the user
- *   then use read/write else use H5Ocopy.
- *
- * May, 1, 2008: Add a printing of the compression ratio of old size / new size
- *
- * Feburary 2012:  improve Read/Write by hyperslabs for big datasets.
- * Programmer: Jonathan Kim
- *
- *  A threshold of H5TOOLS_MALLOCSIZE is the limit upon which I/O hyperslab is done
- *  i.e., if the memory needed to read a dataset is greater than this limit,
- *  then hyperslab I/O is done instead of one operation I/O
- *  For each dataset, the memory needed is calculated according to
- *
- *  memory needed = number of elements * size of each element
- *
- *  if the memory needed is lower than H5TOOLS_MALLOCSIZE, then the following operations
- *  are done
- *
- *  H5Dread( input_dataset )
- *  H5Dwrite( output_dataset )
- *
- *  with all elements in the datasets selected. If the memory needed is greater than
- *  H5TOOLS_MALLOCSIZE, then the following operations are done instead:
- *
- *  1. figure out a hyperslab (dimentions) and size  (refer to Get_hyperslab()).
- *  2. Calculate the hyperslab selections as the selection is moving forward.
- *     Selection would be same as the hyperslab except for the remaining edge portion
- *     of the dataset. The code take care of the remaining portion if exist.
- *
- *-------------------------------------------------------------------------
- */
-
-int do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt,
-		pack_opt_t *options) /* repack options */
-{
-	hid_t grp_in = -1; /* group ID */
-	hid_t grp_out = -1; /* group ID */
-	hid_t dset_in = -1; /* read dataset ID */
-	hid_t dset_out = -1; /* write dataset ID */
-	hid_t gcpl_in = -1; /* group creation property list */
-	hid_t gcpl_out = -1; /* group creation property list */
-	hid_t type_in = -1; /* named type ID */
-	hid_t type_out = -1; /* named type ID */
-	hid_t dcpl_in = -1; /* dataset creation property list ID */
-	hid_t dcpl_out = -1; /* dataset creation property list ID */
-	hid_t f_space_id = -1; /* file space ID */
-	hid_t ftype_id = -1; /* file type ID */
-	hid_t wtype_id = -1; /* read/write type ID */
-	named_dt_t *named_dt_head = NULL; /* Pointer to the stack of named datatypes copied */
-	size_t msize; /* size of type */
-	hsize_t nelmts; /* number of elements in dataset */
-	H5D_space_status_t space_status; /* determines whether space has been allocated for the dataset  */
-	int rank; /* rank of dataset */
-	hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
-	hsize_t dsize_in; /* input dataset size before filter */
-	hsize_t dsize_out; /* output dataset size after filter */
-	int apply_s; /* flag for apply filter to small dataset sizes */
-	int apply_f; /* flag for apply filter to return error on H5Dcreate */
-	void *buf = NULL; /* buffer for raw data */
-	void *hslab_buf = NULL; /* hyperslab buffer for raw data */
-	int has_filter; /* current object has a filter */
-	int req_filter; /* there was a request for a filter */
-	int req_obj_layout = 0; /* request layout to current object */
-	unsigned crt_order_flags; /* group creation order flag */
-	unsigned i;
-	unsigned u;
-	int is_ref = 0;
-	htri_t is_named;
-	hbool_t limit_maxdims;
-	hsize_t size_dset;
-
-	/*-------------------------------------------------------------------------
-	 * copy the suppplied object list
-	 *-------------------------------------------------------------------------
-	 */
-
-	if (options->verbose) {
-		printf("-----------------------------------------\n");
-		printf(" Type     Filter (Compression)     Name\n");
-		printf("-----------------------------------------\n");
-	}
-
-	for (i = 0; i < travt->nobjs; i++) {
-		/* init variables per obj */
-		buf = NULL;
-		limit_maxdims = FALSE;
-
-		switch (travt->objs[i].type) {
-
-		case H5TRAV_TYPE_UNKNOWN:
-			HDassert(0);
-			break;
-			/*-------------------------------------------------------------------------
-			 * H5TRAV_TYPE_GROUP
-			 *-------------------------------------------------------------------------
-			 */
-		case H5TRAV_TYPE_GROUP:
-
-			if (options->verbose) {
-				printf(FORMAT_OBJ, "group", travt->objs[i].name);
-			}
-
-			/* open input group */
-			if ((grp_in = H5Gopen2(fidin, travt->objs[i].name, H5P_DEFAULT))
-					< 0)
-				goto error;
-
-			/* get input group creation property list */
-			if ((gcpl_in = H5Gget_create_plist(grp_in)) < 0)
-				goto error;
-
-			/* query and set the group creation properties */
-			if (H5Pget_link_creation_order(gcpl_in, &crt_order_flags) < 0)
-				goto error;
-
-			/* set up group creation property list */
-			if ((gcpl_out = H5Pcreate(H5P_GROUP_CREATE)) < 0)
-				goto error;
-
-			if (H5Pset_link_creation_order(gcpl_out, crt_order_flags) < 0)
-				goto error;
-
-			/*-------------------------------------------------------------------------
-			 * the root is a special case, we get an ID for the root group
-			 * and copy its attributes using that ID
-			 *-------------------------------------------------------------------------
-			 */
-			if (HDstrcmp(travt->objs[i].name, "/") == 0) {
-				if ((grp_out = H5Gopen2(fidout, "/", H5P_DEFAULT)) < 0)
-					goto error;
-			}
-			else {
-
-				if (options->grp_compact > 0 || options->grp_indexed > 0) {
-					if (H5Pset_link_phase_change(gcpl_out,
-							(unsigned) options->grp_compact,
-							(unsigned) options->grp_indexed) < 0)
-						goto error;
-				}
-
-				if ((grp_out = H5Gcreate2(fidout, travt->objs[i].name,
-						H5P_DEFAULT, gcpl_out, H5P_DEFAULT)) < 0)
-					goto error;
-
-			}
-
-			/*-------------------------------------------------------------------------
-			 * copy attrs
-			 *-------------------------------------------------------------------------
-			 */
-			if (copy_attr(grp_in, grp_out, &named_dt_head, travt, options) < 0)
-				goto error;
-
-			if (H5Pclose(gcpl_out) < 0)
-				goto error;
-			if (H5Pclose(gcpl_in) < 0)
-				goto error;
-			if (H5Gclose(grp_out) < 0)
-				goto error;
-			if (H5Gclose(grp_in) < 0)
-				goto error;
-
-			break;
-
-			/*-------------------------------------------------------------------------
-			 * H5TRAV_TYPE_DATASET
-			 *-------------------------------------------------------------------------
-			 */
-		case H5TRAV_TYPE_DATASET:
-
-			has_filter = 0;
-			req_filter = 0;
-
-			/* check if global filters were requested */
-			if (options->n_filter_g)
-				req_filter = 1;
-
-			/* check if filters were requested for individual objects */
-			for (u = 0; u < options->op_tbl->nelems; u++) {
-
-				if (HDstrcmp(travt->objs[i].name, options->op_tbl->objs[u].path) == 0) {
-					if (options->op_tbl->objs[u].filter->filtn > 0) {
-						req_filter = 1;
-					}
-				}
-			}
-
-			/* check if layout change requested individual object */
-			if (options->layout_g != H5D_LAYOUT_ERROR) {
-				pack_info_t *pckinfo;
-				/* any dataset is specified */
-				if (options->op_tbl->nelems > 0) {
-					/* check if object exist */
-					pckinfo = options_get_object(travt->objs[i].name,
-							options->op_tbl);
-					if (pckinfo) {
-						req_obj_layout = 1;
-					}
-				}
-			}
-
-			/* early detection of references */
-			if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT))
-					< 0)
-				goto error;
-			if ((ftype_id = H5Dget_type(dset_in)) < 0)
-				goto error;
-			if (H5T_REFERENCE == H5Tget_class(ftype_id))
-				is_ref = 1;
-
-			/* Check if the datatype is committed */
-			if ((is_named = H5Tcommitted(ftype_id)) < 0)
-				goto error;
-			if (is_named)
-				if ((wtype_id = copy_named_datatype(ftype_id, fidout,
-						&named_dt_head, travt, options)) < 0)
-					goto error;
-
-			if (H5Tclose(ftype_id) < 0)
-				goto error;
-			if (H5Dclose(dset_in) < 0)
-				goto error;
-
-			/*-------------------------------------------------------------------------
-			 * check if we should use H5Ocopy or not
-			 * if there is a request for filters/layout, we read/write the object
-			 * otherwise we do a copy using H5Ocopy
-			 *-------------------------------------------------------------------------
-			 */
-			if (options->op_tbl->nelems || options->all_filter == 1
-					|| options->all_layout == 1 || is_ref || is_named) {
-
-				int j;
-
-				if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
-					goto error;
-				if ((f_space_id = H5Dget_space(dset_in)) < 0)
-					goto error;
-				if ((ftype_id = H5Dget_type(dset_in)) < 0)
-					goto error;
-				if ((dcpl_in = H5Dget_create_plist(dset_in)) < 0)
-					goto error;
-				if ((dcpl_out = H5Pcopy(dcpl_in)) < 0)
-					goto error;
-				if ((rank = H5Sget_simple_extent_ndims(f_space_id)) < 0)
-					goto error;
-				HDmemset(dims, 0, sizeof dims);
-				if (H5Sget_simple_extent_dims(f_space_id, dims, NULL) < 0)
-					goto error;
-
-				if (H5Dget_space_status(dset_in, &space_status) < 0)
-					goto error;
-
-				nelmts = 1;
-				for (j = 0; j < rank; j++)
-					nelmts *= dims[j];
-
-				/* wtype_id will have already been set if using a named dtype */
-				if (!is_named) {
-					if (options->use_native == 1)
-						wtype_id = h5tools_get_native_type(ftype_id);
-					else
-						wtype_id = H5Tcopy(ftype_id);
-				} /* end if */
-
-				if ((msize = H5Tget_size(wtype_id)) == 0)
-					goto error;
-
-				/* size of current dset */
-				size_dset = nelmts * msize;
-
-				/*-------------------------------------------------------------------------
-				 * check if the dataset creation property list has filters that
-				 * are not registered in the current configuration
-				 * 1) the external filters GZIP and SZIP might not be available
-				 * 2) the internal filters might be turned off
-				 *-------------------------------------------------------------------------
-				 */
-				if (h5tools_canreadf((travt->objs[i].name), dcpl_in) == 1) {
-					apply_s = 1;
-					apply_f = 1;
-
-					/*-------------------------------------------------------------------------
-					 * references are a special case
-					 * we cannot just copy the buffers, but instead we recreate the reference
-					 * in a second traversal of the output file
-					 *-------------------------------------------------------------------------
-					 */
-					if (H5T_REFERENCE != H5Tget_class(wtype_id)) {
-						/* get the storage size of the input dataset */
-						dsize_in = H5Dget_storage_size(dset_in);
-
-						/* check for small size datasets (less than 1k) except
-						 * changing to COMPACT. For the reference, COMPACT is limited
-						 * by size 64K by library.
-						 */
-						if (options->layout_g != H5D_COMPACT) {
-							if (size_dset < options->min_comp)
-								apply_s = 0;
-						}
-
-						/* apply the filter */
-						if (apply_s) {
-							if (apply_filters(travt->objs[i].name, rank, dims,
-									msize, dcpl_out, options, &has_filter) < 0)
-								goto error;
-						}
-
-						/* only if layout change requested for entire file or
-						 * individual obj */
-						if (options->all_layout > 0 || req_obj_layout == 1)
-							/*-------------------------------------------------
-							 * Unset the unlimited max dims if convert to other
-							 * than chunk layouts, because unlimited max dims
-							 * only can be applied to chunk layout.
-							 * Also perform only for targeted dataset
-							 * Also check for size limit to convert to compact
-							 *-------------------------------------------------*/
-							if (options->layout_g != H5D_CHUNKED) {
-								/* any dataset is specified */
-								if (options->op_tbl->nelems > 0) {
-									/* if current obj match specified obj */
-									if (options_get_object(travt->objs[i].name,
-											options->op_tbl))
-										limit_maxdims = TRUE;
-								}
-								else { /* no dataset is specified */
-									limit_maxdims = TRUE;
-								}
-
-								/* if convert to COMPACT */
-								if (options->layout_g == H5D_COMPACT) {
-									/* should be smaller than 64K */
-									if (size_dset > MAX_COMPACT_DSIZE)
-										limit_maxdims = FALSE;
-								}
-
-								/* unset unlimited max dims */
-								if (limit_maxdims)
-									H5Sset_extent_simple(f_space_id, rank, dims,
-											NULL);
-							}
-
-						/*-------------------------------------------------------------------------
-						 * create the output dataset;
-						 * disable error checking in case the dataset cannot be created with the
-						 * modified dcpl; in that case use the original instead
-						 *-------------------------------------------------------------------------
-						 */
-						H5E_BEGIN_TRY
-							{
-								dset_out = H5Dcreate2(fidout,
-										travt->objs[i].name, wtype_id,
-										f_space_id, H5P_DEFAULT, dcpl_out,
-										H5P_DEFAULT);
-							}H5E_END_TRY;
-
-						if (dset_out == FAIL) {
-							if (options->verbose)
-								printf(
-										" warning: could not create dataset <%s>. Applying original settings\n",
-										travt->objs[i].name);
-
-							if ((dset_out = H5Dcreate2(fidout,
-									travt->objs[i].name, wtype_id, f_space_id,
-									H5P_DEFAULT, dcpl_in, H5P_DEFAULT)) < 0)
-								goto error;
-							apply_f = 0;
-						}
-
-						/*-------------------------------------------------------------------------
-						 * read/write
-						 *-------------------------------------------------------------------------
-						 */
-						if (nelmts > 0 && space_status != H5D_SPACE_STATUS_NOT_ALLOCATED) {
-							size_t need = (size_t)(nelmts * msize); /* bytes needed */
-
-							/* have to read the whole dataset if there is only one element in the dataset */
-							if (need < H5TOOLS_MALLOCSIZE)
-								buf = HDmalloc(need);
-
-							if (buf != NULL) {
-								/* read/write: use the macro to check error, e.g. memory allocation error inside the library. */
-								CHECK_H5DRW_ERROR(H5Dread, dset_in, wtype_id,
-										H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-								CHECK_H5DRW_ERROR(H5Dwrite, dset_out, wtype_id,
-										H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-
-								/* Check if we have VL data in the dataset's
-								 * datatype that must be reclaimed */
-								if (TRUE == H5Tdetect_class(wtype_id, H5T_VLEN))
-									if (H5Dvlen_reclaim(wtype_id, f_space_id,
-											H5P_DEFAULT, buf) < 0)
-										goto error;
-							}
-							else { /* possibly not enough memory, read/write by hyperslabs */
-								size_t p_type_nbytes = msize; /*size of memory type */
-								hsize_t p_nelmts = nelmts; /*total elements */
-								hsize_t elmtno; /*counter  */
-								int carry; /*counter carry value */
-								unsigned int vl_data = 0; /*contains VL datatypes */
-
-								/* hyperslab info */
-								hsize_t hslab_dims[H5S_MAX_RANK]; /*hyperslab dims */
-								hsize_t hslab_nbytes; /*bytes per hyperslab */
-								hsize_t hslab_nelmts; /*elements per hyperslab*/
-								hid_t hslab_space; /*hyperslab data space */
-
-								/* hyperslab selection info */
-								hsize_t hs_sel_offset[H5S_MAX_RANK];/* selection offset */
-								hsize_t hs_sel_count[H5S_MAX_RANK]; /* selection count */
-								hsize_t hs_select_nelmts; /* selected elements */
-								hsize_t zero[8]; /*vector of zeros */
-								int k;
-								H5D_layout_t dset_layout;
-								hid_t dcpl_tmp = -1; /* dataset creation property list ID */
-
-								/* check if we have VL data in the dataset's datatype */
-								if (H5Tdetect_class(wtype_id, H5T_VLEN) == TRUE)
-									vl_data = TRUE;
-
-								/* check first if writing dataset is chunked,
-								 * if so use its chunk layout for better performance. */
-								dset_layout = H5Pget_layout(dcpl_out);
-								if (dset_layout == H5D_CHUNKED)
-									dcpl_tmp = dcpl_out; /* writing dataset */
-								else { /* if reading dataset is chunked */
-									dset_layout = H5Pget_layout(dcpl_in);
-									if (dset_layout == H5D_CHUNKED)
-										dcpl_tmp = dcpl_in; /* reading dataset */
-								}
-
-								/* get hyperslab dims and size in byte */
-								if (Get_hyperslab(dcpl_tmp, rank, dims,
-										p_type_nbytes, hslab_dims,
-										&hslab_nbytes) < 0)
-									goto error;
-
-								hslab_buf = HDmalloc((size_t)hslab_nbytes);
-
-								hslab_nelmts = hslab_nbytes / p_type_nbytes;
-								hslab_space = H5Screate_simple(1, &hslab_nelmts,
-										NULL);
-
-								/* the hyperslab selection loop */
-								HDmemset(hs_sel_offset, 0,
-										sizeof hs_sel_offset);
-								HDmemset(zero, 0, sizeof zero);
-
-								for (elmtno = 0; elmtno < p_nelmts; elmtno +=
-										hs_select_nelmts) {
-									if (rank > 0) {
-										/* calculate the hyperslab selections. The selection would be same as the hyperslab except for remaining edge portion of the dataset which is smaller then the hyperslab.
-										 */
-										for (k = 0, hs_select_nelmts = 1;
-												k < rank; k++) {
-											/* MIN() is used to get the remaining edge portion if exist.
-											 * "dims[k] - hs_sel_offset[k]" is remaining edge portion that is smaller then the hyperslab.*/
-											hs_sel_count[k] =
-													MIN(dims[k] - hs_sel_offset[k], hslab_dims[k]);
-											hs_select_nelmts *= hs_sel_count[k];
-										}
-
-										if (H5Sselect_hyperslab(f_space_id,
-												H5S_SELECT_SET, hs_sel_offset,
-												NULL, hs_sel_count, NULL) < 0)
-											goto error;
-										if (H5Sselect_hyperslab(hslab_space,
-												H5S_SELECT_SET, zero, NULL,
-												&hs_select_nelmts, NULL) < 0)
-											goto error;
-									}
-									else {
-										H5Sselect_all(f_space_id);
-										H5Sselect_all(hslab_space);
-										hs_select_nelmts = 1;
-									} /* rank */
-
-									/* read/write: use the macro to check error, e.g. memory allocation error inside the library. */
-									CHECK_H5DRW_ERROR(H5Dread, dset_in,
-											wtype_id, hslab_space, f_space_id,
-											H5P_DEFAULT, hslab_buf);
-									CHECK_H5DRW_ERROR(H5Dwrite, dset_out,
-											wtype_id, hslab_space, f_space_id,
-											H5P_DEFAULT, hslab_buf);
-
-									/* reclaim any VL memory, if necessary */
-									if (vl_data)
-										H5Dvlen_reclaim(wtype_id, hslab_space,
-												H5P_DEFAULT, hslab_buf);
-
-									/* calculate the next hyperslab offset */
-									for (k = rank, carry = 1; k > 0 && carry;
-											--k) {
-										hs_sel_offset[k - 1] += hs_sel_count[k
-												- 1];
-										/* if reached the end of a dim */
-										if (hs_sel_offset[k - 1] == dims[k - 1])
-											hs_sel_offset[k - 1] = 0;
-										else
-											carry = 0;
-									} /* k */
-								} /* elmtno */
-
-								H5Sclose(hslab_space);
-								/* free */
-								if (hslab_buf != NULL) {
-									HDfree(hslab_buf);
-									hslab_buf = NULL;
-								}
-							} /* hyperslab read */
-						} /* if (nelmts>0 && space_status==H5D_SPACE_STATUS_NOT_ALLOCATED) */
-
-						/*-------------------------------------------------------------------------
-						 * amount of compression used
-						 *-------------------------------------------------------------------------
-						 */
-						if (options->verbose) {
-							double ratio = 0;
-
-							/* only print the compression ration if there was a filter request */
-							if (apply_s && apply_f && req_filter) {
-								/* get the storage size of the output dataset */
-								dsize_out = H5Dget_storage_size(dset_out);
-
-								/* compression ratio = uncompressed size /  compressed size */
-								if (dsize_out != 0)
-									ratio = (double) dsize_in
-											/ (double) dsize_out;
-
-								print_dataset_info(dcpl_out,
-										travt->objs[i].name, ratio, 1);
-							}
-							else
-								print_dataset_info(dcpl_in, travt->objs[i].name,
-										ratio, 0);
-
-							/* print a message that the filter was not applied
-							 (in case there was a filter)
-							 */
-							if (has_filter && apply_s == 0)
-								printf(
-										" <warning: filter not applied to %s. dataset smaller than %d bytes>\n",
-										travt->objs[i].name,
-										(int) options->min_comp);
-
-							if (has_filter && apply_f == 0)
-								printf(
-										" <warning: could not apply the filter to %s>\n",
-										travt->objs[i].name);
-
-						} /* verbose */
-
-						/*-------------------------------------------------------------------------
-						 * copy attrs
-						 *-------------------------------------------------------------------------
-						 */
-						if (copy_attr(dset_in, dset_out, &named_dt_head, travt,
-								options) < 0)
-							goto error;
-						/*close */
-						if (H5Dclose(dset_out) < 0)
-							goto error;
-
-					}/*!H5T_REFERENCE*/
-				}/*h5tools_canreadf*/
-
-				/*-------------------------------------------------------------------------
-				 * close
-				 *-------------------------------------------------------------------------
-				 */
-				if (H5Tclose(ftype_id) < 0)
-					goto error;
-				if (H5Tclose(wtype_id) < 0)
-					goto error;
-				if (H5Pclose(dcpl_in) < 0)
-					goto error;
-				if (H5Pclose(dcpl_out) < 0)
-					goto error;
-				if (H5Sclose(f_space_id) < 0)
-					goto error;
-				if (H5Dclose(dset_in) < 0)
-					goto error;
-
-			}
-			/*-------------------------------------------------------------------------
-			 * we do not have request for filter/chunking use H5Ocopy instead
-			 *-------------------------------------------------------------------------
-			 */
-			else {
-				hid_t pid;
-
-				/* create property to pass copy options */
-				if ((pid = H5Pcreate(H5P_OBJECT_COPY)) < 0)
-					goto error;
-
-				/* set options for object copy */
-				if (H5Pset_copy_object(pid, H5O_COPY_WITHOUT_ATTR_FLAG) < 0)
-					goto error;
-
-				/*-------------------------------------------------------------------------
-				 * do the copy
-				 *-------------------------------------------------------------------------
-				 */
-
-				if (H5Ocopy(fidin, /* Source file or group identifier */
-				travt->objs[i].name, /* Name of the source object to be copied */
-				fidout, /* Destination file or group identifier  */
-				travt->objs[i].name, /* Name of the destination object  */
-				pid, /* Properties which apply to the copy   */
-				H5P_DEFAULT) < 0) /* Properties which apply to the new hard link */
-					goto error;
-
-				/* close property */
-				if (H5Pclose(pid) < 0)
-					goto error;
-
-				/*-------------------------------------------------------------------------
-				 * copy attrs manually
-				 *-------------------------------------------------------------------------
-				 */
-				if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT))
-						< 0)
-					goto error;
-				if ((dset_out = H5Dopen2(fidout, travt->objs[i].name,
-						H5P_DEFAULT)) < 0)
-					goto error;
-				if (copy_attr(dset_in, dset_out, &named_dt_head, travt, options)
-						< 0)
-					goto error;
-				if (H5Dclose(dset_in) < 0)
-					goto error;
-				if (H5Dclose(dset_out) < 0)
-					goto error;
-
-				if (options->verbose)
-					printf(FORMAT_OBJ, "dset", travt->objs[i].name);
-
-			} /* end do we have request for filter/chunking */
-
-			break;
-
-			/*-------------------------------------------------------------------------
-			 * H5TRAV_TYPE_NAMED_DATATYPE
-			 *-------------------------------------------------------------------------
-			 */
-		case H5TRAV_TYPE_NAMED_DATATYPE:
-
-			if (options->verbose)
-				printf(FORMAT_OBJ, "type", travt->objs[i].name);
-
-			if ((type_in = H5Topen2(fidin, travt->objs[i].name, H5P_DEFAULT))
-					< 0)
-				goto error;
-
-			/* Copy the datatype anonymously */
-			if ((type_out = copy_named_datatype(type_in, fidout, &named_dt_head,
-					travt, options)) < 0)
-				goto error;
-
-			/* Link in to group structure */
-			if (H5Lcreate_hard(type_out, ".", fidout, travt->objs[i].name,
-			H5P_DEFAULT, H5P_DEFAULT) < 0)
-				goto error;
-
-			/*-------------------------------------------------------------------------
-			 * copy attrs
-			 *-------------------------------------------------------------------------
-			 */
-			if (copy_attr(type_in, type_out, &named_dt_head, travt, options)
-					< 0)
-				goto error;
-
-			if (H5Tclose(type_in) < 0)
-				goto error;
-			if (H5Tclose(type_out) < 0)
-				goto error;
-
-			break;
-
-			/*-------------------------------------------------------------------------
-			 * H5TRAV_TYPE_LINK
-			 * H5TRAV_TYPE_UDLINK
-			 *
-			 * Only handles external links; H5Lcopy will fail for other UD link types
-			 * since we don't have creation or copy callbacks for them.
-			 *-------------------------------------------------------------------------
-			 */
-
-		case H5TRAV_TYPE_LINK:
-		case H5TRAV_TYPE_UDLINK: {
-
-			if (options->verbose)
-				printf(FORMAT_OBJ, "link", travt->objs[i].name);
-
-			if (H5Lcopy(fidin, travt->objs[i].name, fidout, travt->objs[i].name,
-					H5P_DEFAULT, H5P_DEFAULT) < 0)
-				goto error;
-
-			if (options->verbose)
-				printf(FORMAT_OBJ, "link", travt->objs[i].name);
-
-		}
-			break;
-
-		default:
-			goto error;
-		} /* switch */
-
-		/* free */
-		if (buf != NULL) {
-			HDfree(buf);
-			buf = NULL;
-		}
-
-	} /* i */
-
-	/* Finalize (link) the stack of named datatypes (if any) */
-	named_datatype_free(&named_dt_head, 0);
-
-	return 0;
-
-error:
-	H5E_BEGIN_TRY
-		{
-			H5Gclose(grp_in);
-			H5Gclose(grp_out);
-			H5Pclose(dcpl_in);
-			H5Pclose(gcpl_in);
-			H5Pclose(gcpl_out);
-			H5Sclose(f_space_id);
-			H5Dclose(dset_in);
-			H5Dclose(dset_out);
-			H5Tclose(ftype_id);
-			H5Tclose(wtype_id);
-			H5Tclose(type_in);
-			H5Tclose(type_out);
-			named_datatype_free(&named_dt_head, 1);
-		}H5E_END_TRY;
-	/* free */
-	if (buf != NULL)
-		HDfree(buf);
-	if (hslab_buf != NULL)
-		HDfree(hslab_buf);
-	return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: print_dataset_info
- *
- * Purpose: print name, filters, percentage compression of a dataset
- *
- *-------------------------------------------------------------------------
- */
-static void print_dataset_info(hid_t dcpl_id, char *objname, double ratio,
-		int pr) {
-	char strfilter[255];
-#if defined (PRINT_DEBUG )
-	char temp[255];
-#endif
-	int nfilters; /* number of filters */
-	unsigned filt_flags; /* filter flags */
-	H5Z_filter_t filtn; /* filter identification number */
-	unsigned cd_values[20]; /* filter client data values */
-	size_t cd_nelmts; /* filter client number of values */
-	char f_objname[256]; /* filter objname */
-	int i;
-
-	HDstrcpy(strfilter, "\0");
-
-	/* get information about input filters */
-	if ((nfilters = H5Pget_nfilters(dcpl_id)) < 0)
-		return;
-
-	for (i = 0; i < nfilters; i++) {
-		cd_nelmts = NELMTS(cd_values);
-
-		filtn = H5Pget_filter2(dcpl_id, (unsigned) i, &filt_flags, &cd_nelmts,
-				cd_values, sizeof(f_objname), f_objname, NULL);
-
-		switch (filtn) {
-
-		case H5Z_FILTER_NONE:
-			HDstrcat(strfilter, "NONE ");
-			break;
-
-		case H5Z_FILTER_DEFLATE:
-			HDstrcat(strfilter, "GZIP ");
-
-#if defined (PRINT_DEBUG)
-			{
-				unsigned level=cd_values[0];
-				sprintf(temp,"(%d)",level);
-				HDstrcat(strfilter,temp);
-			}
-#endif
-			break;
-
-		case H5Z_FILTER_SZIP:
-			HDstrcat(strfilter, "SZIP ");
-
-#if defined (PRINT_DEBUG)
-			{
-				unsigned options_mask=cd_values[0]; /* from dcpl, not filt*/
-				unsigned ppb=cd_values[1];
-				sprintf(temp,"(%d,",ppb);
-				HDstrcat(strfilter,temp);
-				if (options_mask & H5_SZIP_EC_OPTION_MASK)
-				HDstrcpy(temp,"EC) ");
-				else if (options_mask & H5_SZIP_NN_OPTION_MASK)
-				HDstrcpy(temp,"NN) ");
-			}
-			HDstrcat(strfilter,temp);
-
-#endif
-
-			break;
-
-		case H5Z_FILTER_SHUFFLE:
-			HDstrcat(strfilter, "SHUF ");
-			break;
-
-		case H5Z_FILTER_FLETCHER32:
-			HDstrcat(strfilter, "FLET ");
-			break;
-
-		case H5Z_FILTER_NBIT:
-			HDstrcat(strfilter, "NBIT ");
-			break;
-
-		case H5Z_FILTER_SCALEOFFSET:
-			HDstrcat(strfilter, "SCALEOFFSET ");
-			break;
-
-		default:
-			HDstrcat(strfilter, "UD ");
-			break;
-		} /* switch */
-	}/*i*/
-
-	if (!pr)
-		printf(FORMAT_OBJ, "dset", objname);
-	else {
-		char str[255], temp[28];
-		HDstrcpy(str, "dset     ");
-		HDstrcat(str, strfilter);
-		sprintf(temp, "  (%.3f:1)", ratio);
-		HDstrcat(str, temp);
-		printf(FORMAT_OBJ, str, objname);
-	}
-}
-
-/*-------------------------------------------------------------------------
- * Function: copy_user_block
- *
- * Purpose: copy user block from one file to another
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Peter Cao
- *
- * Date: October, 25, 2007
- *
- *-------------------------------------------------------------------------
- */
-static int copy_user_block(const char *infile, const char *outfile,
-		hsize_t size) {
-	int infid = -1, outfid = -1; /* File descriptors */
-	int status = 0; /* Return value */
-
-	/* User block must be any power of 2 equal to 512 or greater (512, 1024, 2048, etc.) */
-	HDassert(size > 0);
-
-	/* Open files */
-	if ((infid = HDopen(infile, O_RDONLY, 0)) < 0) {
-		status = -1;
-		goto done;
-	}
-	if ((outfid = HDopen(outfile, O_WRONLY, 0644)) < 0) {
-		status = -1;
-		goto done;
-	}
-
-	/* Copy the userblock from the input file to the output file */
-	while (size > 0) {
-		ssize_t nread, nbytes; /* # of bytes transfered, etc. */
-		char rbuf[USERBLOCK_XFER_SIZE]; /* Buffer for reading */
-		const char *wbuf; /* Pointer into buffer, for writing */
-
-		/* Read buffer from source file */
-		if (size > USERBLOCK_XFER_SIZE)
-			nread = HDread(infid, rbuf, (size_t)USERBLOCK_XFER_SIZE);
-		else
-			nread = HDread(infid, rbuf, (size_t)size);
-		if (nread < 0) {
-			status = -1;
-			goto done;
-		} /* end if */
-
-		/* Write buffer to destination file */
-		/* (compensating for interrupted writes & checking for errors, etc.) */
-		nbytes = nread;
-		wbuf = rbuf;
-		while (nbytes > 0) {
-			ssize_t nwritten; /* # of bytes written */
-
-			do {
-				nwritten = HDwrite(outfid, wbuf, (size_t)nbytes);
-			} while (-1 == nwritten && EINTR == errno);
-			if (-1 == nwritten) { /* error */
-				status = -1;
-				goto done;
-			} /* end if */
-			HDassert(nwritten > 0);
-			HDassert(nwritten <= nbytes);
-
-			/* Update # of bytes left & offset in buffer */
-			nbytes -= nwritten;
-			wbuf += nwritten;
-			HDassert(nbytes == 0 || wbuf < (rbuf + USERBLOCK_XFER_SIZE));
-		} /* end while */
-
-		/* Update size of userblock left to transfer */
-		size = size - (hsize_t) nread;
-	} /* end while */
-
-done:
-	if (infid > 0)
-		HDclose(infid);
-	if (outfid > 0)
-		HDclose(outfid);
-
-	return status;
-}
-
-/*-------------------------------------------------------------------------
- * Function: print_user_block
- *
- * Purpose: print user block
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente
- *
- * Date: August, 20, 2008
- *
- *-------------------------------------------------------------------------
- */
-#if defined (H5REPACK_DEBUG_USER_BLOCK)
-static
-void print_user_block(const char *filename, hid_t fid)
-{
-	int fh; /* file handle  */
-	hsize_t ub_size; /* user block size */
-	hsize_t size; /* size read */
-	hid_t fcpl; /* file creation property list ID for HDF5 file */
-	int i;
-
-	/* get user block size */
-	if(( fcpl = H5Fget_create_plist(fid)) < 0) {
-		error_msg("failed to retrieve file creation property list\n");
-		goto done;
-	}
-
-	if(H5Pget_userblock(fcpl, &ub_size) < 0) {
-		error_msg("failed to retrieve userblock size\n");
-		goto done;
-	}
-
-	if(H5Pclose(fcpl) < 0) {
-		error_msg("failed to close property list\n");
-		goto done;
-	}
-
-	/* open file */
-	if((fh = HDopen(filename, O_RDONLY, 0)) < 0) {
-		goto done;
-	}
-
-	size = ub_size;
-
-	/* read file */
-	while(size > 0) {
-		ssize_t nread; /* # of bytes read */
-		char rbuf[USERBLOCK_XFER_SIZE]; /* buffer for reading */
-
-		/* read buffer */
-		if(size > USERBLOCK_XFER_SIZE)
-			nread = HDread(fh, rbuf, (size_t)USERBLOCK_XFER_SIZE);
-		else
-			nread = HDread(fh, rbuf, (size_t)size);
-
-		for(i = 0; i < nread; i++) {
-
-			printf("%c ", rbuf[i]);
-
-		}
-		printf("\n");
-
-		if(nread < 0) {
-			goto done;
-		}
-
-		/* update size of userblock left to transfer */
-		size -= nread;
-	}
-
-done:
-	if(fh > 0)
-		HDclose(fh);
-
-	return;
-}
-#endif
-
diff --git a/tools/h5repack/h5repack_filters.c b/tools/h5repack/h5repack_filters.c
deleted file mode 100644
index 56e08ef..0000000
--- a/tools/h5repack/h5repack_filters.c
+++ /dev/null
@@ -1,490 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* number of members in an array */
-#ifndef NELMTS
-#    define NELMTS(X)    (sizeof(X)/sizeof(X[0]))
-#endif
-
-/* minimum of two values */
-#undef MIN
-#define MIN(a,b)    (((a)<(b)) ? (a) : (b))
-
-/*-------------------------------------------------------------------------
- * Function: aux_find_obj
- *
- * Purpose: find the object name NAME (got from the traverse list)
- *  in the repack options list
- *
- *-------------------------------------------------------------------------
- */
-static
-int aux_find_obj(const char* name,          /* object name from traverse list */
-                 pack_opt_t *options,       /* repack options */
-                 pack_info_t *obj /*OUT*/)  /* info about object to filter */
-{
- char *pdest;
- int  result;
- unsigned int  i;
-
- for ( i=0; i<options->op_tbl->nelems; i++)
- {
-     if (HDstrcmp(options->op_tbl->objs[i].path,name)==0)
-     {
-         *obj =  options->op_tbl->objs[i];
-         return i;
-     }
-
-     pdest  = HDstrstr(name,options->op_tbl->objs[i].path);
-     result = (int)(pdest - name);
-
-     /* found at position 1, meaning without '/' */
-     if( pdest != NULL && result==1 )
-     {
-         *obj =  options->op_tbl->objs[i];
-         return i;
-     }
- }/*i*/
-
- return -1;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: aux_assign_obj
- *
- * Purpose: find the object name NAME (got from the traverse list)
- *  in the repack options list; assign the filter information OBJ
- *
- * Return: 0 not found, 1 found
- *
- *-------------------------------------------------------------------------
- */
-static
-int aux_assign_obj(const char* name,            /* object name from traverse list */
-                   pack_opt_t *options,         /* repack options */
-                   pack_info_t *obj /*OUT*/)    /* info about object to filter */
-{
-
-    int  idx, i;
-    pack_info_t tmp;
-
-    init_packobject(&tmp);
-
-    idx = aux_find_obj(name,options,&tmp);
-
-    /* name was on input */
-    if (idx>=0)
-    {
-
-
-        /* applying to all objects */
-        if (options->all_layout)
-        {
-            /* assign the global layout info to the OBJ info */
-            tmp.layout=options->layout_g;
-            switch (options->layout_g)
-            {
-            case H5D_CHUNKED:
-                tmp.chunk.rank=options->chunk_g.rank;
-                for ( i=0; i<tmp.chunk.rank; i++)
-                    tmp.chunk.chunk_lengths[i]=options->chunk_g.chunk_lengths[i];
-                break;
-            case H5D_LAYOUT_ERROR:
-            case H5D_COMPACT:
-            case H5D_CONTIGUOUS:
-            case H5D_NLAYOUTS:
-                break;
-            default:
-                break;
-            }/*switch*/
-        }
-        else
-        {
-            tmp.layout = options->op_tbl->objs[idx].layout;
-            switch (tmp.layout)
-            {
-            case H5D_CHUNKED:
-                tmp.chunk.rank = options->op_tbl->objs[idx].chunk.rank;
-                for ( i=0; i<tmp.chunk.rank; i++)
-                    tmp.chunk.chunk_lengths[i]=options->op_tbl->objs[idx].chunk.chunk_lengths[i];
-                break;
-            case H5D_LAYOUT_ERROR:
-            case H5D_COMPACT:
-            case H5D_CONTIGUOUS:
-            case H5D_NLAYOUTS:
-                break;
-            default:
-                break;
-            }/*switch*/
-
-        }
-
-        /* applying to all objects */
-        if (options->all_filter)
-        {
-            /* assign the global filter */
-            tmp.nfilters=1;
-            tmp.filter[0]=options->filter_g[0];
-        } /* if all */
-        else
-        {
-            tmp.nfilters=options->op_tbl->objs[idx].nfilters;
-            for ( i=0; i<tmp.nfilters; i++)
-            {
-                tmp.filter[i] = options->op_tbl->objs[idx].filter[i];
-            }
-        }
-
-
-    } /* if idx */
-
-
-    /* no input name */
-
-    else
-    {
-
-        if (options->all_filter)
-        {
-            int k;
-
-            /* assign the global filters */
-            tmp.nfilters=options->n_filter_g;
-            for ( k = 0; k < options->n_filter_g; k++)
-                tmp.filter[k]=options->filter_g[k];
-        }
-        if (options->all_layout)
-        {
-            /* assign the global layout info to the OBJ info */
-            tmp.layout=options->layout_g;
-            switch (options->layout_g)
-            {
-            case H5D_CHUNKED:
-                tmp.chunk.rank=options->chunk_g.rank;
-                for ( i=0; i<tmp.chunk.rank; i++)
-                    tmp.chunk.chunk_lengths[i]=options->chunk_g.chunk_lengths[i];
-                break;
-            case H5D_LAYOUT_ERROR:
-            case H5D_COMPACT:
-            case H5D_CONTIGUOUS:
-            case H5D_NLAYOUTS:
-                break;
-            default:
-                break;
-            }/*switch*/
-        }
-    }
-
-    *obj = tmp;
-    return 1;
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: apply_filters
- *
- * Purpose: apply the filters in the object to the property list;
- *  do extra checking in the case of SZIP; delete all filters in the case
- *  of H5Z_FILTER_NONE present in the PACK_INFO_T filter array
- *
- * Return: 0 success, -1 an error occured
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: December 19, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int apply_filters(const char* name,    /* object name from traverse list */
-                  int rank,            /* rank of dataset */
-                  hsize_t *dims,       /* dimensions of dataset */
-                  size_t msize,        /* size of type */
-                  hid_t dcpl_id,       /* dataset creation property list */
-                  pack_opt_t *options, /* repack options */
-                  int *has_filter)     /* (OUT) object NAME has a filter */
-
-
-{
-    int          nfilters;       /* number of filters in DCPL */
-    hsize_t      chsize[64];     /* chunk size in elements */
-    H5D_layout_t layout;
-    int          i;
-    pack_info_t  obj;
-
-    *has_filter = 0;
-
-    if (rank==0) /* scalar dataset, do not apply */
-        return 0;
-
-   /*-------------------------------------------------------------------------
-    * initialize the assigment object
-    *-------------------------------------------------------------------------
-    */
-    init_packobject(&obj);
-
-   /*-------------------------------------------------------------------------
-    * find options
-    *-------------------------------------------------------------------------
-    */
-    if (aux_assign_obj(name,options,&obj)==0)
-        return 0;
-
-    /* get information about input filters */
-    if ((nfilters = H5Pget_nfilters(dcpl_id))<0)
-        return -1;
-
-   /*-------------------------------------------------------------------------
-    * check if we have filters in the pipeline
-    * we want to replace them with the input filters
-    * only remove if we are inserting new ones
-    *-------------------------------------------------------------------------
-    */
-    if (nfilters && obj.nfilters )
-    {
-        *has_filter = 1;
-        if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
-            return -1;
-    }
-
-   /*-------------------------------------------------------------------------
-    * check if there is an existent chunk
-    * read it only if there is not a requested layout
-    *-------------------------------------------------------------------------
-    */
-    if (obj.layout == -1 )
-    {
-        if ((layout = H5Pget_layout(dcpl_id))<0)
-            return -1;
-
-        if (layout == H5D_CHUNKED)
-        {
-            if ((rank = H5Pget_chunk(dcpl_id,NELMTS(chsize),chsize/*out*/))<0)
-                return -1;
-            obj.layout = H5D_CHUNKED;
-            obj.chunk.rank = rank;
-            for ( i = 0; i < rank; i++)
-                obj.chunk.chunk_lengths[i] = chsize[i];
-        }
-    }
-
-    /*-------------------------------------------------------------------------
-    * the type of filter and additional parameter
-    * type can be one of the filters
-    * H5Z_FILTER_NONE        0 , uncompress if compressed
-    * H5Z_FILTER_DEFLATE     1 , deflation like gzip
-    * H5Z_FILTER_SHUFFLE     2 , shuffle the data
-    * H5Z_FILTER_FLETCHER32  3 , fletcher32 checksum of EDC
-    * H5Z_FILTER_SZIP        4 , szip compression
-    * H5Z_FILTER_NBIT        5 , nbit compression
-    * H5Z_FILTER_SCALEOFFSET 6 , scaleoffset compression
-    *-------------------------------------------------------------------------
-    */
-
-    if (obj.nfilters)
-    {
-
-   /*-------------------------------------------------------------------------
-    * filters require CHUNK layout; if we do not have one define a default
-    *-------------------------------------------------------------------------
-    */
-        if (obj.layout==-1)
-        {
-
-            /* stripmine info */
-            hsize_t sm_size[H5S_MAX_RANK]; /*stripmine size */
-            hsize_t sm_nbytes;             /*bytes per stripmine */
-
-            obj.chunk.rank = rank;
-
-            /*
-            * determine the strip mine size. The strip mine is
-            * a hyperslab whose size is manageable.
-            */
-
-
-
-            sm_nbytes = msize;
-            for ( i = rank; i > 0; --i)
-            {
-                hsize_t size = H5TOOLS_BUFSIZE / sm_nbytes;
-                if ( size == 0) /* datum size > H5TOOLS_BUFSIZE */
-                    size = 1;
-                sm_size[i - 1] = MIN(dims[i - 1], size);
-                sm_nbytes *= sm_size[i - 1];
-                HDassert(sm_nbytes > 0);
-
-            }
-
-            for ( i = 0; i < rank; i++)
-            {
-                obj.chunk.chunk_lengths[i] = sm_size[i];
-            }
-
-        }
-
-        for ( i=0; i<obj.nfilters; i++)
-        {
-            switch (obj.filter[i].filtn)
-            {
-
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_NONE       0 , uncompress if compressed
-             *-------------------------------------------------------------------------
-             */
-            case H5Z_FILTER_NONE:
-            	break;
-
-           /*-------------------------------------------------------------------------
-            * H5Z_FILTER_DEFLATE       1 , deflation like gzip
-            *-------------------------------------------------------------------------
-            */
-            case H5Z_FILTER_DEFLATE:
-                {
-                    unsigned     aggression;     /* the deflate level */
-
-                    aggression = obj.filter[i].cd_values[0];
-                    /* set up for deflated data */
-                    if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                        return -1;
-                    if(H5Pset_deflate(dcpl_id,aggression)<0)
-                        return -1;
-                }
-                break;
-
-           /*-------------------------------------------------------------------------
-            * H5Z_FILTER_SZIP       4 , szip compression
-            *-------------------------------------------------------------------------
-            */
-            case H5Z_FILTER_SZIP:
-                {
-                    unsigned  options_mask;
-                    unsigned  pixels_per_block;
-
-                    options_mask     = obj.filter[i].cd_values[0];
-                    pixels_per_block = obj.filter[i].cd_values[1];
-
-                    /* set up for szip data */
-                    if(H5Pset_chunk(dcpl_id,obj.chunk.rank,obj.chunk.chunk_lengths)<0)
-                        return -1;
-                    if (H5Pset_szip(dcpl_id,options_mask,pixels_per_block)<0)
-                        return -1;
-
-                }
-                break;
-
-           /*-------------------------------------------------------------------------
-            * H5Z_FILTER_SHUFFLE    2 , shuffle the data
-            *-------------------------------------------------------------------------
-            */
-            case H5Z_FILTER_SHUFFLE:
-                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                    return -1;
-                if (H5Pset_shuffle(dcpl_id)<0)
-                    return -1;
-                break;
-
-           /*-------------------------------------------------------------------------
-            * H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC
-            *-------------------------------------------------------------------------
-            */
-            case H5Z_FILTER_FLETCHER32:
-                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                    return -1;
-                if (H5Pset_fletcher32(dcpl_id)<0)
-                    return -1;
-                break;
-           /*----------- -------------------------------------------------------------
-            * H5Z_FILTER_NBIT , NBIT compression
-            *-------------------------------------------------------------------------
-            */
-            case H5Z_FILTER_NBIT:
-                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                    return -1;
-                if (H5Pset_nbit(dcpl_id)<0)
-                    return -1;
-                break;
-            /*----------- -------------------------------------------------------------
-             * H5Z_FILTER_SCALEOFFSET , scale+offset compression
-             *-------------------------------------------------------------------------
-             */
-
-            case H5Z_FILTER_SCALEOFFSET:
-                {
-                    H5Z_SO_scale_type_t scale_type;
-                    int                 scale_factor;
-
-                    scale_type   = (H5Z_SO_scale_type_t)obj.filter[i].cd_values[0];
-                    scale_factor = obj.filter[i].cd_values[1];
-
-                    if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                        return -1;
-                    if (H5Pset_scaleoffset(dcpl_id,scale_type,scale_factor)<0)
-                        return -1;
-                }
-                break;
-            default:
-            	{
-            		if (H5Pset_filter (dcpl_id, obj.filter[i].filtn, H5Z_FLAG_MANDATORY, obj.filter[i].cd_nelmts, obj.filter[i].cd_values)<0)
-                		return -1;
-            		if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-            			return -1;
-            	}
-                break;
-            } /* switch */
-        }/*i*/
-
-    }
-    /*obj.nfilters*/
-
-    /*-------------------------------------------------------------------------
-    * layout
-    *-------------------------------------------------------------------------
-    */
-
-    if (obj.layout>=0)
-    {
-        /* a layout was defined */
-        if (H5Pset_layout(dcpl_id, obj.layout)<0)
-            return -1;
-
-        if (H5D_CHUNKED == obj.layout)
-        {
-            if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
-                return -1;
-        }
-        else if (H5D_COMPACT == obj.layout)
-        {
-            if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY)<0)
-                return -1;
-        }
-        /* remove filters for the H5D_CONTIGUOUS case */
-        else if (H5D_CONTIGUOUS == obj.layout)
-        {
-            if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
-                return -1;
-        }
-
-    }
-
- return 0;
-}
-
diff --git a/tools/h5repack/h5repack_main.c b/tools/h5repack/h5repack_main.c
deleted file mode 100644
index 708c173..0000000
--- a/tools/h5repack/h5repack_main.c
+++ /dev/null
@@ -1,619 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5repack.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5repack"
-
-static int parse_command_line(int argc, const char **argv, pack_opt_t* options);
-static void leave(int ret) H5_ATTR_NORETURN;
-
-
-/* module-scoped variables */
-static int has_i_o = 0;
-const char *infile = NULL;
-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:S:T:";
-static struct long_options l_opts[] = {
-	{ "help", no_arg, 'h' },
-	{ "version", no_arg, 'V' },
-	{ "verbose", no_arg, 'v' },
-	{ "filter", require_arg, 'f' },
-	{ "layout", require_arg, 'l' },
-	{ "minimum", require_arg, 'm' },
-	{ "file", require_arg, 'e' },
-	{ "native", no_arg, 'n' },
-	{ "latest", no_arg, 'L' },
-	{ "compact", require_arg, 'c' },
-	{ "indexed", require_arg, 'd' },
-	{ "ssize", require_arg, 's' },
-	{ "ublock", require_arg, 'u' },
-	{ "block", require_arg, 'b' },
-	{ "metadata_block_size", require_arg, 'M' },
-	{ "threshold", require_arg, 't' },
-	{ "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' }
-};
-
-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: print usage
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-static void usage(const char *prog) {
-	printf("usage: %s [OPTIONS] file1 file2\n", prog);
-	printf("  file1                    Input HDF5 File\n");
-	printf("  file2                    Output HDF5 File\n");
-	printf("  OPTIONS\n");
-	printf("   -h, --help              Print a usage message and exit\n");
-	printf("   -v, --verbose           Verbose mode, print object information\n");
-	printf("   -V, --version           Print version number and exit\n");
-	printf("   -n, --native            Use a native HDF5 type when repacking\n");
-	printf("   -L, --latest            Use latest version of file format\n");
-	printf("   -c L1, --compact=L1     Maximum number of links in header messages\n");
-	printf("   -d L2, --indexed=L2     Minimum number of links in the indexed format\n");
-	printf("   -s S[:F], --ssize=S[:F] Shared object header message minimum size\n");
-	printf("   -m M, --minimum=M       Do not apply the filter to datasets smaller than M\n");
-	printf("   -e E, --file=E          Name of file E with the -f and -l options\n");
-	printf("   -u U, --ublock=U        Name of file U with user block data to be added\n");
-	printf("   -b B, --block=B         Size of user block to be added\n");
-	printf("   -M A, --metadata_block_size=A  Metadata block size for H5Pset_meta_block_size\n");
-	printf("   -t T, --threshold=T     Threshold value for H5Pset_alignment\n");
-	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");
-	printf("    S - is an integer\n");
-	printf("    U - is a filename.\n");
-	printf("    T - is an integer\n");
-	printf("    A - is an integer greater than zero\n");
-	printf("    B - is the user block size, any value that is 512 or greater and is\n");
-	printf("        a power of 2 (1024 default)\n");
-	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");
-	printf("\n");
-	printf("      <list of objects> is a comma separated list of object names, meaning apply\n");
-	printf("        compression only to those objects. If no names are specified, the filter\n");
-	printf("        is applied to all objects\n");
-	printf("      <name of filter> can be:\n");
-	printf("        GZIP, to apply the HDF5 GZIP filter (GZIP compression)\n");
-	printf("        SZIP, to apply the HDF5 SZIP filter (SZIP compression)\n");
-	printf("        SHUF, to apply the HDF5 shuffle filter\n");
-	printf("        FLET, to apply the HDF5 checksum filter\n");
-	printf("        NBIT, to apply the HDF5 NBIT filter (NBIT compression)\n");
-	printf("        SOFF, to apply the HDF5 Scale/Offset filter\n");
-	printf("        UD,   to apply a user defined filter\n");
-	printf("        NONE, to remove all filters\n");
-	printf("      <filter parameters> is optional filter parameter information\n");
-	printf("        GZIP=<deflation level> from 1-9\n");
-	printf("        SZIP=<pixels per block,coding> pixels per block is a even number in\n");
-	printf("            2-32 and coding method is either EC or NN\n");
-	printf("        SHUF (no parameter)\n");
-	printf("        FLET (no parameter)\n");
-	printf("        NBIT (no parameter)\n");
-	printf("        SOFF=<scale_factor,scale_type> scale_factor is an integer and scale_type\n");
-	printf("            is either IN or DS\n");
-	printf("        UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>\n");
-	printf("            required values for filter_number,cd_value_count,value_1\n");
-	printf("            optional values for value_2 to value_N\n");
-	printf("        NONE (no parameter)\n");
-	printf("\n");
-	printf("    LAYT - is a string with the format:\n");
-	printf("\n");
-	printf("      <list of objects>:<layout type>=<layout parameters>\n");
-	printf("\n");
-	printf("      <list of objects> is a comma separated list of object names, meaning that\n");
-	printf("        layout information is supplied for those objects. If no names are\n");
-	printf("        specified, the layout type is applied to all objects\n");
-	printf("      <layout type> can be:\n");
-	printf("        CHUNK, to apply chunking layout\n");
-	printf("        COMPA, to apply compact layout\n");
-	printf("        CONTI, to apply contiguous layout\n");
-	printf("      <layout parameters> is optional layout information\n");
-	printf("        CHUNK=DIM[xDIM...xDIM], the chunk size of each dimension\n");
-	printf("        COMPA (no parameter)\n");
-	printf("        CONTI (no parameter)\n");
-	printf("\n");
-	printf("Examples of use:\n");
-	printf("\n");
-	printf("1) h5repack -v -f GZIP=1 file1 file2\n");
-	printf("\n");
-	printf("   GZIP compression with level 1 to all objects\n");
-	printf("\n");
-	printf("2) h5repack -v -f dset1:SZIP=8,NN file1 file2\n");
-	printf("\n");
-	printf("   SZIP compression with 8 pixels per block and NN coding method to object dset1\n");
-	printf("\n");
-	printf("3) h5repack -v -l dset1,dset2:CHUNK=20x10 -f dset3,dset4,dset5:NONE file1 file2\n");
-	printf("\n");
-	printf("   Chunked layout, with a layout size of 20x10, to objects dset1 and dset2\n");
-	printf("   and remove filters to objects dset3, dset4, dset5\n");
-	printf("\n");
-	printf("4) h5repack -L -c 10 -s 20:dtype file1 file2 \n");
-	printf("\n");
-	printf("   Using latest file format with maximum compact group size of 10 and\n");
-	printf("   and minimum shared datatype size of 20\n");
-	printf("\n");
-	printf("5) h5repack -f SHUF -f GZIP=1 file1 file2 \n");
-	printf("\n");
-	printf("   Add both filters SHUF and GZIP in this order to all datasets\n");
-	printf("\n");
-	printf("6) h5repack -f UD=307,1,9 file1 file2 \n");
-	printf("\n");
-	printf("   Add bzip2 filter to all datasets\n");
-	printf("\n");
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:    leave
- *
- * Purpose:     Shutdown MPI & HDF5 and call exit()
- *
- * Return:      Does not return
- *
- * Programmer:  Quincey Koziol
- *              Saturday, 31. January 2004
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void leave(int ret) {
-	h5tools_close();
-
-	HDexit(ret);
-}
-
-/*-------------------------------------------------------------------------
- * Function: read_info
- *
- * Purpose: read comp and chunk options from a file
- *
- * Return: void, exit on error
- *
- * Programmer: pvn at ncsa.uiuc.edu
- *
- * Date: September, 22, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static
-int read_info(const char *filename, pack_opt_t *options) {
-
-	char stype[10];
-	char comp_info[1024];
-	FILE *fp = NULL;
-	char c;
-	int i, rc = 1;
-	int ret_value = EXIT_SUCCESS;
-
-	if ((fp = HDfopen(filename, "r")) == (FILE *) NULL) {
-		error_msg("cannot open options file %s\n", filename);
-		h5tools_setstatus(EXIT_FAILURE);
-		ret_value = EXIT_FAILURE;
-		goto done;
-	}
-
-	/* cycle until end of file reached */
-	while (1) {
-		rc = fscanf(fp, "%s", stype);
-		if (rc == -1)
-			break;
-
-		/*-------------------------------------------------------------------------
-		 * filter
-		 *-------------------------------------------------------------------------
-		 */
-		if (HDstrcmp(stype,"-f") == 0) {
-			/* find begining of info */
-			i = 0;
-			c = '0';
-			while (c != ' ') {
-				fscanf(fp, "%c", &c);
-				if (HDfeof(fp))
-					break;
-			}
-			c = '0';
-			/* go until end */
-			while (c != ' ') {
-				fscanf(fp, "%c", &c);
-				comp_info[i] = c;
-				i++;
-				if (HDfeof(fp))
-					break;
-				if (c == 10 /*eol*/)
-					break;
-			}
-			comp_info[i - 1] = '\0'; /*cut the last " */
-
-			if (h5repack_addfilter(comp_info, options) == -1) {
-				error_msg("could not add compression option\n");
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = EXIT_FAILURE;
-				goto done;
-			}
-		}
-		/*-------------------------------------------------------------------------
-		 * layout
-		 *-------------------------------------------------------------------------
-		 */
-		else if (HDstrcmp(stype,"-l") == 0) {
-
-			/* find begining of info */
-			i = 0;
-			c = '0';
-			while (c != ' ') {
-				fscanf(fp, "%c", &c);
-				if (HDfeof(fp))
-					break;
-			}
-			c = '0';
-			/* go until end */
-			while (c != ' ') {
-				fscanf(fp, "%c", &c);
-				comp_info[i] = c;
-				i++;
-				if (HDfeof(fp))
-					break;
-				if (c == 10 /*eol*/)
-					break;
-			}
-			comp_info[i - 1] = '\0'; /*cut the last " */
-
-			if (h5repack_addlayout(comp_info, options) == -1) {
-				error_msg("could not add chunck option\n");
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = EXIT_FAILURE;
-				goto done;
-			}
-		}
-		/*-------------------------------------------------------------------------
-		 * not valid
-		 *-------------------------------------------------------------------------
-		 */
-		else {
-			error_msg("bad file format for %s", filename);
-			h5tools_setstatus(EXIT_FAILURE);
-			ret_value = EXIT_FAILURE;
-			goto done;
-		}
-	}
-
-done:
-	if (fp)
-		HDfclose(fp);
-
-	return ret_value;
-}
-
-/*-------------------------------------------------------------------------
- * Function: parse_command_line
- *
- * Purpose: parse command line input
- *
- *-------------------------------------------------------------------------
- */
-
-static
-int parse_command_line(int argc, const char **argv, pack_opt_t* options) {
-
-	int opt;
-	int ret_value = 0;
-
-	/* parse command line options */
-	while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
-		switch ((char) opt) {
-
-		/* -i for backward compability */
-		case 'i':
-			infile = opt_arg;
-			has_i_o = 1;
-			break;
-
-		/* -o for backward compability */
-		case 'o':
-			outfile = opt_arg;
-			has_i_o = 1;
-			break;
-
-		case 'h':
-			usage(h5tools_getprogname());
-			h5tools_setstatus(EXIT_SUCCESS);
-			ret_value = -1;
-			goto done;
-
-		case 'V':
-			print_version(h5tools_getprogname());
-			h5tools_setstatus(EXIT_SUCCESS);
-			ret_value = -1;
-			goto done;
-
-		case 'v':
-			options->verbose = 1;
-			break;
-
-		case 'f':
-			/* parse the -f filter option */
-			if (h5repack_addfilter(opt_arg, options) < 0) {
-				error_msg("in parsing filter\n");
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = -1;
-				goto done;
-			}
-			break;
-
-		case 'l':
-			/* parse the -l layout option */
-			if (h5repack_addlayout(opt_arg, options) < 0) {
-				error_msg("in parsing layout\n");
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = -1;
-				goto done;
-			}
-			break;
-
-		case 'm':
-			options->min_comp = HDatoi( opt_arg );
-			if ((int) options->min_comp <= 0) {
-				error_msg("invalid minimum compress size <%s>\n", opt_arg);
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = -1;
-				goto done;
-			}
-			break;
-
-		case 'e':
-			ret_value = read_info(opt_arg, options);
-			if (ret_value < 0)
-				goto done;
-			break;
-
-		case 'n':
-			options->use_native = 1;
-			break;
-
-		case 'L':
-			options->latest = TRUE;
-			break;
-
-		case 'c':
-			options->grp_compact = HDatoi( opt_arg );
-			if (options->grp_compact > 0)
-				options->latest = TRUE; /* must use latest format */
-			break;
-
-		case 'd':
-			options->grp_indexed = HDatoi( opt_arg );
-			if (options->grp_indexed > 0)
-				options->latest = TRUE; /* must use latest format */
-			break;
-
-		case 's':
-			{
-				int idx = 0;
-				int ssize = 0;
-				char *msgPtr = HDstrchr( opt_arg, ':');
-				options->latest = TRUE; /* must use latest format */
-				if (msgPtr == NULL) {
-					ssize = HDatoi( opt_arg );
-					for (idx = 0; idx < 5; idx++)
-						options->msg_size[idx] = ssize;
-				}
-				else {
-					char msgType[10];
-					HDstrcpy(msgType, msgPtr + 1);
-					msgPtr[0] = '\0';
-					ssize = HDatoi( opt_arg );
-					if (HDstrncmp(msgType, "dspace",6) == 0) {
-						options->msg_size[0] = ssize;
-					}
-					else if (HDstrncmp(msgType, "dtype", 5) == 0) {
-						options->msg_size[1] = ssize;
-					}
-					else if (HDstrncmp(msgType, "fill", 4) == 0) {
-						options->msg_size[2] = ssize;
-					}
-					else if (HDstrncmp(msgType, "pline", 5) == 0) {
-						options->msg_size[3] = ssize;
-					}
-					else if (HDstrncmp(msgType, "attr", 4) == 0) {
-						options->msg_size[4] = ssize;
-					}
-				}
-			}
-			break;
-
-		case 'u':
-			options->ublock_filename = opt_arg;
-			break;
-
-		case 'b':
-			options->ublock_size = (hsize_t) HDatol( opt_arg );
-			break;
-
-		case 'M':
-			options->meta_block_size = (hsize_t) HDatol( opt_arg );
-			break;
-
-		case 't':
-			options->threshold = (hsize_t) HDatol( opt_arg );
-			break;
-
-		case 'a':
-			options->alignment = HDatol( opt_arg );
-			if (options->alignment < 1) {
-				error_msg("invalid alignment size\n", opt_arg);
-				h5tools_setstatus(EXIT_FAILURE);
-				ret_value = -1;
-				goto done;
-			}
-			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 */
-
-	} /* while */
-
-	if (has_i_o == 0) {
-		/* check for file names to be processed */
-		if (argc <= opt_ind || argv[opt_ind + 1] == NULL) {
-			error_msg("missing file names\n");
-			usage(h5tools_getprogname());
-			h5tools_setstatus(EXIT_FAILURE);
-			ret_value = -1;
-		}
-	}
-
-done:
-	return ret_value;
-}
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: h5repack main program
- *
- * Return: Success: EXIT_SUCCESS(0)
- *
- * Failure: EXIT_FAILURE(1)
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: May 9, 2003
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
-int main(int argc, const char **argv) {
-
-	pack_opt_t options; /*the global options */
-
-	h5tools_setprogname(PROGRAMNAME);
-	h5tools_setstatus(EXIT_SUCCESS);
-
-	/* Initialize h5tools lib */
-	h5tools_init();
-
-	/* update hyperslab buffer size from H5TOOLS_BUFSIZE env if exist */
-	if (h5tools_getenv_update_hyperslab_bufsize() < 0) {
-		h5tools_setstatus(EXIT_FAILURE);
-		goto done;
-	}
-
-	/* initialize options  */
-	h5repack_init(&options, 0, FALSE, H5F_FILE_SPACE_DEFAULT, (hsize_t) 0);
-
-	if (parse_command_line(argc, argv, &options) < 0)
-		goto done;
-
-	/* get file names if they were not yet got */
-	if (has_i_o == 0) {
-
-		if (argv[opt_ind] != NULL && argv[opt_ind + 1] != NULL) {
-			infile = argv[opt_ind];
-			outfile = argv[opt_ind + 1];
-
-			if ( HDstrcmp( infile, outfile ) == 0) {
-				error_msg("file names cannot be the same\n");
-				usage(h5tools_getprogname());
-				h5tools_setstatus(EXIT_FAILURE);
-				goto done;
-			}
-		}
-		else {
-			error_msg("file names missing\n");
-			usage(h5tools_getprogname());
-			h5tools_setstatus(EXIT_FAILURE);
-			goto done;
-		}
-	}
-
-	/* pack it */
-	h5tools_setstatus(h5repack(infile, outfile, &options));
-
-done:
-	/* free tables */
-	h5repack_end(&options);
-
-	leave(h5tools_getstatus());
-}
-
diff --git a/tools/h5repack/h5repack_opttable.c b/tools/h5repack/h5repack_opttable.c
deleted file mode 100644
index b54e887..0000000
--- a/tools/h5repack/h5repack_opttable.c
+++ /dev/null
@@ -1,369 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/*-------------------------------------------------------------------------
- * Function: init_packobject
- *
- * Purpose: initialize a pack_info_t structure
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-
-void init_packobject(pack_info_t *obj) {
-	int j, k;
-
-	HDstrcpy(obj->path, "\0");
-	for (j = 0; j < H5_REPACK_MAX_NFILTERS; j++) {
-		obj->filter[j].filtn = -1;
-		for (k = 0; k < CD_VALUES; k++)
-			obj->filter[j].cd_values[k] = 0;
-	}
-	obj->chunk.rank = -1;
-	obj->refobj_id = -1;
-	obj->layout = H5D_LAYOUT_ERROR;
-	obj->nfilters = 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: aux_tblinsert_filter
- *
- * Purpose: auxiliary function, inserts the filter in object OBJS[ I ]
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-
-static void aux_tblinsert_filter(pack_opttbl_t *table, unsigned int I,
-		filter_info_t filt) {
-	if (table->objs[I].nfilters < H5_REPACK_MAX_NFILTERS) {
-		table->objs[I].filter[table->objs[I].nfilters++] = filt;
-	}
-	else {
-		error_msg(
-				"cannot insert the filter in this object.\
-        Maximum capacity exceeded\n");
-	}
-}
-
-/*-------------------------------------------------------------------------
- * Function: aux_tblinsert_layout
- *
- * Purpose: auxiliary function, inserts the layout in object OBJS[ I ]
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-
-static void aux_tblinsert_layout(pack_opttbl_t *table, unsigned int I,
-		pack_info_t *pack) {
-	int k;
-
-	table->objs[I].layout = pack->layout;
-	if (H5D_CHUNKED == pack->layout) {
-		/* -2 means the NONE option, remove chunking
-		 and set the layout to contiguous */
-		if (pack->chunk.rank == -2) {
-			table->objs[I].layout = H5D_CONTIGUOUS;
-			table->objs[I].chunk.rank = -2;
-		}
-		/* otherwise set the chunking type */
-		else {
-			table->objs[I].chunk.rank = pack->chunk.rank;
-			for (k = 0; k < pack->chunk.rank; k++)
-				table->objs[I].chunk.chunk_lengths[k] =
-						pack->chunk.chunk_lengths[k];
-		}
-	}
-}
-
-/*-------------------------------------------------------------------------
- * Function: aux_inctable
- *
- * Purpose: auxiliary function, increases the size of the collection by N_OBJS
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-
-static int aux_inctable(pack_opttbl_t *table, int n_objs) {
-	unsigned int i;
-
-	table->size += n_objs;
-	table->objs =
-			(pack_info_t*) HDrealloc(table->objs, table->size * sizeof(pack_info_t));
-	if (table->objs == NULL) {
-		error_msg("not enough memory for options table\n");
-		return -1;
-	}
-	for (i = table->nelems; i < table->size; i++) {
-		init_packobject(&table->objs[i]);
-	}
-	return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: options_table_init
- *
- * Purpose: init options table
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-int options_table_init(pack_opttbl_t **tbl) {
-	unsigned int i;
-	pack_opttbl_t *table;
-
-	if (NULL == (table = (pack_opttbl_t *) HDmalloc(sizeof(pack_opttbl_t)))) {
-		error_msg("not enough memory for options table\n");
-		return -1;
-	}
-
-	table->size = 30;
-	table->nelems = 0;
-	if (NULL == (table->objs =
-			(pack_info_t*) HDmalloc(table->size * sizeof(pack_info_t)))) {
-		error_msg("not enough memory for options table\n");
-		HDfree(table);
-		return -1;
-	}
-
-	for (i = 0; i < table->size; i++)
-		init_packobject(&table->objs[i]);
-
-	*tbl = table;
-	return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: options_table_free
- *
- * Purpose: free table memory
- *
- * Return: 0
- *
- *-------------------------------------------------------------------------
- */
-
-int options_table_free(pack_opttbl_t *table) {
-	HDfree(table->objs);
-	HDfree(table);
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: options_add_layout
- *
- * Purpose: add a layout option to the option list
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-
-int options_add_layout(obj_list_t *obj_list, int n_objs, pack_info_t *pack,
-		pack_opttbl_t *table) {
-	unsigned int i, I;
-	int j, added = 0, found = 0;
-
-	/* increase the size of the collection by N_OBJS if necessary */
-	if (table->nelems + n_objs >= table->size) {
-		if (aux_inctable(table, n_objs) < 0)
-			return -1;
-	}
-
-	/* search if this object is already in the table; "path" is the key */
-	if (table->nelems > 0) {
-		/* go tru the supplied list of names */
-		for (j = 0; j < n_objs; j++) {
-			/* linear table search */
-			for (i = 0; i < table->nelems; i++) {
-				/*already on the table */
-				if (HDstrcmp(obj_list[j].obj,table->objs[i].path) == 0) {
-					/* already chunk info inserted for this one; exit */
-					if (table->objs[i].chunk.rank > 0) {
-						error_msg(
-								"chunk information already inserted for <%s>\n",
-								obj_list[j].obj);
-						HDexit(EXIT_FAILURE);
-					}
-					/* insert the layout info */
-					else {
-						aux_tblinsert_layout(table, i, pack);
-						found = 1;
-						break;
-					}
-				} /* if */
-			} /* i */
-
-			if (found == 0) {
-				/* keep the grow in a temp var */
-				I = table->nelems + added;
-				added++;
-				HDstrcpy(table->objs[I].path, obj_list[j].obj);
-				aux_tblinsert_layout(table, I, pack);
-			}
-			/* cases where we have an already inserted name but there is a new name also
-			 example:
-			 -f dset1:GZIP=1 -l dset1,dset2:CHUNK=20x20
-			 dset1 is already inserted, but dset2 must also be
-			 */
-			else if (found == 1
-					&& HDstrcmp(obj_list[j].obj,table->objs[i].path) != 0) {
-				/* keep the grow in a temp var */
-				I = table->nelems + added;
-				added++;
-				HDstrcpy(table->objs[I].path, obj_list[j].obj);
-				aux_tblinsert_layout(table, I, pack);
-			}
-		} /* j */
-	}
-
-	/* first time insertion */
-	else {
-		/* go tru the supplied list of names */
-		for (j = 0; j < n_objs; j++) {
-			I = table->nelems + added;
-			added++;
-			HDstrcpy(table->objs[I].path, obj_list[j].obj);
-			aux_tblinsert_layout(table, I, pack);
-
-		}
-	}
-
-	table->nelems += added;
-
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: options_add_filter
- *
- * Purpose: add a compression -f option to the option list
- *
- * Return: 0, ok, -1, fail
- *
- *-------------------------------------------------------------------------
- */
-
-int options_add_filter(obj_list_t *obj_list, int n_objs, filter_info_t filt,
-		pack_opttbl_t *table) {
-
-	unsigned int i, I;
-	int j, added = 0, found = 0;
-
-	/* increase the size of the collection by N_OBJS if necessary */
-	if (table->nelems + n_objs >= table->size) {
-		if (aux_inctable(table, n_objs) < 0)
-			return -1;
-	}
-
-	/* search if this object is already in the table; "path" is the key */
-	if (table->nelems > 0) {
-		/* go tru the supplied list of names */
-		for (j = 0; j < n_objs; j++) {
-			/* linear table search */
-			for (i = 0; i < table->nelems; i++) {
-				/*already on the table */
-				if (HDstrcmp(obj_list[j].obj,table->objs[i].path) == 0) {
-					/* insert */
-					aux_tblinsert_filter(table, i, filt);
-					found = 1;
-					break;
-				} /* if */
-			} /* i */
-
-			if (found == 0) {
-				/* keep the grow in a temp var */
-				I = table->nelems + added;
-				added++;
-				HDstrcpy(table->objs[I].path, obj_list[j].obj);
-				aux_tblinsert_filter(table, I, filt);
-			}
-			/* cases where we have an already inserted name but there is a new name also
-			 example:
-			 -l dset1:CHUNK=20x20 -f dset1,dset2:GZIP=1
-			 dset1 is already inserted, but dset2 must also be
-			 */
-			else if (found == 1
-					&& HDstrcmp(obj_list[j].obj,table->objs[i].path) != 0) {
-				/* keep the grow in a temp var */
-				I = table->nelems + added;
-				added++;
-				HDstrcpy(table->objs[I].path, obj_list[j].obj);
-				aux_tblinsert_filter(table, I, filt);
-			}
-		} /* j */
-	}
-
-	/* first time insertion */
-	else {
-		/* go tru the supplied list of names */
-		for (j = 0; j < n_objs; j++) {
-			I = table->nelems + added;
-			added++;
-			HDstrcpy(table->objs[I].path, obj_list[j].obj);
-			aux_tblinsert_filter(table, I, filt);
-		}
-	}
-
-	table->nelems += added;
-
-	return 0;
-}
-
-/*-------------------------------------------------------------------------
- * Function: options_get_object
- *
- * Purpose: get object from table; "path" is the key
- *
- * Return: pack_info_t* OBJECT or NULL if not found; PATH is the key
- *
- *-------------------------------------------------------------------------
- */
-
-pack_info_t* options_get_object(const char *path, pack_opttbl_t *table) {
-	unsigned int i;
-	char tbl_path[MAX_NC_NAME + 1]; /* +1 for start with "/" case */
-
-	for (i = 0; i < table->nelems; i++) {
-		/* make full path (start with "/") to compare correctly  */
-		if (HDstrncmp(table->objs[i].path, "/", 1)) {
-			HDstrcpy(tbl_path, "/");
-			HDstrcat(tbl_path, table->objs[i].path);
-		}
-		else
-			HDstrcpy(tbl_path, table->objs[i].path);
-
-		/* found it */
-		if (HDstrcmp(tbl_path, path) == 0) {
-			return (&table->objs[i]);
-		}
-	}
-
-	return NULL;
-}
-
diff --git a/tools/h5repack/h5repack_parse.c b/tools/h5repack/h5repack_parse.c
deleted file mode 100644
index 1d71c13..0000000
--- a/tools/h5repack/h5repack_parse.c
+++ /dev/null
@@ -1,714 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/*-------------------------------------------------------------------------
- * Function: parse_filter
- *
- * Purpose: read filter information
- *
- * Return: a list of names, the number of names and its compression type
- *
- * <name of filter> can be:
- *  GZIP, to apply the HDF5 GZIP filter (GZIP compression)
- *  SZIP, to apply the HDF5 SZIP filter (SZIP compression)
- *  SHUF, to apply the HDF5 shuffle filter
- *  FLET, to apply the HDF5 checksum filter
- *  NBIT, to apply the HDF5 NBIT filter (NBIT compression)
- *  SOFF, to apply the HDF5 scale+offset filter (compression)
- *  UD, to apply a User Defined filter k, m, n1[,…,nm]
- *  NONE, to remove the filter
- *
- * Examples:
- * "GZIP=6"
- * "A,B:NONE"
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: September, 23, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-
-obj_list_t* parse_filter(const char *str,
-        int *n_objs,
-        filter_info_t *filt,
-        pack_opt_t *options,
-        int *is_glb)
-{
-    unsigned    i, u;
-    char        c;
-    size_t      len=HDstrlen(str);
-    int         j, m, n, k, l, p, r, q, end_obj=-1, no_param=0;
-    char        sobj[MAX_NC_NAME];
-    char        scomp[10];
-    char        stype[6];
-    char        smask[3];
-    obj_list_t* obj_list=NULL;
-    unsigned    pixels_per_block;
-
-
-    /* initialize compression  info */
-    HDmemset(filt,0,sizeof(filter_info_t));
-    *is_glb = 0;
-
-    /* check for the end of object list and number of objects */
-    for ( i = 0, n = 0; i < len; i++)
-    {
-        c = str[i];
-        if ( c==':' )
-        {
-            end_obj=i;
-        }
-        if ( c==',' )
-        {
-            n++;
-        }
-    }
-
-    if (end_obj==-1) /* missing : */
-    {
-        /* apply to all objects */
-        options->all_filter=1;
-        *is_glb = 1;
-    }
-
-    n++;
-    obj_list = (obj_list_t*) HDmalloc(n*sizeof(obj_list_t));
-    if (obj_list==NULL)
-    {
-        error_msg("could not allocate object list\n");
-        return NULL;
-    }
-    *n_objs=n;
-
-    /* get object list */
-    for ( j = 0, k = 0, n = 0; j < end_obj; j++, k++)
-    {
-        c = str[j];
-        sobj[k] = c;
-        if ( c==',' || j==end_obj-1)
-        {
-            if ( c==',') sobj[k]='\0'; else sobj[k+1]='\0';
-            HDstrcpy(obj_list[n].obj,sobj);
-            HDmemset(sobj,0,sizeof(sobj));
-            n++;
-            k=-1;
-        }
-    }
-    /* nothing after : */
-    if (end_obj+1==(int)len)
-    {
-        if (obj_list) HDfree(obj_list);
-        error_msg("input Error: Invalid compression type in <%s>\n",str);
-        HDexit(EXIT_FAILURE);
-    }
-
-
-    /* get filter additional parameters */
-    m=0;
-    for ( i=end_obj+1, k=0, j=0; i<len; i++,k++)
-    {
-        c = str[i];
-        scomp[k]=c;
-        if ( c=='=' || i==len-1)
-        {
-            if ( c=='=') /*one more parameter */
-            {
-                scomp[k]='\0';     /*cut space */
-
-                /*-------------------------------------------------------------------------
-                 * H5Z_FILTER_SZIP
-                 * szip has the format SZIP=<pixels per block,coding>
-                 * pixels per block is a even number in 2-32 and coding method is 'EC' or 'NN'
-                 * example SZIP=8,NN
-                 *-------------------------------------------------------------------------
-                 */
-                if (HDstrcmp(scomp,"SZIP")==0)
-                {
-                    l=-1; /* mask index check */
-                    for ( m=0,u=i+1; u<len; u++,m++)
-                    {
-                        if (str[u]==',')
-                        {
-                            stype[m]='\0'; /* end digit of szip */
-                            l=0;  /* start EC or NN search */
-                            u++;  /* skip ',' */
-                        }
-                        c = str[u];
-                        if (!isdigit(c) && l==-1)
-                        {
-                            if (obj_list) HDfree(obj_list);
-                            error_msg("compression parameter not digit in <%s>\n",str);
-                            HDexit(EXIT_FAILURE);
-                        }
-                        if (l==-1)
-                            stype[m]=c;
-                        else
-                        {
-                            smask[l]=c;
-                            l++;
-                            if (l==2)
-                            {
-                                smask[l]='\0';
-                                i=len-1; /* end */
-                                (*n_objs)--; /* we counted an extra ',' */
-                                if (HDstrcmp(smask,"NN")==0)
-                                    filt->cd_values[j++]=H5_SZIP_NN_OPTION_MASK;
-                                else if (HDstrcmp(smask,"EC")==0)
-                                    filt->cd_values[j++]=H5_SZIP_EC_OPTION_MASK;
-                                else
-                                {
-                                    error_msg("szip mask must be 'NN' or 'EC' \n");
-                                    HDexit(EXIT_FAILURE);
-                                }
-
-
-                            }
-                        }
-
-                    }  /* u */
-                } /*if */
-
-                /*-------------------------------------------------------------------------
-                 * H5Z_FILTER_SCALEOFFSET
-                 * scaleoffset has the format SOFF=<scale_factor,scale_type>
-                 * scale_type can be
-                 *   integer datatype, H5Z_SO_INT (IN)
-                 *   float datatype using D-scaling method, H5Z_SO_FLOAT_DSCALE  (DS)
-                 *   float datatype using E-scaling method, H5Z_SO_FLOAT_ESCALE  (ES) , not yet implemented
-                 * for integer datatypes, scale_factor denotes Minimum Bits
-                 * for float datatypes, scale_factor denotes decimal scale factor
-                 *  examples
-                 *  SOFF=31,IN
-                 *  SOFF=3,DF
-                 *-------------------------------------------------------------------------
-                 */
-
-                else if (HDstrcmp(scomp,"SOFF")==0)
-                {
-                    l=-1; /* mask index check */
-                    for ( m=0,u=i+1; u<len; u++,m++)
-                    {
-                        if (str[u]==',')
-                        {
-                            stype[m]='\0'; /* end digit */
-                            l=0;  /* start 'IN' , 'DS', or 'ES' search */
-                            u++;  /* skip ',' */
-                        }
-                        c = str[u];
-                        if (!isdigit(c) && l==-1)
-                        {
-                            if (obj_list) HDfree(obj_list);
-                            error_msg("compression parameter is not a digit in <%s>\n",str);
-                            HDexit(EXIT_FAILURE);
-                        }
-                        if (l==-1)
-                            stype[m]=c;
-                        else
-                        {
-                            smask[l]=c;
-                            l++;
-                            if (l==2)
-                            {
-                                smask[l]='\0';
-                                i=len-1; /* end */
-                                (*n_objs)--; /* we counted an extra ',' */
-                                if (HDstrcmp(smask,"IN")==0)
-                                    filt->cd_values[j++]=H5Z_SO_INT;
-                                else if (HDstrcmp(smask,"DS")==H5Z_SO_FLOAT_DSCALE)
-                                    filt->cd_values[j++]=H5Z_SO_FLOAT_DSCALE;
-                                else
-                                {
-                                    error_msg("scale type must be 'IN' or 'DS' \n");
-                                    HDexit(EXIT_FAILURE);
-                                }
-
-                            }
-                        }
-
-                    }  /* u */
-                } /*if */
-                /*-------------------------------------------------------------------------
-                 * User Defined
-                 *   has the format UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>
-                 *  BZIP2 example
-                 *  UD=307,1,9
-                 *-------------------------------------------------------------------------
-                 */
-
-                else if (HDstrcmp(scomp,"UD")==0)
-                {
-                    l=-1; /* filter number index check */
-                    p=-1; /* CD_VAL count check */
-                    r=-1; /* CD_VAL check */
-                    for ( m=0,q=0,u=i+1; u<len; u++,m++,q++)
-                    {
-                        if (str[u]==',')
-                        {
-                            stype[q]='\0'; /* end digit */
-                            if (l==-1)
-                            {
-                                filt->filtn=atoi(stype);
-                                l=0;
-                            }
-                            else if (p==-1)
-                            {
-                                filt->cd_nelmts=atoi(stype);
-                                p=0;
-                            }
-                            else
-                                r=0;
-                            q=0;
-                            u++;  /* skip ',' */
-                        }
-                        c = str[u];
-                        if (!isdigit(c) && l==-1)
-                        {
-                            if (obj_list) HDfree(obj_list);
-                            error_msg("filter number parameter is not a digit in <%s>\n",str);
-                            HDexit(EXIT_FAILURE);
-                        }
-                        stype[q]=c;
-                        if (l==0 && p==0)
-                        {
-                            if (r==0)
-                                filt->cd_values[j++]=atoi(stype);
-                        }
-
-                    }  /* u */
-
-                    stype[q]='\0';
-                } /*if */
-
-
-                /*-------------------------------------------------------------------------
-                 * all other filters
-                 *-------------------------------------------------------------------------
-                 */
-
-                else
-                {
-                    /* here we could have 1 or 2 digits  */
-                    for ( m=0,u=i+1; u<len; u++,m++)
-                    {
-                        c = str[u];
-                        if (!isdigit(c)){
-                            if (obj_list) HDfree(obj_list);
-                            error_msg("compression parameter is not a digit in <%s>\n",str);
-                            HDexit(EXIT_FAILURE);
-                        }
-                        stype[m]=c;
-                    } /* u */
-
-                    stype[m]='\0';
-                } /*if */
-
-
-
-                filt->cd_values[j++]=atoi(stype);
-                i+=m; /* jump */
-            }
-            else if (i==len-1)
-            { /*no more parameters */
-                scomp[k+1]='\0';
-                no_param=1;
-            }
-
-            /*-------------------------------------------------------------------------
-             * translate from string to filter symbol
-             *-------------------------------------------------------------------------
-             */
-
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_NONE
-             *-------------------------------------------------------------------------
-             */
-            if (HDstrcmp(scomp,"NONE")==0)
-            {
-                filt->filtn=H5Z_FILTER_NONE;
-                filt->cd_nelmts = 0;
-            }
-
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_DEFLATE
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"GZIP")==0)
-            {
-                filt->filtn=H5Z_FILTER_DEFLATE;
-                filt->cd_nelmts = 1;
-                if (no_param)
-                { /*no more parameters, GZIP must have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("missing compression parameter in <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_SZIP
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"SZIP")==0)
-            {
-                filt->filtn=H5Z_FILTER_SZIP;
-                filt->cd_nelmts = 2;
-                if (no_param)
-                { /*no more parameters, SZIP must have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("missing compression parameter in <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_SHUFFLE
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"SHUF")==0)
-            {
-                filt->filtn=H5Z_FILTER_SHUFFLE;
-                filt->cd_nelmts = 0;
-                if (m>0)
-                { /*shuffle does not have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("extra parameter in SHUF <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_FLETCHER32
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"FLET")==0)
-            {
-                filt->filtn=H5Z_FILTER_FLETCHER32;
-                filt->cd_nelmts = 0;
-                if (m>0)
-                { /*shuffle does not have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("extra parameter in FLET <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_NBIT
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"NBIT")==0)
-            {
-                filt->filtn=H5Z_FILTER_NBIT;
-                filt->cd_nelmts = 0;
-                if (m>0)
-                { /*nbit does not have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("extra parameter in NBIT <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-            /*-------------------------------------------------------------------------
-             * H5Z_FILTER_SCALEOFFSET
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"SOFF")==0)
-            {
-                filt->filtn=H5Z_FILTER_SCALEOFFSET;
-                filt->cd_nelmts = 2;
-                if (no_param)
-                { /*no more parameters, SOFF must have parameter */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("missing compression parameter in <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-            /*-------------------------------------------------------------------------
-             * User Defined Filter
-             *-------------------------------------------------------------------------
-             */
-            else if (HDstrcmp(scomp,"UD")==0)
-            {
-                if (filt->cd_nelmts != j)
-                { /* parameters does not match count */
-                    if (obj_list) HDfree(obj_list);
-                    error_msg("incorrect number of compression parameters in <%s>\n",str);
-                    HDexit(EXIT_FAILURE);
-                }
-            }
-            else {
-                if (obj_list) HDfree(obj_list);
-                error_msg("invalid filter type in <%s>\n",str);
-                HDexit(EXIT_FAILURE);
-            }
-        }
-    } /*i*/
-
-    /*-------------------------------------------------------------------------
-     * check valid parameters
-     *-------------------------------------------------------------------------
-     */
-
-    switch (filt->filtn)
-    {
-
-    /*-------------------------------------------------------------------------
-     * H5Z_FILTER_DEFLATE
-     *-------------------------------------------------------------------------
-     */
-
-    case H5Z_FILTER_DEFLATE:
-        if (filt->cd_values[0]>9 )
-        {
-            if (obj_list) HDfree(obj_list);
-            error_msg("invalid compression parameter in <%s>\n",str);
-            HDexit(EXIT_FAILURE);
-        }
-        break;
-
-        /*-------------------------------------------------------------------------
-         * H5Z_FILTER_SZIP
-         *-------------------------------------------------------------------------
-         */
-
-    case H5Z_FILTER_SZIP:
-        pixels_per_block=filt->cd_values[0];
-        if ((pixels_per_block%2)==1)
-        {
-            if (obj_list) HDfree(obj_list);
-            error_msg("pixels_per_block is not even in <%s>\n",str);
-            HDexit(EXIT_FAILURE);
-        }
-        if (pixels_per_block>H5_SZIP_MAX_PIXELS_PER_BLOCK)
-        {
-            if (obj_list) HDfree(obj_list);
-            error_msg("pixels_per_block is too large in <%s>\n",str);
-            HDexit(EXIT_FAILURE);
-        }
-        if ( (HDstrcmp(smask,"NN")!=0) && (HDstrcmp(smask,"EC")!=0) )
-        {
-            if (obj_list) HDfree(obj_list);
-            error_msg("szip mask must be 'NN' or 'EC' \n");
-            HDexit(EXIT_FAILURE);
-        }
-        break;
-    default:
-        break;
-
-
-    };
-
-    return obj_list;
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: parse_layout
- *
- * Purpose: read layout info
- *
- * Return: a list of names, the number of names and its chunking info for
- *  chunked. NULL, on error
- * the layout type can be:
- *  CHUNK, to apply chunking layout
- *  CONTI, to apply contiguous layout
- *  COMPA, to apply compact layout
- *
- * Example:
- * "AA,B,CDE:CHUNK=10X10"
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: December 30, 2003
- *
- *-------------------------------------------------------------------------
- */
-obj_list_t* parse_layout(const char *str,
-        int *n_objs,
-        pack_info_t *pack,    /* info about layout needed */
-        pack_opt_t *options)
-{
-    obj_list_t* obj_list=NULL;
-    unsigned    i;
-    char        c;
-    size_t      len=HDstrlen(str);
-    int         j, n, k, end_obj=-1, c_index;
-    char        sobj[MAX_NC_NAME];
-    char        sdim[10];
-    char        slayout[10];
-
-
-    HDmemset(sdim, '\0', sizeof(sdim));
-    HDmemset(sobj, '\0', sizeof(sobj));
-    HDmemset(slayout, '\0', sizeof(slayout));
-
-    /* check for the end of object list and number of objects */
-    for ( i=0, n=0; i<len; i++)
-    {
-        c = str[i];
-        if ( c==':' )
-        {
-            end_obj=i;
-        }
-        if ( c==',' )
-        {
-            n++;
-        }
-    }
-
-    if (end_obj==-1) { /* missing : chunk all */
-        options->all_layout=1;
-    }
-
-    n++;
-    obj_list = (obj_list_t*) HDmalloc(n*sizeof(obj_list_t));
-    if (obj_list==NULL)
-    {
-        error_msg("could not allocate object list\n");
-        return NULL;
-    }
-    *n_objs=n;
-
-    /* get object list */
-    for ( j=0, k=0, n=0; j<end_obj; j++,k++)
-    {
-        c = str[j];
-        sobj[k]=c;
-        if ( c==',' || j==end_obj-1)
-        {
-            if ( c==',') sobj[k]='\0'; else sobj[k+1]='\0';
-            HDstrcpy(obj_list[n].obj,sobj);
-            HDmemset(sobj,0,sizeof(sobj));
-            n++;
-            k=-1;
-        }
-    }
-
-    /* nothing after : */
-    if (end_obj+1==(int)len)
-    {
-        if (obj_list) HDfree(obj_list);
-        error_msg("in parse layout, no characters after : in <%s>\n",str);
-        HDexit(EXIT_FAILURE);
-    }
-
-    /* get layout info */
-    for ( j=end_obj+1, n=0; n<=5; j++,n++)
-    {
-        if (n==5)
-        {
-            slayout[n]='\0';  /*cut string */
-            if (HDstrcmp(slayout,"COMPA")==0)
-                pack->layout=H5D_COMPACT;
-            else if (HDstrcmp(slayout,"CONTI")==0)
-                pack->layout=H5D_CONTIGUOUS;
-            else if (HDstrcmp(slayout,"CHUNK")==0)
-                pack->layout=H5D_CHUNKED;
-            else {
-                error_msg("in parse layout, not a valid layout in <%s>\n",str);
-                HDexit(EXIT_FAILURE);
-            }
-        }
-        else
-        {
-            c = str[j];
-            slayout[n]=c;
-        }
-    } /* j */
-
-
-    if ( pack->layout==H5D_CHUNKED )
-    {
-
-        /*-------------------------------------------------------------------------
-         * get chunk info
-         *-------------------------------------------------------------------------
-         */
-        k=0;
-
-        if (j>(int)len)
-        {
-            if (obj_list) HDfree(obj_list);
-            error_msg("in parse layout,  <%s> Chunk dimensions missing\n",str);
-            HDexit(EXIT_FAILURE);
-        }
-
-        for ( i=j, c_index=0; i<len; i++)
-        {
-            c = str[i];
-            sdim[k]=c;
-            k++; /*increment sdim index */
-
-            if (!isdigit(c) && c!='x'
-                    && c!='N' && c!='O' && c!='N' && c!='E'
-            ){
-                if (obj_list) HDfree(obj_list);
-                error_msg("in parse layout, <%s> Not a valid character in <%s>\n",
-                        sdim,str);
-                HDexit(EXIT_FAILURE);
-            }
-
-            if ( c=='x' || i==len-1)
-            {
-                if ( c=='x') {
-                    sdim[k-1]='\0';
-                    k=0;
-                    pack->chunk.chunk_lengths[c_index]=atoi(sdim);
-                    if (pack->chunk.chunk_lengths[c_index]==0) {
-                        if (obj_list) HDfree(obj_list);
-                        error_msg("in parse layout, <%s> conversion to number in <%s>\n",
-                                sdim,str);
-                        HDexit(EXIT_FAILURE);
-                    }
-                    c_index++;
-                }
-                else if (i==len-1) { /*no more parameters */
-                    sdim[k]='\0';
-                    k=0;
-                    if (HDstrcmp(sdim,"NONE")==0)
-                    {
-                        pack->chunk.rank=-2;
-                    }
-                    else
-                    {
-                        pack->chunk.chunk_lengths[c_index]=atoi(sdim);
-                        if (pack->chunk.chunk_lengths[c_index]==0){
-                            if (obj_list) HDfree(obj_list);
-                            error_msg("in parse layout, <%s> conversion to number in <%s>\n",
-                                    sdim,str);
-                            HDexit(EXIT_FAILURE);
-                        }
-                        pack->chunk.rank=c_index+1;
-                    }
-                } /*if */
-            } /*if c=='x' || i==len-1 */
-        } /*i*/
-
-
-    } /*H5D_CHUNKED*/
-
-
-    return obj_list;
-}
-
-
-
-
-
-
diff --git a/tools/h5repack/h5repack_plugin.sh.in b/tools/h5repack/h5repack_plugin.sh.in
deleted file mode 100644
index 7502397..0000000
--- a/tools/h5repack/h5repack_plugin.sh.in
+++ /dev/null
@@ -1,264 +0,0 @@
-#! /bin/sh
-#
-# 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.           
-#
-srcdir=@srcdir@
-TOP_BUILDDIR=@top_builddir@
-
-# Determine backward compatibility options enabled
-DEPRECATED_SYMBOLS="@DEPRECATED_SYMBOLS@"
-
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-H5REPACK=h5repack               # The tool name
-H5REPACK_BIN=`pwd`/$H5REPACK    # The path of the tool binary
-
-H5DUMP=../h5dump/h5dump         # The h5dump tool name
-H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
-
-nerrors=0
-verbose=yes
-exit_code=$EXIT_SUCCESS
-
-TEST_NAME=ud_plugin
-FROM_DIR=`pwd`/.libs
-PLUGIN_LIB="$FROM_DIR/libdynlibadd.*"
-PLUGIN_LIBDIR=testdir3
-RM='rm -rf'
-
-GREP='grep'
-CP='cp'
-DIRNAME='dirname'
-LS='ls'
-AWK='awk'
-
-# source dirs
-SRC_TOOLS="$srcdir/.."
-
-# testfiles source dirs for tools
-SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
-
-TESTDIR=testplug
-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_H5REPACK_TESTFILES/h5repack_layout.h5
-$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-plugin_test.ddl
-$SRC_H5REPACK_TESTFILES/plugin_test.h5repack_layout.h5.tst
-"
-#$SRC_H5REPACK_TESTFILES/h5repack_layout.UD.h5
-#$SRC_H5REPACK_TESTFILES/h5repack_layout.UD.h5-plugin_none.ddl
-#$SRC_H5REPACK_TESTFILES/plugin_none.h5repack_layout.UD.h5.tst
-#"
-
-#
-# copy test files and expected output files from source dirs to test dir
-#
-COPY_TESTFILES="$LIST_HDF5_TEST_FILES"
-
-# Main Body
-# Create test directories if not exists yet.
-test -d $PLUGIN_LIBDIR || mkdir -p $PLUGIN_LIBDIR
-if [ $? != 0 ]; then
-    echo "Failed to create test directory($PLUGIN_LIBDIR)"
-    exit $EXIT_FAILURE
-fi
-
-# copy plugin library for test
-$CP $PLUGIN_LIB $PLUGIN_LIBDIR
-if [ $? != 0 ]; then
-    echo "Failed to copy plugin library ($PLUGIN_LIB) for test."
-    exit $EXIT_FAILURE
-fi
-
-# setup plugin path
-ENVCMD="env HDF5_PLUGIN_PATH=../${PLUGIN_LIBDIR}"
-
-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 $* message left justified in a field of 70 characters
-#
-MESSAGE() {
-   SPACES="                                                               "
-   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# 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'
-}
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Verifying".
-#
-VERIFY() {
-    MESSAGE "Verifying $*"
-}
-
-# This is different from $srcdir/../../bin/output_filter.sh
-STDOUT_FILTER() {
-    result_file=$1
-    tmp_file=/tmp/h5test_tmp_$$
-    # Filter name of files.
-    cp $result_file $tmp_file
-    sed -e '/^Opening file/d' -e '/^Making file/d' \
-    < $tmp_file > $result_file
-    # cleanup
-    rm -f $tmp_file
-}
-          
-# This runs h5repack comparing output with h5dump output
-# from -pH option
-#
-TOOLTEST_DUMP() 
-{
-    echo $@
-    infile=$2
-    outfile=out-$1.$2
-    expect1="$TESTDIR/$1.$2.tst"
-    actual1="$TESTDIR/$1.$2.out"
-    actual1_err="$TESTDIR/$1.$2.err"
-    expect2="$TESTDIR/$2-$1.ddl"
-    actual2="$TESTDIR/$2-$1.out"
-    actual2_err="$TESTDIR/$2-$1.err"
-
-    shift
-    shift
-    
-    # Run test.
-    TESTING $H5REPACK $@
-    (
-      cd $TESTDIR
-      $ENVCMD $H5REPACK_BIN "$@" $infile $outfile
-    ) >$actual1 2>$actual1_err
-    RET=$?
-    STDOUT_FILTER $actual1
-    cat $actual1_err >> $actual1
-    if [ $RET != 0 ] ; then
-      echo "*FAILED*"
-      nerrors="`expr $nerrors + 1`"
-    else
-      echo " PASSED"
-      if cmp -s $expect1 $actual1; then
-        echo " PASSED"
-      else
-        echo "*FAILED*"
-        echo "    Expected result (*.tst) differs from actual result (*.out)"
-        nerrors="`expr $nerrors + 1`"
-        test yes = "$verbose" && diff -c $expect1 $actual1 |sed 's/^/    /'
-      fi
-      VERIFY h5dump output -pH $outfile 
-      (
-        cd $TESTDIR
-        $ENVCMD $H5DUMP_BIN -pH $outfile 
-      ) >$actual2 2>$actual2_err
-      RET=$?
-      cat $actual2_err >> $actual2
-
-      if cmp -s $expect2 $actual2; then
-        echo " PASSED"
-      else
-        echo "*FAILED*"
-      echo "    Expected result (*.ddl) differs from actual result (*.out)"
-      nerrors="`expr $nerrors + 1`"
-      test yes = "$verbose" && diff -c $expect2 $actual2 |sed 's/^/    /'
-     fi
-          
-    fi
-
-    
-   rm -f $actual1 $actual1_err $actual2 $actual2_err
-   rm -f $outfile
-}
-
-##############################################################################
-###           T H E   T E S T S                               
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-# Run the test
-arg="h5repack_layout.h5 -v -f UD=257,1,9"
-TOOLTEST_DUMP plugin_test $arg 
-
-#arg="h5repack_layout.UD.h5 -v -f NONE"
-#TOOLTEST_DUMP plugin_none $arg 
-
-# print results
-if test $nerrors -ne 0 ; then
-    echo "$nerrors errors encountered"
-    exit_code=$EXIT_FAILURE
-else
-    echo "All Plugin API tests passed."
-    exit_code=$EXIT_SUCCESS
-fi
-
-# Clean up temporary files/directories
-CLEAN_TESTFILES_AND_TESTDIR
-
-# Clean up temporary files/directories and leave
-$RM $PLUGIN_LIBDIR
-
-exit $exit_code
diff --git a/tools/h5repack/h5repack_refs.c b/tools/h5repack/h5repack_refs.c
deleted file mode 100644
index 3f99704..0000000
--- a/tools/h5repack/h5repack_refs.c
+++ /dev/null
@@ -1,881 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5diff.h"
-#include "h5tools.h"
-
-
-/*-------------------------------------------------------------------------
- * local functions
- *-------------------------------------------------------------------------
- */
-
-static const char* MapIdToName(hid_t refobj_id,trav_table_t *travt);
-static int copy_refs_attr(hid_t loc_in, hid_t loc_out, pack_opt_t *options,
-                          trav_table_t *travt, hid_t fidout);
-static herr_t update_ref_value(hid_t obj_id, H5R_type_t ref_type, void *ref_in,
-		hid_t fid_out, void *ref_out, trav_table_t *travt);
-
-/*-------------------------------------------------------------------------
- * Function: do_copy_refobjs
- *
- * Purpose: duplicate all referenced HDF5 objects in the file
- *  and create hard links
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: December, 10, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int do_copy_refobjs(hid_t fidin,
-                    hid_t fidout,
-                    trav_table_t *travt,
-                    pack_opt_t *options) /* repack options */
-{
-    hid_t     grp_in = (-1);          /* read group ID */
-    hid_t     grp_out = (-1);         /* write group ID */
-    hid_t     dset_in = (-1);         /* read dataset ID */
-    hid_t     dset_out = (-1);        /* write dataset ID */
-    hid_t     type_in = (-1);         /* named type ID */
-    hid_t     dcpl_id = (-1);         /* dataset creation property list ID */
-    hid_t     space_id = (-1);        /* space ID */
-    hid_t     ftype_id = (-1);        /* file data type ID */
-    hid_t     mtype_id = (-1);        /* memory data type ID */
-    size_t    msize;                  /* memory size of memory type */
-    hsize_t   nelmts;                 /* number of elements in dataset */
-    int       rank;                   /* rank of dataset */
-    hsize_t   dims[H5S_MAX_RANK];     /* dimensions of dataset */
-    unsigned int i, j;
-    int       k;
-    named_dt_t *named_dt_head=NULL;   /* Pointer to the stack of named datatypes
-                                         copied */
-
-    /*-------------------------------------------------------------------------
-    * browse
-    *-------------------------------------------------------------------------
-    */
-    for(i = 0; i < travt->nobjs; i++) {
-        switch(travt->objs[i].type)
-        {
-            /*-------------------------------------------------------------------------
-            * H5TRAV_TYPE_GROUP
-            *-------------------------------------------------------------------------
-            */
-            case H5TRAV_TYPE_GROUP:
-                /*-------------------------------------------------------------------------
-                * copy referenced objects in attributes
-                *-------------------------------------------------------------------------
-                */
-                if((grp_out = H5Gopen2(fidout, travt->objs[i].name, H5P_DEFAULT)) < 0)
-                    goto error;
-
-                if((grp_in = H5Gopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
-                    goto error;
-
-                if(copy_refs_attr(grp_in, grp_out, options, travt, fidout) < 0)
-                    goto error;
-
-                if(H5Gclose(grp_out) < 0)
-                    goto error;
-                if(H5Gclose(grp_in) < 0)
-                    goto error;
-
-                /*-------------------------------------------------------------------------
-                * check for hard links
-                *-------------------------------------------------------------------------
-                */
-                if(travt->objs[i].nlinks)
-                    for(j = 0; j < travt->objs[i].nlinks; j++)
-                        H5Lcreate_hard(fidout, travt->objs[i].name, H5L_SAME_LOC, travt->objs[i].links[j].new_name, H5P_DEFAULT, H5P_DEFAULT);
-                break;
-
-            /*-------------------------------------------------------------------------
-            * H5TRAV_TYPE_DATASET
-            *-------------------------------------------------------------------------
-            */
-            case H5TRAV_TYPE_DATASET:
-                if((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
-                    goto error;
-                if((space_id = H5Dget_space(dset_in)) < 0)
-                    goto error;
-                if((ftype_id = H5Dget_type(dset_in)) < 0)
-                    goto error;
-                if((dcpl_id = H5Dget_create_plist(dset_in)) < 0)
-                    goto error;
-                if((rank = H5Sget_simple_extent_ndims(space_id)) < 0)
-                    goto error;
-                if(H5Sget_simple_extent_dims(space_id, dims, NULL) < 0)
-                    goto error;
-                nelmts = 1;
-                for(k = 0; k < rank; k++)
-                    nelmts *= dims[k];
-
-                if((mtype_id = h5tools_get_native_type(ftype_id)) < 0)
-                    goto error;
-
-                if((msize = H5Tget_size(mtype_id)) == 0)
-                    goto error;
-
-                /*-------------------------------------------------------------------------
-                 * check if the dataset creation property list has filters that
-                 * are not registered in the current configuration
-                 * 1) the external filters GZIP and SZIP might not be available
-                 * 2) the internal filters might be turned off
-                 *-------------------------------------------------------------------------
-                 */
-                if(h5tools_canreadf(NULL, dcpl_id) == 1) {
-                    /*-------------------------------------------------------------------------
-                    * test for a valid output dataset
-                    *-------------------------------------------------------------------------
-                    */
-                    dset_out = FAIL;
-
-                    /*-------------------------------------------------------------------------
-                    * object references are a special case
-                    * we cannot just copy the buffers, but instead we recreate the reference
-                    *-------------------------------------------------------------------------
-                    */
-                    if(H5Tequal(mtype_id, H5T_STD_REF_OBJ)) {
-                        hid_t            refobj_id;
-                        hobj_ref_t       *refbuf = NULL; /* buffer for object references */
-                        hobj_ref_t       *buf = NULL;
-                        const char*      refname;
-                        unsigned         u;
-
-                        /*-------------------------------------------------------------------------
-                        * read to memory
-                        *-------------------------------------------------------------------------
-                        */
-                        if(nelmts) {
-                            buf = (hobj_ref_t *)HDmalloc((unsigned)(nelmts * msize));
-                            if(buf==NULL) {
-                                printf("cannot read into memory\n" );
-                                goto error;
-                            } /* end if */
-                            if(H5Dread(dset_in, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-                                goto error;
-
-                            refbuf = (hobj_ref_t*) HDcalloc((unsigned)nelmts, msize);
-                            if(refbuf == NULL){
-                                printf("cannot allocate memory\n" );
-                                goto error;
-                            } /* end if */
-                            for(u = 0; u < nelmts; u++) {
-                                H5E_BEGIN_TRY {
-                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_OBJECT, &buf[u])) < 0)
-                                        continue;
-                                } H5E_END_TRY;
-
-                                /* get the name. a valid name could only occur
-                                 * in the second traversal of the file
-                                 */
-                                if((refname = MapIdToName(refobj_id, travt)) != NULL) {
-                                    /* create the reference, -1 parameter for objects */
-                                    if(H5Rcreate(&refbuf[u], fidout, refname, H5R_OBJECT, (hid_t)-1) < 0)
-                                        goto error;
-                                    if(options->verbose)
-                                    {
-                                        printf(FORMAT_OBJ,"dset",travt->objs[i].name );
-                                        printf("object <%s> object reference created to <%s>\n",
-                                            travt->objs[i].name,
-                                            refname);
-                                    }
-                                } /*refname*/
-                                H5Oclose(refobj_id);
-                            } /* u */
-                        } /*nelmts*/
-
-                        /*-------------------------------------------------------------------------
-                        * create/write dataset/close
-                        *-------------------------------------------------------------------------
-                        */
-                        if((dset_out = H5Dcreate2(fidout, travt->objs[i].name, mtype_id, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
-                            goto error;
-                        if(nelmts)
-                            if(H5Dwrite(dset_out, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, refbuf) < 0)
-                                goto error;
-
-                        if(buf)
-                            HDfree(buf);
-                        if(refbuf)
-                            HDfree(refbuf);
-
-                       /*------------------------------------------------------
-                        * copy attrs
-                        *----------------------------------------------------*/
-                        if(copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
-                            goto error;
-                    } /*H5T_STD_REF_OBJ*/
-
-                    /*-------------------------------------------------------------------------
-                    * dataset region references
-                    *-------------------------------------------------------------------------
-                    */
-                    else if(H5Tequal(mtype_id, H5T_STD_REF_DSETREG))
-                    {
-                        hid_t            refobj_id;
-                        hdset_reg_ref_t  *refbuf = NULL; /* input buffer for region references */
-                        hdset_reg_ref_t  *buf = NULL;    /* output buffer */
-                        const char*      refname;
-                        unsigned         u;
-
-                        /*-------------------------------------------------------------------------
-                        * read input to memory
-                        *-------------------------------------------------------------------------
-                        */
-                        if(nelmts) {
-                            buf = (hdset_reg_ref_t *)HDmalloc((unsigned)(nelmts * msize));
-                            if(buf == NULL) {
-                                printf("cannot read into memory\n");
-                                goto error;
-                            } /* end if */
-                            if(H5Dread(dset_in, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-                                goto error;
-
-                            /*-------------------------------------------------------------------------
-                            * create output
-                            *-------------------------------------------------------------------------
-                            */
-                            refbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)nelmts); /*init to zero */
-                            if(refbuf == NULL) {
-                                printf("cannot allocate memory\n");
-                                goto error;
-                            } /* end if */
-
-                            for(u = 0; u < nelmts; u++) {
-                                H5E_BEGIN_TRY {
-                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_DATASET_REGION, &buf[u])) < 0)
-                                        continue;
-                                } H5E_END_TRY;
-
-                                /* get the name. a valid name could only occur
-                                 * in the second traversal of the file
-                                 */
-                                if((refname = MapIdToName(refobj_id, travt)) != NULL) {
-                                    hid_t region_id;    /* region id of the referenced dataset */
-
-                                    if((region_id = H5Rget_region(dset_in, H5R_DATASET_REGION, &buf[u])) < 0)
-                                        goto error;
-
-                                    /* create the reference, we need the space_id */
-                                    if(H5Rcreate(&refbuf[u], fidout, refname, H5R_DATASET_REGION, region_id) < 0)
-                                        goto error;
-                                    if(H5Sclose(region_id) < 0)
-                                        goto error;
-                                    if(options->verbose)
-                                    {
-
-
-
-                                        printf(FORMAT_OBJ,"dset",travt->objs[i].name );
-                                        printf("object <%s> region reference created to <%s>\n",
-                                            travt->objs[i].name,
-                                            refname);
-                                    }
-                                } /*refname*/
-                                H5Oclose(refobj_id);
-                            } /* u */
-                        } /*nelmts*/
-
-                        /*-------------------------------------------------------------------------
-                        * create/write dataset/close
-                        *-------------------------------------------------------------------------
-                        */
-                        if((dset_out = H5Dcreate2(fidout, travt->objs[i].name, mtype_id, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
-                            goto error;
-                        if(nelmts)
-                            if(H5Dwrite(dset_out, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, refbuf) < 0)
-                                goto error;
-
-                        if(buf)
-                            HDfree(buf);
-                        if(refbuf)
-                            HDfree(refbuf);
-
-                       /*-----------------------------------------------------
-                        * copy attrs
-                        *----------------------------------------------------*/
-                        if(copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
-                            goto error;
-                    } /* H5T_STD_REF_DSETREG */
-                    /*-------------------------------------------------------------------------
-                    * not references, open previously created object in 1st traversal
-                    *-------------------------------------------------------------------------
-                    */
-                    else {
-                        if((dset_out = H5Dopen2(fidout, travt->objs[i].name, H5P_DEFAULT)) < 0)
-                            goto error;
-                    } /* end else */
-
-                    HDassert(dset_out != FAIL);
-
-                    /*-------------------------------------------------------------------------
-                    * copy referenced objects in attributes
-                    *-------------------------------------------------------------------------
-                    */
-                    if(copy_refs_attr(dset_in, dset_out, options, travt, fidout) < 0)
-                        goto error;
-
-                    /*-------------------------------------------------------------------------
-                    * check for hard links
-                    *-------------------------------------------------------------------------
-                    */
-                    if(travt->objs[i].nlinks)
-                        for(j = 0; j < travt->objs[i].nlinks; j++)
-                            H5Lcreate_hard(fidout, travt->objs[i].name, H5L_SAME_LOC, travt->objs[i].links[j].new_name, H5P_DEFAULT, H5P_DEFAULT);
-
-                    if(H5Dclose(dset_out) < 0)
-                        goto error;
-                } /*can_read*/
-
-                /*-------------------------------------------------------------------------
-                * close
-                *-------------------------------------------------------------------------
-                */
-                if(H5Tclose(ftype_id) < 0)
-                    goto error;
-                if(H5Tclose(mtype_id) < 0)
-                    goto error;
-                if(H5Pclose(dcpl_id) < 0)
-                    goto error;
-                if(H5Sclose(space_id) < 0)
-                    goto error;
-                if(H5Dclose(dset_in) < 0)
-                    goto error;
-                break;
-
-            /*-------------------------------------------------------------------------
-            * H5TRAV_TYPE_NAMED_DATATYPE
-            *-------------------------------------------------------------------------
-            */
-            case H5TRAV_TYPE_NAMED_DATATYPE:
-                if((type_in = H5Topen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
-                    goto error;
-                if(H5Tclose(type_in) < 0)
-                    goto error;
-                break;
-
-            /*-------------------------------------------------------------------------
-            * H5TRAV_TYPE_LINK
-            *-------------------------------------------------------------------------
-            */
-            case H5TRAV_TYPE_LINK:
-                /*nothing to do */
-                break;
-
-            case H5TRAV_TYPE_UNKNOWN:
-            case H5TRAV_TYPE_UDLINK:
-                goto error;
-
-            default:
-                break;
-        } /* end switch */
-    } /* end for */
-
-    /* Finalize (link) the stack of named datatypes (if any)
-     * This function is paired with copy_named_datatype() which is called
-     * in copy_attr(), so need to free.
-     */
-    named_datatype_free(&named_dt_head, 0);
-
-    return 0;
-
-error:
-    H5E_BEGIN_TRY {
-        H5Gclose(grp_in);
-        H5Gclose(grp_out);
-        H5Pclose(dcpl_id);
-        H5Sclose(space_id);
-        H5Dclose(dset_in);
-        H5Dclose(dset_out);
-        H5Tclose(ftype_id);
-        H5Tclose(mtype_id);
-        H5Tclose(type_in);
-        named_datatype_free(&named_dt_head, 0);
-    } H5E_END_TRY;
-
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: copy_refs_attr
- *
- * Purpose: duplicate all referenced HDF5 located in attributes
- *  relative to LOC_IN, which is obtained either from
- * loc_id = H5Gopen2(fid, name, H5P_DEFAULT);
- * loc_id = H5Dopen2(fid, name, H5P_DEFAULT);
- * loc_id = H5Topen2(fid, name, H5P_DEFAULT);
- *
- * Return: 0, ok, -1 no
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Modifier: xcao at hdfgroup.org, 9/12/2011
- * 	         Update values of references(object and region) for the following types:
- *               1) References,
- *               2) ARRAY of reference,
- *               3) VLEN of references.
- *               4) COMPOUND of references.
- *          This function does not handle references in other complicated structures,
- *		    such as references in nested compound datatypes.
- *
- * Date: October, 28, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-static int copy_refs_attr(hid_t loc_in,
-                          hid_t loc_out,
-                          pack_opt_t *options,
-                          trav_table_t *travt,
-                          hid_t fidout         /* for saving references */
-                          )
-{
-    hid_t      attr_id = -1;      /* attr ID */
-    hid_t      attr_out = -1;     /* attr ID */
-    hid_t      space_id = -1;     /* space ID */
-    hid_t      ftype_id = -1;     /* file data type ID */
-    hid_t      mtype_id = -1;     /* memory data type ID */
-    size_t     msize;             /* memory size of type */
-    hsize_t    nelmts;            /* number of elements in dataset */
-    hsize_t    dims[H5S_MAX_RANK];/* dimensions of dataset */
-    char       name[255];
-    H5O_info_t oinfo;           /* Object info */
-    unsigned   u, i, j;
-    int        rank;
-    H5T_class_t type_class = -1;
-    hbool_t    is_ref=0, is_ref_vlen=0, is_ref_array=0, is_ref_comp=0;
-    void  *refbuf = NULL;
-    void  *buf = NULL;
-    const char* refname = NULL;
-    int   *ref_comp_index = NULL;
-    size_t *ref_comp_size = NULL;
-    int    ref_comp_field_n = 0;
-
-
-    if(H5Oget_info(loc_in, &oinfo) < 0)
-        goto error;
-
-    for(u = 0; u < (unsigned)oinfo.num_attrs; u++) {
-    	is_ref = is_ref_vlen = is_ref_array = is_ref_comp = 0;
-
-        /* open attribute */
-        if((attr_id = H5Aopen_by_idx(loc_in, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto error;
-
-        /* get the file datatype  */
-        if((ftype_id = H5Aget_type(attr_id)) < 0)
-            goto error;
-
-        type_class = H5Tget_class(ftype_id);
-
-        if((mtype_id = h5tools_get_native_type(ftype_id)) < 0)
-            goto error;
-
-        if((msize = H5Tget_size(mtype_id)) == 0)
-            goto error;
-
-        is_ref = (type_class == H5T_REFERENCE);
-
-        if(type_class == H5T_VLEN ) {
-            hid_t base_type;
-
-            base_type = H5Tget_super(ftype_id);
-            is_ref_vlen = (H5Tget_class(base_type)==H5T_REFERENCE);
-            msize = H5Tget_size(base_type);
-            H5Tclose(base_type);
-        }
-        else if(type_class == H5T_ARRAY ) {
-            hid_t base_type;
-
-            base_type = H5Tget_super(ftype_id);
-            is_ref_array = (H5Tget_class(base_type)==H5T_REFERENCE);
-            msize = H5Tget_size(base_type);
-            H5Tclose(base_type);
-        }
-        else if(type_class == H5T_COMPOUND) {
-            int nmembers = H5Tget_nmembers(ftype_id) ;
-
-            if (nmembers < 1)
-                goto error;
-
-            ref_comp_index = (int *)HDmalloc(nmembers*sizeof (int));
-            ref_comp_size = (size_t *)HDmalloc(nmembers*sizeof(ref_comp_size));
-            ref_comp_field_n = 0;
-
-            for (i=0; i<(unsigned)nmembers; i++) {
-                hid_t mtid = H5Tget_member_type( ftype_id, i );
-
-                if ((H5Tget_class(mtid)==H5T_REFERENCE)) {
-                    ref_comp_index[ref_comp_field_n] = i;
-                    ref_comp_size[ref_comp_field_n] = H5Tget_size(mtid);
-                    ref_comp_field_n++;
-                }
-                H5Tclose(mtid);
-            }
-            
-            /* if compound don't contain reference type member, free the above 
-             * mallocs. Otherwise there can be memory leaks by the 'continue' 
-             * statement below. */
-            if (!ref_comp_field_n) {
-                if (ref_comp_index) {
-                    HDfree(ref_comp_index);
-                    ref_comp_index = NULL;
-                }
-
-                if (ref_comp_size) {
-            	    HDfree(ref_comp_size);
-                    ref_comp_size = NULL;
-                }
-            }
-        }
-
-        is_ref_comp = (ref_comp_field_n > 0);
-
-        if (!(is_ref || is_ref_vlen || is_ref_array || is_ref_comp)) {
-            H5Tclose(mtype_id);
-            H5Tclose(ftype_id);
-            H5Aclose(attr_id);
-            continue;
-        }
-
-        /* get name */
-        if(H5Aget_name(attr_id, 255, name) < 0)
-            goto error;
-
-        /* get the dataspace handle  */
-        if((space_id = H5Aget_space(attr_id)) < 0)
-            goto error;
-
-        /* get dimensions  */
-        if((rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0)
-            goto error;
-
-
-        /*-------------------------------------------------------------------------
-        * elements
-        *-------------------------------------------------------------------------
-        */
-        nelmts = 1;
-        for(j = 0; j < (unsigned)rank; j++)
-            nelmts *= dims[j];
-
-        if (is_ref_array) {
-            unsigned        array_rank = 0;
-            hsize_t    array_size = 1;
-            hsize_t array_dims[H5S_MAX_RANK];
-            hid_t base_type;
-
-            base_type = H5Tget_super(ftype_id);
-            msize = H5Tget_size(base_type);
-            H5Tclose(base_type);
-
-            array_rank = H5Tget_array_ndims(mtype_id);
-            H5Tget_array_dims2(mtype_id, array_dims);
-            for(j = 0; j <array_rank; j++)
-            	array_size *= array_dims[j];
-            nelmts *= array_size;
-        }
-
-        if((attr_out = H5Acreate2(loc_out, name, ftype_id, space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto error;
-
-        if (nelmts>0) {
-            /* handle object references */
-            if((is_ref || is_ref_array) && (H5R_OBJ_REF_BUF_SIZE==msize)) {
-                buf = (hobj_ref_t *)HDmalloc((unsigned)(nelmts * msize));
-                if(buf == NULL) {
-                    printf("cannot read into memory\n");
-                    goto error;
-                } /* end if */
-                if(H5Aread(attr_id, mtype_id, buf) < 0)
-                    goto error;
-
-                refbuf = (hobj_ref_t *)HDcalloc((unsigned)nelmts, msize);
-                if(refbuf == NULL) {
-                    printf("cannot allocate memory\n");
-                    goto error;
-                } /* end if */
-
-                for(i = 0; i < (unsigned)nelmts; i++) {
-                    if (update_ref_value(attr_id, H5R_OBJECT, &((hobj_ref_t *)buf)[i], fidout, &((hobj_ref_t *)refbuf)[i], travt)<0)
-                        continue;
-                    if(options->verbose)
-                        printf("object <%s> reference created to <%s>\n", name, refname);
-                } /* i */
-            } /* H5T_STD_REF_OBJ */
-            /* handle region references */
-            else if((is_ref || is_ref_array) && (H5R_DSET_REG_REF_BUF_SIZE == msize)) {
-                buf = (hdset_reg_ref_t *)HDmalloc((unsigned)(nelmts * msize));
-
-                if(buf == NULL) {
-                    printf( "cannot read into memory\n" );
-                    goto error;
-                } /* end if */
-                if(H5Aread(attr_id, mtype_id, buf) < 0)
-                    goto error;
-
-                /*-------------------------------------------------------------------------
-                * create output
-                *-------------------------------------------------------------------------
-                */
-                refbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)nelmts); /*init to zero */
-                if(refbuf == NULL) {
-                    printf( "cannot allocate memory\n" );
-                    goto error;
-                } /* end if */
-
-                for(i = 0; i < (unsigned)nelmts; i++) {
-                    if (update_ref_value(attr_id, H5R_DATASET_REGION, &((hdset_reg_ref_t *)buf)[i], fidout, &((hdset_reg_ref_t *)refbuf)[i], travt)<0)
-                        continue;
-                    if(options->verbose)
-                        printf("object <%s> region reference created to <%s>\n", name, refname);
-                }
-            } /* H5T_STD_REF_DSETREG */
-            else if (is_ref_vlen) {
-            	/* handle VLEN of references */
-
-                buf = (hvl_t *)HDmalloc((unsigned)(nelmts * sizeof(hvl_t)));
-                refbuf = buf; /* reuse the read buffer for write */
-
-                if(buf == NULL) {
-                    printf( "cannot read into memory\n" );
-                    goto error;
-                } /* end if */
-
-                if(H5Aread(attr_id, mtype_id, buf) < 0)
-                    goto error;
-
-                if (H5R_OBJ_REF_BUF_SIZE==msize) {
-                    hobj_ref_t ref_out;
-
-                    for (i=0; i<(unsigned)nelmts; i++) {
-                        hobj_ref_t *ptr = (hobj_ref_t *)((hvl_t *)buf)[i].p;
-
-                        for (j=0; j<((hvl_t *)buf)[i].len; j++ ) {
-                            if (update_ref_value(attr_id, H5R_OBJECT, &(ptr[j]), fidout, &ref_out, travt)<0)
-                                continue;
-                            HDmemcpy(&(ptr[j]), &ref_out, msize);
-                        }
-                    }  /* for (i=0; i<nelems; i++) */
-                } else if (H5R_DSET_REG_REF_BUF_SIZE == msize) {
-                    hdset_reg_ref_t ref_out;
-
-                    for (i=0; i<(unsigned)nelmts; i++) {
-                        hdset_reg_ref_t *ptr = (hdset_reg_ref_t *)((hvl_t *)buf)[i].p;
-
-                        for (j=0; j<((hvl_t *)buf)[i].len; j++ ) {
-                            if (update_ref_value(attr_id, H5R_DATASET_REGION, &(ptr[j]), fidout, &ref_out, travt)<0)
-                                continue;
-                            HDmemcpy(&(ptr[j]), &ref_out, msize);
-                        }
-                    }  /* for (i=0; i<nelems; i++) */
-                }
-            } /* else if (is_ref_vlen) */
-            else if (is_ref_comp) {
-            	/* handle ref fields in a compound */
-
-                buf = HDmalloc((unsigned)(nelmts * msize));
-                refbuf = buf; /* reuse the read buffer for write */
-
-                if(buf == NULL)
-                {
-                    printf( "cannot read into memory\n" );
-                    goto error;
-                } /* end if */
-
-                if(H5Aread(attr_id, mtype_id, buf) < 0)
-                    goto error;
-
-                for (i=0; i<(unsigned)nelmts; i++) {
-                	for (j=0; j<(unsigned)ref_comp_field_n; j++) {
-                		if (ref_comp_size[j] == H5R_OBJ_REF_BUF_SIZE) {
-                			int idx = i*msize+H5Tget_member_offset( mtype_id, (unsigned)ref_comp_index[j]);
-                			hobj_ref_t ref_out;
-                			if (update_ref_value(attr_id, H5R_OBJECT, (hobj_ref_t *)(((char *)buf)+idx), fidout, &ref_out, travt)<0)
-                				continue;
-                			HDmemcpy(((char *)buf)+idx, &ref_out, ref_comp_size[j]);
-                 		} /* if */
-                		else if (ref_comp_size[j] == H5R_DSET_REG_REF_BUF_SIZE) {
-                			int idx = i*msize+H5Tget_member_offset( mtype_id, (unsigned)ref_comp_index[j]);
-                			hdset_reg_ref_t ref_out;
-                			if (update_ref_value(attr_id, H5R_DATASET_REGION, (hdset_reg_ref_t *)(((char *)buf)+idx), fidout, &ref_out, travt)<0)
-                				continue;
-                			HDmemcpy(((char *)buf)+idx, &ref_out, ref_comp_size[j]);
-                 		} /* else if */
-                	} /* j */
-                } /* i */
-            } /* else if (is_ref_comp) */
-
-            if(H5Awrite(attr_out, mtype_id, refbuf) < 0)
-                 goto error;
-
-            if (is_ref_vlen && buf)
-            	H5Dvlen_reclaim (mtype_id, space_id, H5P_DEFAULT, buf);
-        } /* if (nelmts) */
-
-        if (refbuf == buf)
-        	refbuf = NULL; /* set it to NULL to avoid double free since buf and refbuf are the same. */
-
-        if(buf) {
-            HDfree(buf);
-            buf = NULL;
-        }
-
-        if(refbuf) {
-            HDfree(refbuf);
-            refbuf = NULL;
-        }
-
-        if (ref_comp_index) {
-        	HDfree(ref_comp_index);
-        	ref_comp_index = NULL;
-        }
-
-        if (ref_comp_size) {
-        	HDfree(ref_comp_size);
-        	ref_comp_size = NULL;
-        }
-
-        if(H5Aclose(attr_out) < 0)
-            goto error;
-
-        /*-------------------------------------------------------------------------
-        * close
-        *-------------------------------------------------------------------------
-        */
-        if(H5Tclose(ftype_id) < 0)
-            goto error;
-        if(H5Tclose(mtype_id) < 0)
-            goto error;
-        if(H5Sclose(space_id) < 0)
-            goto error;
-        if(H5Aclose(attr_id) < 0)
-            goto error;
-    } /* for(u = 0; u < (unsigned)oinfo.num_attrs; u++) */
-
-    return 0;
-
-error:
-	if(refbuf)
-		HDfree(refbuf);
-	if(buf)
-		HDfree(buf);
-
-    if (ref_comp_index)
-    	HDfree(ref_comp_index);
-
-    if (ref_comp_size)
-    	HDfree(ref_comp_size);
-
-    H5E_BEGIN_TRY {
-        H5Tclose(ftype_id);
-        H5Tclose(mtype_id);
-        H5Sclose(space_id);
-        H5Aclose(attr_id);
-        H5Aclose(attr_out);
-    } H5E_END_TRY;
-
-    return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function:	MapIdToName
- *
- * Purpose:	map a ID from a reference to a dataset name
- *
- *-------------------------------------------------------------------------
- */
-static const char*
-MapIdToName(hid_t refobj_id, trav_table_t *travt)
-{
-    unsigned int u;
-    const char* ret = NULL;
-
-    /* linear search */
-    for(u = 0; u < travt->nobjs; u++) {
-        if(travt->objs[u].type == (h5trav_type_t)H5O_TYPE_DATASET ||
-                travt->objs[u].type == (h5trav_type_t)H5O_TYPE_GROUP ||
-                travt->objs[u].type == (h5trav_type_t)H5O_TYPE_NAMED_DATATYPE) {
-            H5O_info_t   ref_oinfo;     /* Stat for the refobj id */
-
-            /* obtain information to identify the referenced object uniquely */
-            if(H5Oget_info(refobj_id, &ref_oinfo) < 0)
-                goto out;
-
-            if(ref_oinfo.addr == travt->objs[u].objno) {
-                ret = travt->objs[u].name;
-                goto out;
-            } /* end if */
-        }  /* end if */
-    } /* u */
-
-out:
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
- * Function:	Update_Ref_value
- *
- * Purpose:	Update a reference value
- *
- * Programmer: xcao at hdfgroup.org 9/12/2011
- *
- *-------------------------------------------------------------------------
- */
-static herr_t update_ref_value(hid_t obj_id, H5R_type_t ref_type, void *ref_in,
-		hid_t fid_out, void *ref_out, trav_table_t *travt)
-{
-	herr_t ret = -1;
-	const char* ref_obj_name;
-	hid_t space_id=-1, ref_obj_id=-1;
-
-    ref_obj_id = H5Rdereference2(obj_id, H5P_DEFAULT, ref_type, ref_in);
-    if (ref_obj_id<0)
-       goto done;
-
-	ref_obj_name = MapIdToName(ref_obj_id, travt);
-	if (ref_obj_name == NULL)
-		goto done;
-
-	if (ref_type == H5R_DATASET_REGION) {
-		space_id = H5Rget_region(obj_id, H5R_DATASET_REGION, ref_in);
-		if (space_id < 0)
-			goto done;
-	}
-
-    ret = H5Rcreate(ref_out, fid_out, ref_obj_name, ref_type, space_id);
-
-    if (ret < 0)
-    	goto done;
-
-	ret = 0;
-
-done:
-    H5E_BEGIN_TRY {
-      H5Sclose(space_id);
-      H5Oclose(ref_obj_id);
-    } H5E_END_TRY;
-
-	return ret;
-}
-
diff --git a/tools/h5repack/h5repack_verify.c b/tools/h5repack/h5repack_verify.c
deleted file mode 100644
index 52423f1..0000000
--- a/tools/h5repack/h5repack_verify.c
+++ /dev/null
@@ -1,702 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-/* number of members in an array */
-#ifndef NELMTS
-#    define NELMTS(X)    (sizeof(X)/sizeof(X[0]))
-#endif
-
-static int verify_layout(hid_t pid, pack_info_t *obj);
-static int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter);
-
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_verify
- *
- * Purpose: verify if filters and layout in the input file match the output file
- *
- * Return:
- *  1 match
- *  0 do not match
- * -1 error
- *
- * Programmer: Pedro Vicente, pvn at hdfgroup.org
- *
- * Date: December 19, 2003
- *  Modified: December, 19, 2007 (exactly 4 years later :-) )
- *  Separate into 3 cases
- *  1) no filter input, get all datasets and compare DCPLs. TO DO
- *  2) filter input on selected datasets, get each one trough OBJ and match
- *  3) filter input on all datasets, get all objects and match
- *
- *-------------------------------------------------------------------------
- */
-
-int
-h5repack_verify(const char *in_fname, const char *out_fname, pack_opt_t *options)
-{
-    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 )
-        return -1;
-
-    for(i = 0; i < options->op_tbl->nelems; i++)
-    {
-        char* name = options->op_tbl->objs[i].path;
-        pack_info_t *obj = &options->op_tbl->objs[i];
-
-       /*-------------------------------------------------------------------------
-        * open
-        *-------------------------------------------------------------------------
-        */
-        if((did = H5Dopen2(fidout, name, H5P_DEFAULT)) < 0)
-            goto error;
-        if((sid = H5Dget_space(did)) < 0)
-            goto error;
-        if((pid = H5Dget_create_plist(did)) < 0)
-            goto error;
-        if((tid = H5Dget_type(did)) < 0)
-            goto error;
-
-       /*-------------------------------------------------------------------------
-        * filter check
-        *-------------------------------------------------------------------------
-        */
-        if(verify_filters(pid, tid, obj->nfilters, obj->filter) <= 0)
-                ok = 0;
-
-
-       /*-------------------------------------------------------------------------
-        * layout check
-        *-------------------------------------------------------------------------
-        */
-        if((obj->layout != -1) && (verify_layout(pid, obj) == 0))
-            ok = 0;
-
-       /*-------------------------------------------------------------------------
-        * close
-        *-------------------------------------------------------------------------
-        */
-        if(H5Pclose(pid) < 0)
-            goto error;
-        if (H5Sclose(sid) < 0)
-            goto error;
-        if (H5Dclose(did) < 0)
-            goto error;
-        if (H5Tclose(tid) < 0)
-            goto error;
-
-    }
-
-
-   /*-------------------------------------------------------------------------
-    * check for the "all" objects option
-    *-------------------------------------------------------------------------
-    */
-
-    if(options->all_filter == 1 || options->all_layout == 1)
-    {
-
-        /* init table */
-        trav_table_init(&travt);
-
-        /* get the list of objects in the file */
-        if(h5trav_gettable(fidout, travt) < 0)
-            goto error;
-
-        for(i = 0; i < travt->nobjs; i++)
-        {
-            char *name = travt->objs[i].name;
-
-            if(travt->objs[i].type == H5TRAV_TYPE_DATASET)
-            {
-
-               /*-------------------------------------------------------------------------
-                * open
-                *-------------------------------------------------------------------------
-                */
-                if((did = H5Dopen2(fidout, name, H5P_DEFAULT)) < 0)
-                    goto error;
-                if((sid = H5Dget_space(did)) < 0)
-                    goto error;
-                if((pid = H5Dget_create_plist(did)) < 0)
-                    goto error;
-                if((tid = H5Dget_type(did)) < 0)
-                    goto error;
-
-               /*-------------------------------------------------------------------------
-                * filter check
-                *-------------------------------------------------------------------------
-                */
-                if(options->all_filter == 1)
-                {
-
-                    if(verify_filters(pid, tid, options->n_filter_g, options->filter_g) <= 0)
-                        ok = 0;
-                }
-
-               /*-------------------------------------------------------------------------
-                * layout check
-                *-------------------------------------------------------------------------
-                */
-                if(options->all_layout == 1)
-                {
-                    pack_info_t pack;
-                    init_packobject(&pack);
-                    pack.layout = options->layout_g;
-                    pack.chunk = options->chunk_g;
-                    if(verify_layout(pid, &pack) == 0)
-                        ok = 0;
-                }
-
-
-               /*-------------------------------------------------------------------------
-                * close
-                *-------------------------------------------------------------------------
-                */
-                if (H5Pclose(pid) < 0)
-                    goto error;
-                if (H5Sclose(sid) < 0)
-                    goto error;
-                if (H5Dclose(did) < 0)
-                    goto error;
-                if (H5Tclose(tid) < 0)
-                    goto error;
-            } /* if */
-
-        } /* i */
-
-        /* free table */
-        trav_table_free(travt);
-    }
-
-   /*-------------------------------------------------------------------------
-    * 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;
-
-    return ok;
-
-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);
-    } H5E_END_TRY;
-    return -1;
-} /* h5repack_verify() */
-
-
-
-/*-------------------------------------------------------------------------
- * Function: verify_layout
- *
- * Purpose: verify which layout is present in the property list DCPL_ID
- *
- *  H5D_COMPACT      = 0
- *  H5D_CONTIGUOUS  = 1
- *  H5D_CHUNKED    = 2
- *
- * Return: 1 has, 0 does not, -1 error
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: December 30, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int verify_layout(hid_t pid,
-                  pack_info_t *obj)
-{
-    hsize_t      chsize[64];     /* chunk size in elements */
-    H5D_layout_t layout;         /* layout */
-    int          nfilters;       /* number of filters */
-    int          rank;           /* rank */
-    int          i;              /* index */
-
-    /* check if we have filters in the input object */
-    if ((nfilters = H5Pget_nfilters(pid)) < 0)
-        return -1;
-
-    /* a non chunked layout was requested on a filtered object */
-    if (nfilters && obj->layout!=H5D_CHUNKED)
-        return 0;
-
-    /* get layout */
-    if ((layout = H5Pget_layout(pid)) < 0)
-        return -1;
-
-    if (obj->layout != layout)
-        return 0;
-
-    if (layout==H5D_CHUNKED)
-    {
-        if ((rank = H5Pget_chunk(pid,NELMTS(chsize),chsize/*out*/)) < 0)
-            return -1;
-        if (obj->chunk.rank != rank)
-            return 0;
-        for ( i=0; i<rank; i++)
-            if (chsize[i] != obj->chunk.chunk_lengths[i])
-                return 0;
-    }
-
-    return 1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5repack_cmp_pl
- *
- * Purpose: compare 2 files for identical property lists of all objects
- *
- * Return: 1=identical, 0=not identical, -1=error
- *
- * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
- *
- * Date: December 31, 2003
- *
- *-------------------------------------------------------------------------
- */
-
-int h5repack_cmp_pl(const char *fname1,
-                     const char *fname2)
-{
-    hid_t         fid1=-1;         /* file ID */
-    hid_t         fid2=-1;         /* file ID */
-    hid_t         dset1=-1;        /* dataset ID */
-    hid_t         dset2=-1;        /* dataset ID */
-    hid_t         gid=-1;          /* group ID */
-    hid_t         dcpl1=-1;        /* dataset creation property list ID */
-    hid_t         dcpl2=-1;        /* dataset creation property list ID */
-    hid_t         gcplid=-1;       /* group creation property list */
-    unsigned      crt_order_flag1; /* group creation order flag */
-    unsigned      crt_order_flag2; /* group creation order flag */
-    trav_table_t  *trav=NULL;
-    int           ret=1;
-    unsigned int  i;
-
-   /*-------------------------------------------------------------------------
-    * open the files
-    *-------------------------------------------------------------------------
-    */
-
-    /* disable error reporting */
-    H5E_BEGIN_TRY
-    {
-
-        /* Open the files */
-        if ((fid1=H5Fopen(fname1,H5F_ACC_RDONLY,H5P_DEFAULT)) < 0 )
-        {
-            error_msg("<%s>: %s\n", fname1, H5FOPENERROR );
-            return -1;
-        }
-        if ((fid2=H5Fopen(fname2,H5F_ACC_RDONLY,H5P_DEFAULT)) < 0 )
-        {
-            error_msg("<%s>: %s\n", fname2, H5FOPENERROR );
-            H5Fclose(fid1);
-            return -1;
-        }
-        /* enable error reporting */
-    } H5E_END_TRY;
-
-   /*-------------------------------------------------------------------------
-    * get file table list of objects
-    *-------------------------------------------------------------------------
-    */
-    trav_table_init(&trav);
-    if(h5trav_gettable(fid1, trav) < 0)
-        goto error;
-
-   /*-------------------------------------------------------------------------
-    * traverse the suppplied object list
-    *-------------------------------------------------------------------------
-    */
-    for(i = 0; i < trav->nobjs; i++)
-    {
-
-        if(trav->objs[i].type == H5TRAV_TYPE_GROUP)
-        {
-
-            if ((gid = H5Gopen2(fid1, trav->objs[i].name, H5P_DEFAULT)) < 0)
-                goto error;
-            if ((gcplid = H5Gget_create_plist(gid)) < 0)
-                goto error;
-            if (H5Pget_link_creation_order(gcplid, &crt_order_flag1) < 0)
-                goto error;
-            if (H5Pclose(gcplid) < 0)
-                goto error;
-            if (H5Gclose(gid) < 0)
-                goto error;
-
-            if ((gid = H5Gopen2(fid2, trav->objs[i].name, H5P_DEFAULT)) < 0)
-                goto error;
-            if ((gcplid = H5Gget_create_plist(gid)) < 0)
-                goto error;
-            if (H5Pget_link_creation_order(gcplid, &crt_order_flag2) < 0)
-                goto error;
-            if (H5Pclose(gcplid) < 0)
-                goto error;
-            if (H5Gclose(gid) < 0)
-                goto error;
-
-            if ( crt_order_flag1 != crt_order_flag2 )
-            {
-                error_msg("property lists for <%s> are different\n",trav->objs[i].name);
-                goto error;
-            }
-
-        }
-
-
-
-        else if(trav->objs[i].type == H5TRAV_TYPE_DATASET)
-        {
-            if((dset1 = H5Dopen2(fid1, trav->objs[i].name, H5P_DEFAULT)) < 0)
-                goto error;
-            if((dset2 = H5Dopen2(fid2, trav->objs[i].name, H5P_DEFAULT)) < 0)
-                goto error;
-            if((dcpl1 = H5Dget_create_plist(dset1)) < 0)
-                goto error;
-            if((dcpl2 = H5Dget_create_plist(dset2)) < 0)
-                goto error;
-
-           /*-------------------------------------------------------------------------
-            * compare the property lists
-            *-------------------------------------------------------------------------
-            */
-            if((ret = H5Pequal(dcpl1, dcpl2)) < 0)
-                goto error;
-
-            if(ret == 0)
-            {
-                error_msg("property lists for <%s> are different\n",trav->objs[i].name);
-                goto error;
-            }
-
-           /*-------------------------------------------------------------------------
-            * close
-            *-------------------------------------------------------------------------
-            */
-            if(H5Pclose(dcpl1) < 0)
-                goto error;
-            if(H5Pclose(dcpl2) < 0)
-                goto error;
-            if(H5Dclose(dset1) < 0)
-                goto error;
-            if(H5Dclose(dset2) < 0)
-                goto error;
-        } /*if*/
-    } /*i*/
-
-   /*-------------------------------------------------------------------------
-    * free
-    *-------------------------------------------------------------------------
-    */
-
-    trav_table_free(trav);
-
-   /*-------------------------------------------------------------------------
-    * close
-    *-------------------------------------------------------------------------
-    */
-
-    H5Fclose(fid1);
-    H5Fclose(fid2);
-    return ret;
-
-   /*-------------------------------------------------------------------------
-    * error
-    *-------------------------------------------------------------------------
-    */
-
-error:
-    H5E_BEGIN_TRY
-    {
-        H5Pclose(dcpl1);
-        H5Pclose(dcpl2);
-        H5Dclose(dset1);
-        H5Dclose(dset2);
-        H5Fclose(fid1);
-        H5Fclose(fid2);
-        H5Pclose(gcplid);
-        H5Gclose(gid);
-        trav_table_free(trav);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: verify_filters
- *
- * Purpose: verify if all requested filters in the array FILTER obtained
- *  from user input are present in the property list PID obtained from
- *  the output file
- *
- * Return:
- *  1 match
- *  0 do not match
- * -1 error
- *
- * Programmer: Pedro Vicente, pvn at hdfgroup.org
- *
- * Date: December 21, 2007
- *
- *-------------------------------------------------------------------------
- */
-
-static
-int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter)
-{
-    int           nfilters_dcpl;  /* number of filters in DCPL*/
-    unsigned      filt_flags;     /* filter flags */
-    H5Z_filter_t  filtn;          /* filter identification number */
-    unsigned      cd_values[20];  /* filter client data values */
-    size_t        cd_nelmts;      /* filter client number of values */
-    char          f_name[256];    /* filter name */
-    size_t        size;           /* type size */
-    int           i;              /* index */
-    unsigned      j;              /* index */
-
-    /* get information about filters */
-    if((nfilters_dcpl = H5Pget_nfilters(pid)) < 0)
-        return -1;
-
-    /* if we do not have filters and the requested filter is NONE, return 1 */
-    if(!nfilters_dcpl &&
-        nfilters == 1 &&
-        filter[0].filtn == H5Z_FILTER_NONE )
-        return 1;
-
-    /* else the numbers of filters must match */
-    if (nfilters_dcpl != nfilters )
-        return 0;
-
-    /*-------------------------------------------------------------------------
-     * build a list with DCPL filters
-     *-------------------------------------------------------------------------
-     */
-
-    for( i = 0; i < nfilters_dcpl; i++)
-    {
-        cd_nelmts = NELMTS(cd_values);
-        filtn = H5Pget_filter2(pid, (unsigned)i, &filt_flags, &cd_nelmts,
-            cd_values, sizeof(f_name), f_name, NULL);
-
-        /* filter ID */
-        if (filtn != filter[i].filtn)
-            return 0;
-
-        /* compare client data values. some filters do return local values */
-        switch (filtn)
-        {
-
-        case H5Z_FILTER_NONE:
-        	break;
-
-        case H5Z_FILTER_SHUFFLE:
-
-            /* 1 private client value is returned by DCPL */
-            if ( cd_nelmts != H5Z_SHUFFLE_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SHUFFLE_USER_NPARMS )
-                return 0;
-
-            /* get dataset's type size */
-            if((size = H5Tget_size(tid)) <= 0)
-                return -1;
-
-            /* the private client value holds the dataset's type size */
-            if ( size != cd_values[0] )
-                return 0;
-
-
-            break;
-
-        case H5Z_FILTER_SZIP:
-
-            /* 4 private client values are returned by DCPL */
-            if ( cd_nelmts != H5Z_SZIP_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SZIP_USER_NPARMS )
-                return 0;
-
-            /* "User" parameter for pixels-per-block (index 1) */
-            if ( cd_values[H5Z_SZIP_PARM_PPB] != filter[i].cd_values[H5Z_SZIP_PARM_PPB] )
-                return 0;
-
-
-            break;
-
-        case H5Z_FILTER_NBIT:
-
-            /* only client data values number of values checked */
-            if ( H5Z_NBIT_USER_NPARMS != filter[i].cd_nelmts)
-                return 0;
-
-
-
-            break;
-
-        case H5Z_FILTER_SCALEOFFSET:
-
-            /* only client data values checked */
-            for( j = 0; j < H5Z_SCALEOFFSET_USER_NPARMS; j++)
-            {
-                if (cd_values[j] != filter[i].cd_values[j])
-                {
-                    return 0;
-                }
-
-            }
-
-
-            break;
-
-        /* for these filters values must match, no local values set in DCPL */
-        case H5Z_FILTER_FLETCHER32:
-        case H5Z_FILTER_DEFLATE:
-
-            if ( cd_nelmts != filter[i].cd_nelmts)
-                return 0;
-
-            for( j = 0; j < cd_nelmts; j++)
-            {
-                if (cd_values[j] != filter[i].cd_values[j])
-                {
-                    return 0;
-                }
-
-            }
-
-
-
-            break;
-
-        default:
-			if ( cd_nelmts != filter[i].cd_nelmts)
-				return 0;
-
-			for( j = 0; j < cd_nelmts; j++)
-			{
-				if (cd_values[j] != filter[i].cd_values[j])
-				{
-					return 0;
-				}
-
-			}
-            break;
-
-        } /* switch */
-
-    }
-
-    return 1;
-}
-
diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c
deleted file mode 100644
index 07ea676..0000000
--- a/tools/h5repack/h5repacktst.c
+++ /dev/null
@@ -1,6884 +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.     *
-* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "h5repack.h"
-#include "h5test.h"
-#include "h5diff.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-#define GOERROR  {H5_FAILED(); goto error;}
-
-
-/* fill value test */
-#define FNAME0     "h5repack_fill.h5"
-#define FNAME0OUT  "h5repack_fill_out.h5"
-/* HDF5 objects and all dataset datatypes */
-#define FNAME1     "h5repack_objs.h5"
-#define FNAME1OUT  "h5repack_objs_out.h5"
-/* attributes, all datatypes  */
-#define FNAME2     "h5repack_attr.h5"
-#define FNAME2OUT  "h5repack_attr_out.h5"
-/* hard links  */
-#define FNAME3     "h5repack_hlink.h5"
-#define FNAME3OUT  "h5repack_hlink_out.h5"
-/* layout  */
-#define FNAME4     "h5repack_layout.h5"
-#define FNAME4OUT  "h5repack_layout_out.h5"
-/* H5D_ALLOC_TIME_EARLY  */
-#define FNAME5     "h5repack_early.h5"
-#define FNAME5OUT  "h5repack_early_out.h5"
-#define FNAME6     "h5repack_early2.h5"
-#ifdef H5_HAVE_FILTER_SZIP
-/* SZIP filter  */
-#define FNAME7     "h5repack_szip.h5"
-#define FNAME7OUT  "h5repack_szip_out.h5"
-#endif
-/* GZIP filter  */
-#define FNAME8     "h5repack_deflate.h5"
-#define FNAME8OUT  "h5repack_deflate_out.h5"
-/* GZIP filter  */
-#define FNAME9     "h5repack_shuffle.h5"
-#define FNAME9OUT  "h5repack_shuffle_out.h5"
-/* Fletcher filter  */
-#define FNAME10    "h5repack_fletcher.h5"
-#define FNAME10OUT "h5repack_fletcher_out.h5"
-/* All filters  */
-#define FNAME11    "h5repack_filters.h5"
-#define FNAME11OUT "h5repack_filters_out.h5"
-/* NBit filter  */
-#define FNAME12    "h5repack_nbit.h5"
-#define FNAME12OUT "h5repack_nbit_out.h5"
-/* Scale Offset filter  */
-#define FNAME13    "h5repack_soffset.h5"
-#define FNAME13OUT "h5repack_soffset_out.h5"
-/* Big file to test read by hyperslabs  */
-#define FNAME14    "h5repack_big.h5"
-#define FNAME14OUT "h5repack_big_out.h5"
-/* external file  */
-#define FNAME15    "h5repack_ext.h5"
-#define FNAME15OUT "h5repack_ext_out.h5"
-/* File w/userblock */
-#define FNAME16    "h5repack_ub.h5"
-#define FNAME16OUT "h5repack_ub_out.h5"
-/* Named datatypes */
-#define FNAME17     "h5repack_named_dtypes.h5"
-#define FNAME17OUT  "h5repack_named_dtypes_out.h5"
-
-#define FNAME18     "h5repack_layout2.h5"
-
-#define FNAME_UB   "ublock.bin"
-
-/* obj and region references */
-#define FNAME_REF   "h5repack_refs.h5"
-
-/* obj and region references in attr of compound and vlen type */
-#define FNAME_ATTR_REF   "h5repack_attr_refs.h5"
-
-const char *H5REPACK_FILENAMES[] = {
-    "h5repack_big_out",
-    NULL
-};
-
-#define H5REPACK_EXTFILE "h5repack_ext.bin"
-
-/* Name of tool */
-#define PROGRAMNAME "h5repacktst"
-
-
-#define DIM1    40
-#define DIM2    20
-#define CDIM1   DIM1/2
-#define CDIM2   DIM2/2
-#define RANK    2
-
-/* Size of userblock (for userblock test) */
-#define USERBLOCK_SIZE  2048
-
-/* obj and region references */
-#define NAME_OBJ_DS1 "Dset1"
-#define NAME_OBJ_GRP "Group"
-#define NAME_OBJ_NDTYPE "NamedDatatype"
-#define NAME_OBJ_DS2 "Dset2"
-#define REG_REF_DS1 "Dset_REGREF"
-
-/*-------------------------------------------------------------------------
-* prototypes
-*-------------------------------------------------------------------------
-*/
-static int make_all_objects(hid_t loc_id);
-static int make_attributes(hid_t loc_id);
-static int make_hlinks(hid_t loc_id);
-static int make_early(void);
-static int make_layout(hid_t loc_id);
-static int make_layout2(hid_t loc_id);
-static int make_layout3(hid_t loc_id);
-#ifdef H5_HAVE_FILTER_SZIP
-static int make_szip(hid_t loc_id);
-#endif /* H5_HAVE_FILTER_SZIP */
-static int make_deflate(hid_t loc_id);
-static int make_shuffle(hid_t loc_id);
-static int make_fletcher32(hid_t loc_id);
-static int make_nbit(hid_t loc_id);
-static int make_scaleoffset(hid_t loc_id);
-static int make_all_filters(hid_t loc_id);
-static int make_fill(hid_t loc_id);
-static int make_big(hid_t loc_id);
-static int make_testfiles(void);
-static int write_dset_in(hid_t loc_id,const char* dset_name,hid_t file_id,int make_diffs );
-static int write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs );
-static int write_dset(hid_t loc_id,int rank,hsize_t *dims,const char *dset_name,hid_t tid,void *buf );
-static int make_dset(hid_t loc_id,const char *name,hid_t sid,hid_t dcpl,void *buf);
-static int make_attr(hid_t loc_id,int rank,hsize_t *dims,const char *attr_name,hid_t tid,void *buf);
-static int make_dset_reg_ref(hid_t loc_id);
-static int make_external(hid_t loc_id);
-static int make_userblock(void);
-static int verify_userblock( const char* filename);
-static int make_userblock_file(void);
-static int make_named_dtype(hid_t loc_id);
-static int make_references(hid_t loc_id);
-static int make_complex_attr_references(hid_t loc_id);
-
-
-/*-------------------------------------------------------------------------
-* Function: main
-*
-* Purpose: Executes h5repack tests
-*
-* Return: Success: zero
-*  Failure: 1
-*
-* Programmer:  Pedro Vicente <pvn at ncsa.uiuc.edu>
-*             January, 6, 2004
-*
-*-------------------------------------------------------------------------
-*/
-
-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)
-    int szip_can_encode = 0;
-#endif
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    /* initialize */
-    HDmemset(&diff_options, 0, sizeof (diff_opt_t));
-    HDmemset(&pack_options, 0, sizeof (pack_opt_t));
-
-    /* run tests  */
-    puts("Testing h5repack:");
-
-    /* make the test files */
-    TESTING("    generating datasets");
-    if (make_testfiles() < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * Format of the tests:
-    *
-    * 1) make a copy of the file with h5repack
-    * 2) use the h5diff function to compare the input and output file
-    *-------------------------------------------------------------------------
-    */
-
-
-    /*-------------------------------------------------------------------------
-    * file with fill values
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    copy of datasets (fill values)");
-
-    /* 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(FNAME0, FNAME0OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_cmp_pl(FNAME0,FNAME0OUT)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * file with all kinds of dataset datatypes
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    copy of datasets (all datatypes)");
-    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(FNAME1, FNAME1OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_cmp_pl(FNAME1,FNAME1OUT)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * file with attributes
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    copy of datasets (attributes)");
-    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(FNAME2, FNAME2OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_cmp_pl(FNAME2,FNAME2OUT)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * file with hardlinks
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    copy of datasets (hardlinks)");
-    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(FNAME3, FNAME3OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_cmp_pl(FNAME3,FNAME3OUT)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * alloc early test
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    copy of allocation early file");
-    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(FNAME5, FNAME5OUT, &pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * the remaining files differ in the dcpl's
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * deflate
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    adding deflate filter (old_format)");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, 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;
-    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;
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    adding deflate filter to all");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
-        GOERROR;
-    if (h5repack_addlayout("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;
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-    /*-------------------------------------------------------------------------
-    * SZIP
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    adding szip filter");
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (h5tools_can_encode(H5Z_FILTER_SZIP) >0) {
-        szip_can_encode = 1;
-    }
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-            GOERROR;
-        if (h5repack_addfilter("dset2:SZIP=8,EC",&pack_options) < 0)
-            GOERROR;
-        if (h5repack_addlayout("dset2: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;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    adding szip filter to all");
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-            GOERROR;
-        if (h5repack_addfilter("SZIP=8,NN",&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;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-
-    TESTING("    addding shuffle filter");
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset1:SHUF",&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;
-
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    addding shuffle filter to all");
-
-    /* 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;
-    if (h5repack_addlayout("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;
-
-    PASSED();
-
-
-    TESTING("    adding checksum filter");
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset1:FLET",&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;
-
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-
-
-    TESTING("    adding checksum filter to all");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("FLET",&pack_options) < 0)
-        GOERROR;
-    if (h5repack_addlayout("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;
-
-    PASSED();
-
-
-    TESTING("    filter queue fletcher, shuffle, deflate, szip");
-
-    /*-------------------------------------------------------------------------
-    * add some filters
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset1:CHUNK 20x10",&pack_options) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset1:FLET",&pack_options) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset1:SHUF",&pack_options) < 0)
-        GOERROR;
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (szip_can_encode) {
-        if (h5repack_addfilter("dset1:SZIP=8,NN",&pack_options) < 0)
-            GOERROR;
-    }
-#endif
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-    if (h5repack_addfilter("dset1:GZIP=1",&pack_options) < 0)
-        GOERROR;
-#endif
-
-    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;
-
-    PASSED();
-
-
-    TESTING("    adding layout chunked (old format)");
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, 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;
-    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;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    adding layout chunked to all");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("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;
-
-    PASSED();
-
-    TESTING("    adding layout contiguous");
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset1:CONTI",&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;
-
-    PASSED();
-
-    TESTING("    adding layout contiguous to all");
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("CONTI",&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;
-
-    /*-------------------------------------------------------------------------
-    * do the same test for a file with filters (chunked)
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("CONTI",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-    TESTING("    adding layout compact");
-
-    /*-------------------------------------------------------------------------
-    * test an individual object option
-    *-------------------------------------------------------------------------
-    */
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset1:COMPA",&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;
-    PASSED();
-
-    TESTING("    adding layout compact to all");
-
-    /*-------------------------------------------------------------------------
-    * test all objects option
-    *-------------------------------------------------------------------------
-    */
-
-    /* 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;
-    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;
-
-    PASSED();
-
-
-    TESTING("    layout compact to contiguous conversion");
-
-    /*-------------------------------------------------------------------------
-    * layout compact to contiguous conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_compact:CONTI",&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;
-    PASSED();
-
-    TESTING("    layout compact to chunk conversion");
-
-    /*-------------------------------------------------------------------------
-    * layout compact to chunk conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_compact:CHUNK=2x5",&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;
-    PASSED();
-
-    TESTING("    layout compact to compact conversion");
-
-    /*-------------------------------------------------------------------------
-    * layout compact to compact conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_compact:COMPA",&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;
-    PASSED();
-
-    TESTING("    layout contiguous to compact conversion");
-    /*-------------------------------------------------------------------------
-    * layout contiguous to compact conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_contiguous:COMPA",&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;
-    PASSED();
-
-    TESTING("    layout contiguous to chunk conversion");
-    /*-------------------------------------------------------------------------
-    * layout contiguous to chunk conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_contiguous:CHUNK=3x6",&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;
-    PASSED();
-
-    TESTING("    layout contiguous to contiguous conversion");
-
-    /*-------------------------------------------------------------------------
-    * layout contiguous to contiguous conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_contiguous:CONTI",&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;
-    PASSED();
-
-    TESTING("    layout chunked to compact conversion");
-    /*-------------------------------------------------------------------------
-    * layout chunked to compact conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_chunk:COMPA",&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;
-    PASSED();
-
-    TESTING("    layout chunked to contiguous conversion");
-
-    /*-------------------------------------------------------------------------
-    * layout chunked to contiguous conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_chunk:CONTI",&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;
-    PASSED();
-
-    TESTING("    layout chunked to chunk conversion");
-    /*-------------------------------------------------------------------------
-    * layout chunked to chunked conversion
-    *-------------------------------------------------------------------------
-    */
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addlayout("dset_chunk:CHUNK=18x13",&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;
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * the following tests assume the input files have filters
-    * FNAME7
-    * FNAME8
-    * FNAME9
-    * FNAME10
-    * FNAME11
-    *-------------------------------------------------------------------------
-    */
-
-
-    TESTING("    copy of szip filter");
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (szip_can_encode) {
-  /* 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(FNAME7, FNAME7OUT,&pack_options)<=0)
-            GOERROR;
-        if (h5repack_cmp_pl(FNAME7,FNAME7OUT)<=0)
-            GOERROR;
-        if (h5repack_end (&pack_options) < 0)
-            GOERROR;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-    TESTING("    removing szip filter");
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-            GOERROR;
-        if (h5repack_addfilter("dset_szip:NONE",&pack_options) < 0)
-            GOERROR;
-        if (h5repack(FNAME7,FNAME7OUT,&pack_options) < 0)
-            GOERROR;
-        if (h5diff(FNAME7,FNAME7OUT,NULL,NULL,&diff_options) >0)
-            GOERROR;
-        if (h5repack_verify(FNAME7, FNAME7OUT,&pack_options)<=0)
-            GOERROR;
-        if (h5repack_end (&pack_options) < 0)
-            GOERROR;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-
-    TESTING("    copy of deflate filter");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-    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(FNAME8, FNAME8OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-
-    TESTING("    removing deflate filter");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, ++fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_deflate:NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-
-
-    TESTING("    copy of shuffle filter");
-
-    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(FNAME9, FNAME9OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    removing shuffle filter");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_shuffle:NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME9,FNAME9OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME9,FNAME9OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME9, FNAME9OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    copy of fletcher filter");
-
-    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(FNAME10, FNAME10OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    removing fletcher filter");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_fletcher32:NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME10,FNAME10OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME10,FNAME10OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME10, FNAME10OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    copy of nbit filter");
-
-    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(FNAME12, FNAME12OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    removing nbit filter");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_nbit:NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    adding nbit filter");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_int31:NBIT",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    copy of scaleoffset filter");
-
-    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(FNAME13, FNAME13OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    removing scaleoffset filter");
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("dset_scaleoffset:NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    TESTING("    adding scaleoffset filter");
-
-    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;
-    if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * file with all filters
-    *  dset_all
-    *  dset_deflate
-    *  dset_szip
-    *  dset_shuffle
-    *  dset_fletcher32
-    *-------------------------------------------------------------------------
-    */
-
-
-    TESTING("    filter conversion from deflate to szip");
-
-#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
-
-    if (szip_can_encode) {
-  /* 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;
-        if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
-            GOERROR;
-        if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
-            GOERROR;
-        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
-            GOERROR;
-        if (h5repack_end (&pack_options) < 0)
-            GOERROR;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-    TESTING("    filter conversion from szip to deflate");
-
-#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
-
-    if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-            GOERROR;
-        if (h5repack_addfilter("dset_szip:GZIP=1",&pack_options) < 0)
-            GOERROR;
-        if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
-            GOERROR;
-        if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
-            GOERROR;
-        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
-            GOERROR;
-        if (h5repack_end (&pack_options) < 0)
-            GOERROR;
-
-        PASSED();
-    } else {
-        SKIPPED();
-    }
-#else
-    SKIPPED();
-#endif
-
-
-    /*-------------------------------------------------------------------------
-    * test the NONE global option
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    removing all filters");
-
-#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("NONE",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-    /*-------------------------------------------------------------------------
-    * test a big file
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    big file");
-
-    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(FNAME14, FNAME14OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test external dataset
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    external datasets");
-    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(FNAME15, FNAME15OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test file with userblock
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    file with userblock");
-    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(FNAME16, FNAME16OUT, &pack_options) <= 0)
-        GOERROR;
-    if(verify_userblock(FNAME16OUT) < 0)
-        GOERROR;
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * test --latest options
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    latest file format options");
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    pack_options.latest=1;
-    pack_options.grp_compact=10;
-    pack_options.grp_indexed=5;
-    pack_options.msg_size[0] = 10;
-    pack_options.msg_size[1] = 20;
-    pack_options.msg_size[2] = 30;
-    pack_options.msg_size[3] = 40;
-    pack_options.msg_size[4] = 50;
-    if (h5repack(FNAME1,FNAME1OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) > 0)
-        GOERROR;
-    if (h5repack_verify(FNAME1, FNAME1OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * test several global filters
-    *-------------------------------------------------------------------------
-    */
-
-    TESTING("    several global filters");
-
-#if defined (H5_HAVE_FILTER_DEFLATE)
-
-    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-    if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
-        GOERROR;
-    if (h5repack_addfilter("SHUF",&pack_options) < 0)
-        GOERROR;
-    if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
-        GOERROR;
-    if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
-        GOERROR;
-    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
-        GOERROR;
-    if (h5repack_end (&pack_options) < 0)
-        GOERROR;
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-
-    /*-------------------------------------------------------------------------
-    * test file with userblock
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    file with added userblock");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-
-    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 */
-    pack_options.ublock_size = USERBLOCK_SIZE;
-    pack_options.ublock_filename = FNAME_UB;
-
-    if(h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
-        GOERROR;
-    if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
-        GOERROR;
-    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
-        GOERROR;
-    if(verify_userblock(FNAME8OUT) < 0)
-        GOERROR;
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-
-    /*-------------------------------------------------------------------------
-    * test file with aligment
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    file with aligment");
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-
-    if(h5repack_init(&pack_options, 0, FALSE, fs_type, fs_size) < 0)
-        GOERROR;
-
-    /* add the options for aligment */
-    pack_options.alignment = 1;
-    pack_options.threshold = 1;
-
-    if(h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
-        GOERROR;
-    if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
-        GOERROR;
-    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
-        GOERROR;
-
-    /* verify aligment */
-    {
-        hsize_t threshold;
-        hsize_t alignment;
-        hid_t fapl;
-        hid_t fid;
-
-        if (( fid = H5Fopen(FNAME8OUT, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
-            GOERROR;
-        if ((fapl = H5Fget_access_plist(fid)) < 0)
-            GOERROR;
-        if ( H5Pget_alignment(fapl, &threshold, &alignment  )  < 0)
-            GOERROR;
-        if ( threshold != 1 )
-            GOERROR;
-        if ( alignment != 1 )
-            GOERROR;
-        if ( H5Pclose(fapl) < 0)
-            GOERROR;
-        if (H5Fclose(fid) < 0)
-            GOERROR;
-
-    }
-
-
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-
-
-    PASSED();
-#else
-    SKIPPED();
-#endif
-
-    /*-------------------------------------------------------------------------
-    * test file with userblock
-    *-------------------------------------------------------------------------
-    */
-    TESTING("    file with committed datatypes");
-
-    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(FNAME17, FNAME17OUT, &pack_options) <= 0)
-        GOERROR;
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-
-
-    PASSED();
-
-    /*-------------------------------------------------------------------------
-    * 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, FALSE, H5F_FILE_SPACE_DEFAULT, (hsize_t)0) < 0)
-        GOERROR;
-    if(h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
-        GOERROR;
-    if(HDstat(FNAME4OUT, &file_stat) < 0)
-        GOERROR;
-    fsize1 = file_stat.st_size;
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-
-    /* run it again with metadata option */
-    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(FNAME4, FNAME4OUT, &pack_options) <= 0)
-        GOERROR;
-    /* record the file size of the output file */
-    if(HDstat(FNAME4OUT, &file_stat) < 0)
-        GOERROR;
-    fsize2 = file_stat.st_size;
-    /* verify second file size is larger than the first one */
-    if(fsize2 <= fsize1)
-        GOERROR;
-    if(h5repack_end(&pack_options) < 0)
-        GOERROR;
-    PASSED();
-
-
-    /*-------------------------------------------------------------------------
-    * clean temporary test files
-    *-------------------------------------------------------------------------
-    */
-    {
-        hid_t       fapl;
-
-        fapl = h5_fileaccess();
-        h5_clean_files(H5REPACK_FILENAMES, fapl);
-
-    }
-
-    puts("All h5repack tests passed.");
-
-    h5tools_close();
-
-    return 0;
-
-error:
-    puts("***** H5REPACK TESTS FAILED *****");
-    return 1;
-
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_testfiles
-*
-* Purpose: make a test file with all types of HDF5 objects,
-*   datatypes and filters
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_testfiles(void)
-{
-    hid_t  fid;
-
-    /*-------------------------------------------------------------------------
-    * create a file for general copy test
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME0,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_fill(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create another file for general copy test (all datatypes)
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_all_objects(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file for attributes copy test
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME2,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_attributes(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file for hard links test
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_hlinks(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file for layouts test
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME4,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_layout(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file for layout conversion test
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME18, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    if(make_layout2(fid) < 0)
-        goto out;
-
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * for test layout conversions form chunk with unlimited max dims
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate("h5repack_layout3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    if(make_layout3(fid) < 0)
-        goto out;
-
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file for the H5D_ALLOC_TIME_EARLY test
-    *-------------------------------------------------------------------------
-    */
-    if (make_early() < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * create a file with the SZIP filter
-    *-------------------------------------------------------------------------
-    */
-#ifdef H5_HAVE_FILTER_SZIP
-    if((fid = H5Fcreate(FNAME7,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_szip(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-#endif /* H5_HAVE_FILTER_SZIP */
-
-
-    /*-------------------------------------------------------------------------
-    * create a file with the deflate filter
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME8,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_deflate(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with the shuffle filter
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME9,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_shuffle(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with the fletcher32 filter
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME10,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_fletcher32(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with all the filters
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME11,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_all_filters(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with the nbit filter
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME12,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_nbit(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with the scaleoffset filter
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME13,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_scaleoffset(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a big dataset
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME14,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_big(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with external dataset
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME15,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_external(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with userblock
-    *-------------------------------------------------------------------------
-    */
-    if(make_userblock() < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * create a userblock file
-    *-------------------------------------------------------------------------
-    */
-    if(make_userblock_file() < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * create a file with named datatypes
-    *-------------------------------------------------------------------------
-    */
-    if((fid = H5Fcreate(FNAME17,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_named_dtype(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create obj and region reference type datasets (bug1814)
-    * add attribute with int type (bug1726)
-    * add attribute with obj and region reference type (bug1726)
-    *-------------------------------------------------------------------------*/
-    if((fid = H5Fcreate(FNAME_REF,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    /* create reference type datasets */
-    if (make_references(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a file with obj and region references in attribute of compound and 
-    * vlen datatype
-    *-------------------------------------------------------------------------*/
-    if((fid = H5Fcreate(FNAME_ATTR_REF,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
-        return -1;
-    if (make_complex_attr_references(fid) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        return -1;
-
-    return 0;
-
-out:
-    H5Fclose(fid);
-    return -1;
-}
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_all_objects
-*
-* Purpose: make a test file with all types of HDF5 objects
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_all_objects(hid_t loc_id)
-{
-    hid_t   did=-1;
-    hid_t   gid=-1;
-    hid_t   tid=-1;
-    hid_t   rid=-1;
-    hid_t   sid=-1;
-    hid_t   gcplid=-1;
-    hsize_t dims[1]={2};
-    /* compound datatype */
-    typedef struct s_t
-    {
-        int    a;
-        float  b;
-    } s_t;
-
-    /*-------------------------------------------------------------------------
-    * H5G_DATASET
-    *-------------------------------------------------------------------------
-    */
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "dset_referenced", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * H5G_GROUP
-    *-------------------------------------------------------------------------
-    */
-    if ((gid  = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Gclose(gid) < 0)
-        goto out;
-
-    /* create a group "g2" with H5P_CRT_ORDER_TRACKED set */
-    if ((gcplid = H5Pcreate(H5P_GROUP_CREATE)) < 0)
-        goto out;
-    if (H5Pset_link_creation_order(gcplid, H5P_CRT_ORDER_TRACKED) < 0)
-        goto out;
-    if ((gid = H5Gcreate2(loc_id, "g2", H5P_DEFAULT, gcplid, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Gclose(gid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5G_TYPE
-    *-------------------------------------------------------------------------
-    */
-
-    /* create a compound datatype */
-    if ((tid = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_INT) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_FLOAT) < 0)
-        goto out;
-    if (H5Tcommit2(loc_id, "type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5G_LINK
-    *-------------------------------------------------------------------------
-    */
-
-    if (H5Lcreate_soft("dset", loc_id, "link", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5G_UDLINK
-    *-------------------------------------------------------------------------
-    */
-    /* Create an external link. Other UD links are not supported by h5repack */
-    if (H5Lcreate_external("file", "path", loc_id, "ext_link", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * write a series of datasetes at root
-    *-------------------------------------------------------------------------
-    */
-
-    if ((rid  = H5Gopen2(loc_id, "/", H5P_DEFAULT)) < 0)
-        goto out;
-    if (write_dset_in(rid,"dset_referenced",loc_id,0) < 0)
-        goto out;
-    if (H5Gclose(rid) < 0)
-        goto out;
-
-    /* close */
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    if (H5Pclose(gcplid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Dclose(did);
-        H5Gclose(gid);
-        H5Gclose(rid);
-        H5Sclose(sid);
-        H5Tclose(tid);
-        H5Pclose(gcplid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_attributes
-*
-* Purpose: make a test file with all types of attributes
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_attributes(hid_t loc_id)
-{
-    hid_t   did=-1;
-    hid_t   gid=-1;
-    hid_t   rid=-1;
-    hid_t   sid=-1;
-    hsize_t dims[1]={2};
-
-    /*-------------------------------------------------------------------------
-    * H5G_DATASET
-    *-------------------------------------------------------------------------
-    */
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if ((did  = H5Dcreate2(loc_id, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5G_GROUP
-    *-------------------------------------------------------------------------
-    */
-    if ((gid  = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if ((rid   = H5Gopen2(loc_id, "/", H5P_DEFAULT)) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * write a series of attributes on the dataset, group, and root group
-    *-------------------------------------------------------------------------
-    */
-
-    if ( write_attr_in(did,"dset",loc_id,0) < 0)
-        goto out;
-    if (write_attr_in(gid,"dset",loc_id,0) < 0)
-        goto out;
-    if (write_attr_in(rid,"dset",loc_id,0) < 0)
-        goto out;
-
-   /* close */
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Gclose(gid) < 0)
-        goto out;
-    if (H5Gclose(rid) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Dclose(did);
-        H5Gclose(gid);
-        H5Gclose(rid);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_hlinks
-*
-* Purpose: make a test file with hard links
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_hlinks(hid_t loc_id)
-{
-    hid_t   g1id=-1;
-    hid_t   g2id=-1;
-    hid_t   g3id=-1;
-    hsize_t dims[2]={3,2};
-    int     buf[3][2]= {{1,1},{1,2},{2,2}};
-
-    /*-------------------------------------------------------------------------
-    * create a dataset and some hard links to it
-    *-------------------------------------------------------------------------
-    */
-
-    if(write_dset(loc_id, 2, dims, "dset", H5T_NATIVE_INT, buf) < 0)
-        return -1;
-    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link1 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        return -1;
-    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link2 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        return -1;
-    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link3 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        return -1;
-
-    /*-------------------------------------------------------------------------
-    * create a group and some hard links to it
-    *-------------------------------------------------------------------------
-    */
-
-    if((g1id = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if((g2id = H5Gcreate2(g1id, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if((g3id = H5Gcreate2(g2id, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    if(H5Lcreate_hard(loc_id, "g1", g2id, "link1 to g1", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-    if(H5Lcreate_hard(g1id, "g2", g3id, "link1 to g2", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-
-
-    /* close */
-    if (H5Gclose(g1id) < 0)
-        goto out;
-    if (H5Gclose(g2id) < 0)
-        goto out;
-    if (H5Gclose(g3id) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Gclose(g1id);
-        H5Gclose(g2id);
-        H5Gclose(g3id);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_szip
-*
-* Purpose: make a dataset with the SZIP filter
-*
-*-------------------------------------------------------------------------
-*/
-#ifdef H5_HAVE_FILTER_SZIP
-static
-int make_szip(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
-    unsigned szip_pixels_per_block=8;
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-    int      szip_can_encode = 0;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dcpl */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * SZIP
-    *-------------------------------------------------------------------------
-    */
-    /* Make sure encoding is enabled */
-    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1)
-    {
-        szip_can_encode = 1;
-    }
-    if (szip_can_encode)
-    {
-        /* set szip data */
-        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
-            goto out;
-        if (make_dset(loc_id,"dset_szip",sid,dcpl,buf) < 0)
-            goto out;
-    }
-    else
-    {
-        /* WARNING? SZIP is decoder only, can't generate test files */
-    }
-
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-#endif /* H5_HAVE_FILTER_SZIP */
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_deflate
-*
-* Purpose: make a dataset with the deflate filter
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_deflate(hid_t loc_id)
-{
-    hid_t      dcpl; /* dataset creation property list */
-    hid_t      sid;  /* dataspace ID */
-    hsize_t    dims[RANK]={DIM1,DIM2};
-    hsize_t    chunk_dims[RANK]={CDIM1,CDIM2};
-    int        buf[DIM1][DIM2];
-    hobj_ref_t bufref[1]; /* reference */
-    hsize_t    dims1r[1]={1};
-    int        i, j, n;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dcpl */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * GZIP
-    *-------------------------------------------------------------------------
-    */
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    /* set deflate data */
-    if(H5Pset_deflate(dcpl, 9) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_deflate",sid,dcpl,buf) < 0)
-        goto out;
-
-    /* create a reference to the dataset, test second seeep of file for references */
-
-    if (H5Rcreate(&bufref[0],loc_id,"dset_deflate",H5R_OBJECT,(hid_t)-1) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims1r,"ref",H5T_STD_REF_OBJ,bufref) < 0)
-        goto out;
-#endif
-
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_shuffle
-*
-* Purpose: make a dataset with the shuffle filter
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_shuffle(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dcpl */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * shuffle
-    *-------------------------------------------------------------------------
-    */
-
-    /* set the shuffle filter */
-    if (H5Pset_shuffle(dcpl) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_shuffle",sid,dcpl,buf) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_fletcher32
-*
-* Purpose: make a dataset with the fletcher32 filter
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_fletcher32(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * fletcher32
-    *-------------------------------------------------------------------------
-    */
-
-    /* remove the filters from the dcpl */
-    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
-        goto out;
-    /* set the checksum filter */
-    if (H5Pset_fletcher32(dcpl) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_fletcher32",sid,dcpl,buf) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_nbit
-*
-* Purpose: make a dataset with the nbit filter
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_nbit(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hid_t    dtid;
-    hid_t    dsid;
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    dtid = H5Tcopy(H5T_NATIVE_INT);
-    if (H5Tset_precision(dtid,(H5Tget_precision(dtid) - 1)) < 0)
-    {
-        H5Tclose(dtid);
-        goto out;
-    }
-
-    /* remove the filters from the dcpl */
-    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0)
-    {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Pset_nbit(dcpl) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    H5Dclose(dsid);
-
-    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if((dsid = H5Dcreate2(loc_id, "dset_int31", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    H5Dclose(dsid);
-
-    /*-------------------------------------------------------------------------
-    * close
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    if (H5Tclose(dtid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_scaleoffset
-*
-* Purpose: make a dataset with the scaleoffset filter
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_scaleoffset(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hid_t    dtid;
-    hid_t    dsid;
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    dtid = H5Tcopy(H5T_NATIVE_INT);
-
-    /* remove the filters from the dcpl */
-    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Pset_scaleoffset(dcpl, H5Z_SO_INT, 31) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if((dsid = H5Dcreate2(loc_id, "dset_scaleoffset", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    H5Dclose(dsid);
-    if((dsid = H5Dcreate2(loc_id, "dset_none", dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
-        H5Tclose(dtid);
-        goto out;
-    }
-    H5Tclose(dtid);
-    H5Dclose(dsid);
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_all_filters
-*
-* Purpose: make a file with all filters
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_all_filters(hid_t loc_id)
-{
-    hid_t    dcpl; /* dataset creation property list */
-    hid_t    sid;  /* dataspace ID */
-    hid_t    dtid;
-    hid_t    dsid;
-#if defined (H5_HAVE_FILTER_SZIP)
-    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
-    unsigned szip_pixels_per_block=8;
-#endif /* H5_HAVE_FILTER_SZIP */
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-#if defined (H5_HAVE_FILTER_SZIP)
-    int szip_can_encode = 0;
-#endif
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    /* set up chunk */
-    if (H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-
-    /* set the shuffle filter */
-    if (H5Pset_shuffle(dcpl) < 0)
-        goto out;
-
-    /* set the checksum filter */
-    if (H5Pset_fletcher32(dcpl) < 0)
-        goto out;
-
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1)
-    {
-        szip_can_encode = 1;
-    }
-    if (szip_can_encode)
-    {
-        /* set szip data */
-        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
-            goto out;
-    } else {
-        /* WARNING? SZIP is decoder only, can't generate test data using szip */
-    }
-#endif
-
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    /* set deflate data */
-    if(H5Pset_deflate(dcpl, 9) < 0)
-        goto out;
-#endif
-
-    if (make_dset(loc_id,"dset_all",sid,dcpl,buf) < 0)
-        goto out;
-
-    /* remove the filters from the dcpl */
-    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
-        goto out;
-    /* set the checksum filter */
-    if (H5Pset_fletcher32(dcpl) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_fletcher32",sid,dcpl,buf) < 0)
-        goto out;
-
-
-    /* Make sure encoding is enabled */
-#if defined (H5_HAVE_FILTER_SZIP)
-    if (szip_can_encode)
-    {
-        /* remove the filters from the dcpl */
-        if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
-            goto out;
-        /* set szip data */
-        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
-            goto out;
-        if (make_dset(loc_id,"dset_szip",sid,dcpl,buf) < 0)
-            goto out;
-    } else
-    {
-        /* WARNING? SZIP is decoder only, can't generate test dataset */
-    }
-#endif
-
-
-    /* remove the filters from the dcpl */
-    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
-        goto out;
-    /* set the shuffle filter */
-    if (H5Pset_shuffle(dcpl) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_shuffle",sid,dcpl,buf) < 0)
-        goto out;
-
-
-#if defined (H5_HAVE_FILTER_DEFLATE)
-    /* remove the filters from the dcpl */
-    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
-        goto out;
-    /* set deflate data */
-    if(H5Pset_deflate(dcpl, 1) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_deflate",sid,dcpl,buf) < 0)
-        goto out;
-#endif
-
-
-
-    /* remove the filters from the dcpl */
-    if (H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0)
-        goto out;
-    /* set the shuffle filter */
-    if (H5Pset_nbit(dcpl) < 0)
-        goto out;
-    if ((dtid = H5Tcopy(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if (H5Tset_precision(dtid, (H5Tget_precision(dtid) - 1)) < 0)
-        goto out;
-    if((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto out;
-
-    /* close */
-    if(H5Tclose(dtid) < 0)
-        return -1;
-    if(H5Dclose(dsid) < 0)
-        return -1;
-
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_early
-*
-* Purpose: create a file for the H5D_ALLOC_TIME_EARLY test
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_early(void)
-{
-    hsize_t dims[1] ={3000};
-    hsize_t cdims[1]={30};
-    hid_t   fid=-1;
-    hid_t   did=-1;
-    hid_t   sid=-1;
-    hid_t   tid=-1;
-    hid_t   dcpl=-1;
-    int     i;
-    char    name[10];
-    int     iter=100;
-
-    if ((fid = H5Fcreate(FNAME5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-    if (H5Fclose(fid) < 0)
-        goto out;
-
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if (H5Pset_chunk(dcpl, 1, cdims) < 0)
-        goto out;
-    if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
-        goto out;
-
-    for(i = 0; i < iter; i++)
-    {
-        if ((fid = H5Fopen(FNAME5, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
-            goto out;
-        if ((did = H5Dcreate2(fid, "early", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-            goto out;
-        if ((tid = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0)
-            goto out;
-        sprintf(name, "%d", i);
-        if ((H5Tcommit2(fid, name, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-        if (H5Tclose(tid) < 0)
-            goto out;
-        if (H5Dclose(did) < 0)
-            goto out;
-        if (H5Ldelete(fid, "early", H5P_DEFAULT) < 0)
-            goto out;
-        if (H5Fclose(fid) < 0)
-            goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * do the same without close/opening the file and creating the dataset
-    *-------------------------------------------------------------------------
-    */
-
-    if ((fid = H5Fcreate(FNAME6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        return -1;
-
-    for(i = 0; i < iter; i++)
-    {
-        if ((tid = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0)
-            goto out;
-        sprintf(name, "%d", i);
-        if ((H5Tcommit2(fid, name, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-        if (H5Tclose(tid) < 0)
-            goto out;
-    }
-
-    if (H5Sclose(sid) < 0)
-        goto out;
-    if (H5Pclose(dcpl) < 0)
-        goto out;
-    if (H5Fclose(fid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Tclose(tid);
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-        H5Dclose(did);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_layout
-*
-* Purpose: make several datasets with several layouts in location LOC_ID
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_layout(hid_t loc_id)
-{
-    hid_t    dcpl=-1; /* dataset creation property list */
-    hid_t    sid=-1;  /* dataspace ID */
-    hsize_t  dims[RANK]={DIM1,DIM2};
-    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
-    int      buf[DIM1][DIM2];
-    int      i, j, n;
-    char     name[6];
-
-
-    for (i=n=0; i<DIM1; i++)
-    {
-        for (j=0; j<DIM2; j++)
-        {
-            buf[i][j]=n++;
-        }
-    }
-
-    /*-------------------------------------------------------------------------
-    * make several dataset with no filters
-    *-------------------------------------------------------------------------
-    */
-    for (i=0; i<4; i++)
-    {
-        sprintf(name,"dset%d",i+1);
-        if (write_dset(loc_id,RANK,dims,name,H5T_NATIVE_INT,buf) < 0)
-            return -1;
-    }
-
-
-    /*-------------------------------------------------------------------------
-    * make several dataset with several layout options
-    *-------------------------------------------------------------------------
-    */
-    /* create a space */
-    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-    {
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5D_COMPACT
-    *-------------------------------------------------------------------------
-    */
-    if(H5Pset_layout (dcpl,H5D_COMPACT) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_compact",sid,dcpl,buf) < 0)
-    {
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5D_CONTIGUOUS
-    *-------------------------------------------------------------------------
-    */
-    if(H5Pset_layout (dcpl,H5D_CONTIGUOUS) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_contiguous",sid,dcpl,buf) < 0)
-    {
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5D_CHUNKED
-    *-------------------------------------------------------------------------
-    */
-    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
-        goto out;
-    if (make_dset(loc_id,"dset_chunk",sid,dcpl,buf) < 0)
-    {
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: make_layout2
- *
- * Purpose: create datasets with contiguous and chunked layouts:
- *
- *  contig_small: < 1k, fixed dims datspace
- *  chunked_small_fixed: < 1k, fixed dims dataspace
- *
- *-------------------------------------------------------------------------
- */
-#define S_DIM1  4
-#define S_DIM2  10
-#define CONTIG_S  "contig_small"
-#define CHUNKED_S_FIX  "chunked_small_fixed"
-
-static
-int make_layout2(hid_t loc_id)
-{
-
-    hid_t    contig_dcpl = -1;   /* dataset creation property list */
-    hid_t    chunked_dcpl = -1; /* dataset creation property list */
-
-    int      i, j, n;    /* Local index variables */
-    int       ret_value = -1;  /* Return value */
-    hid_t    s_sid = -1;  /* dataspace ID */
-
-    hsize_t  s_dims[RANK] = {S_DIM1,S_DIM2};  /* Dataspace (< 1 k) */
-    hsize_t  chunk_dims[RANK] = {S_DIM1/2, S_DIM2/2};  /* Dimension sizes for chunks */
-
-    int      s_buf[S_DIM1][S_DIM2];  /* Temporary buffer */
-
-    for(i = n = 0; i < S_DIM1; i++) {
-        for (j = 0; j < S_DIM2; j++) {
-            s_buf[i][j] = n++;
-        }
-    }
-
-    /* Create dataspaces */
-    if((s_sid = H5Screate_simple(RANK, s_dims, NULL)) < 0)
-        goto out;
-
-    /* Create contiguous datasets */
-    if((contig_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_layout(contig_dcpl, H5D_CONTIGUOUS) < 0)
-        goto out;
-    if(make_dset(loc_id, CONTIG_S, s_sid, contig_dcpl, s_buf) < 0)
-        goto out;
-
-    /* Create chunked datasets */
-    if((chunked_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_chunk(chunked_dcpl, RANK, chunk_dims) < 0)
-        goto out;
-    if(make_dset(loc_id, CHUNKED_S_FIX, s_sid, chunked_dcpl, s_buf) < 0)
-        goto out;
-
-    ret_value = 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(contig_dcpl);
-        H5Pclose(chunked_dcpl);
-    
-        H5Sclose(s_sid);
-
-    } H5E_END_TRY;
-
-    return(ret_value);
-
-} /* make_layout2() */
-
-/*-------------------------------------------------------------------------
-* Function: make_layout3
-*
-* Purpose: make chunked datasets with unlimited max dim and chunk dim is
-*          bigger than current dim. (HDFFV-7933)
-*          Test for converting chunk to chunk , chunk to conti and chunk
-*          to compact.  
-*          - The chunk to chunk changes layout bigger than any current dim 
-*            again. 
-*          - The chunk to compact test dataset bigger than 64K, should
-*            remain original layout.*
-*
-*-------------------------------------------------------------------------
-*/
-#define DIM1_L3 300
-#define DIM2_L3 200
-/* small size */
-#define SDIM1_L3 4
-#define SDIM2_L3 50
-static
-int make_layout3(hid_t loc_id)
-{
-    hid_t    dcpl1=-1; /* dataset creation property list */
-    hid_t    dcpl2=-1; /* dataset creation property list */
-    hid_t    dcpl3=-1; /* dataset creation property list */
-    hid_t    sid1=-1;  /* dataspace ID */
-    hid_t    sid2=-1;  /* dataspace ID */
-    hsize_t  dims1[RANK]={DIM1_L3,DIM2_L3};
-    hsize_t  dims2[RANK]={SDIM1_L3,SDIM2_L3};
-    hsize_t  maxdims[RANK]={H5S_UNLIMITED, H5S_UNLIMITED};
-    hsize_t  chunk_dims1[RANK]={DIM1_L3*2,5};
-    hsize_t  chunk_dims2[RANK]={SDIM1_L3 + 2, SDIM2_L3/2};
-    hsize_t  chunk_dims3[RANK]={SDIM1_L3 - 2, SDIM2_L3/2};
-    int      buf1[DIM1_L3][DIM2_L3];
-    int      buf2[SDIM1_L3][SDIM2_L3];
-    int      i, j, n;
-
-    /* init buf1 */
-    for (i=n=0; i<DIM1_L3; i++)
-    {
-        for (j=0; j<DIM2_L3; j++)
-        {
-            buf1[i][j]=n++;
-        }
-    }
-
-    /* init buf2 */
-    for (i=n=0; i<SDIM1_L3; i++)
-    {
-        for (j=0; j<SDIM2_L3; j++)
-        {
-            buf2[i][j]=n++;
-        }
-    }
-
-    /*-------------------------------------------------------------------------
-    * make chunked dataset with
-    *  - dset maxdims are UNLIMIT
-    *  - a chunk dim is bigger than dset dim
-    *  - dset size bigger than compact max (64K)
-    *-------------------------------------------------------------------------
-    */
-    /* create a space */
-    if((sid1 = H5Screate_simple(RANK, dims1, maxdims)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl1 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-    {
-        goto out;
-    }
-
-    if(H5Pset_chunk(dcpl1, RANK, chunk_dims1) < 0)
-        goto out;
-    if (make_dset(loc_id,"chunk_unlimit1",sid1,dcpl1,buf1) < 0)
-    {
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * make chunked dataset with
-    *  - dset maxdims are UNLIMIT
-    *  - a chunk dim is bigger than dset dim
-    *  - dset size smaller than compact (64K)
-    *-------------------------------------------------------------------------
-    */
-
-    /* create a space */
-    if((sid2 = H5Screate_simple(RANK, dims2, maxdims)) < 0)
-        return -1;
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-
-    if(H5Pset_chunk(dcpl2, RANK, chunk_dims2) < 0)
-        goto out;
-
-    if (make_dset(loc_id,"chunk_unlimit2",sid2,dcpl2,buf2) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * make chunked dataset with
-    *  - dset maxdims are UNLIMIT
-    *  - a chunk dims are smaller than dset dims
-    *  - dset size smaller than compact (64K)
-    *-------------------------------------------------------------------------
-    */
-    /* create a dataset creation property list; the same DCPL is used for all dsets */
-    if ((dcpl3 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-
-    if(H5Pset_chunk(dcpl3, RANK, chunk_dims3) < 0)
-        goto out;
-
-    if (make_dset(loc_id,"chunk_unlimit3",sid2,dcpl3,buf2) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * close space and dcpl
-    *-------------------------------------------------------------------------
-    */
-    if(H5Sclose(sid1) < 0)
-        goto out;
-    if(H5Sclose(sid2) < 0)
-        goto out;
-    if(H5Pclose(dcpl1) < 0)
-        goto out;
-    if(H5Pclose(dcpl2) < 0)
-        goto out;
-    if(H5Pclose(dcpl3) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Sclose(sid1);
-        H5Sclose(sid2);
-        H5Pclose(dcpl1);
-        H5Pclose(dcpl2);
-        H5Pclose(dcpl3);
-    } H5E_END_TRY;
-    return -1;
-}
-
-/*-------------------------------------------------------------------------
-* Function: make a file with an integer dataset with a fill value
-*
-* Purpose: test copy of fill values
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_fill(hid_t loc_id)
-{
-    hid_t   did=-1;
-    hid_t   sid=-1;
-    hid_t   dcpl;
-    hsize_t dims[2]={3,2};
-    int     buf[3][2]= {{1,1},{1,2},{2,2}};
-    int     fillvalue = 2;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER, write a fill value
-    *-------------------------------------------------------------------------
-    */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue) < 0)
-        goto out;
-    if((sid = H5Screate_simple(2,dims,NULL)) < 0)
-        goto out;
-    if((did = H5Dcreate2(loc_id, "dset_fill", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto out;
-
-    /* close */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-        H5Dclose(did);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_big
-*
-* Purpose: used in test read by hyperslabs. Creates a 128MB dataset.
-*  Only 1 1024Kb hyperslab is written.
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_big(hid_t loc_id)
-{
-    hid_t   did=-1;
-    hid_t   f_sid=-1;
-    hid_t   m_sid=-1;
-    hid_t   tid;
-    hid_t   dcpl;
-    hsize_t dims[1]={ H5TOOLS_MALLOCSIZE + 1}; /* dataset dimensions */
-    hsize_t hs_size[1];                     /* hyperslab dimensions */
-    hsize_t hs_start[1];                    /* hyperslab start */
-    hsize_t chunk_dims[1]={1024};           /* chunk dimensions */
-    size_t  size;
-    size_t  nelmts=(size_t)1024;
-    signed  char fillvalue=-1;
-    signed  char *buf=NULL;
-
-    /* write one 1024 byte hyperslab */
-    hs_start[0] = 0;
-    hs_size[0]  = 1024;
-
-    /* create */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_fill_value(dcpl, H5T_NATIVE_SCHAR, &fillvalue) < 0)
-        goto out;
-    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
-        goto out;
-    if((f_sid = H5Screate_simple(1,dims,NULL)) < 0)
-        goto out;
-    if((did = H5Dcreate2(loc_id, "dset", H5T_NATIVE_SCHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
-        goto out;
-    if((tid = H5Dget_type(did)) < 0)
-        goto out;
-    if((size = H5Tget_size(tid))<=0)
-        goto out;
-
-    /* initialize buffer to 0  */
-    buf=(signed  char *) HDcalloc( nelmts, size);
-
-    if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL) < 0)
-        goto out;
-    if (H5Dwrite (did,H5T_NATIVE_SCHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
-        goto out;
-
-    HDfree(buf);
-    buf=NULL;
-
-    /* close */
-    if(H5Sclose(f_sid) < 0)
-        goto out;
-    if(H5Sclose(m_sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(dcpl);
-        H5Sclose(f_sid);
-        H5Sclose(m_sid);
-        H5Dclose(did);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_external
-*
-* Purpose: create a external dataset
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_external(hid_t loc_id)
-{
-    hid_t   did=-1;
-    hid_t   sid=-1;
-    hid_t   dcpl;
-    int     buf[2]={1,2};
-    hsize_t cur_size[1];    /* data space current size  */
-    hsize_t max_size[1];    /* data space maximum size  */
-    hsize_t size;
-
-    cur_size[0] = max_size[0] = 2;
-    size = max_size[0] * sizeof(int);
-
-    /* create */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if(H5Pset_external(dcpl, H5REPACK_EXTFILE, (off_t)0, size) < 0)
-        goto out;
-    if((sid = H5Screate_simple(1,cur_size, max_size)) < 0)
-        goto out;
-    if((did = H5Dcreate2(loc_id, "external", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto out;
-
-    /* close */
-    if(H5Sclose(sid) < 0)
-        goto out;
-    if(H5Pclose(dcpl) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Pclose(dcpl);
-        H5Sclose(sid);
-        H5Dclose(did);
-    } H5E_END_TRY;
-    return -1;
-
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_userblock
-*
-* Purpose: create a file for the userblock copying test
-*
-*-------------------------------------------------------------------------
-*/
-static int
-make_userblock(void)
-{
-    hid_t   fid = -1;
-    hid_t   fcpl = -1;
-    int     fd = -1;            /* File descriptor for writing userblock */
-    char    ub[USERBLOCK_SIZE]; /* User block data */
-    ssize_t nwritten;           /* # of bytes written */
-    size_t  u;                  /* Local index variable */
-
-    /* Create file creation property list with userblock set */
-    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
-        goto out;
-    if(H5Pset_userblock(fcpl, (hsize_t)USERBLOCK_SIZE) < 0)
-        goto out;
-
-    /* Create file with userblock */
-    if((fid = H5Fcreate(FNAME16, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Fclose(fid) < 0)
-        goto out;
-
-    /* Close file creation property list */
-    if(H5Pclose(fcpl) < 0)
-        goto out;
-
-
-    /* Initialize userblock data */
-    for(u = 0; u < USERBLOCK_SIZE; u++)
-        ub[u] = 'a' + (char)(u % 26);
-
-    /* Re-open HDF5 file, as "plain" file */
-    if((fd = HDopen(FNAME16, O_WRONLY, 0644)) < 0)
-        goto out;
-
-    /* Write userblock data */
-    nwritten = HDwrite(fd, ub, (size_t)USERBLOCK_SIZE);
-    HDassert(nwritten == USERBLOCK_SIZE);
-
-    /* Close file */
-    HDclose(fd);
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(fcpl);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-    if(fd > 0)
-        HDclose(fd);
-
-    return -1;
-} /* end make_userblock() */
-
-/*-------------------------------------------------------------------------
-* Function: verify_userblock
-*
-* Purpose: Verify that the userblock was copied correctly
-*
-*-------------------------------------------------------------------------
-*/
-static int
-verify_userblock( const char* filename)
-{
-    hid_t   fid = -1;
-    hid_t   fcpl = -1;
-    int     fd = -1;            /* File descriptor for writing userblock */
-    char    ub[USERBLOCK_SIZE]; /* User block data */
-    hsize_t ub_size = 0;        /* User block size */
-    ssize_t nread;              /* # of bytes read */
-    size_t  u;                  /* Local index variable */
-
-    /* Open file with userblock */
-    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* Retrieve file creation property list & userblock size */
-    if((fcpl = H5Fget_create_plist(fid)) < 0)
-        goto out;
-    if(H5Pget_userblock(fcpl, &ub_size) < 0)
-        goto out;
-
-    /* Verify userblock size is correct */
-    if(ub_size != USERBLOCK_SIZE)
-        goto out;
-
-    /* Close file creation property list */
-    if(H5Pclose(fcpl) < 0)
-        goto out;
-
-    if(H5Fclose(fid) < 0)
-        goto out;
-
-
-    /* Re-open HDF5 file, as "plain" file */
-    if((fd = HDopen(filename, O_RDONLY, 0)) < 0)
-        goto out;
-
-    /* Read userblock data */
-    nread = HDread(fd, ub, (size_t)USERBLOCK_SIZE);
-    HDassert(nread == USERBLOCK_SIZE);
-
-    /* Verify userblock data */
-    for(u = 0; u < USERBLOCK_SIZE; u++)
-        if(ub[u] != (char)('a' + (u % 26)))
-            goto out;
-
-    /* Close file */
-    HDclose(fd);
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Pclose(fcpl);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-    if(fd > 0)
-        HDclose(fd);
-
-    return -1;
-} /* end verify_userblock() */
-
-
-/*-------------------------------------------------------------------------
-* Function: make_userblock_file
-*
-* Purpose: create a file for the userblock add test
-*
-*-------------------------------------------------------------------------
-*/
-static int
-make_userblock_file(void)
-{
-    int     fd = -1;            /* File descriptor for writing userblock */
-    char    ub[USERBLOCK_SIZE]; /* User block data */
-    ssize_t nwritten;           /* # of bytes written */
-    size_t  u;                  /* Local index variable */
-
-    /* initialize userblock data */
-    for(u = 0; u < USERBLOCK_SIZE; u++)
-        ub[u] = 'a' + (char)(u % 26);
-
-    /* open file */
-    if((fd = HDopen(FNAME_UB,O_WRONLY|O_CREAT|O_TRUNC, 0644 )) < 0)
-        goto out;
-
-    /* write userblock data */
-    nwritten = HDwrite(fd, ub, (size_t)USERBLOCK_SIZE);
-    HDassert(nwritten == USERBLOCK_SIZE);
-
-    /* close file */
-    HDclose(fd);
-
-    return 0;
-
-out:
-
-    if(fd > 0)
-        HDclose(fd);
-
-    return -1;
-}
-
-/*-------------------------------------------------------------------------
-* Function: write_dset_in
-*
-* Purpose: write datasets in LOC_ID
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-static
-int write_dset_in(hid_t loc_id,
-                   const char* dset_name, /* for saving reference to dataset*/
-                   hid_t file_id,
-                   int make_diffs /* flag to modify data buffers */)
-{
-    /* compound datatype */
-    typedef struct s_t
-    {
-        char   a;
-        double b;
-    } s_t;
-
-    typedef enum
-    {
-        RED,
-        GREEN
-    } e_t;
-
-    hid_t   did=-1;
-    hid_t   sid=-1;
-    hid_t   tid=-1;
-    hid_t   pid=-1;
-    int     val, i, j, k, n;
-    float   f;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    hsize_t    dims1r[1]={2};
-    char       buf1[2][3]= {"ab","de"};        /* string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    e_t        buf45[2]= {RED,GREEN};          /* enum */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1,2};                 /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    hsize_t    dims2r[2]={1,1};
-    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
-    hobj_ref_t buf42[1][1];                                          /* reference */
-    hvl_t      buf52[3][2];                                          /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
-    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    hsize_t    dims3r[3]={1,1,1};
-    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-        "rs","tu","vw","xz","AB","CD","EF","GH",
-        "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[1][1][1];    /* reference */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-    * 1D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<2; j++)
-            {
-                buf1[i][j]='z';
-            }
-    }
-
-
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"string",tid,buf1) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-
-    /* create hard link */
-    if (H5Lcreate_hard(loc_id, "string", H5L_SAME_LOC, "string_link", H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            buf2[i]=buf2[1]=0;
-    }
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"bitfield",tid,buf2) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf3[i].a=0; buf3[i].b=0;
-        }
-    }
-
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"opaque",tid,buf2) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf45[i]=GREEN;
-        }
-    }
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"compound",tid,buf3) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* object references ( H5R_OBJECT ) */
-    buf4[0]=0;
-    buf4[1]=0;
-    if (dset_name)
-    {
-        if (H5Rcreate(&buf4[0],file_id,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
-            goto out;
-        if (write_dset(loc_id,1,dims1r,"refobj",H5T_STD_REF_OBJ,buf4) < 0)
-            goto out;
-    }
-
-    /* Dataset region reference ( H5R_DATASET_REGION  )  */
-    if (make_dset_reg_ref(loc_id) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"enum",tid,buf45) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf5[0].p)[0]=1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc( 2 * sizeof(int));
-    ((int *)buf5[1].p)[0] = 2;
-    ((int *)buf5[1].p)[1] = 3;
-
-    if(make_diffs) {
-        ((int *)buf5[0].p)[0] = 0;
-        ((int *)buf5[1].p)[0] = 0;
-        ((int *)buf5[1].p)[1] = 0;
-    }
-
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5) < 0)
-        goto out;
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5) < 0)
-        goto out;
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<3; j++)
-            {
-                buf6[i][j]=0;
-            }
-    }
-
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (write_dset(loc_id, 1, dims, "array", tid, buf6) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    {
-
-        hsize_t TEST_BUFSIZE = (128 * 1024 * 1024);  /* 128MB */
-        double   *dbuf;                           /* information to write */
-        size_t   size;
-        hsize_t  sdims[] = {1};
-        hsize_t  tdims[] = {TEST_BUFSIZE / sizeof(double) + 1};
-        unsigned u;
-
-        /* allocate and initialize array data to write */
-        size = ( TEST_BUFSIZE / sizeof(double) + 1 ) * sizeof(double);
-        dbuf = (double*)HDmalloc( size );
-        if (NULL == dbuf)
-        {
-            printf ("\nError: Cannot allocate memory for \"arrayd\" data buffer size %dMB.\n", (int) size / 1000000 );
-            goto out;
-        }
-
-        for( u = 0; u < TEST_BUFSIZE / sizeof(double) + 1; u++)
-            dbuf[u] = u;
-
-        if (make_diffs)
-        {
-            dbuf[5] = 0;
-            dbuf[6] = 0;
-        }
-
-        /* create a type larger than TEST_BUFSIZE */
-        if ((tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, 1, tdims)) < 0)
-            goto out;
-        size = H5Tget_size(tid);
-        if ((sid = H5Screate_simple(1, sdims, NULL)) < 0)
-            goto out;
-        if ((did = H5Dcreate2(loc_id, "arrayd", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto out;
-#if defined(WRITE_ARRAY)
-        H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
-#endif
-
-        /* close */
-        H5Dclose(did);
-        H5Tclose(tid);
-        H5Sclose(sid);
-        HDfree( dbuf );
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf7[i]=0;
-            buf8[i]=0;
-        }
-    }
-
-    if (write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7) < 0)
-        goto out;
-    if (write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * 2D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf12, 'z', sizeof buf12);
-    }
-
-
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (write_dset(loc_id,2,dims2,"string2D",tid,buf12) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-
-    if (make_diffs)
-    {
-        HDmemset(buf22,0,sizeof buf22);
-    }
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (write_dset(loc_id,2,dims2,"opaque2D",tid,buf22) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf32,0,sizeof buf32);
-    }
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (write_dset(loc_id,2,dims2,"compound2D",tid,buf32) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        if (H5Rcreate(&buf42[0][0], file_id, dset_name, H5R_OBJECT, (hid_t)-1) < 0)
-            goto out;
-        if (write_dset(loc_id, 2, dims2r, "refobj2D", H5T_STD_REF_OBJ, buf42) < 0)
-            goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (write_dset(loc_id,2,dims2,"enum2D",tid,0) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n = 0;
-    for(i = 0; i < 3; i++)
-    {
-        for(j = 0; j < 2; j++)
-        {
-            int l;
-
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = (size_t)(i + 1);
-            for(l = 0; l < i + 1; l++)
-            {
-                if(make_diffs)
-                    ((int *)buf52[i][j].p)[l] = 0;
-                else
-                    ((int *)buf52[i][j].p)[l] = n++;
-            }
-        }
-    }
-
-    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52) < 0)
-        goto out;
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52) < 0)
-        goto out;
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf62,0,sizeof buf62);
-    }
-
-
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (write_dset(loc_id, 2, dims2, "array2D", tid, buf62) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER, write a fill value
-    *-------------------------------------------------------------------------
-    */
-
-
-    if(make_diffs) {
-        HDmemset(buf72, 0, sizeof buf72);
-        HDmemset(buf82, 0, sizeof buf82);
-    }
-
-
-    if ((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
-        goto out;
-    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72) < 0)
-        goto out;
-    if (H5Pclose(pid) < 0)
-        goto out;
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if (write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * 3D
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf13,'z',sizeof buf13);
-    }
-
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"string3D",tid,buf13) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-
-    n=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) buf23[i][j][k]=0;
-                else buf23[i][j][k]=n++;
-            }
-        }
-    }
-
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"opaque3D",tid,buf23) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) {
-                    buf33[i][j][k].a=0;
-                    buf33[i][j][k].b=0;
-                }
-                else {
-                    buf33[i][j][k].a=n++;
-                    buf33[i][j][k].b=n++;
-                }
-            }
-        }
-    }
-
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"compound3D",tid,buf33) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        if (H5Rcreate(&buf43[0][0][0], file_id, dset_name, H5R_OBJECT, (hid_t)-1) < 0)
-            goto out;
-        if (write_dset(loc_id, 3, dims3r, "refobj3D", H5T_STD_REF_OBJ, buf43) < 0)
-            goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"enum3D",tid,0) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n = 0;
-    for(i = 0; i < 4; i++)
-    {
-        for(j = 0; j < 3; j++)
-        {
-            for(k = 0; k < 2; k++)
-            {
-                int l;
-
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = (size_t)(i + 1);
-                for(l = 0; l < i + 1; l++)
-                {
-                    if(make_diffs)
-                        ((int *)buf53[i][j][k].p)[l] = 0;
-                    else
-                        ((int *)buf53[i][j][k].p)[l] = n++;
-                }
-            }
-        }
-    }
-
-    if ((sid = H5Screate_simple(3, dims3, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53) < 0)
-        goto out;
-
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53) < 0)
-        goto out;
-
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-
-    n = 1;
-    for(i = 0; i < 24; i++)
-    {
-        for(j = 0; j < (int)dimarray[0]; j++)
-        {
-            if(make_diffs)
-                buf63[i][j] = 0;
-            else
-                buf63[i][j] = n++;
-        }
-    }
-
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (write_dset(loc_id, 3, dims3, "array3D", tid, buf63) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    n=1; f=1;
-    for (i = 0; i < 4; i++) {
-        for (j = 0; j < 3; j++) {
-            for (k = 0; k < 2; k++) {
-                if (make_diffs) {
-                    buf73[i][j][k]=0;
-                    buf83[i][j][k]=0;
-                }
-                else {
-                    buf73[i][j][k]=n++;
-                    buf83[i][j][k]=f++;
-                }
-            }
-        }
-    }
-    if (write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73) < 0)
-        goto out;
-    if (write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83) < 0)
-        goto out;
-
-
-    return 0;
-
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Pclose(pid);
-        H5Sclose(sid);
-        H5Dclose(did);
-        H5Tclose(tid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_dset_reg_ref
-*
-* Purpose: write dataset region references
-*
-*-------------------------------------------------------------------------
-*/
-
-#define SPACE1_RANK 1
-#define SPACE1_DIM1 1
-#define SPACE2_RANK 2
-#define SPACE2_DIM1 10
-#define SPACE2_DIM2 10
-static
-int make_dset_reg_ref(hid_t loc_id)
-{
-    hid_t           did1=-1; /* Dataset ID   */
-    hid_t           did2=-1; /* Dereferenced dataset ID */
-    hid_t           sid1=-1;  /* Dataspace ID #1  */
-    hid_t           sid2=-1;  /* Dataspace ID #2  */
-    hsize_t         dims1[] = {SPACE1_DIM1};
-    hsize_t         dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
-    hsize_t         start[SPACE2_RANK];     /* Starting location of hyperslab */
-    hsize_t         stride[SPACE2_RANK];    /* Stride of hyperslab */
-    hsize_t         count[SPACE2_RANK];     /* Element count of hyperslab */
-    hsize_t         block[SPACE2_RANK];     /* Block size of hyperslab */
-    hdset_reg_ref_t *wbuf=NULL;  /* buffer to write to disk */
-    int             *dwbuf=NULL; /* Buffer for writing numeric data to disk */
-    int             i;      /* counting variables */
-    int             retval = -1;  /* return value */
-
-    /* Allocate write & read buffers */
-    wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
-    dwbuf = (int *)HDmalloc(sizeof(int) * SPACE2_DIM1 * SPACE2_DIM2);
-
-    /* Create dataspace for datasets */
-    if ((sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL)) < 0)
-        goto out;
-
-    /* Create a dataset */
-    if ((did2 = H5Dcreate2(loc_id, "dsetreg", H5T_NATIVE_UCHAR, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    for (i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
-        dwbuf[i] = i * 3;
-
-    /* Write selection to disk */
-    if (H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf) < 0)
-        goto out;
-
-    /* Create dataspace for the reference dataset */
-    if ((sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL)) < 0)
-        goto out;
-
-    /* Create a dataset */
-    if ((did1 = H5Dcreate2(loc_id, "refreg", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-
-    /* Select 6x6 hyperslab for first reference */
-    start[0] = 2; start[1] = 2;
-    stride[0] = 1; stride[1] = 1;
-    count[0] = 6; count[1] = 6;
-    block[0] = 1; block[1] = 1;
-    if (H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block) < 0)
-        goto out;
-
-
-    /* Store dataset region */
-    if (H5Rcreate(&wbuf[0], loc_id, "dsetreg", H5R_DATASET_REGION, sid2) < 0)
-        goto out;
-
-    /* Write selection to disk */
-    if (H5Dwrite(did1,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf) < 0)
-        goto out;
-
-    /* Close all objects */
-    if (H5Sclose(sid1) < 0)
-        goto out;
-    if (H5Dclose(did1) < 0)
-        goto out;
-    if (H5Sclose(sid2) < 0)
-        goto out;
-    if (H5Dclose(did2) < 0)
-        goto out;
-
-    retval = 0;
-
-out:
-    if(wbuf)
-        HDfree(wbuf);
-    if(dwbuf)
-        HDfree(dwbuf);
-
-    H5E_BEGIN_TRY
-    {
-        H5Sclose(sid1);
-        H5Sclose(sid2);
-        H5Dclose(did1);
-        H5Dclose(did2);
-    } H5E_END_TRY;
-
-    return retval;
-}
-
-/*-------------------------------------------------------------------------
-* Function: write_attr_in
-*
-* Purpose: write attributes in LOC_ID (dataset, group, named datatype)
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-
-static
-int write_attr_in(hid_t loc_id,
-                   const char* dset_name, /* for saving reference to dataset*/
-                   hid_t fid, /* for reference create */
-                   int make_diffs /* flag to modify data buffers */)
-{
-    /* Compound datatype */
-    typedef struct s_t
-    {
-        char   a;
-        double b;
-    } s_t;
-
-    typedef enum
-    {
-        RED,
-        GREEN
-    } e_t;
-
-    hid_t   aid = -1;
-    hid_t   sid = -1;
-    hid_t   tid = -1;
-    int     val, i, j, k, n;
-    float   f;
-
-    /* create 1D attributes with dimension [2], 2 elements */
-    hsize_t    dims[1]={2};
-    char       buf1[2][3]= {"ab","de"};        /* string */
-    char       buf2[2]= {1,2};                 /* bitfield, opaque */
-    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
-    hobj_ref_t buf4[2];                        /* reference */
-    e_t        buf45[2]= {RED,RED};            /* enum */
-    hvl_t      buf5[2];                        /* vlen */
-    hsize_t    dimarray[1]={3};                /* array dimension */
-    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
-    int        buf7[2]= {1,2};                 /* integer */
-    float      buf8[2]= {1,2};                 /* float */
-
-    /* create 2D attributes with dimension [3][2], 6 elements */
-    hsize_t    dims2[2]={3,2};
-    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
-    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
-    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
-    hobj_ref_t buf42[3][2];                                          /* reference */
-    e_t        buf452[3][2];                                         /* enum */
-    hvl_t      buf52[3][2];                                          /* vlen */
-    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
-    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
-    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
-
-    /* create 3D attributes with dimension [4][3][2], 24 elements */
-    hsize_t    dims3[3]={4,3,2};
-    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-        "rs","tu","vw","xz","AB","CD","EF","GH",
-        "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
-    char       buf23[4][3][2];    /* bitfield, opaque */
-    s_t        buf33[4][3][2];    /* compound */
-    hobj_ref_t buf43[4][3][2];    /* reference */
-    e_t        buf453[4][3][2];   /* enum */
-    hvl_t      buf53[4][3][2];    /* vlen */
-    int        buf63[24][3];      /* array */
-    int        buf73[4][3][2];    /* integer */
-    float      buf83[4][3][2];    /* float */
-
-
-    /*-------------------------------------------------------------------------
-    * 1D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<2; j++)
-            {
-                buf1[i][j]='z';
-            }
-    }
-    /*
-    buf1[2][2]= {"ab","de"};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <string> and <string>
-    position      string of </g1>  string of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          a                z
-    [ 0 ]          b                z
-    [ 1 ]          d                z
-    [ 1 ]          e                z
-    */
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"string",tid,buf1) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            buf2[i]=buf2[1]=0;
-    }
-    /*
-    buf2[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <bitfield> and <bitfield>
-    position      bitfield of </g1> bitfield of </g1> difference
-    position        opaque of </g1> opaque of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"bitfield",tid,buf2) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    /*
-    buf2[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <opaque> and <opaque>
-    position     opaque of </g1> opaque of </g1> difference
-    position        opaque of </g1> opaque of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"opaque",tid,buf2) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf3[i].a=0; buf3[i].b=0;
-        }
-    }
-
-    /*
-    buf3[2]= {{1,2},{3,4}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <compound> and <compound>
-    position        compound of </g1> compound of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               5               4
-    [ 0 ]          2               5               3
-    [ 1 ]          3               5               2
-    [ 1 ]          4               5               1
-    */
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"compound",tid,buf3) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* object references ( H5R_OBJECT  */
-    if (dset_name)
-    {
-        if (H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
-            goto out;
-        if (H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
-            goto out;
-        if (make_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4) < 0)
-            goto out;
-    }
-
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-        {
-            buf45[i]=GREEN;
-        }
-    }
-    /*
-    buf45[2]= {RED,RED};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <enum> and <enum>
-    position     enum of </g1>   enum of </g1>   difference
-    ------------------------------------------------------------
-    [ 0 ]          RED              GREEN
-    [ 1 ]          RED              GREEN
-    */
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"enum",tid,buf45) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-
-    buf5[0].len = 1;
-    buf5[0].p = HDmalloc( 1 * sizeof(int));
-    ((int *)buf5[0].p)[0]=1;
-    buf5[1].len = 2;
-    buf5[1].p = HDmalloc(2 * sizeof(int));
-    ((int *)buf5[1].p)[0] = 2;
-    ((int *)buf5[1].p)[1] = 3;
-
-    if(make_diffs)
-    {
-        ((int *)buf5[0].p)[0] = 0;
-        ((int *)buf5[1].p)[0] = 0;
-        ((int *)buf5[1].p)[1] = 0;
-    }
-    /*
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    position        vlen of </g1>   vlen of </g1>   difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    [ 1 ]          3               0               3
-    */
-
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Awrite(aid, tid, buf5) < 0)
-        goto out;
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5) < 0)
-        goto out;
-    if (H5Aclose(aid) < 0)
-        goto out;
-    aid = -1;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-    if (H5Sclose(sid) < 0)
-        goto out;
-    sid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        for (i=0; i<2; i++)
-            for (j=0; j<3; j++)
-            {
-                buf6[i][j]=0;
-            }
-    }
-    /*
-    buf6[2][3]= {{1,2,3},{4,5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <array> and <array>
-    position        array of </g1>  array of </g1>  difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 0 ]          2               0               2
-    [ 0 ]          3               0               3
-    [ 1 ]          4               0               4
-    [ 1 ]          5               0               5
-    [ 1 ]          6               0               6
-    */
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (make_attr(loc_id, 1, dims, "array", tid, buf6) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if(make_diffs)
-    {
-        for(i = 0; i < 2; i++)
-        {
-            buf7[i]=0;
-            buf8[i]=0;
-        }
-    }
-
-    /*
-    buf7[2]= {1,2};
-    buf8[2]= {1,2};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    position        integer of </g1> integer of </g1> difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    position        float of </g1>  float of </g1>  difference
-    ------------------------------------------------------------
-    [ 0 ]          1               0               1
-    [ 1 ]          2               0               2
-    */
-    if (make_attr(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7) < 0)
-        goto out;
-    if (make_attr(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * 2D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        HDmemset(buf12, 'z', sizeof buf12);
-    }
-
-    /*
-    buf12[6][2]= {"ab","cd","ef","gh","ij","kl"};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <string2D> and <string2D>
-    position        string2D of </g1> string2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          a                z
-    [ 0 0 ]          b                z
-    [ 0 1 ]          c                z
-    [ 0 1 ]          d                z
-    [ 1 0 ]          e                z
-    [ 1 0 ]          f                z
-    [ 1 1 ]          g                z
-    [ 1 1 ]          h                z
-    [ 2 0 ]          i                z
-    [ 2 0 ]          j                z
-    [ 2 1 ]          k                z
-    [ 2 1 ]          l                z
-    */
-
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"string2D",tid,buf12) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf22,0,sizeof buf22);
-    }
-
-    /*
-    buf22[3][2]= {{1,2},{3,4},{5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <bitfield2D> and <bitfield2D>
-    position        bitfield2D of </g1> bitfield2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"bitfield2D",tid,buf22) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-
-    /*
-    buf22[3][2]= {{1,2},{3,4},{5,6}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <opaque2D> and <opaque2D>
-    position        opaque2D of </g1> opaque2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"opaque2D",tid,buf22) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-    if (make_diffs)
-    {
-        HDmemset(buf32,0,sizeof buf32);
-    }
-
-    /*
-    buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Attribute:   <opaque2D> and <opaque2D>
-    position        opaque2D of </g1> opaque2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"compound2D",tid,buf32) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 3; i++)
-        {
-            for (j = 0; j < 2; j++)
-            {
-                if (H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
-                    goto out;
-            }
-        }
-        if (make_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42) < 0)
-            goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-    for (i=0; i<3; i++)
-    {
-        for (j=0; j<2; j++)
-        {
-            if (make_diffs) buf452[i][j]=GREEN; else buf452[i][j]=RED;
-        }
-    }
-
-    /*
-    Attribute:   <enum2D> and <enum2D>
-    position        enum2D of </g1> enum2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          RED              GREEN
-    [ 0 1 ]          RED              GREEN
-    [ 1 0 ]          RED              GREEN
-    [ 1 1 ]          RED              GREEN
-    [ 2 0 ]          RED              GREEN
-    [ 2 1 ]          RED              GREEN
-    */
-
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"enum2D",tid,buf452) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for (i = 0; i < 3; i++)
-    {
-        for (j = 0; j < 2; j++)
-        {
-            int l;
-            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
-            buf52[i][j].len = (size_t)(i + 1);
-            for (l = 0; l < i + 1; l++)
-                if (make_diffs)((int *)buf52[i][j].p)[l] = 0;
-                else ((int *)buf52[i][j].p)[l] = n++;
-        }
-    }
-
-    /*
-    position        vlen2D of </g1> vlen2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 1 ]          1               0               1
-    [ 1 0 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 1 1 ]          5               0               5
-    [ 2 0 ]          6               0               6
-    [ 2 0 ]          7               0               7
-    [ 2 0 ]          8               0               8
-    [ 2 1 ]          9               0               9
-    [ 2 1 ]          10              0               10
-    [ 2 1 ]          11              0               11
-    */
-
-    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Awrite(aid, tid, buf52) < 0)
-        goto out;
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52) < 0)
-        goto out;
-    if (H5Aclose(aid) < 0)
-        goto out;
-    aid = -1;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-    if (H5Sclose(sid) < 0)
-        goto out;
-    sid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf62,0,sizeof buf62);
-    }
-    /*
-    buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};
-    $h5diff file7.h5 file6.h5 g1 g1 -v
-    Group:       </g1> and </g1>
-    Attribute:   <array2D> and <array2D>
-    position        array2D of </g1> array2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 0 ]          2               0               2
-    [ 0 0 ]          3               0               3
-    [ 0 1 ]          4               0               4
-    [ 0 1 ]          5               0               5
-    [ 0 1 ]          6               0               6
-    [ 1 0 ]          7               0               7
-    [ 1 0 ]          8               0               8
-    [ 1 0 ]          9               0               9
-    [ 1 1 ]          10              0               10
-    [ 1 1 ]          11              0               11
-    [ 1 1 ]          12              0               12
-    [ 2 0 ]          13              0               13
-    [ 2 0 ]          14              0               14
-    [ 2 0 ]          15              0               15
-    [ 2 1 ]          16              0               16
-    [ 2 1 ]          17              0               17
-    [ 2 1 ]          18              0               18
-    */
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (make_attr(loc_id, 2, dims2, "array2D", tid, buf62) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-
-    if(make_diffs)
-    {
-        HDmemset(buf72, 0, sizeof buf72);
-        HDmemset(buf82, 0, sizeof buf82);
-    }
-    /*
-    Attribute:   <integer2D> and <integer2D>
-    position        integer2D of </g1> integer2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    6 differences found
-    Attribute:   <float2D> and <float2D>
-    position        float2D of </g1> float2D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 ]          1               0               1
-    [ 0 1 ]          2               0               2
-    [ 1 0 ]          3               0               3
-    [ 1 1 ]          4               0               4
-    [ 2 0 ]          5               0               5
-    [ 2 1 ]          6               0               6
-    */
-
-    if (make_attr(loc_id,2,dims2,"integer2D",H5T_NATIVE_INT,buf72) < 0)
-        goto out;
-    if (make_attr(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82) < 0)
-        goto out;
-
-
-    /*-------------------------------------------------------------------------
-    * 3D attributes
-    *-------------------------------------------------------------------------
-    */
-
-    /*-------------------------------------------------------------------------
-    * H5T_STRING
-    *-------------------------------------------------------------------------
-    */
-
-    if (make_diffs)
-    {
-        HDmemset(buf13,'z',sizeof buf13);
-    }
-
-    /*
-    buf13[24][2]= {"ab","cd","ef","gh","ij","kl","mn","pq",
-    "rs","tu","vw","xz","AB","CD","EF","GH",
-    "IJ","KL","MN","PQ","RS","TU","VW","XZ"};
-
-    Attribute:   <string3D> and <string3D>
-    position        string3D of </g1> string3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          a                z
-    [ 0 0 0 ]          b                z
-    [ 0 0 1 ]          c                z
-    [ 0 0 1 ]          d                z
-    [ 0 1 0 ]          e                z
-    [ 0 1 0 ]          f                z
-    [ 0 1 1 ]          g                z
-    [ 0 1 1 ]          h                z
-    [ 0 2 0 ]          i                z
-    [ 0 2 0 ]          j                z
-    [ 0 2 1 ]          k                z
-    [ 0 2 1 ]          l                z
-    [ 1 0 0 ]          m                z
-    [ 1 0 0 ]          n                z
-    [ 1 0 1 ]          p                z
-    [ 1 0 1 ]          q                z
-    [ 1 1 0 ]          r                z
-    [ 1 1 0 ]          s                z
-    [ 1 1 1 ]          t                z
-    [ 1 1 1 ]          u                z
-    [ 1 2 0 ]          v                z
-    [ 1 2 0 ]          w                z
-    [ 1 2 1 ]          x                z
-    [ 2 0 0 ]          A                z
-    [ 2 0 0 ]          B                z
-    [ 2 0 1 ]          C                z
-    [ 2 0 1 ]          D                z
-    [ 2 1 0 ]          E                z
-    [ 2 1 0 ]          F                z
-    [ 2 1 1 ]          G                z
-    [ 2 1 1 ]          H                z
-    [ 2 2 0 ]          I                z
-    [ 2 2 0 ]          J                z
-    [ 2 2 1 ]          K                z
-    [ 2 2 1 ]          L                z
-    [ 3 0 0 ]          M                z
-    [ 3 0 0 ]          N                z
-    [ 3 0 1 ]          P                z
-    [ 3 0 1 ]          Q                z
-    [ 3 1 0 ]          R                z
-    [ 3 1 0 ]          S                z
-    [ 3 1 1 ]          T                z
-    [ 3 1 1 ]          U                z
-    [ 3 2 0 ]          V                z
-    [ 3 2 0 ]          W                z
-    [ 3 2 1 ]          X                z
-    [ 3 2 1 ]          Z                z
-    */
-
-    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
-        goto out;
-    if (H5Tset_size(tid, (size_t)2) < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"string3D",tid,buf13) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_BITFIELD
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                if (make_diffs) buf23[i][j][k]=0;
-                else buf23[i][j][k]=n++;
-            }
-        }
-    }
-
-    /*
-    position        bitfield3D of </g1> bitfield3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 1 ]          2               0               2
-    [ 0 1 0 ]          3               0               3
-    [ 0 1 1 ]          4               0               4
-    [ 0 2 0 ]          5               0               5
-    [ 0 2 1 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 1 0 ]          9               0               9
-    [ 1 1 1 ]          10              0               10
-    [ 1 2 0 ]          11              0               11
-    [ 1 2 1 ]          12              0               12
-    [ 2 0 0 ]          13              0               13
-    [ 2 0 1 ]          14              0               14
-    [ 2 1 0 ]          15              0               15
-    [ 2 1 1 ]          16              0               16
-    [ 2 2 0 ]          17              0               17
-    [ 2 2 1 ]          18              0               18
-    [ 3 0 0 ]          19              0               19
-    [ 3 0 1 ]          20              0               20
-    [ 3 1 0 ]          21              0               21
-    [ 3 1 1 ]          22              0               22
-    [ 3 2 0 ]          23              0               23
-    [ 3 2 1 ]          24              0               24
-    */
-
-    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"bitfield3D",tid,buf23) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_OPAQUE
-    *-------------------------------------------------------------------------
-    */
-    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
-        goto out;
-    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"opaque3D",tid,buf23) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_COMPOUND
-    *-------------------------------------------------------------------------
-    */
-
-    n=1;
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                if (make_diffs)
-                {
-                    buf33[i][j][k].a=0;
-                    buf33[i][j][k].b=0;
-                }
-                else
-                {
-                    buf33[i][j][k].a=n++;
-                    buf33[i][j][k].b=n++;
-                }
-            }
-        }
-    }
-    /*position        compound3D of </g1> compound3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 0 ]          2               0               2
-    [ 0 0 1 ]          3               0               3
-    [ 0 0 1 ]          4               0               4
-    [ 0 1 0 ]          5               0               5
-    [ 0 1 0 ]          6               0               6
-    [ 0 1 1 ]          7               0               7
-    [ 0 1 1 ]          8               0               8
-    [ 0 2 0 ]          9               0               9
-    [ 0 2 0 ]          10              0               10
-    [ 0 2 1 ]          11              0               11
-    [ 0 2 1 ]          12              0               12
-    [ 1 0 0 ]          13              0               13
-    [ 1 0 0 ]          14              0               14
-    [ 1 0 1 ]          15              0               15
-    [ 1 0 1 ]          16              0               16
-    [ 1 1 0 ]          17              0               17
-    [ 1 1 0 ]          18              0               18
-    [ 1 1 1 ]          19              0               19
-    [ 1 1 1 ]          20              0               20
-    [ 1 2 0 ]          21              0               21
-    [ 1 2 0 ]          22              0               22
-    [ 1 2 1 ]          23              0               23
-    [ 1 2 1 ]          24              0               24
-    [ 2 0 0 ]          25              0               25
-    [ 2 0 0 ]          26              0               26
-    [ 2 0 1 ]          27              0               27
-    [ 2 0 1 ]          28              0               28
-    [ 2 1 0 ]          29              0               29
-    [ 2 1 0 ]          30              0               30
-    [ 2 1 1 ]          31              0               31
-    [ 2 1 1 ]          32              0               32
-    [ 2 2 0 ]          33              0               33
-    [ 2 2 0 ]          34              0               34
-    [ 2 2 1 ]          35              0               35
-    [ 2 2 1 ]          36              0               36
-    [ 3 0 0 ]          37              0               37
-    [ 3 0 0 ]          38              0               38
-    [ 3 0 1 ]          39              0               39
-    [ 3 0 1 ]          40              0               40
-    [ 3 1 0 ]          41              0               41
-    [ 3 1 0 ]          42              0               42
-    [ 3 1 1 ]          43              0               43
-    [ 3 1 1 ]          44              0               44
-    [ 3 2 0 ]          45              0               45
-    [ 3 2 0 ]          46              0               46
-    [ 3 2 1 ]          47              0               47
-    [ 3 2 1 ]          48              0               48
-    */
-
-
-
-    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
-        goto out;
-    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
-        goto out;
-    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"compound3D",tid,buf33) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_REFERENCE
-    *-------------------------------------------------------------------------
-    */
-    /* Create references to dataset */
-    if (dset_name)
-    {
-        for (i = 0; i < 4; i++)
-        {
-            for (j = 0; j < 3; j++)
-            {
-                for (k = 0; k < 2; k++)
-                    if (H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
-                        goto out;
-            }
-        }
-        if (make_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43) < 0)
-            goto out;
-    }
-
-    /*-------------------------------------------------------------------------
-    * H5T_ENUM
-    *-------------------------------------------------------------------------
-    */
-
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                if (make_diffs)
-                {
-                    buf453[i][j][k]=RED;
-                }
-                else
-                {
-                    buf453[i][j][k]=GREEN;
-                }
-            }
-        }
-    }
-
-    /*
-    position        enum3D of </g1> enum3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          GREEN            RED
-    [ 0 0 1 ]          GREEN            RED
-    [ 0 1 0 ]          GREEN            RED
-    [ 0 1 1 ]          GREEN            RED
-    [ 0 2 0 ]          GREEN            RED
-    [ 0 2 1 ]          GREEN            RED
-    [ 1 0 0 ]          GREEN            RED
-    [ 1 0 1 ]          GREEN            RED
-    [ 1 1 0 ]          GREEN            RED
-    [ 1 1 1 ]          GREEN            RED
-    [ 1 2 0 ]          GREEN            RED
-    [ 1 2 1 ]          GREEN            RED
-    [ 2 0 0 ]          GREEN            RED
-    [ 2 0 1 ]          GREEN            RED
-    [ 2 1 0 ]          GREEN            RED
-    [ 2 1 1 ]          GREEN            RED
-    [ 2 2 0 ]          GREEN            RED
-    [ 2 2 1 ]          GREEN            RED
-    [ 3 0 0 ]          GREEN            RED
-    [ 3 0 1 ]          GREEN            RED
-    [ 3 1 0 ]          GREEN            RED
-    [ 3 1 1 ]          GREEN            RED
-    [ 3 2 0 ]          GREEN            RED
-    [ 3 2 1 ]          GREEN            RED
-    */
-
-
-    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
-        goto out;
-    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"enum3D",tid,buf453) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_VLEN
-    *-------------------------------------------------------------------------
-    */
-
-    /* Allocate and initialize VL dataset to write */
-    n=0;
-    for (i = 0; i < 4; i++)
-    {
-        for (j = 0; j < 3; j++)
-        {
-            for (k = 0; k < 2; k++)
-            {
-                int l;
-                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
-                buf53[i][j][k].len = (size_t)i + 1;
-                for (l = 0; l < i + 1; l++)
-                    if (make_diffs)
-                    {
-                        ((int *)buf53[i][j][k].p)[l] = 0;
-                    }
-                    else
-                        ((int *)buf53[i][j][k].p)[l] = n++;
-            }
-        }
-    }
-    /*
-    position        vlen3D of </g1> vlen3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 1 ]          1               0               1
-    [ 0 1 0 ]          2               0               2
-    [ 0 1 1 ]          3               0               3
-    [ 0 2 0 ]          4               0               4
-    [ 0 2 1 ]          5               0               5
-    [ 1 0 0 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 0 1 ]          9               0               9
-    [ 1 1 0 ]          10              0               10
-    etc
-    */
-    if ((sid = H5Screate_simple(3, dims3, NULL)) < 0)
-        goto out;
-    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
-        goto out;
-    if ((aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (H5Awrite(aid, tid, buf53) < 0)
-        goto out;
-    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53) < 0)
-        goto out;
-    if (H5Aclose(aid) < 0)
-        goto out;
-    aid = -1;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-    if (H5Sclose(sid) < 0)
-        goto out;
-    sid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_ARRAY
-    *-------------------------------------------------------------------------
-    */
-    n=1;
-    for (i = 0; i < 24; i++)
-    {
-        for (j = 0; j < (int)dimarray[0]; j++)
-        {
-            if (make_diffs) buf63[i][j]=0;
-            else buf63[i][j]=n++;
-        }
-    }
-    /*
-    position        array3D of </g1> array3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 0 ]          2               0               2
-    [ 0 0 0 ]          3               0               3
-    [ 0 0 1 ]          4               0               4
-    [ 0 0 1 ]          5               0               5
-    [ 0 0 1 ]          6               0               6
-    [ 0 1 0 ]          7               0               7
-    etc
-    */
-
-    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
-        goto out;
-    if (make_attr(loc_id, 3, dims3, "array3D", tid, buf63) < 0)
-        goto out;
-    if (H5Tclose(tid) < 0)
-        goto out;
-    tid = -1;
-
-    /*-------------------------------------------------------------------------
-    * H5T_INTEGER and H5T_FLOAT
-    *-------------------------------------------------------------------------
-    */
-    n = 1; f = 1;
-    for(i = 0; i < 4; i++)
-    {
-        for(j = 0; j < 3; j++)
-        {
-            for(k = 0; k < 2; k++)
-            {
-                if(make_diffs)
-                {
-                    buf73[i][j][k] = 0;
-                    buf83[i][j][k] = 0;
-                }
-                else
-                {
-                    buf73[i][j][k] = n++;
-                    buf83[i][j][k] = f++;
-                }
-            }
-        }
-    }
-
-    /*
-    position        integer3D of </g1> integer3D of </g1> difference
-    ------------------------------------------------------------
-    [ 0 0 0 ]          1               0               1
-    [ 0 0 1 ]          2               0               2
-    [ 0 1 0 ]          3               0               3
-    [ 0 1 1 ]          4               0               4
-    [ 0 2 0 ]          5               0               5
-    [ 0 2 1 ]          6               0               6
-    [ 1 0 0 ]          7               0               7
-    [ 1 0 1 ]          8               0               8
-    [ 1 1 0 ]          9               0               9
-    [ 1 1 1 ]          10              0               10
-    etc
-    */
-    if (make_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73) < 0)
-        goto out;
-    if (make_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83) < 0)
-        goto out;
-
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Aclose(aid);
-        H5Sclose(sid);
-        H5Tclose(tid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_dset
-*
-* Purpose: utility function to create and write a dataset in LOC_ID
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_dset(hid_t loc_id,
-              const char *name,
-              hid_t sid,
-              hid_t dcpl,
-              void *buf)
-{
-    hid_t   did=-1;
-
-    if ((did = H5Dcreate2(loc_id, name, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        return -1;
-    if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-        goto out;
-    if (H5Dclose(did) < 0)
-        return -1;
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Dclose(did);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: write_dset
-*
-* Purpose: utility function to create and write a dataset in LOC_ID
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-static
-int write_dset( hid_t loc_id,
-               int rank,
-               hsize_t *dims,
-               const char *dset_name,
-               hid_t tid,
-               void *buf )
-{
-    hid_t   did=-1;
-    hid_t   sid=-1;
-
-    if ((sid = H5Screate_simple(rank, dims, NULL)) < 0)
-        return -1;
-    if ((did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if (buf)
-    {
-        if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
-            goto out;
-    }
-    if (H5Dclose(did) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Dclose(did);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-
-/*-------------------------------------------------------------------------
-* Function: make_attr
-*
-* Purpose: utility function to write an attribute in LOC_ID
-*
-* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
-*
-* Date: November 12, 2003
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_attr(hid_t loc_id,
-              int rank,
-              hsize_t *dims,
-              const char *attr_name,
-              hid_t tid,
-              void *buf)
-{
-    hid_t   aid;
-    hid_t   sid;
-
-    if ((sid = H5Screate_simple(rank, dims, NULL)) < 0)
-        return -1;
-    if ((aid = H5Acreate2(loc_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(buf)
-    {
-        if(H5Awrite(aid, tid, buf) < 0)
-            goto out;
-    }
-    if (H5Aclose(aid) < 0)
-        goto out;
-    if (H5Sclose(sid) < 0)
-        goto out;
-    return 0;
-
-out:
-    H5E_BEGIN_TRY {
-        H5Aclose(aid);
-        H5Sclose(sid);
-    } H5E_END_TRY;
-    return -1;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: make_named_dtype
-*
-* Purpose: create a file with named datatypes in various configurations
-*
-*-------------------------------------------------------------------------
-*/
-static
-int make_named_dtype(hid_t loc_id)
-{
-    hsize_t dims[1] ={3};
-    hid_t   did=-1;
-    hid_t   aid=-1;
-    hid_t   sid=-1;
-    hid_t   tid=-1;
-    hid_t   gid=-1;
-
-    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
-        goto out;
-
-    /* Create a dataset with an anonymous committed datatype as the first thing
-     * h5repack sees */
-    if((tid = H5Tcopy(H5T_STD_I16LE)) < 0)
-        goto out;
-    if(H5Tcommit_anon(loc_id, tid, H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-    if ((did = H5Dcreate2(loc_id, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Tclose(tid) < 0)
-        goto out;
-
-    /* Create an attribute on that dataset that uses a committed datatype in
-     * a remote group */
-    if((gid = H5Gcreate2(loc_id, "M", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    if((gid = H5Gcreate2(loc_id, "M/M", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Gclose(gid) < 0)
-        goto out;
-    if((tid = H5Tcopy(H5T_STD_I16BE)) < 0)
-        goto out;
-    if(H5Tcommit2(loc_id, "/M/M/A", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-    if((aid = H5Acreate2(did, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Aclose(aid) < 0)
-        goto out;
-    if(H5Tclose(tid) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    /* Create a dataset in the remote group that uses a committed datatype in
-     * the root group */
-    if((tid = H5Tcopy(H5T_STD_I32LE)) < 0)
-        goto out;
-    if(H5Tcommit2(loc_id, "N", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-    if((did = H5Dcreate2(loc_id, "M/M/B", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Tclose(tid) < 0)
-        goto out;
-
-    /* Create an attribute on the remote dataset that uses an anonymous
-     * committed datatype */
-    if((tid = H5Tcopy(H5T_STD_I32BE)) < 0)
-        goto out;
-    if(H5Tcommit_anon(loc_id, tid, H5P_DEFAULT, H5P_DEFAULT) < 0)
-        goto out;
-    if((aid = H5Acreate2(did, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Aclose(aid) < 0)
-        goto out;
-
-    /* Create another attribute that uses the same anonymous datatype */
-    if((aid = H5Acreate2(did, "B", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Aclose(aid) < 0)
-        goto out;
-    if(H5Tclose(tid) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    /* Create a dataset in the root group that uses the committed datatype in
-     * the root group */
-    if((tid = H5Topen2(loc_id, "N", H5P_DEFAULT)) < 0)
-        goto out;
-    if((did = H5Dcreate2(loc_id, "O", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Dclose(did) < 0)
-        goto out;
-
-    /* Create 2 attributes on the committed datatype that use that datatype */
-    if((aid =  H5Acreate2(tid, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Aclose(aid) < 0)
-        goto out;
-    if((aid =  H5Acreate2(tid, "B", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-        goto out;
-    if(H5Aclose(aid) < 0)
-        goto out;
-    if(H5Tclose(tid) < 0)
-        goto out;
-
-    /* Close */
-    if (H5Sclose(sid) < 0)
-        goto out;
-
-    return 0;
-
-out:
-    H5E_BEGIN_TRY
-    {
-        H5Tclose(tid);
-        H5Aclose(aid);
-        H5Sclose(sid);
-        H5Dclose(did);
-        H5Gclose(gid);
-    } H5E_END_TRY;
-    return -1;
-} /* end make_named_dtype() */
-
-/*-------------------------------------------------------------------------
- * Function: add_attr_with_objref
- *
- * Purpose: 
- *  Create attributes with object reference to objects (dset,
- *  group, datatype). 
- *
- * Note:
- *  this function depends on locally created objects, however can be modified
- *  to be independent as necessary
- *
- * Programmer: Jonathan Kim (March 23, 2010)
- *------------------------------------------------------------------------*/
-static herr_t add_attr_with_objref(hid_t file_id, hid_t obj_id)
-{
-    int ret = SUCCEED;
-    int status;
-    /* attr obj ref */
-    hsize_t dim_attr_objref[1]={3};
-    hobj_ref_t data_attr_objref[3];
-
-    /* --------------------------------
-     * add attribute with obj ref type
-     */    
-    /* ref to dset */
-    status = H5Rcreate(&data_attr_objref[0],file_id,NAME_OBJ_DS1,H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* ref to group */
-    status = H5Rcreate(&data_attr_objref[1],file_id,NAME_OBJ_GRP,H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* ref to datatype */
-    status = H5Rcreate(&data_attr_objref[2],file_id,NAME_OBJ_NDTYPE,H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create attr with obj ref type */
-    status = make_attr(obj_id,1,dim_attr_objref,"Attr_OBJREF",H5T_STD_REF_OBJ,data_attr_objref);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-
-    return ret;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: add_attr_with_regref
- *
- * Purpose: 
- *  Create attributes with region reference to dset
- *
- * Note:
- *  this function depends on locally created objects, however can be modified
- *  to be independent as necessary
- *
- * Programmer: Jonathan Kim (March 23, 2010)
- *------------------------------------------------------------------------*/
-static herr_t add_attr_with_regref(hid_t file_id, hid_t obj_id)
-{
-    int ret = SUCCEED;
-    int status;
-
-    /* attr region ref */
-    hid_t sid_regrefed_dset=0;
-    hsize_t dim_regrefed_dset[2]={3,6};
-    hsize_t coords_regrefed_dset[3][2] = {{0,1},{1,2},{2,3}};
-    hsize_t dim_attr_regref[1]= {1}; /* dim of  */
-    hdset_reg_ref_t data_attr_regref[1];
-
-
-    /* -----------------------------------
-     * add attribute with region ref type
-     */
-    sid_regrefed_dset = H5Screate_simple (2, dim_regrefed_dset, NULL);
-    if (sid_regrefed_dset < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* select elements space for reference */
-    status = H5Sselect_elements (sid_regrefed_dset, H5S_SELECT_SET, (size_t)3, coords_regrefed_dset[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference from elements space */
-    status = H5Rcreate (&data_attr_regref[0], file_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_regrefed_dset);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create attr with region ref type */
-    status = make_attr(obj_id,1,dim_attr_regref,"Attr_REGREF",H5T_STD_REF_DSETREG,data_attr_regref);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if (sid_regrefed_dset > 0)
-        H5Sclose (sid_regrefed_dset);
-
-    return ret;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: gen_refered_objs
- *
- * Purpose: 
- *  Create objects (dataset, group, datatype) to be referenced
- *
- * Note:
- *  This function is to use along with gen_obj_ref() gen_region_ref() 
- *
- * Programmer: Jonathan Kim (March 23, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_refered_objs(hid_t loc_id)
-{
-    int status;
-    herr_t ret = SUCCEED;
-
-    /* objects (dset, group, datatype) */
-    hid_t sid=0, did1=0, gid=0, tid=0;
-    hsize_t dims1[1]={3};
-    int data[3] = {10,20,30};
-
-    /* Dset2 */
-    hid_t sid2=0, did2=0; 
-    hsize_t dims2[2] = {3,16};
-    char  data2[3][16] = {"The quick brown", "fox jumps over ", "the 5 lazy dogs"};
-
-    /*-----------------------
-     * add short dataset 
-     * (define NAME_OBJ_DS1)
-     */
-    sid = H5Screate_simple(1, dims1, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    did1 = H5Dcreate2 (loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (did1 < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*--------------
-     * add group  
-     * (define NAME_OBJ_GRP)
-     */
-    gid = H5Gcreate2 (loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (gid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*----------------------
-     * add named datatype
-     * (define NAME_OBJ_NDTYPE)
-     */
-     tid = H5Tcopy(H5T_NATIVE_INT);
-     status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-     if (status < 0)
-     {
-        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-     }
-
-
-   /*--------------------------
-    * create long dataset
-    * (define NAME_OBJ_DS2)
-    */
-    sid2 = H5Screate_simple (2, dims2, NULL);
-    if (sid2 < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create normal dataset which is refered */
-    did2 = H5Dcreate2 (loc_id, NAME_OBJ_DS2, H5T_STD_I8LE, sid2, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (did2 < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* write values to dataset */
-    status = H5Dwrite (did2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if(did1 > 0)
-        H5Dclose(did1);
-    if(gid > 0)
-        H5Gclose(gid);
-    if(tid > 0)
-        H5Tclose(tid);
-    if(sid > 0)
-        H5Sclose(sid);
-
-    if(did2 > 0)
-        H5Dclose(did2);
-    if(sid2 > 0)
-        H5Sclose(sid2);
-    return ret;
-    
-}
-
-/*-------------------------------------------------------------------------
- * Function: gen_obj_ref
- *
- * Purpose: 
- *  Generate object references to objects (dataset,group and named datatype)
- *
- * Note:
- *  copied from h5copygentest.c and upate to create named datatype  
- *
- * Programmer: Jonathan Kim (March 18, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_obj_ref(hid_t loc_id)
-{
-    int status;
-    herr_t ret = SUCCEED;
-
-    hid_t sid=0, oid=0;
-    hsize_t dims_dset_objref[1]={3};
-
-    /* attr with int type */
-    hsize_t dim_attr_int[1]={2};
-    int data_attr_int[2] = {10,20}; 
-
-    /* write buffer for obj reference */
-    hobj_ref_t objref_buf[3];
-
-    /*---------------------------------------------------------
-     * create obj references to the previously created objects.
-     * Passing -1 as reference is an object.*/
-
-    /* obj ref to dataset */
-    status = H5Rcreate (&objref_buf[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* obj ref to group */
-    status = H5Rcreate (&objref_buf[1], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* obj ref to named-datatype */
-    status = H5Rcreate (&objref_buf[2], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*---------------------------------------------------------
-     * create dataset contain references 
-     */
-    sid = H5Screate_simple (1, dims_dset_objref, NULL);
-    if (sid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    oid = H5Dcreate2 (loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (oid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, objref_buf);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* add attribute with int type */
-    if (make_attr(oid,1,dim_attr_int,"integer",H5T_NATIVE_INT,data_attr_int) < 0)
-        goto out;
-
-    /* add attribute with obj ref */
-    status = add_attr_with_objref(loc_id, oid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* add attribute with region ref */
-    status = add_attr_with_regref(loc_id, oid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if(oid > 0)
-        H5Dclose(oid);
-    if(sid > 0)
-        H5Sclose(sid);
-
-    return ret;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: gen_region_ref
- *
- * Purpose: Generate dataset region references
- *
- * Note:
- *  copied from h5copygentest.c 
- *
- * Programmer: Jonathan Kim (March 18, 2010)
- *------------------------------------------------------------------------*/
-static herr_t gen_region_ref(hid_t loc_id)
-{
-    int status;
-    herr_t ret = SUCCEED;
-
-    /* target dataset */
-    hid_t sid_trg=0; 
-    hsize_t dims_trg[2] = {3,16};
-
-    /* dset with region ref type */
-    hid_t sid_ref=0, oid_ref=0; 
-
-    /* region ref to target dataset */
-    hsize_t coords[4][2] = { {0,1}, {2,11}, {1,0}, {2,4} };
-    hdset_reg_ref_t  rr_data[2];
-    hsize_t start[2] = {0,0};
-    hsize_t stride[2] = {2,11};
-    hsize_t count[2] = {2,2};
-    hsize_t block[2] = {1,3};
-    hsize_t dims1[1] = {2};
-
-    /* attr with int type */
-    hsize_t dim_attr_int[1]={2};
-    int data_attr_int[2] = {10,20}; 
-
-    sid_trg = H5Screate_simple (2, dims_trg, NULL);
-    if (sid_trg < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* select elements space for reference */
-    status = H5Sselect_elements (sid_trg, H5S_SELECT_SET, (size_t)4, coords[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference from elements space */
-    status = H5Rcreate (&rr_data[0], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* select hyperslab space for reference */
-    status = H5Sselect_hyperslab (sid_trg, H5S_SELECT_SET, start, stride, count, block);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference from hyperslab space */
-    status = H5Rcreate (&rr_data[1], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* Create dataspace. */
-    sid_ref = H5Screate_simple (1, dims1, NULL);
-    if (sid_ref < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* create region reference dataset */
-    oid_ref = H5Dcreate2 (loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid_ref, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
-    if (oid_ref < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* write data as region references */
-    status = H5Dwrite (oid_ref, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* add attribute with int type */
-    if (make_attr(oid_ref,1,dim_attr_int,"integer",H5T_NATIVE_INT,data_attr_int) < 0)
-        goto out;
-
-    /* add attribute with obj ref */
-    status = add_attr_with_objref(loc_id, oid_ref);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* add attribute with region ref */
-    status = add_attr_with_regref(loc_id, oid_ref);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    if (oid_ref > 0)
-        H5Dclose (oid_ref);
-    if (sid_ref > 0)
-        H5Sclose (sid_ref);
-    if (sid_trg > 0)
-        H5Sclose (sid_trg); 
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_references
-*
-* Purpose: create a file with obj and region references 
-*
-* Programmer: Jonathan Kim (March 18, 2010)
-*-------------------------------------------------------------------------
-*/
-static herr_t make_references(hid_t loc_id)
-{
-    herr_t ret = SUCCEED;
-    herr_t status;
-
-    /* add target objects */
-    status = gen_refered_objs(loc_id);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Failed to generate referenced object.\n");
-        ret = FAIL;
-    } 
-
-    /* add object reference */
-    status = gen_obj_ref(loc_id);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Failed to generate object reference.\n");
-        ret = FAIL;
-    }
-
-    /* add region reference */
-    status = gen_region_ref(loc_id);
-    if (status == FAIL)
-    {
-        fprintf(stderr, "Failed to generate region reference.\n");
-        ret = FAIL;
-    }
-
-    return ret;
-}
-
-/*-------------------------------------------------------------------------
-* Function: make_complex_attr_references
-*
-* Purpose: 
-*   create a file with :
-*   1. obj ref in attribute of compound type
-*   2. region ref in attribute of compound type
-*   3. obj ref in attribute of vlen type
-*   4. region ref in attribute of vlen type
-*
-* Programmer: Jonathan (March 25, 2010)
-*-------------------------------------------------------------------------
-*/
-/* obj dset */
-#define RANK_OBJ 2
-#define DIM0_OBJ 6
-#define DIM1_OBJ 10
-/* container dset */
-#define RANK_DSET 1
-#define DIM_DSET 4
-/* 1. obj references in compound attr */
-#define RANK_COMP_OBJREF 1
-#define DIM_COMP_OBJREF 3   /* for dataset, group, datatype */
-/* 2. region references in compound attr */
-#define RANK_COMP_REGREF 1
-#define DIM_COMP_REGREF 1   /* for element region */
-/* 3. obj references in vlen attr */
-#define RANK_VLEN_OBJREF 1
-#define DIM_VLEN_OBJREF 3   /* for dataset, group, datatype */
-#define LEN0_VLEN_OBJREF 1  /* dataset */
-#define LEN1_VLEN_OBJREF 1  /* group */
-#define LEN2_VLEN_OBJREF 1  /* datatype */
-/* 4. region references in vlen attr */
-#define RANK_VLEN_REGREF 1
-#define DIM_VLEN_REGREF 1   /*  for element region */
-#define LEN0_VLEN_REGREF 1  /* element region  */ 
-
-static herr_t make_complex_attr_references(hid_t loc_id)
-{
-    herr_t ret = SUCCEED;
-    herr_t status; 
-    /* 
-     * for objects 
-     */
-    hid_t objgid=0, objdid=0, objtid=0, objsid=0;
-    hsize_t obj_dims[RANK_OBJ] = {DIM0_OBJ, DIM1_OBJ};
-    int obj_data[DIM0_OBJ][DIM1_OBJ]=
-        {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
-         {10,11,12,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,47,48,49},
-         {50,51,52,53,54,55,56,57,58,59}};
-
-    /*
-     * group main
-     */
-    hid_t main_gid=0;
-    /*
-     * dataset which the attribute will be attached to
-     */
-    hsize_t main_dset_dims[RANK_DSET] = {DIM_DSET};
-    hid_t main_sid=0, main_did=0;
-    /* 
-     * 1. obj references in compound attr 
-     */
-    hid_t comp_objref_tid=0, comp_objref_aid=0;
-    typedef struct comp_objref_t {
-        hobj_ref_t val_objref;
-        int val_int;
-    } comp_objref_t;
-    comp_objref_t comp_objref_data[DIM_COMP_OBJREF];
-    hid_t comp_objref_attr_sid=0;
-    hsize_t comp_objref_dim[RANK_COMP_OBJREF] = {DIM_COMP_OBJREF};
-
-    /* 
-     * 2. region references in compound attr 
-     */
-    hid_t comp_regref_tid=0, comp_regref_aid=0;
-    typedef struct comp_regref_t {
-        hdset_reg_ref_t val_regref;
-        int val_int;
-    } comp_regref_t;
-    comp_regref_t comp_regref_data[DIM_COMP_REGREF];
-    hid_t comp_regref_attr_sid=0;
-    hsize_t comp_regref_dim[RANK_COMP_REGREF] = {DIM_COMP_REGREF};
-    hsize_t coords[4][2] = { {0,1}, {2,3}, {3,4}, {4,5} };
-    
-    /* 
-     * 3. obj references in vlen attr 
-     */
-    hid_t vlen_objref_attr_tid=0, vlen_objref_attr_sid=0;
-    hid_t vlen_objref_attr_id=0;
-    hvl_t vlen_objref_data[DIM_VLEN_OBJREF];
-    hsize_t vlen_objref_dims[RANK_VLEN_OBJREF] = {DIM_VLEN_OBJREF};
-
-    /* 
-     * 4. region references in vlen attr
-     */
-    hid_t vlen_regref_attr_tid=0, vlen_regref_attr_sid=0;
-    hid_t vlen_regref_attr_id=0;
-    hvl_t vlen_regref_data[DIM_VLEN_REGREF];
-    hsize_t vlen_regref_dim[RANK_VLEN_REGREF] = {DIM_VLEN_REGREF};
-
-
-    /* ---------------------------------------
-     * create objects which to be referenced 
-     */
-    /* object1 group */
-    objgid = H5Gcreate2(loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* object2 dataset */
-    objsid = H5Screate_simple(RANK_OBJ, obj_dims, NULL);
-    objdid = H5Dcreate2(loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, objsid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Dwrite(objdid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* object3 named datatype */
-    objtid = H5Tcopy(H5T_NATIVE_INT);
-    status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, objtid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-
-    /* ---------------------------------------------
-     *  Put testing objs in this group 
-     * create group contain dataset with attribute and the attribute has
-     * compound type which contain obj and region reference */
-    main_gid = H5Gcreate2(loc_id, "group_main", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    if (main_gid < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*----------------------------------------------------------
-     * create dataset which the attribute will be attached to
-     */
-    main_sid = H5Screate_simple(RANK_DSET, main_dset_dims, NULL);
-
-    main_did = H5Dcreate2(main_gid, "dset_main", H5T_NATIVE_INT, main_sid, H5P_DEFAULT,H5P_DEFAULT, H5P_DEFAULT);
-    
-    status = H5Dwrite(main_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------
-     * 1. create obj references in a attribute of compound type
-     */
-
-    /* 
-     * create compound type for attribute 
-     */
-    comp_objref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_objref_t));
-
-    H5Tinsert(comp_objref_tid, "value_objref", HOFFSET(comp_objref_t, val_objref), H5T_STD_REF_OBJ);
-    H5Tinsert(comp_objref_tid, "value_int", HOFFSET(comp_objref_t, val_int), H5T_NATIVE_INT);
-
-    /*
-     * Create the object references into compound type
-     */
-     /* references to dataset */
-    status = H5Rcreate (&(comp_objref_data[0].val_objref), loc_id, NAME_OBJ_DS1, H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    comp_objref_data[0].val_int = 0;
-
-     /* references to group */
-    status = H5Rcreate (&(comp_objref_data[1].val_objref), loc_id, NAME_OBJ_GRP, H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    comp_objref_data[1].val_int = 10;
-
-     /* references to datatype */
-    status = H5Rcreate (&(comp_objref_data[2].val_objref), loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT,(hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    comp_objref_data[2].val_int = 20;
-    
-    /* 
-     * create attribute and write the object ref
-     */
-    comp_objref_attr_sid = H5Screate_simple (RANK_COMP_OBJREF, comp_objref_dim, NULL);
-    comp_objref_aid = H5Acreate2 (main_did, "Comp_OBJREF", comp_objref_tid, comp_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite (comp_objref_aid, comp_objref_tid, comp_objref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------
-     * 2. create region references in attribute of compound type
-     */
-    /*
-     * create compound type for attribute
-     */
-    comp_regref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_regref_t));
-
-    H5Tinsert(comp_regref_tid, "value_regref", HOFFSET(comp_regref_t, val_regref), H5T_STD_REF_DSETREG);
-    H5Tinsert(comp_regref_tid, "value_int", HOFFSET(comp_regref_t, val_int), H5T_NATIVE_INT);
-
-    /*
-     * create the region reference 
-     */
-    status = H5Sselect_elements (objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    status = H5Rcreate (&(comp_regref_data[0].val_regref), loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    comp_regref_data[0].val_int = 10;
-
-    /*
-     * create attribute and write the region ref
-     */
-    comp_regref_attr_sid = H5Screate_simple (RANK_COMP_REGREF, comp_regref_dim, NULL);
-    comp_regref_aid = H5Acreate2 (main_did, "Comp_REGREF", comp_regref_tid, comp_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite (comp_regref_aid, comp_regref_tid, comp_regref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-
-    /*-------------------------------------------------------------------
-     * 3. create obj references in attribute of vlen type
-     */
-    /*
-     * prepare vlen data
-     */
-     vlen_objref_data[0].len = LEN0_VLEN_OBJREF;
-     vlen_objref_data[0].p = HDmalloc (vlen_objref_data[0].len * sizeof(hobj_ref_t));
-     vlen_objref_data[1].len = LEN1_VLEN_OBJREF;
-     vlen_objref_data[1].p = HDmalloc (vlen_objref_data[1].len * sizeof(hobj_ref_t));
-     vlen_objref_data[2].len = LEN2_VLEN_OBJREF;
-     vlen_objref_data[2].p = HDmalloc (vlen_objref_data[2].len * sizeof(hobj_ref_t));
-
-     /* 
-      * create obj references 
-      */
-     /* reference to dataset */
-     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-     /* reference to group */
-     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[1].p)[0], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1); 
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-     /* reference to datatype */
-     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[2].p)[0], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-     
-     /* 
-      * create vlen type with obj reference
-      */
-     vlen_objref_attr_tid = H5Tvlen_create (H5T_STD_REF_OBJ);
-     vlen_objref_attr_sid = H5Screate_simple (RANK_VLEN_OBJREF, vlen_objref_dims, NULL);
-
-     /*
-     * create attribute and write the object reference 
-     */
-     vlen_objref_attr_id = H5Acreate2(main_did, "Vlen_OBJREF", vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
-     status = H5Awrite (vlen_objref_attr_id, vlen_objref_attr_tid, vlen_objref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /* close resource for vlen data */
-    status = H5Dvlen_reclaim (vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, vlen_objref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-    /*-------------------------------------------------------------------
-     * 4. create region references in a attribute of vlen type
-     */
-     
-    /*
-     * prepare vlen data
-     */
-    vlen_regref_data[0].len = LEN0_VLEN_REGREF;
-    vlen_regref_data[0].p = HDmalloc (vlen_regref_data[0].len * sizeof(hdset_reg_ref_t));
-
-    /*
-     * create region reference 
-     */
-    status = H5Sselect_elements(objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    status = H5Rcreate (&((hdset_reg_ref_t*)vlen_regref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    
-    /* 
-     * create vlen type with region reference
-     */
-    vlen_regref_attr_tid = H5Tvlen_create(H5T_STD_REF_DSETREG);
-    vlen_regref_attr_sid = H5Screate_simple(RANK_VLEN_REGREF, vlen_regref_dim, NULL);
-    
-    /*
-     * create attribute and write the region reference 
-     */
-    vlen_regref_attr_id = H5Acreate2(main_did, "Vlen_REGREF", vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
-    status = H5Awrite(vlen_regref_attr_id, vlen_regref_attr_tid, vlen_regref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-    
-    /* close resource for vlen data */
-    status = H5Dvlen_reclaim (vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, vlen_regref_data);
-    if (status < 0)
-    {
-        fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__);
-        ret = FAIL;
-        goto out;
-    }
-
-out:
-    /* release resources */
-    if (objgid > 0)
-        H5Gclose(objgid);
-    if (objsid > 0)
-        H5Sclose(objsid);
-    if (objdid > 0)
-        H5Dclose(objdid);
-    if (objtid > 0)
-        H5Tclose(objtid);
-
-    if (main_gid > 0)
-        H5Gclose(main_gid);
-    if (main_sid > 0)
-        H5Sclose(main_sid);
-    if (main_did > 0)
-        H5Dclose(main_did);
-    /* comp obj ref */
-    if (comp_objref_tid > 0)
-        H5Tclose(comp_objref_tid);
-    if (comp_objref_aid > 0)
-        H5Aclose(comp_objref_aid);
-    if (comp_objref_attr_sid > 0)
-        H5Sclose(comp_objref_attr_sid);
-    /* comp region ref */
-    if (comp_regref_tid > 0)
-        H5Tclose(comp_regref_tid);
-    if (comp_regref_aid > 0)
-        H5Aclose(comp_regref_aid);
-    if (comp_regref_attr_sid > 0)
-        H5Sclose(comp_regref_attr_sid);
-    /* vlen obj ref */
-    if (vlen_objref_attr_id > 0)
-        H5Aclose(vlen_objref_attr_id);
-    if (vlen_objref_attr_sid > 0)
-        H5Sclose(vlen_objref_attr_sid);
-    if (vlen_objref_attr_tid > 0)
-        H5Tclose(vlen_objref_attr_tid);
-    /* vlen region ref */
-    if (vlen_regref_attr_id > 0)
-        H5Aclose(vlen_regref_attr_id);
-    if (vlen_regref_attr_sid > 0)
-        H5Sclose(vlen_regref_attr_sid);
-    if (vlen_regref_attr_tid > 0)
-        H5Tclose(vlen_regref_attr_tid);
-
-    return ret;
-}
diff --git a/tools/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl b/tools/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
deleted file mode 100644
index c499b35..0000000
--- a/tools/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
+++ /dev/null
@@ -1,59 +0,0 @@
-HDF5 "out-vds_conti.4_vds.h5" {
-DATASET "vds_dset" {
-   DATATYPE  H5T_STD_I32LE
-   DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( 9, 4, 4 ) }
-   STORAGE_LAYOUT {
-      CONTIGUOUS
-      SIZE 576
-      OFFSET 2144
-   }
-   FILTERS {
-      NONE
-   }
-   FILLVALUE {
-      FILL_TIME H5D_FILL_TIME_IFSET
-      VALUE  -9
-   }
-   ALLOCATION_TIME {
-      H5D_ALLOC_TIME_LATE
-   }
-   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/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl b/tools/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
deleted file mode 100644
index 80b8a19..0000000
--- a/tools/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
+++ /dev/null
@@ -1,130 +0,0 @@
-HDF5 "out-deflate_limit.h5repack_layout.h5" {
-GROUP "/" {
-   DATASET "dset1" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset3" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset4" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_chunk" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, H5S_UNLIMITED ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 20, 10 )
-         SIZE 1283 (2.494:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_compact" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_contiguous" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 1150 (2.783:1 COMPRESSION)
-      }
-      FILTERS {
-         COMPRESSION DEFLATE { LEVEL 1 }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-}
-}
diff --git a/tools/h5repack/testfiles/h5repack-help.txt b/tools/h5repack/testfiles/h5repack-help.txt
deleted file mode 100644
index c70b031..0000000
--- a/tools/h5repack/testfiles/h5repack-help.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-usage: h5repack [OPTIONS] file1 file2
-  file1                    Input HDF5 File
-  file2                    Output HDF5 File
-  OPTIONS
-   -h, --help              Print a usage message and exit
-   -v, --verbose           Verbose mode, print object information
-   -V, --version           Print version number and exit
-   -n, --native            Use a native HDF5 type when repacking
-   -L, --latest            Use latest version of file format
-   -c L1, --compact=L1     Maximum number of links in header messages
-   -d L2, --indexed=L2     Minimum number of links in the indexed format
-   -s S[:F], --ssize=S[:F] Shared object header message minimum size
-   -m M, --minimum=M       Do not apply the filter to datasets smaller than M
-   -e E, --file=E          Name of file E with the -f and -l options
-   -u U, --ublock=U        Name of file U with user block data to be added
-   -b B, --block=B         Size of user block to be added
-   -M A, --metadata_block_size=A  Metadata block size for H5Pset_meta_block_size
-   -t T, --threshold=T     Threshold value for H5Pset_alignment
-   -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.
-    S - is an integer
-    U - is a filename.
-    T - is an integer
-    A - is an integer greater than zero
-    B - is the user block size, any value that is 512 or greater and is
-        a power of 2 (1024 default)
-    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>
-
-      <list of objects> is a comma separated list of object names, meaning apply
-        compression only to those objects. If no names are specified, the filter
-        is applied to all objects
-      <name of filter> can be:
-        GZIP, to apply the HDF5 GZIP filter (GZIP compression)
-        SZIP, to apply the HDF5 SZIP filter (SZIP compression)
-        SHUF, to apply the HDF5 shuffle filter
-        FLET, to apply the HDF5 checksum filter
-        NBIT, to apply the HDF5 NBIT filter (NBIT compression)
-        SOFF, to apply the HDF5 Scale/Offset filter
-        UD,   to apply a user defined filter
-        NONE, to remove all filters
-      <filter parameters> is optional filter parameter information
-        GZIP=<deflation level> from 1-9
-        SZIP=<pixels per block,coding> pixels per block is a even number in
-            2-32 and coding method is either EC or NN
-        SHUF (no parameter)
-        FLET (no parameter)
-        NBIT (no parameter)
-        SOFF=<scale_factor,scale_type> scale_factor is an integer and scale_type
-            is either IN or DS
-        UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>
-            required values for filter_number,cd_value_count,value_1
-            optional values for value_2 to value_N
-        NONE (no parameter)
-
-    LAYT - is a string with the format:
-
-      <list of objects>:<layout type>=<layout parameters>
-
-      <list of objects> is a comma separated list of object names, meaning that
-        layout information is supplied for those objects. If no names are
-        specified, the layout type is applied to all objects
-      <layout type> can be:
-        CHUNK, to apply chunking layout
-        COMPA, to apply compact layout
-        CONTI, to apply contiguous layout
-      <layout parameters> is optional layout information
-        CHUNK=DIM[xDIM...xDIM], the chunk size of each dimension
-        COMPA (no parameter)
-        CONTI (no parameter)
-
-Examples of use:
-
-1) h5repack -v -f GZIP=1 file1 file2
-
-   GZIP compression with level 1 to all objects
-
-2) h5repack -v -f dset1:SZIP=8,NN file1 file2
-
-   SZIP compression with 8 pixels per block and NN coding method to object dset1
-
-3) h5repack -v -l dset1,dset2:CHUNK=20x10 -f dset3,dset4,dset5:NONE file1 file2
-
-   Chunked layout, with a layout size of 20x10, to objects dset1 and dset2
-   and remove filters to objects dset3, dset4, dset5
-
-4) h5repack -L -c 10 -s 20:dtype file1 file2 
-
-   Using latest file format with maximum compact group size of 10 and
-   and minimum shared datatype size of 20
-
-5) h5repack -f SHUF -f GZIP=1 file1 file2 
-
-   Add both filters SHUF and GZIP in this order to all datasets
-
-6) h5repack -f UD=307,1,9 file1 file2 
-
-   Add bzip2 filter to all datasets
-
diff --git a/tools/h5repack/testfiles/h5repack_attr.h5 b/tools/h5repack/testfiles/h5repack_attr.h5
deleted file mode 100644
index 3bc4906..0000000
Binary files a/tools/h5repack/testfiles/h5repack_attr.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_attr_refs.h5 b/tools/h5repack/testfiles/h5repack_attr_refs.h5
deleted file mode 100644
index 56974a3..0000000
Binary files a/tools/h5repack/testfiles/h5repack_attr_refs.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_deflate.h5 b/tools/h5repack/testfiles/h5repack_deflate.h5
deleted file mode 100644
index 86d66c0..0000000
Binary files a/tools/h5repack/testfiles/h5repack_deflate.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_early.h5 b/tools/h5repack/testfiles/h5repack_early.h5
deleted file mode 100644
index 0394bef..0000000
Binary files a/tools/h5repack/testfiles/h5repack_early.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_ext.h5 b/tools/h5repack/testfiles/h5repack_ext.h5
deleted file mode 100644
index 1fe88c9..0000000
Binary files a/tools/h5repack/testfiles/h5repack_ext.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_fill.h5 b/tools/h5repack/testfiles/h5repack_fill.h5
deleted file mode 100644
index 81c32d5..0000000
Binary files a/tools/h5repack/testfiles/h5repack_fill.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_filters.h5 b/tools/h5repack/testfiles/h5repack_filters.h5
deleted file mode 100644
index 0600adb..0000000
Binary files a/tools/h5repack/testfiles/h5repack_filters.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_fletcher.h5 b/tools/h5repack/testfiles/h5repack_fletcher.h5
deleted file mode 100644
index e4e2c05..0000000
Binary files a/tools/h5repack/testfiles/h5repack_fletcher.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_hlink.h5 b/tools/h5repack/testfiles/h5repack_hlink.h5
deleted file mode 100644
index b00f9a2..0000000
Binary files a/tools/h5repack/testfiles/h5repack_hlink.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_layout.h5 b/tools/h5repack/testfiles/h5repack_layout.h5
deleted file mode 100644
index 2cc44b1..0000000
Binary files a/tools/h5repack/testfiles/h5repack_layout.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl b/tools/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
deleted file mode 100644
index 87b133d..0000000
--- a/tools/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
+++ /dev/null
@@ -1,158 +0,0 @@
-HDF5 "out-plugin_test.h5repack_layout.h5" {
-GROUP "/" {
-   DATASET "dset1" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset2" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset3" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset4" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_chunk" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, H5S_UNLIMITED ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 20, 10 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_compact" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-   DATASET "dset_contiguous" {
-      DATATYPE  H5T_STD_I32LE
-      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
-      STORAGE_LAYOUT {
-         CHUNKED ( 40, 20 )
-         SIZE 3200 (1.000:1 COMPRESSION)
-      }
-      FILTERS {
-         USER_DEFINED_FILTER {
-            FILTER_ID 257
-            COMMENT dynlib1
-            PARAMS { 9 }
-         }
-      }
-      FILLVALUE {
-         FILL_TIME H5D_FILL_TIME_IFSET
-         VALUE  H5D_FILL_VALUE_DEFAULT
-      }
-      ALLOCATION_TIME {
-         H5D_ALLOC_TIME_INCR
-      }
-   }
-}
-}
diff --git a/tools/h5repack/testfiles/h5repack_layout2.h5 b/tools/h5repack/testfiles/h5repack_layout2.h5
deleted file mode 100644
index 6e77e41..0000000
Binary files a/tools/h5repack/testfiles/h5repack_layout2.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_layout3.h5 b/tools/h5repack/testfiles/h5repack_layout3.h5
deleted file mode 100644
index 7351502..0000000
Binary files a/tools/h5repack/testfiles/h5repack_layout3.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_layouto.h5 b/tools/h5repack/testfiles/h5repack_layouto.h5
deleted file mode 100644
index 3322020..0000000
Binary files a/tools/h5repack/testfiles/h5repack_layouto.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_named_dtypes.h5 b/tools/h5repack/testfiles/h5repack_named_dtypes.h5
deleted file mode 100644
index 108bb9f..0000000
Binary files a/tools/h5repack/testfiles/h5repack_named_dtypes.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_nbit.h5 b/tools/h5repack/testfiles/h5repack_nbit.h5
deleted file mode 100644
index c678f1c..0000000
Binary files a/tools/h5repack/testfiles/h5repack_nbit.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_objs.h5 b/tools/h5repack/testfiles/h5repack_objs.h5
deleted file mode 100644
index 16d55da..0000000
Binary files a/tools/h5repack/testfiles/h5repack_objs.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_refs.h5 b/tools/h5repack/testfiles/h5repack_refs.h5
deleted file mode 100644
index 525267f..0000000
Binary files a/tools/h5repack/testfiles/h5repack_refs.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_shuffle.h5 b/tools/h5repack/testfiles/h5repack_shuffle.h5
deleted file mode 100644
index 6520193..0000000
Binary files a/tools/h5repack/testfiles/h5repack_shuffle.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_soffset.h5 b/tools/h5repack/testfiles/h5repack_soffset.h5
deleted file mode 100644
index a9457d3..0000000
Binary files a/tools/h5repack/testfiles/h5repack_soffset.h5 and /dev/null differ
diff --git a/tools/h5repack/testfiles/h5repack_szip.h5 b/tools/h5repack/testfiles/h5repack_szip.h5
deleted file mode 100644
index 5eab9f8..0000000
Binary files a/tools/h5repack/testfiles/h5repack_szip.h5 and /dev/null differ
diff --git a/tools/h5repack/testh5repack_detect_szip.c b/tools/h5repack/testh5repack_detect_szip.c
deleted file mode 100644
index e91b2f7..0000000
--- a/tools/h5repack/testh5repack_detect_szip.c
+++ /dev/null
@@ -1,62 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdio.h>
-#include "h5repack.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5test.h"
-
-
-/* Name of tool */
-#define PROGRAMNAME "h5repack_detect_szip"
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: detects szip encoder, prints "yes" or "no" to stdout.
- *          Intended to be used in test scripts.
- *
- * Return:
- *
- * Programmer:
- *
- * Date:
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-
-int main(void)
-{
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-#ifdef H5_HAVE_FILTER_SZIP
-    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
-        printf("yes\n");
-        return(1);
-    }
-#endif /* H5_HAVE_FILTER_SZIP */
-    printf("no\n");
-    return(0);
-}
diff --git a/tools/h5stat/CMakeLists.txt b/tools/h5stat/CMakeLists.txt
deleted file mode 100644
index 71c4741..0000000
--- a/tools/h5stat/CMakeLists.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_H5STAT)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the h5stat executables
-# --------------------------------------------------------------------
-add_executable (h5stat ${HDF5_TOOLS_H5STAT_SOURCE_DIR}/h5stat.c)
-TARGET_NAMING (h5stat STATIC)
-TARGET_C_PROPERTIES (h5stat STATIC " " " ")
-target_link_libraries (h5stat  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5stat PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES h5stat)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the h5stat test executables
-  # --------------------------------------------------------------------
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5stat_gentest ${HDF5_TOOLS_H5STAT_SOURCE_DIR}/h5stat_gentest.c)
-    TARGET_NAMING (h5stat_gentest STATIC)
-    TARGET_C_PROPERTIES (h5stat_gentest STATIC " " " ")
-    target_link_libraries (h5stat_gentest ${HDF5_LIB_TARGET})
-    set_target_properties (h5stat_gentest PROPERTIES FOLDER generator/tools)
-    
-    #add_test (NAME h5stat_gentest COMMAND $<TARGET_FILE:h5stat_gentest>)
-  endif (HDF5_BUILD_GENERATORS)
-
-  include (CMakeTests.cmake)
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5stat ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5stat
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/h5stat/CMakeTests.cmake b/tools/h5stat/CMakeTests.cmake
deleted file mode 100644
index 5d3c82e..0000000
--- a/tools/h5stat/CMakeTests.cmake
+++ /dev/null
@@ -1,261 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-  
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the test directory into the source directory
-  # --------------------------------------------------------------------
-  set (HDF5_REFERENCE_FILES
-      h5stat_help1.ddl
-      h5stat_help2.ddl
-      h5stat_notexist.ddl
-      h5stat_nofile.ddl
-      h5stat_filters.ddl
-      h5stat_filters-file.ddl
-      h5stat_filters-F.ddl
-      h5stat_filters-d.ddl
-      h5stat_filters-g.ddl
-      h5stat_filters-dT.ddl
-      h5stat_filters-UD.ddl
-      h5stat_filters-UT.ddl
-      h5stat_tsohm.ddl
-      h5stat_newgrat.ddl
-      h5stat_newgrat-UG.ddl
-      h5stat_newgrat-UA.ddl
-      h5stat_idx.ddl
-      h5stat_err1_links.ddl
-      h5stat_links1.ddl
-      h5stat_links2.ddl
-      h5stat_links3.ddl
-      h5stat_links4.ddl
-      h5stat_links5.ddl
-      h5stat_err1_dims.ddl
-      h5stat_dims1.ddl
-      h5stat_dims2.ddl
-      h5stat_err1_numattrs.ddl
-      h5stat_err2_numattrs.ddl
-      h5stat_numattrs1.ddl
-      h5stat_numattrs2.ddl
-      h5stat_numattrs3.ddl
-      h5stat_numattrs4.ddl
-  )
-  set (HDF5_REFERENCE_TEST_FILES
-      h5stat_filters.h5
-      h5stat_tsohm.h5
-      h5stat_newgrat.h5
-      h5stat_idx.h5
-      h5stat_threshold.h5
-  )
-
-  foreach (ddl_file ${HDF5_REFERENCE_FILES})
-    set (ddldest "${PROJECT_BINARY_DIR}/${ddl_file}")
-    #message (STATUS " Translating ${ddl_file}")
-    add_custom_command (
-        TARGET     h5stat
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5STAT_SOURCE_DIR}/testfiles/${ddl_file} ${ddldest}
-    )
-  endforeach (ddl_file ${HDF5_REFERENCE_FILES})
-
-  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/${h5_file}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5stat
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_H5STAT_SOURCE_DIR}/testfiles/${h5_file} ${dest}
-    )
-  endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-  
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_H5_TEST resultfile resultcode)
-    # If using memchecker add tests without using scripts
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5STAT-${resultfile} COMMAND $<TARGET_FILE:h5stat> ${ARGN})
-      if (NOT ${resultcode} STREQUAL "0")
-        set_tests_properties (H5STAT-${resultfile} PROPERTIES WILL_FAIL "true")
-      endif (NOT ${resultcode} STREQUAL "0")
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5STAT-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5STAT-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove ${resultfile}.out ${resultfile}.out.err
-      )
-      add_test (
-          NAME H5STAT-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5stat>"
-              -D "TEST_ARGS=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.ddl"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5STAT-${resultfile} PROPERTIES DEPENDS "H5STAT-${resultfile}-clear-objects")
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_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 H5STAT-clearall-objects
-      COMMAND    ${CMAKE_COMMAND}
-          -E remove 
-          h5stat_help1.out
-          h5stat_help1.out.err
-          h5stat_help2.out
-          h5stat_help2.out.err
-          h5stat_notexist.out
-          h5stat_notexist.out.err
-          h5stat_nofile.out
-          h5stat_nofile.out.err
-          h5stat_filters.out
-          h5stat_filters.out.err
-          h5stat_filters-file.out
-          h5stat_filters-file.out.err
-          h5stat_filters-F.out
-          h5stat_filters-F.out.err
-          h5stat_filters-d.out
-          h5stat_filters-d.out.err
-          h5stat_filters-g.out
-          h5stat_filters-g.out.err
-          h5stat_filters-dT.out
-          h5stat_filters-dT.out.err
-          h5stat_filters-UD.out
-          h5stat_filters-UD.out.err
-          h5stat_filters-UT.out
-          h5stat_filters-UT.out.err
-          h5stat_tsohm.out
-          h5stat_tsohm.out.err
-          h5stat_newgrat.out
-          h5stat_newgrat.out.err
-          h5stat_newgrat-UG.out
-          h5stat_newgrat-UG.out.err
-          h5stat_newgrat-UA.out
-          h5stat_newgrat-UA.out.err
-          h5stat_err1_links.out
-          h5stat_err1_links.out.err
-          h5stat_links1.out
-          h5stat_links1.out.err
-          h5stat_links2.out
-          h5stat_links2.out.err
-          h5stat_links3.out
-          h5stat_links3.out.err
-          h5stat_links4.out
-          h5stat_links4.out.err
-          h5stat_links5.out
-          h5stat_links5.out.err
-          h5stat_err1_dims.out
-          h5stat_err1_dims.out.err
-          h5stat_dims1.out
-          h5stat_dims1.out.err
-          h5stat_dims2.out
-          h5stat_dims2.out.err
-          h5stat_err1_numattrs.out
-          h5stat_err1_numattrs.out.err
-          h5stat_err2_numattrs.out
-          h5stat_err2_numattrs.out.err
-          h5stat_numattrs1.out
-          h5stat_numattrs1.out.err
-          h5stat_numattrs2.out
-          h5stat_numattrs2.out.err
-          h5stat_numattrs3.out
-          h5stat_numattrs3.out.err
-          h5stat_numattrs4.out
-          h5stat_numattrs4.out.err
-    )
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5STAT-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5STAT-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-# Test for help flag
-  ADD_H5_TEST (h5stat_help1 0 -h)
-  ADD_H5_TEST (h5stat_help2 0 --help)
-
-# Test when h5stat a file that does not exist
-  ADD_H5_TEST (h5stat_notexist 1 notexist.h5)
-  ADD_H5_TEST (h5stat_nofile 1 '')
-
-# Test file with groups, compressed datasets, user-applied fileters, etc.
-# h5stat_filters.h5 is a copy of ../../testfiles/tfilters.h5 as of release 1.8.0-alpha4
-  ADD_H5_TEST (h5stat_filters 0 h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-file 0 -f h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-F 0 -F h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-d 0 -d h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-g 0 -g h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-dT 0 -dT h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-UD 0 -D h5stat_filters.h5)
-  ADD_H5_TEST (h5stat_filters-UT 0 -T h5stat_filters.h5)
-# h5stat_tsohm.h5 is a copy of ../../../test/tsohm.h5 generated by tsohm.c 
-# as of release 1.8.0-alpha4
-  ADD_H5_TEST (h5stat_tsohm 0 h5stat_tsohm.h5)
-# h5stat_newgrat.h5 is generated by h5stat_gentest.c
-  ADD_H5_TEST (h5stat_newgrat 0 h5stat_newgrat.h5)
-  ADD_H5_TEST (h5stat_newgrat-UG 0 -G h5stat_newgrat.h5)
-  ADD_H5_TEST (h5stat_newgrat-UA 0 -A h5stat_newgrat.h5)
-# h5stat_idx.h5 is generated by h5stat_gentest.c
-  ADD_H5_TEST (h5stat_idx 0 h5stat_idx.h5)
-#
-# Tests for -l (--links) option on h5stat_threshold.h5: 
-#   -l 0 (incorrect threshold value)
-#   -g -l 8
-#   --links=8
-#   --links=20 -g
-  ADD_H5_TEST (h5stat_err1_links 1 -l 0 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_links1 0 -g -l 8 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_links2 0 --links=8 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_links3 0 --links=20 -g h5stat_threshold.h5)
-#
-# Tests for -l (--links) option on h5stat_newgrat.h5: 
-#   -g
-#   -g -l 40000
-  ADD_H5_TEST (h5stat_links4 0 -g h5stat_newgrat.h5)
-  ADD_H5_TEST (h5stat_links5 0 -g -l 40000 h5stat_newgrat.h5)
-#
-# Tests for -m (--dims) option on h5stat_threshold.h5
-#   -d --dims=-1 (incorrect threshold value)
-#   -gd -m 5
-#   -d --di=15
-  ADD_H5_TEST (h5stat_err1_dims 1 -d --dims=-1 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_dims1 0 -gd -m 5 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_dims2 0 -d --di=15 h5stat_threshold.h5)
-#
-# Tests for -a option on h5stat_threshold.h5
-#   -a -2 (incorrect threshold value)
-#   --numattrs (without threshold value)
-#   -AS -a 10
-#   -a 1
-#   -A --numattrs=25
-  ADD_H5_TEST (h5stat_err1_numattrs 1 -a -2 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_err2_numattrs 1 --numattrs h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_numattrs1 0 -AS -a 10 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_numattrs2 0 -a 1 h5stat_threshold.h5)
-  ADD_H5_TEST (h5stat_numattrs3 0 -A --numattrs=25 h5stat_threshold.h5)
-#
-# Tests for -a option on h5stat_newgrat.h5
-#   -A -a 100
-  ADD_H5_TEST (h5stat_numattrs4 0 -A -a 100 h5stat_newgrat.h5)
-#
-  
\ No newline at end of file
diff --git a/tools/h5stat/Makefile.am b/tools/h5stat/Makefile.am
deleted file mode 100644
index 2a5921f..0000000
--- a/tools/h5stat/Makefile.am
+++ /dev/null
@@ -1,55 +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.
-##
-## 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=h5stat_gentest
-TEST_SCRIPT=testh5stat.sh
-
-check_PROGRAMS=$(TEST_PROG)
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5stat$(EXEEXT)
-
-# These are our main targets, the tools
-bin_PROGRAMS=h5stat
-bin_SCRIPTS=
-
-# Add h5stat specific linker flags here
-h5stat_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Tell automake to clean h5redeploy script
-CLEANFILES=
-
-# Temporary files.  *.h5 are generated by h5repart_gentest.  They should
-# copied to the testfiles/ directory if update is required. fst_family*.h5
-# and scd_family*.h5 were created by setting the HDF5_NOCLEANUP variable.
-CHECK_CLEANFILES+=*.h5 ../testfiles/fst_family*.h5 ../testfiles/scd_family*.h5
-
-# These were generated by configure.  Remove them only when distclean.
-DISTCLEANFILES=testh5stat.sh
-
-# All programs rely on hdf5 library and h5tools library
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5stat/Makefile.in b/tools/h5stat/Makefile.in
deleted file mode 100644
index 10a3ae8..0000000
--- a/tools/h5stat/Makefile.in
+++ /dev/null
@@ -1,1538 +0,0 @@
-# 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)
-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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5stat.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
-am__EXEEXT_1 = h5stat_gentest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-h5stat_SOURCES = h5stat.c
-h5stat_OBJECTS = h5stat.$(OBJEXT)
-h5stat_LDADD = $(LDADD)
-h5stat_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 = 
-h5stat_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5stat_LDFLAGS) $(LDFLAGS) -o $@
-h5stat_gentest_SOURCES = h5stat_gentest.c
-h5stat_gentest_OBJECTS = h5stat_gentest.$(OBJEXT)
-h5stat_gentest_LDADD = $(LDADD)
-h5stat_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-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; }; \
-  }
-SCRIPTS = $(bin_SCRIPTS)
-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 = h5stat.c h5stat_gentest.c
-DIST_SOURCES = h5stat.c h5stat_gentest.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__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)/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@
-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_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5repart_gentest.  They should
-# copied to the testfiles/ directory if update is required. fst_family*.h5
-# 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
-
-#test script and program
-TEST_PROG = h5stat_gentest
-TEST_SCRIPT = testh5stat.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5stat$(EXEEXT)
-bin_SCRIPTS = 
-
-# Add h5stat specific linker flags here
-h5stat_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Tell automake to clean h5redeploy script
-CLEANFILES = 
-
-# These were generated by configure.  Remove them only when distclean.
-DISTCLEANFILES = testh5stat.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/h5stat/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/h5stat/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):
-testh5stat.sh: $(top_builddir)/config.status $(srcdir)/testh5stat.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
-
-h5stat$(EXEEXT): $(h5stat_OBJECTS) $(h5stat_DEPENDENCIES) $(EXTRA_h5stat_DEPENDENCIES) 
-	@rm -f h5stat$(EXEEXT)
-	$(AM_V_CCLD)$(h5stat_LINK) $(h5stat_OBJECTS) $(h5stat_LDADD) $(LIBS)
-
-h5stat_gentest$(EXEEXT): $(h5stat_gentest_OBJECTS) $(h5stat_gentest_DEPENDENCIES) $(EXTRA_h5stat_gentest_DEPENDENCIES) 
-	@rm -f h5stat_gentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5stat_gentest_OBJECTS) $(h5stat_gentest_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_SCRIPTS)'; 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 \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n' \
-	    -e 'h;s|.*|.|' \
-	    -e 'p;x;s,.*/,,;$(transform)' | 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; \
-	      if (++n[d] == $(am__install_max)) { \
-		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
-	    else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	     } \
-	; done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	       sed -e 's,.*/,,;$(transform)'`; \
-	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5stat.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5stat_gentest.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 $$?
-h5stat_gentest.log: h5stat_gentest$(EXEEXT)
-	@p='h5stat_gentest$(EXEEXT)'; \
-	b='h5stat_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) $(SCRIPTS) all-local
-installdirs:
-	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-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:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-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-binSCRIPTS
-
-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 uninstall-binSCRIPTS
-
-.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-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 \
-	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
-# 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/h5stat/h5stat.c b/tools/h5stat/h5stat.c
deleted file mode 100644
index a331014..0000000
--- a/tools/h5stat/h5stat.c
+++ /dev/null
@@ -1,1815 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <stdlib.h>
-#include <string.h>
-#include "H5private.h"    /* Generic Functions      */
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5tools_ref.h"
-#include "h5trav.h"
-#include "hdf5.h"
-
-/* Name of tool */
-#define PROGRAMNAME "h5stat"
-
-/* Parameters to control statistics gathered */
-
-/* Default threshold for small groups/datasets/attributes */
-#define DEF_SIZE_SMALL_GROUPS       	10
-#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 {
-    hid_t tid;                          /* ID of datatype */
-    unsigned long count;                /* Number of types found */
-    unsigned long named;                /* Number of types that are named */
-} dtype_info_t;
-
-typedef struct ohdr_info_t {
-    hsize_t total_size;                 /* Total size of object headers */
-    hsize_t free_size;                  /* Total free space in object headers */
-} ohdr_info_t;
-
-/* Info to pass to the iteration functions */
-typedef struct iter_t {
-    hid_t fid;                          /* File ID */
-    hsize_t filesize;      /* Size of the file */
-    unsigned long uniq_groups;          /* Number of unique groups */
-    unsigned long uniq_dsets;           /* Number of unique datasets */
-    unsigned long uniq_dtypes;          /* Number of unique named datatypes */
-    unsigned long uniq_links;           /* Number of unique links */
-    unsigned long uniq_others;          /* Number of other unique objects */
-
-    unsigned long max_links;            /* Maximum # of links to an object */
-    hsize_t max_fanout;                 /* Maximum fanout from a group */
-    unsigned long *num_small_groups;    /* Size of small groups tracked */
-    unsigned group_nbins;               /* Number of bins for group counts */
-    unsigned long *group_bins;          /* Pointer to array of bins for group counts */
-    ohdr_info_t group_ohdr_info;        /* Object header information for groups */
-
-    hsize_t  max_attrs;                 /* Maximum attributes from a group */
-    unsigned long *num_small_attrs;    	/* Size of small attributes tracked */
-    unsigned attr_nbins;                /* Number of bins for attribute counts */
-    unsigned long *attr_bins;           /* Pointer to array of bins for attribute counts */
-
-    unsigned max_dset_rank;             /* Maximum rank of dataset */
-    unsigned long dset_rank_count[H5S_MAX_RANK];   /* Number of datasets of each rank */
-    hsize_t max_dset_dims;              /* Maximum dimension size of dataset */
-    unsigned long *small_dset_dims;    /* Size of dimensions of small datasets tracked */
-    unsigned long dset_layouts[H5D_NLAYOUTS];           /* Type of storage for each dataset */
-    unsigned long dset_comptype[H5_NFILTERS_IMPL]; 	/* Number of currently implemented filters */
-    unsigned long dset_ntypes;          /* Number of diff. dataset datatypes found */
-    dtype_info_t *dset_type_info;       /* Pointer to dataset datatype information found */
-    unsigned dset_dim_nbins;            /* Number of bins for dataset dimensions */
-    unsigned long *dset_dim_bins;       /* Pointer to array of bins for dataset dimensions */
-    ohdr_info_t dset_ohdr_info;         /* Object header information for datasets */
-    hsize_t dset_storage_size;          /* Size of raw data for datasets */
-    hsize_t dset_external_storage_size; /* Size of raw data for datasets with external storage */
-    ohdr_info_t dtype_ohdr_info;        /* Object header information for datatypes */
-    hsize_t groups_btree_storage_size;  /* btree size for group */
-    hsize_t groups_heap_storage_size;   /* heap size for group */
-    hsize_t attrs_btree_storage_size;   /* btree size for attributes (1.8) */
-    hsize_t attrs_heap_storage_size;    /* fractal heap size for attributes (1.8) */
-    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 */
-    int           local;                /* Flag to indicate iteration over the object*/
-} iter_t;
-
-
-static int        display_all = TRUE;
-
-/* Enable the printing of selected statistics */
-static int        display_file = FALSE;     /* display file information */
-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 */
-static int        display_group_metadata = FALSE;   /* display file space info for groups' metadata */
-static int        display_dset_metadata = FALSE;    /* display file space info for datasets' metadata */
-
-static int        display_object = FALSE;  /* not implemented yet */
-
-/* Initialize threshold for small groups/datasets/attributes */
-static int	  sgroups_threshold = DEF_SIZE_SMALL_GROUPS;
-static int	  sdsets_threshold = DEF_SIZE_SMALL_DSETS;
-static int	  sattrs_threshold = DEF_SIZE_SMALL_ATTRS;
-
-/* a structure for handling the order command-line parameters come in */
-struct handler_t {
-    size_t obj_count;
-    char **obj;
-};
-
-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'},
-    {"hel", no_arg, 'h'},
-    {"he", no_arg, 'h'},
-    {"filemetadata", no_arg, 'F'},
-    {"filemetadat", no_arg, 'F'},
-    {"filemetada", no_arg, 'F'},
-    {"filemetad", no_arg, 'F'},
-    {"filemeta", no_arg, 'F'},
-    {"filemet", no_arg, 'F'},
-    {"fileme", no_arg, 'F'},
-    {"filem", no_arg, 'F'},
-    {"file", no_arg, 'f'},
-    {"fil", no_arg, 'f'},
-    {"fi", no_arg, 'f'},
-    {"groupmetadata", no_arg, 'G'},
-    {"groupmetadat", no_arg, 'G'},
-    {"groupmetada", no_arg, 'G'},
-    {"groupmetad", no_arg, 'G'},
-    {"groupmeta", no_arg, 'G'},
-    {"groupmet", no_arg, 'G'},
-    {"groupme", no_arg, 'G'},
-    {"groupm", no_arg, 'G'},
-    {"group", no_arg, 'g'},
-    {"grou", no_arg, 'g'},
-    {"gro", no_arg, 'g'},
-    {"gr", no_arg, 'g'},
-    { "links", require_arg, 'l' },
-    { "link", require_arg, 'l' },
-    { "lin", require_arg, 'l' },
-    { "li", require_arg, 'l' },
-    {"dsetmetadata", no_arg, 'D'},
-    {"dsetmetadat", no_arg, 'D'},
-    {"dsetmetada", no_arg, 'D'},
-    {"dsetmetad", no_arg, 'D'},
-    {"dsetmeta", no_arg, 'D'},
-    {"dsetmet", no_arg, 'D'},
-    {"dsetme", no_arg, 'D'},
-    {"dsetm", no_arg, 'D'},
-    {"dset", no_arg, 'd'},
-    {"dse", no_arg, 'd'},
-    {"ds", no_arg, 'd'},
-    {"dims", require_arg, 'm'},
-    {"dim", require_arg, 'm'},
-    {"di", require_arg, 'm'},
-    {"dtypemetadata", no_arg, 'T'},
-    {"dtypemetadat", no_arg, 'T'},
-    {"dtypemetada", no_arg, 'T'},
-    {"dtypemetad", no_arg, 'T'},
-    {"dtypemeta", no_arg, 'T'},
-    {"dtypemet", no_arg, 'T'},
-    {"dtypeme", no_arg, 'T'},
-    {"dtypem", no_arg, 'T'},
-    {"dtype", no_arg, 'T'},
-    {"dtyp", no_arg, 'T'},
-    {"dty", no_arg, 'T'},
-    {"dt", no_arg, 'T'},
-    { "object", require_arg, 'O' },
-    { "objec", require_arg, 'O' },
-    { "obje", require_arg, 'O' },
-    { "obj", require_arg, 'O' },
-    { "ob", require_arg, 'O' },
-    { "version", no_arg, 'V' },
-    { "versio", no_arg, 'V' },
-    { "versi", no_arg, 'V' },
-    { "vers", no_arg, 'V' },
-    { "ver", no_arg, 'V' },
-    { "ve", no_arg, 'V' },
-    { "attribute", no_arg, 'A' },
-    { "attribut", no_arg, 'A' },
-    { "attribu", no_arg, 'A' },
-    { "attrib", no_arg, 'A' },
-    { "attri", no_arg, 'A' },
-    { "attr", no_arg, 'A' },
-    { "att", no_arg, 'A' },
-    { "at", no_arg, 'A' },
-    { "numattrs", require_arg, 'a' },
-    { "numattr", require_arg, 'a' },
-    { "numatt", require_arg, 'a' },
-    { "numat", require_arg, 'a' },
-    { "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' },
-    { "summ", no_arg, 'S' },
-    { "sum", no_arg, 'S' },
-    { "su", no_arg, 'S' },
-    { NULL, 0, '\0' }
-};
-
-static void
-leave(int ret)
-{
-   h5tools_close();
-   HDexit(ret);
-}
-
-
-

-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: Compute the ceiling of log_10(x)
- *
- * Return: >0 on success, 0 on failure
- *
- *-------------------------------------------------------------------------
- */
-static void usage(const char *prog)
-{
-     HDfflush(stdout);
-     HDfprintf(stdout, "Usage: %s [OPTIONS] file\n", prog);
-     HDfprintf(stdout, "\n");
-     HDfprintf(stdout, "      OPTIONS\n");
-     HDfprintf(stdout, "     -h, --help            Print a usage message and exit\n");
-     HDfprintf(stdout, "     -V, --version         Print version number and exit\n");
-     HDfprintf(stdout, "     -f, --file            Print file information\n");
-     HDfprintf(stdout, "     -F, --filemetadata    Print file space information for file's metadata\n");
-     HDfprintf(stdout, "     -g, --group           Print group information\n");
-     HDfprintf(stdout, "     -l N, --links=N       Set the threshold for the # of links when printing\n");
-     HDfprintf(stdout, "                           information for small groups.  N is an integer greater\n");
-     HDfprintf(stdout, "                           than 0.  The default threshold is 10.\n");
-     HDfprintf(stdout, "     -G, --groupmetadata   Print file space information for groups' metadata\n");
-     HDfprintf(stdout, "     -d, --dset            Print dataset information\n");
-     HDfprintf(stdout, "     -m N, --dims=N        Set the threshold for the dimension sizes when printing\n");
-     HDfprintf(stdout, "                           information for small datasets.  N is an integer greater\n");
-     HDfprintf(stdout, "                           than 0.  The default threshold is 10.\n");
-     HDfprintf(stdout, "     -D, --dsetmetadata    Print file space information for datasets' metadata\n");
-     HDfprintf(stdout, "     -T, --dtypemetadata   Print datasets' datatype information\n");
-     HDfprintf(stdout, "     -A, --attribute       Print attribute information\n");
-     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");
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: ceil_log10
- *
- * Purpose: Compute the ceiling of log_10(x)
- *
- * Return: >0 on success, 0 on failure
- *
- * Programmer: Quincey Koziol
- *              Monday, August 22, 2005
- *
- *-------------------------------------------------------------------------
- */
-H5_ATTR_CONST static unsigned
-ceil_log10(unsigned long x)
-{
-    unsigned long pow10 = 1;
-    unsigned ret = 0;
-
-    while(x >= pow10) {
-        pow10 *= 10;
-        ret++;
-    } /* end while */
-
-    return ret;
-} /* ceil_log10() */
-
-

-/*-------------------------------------------------------------------------
- * Function: attribute_stats
- *
- * Purpose: Gather statistics about attributes on an object
- *
- * Return:  Success: 0
- *
- *          Failure: -1
- *
- * Programmer:    Quincey Koziol
- *                Tuesday, July 17, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-attribute_stats(iter_t *iter, const H5O_info_t *oi)
-{
-    unsigned     bin;               /* "bin" the number of objects falls in */
-
-    /* Update dataset & attribute metadata info */
-    iter->attrs_btree_storage_size += oi->meta_size.attr.index_size;
-    iter->attrs_heap_storage_size += oi->meta_size.attr.heap_size;
-
-    /* Update small # of attribute count & limits */
-    if(oi->num_attrs <= (hsize_t)sattrs_threshold)
-        (iter->num_small_attrs[(size_t)oi->num_attrs])++;
-    if(oi->num_attrs > iter->max_attrs)
-        iter->max_attrs = oi->num_attrs;
-
-    /* Add attribute count to proper bin */
-    bin = ceil_log10((unsigned long)oi->num_attrs);
-    if((bin + 1) > iter->attr_nbins) {
-  iter->attr_bins = (unsigned long *)HDrealloc(iter->attr_bins, (bin + 1) * sizeof(unsigned long));
-        HDassert(iter->attr_bins);
-
-  /* Initialize counts for intermediate bins */
-        while(iter->attr_nbins < bin)
-      iter->attr_bins[iter->attr_nbins++] = 0;
-        iter->attr_nbins++;
-
-        /* Initialize count for new bin */
-        iter->attr_bins[bin] = 1;
-     } /* end if */
-     else
-         (iter->attr_bins[bin])++;
-
-     return 0;
-} /* end attribute_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function: group_stats
- *
- * Purpose: Gather statistics about the group
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Quincey Koziol
- *             Tuesday, August 16, 2005
- *
- * Modifications: Refactored code from the walk_function
- *                EIP, Wednesday, August 16, 2006
- *
- *      Vailin Choi 12 July 2007
- *      1. Gathered storage info for btree and heap
- *         (groups and attributes)
- *      2. Gathered info for attributes
- *
- *      Vailin Choi 14 July 2007
- *      Cast "num_objs" and "num_attrs" to size_t
- *      Due to the -Mbounds problem for the pgi-32 bit compiler on indexing
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-group_stats(iter_t *iter, const char *name, const H5O_info_t *oi)
-{
-    H5G_info_t     ginfo;                  /* Group information */
-    unsigned     bin;                     /* "bin" the number of objects falls in */
-    herr_t     ret;
-
-    /* Gather statistics about this type of object */
-    iter->uniq_groups++;
-
-    /* Get object header information */
-    iter->group_ohdr_info.total_size += oi->hdr.space.total;
-    iter->group_ohdr_info.free_size += oi->hdr.space.free;
-
-    /* Get group information */
-    ret = H5Gget_info_by_name(iter->fid, name, &ginfo, H5P_DEFAULT);
-    HDassert(ret >= 0);
-
-    /* Update link stats */
-    /* Collect statistics for small groups */
-    if(ginfo.nlinks < (hsize_t)sgroups_threshold)
-        (iter->num_small_groups[(size_t)ginfo.nlinks])++;
-    /* Determine maximum link count */
-    if(ginfo.nlinks > iter->max_fanout)
-        iter->max_fanout = ginfo.nlinks;
-
-    /* Add group count to proper bin */
-    bin = ceil_log10((unsigned long)ginfo.nlinks);
-    if((bin + 1) > iter->group_nbins) {
-        /* Allocate more storage for info about dataset's datatype */
-        iter->group_bins = (unsigned long *)HDrealloc(iter->group_bins, (bin + 1) * sizeof(unsigned long));
-        HDassert(iter->group_bins);
-
-  /* Initialize counts for intermediate bins */
-        while(iter->group_nbins < bin)
-            iter->group_bins[iter->group_nbins++] = 0;
-        iter->group_nbins++;
-
-        /* Initialize count for new bin */
-        iter->group_bins[bin] = 1;
-    } /* end if */
-    else
-        (iter->group_bins[bin])++;
-
-    /* Update group metadata info */
-    iter->groups_btree_storage_size += oi->meta_size.obj.index_size;
-    iter->groups_heap_storage_size += oi->meta_size.obj.heap_size;
-
-    /* Update attribute metadata info */
-    ret = attribute_stats(iter, oi);
-    HDassert(ret >= 0);
-
-    return 0;
-} /* end group_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function: dataset_stats
- *
- * Purpose: Gather statistics about the dataset
- *
- * Return:  Success: 0
- *
- *          Failure: -1
- *
- * Programmer:    Quincey Koziol
- *                Tuesday, August 16, 2005
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-dataset_stats(iter_t *iter, const char *name, const H5O_info_t *oi)
-{
-    unsigned     bin;               /* "bin" the number of objects falls in */
-    hid_t     did;               /* Dataset ID */
-    hid_t     sid;               /* Dataspace ID */
-    hid_t     tid;               /* Datatype ID */
-    hid_t     dcpl;              /* Dataset creation property list ID */
-    hsize_t     dims[H5S_MAX_RANK];/* Dimensions of dataset */
-    H5D_layout_t   lout;              /* Layout of dataset */
-    unsigned     type_found;        /* Whether the dataset's datatype was */
-                                         /* already found */
-    int     ndims;             /* Number of dimensions of dataset */
-    hsize_t     storage;           /* Size of dataset storage */
-    unsigned     u;                 /* Local index variable */
-    int     num_ext;           /* Number of external files for a dataset */
-    int     nfltr;             /* Number of filters for a dataset */
-    H5Z_filter_t  fltr;              /* Filter identifier */
-    herr_t     ret;
-
-    /* Gather statistics about this type of object */
-    iter->uniq_dsets++;
-
-    /* Get object header information */
-    iter->dset_ohdr_info.total_size += oi->hdr.space.total;
-    iter->dset_ohdr_info.free_size += oi->hdr.space.free;
-
-    did = H5Dopen2(iter->fid, name, H5P_DEFAULT);
-    HDassert(did > 0);
-
-    /* Update dataset metadata info */
-    iter->datasets_index_storage_size += oi->meta_size.obj.index_size;
-    iter->datasets_heap_storage_size += oi->meta_size.obj.heap_size;
-
-    /* Update attribute metadata info */
-    ret = attribute_stats(iter, oi);
-    HDassert(ret >= 0);
-
-    /* Get storage info */
-    storage = H5Dget_storage_size(did);
-
-    /* Gather layout statistics */
-    dcpl = H5Dget_create_plist(did);
-    HDassert(dcpl > 0);
-
-    lout = H5Pget_layout(dcpl);
-    HDassert(lout >= 0);
-
-    /* Object header's total size for H5D_COMPACT layout includes raw data size */
-    /* "storage" also includes H5D_COMPACT raw data size */
-    if(lout == H5D_COMPACT)
-        iter->dset_ohdr_info.total_size -= storage;
-
-    /* Track the layout type for dataset */
-    (iter->dset_layouts[lout])++;
-
-    /* Get the number of external files for the dataset */
-    num_ext = H5Pget_external_count(dcpl);
-    assert (num_ext >= 0);
-
-    /* Accumulate raw data size accordingly */
-    if(num_ext) {
-        iter->nexternal += (unsigned long)num_ext;
-        iter->dset_external_storage_size += (unsigned long)storage;
-    } else
-        iter->dset_storage_size += storage;
-
-    /* Gather dataspace statistics */
-    sid = H5Dget_space(did);
-    HDassert(sid > 0);
-
-    ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
-    HDassert(ndims >= 0);
-
-    /* Check for larger rank of dataset */
-    if((unsigned)ndims > iter->max_dset_rank)
-        iter->max_dset_rank = (unsigned)ndims;
-
-    /* Track the number of datasets with each rank */
-    (iter->dset_rank_count[ndims])++;
-
-    /* Only gather dim size statistics on 1-D datasets */
-    if(ndims == 1) {
-	/* Determine maximum dimension size */
-	if(dims[0] > iter->max_dset_dims)
-	    iter->max_dset_dims = dims[0];
-	/* Collect statistics for small datasets */
-       if(dims[0] < (hsize_t)sdsets_threshold)
-           (iter->small_dset_dims[(size_t)dims[0]])++;
-
-       /* Add dim count to proper bin */
-       bin = ceil_log10((unsigned long)dims[0]);
-       if((bin + 1) > iter->dset_dim_nbins) {
-          /* Allocate more storage for info about dataset's datatype */
-          iter->dset_dim_bins = (unsigned long *)HDrealloc(iter->dset_dim_bins, (bin + 1) * sizeof(unsigned long));
-          HDassert(iter->dset_dim_bins);
-
-          /* Initialize counts for intermediate bins */
-          while(iter->dset_dim_nbins < bin)
-              iter->dset_dim_bins[iter->dset_dim_nbins++] = 0;
-          iter->dset_dim_nbins++;
-
-          /* Initialize count for this bin */
-          iter->dset_dim_bins[bin] = 1;
-        } /* end if */
-        else
-            (iter->dset_dim_bins[bin])++;
-    } /* end if */
-
-    ret = H5Sclose(sid);
-    HDassert(ret >= 0);
-
-    /* Gather datatype statistics */
-    tid = H5Dget_type(did);
-    HDassert(tid > 0);
-
-    type_found = FALSE;
-    for(u = 0; u < iter->dset_ntypes; u++)
-        if(H5Tequal(iter->dset_type_info[u].tid, tid) > 0) {
-            type_found = TRUE;
-            break;
-        } /* end for */
-    if(type_found)
-         (iter->dset_type_info[u].count)++;
-    else {
-        unsigned curr_ntype = (unsigned)iter->dset_ntypes;
-
-        /* Increment # of datatypes seen for datasets */
-        iter->dset_ntypes++;
-
-        /* Allocate more storage for info about dataset's datatype */
-        iter->dset_type_info = (dtype_info_t *)HDrealloc(iter->dset_type_info, iter->dset_ntypes * sizeof(dtype_info_t));
-        HDassert(iter->dset_type_info);
-
-        /* Initialize information about datatype */
-        iter->dset_type_info[curr_ntype].tid = H5Tcopy(tid);
-        HDassert(iter->dset_type_info[curr_ntype].tid > 0);
-        iter->dset_type_info[curr_ntype].count = 1;
-        iter->dset_type_info[curr_ntype].named = 0;
-
-        /* Set index for later */
-        u = curr_ntype;
-    } /* end else */
-
-    /* Check if the datatype is a named datatype */
-    if(H5Tcommitted(tid) > 0)
-        (iter->dset_type_info[u].named)++;
-
-    ret = H5Tclose(tid);
-    HDassert(ret >= 0);
-
-    /* Track different filters */
-    if((nfltr = H5Pget_nfilters(dcpl)) >= 0) {
-       if(nfltr == 0)
-           iter->dset_comptype[0]++;
-        for(u = 0; u < (unsigned)nfltr; u++) {
-            fltr = H5Pget_filter2(dcpl, u, 0, 0, 0, 0, 0, NULL);
-            if(fltr >= 0) {
-                if(fltr < (H5_NFILTERS_IMPL - 1))
-                    iter->dset_comptype[fltr]++;
-                else
-                    iter->dset_comptype[H5_NFILTERS_IMPL - 1]++; /*other filters*/
-            } /* end if */
-        } /* end for */
-    } /* endif nfltr */
-
-     ret = H5Pclose(dcpl);
-     HDassert(ret >= 0);
-
-     ret = H5Dclose(did);
-     HDassert(ret >= 0);
-
-     return 0;
-}  /* end dataset_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function: datatype_stats
- *
- * Purpose: Gather statistics about the datatype
- *
- * Return:  Success: 0
- *          Failure: -1
- *
- * Programmer:    Vailin Choi; July 7th, 2009
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-datatype_stats(iter_t *iter, const H5O_info_t *oi)
-{
-    herr_t ret;
-
-    /* Gather statistics about this type of object */
-    iter->uniq_dtypes++;
-
-    /* Get object header information */
-    iter->dtype_ohdr_info.total_size += oi->hdr.space.total;
-    iter->dtype_ohdr_info.free_size += oi->hdr.space.free;
-
-    /* Update attribute metadata info */
-    ret = attribute_stats(iter, oi);
-    HDassert(ret >= 0);
-
-     return 0;
-}  /* end datatype_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function: obj_stats
- *
- * Purpose: Gather statistics about an object
- *
- * Return: Success: 0
- *       Failure: -1
- *
- * Programmer: Quincey Koziol
- *             Tuesday, November 6, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-obj_stats(const char *path, const H5O_info_t *oi, const char *already_visited,
-    void *_iter)
-{
-    iter_t *iter = (iter_t *)_iter;
-
-    /* If the object has already been seen then just return */
-    if(NULL == already_visited) {
-        /* Gather some general statistics about the object */
-        if(oi->rc > iter->max_links)
-            iter->max_links = oi->rc;
-
-        switch(oi->type) {
-            case H5O_TYPE_GROUP:
-                group_stats(iter, path, oi);
-                break;
-
-            case H5O_TYPE_DATASET:
-                dataset_stats(iter, path, oi);
-                break;
-
-            case H5O_TYPE_NAMED_DATATYPE:
-                datatype_stats(iter, oi);
-                break;
-
-            case H5O_TYPE_UNKNOWN:
-            case H5O_TYPE_NTYPES:
-            default:
-                /* Gather statistics about this type of object */
-                iter->uniq_others++;
-                break;
-        } /* end switch */
-    } /* end if */
-
-    return 0;
-} /* end obj_stats() */
-
-

-/*-------------------------------------------------------------------------
- * Function: lnk_stats
- *
- * Purpose: Gather statistics about a link
- *
- * Return: Success: 0
- *
- *  Failure: -1
- *
- * Programmer: Quincey Koziol
- *             Tuesday, November 6, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-lnk_stats(const char H5_ATTR_UNUSED *path, const H5L_info_t *li, void *_iter)
-{
-    iter_t *iter = (iter_t *)_iter;
-
-    switch(li->type) {
-        case H5L_TYPE_SOFT:
-        case H5L_TYPE_EXTERNAL:
-            /* Gather statistics about links and UD links */
-            iter->uniq_links++;
-            break;
-
-        case H5L_TYPE_HARD:
-        case H5L_TYPE_MAX:
-        case H5L_TYPE_ERROR:
-        default:
-            /* Gather statistics about this type of object */
-            iter->uniq_others++;
-            break;
-    } /* end switch() */
-
-    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
- *
- * Purpose: Free handler structure
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- *-------------------------------------------------------------------------
- */
-static void
-hand_free(struct handler_t *hand)
-{
-    if(hand) {
-        unsigned u;
-
-        for(u = 0; u < hand->obj_count; u++)
-            if(hand->obj[u]) {
-                HDfree(hand->obj[u]);
-                hand->obj[u] = NULL;
-            } /* end if */
-        hand->obj_count = 0;
-        HDfree(hand->obj);
-        HDfree(hand);
-    } /* end if */
-} /* end hand_free() */
-
-

-/*-------------------------------------------------------------------------
- * Function: parse_command_line
- *
- * Purpose: Parses command line and sets up global variable to control output
- *
- * Return: Success: 0
- *
- * Failure: -1
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- *-------------------------------------------------------------------------
- */
-static int
-parse_command_line(int argc, const char *argv[], struct handler_t **hand_ret)
-{
-    int                opt;
-    unsigned           u;
-    struct handler_t   *hand = NULL;
-
-    /* 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 done;
-                break;
-
-            case 'V':
-                print_version(h5tools_getprogname());
-                h5tools_setstatus(EXIT_SUCCESS);
-                goto done;
-                break;
-
-            case 'F':
-                display_all = FALSE;
-                display_file_metadata = TRUE;
-                break;
-
-            case 'f':
-                display_all = FALSE;
-                display_file = TRUE;
-                break;
-
-            case 'G':
-                display_all = FALSE;
-                display_group_metadata = TRUE;
-                break;
-
-            case 'g':
-                display_all = FALSE;
-                display_group = TRUE;
-                break;
-
-            case 'l':
-		if(opt_arg) {
-		    sgroups_threshold = HDatoi(opt_arg);
-		    if(sgroups_threshold < 1) {
-			error_msg("Invalid threshold for small groups\n");
-			goto error;
-		    }
-		} else
-		    error_msg("Missing threshold for small groups\n");
-
-                break;
-
-            case 'D':
-                display_all = FALSE;
-                display_dset_metadata = TRUE;
-                break;
-
-            case 'd':
-                display_all = FALSE;
-                display_dset = TRUE;
-                break;
-
-            case 'm':
-		if(opt_arg) {
-		    sdsets_threshold = HDatoi(opt_arg);
-		    if(sdsets_threshold < 1) {
-			error_msg("Invalid threshold for small datasets\n");
-			goto error;
-		    }
-		} else
-		    error_msg("Missing threshold for small datasets\n");
-
-                break;
-
-            case 'T':
-                display_all = FALSE;
-                display_dset_dtype_meta = TRUE;
-                break;
-
-            case 'A':
-                display_all = FALSE;
-                display_attr = TRUE;
-                break;
-
-            case 'a':
-		if(opt_arg) {
-		    sattrs_threshold = HDatoi(opt_arg);
-		    if(sattrs_threshold < 1) {
-			error_msg("Invalid threshold for small # of attributes\n");
-			goto error;
-		    }
-		} else
-                    error_msg("Missing threshold for small # of attributes\n");
-
-                break;
-
-            case 's':
-                display_all = FALSE;
-                display_free_sections = TRUE;
-                break;
-
-            case 'S':
-                display_all = FALSE;
-                display_summary = TRUE;
-                break;
-
-            case 'O':
-                display_all = FALSE;
-                display_object = TRUE;
-
-                /* Allocate space to hold the command line info */
-                if(NULL == (hand = (struct handler_t *)HDcalloc((size_t)1, sizeof(struct handler_t)))) {
-                    error_msg("unable to allocate memory for object struct\n");
-                    goto error;
-                } /* end if */
-
-                /* Allocate space to hold the object strings */
-                hand->obj_count = (size_t)argc;
-                if(NULL == (hand->obj = (char **)HDcalloc((size_t)argc, sizeof(char *)))) {
-                    error_msg("unable to allocate memory for object array\n");
-                    goto error;
-                } /* end if */
-
-                /* Store object names */
-                for(u = 0; u < hand->obj_count; u++)
-                    if(NULL == (hand->obj[u] = HDstrdup(opt_arg))) {
-                        error_msg("unable to allocate memory for object name\n");
-                        goto error;
-                    } /* end if */
-                break;
-
-            default:
-                usage(h5tools_getprogname());
-                goto error;
-        } /* end switch */
-    } /* end while */
-
-    /* check for file name to be processed */
-    if(argc <= opt_ind) {
-        error_msg("missing file name\n");
-        usage(h5tools_getprogname());
-        goto error;
-    } /* end if */
-
-    /* Set handler structure */
-    *hand_ret = hand;
-
-done:
-    return 0;
-
-error:
-    hand_free(hand);
-    h5tools_setstatus(EXIT_FAILURE);
-
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function: iter_free
- *
- * Purpose: Free iter structure
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- *-------------------------------------------------------------------------
- */
-static void
-iter_free(iter_t *iter)
-{
-
-    /* Clear array of bins for group counts */
-    if(iter->group_bins) {
-        HDfree(iter->group_bins);
-        iter->group_bins = NULL;
-    } /* end if */
-
-    /* Clear array for tracking small groups */
-    if(iter->num_small_groups) {
-        HDfree(iter->num_small_groups);
-        iter->num_small_groups = NULL;
-    } /* end if */
-
-    /* Clear array of bins for attribute counts */
-    if(iter->attr_bins) {
-        HDfree(iter->attr_bins);
-        iter->attr_bins = NULL;
-    } /* end if */
-
-    /* Clear array for tracking small attributes */
-    if(iter->num_small_attrs) {
-        HDfree(iter->num_small_attrs);
-        iter->num_small_attrs= NULL;
-    } /* end if */
-
-    /* Clear dataset datatype information found */
-    if(iter->dset_type_info) {
-        HDfree(iter->dset_type_info);
-        iter->dset_type_info = NULL;
-    } /* end if */
-
-    /* Clear array of bins for dataset dimensions */
-    if(iter->dset_dim_bins) {
-        HDfree(iter->dset_dim_bins);
-        iter->dset_dim_bins = NULL;
-    } /* end if */
-
-    /* Clear array of tracking 1-D small datasets */
-    if(iter->small_dset_dims) {
-        HDfree(iter->small_dset_dims);
-        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() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_file_info
- *
- * Purpose: Prints information about file
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_file_info(const iter_t *iter)
-{
-    printf("File information\n");
-    printf("\t# of unique groups: %lu\n", iter->uniq_groups);
-    printf("\t# of unique datasets: %lu\n", iter->uniq_dsets);
-    printf("\t# of unique named datatypes: %lu\n", iter->uniq_dtypes);
-    printf("\t# of unique links: %lu\n", iter->uniq_links);
-    printf("\t# of unique other: %lu\n", iter->uniq_others);
-    printf("\tMax. # of links to object: %lu\n", iter->max_links);
-    HDfprintf(stdout, "\tMax. # of objects in group: %Hu\n", iter->max_fanout);
-
-    return 0;
-} /* print_file_info() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_file_metadata
- *
- * Purpose: Prints file space information for file's metadata
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- *-------------------------------------------------------------------------
- */
-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);
-
-    HDfprintf(stdout, "\tObject headers: (total/unused)\n");
-    HDfprintf(stdout, "\t\tGroups: %Hu/%Hu\n",
-                iter->group_ohdr_info.total_size,
-    iter->group_ohdr_info.free_size);
-    HDfprintf(stdout, "\t\tDatasets(exclude compact data): %Hu/%Hu\n",
-    iter->dset_ohdr_info.total_size,
-    iter->dset_ohdr_info.free_size);
-    HDfprintf(stdout, "\t\tDatatypes: %Hu/%Hu\n",
-                iter->dtype_ohdr_info.total_size,
-    iter->dtype_ohdr_info.free_size);
-
-    HDfprintf(stdout, "\tGroups:\n");
-    HDfprintf(stdout, "\t\tB-tree/List: %Hu\n", iter->groups_btree_storage_size);
-    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->groups_heap_storage_size);
-
-    HDfprintf(stdout, "\tAttributes:\n");
-    HDfprintf(stdout, "\t\tB-tree/List: %Hu\n", iter->attrs_btree_storage_size);
-    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->attrs_heap_storage_size);
-
-    HDfprintf(stdout, "\tChunked datasets:\n");
-    HDfprintf(stdout, "\t\tIndex: %Hu\n", iter->datasets_index_storage_size);
-
-    HDfprintf(stdout, "\tDatasets:\n");
-    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->datasets_heap_storage_size);
-
-    HDfprintf(stdout, "\tShared Messages:\n");
-    HDfprintf(stdout, "\t\tHeader: %Hu\n", iter->SM_hdr_storage_size);
-    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() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_group_info
- *
- * Purpose: Prints information about groups in the file
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- * Modifications:
- *  bug #1253; Oct 6th 2008; Vailin Choi
- *  Fixed segmentation fault: print iter->group_bins[0] when
- *  there is iter->group_nbins
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_group_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 */
-
-    printf("Small groups (with 0 to %u links):\n", sgroups_threshold-1);
-    total = 0;
-    for(u = 0; u < (unsigned)sgroups_threshold; u++) {
-        if(iter->num_small_groups[u] > 0) {
-            printf("\t# of groups with %u link(s): %lu\n", u, iter->num_small_groups[u]);
-            total += iter->num_small_groups[u];
-        } /* end if */
-    } /* end for */
-    printf("\tTotal # of small groups: %lu\n", total);
-
-    printf("Group bins:\n");
-    total = 0;
-    if((iter->group_nbins > 0) && (iter->group_bins[0] > 0)) {
-       printf("\t# of groups with 0 link: %lu\n", iter->group_bins[0]);
-       total = iter->group_bins[0];
-    } /* end if */
-    power = 1;
-    for(u = 1; u < iter->group_nbins; u++) {
-        if(iter->group_bins[u] > 0) {
-           printf("\t# of groups with %lu - %lu links: %lu\n", power, (power * 10) - 1,
-                    iter->group_bins[u]);
-           total += iter->group_bins[u];
-        } /* end if */
-        power *= 10;
-    } /* end for */
-    printf("\tTotal # of groups: %lu\n", total);
-
-    return 0;
-} /* print_group_info() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_group_metadata
- *
- * Purpose: Prints file space information for groups' metadata
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Vailin Choi; October 2009
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_group_metadata(const iter_t *iter)
-{
-    printf("File space information for groups' metadata (in bytes):\n");
-
-    HDfprintf(stdout, "\tObject headers (total/unused): %Hu/%Hu\n",
-            iter->group_ohdr_info.total_size, iter->group_ohdr_info.free_size);
-
-    HDfprintf(stdout, "\tB-tree/List: %Hu\n", iter->groups_btree_storage_size);
-    HDfprintf(stdout, "\tHeap: %Hu\n", iter->groups_heap_storage_size);
-
-    return 0;
-} /* print_group_metadata() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_dataset_info
- *
- * Purpose: Prints information about datasets in the file
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_dataset_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 */
-
-    if(iter->uniq_dsets > 0) {
-        printf("Dataset dimension information:\n");
-        printf("\tMax. rank of datasets: %u\n", iter->max_dset_rank);
-        printf("\tDataset ranks:\n");
-        for(u = 0; u < H5S_MAX_RANK; u++)
-            if(iter->dset_rank_count[u] > 0)
-                printf("\t\t# of dataset with rank %u: %lu\n", u, iter->dset_rank_count[u]);
-
-        printf("1-D Dataset information:\n");
-        HDfprintf(stdout, "\tMax. dimension size of 1-D datasets: %Hu\n", iter->max_dset_dims);
-        printf("\tSmall 1-D datasets (with dimension sizes 0 to %u):\n", sdsets_threshold - 1);
-        total = 0;
-        for(u = 0; u < (unsigned)sdsets_threshold; u++) {
-            if(iter->small_dset_dims[u] > 0) {
-                printf("\t\t# of datasets with dimension sizes %u: %lu\n", u,
-                         iter->small_dset_dims[u]);
-                total += iter->small_dset_dims[u];
-            } /* end if */
-        } /* end for */
-        printf("\t\tTotal # of small datasets: %lu\n", total);
-
-        /* Protect against no datasets in file */
-        if(iter->dset_dim_nbins > 0) {
-            printf("\t1-D Dataset dimension bins:\n");
-            total = 0;
-            if(iter->dset_dim_bins[0] > 0) {
-                printf("\t\t# of datasets with dimension size 0: %lu\n", iter->dset_dim_bins[0]);
-                total = iter->dset_dim_bins[0];
-            } /* end if */
-            power = 1;
-            for(u = 1; u < iter->dset_dim_nbins; u++) {
-                if(iter->dset_dim_bins[u] > 0) {
-                    printf("\t\t# of datasets with dimension size %lu - %lu: %lu\n", power, (power * 10) - 1,
-                             iter->dset_dim_bins[u]);
-                    total += iter->dset_dim_bins[u];
-                } /* end if */
-                power *= 10;
-            } /* end for */
-            printf("\t\tTotal # of datasets: %lu\n", total);
-        } /* end if */
-
-        printf("Dataset storage information:\n");
-        HDfprintf(stdout, "\tTotal raw data size: %Hu\n", iter->dset_storage_size);
-        HDfprintf(stdout, "\tTotal external raw data size: %Hu\n", iter->dset_external_storage_size);
-
-        printf("Dataset layout information:\n");
-        for(u = 0; u < H5D_NLAYOUTS; 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");
-        printf("\tNumber of datasets with:\n");
-        printf("\t\tNO filter: %lu\n", iter->dset_comptype[H5Z_FILTER_ERROR+1]);
-        printf("\t\tGZIP filter: %lu\n", iter->dset_comptype[H5Z_FILTER_DEFLATE]);
-        printf("\t\tSHUFFLE filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SHUFFLE]);
-        printf("\t\tFLETCHER32 filter: %lu\n", iter->dset_comptype[H5Z_FILTER_FLETCHER32]);
-        printf("\t\tSZIP filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SZIP]);
-        printf("\t\tNBIT filter: %lu\n", iter->dset_comptype[H5Z_FILTER_NBIT]);
-        printf("\t\tSCALEOFFSET filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SCALEOFFSET]);
-        printf("\t\tUSER-DEFINED filter: %lu\n", iter->dset_comptype[H5_NFILTERS_IMPL-1]);
-    } /* end if */
-
-    return 0;
-} /* print_dataset_info() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_dataset_metadata
- *
- * Purpose: Prints file space information for datasets' metadata
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer:  Vailin Choi; October 2009
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_dset_metadata(const iter_t *iter)
-{
-    printf("File space information for datasets' metadata (in bytes):\n");
-
-    HDfprintf(stdout, "\tObject headers (total/unused): %Hu/%Hu\n",
-            iter->dset_ohdr_info.total_size, iter->dset_ohdr_info.free_size);
-
-    HDfprintf(stdout, "\tIndex for Chunked datasets: %Hu\n",
-            iter->datasets_index_storage_size);
-    HDfprintf(stdout, "\tHeap: %Hu\n", iter->datasets_heap_storage_size);
-
-    return 0;
-} /* print_dset_metadata() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_dset_dtype_meta
- *
- * Purpose: Prints datasets' datatype information
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Vailin Choi; October 2009
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_dset_dtype_meta(const iter_t *iter)
-{
-    unsigned long total;        /* Total count for various statistics */
-    size_t   dtype_size;        /* Size of encoded datatype */
-    unsigned u;                 /* Local index variable */
-
-    if(iter->dset_ntypes) {
-        printf("Dataset datatype information:\n");
-        printf("\t# of unique datatypes used by datasets: %lu\n", iter->dset_ntypes);
-        total = 0;
-        for(u = 0; u < iter->dset_ntypes; u++) {
-            H5Tencode(iter->dset_type_info[u].tid, NULL, &dtype_size);
-            printf("\tDataset datatype #%u:\n", u);
-            printf("\t\tCount (total/named) = (%lu/%lu)\n",
-                    iter->dset_type_info[u].count, iter->dset_type_info[u].named);
-            printf("\t\tSize (desc./elmt) = (%lu/%lu)\n", (unsigned long)dtype_size,
-                    (unsigned long)H5Tget_size(iter->dset_type_info[u].tid));
-            H5Tclose(iter->dset_type_info[u].tid);
-            total += iter->dset_type_info[u].count;
-        } /* end for */
-        printf("\tTotal dataset datatype count: %lu\n", total);
-    } /* end if */
-
-    return 0;
-} /* print_dset_dtype_meta() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_attr_info
- *
- * Purpose: Prints information about attributes in the file
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Vailin Choi
- *             July 12, 2007
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-print_attr_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 */
-
-    printf("Small # of attributes (objects with 1 to %u attributes):\n", sattrs_threshold);
-    total = 0;
-    for(u = 1; u <= (unsigned)sattrs_threshold; u++) {
-        if(iter->num_small_attrs[u] > 0) {
-            printf("\t# of objects with %u attributes: %lu\n", u, iter->num_small_attrs[u]);
-            total += iter->num_small_attrs[u];
-        } /* end if */
-    } /* end for */
-    printf("\tTotal # of objects with small # of attributes: %lu\n", total);
-
-    printf("Attribute bins:\n");
-    total = 0;
-    power = 1;
-    for(u = 1; u < iter->attr_nbins; u++) {
-        if(iter->attr_bins[u] > 0) {
-           printf("\t# of objects with %lu - %lu attributes: %lu\n", power, (power * 10) - 1,
-                    iter->attr_bins[u]);
-           total += iter->attr_bins[u];
-        } /* end if */
-        power *= 10;
-    } /* end for */
-    printf("\tTotal # of objects with attributes: %lu\n", total);
-    printf("\tMax. # of attributes to objects: %lu\n", (unsigned long)iter->max_attrs);
-
-    return 0;
-} /* print_attr_info() */
-
-

-/*-------------------------------------------------------------------------
- * 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
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Vailin Choi; August 2009
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-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_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 +
-            iter->groups_btree_storage_size +
-            iter->groups_heap_storage_size +
-            iter->attrs_btree_storage_size +
-            iter->attrs_heap_storage_size +
-            iter->datasets_index_storage_size +
-            iter->datasets_heap_storage_size +
-            iter->SM_hdr_storage_size +
-            iter->SM_index_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);
-
-    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 + iter->free_space);
-        HDfprintf(stdout, "  Unaccounted space: %Hu bytes\n", 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);
-
-    return 0;
-} /* print_storage_summary() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_file_statistics
- *
- * Purpose: Prints file statistics
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Saturday, August 12, 2006
- *
- *-------------------------------------------------------------------------
- */
-static void
-print_file_statistics(const iter_t *iter)
-{
-    if(display_all) {
-        display_file = TRUE;
-        display_group = TRUE;
-        display_dset = TRUE;
-        display_dset_dtype_meta = TRUE;
-        display_attr = TRUE;
-        display_free_sections = TRUE;
-        display_summary = TRUE;
-
-        display_file_metadata = TRUE;
-        display_group_metadata = TRUE;
-        display_dset_metadata = TRUE;
-    }
-
-    if(display_file)            print_file_info(iter);
-    if(display_file_metadata)   print_file_metadata(iter);
-
-    if(display_group)           print_group_info(iter);
-    if(!display_all && display_group_metadata)   print_group_metadata(iter);
-
-    if(display_dset)            print_dataset_info(iter);
-    if(display_dset_dtype_meta) print_dset_dtype_meta(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() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_object_statistics
- *
- * Purpose: Prints object statistics
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Thursday, August 17, 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-print_object_statistics(const char *name)
-{
-    printf("Object name %s\n", name);
-} /* print_object_statistics() */
-
-

-/*-------------------------------------------------------------------------
- * Function: print_statistics
- *
- * Purpose: Prints statistics
- *
- * Return: Success: 0
- *
- * Failure: Never fails
- *
- * Programmer: Elena Pourmal
- *             Thursday, August 17, 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-print_statistics(const char *name, const iter_t *iter)
-{
-    if(display_object)
-        print_object_statistics(name);
-    else
-        print_file_statistics(iter);
-} /* print_statistics() */
-
-

-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Modifications:
- *      2/2010; Vailin Choi
- *      Get the size of user block
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, const char *argv[])
-{
-    iter_t              iter;
-    const char         *fname = NULL;
-    hid_t               fid = -1;
-    struct handler_t   *hand = NULL;
-
-    h5tools_setprogname(PROGRAMNAME);
-    h5tools_setstatus(EXIT_SUCCESS);
-
-    /* Disable error reporting */
-    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-
-    /* Initialize h5tools lib */
-    h5tools_init();
-    
-    HDmemset(&iter, 0, sizeof(iter));
-
-    if(parse_command_line(argc, argv, &hand) < 0)
-        goto done;
-
-    fname = argv[opt_ind];
-
-    /* Check for filename given */
-    if(fname) {
-        hid_t               fcpl;
-        H5F_info2_t         finfo;
-
-        printf("Filename: %s\n", fname);
-
-        fid = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);
-        if(fid < 0) {
-            error_msg("unable to open file \"%s\"\n", fname);
-            h5tools_setstatus(EXIT_FAILURE);
-            goto done;
-        } /* end if */
-
-        /* Initialize iter structure */
-        iter.fid = fid;
-
-        if(H5Fget_filesize(fid, &iter.filesize) < 0)
-            warn_msg("Unable to retrieve file size\n");
-        HDassert(iter.filesize != 0);
-
-        /* Get storge info for file-level structures */
-        if(H5Fget_info2(fid, &finfo) < 0)
-            warn_msg("Unable to retrieve file info\n");
-        else {
-            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));
-	iter.num_small_attrs = (unsigned long *)HDcalloc((size_t)(sattrs_threshold+1), sizeof(unsigned long));
-	iter.small_dset_dims = (unsigned long *)HDcalloc((size_t)sdsets_threshold, sizeof(unsigned long));
-
-	if(iter.num_small_groups == NULL || iter.num_small_attrs == NULL || iter.small_dset_dims == NULL) {
-	    error_msg("Unable to allocate memory for tracking small groups/datasets/attributes\n");
-            h5tools_setstatus(EXIT_FAILURE);
-	    goto done;
-	}
-
-        if((fcpl = H5Fget_create_plist(fid)) < 0)
-            warn_msg("Unable to retrieve file creation property\n");
-
-        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;
-
-            for(u = 0; u < hand->obj_count; u++) {
-                if(h5trav_visit(fid, hand->obj[u], TRUE, TRUE, obj_stats, lnk_stats, &iter) < 0)
-                    warn_msg("Unable to traverse object \"%s\"\n", hand->obj[u]);
-                else
-                    print_statistics(hand->obj[u], &iter);
-            } /* end for */
-        } /* end if */
-        else {
-            if(h5trav_visit(fid, "/", TRUE, TRUE, obj_stats, lnk_stats, &iter) < 0)
-                warn_msg("Unable to traverse objects/links in file \"%s\"\n", fname);
-            else
-                print_statistics("/", &iter);
-        } /* end else */
-    } /* end if */
-
-done:
-    hand_free(hand);
-
-    /* Free iter structure */
-    iter_free(&iter);
-
-    if(fid >= 0 && H5Fclose(fid) < 0) {
-        error_msg("unable to close file \"%s\"\n", fname);
-        h5tools_setstatus(EXIT_FAILURE);
-    } /* end if */
-
-    leave(h5tools_getstatus());
-} /* end main() */
-
diff --git a/tools/h5stat/h5stat_gentest.c b/tools/h5stat/h5stat_gentest.c
deleted file mode 100644
index b1ab168..0000000
--- a/tools/h5stat/h5stat_gentest.c
+++ /dev/null
@@ -1,449 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Generate the binary hdf5 files for the h5stat 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"
-
-/* For gen_newgrat_file() */
-#define NEWGRAT_FILE 	"h5stat_newgrat.h5"
-#define DATASET_NAME	"DATASET_NAME"
-#define GROUP_NAME	"GROUP"
-#define ATTR_NAME	"ATTR"
-#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"
-#define THRES_ATTR_GRP_NAME	"grp_attr"
-#define THRES_DSET_NAME 	"dset"
-#define THRES_NUM		10
-#define THRES_NUM_25		25
-
-/*
- * 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 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 */
-
-    /* Get a copy file access property list */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
-	goto error;
-
-    /* Set to use latest library format */
-    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
-	goto error;
-
-    /* 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 */
-    for(i = 1; i <= NUM_GRPS; i++) {
-        sprintf(name, "%s%d", GROUP_NAME,i);
-        if((gid = H5Gcreate2(fid, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-        if(H5Gclose(gid) < 0)
-	    goto error;
-    } /* end for */
-
-    /* Create a datatype to commit and use */
-    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
-	goto error;
-
-    /* Create dataspace for dataset */
-    if((sid = H5Screate(H5S_SCALAR)) < 0)
-	goto error;
-
-    /* Create dataset */
-    if((did = H5Dcreate2(fid, DATASET_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create NUM_ATTRS for the dataset */
-    for(i = 1; i <= NUM_ATTRS; i++) {
-        sprintf(attrname, "%s%d", ATTR_NAME,i);
-        if((attr_id = H5Acreate2(did, attrname, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-        if(H5Aclose(attr_id) < 0)
-	    goto error;
-    } /* end for */
-
-    /* Close dataset, dataspace, datatype, file */
-    if(H5Pclose(fapl) < 0)
-	goto error;
-    if(H5Pclose(fcpl) < 0)
-	goto error;
-    if(H5Dclose(did) < 0)
-	goto error;
-    if(H5Sclose(sid) < 0)
-	goto error;
-    if(H5Tclose(tid) < 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);
-        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.
- *	-m N (--dims=N): Set the threshold for the # of dimension sizes when printing information for small datasets.
- *	-a N (--numattrs=N): Set the threshold for the # of attributes when printing information for small # of attributes.
- */
-static void
-gen_threshold_file(const char *fname)
-{
-    hid_t fid;				/* File ID */
-    hid_t sid0, sid1, sid2, sid3, sid4;	/* Dataspace IDs */
-    hid_t did;				/* Dataset ID */
-    hid_t attr_id;			/* Attribute ID */
-    hid_t gid;				/* Group ID */
-    hsize_t two_dims[] = {2, 5};	/* Dimension array */
-    hsize_t one_dims[] = {6};		/* Dimension array */
-    hsize_t zero_dims[] = {0};		/* Dimension array */
-    char name[30];			/* Name */
-    unsigned i;				/* Local index variable */
-
-    /* Create file */
-    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create 1-D dataspace with zero dimension size */
-    if((sid0 = H5Screate_simple(1, zero_dims, NULL)) < 0)
-	goto error;
-
-    /* Create 1-D dataspace with non-zero dimension size*/
-    if((sid1 = H5Screate_simple(1, one_dims, NULL)) < 0)
-	goto error;
-
-    /* Create 2-D dataspace */
-    if((sid2 = H5Screate_simple(2, two_dims, NULL)) < 0)
-	goto error;
-
-    /* Create scalar dataspace */
-    if((sid3 = H5Screate(H5S_SCALAR)) < 0)
-	goto error;
-
-    /* Create null dataspace */
-    if((sid4 = H5Screate(H5S_NULL)) < 0)
-	goto error;
-
-    /* Create an attribute for the root group */
-    if((attr_id = H5Acreate2(fid, "attr", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-    if(H5Aclose(attr_id) < 0)
-	goto error;
-
-    /* Create 1-D dataset with zero dimension size for the root group */
-    if((did = H5Dcreate2(fid, "zero_dset", H5T_NATIVE_UCHAR, sid0, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create 11 attributes for the dataset */
-    for(i = 1; i <= (THRES_NUM+1); i++) {
-        sprintf(name, "%s%d", THRES_ATTR_NAME,i);
-        if((attr_id = H5Acreate2(did, name, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-        if(H5Aclose(attr_id) < 0)
-	    goto error;
-    }
-    if(H5Dclose(did) < 0)
-	goto error;
-
-    /* Create dataset with scalar dataspace for the root group */
-    if((did = H5Dcreate2(fid, "scalar_dset", H5T_NATIVE_UCHAR, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-    if(H5Dclose(did) < 0)
-	goto error;
-
-    /* Create dataset with null dataspace for the root group */
-    if((did = H5Dcreate2(fid, "null_dset", H5T_NATIVE_UCHAR, sid4, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-    if(H5Dclose(did) < 0)
-	goto error;
-
-    /* Create 2-D dataset for the root group */
-    if((did = H5Dcreate2(fid, "dset", H5T_NATIVE_UCHAR, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create 10 attributes for the 2-D dataset */
-    for(i = 1; i <= THRES_NUM; i++) {
-        sprintf(name, "%s%d", THRES_ATTR_NAME,i);
-        if((attr_id = H5Acreate2(did, name, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-        if(H5Aclose(attr_id) < 0)
-	    goto error;
-    }
-    if(H5Dclose(did) < 0)
-	goto error;
-
-    /* Create first group */
-    if((gid = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create an attribute for the group */
-    if((attr_id = H5Acreate2(gid, "ATTR", H5T_NATIVE_INT, sid3, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Close attribute */
-    if(H5Aclose(attr_id) < 0)
-	goto error;
-
-    /* Create 10 1-D datasets with non-zero dimension size for the group */
-    for(i = 1; i <= THRES_NUM; i++) {
-	/* set up dataset name */
-        sprintf(name, "%s%d", THRES_DSET_NAME,i);
-
-	/* Create the dataset */
-	if((did = H5Dcreate2(gid, name, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-
-	/* Close the dataset */
-        if(H5Dclose(did) < 0)
-	    goto error;
-    }
-
-    /* Close the group */
-    if(H5Gclose(gid) < 0)
-	goto error;
-
-
-    /* Create second group */
-    if((gid = H5Gcreate2(fid, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create 25 attributes for the group */
-    for(i = 1; i <= THRES_NUM_25; i++) {
-	/* Set up attribute name */
-        sprintf(name, "%s%d", THRES_ATTR_GRP_NAME,i);
-
-	/* Create the attribute */
-        if((attr_id = H5Acreate2(gid, name, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-
-	/* Close the attribute */
-        if(H5Aclose(attr_id) < 0)
-	    goto error;
-    }
-
-    /* Close the group */
-    if(H5Gclose(gid) < 0)
-	goto error;
-
-    /* Create third group */
-    if((gid = H5Gcreate2(fid, "group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	goto error;
-
-    /* Create 9 1-D datasets with non-zero dimension size for the group */
-    for(i = 1; i < THRES_NUM; i++) {
-	/* set up dataset name */
-        sprintf(name, "%s%d", THRES_DSET_NAME,i);
-
-	/* Create the dataset */
-	if((did = H5Dcreate2(gid, name, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-	    goto error;
-
-	/* Close the dataset */
-        if(H5Dclose(did) < 0)
-	    goto error;
-    }
-
-    /* Close the group */
-    if(H5Gclose(gid) < 0)
-	goto error;
-
-
-    /* Close dataspaces */
-    if(H5Sclose(sid0) < 0)
-	goto error;
-    if(H5Sclose(sid1) < 0)
-	goto error;
-    if(H5Sclose(sid2) < 0)
-	goto error;
-    if(H5Sclose(sid3) < 0)
-	goto error;
-    if(H5Sclose(sid4) < 0)
-	goto error;
-
-    /* Close file */
-    if(H5Fclose(fid) < 0)
-	goto error;
-
-error:
-    H5E_BEGIN_TRY {
-        H5Gclose(gid);
-	H5Aclose(attr_id);
-        H5Dclose(did);
-        H5Sclose(sid0);
-        H5Sclose(sid1);
-        H5Sclose(sid2);
-        H5Sclose(sid3);
-        H5Sclose(sid4);
-        H5Fclose(fid);
-    } H5E_END_TRY;
-
-} /* 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_filters.ddl b/tools/h5stat/testfiles/h5stat_filters.ddl
deleted file mode 100644
index 1a4fd72..0000000
--- a/tools/h5stat/testfiles/h5stat_filters.ddl
+++ /dev/null
@@ -1,97 +0,0 @@
-Filename: h5stat_filters.h5
-File information
-	# of unique groups: 1
-	# of unique datasets: 15
-	# of unique named datatypes: 1
-	# of unique links: 0
-	# of unique other: 0
-	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)
-		Groups: 48/8
-		Datasets(exclude compact data): 4136/1344
-		Datatypes: 80/0
-	Groups:
-		B-tree/List: 1200
-		Heap: 288
-	Attributes:
-		B-tree/List: 0
-		Heap: 0
-	Chunked datasets:
-		Index: 31392
-	Datasets:
-		Heap: 72
-	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):
-	Total # of small groups: 0
-Group bins:
-	# of groups with 10 - 99 links: 1
-	Total # of groups: 1
-Dataset dimension information:
-	Max. rank of datasets: 2
-	Dataset ranks:
-		# of dataset with rank 1: 1
-		# of dataset with rank 2: 14
-1-D Dataset information:
-	Max. dimension size of 1-D datasets: 100
-	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 100 - 999: 1
-		Total # of datasets: 1
-Dataset storage information:
-	Total raw data size: 8659
-	Total external raw data size: 400
-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:
-		NO filter: 7
-		GZIP filter: 2
-		SHUFFLE filter: 2
-		FLETCHER32 filter: 2
-		SZIP filter: 2
-		NBIT filter: 2
-		SCALEOFFSET filter: 1
-		USER-DEFINED filter: 1
-Dataset datatype information:
-	# of unique datatypes used by datasets: 2
-	Dataset datatype #0:
-		Count (total/named) = (14/0)
-		Size (desc./elmt) = (14/4)
-	Dataset datatype #1:
-		Count (total/named) = (1/0)
-		Size (desc./elmt) = (14/4)
-	Total dataset datatype count: 15
-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: 37312 bytes
-  Raw data: 8659 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
deleted file mode 100644
index cbd4467..0000000
Binary files a/tools/h5stat/testfiles/h5stat_filters.h5 and /dev/null differ
diff --git a/tools/h5stat/testfiles/h5stat_idx.ddl b/tools/h5stat/testfiles/h5stat_idx.ddl
deleted file mode 100644
index b26f1a4..0000000
--- a/tools/h5stat/testfiles/h5stat_idx.ddl
+++ /dev/null
@@ -1,93 +0,0 @@
-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
deleted file mode 100644
index 303d1f8..0000000
Binary files a/tools/h5stat/testfiles/h5stat_idx.h5 and /dev/null differ
diff --git a/tools/h5stat/testfiles/h5stat_links2.ddl b/tools/h5stat/testfiles/h5stat_links2.ddl
deleted file mode 100644
index 4622884..0000000
--- a/tools/h5stat/testfiles/h5stat_links2.ddl
+++ /dev/null
@@ -1,105 +0,0 @@
-Filename: h5stat_threshold.h5
-File information
-	# of unique groups: 4
-	# of unique datasets: 23
-	# of unique named datatypes: 0
-	# of unique links: 0
-	# of unique other: 0
-	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)
-		Groups: 3576/0
-		Datasets(exclude compact data): 7896/2912
-		Datatypes: 0/0
-	Groups:
-		B-tree/List: 3816
-		Heap: 744
-	Attributes:
-		B-tree/List: 0
-		Heap: 0
-	Chunked datasets:
-		Index: 0
-	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 7 links):
-	# of groups with 0 link(s): 1
-	# of groups with 7 link(s): 1
-	Total # of small groups: 2
-Group bins:
-	# of groups with 0 link: 1
-	# of groups with 1 - 9 links: 2
-	# of groups with 10 - 99 links: 1
-	Total # of groups: 4
-Dataset dimension information:
-	Max. rank of datasets: 2
-	Dataset ranks:
-		# of dataset with rank 0: 2
-		# of dataset with rank 1: 20
-		# of dataset with rank 2: 1
-1-D Dataset information:
-	Max. dimension size of 1-D datasets: 6
-	Small 1-D datasets (with dimension sizes 0 to 9):
-		# of datasets with dimension sizes 0: 1
-		# of datasets with dimension sizes 6: 19
-		Total # of small datasets: 20
-	1-D Dataset dimension bins:
-		# of datasets with dimension size 0: 1
-		# of datasets with dimension size 1 - 9: 19
-		Total # of datasets: 20
-Dataset storage information:
-	Total raw data size: 0
-	Total external raw data size: 0
-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:
-		NO filter: 23
-		GZIP filter: 0
-		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) = (23/0)
-		Size (desc./elmt) = (14/1)
-	Total dataset datatype count: 23
-Small # of attributes (objects with 1 to 10 attributes):
-	# of objects with 1 attributes: 2
-	# of objects with 10 attributes: 1
-	Total # of objects with small # of attributes: 3
-Attribute bins:
-	# of objects with 1 - 9 attributes: 2
-	# 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: 16128 bytes
-  Raw data: 0 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
deleted file mode 100644
index e305f58..0000000
--- a/tools/h5stat/testfiles/h5stat_newgrat.ddl
+++ /dev/null
@@ -1,95 +0,0 @@
-Filename: h5stat_newgrat.h5
-File information
-	# of unique groups: 35001
-	# of unique datasets: 1
-	# of unique named datatypes: 0
-	# of unique links: 0
-	# of unique other: 0
-	Max. # of links to object: 1
-	Max. # of objects in group: 35001
-File space information for file metadata (in bytes):
-	Superblock: 48
-	Superblock extension: 119
-	User block: 0
-	Object headers: (total/unused)
-		Groups: 5145147/3220092
-		Datasets(exclude compact data): 414/312
-		Datatypes: 0/0
-	Groups:
-		B-tree/List: 470054
-		Heap: 739045
-	Attributes:
-		B-tree/List: 2598
-		Heap: 4431
-	Chunked datasets:
-		Index: 0
-	Datasets:
-		Heap: 0
-	Shared Messages:
-		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
-Group bins:
-	# of groups with 0 link: 35000
-	# of groups with 10000 - 99999 links: 1
-	Total # of groups: 35001
-Dataset dimension information:
-	Max. rank of datasets: 0
-	Dataset ranks:
-		# of dataset with rank 0: 1
-1-D Dataset information:
-	Max. dimension size of 1-D datasets: 0
-	Small 1-D datasets (with dimension sizes 0 to 9):
-		Total # of small datasets: 0
-Dataset storage information:
-	Total raw data size: 0
-	Total external raw data size: 0
-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:
-		NO filter: 1
-		GZIP filter: 0
-		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) = (1/0)
-		Size (desc./elmt) = (14/4)
-	Total dataset datatype count: 1
-Small # of attributes (objects with 1 to 10 attributes):
-	Total # of objects with small # of attributes: 0
-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: 6362036 bytes
-  Raw data: 0 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
deleted file mode 100644
index c919b71..0000000
Binary files a/tools/h5stat/testfiles/h5stat_newgrat.h5 and /dev/null differ
diff --git a/tools/h5stat/testfiles/h5stat_numattrs1.ddl b/tools/h5stat/testfiles/h5stat_numattrs1.ddl
deleted file mode 100644
index fb5568d..0000000
--- a/tools/h5stat/testfiles/h5stat_numattrs1.ddl
+++ /dev/null
@@ -1,17 +0,0 @@
-Filename: h5stat_threshold.h5
-Small # of attributes (objects with 1 to 10 attributes):
-	# of objects with 1 attributes: 2
-	# of objects with 10 attributes: 1
-	Total # of objects with small # of attributes: 3
-Attribute bins:
-	# of objects with 1 - 9 attributes: 2
-	# 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: 16128 bytes
-  Raw data: 0 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
deleted file mode 100644
index ccb23c1..0000000
--- a/tools/h5stat/testfiles/h5stat_numattrs2.ddl
+++ /dev/null
@@ -1,105 +0,0 @@
-Filename: h5stat_threshold.h5
-File information
-	# of unique groups: 4
-	# of unique datasets: 23
-	# of unique named datatypes: 0
-	# of unique links: 0
-	# of unique other: 0
-	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)
-		Groups: 3576/0
-		Datasets(exclude compact data): 7896/2912
-		Datatypes: 0/0
-	Groups:
-		B-tree/List: 3816
-		Heap: 744
-	Attributes:
-		B-tree/List: 0
-		Heap: 0
-	Chunked datasets:
-		Index: 0
-	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 0 link(s): 1
-	# of groups with 7 link(s): 1
-	# of groups with 9 link(s): 1
-	Total # of small groups: 3
-Group bins:
-	# of groups with 0 link: 1
-	# of groups with 1 - 9 links: 2
-	# of groups with 10 - 99 links: 1
-	Total # of groups: 4
-Dataset dimension information:
-	Max. rank of datasets: 2
-	Dataset ranks:
-		# of dataset with rank 0: 2
-		# of dataset with rank 1: 20
-		# of dataset with rank 2: 1
-1-D Dataset information:
-	Max. dimension size of 1-D datasets: 6
-	Small 1-D datasets (with dimension sizes 0 to 9):
-		# of datasets with dimension sizes 0: 1
-		# of datasets with dimension sizes 6: 19
-		Total # of small datasets: 20
-	1-D Dataset dimension bins:
-		# of datasets with dimension size 0: 1
-		# of datasets with dimension size 1 - 9: 19
-		Total # of datasets: 20
-Dataset storage information:
-	Total raw data size: 0
-	Total external raw data size: 0
-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:
-		NO filter: 23
-		GZIP filter: 0
-		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) = (23/0)
-		Size (desc./elmt) = (14/1)
-	Total dataset datatype count: 23
-Small # of attributes (objects with 1 to 1 attributes):
-	# of objects with 1 attributes: 2
-	Total # of objects with small # of attributes: 2
-Attribute bins:
-	# of objects with 1 - 9 attributes: 2
-	# 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: 16128 bytes
-  Raw data: 0 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_tsohm.ddl b/tools/h5stat/testfiles/h5stat_tsohm.ddl
deleted file mode 100644
index 4cf33fc..0000000
--- a/tools/h5stat/testfiles/h5stat_tsohm.ddl
+++ /dev/null
@@ -1,90 +0,0 @@
-Filename: h5stat_tsohm.h5
-File information
-	# of unique groups: 1
-	# of unique datasets: 3
-	# of unique named datatypes: 0
-	# of unique links: 0
-	# of unique other: 0
-	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)
-		Groups: 51/2
-		Datasets(exclude compact data): 852/447
-		Datatypes: 0/0
-	Groups:
-		B-tree/List: 872
-		Heap: 120
-	Attributes:
-		B-tree/List: 0
-		Heap: 0
-	Chunked datasets:
-		Index: 0
-	Datasets:
-		Heap: 0
-	Shared Messages:
-		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
-Group bins:
-	# of groups with 1 - 9 links: 1
-	Total # of groups: 1
-Dataset dimension information:
-	Max. rank of datasets: 2
-	Dataset ranks:
-		# of dataset with rank 2: 3
-1-D Dataset information:
-	Max. dimension size of 1-D datasets: 0
-	Small 1-D datasets (with dimension sizes 0 to 9):
-		Total # of small datasets: 0
-Dataset storage information:
-	Total raw data size: 0
-	Total external raw data size: 0
-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:
-		NO filter: 3
-		GZIP filter: 0
-		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) = (3/0)
-		Size (desc./elmt) = (14/8)
-	Total dataset datatype count: 3
-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: 3850 bytes
-  Raw data: 0 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
deleted file mode 100644
index b48f327..0000000
--- a/tools/h5stat/testh5stat.sh.in
+++ /dev/null
@@ -1,318 +0,0 @@
-#! /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 h5stat tool
-#
-# Modifcations:
-# 	Vailin Choi; July 2013
-# 	Add tests for -l, -m, -a options
-#
-
-srcdir=@srcdir@
-
-# Determine which filters are available
-USE_FILTER_SZIP="@USE_FILTER_SZIP@"
-USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
-
-TESTNAME=h5stat
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-STAT=h5stat               # The tool name
-STAT_BIN=`pwd`/$STAT    # The path of the 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_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"
-
-TESTDIR=./testfiles
-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_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
-"
-
-LIST_OTHER_TEST_FILES="
-$SRC_H5STAT_TESTFILES/h5stat_help1.ddl
-$SRC_H5STAT_TESTFILES/h5stat_help2.ddl
-$SRC_H5STAT_TESTFILES/h5stat_notexist.ddl
-$SRC_H5STAT_TESTFILES/h5stat_nofile.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-file.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-F.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-d.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-g.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-dT.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-UD.ddl
-$SRC_H5STAT_TESTFILES/h5stat_filters-UT.ddl
-$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
-$SRC_H5STAT_TESTFILES/h5stat_links3.ddl
-$SRC_H5STAT_TESTFILES/h5stat_links4.ddl
-$SRC_H5STAT_TESTFILES/h5stat_links5.ddl
-$SRC_H5STAT_TESTFILES/h5stat_err1_dims.ddl
-$SRC_H5STAT_TESTFILES/h5stat_dims1.ddl
-$SRC_H5STAT_TESTFILES/h5stat_dims2.ddl
-$SRC_H5STAT_TESTFILES/h5stat_err1_numattrs.ddl
-$SRC_H5STAT_TESTFILES/h5stat_err2_numattrs.ddl
-$SRC_H5STAT_TESTFILES/h5stat_numattrs1.ddl
-$SRC_H5STAT_TESTFILES/h5stat_numattrs2.ddl
-$SRC_H5STAT_TESTFILES/h5stat_numattrs3.ddl
-$SRC_H5STAT_TESTFILES/h5stat_numattrs4.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
-    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 $STAT $@
-   (
-      cd $TESTDIR
-      $RUNSERIAL $STAT_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
-   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
-
-# Test for help flag
-TOOLTEST h5stat_help1.ddl -h
-TOOLTEST h5stat_help2.ddl --help
-# Test when h5stat a file that does not exist
-TOOLTEST h5stat_notexist.ddl notexist.h5
-TOOLTEST h5stat_nofile.ddl ''
-
-# Test file with groups, compressed datasets, user-applied fileters, etc.
-# h5stat_filters.h5 is a copy of ../../testfiles/tfilters.h5 as of release 1.8.0-alpha4
-TOOLTEST h5stat_filters.ddl h5stat_filters.h5
-TOOLTEST h5stat_filters-file.ddl  -f   h5stat_filters.h5
-TOOLTEST h5stat_filters-F.ddl  -F   h5stat_filters.h5
-TOOLTEST h5stat_filters-d.ddl  -d   h5stat_filters.h5
-TOOLTEST h5stat_filters-g.ddl  -g   h5stat_filters.h5
-TOOLTEST h5stat_filters-dT.ddl -dT  h5stat_filters.h5
-TOOLTEST h5stat_filters-UD.ddl -D h5stat_filters.h5
-TOOLTEST h5stat_filters-UT.ddl -T h5stat_filters.h5
-#
-# h5stat_tsohm.h5 is a copy of ../../../test/tsohm.h5 generated by tsohm.c 
-# as of release 1.8.7-snap0 (on a 64-bit machine)
-TOOLTEST h5stat_tsohm.ddl h5stat_tsohm.h5
-# h5stat_newgrat.h5 is generated by h5stat_gentest.c
-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)
-# 	-g -l 8
-# 	--links=8
-# 	--links=20 -g
-TOOLTEST h5stat_err1_links.ddl -l 0 h5stat_threshold.h5
-TOOLTEST h5stat_links1.ddl -g -l 8 h5stat_threshold.h5
-TOOLTEST h5stat_links2.ddl --links=8 h5stat_threshold.h5
-TOOLTEST h5stat_links3.ddl --links=20 -g h5stat_threshold.h5
-#
-# Tests for -l (--links) option on h5stat_newgrat.h5: 
-# 	-g
-# 	-g -l 40000
-TOOLTEST h5stat_links4.ddl -g h5stat_newgrat.h5
-TOOLTEST h5stat_links5.ddl -g -l 40000 h5stat_newgrat.h5
-#
-# Tests for -m (--dims) option on h5stat_threshold.h5
-# 	-d --dims=-1 (incorrect threshold value)
-# 	-gd -m 5
-# 	-d --di=15
-TOOLTEST h5stat_err1_dims.ddl -d --dims=-1 h5stat_threshold.h5
-TOOLTEST h5stat_dims1.ddl -gd -m 5 h5stat_threshold.h5
-TOOLTEST h5stat_dims2.ddl -d --di=15 h5stat_threshold.h5
-#
-# Tests for -a option on h5stat_threshold.h5
-# 	-a -2 (incorrect threshold value)
-#	--numattrs (without threshold value)
-#	-AS -a 10
-#	-a 1
-#	-A --numattrs=25
-TOOLTEST h5stat_err1_numattrs.ddl -a -2 h5stat_threshold.h5
-TOOLTEST h5stat_err2_numattrs.ddl --numattrs h5stat_threshold.h5
-TOOLTEST h5stat_numattrs1.ddl -AS -a 10 h5stat_threshold.h5
-TOOLTEST h5stat_numattrs2.ddl -a 1 h5stat_threshold.h5
-TOOLTEST h5stat_numattrs3.ddl -A --numattrs=25 h5stat_threshold.h5
-#
-# Tests for -a option on h5stat_newgrat.h5
-#	-A -a 100
-TOOLTEST h5stat_numattrs4.ddl -A -a 100 h5stat_newgrat.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/lib/CMakeLists.txt b/tools/lib/CMakeLists.txt
index ce1ad34..ade7671 100644
--- a/tools/lib/CMakeLists.txt
+++ b/tools/lib/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.1.0)
+cmake_minimum_required (VERSION 3.2.2)
 PROJECT (HDF5_TOOLS_LIB)
 
 #-----------------------------------------------------------------------------
@@ -10,7 +10,7 @@ add_definitions (${HDF_EXTRA_C_FLAGS})
 # Define Sources
 #-----------------------------------------------------------------------------
 
-set (H5_TOOLS_LIB_SRCS
+set (H5_TOOLS_LIB_SOURCES
     ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff.c
     ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_array.c
     ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff_attr.c
@@ -37,7 +37,7 @@ set (H5_TOOLS_LIB_HDRS
     ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5diff.h
 )
 
-add_library (${HDF5_TOOLS_LIB_TARGET} STATIC ${H5_TOOLS_LIB_SRCS} ${H5_TOOLS_LIB_HDRS})
+add_library (${HDF5_TOOLS_LIB_TARGET} STATIC ${H5_TOOLS_LIB_SOURCES} ${H5_TOOLS_LIB_HDRS})
 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}")
@@ -50,7 +50,7 @@ set_target_properties (${HDF5_TOOLS_LIB_TARGET} PROPERTIES
 set (install_targets ${HDF5_TOOLS_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_TOOLS_LIBSH_TARGET} SHARED ${H5_TOOLS_LIB_SRCS} ${H5_TOOLS_LIB_HDRS})
+  add_library (${HDF5_TOOLS_LIBSH_TARGET} SHARED ${H5_TOOLS_LIB_SOURCES} ${H5_TOOLS_LIB_HDRS})
   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}")
@@ -63,7 +63,7 @@ if (BUILD_SHARED_LIBS)
   )
   #set_property (TARGET ${HDF5_TOOLS_LIBSH_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS H5DIFF_DEBUG)
   set (install_targets ${install_targets} ${HDF5_TOOLS_LIBSH_TARGET})
-endif (BUILD_SHARED_LIBS)
+endif ()
 
 ##############################################################################
 ##############################################################################
@@ -89,7 +89,8 @@ install (
 if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS)
     INSTALL_TARGET_PDB (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} toolslibraries)
-  endif (BUILD_SHARED_LIBS)
+  endif ()
+  INSTALL_TARGET_PDB (${HDF5_TOOLS_LIB_TARGET} ${HDF5_INSTALL_BIN_DIR} toolslibraries)
 
   install (
       TARGETS
@@ -100,5 +101,6 @@ if (HDF5_EXPORTED_TARGETS)
       ARCHIVE DESTINATION ${HDF5_INSTALL_LIB_DIR} COMPONENT toolslibraries
       RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolslibraries
       FRAMEWORK DESTINATION ${HDF5_INSTALL_FWRK_DIR} COMPONENT toolslibraries
+      INCLUDES DESTINATION include
   )
-endif (HDF5_EXPORTED_TARGETS)
+endif ()
diff --git a/tools/lib/Makefile.am b/tools/lib/Makefile.am
index e8fc6a1..f07dff7 100644
--- a/tools/lib/Makefile.am
+++ b/tools/lib/Makefile.am
@@ -5,12 +5,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
diff --git a/tools/lib/Makefile.in b/tools/lib/Makefile.in
index fbc8bc4..f7b50c1 100644
--- a/tools/lib/Makefile.in
+++ b/tools/lib/Makefile.in
@@ -21,12 +21,10 @@
 #
 # This file is part of HDF5.  The full HDF5 copyright notice, including
 # terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
 #
 # HDF5 Library Makefile(.in)
 #
@@ -459,6 +457,7 @@ DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
 DIRECT_VFD = @DIRECT_VFD@
 DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
@@ -580,6 +579,7 @@ 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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PROFILING = @PROFILING@
@@ -740,18 +740,20 @@ TEST_PROG =
 # to build 'libh5tools.la', but not '../../tools/lib/libh5tools.la'.
 LDADD = libh5tools.la $(LIBHDF5)
 
-# Automake needs to be taught how to build lib, progs, and tests targets.
+# Automake needs to be taught how to build lib, dyn, 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. 
+# be built at certain times.
 LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
       $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
 
+DYN = $(dyn_LTLIBRARIES)
 PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
         $(EXTRA_PROG)
 
 chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
 TEST_EXTENSIONS = .sh
 SH_LOG_COMPILER = $(SHELL)
 AM_SH_LOG_FLAGS = 
@@ -839,22 +841,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/io_timer.Plo 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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @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 am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1235,6 +1240,7 @@ help:
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
+build-dyn: $(DYN)
 build-lib: $(LIB)
 build-progs: $(LIB) $(PROGS)
 build-tests: $(LIB) $(PROGS) $(chk_TESTS)
@@ -1242,7 +1248,7 @@ 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)
+lib dyn 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                           \
diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c
index 46dcf6f..afb36d9 100644
--- a/tools/lib/h5diff.c
+++ b/tools/lib/h5diff.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdlib.h>
@@ -30,7 +28,8 @@
  *  2) when diff was found (normal mode)
  *-------------------------------------------------------------------------
  */
-int print_objname (diff_opt_t * options, hsize_t nfound)
+H5_ATTR_PURE int
+print_objname (diff_opt_t * options, hsize_t nfound)
 {
     return ((options->m_verbose || nfound) && !options->m_quiet) ? 1 : 0;
 }
@@ -46,7 +45,7 @@ void do_print_objname (const char *OBJ, const char *path1, const char *path2, di
 {
     /* if verbose level is higher than 0, put space line before
      * displaying any object or symbolic links. This improves
-     * readability of the output. 
+     * readability of the output.
      */
     if (opts->m_verbose_level >= 1)
         parallel_print("\n");
@@ -70,7 +69,7 @@ do_print_attrname (const char *attr, const char *path1, const char *path2)
  * Function: print_warn
  *
  * Purpose: check print warning condition.
- * Return: 
+ * Return:
  *    1 if verbose mode
  *    0 if not verbos mode
  * Programmer: Jonathan Kim
@@ -145,7 +144,7 @@ static void print_incoming_data(void)
  *
  * Purpose: check if options are valid
  *
- * Return: 
+ * Return:
  *  1 : Valid
  *  0 : Not valid
  *
@@ -188,10 +187,10 @@ out:
  *
  * Purpose: check if 'paths' are part of exclude path list
  *
- * Return:  
+ * Return:
  *   1 - excluded path
  *   0 - not excluded path
- * 
+ *
  * Programmer: Jonathan Kim
  * Date: Aug 23, 2010
  *------------------------------------------------------------------------*/
@@ -220,11 +219,11 @@ static int is_exclude_path (char * path, h5trav_type_t type, diff_opt_t *options
             {
                 size_t len_grp;
 
-                /* check if given path belong to an excluding group, if so 
+                /* check if given path belong to an excluding group, if so
                  * exclude it as well.
                  * This verifies if “/grp1/dset1” is only under “/grp1”, but
-                 * not under “/grp1xxx/” group.  
-                 */ 
+                 * not under “/grp1xxx/” group.
+                 */
                 len_grp = HDstrlen(exclude_path_ptr->obj_path);
                 if (path[len_grp] == '/')
                 {
@@ -235,15 +234,15 @@ static int is_exclude_path (char * path, h5trav_type_t type, diff_opt_t *options
             }
         }
         /* exclude target is not group, just exclude the object */
-        else  
+        else
         {
             ret_cmp = HDstrcmp(exclude_path_ptr->obj_path, path);
             if (ret_cmp == 0)  /* found matching object */
             {
                 /* excluded non-group object */
                 ret = 1;
-                /* remember the type of this maching object. 
-                 * if it's group, it can be used for excluding its member 
+                /* remember the type of this maching object.
+                 * if it's group, it can be used for excluding its member
                  * objects in this while() loop */
                 exclude_path_ptr->obj_type = type;
                 break; /* while */
@@ -338,7 +337,7 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
         path2_lp = (info2->paths[curr2].path) + path2_offset;
         type1_l = info1->paths[curr1].type;
         type2_l = info2->paths[curr2].type;
-        
+
         /* criteria is string compare */
         cmp = HDstrcmp(path1_lp, path2_lp);
 
@@ -409,7 +408,7 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
         if (!is_exclude_path(path2_lp, type2_l, options))
         {
             trav_table_addflags(infile, path2_lp, info2->paths[curr2].type, table);
-        } 
+        }
         curr2++;
     } /* end while */
 
@@ -423,8 +422,8 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
 /*-------------------------------------------------------------------------
  * Function: trav_grp_objs
  *
- * Purpose: 
- *  Call back function from h5trav_visit(). 
+ * Purpose:
+ *  Call back function from h5trav_visit().
  *
  * Programmer: Jonathan Kim
  *
@@ -436,22 +435,22 @@ static herr_t trav_grp_objs(const char *path, const H5O_info_t *oinfo,
     trav_info_visit_obj(path, oinfo, already_visited, udata);
 
     return 0;
-} 
+}
 
 /*-------------------------------------------------------------------------
  * Function: trav_grp_symlinks
  *
- * Purpose: 
- *  Call back function from h5trav_visit(). 
+ * Purpose:
+ *  Call back function from h5trav_visit().
  *  Track and extra checkings while visiting all symbolic-links.
  *
  * Programmer: Jonathan Kim
  *
  * Date: Aug 16, 2010
  *------------------------------------------------------------------------*/
-static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo, 
+static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
                                void *udata)
-{                               
+{
     trav_info_t *tinfo = (trav_info_t *)udata;
     diff_opt_t *opts = (diff_opt_t *)tinfo->opts;
     int ret;
@@ -481,18 +480,18 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
                 tinfo->symlink_visited.dangle_link = TRUE;
                 trav_info_visit_lnk(path, linfo, tinfo);
                 if (opts->no_dangle_links)
-                    opts->err_stat = 1; /* make dgangling link is error */
+                    opts->err_stat = 1; /* make dangling link is error */
                 goto done;
             }
 
-            /* check if already visit the target object */        
-            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path)) 
+            /* check if already visit the target object */
+            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path))
                 goto done;
 
             /* add this link as visited link */
-            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path) < 0) 
+            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path) < 0)
                 goto done;
-                    
+
             if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
                          trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
             {
@@ -501,8 +500,8 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
                 goto done;
             }
             break;
-        
-        case H5L_TYPE_EXTERNAL:    
+
+        case H5L_TYPE_EXTERNAL:
             ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
             /* error */
             if (ret < 0)
@@ -513,21 +512,21 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
                 tinfo->symlink_visited.dangle_link = TRUE;
                 trav_info_visit_lnk(path, linfo, tinfo);
                 if (opts->no_dangle_links)
-                    opts->err_stat = 1; /* make dgangling link is error */
+                    opts->err_stat = 1; /* make dangling link is error */
                 goto done;
             }
 
-            if(H5Lunpack_elink_val(lnk_info.trg_path, linfo->u.val_size, NULL, &ext_fname, &ext_path) < 0) 
+            if(H5Lunpack_elink_val(lnk_info.trg_path, linfo->u.val_size, NULL, &ext_fname, &ext_path) < 0)
                 goto done;
 
-            /* check if already visit the target object */        
-            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path)) 
+            /* check if already visit the target object */
+            if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path))
                 goto done;
 
             /* add this link as visited link */
-            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path) < 0) 
+            if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path) < 0)
                 goto done;
-                    
+
             if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
                             trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
             {
@@ -547,11 +546,11 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
             break;
     } /* end of switch */
 
-done:    
+done:
     if (lnk_info.trg_path)
         HDfree(lnk_info.trg_path);
     return 0;
-}    
+}
 
 
 /*-------------------------------------------------------------------------
@@ -629,7 +628,7 @@ hsize_t h5diff(const char *fname1,
     H5E_BEGIN_TRY
     {
         /* open file 1 */
-        if((file1_id = h5tools_fopen(fname1, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) 
+        if((file1_id = h5tools_fopen(fname1, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0)
         {
             parallel_print("h5diff: <%s>: unable to open file\n", fname1);
             options->err_stat = 1;
@@ -638,7 +637,7 @@ hsize_t h5diff(const char *fname1,
 
 
         /* open file 2 */
-        if((file2_id = h5tools_fopen(fname2, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) 
+        if((file2_id = h5tools_fopen(fname2, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0)
         {
             parallel_print("h5diff: <%s>: unable to open file\n", fname2);
             options->err_stat = 1;
@@ -663,7 +662,8 @@ hsize_t h5diff(const char *fname1,
         {
 #ifdef H5_HAVE_ASPRINTF
             /* Use the asprintf() routine, since it does what we're trying to do below */
-            HDasprintf(&obj1fullname, "/%s", objname1);
+            if(HDasprintf(&obj1fullname, "/%s", objname1) < 0)
+                goto out;
 #else /* H5_HAVE_ASPRINTF */
             /* (malloc 2 more for "/" and end-of-line) */
             obj1fullname = (char*)HDmalloc(HDstrlen(objname1) + 2);
@@ -679,7 +679,8 @@ hsize_t h5diff(const char *fname1,
         {
 #ifdef H5_HAVE_ASPRINTF
             /* Use the asprintf() routine, since it does what we're trying to do below */
-            HDasprintf(&obj2fullname, "/%s", objname2);
+            if(HDasprintf(&obj2fullname, "/%s", objname2) < 0)
+                goto out;
 #else /* H5_HAVE_ASPRINTF */
             /* (malloc 2 more for "/" and end-of-line) */
             obj2fullname = (char*)HDmalloc(HDstrlen(objname2) + 2);
@@ -701,14 +702,14 @@ hsize_t h5diff(const char *fname1,
         else
         {
             /* check if link itself exist */
-            if(H5Lexists(file1_id, obj1fullname, H5P_DEFAULT) <= 0) 
+            if(H5Lexists(file1_id, obj1fullname, H5P_DEFAULT) <= 0)
             {
                 parallel_print ("Object <%s> could not be found in <%s>\n", obj1fullname, fname1);
                 options->err_stat = 1;
                 goto out;
             }
             /* get info from link */
-            if(H5Lget_info(file1_id, obj1fullname, &src_linfo1, H5P_DEFAULT) < 0) 
+            if(H5Lget_info(file1_id, obj1fullname, &src_linfo1, H5P_DEFAULT) < 0)
             {
                 parallel_print("Unable to get link info from <%s>\n", obj1fullname);
                 goto out;
@@ -716,7 +717,7 @@ hsize_t h5diff(const char *fname1,
 
             info1_lp = info1_obj;
 
-            /* 
+            /*
              * check the type of specified path for hard and symbolic links
              */
             if(src_linfo1.type == H5L_TYPE_HARD)
@@ -761,14 +762,14 @@ hsize_t h5diff(const char *fname1,
         else
         {
             /* check if link itself exist */
-            if(H5Lexists(file2_id, obj2fullname, H5P_DEFAULT) <= 0) 
+            if(H5Lexists(file2_id, obj2fullname, H5P_DEFAULT) <= 0)
             {
                 parallel_print ("Object <%s> could not be found in <%s>\n", obj2fullname, fname2);
                 options->err_stat = 1;
                 goto out;
             }
             /* get info from link */
-            if(H5Lget_info(file2_id, obj2fullname, &src_linfo2, H5P_DEFAULT) < 0) 
+            if(H5Lget_info(file2_id, obj2fullname, &src_linfo2, H5P_DEFAULT) < 0)
             {
                 parallel_print("Unable to get link info from <%s>\n", obj2fullname);
                 goto out;
@@ -776,7 +777,7 @@ hsize_t h5diff(const char *fname1,
 
             info2_lp = info2_obj;
 
-            /* 
+            /*
              * check the type of specified path for hard and symbolic links
              */
             if(src_linfo2.type == H5L_TYPE_HARD)
@@ -808,7 +809,7 @@ hsize_t h5diff(const char *fname1,
                 obj2type = H5TRAV_TYPE_UDLINK;
                 trav_info_add(info2_obj, obj2fullname, obj2type);
             }
-        }           
+        }
     }
     /* if no object specified */
     else
@@ -827,7 +828,7 @@ hsize_t h5diff(const char *fname1,
     l_ret2 = H5tools_get_symlink_info(file2_id, obj2fullname, &trg_linfo2, options->follow_links);
 
     /*---------------------------------------------
-     * check for following symlinks 
+     * check for following symlinks
      */
     if (options->follow_links)
     {
@@ -912,7 +913,7 @@ hsize_t h5diff(const char *fname1,
                 }
             }
         }
-        else if(l_ret2 < 0) /* fail */ 
+        else if(l_ret2 < 0) /* fail */
         {
             parallel_print ("Object <%s> could not be found in <%s>\n", obj2fullname, fname2);
             options->err_stat = 1;
@@ -933,11 +934,11 @@ hsize_t h5diff(const char *fname1,
         }
     } /* end of if follow symlinks */
 
-   /* 
+   /*
     * If verbose options is not used, don't need to traverse through the list
     * of objects in the group to display objects information,
-    * So use h5tools_is_obj_same() to improve performance by skipping 
-    * comparing details of same objects. 
+    * So use h5tools_is_obj_same() to improve performance by skipping
+    * comparing details of same objects.
     */
 
     if(!(options->m_verbose || options->m_report))
@@ -1084,10 +1085,10 @@ out:
 /*-------------------------------------------------------------------------
  * Function: diff_match
  *
- * Purpose: 
- *  Compare common objects in given groups according to table structure. 
- *  The table structure has flags which can be used to find common objects 
- *  and will be compared. 
+ * Purpose:
+ *  Compare common objects in given groups according to table structure.
+ *  The table structure has flags which can be used to find common objects
+ *  and will be compared.
  *  Common object means same name (absolute path) objects in both location.
  *
  * Return: Number of differences found
@@ -1123,7 +1124,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
 
 
     h5difftrace("diff_match start\n");
-    /* 
+    /*
      * if not root, prepare object name to be pre-appended to group path to
      * make full path
      */
@@ -1138,8 +1139,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
     * 2) the graph must match, i.e same names (absolute path)
     * 3) objects with the same name must be of the same type
     *-------------------------------------------------------------------------
-    */     
-       
+    */
+
     /* not valid compare used when --exclude-path option is used */
     if (!options->exclude_path)
     {
@@ -1149,7 +1150,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
             options->contents = 0;
         }
     }
-    
+
     /* objects in one file and not the other */
     for( i = 0; i < table->nobjs; i++)
     {
@@ -1186,7 +1187,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
             /* make full path for obj1 */
 #ifdef H5_HAVE_ASPRINTF
             /* Use the asprintf() routine, since it does what we're trying to do below */
-            HDasprintf(&obj1_fullpath, "%s%s", grp1_path, table->objs[i].name);
+            if(HDasprintf(&obj1_fullpath, "%s%s", grp1_path, table->objs[i].name) < 0)
+                goto out;
 #else /* H5_HAVE_ASPRINTF */
             obj1_fullpath = (char*)HDmalloc(HDstrlen(grp1_path) + HDstrlen(table->objs[i].name) + 1);
             HDstrcpy(obj1_fullpath, grp1_path);
@@ -1196,7 +1198,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
             /* make full path for obj2 */
 #ifdef H5_HAVE_ASPRINTF
             /* Use the asprintf() routine, since it does what we're trying to do below */
-            HDasprintf(&obj2_fullpath, "%s%s", grp2_path, table->objs[i].name);
+            if(HDasprintf(&obj2_fullpath, "%s%s", grp2_path, table->objs[i].name) < 0)
+                goto out;
 #else /* H5_HAVE_ASPRINTF */
             obj2_fullpath = (char*)HDmalloc(HDstrlen(grp2_path) + HDstrlen(table->objs[i].name) + 1);
             HDstrcpy(obj2_fullpath, grp2_path);
@@ -1204,7 +1207,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
 #endif /* H5_HAVE_ASPRINTF */
 
             /* get index to figure out type of the object in file1 */
-            while(info1->paths[idx1].path && 
+            while(info1->paths[idx1].path &&
                     (HDstrcmp(obj1_fullpath, info1->paths[idx1].path) != 0))
                 idx1++;
             /* get index to figure out type of the object in file2 */
@@ -1221,7 +1224,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
             if(!g_Parallel)
             {
                 nfound += diff(file1_id, obj1_fullpath,
-                               file2_id, obj2_fullpath, 
+                               file2_id, obj2_fullpath,
                                options, &argdata);
             } /* end if */
 #ifdef H5_HAVE_PARALLEL
@@ -1239,7 +1242,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
                 */
 
                 /*Set up args to pass to worker task. */
-                if(HDstrlen(obj1_fullpath) > 255 || 
+                if(HDstrlen(obj1_fullpath) > 255 ||
                    HDstrlen(obj2_fullpath) > 255)
                 {
                     printf("The parallel diff only supports object names up to 255 characters\n");
@@ -1396,7 +1399,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
 #endif /* H5_HAVE_PARALLEL */
             if(obj1_fullpath)
                 HDfree(obj1_fullpath);
-            if(obj2_fullpath)                
+            if(obj2_fullpath)
                 HDfree(obj2_fullpath);
         } /* end if */
     } /* end for */
@@ -1493,6 +1496,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
     }
 #endif /* H5_HAVE_PARALLEL */
 
+out:
     /* free table */
     if (table)
         trav_table_free(table);
@@ -1562,14 +1566,14 @@ hsize_t diff(hid_t file1_id,
     if(print_warn(options))
         linkinfo1.opt.msg_mode = linkinfo2.opt.msg_mode = 1;
 
-    /* for symbolic links, take care follow symlink and no dangling link 
+    /* for symbolic links, take care follow symlink and no dangling link
      * options */
-    if (argdata->type[0] == H5TRAV_TYPE_LINK || 
+    if (argdata->type[0] == H5TRAV_TYPE_LINK ||
         argdata->type[0] == H5TRAV_TYPE_UDLINK ||
-        argdata->type[1] == H5TRAV_TYPE_LINK || 
+        argdata->type[1] == H5TRAV_TYPE_LINK ||
         argdata->type[1] == H5TRAV_TYPE_UDLINK )
     {
-        /* 
+        /*
          * check dangling links for path1 and path2
          */
 
@@ -1580,7 +1584,7 @@ hsize_t diff(hid_t file1_id,
         {
             if (options->no_dangle_links)
             {
-                /* gangling link is error */
+                /* dangling link is error */
                 if(options->m_verbose)
                     parallel_print("Warning: <%s> is a dangling link.\n", path1);
                 goto out;
@@ -1598,7 +1602,7 @@ hsize_t diff(hid_t file1_id,
         {
             if (options->no_dangle_links)
             {
-                /* gangling link is error */
+                /* dangling link is error */
                 if(options->m_verbose)
                     parallel_print("Warning: <%s> is a dangling link.\n", path2);
                 goto out;
@@ -1608,7 +1612,7 @@ hsize_t diff(hid_t file1_id,
         }
         else if (ret < 0)
             goto out;
-                    
+
         /* found dangling link */
         if (is_dangle_link1 || is_dangle_link2)
             goto out2;
@@ -1631,7 +1635,7 @@ hsize_t diff(hid_t file1_id,
         if (options->m_verbose||options->m_list_not_cmp)
         {
             parallel_print("Not comparable: <%s> is of type %s and <%s> is of type %s\n",
-            path1, get_type(argdata->type[0]), 
+            path1, get_type(argdata->type[0]),
             path2, get_type(argdata->type[1]));
         }
         options->not_cmp=1;
@@ -1642,11 +1646,11 @@ hsize_t diff(hid_t file1_id,
     }
     else /* now both object types are same */
         object_type = argdata->type[0];
-  
-    /* 
+
+    /*
      * If both points to the same target object, skip comparing details inside
      * of the objects to improve performance.
-     * Always check for the hard links, otherwise if follow symlink option is 
+     * Always check for the hard links, otherwise if follow symlink option is
      * specified.
      *
      * Perform this to match the outputs as bypassing.
@@ -1666,7 +1670,7 @@ hsize_t diff(hid_t file1_id,
                 {
                     case H5TRAV_TYPE_DATASET:
                         do_print_objname("dataset", path1, path2, options);
-                        break; 
+                        break;
                     case H5TRAV_TYPE_NAMED_DATATYPE:
                         do_print_objname("datatype", path1, path2, options);
                         break;
@@ -1681,7 +1685,7 @@ hsize_t diff(hid_t file1_id,
                             do_print_objname("external link", path1, path2, options);
                         else
                             do_print_objname ("user defined link", path1, path2, options);
-                        break; 
+                        break;
                     case H5TRAV_TYPE_UNKNOWN:
                     default:
                         parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
@@ -1729,14 +1733,14 @@ hsize_t diff(hid_t file1_id,
                 if (nfound)
                 {
                     do_print_objname("dataset", path1, path2, options);
-                    print_found(nfound);  
+                    print_found(nfound);
                 }
             }
 
 
             /*---------------------------------------------------------
              * compare attributes
-             * if condition refers to cases when the dataset is a 
+             * if condition refers to cases when the dataset is a
              * referenced object
              *---------------------------------------------------------
              */
@@ -1775,7 +1779,7 @@ hsize_t diff(hid_t file1_id,
 
             /*-----------------------------------------------------------------
              * compare attributes
-             * the if condition refers to cases when the dataset is a 
+             * the if condition refers to cases when the dataset is a
              * referenced object
              *-----------------------------------------------------------------
              */
@@ -1807,7 +1811,7 @@ hsize_t diff(hid_t file1_id,
 
             /*-----------------------------------------------------------------
              * compare attributes
-             * the if condition refers to cases when the dataset is a 
+             * the if condition refers to cases when the dataset is a
              * referenced object
              *-----------------------------------------------------------------
              */
@@ -1849,10 +1853,10 @@ hsize_t diff(hid_t file1_id,
         case H5TRAV_TYPE_UDLINK:
             {
             /* Only external links will have a query function registered */
-            if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL) 
+            if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
             {
                 /* If the buffers are the same size, compare them */
-                if(linkinfo1.linfo.u.val_size == linkinfo2.linfo.u.val_size) 
+                if(linkinfo1.linfo.u.val_size == linkinfo2.linfo.u.val_size)
                 {
                     ret = HDmemcmp(linkinfo1.trg_path, linkinfo2.trg_path, linkinfo1.linfo.u.val_size);
                 }
@@ -1860,7 +1864,7 @@ hsize_t diff(hid_t file1_id,
                     ret = 1;
 
                 /* if "linkinfo1.trg_path" != "linkinfo2.trg_path" then the links
-                 * are "different" extlinkinfo#.path is combination string of 
+                 * are "different" extlinkinfo#.path is combination string of
                  * file_name and obj_name
                  */
                 nfound = (ret != 0) ? 1 : 0;
@@ -1869,7 +1873,7 @@ hsize_t diff(hid_t file1_id,
                     do_print_objname("external link", path1, path2, options);
 
             } /* end if */
-            else 
+            else
             {
                 /* If one or both of these links isn't an external link, we can only
                  * compare information from H5Lget_info since we don't have a query
@@ -1878,7 +1882,7 @@ hsize_t diff(hid_t file1_id,
                  * If the link classes or the buffer length are not the
                  * same, the links are "different"
                  */
-                if((linkinfo1.linfo.type != linkinfo2.linfo.type) || 
+                if((linkinfo1.linfo.type != linkinfo2.linfo.type) ||
                    (linkinfo1.linfo.u.val_size != linkinfo2.linfo.u.val_size))
                     nfound = 1;
                 else
@@ -1916,7 +1920,7 @@ out:
 
 out2:
     /*-----------------------------------
-     * handle dangling link(s) 
+     * handle dangling link(s)
      */
     /* both path1 and path2 are dangling links */
     if(is_dangle_link1 && is_dangle_link2)
diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h
index 04b640f..0226e83 100644
--- a/tools/lib/h5diff.h
+++ b/tools/lib/h5diff.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef H5DIFF_H__
diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c
index d592528..49f41dc 100644
--- a/tools/lib/h5diff_array.c
+++ b/tools/lib/h5diff_array.c
@@ -5,18 +5,12 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#include <math.h>
-#include <time.h>
-#include <sys/timeb.h>
-
 #include "H5private.h"
 #include "h5tools.h"
 #include "h5tools_utils.h"
@@ -106,9 +100,9 @@ static hbool_t not_comparable;
     per = -1;                                                           \
     not_comparable = FALSE;                                             \
     both_zero = FALSE;                                                  \
-    if(H5_DBL_ABS_EQUAL(0,A) && H5_DBL_ABS_EQUAL(0,B))                  \
+    if(H5_DBL_ABS_EQUAL(0, (double)A) && H5_DBL_ABS_EQUAL(0, (double)B)) \
         both_zero = TRUE;                                               \
-    if(!H5_DBL_ABS_EQUAL(0,A))                                          \
+    if(!H5_DBL_ABS_EQUAL(0, (double)A))                                 \
         per = (double)ABS((double)((B) - (A)) / (double)(A));           \
     else                                                                \
         not_comparable = TRUE;                                          \
@@ -119,9 +113,9 @@ static hbool_t not_comparable;
     per = -1;                                                           \
     not_comparable = FALSE;                                             \
     both_zero = FALSE;                                                  \
-    if(H5_DBL_ABS_EQUAL(0,A) && H5_DBL_ABS_EQUAL(0,B))                  \
+    if(H5_DBL_ABS_EQUAL(0, (double)A) && H5_DBL_ABS_EQUAL(0, (double)B)) \
         both_zero = TRUE;                                               \
-    if(!H5_DBL_ABS_EQUAL(0,A))                                          \
+    if(!H5_DBL_ABS_EQUAL(0, (double)A))                                 \
         per = ABS((double)((TYPE)((B) - (A))) / (double)(A)) ;          \
     else                                                                \
         not_comparable = TRUE;                                          \
@@ -134,7 +128,7 @@ typedef struct mcomp_t
 {
     unsigned        n;      /* number of members */
     hid_t           *ids;   /* member type id */
-    size_t          *offsets;   
+    size_t          *offsets;
     struct mcomp_t  **m;     /* members */
 }mcomp_t;
 
@@ -550,7 +544,7 @@ hsize_t diff_array( void *_mem1,
  *  Recursively call this function for each element
  * H5T_STRING
  *  compare byte by byte in a cycle from 0 to type_size. this type_size is the
- *  value obtained by the get_size function but it is the string lenght for
+ *  value obtained by the get_size function but it is the string length for
  *  variable sized strings
  * H5T_OPAQUE
  *  compare byte by byte in a cycle from 0 to type_size
@@ -597,7 +591,6 @@ static hsize_t diff_datum(void       *_mem1,
     hid_t         obj2_id;
     hsize_t       nfound=0;   /* differences found */
     int           ret=0;      /* check return error */
-    float         f1, f2;
     double        per;
     hbool_t       both_zero;
 
@@ -607,7 +600,7 @@ static hsize_t diff_datum(void       *_mem1,
 
     /* Fast comparison first for atomic type by memcmp().
      * It is OK not to list non-atomic type here because it will not be caught
-     * by the confition, but it gives more clarity for code planning
+     * by the condition, but it gives more clarity for code planning
      */
     if (type_class != H5T_REFERENCE &&
         type_class != H5T_COMPOUND &&
@@ -697,6 +690,13 @@ static hsize_t diff_datum(void       *_mem1,
              *       of length of strings.
              *       For now mimic the previous way.
              */
+            h5diffdebug2("diff_datum string size:%d\n",size1);
+            h5diffdebug2("diff_datum string size:%d\n",size2);
+            if(size1 != size2)
+            {
+                h5difftrace("diff_datum string sizes\n");
+                nfound++;
+            }
             if(size1 < size2)
             {
                 size = size1;
@@ -717,7 +717,7 @@ static hsize_t diff_datum(void       *_mem1,
 
                 pad = H5Tget_strpad(m_type);
 
-                for (u=0; u<size && (s[u] || pad!=H5T_STR_NULLTERM); u++)
+                for (u=0; u<size; u++)
                     nfound+=character_compare(
                         s1 + u,
                         s2 + u, /* offset */
@@ -1856,210 +1856,6 @@ static hsize_t diff_datum(void       *_mem1,
 
         } /*H5T_NATIVE_ULONG*/
 
-       /*-------------------------------------------------------------------------
-        * H5T_NATIVE_LLONG
-        *-------------------------------------------------------------------------
-        */
-
-        else if (type_size==8 && type_sign!=H5T_SGN_NONE)
-        {
-            long long        temp1_llong;
-            long long        temp2_llong;
-            HDassert(type_size==sizeof(long long));
-
-            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
-            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
-            /* -d and !-p */
-            if (options->d && !options->p)
-            {
-                if (ABS(temp1_llong-temp2_llong) > options->delta)
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-                    }
-                    nfound++;
-                }
-            }
-            /* !-d and -p */
-            else if (!options->d && options->p)
-            {
-                PER(temp1_llong,temp2_llong);
-
-                if (not_comparable && !both_zero) /* not comparable */
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-                    }
-                    nfound++;
-                }
-
-                else
-
-                    if ( per > options->percent )
-                    {
-                        if ( print_data(options) )
-                        {
-                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                            parallel_print(SPACES);
-                            parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
-                        }
-                        nfound++;
-                    }
-            }
-            /* -d and -p */
-            else if ( options->d && options->p)
-            {
-                PER(temp1_llong,temp2_llong);
-
-                if (not_comparable && !both_zero) /* not comparable */
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-                    }
-                    nfound++;
-                }
-
-                else
-
-                    if ( per > options->percent  && ABS(temp1_llong-temp2_llong) > options->delta )
-                    {
-                        if ( print_data(options) )
-                        {
-                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                            parallel_print(SPACES);
-                            parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
-                        }
-                        nfound++;
-                    }
-            }
-            else if (temp1_llong != temp2_llong)
-            {
-                if ( print_data(options) )
-                {
-                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
-                    parallel_print(SPACES);
-                    parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-                }
-                nfound++;
-            }
-
-        } /*H5T_NATIVE_LLONG*/
-
-       /*-------------------------------------------------------------------------
-        * H5T_NATIVE_ULLONG
-        *-------------------------------------------------------------------------
-        */
-
-        else if (type_size==8 && type_sign==H5T_SGN_NONE)
-        {
-            unsigned long long        temp1_ullong;
-            unsigned long long        temp2_ullong;
-            HDassert(type_size==sizeof(unsigned long long));
-
-            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
-            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
-            /* -d and !-p */
-            if (options->d && !options->p)
-            {
-                if ( PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta)
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-                    }
-                    nfound++;
-                }
-            }
-            /* !-d and -p */
-            else if (!options->d && options->p)
-            {
-                ull2float(temp1_ullong,&f1);
-                ull2float(temp2_ullong,&f2);
-                PER(f1,f2);
-
-                if (not_comparable && !both_zero) /* not comparable */
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-                    }
-                    nfound++;
-                }
-
-                else
-
-                    if ( per > options->percent )
-                    {
-
-                        if ( print_data(options) )
-                        {
-                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                            parallel_print(SPACES);
-                            parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
-                        }
-                        nfound++;
-                    }
-            }
-            /* -d and -p */
-            else if ( options->d && options->p)
-            {
-                ull2float(temp1_ullong,&f1);
-                ull2float(temp2_ullong,&f2);
-                PER(f1,f2);
-
-                if (not_comparable && !both_zero) /* not comparable */
-                {
-                    if ( print_data(options) )
-                    {
-                        print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-                        parallel_print(SPACES);
-                        parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-                    }
-                    nfound++;
-                }
-
-                else
-
-                    if ( per > options->percent && PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta )
-                    {
-
-                        if ( print_data(options) )
-                        {
-                            print_pos(ph,1,i,acc,pos,rank,dims,obj1,obj2);
-
-                            parallel_print(SPACES);
-                            parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
-                        }
-                        nfound++;
-                    }
-            }
-            else if (temp1_ullong != temp2_ullong)
-            {
-                if ( print_data(options) )
-                {
-                    print_pos(ph,0,i,acc,pos,rank,dims,obj1,obj2);
-                    parallel_print(SPACES);
-                    parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-                }
-                nfound++;
-            }
-
-        } /*H5T_NATIVE_ULLONG*/
-
-
         break; /* H5T_INTEGER class */
 
 
@@ -2495,7 +2291,7 @@ static hsize_t diff_datum(void       *_mem1,
             }
     } /*H5T_NATIVE_DOUBLE*/
 
-#if H5_SIZEOF_LONG_DOUBLE !=0
+#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE
 
 
        /*-------------------------------------------------------------------------
@@ -2503,7 +2299,7 @@ static hsize_t diff_datum(void       *_mem1,
         *-------------------------------------------------------------------------
         */
 
-        else if (type_size==8)
+        else if (type_size == H5_SIZEOF_LONG_DOUBLE)
         {
             long double temp1_double;
             long double temp2_double;
@@ -2511,7 +2307,7 @@ static hsize_t diff_datum(void       *_mem1,
             hbool_t         isnan2 = FALSE;
 
 
-            HDassert(type_size==sizeof(long double));
+            HDassert(type_size == sizeof(long double));
 
             HDmemcpy(&temp1_double, mem1, sizeof(long double));
             HDmemcpy(&temp2_double, mem2, sizeof(long double));
@@ -2706,9 +2502,7 @@ static hsize_t diff_datum(void       *_mem1,
                 }
                 nfound++;
             }
-    } /*H5T_NATIVE_DOUBLE*/
-
-
+    } /*H5T_NATIVE_LDOUBLE*/
 #endif  /* H5_SIZEOF_LONG_DOUBLE */
 
 
@@ -3003,7 +2797,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");
+    h5diffdebug3("character_compare start %d=%d\n",temp1_uchar,temp2_uchar);
 
     if (temp1_uchar != temp2_uchar)
     {
@@ -3986,701 +3780,658 @@ static hsize_t diff_schar(unsigned char *mem1,
                    int           *ph)
 
 {
- hsize_t     nfound=0;          /* number of differences found */
- char        temp1_char;
- char        temp2_char;
- hsize_t     i;
- double      per;
- hbool_t     both_zero;
-
- h5difftrace("diff_schar start\n");
-
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_char, mem1, sizeof(char));
-         HDmemcpy(&temp2_char, mem2, sizeof(char));
-
-         if (ABS(temp1_char-temp2_char) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(char);
-         mem2+=sizeof(char);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_char, mem1, sizeof(char));
-         HDmemcpy(&temp2_char, mem2, sizeof(char));
-
-         PER(temp1_char,temp2_char);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
-                     ABS(temp1_char-temp2_char));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_char,temp2_char,
-                         ABS(temp1_char-temp2_char),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(char);
-             mem2+=sizeof(char);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_char, mem1, sizeof(char));
-         HDmemcpy(&temp2_char, mem2, sizeof(char));
-
-         PER(temp1_char,temp2_char);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
-                     ABS(temp1_char-temp2_char));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && ABS(temp1_char-temp2_char) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_char,temp2_char,
-                         ABS(temp1_char-temp2_char),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(char);
-             mem2+=sizeof(char);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_char, mem1, sizeof(char));
-         HDmemcpy(&temp2_char, mem2, sizeof(char));
-
-         if (temp1_char != temp2_char)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(char);
-         mem2+=sizeof(char);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_schar finish\n");
+    hsize_t     nfound=0;          /* number of differences found */
+    char        temp1_char;
+    char        temp2_char;
+    hsize_t     i;
+    double      per;
+    hbool_t     both_zero;
 
- return nfound;
-}
+    h5difftrace("diff_schar start\n");
 
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
 
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_char, mem1, sizeof(char));
+            HDmemcpy(&temp2_char, mem2, sizeof(char));
 
-/*-------------------------------------------------------------------------
- * Function: diff_uchar
- *
- * Purpose: diff a H5T_NATIVE_UCHAR type
- *
- * Return: number of differences found
- *
- *-------------------------------------------------------------------------
- */
-static hsize_t diff_uchar(unsigned char *mem1,
-                   unsigned char *mem2,
-                   hsize_t       nelmts,
-                   hsize_t       hyper_start,
-                   int           rank,
-                   hsize_t       *dims,
-                   hsize_t       *acc,
-                   hsize_t       *pos,
-                   diff_opt_t    *options,
-                   const char    *obj1,
-                   const char    *obj2,
-                   int           *ph)
+            if (ABS(temp1_char-temp2_char) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(char);
+            mem2+=sizeof(char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
 
-{
- hsize_t       nfound=0;          /* number of differences found */
- unsigned char temp1_uchar;
- unsigned char temp2_uchar;
- hsize_t       i;
- double        per;
- hbool_t       both_zero;
-
- h5difftrace("diff_uchar start\n");
-
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
-         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
-
-         if ( PDIFF(temp1_uchar,temp2_uchar) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(unsigned char);
-         mem2+=sizeof(unsigned char);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
-         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
-
-         PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
-                     PDIFF(temp1_uchar,temp2_uchar));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
-                         PDIFF(temp1_uchar,temp2_uchar),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned char);
-             mem2+=sizeof(unsigned char);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
-         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
-
-         PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
-                     PDIFF(temp1_uchar,temp2_uchar));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && PDIFF(temp1_uchar,temp2_uchar) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
-                         PDIFF(temp1_uchar,temp2_uchar),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned char);
-             mem2+=sizeof(unsigned char);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
-         HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
-
-         if (temp1_uchar != temp2_uchar)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(unsigned char);
-         mem2+=sizeof(unsigned char);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_uchar finish\n");
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
 
- return nfound;
-}
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_char, mem1, sizeof(char));
+            HDmemcpy(&temp2_char, mem2, sizeof(char));
 
-/*-------------------------------------------------------------------------
- * Function: diff_short
- *
- * Purpose: diff a H5T_NATIVE_SHORT type
- *
- * Return: number of differences found
- *
- *-------------------------------------------------------------------------
- */
-static hsize_t diff_short(unsigned char *mem1,
-                   unsigned char *mem2,
-                   hsize_t       nelmts,
-                   hsize_t       hyper_start,
-                   int           rank,
-                   hsize_t       *dims,
-                   hsize_t       *acc,
-                   hsize_t       *pos,
-                   diff_opt_t    *options,
-                   const char    *obj1,
+            PER(temp1_char,temp2_char);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
+                        ABS(temp1_char-temp2_char));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_char,temp2_char,
+                            ABS(temp1_char-temp2_char),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(char);
+            mem2+=sizeof(char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_char, mem1, sizeof(char));
+            HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+            PER(temp1_char,temp2_char);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_char,temp2_char,
+                        ABS(temp1_char-temp2_char));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && ABS(temp1_char-temp2_char) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_char,temp2_char,
+                            ABS(temp1_char-temp2_char),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(char);
+            mem2+=sizeof(char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_char, mem1, sizeof(char));
+            HDmemcpy(&temp2_char, mem2, sizeof(char));
+
+            if (temp1_char != temp2_char)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_char,temp2_char,ABS(temp1_char-temp2_char));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(char);
+            mem2+=sizeof(char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+
+    }
+    h5difftrace("diff_schar finish\n");
+
+    return nfound;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_uchar
+ *
+ * Purpose: diff a H5T_NATIVE_UCHAR type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_uchar(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
                    const char    *obj2,
                    int           *ph)
 
 {
- hsize_t       nfound=0;          /* number of differences found */
- short         temp1_short;
- short         temp2_short;
- hsize_t       i;
- double        per;
- hbool_t       both_zero;
-
- h5difftrace("diff_short start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_short, mem1, sizeof(short));
-         HDmemcpy(&temp2_short, mem2, sizeof(short));
-
-         if (ABS(temp1_short-temp2_short) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(short);
-         mem2+=sizeof(short);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_short, mem1, sizeof(short));
-         HDmemcpy(&temp2_short, mem2, sizeof(short));
-
-         PER(temp1_short,temp2_short);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
-                     ABS(temp1_short-temp2_short));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_short,temp2_short,
-                         ABS(temp1_short-temp2_short),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(short);
-             mem2+=sizeof(short);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_short, mem1, sizeof(short));
-         HDmemcpy(&temp2_short, mem2, sizeof(short));
-
-         PER(temp1_short,temp2_short);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
-                     ABS(temp1_short-temp2_short));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && ABS(temp1_short-temp2_short) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_short,temp2_short,
-                         ABS(temp1_short-temp2_short),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(short);
-             mem2+=sizeof(short);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_short, mem1, sizeof(short));
-         HDmemcpy(&temp2_short, mem2, sizeof(short));
-
-         if (temp1_short != temp2_short)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(short);
-         mem2+=sizeof(short);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_short finish\n");
+    hsize_t       nfound=0;          /* number of differences found */
+    unsigned char temp1_uchar;
+    unsigned char temp2_uchar;
+    hsize_t       i;
+    double        per;
+    hbool_t       both_zero;
 
- return nfound;
+    h5difftrace("diff_uchar start\n");
+
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+            HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+            if ( PDIFF(temp1_uchar,temp2_uchar) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(unsigned char);
+            mem2+=sizeof(unsigned char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+            HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+            PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
+                        PDIFF(temp1_uchar,temp2_uchar));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
+                            PDIFF(temp1_uchar,temp2_uchar),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned char);
+            mem2+=sizeof(unsigned char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+            HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+            PER_UNSIGN(signed char,temp1_uchar,temp2_uchar);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_uchar,temp2_uchar,
+                        PDIFF(temp1_uchar,temp2_uchar));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && PDIFF(temp1_uchar,temp2_uchar) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_uchar,temp2_uchar,
+                            PDIFF(temp1_uchar,temp2_uchar),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned char);
+            mem2+=sizeof(unsigned char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
+            HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+
+            if (temp1_uchar != temp2_uchar)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_uchar,temp2_uchar,PDIFF(temp1_uchar,temp2_uchar));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(unsigned char);
+            mem2+=sizeof(unsigned char);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+
+    }
+    h5difftrace("diff_uchar finish\n");
+
+    return nfound;
 }
 
+/*-------------------------------------------------------------------------
+ * Function: diff_short
+ *
+ * Purpose: diff a H5T_NATIVE_SHORT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_short(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+    hsize_t       nfound=0;          /* number of differences found */
+    short         temp1_short;
+    short         temp2_short;
+    hsize_t       i;
+    double        per;
+    hbool_t       both_zero;
+
+    h5difftrace("diff_short start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_short, mem1, sizeof(short));
+            HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+            if (ABS(temp1_short-temp2_short) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(short);
+            mem2+=sizeof(short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_short, mem1, sizeof(short));
+            HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+            PER(temp1_short,temp2_short);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
+                        ABS(temp1_short-temp2_short));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_short,temp2_short,
+                            ABS(temp1_short-temp2_short),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(short);
+            mem2+=sizeof(short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_short, mem1, sizeof(short));
+            HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+            PER(temp1_short,temp2_short);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_short,temp2_short,
+                        ABS(temp1_short-temp2_short));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && ABS(temp1_short-temp2_short) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_short,temp2_short,
+                            ABS(temp1_short-temp2_short),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(short);
+            mem2+=sizeof(short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_short, mem1, sizeof(short));
+            HDmemcpy(&temp2_short, mem2, sizeof(short));
+
+            if (temp1_short != temp2_short)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_short,temp2_short,ABS(temp1_short-temp2_short));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(short);
+            mem2+=sizeof(short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+    }
+    h5difftrace("diff_short finish\n");
+
+    return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_ushort
+ *
+ * Purpose: diff a H5T_NATIVE_USHORT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_ushort(unsigned char *mem1,
+                    unsigned char *mem2,
+                    hsize_t       nelmts,
+                    hsize_t       hyper_start,
+                    int           rank,
+                    hsize_t       *dims,
+                    hsize_t       *acc,
+                    hsize_t       *pos,
+                    diff_opt_t    *options,
+                    const char    *obj1,
+                    const char    *obj2,
+                    int           *ph)
+
+{
+    hsize_t        nfound=0;          /* number of differences found */
+    unsigned short temp1_ushort;
+    unsigned short temp2_ushort;
+    hsize_t        i;
+    double         per;
+    hbool_t        both_zero;
+
+    h5difftrace("diff_ushort start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+            HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+            if ( PDIFF(temp1_ushort,temp2_ushort) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(unsigned short);
+            mem2+=sizeof(unsigned short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+            HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+            PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
+                        PDIFF(temp1_ushort,temp2_ushort));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
+                            PDIFF(temp1_ushort,temp2_ushort),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned short);
+            mem2+=sizeof(unsigned short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+            HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+            PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
+                        PDIFF(temp1_ushort,temp2_ushort));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && PDIFF(temp1_ushort,temp2_ushort) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
+                            PDIFF(temp1_ushort,temp2_ushort),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned short);
+            mem2+=sizeof(unsigned short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
+            HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
+
+            if (temp1_ushort != temp2_ushort)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
+                }
+                nfound++;
+            }
 
-/*-------------------------------------------------------------------------
- * Function: diff_ushort
- *
- * Purpose: diff a H5T_NATIVE_USHORT type
- *
- * Return: number of differences found
- *
- *-------------------------------------------------------------------------
- */
-static hsize_t diff_ushort(unsigned char *mem1,
-                    unsigned char *mem2,
-                    hsize_t       nelmts,
-                    hsize_t       hyper_start,
-                    int           rank,
-                    hsize_t       *dims,
-                    hsize_t       *acc,
-                    hsize_t       *pos,
-                    diff_opt_t    *options,
-                    const char    *obj1,
-                    const char    *obj2,
-                    int           *ph)
+            mem1+=sizeof(unsigned short);
+            mem2+=sizeof(unsigned short);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
 
-{
- hsize_t        nfound=0;          /* number of differences found */
- unsigned short temp1_ushort;
- unsigned short temp2_ushort;
- hsize_t        i;
- double         per;
- hbool_t        both_zero;
-
- h5difftrace("diff_ushort start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
-         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
-
-         if ( PDIFF(temp1_ushort,temp2_ushort) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(unsigned short);
-         mem2+=sizeof(unsigned short);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
-         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
-
-         PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
-                     PDIFF(temp1_ushort,temp2_ushort));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
-                         PDIFF(temp1_ushort,temp2_ushort),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned short);
-             mem2+=sizeof(unsigned short);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
-         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
-
-         PER_UNSIGN(signed short,temp1_ushort,temp2_ushort);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_ushort,temp2_ushort,
-                     PDIFF(temp1_ushort,temp2_ushort));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && PDIFF(temp1_ushort,temp2_ushort) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_ushort,temp2_ushort,
-                         PDIFF(temp1_ushort,temp2_ushort),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned short);
-             mem2+=sizeof(unsigned short);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ushort, mem1, sizeof(unsigned short));
-         HDmemcpy(&temp2_ushort, mem2, sizeof(unsigned short));
-
-         if (temp1_ushort != temp2_ushort)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_ushort,temp2_ushort,PDIFF(temp1_ushort,temp2_ushort));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(unsigned short);
-         mem2+=sizeof(unsigned short);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_ushort finish\n");
+    }
+    h5difftrace("diff_ushort finish\n");
 
- return nfound;
+    return nfound;
 }
 
 
-
 /*-------------------------------------------------------------------------
  * Function: diff_int
  *
@@ -4703,175 +4454,323 @@ static hsize_t diff_int(unsigned char *mem1,
                  const char    *obj2,
                  int           *ph)
 
-{
- hsize_t       nfound=0;          /* number of differences found */
- int           temp1_int;
- int           temp2_int;
- hsize_t       i;
- double        per;
- hbool_t       both_zero;
-
- h5difftrace("diff_int start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_int, mem1, sizeof(int));
-         HDmemcpy(&temp2_int, mem2, sizeof(int));
-
-         if (ABS(temp1_int-temp2_int) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(int);
-         mem2+=sizeof(int);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_int, mem1, sizeof(int));
-         HDmemcpy(&temp2_int, mem2, sizeof(int));
-
-         PER(temp1_int,temp2_int);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
-                     ABS(temp1_int-temp2_int));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_int,temp2_int,
-                         ABS(temp1_int-temp2_int),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(int);
-             mem2+=sizeof(int);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_int, mem1, sizeof(int));
-         HDmemcpy(&temp2_int, mem2, sizeof(int));
-
-         PER(temp1_int,temp2_int);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
-                     ABS(temp1_int-temp2_int));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && ABS(temp1_int-temp2_int) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_int,temp2_int,
-                         ABS(temp1_int-temp2_int),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(int);
-             mem2+=sizeof(int);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_int, mem1, sizeof(int));
-         HDmemcpy(&temp2_int, mem2, sizeof(int));
-
-         if (temp1_int != temp2_int)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(int);
-         mem2+=sizeof(int);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_int finish\n");
+{
+    hsize_t       nfound=0;          /* number of differences found */
+    int           temp1_int;
+    int           temp2_int;
+    hsize_t       i;
+    double        per;
+    hbool_t       both_zero;
+
+    h5difftrace("diff_int start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_int, mem1, sizeof(int));
+            HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+            if (ABS(temp1_int-temp2_int) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(int);
+            mem2+=sizeof(int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_int, mem1, sizeof(int));
+            HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+            PER(temp1_int,temp2_int);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
+                        ABS(temp1_int-temp2_int));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_int,temp2_int,
+                            ABS(temp1_int-temp2_int),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(int);
+            mem2+=sizeof(int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_int, mem1, sizeof(int));
+            HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+            PER(temp1_int,temp2_int);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_int,temp2_int,
+                        ABS(temp1_int-temp2_int));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && ABS(temp1_int-temp2_int) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_int,temp2_int,
+                            ABS(temp1_int-temp2_int),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(int);
+            mem2+=sizeof(int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_int, mem1, sizeof(int));
+            HDmemcpy(&temp2_int, mem2, sizeof(int));
+
+            if (temp1_int != temp2_int)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_int,temp2_int,ABS(temp1_int-temp2_int));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(int);
+            mem2+=sizeof(int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+
+    }
+    h5difftrace("diff_int finish\n");
+
+    return nfound;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: diff_uint
+ *
+ * Purpose: diff a H5T_NATIVE_UINT type
+ *
+ * Return: number of differences found
+ *
+ *-------------------------------------------------------------------------
+ */
+static hsize_t diff_uint(unsigned char *mem1,
+                  unsigned char *mem2,
+                  hsize_t       nelmts,
+                  hsize_t       hyper_start,
+                  int           rank,
+                  hsize_t       *dims,
+                  hsize_t       *acc,
+                  hsize_t       *pos,
+                  diff_opt_t    *options,
+                  const char    *obj1,
+                  const char    *obj2,
+                  int           *ph)
+
+{
+    hsize_t        nfound=0;          /* number of differences found */
+    unsigned int   temp1_uint;
+    unsigned int   temp2_uint;
+    hsize_t        i;
+    double         per;
+    hbool_t        both_zero;
+
+    h5difftrace("diff_uint start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+            HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+            if ( PDIFF(temp1_uint,temp2_uint) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(unsigned int);
+            mem2+=sizeof(unsigned int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+            HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+            PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
+                            PDIFF(temp1_uint,temp2_uint),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned int);
+            mem2+=sizeof(unsigned int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+            HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+            PER_UNSIGN(signed int,temp1_uint,temp2_uint);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && PDIFF(temp1_uint,temp2_uint) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
+                            PDIFF(temp1_uint,temp2_uint),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned int);
+            mem2+=sizeof(unsigned int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
+            HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
+
+            if (temp1_uint != temp2_uint)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
+                }
+                nfound++;
+            }
 
- return nfound;
-}
+            mem1+=sizeof(unsigned int);
+            mem2+=sizeof(unsigned int);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+    }
+    h5difftrace("diff_uint finish\n");
 
+    return nfound;
+}
 
 
 /*-------------------------------------------------------------------------
- * Function: diff_uint
+ * Function: diff_long
  *
- * Purpose: diff a H5T_NATIVE_UINT type
+ * Purpose: diff a H5T_NATIVE_LONG type
  *
  * Return: number of differences found
  *
  *-------------------------------------------------------------------------
  */
-static hsize_t diff_uint(unsigned char *mem1,
+static hsize_t diff_long(unsigned char *mem1,
                   unsigned char *mem2,
                   hsize_t       nelmts,
                   hsize_t       hyper_start,
@@ -4885,357 +4784,329 @@ static hsize_t diff_uint(unsigned char *mem1,
                   int           *ph)
 
 {
- hsize_t        nfound=0;          /* number of differences found */
- unsigned int   temp1_uint;
- unsigned int   temp2_uint;
- hsize_t        i;
- double         per;
- hbool_t        both_zero;
-
- h5difftrace("diff_uint start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
-         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
-
-         if ( PDIFF(temp1_uint,temp2_uint) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(unsigned int);
-         mem2+=sizeof(unsigned int);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
-         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
-
-         PER_UNSIGN(signed int,temp1_uint,temp2_uint);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
-                         PDIFF(temp1_uint,temp2_uint),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned int);
-             mem2+=sizeof(unsigned int);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
-         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
-
-         PER_UNSIGN(signed int,temp1_uint,temp2_uint);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT_P_NOTCOMP,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && PDIFF(temp1_uint,temp2_uint) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(I_FORMAT_P,temp1_uint,temp2_uint,
-                         PDIFF(temp1_uint,temp2_uint),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned int);
-             mem2+=sizeof(unsigned int);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_uint, mem1, sizeof(unsigned int));
-         HDmemcpy(&temp2_uint, mem2, sizeof(unsigned int));
-
-         if (temp1_uint != temp2_uint)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(I_FORMAT,temp1_uint,temp2_uint,PDIFF(temp1_uint,temp2_uint));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(unsigned int);
-         mem2+=sizeof(unsigned int);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_uint finish\n");
+    hsize_t       nfound=0;          /* number of differences found */
+    long          temp1_long;
+    long          temp2_long;
+    hsize_t       i;
+    double        per;
+    hbool_t       both_zero;
 
- return nfound;
-}
+    h5difftrace("diff_long start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            for ( i = 0; i < nelmts; i++)
+            {
+                HDmemcpy(&temp1_long, mem1, sizeof(long));
+                HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+                if (ABS(temp1_long-temp2_long) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                    }
+                    nfound++;
+                }
+                mem1+=sizeof(long);
+                mem2+=sizeof(long);
+                if (options->n && nfound>=options->count)
+                    return nfound;
+            }
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_long, mem1, sizeof(long));
+            HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+            PER(temp1_long,temp2_long);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
+                        ABS(temp1_long-temp2_long));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
+                            ABS(temp1_long-temp2_long),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(long);
+            mem2+=sizeof(long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_long, mem1, sizeof(long));
+            HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+            PER(temp1_long,temp2_long);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
+                        ABS(temp1_long-temp2_long));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && ABS(temp1_long-temp2_long) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
+                            ABS(temp1_long-temp2_long),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(long);
+            mem2+=sizeof(long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_long, mem1, sizeof(long));
+            HDmemcpy(&temp2_long, mem2, sizeof(long));
+
+            if (temp1_long != temp2_long)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(long);
+            mem2+=sizeof(long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+
+    }
+    h5difftrace("diff_long finish\n");
 
+    return nfound;
+}
 
 
 /*-------------------------------------------------------------------------
- * Function: diff_long
+ * Function: diff_ulong
  *
- * Purpose: diff a H5T_NATIVE_LONG type
+ * Purpose: diff a H5T_NATIVE_ULONG type
  *
  * Return: number of differences found
  *
  *-------------------------------------------------------------------------
  */
-static hsize_t diff_long(unsigned char *mem1,
-                  unsigned char *mem2,
-                  hsize_t       nelmts,
-                  hsize_t       hyper_start,
-                  int           rank,
-                  hsize_t       *dims,
-                  hsize_t       *acc,
-                  hsize_t       *pos,
-                  diff_opt_t    *options,
-                  const char    *obj1,
-                  const char    *obj2,
-                  int           *ph)
+static hsize_t diff_ulong(unsigned char *mem1,
+                   unsigned char *mem2,
+                   hsize_t       nelmts,
+                   hsize_t       hyper_start,
+                   int           rank,
+                   hsize_t       *dims,
+                   hsize_t       *acc,
+                   hsize_t       *pos,
+                   diff_opt_t    *options,
+                   const char    *obj1,
+                   const char    *obj2,
+                   int           *ph)
+
+{
+    hsize_t        nfound=0;          /* number of differences found */
+    unsigned long  temp1_ulong;
+    unsigned long  temp2_ulong;
+    hsize_t        i;
+    double         per;
+    hbool_t        both_zero;
+
+    h5difftrace("diff_ulong start\n");
+
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            for ( i = 0; i < nelmts; i++)
+            {
+                HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+                HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+                if ( PDIFF(temp1_ulong,temp2_ulong) > options->delta)
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                    }
+                    nfound++;
+                }
+                mem1+=sizeof(unsigned long);
+                mem2+=sizeof(unsigned long);
+                if (options->n && nfound>=options->count)
+                    return nfound;
+            }
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+            HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+            PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
+                            PDIFF(temp1_ulong,temp2_ulong),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned long);
+            mem2+=sizeof(unsigned long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+            HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+            PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && PDIFF(temp1_ulong,temp2_ulong) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
+                            PDIFF(temp1_ulong,temp2_ulong),
+                            per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned long);
+            mem2+=sizeof(unsigned long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
+            HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
+
+            if (temp1_ulong != temp2_ulong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
+                }
+                nfound++;
+            }
 
-{
- hsize_t       nfound=0;          /* number of differences found */
- long          temp1_long;
- long          temp2_long;
- hsize_t       i;
- double        per;
- hbool_t       both_zero;
-
- h5difftrace("diff_long start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-
-         for ( i = 0; i < nelmts; i++)
-         {
-             HDmemcpy(&temp1_long, mem1, sizeof(long));
-             HDmemcpy(&temp2_long, mem2, sizeof(long));
-
-             if (ABS(temp1_long-temp2_long) > options->delta)
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(long);
-             mem2+=sizeof(long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-         }
-     }
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_long, mem1, sizeof(long));
-         HDmemcpy(&temp2_long, mem2, sizeof(long));
-
-         PER(temp1_long,temp2_long);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
-                     ABS(temp1_long-temp2_long));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
-                         ABS(temp1_long-temp2_long),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(long);
-             mem2+=sizeof(long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_long, mem1, sizeof(long));
-         HDmemcpy(&temp2_long, mem2, sizeof(long));
-
-         PER(temp1_long,temp2_long);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LI_FORMAT_P_NOTCOMP,temp1_long,temp2_long,
-                     ABS(temp1_long-temp2_long));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && ABS(temp1_long-temp2_long) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT_P,temp1_long,temp2_long,
-                         ABS(temp1_long-temp2_long),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(long);
-             mem2+=sizeof(long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_long, mem1, sizeof(long));
-         HDmemcpy(&temp2_long, mem2, sizeof(long));
-
-         if (temp1_long != temp2_long)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LI_FORMAT,temp1_long,temp2_long,ABS(temp1_long-temp2_long));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(long);
-         mem2+=sizeof(long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_long finish\n");
+            mem1+=sizeof(unsigned long);
+            mem2+=sizeof(unsigned long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+    }
+    h5difftrace("diff_ulong finish\n");
 
- return nfound;
+    return nfound;
 }
 
 
-
-
 /*-------------------------------------------------------------------------
- * Function: diff_ulong
+ * Function: diff_llong
  *
- * Purpose: diff a H5T_NATIVE_ULONG type
+ * Purpose: diff a H5T_NATIVE_LLONG type
  *
  * Return: number of differences found
  *
  *-------------------------------------------------------------------------
  */
-static hsize_t diff_ulong(unsigned char *mem1,
+static hsize_t diff_llong(unsigned char *mem1,
                    unsigned char *mem2,
                    hsize_t       nelmts,
                    hsize_t       hyper_start,
@@ -5249,341 +5120,140 @@ static hsize_t diff_ulong(unsigned char *mem1,
                    int           *ph)
 
 {
- hsize_t        nfound=0;          /* number of differences found */
- unsigned long  temp1_ulong;
- unsigned long  temp2_ulong;
- hsize_t        i;
- double         per;
- hbool_t        both_zero;
-
- h5difftrace("diff_ulong start\n");
-
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-
-         for ( i = 0; i < nelmts; i++)
-         {
-             HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
-             HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
-
-             if ( PDIFF(temp1_ulong,temp2_ulong) > options->delta)
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned long);
-             mem2+=sizeof(unsigned long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-         }
-
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
-         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
-
-         PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
-                         PDIFF(temp1_ulong,temp2_ulong),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned long);
-             mem2+=sizeof(unsigned long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
-         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
-
-         PER_UNSIGN(signed long,temp1_ulong,temp2_ulong);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULI_FORMAT_P_NOTCOMP,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && PDIFF(temp1_ulong,temp2_ulong) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LI_FORMAT_P,temp1_ulong,temp2_ulong,
-                         PDIFF(temp1_ulong,temp2_ulong),
-                         per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned long);
-             mem2+=sizeof(unsigned long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ulong, mem1, sizeof(unsigned long));
-         HDmemcpy(&temp2_ulong, mem2, sizeof(unsigned long));
-
-         if (temp1_ulong != temp2_ulong)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LI_FORMAT,temp1_ulong,temp2_ulong,PDIFF(temp1_ulong,temp2_ulong));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(unsigned long);
-         mem2+=sizeof(unsigned long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_ulong finish\n");
+    hsize_t       nfound=0;          /* number of differences found */
+    long long     temp1_llong;
+    long long     temp2_llong;
+    hsize_t       i;
+    double        per;
+    hbool_t       both_zero;
 
- return nfound;
-}
+    h5difftrace("diff_llong start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
 
+            if (ABS( temp1_llong-temp2_llong) > options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(long long);
+            mem2+=sizeof(long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
 
+            PER(temp1_llong,temp2_llong);
 
-/*-------------------------------------------------------------------------
- * Function: diff_llong
- *
- * Purpose: diff a H5T_NATIVE_LLONG type
- *
- * Return: number of differences found
- *
- *-------------------------------------------------------------------------
- */
-static hsize_t diff_llong(unsigned char *mem1,
-                   unsigned char *mem2,
-                   hsize_t       nelmts,
-                   hsize_t       hyper_start,
-                   int           rank,
-                   hsize_t       *dims,
-                   hsize_t       *acc,
-                   hsize_t       *pos,
-                   diff_opt_t    *options,
-                   const char    *obj1,
-                   const char    *obj2,
-                   int           *ph)
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(long long);
+            mem2+=sizeof(long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
 
-{
- hsize_t       nfound=0;          /* number of differences found */
- long long     temp1_llong;
- long long     temp2_llong;
- hsize_t       i;
- double        per;
- hbool_t       both_zero;
-
- h5difftrace("diff_llong start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
-         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
-
-         if (ABS( temp1_llong-temp2_llong) > options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(long long);
-         mem2+=sizeof(long long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
-         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
-
-         PER(temp1_llong,temp2_llong);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(long long);
-             mem2+=sizeof(long long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
-         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
-
-         PER(temp1_llong,temp2_llong);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && ABS(temp1_llong-temp2_llong) > options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(long long);
-             mem2+=sizeof(long long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_llong, mem1, sizeof(long long));
-         HDmemcpy(&temp2_llong, mem2, sizeof(long long));
-
-         if (temp1_llong != temp2_llong)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(long long);
-         mem2+=sizeof(long long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_llong finish\n");
+            PER(temp1_llong,temp2_llong);
 
- return nfound;
-}
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LLI_FORMAT_P_NOTCOMP,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && ABS(temp1_llong-temp2_llong) > options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(LLI_FORMAT_P,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong),per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(long long);
+            mem2+=sizeof(long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_llong, mem1, sizeof(long long));
+            HDmemcpy(&temp2_llong, mem2, sizeof(long long));
+
+            if (temp1_llong != temp2_llong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(LLI_FORMAT,temp1_llong,temp2_llong,ABS(temp1_llong-temp2_llong));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(long long);
+            mem2+=sizeof(long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+    }
+    h5difftrace("diff_llong finish\n");
 
+    return nfound;
+}
 
 
 /*-------------------------------------------------------------------------
@@ -5609,161 +5279,145 @@ static hsize_t diff_ullong(unsigned char *mem1,
                     int           *ph)
 
 {
- hsize_t             nfound=0;          /* number of differences found */
- unsigned long long  temp1_ullong;
- unsigned long long  temp2_ullong;
- hsize_t             i;
- float               f1, f2;
- double              per;
- hbool_t             both_zero;
-
- h5difftrace("diff_ullong start\n");
- /* -d and !-p */
- if (options->d && !options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
-         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
-
-         if ( PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long) options->delta)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-             }
-             nfound++;
-         }
-         mem1+=sizeof(unsigned long long);
-         mem2+=sizeof(unsigned long long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     }
-
- }
-
- /* !-d and -p */
- else if (!options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
-         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
-
-         ull2float(temp1_ullong,&f1);
-         ull2float(temp2_ullong,&f2);
-         PER(f1,f2);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned long long);
-             mem2+=sizeof(unsigned long long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
-
- }
-
- /* -d and -p */
- else if ( options->d && options->p)
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
-         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
-
-         ull2float(temp1_ullong,&f1);
-         ull2float(temp2_ullong,&f2);
-         PER(f1,f2);
-
-         if (not_comparable && !both_zero) /* not comparable */
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-             }
-             nfound++;
-         }
-
-         else
-
-             if ( per > options->percent && PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta )
-             {
-                 if ( print_data(options) )
-                 {
-                     print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                     parallel_print(SPACES);
-                     parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
-                 }
-                 nfound++;
-             }
-             mem1+=sizeof(unsigned long long);
-             mem2+=sizeof(unsigned long long);
-             if (options->n && nfound>=options->count)
-                 return nfound;
-     }
-
- }
- else
- {
-
-     for ( i = 0; i < nelmts; i++)
-     {
-         HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
-         HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
-
-         if (temp1_ullong != temp2_ullong)
-         {
-             if ( print_data(options) )
-             {
-                 print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
-                 parallel_print(SPACES);
-                 parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
-             }
-             nfound++;
-         }
-
-         mem1+=sizeof(unsigned long long);
-         mem2+=sizeof(unsigned long long);
-         if (options->n && nfound>=options->count)
-             return nfound;
-     } /* nelmts */
-
- }
- h5difftrace("diff_ullong finish\n");
+    hsize_t             nfound=0;          /* number of differences found */
+    unsigned long long  temp1_ullong;
+    unsigned long long  temp2_ullong;
+    hsize_t             i;
+    float               f1, f2;
+    double              per;
+    hbool_t             both_zero;
+
+    h5difftrace("diff_ullong start\n");
+    /* -d and !-p */
+    if (options->d && !options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
 
- return nfound;
-}
+            if ( PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long) options->delta)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                }
+                nfound++;
+            }
+            mem1+=sizeof(unsigned long long);
+            mem2+=sizeof(unsigned long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* !-d and -p */
+    else if (!options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+            ull2float(temp1_ullong,&f1);
+            ull2float(temp2_ullong,&f2);
+            PER(f1,f2);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned long long);
+            mem2+=sizeof(unsigned long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    /* -d and -p */
+    else if ( options->d && options->p)
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+            ull2float(temp1_ullong,&f1);
+            ull2float(temp2_ullong,&f2);
+            PER(f1,f2);
+
+            if (not_comparable && !both_zero) /* not comparable */
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULLI_FORMAT_P_NOTCOMP,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                }
+                nfound++;
+            }
+            else
+                if ( per > options->percent && PDIFF(temp1_ullong,temp2_ullong) > (unsigned long long)options->delta )
+                {
+                    if ( print_data(options) )
+                    {
+                        print_pos(ph,1,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                        parallel_print(SPACES);
+                        parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong),per);
+                    }
+                    nfound++;
+                }
+            mem1+=sizeof(unsigned long long);
+            mem2+=sizeof(unsigned long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < nelmts; i++)
+        {
+            HDmemcpy(&temp1_ullong, mem1, sizeof(unsigned long long));
+            HDmemcpy(&temp2_ullong, mem2, sizeof(unsigned long long));
+
+            if (temp1_ullong != temp2_ullong)
+            {
+                if ( print_data(options) )
+                {
+                    print_pos(ph,0,hyper_start+i,acc,pos,rank,dims,obj1,obj2);
+                    parallel_print(SPACES);
+                    parallel_print(ULLI_FORMAT,temp1_ullong,temp2_ullong,PDIFF(temp1_ullong,temp2_ullong));
+                }
+                nfound++;
+            }
+
+            mem1+=sizeof(unsigned long long);
+            mem2+=sizeof(unsigned long long);
+            if (options->n && nfound>=options->count)
+                return nfound;
+        } /* nelmts */
+    }
+    h5difftrace("diff_ullong finish\n");
 
+    return nfound;
+}
 
 
 /*-------------------------------------------------------------------------
@@ -5781,44 +5435,44 @@ static hsize_t diff_ullong(unsigned char *mem1,
 static
 int ull2float(unsigned long long ull_value, float *f_value)
 {
- hid_t          dxpl_id;
- unsigned char  *buf = NULL;
- size_t         src_size;
- size_t         dst_size;
+    hid_t          dxpl_id;
+    unsigned char  *buf = NULL;
+    size_t         src_size;
+    size_t         dst_size;
 
- h5difftrace("ull2float start\n");
- if((dxpl_id = H5Pcreate(H5P_DATASET_XFER))<0)
-  goto error;
+    h5difftrace("ull2float start\n");
+    if((dxpl_id = H5Pcreate(H5P_DATASET_XFER))<0)
+        goto error;
 
- src_size = H5Tget_size(H5T_NATIVE_ULLONG);
- dst_size = H5Tget_size(H5T_NATIVE_FLOAT);
- buf = (unsigned char*)HDcalloc((size_t)1, MAX(src_size, dst_size));
- if(!buf)
-  goto error;
+    src_size = H5Tget_size(H5T_NATIVE_ULLONG);
+    dst_size = H5Tget_size(H5T_NATIVE_FLOAT);
+    buf = (unsigned char*)HDcalloc((size_t)1, MAX(src_size, dst_size));
+    if(!buf)
+        goto error;
 
- HDmemcpy(buf, &ull_value, src_size);
+    HDmemcpy(buf, &ull_value, src_size);
 
- /* do conversion */
- if(H5Tconvert(H5T_NATIVE_ULLONG, H5T_NATIVE_FLOAT, (size_t)1, buf, NULL, dxpl_id)<0)
-  goto error;
+    /* do conversion */
+    if(H5Tconvert(H5T_NATIVE_ULLONG, H5T_NATIVE_FLOAT, (size_t)1, buf, NULL, dxpl_id)<0)
+        goto error;
 
- HDmemcpy(f_value, buf, dst_size);
+    HDmemcpy(f_value, buf, dst_size);
 
- if(buf)
-     HDfree(buf);
- h5difftrace("ull2float finish\n");
+    if(buf)
+        HDfree(buf);
+    h5difftrace("ull2float finish\n");
 
- return 0;
+    return 0;
 
 error:
- H5E_BEGIN_TRY {
-  H5Pclose(dxpl_id);
- } H5E_END_TRY;
- if(buf)
-     HDfree(buf);
- h5difftrace("ull2float errored\n");
-
- return -1;
+    H5E_BEGIN_TRY {
+        H5Pclose(dxpl_id);
+    } H5E_END_TRY;
+    if(buf)
+        HDfree(buf);
+    h5difftrace("ull2float errored\n");
+
+    return -1;
 }
 
 
@@ -6326,8 +5980,8 @@ static void get_member_types(hid_t tid, mcomp_t *members)
         hid_t base_tid = H5Tget_super(tid);
         get_member_types(base_tid, members);
         H5Tclose(base_tid);
-    } 
-    else if (tclass == H5T_COMPOUND) 
+    }
+    else if (tclass == H5T_COMPOUND)
     {
         int      nmembs;
 
@@ -6347,9 +6001,9 @@ static void get_member_types(hid_t tid, mcomp_t *members)
              members->m[u] = (mcomp_t *)HDmalloc(sizeof(mcomp_t));
              HDmemset(members->m[u], 0, sizeof(mcomp_t));
              get_member_types(members->ids[u], members->m[u]);
-        }  
+        }
     }
-     
+
    return;
 
 
diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c
index 234a331..5642a9b 100644
--- a/tools/lib/h5diff_attr.c
+++ b/tools/lib/h5diff_attr.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5private.h"
@@ -106,11 +104,9 @@ static void table_attrs_free( table_attrs_t *table )
  *------------------------------------------------------------------------*/
 static void table_attr_mark_exist(unsigned *exist, char *name, table_attrs_t *table)
 {
-    size_t curr_val;
-
-    match_attr_t *new_attrs;
-
     if(table->nattrs == table->size) {
+        match_attr_t *new_attrs;
+
         table->size = MAX(1, table->size * 2);
         new_attrs = (match_attr_t *)HDrealloc(table->attrs, table->size * sizeof(match_attr_t));
         if(new_attrs)
@@ -118,6 +114,8 @@ static void table_attr_mark_exist(unsigned *exist, char *name, table_attrs_t *ta
     } /* end if */
 
     if(table->nattrs < table->size) {
+        size_t curr_val;
+
         curr_val = table->nattrs;
         table->attrs[curr_val].exist[0] = exist[0];
         table->attrs[curr_val].exist[1] = exist[1];
@@ -168,36 +166,34 @@ static herr_t build_match_list_attrs(hid_t loc1_id, hid_t loc2_id, table_attrs_t
     /*--------------------------------------------------
      * build the list
      */
-    while (curr1 < oinfo1.num_attrs && curr2 < oinfo2.num_attrs) {
+    while(curr1 < oinfo1.num_attrs && curr2 < oinfo2.num_attrs) {
         /*------------------
         * open attribute1 */
-        if ((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC,
-                (hsize_t) curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        if((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
             goto error;
         /* get name */
-        if (H5Aget_name(attr1_id, (size_t) ATTR_NAME_MAX, name1) < 0)
+        if(H5Aget_name(attr1_id, (size_t)ATTR_NAME_MAX, name1) < 0)
             goto error;
 
         /*------------------
         * open attribute2 */
-        if ((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC,
-                (hsize_t) curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        if((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
             goto error;
         /* get name */
-        if (H5Aget_name(attr2_id, (size_t) ATTR_NAME_MAX, name2) < 0)
+        if(H5Aget_name(attr2_id, (size_t)ATTR_NAME_MAX, name2) < 0)
             goto error;
 
         /* criteria is string compare */
         cmp = HDstrcmp(name1, name2);
 
-        if (cmp == 0) {
+        if(cmp == 0) {
             infile[0] = 1;
             infile[1] = 1;
             table_attr_mark_exist(infile, name1, table_lp);
             curr1++;
             curr2++;
         }
-        else if (cmp < 0) {
+        else if(cmp < 0) {
             infile[0] = 1;
             infile[1] = 0;
             table_attr_mark_exist(infile, name1, table_lp);
@@ -222,14 +218,13 @@ static herr_t build_match_list_attrs(hid_t loc1_id, hid_t loc2_id, table_attrs_t
     /* list1 did not end */
     infile[0] = 1;
     infile[1] = 0;
-    while (curr1 < oinfo1.num_attrs) {
+    while(curr1 < oinfo1.num_attrs) {
         /*------------------
         * open attribute1 */
-        if ((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC,
-                (hsize_t) curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        if((attr1_id = H5Aopen_by_idx(loc1_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)curr1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
             goto error;
         /* get name */
-        if (H5Aget_name(attr1_id, (size_t) ATTR_NAME_MAX, name1) < 0)
+        if(H5Aget_name(attr1_id, (size_t)ATTR_NAME_MAX, name1) < 0)
             goto error;
 
         table_attr_mark_exist(infile, name1, table_lp);
@@ -244,14 +239,13 @@ static herr_t build_match_list_attrs(hid_t loc1_id, hid_t loc2_id, table_attrs_t
     /* list2 did not end */
     infile[0] = 0;
     infile[1] = 1;
-    while (curr2 < oinfo2.num_attrs) {
+    while(curr2 < oinfo2.num_attrs) {
         /*------------------
         * open attribute2 */
-        if ((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC,
-                (hsize_t) curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        if((attr2_id = H5Aopen_by_idx(loc2_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)curr2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
             goto error;
         /* get name */
-        if (H5Aget_name(attr2_id, (size_t) ATTR_NAME_MAX, name2) < 0)
+        if(H5Aget_name(attr2_id, (size_t)ATTR_NAME_MAX, name2) < 0)
             goto error;
 
         table_attr_mark_exist(infile, name2, table_lp);
@@ -265,25 +259,22 @@ static herr_t build_match_list_attrs(hid_t loc1_id, hid_t loc2_id, table_attrs_t
     /*------------------------------------------------------
      * print the list
      */
-    if (options->m_verbose_level == 2) {
+    if(options->m_verbose_level == 2) {
         /* if '-v2' is detected */
         parallel_print("   obj1   obj2\n");
         parallel_print(" --------------------------------------\n");
-        for (i = 0; i < (unsigned int) table_lp->nattrs; i++) {
+        for(i = 0; i < (unsigned int) table_lp->nattrs; i++) {
             char c1, c2;
             c1 = (table_lp->attrs[i].exist[0]) ? 'x' : ' ';
             c2 = (table_lp->attrs[i].exist[1]) ? 'x' : ' ';
-            parallel_print("%5c %6c    %-15s\n", c1, c2,
-                    table_lp->attrs[i].name);
+            parallel_print("%5c %6c    %-15s\n", c1, c2, table_lp->attrs[i].name);
         } /* end for */
     }
 
-    if (options->m_verbose_level >= 1) {
-        parallel_print(
-                "Attributes status:  %d common, %d only in obj1, %d only in obj2\n",
+    if(options->m_verbose_level >= 1)
+        parallel_print("Attributes status:  %d common, %d only in obj1, %d only in obj2\n",
                 table_lp->nattrs - table_lp->nattrs_only1 - table_lp->nattrs_only2,
                 table_lp->nattrs_only1, table_lp->nattrs_only2);
-    }
 
     *table_out = table_lp;
 
@@ -331,8 +322,8 @@ hsize_t diff_attr(hid_t loc1_id,
     hid_t      space2_id=-1;    /* space ID */
     hid_t      ftype1_id=-1;    /* file data type ID */
     hid_t      ftype2_id=-1;    /* file data type ID */
-    int           vstrtype1=0;     /* ftype1 is a variable string */
-    int           vstrtype2=0;     /* ftype2 is a variable string */
+    int	       vstrtype1=0;     /* ftype1 is a variable string */
+    int	       vstrtype2=0;     /* ftype2 is a variable string */
     hid_t      mtype1_id=-1;    /* memory data type ID */
     hid_t      mtype2_id=-1;    /* memory data type ID */
     size_t     msize1;          /* memory size of memory type */
@@ -356,40 +347,39 @@ hsize_t diff_attr(hid_t loc1_id,
     int       j;
 
     table_attrs_t * match_list_attrs = NULL;
-    if (build_match_list_attrs(loc1_id, loc2_id, &match_list_attrs, options)
-            < 0)
+    if(build_match_list_attrs(loc1_id, loc2_id, &match_list_attrs, options) < 0)
         goto error;
 
     /* if detect any unique extra attr */
-    if (match_list_attrs->nattrs_only1 || match_list_attrs->nattrs_only2) {
+    if(match_list_attrs->nattrs_only1 || match_list_attrs->nattrs_only2) {
         /* exit will be 1 */
         options->contents = 0;
     }
 
-    for (u = 0; u < (unsigned) match_list_attrs->nattrs; u++) {
-        if ((match_list_attrs->attrs[u].exist[0]) && (match_list_attrs->attrs[u].exist[1])) {
+    for(u = 0; u < (unsigned)match_list_attrs->nattrs; u++) {
+        if((match_list_attrs->attrs[u].exist[0]) && (match_list_attrs->attrs[u].exist[1])) {
             name1 = name2 = match_list_attrs->attrs[u].name;
 
             /*--------------
             * attribute 1 */
-            if ((attr1_id = H5Aopen(loc1_id, name1, H5P_DEFAULT)) < 0)
+            if((attr1_id = H5Aopen(loc1_id, name1, H5P_DEFAULT)) < 0)
                 goto error;
 
             /*--------------
             * attribute 2 */
-            if ((attr2_id = H5Aopen(loc2_id, name2, H5P_DEFAULT)) < 0)
+            if((attr2_id = H5Aopen(loc2_id, name2, H5P_DEFAULT)) < 0)
                 goto error;
 
             /* get the datatypes  */
-            if ((ftype1_id = H5Aget_type(attr1_id)) < 0)
+            if((ftype1_id = H5Aget_type(attr1_id)) < 0)
                 goto error;
             vstrtype1 = H5Tis_variable_str(ftype1_id);
-            if ((ftype2_id = H5Aget_type(attr2_id)) < 0)
+            if((ftype2_id = H5Aget_type(attr2_id)) < 0)
                 goto error;
             vstrtype2 = H5Tis_variable_str(ftype2_id);
             /* no compare if either one but not both are variable string type */
             if (vstrtype1 != vstrtype2) {
-                if ((options->m_verbose || options->m_list_not_cmp))
+                if((options->m_verbose || options->m_list_not_cmp))
                     parallel_print("Not comparable: one of attribute <%s/%s> or <%s/%s> is of variable length type\n",
                             path1, name1, path2, name2);
                 options->not_cmp = 1;
@@ -405,25 +395,25 @@ hsize_t diff_attr(hid_t loc1_id,
                 continue;
             }
 
-            if ((mtype1_id = h5tools_get_native_type(ftype1_id)) < 0)
+            if((mtype1_id = h5tools_get_native_type(ftype1_id)) < 0)
                 goto error;
-            if ((mtype2_id = h5tools_get_native_type(ftype2_id)) < 0)
+            if((mtype2_id = h5tools_get_native_type(ftype2_id)) < 0)
                 goto error;
-            if ((msize1 = H5Tget_size(mtype1_id)) == 0)
+            if((msize1 = H5Tget_size(mtype1_id)) == 0)
                 goto error;
-            if ((msize2 = H5Tget_size(mtype2_id)) == 0)
+            if((msize2 = H5Tget_size(mtype2_id)) == 0)
                 goto error;
 
             /* get the dataspace   */
-            if ((space1_id = H5Aget_space(attr1_id)) < 0)
+            if((space1_id = H5Aget_space(attr1_id)) < 0)
                 goto error;
-            if ((space2_id = H5Aget_space(attr2_id)) < 0)
+            if((space2_id = H5Aget_space(attr2_id)) < 0)
                 goto error;
 
             /* get dimensions  */
-            if ((rank1 = H5Sget_simple_extent_dims(space1_id, dims1, NULL)) < 0)
+            if((rank1 = H5Sget_simple_extent_dims(space1_id, dims1, NULL)) < 0)
                 goto error;
-            if ((rank2 = H5Sget_simple_extent_dims(space2_id, dims2, NULL)) < 0)
+            if((rank2 = H5Sget_simple_extent_dims(space2_id, dims2, NULL)) < 0)
                 goto error;
 
             /*----------------------------------------------------------------------
@@ -433,23 +423,23 @@ hsize_t diff_attr(hid_t loc1_id,
 
             /* pass dims1 and dims2 for maxdims as well since attribute's maxdims
             * are always same */
-            if (diff_can_type(ftype1_id, ftype2_id, rank1, rank2, dims1, dims2,
+            if(diff_can_type(ftype1_id, ftype2_id, rank1, rank2, dims1, dims2,
                     dims1, dims2, name1, name2, options, 0) != 1) {
-                if (H5Tclose(ftype1_id) < 0)
+                if(H5Tclose(ftype1_id) < 0)
                     goto error;
-                if (H5Tclose(ftype2_id) < 0)
+                if(H5Tclose(ftype2_id) < 0)
                     goto error;
-                if (H5Sclose(space1_id) < 0)
+                if(H5Sclose(space1_id) < 0)
                     goto error;
-                if (H5Sclose(space2_id) < 0)
+                if(H5Sclose(space2_id) < 0)
                     goto error;
-                if (H5Aclose(attr1_id) < 0)
+                if(H5Aclose(attr1_id) < 0)
                     goto error;
-                if (H5Aclose(attr2_id) < 0)
+                if(H5Aclose(attr2_id) < 0)
                     goto error;
-                if (H5Tclose(mtype1_id) < 0)
+                if(H5Tclose(mtype1_id) < 0)
                     goto error;
-                if (H5Tclose(mtype2_id) < 0)
+                if(H5Tclose(mtype2_id) < 0)
                     goto error;
 
                 continue;
@@ -459,7 +449,7 @@ hsize_t diff_attr(hid_t loc1_id,
             * "upgrade" the smaller memory size
             *------------------------------------------------------------------
             */
-            if (FAIL == match_up_memsize(ftype1_id, ftype2_id, &mtype1_id,
+            if(FAIL == match_up_memsize(ftype1_id, ftype2_id, &mtype1_id,
                             &mtype2_id, &msize1, &msize2))
                 goto error;
 
@@ -468,26 +458,24 @@ hsize_t diff_attr(hid_t loc1_id,
             *----------------------------------------------------------------------
             */
             nelmts1 = 1;
-            for (j = 0; j < rank1; j++)
+            for(j = 0; j < rank1; j++)
                 nelmts1 *= dims1[j];
 
             buf1 = (void *)HDmalloc((size_t)(nelmts1 * msize1));
             buf2 = (void *)HDmalloc((size_t)(nelmts1 * msize2));
-            if (buf1 == NULL || buf2 == NULL) {
+            if(buf1 == NULL || buf2 == NULL) {
                 parallel_print("cannot read into memory\n");
                 goto error;
             }
-            if (H5Aread(attr1_id, mtype1_id, buf1) < 0) {
-                parallel_print("Failed reading attribute1 %s/%s\n", path1,
-                        name1);
+            if(H5Aread(attr1_id, mtype1_id, buf1) < 0) {
+                parallel_print("Failed reading attribute1 %s/%s\n", path1, name1);
                 goto error;
             }
             else
                 buf1hasdata = TRUE;
 
-            if (H5Aread(attr2_id, mtype2_id, buf2) < 0) {
-                parallel_print("Failed reading attribute2 %s/%s\n", path2,
-                        name2);
+            if(H5Aread(attr2_id, mtype2_id, buf2) < 0) {
+                parallel_print("Failed reading attribute2 %s/%s\n", path2, name2);
                 goto error;
             }
             else
@@ -504,7 +492,7 @@ hsize_t diff_attr(hid_t loc1_id,
 
             /* always print name */
             /* verbose (-v) and report (-r) mode */
-            if (options->m_verbose || options->m_report) {
+            if(options->m_verbose || options->m_report) {
                 do_print_attrname("attribute", np1, np2);
 
                 nfound = diff_array(buf1, buf2, nelmts1, (hsize_t) 0, rank1,
@@ -512,7 +500,7 @@ hsize_t diff_attr(hid_t loc1_id,
                 print_found(nfound);
             }
             /* quiet mode (-q), just count differences */
-            else if (options->m_quiet) {
+            else if(options->m_quiet) {
                 nfound = diff_array(buf1, buf2, nelmts1, (hsize_t) 0, rank1,
                         dims1, options, np1, np2, mtype1_id, attr1_id, attr2_id);
             }
@@ -535,31 +523,31 @@ hsize_t diff_attr(hid_t loc1_id,
 
             /* Free buf1 and buf2, check both VLEN-data VLEN-string to reclaim any
             * VLEN memory first */
-            if (TRUE == h5tools_detect_vlen(mtype1_id))
+            if(TRUE == h5tools_detect_vlen(mtype1_id))
                 H5Dvlen_reclaim(mtype1_id, space1_id, H5P_DEFAULT, buf1);
             HDfree(buf1);
             buf1 = NULL;
 
-            if (TRUE == h5tools_detect_vlen(mtype2_id))
+            if(TRUE == h5tools_detect_vlen(mtype2_id))
                 H5Dvlen_reclaim(mtype2_id, space2_id, H5P_DEFAULT, buf2);
             HDfree(buf2);
             buf2 = NULL;
 
-            if (H5Tclose(ftype1_id) < 0)
+            if(H5Tclose(ftype1_id) < 0)
                 goto error;
-            if (H5Tclose(ftype2_id) < 0)
+            if(H5Tclose(ftype2_id) < 0)
                 goto error;
-            if (H5Sclose(space1_id) < 0)
+            if(H5Sclose(space1_id) < 0)
                 goto error;
-            if (H5Sclose(space2_id) < 0)
+            if(H5Sclose(space2_id) < 0)
                 goto error;
-            if (H5Aclose(attr1_id) < 0)
+            if(H5Aclose(attr1_id) < 0)
                 goto error;
-            if (H5Aclose(attr2_id) < 0)
+            if(H5Aclose(attr2_id) < 0)
                 goto error;
-            if (H5Tclose(mtype1_id) < 0)
+            if(H5Tclose(mtype1_id) < 0)
                 goto error;
-            if (H5Tclose(mtype2_id) < 0)
+            if(H5Tclose(mtype2_id) < 0)
                 goto error;
 
             nfound_total += nfound;
diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c
index 63f1483..d8eadda 100644
--- a/tools/lib/h5diff_dset.c
+++ b/tools/lib/h5diff_dset.c
@@ -5,12 +5,10 @@
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
-* the files COPYING and Copyright.html.  COPYING can be found at the root   *
-* of the source code distribution tree; Copyright.html can be found at the  *
-* root level of an installed copy of the electronic HDF5 document set and   *
-* is linked from the top-level documents page.  It can also be found at     *
-* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-* access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5private.h"
@@ -89,6 +87,9 @@ hsize_t diff_dataset( hid_t file1_id,
             obj2_name,
             options);
     }
+    else
+        goto error;
+
     /*-------------------------------------------------------------------------
     * close
     *-------------------------------------------------------------------------
diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c
index 14fbcaa..7d6580c 100644
--- a/tools/lib/h5diff_util.c
+++ b/tools/lib/h5diff_util.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5private.h"
@@ -186,21 +184,21 @@ void print_type(hid_t type)
  *
  *-------------------------------------------------------------------------
  */
-const char*
+H5_ATTR_PURE const char*
 diff_basename(const char *name)
 {
     size_t i;
 
-    if (name==NULL)
+    if (name == NULL)
         return NULL;
 
     /* Find the end of the base name */
     i = HDstrlen(name);
-    while (i>0 && '/'==name[i-1])
+    while (i > 0 && '/' == name[i - 1])
         --i;
 
     /* Skip backward over base name */
-    while (i>0 && '/'!=name[i-1])
+    while (i > 0 && '/' != name[i - 1])
         --i;
 
     return(name+i);
@@ -217,20 +215,25 @@ diff_basename(const char *name)
  *
  *-------------------------------------------------------------------------
  */
-const char*
+H5_ATTR_PURE H5_ATTR_CONST const char*
 get_type(h5trav_type_t type)
 {
     switch(type) {
         case H5TRAV_TYPE_DATASET:
             return("H5G_DATASET");
+
         case H5TRAV_TYPE_GROUP:
             return("H5G_GROUP");
+
         case H5TRAV_TYPE_NAMED_DATATYPE:
             return("H5G_TYPE");
+
         case H5TRAV_TYPE_LINK:
             return("H5G_LINK");
+
         case H5TRAV_TYPE_UDLINK:
             return("H5G_UDLINK");
+
         case H5TRAV_TYPE_UNKNOWN:
         default:
             return("unknown type");
@@ -250,19 +253,23 @@ get_type(h5trav_type_t type)
  *
  *-------------------------------------------------------------------------
  */
-const char*
+H5_ATTR_PURE const char*
 get_sign(H5T_sign_t sign)
 {
     switch (sign)
     {
         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";
@@ -281,38 +288,48 @@ get_sign(H5T_sign_t sign)
  *
  *-------------------------------------------------------------------------
  */
-const char*
+H5_ATTR_PURE const char*
 get_class(H5T_class_t tclass)
 {
-    switch (tclass)
-    {
-    case H5T_TIME:
-        return("H5T_TIME");
-    case H5T_INTEGER:
-        return("H5T_INTEGER");
-    case H5T_FLOAT:
-        return("H5T_FLOAT");
-    case H5T_STRING:
-        return("H5T_STRING");
-    case H5T_BITFIELD:
-        return("H5T_BITFIELD");
-    case H5T_OPAQUE:
-        return("H5T_OPAQUE");
-    case H5T_COMPOUND:
-        return("H5T_COMPOUND");
-    case H5T_REFERENCE:
-        return("H5T_REFERENCE");
-    case H5T_ENUM:
-        return("H5T_ENUM");
-    case H5T_VLEN:
-        return("H5T_VLEN");
-    case H5T_ARRAY:
-        return("H5T_ARRAY");
-    case H5T_NO_CLASS:
-    case H5T_NCLASSES:
-    default:
-        HDassert(0);
-        return("Invalid class");
+    switch (tclass) {
+        case H5T_TIME:
+            return("H5T_TIME");
+
+        case H5T_INTEGER:
+            return("H5T_INTEGER");
+
+        case H5T_FLOAT:
+            return("H5T_FLOAT");
+
+        case H5T_STRING:
+            return("H5T_STRING");
+
+        case H5T_BITFIELD:
+            return("H5T_BITFIELD");
+
+        case H5T_OPAQUE:
+            return("H5T_OPAQUE");
+
+        case H5T_COMPOUND:
+            return("H5T_COMPOUND");
+
+        case H5T_REFERENCE:
+            return("H5T_REFERENCE");
+
+        case H5T_ENUM:
+            return("H5T_ENUM");
+
+        case H5T_VLEN:
+            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() */
 
@@ -325,10 +342,10 @@ get_class(H5T_class_t tclass)
  */
 void print_found(hsize_t nfound)
 {
- if(g_Parallel)
-  parallel_print("%"H5_PRINTF_LL_WIDTH"u differences found\n", (unsigned long long)nfound);
- else
-  HDfprintf(stdout,"%Hu differences found\n",nfound);
+    if(g_Parallel)
+        parallel_print("%"H5_PRINTF_LL_WIDTH"u differences found\n", (unsigned long long)nfound);
+    else
+        HDfprintf(stdout,"%Hu differences found\n",nfound);
 }
 
 
@@ -375,3 +392,4 @@ herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id,
 out:
     return ret;
 }
+
diff --git a/tools/lib/h5tools.c b/tools/lib/h5tools.c
index 19d71bb..86dca8b 100644
--- a/tools/lib/h5tools.c
+++ b/tools/lib/h5tools.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -47,10 +45,11 @@ int         region_output;      /* region output */
 int         oid_output;         /* oid output */
 int         data_output;        /* data output */
 int         attr_data_output;   /* attribute data output */
-int         packed_bits_num;    /* number of packed bits to display */
-int         packed_data_offset; /* offset of packed bits to display */
-int         packed_data_length; /* lengtht of packed bits to display */
+unsigned    packed_bits_num;    /* number of packed bits to display */
+unsigned    packed_data_offset; /* offset of packed bits to display */
+unsigned    packed_data_length; /* length of packed bits to display */
 unsigned long long packed_data_mask;  /* mask in which packed bits to display */
+int          enable_error_stack= FALSE; /* re-enable error stack */
 
 /* module-scoped variables */
 static int  h5tools_init_g;     /* if h5tools lib has been initialized */
@@ -669,7 +668,7 @@ done:
  * Modifications:
  *-------------------------------------------------------------------------
  */
-static size_t
+H5_ATTR_PURE static size_t
 h5tools_count_ncols(const char *s)
 {
     register size_t i;
@@ -805,7 +804,7 @@ h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
     h5tools_str_t prefix;
     h5tools_str_t str; /*temporary for indentation */
     size_t templength = 0;
-    int i, indentlevel = 0;
+    unsigned u, indentlevel = 0;
 
     if (stream == NULL)
         return;
@@ -827,10 +826,9 @@ h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
     h5tools_str_prefix(&prefix, info, elmtno, ctx->ndims, ctx);
 
     /* Write new prefix to output */
-    if (ctx->indent_level >= 0) {
+    if (ctx->indent_level > 0)
         indentlevel = ctx->indent_level;
-    }
-    else {
+    else
         /*
          * This is because sometimes we don't print out all the header
          * info for the data (like the tattr-2.ddl example). If that happens
@@ -838,29 +836,23 @@ h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
          * just print out the default indent levels.
          */
         indentlevel = ctx->default_indent_level;
-    }
 
     /* when printing array indices, print the indentation before the prefix
        the prefix is printed one indentation level before */
-    if (info->pindex) {
-        for (i = 0; i < indentlevel - 1; i++) {
+    if (info->pindex)
+        for (u = 0; u < indentlevel - 1; u++)
             PUTSTREAM(h5tools_str_fmt(&str, (size_t)0, info->line_indent), stream);
-        }
-    }
 
-    if (elmtno == 0 && secnum == 0 && info->line_1st) {
+    if (elmtno == 0 && secnum == 0 && info->line_1st)
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_1st), stream);
-    }
-    else if (secnum && info->line_cont) {
+    else if (secnum && info->line_cont)
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_cont), stream);
-    }
-    else {
+    else
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_pre), stream);
-    }
 
     templength = h5tools_str_len(&prefix);
 
-    for (i = 0; i < indentlevel; i++) {
+    for (u = 0; u < indentlevel; u++)
         /*we already made the indent for the array indices case */
         if (!info->pindex) {
             PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_indent), stream);
@@ -870,7 +862,6 @@ h5tools_simple_prefix(FILE *stream, const h5tool_format_t *info,
             /*we cannot count the prefix for the array indices case */
             templength += h5tools_str_len(&str);
         }
-    }
 
     ctx->cur_column = ctx->prev_prefix_len = templength;
     ctx->cur_elmt = 0;
@@ -900,7 +891,7 @@ h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
     h5tools_str_t prefix;
     h5tools_str_t str; /*temporary for indentation */
     size_t templength = 0;
-    int i, indentlevel = 0;
+    unsigned u, indentlevel = 0;
 
     if (stream == NULL)
         return;
@@ -922,7 +913,7 @@ h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
     h5tools_str_region_prefix(&prefix, info, elmtno, ptdata, ctx->ndims, ctx->p_max_idx, ctx);
 
     /* Write new prefix to output */
-    if (ctx->indent_level >= 0)
+    if (ctx->indent_level > 0)
         indentlevel = ctx->indent_level;
     else
         /*
@@ -936,20 +927,19 @@ h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
     /* when printing array indices, print the indentation before the prefix
        the prefix is printed one indentation level before */
     if (info->pindex)
-        for (i = 0; i < indentlevel - 1; i++) {
+        for (u = 0; u < indentlevel - 1; u++)
             PUTSTREAM(h5tools_str_fmt(&str, (size_t)0, info->line_indent), stream);
-        }
 
-    if (elmtno == 0 && secnum == 0 && info->line_1st) {
+    if (elmtno == 0 && secnum == 0 && info->line_1st)
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_1st), stream);
-    } else if (secnum && info->line_cont) {
+    else if (secnum && info->line_cont)
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_cont), stream);
-    } else
+    else
         PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_pre), stream);
 
     templength = h5tools_str_len(&prefix);
 
-    for (i = 0; i < indentlevel; i++) {
+    for (u = 0; u < indentlevel; u++)
         /*we already made the indent for the array indices case */
         if (!info->pindex) {
             PUTSTREAM(h5tools_str_fmt(&prefix, (size_t)0, info->line_indent), stream);
@@ -959,7 +949,6 @@ h5tools_region_simple_prefix(FILE *stream, const h5tool_format_t *info,
             /*we cannot count the prefix for the array indices case */
             templength += h5tools_str_len(&str);
         }
-    }
 
     ctx->cur_column = ctx->prev_prefix_len = templength;
     ctx->cur_elmt = 0;
@@ -1299,9 +1288,8 @@ init_acc_pos(h5tools_context_t *ctx, hsize_t *dims)
     HDassert(ctx->ndims);
 
     ctx->acc[ctx->ndims - 1] = 1;
-    for (i = (ctx->ndims - 2); i >= 0; i--) {
+    for (i = ((int)ctx->ndims - 2); i >= 0; i--)
         ctx->acc[i] = ctx->acc[i + 1] * dims[i + 1];
-    }
     for (j = 0; j < ctx->ndims; j++)
         ctx->pos[j] = 0;
 }
@@ -1536,18 +1524,18 @@ CATCH
  */
 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)
+    hid_t container, unsigned ndims, hid_t type_id, hsize_t nblocks, hsize_t *ptdata)
 {
     hsize_t     *dims1 = NULL;
     hsize_t     *start = NULL;
     hsize_t     *count = NULL;
     hsize_t      numelem;
     hsize_t      total_size[H5S_MAX_RANK];
-    int          jndx;
+    unsigned     jndx;
     size_t       type_size;
     hid_t        mem_space = -1;
     void        *region_buf = NULL;
-    int          blkndx;
+    hsize_t      blkndx;
     hid_t        sid1 = -1;
     int          ret_value = SUCCEED;
 
@@ -1567,7 +1555,7 @@ render_bin_output_region_data_blocks(hid_t region_id, FILE *stream,
     }
 
     /* Create dataspace for reading buffer */
-    if((mem_space = H5Screate_simple(ndims, dims1, NULL)) < 0)
+    if((mem_space = H5Screate_simple((int)ndims, dims1, NULL)) < 0)
         HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
 
     if((type_size = H5Tget_size(type_id)) == 0)
@@ -1640,7 +1628,8 @@ render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
     hsize_t      nblocks;
     hsize_t      alloc_size;
     hsize_t     *ptdata;
-    int          ndims;
+    int          sndims;
+    unsigned     ndims;
     hid_t        dtype = -1;
     hid_t        type_id = -1;
 
@@ -1649,16 +1638,16 @@ render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
     nblocks = (hsize_t)snblocks;
 
     /* Print block information */
-    if((ndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
         H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
 
     alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
     HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
     if((ptdata = (hsize_t*) HDmalloc((size_t) alloc_size)) == NULL)
         HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
 
-    H5_CHECK_OVERFLOW(nblocks, hssize_t, hsize_t);
-    if(H5Sget_select_hyper_blocklist(region_space, (hsize_t) 0, (hsize_t) nblocks, ptdata) < 0)
+    if(H5Sget_select_hyper_blocklist(region_space, (hsize_t) 0, nblocks, ptdata) < 0)
         HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Rget_select_hyper_blocklist failed");
 
     if((dtype = H5Dget_type(region_id)) < 0)
@@ -1705,10 +1694,10 @@ render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
 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)
+        unsigned ndims, hid_t type_id, hsize_t npoints)
 {
     hsize_t *dims1 = NULL;
-    int      type_size;
+    size_t   type_size;
     hid_t    mem_space = -1;
     void    *region_buf = NULL;
     int      ret_value = SUCCEED;
@@ -1763,17 +1752,21 @@ render_bin_output_region_points(hid_t region_space, hid_t region_id,
         FILE *stream, hid_t container)
 {
     HERR_INIT(hbool_t, TRUE)
-    hssize_t npoints;
-    int      ndims;
+    hssize_t snpoints;
+    hsize_t  npoints;
+    int      sndims;
+    unsigned ndims;
     hid_t    dtype = -1;
     hid_t    type_id = -1;
 
-    if((npoints = H5Sget_select_elem_npoints(region_space)) <= 0)
+    if((snpoints = H5Sget_select_elem_npoints(region_space)) <= 0)
         H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_select_elem_npoints failed");
+    npoints = (hsize_t)snpoints;
 
     /* Allocate space for the dimension array */
-    if((ndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
         H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
 
     if((dtype = H5Dget_type(region_id)) < 0)
         HGOTO_ERROR(FALSE, H5E_tools_min_id_g, "H5Dget_type failed");
@@ -1804,7 +1797,7 @@ CATCH
  * Return:  TRUE if all bytes are zero; FALSE otherwise
  *-------------------------------------------------------------------------
  */
-hbool_t
+H5_ATTR_PURE hbool_t
 h5tools_is_zero(const void *_mem, size_t size)
 {
     const unsigned char *mem = (const unsigned char *) _mem;
diff --git a/tools/lib/h5tools.h b/tools/lib/h5tools.h
index a7f28e5..2bafdfc 100644
--- a/tools/lib/h5tools.h
+++ b/tools/lib/h5tools.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -40,7 +38,7 @@
 #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 PUTSTREAM(X,S)          do { if(S != NULL) HDfputs(X, S); } while(0)
 
 /*
  * Strings for output - these were duplicated from the h5dump.h
@@ -298,7 +296,7 @@ typedef struct h5tool_format_t {
     const char  *fmt_float;
     int         ascii;
     int         str_locale;
-    int         str_repeat;
+    unsigned    str_repeat;
 
     /*
      * Fields associated with compound array members.
@@ -350,7 +348,7 @@ typedef struct h5tool_format_t {
     const char  *cmpd_pre;
     const char  *cmpd_suf;
     const char  *cmpd_end;
-    const struct H5LD_memb_t **cmpd_listv;
+    const struct H5LD_memb_t * const *cmpd_listv;
 
 
     /*
@@ -518,9 +516,9 @@ 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
+    unsigned  indent_level;                /*the number of times we need some
                                        *extra indentation */
-    int  default_indent_level;        /*this is used when the indent level gets changed */
+    unsigned  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 */
@@ -554,9 +552,9 @@ H5TOOLS_DLLVAR const h5tools_dump_header_t* h5tools_dump_header_format;
 extern "C" {
 #endif
 
-H5TOOLS_DLLVAR int     packed_bits_num;     /* number of packed bits to display */
-H5TOOLS_DLLVAR int     packed_data_offset;  /* offset of packed bits to display */
-H5TOOLS_DLLVAR int     packed_data_length; /* lengtht of packed bits to display */
+H5TOOLS_DLLVAR unsigned packed_bits_num;    /* number of packed bits to display */
+H5TOOLS_DLLVAR unsigned packed_data_offset; /* offset of packed bits to display */
+H5TOOLS_DLLVAR unsigned packed_data_length; /* length of packed bits to display */
 H5TOOLS_DLLVAR unsigned long long packed_data_mask;  /* mask in which packed bits to display */
 H5TOOLS_DLLVAR FILE   *rawattrstream;       /* output stream for raw attribute data */
 H5TOOLS_DLLVAR FILE   *rawdatastream;       /* output stream for raw data */
@@ -570,6 +568,9 @@ H5TOOLS_DLLVAR int     oid_output;          /* oid output */
 H5TOOLS_DLLVAR int     data_output;         /* data output */
 H5TOOLS_DLLVAR int     attr_data_output;    /* attribute data output */
 
+/* things to display or which are set via command line parameters */
+H5TOOLS_DLLVAR int     enable_error_stack; /* re-enable error stack */
+
 /* Strings for output */
 #define H5_TOOLS_GROUP           "GROUP"
 #define H5_TOOLS_DATASET         "DATASET"
@@ -578,11 +579,11 @@ H5TOOLS_DLLVAR int     attr_data_output;    /* attribute data output */
 /* Definitions of useful routines */
 H5TOOLS_DLL void    h5tools_init(void);
 H5TOOLS_DLL void    h5tools_close(void);
-H5TOOLS_DLL int 	h5tools_set_data_output_file(const char *fname, int is_bin);
-H5TOOLS_DLL int 	h5tools_set_attr_output_file(const char *fname, int is_bin);
-H5TOOLS_DLL int 	h5tools_set_input_file(const char *fname, int is_bin);
-H5TOOLS_DLL int 	h5tools_set_output_file(const char *fname, int is_bin);
-H5TOOLS_DLL int 	h5tools_set_error_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_data_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_attr_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_input_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_output_file(const char *fname, int is_bin);
+H5TOOLS_DLL int     h5tools_set_error_file(const char *fname, int is_bin);
 H5TOOLS_DLL hid_t   h5tools_fopen(const char *fname, unsigned flags, hid_t fapl,
                             const char *driver, char *drivername, size_t drivername_len);
 H5TOOLS_DLL hid_t   h5tools_get_native_type(hid_t type);
@@ -603,11 +604,11 @@ H5TOOLS_DLL void    h5tools_region_simple_prefix(FILE *stream, const h5tool_form
 
 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);
+                            hid_t container, unsigned ndims, hid_t type_id, hsize_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);
+                            FILE* stream, hid_t container, unsigned ndims, hid_t type_id, hsize_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 9e285a9..381a253 100644
--- a/tools/lib/h5tools_dump.c
+++ b/tools/lib/h5tools_dump.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -31,73 +29,73 @@
 #include "H5private.h"
 
 h5tool_format_t h5tools_dataformat = {
-0, /*raw */
-
-"", /*fmt_raw */
-"%d", /*fmt_int */
-"%u", /*fmt_uint */
-"%hhd", /*fmt_schar */
-"%u", /*fmt_uchar */
-"%d", /*fmt_short */
-"%u", /*fmt_ushort */
-"%ld", /*fmt_long */
-"%lu", /*fmt_ulong */
-NULL, /*fmt_llong */
-NULL, /*fmt_ullong */
-"%g", /*fmt_double */
-"%g", /*fmt_float */
-
-0, /*ascii */
-0, /*str_locale */
-0, /*str_repeat */
-
-"[ ", /*arr_pre */
-",", /*arr_sep */
-" ]", /*arr_suf */
-1, /*arr_linebreak */
-
-"", /*cmpd_name */
-",\n", /*cmpd_sep */
-"{", /*cmpd_pre */
-"}", /*cmpd_suf */
-"\n", /*cmpd_end */
-NULL, /* cmpd_listv */
-
-", ", /*vlen_sep */
-"(", /*vlen_pre */
-")", /*vlen_suf */
-"", /*vlen_end */
-
-"%s", /*elmt_fmt */
-",", /*elmt_suf1 */
-" ", /*elmt_suf2 */
-
-"", /*idx_n_fmt */
-"", /*idx_sep */
-"", /*idx_fmt */
-
-80, /*line_ncols *//*standard default columns */
-0, /*line_per_line */
-"", /*line_pre */
-"%s", /*line_1st */
-"%s", /*line_cont */
-"", /*line_suf */
-"", /*line_sep */
-1, /*line_multi_new */
-"   ", /*line_indent */
-
-1, /*skip_first */
-
-1, /*obj_hidefileno */
-" "H5_PRINTF_HADDR_FMT, /*obj_format */
-
-1, /*dset_hidefileno */
-"DATASET %s ", /*dset_format */
-"%s", /*dset_blockformat_pre */
-"%s", /*dset_ptformat_pre */
-"%s", /*dset_ptformat */
-1, /*array indices */
-1 /*escape non printable characters */
+    0,          /*raw */
+
+    "",         /*fmt_raw */
+    "%d",       /*fmt_int */
+    "%u",       /*fmt_uint */
+    "%hhd",     /*fmt_schar */
+    "%u",       /*fmt_uchar */
+    "%d",       /*fmt_short */
+    "%u",       /*fmt_ushort */
+    "%ld",      /*fmt_long */
+    "%lu",      /*fmt_ulong */
+    NULL,       /*fmt_llong */
+    NULL,       /*fmt_ullong */
+    "%g",       /*fmt_double */
+    "%g",       /*fmt_float */
+
+    0,          /*ascii */
+    0,          /*str_locale */
+    0,          /*str_repeat */
+
+    "[ ",       /*arr_pre */
+    ",",        /*arr_sep */
+    " ]",       /*arr_suf */
+    1,          /*arr_linebreak */
+
+    "",         /*cmpd_name */
+    ",\n",      /*cmpd_sep */
+    "{",        /*cmpd_pre */
+    "}",        /*cmpd_suf */
+    "\n",       /*cmpd_end */
+    NULL,       /* cmpd_listv */
+
+    ", ",       /*vlen_sep */
+    "(",        /*vlen_pre */
+    ")",        /*vlen_suf */
+    "",         /*vlen_end */
+
+    "%s",       /*elmt_fmt */
+    ",",        /*elmt_suf1 */
+    " ",        /*elmt_suf2 */
+
+    "",         /*idx_n_fmt */
+    "",         /*idx_sep */
+    "",         /*idx_fmt */
+
+    80,         /*line_ncols *//*standard default columns */
+    0,          /*line_per_line */
+    "",         /*line_pre */
+    "%s",       /*line_1st */
+    "%s",       /*line_cont */
+    "",         /*line_suf */
+    "",         /*line_sep */
+    1,          /*line_multi_new */
+    "   ",      /*line_indent */
+
+    1,          /*skip_first */
+
+    1,          /*obj_hidefileno */
+    " "H5_PRINTF_HADDR_FMT, /*obj_format */
+
+    1,          /*dset_hidefileno */
+    "DATASET %s ", /*dset_format */
+    "%s",       /*dset_blockformat_pre */
+    "%s",       /*dset_ptformat_pre */
+    "%s",       /*dset_ptformat */
+    1,          /*array indices */
+    1           /*escape non printable characters */
 };
 
 const h5tools_dump_header_t h5tools_standardformat = {
@@ -208,10 +206,10 @@ hbool_t h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
                 size_t ncols, hsize_t region_elmt_counter/*element counter*/,
                 hsize_t elmt_counter);
 
-int h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
+static int h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
         FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
         h5tools_str_t *buffer, size_t ncols,
-        int ndims, hid_t type_id, hssize_t npoints, hsize_t *ptdata);
+        unsigned ndims, hid_t type_id, hsize_t npoints, hsize_t *ptdata);
 
 hbool_t h5tools_dump_region_data_blocks(hid_t region_space, hid_t region_id,
                 FILE *stream, const h5tool_format_t *info,
@@ -651,10 +649,10 @@ h5tools_dump_region_data_blocks(hid_t region_space, hid_t region_id,
     alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
     HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
     if((ptdata = (hsize_t*) HDmalloc((size_t) alloc_size)) == NULL)
-{
+    {
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
         HGOTO_DONE(dimension_break);
-}
+    }
 
     if(H5Sget_select_hyper_blocklist(region_space, (hsize_t)0, nblocks, ptdata) < 0)
         HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Rget_select_hyper_blocklist failed");
@@ -796,20 +794,20 @@ h5tools_dump_region_data_blocks(hid_t region_space, hid_t region_id,
  *      hssize_t npoints is the number of points in the region
  *-------------------------------------------------------------------------
  */
-int
+static int
 h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
         FILE *stream, const h5tool_format_t *info, h5tools_context_t *cur_ctx,
         h5tools_str_t *buffer, size_t ncols,
-        int ndims, hid_t type_id, hssize_t npoints, hsize_t *ptdata)
+        unsigned ndims, hid_t type_id, hsize_t npoints, hsize_t *ptdata)
 {
     hbool_t  dimension_break = TRUE;
     hsize_t *dims1 = NULL;
     hsize_t  elmtno; /* elemnt index  */
     hsize_t  curr_pos = 0;
     hsize_t  total_size[H5S_MAX_RANK];
-    size_t   jndx;
+    hsize_t  jndx;
     unsigned indx;
-    int      type_size;
+    size_t   type_size;
     int      ret_value = SUCCEED;
     unsigned int region_flags; /* buffer extent flags */
     hid_t    mem_space = -1;
@@ -824,7 +822,7 @@ h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
 
     HDmemset(&ctx, 0, sizeof(ctx));
     /* Allocate space for the dimension array */
-    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * (size_t)ndims)) == NULL)
+    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
         HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
 
     dims1[0] = npoints;
@@ -858,7 +856,7 @@ h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
             HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
 
         /* assume entire data space to be printed */
-        for (indx = 0; indx < (size_t) ctx.ndims; indx++)
+        for (indx = 0; indx < ctx.ndims; indx++)
             ctx.p_min_idx[indx] = 0;
         init_acc_pos(&ctx, total_size);
 
@@ -867,13 +865,12 @@ h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
         if (jndx == npoints - 1)
             region_flags |= END_OF_DATA;
 
-        for (indx = 0; indx < (size_t)ctx.ndims; indx++)
+        for (indx = 0; indx < ctx.ndims; indx++)
             ctx.p_max_idx[indx] = cur_ctx->p_max_idx[indx];
 
         ctx.sm_pos = jndx * ndims;
-        if (ctx.ndims > 0) {
-            ctx.size_last_dim = (int) (ctx.p_max_idx[ctx.ndims - 1]);
-        }
+        if (ctx.ndims > 0)
+            ctx.size_last_dim = ctx.p_max_idx[ctx.ndims - 1];
         else
             ctx.size_last_dim = 0;
 
@@ -939,11 +936,13 @@ h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
         hsize_t elmt_counter) {
     HERR_INIT(hbool_t, TRUE)
     hbool_t  dimension_break = TRUE;
-    hssize_t npoints;
+    hssize_t snpoints;
+    hsize_t  npoints;
     hsize_t  alloc_size;
     hsize_t *ptdata;
-    int      ndims;
-    hssize_t indx;
+    int      sndims;
+    unsigned ndims;
+    hsize_t  indx;
     hid_t    dtype = -1;
     hid_t    type_id = -1;
 
@@ -951,12 +950,14 @@ h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
     HDassert(ctx);
     HDassert(buffer);
 
-    if((npoints = H5Sget_select_elem_npoints(region_space)) <= 0)
+    if((snpoints = H5Sget_select_elem_npoints(region_space)) <= 0)
         H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_select_elem_npoints failed");
+    npoints = (hsize_t)snpoints;
 
     /* Allocate space for the dimension array */
-    if((ndims = H5Sget_simple_extent_ndims(region_space)) < 0)
+    if((sndims = H5Sget_simple_extent_ndims(region_space)) < 0)
         H5E_THROW(dimension_break, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+    ndims = (unsigned)sndims;
 
     /* Render the region { element begin */
     h5tools_str_reset(buffer);
@@ -977,12 +978,11 @@ h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
     if(NULL == (ptdata = (hsize_t *)HDmalloc((size_t) alloc_size)))
         HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "Could not allocate buffer for ptdata");
 
-    H5_CHECK_OVERFLOW(npoints, hssize_t, hsize_t);
-    if(H5Sget_select_elem_pointlist(region_space, (hsize_t) 0, (hsize_t) npoints, ptdata) < 0)
+    if(H5Sget_select_elem_pointlist(region_space, (hsize_t) 0, npoints, ptdata) < 0)
         HGOTO_ERROR(dimension_break, H5E_tools_min_id_g, "H5Sget_select_elem_pointlist failed");
 
     for (indx = 0; indx < npoints; indx++) {
-        int loop_indx;
+        unsigned loop_indx;
 
         h5tools_str_append(buffer, info->dset_ptformat_pre,
                             indx ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long) indx);
@@ -1350,7 +1350,7 @@ h5tools_display_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools
         }
 
     /* initialize temporary start, count and maximum start */
-    for (i = 0; i < (size_t) ctx->ndims; i++) {
+    for (i = 0; i < ctx->ndims; i++) {
         temp_start[i] = sset->start.data[i];
         temp_count[i] = sset->count.data[i];
         temp_block[i] = sset->block.data[i];
@@ -1392,12 +1392,11 @@ h5tools_display_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools
 
         if (ctx->ndims > 2) {
             /* dimension for start */
-            current_outer_dim = (ctx->ndims - 2) - 1;
+            current_outer_dim = (int)(ctx->ndims - 2) - 1;
 
             /* set start to original from current_outer_dim up */
-            for (i = current_outer_dim + 1; i < ctx->ndims; i++) {
+            for (i = (size_t)(current_outer_dim + 1); i < ctx->ndims; i++)
                 temp_start[i] = sset->start.data[i];
-            }
 
             /* increment start dimension */
             do {
@@ -1520,6 +1519,7 @@ h5tools_dump_simple_dset(FILE *stream, const h5tool_format_t *info, h5tools_cont
     hid_t               f_space = -1;                  /* file data space */
     hsize_t             elmtno;                   /* counter  */
     size_t              i;                        /* counter  */
+    int                 sndims;                   /* rank of dataspace */
     int                 carry;                    /* counter carry value */
     hsize_t             zero[8];                  /* vector of zeros */
     unsigned int        flags;                    /* buffer extent flags */
@@ -1549,11 +1549,13 @@ h5tools_dump_simple_dset(FILE *stream, const h5tool_format_t *info, h5tools_cont
     if (f_space == FAIL)
         H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
 
-    ctx->ndims = H5Sget_simple_extent_ndims(f_space);
+    sndims = H5Sget_simple_extent_ndims(f_space);
+    if(sndims < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_simple_extent_ndims failed");
+    ctx->ndims = (unsigned)sndims;
 
-    if ((size_t)ctx->ndims > NELMTS(sm_size)) {
+    if ((size_t)ctx->ndims > NELMTS(sm_size))
         H5E_THROW(FAIL, H5E_tools_min_id_g, "ctx->ndims > NELMTS(sm_size) failed");
-    }
 
     /* Assume entire data space to be printed */
     if (ctx->ndims > 0)
@@ -1695,10 +1697,14 @@ h5tools_dump_simple_mem(FILE *stream, const h5tool_format_t *info, h5tools_conte
                         hid_t type, hid_t space, void *mem)
 {
     HERR_INIT(herr_t, SUCCEED)
+    int            sndims; /* rank of dataspace */
     unsigned       i;      /*counters  */
     hsize_t        nelmts; /*total selected elmts */
 
-    ctx->ndims = H5Sget_simple_extent_ndims(space);
+    sndims = H5Sget_simple_extent_ndims(space);
+    if(sndims < 0)
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_simple_extent_ndims failed");
+    ctx->ndims = (unsigned)sndims;
 
     if ((size_t) ctx->ndims > NELMTS(ctx->p_min_idx))
         H5E_THROW(FAIL, H5E_tools_min_id_g, "ctx->ndims > NELMTS(ctx->p_min_idx) failed");
@@ -1716,7 +1722,7 @@ h5tools_dump_simple_mem(FILE *stream, const h5tool_format_t *info, h5tools_conte
         H5_LEAVE(SUCCEED); /* nothing to print */
     if (ctx->ndims > 0) {
         HDassert(ctx->p_max_idx[ctx->ndims - 1] == (hsize_t) ((int) ctx->p_max_idx[ctx->ndims - 1]));
-        ctx->size_last_dim = (int) (ctx->p_max_idx[ctx->ndims - 1]);
+        ctx->size_last_dim = ctx->p_max_idx[ctx->ndims - 1];
     } /* end if */
     else
         ctx->size_last_dim = 0;
@@ -2603,7 +2609,6 @@ h5tools_print_enum(FILE *stream, h5tools_str_t *buffer, const h5tool_format_t *i
     unsigned       i;
     unsigned       nmembs = 0;   /*number of members              */
     int            snmembs;
-    int            nchars;       /*number of output characters    */
     hid_t          super = -1;   /*enum base integer type         */
     hid_t          native = -1;  /*native integer datatype        */
     H5T_sign_t     sign_type;    /*sign of value type             */
@@ -2670,12 +2675,14 @@ h5tools_print_enum(FILE *stream, h5tools_str_t *buffer, const h5tool_format_t *i
 
     /* Print members */
     for (i = 0; i < nmembs; i++) {
+        int nchars;       /*number of output characters    */
+
         ctx->need_prefix = TRUE;
         h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
 
         h5tools_str_reset(buffer);
         h5tools_str_append(buffer, "\"%s\"", name[i]);
-        nchars = HDstrlen(name[i]);
+        nchars = (int)HDstrlen(name[i]);
         h5tools_str_append(buffer, "%*s ", MAX(0, 16 - nchars), "");
 
         if (native < 0) {
@@ -2927,6 +2934,8 @@ h5tools_print_virtual_selection(hid_t vspace,
             h5tools_str_reset(buffer);
             h5tools_str_append(buffer, "%s", VDS_ALL);
             break;
+        case H5S_SEL_ERROR:
+        case H5S_SEL_N:
         default:
             h5tools_str_append(buffer, "Unknown Selection");
     }
@@ -3636,7 +3645,7 @@ h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
     if (cmt_bufsize > 0) {
         comment = (char *)HDmalloc((size_t)(cmt_bufsize+1)); /* new_size including null terminator */
         if(comment) {
-            cmt_bufsize = H5Oget_comment(obj_id, comment, cmt_bufsize);
+            cmt_bufsize = H5Oget_comment(obj_id, comment, (size_t)cmt_bufsize);
             if(cmt_bufsize > 0) {
                 comment[cmt_bufsize] = '\0'; /* necessary because null char is not returned */
 
@@ -3775,49 +3784,39 @@ h5tools_print_dims(h5tools_str_t *buffer, hsize_t *s, int dims)
 void
 h5tools_print_packed_bits(h5tools_str_t *buffer, hid_t type)
 {
-    int     packed_bits_size = 0;
-
+    unsigned 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) {
+
+    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) {
+        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) {
+        else if(H5Tequal(n_type, H5T_NATIVE_SHORT) == TRUE)
             packed_bits_size = 8 * sizeof(short);
-        }
-        else if(H5Tequal(n_type, H5T_NATIVE_USHORT) == TRUE) {
+        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) {
+        else if(H5Tequal(n_type, H5T_NATIVE_INT) == TRUE)
             packed_bits_size = 8 * sizeof(int);
-        }
-        else if(H5Tequal(n_type, H5T_NATIVE_UINT) == TRUE) {
+        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) {
+        else if(H5Tequal(n_type, H5T_NATIVE_LONG) == TRUE)
             packed_bits_size = 8 * sizeof(long);
-        }
-        else if(H5Tequal(n_type, H5T_NATIVE_ULONG) == TRUE) {
+        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) {
+        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) {
+        else if(H5Tequal(n_type, H5T_NATIVE_ULLONG) == TRUE)
             packed_bits_size = 8 * sizeof(unsigned long long);
-        }
         else
             error_msg("Packed Bit not valid for this datatype");
     }
 
-    if ((packed_bits_size>0) && (packed_data_offset + packed_data_length) > packed_bits_size) {
-        error_msg("Packed Bit offset+length value(%d) too large. Max is %d\n", packed_data_offset+packed_data_length, packed_bits_size);
+    if((packed_bits_size > 0) && (packed_data_offset + packed_data_length) > packed_bits_size) {
+        error_msg("Packed Bit offset+length value(%u) too large. Max is %d\n", packed_data_offset + packed_data_length, packed_bits_size);
         packed_data_mask = 0;
     };
-    h5tools_str_append(buffer, "%s %s=%d %s=%d", PACKED_BITS, PACKED_OFFSET, packed_data_offset, PACKED_LENGTH, packed_data_length);
+    h5tools_str_append(buffer, "%s %s=%u %s=%u", PACKED_BITS, PACKED_OFFSET, packed_data_offset, PACKED_LENGTH, packed_data_length);
 }
 
 /*-------------------------------------------------------------------------
diff --git a/tools/lib/h5tools_dump.h b/tools/lib/h5tools_dump.h
index b05f226..dc79f43 100644
--- a/tools/lib/h5tools_dump.h
+++ b/tools/lib/h5tools_dump.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/tools/lib/h5tools_error.h b/tools/lib/h5tools_error.h
index 749157e..136c5ed 100644
--- a/tools/lib/h5tools_error.h
+++ b/tools/lib/h5tools_error.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/tools/lib/h5tools_filters.c b/tools/lib/h5tools_filters.c
index ccdba26..6ee58c5 100644
--- a/tools/lib/h5tools_filters.c
+++ b/tools/lib/h5tools_filters.c
@@ -5,15 +5,13 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
 
 /*-------------------------------------------------------------------------
@@ -147,58 +145,65 @@ int h5tools_canreadf(const char* name, /* object name, serves also as boolean pr
  *
  *-------------------------------------------------------------------------
  */
-int h5tools_can_encode(H5Z_filter_t filtn) {
-	switch (filtn) {
+H5_ATTR_CONST int
+h5tools_can_encode(H5Z_filter_t filtn) {
+    switch (filtn) {
 	/* user defined filter     */
 	default:
-		return 0;
+            return 0;
 
 	case H5Z_FILTER_DEFLATE:
 #ifndef H5_HAVE_FILTER_DEFLATE
-		return 0;
+            return 0;
 #endif
-		break;
+            break;
+
 	case H5Z_FILTER_SZIP:
 #ifndef H5_HAVE_FILTER_SZIP
-		return 0;
+            return 0;
 #else
 	{
-		unsigned int filter_config_flags;
+            unsigned int filter_config_flags;
 
-		if (H5Zget_filter_info(filtn, &filter_config_flags) < 0)
-			return -1;
-		if ((filter_config_flags
-				& (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == 0) {
-			/* filter present but neither encode nor decode is supported (???) */
-			return -1;
-		} 
-		else if ((filter_config_flags
-				& (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_DECODE_ENABLED) {
-			/* decoder only: read but not write */
-			return 0;
-		} 
-		else if ((filter_config_flags
-				& (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_ENCODE_ENABLED) {
-			/* encoder only: write but not read (???) */
-			return -1;
-		} 
-		else if ((filter_config_flags
-				& (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED))
-				== (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) {
-			return 1;
-		}
+            if (H5Zget_filter_info(filtn, &filter_config_flags) < 0)
+                return -1;
+            if ((filter_config_flags
+                    & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == 0) {
+                /* filter present but neither encode nor decode is supported (???) */
+                return -1;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_DECODE_ENABLED) {
+                /* decoder only: read but not write */
+                return 0;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == H5Z_FILTER_CONFIG_ENCODE_ENABLED) {
+                /* encoder only: write but not read (???) */
+                return -1;
+            } 
+            else if ((filter_config_flags
+                        & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED))
+                        == (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) {
+                return 1;
+            }
 	}
 #endif
-		break;
+            break;
+
 	case H5Z_FILTER_SHUFFLE:
-		break;
+            break;
+
 	case H5Z_FILTER_FLETCHER32:
-		break;
+            break;
+
 	case H5Z_FILTER_NBIT:
-		break;
+            break;
+
 	case H5Z_FILTER_SCALEOFFSET:
-		break;
-	}/*switch*/
+            break;
+    }/*switch*/
 
-	return 1;
+    return 1;
 }
+
diff --git a/tools/lib/h5tools_ref.c b/tools/lib/h5tools_ref.c
index 60666f1..85850e3 100644
--- a/tools/lib/h5tools_ref.c
+++ b/tools/lib/h5tools_ref.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include <stdio.h>
@@ -39,7 +37,7 @@
 
 typedef struct {
     haddr_t objno;      /* Object ID (i.e. address) */
-    const char *path;   /* Object path */
+    char *path;         /* Object path */
 } ref_path_node_t;
 
 static H5SL_t *ref_path_table = NULL;   /* the "table" (implemented with a skip list) */
diff --git a/tools/lib/h5tools_ref.h b/tools/lib/h5tools_ref.h
index 7ddb91a..b7bd9a3 100644
--- a/tools/lib/h5tools_ref.h
+++ b/tools/lib/h5tools_ref.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef H5TOOLS_REF_H__
diff --git a/tools/lib/h5tools_str.c b/tools/lib/h5tools_str.c
index 5477f91..88f6cc5 100644
--- a/tools/lib/h5tools_str.c
+++ b/tools/lib/h5tools_str.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -100,7 +98,7 @@ h5tools_str_close(h5tools_str_t *str)
  *
  *-------------------------------------------------------------------------
  */
-size_t
+H5_ATTR_PURE size_t
 h5tools_str_len(h5tools_str_t *str)
 {
     return str->len;
@@ -135,14 +133,12 @@ h5tools_str_append(h5tools_str_t *str/*in,out*/, const char *fmt, ...)
     va_list ap;
 
     /* Make sure we have some memory into which to print */
-    if (!str->s || str->nalloc <= 0) {
+    if (!str->s || str->nalloc <= 0)
         h5tools_str_reset(str);
-    }
 
-    if (HDstrlen(fmt) == 0) {
+    if (HDstrlen(fmt) == 0)
         /* nothing to print */
         return str->s;
-    }
 
     /* Format the arguments and append to the value already in `str' */
     while (1) {
@@ -165,19 +161,18 @@ h5tools_str_append(h5tools_str_t *str/*in,out*/, const char *fmt, ...)
          * to lack of buffer size, so try one more time after realloc more
          * buffer size before return NULL.
          */
-        if (nchars < 0) {
+        if (nchars < 0)
             /* failure, such as bad format */
             return NULL;
-        }
 
-        if (nchars < 0 || (size_t) nchars >= avail || (0 == nchars && (HDstrcmp(fmt, "%s")))) {
+        if ((size_t) nchars >= avail || (0 == nchars && (HDstrcmp(fmt, "%s")))) {
             /* Truncation return value as documented by C99, or zero return value with either of the
              * following conditions, each of which indicates that the proper C99 return value probably
              *  should have been positive when the format string is
              *  something other than "%s"
              * Alocate at least twice as much space and try again.
              */
-            size_t newsize = MAX(str->len + nchars + 1, 2 * str->nalloc);
+            size_t newsize = MAX(str->len + (size_t)nchars + 1, 2 * str->nalloc);
             HDassert(newsize > str->nalloc); /*overflow*/
             str->s = (char*)HDrealloc(str->s, newsize);
             HDassert(str->s);
@@ -185,7 +180,7 @@ h5tools_str_append(h5tools_str_t *str/*in,out*/, const char *fmt, ...)
         }
         else {
             /* Success */
-            str->len += nchars;
+            str->len += (size_t)nchars;
             break;
         }
     }
@@ -507,41 +502,42 @@ 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(rspace);
+    hssize_t   snblocks;
 
     /*
      * This function fails if the rspace does not have blocks.
      */
     H5E_BEGIN_TRY {
-        nblocks = H5Sget_select_hyper_nblocks(rspace);
+        snblocks = H5Sget_select_hyper_nblocks(rspace);
     } H5E_END_TRY;
 
     /* Print block information */
-    if (nblocks > 0) {
-        int i;
-
+    if (snblocks > 0) {
+        hsize_t    nblocks;
+        hsize_t   *ptdata;
+        hsize_t    alloc_size;
+        unsigned   ndims = (unsigned)H5Sget_simple_extent_ndims(rspace);
+        hsize_t u;
+
+        nblocks = (hsize_t)snblocks;
         alloc_size = nblocks * ndims * 2 * sizeof(ptdata[0]);
         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(rspace, (hsize_t)0, (hsize_t)nblocks, ptdata);
+        H5Sget_select_hyper_blocklist(rspace, (hsize_t)0, nblocks, ptdata);
 
-        for (i = 0; i < nblocks; i++) {
-            int j;
+        for (u = 0; u < nblocks; u++) {
+            unsigned v;
 
-            h5tools_str_append(str, info->dset_blockformat_pre, i ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long)i);
+            h5tools_str_append(str, info->dset_blockformat_pre, u ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long)u);
 
             /* Start coordinates and opposite corner */
-            for (j = 0; j < ndims; j++)
-                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(",
-                                    ptdata[i * 2 * ndims + j]);
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : "(",
+                                    ptdata[u * 2 * ndims + v]);
 
-            for (j = 0; j < ndims; j++)
-                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : ")-(",
-                                    ptdata[i * 2 * ndims + j + ndims]);
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : ")-(",
+                                    ptdata[u * 2 * ndims + v + ndims]);
 
             h5tools_str_append(str, ")");
         }
@@ -566,37 +562,38 @@ void
 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(rspace);
+    hssize_t   snpoints;
 
     /*
      * This function fails if the rspace does not have points.
      */
     H5E_BEGIN_TRY {
-        npoints = H5Sget_select_elem_npoints(rspace);
+        snpoints = H5Sget_select_elem_npoints(rspace);
     } H5E_END_TRY;
 
     /* Print point information */
-    if (npoints > 0) {
-        int i;
-
+    if (snpoints > 0) {
+        hsize_t   npoints;
+        hsize_t    alloc_size;
+        hsize_t   *ptdata;
+        unsigned ndims = (unsigned)H5Sget_simple_extent_ndims(rspace);
+        hsize_t u;
+
+        npoints = (hsize_t)snpoints;
         alloc_size = npoints * ndims * sizeof(ptdata[0]);
         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(rspace, (hsize_t)0, (hsize_t)npoints, ptdata);
+        H5Sget_select_elem_pointlist(rspace, (hsize_t)0, npoints, ptdata);
 
-        for (i = 0; i < npoints; i++) {
-            int j;
+        for (u = 0; u < npoints; u++) {
+            unsigned v;
 
-            h5tools_str_append(str, info->dset_ptformat_pre, i ? "," OPTIONAL_LINE_BREAK " " : "",
-                               (unsigned long)i);
+            h5tools_str_append(str, info->dset_ptformat_pre, u ? "," OPTIONAL_LINE_BREAK " " : "",
+                               (unsigned long)u);
 
-            for (j = 0; j < ndims; j++)
-                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(",
-                                  (ptdata[i * ndims + j]));
+            for (v = 0; v < ndims; v++)
+                h5tools_str_append(str, "%s" HSIZE_T_FORMAT, v ? "," : "(",
+                                  (ptdata[u * ndims + v]));
 
             h5tools_str_append(str, ")");
         }
@@ -685,13 +682,12 @@ void
 h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info,
                       h5tools_context_t *ctx)
 {
-    int i, indentlevel = 0;
+    unsigned u, indentlevel = 0;
 
     /* Write new prefix */
-    if (ctx->indent_level >= 0) {
+    if (ctx->indent_level > 0)
         indentlevel = ctx->indent_level;
-    }
-    else {
+    else
         /*
          * This is because sometimes we don't print out all the header
          * info for the data (like the tattr-2.ddl example). If that happens
@@ -699,11 +695,9 @@ h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info,
          * just print out the default indent levels.
          */
         indentlevel = ctx->default_indent_level;
-    }
 
-    for (i = 0; i < indentlevel; i++) {
+    for (u = 0; u < indentlevel; u++)
         h5tools_str_append(str, "%s", OPT(info->line_indent, ""));
-    }
 }
 
 /*-------------------------------------------------------------------------
@@ -753,6 +747,7 @@ h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info,
  *  32-bit or more. For every kind of native integers, I changed the code
  *  to make it zero if PACKED_DATA_OFFSET is greater than or equal to the
  *  size of integer.
+ *
  *-------------------------------------------------------------------------
  */
 char *
@@ -765,22 +760,10 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
     unsigned char *ucp_vp = (unsigned char *)vp;
     char          *cp_vp = (char *)vp;
     hid_t          memb, obj;
-    unsigned       nmembs;
     static char    fmt_llong[8], fmt_ullong[8];
     H5T_str_t      pad;
     H5T_class_t    type_class;
 
-    /*
-     * some tempvars to store the value before we append it to the string to
-     * get rid of the memory alignment problem
-     */
-    unsigned long long tempullong;
-    long long          templlong;
-    unsigned long      tempulong;
-    long               templong;
-    unsigned int       tempuint;
-    int                tempint;
-
     /* Build default formats for long long types */
     if (!fmt_llong[0]) {
         HDsnprintf(fmt_llong, sizeof(fmt_llong), "%%%sd", H5_PRINTF_LL_WIDTH);
@@ -831,10 +814,11 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     long double templdouble;
 
                     HDmemcpy(&templdouble, vp, sizeof(long double));
-                    h5tools_str_append(str, "%Lf", templdouble);
+                    h5tools_str_append(str, OPT(info->fmt_double, "%Lf"), templdouble);
 #endif
                 }
                 break;
+
             case H5T_STRING:
                 {
                     unsigned int i;
@@ -855,12 +839,11 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     pad = H5Tget_strpad(type);
 
                     /* Check for NULL pointer for string */
-                    if (s == NULL) {
+                    if (s == NULL)
                         h5tools_str_append(str, "NULL");
-                    }
                     else {
                         for (i = 0; i < size && (s[i] || pad != H5T_STR_NULLTERM); i++) {
-                            int j = 1;
+                            unsigned j = 1;
 
                             /*
                              * Count how many times the next character repeats. If the
@@ -877,7 +860,8 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                              * in it's own quote.
                              */
                             if (info->str_repeat > 0 && j > info->str_repeat) {
-                                if (quote) h5tools_str_append(str, "%c", quote);
+                                if (quote)
+                                    h5tools_str_append(str, "%c", quote);
 
                                 quote = '\'';
                                 h5tools_str_append(str, "%s%c", i ? " " : "", quote);
@@ -900,10 +884,10 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                                 quote = '\0';
                                 i += j - 1;
                             }
-
                         }
 
-                        if (quote) h5tools_str_append(str, "%c", quote);
+                        if (quote)
+                            h5tools_str_append(str, "%c", quote);
 
                         if (i == 0)
                             /*empty string*/
@@ -911,64 +895,64 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     } /* end else */
                 }
                 break;
+
             case H5T_INTEGER:
                 if (sizeof(char) == nsize) {
-                    /* if ((H5Tequal(type, H5T_NATIVE_SCHAR) || H5Tequal(type, H5T_NATIVE_UCHAR))) */
-                    if (info->ascii) {
+                    if (info->ascii)
                         h5tools_print_char(str, info, (char) (*ucp_vp));
-                    }
                     else if(H5T_SGN_NONE == nsign) {
-                        /* if (H5Tequal(type, H5T_NATIVE_UCHAR)) */
                         unsigned char tempuchar;
+
                         HDmemcpy(&tempuchar, ucp_vp, sizeof(unsigned char));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(unsigned char))
                                 tempuchar = 0;
                             else
-                                tempuchar = (tempuchar >> packed_data_offset) & packed_data_mask;
+                                tempuchar = (unsigned char)((unsigned long long)(tempuchar >> packed_data_offset) & packed_data_mask);
                         }
-                        h5tools_str_append(str, OPT(info->fmt_uchar, "%u"), tempuchar);
+                        h5tools_str_append(str, OPT(info->fmt_uchar, "%hhu"), tempuchar);
                     }
                     else {
-                        /* if (H5Tequal(type, H5T_NATIVE_SCHAR)) */
                         signed char tempchar;
+
                         HDmemcpy(&tempchar, cp_vp, sizeof(char));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(char))
                                 tempchar = 0;
                             else
-                                tempchar = (tempchar >> packed_data_offset) & packed_data_mask;
+                                tempchar = (signed char)((unsigned long long)(tempchar >> packed_data_offset) & packed_data_mask);
                         }
                         h5tools_str_append(str, OPT(info->fmt_schar, "%hhd"), tempchar);
                     }
                 } /* end if (sizeof(char) == nsize) */
                 else if (sizeof(int) == nsize) {
                     if(H5T_SGN_NONE == nsign) {
-                        /* if (H5Tequal(type, H5T_NATIVE_UINT)) */
+                        unsigned int       tempuint;
+
                         HDmemcpy(&tempuint, vp, sizeof(unsigned int));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(unsigned int))
                                 tempuint = 0;
                             else
-                                tempuint = (tempuint >> packed_data_offset) & packed_data_mask;
+                                tempuint = (unsigned)((tempuint >> packed_data_offset) & packed_data_mask);
                         }
                         h5tools_str_append(str, OPT(info->fmt_uint, "%u"), tempuint);
                     }
                     else {
-                        /* if (H5Tequal(type, H5T_NATIVE_INT)) */
+                        int                tempint;
+
                         HDmemcpy(&tempint, vp, sizeof(int));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(int))
                                 tempint = 0;
                             else
-                                tempint = (tempint >> packed_data_offset) & packed_data_mask;
+                                tempint = (int)((unsigned long long)(tempint >> packed_data_offset) & packed_data_mask);
                         }
                         h5tools_str_append(str, OPT(info->fmt_int, "%d"), tempint);
                     }
                 } /* end if (sizeof(int) == nsize) */
                 else if (sizeof(short) == nsize) {
                     if(H5T_SGN_NONE == nsign) {
-                        /* if (H5Tequal(type, H5T_NATIVE_USHORT)) */
                         unsigned short tempushort;
 
                         HDmemcpy(&tempushort, vp, sizeof(unsigned short));
@@ -976,12 +960,11 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                             if (packed_data_offset >= 8 * sizeof(unsigned short))
                                 tempushort = 0;
                             else
-                                tempushort = (tempushort >> packed_data_offset) & packed_data_mask;
+                                tempushort = (unsigned short)((unsigned long long)(tempushort >> packed_data_offset) & packed_data_mask);
                         }
-                        h5tools_str_append(str, OPT(info->fmt_ushort, "%u"), tempushort);
+                        h5tools_str_append(str, OPT(info->fmt_ushort, "%hu"), tempushort);
                     }
                     else {
-                        /* if (H5Tequal(type, H5T_NATIVE_SHORT)) */
                         short tempshort;
 
                         HDmemcpy(&tempshort, vp, sizeof(short));
@@ -989,14 +972,15 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                             if (packed_data_offset >= 8 * sizeof(short))
                                 tempshort = 0;
                             else
-                                tempshort = (tempshort >> packed_data_offset) & packed_data_mask;
+                                tempshort = (short)((unsigned long long)(tempshort >> packed_data_offset) & packed_data_mask);
                         }
-                        h5tools_str_append(str, OPT(info->fmt_short, "%d"), tempshort);
+                        h5tools_str_append(str, OPT(info->fmt_short, "%hd"), tempshort);
                     }
                 } /* end if (sizeof(short) == nsize) */
                 else if (sizeof(long) == nsize) {
                     if(H5T_SGN_NONE == nsign) {
-                        /* if (H5Tequal(type, H5T_NATIVE_ULONG)) */
+                        unsigned long      tempulong;
+
                         HDmemcpy(&tempulong, vp, sizeof(unsigned long));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(unsigned long))
@@ -1007,20 +991,23 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                         h5tools_str_append(str, OPT(info->fmt_ulong, "%lu"), tempulong);
                     }
                     else {
-                        /* if (H5Tequal(type, H5T_NATIVE_LONG)) */
+                        long               templong;
+
                         HDmemcpy(&templong, vp, sizeof(long));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(long))
                                 templong = 0;
                             else
-                                templong = (templong >> packed_data_offset) & packed_data_mask;
+                                templong = (long)((unsigned long long)(templong >> packed_data_offset) & packed_data_mask);
                         }
                         h5tools_str_append(str, OPT(info->fmt_long, "%ld"), templong);
                     }
                 } /* end if (sizeof(long) == nsize) */
+#if H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG
                 else if (sizeof(long long) == nsize) {
                     if(H5T_SGN_NONE == nsign) {
-                        /* if (H5Tequal(type, H5T_NATIVE_ULLONG)) */
+                        unsigned long long tempullong;
+
                         HDmemcpy(&tempullong, vp, sizeof(unsigned long long));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(unsigned long long))
@@ -1031,7 +1018,8 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                         h5tools_str_append(str, OPT(info->fmt_ullong, fmt_ullong), tempullong);
                     }
                     else {
-                        /* if (H5Tequal(type, H5T_NATIVE_LLONG)) */
+                        long long          templlong;
+
                         HDmemcpy(&templlong, vp, sizeof(long long));
                         if (packed_bits_num) {
                             if (packed_data_offset >= 8 * sizeof(long long))
@@ -1042,7 +1030,9 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                         h5tools_str_append(str, OPT(info->fmt_llong, fmt_llong), templlong);
                     }
                 } /* end if (sizeof(long long) == nsize) */
+#endif /* H5_SIZEOF_LONG != H5_SIZEOF_LONG_LONG */
                 break;
+
             case H5T_COMPOUND:
                 if(ctx->cmpd_listv) { /* there is <list_of_fields> */
                     int save_indent_level;  	/* The indentation level */
@@ -1095,9 +1085,10 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     ctx->cmpd_listv = info->cmpd_listv;
 
                 } else {
+                    unsigned nmembs;
                     unsigned j;
 
-                    nmembs = H5Tget_nmembers(type);
+                    nmembs = (unsigned)H5Tget_nmembers(type);
                     h5tools_str_append(str, "%s", OPT(info->cmpd_pre, "{"));
 
                     ctx->indent_level++;
@@ -1108,7 +1099,8 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                         else
                             h5tools_str_append(str, "%s", OPT(info->cmpd_end, ""));
 
-                        if (info->arr_linebreak) h5tools_str_indent(str, info, ctx);
+                        if (info->arr_linebreak)
+                            h5tools_str_indent(str, info, ctx);
 
                         /* The name */
                         name = H5Tget_member_name(type, j);
@@ -1130,9 +1122,9 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                         h5tools_str_indent(str, info, ctx);
                     }
                     h5tools_str_append(str, "%s", OPT(info->cmpd_suf, "}"));
-
                 }
                 break;
+
             case H5T_ENUM:
                 {
                     char enum_name[1024];
@@ -1152,10 +1144,10 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     }
                 }
                 break;
+
             case H5T_REFERENCE:
-                if (h5tools_str_is_zero(vp, nsize)) {
+                if (h5tools_str_is_zero(vp, nsize))
                     h5tools_str_append(str, "NULL");
-                }
                 else {
                     if (nsize == H5R_DSET_REG_REF_BUF_SIZE) {
                         /* if (H5Tequal(type, H5T_STD_REF_DSETREG)) */
@@ -1211,6 +1203,7 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     } /* end else if (H5Tequal(type, H5T_STD_REF_OBJ)) */
                 }
                 break;
+
             case H5T_ARRAY:
                 {
                     int k, ndims;
@@ -1237,7 +1230,8 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     ctx->indent_level++;
 
                     for (i = 0; i < nelmts; i++) {
-                        if (i) h5tools_str_append(str, "%s", OPT(info->arr_sep, "," OPTIONAL_LINE_BREAK));
+                        if (i)
+                            h5tools_str_append(str, "%s", OPT(info->arr_sep, "," OPTIONAL_LINE_BREAK));
 
                         if (info->arr_linebreak && i && i % dims[ndims - 1] == 0) {
                             h5tools_str_append(str, "%s", "\n");
@@ -1272,6 +1266,7 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     H5Tclose(memb);
                 }
                 break;
+
             case H5T_VLEN:
                 {
                     unsigned int i;
@@ -1521,31 +1516,33 @@ h5tools_str_is_zero(const void *_mem, size_t size)
 char *
 h5tools_str_replace ( const char *string, const char *substr, const char *replacement )
 {
-	char *tok = NULL;
-	char *newstr = NULL;
-	char *oldstr = NULL;
-	char *head = NULL;
-     
-	if ( substr == NULL || replacement == NULL ) 
-	    return HDstrdup (string);
-	newstr = HDstrdup (string);
-	head = newstr;
-	while ( (tok = HDstrstr ( head, substr ))){
-		oldstr = newstr;
-		newstr = (char *)HDmalloc( HDstrlen( oldstr ) - HDstrlen( substr ) + HDstrlen( replacement ) + 1 );
-
-        if ( newstr == NULL ){
-	    HDfree (oldstr);
+    char *tok = NULL;
+    char *newstr = NULL;
+    char *head = NULL;
+ 
+    if(substr == NULL || replacement == NULL) 
+        return HDstrdup(string);
+    newstr = HDstrdup(string);
+    head = newstr;
+    while((tok = HDstrstr(head, substr))) {
+        char *oldstr;
+
+        oldstr = newstr;
+        newstr = (char *)HDmalloc(HDstrlen(oldstr) - HDstrlen(substr) + HDstrlen(replacement) + 1);
+
+        if(newstr == NULL) {
+	    HDfree(oldstr);
 	    return NULL;
         }
-        HDmemcpy ( newstr, oldstr, tok - oldstr );
-        HDmemcpy ( newstr + (tok - oldstr), replacement, HDstrlen ( replacement ) );
-        HDmemcpy ( newstr + (tok - oldstr) + HDstrlen( replacement ), tok + HDstrlen ( substr ), HDstrlen ( oldstr ) - HDstrlen ( substr ) - ( tok - oldstr ) );
-        HDmemset ( newstr + HDstrlen ( oldstr ) - HDstrlen ( substr ) + HDstrlen ( replacement ) , 0, 1 );
+        HDmemcpy(newstr, oldstr, (size_t)(tok - oldstr));
+        HDmemcpy(newstr + (tok - oldstr), replacement, HDstrlen(replacement));
+        HDmemcpy(newstr + (tok - oldstr) + HDstrlen(replacement), tok + HDstrlen(substr), HDstrlen(oldstr) - HDstrlen(substr) - (size_t)(tok - oldstr));
+        HDmemset(newstr + HDstrlen (oldstr) - HDstrlen(substr) + HDstrlen(replacement) , 0, 1);
         /* move back head right after the last replacement */
-        head = newstr + (tok - oldstr) + HDstrlen( replacement );
-        HDfree (oldstr);
+        head = newstr + (tok - oldstr) + HDstrlen(replacement);
+        HDfree(oldstr);
     }
 
     return newstr;
 }
+
diff --git a/tools/lib/h5tools_str.h b/tools/lib/h5tools_str.h
index 6173b89..a5045ac 100644
--- a/tools/lib/h5tools_str.h
+++ b/tools/lib/h5tools_str.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
diff --git a/tools/lib/h5tools_type.c b/tools/lib/h5tools_type.c
index 8a56d29..dcc994e 100644
--- a/tools/lib/h5tools_type.c
+++ b/tools/lib/h5tools_type.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #include "H5private.h"
diff --git a/tools/lib/h5tools_utils.c b/tools/lib/h5tools_utils.c
index b87abf6..c361e25 100644
--- a/tools/lib/h5tools_utils.c
+++ b/tools/lib/h5tools_utils.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -34,7 +32,7 @@
 #include "h5trav.h"
 
 /* global variables */
-int   h5tools_nCols = 80;
+unsigned h5tools_nCols = 80;
 /* ``get_option'' variables */
 int         opt_err = 1;    /*get_option prints errors if this is on */
 int         opt_ind = 1;    /*token pointer                          */
@@ -57,7 +55,7 @@ hsize_t H5TOOLS_BUFSIZE = ( 32 * 1024 * 1024);  /* 32 MB */
 /* ``parallel_print'' variables */
 unsigned char  g_Parallel = 0;  /*0 for serial, 1 for parallel */
 char     outBuff[OUTBUFF_SIZE];
-int      outBuffOffset;
+unsigned outBuffOffset;
 FILE*    overflow_file = NULL;
 
 /* local functions */
@@ -89,11 +87,11 @@ void parallel_print(const char* format, ...)
         HDvprintf(format, ap);
     else {
         if(overflow_file == NULL) /*no overflow has occurred yet */ {
-            bytes_written = HDvsnprintf(outBuff+outBuffOffset, OUTBUFF_SIZE-outBuffOffset, format, ap);
+            bytes_written = HDvsnprintf(outBuff + outBuffOffset, OUTBUFF_SIZE - outBuffOffset, format, ap);
             HDva_end(ap);
             HDva_start(ap, format);
 
-            if((bytes_written < 0) || (bytes_written >= (OUTBUFF_SIZE - outBuffOffset))) {
+            if((bytes_written < 0) || ((unsigned)bytes_written >= (OUTBUFF_SIZE - outBuffOffset))) {
                 /* Terminate the outbuff at the end of the previous output */
                 outBuff[outBuffOffset] = '\0';
 
@@ -104,7 +102,7 @@ void parallel_print(const char* format, ...)
                     bytes_written = HDvfprintf(overflow_file, format, ap);
             }
             else
-                outBuffOffset += bytes_written;
+                outBuffOffset += (unsigned)bytes_written;
         }
         else
             bytes_written = HDvfprintf(overflow_file, format, ap);
@@ -376,7 +374,7 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
  *-------------------------------------------------------------------------
  */
 void
-indentation(int x)
+indentation(unsigned x)
 {
     if (x < h5tools_nCols) {
         while (x-- > 0)
@@ -408,7 +406,7 @@ print_version(const char *progname)
 {
     PRINTSTREAM(rawoutstream, "%s: Version %u.%u.%u%s%s\n",
            progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
-           ((char *)H5_VERS_SUBRELEASE)[0] ? "-" : "", H5_VERS_SUBRELEASE);
+           ((const char *)H5_VERS_SUBRELEASE)[0] ? "-" : "", H5_VERS_SUBRELEASE);
 }
 
 

@@ -532,7 +530,7 @@ dump_tables(find_objs_t *info)
  *
  *-------------------------------------------------------------------------
  */
-obj_t *
+H5_ATTR_PURE obj_t *
 search_obj(table_t *table, haddr_t objno)
 {
     unsigned u;
@@ -680,7 +678,7 @@ init_objs(hid_t fid, find_objs_t *info, table_t **group_table,
 static void
 add_obj(table_t *table, haddr_t objno, const char *objname, hbool_t record)
 {
-    unsigned u;
+    size_t u;
 
     /* See if we need to make table larger */
     if(table->nobjs == table->size) {
@@ -883,12 +881,14 @@ void h5tools_setstatus(int D_status)
     h5tools_d_status = D_status;
 }
 
-const char*h5tools_getprogname(void)
+H5_ATTR_PURE const char *
+h5tools_getprogname(void)
 {
    return h5tools_progname;
 }
 
-int h5tools_getstatus(void)
+H5_ATTR_PURE int
+h5tools_getstatus(void)
 {
    return h5tools_d_status;
 }
@@ -912,7 +912,6 @@ int h5tools_getenv_update_hyperslab_bufsize(void)
         hyperslab_bufsize_mb = HDstrtol(env_str, (char**)NULL, 10);
         if (errno != 0 || hyperslab_bufsize_mb <= 0)
         {
-
             /* TODO: later when pubilshed
             HDfprintf(rawerrorstream,"Error: Invalid environment variable \"H5TOOLS_BUFSIZE\" : %s\n", env_str);
             */
@@ -922,13 +921,14 @@ int h5tools_getenv_update_hyperslab_bufsize(void)
 
 
         /* convert MB to byte */
-        H5TOOLS_BUFSIZE = hyperslab_bufsize_mb * 1024 * 1024;
+        H5TOOLS_BUFSIZE = (hsize_t)hyperslab_bufsize_mb * 1024 * 1024;
 
         H5TOOLS_MALLOCSIZE = MAX(H5TOOLS_BUFSIZE, H5TOOLS_MALLOCSIZE);
     }
 
-
     return (1);
+
 error:
     return (-1);
 }
+
diff --git a/tools/lib/h5tools_utils.h b/tools/lib/h5tools_utils.h
index 3285278..a31ba3a 100644
--- a/tools/lib/h5tools_utils.h
+++ b/tools/lib/h5tools_utils.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
@@ -35,7 +33,7 @@ extern "C" {
 H5TOOLS_DLLVAR int  g_nTasks;
 H5TOOLS_DLLVAR unsigned char g_Parallel;
 H5TOOLS_DLLVAR char    outBuff[];
-H5TOOLS_DLLVAR int  outBuffOffset;
+H5TOOLS_DLLVAR unsigned outBuffOffset;
 H5TOOLS_DLLVAR FILE *   overflow_file;
 
 /* Maximum size used in a call to malloc for a dataset */
@@ -119,10 +117,10 @@ typedef struct find_objs_t {
     table_t *dset_table;
 } find_objs_t;
 
-H5TOOLS_DLLVAR int     h5tools_nCols;               /*max number of columns for outputting  */
+H5TOOLS_DLLVAR unsigned h5tools_nCols;               /*max number of columns for outputting  */
 
 /* Definitions of useful routines */
-H5TOOLS_DLL void     indentation(int);
+H5TOOLS_DLL void     indentation(unsigned);
 H5TOOLS_DLL void     print_version(const char *progname);
 H5TOOLS_DLL void     parallel_print(const char* format, ... );
 H5TOOLS_DLL void     error_msg(const char *fmt, ...);
diff --git a/tools/lib/h5trav.c b/tools/lib/h5trav.c
index 86e60c3..3d55f2d 100644
--- a/tools/lib/h5trav.c
+++ b/tools/lib/h5trav.c
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 
@@ -161,7 +159,7 @@ trav_addr_add(trav_addr_t *visited, haddr_t addr, const char *path)
  *
  *-------------------------------------------------------------------------
  */
-static const char *
+H5_ATTR_PURE static const char *
 trav_addr_visited(trav_addr_t *visited, haddr_t addr)
 {
     size_t u;           /* Local index variable */
@@ -490,7 +488,7 @@ h5trav_getinfo(hid_t file_id, trav_info_t *info)
  *-------------------------------------------------------------------------
  */
 
-ssize_t
+H5_ATTR_PURE ssize_t
 h5trav_getindex(const trav_info_t *info, const char *obj)
 {
     size_t u;           /* Local index variable */
@@ -681,7 +679,7 @@ h5trav_gettable(hid_t fid, trav_table_t *table)
  *-------------------------------------------------------------------------
  */
 
-int
+H5_ATTR_PURE int
 h5trav_getindext(const char *name, const trav_table_t *table)
 {
     unsigned int i;
@@ -1235,7 +1233,7 @@ symlink_visit_add(symlink_trav_t *visited, H5L_type_t type, const char *file, co
  *
  *-------------------------------------------------------------------------
  */
-hbool_t
+H5_ATTR_PURE hbool_t
 symlink_is_visited(symlink_trav_t *visited, H5L_type_t type, const char *file, const char *path)
 {
     size_t u;  /* Local index variable */
diff --git a/tools/lib/h5trav.h b/tools/lib/h5trav.h
index 352a9e5..c2ad9b7 100644
--- a/tools/lib/h5trav.h
+++ b/tools/lib/h5trav.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef H5TRAV_H__
diff --git a/tools/lib/io_timer.c b/tools/lib/io_timer.c
index b85133d..e3318e9 100644
--- a/tools/lib/io_timer.c
+++ b/tools/lib/io_timer.c
@@ -4,12 +4,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 /* changes:
  * rename pio_timer.c as io_timer.c;
@@ -55,9 +53,9 @@ io_time_t   *timer_g;            /* timer: global for stub functions     */
 static double sub_time(struct timeval* a, struct timeval* b)
 {
     return (((double)a->tv_sec +
-     ((double)a->tv_usec) / MICROSECOND) -
+     ((double)a->tv_usec) / (double)MICROSECOND) -
   ((double)b->tv_sec +
-   ((double)b->tv_usec) / MICROSECOND));
+   ((double)b->tv_usec) / (double)MICROSECOND));
 }
 
 
@@ -222,7 +220,7 @@ set_time(io_time_t *pt, timer_type t, int start_stop)
  * Programmer:  Bill Wendling, 01. October 2001
  * Modifications:
  */
-double
+H5_ATTR_PURE double
 get_time(io_time_t *pt, timer_type t)
 {
     return pt->total_time[t];
diff --git a/tools/lib/io_timer.h b/tools/lib/io_timer.h
index 4ce0733..48b6c87 100644
--- a/tools/lib/io_timer.h
+++ b/tools/lib/io_timer.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef IO_TIMER__
diff --git a/tools/lib/ph5diff.h b/tools/lib/ph5diff.h
index 2a75228..9628d45 100644
--- a/tools/lib/ph5diff.h
+++ b/tools/lib/ph5diff.h
@@ -5,12 +5,10 @@
  *                                                                           *
  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
  * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 #ifndef _PH5DIFF_H__
diff --git a/tools/misc/CMakeLists.txt b/tools/misc/CMakeLists.txt
deleted file mode 100644
index 6397899..0000000
--- a/tools/misc/CMakeLists.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_TOOLS_MISC)
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
-
-# --------------------------------------------------------------------
-# Add the misc executables
-# --------------------------------------------------------------------
-#-- Misc Executables
-add_executable (h5debug ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5debug.c)
-TARGET_NAMING (h5debug STATIC)
-TARGET_C_PROPERTIES (h5debug STATIC " " " ")
-target_link_libraries (h5debug ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (h5debug PROPERTIES FOLDER tools)
-
-add_executable (h5repart ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5repart.c)
-TARGET_NAMING (h5repart STATIC)
-TARGET_C_PROPERTIES (h5repart STATIC " " " ")
-target_link_libraries (h5repart ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (h5repart PROPERTIES FOLDER tools)
-
-add_executable (h5mkgrp ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5mkgrp.c)
-TARGET_NAMING (h5mkgrp STATIC)
-TARGET_C_PROPERTIES (h5mkgrp STATIC " " " ")
-target_link_libraries (h5mkgrp  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5mkgrp PROPERTIES FOLDER tools)
-
-add_executable (h5clear ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5clear.c)
-TARGET_NAMING (h5clear STATIC)
-TARGET_C_PROPERTIES (h5clear STATIC " " " ")
-target_link_libraries (h5clear  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (h5clear PROPERTIES FOLDER tools)
-
-set (H5_DEP_EXECUTABLES
-    h5debug
-    h5repart
-    h5mkgrp
-    h5clear
-)
-
-#-----------------------------------------------------------------------------
-# Generate the h5cc file containing settings needed to compile programs
-#-----------------------------------------------------------------------------
-#if (NOT WIN32)
-#  configure_file (${HDF5_TOOLS_MISC_SOURCE_DIR}/h5cc.in ${HDF5_BINARY_DIR}/h5cc @ONLY)
-#endif (NOT WIN32)
-
-if (BUILD_TESTING)
-  # --------------------------------------------------------------------
-  # Add the misc test executables
-  # --------------------------------------------------------------------
-  if (HDF5_BUILD_GENERATORS)
-    add_executable (h5repart_gentest ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5repart_gentest.c)
-    TARGET_NAMING (h5repart_gentest STATIC)
-    TARGET_C_PROPERTIES (h5repart_gentest STATIC " " " ")
-    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)
-  TARGET_NAMING (h5repart_test STATIC)
-  TARGET_C_PROPERTIES (h5repart_test STATIC " " " ")
-  target_link_libraries (h5repart_test ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (h5repart_test PROPERTIES FOLDER tools)
-
-  add_executable (h5clear_gentest ${HDF5_TOOLS_MISC_SOURCE_DIR}/h5clear_gentest.c)
-  TARGET_NAMING (h5clear_gentest STATIC)
-  TARGET_C_PROPERTIES (h5clear_gentest STATIC " " " ")
-  target_link_libraries (h5clear_gentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (h5clear_gentest PROPERTIES FOLDER tools)
-
-  add_executable (clear_open_chk ${HDF5_TOOLS_MISC_SOURCE_DIR}/clear_open_chk.c)
-  TARGET_NAMING (clear_open_chk STATIC)
-  TARGET_C_PROPERTIES (clear_open_chk STATIC " " " ")
-  target_link_libraries (clear_open_chk ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (clear_open_chk PROPERTIES FOLDER tools)
-
-  include (CMakeTests.cmake)
-endif (BUILD_TESTING)
-
-##############################################################################
-##############################################################################
-###           I N S T A L L A T I O N                                      ###
-##############################################################################
-##############################################################################
-
-#-----------------------------------------------------------------------------
-# Rules for Installation of tools using make Install target
-#-----------------------------------------------------------------------------
-
-#INSTALL_PROGRAM_PDB (h5debug ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-#INSTALL_PROGRAM_PDB (h5repart ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-#INSTALL_PROGRAM_PDB (h5mkgrp ${HDF5_INSTALL_BIN_DIR} toolsapplications)
-
-install (
-    TARGETS
-        h5debug h5repart h5mkgrp
-    RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
-)
diff --git a/tools/misc/CMakeTests.cmake b/tools/misc/CMakeTests.cmake
deleted file mode 100644
index dabcc23..0000000
--- a/tools/misc/CMakeTests.cmake
+++ /dev/null
@@ -1,360 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-  # --------------------------------------------------------------------
-  # Copy all the HDF5 files from the source directory into the test directory
-  # --------------------------------------------------------------------
-  set (HDF5_REFERENCE_TEST_FILES
-      family_file00000.h5
-      family_file00001.h5
-      family_file00002.h5
-      family_file00003.h5
-      family_file00004.h5
-      family_file00005.h5
-      family_file00006.h5
-      family_file00007.h5
-      family_file00008.h5
-      family_file00009.h5
-      family_file00010.h5
-      family_file00011.h5
-      family_file00012.h5
-      family_file00013.h5
-      family_file00014.h5
-      family_file00015.h5
-      family_file00016.h5
-      family_file00017.h5
-  )
-
-  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/${h5_file}")
-    #message (STATUS " Copying ${h5_file}")
-    add_custom_command (
-        TARGET     h5repart
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_file} ${dest}
-    )
-  endforeach (h5_file ${HDF5_REFERENCE_TEST_FILES})
-
-  set (HDF5_MKGRP_TEST_FILES
-      #h5mkgrp_help.txt
-      #h5mkgrp_version
-      h5mkgrp_single.ls
-      h5mkgrp_single_v.ls
-      h5mkgrp_single_p.ls
-      h5mkgrp_single_l.ls
-      h5mkgrp_several.ls
-      h5mkgrp_several_v.ls
-      h5mkgrp_several_p.ls
-      h5mkgrp_several_l.ls
-      h5mkgrp_nested_p.ls
-      h5mkgrp_nested_lp.ls
-      h5mkgrp_nested_mult_p.ls
-      h5mkgrp_nested_mult_lp.ls
-  )
-
-  # make test dir
-  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-
-  foreach (h5_mkgrp_file ${HDF5_MKGRP_TEST_FILES})
-    set (dest "${PROJECT_BINARY_DIR}/testfiles/${h5_mkgrp_file}")
-    #message (STATUS " Copying ${h5_mkgrp_file}")
-    add_custom_command (
-        TARGET     h5mkgrp
-        POST_BUILD
-        COMMAND    ${CMAKE_COMMAND}
-        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/${h5_mkgrp_file} ${dest}
-    )
-  endforeach (h5_mkgrp_file ${HDF5_MKGRP_TEST_FILES})
-
-  add_custom_command (
-      TARGET     h5mkgrp
-      POST_BUILD
-      COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/testfiles/h5mkgrp_help.txt ${PROJECT_BINARY_DIR}/testfiles/h5mkgrp_help.txt
-  )
-  configure_file (${PROJECT_SOURCE_DIR}/testfiles/h5mkgrp_version.txt.in ${PROJECT_BINARY_DIR}/testfiles/h5mkgrp_version.txt @ONLY)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S  M A C R O S                               ###
-##############################################################################
-##############################################################################
-
-  MACRO (ADD_H5_TEST resultfile resultcode resultoption)
-    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5MKGRP-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-                  ${resultfile}.h5
-                  ${resultfile}.out
-                  ${resultfile}.out.err
-      )
-      set_tests_properties (H5MKGRP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-    endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-
-    add_test (
-        NAME H5MKGRP-${resultfile}
-        COMMAND $<TARGET_FILE:h5mkgrp> ${resultoption} ${resultfile}.h5 ${ARGN}
-    )
-    set_tests_properties (H5MKGRP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      if (NOT "${last_test}" STREQUAL "")
-        set_tests_properties (H5MKGRP-${resultfile} PROPERTIES DEPENDS ${last_test})
-      endif (NOT "${last_test}" STREQUAL "")
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      set_tests_properties (H5MKGRP-${resultfile} PROPERTIES DEPENDS H5MKGRP-${resultfile}-clear-objects)
-      add_test (
-          NAME H5MKGRP-${resultfile}-h5ls
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5ls>"
-              -D "TEST_ARGS:STRING=-v;-r;${resultfile}.h5"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_MASK_MOD=true"
-              -D "TEST_REFERENCE=${resultfile}.ls"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5MKGRP-${resultfile}-h5ls PROPERTIES DEPENDS H5MKGRP-${resultfile})
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_TEST resultfile resultcode resultoption)
-
-  MACRO (ADD_H5_CMP resultfile resultcode)
-    if (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (NAME H5MKGRP_CMP-${resultfile} COMMAND $<TARGET_FILE:h5mkgrp> ${ARGN})
-    else (HDF5_ENABLE_USING_MEMCHECKER)
-      add_test (
-          NAME H5MKGRP_CMP-${resultfile}-clear-objects
-          COMMAND    ${CMAKE_COMMAND}
-              -E remove
-                  ${resultfile}.h5
-                  ${resultfile}.out
-                  ${resultfile}.out.err
-      )
-      set_tests_properties (H5MKGRP_CMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-      add_test (
-          NAME H5MKGRP_CMP-${resultfile}
-          COMMAND "${CMAKE_COMMAND}"
-              -D "TEST_PROGRAM=$<TARGET_FILE:h5mkgrp>"
-              -D "TEST_ARGS:STRING=${ARGN}"
-              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-              -D "TEST_OUTPUT=${resultfile}.out"
-              -D "TEST_EXPECT=${resultcode}"
-              -D "TEST_REFERENCE=${resultfile}.txt"
-              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
-      )
-      set_tests_properties (H5MKGRP_CMP-${resultfile} PROPERTIES DEPENDS H5MKGRP_CMP-${resultfile}-clear-objects)
-    endif (HDF5_ENABLE_USING_MEMCHECKER)
-  ENDMACRO (ADD_H5_CMP resultfile resultcode)
-
-##############################################################################
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-##############################################################################
-
-  ###################### H5REPART #########################
-  # Remove any output file left over from previous test run
-  add_test (
-    NAME H5REPART-clearall-objects
-    COMMAND    ${CMAKE_COMMAND}
-        -E remove
-        fst_family00000.h5
-        scd_family00000.h5
-        scd_family00001.h5
-        scd_family00002.h5
-        scd_family00003.h5
-        family_to_sec2.h5
-  )
-  if (NOT "${last_test}" STREQUAL "")
-    set_tests_properties (H5REPART-clearall-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
-  set (last_test "H5REPART-clearall-objects")
-
-  # repartition family member size to 20,000 bytes.
-  add_test (NAME H5REPART-h5repart_20K COMMAND $<TARGET_FILE:h5repart> -m 20000 family_file%05d.h5 fst_family%05d.h5)
-  set_tests_properties (H5REPART-h5repart_20K PROPERTIES DEPENDS H5REPART-clearall-objects)
-
-  # repartition family member size to 5 KB.
-  add_test (NAME H5REPART-h5repart_5K COMMAND $<TARGET_FILE:h5repart> -m 5k family_file%05d.h5 scd_family%05d.h5)
-  set_tests_properties (H5REPART-h5repart_5K PROPERTIES DEPENDS H5REPART-clearall-objects)
-
-  # convert family file to sec2 file of 20,000 bytes
-  add_test (NAME H5REPART-h5repart_sec2 COMMAND $<TARGET_FILE:h5repart> -m 20000 -family_to_sec2 family_file%05d.h5 family_to_sec2.h5)
-  set_tests_properties (H5REPART-h5repart_sec2 PROPERTIES DEPENDS H5REPART-clearall-objects)
-
-  # test the output files repartitioned above.
-  add_test (NAME H5REPART-h5repart_test COMMAND $<TARGET_FILE:h5repart_test>)
-  set_tests_properties (H5REPART-h5repart_test PROPERTIES DEPENDS "H5REPART-clearall-objects;H5REPART-h5repart_20K;H5REPART-h5repart_5K;H5REPART-h5repart_sec2")
-
-  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES}
-        h5repart_test
-  )
-
-  ###################### H5CLEAR #########################
-  # Remove any output file left over from previous test run
-  add_test (
-    NAME H5CLEAR-clearall-objects
-    COMMAND    ${CMAKE_COMMAND}
-        -E remove
-        h5clear_log_v3.h5
-        h5clear_sec2_v0.h5
-        h5clear_sec2_v2.h5
-        h5clear_sec2_v3.h5
-        latest_h5clear_log_v3.h5
-        latest_h5clear_sec2_v3.h5
-  )
-  if (NOT "${last_test}" STREQUAL "")
-    set_tests_properties (H5CLEAR-clearall-objects PROPERTIES DEPENDS ${last_test})
-  endif (NOT "${last_test}" STREQUAL "")
-  set (last_test "H5CLEAR-clearall-objects")
-
-  # create the output files to be used.
-  add_test (NAME H5CLEAR-h5clear_gentest COMMAND $<TARGET_FILE:h5clear_gentest>)
-  set_tests_properties (H5CLEAR-h5clear_gentest PROPERTIES DEPENDS "H5CLEAR-clearall-objects")
-
-  # Initial file open fails
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v3_F COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v3_F PROPERTIES WILL_FAIL "true")
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v3_F PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-sec2_v3 COMMAND $<TARGET_FILE:h5clear> h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-h5clear-sec2_v3 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-sec2_v3_F)
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v3 COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v3 PROPERTIES DEPENDS H5CLEAR-h5clear-sec2_v3)
-
-  # Initial file open fails
-  add_test (NAME H5CLEAR-clear_open_chk-log_v3_F COMMAND $<TARGET_FILE:clear_open_chk> h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-log_v3_F PROPERTIES WILL_FAIL "true")
-  set_tests_properties (H5CLEAR-clear_open_chk-log_v3_F PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-log_v3 COMMAND $<TARGET_FILE:h5clear> h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-h5clear-log_v3 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-log_v3_F)
-  add_test (NAME H5CLEAR-clear_open_chk-log_v3 COMMAND $<TARGET_FILE:clear_open_chk> h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-log_v3 PROPERTIES DEPENDS H5CLEAR-h5clear-log_v3)
-
-  # Initial file open fails
-  add_test (NAME H5CLEAR-clear_open_chk-latest_sec2_v3_F COMMAND $<TARGET_FILE:clear_open_chk> latest_h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_sec2_v3_F PROPERTIES WILL_FAIL "true")
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_sec2_v3_F PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-latest_sec2_v3 COMMAND $<TARGET_FILE:h5clear> latest_h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-h5clear-latest_sec2_v3 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-latest_sec2_v3_F)
-  add_test (NAME H5CLEAR-clear_open_chk-latest_sec2_v3 COMMAND $<TARGET_FILE:clear_open_chk> latest_h5clear_sec2_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_sec2_v3 PROPERTIES DEPENDS H5CLEAR-h5clear-latest_sec2_v3)
-
-  # Initial file open fails
-  add_test (NAME H5CLEAR-clear_open_chk-latest_log_v3_F COMMAND $<TARGET_FILE:clear_open_chk> h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_log_v3_F PROPERTIES WILL_FAIL "true")
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_log_v3_F PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-latest_log_v3 COMMAND $<TARGET_FILE:h5clear> latest_h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-h5clear-latest_log_v3 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-latest_log_v3_F)
-  add_test (NAME H5CLEAR-clear_open_chk-latest_log_v3 COMMAND $<TARGET_FILE:clear_open_chk> latest_h5clear_log_v3.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-latest_log_v3 PROPERTIES DEPENDS H5CLEAR-h5clear-latest_log_v3)
-
-  #
-  # File open succeeds because the library does not check status_flags for file with < v3 superblock
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v0_P COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v0.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v0_P PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-sec2_v0 COMMAND $<TARGET_FILE:h5clear> h5clear_sec2_v0.h5)
-  set_tests_properties (H5CLEAR-h5clear-sec2_v0 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-sec2_v0_P)
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v0 COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v0.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v0 PROPERTIES DEPENDS H5CLEAR-h5clear-sec2_v0)
-
-  #
-  # File open succeeds because the library does not check status_flags for file with < v3 superblock
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v2_P COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v2.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v2_P PROPERTIES DEPENDS H5CLEAR-h5clear_gentest)
-  # After "h5clear" the file, the subsequent file open succeeds
-  add_test (NAME H5CLEAR-h5clear-sec2_v2 COMMAND $<TARGET_FILE:h5clear> h5clear_sec2_v2.h5)
-  set_tests_properties (H5CLEAR-h5clear-sec2_v2 PROPERTIES DEPENDS H5CLEAR-clear_open_chk-sec2_v2_P)
-  add_test (NAME H5CLEAR-clear_open_chk-sec2_v2 COMMAND $<TARGET_FILE:clear_open_chk> h5clear_sec2_v2.h5)
-  set_tests_properties (H5CLEAR-clear_open_chk-sec2_v2 PROPERTIES DEPENDS H5CLEAR-h5clear-sec2_v2)
-
-  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES}
-        h5clear_gentest
-  )
-
-  ###################### H5MKGRP #########################
-  if (HDF5_ENABLE_USING_MEMCHECKER)
-    add_test (
-        NAME H5MKGRP-clearall-objects
-        COMMAND    ${CMAKE_COMMAND}
-            -E remove
-                h5mkgrp_help.out
-                h5mkgrp_help.out.err
-                h5mkgrp_version.out
-                h5mkgrp_version.out.err
-                h5mkgrp_single.h5
-                h5mkgrp_single.out
-                h5mkgrp_single.out.err
-                h5mkgrp_single_v.h5
-                h5mkgrp_single_v.out
-                h5mkgrp_single_v.out.err
-                h5mkgrp_single_p.h5
-                h5mkgrp_single_p.out
-                h5mkgrp_single_p.out.err
-                h5mkgrp_single_l.h5
-                h5mkgrp_single_l.out
-                h5mkgrp_single_l.out.err
-                h5mkgrp_several.h5
-                h5mkgrp_several.out
-                h5mkgrp_several.out.err
-                h5mkgrp_several_v.h5
-                h5mkgrp_several_v.out
-                h5mkgrp_several_v.out.err
-                h5mkgrp_several_p.h5
-                h5mkgrp_several_p.out
-                h5mkgrp_several_p.out.err
-                h5mkgrp_several_l.h5
-                h5mkgrp_several_l.out
-                h5mkgrp_several_l.out.err
-                h5mkgrp_nested_p.h5
-                h5mkgrp_nested_p.out
-                h5mkgrp_nested_p.out.err
-                h5mkgrp_nested_lp.h5
-                h5mkgrp_nested_lp.out
-                h5mkgrp_nested_lp.out.err
-                h5mkgrp_nested_mult_p.h5
-                h5mkgrp_nested_mult_p.out
-                h5mkgrp_nested_mult_p.out.err
-                h5mkgrp_nested_mult_lp.h5
-                h5mkgrp_nested_mult_lp.out
-                h5mkgrp_nested_mult_lp.out.err
-    )
-    set_tests_properties (H5MKGRP-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
-    if (NOT "${last_test}" STREQUAL "")
-      set_tests_properties (H5MKGRP-clearall-objects PROPERTIES DEPENDS ${last_test})
-    endif (NOT "${last_test}" STREQUAL "")
-    set (last_test "H5MKGRP-clearall-objects")
-  endif (HDF5_ENABLE_USING_MEMCHECKER)
-
-  # Check that help & version is displayed properly
-  ADD_H5_CMP (h5mkgrp_help 0 "-h")
-  ADD_H5_CMP (h5mkgrp_version 0 "-V")
-
-  # Create single group at root level
-  ADD_H5_TEST (h5mkgrp_single 0 "" single)
-  ADD_H5_TEST (h5mkgrp_single_v 0 "-v" single)
-  ADD_H5_TEST (h5mkgrp_single_p 0 "-p" single)
-  ADD_H5_TEST (h5mkgrp_single_l 0 "-l" latest)
-
-  # Create several groups at root level
-  ADD_H5_TEST (h5mkgrp_several 0 "" one two)
-  ADD_H5_TEST (h5mkgrp_several_v 0 "-v" one two)
-  ADD_H5_TEST (h5mkgrp_several_p 0 "-p" one two)
-  ADD_H5_TEST (h5mkgrp_several_l 0 "-l" one two)
-
-  # Create various nested groups
-  ADD_H5_TEST (h5mkgrp_nested_p 0 "-p" /one/two)
-  ADD_H5_TEST (h5mkgrp_nested_lp 0 "-lp" /one/two)
-  ADD_H5_TEST (h5mkgrp_nested_mult_p 0 "-p" /one/two /three/four)
-  ADD_H5_TEST (h5mkgrp_nested_mult_lp 0 "-lp" /one/two /three/four)
diff --git a/tools/misc/Makefile.am b/tools/misc/Makefile.am
deleted file mode 100644
index bde6805..0000000
--- a/tools/misc/Makefile.am
+++ /dev/null
@@ -1,80 +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.
-##
-## Makefile.am
-## Run automake to generate a Makefile.in from this file.
-#
-# HDF5 Library Makefile(.in)
-#
-
-include $(top_srcdir)/config/commence.am
-
-SUBDIRS=vds
-
-# Include src directory
-AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
-
-#test scripts and programs
-TEST_PROG=h5repart_gentest talign
-TEST_SCRIPT=testh5repart.sh testh5mkgrp.sh testh5clear.sh
-
-
-check_PROGRAMS=$(TEST_PROG) repart_test clear_open_chk
-check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5repart$(EXEEXT) h5mkgrp$(EXEEXT) h5clear$(EXEEXT)
-
-
-# These are our main targets, the tools
-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
-
-# Temporary files.  *.h5 are generated by h5repart_gentest.  They should
-# copied to the testfiles/ directory if update is required. fst_family*.h5
-# and scd_family*.h5 were created by setting the HDF5_NOCLEANUP variable.
-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 testh5clear.sh
-
-# All programs rely on hdf5 library and h5tools library
-LDADD=$(LIBH5TOOLS) $(LIBHDF5)
-
-# h5cc needs custom install and uninstall rules, since it may be
-# named h5pcc if hdf5 is being built in parallel mode.
-if BUILD_PARALLEL_CONDITIONAL
-  H5CC_NAME=h5pcc
-else
-  H5CC_NAME=h5cc
-endif
-
-install-exec-local:
-	@$(INSTALL) h5cc $(DESTDIR)$(bindir)/$(H5CC_NAME)
-uninstall-local:
-	@$(RM) $(DESTDIR)$(bindir)/$(H5CC_NAME)
-
-# How to build h5redeploy script
-h5redeploy: h5redeploy.in
-	@cp $(srcdir)/$@.in $@
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/misc/Makefile.in b/tools/misc/Makefile.in
deleted file mode 100644
index 41c3928..0000000
--- a/tools/misc/Makefile.in
+++ /dev/null
@@ -1,1774 +0,0 @@
-# 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) 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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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 = 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) $(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 $@
-h5mkgrp_SOURCES = h5mkgrp.c
-h5mkgrp_OBJECTS = h5mkgrp.$(OBJEXT)
-h5mkgrp_LDADD = $(LDADD)
-h5mkgrp_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5mkgrp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5mkgrp_LDFLAGS) $(LDFLAGS) -o $@
-h5repart_SOURCES = h5repart.c
-h5repart_OBJECTS = h5repart.$(OBJEXT)
-h5repart_LDADD = $(LDADD)
-h5repart_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-h5repart_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5repart_LDFLAGS) $(LDFLAGS) -o $@
-h5repart_gentest_SOURCES = h5repart_gentest.c
-h5repart_gentest_OBJECTS = h5repart_gentest.$(OBJEXT)
-h5repart_gentest_LDADD = $(LDADD)
-h5repart_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-repart_test_SOURCES = repart_test.c
-repart_test_OBJECTS = repart_test.$(OBJEXT)
-repart_test_LDADD = $(LDADD)
-repart_test_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-talign_SOURCES = talign.c
-talign_OBJECTS = talign.$(OBJEXT)
-talign_LDADD = $(LDADD)
-talign_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
-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; }; \
-  }
-SCRIPTS = $(bin_SCRIPTS)
-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 = 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
-# *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__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)
-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)
-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@
-
-# 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_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5repart_gentest.  They should
-# copied to the testfiles/ directory if update is required. fst_family*.h5
-# 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 scripts and programs
-TEST_PROG = h5repart_gentest talign
-TEST_SCRIPT = testh5repart.sh testh5mkgrp.sh testh5clear.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-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 testh5clear.sh
-
-# All programs rely on hdf5 library and h5tools library
-LDADD = $(LIBH5TOOLS) $(LIBHDF5)
- at BUILD_PARALLEL_CONDITIONAL_FALSE@H5CC_NAME = h5cc
-
-# h5cc needs custom install and uninstall rules, since it may be
-# named h5pcc if hdf5 is being built in parallel mode.
- at BUILD_PARALLEL_CONDITIONAL_TRUE@H5CC_NAME = h5pcc
-
-# 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-recursive
-
-.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/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/misc/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):
-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
-	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
-
-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)
-
-h5mkgrp$(EXEEXT): $(h5mkgrp_OBJECTS) $(h5mkgrp_DEPENDENCIES) $(EXTRA_h5mkgrp_DEPENDENCIES) 
-	@rm -f h5mkgrp$(EXEEXT)
-	$(AM_V_CCLD)$(h5mkgrp_LINK) $(h5mkgrp_OBJECTS) $(h5mkgrp_LDADD) $(LIBS)
-
-h5repart$(EXEEXT): $(h5repart_OBJECTS) $(h5repart_DEPENDENCIES) $(EXTRA_h5repart_DEPENDENCIES) 
-	@rm -f h5repart$(EXEEXT)
-	$(AM_V_CCLD)$(h5repart_LINK) $(h5repart_OBJECTS) $(h5repart_LDADD) $(LIBS)
-
-h5repart_gentest$(EXEEXT): $(h5repart_gentest_OBJECTS) $(h5repart_gentest_DEPENDENCIES) $(EXTRA_h5repart_gentest_DEPENDENCIES) 
-	@rm -f h5repart_gentest$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(h5repart_gentest_OBJECTS) $(h5repart_gentest_LDADD) $(LIBS)
-
-repart_test$(EXEEXT): $(repart_test_OBJECTS) $(repart_test_DEPENDENCIES) $(EXTRA_repart_test_DEPENDENCIES) 
-	@rm -f repart_test$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(repart_test_OBJECTS) $(repart_test_LDADD) $(LIBS)
-
-talign$(EXEEXT): $(talign_OBJECTS) $(talign_DEPENDENCIES) $(EXTRA_talign_DEPENDENCIES) 
-	@rm -f talign$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(talign_OBJECTS) $(talign_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_SCRIPTS)'; 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 \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n' \
-	    -e 'h;s|.*|.|' \
-	    -e 'p;x;s,.*/,,;$(transform)' | 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; \
-	      if (++n[d] == $(am__install_max)) { \
-		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
-	    else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	     } \
-	; done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	       sed -e 's,.*/,,;$(transform)'`; \
-	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-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@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5debug.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5mkgrp.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repart.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repart_gentest.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/repart_test.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/talign.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
-
-# 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-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 \
-	  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-recursive
-
-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-recursive
-
-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 $$?
-h5repart_gentest.log: h5repart_gentest$(EXEEXT)
-	@p='h5repart_gentest$(EXEEXT)'; \
-	b='h5repart_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)
-talign.log: talign$(EXEEXT)
-	@p='talign$(EXEEXT)'; \
-	b='talign'; \
-	$(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
-	@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-recursive
-all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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-recursive
-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:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-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-recursive
-
-clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-	clean-libtool clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-binSCRIPTS \
-	install-exec-local
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-local
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
-	uninstall-local
-
-.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
-# 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
-
-install-exec-local:
-	@$(INSTALL) h5cc $(DESTDIR)$(bindir)/$(H5CC_NAME)
-uninstall-local:
-	@$(RM) $(DESTDIR)$(bindir)/$(H5CC_NAME)
-
-# How to build h5redeploy script
-h5redeploy: h5redeploy.in
-	@cp $(srcdir)/$@.in $@
-
-# 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/clear_open_chk.c b/tools/misc/clear_open_chk.c
deleted file mode 100644
index 7e86068..0000000
--- a/tools/misc/clear_open_chk.c
+++ /dev/null
@@ -1,74 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#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;
-    }
-
-    if(fname)
-        HDfree(fname);
-    /* 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/h5cc.in b/tools/misc/h5cc.in
deleted file mode 100644
index cabd83f..0000000
--- a/tools/misc/h5cc.in
+++ /dev/null
@@ -1,401 +0,0 @@
-#! /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.
-##
-
-# This tool is adapted from the mpicc command of the MPICH Software.
-
-############################################################################
-##                                                                        ##
-## Things You May Have to Modify:                                         ##
-##                                                                        ##
-## If the following paths don't point to the place were HDF5 is installed ##
-## on your system (i.e., you received a binary distribution or moved the  ##
-## files from the originally installed directory to another directory)    ##
-## then modify them accordingly to represent the new paths.               ##
-##                                                                        ##
-############################################################################
-prefix="@prefix@"
-exec_prefix="@exec_prefix@"
-libdir="@libdir@"
-includedir="@includedir@"
-HL="@HL@"
-
-############################################################################
-##                                                                        ##
-## Things You Can Modify to Override HDF5 Library Build Components:       ##
-##                                                                        ##
-## (Advanced usage - know what you're doing - you're on your own here.)   ##
-## The four variables below can be used to insert paths and flags in      ##
-## CPPFLAGS, CFLAGS, LDFLAGS, or LIBS in the h5cc compile line:           ##
-##    $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS   ##
-##    $LIBS $clibpath $link_objs $link_args $shared_link                  ##
-##                                                                        ##
-## These settings can be overriden by setting HDF5_CFLAGS,                ##
-## HDF5_CPPFLAGS, HDF5_LDFLAGS, or HDF5_LIBS in the environment.          ##
-##                                                                        ##
-############################################################################
-CFLAGSBASE=""
-CPPFLAGSBASE=""
-LDFLAGSBASE=""
-LIBSBASE=""
-
-############################################################################
-##                                                                        ##
-## You shouldn't have to modify anything below this line.                 ##
-##                                                                        ##
-############################################################################
-
-# Constants definitions
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-host_os="@host_os@"
-
-prog_name="`basename $0`"
-
-allargs=""
-compile_args=""
-libraries=""
-link_args=""
-link_objs=""
-clibpath=""
-
-do_link="yes"
-do_compile="no"
-dash_o="no"
-dash_c="no"
-get_output_file="no"
-
-SHOW="eval"
-CCBASE="@CC@"
-CLINKERBASE="@CC@"
-
-# CFLAGS, CPPFLAGS and LDFLAGS are reserved for use by the script user.
-# FLAGS brought from the hdf5 build are put in H5BLD_*FLAGS.
-
-# User's CPPFLAGS and CFLAGS come after their H5BLD counterparts.  User's 
-# LDFLAGS come just before clibpath, user's LIBS come after $link_objs and 
-# before the hdf5 libraries in $link_args, followed by any external library 
-# paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in 
-# from the hdf5 build. The order of the flags is intended to give precedence
-# to the user's flags.
-H5BLD_CFLAGS="@AM_CFLAGS@ @CFLAGS@"
-H5BLD_CPPFLAGS="@AM_CPPFLAGS@ @CPPFLAGS@"
-H5BLD_LDFLAGS="@AM_LDFLAGS@ @LDFLAGS@"
-H5BLD_LIBS="@LIBS@"
-
-CC="${HDF5_CC:-$CCBASE}"
-CLINKER="${HDF5_CLINKER:-$CLINKERBASE}"
-CFLAGS="${HDF5_CFLAGS:-$CFLAGSBASE}"
-CPPFLAGS="${HDF5_CPPFLAGS:-$CPPFLAGSBASE}"
-LDFLAGS="${HDF5_LDFLAGS:-$LDFLAGSBASE}"
-LIBS="${HDF5_LIBS:-$LIBSBASE}"
-
-# If a static library is available, the default will be to use it.  If the only
-# available library is shared, it will be used by default.  The user can 
-# override either default, although choosing an unavailable library will result
-# in link errors.  
-STATIC_AVAILABLE="@enable_static@"
-if test "${STATIC_AVAILABLE}" = "yes"; then
-  USE_SHARED_LIB="${HDF5_USE_SHLIB:-no}"
-else
-  USE_SHARED_LIB="${HDF5_USE_SHLIB:-yes}"
-fi
-
-
-usage() {
-  # A wonderfully informative "usage" message.
-  echo "usage: $prog_name [OPTIONS] <compile line>"
-  echo "  OPTIONS:"
-  echo "    -help        This help message."
-  echo "    -echo        Show all the shell commands executed"
-  echo "    -prefix=DIR  Prefix directory to find HDF5 lib/ and include/"
-  echo "                   subdirectories [default: $prefix]"
-  # A wonderfully informative "usage" message.
-  echo "usage: $prog_name [OPTIONS] <compile line>"
-  echo "  OPTIONS:"
-  echo "    -help        This help message."
-  echo "    -echo        Show all the shell commands executed"
-  echo "    -prefix=DIR  Prefix directory to find HDF5 lib/ and include/"
-  echo "                   subdirectories [default: $prefix]"
-  echo "    -show        Show the commands without executing them"
-  echo "    -showconfig  Show the HDF5 library configuration summary"
-  echo "    -shlib       Compile with shared HDF5 libraries [default for hdf5 built"
-  echo "                                                     without static libraries]"
-  echo "    -noshlib     Compile with static HDF5 libraries [default for hdf5 built"
-  echo "                                                     with static libraries]"
-  echo " "
-  echo "  <compile line>  - the normal compile line options for your compiler."
-  echo "                    $prog_name uses the same compiler you used to compile"
-  echo "                    HDF5. Check with your compiler's man pages for more"
-  echo "                    information on which options are needed."
-  echo " "
-  echo " You can override the compiler, linker, and whether or not to use static"
-  echo " or shared libraries to compile your program by setting the following"
-  echo " environment variables accordingly:"
-  echo " "
-  echo "   HDF5_CC                  -  use a different C compiler"
-  echo "   HDF5_CLINKER             -  use a different linker"
-  echo "   HDF5_USE_SHLIB=[yes|no]  -  use shared or static version of the HDF5 library"
-  echo "                                 [default: no except when built with only" 
-  echo "                                           shared libraries]"
-  echo " "
-  echo " You can also add or change paths and flags to the compile line using"
-  echo " the following environment varibles or by assigning them to their counterparts"
-  echo " in the 'Things You Can Modify to Override...'" section of $prog_name
-  echo " "
-  echo "  Variable              Current value to be replaced"
-  echo "  HDF5_CPPFLAGS         \"$CPPFLAGSBASE\""
-  echo "  HDF5_CFLAGS           \"$CFLAGSBASE\""
-  echo "  HDF5_LDFLAGS          \"$LDFLAGSBASE\""
-  echo "  HDF5_LIBS             \"$LIBSBASE\""
-  echo " "
-  echo " Note that adding library paths to HDF5_LDFLAGS where another hdf5 version"
-  echo " is located may link your program with that other hdf5 library version."
-  echo " "
-  exit $EXIT_FAILURE
-}
-
-# Show the configuration summary of the library recorded in the
-# libhdf5.settings file reside in the lib directory.
-showconfigure()
-{
-  cat ${libdir}/libhdf5.settings
-  status=$?
-}
-
-# Main
-status=$EXIT_SUCCESS
-
-if test "$#" = "0"; then
-  # No parameters specified, issue usage statement and exit.
-  usage
-fi
-
-case "$CC" in
-  gcc)
-    kind="gcc"
-    ;;
-  mpicc|mpcc|mpicc_r)
-    # Is this gcc masquarading as an MPI compiler?
-    if test "`${CC} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then
-      kind="gcc"
-    else
-      # Nope
-      kind="$host_os"
-    fi
-    ;;
-  *)
-    kind="$host_os"
-    ;;
-esac
-
-for arg in $@ ; do
-  if test "x$get_output_file" = "xyes"; then
-    link_args="$link_args $arg"
-    output_file="$arg"
-    get_output_file="no"
-    continue
-  fi
-
-  case "$arg" in
-    -c)
-      allargs="$allargs $arg"
-      compile_args="$compile_args $arg"
-
-      if test "x$do_link" = "xyes" -a -n "$output_file"; then
-        compile_args="$compile_args -o $outputfile"
-      fi
-
-      do_link="no"
-      dash_c="yes"
-      ;;
-    -o)
-      allargs="$allargs $arg"
-      dash_o="yes"
-
-      if test "x$dash_c" = "xyes"; then
-        compile_args="$compile_args $arg"
-      else
-        link_args="$link_args $arg"
-        do_link="yes"
-        get_output_file="yes"
-      fi
-      ;;
-    -E|-M|-MT)
-      allargs="$allargs $arg"
-      compile_args="$compile_args $arg"
-      dash_c="yes"
-      do_link="no"
-      ;;
-    -l*)
-      libraries=" $libraries $arg "
-      allargs="$allargs $arg"
-      ;;
-    -prefix=*)
-      prefix="`expr "$arg" : '-prefix=\(.*\)'`"
-      ;;
-    -echo)
-      set -x
-      ;;
-    -show)
-      SHOW="echo"
-      ;;
-    -showconfig)
-      showconfigure
-      exit $status
-      ;;
-    -shlib)
-      USE_SHARED_LIB="yes"
-      ;;
-    -noshlib)
-      USE_SHARED_LIB="no"
-      ;;
-    -help)
-      usage
-      ;;
-    *\"*)
-      qarg="'"$arg"'"
-      allargs="$allargs $qarg"
-      ;;
-    *\'*)
-      qarg='\"'"$arg"'\"'
-      allargs="$allargs $qarg"
-      ;;
-    *)
-      allargs="$allargs $qarg"
-
-      if test -s "$arg"; then
-        ext=`expr "$arg" : '.*\(\..*\)'`
-
-        if test "x$ext" = "x.c"; then
-          do_compile="yes"
-          compile_args="$compile_args $arg"
-          fname=`basename $arg .c`
-          link_objs="$link_objs $fname.o"
-        elif test "x$ext" = "x.o"; then
-          if test "x$dash_c" = "xyes"; then
-            compile_args="$compile_args $arg"
-          else
-            do_link="yes"
-            link_objs="$link_objs $arg"
-          fi
-        elif test "x$ext" = "x.a"; then
-          # This is an archive that we're linking in
-          libraries=" $libraries $arg "
-        else
-          compile_args="$compile_args $arg"
-          link_args="$link_args $arg"
-        fi
-      else
-        compile_args="$compile_args $arg"
-        link_args="$link_args $arg"
-      fi
-      ;;
-  esac
-done
-
-if test "$dash_c" = "yes" -a "$do_compile" = no -a "$do_link" = no ; then
-    # -c was specified.  Force do_compile on.
-    do_compile=yes
-fi
-
-if test "x$do_compile" = "xyes"; then
-  if test "x$dash_c" != "xyes"; then
-    compile_args="-c $compile_args"
-  fi
-
-  $SHOW $CC -I$includedir $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $compile_args
-  status=$?
-
-  if test "$status" != "0"; then
-    exit $status
-  fi
-fi
-
-if test "x$do_link" = "xyes"; then
-  shared_link=""
-# conditionnaly link with the hl library  
-  if test "X$HL" = "Xhl"; then
-   libraries=" $libraries -lhdf5_hl -lhdf5 "
-  else
-   libraries=" $libraries  -lhdf5 "
-  fi
-  link_args="$link_args -L${libdir}"
-
-  case "$kind" in
-    gcc|linux*)
-      # MacOS X doesn't support the "-Wl,-rpath -Wl," style of linker flags.
-      # It appears to want none of them specified.
-      case "$host_os" in
-        darwin*)          flag="" ;;
-        *)                flag="-Wl,-rpath -Wl," ;;
-      esac
-      ;;
-    hpux*)                flag="-Wl,+b -Wl," ;;
-    freebsd*|solaris*)    flag="-R" ;;
-    rs6000*|aix*)         flag="-L" ;;
-    sgi)                  flag="-rpath " ;;
-    *)                    flag="" ;;
-  esac
-
-  if test -n "$flag"; then
-    shared_link="${flag}${libdir}"
-  fi
-
-  if test "x$USE_SHARED_LIB" != "xyes"; then
-    # The "-lhdf5" & "-lhdf5_hl" flags are in here already...This is a static
-    # compile though, so change it to the static version (.a) of the library.
-    new_libraries=""
-    for lib in $libraries; do
-      case "$lib" in
-        -lhdf5)
-          new_libraries="$new_libraries ${libdir}/libhdf5.a"
-          ;;
-        -lhdf5_hl)
-          new_libraries="$new_libraries ${libdir}/libhdf5_hl.a"
-          ;;
-        *)
-          new_libraries="$new_libraries $lib"
-          ;;
-      esac
-    done
-    libraries="$new_libraries"
-  fi
-
-  for lib in $libraries; do
-    if echo $link_args | grep " $lib " > /dev/null ||
-       echo $link_args | grep " $lib$" > /dev/null; then
-      :
-    else
-      link_args="$link_args $lib "
-    fi
-  done
-
-  # The LIBS are just a bunch of -l* libraries necessary for the HDF5
-  # module. It's okay if they're included twice in the compile line.
-  link_args="$link_args $H5BLD_LDFLAGS $H5BLD_LIBS"
-
-  # User's CPPFLAGS and CFLAGS come after their H5BLD counterparts.  User's 
-  # LDFLAGS come just before clibpath, user's LIBS come after $link_objs and 
-  # before the hdf5 libraries in $link_args, followed by any external library 
-  # paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in 
-  # from the hdf5 build. The order of the flags is intended to give precedence
-  # to the user's flags.
-  $SHOW $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args $shared_link
-  status=$?
-fi
-
-exit $status
diff --git a/tools/misc/h5clear.c b/tools/misc/h5clear.c
deleted file mode 100644
index 0be4f8f..0000000
--- a/tools/misc/h5clear.c
+++ /dev/null
@@ -1,137 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index 0f20c35..0000000
--- a/tools/misc/h5clear_gentest.c
+++ /dev/null
@@ -1,174 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#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
deleted file mode 100644
index 4df501a..0000000
--- a/tools/misc/h5debug.c
+++ /dev/null
@@ -1,719 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*-------------------------------------------------------------------------
- *
- * Created:             debug.c
- *                      Jul 18 1997
- *                      Robb Matzke <matzke at llnl.gov>
- *
- * Purpose:             Debugs an existing HDF5 file at a low level.
- *
- *-------------------------------------------------------------------------
- */
-#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               */
-#include "H5HFpkg.h"    /* Fractal heaps        */
-#include "H5HGprivate.h" /* Global Heaps        */
-#include "H5Iprivate.h" /* IDs                  */
-#include "H5Opkg.h"     /* Object headers       */
-#include "H5SMpkg.h"    /* Implicitly shared messages    */
-
-/* File drivers */
-#include "H5FDfamily.h"
-
-#define VCOL    50
-
-

-/*-------------------------------------------------------------------------
- * Function:    get_H5B2_class
- *
- * 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
- *
- * Programmer:  Quincey Koziol
- *    koziol at hdfgroup.org
- *    Sep 11 2008
- *
- *-------------------------------------------------------------------------
- */
-static const H5B2_class_t *
-get_H5B2_class(const uint8_t *sig)
-{
-    H5B2_subid_t subtype = (H5B2_subid_t)sig[H5_SIZEOF_MAGIC + 1];
-    const H5B2_class_t *cls;
-
-    switch(subtype) {
-        case H5B2_TEST_ID:
-            cls = H5B2_TEST;
-            break;
-
-        case H5B2_FHEAP_HUGE_INDIR_ID:
-            cls = H5HF_HUGE_BT2_INDIR;
-            break;
-
-        case H5B2_FHEAP_HUGE_FILT_INDIR_ID:
-            cls = H5HF_HUGE_BT2_FILT_INDIR;
-            break;
-
-        case H5B2_FHEAP_HUGE_DIR_ID:
-            cls = H5HF_HUGE_BT2_DIR;
-            break;
-
-        case H5B2_FHEAP_HUGE_FILT_DIR_ID:
-            cls = H5HF_HUGE_BT2_FILT_DIR;
-            break;
-
-        case H5B2_GRP_DENSE_NAME_ID:
-            cls = H5G_BT2_NAME;
-            break;
-
-        case H5B2_GRP_DENSE_CORDER_ID:
-            cls = H5G_BT2_CORDER;
-            break;
-
-        case H5B2_SOHM_INDEX_ID:
-            cls = H5SM_INDEX;
-            break;
-
-        case H5B2_ATTR_DENSE_NAME_ID:
-            cls = H5A_BT2_NAME;
-            break;
-
-        case H5B2_ATTR_DENSE_CORDER_ID:
-            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_TEST2_ID:
-            cls = H5B2_TEST2;
-            break;
-
-        case H5B2_NUM_BTREE_ID:
-        default:
-            HDfprintf(stderr, "Unknown v2 B-tree subtype %u\n", (unsigned)(subtype));
-            HDexit(4);
-    } /* end switch */
-
-    return(cls);
-} /* end get_H5B2_class() */
-
-

-/*-------------------------------------------------------------------------
- * 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]
- *
- * Return:      Success:        exit (0)
- *
- *              Failure:        exit (non-zero)
- *
- * Programmer:  Robb Matzke
- *              matzke at llnl.gov
- *              Jul 18 1997
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, char *argv[])
-{
-    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];
-    size_t      u;
-    herr_t      status = SUCCEED;
-
-    if(argc == 1) {
-  		HDfprintf(stderr, "Usage: %s filename [signature-addr [extra]]\n", argv[0]);
-  		HDexit(1);
-    } /* end if */
-
-    /* Initialize the library */
-    if(H5open() < 0) {
-        HDfprintf(stderr, "cannot initialize the library\n");
-        HDexit(1);
-    } /* end if */
-
-    /*
-     * Open the file and get the file descriptor.
-     */
-    if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0) {
-        HDfprintf(stderr, "cannot create dataset transfer property list\n");
-        HDexit(1);
-    } /* end if */
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-        HDfprintf(stderr, "cannot create file access property list\n");
-        HDexit(1);
-    } /* end if */
-    if(HDstrchr(argv[1], '%'))
-        if(H5Pset_fapl_family (fapl, (hsize_t)0, H5P_DEFAULT) < 0) {
-            fprintf(stderr, "cannot set file access property list\n");
-            HDexit(1);
-        }
-    if((fid = H5Fopen(argv[1], H5F_ACC_RDONLY, fapl)) < 0) {
-        HDfprintf(stderr, "cannot open file\n");
-        HDexit(1);
-    } /* end if */
-    if(NULL == (f = (H5F_t *)H5I_object(fid))) {
-        HDfprintf(stderr, "cannot obtain H5F_t pointer\n");
-        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.
-     */
-    if(argc > 2)
-        addr = (haddr_t)HDstrtoll(argv[2], NULL, 0);
-    if(argc > 3)
-        extra = (haddr_t)HDstrtoll(argv[3], NULL, 0);
-    if(argc > 4)
-        extra2 = (haddr_t)HDstrtoll(argv[4], NULL, 0);
-    if(argc > 5)
-        extra3 = (haddr_t)HDstrtoll(argv[5], NULL, 0);
-    if(argc > 6)
-        extra4 = (haddr_t)HDstrtoll(argv[6], NULL, 0);
-
-    /*
-     * Read the signature at the specified file position.
-     */
-    HDfprintf(stdout, "Reading signature at address %a (rel)\n", addr);
-    if(H5F_block_read(f, H5FD_MEM_SUPER, addr, sizeof(sig), dxpl, sig) < 0) {
-        HDfprintf(stderr, "cannot read signature\n");
-        HDexit(3);
-    }
-    if(!HDmemcmp(sig, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN)) {
-        /*
-         * Debug the file's super block.
-         */
-        status = H5F_debug(f, stdout, 0, VCOL);
-
-    } else if(!HDmemcmp(sig, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a local heap.
-         */
-        status = H5HL_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else if(!HDmemcmp (sig, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-	/*
-	 * Debug a global heap collection.
-	 */
-	status = H5HG_debug (f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else if(!HDmemcmp(sig, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a symbol table node.
-         */
-
-        /* Check for extra parameters */
-        if(extra == 0) {
-            HDfprintf(stderr, "\nWarning: Providing the group's local heap address will give more information\n");
-            HDfprintf(stderr, "Symbol table node usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <Symbol table node address> <address of local heap>\n\n");
-        } /* end if */
-
-        status = H5G_node_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra);
-
-    } else if(!HDmemcmp(sig, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a B-tree.  B-trees are debugged through the B-tree
-         * subclass.  The subclass identifier is the byte immediately
-         * after the B-tree signature.
-         */
-        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:
-                /* Check for extra parameters */
-                if(extra == 0) {
-                    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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra);
-                break;
-
-            case H5B_CHUNK_ID:
-                /* Check for extra parameters */
-                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> <slowest chunk dim>...<fastest chunk dim>\n");
-                    HDexit(4);
-                } /* end if */
-
-                /* Build array of chunk dimensions */
-                ndims = (unsigned)extra;
-                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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, ndims, dim);
-                break;
-
-            case H5B_NUM_BTREE_ID:
-            default:
-                HDfprintf(stderr, "Unknown v1 B-tree subtype %u\n", (unsigned)(subtype));
-                HDexit(4);
-        }
-
-    } else if(!HDmemcmp(sig, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a v2 B-tree header.
-         */
-        const H5B2_class_t *cls = get_H5B2_class(sig);
-        HDassert(cls);
-
-	    if((cls == H5D_BT2 || cls == H5D_BT2_FILT) && extra == 0) {
-            HDfprintf(stderr, "ERROR: Need v2 B-tree header address and object header address containing the layout message in order to dump header\n");
-            HDfprintf(stderr, "v2 B-tree hdr usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <v2 B-tree header address> <object header address>\n");
-            HDexit(4);
-	    } /* end if */
-
-        status = H5B2__hdr_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, (haddr_t)extra);
-
-    } else if(!HDmemcmp(sig, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a v2 B-tree internal node.
-         */
-        const H5B2_class_t *cls = get_H5B2_class(sig);
-        HDassert(cls);
-
-        /* Check for enough valid parameters */
-	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");
-            HDfprintf(stderr, "\th5debug <filename> <internal node address> <v2 B-tree header address> <number of records> <depth>\n");
-            HDexit(4);
-        } /* end if */
-
-        status = H5B2__int_debug(f, H5AC_ind_read_dxpl_id, 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)) {
-        /*
-         * Debug a v2 B-tree leaf node.
-         */
-        const H5B2_class_t *cls = get_H5B2_class(sig);
-        HDassert(cls);
-
-        /* Check for enough valid parameters */
-	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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (haddr_t)extra3);
-
-    } else if(!HDmemcmp(sig, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a fractal heap header.
-         */
-        status = H5HF_hdr_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else if(!HDmemcmp(sig, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a fractal heap direct block.
-         */
-
-        /* Check for enough valid parameters */
-        if(extra == 0 || extra2 == 0) {
-            HDfprintf(stderr, "ERROR: Need fractal heap header address and size of direct block in order to dump direct block\n");
-            HDfprintf(stderr, "Fractal heap direct block usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <direct block address> <heap header address> <size of direct block>\n");
-            HDexit(4);
-        } /* end if */
-
-        status = H5HF_dblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, (size_t)extra2);
-
-    } else if(!HDmemcmp(sig, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a fractal heap indirect block.
-         */
-
-        /* Check for enough valid parameters */
-        if(extra == 0 || extra2 == 0) {
-            HDfprintf(stderr, "ERROR: Need fractal heap header address and number of rows in order to dump indirect block\n");
-            HDfprintf(stderr, "Fractal heap indirect block usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <indirect block address> <heap header address> <number of rows>\n");
-            HDexit(4);
-        } /* end if */
-
-        status = H5HF_iblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, (unsigned)extra2);
-
-    } else if(!HDmemcmp(sig, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug a free space header.
-         */
-
-        status = H5FS_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else if(!HDmemcmp(sig, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug free space serialized sections.
-         */
-
-        /* Check for enough valid parameters */
-        if(extra == 0 || extra2 == 0) {
-            HDfprintf(stderr, "ERROR: Need free space header address and client address in order to dump serialized sections\n");
-            HDfprintf(stderr, "Free space serialized sections usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <serialized sections address> <free space header address> <client address>\n");
-            HDexit(4);
-        } /* end if */
-
-        status = H5FS_sects_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, extra2);
-
-    } else if(!HDmemcmp(sig, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug shared message master table.
-         */
-
-        status = H5SM_table_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, (unsigned) UFAIL, (unsigned) UFAIL);
-
-    } else if(!HDmemcmp(sig, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug shared message list index.
-         */
-
-        /* Check for enough valid parameters */
-        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> <shared message header address>\n");
-            HDexit(4);
-        } /* end if */
-
-        status = H5SM_list_debug(f, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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 = H5FA__dblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, extra, extra2);
-
-    } else if(!HDmemcmp(sig, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
-        /*
-         * Debug v2 object header (which have signatures).
-         */
-
-        status = H5O_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else if(sig[0] == H5O_VERSION_1) {
-        /*
-         * This could be a v1 object header.  Since they don't have a signature
-         * it's a somewhat "ify" detection.
-         */
-        status = H5O_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
-
-    } else {
-        /*
-         * Got some other unrecognized signature.
-         */
-        printf("%-*s ", VCOL, "Signature:");
-        for (u = 0; u < sizeof(sig); u++) {
-            if (sig[u] > ' ' && sig[u] <= '~' && '\\' != sig[u])
-                HDputchar(sig[u]);
-            else if ('\\' == sig[u]) {
-                HDputchar('\\');
-                HDputchar('\\');
-            } else
-                printf("\\%03o", sig[u]);
-        }
-        HDputchar('\n');
-
-        HDfprintf(stderr, "unknown signature\n");
-        HDexit(4);
-    } /* end else */
-
-    /* Check for an error when dumping information */
-    if(status < 0) {
-        HDfprintf(stderr, "An error occurred!\n");
-        H5Eprint2(H5E_DEFAULT, stderr);
-        HDexit(5);
-    } /* end if */
-
-    H5Pclose(dxpl);
-    H5Pclose(fapl);
-    H5Fclose(fid);
-
-    return 0;
-} /* main() */
-
diff --git a/tools/misc/h5mkgrp.c b/tools/misc/h5mkgrp.c
deleted file mode 100644
index 1c1bba1..0000000
--- a/tools/misc/h5mkgrp.c
+++ /dev/null
@@ -1,336 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include <string.h>
-#include <stdlib.h>
-
-/* Name of tool */
-#define PROGRAMNAME "h5mkgrp"
-
-/* Exit status for tools library routines */
-int d_status = EXIT_SUCCESS;
-
-/* command-line options: short and long-named parameters */
-static const char *s_opts = "hlpvV";
-static struct long_options l_opts[] = {
-    { "help", no_arg, 'h' },
-    { "latest", no_arg, 'l' },
-    { "parents", no_arg, 'p' },
-    { "verbose", no_arg, 'v' },
-    { "version", no_arg, 'V' },
-    { NULL, 0, '\0' }
-};
-
-/* Command line parameter settings */
-typedef struct {
-    char *fname;                /* File name to operate on */
-    hbool_t latest;             /* Whether file should use latest format versions */
-    hbool_t verbose;            /* Whether output should be verbose */
-    hbool_t parents;            /* Whether to create intermediate groups */
-    size_t ngroups;             /* Number of groups to create */
-    char **groups;              /* Pointer to array of group names */
-} param_t;
-param_t params;             /* Command line parameter settings */
-
-

-/*-------------------------------------------------------------------------
- * Function:    leave
- *
- * Purpose:     Shutdown MPI and/or HDF5 and call exit()
- *
- * Return:      Does not return
- *
- * Programmer: Quincey Koziol, 2/13/2007
- *
- *-------------------------------------------------------------------------
- */
-static void
-leave(int ret)
-{
-    int curr_group;
-
-    if (params.fname)
-        HDfree (params.fname);
-    if (params.ngroups) {
-        for(curr_group = 0; curr_group < params.ngroups; curr_group++)
-            HDfree (params.groups[curr_group]);
-        HDfree (params.groups);
-    }
-    h5tools_close();
-    HDexit(ret);
-} /* end leave() */
-
-

-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: Prints a usage message on stderr and then returns.
- *
- * Return: void
- *
- * Programmer: Quincey Koziol, 2/13/2007
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage(void)
-{
-    HDfprintf(stdout, "\
-usage: h5mkgrp [OPTIONS] FILE GROUP...\n\
-   OPTIONS\n\
-      -h, --help         Print a usage message and exit\n\
-      -l, --latest       Use latest version of file format to create groups\n\
-      -p, --parents      No error if existing, make parent groups as needed\n\
-      -v, --verbose      Print information about OBJECTS and OPTIONS\n\
-      -V, --version      Print version number and exit\n");
-} /* end usage() */
-
-

-/*-------------------------------------------------------------------------
- * Function: parse_command_line
- *
- * Purpose: Parses command line and sets up global variable to control output
- *
- * Return:  Success: 0
- *    Failure: -1
- *
- * Programmer: Quincey Koziol, 2/13/2007
- *
- *-------------------------------------------------------------------------
- */
-static int
-parse_command_line(int argc, const char *argv[], param_t *parms)
-{
-    int opt;            /* Option from command line */
-    size_t curr_group;  /* Current group name to copy */
-
-    /* Check for empty command line */
-    if(argc == 1) {
-        usage();
-        leave(EXIT_SUCCESS);
-    } /* end if */
-
-    /* Parse command line options */
-    while((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
-        switch((char)opt) {
-            /* Display 'help' */
-            case 'h':
-                usage();
-                leave(EXIT_SUCCESS);
-
-            /* Create objects with the latest version of the format */
-            case 'l':
-                parms->latest = TRUE;
-                break;
-
-            /* Create parent groups */
-            case 'p':
-                parms->parents = TRUE;
-                break;
-
-            /* Verbose output */
-            case 'v':
-                parms->verbose = TRUE;
-                break;
-
-            /* Display version */
-            case 'V':
-                print_version(h5tools_getprogname());
-                leave(EXIT_SUCCESS);
-
-            /* Bad command line argument */
-            default:
-                usage();
-                leave(EXIT_FAILURE);
-        } /* end switch */
-    } /* end while */
-
-    /* Check for file name to be processed */
-    if(argc <= opt_ind) {
-        error_msg("missing file name\n");
-        usage();
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Retrieve file name */
-    parms->fname = HDstrdup(argv[opt_ind]);
-    opt_ind++;
-
-    /* Check for group(s) to be created */
-    if(argc <= opt_ind) {
-        error_msg("missing group name(s)\n");
-        usage();
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Allocate space for the group name pointers */
-    parms->ngroups = (argc - opt_ind);
-    parms->groups = (char **)HDmalloc(parms->ngroups * sizeof(char *));
-
-    /* Retrieve the group names */
-    curr_group = 0;
-    while(opt_ind < argc) {
-        parms->groups[curr_group] = HDstrdup(argv[opt_ind]);
-        curr_group++;
-        opt_ind++;
-    } /* end while */
-
-#ifdef QAK
-HDfprintf(stderr, "parms->parents = %t\n", parms->parents);
-HDfprintf(stderr, "parms->verbose = %t\n", parms->verbose);
-HDfprintf(stderr, "parms->fname = '%s'\n", parms->fname);
-HDfprintf(stderr, "parms->ngroups = %Zu\n", parms->ngroups);
-for(curr_group = 0; curr_group < parms->ngroups; curr_group++)
-    HDfprintf(stderr, "parms->group[%Zu] = '%s'\n", curr_group, parms->groups[curr_group]);
-#endif /* QAK */
-
-    return(0);
-} /* parse_command_line() */
-
-

-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: Create group(s) in an HDF5 file
- *
- * Programmer: Quincey Koziol, 2/13/2007
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, const char *argv[])
-{
-    hid_t fid;                  /* HDF5 file ID */
-    hid_t fapl_id;              /* File access property list ID */
-    hid_t lcpl_id;              /* Link creation property list ID */
-    size_t curr_group;          /* Current group to create */
-
-    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();
-
-    /* Parse command line */
-    HDmemset(&params, 0, sizeof(params));
-    if(parse_command_line(argc, argv, &params) < 0) {
-        error_msg("unable to parse command line arguments\n");
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Create file access property list */
-    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-        error_msg("Could not create file access property list\n");
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Check for creating groups with new format version */
-    if(params.latest) {
-        /* Set the "use the latest version of the format" bounds */
-        if(H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) {
-            error_msg("Could not set property for using latest version of the format\n");
-            leave(EXIT_FAILURE);
-        } /* end if */
-
-        /* Display some output if requested */
-        if(params.verbose)
-            printf("%s: Creating groups with latest version of the format\n", h5tools_getprogname());
-    } /* end if */
-
-    /* Attempt to open an existing HDF5 file first */
-    fid = h5tools_fopen(params.fname, H5F_ACC_RDWR, fapl_id, NULL, NULL, 0);
-
-    /* If we couldn't open an existing file, try creating file */
-    /* (use "EXCL" instead of "TRUNC", so we don't blow away existing non-HDF5 file) */
-    if(fid < 0)
-        fid = H5Fcreate(params.fname, H5F_ACC_EXCL, H5P_DEFAULT, fapl_id);
-
-    /* Test for error in opening file */
-    if(fid < 0) {
-        error_msg("Could not open output file '%s'\n", params.fname);
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Create link creation property list */
-    if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) {
-        error_msg("Could not create link creation property list\n");
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Check for creating intermediate groups */
-    if(params.parents) {
-        /* Set the intermediate group creation property */
-        if(H5Pset_create_intermediate_group(lcpl_id, TRUE) < 0) {
-            error_msg("Could not set property for creating parent groups\n");
-            leave(EXIT_FAILURE);
-        } /* end if */
-
-        /* Display some output if requested */
-        if(params.verbose)
-            printf("%s: Creating parent groups\n", h5tools_getprogname());
-    } /* end if */
-
-    /* Loop over creating requested groups */
-    for(curr_group = 0; curr_group < params.ngroups; curr_group++) {
-        hid_t gid;              /* Group ID */
-
-        /* Attempt to create a group */
-        if((gid = H5Gcreate2(fid, params.groups[curr_group], lcpl_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
-            error_msg("Could not create group '%s'\n", params.groups[curr_group]);
-            leave(EXIT_FAILURE);
-        } /* end if */
-
-        /* Close the group */
-        if(H5Gclose(gid) < 0) {
-            error_msg("Could not close group '%s'??\n", params.groups[curr_group]);
-            leave(EXIT_FAILURE);
-        } /* end if */
-
-        /* Display some output if requested */
-        if(params.verbose)
-            printf("%s: created group '%s'\n", h5tools_getprogname(), params.groups[curr_group]);
-    } /* end for */
-
-    /* Close link creation property list */
-    if(H5Pclose(lcpl_id) < 0) {
-        error_msg("Could not close link creation property list\n");
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Close file */
-    if(H5Fclose(fid) < 0) {
-        error_msg("Could not close output file '%s'??\n", params.fname);
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Close file access property list */
-    if(H5Pclose(fapl_id) < 0) {
-        error_msg("Could not close file access property list\n");
-        leave(EXIT_FAILURE);
-    } /* end if */
-
-    /* Shut down h5tools lib */
-    h5tools_close();
-
-    leave(EXIT_SUCCESS);
-} /* end main() */
-
diff --git a/tools/misc/h5perf_gentest.c b/tools/misc/h5perf_gentest.c
deleted file mode 100644
index 50c18c1..0000000
--- a/tools/misc/h5perf_gentest.c
+++ /dev/null
@@ -1,598 +0,0 @@
-/*****************************************************************************
-  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/h5redeploy.in b/tools/misc/h5redeploy.in
deleted file mode 100644
index 6b6ef87..0000000
--- a/tools/misc/h5redeploy.in
+++ /dev/null
@@ -1,218 +0,0 @@
-#! /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.
-#
-
-## Update HDF5 compiler tools after the HDF5 software has been installed  ##
-## in a new location.							  ##
-## For help page, use "h5redeploy -help"				  ##
-##									  ##
-
-# Constants definitions
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-# Function definitions
-
-# show help page
-usage() {
-  # A wonderfully informative "usage" message.
-  echo "usage: $prog_name [OPTIONS]"
-  echo "  OPTIONS:"
-  echo "    -help|help        This help message"
-  echo "    -echo             Show all the shell commands executed"
-  echo "    -force            No prompt, just do it"
-  echo "    -prefix=DIR       New directory to find HDF5 lib/ and include/"
-  echo "                        subdirectories [default: current directory]"
-  echo "    -exec-prefix=DIR  New directory to find HDF5 lib/"
-  echo "                        subdirectory [default: <prefix>]"
-  echo "    -libdir=DIR       New directory for the HDF5 lib directory"
-  echo "                        [default: <exec-prefix>/lib]"
-  echo "    -includedir=DIR   New directory for the HDF5 header files"
-  echo "                        [default: <prefix>/include]"
-  echo "    -tool=TOOL        Tool to update. TOOL must be in the current"
-  echo "                        directory and writable. [default: $h5tools]"
-  echo "    -show             Show the commands without executing them"
-  echo " "
-  exit $EXIT_FAILURE
-}
-
-# display variable values
-dump_vars(){
-    echo "====Showing all variable values====="
-    echo prefix=$prefix
-    echo h5tools=$h5tools
-    echo "====End Showing====="
-}
-
-# show actions to be taken
-show_action()
-{
-    echo "Update the following tools because they are now installed at a new directory"
-    for t in $foundtools; do
-	echo "${t}:"
-	echo "   current setting=`sed -e '/^prefix=/s/prefix=//p' -e d $t`"
-	echo "   new     setting="\""$prefix"\"
-    done
-}
-
-
-# Report Error message
-ERROR()
-{
-    echo "***ERROR***"
-    echo "$1"
-}
-
-# Main
-#
-############################################################################
-## 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>.		  ##
-## Not used here:							  ##
-## bindir	executables, <exec_prefix/bin>.				  ##
-############################################################################
-# Initialization
-h5tools="h5cc h5pcc h5fc h5pfc h5c++"	# possible hdf5 tools
-foundtools=		# tools found and will be modified
-fmode=			# force mode, default is off
-prefix=
-exec_prefix=
-libdir=
-includedir=
-
-# Parse options
-for arg in $@ ; do
-  case "$arg" in
-    -prefix=*)
-      prefix="`echo $arg | cut -f2 -d=`"
-      ;;
-    -exec-prefix=*)
-      exec_prefix="`echo $arg | cut -f2 -d=`"
-      ;;
-    -libdir=*)
-      libdir="`echo $arg | cut -f2 -d=`"
-      ;;
-    -includedir=*)
-      includedir="`echo $arg | cut -f2 -d=`"
-      ;;
-    -echo)
-      set -x
-      ;;
-    -show)
-      SHOW="echo"
-      ;;
-    -tool=*)
-      h5tools="`echo $arg | cut -f2 -d=`"
-      ;;
-    -help|help)
-      usage
-      ;;
-    -force)
-      fmode=yes
-      ;;
-    *)
-      ERROR "Unknown Option($arg)"
-      usage
-      exit $EXIT_FAILURE
-      ;;
-  esac
-done
-
-# Set to default value, one above where i am, if not given by user
-if [ -z "$prefix" ]; then
-    prefix=`(cd ..;pwd)`
-fi
-if [ -z "$exec_prefix" ]; then
-    exec_prefix='${prefix}'		# use single quotes to prevent expansion of $
-fi
-if [ -z "$libdir" ]; then
-    libdir='${exec_prefix}'/lib	# use single quotes to prevent expansion of $
-fi
-if [ -z "$includedir" ]; then
-    includedir='${prefix}'/include # use single quotes to prevent expansion of $
-fi
-
-for x in $h5tools; do
-    if [ -f $x ]; then
-	foundtools="$foundtools $x"
-	if [ ! -w $x ]; then
-	    ERROR "h5tool($x) is not writable"
-	    exit $EXIT_FAILURE
-	fi
-    fi
-done
-
-if [ -z "$foundtools" ]; then
-    ERROR "found no tools to modify"
-    exit $EXIT_FAILURE
-fi
-
-# Show actions to be taken and get consent
-show_action
-# Ask confirmation unless fmode is on
-if [ x-$fmode = x- ]; then
-    echo "Continue? (yes/no)"
-    read ansx
-    ans=`echo $ansx | tr "[A-Z]" "[a-z]"`
-    if [ x-$ans != x-yes ]; then
-	echo ABORT.  No tools changed.
-	exit $EXIT_FAILURE
-    fi
-fi
-
-
-# Create the update commands
-CMDFILE=/tmp/h5redeploy.$$
-touch $CMDFILE
-chmod 0600 $CMDFILE
-echo "/^prefix=/c"                    >> $CMDFILE
-echo prefix=\""$prefix"\"             >> $CMDFILE
-echo .                                >> $CMDFILE
-echo "/^exec_prefix=/c"               >> $CMDFILE
-echo exec_prefix=\""$exec_prefix"\"   >> $CMDFILE
-echo .                                >> $CMDFILE
-echo "/^libdir=/c"                    >> $CMDFILE
-echo libdir=\""$libdir"\"             >> $CMDFILE
-echo .                                >> $CMDFILE
-echo "/^includedir=/c"                >> $CMDFILE
-echo includedir=\""$includedir"\"     >> $CMDFILE
-echo .                                >> $CMDFILE
-(echo w; echo q)                      >> $CMDFILE
-
-
-# Update them
-if [ "$SHOW" = "echo" ]; then
-    echo "===Update commands are:===="
-    cat $CMDFILE
-    echo "===End Update commands====="
-fi
-
-for t in $foundtools; do
-    echo Update $t ...
-    COMMAND="ed - $t"
-    if [ "$SHOW" = "echo" ]; then
-	echo $COMMAND
-    else
-	$COMMAND < $CMDFILE
-    fi
-done
-
-
-# Cleanup
-rm -f $CMDFILE
-exit $EXIT_SUCCESS
diff --git a/tools/misc/h5repart.c b/tools/misc/h5repart.c
deleted file mode 100644
index 37d505a..0000000
--- a/tools/misc/h5repart.c
+++ /dev/null
@@ -1,512 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Robb Matzke <matzke at llnl.gov>
- *              Wednesday, May 13, 1998
- *
- * Purpose:	Repartitions a file family.  This program can be used to
- *		split a single file into a family of files, join a family of
- *		files into a single file, or copy one family to another while
- *		changing the size of the family members.  It can also be used
- *		to copy a single file to a single file with holes.
- */
-
-/* See H5private.h for how to include system headers */
-#include "hdf5.h"
-#include "H5private.h"
-#ifdef H5_STDC_HEADERS
-#   include <ctype.h>
-#   include <errno.h>
-#   include <fcntl.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#   include <string.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#   include <sys/types.h>
-#   include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#   include <sys/stat.h>
-#endif
-
-#ifndef FALSE
-#   define FALSE	0
-#endif
-#ifndef TRUE
-#   define TRUE 	1
-#endif
-#   define NAMELEN	4096
-#define GB	*1024*1024*1024
-
-#ifndef MIN
-#   define MIN(X,Y)	((X)<(Y)?(X):(Y))
-#endif
-#ifndef MIN3
-#   define MIN3(X,Y,Z)	MIN(MIN(X,Y),Z)
-#endif
-
-/*Make these 2 private properties(defined in H5Fprivate.h) available to h5repart.
- *The first one updates the member file size in the superblock.  The second one
- *change file driver from family to sec2. */
-#define H5F_ACS_FAMILY_NEWSIZE_NAME            "family_newsize"
-#define H5F_ACS_FAMILY_TO_SEC2_NAME            "family_to_sec2"
-
-

-/*-------------------------------------------------------------------------
- * Function:	usage
- *
- * Purpose:	Prints a usage message.
- *
- * Return:	void
- *
- * Programmer:	Robb Matzke
- *              Wednesday, May 13, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage (const char *progname)
-{
-    fprintf(stderr, "usage: %s [-v] [-V] [-[b|m] N[g|m|k]] [-family_to_sec2] SRC DST\n",
-	    progname);
-    fprintf(stderr, "   -v     Produce verbose output\n");
-    fprintf(stderr, "   -V     Print a version number and exit\n");
-    fprintf(stderr, "   -b N   The I/O block size, defaults to 1kB\n");
-    fprintf(stderr, "   -m N   The destination member size or 1GB\n");
-    fprintf(stderr, "   -family_to_sec2   Change file driver from family to sec2\n");
-    fprintf(stderr, "   SRC    The name of the source file\n");
-    fprintf(stderr, "   DST	The name of the destination files\n");
-    fprintf(stderr, "Sizes may be suffixed with `g' for GB, `m' for MB or "
-	    "`k' for kB.\n");
-    fprintf(stderr, "File family names include an integer printf "
-	    "format such as `%%d'\n");
-    exit (EXIT_FAILURE);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	get_size
- *
- * Purpose:	Reads a size option of the form `-XNS' where `X' is any
- *		letter, `N' is a multi-character positive decimal number, and
- *		`S' is an optional suffix letter in the set [GgMmk].  The
- *		option may also be split among two arguments as: `-X NS'.
- *		The input value of ARGNO is the argument number for the
- *		switch in the ARGV vector and ARGC is the number of entries
- *		in that vector.
- *
- * Return:	Success:	The value N multiplied according to the
- *				suffix S.  On return ARGNO will be the number
- *				of the next argument to process.
- *
- *		Failure:	Calls usage() which exits with a non-zero
- *				status.
- *
- * Programmer:	Robb Matzke
- *              Wednesday, May 13, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static off_t
-get_size (const char *progname, int *argno, int argc, char *argv[])
-{
-    off_t	retval=-1;
-    char	*suffix;
-
-    if (isdigit ((int)(argv[*argno][2]))) {
-	retval = strtol (argv[*argno]+2, &suffix, 10);
-	(*argno)++;
-    } else if (argv[*argno][2] || *argno+1>=argc) {
-	usage (progname);
-    } else {
-	retval = strtol (argv[*argno+1], &suffix, 0);
-	if (suffix==argv[*argno+1]) usage (progname);
-	*argno += 2;
-    }
-    if (suffix && suffix[0] && !suffix[1]) {
-	switch (*suffix) {
-	case 'G':
-	case 'g':
-	    retval *= 1024 * 1024 * 1024;
-	    break;
-	case 'M':
-	case 'm':
-	    retval *= 1024 * 1024;
-	    break;
-	case 'k':
-	    retval *= 1024;
-	    break;
-	default:
-	    usage (progname);
-	}
-    } else if (suffix && suffix[0]) {
-	usage (progname);
-    }
-    return retval;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	main
- *
- * Purpose:	Split an hdf5 file
- *
- * Return:	Success:
- *
- *		Failure:
- *
- * Programmer:	Robb Matzke
- *              Wednesday, May 13, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main (int argc, char *argv[])
-{
-    const char	*prog_name;		/*program name			*/
-    size_t	blk_size=1024;		/*size of each I/O block	*/
-    char	*buf=NULL;		/*I/O block buffer		*/
-    size_t	n, i;			/*counters			*/
-    ssize_t	nio;			/*I/O return value		*/
-    int		argno=1;		/*program argument number	*/
-    int		src, dst=-1;		/*source & destination files	*/
-    int		need_seek=FALSE;	/*destination needs to seek?	*/
-    int		need_write;		/*data needs to be written?	*/
-    /*struct stat	sb;			temporary file stat buffer	*/
-	/*struct _stati64 sb;*/
-	h5_stat_t sb;
-
-    int		verbose=FALSE;		/*display file names?		*/
-
-    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=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_act_size;		/*source actual member size	*/
-    off_t	dst_size=1 GB;		/*destination logical memb size	*/
-    hid_t       fapl;                   /*file access property list     */
-    hid_t       file;
-    hsize_t     hdsize;                 /*destination logical memb size */
-    hbool_t     family_to_sec2=FALSE;   /*change family to sec2 driver? */
-
-    /*
-     * Get the program name from argv[0]. Use only the last component.
-     */
-    if ((prog_name=strrchr (argv[0], '/'))) prog_name++;
-    else prog_name = argv[0];
-
-    /*
-     * 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);
-        } 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);
-        } /* 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
-     * of the first member determines the logical size of all the members.
-     */
-    if (argno>=argc) usage (prog_name);
-    src_gen_name = argv[argno++];
-    sprintf (src_name, src_gen_name, src_membno);
-    src_is_family = strcmp (src_name, src_gen_name);
-
-    if ((src=HDopen(src_name, O_RDONLY,0))<0) {
-        perror (src_name);
-        exit (EXIT_FAILURE);
-    }
-
-    if (HDfstat(src, &sb)<0) {
-        perror ("fstat");
-        exit (EXIT_FAILURE);
-    }
-    src_size = src_act_size = sb.st_size;
-    if (verbose) fprintf (stderr, "< %s\n", src_name);
-
-    /*
-     * Get the name for the destination file and open the first member.
-     */
-    if (argno>=argc) usage (prog_name);
-    dst_gen_name = argv[argno++];
-    sprintf (dst_name, dst_gen_name, dst_membno);
-    dst_is_family = strcmp (dst_name, dst_gen_name);
-
-    if ((dst=HDopen (dst_name, O_RDWR|O_CREAT|O_TRUNC, 0666))<0) {
-	perror (dst_name);
-	exit (EXIT_FAILURE);
-    }
-    if (verbose) fprintf (stderr, "> %s\n", dst_name);
-
-    /* No more arguments */
-    if (argno<argc) usage (prog_name);
-
-    /* Now the real work, split the file */
-    buf = (char *)HDmalloc(blk_size);
-    while (src_offset<src_size) {
-
-	/* Read a block.  The amount to read is the minimum of:
-	 *    1. The I/O block size
-	 *    2. What's left to write in the destination member
-	 *    3. Left over zeros or what's left in the source member.
-	 */
-	n = blk_size;
-	if (dst_is_family) n = (size_t)MIN((off_t)n, dst_size-dst_offset);
-	if (left_overs) {
-	    n = (size_t)MIN ((off_t)n, left_overs);
-	    left_overs -= n;
-	    need_write = FALSE;
-	} else if (src_offset<src_act_size) {
-	    n = (size_t)MIN ((off_t)n, src_act_size-src_offset);
-	    if ((nio=HDread (src, buf, n))<0) {
-		perror ("read");
-		exit (EXIT_FAILURE);
-	    } else if ((size_t)nio!=n) {
-		fprintf (stderr, "%s: short read\n", src_name);
-		exit (EXIT_FAILURE);
-	    }
-	    for (i=0; i<n; i++) {
-		if (buf[i]) break;
-	    }
-	    need_write = (i<n);
-	} else {
-	    n = 0;
-	    left_overs = src_size - src_act_size;
-	    need_write = FALSE;
-	}
-
-	/*
-	 * If the block contains non-zero data then write it to the
-	 * destination, otherwise just remember that we'll have to do a seek
-	 * later in the destination when we finally get non-zero data.
-	 */
-	if (need_write) {
-	    if (need_seek && HDlseek (dst, dst_offset, SEEK_SET)<0) {
-		perror ("HDlseek");
-		exit (EXIT_FAILURE);
-	    }
-	    if ((nio=HDwrite (dst, buf, n))<0) {
-		perror ("write");
-		exit (EXIT_FAILURE);
-	    } else if ((size_t)nio!=n) {
-		fprintf (stderr, "%s: short write\n", dst_name);
-		exit (EXIT_FAILURE);
-	    }
-	    need_seek = FALSE;
-	} else {
-	    need_seek = TRUE;
-	}
-
-	/*
-	 * Update the source offset and open the next source family member if
-	 * necessary.  The source stream ends at the first member which
-	 * cannot be opened because it doesn't exist.  At the end of the
-	 * source stream, update the destination offset and break out of the
-	 * loop.   The destination offset must be updated so we can fix
-	 * trailing holes.
-	 */
-	src_offset += n;
-	if (src_offset==src_act_size) {
-	    HDclose (src);
-	    if (!src_is_family) {
-		dst_offset += n;
-		break;
-	    }
-	    sprintf (src_name, src_gen_name, ++src_membno);
-	    if ((src=HDopen (src_name, O_RDONLY,0))<0 && ENOENT==errno) {
-		dst_offset += n;
-		break;
-	    } else if (src<0) {
-		perror (src_name);
-		exit (EXIT_FAILURE);
-	    }
-	    if (HDfstat (src, &sb)<0) {
-		perror ("fstat");
-		exit (EXIT_FAILURE);
-	    }
-	    src_act_size = sb.st_size;
-	    if (src_act_size>src_size) {
-		fprintf (stderr, "%s: member truncated to %lu bytes\n",
-			 src_name, (unsigned long)src_size);
-	    }
-	    src_offset = 0;
-	    if (verbose) fprintf (stderr, "< %s\n", src_name);
-	}
-
-	/*
-	 * Update the destination offset, opening a new member if one will be
-	 * needed. The first member is extended to the logical member size
-	 * but other members might be smaller if they end with a hole.
-	 */
-	dst_offset += n;
-	if (dst_is_family && dst_offset==dst_size) {
-	    if (0==dst_membno) {
-		if (HDlseek (dst, dst_size-1, SEEK_SET)<0) {
-		    perror ("HDHDlseek");
-		    exit (EXIT_FAILURE);
-		}
-		if (HDread (dst, buf, 1)<0) {
-		    perror ("read");
-		    exit (EXIT_FAILURE);
-		}
-		if (HDlseek (dst, dst_size-1, SEEK_SET)<0) {
-		    perror ("HDlseek");
-		    exit (EXIT_FAILURE);
-		}
-		if (HDwrite (dst, buf, 1)<0) {
-		    perror ("write");
-		    exit (EXIT_FAILURE);
-		}
-	    }
-	    HDclose (dst);
-	    sprintf (dst_name, dst_gen_name, ++dst_membno);
-	    if ((dst=HDopen (dst_name, O_RDWR|O_CREAT|O_TRUNC, 0666))<0) {
-		perror (dst_name);
-		exit (EXIT_FAILURE);
-	    }
-	    dst_offset = 0;
-	    need_seek = FALSE;
-	    if (verbose) fprintf (stderr, "> %s\n", dst_name);
-	}
-    }
-
-    /*
-     * Make sure the last family member is the right size and then close it.
-     * The last member can't end with a hole or hdf5 will think that the
-     * family has been truncated.
-     */
-    if (need_seek) {
-	if (HDlseek (dst, dst_offset-1, SEEK_SET)<0) {
-	    perror ("HDlseek");
-	    exit (EXIT_FAILURE);
-	}
-	if (HDread (dst, buf, 1)<0) {
-	    perror ("read");
-	    exit (EXIT_FAILURE);
-	}
-	if (HDlseek (dst, dst_offset-1, SEEK_SET)<0) {
-	    perror ("HDlseek");
-	    exit (EXIT_FAILURE);
-	}
-	if (HDwrite (dst, buf, 1)<0) {
-	    perror ("write");
-	    exit (EXIT_FAILURE);
-	}
-    }
-    HDclose (dst);
-
-    /* Modify family driver information saved in superblock through private property.
-     * These private properties are for this tool only. */
-    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) {
-        perror ("H5Pcreate");
-        exit (EXIT_FAILURE);
-    }
-
-    if(family_to_sec2) {
-        /* The user wants to change file driver from family to sec2. Open the file
-         * with sec2 driver.  This property signals the library to ignore the family
-         * driver information saved in the superblock. */
-        if(H5Pset(fapl, H5F_ACS_FAMILY_TO_SEC2_NAME, &family_to_sec2) < 0) {
-            perror ("H5Pset");
-            exit (EXIT_FAILURE);
-        }
-    } else {
-        /* Modify family size saved in superblock through private property. It signals
-         * library to save the new member size(specified in command line) in superblock.
-         * This private property is for this tool only. */
-        if(H5Pset_fapl_family(fapl, H5F_FAMILY_DEFAULT, H5P_DEFAULT) < 0) {
-            perror ("H5Pset_fapl_family");
-            exit (EXIT_FAILURE);
-        }
-
-        /* Set the property of the new member size as hsize_t */
-        hdsize = dst_size;
-        if(H5Pset(fapl, H5F_ACS_FAMILY_NEWSIZE_NAME, &hdsize) < 0) {
-            perror ("H5Pset");
-            exit (EXIT_FAILURE);
-        }
-    }
-
-    /* If the new file is a family file, try to open file for "read and write" to
-     * flush metadata. Flushing metadata will update the superblock to the new
-     * member size.  If the original file is a family file and the new file is a sec2
-     * file, the property FAMILY_TO_SEC2 will signal the library to switch to sec2
-     * driver when the new file is opened.  If the original file is a sec2 file and the
-     * new file can only be a sec2 file, reopen the new file should fail.  There's
-     * nothing to do in this case. */
-    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(src_name);
-    HDfree(dst_name);
-    HDfree(buf);
-    return EXIT_SUCCESS;
-} /* end main */
diff --git a/tools/misc/h5repart_gentest.c b/tools/misc/h5repart_gentest.c
deleted file mode 100644
index f7d9a73..0000000
--- a/tools/misc/h5repart_gentest.c
+++ /dev/null
@@ -1,100 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Raymond Lu<slu at ncsa.uiuc.edu>
- *              June 1, 2005
- *
- * Purpose:     Generate a family file of 1024 bytes for each member
- *              for h5repart test.
- */
-#include "hdf5.h"
-#include "H5private.h"
-
-#define FAMILY_NUMBER   4
-#define FAMILY_SIZE     1024
-#define FILENAME        "family_file%05d.h5"
-
-int main(void)
-{
-    hid_t       file=(-1), fapl, space=(-1), dset=(-1);
-    char        dname[]="dataset";
-    int         i, j;
-    int         buf[FAMILY_NUMBER][FAMILY_SIZE];
-    hsize_t     dims[2]={FAMILY_NUMBER, FAMILY_SIZE};
-
-    /* Set property list and file name for FAMILY driver */
-    if ((fapl=H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-        perror ("H5Pcreate");
-        exit (EXIT_FAILURE);
-    }
-
-    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT) < 0) {
-        perror ("H5Pset_fapl_family");
-        exit (EXIT_FAILURE);
-    }
-
-    if((file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) {
-        perror("H5Fcreate");
-        exit(EXIT_FAILURE);
-    }
-
-    /* Create and write dataset */
-    if((space = H5Screate_simple(2, dims, NULL)) < 0) {
-        perror("H5Screate_simple");
-        exit(EXIT_FAILURE);
-    }
-
-
-    if((dset = H5Dcreate2(file, dname, H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
-        perror("H5Dcreate2");
-        exit(EXIT_FAILURE);
-    }
-
-
-    for(i = 0; i<FAMILY_NUMBER; i++)
-        for(j = 0; j<FAMILY_SIZE; j++)
-            buf[i][j] = i * 10000 + j;
-
-    if(H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
-        perror("H5Dwrite");
-        exit(EXIT_FAILURE);
-    }
-
-
-    if(H5Sclose(space) < 0) {
-        perror ("H5Sclose");
-        exit (EXIT_FAILURE);
-    }
-
-    if(H5Dclose(dset) < 0) {
-        perror ("H5Dclose");
-        exit (EXIT_FAILURE);
-    }
-
-    if(H5Pclose(fapl) < 0) {
-        perror ("H5Pclose");
-        exit (EXIT_FAILURE);
-    }
-
-    if(H5Fclose(file) < 0) {
-        perror ("H5Fclose");
-        exit (EXIT_FAILURE);
-    }
-
-    puts(" PASSED"); fflush(stdout);
-
-    return 0;
-}
diff --git a/tools/misc/repart_test.c b/tools/misc/repart_test.c
deleted file mode 100644
index e6da779..0000000
--- a/tools/misc/repart_test.c
+++ /dev/null
@@ -1,165 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Raymond Lu <slu at ncsa.uiuc.edu>
- *              June 1, 2005
- *
- * Purpose:	This program tests family files after being repartitioned
- *              by h5repart.  It simply tries to reopen the files with
- *              correct family driver and member size.
- */
-#include "hdf5.h"
-
-#define KB                      1024
-#define FAMILY_H5REPART_SIZE1   20000
-#define FAMILY_H5REPART_SIZE2   (5*KB)
-#define MAX(a,b) (a>b ? a:b)
-
-const char *FILENAME[] = {
-    "fst_family%05d.h5",
-    "scd_family%05d.h5",
-    "family_to_sec2.h5",
-    NULL
-};
-
-herr_t test_family_h5repart_opens(void);
-herr_t test_sec2_h5repart_opens(void);
-
-

-/*-------------------------------------------------------------------------
- * Function:    test_family_h5repart_opens
- *
- * Purpose:     Tries to reopen family files.
- *
- * Return:      Success:        exit(0)
- *
- *              Failure:        exit(1)
- *
- * Programmer:  Raymond Lu
- *              June 1, 2005
- *
- * Modifications:
- *-------------------------------------------------------------------------
- */
-herr_t
-test_family_h5repart_opens(void)
-{
-    hid_t       file=(-1), fapl=(-1);
-
-    /* open 1st file(single member file) with correct family size(20000 byte) */
-    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0)
-        goto error;
-
-    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_H5REPART_SIZE1, H5P_DEFAULT)<0)
-        goto error;
-
-    if((file=H5Fopen(FILENAME[0], H5F_ACC_RDWR, fapl))<0)
-        goto error;
-
-    if(H5Fclose(file)<0)
-        goto error;
-
-    /* open 2nd file(multiple member files) with correct family size(5KB) */
-    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_H5REPART_SIZE2, H5P_DEFAULT)<0)
-        goto error;
-
-    if((file=H5Fopen(FILENAME[1], H5F_ACC_RDWR, fapl))<0)
-        goto error;
-
-    if(H5Fclose(file)<0)
-        goto error;
-
-    return 0;
-
-error:
-    H5E_BEGIN_TRY {
-        H5Fclose(file);
-    } H5E_END_TRY;
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    test_sec2_h5repart_opens
- *
- * Purpose:     Tries to reopen a sec2 file.
- *
- * Return:      Success:        exit(0)
- *
- *              Failure:        exit(1)
- *
- * Programmer:  Raymond Lu
- *              June 21, 2005
- *
- * Modifications:
- *-------------------------------------------------------------------------
- */
-herr_t
-test_sec2_h5repart_opens(void)
-{
-    hid_t       file=(-1);
-
-    /* open the sec2 file */
-    if((file=H5Fopen(FILENAME[2], H5F_ACC_RDWR, H5P_DEFAULT))<0)
-        goto error;
-
-    if(H5Fclose(file)<0)
-        goto error;
-
-    return 0;
-
-error:
-    H5E_BEGIN_TRY {
-        H5Fclose(file);
-    } H5E_END_TRY;
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:    main
- *
- * Purpose:     Tests h5repart-ed family files
- *
- * Return:      Success:        exit(0)
- *
- *              Failure:        exit(1)
- *
- * Programmer:  Raymond Lu
- *              June 1, 2005
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main(void)
-{
-    int                 nerrors=0;
-
-    nerrors += test_family_h5repart_opens()<0   ?1:0;
-    nerrors += test_sec2_h5repart_opens()<0     ?1:0;
-
-    if (nerrors) goto error;
-
-    return 0;
-
-error:
-    nerrors = MAX(1, nerrors);
-    printf("***** %d FAMILY FILE TEST%s FAILED! *****\n",
-            nerrors, 1 == nerrors ? "" : "S");
-    return 1;
-}
diff --git a/tools/misc/talign.c b/tools/misc/talign.c
deleted file mode 100644
index be373e7..0000000
--- a/tools/misc/talign.c
+++ /dev/null
@@ -1,244 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Small program to illustrate the "misalignment" of members within a compound
- * datatype, in a datatype fixed by H5Tget_native_type().
- */
-#include <string.h>
-#include <stdlib.h>
-/*#include <unistd.h>	*//* Required for unlink() */
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5tools.h"
-
-const char *fname = "talign.h5";
-const char *setname = "align";
-
-/*
- * This program assumes that there is no extra space between the members 'Ok'
- * and 'Not Ok', (there shouldn't be because they are of the same atomic type
- * H5T_NATIVE_FLOAT, and they are placed within the compound next to one
- * another per construction)
- */
-
-int main(void)
-{
-    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];
-
-    char string5[5];
-    float fok[2] = {1234.0f, 2341.0f};
-    float fnok[2] = {5678.0f, 6785.0f};
-    float *fptr = NULL;
-
-    char *data = NULL;
-
-    int result = 0;
-    herr_t error = 1;
-
-    printf("%-70s", "Testing alignment in compound datatypes");
-
-    strcpy(string5, "Hi!");
-    HDunlink(fname);
-    fil = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    if (fil < 0) {
-        puts("*FAILED*");
-        return 1;
-    }
-
-    H5E_BEGIN_TRY {
-        (void)H5Ldelete(fil, setname, H5P_DEFAULT);
-    } H5E_END_TRY;
-
-    cs6 = H5Tcopy(H5T_C_S1);
-    H5Tset_size(cs6, sizeof(string5));
-    H5Tset_strpad(cs6, H5T_STR_NULLPAD);
-
-    cmp = H5Tcreate(H5T_COMPOUND, sizeof(fok) + sizeof(string5) + sizeof(fnok));
-    H5Tinsert(cmp, "Awkward length", 0, cs6);
-
-    cdim[0] = sizeof(fok) / sizeof(float);
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
-    H5Tinsert(cmp, "Ok", sizeof(string5), array_dt);
-    H5Tclose(array_dt);
-
-    cdim[0] = sizeof(fnok) / sizeof(float);
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
-    H5Tinsert(cmp, "Not Ok", sizeof(fok) + sizeof(string5), array_dt);
-    H5Tclose(array_dt);
-
-    fix = h5tools_get_native_type(cmp);
-
-    cmp1 = H5Tcreate(H5T_COMPOUND, sizeof(fok));
-
-    cdim[0] = sizeof(fok) / sizeof(float);
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
-    H5Tinsert(cmp1, "Ok", 0, array_dt);
-    H5Tclose(array_dt);
-
-    cmp2 = H5Tcreate(H5T_COMPOUND, sizeof(string5));
-    H5Tinsert(cmp2, "Awkward length", 0, cs6);
-
-    cmp3 = H5Tcreate(H5T_COMPOUND, sizeof(fnok));
-
-    cdim[0] = sizeof(fnok) / sizeof(float);
-    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
-    H5Tinsert(cmp3, "Not Ok", 0, array_dt);
-    H5Tclose(array_dt);
-
-    plist = H5Pcreate(H5P_DATASET_XFER);
-    if((error = H5Pset_preserve(plist, 1)) < 0) 
-        goto out;
-
-    /*
-     * Create a small dataset, and write data into it we write each field
-     * in turn so that we are avoid alignment issues at this point
-     */
-    dim[0] = 1;
-    spc = H5Screate_simple(1, dim, NULL);
-    set = H5Dcreate2(fil, setname, cmp, spc, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    H5Dwrite(set, cmp1, spc, H5S_ALL, plist, fok);
-    H5Dwrite(set, cmp2, spc, H5S_ALL, plist, string5);
-    H5Dwrite(set, cmp3, spc, H5S_ALL, plist, fnok);
-
-    H5Dclose(set);
-
-    /* Now open the set, and read it back in */
-    data = (char *)HDmalloc(H5Tget_size(fix));
-
-    if(!data) {
-        perror("malloc() failed");
-        abort();
-    }
-
-    set = H5Dopen2(fil, setname, H5P_DEFAULT);
-
-    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(!(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;
-        mname = H5Tget_member_name(fix, 0);
-        printf("%14s (%2d) %6s = %s\n",
-            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,0),
-            string5, (char *)(data + H5Tget_member_offset(fix, 0)));
-        if(mname)
-            H5free_memory(mname);
-
-        fptr = (float *)(data + H5Tget_member_offset(fix, 1));
-        mname = H5Tget_member_name(fix, 1);
-        printf("Data comparison:\n"
-            "%14s (%2d) %6f = %f\n"
-            "                    %6f = %f\n",
-            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,1),
-            (double)fok[0], (double)fptr[0],
-            (double)fok[1], (double)fptr[1]);
-        if(mname)
-            H5free_memory(mname);
-
-        fptr = (float *)(data + H5Tget_member_offset(fix, 2));
-        mname = H5Tget_member_name(fix, 2);
-        printf("%14s (%2d) %6f = %f\n"
-            "                    %6f = %6f\n",
-            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,2),
-            (double)fnok[0], (double)fptr[0],
-            (double)fnok[1], (double)fptr[1]);
-        if(mname)
-            H5free_memory(mname);
-
-        fptr = (float *)(data + H5Tget_member_offset(fix, 1));
-        printf("\n"
-            "Short circuit\n"
-            "                    %6f = %f\n"
-            "                    %6f = %f\n"
-            "                    %6f = %f\n"
-            "                    %6f = %f\n",
-            (double)fok[0], (double)fptr[0],
-            (double)fok[1], (double)fptr[1],
-            (double)fnok[0], (double)fptr[2],
-            (double)fnok[1], (double)fptr[3]);
-        puts("*FAILED - compound type alignmnent problem*");
-    } else {
-        puts(" PASSED");
-    }
-
-    if(data)
-        HDfree(data);
-    H5Sclose(spc);
-    H5Tclose(cs6);
-    H5Tclose(cmp);
-    H5Tclose(fix);
-    H5Tclose(cmp1);
-    H5Tclose(cmp2);
-    H5Tclose(cmp3);
-    H5Pclose(plist);
-    H5Fclose(fil);
-    HDunlink(fname);
-    fflush(stdout);
-    return result;
-}
-
-/*-------------------------------------------------------------------------
- * Function: h5tools_get_native_type
- *
- * Purpose: Wrapper around H5Tget_native_type() to work around
- *  Problems with bitfields.
- *
- * Return: Success:    datatype ID
- *
- *  Failure:    FAIL
- *
- * Programmer: Quincey Koziol
- *              Tuesday, October  5, 2004
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-hid_t
-h5tools_get_native_type(hid_t type)
-{
-    hid_t p_type;
-    H5T_class_t type_class;
-
-    type_class = H5Tget_class(type);
-    if(type_class==H5T_BITFIELD)
-        p_type=H5Tcopy(type);
-    else
-        p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT);
-
-    return(p_type);
-}
-
diff --git a/tools/misc/testh5clear.sh.in b/tools/misc/testh5clear.sh.in
deleted file mode 100644
index aeac03e..0000000
--- a/tools/misc/testh5clear.sh.in
+++ /dev/null
@@ -1,130 +0,0 @@
-#! /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/testh5mkgrp.sh.in b/tools/misc/testh5mkgrp.sh.in
deleted file mode 100644
index 190e824..0000000
--- a/tools/misc/testh5mkgrp.sh.in
+++ /dev/null
@@ -1,325 +0,0 @@
-#! /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 h5mkgrp tool
-#
-# Quincey Koziol (koziol at hdfgroup.org)
-# Tuesday, February 13, 2007
-#
-
-srcdir=@srcdir@
-
-TESTNAME=h5mkgrp
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-H5MKGRP=h5mkgrp             # The tool name
-H5MKGRP_BIN=`pwd`/$H5MKGRP  # The path of the tool binary
-H5LS=h5ls                   # The h5ls tool name 
-H5LS_ARGS=-vr               # Arguments to the h5ls tool
-H5LS_BIN=`pwd`/../h5ls/$H5LS # The path of the h5ls tool binary
-
-RM='rm -rf'
-CMP='cmp'
-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_H5MKGRP_TESTFILES="$SRC_TOOLS/misc/testfiles"
-
-TESTDIR=./testgrp
-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.
-# --------------------------------------------------------------------
-
-CMP='cmp -s'
-DIFF='diff -c'
-
-#
-# copy test files and expected output files from source dirs to test dir
-#
-COPY_TESTFILES="
-$SRC_H5MKGRP_TESTFILES/h5mkgrp_help.txt
-$SRC_TOOLS_TESTFILES/h5mkgrp_single.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_single_v.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_single_p.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_single_l.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_several.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_several_v.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_several_p.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_several_l.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_nested_p.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_nested_lp.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_nested_mult_p.ls
-$SRC_TOOLS_TESTFILES/h5mkgrp_nested_mult_lp.ls
-"
-
-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 
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Verifying".
-#
-VERIFY_H5LS() 
-{
-    SPACES="                                                               "
-    echo "Verifying h5ls file structure $* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# Run a test and print PASS or *FAIL*. If h5mkgrp can complete
-# with exit status 0, consider it pass. If a test fails then increment
-# the `nerrors' global variable.
-# Assumed arguments:
-# $* arguments for h5mkgrp.
-
-TOOLTEST() 
-{
-    TESTING $H5MKGRP $@
-    (
-    cd $TESTDIR
-    $RUNSERIAL $H5MKGRP_BIN $@
-    ) > output.out
-    RET=$?
-    if [ $RET != 0 ]; then
-        echo "*FAILED*"
-        echo "failed result is:"
-        cat output.out
-        nerrors="`expr $nerrors + 1`"
-    else
-        echo " PASSED"
-
-        # Clean up output file
-        if test -z "$HDF5_NOCLEANUP"; then
-           rm -f output.out
-        fi
-    fi
-}
-
-# Call the h5ls tool to verify the correct output data in the destination file
-#
-H5LSTEST() 
-{
-    expect="$TESTDIR/`basename $1 .h5`.ls"
-    actual="$TESTDIR/`basename $1 .h5`.out"
-    actual_sav=${actual}-sav
-
-    # Stderr is included in stdout so that the diff can detect
-    # any unexpected output from that stream too.
-    VERIFY_H5LS  $@
-    (
-      cd $TESTDIR
-      $RUNSERIAL $H5LS_BIN $H5LS_ARGS $@
-    ) 2>&1 |sed 's/Modified:.*/Modified:  XXXX-XX-XX XX:XX:XX XXX/' >$actual
-
-    # save actual in case it is needed later.
-    cp $actual $actual_sav
-    STDOUT_FILTER $actual
-    STDERR_FILTER $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 (*.ls) 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_sav
-   fi
-}
-
-# Single run of tool
-#
-# Assumed arguments:
-# $1 is test file name
-# $2 is h5mkgrp options
-# $* are groups to create
-RUNTEST() 
-{
-    FILEOUT=$1
-    shift
-    H5MKGRP_ARGS=$1
-    shift
-
-    # Remove any output file left over from previous test run
-    rm -f $FILEOUT
-
-    # Run test
-    TOOLTEST $H5MKGRP_ARGS $FILEOUT $@
-
-    # Verify that the file created above is correct
-    H5LSTEST $FILEOUT
-
-    # Remove output file created, if the "no cleanup" environment variable is
-    #   not defined
-    if test -z "$HDF5_NOCLEANUP"; then
-        rm -f $TESTDIR/$FILEOUT
-    fi
-}
-
-# Single run of tool
-#
-# Assumed arguments:
-# $1 is test expected output file
-# $2 is h5mkgrp options
-# $* are groups to create
-CMPTEST() 
-{
-    FILEOUT=$1
-    expect="$TESTDIR/`basename $1 .h5`.txt"
-    actual="$TESTDIR/`basename $1 .h5`.out"
-    actual_err="$TESTDIR/`basename $1 .h5`.err"
-    shift
-
-    # Stderr is included in stdout so that the diff can detect
-    # any unexpected output from that stream too.
-    TESTING $H5MKGRP $@
-    (
-    cd $TESTDIR
-    $RUNSERIAL $H5MKGRP_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
-      echo " PASSED"
-   else
-      echo "*FAILED*"
-      echo "    Expected result (*.txt) 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
-   fi
-}
-
-##############################################################################
-###           T H E   T E S T S                                            ###
-##############################################################################
-# prepare for test
-COPY_TESTFILES_TO_TESTDIR
-
-# Check that help & version is displayed properly
-CMPTEST h5mkgrp_help.h5 "-h"
-#CMPTEST h5mkgrp_version.h5 "-V"
-
-# Create single group at root level
-RUNTEST h5mkgrp_single.h5 " " single
-RUNTEST h5mkgrp_single_v.h5 "-v" single
-RUNTEST h5mkgrp_single_p.h5 "-p" single
-RUNTEST h5mkgrp_single_l.h5 "-l" latest
-
-# Create several groups at root level
-RUNTEST h5mkgrp_several.h5 " " one two
-RUNTEST h5mkgrp_several_v.h5 "-v" one two
-RUNTEST h5mkgrp_several_p.h5 "-p" one two
-RUNTEST h5mkgrp_several_l.h5 "-l" one two
-
-# Create various nested groups 
-RUNTEST h5mkgrp_nested_p.h5 "-p" /one/two
-RUNTEST h5mkgrp_nested_lp.h5 "-lp" /one/two
-RUNTEST h5mkgrp_nested_mult_p.h5 "-p" /one/two /three/four
-RUNTEST h5mkgrp_nested_mult_lp.h5 "-lp" /one/two /three/four
-
-# 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/misc/testh5repart.sh.in b/tools/misc/testh5repart.sh.in
deleted file mode 100644
index fc33e0e..0000000
--- a/tools/misc/testh5repart.sh.in
+++ /dev/null
@@ -1,116 +0,0 @@
-#! /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 h5repart tool
-
-srcdir=@srcdir@
-
-TESTNAME=h5repart
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-REPART=h5repart             # The tool name
-REPART_BIN=`pwd`/$REPART    # The path of the tool binary
-
-REPARTED_FAM=repart_test                # The test name
-REPARTED_FAM_BIN=`pwd`/$REPARTED_FAM    # The path of the test binary
-
-nerrors=0
-verbose=yes
-
-test -d ../testfiles || mkdir ../testfiles
-
-actual_dir=`pwd`/../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'
-}
-
-# Run a test and print PASS or *FAIL*.  If a test fails then increment
-# the `nerrors' global variable.
-#
-TOOLTEST() {
-   # Run tool test.
-   TESTING $REPART $@
-   (
-#      echo
-      cd $srcdir/../testfiles
-      $RUNSERIAL $REPART_BIN $@
-   )
-
-   if test $? -eq 0; then
-       echo " PASSED"
-   else
-       echo " FAILED"
-       nerrors=`expr $nerrors + 1`
-   fi
-}
-
-OUTPUTTEST() {
-   # Run test program.
-   TESTING $REPARTED_FAM $@
-   (
-      cd $actual_dir
-      $RUNSERIAL $REPARTED_FAM_BIN $@
-   )
-
-   if test $? -eq 0; then
-       echo " PASSED"
-   else
-       echo " FAILED"
-       nerrors=`expr $nerrors + 1`
-   fi
-}
-
-# Print a "SKIP" message
-SKIP() {
-	 TESTING $REPART $@
-	  echo  " -SKIP-"
-}
-
-##############################################################################
-##############################################################################
-###			  T H E   T E S T S                                ###
-##############################################################################
-##############################################################################
-
-# repartition family member size to 20,000 bytes.
-TOOLTEST -m 20000 family_file%05d.h5 $actual_dir/fst_family%05d.h5
-# repartition family member size to 5 KB.
-TOOLTEST -m 5k family_file%05d.h5 $actual_dir/scd_family%05d.h5
-# convert family file to sec2 file of 20,000 bytes
-TOOLTEST -m 20000 -family_to_sec2 family_file%05d.h5 $actual_dir/family_to_sec2.h5
-
-# test the output files repartitioned above.
-OUTPUTTEST
-echo
-
-# Clean up output file
-if test -z "$HDF5_NOCLEANUP"; then
-    cd $actual_dir
-    rm -f fst_family*.h5 scd_family*.h5 family_to_sec2.h5
-fi
-
-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/misc/vds/CMakeLists.txt b/tools/misc/vds/CMakeLists.txt
deleted file mode 100644
index dcf883c..0000000
--- a/tools/misc/vds/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-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
deleted file mode 100644
index f1ef80c..0000000
--- a/tools/misc/vds/Makefile.am
+++ /dev/null
@@ -1,38 +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.
-##
-## 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
deleted file mode 100644
index d093227..0000000
--- a/tools/misc/vds/Makefile.in
+++ /dev/null
@@ -1,1479 +0,0 @@
-# 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/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
deleted file mode 100644
index 24299d4..0000000
--- a/tools/misc/vds/UC_1.h
+++ /dev/null
@@ -1,150 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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
deleted file mode 100644
index ee56622..0000000
--- a/tools/misc/vds/UC_1_one_dim_gen.c
+++ /dev/null
@@ -1,239 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index 8b9f19a..0000000
--- a/tools/misc/vds/UC_2.h
+++ /dev/null
@@ -1,151 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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
deleted file mode 100644
index c3dfa65..0000000
--- a/tools/misc/vds/UC_2_two_dims_gen.c
+++ /dev/null
@@ -1,230 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index a27c3cf..0000000
--- a/tools/misc/vds/UC_3.h
+++ /dev/null
@@ -1,78 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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
deleted file mode 100644
index 7cb208b..0000000
--- a/tools/misc/vds/UC_3_gaps_gen.c
+++ /dev/null
@@ -1,255 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index bfcafed..0000000
--- a/tools/misc/vds/UC_4.h
+++ /dev/null
@@ -1,86 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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
deleted file mode 100644
index c0bb6b5..0000000
--- a/tools/misc/vds/UC_4_printf_gen.c
+++ /dev/null
@@ -1,219 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index 96b2af3..0000000
--- a/tools/misc/vds/UC_5.h
+++ /dev/null
@@ -1,83 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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
deleted file mode 100644
index 9fa4908..0000000
--- a/tools/misc/vds/UC_5_stride_gen.c
+++ /dev/null
@@ -1,243 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * 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
deleted file mode 100644
index 0e61016..0000000
--- a/tools/misc/vds/UC_common.h
+++ /dev/null
@@ -1,41 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#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/CMakeLists.txt b/tools/perform/CMakeLists.txt
deleted file mode 100644
index 3a60a84..0000000
--- a/tools/perform/CMakeLists.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-cmake_minimum_required (VERSION 3.1.0)
-PROJECT (HDF5_PERFORM )
-
-#-----------------------------------------------------------------------------
-# Apply Definitions to compiler in this directory and below
-#-----------------------------------------------------------------------------
-add_definitions (${HDF_EXTRA_C_FLAGS})
-
-#-----------------------------------------------------------------------------
-# Setup include Directories
-#-----------------------------------------------------------------------------
-INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
-INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib )
-
-# --------------------------------------------------------------------
-# Add the executables
-# --------------------------------------------------------------------
-#-- Adding test for h5perf_serial
-set (h5perf_serial_SRCS
-    ${HDF5_PERFORM_SOURCE_DIR}/sio_perf.c
-    ${HDF5_PERFORM_SOURCE_DIR}/sio_engine.c
-)
-add_executable (h5perf_serial ${h5perf_serial_SRCS})
-TARGET_NAMING (h5perf_serial STATIC)
-TARGET_C_PROPERTIES (h5perf_serial STATIC " " " ")
-target_link_libraries (h5perf_serial ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (h5perf_serial PROPERTIES FOLDER perform)
-
-if (HDF5_BUILD_PERFORM_STANDALONE)
-  #-- Adding test for h5perf_serial_alone
-  set (h5perf_serial_alone_SRCS
-      ${HDF5_PERFORM_SOURCE_DIR}/sio_perf.c
-      ${HDF5_PERFORM_SOURCE_DIR}/sio_engine.c
-  )
-  add_executable (h5perf_serial_alone ${h5perf_serial_alone_SRCS})
-  TARGET_NAMING (h5perf_serial_alone STATIC)
-  TARGET_C_PROPERTIES (h5perf_serial_alone STATIC " " " ")
-  target_link_libraries (h5perf_serial_alone ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-  set_target_properties (h5perf_serial_alone PROPERTIES FOLDER perform)
-  set_property (TARGET h5perf_serial_alone 
-      APPEND PROPERTY COMPILE_DEFINITIONS STANDALONE
-  )
-endif (HDF5_BUILD_PERFORM_STANDALONE)
-
-#-- Adding test for chunk
-set (chunk_SRCS
-    ${HDF5_PERFORM_SOURCE_DIR}/chunk.c
-)
-ADD_EXECUTABLE(chunk ${chunk_SRCS})
-TARGET_NAMING (chunk STATIC)
-TARGET_C_PROPERTIES (chunk STATIC " " " ")
-TARGET_LINK_LIBRARIES(chunk ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (chunk PROPERTIES FOLDER perform)
-
-#-- Adding test for iopipe
-set (iopipe_SRCS
-    ${HDF5_PERFORM_SOURCE_DIR}/iopipe.c
-)
-add_executable (iopipe ${iopipe_SRCS})
-TARGET_NAMING (iopipe STATIC)
-TARGET_C_PROPERTIES (iopipe STATIC " " " ")
-target_link_libraries (iopipe ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (iopipe PROPERTIES FOLDER perform)
-
-#-- Adding test for overhead
-set (overhead_SRCS
-    ${HDF5_PERFORM_SOURCE_DIR}/overhead.c
-)
-add_executable (overhead ${overhead_SRCS})
-TARGET_NAMING (overhead STATIC)
-TARGET_C_PROPERTIES (overhead STATIC " " " ")
-target_link_libraries (overhead ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
-set_target_properties (overhead PROPERTIES FOLDER perform)
-
-if (BUILD_TESTING)
-#-- Adding test for perf_meta
-  set (perf_meta_SRCS
-      ${HDF5_PERFORM_SOURCE_DIR}/perf_meta.c
-  )
-  add_executable (perf_meta ${perf_meta_SRCS})
-  TARGET_NAMING (perf_meta STATIC)
-  TARGET_C_PROPERTIES (perf_meta STATIC " " " ")
-  target_link_libraries (perf_meta ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
-  set_target_properties (perf_meta PROPERTIES FOLDER perform)
-endif (BUILD_TESTING)
-
-#-- Adding test for zip_perf
-set (zip_perf_SRCS
-    ${HDF5_PERFORM_SOURCE_DIR}/zip_perf.c
-)
-add_executable (zip_perf ${zip_perf_SRCS})
-TARGET_NAMING (zip_perf STATIC)
-TARGET_C_PROPERTIES (zip_perf STATIC " " " ")
-target_link_libraries (zip_perf ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-set_target_properties (zip_perf PROPERTIES FOLDER perform)
-
-if (H5_HAVE_PARALLEL AND BUILD_TESTING)
-  #-- Adding test for h5perf
-  set (h5perf_SRCS
-      ${HDF5_PERFORM_SOURCE_DIR}/pio_perf.c
-      ${HDF5_PERFORM_SOURCE_DIR}/pio_engine.c
-  )
-  add_executable (h5perf ${h5perf_SRCS})
-  TARGET_NAMING (h5perf STATIC)
-  TARGET_C_PROPERTIES (h5perf STATIC " " " ")
-  target_link_libraries (h5perf ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
-  set_target_properties (h5perf PROPERTIES FOLDER perform)
-
-  if (HDF5_BUILD_PERFORM_STANDALONE)
-    #-- Adding test for h5perf
-    set (h5perf_alone_SRCS
-        ${HDF5_PERFORM_SOURCE_DIR}/pio_perf.c
-        ${HDF5_PERFORM_SOURCE_DIR}/pio_engine.c
-    )
-    add_executable (h5perf_alone ${h5perf_alone_SRCS})
-    TARGET_NAMING (h5perf_alone STATIC)
-    TARGET_C_PROPERTIES (h5perf_alone STATIC " " " ")
-    target_link_libraries (h5perf_alone ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
-    set_target_properties (h5perf_alone PROPERTIES FOLDER perform)
-    set_property (TARGET h5perf_alone 
-        APPEND PROPERTY COMPILE_DEFINITIONS STANDALONE
-    )
-  endif (HDF5_BUILD_PERFORM_STANDALONE)
-endif (H5_HAVE_PARALLEL AND BUILD_TESTING)
-
-include (CMakeTests.cmake)
diff --git a/tools/perform/CMakeTests.cmake b/tools/perform/CMakeTests.cmake
deleted file mode 100644
index 6927124..0000000
--- a/tools/perform/CMakeTests.cmake
+++ /dev/null
@@ -1,58 +0,0 @@
-
-##############################################################################
-##############################################################################
-###           T E S T I N G                                                ###
-##############################################################################
-##############################################################################
-
-add_custom_command (
-    TARGET     zip_perf
-    POST_BUILD
-    COMMAND    ${CMAKE_COMMAND}
-    ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/tfilters.h5 ${PROJECT_BINARY_DIR}/tfilters.h5
-)
-
-#-----------------------------------------------------------------------------
-# Add Tests
-#-----------------------------------------------------------------------------
-
-# Remove any output file left over from previous test run
-add_test (
-    NAME PERFORM_h5perform-clear-objects
-    COMMAND    ${CMAKE_COMMAND}
-        -E remove 
-        chunk.h5
-        iopipe.h5
-        iopipe.raw
-        x-diag-rd.dat
-        x-diag-wr.dat
-        x-rowmaj-rd.dat
-        x-rowmaj-wr.dat
-        x-gnuplot
-)
-
-add_test (NAME PERFORM_h5perf_serial COMMAND $<TARGET_FILE:h5perf_serial>)
-set_tests_properties (PERFORM_h5perf_serial PROPERTIES TIMEOUT 1800)
-
-if (HDF5_BUILD_PERFORM_STANDALONE)
-  add_test (NAME PERFORM_h5perf_serial_alone COMMAND $<TARGET_FILE:h5perf_serial_alone>)
-endif (HDF5_BUILD_PERFORM_STANDALONE)
-
-add_test (NAME PERFORM_chunk COMMAND $<TARGET_FILE:chunk>)
-
-add_test (NAME PERFORM_iopipe COMMAND $<TARGET_FILE:iopipe>)
-
-add_test (NAME PERFORM_overhead COMMAND $<TARGET_FILE:overhead>)
-
-add_test (NAME PERFORM_perf_meta COMMAND $<TARGET_FILE:perf_meta>)
-
-add_test (NAME PERFORM_zip_perf_help COMMAND $<TARGET_FILE:zip_perf> "-h")
-add_test (NAME PERFORM_zip_perf COMMAND $<TARGET_FILE:zip_perf> tfilters.h5)
-
-if (H5_HAVE_PARALLEL)
-  add_test (NAME PERFORM_h5perf COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:h5perf>)
-
-  if (HDF5_BUILD_PERFORM_STANDALONE)
-    add_test (NAME PERFORM_h5perf_alone COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:h5perf_alone>)
-  endif (HDF5_BUILD_PERFORM_STANDALONE)
-endif (H5_HAVE_PARALLEL)
diff --git a/tools/perform/COPYING b/tools/perform/COPYING
deleted file mode 100644
index 6903daf..0000000
--- a/tools/perform/COPYING
+++ /dev/null
@@ -1,16 +0,0 @@
-
-  Copyright by  The HDF Group and 
-                The Board of Trustees of the University of Illinois. 
-  All rights reserved. 
-
-  The files and subdirectories in this directory are part of HDF5.  
-  The full HDF5 copyright notice, including terms governing use, 
-  modification, and redistribution, is contained in the files COPYING 
-  and Copyright.html.  COPYING can be found at the root of the source 
-  code distribution tree; Copyright.html can be found at the root 
-  level of an 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. 
-
diff --git a/tools/perform/Makefile.am b/tools/perform/Makefile.am
deleted file mode 100644
index 1af0e7f..0000000
--- a/tools/perform/Makefile.am
+++ /dev/null
@@ -1,79 +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.
-##
-## Makefile.am
-## Run automake to generate a Makefile.in from this file.
-##
-#
-# HDF5 Library Performance Makefile(.in)
-#
-
-include $(top_srcdir)/config/commence.am
-
-AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
-
-# bin_PROGRAMS will be installed.
-if BUILD_PARALLEL_CONDITIONAL
-    bin_PROGRAMS=h5perf_serial h5perf
-else
-    bin_PROGRAMS=h5perf_serial
-endif
-
-# Add h5perf and h5perf_serial specific linker flags here
-h5perf_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Some programs are not built or run by default, but can be built by hand or by
-# specifying --enable-build-all at configure time.
-# Also, some of these programs should only be built in parallel.
-# Currently there is no such program.
-if BUILD_PARALLEL_CONDITIONAL
-    PARA_BUILD_ALL=
-endif
-if BUILD_ALL_CONDITIONAL
-    BUILD_ALL_PROGS=$(PARA_BUILD_ALL)
-endif
-
-# Define programs that will be run in 'make check'
-# List them in the order they should be run.
-# Parallel test programs.
-if BUILD_PARALLEL_CONDITIONAL
-    TEST_PROG_PARA=h5perf perf
-endif
-# Serial test programs.
-TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS)
-
-# check_PROGRAMS will be built but not installed.  Do not any executable
-# that is in bin_PROGRAMS already. Otherwise, it will be removed twice in
-# "make clean" and some systems, e.g., AIX, do not like it.
-check_PROGRAMS= iopipe chunk overhead zip_perf perf_meta $(BUILD_ALL_PROGS) perf
-
-h5perf_SOURCES=pio_perf.c pio_engine.c
-h5perf_serial_SOURCES=sio_perf.c sio_engine.c
-
-# These are the files that `make clean' (and derivatives) will remove from
-# this directory.
-CLEANFILES=*.h5 *.raw *.dat x-gnuplot perftest.out
-
-# All of the programs depend on the main hdf5 library, and some of them
-# depend on test or tools library.
-LDADD=$(LIBHDF5)
-h5perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5perf_serial_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-perf_LDADD=$(LIBH5TEST) $(LIBHDF5)
-iopipe_LDADD=$(LIBH5TEST) $(LIBHDF5)
-zip_perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-perf_meta_LDADD=$(LIBH5TEST) $(LIBHDF5)
-
-include $(top_srcdir)/config/conclude.am
diff --git a/tools/perform/Makefile.in b/tools/perform/Makefile.in
deleted file mode 100644
index baad0c3..0000000
--- a/tools/perform/Makefile.in
+++ /dev/null
@@ -1,1604 +0,0 @@
-# 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 Performance 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@
- at BUILD_PARALLEL_CONDITIONAL_FALSE@bin_PROGRAMS =  \
- at BUILD_PARALLEL_CONDITIONAL_FALSE@	h5perf_serial$(EXEEXT)
- at BUILD_PARALLEL_CONDITIONAL_TRUE@bin_PROGRAMS =  \
- at BUILD_PARALLEL_CONDITIONAL_TRUE@	h5perf_serial$(EXEEXT) \
- at BUILD_PARALLEL_CONDITIONAL_TRUE@	h5perf$(EXEEXT)
-check_PROGRAMS = iopipe$(EXEEXT) chunk$(EXEEXT) overhead$(EXEEXT) \
-	zip_perf$(EXEEXT) perf_meta$(EXEEXT) $(am__EXEEXT_2) \
-	perf$(EXEEXT)
-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)/m4/ax_check_class.m4 \
-	$(top_srcdir)/m4/ax_check_classpath.m4 \
-	$(top_srcdir)/m4/ax_check_java_home.m4 \
-	$(top_srcdir)/m4/ax_check_junit.m4 \
-	$(top_srcdir)/m4/ax_java_options.m4 \
-	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
-	$(top_srcdir)/m4/ax_prog_jar.m4 \
-	$(top_srcdir)/m4/ax_prog_java.m4 \
-	$(top_srcdir)/m4/ax_prog_java_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javac.m4 \
-	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
-	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
-	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
-am__EXEEXT_1 =
- at BUILD_ALL_CONDITIONAL_TRUE@am__EXEEXT_2 = $(am__EXEEXT_1)
-PROGRAMS = $(bin_PROGRAMS)
-chunk_SOURCES = chunk.c
-chunk_OBJECTS = chunk.$(OBJEXT)
-chunk_LDADD = $(LDADD)
-chunk_DEPENDENCIES = $(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 = 
-am_h5perf_OBJECTS = pio_perf.$(OBJEXT) pio_engine.$(OBJEXT)
-h5perf_OBJECTS = $(am_h5perf_OBJECTS)
-h5perf_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5perf_LDFLAGS) $(LDFLAGS) -o $@
-am_h5perf_serial_OBJECTS = sio_perf.$(OBJEXT) sio_engine.$(OBJEXT)
-h5perf_serial_OBJECTS = $(am_h5perf_serial_OBJECTS)
-h5perf_serial_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5perf_serial_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(h5perf_serial_LDFLAGS) $(LDFLAGS) -o $@
-iopipe_SOURCES = iopipe.c
-iopipe_OBJECTS = iopipe.$(OBJEXT)
-iopipe_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
-overhead_SOURCES = overhead.c
-overhead_OBJECTS = overhead.$(OBJEXT)
-overhead_LDADD = $(LDADD)
-overhead_DEPENDENCIES = $(LIBHDF5)
-perf_SOURCES = perf.c
-perf_OBJECTS = perf.$(OBJEXT)
-perf_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
-perf_meta_SOURCES = perf_meta.c
-perf_meta_OBJECTS = perf_meta.$(OBJEXT)
-perf_meta_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
-zip_perf_SOURCES = zip_perf.c
-zip_perf_OBJECTS = zip_perf.$(OBJEXT)
-zip_perf_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(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 = chunk.c $(h5perf_SOURCES) $(h5perf_serial_SOURCES) iopipe.c \
-	overhead.c perf.c perf_meta.c zip_perf.c
-DIST_SOURCES = chunk.c $(h5perf_SOURCES) $(h5perf_serial_SOURCES) \
-	iopipe.c overhead.c perf.c perf_meta.c zip_perf.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
-am__EXEEXT_3 = iopipe$(EXEEXT) chunk$(EXEEXT) overhead$(EXEEXT) \
-	zip_perf$(EXEEXT) perf_meta$(EXEEXT) h5perf_serial$(EXEEXT) \
-	$(am__EXEEXT_2)
-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 COPYING
-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@
-AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
-	-I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
-AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
-AM_JAVACFLAGS = @AM_JAVACFLAGS@
-AM_JAVAFLAGS = @AM_JAVAFLAGS@
-AM_JNIFLAGS = @AM_JNIFLAGS@
-AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AR = @AR@
-ASSERTS = @ASSERTS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_MODE = @BUILD_MODE@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-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@
-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_CLASSPATH = @H5_CLASSPATH@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
-H5_JAVACFLAGS = @H5_JAVACFLAGS@
-H5_JAVAFLAGS = @H5_JAVAFLAGS@
-H5_JNIFLAGS = @H5_JNIFLAGS@
-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@
-HDF_JAVA = @HDF_JAVA@
-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_LIBRARY = @INSTRUMENT_LIBRARY@
-INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
-JAR = @JAR@
-JAVA = @JAVA@
-JAVAC = @JAVAC@
-JAVACFLAGS = @JAVACFLAGS@
-JAVADOC = @JAVADOC@
-JAVAFLAGS = @JAVAFLAGS@
-JAVAPREFIX = @JAVAPREFIX@
-JAVA_JUNIT = @JAVA_JUNIT@
-JAVA_PATH_NAME = @JAVA_PATH_NAME@
-JAVA_VERSION = @JAVA_VERSION@
-JNIFLAGS = @JNIFLAGS@
-JUNIT = @JUNIT@
-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@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
-METADATATRACEFILE = @METADATATRACEFILE@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-OPTIMIZATION = @OPTIMIZATION@
-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@
-PROFILING = @PROFILING@
-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@
-SYMBOLS = @SYMBOLS@
-TESTPARALLEL = @TESTPARALLEL@
-TESTS_JUNIT = @TESTS_JUNIT@
-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@
-UUDECODE = @UUDECODE@
-VERSION = @VERSION@
-WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
-_ACJNI_JAVAC = @_ACJNI_JAVAC@
-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
-LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
-
-# Add h5perf and h5perf_serial specific linker flags here
-h5perf_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
-# Some programs are not built or run by default, but can be built by hand or by
-# specifying --enable-build-all at configure time.
-# Also, some of these programs should only be built in parallel.
-# Currently there is no such program.
- at BUILD_PARALLEL_CONDITIONAL_TRUE@PARA_BUILD_ALL = 
- at BUILD_ALL_CONDITIONAL_TRUE@BUILD_ALL_PROGS = $(PARA_BUILD_ALL)
-
-# Define programs that will be run in 'make check'
-# List them in the order they should be run.
-# Parallel test programs.
- at BUILD_PARALLEL_CONDITIONAL_TRUE@TEST_PROG_PARA = h5perf perf
-# Serial test programs.
-TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS)
-h5perf_SOURCES = pio_perf.c pio_engine.c
-h5perf_serial_SOURCES = sio_perf.c sio_engine.c
-
-# These are the files that `make clean' (and derivatives) will remove from
-# this directory.
-CLEANFILES = *.h5 *.raw *.dat x-gnuplot perftest.out
-
-# All of the programs depend on the main hdf5 library, and some of them
-# depend on test or tools library.
-LDADD = $(LIBHDF5)
-h5perf_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5perf_serial_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-perf_LDADD = $(LIBH5TEST) $(LIBHDF5)
-iopipe_LDADD = $(LIBH5TEST) $(LIBHDF5)
-zip_perf_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-perf_meta_LDADD = $(LIBH5TEST) $(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/perform/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tools/perform/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):
-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
-
-chunk$(EXEEXT): $(chunk_OBJECTS) $(chunk_DEPENDENCIES) $(EXTRA_chunk_DEPENDENCIES) 
-	@rm -f chunk$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(chunk_OBJECTS) $(chunk_LDADD) $(LIBS)
-
-h5perf$(EXEEXT): $(h5perf_OBJECTS) $(h5perf_DEPENDENCIES) $(EXTRA_h5perf_DEPENDENCIES) 
-	@rm -f h5perf$(EXEEXT)
-	$(AM_V_CCLD)$(h5perf_LINK) $(h5perf_OBJECTS) $(h5perf_LDADD) $(LIBS)
-
-h5perf_serial$(EXEEXT): $(h5perf_serial_OBJECTS) $(h5perf_serial_DEPENDENCIES) $(EXTRA_h5perf_serial_DEPENDENCIES) 
-	@rm -f h5perf_serial$(EXEEXT)
-	$(AM_V_CCLD)$(h5perf_serial_LINK) $(h5perf_serial_OBJECTS) $(h5perf_serial_LDADD) $(LIBS)
-
-iopipe$(EXEEXT): $(iopipe_OBJECTS) $(iopipe_DEPENDENCIES) $(EXTRA_iopipe_DEPENDENCIES) 
-	@rm -f iopipe$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(iopipe_OBJECTS) $(iopipe_LDADD) $(LIBS)
-
-overhead$(EXEEXT): $(overhead_OBJECTS) $(overhead_DEPENDENCIES) $(EXTRA_overhead_DEPENDENCIES) 
-	@rm -f overhead$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(overhead_OBJECTS) $(overhead_LDADD) $(LIBS)
-
-perf$(EXEEXT): $(perf_OBJECTS) $(perf_DEPENDENCIES) $(EXTRA_perf_DEPENDENCIES) 
-	@rm -f perf$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(perf_OBJECTS) $(perf_LDADD) $(LIBS)
-
-perf_meta$(EXEEXT): $(perf_meta_OBJECTS) $(perf_meta_DEPENDENCIES) $(EXTRA_perf_meta_DEPENDENCIES) 
-	@rm -f perf_meta$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(perf_meta_OBJECTS) $(perf_meta_LDADD) $(LIBS)
-
-zip_perf$(EXEEXT): $(zip_perf_OBJECTS) $(zip_perf_DEPENDENCIES) $(EXTRA_zip_perf_DEPENDENCIES) 
-	@rm -f zip_perf$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(zip_perf_OBJECTS) $(zip_perf_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/chunk.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/iopipe.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/overhead.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/perf.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/perf_meta.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pio_engine.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pio_perf.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sio_engine.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sio_perf.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/zip_perf.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 $$?
-iopipe.log: iopipe$(EXEEXT)
-	@p='iopipe$(EXEEXT)'; \
-	b='iopipe'; \
-	$(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)
-chunk.log: chunk$(EXEEXT)
-	@p='chunk$(EXEEXT)'; \
-	b='chunk'; \
-	$(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)
-overhead.log: overhead$(EXEEXT)
-	@p='overhead$(EXEEXT)'; \
-	b='overhead'; \
-	$(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)
-zip_perf.log: zip_perf$(EXEEXT)
-	@p='zip_perf$(EXEEXT)'; \
-	b='zip_perf'; \
-	$(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)
-perf_meta.log: perf_meta$(EXEEXT)
-	@p='perf_meta$(EXEEXT)'; \
-	b='perf_meta'; \
-	$(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)
-h5perf_serial.log: h5perf_serial$(EXEEXT)
-	@p='h5perf_serial$(EXEEXT)'; \
-	b='h5perf_serial'; \
-	$(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 $(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:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-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-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/perform/build_h5perf_alone.sh b/tools/perform/build_h5perf_alone.sh
deleted file mode 100755
index b65e863..0000000
--- a/tools/perform/build_h5perf_alone.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /bin/sh -x
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-#
-# Name: build_h5perf_alone.sh
-#
-# Puporse: Build the h5perf tool by standalone mode.
-#
-# Created: Albert Cheng, 2005/09/18
-#
-# Modification:
-#
-
-# Default to use h5pcc to build h5perf unless $H5CC is defined.
-# 
-h5pcc=${H5CC:-h5pcc}
-$h5pcc -DSTANDALONE pio_perf.c pio_engine.c pio_timer.c -o h5perf
diff --git a/tools/perform/build_h5perf_serial_alone.sh b/tools/perform/build_h5perf_serial_alone.sh
deleted file mode 100755
index 2566609..0000000
--- a/tools/perform/build_h5perf_serial_alone.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /bin/sh -x
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-#
-# Name: build_h5perf_serial_alone.sh
-#
-# Puporse: Build the h5perf_serial tool by standalone mode.
-#
-# Created: Christian Chilan, 2008/09/02 
-#
-# Modification:
-#
-
-# Default to use h5cc to build h5perf_serial unless $H5CC is defined.
-# 
-h5cc=${H5CC:-h5cc}
-$h5cc -DSTANDALONE sio_perf.c sio_engine.c sio_timer.c -o h5perf_serial
diff --git a/tools/perform/chunk.c b/tools/perform/chunk.c
deleted file mode 100644
index 0ea16e8..0000000
--- a/tools/perform/chunk.c
+++ /dev/null
@@ -1,552 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Robb Matzke <robb at arborea.spizella.com>
- *              Thursday, May 14, 1998
- *
- * Purpose:	Checks the effect of various I/O request sizes and raw data
- *		cache sizes.  Performance depends on the amount of data read
- *		from disk and we use a filter to get that number.
- */
-
-/* See H5private.h for how to include headers */
-#undef NDEBUG
-#include "hdf5.h"
-
-#ifdef H5_STDC_HEADERS
-#   include <assert.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#   include <string.h>
-#endif
-
-/* Solaris Studio defines attribute, but for the attributes we need */
-#if !defined(H5_HAVE_ATTRIBUTE) || defined __cplusplus || defined(__SUNPRO_C)
-#   undef __attribute__
-#   define __attribute__(X) /*void*/
-#   define H5_ATTR_UNUSED /*void*/
-#else
-#   define H5_ATTR_UNUSED __attribute__((unused))
-#endif
-
-#define FILE_NAME	"chunk.h5"
-#define LINESPOINTS	"lines"
-#define CH_SIZE		100		/*squared in terms of bytes    	*/
-#define DS_SIZE		20		/*squared in terms of chunks	*/
-#define FILTER_COUNTER	305
-#define READ		0
-#define WRITE		1
-#define MIN(X,Y)	((X)<(Y)?(X):(Y))
-#define MAX(X,Y)	((X)>(Y)?(X):(Y))
-#define SQUARE(X)	((X)*(X))
-
-/* The row-major test */
-#define RM_CACHE_STRT	25
-#define RM_CACHE_END	25
-#define RM_CACHE_DELT	5
-#define RM_START	0.50F
-#define RM_END	        5.00F
-#define RM_DELTA	0.50F
-#define RM_W0		0.0F
-#define RM_NRDCC	521
-
-/* Diagonal test */
-#define DIAG_CACHE_STRT	25
-#define DIAG_CACHE_END	25
-#define DIAG_CACHE_DELT	5
-#define DIAG_START	0.50F
-#define DIAG_END	5.00F
-#define DIAG_DELTA	0.50F
-/* #define DIAG_W0		0.65F */
-/* #define DIAG_NRDCC		521 */
-
-static size_t	nio_g;
-static hid_t	fapl_g = -1;
-
-/* Local function prototypes */
-static size_t
-counter (unsigned H5_ATTR_UNUSED flags, size_t cd_nelmts,
-	 const unsigned *cd_values, size_t nbytes,
-	 size_t *buf_size, void **buf);
-
-/* This message derives from H5Z */
-const H5Z_class2_t H5Z_COUNTER[1] = {{
-    H5Z_CLASS_T_VERS,		/* H5Z_class_t version		*/
-    FILTER_COUNTER,		/* Filter id number		*/
-    1, 1,			/* Encoding and decoding enabled */
-    "counter",			/* Filter name for debugging	*/
-    NULL,                       /* The "can apply" callback     */
-    NULL,                       /* The "set local" callback     */
-    counter,			/* The actual filter function	*/
-}};
-
-

-/*-------------------------------------------------------------------------
- * Function:	counter
- *
- * Purpose:	Count number of bytes but don't do anything.
- *
- * Return:	Success:	src_nbytes-1
- *
- *		Failure:	never fails
- *
- * Programmer:	Robb Matzke
- *              Thursday, May 14, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static size_t
-counter (unsigned H5_ATTR_UNUSED flags, size_t H5_ATTR_UNUSED cd_nelmts,
-	 const unsigned H5_ATTR_UNUSED *cd_values, size_t nbytes,
-	 size_t H5_ATTR_UNUSED *buf_size, void H5_ATTR_UNUSED **buf)
-{
-    nio_g += nbytes;
-    return nbytes;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_dataset
- *
- * Purpose:	Creates a square dataset with square chunks, registers a
- *		stupid compress/uncompress pair for counting I/O, and
- *		initializes the dataset.  The chunk size is in bytes, the
- *		dataset size is in terms of chunks.
- *
- * Return:	void
- *
- * Programmer:	Robb Matzke
- *              Thursday, May 14, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-create_dataset (void)
-{
-    hid_t	file, space, dcpl, dset;
-    hsize_t	size[2];
-    signed char	*buf;
-
-    /* The file */
-    file = H5Fcreate (FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_g);
-
-    /* The data space */
-    size[0] = size[1] = DS_SIZE * CH_SIZE;
-    space = H5Screate_simple(2, size, size);
-
-    /* The storage layout and compression */
-    dcpl = H5Pcreate(H5P_DATASET_CREATE);
-    size[0] = size[1] = CH_SIZE;
-    H5Pset_chunk(dcpl, 2, size);
-    H5Zregister(H5Z_COUNTER);
-    H5Pset_filter(dcpl, FILTER_COUNTER, 0, 0, NULL);
-
-    /* The dataset */
-    dset = H5Dcreate2(file, "dset", H5T_NATIVE_SCHAR, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
-    assert(dset>=0);
-
-    /* The data */
-    buf = (signed char *)calloc(1, SQUARE (DS_SIZE*CH_SIZE));
-    H5Dwrite(dset, H5T_NATIVE_SCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
-    free(buf);
-
-    /* Close */
-    H5Dclose(dset);
-    H5Sclose(space);
-    H5Pclose(dcpl);
-    H5Fclose(file);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	test_rowmaj
- *
- * Purpose:	Reads the entire dataset using the specified size-squared
- *		I/O requests in row major order.
- *
- * Return:	Efficiency: data requested divided by data actually read.
- *
- * Programmer:	Robb Matzke
- *              Thursday, May 14, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-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 = (signed char *)calloc (1, (size_t)(SQUARE(io_size)));
-    hsize_t	i, j, hs_size[2];
-    hsize_t	hs_offset[2];
-    int		mdc_nelmts;
-    size_t	rdcc_nelmts;
-    double	w0;
-
-    H5Pget_cache (fapl_g, &mdc_nelmts, &rdcc_nelmts, NULL, &w0);
-#ifdef RM_W0
-    w0 = RM_W0;
-#endif
-#ifdef RM_NRDCC
-    rdcc_nelmts = RM_NRDCC;
-#endif
-    H5Pset_cache (fapl_g, mdc_nelmts, rdcc_nelmts,
-		  cache_size*SQUARE (CH_SIZE), w0);
-    file = H5Fopen(FILE_NAME, H5F_ACC_RDWR, fapl_g);
-    dset = H5Dopen2(file, "dset", H5P_DEFAULT);
-    file_space = H5Dget_space(dset);
-    nio_g = 0;
-
-    for (i=0; i<CH_SIZE*DS_SIZE; i+=io_size) {
-#if 0
-	fprintf (stderr, "%5d\b\b\b\b\b", (int)i);
-	fflush (stderr);
-#endif
-	for (j=0; j<CH_SIZE*DS_SIZE; j+=io_size) {
-	    hs_offset[0] = i;
-	    hs_size[0] = MIN (io_size, CH_SIZE*DS_SIZE-i);
-	    hs_offset[1] = j;
-	    hs_size[1] = MIN (io_size, CH_SIZE*DS_SIZE-j);
-	    mem_space = H5Screate_simple (2, hs_size, hs_size);
-	    H5Sselect_hyperslab (file_space, H5S_SELECT_SET, hs_offset,
-				 NULL, hs_size, NULL);
-
-	    if (READ==op) {
-		H5Dread (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
-			 H5P_DEFAULT, buf);
-	    } else {
-		H5Dwrite (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
-			  H5P_DEFAULT, buf);
-	    }
-	    H5Sclose (mem_space);
-	}
-    }
-
-    free (buf);
-    H5Sclose (file_space);
-    H5Dclose (dset);
-    H5Fclose (file);
-
-    return (double)SQUARE(CH_SIZE*DS_SIZE)/(double)nio_g;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	test_diag
- *
- * Purpose:	Reads windows diagonally across the dataset.  Each window is
- *		offset from the previous window by OFFSET in the x and y
- *		directions.  The reading ends after the (k,k) value is read
- *		where k is the maximum index in the dataset.
- *
- * Return:	Efficiency.
- *
- * Programmer:	Robb Matzke
- *              Friday, May 15, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static double
-test_diag (int op, size_t cache_size, size_t io_size, size_t offset)
-{
-    hid_t	file, dset, mem_space, file_space;
-    hsize_t	i, hs_size[2];
-    hsize_t	nio = 0;
-    hsize_t	hs_offset[2];
-    signed char	*buf = (signed char *)calloc(1, (size_t)(SQUARE (io_size)));
-    int		mdc_nelmts;
-    size_t	rdcc_nelmts;
-    double	w0;
-
-    H5Pget_cache (fapl_g, &mdc_nelmts, &rdcc_nelmts, NULL, &w0);
-#ifdef DIAG_W0
-    w0 = DIAG_W0;
-#endif
-#ifdef DIAG_NRDCC
-    rdcc_nelmts = DIAG_NRDCC;
-#endif
-    H5Pset_cache (fapl_g, mdc_nelmts, rdcc_nelmts,
-		  cache_size*SQUARE (CH_SIZE), w0);
-    file = H5Fopen(FILE_NAME, H5F_ACC_RDWR, fapl_g);
-    dset = H5Dopen2(file, "dset", H5P_DEFAULT);
-    file_space = H5Dget_space(dset);
-    nio_g = 0;
-
-    for (i=0, hs_size[0]=io_size; hs_size[0]==io_size; i+=offset) {
-	hs_offset[0] = hs_offset[1] = i;
-	hs_size[0] = hs_size[1] = MIN (io_size, CH_SIZE*DS_SIZE-i);
-	mem_space = H5Screate_simple (2, hs_size, hs_size);
-	H5Sselect_hyperslab (file_space, H5S_SELECT_SET, hs_offset, NULL,
-			     hs_size, NULL);
-	if (READ==op) {
-	    H5Dread (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
-		     H5P_DEFAULT, buf);
-	} else {
-	    H5Dwrite (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
-		      H5P_DEFAULT, buf);
-	}
-	H5Sclose (mem_space);
-	nio += hs_size[0]*hs_size[1];
-	if (i>0) nio -= SQUARE (io_size-offset);
-    }
-
-    free (buf);
-    H5Sclose (file_space);
-    H5Dclose (dset);
-    H5Fclose (file);
-
-    /*
-     * The extra cast in the following statement is a bug workaround for the
-     * Win32 version 5.0 compiler.
-     * 1998-11-06 ptl
-     */
-    return (double)(hssize_t)nio/(hssize_t)nio_g;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	main
- *
- * Purpose:	See file prologue.
- *
- * Return:	Success:
- *
- *		Failure:
- *
- * Programmer:	Robb Matzke
- *              Thursday, May 14, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main (void)
-{
-    size_t	io_size;
-    double	effic, io_percent;
-    FILE	*f, *d;
-    size_t	cache_size;
-    double	w0;
-
-    /*
-     * Create a global file access property list.
-     */
-    fapl_g = H5Pcreate (H5P_FILE_ACCESS);
-    H5Pget_cache (fapl_g, NULL, NULL, NULL, &w0);
-
-    /* Create the file */
-    create_dataset ();
-    f = fopen ("x-gnuplot", "w");
-
-    printf("Test      %8s %8s %8s\n", "CacheSz", "ChunkSz",  "Effic");
-    printf("--------- -------- -------- --------\n");
-
-#if 1
-    /*
-     * Test row-major reading of the dataset with various sizes of request
-     * windows.
-     */
-    if (RM_CACHE_STRT==RM_CACHE_END) {
-	fprintf (f, "set yrange [0:1.2]\n");
-	fprintf (f, "set ytics 0, 0.1, 1\n");
-	fprintf (f, "set xlabel \"%s\"\n",
-		 "Request size as a fraction of chunk size");
-	fprintf (f, "set ylabel \"Efficiency\"\n");
-	fprintf (f, "set title \"Cache %d chunks, w0=%g, "
-		 "Size=(total=%d, chunk=%d)\"\n",
-		 RM_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
-    } else {
-	fprintf (f, "set autoscale\n");
-	fprintf (f, "set hidden3d\n");
-    }
-
-    fprintf (f, "set terminal postscript\nset output \"x-rowmaj-rd.ps\"\n");
-    fprintf (f, "%s \"x-rowmaj-rd.dat\" title \"RowMaj-Read\" with %s\n",
-	     RM_CACHE_STRT==RM_CACHE_END?"plot":"splot",
-	     LINESPOINTS);
-    fprintf (f, "set terminal x11\nreplot\n");
-    d = fopen ("x-rowmaj-rd.dat", "w");
-    for (cache_size=RM_CACHE_STRT;
-	 cache_size<=RM_CACHE_END;
-	 cache_size+=RM_CACHE_DELT) {
-	for (io_percent=RM_START; io_percent<=RM_END; io_percent+=RM_DELTA) {
-	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
-	    printf ("Rowmaj-rd %8d %8.2f", (int)cache_size, io_percent);
-	    fflush (stdout);
-	    effic = test_rowmaj (READ, cache_size, io_size);
-	    printf (" %8.2f\n", effic);
-	    if (RM_CACHE_STRT==RM_CACHE_END) {
-		fprintf (d, "%g %g\n", io_percent, effic);
-	    } else {
-		fprintf (d, "%g\n", effic);
-	    }
-	}
-	fprintf (d, "\n");
-    }
-    fclose (d);
-    fprintf (f, "pause -1\n");
-#endif
-
-#if 1
-    /*
-     * Test row-major writing of the dataset with various sizes of request
-     * windows.
-     */
-    if (RM_CACHE_STRT==RM_CACHE_END) {
-	fprintf (f, "set yrange [0:1.2]\n");
-	fprintf (f, "set ytics 0, 0.1, 1\n");
-	fprintf (f, "set xlabel \"%s\"\n",
-		 "Request size as a fraction of chunk size");
-	fprintf (f, "set ylabel \"Efficiency\"\n");
-	fprintf (f, "set title \"Cache %d chunks,w0=%g, "
-		 "Size=(total=%d, chunk=%d)\"\n",
-		 RM_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
-    } else {
-	fprintf (f, "set autoscale\n");
-	fprintf (f, "set hidden3d\n");
-    }
-
-    fprintf (f, "set terminal postscript\nset output \"x-rowmaj-wr.ps\"\n");
-    fprintf (f, "%s \"x-rowmaj-wr.dat\" title \"RowMaj-Write\" with %s\n",
-	     RM_CACHE_STRT==RM_CACHE_END?"plot":"splot",
-	     LINESPOINTS);
-    fprintf (f, "set terminal x11\nreplot\n");
-    d = fopen ("x-rowmaj-wr.dat", "w");
-    for (cache_size=RM_CACHE_STRT;
-	 cache_size<=RM_CACHE_END;
-	 cache_size+=RM_CACHE_DELT) {
-	for (io_percent=RM_START; io_percent<=RM_END; io_percent+=RM_DELTA) {
-	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
-	    printf ("Rowmaj-wr %8d %8.2f", (int)cache_size, io_percent);
-	    fflush (stdout);
-	    effic = test_rowmaj (WRITE, cache_size, io_size);
-	    printf (" %8.2f\n", effic);
-	    if (RM_CACHE_STRT==RM_CACHE_END) {
-		fprintf (d, "%g %g\n", io_percent, effic);
-	    } else {
-		fprintf (d, "%g\n", effic);
-	    }
-	}
-	fprintf (d, "\n");
-    }
-    fclose (d);
-    fprintf (f, "pause -1\n");
-#endif
-
-#if 1
-    /*
-     * Test diagonal read
-     */
-    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
-	fprintf (f, "set yrange [0:1.2]\n");
-	fprintf (f, "set ytics 0, 0.1, 1\n");
-	fprintf (f, "set xlabel \"%s\"\n",
-		 "Request size as a fraction of chunk size");
-	fprintf (f, "set ylabel \"Efficiency\"\n");
-	fprintf (f, "set title \"Cache %d chunks,w0=%g, "
-		 "Size=(total=%d, chunk=%d)\"\n",
-		 DIAG_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
-    } else {
-	fprintf (f, "set autoscale\n");
-	fprintf (f, "set hidden3d\n");
-    }
-    fprintf (f, "set terminal postscript\nset output \"x-diag-rd.ps\"\n");
-    fprintf (f, "%s \"x-diag-rd.dat\" title \"Diag-Read\" with %s\n",
-	     DIAG_CACHE_STRT==DIAG_CACHE_END?"plot":"splot", LINESPOINTS);
-    fprintf (f, "set terminal x11\nreplot\n");
-    d = fopen ("x-diag-rd.dat", "w");
-    for (cache_size=DIAG_CACHE_STRT;
-	 cache_size<=DIAG_CACHE_END;
-	 cache_size+=DIAG_CACHE_DELT) {
-	for (io_percent=DIAG_START;
-	     io_percent<=DIAG_END;
-	     io_percent+=DIAG_DELTA) {
-	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
-	    printf ("Diag-rd   %8d %8.2f", (int)cache_size, io_percent);
-	    fflush (stdout);
-	    effic = test_diag (READ, cache_size, io_size, MAX (1, io_size/2));
-	    printf (" %8.2f\n", effic);
-	    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
-		fprintf (d, "%g %g\n", io_percent, effic);
-	    } else {
-		fprintf (d, "%g\n", effic);
-	    }
-	}
-	fprintf (d, "\n");
-    }
-    fclose (d);
-    fprintf (f, "pause -1\n");
-#endif
-
-#if 1
-    /*
-     * Test diagonal write
-     */
-    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
-	fprintf (f, "set yrange [0:1.2]\n");
-	fprintf (f, "set ytics 0, 0.1, 1\n");
-	fprintf (f, "set xlabel \"%s\"\n",
-		 "Request size as a fraction of chunk size");
-	fprintf (f, "set ylabel \"Efficiency\"\n");
-	fprintf (f, "set title \"Cache %d chunks, w0=%g, "
-		 "Size=(total=%d, chunk=%d)\"\n",
-		 DIAG_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
-    } else {
-	fprintf (f, "set autoscale\n");
-	fprintf (f, "set hidden3d\n");
-    }
-    fprintf (f, "set terminal postscript\nset output \"x-diag-wr.ps\"\n");
-    fprintf (f, "%s \"x-diag-wr.dat\" title \"Diag-Write\" with %s\n",
-	     DIAG_CACHE_STRT==DIAG_CACHE_END?"plot":"splot", LINESPOINTS);
-    fprintf (f, "set terminal x11\nreplot\n");
-    d = fopen ("x-diag-wr.dat", "w");
-    for (cache_size=DIAG_CACHE_STRT;
-	 cache_size<=DIAG_CACHE_END;
-	 cache_size+=DIAG_CACHE_DELT) {
-	for (io_percent=DIAG_START;
-	     io_percent<=DIAG_END;
-	     io_percent+=DIAG_DELTA) {
-	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
-	    printf ("Diag-wr   %8d %8.2f", (int)cache_size, io_percent);
-	    fflush (stdout);
-	    effic = test_diag (WRITE, cache_size, io_size, MAX (1, io_size/2));
-	    printf (" %8.2f\n", effic);
-	    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
-		fprintf (d, "%g %g\n", io_percent, effic);
-	    } else {
-		fprintf (d, "%g\n", effic);
-	    }
-	}
-	fprintf (d, "\n");
-    }
-    fclose (d);
-    fprintf (f, "pause -1\n");
-#endif
-
-
-    H5Pclose (fapl_g);
-    fclose (f);
-    return 0;
-}
-
diff --git a/tools/perform/gen_report.pl b/tools/perform/gen_report.pl
deleted file mode 100755
index 285f5d7..0000000
--- a/tools/perform/gen_report.pl
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/usr/bin/perl 
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-#
-
-#
-#    Generates an ASCII and Excel-importable file of tables representing
-#    the output of running the "pio_perf" command. The name of the input
-#    file is important. The name should reflect the command-line options
-#    used in the performance test. It needs to be of the form:
-#
-#        f#[GMK].i#.d#.X#[GMK].x#[GMK]..*
-#
-#    For example:
-#
-#        PIO_output_f1G.i2.d1.X2M.x128K.frost
-#
-#    for a 1GB sized file ran for 2 iterations with 1 dataset from xfer
-#    buffer size of 128KB to 2MB on the frost machine.
-#
-#    The output file will have the same name as the input, but will append
-#    ".ascii" for the ASCII file and ".excel" for the Excel-importable
-#    file.
-#
-#    The data structure used in this program looks like:
-#
-#        %results = {
-#            num_proc => (
-#                %xfer_size => (
-#                    %posix = {
-#                        'write-only' => ##,
-#                        'write-close' => ##,
-#                        'read-only' => ##,
-#                        'read-close' => ##
-#                    },
-#                    %mpio = {
-#                        'write-only' => ##,
-#                        'write-close' => ##,
-#                        'read-only' => ##,
-#                        'read-close' => ##
-#                    },
-#                    %phdf = {
-#                        'write-only' => ##,
-#                        'write-close' => ##,
-#                        'read-only' => ##,
-#                        'read-close' => ##
-#                    }
-#                )
-#            )
-#        }
-
-use IO::Handle;
-use Getopt::Long;
-use List::Util qw[max];
-
-if ($#ARGV == -1) {
-	usage();
-}
-
-my ($ascii_output, $excel_output);
-
-GetOptions("data_type=s"=>\$data_type, 
-            "buffer_size=i"=>\$transfer_buffer_size,
-            "procs=i"=>\$num_procs_graph,
-	    "help!"=>\$help,
-	    "throughput=s"=>\$throughput_type,
-	    "io_type=i"=>\$io_type,
-            "3d!"=>\$plot_3d);
-
-usage() if $help or !@ARGV;
-
-$throughput_type = "average" if !$throughput_type;
-$io_type = 7 if !$io_type;
-
-foreach my $arg (@ARGV) {
-
-	if ($arg !~ /^-/) {
-		$arg =~ /f([0-9]+.)\.i([0-9]+)\.d([0-9]+)\.X([0-9]+.)\.x([0-9]+.)\.(.*)/;
-
-		my $output = $arg . $1 . ".X" . $4 . ".x" . $5 . "." . $6;
-
-		$ascii_output = $output . ".ascii";
-		$excel_output = $output . ".excel";
-
-		open(INPUT, "<$arg") or die "error: cannot open file $arg: $!\n";
-		open(ASCII_OUTPUT, ">$ascii_output") or
-		    die "error: cannot open file $ascii_output: $!\n";
-		open(EXCEL_OUTPUT, ">$excel_output") or
-		    die "error: cannot open file $excel_output: $!\n";
-	} 
-	else
-	{
-		die "error: unrecognized option: $arg\n";
-	}
-}
-
-my %results;
-my $num_procs = 0;
-my ($xfer_size, $avg_type, $type);
-
-my $posix = 0, $mpio = 1, $phdf5 = 2;
-
-##"==== End of Parameters ===="
-
-while (<INPUT>) {
-	if (/Number of processors = ([0-9]+)/) {
-		$num_procs = $1;
-	}
-
-	if (/Transfer Buffer Size: ([0-9]+)/) {
-		$xfer_size = $1;
-	}
-
-	$type = $posix if /POSIX/;
-	$type = $mpio if /MPIO/;
-	$type = $phdf5 if /PHDF5/;
-
-	if (/Write Open/) {
-		$avg_type = "write-close";
-	} elsif (/Write/) {
-		$avg_type = "write-only";
-	} elsif (/Read Open/) {
-		$avg_type = "read-close";
-	} elsif (/Read/) {
-	    $avg_type = "read-only";
-	}
-
-	if($throughput_type eq "max")
-	{
-	    if (/Maximum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
-		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
-	    }
-	}
-	elsif($throughput_type eq "min")
-	{
-	    if (/Minimum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
-		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
-	    }
-	}
-	elsif($throughput_type eq "average")
-	{
-	    if (/Average Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
-		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
-	    }
-	}
-}
-
-sub usage {
-	print "Usage: gen_reporl.pl [options] FILE
-	options are:\n
-	-data_type \"data_type\" plots the results for \"write-only\",\"read-only\", \"write-close\", or \"read-close\" (default is write-only)\n
-	-buffer_size \"buffer_size\" plots data from this buffer size (in kilobytes, default is 128)\n
-	-procs \"num_procs\" plots data from the run with num_procs processors (default is the highest number of processors for which there is data).\n
-	-throughput \"throughput_type\" plots either the \"max\", \"min\", or \"average\" throughput (default is average)\n
-	-io_type  \"io_type\" where \"io_type\" is the bitwise or of the io_type for which plotting is desired (1 for POSIX, 2 for MPIO, 4 for PHDF5 (default is 7 (all))\n
-	-3d	if present, does a 3d plot in addition to the normal ones\n";
-			
-	exit 1;
-}
-
-sub create_excel_output_header {
-	my $output_header;
-	my $kb = 1024;
-	my $mb = $kb * $kb;
-
-	foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
-		if ($key < $mb) {
-			$key /= $kb;
-			$output_header .= "\t". $key . "K";
-		} else {
-			$key /= $mb;
-			$output_header .= "\t". $key . "M";
-		}
-	}
-
-	$output_header;
-}
-
-sub create_excel_output_string {
-	my ($t) = @_;
-	my $output_content = "";
-
-	foreach my $procs (sort { $b <=> $a } keys(%results)) {
-		$output_content .= "\n$procs Procs";
-		$output_content .= "\n" . create_excel_output_header;
-		$output_content .= "\n  POSIX";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content .= "\t$results{$procs}{$xfer}[0]{$t}";
-		}
-
-		$output_content .= "\n  MPIO";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content .= "\t$results{$procs}{$xfer}[1]{$t}";
-		}
-
-		$output_content .= "\n  PHDF5";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content .= "\t$results{$procs}{$xfer}[2]{$t}";
-		}
-
-		$output_content .= "\n";
-	}
-
-	$output_content;
-}
-
-sub is_defined {
-	my ($t) = @_;
-	my $def = 1;
-
-	foreach my $procs (sort { $b <=> $a } keys(%results)) {
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			if (!defined($results{$procs}{$xfer}[0]{$t})) {
-				$def = 0;
-			}
-		}
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			if (!defined($results{$procs}{$xfer}[0]{$t})) {
-				$def = 0;
-			}
-		}
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			if (!defined($results{$procs}{$xfer}[0]{$t})) {
-				$def = 0;
-			}
-		}
-	}
-
-	$def;
-}
-
-sub write_excel_file {
-	print EXCEL_OUTPUT "\nWrite-Only\n";
-	print EXCEL_OUTPUT create_excel_output_string("write-only");
-	print EXCEL_OUTPUT "\nWrite-Close\n";
-	print EXCEL_OUTPUT create_excel_output_string("write-close");
-
-	if (is_defined("read-only")) {
-		print EXCEL_OUTPUT "\nRead-Only\n";
-		print EXCEL_OUTPUT create_excel_output_string("read-only");
-		print EXCEL_OUTPUT "\nRead-Close\n";
-		print EXCEL_OUTPUT create_excel_output_string("read-close");
-	}
-}
-
-sub create_ascii_output_header {
-	my $output_header = " " x 12 . "|";
-	my $kb = 1024;
-	my $mb = $kb * $kb;
-
-	foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
-		if ($key < $mb) {
-			$key /= $kb;
-			$output_header = sprintf("$output_header   %-4s   |", $key .  "K");
-		} else {
-			$key /= $mb;
-			$output_header = sprintf("$output_header   %-4s   |", $key .  "M");
-		}
-	}
-
-	$output_header;
-}
-
-sub create_ascii_output_string {
-	my ($t) = @_;
-	my $output_content = "";
-	my $output_header = create_ascii_output_header;
-
-	foreach my $procs (sort { $b <=> $a } keys(%results)) {
-		$output_content .= "\n$procs Procs";
-		$output_content .= "\n$output_header\n";
-		$output_content .= "-" x length($output_header);
-		$output_content .= "\n     POSIX  |";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content = sprintf("$output_content   %-6s |",
-									   $results{$procs}{$xfer}[0]{$t});
-		}
-
-		$output_content .= "\n    ";
-		$output_content .= "-" x (length($output_header) - 4);
-		$output_content .= "\n     MPI/IO |";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content = sprintf("$output_content   %-6s |",
-									   $results{$procs}{$xfer}[1]{$t});
-		}
-
-		$output_content .= "\n    ";
-		$output_content .= "-" x (length($output_header) - 4);
-		$output_content .= "\n     PHDF5  |";
-
-		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
-			$output_content = sprintf("$output_content   %-6s |",
-									   $results{$procs}{$xfer}[2]{$t});
-		}
-
-		$output_content .= "\n";
-		$output_content .= "=" x length($output_header);
-		$output_content .= "\n";
-	}
-
-	$output_content;
-}
-
-sub write_ascii_file {
-	print ASCII_OUTPUT "\nWrite-Only";
-	print ASCII_OUTPUT "\n----------\n";
-	print ASCII_OUTPUT create_ascii_output_string("write-only");
-	print ASCII_OUTPUT "\n\nWrite-Close";
-	print ASCII_OUTPUT "\n-----------\n";
-	print ASCII_OUTPUT create_ascii_output_string("write-close");
-
-	if (is_defined("read-only")) {
-		print ASCII_OUTPUT "\n\nRead-Only";
-		print ASCII_OUTPUT "\n---------\n";
-		print ASCII_OUTPUT create_ascii_output_string("read-only");
-		print ASCII_OUTPUT "\n\nRead-Close";
-		print ASCII_OUTPUT "\n----------\n";
-		print ASCII_OUTPUT create_ascii_output_string("read-close");
-	}
-}
-
-sub draw_plot
-{
-    my($p_3d) = @_;
-    
-    if($p_3d)
-    {
-	$counter = 3;
-	print GNUPLOT_PIPE "splot ";
-    }
-    else
-    {
-	$counter = 2;
-	print GNUPLOT_PIPE "plot ";
-    }
-
-    if($io_type & 1) {
-	print GNUPLOT_PIPE " \"gnuplot.data\" using 1:";
-	
-	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
-	
-	print GNUPLOT_PIPE $counter . " title 'POSIX' with linespoints";
-	$counter = $counter + 1;
-    }
-    if($io_type & 2) {
-	if($io_type & 1) { print GNUPLOT_PIPE ", "; }
-	print GNUPLOT_PIPE  "\"gnuplot.data\" using 1:";
-	
-	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
-	
-	print GNUPLOT_PIPE  $counter . " title 'MPIO' with linespoints";
-	$counter = $counter + 1;
-	if($io_type & 4) { print GNUPLOT_PIPE ", ";}
-    }
-    if($io_type & 4) {
-	print GNUPLOT_PIPE "  \"gnuplot.data\" using 1:";
-	
-	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
-	
-	print GNUPLOT_PIPE  $counter . " title 'PHDF5' with linespoints";
-
-    }
-    print GNUPLOT_PIPE "\n";
-}
-
-
-sub plot_default_graph1 {
-	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
-		die "error: cannot open file gnuplot.data: $!\n";
-	
-	$transfer_buffer_size = 128 if !$transfer_buffer_size;
-	$data_type = "write-only" if !$data_type;
-
-	#set up the plot
-	print GNUPLOT_PIPE  "set term x11 1\n";
-	print GNUPLOT_PIPE  "set xlabel \"Number of Processors\"\n";
-	print GNUPLOT_PIPE  "set title \"" . $data_type . " Performance (Speed vs. Num. Procs)\"\n";
-	print GNUPLOT_PIPE  "set ylabel \"Bandwdith (MB/s)\"\n";
-	print GNUPLOT_PIPE  "set label 1 \"Transfer buffer size: " . $transfer_buffer_size . "K\" at graph 0.7, graph 0.7 left \n";
-
-#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
-	print GNUPLOT_PIPE  "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
-
-
-	foreach $proc (sort { $a <=> $b }( keys %results )) 
-	{
-	    print GNUPLOT_DATA_OUTPUT $proc . "\t";
-	    if($io_type & 1) {
-		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[0]{$data_type} . "\t";
-	    }
-	    if($io_type & 2) {
-		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[1]{$data_type}. "\t";
-	    }
-	    if($io_type & 4) {
-		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[2]{$data_type};
-	    }
-	    print GNUPLOT_DATA_OUTPUT "\n";
-
-	}
-
-	close(GNUPLOT_DATA_OUTPUT); 
-
-	draw_plot(0);
-	
-	unlink(GNUPLOT_DATA_OUTPUT);
-
-}
-
-
-sub plot_default_graph2 {
-	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
-		die "error: cannot open file gnuplot.data: $!\n";
-	
-	$num_procs_graph = max(sort { $a <=> $b }( keys %results )) if !$num_procs_graph;
-	print "min-rpocs: " . $num_procs_graph;
-	$data_type = "write-only" if !$data_type;
-
-	#set up the plot
-	print GNUPLOT_PIPE  "set term x11 2\n";
-	print GNUPLOT_PIPE  "set xlabel \"Transfer Buffer Size (in bytes)\"\n";
-	print GNUPLOT_PIPE  "set title \"" . $data_type . " Performance (Speed vs. Transfer Buffer Size)\"\n";
-	print GNUPLOT_PIPE  "set ylabel \"Bandwdith (MB/s)\"\n";
-	print GNUPLOT_PIPE  "set label 1 \"Procs: " . $num_procs_graph . "\" at graph 0.7, graph 0.7 left \n";
-
-#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
-	print GNUPLOT_PIPE  "set xtics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
-
-	foreach $xfer (sort {$a <=> $b} ( keys %{$results{$num_procs_graph}} )) 
-	{
-	    print GNUPLOT_DATA_OUTPUT $xfer . "\t";
-	    if($io_type & 1) {
-		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[0]{$data_type} . "\t";
-	    }
-	    if($io_type & 2) {
-		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[1]{$data_type}. "\t";		
-	    }
-	    if($io_type & 4) {
-		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[2]{$data_type};
-	    }
-	    print GNUPLOT_DATA_OUTPUT "\n";
-
-     	}
-	
-	close(GNUPLOT_DATA_OUTPUT); 
-
-	draw_plot(0);
-	
-	unlink(GNUPLOT_DATA_OUTPUT);
-}
-
-sub plot_3d_graph3 {
-	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
-		die "error: cannot open file gnuplot.data: $!\n";
-
-	#set up the plot
-	print GNUPLOT_PIPE  "set term x11 3\n";
-	print GNUPLOT_PIPE  "set xlabel \"Num. Processors\"\n";
-	print GNUPLOT_PIPE  "set title \"Write Speed v. No. Procs v. Buffer Size\"\n";
-	print GNUPLOT_PIPE  "set ylabel \"Buffer Size (bytes)\"\n";
-	print GNUPLOT_PIPE  "set zlabel \"Bandwidth (in MB/s)\"\n";
-	print GNUPLOT_PIPE  "set nolabel\n";
-	print GNUPLOT_PIPE  "set dgrid3d 30,30\n";
-	print GNUPLOT_PIPE  "set hidden3d\n";
-
-#the next lines attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
-	print GNUPLOT_PIPE  "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
-	print GNUPLOT_PIPE  "set ytics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
-
-
-#Read speed on z-axis, processors on x, buffer size on y.
-
-	foreach $proc (sort { $a <=> $b }( keys %results )) 
-	{
-	    foreach $xfer (sort {$a <=> $b} ( keys %{$results{$proc}} )) 
-	    {
-		print GNUPLOT_DATA_OUTPUT $proc . "\t" . $xfer . "\t";
-		if($io_type & 1) {
-		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[0]{"write-only"} . "\t";		
-		}
-		if($io_type & 2) {
-		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[1]{"write-only"}. "\t";		
-		}
-		if($io_type & 4) {
-		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[2]{"write-only"};
-		}
-	    print GNUPLOT_DATA_OUTPUT "\n";
-
-	    }
-	}
-	
-	close(GNUPLOT_DATA_OUTPUT); 
-	
-	draw_plot(1);
-	
-	unlink(GNUPLOT_DATA_OUTPUT);
-}
-
-open(GNUPLOT_PIPE, "| tee gnuplot.script | gnuplot -persist") || die "Couldn't run gnuplot: $!\n";
-GNUPLOT_PIPE->autoflush(1);
-
-write_excel_file;
-write_ascii_file;
-plot_default_graph1;
-sleep 1;
-plot_default_graph2;
-sleep 1;
-
-plot_3d_graph3 if $plot_3d;
-close(GNUPLOT_PIPE);
diff --git a/tools/perform/iopipe.c b/tools/perform/iopipe.c
deleted file mode 100644
index a04ef82..0000000
--- a/tools/perform/iopipe.c
+++ /dev/null
@@ -1,503 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Robb Matzke <matzke at llnl.gov>
- *              Thursday, March 12, 1998
- */
-
-/* See H5private.h for how to include headers */
-#include "hdf5.h"
-
-#include "H5private.h"
-
-#ifdef H5_HAVE_SYS_TIMEB
-#include <sys/timeb.h>
-#endif
-
-
-#define RAW_FILE_NAME  "iopipe.raw"
-#define HDF5_FILE_NAME  "iopipe.h5"
-#define HEADING    "%-16s"
-#define PROGRESS  '='
-
-#if 0
-/* Normal testing */
-#define REQUEST_SIZE_X  4579
-#define REQUEST_SIZE_Y  4579
-#define NREAD_REQUESTS  45
-#define NWRITE_REQUESTS  45
-#else
-/* Speedy testing */
-#define REQUEST_SIZE_X  1000
-#define REQUEST_SIZE_Y  1000
-#define NREAD_REQUESTS  45
-#define NWRITE_REQUESTS  45
-#endif
-
-

-/*-------------------------------------------------------------------------
- * Function:  print_stats
- *
- * Purpose:  Prints statistics
- *
- * Return:  void
- *
- * Programmer:  Robb Matzke
- *              Thursday, March 12, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_GETRUSAGE
-static void
-print_stats (const char *prefix,
-       struct rusage *r_start, struct rusage *r_stop,
-       struct timeval *t_start, struct timeval *t_stop,
-       size_t nbytes)
-#else /* H5_HAVE_GETRUSAGE */
-static void
-print_stats (const char *prefix,
-       struct timeval *r_start, struct timeval *r_stop,
-       struct timeval *t_start, struct timeval *t_stop,
-       size_t nbytes)
-#endif /* H5_HAVE_GETRUSAGE */
-{
-    double  e_time, bw;
-#ifdef H5_HAVE_GETRUSAGE
-    double  u_time, s_time;
-
-    u_time = ((double)(r_stop->ru_utime.tv_sec)+
-        (double)(r_stop->ru_utime.tv_usec)/1000000.0F) -
-       ((double)(r_start->ru_utime.tv_sec)+
-        (double)(r_start->ru_utime.tv_usec)/1000000.0F);
-
-    s_time = ((double)(r_stop->ru_stime.tv_sec)+
-        (double)(r_stop->ru_stime.tv_usec)/1000000.0F) -
-       ((double)(r_start->ru_stime.tv_sec)+
-        (double)(r_start->ru_stime.tv_usec)/1000000.0F);
-#endif
-#ifndef H5_HAVE_SYS_TIMEB
-    e_time = ((double)(t_stop->tv_sec)+
-        (double)(t_stop->tv_usec)/1000000.0F) -
-       ((double)(t_start->tv_sec)+
-        (double)(t_start->tv_usec)/1000000.0F);
-#else
-    e_time = ((double)(t_stop->tv_sec)+
-        (double)(t_stop->tv_usec)/1000.0F) -
-       ((double)(t_start->tv_sec)+
-        (double)(t_start->tv_usec)/1000.0F);
-#endif
-    bw = (double)nbytes / e_time;
-
-#ifdef H5_HAVE_GETRUSAGE
-    printf (HEADING "%1.2fuser %1.2fsystem %1.2felapsed %1.2fMB/s\n",
-      prefix, u_time, s_time, e_time, bw/(1024*1024));
-#else
-    printf (HEADING "%1.2felapsed %1.2fMB/s\n",
-      prefix, e_time, bw/(1024*1024));
-#endif
-
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  synchronize
- *
- * Purpose:
- *
- * Return:  void
- *
- * Programmer:  Robb Matzke
- *              Thursday, March 12, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-synchronize (void)
-{
-#ifdef H5_HAVE_SYSTEM
-#if defined(H5_HAVE_WIN32_API) && ! defined(__CYGWIN__)
-    _flushall();
-#else
-    HDsystem("sync");
-    HDsystem("df >/dev/null");
-#endif
-#endif
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  main
- *
- * Purpose:
- *
- * Return:  Success:
- *
- *    Failure:
- *
- * Programmer:  Robb Matzke
- *              Thursday, March 12, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main (void)
-{
-    static hsize_t  size[2] = {REQUEST_SIZE_X, REQUEST_SIZE_Y};
-    static unsigned  nread = NREAD_REQUESTS, nwrite = NWRITE_REQUESTS;
-
-    unsigned char  *the_data = NULL;
-    hid_t    file, dset, file_space = -1;
-    herr_t    status;
-#ifdef H5_HAVE_GETRUSAGE
-    struct rusage  r_start, r_stop;
-#else
-    struct timeval r_start, r_stop;
-#endif
-    struct timeval  t_start, t_stop;
-    int      fd;
-    unsigned    u;
-    hssize_t    n;
-    off_t    offset;
-    hsize_t    start[2];
-    hsize_t    count[2];
-
-
-#ifdef H5_HAVE_SYS_TIMEB
-  struct _timeb *tbstart = malloc(sizeof(struct _timeb));
-  struct _timeb *tbstop = malloc(sizeof(struct _timeb));
-#endif
-    /*
-     * The extra cast in the following statement is a bug workaround for the
-     * Win32 version 5.0 compiler.
-     * 1998-11-06 ptl
-     */
-    printf ("I/O request size is %1.1fMB\n",
-      (double)(hssize_t)(size[0]*size[1])/1024.0F*1024);
-
-    /* Open the files */
-    file = H5Fcreate (HDF5_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    assert (file>=0);
-    fd = HDopen (RAW_FILE_NAME, O_RDWR|O_CREAT|O_TRUNC, 0666);
-    assert (fd>=0);
-
-    /* Create the dataset */
-    file_space = H5Screate_simple (2, size, size);
-    assert(file_space >= 0);
-    dset = H5Dcreate2(file, "dset", H5T_NATIVE_UCHAR, file_space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    assert(dset >= 0);
-    the_data = (unsigned char *)malloc((size_t)(size[0] * size[1]));
-
-    /* initial fill for lazy malloc */
-    HDmemset(the_data, 0xAA, (size_t)(size[0] * size[1]));
-
-    /* Fill raw */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "fill raw");
-    for(u = 0; u < nwrite; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  HDmemset(the_data, 0xAA, (size_t)(size[0]*size[1]));
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("fill raw",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-
-    /* Fill hdf5 */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "fill hdf5");
-    for(u = 0; u < nread; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
-        H5P_DEFAULT, the_data);
-  assert (status>=0);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("fill hdf5",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-    /* Write the raw dataset */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "out raw");
-    for(u = 0; u < nwrite; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  offset = HDlseek (fd, (off_t)0, SEEK_SET);
-  assert (0==offset);
-  n = HDwrite (fd, the_data, (size_t)(size[0]*size[1]));
-  assert (n>=0 && (size_t)n==size[0]*size[1]);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("out raw",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-    /* Write the hdf5 dataset */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "out hdf5");
-    for(u = 0; u < nwrite; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  status = H5Dwrite (dset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL,
-         H5P_DEFAULT, the_data);
-  assert (status>=0);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("out hdf5",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-    /* Read the raw dataset */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "in raw");
-    for(u = 0; u < nread; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  offset = HDlseek (fd, (off_t)0, SEEK_SET);
-  assert (0==offset);
-  n = HDread (fd, the_data, (size_t)(size[0]*size[1]));
-  assert (n>=0 && (size_t)n==size[0]*size[1]);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("in raw",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-
-    /* Read the hdf5 dataset */
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "in hdf5");
-    for(u = 0; u < nread; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
-        H5P_DEFAULT, the_data);
-  assert (status>=0);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc ('\n', stderr);
-    print_stats ("in hdf5",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*size[0]*size[1]));
-
-    /* Read hyperslab */
-    assert (size[0]>20 && size[1]>20);
-    start[0] = start[1] = 10;
-    count[0] = count[1] = size[0]-20;
-    status = H5Sselect_hyperslab (file_space, H5S_SELECT_SET, start, NULL, count, NULL);
-    assert (status>=0);
-    synchronize ();
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_start);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_start, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstart);
-#endif
-#endif
-    fprintf (stderr, HEADING, "in hdf5 partial");
-    for(u = 0; u < nread; u++) {
-  putc (PROGRESS, stderr);
-  HDfflush(stderr);
-  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
-        H5P_DEFAULT, the_data);
-  assert (status>=0);
-    }
-#ifdef H5_HAVE_GETRUSAGE
-    HDgetrusage(RUSAGE_SELF, &r_stop);
-#endif
-#ifdef H5_HAVE_GETTIMEOFDAY
-    HDgettimeofday(&t_stop, NULL);
-#else
-#ifdef H5_HAVE_SYS_TIMEB
-  _ftime(tbstop);
-  t_start.tv_sec = tbstart->time;
-  t_start.tv_usec = tbstart->millitm;
-  t_stop.tv_sec = tbstop->time;
-  t_stop.tv_usec = tbstop->millitm;
-#endif
-#endif
-    putc('\n', stderr);
-    print_stats("in hdf5 partial",
-     &r_start, &r_stop, &t_start, &t_stop,
-     (size_t)(nread*count[0]*count[1]));
-
-
-
-    /* Close everything */
-    HDclose(fd);
-    H5Dclose(dset);
-    H5Sclose(file_space);
-    H5Fclose(file);
-    free(the_data);
-
-    return 0;
-}
-
diff --git a/tools/perform/overhead.c b/tools/perform/overhead.c
deleted file mode 100644
index 277f7a4..0000000
--- a/tools/perform/overhead.c
+++ /dev/null
@@ -1,413 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:  Robb Matzke <matzke at llnl.gov>
- *              Monday, September 28, 1998
- *
- * Purpose:  Creates a chunked dataset and measures the storage overhead.
- */
-
-/* See H5private.h for how to include headers */
-#undef NDEBUG
-#include "hdf5.h"
-#include "H5private.h"
-
-#ifdef H5_STDC_HEADERS
-#   include <ctype.h>
-#   include <fcntl.h>
-#   include <stdlib.h>
-#   include <sys/stat.h>
-#   include <string.h>
-#endif
-
-#ifdef H5_HAVE_IO_H
-#   include <io.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#   include <sys/types.h>
-#   include <unistd.h>
-#endif
-
-/* Solaris Studio defines attribute, but for the attributes we need */
-#if !defined(H5_HAVE_ATTRIBUTE) || defined __cplusplus || defined(__SUNPRO_C)
-#   undef __attribute__
-#   define __attribute__(X) /*void*/
-#   define H5_ATTR_UNUSED /*void*/
-#else
-#   define H5_ATTR_UNUSED __attribute__((unused))
-#endif
-
-#define FILE_NAME_1  "overhead.h5"
-#ifndef FALSE
-#define FALSE    0
-#endif /* FALSE */
-#ifndef TRUE
-#define TRUE    1
-#endif /* TRUE */
-
-typedef enum fill_t {
-    FILL_ALL,
-    FILL_FORWARD,
-    FILL_REVERSE,
-    FILL_INWARD,
-    FILL_OUTWARD,
-    FILL_RANDOM
-} fill_t;
-
-

-/*-------------------------------------------------------------------------
- * Function:  usage
- *
- * Purpose:  Prints a usage message and exits.
- *
- * Return:  never returns
- *
- * Programmer:  Robb Matzke
- *              Wednesday, September 30, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage(const char *prog)
-{
-    fprintf(stderr, "usage: %s [STYLE|cache] [LEFT [MIDDLE [RIGHT]]]\n",
-      prog);
-    fprintf(stderr, "\
-    STYLE is the order that the dataset is filled and should be one of:\n\
-        forward   --  Fill the dataset from lowest address to highest\n\
-                      address. This style tests the right split ratio.\n\
-        reverse   --  Fill the dataset from highest address to lowest\n\
-                      address.  This is the reverse order of `forward' and\n\
-                      tests the left split ratio.\n\
-        inward    --  Fill beginning at both the lowest and highest\n\
-                      addresses and work in toward the center of the\n\
-                      dataset.  This tests the middle split ratio.\n\
-        outward   --  Start at the center of the dataset and work outward\n\
-                      toward the lowest and highest addresses.  This tests\n\
-                      both left and right split ratios.\n\
-        random    --  Write the chunks of the dataset in random order.  This\n\
-                      tests all split ratios.\n\
-    If no fill style is specified then all fill styles are tried and a\n\
-    single value is printed for each one.\n\
-\n\
-    If the word `cache' is used instead of a fill style then the raw data\n\
-    cache is enabled.  It is not possible to enable the raw data cache when\n\
-    a specific fill style is used because H5Fflush() is called after each\n\
-    chunk is written in order to calculate overhead during the test.  If\n\
-    the cache is enabled then chunks are written to disk in different orders\n\
-    than the actual H5Dwrite() calls in the test due to collisions and the\n\
-    resulting B-tree will be split differently.\n\
-\n\
-    LEFT, MIDDLE, and RIGHT are the ratios to use for splitting and should\n\
-    be values between zero and one, inclusive.\n");
-    exit(1);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  cleanup
- *
- * Purpose:  Removes test files
- *
- * Return:  void
- *
- * Programmer:  Robb Matzke
- *              Thursday, June  4, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-cleanup (void)
-{
-    if (!getenv ("HDF5_NOCLEANUP")) {
-  remove (FILE_NAME_1);
-    }
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  display_error_cb
- *
- * Purpose:  Displays the error stack after printing "*FAILED*".
- *
- * Return:  Success:  0
- *
- *    Failure:  -1
- *
- * Programmer:  Robb Matzke
- *    Wednesday, March  4, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-display_error_cb (hid_t estack, void H5_ATTR_UNUSED *client_data)
-{
-    puts ("*FAILED*");
-    H5Eprint2(estack, stdout);
-
-    return 0;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  test
- *
- * Purpose:  The guts of the test
- *
- * Return:  Success:  0
- *
- *    Failure:  number of errors
- *
- * Programmer:  Robb Matzke
- *              Wednesday, September 30, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-test(fill_t fill_style, const double splits[],
-     hbool_t verbose, hbool_t use_rdcc)
-{
-    hid_t  file = (-1), fapl = (-1), dcpl = (-1), xfer = (-1), mspace = (-1), fspace = (-1), dset = (-1);
-    hsize_t  ch_size[1] = {1};    /*chunk size    */
-    hsize_t  cur_size[1] = {1000};    /*current dataset size  */
-    hsize_t  max_size[1] = {H5S_UNLIMITED};  /*maximum dataset size  */
-    hsize_t  hs_start[1];      /*hyperslab start offset*/
-    hsize_t  hs_count[1] = {1};    /*hyperslab nelmts  */
-    int    fd = (-1);      /*h5 file direct  */
-    int  *had = NULL;      /*for random filling  */
-    const char  *sname=NULL;      /*fill style nam  */
-    int    mdc_nelmts;      /*num meta objs to cache*/
-    hsize_t  i;
-    int    j;
-    h5_stat_t  sb;
-
-    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) goto error;
-    if(!use_rdcc) {
-        if(H5Pget_cache(fapl, &mdc_nelmts, NULL, NULL, NULL) < 0) goto error;
-        if(H5Pset_cache(fapl, mdc_nelmts, 0, 0, 0.0F) < 0) goto error;
-    }
-    if((file = H5Fcreate(FILE_NAME_1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) goto error;
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
-    if(H5Pset_chunk(dcpl, 1, ch_size) < 0) goto error;
-    if((xfer = H5Pcreate(H5P_DATASET_XFER)) < 0) goto error;
-    if(H5Pset_btree_ratios(xfer, splits[0], splits[1], splits[2]) < 0) goto error;
-    if((fspace = H5Screate_simple(1, cur_size, max_size)) < 0) goto error;
-    if((mspace = H5Screate_simple(1, ch_size, ch_size)) < 0) goto error;
-    if((dset = H5Dcreate2(file, "chunked", H5T_NATIVE_INT,
-        fspace, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
-    if ((fd=HDopen(FILE_NAME_1, O_RDONLY, 0666)) < 0) goto error;
-
-    if(FILL_RANDOM==fill_style) 
-        had = (int *)calloc((size_t)cur_size[0], sizeof(int));
-    
-    for (i=1; i<=cur_size[0]; i++) {
-
-        /* Decide which chunk to write to */
-        switch (fill_style) {
-        case FILL_FORWARD:
-            hs_start[0] = i-1;
-            break;
-        case FILL_REVERSE:
-            hs_start[0] = cur_size[0]-i;
-            break;
-        case FILL_INWARD:
-            hs_start[0] = i%2 ? i/2 : cur_size[0]-i/2;
-            break;
-        case FILL_OUTWARD:
-            j = (int)(cur_size[0]-i)+1;
-            hs_start[0] = j%2 ? j/2 : (hssize_t)cur_size[0]-j/2;
-            break;
-        case FILL_RANDOM:
-            for (j=HDrand()%(int)cur_size[0]; had[j]; j=(j+1)%(int)cur_size[0])
-                /*void*/;
-            hs_start[0] = j;
-            had[j] = 1;
-            break;
-        case FILL_ALL:
-            abort();
-        default:
-            /* unknown request */
-            HDfprintf(stderr, "Unknown fill style\n");
-            goto error;
-            break;
-        }
-
-        /* Write the chunk */
-        if (H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_start, NULL,
-                hs_count, NULL) < 0) goto error;
-        if (H5Dwrite(dset, H5T_NATIVE_INT, mspace, fspace, xfer, &i) < 0) {
-            goto error;
-        }
-
-        /* Determine overhead */
-        if (verbose) {
-            if (H5Fflush(file, H5F_SCOPE_LOCAL) < 0) goto error;
-            if (HDfstat(fd, &sb) < 0) goto error;
-            /*
-             * The extra cast in the following statement is a bug workaround
-             * for the Win32 version 5.0 compiler.
-             * 1998-11-06 ptl
-             */
-            printf("%4lu %8.3f ***\n",
-                    (unsigned long)i,
-                    (double)(hssize_t)(sb.st_size-i*sizeof(int))/(hssize_t)i);
-        }
-    }
-
-    if(had) {
-        free(had);
-        had = NULL;
-    } /* end if */
-
-    H5Dclose(dset);
-    H5Sclose(mspace);
-    H5Sclose(fspace);
-    H5Pclose(dcpl);
-    H5Pclose(xfer);
-    H5Fclose(file);
-
-    if (!verbose) {
-        switch (fill_style) {
-        case FILL_FORWARD:
-            sname = "forward";
-            break;
-        case FILL_REVERSE:
-            sname = "reverse";
-            break;
-        case FILL_INWARD:
-            sname = "inward";
-            break;
-        case FILL_OUTWARD:
-            sname = "outward";
-            break;
-        case FILL_RANDOM:
-            sname = "random";
-            break;
-        case FILL_ALL:
-            abort();
-        default:
-            /* unknown request */
-            HDfprintf(stderr, "Unknown fill style\n");
-            goto error;
-            break;
-        }
-
-        if (HDfstat(fd, &sb) < 0) goto error;
-        printf("%-7s %8.3f\n", sname,
-                (double)(hssize_t)(sb.st_size-cur_size[0]*sizeof(int))/
-                (hssize_t)cur_size[0]);
-    }
-    HDclose(fd);
-
-    return 0;
-
- error:
-    H5Dclose(dset);
-    H5Sclose(mspace);
-    H5Sclose(fspace);
-    H5Pclose(dcpl);
-    H5Pclose(xfer);
-    H5Fclose(file);
-    if(had)
-        free(had);
-    HDclose(fd);
-    return 1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:  main
- *
- * Purpose:
- *
- * Return:  Success:        zero
- *
- *    Failure:  non-zero
- *
- * Programmer:  Robb Matzke
- *              Monday, September 28, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, char *argv[])
-{
-    hid_t  xfer;
-    fill_t  fill_style = FILL_ALL;
-    hbool_t  use_cache = FALSE;
-    double  splits[3];
-    int    i, j, nerrors=0;
-
-    /* Default split ratios */
-    H5Eset_auto2(H5E_DEFAULT, display_error_cb, NULL);
-
-    if((xfer = H5Pcreate(H5P_DATASET_XFER)) < 0) goto error;
-    if(H5Pget_btree_ratios(xfer, splits+0, splits+1, splits+2) < 0) goto error;
-    if(H5Pclose(xfer) < 0) goto error;
-
-    /* Parse command-line options */
-    for(i = 1, j = 0; i < argc; i++) {
-        if (!strcmp(argv[i], "forward")) {
-            fill_style = FILL_FORWARD;
-        } else if (!strcmp(argv[i], "reverse")) {
-            fill_style = FILL_REVERSE;
-        } else if (!strcmp(argv[i], "inward")) {
-            fill_style = FILL_INWARD;
-        } else if (!strcmp(argv[i], "outward")) {
-            fill_style = FILL_OUTWARD;
-        } else if (!strcmp(argv[i], "random")) {
-            fill_style = FILL_RANDOM;
-        } else if (!strcmp(argv[i], "cache")) {
-            use_cache = TRUE;
-        } else if (j<3 && (isdigit(argv[i][0]) || '.'==argv[i][0])) {
-            splits[j++] = strtod(argv[i], NULL);
-        } else {
-            usage(argv[0]);
-        }
-    }
-
-    if (FILL_ALL==fill_style) {
-        printf("%-7s %8s\n", "Style", "Bytes/Chunk");
-        printf("%-7s %8s\n", "-----", "-----------");
-        nerrors += test(FILL_FORWARD, splits, FALSE, use_cache);
-        nerrors += test(FILL_REVERSE, splits, FALSE, use_cache);
-        nerrors += test(FILL_INWARD,  splits, FALSE, use_cache);
-        nerrors += test(FILL_OUTWARD, splits, FALSE, use_cache);
-        nerrors += test(FILL_RANDOM,  splits, FALSE, use_cache);
-    } 
-    else {
-        if (use_cache) usage(argv[0]);
-        nerrors += test(fill_style,   splits, TRUE, FALSE);
-    }
-    if (nerrors>0) goto error;
-    cleanup();
-    return 0;
-
- error:
-    fprintf(stderr, "*** ERRORS DETECTED ***\n");
-    return 1;
-}
diff --git a/tools/perform/perf.c b/tools/perform/perf.c
deleted file mode 100644
index 7b9590c..0000000
--- a/tools/perform/perf.c
+++ /dev/null
@@ -1,494 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Author: Albert Cheng of NCSA, May 1, 2001.
- * This is derived from code given to me by Robert Ross.
- *
- * NOTE: This code assumes that all command line arguments make it out to all
- * the processes that make up the parallel job, which isn't always the case.
- * So if it doesn't work on some platform, that might be why.
- */
-
-#include "hdf5.h"
-#include "H5private.h"
-
-#ifdef H5_HAVE_PARALLEL
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#if defined(H5_TIME_WITH_SYS_TIME)
-#   include <sys/time.h>
-#   include <time.h>
-#elif defined(H5_HAVE_SYS_TIME_H)
-#   include <sys/time.h>
-#else
-#   include <time.h>
-#endif
-
-#include <mpi.h>
-#ifndef MPI_FILE_NULL           /*MPIO may be defined in mpi.h already       */
-#   include <mpio.h>
-#endif
-
-/* Macro definitions */
-/* Verify:
- * if val is false (0), print mesg and if fatal is true (non-zero), die.
- */
-#define H5FATAL 1
-#define VRFY(val, mesg, fatal) do {                                            \
-    if (!val) {                                                                \
-  	printf("Proc %d: ", mynod);                 \
-        printf("*** Assertion failed (%s) at line %4d in %s\n",                \
-      mesg, (int)__LINE__, __FILE__);                  \
-  	if (fatal){                     \
-      fflush(stdout);                   \
-      goto die_jar_jar_die;                 \
-  	}                       \
-    }                                                                          \
-} while(0)
-#define RANK 1
-#define MAX_PATH 1024
-
-hsize_t dims[RANK];     /* dataset dim sizes */
-hsize_t block[RANK], stride[RANK], count[RANK];
-hssize_t start[RANK];
-hid_t fid;                  /* HDF5 file ID */
-hid_t acc_tpl;    /* File access templates */
-hid_t sid;       /* Dataspace ID */
-hid_t file_dataspace;  /* File dataspace ID */
-hid_t mem_dataspace;  /* memory dataspace ID */
-hid_t dataset;    /* Dataset ID */
-hsize_t opt_alignment  = 1;
-hsize_t opt_threshold  = 1;
-int  opt_split_vfd  = 0;
-char  *meta_ext, *raw_ext;  /* holds the meta and raw file extension if */
-        /* opt_split_vfd is set */
-
-
-/* DEFAULT VALUES FOR OPTIONS */
-int64_t opt_block     = 1048576*16;
-int     opt_iter      = 1;
-int     opt_stripe    = -1;
-int     opt_correct   = 0;
-int     amode         = O_RDWR | O_CREAT;
-char    opt_file[256] = "perftest.out";
-char    opt_pvfstab[256] = "notset";
-int     opt_pvfstab_set = 0;
-
-const char *FILENAME[] = {
-   opt_file,
-   NULL
-};
-
-/* function prototypes */
-static int parse_args(int argc, char **argv);
-
-extern int errno;
-
-/* globals needed for getopt */
-extern char *optarg;
-
-int main(int argc, char **argv)
-{
-    char *buf, *tmp, *buf2, *tmp2, *check;
-    int i, j, mynod=0, nprocs=1, err, my_correct = 1, correct, myerrno;
-    double stim, etim;
-    double write_tim = 0;
-    double read_tim = 0;
-    double read_bw, write_bw;
-    double max_read_tim, max_write_tim;
-    double min_read_tim, min_write_tim;
-    double ave_read_tim, ave_write_tim;
-    int64_t iter_jump = 0;
-    int64_t seek_position = 0;
-    MPI_File fh;
-    MPI_Status status;
-    int nchars;
-    char filename[MAX_PATH];
-    herr_t ret;           /* Generic return value */
-
-    /* startup MPI and determine the rank of this process */
-    MPI_Init(&argc,&argv);
-    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
-    MPI_Comm_rank(MPI_COMM_WORLD, &mynod);
-
-    /* parse the command line arguments */
-    parse_args(argc, argv);
-
-    if (mynod == 0) printf("# Using hdf5-io calls.\n");
-
-    /* kindof a weird hack- if the location of the pvfstab file was
-     * specified on the command line, then spit out this location into
-     * the appropriate environment variable: */
-
-#if H5_HAVE_SETENV
-/* no setenv or unsetenv */
-    if (opt_pvfstab_set) {
-            if((setenv("PVFSTAB_FILE", opt_pvfstab, 1)) < 0){
-                    perror("setenv");
-                    goto die_jar_jar_die;
-            }
-    }
-#endif
-
-    /* this is how much of the file data is covered on each iteration of
-     * the test.  used to help determine the seek offset on each
-     * iteration */
-    iter_jump = nprocs * opt_block;
-
-    /* setup a buffer of data to write */
-    if (!(tmp = (char *) malloc(opt_block + 256))) {
-            perror("malloc");
-            goto die_jar_jar_die;
-    }
-    buf = tmp + 128 - (((long)tmp) % 128);  /* align buffer */
-
-    if (opt_correct) {
-            /* do the same buffer setup for verifiable data */
-            if (!(tmp2 = (char *) malloc(opt_block + 256))) {
-                    perror("malloc2");
-                    goto die_jar_jar_die;
-             }
-            buf2 = tmp + 128 - (((long)tmp) % 128);
-    }
-
-    /* setup file access template with parallel IO access. */
-    if (opt_split_vfd){
-  	hid_t mpio_pl;
-
-  	mpio_pl = H5Pcreate (H5P_FILE_ACCESS);
-  	VRFY((acc_tpl >= 0), "", H5FATAL);
-  	ret = H5Pset_fapl_mpio(mpio_pl, MPI_COMM_WORLD, MPI_INFO_NULL);
-  	VRFY((ret >= 0), "", H5FATAL);
-
-  	/* set optional allocation alignment */
-  	if (opt_alignment*opt_threshold != 1){
-      	ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
-      	VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
-  	}
-
-  	/* setup file access template */
-  	acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
-  	VRFY((acc_tpl >= 0), "", H5FATAL);
-  	ret = H5Pset_fapl_split(acc_tpl, meta_ext, mpio_pl, raw_ext, mpio_pl);
-  	VRFY((ret >= 0), "H5Pset_fapl_split succeeded", H5FATAL);
-  	ret = H5Pclose(mpio_pl);
-  	VRFY((ret >= 0), "H5Pclose mpio_pl succeeded", H5FATAL);
-    }else{
-  	/* setup file access template */
-  	acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
-  	VRFY((acc_tpl >= 0), "", H5FATAL);
-  	ret = H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
-  	VRFY((ret >= 0), "", H5FATAL);
-
-  	/* set optional allocation alignment */
-  	if (opt_alignment*opt_threshold != 1){
-  	    ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
-      	VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
-  	}
-    }
-
-    h5_fixname_no_suffix(FILENAME[0], acc_tpl, filename, sizeof filename);
-
-    /* create the parallel file */
-    fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
-    VRFY((fid >= 0), "H5Fcreate succeeded", H5FATAL);
-
-    /* define a contiquous dataset of opt_iter*nprocs*opt_block chars */
-    dims[0] = opt_iter * nprocs * opt_block;
-    sid = H5Screate_simple(RANK, dims, NULL);
-    VRFY((sid >= 0), "H5Screate_simple succeeded", H5FATAL);
-    dataset = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_CHAR, sid,
-      		H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-    VRFY((dataset >= 0), "H5Dcreate2 succeeded", H5FATAL);
-
-    /* create the memory dataspace and the file dataspace */
-    dims[0] = opt_block;
-    mem_dataspace = H5Screate_simple(RANK, dims, NULL);
-    VRFY((mem_dataspace >= 0), "", H5FATAL);
-    file_dataspace = H5Dget_space(dataset);
-    VRFY((file_dataspace >= 0), "H5Dget_space succeeded", H5FATAL);
-
-    /* now each process writes a block of opt_block chars in round robbin
-     * fashion until the whole dataset is covered.
-     */
-    for(j=0; j < opt_iter; j++) {
-        /* setup a file dataspace selection */
-        start[0] = (j*iter_jump)+(mynod*opt_block);
-        stride[0] = block[0] = opt_block;
-        count[0]= 1;
-        ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
-        VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
-
-            if (opt_correct) /* fill in buffer for iteration */ {
-                    for (i=mynod+j, check=buf; i<opt_block; i++,check++) *check=(char)i;
-            }
-
-            /* discover the starting time of the operation */
-       MPI_Barrier(MPI_COMM_WORLD);
-       stim = MPI_Wtime();
-
-        /* write data */
-        ret = H5Dwrite(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace,
-                H5P_DEFAULT, buf);
-        VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
-
-            /* discover the ending time of the operation */
-       etim = MPI_Wtime();
-
-       write_tim += (etim - stim);
-
-            /* we are done with this "write" iteration */
-    }
-
-    /* close dataset and file */
-    ret=H5Dclose(dataset);
-    VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
-    ret=H5Fclose(fid);
-    VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
-
-
-
-    /* wait for everyone to synchronize at this point */
-    MPI_Barrier(MPI_COMM_WORLD);
-
-    /* reopen the file for reading */
-    fid=H5Fopen(filename,H5F_ACC_RDONLY,acc_tpl);
-    VRFY((fid >= 0), "", H5FATAL);
-
-    /* open the dataset */
-    dataset = H5Dopen2(fid, "Dataset1", H5P_DEFAULT);
-    VRFY((dataset >= 0), "H5Dopen succeeded", H5FATAL);
-
-    /* we can re-use the same mem_dataspace and file_dataspace
-     * the H5Dwrite used since the dimension size is the same.
-     */
-
-    /* we are going to repeat the read the same pattern the write used */
-    for (j=0; j < opt_iter; j++) {
-        /* setup a file dataspace selection */
-        start[0] = (j*iter_jump)+(mynod*opt_block);
-        stride[0] = block[0] = opt_block;
-        count[0]= 1;
-        ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
-        VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
-            /* seek to the appropriate spot give the current iteration and
-             * rank within the MPI processes */
-
-            /* discover the start time */
-       MPI_Barrier(MPI_COMM_WORLD);
-       stim = MPI_Wtime();
-
-        /* read in the file data */
-        if (!opt_correct){
-            ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf);
-        }
-        else{
-            ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf2);
-        }
-        myerrno = errno;
-
-        /* discover the end time */
-       etim = MPI_Wtime();
-       read_tim += (etim - stim);
-        VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
-
-
-       if (ret < 0) fprintf(stderr, "node %d, read error, loc = %Ld: %s\n",
-                    mynod, mynod*opt_block, strerror(myerrno));
-
-        /* if the user wanted to check correctness, compare the write
-         * buffer to the read buffer */
-        if (opt_correct && memcmp(buf, buf2, opt_block)) {
-                fprintf(stderr, "node %d, correctness test failed\n", mynod);
-                my_correct = 0;
-                MPI_Allreduce(&my_correct, &correct, 1, MPI_INT, MPI_MIN,
-                        MPI_COMM_WORLD);
-        }
-
-        /* we are done with this read iteration */
-    }
-
-    /* close dataset and file */
-    ret=H5Dclose(dataset);
-    VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
-    ret=H5Fclose(fid);
-    VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
-    ret=H5Pclose(acc_tpl);
-    VRFY((ret >= 0), "H5Pclose succeeded", H5FATAL);
-
-    /* compute the read and write times */
-    MPI_Allreduce(&read_tim, &max_read_tim, 1, MPI_DOUBLE, MPI_MAX,
-            MPI_COMM_WORLD);
-    MPI_Allreduce(&read_tim, &min_read_tim, 1, MPI_DOUBLE, MPI_MIN,
-            MPI_COMM_WORLD);
-    MPI_Allreduce(&read_tim, &ave_read_tim, 1, MPI_DOUBLE, MPI_SUM,
-            MPI_COMM_WORLD);
-
-    /* calculate the average from the sum */
-    ave_read_tim = ave_read_tim / nprocs;
-
-    MPI_Allreduce(&write_tim, &max_write_tim, 1, MPI_DOUBLE, MPI_MAX,
-            MPI_COMM_WORLD);
-    MPI_Allreduce(&write_tim, &min_write_tim, 1, MPI_DOUBLE, MPI_MIN,
-            MPI_COMM_WORLD);
-    MPI_Allreduce(&write_tim, &ave_write_tim, 1, MPI_DOUBLE, MPI_SUM,
-            MPI_COMM_WORLD);
-
-    /* calculate the average from the sum */
-    ave_write_tim = ave_write_tim / nprocs;
-
-    /* print out the results on one node */
-    if (mynod == 0) {
-       read_bw = ((int64_t)(opt_block*nprocs*opt_iter))/(max_read_tim*1000000.0);
-       write_bw = ((int64_t)(opt_block*nprocs*opt_iter))/(max_write_tim*1000000.0);
-
-                    printf("nr_procs = %d, nr_iter = %d, blk_sz = %ld\n", nprocs,
-            opt_iter, (long)opt_block);
-
-                    printf("# total_size = %ld\n", (long)(opt_block*nprocs*opt_iter));
-
-                    printf("# Write:  min_time = %f, max_time = %f, mean_time = %f\n",
-                            min_write_tim, max_write_tim, ave_write_tim);
-                    printf("# Read:  min_time = %f, max_time = %f, mean_time = %f\n",
-                            min_read_tim, max_read_tim, ave_read_tim);
-
-       printf("Write bandwidth = %f Mbytes/sec\n", write_bw);
-       printf("Read bandwidth = %f Mbytes/sec\n", read_bw);
-
-            if (opt_correct) {
-                    printf("Correctness test %s.\n", correct ? "passed" : "failed");
-            }
-    }
-
-
-die_jar_jar_die:
-
-#if H5_HAVE_SETENV
-/* no setenv or unsetenv */
-    /* clear the environment variable if it was set earlier */
-    if  (opt_pvfstab_set){
-            unsetenv("PVFSTAB_FILE");
-    }
-#endif
-
-    free(tmp);
-    if (opt_correct) free(tmp2);
-
-    MPI_Finalize();
-
-    return(0);
-}
-
-static int
-parse_args(int argc, char **argv)
-{
-    int c;
-
-    while ((c = getopt(argc, argv, "s:b:i:f:p:a:2:c")) != EOF) {
-        switch (c) {
-            case 's': /* stripe */
-                opt_stripe = atoi(optarg);
-                break;
-            case 'b': /* block size */
-                opt_block = atoi(optarg);
-                break;
-            case 'i': /* iterations */
-                opt_iter = atoi(optarg);
-                break;
-            case 'f': /* filename */
-                strncpy(opt_file, optarg, 255);
-                FILENAME[0] = opt_file;
-                break;
-            case 'p': /* pvfstab file */
-                strncpy(opt_pvfstab, optarg, 255);
-                opt_pvfstab_set = 1;
-                break;
-            case 'a': /* aligned allocation.
-                       * syntax: -a<alignment>/<threshold>
-                       * e.g., -a4096/512  allocate at 4096 bytes
-                       * boundary if request size >= 512.
-                       */
-                {char *p;
-                opt_alignment = atoi(optarg);
-                if (p=(char*)strchr(optarg, '/'))
-                    opt_threshold = atoi(p+1);
-                }
-                HDfprintf(stdout,
-                    "alignment/threshold=%Hu/%Hu\n",
-                     opt_alignment, opt_threshold);
-                break;
-            case '2': /* use 2-files, i.e., split file driver */
-                opt_split_vfd=1;
-                /* get meta and raw file extension. */
-                /* syntax is <raw_ext>,<meta_ext> */
-                meta_ext = raw_ext = optarg;
-                while (*raw_ext != '\0'){
-                    if (*raw_ext == ','){
-                        *raw_ext = '\0';
-                        raw_ext++;
-                        break;
-                    }
-                    raw_ext++;
-                }
-                printf("split-file-vfd used: %s,%s\n",
-                    meta_ext, raw_ext);
-                break;
-            case 'c': /* correctness */
-                opt_correct = 1;
-                break;
-            case '?': /* unknown */
-            default:
-                break;
-        }
-    }
-
-    return(0);
-}
-
-/*
- * Local variables:
- *  c-indent-level: 3
- *  c-basic-offset: 3
- *  tab-width: 3
- * End:
- */
-
-#else /* H5_HAVE_PARALLEL */
-/* dummy program since H5_HAVE_PARALLEL is not configured in */
-int
-main(int H5_ATTR_UNUSED argc, char H5_ATTR_UNUSED **argv)
-{
-    printf("No parallel performance because parallel is not configured in\n");
-    return(0);
-}
-#endif /* H5_HAVE_PARALLEL */
-
diff --git a/tools/perform/perf_meta.c b/tools/perform/perf_meta.c
deleted file mode 100644
index 2c3a19c..0000000
--- a/tools/perform/perf_meta.c
+++ /dev/null
@@ -1,850 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer:	Raymond Lu <slu at ncsa.uiuc.edu>
- *		Friday, Oct 3, 2004
- *
- * Purpose:	Tests performance of metadata
- */
-
-#include "h5test.h"
-
-#ifdef H5_HAVE_PARALLEL
-#define MAINPROCESS	(!mpi_rank)	/* define process 0 as main process */
-#endif /*H5_HAVE_PARALLEL*/
-
-/* File_Access_type bits */
-#define FACC_DEFAULT	0x0	/* serial as default */
-#define FACC_MPIO	0x1	/* MPIO */
-
-/* Which test to run */
-int RUN_TEST = 0x0;     /* all tests as default */
-int TEST_1   = 0x1;     /* Test 1 */
-int TEST_2   = 0x2;     /* Test 2 */
-int TEST_3   = 0x4;     /* Test 3 */
-
-
-const char *FILENAME[] = {
-    "meta_perf_1",
-    "meta_perf_2",
-    "meta_perf_3",
-    NULL
-};
-
-/* Default values for performance. Can be changed through command line options */
-int 	NUM_DSETS = 16;
-int 	NUM_ATTRS = 8;
-int 	BATCH_ATTRS = 2;
-hbool_t flush_dset = FALSE;
-hbool_t flush_attr = FALSE;
-int 	nerrors = 0;			/* errors count */
-hid_t	fapl;
-
-/* Data space IDs */
-hid_t	space;
-hid_t	small_space;
-
-/* Performance data */
-typedef struct p_time {
-    double total;
-    double avg;
-    double max;
-    double min;
-    double start;
-    char   func[32];
-} p_time;
-
-/*Test file access type for parallel.  MPIO as default */
-int facc_type = FACC_DEFAULT;
-
-double  retrieve_time(void);
-void    perf(p_time *perf_t, double start_t, double end_t);
-void    print_perf(p_time, p_time, p_time);
-
-

-/*-------------------------------------------------------------------------
- * Function:	parse_options
- *
-  Purpose:	Parse command line options
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-parse_options(int argc, char **argv)
-{
-    int t;
-
-    /* Use default values */
-    if(argc==1)
-	return(0);
-
-    while (--argc){
-	if (**(++argv) != '-'){
-	    break;
-	}else{
-	    switch(*(*argv+1)){
-                case 'h':   /* Help page */
-                            return(1);
-
-		case 'd':   /* Number of datasets */
-                            NUM_DSETS = atoi((*argv+1)+1);
-			    if (NUM_DSETS < 0){
-				nerrors++;
-				return(1);
-			    }
-			    break;
-
-		case 'a':   /* Number of attributes per dataset */
-                            NUM_ATTRS = atoi((*argv+1)+1);
-			    if (NUM_ATTRS < 0){
-				nerrors++;
-				return(1);
-			    }
-			    break;
-
-		case 'n':   /* Number of attributes to be created in batch */
-                            BATCH_ATTRS = atoi((*argv+1)+1);
-			    if (BATCH_ATTRS < 0){
-				nerrors++;
-				return(1);
-			    }
-			    break;
-
-		case 'm':   /* Use the MPI-IO driver */
-			    facc_type = FACC_MPIO;
-			    break;
-
-                case 'f':   /* Call H5Fflush for each dataset or attribute */
-                            if(!strcmp("a", (*argv+2)))
-                                flush_attr = TRUE;
-                            else if(!strcmp("d", (*argv+2)))
-                                flush_dset = TRUE;
-                            else {
-                                nerrors++;
-                                return(1);
-                            }
-                            break;
-
-		case 't':   /* Which test to run */
-                            t = atoi((*argv+1)+1);
-			    if (t < 1 || t > 3){
-				nerrors++;
-				return(1);
-			    }
-                            if(t == 1)
-                                RUN_TEST |= TEST_1;
-                            else if(t == 2)
-                                RUN_TEST |= TEST_2;
-                            else
-                                RUN_TEST |= TEST_3;
-
-			    break;
-
- 		default:    nerrors++;
-			    return(1);
-	    }
-	}
-    } /*while*/
-
-    /* Check valid values */
-#ifndef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO)
-    {
-        nerrors++;
-        return(1);
-    }
-#endif /*H5_HAVE_PARALLEL*/
-
-    if(NUM_ATTRS && !BATCH_ATTRS)
-        NUM_ATTRS = 0;
-
-    if(!NUM_ATTRS && BATCH_ATTRS)
-        BATCH_ATTRS = 0;
-
-    if(!NUM_DSETS) {
-        nerrors++;
-        return(1);
-    }
-
-    if(NUM_ATTRS && BATCH_ATTRS) {
-        if(BATCH_ATTRS > NUM_ATTRS || NUM_ATTRS % BATCH_ATTRS) {
-	    nerrors++;
-            return(1);
-        }
-    }
-
-    return(0);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	usage
- *
-  Purpose:	Prints help page
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static void
-usage(void)
-{
-    printf("Usage: perf_meta [-h] [-m] [-d<num_datasets>]"
-           "[-a<num_attributes>]\n"
-           "\t[-n<batch_attributes>] [-f<option>] [-t<test>]\n");
-    printf("\t-h"
-	"\t\t\thelp page.\n");
-    printf("\t-m"
-	"\t\t\tset MPIO as the file driver when parallel HDF5\n"
-        "\t\t\t\tis enabled.  -m must be specified\n"
-        "\t\t\t\twhen running parallel program.\n");
-    printf("\t-d<num_datasets>"
-	"\tset number of datasets for meta data \n"
-        "\t\t\t\tperformance test\n");
-    printf("\t-a<num_attributes>"
-        "\tset number of attributes per dataset for meta \n"
-        "\t\t\t\tdata performance test.\n");
-    printf("\t-n<batch_attributes>"
-	"\tset batch number of attributes for dataset \n"
-        "\t\t\t\tfor meta data performance test.\n");
-    printf("\t-f<option>"
-	"\t\tflush data to disk after closing a dataset \n"
-        "\t\t\t\tor attribute.  Valid options are \"d\" for \n"
-        "\t\t\t\tdataset, \"a\" for attribute.  Disabled is \n"
-        "\t\t\t\tthe default.\n");
-    printf("\t-t<tests>"
-	"\t\trun specific test.  Give only one number each \n"
-        "\t\t\t\ttime. i.e. \"-t1 -t3\" will run test 1 and 3. \n"
-        "\t\t\t\tDefault is all three tests.  The 3 tests are: \n\n"
-        "\t\t\t\t1. Create <num_attributes> attributes for each \n"
-        "\t\t\t\t   of <num_datasets> existing datasets.\n"
-        "\t\t\t\t2. Create <num_attributes> attributes for each \n"
-        "\t\t\t\t   of <num_datasets> new datasets.\n"
-        "\t\t\t\t3. Create <batch_attributes> attributes for \n"
-        "\t\t\t\t   each of <num_dataset> new datasets for \n"
-        "\t\t\t\t   <num_attributes>/<batch_attributes> times.\n");
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_dspace
- *
- * Purpose:	Attempts to create data space.
- *
- * Return:	Success:	0
- *
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-create_dspace(void)
-{
-    hsize_t	dims[2];
-    hsize_t	small_dims[2];
-
-    /* Create the data space */
-    dims[0] = 256;
-    dims[1] = 512;
-    if((space = H5Screate_simple(2, dims, NULL)) < 0)
-	    goto error;
-
-    /* Create a small data space for attributes */
-    small_dims[0] = 16;
-    small_dims[1] = 8;
-    if((small_space = H5Screate_simple(2, small_dims, NULL)) < 0)
-	    goto error;
-
-    return 0;
-
-error:
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_dsets
- *
- * Purpose:	Attempts to create some datasets.
- *
- * Return:	Success:	0
- *
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-create_dsets(hid_t file)
-{
-    hid_t	dataset;
-    char	dset_name[32];
-    int		i;
-
-    /*
-     * Create a dataset using the default dataset creation properties.
-     */
-    for(i = 0; i < NUM_DSETS; i++) {
-	sprintf(dset_name, "dataset %d", i);
-    	if((dataset = H5Dcreate2(file, dset_name, H5T_NATIVE_DOUBLE, space,
-                H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto error;
-
-    	if(H5Dclose(dataset) < 0)
-            goto error;
-    } /* end for */
-
-    return 0;
-
-error:
-    return -1;
-
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_attrs_1
- *
- * Purpose:	Attempts to create all attributes for each existing dataset.
- *
- * Return:	Success:	0
- *
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-create_attrs_1(void)
-{
-    hid_t	file, dataset, attr;
-    char	filename[128];
-    char	dset_name[64];
-    char	attr_name[128];
-    int		i, j;
-    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
-    p_time      open_t  = {0, 0, 0, 1000000, 0, "H5Dopen2"};
-    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
-
-#ifdef H5_HAVE_PARALLEL
-    /* need the rank for printing data */
-    int         mpi_rank;
-    if(facc_type == FACC_MPIO)
-        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
-#endif /*H5_HAVE_PARALLEL*/
-
-    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-
-    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
-	fapl)) < 0)
-	goto error;
-
-    if(create_dsets(file) < 0)
-	goto error;
-
-    /*
-     * Create all(user specifies the number) attributes for each dataset
-     */
-    for(i = 0; i < NUM_DSETS; i++) {
-	sprintf(dset_name, "dataset %d", i);
-        open_t.start = retrieve_time();
-	if((dataset = H5Dopen2(file, dset_name, H5P_DEFAULT)) < 0)
-		goto error;
-	perf(&open_t, open_t.start, retrieve_time());
-
-	for(j = 0; j < NUM_ATTRS; j++) {
-            sprintf(attr_name, "all attrs for each dset %d", j);
-            attr_t.start = retrieve_time();
-            if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
-                    small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-                goto error;
-            if(H5Aclose(attr) < 0)
-                goto error;
-            perf(&attr_t, attr_t.start, retrieve_time());
-            if(flush_attr && H5Fflush(file, H5F_SCOPE_LOCAL) < 0)
-                goto error;
-    	} /* end for */
-
-	close_t.start = retrieve_time();
-    	if(H5Dclose(dataset) < 0)
-            goto error;
-	perf(&close_t, close_t.start, retrieve_time());
-        if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
-            goto error;
-    } /* end for */
-
-    if(facc_type == FACC_MPIO) {
-#ifdef H5_HAVE_PARALLEL
-        MPI_Barrier(MPI_COMM_WORLD);
-#endif /*H5_HAVE_PARALLEL*/
-    }
-
-#ifdef H5_HAVE_PARALLEL
-    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS)) /* only process 0 reports */
-#endif /*H5_HAVE_PARALLEL*/
-    {
-        /* Calculate the average time */
-        open_t.avg  = open_t.total / NUM_DSETS;
-        close_t.avg = close_t.total / NUM_DSETS;
-        if(NUM_ATTRS)
-            attr_t.avg  = attr_t.total / (NUM_ATTRS*NUM_DSETS);
-
-        /* Print out the performance result */
-        fprintf(stderr, "1.  Create %d attributes for each of %d existing datasets\n",
-            NUM_ATTRS, NUM_DSETS);
-        print_perf(open_t, close_t, attr_t);
-    }
-
-    if (H5Fclose(file) < 0) goto error;
-
-    return 0;
-
-error:
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_attrs_2
- *
- * Purpose:	Attempts to create all attributes for each new dataset.
- *
- * Return:	Success:	0
- *
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-create_attrs_2(void)
-{
-    hid_t	file, dataset, attr;
-    char	filename[128];
-    char	dset_name[64];
-    char	attr_name[128];
-    int		i, j;
-    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
-    p_time      create_t  = {0, 0, 0, 1000000, 0, "H5Dcreate2"};
-    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
-
-#ifdef H5_HAVE_PARALLEL
-    /* need the rank for printing data */
-    int         mpi_rank;
-    if(facc_type == FACC_MPIO)
-        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
-#endif /*H5_HAVE_PARALLEL*/
-
-    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
-
-    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
-	goto error;
-
-    /*
-     * Create all(user specifies the number) attributes for each new dataset
-     */
-    for(i = 0; i < NUM_DSETS; i++) {
-	sprintf(dset_name, "dataset %d", i);
-        create_t.start = retrieve_time();
-   	if((dataset = H5Dcreate2(file, dset_name, H5T_NATIVE_DOUBLE,
-                space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-            goto error;
-	perf(&create_t, create_t.start, retrieve_time());
-
-	for(j = 0; j < NUM_ATTRS; j++) {
-            sprintf(attr_name, "all attrs for each dset %d", j);
-            attr_t.start = retrieve_time();
-            if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
-                    small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-                goto error;
-            if(H5Aclose(attr) < 0)
-                goto error;
-            perf(&attr_t, attr_t.start, retrieve_time());
-            if(flush_attr && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
-                goto error;
-	} /* end for */
-
-	close_t.start = retrieve_time();
-    	if(H5Dclose(dataset) < 0)
-            goto error;
-	perf(&close_t, close_t.start, retrieve_time());
-        if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
-            goto error;
-    } /* end for */
-
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO)
-        MPI_Barrier(MPI_COMM_WORLD);
-#endif /*H5_HAVE_PARALLEL*/
-
-#ifdef H5_HAVE_PARALLEL
-    /* only process 0 reports if parallel */
-    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
-#endif /*H5_HAVE_PARALLEL*/
-    {
-        /* Calculate the average time */
-        create_t.avg = create_t.total / NUM_DSETS;
-        close_t.avg  = close_t.total / NUM_DSETS;
-        if(NUM_ATTRS)
-            attr_t.avg = attr_t.total / (NUM_ATTRS*NUM_DSETS);
-
-        /* Print out the performance result */
-        fprintf(stderr, "2.  Create %d attributes for each of %d new datasets\n",
-            NUM_ATTRS, NUM_DSETS);
-        print_perf(create_t, close_t, attr_t);
-    }
-
-    if (H5Fclose(file) < 0) goto error;
-
-    return 0;
-
-error:
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	create_attrs_3
- *
- * Purpose:	Attempts to create some attributes for each dataset in a
- * 		loop.
- *
- * Return:	Success:	0
- *
- *		Failure:	-1
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-create_attrs_3(void)
-{
-    hid_t	file, dataset, attr;
-    char	filename[128];
-    char	dset_name[64];
-    char	attr_name[128];
-    int		loop_num;
-    int		i, j, k;
-    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
-    p_time      open_t  = {0, 0, 0, 1000000, 0, "H5Dopen2"};
-    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
-
-#ifdef H5_HAVE_PARALLEL
-    /* need the rank for printing data */
-    int         mpi_rank;
-    if(facc_type == FACC_MPIO)
-        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
-#endif /*H5_HAVE_PARALLEL*/
-
-    h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
-
-    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
-	fapl)) < 0)
-	goto error;
-
-    if(create_dsets(file) < 0)
-	goto error;
-
-    /*
-     * Create some(user specifies the number) attributes for each dataset
-     * in a loop
-     */
-    loop_num = NUM_ATTRS/BATCH_ATTRS;
-
-    for(i = 0; i < loop_num; i++) {
-    	for(j = 0; j < NUM_DSETS; j++) {
-            sprintf(dset_name, "dataset %d", j);
-            open_t.start = retrieve_time();
-            if((dataset = H5Dopen2(file, dset_name, H5P_DEFAULT)) < 0)
-                goto error;
-            perf(&open_t, open_t.start, retrieve_time());
-
-            for(k = 0; k < BATCH_ATTRS; k++) {
-                sprintf(attr_name, "some attrs for each dset %d %d", i, k);
-                attr_t.start = retrieve_time();
-                if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
-                        small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
-                    goto error;
-                if(H5Aclose(attr) < 0)
-                    goto error;
-                perf(&attr_t, attr_t.start, retrieve_time());
-                if(flush_attr && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
-                    goto error;
-            } /* end for */
-
-            close_t.start = retrieve_time();
-            if(H5Dclose(dataset) < 0)
-                goto error;
-            perf(&close_t, close_t.start, retrieve_time());
-            if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
-                goto error;
-    	} /* end for */
-    } /* end for */
-
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO)
-        MPI_Barrier(MPI_COMM_WORLD);
-#endif /*H5_HAVE_PARALLEL*/
-
-#ifdef H5_HAVE_PARALLEL
-    /* only process 0 reports if parallel */
-    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
-#endif /*H5_HAVE_PARALLEL*/
-    {
-        /* Calculate the average time */
-        open_t.avg = open_t.total / (loop_num*NUM_DSETS);
-        close_t.avg = close_t.total / (loop_num*NUM_DSETS);
-        attr_t.avg = attr_t.total / (NUM_ATTRS*NUM_DSETS);
-
-        /* Print out the performance result */
-        fprintf(stderr, "3.  Create %d attributes for each of %d existing datasets for %d times\n",
-            BATCH_ATTRS, NUM_DSETS, loop_num);
-        print_perf(open_t, close_t, attr_t);
-    }
-
-    if (H5Fclose(file) < 0) goto error;
-
-    return 0;
-
-error:
-    return -1;
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	retrieve_time
- *
- * Purpose:     Returns time in seconds, in a double number.
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-double retrieve_time(void)
-{
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_DEFAULT) {
-#endif /*H5_HAVE_PARALLEL*/
-        struct timeval t;
-        HDgettimeofday(&t, NULL);
-        return ((double)t.tv_sec + (double)t.tv_usec / 1000000);
-#ifdef H5_HAVE_PARALLEL
-    } else {
-        return MPI_Wtime();
-    }
-#endif /*H5_HAVE_PARALLEL*/
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	perf
- *
- * Purpose:	Calculate total time, maximal and minimal time of
- *              performance.
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void perf(p_time *perf_t, double start_t, double end_t)
-{
-	double t = end_t - start_t;
-
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO) {
-        double reduced_t;
-        double t_max, t_min;
-        int    mpi_size, mpi_rank;
-
-        MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
-        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
-        MPI_Barrier(MPI_COMM_WORLD);
-
-        MPI_Reduce(&t, &reduced_t, 1, MPI_DOUBLE, MPI_SUM, 0,
-                MPI_COMM_WORLD);
-        reduced_t /= mpi_size;
-
-        MPI_Reduce(&t, &t_max, 1, MPI_DOUBLE, MPI_MAX, 0,
-                MPI_COMM_WORLD);
-        MPI_Reduce(&t, &t_min, 1, MPI_DOUBLE, MPI_MIN, 0,
-                MPI_COMM_WORLD);
-
-        if (MAINPROCESS) {
-            perf_t->total += reduced_t;
-
-	    if(t_max > perf_t->max)
-		perf_t->max = t_max;
-	    if(t_min < perf_t->min)
-		perf_t->min = t_min;
-        }
-    } else
-#endif /*H5_HAVE_PARALLEL*/
-    {
-	perf_t->total += t;
-
-	if(t > perf_t->max)
-		perf_t->max = t;
-	if(t < perf_t->min)
-		perf_t->min = t;
-    }
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	print_perf
- *
- * Purpose:	Print out performance data.
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void print_perf(p_time open_t, p_time close_t, p_time attr_t)
-{
-    fprintf(stderr, "\t%s:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
-		open_t.func, open_t.avg, open_t.max, open_t.min);
-    fprintf(stderr, "\tH5Dclose:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
-		close_t.avg, close_t.max, close_t.min);
-    if(NUM_ATTRS)
-        fprintf(stderr, "\tH5A(create & close):\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
-		attr_t.avg, attr_t.max, attr_t.min);
-}
-
-

-/*-------------------------------------------------------------------------
- * Function:	main
- *
- * Purpose:	Tests
- *
- * Return:	Success:	exit(0)
- *
- *		Failure:	exit(1)
- *
- * Programmer:	Raymond Lu
- *		Friday, Oct 3, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-int
-main(int argc, char **argv)
-{
-#ifdef H5_HAVE_PARALLEL
-    int mpi_size, mpi_rank;				/* mpi variables */
-#endif /*H5_HAVE_PARALLEL*/
-
-    if(parse_options(argc, argv) != 0) {
-       usage();
-       return 0;
-    }
-
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO) {
-        MPI_Init(&argc, &argv);
-        MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
-        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
-    }
-#endif /*H5_HAVE_PARALLEL*/
-
-#ifdef H5_HAVE_PARALLEL
-    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
-#endif /*H5_HAVE_PARALLEL*/
-        fprintf(stderr, "\t\tPerformance result of metadata for datasets and attributes\n\n");
-
-    fapl = H5Pcreate (H5P_FILE_ACCESS);
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO)
-        H5Pset_fapl_mpio(fapl, MPI_COMM_WORLD, MPI_INFO_NULL);
-#endif /*H5_HAVE_PARALLEL*/
-
-    nerrors += create_dspace() < 0 	?1:0;
-
-    if((RUN_TEST & TEST_1) || !RUN_TEST)
-        nerrors += create_attrs_1() < 0 	?1:0;
-    if((RUN_TEST & TEST_2) || !RUN_TEST)
-        nerrors += create_attrs_2() < 0 	?1:0;
-    if(((RUN_TEST & TEST_3) || !RUN_TEST) && BATCH_ATTRS && NUM_ATTRS)
-        nerrors += create_attrs_3() < 0 	?1:0;
-
-    if (H5Sclose(space) < 0) goto error;
-    if (H5Sclose(small_space) < 0) goto error;
-
-    h5_clean_files(FILENAME, fapl);
-
-#ifdef H5_HAVE_PARALLEL
-    if(facc_type == FACC_MPIO)
-        /* MPI_Finalize must be called AFTER H5close which may use MPI calls */
-        MPI_Finalize();
-#endif /*H5_HAVE_PARALLEL*/
-
-    if (nerrors) goto error;
-#ifdef H5_HAVE_PARALLEL
-    if (facc_type != FACC_DEFAULT && MAINPROCESS)
-#endif /*H5_HAVE_PARALLEL*/
-        printf("All metadata performance tests passed.\n");
-
-    return 0;
-
- error:
-    nerrors = MAX(1, nerrors);
-#ifdef H5_HAVE_PARALLEL
-    if (facc_type != FACC_DEFAULT && MAINPROCESS)
-#endif /*H5_HAVE_PARALLEL*/
-        printf("***** %d PERFORMANCE TEST%s FAILED! *****\n",
-	   nerrors, 1 == nerrors ? "" : "S");
-
-    return 1;
-}
-
diff --git a/tools/perform/pio_engine.c b/tools/perform/pio_engine.c
deleted file mode 100644
index eaedcb8..0000000
--- a/tools/perform/pio_engine.c
+++ /dev/null
@@ -1,2683 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Author: Albert Cheng of NCSA, Oct 24, 2001.
- */
-
-#include "hdf5.h"
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-
-#include <mpi.h>
-
-#ifndef MPI_FILE_NULL           /*MPIO may be defined in mpi.h already       */
-#   include <mpio.h>
-#endif  /* !MPI_FILE_NULL */
-
-#include "pio_perf.h"
-
-/* Macro definitions */
-
-#if H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 6
-#    define H5DCREATE(fd, name, type, space, dcpl)    H5Dcreate(fd, name, type, space, dcpl)
-#    define H5DOPEN(fd, name)                         H5Dopen(fd, name)
-#else
-#    define H5DCREATE(fd, name, type, space, dcpl)    H5Dcreate2(fd, name, type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)
-#    define H5DOPEN(fd, name)                         H5Dopen2(fd, name, H5P_DEFAULT)
-#endif
-
-/* sizes of various items. these sizes won't change during program execution */
-/* The following three must have the same type */
-#define ELMT_SIZE           (sizeof(unsigned char))     /* we're doing bytes */
-#define ELMT_MPI_TYPE       MPI_BYTE
-#define ELMT_H5_TYPE        H5T_NATIVE_UCHAR
-
-#define GOTOERROR(errcode)  { ret_code = errcode; goto done; }
-#define GOTODONE        { goto done; }
-#define ERRMSG(mesg) {                                                  \
-    fprintf(stderr, "Proc %d: ", pio_mpi_rank_g);                       \
-    fprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n",    \
-        mesg, (int)__LINE__, __FILE__);                             \
-}
-
-#define MSG(mesg) {                                     \
-    fprintf(stderr, "Proc %d: ", pio_mpi_rank_g);       \
-    fprintf(stderr, "(%s) at line %4d in %s\n",         \
-        mesg, (int)__LINE__, __FILE__);             \
-}
-
-/* verify: if val is false (0), print mesg. */
-#define VRFY(val, mesg) do {                            \
-    if (!val) {                                         \
-    ERRMSG(mesg);                                   \
-    GOTOERROR(FAIL);                                \
-    }                                                   \
-} while(0)
-
-
-/* POSIX I/O macros */
-#define POSIXCREATE(fn)           HDopen(fn, O_CREAT|O_TRUNC|O_RDWR, 0600)
-#define POSIXOPEN(fn, F)          HDopen(fn, F, 0600)
-#define POSIXCLOSE(F)             HDclose(F)
-#define POSIXSEEK(F,L)            HDlseek(F, L, SEEK_SET)
-#define POSIXWRITE(F,B,S)         HDwrite(F,B,S)
-#define POSIXREAD(F,B,S)          HDread(F,B,S)
-
-enum {
-    PIO_CREATE = 1,
-    PIO_WRITE = 2,
-    PIO_READ = 4
-};
-
-/* Global variables */
-static int  clean_file_g = -1;  /*whether to cleanup temporary test     */
-/*files. -1 is not defined;             */
-/*0 is no cleanup; 1 is do cleanup      */
-
-/*
- * In a parallel machine, the filesystem suitable for compiling is
- * unlikely a parallel file system that is suitable for parallel I/O.
- * There is no standard pathname for the parallel file system.  /tmp
- * is about the best guess.
- */
-#ifndef HDF5_PARAPREFIX
-#    define HDF5_PARAPREFIX     ""
-#endif  /* !HDF5_PARAPREFIX */
-
-#ifndef MIN
-#   define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif  /* !MIN */
-
-/* the different types of file descriptors we can expect */
-typedef union _file_descr {
-    int         posixfd;    /* POSIX file handle*/
-    MPI_File    mpifd;      /* MPI file         */
-    hid_t       h5fd;       /* HDF5 file        */
-} file_descr;
-
-/* local functions */
-static char  *pio_create_filename(iotype iot, const char *base_name,
-    char *fullname, size_t size);
-static herr_t do_write(results *res, file_descr *fd, parameters *parms,
-    long ndsets, off_t nelmts, size_t buf_size, void *buffer);
-static herr_t do_read(results *res, file_descr *fd, parameters *parms,
-    long ndsets, off_t nelmts, size_t buf_size, void *buffer /*out*/);
-static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/,
-    int flags);
-static herr_t do_fclose(iotype iot, file_descr *fd);
-static void do_cleanupfile(iotype iot, char *fname);
-
-/*
- * Function:        do_pio
- * Purpose:         PIO Engine where Parallel IO are executed.
- * Return:          results
- * Programmer:      Albert Cheng, Bill Wendling 2001/12/12
- * Modifications:
- *  Added 2D testing (Christian Chilan, 10. August 2005)
- */
-    results
-do_pio(parameters param)
-{
-    /* return codes */
-    herr_t      ret_code = 0;   /*return code                           */
-    results     res;
-
-    file_descr  fd;
-    iotype      iot;
-
-    char        fname[FILENAME_MAX];
-    long    nf;
-    long        ndsets;
-    off_t       nbytes;         /*number of bytes per dataset  */
-    off_t   snbytes;    /*general dataset size          */
-                                /*for 1D, it is the actual dataset size */
-                                /*for 2D, it is the size of a side of the dataset square */
-    char        *buffer = NULL; /*data buffer pointer           */
-    size_t      buf_size;       /*general buffer size in bytes     */
-                                /*for 1D, it is the actual buffer size */
-                                /*for 2D, it is the length of the buffer rectangle */
-    size_t      blk_size;       /*data block size in bytes      */
-    size_t  bsize;      /*actual buffer size            */
-
-    /* HDF5 variables */
-    herr_t          hrc;        /*HDF5 return code              */
-
-    /* Sanity check parameters */
-
-    /* IO type */
-    iot = param.io_type;
-
-    switch (iot) {
-        case MPIO:
-            fd.mpifd = MPI_FILE_NULL;
-            res.timers = io_time_new(MPI_CLOCK);
-            break;
-        case POSIXIO:
-            fd.posixfd = -1;
-            res.timers = io_time_new(MPI_CLOCK);
-            break;
-        case PHDF5:
-            fd.h5fd = -1;
-            res.timers = io_time_new(MPI_CLOCK);
-            break;
-        default:
-            /* unknown request */
-            fprintf(stderr, "Unknown IO type request (%d)\n", iot);
-            GOTOERROR(FAIL);
-    }
-
-    ndsets = param.num_dsets;       /* number of datasets per file          */
-    nbytes = param.num_bytes;       /* number of bytes per dataset          */
-    buf_size = param.buf_size;
-    blk_size = param.blk_size;
-
-    if (!param.dim2d){
-        snbytes = nbytes;   /* General dataset size     */
-        bsize = buf_size;   /* Actual buffer size       */
-    }
-    else {
-        snbytes = (off_t)sqrt(nbytes);  /* General dataset size     */
-        bsize = buf_size * blk_size;    /* Actual buffer size       */
-    }
-
-    if (param.num_files < 0 ) {
-    fprintf(stderr,
-        "number of files must be >= 0 (%ld)\n",
-        param.num_files);
-    GOTOERROR(FAIL);
-    }
-
-    if (ndsets < 0 ) {
-    fprintf(stderr,
-        "number of datasets per file must be >= 0 (%ld)\n",
-        ndsets);
-    GOTOERROR(FAIL);
-    }
-
-    if (param.num_procs <= 0 ) {
-    fprintf(stderr,
-        "maximum number of process to use must be > 0 (%d)\n",
-        param.num_procs);
-    GOTOERROR(FAIL);
-    }
-
-    /* Validate transfer buffer size & block size*/
-    if(blk_size<=0) {
-    HDfprintf(stderr,
-        "Transfer block size (%zu) must be > 0\n", blk_size);
-    GOTOERROR(FAIL);
-    }
-    if(buf_size<=0) {
-    HDfprintf(stderr,
-        "Transfer buffer size (%zu) must be > 0\n", buf_size);
-    GOTOERROR(FAIL);
-    }
-    if ((buf_size % blk_size) != 0){
-    HDfprintf(stderr,
-        "Transfer buffer size (%zu) must be a multiple of the "
-        "interleaved I/O block size (%zu)\n",
-        buf_size, blk_size);
-    GOTOERROR(FAIL);
-    }
-    if((snbytes%pio_mpi_nprocs_g)!=0) {
-    HDfprintf(stderr,
-              "Dataset size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
-              "number of processes (%d)\n",
-              (long long)snbytes, pio_mpi_nprocs_g);
-    GOTOERROR(FAIL);
-    }
-
-    if (!param.dim2d){
-        if(((snbytes/pio_mpi_nprocs_g)%buf_size)!=0) {
-        HDfprintf(stderr,
-            "Dataset size/process (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
-            "trasfer buffer size (%zu)\n",
-            (long long)(snbytes/pio_mpi_nprocs_g), buf_size);
-        GOTOERROR(FAIL);
-        }
-    }
-    else {
-        if((snbytes%buf_size)!=0) {
-        HDfprintf(stderr,
-            "Dataset side size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
-            "trasfer buffer size (%zu)\n",
-            (long long)snbytes, buf_size);
-        GOTOERROR(FAIL);
-        }
-    }
-
-    /* Allocate transfer buffer */
-    if ((buffer = malloc(bsize)) == NULL){
-    HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n",
-        bsize);
-    GOTOERROR(FAIL);
-    }
-
-    if (pio_debug_level >= 4) {
-    int myrank;
-
-    MPI_Comm_rank(pio_comm_g, &myrank);
-
-    /* output all of the times for all iterations */
-    if (myrank == 0)
-        fprintf(output, "Timer details:\n");
-    }
-
-    for (nf = 1; nf <= param.num_files; nf++) {
-    /*
-     * Write performance measurement
-     */
-    /* Open file for write */
-    char base_name[256];
-
-    sprintf(base_name, "#pio_tmp_%lu", nf);
-    pio_create_filename(iot, base_name, fname, sizeof(fname));
-    if (pio_debug_level > 0)
-        HDfprintf(output, "rank %d: data filename=%s\n",
-            pio_mpi_rank_g, fname);
-
-    /* Need barrier to make sure everyone starts at the same time */
-    MPI_Barrier(pio_comm_g);
-
-    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
-    hrc = do_fopen(&param, fname, &fd, PIO_CREATE | PIO_WRITE);
-
-    VRFY((hrc == SUCCESS), "do_fopen failed");
-
-    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
-    hrc = do_write(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
-    hrc == SUCCESS;
-    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
-
-    VRFY((hrc == SUCCESS), "do_write failed");
-
-    /* Close file for write */
-    hrc = do_fclose(iot, &fd);
-
-    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
-    VRFY((hrc == SUCCESS), "do_fclose failed");
-
-    if (!param.h5_write_only) {
-        /*
-         * Read performance measurement
-         */
-        /* Need barrier to make sure everyone is done writing and has
-         * closed the file.  Also to make sure everyone starts reading
-         * at the same time.
-         */
-        MPI_Barrier(pio_comm_g);
-
-        /* Open file for read */
-        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
-        hrc = do_fopen(&param, fname, &fd, PIO_READ);
-
-        VRFY((hrc == SUCCESS), "do_fopen failed");
-
-        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
-        hrc = do_read(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
-        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
-        VRFY((hrc == SUCCESS), "do_read failed");
-
-        /* Close file for read */
-        hrc = do_fclose(iot, &fd);
-
-        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
-        VRFY((hrc == SUCCESS), "do_fclose failed");
-    }
-
-    /* Need barrier to make sure everyone is done with the file */
-    /* before it may be removed by do_cleanupfile */
-    MPI_Barrier(pio_comm_g);
-    do_cleanupfile(iot, fname);
-    }
-
-done:
-    /* clean up */
-    /* release HDF5 objects */
-
-    /* close any opened files */
-    /* no remove(fname) because that should have happened normally. */
-    switch (iot) {
-        case POSIXIO:
-            if (fd.posixfd != -1)
-            hrc = do_fclose(iot, &fd);
-            break;
-        case MPIO:
-            if (fd.mpifd != MPI_FILE_NULL)
-            hrc = do_fclose(iot, &fd);
-            break;
-        case PHDF5:
-            if (fd.h5fd != -1)
-            hrc = do_fclose(iot, &fd);
-            break;
-    }
-
-    /* release generic resources */
-    if(buffer)
-    free(buffer);
-    res.ret_code = ret_code;
-    return res;
-}
-
-/*
- * Function:    pio_create_filename
- * Purpose:     Create a new filename to write to. Determine the correct
- *              suffix to append to the filename by the type of I/O we're
- *              doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
- *              USER or LOGIN are specified in the environment.
- * Return:      Pointer to filename or NULL
- * Programmer:  Bill Wendling, 21. November 2001
- * Modifications:
- */
-    static char *
-pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size)
-{
-    const char *prefix, *suffix = "";
-    char *ptr, last = '\0';
-    size_t i, j;
-
-    if (!base_name || !fullname || size < 1)
-        return NULL;
-
-    HDmemset(fullname, 0, size);
-
-    switch (iot) {
-        case POSIXIO:
-            suffix = ".posix";
-            break;
-        case MPIO:
-            suffix = ".mpio";
-            break;
-        case PHDF5:
-            suffix = ".h5";
-            break;
-    }
-
-    /* First use the environment variable and then try the constant */
-    prefix = HDgetenv("HDF5_PARAPREFIX");
-
-#ifdef HDF5_PARAPREFIX
-    if (!prefix)
-        prefix = HDF5_PARAPREFIX;
-#endif  /* HDF5_PARAPREFIX */
-
-    /* Prepend the prefix value to the base name */
-    if (prefix && *prefix) {
-        /* If the prefix specifies the HDF5_PARAPREFIX directory, then
-         * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
-         * directory instead. */
-        register char *user, *login, *subdir;
-
-        user = HDgetenv("USER");
-        login = HDgetenv("LOGIN");
-        subdir = (user ? user : login);
-
-        if (subdir) {
-            for (i = 0; i < size-1 && prefix[i]; i++)
-                fullname[i] = prefix[i];
-
-            fullname[i++] = '/';
-
-            for (j = 0; i < size && subdir[j]; i++, j++)
-                fullname[i] = subdir[j];
-        }
-        else {
-            /* We didn't append the prefix yet */
-            HDstrncpy(fullname, prefix, size);
-            fullname[size - 1] = '\0';
-        }
-
-        if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
-            /* Append the base_name with a slash first. Multiple slashes are
-             * handled below. */
-            h5_stat_t buf;
-
-            if (HDstat(fullname, &buf) < 0)
-                /* The directory doesn't exist just yet */
-                if (HDmkdir(fullname, (mode_t) 0755) < 0 && errno != EEXIST) {
-                    /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
-                     * Default to PREFIX's original prefix value. */
-                    HDstrcpy(fullname, prefix);
-                }
-
-            HDstrcat(fullname, "/");
-            HDstrcat(fullname, base_name);
-        }
-        else {
-            /* Buffer is too small */
-            return NULL;
-        }
-    }
-    else if (HDstrlen(base_name) >= size) {
-        /* Buffer is too small */
-        return NULL;
-    }
-    else {
-        HDstrcpy(fullname, base_name);
-    }
-
-    /* Append a suffix */
-    if (suffix) {
-        if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
-            return NULL;
-
-        HDstrcat(fullname, suffix);
-    }
-
-    /* Remove any double slashes in the filename */
-    for (ptr = fullname, i = j = 0; ptr && i < size; i++, ptr++) {
-        if (*ptr != '/' || last != '/')
-            fullname[j++] = *ptr;
-
-        last = *ptr;
-    }
-
-    return fullname;
-}
-
-/*
- * Function:        do_write
- * Purpose:         Write the required amount of data to the file.
- * Return:          SUCCESS or FAIL
- * Programmer:      Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- *  Added 2D testing (Christian Chilan, 10. August 2005)
- */
-    static herr_t
-do_write(results *res, file_descr *fd, parameters *parms, long ndsets,
-    off_t nbytes, size_t buf_size, void *buffer)
-{
-    int         ret_code = SUCCESS;
-    int         rc;             /*routine return code                   */
-    long        ndset;
-    size_t      blk_size;       /* The block size to subdivide the xfer buffer into */
-    off_t       nbytes_xfer;    /* Total number of bytes transferred so far */
-    size_t      nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
-    size_t      nbytes_toxfer;  /* Number of bytes to transfer a particular time */
-    char        dname[64];
-    off_t       dset_offset=0;  /*dataset offset in a file              */
-    off_t       bytes_begin[2];    /*first elmt this process transfer      */
-    off_t       bytes_count;    /*number of elmts this process transfer */
-    off_t       snbytes=0;  /*size of a side of the dataset square  */
-    unsigned char *buf_p;       /* Current buffer pointer               */
-
-    /* POSIX variables */
-    off_t       file_offset;    /* File offset of the next transfer     */
-    off_t       file_offset_advance;    /* File offset advance after each I/O operation */
-    off_t       posix_file_offset;    /* Base file offset of the next transfer      */
-
-    /* MPI variables */
-    MPI_Offset  mpi_file_offset;    /* Base file offset of the next transfer*/
-    MPI_Offset  mpi_offset;         /* Offset in MPI file                   */
-    MPI_Offset  mpi_offset_advance; /* Offset advance after each I/O operation */
-    MPI_Datatype mpi_file_type;     /* MPI derived type for 1D file            */
-    MPI_Datatype mpi_blk_type;      /* MPI derived type for 1D buffer          */
-    MPI_Datatype mpi_cont_type;     /* MPI derived type for 2D contiguous file */
-    MPI_Datatype mpi_partial_buffer_cont;       /* MPI derived type for partial 2D contiguous buffer */
-    MPI_Datatype mpi_inter_type;    /* MPI derived type for 2D interleaved file  */
-    MPI_Datatype mpi_partial_buffer_inter;      /* MPI derived type for partial 2D interleaved buffer */
-    MPI_Datatype mpi_full_buffer;       /* MPI derived type for 2D full buffer */
-    MPI_Datatype mpi_full_chunk;        /* MPI derived type for 2D full chunk */
-    MPI_Datatype mpi_chunk_inter_type;  /* MPI derived type for 2D chunk interleaved file */
-    MPI_Datatype mpi_collective_type;   /* Generic MPI derived type for 2D collective access */
-    MPI_Status  mpi_status;
-    int         mrc;                /* MPI return code                      */
-
-    /* HDF5 variables */
-    herr_t      hrc;                    /*HDF5 return code              */
-    hsize_t     h5dims[2];              /*dataset dim sizes             */
-    hid_t       h5dset_space_id = -1;   /*dataset space ID              */
-    hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
-    hid_t       h5ds_id = -1;           /*dataset handle                */
-    hsize_t     h5block[2];     /*dataspace selection           */
-    hsize_t     h5stride[2];
-    hsize_t     h5count[2];
-    hsize_t     h5start[2];
-    hssize_t    h5offset[2];            /* Selection offset within dataspace */
-    hid_t       h5dcpl = -1;            /* Dataset creation property list */
-    hid_t       h5dxpl = -1;            /* Dataset transfer property list */
-
-    /* Get the parameters from the parameter block */
-    blk_size=parms->blk_size;
-
-    /* There are two kinds of transfer patterns, contiguous and interleaved.
-     * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
-     *     where n is rank of the last process.
-     * In contiguous pattern, data are accessed as
-     *    000...111...222...nnn...
-     * In interleaved pattern, data are accessed as
-     *    012...n012...n...
-     * These are all in the scope of one dataset.
-     */
-
-    /* 1D dataspace */
-    if (!parms->dim2d){
-        /* Contiguous Pattern: */
-        if (!parms->interleaved) {
-            bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g);
-        } /* end if */
-        /* Interleaved Pattern: */
-        else {
-            bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g);
-        } /* end else */
-
-        /* Prepare buffer for verifying data */
-        if (parms->verify)
-            memset(buffer,pio_mpi_rank_g+1,buf_size);
-    }/* end if */
-    /* 2D dataspace */
-    else {
-        /* nbytes is always the number of bytes per dataset (1D or 2D). If the
-           dataspace is 2D, snbytes is the size of a side of the dataset square.
-         */
-        snbytes = (off_t)sqrt(nbytes);
-
-        /* Contiguous Pattern: */
-        if (!parms->interleaved) {
-            bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g);
-            bytes_begin[1] = 0;
-        } /* end if */
-        /* Interleaved Pattern: */
-        else {
-            bytes_begin[0] = 0;
-
-            if(!parms->h5_use_chunks || parms->io_type==PHDF5)
-                bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g);
-            else
-                bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g);
-        } /* end else */
-
-        /* Prepare buffer for verifying data */
-        if (parms->verify)
-            memset(buffer,pio_mpi_rank_g+1,buf_size*blk_size);
-    } /* end else */
-
-
-    /* Calculate the total number of bytes (bytes_count) to be
-     * transferred by this process. It may be different for different
-     * transfer pattern due to rounding to integral values.
-     */
-    /*
-     * Calculate the beginning bytes of this process and the next.
-     * bytes_count is the difference between these two beginnings.
-     * This way, it eliminates any rounding errors.
-     * (This is tricky, don't mess with the formula, rounding errors
-     * can easily get introduced) */
-    bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g)
-    - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g);
-
-    /* debug */
-    if (pio_debug_level >= 4) {
-        HDprint_rank(output);
-        if (!parms->dim2d) {
-        HDfprintf(output, "Debug(do_write): "
-            "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
-            buf_size, (long long)bytes_begin[0],
-            (long long)bytes_count);
-        } else {
-        HDfprintf(output, "Debug(do_write): "
-            "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
-            buf_size*blk_size, (long long)bytes_begin[0],
-            (long long)bytes_begin[1], (long long)bytes_count);
-        }
-    }
-
-    /* I/O Access specific setup */
-    switch (parms->io_type) {
-    case POSIXIO:
-        /* No extra setup */
-        break;
-
-    case MPIO: /* MPI-I/O setup */
-        /* 1D dataspace */
-        if (!parms->dim2d){
-            /* Build block's derived type */
-            mrc = MPI_Type_contiguous((int)blk_size,
-                MPI_BYTE, &mpi_blk_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Build file's derived type */
-            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1,
-                (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit file type */
-            mrc = MPI_Type_commit( &mpi_file_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Commit buffer type */
-            mrc = MPI_Type_commit( &mpi_blk_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-        } /* end if */
-        /* 2D dataspace */
-        else {
-            /* Build partial buffer derived type for contiguous access */
-
-            mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE,
-                &mpi_partial_buffer_cont);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit partial buffer derived type */
-            mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build contiguous file's derived type */
-            mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size),
-                mpi_partial_buffer_cont, &mpi_cont_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit contiguous file type */
-            mrc = MPI_Type_commit(&mpi_cont_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build partial buffer derived type for interleaved access */
-            mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE,
-                &mpi_partial_buffer_inter);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit partial buffer derived type */
-            mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build interleaved file's derived type */
-            mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size),
-                mpi_partial_buffer_inter, &mpi_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit interleaved file type */
-            mrc = MPI_Type_commit(&mpi_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build full buffer derived type */
-            mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE,
-                &mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit full buffer derived type */
-            mrc = MPI_Type_commit(&mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build full chunk derived type */
-            mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE,
-                &mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit full chunk derived type */
-            mrc = MPI_Type_commit(&mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build chunk interleaved file's derived type */
-            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size),
-                mpi_full_chunk, &mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit chunk interleaved file type */
-            mrc = MPI_Type_commit(&mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-        } /* end else */
-        break;
-
-    case PHDF5: /* HDF5 setup */
-        /* 1D dataspace */
-        if (!parms->dim2d){
-            if(nbytes>0) {
-                /* define a contiguous dataset of nbytes native bytes */
-                h5dims[0] = nbytes;
-                h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
-                VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
-                /* Set up the file dset space id to select the pattern to access */
-                if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5start[0] = bytes_begin[0];
-                h5stride[0] = h5block[0] = blk_size;
-                h5count[0] = buf_size/blk_size;
-                } /* end if */
-                else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5start[0] = bytes_begin[0];
-                h5stride[0] = blk_size*pio_mpi_nprocs_g;
-                h5block[0] = blk_size;
-                h5count[0] = buf_size/blk_size;
-                } /* end else */
-                hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                    h5start, h5stride, h5count, h5block);
-                VRFY((hrc >= 0), "H5Sselect_hyperslab");
-            } /* end if */
-            else {
-                h5dset_space_id = H5Screate(H5S_SCALAR);
-                VRFY((h5dset_space_id >= 0), "H5Screate");
-            } /* end else */
-
-            /* Create the memory dataspace that corresponds to the xfer buffer */
-            if(buf_size>0) {
-                h5dims[0] = buf_size;
-                h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
-                VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-            } /* end if */
-            else {
-                h5mem_space_id = H5Screate(H5S_SCALAR);
-                VRFY((h5mem_space_id >= 0), "H5Screate");
-            } /* end else */
-        } /* end if */
-        /* 2D dataspace */
-        else {
-            if(nbytes>0) {
-                /* define a contiguous dataset of nbytes native bytes */
-                h5dims[0] = snbytes;
-                h5dims[1] = snbytes;
-                h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
-                VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
-                /* Set up the file dset space id to select the pattern to access */
-                if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5start[0] = bytes_begin[0];
-                h5start[1] = bytes_begin[1];
-                h5stride[0] = 1;
-                h5stride[1] = h5block[0] = h5block[1] = blk_size;
-                h5count[0] = 1;
-                h5count[1] = buf_size/blk_size;
-                } /* end if */
-                else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5start[0] = bytes_begin[0];
-                h5start[1] = bytes_begin[1];
-                h5stride[0] = blk_size;
-                h5stride[1] = blk_size*pio_mpi_nprocs_g;
-                h5block[0] = h5block[1] = blk_size;
-                h5count[0] = buf_size/blk_size;
-                h5count[1] = 1;
-                } /* end else */
-                hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                    h5start, h5stride, h5count, h5block);
-                VRFY((hrc >= 0), "H5Sselect_hyperslab");
-            } /* end if */
-            else {
-                h5dset_space_id = H5Screate(H5S_SCALAR);
-                VRFY((h5dset_space_id >= 0), "H5Screate");
-            } /* end else */
-
-            /* Create the memory dataspace that corresponds to the xfer buffer */
-            if(buf_size>0) {
-                if (!parms->interleaved){
-                h5dims[0] = blk_size;
-                h5dims[1] = buf_size;
-                }else{
-                h5dims[0] = buf_size;
-                h5dims[1] = blk_size;
-                }
-                h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
-                VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-            } /* end if */
-            else {
-                h5mem_space_id = H5Screate(H5S_SCALAR);
-                VRFY((h5mem_space_id >= 0), "H5Screate");
-            } /* end else */
-        } /* end else */
-
-        /* Create the dataset transfer property list */
-        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
-        if (h5dxpl < 0) {
-        fprintf(stderr, "HDF5 Property List Create failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        /* Change to collective I/O, if asked */
-        if(parms->collective) {
-            hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
-            if (hrc < 0) {
-                fprintf(stderr, "HDF5 Property List Set failed\n");
-                GOTOERROR(FAIL);
-            } /* end if */
-        } /* end if */
-        break;
-    } /* end switch */
-
-    for (ndset = 1; ndset <= ndsets; ++ndset) {
-
-    /* Calculate dataset offset within a file */
-
-    /* create dataset */
-    switch (parms->io_type) {
-        case POSIXIO:
-        case MPIO:
-            /* both posix and mpi io just need dataset offset in file*/
-            dset_offset = (ndset - 1) * nbytes;
-            break;
-
-        case PHDF5:
-            h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
-            if (h5dcpl < 0) {
-                fprintf(stderr, "HDF5 Property List Create failed\n");
-                GOTOERROR(FAIL);
-            }
-            /* 1D dataspace */
-            if (!parms->dim2d){
-                /* Make the dataset chunked if asked */
-                if(parms->h5_use_chunks) {
-                /* Set the chunk size to be the same as the buffer size */
-                h5dims[0] = blk_size;
-                hrc = H5Pset_chunk(h5dcpl, 1, h5dims);
-                if (hrc < 0) {
-                    fprintf(stderr, "HDF5 Property List Set failed\n");
-                    GOTOERROR(FAIL);
-                } /* end if */
-                } /* end if */
-            }/* end if */
-            else{
-                /* 2D dataspace */
-                if(parms->h5_use_chunks) {
-                /* Set the chunk size to be the same as the block size */
-                h5dims[0] = blk_size;
-                h5dims[1] = blk_size;
-                hrc = H5Pset_chunk(h5dcpl, 2, h5dims);
-                if (hrc < 0) {
-                    fprintf(stderr, "HDF5 Property List Set failed\n");
-                    GOTOERROR(FAIL);
-                } /* end if */
-                } /* end if */
-            }/* end else */
-
-            sprintf(dname, "Dataset_%ld", ndset);
-            h5ds_id = H5DCREATE(fd->h5fd, dname, ELMT_H5_TYPE,
-                h5dset_space_id, h5dcpl);
-
-            if (h5ds_id < 0) {
-                fprintf(stderr, "HDF5 Dataset Create failed\n");
-                GOTOERROR(FAIL);
-            }
-
-            hrc = H5Pclose(h5dcpl);
-            /* verifying the close of the dcpl */
-            if (hrc < 0) {
-                fprintf(stderr, "HDF5 Property List Close failed\n");
-                GOTOERROR(FAIL);
-            }
-            break;
-    }
-
-    /* The task is to transfer bytes_count bytes, starting at
-     * bytes_begin position, using transfer buffer of buf_size bytes.
-     * If interleaved, select buf_size at a time, in round robin
-     * fashion, according to number of process. Otherwise, select
-     * all bytes_count in contiguous.
-     */
-    nbytes_xfer = 0 ;
-
-    /* 1D dataspace */
-    if (!parms->dim2d){
-        /* Set base file offset for all I/O patterns and POSIX access */
-        posix_file_offset = dset_offset + bytes_begin[0];
-
-        /* Set base file offset for all I/O patterns and MPI access */
-        mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
-    } /* end if */
-    else {
-        /* Set base file offset for all I/O patterns and POSIX access */
-        posix_file_offset=dset_offset + bytes_begin[0]*snbytes+
-        bytes_begin[1];
-
-        /* Set base file offset for all I/O patterns and MPI access */
-        mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+
-            bytes_begin[1]);
-    } /* end else */
-
-    /* Start "raw data" write timer */
-    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
-
-    while (nbytes_xfer < bytes_count){
-        /* Write */
-        /* Calculate offset of write within a dataset/file */
-        switch (parms->io_type) {
-        case POSIXIO:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-                /* Contiguous pattern */
-                if (!parms->interleaved) {
-                    /* Compute file offset */
-                    file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
-                    /* only care if seek returns error */
-                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                    VRFY((rc==0), "POSIXSEEK");
-
-                    /* check if all bytes are written */
-                    rc = ((ssize_t)buf_size ==
-                        POSIXWRITE(fd->posixfd, buffer, buf_size));
-                    VRFY((rc != 0), "POSIXWRITE");
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=buf_size;
-                } /* end if */
-                /* Interleaved access pattern */
-                else {
-                    /* Set the base of user's buffer */
-                    buf_p=(unsigned char *)buffer;
-
-                    /* Set the number of bytes to transfer this time */
-                    nbytes_toxfer = buf_size;
-
-                    /* Loop over the buffers to write */
-                    while(nbytes_toxfer>0) {
-                        /* Skip offset over blocks of other processes */
-                        file_offset = posix_file_offset +
-                            (off_t)(nbytes_xfer*pio_mpi_nprocs_g);
-
-                        /* only care if seek returns error */
-                        rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                        VRFY((rc==0), "POSIXSEEK");
-
-                        /* check if all bytes are written */
-                        rc = ((ssize_t)blk_size ==
-                            POSIXWRITE(fd->posixfd, buf_p, blk_size));
-                        VRFY((rc != 0), "POSIXWRITE");
-
-                        /* Advance location in buffer */
-                        buf_p+=blk_size;
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=blk_size;
-
-                        /* Decrement number of bytes left this time */
-                        nbytes_toxfer-=blk_size;
-                    } /* end while */
-                } /* end else */
-            } /* end if */
-            /* 2D dataspace */
-            else {
-                /* Contiguous storage */
-                if (!parms->h5_use_chunks) {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)
-                            /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes));
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = (off_t)snbytes;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size)
-                            *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes)
-                            +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = (off_t)snbytes;
-                    } /* end else */
-                } /* end if */
-                /* Chunked storage */
-                else {
-                    /*Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)nbytes_xfer;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = 0;
-                    } /* end if */
-                    /*Interleaved access pattern */
-                    else {
-                        /* Compute file offset */
-                        /* Before simplification */
-                        /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
-                        *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
-                        *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
-                        *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
-
-                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size)
-                        *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size))
-                        *pio_mpi_nprocs_g)%(snbytes*blk_size));
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
-                        file_offset_advance = (off_t)(snbytes*blk_size);
-                    } /* end else */
-                } /* end else */
-
-                /* Common code for file access */
-
-                /* Set the base of user's buffer */
-                buf_p = (unsigned char *)buffer;
-
-                /* Set the number of bytes to transfer this time */
-                nbytes_toxfer = buf_size*blk_size;
-
-                /* Loop over portions of the buffer to write */
-                while(nbytes_toxfer>0){
-                    /* only care if seek returns error */
-                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                    VRFY((rc==0), "POSIXSEEK");
-
-                    /* check if all bytes are written */
-                    rc = ((ssize_t)nbytes_xfer_advance ==
-                        POSIXWRITE(fd->posixfd, buf_p, nbytes_xfer_advance));
-                    VRFY((rc != 0), "POSIXWRITE");
-
-                    /* Advance location in buffer */
-                    buf_p+=nbytes_xfer_advance;
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=nbytes_xfer_advance;
-
-                    /* Decrement number of bytes left this time */
-                    nbytes_toxfer-=nbytes_xfer_advance;
-
-                    /* Partially advance file offset */
-                    file_offset+=file_offset_advance;
-                } /* end while */
-
-            } /* end else */
-
-            break;
-
-        case MPIO:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-                /* Independent file access */
-                if(!parms->collective) {
-                    /* Contiguous pattern */
-                    if (!parms->interleaved){
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            nbytes_xfer;
-
-                        /* Perform independent write */
-                        mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type,
-                            &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Set the base of user's buffer */
-                        buf_p=(unsigned char *)buffer;
-
-                        /* Set the number of bytes to transfer this time */
-                        nbytes_toxfer = buf_size;
-
-                        /* Loop over the buffers to write */
-                        while(nbytes_toxfer>0) {
-                            /* Skip offset over blocks of other processes */
-                            mpi_offset = mpi_file_offset +
-                            (nbytes_xfer*pio_mpi_nprocs_g);
-
-                            /* Perform independent write */
-                            mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p,
-                                (int)1, mpi_blk_type, &mpi_status);
-                            VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                            /* Advance location in buffer */
-                            buf_p+=blk_size;
-
-                            /* Advance global offset in dataset */
-                            nbytes_xfer+=blk_size;
-
-                            /* Decrement number of bytes left this time */
-                            nbytes_toxfer-=blk_size;
-                        } /* end while */
-                    } /* end else */
-                } /* end if */
-                /* Collective file access */
-                else {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved){
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            nbytes_xfer;
-
-                        /* Perform independent write */
-                        mrc = MPI_File_write_at_all(fd->mpifd, mpi_offset, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            (nbytes_xfer*pio_mpi_nprocs_g);
-
-                        /* Set the file view */
-                        mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type,
-                            mpi_file_type, (char*)"native",  h5_io_info_g);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
-
-                        /* Perform write */
-                        mrc = MPI_File_write_at_all(fd->mpifd, 0, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end else */
-                } /* end else */
-            } /* end if */
-            /* 2D dataspace */
-            else {
-                /* Contiguous storage */
-                if (!parms->h5_use_chunks) {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)*
-                            (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = snbytes;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_cont_type;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)*
-                            (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = snbytes;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_inter_type;
-                    } /* end else */
-                } /* end if */
-                /* Chunked storage */
-                else {
-                    /*Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+nbytes_xfer;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = 0;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_full_buffer;
-                    } /* end if */
-                    /*Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        /* Before simplification */
-                        /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
-                            *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
-                            (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
-                            ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
-                            /blk_size*(blk_size*blk_size)); */
-                        mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size)
-                            *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)
-                            +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
-                        mpi_offset_advance = (MPI_Offset)(snbytes*blk_size);
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_chunk_inter_type;
-                    } /* end else */
-                } /* end else */
-
-                /* Common code for independent file access */
-                if (!parms->collective) {
-                    /* Set the base of user's buffer */
-                    buf_p = (unsigned char *)buffer;
-
-                    /* Set the number of bytes to transfer this time */
-                    nbytes_toxfer = buf_size * blk_size;
-
-                    /* Loop over portions of the buffer to write */
-                    while(nbytes_toxfer>0){
-                        /* Perform independent write */
-                        mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p,
-                            (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                        /* Advance location in buffer */
-                        buf_p+=nbytes_xfer_advance;
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=nbytes_xfer_advance;
-
-                        /* Decrement number of bytes left this time */
-                        nbytes_toxfer-=nbytes_xfer_advance;
-
-                        /* Partially advance global offset in dataset */
-                        mpi_offset+=mpi_offset_advance;
-                    } /* end while */
-                } /* end if */
-
-                /* Common code for collective file access */
-                else {
-                    /* Set the file view */
-                    mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE,
-                        mpi_collective_type, (char *)"native", h5_io_info_g);
-                    VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
-
-                    /* Perform write */
-                    MPI_File_write_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),
-                        MPI_BYTE, &mpi_status);
-                    VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=buf_size*blk_size;
-                } /* end else */
-
-            } /* end else */
-
-            break;
-
-        case PHDF5:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-            /* Set up the file dset space id to move the selection to process */
-            if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5offset[0] = nbytes_xfer;
-            } /* end if */
-            else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g);
-            } /* end else */
-            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-            VRFY((hrc >= 0), "H5Soffset_simple");
-
-            /* Write the buffer out */
-            hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                h5dset_space_id, h5dxpl, buffer);
-            VRFY((hrc >= 0), "H5Dwrite");
-
-            /* Increment number of bytes transferred */
-            nbytes_xfer += buf_size;
-            } /* end if */
-            /* 2D dataspace */
-            else {
-            /* Set up the file dset space id to move the selection to process */
-            if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size;
-                h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size;
-
-            } /* end if */
-            else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size;
-                h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size;
-
-            } /* end else */
-            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-            VRFY((hrc >= 0), "H5Soffset_simple");
-
-            /* Write the buffer out */
-            hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                h5dset_space_id, h5dxpl, buffer);
-            VRFY((hrc >= 0), "H5Dwrite");
-
-            /* Increment number of bytes transferred */
-            nbytes_xfer += buf_size*blk_size;
-
-            } /* end else */
-
-            break;
-        } /* switch (parms->io_type) */
-    } /* end while */
-
-    /* Stop "raw data" write timer */
-    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
-
-    /* Calculate write time */
-
-    /* Close dataset. Only HDF5 needs to do an explicit close. */
-    if (parms->io_type == PHDF5) {
-        hrc = H5Dclose(h5ds_id);
-
-        if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        h5ds_id = -1;
-    } /* end if */
-    } /* end for */
-
-done:
-    /* release MPI-I/O objects */
-    if (parms->io_type == MPIO) {
-        /* 1D dataspace */
-        if (!parms->dim2d){
-            /* Free file type */
-            mrc = MPI_Type_free( &mpi_file_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free buffer type */
-            mrc = MPI_Type_free( &mpi_blk_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-        } /* end if */
-        /* 2D dataspace */
-        else {
-            /* Free partial buffer type for contiguous access */
-            mrc = MPI_Type_free( &mpi_partial_buffer_cont );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free contiguous file type */
-            mrc = MPI_Type_free( &mpi_cont_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free partial buffer type for interleaved access */
-            mrc = MPI_Type_free( &mpi_partial_buffer_inter );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free interleaved file type */
-            mrc = MPI_Type_free( &mpi_inter_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free full buffer type */
-            mrc = MPI_Type_free(&mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free full chunk type */
-            mrc = MPI_Type_free(&mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free chunk interleaved file type */
-            mrc = MPI_Type_free(&mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-        } /* end else */
-    } /* end if */
-
-    /* release HDF5 objects */
-    if (h5dset_space_id != -1) {
-    hrc = H5Sclose(h5dset_space_id);
-    if (hrc < 0){
-        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dset_space_id = -1;
-    }
-    }
-
-    if (h5mem_space_id != -1) {
-    hrc = H5Sclose(h5mem_space_id);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Memory Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5mem_space_id = -1;
-    }
-    }
-
-    if (h5dxpl != -1) {
-    hrc = H5Pclose(h5dxpl);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dxpl = -1;
-    }
-    }
-
-    return ret_code;
-}
-
-/*
- * Function:        do_read
- * Purpose:         read the required amount of data from the file.
- * Return:          SUCCESS or FAIL
- * Programmer:      Albert Cheng 2001/12/13
- * Modifications:
- *  Added 2D testing (Christian Chilan, 10. August 2005)
- */
-    static herr_t
-do_read(results *res, file_descr *fd, parameters *parms, long ndsets,
-    off_t nbytes, size_t buf_size, void *buffer /*out*/)
-{
-    int         ret_code = SUCCESS;
-    int         rc;             /*routine return code                   */
-    long        ndset;
-    size_t      blk_size;       /* The block size to subdivide the xfer buffer into */
-    size_t      bsize;          /* Size of the actual buffer */
-    off_t       nbytes_xfer;    /* Total number of bytes transferred so far */
-    size_t      nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
-    size_t      nbytes_toxfer;  /* Number of bytes to transfer a particular time */
-    char        dname[64];
-    off_t       dset_offset=0;  /*dataset offset in a file              */
-    off_t       bytes_begin[2];    /*first elmt this process transfer      */
-    off_t       bytes_count;    /*number of elmts this process transfer */
-    off_t       snbytes=0;      /*size of a side of the dataset square */
-    unsigned char *buf_p;       /* Current buffer pointer               */
-
-    /* POSIX variables */
-    off_t       file_offset;    /* File offset of the next transfer    */
-    off_t       file_offset_advance; /* File offset advance after each I/O operation */
-    off_t       posix_file_offset;    /* Base file offset of the next transfer      */
-
-    /* MPI variables */
-    MPI_Offset  mpi_file_offset;/* Base file offset of the next transfer*/
-    MPI_Offset  mpi_offset;     /* Offset in MPI file                   */
-    MPI_Offset  mpi_offset_advance; /* Offset advance after each I/O operation */
-    MPI_Datatype mpi_file_type; /* MPI derived type for 1D file            */
-    MPI_Datatype mpi_blk_type;  /* MPI derived type for 1D buffer          */
-    MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */
-    MPI_Datatype mpi_partial_buffer_cont;       /* MPI derived type for partial 2D contiguous buffer */
-    MPI_Datatype mpi_inter_type;    /* MPI derived type for 2D interleaved file  */
-    MPI_Datatype mpi_partial_buffer_inter;      /* MPI derived type for partial 2D interleaved buffer */
-    MPI_Datatype mpi_full_buffer;       /* MPI derived type for 2D full buffer */
-    MPI_Datatype mpi_full_chunk;        /* MPI derived type for 2D full chunk */
-    MPI_Datatype mpi_chunk_inter_type;  /* MPI derived type for 2D chunk interleaved file */
-    MPI_Datatype mpi_collective_type;   /* Generic MPI derived type for 2D collective access */
-    MPI_Status  mpi_status;
-    int         mrc;            /* MPI return code                      */
-
-    /* HDF5 variables */
-    herr_t      hrc;                    /*HDF5 return code              */
-    hsize_t     h5dims[2];              /*dataset dim sizes             */
-    hid_t       h5dset_space_id = -1;   /*dataset space ID              */
-    hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
-    hid_t       h5ds_id = -1;           /*dataset handle                */
-    hsize_t h5block[2];     /*dataspace selection           */
-    hsize_t h5stride[2];
-    hsize_t h5count[2];
-    hsize_t h5start[2];
-    hssize_t    h5offset[2];            /* Selection offset within dataspace */
-    hid_t       h5dxpl = -1;            /* Dataset transfer property list */
-
-    /* Get the parameters from the parameter block */
-    blk_size=parms->blk_size;
-
-    /* There are two kinds of transfer patterns, contiguous and interleaved.
-     * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
-     *     where n is rank of the last process.
-     * In contiguous pattern, data are accessed as
-     *    000...111...222...nnn...
-     * In interleaved pattern, data are accessed as
-     *    012...n012...n...
-     * These are all in the scope of one dataset.
-     */
-
-    /* 1D dataspace */
-    if (!parms->dim2d){
-        bsize = buf_size;
-        /* Contiguous Pattern: */
-        if (!parms->interleaved) {
-             bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g);
-        } /* end if */
-        /* Interleaved Pattern: */
-        else {
-            bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g);
-        } /* end else */
-    }/* end if */
-    /* 2D dataspace */
-    else {
-        /* nbytes is always the number of bytes per dataset (1D or 2D). If the
-           dataspace is 2D, snbytes is the size of a side of the 'dataset square'.
-         */
-        snbytes = (off_t)sqrt(nbytes);
-
-        bsize = buf_size * blk_size;
-
-        /* Contiguous Pattern: */
-        if (!parms->interleaved) {
-            bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g);
-            bytes_begin[1] = 0;
-        } /* end if */
-        /* Interleaved Pattern: */
-        else {
-            bytes_begin[0] = 0;
-
-            if (!parms->h5_use_chunks || parms->io_type==PHDF5)
-                bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g);
-            else
-                bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g);
-        } /* end else */
-    } /* end else */
-
-    /* Calculate the total number of bytes (bytes_count) to be
-     * transferred by this process. It may be different for different
-     * transfer pattern due to rounding to integral values.
-     */
-    /*
-     * Calculate the beginning bytes of this process and the next.
-     * bytes_count is the difference between these two beginnings.
-     * This way, it eliminates any rounding errors.
-     * (This is tricky, don't mess with the formula, rounding errors
-     * can easily get introduced) */
-    bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g)
-    - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g);
-
-    /* debug */
-    if (pio_debug_level >= 4) {
-        HDprint_rank(output);
-        if (!parms->dim2d) {
-        HDfprintf(output, "Debug(do_write): "
-            "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
-            buf_size, (long long)bytes_begin[0],
-            (long long)bytes_count);
-        } else {
-        HDfprintf(output, "Debug(do_write): "
-            "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
-            buf_size*blk_size, (long long)bytes_begin[0],
-            (long long)bytes_begin[1], (long long)bytes_count);
-        }
-    }
-
-    /* I/O Access specific setup */
-    switch (parms->io_type) {
-    case POSIXIO:
-        /* No extra setup */
-        break;
-
-    case MPIO: /* MPI-I/O setup */
-        /* 1D dataspace */
-        if (!parms->dim2d){
-            /* Build block's derived type */
-            mrc = MPI_Type_contiguous((int)blk_size,
-                MPI_BYTE, &mpi_blk_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Build file's derived type */
-            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1,
-                (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit file type */
-            mrc = MPI_Type_commit( &mpi_file_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Commit buffer type */
-            mrc = MPI_Type_commit( &mpi_blk_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-        } /* end if */
-        /* 2D dataspace */
-        else {
-            /* Build partial buffer derived type for contiguous access */
-            mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE,
-                &mpi_partial_buffer_cont);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit partial buffer derived type */
-            mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build contiguous file's derived type */
-            mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size),
-                mpi_partial_buffer_cont, &mpi_cont_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit contiguous file type */
-            mrc = MPI_Type_commit(&mpi_cont_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build partial buffer derived type for interleaved access */
-            mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE,
-                &mpi_partial_buffer_inter);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit partial buffer derived type */
-            mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build interleaved file's derived type */
-            mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size),
-                mpi_partial_buffer_inter, &mpi_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit interleaved file type */
-            mrc = MPI_Type_commit(&mpi_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build full buffer derived type */
-            mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE,
-                &mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit full buffer derived type */
-            mrc = MPI_Type_commit(&mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build full chunk derived type */
-            mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE,
-                &mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit full chunk derived type */
-            mrc = MPI_Type_commit(&mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
-            /* Build chunk interleaved file's derived type */
-            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size),
-                mpi_full_chunk, &mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
-            /* Commit chunk interleaved file type */
-            mrc = MPI_Type_commit(&mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-        } /* end else */
-        break;
-
-    case PHDF5: /* HDF5 setup */
-        /* 1D dataspace */
-        if (!parms->dim2d){
-        if(nbytes>0) {
-            /* define a contiguous dataset of nbytes native bytes */
-            h5dims[0] = nbytes;
-            h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
-            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
-            /* Set up the file dset space id to select the pattern to access */
-            if (!parms->interleaved){
-            /* Contiguous pattern */
-            h5start[0] = bytes_begin[0];
-            h5stride[0] = h5block[0] = blk_size;
-            h5count[0] = buf_size/blk_size;
-            } /* end if */
-            else {
-            /* Interleaved access pattern */
-            /* Skip offset over blocks of other processes */
-            h5start[0] = bytes_begin[0];
-            h5stride[0] = blk_size*pio_mpi_nprocs_g;
-            h5block[0] = blk_size;
-            h5count[0] = buf_size/blk_size;
-            } /* end else */
-            hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                h5start, h5stride, h5count, h5block);
-            VRFY((hrc >= 0), "H5Sselect_hyperslab");
-        } /* end if */
-        else {
-            h5dset_space_id = H5Screate(H5S_SCALAR);
-            VRFY((h5dset_space_id >= 0), "H5Screate");
-        } /* end else */
-
-        /* Create the memory dataspace that corresponds to the xfer buffer */
-        if(buf_size>0) {
-            h5dims[0] = buf_size;
-            h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
-            VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-        } /* end if */
-        else {
-            h5mem_space_id = H5Screate(H5S_SCALAR);
-            VRFY((h5mem_space_id >= 0), "H5Screate");
-        } /* end else */
-        } /* end if */
-        /* 2D dataspace */
-        else {
-        if(nbytes>0) {
-            /* define a contiguous dataset of nbytes native bytes */
-            h5dims[0] = snbytes;
-            h5dims[1] = snbytes;
-            h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
-            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
-            /* Set up the file dset space id to select the pattern to access */
-            if (!parms->interleaved){
-            /* Contiguous pattern */
-            h5start[0] = bytes_begin[0];
-            h5start[1] = bytes_begin[1];
-            h5stride[0] = 1;
-            h5stride[1] = h5block[0] = h5block[1] = blk_size;
-            h5count[0] = 1;
-            h5count[1] = buf_size/blk_size;
-            } /* end if */
-            else {
-            /* Interleaved access pattern */
-            /* Skip offset over blocks of other processes */
-            h5start[0] = bytes_begin[0];
-            h5start[1] = bytes_begin[1];
-            h5stride[0] = blk_size;
-            h5stride[1] = blk_size*pio_mpi_nprocs_g;
-            h5block[0] = h5block[1] = blk_size;
-            h5count[0] = buf_size/blk_size;
-            h5count[1] = 1;
-            } /* end else */
-            hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                h5start, h5stride, h5count, h5block);
-            VRFY((hrc >= 0), "H5Sselect_hyperslab");
-        } /* end if */
-        else {
-            h5dset_space_id = H5Screate(H5S_SCALAR);
-            VRFY((h5dset_space_id >= 0), "H5Screate");
-        } /* end else */
-
-        /* Create the memory dataspace that corresponds to the xfer buffer */
-        if(buf_size>0) {
-            if (!parms->interleaved){
-            h5dims[0] = blk_size;
-            h5dims[1] = buf_size;
-            }else{
-            h5dims[0] = buf_size;
-            h5dims[1] = blk_size;
-            }
-            h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
-            VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-        } /* end if */
-        else {
-            h5mem_space_id = H5Screate(H5S_SCALAR);
-            VRFY((h5mem_space_id >= 0), "H5Screate");
-        } /* end else */
-        } /* end else */
-
-        /* Create the dataset transfer property list */
-        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
-        if (h5dxpl < 0) {
-        fprintf(stderr, "HDF5 Property List Create failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        /* Change to collective I/O, if asked */
-        if(parms->collective) {
-        hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
-        if (hrc < 0) {
-            fprintf(stderr, "HDF5 Property List Set failed\n");
-            GOTOERROR(FAIL);
-        } /* end if */
-        } /* end if */
-        break;
-    } /* end switch */
-
-    for (ndset = 1; ndset <= ndsets; ++ndset) {
-
-    /* Calculate dataset offset within a file */
-
-    /* create dataset */
-    switch (parms->io_type) {
-        case POSIXIO:
-        case MPIO:
-        /* both posix and mpi io just need dataset offset in file*/
-        dset_offset = (ndset - 1) * nbytes;
-        break;
-
-        case PHDF5:
-        sprintf(dname, "Dataset_%ld", ndset);
-        h5ds_id = H5DOPEN(fd->h5fd, dname);
-        if (h5ds_id < 0) {
-            fprintf(stderr, "HDF5 Dataset open failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        break;
-    }
-
-    /* The task is to transfer bytes_count bytes, starting at
-     * bytes_begin position, using transfer buffer of buf_size bytes.
-     * If interleaved, select buf_size at a time, in round robin
-     * fashion, according to number of process. Otherwise, select
-     * all bytes_count in contiguous.
-     */
-    nbytes_xfer = 0 ;
-
-    /* 1D dataspace */
-    if (!parms->dim2d){
-        /* Set base file offset for all I/O patterns and POSIX access */
-        posix_file_offset = dset_offset + bytes_begin[0];
-
-        /* Set base file offset for all I/O patterns and MPI access */
-        mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
-    } /* end if */
-    else {
-        /* Set base file offset for all I/O patterns and POSIX access */
-        posix_file_offset=dset_offset + bytes_begin[0]*snbytes+
-        bytes_begin[1];
-
-        /* Set base file offset for all I/O patterns and MPI access */
-        mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+
-            bytes_begin[1]);
-    } /* end else */
-
-    /* Start "raw data" read timer */
-    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
-
-    while (nbytes_xfer < bytes_count){
-        /* Read */
-        /* Calculate offset of read within a dataset/file */
-        switch (parms->io_type) {
-        case POSIXIO:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-                /* Contiguous pattern */
-                if (!parms->interleaved) {
-                    /* Compute file offset */
-                    file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
-                    /* only care if seek returns error */
-                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                    VRFY((rc==0), "POSIXSEEK");
-
-                    /* check if all bytes are read */
-                    rc = ((ssize_t)buf_size ==
-                        POSIXREAD(fd->posixfd, buffer, buf_size));
-                    VRFY((rc != 0), "POSIXREAD");
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=buf_size;
-                } /* end if */
-                /* Interleaved access pattern */
-                else {
-                    /* Set the base of user's buffer */
-                    buf_p=(unsigned char *)buffer;
-
-                    /* Set the number of bytes to transfer this time */
-                    nbytes_toxfer = buf_size;
-
-                    /* Loop over the buffers to read */
-                    while(nbytes_toxfer>0) {
-                    /* Skip offset over blocks of other processes */
-                    file_offset = posix_file_offset +
-                        (off_t)(nbytes_xfer*pio_mpi_nprocs_g);
-
-                    /* only care if seek returns error */
-                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                    VRFY((rc==0), "POSIXSEEK");
-
-                    /* check if all bytes are read */
-                    rc = ((ssize_t)blk_size ==
-                        POSIXREAD(fd->posixfd, buf_p, blk_size));
-                    VRFY((rc != 0), "POSIXREAD");
-
-                    /* Advance location in buffer */
-                    buf_p+=blk_size;
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=blk_size;
-
-                    /* Decrement number of bytes left this time */
-                    nbytes_toxfer-=blk_size;
-                    } /* end while */
-                } /* end else */
-            } /* end if */
-            /* 2D dataspace */
-            else {
-                /* Contiguous storage */
-                if (!parms->h5_use_chunks) {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)
-                            /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes));
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = (off_t)snbytes;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size)
-                            *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes)
-                            +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = (off_t)snbytes;
-                    } /* end else */
-                } /* end if */
-                /* Chunked storage */
-                else {
-                    /*Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute file offset */
-                        file_offset=posix_file_offset+(off_t)nbytes_xfer;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        file_offset_advance = 0;
-                    } /* end if */
-                    /*Interleaved access pattern */
-                    else {
-                        /* Compute file offset */
-                        /* Before simplification */
-                        /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
-                        *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
-                        *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
-                        *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
-
-                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size)
-                        *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size))
-                        *pio_mpi_nprocs_g)%(snbytes*blk_size));
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
-                        file_offset_advance = (off_t)(snbytes*blk_size);
-                    } /* end else */
-                } /* end else */
-
-                /* Common code for file access */
-
-                /* Set the base of user's buffer */
-                buf_p = (unsigned char *)buffer;
-
-                /* Set the number of bytes to transfer this time */
-                nbytes_toxfer = buf_size*blk_size;
-
-                /* Loop over portions of the buffer to read */
-                while(nbytes_toxfer>0){
-                    /* only care if seek returns error */
-                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
-                    VRFY((rc==0), "POSIXSEEK");
-
-                    /* check if all bytes are read */
-                    rc = ((ssize_t)nbytes_xfer_advance ==
-                        POSIXREAD(fd->posixfd, buf_p, nbytes_xfer_advance));
-                    VRFY((rc != 0), "POSIXREAD");
-
-                    /* Advance location in buffer */
-                    buf_p+=nbytes_xfer_advance;
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=nbytes_xfer_advance;
-
-                    /* Decrement number of bytes left this time */
-                    nbytes_toxfer-=nbytes_xfer_advance;
-
-                    /* Partially advance file offset */
-                    file_offset+=file_offset_advance;
-                } /* end while */
-
-            } /* end else */
-            break;
-
-        case MPIO:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-                /* Independent file access */
-                if(!parms->collective) {
-                    /* Contiguous pattern */
-                    if (!parms->interleaved){
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            nbytes_xfer;
-
-                        /* Perform independent read */
-                        mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type,
-                            &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Set the base of user's buffer */
-                        buf_p=(unsigned char *)buffer;
-
-                        /* Set the number of bytes to transfer this time */
-                        nbytes_toxfer = buf_size;
-
-                        /* Loop over the buffers to read */
-                        while(nbytes_toxfer>0) {
-                            /* Skip offset over blocks of other processes */
-                            mpi_offset = mpi_file_offset +
-                            (nbytes_xfer*pio_mpi_nprocs_g);
-
-                            /* Perform independent read */
-                            mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p,
-                                (int)1, mpi_blk_type, &mpi_status);
-                            VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                            /* Advance location in buffer */
-                            buf_p+=blk_size;
-
-                            /* Advance global offset in dataset */
-                            nbytes_xfer+=blk_size;
-
-                            /* Decrement number of bytes left this time */
-                            nbytes_toxfer-=blk_size;
-                        } /* end while */
-                    } /* end else */
-                } /* end if */
-                /* Collective file access */
-                else {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved){
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            nbytes_xfer;
-
-                        /* Perform collective read */
-                        mrc = MPI_File_read_at_all(fd->mpifd, mpi_offset, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        mpi_offset = mpi_file_offset +
-                            (nbytes_xfer*pio_mpi_nprocs_g);
-
-                        /* Set the file view */
-                        mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type,
-                            mpi_file_type, (char*)"native",  h5_io_info_g);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
-
-                        /* Perform collective read */
-                        mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer,
-                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=buf_size;
-                    } /* end else */
-                } /* end else */
-            } /* end if */
-            /* 2D dataspace */
-            else {
-                /* Contiguous storage */
-                if (!parms->h5_use_chunks) {
-                    /* Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)*
-                            (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = snbytes;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_cont_type;
-                    } /* end if */
-                    /* Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)*
-                            (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = snbytes;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_inter_type;
-                    } /* end else */
-                } /* end if */
-                /* Chunked storage */
-                else {
-                    /*Contiguous access pattern */
-                    if (!parms->interleaved) {
-                        /* Compute offset in file */
-                        mpi_offset=mpi_file_offset+nbytes_xfer;
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * buf_size;
-
-                        /* Global offset advance after each I/O operation */
-                        mpi_offset_advance = 0;
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_full_buffer;
-                    } /* end if */
-                    /*Interleaved access pattern */
-                    else {
-                        /* Compute offset in file */
-                        /* Before simplification */
-                        /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
-                            *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
-                            (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
-                            ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
-                            /blk_size*(blk_size*blk_size)); */
-                        mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size)
-                            *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)
-                            +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size);
-
-                        /* Number of bytes to be transferred per I/O operation */
-                        nbytes_xfer_advance = blk_size * blk_size;
-
-                        /* Global offset advance after each I/O operation */
-                        /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
-                        mpi_offset_advance = (MPI_Offset)(snbytes*blk_size);
-
-                        /* MPI type to be used for collective access */
-                        mpi_collective_type = mpi_chunk_inter_type;
-                    } /* end else */
-                } /* end else */
-
-                /* Common code for independent file access */
-                if (!parms->collective) {
-                    /* Set the base of user's buffer */
-                    buf_p = (unsigned char *)buffer;
-
-                    /* Set the number of bytes to transfer this time */
-                    nbytes_toxfer = buf_size * blk_size;
-
-                    /* Loop over portions of the buffer to read */
-                    while(nbytes_toxfer>0){
-                        /* Perform independent read */
-                        mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p,
-                            (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status);
-                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                        /* Advance location in buffer */
-                        buf_p+=nbytes_xfer_advance;
-
-                        /* Advance global offset in dataset */
-                        nbytes_xfer+=nbytes_xfer_advance;
-
-                        /* Decrement number of bytes left this time */
-                        nbytes_toxfer-=nbytes_xfer_advance;
-
-                        /* Partially advance global offset in dataset */
-                        mpi_offset+=mpi_offset_advance;
-                    } /* end while */
-                } /* end if */
-
-                /* Common code for collective file access */
-                else {
-                    /* Set the file view */
-                    mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE,
-                        mpi_collective_type, (char *)"native", h5_io_info_g);
-                    VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
-
-                    /* Perform read */
-                    MPI_File_read_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),
-                        MPI_BYTE, &mpi_status);
-                    VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
-
-                    /* Advance global offset in dataset */
-                    nbytes_xfer+=buf_size*blk_size;
-                } /* end else */
-
-            } /* end else */
-            break;
-
-        case PHDF5:
-            /* 1D dataspace */
-            if (!parms->dim2d){
-            /* Set up the file dset space id to move the selection to process */
-            if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5offset[0] = nbytes_xfer;
-            } /* end if */
-            else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g);
-            } /* end else */
-            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-            VRFY((hrc >= 0), "H5Soffset_simple");
-
-            /* Read the buffer in */
-            hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                h5dset_space_id, h5dxpl, buffer);
-            VRFY((hrc >= 0), "H5Dread");
-
-            /* Increment number of bytes transferred */
-            nbytes_xfer += buf_size;
-            } /* end if */
-            /* 2D dataspace */
-            else {
-            /* Set up the file dset space id to move the selection to process */
-            if (!parms->interleaved){
-                /* Contiguous pattern */
-                h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size;
-                h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size;
-            } /* end if */
-            else {
-                /* Interleaved access pattern */
-                /* Skip offset over blocks of other processes */
-                h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size;
-                h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size;
-
-            } /* end else */
-            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-            VRFY((hrc >= 0), "H5Soffset_simple");
-
-            /* Write the buffer out */
-            hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                h5dset_space_id, h5dxpl, buffer);
-            VRFY((hrc >= 0), "H5Dread");
-
-            /* Increment number of bytes transferred */
-            nbytes_xfer += buf_size*blk_size;
-
-            } /* end else */
-            break;
-        } /* switch (parms->io_type) */
-
-        /* Verify raw data, if asked */
-        if (parms->verify) {
-        /* Verify data read */
-        unsigned char *ucharptr = (unsigned char *)buffer;
-        size_t i;
-        int nerror=0;
-
-        for (i = 0; i < bsize; ++i){
-            if (*ucharptr++ != pio_mpi_rank_g+1) {
-            if (++nerror < 20){
-                /* report at most 20 errors */
-                HDprint_rank(output);
-                HDfprintf(output, "read data error, expected (%d), "
-                    "got (%d)\n",
-                    pio_mpi_rank_g+1,
-                    (int)*(ucharptr-1));
-            } /* end if */
-            } /* end if */
-        } /* end for */
-        if (nerror >= 20) {
-            HDprint_rank(output);
-            HDfprintf(output, "...");
-            HDfprintf(output, "total read data errors=%d\n",
-                nerror);
-        } /* end if */
-        }   /* if (parms->verify) */
-
-    } /* end while */
-
-    /* Stop "raw data" read timer */
-    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
-
-    /* Calculate read time */
-
-    /* Close dataset. Only HDF5 needs to do an explicit close. */
-    if (parms->io_type == PHDF5) {
-        hrc = H5Dclose(h5ds_id);
-
-        if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        h5ds_id = -1;
-    } /* end if */
-    } /* end for */
-
-done:
-    /* release MPI-I/O objects */
-    if (parms->io_type == MPIO) {
-        /* 1D dataspace */
-        if (!parms->dim2d){
-            /* Free file type */
-            mrc = MPI_Type_free( &mpi_file_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free buffer type */
-            mrc = MPI_Type_free( &mpi_blk_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-        } /* end if */
-        /* 2D dataspace */
-        else {
-            /* Free partial buffer type for contiguous access */
-            mrc = MPI_Type_free( &mpi_partial_buffer_cont );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free contiguous file type */
-            mrc = MPI_Type_free( &mpi_cont_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free partial buffer type for interleaved access */
-            mrc = MPI_Type_free( &mpi_partial_buffer_inter );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free interleaved file type */
-            mrc = MPI_Type_free( &mpi_inter_type );
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free full buffer type */
-            mrc = MPI_Type_free(&mpi_full_buffer);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free full chunk type */
-            mrc = MPI_Type_free(&mpi_full_chunk);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-
-            /* Free chunk interleaved file type */
-            mrc = MPI_Type_free(&mpi_chunk_inter_type);
-            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
-        } /* end else */
-    } /* end if */
-
-    /* release HDF5 objects */
-    if (h5dset_space_id != -1) {
-    hrc = H5Sclose(h5dset_space_id);
-    if (hrc < 0){
-        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dset_space_id = -1;
-    }
-    }
-
-    if (h5mem_space_id != -1) {
-    hrc = H5Sclose(h5mem_space_id);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Memory Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5mem_space_id = -1;
-    }
-    }
-
-    if (h5dxpl != -1) {
-    hrc = H5Pclose(h5dxpl);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dxpl = -1;
-    }
-    }
-
-    return ret_code;
-}
-
-/*
- * Function:    do_fopen
- * Purpose:     Open the specified file.
- * Return:      SUCCESS or FAIL
- * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-    static herr_t
-do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
-{
-    int ret_code = SUCCESS, mrc;
-    hid_t acc_tpl = -1;         /* file access templates */
-
-    switch (param->io_type) {
-        case POSIXIO:
-            if (flags & (PIO_CREATE | PIO_WRITE))
-                fd->posixfd = POSIXCREATE(fname);
-            else
-                fd->posixfd = POSIXOPEN(fname, O_RDONLY);
-
-            if (fd->posixfd < 0 ) {
-                fprintf(stderr, "POSIX File Open failed(%s)\n", fname);
-                GOTOERROR(FAIL);
-            }
-
-
-            /* The perils of POSIX I/O in a parallel environment. The problem is:
-             *
-             *      - Process n opens a file with truncation and then starts
-             *        writing to the file.
-             *      - Process m also opens the file with truncation, but after
-             *        process n has already started to write to the file. Thus,
-             *        all of the stuff process n wrote is now lost.
-             */
-            MPI_Barrier(pio_comm_g);
-
-            break;
-
-        case MPIO:
-            if (flags & (PIO_CREATE | PIO_WRITE)) {
-                MPI_File_delete(fname, h5_io_info_g);
-                mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_CREATE | MPI_MODE_RDWR,
-                    h5_io_info_g, &fd->mpifd);
-
-                if (mrc != MPI_SUCCESS) {
-                    fprintf(stderr, "MPI File Open failed(%s)\n", fname);
-                    GOTOERROR(FAIL);
-                }
-
-                /*since MPI_File_open with MPI_MODE_CREATE does not truncate  */
-                /*filesize , set size to 0 explicitedly.    */
-                mrc = MPI_File_set_size(fd->mpifd, (MPI_Offset)0);
-                if (mrc != MPI_SUCCESS) {
-                    fprintf(stderr, "MPI_File_set_size failed\n");
-                    GOTOERROR(FAIL);
-                }
-            } else {
-                mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_RDONLY, h5_io_info_g, &fd->mpifd);
-                if (mrc != MPI_SUCCESS) {
-                    fprintf(stderr, "MPI File Open failed(%s)\n", fname);
-                    GOTOERROR(FAIL);
-                }
-            }
-
-            break;
-
-        case PHDF5:
-            if ((acc_tpl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
-                fprintf(stderr, "HDF5 Property List Create failed\n");
-                GOTOERROR(FAIL);
-            }
-
-            /* Set the file driver to the MPI-IO driver */
-            if (H5Pset_fapl_mpio(acc_tpl, pio_comm_g, h5_io_info_g) < 0) {
-                fprintf(stderr, "HDF5 Property List Set failed\n");
-                GOTOERROR(FAIL);
-            }
-
-            /* Set the alignment of objects in HDF5 file */
-            if (H5Pset_alignment(acc_tpl, param->h5_thresh, param->h5_align) < 0) {
-                fprintf(stderr, "HDF5 Property List Set failed\n");
-                GOTOERROR(FAIL);
-            }
-
-            /* create the parallel file */
-            if (flags & (PIO_CREATE | PIO_WRITE))
-                fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
-            else
-                fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, acc_tpl);
-            if (fd->h5fd < 0) {
-                fprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
-                GOTOERROR(FAIL);
-            }
-
-            /* verifying the close of the acc_tpl */
-            if (H5Pclose(acc_tpl) < 0) {
-                fprintf(stderr, "HDF5 Property List Close failed\n");
-                GOTOERROR(FAIL);
-            }
-
-            break;
-    }
-
-done:
-    return ret_code;
-}
-
-/*
- * Function:    do_fclose
- * Purpose:     Close the specified file descriptor.
- * Return:      SUCCESS or FAIL
- * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-    static herr_t
-do_fclose(iotype iot, file_descr *fd /*out*/)
-{
-    herr_t ret_code = SUCCESS, hrc;
-    int mrc = 0, rc = 0;
-
-    switch (iot) {
-    case POSIXIO:
-        rc = POSIXCLOSE(fd->posixfd);
-
-        if (rc != 0){
-        fprintf(stderr, "POSIX File Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        fd->posixfd = -1;
-        break;
-
-    case MPIO:
-        mrc = MPI_File_close(&fd->mpifd);
-
-        if (mrc != MPI_SUCCESS){
-        fprintf(stderr, "MPI File close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        fd->mpifd = MPI_FILE_NULL;
-        break;
-
-    case PHDF5:
-        hrc = H5Fclose(fd->h5fd);
-
-        if (hrc < 0) {
-        fprintf(stderr, "HDF5 File Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        fd->h5fd = -1;
-        break;
-    }
-
-done:
-    return ret_code;
-}
-
-
-/*
- * Function:    do_fclose
- * Purpose:     Cleanup temporary file unless HDF5_NOCLEANUP is set.
- *      Only Proc 0 of the PIO communicator will do the cleanup.
- *      Other processes just return.
- * Return:      void
- * Programmer:  Albert Cheng 2001/12/12
- * Modifications:
- */
-    static void
-do_cleanupfile(iotype iot, char *fname)
-{
-    if (pio_mpi_rank_g != 0)
-    return;
-
-    if (clean_file_g == -1)
-    clean_file_g = (getenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0;
-
-    if (clean_file_g){
-    switch (iot){
-        case POSIXIO:
-        remove(fname);
-        break;
-        case MPIO:
-        case PHDF5:
-        MPI_File_delete(fname, h5_io_info_g);
-        break;
-    }
-    }
-}
-
-#ifdef TIME_MPI
-/* instrument the MPI_File_wrirte_xxx and read_xxx calls to measure
- * pure time spent in MPI_File code.
- */
-int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf,
-    int count, MPI_Datatype datatype, MPI_Status *status)
-{
-    int err;
-    set_time(timer_g, HDF5_MPI_READ, TSTART);
-    err=PMPI_File_read_at(fh, offset, buf, count, datatype, status);
-    set_time(timer_g, HDF5_MPI_READ, TSTOP);
-    return err;
-}
-
-
-int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf,
-    int count, MPI_Datatype datatype, MPI_Status *status)
-{
-    int err;
-    set_time(timer_g, HDF5_MPI_READ, TSTART);
-    err=PMPI_File_read_at_all(fh, offset, buf, count, datatype, status);
-    set_time(timer_g, HDF5_MPI_READ, TSTOP);
-    return err;
-}
-
-int MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf,
-    int count, MPI_Datatype datatype, MPI_Status *status)
-{
-    int err;
-    set_time(timer_g, HDF5_MPI_WRITE, TSTART);
-    err=PMPI_File_write_at(fh, offset, buf, count, datatype, status);
-    set_time(timer_g, HDF5_MPI_WRITE, TSTOP);
-    return err;
-}
-
-int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf,
-    int count, MPI_Datatype datatype, MPI_Status *status)
-{
-    int err;
-    set_time(timer_g, HDF5_MPI_WRITE, TSTART);
-    err=PMPI_File_write_at_all(fh, offset, buf, count, datatype, status);
-    set_time(timer_g, HDF5_MPI_WRITE, TSTOP);
-    return err;
-}
-
-#endif  /* TIME_MPI */
-#endif /* H5_HAVE_PARALLEL */
-
-
-
-
-
diff --git a/tools/perform/pio_perf.c b/tools/perform/pio_perf.c
deleted file mode 100644
index e2ec453..0000000
--- a/tools/perform/pio_perf.c
+++ /dev/null
@@ -1,1695 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Parallel HDF5 Performance Testing Code
- * --------------------------------------
- *
- * Portable code to test performance on the different platforms we support.
- * This is what the report should look like:
- *
- *  nprocs = Max#Procs
- *      IO API = POSIXIO
- *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *
- *          . . .
- *
- *      IO API = MPIO
- *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *
- *          . . .
- *
- *      IO API = PHDF5
- *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *
- *          . . .
- *
- *  nprocs = Max#Procs / 2
- *
- *      . . .
- *
- */
-
-/* system header files */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "hdf5.h"
-
-#ifdef H5_HAVE_PARALLEL
-
-/* library header files */
-#include <mpi.h>
-
-/* our header files */
-#include "pio_perf.h"
-
-/* useful macros */
-#define TAB_SPACE           4
-
-#define ONE_KB              1024
-#define ONE_MB              (ONE_KB * ONE_KB)
-#define ONE_GB              (ONE_MB * ONE_KB)
-
-#define PIO_POSIX           0x1
-#define PIO_MPI             0x2
-#define PIO_HDF5            0x4
-
-/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes,t) (((t)==0.0) ? 0.0 : ((((double)bytes) / ONE_MB) / (t)))
-
-#ifndef TRUE
-#define TRUE    1
-#endif  /* TRUE */
-#ifndef FALSE
-#define FALSE   (!TRUE)
-#endif  /* FALSE */
-
-/* global variables */
-FILE       *output;             /* output file                          */
-int         comm_world_rank_g;  /* my rank in MPI_COMM_RANK             */
-int         comm_world_nprocs_g;/* num. of processes of MPI_COMM_WORLD  */
-MPI_Comm    pio_comm_g;         /* Communicator to run the PIO          */
-int         pio_mpi_rank_g;     /* MPI rank of pio_comm_g               */
-int         pio_mpi_nprocs_g;   /* Number of processes of pio_comm_g    */
-int         pio_debug_level = 0;/* The debug level:
-                                 *   0 - Off
-                                 *   1 - Minimal
-                                 *   2 - Some more
-                                 *   3 - Maximal
-                                 *   4 - Maximal & then some
-                                 */
-
-/* local variables */
-static const char  *progname = "h5perf";
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters. The long-named ones can be partially spelled. When
- * adding more, make sure that they don't clash with each other.
- */
-#if 1
-static const char *s_opts = "a:A:B:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
-#else
-static const char *s_opts = "a:A:bB:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
-#endif  /* 1 */
-static struct long_options l_opts[] = {
-    { "align", require_arg, 'a' },
-    { "alig", require_arg, 'a' },
-    { "ali", require_arg, 'a' },
-    { "al", require_arg, 'a' },
-    { "api", require_arg, 'A' },
-    { "ap", require_arg, 'A' },
-#if 0
-    /* a sighting of the elusive binary option */
-    { "binary", no_arg, 'b' },
-    { "binar", no_arg, 'b' },
-    { "bina", no_arg, 'b' },
-    { "bin", no_arg, 'b' },
-    { "bi", no_arg, 'b' },
-#endif  /* 0 */
-    { "block-size", require_arg, 'B' },
-    { "block-siz", require_arg, 'B' },
-    { "block-si", require_arg, 'B' },
-    { "block-s", require_arg, 'B' },
-    { "block-", require_arg, 'B' },
-    { "block", require_arg, 'B' },
-    { "bloc", require_arg, 'B' },
-    { "blo", require_arg, 'B' },
-    { "bl", require_arg, 'B' },
-    { "chunk", no_arg, 'c' },
-    { "chun", no_arg, 'c' },
-    { "chu", no_arg, 'c' },
-    { "ch", no_arg, 'c' },
-    { "collective", no_arg, 'C' },
-    { "collectiv", no_arg, 'C' },
-    { "collecti", no_arg, 'C' },
-    { "collect", no_arg, 'C' },
-    { "collec", no_arg, 'C' },
-    { "colle", no_arg, 'C' },
-    { "coll", no_arg, 'C' },
-    { "col", no_arg, 'C' },
-    { "co", no_arg, 'C' },
-    { "debug", require_arg, 'D' },
-    { "debu", require_arg, 'D' },
-    { "deb", require_arg, 'D' },
-    { "de", require_arg, 'D' },
-    { "geometry", no_arg, 'g' },
-    { "geometr", no_arg, 'g' },
-    { "geomet", no_arg, 'g' },
-    { "geome", no_arg, 'g' },
-    { "geom", no_arg, 'g' },
-    { "geo", no_arg, 'g' },
-    { "ge", no_arg, 'g' },
-    { "help", no_arg, 'h' },
-    { "hel", no_arg, 'h' },
-    { "he", no_arg, 'h' },
-    { "interleaved", require_arg, 'I' },
-    { "interleave", require_arg, 'I' },
-    { "interleav", require_arg, 'I' },
-    { "interlea", require_arg, 'I' },
-    { "interle", require_arg, 'I' },
-    { "interl", require_arg, 'I' },
-    { "inter", require_arg, 'I' },
-    { "inte", require_arg, 'I' },
-    { "int", require_arg, 'I' },
-    { "in", require_arg, 'I' },
-    { "max-num-processes", require_arg, 'P' },
-    { "max-num-processe", require_arg, 'P' },
-    { "max-num-process", require_arg, 'P' },
-    { "max-num-proces", require_arg, 'P' },
-    { "max-num-proce", require_arg, 'P' },
-    { "max-num-proc", require_arg, 'P' },
-    { "max-num-pro", require_arg, 'P' },
-    { "max-num-pr", require_arg, 'P' },
-    { "max-num-p", require_arg, 'P' },
-    { "min-num-processes", require_arg, 'p' },
-    { "min-num-processe", require_arg, 'p' },
-    { "min-num-process", require_arg, 'p' },
-    { "min-num-proces", require_arg, 'p' },
-    { "min-num-proce", require_arg, 'p' },
-    { "min-num-proc", require_arg, 'p' },
-    { "min-num-pro", require_arg, 'p' },
-    { "min-num-pr", require_arg, 'p' },
-    { "min-num-p", require_arg, 'p' },
-    { "max-xfer-size", require_arg, 'X' },
-    { "max-xfer-siz", require_arg, 'X' },
-    { "max-xfer-si", require_arg, 'X' },
-    { "max-xfer-s", require_arg, 'X' },
-    { "max-xfer", require_arg, 'X' },
-    { "max-xfe", require_arg, 'X' },
-    { "max-xf", require_arg, 'X' },
-    { "max-x", require_arg, 'X' },
-    { "min-xfer-size", require_arg, 'x' },
-    { "min-xfer-siz", require_arg, 'x' },
-    { "min-xfer-si", require_arg, 'x' },
-    { "min-xfer-s", require_arg, 'x' },
-    { "min-xfer", require_arg, 'x' },
-    { "min-xfe", require_arg, 'x' },
-    { "min-xf", require_arg, 'x' },
-    { "min-x", require_arg, 'x' },
-    { "num-bytes", require_arg, 'e' },
-    { "num-byte", require_arg, 'e' },
-    { "num-byt", require_arg, 'e' },
-    { "num-by", require_arg, 'e' },
-    { "num-b", require_arg, 'e' },
-    { "num-dsets", require_arg, 'd' },
-    { "num-dset", require_arg, 'd' },
-    { "num-dse", require_arg, 'd' },
-    { "num-ds", require_arg, 'd' },
-    { "num-d", require_arg, 'd' },
-    { "num-files", require_arg, 'F' },
-    { "num-file", require_arg, 'F' },
-    { "num-fil", require_arg, 'F' },
-    { "num-fi", require_arg, 'F' },
-    { "num-f", require_arg, 'F' },
-    { "num-iterations", require_arg, 'i' },
-    { "num-iteration", require_arg, 'i' },
-    { "num-iteratio", require_arg, 'i' },
-    { "num-iterati", require_arg, 'i' },
-    { "num-iterat", require_arg, 'i' },
-    { "num-itera", require_arg, 'i' },
-    { "num-iter", require_arg, 'i' },
-    { "num-ite", require_arg, 'i' },
-    { "num-it", require_arg, 'i' },
-    { "num-i", require_arg, 'i' },
-    { "output", require_arg, 'o' },
-    { "outpu", require_arg, 'o' },
-    { "outp", require_arg, 'o' },
-    { "out", require_arg, 'o' },
-    { "ou", require_arg, 'o' },
-    { "threshold", require_arg, 'T' },
-    { "threshol", require_arg, 'T' },
-    { "thresho", require_arg, 'T' },
-    { "thresh", require_arg, 'T' },
-    { "thres", require_arg, 'T' },
-    { "thre", require_arg, 'T' },
-    { "thr", require_arg, 'T' },
-    { "th", require_arg, 'T' },
-    { "write-only", require_arg, 'w' },
-    { "write-onl", require_arg, 'w' },
-    { "write-on", require_arg, 'w' },
-    { "write-o", require_arg, 'w' },
-    { "write", require_arg, 'w' },
-    { "writ", require_arg, 'w' },
-    { "wri", require_arg, 'w' },
-    { "wr", require_arg, 'w' },
-    { NULL, 0, '\0' }
-};
-
-struct options {
-    long io_types;              /* bitmask of which I/O types to test   */
-    const char *output_file;    /* file to print report to              */
-    long num_dsets;             /* number of datasets                   */
-    long num_files;             /* number of files                      */
-    off_t num_bpp;              /* number of bytes per proc per dset    */
-    int num_iters;              /* number of iterations                 */
-    int max_num_procs;          /* maximum number of processes to use   */
-    int min_num_procs;          /* minimum number of processes to use   */
-    size_t max_xfer_size;       /* maximum transfer buffer size         */
-    size_t min_xfer_size;       /* minimum transfer buffer size         */
-    size_t blk_size;            /* Block size                           */
-    unsigned interleaved;       /* Interleaved vs. contiguous blocks    */
-    unsigned collective;        /* Collective vs. independent I/O       */
-    unsigned dim2d;             /* 1D vs. 2D geometry                   */
-    int print_times;       	/* print times as well as throughputs   */
-    int print_raw;         	/* print raw data throughput info       */
-    off_t h5_alignment;         /* alignment in HDF5 file               */
-    off_t h5_threshold;         /* threshold for alignment in HDF5 file */
-    int h5_use_chunks;     	/* Make HDF5 dataset chunked            */
-    int h5_write_only;        	/* Perform the write tests only         */
-    int verify;        		/* Verify data correctness              */
-};
-
-typedef struct _minmax {
-    double min;
-    double max;
-    double sum;
-    int num;
-} minmax;
-
-/* local functions */
-static off_t parse_size_directive(const char *size);
-static struct options *parse_command_line(int argc, char *argv[]);
-static void run_test_loop(struct options *options);
-static int run_test(iotype iot, parameters parms, struct options *opts);
-static void output_all_info(minmax *mm, int count, int indent_level);
-static void get_minmax(minmax *mm, double val);
-static minmax accumulate_minmax_stuff(minmax *mm, int count);
-static int create_comm_world(int num_procs, int *doing_pio);
-static int destroy_comm_world(void);
-static void output_results(const struct options *options, const char *name,
-                           minmax *table, int table_size, off_t data_size);
-static void output_times(const struct options *options, const char *name,
-                           minmax *table, int table_size);
-static void output_report(const char *fmt, ...);
-static void print_indent(register int indent);
-static void usage(const char *prog);
-static void report_parameters(struct options *opts);
-
-/*
- * Function:    main
- * Purpose:     Start things up. Initialize MPI and then call the test looping
- *              function.
- * Return:      EXIT_SUCCESS or EXIT_FAILURE
- * Programmer:  Bill Wendling, 30. October 2001
- * Modifications:
- */
-int
-main(int argc, char **argv)
-{
-    int ret;
-    int exit_value = EXIT_SUCCESS;
-    struct options *opts = NULL;
-
-#ifndef STANDALONE
-    /* Initialize h5tools lib */
-    h5tools_init();
-#endif
-
-    output = stdout;
-
-    /* initialize MPI and get the maximum num of processors we started with */
-    MPI_Init(&argc, &argv);
-    ret = MPI_Comm_size(MPI_COMM_WORLD, &comm_world_nprocs_g);
-
-    if (ret != MPI_SUCCESS) {
-        fprintf(stderr, "%s: MPI_Comm_size call failed\n", progname);
-
-        if (ret == MPI_ERR_COMM)
-            fprintf(stderr, "invalid MPI communicator\n");
-        else
-            fprintf(stderr, "invalid argument\n");
-
-        exit_value = EXIT_FAILURE;
-        goto finish;
-    }
-
-    ret = MPI_Comm_rank(MPI_COMM_WORLD, &comm_world_rank_g);
-
-    if (ret != MPI_SUCCESS) {
-        fprintf(stderr, "%s: MPI_Comm_rank call failed\n", progname);
-
-        if (ret == MPI_ERR_COMM)
-            fprintf(stderr, "invalid MPI communicator\n");
-        else
-            fprintf(stderr, "invalid argument\n");
-
-        exit_value = EXIT_FAILURE;
-        goto finish;
-    }
-
-    pio_comm_g = MPI_COMM_WORLD;
-
-    h5_set_info_object();
-    opts = parse_command_line(argc, argv);
-
-    if (!opts) {
-        exit_value = EXIT_FAILURE;
-        goto finish;
-    }
-
-    if (opts->output_file) {
-        if ((output = fopen(opts->output_file, "w")) == NULL) {
-            fprintf(stderr, "%s: cannot open output file\n", progname);
-            perror(opts->output_file);
-            goto finish;
-        }
-    }
-
-    if ((pio_debug_level == 0 && comm_world_rank_g == 0) || pio_debug_level > 0)
-        report_parameters(opts);
-
-    run_test_loop(opts);
-
-finish:
-    MPI_Finalize();
-    free(opts);
-    return exit_value;
-}
-
-/*
- * Function:    run_test_loop
- * Purpose:     Run the I/O tests. Write the results to OUTPUT.
- *
- *            - The slowest changing part of the test is the number of
- *              processors to use. For each loop iteration, we divide that
- *              number by 2 and rerun the test.
- *
- *            - The second slowest is what type of IO API to perform. We have
- *              three choices: POSIXIO, MPI-IO, and PHDF5.
- *
- *            - Then we change the size of the buffer. This information is
- *              inferred from the number of datasets to create and the number
- *              of integers to put into each dataset. The backend code figures
- *              this out.
- *
- * Return:      Nothing
- * Programmer:  Bill Wendling, 30. October 2001
- * Modifications:
- *    Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static void
-run_test_loop(struct options *opts)
-{
-    parameters parms;
-    int num_procs;
-    int doing_pio;      /* if this process is doing PIO */
-
-    parms.num_files = opts->num_files;
-    parms.num_dsets = opts->num_dsets;
-    parms.num_iters = opts->num_iters;
-    parms.blk_size = opts->blk_size;
-    parms.interleaved = opts->interleaved;
-    parms.collective = opts->collective;
-    parms.dim2d = opts->dim2d;
-    parms.h5_align = opts->h5_alignment;
-    parms.h5_thresh = opts->h5_threshold;
-    parms.h5_use_chunks = opts->h5_use_chunks;
-    parms.h5_write_only = opts->h5_write_only;
-    parms.verify = opts->verify;
-
-    /* start with max_num_procs and decrement it by half for each loop. */
-    /* if performance needs restart, fewer processes may be needed. */
-    for (num_procs = opts->max_num_procs;
-            num_procs >= opts->min_num_procs; num_procs >>= 1) {
-        register size_t buf_size;
-
-        parms.num_procs = num_procs;
-
-        if (create_comm_world(parms.num_procs, &doing_pio) != SUCCESS) {
-            /* do something harsh */
-        }
-
-    /* only processes doing PIO will run the tests */
-    if (doing_pio){
-            output_report("Number of processors = %ld\n", parms.num_procs);
-
-            /* multiply the xfer buffer size by 2 for each loop iteration */
-            for (buf_size = opts->min_xfer_size;
-                    buf_size <= opts->max_xfer_size; buf_size <<= 1) {
-                parms.buf_size = buf_size;
-
-        if (parms.dim2d){
-            parms.num_bytes = (off_t)pow((double)(opts->num_bpp*parms.num_procs),2);
-            if (parms.interleaved)
-            output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n",
-                buf_size, opts->blk_size,
-                ((double)parms.num_dsets * (double)parms.num_bytes)
-                / ONE_MB);
-            else
-            output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MBs\n",
-                opts->blk_size, buf_size,
-                ((double)parms.num_dsets * (double)parms.num_bytes)
-                / ONE_MB);
-
-            print_indent(1);
-            output_report("  # of files: %ld, # of datasets: %ld, dataset size: %.2fx%.2f KBs\n",
-                parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_KB,
-                (double)(opts->num_bpp*parms.num_procs)/ONE_KB);
-        }
-        else{
-            parms.num_bytes = (off_t)opts->num_bpp*parms.num_procs;
-            output_report("Transfer Buffer Size: %ld bytes, File size: %.2f MBs\n",
-                buf_size,((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB);
-
-            print_indent(1);
-            output_report("  # of files: %ld, # of datasets: %ld, dataset size: %.2f MB\n",
-                parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_MB);
-        }
-
-                if (opts->io_types & PIO_POSIX)
-                    run_test(POSIXIO, parms, opts);
-
-                if (opts->io_types & PIO_MPI)
-                    run_test(MPIO, parms, opts);
-
-                if (opts->io_types & PIO_HDF5)
-                    run_test(PHDF5, parms, opts);
-
-                /* Run the tests once if buf_size==0, but then break out */
-                if(buf_size==0)
-                    break;
-            }
-
-            if (destroy_comm_world() != SUCCESS) {
-                /* do something harsh */
-            }
-    }
-    }
-}
-
-/*
- * Function:    run_test
- * Purpose:     Inner loop call to actually run the I/O test.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 18. December 2001
- * Modifications:
- */
-static int
-run_test(iotype iot, parameters parms, struct options *opts)
-{
-    results         res;
-    register int    i, ret_value = SUCCESS;
-    int             comm_size;
-    off_t           raw_size;
-    minmax         *write_mpi_mm_table=NULL;
-    minmax         *write_mm_table=NULL;
-    minmax         *write_gross_mm_table=NULL;
-    minmax         *write_raw_mm_table=NULL;
-    minmax         *read_mpi_mm_table=NULL;
-    minmax         *read_mm_table=NULL;
-    minmax         *read_gross_mm_table=NULL;
-    minmax         *read_raw_mm_table=NULL;
-    minmax         *read_open_mm_table=NULL;
-    minmax         *read_close_mm_table=NULL;
-    minmax         *write_open_mm_table=NULL;
-    minmax         *write_close_mm_table=NULL;
-    minmax          write_mpi_mm = {0.0, 0.0, 0.0, 0};
-    minmax          write_mm = {0.0, 0.0, 0.0, 0};
-    minmax          write_gross_mm = {0.0, 0.0, 0.0, 0};
-    minmax          write_raw_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_mpi_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_gross_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_raw_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_open_mm = {0.0, 0.0, 0.0, 0};
-    minmax          read_close_mm = {0.0, 0.0, 0.0, 0};
-    minmax          write_open_mm = {0.0, 0.0, 0.0, 0};
-    minmax          write_close_mm = {0.0, 0.0, 0.0, 0};
-
-    raw_size = parms.num_files * (off_t)parms.num_dsets * (off_t)parms.num_bytes;
-    parms.io_type = iot;
-    print_indent(2);
-    output_report("IO API = ");
-
-    switch (iot) {
-        case POSIXIO:
-            output_report("POSIX\n");
-            break;
-        case MPIO:
-            output_report("MPIO\n");
-            break;
-        case PHDF5:
-            output_report("PHDF5 (w/MPI-IO driver)\n");
-            break;
-    }
-
-    MPI_Comm_size(pio_comm_g, &comm_size);
-
-    /* allocate space for tables minmax and that it is sufficient */
-    /* to initialize all elements to zeros by calloc.             */
-    write_mpi_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_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    write_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    if (!parms.h5_write_only) {
-        read_mpi_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_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-        read_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    }
-
-    /* Do IO iteration times, collecting statistics each time */
-    for (i = 0; i < parms.num_iters; ++i) {
-        double t;
-
-        MPI_Barrier(pio_comm_g);
-        res = do_pio(parms);
-
-        /* gather all of the "mpi write" times */
-        t = get_time(res.timers, HDF5_MPI_WRITE);
-        get_minmax(&write_mpi_mm, t);
-
-        write_mpi_mm_table[i] = write_mpi_mm;
-
-        /* gather all of the "write" times */
-        t = get_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
-        get_minmax(&write_mm, t);
-
-        write_mm_table[i] = write_mm;
-
-        /* gather all of the "write" times from open to close */
-        t = get_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
-        get_minmax(&write_gross_mm, t);
-
-        write_gross_mm_table[i] = write_gross_mm;
-
-        /* gather all of the raw "write" times */
-        t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
-        get_minmax(&write_raw_mm, t);
-
-        write_raw_mm_table[i] = write_raw_mm;
-
-        /* gather all of the file open times (time from open to first write) */
-        t = get_time(res.timers, HDF5_FILE_WRITE_OPEN);
-        get_minmax(&write_open_mm, t);
-
-        write_open_mm_table[i] = write_open_mm;
-
-        /* gather all of the file close times (time from last write to close) */
-        t = get_time(res.timers, HDF5_FILE_WRITE_CLOSE);
-        get_minmax(&write_close_mm, t);
-
-        write_close_mm_table[i] = write_close_mm;
-
-        if (!parms.h5_write_only) {
-            /* gather all of the "mpi read" times */
-            t = get_time(res.timers, HDF5_MPI_READ);
-            get_minmax(&read_mpi_mm, t);
-
-            read_mpi_mm_table[i] = read_mpi_mm;
-
-            /* gather all of the "read" times */
-            t = get_time(res.timers, HDF5_FINE_READ_FIXED_DIMS);
-            get_minmax(&read_mm, t);
-
-            read_mm_table[i] = read_mm;
-
-            /* gather all of the "read" times from open to close */
-            t = get_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
-            get_minmax(&read_gross_mm, t);
-
-            read_gross_mm_table[i] = read_gross_mm;
-
-            /* gather all of the raw "read" times */
-            t = get_time(res.timers, HDF5_RAW_READ_FIXED_DIMS);
-            get_minmax(&read_raw_mm, t);
-
-            read_raw_mm_table[i] = read_raw_mm;
-
-            /* gather all of the file open times (time from open to first read) */
-            t = get_time(res.timers, HDF5_FILE_READ_OPEN);
-            get_minmax(&read_open_mm, t);
-
-            read_open_mm_table[i] = read_open_mm;
-
-            /* gather all of the file close times (time from last read to close) */
-            t = get_time(res.timers, HDF5_FILE_READ_CLOSE);
-            get_minmax(&read_close_mm, t);
-
-            read_close_mm_table[i] = read_close_mm;
-
-         }
-
-         io_time_destroy(res.timers);
-    }
-
-    /*
-     * Show various statistics
-     */
-    /* Write statistics	*/
-    /* Print the raw data throughput if desired */
-    if (opts->print_raw) {
-        /* accumulate and output the max, min, and average "raw write" times */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Raw Data Write details:\n");
-            output_all_info(write_raw_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts,"Raw Data Write",write_raw_mm_table,parms.num_iters,raw_size);
-    } /* end if */
-
-    /* show mpi write statics */
-    if (pio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("MPI Write details:\n");
-        output_all_info(write_mpi_mm_table, parms.num_iters, 4);
-    }
-
-    /* We don't currently output the MPI write results */
-
-    /* accumulate and output the max, min, and average "write" times */
-    if (pio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("Write details:\n");
-        output_all_info(write_mm_table, parms.num_iters, 4);
-    }
-
-    output_results(opts,"Write",write_mm_table,parms.num_iters,raw_size);
-
-    /* accumulate and output the max, min, and average "gross write" times */
-    if (pio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("Write Open-Close details:\n");
-        output_all_info(write_gross_mm_table, parms.num_iters, 4);
-    }
-
-    output_results(opts,"Write Open-Close",write_gross_mm_table,parms.num_iters,raw_size);
-
-    if (opts->print_times) {
-        output_times(opts,"Write File Open",write_open_mm_table,parms.num_iters);
-        output_times(opts,"Write File Close",write_close_mm_table,parms.num_iters);
-    }
-
-    /* Print out time from open to first write */
-    if (pio_debug_level >= 3) {
-       /* output all of the times for all iterations */
-       print_indent(3);
-       output_report("Write file open details:\n");
-       output_all_info(write_open_mm_table, parms.num_iters, 4);
-    }
-
-    /* Print out time from last write to close */
-    if (pio_debug_level >= 3) {
-       /* output all of the times for all iterations */
-       print_indent(3);
-       output_report("Write file close details:\n");
-       output_all_info(write_close_mm_table, parms.num_iters, 4);
-    }
-
-    if (!parms.h5_write_only) {
-        /* Read statistics	*/
-        /* Print the raw data throughput if desired */
-        if (opts->print_raw) {
-            /* accumulate and output the max, min, and average "raw read" times */
-            if (pio_debug_level >= 3) {
-                /* output all of the times for all iterations */
-                print_indent(3);
-                output_report("Raw Data Read details:\n");
-                output_all_info(read_raw_mm_table, parms.num_iters, 4);
-            }
-
-            output_results(opts, "Raw Data Read", read_raw_mm_table,
-                           parms.num_iters, raw_size);
-        } /* end if */
-
-        /* show mpi read statics */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("MPI Read details:\n");
-            output_all_info(read_mpi_mm_table, parms.num_iters, 4);
-        }
-
-        /* We don't currently output the MPI read results */
-
-        /* accumulate and output the max, min, and average "read" times */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read details:\n");
-            output_all_info(read_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
-
-        /* accumulate and output the max, min, and average "gross read" times */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read Open-Close details:\n");
-            output_all_info(read_gross_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts, "Read Open-Close", read_gross_mm_table,parms.num_iters, raw_size);
-
-        if (opts->print_times) {
-            output_times(opts,"Read File Open",read_open_mm_table,parms.num_iters);
-            output_times(opts,"Read File Close",read_close_mm_table,parms.num_iters);
-        }
-
-        /* Print out time from open to first read */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read file open details:\n");
-            output_all_info(read_open_mm_table, parms.num_iters, 4);
-        }
-
-        /* Print out time from last read to close */
-        if (pio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read file close details:\n");
-            output_all_info(read_close_mm_table, parms.num_iters, 4);
-        }
-
-    }
-
-    /* clean up our mess */
-    free(write_mpi_mm_table);
-    free(write_mm_table);
-    free(write_gross_mm_table);
-    free(write_raw_mm_table);
-    free(write_open_mm_table);
-    free(write_close_mm_table);
-
-    if (!parms.h5_write_only) {
-        free(read_mpi_mm_table);
-        free(read_mm_table);
-        free(read_gross_mm_table);
-        free(read_raw_mm_table);
-        free(read_open_mm_table);
-        free(read_close_mm_table);
-    }
-
-    return ret_value;
-}
-
-/*
- * Function:    output_all_info
- * Purpose:
- * Return:      Nothing
- * Programmer:  Bill Wendling, 29. January 2002
- * Modifications:
- */
-static void
-output_all_info(minmax *mm, int count, int indent_level)
-{
-    int i;
-
-    for (i = 0; i < count; ++i) {
-        print_indent(indent_level);
-        output_report("Iteration %d:\n", i + 1);
-        print_indent(indent_level + 1);
-        output_report("Minimum Time: %.2fs\n", mm[i].min);
-        print_indent(indent_level + 1);
-        output_report("Maximum Time: %.2fs\n", mm[i].max);
-    }
-}
-
-/*
- * Function:    get_minmax
- * Purpose:     Gather all the min, max and total of val.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 21. December 2001
- * Modifications:
- *    Use MPI_Allreduce to do it. -akc, 2002/01/11
- */
-static void
-get_minmax(minmax *mm, double val)
-{
-    int myrank;
-
-    MPI_Comm_rank(pio_comm_g, &myrank);
-    MPI_Comm_size(pio_comm_g, &mm->num);
-
-    MPI_Allreduce(&val, &mm->max, 1, MPI_DOUBLE, MPI_MAX, pio_comm_g);
-    MPI_Allreduce(&val, &mm->min, 1, MPI_DOUBLE, MPI_MIN, pio_comm_g);
-    MPI_Allreduce(&val, &mm->sum, 1, MPI_DOUBLE, MPI_SUM, pio_comm_g);
-}
-
-/*
- * Function:    accumulate_minmax_stuff
- * Purpose:     Accumulate the minimum, maximum, and average of the times
- *              across all processes.
- * Return:      TOTAL_MM - the total of all of these.
- * Programmer:  Bill Wendling, 21. December 2001
- * Modifications:
- *              Changed to use seconds instead of MB/s - QAK, 5/9/02
- */
-static minmax
-accumulate_minmax_stuff(minmax *mm, int count)
-{
-    int i;
-    minmax total_mm;
-
-    total_mm.sum = 0.0;
-    total_mm.max = -DBL_MAX;
-    total_mm.min = DBL_MAX;
-    total_mm.num = count;
-
-    for (i = 0; i < count; ++i) {
-        double m = mm[i].max;
-
-        total_mm.sum += m;
-
-        if (m < total_mm.min)
-            total_mm.min = m;
-
-        if (m > total_mm.max)
-            total_mm.max = m;
-    }
-
-    return total_mm;
-}
-
-/*
- * Function:    create_comm_world
- * Purpose:     Create an MPI Comm world and store it in pio_comm_g, which
- *              is a global variable.
- * Return:      SUCCESS on success.
- *              FAIL otherwise.
- * Programmer:  Bill Wendling, 19. December 2001
- * Modifications:
- */
-static int
-create_comm_world(int num_procs, int *doing_pio)
-{
-    /* MPI variables */
-    int     mrc;     /* return values                */
-    int     color;              /* for communicator creation    */
-    int     myrank, nprocs;
-
-    pio_comm_g = MPI_COMM_NULL;
-
-    /*
-     * Create a sub communicator for this PIO run. Easier to use the first N
-     * processes.
-     */
-    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
-
-    if (num_procs > nprocs) {
-        fprintf(stderr,
-                "number of process(%d) must be <= number of processes in MPI_COMM_WORLD(%d)\n",
-                num_procs, nprocs);
-        goto error_done;
-    }
-
-    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
-    color = (myrank < num_procs);
-    mrc = MPI_Comm_split(MPI_COMM_WORLD, color, myrank, &pio_comm_g);
-
-    if (mrc != MPI_SUCCESS) {
-        fprintf(stderr, "MPI_Comm_split failed\n");
-        goto error_done;
-    }
-
-    if (!color) {
-        /* not involved in this run */
-        mrc = destroy_comm_world();
-        goto done;
-    }
-
-    /* determine the MPI rank in the PIO communicator */
-    MPI_Comm_size(pio_comm_g, &pio_mpi_nprocs_g);
-    MPI_Comm_rank(pio_comm_g, &pio_mpi_rank_g);
-
-done:
-    *doing_pio = color;
-    return SUCCESS;
-
-error_done:
-    destroy_comm_world();
-    return FAIL;
-}
-
-/*
- * Function:    destroy_comm_world
- * Purpose:     Destroy the created MPI Comm world which is stored in the
- *              pio_comm_g global variable.
- * Return:      SUCCESS on success.
- *              FAIL otherwise.
- * Programmer:  Bill Wendling, 19. December 2001
- * Modifications:
- */
-static int
-destroy_comm_world(void)
-{
-    int     mrc = SUCCESS;      /* return code      */
-
-    /* release MPI resources */
-    if (pio_comm_g != MPI_COMM_NULL)
-        mrc = (MPI_Comm_free(&pio_comm_g) == MPI_SUCCESS ? SUCCESS : FAIL);
-
-    return mrc;
-}
-
-/*
- * Function:    output_results
- * Purpose:     Print information about the time & bandwidth for a given
- *                  minmax & # of iterations.
- * Return:      Nothing
- * Programmer:  Quincey Koziol, 9. May 2002
- * Modifications:
- */
-static void
-output_results(const struct options *opts, const char *name, minmax *table,
-    int table_size,off_t data_size)
-{
-    minmax          total_mm;
-
-    total_mm = accumulate_minmax_stuff(table, table_size);
-
-    print_indent(3);
-    output_report("%s (%d iteration(s)):\n", name,table_size);
-
-    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
-    print_indent(4);
-    output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.min));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", total_mm.min);
-    else
-        output_report("\n");
-
-    print_indent(4);
-    output_report("Average Throughput: %6.2f MB/s",
-                  MB_PER_SEC(data_size,total_mm.sum / total_mm.num));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
-    else
-        output_report("\n");
-
-    print_indent(4);
-    output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.max));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", total_mm.max);
-    else
-        output_report("\n");
-
-}
-
-static void
-output_times(const struct options *opts, const char *name, minmax *table,
-    int table_size)
-{
-    minmax          total_mm;
-
-    total_mm = accumulate_minmax_stuff(table, table_size);
-
-    print_indent(3);
-    output_report("%s (%d iteration(s)):\n", name,table_size);
-
-    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
-    print_indent(4);
-        output_report("Minimum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.min));
-
-    print_indent(4);
-        output_report("Average Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.sum / total_mm.num));
-
-    print_indent(4);
-        output_report("Maximum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.max));
-}
-
-/*
- * Function:    output_report
- * Purpose:     Print a line of the report. Only do so if I'm the 0 process.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 19. December 2001
- * Modifications:
- */
-static void
-output_report(const char *fmt, ...)
-{
-    int myrank;
-
-    MPI_Comm_rank(pio_comm_g, &myrank);
-
-    if (myrank == 0) {
-        va_list ap;
-
-        va_start(ap, fmt);
-        vfprintf(output, fmt, ap);
-        va_end(ap);
-    }
-}
-
-/*
- * Function:    print_indent
- * Purpose:     Print spaces to indent a new line of text for pretty printing
- *              things.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 29. October 2001
- * Modifications:
- */
-static void
-print_indent(register int indent)
-{
-    int myrank;
-
-    MPI_Comm_rank(pio_comm_g, &myrank);
-
-    if (myrank == 0) {
-	indent *= TAB_SPACE;
-
-	for (; indent > 0; --indent)
-	    fputc(' ', output);
-    }
-}
-
-static void
-recover_size_and_print(long long val, const char *end)
-{
-    if (val >= ONE_KB && (val % ONE_KB) == 0) {
-        if (val >= ONE_MB && (val % ONE_MB) == 0) {
-            if (val >= ONE_GB && (val % ONE_GB) == 0)
-                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""GB%s", val / ONE_GB, end);
-            else
-                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""MB%s", val / ONE_MB, end);
-        } else {
-            HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""KB%s", val / ONE_KB, end);
-        }
-    } else {
-        HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""%s", val, end);
-    }
-}
-
-static void
-print_io_api(long io_types)
-{
-    if (io_types & PIO_POSIX)
-	HDfprintf(output, "posix ");
-    if (io_types & PIO_MPI)
-	HDfprintf(output, "mpiio ");
-    if (io_types & PIO_HDF5)
-	HDfprintf(output, "phdf5 ");
-    HDfprintf(output, "\n");
-}
-
-static void
-report_parameters(struct options *opts)
-{
-    int rank = comm_world_rank_g;
-
-    print_version("HDF5 Library");	/* print library version */
-    HDfprintf(output, "rank %d: ==== Parameters ====\n", rank);
-
-    HDfprintf(output, "rank %d: IO API=", rank);
-    print_io_api(opts->io_types);
-
-    HDfprintf(output, "rank %d: Number of files=%ld\n", rank,
-              opts->num_files);
-    HDfprintf(output, "rank %d: Number of datasets=%ld\n", rank,
-              opts->num_dsets);
-    HDfprintf(output, "rank %d: Number of iterations=%d\n", rank,
-              opts->num_iters);
-    HDfprintf(output, "rank %d: Number of processes=%d:%d\n", rank,
-              opts->min_num_procs, opts->max_num_procs);
-
-    if (opts->dim2d){
-    HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
-    recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->min_num_procs), ":");
-    recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->max_num_procs), "\n");
-
-    HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
-    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), "x");
-    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
-    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "x");
-    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
-
-    HDfprintf(output, "rank %d: File size=", rank);
-    recover_size_and_print((long long)(pow(opts->num_bpp * opts->min_num_procs,2)
-            * opts->num_dsets), ":");
-    recover_size_and_print((long long)(pow(opts->num_bpp * opts->max_num_procs,2)
-            * opts->num_dsets), "\n");
-
-    HDfprintf(output, "rank %d: Transfer buffer size=", rank);
-    if(opts->interleaved){
-        recover_size_and_print((long long)opts->min_xfer_size, "x");
-        recover_size_and_print((long long)opts->blk_size, ":");
-        recover_size_and_print((long long)opts->max_xfer_size, "x");
-        recover_size_and_print((long long)opts->blk_size, "\n");
-    }
-    else{
-        recover_size_and_print((long long)opts->blk_size, "x");
-        recover_size_and_print((long long)opts->min_xfer_size, ":");
-        recover_size_and_print((long long)opts->blk_size, "x");
-        recover_size_and_print((long long)opts->max_xfer_size, "\n");
-    }
-    HDfprintf(output, "rank %d: Block size=", rank);
-    recover_size_and_print((long long)opts->blk_size, "x");
-    recover_size_and_print((long long)opts->blk_size, "\n");
-    }
-    else{
-    HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
-    recover_size_and_print((long long)opts->num_bpp, "\n");
-
-    HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
-    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
-    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
-
-    HDfprintf(output, "rank %d: File size=", rank);
-    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs
-            * opts->num_dsets), ":");
-    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs
-            * opts->num_dsets), "\n");
-
-    HDfprintf(output, "rank %d: Transfer buffer size=", rank);
-    recover_size_and_print((long long)opts->min_xfer_size, ":");
-    recover_size_and_print((long long)opts->max_xfer_size, "\n");
-    HDfprintf(output, "rank %d: Block size=", rank);
-    recover_size_and_print((long long)opts->blk_size, "\n");
-    }
-
-    HDfprintf(output, "rank %d: Block Pattern in Dataset=", rank);
-    if(opts->interleaved)
-        HDfprintf(output, "Interleaved\n");
-    else
-        HDfprintf(output, "Contiguous\n");
-
-    HDfprintf(output, "rank %d: I/O Method for MPI and HDF5=", rank);
-    if(opts->collective)
-        HDfprintf(output, "Collective\n");
-    else
-        HDfprintf(output, "Independent\n");
-
-    HDfprintf(output, "rank %d: Geometry=", rank);
-    if(opts->dim2d)
-        HDfprintf(output, "2D\n");
-    else
-        HDfprintf(output, "1D\n");
-
-    HDfprintf(output, "rank %d: VFL used for HDF5 I/O=%s\n", rank, "MPI-IO driver");
-
-    HDfprintf(output, "rank %d: Data storage method in HDF5=", rank);
-    if(opts->h5_use_chunks)
-        HDfprintf(output, "Chunked\n");
-    else
-        HDfprintf(output, "Contiguous\n");
-
-    {
-        char *prefix = getenv("HDF5_PARAPREFIX");
-
-        HDfprintf(output, "rank %d: Env HDF5_PARAPREFIX=%s\n", rank,
-                  (prefix ? prefix : "not set"));
-    }
-
-    HDfprintf(output, "rank %d: ", rank);
-    h5_dump_info_object(h5_io_info_g);
-
-    HDfprintf(output, "rank %d: ==== End of Parameters ====\n", rank);
-    HDfprintf(output, "\n");
-}
-
-/*
- * Function:    parse_command_line
- * Purpose:     Parse the command line options and return a STRUCT OPTIONS
- *              structure which will need to be freed by the calling function.
- * Return:      Pointer to an OPTIONS structure
- * Programmer:  Bill Wendling, 31. October 2001
- * Modifications:
- *    Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static struct options *
-parse_command_line(int argc, char *argv[])
-{
-    register int opt;
-    struct options *cl_opts;
-
-    cl_opts = (struct options *)malloc(sizeof(struct options));
-
-    cl_opts->output_file = NULL;
-    cl_opts->io_types =  0;    /* will set default after parsing options */
-    cl_opts->num_dsets = 1;
-    cl_opts->num_files = 1;
-    cl_opts->num_bpp = 0;
-    cl_opts->num_iters = 1;
-    cl_opts->max_num_procs = comm_world_nprocs_g;
-    cl_opts->min_num_procs = 1;
-    cl_opts->max_xfer_size = 0;
-    cl_opts->min_xfer_size = 0;
-    cl_opts->blk_size = 0;
-    cl_opts->interleaved = 0;       /* Default to contiguous blocks in dataset */
-    cl_opts->collective = 0;        /* Default to independent I/O access */
-    cl_opts->dim2d = 0;             /* Default to 1D */
-    cl_opts->print_times = FALSE;   /* Printing times is off by default */
-    cl_opts->print_raw = FALSE;     /* Printing raw data throughput is off by default */
-    cl_opts->h5_alignment = 1;      /* No alignment for HDF5 objects by default */
-    cl_opts->h5_threshold = 1;      /* No threshold for aligning HDF5 objects by default */
-    cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
-    cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
-    cl_opts->verify = FALSE;        /* No Verify data correctness by default */
-
-    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) != EOF) {
-        switch ((char)opt) {
-        case 'a':
-            cl_opts->h5_alignment = parse_size_directive(opt_arg);
-            break;
-        case 'A':
-            {
-                const char *end = opt_arg;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-                    int i;
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    if (!HDstrcasecmp(buf, "phdf5")) {
-                        cl_opts->io_types |= PIO_HDF5;
-                    } else if (!HDstrcasecmp(buf, "mpiio")) {
-                        cl_opts->io_types |= PIO_MPI;
-                    } else if (!HDstrcasecmp(buf, "posix")) {
-                        cl_opts->io_types |= PIO_POSIX;
-                    } else {
-                        fprintf(stderr, "pio_perf: invalid --api option %s\n",
-                                buf);
-                        exit(EXIT_FAILURE);
-                    }
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-            }
-
-            break;
-#if 0
-        case 'b':
-            /* the future "binary" option */
-            break;
-#endif  /* 0 */
-        case 'B':
-            cl_opts->blk_size = parse_size_directive(opt_arg);
-            break;
-        case 'c':
-            /* Turn on chunked HDF5 dataset creation */
-            cl_opts->h5_use_chunks = TRUE;
-            break;
-        case 'C':
-            cl_opts->collective = 1;
-            break;
-        case 'd':
-            cl_opts->num_dsets = atoi(opt_arg);
-            break;
-        case 'D':
-            {
-                const char *end = opt_arg;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-                    int i;
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    if (strlen(buf) > 1 || isdigit(buf[0])) {
-                        size_t j;
-
-                        for (j = 0; j < 10 && buf[j] != '\0'; ++j)
-                            if (!isdigit(buf[j])) {
-                                fprintf(stderr, "pio_perf: invalid --debug option %s\n",
-                                        buf);
-                                exit(EXIT_FAILURE);
-                            }
-
-                        pio_debug_level = atoi(buf);
-
-                        if (pio_debug_level > 4)
-                            pio_debug_level = 4;
-                        else if (pio_debug_level < 0)
-                            pio_debug_level = 0;
-                    } else {
-                        switch (*buf) {
-                        case 'r':
-                            /* Turn on raw data throughput info */
-                            cl_opts->print_raw = TRUE;
-                            break;
-                        case 't':
-                            /* Turn on time printing */
-                            cl_opts->print_times = TRUE;
-                            break;
-            case 'v':
-                            /* Turn on verify data correctness*/
-                cl_opts->verify = TRUE;
-                break;
-                        default:
-                            fprintf(stderr, "pio_perf: invalid --debug option %s\n", buf);
-                            exit(EXIT_FAILURE);
-                        }
-                    }
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-            }
-
-            break;
-        case 'e':
-            cl_opts->num_bpp = parse_size_directive(opt_arg);
-            break;
-        case 'F':
-            cl_opts->num_files = atoi(opt_arg);
-            break;
-        case 'g':
-            cl_opts->dim2d = 1;
-            break;
-        case 'i':
-            cl_opts->num_iters = atoi(opt_arg);
-            break;
-        case 'I':
-            cl_opts->interleaved = 1;
-            break;
-        case 'o':
-            cl_opts->output_file = opt_arg;
-            break;
-        case 'p':
-            cl_opts->min_num_procs = atoi(opt_arg);
-            break;
-        case 'P':
-            cl_opts->max_num_procs = atoi(opt_arg);
-            break;
-        case 'T':
-            cl_opts->h5_threshold = parse_size_directive(opt_arg);
-            break;
-        case 'w':
-            cl_opts->h5_write_only = TRUE;
-            break;
-        case 'x':
-            cl_opts->min_xfer_size = parse_size_directive(opt_arg);
-            break;
-        case 'X':
-            cl_opts->max_xfer_size = parse_size_directive(opt_arg);
-            break;
-        case 'h':
-        case '?':
-        default:
-            usage(progname);
-            free(cl_opts);
-            return NULL;
-        }
-    }
-
-
-    if (cl_opts->num_bpp == 0){
-        if (cl_opts->dim2d == 0)
-            cl_opts->num_bpp = 256 * ONE_KB;
-        else
-            cl_opts->num_bpp = 8 * ONE_KB;
-    }
-
-    if (cl_opts->max_xfer_size == 0)
-        cl_opts->max_xfer_size = cl_opts->num_bpp;
-
-    if (cl_opts->min_xfer_size == 0)
-        cl_opts->min_xfer_size = (cl_opts->num_bpp)/2;
-
-    if (cl_opts->blk_size == 0)
-        cl_opts->blk_size = (cl_opts->num_bpp)/2;
-
-
-    /* set default if none specified yet */
-    if (!cl_opts->io_types)
-    cl_opts->io_types = PIO_HDF5 | PIO_MPI | PIO_POSIX; /* run all API */
-
-    /* verify parameters sanity.  Adjust if needed. */
-    /* cap xfer_size with bytes per process */
-    if (!cl_opts->dim2d) {
-        if (cl_opts->min_xfer_size > cl_opts->num_bpp)
-        cl_opts->min_xfer_size = cl_opts->num_bpp;
-        if (cl_opts->max_xfer_size > cl_opts->num_bpp)
-        cl_opts->max_xfer_size = cl_opts->num_bpp;
-    }
-    if (cl_opts->min_xfer_size > cl_opts->max_xfer_size)
-    cl_opts->min_xfer_size = cl_opts->max_xfer_size;
-    if (cl_opts->blk_size > cl_opts->num_bpp )
-        cl_opts->blk_size = cl_opts->num_bpp;
-    /* check range of number of processes */
-    if (cl_opts->min_num_procs <= 0)
-    cl_opts->min_num_procs = 1;
-    if (cl_opts->max_num_procs <= 0)
-    cl_opts->max_num_procs = 1;
-    if (cl_opts->min_num_procs > cl_opts->max_num_procs)
-    cl_opts->min_num_procs = cl_opts->max_num_procs;
-    /* check iteration */
-    if (cl_opts->num_iters <= 0)
-    cl_opts->num_iters = 1;
-
-    return cl_opts;
-}
-
-/*
- * Function:    parse_size_directive
- * Purpose:     Parse the size directive passed on the commandline. The size
- *              directive is an integer followed by a size indicator:
- *
- *                  K, k - Kilobyte
- *                  M, m - Megabyte
- *                  G, g - Gigabyte
- *
- * Return:      The size as a off_t because this is related to file size.
- *              If an unknown size indicator is used, then the program will
- *              exit with EXIT_FAILURE as the return value.
- * Programmer:  Bill Wendling, 18. December 2001
- * Modifications:
- */
-static off_t
-parse_size_directive(const char *size)
-{
-    off_t s;
-    char *endptr;
-
-    s = strtol(size, &endptr, 10);
-
-    if (endptr && *endptr) {
-        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
-            ++endptr;
-
-        switch (*endptr) {
-            case 'K':
-            case 'k':
-                s *= ONE_KB;
-                break;
-            case 'M':
-            case 'm':
-                s *= ONE_MB;
-                break;
-            case 'G':
-            case 'g':
-                s *= ONE_GB;
-                break;
-            default:
-                fprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
-                exit(EXIT_FAILURE);
-        }
-    }
-
-    return s;
-}
-
-/*
- * Function:    usage
- * Purpose:     Print a usage message and then exit.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 31. October 2001
- * Modifications:
- * 	Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static void
-usage(const char *prog)
-{
-    int myrank;
-
-    MPI_Comm_rank(pio_comm_g, &myrank);
-
-    if (myrank == 0) {
-	print_version(prog);
-        printf("usage: %s [OPTIONS]\n", prog);
-        printf("  OPTIONS\n");
-        printf("     -h, --help                  Print a usage message and exit\n");
-        printf("     -a S, --align=S             Alignment of objects in HDF5 file [default: 1]\n");
-        printf("     -A AL, --api=AL             Which APIs to test [default: all of them]\n");
-#if 0
-        printf("     -b, --binary                The elusive binary option\n");
-#endif  /* 0 */
-        printf("     -B S, --block-size=S        Block size within transfer buffer\n");
-        printf("                                 (see below for description)\n");
-        printf("                                 [default: half the number of bytes per process\n");
-        printf("                                           per dataset]\n");
-        printf("     -c, --chunk                 Create HDF5 datasets using chunked storage\n");
-        printf("                                 [default: contiguous storage]\n");
-        printf("     -C, --collective            Use collective I/O for MPI and HDF5 APIs\n");
-        printf("                                 [default: independent I/O)\n");
-        printf("     -d N, --num-dsets=N         Number of datasets per file [default: 1]\n");
-        printf("     -D DL, --debug=DL           Indicate the debugging level\n");
-        printf("                                 [default: no debugging]\n");
-        printf("     -e S, --num-bytes=S         Number of bytes per process per dataset\n");
-        printf("                                 (see below for description)\n");
-        printf("                                 [default: 256K for 1D, 8K for 2D]\n");
-        printf("     -F N, --num-files=N         Number of files [default: 1]\n");
-        printf("     -g, --geometry              Use 2D geometry [default: 1D geometry]\n");
-        printf("     -i N, --num-iterations=N    Number of iterations to perform [default: 1]\n");
-        printf("     -I, --interleaved           Interleaved access pattern\n");
-        printf("                                 (see below for example)\n");
-        printf("                                 [default: Contiguous access pattern]\n");
-        printf("     -o F, --output=F            Output raw data into file F [default: none]\n");
-        printf("     -p N, --min-num-processes=N Minimum number of processes to use [default: 1]\n");
-        printf("     -P N, --max-num-processes=N Maximum number of processes to use\n");
-        printf("                                 [default: all MPI_COMM_WORLD processes ]\n");
-        printf("     -T S, --threshold=S         Threshold for alignment of objects in HDF5 file\n");
-        printf("                                 [default: 1]\n");
-        printf("     -w, --write-only            Perform write tests not the read tests\n");
-        printf("     -x S, --min-xfer-size=S     Minimum transfer buffer size\n");
-        printf("                                 (see below for description)\n");
-        printf("                                 [default: half the number of bytes per process\n");
-        printf("                                           per dataset]\n");
-        printf("     -X S, --max-xfer-size=S     Maximum transfer buffer size\n");
-        printf("                                 [default: the number of bytes per process per\n");
-        printf("                                           dataset]\n");
-        printf("\n");
-        printf("  F  - is a filename.\n");
-        printf("  N  - is an integer >=0.\n");
-        printf("  S  - is a size specifier, an integer >=0 followed by a size indicator:\n");
-        printf("          K - Kilobyte (%d)\n", ONE_KB);
-        printf("          M - Megabyte (%d)\n", ONE_MB);
-        printf("          G - Gigabyte (%d)\n", ONE_GB);
-        printf("\n");
-        printf("      Example: '37M' is 37 megabytes or %d bytes\n", 37*ONE_MB);
-        printf("\n");
-        printf("  AL - is an API list. Valid values are:\n");
-        printf("          phdf5 - Parallel HDF5\n");
-        printf("          mpiio - MPI-I/O\n");
-        printf("          posix - POSIX\n");
-        printf("\n");
-        printf("      Example: --api=mpiio,phdf5\n");
-        printf("\n");
-        printf("  Dataset size:\n");
-        printf("      Depending on the selected geometry, each test dataset is either a linear\n");
-        printf("      array of size bytes-per-process * num-processes, or a square array of size\n");
-        printf("      (bytes-per-process * num-processes) x (bytes-per-process * num-processes).\n");
-        printf("\n");
-        printf("  Block size vs. Transfer buffer size:\n");
-        printf("      buffer-size controls the size of the memory buffer, which is broken into\n");
-        printf("      blocks and written to the file. Depending on the selected geometry, each\n");
-        printf("      block can be a linear array of size block-size or a square array of size\n");
-        printf("      block-size x block-size. The arrangement in which blocks are written is\n");
-        printf("      determined by the access pattern.\n");
-        printf("\n");
-        printf("      In 1D geometry, the transfer buffer is a linear array of size buffer-size.\n");
-        printf("      In 2D geometry, it is a rectangular array of size block-size x buffer-size\n");
-        printf("      or buffer-size x block-size if interleaved pattern is selected.\n");
-        printf("\n");
-        printf("  Interleaved and Contiguous patterns in 1D geometry:\n");
-        printf("      When contiguous access pattern is chosen, the dataset is evenly divided\n");
-        printf("      into num-processes regions and each process writes data to its own region.\n");
-        printf("      When interleaved blocks are written to a dataset, space for the first\n");
-        printf("      block of the first process is allocated in the dataset, then space is\n");
-        printf("      allocated for the first block of the second process, etc. until space is\n");
-        printf("      allocated for the first block of each process, then space is allocated for\n");
-        printf("      the second block of the first process, the second block of the second\n");
-        printf("      process, etc.\n");
-        printf("\n");
-        printf("      For example, with a 3 process run, 512KB bytes-per-process, 256KB transfer\n");
-        printf("        buffer size, and 64KB block size, each process must issue 2 transfer\n");
-        printf("        requests to complete access to the dataset.\n");
-        printf("          Contiguous blocks of the first transfer request are written like so:\n");
-        printf("              1111----2222----3333----\n");
-        printf("          Interleaved blocks of the first transfer request are written like so:\n");
-        printf("              123123123123------------\n");
-        printf("        The actual number of I/O operations involved in a transfer request\n");
-        printf("        depends on the access pattern and communication mode.\n");
-        printf("        When using independent I/O with interleaved pattern, each process\n");
-        printf("        performs 4 small non-contiguous I/O operations per transfer request.\n");
-        printf("        If collective I/O is turned on, the combined content of the buffers of\n");
-        printf("        the 3 processes will be written using one collective I/O operation\n");
-        printf("        per transfer request.\n");
-        printf("\n");
-        printf("      For information about access patterns in 2D geometry, please refer to the\n");
-        printf("      HDF5 Reference Manual.\n");
-        printf("\n");
-        printf("  DL - is a list of debugging flags. Valid values are:\n");
-        printf("          1 - Minimal\n");
-        printf("          2 - Not quite everything\n");
-        printf("          3 - Everything\n");
-        printf("          4 - The kitchen sink\n");
-        printf("          r - Raw data I/O throughput information\n");
-        printf("          t - Times as well as throughputs\n");
-        printf("          v - Verify data correctness\n");
-        printf("\n");
-        printf("      Example: --debug=2,r,t\n");
-        printf("\n");
-        printf("  Environment variables:\n");
-        printf("  HDF5_NOCLEANUP   Do not remove data files if set [default remove]\n");
-        printf("  HDF5_MPI_INFO    MPI INFO object key=value separated by ;\n");
-        printf("  HDF5_PARAPREFIX  Paralllel data files prefix\n");
-        fflush(stdout);
-    } /* end if */
-} /* end usage() */
-
-#else /* H5_HAVE_PARALLEL */
-
-/*
- * Function:    main
- * Purpose:     Dummy main() function for if HDF5 was configured without
- *              parallel stuff.
- * Return:      EXIT_SUCCESS
- * Programmer:  Bill Wendling, 14. November 2001
- */
-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_perf.h b/tools/perform/pio_perf.h
deleted file mode 100644
index 0fff7a3..0000000
--- a/tools/perform/pio_perf.h
+++ /dev/null
@@ -1,105 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef PIO_PERF_H__
-#define PIO_PERF_H__
-
-#ifndef STANDALONE
-#include "H5private.h"
-#include "h5test.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#else
-#include "pio_standalone.h"
-#endif
-#include "io_timer.h"
-
-/* setup the dataset no fill option if this is v1.5 or more */
-#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
-#define H5_HAVE_NOFILL 1
-#endif
-
-typedef enum iotype_ {
-    POSIXIO,
-    MPIO,
-    PHDF5
-    /*NUM_TYPES*/
-} iotype;
-
-typedef struct parameters_ {
-    iotype	io_type;        /* The type of IO test to perform       */
-    int		num_procs;      /* Maximum number of processes to use   */
-    long	num_files;      /* Number of files to create            */
-    long	num_dsets;      /* Number of datasets to create         */
-    off_t	num_bytes;      /* Number of bytes in each dset         */
-    int         num_iters;      /* Number of times to loop doing the IO */
-    size_t 	buf_size;       /* Buffer size                          */
-    size_t 	blk_size;       /* Block size                           */
-    unsigned    interleaved;    /* Interleaved vs. contiguous blocks    */
-    unsigned    collective;     /* Collective vs. independent I/O       */
-    unsigned    dim2d;          /* 1D vs. 2D                            */
-    hsize_t 	h5_align;       /* HDF5 object alignment                */
-    hsize_t 	h5_thresh;      /* HDF5 object alignment threshold      */
-    int 	h5_use_chunks;  /* Make HDF5 dataset chunked            */
-    int    	h5_write_only;  /* Perform the write tests only         */
-    int 	verify;    	/* Verify data correctness              */
-} parameters;
-
-typedef struct results_ {
-    herr_t      ret_code;
-    io_time_t   *timers;
-} results;
-
-#ifndef SUCCESS
-#define SUCCESS     0
-#endif  /* !SUCCESS */
-
-#ifndef FAIL
-#define FAIL        -1
-#endif  /* !FAIL */
-
-extern FILE     *output;            /* output file                          */
-extern io_time_t *timer_g;           /* timer: global for stub functions     */
-extern int      comm_world_rank_g;  /* my rank in MPI_COMM_RANK             */
-extern int      comm_world_nprocs_g;/* num. of processes of MPI_COMM_WORLD  */
-extern MPI_Comm pio_comm_g;         /* Communicator to run the PIO          */
-extern int      pio_mpi_rank_g;     /* MPI rank of pio_comm_g               */
-extern int      pio_mpi_nprocs_g;   /* number of processes of pio_comm_g    */
-extern int      pio_debug_level;    /* The debug level:
-                                     *   0 - Off
-                                     *   1 - Minimal
-                                     *   2 - Some more
-                                     *   3 - Maximal
-                                     *   4 - Even More Debugging (timer stuff)
-                                     */
-
-#define HDprint_rank(f)              /* print rank in MPI_COMM_WORLD */    \
-    HDfprintf(f, "%d: ", comm_world_rank_g);
-#define HDprint_size(f)              /* print size of MPI_COMM_WORLD */    \
-    HDfprintf(f, "%d", comm_world_nprocs_g);
-#define HDprint_rank_size(f)         /* print rank/size of MPI_COMM_WORLD */  \
-    HDfprintf(f, "%d/%d: ", comm_world_rank_g, comm_world_nprocs_g);
-
-#ifdef __cplusplus
-extern "C" {
-#endif  /* __cplusplus */
-
-extern results do_pio(parameters param);
-
-#ifdef __cplusplus
-}
-#endif  /* __cplusplus */
-
-#endif  /* PIO_PERF_H__ */
diff --git a/tools/perform/pio_standalone.c b/tools/perform/pio_standalone.c
deleted file mode 100644
index e404274..0000000
--- a/tools/perform/pio_standalone.c
+++ /dev/null
@@ -1,282 +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 definition of functions required to build h5perf in
- * STANDALONE mode.
- * Created: Christian Chilan, 2005/5/18.
- */
-
-#include "pio_perf.h"
-
-
-/** From h5tools_utils.c **/
-
-/* global variables */
-int   nCols = 80;
-
-/* ``get_option'' variables */
-int         opt_err = 1;    /*get_option prints errors if this is on */
-int         opt_ind = 1;    /*token pointer                          */
-const char *opt_arg;        /*flag argument (or value)               */
-
-
-int
-get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
-{
-    static int sp = 1;    /* character index in current token */
-    int opt_opt = '?';    /* option character passed back to user */
-
-    if (sp == 1) {
-        /* check for more flag-like tokens */
-        if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
-            return EOF;
-        } else if (HDstrcmp(argv[opt_ind], "--") == 0) {
-            opt_ind++;
-            return EOF;
-        }
-    }
-
-    if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
-        /* long command line option */
-        const char *arg = &argv[opt_ind][2];
-        int i;
-
-        for (i = 0; l_opts && l_opts[i].name; i++) {
-            size_t len = HDstrlen(l_opts[i].name);
-
-            if (HDstrncmp(arg, l_opts[i].name, len) == 0) {
-                /* we've found a matching long command line flag */
-                opt_opt = l_opts[i].shortval;
-
-                if (l_opts[i].has_arg != no_arg) {
-                    if (arg[len] == '=') {
-                        opt_arg = &arg[len + 1];
-                    } else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
-                        opt_arg = argv[++opt_ind];
-                    } else if (l_opts[i].has_arg == require_arg) {
-                        if (opt_err)
-                            HDfprintf(stderr,
-                                    "%s: option required for \"--%s\" flag\n",
-                                    argv[0], arg);
-
-                        opt_opt = '?';
-                    }
-                } else {
-                    if (arg[len] == '=') {
-                        if (opt_err)
-                            HDfprintf(stderr,
-                                    "%s: no option required for \"%s\" flag\n",
-                                    argv[0], arg);
-
-                        opt_opt = '?';
-                    }
-
-                    opt_arg = NULL;
-                }
-
-                break;
-            }
-        }
-
-        if (l_opts[i].name == NULL) {
-            /* exhausted all of the l_opts we have and still didn't match */
-            if (opt_err)
-                HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
-
-            opt_opt = '?';
-        }
-
-        opt_ind++;
-        sp = 1;
-    } else {
-        register char *cp;    /* pointer into current token */
-
-        /* short command line option */
-        opt_opt = argv[opt_ind][sp];
-
-        if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
-
-            if (opt_err)
-                HDfprintf(stderr, "%s: unknown option \"%c\"\n",
-                        argv[0], opt_opt);
-
-            /* if no chars left in this token, move to next token */
-            if (argv[opt_ind][++sp] == '\0') {
-                opt_ind++;
-                sp = 1;
-            }
-
-            return '?';
-        }
-
-        if (*++cp == ':') {
-            /* if a value is expected, get it */
-            if (argv[opt_ind][sp + 1] != '\0') {
-                /* flag value is rest of current token */
-                opt_arg = &argv[opt_ind++][sp + 1];
-            } else if (++opt_ind >= argc) {
-                if (opt_err)
-                    HDfprintf(stderr,
-                            "%s: value expected for option \"%c\"\n",
-                            argv[0], opt_opt);
-
-                opt_opt = '?';
-            } else {
-                /* flag value is next token */
-                opt_arg = argv[opt_ind++];
-            }
-
-            sp = 1;
-        } else {
-            /* set up to look at next char in token, next time */
-            if (argv[opt_ind][++sp] == '\0') {
-                /* no more in current token, so setup next token */
-                opt_ind++;
-                sp = 1;
-            }
-
-            opt_arg = NULL;
-        }
-    }
-
-    /* return the current flag character found */
-    return opt_opt;
-}
-
-
-void
-print_version(const char *progname)
-{
-    printf("%s: Version %u.%u.%u%s%s\n",
-           progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
-           H5_VERS_SUBRELEASE[0] ? "-" : "", H5_VERS_SUBRELEASE);
-}
-
-
-
-/** From h5test.c **/
-
-#ifdef H5_HAVE_PARALLEL
-MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
-#endif
-
-int
-h5_set_info_object(void)
-{
-    char	*envp;			/* environment pointer */
-    int		ret_value=0;
-
-    /* handle any MPI INFO hints via $HDF5_MPI_INFO */
-    if ((envp = getenv("HDF5_MPI_INFO")) != NULL){
-        char *next, *valp;
-
-
-        valp = envp = next = HDstrdup(envp);
-
-        /* create an INFO object if not created yet */
-        if (h5_io_info_g == MPI_INFO_NULL)
-            MPI_Info_create(&h5_io_info_g);
-
-        do {
-            size_t len;
-            char *key_val, *endp, *namep;
-
-            if (*valp == ';')
-                valp++;
-
-            /* copy key/value pair into temporary buffer */
-            len = strcspn(valp, ";");
-            next = &valp[len];
-            key_val = calloc(1, len + 1);
-
-            /* increment the next pointer past the terminating semicolon */
-            if (*next == ';')
-                ++next;
-
-            namep = HDstrncpy(key_val, valp, len);
-
-            /* pass up any beginning whitespaces */
-            while (*namep && (*namep == ' ' || *namep == '\t'))
-                namep++;
-
-            /* eat up any ending white spaces */
-            endp = &namep[strlen(namep) - 1];
-
-            while (endp && (*endp == ' ' || *endp == '\t'))
-                *endp-- = '\0';
-
-            /* find the '=' */
-
-            valp = HDstrchr(namep, '=');
-
-            if (valp != NULL) {     /* it's a valid key/value pairing */
-                char *tmp_val = valp + 1;
-
-                /* change '=' to \0, move valp down one */
-                *valp-- = '\0';
-
-                /* eat up ending whitespace on the "key" part */
-                while (*valp == ' ' || *valp == '\t')
-                    *valp-- = '\0';
-
-                valp = tmp_val;
-
-                /* eat up beginning whitespace on the "value" part */
-                while (*valp == ' ' || *valp == '\t')
-                    *valp++ = '\0';
-
-                /* actually set the darned thing */
-                if (MPI_SUCCESS != MPI_Info_set(h5_io_info_g, namep, valp)) {
-                    printf("MPI_Info_set failed\n");
-                    ret_value = -1;
-                }
-            }
-
-            valp = next;
-            HDfree(key_val);
-        } while (next && *next);
-
-        HDfree(envp);
-    }
-
-    return ret_value;
-}
-
-
-void
-h5_dump_info_object(MPI_Info info)
-{
-    char	key[MPI_MAX_INFO_KEY+1];
-    char	value[MPI_MAX_INFO_VAL+1];
-    int  	flag;
-    int		i, nkeys;
-
-    printf("Dumping MPI Info Object(%d) (up to %d bytes per item):\n", (int)info,
-	MPI_MAX_INFO_VAL);
-    if (info==MPI_INFO_NULL){
-	printf("object is MPI_INFO_NULL\n");
-    }
-    else {
-	MPI_Info_get_nkeys(info, &nkeys);
-	printf("object has %d items\n", nkeys);
-	for (i=0; i<nkeys; i++){
-	    MPI_Info_get_nthkey(info, i, key);
-	    MPI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
-	    printf("%s=%s\n", key, value);
-	}
-
-    }
-}
diff --git a/tools/perform/pio_standalone.h b/tools/perform/pio_standalone.h
deleted file mode 100644
index 762a564..0000000
--- a/tools/perform/pio_standalone.h
+++ /dev/null
@@ -1,157 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef PIO_STANDALONE_H__
-#define PIO_PERF_H__
-
-/* Header file for building h5perf by standalone mode.
- * Created: Christian Chilan, 2005/5/18.
- */
-
-/** From H5private.h **/
-
-#include "H5public.h"    /* Include Public Definitions    */
-
-
-/*
- * Include ANSI-C header files.
- */
-#ifdef H5_STDC_HEADERS
-#   include <assert.h>
-#   include <ctype.h>
-#   include <errno.h>
-#   include <fcntl.h>
-#   include <float.h>
-#   include <limits.h>
-#   include <math.h>
-#   include <signal.h>
-#   include <stdarg.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#   include <string.h>
-#endif
-
-/*
- * And now for a couple non-Posix functions...  Watch out for systems that
- * define these in terms of macros.
- */
-#ifdef H5_HAVE_WIN32_API
-#define HDstrdup(S)       _strdup(S)
-#else /* H5_HAVE_WIN32_API */
-
-#if !defined strdup && !defined H5_HAVE_STRDUP
-extern char *strdup(const char *s);
-#endif
-
-#define HDstrdup(S)      strdup(S)
-
-#endif /* H5_HAVE_WIN32_API */
-
-H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
-#define HDstrcmp(S,T)    strcmp(S,T)
-#define HDstrlen(S)    strlen(S)
-#define HDstrncmp(S,T,L)  strncmp(S,T,L)
-#define HDstrncpy(X,Y,Z)  strncpy(X,Y,Z)
-#define HDstrchr(S,C)    strchr(S,C)
-#define HDfree(M)    free(M)
-
-
-#ifdef _O_BINARY
-#define HDopen(S,F,M)    open(S,F|_O_BINARY,M)
-#else
-#define HDopen(S,F,M)    open(S,F,M)
-#endif
-#define HDclose(F)    close(F)
-
-#ifdef H5_HAVE_WIN32_API
-#define HDlseek(F,O,W)    _lseeki64(F,O,W)
-#else
-#define HDlseek(F,O,W)    lseek(F,O,W)
-#endif
-
-#define HDwrite(F,M,Z)    write(F,M,Z)
-
-#define HDread(F,M,Z)    read(F,M,Z)
-
-#ifdef H5_HAVE_WIN32_API
-     #define HDstat(S,B)  _stati64(S,B)
-#else
-#define HDstat(S,B)  stat(S,B)
-#endif
-
-#ifdef H5_HAVE_WIN32_API
-#define HDfstat(F,B)    _fstati64(F,B)
-typedef struct _stati64    h5_stat_t;
-typedef __int64              h5_stat_size_t;
-#else
-#define HDfstat(F,B)            fstat(F,B)
-typedef struct stat    h5_stat_t;
-typedef off_t                   h5_stat_size_t;
-#endif
-
-/*
- * HDF Boolean type.
- */
-#ifndef FALSE
-#   define FALSE false
-#endif
-#ifndef TRUE
-#   define TRUE true
-#endif
-
-
-/** From h5test.h **/
-
-#ifdef H5_HAVE_PARALLEL
-extern MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-H5TEST_DLL int h5_set_info_object(void);
-H5TEST_DLL void h5_dump_info_object(MPI_Info info);
-#endif
-
-
-
-/** From h5tools_utils.h **/
-
-extern int         opt_err;     /* getoption prints errors if this is on    */
-extern int         opt_ind;     /* token pointer                            */
-extern const char *opt_arg;     /* flag argument (or value)                 */
-
-
-enum {
-    no_arg = 0,         /* doesn't take an argument     */
-    require_arg,        /* requires an argument          */
-    optional_arg        /* argument is optional         */
-};
-
-
-typedef struct long_options {
-    const char  *name;          /* name of the long option              */
-    int          has_arg;       /* whether we should look for an arg    */
-    char         shortval;      /* the shortname equivalent of long arg
-                                 * this gets returned from get_option   */
-} long_options;
-
-extern int    get_option(int argc, const char **argv, const char *opt,
-                         const struct long_options *l_opt);
-
-extern int     nCols;               /*max number of columns for outputting  */
-
-/* Definitions of useful routines */
-extern void     print_version(const char *progname);
-
-#endif
diff --git a/tools/perform/sio_engine.c b/tools/perform/sio_engine.c
deleted file mode 100644
index 505b0f7..0000000
--- a/tools/perform/sio_engine.c
+++ /dev/null
@@ -1,1315 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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: Christian Chilan, April 2008
- */
-
-#include "hdf5.h"
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#include "sio_perf.h"
-
-/* Macro definitions */
-
-/* sizes of various items. these sizes won't change during program execution */
-#define ELMT_H5_TYPE        H5T_NATIVE_UCHAR
-
-#define GOTOERROR(errcode)  { ret_code = errcode; goto done; }
-#define ERRMSG(mesg) {                                                  \
-    fprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n",    \
-        mesg, (int)__LINE__, __FILE__);                             \
-}
-
-/* verify: if val is false (0), print mesg. */
-#define VRFY(val, mesg) do {                            \
-    if (!val) {                                         \
-    ERRMSG(mesg);                                   \
-    GOTOERROR(FAIL);                                \
-    }                                                   \
-} while(0)
-
-/* POSIX I/O macros */
-#define POSIXCREATE(fn)           HDopen(fn, O_CREAT|O_TRUNC|O_RDWR, 0600)
-#define POSIXOPEN(fn, F)          HDopen(fn, F, 0600)
-#define POSIXCLOSE(F)             HDclose(F)
-#define POSIXSEEK(F,L)            HDlseek(F, L, SEEK_SET)
-#define POSIXWRITE(F,B,S)         HDwrite(F,B,S)
-#define POSIXREAD(F,B,S)          HDread(F,B,S)
-
-enum {
-    SIO_CREATE = 1,
-    SIO_WRITE = 2,
-    SIO_READ = 4
-};
-
-/* Global variables */
-static int  clean_file_g = -1;  /*whether to cleanup temporary test     */
-/*files. -1 is not defined;             */
-/*0 is no cleanup; 1 is do cleanup      */
-
-/* the different types of file descriptors we can expect */
-typedef union _file_descr {
-    int         posixfd;    /* POSIX file handle*/
-    hid_t       h5fd;       /* HDF5 file        */
-} file_descr;
-
-/* local functions */
-static char  *sio_create_filename(iotype iot, const char *base_name,
-    char *fullname, size_t size, parameters *param);
-static herr_t do_write(results *res, file_descr *fd, parameters *parms, void *buffer);
-static herr_t do_read(results *res, file_descr *fd, parameters *parms, void *buffer);
-static herr_t dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t dset_read(int localrank, file_descr *fd, parameters *parms, void *buffer, const char *buffer2);
-static herr_t posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/,
-    int flags);
-hid_t set_vfd(parameters *param);
-static herr_t do_fclose(iotype iot, file_descr *fd);
-static void do_cleanupfile(iotype iot, char *fname);
-
-/* global variables */
-static off_t offset[MAX_DIMS];       /* dataset size in bytes     */
-static size_t buf_offset[MAX_DIMS];   /* dataset size in bytes     */
-static int order[MAX_DIMS];        /* dimension access order */
-static size_t      linear_buf_size;        /* linear buffer size     */
-static int         cont_dim;       /* lowest dimension for contiguous POSIX
-                                      access */
-static size_t      cont_size;      /* size of contiguous POSIX access */
-static hid_t       fapl;           /* file access list */
-static unsigned char *buf_p;       /* buffer pointer */
-static const char *multi_letters = "msbrglo"; /* string for multi driver */
-
-/* HDF5 global variables */
-static hsize_t     h5count[MAX_DIMS];      /*selection count               */
-static hssize_t    h5offset[MAX_DIMS];     /* Selection offset within dataspace */
-static hid_t       h5dset_space_id = -1;   /*dataset space ID              */
-static hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
-static hid_t       h5ds_id = -1;           /*dataset handle                */
-static hid_t       h5dcpl = -1;            /* Dataset creation property list */
-static hid_t       h5dxpl = -1;            /* Dataset transfer property list */
-
-/*
- * Function:        do_sio
- * Purpose:         SIO Engine where IO are executed.
- * Return:          results
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-    results
-do_sio(parameters param)
-{
-    char       *buffer = NULL; /*data buffer pointer           */
-    size_t      buf_size[MAX_DIMS];     /* general buffer size in bytes     */
-    file_descr  fd;                     /* file handles */
-    iotype      iot;                    /* API type */
-    char base_name[256];                /* test file base name */
-    /* return codes */
-    herr_t      ret_code = 0;   /*return code                           */
-    results     res;
-
-    char        fname[FILENAME_MAX];    /* test file name */
-    int     i;
-    /* HDF5 variables */
-    herr_t          hrc;        /*HDF5 return code              */
-
-    /* Sanity check parameters */
-
-    /* IO type */
-    iot = param.io_type;
-
-    switch (iot) {
-    case POSIXIO:
-        fd.posixfd = -1;
-        res.timers = io_time_new(SYS_CLOCK);
-        break;
-    case HDF5:
-        fd.h5fd = -1;
-        res.timers = io_time_new(SYS_CLOCK);
-        break;
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
-        GOTOERROR(FAIL);
-    }
-
-    linear_buf_size = 1;
-
-    for (i=0; i<param.rank; i++){
-        buf_size[i] = param.buf_size[i];
-        order[i] = param.order[i];
-        linear_buf_size *= buf_size[i];
-        buf_offset[i] = 0;
-        offset[i] = 0;
-
-        /* Validate transfer buffer size */
-        if (param.buf_size[i]<=0) {
-            HDfprintf(stderr,
-            "Transfer buffer size[%d] (%zu) must be > 0\n", i,buf_size[i]);
-            GOTOERROR(FAIL);
-        }
-
-        if ((param.dset_size[i]%param.buf_size[i])!=0) {
-            HDfprintf(stderr,
-            "Dataset size[%d] (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
-            "trasfer buffer size[%d] (%zu)\n",param.rank,
-            (long long)param.dset_size[i], param.rank, param.buf_size[i]);
-            GOTOERROR(FAIL);
-        }
-
-    }
-
-    /* Allocate transfer buffer */
-    if ((buffer = (char *)malloc(linear_buf_size)) == NULL){
-        HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n", linear_buf_size);
-        GOTOERROR(FAIL);
-    }
-
-    if (sio_debug_level >= 4)
-
-    /* output all of the times for all iterations */
-        fprintf(output, "Timer details:\n");
-
-    /*
-     * Write performance measurement
-     */
-    /* Open file for write */
-
-    HDstrcpy(base_name, "#sio_tmp");
-    sio_create_filename(iot, base_name, fname, sizeof(fname), &param);
-
-    if (sio_debug_level > 0)
-        HDfprintf(output, "data filename=%s\n",
-             fname);
-
-    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
-    hrc = do_fopen(&param, fname, &fd, SIO_CREATE | SIO_WRITE);
-    VRFY((hrc == SUCCESS), "do_fopen failed");
-
-    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
-    hrc = do_write(&res, &fd, &param, buffer);
-    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
-    VRFY((hrc == SUCCESS), "do_write failed");
-
-    /* Close file for write */
-    hrc = do_fclose(iot, &fd);
-    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
-    VRFY((hrc == SUCCESS), "do_fclose failed");
-
-    if (!param.h5_write_only) {
-        /*
-         * Read performance measurement
-         */
-
-        /* Open file for read */
-        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
-        hrc = do_fopen(&param, fname, &fd, SIO_READ);
-        VRFY((hrc == SUCCESS), "do_fopen failed");
-
-        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
-        hrc = do_read(&res, &fd, &param, buffer);
-        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
-        VRFY((hrc == SUCCESS), "do_read failed");
-
-        /* Close file for read */
-        hrc = do_fclose(iot, &fd);
-
-        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
-        VRFY((hrc == SUCCESS), "do_fclose failed");
-    }
-
-    do_cleanupfile(iot, fname);
-
-done:
-    /* clean up */
-    /* release HDF5 objects */
-
-    /* close any opened files */
-    /* no remove(fname) because that should have happened normally. */
-    switch (iot) {
-        case POSIXIO:
-            if (fd.posixfd != -1)
-                hrc = do_fclose(iot, &fd);
-            break;
-        case HDF5:
-            if (fd.h5fd != -1)
-                hrc = do_fclose(iot, &fd);
-			break;
-        default:
-            /* unknown request */
-            HDassert(0 && "Unknown IO type");
-            break;
-    }
-
-    /* release generic resources */
-    if (buffer)
-        free(buffer);
-
-    res.ret_code = ret_code;
-    return res;
-}
-
-/*
- * Function:    sio_create_filename
- * Purpose:     Create a new filename to write to. Determine the correct
- *              suffix to append to the filename by the type of I/O we're
- *              doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
- *              USER or LOGIN are specified in the environment.
- * Return:      Pointer to filename or NULL
- * Programmer:  Bill Wendling, 21. November 2001
- * Modifications: Support for file drivers. Christian Chilan, April, 2008
- */
-    static char *
-sio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size, parameters *param)
-{
-    const char *prefix, *suffix="";
-    char *ptr, last = '\0';
-    size_t i, j;
-    vfdtype vfd;
-    vfd = param->vfd;
-
-    if (!base_name || !fullname || size < 1)
-    return NULL;
-
-    memset(fullname, 0, size);
-
-    switch (iot) {
-    case POSIXIO:
-        suffix = ".posix";
-        break;
-    case HDF5:
-        suffix = ".h5";
-        if (vfd == family)
-            suffix = "%05d.h5";
-        else if (vfd == multi)
-            suffix = NULL;
-        break;
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
-        HDassert(0 && "Unknown IO type");
-        break;
-    }
-
-    /* First use the environment variable and then try the constant */
-    prefix = HDgetenv("HDF5_PREFIX");
-
-#ifdef HDF5_PREFIX
-    if (!prefix)
-    prefix = HDF5_PREFIX;
-#endif  /* HDF5_PREFIX */
-
-    /* Prepend the prefix value to the base name */
-    if (prefix && *prefix) {
-    /* If the prefix specifies the HDF5_PREFIX directory, then
-     * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
-     * directory instead. */
-    register char *user, *login, *subdir;
-
-    user = HDgetenv("USER");
-    login = HDgetenv("LOGIN");
-    subdir = (user ? user : login);
-
-    if (subdir) {
-        for (i = 0; i < size-1 && prefix[i]; i++)
-        fullname[i] = prefix[i];
-
-        fullname[i++] = '/';
-
-        for (j = 0; i < size && subdir[j]; i++, j++)
-        fullname[i] = subdir[j];
-    } else {
-        /* We didn't append the prefix yet */
-        HDstrncpy(fullname, prefix, size);
-        fullname[size - 1] = '\0';
-    }
-
-    if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
-        /* Append the base_name with a slash first. Multiple slashes are
-         * handled below. */
-        h5_stat_t buf;
-
-        if (HDstat(fullname, &buf) < 0)
-        /* The directory doesn't exist just yet */
-        if (HDmkdir(fullname, 0755) < 0 && errno != EEXIST) {
-            /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
-             * Default to PREFIX's original prefix value. */
-            HDstrcpy(fullname, prefix);
-        }
-
-        HDstrcat(fullname, "/");
-        HDstrcat(fullname, base_name);
-    } else {
-        /* Buffer is too small */
-        return NULL;
-    }
-    } else if (strlen(base_name) >= size) {
-    /* Buffer is too small */
-        return NULL;
-    } else {
-        HDstrcpy(fullname, base_name);
-    }
-
-    /* Append a suffix */
-    if (suffix) {
-        if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
-            return NULL;
-
-        HDstrcat(fullname, suffix);
-    }
-
-    /* Remove any double slashes in the filename */
-    for (ptr = fullname, i = j = 0; ptr && (i < size); i++, ptr++) {
-        if (*ptr != '/' || last != '/')
-            fullname[j++] = *ptr;
-
-        last = *ptr;
-    }
-
-    return fullname;
-}
-
-/*
- * Function:        do_write
- * Purpose:         Write the required amount of data to the file.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-static herr_t
-do_write(results *res, file_descr *fd, parameters *parms, void *buffer)
-{
-    int         ret_code = SUCCESS;
-    char        dname[64];
-    long        i;
-    /* HDF5 variables */
-    herr_t      hrc;                    /*HDF5 return code              */
-    hsize_t     h5dims[MAX_DIMS];       /*dataset dim sizes             */
-    hsize_t     h5chunk[MAX_DIMS];      /*dataset dim sizes             */
-    hsize_t     h5block[MAX_DIMS];      /*dataspace selection           */
-    hsize_t     h5stride[MAX_DIMS];     /*selection stride              */
-    hsize_t     h5start[MAX_DIMS];      /*selection start               */
-    hsize_t     h5maxdims[MAX_DIMS];
-    int         rank;                   /*rank of dataset */
-        /* Prepare buffer for verifying data */
-/*    if (parms->verify)
-            memset(buffer,1,linear_buf_size); */
-
-    buf_p=(unsigned char *)buffer;
-
-    for (i=0; i < linear_buf_size; i++)
-        buf_p[i]=i%128;
-
-    rank = parms->rank;
-
-    for (i=0; i<rank; i++) {
-        h5offset[i] = offset[i] = 0;
-    }
-
-    /* I/O Access specific setup */
-    switch (parms->io_type) {
-    case POSIXIO:
-
-            /* determine lowest dimension for contiguous POSIX access */
-            cont_dim = rank;
-
-            for (i=rank-1; i>=0; i--) {
-                if (parms->buf_size[i]==parms->dset_size[i])
-                    cont_dim = i;
-                else
-                    break;
-            }
-
-            /* determine size of the contiguous POSIX access */
-            cont_size = (!cont_dim)? 1 : parms->buf_size[cont_dim-1];
-            for (i=cont_dim; i<rank; i++)
-                cont_size *= parms->buf_size[i];
-
-        break;
-
-    case HDF5: /* HDF5 setup */
-
-        for (i=0; i < rank; i++){
-            h5dims[i] = parms->dset_size[i];
-            h5start[i] = 0;
-            h5stride[i] = 1;
-            h5block[i] = 1;
-            h5count[i] = parms->buf_size[i];
-            h5chunk[i] = parms->chk_size[i];
-            h5maxdims[i] = H5S_UNLIMITED;
-
-        }
-
-        if (parms->h5_use_chunks && parms->h5_extendable) {
-            h5dset_space_id = H5Screate_simple(rank, h5count, h5maxdims);
-            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-        }
-        else {
-            h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
-            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-        }
-
-        hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                    h5start, h5stride, h5count, h5block);
-        VRFY((hrc >= 0), "H5Sselect_hyperslab");
-
-        /* Create the memory dataspace that corresponds to the xfer buffer */
-        h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
-        VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-
-        /* Create the dataset transfer property list */
-        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
-        if (h5dxpl < 0) {
-            fprintf(stderr, "HDF5 Property List Create failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        break;
-
-    default:
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-        GOTOERROR(FAIL);
-        break;
-    } /* end switch */
-
-
-    /* create dataset */
-    switch (parms->io_type) {
-        case POSIXIO:
-        break;
-
-        case HDF5:
-            h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
-
-        if (h5dcpl < 0) {
-            fprintf(stderr, "HDF5 Property List Create failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        if(parms->h5_use_chunks) {
-        /* Set the chunk size to be the same as the buffer size */
-            hrc = H5Pset_chunk(h5dcpl, rank, h5chunk);
-            if (hrc < 0) {
-                fprintf(stderr, "HDF5 Property List Set failed\n");
-                GOTOERROR(FAIL);
-            } /* end if */
-        } /* end if */
-
-        sprintf(dname, "Dataset_%ld", (unsigned long)parms->num_bytes);
-        h5ds_id = H5Dcreate2(fd->h5fd, dname, ELMT_H5_TYPE,
-            h5dset_space_id, H5P_DEFAULT, h5dcpl, H5P_DEFAULT);
-
-        if (h5ds_id < 0) {
-            HDfprintf(stderr, "HDF5 Dataset Create failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        hrc = H5Pclose(h5dcpl);
-        /* verifying the close of the dcpl */
-        if (hrc < 0) {
-            HDfprintf(stderr, "HDF5 Property List Close failed\n");
-            GOTOERROR(FAIL);
-        }
-        break;
-
-        default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-        GOTOERROR(FAIL);
-        break;
-    }
-
-    /* Start "raw data" write timer */
-    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
-
-    /* Perform write */
-    hrc = dset_write(rank-1, fd, parms, buffer);
-
-    if (hrc < 0) {
-        fprintf(stderr, "Error in dataset write\n");
-        GOTOERROR(FAIL);
-    }
-
-
-    /* Stop "raw data" write timer */
-    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
-
-    /* Calculate write time */
-
-    /* Close dataset. Only HDF5 needs to do an explicit close. */
-    if (parms->io_type == HDF5) {
-        hrc = H5Dclose(h5ds_id);
-
-        if (hrc < 0) {
-            fprintf(stderr, "HDF5 Dataset Close failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        h5ds_id = -1;
-    } /* end if */
-
-done:
-
-    /* release HDF5 objects */
-    if (h5dset_space_id != -1) {
-        hrc = H5Sclose(h5dset_space_id);
-        if (hrc < 0){
-            fprintf(stderr, "HDF5 Dataset Space Close failed\n");
-            ret_code = FAIL;
-        } else {
-            h5dset_space_id = -1;
-        }
-    }
-
-    if (h5mem_space_id != -1) {
-        hrc = H5Sclose(h5mem_space_id);
-        if (hrc < 0) {
-            fprintf(stderr, "HDF5 Memory Space Close failed\n");
-            ret_code = FAIL;
-        } else {
-            h5mem_space_id = -1;
-        }
-    }
-
-    if (h5dxpl != -1) {
-        hrc = H5Pclose(h5dxpl);
-        if (hrc < 0) {
-            fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
-            ret_code = FAIL;
-        } else {
-            h5dxpl = -1;
-        }
-    }
-
-    return ret_code;
-}
-
-/*
- * Function:        dset_write
- * Purpose:         Write buffer into the dataset.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
-    int cur_dim = order[local_dim]-1;
-    int         ret_code = SUCCESS;
-    int         k;
-    hsize_t  dims[MAX_DIMS], maxdims[MAX_DIMS];
-    long i,j;
-    herr_t hrc;
-
-    /* iterates according to the dimensions in order array */
-    for (i=0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]){
-
-        h5offset[cur_dim] = offset[cur_dim] = i;
-
-        if (local_dim > 0){
-
-            dset_write(local_dim-1, fd, parms, buffer);
-
-        }else{
-
-            switch (parms->io_type) {
-
-            case POSIXIO:
-                /* initialize POSIX offset in the buffer */
-                for (j=0; j < parms->rank; j++) {
-                    buf_offset[j]=0;
-                }
-                buf_p = (unsigned char *)buffer;
-                /* write POSIX buffer */
-                posix_buffer_write(0, fd, parms, buffer);
-                break;
-
-            case HDF5:
-                /* if dimensions are extendable, extend them as needed during
-                access */
-                if (parms->h5_use_chunks && parms->h5_extendable) {
-
-                    hrc=H5Sget_simple_extent_dims(h5dset_space_id,dims,maxdims);
-                    VRFY((hrc >= 0), "H5Sget_simple_extent_dims");
-
-                    for (k=0; k < parms->rank; k++){
-
-                        if (dims[k] <= h5offset[k]) {
-                            dims[k] = dims[k]+h5count[k];
-                            hrc=H5Sset_extent_simple(h5dset_space_id,parms->rank,dims,maxdims);
-                            VRFY((hrc >= 0), "H5Sset_extent_simple");
-                            hrc=H5Dset_extent(h5ds_id,dims);
-                            VRFY((hrc >= 0), "H5Dextend");
-                        }
-                    }
-                }
-                /* applies offset */
-                hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-                VRFY((hrc >= 0), "H5Soffset_simple");
-
-                /* Write the buffer out */
-                hrc=H5Sget_simple_extent_dims(h5dset_space_id,dims,maxdims);
-                hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                    h5dset_space_id, h5dxpl, buffer);
-                VRFY((hrc >= 0), "H5Dwrite");
-
-                break;
-				
-            default:
-                /* unknown request */
-                HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-                HDassert(0 && "Unknown IO type");
-                break;
-            } /* switch (parms->io_type) */
-        }
-    }
-done:
-    return ret_code;
-}
-
-/*
- * Function:        posix_buffer_write
- * Purpose:         Write buffer into the POSIX file considering contiguity.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
-    int dtype_size = 1;
-    int         ret_code = SUCCESS;
-    long i;
-    size_t d_offset;
-    size_t linear_dset_offset = 0;
-    int j, rc;
-
-    /* if dimension is not contiguous, call recursively */
-    if (local_dim < parms->rank-1 && local_dim != cont_dim) {
-
-        for (i=0; i < parms->buf_size[local_dim]; i += dtype_size) {
-            buf_offset[local_dim] = i;
-            posix_buffer_write(local_dim+1, fd, parms, buffer);
-
-            /* if next dimension is cont_dim, it will fill out the buffer
-               traversing the entire dimension local_dim without the need
-               of performing iteration */
-            if (local_dim+1==cont_dim)
-                break;
-        }
-    /* otherwise, perform contiguous POSIX access */
-    } else {
-
-        buf_offset[local_dim] = 0;
-
-        /* determine offset in the buffer */
-        for (i=0; i < parms->rank; i++){
-            d_offset=1;
-
-            for (j=i+1; j < parms->rank; j++)
-                d_offset *= parms->dset_size[j];
-
-            linear_dset_offset += (offset[i]+buf_offset[i])*d_offset;
-        }
-
-        /* only care if seek returns error */
-        rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
-        VRFY((rc==0), "POSIXSEEK");
-        /* check if all bytes are written */
-        rc = ((ssize_t)cont_size ==
-             POSIXWRITE(fd->posixfd, buf_p, cont_size));
-        VRFY((rc != 0), "POSIXWRITE");
-
-        /* Advance location in buffer */
-        buf_p += cont_size;
-
-    }
-done:
-    return ret_code;
-}
-
-/*
- * Function:        do_read
- * Purpose:         Read the required amount of data to the file.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-static herr_t
-do_read(results *res, file_descr *fd, parameters *parms, void *buffer)
-{
-    char        *buffer2 = NULL;       /* Buffer for data verification */
-    int         ret_code = SUCCESS;
-    char        dname[64];
-    long        i;
-    /* HDF5 variables */
-    herr_t      hrc;                    /*HDF5 return code              */
-    hsize_t     h5dims[MAX_DIMS];       /*dataset dim sizes             */
-    hsize_t     h5block[MAX_DIMS];      /*dataspace selection           */
-    hsize_t     h5stride[MAX_DIMS];     /*selection stride              */
-    hsize_t     h5start[MAX_DIMS];      /*selection start               */
-    int         rank;
-
-    /* Allocate data verification buffer */
-    if(NULL == (buffer2 = (char *)malloc(linear_buf_size))) {
-        HDfprintf(stderr, "malloc for data verification buffer size (%Zu) failed\n", linear_buf_size);
-        GOTOERROR(FAIL);
-    } /* end if */
-
-    /* Prepare buffer for verifying data */
-    for(i = 0; i < linear_buf_size; i++)
-        buffer2[i] = i % 128;
-
-    rank = parms->rank;
-    for(i = 0; i < rank; i++)
-        h5offset[i] = offset[i] = 0;
-
-    /* I/O Access specific setup */
-    switch (parms->io_type) {
-    case POSIXIO:
-            cont_dim = rank;
-
-            for (i=rank-1; i>=0; i--) {
-                if (parms->buf_size[i]==parms->dset_size[i])
-                    cont_dim = i;
-                else
-                    break;
-            }
-            cont_size = (!cont_dim)? 1 : parms->buf_size[cont_dim-1];
-            for (i=cont_dim; i<rank; i++)
-                cont_size *= parms->buf_size[i];
-
-        break;
-
-    case HDF5: /* HDF5 setup */
-        for (i=0; i < rank; i++){
-            h5dims[i] = parms->dset_size[i];
-            h5start[i] = 0;
-            h5stride[i] = 1;
-            h5block[i] = 1;
-            h5count[i] = parms->buf_size[i];
-        }
-
-        h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
-        VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
-        hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
-                    h5start, h5stride, h5count, h5block);
-        VRFY((hrc >= 0), "H5Sselect_hyperslab");
-
-        /* Create the memory dataspace that corresponds to the xfer buffer */
-        h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
-        VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-
-        /* Create the dataset transfer property list */
-        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
-        if (h5dxpl < 0) {
-            fprintf(stderr, "HDF5 Property List Create failed\n");
-            GOTOERROR(FAIL);
-        }
-        break;
-
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-        GOTOERROR(FAIL);
-        break;
-    } /* end switch */
-
-
-    /* create dataset */
-    switch (parms->io_type) {
-        case POSIXIO:
-        break;
-
-        case HDF5:
-        sprintf(dname, "Dataset_%ld", (long)parms->num_bytes);
-        h5ds_id = H5Dopen2(fd->h5fd, dname, H5P_DEFAULT);
-        if (h5ds_id < 0) {
-            HDfprintf(stderr, "HDF5 Dataset open failed\n");
-            GOTOERROR(FAIL);
-        }
-        break;
-		
-        default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-        GOTOERROR(FAIL);
-        break;
-    } /* end switch */
-
-    /* Start "raw data" read timer */
-    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
-    hrc = dset_read(rank-1, fd, parms, buffer, buffer2);
-
-    if (hrc < 0) {
-        fprintf(stderr, "Error in dataset read\n");
-        GOTOERROR(FAIL);
-    }
-
-    /* Stop "raw data" read timer */
-    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
-
-    /* Calculate read time */
-
-    /* Close dataset. Only HDF5 needs to do an explicit close. */
-    if (parms->io_type == HDF5) {
-        hrc = H5Dclose(h5ds_id);
-
-        if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        h5ds_id = -1;
-    } /* end if */
-
-done:
-
-    /* release HDF5 objects */
-    if (h5dset_space_id != -1) {
-    hrc = H5Sclose(h5dset_space_id);
-    if (hrc < 0){
-        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dset_space_id = -1;
-    }
-    }
-
-    if (h5mem_space_id != -1) {
-    hrc = H5Sclose(h5mem_space_id);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Memory Space Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5mem_space_id = -1;
-    }
-    }
-
-    if (h5dxpl != -1) {
-    hrc = H5Pclose(h5dxpl);
-    if (hrc < 0) {
-        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
-        ret_code = FAIL;
-    } else {
-        h5dxpl = -1;
-    }
-    }
-
-    /* release generic resources */
-    if(buffer2)
-        free(buffer2);
-
-    return ret_code;
-}
-
-/*
- * Function:        dset_read
- * Purpose:         Read buffer into the dataset.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t dset_read(int local_dim, file_descr *fd, parameters *parms,
-    void *buffer, const char *buffer2)
-{
-    int cur_dim = order[local_dim]-1;
-    int         ret_code = SUCCESS;
-    long i,j;
-    herr_t hrc;
-
-    /* iterate on the current dimension */
-    for (i=0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]){
-
-        h5offset[cur_dim] = offset[cur_dim] = i;
-
-        /* if traverse in order array is incomplete, recurse */
-        if (local_dim > 0){
-
-            ret_code = dset_read(local_dim-1, fd, parms, buffer, buffer2);
-
-        /* otherwise, write buffer into dataset */
-        }else{
-
-            switch (parms->io_type) {
-
-            case POSIXIO:
-                for (j=0; j<parms->rank; j++) {
-                   buf_offset[j] = 0;
-                }
-                buf_p = (unsigned char*)buffer;
-                posix_buffer_read(0, fd, parms, buffer);
-                break;
-
-            case HDF5:
-                hrc = H5Soffset_simple(h5dset_space_id, h5offset);
-                VRFY((hrc >= 0), "H5Soffset_simple");
-                /* Read the buffer out */
-                hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
-                    h5dset_space_id, h5dxpl, buffer);
-                VRFY((hrc >= 0), "H5Dread");
-#if 0
-                for (j=0; j<linear_buf_size; j++) {
-                     buf_p = (unsigned char*)buffer;
-                     if (buf_p[j]!=buffer2[j])
-                        printf("Inconsistent data in %d\n", j);
-                }
-#endif
-                break;
-				
-            default:
-                /* unknown request */
-                HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
-                HDassert(0 && "Unknown IO type");
-                break;
-            } /* switch (parms->io_type) */
-        }
-    }
-done:
-    return ret_code;
-}
-
-/*
- * Function:        posix_buffer_read
- * Purpose:         Read buffer into the POSIX file considering contiguity.
- * Return:          SUCCESS or FAIL
- * Programmer:      Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
-    int dtype_size = 1;
-    int         ret_code = SUCCESS;
-    long i;
-    size_t d_offset;
-    size_t linear_dset_offset = 0;
-    int j, rc;
-
-    /* if local dimension is not contiguous, recurse */
-    if (local_dim < parms->rank-1 && local_dim != cont_dim) {
-
-        for (i=0; i < parms->buf_size[local_dim]; i += dtype_size) {
-            buf_offset[local_dim] = i;
-            ret_code = posix_buffer_read(local_dim+1, fd, parms, buffer);
-            if (local_dim+1==cont_dim)
-                break;
-        }
-    /* otherwise, perform contiguous POSIX access */
-    } else {
-
-        buf_offset[local_dim] = 0;
-        /* determine offset in buffer */
-        for (i=0; i<parms->rank; i++){
-            d_offset=1;
-
-            for (j=i+1; j<parms->rank; j++)
-                d_offset *= parms->dset_size[j];
-
-            linear_dset_offset += (offset[i]+buf_offset[i])*d_offset;
-        }
-
-        /* only care if seek returns error */
-        rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
-        VRFY((rc==0), "POSIXSEEK");
-        /* check if all bytes are read */
-        rc = ((ssize_t)cont_size ==
-             POSIXREAD(fd->posixfd, buf_p, cont_size));
-        VRFY((rc != 0), "POSIXREAD");
-
-        /* Advance location in buffer */
-        buf_p += cont_size;
-
-    }
-done:
-    return ret_code;
-}
-
-
-/*
- * Function:    do_fopen
- * Purpose:     Open the specified file.
- * Return:      SUCCESS or FAIL
- * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications: Support for file drivers, Christian Chilan, April, 2008
- */
-    static herr_t
-do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
-{
-    int ret_code = SUCCESS;
-
-    switch (param->io_type) {
-    case POSIXIO:
-        if (flags & (SIO_CREATE | SIO_WRITE))
-            fd->posixfd = POSIXCREATE(fname);
-        else
-            fd->posixfd = POSIXOPEN(fname, O_RDONLY);
-
-        if (fd->posixfd < 0 ) {
-            HDfprintf(stderr, "POSIX File Open failed(%s)\n", fname);
-            GOTOERROR(FAIL);
-        }
-
-        break;
-
-    case HDF5:
-
-        fapl = set_vfd(param);
-
-        if (fapl < 0) {
-            fprintf(stderr, "HDF5 Property List Create failed\n");
-            GOTOERROR(FAIL);
-        }
-
-        /* create the parallel file */
-        if (flags & (SIO_CREATE | SIO_WRITE)) {
-            fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-        } else {
-            fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
-        }
-
-
-        if (fd->h5fd < 0) {
-            fprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
-            GOTOERROR(FAIL);
-        }
-        break;
-		
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)param->io_type);
-        GOTOERROR(FAIL);
-        break;
-    }
-
-done:
-    return ret_code;
-}
-
-/*
- * Function:    set_vfd
- * Purpose:     Sets file driver.
- * Return:      SUCCESS or FAIL
- * Programmer:  Christian Chilan, April, 2008
- * Modifications:
- */
-
-hid_t
-set_vfd(parameters *param)
-{
-    hid_t my_fapl = -1;
-    vfdtype  vfd;
-
-    vfd = param->vfd;
-
-    if ((my_fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1;
-
-    if (vfd == sec2) {
-        /* Unix read() and write() system calls */
-        if (H5Pset_fapl_sec2(my_fapl)<0) return -1;
-    } else if (vfd == stdio) {
-        /* Standard C fread() and fwrite() system calls */
-        if (H5Pset_fapl_stdio(my_fapl)<0) return -1;
-    } else if (vfd == core) {
-        /* In-core temporary file with 1MB increment */
-        if (H5Pset_fapl_core(my_fapl, (size_t)1024*1024, TRUE)<0) return -1;
-    } else if (vfd == split) {
-        /* Split meta data and raw data each using default driver */
-        if (H5Pset_fapl_split(my_fapl,
-                              "-m.h5", H5P_DEFAULT,
-                              "-r.h5", H5P_DEFAULT)<0)
-            return -1;
-    } else if (vfd == multi) {
-        /* Multi-file driver, general case of the split driver */
-        H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
-        hid_t memb_fapl[H5FD_MEM_NTYPES];
-        const char *memb_name[H5FD_MEM_NTYPES];
-        char sv[H5FD_MEM_NTYPES][1024];
-        haddr_t memb_addr[H5FD_MEM_NTYPES];
-        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);
-
-        HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
-        for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
-            memb_fapl[mt] = H5P_DEFAULT;
-            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
-            memb_name[mt] = sv[mt];
-            memb_addr[mt] = MAX(mt-1,0)*(HADDR_MAX/10);
-        }
-
-        if (H5Pset_fapl_multi(my_fapl, memb_map, memb_fapl, memb_name,
-                              memb_addr, FALSE)<0) {
-            return -1;
-        }
-    } else if (vfd == family) {
-        hsize_t fam_size = 1*1024*1024; /*100 MB*/
-
-        /* Family of files, each 1MB and using the default driver */
-        /* if ((val=HDstrtok(NULL, " \t\n\r")))
-            fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024); */
-        if (H5Pset_fapl_family(my_fapl, fam_size, H5P_DEFAULT)<0)
-            return -1;
-    } else if (vfd == direct) {
-#ifdef H5_HAVE_DIRECT
-        /* Linux direct read() and write() system calls.  Set memory boundary, file block size,
-         * and copy buffer size to the default values. */
-        if (H5Pset_fapl_direct(my_fapl, 1024, 4096, 8*4096)<0) return -1;
-#endif
-    } else {
-        /* Unknown driver */
-        return -1;
-    }
-
-    return my_fapl;
-}
-
-/*
- * Function:    do_fclose
- * Purpose:     Close the specified file descriptor.
- * Return:      SUCCESS or FAIL
- * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-    static herr_t
-do_fclose(iotype iot, file_descr *fd /*out*/)
-{
-    herr_t ret_code = SUCCESS, hrc;
-    int  rc = 0;
-
-    switch (iot) {
-    case POSIXIO:
-        rc = POSIXCLOSE(fd->posixfd);
-
-        if (rc != 0){
-        fprintf(stderr, "POSIX File Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        fd->posixfd = -1;
-        break;
-
-    case HDF5:
-        hrc = H5Fclose(fd->h5fd);
-
-        if (hrc < 0) {
-        fprintf(stderr, "HDF5 File Close failed\n");
-        GOTOERROR(FAIL);
-        }
-
-        fd->h5fd = -1;
-        break;
-		
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
-        GOTOERROR(FAIL);
-        break;
-    }
-
-done:
-    return ret_code;
-}
-
-
-/*
- * Function:    do_cleanupfile
- * Purpose:     Cleanup temporary file unless HDF5_NOCLEANUP is set.
- * Return:      void
- * Programmer:  Albert Cheng 2001/12/12
- * Modifications: Support for file drivers. Christian Chilan, April, 2008
- */
-    static void
-do_cleanupfile(iotype iot, char *filename)
-{
-    char        temp[2048];
-    int         j;
-    hid_t       driver;
-
-    if (clean_file_g == -1)
-    clean_file_g = (HDgetenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0;
-
-    if (clean_file_g){
-
-    switch (iot) {
-    case POSIXIO:
-          HDremove(filename);
-        break;
-
-    case HDF5:
-           driver = H5Pget_driver(fapl);
-
-            if (driver == H5FD_FAMILY) {
-                for (j = 0; /*void*/; j++) {
-                    HDsnprintf(temp, sizeof temp, filename, j);
-
-                    if (HDaccess(temp, F_OK) < 0)
-                        break;
-
-                    HDremove(temp);
-                }
-            } else if (driver == H5FD_CORE) {
-                hbool_t backing;        /* Whether the core file has backing store */
-
-                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;
-                assert(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*/
-                }
-            } else {
-                HDremove(filename);
-            }
-            H5Pclose(fapl);
-        break;
-			
-    default:
-        /* unknown request */
-        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
-        HDassert(0 && "Unknown IO type");
-        break;
-    }
-    }
-}
-
diff --git a/tools/perform/sio_perf.c b/tools/perform/sio_perf.c
deleted file mode 100644
index a69e929..0000000
--- a/tools/perform/sio_perf.c
+++ /dev/null
@@ -1,1409 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Serial HDF5 Performance Testing Code
- * --------------------------------------
- *
- * Portable code to test performance on the different platforms we support.
- * This is what the report should look like:
- *
- *  nprocs = Max#Procs
- *      IO API = POSIXIO
- *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *
- *          . . .
- *
- *
- *      IO API = HDF5
- *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
- *              Write Results = x MB/s
- *              Read Results = x MB/s
- *
- *          . . .
- *
- *
- *      . . .
- *
- */
-
-/* system header files */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "hdf5.h"
-
-
-/* our header files */
-#include "sio_perf.h"
-
-/* useful macros */
-#define TAB_SPACE           4
-
-#define ONE_KB              1024
-#define ONE_MB              (ONE_KB * ONE_KB)
-#define ONE_GB              (ONE_MB * ONE_KB)
-
-#define SIO_POSIX           0x1
-#define SIO_HDF5            0x4
-
-/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes,t) (((t)==0.0F) ? 0.0F : ((((double)bytes) / ONE_MB) / (t)))
-
-#ifndef TRUE
-#define TRUE    1
-#endif  /* TRUE */
-#ifndef FALSE
-#define FALSE   (!TRUE)
-#endif  /* FALSE */
-
-/* global variables */
-FILE       *output;             /* output file                          */
-int         sio_debug_level = 0;/* The debug level:
-                                 *   0 - Off
-                                 *   1 - Minimal
-                                 *   2 - Some more
-                                 *   3 - Maximal
-                                 *   4 - Maximal & then some
-                                 */
-
-/* local variables */
-static const char  *progname = "h5perf_serial";
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters. The long-named ones can be partially spelled. When
- * adding more, make sure that they don't clash with each other.
- */
-
-/*
- * It seems that only the options that accept additional information
- * such as dataset size (-e) require the colon next to it.
- */
-#if 1
-static const char *s_opts = "a:A:B:c:Cd:D:e:F:ghi:Imno:p:P:r:stT:v:wx:X:";
-#else
-static const char *s_opts = "a:A:bB:c:Cd:D:e:F:ghi:Imno:p:P:r:stT:wx:X:";
-#endif  /* 1 */
-static struct long_options l_opts[] = {
-    { "align", require_arg, 'a' },
-    { "alig", require_arg, 'a' },
-    { "ali", require_arg, 'a' },
-    { "al", require_arg, 'a' },
-    { "api", require_arg, 'A' },
-    { "ap", require_arg, 'A' },
-#if 0
-    /* a sighting of the elusive binary option */
-    { "binary", no_arg, 'b' },
-    { "binar", no_arg, 'b' },
-    { "bina", no_arg, 'b' },
-    { "bin", no_arg, 'b' },
-    { "bi", no_arg, 'b' },
-#endif  /* 0 */
-    { "block-size", require_arg, 'B' },
-    { "block-siz", require_arg, 'B' },
-    { "block-si", require_arg, 'B' },
-    { "block-s", require_arg, 'B' },
-    { "block-", require_arg, 'B' },
-    { "block", require_arg, 'B' },
-    { "bloc", require_arg, 'B' },
-    { "blo", require_arg, 'B' },
-    { "bl", require_arg, 'B' },
-    { "chunk", no_arg, 'c' },
-    { "chun", no_arg, 'c' },
-    { "chu", no_arg, 'c' },
-    { "ch", no_arg, 'c' },
-    { "collective", no_arg, 'C' },
-    { "collectiv", no_arg, 'C' },
-    { "collecti", no_arg, 'C' },
-    { "collect", no_arg, 'C' },
-    { "collec", no_arg, 'C' },
-    { "colle", no_arg, 'C' },
-    { "coll", no_arg, 'C' },
-    { "col", no_arg, 'C' },
-    { "co", no_arg, 'C' },
-    { "debug", require_arg, 'D' },
-    { "debu", require_arg, 'D' },
-    { "deb", require_arg, 'D' },
-    { "de", require_arg, 'D' },
-    { "file-driver", require_arg, 'v' },
-    { "file-drive", require_arg, 'v' },
-    { "file-driv", require_arg, 'v' },
-    { "file-dri", require_arg, 'v' },
-    { "file-dr", require_arg, 'v' },
-    { "file-d", require_arg, 'v' },
-    { "file-", require_arg, 'v' },
-    { "file", require_arg, 'v' },
-    { "fil", require_arg, 'v' },
-    { "fi", require_arg, 'v' },
-    { "geometry", no_arg, 'g' },
-    { "geometr", no_arg, 'g' },
-    { "geomet", no_arg, 'g' },
-    { "geome", no_arg, 'g' },
-    { "geom", no_arg, 'g' },
-    { "geo", no_arg, 'g' },
-    { "ge", no_arg, 'g' },
-    { "help", no_arg, 'h' },
-    { "hel", no_arg, 'h' },
-    { "he", no_arg, 'h' },
-    { "interleaved", require_arg, 'I' },
-    { "interleave", require_arg, 'I' },
-    { "interleav", require_arg, 'I' },
-    { "interlea", require_arg, 'I' },
-    { "interle", require_arg, 'I' },
-    { "interl", require_arg, 'I' },
-    { "inter", require_arg, 'I' },
-    { "inte", require_arg, 'I' },
-    { "int", require_arg, 'I' },
-    { "in", require_arg, 'I' },
-    { "max-num-processes", require_arg, 'P' },
-    { "max-num-processe", require_arg, 'P' },
-    { "max-num-process", require_arg, 'P' },
-    { "max-num-proces", require_arg, 'P' },
-    { "max-num-proce", require_arg, 'P' },
-    { "max-num-proc", require_arg, 'P' },
-    { "max-num-pro", require_arg, 'P' },
-    { "max-num-pr", require_arg, 'P' },
-    { "max-num-p", require_arg, 'P' },
-    { "min-num-processes", require_arg, 'p' },
-    { "min-num-processe", require_arg, 'p' },
-    { "min-num-process", require_arg, 'p' },
-    { "min-num-proces", require_arg, 'p' },
-    { "min-num-proce", require_arg, 'p' },
-    { "min-num-proc", require_arg, 'p' },
-    { "min-num-pro", require_arg, 'p' },
-    { "min-num-pr", require_arg, 'p' },
-    { "min-num-p", require_arg, 'p' },
-    { "max-xfer-size", require_arg, 'X' },
-    { "max-xfer-siz", require_arg, 'X' },
-    { "max-xfer-si", require_arg, 'X' },
-    { "max-xfer-s", require_arg, 'X' },
-    { "max-xfer", require_arg, 'X' },
-    { "max-xfe", require_arg, 'X' },
-    { "max-xf", require_arg, 'X' },
-    { "max-x", require_arg, 'X' },
-    { "min-xfer-size", require_arg, 'x' },
-    { "min-xfer-siz", require_arg, 'x' },
-    { "min-xfer-si", require_arg, 'x' },
-    { "min-xfer-s", require_arg, 'x' },
-    { "min-xfer", require_arg, 'x' },
-    { "min-xfe", require_arg, 'x' },
-    { "min-xf", require_arg, 'x' },
-    { "min-x", require_arg, 'x' },
-    { "num-bytes", require_arg, 'e' },
-    { "num-byte", require_arg, 'e' },
-    { "num-byt", require_arg, 'e' },
-    { "num-by", require_arg, 'e' },
-    { "num-b", require_arg, 'e' },
-    { "num-dsets", require_arg, 'd' },
-    { "num-dset", require_arg, 'd' },
-    { "num-dse", require_arg, 'd' },
-    { "num-ds", require_arg, 'd' },
-    { "num-d", require_arg, 'd' },
-    { "num-files", require_arg, 'F' },
-    { "num-file", require_arg, 'F' },
-    { "num-fil", require_arg, 'F' },
-    { "num-fi", require_arg, 'F' },
-    { "num-f", require_arg, 'F' },
-    { "num-iterations", require_arg, 'i' },
-    { "num-iteration", require_arg, 'i' },
-    { "num-iteratio", require_arg, 'i' },
-    { "num-iterati", require_arg, 'i' },
-    { "num-iterat", require_arg, 'i' },
-    { "num-itera", require_arg, 'i' },
-    { "num-iter", require_arg, 'i' },
-    { "num-ite", require_arg, 'i' },
-    { "num-it", require_arg, 'i' },
-    { "num-i", require_arg, 'i' },
-    { "order", require_arg, 'r' },
-    { "orde", require_arg, 'r' },
-    { "ord", require_arg, 'r' },
-    { "or", require_arg, 'r' },
-    { "output", require_arg, 'o' },
-    { "outpu", require_arg, 'o' },
-    { "outp", require_arg, 'o' },
-    { "out", require_arg, 'o' },
-    { "ou", require_arg, 'o' },
-    { "extendable", no_arg, 't' },
-    { "extendabl", no_arg, 't' },
-    { "extendab", no_arg, 't' },
-    { "extenda", no_arg, 't' },
-    { "extend", no_arg, 't' },
-    { "exten", no_arg, 't' },
-    { "exte", no_arg, 't' },
-    { "ext", no_arg, 't' },
-    { "ex", no_arg, 't' },
-    { "threshold", require_arg, 'T' },
-    { "threshol", require_arg, 'T' },
-    { "thresho", require_arg, 'T' },
-    { "thresh", require_arg, 'T' },
-    { "thres", require_arg, 'T' },
-    { "thre", require_arg, 'T' },
-    { "thr", require_arg, 'T' },
-    { "th", require_arg, 'T' },
-    { "write-only", require_arg, 'w' },
-    { "write-onl", require_arg, 'w' },
-    { "write-on", require_arg, 'w' },
-    { "write-o", require_arg, 'w' },
-    { "write", require_arg, 'w' },
-    { "writ", require_arg, 'w' },
-    { "wri", require_arg, 'w' },
-    { "wr", require_arg, 'w' },
-    { NULL, 0, '\0' }
-};
-
-struct options {
-    long io_types;              /* bitmask of which I/O types to test   */
-    const char *output_file;    /* file to print report to              */
-    long num_dsets;             /* number of datasets                   */
-    long num_files;             /* number of files                      */
-    off_t num_bpp;              /* number of bytes per proc per dset    */
-    int num_iters;              /* number of iterations                 */
-    off_t dset_size[MAX_DIMS];  /* Dataset size                           */
-    size_t buf_size[MAX_DIMS];  /* Buffer size                           */
-    size_t chk_size[MAX_DIMS];  /* Chunk size                           */
-    int order[MAX_DIMS];  /* Dimension access order                           */
-    int dset_rank;             /* Rank                   */
-    int buf_rank;             /* Rank                   */
-    int order_rank;             /* Rank                   */
-    int chk_rank;             /* Rank                   */
-    int print_times;       	/* print times as well as throughputs   */
-    int print_raw;         	/* print raw data throughput info       */
-    off_t h5_alignment;         /* alignment in HDF5 file               */
-    off_t h5_threshold;         /* threshold for alignment in HDF5 file */
-    int h5_use_chunks;     	/* Make HDF5 dataset chunked            */
-    int h5_write_only;        	/* Perform the write tests only         */
-    int h5_extendable;        	/* Perform the write tests only         */
-    int verify;        		/* Verify data correctness              */
-    vfdtype     vfd;            /* File driver */
-
-};
-
-typedef struct _minmax {
-    double min;
-    double max;
-    double sum;
-    int num;
-} minmax;
-
-/* local functions */
-static off_t parse_size_directive(const char *size);
-static struct options *parse_command_line(int argc, char *argv[]);
-static void run_test_loop(struct options *options);
-static int run_test(iotype iot, parameters parms, struct options *opts);
-static void output_all_info(minmax *mm, int count, int indent_level);
-static void get_minmax(minmax *mm, double val);
-static minmax accumulate_minmax_stuff(minmax *mm, int count);
-static void output_results(const struct options *options, const char *name,
-                           minmax *table, int table_size, off_t data_size);
-static void output_report(const char *fmt, ...);
-static void print_indent(register int indent);
-static void usage(const char *prog);
-static void report_parameters(struct options *opts);
-
-/*
- * Function:    main
- * Purpose:     Start things up.
- * Return:      EXIT_SUCCESS or EXIT_FAILURE
- * Programmer:  Bill Wendling, 30. October 2001
- * Modifications:
- */
-int
-main(int argc, char **argv)
-{
-    int exit_value = EXIT_SUCCESS;
-    struct options *opts = NULL;
-
-#ifndef STANDALONE
-    /* Initialize h5tools lib */
-    h5tools_init();
-#endif
-    
-    output = stdout;
-
-    opts = parse_command_line(argc, argv);
-
-    if (!opts) {
-        exit_value = EXIT_FAILURE;
-        goto finish;
-    }
-
-    if (opts->output_file) {
-        if ((output = HDfopen(opts->output_file, "w")) == NULL) {
-            fprintf(stderr, "%s: cannot open output file\n", progname);
-            perror(opts->output_file);
-            goto finish;
-        }
-    }
-
-    report_parameters(opts);
-
-    run_test_loop(opts);
-
-finish:
-    free(opts);
-    return exit_value;
-}
-
-/*
- * Function:    run_test_loop
- * Purpose:     Run the I/O tests. Write the results to OUTPUT.
- *
- *            - The slowest changing part of the test is the number of
- *              processors to use. For each loop iteration, we divide that
- *              number by 2 and rerun the test.
- *
- *            - The second slowest is what type of IO API to perform. We have
- *              three choices: POSIXIO, and HDF5.
- *
- *            - Then we change the size of the buffer. This information is
- *              inferred from the number of datasets to create and the number
- *              of integers to put into each dataset. The backend code figures
- *              this out.
- *
- * Return:      Nothing
- * Programmer:  Bill Wendling, 30. October 2001
- * Modifications:
- *    Added multidimensional testing (Christian Chilan, April, 2008)
- */
-static void
-run_test_loop(struct options *opts)
-{
-    parameters parms;
-    int i;
-    size_t      buf_bytes;
-    /* load options into parameter structure */
-    parms.num_files = opts->num_files;
-    parms.num_dsets = opts->num_dsets;
-    parms.num_iters = opts->num_iters;
-    parms.rank = opts->dset_rank;
-    parms.h5_align = opts->h5_alignment;
-    parms.h5_thresh = opts->h5_threshold;
-    parms.h5_use_chunks = opts->h5_use_chunks;
-    parms.h5_extendable = opts->h5_extendable;
-    parms.h5_write_only = opts->h5_write_only;
-    parms.verify = opts->verify;
-    parms.vfd = opts->vfd;
-
-    /* load multidimensional options */
-    parms.num_bytes = 1;
-    buf_bytes = 1;
-    for (i=0; i<parms.rank; i++){
-        parms.buf_size[i] = opts->buf_size[i];
-        parms.dset_size[i] = opts->dset_size[i];
-        parms.chk_size[i] = opts->chk_size[i];
-        parms.order[i] = opts->order[i];
-        parms.num_bytes *= opts->dset_size[i];
-        buf_bytes *= opts->buf_size[i];
-    }
-
-    /* print size information */
-    output_report("Transfer Buffer Size (bytes): %d\n", buf_bytes);
-    output_report("File Size(MB): %.2f\n",((double)parms.num_bytes) / ONE_MB);
-
-    print_indent(0);
-    if (opts->io_types & SIO_POSIX)
-        run_test(POSIXIO, parms, opts);
-
-    print_indent(0);
-    if (opts->io_types & SIO_HDF5)
-        run_test(HDF5, parms, opts);
-}
-
-/*
- * Function:    run_test
- * Purpose:     Inner loop call to actually run the I/O test.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 18. December 2001
- * Modifications:
- */
-static int
-run_test(iotype iot, parameters parms, struct options *opts)
-{
-    results         res;
-    register int    i, ret_value = SUCCESS;
-    off_t           raw_size;
-    minmax         *write_sys_mm_table=NULL;
-    minmax         *write_mm_table=NULL;
-    minmax         *write_gross_mm_table=NULL;
-    minmax         *write_raw_mm_table=NULL;
-    minmax         *read_sys_mm_table=NULL;
-    minmax         *read_mm_table=NULL;
-    minmax         *read_gross_mm_table=NULL;
-    minmax         *read_raw_mm_table=NULL;
-    minmax          write_sys_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          write_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          write_gross_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          write_raw_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          read_sys_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          read_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          read_gross_mm = {0.0F, 0.0F, 0.0F, 0};
-    minmax          read_raw_mm = {0.0F, 0.0F, 0.0F, 0};
-
-    raw_size = (off_t)parms.num_bytes;
-    parms.io_type = iot;
-    print_indent(2);
-    output_report("IO API = ");
-
-    switch (iot) {
-        case POSIXIO:
-            output_report("POSIX\n");
-            break;
-        case HDF5:
-            output_report("HDF5\n");
-            break;
-        default:
-            /* unknown request */
-            HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
-            HDassert(0 && "Unknown IO tpe");
-            break;
-    }
-
-    /* allocate space for tables minmax and that it is sufficient */
-    /* to initialize all elements to zeros by calloc.             */
-    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 = (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 */
-    for (i = 0; i < parms.num_iters; ++i) {
-        double t;
-        res = do_sio(parms);
-
-        /* gather all of the "sys write" times */
-        t = get_time(res.timers, HDF5_MPI_WRITE);
-        get_minmax(&write_sys_mm, t);
-
-        write_sys_mm_table[i] = write_sys_mm;
-
-        /* gather all of the "write" times */
-        t = get_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
-        get_minmax(&write_mm, t);
-
-        write_mm_table[i] = write_mm;
-
-        /* gather all of the "write" times from open to close */
-        t = get_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
-        get_minmax(&write_gross_mm, t);
-
-        write_gross_mm_table[i] = write_gross_mm;
-
-        /* gather all of the raw "write" times */
-        t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
-        get_minmax(&write_raw_mm, t);
-
-        write_raw_mm_table[i] = write_raw_mm;
-
-        if (!parms.h5_write_only) {
-            /* gather all of the "mpi read" times */
-            t = get_time(res.timers, HDF5_MPI_READ);
-            get_minmax(&read_sys_mm, t);
-
-            read_sys_mm_table[i] = read_sys_mm;
-
-            /* gather all of the "read" times */
-            t = get_time(res.timers, HDF5_FINE_READ_FIXED_DIMS);
-            get_minmax(&read_mm, t);
-
-            read_mm_table[i] = read_mm;
-
-            /* gather all of the "read" times from open to close */
-            t = get_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
-            get_minmax(&read_gross_mm, t);
-
-            read_gross_mm_table[i] = read_gross_mm;
-
-            /* gather all of the raw "read" times */
-            t = get_time(res.timers, HDF5_RAW_READ_FIXED_DIMS);
-            get_minmax(&read_raw_mm, t);
-
-            read_raw_mm_table[i] = read_gross_mm;
-        }
-        io_time_destroy(res.timers);
-    }
-
-    /*
-     * Show various statistics
-     */
-    /* Write statistics	*/
-    /* Print the raw data throughput if desired */
-    if (opts->print_raw) {
-        /* accumulate and output the max, min, and average "raw write" times */
-        if (sio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Raw Data Write details:\n");
-            output_all_info(write_raw_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts,"Raw Data Write",write_raw_mm_table,parms.num_iters,raw_size);
-    } /* end if */
-
-    /* show sys write statics */
-#if 0
-    if (sio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("MPI Write details:\n");
-        output_all_info(write_sys_mm_table, parms.num_iters, 4);
-    }
-#endif
-    /* We don't currently output the MPI write results */
-
-    /* accumulate and output the max, min, and average "write" times */
-    if (sio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("Write details:\n");
-        output_all_info(write_mm_table, parms.num_iters, 4);
-    }
-
-    output_results(opts,"Write",write_mm_table,parms.num_iters,raw_size);
-
-    /* accumulate and output the max, min, and average "gross write" times */
-    if (sio_debug_level >= 3) {
-        /* output all of the times for all iterations */
-        print_indent(3);
-        output_report("Write Open-Close details:\n");
-        output_all_info(write_gross_mm_table, parms.num_iters, 4);
-    }
-
-    output_results(opts,"Write Open-Close",write_gross_mm_table,parms.num_iters,raw_size);
-
-    if (!parms.h5_write_only) {
-        /* Read statistics	*/
-        /* Print the raw data throughput if desired */
-        if (opts->print_raw) {
-            /* accumulate and output the max, min, and average "raw read" times */
-            if (sio_debug_level >= 3) {
-                /* output all of the times for all iterations */
-                print_indent(3);
-                output_report("Raw Data Read details:\n");
-                output_all_info(read_raw_mm_table, parms.num_iters, 4);
-            }
-
-            output_results(opts, "Raw Data Read", read_raw_mm_table,
-                           parms.num_iters, raw_size);
-        } /* end if */
-
-        /* show mpi read statics */
-#if 0
-        if (sio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("MPI Read details:\n");
-            output_all_info(read_sys_mm_table, parms.num_iters, 4);
-        }
-#endif
-        /* We don't currently output the MPI read results */
-
-        /* accumulate and output the max, min, and average "read" times */
-        if (sio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read details:\n");
-            output_all_info(read_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
-
-        /* accumulate and output the max, min, and average "gross read" times */
-        if (sio_debug_level >= 3) {
-            /* output all of the times for all iterations */
-            print_indent(3);
-            output_report("Read Open-Close details:\n");
-            output_all_info(read_gross_mm_table, parms.num_iters, 4);
-        }
-
-        output_results(opts, "Read Open-Close", read_gross_mm_table,
-                       parms.num_iters, raw_size);
-    }
-
-    /* clean up our mess */
-    free(write_sys_mm_table);
-    free(write_mm_table);
-    free(write_gross_mm_table);
-    free(write_raw_mm_table);
-
-    if (!parms.h5_write_only) {
-        free(read_sys_mm_table);
-        free(read_mm_table);
-        free(read_gross_mm_table);
-        free(read_raw_mm_table);
-    }
-
-    return ret_value;
-}
-
-/*
- * Function:    output_all_info
- * Purpose:
- * Return:      Nothing
- * Programmer:  Bill Wendling, 29. January 2002
- * Modifications:
- */
-static void
-output_all_info(minmax *mm, int count, int indent_level)
-{
-    int i;
-
-    for (i = 0; i < count; ++i) {
-        print_indent(indent_level);
-        output_report("Iteration %d:\n", i + 1);
-        print_indent(indent_level + 1);
-        output_report("Minimum Time: %.2fs\n", mm[i].min);
-        print_indent(indent_level + 1);
-        output_report("Maximum Time: %.2fs\n", mm[i].max);
-    }
-}
-
-/*
- * Function:    get_minmax
- * Purpose:     Gather all the min, max and total of val.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 21. December 2001
- * Modifications:
- *    Use MPI_Allreduce to do it. -akc, 2002/01/11
- */
-
-static void
-get_minmax(minmax *mm, double val)
-{
-    mm->max = val;
-    mm->min = val;
-    mm->sum = val;
-}
-
-/*
- * Function:    accumulate_minmax_stuff
- * Purpose:     Accumulate the minimum, maximum, and average of the times
- *              across all processes.
- * Return:      TOTAL_MM - the total of all of these.
- * Programmer:  Bill Wendling, 21. December 2001
- * Modifications:
- *              Changed to use seconds instead of MB/s - QAK, 5/9/02
- */
-static minmax
-accumulate_minmax_stuff(minmax *mm, int count)
-{
-    int i;
-    minmax total_mm;
-
-    total_mm.sum = 0.0F;
-    total_mm.max = -DBL_MAX;
-    total_mm.min = DBL_MAX;
-    total_mm.num = count;
-
-    for (i = 0; i < count; ++i) {
-        double m = mm[i].max;
-
-        total_mm.sum += m;
-
-        if (m < total_mm.min)
-            total_mm.min = m;
-
-        if (m > total_mm.max)
-            total_mm.max = m;
-    }
-
-    return total_mm;
-}
-
-
-/*
- * Function:    output_results
- * Purpose:     Print information about the time & bandwidth for a given
- *                  minmax & # of iterations.
- * Return:      Nothing
- * Programmer:  Quincey Koziol, 9. May 2002
- * Modifications:
- */
-static void
-output_results(const struct options *opts, const char *name, minmax *table,
-    int table_size,off_t data_size)
-{
-    minmax          total_mm;
-
-    total_mm = accumulate_minmax_stuff(table, table_size);
-
-    print_indent(3);
-    output_report("%s (%d iteration(s)):\n", name,table_size);
-
-    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
-    print_indent(4);
-    output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.min));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", total_mm.min);
-    else
-        output_report("\n");
-
-    print_indent(4);
-    output_report("Average Throughput: %6.2f MB/s",
-                  MB_PER_SEC(data_size,total_mm.sum / total_mm.num));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
-    else
-        output_report("\n");
-
-    print_indent(4);
-    output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.max));
-    if(opts->print_times)
-        output_report(" (%7.3f s)\n", total_mm.max);
-    else
-        output_report("\n");
-}
-
-/*
- * Function:    output_report
- * Purpose:     Print a line of the report. Only do so if I'm the 0 process.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 19. December 2001
- * Modifications:
- */
-static void
-output_report(const char *fmt, ...)
-{
-        va_list ap;
-
-        va_start(ap, fmt);
-        vfprintf(output, fmt, ap);
-        va_end(ap);
-}
-
-/*
- * Function:    print_indent
- * Purpose:     Print spaces to indent a new line of text for pretty printing
- *              things.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 29. October 2001
- * Modifications:
- */
-static void
-print_indent(register int indent)
-{
-	indent *= TAB_SPACE;
-
-	for (; indent > 0; --indent)
-	    fputc(' ', output);
-}
-
-static void
-recover_size_and_print(long long val, const char *end)
-{
-    if (val >= ONE_KB && (val % ONE_KB) == 0) {
-        if (val >= ONE_MB && (val % ONE_MB) == 0) {
-            if (val >= ONE_GB && (val % ONE_GB) == 0)
-                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""GB%s", val / ONE_GB, end);
-            else
-                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""MB%s", val / ONE_MB, end);
-        } else {
-            HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""KB%s", val / ONE_KB, end);
-        }
-    } else {
-        HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""%s", val, end);
-    }
-}
-
-static void
-print_io_api(long io_types)
-{
-    if (io_types & SIO_POSIX)
-	HDfprintf(output, "posix ");
-    if (io_types & SIO_HDF5)
-	HDfprintf(output, "hdf5 ");
-    HDfprintf(output, "\n");
-}
-
-static void
-report_parameters(struct options *opts)
-{
-    int i, rank;
-    rank = opts->dset_rank;
-
-    print_version("HDF5 Library");	/* print library version */
-    HDfprintf(output, "==== Parameters ====\n");
-
-    HDfprintf(output, "IO API=");
-    print_io_api(opts->io_types);
-
-    HDfprintf(output, "Number of iterations=%d\n",
-              opts->num_iters);
-
-    HDfprintf(output, "Dataset size=");
-
-    for (i=0; i<rank; i++)
-        recover_size_and_print((long long)opts->dset_size[i], " ");
-    HDfprintf(output, "\n");
-
-
-    HDfprintf(output, "Transfer buffer size=");
-    for (i=0; i<rank; i++)
-        recover_size_and_print((long long)opts->buf_size[i], " ");
-    HDfprintf(output, "\n");
-
-    HDfprintf(output, "Dimension access order=");
-    for (i=0; i<rank; i++)
-        recover_size_and_print((long long)opts->order[i], " ");
-    HDfprintf(output, "\n");
-
-    if (opts->io_types & SIO_HDF5) {
-
-        HDfprintf(output, "HDF5 data storage method=");
-
-        if (opts->h5_use_chunks){
-
-            HDfprintf(output, "Chunked\n");
-            HDfprintf(output, "HDF5 chunk size=");
-            for (i=0; i<rank; i++)
-                recover_size_and_print((long long)opts->chk_size[i], " ");
-            HDfprintf(output, "\n");
-
-            HDfprintf(output, "HDF5 dataset dimensions=");
-            if (opts->h5_extendable) {
-                HDfprintf(output, "Extendable\n");
-            }
-            else {
-                HDfprintf(output, "Fixed\n");
-            }
-        }
-        else {
-            HDfprintf(output, "Contiguous\n");
-        }
-
-        HDfprintf(output, "HDF5 file driver=");
-        if (opts->vfd==sec2) {
-            HDfprintf(output, "sec2\n");
-        } else if (opts->vfd==stdio) {
-            HDfprintf(output, "stdio\n");
-        } else if (opts->vfd==core) {
-            HDfprintf(output, "core\n");
-        } else if (opts->vfd==split) {
-            HDfprintf(output, "split\n");
-        } else if (opts->vfd==multi) {
-            HDfprintf(output, "multi\n");
-        } else if (opts->vfd==family) {
-            HDfprintf(output, "family\n");
-        } else if (opts->vfd==direct) {
-            HDfprintf(output, "direct\n");
-        }
-    }
-
-    {
-        char *prefix = HDgetenv("HDF5_PREFIX");
-
-        HDfprintf(output, "Env HDF5_PREFIX=%s\n",
-                  (prefix ? prefix : "not set"));
-    }
-
-    HDfprintf(output, "==== End of Parameters ====\n");
-    HDfprintf(output, "\n");
-}
-
-/*
- * Function:    parse_command_line
- * Purpose:     Parse the command line options and return a STRUCT OPTIONS
- *              structure which will need to be freed by the calling function.
- * Return:      Pointer to an OPTIONS structure
- * Programmer:  Bill Wendling, 31. October 2001
- * Modifications:
- *    Added multidimensional testing (Christian Chilan, April, 2008)
- */
-static struct options *
-parse_command_line(int argc, char *argv[])
-{
-    register int opt;
-    struct options *cl_opts;
-    int i, default_rank, actual_rank, ranks[4];
-    cl_opts = (struct options *)malloc(sizeof(struct options));
-
-    cl_opts->output_file = NULL;
-    cl_opts->io_types =  0;    /* will set default after parsing options */
-    cl_opts->num_iters = 1;
-
-    default_rank = 2;
-
-    cl_opts->dset_rank = 0;
-    cl_opts->buf_rank = 0;
-    cl_opts->chk_rank = 0;
-    cl_opts->order_rank = 0;
-
-    for (i=0; i<MAX_DIMS; i++){
-        cl_opts->buf_size[i]=(i+1)*10;
-        cl_opts->dset_size[i]=(i+1)*100;
-        cl_opts->chk_size[i]=(i+1)*10;
-        cl_opts->order[i]=i+1;
-    }
-
-    cl_opts->vfd = sec2;
-
-    cl_opts->print_times = FALSE;   /* Printing times is off by default */
-    cl_opts->print_raw = FALSE;     /* Printing raw data throughput is off by default */
-    cl_opts->h5_alignment = 1;      /* No alignment for HDF5 objects by default */
-    cl_opts->h5_threshold = 1;      /* No threshold for aligning HDF5 objects by default */
-    cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
-    cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
-    cl_opts->h5_extendable = FALSE; /* Use extendable dataset */
-    cl_opts->verify = FALSE;        /* No Verify data correctness by default */
-
-    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) != EOF) {
-        switch ((char)opt) {
-        case 'a':
-            cl_opts->h5_alignment = parse_size_directive(opt_arg);
-            break;
-        case 'A':
-            {
-                const char *end = opt_arg;
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    if (!HDstrcasecmp(buf, "hdf5")) {
-                        cl_opts->io_types |= SIO_HDF5;
-                    } else if (!HDstrcasecmp(buf, "posix")) {
-                        cl_opts->io_types |= SIO_POSIX;
-                    } else {
-                        fprintf(stderr, "sio_perf: invalid --api option %s\n",
-                                buf);
-                        exit(EXIT_FAILURE);
-                    }
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-            }
-
-            break;
-#if 0
-        case 'b':
-            /* the future "binary" option */
-            break;
-#endif  /* 0 */
-        case 'c':
-            /* Turn on chunked HDF5 dataset creation */
-            cl_opts->h5_use_chunks = 1;
-            {
-                const char *end = opt_arg;
-                int j = 0;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    cl_opts->chk_size[j] = parse_size_directive(buf);
-
-                    j++;
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-                cl_opts->chk_rank = j;
-            }
-
-            break;
-
-
-        case 'D':
-            {
-                const char *end = opt_arg;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    if (strlen(buf) > 1 || isdigit(buf[0])) {
-                        size_t j;
-
-                        for (j = 0; j < 10 && buf[j] != '\0'; ++j)
-                            if (!isdigit(buf[j])) {
-                                fprintf(stderr, "sio_perf: invalid --debug option %s\n",
-                                        buf);
-                                exit(EXIT_FAILURE);
-                            }
-
-                        sio_debug_level = atoi(buf);
-
-                        if (sio_debug_level > 4)
-                            sio_debug_level = 4;
-                        else if (sio_debug_level < 0)
-                            sio_debug_level = 0;
-                    } else {
-                        switch (*buf) {
-                        case 'r':
-                            /* Turn on raw data throughput info */
-                            cl_opts->print_raw = TRUE;
-                            break;
-                        case 't':
-                            /* Turn on time printing */
-                            cl_opts->print_times = TRUE;
-                            break;
-            case 'v':
-                            /* Turn on verify data correctness*/
-                cl_opts->verify = TRUE;
-                break;
-                        default:
-                            fprintf(stderr, "sio_perf: invalid --debug option %s\n", buf);
-                            exit(EXIT_FAILURE);
-                        }
-                    }
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-            }
-
-            break;
-        case 'e':
-            {
-                const char *end = opt_arg;
-                int j = 0;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    cl_opts->dset_size[j] = parse_size_directive(buf);
-
-                    j++;
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-                cl_opts->dset_rank = j;
-            }
-
-            break;
-
-        case 'i':
-            cl_opts->num_iters = atoi(opt_arg);
-            break;
-        case 'o':
-            cl_opts->output_file = opt_arg;
-            break;
-        case 'T':
-            cl_opts->h5_threshold = parse_size_directive(opt_arg);
-            break;
-        case 'v':
-            if (!HDstrcasecmp(opt_arg, "sec2")) {
-                cl_opts->vfd=sec2;
-            } else if (!HDstrcasecmp(opt_arg, "stdio")) {
-                cl_opts->vfd=stdio;
-            } else if (!HDstrcasecmp(opt_arg, "core")) {
-                cl_opts->vfd=core;
-            } else if (!HDstrcasecmp(opt_arg, "split")) {
-                cl_opts->vfd=split;
-            } else if (!HDstrcasecmp(opt_arg, "multi")) {
-                cl_opts->vfd=multi;
-            } else if (!HDstrcasecmp(opt_arg, "family")) {
-                cl_opts->vfd=family;
-            } else if (!HDstrcasecmp(opt_arg, "direct")) {
-                cl_opts->vfd=direct;
-            } else {
-                fprintf(stderr, "sio_perf: invalid --api option %s\n",
-                                opt_arg);
-                exit(EXIT_FAILURE);
-            }
-            break;
-        case 'w':
-            cl_opts->h5_write_only = TRUE;
-            break;
-        case 't':
-            cl_opts->h5_extendable = TRUE;
-            break;
-        case 'x':
-            {
-                const char *end = opt_arg;
-                int j = 0;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    cl_opts->buf_size[j] = parse_size_directive(buf);
-
-                    j++;
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-                cl_opts->buf_rank = j;
-            }
-
-            break;
-
-        case 'r':
-            {
-                const char *end = opt_arg;
-                int j = 0;
-
-                while (end && *end != '\0') {
-                    char buf[10];
-
-                    memset(buf, '\0', sizeof(buf));
-
-                    for (i = 0; *end != '\0' && *end != ','; ++end)
-                        if (isalnum(*end) && i < 10)
-                            buf[i++] = *end;
-
-                    cl_opts->order[j] = parse_size_directive(buf);
-
-                    j++;
-
-                    if (*end == '\0')
-                        break;
-
-                    end++;
-                }
-
-                cl_opts->order_rank = j;
-            }
-
-            break;
-
-        case 'h':
-        case '?':
-        default:
-            usage(progname);
-            free(cl_opts);
-            return NULL;
-        }
-    }
-
-    /* perform rank consistency analysis */
-    actual_rank = 0;
-
-    ranks[0] = cl_opts->dset_rank;
-    ranks[1] = cl_opts->buf_rank;
-    ranks[2] = cl_opts->order_rank;
-    ranks[3] = cl_opts->chk_rank;
-
-    for (i=0; i<4; i++) {
-        if (ranks[i]>0) {
-            if (!actual_rank) {
-                actual_rank = ranks[i];
-            }
-            else {
-                if (actual_rank != ranks[i])
-                    exit(EXIT_FAILURE);
-            }
-        }
-    }
-
-    if (!actual_rank)
-        actual_rank = default_rank;
-
-    cl_opts->dset_rank = actual_rank;
-    cl_opts->buf_rank = actual_rank;
-    cl_opts->order_rank = actual_rank;
-    cl_opts->chk_rank = actual_rank;
-
-    for (i=0; i<actual_rank; i++) {
-        if (cl_opts->order[i] > actual_rank) {
-            exit(EXIT_FAILURE);
-        }
-    }
-
-    /* set default if none specified yet */
-    if (!cl_opts->io_types)
-        cl_opts->io_types = SIO_HDF5 | SIO_POSIX; /* run all API */
-
-    /* verify parameters sanity.  Adjust if needed. */
-    /* cap xfer_size with bytes per process */
-    if (cl_opts->num_iters <= 0)
-        cl_opts->num_iters = 1;
-
-    return cl_opts;
-}
-
-/*
- * Function:    parse_size_directive
- * Purpose:     Parse the size directive passed on the commandline. The size
- *              directive is an integer followed by a size indicator:
- *
- *                  K, k - Kilobyte
- *                  M, m - Megabyte
- *                  G, g - Gigabyte
- *
- * Return:      The size as a off_t because this is related to file size.
- *              If an unknown size indicator is used, then the program will
- *              exit with EXIT_FAILURE as the return value.
- * Programmer:  Bill Wendling, 18. December 2001
- * Modifications:
- */
-
-static off_t
-parse_size_directive(const char *size)
-{
-    off_t s;
-    char *endptr;
-
-    s = strtol(size, &endptr, 10);
-
-    if (endptr && *endptr) {
-        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
-            ++endptr;
-
-        switch (*endptr) {
-            case 'K':
-            case 'k':
-                s *= ONE_KB;
-                break;
-            case 'M':
-            case 'm':
-                s *= ONE_MB;
-                break;
-            case 'G':
-            case 'g':
-                s *= ONE_GB;
-                break;
-            default:
-                fprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
-                exit(EXIT_FAILURE);
-        }
-    }
-
-    return s;
-}
-
-/*
- * Function:    usage
- * Purpose:     Print a usage message and then exit.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 31. October 2001
- * Modifications:
- */
-static void
-usage(const char *prog)
-{
-	print_version(prog);
-        printf("usage: %s [OPTIONS]\n", prog);
-        printf("  OPTIONS\n");
-        printf("     -h                Print an usage message and exit\n");
-        printf("     -A AL             Which APIs to test\n");
-        printf("                       [default: all of them]\n");
-        printf("     -c SL             Selects chunked storage and defines chunks dimensions\n");
-        printf("                       and sizes\n");
-        printf("                       [default: Off]\n");
-        printf("     -e SL             Dimensions and sizes of dataset\n");
-        printf("                       [default: 100,200]\n");
-        printf("     -i N              Number of iterations to perform\n");
-        printf("                       [default: 1]\n");
-        printf("     -r NL             Dimension access order (see below for description)\n");
-        printf("                       [default: 1,2]\n");
-        printf("     -t                Selects extendable dimensions for HDF5 dataset\n");
-        printf("                       [default: Off]\n");
-        printf("     -v VFD            Selects file driver for HDF5 access\n");
-        printf("                       [default: sec2]\n");
-        printf("     -w                Perform write tests, not the read tests\n");
-        printf("                       [default: Off]\n");
-        printf("     -x SL             Dimensions and sizes of the transfer buffer\n");
-        printf("                       [default: 10,20]\n");
-        printf("\n");
-        printf("  N  - is an integer > 0.\n");
-        printf("\n");
-        printf("  S  - is a size specifier, an integer > 0 followed by a size indicator:\n");
-        printf("          K - Kilobyte (%d)\n", ONE_KB);
-        printf("          M - Megabyte (%d)\n", ONE_MB);
-        printf("          G - Gigabyte (%d)\n", ONE_GB);
-        printf("\n");
-        printf("      Example: '37M' is 37 megabytes or %d bytes\n", 37*ONE_MB);
-        printf("\n");
-        printf("  AL - is an API list. Valid values are:\n");
-        printf("          hdf5 - HDF5\n");
-        printf("          posix - POSIX\n");
-        printf("\n");
-        printf("      Example: -A posix,hdf5\n");
-        printf("\n");
-        printf("  NL - is list of integers (N) separated by commas.\n");
-        printf("\n");
-        printf("      Example: 1,2,3\n");
-        printf("\n");
-        printf("  SL - is list of size specifiers (S) separated by commas.\n");
-        printf("\n");
-        printf("      Example: 2K,2K,3K\n");
-        printf("\n");
-        printf("      The example defines an object (dataset, tranfer buffer) with three\n");
-        printf("      dimensions. Be aware that as the number of dimensions increases, the\n");
-        printf("      the total size of the object increases exponentially.\n");
-        printf("\n");
-        printf("  VFD  - is an HDF5 file driver specifier. Valid values are:\n");
-        printf("          sec2, stdio, core, split, multi, family, direct\n");
-        printf("\n");
-        printf("  Dimension access order:\n");
-        printf("      Data access starts at the cardinal origin of the dataset using the\n");
-        printf("      transfer buffer. The next access occurs on a dataset region next to\n");
-        printf("      the previous one. For a multidimensional dataset, there are several\n");
-        printf("      directions as to where to proceed. This can be specified in the dimension\n");
-        printf("      access order. For example, -r 1,2 states that the tool should traverse\n");
-        printf("      dimension 1 first, and then dimension 2.\n");
-        printf("\n");
-        printf("  Environment variables:\n");
-        printf("      HDF5_NOCLEANUP   Do not remove data files if set [default remove]\n");
-        printf("      HDF5_PREFIX      Data file prefix\n");
-        printf("\n");
-        fflush(stdout);
-} /* end usage() */
-
diff --git a/tools/perform/sio_perf.h b/tools/perform/sio_perf.h
deleted file mode 100644
index 311d909..0000000
--- a/tools/perform/sio_perf.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef SIO_PERF_H__
-#define SIO_PERF_H__
-
-#include "io_timer.h"
-#ifndef STANDALONE
-#include "H5private.h"
-#include "h5test.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#else
-#include "sio_standalone.h"
-#endif
-
-/* setup the dataset no fill option if this is v1.5 or more */
-#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
-#define H5_HAVE_NOFILL 1
-#endif
-
-#define MAX_DIMS 32
-
-typedef enum iotype_ {
-    POSIXIO,
-    HDF5
-    /*NUM_TYPES*/
-} iotype;
-
-typedef enum vfdtype_ {
-    sec2,
-    stdio,
-    core,
-    split,
-    multi,
-    family,
-    direct
-    /*NUM_TYPES*/
-} vfdtype;
-
-typedef struct parameters_ {
-    iotype  io_type;        /* The type of IO test to perform       */
-    vfdtype     vfd;
-    long  num_files;      /* Number of files to create            */
-    long  num_dsets;      /* Number of datasets to create         */
-    off_t  num_bytes;      /* Number of bytes in each dset         */
-    int         num_iters;      /* Number of times to loop doing the IO */
-    int         rank;           /* Rank of dataset */
-    off_t   dset_size[MAX_DIMS]; /* Dataset size             */
-    size_t   buf_size[MAX_DIMS]; /* Buffer size               */
-    size_t   chk_size[MAX_DIMS]; /* Chunk size               */
-    int    order[MAX_DIMS]; /* Buffer size               */
-    hsize_t   h5_align;       /* HDF5 object alignment                */
-    hsize_t   h5_thresh;      /* HDF5 object alignment threshold      */
-    int   h5_use_chunks;  /* Make HDF5 dataset chunked            */
-    int   h5_extendable;  /* Make HDF5 dataset chunked            */
-    int      h5_write_only;  /* Perform the write tests only         */
-    int   verify;      /* Verify data correctness              */
-} parameters;
-
-typedef struct results_ {
-    herr_t      ret_code;
-    io_time_t   *timers;
-} results;
-
-#ifndef SUCCESS
-#define SUCCESS     0
-#endif  /* !SUCCESS */
-
-#ifndef FAIL
-#define FAIL        -1
-#endif  /* !FAIL */
-
-extern FILE     *output;            /* output file                          */
-extern io_time_t *timer_g;           /* timer: global for stub functions     */
-extern int      sio_debug_level;    /* The debug level:
-                                     *   0 - Off
-                                     *   1 - Minimal
-                                     *   2 - Some more
-                                     *   3 - Maximal
-                                     *   4 - Even More Debugging (timer stuff)
-                                     */
-#ifdef __cplusplus
-extern "C" {
-#endif  /* __cplusplus */
-
-extern results do_sio(parameters param);
-
-#ifdef __cplusplus
-}
-#endif  /* __cplusplus */
-
-#endif  /* PIO_PERF_H__ */
diff --git a/tools/perform/sio_standalone.c b/tools/perform/sio_standalone.c
deleted file mode 100644
index d92ed30..0000000
--- a/tools/perform/sio_standalone.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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 file contains the definition of functions required to build h5perf in
- * STANDALONE mode.
- * Created: Christian Chilan, 2005/5/18.
- */
-
-#include "sio_perf.h"
-
-
-/** From h5tools_utils.c **/
-
-/* global variables */
-int   nCols = 80;
-
-/* ``get_option'' variables */
-int         opt_err = 1;    /*get_option prints errors if this is on */
-int         opt_ind = 1;    /*token pointer                          */
-const char *opt_arg;        /*flag argument (or value)               */
-
-
-int
-get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
-{
-    static int sp = 1;    /* character index in current token */
-    int opt_opt = '?';    /* option character passed back to user */
-
-    if (sp == 1) {
-        /* check for more flag-like tokens */
-        if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
-            return EOF;
-        } else if (HDstrcmp(argv[opt_ind], "--") == 0) {
-            opt_ind++;
-            return EOF;
-        }
-    }
-
-    if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
-        /* long command line option */
-        const char *arg = &argv[opt_ind][2];
-        int i;
-
-        for (i = 0; l_opts && l_opts[i].name; i++) {
-            size_t len = HDstrlen(l_opts[i].name);
-
-            if (HDstrncmp(arg, l_opts[i].name, len) == 0) {
-                /* we've found a matching long command line flag */
-                opt_opt = l_opts[i].shortval;
-
-                if (l_opts[i].has_arg != no_arg) {
-                    if (arg[len] == '=') {
-                        opt_arg = &arg[len + 1];
-                    } else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
-                        opt_arg = argv[++opt_ind];
-                    } else if (l_opts[i].has_arg == require_arg) {
-                        if (opt_err)
-                            HDfprintf(stderr,
-                                    "%s: option required for \"--%s\" flag\n",
-                                    argv[0], arg);
-
-                        opt_opt = '?';
-                    }
-                } else {
-                    if (arg[len] == '=') {
-                        if (opt_err)
-                            HDfprintf(stderr,
-                                    "%s: no option required for \"%s\" flag\n",
-                                    argv[0], arg);
-
-                        opt_opt = '?';
-                    }
-
-                    opt_arg = NULL;
-                }
-
-                break;
-            }
-        }
-
-        if (l_opts[i].name == NULL) {
-            /* exhausted all of the l_opts we have and still didn't match */
-            if (opt_err)
-                HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
-
-            opt_opt = '?';
-        }
-
-        opt_ind++;
-        sp = 1;
-    } else {
-        register char *cp;    /* pointer into current token */
-
-        /* short command line option */
-        opt_opt = argv[opt_ind][sp];
-
-        if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
-
-            if (opt_err)
-                HDfprintf(stderr, "%s: unknown option \"%c\"\n",
-                        argv[0], opt_opt);
-
-            /* if no chars left in this token, move to next token */
-            if (argv[opt_ind][++sp] == '\0') {
-                opt_ind++;
-                sp = 1;
-            }
-
-            return '?';
-        }
-
-        if (*++cp == ':') {
-            /* if a value is expected, get it */
-            if (argv[opt_ind][sp + 1] != '\0') {
-                /* flag value is rest of current token */
-                opt_arg = &argv[opt_ind++][sp + 1];
-            } else if (++opt_ind >= argc) {
-                if (opt_err)
-                    HDfprintf(stderr,
-                            "%s: value expected for option \"%c\"\n",
-                            argv[0], opt_opt);
-
-                opt_opt = '?';
-            } else {
-                /* flag value is next token */
-                opt_arg = argv[opt_ind++];
-            }
-
-            sp = 1;
-        } else {
-            /* set up to look at next char in token, next time */
-            if (argv[opt_ind][++sp] == '\0') {
-                /* no more in current token, so setup next token */
-                opt_ind++;
-                sp = 1;
-            }
-
-            opt_arg = NULL;
-        }
-    }
-
-    /* return the current flag character found */
-    return opt_opt;
-}
-
-
-void
-print_version(const char *progname)
-{
-    printf("%s: Version %u.%u.%u%s%s\n",
-           progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
-           H5_VERS_SUBRELEASE[0] ? "-" : "", H5_VERS_SUBRELEASE);
-}
-
-
-
-/** From h5test.c **/
-
-#ifdef H5_HAVE_PARALLEL
-MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
-#endif
-
-#if 0
-int
-h5_set_info_object(void)
-{
-    char	*envp;			/* environment pointer */
-    int		ret_value=0;
-
-    /* handle any MPI INFO hints via $HDF5_MPI_INFO */
-    if ((envp = getenv("HDF5_MPI_INFO")) != NULL){
-        char *next, *valp;
-
-
-        valp = envp = next = HDstrdup(envp);
-
-        /* create an INFO object if not created yet */
-        if (h5_io_info_g == MPI_INFO_NULL)
-            MPI_Info_create(&h5_io_info_g);
-
-        do {
-            size_t len;
-            char *key_val, *endp, *namep;
-
-            if (*valp == ';')
-                valp++;
-
-            /* copy key/value pair into temporary buffer */
-            len = strcspn(valp, ";");
-            next = &valp[len];
-            key_val = calloc(1, len + 1);
-
-            /* increment the next pointer past the terminating semicolon */
-            if (*next == ';')
-                ++next;
-
-            namep = HDstrncpy(key_val, valp, len);
-
-            /* pass up any beginning whitespaces */
-            while (*namep && (*namep == ' ' || *namep == '\t'))
-                namep++;
-
-            /* eat up any ending white spaces */
-            endp = &namep[strlen(namep) - 1];
-
-            while (endp && (*endp == ' ' || *endp == '\t'))
-                *endp-- = '\0';
-
-            /* find the '=' */
-
-            valp = HDstrchr(namep, '=');
-
-            if (valp != NULL) {     /* it's a valid key/value pairing */
-                char *tmp_val = valp + 1;
-
-                /* change '=' to \0, move valp down one */
-                *valp-- = '\0';
-
-                /* eat up ending whitespace on the "key" part */
-                while (*valp == ' ' || *valp == '\t')
-                    *valp-- = '\0';
-
-                valp = tmp_val;
-
-                /* eat up beginning whitespace on the "value" part */
-                while (*valp == ' ' || *valp == '\t')
-                    *valp++ = '\0';
-
-                /* actually set the darned thing */
-                if (MPI_SUCCESS != MPI_Info_set(h5_io_info_g, namep, valp)) {
-                    printf("MPI_Info_set failed\n");
-                    ret_value = -1;
-                }
-            }
-
-            valp = next;
-            HDfree(key_val);
-        } while (next && *next);
-
-        HDfree(envp);
-    }
-
-    return ret_value;
-}
-
-
-void
-h5_dump_info_object(MPI_Info info)
-{
-    char	key[MPI_MAX_INFO_KEY+1];
-    char	value[MPI_MAX_INFO_VAL+1];
-    int  	flag;
-    int		i, nkeys;
-
-    printf("Dumping MPI Info Object(%d) (up to %d bytes per item):\n", (int)info,
-	MPI_MAX_INFO_VAL);
-    if (info==MPI_INFO_NULL){
-	printf("object is MPI_INFO_NULL\n");
-    }
-    else {
-	MPI_Info_get_nkeys(info, &nkeys);
-	printf("object has %d items\n", nkeys);
-	for (i=0; i<nkeys; i++){
-	    MPI_Info_get_nthkey(info, i, key);
-	    MPI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
-	    printf("%s=%s\n", key, value);
-	}
-
-    }
-}
-
-#endif
-
diff --git a/tools/perform/sio_standalone.h b/tools/perform/sio_standalone.h
deleted file mode 100644
index 258eafb..0000000
--- a/tools/perform/sio_standalone.h
+++ /dev/null
@@ -1,516 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef SIO_STANDALONE_H__
-#define SIO_PERF_H__
-
-/* Header file for building h5perf by standalone mode.
- * Created: Christian Chilan, 2005/5/18.
- */
-
-/** From H5private.h **/
-
-#include "H5public.h"     /* Include Public Definitions    */
-
-
-/*
- * Include ANSI-C header files.
- */
-#ifdef H5_STDC_HEADERS
-#   include <assert.h>
-#   include <ctype.h>
-#   include <errno.h>
-#   include <fcntl.h>
-#   include <float.h>
-#   include <limits.h>
-#   include <math.h>
-#   include <signal.h>
-#   include <stdarg.h>
-#   include <stdio.h>
-#   include <stdlib.h>
-#   include <string.h>
-#endif
-
-/* maximum of two, three, or four values */
-#undef MAX
-#define MAX(a,b)                (((a)>(b)) ? (a) : (b))
-#define MAX2(a,b)               MAX(a,b)
-#define MAX3(a,b,c)             MAX(a,MAX(b,c))
-#define MAX4(a,b,c,d)           MAX(MAX(a,b),MAX(c,d))
-
-/*
- * A macro to portably increment enumerated types.
- */
-#ifndef H5_INC_ENUM
-#  define H5_INC_ENUM(TYPE,VAR) (VAR)=((TYPE)((VAR)+1))
-#endif
-
-/*
- * Redefine all the POSIX functions.  We should never see a POSIX
- * function (or any other non-HDF5 function) in the source!
- */
-#define HDabort()               abort()
-#define HDabs(X)                abs(X)
-#ifdef H5_HAVE_WIN32_API
-#define HDaccess(F,M)           _access(F, M)
-#define R_OK    4       /* Test for read permission.  */
-#define W_OK    2       /* Test for write permission.  */
-#define X_OK    1       /* Test for execute permission.  */
-#define F_OK    0       /* Test for existence.  */
-#else /* H5_HAVE_WIN32_API */
-#define HDaccess(F,M)           access(F, M)
-#endif /* H5_HAVE_WIN32_API */
-#define HDacos(X)               acos(X)
-#ifdef H5_HAVE_ALARM
-#define HDalarm(N)              alarm(N)
-#else /* H5_HAVE_ALARM */
-#define HDalarm(N)              (0)
-#endif /* H5_HAVE_ALARM */
-#define HDasctime(T)            asctime(T)
-#define HDasin(X)               asin(X)
-#define HDasprintf              asprintf /*varargs*/
-#define HDassert(X)             assert(X)
-#define HDatan(X)               atan(X)
-#define HDatan2(X,Y)            atan2(X,Y)
-#define HDatexit(F)             atexit(F)
-#define HDatof(S)               atof(S)
-#define HDatoi(S)               atoi(S)
-#define HDatol(S)               atol(S)
-#define HDbsearch(K,B,N,Z,F)    bsearch(K,B,N,Z,F)
-#define HDcalloc(N,Z)           calloc(N,Z)
-#define HDceil(X)               ceil(X)
-#define HDcfgetispeed(T)        cfgetispeed(T)
-#define HDcfgetospeed(T)        cfgetospeed(T)
-#define HDcfsetispeed(T,S)      cfsetispeed(T,S)
-#define HDcfsetospeed(T,S)      cfsetospeed(T,S)
-#define HDchdir(S)              chdir(S)
-#define HDchmod(S,M)            chmod(S,M)
-#define HDchown(S,O,G)          chown(S,O,G)
-#define HDclearerr(F)           clearerr(F)
-#define HDclock()               clock()
-#define HDclose(F)              close(F)
-#define HDclosedir(D)           closedir(D)
-#define HDcos(X)                cos(X)
-#define HDcosh(X)               cosh(X)
-#define HDcreat(S,M)            creat(S,M)
-#define HDctermid(S)            ctermid(S)
-#define HDctime(T)              ctime(T)
-#define HDcuserid(S)            cuserid(S)
-#ifdef H5_HAVE_DIFFTIME
-#define HDdifftime(X,Y)         difftime(X,Y)
-#else
-#define HDdifftime(X,Y)         ((double)(X)-(double)(Y))
-#endif
-#define HDdiv(X,Y)              div(X,Y)
-#define HDdup(F)                dup(F)
-#define HDdup2(F,I)             dup2(F,I)
-/* execl() variable arguments */
-/* execle() variable arguments */
-/* execlp() variable arguments */
-#define HDexecv(S,AV)           execv(S,AV)
-#define HDexecve(S,AV,E)        execve(S,AV,E)
-#define HDexecvp(S,AV)          execvp(S,AV)
-#define HDexit(N)               exit(N)
-#define HD_exit(N)              _exit(N)
-#define HDexp(X)                exp(X)
-#define HDfabs(X)               fabs(X)
-/* use ABS() because fabsf() fabsl() are not common yet. */
-#define HDfabsf(X)              ABS(X)
-#define HDfabsl(X)              ABS(X)
-#define HDfclose(F)             fclose(F)
-/* fcntl() variable arguments */
-#define HDfdopen(N,S)           fdopen(N,S)
-#define HDfeof(F)               feof(F)
-#define HDferror(F)             ferror(F)
-#define HDfflush(F)             fflush(F)
-#define HDfgetc(F)              fgetc(F)
-#define HDfgetpos(F,P)          fgetpos(F,P)
-#define HDfgets(S,N,F)          fgets(S,N,F)
-#ifdef H5_HAVE_WIN32_API
-#define HDfileno(F)             _fileno(F)
-#else /* H5_HAVE_WIN32_API */
-#define HDfileno(F)             fileno(F)
-#endif /* H5_HAVE_WIN32_API */
-#define HDfloor(X)              floor(X)
-#define HDfmod(X,Y)             fmod(X,Y)
-#define HDfopen(S,M)            fopen(S,M)
-#define HDfork()                fork()
-#define HDfpathconf(F,N)        fpathconf(F,N)
-H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
-#define HDfputc(C,F)            fputc(C,F)
-#define HDfputs(S,F)            fputs(S,F)
-#define HDfread(M,Z,N,F)        fread(M,Z,N,F)
-#define HDfree(M)               free(M)
-#define HDfreopen(S,M,F)        freopen(S,M,F)
-#define HDfrexp(X,N)            frexp(X,N)
-/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
-#ifdef H5_HAVE_FREXPF
-#define HDfrexpf(X,N)           frexpf(X,N)
-#else /* H5_HAVE_FREXPF */
-#define HDfrexpf(X,N)           frexp(X,N)
-#endif /* H5_HAVE_FREXPF */
-#ifdef H5_HAVE_FREXPL
-#define HDfrexpl(X,N)           frexpl(X,N)
-#else /* H5_HAVE_FREXPL */
-#define HDfrexpl(X,N)           frexp(X,N)
-#endif /* H5_HAVE_FREXPL */
-/* fscanf() variable arguments */
-#ifdef H5_HAVE_FSEEKO
-     #define HDfseek(F,O,W)     fseeko(F,O,W)
-#else
-     #define HDfseek(F,O,W)     fseek(F,O,W)
-#endif
-#define HDfsetpos(F,P)          fsetpos(F,P)
-/* definitions related to the file stat utilities.
- * Windows have its own function names.
- * For Unix, if off_t is not 64bit big, try use the pseudo-standard
- * xxx64 versions if available.
- */
-#ifdef H5_HAVE_WIN32_API
-    #define HDfstat(F,B)        _fstati64(F,B)
-    #define HDlstat(S,B)        _lstati64(S,B)
-    #define HDstat(S,B)         _stati64(S,B)
-    typedef struct _stati64     h5_stat_t;
-    typedef __int64             h5_stat_size_t;
-#elif H5_SIZEOF_OFF_T!=8 && H5_SIZEOF_OFF64_T==8 && defined(H5_HAVE_STAT64)
-    #define HDfstat(F,B)        fstat64(F,B)
-    #define HDlstat(S,B)        lstat64(S,B)
-    #define HDstat(S,B)         stat64(S,B)
-    typedef struct stat64       h5_stat_t;
-    typedef off64_t             h5_stat_size_t;
-#else
-    #define HDfstat(F,B)        fstat(F,B)
-    #define HDlstat(S,B)        lstat(S,B)
-    #define HDstat(S,B)         stat(S,B)
-    typedef struct stat         h5_stat_t;
-    typedef off_t               h5_stat_size_t;
-#endif
-
-#define HDftell(F)              ftell(F)
-#define HDftruncate(F,L)        ftruncate(F,L)
-#define HDfwrite(M,Z,N,F)       fwrite(M,Z,N,F)
-#define HDgetc(F)               getc(F)
-#define HDgetchar()             getchar()
-#define HDgetcwd(S,Z)           getcwd(S,Z)
-#define HDgetegid()             getegid()
-#define HDgetenv(S)             getenv(S)
-#define HDgeteuid()             geteuid()
-#define HDgetgid()              getgid()
-#define HDgetgrgid(G)           getgrgid(G)
-#define HDgetgrnam(S)           getgrnam(S)
-#define HDgetgroups(Z,G)        getgroups(Z,G)
-#ifdef H5_HAVE_WIN32_API
-#define HDgetlogin()            Wgetlogin()
-#else /* H5_HAVE_WIN32_API */
-#define HDgetlogin()            getlogin()
-#endif /* H5_HAVE_WIN32_API */
-#define HDgetpgrp()             getpgrp()
-#define HDgetpid()              getpid()
-#define HDgetppid()             getppid()
-#define HDgetpwnam(S)           getpwnam(S)
-#define HDgetpwuid(U)           getpwuid(U)
-#define HDgetrusage(X,S)        getrusage(X,S)
-#define HDgets(S)               gets(S)
-#ifdef H5_HAVE_WIN32_API
-    H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
-#define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
-#else /* H5_HAVE_WIN32_API */
-#define HDgettimeofday(S,P)     gettimeofday(S,P)
-#endif /* H5_HAVE_WIN32_API */
-#define HDgetuid()              getuid()
-#define HDgmtime(T)             gmtime(T)
-#define HDisalnum(C)            isalnum((int)(C)) /*cast for solaris warning*/
-#define HDisalpha(C)            isalpha((int)(C)) /*cast for solaris warning*/
-#define HDisatty(F)             isatty(F)
-#define HDiscntrl(C)            iscntrl((int)(C)) /*cast for solaris warning*/
-#define HDisdigit(C)            isdigit((int)(C)) /*cast for solaris warning*/
-#define HDisgraph(C)            isgraph((int)(C)) /*cast for solaris warning*/
-#define HDislower(C)            islower((int)(C)) /*cast for solaris warning*/
-#define HDisprint(C)            isprint((int)(C)) /*cast for solaris warning*/
-#define HDispunct(C)            ispunct((int)(C)) /*cast for solaris warning*/
-#define HDisspace(C)            isspace((int)(C)) /*cast for solaris warning*/
-#define HDisupper(C)            isupper((int)(C)) /*cast for solaris warning*/
-#define HDisxdigit(C)           isxdigit((int)(C)) /*cast for solaris warning*/
-#define HDkill(P,S)             kill(P,S)
-#define HDlabs(X)               labs(X)
-#define HDldexp(X,N)            ldexp(X,N)
-#define HDldiv(X,Y)             ldiv(X,Y)
-#define HDlink(OLD,NEW)         link(OLD,NEW)
-#define HDlocaleconv()          localeconv()
-#define HDlocaltime(T)          localtime(T)
-#define HDlog(X)                log(X)
-#define HDlog10(X)              log10(X)
-#define HDlongjmp(J,N)          longjmp(J,N)
-#ifdef H5_HAVE_WIN32_API
-    #define HDlseek(F,O,W)  _lseeki64(F,O,W)
-#else
-    #ifdef H5_HAVE_LSEEK64
-        #define HDlseek(F,O,W)  lseek64(F,O,W)
-    #else
-        #define HDlseek(F,O,W)  lseek(F,O,W)
-    #endif
-#endif
-#define HDmalloc(Z)             malloc(Z)
-#define HDposix_memalign(P,A,Z) posix_memalign(P,A,Z)
-#define HDmblen(S,N)            mblen(S,N)
-#define HDmbstowcs(P,S,Z)       mbstowcs(P,S,Z)
-#define HDmbtowc(P,S,Z)         mbtowc(P,S,Z)
-#define HDmemchr(S,C,Z)         memchr(S,C,Z)
-#define HDmemcmp(X,Y,Z)         memcmp(X,Y,Z)
-/*
- * The (char*) casts are required for the DEC when optimizations are turned
- * on and the source and/or destination are not aligned.
- */
-#define HDmemcpy(X,Y,Z)         memcpy((char*)(X),(const char*)(Y),Z)
-#define HDmemmove(X,Y,Z)        memmove((char*)(X),(const char*)(Y),Z)
-/*
- * The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
- */
-#ifdef H5_HAVE_VISUAL_STUDIO
-#define HDmemset(X,C,Z)         memset((void*)(X),C,Z)
-#else /* H5_HAVE_VISUAL_STUDIO */
-#define HDmemset(X,C,Z)         memset(X,C,Z)
-#endif /* H5_HAVE_VISUAL_STUDIO */
-#ifdef H5_HAVE_WIN32_API
-#define HDmkdir(S,M)            _mkdir(S)
-#else /* H5_HAVE_WIN32_API */
-#define HDmkdir(S,M)            mkdir(S,M)
-#endif /* H5_HAVE_WIN32_API */
-#define HDmkfifo(S,M)           mkfifo(S,M)
-#define HDmktime(T)             mktime(T)
-#define HDmodf(X,Y)             modf(X,Y)
-#ifdef _O_BINARY
-#define HDopen(S,F,M)           open(S,F|_O_BINARY,M)
-#else
-#define HDopen(S,F,M)           open(S,F,M)
-#endif
-#define HDopendir(S)            opendir(S)
-#define HDpathconf(S,N)         pathconf(S,N)
-#define HDpause()               pause()
-#define HDperror(S)             perror(S)
-#define HDpipe(F)               pipe(F)
-#define HDpow(X,Y)              pow(X,Y)
-/* printf() variable arguments */
-#define HDputc(C,F)             putc(C,F)
-#define HDputchar(C)            putchar(C)
-#define HDputs(S)               puts(S)
-#define HDqsort(M,N,Z,F)        qsort(M,N,Z,F)
-#define HDraise(N)              raise(N)
-
-#ifdef H5_HAVE_RAND_R
-#define HDrandom()              HDrand()
-H5_DLL int HDrand(void);
-#elif H5_HAVE_RANDOM
-#define HDrand()                random()
-#define HDrandom()              random()
-#else
-#define HDrand()                rand()
-#define HDrandom()              rand()
-#endif
-
-#define HDread(F,M,Z)           read(F,M,Z)
-#define HDreaddir(D)            readdir(D)
-#define HDrealloc(M,Z)          realloc(M,Z)
-#define HDremove(S)             remove(S)
-#define HDrename(OLD,NEW)       rename(OLD,NEW)
-#define HDrewind(F)             rewind(F)
-#define HDrewinddir(D)          rewinddir(D)
-#define HDrmdir(S)              rmdir(S)
-/* scanf() variable arguments */
-#define HDsetbuf(F,S)           setbuf(F,S)
-#define HDsetgid(G)             setgid(G)
-#define HDsetjmp(J)             setjmp(J)
-#define HDsetlocale(N,S)        setlocale(N,S)
-#define HDsetpgid(P,PG)         setpgid(P,PG)
-#define HDsetsid()              setsid()
-#define HDsetuid(U)             setuid(U)
-/* Windows does not permit setting the buffer size to values
-   less than 2.  */
-#ifndef H5_HAVE_WIN32_API
-#define HDsetvbuf(F,S,M,Z)      setvbuf(F,S,M,Z)
-#else
-#define HDsetvbuf(F,S,M,Z)  setvbuf(F,S,M,(Z>1?Z:2))
-#endif
-#define HDsigaddset(S,N)        sigaddset(S,N)
-#define HDsigdelset(S,N)        sigdelset(S,N)
-#define HDsigemptyset(S)        sigemptyset(S)
-#define HDsigfillset(S)         sigfillset(S)
-#define HDsigismember(S,N)      sigismember(S,N)
-#define HDsiglongjmp(J,N)       siglongjmp(J,N)
-#define HDsignal(N,F)           signal(N,F)
-#define HDsigpending(S)         sigpending(S)
-#define HDsigprocmask(H,S,O)    sigprocmask(H,S,O)
-#define HDsigsetjmp(J,N)        sigsetjmp(J,N)
-#define HDsigsuspend(S)         sigsuspend(S)
-#define HDsin(X)                sin(X)
-#define HDsinh(X)               sinh(X)
-#define HDsleep(N)              sleep(N)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...);
-#define HDsnprintf          c99_snprintf /*varargs*/
-#else
-#define HDsnprintf              snprintf /*varargs*/
-#endif
-/* sprintf() variable arguments */
-#define HDsqrt(X)               sqrt(X)
-#ifdef H5_HAVE_RAND_R
-H5_DLL void HDsrand(unsigned int seed);
-#define HDsrandom(S)            HDsrand(S)
-#elif H5_HAVE_RANDOM
-#define HDsrand(S)              srandom(S)
-#define HDsrandom(S)            srandom(S)
-#else
-#define HDsrand(S)              srand(S)
-#define HDsrandom(S)            srand(S)
-#endif
-/* sscanf() variable arguments */
-
-#ifdef H5_HAVE_WIN32_API
-#define HDstrcasecmp(A,B)   _stricmp(A,B)
-#else
-#define HDstrcasecmp(X,Y)      strcasecmp(X,Y)
-#endif
-#define HDstrcat(X,Y)           strcat(X,Y)
-#define HDstrchr(S,C)           strchr(S,C)
-#define HDstrcmp(X,Y)           strcmp(X,Y)
-#define HDstrcoll(X,Y)          strcoll(X,Y)
-#define HDstrcpy(X,Y)           strcpy(X,Y)
-#define HDstrcspn(X,Y)          strcspn(X,Y)
-#define HDstrerror(N)           strerror(N)
-#define HDstrftime(S,Z,F,T)     strftime(S,Z,F,T)
-#define HDstrlen(S)             strlen(S)
-#define HDstrncat(X,Y,Z)        strncat(X,Y,Z)
-#define HDstrncmp(X,Y,Z)        strncmp(X,Y,Z)
-#define HDstrncpy(X,Y,Z)        strncpy(X,Y,Z)
-#define HDstrpbrk(X,Y)          strpbrk(X,Y)
-#define HDstrrchr(S,C)          strrchr(S,C)
-#define HDstrspn(X,Y)           strspn(X,Y)
-#define HDstrstr(X,Y)           strstr(X,Y)
-#define HDstrtod(S,R)           strtod(S,R)
-#define HDstrtok(X,Y)           strtok(X,Y)
-#define HDstrtol(S,R,N)         strtol(S,R,N)
-H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
-#define HDstrtoul(S,R,N)        strtoul(S,R,N)
-#define HDstrxfrm(X,Y,Z)        strxfrm(X,Y,Z)
-#define HDsysconf(N)            sysconf(N)
-#define HDsystem(S)             system(S)
-#define HDtan(X)                tan(X)
-#define HDtanh(X)               tanh(X)
-#define HDtcdrain(F)            tcdrain(F)
-#define HDtcflow(F,A)           tcflow(F,A)
-#define HDtcflush(F,N)          tcflush(F,N)
-#define HDtcgetattr(F,T)        tcgetattr(F,T)
-#define HDtcgetpgrp(F)          tcgetpgrp(F)
-#define HDtcsendbreak(F,N)      tcsendbreak(F,N)
-#define HDtcsetattr(F,O,T)      tcsetattr(F,O,T)
-#define HDtcsetpgrp(F,N)        tcsetpgrp(F,N)
-#define HDtime(T)               time(T)
-#define HDtimes(T)              times(T)
-#define HDtmpfile()             tmpfile()
-#define HDtmpnam(S)             tmpnam(S)
-#define HDtolower(C)            tolower(C)
-#define HDtoupper(C)            toupper(C)
-#define HDttyname(F)            ttyname(F)
-#define HDtzset()               tzset()
-#define HDumask(N)              umask(N)
-#define HDuname(S)              uname(S)
-#define HDungetc(C,F)           ungetc(C,F)
-#ifdef H5_HAVE_WIN32_API
-#define HDunlink(S)             _unlink(S)
-#else
-#define HDunlink(S)             unlink(S)
-#endif
-#define HDutime(S,T)            utime(S,T)
-#define HDva_arg(A,T)           va_arg(A,T)
-#define HDva_end(A)             va_end(A)
-#define HDva_start(A,P)         va_start(A,P)
-#define HDvasprintf(RET,FMT,A)  vasprintf(RET,FMT,A)
-#define HDvfprintf(F,FMT,A)     vfprintf(F,FMT,A)
-#define HDvprintf(FMT,A)        vprintf(FMT,A)
-#define HDvsprintf(S,FMT,A)     vsprintf(S,FMT,A)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap);
-#define HDvsnprintf         c99_vsnprintf
-#else
-#   define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A)
-#endif
-#define HDwait(W)               wait(W)
-#define HDwaitpid(P,W,O)        waitpid(P,W,O)
-#define HDwcstombs(S,P,Z)       wcstombs(S,P,Z)
-#define HDwctomb(S,C)           wctomb(S,C)
-#define HDwrite(F,M,Z)          write(F,M,Z)
-
-/*
- * And now for a couple non-Posix functions...  Watch out for systems that
- * define these in terms of macros.
- */
-#ifdef H5_HAVE_WIN32_API
-#define HDstrdup(S)    _strdup(S)
-#else /* H5_HAVE_WIN32_API */
-
-#if !defined strdup && !defined H5_HAVE_STRDUP
-extern char *strdup(const char *s);
-#endif
-
-#define HDstrdup(S)     strdup(S)
-
-#endif /* H5_HAVE_WIN32_API */
-
-/*
- * HDF Boolean type.
- */
-#ifndef FALSE
-#   define FALSE false
-#endif
-#ifndef TRUE
-#   define TRUE true
-#endif
-
-/** From h5test.h **/
-
-#ifdef H5_HAVE_PARALLEL
-extern MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-H5TEST_DLL int h5_set_info_object(void);
-H5TEST_DLL void h5_dump_info_object(MPI_Info info);
-#endif
-
-
-
-/** From h5tools_utils.h **/
-
-extern int         opt_err;     /* getoption prints errors if this is on    */
-extern int         opt_ind;     /* token pointer                            */
-extern const char *opt_arg;     /* flag argument (or value)                 */
-
-
-enum {
-    no_arg = 0,         /* doesn't take an argument     */
-    require_arg,        /* requires an argument          */
-    optional_arg        /* argument is optional         */
-};
-
-
-typedef struct long_options {
-    const char  *name;          /* name of the long option              */
-    int          has_arg;       /* whether we should look for an arg    */
-    char         shortval;      /* the shortname equivalent of long arg
-                                 * this gets returned from get_option   */
-} long_options;
-
-extern int    get_option(int argc, const char **argv, const char *opt,
-                         const struct long_options *l_opt);
-#endif
diff --git a/tools/perform/zip_perf.c b/tools/perform/zip_perf.c
deleted file mode 100644
index d025602..0000000
--- a/tools/perform/zip_perf.c
+++ /dev/null
@@ -1,644 +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.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/* ===========================================================================
- * Usage:  zip_perf [-d] [-f] [-h] [-1 to -9] [files...]
- *   -d : decompress
- *   -f : compress with Z_FILTERED
- *   -h : compress with Z_HUFFMAN_ONLY
- *   -1 to -9 : compression level
- */
-
-/* our header files */
-#include "h5test.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-
-#ifdef H5_HAVE_FILTER_DEFLATE
-
-#include <zlib.h>
-
-#define ONE_KB              1024
-#define ONE_MB              (ONE_KB * ONE_KB)
-#define ONE_GB              (ONE_MB * ONE_KB)
-
-#define MICROSECOND         1000000.0F
-
-/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes,t) ((fabs(t)<0.0000000001F) ? 0.0F : ((((double)bytes) / ONE_MB) / (t)))
-
-#ifndef TRUE
-#define TRUE    1
-#endif  /* TRUE */
-
-#ifndef FALSE
-#define FALSE   (!TRUE)
-#endif  /* FALSE */
-
-#ifndef S_IRWXU
-#define S_IRWXU (_S_IREAD|_S_IWRITE)
-#endif
-
-/* internal variables */
-static const char *prog=NULL;
-static const char *option_prefix=NULL;
-static char *filename=NULL;
-static int compress_percent = 0;
-static int compress_level = Z_DEFAULT_COMPRESSION;
-static int output, random_test = FALSE;
-static int report_once_flag;
-static double compression_time;
-
-/* internal functions */
-static void error(const char *fmt, ...);
-static void compress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
-                            uLong sourceLen);
-
-/* commandline options : long and short form */
-static const char *s_opts = "hB:b:c:p:rs:0123456789";
-static struct long_options l_opts[] = {
-    { "help", no_arg, 'h' },
-    { "compressability", require_arg, 'c' },
-    { "compressabilit", require_arg, 'c' },
-    { "compressabili", require_arg, 'c' },
-    { "compressabil", require_arg, 'c' },
-    { "compressabi", require_arg, 'c' },
-    { "compressab", require_arg, 'c' },
-    { "compressa", require_arg, 'c' },
-    { "compress", require_arg, 'c' },
-    { "compres", require_arg, 'c' },
-    { "compre", require_arg, 'c' },
-    { "compr", require_arg, 'c' },
-    { "comp", require_arg, 'c' },
-    { "com", require_arg, 'c' },
-    { "co", require_arg, 'c' },
-    { "file-size", require_arg, 's' },
-    { "file-siz", require_arg, 's' },
-    { "file-si", require_arg, 's' },
-    { "file-s", require_arg, 's' },
-    { "file", require_arg, 's' },
-    { "fil", require_arg, 's' },
-    { "fi", require_arg, 's' },
-    { "max-buffer-size", require_arg, 'B' },
-    { "max-buffer-siz", require_arg, 'B' },
-    { "max-buffer-si", require_arg, 'B' },
-    { "max-buffer-s", require_arg, 'B' },
-    { "max-buffer", require_arg, 'B' },
-    { "max-buffe", require_arg, 'B' },
-    { "max-buff", require_arg, 'B' },
-    { "max-buf", require_arg, 'B' },
-    { "max-bu", require_arg, 'B' },
-    { "max-b", require_arg, 'B' },
-    { "max", require_arg, 'B' },
-    { "min-buffer-size", require_arg, 'b' },
-    { "min-buffer-siz", require_arg, 'b' },
-    { "min-buffer-si", require_arg, 'b' },
-    { "min-buffer-s", require_arg, 'b' },
-    { "min-buffer", require_arg, 'b' },
-    { "min-buffe", require_arg, 'b' },
-    { "min-buff", require_arg, 'b' },
-    { "min-buf", require_arg, 'b' },
-    { "min-bu", require_arg, 'b' },
-    { "min-b", require_arg, 'b' },
-    { "min", require_arg, 'b' },
-    { "prefix", require_arg, 'p' },
-    { "prefi", require_arg, 'p' },
-    { "pref", require_arg, 'p' },
-    { "pre", require_arg, 'p' },
-    { "pr", require_arg, 'p' },
-    { "random-test", no_arg, 'r' },
-    { "random-tes", no_arg, 'r' },
-    { "random-te", no_arg, 'r' },
-    { "random-t", no_arg, 'r' },
-    { "random", no_arg, 'r' },
-    { "rando", no_arg, 'r' },
-    { "rand", no_arg, 'r' },
-    { "ran", no_arg, 'r' },
-    { "ra", no_arg, 'r' },
-    { NULL, 0, '\0' }
-};
-
-/*
- * Function:    error
- * Purpose:     Display error message and exit.
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-static void
-error(const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    HDfprintf(stderr, "%s: error: ", prog);
-    HDvfprintf(stderr, fmt, ap);
-    HDfprintf(stderr, "\n");
-    va_end(ap);
-    HDexit(EXIT_FAILURE);
-}
-
-/*
- * Function:    cleanup
- * Purpose:     Cleanup the output file.
- * Returns:     Nothing
- * Programmer:  Bill Wendling, 06. June 2002
- * Modifications:
- */
-static void
-cleanup(void)
-{
-    if (!HDgetenv("HDF5_NOCLEANUP"))
-        HDunlink(filename);
-    HDfree(filename);
-}
-
-static void
-write_file(Bytef *source, uLongf sourceLen)
-{
-    Bytef *d_ptr, *dest;
-    uLongf d_len, destLen;
-    struct timeval timer_start, timer_stop;
-
-    /* destination buffer needs to be at least 0.1% larger than sourceLen
-     * plus 12 bytes */
-    destLen = (uLongf)((double)sourceLen + ((double)sourceLen * 0.1F)) + 12;
-    dest = (Bytef *)HDmalloc(destLen);
-
-    if (!dest)
-        error("out of memory");
-
-    HDgettimeofday(&timer_start, NULL);
-    compress_buffer(dest, &destLen, source, sourceLen);
-    HDgettimeofday(&timer_stop, NULL);
-
-    compression_time += ((double)timer_stop.tv_sec +
-                            ((double)timer_stop.tv_usec) / MICROSECOND) -
-                        ((double)timer_start.tv_sec +
-                            ((double)timer_start.tv_usec) / MICROSECOND);
-
-    if (report_once_flag) {
-        HDfprintf(stdout, "\tCompression Ratio: %g\n", ((double)destLen) / (double)sourceLen);
-        report_once_flag = 0;
-    }
-
-    d_ptr = dest;
-    d_len = destLen;
-
-    /* loop to make sure we write everything out that we want to write */
-    for (;;) {
-        int rc = (int)HDwrite(output, d_ptr, (size_t)d_len);
-
-        if (rc == -1)
-            error(HDstrerror(errno));
-
-        if (rc == (int)d_len)
-            break;
-
-        d_len -= rc;
-        d_ptr += rc;
-    }
-
-    HDfree(dest);
-}
-
-/*
- * Function:    compress_buffer
- * Purpose:     Compress the buffer.
- * Returns:     Z_OK            - success
- *              Z_MEM_ERROR     - not enough memory
- *              Z_BUF_ERROR     - not enough room in the output buffer
- *              Z_STREAM_ERROR  - level parameter is invalid
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-static void
-compress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
-                uLong sourceLen)
-{
-    int rc = compress2(dest, destLen, source, sourceLen, compress_level);
-
-    if (rc != Z_OK) {
-        /* compress2 failed - cleanup and tell why */
-        cleanup();
-
-        switch (rc) {
-        case Z_MEM_ERROR:
-            error("not enough memory");
-            break;
-        case Z_BUF_ERROR:
-            error("not enough room in the output buffer");
-            break;
-        case Z_STREAM_ERROR:
-            error("level parameter (%d) is invalid", compress_level);
-            break;
-        default:
-            error("unknown compression error");
-            break;
-        }
-    }
-}
-
-#ifdef LATER
-/*
- * Function:    uncompress_buffer
- * Purpose:     Uncompress the buffer.
- * Returns:     Z_OK            - success
- *              Z_MEM_ERROR     - not enough memory
- *              Z_BUF_ERROR     - not enough room in the output buffer
- *              Z_DATA_ERROR    - the input data was corrupted
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-static int
-uncompress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
-                  uLong sourceLen)
-{
-    int rc = uncompress(dest, destLen, source, sourceLen);
-
-    return rc;
-}
-#endif /* LATER */
-
-/*
- * Function:    get_unique_name
- * Purpose:     Create a new file who's name doesn't conflict with
- *              pre-existing files.
- * Returns:     Nothing
- * Programmer:  Bill Wendling, 06. June 2002
- * Modifications:
- */
-#define ZIP_PERF_FILE "zip_perf.data"
-static void
-get_unique_name(void)
-{
-    const char *prefix = NULL;
-    const char *env = HDgetenv("HDF5_PREFIX");
-
-    if (env)
-        prefix = env;
-
-    if (option_prefix)
-        prefix = option_prefix;
-
-    if (prefix)
-        /* 2 = 1 for '/' + 1 for null terminator */
-        filename = (char *) HDmalloc(HDstrlen(prefix) + HDstrlen(ZIP_PERF_FILE) + 2);
-    else
-        filename = (char *) HDmalloc(HDstrlen(ZIP_PERF_FILE) + 1);
-
-    if (!filename)
-        error("out of memory");
-
-    filename[0] = 0;
-    if (prefix){
-        HDstrcpy(filename, prefix);
-        HDstrcat(filename, "/");
-    }
-    HDstrcat(filename, ZIP_PERF_FILE);
-}
-
-/*
- * Function:    usage
- * Purpose:     Print a usage message and then exit.
- * Return:      Nothing
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-static void
-usage(void)
-{
-    HDfprintf(stdout, "usage: %s [OPTIONS]\n", prog);
-    HDfprintf(stdout, "  OPTIONS\n");
-    HDfprintf(stdout, "     -h, --help                 Print this usage message and exit\n");
-    HDfprintf(stdout, "     -1...-9                    Level of compression, from 1 to 9\n");
-    HDfprintf(stdout, "     -c P, --compressability=P  Percentage of compressability of the random\n");
-    HDfprintf(stdout, "                                data you want [default: 0]");
-    HDfprintf(stdout, "     -s S, --file-size=S        Maximum size of uncompressed file [default: 64M]\n");
-    HDfprintf(stdout, "     -B S, --max-buffer_size=S  Maximum size of buffer [default: 1M]\n");
-    HDfprintf(stdout, "     -b S, --min-buffer_size=S  Minumum size of buffer [default: 128K]\n");
-    HDfprintf(stdout, "     -p D, --prefix=D           The directory prefix to place the file\n");
-    HDfprintf(stdout, "     -r, --random-test          Use random data to write to the file\n");
-    HDfprintf(stdout, "                                [default: no]\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout, "  D  - a directory which exists\n");
-    HDfprintf(stdout, "  P  - a number between 0 and 100\n");
-    HDfprintf(stdout, "  S  - is a size specifier, an integer >=0 followed by a size indicator:\n");
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout, "          K - Kilobyte (%d)\n", ONE_KB);
-    HDfprintf(stdout, "          M - Megabyte (%d)\n", ONE_MB);
-    HDfprintf(stdout, "          G - Gigabyte (%d)\n", ONE_GB);
-    HDfprintf(stdout, "\n");
-    HDfprintf(stdout, "      Example: 37M = 37 Megabytes = %d bytes\n", 37 * ONE_MB);
-    HDfprintf(stdout, "\n");
-    HDfflush(stdout);
-}
-
-/*
- * Function:    parse_size_directive
- * Purpose:     Parse the size directive passed on the commandline. The size
- *              directive is an integer followed by a size indicator:
- *
- *                  K, k - Kilobyte
- *                  M, m - Megabyte
- *
- * Return:      The size as a size_t because this is related to buffer size.
- *              If an unknown size indicator is used, then the program will
- *              exit with EXIT_FAILURE as the return value.
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-static unsigned long
-parse_size_directive(const char *size)
-{
-    unsigned long s;
-    char *endptr;
-
-    s = HDstrtoul(size, &endptr, 10);
-
-    if (endptr && *endptr) {
-        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
-            ++endptr;
-
-        switch (*endptr) {
-            case 'K':
-            case 'k':
-                s *= ONE_KB;
-                break;
-            case 'M':
-            case 'm':
-                s *= ONE_MB;
-                break;
-            case 'G':
-            case 'g':
-                s *= ONE_GB;
-                break;
-            default:
-                error("illegal size specifier '%c'", *endptr);
-                break;
-        }
-    }
-
-    return s;
-}
-
-static void
-fill_with_random_data(Bytef *src, uLongf src_len)
-{
-    register unsigned u;
-    h5_stat_t stat_buf;
-
-    if (HDstat("/dev/urandom", &stat_buf) == 0) {
-        uLongf len = src_len;
-        Bytef *buf = src;
-        int fd = HDopen("/dev/urandom", O_RDONLY, 0);
-
-        HDfprintf(stdout, "Using /dev/urandom for random data\n");
-
-        if (fd < 0)
-            error(HDstrerror(errno));
-
-        for (;;) {
-            ssize_t rc = HDread(fd, buf, src_len);
-
-            if (rc == -1)
-                error(HDstrerror(errno));
-
-            if (rc == (ssize_t)len)
-                break;
-
-            buf += rc;
-            len -= rc;
-        }
-    } else {
-        HDfprintf(stdout, "Using random() for random data\n");
-
-        for (u = 0; u < src_len; ++u)
-            src[u] = (Bytef)(0xff & HDrandom());
-    }
-
-    if (compress_percent) {
-        unsigned long s = src_len * compress_percent / 100;
-
-        HDmemset(src, '\0', s);
-    }
-}
-
-static void
-do_write_test(unsigned long file_size, unsigned long min_buf_size,
-              unsigned long max_buf_size)
-{
-    uLongf src_len, total_len;
-    struct timeval timer_start, timer_stop;
-    double total_time;
-    Bytef *src;
-
-    for (src_len = min_buf_size; src_len <= max_buf_size; src_len <<= 1) {
-        register unsigned long i, iters;
-
-        iters = file_size / src_len;
-        src = (Bytef *)HDcalloc(1, sizeof(Bytef) * src_len);
-
-        if (!src) {
-            cleanup();
-            error("out of memory");
-        }
-
-        compression_time = 0.0F;
-
-        if (random_test)
-            fill_with_random_data(src, src_len);
-
-        HDfprintf(stdout, "Buffer size == ");
-
-        if (src_len >= ONE_KB && (src_len % ONE_KB) == 0) {
-            if (src_len >= ONE_MB && (src_len % ONE_MB) == 0) {
-                HDfprintf(stdout, "%ldMB", src_len / ONE_MB);
-            } else {
-                HDfprintf(stdout, "%ldKB", src_len / ONE_KB);
-            }
-        } else {
-            HDfprintf(stdout, "%ld", src_len);
-        }
-
-        HDfprintf(stdout, "\n");
-
-        /* do uncompressed data write */
-        HDgettimeofday(&timer_start, NULL);
-        output = HDopen(filename, O_RDWR | O_CREAT, S_IRWXU);
-
-        if (output == -1)
-            error(HDstrerror(errno));
-
-        for (i = 0; i <= iters; ++i) {
-            Bytef *s_ptr = src;
-            uLong s_len = src_len;
-
-            /* loop to make sure we write everything out that we want to write */
-            for (;;) {
-                ssize_t rc = HDwrite(output, s_ptr, s_len);
-
-                if (rc == -1)
-                    error(HDstrerror(errno));
-
-                if (rc == (ssize_t)s_len)
-                    break;
-
-                s_len -= rc;
-                s_ptr += rc;
-            }
-        }
-
-        HDclose(output);
-        HDgettimeofday(&timer_stop, NULL);
-
-        total_time = ((double)timer_stop.tv_sec +
-                            ((double)timer_stop.tv_usec) / MICROSECOND) -
-                     ((double)timer_start.tv_sec +
-                            ((double)timer_start.tv_usec) / MICROSECOND);
-
-        HDfprintf(stdout, "\tUncompressed Write Time: %.2fs\n", total_time);
-        HDfprintf(stdout, "\tUncompressed Write Throughput: %.2fMB/s\n",
-               MB_PER_SEC(file_size, total_time));
-
-        HDunlink(filename);
-
-        /* do compressed data write */
-        output = HDopen(filename, O_RDWR | O_CREAT, S_IRWXU);
-
-        if (output == -1)
-            error(HDstrerror(errno));
-
-        report_once_flag = 1;
-        HDgettimeofday(&timer_start, NULL);
-
-        for (total_len = 0; total_len < file_size; total_len += src_len)
-            write_file(src, src_len);
-
-        HDclose(output);
-        HDgettimeofday(&timer_stop, NULL);
-
-        total_time = ((double)timer_stop.tv_sec +
-                            ((double)timer_stop.tv_usec) / MICROSECOND) -
-                     ((double)timer_start.tv_sec +
-                            ((double)timer_start.tv_usec) / MICROSECOND);
-
-        HDfprintf(stdout, "\tCompressed Write Time: %.2fs\n", total_time);
-        HDfprintf(stdout, "\tCompressed Write Throughput: %.2fMB/s\n",
-               MB_PER_SEC(file_size, total_time));
-        HDfprintf(stdout, "\tCompression Time: %gs\n", compression_time);
-
-        HDunlink(filename);
-        HDfree(src);
-    }
-}
-
-/*
- * Function:    main
- * Purpose:     Run the program
- * Return:      EXIT_SUCCESS or EXIT_FAILURE
- * Programmer:  Bill Wendling, 05. June 2002
- * Modifications:
- */
-int
-main(int argc, char **argv)
-{
-    unsigned long min_buf_size = 128 * ONE_KB, max_buf_size = ONE_MB;
-    unsigned long file_size = 64 * ONE_MB;
-    int opt;
-
-    prog = argv[0];
-    
-    /* Initialize h5tools lib */
-    h5tools_init();
-
-    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) > 0) {
-        switch ((char)opt) {
-        case '0': case '1': case '2':
-        case '3': case '4': case '5':
-        case '6': case '7': case '8':
-        case '9':
-            compress_level = opt - '0';
-            break;
-        case 'B':
-            max_buf_size = parse_size_directive(opt_arg);
-            break;
-        case 'b':
-            min_buf_size = parse_size_directive(opt_arg);
-            break;
-        case 'c':
-            compress_percent = (int)HDstrtol(opt_arg, NULL, 10);
-
-            if (compress_percent < 0)
-                compress_percent = 0;
-            else if (compress_percent > 100)
-                compress_percent = 100;
-
-            break;
-        case 'p':
-            option_prefix = opt_arg;
-            break;
-        case 'r':
-            random_test = TRUE;
-            break;
-        case 's':
-            file_size = parse_size_directive(opt_arg);
-            break;
-        case '?':
-            usage();
-            exit(EXIT_FAILURE);
-            break;
-        case 'h':
-        default:
-            usage();
-            exit(EXIT_SUCCESS);
-            break;
-        }
-    }
-
-    if (min_buf_size > max_buf_size)
-        error("minmum buffer size (%d) exceeds maximum buffer size (%d)",
-              min_buf_size, max_buf_size);
-
-    HDfprintf(stdout, "Filesize: %ld\n", file_size);
-
-    if (compress_level == Z_DEFAULT_COMPRESSION)
-        HDfprintf(stdout, "Compression Level: 6\n");
-    else
-        HDfprintf(stdout, "Compression Level: %d\n", compress_level);
-
-    get_unique_name();
-    do_write_test(file_size, min_buf_size, max_buf_size);
-    cleanup();
-    return EXIT_SUCCESS;
-}
-
-#else
-
-/*
- * Function:    main
- * Purpose:     Dummy main() function for if HDF5 was configured without
- *              zlib stuff.
- * Return:      EXIT_SUCCESS
- * Programmer:  Bill Wendling, 10. June 2002
- * Modifications:
- */
-int
-main(void)
-{
-    HDfprintf(stdout, "No compression IO performance because zlib was not configured\n");
-    return EXIT_SUCCESS;
-}
-
-#endif  /* !H5_HAVE_FILTER_DEFLATE */
diff --git a/tools/src/CMakeLists.txt b/tools/src/CMakeLists.txt
new file mode 100644
index 0000000..37680dd
--- /dev/null
+++ b/tools/src/CMakeLists.txt
@@ -0,0 +1,37 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC)
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-- Add the h5diff and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5diff)
+
+#-- Add the h5ls executable
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5ls)
+
+#-- Misc Executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/misc)
+
+#-- Add the h5import and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5import)
+
+#-- h5Repack executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5repack)
+
+#-- Add the h5dump and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5jam)
+
+#-- Add the h5copy and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5copy)
+
+#-- Add the h5stat and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5stat)
+
+#-- Add the h5dump and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5dump)
+
+#-- Add the h5format_convert and test executables
+add_subdirectory (${HDF5_TOOLS_SRC_SOURCE_DIR}/h5format_convert)
diff --git a/tools/src/Makefile.am b/tools/src/Makefile.am
new file mode 100644
index 0000000..beceee5
--- /dev/null
+++ b/tools/src/Makefile.am
@@ -0,0 +1,28 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
+##
+#
+# Tools HDF5 Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+CONFIG=ordered
+
+# All subdirectories
+SUBDIRS=h5diff h5ls h5dump misc h5import h5repack h5jam h5copy \
+	h5format_convert h5stat 
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/Makefile.in b/tools/src/Makefile.in
new file mode 100644
index 0000000..5e45599
--- /dev/null
+++ b/tools/src/Makefile.in
@@ -0,0 +1,1433 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tools HDF5 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@
+TESTS =
+subdir = tools/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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_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 = 
+SOURCES =
+DIST_SOURCES =
+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
+# *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)
+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
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(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@
+
+# 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@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+CONFIG = ordered
+
+# All subdirectories
+SUBDIRS = h5diff h5ls h5dump misc h5import h5repack h5jam h5copy \
+	h5format_convert h5stat 
+
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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-recursive
+
+.SUFFIXES:
+.SUFFIXES: .log .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/src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/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):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+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-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 \
+	  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-recursive
+
+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-recursive
+
+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 
+	@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
+	@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-TESTS
+check: check-recursive
+all-am: Makefile all-local
+installdirs: installdirs-recursive
+installdirs-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-recursive
+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-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.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-generic clean-libtool \
+	cscopelist-am ctags ctags-am distclean 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 installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean 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-dyn: $(DYN)
+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 dyn 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/src/h5copy/CMakeLists.txt b/tools/src/h5copy/CMakeLists.txt
new file mode 100644
index 0000000..d1f5f50
--- /dev/null
+++ b/tools/src/h5copy/CMakeLists.txt
@@ -0,0 +1,54 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5COPY)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5copy and test executables
+# --------------------------------------------------------------------
+add_executable (h5copy ${HDF5_TOOLS_SRC_H5COPY_SOURCE_DIR}/h5copy.c)
+TARGET_NAMING (h5copy STATIC)
+TARGET_C_PROPERTIES (h5copy STATIC " " " ")
+target_link_libraries (h5copy  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5copy PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5copy")
+
+set (H5_DEP_EXECUTABLES h5copy)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5copy-shared ${HDF5_TOOLS_SRC_H5COPY_SOURCE_DIR}/h5copy.c)
+  TARGET_NAMING (h5copy-shared SHARED)
+  TARGET_C_PROPERTIES (h5copy-shared SHARED " " " ")
+  target_link_libraries (h5copy-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5copy-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5copy-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5copy-shared)
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5copy-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5copy ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5copy/Makefile.am b/tools/src/h5copy/Makefile.am
new file mode 100644
index 0000000..d67fafc
--- /dev/null
+++ b/tools/src/h5copy/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# This is our main target, the h5copy tool
+bin_PROGRAMS=h5copy
+check_PROGRAMS=$(TEST_PROG)
+
+# Add h5copy specific linker flags here
+h5copy_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES+=*.h5
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5copy/Makefile.in b/tools/src/h5copy/Makefile.in
new file mode 100644
index 0000000..6816744
--- /dev/null
+++ b/tools/src/h5copy/Makefile.in
@@ -0,0 +1,1467 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5copy$(EXEEXT)
+check_PROGRAMS =
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5copy_SOURCES = h5copy.c
+h5copy_OBJECTS = h5copy.$(OBJEXT)
+h5copy_LDADD = $(LDADD)
+h5copy_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 = 
+h5copy_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5copy_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 = h5copy.c
+DIST_SOURCES = h5copy.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 $(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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
+
+# Add h5copy specific linker flags here
+h5copy_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5copy/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5copy/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):
+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
+
+h5copy$(EXEEXT): $(h5copy_OBJECTS) $(h5copy_DEPENDENCIES) $(EXTRA_h5copy_DEPENDENCIES) 
+	@rm -f h5copy$(EXEEXT)
+	$(AM_V_CCLD)$(h5copy_LINK) $(h5copy_OBJECTS) $(h5copy_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5copy.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+.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 $(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)
+
+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-dyn: $(DYN)
+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 dyn 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/src/h5copy/h5copy.c b/tools/src/h5copy/h5copy.c
new file mode 100644
index 0000000..390b93e
--- /dev/null
+++ b/tools/src/h5copy/h5copy.c
@@ -0,0 +1,532 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include <string.h>
+#include <stdlib.h>
+
+/* Name of tool */
+#define PROGRAMNAME "h5copy"
+
+/* command-line options: short and long-named parameters */
+static const char *s_opts = "d:f:hi:o:ps:vVE";
+static struct long_options l_opts[] = {
+    { "destination", require_arg, 'd' },
+    { "flag", require_arg, 'f' },
+    { "help", no_arg, 'h' },
+    { "input", require_arg, 'i' },
+    { "output", require_arg, 'o' },
+    { "parents", no_arg, 'p' },
+    { "source", require_arg, 's' },
+    { "verbose", no_arg, 'v' },
+    { "version", no_arg, 'V' },
+    { "enable-error-stack", no_arg, 'E' },
+    { NULL, 0, '\0' }
+};
+char         *fname_src = NULL;
+char         *fname_dst = NULL;
+char         *oname_src = NULL;
+char         *oname_dst = NULL;
+char         *str_flag = NULL;
+
+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown MPI & HDF5 and call exit()
+ *
+ * Return:      Does not return
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, 31. January 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    if (fname_src)
+        HDfree(fname_src);
+    if (fname_dst)
+        HDfree(fname_dst);
+    if (oname_dst)
+        HDfree(oname_dst);
+    if (oname_src)
+        HDfree(oname_src);
+    if (str_flag)
+        HDfree(str_flag);
+
+    h5tools_close();
+    HDexit(ret);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente Nunes, 7/8/2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (void)
+{
+    FLUSHSTREAM(rawoutstream);
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "usage: h5copy [OPTIONS] [OBJECTS...]\n");
+    PRINTVALSTREAM(rawoutstream, "   OBJECTS\n");
+    PRINTVALSTREAM(rawoutstream, "      -i, --input        input file name\n");
+    PRINTVALSTREAM(rawoutstream, "      -o, --output       output file name\n");
+    PRINTVALSTREAM(rawoutstream, "      -s, --source       source object name\n");
+    PRINTVALSTREAM(rawoutstream, "      -d, --destination  destination object name\n");
+    PRINTVALSTREAM(rawoutstream, "   OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "      -h, --help         Print a usage message and exit\n");
+    PRINTVALSTREAM(rawoutstream, "      -p, --parents      No error if existing, make parent groups as needed\n");
+    PRINTVALSTREAM(rawoutstream, "      -v, --verbose      Print information about OBJECTS and OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "      -V, --version      Print version number and exit\n");
+    PRINTVALSTREAM(rawoutstream, "      -f, --flag         Flag type\n\n");
+    PRINTVALSTREAM(rawoutstream, "      Flag type is one of the following strings:\n\n");
+    PRINTVALSTREAM(rawoutstream, "      shallow     Copy only immediate members for groups\n\n");
+    PRINTVALSTREAM(rawoutstream, "      soft        Expand soft links into new objects\n\n");
+    PRINTVALSTREAM(rawoutstream, "      ext         Expand external links into new objects\n\n");
+    PRINTVALSTREAM(rawoutstream, "      ref         Copy references and any referenced objects, i.e., objects\n");
+    PRINTVALSTREAM(rawoutstream, "                  that the references point to.\n");
+    PRINTVALSTREAM(rawoutstream, "                    Referenced objects are copied in addition to the objects\n");
+    PRINTVALSTREAM(rawoutstream, "                  specified on the command line and reference datasets are\n");
+    PRINTVALSTREAM(rawoutstream, "                  populated with correct reference values. Copies of referenced\n");
+    PRINTVALSTREAM(rawoutstream, "                  datasets outside the copy range specified on the command line\n");
+    PRINTVALSTREAM(rawoutstream, "                  will normally have a different name from the original.\n");
+    PRINTVALSTREAM(rawoutstream, "                    (Default:Without this option, reference value(s) in any\n");
+    PRINTVALSTREAM(rawoutstream, "                  reference datasets are set to NULL and referenced objects are\n");
+    PRINTVALSTREAM(rawoutstream, "                  not copied unless they are otherwise within the copy range\n");
+    PRINTVALSTREAM(rawoutstream, "                  specified on the command line.)\n\n");
+    PRINTVALSTREAM(rawoutstream, "      noattr      Copy object without copying attributes\n\n");
+    PRINTVALSTREAM(rawoutstream, "      allflags    Switches all flags from the default to the non-default setting\n\n");
+    PRINTVALSTREAM(rawoutstream, "      These flag types correspond to the following API symbols\n\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_SHALLOW_HIERARCHY_FLAG\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_EXPAND_SOFT_LINK_FLAG\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_EXPAND_EXT_LINK_FLAG\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_EXPAND_REFERENCE_FLAG\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_WITHOUT_ATTR_FLAG\n");
+    PRINTVALSTREAM(rawoutstream, "      H5O_COPY_ALL\n");
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: parse_flag
+ *
+ * Purpose: read the flag -f STRING
+ *
+ * STRING is one of the following (API symbol and description)
+ *
+ * shallow  H5O_COPY_SHALLOW_HIERARCHY_FLAG:  Copy only immediate members for groups
+ * soft     H5O_COPY_EXPAND_SOFT_LINK_FLAG:  Expand soft links into new objects
+ * ext      H5O_COPY_EXPAND_EXT_LINK_FLAG: Expand external links into new objects
+ * ref      H5O_COPY_EXPAND_OBJ_REFERENCE_FLAG: Copy objects that are pointed by references
+ * noattr   H5O_COPY_WITHOUT_ATTR_FLAG Copy object without copying attributes
+ * allflags Switches all flags from the default to the non-default setting
+ *
+ * Return: Success:    SUCCEED
+ *         Failure:    FAIL
+ *
+ * Programmer: Pedro Vicente Nunes, 7/8/2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+static int parse_flag(const char* s_flag, unsigned *flag)
+{
+    unsigned fla=0;
+
+    if (HDstrcmp(s_flag,"shallow")==0)
+    {
+        fla = H5O_COPY_SHALLOW_HIERARCHY_FLAG;
+    }
+    else  if (HDstrcmp(s_flag,"soft")==0)
+    {
+        fla = H5O_COPY_EXPAND_SOFT_LINK_FLAG;
+    }
+    else  if (HDstrcmp(s_flag,"ext")==0)
+    {
+        fla = H5O_COPY_EXPAND_EXT_LINK_FLAG;
+    }
+    else  if (HDstrcmp(s_flag,"ref")==0)
+    {
+        fla = H5O_COPY_EXPAND_REFERENCE_FLAG;
+    }
+    else  if (HDstrcmp(s_flag,"noattr")==0)
+    {
+        fla = H5O_COPY_WITHOUT_ATTR_FLAG;
+    }
+    else  if (HDstrcmp(s_flag,"allflags")==0)
+    {
+        fla = H5O_COPY_ALL;
+    }
+    else  if (HDstrcmp(s_flag,"nullmsg")==0)
+    {
+        fla = H5O_COPY_PRESERVE_NULL_FLAG;
+    }
+    else
+    {
+        error_msg("Error in input flag\n");
+        return -1;
+    }
+
+    *flag = (*flag) | fla;
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: main program
+ *
+ * Programmer: Pedro Vicente Nunes
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+main (int argc, const char *argv[])
+{
+    int            ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    H5E_auto2_t         func;
+    H5E_auto2_t         tools_func;
+    void               *edata;
+    void               *tools_edata;
+    hid_t        fid_src = -1;
+    hid_t        fid_dst = -1;
+    unsigned     flag = 0;
+    unsigned     verbose = 0;
+    unsigned     parents = 0;
+    hid_t        ocpl_id = (-1);          /* Object copy property list */
+    hid_t        lcpl_id = (-1);          /* Link creation property list */
+    int          opt;
+    int          li_ret;
+    h5tool_link_info_t linkinfo;
+
+    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();
+
+    /* Disable tools error reporting */
+    H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
+    H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL);
+
+    /* init linkinfo struct */
+    HDmemset(&linkinfo, 0, sizeof(h5tool_link_info_t));
+
+    /* Check for no command line parameters */
+    if(argc == 1)
+    {
+        usage();
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
+    {
+        switch ((char)opt)
+        {
+        case 'd':
+            oname_dst = HDstrdup(opt_arg);
+            break;
+
+        case 'f':
+            /* validate flag */
+            if (parse_flag(opt_arg,&flag)<0)
+            {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+            str_flag = HDstrdup(opt_arg);
+            break;
+
+        case 'h':
+            usage();
+            leave(EXIT_SUCCESS);
+            break;
+
+        case 'i':
+            fname_src = HDstrdup(opt_arg);
+            break;
+
+        case 'o':
+            fname_dst = HDstrdup(opt_arg);
+            break;
+
+        case 'p':
+            parents = 1;
+            break;
+
+        case 's':
+            oname_src = HDstrdup(opt_arg);
+            break;
+
+        case 'V':
+            print_version(h5tools_getprogname());
+            leave(EXIT_SUCCESS);
+            break;
+
+        case 'v':
+            verbose = 1;
+            break;
+
+        case 'E':
+            enable_error_stack = TRUE;
+            break;
+
+        default:
+            usage();
+            leave(EXIT_FAILURE);
+        }
+    } /* end of while */
+
+/*-------------------------------------------------------------------------
+ * check for missing file/object names
+ *-------------------------------------------------------------------------*/
+
+    if (fname_src==NULL)
+    {
+        error_msg("Input file name missing\n");
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    if (fname_dst==NULL)
+    {
+        error_msg("Output file name missing\n");
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    if (oname_src==NULL)
+    {
+        error_msg("Source object name missing\n");
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    if (oname_dst==NULL)
+    {
+        error_msg("Destination object name missing\n");
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    if (enable_error_stack) {
+        H5Eset_auto2(H5E_DEFAULT, func, edata);
+        H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata);
+    }
+
+   /*-------------------------------------------------------------------------
+    * open output file
+    *-------------------------------------------------------------------------*/
+
+    /* Attempt to open an existing HDF5 file first. Need to open the dst file
+       before the src file just in case that the dst and src are the same file
+     */
+    fid_dst = h5tools_fopen(fname_dst, H5F_ACC_RDWR, H5P_DEFAULT, NULL, NULL, 0);
+
+   /*-------------------------------------------------------------------------
+    * open input file
+    *-------------------------------------------------------------------------*/
+
+    fid_src = h5tools_fopen(fname_src, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0);
+
+   /*-------------------------------------------------------------------------
+    * test for error in opening input file
+    *-------------------------------------------------------------------------*/
+    if (fid_src==-1)
+    {
+        error_msg("Could not open input file <%s>...Exiting\n", fname_src);
+        leave(EXIT_FAILURE);
+    }
+
+
+   /*-------------------------------------------------------------------------
+    * create an output file when failed to open it
+    *-------------------------------------------------------------------------*/
+
+    /* If we couldn't open an existing file, try creating file */
+    /* (use "EXCL" instead of "TRUNC", so we don't blow away existing non-HDF5 file) */
+    if(fid_dst < 0)
+        fid_dst = H5Fcreate(fname_dst, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
+
+   /*-------------------------------------------------------------------------
+    * test for error in opening output file
+    *-------------------------------------------------------------------------*/
+    if (fid_dst==-1)
+    {
+        error_msg("Could not open output file <%s>...Exiting\n", fname_dst);
+        leave(EXIT_FAILURE);
+    }
+
+   /*-------------------------------------------------------------------------
+    * print some info
+    *-------------------------------------------------------------------------*/
+
+    if (verbose)
+    {
+        printf("Copying file <%s> and object <%s> to file <%s> and object <%s>\n",
+        fname_src, oname_src, fname_dst, oname_dst);
+        if (flag) {
+            HDassert(str_flag);
+            printf("Using %s flag\n", str_flag);
+        }
+    }
+
+
+   /*-------------------------------------------------------------------------
+    * create property lists for copy
+    *-------------------------------------------------------------------------*/
+
+    /* create property to pass copy options */
+    if ( (ocpl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0)
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pcreate failed");
+
+    /* set options for object copy */
+    if (flag)
+    {
+        if ( H5Pset_copy_object(ocpl_id, flag) < 0)
+            HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pset_copy_object failed");
+    }
+
+    /* Create link creation property list */
+    if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) {
+        error_msg("Could not create link creation property list\n");
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pcreate failed");
+    } /* end if */
+
+    /* Check for creating intermediate groups */
+    if(parents) {
+        /* Set the intermediate group creation property */
+        if(H5Pset_create_intermediate_group(lcpl_id, 1) < 0) {
+            error_msg("Could not set property for creating parent groups\n");
+            HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pset_create_intermediate_group failed");
+        } /* end if */
+
+        /* Display some output if requested */
+        if(verbose)
+            printf("%s: Creating parent groups\n", h5tools_getprogname());
+    } /* end if */
+    else /* error, if parent groups doesn't already exist in destination file */
+    {
+        size_t        i, len;
+
+        len = HDstrlen(oname_dst);
+
+        /* check if all the parents groups exist. skip root group */
+        for (i = 1; i < len; i++)
+        {
+            if ('/'==oname_dst[i])
+            {
+                char         *str_ptr;
+
+                str_ptr = (char *)HDcalloc(i + 1, sizeof(char));
+                HDstrncpy(str_ptr, oname_dst, i);
+                str_ptr[i]='\0';
+                if (H5Lexists(fid_dst, str_ptr, H5P_DEFAULT) <= 0)
+                {
+                    error_msg("group <%s> doesn't exist. Use -p to create parent groups.\n", str_ptr);
+                    HDfree(str_ptr);
+                    HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Lexists failed");
+                }
+                HDfree(str_ptr);
+            }
+        }
+    }
+
+   /*-------------------------------------------------------------------------
+    * do the copy
+    *-------------------------------------------------------------------------*/
+
+    if(verbose)
+        linkinfo.opt.msg_mode = 1;
+
+    li_ret = H5tools_get_symlink_info(fid_src, oname_src, &linkinfo, 1);
+    if (li_ret == 0) /* dangling link */
+    {
+        if(H5Lcopy(fid_src, oname_src,
+                   fid_dst, oname_dst,
+                   H5P_DEFAULT, H5P_DEFAULT) < 0)
+            HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Lcopy failed");
+    }
+    else /* valid link */
+    {
+        if (H5Ocopy(fid_src,          /* Source file or group identifier */
+                  oname_src,        /* Name of the source object to be copied */
+                  fid_dst,          /* Destination file or group identifier  */
+                  oname_dst,        /* Name of the destination object  */
+                  ocpl_id,          /* Object copy property list */
+                  lcpl_id)<0)       /* Link creation property list */
+            HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Ocopy failed");
+    }
+
+    /* free link info path */
+    if (linkinfo.trg_path)
+        HDfree(linkinfo.trg_path);
+
+    /* close propertis */
+    if(H5Pclose(ocpl_id)<0)
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pclose failed");
+    if(H5Pclose(lcpl_id)<0)
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pclose failed");
+
+    /* close files */
+    if (H5Fclose(fid_src)<0)
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Fclose failed");
+    if (H5Fclose(fid_dst)<0)
+        HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Fclose failed");
+
+    leave(EXIT_SUCCESS);
+
+done:
+    printf("Error in copy...Exiting\n");
+
+    /* free link info path */
+    if (linkinfo.trg_path)
+        HDfree(linkinfo.trg_path);
+
+ H5E_BEGIN_TRY {
+    H5Pclose(ocpl_id);
+    H5Pclose(lcpl_id);
+    H5Fclose(fid_src);
+    H5Fclose(fid_dst);
+ } H5E_END_TRY;
+
+ leave(ret_value);
+}
+
diff --git a/tools/src/h5diff/CMakeLists.txt b/tools/src/h5diff/CMakeLists.txt
new file mode 100644
index 0000000..00d93de
--- /dev/null
+++ b/tools/src/h5diff/CMakeLists.txt
@@ -0,0 +1,84 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5DIFF)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5diff executables
+# --------------------------------------------------------------------
+add_executable (h5diff
+    ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/h5diff_common.c
+    ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/h5diff_main.c
+)
+TARGET_NAMING (h5diff STATIC)
+TARGET_C_PROPERTIES (h5diff STATIC " " " ")
+target_link_libraries (h5diff  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5diff PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5diff")
+
+set (H5_DEP_EXECUTABLES h5diff)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5diff-shared
+      ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/h5diff_common.c
+      ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/h5diff_main.c
+  )
+  TARGET_NAMING (h5diff-shared SHARED)
+  TARGET_C_PROPERTIES (h5diff-shared SHARED " " " ")
+  target_link_libraries (h5diff-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5diff-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5diff-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5diff-shared)
+endif ()
+
+if (H5_HAVE_PARALLEL)
+  add_executable (ph5diff
+      ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/h5diff_common.c
+      ${HDF5_TOOLS_SRC_H5DIFF_SOURCE_DIR}/ph5diff_main.c
+  )
+  TARGET_NAMING (ph5diff STATIC)
+  TARGET_C_PROPERTIES (ph5diff STATIC " " " ")
+  target_link_libraries (ph5diff  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+  set_target_properties (ph5diff PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};ph5diff")
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5diff-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5diff ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+
+  if (H5_HAVE_PARALLEL)
+    #INSTALL_PROGRAM_PDB (ph5diff ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+    install (
+        TARGETS
+            ph5diff
+        EXPORT
+            ${HDF5_EXPORTED_TARGETS}
+        RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+    )
+  endif ()
+endif ()
diff --git a/tools/src/h5diff/Makefile.am b/tools/src/h5diff/Makefile.am
new file mode 100644
index 0000000..3957e59
--- /dev/null
+++ b/tools/src/h5diff/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Always build and test h5diff but build and test ph5diff only if parallel
+# is enabled.
+if BUILD_PARALLEL_CONDITIONAL
+  H5PDIFF=ph5diff
+endif
+
+# Our main target, h5diff
+bin_PROGRAMS=h5diff $(H5PDIFF)
+
+# Add h5diff specific linker flags here
+h5diff_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Source files for the program
+h5diff_SOURCES=h5diff_main.c h5diff_common.c
+ph5diff_SOURCES=ph5diff_main.c h5diff_common.c
+
+# Programs depend on the main HDF5 library and tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
+
diff --git a/tools/src/h5diff/Makefile.in b/tools/src/h5diff/Makefile.in
new file mode 100644
index 0000000..c998b7f
--- /dev/null
+++ b/tools/src/h5diff/Makefile.in
@@ -0,0 +1,1470 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5diff$(EXEEXT) $(am__EXEEXT_1)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 =
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@am__EXEEXT_1 = ph5diff$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_h5diff_OBJECTS = h5diff_main.$(OBJEXT) h5diff_common.$(OBJEXT)
+h5diff_OBJECTS = $(am_h5diff_OBJECTS)
+h5diff_LDADD = $(LDADD)
+h5diff_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 = 
+h5diff_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5diff_LDFLAGS) $(LDFLAGS) -o $@
+am_ph5diff_OBJECTS = ph5diff_main.$(OBJEXT) h5diff_common.$(OBJEXT)
+ph5diff_OBJECTS = $(am_ph5diff_OBJECTS)
+ph5diff_LDADD = $(LDADD)
+ph5diff_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 = $(h5diff_SOURCES) $(ph5diff_SOURCES)
+DIST_SOURCES = $(h5diff_SOURCES) $(ph5diff_SOURCES)
+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 $(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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Always build and test h5diff but build and test ph5diff only if parallel
+# is enabled.
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@H5PDIFF = ph5diff
+
+# Add h5diff specific linker flags here
+h5diff_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Source files for the program
+h5diff_SOURCES = h5diff_main.c h5diff_common.c
+ph5diff_SOURCES = ph5diff_main.c h5diff_common.c
+
+# Programs depend on the main HDF5 library and tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5diff/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5diff/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):
+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
+
+h5diff$(EXEEXT): $(h5diff_OBJECTS) $(h5diff_DEPENDENCIES) $(EXTRA_h5diff_DEPENDENCIES) 
+	@rm -f h5diff$(EXEEXT)
+	$(AM_V_CCLD)$(h5diff_LINK) $(h5diff_OBJECTS) $(h5diff_LDADD) $(LIBS)
+
+ph5diff$(EXEEXT): $(ph5diff_OBJECTS) $(ph5diff_DEPENDENCIES) $(EXTRA_ph5diff_DEPENDENCIES) 
+	@rm -f ph5diff$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ph5diff_OBJECTS) $(ph5diff_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diff_common.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diff_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ph5diff_main.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-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)
+
+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 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 \
+	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-dyn: $(DYN)
+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 dyn 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/src/h5diff/h5diff_common.c b/tools/src/h5diff/h5diff_common.c
new file mode 100644
index 0000000..5437803
--- /dev/null
+++ b/tools/src/h5diff/h5diff_common.c
@@ -0,0 +1,605 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "H5private.h"
+#include "h5diff.h"
+#include "h5diff_common.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+static int check_n_input( const char* );
+static int check_p_input( const char* );
+static int check_d_input( const char* );
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters.
+ */
+static const char *s_opts = "hVrv:qn:d:p:Nc";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "version", no_arg, 'V' },
+    { "report", no_arg, 'r' },
+    { "verbose", optional_arg, 'v' },
+    { "quiet", no_arg, 'q' },
+    { "count", require_arg, 'n' },
+    { "delta", require_arg, 'd' },
+    { "relative", require_arg, 'p' },
+    { "nan", no_arg, 'N' },
+    { "compare", no_arg, 'c' },
+    { "use-system-epsilon", no_arg, 'e' },
+    { "follow-symlinks", no_arg, 'l' },
+    { "no-dangling-links", no_arg, 'x' },
+    { "exclude-path", require_arg, 'E' },
+    { NULL, 0, '\0' }
+};
+
+/*-------------------------------------------------------------------------
+ * Function: check_options
+ *
+ * Purpose: parse command line input
+ *
+ *-------------------------------------------------------------------------
+ */
+static void check_options(diff_opt_t* options)
+{
+    /*--------------------------------------------------------------
+     * check for mutually exclusive options 
+     *--------------------------------------------------------------*/
+
+    /* check between -d , -p, --use-system-epsilon.
+     * These options are mutually exclusive.
+     */
+    if ((options->d + options->p + options->use_system_epsilon) > 1)
+    {
+        printf("%s error: -d, -p and --use-system-epsilon options are mutually-exclusive;\n", PROGRAMNAME);
+        printf("use no more than one.\n");
+        printf("Try '-h' or '--help' option for more information or see the %s entry in the 'HDF5 Reference Manual'.\n", PROGRAMNAME);
+        h5diff_exit(EXIT_FAILURE);
+    }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: parse command line input
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void parse_command_line(int argc,
+                        const char* argv[],
+                        const char** fname1,
+                        const char** fname2,
+                        const char** objname1,
+                        const char** objname2,
+                        diff_opt_t* options)
+{
+    int i;
+    int opt;
+    struct exclude_path_list *exclude_head, *exclude_prev, *exclude_node;
+
+    /* process the command-line */
+    memset(options, 0, sizeof (diff_opt_t));
+
+    /* assume equal contents initially */
+    options->contents = 1;
+
+    /* NaNs are handled by default */
+    options->do_nans = 1;
+
+    /* not Listing objects that are not comparable */
+    options->m_list_not_cmp = 0;
+
+    /* initially no not-comparable. */
+    /**this is bad in mixing option with results**/
+    options->not_cmp=0;
+
+    /* init for exclude-path option */
+    exclude_head = NULL;
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
+    {
+        switch ((char)opt)
+        {
+        default:
+            usage();
+            h5diff_exit(EXIT_FAILURE);
+        case 'h':
+            usage();
+            h5diff_exit(EXIT_SUCCESS);
+        case 'V':
+            print_version(h5tools_getprogname());
+            h5diff_exit(EXIT_SUCCESS);
+        case 'v':
+            options->m_verbose = 1;
+            /* This for loop is for handling style like 
+             * -v, -v1, --verbose, --verbose=1.
+             */
+            for (i = 1; i < argc; i++)
+            {                
+                /* 
+                 * short opt 
+                 */
+                if (!strcmp (argv[i], "-v"))  /* no arg */
+            {
+                    opt_ind--;
+                    options->m_verbose_level = 0;
+                    break;
+            }
+                else if (!strncmp (argv[i], "-v", (size_t)2))
+            {
+                    options->m_verbose_level = atoi(&argv[i][2]);
+                    break;
+            }    
+
+                /* 
+                 * long opt 
+                 */
+                if (!strcmp (argv[i], "--verbose"))  /* no arg */
+            {
+                    options->m_verbose_level = 0;
+                    break;
+            }
+            else if ( !strncmp (argv[i], "--verbose", (size_t)9) && argv[i][9]=='=')
+            {
+                    options->m_verbose_level = atoi(&argv[i][10]);
+                    break;
+                }
+            }
+            break;
+        case 'q':
+            /* use quiet mode; supress the message "0 differences found" */
+            options->m_quiet = 1;
+            break;
+        case 'r':
+            options->m_report = 1;
+            break;
+        case 'l':
+            options->follow_links = TRUE;
+            break;
+        case 'x':
+            options->no_dangle_links = 1;
+            break;
+        case 'E':
+            options->exclude_path = 1;
+            
+            /* create linked list of excluding objects */
+            if( (exclude_node = (struct exclude_path_list*) HDmalloc(sizeof(struct exclude_path_list))) == NULL)
+            {
+                printf("Error: lack of memory!\n");
+                h5diff_exit(EXIT_FAILURE);
+            }
+
+            /* init */
+            exclude_node->obj_path = (char*)opt_arg;
+            exclude_node->obj_type = H5TRAV_TYPE_UNKNOWN;
+            exclude_prev = exclude_head;
+            
+            if (NULL == exclude_head)            
+            {
+                exclude_head = exclude_node;
+                exclude_head->next = NULL;
+            }
+            else
+            {
+                while(NULL != exclude_prev->next)
+                    exclude_prev=exclude_prev->next;
+
+                exclude_node->next = NULL;
+                exclude_prev->next = exclude_node;
+            }            
+            break;
+        case 'd':
+            options->d=1;
+
+            if ( check_d_input( opt_arg )==-1)
+            {
+                printf("<-d %s> is not a valid option\n", opt_arg );
+                usage();
+                h5diff_exit(EXIT_FAILURE);
+            }
+            options->delta = atof( opt_arg );
+
+            /* -d 0 is the same as default */
+            if (H5_DBL_ABS_EQUAL(options->delta, (double)0.0F))
+            options->d=0;
+
+            break;
+
+        case 'p':
+
+            options->p=1;
+            if ( check_p_input( opt_arg )==-1)
+            {
+                printf("<-p %s> is not a valid option\n", opt_arg );
+                usage();
+                h5diff_exit(EXIT_FAILURE);
+            }
+            options->percent = atof( opt_arg );
+
+            /* -p 0 is the same as default */
+            if (H5_DBL_ABS_EQUAL(options->percent, (double)0.0F))
+            options->p = 0;
+
+            break;
+
+        case 'n':
+
+            options->n=1;
+            if ( check_n_input( opt_arg )==-1)
+            {
+                printf("<-n %s> is not a valid option\n", opt_arg );
+                usage();
+                h5diff_exit(EXIT_FAILURE);
+            }
+            options->count = HDstrtoull(opt_arg, NULL, 0);
+            break;
+
+        case 'N':
+            options->do_nans = 0;
+            break;
+
+        case 'c':
+            options->m_list_not_cmp = 1;
+            break;
+
+        case 'e':
+            options->use_system_epsilon = 1;
+            break;
+        }
+    }
+
+    /* check options */
+    check_options(options);
+
+    /* if exclude-path option is used, keep the exclude path list */
+    if (options->exclude_path)
+        options->exclude = exclude_head;
+
+    /* check for file names to be processed */
+    if (argc <= opt_ind || argv[ opt_ind + 1 ] == NULL)
+    {
+        error_msg("missing file names\n");
+        usage();
+        h5diff_exit(EXIT_FAILURE);
+    }
+
+    *fname1 = argv[ opt_ind ];
+    *fname2 = argv[ opt_ind + 1 ];
+    *objname1 = argv[ opt_ind + 2 ];
+
+    if ( *objname1 == NULL )
+    {
+        *objname2 = NULL;
+        return;
+    }
+
+    if ( argv[ opt_ind + 3 ] != NULL)
+    {
+        *objname2 = argv[ opt_ind + 3 ];
+    }
+    else
+    {
+        *objname2 = *objname1;
+    }
+
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_info
+ *
+ * Purpose: print several information messages after h5diff call
+ *
+ *-------------------------------------------------------------------------
+ */
+
+ void  print_info(diff_opt_t* options)
+ {
+     if (options->m_quiet || options->err_stat )
+         return;
+
+     if (options->cmn_objs==0)
+     {
+         printf("No common objects found. Files are not comparable.\n");
+         if (!options->m_verbose)
+             printf("Use -v for a list of objects.\n");
+     }
+
+     if (options->not_cmp==1)
+     {
+         if ( options->m_list_not_cmp == 0 )
+         {
+             printf("--------------------------------\n");
+             printf("Some objects are not comparable\n");
+             printf("--------------------------------\n");
+             if (options->m_verbose)
+                 printf("Use -c for a list of objects without details of differences.\n");
+             else
+                 printf("Use -c for a list of objects.\n");
+         }
+
+
+     }
+
+ }
+
+/*-------------------------------------------------------------------------
+ * Function: check_n_input
+ *
+ * Purpose: check for valid input
+ *
+ * Return: 1 for ok, -1 for fail
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE static int
+check_n_input( const char *str )
+{
+    unsigned i;
+    char c;
+
+    for ( i = 0; i < strlen(str); i++)
+    {
+        c = str[i];
+        if ( i==0 )
+        {
+            if ( c < 49 || c > 57  ) /* ascii values between 1 and 9 */
+                return -1;
+        }
+        else
+            if ( c < 48 || c > 57  ) /* 0 also */
+                return -1;
+    }
+    return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: check_p_input
+ *
+ * Purpose: check for a valid p option input
+ *
+ * Return: 1 for ok, -1 for fail
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_p_input( const char *str )
+{
+    double x;
+
+    /*
+    the atof return value on a hexadecimal input is different
+    on some systems; we do a character check for this
+    */
+    if (strlen(str)>2 && str[0]=='0' && str[1]=='x')
+        return -1;
+
+    x=atof(str);
+    if (x<0)
+        return -1;
+
+    return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: check_d_input
+ *
+ * Purpose: check for a valid d option input
+ *
+ * Return: 1 for ok, -1 for fail
+ *
+ * Date: November 11, 2007
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_d_input( const char *str )
+{
+    double x;
+
+    /*
+    the atof return value on a hexadecimal input is different
+    on some systems; we do a character check for this
+    */
+    if (strlen(str)>2 && str[0]=='0' && str[1]=='x')
+        return -1;
+
+    x=atof(str);
+    if (x <0)
+        return -1;
+
+    return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: print a usage message
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void usage(void)
+{
+ printf("usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]] \n");
+ printf("  file1             File name of the first HDF5 file\n");
+ printf("  file2             File name of the second HDF5 file\n");
+ printf("  [obj1]            Name of an HDF5 object, in absolute path\n");
+ printf("  [obj2]            Name of an HDF5 object, in absolute path\n");
+ printf("\n");
+ printf("  OPTIONS\n");
+ printf("   -h, --help\n");
+ printf("         Print a usage message and exit.\n");
+ printf("   -V, --version\n");
+ printf("         Print version number and exit.\n");
+ printf("   -r, --report\n");
+ printf("         Report mode. Print differences.\n");
+ printf("   -v --verbose\n");
+ printf("         Verbose mode. Print differences information and list of objects.\n");
+ printf("   -vN --verbose=N\n");
+ printf("         Verbose mode with level. Print differences and list of objects.\n");
+ printf("         Level of detail depends on value of N:\n");
+ printf("          0 : Identical to '-v' or '--verbose'.\n");
+ printf("          1 : All level 0 information plus one-line attribute\n");
+ printf("              status summary.\n");
+ printf("          2 : All level 1 information plus extended attribute\n");
+ printf("              status report.\n");
+ printf("   -q, --quiet\n");
+ printf("         Quiet mode. Do not produce output.\n");
+ printf("   --follow-symlinks\n");
+ printf("         Follow symbolic links (soft links and external links and compare the)\n");
+ printf("         links' target objects.\n");
+ printf("         If symbolic link(s) with the same name exist in the files being\n");
+ printf("         compared, then determine whether the target of each link is an existing\n");
+ printf("         object (dataset, group, or named datatype) or the link is a dangling\n");
+ printf("         link (a soft or external link pointing to a target object that does\n");
+ printf("         not yet exist).\n");
+ printf("         - If both symbolic links are dangling links, they are treated as being\n");
+ printf("           the same; by default, h5diff returns an exit code of 0.\n");
+ printf("           If, however, --no-dangling-links is used with --follow-symlinks,\n");
+ printf("           this situation is treated as an error and h5diff returns an\n");
+ printf("           exit code of 2.\n");
+ printf("         - If only one of the two links is a dangling link,they are treated as\n");
+ printf("           being different and h5diff returns an exit code of 1.\n");
+ printf("           If, however, --no-dangling-links is used with --follow-symlinks,\n");
+ printf("           this situation is treated as an error and h5diff returns an\n");
+ printf("           exit code of 2.\n");
+ printf("         - If both symbolic links point to existing objects, h5diff compares the\n");
+ printf("           two objects.\n");
+ printf("         If any symbolic link specified in the call to h5diff does not exist,\n");
+ printf("         h5diff treats it as an error and returns an exit code of 2.\n");
+ printf("   --no-dangling-links\n");
+ printf("         Must be used with --follow-symlinks option; otherwise, h5diff shows\n");
+ printf("         error message and returns an exit code of 2.\n");
+ printf("         Check for any symbolic links (soft links or external links) that do not\n");
+ printf("         resolve to an existing object (dataset, group, or named datatype).\n");
+ printf("         If any dangling link is found, this situation is treated as an error\n");
+ printf("         and h5diff returns an exit code of 2.\n");
+ printf("   -c, --compare\n");
+ printf("         List objects that are not comparable\n");
+ printf("   -N, --nan\n");
+ printf("         Avoid NaNs detection\n");
+ printf("   -n C, --count=C\n");
+ printf("         Print differences up to C. C must be a positive integer.\n");
+ printf("   -d D, --delta=D\n");
+ printf("         Print difference if (|a-b| > D). D must be a positive number.\n");
+ printf("         Can not use with '-p' or '--use-system-epsilon'.\n");
+ printf("   -p R, --relative=R\n");
+ printf("         Print difference if (|(a-b)/b| > R). R must be a positive number.\n");
+ printf("         Can not use with '-d' or '--use-system-epsilon'.\n");
+ printf("   --use-system-epsilon\n");
+ printf("         Print difference if (|a-b| > EPSILON), EPSILON is system defined value.\n");
+ printf("         If the system epsilon is not defined,one of the following predefined\n");
+ printf("         values will be used:\n");
+ printf("           FLT_EPSILON = 1.19209E-07 for floating-point type\n");
+ printf("           DBL_EPSILON = 2.22045E-16 for double precision type\n");
+ printf("         Can not use with '-p' or '-d'.\n");
+ printf("   --exclude-path \"path\" \n");
+ printf("         Exclude the specified path to an object when comparing files or groups.\n");
+ printf("         If a group is excluded, all member objects will also be excluded.\n");
+ printf("         The specified path is excluded wherever it occurs.\n");
+ printf("         This flexibility enables the same option to exclude either objects that\n");
+ printf("         exist only in one file or common objects that are known to differ.\n");
+ printf("\n");
+ printf("         When comparing files, \"path\" is the absolute path to the excluded;\n");
+ printf("         object; when comparing groups, \"path\" is similar to the relative\n");
+ printf("         path from the group to the excluded object. This \"path\" can be\n");
+ printf("         taken from the first section of the output of the --verbose option.\n");
+ printf("         For example, if you are comparing the group /groupA in two files and\n");
+ printf("         you want to exclude /groupA/groupB/groupC in both files, the exclude\n");
+ printf("         option would read as follows:\n");
+ printf("           --exclude-path \"/groupB/groupC\"\n");
+ printf("\n");
+ printf("         If there are multiple paths to an object, only the specified path(s)\n");
+ printf("         will be excluded; the comparison will include any path not explicitly\n");
+ printf("         excluded.\n");
+ printf("         This option can be used repeatedly to exclude multiple paths.\n");
+ printf("\n");
+
+ printf(" Modes of output:\n");
+ printf("  Default mode: print the number of differences found and where they occured\n");
+ printf("  -r Report mode: print the above plus the differences\n");
+ printf("  -v Verbose mode: print the above plus a list of objects and warnings\n");
+ printf("  -q Quiet mode: do not print output\n");
+
+ printf("\n");
+
+ printf(" File comparison:\n");
+ printf("  If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as\n");
+ printf("  a comparison of the two files' root groups.  That is, h5diff first compares\n");
+ printf("  the names of root group members, generates a report of root group objects\n");
+ printf("  that appear in only one file or in both files, and recursively compares\n");
+ printf("  common objects.\n");
+ printf("\n");
+
+ printf(" Object comparison:\n");
+ printf("  1) Groups \n");
+ printf("      First compares the names of member objects (relative path, from the\n");
+ printf("      specified group) and generates a report of objects that appear in only\n");
+ printf("      one group or in both groups. Common objects are then compared recursively.\n");
+ printf("  2) Datasets \n");
+ printf("      Array rank and dimensions, datatypes, and data values are compared.\n");
+ printf("  3) Datatypes \n");
+ printf("      The comparison is based on the return value of H5Tequal.\n");
+ printf("  4) Symbolic links \n");
+ printf("      The paths to the target objects are compared.\n");
+ printf("      (The option --follow-symlinks overrides the default behavior when\n");
+ printf("       symbolic links are compared.).\n");
+ printf("\n");
+
+ printf(" Exit code:\n");
+ printf("  0 if no differences, 1 if differences found, 2 if error\n");
+ printf("\n");
+ printf(" Examples of use:\n");
+ printf(" 1) h5diff file1 file2 /g1/dset1 /g1/dset2\n");
+ printf("    Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2\n");
+ printf("\n");
+ printf(" 2) h5diff file1 file2 /g1/dset1\n");
+ printf("    Compares object '/g1/dset1' in both files\n");
+ printf("\n");
+ printf(" 3) h5diff file1 file2\n");
+ printf("    Compares all objects in both files\n");
+ printf("\n");
+ printf(" Notes:\n");
+ printf("  file1 and file2 can be the same file.\n");
+ printf("  Use h5diff file1 file1 /g1/dset1 /g1/dset2 to compare\n");
+ printf("  '/g1/dset1' and '/g1/dset2' in the same file\n");
+ printf("\n");
+}
diff --git a/tools/src/h5diff/h5diff_common.h b/tools/src/h5diff/h5diff_common.h
new file mode 100644
index 0000000..e5dfe3f
--- /dev/null
+++ b/tools/src/h5diff/h5diff_common.h
@@ -0,0 +1,34 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5DIFFCOMMON_H__
+#define H5DIFFCOMMON_H__
+
+#include "h5tools.h"
+/* Name of tool */
+#define PROGRAMNAME "h5diff"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void usage(void);
+void parse_command_line(int argc, const char* argv[], const char** fname1, const char** fname2, const char** objname1, const char** objname2, diff_opt_t* options);
+void h5diff_exit(int status);
+void print_info(diff_opt_t* options);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5DIFFCOMMON_H__ */
diff --git a/tools/src/h5diff/h5diff_main.c b/tools/src/h5diff/h5diff_main.c
new file mode 100644
index 0000000..92a1610
--- /dev/null
+++ b/tools/src/h5diff/h5diff_main.c
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdlib.h>
+#include <assert.h>
+#include <memory.h>
+#include "H5private.h"
+#include "h5diff.h"
+#include "h5diff_common.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: h5diff main program
+ *
+ * Return: An  exit status of 0 means no differences were found, 1 means some
+ *   differences were found.
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ * Modifications: July 2004
+ *  Introduced the four modes:
+ *   Normal mode: print the number of differences found and where they occured
+ *   Report mode: print the above plus the differences
+ *   Verbose mode: print the above plus a list of objects and warnings
+ *   Quiet mode: do not print output
+ *
+ * November 2004: Leon Arber (larber at uiuc.edu)
+ *     Additions that allow h5diff to be run in parallel
+ *
+ * February 2005: Leon Arber (larber at uiuc.edu)
+ *   h5diff and ph5diff split into two files, one that is used
+ *   to build a serial h5diff and one used to build a parallel h5diff
+ *   Common functions have been moved to h5diff_common.c
+ *
+ * October 2005
+ *  Introduced a new field 'not_cmp' to 'diff_opt_t' that detects
+ *  if some objects are not comparable and prints the message
+ *  "Some objects are not comparable"
+ *
+ * February 2007
+ *  Added comparison for dataset regions.
+ *  Added support for reading and comparing by hyperslabs for large files.
+ *  Inclusion of a relative error formula to compare floating
+ *   point numbers in order to deal with floating point uncertainty.
+ *  Printing of dataset dimensions along with dataset name
+ *
+ *  November 19, 2007
+ *    adopted the syntax h5diff  [OPTIONS]  file1 file2  [obj1[obj2]]
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+int main(int argc, const char *argv[])
+{
+    int        ret;
+    const char *fname1 = NULL;
+    const char *fname2 = NULL;
+    const char *objname1  = NULL;
+    const char *objname2  = NULL;
+    hsize_t    nfound=0;
+    diff_opt_t options;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /*-------------------------------------------------------------------------
+    * process the command-line
+    *-------------------------------------------------------------------------
+    */
+    parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
+
+    /*-------------------------------------------------------------------------
+    * do the diff
+    *-------------------------------------------------------------------------
+    */
+
+    nfound = h5diff(fname1,fname2,objname1,objname2,&options);
+
+    print_info(&options);
+
+   /*-------------------------------------------------------------------------
+    * exit code
+    *   1 if differences, 0 if no differences, 2 if error
+    *-------------------------------------------------------------------------
+    */
+
+    ret = (nfound == 0 ? 0 : 1 );
+
+    /* if graph difference return 1 for differences  */
+    if ( options.contents == 0 )
+        ret = 1;
+
+    /* and return 2 for error */
+    if (options.err_stat)
+        ret = 2;
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5diff_exit
+ *
+ * Purpose: dismiss phdiff worker processes and exit
+ *
+ * Return: none
+ *
+ * Programmer: Albert Cheng
+ * Date: Feb 6, 2005
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_NORETURN void
+h5diff_exit(int status)
+{
+    HDexit(status);
+}
+
diff --git a/tools/src/h5diff/ph5diff_main.c b/tools/src/h5diff/ph5diff_main.c
new file mode 100644
index 0000000..bfeb408
--- /dev/null
+++ b/tools/src/h5diff/ph5diff_main.c
@@ -0,0 +1,327 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 <assert.h>
+#include "H5private.h"
+#include "h5diff.h"
+#include "ph5diff.h"
+#include "h5diff_common.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5diff"
+
+static void ph5diff_worker(int );
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: ph5diff main program
+ *
+ * Return: An exit status of 0 means no differences were found, 1 means some
+ *   differences were found.
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ * This function drives the diff process and will do a serial or parallel diff depending
+ * on the value of the global variable g_Parallel (default is 0), set to 1 when the program
+ * is run as "ph5diff"
+ *-------------------------------------------------------------------------
+ */
+
+int main(int argc, const char *argv[])
+{
+    int        nID = 0;
+    const char *fname1 = NULL;
+    const char *fname2 = NULL;
+    const char *objname1  = NULL;
+    const char *objname2  = NULL;
+    diff_opt_t options;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    outBuffOffset = 0;
+    g_Parallel = 1;
+
+    MPI_Init(&argc, (char***) &argv);
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &nID);
+    MPI_Comm_size(MPI_COMM_WORLD, &g_nTasks);
+
+    if(g_nTasks == 1)
+    {
+        printf("Only 1 task available...doing serial diff\n");
+
+        g_Parallel = 0;
+
+        parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
+
+        h5diff(fname1, fname2, objname1, objname2, &options);
+
+        print_info(&options);
+    }
+    /* Parallel h5diff */
+    else {
+
+        /* Have the manager process the command-line */
+        if(nID == 0)
+        {
+            parse_command_line(argc, argv, &fname1, &fname2, &objname1, &objname2, &options);
+
+            h5diff(fname1, fname2, objname1, objname2, &options);
+
+            MPI_Barrier(MPI_COMM_WORLD);
+
+            print_info(&options);
+            print_manager_output();
+        }
+        /* All other tasks become workers and wait for assignments. */
+        else {
+            ph5diff_worker(nID);
+
+            MPI_Barrier(MPI_COMM_WORLD);
+        } /* end else */
+
+    } /* end else */
+
+    MPI_Finalize();
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: ph5diff_worker
+ *
+ * Purpose: worker process of ph5diff
+ *
+ * Return: none
+ *
+ * Programmer: Leon Arber
+ * Date: January 2005
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+ph5diff_worker(int nID)
+{
+    hid_t file1_id = -1, file2_id = -1;
+
+    while(1)
+    {
+        MPI_Status Status;
+
+        MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+
+        /* Check for filenames */
+        if(Status.MPI_TAG == MPI_TAG_PARALLEL)
+        {
+            char    filenames[2][MAX_FILENAME];
+
+            /* Retrieve filenames */
+            MPI_Recv(filenames, MAX_FILENAME*2, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+
+            /* disable error reporting */
+            H5E_BEGIN_TRY
+            {
+                /* Open the files */
+                if ((file1_id = H5Fopen (filenames[0], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+                {
+                    printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[0]);
+                    MPI_Abort(MPI_COMM_WORLD, 0);
+                }
+                if ((file2_id = H5Fopen (filenames[1], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+                {
+                    printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[1]);
+                    MPI_Abort(MPI_COMM_WORLD, 0);
+                }
+                /* enable error reporting */
+            }
+            H5E_END_TRY;
+        }
+        /* Check for work */
+        else if(Status.MPI_TAG == MPI_TAG_ARGS)
+        {
+            struct diff_mpi_args args;
+            struct diffs_found  diffs;
+            int i;
+
+            /* Make certain we've received the filenames and opened the files already */
+            if(file1_id < 0 || file2_id < 0)
+            {
+                printf("ph5diff_worker: ERROR: work received before/without filenames\n");
+                break;
+            }
+
+            /* Recv parameters for diff from manager task */
+            MPI_Recv(&args, sizeof(args), MPI_BYTE, 0, MPI_TAG_ARGS, MPI_COMM_WORLD, &Status);
+
+            /* Do the diff */
+            diffs.nfound = diff(file1_id, args.name1, file2_id, args.name2, &(args.options), &(args.argdata));
+            diffs.not_cmp = args.options.not_cmp;
+
+            /* If print buffer has something in it, request print token.*/
+            if(outBuffOffset>0)
+            {
+                MPI_Send(NULL, 0, MPI_BYTE, 0, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD);
+
+                /* Wait for print token. */
+                MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD, &Status);
+
+                /* When get token, send all of our output to the manager task and then return the token */
+                for(i=0; i<outBuffOffset; i+=PRINT_DATA_MAX_SIZE)
+                    MPI_Send(outBuff+i, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
+
+                /* An overflow file exists, so we send it's output to the manager too and then delete it */
+                if(overflow_file)
+                {
+                    char out_data[PRINT_DATA_MAX_SIZE];
+                    int tmp;
+
+                    memset(out_data, 0, PRINT_DATA_MAX_SIZE);
+                    i=0;
+
+                    rewind(overflow_file);
+                    while((tmp = getc(overflow_file)) >= 0)
+                    {
+                        *(out_data + i++) = (char)tmp;
+                        if(i==PRINT_DATA_MAX_SIZE)
+                        {
+                            MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
+                            i=0;
+                            memset(out_data, 0, PRINT_DATA_MAX_SIZE);
+                        }
+                    }
+
+                    if(i>0)
+                        MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD);
+
+                    fclose(overflow_file);
+                    overflow_file = NULL;
+                }
+
+                fflush(stdout);
+                memset(outBuff, 0, OUTBUFF_SIZE);
+                outBuffOffset = 0;
+
+                MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD);
+            }
+            else
+                MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD);
+        }
+        /* Check for leaving */
+        else if(Status.MPI_TAG == MPI_TAG_END)
+        {
+            MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_END, MPI_COMM_WORLD, &Status);
+            break;
+        }
+        else
+        {
+            printf("ph5diff_worker: ERROR: invalid tag (%d) received\n", Status.MPI_TAG);
+            break;
+        }
+
+    }
+
+    return;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_manager_output
+ *
+ * Purpose: special function that prints any output accumulated by the
+ *      manager task.
+ *
+ * Return: none
+ *
+ * Programmer: Leon Arber
+ *
+ * Date: Feb 7, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_manager_output(void)
+{
+    /* If there was something we buffered, let's print it now */
+    if( (outBuffOffset>0) && g_Parallel)
+    {
+        printf("%s", outBuff);
+
+        if(overflow_file)
+        {
+            int     tmp;
+            rewind(overflow_file);
+            while((tmp = getc(overflow_file)) >= 0)
+                putchar(tmp);
+            fclose(overflow_file);
+            overflow_file = NULL;
+        }
+
+        HDfflush(stdout);
+        HDmemset(outBuff, 0, OUTBUFF_SIZE);
+        outBuffOffset = 0;
+    }
+    else if( (outBuffOffset>0) && !g_Parallel)
+    {
+        HDfprintf(stderr, "h5diff error: outBuffOffset>0, but we're not in parallel!\n");
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5diff_exit
+ *
+ * Purpose: dismiss phdiff worker processes and exit
+ *
+ * Return: none
+ *
+ * Programmer: Albert Cheng
+ * Date: Feb 6, 2005
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void h5diff_exit(int status)
+{
+    /* if in parallel mode, dismiss workers, close down MPI, then exit */
+    if(g_Parallel) {
+        if(g_nTasks > 1) {
+            phdiff_dismiss_workers();
+            MPI_Barrier(MPI_COMM_WORLD);
+        }
+        MPI_Finalize();
+        status = EXIT_SUCCESS;  /* Reset exit status, since some mpiexec commands generate output on failure status */
+    }
+
+    /* Always exit(0), since MPI implementations do weird stuff when they
+     *  receive a non-zero exit value. - QAK
+     */
+    exit(0);
+}
+
diff --git a/tools/src/h5dump/CMakeLists.txt b/tools/src/h5dump/CMakeLists.txt
new file mode 100644
index 0000000..65a7cdd
--- /dev/null
+++ b/tools/src/h5dump/CMakeLists.txt
@@ -0,0 +1,62 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5DUMP)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5dump executables
+# --------------------------------------------------------------------
+add_executable (h5dump
+    ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump.c
+    ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump_ddl.c
+    ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump_xml.c
+)
+TARGET_NAMING (h5dump STATIC)
+TARGET_C_PROPERTIES (h5dump STATIC " " " ")
+target_link_libraries (h5dump  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5dump PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5dump")
+
+set (H5_DEP_EXECUTABLES h5dump)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5dump-shared
+      ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump.c
+      ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump_ddl.c
+      ${HDF5_TOOLS_SRC_H5DUMP_SOURCE_DIR}/h5dump_xml.c
+  )
+  TARGET_NAMING (h5dump-shared SHARED)
+  TARGET_C_PROPERTIES (h5dump-shared SHARED " " " ")
+  target_link_libraries (h5dump-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5dump-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5dump-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5dump-shared)
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5dump-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5dump ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5dump/Makefile.am b/tools/src/h5dump/Makefile.am
new file mode 100644
index 0000000..86109d5
--- /dev/null
+++ b/tools/src/h5dump/Makefile.am
@@ -0,0 +1,36 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 files in /src directory and /tools/lib directory
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
+
+# Our main target, the h5dump tool.
+bin_PROGRAMS=h5dump
+
+# Add h5dump specific linker flags here
+h5dump_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All the programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# Source files for the program
+h5dump_SOURCES=h5dump.c h5dump_ddl.c h5dump_xml.c
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5dump/Makefile.in b/tools/src/h5dump/Makefile.in
new file mode 100644
index 0000000..80626f3
--- /dev/null
+++ b/tools/src/h5dump/Makefile.in
@@ -0,0 +1,1457 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5dump$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_h5dump_OBJECTS = h5dump.$(OBJEXT) h5dump_ddl.$(OBJEXT) \
+	h5dump_xml.$(OBJEXT)
+h5dump_OBJECTS = $(am_h5dump_OBJECTS)
+h5dump_LDADD = $(LDADD)
+h5dump_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 = 
+h5dump_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5dump_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 = $(h5dump_SOURCES)
+DIST_SOURCES = $(h5dump_SOURCES)
+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 $(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 files in /src directory and /tools/lib 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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Add h5dump specific linker flags here
+h5dump_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All the programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Source files for the program
+h5dump_SOURCES = h5dump.c h5dump_ddl.c h5dump_xml.c
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5dump/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5dump/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):
+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
+
+h5dump$(EXEEXT): $(h5dump_OBJECTS) $(h5dump_DEPENDENCIES) $(EXTRA_h5dump_DEPENDENCIES) 
+	@rm -f h5dump$(EXEEXT)
+	$(AM_V_CCLD)$(h5dump_LINK) $(h5dump_OBJECTS) $(h5dump_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump_ddl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dump_xml.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-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)
+
+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 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 \
+	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-dyn: $(DYN)
+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 dyn 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/src/h5dump/h5dump.c b/tools/src/h5dump/h5dump.c
new file mode 100644
index 0000000..b53c212
--- /dev/null
+++ b/tools/src/h5dump/h5dump.c
@@ -0,0 +1,1800 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "h5dump.h"
+#include "h5dump_ddl.h"
+#include "h5dump_xml.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5dump"
+
+static const char   *driver = NULL;      /* The driver to open the file with. */
+const char          *outfname=NULL;
+static int           doxml = 0;
+static int           useschema = 1;
+static const char   *xml_dtd_uri = NULL;
+
+/* module-scoped variables for XML option */
+#define DEFAULT_XSD     "http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd"
+#define DEFAULT_DTD     "http://www.hdfgroup.org/HDF5/XML/DTD/HDF5-File.dtd"
+
+/* Standard DDL output */
+static const dump_functions ddl_function_table = {
+    dump_group,
+    dump_named_datatype,
+    dump_dataset,
+    dump_dataspace,
+    dump_datatype,
+    dump_attr_cb,
+    dump_data
+};
+
+/* XML output */
+static const dump_functions xml_function_table = {
+    xml_dump_group,
+    xml_dump_named_datatype,
+    xml_dump_dataset,
+    xml_dump_dataspace,
+    xml_dump_datatype,
+    xml_dump_attr,
+    xml_dump_data
+};
+
+/* internal functions */
+static void     init_prefix(char **prfx, size_t prfx_len);
+
+/* a structure for handling the order command-line parameters come in */
+struct handler_t {
+    void (*func)(hid_t, const char *, void *, int, const char *);
+    char *obj;
+    struct subset_t *subset_info;
+};
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters. The long-named ones can be partially spelled. When
+ * adding more, make sure that they don't clash with each other.
+ */
+/* The following initialization makes use of C language cancatenating */
+/* "xxx" "yyy" into "xxxyyy". */
+static const char *s_opts = "hn*peyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o*b*F:s:S:A*q:z:m:RECM:O*N:vG:";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    { "contents", optional_arg, 'n' },
+    { "properties", no_arg, 'p' },
+    { "superblock", no_arg, 'B' },
+    { "boot-block", no_arg, 'B' },
+    { "boot-bloc", no_arg, 'B' },
+    { "boot-blo", no_arg, 'B' },
+    { "boot-bl", no_arg, 'B' },
+    { "boot-b", no_arg, 'B' },
+    { "boot", no_arg, 'B' },
+    { "boo", no_arg, 'B' },
+    { "bo", no_arg, 'B' },
+    { "header", no_arg, 'H' },
+    { "heade", no_arg, 'H' },
+    { "head", no_arg, 'H' },
+    { "hea", no_arg, 'H' },
+    { "object-ids", no_arg, 'i' },
+    { "object-id", no_arg, 'i' },
+    { "object-i", no_arg, 'i' },
+    { "object", no_arg, 'i' },
+    { "objec", no_arg, 'i' },
+    { "obje", no_arg, 'i' },
+    { "obj", no_arg, 'i' },
+    { "ob", no_arg, 'i' },
+    { "version", no_arg, 'V' },
+    { "versio", no_arg, 'V' },
+    { "versi", no_arg, 'V' },
+    { "vers", no_arg, 'V' },
+    { "ver", no_arg, 'V' },
+    { "ve", no_arg, 'V' },
+    { "attribute", require_arg, 'a' },
+    { "attribut", require_arg, 'a' },
+    { "attribu", require_arg, 'a' },
+    { "attrib", require_arg, 'a' },
+    { "attri", require_arg, 'a' },
+    { "attr", require_arg, 'a' },
+    { "att", require_arg, 'a' },
+    { "at", require_arg, 'a' },
+    { "block", require_arg, 'k' },
+    { "bloc", require_arg, 'k' },
+    { "blo", require_arg, 'k' },
+    { "bl", require_arg, 'k' },
+    { "count", require_arg, 'c' },
+    { "coun", require_arg, 'c' },
+    { "cou", require_arg, 'c' },
+    { "co", require_arg, 'c' },
+    { "dataset", require_arg, 'd' },
+    { "datase", require_arg, 'd' },
+    { "datas", require_arg, 'd' },
+    { "datatype", require_arg, 't' },
+    { "datatyp", require_arg, 't' },
+    { "dataty", require_arg, 't' },
+    { "datat", require_arg, 't' },
+    { "filedriver", require_arg, 'f' },
+    { "filedrive", require_arg, 'f' },
+    { "filedriv", require_arg, 'f' },
+    { "filedri", require_arg, 'f' },
+    { "filedr", require_arg, 'f' },
+    { "filed", require_arg, 'f' },
+    { "file", require_arg, 'f' },
+    { "fil", require_arg, 'f' },
+    { "fi", require_arg, 'f' },
+    { "group", require_arg, 'g' },
+    { "grou", require_arg, 'g' },
+    { "gro", require_arg, 'g' },
+    { "gr", require_arg, 'g' },
+    { "output", optional_arg, 'o' },
+    { "outpu", optional_arg, 'o' },
+    { "outp", optional_arg, 'o' },
+    { "out", optional_arg, 'o' },
+    { "ou", optional_arg, 'o' },
+    { "soft-link", require_arg, 'l' },
+    { "soft-lin", require_arg, 'l' },
+    { "soft-li", require_arg, 'l' },
+    { "soft-l", require_arg, 'l' },
+    { "soft", require_arg, 'l' },
+    { "sof", require_arg, 'l' },
+    { "start", require_arg, 's' },
+    { "star", require_arg, 's' },
+    { "sta", require_arg, 's' },
+    { "stride", require_arg, 'S' },
+    { "strid", require_arg, 'S' },
+    { "string", no_arg, 'r' },
+    { "strin", no_arg, 'r' },
+    { "use-dtd", no_arg, 'u' },
+    { "use-dt", no_arg, 'u' },
+    { "use-d", no_arg, 'u' },
+    { "use-", no_arg, 'u' },
+    { "use", no_arg, 'u' },
+    { "us", no_arg, 'u' },
+    { "u", no_arg, 'u' },
+    { "width", require_arg, 'w' },
+    { "widt", require_arg, 'w' },
+    { "wid", require_arg, 'w' },
+    { "wi", require_arg, 'w' },
+    { "xml-dtd", require_arg, 'D' },
+    { "xml-dt", require_arg, 'D' },
+    { "xml-d", require_arg, 'D' },
+    { "xml-ns", require_arg, 'X' },
+    { "xml-n", require_arg, 'X' },
+    { "xml", no_arg, 'x' },
+    { "xm", no_arg, 'x' },
+    { "onlyattr", optional_arg, 'A' },
+    { "escape", no_arg, 'e' },
+    { "noindex", no_arg, 'y' },
+    { "binary", optional_arg, 'b' },
+    { "form", require_arg, 'F' },
+    { "sort_by", require_arg, 'q' },
+    { "sort_order", require_arg, 'z' },
+    { "format", require_arg, 'm' },
+    { "region", no_arg, 'R' },
+    { "enable-error-stack", no_arg, 'E' },
+    { "packed-bits", require_arg, 'M' },
+    { "no-compact-subset", no_arg, 'C' },
+    { "ddl", optional_arg, 'O' },
+    { "any_path", require_arg, 'N' },
+    { "vds-view-first-missing", no_arg, 'v' },
+    { "vds-gap-size", require_arg, 'G' },
+    { NULL, 0, '\0' }
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown MPI & HDF5 and call exit()
+ *
+ * Return:      Does not return
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, 31. January 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    HDexit(ret);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message about dumper
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(const char *prog)
+{
+    FLUSHSTREAM(rawoutstream);
+    PRINTSTREAM(rawoutstream, "usage: %s [OPTIONS] files\n", prog);
+    PRINTVALSTREAM(rawoutstream, "  OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "     -h,   --help         Print a usage message and exit\n");
+    PRINTVALSTREAM(rawoutstream, "     -V,   --version      Print version number and exit\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- File Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -n,   --contents     Print a list of the file contents and exit\n");
+    PRINTVALSTREAM(rawoutstream, "                          Optional value 1 also prints attributes.\n");
+    PRINTVALSTREAM(rawoutstream, "     -B,   --superblock   Print the content of the super block\n");
+    PRINTVALSTREAM(rawoutstream, "     -H,   --header       Print the header only; no data is displayed\n");
+    PRINTVALSTREAM(rawoutstream, "     -f D, --filedriver=D Specify which driver to open the file with\n");
+    PRINTVALSTREAM(rawoutstream, "     -o F, --output=F     Output raw data into file F\n");
+    PRINTVALSTREAM(rawoutstream, "     -b B, --binary=B     Binary file output, of form B\n");
+    PRINTVALSTREAM(rawoutstream, "     -O F, --ddl=F        Output ddl text into file F\n");
+    PRINTVALSTREAM(rawoutstream, "                          Use blank(empty) filename F to suppress ddl display\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Object Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -a P, --attribute=P  Print the specified attribute\n");
+    PRINTVALSTREAM(rawoutstream, "                          If an attribute name contains a slash (/), escape the\n");
+    PRINTVALSTREAM(rawoutstream, "                          slash with a preceding backslash (\\).\n");
+    PRINTVALSTREAM(rawoutstream, "                          (See example section below.)\n");
+    PRINTVALSTREAM(rawoutstream, "     -d P, --dataset=P    Print the specified dataset\n");
+    PRINTVALSTREAM(rawoutstream, "     -g P, --group=P      Print the specified group and all members\n");
+    PRINTVALSTREAM(rawoutstream, "     -l P, --soft-link=P  Print the value(s) of the specified soft link\n");
+    PRINTVALSTREAM(rawoutstream, "     -t P, --datatype=P   Print the specified named datatype\n");
+    PRINTVALSTREAM(rawoutstream, "     -N P, --any_path=P   Print any attribute, dataset, group, datatype, or link that matches P\n");
+    PRINTVALSTREAM(rawoutstream, "                          P can be the absolute path or just a relative path.\n");
+    PRINTVALSTREAM(rawoutstream, "     -A,   --onlyattr     Print the header and value of attributes\n");
+    PRINTVALSTREAM(rawoutstream, "                          Optional value 0 suppresses printing attributes.\n");
+    PRINTVALSTREAM(rawoutstream, "     --vds-view-first-missing Set the VDS bounds to first missing mapped elements.\n");
+    PRINTVALSTREAM(rawoutstream, "     --vds-gap-size=N     Set the missing file gap size, N=non-negative integers\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Object Property Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -i,   --object-ids   Print the object ids\n");
+    PRINTVALSTREAM(rawoutstream, "     -p,   --properties   Print dataset filters, storage layout and fill value\n");
+    PRINTVALSTREAM(rawoutstream, "     -M L, --packedbits=L Print packed bits as unsigned integers, using mask\n");
+    PRINTVALSTREAM(rawoutstream, "                          format L for an integer dataset specified with\n");
+    PRINTVALSTREAM(rawoutstream, "                          option -d. L is a list of offset,length values,\n");
+    PRINTVALSTREAM(rawoutstream, "                          separated by commas. Offset is the beginning bit in\n");
+    PRINTVALSTREAM(rawoutstream, "                          the data value and length is the number of bits of\n");
+    PRINTVALSTREAM(rawoutstream, "                          the mask.\n");
+    PRINTVALSTREAM(rawoutstream, "     -R,   --region       Print dataset pointed by region references\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Formatting Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -e,   --escape       Escape non printing characters\n");
+    PRINTVALSTREAM(rawoutstream, "     -r,   --string       Print 1-byte integer datasets as ASCII\n");
+    PRINTVALSTREAM(rawoutstream, "     -y,   --noindex      Do not print array indices with the data\n");
+    PRINTVALSTREAM(rawoutstream, "     -m T, --format=T     Set the floating point output format\n");
+    PRINTVALSTREAM(rawoutstream, "     -q Q, --sort_by=Q    Sort groups and attributes by index Q\n");
+    PRINTVALSTREAM(rawoutstream, "     -z Z, --sort_order=Z Sort groups and attributes by order Z\n");
+    PRINTVALSTREAM(rawoutstream, "     --enable-error-stack Prints messages from the HDF5 error stack as they\n");
+    PRINTVALSTREAM(rawoutstream, "                          occur.\n");
+    PRINTVALSTREAM(rawoutstream, "     --no-compact-subset  Disable compact form of subsetting and allow the use\n");
+    PRINTVALSTREAM(rawoutstream, "                          of \"[\" in dataset names.\n");
+    PRINTVALSTREAM(rawoutstream, "     -w N, --width=N      Set the number of columns of output. A value of 0 (zero)\n");
+    PRINTVALSTREAM(rawoutstream, "                          sets the number of columns to the maximum (65535).\n");
+    PRINTVALSTREAM(rawoutstream, "                          Default width is 80 columns.\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- XML Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "     -x,   --xml          Output in XML using Schema\n");
+    PRINTVALSTREAM(rawoutstream, "     -u,   --use-dtd      Output in XML using DTD\n");
+    PRINTVALSTREAM(rawoutstream, "     -D U, --xml-dtd=U    Use the DTD or schema at U\n");
+    PRINTVALSTREAM(rawoutstream, "     -X S, --xml-ns=S     (XML Schema) Use qualified names n the XML\n");
+    PRINTVALSTREAM(rawoutstream, "                          \":\": no namespace, default: \"hdf5:\"\n");
+    PRINTVALSTREAM(rawoutstream, "                          E.g., to dump a file called `-f', use h5dump -- -f\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Subsetting Options ---------------\n");
+    PRINTVALSTREAM(rawoutstream, " Subsetting is available by using the following options with a dataset\n");
+    PRINTVALSTREAM(rawoutstream, " option. Subsetting is done by selecting a hyperslab from the data.\n");
+    PRINTVALSTREAM(rawoutstream, " Thus, the options mirror those for performing a hyperslab selection.\n");
+    PRINTVALSTREAM(rawoutstream, " One of the START, COUNT, STRIDE, or BLOCK parameters are mandatory if you do subsetting.\n");
+    PRINTVALSTREAM(rawoutstream, " The STRIDE, COUNT, and BLOCK parameters are optional and will default to 1 in\n");
+    PRINTVALSTREAM(rawoutstream, " each dimension. START is optional and will default to 0 in each dimension.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      -s START,  --start=START    Offset of start of subsetting selection\n");
+    PRINTVALSTREAM(rawoutstream, "      -S STRIDE, --stride=STRIDE  Hyperslab stride\n");
+    PRINTVALSTREAM(rawoutstream, "      -c COUNT,  --count=COUNT    Number of blocks to include in selection\n");
+    PRINTVALSTREAM(rawoutstream, "      -k BLOCK,  --block=BLOCK    Size of block in hyperslab\n");
+    PRINTVALSTREAM(rawoutstream, "  START, COUNT, STRIDE, and BLOCK - is a list of integers the number of which are equal to the\n");
+    PRINTVALSTREAM(rawoutstream, "      number of dimensions in the dataspace being queried\n");
+    PRINTVALSTREAM(rawoutstream, "      (Alternate compact form of subsetting is described in the Reference Manual)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Option Argument Conventions ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "  D - is the file driver to use in opening the file. Acceptable values\n");
+    PRINTVALSTREAM(rawoutstream, "      are \"sec2\", \"family\", \"split\", \"multi\", \"direct\", and \"stream\". Without\n");
+    PRINTVALSTREAM(rawoutstream, "      the file driver flag, the file will be opened with each driver in\n");
+    PRINTVALSTREAM(rawoutstream, "      turn and in the order specified above until one driver succeeds\n");
+    PRINTVALSTREAM(rawoutstream, "      in opening the file.\n");
+    PRINTVALSTREAM(rawoutstream, "      See examples below for family, split, and multi driver special file name usage.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  F - is a filename.\n");
+    PRINTVALSTREAM(rawoutstream, "  P - is the full path from the root group to the object.\n");
+    PRINTVALSTREAM(rawoutstream, "  N - is an integer greater than 1.\n");
+    PRINTVALSTREAM(rawoutstream, "  T - is a string containing the floating point format, e.g '%%.3f'\n");
+    PRINTVALSTREAM(rawoutstream, "  U - is a URI reference (as defined in [IETF RFC 2396],\n");
+    PRINTVALSTREAM(rawoutstream, "        updated by [IETF RFC 2732])\n");
+    PRINTVALSTREAM(rawoutstream, "  B - is the form of binary output: NATIVE for a memory type, FILE for the\n");
+    PRINTVALSTREAM(rawoutstream, "        file type, LE or BE for pre-existing little or big endian types.\n");
+    PRINTVALSTREAM(rawoutstream, "        Must be used with -o (output file) and it is recommended that\n");
+    PRINTVALSTREAM(rawoutstream, "        -d (dataset) is used. B is an optional argument, defaults to NATIVE\n");
+    PRINTVALSTREAM(rawoutstream, "  Q - is the sort index type. It can be \"creation_order\" or \"name\" (default)\n");
+    PRINTVALSTREAM(rawoutstream, "  Z - is the sort order type. It can be \"descending\" or \"ascending\" (default)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "--------------- Examples ---------------\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  1) Attribute foo of the group /bar_none in file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -a /bar_none/foo quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "     Attribute \"high/low\" of the group /bar_none in the file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -a \"/bar_none/high\\/low\" quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  2) Selecting a subset from dataset /foo in file quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -s \"0,1\" -S \"1,1\" -c \"2,3\" -k \"2,2\" quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  3) Saving dataset 'dset' in file quux.h5 to binary file 'out.bin'\n");
+    PRINTVALSTREAM(rawoutstream, "        using a little-endian type\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -b LE -o out.bin quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  4) Display two packed bits (bits 0-1 and bits 4-6) in the dataset /dset\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /dset -M 0,1,4,3 quux.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  5) Dataset foo in files file1.h5 file2.h5 file3.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo file1.h5 file2.h5 file3.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  6) Dataset foo in split files splitfile-m.h5 splitfile-r.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f split splitfile\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  7) Dataset foo in multi files mf-s.h5, mf-b.h5, mf-r.h5, mf-g.h5, mf-l.h5 and mf-o.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f multi mf\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  8) Dataset foo in family files fam00000.h5 fam00001.h5 and fam00002.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      h5dump -d /foo -f family fam%%05d.h5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_add
+ *
+ * Purpose: Add a new set of tables
+ *
+ * Return: index of added table on success, -1 on failure
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_add in h5trav.c by Quincey Koziol
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+table_list_add(hid_t oid, unsigned long file_no)
+{
+    size_t      idx;         /* Index of table to use */
+    find_objs_t info;
+
+    /* Allocate space if necessary */
+    if(table_list.nused == table_list.nalloc) {
+        h5dump_table_items_t    *tmp_ptr;
+
+        table_list.nalloc = MAX(1, table_list.nalloc * 2);
+        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 */
+
+    /* Append it */
+    idx = table_list.nused++;
+    table_list.tables[idx].fileno = file_no;
+    table_list.tables[idx].oid = oid;
+    if(H5Iinc_ref(oid) < 0) {
+        table_list.nused--;
+        return -1;
+    }
+    if(init_objs(oid, &info, &table_list.tables[idx].group_table,
+                 &table_list.tables[idx].dset_table, &table_list.tables[idx].type_table) < 0) {
+        H5Idec_ref(oid);
+        table_list.nused--;
+        return -1;
+    }
+
+#ifdef H5DUMP_DEBUG
+    dump_tables(&info);
+#endif /* H5DUMP_DEBUG */
+
+    return((ssize_t) idx);
+} /* end table_list_add() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_visited
+ *
+ * Purpose: Check if a table already exists for the specified fileno
+ *
+ * Return: The index of the matching table, or -1 if no matches found
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *             Adapted from trav_addr_visited in h5trav.c by Quincey Koziol
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_PURE ssize_t
+table_list_visited(unsigned long file_no)
+{
+    size_t u;           /* Local index variable */
+
+    /* Look for table */
+    for(u = 0; u < table_list.nused; u++)
+        /* Check for fileno value already in array */
+        if(table_list.tables[u].fileno == file_no)
+            return((ssize_t) u);
+
+    /* Didn't find table */
+    return(-1);
+} /* end table_list_visited() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: table_list_free
+ *
+ * Purpose: Frees the table list
+ *
+ * Return: void
+ *
+ * Programmer: Neil Fortner, nfortne2 at hdfgroup.org
+ *
+ * Date: October 13, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+table_list_free(void)
+{
+    size_t u;           /* Local index variable */
+
+    /* Iterate over tables */
+    for(u = 0; u < table_list.nused; u++) {
+        /* Release object id */
+        if(H5Idec_ref(table_list.tables[u].oid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+
+        /* Free each table */
+        free_table(table_list.tables[u].group_table);
+        HDfree(table_list.tables[u].group_table);
+        free_table(table_list.tables[u].dset_table);
+        HDfree(table_list.tables[u].dset_table);
+        free_table(table_list.tables[u].type_table);
+        HDfree(table_list.tables[u].type_table);
+    }
+
+    /* Free the table list */
+    HDfree(table_list.tables);
+    table_list.tables = NULL;
+    table_list.nalloc = table_list.nused = 0;
+} /* end table_list_free() */
+
+/*-------------------------------------------------------------------------
+ * Function:    set_binary_form
+ *
+ * Purpose: set the binary form of output by translating from a string input
+ *          parameter to a integer return value
+ *
+ * Return: integer form of binary output or -1 if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *             June 28, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+set_binary_form(const char *form)
+{
+    int bform = -1;
+
+    if (HDstrcmp(form,"NATIVE") == 0 || HDstrcmp(form,"MEMORY") == 0) {
+        /* native form */
+        bform = 0;
+    }
+    else if (HDstrcmp(form,"FILE") == 0) /* file type form */
+        bform = 1;
+    else if (HDstrcmp(form,"LE") == 0) /* convert to little endian */
+        bform = 2;
+    else if (HDstrcmp(form,"BE") == 0) /* convert to big endian */
+        bform = 3;
+
+    return bform;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    set_sort_by
+ *
+ * Purpose: set the "by" form of sorting by translating from a string input
+ *          parameter to a H5_index_t return value
+ *          current sort values are [creation_order | name]
+ *
+ * Return: H5_index_t form of sort or H5_INDEX_UNKNOWN if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *              October 1, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_index_t
+set_sort_by(const char *form)
+{
+    H5_index_t idx_type = H5_INDEX_UNKNOWN;
+
+    if (HDstrcmp(form,"name")==0) /* H5_INDEX_NAME */
+        idx_type = H5_INDEX_NAME;
+    else if (HDstrcmp(form,"creation_order")==0) /* H5_INDEX_CRT_ORDER */
+        idx_type = H5_INDEX_CRT_ORDER;
+
+    return idx_type;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    set_sort_order
+ *
+ * Purpose: set the order of sorting by translating from a string input
+ *          parameter to a H5_iter_order_t return value
+ *          current order values are [ascending | descending ]
+ *
+ * Return: H5_iter_order_t form of order or H5_ITER_UNKNOWN if none found
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *              October 1, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_iter_order_t
+set_sort_order(const char *form)
+{
+    H5_iter_order_t iter_order = H5_ITER_UNKNOWN;
+
+    if (HDstrcmp(form,"ascending")==0) /* H5_ITER_INC */
+        iter_order = H5_ITER_INC;
+    else if (HDstrcmp(form,"descending")==0) /* H5_ITER_DEC */
+        iter_order = H5_ITER_DEC;
+
+    return iter_order;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_hsize_list
+ *
+ * Purpose:     Parse a list of comma or space separated integers and return
+ *              them in a list. The string being passed into this function
+ *              should be at the start of the list you want to parse. You are
+ *              responsible for freeing the array returned from here.
+ *
+ *              Lists in the so-called "terse" syntax are separated by
+ *              semicolons (;). The lists themselves can be separated by
+ *              either commas (,) or white spaces.
+ *
+ * Return:      <none>
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 6. February 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+parse_hsize_list(const char *h_list, subset_d *d)
+{
+    hsize_t        *p_list;
+    const char     *ptr;
+    unsigned int    size_count = 0;
+    unsigned int    i = 0;
+    unsigned int    last_digit = 0;
+
+    if (!h_list || !*h_list || *h_list == ';')
+        return;
+
+    /* count how many integers do we have */
+    for (ptr = h_list; ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
+        if (HDisdigit(*ptr)) {
+            if (!last_digit)
+                /* the last read character wasn't a digit */
+                size_count++;
+
+            last_digit = 1;
+        }
+        else
+            last_digit = 0;
+
+    if (size_count == 0)
+        /* there aren't any integers to read */
+        return;
+
+    /* allocate an array for the integers in the list */
+    p_list = (hsize_t *)HDcalloc(size_count, sizeof(hsize_t));
+
+    for (ptr = h_list; i < size_count && ptr && *ptr && *ptr != ';' && *ptr != ']'; ptr++)
+        if(HDisdigit(*ptr)) {
+            /* we should have an integer now */
+            p_list[i++] = (hsize_t)HDstrtoull(ptr, NULL, 0);
+
+            while (HDisdigit(*ptr))
+                /* scroll to end of integer */
+                ptr++;
+        }
+    d->data = p_list;
+    d->len = size_count;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_subset_params
+ *
+ * Purpose:     Parse the so-called "terse" syntax for specifying subsetting
+ *              parameters.
+ *
+ * Return:      Success:    struct subset_t object
+ *              Failure:    NULL
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 6. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static struct subset_t *
+parse_subset_params(char *dset)
+{
+    struct subset_t *s = NULL;
+    char   *brace;
+
+    if (!disable_compact_subset && ((brace = HDstrrchr(dset, '[')) != NULL)) {
+        *brace++ = '\0';
+
+        s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
+        parse_hsize_list(brace, &s->start);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->stride);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->count);
+
+        while (*brace && *brace != ';')
+            brace++;
+
+        if (*brace) brace++;
+
+        parse_hsize_list(brace, &s->block);
+    }
+
+    return s;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_mask_list
+ *
+ * Purpose:     Parse a list of comma or space separated integers and fill
+ *              the packed_bits list and counter. The string being passed into this function
+ *              should be at the start of the list you want to parse.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_mask_list(const char *h_list)
+{
+    int                soffset_value;
+    unsigned           offset_value;
+    int                slength_value;
+    unsigned           length_value;
+    unsigned long long temp_mask;
+    const char        *ptr = NULL;
+
+    /* sanity check */
+    HDassert(h_list);
+
+    HDmemset(packed_mask,0,sizeof(packed_mask));
+
+    packed_bits_num = 0;
+    /* scan in pair of offset,length separated by commas. */
+    ptr = h_list;
+    while (*ptr) {
+        /* scan for an offset which is an unsigned int */
+        if (!HDisdigit(*ptr)) {
+            error_msg("Bad mask list(%s)\n", h_list);
+            return FAIL;
+        }
+        soffset_value = HDatoi(ptr);
+        offset_value = (unsigned)soffset_value;
+        if (soffset_value < 0 || offset_value >= PACKED_BITS_SIZE_MAX) {
+            error_msg("Packed Bit offset value(%d) must be between 0 and %u\n",
+                    soffset_value, (unsigned)(PACKED_BITS_SIZE_MAX - 1));
+            return FAIL;
+        }
+
+        /* skip to end of integer */
+        while (HDisdigit(*++ptr))
+            ;
+        /* Look for the common separator */
+        if (*ptr++ != ',') {
+            error_msg("Bad mask list(%s), missing expected comma separator.\n", h_list);
+            return FAIL;
+        }
+
+        /* scan for a length which is a positive int */
+        if (!HDisdigit(*ptr)) {
+            error_msg("Bad mask list(%s)\n", h_list);
+            return FAIL;
+        }
+        slength_value = HDatoi(ptr);
+        if (slength_value <= 0) {
+            error_msg("Packed Bit length value(%d) must be positive.\n", slength_value);
+            return FAIL;
+        }
+        length_value = (unsigned)slength_value;
+        if ((offset_value + length_value) > PACKED_BITS_SIZE_MAX) {
+            error_msg("Packed Bit offset+length value(%u) too large. Max is %u\n",
+                       offset_value+length_value, (unsigned)PACKED_BITS_SIZE_MAX);
+            return FAIL;
+        }
+
+        /* skip to end of int */
+        while (HDisdigit(*++ptr))
+            ;
+
+        /* store the offset,length pair */
+        if (packed_bits_num >= PACKED_BITS_MAX) {
+            /* too many requests */
+            error_msg("Too many masks requested (max. %d). Mask list(%s)\n", PACKED_BITS_MAX, h_list);
+            return FAIL;
+        }
+        packed_offset[packed_bits_num] = offset_value;
+        packed_length[packed_bits_num] = length_value;
+        /* create the bit mask by left shift 1's by length, then negate it. */
+        /* After packed_mask is calculated, packed_length is not needed but  */
+        /* keep it for debug purpose. */
+        temp_mask = ~0ULL;
+        if(length_value < (int)(8 *sizeof(unsigned long long))) {
+            temp_mask = temp_mask << length_value;
+            packed_mask[packed_bits_num] = ~temp_mask;
+        }
+        else
+            packed_mask[packed_bits_num] = temp_mask;
+        packed_bits_num++;
+
+        /* skip a possible comma separator */
+        if (*ptr == ',') {
+            if (!(*++ptr)) {
+                /* unexpected end of string */
+                error_msg("Bad mask list(%s), unexpected end of string.\n", h_list);
+                return FAIL;
+            }
+        }
+    }
+    HDassert(packed_bits_num <= PACKED_BITS_MAX);
+    if (packed_bits_num == 0) {
+        /* got no masks! */
+        error_msg("Bad mask list(%s)\n", h_list);
+        return FAIL;
+    }
+    return SUCCEED;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    free_handler
+ *
+ * Purpose:     Convenience function to free the handler_t structures. Needs a
+ *              length variable (LEN) to know how many in the array it needs
+ *              to free
+ *
+ * Return:      Nothing
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+free_handler(struct handler_t *hand, int len)
+{
+    int i;
+
+    if(hand) {
+        for (i = 0; i < len; i++) {
+            if(hand[i].obj) {
+                HDfree(hand[i].obj);
+                hand[i].obj=NULL;
+            }
+
+            if (hand[i].subset_info) {
+                if(hand[i].subset_info->start.data)
+                    HDfree(hand[i].subset_info->start.data);
+                if(hand[i].subset_info->stride.data)
+                    HDfree(hand[i].subset_info->stride.data);
+                if(hand[i].subset_info->count.data)
+                    HDfree(hand[i].subset_info->count.data);
+                if(hand[i].subset_info->block.data)
+                    HDfree(hand[i].subset_info->block.data);
+
+                HDfree(hand[i].subset_info);
+                hand[i].subset_info=NULL;
+            }
+        }
+
+        HDfree(hand);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:    A pointer to an array of handler_t structures.
+ *                          These contain all the information needed to dump
+ *                          the necessary object.
+ *
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 20. February 2001
+ *
+ * Modifications:
+ *  pvn June, 1, 2006. Add a switch for binary output
+ *
+ *-------------------------------------------------------------------------
+ */
+static struct handler_t *
+parse_command_line(int argc, const char *argv[])
+{
+    struct handler_t   *hand = NULL;
+    struct handler_t   *last_dset = NULL;
+    int                 i;
+    int                 opt;
+    int                 last_was_dset = FALSE;
+
+     /* no arguments */
+    if (argc == 1) {
+        usage(h5tools_getprogname());
+        goto error;
+    }
+
+    /* this will be plenty big enough to hold the info */
+    if((hand = (struct handler_t *)HDcalloc((size_t)argc, sizeof(struct handler_t)))==NULL) {
+        goto error;
+    }
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+parse_start:
+        switch ((char)opt) {
+        case 'R':
+            display_region = TRUE;
+            region_output = TRUE;
+            break;
+        case 'B':
+            display_bb = TRUE;
+            last_was_dset = FALSE;
+            break;
+        case 'n':
+            display_fi = TRUE;
+            last_was_dset = FALSE;
+            if ( opt_arg != NULL) {
+                h5trav_set_verbose(HDatoi(opt_arg));
+            }
+            break;
+        case 'p':
+            display_dcpl = TRUE;
+            break;
+        case 'y':
+            display_ai = FALSE;
+            break;
+        case 'e':
+            display_escape = TRUE;
+            break;
+        case 'H':
+            display_data = FALSE;
+            display_attr_data = FALSE;
+            last_was_dset = FALSE;
+            break;
+        case 'A':
+            if ( opt_arg != NULL) {
+                if(0 == HDatoi(opt_arg)) include_attrs = FALSE;
+            }
+            else {
+                display_data = FALSE;
+                display_attr_data = TRUE;
+                last_was_dset = FALSE;
+            }
+            break;
+        case 'i':
+            display_oid = TRUE;
+            last_was_dset = FALSE;
+            break;
+        case 'r':
+            display_char = TRUE;
+            break;
+        case 'V':
+            print_version(h5tools_getprogname());
+            free_handler(hand, argc);
+            hand = NULL;
+            h5tools_setstatus(EXIT_SUCCESS);
+            goto done;
+            break;
+        case 'w':
+            {
+                int sh5tools_nCols = HDatoi(opt_arg);
+
+                if (sh5tools_nCols <= 0)
+                    h5tools_nCols = 65535;
+                else
+                    h5tools_nCols = (unsigned)sh5tools_nCols;
+                last_was_dset = FALSE;
+            }
+            break;
+        case 'N':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_paths;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'a':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_attributes;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'd':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_datasets;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    hand[i].subset_info = parse_subset_params(hand[i].obj);
+                    last_dset = &hand[i];
+                    break;
+                }
+
+            last_was_dset = TRUE;
+            break;
+        case 'f':
+            driver = opt_arg;
+            break;
+        case 'g':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_groups;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 'l':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_links;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+        case 't':
+            display_all = 0;
+
+            for (i = 0; i < argc; i++)
+                if (!hand[i].func) {
+                    hand[i].func = handle_datatypes;
+                    hand[i].obj = HDstrdup(opt_arg);
+                    break;
+                }
+
+            last_was_dset = FALSE;
+            break;
+
+        case 'O':
+            if (h5tools_set_output_file(opt_arg, 0) < 0) {
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'o':
+            if ( bin_output ) {
+                if (h5tools_set_data_output_file(opt_arg, 1) < 0) {
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+            }
+            else {
+                if(display_attr_data && !display_data) {
+                    if (h5tools_set_attr_output_file(opt_arg, 0) < 0) {
+                        usage(h5tools_getprogname());
+                        goto error;
+                    }
+                }
+                if(display_data || display_all) {
+                    if (h5tools_set_data_output_file(opt_arg, 0) < 0) {
+                        usage(h5tools_getprogname());
+                        goto error;
+                    }
+                }
+            }
+
+            usingdasho = TRUE;
+            last_was_dset = FALSE;
+            outfname = opt_arg;
+            break;
+
+        case 'b':
+            if ( opt_arg != NULL) {
+                if ( ( bin_form = set_binary_form(opt_arg)) < 0) {
+                    /* failed to set binary form */
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+            }
+            bin_output = TRUE;
+            if (outfname!=NULL) {
+                if (h5tools_set_data_output_file(outfname, 1) < 0)  {
+                    /* failed to set output file */
+                    usage(h5tools_getprogname());
+                    goto error;
+                }
+
+                last_was_dset = FALSE;
+            }
+            break;
+
+        case 'q':
+            if ( ( sort_by = set_sort_by(opt_arg)) < 0) {
+                /* failed to set "sort by" form */
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'z':
+            if ( ( sort_order = set_sort_order(opt_arg)) < 0) {
+                /* failed to set "sort order" form */
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        case 'M':
+            if (!last_was_dset) {
+                error_msg("option `-%c' can only be used after --dataset option\n", opt);
+                goto error;
+            }
+            if (parse_mask_list(opt_arg) != SUCCEED){
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            display_packed_bits = TRUE;
+            break;
+        case 'v':
+            display_vds_first = TRUE;
+            break;
+        case 'G':
+            vds_gap_size = HDatoi(opt_arg);
+            if (vds_gap_size < 0) {
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            break;
+
+        /** begin XML parameters **/
+        case 'x':
+            /* select XML output */
+            doxml = TRUE;
+            useschema = TRUE;
+            h5tools_dump_header_format = NULL;
+            dump_function_table = &xml_function_table;
+            h5tools_nCols = 0;
+            break;
+        case 'u':
+            doxml = TRUE;
+            useschema = FALSE;
+            xmlnsprefix = "";
+            h5tools_dump_header_format = NULL;
+            dump_function_table = &xml_function_table;
+            h5tools_nCols = 0;
+            break;
+        case 'D':
+            /* specify alternative XML DTD or schema */
+            /* To Do: check format of this value?  */
+            xml_dtd_uri = opt_arg;
+            h5tools_nCols = 0;
+            break;
+
+        case 'm':
+            /* specify alternative floating point printing format */
+            fp_format = opt_arg;
+            h5tools_nCols = 0;
+            break;
+
+        case 'X':
+            /* specify XML namespace (default="hdf5:"), or none */
+            /* To Do: check format of this value?  */
+            if (!useschema) {
+                usage(h5tools_getprogname());
+                goto error;
+            }
+            if (HDstrcmp(opt_arg,":") == 0)
+                xmlnsprefix = "";
+            else
+                xmlnsprefix = opt_arg;
+            h5tools_nCols = 0;
+            break;
+        /** end XML parameters **/
+
+        /** begin subsetting parameters **/
+        case 's':
+        case 'S':
+        case 'c':
+        case 'k': {
+            struct subset_t *s;
+
+            if (!last_was_dset) {
+                error_msg("option `-%c' can only be used after --dataset option\n", opt);
+                goto error;
+            }
+
+            if (last_dset->subset_info) {
+                /*
+                 * This overrides the "terse" syntax if they actually mixed
+                 * the two.
+                 */
+                s = last_dset->subset_info;
+            }
+            else {
+                last_dset->subset_info = s = (struct subset_t *)HDcalloc(1, sizeof(struct subset_t));
+            }
+
+            /*
+             * slightly convoluted, but...we are only interested in options
+             * for subsetting: "--start", "--stride", "--count", and "--block"
+             * which can come in any order. If we run out of parameters (EOF)
+             * or run into one which isn't a subsetting parameter (NOT s, S,
+             * c, or K), then we exit the do-while look, set the subset_info
+             * to the structure we've been filling. If we've reached the end
+             * of the options, we exit the parsing (goto parse_end) otherwise,
+             * since we've "read" the next option, we need to parse it. So we
+             * jump to the beginning of the switch statement (goto parse_start).
+             */
+            do {
+                switch ((char)opt) {
+                case 's':
+                    if (s->start.data) {
+                        HDfree(s->start.data);
+                        s->start.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->start);
+                    break;
+                case 'S':
+                    if (s->stride.data) {
+                        HDfree(s->stride.data);
+                        s->stride.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->stride);
+                    break;
+                case 'c':
+                    if (s->count.data) {
+                        HDfree(s->count.data);
+                        s->count.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->count);
+                    break;
+                case 'k':
+                    if (s->block.data) {
+                        HDfree(s->block.data);
+                        s->block.data = NULL;
+                    }
+                    parse_hsize_list(opt_arg, &s->block);
+                    break;
+                default:
+                    goto end_collect;
+                }
+            } while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF);
+
+end_collect:
+            last_was_dset = FALSE;
+
+            if (opt != EOF)
+                goto parse_start;
+            else
+                goto parse_end;
+        }
+        /** end subsetting parameters **/
+
+        case 'E':
+            enable_error_stack = TRUE;
+            break;
+        case 'C':
+            disable_compact_subset = TRUE;
+            break;
+        case 'h':
+            usage(h5tools_getprogname());
+            free_handler(hand, argc);
+            hand = NULL;
+            h5tools_setstatus(EXIT_SUCCESS);
+            goto done;
+        case '?':
+        default:
+            usage(h5tools_getprogname());
+            goto error;
+        }
+    }
+
+parse_end:
+    /* check for file name to be processed */
+    if (argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        goto error;
+    }
+done:
+    return hand;
+
+error:
+    if (hand) {
+        free_handler(hand, argc);
+        hand = NULL;
+    }
+    h5tools_setstatus(EXIT_FAILURE);
+
+    return hand;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     HDF5 dumper
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *        Albert Cheng
+ *        30. September 2000
+ *        Add the -o option--output file for datasets raw data
+ *
+ *        REMcG
+ *        November 2000
+ *        Changes to support XML.
+ *
+ *        Bill Wendling
+ *        Wednesday, 10. January 2001
+ *        Modified the way command line parameters are interpreted. They go
+ *        through one function call now (get_option).
+ *
+ *        Bill Wendling
+ *        Tuesday, 20. February 2001
+ *        Moved command line parsing to separate function. Made various
+ *        "display_*" flags global.
+ *
+ *        REMcG
+ *        August 2003
+ *        Major upgrade to XML support.
+ *
+ *        Pedro Vicente
+ *        September 2007
+ *        list objects in requested order (creation order or alphabetically)
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    hid_t               fid = -1;
+    hid_t               gid = -1;
+    H5E_auto2_t         func;
+    H5E_auto2_t         tools_func;
+    H5O_info_t          oi;
+    struct handler_t   *hand = NULL;
+    int                 i;
+    unsigned            u;
+    void               *edata;
+    void               *tools_edata;
+    char               *fname = NULL;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+    h5tools_dump_header_format = &h5tools_standardformat;
+    dump_function_table = &ddl_function_table;
+    dump_indent = 0;
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* Disable tools error reporting */
+    H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
+    H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL);
+
+    if((hand = parse_command_line(argc, argv))==NULL) {
+        goto done;
+    }
+
+    if (bin_output && outfname == NULL) {
+        error_msg("binary output requires a file name, use -o <filename>\n");
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    if (enable_error_stack) {
+        H5Eset_auto2(H5E_DEFAULT, func, edata);
+        H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata);
+    }
+
+    /* Check for conflicting options */
+    if (doxml) {
+        if (!display_all) {
+            error_msg("option \"%s\" not available for XML\n",
+                    "to display selected objects");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_bb) {
+            error_msg("option \"%s\" not available for XML\n", "--boot-block");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_oid == 1) {
+            error_msg("option \"%s\" not available for XML\n", "--object-ids");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (display_char == TRUE) {
+            error_msg("option \"%s\" not available for XML\n", "--string");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (usingdasho) {
+            error_msg("option \"%s\" not available for XML\n", "--output");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+    }
+    else {
+        if (xml_dtd_uri) {
+            warn_msg("option \"%s\" only applies with XML: %s\n", "--xml-dtd", xml_dtd_uri);
+        }
+    }
+
+    if (argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+    /* Initialize indexing options */
+    h5trav_set_index(sort_by, sort_order);
+
+    while(opt_ind < argc) {
+        fname = HDstrdup(argv[opt_ind++]);
+
+        fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, driver, NULL, 0);
+
+        if (fid < 0) {
+            error_msg("unable to open file \"%s\"\n", fname);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+
+        /* allocate and initialize internal data structure */
+        init_prefix(&prefix, prefix_len);
+
+        /* Prepare to find objects that might be targets of a reference */
+        fill_ref_path_table(fid);
+
+        if(doxml) {
+            /* initialize XML */
+            /* reset prefix! */
+            HDstrcpy(prefix, "");
+
+            /* make sure the URI is initialized to something */
+            if (xml_dtd_uri == NULL) {
+                if (useschema) {
+                    xml_dtd_uri = DEFAULT_XSD;
+                }
+                else {
+                    xml_dtd_uri = DEFAULT_DTD;
+                    xmlnsprefix = "";
+                }
+            }
+            else {
+                if (useschema && HDstrcmp(xmlnsprefix,"")) {
+                    error_msg("Cannot set Schema URL for a qualified namespace--use -X or -U option with -D \n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    goto done;
+                }
+            }
+        }
+
+        /* Get object info for root group */
+        if(H5Oget_info_by_name(fid, "/", &oi, H5P_DEFAULT) < 0) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+
+        /* Initialize object tables */
+        if(table_list_add(fid, oi.fileno) < 0) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        group_table = table_list.tables[0].group_table;
+        dset_table = table_list.tables[0].dset_table;
+        type_table = table_list.tables[0].type_table;
+
+        /* does there exist unamed committed datatype */
+        for (u = 0; u < type_table->nobjs; u++)
+            if (!type_table->objs[u].recorded) {
+                unamedtype = 1;
+                break;
+            } /* end if */
+
+        /* start to dump - display file header information */
+        if (!doxml) {
+            begin_obj(h5tools_dump_header_format->filebegin, fname, h5tools_dump_header_format->fileblockbegin);
+        }
+        else {
+            PRINTVALSTREAM(rawoutstream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+
+            /* alternative first element, depending on schema or DTD. */
+            if (useschema) {
+                if (HDstrcmp(xmlnsprefix,"") == 0) {
+                    PRINTSTREAM(rawoutstream, "<HDF5-File xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"%s\">\n",
+                            xml_dtd_uri);
+                }
+                else {
+                    /*  TO DO: make -url option work in this case (may need new option) */
+                    char *ns;
+                    char *indx;
+
+                    ns = HDstrdup(xmlnsprefix);
+                    indx = HDstrrchr(ns,(int)':');
+                    if (indx) *indx = '\0';
+
+                    PRINTSTREAM(rawoutstream, "<%sHDF5-File xmlns:%s=\"http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd\" "
+                            "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\">\n",xmlnsprefix,ns);
+                    HDfree(ns);
+                }
+            }
+            else {
+                PRINTSTREAM(rawoutstream, "<!DOCTYPE HDF5-File PUBLIC \"HDF5-File.dtd\" \"%s\">\n", xml_dtd_uri);
+                PRINTVALSTREAM(rawoutstream, "<HDF5-File>\n");
+            }
+        }
+
+        if (!doxml) {
+            if (display_fi) {
+                PRINTVALSTREAM(rawoutstream, "\n");
+                dump_fcontents(fid);
+                end_obj(h5tools_dump_header_format->fileend,h5tools_dump_header_format->fileblockend);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                goto done;
+            }
+
+            if (display_bb)
+                dump_fcpl(fid);
+        }
+
+        if(display_all) {
+            if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
+                error_msg("unable to open root group\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            else {
+                if (!doxml)
+                    dump_indent += COL;
+                dump_function_table->dump_group_function(gid, "/" );
+                if (!doxml)
+                    dump_indent -= COL;
+                PRINTVALSTREAM(rawoutstream, "\n");
+            }
+
+            if(H5Gclose(gid) < 0) {
+                error_msg("unable to close root group\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+
+        }
+        else {
+            /* Note: this option is not supported for XML */
+            if(doxml) {
+                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+            } /* end if */
+
+            for(i = 0; i < argc; i++) {
+                if(hand[i].func) {
+                    hand[i].func(fid, hand[i].obj, hand[i].subset_info, 1, NULL);
+                }
+            }
+            PRINTVALSTREAM(rawoutstream, "\n");
+        }
+
+        if (!doxml) {
+            end_obj(h5tools_dump_header_format->fileend, h5tools_dump_header_format->fileblockend);
+            PRINTVALSTREAM(rawoutstream, "\n");
+        }
+        else {
+            PRINTSTREAM(rawoutstream, "</%sHDF5-File>\n", xmlnsprefix);
+        }
+        /* Free tables for objects */
+        table_list_free();
+
+        if(fid >=0)
+            if (H5Fclose(fid) < 0)
+                h5tools_setstatus(EXIT_FAILURE);
+
+        if(prefix) {
+            HDfree(prefix);
+            prefix = NULL;
+        }
+        if(fname) {
+            HDfree(fname);
+            fname = NULL;
+        }
+    } /* end while */
+
+    if(hand)
+        free_handler(hand, argc);
+
+    /* To Do:  clean up XML table */
+
+    leave(h5tools_getstatus());
+
+done:
+    /* Free tables for objects */
+    table_list_free();
+
+    if(fid >=0)
+        if (H5Fclose(fid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+
+    if(prefix) {
+        HDfree(prefix);
+        prefix = NULL;
+    }
+    if(fname) {
+        HDfree(fname);
+        fname = NULL;
+    }
+
+    if(hand)
+        free_handler(hand, argc);
+
+    /* To Do:  clean up XML table */
+
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
+    leave(h5tools_getstatus());
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5_fileaccess
+ *
+ * Purpose: Returns a file access template which is the default template
+ *      but with a file driver set according to the constant or
+ *      environment variable HDF5_DRIVER
+ *
+ * Return:  Success:    A file access property list
+ *
+ *      Failure:    -1
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, November 19, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5_fileaccess(void)
+{
+    static const char *multi_letters = "msbrglo";
+    const char  *val = NULL;
+    const char  *name;
+    char         s[1024];
+    hid_t        fapl = -1;
+
+    /* First use the environment variable, then the constant */
+    val = HDgetenv("HDF5_DRIVER");
+#ifdef HDF5_DRIVER
+    if (!val) val = HDF5_DRIVER;
+#endif
+
+    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1;
+    if (!val || !*val) return fapl; /*use default*/
+
+    HDstrncpy(s, val, sizeof s);
+    s[sizeof(s)-1] = '\0';
+    if (NULL==(name=HDstrtok(s, " \t\n\r"))) return fapl;
+
+    if (!HDstrcmp(name, "sec2")) {
+        /* Unix read() and write() system calls */
+        if (H5Pset_fapl_sec2(fapl)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "stdio")) {
+        /* Standard C fread() and fwrite() system calls */
+        if (H5Pset_fapl_stdio(fapl)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "core")) {
+        /* In-core temporary file with 1MB increment */
+        if (H5Pset_fapl_core(fapl, 1024*1024, FALSE)<0) return -1;
+    }
+    else if (!HDstrcmp(name, "split")) {
+        /* Split meta data and raw data each using default driver */
+        if (H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "multi")) {
+        /* Multi-file driver, general case of the split driver */
+        H5FD_mem_t      memb_map[H5FD_MEM_NTYPES];
+        hid_t           memb_fapl[H5FD_MEM_NTYPES];
+        const char     *memb_name[H5FD_MEM_NTYPES];
+        char            sv[H5FD_MEM_NTYPES][1024];
+        haddr_t         memb_addr[H5FD_MEM_NTYPES];
+        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);
+
+        HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
+        for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+            memb_fapl[mt] = H5P_DEFAULT;
+            memb_map[mt] = mt;
+            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+            memb_name[mt] = sv[mt];
+            memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
+        }
+
+        if (H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "family")) {
+        hsize_t fam_size = 100*1024*1024; /*100 MB*/
+
+        /* Family of files, each 1MB and using the default driver */
+        if ((val=HDstrtok(NULL, " \t\n\r")))
+            fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024);
+        if (H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT)<0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "log")) {
+        long log_flags = H5FD_LOG_LOC_IO;
+
+        /* Log file access */
+        if ((val = HDstrtok(NULL, " \t\n\r")))
+            log_flags = HDstrtol(val, NULL, 0);
+
+        if (H5Pset_fapl_log(fapl, NULL, (unsigned)log_flags, 0) < 0)
+            return -1;
+    }
+    else if (!HDstrcmp(name, "direct")) {
+        /* Substitute Direct I/O driver with sec2 driver temporarily because
+         * some output has sec2 driver as the standard. */
+        if (H5Pset_fapl_sec2(fapl)<0) return -1;
+    }
+    else {
+        /* Unknown driver */
+        return -1;
+    }
+
+    return fapl;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    init_prefix
+ *
+ * Purpose:     allocate and initialize prefix
+ *
+ * Return:      void
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+init_prefix(char **prfx, size_t prfx_len)
+{
+    HDassert(prfx_len > 0);
+    *prfx = (char *)HDcalloc(prfx_len, 1);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_prefix
+ *
+ * Purpose:     Add object to prefix
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+add_prefix(char **prfx, size_t *prfx_len, const char *name)
+{
+    size_t new_len = HDstrlen(*prfx) + HDstrlen(name) + 2;
+
+    /* Check if we need more space */
+    if(*prfx_len <= new_len) {
+        *prfx_len = new_len + 1;
+        *prfx = (char *)HDrealloc(*prfx, *prfx_len);
+    }
+
+    /* Append object name to prefix */
+    HDstrcat(HDstrcat(*prfx, "/"), name);
+} /* end add_prefix */
+
diff --git a/tools/src/h5dump/h5dump.h b/tools/src/h5dump/h5dump.h
new file mode 100644
index 0000000..211fd14
--- /dev/null
+++ b/tools/src/h5dump/h5dump.h
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_H__
+#define H5DUMP_H__
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_defines.h"
+
+/**
+ **  This is the global dispatch table for the dump functions.
+ **/
+/* the table of dump functions */
+typedef struct dump_functions_t {
+    void     (*dump_group_function) (hid_t, const char *);
+    void     (*dump_named_datatype_function) (hid_t, const char *);
+    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
+    void     (*dump_dataspace_function) (hid_t);
+    void     (*dump_datatype_function) (hid_t);
+    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
+    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
+} 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;
+    h5dump_table_items_t    *tables;
+} h5dump_table_list_t;
+
+h5dump_table_list_t  table_list = {0, 0, NULL};
+table_t             *group_table = NULL, *dset_table = NULL, *type_table = NULL;
+unsigned            dump_indent = 0;              /*how far in to indent the line         */
+
+int          unamedtype = 0;     /* shared datatype with no name */
+hbool_t      hit_elink = FALSE;  /* whether we have traversed an external link */
+size_t       prefix_len = 1024;
+char         *prefix = NULL;
+const char   *fp_format = NULL;
+
+/* things to display or which are set via command line parameters */
+int          display_all       = TRUE;
+int          display_oid       = FALSE;
+int          display_data      = TRUE;
+int          display_attr_data = TRUE;
+int          display_char      = FALSE; /*print 1-byte numbers as ASCII */
+int          usingdasho        = FALSE;
+int          display_bb        = FALSE; /*superblock */
+int          display_dcpl      = FALSE; /*dcpl */
+int          display_fi        = FALSE; /*file index */
+int          display_ai        = TRUE;  /*array index */
+int          display_escape    = FALSE; /*escape non printable characters */
+int          display_region    = FALSE; /*print region reference data */
+int          disable_compact_subset= FALSE; /* disable compact form of subset notation */
+int          display_packed_bits = FALSE; /*print 1-8 byte numbers as packed bits*/
+int          include_attrs     = TRUE; /* Display attributes */
+int          display_vds_first = FALSE; /* vds display to all by default*/
+int          vds_gap_size       = 0; /* vds skip missing files default is none */
+
+/* sort parameters */
+H5_index_t   sort_by           = H5_INDEX_NAME; /*sort_by [creation_order | name]  */
+H5_iter_order_t sort_order     = H5_ITER_INC; /*sort_order [ascending | descending]   */
+
+#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
+#define PACKED_BITS_SIZE_MAX    (8*sizeof(long long))  /* Maximum bits size of integer types of packed-bits */
+/* mask list for packed bits */
+unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
+
+/* packed bits display parameters */
+unsigned packed_offset[PACKED_BITS_MAX];
+unsigned packed_length[PACKED_BITS_MAX];
+
+/*
+ * The global table is set to either ddl_function_table or
+ * xml_function_table in the initialization.
+ */
+const dump_functions *dump_function_table;
+
+#ifdef __cplusplus
+"C" {
+#endif
+
+void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
+hid_t    h5_fileaccess(void);
+ssize_t  table_list_add(hid_t oid, unsigned long file_no);
+ssize_t  table_list_visited(unsigned long file_no);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_H__ */
diff --git a/tools/src/h5dump/h5dump_ddl.c b/tools/src/h5dump/h5dump_ddl.c
new file mode 100644
index 0000000..8ce6cd6
--- /dev/null
+++ b/tools/src/h5dump/h5dump_ddl.c
@@ -0,0 +1,2183 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "H5private.h"
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_extern.h"
+#include "h5dump_ddl.h"
+
+typedef struct {
+    hid_t fid;                      /* File ID being traversed */
+    const char *op_name;            /* Object name wanted */
+} trav_handle_udata_t;
+
+typedef struct {
+    const char *path;                 /* Path of object being searched */
+    const char *op_name;              /* Object name wanted */
+} trav_attr_udata_t;
+
+/* callback function used by H5Literate() */
+static herr_t   dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void *op_data);
+static int      dump_extlink(hid_t group, const char *linkname, const char *objname);
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_datatype
+ *
+ * Purpose:     Dump the datatype. Datatype can be HDF5 predefined
+ *              atomic datatype or committed/transient datatype.
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_datatype(hid_t type)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
+    h5dump_type_table = NULL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dataspace
+ *
+ * Purpose:     Dump the dataspace. Dataspace can be named dataspace,
+ *              array, or others.
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_dataspace(hid_t space)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_attr_cb
+ *
+ * Purpose:     attribute function callback called by H5Aiterate2, displays the attribute
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications: Pedro Vicente, October 4, 2007
+ *  Added H5A_info_t parameter to conform with H5Aiterate2
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+dump_attr_cb(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info, void H5_ATTR_UNUSED *_op_data)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+
+    hid_t       attr_id;
+    herr_t      ret = SUCCEED;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
+    oid_output = display_oid;
+    data_output = display_data;
+    attr_data_output = display_attr_data;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
+    h5dump_type_table = NULL;
+
+    if(attr_id < 0) {
+        h5tools_setstatus(EXIT_FAILURE);
+        ret = FAIL;
+    }
+
+    return ret;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_all_cb
+ *
+ * Purpose:     function callback called by H5Literate,
+ *                displays everything in the specified object
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  RMcG, November 2000
+ *   Added XML support. Also, optionally checks the op_data argument
+ *
+ * PVN, May 2008
+ *   Dump external links
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
+{
+    hid_t       obj;
+    hid_t       dapl_id = H5P_DEFAULT;  /* dataset access property list ID */
+    herr_t      ret = SUCCEED;
+    char       *obj_path = NULL;    /* Full path of object */
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    /* Build the object's path name */
+    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    if(!obj_path) {
+        ret = FAIL;
+        goto done;
+    }
+
+    HDstrcpy(obj_path, prefix);
+    HDstrcat(obj_path, "/");
+    HDstrcat(obj_path, name);
+
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5O_info_t  oinfo;
+
+        /* Stat the object */
+        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
+            error_msg("unable to get object information for \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+            goto done;
+        } /* end if */
+
+        switch(oinfo.type) {
+        case H5O_TYPE_GROUP:
+            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
+                error_msg("unable to dump group \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                char *old_prefix; /* Pointer to previous prefix */
+
+                /* Keep copy of prefix before iterating into group */
+                old_prefix = HDstrdup(prefix);
+                HDassert(old_prefix);
+
+                /* Append group name to prefix */
+                add_prefix(&prefix, &prefix_len, name);
+
+                /* Iterate into group */
+                dump_function_table->dump_group_function(obj, name);
+
+                /* Restore old prefix name */
+                HDstrcpy(prefix, old_prefix);
+                HDfree(old_prefix);
+
+                /* Close group */
+                H5Gclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_DATASET:
+            if(display_data) {
+                if ((dapl_id = H5Pcreate(H5P_DATASET_ACCESS)) < 0) {
+                    error_msg("error in creating default access property list ID\n");
+                }
+                if (display_vds_first) {
+                    if(H5Pset_virtual_view(dapl_id, H5D_VDS_FIRST_MISSING) < 0)
+                        error_msg("error in setting access property list ID, virtual_view\n");
+                }
+                if (vds_gap_size > 0) {
+                    if(H5Pset_virtual_printf_gap(dapl_id, (hsize_t)vds_gap_size) < 0)
+                        error_msg("error in setting access property list ID, virtual_printf_gap\n");
+                }
+            }
+            if((obj = H5Dopen2(group, name, dapl_id)) >= 0) {
+                if(oinfo.rc > 1 || hit_elink) {
+                    obj_t  *found_obj;    /* Found object */
+
+                    found_obj = search_obj(dset_table, oinfo.addr);
+
+                    if(found_obj == NULL) {
+                        ctx.indent_level++;
+
+                        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, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        h5tools_setstatus(EXIT_FAILURE);
+                        ret = FAIL;
+                        if (dapl_id != H5P_DEFAULT)
+                            H5Pclose(dapl_id);
+                        H5Dclose(obj);
+                        goto done;
+                    }
+                    else if(found_obj->displayed) {
+                        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, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level++;
+
+                        ctx.need_prefix = TRUE;
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        if (dapl_id != H5P_DEFAULT)
+                            H5Pclose(dapl_id);
+                        H5Dclose(obj);
+                        goto done;
+                    }
+                    else {
+                        found_obj->displayed = TRUE;
+                    }
+                } /* end if */
+
+                dump_function_table->dump_dataset_function(obj, name, NULL);
+                if (dapl_id != H5P_DEFAULT)
+                    H5Pclose(dapl_id);
+                H5Dclose(obj);
+            }
+            else {
+                if (dapl_id != H5P_DEFAULT)
+                    H5Pclose(dapl_id);
+                error_msg("unable to dump dataset \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
+                error_msg("unable to dump datatype \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                dump_function_table->dump_named_datatype_function(obj, name);
+                H5Tclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            error_msg("unknown object \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+        }
+    } /* end if */
+    else {
+        char       *targbuf;
+
+        switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            ctx.need_prefix = TRUE;
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\" %s",
+                    h5tools_dump_header_format->softlinkbegin, name,
+                    h5tools_dump_header_format->softlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                /* print the value of a soft link */
+                /* Standard DDL: no modification */
+                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, "LINKTARGET \"%s\"", targbuf);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->softlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->softlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->softlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->softlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            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, "%s \"%s\" %s",
+                    h5tools_dump_header_format->extlinkbegin, name,
+                    h5tools_dump_header_format->extlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                indentation(dump_indent);
+                error_msg("unable to get external link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } /* end if */
+            else {
+                const char *filename;
+                const char *targname;
+
+                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
+                    indentation(dump_indent);
+                    error_msg("unable to unpack external link value\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret = FAIL;
+                } /* end if */
+                else {
+                    ctx.indent_level++;
+
+                    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, "TARGETFILE \"%s\"", filename);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "TARGETPATH \"%s\"", targname);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    /* dump the external link */
+                    dump_extlink(group, name, targname);
+                    ctx.indent_level--;
+                } /* end else */
+            } /* end else */
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->extlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->extlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->extlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->extlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            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);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\" %s",
+                    h5tools_dump_header_format->udlinkbegin, name,
+                    h5tools_dump_header_format->udlinkblockbegin);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            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, "LINKCLASS %d", linfo->type);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+
+            ctx.need_prefix = TRUE;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            if(HDstrlen(h5tools_dump_header_format->udlinkblockend)) {
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkblockend);
+                if(HDstrlen(h5tools_dump_header_format->udlinkend))
+                    h5tools_str_append(&buffer, " ");
+            }
+            if(HDstrlen(h5tools_dump_header_format->udlinkend))
+                h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->udlinkend);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            break;
+        } /* end switch */
+    } /* end else */
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    if(obj_path)
+        HDfree(obj_path);
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    attr_iteration
+ *
+ * Purpose:     Iterate and display attributes within the specified group
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+attr_iteration(hid_t gid, unsigned attr_crt_order_flags)
+{
+    /* attribute iteration: if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
+       in the group for attributes, then, sort by creation order, otherwise by name */
+    if(include_attrs) {
+        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_attr_cb, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else {
+            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_attr_cb, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end else */
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    link_iteration
+ *
+ * Purpose:     Iterate and display links within the specified group
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+link_iteration(hid_t gid, unsigned crt_order_flags)
+{
+
+    /* if there is a request to do H5_INDEX_CRT_ORDER and tracking order is set
+       in the group, then, sort by creation order, otherwise by name */
+    if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+        H5Literate(gid, sort_by, sort_order, NULL, dump_all_cb, NULL);
+    else
+        H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, dump_all_cb, NULL);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_named_datatype
+ *
+ * Purpose:     Dump named datatype
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  Pedro Vicente, March 27, 2006
+ *   added display of attributes
+ *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
+ *   other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_named_datatype(hid_t tid, const char *name)
+{
+    H5O_info_t        oinfo;
+    unsigned          attr_crt_order_flags;
+    hid_t             tcpl_id = -1;  /* datatype creation property list ID */
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if ((tcpl_id = H5Tget_create_plist(tid)) < 0) {
+        error_msg("error in getting creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the creation properties for attributes */
+    if (H5Pget_attr_creation_order(tcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(tcpl_id) < 0) {
+        error_msg("error in closing creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    ctx.need_prefix = TRUE;
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+                        h5tools_dump_header_format->datatypebegin, name,
+                        h5tools_dump_header_format->datatypeblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    H5Oget_info(tid, &oinfo);
+
+    /* Must check for uniqueness of all objects if we've traversed an elink,
+     * otherwise only check if the reference count > 1.
+     */
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        else if (found_obj->displayed) {
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;
+        }
+        else
+            found_obj->displayed = TRUE;
+    } /* end if */
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_print_datatype(rawoutstream, &buffer, outputformat, &ctx, tid, FALSE);
+
+    if(H5Tget_class(tid) != H5T_COMPOUND) {
+        h5tools_str_append(&buffer, ";");
+    }
+
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /* print attributes */
+    dump_indent += COL;
+
+    attr_iteration(tid, attr_crt_order_flags);
+
+    dump_indent -= COL;
+
+done:
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->datatypeblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeblockend);
+        if(HDstrlen(h5tools_dump_header_format->datatypeend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->datatypeend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datatypeend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_group
+ *
+ * Purpose:     Dump everything within the specified group
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ * Call to dump_all_cb -- add parameter to select everything.
+ *
+ * Pedro Vicente, October 1, 2007
+ *  handle several iteration orders for attributes and groups
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_group(hid_t gid, const char *name)
+{
+    H5O_info_t  oinfo;
+    hid_t       dset;
+    hid_t       type;
+    hid_t       gcpl_id;
+    unsigned    crt_order_flags;
+    unsigned    attr_crt_order_flags;
+    char        type_name[1024];
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+        error_msg("error in getting group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties for attributes */
+    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties */
+    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(gcpl_id) < 0) {
+        error_msg("error in closing group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.need_prefix = TRUE;
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s \"%s\" %s",
+                        h5tools_dump_header_format->groupbegin, name,
+                        h5tools_dump_header_format->groupblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if(!HDstrcmp(name, "/") && unamedtype) {
+        unsigned    u;  /* Local index variable */
+
+        /* dump unamed type in root group */
+        for(u = 0; u < type_table->nobjs; u++)
+            if(!type_table->objs[u].recorded) {
+                dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                type = H5Dget_type(dset);
+                sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                dump_function_table->dump_named_datatype_function(type, type_name);
+                H5Tclose(type);
+                H5Dclose(dset);
+            }
+    } /* end if */
+
+    if(display_oid)
+        h5tools_dump_oid(rawoutstream, outputformat, &ctx, gid);
+
+    h5tools_dump_comment(rawoutstream, outputformat, &ctx, gid);
+
+    H5Oget_info(gid, &oinfo);
+
+    /* Must check for uniqueness of all objects if we've traversed an elink,
+     * otherwise only check if the reference count > 1.
+     */
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(group_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+        else if (found_obj->displayed) {
+            ctx.need_prefix = TRUE;
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s \"%s\"", HARDLINK, found_obj->objname);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            found_obj->displayed = TRUE;
+            attr_iteration(gid, attr_crt_order_flags);
+            link_iteration(gid, crt_order_flags);
+        }
+    }
+    else {
+        attr_iteration(gid, attr_crt_order_flags);
+        link_iteration(gid, crt_order_flags);
+    }
+
+    dump_indent -= COL;
+    ctx.indent_level--;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->groupblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupblockend);
+        if(HDstrlen(h5tools_dump_header_format->groupend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->groupend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->groupend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_dataset
+ *
+ * Purpose:     Dump the specified data set
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  Pedro Vicente, 2004, added dataset creation property list display
+ *  Pedro Vicente, October 4, 2007, added parameters to H5Aiterate2() to allow for
+ *   other  iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_dataset(hid_t did, const char *name, struct subset_t *sset)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hid_t       type, space;
+    unsigned    attr_crt_order_flags;
+    hid_t       dcpl_id;  /* dataset creation property list ID */
+    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t       curr_pos = 0;        /* total data element position   */
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if ((dcpl_id = H5Dget_create_plist(did)) < 0) {
+        error_msg("error in getting creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the creation properties for attributes */
+    if (H5Pget_attr_creation_order(dcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    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, "%s \"%s\" %s",
+                        h5tools_dump_header_format->datasetbegin, name,
+                        h5tools_dump_header_format->datasetblockbegin);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_dump_comment(rawoutstream, outputformat, &ctx, did);
+
+    dump_indent += COL;
+    ctx.indent_level++;
+
+    type = H5Dget_type(did);
+    h5dump_type_table = type_table;
+    h5tools_dump_datatype(rawoutstream, outputformat, &ctx, type);
+    h5dump_type_table = NULL;
+
+    space = H5Dget_space(did);
+    h5tools_dump_dataspace(rawoutstream, outputformat, &ctx, space);
+    H5Sclose(space);
+
+    if(display_oid) {
+        h5tools_dump_oid(rawoutstream, outputformat, &ctx, did);
+    }
+
+    if(display_dcpl) {
+        h5dump_type_table = type_table;
+        h5tools_dump_dcpl(rawoutstream, outputformat, &ctx, dcpl_id, type, did);
+        h5dump_type_table = NULL;
+    }
+    H5Pclose(dcpl_id);
+
+    if(display_data) {
+        unsigned  data_loop = 1;
+        unsigned  u;
+
+        if(display_packed_bits)
+            data_loop = packed_bits_num;
+        for(u = 0; u < data_loop; u++) {
+            if(display_packed_bits) {
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                packed_data_mask = packed_mask[u];
+                packed_data_offset = packed_offset[u];
+                packed_data_length = packed_length[u];
+                h5tools_print_packed_bits(&buffer, type);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            switch(H5Tget_class(type)) {
+            case H5T_TIME:
+                ctx.indent_level++;
+
+                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, "DATA{ not yet implemented.}");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.indent_level--;
+                break;
+
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_COMPOUND:
+            case H5T_REFERENCE:
+            case H5T_ENUM:
+            case H5T_VLEN:
+            case H5T_ARRAY:
+                {
+                    h5tools_dump_data(rawoutstream, outputformat, &ctx, did, TRUE, sset, display_ai, display_char);
+                }
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                HDassert(0);
+                break;
+            } /* end switch */
+        } /* for(u=0; u<data_loop; u++) */
+    }
+    H5Tclose(type);
+
+    if (!bin_output) {
+        attr_iteration(did, attr_crt_order_flags);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+        if(HDstrlen(h5tools_dump_header_format->datasetend))
+            h5tools_str_append(&buffer, " ");
+    }
+    if(HDstrlen(h5tools_dump_header_format->datasetend))
+        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_data
+ *
+ * Purpose:     Dump attribute or dataset data
+ *
+ * Return:      void
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications: pvn, print the matrix indices
+ *  Albert Cheng, 2004/11/18
+ *  Add --string printing for attributes too.
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_data(hid_t obj_id, int obj_data, struct subset_t *sset, int display_index)
+{
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    int               print_dataset = FALSE;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    if(obj_data == DATASET_DATA)
+        print_dataset = TRUE;
+    h5tools_dump_data(rawoutstream, outputformat, &ctx, obj_id, print_dataset, sset, display_index, display_char);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_fcpl
+ *
+ * Purpose:     prints file creation property list information
+ *
+ * Return:      void
+ *
+ * Programmer:  pvn
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_fcpl(hid_t fid)
+{
+    hid_t    fcpl;      /* file creation property list ID */
+    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 */
+    H5F_fspace_strategy_t  fs_strategy;  /* file space strategy */
+    hbool_t fs_persist; 	/* Persisting free-space or not */
+    hsize_t fs_threshold;   	/* free-space section threshold */
+    hsize_t fsp_size;    	/* file space page size */
+    H5F_info2_t finfo;  	/* file information */
+#ifdef SHOW_FILE_DRIVER
+    hid_t    fapl;      /* file access property list ID */
+    hid_t    fdriver;   /* file driver */
+    char     dname[32]; /* buffer to store driver name */
+#endif
+    unsigned sym_lk;    /* symbol table B-tree leaf 'K' value */
+    unsigned sym_ik;    /* symbol table B-tree internal 'K' value */
+    unsigned istore_ik; /* indexed storage B-tree internal 'K' value */
+
+    fcpl=H5Fget_create_plist(fid);
+    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_strategy(fcpl, &fs_strategy, &fs_persist, &fs_threshold);
+    H5Pget_file_space_page_size(fcpl, &fsp_size);
+    H5Pclose(fcpl);
+#ifdef SHOW_FILE_DRIVER
+    fapl=h5_fileaccess();
+    fdriver=H5Pget_driver(fapl);
+    H5Pclose(fapl);
+#endif
+
+   /*-------------------------------------------------------------------------
+    * SUPER_BLOCK
+    *-------------------------------------------------------------------------
+    */
+    PRINTSTREAM(rawoutstream, "\n%s %s\n",SUPER_BLOCK, BEGIN);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","SUPERBLOCK_VERSION", finfo.super.version);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","FREELIST_VERSION", finfo.free.version);
+    indentation(dump_indent + COL);
+    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", finfo.sohm.version);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream,"%s %zu\n","OFFSET_SIZE", off_size);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream,"%s %zu\n","LENGTH_SIZE", len_size);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","BTREE_RANK", sym_ik);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %d\n","BTREE_LEAF", sym_lk);
+
+#ifdef SHOW_FILE_DRIVER
+    if(H5FD_CORE==fdriver)
+        HDstrcpy(dname,"H5FD_CORE");
+#ifdef H5_HAVE_DIRECT
+    else if(H5FD_DIRECT==fdriver)
+        HDstrcpy(dname,"H5FD_DIRECT");
+#endif
+    else if(H5FD_FAMILY==fdriver)
+        HDstrcpy(dname,"H5FD_FAMILY");
+    else if(H5FD_LOG==fdriver)
+        HDstrcpy(dname,"H5FD_LOG");
+    else if(H5FD_MPIO==fdriver)
+        HDstrcpy(dname,"H5FD_MPIO");
+    else if(H5FD_MULTI==fdriver)
+        HDstrcpy(dname,"H5FD_MULTI");
+    else if(H5FD_SEC2==fdriver)
+        HDstrcpy(dname,"H5FD_SEC2");
+    else if(H5FD_STDIO==fdriver)
+        HDstrcpy(dname,"H5FD_STDIO");
+    else
+        HDstrcpy(dname,"Unknown driver");
+
+    /* Take out this because the driver used can be different from the
+     * standard output. */
+    /*indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %s\n","FILE_DRIVER", dname);*/
+#endif
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %u\n","ISTORE_K", istore_ik);
+
+    indentation(dump_indent + COL);
+    if(fs_strategy == H5F_FSPACE_STRATEGY_FSM_AGGR) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FSPACE_STRATEGY_FSM_AGGR");
+    } else if(fs_strategy == H5F_FSPACE_STRATEGY_PAGE) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FSPACE_STRATEGY_PAGE");
+    } else if(fs_strategy == H5F_FSPACE_STRATEGY_AGGR) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FSPACE_STRATEGY_AGGR");
+    } else if(fs_strategy == H5F_FSPACE_STRATEGY_NONE) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FSPACE_STRATEGY_NONE");
+    } else
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "Unknown strategy");
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %s\n","FREE_SPACE_PERSIST", fs_persist ? "TRUE" : "FALSE");
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %Hu\n","FREE_SPACE_SECTION_THRESHOLD", fs_threshold);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %Hu\n","FILE_SPACE_PAGE_SIZE", fsp_size);
+
+    /*-------------------------------------------------------------------------
+    * USER_BLOCK
+    *-------------------------------------------------------------------------
+    */
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "USER_BLOCK %s\n",BEGIN);
+    indentation(dump_indent + COL + COL);
+    PRINTSTREAM(rawoutstream,"%s %Hu\n","USERBLOCK_SIZE", userblock);
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s\n",END);
+
+    PRINTSTREAM(rawoutstream, "%s",END);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    dump_fcontents
+ *
+ * Purpose:     prints all objects
+ *
+ * Return:      void
+ *
+ * Programmer:  pvn
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_fcontents(hid_t fid)
+{
+    PRINTSTREAM(rawoutstream, "%s %s\n",FILE_CONTENTS, BEGIN);
+
+    /* special case of unamed types in root group */
+    if (unamedtype) {
+        unsigned u;
+
+        for (u = 0; u < type_table->nobjs; u++) {
+            if (!type_table->objs[u].recorded)
+                PRINTSTREAM(rawoutstream, " %-10s /#"H5_PRINTF_HADDR_FMT"\n", "datatype", type_table->objs[u].objno);
+        }
+    }
+
+    /* print objects in the files */
+    h5trav_print(fid);
+
+    PRINTSTREAM(rawoutstream, " %s\n",END);
+}
+
+static herr_t
+attr_search(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *_op_data)
+{
+    herr_t              ret = SUCCEED;
+    int                 j;
+    char               *obj_op_name;
+    char               *obj_name;
+    trav_attr_udata_t  *attr_data = (trav_attr_udata_t*)_op_data;
+    const char         *buf = attr_data->path;
+    const char         *op_name = attr_data->op_name;
+
+    j = (int)HDstrlen(op_name) - 1;
+    /* find the last / */
+    while(j >= 0) {
+        if(op_name[j] == '/' && (j == 0 || (j > 0 && op_name[j - 1] != '\\')))
+            break;
+        j--;
+    }
+
+    obj_op_name = h5tools_str_replace(op_name + j + 1, "\\/", "/");
+
+    if(obj_op_name == NULL) {
+        h5tools_setstatus(EXIT_FAILURE);
+        ret = FAIL;
+    }
+    else {
+        if(HDstrcmp(attr_name, obj_op_name)==0) {
+            size_t u, v, w;
+
+            /* object name */
+            u = HDstrlen(buf);
+            v = HDstrlen(op_name);
+            w = u + 1 + v + 1 + 2;
+            obj_name = (char *)HDmalloc(w);
+            if(obj_name == NULL) {
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                HDmemset(obj_name, '\0', w);
+                if(op_name[0] != '/') {
+                    HDstrncat(obj_name, buf, u + 1);
+                    if(buf[u - 1] != '/')
+                        HDstrncat(obj_name, "/", (size_t)2);
+                }
+                HDstrncat(obj_name, op_name, v + 1);
+
+                handle_attributes(oid, obj_name, NULL, 0, NULL);
+                HDfree(obj_name);
+            }
+        }
+        HDfree(obj_op_name);
+    }
+    return ret;
+} /* end attr_search() */
+
+static herr_t
+obj_search(const char *path, const H5O_info_t *oi, const char H5_ATTR_UNUSED *already_visited, void *_op_data)
+{
+    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
+    const char *op_name = handle_data->op_name;
+    trav_attr_udata_t  attr_data;
+
+    attr_data.path = path;
+    attr_data.op_name = op_name;
+    H5Aiterate_by_name(handle_data->fid, path, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_search, (void*)&attr_data, H5P_DEFAULT);
+
+    if(HDstrcmp(path, op_name) == 0) {
+        switch(oi->type) {
+            case H5O_TYPE_GROUP:
+                handle_groups(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_DATASET:
+                handle_datasets(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_NAMED_DATATYPE:
+                handle_datatypes(handle_data->fid, path, NULL, 0, NULL);
+                break;
+
+            case H5O_TYPE_UNKNOWN:
+            case H5O_TYPE_NTYPES:
+            default:
+                error_msg("unknown object type value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+        } /* end switch */
+    }
+
+    return 0;
+} /* end obj_search() */
+
+static herr_t
+lnk_search(const char *path, const H5L_info_t *li, void *_op_data)
+{
+    size_t      search_len;
+    size_t      k;
+    char       *search_name;
+    trav_handle_udata_t  *handle_data = (trav_handle_udata_t*)_op_data;
+    const char *op_name = handle_data->op_name;
+
+    search_len = HDstrlen(op_name);
+    if(search_len > 0 && op_name[0] != '/')
+        k = 2;
+    else
+        k = 1;
+    search_name = (char *)HDmalloc(search_len + k);
+    if(search_name == NULL) {
+        error_msg("creating temporary link\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        if (k == 2) {
+            HDstrcpy(search_name, "/");
+            HDstrncat(search_name, op_name, search_len + 1);
+        }
+        else
+            HDstrncpy(search_name, op_name, search_len + 1);
+        search_name[search_len + k - 1] = '\0';
+
+        if(HDstrcmp(path, search_name) == 0) {
+            switch(li->type) {
+            case H5L_TYPE_SOFT:
+            case H5L_TYPE_EXTERNAL:
+                handle_links(handle_data->fid, op_name, NULL, 0, NULL);
+                break;
+
+            case H5L_TYPE_HARD:
+            case H5L_TYPE_MAX:
+            case H5L_TYPE_ERROR:
+            default:
+                error_msg("unknown link type value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                break;
+            } /* end switch() */
+        }
+        HDfree(search_name);
+    }
+    return 0;
+} /* end lnk_search() */
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_paths
+ *
+ * Purpose:     Handle objects from the command.
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_paths(hid_t fid, const char *path_name, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
+{
+    hid_t  gid = -1;
+
+    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) {
+        error_msg("unable to open root group\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        hid_t       gcpl_id;
+        unsigned    crt_order_flags;
+        unsigned    attr_crt_order_flags;
+        trav_handle_udata_t handle_udata;     /* User data for traversal */
+
+        if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+            error_msg("error in getting group creation property list ID\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        /* query the group creation properties for attributes */
+        if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+            error_msg("error in getting group creation properties\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        /* query the group creation properties */
+        if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+            error_msg("error in getting group creation properties\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        if(H5Pclose(gcpl_id) < 0) {
+            error_msg("error in closing group creation property list ID\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+
+        handle_udata.fid = fid;
+        handle_udata.op_name = path_name;
+        if(h5trav_visit(fid, "/", TRUE, TRUE, obj_search, lnk_search, &handle_udata) < 0) {
+            error_msg("error traversing information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_attributes
+ *
+ * Purpose:     Handle the attributes from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ * PVN, May 2008
+ *   add an extra parameter PE, to allow printing/not printing of error messages
+ *
+ *-------------------------------------------------------------------------
+ */
+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      = NULL;
+    char *attr_name     = NULL;
+    int j;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &h5tools_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    j = (int)HDstrlen(attr) - 1;
+    obj_name = (char *)HDmalloc((size_t)j + 2);
+    if(obj_name == NULL)
+        goto error;
+
+    /* find the last / */
+    while(j >= 0) {
+        if (attr[j] == '/' && (j==0 || (j>0 && attr[j-1]!='\\')))
+            break;
+        j--;
+    }
+
+    /* object name */
+    if(j == -1)
+        HDstrcpy(obj_name, "/");
+    else {
+        HDstrncpy(obj_name, attr, (size_t)j + 1);
+        obj_name[j + 1] = '\0';
+    } /* end else */
+
+    dump_indent += COL;
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    attr_name = h5tools_str_replace(attr + j + 1, "\\/", "/");
+
+    /* handle error case: cannot open the object with the attribute */
+    if((oid = H5Oopen(fid, obj_name, H5P_DEFAULT)) < 0) {
+        /* setup */
+        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+        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, "%s \"%s\" %s",
+                h5tools_dump_header_format->attributebegin, attr,
+                h5tools_dump_header_format->attributeblockbegin);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        error_msg("unable to open object \"%s\"\n", obj_name);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        if(HDstrlen(h5tools_dump_header_format->attributeblockend)) {
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeblockend);
+            if(HDstrlen(h5tools_dump_header_format->attributeend))
+                h5tools_str_append(&buffer, " ");
+        }
+        if(HDstrlen(h5tools_dump_header_format->attributeend))
+            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->attributeend);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+
+        goto error;
+    } /* end if */
+
+    attr_id = H5Aopen(oid, attr_name, H5P_DEFAULT);
+    oid_output = display_oid;
+    data_output = display_data;
+    attr_data_output = display_attr_data;
+
+    h5dump_type_table = type_table;
+    h5tools_dump_attribute(rawoutstream, outputformat, &ctx, attr_name, attr_id, display_ai, display_char);
+    h5dump_type_table = NULL;
+
+    if(attr_id < 0) {
+        goto error;
+    }
+
+    /* Close object */
+    if(H5Oclose(oid) < 0) {
+        goto error;
+    } /* end if */
+
+    HDfree(obj_name);
+    HDfree(attr_name);
+    dump_indent -= COL;
+    return;
+
+error:
+    h5tools_setstatus(EXIT_FAILURE);
+    if(obj_name)
+        HDfree(obj_name);
+
+    if (attr_name)
+        HDfree(attr_name);
+
+    H5E_BEGIN_TRY {
+        H5Oclose(oid);
+        H5Aclose(attr_id);
+    } H5E_END_TRY;
+    dump_indent -= COL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_datasets
+ *
+ * Purpose:     Handle the datasets from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *  Pedro Vicente, Tuesday, January 15, 2008
+ *  check for block overlap\
+ *
+ *  Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_datasets(hid_t fid, const char *dset, void *data, int pe, const char *display_name)
+{
+    H5O_info_t       oinfo;
+    hid_t            dsetid;
+    hid_t            dapl_id = H5P_DEFAULT;  /* dataset access property list ID */
+    struct subset_t *sset = (struct subset_t *)data;
+    const char      *real_name = display_name ? display_name : dset;
+
+    if(display_data) {
+        if ((dapl_id = H5Pcreate(H5P_DATASET_ACCESS)) < 0) {
+            error_msg("error in creating default access property list ID\n");
+        }
+        if (display_vds_first) {
+            if(H5Pset_virtual_view(dapl_id, H5D_VDS_FIRST_MISSING) < 0)
+                error_msg("error in setting access property list ID, virtual_view\n");
+        }
+        if (vds_gap_size > 0) {
+            if(H5Pset_virtual_printf_gap(dapl_id, (hsize_t)vds_gap_size) < 0)
+                error_msg("error in setting access property list ID, virtual_printf_gap\n");
+        }
+    }
+    if((dsetid = H5Dopen2(fid, dset, dapl_id)) < 0) {
+        if (pe)
+            handle_links(fid, dset, data, pe, display_name);
+        return;
+    } /* end if */
+
+    if(sset) {
+        unsigned int i;
+        unsigned int ndims;
+        hid_t sid = H5Dget_space(dsetid);
+        int ndims_res = H5Sget_simple_extent_ndims(sid);
+
+        H5Sclose(sid);
+        if(ndims_res < 0) {
+            error_msg("H5Sget_simple_extent_ndims failed\n");
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        ndims = (unsigned)ndims_res;
+
+        if(!sset->start.data || !sset->stride.data || !sset->count.data || !sset->block.data) {
+            /* they didn't specify a ``stride'' or ``block''. default to 1 in all
+             * dimensions */
+            if(!sset->start.data) {
+                /* default to (0, 0, ...) for the start coord */
+                sset->start.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->start.len = ndims;
+            }
+
+            if(!sset->stride.data) {
+                sset->stride.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->stride.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->stride.data[i] = 1;
+            }
+
+            if(!sset->count.data) {
+                sset->count.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->count.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->count.data[i] = 1;
+            }
+
+            if(!sset->block.data) {
+                sset->block.data = (hsize_t *)HDcalloc((size_t)ndims, sizeof(hsize_t));
+                sset->block.len = ndims;
+                for (i = 0; i < ndims; i++)
+                    sset->block.data[i] = 1;
+            }
+        }
+
+        /*-------------------------------------------------------------------------
+         * check for dimension overflow
+         *-------------------------------------------------------------------------
+         */
+        if(sset->start.len > ndims) {
+            error_msg("number of start dims (%u) exceed dataset dims (%u)\n", sset->start.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->stride.len > ndims) {
+            error_msg("number of stride dims (%u) exceed dataset dims (%u)\n", sset->stride.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->count.len > ndims) {
+            error_msg("number of count dims (%u) exceed dataset dims (%u)\n", sset->count.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+        if(sset->block.len > ndims) {
+            error_msg("number of block dims (%u) exceed dataset dims (%u)\n", sset->block.len, ndims);
+            h5tools_setstatus(EXIT_FAILURE);
+            return;
+        }
+
+        /*-------------------------------------------------------------------------
+         * check for block overlap
+         *-------------------------------------------------------------------------
+         */
+        for(i = 0; i < ndims; i++) {
+            if(sset->count.data[i] > 1) {
+                if(sset->stride.data[i] < sset->block.data[i]) {
+                    error_msg("wrong subset selection; blocks overlap\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    return;
+                } /* end if */
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+
+    H5Oget_info(dsetid, &oinfo);
+    if(oinfo.rc > 1 || hit_elink) {
+        obj_t  *found_obj;    /* Found object */
+
+        found_obj = search_obj(dset_table, oinfo.addr);
+
+        if(found_obj) {
+            if (found_obj->displayed) {
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(dump_indent);
+                begin_obj(h5tools_dump_header_format->datasetbegin, real_name, h5tools_dump_header_format->datasetblockbegin);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(dump_indent + COL);
+                PRINTSTREAM(rawoutstream, "%s \"%s\"\n", HARDLINK, found_obj->objname);
+                indentation(dump_indent);
+                end_obj(h5tools_dump_header_format->datasetend, h5tools_dump_header_format->datasetblockend);
+            }
+            else {
+                found_obj->displayed = TRUE;
+                dump_indent += COL;
+                dump_dataset(dsetid, real_name, sset);
+                dump_indent -= COL;
+            }
+        }
+        else
+            h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        dump_indent += COL;
+        dump_dataset(dsetid, real_name, sset);
+        dump_indent -= COL;
+    }
+    if (dapl_id != H5P_DEFAULT)
+        H5Pclose(dapl_id);
+    if(H5Dclose(dsetid) < 0)
+        h5tools_setstatus(EXIT_FAILURE);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_groups
+ *
+ * Purpose:     Handle the groups from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications: Pedro Vicente, September 26, 2007
+ *  handle creation order
+ *
+ * Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name)
+{
+    hid_t       gid;
+    const char  *real_name = display_name ? display_name : group;
+
+    if((gid = H5Gopen2(fid, group, H5P_DEFAULT)) < 0) {
+        if (pe) {
+            PRINTVALSTREAM(rawoutstream, "\n");
+            begin_obj(h5tools_dump_header_format->groupbegin, real_name, h5tools_dump_header_format->groupblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            error_msg("unable to open group \"%s\"\n", real_name);
+            end_obj(h5tools_dump_header_format->groupend, h5tools_dump_header_format->groupblockend);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    }
+    else {
+        size_t new_len = HDstrlen(group) + 1;
+
+        if(prefix_len <= new_len) {
+            prefix_len = new_len;
+            prefix = (char *)HDrealloc(prefix, prefix_len);
+        } /* end if */
+
+        HDstrcpy(prefix, group);
+
+        dump_indent += COL;
+        dump_group(gid, real_name);
+        dump_indent -= COL;
+
+        if(H5Gclose(gid) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+    } /* end else */
+} /* end handle_groups() */
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_links
+ *
+ * Purpose:     Handle soft or UD links from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
+{
+    H5L_info_t linfo;
+
+    if(H5Lget_info(fid, links, &linfo, H5P_DEFAULT) < 0) {
+        error_msg("unable to get link info from \"%s\"\n", links);
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else if(linfo.type == H5L_TYPE_HARD) {
+        error_msg("\"%s\" is a hard link\n", links);
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+    else {
+        char *buf = (char *)HDmalloc(linfo.u.val_size);
+        PRINTVALSTREAM(rawoutstream, "\n");
+
+        switch(linfo.type) {
+        case H5L_TYPE_SOFT:    /* Soft link */
+            begin_obj(h5tools_dump_header_format->softlinkbegin, links, h5tools_dump_header_format->softlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
+                PRINTSTREAM(rawoutstream, "LINKTARGET \"%s\"\n", buf);
+            }
+            else {
+                error_msg("h5dump error: unable to get link value for \"%s\"\n", links);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            end_obj(h5tools_dump_header_format->softlinkend, h5tools_dump_header_format->softlinkblockend);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            begin_obj(h5tools_dump_header_format->extlinkbegin, links, h5tools_dump_header_format->extlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            if(H5Lget_val(fid, links, buf, linfo.u.val_size, H5P_DEFAULT) >= 0) {
+                const char *elink_file;
+                const char *elink_path;
+
+                if(H5Lunpack_elink_val(buf, linfo.u.val_size, NULL, &elink_file, &elink_path)>=0) {
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "TARGETFILE \"%s\"\n", elink_file);
+                    indentation(COL);
+                    PRINTSTREAM(rawoutstream, "TARGETPATH \"%s\"\n", elink_path);
+                }
+                else {
+                    error_msg("h5dump error: unable to unpack external link value for \"%s\"\n", links);
+                    h5tools_setstatus(EXIT_FAILURE);
+                }
+            }
+            else {
+                error_msg("h5dump error: unable to get external link value for \"%s\"\n", links);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+            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");
+            indentation(COL);
+            begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
+            PRINTVALSTREAM(rawoutstream, "\n");
+            indentation(COL);
+            PRINTSTREAM(rawoutstream, "LINKCLASS %d\n", linfo.type);
+            end_obj(h5tools_dump_header_format->udlinkend, h5tools_dump_header_format->udlinkblockend);
+            break;
+        } /* end switch */
+        HDfree(buf);
+    } /* end else */
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    handle_datatypes
+ *
+ * Purpose:     Handle the datatypes from the command.
+ *
+ * Return:      void
+ *
+ * Programmer:  Bill Wendling
+ *              Tuesday, 9. January 2001
+ *
+ * Modifications:
+ *
+ *  Pedro Vicente, May 8, 2008
+ *   added a flag PE that prints/not prints error messages
+ *   added for cases of external links not found, to avoid printing of
+ *    objects not found, since external links are dumped on a trial error basis
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name)
+{
+    hid_t       type_id;
+    const char  *real_name = display_name ? display_name : type;
+
+    if((type_id = H5Topen2(fid, type, H5P_DEFAULT)) < 0) {
+        /* check if type is unamed datatype */
+        unsigned idx = 0;
+
+        while(idx < type_table->nobjs ) {
+            char name[128];
+
+            if(!type_table->objs[idx].recorded) {
+                /* unamed datatype */
+                sprintf(name, "/#"H5_PRINTF_HADDR_FMT, type_table->objs[idx].objno);
+
+                if(!HDstrcmp(name, real_name))
+                    break;
+            } /* end if */
+
+            idx++;
+        } /* end while */
+
+        if(idx == type_table->nobjs) {
+            if (pe) {
+                /* unknown type */
+                PRINTVALSTREAM(rawoutstream, "\n");
+                begin_obj(h5tools_dump_header_format->datatypebegin, real_name, h5tools_dump_header_format->datatypeblockbegin);
+                PRINTVALSTREAM(rawoutstream, "\n");
+                indentation(COL);
+                error_msg("unable to open datatype \"%s\"\n", real_name);
+                end_obj(h5tools_dump_header_format->datatypeend, h5tools_dump_header_format->datatypeblockend);
+                h5tools_setstatus(EXIT_FAILURE);
+            }
+        }
+        else {
+            hid_t dsetid = H5Dopen2(fid, type_table->objs[idx].objname, H5P_DEFAULT);
+            type_id = H5Dget_type(dsetid);
+
+            dump_indent += COL;
+            dump_named_datatype(type_id, real_name);
+            dump_indent -= COL;
+
+            H5Tclose(type_id);
+            H5Dclose(dsetid);
+        }
+    }
+    else {
+        dump_indent += COL;
+        dump_named_datatype(type_id, real_name);
+        dump_indent -= COL;
+
+        if(H5Tclose(type_id) < 0)
+            h5tools_setstatus(EXIT_FAILURE);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    dump_extlink
+ *
+ * made by: PVN
+ *
+ * Purpose:     Dump an external link
+ *  Since external links are soft links, they are dumped on a trial error
+ *   basis, attempting to dump as a dataset, as a group and as a named datatype
+ *   Error messages are supressed
+ *
+ * Modifications:
+ *      Neil Fortner
+ *      13 October 2008
+ *      Function basically rewritten.  No longer directly opens the target file,
+ *      now initializes a new set of tables for the external file.  No longer
+ *      dumps on a trial and error basis, but errors are still suppressed.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+dump_extlink(hid_t group, const char *linkname, const char *objname)
+{
+    hid_t       oid;
+    H5O_info_t  oi;
+    table_t     *old_group_table = group_table;
+    table_t     *old_dset_table = dset_table;
+    table_t     *old_type_table = type_table;
+    hbool_t     old_hit_elink;
+    ssize_t     idx;
+
+    /* Open target object */
+    if ((oid = H5Oopen(group, linkname, H5P_DEFAULT)) < 0)
+        goto fail;
+
+    /* Get object info */
+    if (H5Oget_info(oid, &oi) < 0) {
+        H5Oclose(oid);
+        goto fail;
+    }
+
+    /* Check if we have visited this file already */
+    if ((idx = table_list_visited(oi.fileno)) < 0) {
+        /* We have not visited this file, build object tables */
+        if ((idx = table_list_add(oid, oi.fileno)) < 0) {
+            H5Oclose(oid);
+            goto fail;
+        }
+    }
+
+    /* Do not recurse through an external link into the original file (idx=0) */
+    if (idx) {
+        /* Update table pointers */
+        group_table = table_list.tables[idx].group_table;
+        dset_table = table_list.tables[idx].dset_table;
+        type_table = table_list.tables[idx].type_table;
+
+        /* We will now traverse the external link, set this global to indicate this */
+        old_hit_elink = hit_elink;
+        hit_elink = TRUE;
+
+        /* add some indentation to distinguish that these objects are external */
+        dump_indent += COL;
+
+        /* Recurse into the external file */
+        switch (oi.type) {
+            case H5O_TYPE_GROUP:
+                handle_groups(group, linkname, NULL, 0, objname);
+                break;
+
+            case H5O_TYPE_DATASET:
+                handle_datasets(group, linkname, NULL, 0, objname);
+                break;
+
+            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);
+        }
+
+        dump_indent -= COL;
+
+        /* Reset table pointers */
+        group_table = old_group_table;
+        dset_table = old_dset_table;
+        type_table = old_type_table;
+
+        /* Reset hit_elink */
+        hit_elink = old_hit_elink;
+    } /* end if */
+
+    if (H5Idec_ref(oid) < 0)
+        h5tools_setstatus(EXIT_FAILURE);
+
+    return SUCCEED;
+
+fail:
+    return FAIL;
+}
+
diff --git a/tools/src/h5dump/h5dump_ddl.h b/tools/src/h5dump/h5dump_ddl.h
new file mode 100644
index 0000000..ae01086
--- /dev/null
+++ b/tools/src/h5dump/h5dump_ddl.h
@@ -0,0 +1,50 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5DUMP_DDL_H__
+#define H5DUMP_DDL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The dump functions of the dump_function_table */
+/* standard format:  no change */
+void      dump_group(hid_t, const char *);
+void      dump_named_datatype(hid_t, const char *);
+void      dump_dataset(hid_t, const char *, struct subset_t *);
+void      dump_dataspace(hid_t space);
+void      dump_datatype(hid_t type);
+void      dump_data(hid_t, int, struct subset_t *, int);
+void      dump_fcpl(hid_t fid);
+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);
+void handle_groups(hid_t fid, const char *group, void H5_ATTR_UNUSED *data, int pe, const char *display_name);
+void handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name);
+void handle_datatypes(hid_t fid, const char *type, void H5_ATTR_UNUSED * data, int pe, const char *display_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_DDL_H__ */
diff --git a/tools/src/h5dump/h5dump_defines.h b/tools/src/h5dump/h5dump_defines.h
new file mode 100644
index 0000000..7a9d4c0
--- /dev/null
+++ b/tools/src/h5dump/h5dump_defines.h
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_DEFINES_H__
+#define H5DUMP_DEFINES_H__
+
+#define H5DUMP_MAX_RANK     H5S_MAX_RANK
+
+#define ATTRIBUTE_DATA  0
+#define DATASET_DATA    1
+#define ENUM_DATA       2
+#define COL             3
+
+/* Macros for displaying objects */
+#define begin_obj(obj,name,begin)                                           \
+    do {                                                                    \
+        if ((name)) {                                                       \
+            PRINTSTREAM(rawoutstream, "%s \"%s\" %s", (obj), (name), (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);                           \
+    } while(0);
+
+
+/* 3 private values: can't be set, but can be read.
+   Note: these are defined in H5Zprivate, they are
+   duplicated here.
+ */
+#define H5_SZIP_LSB_OPTION_MASK         8
+#define H5_SZIP_MSB_OPTION_MASK         16
+#define H5_SZIP_RAW_OPTION_MASK         128
+
+#endif  /* !H5DUMP_DEFINES_H__ */
diff --git a/tools/src/h5dump/h5dump_extern.h b/tools/src/h5dump/h5dump_extern.h
new file mode 100644
index 0000000..22aca73
--- /dev/null
+++ b/tools/src/h5dump/h5dump_extern.h
@@ -0,0 +1,112 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_EXTERN_H__
+#define H5DUMP_EXTERN_H__
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_defines.h"
+
+/**
+ **  This is the global dispatch table for the dump functions.
+ **/
+/* the table of dump functions */
+typedef struct dump_functions_t {
+    void     (*dump_group_function) (hid_t, const char *);
+    void     (*dump_named_datatype_function) (hid_t, const char *);
+    void     (*dump_dataset_function) (hid_t, const char *, struct subset_t *);
+    void     (*dump_dataspace_function) (hid_t);
+    void     (*dump_datatype_function) (hid_t);
+    herr_t   (*dump_attribute_function) (hid_t, const char *, const H5A_info_t *, void *);
+    void     (*dump_data_function) (hid_t, int, struct subset_t *, int);
+} dump_functions;
+
+/* List of table structures.  There is one table structure for each file */
+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;
+} h5dump_table_list_t;
+
+extern h5dump_table_list_t  table_list;
+extern table_t             *group_table, *dset_table, *type_table;
+extern unsigned                  dump_indent;              /*how far in to indent the line         */
+
+extern int          unamedtype;     /* shared datatype with no name */
+extern hbool_t      hit_elink;  /* whether we have traversed an external link */
+extern size_t       prefix_len;
+extern char         *prefix;
+extern const char   *fp_format;
+
+/* things to display or which are set via command line parameters */
+extern int          display_all;
+extern int          display_oid;
+extern int          display_data;
+extern int          display_attr_data;
+extern int          display_char; /*print 1-byte numbers as ASCII */
+extern int          usingdasho;
+extern int          display_bb; /*superblock */
+extern int          display_dcpl; /*dcpl */
+extern int          display_fi; /*file index */
+extern int          display_ai;  /*array index */
+extern int          display_escape; /*escape non printable characters */
+extern int          display_region; /*print region reference data */
+extern int          disable_compact_subset; /* disable compact form of subset notation */
+extern int          display_packed_bits; /*print 1-8 byte numbers as packed bits*/
+extern int          include_attrs; /* Display attributes */
+extern int          display_vds_first; /* vds display to first missing */
+extern int          vds_gap_size; /* vds skip missing files */
+
+/* sort parameters */
+extern H5_index_t   sort_by; /*sort_by [creation_order | name]  */
+extern H5_iter_order_t sort_order; /*sort_order [ascending | descending]   */
+
+#define PACKED_BITS_MAX         8  /* Maximum number of packed-bits to display */
+#define PACKED_BITS_SIZE_MAX    8*sizeof(long long)  /* Maximum bits size of integer types of packed-bits */
+/* mask list for packed bits */
+extern unsigned long long packed_mask[PACKED_BITS_MAX];  /* packed bits are restricted to 8*sizeof(llong) bytes */
+
+/* packed bits display parameters */
+extern unsigned packed_offset[PACKED_BITS_MAX];
+extern unsigned packed_length[PACKED_BITS_MAX];
+
+/*
+ * The global table is set to either ddl_function_table or
+ * xml_function_table in the initialization.
+ */
+extern const dump_functions *dump_function_table;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void     add_prefix(char **prfx, size_t *prfx_len, const char *name);
+hid_t    h5_fileaccess(void);
+ssize_t  table_list_add(hid_t oid, unsigned long file_no);
+ssize_t  table_list_visited(unsigned long file_no);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_EXTERN_H__ */
diff --git a/tools/src/h5dump/h5dump_xml.c b/tools/src/h5dump/h5dump_xml.c
new file mode 100644
index 0000000..49d1ba8
--- /dev/null
+++ b/tools/src/h5dump/h5dump_xml.c
@@ -0,0 +1,4566 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "H5private.h"
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "h5dump_extern.h"
+#include "h5dump_xml.h"
+
+const char       *xmlnsprefix="hdf5:";
+
+/*
+ *  Alternative formating for data dumped to XML
+ *  In general, the numbers are the same, but separators
+ *  except spaces are not used.
+ *
+ *  Some of these are not used, as some kinds of data are
+ *  dumped in completely new subroutines.
+ *
+ *  Some of this formatting may yet need to change.
+ *
+ *  This table only affects XML output.
+ */
+static h5tool_format_t         xml_dataformat = {
+    0,              /*raw */
+
+    "",             /*fmt_raw */
+    "%d",           /*fmt_int */
+    "%u",           /*fmt_uint */
+    "%hhd",           /*fmt_schar */
+    "%u",           /*fmt_uchar */
+    "%d",           /*fmt_short */
+    "%u",           /*fmt_ushort */
+    "%ld",          /*fmt_long */
+    "%lu",          /*fmt_ulong */
+    NULL,           /*fmt_llong */
+    NULL,           /*fmt_ullong */
+    "%g",           /*fmt_double */
+    "%g",           /*fmt_float */
+
+    0,              /*ascii */
+    0,              /*str_locale */
+    0,              /*str_repeat */
+
+    "",            /*arr_pre */
+    "",             /*arr_sep */
+    "",             /*arr_suf */
+    1,              /*arr_linebreak */
+
+    "",             /*cmpd_name */
+    "",             /*cmpd_sep */
+    "",             /*cmpd_pre */
+    "",             /*cmpd_suf */
+    "",             /*cmpd_end */
+    NULL,           /*cmpd_listv */
+
+    " ",            /*vlen_sep */
+    " ",            /*vlen_pre */
+    "",             /*vlen_suf */
+    "",             /*vlen_end */
+
+    "%s",           /*elmt_fmt */
+    "",             /*elmt_suf1 */
+    " ",            /*elmt_suf2 */
+
+    "",             /*idx_n_fmt */
+    "",             /*idx_sep */
+    "",             /*idx_fmt */
+
+    80,             /*line_ncols *//*standard default columns */
+    0,              /*line_per_line */
+    "",             /*line_pre */
+    "%s",           /*line_1st */
+    "%s",           /*line_cont */
+    "",             /*line_suf */
+    "",             /*line_sep */
+    1,              /*line_multi_new */
+    "   ",          /*line_indent */
+
+    1,              /*skip_first */
+
+    1,              /*obj_hidefileno */
+    " "H5_PRINTF_HADDR_FMT, /*obj_format */
+
+    1,              /*dset_hidefileno */
+    "DATASET %s ",  /*dset_format */
+    "%s",           /*dset_blockformat_pre */
+    "%s",           /*dset_ptformat_pre */
+    "%s",           /*dset_ptformat */
+     0,             /*array indices */
+     0              /*escape non printable characters */
+};
+
+
+/* internal functions */
+static int      xml_name_to_XID(const char *, char *, int , int );
+
+/* internal functions used by XML option */
+static void             xml_print_datatype(hid_t, unsigned);
+static void             xml_print_enum(hid_t);
+static int              xml_print_refs(hid_t, int);
+static int              xml_print_strs(hid_t, int);
+static char            *xml_escape_the_string(const char *, int);
+static char            *xml_escape_the_name(const char *);
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_all_cb
+ *
+ * Purpose:     function callback called by H5Literate,
+ *                displays everything in the specified object
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  Ruey-Hsia Li
+ *
+ * Modifications:
+ *  RMcG, November 2000
+ *   Added XML support. Also, optionally checks the op_data argument
+ *
+ * PVN, May 2008
+ *   Dump external links
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR_UNUSED *op_data)
+{
+    hid_t       obj;
+    herr_t      ret = SUCCEED;
+    char       *obj_path = NULL;    /* Full path of object */
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    /* Build the object's path name */
+    obj_path = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    if(!obj_path) {
+        ret = FAIL;
+        goto done;
+    } 
+
+    HDstrcpy(obj_path, prefix);
+    HDstrcat(obj_path, "/");
+    HDstrcat(obj_path, name);
+
+    if(linfo->type == H5L_TYPE_HARD) {
+        H5O_info_t  oinfo;
+
+        /* Stat the object */
+        if(H5Oget_info_by_name(group, name, &oinfo, H5P_DEFAULT) < 0) {
+            error_msg("unable to get object information for \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+            goto done;
+        } /* end if */
+
+        switch(oinfo.type) {
+        case H5O_TYPE_GROUP:
+            if((obj = H5Gopen2(group, name, H5P_DEFAULT)) < 0)  {
+                error_msg("unable to dump group \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            else {
+                char *old_prefix; /* Pointer to previous prefix */
+
+                /* Keep copy of prefix before iterating into group */
+                old_prefix = HDstrdup(prefix);
+                HDassert(old_prefix);
+
+                /* Append group name to prefix */
+                add_prefix(&prefix, &prefix_len, name);
+
+                /* Iterate into group */
+                dump_function_table->dump_group_function(obj, name);
+
+                /* Restore old prefix name */
+                HDstrcpy(prefix, old_prefix);
+                HDfree(old_prefix);
+
+                /* Close group */
+                H5Gclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_DATASET:
+            if((obj = H5Dopen2(group, name, H5P_DEFAULT)) >= 0) {
+                if(oinfo.rc > 1 || hit_elink) {
+                    obj_t  *found_obj;    /* Found object */
+
+                    found_obj = search_obj(dset_table, oinfo.addr);
+
+                    if(found_obj == NULL) {
+                        ctx.indent_level++;
+
+                        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, "%s \"%s\" %s",
+                                h5tools_dump_header_format->datasetbegin, name,
+                                h5tools_dump_header_format->datasetblockbegin);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+
+                        ctx.need_prefix = TRUE;
+                        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        if(HDstrlen(h5tools_dump_header_format->datasetblockend)) {
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetblockend);
+                            if(HDstrlen(h5tools_dump_header_format->datasetend))
+                                h5tools_str_append(&buffer, " ");
+                        }
+                        if(HDstrlen(h5tools_dump_header_format->datasetend))
+                            h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->datasetend);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        h5tools_setstatus(EXIT_FAILURE);
+                        ret = FAIL;
+                        H5Dclose(obj);
+                        goto done;
+                    } 
+                    else if(found_obj->displayed) {
+                        /* the XML version */
+                        char *t_obj_path = xml_escape_the_name(obj_path);
+                        char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                        char *t_name = xml_escape_the_name(name);
+                        char *t_objname = xml_escape_the_name(found_obj->objname);
+                        char dsetxid[100];
+                        char parentxid[100];
+                        char pointerxid[100];
+
+                        /* Create OBJ-XIDs for the parent and object */
+                        xml_name_to_XID(obj_path, dsetxid, (int)sizeof(dsetxid), 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);
+
+                        /* Render the element */
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "<%sDataset Name=\"%s\" OBJ-XID=\"%s-%d\" "
+                                "H5Path=\"%s\" Parents=\"%s\" "
+                                "H5ParentPaths=\"%s\">",
+                                xmlnsprefix,
+                                t_name,                     /* Dataset Name */
+                                dsetxid, get_next_xid(),    /* OBJ-XID */
+                                t_obj_path,                 /* H5Path */
+                                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);
+
+                        xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
+
+                        ctx.indent_level++;
+
+                        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, "<%sDatasetPtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
+                                xmlnsprefix,
+                                pointerxid,t_objname);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        ctx.indent_level--;
+
+                        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, "</%sDataset>", xmlnsprefix);
+                        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                        HDfree(t_name);
+                        HDfree(t_obj_path);
+                        HDfree(t_prefix);
+                        HDfree(t_objname);
+
+                        H5Dclose(obj);
+                        goto done;
+                    } 
+                    else
+                        found_obj->displayed = TRUE;
+                } /* end if */
+
+                dump_function_table->dump_dataset_function(obj, name, NULL);
+                H5Dclose(obj);
+            } 
+            else {
+                error_msg("unable to dump dataset \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            }
+            break;
+
+        case H5O_TYPE_NAMED_DATATYPE:
+            if((obj = H5Topen2(group, name, H5P_DEFAULT)) < 0) {
+                error_msg("unable to dump datatype \"%s\"\n", name);
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } 
+            else {
+                dump_function_table->dump_named_datatype_function(obj, name);
+                H5Tclose(obj);
+            }
+            break;
+
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
+        default:
+            error_msg("unknown object \"%s\"\n", name);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret = FAIL;
+        }
+    } /* end if */
+    else {
+        char       *targbuf;
+
+        switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } 
+            else {
+                /* print the value of a soft link */
+                /* XML */
+                char linkxid[100];
+                char parentxid[100];
+                char targetxid[100];
+                char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                char *t_name = xml_escape_the_name(name);
+                char *t_targbuf = xml_escape_the_name(targbuf);
+                char *t_obj_path = xml_escape_the_name(obj_path);
+                char *t_link_path;
+                int res;
+
+                t_link_path = (char *)HDmalloc(HDstrlen(prefix) + linfo->u.val_size + 1);
+                if(targbuf[0] == '/')
+                    HDstrcpy(t_link_path, targbuf);
+                else {
+                    HDstrcpy(t_link_path, prefix);
+                    HDstrcat(HDstrcat(t_link_path, "/"), targbuf);
+                } /* end else */
+
+                /* 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);
+
+                /* Try to create an OBJ-XID for the object pointed to */
+                res = xml_name_to_XID(t_link_path, targetxid, (int)sizeof(targetxid), 0);
+                if (res == 0) {
+                    /* target obj found */
+                    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, "<%sSoftLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetPath=\"%s\" TargetObj=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            t_targbuf,      /* TargetPath */
+                            targetxid,      /* TargetObj */
+                            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);
+                } 
+                else {
+                    /* dangling link -- omit from xml attributes */
+                    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, "<%sSoftLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetPath=\"%s\"  "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            t_targbuf,      /* TargetPath */
+                            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_targbuf);
+                HDfree(t_obj_path);
+                HDfree(t_link_path);
+            }
+
+            HDfree(targbuf);
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            targbuf = (char *)HDmalloc(linfo->u.val_size);
+            HDassert(targbuf);
+
+            if(H5Lget_val(group, name, targbuf, linfo->u.val_size, H5P_DEFAULT) < 0) {
+                error_msg("unable to get external link value\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret = FAIL;
+            } /* end if */
+            else {
+                const char *filename;
+                const char *targname;
+
+                if(H5Lunpack_elink_val(targbuf, linfo->u.val_size, NULL, &filename, &targname) < 0) {
+                    error_msg("unable to unpack external link value\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret = FAIL;
+                } /* end if */
+                else {
+                    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 *t_filename = xml_escape_the_name(filename);
+                    char *t_targname = xml_escape_the_name(targname);
+
+                    /* 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);
+
+                    /* Render the element */
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "<%sExternalLink LinkName=\"%s\" "
+                            "OBJ-XID=\"%s\" "
+                            "H5SourcePath=\"%s\" "
+                            "TargetFilename=\"%s\"  "
+                            "TargetPath=\"%s\"  "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                            xmlnsprefix,
+                            t_name,         /* LinkName */
+                            linkxid,        /* OBJ-XID */
+                            t_obj_path,     /* H5SourcePath */
+                            filename,       /* TargetFilename */
+                            targname,       /* TargetPath*/
+                            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_filename);
+                    HDfree(t_targname);
+                    HDfree(t_obj_path);
+                } /* end else */
+            } /* end else */
+            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);
+
+                /* 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);
+
+                /* 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 */
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    if(obj_path)
+        HDfree(obj_path);
+    return ret;
+}
+
+/*
+ * create a string suitable for and XML NCNAME.  Uses the
+ * object reference to create the string.
+ *
+ *  'gen'; 0 - return null if not found
+ *         1 - generate a fake entry and return fake id.
+ */
+int
+xml_name_to_XID(const char *str , char *outstr, int outlen, int gen)
+{
+    haddr_t objno;      /* Object ID for object at path */
+
+    if (outlen < 22) return 1;
+
+    objno = ref_path_table_lookup(str);
+    if (objno == HADDR_UNDEF) {
+        if (HDstrlen(str) == 0) {
+            objno = ref_path_table_lookup("/");
+            if (objno == HADDR_UNDEF) {
+                if (gen) {
+                    objno = ref_path_table_gen_fake(str);
+                    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+                    return 0;
+                } 
+                else {
+                    return 1;
+                }
+            }
+        } 
+        else {
+            if (gen) {
+                objno = ref_path_table_gen_fake(str);
+                sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+                return 0;
+            } 
+            else {
+                return 1;
+            }
+        }
+    }
+
+    sprintf(outstr, "xid_"H5_PRINTF_HADDR_FMT, objno);
+
+    return(0);
+}
+
+static const char      *quote = """;
+static const char      *amp = "&";
+static const char      *lt = "<";
+static const char      *gt = ">";
+static const char      *apos = "'";
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_escape_the_name
+ *
+ * Purpose:     Escape XML reserved chars in a name, so HDF5 strings
+ *              and paths can be correctly read back in XML element.
+ *
+ * Return:      The revised string.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char                   *
+xml_escape_the_name(const char *str)
+{
+    size_t      extra;
+    size_t      len;
+    size_t      i;
+    const char *cp;
+    char       *ncp;
+    char       *rcp;
+    size_t      ncp_len;
+
+    if (!str)
+        return NULL;
+
+    cp = str;
+    len = HDstrlen(str);
+    extra = 0;
+
+    for (i = 0; i < len; i++) {
+        if (*cp == '\"')
+            extra += (HDstrlen(quote) - 1);
+        else if (*cp == '\'')
+            extra += (HDstrlen(apos) - 1);
+        else if (*cp == '<')
+            extra += (HDstrlen(lt) - 1);
+        else if (*cp == '>')
+            extra += (HDstrlen(gt) - 1);
+        else if (*cp == '&')
+            extra += (HDstrlen(amp) - 1);
+
+        cp++;
+    }
+
+    if (extra == 0)
+        return HDstrdup(str);
+
+    cp = str;
+    ncp_len = len + extra + 1;
+    rcp = ncp = (char *)HDmalloc(ncp_len);
+
+    if (!ncp)
+        return NULL;    /* ?? */
+
+    for (i = 0; i < len; i++) {
+        size_t esc_len;
+
+        HDassert(ncp_len);
+        if (*cp == '\'') {
+            HDstrncpy(ncp, apos, ncp_len);
+            esc_len = HDstrlen(apos);
+        } 
+        else if (*cp == '<') {
+            HDstrncpy(ncp, lt, ncp_len);
+            esc_len = HDstrlen(lt);
+        } 
+        else if (*cp == '>') {
+            HDstrncpy(ncp, gt, ncp_len);
+            esc_len = HDstrlen(gt);
+        } 
+        else if (*cp == '\"') {
+            HDstrncpy(ncp, quote, ncp_len);
+            esc_len = HDstrlen(quote);
+        } 
+        else if (*cp == '&') {
+            HDstrncpy(ncp, amp, ncp_len);
+            esc_len = HDstrlen(amp);
+        } 
+        else {
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        ncp += esc_len;
+        ncp_len -= esc_len;
+        cp++;
+    }
+
+    *ncp = '\0';
+    return rcp;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_escape_the_string
+ *
+ * Purpose:     Escape XML reserved chars in a string, so HDF5 strings
+ *              and paths can be correctly read back in XML CDATA.
+ *
+ * Return:      The revised string.
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static char                   *
+xml_escape_the_string(const char *str, int slen)
+{
+    size_t      extra;
+    size_t      len;
+    size_t      i;
+    const char *cp;
+    char       *ncp;
+    char       *rcp;
+    size_t      ncp_len;
+
+    if (!str)
+        return NULL;
+
+    cp = str;
+
+    if (slen < 0)
+        len = HDstrlen(str);
+    else
+        len = (size_t)slen;
+
+    extra = 0;
+
+    for (i = 0; i < len; i++) {
+        if (*cp == '\\')
+            extra++;
+        else if (*cp == '\"')
+            extra++;
+        else if (*cp == '\'')
+            extra += (HDstrlen(apos) - 1);
+        else if (*cp == '<')
+            extra += (HDstrlen(lt) - 1);
+        else if (*cp == '>')
+            extra += (HDstrlen(gt) - 1);
+        else if (*cp == '&')
+            extra += (HDstrlen(amp) - 1);
+        cp++;
+    }
+
+    cp = str;
+    ncp_len = len + extra + 1;
+    rcp = ncp = (char *) HDcalloc(ncp_len, sizeof(char));
+
+    if (ncp == NULL)
+        return NULL; /* ?? */
+
+    for (i = 0; i < len; i++) {
+        size_t esc_len;
+
+        HDassert(ncp_len);
+        if (*cp == '\\') {
+            *ncp++ = '\\';
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        else if (*cp == '\"') {
+            *ncp++ = '\\';
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        else if (*cp == '\'') {
+            HDstrncpy(ncp, apos, ncp_len);
+            esc_len = HDstrlen(apos);
+        }
+        else if (*cp == '<') {
+            HDstrncpy(ncp, lt, ncp_len);
+            esc_len = HDstrlen(lt);
+        }
+        else if (*cp == '>') {
+            HDstrncpy(ncp, gt, ncp_len);
+            esc_len = HDstrlen(gt);
+        }
+        else if (*cp == '&') {
+            HDstrncpy(ncp, amp, ncp_len);
+            esc_len = HDstrlen(amp);
+        }
+        else {
+            *ncp = *cp;
+            esc_len = 1;
+        }
+        ncp += esc_len;
+        ncp_len -= esc_len;
+        cp++;
+    }
+
+    *ncp = '\0';
+    return rcp;
+}
+
+/**
+ **  XML print functions--these replace some functions in the
+ **  h5tools.c suite.
+ **/
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_datatype
+ *
+ * Purpose:     Print description of a datatype in XML.
+ *              Note:  this is called inside a <DataType> element.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+xml_print_datatype(hid_t type, unsigned in_group)
+{
+    char                   *mname;
+    hid_t                   mtype;
+    unsigned                nmembers;
+    unsigned                ndims;
+    unsigned                i;
+    size_t                  size;
+    hsize_t                 dims[H5DUMP_MAX_RANK];
+    H5T_str_t               str_pad;
+    H5T_cset_t              cset;
+    hid_t                   super;
+    H5T_order_t             ord;
+    H5T_sign_t              sgn;
+    size_t                  sz;
+    size_t                  spos;
+    size_t                  epos;
+    size_t                  esize;
+    size_t                  mpos;
+    size_t                  msize;
+    int                     nmembs;
+    htri_t                  is_vlstr=FALSE;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols==0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if(!in_group && H5Tcommitted(type) > 0) {
+        H5O_info_t oinfo;
+        obj_t  *found_obj;    /* Found object */
+
+        /* detect a shared datatype, output only once */
+        H5Oget_info(type, &oinfo);
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if(found_obj) {
+            /* This should be defined somewhere else */
+            /* These 2 cases are handled the same right now, but
+               probably will have something different eventually */
+            char * dtxid = (char *)HDmalloc((size_t)100);
+
+            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
+            if (!found_obj->recorded) {
+                /* 'anonymous' NDT.  Use it's object num.
+                   as it's name.  */
+
+                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, "<%sNamedDataTypePtr OBJ-XID=\"/%s\"/>",
+                        xmlnsprefix, dtxid);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                /* point to the NDT by name */
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>",
+                        xmlnsprefix, dtxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+            }
+            HDfree(dtxid);
+        } 
+        else {
+            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, "<!-- h5dump error: unknown committed type. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+    } 
+    else {
+        switch (H5Tget_class(type)) {
+            case H5T_INTEGER:
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+
+                /* <hdf5:IntegerType ByteOrder="bo" Sign="torf" Size="bytes"/> */
+                ord = H5Tget_order(type);
+                sgn = H5Tget_sign(type);
+
+                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, "<%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:
+                    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;
+                    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);
+                h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
+                h5tools_str_append(&buffer, "\" />");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_FLOAT:
+                /* <hdf5:FloatType ByteOrder="bo" Size="bytes"
+                   SignBitLocation="bytes"
+                   ExponentBits="eb" ExponentLocation="el"
+                   MantissaBits="mb" MantissaLocation="ml" /> */
+                ord = H5Tget_order(type);
+
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+
+                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, "<%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;
+                    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);
+                h5tools_str_append(&buffer, "%lu", (unsigned long)sz);
+                H5Tget_fields(type, &spos, &epos, &esize, &mpos, &msize);
+                h5tools_str_append(&buffer, "\" SignBitLocation=\"%lu\" ", (unsigned long)spos);
+                h5tools_str_append(&buffer, "ExponentBits=\"%lu\" ExponentLocation=\"%lu\" ", (unsigned long)esize, (unsigned long)epos);
+                h5tools_str_append(&buffer, "MantissaBits=\"%lu\" MantissaLocation=\"%lu\" />", (unsigned long)msize, (unsigned long)mpos);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_TIME:
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+
+                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, "<%sTimeType />",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                h5tools_str_append(&buffer, "<!-- H5T_TIME: not yet implemented -->");
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_STRING:
+                /* <hdf5:StringType Cset="cs" StrSize="chars" StrPad="pad" /> */
+                size = H5Tget_size(type);
+                str_pad = H5Tget_strpad(type);
+                cset = H5Tget_cset(type);
+                is_vlstr = H5Tis_variable_str(type);
+
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.indent_level++;
+
+                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, "<%sStringType Cset=\"",xmlnsprefix);
+
+                if (cset == H5T_CSET_ASCII)
+                    h5tools_str_append(&buffer, "H5T_CSET_ASCII\" ");
+                else
+                    h5tools_str_append(&buffer, "unknown_cset\" ");
+
+                if(is_vlstr)
+                    h5tools_str_append(&buffer, "StrSize=\"H5T_VARIABLE\" StrPad=\"");
+                else
+                    h5tools_str_append(&buffer, "StrSize=\"%d\" StrPad=\"", (int) size);
+
+                if (str_pad == H5T_STR_NULLTERM)
+                    h5tools_str_append(&buffer, "H5T_STR_NULLTERM\"/>");
+                else if (str_pad == H5T_STR_NULLPAD)
+                    h5tools_str_append(&buffer, "H5T_STR_NULLPAD\"/>");
+                else if (str_pad == H5T_STR_SPACEPAD)
+                    h5tools_str_append(&buffer, "H5T_STR_SPACEPAD\"/>");
+                else
+                    h5tools_str_append(&buffer, "H5T_STR_ERROR\"/>");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_BITFIELD:
+                /* <hdf5:BitfieldType ByteOrder="bo" Size="bytes"/> */
+                ord = H5Tget_order(type);
+
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+
+                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, "<%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:
+                    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);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_OPAQUE:
+                /* <hdf5:OpaqueType Tag="tag" Size="bytes" /> */
+
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+                mname = H5Tget_tag(type);
+
+                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, "<%sOpaqueType Tag=\"%s\" ",xmlnsprefix, mname);
+                H5free_memory(mname);
+                size = H5Tget_size(type);
+                h5tools_str_append(&buffer, "Size=\"%lu\"/>", (unsigned long)size);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_COMPOUND:
+                /* recursively describe the components of a compound datatype */
+
+                /* type of a dataset */
+                nmembers = (unsigned)H5Tget_nmembers(type);
+
+                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, "<%sCompoundType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* List each member Field of the type */
+                /*   <hdf5:Field FieldName="name" > */
+                /*   <hdf5:DataType > */
+                ctx.indent_level++;
+                dump_indent += COL;
+                for (i = 0; i < nmembers; i++) {
+                    char *t_fname;
+
+                    mname = H5Tget_member_name(type, i);
+                    mtype = H5Tget_member_type(type, i);
+                    t_fname = xml_escape_the_name(mname);
+
+                    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, "<%sField FieldName=\"%s\">",xmlnsprefix, t_fname);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    H5free_memory(mname);
+                    HDfree(t_fname);
+                    dump_indent += COL;
+                    ctx.indent_level++;
+
+                    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, "<%sDataType>",xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    ctx.indent_level++;
+                    dump_indent += COL;
+                    xml_print_datatype(mtype,0);
+                    dump_indent -= COL;
+                    ctx.indent_level--;
+
+                    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, "</%sDataType>",xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    dump_indent -= COL;
+                    ctx.indent_level--;
+
+                    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, "</%sField>",xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sCompoundType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_REFERENCE:
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+                /*  Only Object references supported at this time */
+
+                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, "<%sReferenceType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level++;
+
+                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, "<%sObjectReferenceType />",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sReferenceType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_ENUM:
+                /*  <hdf5:EnumType Nelems="ne" > list Name, values of enum */
+                nmembs = H5Tget_nmembers(type);
+
+                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, "<%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent += COL;
+                ctx.indent_level++;
+
+                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, "<%sEnumType Nelems=\"%d\">",xmlnsprefix, nmembs);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                xml_print_enum(type);
+
+                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, "</%sEnumType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sAtomicType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_VLEN:
+                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, "<%sVLType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                super = H5Tget_super(type);
+                dump_indent += COL;
+                ctx.indent_level++;
+
+                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, "<%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent += COL;
+                ctx.indent_level++;
+                xml_print_datatype(super,0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sVLType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                H5Tclose(super);
+
+                break;
+
+            case H5T_ARRAY:
+                /* Get array base type */
+                super = H5Tget_super(type);
+
+                /* Print lead-in */
+                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, "<%sArrayType Ndims=\"",xmlnsprefix);
+                ndims = (unsigned)H5Tget_array_ndims(type);
+                h5tools_str_append(&buffer, "%u\">", ndims);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* Get array information */
+                H5Tget_array_dims2(type, dims);
+
+                /* list of dimensions */
+                ctx.indent_level++;
+                for (i = 0; i < ndims; i++) {
+                    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, "<%sArrayDimension DimSize=\"%u\"/>", xmlnsprefix, (int) dims[i]);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                ctx.indent_level--;
+
+                dump_indent += COL;
+                ctx.indent_level++;
+
+                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, "<%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent += COL;
+                ctx.indent_level++;
+                xml_print_datatype(super,0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sDataType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_indent -= COL;
+                ctx.indent_level--;
+
+                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, "</%sArrayType>",xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                /* Close array base type */
+                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);
+
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<!-- unknown datatype -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                h5tools_setstatus(EXIT_FAILURE);
+                break;
+        }
+    } /* end else */
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_datatype
+ *
+ * Purpose:     Dump description of a datatype in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_datatype(hid_t type)
+{
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if(H5Tcommitted(type) > 0) {
+        H5O_info_t oinfo;
+        obj_t  *found_obj;    /* Found object */
+
+        /* Datatype is a shared or named datatype */
+        H5Oget_info(type, &oinfo);
+        found_obj = search_obj(type_table, oinfo.addr);
+
+        if(found_obj) {
+            /* Shared datatype, must be entered as an object  */
+            /* These 2 cases are the same now, but may change */
+            char *dtxid = (char *)HDmalloc((size_t)100);
+
+            xml_name_to_XID(found_obj->objname, dtxid, 100, 1);
+            if (!found_obj->recorded) {
+                /* anonymous stored datatype:
+                   following the dumper's current
+                   practice:
+                   use it's object ref as its name
+                 */
+
+                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\"/>",
+                        xmlnsprefix, dtxid);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                /* pointer to a named datatype already in XML */
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                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, "<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\" />",
+                        xmlnsprefix, dtxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+            }
+            HDfree(dtxid);
+        } 
+        else {
+            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, "<!-- h5dump error: unknown committed type. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+    }
+    else {
+        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, "<%sDataType>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        dump_indent += COL;
+        xml_print_datatype(type, 0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        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, "</%sDataType>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_dataspace
+ *
+ * Purpose:     Dump description of a dataspace in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_dataspace(hid_t space)
+{
+    hsize_t         size[H5DUMP_MAX_RANK];
+    hsize_t         maxsize[H5DUMP_MAX_RANK];
+    int             i;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+    
+    int             ndims = H5Sget_simple_extent_dims(space, size, maxsize);
+    H5S_class_t     space_type = H5Sget_simple_extent_type(space);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+
+    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, "<%sDataspace>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level++;
+
+    switch (space_type) {
+    case H5S_SCALAR:
+        /* scalar dataspace (just a tag, no XML attrs. defined */
+
+        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, "<%sScalarDataspace />",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        break;
+
+    case H5S_SIMPLE:
+        /* simple dataspace */
+        /* <hdf5:SimpleDataspace Ndims="nd"> */
+
+        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, "<%sSimpleDataspace Ndims=\"%d\">",xmlnsprefix, ndims);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* print the <hdf5:Dimension> elements */
+        ctx.indent_level++;
+        for (i = 0; i < ndims; i++) {
+            if (maxsize[i] == H5S_UNLIMITED) {
+                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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"UNLIMITED\"/>",
+                        xmlnsprefix,size[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else if (maxsize[i] == (hsize_t) 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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
+                        xmlnsprefix,size[i], size[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            } 
+            else {
+                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, "<%sDimension  DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" MaxDimSize=\"%" H5_PRINTF_LL_WIDTH "u\"/>",
+                        xmlnsprefix, size[i], maxsize[i]);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+        }
+        ctx.indent_level--;
+
+        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, "</%sSimpleDataspace>", xmlnsprefix );
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        break;
+
+#ifdef TMP
+        /* Commented out: wait until the schema is updated first */
+    case H5S_NULL:
+        /* null dataspace (just a tag, no XML attrs. defined */
+
+        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, "<%sNullDataspace />",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+       break;
+#endif /* TMP */
+
+    case H5S_NULL:
+    case H5S_NO_CLASS:
+    default:
+        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, "<!-- unknown dataspace -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+    ctx.indent_level--;
+
+    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, "</%sDataspace>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level--;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_data
+ *
+ * Purpose:     Dump description of data in XML.
+ *              Note that this calls the h5dump_xxx calls in
+ *              the h5tools library.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_data(hid_t obj_id, int obj_data, struct subset_t H5_ATTR_UNUSED * sset, int H5_ATTR_UNUSED pindex)
+{
+    hid_t               space = -1;
+    hid_t               type = -1;
+    hid_t               p_type = -1;
+    hsize_t             size[64];
+    hsize_t             nelmts = 1;
+    int                 ndims;
+    int                 i;
+    int                 status = -1;
+    void               *buf = NULL;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *outputformat = &xml_dataformat;
+    h5tool_format_t     string_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    /* Print all the values. */
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+    string_dataformat.cmpd_sep = " ";
+    string_dataformat.cmpd_pre = "";
+    string_dataformat.cmpd_suf = "";
+    string_dataformat.cmpd_end = "";
+    string_dataformat.arr_linebreak = 0;
+    string_dataformat.arr_pre = "";
+    outputformat = &string_dataformat;
+
+    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, "<%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+
+    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, "<%sDataFromFile>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    
+    dump_indent += COL;
+    ctx.indent_level++;
+
+    if (obj_data == DATASET_DATA) {
+        type = H5Dget_type(obj_id);
+        if (H5Tget_class(type) == H5T_REFERENCE)
+            status = xml_print_refs(obj_id, DATASET_DATA);
+        else if (H5Tget_class(type) == H5T_STRING)
+            status = xml_print_strs(obj_id, DATASET_DATA);
+        else {
+            h5tools_context_t datactx;
+            HDmemset(&datactx, 0, sizeof(datactx));
+            datactx.need_prefix = TRUE;
+            datactx.indent_level = ctx.indent_level;
+            datactx.cur_column = ctx.cur_column;
+            status = h5tools_dump_dset(rawoutstream, outputformat, &datactx, obj_id, NULL);
+        }
+    } 
+    else {
+        /* Attribute data */
+        type = H5Aget_type(obj_id);
+
+        if (H5Tget_class(type) == H5T_REFERENCE) {
+            /* references are done differently than
+               the standard output:
+               XML dumps a path to the object
+               referenced.
+             */
+            status = xml_print_refs(obj_id, ATTRIBUTE_DATA);
+            H5Tclose(type);
+        } 
+        else if (H5Tget_class(type) == H5T_STRING) {
+            status = xml_print_strs(obj_id, ATTRIBUTE_DATA);
+        } 
+        else {  /* all other data */
+            /* VL data special information */
+            unsigned int vl_data = 0; /* contains VL datatypes */
+            
+            p_type = h5tools_get_native_type(type);
+
+            /* Check if we have VL data in the dataset's datatype */
+            if (h5tools_detect_vlen(p_type) == TRUE)
+                vl_data = TRUE;
+
+            H5Tclose(type);
+
+            space = H5Aget_space(obj_id);
+
+            ndims = H5Sget_simple_extent_dims(space, size, NULL);
+
+            for (i = 0; i < ndims; i++)
+                nelmts *= size[i];
+
+            buf = HDmalloc((size_t)(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))));
+            HDassert(buf);
+            
+            if (H5Aread(obj_id, p_type, buf) >= 0) {
+                h5tools_context_t datactx;
+                HDmemset(&datactx, 0, sizeof(datactx));
+                datactx.need_prefix = TRUE;
+                datactx.indent_level = ctx.indent_level;
+                datactx.cur_column = ctx.cur_column;
+                status = h5tools_dump_mem(rawoutstream, outputformat, &datactx, obj_id, p_type, space, buf);
+            }
+            /* Reclaim any VL memory, if necessary */
+            if (vl_data)
+                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
+
+            HDfree(buf);
+            H5Tclose(p_type);
+            H5Sclose(space);
+            H5Tclose(type);
+        }
+    }
+
+    if (status == FAIL) {
+        ctx.indent_level++;
+
+        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, "Unable to print data.");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+
+        status = 1;
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    ctx.indent_level++;
+
+    ctx.need_prefix = TRUE;
+    
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "</%sDataFromFile>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+
+    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, "</%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_attr
+ *
+ * Purpose:     Dump a description of an HDF5 attribute in XML.
+ *
+ * Return:      herr_t
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+xml_dump_attr(hid_t attr, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *info,
+    void H5_ATTR_UNUSED * op_data)
+{
+    hid_t             attr_id = -1;
+    hid_t             type = -1;
+    hid_t             space = -1;
+    H5S_class_t       space_type;
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;           /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    
+    char *t_aname = xml_escape_the_name(attr_name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    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, "<%sAttribute Name=\"%s\">", xmlnsprefix, t_aname);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    HDfree(t_aname);
+
+    if ((attr_id = H5Aopen(attr, attr_name, H5P_DEFAULT)) >= 0) {
+        type = H5Aget_type(attr_id);
+        space = H5Aget_space(attr_id);
+        space_type = H5Sget_simple_extent_type(space);
+
+        dump_function_table->dump_dataspace_function(space);
+        dump_function_table->dump_datatype_function(type);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        if (display_attr_data && space_type != H5S_NULL) {
+            switch (H5Tget_class(type)) {
+            case H5T_INTEGER:
+            case H5T_FLOAT:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_ENUM:
+            case H5T_ARRAY:
+                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
+                break;
+
+            case H5T_TIME:
+                ctx.indent_level++;
+                dump_indent += COL;
+
+                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, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Time data not yet implemented. -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<hdf5:Data>");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                ctx.indent_level--;
+                dump_indent -= COL;
+                break;
+
+            case H5T_COMPOUND:
+                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, "<!-- Note: format of compound data not specified -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
+                break;
+
+            case H5T_REFERENCE:
+                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, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+                    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, "<!-- Note: Region references not supported -->");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    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, "<%sDataFromFile>", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    xml_print_refs(attr_id, ATTRIBUTE_DATA);
+
+                    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, "</%sDataFromFile>", xmlnsprefix);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5T_VLEN:
+                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, "<!-- Note: format of VL data not specified -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                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);
+                
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+            }
+        }
+        else {
+            /* The case of an attribute never yet written ??
+             * Or dataspace is H5S_NULL. */
+            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, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+
+            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, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+
+            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, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Aclose(attr_id);
+
+        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, "</%sAttribute>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+        return SUCCEED;
+    }
+    else {
+        /* ?? failed */
+        ctx.indent_level++;
+
+        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, "<!-- h5dump error: unable to open attribute. -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+
+        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, "</%sAttribute>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+        
+        h5tools_setstatus(EXIT_FAILURE);
+        return FAIL;
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_named_datatype
+ *
+ * Purpose:     Dump a description of an HDF5 NDT in XML.
+ *
+ * Return:      herr_t
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_named_datatype(hid_t type, const char *name)
+{
+    hsize_t           curr_pos = 0;        /* total data element position   */
+    h5tools_str_t     buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    char             *tmp;
+    char             *dtxid;
+    char             *parentxid;
+    char             *t_tmp;
+    char             *t_prefix;
+    char             *t_name;
+
+    tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    HDstrcpy(tmp, prefix);
+    HDstrcat(tmp, "/");
+    HDstrcat(tmp, name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    dtxid = (char *)HDmalloc((size_t)100);
+    parentxid = (char *)HDmalloc((size_t)100);
+    t_tmp = xml_escape_the_name(tmp);
+    t_prefix = xml_escape_the_name(prefix);
+    t_name = xml_escape_the_name(name);
+
+    xml_name_to_XID(tmp, dtxid, 100, 1);
+    xml_name_to_XID(prefix, parentxid, 100, 1);
+    if(HDstrncmp(name, "#", (size_t)1) == 0) {
+        /*  Special:  this is an 'anonymous' NDT, deleted but
+           still in use.
+           We follow the dumper's undocumented practice, and
+           use its object id as its name.
+           Exactly the same as normal, but a separate case
+           in the event we want to do something else in
+           the future.
+         */
+
+        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, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
+                "Parents=\"%s\" H5ParentPaths=\"%s\">",
+                xmlnsprefix,
+                name, dtxid,
+                parentxid, HDstrcmp(prefix,"") ? t_prefix : "/");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    } 
+    else {
+        H5O_info_t  oinfo;          /* Object info */
+
+        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, "<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" "
+                "H5Path=\"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
+                xmlnsprefix,
+                t_name, dtxid,
+                t_tmp, parentxid, (HDstrcmp(prefix, "") ? t_prefix : "/"));
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Check uniqueness of named datatype */
+        H5Oget_info(type, &oinfo);
+        if(oinfo.rc > 1) {
+            obj_t       *found_obj;     /* Found object */
+
+            /* Group with more than one link to it... */
+            found_obj = search_obj(type_table, oinfo.addr);
+
+            if (found_obj == NULL) {
+                indentation(dump_indent);
+                error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+            } 
+            else if(found_obj->displayed) {
+                /* We have already printed this named datatype, print it as a
+                 * NamedDatatypePtr
+                 */
+                char pointerxid[100];
+                char *t_objname = xml_escape_the_name(found_obj->objname);
+
+                ctx.indent_level++;
+                
+                xml_name_to_XID(found_obj->objname, pointerxid, (int)sizeof(pointerxid), 1);
+
+                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, "<%sNamedDatatypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>", xmlnsprefix, pointerxid, t_objname);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                
+                ctx.indent_level--;
+
+                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, "</%sNamedDataType>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_objname);
+                goto done;
+            } 
+            else
+                found_obj->displayed = TRUE;
+        }
+    }
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    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, "<%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+    xml_print_datatype(type,1);
+    ctx.indent_level--;
+    dump_indent -= COL;
+    
+    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, "</%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    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, "</%sNamedDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+done:
+
+    h5tools_str_close(&buffer);
+
+    HDfree(dtxid);
+    HDfree(parentxid);
+    HDfree(t_tmp);
+    HDfree(t_prefix);
+    HDfree(t_name);
+    HDfree(tmp);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_group
+ *
+ * Purpose:     Dump a description of an HDF5 Group (and its members) in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *  Pedro Vicente, October 9, 2007
+ *   added parameters to H5A(L)iterate to allow for other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_group(hid_t gid, const char *name)
+{
+    H5O_info_t              oinfo;
+    hid_t                   gcpl_id;
+    hid_t                   dset, type;
+    unsigned                crt_order_flags;
+    unsigned                attr_crt_order_flags;
+    int                     isRoot = 0;
+    char                    type_name[1024];
+    char                   *t_objname = NULL;
+    char                   *par_name = NULL;
+    char                   *cp = NULL;
+    char                   *tmp = NULL;
+    char                   *par = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if ((gcpl_id = H5Gget_create_plist(gid)) < 0) {
+        error_msg("error in getting group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties for attributes */
+    if (H5Pget_attr_creation_order(gcpl_id, &attr_crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* query the group creation properties */
+    if(H5Pget_link_creation_order(gcpl_id, &crt_order_flags) < 0) {
+        error_msg("error in getting group creation properties\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    if(H5Pclose(gcpl_id) < 0) {
+        error_msg("error in closing group creation property list ID\n");
+        h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    if(HDstrcmp(name, "/") == 0) {
+        isRoot = 1;
+        tmp = HDstrdup("/");
+    }
+    else {
+        tmp = (char *)HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+        HDstrcpy(tmp, prefix);
+        par = HDstrdup(tmp);
+        cp = HDstrrchr(par, '/');
+        if(cp) {
+            if((cp == par) && HDstrlen(par) > 1)
+                *(cp + 1) = '\0';
+            else
+                *cp = '\0';
+        }
+    }
+
+    H5Oget_info(gid, &oinfo);
+
+    if(oinfo.rc > 1) {
+        obj_t *found_obj;    /* Found object */
+
+        /* Group with more than one link to it... */
+        found_obj = search_obj(group_table, oinfo.addr);
+
+        if (found_obj == NULL) {
+            indentation(dump_indent);
+            error_msg("internal error (file %s:line %d)\n", __FILE__, __LINE__);
+            h5tools_setstatus(EXIT_FAILURE);
+        }
+        else {
+            char *t_name = xml_escape_the_name(name);
+            char *grpxid = (char *)HDmalloc((size_t)100);
+            char *parentxid = (char *)HDmalloc((size_t)100);
+
+            if(found_obj->displayed) {
+                char *ptrstr = (char *)HDmalloc((size_t)100);
+
+                /* already seen: enter a groupptr */
+                if(isRoot) {
+                    /* probably can't happen! */
+                    xml_name_to_XID("/", grpxid, 100, 1);
+
+                    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, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
+                            xmlnsprefix, grpxid, "/");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    t_objname = xml_escape_the_name(found_obj->objname);
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(tmp, grpxid, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    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, "<%sGroup Name=\"%s\" OBJ-XID=\"%s-%d\" H5Path=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\">",
+                            xmlnsprefix,t_name, grpxid, get_next_xid(),
+                            t_objname, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    HDfree(t_objname);
+                    HDfree(par_name);
+                    
+                    ctx.indent_level++;
+
+                    t_objname = xml_escape_the_name(found_obj->objname);/* point to the NDT by name */
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(found_obj->objname, ptrstr, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    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, "<%sGroupPtr OBJ-XID=\"%s\" H5Path=\"%s\" "
+                                "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                                xmlnsprefix,
+                                ptrstr, t_objname, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                    
+                    ctx.indent_level--;
+
+                    HDfree(t_objname);
+                    HDfree(par_name);
+                }
+                HDfree(ptrstr);
+            }
+            else {
+
+                /* first time this group has been seen -- describe it  */
+                if(isRoot) {
+                    xml_name_to_XID("/", grpxid, 100, 1);
+
+                    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, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">",
+                            xmlnsprefix, grpxid, "/");
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                }
+                else {
+                    char *t_tmp = xml_escape_the_name(tmp);
+
+                    par_name = xml_escape_the_name(par);
+                    xml_name_to_XID(tmp, grpxid, 100, 1);
+                    xml_name_to_XID(par, parentxid, 100, 1);
+
+                    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, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
+                            "Parents=\"%s\" H5ParentPaths=\"%s\" >",
+                            xmlnsprefix,t_name, grpxid, t_tmp, parentxid, par_name);
+                    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                    HDfree(t_tmp);
+                    HDfree(par_name);
+                }
+                found_obj->displayed = TRUE;
+
+                /* 1.  do all the attributes of the group */
+                
+                ctx.indent_level++;
+                dump_indent += COL;
+
+                if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+                    if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                        error_msg("error getting attribute information\n");
+                        h5tools_setstatus(EXIT_FAILURE);
+                    } /* end if */
+                } /* end if */
+                else {
+                    if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                        error_msg("error getting attribute information\n");
+                        h5tools_setstatus(EXIT_FAILURE);
+                    } /* end if */
+                } /* end else */
+
+                if(isRoot && unamedtype) {
+                    unsigned u;
+
+                    /* Very special case: dump unamed type in root group */
+                    for(u = 0; u < type_table->nobjs; u++) {
+                        if(!type_table->objs[u].recorded) {
+                            dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                            type = H5Dget_type(dset);
+                            sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                            dump_function_table->dump_named_datatype_function(type, type_name);
+                            H5Tclose(type);
+                            H5Dclose(dset);
+                        }
+                    }
+                }
+
+                /* iterate through all the links */
+
+                if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+                    H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
+                else
+                    H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
+
+                dump_indent -= COL;
+                ctx.indent_level--;
+            }
+            HDfree(t_name);
+            HDfree(grpxid);
+            HDfree(parentxid);
+        }
+    }
+    else {
+        /* only link -- must be first time! */
+        char *t_name = xml_escape_the_name(name);
+        char *grpxid = (char *)HDmalloc((size_t)100);
+        char *parentxid = (char *)HDmalloc((size_t)100);
+
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+
+        if(isRoot) {
+            xml_name_to_XID("/", grpxid, 100, 1);
+            h5tools_str_append(&buffer, "<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">", xmlnsprefix, grpxid, "/");
+        }
+        else {
+            char *t_tmp = xml_escape_the_name(tmp);
+
+            par_name = xml_escape_the_name(par);
+            xml_name_to_XID(tmp, grpxid, 100, 1);
+            xml_name_to_XID(par, parentxid, 100, 1);
+            h5tools_str_append(&buffer, "<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" "
+                    "Parents=\"%s\" H5ParentPaths=\"%s\" >",
+                    xmlnsprefix, t_name, grpxid, t_tmp, parentxid, par_name);
+            HDfree(t_tmp);
+            HDfree(par_name);
+        }
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        HDfree(t_name);
+        HDfree(grpxid);
+        HDfree(parentxid);
+
+        /* 1.  do all the attributes of the group */
+        
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        if((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+            if(H5Aiterate2(gid, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else {
+            if(H5Aiterate2(gid, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+                error_msg("error getting attribute information\n");
+                h5tools_setstatus(EXIT_FAILURE);
+            } /* end if */
+        } /* end else */
+
+        if(isRoot && unamedtype) {
+            unsigned u;
+
+            /* Very special case: dump unamed type in root group */
+            for(u = 0; u < type_table->nobjs; u++) {
+                if(!type_table->objs[u].recorded) {
+                    dset = H5Dopen2(gid, type_table->objs[u].objname, H5P_DEFAULT);
+                    type = H5Dget_type(dset);
+                    sprintf(type_name, "#"H5_PRINTF_HADDR_FMT, type_table->objs[u].objno);
+                    dump_function_table->dump_named_datatype_function(type, type_name);
+                    H5Tclose(type);
+                    H5Dclose(dset);
+                }
+            }
+        }
+
+        /* iterate through all the links */
+
+        if((sort_by == H5_INDEX_CRT_ORDER) && (crt_order_flags & H5P_CRT_ORDER_TRACKED))
+            H5Literate(gid, sort_by, sort_order, NULL, xml_dump_all_cb, NULL);
+        else
+            H5Literate(gid, H5_INDEX_NAME, sort_order, NULL, xml_dump_all_cb, NULL);
+
+        dump_indent -= COL;
+        ctx.indent_level--;
+    }
+
+    ctx.need_prefix = TRUE;
+    h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+    /* Render the element */
+    h5tools_str_reset(&buffer);
+    if(isRoot)
+        h5tools_str_append(&buffer, "</%sRootGroup>", xmlnsprefix);
+    else
+        h5tools_str_append(&buffer, "</%sGroup>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+    
+    if(par)
+        HDfree(par);
+    if(tmp)
+        HDfree(tmp);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_refs
+ *
+ * Purpose:     Print a path to the objects referenced by HDF5 Referneces.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+xml_print_refs(hid_t did, int source)
+{
+    herr_t      e;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
+    hsize_t     i;
+    size_t      tsiz;
+    hobj_ref_t *refbuf = NULL;
+    char       *buf = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if (source == DATASET_DATA) {
+        type = H5Dget_type(did);
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        type = H5Aget_type(did);
+    }
+    else {
+        /* return an error */
+        return FAIL;
+    }
+    if (H5Tget_class(type) != H5T_REFERENCE) {
+        /* return an error */
+        goto error;
+    }
+    if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+        /* region ref not supported yet... */
+        /* return an error */
+        goto error;
+    }
+    if (source == DATASET_DATA) {
+        space = H5Dget_space(did);
+        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if ((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = (char *) HDcalloc((size_t)ssiz, tsiz);
+        if (buf == NULL)
+            goto error;
+        e = H5Dread(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+        /* need to check result here */
+        if (e < 0)
+            goto error;
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        space = H5Aget_space(did);
+        if ((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if ((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = (char *) HDcalloc((size_t)ssiz, tsiz);
+        if (buf == NULL)
+            goto error;
+        e = H5Aread(did, H5T_STD_REF_OBJ, buf);
+        /* need to check the result here */
+        if (e < 0)
+            goto error;
+    }
+
+    refbuf = (hobj_ref_t *) buf;
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    for (i = 0; i < (hsize_t)ssiz; i++) {
+        const char *path = lookup_ref_path(*refbuf);
+        ctx.indent_level++;
+
+        if (!path) {
+            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, "\"%s\"", "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_path = xml_escape_the_string(path, -1);
+
+            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, "\"%s\"", t_path);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            HDfree(t_path);
+        }
+        ctx.indent_level--;
+
+        refbuf++;
+    }
+
+    h5tools_str_close(&buffer);
+
+    HDfree(buf);
+    H5Tclose(type);
+    H5Sclose(space);
+    return SUCCEED;
+    
+error:
+    if(buf)
+        HDfree(buf);
+
+    H5E_BEGIN_TRY {
+        H5Tclose(type);
+        H5Sclose(space);
+    } H5E_END_TRY;
+    return FAIL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_strs
+ *
+ * Purpose:     Print strings.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+xml_print_strs(hid_t did, int source)
+{
+    herr_t      e;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
+    htri_t      is_vlstr = FALSE;
+    size_t      tsiz    = 0;
+    hsize_t     i;
+    size_t      str_size = 0;
+    char       *bp = NULL;
+    char       *onestring = NULL;
+    void       *buf = NULL;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    if (source == DATASET_DATA)
+        type = H5Dget_type(did);
+    else if (source == ATTRIBUTE_DATA)
+        type = H5Aget_type(did);
+    else
+        /* return an error */
+        return FAIL;
+    if (H5Tget_class(type) != H5T_STRING)
+        /* return an error */
+        goto error;
+    /* Check if we have VL data in the dataset's datatype */
+    is_vlstr = H5Tis_variable_str(type);
+
+    if (source == DATASET_DATA) {
+        space = H5Dget_space(did);
+        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = HDmalloc((size_t)ssiz * tsiz);
+        if (buf == NULL)
+            goto error;
+
+        e = H5Dread(did, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+        if (e < 0)
+            goto error;
+    }
+    else if (source == ATTRIBUTE_DATA) {
+        space = H5Aget_space(did);
+        if((ssiz = H5Sget_simple_extent_npoints(space)) < 0)
+            goto error;
+        if((tsiz = H5Tget_size(type)) == 0)
+            goto error;
+
+        buf = HDmalloc((size_t)ssiz * tsiz);
+        if (buf == NULL)
+            goto error;
+
+        e = H5Aread(did, type, buf);
+        if (e < 0)
+            goto error;
+    }
+
+    bp = (char*) buf;
+    if (!is_vlstr)
+        onestring = (char *) HDcalloc(tsiz, sizeof(char));
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    for (i = 0; i < (hsize_t)ssiz; i++) {
+        if (is_vlstr) {
+            onestring = *(char **) bp;
+            if (onestring)
+                str_size = HDstrlen(onestring);
+        }
+        else {
+            HDstrncpy(onestring, bp, tsiz);
+            str_size = tsiz;
+        }
+
+        if (!onestring) {
+            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, "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_onestring = xml_escape_the_string(onestring, (int)str_size);
+            if (t_onestring) {
+                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, "\"%s\"", t_onestring);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                HDfree(t_onestring);
+            }
+        }
+        bp += tsiz;
+    }
+
+    h5tools_str_close(&buffer);
+
+    /* Reclaim any VL memory, if necessary */
+    if (!is_vlstr)
+        if (onestring)
+            HDfree(onestring);
+    if (buf) {
+        if (is_vlstr)
+            H5Dvlen_reclaim(type, space, H5P_DEFAULT, buf);
+        HDfree(buf);
+    }
+    H5Tclose(type);
+    H5Sclose(space);
+    return SUCCEED;
+    
+error:
+    if(buf)
+        HDfree(buf);
+
+    H5E_BEGIN_TRY {
+        H5Tclose(type);
+        H5Sclose(space);
+    } H5E_END_TRY;
+    return FAIL;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    check_filters
+ *
+ * Purpose:     private function to check for the filters and
+ *              put tags in the XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+check_filters(hid_t dcpl)
+{
+    int             nfilt;
+    int             i;
+    H5Z_filter_t    filter;
+    char            namebuf[120];
+    size_t          cd_nelmts = 20;
+    unsigned int    cd_values[20];
+    unsigned int    flags;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    nfilt = H5Pget_nfilters(dcpl);
+    if (nfilt <= 0)
+        return;
+    for (i = 0; i < nfilt; i++) {
+        filter = H5Pget_filter2(dcpl, (unsigned) i, &flags, (size_t *) &cd_nelmts, cd_values, (size_t)120, namebuf, NULL);
+        if (filter == H5Z_FILTER_DEFLATE) {
+            ctx.indent_level++;
+            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, "<%sDeflate Level=\"", xmlnsprefix);
+            if (cd_nelmts < 1) {
+                /* not sure what this means? */
+                h5tools_str_append(&buffer, "6");
+            }
+            else {
+                h5tools_str_append(&buffer, "%d", cd_values[0]);
+            }
+            h5tools_str_append(&buffer, "\"/>");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_FLETCHER32) {
+            ctx.indent_level++;
+            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, "<%sFletcher32 />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_SHUFFLE) {
+            ctx.indent_level++;
+            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, "<%sShuffle />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else if (filter == H5Z_FILTER_SZIP) {
+            ctx.indent_level++;
+
+            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, "<%sSZIP ", xmlnsprefix);
+            if (cd_nelmts < 2) {
+                /* no pixels ? */
+                h5tools_str_append(&buffer, "Pixels_per_block=\"-1\" ");
+            }
+            else {
+                h5tools_str_append(&buffer, "Pixels_per_block=\"%d\" ", cd_values[1]);
+            }
+            /* analyse the options mask */
+            if (cd_values[0] & H5_SZIP_CHIP_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Mode =\"Hardware\" ");
+            }
+            else if (cd_values[0] & H5_SZIP_ALLOW_K13_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Mode =\"K13\" ");
+            }
+            h5tools_str_append(&buffer, "Coding=\"");
+            if (cd_values[0] & H5_SZIP_EC_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Entropy");
+            }
+            else if (cd_values[0] & H5_SZIP_NN_OPTION_MASK) {
+                h5tools_str_append(&buffer, "NN");
+            }
+            h5tools_str_append(&buffer, "\" ");
+
+            h5tools_str_append(&buffer, "ByteOrder=\"");
+            if (cd_values[0] & H5_SZIP_LSB_OPTION_MASK) {
+                h5tools_str_append(&buffer, "LSB");
+            }
+            else if (cd_values[0] & H5_SZIP_MSB_OPTION_MASK) {
+                h5tools_str_append(&buffer, "MSB");
+            }
+            h5tools_str_append(&buffer, "\" ");
+
+            if (cd_values[0] & H5_SZIP_RAW_OPTION_MASK) {
+                h5tools_str_append(&buffer, "Header=\"Raw\"");
+            }
+            h5tools_str_append(&buffer, "/>");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level--;
+        }
+        else {
+            /* unknown option */
+        }
+    }
+
+    h5tools_str_close(&buffer);
+}
+
+static void
+xml_dump_fill_value(hid_t dcpl, hid_t type)
+{
+    size_t      sz;
+    size_t      i;
+    hsize_t     space;
+    void       *buf;
+    char       *name;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t           curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else 
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    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, "<%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    space = H5Tget_size(type);
+    buf = HDmalloc((size_t) space);
+
+    H5Pget_fill_value(dcpl, type, buf);
+
+    if (H5Tget_class(type) == H5T_REFERENCE) {
+        const char * path = lookup_ref_path(*(hobj_ref_t *) buf);
+
+        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, "<%sDataFromFile>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        if (!path) {
+            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, "\"%s\"", "NULL");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+        else {
+            char *t_path = xml_escape_the_string(path, -1);
+
+            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, "\"%s\"", t_path);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            HDfree(t_path);
+        }
+
+        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, "</%sDataFromFile>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    else if (H5Tget_class(type) == H5T_STRING) {
+        /* ????? */
+        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, "<!-- String fill values not yet implemented. -->");
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    else {
+        /* all other data */
+        switch (H5Tget_class(type)) {
+        case H5T_INTEGER:
+            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, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "\"%d\"", *(int *) 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;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_FLOAT:
+            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, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "\"%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;
+            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+            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, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            sz = H5Tget_size(type);
+
+            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, "\"");
+            for (i = 0; i < sz; i++) {
+                h5tools_str_append(&buffer, "%x ", *(unsigned int *) buf);
+                buf = (char *) buf + sizeof(unsigned int);
+            }
+            h5tools_str_append(&buffer, "\"");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_ENUM:
+            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, "<%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            name = H5Tget_member_name(type, *(unsigned *) buf);
+
+            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, "\"%s\"", name);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            if(name)
+                H5free_memory(name);
+            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, "</%sDataFromFile>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        case H5T_ARRAY:
+            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, "<!-- Array fill values not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_TIME:
+            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, "<!-- Time fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_COMPOUND:
+            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, "<!-- Compound fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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_VLEN:
+            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, "<!-- VL fill not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%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);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<!-- Unknown fill datatype: %d -->", H5Tget_class(type));
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        }
+    }
+    HDfree(buf);
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    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, "</%sData>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_dump_dataset
+ *
+ * Purpose:     Dump a description of an HDF5 dataset in XML.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *  Pedro Vicente, October 9, 2007
+ *   added parameters to H5Aiterate2 to allow for other iteration orders
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+xml_dump_dataset(hid_t did, const char *name, struct subset_t H5_ATTR_UNUSED * sset)
+{
+    hid_t               type;
+    hid_t               space;
+    hid_t               dcpl;
+    H5D_fill_value_t    fvstatus;
+    int                 maxdims;
+    hsize_t            *chsize;
+    int                 ndims;
+    int                 i;
+    H5D_alloc_time_t    at;
+    H5D_fill_time_t     ft;
+    hsize_t             tempi;
+    char               *tmp;
+    char               *t_name;
+    char               *t_tmp;
+    char               *t_prefix;
+    unsigned            attr_crt_order_flags;
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;            /* print context  */
+    h5tool_format_t    *outputformat = &xml_dataformat;
+    h5tool_format_t     string_dataformat;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    
+    char *rstr = (char*) HDmalloc((size_t)100);
+    char *pstr = (char*) HDmalloc((size_t)100);
+
+    tmp = (char*) HDmalloc(HDstrlen(prefix) + HDstrlen(name) + 2);
+    HDstrcpy(tmp, prefix);
+    HDstrcat(tmp, "/");
+    HDstrcat(tmp, name);
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+
+    t_name = xml_escape_the_name(name);
+    t_tmp = xml_escape_the_name(tmp);
+    t_prefix = xml_escape_the_name(prefix);
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    xml_name_to_XID(tmp, rstr, 100, 1);
+    xml_name_to_XID(prefix, pstr, 100, 1);
+
+    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, "<%sDataset Name=\"%s\" OBJ-XID=\"%s\" H5Path= \"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">",
+            xmlnsprefix, t_name, rstr, t_tmp, pstr,
+            strcmp(prefix, "") ? t_prefix : "/");
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    HDfree(t_name);
+    HDfree(t_tmp);
+    HDfree(t_prefix);
+    HDfree(rstr);
+    HDfree(pstr);
+    HDfree(tmp);
+
+    dcpl = H5Dget_create_plist(did);
+    type = H5Dget_type(did);
+    space = H5Dget_space(did);
+
+    /* query the creation properties for attributes */
+    H5Pget_attr_creation_order(dcpl, &attr_crt_order_flags);
+
+    /* Print information about storage layout */
+    if (H5D_CHUNKED == H5Pget_layout(dcpl)) {
+        maxdims = H5Sget_simple_extent_ndims(space);
+        HDassert(maxdims >= 0);
+        chsize = (hsize_t *)HDmalloc((size_t)maxdims * sizeof(hsize_t));
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        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, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        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, "<%sChunkedLayout ", xmlnsprefix);
+        ndims = H5Pget_chunk(dcpl, maxdims, chsize);
+        h5tools_str_append(&buffer, "Ndims=\"%d\">", ndims);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+
+        for (i = 0; i < ndims; i++) {
+
+            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, "<%sChunkDimension DimSize=\"%" H5_PRINTF_LL_WIDTH "u\" />", xmlnsprefix, chsize[i]);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sRequiredFilter>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level++;
+        dump_indent += COL;
+        check_filters(dcpl);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        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, "</%sRequiredFilter>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        ctx.indent_level--;
+        dump_indent -= COL;
+        
+        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, "</%sChunkedLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+
+        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, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+        dump_indent -= COL;
+        HDfree(chsize);
+    }
+    else if (H5D_CONTIGUOUS == H5Pget_layout(dcpl)) {
+        ctx.indent_level++;
+
+        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, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        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, "<%sContiguousLayout/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        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, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    else if (H5D_COMPACT == H5Pget_layout(dcpl)) {
+        ctx.indent_level++;
+
+        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, "<%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        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, "<%sCompactLayout/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        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, "</%sStorageLayout>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    /* and check for external.... ?? */
+
+    /* fill value */
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    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, "<%sFillValueInfo ", xmlnsprefix);
+    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;
+        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:
+        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);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    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, "<%sFillValue>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    H5Pfill_value_defined(dcpl, &fvstatus);
+    if (fvstatus == H5D_FILL_VALUE_UNDEFINED || (fvstatus == H5D_FILL_VALUE_DEFAULT && ft == H5D_FILL_TIME_IFSET)) {
+        ctx.indent_level++;
+
+        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, "<%sNoFill/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+    else {
+        xml_dump_fill_value(dcpl, type);
+    }
+
+    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, "</%sFillValue>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    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, "</%sFillValueInfo>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    dump_function_table->dump_dataspace_function(space);
+    dump_function_table->dump_datatype_function(type);
+
+    ctx.indent_level++;
+    dump_indent += COL;
+
+    if ((sort_by == H5_INDEX_CRT_ORDER) && (attr_crt_order_flags & H5P_CRT_ORDER_TRACKED)) {
+        if (H5Aiterate2(did, sort_by, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+            error_msg("error getting attribute information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        } /* end if */
+    } /* end if */
+    else {
+        if (H5Aiterate2(did, H5_INDEX_NAME, sort_order, NULL, dump_function_table->dump_attribute_function, NULL) < 0) {
+            error_msg("error getting attribute information\n");
+            h5tools_setstatus(EXIT_FAILURE);
+        } /* end if */
+    } /* end else */
+
+    ctx.indent_level--;
+    dump_indent -= COL;
+    tempi = H5Dget_storage_size(did);
+
+    if (display_data && (tempi > 0)) {
+        switch (H5Tget_class(type)) {
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_ENUM:
+        case H5T_ARRAY:
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            ctx.indent_level--;
+            dump_indent -= COL;
+            break;
+
+        case H5T_TIME:
+            ctx.indent_level++;
+
+            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, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Time data not yet implemented. -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level--;
+            break;
+
+        case H5T_COMPOUND:
+            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, "<!-- Note: format of compound data not specified -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            ctx.indent_level--;
+            dump_indent -= COL;
+            break;
+
+        case H5T_REFERENCE:
+            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, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            if (!H5Tequal(type, H5T_STD_REF_OBJ)) {
+                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, "<!-- Note: Region references not supported -->");
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData />", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+            else {
+                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, "<%sDataFromFile>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                xml_print_refs(did, DATASET_DATA);
+
+                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, "</%sDataFromFile>", xmlnsprefix);
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+
+        case H5T_VLEN:
+            ctx.indent_level--;
+            dump_indent -= COL;
+            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, "<!-- Note: format of VL data not specified -->");
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            ctx.indent_level++;
+            dump_indent += COL;
+
+            ctx.indent_level++;
+            dump_indent += COL;
+            dump_function_table->dump_data_function(did, DATASET_DATA, NULL, 0);
+            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);
+
+            /* Render the element */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "<%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<!-- Unknown datatype: %d -->", H5Tget_class(type));
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sNoData/>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "</%sData>", xmlnsprefix);
+            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+        }
+    }
+    else {
+        /* no data written */
+        ctx.indent_level++;
+
+        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, "<%sData>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+
+        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, "<%sNoData/>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        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, "</%sData>", xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+    }
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Pclose(dcpl);
+
+    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, "</%sDataset>", xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    h5tools_str_close(&buffer);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    xml_print_enum
+ *
+ * Purpose:     Print the values of an HDF5 ENUM in XML.
+ *              Very similar to regular DDL output.
+ *
+ * Return:      void
+ *
+ * Programmer:  REMcG
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+xml_print_enum(hid_t type)
+{
+    char              **name = NULL;    /*member names                   */
+    unsigned char      *value = NULL;   /*value array                    */
+    unsigned            nmembs;         /*number of members              */
+    hid_t               super;          /*enum base integer type         */
+    hid_t               native = -1;    /*native integer datatype        */
+    size_t              dst_size;       /*destination value type size    */
+    unsigned            i;              /*miscellaneous counters         */
+    size_t              j;
+    h5tools_str_t buffer;          /* string into which to render   */
+    h5tools_context_t ctx;            /* print context  */
+    h5tool_format_t  *outputformat = &xml_dataformat;
+    h5tool_format_t   string_dataformat;
+    hsize_t     curr_pos = 0;        /* total data element position   */
+
+    /* setup */
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    ctx.indent_level = dump_indent / COL;
+    ctx.cur_column = dump_indent;
+    
+    string_dataformat = *outputformat;
+
+    if (fp_format) {
+        string_dataformat.fmt_double = fp_format;
+        string_dataformat.fmt_float = fp_format;
+    }
+
+    if (h5tools_nCols == 0) {
+        string_dataformat.line_ncols = 65535;
+        string_dataformat.line_per_line = 1;
+    }
+    else
+        string_dataformat.line_ncols = h5tools_nCols;
+
+    string_dataformat.do_escape = display_escape;
+    outputformat = &string_dataformat;
+
+    nmembs = (unsigned)H5Tget_nmembers(type);
+    super = H5Tget_super(type);
+
+    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, "<%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    xml_print_datatype(super,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, "</%sDataType>",xmlnsprefix);
+    h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /*
+     * Determine what datatype to use for the native values.  To simplify
+     * things we entertain three possibilities:
+     *  1. long long -- the largest native signed integer
+     *    2. unsigned long long -- the largest native unsigned integer
+     *    3. raw format
+     */
+    if (H5Tget_size(type) <= sizeof(long long)) {
+        dst_size = sizeof(long long);
+
+        if (H5T_SGN_NONE == H5Tget_sign(type)) {
+            native = H5T_NATIVE_ULLONG;
+        } 
+        else {
+            native = H5T_NATIVE_LLONG;
+        }
+    } 
+    else {
+        dst_size = H5Tget_size(type);
+    }
+
+    /* Get the names and raw values of all members */
+    name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
+    value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
+
+    for (i = 0; i < nmembs; i++) {
+        name[i] = H5Tget_member_name(type, i);
+        H5Tget_member_value(type, i, value + i * H5Tget_size(type));
+    }
+
+    /* Convert values to native datatype */
+    if (native > 0)
+        H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT);
+
+    /* Sort members by increasing value */
+    /*not implemented yet */
+
+    /* Print members */
+    ctx.indent_level++;
+    dump_indent += COL;
+    for (i = 0; i < nmembs; i++) {
+        char *t_name = xml_escape_the_name(name[i]);
+
+        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, "<%sEnumElement>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        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, "%s", t_name);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        HDfree(t_name);
+        ctx.indent_level--;
+
+        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, "</%sEnumElement>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)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, "<%sEnumValue>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level++;
+        ctx.need_prefix = TRUE;
+        h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+
+        /* Render the element */
+        h5tools_str_reset(&buffer);
+        if (native < 0) {
+            h5tools_str_append(&buffer, "0x");
+
+            for (j = 0; j < dst_size; j++)
+                h5tools_str_append(&buffer, "%02x", value[i * dst_size + j]);
+        } 
+        else if (H5T_SGN_NONE == H5Tget_sign(native)) {
+            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "u", *((unsigned long long *)
+                       ((void *) (value + i * dst_size))));
+        } 
+        else {
+            h5tools_str_append(&buffer,"%" H5_PRINTF_LL_WIDTH "d",
+                      *((long long *) ((void *) (value + i * dst_size))));
+        }
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+        ctx.indent_level--;
+
+        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, "</%sEnumValue>",xmlnsprefix);
+        h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+    ctx.indent_level--;
+    dump_indent -= COL;
+
+    h5tools_str_close(&buffer);
+
+    /* Release resources */
+    for (i = 0; i < nmembs; i++)
+        H5free_memory(name[i]);
+
+    HDfree(name);
+    HDfree(value);
+    H5Tclose(super);
+}
+
diff --git a/tools/src/h5dump/h5dump_xml.h b/tools/src/h5dump/h5dump_xml.h
new file mode 100644
index 0000000..3c59917
--- /dev/null
+++ b/tools/src/h5dump/h5dump_xml.h
@@ -0,0 +1,37 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5DUMP_XML_H__
+#define H5DUMP_XML_H__
+
+extern const char       *xmlnsprefix;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The dump functions of the dump_function_table */
+/* XML format:   same interface, alternative output */
+
+void      xml_dump_group(hid_t, const char *);
+void      xml_dump_named_datatype(hid_t, const char *);
+void      xml_dump_dataset(hid_t, const char *, struct subset_t *);
+void      xml_dump_dataspace(hid_t space);
+void      xml_dump_datatype(hid_t type);
+herr_t    xml_dump_attr(hid_t, const char *, const H5A_info_t *, void *);
+void      xml_dump_data(hid_t, int, struct subset_t *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* !H5DUMP_XML_H__ */
diff --git a/tools/src/h5format_convert/CMakeLists.txt b/tools/src/h5format_convert/CMakeLists.txt
new file mode 100644
index 0000000..fa3abc0
--- /dev/null
+++ b/tools/src/h5format_convert/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5FC)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5format_convert executables
+# --------------------------------------------------------------------
+add_executable (h5format_convert ${HDF5_TOOLS_SRC_H5FC_SOURCE_DIR}/h5format_convert.c)
+TARGET_NAMING (h5format_convert STATIC)
+TARGET_C_PROPERTIES (h5format_convert STATIC " " " ")
+target_link_libraries (h5format_convert  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5format_convert PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5format_convert")
+
+set (H5_DEP_EXECUTABLES h5format_convert)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  INSTALL_PROGRAM_PDB (h5format_convert ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          h5format_convert
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
\ No newline at end of file
diff --git a/tools/src/h5format_convert/Makefile.am b/tools/src/h5format_convert/Makefile.am
new file mode 100644
index 0000000..2b36949
--- /dev/null
+++ b/tools/src/h5format_convert/Makefile.am
@@ -0,0 +1,36 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# These are our main targets, the tools
+bin_PROGRAMS=h5format_convert
+bin_SCRIPTS=
+
+# Add h5format_convert specific linker flags here
+h5format_convert_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+CLEANFILES=
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5format_convert/Makefile.in b/tools/src/h5format_convert/Makefile.in
new file mode 100644
index 0000000..51d559f
--- /dev/null
+++ b/tools/src/h5format_convert/Makefile.in
@@ -0,0 +1,1493 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5format_convert$(EXEEXT)
+TESTS =
+subdir = tools/src/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/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5format_convert_SOURCES = h5format_convert.c
+h5format_convert_OBJECTS = h5format_convert.$(OBJEXT)
+h5format_convert_LDADD = $(LDADD)
+h5format_convert_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 = 
+h5format_convert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(h5format_convert_LDFLAGS) $(LDFLAGS) \
+	-o $@
+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; }; \
+  }
+SCRIPTS = $(bin_SCRIPTS)
+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 = h5format_convert.c
+DIST_SOURCES = 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__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 $(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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+bin_SCRIPTS = 
+
+# Add h5format_convert specific linker flags here
+h5format_convert_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+CLEANFILES = 
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5format_convert/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/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):
+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
+
+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)
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_SCRIPTS)'; 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 \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | 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; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5format_convert.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local
+installdirs:
+	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-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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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-binPROGRAMS 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-binSCRIPTS
+
+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 uninstall-binSCRIPTS
+
+.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 \
+	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-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 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
+# 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-dyn: $(DYN)
+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 dyn 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/src/h5format_convert/h5format_convert.c b/tools/src/h5format_convert/h5format_convert.c
new file mode 100644
index 0000000..2bfe280
--- /dev/null
+++ b/tools/src/h5format_convert/h5format_convert.c
@@ -0,0 +1,472 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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) 
+{
+    HDfprintf(stdout, "usage: %s [OPTIONS] file_name\n", prog);
+    HDfprintf(stdout, "  OPTIONS\n");
+    HDfprintf(stdout, "   -h, --help                Print a usage message and exit\n");
+    HDfprintf(stdout, "   -V, --version             Print version number and exit\n");
+    HDfprintf(stdout, "   -v, --verbose             Turn on verbose mode\n");
+    HDfprintf(stdout, "   -d dname, --dname=dataset_name    Pathname for the dataset\n");
+    HDfprintf(stdout, "   -n, --noop                Perform all the steps except the actual conversion\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "Examples of use:\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "h5format_convert -d /group/dataset file_name\n");
+    HDfprintf(stdout, "  Convert the dataset </group/dataset> in the HDF5 file <file_name>:\n");
+    HDfprintf(stdout, "    a. chunked dataset: convert the chunk indexing type to version 1 B-tree\n");
+    HDfprintf(stdout, "    b. compact/contiguous dataset: downgrade the layout version to 3\n");
+    HDfprintf(stdout, "    c. virtual dataset: no action\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "h5format_convert file_name\n");
+    HDfprintf(stdout, "  Convert all datasets in the HDF5 file <file_name>:\n");
+    HDfprintf(stdout, "    a. chunked dataset: convert the chunk indexing type to version 1 B-tree\n");
+    HDfprintf(stdout, "    b. compact/contiguous dataset: downgrade the layout version to 3\n");
+    HDfprintf(stdout, "    c. virtual dataset: no action\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "h5format_convert -n -d /group/dataset file_name\n");
+    HDfprintf(stdout, "  Go through all the steps except the actual conversion when \n");
+    HDfprintf(stdout, "  converting the 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)
+		    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 downgrade a dataset's indexing type or layout version:
+ *		For chunked:
+ *		  Downgrade the chunk indexing type to version 1 B-tree
+ *	    	  If type is already version 1 B-tree, no further action
+ *		For compact/contiguous:
+ *		  Downgrade the layout version from 4 to 3
+ *		  If version is already <= 3, no further action
+ *		For virtual:
+ *		  No further action
+ *
+ * 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)
+	HDfprintf(stdout, "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)
+	HDfprintf(stdout, "Retrieve the dataset's layout\n");
+
+    switch(layout_type) {
+	case H5D_CHUNKED:
+	    if(verbose_g)
+		HDfprintf(stdout, "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)
+		HDfprintf(stdout, "Retrieve the dataset's chunk indexing type\n");
+
+	    if(idx_type == H5D_CHUNK_IDX_BTREE) {
+		if(verbose_g)
+		    HDfprintf(stdout, "Dataset's chunk indexing type is already version 1 B-tree: no further action\n");
+		h5tools_setstatus(EXIT_SUCCESS);
+		goto done;
+	    } else if (verbose_g)
+		HDfprintf(stdout, "Dataset's chunk indexing type is not version 1 B-tree\n");
+	    break;
+
+	case H5D_CONTIGUOUS:
+	    if(verbose_g)
+		HDfprintf(stdout, "Dataset is a contiguous dataset: downgrade layout version as needed\n");
+	    break;
+
+        case H5D_COMPACT:
+	    if(verbose_g)
+		HDfprintf(stdout, "Dataset is a compact dataset: downgrade layout version as needed\n");
+	    break;
+
+        case H5D_VIRTUAL:
+	    if(verbose_g)
+		HDfprintf(stdout, "No further action for virtual dataset\n");
+	    goto done;
+
+        case H5D_NLAYOUTS:
+        case H5D_LAYOUT_ERROR:
+	default:
+	    error_msg("unknown layout type for \"%s\"\n", dname);
+	    h5tools_setstatus(EXIT_FAILURE);
+	    goto error;
+
+    } /* end switch */
+
+    /* No further action if it is a noop */
+    if(noop_g) {
+	if(verbose_g)
+	    HDfprintf(stdout, "Not converting the dataset\n");
+	h5tools_setstatus(EXIT_SUCCESS);
+	goto done;
+    }
+
+    if(verbose_g)
+	HDfprintf(stdout, "Converting the dataset...\n");
+
+    /* Downgrade the dataset */
+    if(H5Dformat_convert(did) < 0) {
+	error_msg("unable to downgrade dataset \"%s\"\n", dname);
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+    } else if(verbose_g)
+	HDfprintf(stdout, "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)
+	HDfprintf(stdout, "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)
+	HDfprintf(stdout, "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)
+		HDfprintf(stdout, "Going to process dataset:%s...\n", path);
+	    if(convert(fid, path) < 0)
+		goto error;
+	} /* end if */
+    } /* 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)
+	HDfprintf(stdout, "Process command line options\n");
+
+    if(noop_g && verbose_g)
+	HDfprintf(stdout, "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)
+	HDfprintf(stdout, "Open the file %s\n", fname_g);
+
+    if(dset_g) { /* Convert a specified dataset in the file */
+	if(verbose_g)
+	    HDfprintf(stdout, "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)
+	    HDfprintf(stdout, "Processing all datasets in the file...\n");
+	if(h5trav_visit(fid, "/", TRUE, TRUE, convert_dsets_cb, NULL, &fid) < 0)
+	    goto done;
+    } /* end else */
+
+    if(verbose_g) {
+        if(noop_g) {
+            HDfprintf(stdout, "Not processing the file's superblock...\n");
+            h5tools_setstatus(EXIT_SUCCESS);
+            goto done;
+        } /* end if */
+        HDfprintf(stdout, "Processing the file's superblock...\n");
+    } /* end if */
+
+    /* Process superblock */
+    if(H5Fformat_convert(fid) < 0) {
+        error_msg("unable to convert file's superblock\"%s\"\n", fname_g);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    } /* end if */
+
+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)
+	    HDfprintf(stdout, "Close the file\n");
+    }  /* end if */
+
+    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/src/h5import/CMakeLists.txt b/tools/src/h5import/CMakeLists.txt
new file mode 100644
index 0000000..9a61beb
--- /dev/null
+++ b/tools/src/h5import/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5IMPORT)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5import executables
+# --------------------------------------------------------------------
+add_executable (h5import ${HDF5_TOOLS_SRC_H5IMPORT_SOURCE_DIR}/h5import.c)
+TARGET_NAMING (h5import STATIC)
+TARGET_C_PROPERTIES (h5import STATIC " " " ")
+target_link_libraries (h5import  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+#set_target_properties (h5import PROPERTIES COMPILE_DEFINITIONS H5DEBUGIMPORT)
+set_target_properties (h5import PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5import")
+
+set (H5_DEP_EXECUTABLES h5import)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  INSTALL_PROGRAM_PDB (h5import ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          h5import
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5import/Makefile.am b/tools/src/h5import/Makefile.am
new file mode 100644
index 0000000..4623eb5
--- /dev/null
+++ b/tools/src/h5import/Makefile.am
@@ -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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Our main targets
+bin_PROGRAMS=h5import
+
+# Add h5import specific linker flags here
+h5import_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the main hdf5 library and the tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5import/Makefile.in b/tools/src/h5import/Makefile.in
new file mode 100644
index 0000000..56b109e
--- /dev/null
+++ b/tools/src/h5import/Makefile.in
@@ -0,0 +1,1451 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5import$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5import_SOURCES = h5import.c
+h5import_OBJECTS = h5import.$(OBJEXT)
+h5import_LDADD = $(LDADD)
+h5import_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 = 
+h5import_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5import_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 = h5import.c
+DIST_SOURCES = h5import.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 $(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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Add h5import specific linker flags here
+h5import_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the main hdf5 library and the tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5import/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5import/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):
+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
+
+h5import$(EXEEXT): $(h5import_OBJECTS) $(h5import_DEPENDENCIES) $(EXTRA_h5import_DEPENDENCIES) 
+	@rm -f h5import$(EXEEXT)
+	$(AM_V_CCLD)$(h5import_LINK) $(h5import_OBJECTS) $(h5import_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5import.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-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)
+
+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 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 \
+	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-dyn: $(DYN)
+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 dyn 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/src/h5import/h5import.c b/tools/src/h5import/h5import.c
new file mode 100644
index 0000000..c71aeef
--- /dev/null
+++ b/tools/src/h5import/h5import.c
@@ -0,0 +1,4391 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include "h5import.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5import"
+
+#ifdef H5_HAVE_WIN32_API
+#define READ_OPEN_FLAGS "rb"
+#else
+#define READ_OPEN_FLAGS "r"
+#endif
+
+/* Local function declarations */
+static int  gtoken(char *s);
+static int  process(struct Options *opt);
+static int  processConfigurationFile(char *infile, struct Input *in);
+static int  mapKeywordToIndex(char *key);
+static int  parsePathInfo(struct path_info *path, char *strm);
+static int  parseDimensions(struct Input *in, char *strm);
+static int  getInputSize(struct Input *in, int ival);
+static int  getInputClass(struct Input *in, char * strm);
+static int  getInputClassType(struct Input *in, char * strm);
+static int  InputClassStrToInt(char *temp);
+static int  getRank(struct Input *in, FILE *strm);
+static int  getDimensionSizes(struct Input *in, FILE *strm);
+static int  getOutputSize(struct Input *in, FILE *strm);
+static int  getOutputClass(struct Input *in, FILE *strm);
+static int  OutputClassStrToInt(char *temp);
+static int  getOutputArchitecture(struct Input *in, FILE *strm);
+static int  OutputArchStrToInt(const char *temp);
+static int  getOutputByteOrder(struct Input *in, FILE *strm);
+static int  OutputByteOrderStrToInt(const char *temp);
+static int  getChunkedDimensionSizes(struct Input *in, FILE *strm);
+static int  getCompressionType(struct Input *in, FILE *strm);
+static int  CompressionTypeStrToInt(char *temp);
+static int  getCompressionParameter(struct Input *in, FILE *strm);
+static int  getExternalFilename(struct Input *in, FILE *strm);
+static int  getMaximumDimensionSizes(struct Input *in, FILE *strm);
+static int  processDataFile(char *infile, struct Input *in, hid_t file_id);
+static int  readIntegerData(FILE *strm, struct Input *in);
+static int  readFloatData(FILE *strm, struct Input *in);
+static int  allocateIntegerStorage(struct Input *in);
+static int  allocateFloatStorage(struct Input *in);
+static int  readUIntegerData(FILE *strm, struct Input *in);
+static int  allocateUIntegerStorage(struct Input *in);
+static int  validateConfigurationParameters(struct Input *in);
+static int  processStrData(FILE *strm, struct Input *in, hid_t file_id);
+static int  processStrHDFData(FILE *strm, struct Input *in, hid_t file_id);
+
+int main(int argc, char *argv[])
+{
+    struct Options  opt;
+    int             outfile_named = FALSE;
+    int             token;
+    int             i;
+    int             state = 0;
+    struct Input   *in = NULL;
+
+    const char     *err1 = "Invalid number of arguments:  %d.\n";
+    const char     *err2 = "Error in state table.\n";
+    const char     *err3 = "No output file given.\n";
+    const char     *err4 = "Program aborted.\n";
+    const char     *err5 = "Invalid path %s.\n";
+    const char     *err6 = "Invalid dimensions - %s.\n";
+    const char     *err7 = "Invalid type of data - %s.\n";
+    const char     *err8 = "Invalid size of data - %s.\n";
+    const char     *err9 = "Cannot specify more than 30 input files in one call to h5import.\n";
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    (void) HDsetvbuf(stderr, (char *) NULL, _IOLBF, 0);
+    (void) HDsetvbuf(stdout, (char *) NULL, _IOLBF, 0);
+
+    if (argv[1] && (HDstrcmp("-V", argv[1]) == 0)) {
+        print_version(PROGRAMNAME);
+        HDexit(EXIT_SUCCESS);
+    }
+
+    /*
+     * validate the number of command line arguments
+     */
+    if (argc < 2) {
+        (void) HDfprintf(stderr, err1, argc);
+        usage(argv[0]);
+        goto err;
+    }
+
+    /* Initialize the file structure to 0 */
+    HDmemset(&opt, 0, sizeof(struct Options));
+
+    /*
+     * parse the command line
+     */
+    for (i = 1; i < argc; i++) {
+        if ((token = gtoken(argv[i])) == ERR) {
+            usage(argv[0]);
+            goto err;
+        }
+
+        state = state_table[state][token];
+
+        switch (state) {
+
+        case 1: /* counting input files */
+            if (opt.fcount < 29) {
+                (void) HDstrcpy(opt.infiles[opt.fcount].datafile, argv[i]);
+                in = &(opt.infiles[opt.fcount].in);
+                opt.infiles[opt.fcount].config = 0;
+                setDefaultValues(in, opt.fcount);
+                opt.fcount++;
+            }
+            else {
+                (void) HDfprintf(stderr, err9, argv[i]);
+                goto err;
+            }
+
+            break;
+
+        case 2: /* -c found; look for configfile */
+            break;
+
+        case 3: /* get configfile name */
+            (void) HDstrcpy(opt.infiles[opt.fcount-1].configfile, argv[i]);
+            opt.infiles[opt.fcount - 1].config = 1;
+            break;
+
+        case 4: /* -o found; look for outfile */
+            break;
+
+        case 5: /* get outfile found */
+            (void) HDstrcpy(opt.outfile, argv[i]);
+            outfile_named = TRUE;
+            break;
+
+        case 6: /* -h found; help, then exit */
+            help(argv[0]);
+            HDexit(EXIT_SUCCESS);
+            break;
+
+        case 7: /* -d found; look for dimensions */
+            break;
+
+        case 8: /* read dimensions */
+            if (parseDimensions(in, argv[i]) == -1) {
+                (void) HDfprintf(stderr, err6, argv[i]);
+                goto err;
+            }
+            break;
+
+        case 9: /* -p found; look for path name */
+            break;
+
+        case 10: /* read path name */
+            if (parsePathInfo(&in->path, argv[i]) == -1) {
+                (void) HDfprintf(stderr, err5, argv[i]);
+                goto err;
+            }
+            break;
+
+        case 11: /* -t found; look for data type */
+            break;
+
+        case 12: /* read data type */
+            if (getInputClass(in, argv[i]) == -1) {
+                (void) HDfprintf(stderr, err7, argv[i]);
+                goto err;
+            }
+
+            if (in->inputClass == 0 || in->inputClass == 4)
+                in->outputClass = 0;
+            if (in->inputClass == 1 || in->inputClass == 2 || in->inputClass == 3)
+                in->outputClass = 1;
+            if (in->inputClass == 6 || in->inputClass == 7)
+                in->outputClass = 2;
+            break;
+
+        case 13: /* -s found; look for data size */
+            break;
+
+        case 14: /* read data size */
+            if (getInputSize(in, (int) HDstrtol(argv[i], NULL, BASE_10)) == -1) {
+                (void) HDfprintf(stderr, err8, argv[i]);
+                goto err;
+            }
+            /*set default value for output-size */
+            in->outputSize = in->inputSize;
+            break;
+
+        case ERR: /* command syntax error */
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            usage(argv[0]);
+            goto err;
+        }
+    }
+
+    if (FALSE == outfile_named) {
+        (void) HDfprintf(stderr, "%s", err3);
+        usage(argv[0]);
+        goto err;
+    }
+
+    if (process(&opt) == -1)
+        goto err;
+    
+    for (i = 0; i < opt.fcount; i++) {
+        in = &(opt.infiles[i].in);
+        if (in->sizeOfDimension)
+            HDfree(in->sizeOfDimension);
+        if (in->sizeOfChunk)
+            HDfree(in->sizeOfChunk);
+        if (in->maxsizeOfDimension)
+            HDfree(in->maxsizeOfDimension);
+        if (in->externFilename)
+            HDfree(in->externFilename);
+        if (in->data)
+            HDfree(in->data);
+    }
+
+    return (EXIT_SUCCESS);
+err: 
+    (void) HDfprintf(stderr, "%s", err4);
+    for (i = 0; i < opt.fcount; i++) {
+        in = &(opt.infiles[i].in);
+        if (in->sizeOfDimension)
+            HDfree(in->sizeOfDimension);
+        if (in->sizeOfChunk)
+            HDfree(in->sizeOfChunk);
+        if (in->maxsizeOfDimension)
+            HDfree(in->maxsizeOfDimension);
+        if (in->externFilename)
+            HDfree(in->externFilename);
+        if (in->data)
+            HDfree(in->data);
+    }
+    return (EXIT_FAILURE);
+}
+
+static int gtoken(char *s)
+{
+    size_t      len;
+    int         token = ERR;
+
+    const char *err1 = "Illegal argument: %s.\n";
+
+    /*
+     * identify the token type
+     */
+    if (s[0] == '-') { /* option name (or negative number) */
+        len = HDstrlen(&s[1]);
+        switch (s[1]) {
+        case 'o':
+            if (!HDstrncmp("outfile", &s[1], len))
+                token = OPT_o;
+            break;
+
+        case 'c':
+            if (!HDstrncmp("config", &s[1], len))
+                token = OPT_c;
+            break;
+
+        case 'h':
+            if (!HDstrncmp("help", &s[1], len))
+                token = OPT_h;
+            break;
+
+        case 'd':
+            if (!HDstrncmp("dims", &s[1], len))
+                token = OPT_d;
+            break;
+
+        case 'p':
+            if (!HDstrncmp("path", &s[1], len))
+                token = OPT_p;
+            break;
+
+        case 't':
+            if (!HDstrncmp("type", &s[1], len))
+                token = OPT_t;
+            break;
+
+        case 's':
+            if (!HDstrncmp("size", &s[1], len))
+                token = OPT_s;
+            break;
+        default:
+            token = ERR; /* not a supported option tag */
+            break;
+        }
+
+        if (token == ERR)
+            (void) HDfprintf(stderr, err1, s);
+    }
+    else { /* filename */
+        token = FILNAME;
+    }
+    return (token);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    processDataFile
+ *
+ * Purpose:     allocate memory and read data file
+ *
+ * Return:      0, success, -1, error
+ *
+ * Programmer:  pkmat
+ *
+ * Modifications: pvn
+ *  7/23/2007. Added support for STR type, extra parameter FILE_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static int processDataFile(char *infile, struct Input *in, hid_t file_id)
+{
+    FILE       *strm = NULL;
+    const char *err1 = "Unable to open the input file  %s for reading.\n";
+    const char *err2 = "Error in allocating integer data storage.\n";
+    const char *err3 = "Error in allocating floating-point data storage.\n";
+    const char *err4 = "Error in reading integer data.\n";
+    const char *err5 = "Error in reading floating-point data.\n";
+    const char *err6 = "Error in allocating unsigned integer data storage.\n";
+    const char *err7 = "Error in reading unsigned integer data.\n";
+    const char *err10 = "Unrecognized input class type.\n";
+    const char *err11 = "Error in reading string data.\n";
+    int retval = -1;
+
+    /*-------------------------------------------------------------------------
+     * special case for opening binary classes in H5_HAVE_WIN32_API
+     * "FP" denotes a floating point binary file,
+     * "IN" denotes a signed integer binary file,
+     * "UIN" denotes an unsigned integer binary file,
+     *-------------------------------------------------------------------------
+     */
+    if (in->inputClass == 4 /* "IN" */|| in->inputClass == 3 /* "FP" */|| in->inputClass == 7 /* "UIN" */) {
+
+        if ((strm = HDfopen(infile, READ_OPEN_FLAGS)) == NULL) {
+            (void) HDfprintf(stderr, err1, infile);
+            goto error;
+        }
+    }
+    /*-------------------------------------------------------------------------
+     * if the input class is not binary, just use "r"
+     *-------------------------------------------------------------------------
+     */
+    else {
+        if ((strm = HDfopen(infile, "r")) == NULL) {
+            (void) HDfprintf(stderr, err1, infile);
+            goto error;
+        }
+    }
+
+    switch (in->inputClass) {
+    case 0: /*  TEXTIN */
+    case 4: /*  IN  */
+        if (allocateIntegerStorage(in) == -1) {
+            (void) HDfprintf(stderr, err2, infile);
+            goto error;
+        }
+
+        if (readIntegerData(strm, in) == -1) {
+            (void) HDfprintf(stderr, err4, infile);
+            goto error;
+        }
+        break;
+
+    case 1: /*  TEXTFP */
+    case 2: /*  TEXTFPE  */
+    case 3: /*  FP  */
+        if (allocateFloatStorage(in) == -1) {
+            (void) HDfprintf(stderr, err3, infile);
+            goto error;
+
+        }
+
+        if (readFloatData(strm, in) == -1) {
+            (void) HDfprintf(stderr, err5, infile);
+            goto error;
+        }
+        break;
+
+    case 5: /*  STR  */
+        if (in->h5dumpInput) {
+            if (processStrHDFData(strm, in, file_id) == -1) {
+                (void) HDfprintf(stderr, err11, infile);
+                goto error;
+            }
+        }
+        else {
+            if (processStrData(strm, in, file_id) == -1) {
+                (void) HDfprintf(stderr, err11, infile);
+                goto error;
+            }
+        }
+
+        break;
+
+    case 6: /* TEXTUIN */
+    case 7: /* UIN */
+        if (allocateUIntegerStorage(in) == -1) {
+            (void) HDfprintf(stderr, err6, infile);
+            goto error;
+        }
+        if (readUIntegerData(strm, in) == -1) {
+            (void) HDfprintf(stderr, err7, infile);
+            goto error;
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err10);
+        goto error;
+    }
+
+    /* Set success return value */
+    retval = 0;
+
+error:
+    if(strm)
+        HDfclose(strm);
+    return(retval);
+}
+
+static int readIntegerData(FILE *strm, struct Input *in)
+{
+    H5DT_INT8  *in08;
+    H5DT_INT16 *in16;
+    H5DT_INT16  temp;
+    H5DT_INT32 *in32;
+#ifdef H5_SIZEOF_LONG_LONG
+    H5DT_INT64 *in64;
+    char        buffer[256];
+#endif
+    hsize_t     len = 1;
+    hsize_t     i;
+    int         j;
+
+    const char *err1 = "Unable to get integer value from file.\n";
+    const char *err2 = "Unrecognized input class type.\n";
+    const char *err3 = "Invalid input size.\n";
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 8:
+        switch (in->inputClass) {
+        case 0: /* TEXTIN */
+            in08 = (H5DT_INT8 *) in->data;
+            for (i = 0; i < len; i++, in08++) {
+                if (fscanf(strm, "%hd", &temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+                (*in08) = (H5DT_INT8) temp;
+            }
+            break;
+
+        case 4: /* IN */
+            in08 = (H5DT_INT8 *) in->data;
+            for (i = 0; i < len; i++, in08++) {
+                if (HDfread((char *) in08, sizeof(H5DT_INT8), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 16:
+        in16 = (H5DT_INT16 *) in->data;
+        switch (in->inputClass) {
+        case 0: /* TEXTIN */
+            for (i = 0; i < len; i++, in16++) {
+                if (fscanf(strm, "%hd", in16) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            in16 = (H5DT_INT16 *) in->data;
+            break;
+
+        case 4: /* IN */
+            for (i = 0; i < len; i++, in16++) {
+                if (HDfread((char *) in16, sizeof(H5DT_INT16), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 32:
+        in32 = (H5DT_INT32 *) in->data;
+        switch (in->inputClass) {
+        case 0: /* TEXTIN */
+            for (i = 0; i < len; i++, in32++) {
+                if (fscanf(strm, "%d", in32) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        case 4: /* IN */
+            for (i = 0; i < len; i++, in32++) {
+                if (HDfread((char *) in32, sizeof(H5DT_INT32), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+#ifdef H5_SIZEOF_LONG_LONG
+    case 64:
+        in64 = (H5DT_INT64 *) in->data;
+        switch (in->inputClass) {
+        case 0: /* TEXTIN */
+            for (i = 0; i < len; i++, in64++) {
+                if (fscanf(strm, "%s", buffer) < 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+                *in64 = (H5DT_INT64) HDstrtoll(buffer, NULL, 10);
+            }
+            break;
+
+        case 4: /* IN */
+            for (i = 0; i < len; i++, in64++) {
+                if (HDfread((char *) in64, sizeof(H5DT_INT64), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+#endif /* ifdef H5_SIZEOF_LONG_LONG */
+
+    default:
+        (void) HDfprintf(stderr, "%s", err3);
+        break;
+    }
+    return (0);
+}
+
+static int readUIntegerData(FILE *strm, struct Input *in)
+{
+    H5DT_UINT8  *in08;
+    H5DT_UINT16 *in16;
+    H5DT_UINT16  temp;
+    H5DT_UINT32 *in32;
+#ifdef H5_SIZEOF_LONG_LONG
+    H5DT_UINT64 *in64;
+    char        buffer[256];
+#endif
+    hsize_t     len = 1;
+    hsize_t     i;
+    int         j;
+    const char *err1 = "Unable to get unsigned integer value from file.\n";
+    const char *err2 = "Unrecognized input class type.\n";
+    const char *err3 = "Invalid input size.\n";
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 8:
+        switch (in->inputClass) {
+        case 6: /* TEXTUIN */
+            in08 = (H5DT_UINT8 *) in->data;
+            for (i = 0; i < len; i++, in08++) {
+                if (fscanf(strm, "%hu", &temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+                (*in08) = (H5DT_UINT8) temp;
+            }
+            break;
+
+        case 7: /* UIN */
+            in08 = (H5DT_UINT8 *) in->data;
+            for (i = 0; i < len; i++, in08++) {
+                if (HDfread((char *) in08, sizeof(H5DT_UINT8), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 16:
+        in16 = (H5DT_UINT16 *) in->data;
+        switch (in->inputClass) {
+        case 6: /* TEXTUIN */
+            for (i = 0; i < len; i++, in16++) {
+                if (fscanf(strm, "%hu", in16) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        case 7: /* UIN */
+            for (i = 0; i < len; i++, in16++) {
+                if (HDfread((char *) in16, sizeof(H5DT_UINT16), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 32:
+        in32 = (H5DT_UINT32 *) in->data;
+        switch (in->inputClass) {
+        case 6: /* TEXTUIN */
+            for (i = 0; i < len; i++, in32++) {
+                if (fscanf(strm, "%u", in32) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        case 7: /* UIN */
+            for (i = 0; i < len; i++, in32++) {
+                if (HDfread((char *) in32, sizeof(H5DT_UINT32), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+#ifdef H5_SIZEOF_LONG_LONG
+    case 64:
+        in64 = (H5DT_UINT64 *) in->data;
+        switch (in->inputClass) {
+        case 6: /* TEXTUIN */
+            for (i = 0; i < len; i++, in64++) {
+                if (fscanf(strm, "%s", buffer) < 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+                *in64 = (H5DT_UINT64) HDstrtoll(buffer, NULL, 10);
+            }
+            break;
+
+        case 7: /* UIN */
+            for (i = 0; i < len; i++, in64++) {
+                if (HDfread((char *) in64, sizeof(H5DT_UINT64), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+#endif /* ifdef H5_SIZEOF_LONG_LONG */
+
+    default:
+        (void) HDfprintf(stderr, "%s", err3);
+        break;
+    }
+    return (0);
+}
+
+static int readFloatData(FILE *strm, struct Input *in)
+{
+    H5DT_FLOAT32 *fp32;
+    H5DT_FLOAT64 *fp64;
+
+    hsize_t     len = 1;
+    hsize_t     i;
+    int         j;
+    const char *err1 = "Unable to get integer value from file.\n";
+    const char *err2 = "Unrecognized input class type.\n";
+    const char *err3 = "Invalid input size type.\n";
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 32:
+        fp32 = (H5DT_FLOAT32 *) in->data;
+        switch (in->inputClass) {
+        case 1: /* TEXTFP */
+            for (i = 0; i < len; i++, fp32++) {
+                if (fscanf(strm, "%f", fp32) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+
+            fp32 = (H5DT_FLOAT32 *) in->data;
+            break;
+
+            /* same as TEXTFP */
+        case 2: /*TEXTFPE */
+
+            for (i = 0; i < len; i++, fp32++) {
+                if (fscanf(strm, "%f", fp32) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+
+            fp32 = (H5DT_FLOAT32 *) in->data;
+            break;
+
+        case 3: /* FP */
+            for (i = 0; i < len; i++, fp32++) {
+                if (HDfread((char *) fp32, sizeof(H5DT_FLOAT32), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 64:
+        fp64 = (H5DT_FLOAT64 *) in->data;
+        switch (in->inputClass) {
+        case 1: /* TEXTFP */
+            for (i = 0; i < len; i++, fp64++) {
+                if (fscanf(strm, "%lf", fp64) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+
+            fp64 = (H5DT_FLOAT64 *) in->data;
+            break;
+
+            /* same as TEXTFP */
+        case 2: /*TEXTFPE */
+
+            for (i = 0; i < len; i++, fp64++) {
+                if (fscanf(strm, "%lf", fp64) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+
+            fp64 = (H5DT_FLOAT64 *) in->data;
+            break;
+
+        case 3: /* FP */
+            for (i = 0; i < len; i++, fp64++) {
+                if (HDfread((char *) fp64, sizeof(H5DT_FLOAT64), 1, strm) != 1) {
+                    (void) HDfprintf(stderr, "%s", err1);
+                    return (-1);
+                }
+            }
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err3);
+        break;
+    }
+    return (0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: processStrData
+ *
+ * Purpose: read an ASCII file with string data and generate an HDF5 dataset
+ *  with a variable length type
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at hdfgroup.org
+ *
+ * Date: July, 26, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int processStrData(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;
+    hsize_t dims[1];
+    char    str[1024];
+    int     c;
+    int     i = 0;
+    int     j;
+    hsize_t nlines = 0;
+    hsize_t line;
+
+    /*-------------------------------------------------------------------------
+     * get number of lines in the input file
+     *-------------------------------------------------------------------------
+     */
+
+    while(EOF != (c = HDfgetc(strm)))
+        if (c == 10)    /* eol */
+            nlines++;
+
+    if (!nlines)
+        return 0;
+
+    /* number of records */
+    dims[0] = nlines;
+
+    /* rewind */
+    HDfseek(strm, 0L, 0);
+
+    /*-------------------------------------------------------------------------
+     * read file again and generate an HDF5 dataset
+     *-------------------------------------------------------------------------
+     */
+
+    if ((type_id = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+
+    if (H5Tset_size(type_id, H5T_VARIABLE) < 0)
+        goto out;
+
+    /* disable error reporting */
+    H5E_BEGIN_TRY 
+    {
+        /* create parent groups */
+        if (in->path.count > 1) {
+            j = 0;
+            handle = file_id;
+            while (j < in->path.count - 1) {
+                if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
+                    group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                    for (; j < in->path.count - 1; j++)
+                        group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                    handle = group_id;
+                    break;
+                }
+                handle = group_id;
+                j++;
+            }
+        }
+        else {
+            handle = file_id;
+            j = 0;
+        }
+
+        /*enable error reporting */
+    }
+    H5E_END_TRY;
+
+    if ((space_id = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+
+    if ((mspace_id = H5Screate(H5S_SCALAR)) < 0)
+        goto out;
+
+    if ((dset_id = H5Dcreate2(handle, in->path.group[j], type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    line = 0;
+
+    while(EOF != (c = HDfgetc(strm))) {
+        str[i] = (char)c;
+
+        i++;
+
+        if (c == 10) { /* eol */
+            char *str2 = str;
+            hid_t fspace_id;
+            hsize_t start[1];
+            hsize_t count[1] = { 1 };
+
+            str[i - 1] = '\0'; /* terminate string */
+
+            if ((fspace_id = H5Dget_space(dset_id)) < 0)
+                goto out;
+
+            start[0] = line++;
+
+            if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+                goto out;
+
+            if (H5Dwrite(dset_id, type_id, mspace_id, fspace_id, H5P_DEFAULT, &str2) < 0)
+                goto out;
+
+            if (H5Sclose(fspace_id) < 0)
+                goto out;
+
+            i = 0;
+            str[0] = '\0';
+
+        }
+    }
+
+    /* close */
+    H5Dclose(dset_id);
+    H5Sclose(space_id);
+    H5Sclose(mspace_id);
+    H5Tclose(type_id);
+
+    return (0);
+
+out:
+
+    return (-1);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: processStrData
+ *
+ * Purpose: read an ASCII file with string data and generate an HDF5 dataset
+ *  with a variable length type
+ *
+ * Return: 0, ok, -1 no
+ *
+ *-------------------------------------------------------------------------
+ */
+static int processStrHDFData(FILE *strm, struct Input *in, hid_t file_id)
+{
+    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;
+
+    /*-------------------------------------------------------------------------
+     * read file and generate an HDF5 dataset
+     *-------------------------------------------------------------------------
+     */
+#ifdef H5DEBUGIMPORT
+    printf("processStrHDFData DATATYPE STRING\n");
+#endif
+
+    if ((type_id = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+
+    if (H5Tset_size(type_id, H5T_VARIABLE) < 0)
+        goto out;
+
+    /* disable error reporting */
+    H5E_BEGIN_TRY
+    {
+        /* create parent groups */
+        if (in->path.count > 1) {
+            j = 0;
+            handle = file_id;
+            while (j < in->path.count - 1) {
+                if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
+                    group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                    for (; j < in->path.count - 1; j++)
+                        group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                    handle = group_id;
+                    break;
+                }
+                handle = group_id;
+                j++;
+            }
+        }
+        else {
+            handle = file_id;
+            j = 0;
+        }
+
+        /*enable error reporting */
+    }
+    H5E_END_TRY;
+#ifdef H5DEBUGIMPORT
+    printf("processStrHDFData DATATYPE STRING groups created\n");
+#endif
+
+    if ((space_id = H5Screate_simple(in->rank, in->sizeOfDimension, NULL)) < 0)
+        goto out;
+
+    if ((mspace_id = H5Screate(H5S_SCALAR)) < 0)
+        goto out;
+
+    if ((dset_id = H5Dcreate2(handle, in->path.group[j], type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+#ifdef H5DEBUGIMPORT
+    printf("processStrHDFData DATATYPE STRING ready to process strings\n");
+#endif
+    line = 0;
+    j = 0;
+
+    while (HDfgets(str,sizeof(str),strm)) {
+        str1 = str;
+        str2 = NULL;
+        str3 = NULL;
+#ifdef H5DEBUGIMPORT
+            printf("processStrHDFData DATATYPE STRING[%llu]={%s}\n", (unsigned long long)line, str1);
+#endif
+            /* process string to remove the first and last quote char */
+            str2 = strchr(str1, '"');
+            if (str2 != NULL) {
+#ifdef H5DEBUGIMPORT
+                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
+#endif
+                str2++;
+#ifdef H5DEBUGIMPORT
+                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
+#endif
+                str3 = strrchr(str2, '"');
+                if (str3 != NULL) {
+#ifdef H5DEBUGIMPORT
+                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str3), str3);
+#endif
+                    *str3 = '\0';
+
+#ifdef H5DEBUGIMPORT
+                    printf("processStrHDFData DATATYPE STRING len:%d for {%s}\n", strlen(str2), str2);
+#endif
+
+                    if(strlen(str2) > 0) {
+                        hid_t fspace_id;
+                        hsize_t start[1];
+                        hsize_t count[1] = { 1 };
+
+#ifdef H5DEBUGIMPORT
+                        printf("processStrHDFData DATATYPE STRING[%llu] store %s\n", (unsigned long long)line, str2);
+#endif
+                        if ((fspace_id = H5Dget_space(dset_id)) < 0)
+                            goto out;
+
+                        start[0] = line++;
+
+                        if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+                            goto out;
+
+                        if (H5Dwrite(dset_id, type_id, mspace_id, fspace_id, H5P_DEFAULT, &str2) < 0)
+                            goto out;
+
+                        if (H5Sclose(fspace_id) < 0)
+                            goto out;
+                    }
+                }
+            }
+        str[0] = '\0';
+        j++;
+    }
+#ifdef H5DEBUGIMPORT
+    printf("processStrHDFData DATATYPE STRING eof reached\n");
+#endif
+
+    /* close */
+    H5Dclose(dset_id);
+    H5Sclose(space_id);
+    H5Sclose(mspace_id);
+    H5Tclose(type_id);
+
+    return (0);
+
+out:
+#ifdef H5DEBUGIMPORT
+    printf("processStrHDFData DATATYPE STRING error exit\n");
+#endif
+/* disable error reporting */
+H5E_BEGIN_TRY
+{
+    /* close */
+    H5Dclose(dset_id);
+    H5Sclose(space_id);
+    H5Sclose(mspace_id);
+    H5Tclose(type_id);
+}
+H5E_END_TRY;
+
+    return (-1);
+}
+
+static int allocateIntegerStorage(struct Input *in)
+{
+    hsize_t     len = 1;
+    int         j;
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "Invalid storage size for integer input data.\n";
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 8:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT8))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 16:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT16))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 32:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT32))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 64:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_INT64))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err2);
+        break;
+    }
+    return (0);
+}
+
+static int allocateUIntegerStorage(struct Input *in)
+{
+    hsize_t     len = 1;
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "Invalid storage size for unsigned integer input data.\n";
+    int         j;
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 8:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT8))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 16:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT16))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 32:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT32))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 64:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_UINT64))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err2);
+        break;
+    }
+    return (0);
+}
+
+static int allocateFloatStorage(struct Input *in)
+{
+    hsize_t     len = 1;
+    int         j;
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "Invalid storage size for float input data.\n";
+
+    for (j = 0; j < in->rank; j++)
+        len *= in->sizeOfDimension[j];
+
+    switch (in->inputSize) {
+    case 32:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_FLOAT32))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    case 64:
+        if ((in->data = (VOIDP) HDmalloc((size_t) len * sizeof(H5DT_FLOAT64))) == NULL) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err2);
+        break;
+    }
+    return (0);
+}
+
+static int processConfigurationFile(char *infile, struct Input *in)
+{
+    FILE       *strm = NULL;
+    char        key[255];
+    int         kindex;
+    char        temp[255];
+    int         ival;
+    int         scanret;
+    int         retval = -1;
+
+    const char *err1 = "Unable to open the configuration file:  %s for reading.\n";
+    const char *err2 = "Unknown keyword in configuration file: %s\n";
+    const char *err3a = "PATH keyword appears twice in %s.\n";
+    const char *err3b = "Error in parsing the path information from %s.\n";
+    const char *err4a = "INPUT-CLASS keyword appears twice in %s.\n";
+    const char *err4b = "Error in retrieving the input class from %s.\n";
+    const char *err5a = "INPUT-SIZE keyword appears twice in %s.\n";
+    const char *err5b = "Error in retrieving the input size from %s.\n";
+    const char *err6a = "RANK keyword appears twice in %s.\n";
+    const char *err6b = "Error in retrieving the rank from %s.\n";
+    const char *err7a = "DIMENSION-SIZES keyword appears twice in %s.\n";
+    const char *err7b = "DIMENSION-SIZES cannot appear before RANK is provided.\n";
+    const char *err7c = "Error in retrieving the dimension sizes from %s.\n";
+    const char *err8a = "OUTPUT-CLASS keyword appears twice in %s.\n";
+    const char *err8b = "Error in retrieving the output class from %s.\n";
+    const char *err9a = "OUTPUT-SIZE keyword appears twice in %s.\n";
+    const char *err9b = "Error in retrieving the output size from %s.\n";
+    const char *err10a = "OUTPUT-ARCHITECTURE keyword appears twice in %s.\n";
+    const char *err10b = "Error in retrieving the output architecture from %s.\n";
+    const char *err11a = "OUTPUT-BYTE-ORDER keyword appears twice in %s.\n";
+    const char *err11b = "Error in retrieving the output byte order from %s.\n";
+    const char *err12a = "CHUNKED-DIMENSION-SIZES keyword appears twice in %s.\n";
+    const char *err12b = "CHUNKED-DIMENSION-SIZES cannot appear before DIMENSION-SIZES are provided.\n";
+    const char *err12c = "Error in retrieving the chunked dimension sizes from %s.\n";
+    const char *err13a = "COMPRESSION-TYPE keyword appears twice in %s.\n";
+    const char *err13b = "Error in retrieving the compression type from %s.\n";
+    const char *err14a = "COMPRESSION-PARAM keyword appears twice in %s.\n";
+    const char *err14b = "Error in retrieving the compression parameter from %s.\n";
+    const char *err15a = "EXTERNAL-STORAGE keyword appears twice in %s.\n";
+    const char *err15b = "Error in retrieving the external storage paramters from %s.\n";
+    const char *err16a = "MAXIMUM-DIMENSIONS keyword appears twice in %s.\n";
+    const char *err16b = "MAXIMUM-DIMENSIONS cannot appear before DIMENSION-SIZES are provided.\n";
+    const char *err16c = "Error in retrieving the maximum dimension sizes from %s.\n";
+    const char *err17 = "Configuration parameters are invalid in %s.\n";
+    const char *err18 = "Unable to get string value.\n";
+    const char *err19 = "Unable to get integer value.\n";
+
+    /* create vector to map which keywords have been found
+     check vector after each keyword to check for violation
+     at the end check vector to see if required fields have been provided
+     process the output file according to the options
+     */
+
+    if ((strm = HDfopen(infile, "r")) == NULL) {
+        (void) HDfprintf(stderr, err1, infile);
+        goto error;
+    }
+
+    scanret = fscanf(strm, "%s", key);
+    if((scanret == 1) && !HDstrcmp("HDF5", key)) {
+#ifdef H5DEBUGIMPORT
+        int pndx;
+        printf("\nh5dump file\n");
+#endif
+        in->h5dumpInput = 1;
+        scanret = fscanf(strm, "%s", temp); /* filename */
+        scanret = fscanf(strm, "%s", temp); /* start bracket */
+        scanret = fscanf(strm, "%s", key); /* DATASET */
+        while (scanret == 1) {
+            if(!HDstrcmp("DATASET", key)) { /* PATH */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATASET key\n");
+#endif
+                if (in->configOptionVector[PATH] == 1) {
+                    (void) HDfprintf(stderr, err3a, infile);
+                    goto error;
+                }
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATASET %s found\n", temp);
+#endif
+                if (parsePathInfo(&in->path, temp) == -1) {
+                    (void) HDfprintf(stderr, err3b, infile);
+                    goto error;
+                }
+                in->configOptionVector[PATH] = 1;
+                scanret = fscanf(strm, "%s", temp); /* start bracket */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATASET %s found\n", temp);
+#endif
+            } /* if(!HDstrcmp("DATASET", key))  PATH */
+            else if(!HDstrcmp("DATATYPE", key)) { /* INPUT-CLASS */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATATYPE key\n");
+#endif
+                if (in->configOptionVector[INPUT_CLASS] == 1) {
+                    (void) HDfprintf(stderr, err4a, infile);
+                    goto error;
+                }
+
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATATYPE %s found\n", temp);
+#endif
+                if ((kindex = getInputClassType(in, temp)) == -1) {
+                    (void) HDfprintf(stderr, err4b, infile);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATATYPE type %d inputClass\n", in->inputClass);
+#endif
+
+                in->configOptionVector[INPUT_CLASS] = 1;
+
+                /*set default value for output-class */
+                if (in->configOptionVector[OUTPUT_CLASS] == 0) {
+                    if (in->inputClass == 0 || in->inputClass == 4)
+                        in->outputClass = 0;
+                    if (in->inputClass == 1 || in->inputClass == 2
+                            || in->inputClass == 3)
+                        in->outputClass = 1;
+                    if (in->inputClass == 6 || in->inputClass == 7)
+                        in->outputClass = 2;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATATYPE type %d outputClass\n", in->outputClass);
+#endif
+
+                if(in->inputClass == 5) { /* STRING */
+                    int get_next_prop = 1;
+                    in->outputClass = -1;
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATATYPE STRING found\n");
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATATYPE STRING %s found\n", temp);
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* string properties */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+                    while (get_next_prop) {
+                        if(!HDstrcmp("STRSIZE", temp)) { /* STRSIZE */
+                            if (fscanf(strm, "%s", temp) != 1) {
+                                (void) HDfprintf(stderr, "%s", err19);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATATYPE STRING STRSIZE %s found\n", temp);
+#endif
+                            if (HDstrcmp("H5T_VARIABLE;", temp)) {
+                                char *more = temp;
+                                ival = (int)HDstrtol(more, &more, 10);
+                                if (getInputSize(in, ival) == -1) {
+                                    (void) HDfprintf(stderr, err5b, infile);
+                                    goto error;
+                                }
+#ifdef H5DEBUGIMPORT
+                                printf("h5dump DATATYPE STRING %d InputSize\n", in->inputSize);
+#endif
+                            }
+                        }
+                        else if(!HDstrcmp("STRPAD", temp)) { /* STRPAD */
+                            if (fscanf(strm, "%s", temp) != 1) { /* STRPAD type */
+                                (void) HDfprintf(stderr, "%s", err18);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATATYPE STRING STRPAD %s found\n", temp);
+#endif
+                        }
+                        else if(!HDstrcmp("CSET", key)) { /* CSET */
+                            if (fscanf(strm, "%s", temp) != 1) { /* CSET type */
+                                (void) HDfprintf(stderr, "%s", err18);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATATYPE STRING CSET %s found\n", temp);
+#endif
+
+                        }
+                        else if(!HDstrcmp("CTYPE", temp)) { /* CTYPE */
+                            if (fscanf(strm, "%s", temp) != 1) { /* CTYPE type */
+                                (void) HDfprintf(stderr, "%s", err18);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATATYPE STRING  CTYPE %s found\n", temp);
+#endif
+                        } /* if(!HDstrcmp("CSET", key)) */
+                        if (fscanf(strm, "%s", temp) != 1) {
+                            (void) HDfprintf(stderr, "%s", err18);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATATYPE STRING %s found\n", temp);
+#endif
+                        if(!HDstrcmp("}", temp)) { /* end bracket */
+                            get_next_prop = 0;
+                        }
+                    } /* while (get_next_prop) */
+                } /* if(kindex == 5)  STRING */
+             } /* else if(!HDstrcmp("DATATYPE", key))  INPUT-CLASS */
+            else if(!HDstrcmp("DATASPACE", key)) { /* RANK and DIMENSIONS */
+                hsize_t     temp_dims[MAX_NUM_DIMENSION];
+
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATASPACE key\n");
+#endif
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+                if(!HDstrcmp("SCALAR", temp)) { /* SCALAR */
+                    in->rank = 0;
+                } /* if(!HDstrcmp("SCALAR", key)) */
+                else if(!HDstrcmp("NULL", temp)) { /* NULL */
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                } /* else if(!HDstrcmp("NULL", key)) */
+                else if(!HDstrcmp("SIMPLE", temp)) { /* SIMPLE */
+                    int icount = 0;
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATASPACE SIMPLE found\n");
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
+                        (void) HDfprintf(stderr, err6b, infile);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* start paren */
+                        (void) HDfprintf(stderr, err6b, infile);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                    if(!HDstrcmp("(", temp)) { /* start paren */
+                        int get_next_dim = 1;
+                        int i = 0;
+
+                        if (fscanf(strm, "%s", temp) != 1) { /* Dimension with optional comma */
+                            (void) HDfprintf(stderr, err16c, infile);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                        while (get_next_dim) {
+                            char *more = temp;
+                            temp_dims[icount] = HDstrtoull(more, &more, 10);
+                            if (fscanf(strm, "%s", temp) != 1) { /* Dimension or end paren */
+                                (void) HDfprintf(stderr, err6b, infile);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                            if(!HDstrcmp(")", temp)) { /* end paren */
+                                in->rank = ++icount;
+                                in->configOptionVector[RANK] = 1;
+                                get_next_dim = 0;
+                            }
+                            else { /* Dimension */
+                                icount++;
+                                if (icount > MAX_NUM_DIMENSION) {
+                                    (void) HDfprintf(stderr, "Invalid value for rank.\n");
+                                    goto error;
+                                }
+                            }
+                        } /* while (get_next_dim) */
+
+                        if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATASPACE SIMPLE %d rank\n", in->rank);
+#endif
+                        for (i = 0; i < in->rank; i++) {
+                            in->sizeOfDimension[i] = temp_dims[i];
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATASPACE SIMPLE dims:", in->rank);
+                        for (pndx = 0; pndx < in->rank; pndx++) {
+                            printf(" %d", in->sizeOfDimension[pndx]);
+                        }
+                        printf("\n");
+#endif
+                        in->configOptionVector[DIM] = 1;
+                    } /* if(!HDstrcmp("(", key))  start paren */
+                    else {
+                        (void) HDfprintf(stderr, err5b, infile);
+                        goto error;
+                    }
+                    if (fscanf(strm, "%s", temp) != 1) {
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                    if(!HDstrcmp("/", temp)) { /* / max dims */
+                        if ((in->maxsizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+                            goto error;
+                        }
+                        if (fscanf(strm, "%s", temp) != 1) { /* start paren */
+                            (void) HDfprintf(stderr, err6b, infile);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                        if(!HDstrcmp("(", temp)) { /* start paren */
+                            int get_next_dim = 1;
+                            int i = 0;
+
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATASPACE SIMPLE process max dim values\n");
+#endif
+                            if (fscanf(strm, "%s", temp) != 1) { /* max dim with optional comma */
+                                (void) HDfprintf(stderr, err16c, infile);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                            while (get_next_dim) {
+#ifdef H5DEBUGIMPORT
+                                printf("h5dump DATASPACE SIMPLE get max dim value\n");
+#endif
+                                if(!HDstrcmp("H5S_UNLIMITED", temp) || !HDstrcmp("H5S_UNLIMITED,", temp)) { /* unlimited */
+                                    in->maxsizeOfDimension[i] = H5S_UNLIMITED;
+                                    in->configOptionVector[EXTEND] = 1;
+                                }
+                                else {
+                                    char *more = temp;
+                                    in->maxsizeOfDimension[i] = HDstrtoull(more, &more, 10);
+                                }
+                                if (fscanf(strm, "%s", temp) != 1) { /* max dim or end paren */
+                                    (void) HDfprintf(stderr, err16c, infile);
+                                    goto error;
+                                }
+#ifdef H5DEBUGIMPORT
+                                printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                                if(!HDstrcmp(")", temp)) { /* end paren */
+                                    get_next_dim = 0;
+                                }
+                                else { /* comma */
+                                    i++;
+                                    if (i > MAX_NUM_DIMENSION) {
+                                        (void) HDfprintf(stderr, "Invalid value for rank.\n");
+                                        goto error;
+                                    }
+                                }
+                            } /* while (get_next_dim) */
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump DATASPACE SIMPLE maxdims:", in->rank);
+                            for (pndx = 0; pndx < in->rank; pndx++) {
+                                printf(" %d", in->maxsizeOfDimension[pndx]);
+                            }
+                            printf("\n");
+                            printf("h5dump DATASPACE SIMPLE get max dim finished\n");
+#endif
+                        } /* if(!HDstrcmp("(", key))  start paren */
+                        else {
+                            (void) HDfprintf(stderr, err16c, infile);
+                            goto error;
+                        }
+                        scanret = fscanf(strm, "%s", temp); /* end bracket */
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump DATASPACE SIMPLE %s found\n", temp);
+#endif
+                    } /* if(!HDstrcmp("/", key)) max dims separator */
+                } /* else if(!HDstrcmp("SIMPLE", key)) */
+                else {
+                    (void) HDfprintf(stderr, err5b, infile);
+                    goto error;
+                }
+            } /* else if(!HDstrcmp("DATASPACE", key))  RANK and DIMENSIONS */
+            else if(!HDstrcmp("STORAGE_LAYOUT", key)) { /* CHUNKED-DIMENSION-SIZES */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump STORAGE_LAYOUT key\n");
+#endif
+                if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump STORAGE_LAYOUT %s found\n", temp);
+#endif
+                if (fscanf(strm, "%s", temp) != 1) { /* CHUNKED */
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump STORAGE_LAYOUT %s found\n", temp);
+#endif
+                if(!HDstrcmp("CHUNKED", temp)) { /* CHUNKED */
+                    if ((in->sizeOfChunk = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+                        (void) HDfprintf(stderr, "Unable to allocate dynamic memory.\n");
+                        goto error;
+                    }
+                    if (fscanf(strm, "%s", temp) != 1) { /* start paren */
+                        (void) HDfprintf(stderr, err6b, infile);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
+#endif
+                    if(!HDstrcmp("(", temp)) { /* start paren */
+                        int get_next_dim = 1;
+                        int icount = 0;
+
+                        if (fscanf(strm, "%s", temp) != 1) { /* Dimension with optional comma */
+                            (void) HDfprintf(stderr, err16c, infile);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
+#endif
+                        while (get_next_dim) {
+                            char *more = temp;
+                            in->sizeOfChunk[icount] = HDstrtoull(more, &more, 10);
+                            if (fscanf(strm, "%s", temp) != 1) { /* Dimension or end paren */
+                                (void) HDfprintf(stderr, err6b, infile);
+                                goto error;
+                            }
+#ifdef H5DEBUGIMPORT
+                            printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
+#endif
+                            if(!HDstrcmp(")", temp)) { /* end paren */
+                                in->configOptionVector[RANK] = 1;
+                                get_next_dim = 0;
+                            }
+                            else { /* Dimension */
+                                icount++;
+                                if (icount > MAX_NUM_DIMENSION) {
+                                    (void) HDfprintf(stderr, "Invalid value for rank.\n");
+                                    goto error;
+                                }
+                            }
+                        } /* while (get_next_dim) */
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump STORAGE_LAYOUT CHUNKED dims:", in->rank);
+                        for (pndx = 0; pndx < in->rank; pndx++) {
+                            printf(" %d", in->sizeOfChunk[pndx]);
+                        }
+                        printf("\n");
+#endif
+                        in->configOptionVector[DIM] = 1;
+                    } /* if(!HDstrcmp("(", key))  start paren */
+                    else {
+                        (void) HDfprintf(stderr, err5b, infile);
+                        goto error;
+                    }
+                    if (fscanf(strm, "%s", temp) != 1) { /* SIZE */
+                        (void) HDfprintf(stderr, err6b, infile);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
+#endif
+                    if(!HDstrcmp("SIZE", temp)) { /* SIZE */
+                        if (fscanf(strm, "%d", (&ival)) != 1) {
+                            (void) HDfprintf(stderr, "%s", err19);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump STORAGE_LAYOUT CHUNKED SIZE %d found\n", ival);
+#endif
+                    }
+                    while (HDstrcmp("}", temp)) {
+                        if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
+                            (void) HDfprintf(stderr, "%s", err18);
+                            goto error;
+                        }
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump STORAGE_LAYOUT CHUNKED %s found\n", temp);
+#endif
+                    }
+                    in->configOptionVector[CHUNK] = 1;
+                } /* if(!HDstrcmp("CHUNKED", key))  CHUNKED */
+            } /* else if(!HDstrcmp("STORAGE_LAYOUT", key))  CHUNKED-DIMENSION-SIZES */
+            else if(!HDstrcmp("FILTERS", key)) { /* FILTERS */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump FILTERS key\n");
+#endif
+                if (fscanf(strm, "%s", temp) != 1) { /* start bracket */
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump FILTERS %s found\n", temp);
+#endif
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump FILTERS %s found\n", temp);
+#endif
+                if(!HDstrcmp("COMPRESSION", temp)) { /* COMPRESSION */
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION found\n");
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* DEFLATE */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* bgin bracket */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
+#endif
+                    if (fscanf(strm, "%s", temp) != 1) { /* LEVEL */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
+#endif
+                    if (fscanf(strm, "%d", (&ival)) != 1) {
+                        (void) HDfprintf(stderr, "%s", err19);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION LEVEL %d found\n", ival);
+#endif
+                    in->compressionParam = ival;
+                    if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
+                        (void) HDfprintf(stderr, "%s", err18);
+                        goto error;
+                    }
+#ifdef H5DEBUGIMPORT
+                    printf("h5dump FILTERS COMPRESSION %s found\n", temp);
+#endif
+                    in->compressionType = 0; /* ONLY GZIP supported */
+                    in->configOptionVector[COMPRESS] = 1;
+                }
+                else if(!HDstrcmp("CONTIGUOUS", temp)) { /* CONTIGUOUS */
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump FILTERS CONTIGUOUS found\n");
+#endif
+                    in->configOptionVector[COMPRESS] = 0;
+                }
+                else if(!HDstrcmp("NONE", temp)) { /* NONE */
+#ifdef H5DEBUGIMPORT
+                        printf("h5dump FILTERS NONE found\n");
+#endif
+                    in->configOptionVector[COMPRESS] = 0;
+                }
+                if (fscanf(strm, "%s", temp) != 1) { /* end bracket */
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+#ifdef H5DEBUGIMPORT
+                printf("h5dump FILTERS %s found\n", temp);
+#endif
+            }
+            else if(!HDstrcmp("DATA", key)) { /* FINSHED */
+#ifdef H5DEBUGIMPORT
+                printf("h5dump DATA key\n");
+#endif
+                scanret = 0;
+                break;
+            }
+            scanret = fscanf(strm, "%s", key);
+        }
+#ifdef H5DEBUGIMPORT
+        printf("h5dump path");
+        for (pndx = 0; pndx < in->path.count; pndx++) {
+            printf(" : %s", in->path.group[pndx]);
+        }
+        printf("\n");
+        printf("h5dump inputClass=%d\n", in->inputClass);
+        printf("h5dump inputSize=%d\n", in->inputSize);
+        printf("h5dump rank=%d\n", in->rank);
+        printf("h5dump outputClass=%d\n", in->outputClass);
+        printf("h5dump outputSize=%d\n", in->outputSize);
+        printf("h5dump outputArchitecture=%d\n", in->outputArchitecture);
+        printf("h5dump outputByteOrder=%d\n", in->outputByteOrder);
+        printf("h5dump compressionType=%d\n", in->compressionType);
+        printf("h5dump compressionParam=%d\n", in->compressionParam);
+        printf("h5dump externFilename=%s\n", in->externFilename);
+        printf("h5dump configOptionVector:\n");
+        for (pndx = 0; pndx < NUM_KEYS; pndx++) {
+            printf("    %s=%d\n", keytable[pndx], in->configOptionVector[pndx]);
+        }
+#endif
+    }
+    else {
+        while (scanret == 1) {
+            if ((kindex = mapKeywordToIndex(key)) == -1) {
+                (void) HDfprintf(stderr, err2, infile);
+                goto error;
+            }
+            switch (kindex) {
+            case 0: /* PATH */
+                if (in->configOptionVector[PATH] == 1) {
+                    (void) HDfprintf(stderr, err3a, infile);
+                    goto error;
+                }
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+                if (parsePathInfo(&in->path, temp) == -1) {
+                    (void) HDfprintf(stderr, err3b, infile);
+                    goto error;
+                }
+                in->configOptionVector[PATH] = 1;
+                break;
+
+            case 1: /* INPUT-CLASS */
+                if (in->configOptionVector[INPUT_CLASS] == 1) {
+                    (void) HDfprintf(stderr, err4a, infile);
+                    goto error;
+                }
+
+                if (fscanf(strm, "%s", temp) != 1) {
+                    (void) HDfprintf(stderr, "%s", err18);
+                    goto error;
+                }
+                if (getInputClass(in, temp) == -1) {
+                    (void) HDfprintf(stderr, err4b, infile);
+                    goto error;
+                }
+
+                in->configOptionVector[INPUT_CLASS] = 1;
+
+                /*set default value for output-class */
+                if (in->configOptionVector[OUTPUT_CLASS] == 0) {
+                    if (in->inputClass == 0 || in->inputClass == 4)
+                        in->outputClass = 0;
+                    if (in->inputClass == 1 || in->inputClass == 2
+                            || in->inputClass == 3)
+                        in->outputClass = 1;
+                    if (in->inputClass == 6 || in->inputClass == 7)
+                        in->outputClass = 2;
+                }
+                break;
+
+            case 2: /* INPUT-SIZE */
+                if (in->configOptionVector[INPUT_SIZE] == 1) {
+                    (void) HDfprintf(stderr, err5a, infile);
+                    goto error;
+                }
+                if (fscanf(strm, "%d", (&ival)) != 1) {
+                    (void) HDfprintf(stderr, "%s", err19);
+                    goto error;
+                }
+                if (getInputSize(in, ival) == -1) {
+                    (void) HDfprintf(stderr, err5b, infile);
+                    goto error;
+                }
+                in->configOptionVector[INPUT_SIZE] = 1;
+
+                /*set default value for output-size */
+                if (in->configOptionVector[OUTPUT_SIZE] == 0)
+                    in->outputSize = in->inputSize;
+                break;
+
+            case 3: /* RANK */
+                if (in->configOptionVector[RANK] == 1) {
+                    (void) HDfprintf(stderr, err6a, infile);
+                    goto error;
+                }
+
+                if (getRank(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err6b, infile);
+                    goto error;
+                }
+                in->configOptionVector[RANK] = 1;
+                break;
+
+            case 4: /* DIMENSION-SIZES */
+                if (in->configOptionVector[DIM] == 1) {
+                    (void) HDfprintf(stderr, err7a, infile);
+                    goto error;
+                }
+
+                if (in->configOptionVector[RANK] == 0) {
+                    (void) HDfprintf(stderr, err7b, infile);
+                    goto error;
+                }
+                if (getDimensionSizes(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err7c, infile);
+                    goto error;
+                }
+                in->configOptionVector[DIM] = 1;
+                break;
+
+            case 5: /* OUTPUT-CLASS */
+                if (in->configOptionVector[OUTPUT_CLASS] == 1) {
+                    (void) HDfprintf(stderr, err8a, infile);
+                    goto error;
+                }
+
+                if (getOutputClass(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err8b, infile);
+                    goto error;
+                }
+                in->configOptionVector[OUTPUT_CLASS] = 1;
+                break;
+
+            case 6: /* OUTPUT-SIZE */
+                if (in->configOptionVector[OUTPUT_SIZE] == 1) {
+                    (void) HDfprintf(stderr, err9a, infile);
+                    goto error;
+                }
+
+                if (getOutputSize(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err9b, infile);
+                    goto error;
+                }
+                in->configOptionVector[OUTPUT_SIZE] = 1;
+                break;
+
+            case 7: /* OUTPUT-ARCHITECTURE */
+                if (in->configOptionVector[OUTPUT_ARCH] == 1) {
+                    (void) HDfprintf(stderr, err10a, infile);
+                    goto error;
+                }
+
+                if (getOutputArchitecture(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err10b, infile);
+                    goto error;
+                }
+                in->configOptionVector[OUTPUT_ARCH] = 1;
+                break;
+
+            case 8: /* OUTPUT-BYTE-ORDER */
+                if (in->configOptionVector[OUTPUT_B_ORDER] == 1) {
+                    (void) HDfprintf(stderr, err11a, infile);
+                    goto error;
+                }
+
+                if (getOutputByteOrder(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err11b, infile);
+                    goto error;
+                }
+                in->configOptionVector[OUTPUT_B_ORDER] = 1;
+                break;
+
+            case 9: /* CHUNKED-DIMENSION-SIZES */
+                if (in->configOptionVector[CHUNK] == 1) {
+                    (void) HDfprintf(stderr, err12a, infile);
+                    goto error;
+                }
+                /* cant appear before dimension sizes have been provided */
+                if (in->configOptionVector[DIM] == 0) {
+                    (void) HDfprintf(stderr, err12b, infile);
+                    goto error;
+                }
+
+                if (getChunkedDimensionSizes(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err12c, infile);
+                    goto error;
+                }
+                in->configOptionVector[CHUNK] = 1;
+                break;
+
+            case 10: /* COMPRESSION-TYPE */
+                if (in->configOptionVector[COMPRESS] == 1) {
+                    (void) HDfprintf(stderr, err13a, infile);
+                    goto error;
+                }
+
+                if (getCompressionType(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err13b, infile);
+                    goto error;
+                }
+                in->configOptionVector[COMPRESS] = 1;
+
+                if (in->configOptionVector[COMPRESS_PARAM] == 0) {
+                    if (in->compressionType == 0)
+                        in->compressionParam = 6; /* default value if compressionType is GZIP */
+                }
+                break;
+
+            case 11: /* COMPRESSION-PARAM */
+                if (in->configOptionVector[COMPRESS_PARAM] == 1) {
+                    (void) HDfprintf(stderr, err14a, infile);
+                    goto error;
+                }
+
+                if (getCompressionParameter(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err14b, infile);
+                    goto error;
+                }
+
+                in->configOptionVector[COMPRESS_PARAM] = 1;
+
+                if (in->configOptionVector[COMPRESS] == 0)
+                    in->compressionType = 0;
+
+                break;
+
+            case 12: /* EXTERNAL-STORAGE */
+                if (in->configOptionVector[EXTERNALSTORE] == 1) {
+                    (void) HDfprintf(stderr, err15a, infile);
+                    goto error;
+                }
+
+                if (getExternalFilename(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err15b, infile);
+                    goto error;
+                }
+                in->configOptionVector[EXTERNALSTORE] = 1;
+                break;
+
+            case 13: /* MAXIMUM-DIMENSIONS */
+                if (in->configOptionVector[EXTEND] == 1) {
+                    (void) HDfprintf(stderr, err16a, infile);
+                    goto error;
+                }
+                /* cant appear before dimension sizes have been provided */
+                if (in->configOptionVector[DIM] == 0) {
+                    (void) HDfprintf(stderr, err16b, infile);
+                    goto error;
+                }
+                if (getMaximumDimensionSizes(in, strm) == -1) {
+                    (void) HDfprintf(stderr, err16c, infile);
+                    goto error;
+                }
+                in->configOptionVector[EXTEND] = 1;
+                break;
+
+            default:
+                break;
+            }
+            scanret = fscanf(strm, "%s", key);
+        }
+    }
+
+    /*
+         check if keywords obtained are valid
+         if yes, return 0 else error
+     */
+
+    if (validateConfigurationParameters(in) == -1) {
+        (void) HDfprintf(stderr, err17, infile);
+        goto error;
+    }
+
+    /* Set success return value */
+    retval = 0;
+
+error:
+    if(strm)
+        HDfclose(strm);
+    return(retval);
+}
+
+static int validateConfigurationParameters(struct Input *in)
+{
+    const char *err1 = "One or more of the required fields (RANK, DIMENSION-SIZES) missing.\n";
+    const char *err2 = "Cannot specify chunking or compression or extendible data sets with the external file option.\n";
+    const char *err3 = "Cannot specify the compression or the extendible data sets without the chunking option.\n";
+    const char *err4a = "OUTPUT-ARCHITECTURE cannot be STD if OUTPUT-CLASS is floating point (FP).\n";
+    const char *err4b = "OUTPUT-ARCHITECTURE cannot be IEEE if OUTPUT-CLASS is integer (IN).\n";
+    const char *err5 = "For OUTPUT-CLASS FP, valid values for OUTPUT-SIZE are (32, 64) .\n";
+#ifndef H5_SIZEOF_LONG_LONG
+    const char *err6 = "No support for reading 64-bit integer (INPUT-CLASS: IN, TEXTIN, UIN, TEXTUIN files\n";
+#endif
+
+    /* for class STR other parameters are ignored */
+    if (in->inputClass == 5) /* STR */
+        return (0);
+
+    if ((in->configOptionVector[DIM] != 1) || (in->configOptionVector[RANK] != 1)) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    if (in->configOptionVector[EXTERNALSTORE] == 1) {
+        if ((in->configOptionVector[COMPRESS] == 1) || (in->configOptionVector[CHUNK] == 1) || (in->configOptionVector[EXTEND] == 1)) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+    }
+
+    if ((in->configOptionVector[COMPRESS] == 1) || (in->configOptionVector[EXTEND] == 1)) {
+        if (in->configOptionVector[CHUNK] != 1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+    }
+
+    /* Arch cant be STD if O/p class is FP */
+    if (in->outputArchitecture == 1)
+        if (in->outputClass == 1) {
+            (void) HDfprintf(stderr, "%s", err4a);
+            return (-1);
+        }
+
+    /* Arch cant be IEEE if O/p class is IN */
+    if (in->outputArchitecture == 2)
+        if (in->outputClass == 0) {
+            (void) HDfprintf(stderr, "%s", err4b);
+            return (-1);
+        }
+
+    if (in->outputClass == 1)
+        if (in->outputSize != 32 && in->outputSize != 64) {
+            (void) HDfprintf(stderr, "%s", err5);
+            return (-1);
+        }
+
+#ifndef H5_SIZEOF_LONG_LONG
+    if (in->inputSize == 64 && (in->inputClass == 0 || in->inputClass == 4 || in->inputClass == 6 || in->inputClass == 7) ) {
+        (void) HDfprintf(stderr, "%s", err6);
+        return -1;
+    }
+#endif
+    return (0);
+}
+
+static int mapKeywordToIndex(char *key)
+{
+    int i;
+
+    for (i = 0; i < NUM_KEYS; i++)
+        if (!HDstrcmp(keytable[i], key))
+            return i;
+    return -1;
+}
+
+static int parsePathInfo(struct path_info *path, char *temp)
+{
+    const char  delimiter[] = "/\"";
+    char       *token;
+    int         i = 0;
+    const char *err1 = "Path string larger than MAX_PATH_NAME_LENGTH.\n";
+
+    token = HDstrtok (temp, delimiter);
+    if (HDstrlen(token) >= MAX_PATH_NAME_LENGTH) {
+        (void) HDfprintf(stderr, err1);
+        return (-1);
+    }
+    HDstrcpy(path->group[i++],token);
+
+    while (1) {
+        token = HDstrtok (NULL, delimiter);
+        if (token == NULL)
+            break;
+        if (HDstrlen(token) >= MAX_PATH_NAME_LENGTH) {
+            (void) HDfprintf(stderr, err1);
+            return (-1);
+        }
+        HDstrcpy(path->group[i++],token);
+    }
+    path->count = i;
+    return (0);
+}
+
+static int parseDimensions(struct Input *in, char *strm)
+{
+    const char  delimiter[] = ",";
+    char        temp[255];
+    char       *token;
+    int         i = 0;
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+
+    HDstrncpy(temp, strm, sizeof(temp));
+    temp[sizeof(temp) - 1] = '\0';
+    HDstrtok (temp, delimiter);
+
+    while (1) {
+        token = HDstrtok (NULL, delimiter);
+        if (token == NULL)
+            break;
+        i++;
+    }
+    in->rank = i + 1;
+    if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    i = 0;
+    HDstrncpy(temp, strm, sizeof(temp));
+    temp[sizeof(temp) - 1] = '\0';
+    in->sizeOfDimension[i++]
+            = HDstrtoull(HDstrtok (temp, delimiter), NULL, BASE_10);
+
+    while (1) {
+        token = HDstrtok (NULL, delimiter);
+        if (token == NULL)
+            break;
+        in->sizeOfDimension[i++] = HDstrtoull(token, NULL, BASE_10);
+    }
+    return (0);
+}
+
+static int getOutputClass(struct Input *in, FILE *strm)
+{
+    char        temp[255];
+    int         kindex;
+    const char *err1 = "Unable to get 'string' value.\n";
+    const char *err2 = "Invalid value for output class.\n";
+
+    if (fscanf(strm, "%s", temp) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    if ((kindex = OutputClassStrToInt(temp)) == -1) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    in->outputClass = kindex;
+    return (0);
+}
+
+static int OutputClassStrToInt(char *temp)
+{
+    int     i;
+    char    classKeywordTable[3][15] = { "IN", "FP", "UIN" };
+    for (i = 0; i < 3; i++)
+        if (!HDstrcmp(classKeywordTable[i], temp))
+            return i;
+
+    return -1;
+}
+/* same as getInputSize. But defined separately for extensibility */
+static int getOutputSize(struct Input *in, FILE *strm)
+{
+    int         ival;
+    int         i;
+    int         outputSizeValidValues[4] = { 8, 16, 32, 64 };
+    const char *err1 = "Unable to get integer value.\n";
+    const char *err2 = "Invalid value for output size.\n";
+
+    if (fscanf(strm, "%d", (&ival)) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    for (i = 0; i < 4; i++)
+        if (outputSizeValidValues[i] == ival) {
+            in->outputSize = ival;
+            return (0);
+        }
+    (void) HDfprintf(stderr, "%s", err2);
+    return (-1);
+}
+
+static int getInputClass(struct Input *in, char * temp)
+{
+    int         kindex;
+    const char *err1 = "Invalid value for input class.\n";
+
+    if ((kindex = InputClassStrToInt(temp)) == -1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    in->inputClass = kindex;
+    return (0);
+}
+
+static int getInputClassType(struct Input *in, char * buffer)
+{
+    int         kindex = -1;
+    const char *err1 = "Invalid value for input class.\n";
+    const char *err2 = "Invalid value for output architecture.\n";
+    const char *err3 = "Invalid value for output byte-order.\n";
+
+    if (!HDstrcmp(buffer, "H5T_STD_I8BE")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I8LE")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I16BE")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I16LE")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I32BE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I32LE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I64BE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_I64LE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U8BE")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U8LE")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U16BE")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U16LE")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U32BE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U32LE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U64BE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_U64LE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_SCHAR")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_UCHAR")) {
+        in->inputSize = 8;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_SHORT")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_USHORT")) {
+        in->inputSize = 16;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_INT")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_UINT")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_LONG")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_ULONG")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_LLONG")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 4;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_ULLONG")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 7;
+    }
+    else if (!HDstrcmp(buffer, "H5T_IEEE_F32BE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_IEEE_F32LE")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_IEEE_F64BE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_IEEE_F64LE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("IEEE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_VAX_F32")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_VAX_F64")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_FLOAT")) {
+        in->inputSize = 32;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 3;
+    }
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_DOUBLE")) {
+        in->inputSize = 64;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 3;
+    }
+#if H5_SIZEOF_LONG_DOUBLE !=0
+    else if (!HDstrcmp(buffer, "H5T_NATIVE_LDOUBLE")) {
+        in->inputSize = H5_SIZEOF_LONG_DOUBLE;
+        in->configOptionVector[INPUT_SIZE] = 1;
+
+        if ((kindex = OutputArchStrToInt("NATIVE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        kindex = 3;
+    }
+#endif
+    else if(!HDstrcmp(buffer, "H5T_TIME: not yet implemented")) {
+        kindex = -1;
+    }
+    else if(!HDstrcmp(buffer, "H5T_STRING")) {
+        kindex = 5;
+    }
+    /*    case H5T_BITFIELD: */
+    else if (!HDstrcmp(buffer, "H5T_STD_B8BE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B8LE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B16BE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B16LE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B32BE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B32LE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B64BE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("BE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    else if (!HDstrcmp(buffer, "H5T_STD_B64LE")) {
+
+        if ((kindex = OutputArchStrToInt("STD")) == -1) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->outputArchitecture = kindex;
+
+        if ((kindex = OutputByteOrderStrToInt("LE")) == -1) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+        in->outputByteOrder = kindex;
+
+        kindex = -1;
+    }
+    /*    case H5T_OPAQUE: */
+    else if(!HDstrcmp(buffer, "H5T_OPAQUE")) {
+        kindex = -1;
+    }
+    /*    case H5T_COMPOUND: */
+    else if(!HDstrcmp(buffer, "H5T_COMPOUND")) {
+        kindex = -1;
+    }
+    /*    case H5T_REFERENCE: */
+    else if(!HDstrcmp(buffer, "H5T_REFERENCE")) {
+        kindex = -1;
+    }
+    /*    case H5T_ENUM: */
+    else if(!HDstrcmp(buffer, "H5T_ENUM")) {
+        kindex = -1;
+    }
+    /*    case H5T_VLEN: */
+    else if(!HDstrcmp(buffer, "H5T_VLEN")) {
+        kindex = -1;
+    }
+    /*    case H5T_ARRAY: */
+    else if(!HDstrcmp(buffer, "H5T_ARRAY")) {
+        kindex = -1;
+    }
+
+    if (kindex == -1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    /*set default value for output-size */
+    if (in->configOptionVector[OUTPUT_SIZE] == 0)
+        in->outputSize = in->inputSize;
+#ifdef H5DEBUGIMPORT
+    printf("h5dump DATATYPE STRING %d inputSize\n", in->inputSize);
+    printf("h5dump DATATYPE STRING %d outputSize\n", in->outputSize);
+#endif
+
+    in->inputClass = kindex;
+    return (0);
+}
+
+static int InputClassStrToInt(char *temp)
+{
+    int     i;
+    char    classKeywordTable[8][15] = { "TEXTIN", "TEXTFP", "TEXTFPE", "FP", "IN", "STR", "TEXTUIN", "UIN" };
+    for (i = 0; i < 8; i++)
+        if (!HDstrcmp(classKeywordTable[i], temp))
+            return i;
+    return -1;
+}
+
+/* same as getOutputSize. But defined separately for extensibility */
+static int getInputSize(struct Input *in, int ival)
+{
+    int         i;
+    int         inputSizeValidValues[4] = { 8, 16, 32, 64 };
+    const char *err1 = "Invalid value for input size.\n";
+
+    for (i = 0; i < 4; i++)
+        if (inputSizeValidValues[i] == ival) {
+            in->inputSize = ival;
+            return (0);
+        }
+    (void) HDfprintf(stderr, "%s", err1);
+    return (-1);
+}
+
+static int getRank(struct Input *in, FILE *strm)
+{
+    int         ival;
+
+    const char *err1 = "Unable to get integer value.\n";
+    const char *err2 = "Invalid value for rank.\n";
+
+    if (fscanf(strm, "%d", (&ival)) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+    if (ival >= MIN_NUM_DIMENSION && ival <= MAX_NUM_DIMENSION) {
+        in->rank = ival;
+        return (0);
+    }
+
+    (void) HDfprintf(stderr, "%s", err2);
+    return (-1);
+}
+
+/* same as getChunkedDimensionSizes. But defined separately for extensibility */
+static int getDimensionSizes(struct Input *in, FILE *strm)
+{
+    unsigned long long ullval;
+    int         i = 0;
+
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "No. of dimensions for which dimension sizes provided is not equal to provided rank.\n";
+
+    if ((in->sizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    while (fscanf(strm, "%llu", (&ullval)) == 1)
+        in->sizeOfDimension[i++] = ullval;
+
+    if (in->rank != i) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+    return (0);
+}
+/* same as getDimensionSizes. But defined separately for extensibility */
+static int getChunkedDimensionSizes(struct Input *in, FILE *strm)
+{
+    unsigned long long ullval;
+    int         i = 0;
+
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "No. of dimensions for which chunked dimension sizes provided is not equal to provided rank.\n";
+    const char *err3 = "The CHUNKED-DIMENSION-SIZES cannot exceed the sizes of DIMENSION-SIZES\n";
+
+    if ((in->sizeOfChunk = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    while (fscanf(strm, "%llu", (&ullval)) == 1)
+        in->sizeOfChunk[i++] = ullval;
+
+    if (in->rank != i) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    for (i = 0; i < in->rank; i++)
+        if (in->sizeOfChunk[i] > in->sizeOfDimension[i]) {
+            (void) HDfprintf(stderr, "%s", err3);
+            return (-1);
+        }
+    return (0);
+}
+
+static int getMaximumDimensionSizes(struct Input *in, FILE *strm)
+{
+    long long llval;
+    int         i = 0;
+
+    const char *err1 = "Unable to allocate dynamic memory.\n";
+    const char *err2 = "No. of dimensions for which maximum dimension sizes provided is not equal to provided rank.\n";
+    const char *err3 = "The MAXIMUM-DIMENSIONS cannot be less than the sizes of DIMENSION-SIZES. Exception: can be -1 to indicate unlimited size\n";
+
+    if ((in->maxsizeOfDimension = (hsize_t *) HDmalloc ((size_t) in->rank * sizeof(hsize_t))) == NULL) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    while (fscanf(strm, "%lld", (&llval)) == 1) {
+        if (llval == -1)
+            in->maxsizeOfDimension[i++] = H5S_UNLIMITED;
+        else
+            in->maxsizeOfDimension[i++] = (hsize_t)llval;
+    }
+
+    if (in->rank != i) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    for (i = 0; i < in->rank; i++) {
+        if (in->maxsizeOfDimension[i] != H5S_UNLIMITED)
+            if (in->maxsizeOfDimension[i] < in->sizeOfDimension[i]) {
+                (void) HDfprintf(stderr, "%s", err3);
+                return (-1);
+            }
+    }
+    return (0);
+}
+
+static int getOutputArchitecture(struct Input *in, FILE *strm)
+{
+    char        temp[255];
+    int         kindex;
+    const char *err1 = "Unable to get 'string' value.\n";
+    const char *err2 = "Invalid value for output architecture.\n";
+
+    if (fscanf(strm, "%s", temp) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    if ((kindex = OutputArchStrToInt(temp)) == -1) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    in->outputArchitecture = kindex;
+    return (0);
+}
+
+static int OutputArchStrToInt(const char *temp)
+{
+    int     i;
+    char    outputArchKeywordTable[8][15] = { "NATIVE", "STD", "IEEE", "INTEL",
+            "CRAY", "MIPS", "ALPHA", "UNIX" };
+    for (i = 0; i < 8; i++)
+        if (!HDstrcmp(outputArchKeywordTable[i], temp))
+            return i;
+    return -1;
+}
+
+static int getOutputByteOrder(struct Input *in, FILE *strm)
+{
+    char        temp[255];
+    int         kindex;
+    const char *err1 = "Unable to get 'string' value.\n";
+    const char *err2 = "Invalid value for output byte-order.\n";
+
+    if (fscanf(strm, "%s", temp) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    if ((kindex = OutputByteOrderStrToInt(temp)) == -1) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    in->outputByteOrder = kindex;
+    return (0);
+}
+
+static int OutputByteOrderStrToInt(const char *temp)
+{
+    int     i;
+    char    outputByteOrderKeywordTable[2][15] = { "BE", "LE" };
+    for (i = 0; i < 2; i++)
+        if (!HDstrcmp(outputByteOrderKeywordTable[i], temp))
+            return i;
+    return -1;
+}
+
+static int getCompressionType(struct Input *in, FILE *strm)
+{
+    char        temp[255];
+    int         kindex;
+    const char *err1 = "Unable to get 'string' value.\n";
+    const char *err2 = "Invalid value for compression.\n";
+
+    if (fscanf(strm, "%s", temp) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    if ((kindex = CompressionTypeStrToInt(temp)) == -1) {
+        (void) HDfprintf(stderr, "%s", err2);
+        return (-1);
+    }
+
+    in->compressionType = kindex;
+    return (0);
+
+}
+
+static int CompressionTypeStrToInt(char *temp)
+{
+    /* currently supports only GZIP */
+    /* can be extended by adding fields to the table */
+
+    int     i;
+    char    CompressionTypeKeywordTable[1][15] = { "GZIP" };
+    for (i = 0; i < 1; i++)
+        if (!HDstrcmp(CompressionTypeKeywordTable[i], temp))
+            return i;
+    return -1;
+}
+
+static int getCompressionParameter(struct Input *in, FILE *strm)
+{
+    /*  currently supports only GZIP */
+    /*  can be extended by adding more values to COMPRESSION-TYPE and */
+    /*  handling the paramters here by adding more cases  */
+
+    int         ival;
+    const char *err1 = "Unable to get integer value.\n";
+    const char *err2 = "Invalid value for compression paramter.\n";
+    const char *err3 = "Unsupported Compression Type.\n";
+
+    switch (in->compressionType) {
+    case 0: /* GZIP */
+        if (fscanf(strm, "%d", (&ival)) != 1) {
+            (void) HDfprintf(stderr, "%s", err1);
+            return (-1);
+        }
+
+        if (ival < 0 || ival > 9) {
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        in->compressionParam = ival;
+        return (0);
+
+    default:
+        (void) HDfprintf(stderr, "%s", err3);
+        return (-1);
+    }
+}
+
+static int getExternalFilename(struct Input *in, FILE *strm)
+{
+    char        temp[255];
+    const char *err1 = "Unable to get 'string' value.\n";
+
+    if (fscanf(strm, "%s", temp) != 1) {
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+
+    in->externFilename = (char *) HDmalloc ((size_t) (HDstrlen(temp)) * sizeof(char));
+    (void) HDstrcpy(in->externFilename, temp);
+    return (0);
+}
+
+void setDefaultValues(struct Input *in, int count)
+{
+    int     i;
+    char    temp[255];
+    char    num[255];
+
+    in->h5dumpInput = 0;
+    in->inputClass = 3; /* FP */
+    in->inputSize = 32;
+    in->outputClass = 1; /* FP */
+    in->outputSize = 32;
+    in->rank = 0;
+    in->path.count = 1;
+
+    HDstrcpy(temp, "dataset");
+    sprintf(num, "%d", count);
+    HDstrcat(temp, num);
+    HDstrcpy(in->path.group[0], temp);
+
+    in->outputArchitecture = 0; /* NATIVE */
+    in->outputByteOrder = -1; /* use default    */
+    in->compressionType = 0; /* GZIP   */
+    for (i = 0; i < NUM_KEYS; i++)
+        in->configOptionVector[i] = 0;
+}
+
+hid_t createOutputDataType(struct Input *in)
+{
+    hid_t       new_type = (-1);
+    const char *err1 = "Invalid value for output class.\n";
+    const char *err2 = "Invalid value for output size.\n";
+    const char *err3 = "Invalid value for output byte order.\n";
+	const char *err4 = "Invalid value for output architecture.\n";
+    const char *err5 = "STD not supported for float.\n";
+    const char *err6 = "IEEE not supported for INT.\n";
+
+    switch (in->outputClass) {
+    case 0:
+        switch (in->outputArchitecture) {
+        case 0: /* NATIVE */
+            switch (in->outputSize) {
+            case 8:
+                new_type = H5Tcopy(H5T_NATIVE_CHAR);
+                break;
+
+            case 16:
+                new_type = H5Tcopy(H5T_NATIVE_SHORT);
+                break;
+
+            case 32:
+                new_type = H5Tcopy(H5T_NATIVE_INT);
+                break;
+
+            case 64:
+                new_type = H5Tcopy(H5T_NATIVE_LLONG);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            switch (in->outputByteOrder) {
+            case -1: /* default */
+                break;
+            case 0:
+                H5Tset_order(new_type, H5T_ORDER_BE);
+                break;
+
+            case 1:
+                H5Tset_order(new_type, H5T_ORDER_LE);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err3);
+                return (-1);
+            }
+            break;
+
+        case 1: /* STD */
+            switch (in->outputSize) {
+            case 8:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_I8BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_I8LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 16:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_I16BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_I16LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 32:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_I32BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_I32LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 64:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_I64BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_I64LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            break;
+
+		default:
+			(void) HDfprintf(stderr, "%s", err4);
+			return (-1);
+        }
+        break;
+
+    case 1:
+        switch (in->outputArchitecture) {
+        case 0:
+            switch (in->outputSize) {
+            case 32:
+                new_type = H5Tcopy(H5T_NATIVE_FLOAT);
+                break;
+
+            case 64:
+                new_type = H5Tcopy(H5T_NATIVE_DOUBLE);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            switch (in->outputByteOrder) {
+            case -1: /* DEFAULT */
+                break;
+            case 0:
+                H5Tset_order(new_type, H5T_ORDER_BE);
+                break;
+
+            case 1:
+                H5Tset_order(new_type, H5T_ORDER_LE);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err3);
+                return (-1);
+            }
+            break;
+
+        case 1:
+            (void) HDfprintf(stderr, "%s", err5);
+            return (-1);
+
+        case 2:
+            switch (in->outputSize) {
+            case 32:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_IEEE_F32BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_IEEE_F32LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 64:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_IEEE_F64BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_IEEE_F64LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            break;
+
+		default:
+			(void) HDfprintf(stderr, "%s", err4);
+			return (-1);
+        }
+        break;
+
+    case 2:
+        switch (in->outputArchitecture) {
+        case 0:
+            switch (in->outputSize) {
+            case 8:
+                new_type = H5Tcopy(H5T_NATIVE_UCHAR);
+                break;
+
+            case 16:
+                new_type = H5Tcopy(H5T_NATIVE_USHORT);
+                break;
+
+            case 32:
+                new_type = H5Tcopy(H5T_NATIVE_UINT);
+                break;
+
+            case 64:
+                new_type = H5Tcopy(H5T_NATIVE_ULLONG);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            switch (in->outputByteOrder) {
+            case -1: /* Default */
+                break;
+            case 0:
+                H5Tset_order(new_type, H5T_ORDER_BE);
+                break;
+
+            case 1:
+                H5Tset_order(new_type, H5T_ORDER_LE);
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err3);
+                return (-1);
+            }
+            break;
+
+        case 1:
+            switch (in->outputSize) {
+            case 8:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_U8BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_U8LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 16:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_U16BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_U16LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 32:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_U32BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_U32LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            case 64:
+                switch (in->outputByteOrder) {
+                case -1:
+                case 0:
+                    new_type = H5Tcopy(H5T_STD_U64BE);
+                    break;
+
+                case 1:
+                    new_type = H5Tcopy(H5T_STD_U64LE);
+                    break;
+
+                default:
+                    (void) HDfprintf(stderr, "%s", err3);
+                    return (-1);
+                }
+                break;
+
+            default:
+                (void) HDfprintf(stderr, "%s", err2);
+                return (-1);
+            }
+            break;
+
+        case 2:
+            (void) HDfprintf(stderr, "%s", err6);
+            return (-1);
+
+        default:
+            (void) HDfprintf(stderr, "%s", err4);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+    return new_type;
+}
+
+hid_t createInputDataType(struct Input *in)
+{
+    hid_t       new_type = (-1);
+    const char *err1 = "Invalid value for input class.\n";
+    const char *err2 = "Invalid value for output size.\n";
+
+    switch (in->inputClass) {
+    case 0:
+    case 4:
+        switch (in->inputSize) {
+        case 8:
+            new_type = H5Tcopy(H5T_NATIVE_CHAR);
+            break;
+
+        case 16:
+            new_type = H5Tcopy(H5T_NATIVE_SHORT);
+            break;
+
+        case 32:
+            new_type = H5Tcopy(H5T_NATIVE_INT);
+            break;
+
+        case 64:
+            new_type = H5Tcopy(H5T_NATIVE_LLONG);
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 1:
+    case 2:
+    case 3:
+        switch (in->inputSize) {
+        case 32:
+            new_type = H5Tcopy(H5T_NATIVE_FLOAT);
+            break;
+
+        case 64:
+            new_type = H5Tcopy(H5T_NATIVE_DOUBLE);
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    case 5:
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+        break;
+
+    case 6:
+    case 7:
+        switch (in->inputSize) {
+        case 8:
+            new_type = H5Tcopy(H5T_NATIVE_UCHAR);
+            break;
+
+        case 16:
+            new_type = H5Tcopy(H5T_NATIVE_USHORT);
+            break;
+
+        case 32:
+            new_type = H5Tcopy(H5T_NATIVE_UINT);
+            break;
+
+        case 64:
+            new_type = H5Tcopy(H5T_NATIVE_ULLONG);
+            break;
+
+        default:
+            (void) HDfprintf(stderr, "%s", err2);
+            return (-1);
+        }
+        break;
+
+    default:
+        (void) HDfprintf(stderr, "%s", err1);
+        return (-1);
+    }
+    return new_type;
+}
+
+static int process(struct Options *opt)
+{
+    struct Input   *in;
+    FILE           *extfile;
+    hid_t           file_id;
+    hid_t           group_id;
+    hid_t           handle;
+    hid_t           dataset;
+    hid_t           dataspace = (-1);
+    hid_t           intype;
+    hid_t           outtype;
+    hid_t           proplist;
+    hsize_t         numOfElements = 1;
+    int             j;
+    int             k;
+
+    const char *err1 = "Error creating HDF output file: %s.\n";
+    const char *err2 = "Error in processing the configuration file: %s.\n";
+    const char *err3 = "Error in reading the input file: %s.\n";
+    const char *err4 = "Error in creating or opening external file.\n";
+    const char *err5 = "Error in creating the output data set. Dataset with the same name may exist at the specified path\n";
+    const char *err6 = "Error in writing the output data set.\n";
+
+    H5E_BEGIN_TRY
+    {
+        if ((file_id = H5Fopen(opt->outfile, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
+            if ((file_id = H5Fcreate(opt->outfile, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) == FAIL) {
+                (void) HDfprintf(stderr, err1, opt->outfile);
+                return (-1);
+            }
+        }
+    }
+    H5E_END_TRY;
+
+    for (k = 0; k < opt->fcount; k++) {
+        in = &(opt->infiles[k].in);
+        if (opt->infiles[k].config == 1) {
+            if (processConfigurationFile(opt->infiles[k].configfile, in) == -1) {
+                (void) HDfprintf(stderr, err2, opt->infiles[k].configfile);
+                return (-1);
+            }
+        }
+
+        if (processDataFile(opt->infiles[k].datafile, in, file_id) == -1) {
+            (void) HDfprintf(stderr, err3, opt->infiles[k].datafile);
+            return (-1);
+        }
+
+        if (in->inputClass != 5) { /* STR */
+            for (j = 0; j < in->rank; j++)
+                numOfElements *= in->sizeOfDimension[j];
+
+            /* disable error reporting */
+            H5E_BEGIN_TRY
+            {
+                /* create parent groups */
+                if (in->path.count > 1) {
+                    j = 0;
+                    handle = file_id;
+                    while (j < in->path.count - 1) {
+                        if ((group_id = H5Gopen2(handle, in->path.group[j], H5P_DEFAULT)) < 0) {
+                            group_id = H5Gcreate2(handle, in->path.group[j++], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                            for (; j < in->path.count - 1; j++)
+                                group_id = H5Gcreate2(group_id, in->path.group[j], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+                            handle = group_id;
+                            break;
+                        }
+                        handle = group_id;
+                        j++;
+                    }
+                }
+                else {
+                    handle = file_id;
+                    j = 0;
+                }
+
+                /*enable error reporting */
+            }
+            H5E_END_TRY;
+
+            /*create data type */
+            intype = createInputDataType(in);
+            outtype = createOutputDataType(in);
+#ifdef H5DEBUGIMPORT
+            printf("process intype %d outtype %d\n", intype, outtype);
+#endif
+
+            /* create property list */
+            proplist = H5Pcreate(H5P_DATASET_CREATE);
+            if (in->configOptionVector[CHUNK] == 1) {
+                H5Pset_layout(proplist, H5D_CHUNKED);
+                /* not reqd chunking is implied if set_chunk is used  */
+                H5Pset_chunk(proplist, in->rank, in->sizeOfChunk);
+            }
+
+            if (in->configOptionVector[COMPRESS] == 1) {
+                H5Pset_deflate(proplist, (unsigned) in->compressionParam);
+            }
+
+            if (in->configOptionVector[EXTERNALSTORE] == 1) {
+                /* creating the external file if it doesnt exist */
+                if ((extfile = HDfopen(in->externFilename, "ab")) == NULL) {
+                    (void) HDfprintf(stderr, "%s", err4);
+                    H5Pclose(proplist);
+                    H5Sclose(dataspace);
+                    H5Fclose(file_id);
+                    return (-1);
+                }
+                HDfclose(extfile);
+                H5Pset_external(proplist, in->externFilename, (off_t)0, numOfElements * (hsize_t)in->inputSize / 8);
+            }
+
+            /* create dataspace */
+            if (in->configOptionVector[EXTEND] == 1)
+                dataspace = H5Screate_simple(in->rank, in->sizeOfDimension, in->maxsizeOfDimension);
+            else
+                dataspace = H5Screate_simple(in->rank, in->sizeOfDimension, NULL);
+
+            /* disable error reporting */
+            H5E_BEGIN_TRY
+            {
+                /* create data set */
+                if ((dataset = H5Dcreate2(handle, in->path.group[j], outtype, dataspace, H5P_DEFAULT, proplist, H5P_DEFAULT)) < 0) {
+                    (void) HDfprintf(stderr, "%s", err5);
+                    H5Pclose(proplist);
+                    H5Sclose(dataspace);
+                    H5Fclose(file_id);
+                    return (-1);
+                }
+
+                /*enable error reporting */
+            }
+            H5E_END_TRY;
+
+            /* write dataset */
+            if (H5Dwrite(dataset, intype, H5S_ALL, H5S_ALL, H5P_DEFAULT, (VOIDP) in->data) < 0) {
+                (void) HDfprintf(stderr, "%s", err6);
+                H5Dclose(dataset);
+                H5Pclose(proplist);
+                H5Sclose(dataspace);
+                H5Fclose(file_id);
+                return (-1);
+            }
+
+            H5Dclose(dataset);
+            H5Pclose(proplist);
+            H5Sclose(dataspace);
+        }
+
+    } /* STR */
+
+    H5Fclose(file_id);
+    return (0);
+}
+
+/*
+ * Name:
+ *      help
+ *
+ * Purpose:
+ *      Print a helpful summary of command usage and features.
+ */
+
+void help(char *name)
+{
+    (void) HDfprintf(stdout, "Name:\n\n");
+    (void) HDfprintf(stdout, "\t%s\n\n", name);
+    (void) HDfprintf(stdout, "\t  TOOL NAME:\n");
+    (void) HDfprintf(stdout, "\t   %s\n", name);
+    (void) HDfprintf(stdout, "\t   SYNTAX:\n");
+    (void) HDfprintf(stdout, "\t   %s -h[elp], OR\n", name);
+    (void) HDfprintf(stdout,
+            "\t   %s <infile> -c[onfig] <configfile> [<infile> -c[config] <configfile>...]", name);
+    (void) HDfprintf(stdout, "\t\t\t\t      -o[utfile] <outfile>\n\n");
+    (void) HDfprintf(stdout, "\t   PURPOSE:\n");
+    (void) HDfprintf(stdout,
+            "\t   To convert data stored in one or more ASCII or binary files\n");
+    (void) HDfprintf(stdout,
+            "\t  into one or more datasets (in accordance with the \n");
+    (void) HDfprintf(stdout,
+            "\t  user-specified type and storage properties) in an existing \n");
+    (void) HDfprintf(stdout, "\t  or new HDF5 file.\n\n");
+    (void) HDfprintf(stdout, "\t   DESCRIPTION:\n");
+    (void) HDfprintf(stdout,
+            "\t  The primary objective of the utility is to convert floating\n");
+    (void) HDfprintf(stdout,
+            "\t  point or integer data stored in ASCII text or binary form \n");
+    (void) HDfprintf(stdout,
+            "\t  into a data-set according to the type and storage properties\n");
+    (void) HDfprintf(stdout,
+            "\t  specified by the user. The utility can also accept ASCII\n");
+    (void) HDfprintf(stdout,
+            "\t  text files and store the contents in a compact form as an\n");
+    (void) HDfprintf(stdout, "\t  array of one-dimensional strings.\n\n");
+    (void) HDfprintf(stdout,
+            "\t  The input data to be written as a data-set can be provided\n");
+    (void) HDfprintf(stdout, "\t  to the utility in one of the following forms:\n");
+    (void) HDfprintf(stdout,
+            "\t  1. ASCII text file with numeric data (floating point or \n");
+    (void) HDfprintf(stdout, "\t  integer data). \n");
+    (void) HDfprintf(stdout,
+            "\t  2. Binary file with native floating point data (32-bit or \n");
+    (void) HDfprintf(stdout, "\t  64-bit) \n");
+    (void) HDfprintf(stdout,
+            "\t  3. Binary file with native integer (signed or unsigned)\n");
+    (void) HDfprintf(stdout, "\t  data (8-bit or 16-bit or 32-bit or 64-bit). \n");
+    (void) HDfprintf(stdout,
+            "\t  4. ASCII text file containing strings (text data).\n");
+    (void) HDfprintf(stdout, "\t    \n");
+    (void) HDfprintf(stdout,
+            "\t  Every input file is associated with a configuration file \n");
+    (void) HDfprintf(stdout,
+            "\t  also provided as an input to the utility. (See Section \n");
+    (void) HDfprintf(stdout,
+            "\t  \"CONFIGURATION FILE\" to know how it is to be organized).\n");
+    (void) HDfprintf(stdout,
+            "\t  The class, size and dimensions of the input data is \n");
+    (void) HDfprintf(stdout,
+            "\t  specified in this configuration file. A point to note is\n");
+    (void) HDfprintf(stdout,
+            "\t  that the floating point data in the ASCII text file may be\n");
+    (void) HDfprintf(stdout,
+            "\t  organized in the fixed floating form (for example 323.56)\n");
+    (void) HDfprintf(stdout,
+            "\t  or in a scientific notation (for example 3.23E+02). A \n");
+    (void) HDfprintf(stdout,
+            "\t  different input-class specification is to be used for both\n");
+    (void) HDfprintf(stdout, "\t  forms.\n\n");
+    (void) HDfprintf(stdout,
+            "\t  The utility extracts the input data from the input file \n");
+    (void) HDfprintf(stdout,
+            "\t  according to the specified parameters and saves it into \n");
+    (void) HDfprintf(stdout, "\t  an H5 dataset. \n\n");
+    (void) HDfprintf(stdout,
+            "\t  The user can specify output type and storage properties in \n");
+    (void) HDfprintf(stdout,
+            "\t  the configuration file. The user is required to specify the \n");
+    (void) HDfprintf(stdout,
+            "\t  path of the dataset. If the groups in the path leading to \n");
+    (void) HDfprintf(stdout,
+            "\t  the data-set do not exist, the groups will be created by the\n");
+    (void) HDfprintf(stdout,
+            "\t  utility. If no group is specified, the dataset will be\n");
+    (void) HDfprintf(stdout, "\t  created under the root group.\n\n");
+    (void) HDfprintf(stdout,
+            "\t  In addition to the name, the user is also required to \n");
+    (void) HDfprintf(stdout,
+            "\t  provide the class and size of output data to be written to \n");
+    (void) HDfprintf(stdout,
+            "\t  the dataset and may optionally specify the output-architecture,\n");
+    (void) HDfprintf(stdout,
+            "\t  and the output-byte-order. If output-architecture is not \n");
+    (void) HDfprintf(stdout,
+            "\t  specified the default is NATIVE. Output-byte-orders are fixed\n");
+    (void) HDfprintf(stdout,
+            "\t  for some architectures and may be specified only if output-\n");
+    (void) HDfprintf(stdout, "\t  architecture is IEEE, UNIX or STD.\n\n");
+    (void) HDfprintf(stdout,
+            "\t   Also, layout and other storage properties such as \n");
+    (void) HDfprintf(stdout,
+            "\t  compression, external storage and extendible data-sets may be\n");
+    (void) HDfprintf(stdout,
+            "\t  optionally specified.  The layout and storage properties \n");
+    (void) HDfprintf(stdout,
+            "\t  denote how raw data is to be organized on the disk. If these \n");
+    (void) HDfprintf(stdout,
+            "\t  options are not specified the default is Contiguous layout \n");
+    (void) HDfprintf(stdout, "\t  and storage.\n\n");
+    (void) HDfprintf(stdout,
+            "\t  The dataset can be organized in any of the following ways:\n");
+    (void) HDfprintf(stdout, "\t  1. Contiguous.\n");
+    (void) HDfprintf(stdout, "\t  2. Chunked.\n");
+    (void) HDfprintf(stdout,
+            "\t  3. External Storage File    (has to be contiguous)\n");
+    (void) HDfprintf(stdout,
+            "\t  4. Extendible data sets     (has to be chunked)\n");
+    (void) HDfprintf(stdout, "\t  5. Compressed.        (has to be chunked)\n");
+    (void) HDfprintf(stdout,
+            "\t  6. Compressed & Extendible  (has to be chunked)\n\n");
+    (void) HDfprintf(stdout,
+            "\t  If the user wants to store raw data in a non-HDF file then \n");
+    (void) HDfprintf(stdout,
+            "\t  the external storage file option is to be used and the name \n");
+    (void) HDfprintf(stdout, "\t  of the file is to be specified. \n\n");
+    (void) HDfprintf(stdout,
+            "\t  If the user wants the dimensions of the data-set to be\n");
+    (void) HDfprintf(stdout,
+            "\t  unlimited, the extendible data set option can be chosen. \n\n");
+    (void) HDfprintf(stdout,
+            "\t  The user may also specify the type of compression and the \n");
+    (void) HDfprintf(stdout,
+            "\t  level to which the data set must be compresses by setting \n");
+    (void) HDfprintf(stdout, "\t  the compressed option.\n\n");
+    (void) HDfprintf(stdout, "\t   SYNOPSIS:\n");
+    (void) HDfprintf(stdout, "\t  h5import -h[elp], OR\n");
+    (void) HDfprintf( stdout,
+            "\t  h5import <infile> -c[onfig] <configfile> \
+                    [<infile> -c[config] <confile2>...] -o[utfile] <outfile>\n\n");
+    (void) HDfprintf(stdout, "\t   -h[elp]:\n");
+    (void) HDfprintf(stdout,
+            "\t           Prints this summary of usage, and exits.\n\n");
+    (void) HDfprintf(stdout, "\t   <infile(s)>:\n");
+    (void) HDfprintf(stdout,
+            "\t           Name of the Input file(s), containing a \n");
+    (void) HDfprintf(stdout,
+            "\t    single n-dimensional floating point or integer array \n");
+    (void) HDfprintf(stdout,
+            "\t    in either ASCII text, native floating point(32-bit \n");
+    (void) HDfprintf(stdout,
+            "\t    or 64-bit) or native integer(8-bit or 16-bit or \n");
+    (void) HDfprintf(stdout,
+            "\t    32-bit or 64-bit). Data to be specified in the order\n");
+    (void) HDfprintf(stdout, "\t    of fastest changing dimensions first.\n\n");
+    (void) HDfprintf(stdout, "\t  -c[config] <configfile>:\n");
+    (void) HDfprintf(stdout,
+            "\t    Every input file should be associated with a \n");
+    (void) HDfprintf(stdout,
+            "\t    configuration file and this is done by the -c option.\n");
+    (void) HDfprintf(stdout,
+            "\t    <configfile> is the name of the configuration file.\n");
+    (void) HDfprintf(stdout, "\t    (See Section \"CONFIGURATION FILE\")\n\n");
+    (void) HDfprintf(stdout, "\t   -o[utfile] <outfile>:\n");
+    (void) HDfprintf(stdout,
+            "\t           Name of the HDF5 output file. Data from one or more \n");
+    (void) HDfprintf(stdout,
+            "\t    input files are stored as one or more data sets in \n");
+    (void) HDfprintf(stdout,
+            "\t    <outfile>. The output file may be an existing file or \n");
+    (void) HDfprintf(stdout,
+            "\t    it maybe new in which case it will be created.\n\n\n");
+    (void) HDfprintf(stdout, "\t   CONFIGURATION FILE:\n");
+    (void) HDfprintf(stdout,
+            "\t  The configuration file is an ASCII text file and must be \n");
+    (void) HDfprintf(stdout,
+            "\t  the ddl formatted file (without data values) produced by h5dump \n");
+    (void) HDfprintf(stdout,
+            "\t  when used with the options '-o outfilename -b' of a single dataset (-d) \n");
+    (void) HDfprintf(stdout,
+            "\t  OR organized as \"CONFIG-KEYWORD VALUE\" pairs, one pair on each \n");
+    (void) HDfprintf(stdout, "\t  line.\n\n");
+    (void) HDfprintf(stdout,
+            "\t   The configuration file may have the following keywords each \n");
+    (void) HDfprintf(stdout, "\t   followed by an acceptable value.\n\n");
+    (void) HDfprintf(stdout, "\t  Required KEYWORDS:\n");
+    (void) HDfprintf(stdout, "\t    PATH\n");
+    (void) HDfprintf(stdout, "\t    INPUT-CLASS\n");
+    (void) HDfprintf(stdout, "\t    INPUT-SIZE\n");
+    (void) HDfprintf(stdout, "\t    RANK\n");
+    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE\n\n");
+    (void) HDfprintf(stdout, "\t  Optional KEYWORDS:\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER\n");
+    (void) HDfprintf(stdout, "\t    CHUNKED-DIMENSION-SIZES\n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE\n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM\n");
+    (void) HDfprintf(stdout, "\t    EXTERNAL-STORAGE\n");
+    (void) HDfprintf(stdout, "\t    MAXIMUM-DIMENSIONS\n\n\n");
+    (void) HDfprintf(stdout, "\t    Values for keywords:\n");
+    (void) HDfprintf(stdout, "\t    PATH:\n");
+    (void) HDfprintf(stdout, "\t      Strings separated by spaces to represent\n");
+    (void) HDfprintf(stdout, "\t      the path of the data-set. If the groups in\n");
+    (void) HDfprintf(stdout,
+            "\t      the path do not exist, they will be created. \n");
+    (void) HDfprintf(stdout, "\t      For example,\n");
+    (void) HDfprintf(stdout, "\t        PATH grp1/grp2/dataset1\n");
+    (void) HDfprintf(stdout, "\t        PATH: keyword\n");
+    (void) HDfprintf(stdout, "\t        grp1: group under the root. If\n");
+    (void) HDfprintf(stdout, "\t              non-existent will be created.\n");
+    (void) HDfprintf(stdout, "\t        grp2: group under grp1. If \n");
+    (void) HDfprintf(stdout, "\t              non-existent will be created \n");
+    (void) HDfprintf(stdout, "\t              under grp1.\n");
+    (void) HDfprintf(stdout, "\t        dataset1: the name of the data-set \n");
+    (void) HDfprintf(stdout, "\t            to be created.\n\n");
+    (void) HDfprintf(stdout, "\t               INPUT-CLASS:\n");
+    (void) HDfprintf(stdout, "\t      String denoting the type of input data.\n");
+    (void) HDfprintf(stdout, "\t      (\"TEXTIN\", \"TEXTFP\", \"FP\", \"IN\", \n");
+    (void) HDfprintf(stdout, "\t      \"STR\", \"TEXTUIN\", \"UIN\"). \n");
+    (void) HDfprintf(stdout,
+            "\t      INPUT-CLASS \"TEXTIN\" denotes an ASCII text \n");
+    (void) HDfprintf(stdout,
+            "\t      file with signed integer data in ASCII form,\n");
+    (void) HDfprintf(stdout,
+            "\t      INPUT-CLASS \"TEXTUIN\" denotes an ASCII text \n");
+    (void) HDfprintf(stdout,
+            "\t      file with unsigned integer data in ASCII form,\n");
+    (void) HDfprintf(stdout,
+            "\t      \"TEXTFP\" denotes an ASCII text file containing\n");
+    (void) HDfprintf(stdout, "\t      floating point data in the fixed notation\n");
+    (void) HDfprintf(stdout, "\t      (325.34),\n");
+    (void) HDfprintf(stdout,
+            "\t      \"FP\" denotes a floating point binary file,\n");
+    (void) HDfprintf(stdout,
+            "\t      \"IN\" denotes a signed integer binary file,\n");
+    (void) HDfprintf(stdout,
+            "\t      \"UIN\" denotes an unsigned integer binary file,\n");
+    (void) HDfprintf(stdout, "\t       & \"STR\" denotes an ASCII text file the \n");
+    (void) HDfprintf(stdout,
+            "\t      contents of which should be stored as an 1-D \n");
+    (void) HDfprintf(stdout, "\t      array of strings.\n");
+    (void) HDfprintf(stdout, "\t      If INPUT-CLASS is \"STR\", then RANK, \n");
+    (void) HDfprintf(stdout,
+            "\t      DIMENSION-SIZES, OUTPUT-CLASS, OUTPUT-SIZE, \n");
+    (void) HDfprintf(stdout, "\t      OUTPUT-ARCHITECTURE and OUTPUT-BYTE-ORDER \n");
+    (void) HDfprintf(stdout, "\t      will be ignored.\n\n\n");
+    (void) HDfprintf(stdout, "\t    INPUT-SIZE:\n");
+    (void) HDfprintf(stdout,
+            "\t      Integer denoting the size of the input data \n");
+    (void) HDfprintf(stdout, "\t      (8, 16, 32, 64). \n\n");
+    (void) HDfprintf(stdout, "\t      For floating point,\n");
+    (void) HDfprintf(stdout, "\t      INPUT-SIZE can be 32 or 64.\n");
+    (void) HDfprintf(stdout, "\t      For integers (signed and unsigned)\n");
+    (void) HDfprintf(stdout, "\t      INPUT-SIZE can be 8, 16, 32 or 64.\n\n");
+    (void) HDfprintf(stdout, "\t    RANK:\n");
+    (void) HDfprintf(stdout,
+            "\t      Integer denoting the number of dimensions.\n\n");
+    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES:\n");
+    (void) HDfprintf(stdout,
+            "\t            Integers separated by spaces to denote the \n");
+    (void) HDfprintf(stdout, "\t      dimension sizes for the no. of dimensions \n");
+    (void) HDfprintf(stdout, "\t      determined by rank.\n\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS:\n");
+    (void) HDfprintf(stdout,
+            "\t      String dentoting data type of the dataset to \n");
+    (void) HDfprintf(stdout, "\t      be written (\"IN\",\"FP\", \"UIN\")\n\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE:\n");
+    (void) HDfprintf(stdout,
+            "\t      Integer denoting the size of the data in the \n");
+    (void) HDfprintf(stdout, "\t      output dataset to be written.\n");
+    (void) HDfprintf(stdout,
+            "\t      If OUTPUT-CLASS is \"FP\", OUTPUT-SIZE can be \n");
+    (void) HDfprintf(stdout, "\t      32 or 64.\n");
+    (void) HDfprintf(stdout,
+            "\t      If OUTPUT-CLASS is \"IN\" or \"UIN\", OUTPUT-SIZE\n");
+    (void) HDfprintf(stdout, "\t      can be 8, 16, 32 or 64.\n\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE:\n");
+    (void) HDfprintf(stdout, "\t      STRING denoting the type of output \n");
+    (void) HDfprintf(stdout,
+            "\t      architecture. Can accept the following values\n");
+    (void) HDfprintf(stdout, "\t      STD\n");
+    (void) HDfprintf(stdout, "\t      IEEE\n");
+    (void) HDfprintf(stdout, "\t      INTEL\n");
+    (void) HDfprintf(stdout, "\t      CRAY\n");
+    (void) HDfprintf(stdout, "\t      MIPS\n");
+    (void) HDfprintf(stdout, "\t      ALPHA\n");
+    (void) HDfprintf(stdout, "\t      NATIVE (default)\n");
+    (void) HDfprintf(stdout, "\t      UNIX\n\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER:\n");
+    (void) HDfprintf(stdout,
+            "\t      String denoting the output-byte-order. Ignored\n");
+    (void) HDfprintf(stdout,
+            "\t      if the OUTPUT-ARCHITECTURE is not specified or\n");
+    (void) HDfprintf(stdout, "\t      if it is IEEE, UNIX or STD. Can accept the \n");
+    (void) HDfprintf(stdout, "\t      following values.\n");
+    (void) HDfprintf(stdout, "\t      BE (default)\n");
+    (void) HDfprintf(stdout, "\t      LE\n\n");
+    (void) HDfprintf(stdout, "\t    CHUNKED-DIMENSION-SIZES:\n");
+    (void) HDfprintf(stdout, "\t      Integers separated by spaces to denote the \n");
+    (void) HDfprintf(stdout,
+            "\t      dimension sizes of the chunk for the no. of \n");
+    (void) HDfprintf(stdout,
+            "\t      dimensions determined by rank. Required field\n");
+    (void) HDfprintf(stdout,
+            "\t      to denote that the dataset will be stored with\n");
+    (void) HDfprintf(stdout,
+            "\t      chunked storage. If this field is absent the\n");
+    (void) HDfprintf(stdout,
+            "\t      dataset will be stored with contiguous storage.\n\n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE:\n");
+    (void) HDfprintf(stdout,
+            "\t      String denoting the type of compression to be\n");
+    (void) HDfprintf(stdout, "\t      used with the chunked storage. Requires the\n");
+    (void) HDfprintf(stdout,
+            "\t      CHUNKED-DIMENSION-SIZES to be specified. The only \n");
+    (void) HDfprintf(stdout,
+            "\t      currently supported compression method is GZIP. \n");
+    (void) HDfprintf(stdout, "\t      Will accept the following value\n");
+    (void) HDfprintf(stdout, "\t      GZIP\n\n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM:\n");
+    (void) HDfprintf(stdout,
+            "\t      Integer used to denote compression level and \n");
+    (void) HDfprintf(stdout, "\t      this option is to be always specified when \n");
+    (void) HDfprintf(stdout,
+            "\t      the COMPRESSION-TYPE option is specified. The\n");
+    (void) HDfprintf(stdout, "\t      values are applicable only to GZIP \n");
+    (void) HDfprintf(stdout, "\t      compression.\n");
+    (void) HDfprintf(stdout, "\t      Value 1-9: The level of Compression. \n");
+    (void) HDfprintf(stdout, "\t        1 will result in the fastest \n");
+    (void) HDfprintf(stdout, "\t        compression while 9 will result in \n");
+    (void) HDfprintf(stdout, "\t        the best compression ratio. The default\n");
+    (void) HDfprintf(stdout, "\t        level of compression is 6.\n\n");
+    (void) HDfprintf(stdout, "\t    EXTERNAL-STORAGE:\n");
+    (void) HDfprintf(stdout,
+            "\t      String to denote the name of the non-HDF5 file \n");
+    (void) HDfprintf(stdout,
+            "\t      to store data to. Cannot be used if CHUNKED-\n");
+    (void) HDfprintf(stdout,
+            "\t      DIMENSIONS or COMPRESSION-TYPE or EXTENDIBLE-\n");
+    (void) HDfprintf(stdout, "\t      DATASET is specified.\n");
+    (void) HDfprintf(stdout, "\t      Value <external-filename>: the name of the \n");
+    (void) HDfprintf(stdout, "\t      external file as a string to be used.\n\n");
+    (void) HDfprintf(stdout, "\t    MAXIMUM-DIMENSIONS:\n");
+    (void) HDfprintf(stdout, "\t      Integers separated by spaces to denote the \n");
+    (void) HDfprintf(stdout, "\t      maximum dimension sizes of all the \n");
+    (void) HDfprintf(stdout, "\t      dimensions determined by rank. Requires the\n");
+    (void) HDfprintf(stdout,
+            "\t      CHUNKED-DIMENSION-SIZES to be specified. A value of \n");
+    (void) HDfprintf(stdout, "\t      -1 for any dimension implies UNLIMITED \n");
+    (void) HDfprintf(stdout,
+            "\t      DIMENSION size for that particular dimension.\n\n");
+    (void) HDfprintf(stdout, "\t   EXAMPLES:\n");
+    (void) HDfprintf(stdout, "\t  1. Configuration File may look like:\n\n");
+    (void) HDfprintf(stdout, "\t    PATH work h5 pkamat First-set\n");
+    (void) HDfprintf(stdout, "\t    INPUT-CLASS TEXTFP\n");
+    (void) HDfprintf(stdout, "\t    RANK 3\n");
+    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES 5 2 4\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS FP\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE 64\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-ARCHITECTURE IEEE\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-BYTE-ORDER LE\n");
+    (void) HDfprintf(stdout, "\t      CHUNKED-DIMENSION-SIZES 2 2 2 \n\n");
+    (void) HDfprintf(stdout,
+            "\t  The above configuration will accept a floating point array \n");
+    (void) HDfprintf(stdout,
+            "\t  (5 x 2 x 4)  in an ASCII file with the rank and dimension sizes \n");
+    (void) HDfprintf(stdout,
+            "\t  specified and will save it in a chunked data-set (of pattern \n");
+    (void) HDfprintf(stdout,
+            "\t  2 X 2 X 2) of 64-bit floating point in the little-endian order \n");
+    (void) HDfprintf(stdout,
+            "\t  and IEEE architecture. The dataset will be stored at\n");
+    (void) HDfprintf(stdout, "\t  \"/work/h5/pkamat/First-set\"\n\n");
+    (void) HDfprintf(stdout, "\t  2. Another configuration could be:\n\n");
+    (void) HDfprintf(stdout, "\t    PATH Second-set\n");
+    (void) HDfprintf(stdout, "\t    INPUT-CLASS IN  \n");
+    (void) HDfprintf(stdout, "\t    RANK 5\n");
+    (void) HDfprintf(stdout, "\t    DIMENSION-SIZES 6 3 5 2 4\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-CLASS IN\n");
+    (void) HDfprintf(stdout, "\t    OUTPUT-SIZE 32\n");
+    (void) HDfprintf(stdout, "\t      CHUNKED-DIMENSION-SIZES 2 2 2 2 2\n");
+    (void) HDfprintf(stdout, "\t    EXTENDIBLE-DATASET 1 3 \n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-TYPE GZIP\n");
+    (void) HDfprintf(stdout, "\t    COMPRESSION-PARAM 7\n\n\n");
+    (void) HDfprintf(stdout,
+            "\t  The above configuration will accept an integer array \n");
+    (void) HDfprintf(stdout,
+            "\t  (6 X 3 X 5 x 2 x 4)  in a binary file with the rank and \n");
+    (void) HDfprintf(stdout,
+            "\t  dimension sizes specified and will save it in a chunked data-set\n");
+    (void) HDfprintf(stdout,
+            "\t  (of pattern 2 X 2 X 2 X 2 X 2) of 32-bit floating point in \n");
+    (void) HDfprintf(stdout,
+            "\t  native format (as output-architecture is not specified). The \n");
+    (void) HDfprintf(stdout,
+            "\t  first and the third dimension will be defined as unlimited. The \n");
+    (void) HDfprintf(stdout,
+            "\t  data-set will be compressed using GZIP and a compression level \n");
+    (void) HDfprintf(stdout, "\t  of 7.\n");
+    (void) HDfprintf(stdout,
+            "\t  The dataset will be stored at \"/Second-set\"\n\n");
+    return;
+}
+
+void usage(char *name)
+{
+    (void) HDfprintf(stdout, "\nUsage:\t%s -h[elp], OR\n", name);
+    (void) HDfprintf(stdout,
+            "\t%s <infile> -c[onfig] <configfile> \
+  [<infile> -c[config] <configfile>...] -o[utfile] <outfile> \n\n", name);
+    return;
+}
+
diff --git a/tools/src/h5import/h5import.h b/tools/src/h5import/h5import.h
new file mode 100644
index 0000000..c69a542
--- /dev/null
+++ b/tools/src/h5import/h5import.h
@@ -0,0 +1,196 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ *
+ * Data and structure definitions for h5import
+ *
+ */
+
+#ifndef H5IMPORT_H__
+#define H5IMPORT_H__
+
+/*
+ * state table tokens
+ */
+#define FILNAME 0
+/* filename */
+#define OPT_o   1
+/* output filename */
+#define OPT_c   2   /* configuration filename */
+#define OPT_h   3   /* request for explanation */
+#define OPT_d   4   /* dimensions */
+#define OPT_p   5   /* pathname */
+#define OPT_t   6   /* data type */
+#define OPT_s   7   /* data size */
+#define ERR    20  /* invalid token */
+
+#define MAX_GROUPS_IN_PATH  20
+#define MAX_PATH_NAME_LENGTH 255
+#define NUM_KEYS 14
+#define MIN_NUM_DIMENSION  1
+#define MAX_NUM_DIMENSION  32
+#define BASE_10 10
+
+#define PATH             0
+#define INPUT_CLASS      1
+#define INPUT_SIZE       2
+#define RANK             3
+#define DIM              4
+#define OUTPUT_CLASS     5
+#define OUTPUT_SIZE      6
+#define OUTPUT_ARCH      7
+#define OUTPUT_B_ORDER   8
+#define CHUNK            9
+#define COMPRESS         10
+#define COMPRESS_PARAM   11
+#define EXTERNALSTORE    12
+#define EXTEND           13
+
+/* data types */
+#define H5DT_INT8      signed char
+#define H5DT_INT16     short
+#define H5DT_INT32     int
+#define H5DT_FLOAT32   float
+#define H5DT_FLOAT64   double
+#define VOIDP          void*
+#define H5DT_UINT8     unsigned char
+#define H5DT_UINT16    unsigned short
+#define H5DT_UINT32    unsigned int
+#define H5DT_INT64     long long
+#define H5DT_UINT64    unsigned H5DT_INT64
+
+struct path_info
+{
+    char group[MAX_GROUPS_IN_PATH][MAX_PATH_NAME_LENGTH];
+    int count;
+};
+
+struct Input
+{
+    int h5dumpInput;
+    struct path_info path;
+    int inputClass;
+    int inputSize;
+    int rank;
+    hsize_t* sizeOfDimension;
+    int outputClass;
+    int outputSize;
+    int outputArchitecture;
+    int outputByteOrder;
+    hsize_t* sizeOfChunk;
+    hsize_t* maxsizeOfDimension;
+    int compressionType;
+    int compressionParam;
+    char *externFilename;
+    VOIDP data;
+    int configOptionVector[NUM_KEYS];
+};
+
+struct infilesformat
+{
+    char datafile[255];
+    char configfile[255];
+    struct Input in;
+    int config; /* Configfile present? No - 0. Yes - 1 */
+};
+
+struct Options
+{
+    struct infilesformat  infiles[30];  /* structure to hold the list of input file names. Limited to 30*/
+    char   outfile[256];  /* output file name */
+    int    fcount;       /* number of input files */
+};
+
+char keytable[NUM_KEYS][30] = {
+        "PATH",
+        "INPUT-CLASS",
+        "INPUT-SIZE",
+        "RANK",
+        "DIMENSION-SIZES",
+        "OUTPUT-CLASS",
+        "OUTPUT-SIZE",
+        "OUTPUT-ARCHITECTURE",
+        "OUTPUT-BYTE-ORDER",
+        "CHUNKED-DIMENSION-SIZES",
+        "COMPRESSION-TYPE",
+        "COMPRESSION-PARAM",
+        "EXTERNAL-STORAGE",
+        "MAXIMUM-DIMENSIONS"
+};
+
+static int  state_table[15][8] =
+{
+    /* token ordering: FILNAME      OPT_o   OPT_c  OPT_h  OPT_d  OPT_p  OPT_t  OPT_s   */
+
+    /* state 0: start */
+    {1, ERR, ERR, 6, ERR, ERR, ERR, ERR},
+
+    /* state 1: input files */
+    {ERR, ERR, 2, ERR, 7, ERR, ERR, ERR},
+
+    /* state 2: -c[onfigfile] */
+    {3, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 3: configfile */
+    {1, 4, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 4: -o[utfile] */
+    {5, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 5: outfile */
+    {ERR, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 6: -h[elp] */
+    {ERR, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 7: -d[ims] */
+    {8, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 8: dimensions */
+    {1, 4, ERR, ERR, ERR, 9, 11, 13},
+
+    /* state 9: -p[ath] */
+    {10, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 10: path name */
+    {1, 4, ERR, ERR, ERR, ERR, 11, 13},
+
+    /* state 11: -t[ype] */
+    {12, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 12: data type */
+    {1, 4, ERR, ERR, ERR, ERR, ERR, 13},
+
+    /* state 13: -s[ize] */
+    {14, ERR, ERR, ERR, ERR, ERR, ERR, ERR},
+
+    /* state 14: data size */
+    {1, 4, ERR, ERR, ERR, ERR, ERR, ERR}
+
+};
+
+/*
+ *
+ *  Function declarations for h5import
+ *
+ */
+void  usage(char *);
+void  setDefaultValues(struct Input *in, int count);
+void  help(char *);
+
+hid_t       createOutputDataType(struct Input *in);
+hid_t       createInputDataType(struct Input *in);
+
+#endif  /* H5IMPORT_H__ */
+
diff --git a/tools/src/h5jam/CMakeLists.txt b/tools/src/h5jam/CMakeLists.txt
new file mode 100644
index 0000000..3cca771
--- /dev/null
+++ b/tools/src/h5jam/CMakeLists.txt
@@ -0,0 +1,50 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5JAM)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5jam executables
+# --------------------------------------------------------------------
+add_executable (h5jam ${HDF5_TOOLS_SRC_H5JAM_SOURCE_DIR}/h5jam.c)
+TARGET_NAMING (h5jam STATIC)
+TARGET_C_PROPERTIES (h5jam STATIC " " " ")
+target_link_libraries (h5jam  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5jam PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5jam")
+
+add_executable (h5unjam ${HDF5_TOOLS_SRC_H5JAM_SOURCE_DIR}/h5unjam.c)
+TARGET_NAMING (h5unjam STATIC)
+TARGET_C_PROPERTIES (h5unjam STATIC " " " ")
+target_link_libraries (h5unjam  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5unjam PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5unjam")
+
+set (H5_DEP_EXECUTABLES
+    h5jam
+    h5unjam
+)
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  INSTALL_PROGRAM_PDB (h5jam ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          h5jam h5unjam
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5jam/Makefile.am b/tools/src/h5jam/Makefile.am
new file mode 100644
index 0000000..4c44b08
--- /dev/null
+++ b/tools/src/h5jam/Makefile.am
@@ -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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+bin_PROGRAMS=h5jam h5unjam
+
+# Add h5jam and h5unjam specific linker flags here
+h5jam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5unjam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Link against the main HDF5 library and tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5jam/Makefile.in b/tools/src/h5jam/Makefile.in
new file mode 100644
index 0000000..b387b68
--- /dev/null
+++ b/tools/src/h5jam/Makefile.in
@@ -0,0 +1,1464 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5jam$(EXEEXT) h5unjam$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5jam_SOURCES = h5jam.c
+h5jam_OBJECTS = h5jam.$(OBJEXT)
+h5jam_LDADD = $(LDADD)
+h5jam_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 = 
+h5jam_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5jam_LDFLAGS) $(LDFLAGS) -o $@
+h5unjam_SOURCES = h5unjam.c
+h5unjam_OBJECTS = h5unjam.$(OBJEXT)
+h5unjam_LDADD = $(LDADD)
+h5unjam_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5unjam_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5unjam_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 = h5jam.c h5unjam.c
+DIST_SOURCES = h5jam.c h5unjam.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 $(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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Add h5jam and h5unjam specific linker flags here
+h5jam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5unjam_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Link against the main HDF5 library and tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5jam/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5jam/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):
+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
+
+h5jam$(EXEEXT): $(h5jam_OBJECTS) $(h5jam_DEPENDENCIES) $(EXTRA_h5jam_DEPENDENCIES) 
+	@rm -f h5jam$(EXEEXT)
+	$(AM_V_CCLD)$(h5jam_LINK) $(h5jam_OBJECTS) $(h5jam_LDADD) $(LIBS)
+
+h5unjam$(EXEEXT): $(h5unjam_OBJECTS) $(h5unjam_DEPENDENCIES) $(EXTRA_h5unjam_DEPENDENCIES) 
+	@rm -f h5unjam$(EXEEXT)
+	$(AM_V_CCLD)$(h5unjam_LINK) $(h5unjam_OBJECTS) $(h5unjam_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5jam.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5unjam.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-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)
+
+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 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 \
+	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-dyn: $(DYN)
+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 dyn 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/src/h5jam/h5jam.c b/tools/src/h5jam/h5jam.c
new file mode 100644
index 0000000..61de604
--- /dev/null
+++ b/tools/src/h5jam/h5jam.c
@@ -0,0 +1,569 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5jam"
+
+herr_t write_pad(int ofile, hsize_t old_where, hsize_t *new_where);
+hsize_t compute_user_block_size (hsize_t);
+hsize_t copy_some_to_file (int, int, hsize_t, hsize_t, ssize_t);
+void parse_command_line (int, const char *[]);
+
+int do_clobber = FALSE;
+char *output_file = NULL;
+char *input_file = NULL;
+char *ub_file = NULL;
+
+/*
+ * Command-line options: The user can specify short or 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 = "hi:u:o:c:V";  /* add more later ? */
+static struct long_options l_opts[] = {
+  {"help", no_arg, 'h'},
+  {"hel", no_arg, 'h'},
+  {"i", require_arg, 'i'},  /* input file */
+  {"u", require_arg, 'u'},  /* user block file */
+  {"o", require_arg, 'o'},  /* output file */
+  {"clobber", no_arg, 'c'},  /* clobber existing UB */
+  {"clobbe", no_arg, 'c'},
+  {"clobb", no_arg, 'c'},
+  {"clob", no_arg, 'c'},
+  {"clo", no_arg, 'c'},
+  {"cl", no_arg, 'c'},
+  {NULL, 0, '\0'}
+};
+
+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message
+ *
+ * Return:      void
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (const char *prog)
+{
+    HDfflush (stdout);
+    HDfprintf (stdout,
+    "usage: %s -i <in_file.h5> -u <in_user_file> [-o <out_file.h5>] [--clobber]\n", prog);
+    HDfprintf (stdout, "\n");
+    HDfprintf (stdout,
+    "Adds user block to front of an HDF5 file and creates a new concatenated file.\n");
+    HDfprintf (stdout, "\n");
+    HDfprintf (stdout, 
+    "OPTIONS\n");
+    HDfprintf (stdout, 
+    "  -i in_file.h5    Specifies the input HDF5 file.\n");
+    HDfprintf (stdout, 
+    "  -u in_user_file  Specifies the file to be inserted into the user block.\n");
+    HDfprintf (stdout, 
+    "                   Can be any file format except an HDF5 format.\n");
+    HDfprintf (stdout,
+    "  -o out_file.h5   Specifies the output HDF5 file.\n");
+    HDfprintf (stdout,
+    "                   If not specified, the user block will be concatenated in\n");
+    HDfprintf (stdout,
+    "                   place to the input HDF5 file.\n");
+    HDfprintf (stdout,
+    "  --clobber        Wipes out any existing user block before concatenating\n");
+    HDfprintf (stdout,
+    "                   the given user block.\n");
+    HDfprintf (stdout,
+    "                   The size of the new user block will be the larger of;\n");
+    HDfprintf (stdout,
+    "                    - the size of existing user block in the input HDF5 file\n");
+    HDfprintf (stdout,
+    "                    - the size of user block required by new input user file\n");
+    HDfprintf (stdout,
+    "                   (size = 512 x 2N,  N is positive integer.)\n");
+    HDfprintf (stdout, "\n");
+    HDfprintf (stdout,
+    "  -h               Prints a usage message and exits.\n");
+    HDfprintf (stdout,
+    "  -V               Prints the HDF5 library version and exits.\n");
+    HDfprintf (stdout, "\n");
+    HDfprintf (stdout,
+    "Exit Status:\n");
+    HDfprintf (stdout,
+    "   0   Succeeded.\n");
+    HDfprintf (stdout,
+    "   >0  An error occurred.\n");
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown and call exit()
+ *
+ * Return:      Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    if (ub_file)
+        HDfree (ub_file);
+    if (input_file)
+        HDfree (input_file);
+    if (output_file)
+        HDfree (output_file);
+
+    h5tools_close();
+
+    HDexit(ret);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:
+ *
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+parse_command_line (int argc, const char *argv[])
+{
+  int opt = FALSE;
+
+  /* parse command line options */
+  while ((opt = get_option (argc, argv, s_opts, l_opts)) != EOF)
+    {
+      switch ((char) opt)
+      {
+      case 'o':
+          output_file = HDstrdup (opt_arg);
+          break;
+      case 'i':
+          input_file = HDstrdup (opt_arg);
+          break;
+      case 'u':
+          ub_file = HDstrdup (opt_arg);
+          break;
+      case 'c':
+          do_clobber = TRUE;
+          break;
+      case 'h':
+          usage (h5tools_getprogname());
+          leave (EXIT_SUCCESS);
+      case 'V':
+          print_version (h5tools_getprogname());
+          leave (EXIT_SUCCESS);
+      case '?':
+      default:
+          usage (h5tools_getprogname());
+          leave (EXIT_FAILURE);
+      }
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     HDF5 user block jammer
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (int argc, const char *argv[])
+{
+    int         ufid = -1;
+    int         h5fid = -1;
+    int         ofid = -1;
+    void       *edata;
+    H5E_auto2_t func;
+    hid_t       ifile = -1;
+    hid_t       plist = -1;
+    herr_t      status;
+    htri_t      testval;
+    hsize_t     usize;
+    hsize_t     h5fsize;
+    hsize_t     startub;
+    hsize_t     where;
+    hsize_t     newubsize;
+    off_t       fsize;
+    h5_stat_t   sbuf;
+    h5_stat_t   sbuf2;
+    int         res;
+
+    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 (argc, argv);
+
+    if (ub_file == NULL) {
+        /* no user block */
+        error_msg("missing arguemnt for -u <user_file>.\n");
+        help_ref_msg(stderr);
+        leave (EXIT_FAILURE);
+    }
+
+    testval = H5Fis_hdf5 (ub_file);
+
+    if (testval > 0) {
+        error_msg("-u <user_file> cannot be HDF5 file, but it appears to be an HDF5 file.\n");
+        help_ref_msg(stderr);
+        leave (EXIT_FAILURE);
+    }
+
+    if (input_file == NULL) {
+        error_msg("missing arguemnt for -i <HDF5 file>.\n");
+        help_ref_msg(stderr);
+        leave (EXIT_FAILURE);
+    }
+
+    testval = H5Fis_hdf5 (input_file);
+
+    if (testval <= 0) {
+        error_msg("Input HDF5 file \"%s\" is not HDF5 format.\n", input_file);
+        help_ref_msg(stderr);
+        leave (EXIT_FAILURE);
+    }
+
+    ifile = H5Fopen (input_file, H5F_ACC_RDONLY, H5P_DEFAULT);
+
+    if (ifile < 0) {
+        error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
+        leave (EXIT_FAILURE);
+    }
+
+    plist = H5Fget_create_plist (ifile);
+    if (plist < 0) {
+        error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
+        H5Fclose(ifile);
+        leave (EXIT_FAILURE);
+    }
+
+    status = H5Pget_userblock (plist, &usize);
+    if (status < 0) {
+        error_msg("Can't get user block for file \"%s\"\n", input_file);
+        H5Pclose(plist);
+        H5Fclose(ifile);
+        leave (EXIT_FAILURE);
+    }
+
+    H5Pclose(plist);
+    H5Fclose(ifile);
+
+    ufid = HDopen(ub_file, O_RDONLY, 0);
+    if(ufid < 0) {
+        error_msg("unable to open user block file \"%s\"\n", ub_file);
+        leave (EXIT_FAILURE);
+    }
+
+    res = HDfstat(ufid, &sbuf);
+    if(res < 0) {
+        error_msg("Can't stat file \"%s\"\n", ub_file);
+        HDclose (ufid);
+        leave (EXIT_FAILURE);
+    }
+
+    fsize = (off_t)sbuf.st_size;
+
+    h5fid = HDopen(input_file, O_RDONLY, 0);
+    if(h5fid < 0) {
+        error_msg("unable to open HDF5 file for read \"%s\"\n", input_file);
+        HDclose (ufid);
+        leave (EXIT_FAILURE);
+    }
+
+    res = HDfstat(h5fid, &sbuf2);
+    if(res < 0) {
+        error_msg("Can't stat file \"%s\"\n", input_file);
+        HDclose (h5fid);
+        HDclose (ufid);
+        leave (EXIT_FAILURE);
+    }
+
+    h5fsize = (hsize_t)sbuf2.st_size;
+
+    if (output_file == NULL) {
+        ofid = HDopen (input_file, O_WRONLY, 0);
+
+        if (ofid < 0) {
+            error_msg("unable to open output file \"%s\"\n", output_file);
+            HDclose (h5fid);
+            HDclose (ufid);
+            leave (EXIT_FAILURE);
+        }
+    }
+    else {
+        ofid = HDopen (output_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+
+        if (ofid < 0) {
+            error_msg("unable to create output file \"%s\"\n", output_file);
+            HDclose (h5fid);
+            HDclose (ufid);
+            leave (EXIT_FAILURE);
+        }
+    }
+
+    newubsize = compute_user_block_size ((hsize_t) fsize);
+
+    startub = usize;
+
+    if (usize > 0) {
+        if (do_clobber == TRUE) {
+            /* where is max of the current size or the new UB */
+            if (usize > newubsize) {
+                newubsize = usize;
+            }
+            startub = 0;    /*blast the old */
+        }
+        else {
+            /* add new ub to current ublock, pad to new offset */
+            newubsize += usize;
+            newubsize = compute_user_block_size ((hsize_t) newubsize);
+        }
+    }
+
+    /* copy the HDF5 from starting at usize to starting at newubsize:
+     *  makes room at 'from' for new ub */
+    /* if no current ub, usize is 0 */
+    copy_some_to_file (h5fid, ofid, usize, newubsize, (ssize_t) (h5fsize - usize));
+
+    /* copy the old ub to the beginning of the new file */
+    if (!do_clobber) {
+        where = copy_some_to_file (h5fid, ofid, (hsize_t) 0, (hsize_t) 0, (ssize_t) usize);
+    }
+
+    /* copy the new ub to the end of the ub */
+    where = copy_some_to_file (ufid, ofid, (hsize_t) 0, startub, (ssize_t) - 1);
+
+    /* pad the ub */
+    if(write_pad(ofid, where, &where) < 0) {
+        error_msg("Can't pad file \"%s\"\n", output_file);
+        HDclose (h5fid);
+        HDclose (ufid);
+        HDclose (ofid);
+        leave (EXIT_FAILURE);
+    } /* end if */
+
+    if(ub_file)
+        HDfree (ub_file);
+    if(input_file)
+        HDfree (input_file);
+    if(output_file)
+        HDfree (output_file);
+    
+    if(ufid >= 0)
+        HDclose (ufid);
+    if(h5fid >= 0)
+        HDclose (h5fid);
+    if(ofid >= 0)
+        HDclose (ofid);
+
+    return h5tools_getstatus();
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    copy_some_to_file
+ *
+ * Purpose:     Copy part of the input file to output.
+ *      infid: fd of file to read
+ *      outfid: fd of file to write
+ *      startin: offset of where to read from infid
+ *      startout: offset of where to write to outfid
+ *      limit: bytes to read/write
+ *
+ *    If limit is < 0, the entire input file is copied.
+ *
+ *    Note: this routine can be used to copy within
+ *    the same file, i.e., infid and outfid can be the
+ *    same file.
+ *
+ * Return:      Success:    last byte written in the output.
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+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;
+    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);
+        }
+
+        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;
+} /* end copy_some_to_file() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    compute_user_block_size
+ *
+ * Purpose:     Find the offset of the HDF5 header after the user block:
+ *                 align at 0, 512, 1024, etc.
+ *      ublock_size: the size of the user block (bytes).
+ *
+ * Return:      Success:    the location of the header == the size of the
+ *        padded user block.
+ *              Failure:    none
+ *
+ * Return:      Success:    last byte written in the output.
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_CONST hsize_t
+compute_user_block_size(hsize_t ublock_size)
+{
+    hsize_t where = 512;
+
+    if(0 == ublock_size)
+        return 0;
+
+    while(where < ublock_size)
+        where *= 2;
+
+    return where;
+} /* end compute_user_block_size() */
+
+/*
+ *  Write zeroes to fill the file from 'where' to 512, 1024, etc. bytes.
+ *
+ *  Sets new_where to the size of the padded file and
+ *  returns SUCCEED/FAIL.
+ */
+herr_t
+write_pad(int ofile, hsize_t old_where, hsize_t *new_where)
+{
+    unsigned int i;
+    char buf[1];
+    hsize_t psize;
+
+    HDassert(new_where);
+
+    buf[0] = '\0';
+
+    HDlseek(ofile, (off_t)old_where, SEEK_SET);
+
+    psize = compute_user_block_size(old_where);
+    psize -= old_where;
+
+    for(i = 0; i < psize; i++)
+        if(HDwrite(ofile, buf, 1) < 0)
+            return FAIL;
+
+    /* Set the new size of the file. */
+    *new_where = old_where + psize;
+
+    return SUCCEED;
+} /* end write_pad() */
+
diff --git a/tools/src/h5jam/h5unjam.c b/tools/src/h5jam/h5unjam.c
new file mode 100644
index 0000000..1cc8cb3
--- /dev/null
+++ b/tools/src/h5jam/h5unjam.c
@@ -0,0 +1,409 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5unjam"
+
+#define COPY_BUF_SIZE 1024
+
+hsize_t write_pad( int , hsize_t );
+hsize_t compute_pad( hsize_t );
+herr_t copy_to_file( FILE *, FILE * , ssize_t, ssize_t );
+
+int do_delete = FALSE;
+char *output_file = NULL;
+char *input_file = NULL;
+char *ub_file = NULL;
+
+/*
+ * Command-line options: The user can specify short or 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 = "hu:i:o:d:V";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    {"i", require_arg, 'i'},    /* input file */
+    {"u", require_arg, 'u'},    /* user block file */
+    {"o", require_arg, 'o'},    /* output file */
+    {"delete", no_arg, 'd'},    /* delete ub */
+    {"delet", no_arg, 'd'},
+    {"dele", no_arg, 'd'},
+    {"del", no_arg, 'd'},
+    {"de", no_arg, 'd'},
+    { NULL, 0, '\0' }
+};
+
+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message
+ *
+ * Return:      void
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(const char *prog)
+{
+    HDfflush(stdout);
+    HDfprintf(stdout,
+    "usage: %s -i <in_file.h5>  [-o <out_file.h5> ] [-u <out_user_file> | --delete]\n", prog);
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout,
+    "Splits user file and HDF5 file into two files: user block data and HDF5 data.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout,
+    "OPTIONS\n");
+    HDfprintf(stdout,
+    "  -i in_file.h5   Specifies the HDF5 as input.  If the input HDF5 file\n");
+    HDfprintf(stdout,
+    "                  contains no user block, exit with an error message.\n");
+    HDfprintf(stdout,
+    "  -o out_file.h5  Specifies output HDF5 file without a user block.\n");
+    HDfprintf(stdout,
+    "                  If not specified, the user block will be removed from the\n");
+    HDfprintf(stdout,
+    "                  input HDF5 file.\n");
+    HDfprintf(stdout,
+    "  -u out_user_file\n");
+    HDfprintf(stdout,
+    "                  Specifies the output file containing the data from the\n");
+    HDfprintf(stdout,
+    "                  user block.\n");
+    HDfprintf(stdout,
+    "                  Cannot be used with --delete option.\n");
+    HDfprintf(stdout,
+    "  --delete        Remove the user block from the input HDF5 file. The content\n");
+    HDfprintf(stdout,
+    "                  of the user block is discarded.\n");
+    HDfprintf(stdout,
+    "                  Cannot be used with the -u option.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout,
+    "  -h              Prints a usage message and exits.\n");
+    HDfprintf(stdout,
+    "  -V              Prints the HDF5 library version and exits.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout,
+    "  If neither --delete nor -u is specified, the user block from the input file\n");
+    HDfprintf(stdout,
+    "  will be displayed to stdout.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout,
+    "Exit Status:\n");
+    HDfprintf(stdout,
+    "  0      Succeeded.\n");
+    HDfprintf(stdout,
+    "  >0    An error occurred.\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:    EXIT_SUCCESS;
+ *
+ *              Failure:    Exits function with EXIT_FAILURE value.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_command_line(int argc, const char *argv[])
+{
+    int opt = FALSE;
+	
+   /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+        switch((char)opt) {
+            case 'o':
+                output_file = HDstrdup(opt_arg);
+				if (output_file)
+				    h5tools_set_data_output_file(output_file, 1);
+	            break;
+
+            case 'i':
+                input_file = HDstrdup(opt_arg);
+				if (input_file)
+   				    h5tools_set_input_file(input_file, 1);
+	            break;;
+
+            case 'u':
+                ub_file = HDstrdup(opt_arg);
+				if (ub_file)
+				    h5tools_set_output_file(ub_file, 1);
+				else 
+				    rawoutstream = stdout;			
+                break;
+
+            case 'd':
+                do_delete = TRUE;
+                break;
+
+            case 'h':
+                usage(h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                goto done;
+
+            case 'V':
+                print_version (h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                goto done;
+
+            case '?':
+            default:
+                usage(h5tools_getprogname());
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+        }
+    }
+
+    return EXIT_SUCCESS;
+    
+done:
+    if(input_file)
+        HDfree(input_file);
+    if(output_file)
+        HDfree(output_file);
+    if(ub_file)
+        HDfree(ub_file);
+
+    return EXIT_FAILURE;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     HDF5 user block unjammer
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    void               *edata;
+    H5E_auto2_t         func;
+    hid_t               ifile = -1;
+    hid_t               plist = -1;
+    off_t               fsize;
+    hsize_t             usize;
+    htri_t              testval;
+    herr_t              status;
+    int                 res;
+    h5_stat_t           sbuf;
+
+    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();
+
+    if(EXIT_FAILURE == parse_command_line(argc, argv))
+        goto done;
+
+    if (input_file == NULL) {
+        /* no user block  */
+        error_msg("missing arguemnt for HDF5 file input.\n");
+        help_ref_msg(stderr);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+  
+    testval = H5Fis_hdf5(input_file);
+
+    if (testval <= 0) {
+        error_msg("Input HDF5 file \"%s\" is not HDF\n", input_file);
+        help_ref_msg (stderr);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    ifile = H5Fopen(input_file, H5F_ACC_RDONLY , H5P_DEFAULT);
+
+    if (ifile < 0) {
+        error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    plist = H5Fget_create_plist(ifile);
+    if (plist < 0) {
+        error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    status = H5Pget_userblock(plist, & usize);
+    if (status < 0) {
+        error_msg("Can't get user block for file \"%s\"\n", input_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    status = H5Pclose(plist);
+    HDassert(status >= 0);
+    status = H5Fclose(ifile);
+    HDassert(status >= 0);
+
+    if (usize == 0) {
+  /* no user block to remove: message? */
+        error_msg("\"%s\" has no user block: no change to file\n", input_file);
+        h5tools_setstatus(EXIT_SUCCESS);
+        goto done;
+    }
+
+    res = HDfstat(HDfileno(rawinstream), &sbuf);
+    if(res < 0) {
+        error_msg("Can't stat file \"%s\"\n", input_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    fsize = sbuf.st_size;
+
+    if (do_delete && (ub_file != NULL)) {
+        error_msg("??\"%s\"\n", ub_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    if (output_file == NULL) {
+            error_msg("unable to open output HDF5 file \"%s\"\n", input_file);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+    } 
+
+    /* copy from 0 to 'usize - 1' into ufid  */
+    if (!do_delete) {
+        if(copy_to_file(rawinstream, rawoutstream, 0, (ssize_t) usize) < 0) {
+            error_msg("unable to copy user block to output file \"%s\"\n", ub_file);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+    }
+
+    /* copy from usize to end of file into h5fid,
+     * starting at end of user block if present */
+   if(copy_to_file(rawinstream, rawdatastream, (ssize_t) usize, (ssize_t)(fsize - (ssize_t)usize)) < 0) {
+        error_msg("unable to copy hdf5 data to output file \"%s\"\n", output_file);
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+ 
+done:
+    if(input_file)
+        HDfree(input_file);
+		
+    if(output_file)
+        HDfree(output_file);
+		
+    if(ub_file) {
+        HDfree(ub_file);
+    }
+	   
+    h5tools_close();
+
+    return h5tools_getstatus();
+}
+
+/*
+ *  Copy 'how_much' bytes from the input file to the output file,
+ *  starting at byte 'where' in the input file.
+ *
+ *  Returns 0 on success, -1 on failure.
+ */
+herr_t
+copy_to_file( FILE *infid, FILE *ofid, ssize_t _where, ssize_t show_much )
+{
+    static char buf[COPY_BUF_SIZE];
+    size_t how_much;
+    off_t where = (off_t)_where;
+    off_t to;
+    off_t from;
+    herr_t ret_value = 0;
+
+    /* nothing to copy */
+    if(show_much <= 0)
+        goto done;
+    how_much = (size_t)show_much;
+
+    /* rewind */
+    HDfseek(infid, 0L, 0);
+
+    from = where;
+    to = 0;
+    while(how_much > 0) {
+        size_t bytes_in        = 0;    /* # of bytes to read       */
+        size_t bytes_read      = 0;    /* # of bytes actually read */
+        size_t bytes_wrote     = 0;    /* # of bytes written   */
+
+        if (how_much > COPY_BUF_SIZE)
+            bytes_in = COPY_BUF_SIZE;
+        else
+            bytes_in = how_much;
+
+			/* Seek to correct position in input file */
+        HDfseek(infid, from, SEEK_SET);
+
+        /* Read data to buffer */
+        bytes_read = HDfread(buf, (size_t)1, bytes_in, infid);
+        if(0 == bytes_read && HDferror(infid)) {
+            ret_value = -1;
+            goto done;
+        } /* end if */
+        if(0 == bytes_read && HDfeof(infid)) {
+            goto done;
+        } /* end if */
+
+        /* Seek to correct position in output file */
+        HDfseek(ofid, to, SEEK_SET);
+
+        /* Update positions/size */
+        how_much -= bytes_read;
+        from += (off_t)bytes_read;
+        to += (off_t)bytes_read;
+
+       /* Write nchars bytes to output file */
+		bytes_wrote = HDfwrite(buf, (size_t)1, bytes_read, ofid);
+		if(bytes_wrote != bytes_read || (0 == bytes_wrote && HDferror(ofid))) { /* error */
+			ret_value = -1;
+			goto done;
+		} /* end if */
+    } /* end while */
+
+done:
+    return ret_value;
+}  /* end copy_to_file */
+
diff --git a/tools/src/h5ls/CMakeLists.txt b/tools/src/h5ls/CMakeLists.txt
new file mode 100644
index 0000000..2e23634
--- /dev/null
+++ b/tools/src/h5ls/CMakeLists.txt
@@ -0,0 +1,54 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5LS)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+#-----------------------------------------------------------------------------
+# Add the h5ls executable
+#-----------------------------------------------------------------------------
+add_executable (h5ls ${HDF5_TOOLS_SRC_H5LS_SOURCE_DIR}/h5ls.c)
+TARGET_NAMING (h5ls STATIC)
+TARGET_C_PROPERTIES (h5ls STATIC " " " ")
+target_link_libraries (h5ls  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5ls PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5ls")
+
+set (H5_DEP_EXECUTABLES h5ls)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5ls-shared ${HDF5_TOOLS_SRC_H5LS_SOURCE_DIR}/h5ls.c)
+  TARGET_NAMING (h5ls-shared SHARED)
+  TARGET_C_PROPERTIES (h5ls-shared SHARED " " " ")
+  target_link_libraries (h5ls-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5ls-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5ls-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5ls-shared)
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5ls-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5ls ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5ls/Makefile.am b/tools/src/h5ls/Makefile.am
new file mode 100644
index 0000000..07279c1
--- /dev/null
+++ b/tools/src/h5ls/Makefile.am
@@ -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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# This is our main target, the h5ls tool
+bin_PROGRAMS=h5ls
+
+# Add h5ls specific linker flags here
+h5ls_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5ls/Makefile.in b/tools/src/h5ls/Makefile.in
new file mode 100644
index 0000000..798645d
--- /dev/null
+++ b/tools/src/h5ls/Makefile.in
@@ -0,0 +1,1451 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5ls$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5ls_SOURCES = h5ls.c
+h5ls_OBJECTS = h5ls.$(OBJEXT)
+h5ls_LDADD = $(LDADD)
+h5ls_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 = 
+h5ls_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5ls_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 = h5ls.c
+DIST_SOURCES = h5ls.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 $(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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Add h5ls specific linker flags here
+h5ls_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5ls/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5ls/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):
+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
+
+h5ls$(EXEEXT): $(h5ls_OBJECTS) $(h5ls_DEPENDENCIES) $(EXTRA_h5ls_DEPENDENCIES) 
+	@rm -f h5ls$(EXEEXT)
+	$(AM_V_CCLD)$(h5ls_LINK) $(h5ls_OBJECTS) $(h5ls_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5ls.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-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)
+
+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 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 \
+	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-dyn: $(DYN)
+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 dyn 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/src/h5ls/h5ls.c b/tools/src/h5ls/h5ls.c
new file mode 100644
index 0000000..8e28d82
--- /dev/null
+++ b/tools/src/h5ls/h5ls.c
@@ -0,0 +1,2938 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, March 23, 1998
+ */
+
+
+/*
+ * We include the private header file so we can get to the uniform
+ * programming environment it declares.  Other than that, h5ls only calls
+ * HDF5 API functions (except for H5G_basename())
+ */
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_dump.h"
+#include "h5trav.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5ls"
+
+#define NAME_BUF_SIZE   2048
+/*
+ *  Alternative formating for data dumped by H5LS
+ *
+ *  This table only affects H5LS output.
+ */
+static h5tool_format_t         ls_dataformat = {
+        0, /*raw */
+
+        "", /*fmt_raw */
+        "%d", /*fmt_int */
+        "%u", /*fmt_uint */
+        "%hhd", /*fmt_schar */
+        "%u", /*fmt_uchar */
+        "%d", /*fmt_short */
+        "%u", /*fmt_ushort */
+        "%ld", /*fmt_long */
+        "%lu", /*fmt_ulong */
+        NULL, /*fmt_llong */
+        NULL, /*fmt_ullong */
+        "%g", /*fmt_double */
+        "%g", /*fmt_float */
+
+        0, /*ascii */
+        0, /*str_locale */
+        0, /*str_repeat */
+
+        "[", /*arr_pre */
+        ",", /*arr_sep */
+        "]", /*arr_suf */
+        1, /*arr_linebreak */
+
+        "", /*cmpd_name */
+        ",", /*cmpd_sep */
+        "{", /*cmpd_pre */
+        "}", /*cmpd_suf */
+        "", /*cmpd_end */
+        NULL, /* cmpd_listv */
+
+        ",", /*vlen_sep */
+        "(", /*vlen_pre */
+        ")", /*vlen_suf */
+        "", /*vlen_end */
+
+        "%s", /*elmt_fmt */
+        ",", /*elmt_suf1 */
+        " ", /*elmt_suf2 */
+
+        HSIZE_T_FORMAT, /*idx_n_fmt */
+        ",", /*idx_sep */
+        "(%s)", /*idx_fmt */
+
+        65535, /*line_ncols *//*standard default columns */
+        0, /*line_per_line */
+        "", /*line_pre */
+        "%s", /*line_1st */
+        "%s", /*line_cont */
+        "", /*line_suf */
+        "", /*line_sep */
+        1, /*line_multi_new */
+        "", /*line_indent */
+
+        0, /*skip_first */
+
+        0, /*obj_hidefileno */
+        "-%lu:"H5_PRINTF_HADDR_FMT, /*obj_format */
+
+        0, /*dset_hidefileno */
+        "DSET-%s ", /*dset_format */
+        "%sBlk%lu: ", /*dset_blockformat_pre */
+        "%sPt%lu: ", /*dset_ptformat_pre */
+        "%s", /*dset_ptformat */
+        1, /*array indices */
+        1 /*escape non printable characters */
+};
+
+/* Struct to pass through to visitors */
+typedef struct {
+    const char *fname;                  /* Filename */
+    hid_t fid;                          /* File ID */
+    hid_t gid;                          /* Group ID */
+    hbool_t symlink_target;                 /* Whether this is the target of an symbolic link */
+    symlink_trav_t *symlink_list;       /* List of visited symbolic links */
+    size_t base_len;                    /* Length of base path name, if not root */
+    size_t name_start;                  /* # of leading characters to strip off path names on output */
+}iter_t;
+
+/* Command-line switches */
+static int      verbose_g = 0;            /* lots of extra output */
+static int      width_g = 80;             /* output width in characters */
+static hbool_t  address_g = FALSE;        /* print raw data addresses */
+static hbool_t  data_g = FALSE;           /* display dataset values? */
+static hbool_t  label_g = FALSE;          /* label compound values? */
+static hbool_t  string_g = FALSE;         /* print 1-byte numbers as ASCII? */
+static hbool_t  fullname_g = FALSE;       /* print full path names */
+static hbool_t  recursive_g = FALSE;      /* recursive descent listing */
+static hbool_t  follow_symlink_g = FALSE; /* follow symbolic links */
+static hbool_t  no_dangling_link_g = FALSE; /* treat dangling link is error */
+static hbool_t  follow_elink_g = FALSE;   /* follow external links */
+static hbool_t  grp_literal_g = FALSE;    /* list group, not contents */
+static hbool_t  hexdump_g = FALSE;        /* show data as raw hexadecimal */
+static hbool_t  show_errors_g = FALSE;    /* print HDF5 error messages */
+static hbool_t  simple_output_g = FALSE;  /* make output more machine-readable */
+static hbool_t  show_file_name_g = FALSE; /* show file name for full names */
+static hbool_t  no_line_wrap_g = FALSE;   /* show data content without line wrap */
+static hbool_t  display_root_g = FALSE;   /* show root group in output? */
+
+/* Information about how to display each type of object */
+static struct dispatch_t {
+    const char *name;
+    hid_t (*open)(hid_t loc, const char *name, hid_t apl_id);
+    herr_t (*close)(hid_t obj);
+    herr_t (*list1)(hid_t obj);
+    herr_t (*list2)(hid_t obj, const char *name);
+} dispatch_g[H5O_TYPE_NTYPES];
+
+#define DISPATCH(TYPE, NAME, LIST1, LIST2) {         \
+    dispatch_g[TYPE].name = (NAME);             \
+    dispatch_g[TYPE].list1 = (LIST1);           \
+    dispatch_g[TYPE].list2 = (LIST2);           \
+}
+
+static void print_type(h5tools_str_t *buffer, hid_t type, int ind);
+static hbool_t print_int_type(h5tools_str_t *buffer, hid_t type, int ind);
+static hbool_t print_float_type(h5tools_str_t *buffer, hid_t type, int ind);
+static herr_t visit_obj(hid_t file, const char *oname, iter_t *iter);
+
+

+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, July 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (void)
+{
+    FLUSHSTREAM(rawoutstream);
+    PRINTVALSTREAM(rawoutstream, "usage: h5ls [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]\n");
+    PRINTVALSTREAM(rawoutstream, "  OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "   -h, -?, --help  Print a usage message and exit\n");
+    PRINTVALSTREAM(rawoutstream, "   -a, --address   Print raw data address.  If dataset is contiguous, address\n");
+    PRINTVALSTREAM(rawoutstream, "                   is offset in file of beginning of raw data. If chunked,\n");
+    PRINTVALSTREAM(rawoutstream, "                   returned list of addresses indicates offset of each chunk.\n");
+    PRINTVALSTREAM(rawoutstream, "                   Must be used with -v, --verbose option.\n");
+    PRINTVALSTREAM(rawoutstream, "                   Provides no information for non-dataset objects.\n");
+    PRINTVALSTREAM(rawoutstream, "   -d, --data      Print the values of datasets\n");
+    PRINTVALSTREAM(rawoutstream, "   --enable-error-stack\n");
+    PRINTVALSTREAM(rawoutstream, "                   Prints messages from the HDF5 error stack as they occur.\n");
+    PRINTVALSTREAM(rawoutstream, "   --follow-symlinks\n");
+    PRINTVALSTREAM(rawoutstream, "                   Follow symbolic links (soft links and external links)\n");
+    PRINTVALSTREAM(rawoutstream, "                   to display target object information.\n");
+    PRINTVALSTREAM(rawoutstream, "                   Without this option, h5ls identifies a symbolic link\n");
+    PRINTVALSTREAM(rawoutstream, "                   as a soft link or external link and prints the value\n");
+    PRINTVALSTREAM(rawoutstream, "                   assigned to the symbolic link; it does not provide any\n");
+    PRINTVALSTREAM(rawoutstream, "                   information regarding the target object or determine\n");
+    PRINTVALSTREAM(rawoutstream, "                   whether the link is a dangling link.\n");
+    PRINTVALSTREAM(rawoutstream, "   --no-dangling-links\n");
+    PRINTVALSTREAM(rawoutstream, "                   Must be used with --follow-symlinks option;\n");
+    PRINTVALSTREAM(rawoutstream, "                   otherwise, h5ls shows error message and returns an exit\n");
+    PRINTVALSTREAM(rawoutstream, "                   code of 1. \n");
+    PRINTVALSTREAM(rawoutstream, "                   Check for any symbolic links (soft links or external links)\n");
+    PRINTVALSTREAM(rawoutstream, "                   that do not resolve to an existing object (dataset, group,\n");
+    PRINTVALSTREAM(rawoutstream, "                   or named datatype).\n");
+    PRINTVALSTREAM(rawoutstream, "                   If any dangling link is found, this situation is treated\n");
+    PRINTVALSTREAM(rawoutstream, "                   as an error and h5ls returns an exit code of 1.\n");
+    PRINTVALSTREAM(rawoutstream, "   -f, --full      Print full path names instead of base names\n");
+    PRINTVALSTREAM(rawoutstream, "   -g, --group     Show information about a group, not its contents\n");
+    PRINTVALSTREAM(rawoutstream, "   -l, --label     Label members of compound datasets\n");
+    PRINTVALSTREAM(rawoutstream, "   -r, --recursive List all groups recursively, avoiding cycles\n");
+    PRINTVALSTREAM(rawoutstream, "   -s, --string    Print 1-byte integer datasets as ASCII\n");
+    PRINTVALSTREAM(rawoutstream, "   -S, --simple    Use a machine-readable output format\n");
+    PRINTVALSTREAM(rawoutstream, "   -wN, --width=N  Set the number of columns of output\n");
+    PRINTVALSTREAM(rawoutstream, "   -v, --verbose   Generate more verbose output\n");
+    PRINTVALSTREAM(rawoutstream, "   -V, --version   Print version number and exit\n");
+    PRINTVALSTREAM(rawoutstream, "   --vfd=DRIVER    Use the specified virtual file driver\n");
+    PRINTVALSTREAM(rawoutstream, "   -x, --hexdump   Show raw data in hexadecimal format\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  file/OBJECT\n");
+    PRINTVALSTREAM(rawoutstream, "    Each object consists of an HDF5 file name optionally followed by a\n");
+    PRINTVALSTREAM(rawoutstream, "    slash and an object name within the file (if no object is specified\n");
+    PRINTVALSTREAM(rawoutstream, "    within the file then the contents of the root group are displayed).\n");
+    PRINTVALSTREAM(rawoutstream, "    The file name may include a printf(3C) integer format such as\n");
+    PRINTVALSTREAM(rawoutstream, "    \"%%05d\" to open a file family.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "  Deprecated Options\n");
+    PRINTVALSTREAM(rawoutstream, "    The following options have been deprecated in HDF5. While they remain\n");
+    PRINTVALSTREAM(rawoutstream, "    available, they have been superseded as indicated and may be removed\n");
+    PRINTVALSTREAM(rawoutstream, "    from HDF5 in the future. Use the indicated replacement option in all\n");
+    PRINTVALSTREAM(rawoutstream, "    new work; where possible, existing scripts, et cetera, should also be\n");
+    PRINTVALSTREAM(rawoutstream, "    updated to use the replacement option.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   -E or --external   Follow external links.\n");
+    PRINTVALSTREAM(rawoutstream, "                      Replaced by --follow-symlinks.\n");
+    PRINTVALSTREAM(rawoutstream, "   -e, --errors       Show all HDF5 error reporting\n");
+    PRINTVALSTREAM(rawoutstream, "                      Replaced by --enable-error-stack.\n");
+}
+
+

+
+/*-------------------------------------------------------------------------
+ * Function: print_string
+ *
+ * Purpose: Print a string value by escaping unusual characters. If
+ *  STREAM is null then we only count how large the output would
+ *  be.
+ *
+ * Return: Number of characters printed.
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+print_string(h5tools_str_t *buffer, const char *s, hbool_t escape_spaces)
+{
+    int  nprint=0;
+
+    for (/*void*/; s && *s; s++) {
+        switch (*s) {
+            case '"':
+                if (buffer) h5tools_str_append(buffer, "\\\"");
+                nprint += 2;
+                break;
+            case '\\':
+                if (buffer) h5tools_str_append(buffer, "\\\\");
+                nprint += 2;
+                break;
+            case '\b':
+                if (buffer) h5tools_str_append(buffer, "\\b");
+                nprint += 2;
+                break;
+            case '\f':
+                if (buffer) h5tools_str_append(buffer, "\\f");
+                nprint += 2;
+                break;
+            case '\n':
+                if (buffer) h5tools_str_append(buffer, "\\n");
+                nprint += 2;
+                break;
+            case '\r':
+                if (buffer) h5tools_str_append(buffer, "\\r");
+                nprint += 2;
+                break;
+            case '\t':
+                if (buffer) h5tools_str_append(buffer, "\\t");
+                nprint += 2;
+                break;
+            case ' ':
+                if (escape_spaces) {
+                    if (buffer) h5tools_str_append(buffer, "\\ ");
+                    nprint += 2;
+                }
+                else {
+                    if (buffer) h5tools_str_append(buffer, " ");
+                    nprint++;
+                }
+                break;
+            default:
+                if (isprint((int)*s)) {
+                    if (buffer) h5tools_str_append(buffer, "%c", *s);
+                    nprint++;
+                }
+                else {
+                    if (buffer) h5tools_str_append(buffer, "\\%03o", *((const unsigned char*)s));
+                    nprint += 4;
+                }
+                break;
+        }
+    }
+    return nprint;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_obj_name
+ *
+ * Purpose: Print an object name and another string.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, November  6, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+print_obj_name(h5tools_str_t *buffer, const iter_t *iter, const char *oname,
+    const char *s)
+{
+    static char fullname[NAME_BUF_SIZE];     /* Buffer for file and/or object name */
+    const char *name = fullname;                /* Pointer to buffer for printing */
+    int  n;
+
+    if(show_file_name_g)
+        HDsnprintf(fullname, sizeof(fullname), "%s/%s", iter->fname, oname + iter->name_start);
+    else
+        name = oname + iter->name_start;
+
+    /* Print the object name, either full name or base name */
+    if(fullname_g)
+        n = print_string(buffer, name, TRUE);
+    else {
+        const char *last_sep;   /* The location of the last group separator */
+
+        /* Find the last component of the path name */
+        if(NULL == (last_sep = HDstrrchr(name, '/')))
+            last_sep = name;
+        else {
+            last_sep++;
+        } /* end else */
+        n = print_string(buffer, last_sep, TRUE);
+    } /* end else */
+    h5tools_str_append(buffer, "%*s ", MAX(0, (24 - n)), s);
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_native_type
+ *
+ * Purpose: Prints the name of a native C data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed.
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-11
+ *  Added the C9x types, but we still prefer to display the types
+ *  from the C language itself (like `int' vs. `int32_t').
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_native_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    if(!simple_output_g) {
+        if (H5Tequal(type, H5T_NATIVE_SCHAR)==TRUE) {
+            h5tools_str_append(buffer, "native signed char");
+        } else if (H5Tequal(type, H5T_NATIVE_UCHAR)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned char");
+        } else if (H5Tequal(type, H5T_NATIVE_INT)==TRUE) {
+            h5tools_str_append(buffer, "native int");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned int");
+        } else if (H5Tequal(type, H5T_NATIVE_SHORT)==TRUE) {
+            h5tools_str_append(buffer, "native short");
+        } else if (H5Tequal(type, H5T_NATIVE_USHORT)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned short");
+        } else if (H5Tequal(type, H5T_NATIVE_LONG)==TRUE) {
+            h5tools_str_append(buffer, "native long");
+        } else if (H5Tequal(type, H5T_NATIVE_ULONG)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned long");
+        } else if (H5Tequal(type, H5T_NATIVE_LLONG)==TRUE) {
+            h5tools_str_append(buffer, "native long long");
+        } else if (H5Tequal(type, H5T_NATIVE_ULLONG)==TRUE) {
+            h5tools_str_append(buffer, "native unsigned long long");
+        } else if (H5Tequal(type, H5T_NATIVE_FLOAT)==TRUE) {
+            h5tools_str_append(buffer, "native float");
+        } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)==TRUE) {
+            h5tools_str_append(buffer, "native double");
+#if H5_SIZEOF_LONG_DOUBLE !=0
+        } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)==TRUE) {
+            h5tools_str_append(buffer, "native long double");
+#endif
+        } else if (H5Tequal(type, H5T_NATIVE_INT8)==TRUE) {
+            h5tools_str_append(buffer, "native int8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT8)==TRUE) {
+            h5tools_str_append(buffer, "native uint8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT16)==TRUE) {
+            h5tools_str_append(buffer, "native int16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT16)==TRUE) {
+            h5tools_str_append(buffer, "native uint16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT32)==TRUE) {
+            h5tools_str_append(buffer, "native int32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT32)==TRUE) {
+            h5tools_str_append(buffer, "native uint32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT64)==TRUE) {
+            h5tools_str_append(buffer, "native int64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT64)==TRUE) {
+            h5tools_str_append(buffer, "native uint64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST8)==TRUE) {
+            h5tools_str_append(buffer, "native int_least8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST8)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST16)==TRUE) {
+            h5tools_str_append(buffer, "native int_least16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST16)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST32)==TRUE) {
+            h5tools_str_append(buffer, "native int_least32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST32)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_LEAST64)==TRUE) {
+            h5tools_str_append(buffer, "native int_least64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_LEAST64)==TRUE) {
+            h5tools_str_append(buffer, "native uint_least64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST8)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST8)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast8_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST16)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST16)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast16_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST32)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST32)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast32_t");
+        } else if (H5Tequal(type, H5T_NATIVE_INT_FAST64)==TRUE) {
+            h5tools_str_append(buffer, "native int_fast64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_UINT_FAST64)==TRUE) {
+            h5tools_str_append(buffer, "native uint_fast64_t");
+        } else if (H5Tequal(type, H5T_NATIVE_B8)==TRUE) {
+            h5tools_str_append(buffer, "native 8-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B16)==TRUE) {
+            h5tools_str_append(buffer, "native 16-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B32)==TRUE) {
+            h5tools_str_append(buffer, "native 32-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_B64)==TRUE) {
+            h5tools_str_append(buffer, "native 64-bit field");
+        } else if (H5Tequal(type, H5T_NATIVE_HSIZE)==TRUE) {
+            h5tools_str_append(buffer, "native hsize_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HSSIZE)==TRUE) {
+            h5tools_str_append(buffer, "native hssize_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HERR)==TRUE) {
+            h5tools_str_append(buffer, "native herr_t");
+        } else if (H5Tequal(type, H5T_NATIVE_HBOOL)==TRUE) {
+            h5tools_str_append(buffer, "native hbool_t");
+        } else {
+            return print_int_type(buffer, type, ind);
+        }
+    } else {
+        return print_int_type(buffer, type, ind);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_ieee_type
+ *
+ * Purpose: Print the name of an IEEE floating-point data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+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");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F32LE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 32-bit little-endian float");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F64BE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 64-bit big-endian float");
+    }
+    else if (H5Tequal(type, H5T_IEEE_F64LE)==TRUE) {
+        h5tools_str_append(buffer, "IEEE 64-bit little-endian float");
+    }
+    else {
+        return print_float_type(buffer, type, ind);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_precision
+ *
+ * Purpose: Prints information on the next line about precision and
+ *  padding if the precision is less than the total data type
+ *  size.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_precision(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    size_t      prec;           /* precision */
+    H5T_pad_t   plsb, pmsb;     /* lsb and msb padding */
+    const char  *plsb_s=NULL;   /* lsb padding string */
+    const char  *pmsb_s=NULL;   /* msb padding string */
+    size_t      nbits;          /* number of bits */
+
+    /* If the precision is less than the total size then show the precision
+     * and offset on the following line.  Also display the padding
+     * information. */
+    if(8 * H5Tget_size(type) != (prec = H5Tget_precision(type))) {
+        h5tools_str_append(buffer, "\n%*s(%lu bit%s of precision beginning at bit %lu)",
+            ind, "", (unsigned long)prec, 1 == prec ? "" : "s",
+            (unsigned long)H5Tget_offset(type));
+
+        H5Tget_pad(type, &plsb, &pmsb);
+        if(H5Tget_offset(type) > 0) {
+            switch(plsb) {
+                case H5T_PAD_ZERO:
+                    plsb_s = "zero";
+                    break;
+                case H5T_PAD_ONE:
+                    plsb_s = "one";
+                    break;
+                case H5T_PAD_BACKGROUND:
+                    plsb_s = "bkg";
+                    break;
+                case H5T_PAD_ERROR:
+                case H5T_NPAD:
+                    plsb_s = "unknown";
+                    break;
+                default:
+                    break;
+            }
+        }
+        if((unsigned)H5Tget_offset(type) + prec < 8 * H5Tget_size(type)) {
+            switch(pmsb) {
+                case H5T_PAD_ZERO:
+                    pmsb_s = "zero";
+                    break;
+                case H5T_PAD_ONE:
+                    pmsb_s = "one";
+                    break;
+                case H5T_PAD_BACKGROUND:
+                    pmsb_s = "bkg";
+                    break;
+                case H5T_PAD_ERROR:
+                case H5T_NPAD:
+                    pmsb_s = "unknown";
+                    break;
+                default:
+                    break;
+            }
+        }
+        if (plsb_s || pmsb_s) {
+            h5tools_str_append(buffer, "\n%*s(", ind, "");
+            if (plsb_s) {
+                nbits = (unsigned)H5Tget_offset(type);
+                h5tools_str_append(buffer, "%lu %s bit%s at bit 0",
+                        (unsigned long)nbits, plsb_s, 1 == nbits ? "" : "s");
+            }
+            if (plsb_s && pmsb_s) h5tools_str_append(buffer, ", ");
+            if (pmsb_s) {
+                nbits = (8 * H5Tget_size(type)) - ((unsigned)H5Tget_offset(type) + prec);
+                h5tools_str_append(buffer, "%lu %s bit%s at bit %lu",
+                        (unsigned long)nbits, pmsb_s, 1 == nbits ? "" : "s",
+                        (unsigned long)(8 * H5Tget_size(type) - nbits));
+            }
+            h5tools_str_append(buffer, ")");
+        }
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_int_type
+ *
+ * Purpose: Print the name of an integer data type.  Common information
+ *  like number of bits, byte order, and sign scheme appear on
+ *  the first line. Additional information might appear in
+ *  parentheses on the following lines.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_int_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+    H5T_sign_t  sign;           /* sign scheme value */
+    const char  *sign_s=NULL;   /* sign scheme string */
+
+    if (H5T_INTEGER!=H5Tget_class(type)) return FALSE;
+
+    /* Byte order */
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        }
+        else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        }
+        else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        }
+        else {
+            order_s = " unknown-byte-order";
+        }
+    }
+    else {
+        order_s = "";
+    }
+
+    /* Sign */
+    if ((sign=H5Tget_sign(type))>=0) {
+        if (H5T_SGN_NONE==sign) {
+            sign_s = " unsigned";
+        }
+        else if (H5T_SGN_2==sign) {
+            sign_s = "";
+        }
+        else {
+            sign_s = " unknown-sign";
+        }
+    }
+    else {
+        sign_s = " unknown-sign";
+    }
+
+    /* Print size, order, and sign on first line, precision and padding
+     * information on the subsequent lines */
+    h5tools_str_append(buffer, "%lu-bit%s%s integer",
+            (unsigned long)(8*H5Tget_size(type)), order_s, sign_s);
+    print_precision(buffer, type, ind);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_float_type
+ *
+ * Purpose: Print info about a floating point data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_float_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+    size_t      spos;           /* sign bit position */
+    size_t      esize, epos;    /* exponent size and position */
+    size_t      msize, mpos;    /* significand size and position */
+    size_t      ebias;          /* exponent bias */
+    H5T_norm_t  norm;           /* significand normalization */
+    const char  *norm_s=NULL;   /* normalization string */
+    H5T_pad_t   pad;            /* internal padding value */
+    const char  *pad_s=NULL;    /* internal padding string */
+
+    if (H5T_FLOAT!=H5Tget_class(type)) return FALSE;
+
+    /* Byte order */
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        }
+        else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        }
+        else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        }
+        else {
+            order_s = " unknown-byte-order";
+        }
+    }
+    else {
+        order_s = "";
+    }
+
+    /* Print size and byte order on first line, precision and padding on
+     * subsequent lines. */
+    h5tools_str_append(buffer, "%lu-bit%s floating-point",
+        (unsigned long)(8*H5Tget_size(type)), order_s);
+    print_precision(buffer, type, ind);
+
+    /* Print sizes, locations, and other information about each field */
+    H5Tget_fields (type, &spos, &epos, &esize, &mpos, &msize);
+    ebias = H5Tget_ebias(type);
+    norm = H5Tget_norm(type);
+    switch (norm) {
+        case H5T_NORM_IMPLIED:
+            norm_s = ", msb implied";
+            break;
+        case H5T_NORM_MSBSET:
+            norm_s = ", msb always set";
+            break;
+        case H5T_NORM_NONE:
+            norm_s = ", no normalization";
+            break;
+        case H5T_NORM_ERROR:
+            norm_s = ", unknown normalization";
+            break;
+        default:
+            ;
+        break;
+    }
+    h5tools_str_append(buffer, "\n%*s(significant for %lu bit%s at bit %lu%s)", ind, "",
+            (unsigned long)msize, 1==msize?"":"s", (unsigned long)mpos,
+            norm_s);
+    h5tools_str_append(buffer, "\n%*s(exponent for %lu bit%s at bit %lu, bias is 0x%lx)",
+            ind, "", (unsigned long)esize, 1==esize?"":"s",
+            (unsigned long)epos, (unsigned long)ebias);
+    h5tools_str_append(buffer, "\n%*s(sign bit at %lu)", ind, "", (unsigned long)spos);
+
+    /* Display internal padding */
+    if (1+esize+msize<H5Tget_precision(type)) {
+        pad = H5Tget_inpad(type);
+        switch (pad) {
+            case H5T_PAD_ZERO:
+                pad_s = "zero";
+                break;
+            case H5T_PAD_ONE:
+                pad_s = "one";
+                break;
+            case H5T_PAD_BACKGROUND:
+                pad_s = "bkg";
+                break;
+            case H5T_PAD_ERROR:
+            case H5T_NPAD:
+                pad_s = "unknown";
+                break;
+            default:
+                ;
+            break;
+        }
+        h5tools_str_append(buffer, "\n%*s(internal padding bits are %s)", ind, "", pad_s);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_cmpd_type
+ *
+ * Purpose: Print info about a compound data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_cmpd_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    char        *name=NULL;     /* member name */
+    size_t      size;           /* total size of type in bytes */
+    hid_t       subtype;        /* member data type */
+    int         nmembs;         /* number of members */
+    int         n;              /* miscellaneous counters */
+    unsigned    i;              /* miscellaneous counters */
+
+    if(H5T_COMPOUND != H5Tget_class(type))
+        return FALSE;
+    if((nmembs = H5Tget_nmembers(type)) < 0)
+        return FALSE;
+
+    h5tools_str_append(buffer, "struct {");
+    for(i = 0; i < (unsigned)nmembs; i++) {
+
+        /* Name and offset */
+        name = H5Tget_member_name(type, i);
+        h5tools_str_append(buffer, "\n%*s\"", ind+4, "");
+        n = print_string(buffer, name, FALSE);
+        h5tools_str_append(buffer, "\"%*s +%-4lu ", MAX(0, 16-n), "",
+               (unsigned long)H5Tget_member_offset(type, i));
+        H5free_memory(name);
+
+        /* Member's type */
+        subtype = H5Tget_member_type(type, i);
+        print_type(buffer, subtype, ind+4);
+        H5Tclose(subtype);
+    }
+    size = H5Tget_size(type);
+    h5tools_str_append(buffer, "\n%*s} %lu byte%s",
+                ind, "", (unsigned long)size, 1==size?"":"s");
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_enum_type
+ *
+ * Purpose: Print info about an enumeration data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Wednesday, December 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_enum_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    int         nmembs;         /* number of members */
+    hid_t       super;          /* enum base integer type */
+
+    if(H5T_ENUM != H5Tget_class(type))
+        return FALSE;
+    if((nmembs = H5Tget_nmembers(type)) < 0)
+        return FALSE;
+
+    super = H5Tget_super(type);
+    h5tools_str_append(buffer, "enum ");
+    print_type(buffer, super, ind + 4);
+    h5tools_str_append(buffer, " {");
+
+    if(nmembs > 0) {
+        char        **name;         /* member names */
+        unsigned char *value;       /* value array */
+        hid_t       native = -1;    /* native integer data type */
+        size_t      dst_size;       /* destination value type size */
+        unsigned    i;              /* miscellaneous counters */
+
+        /* Determine what data type to use for the native values.  To simplify
+         * things we entertain three possibilities:
+         *  1. long long -- the largest native signed integer
+         *  2. unsigned long long -- the largest native unsigned integer
+         *  3. raw format */
+        if(H5Tget_size(type) <= sizeof(long long)) {
+            dst_size = sizeof(long long);
+            if(H5T_SGN_NONE == H5Tget_sign(type))
+                native = H5T_NATIVE_ULLONG;
+            else
+                native = H5T_NATIVE_LLONG;
+        } /* end if */
+        else
+            dst_size = H5Tget_size(type);
+
+        /* Get the names and raw values of all members */
+        name = (char **)HDcalloc((size_t)nmembs, sizeof(char *));
+        value = (unsigned char *)HDcalloc((size_t)nmembs, MAX(H5Tget_size(type), dst_size));
+        for(i = 0; i < (unsigned)nmembs; i++) {
+            name[i] = H5Tget_member_name(type, i);
+            H5Tget_member_value(type, i, value + i * H5Tget_size(type));
+        }
+
+        /* Convert values to native data type */
+        if(native > 0)
+            if(H5Tconvert(super, native, (size_t)nmembs, value, NULL, H5P_DEFAULT) < 0) {
+                /* Release resources */
+                for(i = 0; i < (unsigned)nmembs; i++)
+                    H5free_memory(name[i]);
+                HDfree(name);
+                HDfree(value);
+
+                return FALSE;
+            }
+
+        /* Sort members by increasing value */
+        /*not implemented yet*/
+
+        /* Print members */
+        for(i = 0; i < (unsigned)nmembs; i++) {
+            unsigned char *copy;        /* a pointer to value array */
+            int         nchars;         /* number of output characters */
+
+            h5tools_str_append(buffer, "\n%*s", ind+4, "");
+            nchars = print_string(buffer, name[i], TRUE);
+            h5tools_str_append(buffer, "%*s = ", MAX(0, 16 - nchars), "");
+
+            if(native < 0) {
+                size_t j;
+
+                h5tools_str_append(buffer, "0x");
+                for(j = 0; j < dst_size; j++)
+                    h5tools_str_append(buffer, "%02x", value[i*dst_size+j]);
+            }
+            else if(H5T_SGN_NONE == H5Tget_sign(native)) {
+                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+                 *strangely, unless use another pointer "copy".*/
+                copy = value + i * dst_size;
+                h5tools_str_append(buffer, HSIZE_T_FORMAT, *((unsigned long long*)((void*)copy)));
+            }
+            else {
+                /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+                 *strangely, unless use another pointer "copy".*/
+                copy = value + i * dst_size;
+                h5tools_str_append(buffer, "%"H5_PRINTF_LL_WIDTH"d",
+                        *((long long*)((void*)copy)));
+            }
+        }
+
+        /* Release resources */
+        for(i = 0; i < (unsigned)nmembs; i++)
+            H5free_memory(name[i]);
+        HDfree(name);
+        HDfree(value);
+    }
+    else
+        h5tools_str_append(buffer, "\n%*s <empty>", ind+4, "");
+
+    h5tools_str_append(buffer, "\n%*s}", ind, "");
+
+    H5Tclose(super);
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_string_type
+ *
+ * Purpose: Print information about a string data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_string_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    H5T_str_t  pad;
+    const char  *pad_s=NULL;
+    H5T_cset_t  cset;
+    const char  *cset_s=NULL;
+
+    if (H5T_STRING!=H5Tget_class(type)) return FALSE;
+
+    /* Padding */
+    pad = H5Tget_strpad(type);
+    switch (pad) {
+        case H5T_STR_NULLTERM:
+            pad_s = "null-terminated";
+            break;
+        case H5T_STR_NULLPAD:
+            pad_s = "null-padded";
+            break;
+        case H5T_STR_SPACEPAD:
+            pad_s = "space-padded";
+            break;
+        case H5T_STR_RESERVED_3:
+        case H5T_STR_RESERVED_4:
+        case H5T_STR_RESERVED_5:
+        case H5T_STR_RESERVED_6:
+        case H5T_STR_RESERVED_7:
+        case H5T_STR_RESERVED_8:
+        case H5T_STR_RESERVED_9:
+        case H5T_STR_RESERVED_10:
+        case H5T_STR_RESERVED_11:
+        case H5T_STR_RESERVED_12:
+        case H5T_STR_RESERVED_13:
+        case H5T_STR_RESERVED_14:
+        case H5T_STR_RESERVED_15:
+        case H5T_STR_ERROR:
+            pad_s = "unknown-format";
+            break;
+        default:
+            ;
+        break;
+    }
+
+    /* Character set */
+    cset = H5Tget_cset(type);
+    switch (cset) {
+        case H5T_CSET_ASCII:
+            cset_s = "ASCII";
+            break;
+        case H5T_CSET_UTF8:
+            cset_s = "UTF-8";
+            break;
+        case H5T_CSET_RESERVED_2:
+        case H5T_CSET_RESERVED_3:
+        case H5T_CSET_RESERVED_4:
+        case H5T_CSET_RESERVED_5:
+        case H5T_CSET_RESERVED_6:
+        case H5T_CSET_RESERVED_7:
+        case H5T_CSET_RESERVED_8:
+        case H5T_CSET_RESERVED_9:
+        case H5T_CSET_RESERVED_10:
+        case H5T_CSET_RESERVED_11:
+        case H5T_CSET_RESERVED_12:
+        case H5T_CSET_RESERVED_13:
+        case H5T_CSET_RESERVED_14:
+        case H5T_CSET_RESERVED_15:
+        case H5T_CSET_ERROR:
+            cset_s = "unknown-character-set";
+            break;
+        default:
+            ;
+        break;
+    }
+
+    if (H5Tis_variable_str(type)) {
+        h5tools_str_append(buffer, "variable-length");
+    }
+    else {
+        h5tools_str_append(buffer, "%lu-byte", (unsigned long)H5Tget_size(type));
+    }
+    h5tools_str_append(buffer, " %s %s string", pad_s, cset_s);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_reference_type
+ *
+ * Purpose: Prints information about a reference data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-04
+ *  Knows about object and dataset region references.
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_reference_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+{
+    if (H5T_REFERENCE!=H5Tget_class(type)) return FALSE;
+
+    if (H5Tequal(type, H5T_STD_REF_OBJ)==TRUE) {
+        h5tools_str_append(buffer, "object reference");
+    }
+    else if (H5Tequal(type, H5T_STD_REF_DSETREG)==TRUE) {
+        h5tools_str_append(buffer, "dataset region reference");
+    }
+    else {
+        h5tools_str_append(buffer, "%lu-byte unknown reference",
+                (unsigned long)H5Tget_size(type));
+    }
+
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_opaque_type
+ *
+ * Purpose: Prints information about an opaque data type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Robb Matzke
+ *              Monday, June  7, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_opaque_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    char *tag;
+    size_t size;
+
+    if (H5T_OPAQUE!=H5Tget_class(type)) return FALSE;
+
+    size = H5Tget_size(type);
+    h5tools_str_append(buffer, "%lu-byte opaque type", (unsigned long)size);
+    if ((tag=H5Tget_tag(type))) {
+        h5tools_str_append(buffer, "\n%*s(tag = \"", ind, "");
+        print_string(buffer, tag, FALSE);
+        h5tools_str_append(buffer, "\")");
+        H5free_memory(tag);
+    }
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_vlen_type
+ *
+ * Purpose:     Print information about a variable-length type
+ *
+ * Return:      Success:        TRUE
+ *
+ *              Failure:        FALSE
+ *
+ * Programmer:  Robb Matzke
+ *              Friday, December  1, 2000
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_vlen_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    hid_t       super;
+
+    if (H5T_VLEN!=H5Tget_class(type)) return FALSE;
+
+    h5tools_str_append(buffer, "variable length of\n%*s", ind+4, "");
+    super = H5Tget_super(type);
+    print_type(buffer, super, ind+4);
+    H5Tclose(super);
+    return TRUE;
+}
+
+

+/*---------------------------------------------------------------------------
+ * Purpose:     Print information about an array type
+ *
+ * Return:      Success:        TRUE
+ *
+ *              Failure:        FALSE
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, January 31, 2002
+ *
+ * Modifications:
+ *---------------------------------------------------------------------------
+ */
+static hbool_t
+print_array_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    hid_t       super;
+    int         ndims, i;
+    hsize_t     *dims=NULL;
+
+    if (H5T_ARRAY!=H5Tget_class(type))
+        return FALSE;
+    ndims = H5Tget_array_ndims(type);
+    if (ndims) {
+        dims = (hsize_t *)HDmalloc((unsigned)ndims * sizeof(dims[0]));
+        H5Tget_array_dims2(type, dims);
+
+        /* Print dimensions */
+        for (i=0; i<ndims; i++)
+            h5tools_str_append(buffer, "%s" HSIZE_T_FORMAT , i?",":"[", dims[i]);
+        h5tools_str_append(buffer, "]");
+
+        HDfree(dims);
+    }
+    else
+        h5tools_str_append(buffer, " [SCALAR]\n", rawoutstream);
+
+
+    /* Print parent type */
+    h5tools_str_append(buffer, " ");
+    super = H5Tget_super(type);
+    print_type(buffer, super, ind+4);
+    H5Tclose(super);
+    return TRUE;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_bitfield_type
+ *
+ * Purpose: Print information about a bitfield type.
+ *
+ * Return: Success: TRUE
+ *
+ *  Failure: FALSE, nothing printed
+ *
+ * Programmer: Pedro Vicente
+ *              Tuesday, May  20, 2003
+ *
+ * Modifications:
+ *              Robb Matzke, LLNL 2003-06-05
+ *              Generalized Pedro's original if/then/else.  Also display
+ *              precision/offset information.
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+print_bitfield_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_order_t order;          /* byte order value */
+    const char  *order_s=NULL;  /* byte order string */
+
+    if (H5T_BITFIELD!=H5Tget_class(type)) return FALSE;
+    if (H5Tget_size(type)>1) {
+        order = H5Tget_order(type);
+        if (H5T_ORDER_LE==order) {
+            order_s = " little-endian";
+        } else if (H5T_ORDER_BE==order) {
+            order_s = " big-endian";
+        } else if (H5T_ORDER_VAX==order) {
+            order_s = " mixed-endian";
+        } else {
+            order_s = "unknown-byte-order";
+        }
+    } else {
+        order_s = "";
+    }
+
+    h5tools_str_append(buffer, "%lu-bit%s bitfield",
+           (unsigned long)(8*H5Tget_size(type)), order_s);
+    print_precision(buffer, type, ind);
+    return TRUE;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_type
+ *
+ * Purpose: Prints a data type definition.  The definition is printed
+ *  without any leading space or trailing line-feed (although
+ *  there might be line-feeds inside the type definition).  The
+ *  first line is assumed to have IND characters before it on
+ *  the same line (printed by the caller).
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *   Robb Matzke, 1999-06-11
+ *  Prints the OID of shared data types.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_type(h5tools_str_t *buffer, hid_t type, int ind)
+{
+    H5T_class_t  data_class = H5Tget_class(type);
+
+    /* Bad data type */
+    if (type<0) {
+        h5tools_str_append(buffer,"<ERROR>");
+        return;
+    }
+
+    /* Shared? If so then print the type's OID */
+    if(H5Tcommitted(type)) {
+        H5O_info_t  oi;
+
+        if(H5Oget_info(type, &oi) >= 0)
+            h5tools_str_append(buffer,"shared-%lu:"H5_PRINTF_HADDR_FMT" ",
+                    oi.fileno, oi.addr);
+        else
+            h5tools_str_append(buffer,"shared ");
+    } /* end if */
+
+    /* Print the type */
+    if(print_native_type(buffer, type, ind) ||
+            print_ieee_type(buffer, type, ind) ||
+            print_cmpd_type(buffer, type, ind) ||
+            print_enum_type(buffer, type, ind) ||
+            print_string_type(buffer, type, ind) ||
+            print_reference_type(buffer, type, ind) ||
+            print_vlen_type(buffer, type, ind) ||
+            print_array_type(buffer, type, ind) ||
+            print_opaque_type(buffer, type, ind) ||
+            print_bitfield_type(buffer, type, ind))
+        return;
+
+    /* Unknown type */
+    h5tools_str_append(buffer,"%lu-byte class-%u unknown",
+            (unsigned long)H5Tget_size(type), (unsigned)data_class);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dump_dataset_values
+ *
+ * Purpose: Prints all values of a dataset.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ *              Tuesday, July 21, 1998
+ *
+ * Modifications:
+ *  Robb Matzke, 1999-09-27
+ *  Understands the simple_output_g switch which causes data to
+ *  be displayed in a more machine-readable format.
+ *-------------------------------------------------------------------------
+ */
+static void
+dump_dataset_values(hid_t dset)
+{
+    char                string_prefix[64];
+    static char         fmt_double[16];
+    static char         fmt_float[16];
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t     outputformat;
+    h5tool_format_t    *info = &ls_dataformat;
+
+    hid_t  f_type = H5Dget_type(dset);
+    size_t  size = H5Tget_size(f_type);
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    outputformat = *info;
+    outputformat.line_1st  = NULL;
+    if (simple_output_g) {
+        outputformat.idx_fmt = "";
+        outputformat.line_per_line = 1;
+        outputformat.line_multi_new = 0;
+        outputformat.line_pre  = "        ";
+        outputformat.line_cont = "         ";
+
+        outputformat.arr_pre = "";
+        outputformat.arr_suf = "";
+        outputformat.arr_sep = " ";
+
+        if (!label_g) {
+            outputformat.cmpd_pre = "";
+            outputformat.cmpd_suf = "";
+        }
+        outputformat.cmpd_sep = " ";
+
+        if (label_g) outputformat.cmpd_name = "%s=";
+
+        outputformat.elmt_suf1 = " ";
+        outputformat.str_locale = ESCAPE_HTML;
+
+    }
+    else {
+        if (no_line_wrap_g) {
+            outputformat.line_per_line = 1;
+        }
+        else {
+            outputformat.line_ncols = (unsigned)width_g;
+        }
+        if (label_g) outputformat.cmpd_name = "%s=";
+        outputformat.line_pre  = "        %s ";
+        outputformat.line_cont = "        %s  ";
+        outputformat.str_repeat = 8;
+
+        outputformat.arr_pre = NULL;
+        outputformat.arr_suf = NULL;
+        outputformat.arr_sep = NULL;
+
+        outputformat.cmpd_pre = NULL;
+        outputformat.cmpd_suf = NULL;
+        outputformat.cmpd_sep = NULL;
+
+        outputformat.vlen_sep = NULL;
+        outputformat.vlen_pre = NULL;
+        outputformat.vlen_suf = NULL;
+        outputformat.vlen_end = NULL;
+    }
+    outputformat.arr_linebreak = 0;
+    /* Floating point types should display full precision */
+    HDsnprintf(fmt_float, sizeof(fmt_float), "%%1.%dg", FLT_DIG);
+    outputformat.fmt_float = fmt_float;
+    HDsnprintf(fmt_double, sizeof(fmt_double), "%%1.%dg", DBL_DIG);
+    outputformat.fmt_double = fmt_double;
+
+    if (hexdump_g) {
+        /* Print all data in hexadecimal format if the `-x' or `--hexdump'
+         * command line switch was given. */
+        outputformat.raw = TRUE;
+    }
+    else if (string_g && 1==size && H5T_INTEGER==H5Tget_class(f_type)) {
+        /* Print 1-byte integer data as an ASCI character string instead of
+         * integers if the `-s' or `--string' command-line option was given. */
+        outputformat.ascii = TRUE;
+        outputformat.elmt_suf1 = "";
+        outputformat.elmt_suf2 = "";
+        HDsnprintf(string_prefix, sizeof(string_prefix), "%s\"", outputformat.line_pre);
+        outputformat.line_pre = string_prefix;
+        outputformat.line_suf = "\"";
+    }
+    info = &outputformat;
+
+    ctx.indent_level = 2;
+    ctx.cur_column = (size_t)curr_pos;
+    /* Print all the values. */
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "    Data:\n");
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    ctx.need_prefix = TRUE;
+    ctx.cur_column = (size_t)curr_pos;
+    if (h5tools_dump_dset(rawoutstream, info, &ctx, dset, NULL) < 0) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "        Unable to print data.");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    }
+
+    H5Tclose(f_type);
+
+    h5tools_str_close(&buffer);
+
+    PRINTVALSTREAM(rawoutstream, "\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_attr
+ *
+ * Purpose: Prints information about attributes.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Friday, June  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_attr(hid_t obj, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *ainfo,
+    void H5_ATTR_UNUSED *op_data)
+{
+    hid_t               attr = -1;
+    hid_t               space = -1;
+    hid_t               type = -1;
+    hid_t               p_type = -1;
+    hsize_t             size[H5S_MAX_RANK];
+    hsize_t             nelmts = 1;
+    hsize_t             temp_need;
+    size_t              need;
+    int                 ndims;
+    int                 i;
+    void               *buf;
+    H5S_class_t         space_type;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+    h5tool_format_t     outputformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "    Attribute: ");
+
+    print_string(&buffer, attr_name, TRUE);
+
+    if((attr = H5Aopen(obj, attr_name, H5P_DEFAULT))) {
+        space = H5Aget_space(attr);
+        type = H5Aget_type(attr);
+
+        /* Data space */
+        ndims = H5Sget_simple_extent_dims(space, size, NULL);
+        space_type = H5Sget_simple_extent_type(space);
+        switch(space_type) {
+            case H5S_SCALAR:
+                /* scalar dataspace */
+                h5tools_str_append(&buffer, " scalar\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_SIMPLE:
+                /* simple dataspace */
+                h5tools_str_append(&buffer, " {");
+                for (i=0; i<ndims; i++) {
+                    h5tools_str_append(&buffer, "%s" HSIZE_T_FORMAT, i?", ":"", size[i]);
+                    nelmts *= size[i];
+                }
+                h5tools_str_append(&buffer, "}\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_NULL:
+                /* null dataspace */
+                h5tools_str_append(&buffer, " null\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+
+            case H5S_NO_CLASS:
+            default:
+                /* Unknown dataspace type */
+                h5tools_str_append(&buffer, " unknown\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                break;
+        } /* end switch */
+
+        /* Data type */
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "        Type:      ");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Data */
+        outputformat = *info;
+
+        if(nelmts < 5) {
+            outputformat.idx_fmt = "";
+            outputformat.line_1st  = "        Data:  ";
+            outputformat.line_pre  = "               ";
+            outputformat.line_cont = "                ";
+            outputformat.str_repeat = 8;
+
+        }
+        else {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "        Data:\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            outputformat.line_1st  = NULL;
+            outputformat.line_pre  = "            %s ";
+            outputformat.line_cont = "            %s  ";
+            outputformat.str_repeat = 8;
+        }
+
+        outputformat.line_ncols = (unsigned)width_g;
+        if(label_g)
+            outputformat.cmpd_name = "%s=";
+        if(string_g && 1==H5Tget_size(type) &&
+                H5T_INTEGER==H5Tget_class(type)) {
+            outputformat.ascii = TRUE;
+            outputformat.elmt_suf1 = "";
+            outputformat.elmt_suf2 = "";
+            outputformat.line_pre = "            %s \"";
+            outputformat.line_suf = "\"";
+        } /* end if */
+
+
+        outputformat.arr_pre = NULL;
+        outputformat.arr_suf = NULL;
+        outputformat.arr_sep = NULL;
+
+        outputformat.cmpd_pre = NULL;
+        outputformat.cmpd_suf = NULL;
+        outputformat.cmpd_sep = NULL;
+
+        outputformat.vlen_sep = NULL;
+        outputformat.vlen_pre = NULL;
+        outputformat.vlen_suf = NULL;
+        outputformat.vlen_end = NULL;
+
+        info = &outputformat;
+
+        if(hexdump_g)
+           p_type = H5Tcopy(type);
+        else
+           p_type = h5tools_get_native_type(type);
+
+        if(p_type >= 0) {
+            /* VL data special information */
+            unsigned int        vl_data = 0; /* contains VL datatypes */
+
+            /* Check if we have VL data in the dataset's datatype */
+            if (h5tools_detect_vlen(p_type) == TRUE)
+                vl_data = TRUE;
+
+            temp_need= nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type));
+            HDassert(temp_need == (hsize_t)((size_t)temp_need));
+            need = (size_t)temp_need;
+            buf = HDmalloc(need);
+            HDassert(buf);
+            if(H5Aread(attr, p_type, buf) >= 0) {
+                ctx.need_prefix = TRUE;
+                ctx.indent_level = 2;
+                ctx.cur_column = (size_t)curr_pos;
+                h5tools_dump_mem(rawoutstream, info, &ctx, attr, p_type, space, buf);
+            }
+
+            /* Reclaim any VL memory, if necessary */
+            if (vl_data)
+                H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
+
+            HDfree(buf);
+            H5Tclose(p_type);
+        } /* end if */
+
+        H5Sclose(space);
+        H5Tclose(type);
+        H5Aclose(attr);
+    }
+    h5tools_str_close(&buffer);
+
+    PRINTVALSTREAM(rawoutstream, "\n");
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dataset_list1
+ *
+ * Purpose: List information about a dataset which should appear on the
+ *  same line as the dataset name.  This information will precede
+ *  information which is applicable to all objects which will be
+ *  printed by the caller.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, August 27, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dataset_list1(hid_t dset)
+{
+    hsize_t     cur_size[H5S_MAX_RANK];   /* current dataset dimensions */
+    hsize_t     max_size[H5S_MAX_RANK];   /* maximum dataset dimensions */
+    hid_t       space;          /* data space                 */
+    int         ndims;          /* dimensionality             */
+    H5S_class_t space_type;     /* type of dataspace          */
+    int   i;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Information that goes on the same row as the name.  The name has
+     * already been printed. */
+    space = H5Dget_space(dset);
+    space_type = H5Sget_simple_extent_type(space);
+    ndims = H5Sget_simple_extent_dims(space, cur_size, max_size);
+    h5tools_str_append(&buffer, " {");
+    for (i=0; i<ndims; i++) {
+        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", cur_size[i]);
+        if (max_size[i]==H5S_UNLIMITED) {
+            h5tools_str_append(&buffer, "/%s", "Inf");
+        }
+        else if (max_size[i]!=cur_size[i] || verbose_g>0) {
+            h5tools_str_append(&buffer, "/"HSIZE_T_FORMAT, max_size[i]);
+        }
+    }
+    if (space_type==H5S_SCALAR) h5tools_str_append(&buffer, "SCALAR");
+    else if (space_type==H5S_NULL) h5tools_str_append(&buffer, "NULL");
+    h5tools_str_append(&buffer, "}");
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    H5Sclose (space);
+
+    h5tools_str_close(&buffer);
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: dataset_list2
+ *
+ * Purpose: List information about a dataset which should appear after
+ *  information which is general to all objects.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, August 27, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dataset_list2(hid_t dset, const char H5_ATTR_UNUSED *name)
+{
+    hid_t       dcpl;           /* dataset creation property list */
+    hid_t       type;           /* data type of dataset */
+    hid_t       space;          /* data space of dataset */
+    int         nf;             /* number of filters */
+    unsigned    filt_flags;     /* filter flags */
+    H5Z_filter_t filt_id;       /* filter identification number */
+    unsigned    cd_values[20];  /* filter client data values */
+    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        s[64];          /* temporary string buffer */
+    off_t       f_offset;       /* offset in external file */
+    hsize_t     f_size;         /* bytes used in external file */
+    hsize_t     total, used;    /* total size or offset */
+    int         ndims;          /* dimensionality */
+    int         n, max_len;     /* max extern file name length */
+    double      utilization;    /* percent utilization of storage */
+    H5T_class_t tclass;         /* datatype class identifier */
+    int         i;
+    H5D_layout_t     stl;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    if(verbose_g > 0) {
+        dcpl = H5Dget_create_plist(dset);
+        space = H5Dget_space(dset);
+        type = H5Dget_type(dset);
+
+        stl = H5Pget_layout(dcpl);
+        switch (stl) {
+            case H5D_CHUNKED:
+                {
+                    hsize_t     chsize[64];     /* chunk size in elements */
+
+                    ndims = H5Pget_chunk(dcpl, (int)NELMTS(chsize), chsize/*out*/);
+                    h5tools_str_append(&buffer, "    %-10s {", "Chunks:");
+                    total = H5Tget_size(type);
+                    for (i=0; i<ndims; i++) {
+                        h5tools_str_append(&buffer, "%s"HSIZE_T_FORMAT, i?", ":"", chsize[i]);
+                        total *= chsize[i];
+                    }
+                    h5tools_str_append(&buffer, "} "HSIZE_T_FORMAT" bytes\n", total);
+                }
+                break;
+            case H5D_COMPACT:
+                break;
+            case H5D_CONTIGUOUS:
+                /* Print information about external storage */
+                if((nf = H5Pget_external_count(dcpl)) > 0) {
+                    for(i = 0, max_len = 0; i < nf; i++) {
+                        if(H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, NULL, NULL) < 0)
+                            continue;
+                        n = print_string(NULL, f_name, TRUE);
+                        max_len = MAX(max_len, n);
+                    } /* end for */
+                    h5tools_str_append(&buffer, "    %-10s %d external file%s\n",
+                            "Extern:", nf, 1==nf?"":"s");
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s %s\n",
+                            "ID", "DSet-Addr", "File-Addr", "Bytes", "File");
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
+                            "----", "----------", "----------", "----------");
+                    for (i=0; i<max_len; i++) h5tools_str_append(&buffer, "-");
+                    h5tools_str_append(&buffer, "\n");
+                    for (i=0, total=0; i<nf; i++) {
+                        if (H5Pget_external(dcpl, (unsigned)i, sizeof(f_name), f_name, &f_offset, &f_size)<0) {
+                            h5tools_str_append(&buffer,
+                                    "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10s %10s ***ERROR*** %s\n",
+                                    i, total, "", "",
+                                    i+1<nf?"Following addresses are incorrect":"");
+                        }
+                        else if (H5S_UNLIMITED==f_size) {
+                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10s ",
+                                    i, total, (hsize_t)f_offset, "INF");
+                            print_string(&buffer, f_name, TRUE);
+                        }
+                        else {
+                            h5tools_str_append(&buffer, "        #%03d %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u %10"H5_PRINTF_LL_WIDTH"u ",
+                                    i, total, (hsize_t)f_offset, f_size);
+                            print_string(&buffer, f_name, TRUE);
+                        }
+                        h5tools_str_append(&buffer, "\n");
+                        total += f_size;
+                    }
+                    h5tools_str_append(&buffer, "        %4s %10s %10s %10s ",
+                            "----", "----------", "----------", "----------");
+                    for (i=0; i<max_len; i++)
+                        h5tools_str_append(&buffer, "-");
+                    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;
+
+                        h5tools_str_append(&buffer, "    %-10s {%ld} Source {\n", "Maps:", vmaps);
+                        for (next = 0; next < (unsigned) vmaps; next++) {
+                            H5Pget_virtual_filename(dcpl, next, f_name, sizeof(f_name));
+                            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 */
+        total = (hsize_t)H5Sget_simple_extent_npoints(space) * H5Tget_size(type);
+        used = H5Dget_storage_size(dset);
+        tclass = H5Tget_class(type);
+        h5tools_str_append(&buffer, "    %-10s ", "Storage:");
+        switch (tclass)
+        {
+
+        case H5T_VLEN:
+            h5tools_str_append(&buffer, "information not available");
+            break;
+
+        case H5T_REFERENCE:
+            if ( H5Tequal(type, H5T_STD_REF_DSETREG))
+            {
+                h5tools_str_append(&buffer, "information not available");
+            }
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_COMPOUND:
+        case H5T_ENUM:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
+        default:
+            h5tools_str_append(&buffer, HSIZE_T_FORMAT" logical byte%s, "HSIZE_T_FORMAT" allocated byte%s",
+                total, 1==total?"":"s",
+                used, 1==used?"":"s");
+            if (used>0)
+            {
+                utilization = ((double)total * (double)100.0f) / (double)used;
+                h5tools_str_append(&buffer, ", %1.2f%% utilization", utilization);
+            }
+        }
+
+        h5tools_str_append(&buffer, "\n");
+
+        /* Print information about raw data filters */
+        if((nf = H5Pget_nfilters(dcpl)) > 0) {
+            for(i = 0; i < nf; i++) {
+                cd_nelmts = NELMTS(cd_values);
+                filt_id = H5Pget_filter2(dcpl, (unsigned)i, &filt_flags, &cd_nelmts,
+                        cd_values, sizeof(f_name), f_name, NULL);
+                f_name[sizeof(f_name) - 1] = '\0';
+                HDsnprintf(s, sizeof(s), "Filter-%d:", i);
+                h5tools_str_append(&buffer, "    %-10s %s-%u %s {", s,
+                        (f_name[0] ? f_name : "method"),
+                        (unsigned)filt_id,
+                        ((filt_flags & H5Z_FLAG_OPTIONAL) ? "OPT" : ""));
+                for(cd_num = 0; cd_num < cd_nelmts; cd_num++)
+                    h5tools_str_append(&buffer, "%s%u", (cd_num ? ", " : ""), cd_values[cd_num]);
+                h5tools_str_append(&buffer, "}\n");
+            } /* end for */
+        } /* end if */
+
+        /* Print data type */
+        h5tools_str_append(&buffer, "    %-10s ", "Type:");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        /* Print address information */
+        if(address_g)
+            H5Ddebug(dset);
+
+        /* Close stuff */
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Pclose(dcpl);
+    } /* end if */
+
+    h5tools_str_close(&buffer);
+
+    if(data_g)
+        dump_dataset_values(dset);
+
+    return 0;
+} /* end dataset_list2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: datatype_list2
+ *
+ * Purpose: List information about a datatype which should appear after
+ *  information which is general to all objects.
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Robb Matzke
+ *              Thursday, November  5, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+datatype_list2(hid_t type, const char H5_ATTR_UNUSED *name)
+{
+    if (verbose_g>0) {
+        hsize_t             curr_pos = 0;        /* total data element position   */
+        h5tools_str_t       buffer;          /* string into which to render   */
+        h5tools_context_t   ctx;             /* print context  */
+        h5tool_format_t    *info = &ls_dataformat;
+
+        HDmemset(&ctx, 0, sizeof(ctx));
+        HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+        h5tools_str_reset(&buffer);
+
+        h5tools_str_append(&buffer, "    %-10s ", "Type:");
+        print_type(&buffer, type, 15);
+        h5tools_str_append(&buffer, "\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+        h5tools_str_close(&buffer);
+    }
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_obj
+ *
+ * Purpose: Prints information about an object
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, November 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_obj(const char *name, const H5O_info_t *oinfo, const char *first_seen, void *_iter)
+{
+    H5O_type_t          obj_type = oinfo->type;          /* Type of the object */
+    iter_t             *iter = (iter_t*)_iter;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Print the link's name, either full name or base name */
+    if(!iter->symlink_target)
+        print_obj_name(&buffer, iter, name, "");
+
+    /* Check object information */
+    if(oinfo->type < 0 || oinfo->type >= H5O_TYPE_NTYPES) {
+        h5tools_str_append(&buffer, "Unknown type(%d)", (int)oinfo->type);
+        obj_type = H5O_TYPE_UNKNOWN;
+    }
+    if(iter->symlink_target)
+        h5tools_str_append(&buffer, "{");
+    if(obj_type >= 0 && dispatch_g[obj_type].name)
+        h5tools_str_append(&buffer, "%s", dispatch_g[obj_type].name);
+    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+    /* Check if we've seen this object before */
+    if(first_seen) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, ", same as ");
+        print_string(&buffer, first_seen, TRUE);
+        if(!iter->symlink_target) {
+            h5tools_str_append(&buffer, "\n");
+        }
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+    } /* end if */
+    else {
+        hid_t obj = (-1);               /* ID of object opened */
+
+        /* Open the object.  Not all objects can be opened.  If this is the case
+         * then return right away.
+         */
+        if(obj_type >= 0 && (obj = H5Oopen(iter->fid, name, H5P_DEFAULT)) < 0) {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, " *ERROR*\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;
+        } /* end if */
+
+        /* List the first line of information for the object. */
+        if(obj_type >= 0 && dispatch_g[obj_type].list1)
+            (dispatch_g[obj_type].list1)(obj);
+        if(!iter->symlink_target || (verbose_g > 0)) {
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        }
+
+        /* Show detailed information about the object, beginning with information
+         * which is common to all objects. */
+        if(verbose_g > 0) {
+            size_t buf_size = 0;
+            char* comment = NULL;
+            ssize_t cmt_bufsize = -1;
+
+            /* Display attributes */
+            if(obj_type >= 0)
+                H5Aiterate2(obj, H5_INDEX_NAME, H5_ITER_INC, NULL, list_attr, NULL);
+
+            /* Object location & reference count */
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "    %-10s %lu:"H5_PRINTF_HADDR_FMT"\n", "Location:", oinfo->fileno, oinfo->addr);
+            h5tools_str_append(&buffer, "    %-10s %u\n", "Links:", (unsigned)oinfo->rc);
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* Modification time */
+            if(oinfo->mtime > 0) {
+                char buf[256];
+                struct tm *tm;
+
+                if(simple_output_g)
+                    tm = HDgmtime(&(oinfo->mtime));
+                else
+                    tm = HDlocaltime(&(oinfo->mtime));
+                if(tm) {
+                    HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "    %-10s %s\n", "Modified:", buf);
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                } /* end if */
+            } /* end if */
+
+            /* Object comment */
+            cmt_bufsize = H5Oget_comment(obj, comment, buf_size);
+
+            /* if the actual length of the comment is longer than cmt_bufsize, then call
+             * H5Oget_comment again with the correct value.
+             * If the call to H5Oget_comment returned an error, skip this block */
+            if (cmt_bufsize > 0) {
+                comment = (char *)HDmalloc((size_t)cmt_bufsize + 1); /* new_size including null terminator */
+                if(comment) {
+                    cmt_bufsize = H5Oget_comment(obj, comment, (size_t)cmt_bufsize);
+                    if(cmt_bufsize > 0) {
+                        comment[cmt_bufsize] = 0;
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "    %-10s \"", "Comment:");
+                        print_string(&buffer, comment, FALSE);
+                        h5tools_str_append(&buffer, "\"\n");
+                        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    } /* end if */
+                    HDfree(comment);
+                }
+            }
+        } /* end if */
+
+        /* Detailed list for object */
+        if(obj_type >= 0 && dispatch_g[obj_type].list2)
+            (dispatch_g[obj_type].list2)(obj, name);
+
+        /* Close the object. */
+        if(obj_type >= 0)
+            H5Oclose(obj);
+    } /* end else */
+
+done:
+    if(iter->symlink_target) {
+        h5tools_str_reset(&buffer);
+        h5tools_str_append(&buffer, "}\n");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        iter->symlink_target = FALSE;
+    }
+    h5tools_str_close(&buffer);
+
+    return 0;
+} /* end list_obj() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: list_lnk
+ *
+ * Purpose: Prints information about a link
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *              Thursday, November 8, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+list_lnk(const char *name, const H5L_info_t *linfo, void *_iter)
+{
+    char *buf=NULL;
+    iter_t *iter = (iter_t*)_iter;
+    int ret;
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tool_link_info_t lnk_info;
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* init linkinfo struct */
+    HDmemset(&lnk_info, 0, sizeof(h5tool_link_info_t));
+
+    /* if verbose, make H5tools_get_symlink_info() display more */
+    if (verbose_g)
+        lnk_info.opt.msg_mode=1;
+
+    /* Print the link's name, either full name or base name */
+    print_obj_name(&buffer, iter, name, "");
+
+    switch(linfo->type) {
+        case H5L_TYPE_SOFT:
+            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_symlink_g);
+            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
+             * so it will be freed via buf later */
+            buf = (char*)lnk_info.trg_path;
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (no_dangling_link_g && ret == 0)
+                iter->symlink_list->dangle_link = TRUE;
+
+            h5tools_str_append(&buffer, "Soft Link {");
+            h5tools_str_append(&buffer, buf);
+            h5tools_str_append(&buffer, "}");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            if(follow_symlink_g)
+            {
+                hbool_t orig_grp_literal = grp_literal_g;
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, " ");
+
+                /* Check if we have already seen this softlink */
+                if(symlink_is_visited(iter->symlink_list, linfo->type, NULL, buf))
+                {
+                    h5tools_str_append(&buffer, "{Already Visited}\n");
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    goto done;
+                }
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* Add this link to the list of seen softlinks */
+                if(symlink_visit_add(iter->symlink_list, linfo->type, NULL, buf) < 0)
+                    goto done;
+
+                /* Adjust user data to specify that we are operating on the
+                 * target of an soft link */
+                iter->symlink_target = TRUE;
+
+                /* Prevent recursive listing of soft link target if
+                 * recursive_g is off */
+                if(!recursive_g)
+                    grp_literal_g = TRUE;
+                /* Recurse through the soft link */
+                if(visit_obj(iter->fid, name, iter) < 0)
+                {
+                    grp_literal_g = orig_grp_literal;
+                    goto done;
+                }
+
+                grp_literal_g = orig_grp_literal;
+            }
+            else {
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "\n");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            }
+
+            break;
+
+        case H5L_TYPE_EXTERNAL:
+            {
+            const char *filename;
+            const char *path;
+            hbool_t follow_link = follow_symlink_g || follow_elink_g;
+
+            ret = H5tools_get_symlink_info(iter->fid, name, &lnk_info, follow_link);
+            /* lnk_info.trg_path is malloced in H5tools_get_symlink_info()
+             * so it will be freed via buf later */
+            buf = (char*)lnk_info.trg_path;
+            /* error */
+            if (ret < 0)
+                goto done;
+            /* no dangling link option given and detect dangling link */
+            else if (no_dangling_link_g && ret == 0)
+                iter->symlink_list->dangle_link = TRUE;
+
+            if(H5Lunpack_elink_val(buf, linfo->u.val_size, NULL, &filename, &path) < 0)
+                goto done;
+
+            h5tools_str_append(&buffer, "External Link {");
+            h5tools_str_append(&buffer, filename);
+            h5tools_str_append(&buffer, "/");
+            if(*path != '/')
+                h5tools_str_append(&buffer, "/");
+                        h5tools_str_append(&buffer, path);
+            h5tools_str_append(&buffer, "}");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+            /* Recurse through the external link */
+            /* keep the follow_elink_g for backward compatibility with -E */
+            if(follow_link)
+            {
+                hbool_t orig_grp_literal = grp_literal_g;
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, " ");
+
+                /* Check if we have already seen this elink */
+                if(symlink_is_visited(iter->symlink_list, linfo->type, filename, path))
+                {
+                    h5tools_str_append(&buffer, "{Already Visited}\n");
+                    h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                    goto done;
+                }
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+
+                /* Add this link to the list of seen elinks */
+                if(symlink_visit_add(iter->symlink_list, linfo->type, filename, path) < 0)
+                {
+                    goto done;
+                }
+
+                /* Adjust user data to specify that we are operating on the
+                 * target of an external link */
+                iter->symlink_target = TRUE;
+
+                /* Prevent recursive listing of external link target if
+                 * recursive_g is off */
+                if(!recursive_g)
+                    grp_literal_g = TRUE;
+
+                /* Recurse through the external link */
+                if(visit_obj(iter->fid, name, iter) < 0) {
+                    grp_literal_g = orig_grp_literal;
+                    goto done;
+                }
+
+                grp_literal_g = orig_grp_literal;
+            }
+            else
+                PRINTVALSTREAM(rawoutstream, "\n");
+            }
+            break;
+
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_HARD:
+        case H5L_TYPE_MAX:
+        default:
+            h5tools_str_append(&buffer, "UD Link {cannot follow UD links}\n");
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            break;
+    } /* end switch */
+
+done:
+    h5tools_str_close(&buffer);
+
+    if (buf)
+        HDfree(buf);
+    return 0;
+} /* end list_lnk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: visit_obj
+ *
+ * Purpose: Begins iteration on an object
+ *
+ * Return:
+ *  Success: 0
+ *  Failure: -1
+ *
+ * Programmer: Neil Fortner
+ *              Wednesday, August 21, 2008
+ *             Mostly copied from main()
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+visit_obj(hid_t file, const char *oname, iter_t *iter)
+{
+    int retval = 0;
+    H5O_info_t oi;              /* Information for object */
+    hsize_t             curr_pos = 0;        /* total data element position   */
+    h5tools_str_t       buffer;          /* string into which to render   */
+    h5tools_context_t   ctx;             /* print context  */
+    h5tool_format_t    *info = &ls_dataformat;
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+    HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+    h5tools_str_reset(&buffer);
+
+    /* Retrieve info for object to list */
+    if(H5Oget_info_by_name(file, oname, &oi, H5P_DEFAULT) < 0) {
+        if(iter->symlink_target) {
+            h5tools_str_append(&buffer, "{**NOT FOUND**}\n");
+            iter->symlink_target = FALSE;
+        }
+        else
+            print_obj_name(&buffer, iter, oname, "**NOT FOUND**");
+        h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+        retval = -1;
+        goto done;
+    } /* end if */
+
+    /* Check for group iteration */
+    if(H5O_TYPE_GROUP == oi.type && !grp_literal_g) {
+        /* Get ID for group */
+        if(!iter->symlink_target && (iter->gid = H5Gopen2(file, oname, H5P_DEFAULT)) < 0) {
+            h5tools_str_append(&buffer, "%s: unable to open '%s' as group\n", iter->fname, oname);
+            h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+            goto done;   /* Previously "continue", when this code was in main().
+                         * We don't "continue" here in order to close the file
+                         * and free the file name properly. */
+        } /* end if */
+
+        /* Delay specifying the name start point so the original object name is
+         * displayed if it is a link or non-group object */
+        iter->name_start = iter->base_len;
+
+        /* Specified name is a group. List the complete contents of the group. */
+        h5trav_visit(file, oname, (hbool_t) (display_root_g || iter->symlink_target), recursive_g, list_obj, list_lnk, iter);
+
+        /* Close group */
+        if(!iter->symlink_target)
+            H5Gclose(iter->gid);
+    } /* end if */
+    else {
+        /* Use file ID for root group ID */
+        iter->gid = file;
+
+        /* Specified name is a non-group object -- list that object */
+        list_obj(oname, &oi, NULL, iter);
+    } /* end else */
+
+done:
+    h5tools_str_close(&buffer);
+
+    return retval;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: get_width
+ *
+ * Purpose: Figure out how wide the screen is.  This is highly
+ *  unportable, but the user can always override the width we
+ *  detect by giving a command-line option. These code snippets
+ *  were borrowed from the GNU less(1).
+ *
+ * Return: Success: Number of columns.
+ *
+ *  Failure: Some default number of columms.
+ *
+ * Programmer: Robb Matzke
+ *              Friday, November  6, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+get_width(void)
+{
+    int  width = 80;  /*the default   */
+    char *s;
+
+    /* Try to get it from the COLUMNS environment variable first since it's
+     * value is sometimes wrong. */
+    if ((s=HDgetenv("COLUMNS")) && *s && isdigit((int)*s))
+        width = (int)HDstrtol(s, NULL, 0);
+
+#if defined(H5_HAVE_STRUCT_VIDEOCONFIG) && defined(H5_HAVE__GETVIDEOCONFIG)
+    {
+        /* Microsoft C */
+        struct videoconfig w;
+        _getvideoconfig(&w);
+        width = w.numtextcols;
+    }
+#elif defined(H5_HAVE_STRUCT_TEXT_INFO) && defined(H5_HAVE_GETTEXTINFO)
+    {
+        /* Borland C or DJGPPC */
+        struct text_info w;
+        gettextinfo(&w);
+        width = w.screenwidth;
+    }
+#elif defined(H5_HAVE_GETCONSOLESCREENBUFFERINFO)
+    {
+        /* Win32 C */
+        CONSOLE_SCREEN_BUFFER_INFO scr;
+        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &scr);
+        width = scr.srWindow.Right - scr.srWindow.Left + 1;
+    }
+#elif defined(H5_HAVE__SCRSIZE)
+    {
+        /* OS/2 */
+        int w[2];
+        _scrsize(w);
+        width = w[0];
+    }
+#elif defined(H5_HAVE_TIOCGWINSZ) && defined(H5_HAVE_IOCTL)
+    {
+        /* Unix with ioctl(TIOCGWINSZ) */
+        struct winsize w;
+        if (ioctl(2, (int)TIOCGWINSZ, &w)>=0 && w.ws_col>0)
+            width = w.ws_col;
+    }
+#elif defined(H5_HAVE_TIOCGETD) && defined(H5_HAVE_IOCTL)
+    {
+        /* Unix with ioctl(TIOCGETD) */
+        struct uwdata w;
+        if (ioctl(2, WIOCGETD, &w)>=0 && w.uw_width>0)
+            width = w.uw_width / w.uw_hs;
+    }
+#endif
+
+    /* Set to at least 1 */
+    if (width<1) width = 1;
+    return width;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: is_valid_args
+ *
+ * Purpose: check if command line arguments are valid
+ *
+ * Return:
+ *  Success: TRUE (1)
+ *  Failure: FALSE (0)
+ *
+ * Programmer:
+ *  Jonathan Kim  (06/15/2010)
+ *
+ *-------------------------------------------------------------------------*/
+static hbool_t
+is_valid_args(void)
+{
+    hbool_t ret = TRUE;
+
+    if(recursive_g && grp_literal_g)
+    {
+        HDfprintf(rawerrorstream, "Error: 'recursive' option not compatible with 'group info' option!\n\n");
+        ret = FALSE;
+        goto out;
+    }
+
+    if(no_dangling_link_g && !follow_symlink_g)
+    {
+        HDfprintf(rawerrorstream, "Error: --no-dangling-links must be used along with --follow-symlinks option!\n\n");
+        ret = FALSE;
+        goto out;
+    }
+
+out:
+    return ret;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: leave
+ *
+ * Purpose: Close HDF5 and MPI and call exit()
+ *
+ * Return: Does not return
+ *
+ * Programmer: Quincey Koziol
+ *              Saturday, January 31, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    HDexit(ret);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Opens a file and lists the specified group
+ *
+ * Return: Success: 0
+ *
+ *  Failure: 1
+ *
+ * Programmer: Robb Matzke
+ *              Monday, March 23, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    hid_t file = -1;
+    char *fname = NULL, *oname = NULL, *x;
+    const char *s = NULL;
+    char *rest;
+    int  argno;
+    static char root_name[] = "/";
+    char        drivername[50];
+    const char *preferred_driver = NULL;
+    int err_exit = 0;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* Build object display table */
+    DISPATCH(H5O_TYPE_GROUP, "Group", NULL, NULL);
+    DISPATCH(H5O_TYPE_DATASET, "Dataset", dataset_list1, dataset_list2);
+    DISPATCH(H5O_TYPE_NAMED_DATATYPE, "Type", NULL, datatype_list2);
+
+    /* Default output width */
+    width_g = get_width();
+
+    /* Switches come before non-switch arguments */
+    for(argno = 1; argno < argc && '-' == argv[argno][0]; argno++) {
+        if(!HDstrcmp(argv[argno], "--")) {
+            /* Last switch */
+            argno++;
+            break;
+        } else if(!HDstrcmp(argv[argno], "--help")) {
+            usage();
+            leave(EXIT_SUCCESS);
+        } else if(!HDstrcmp(argv[argno], "--address")) {
+            address_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--data")) {
+            data_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--enable-error-stack")) {
+            show_errors_g = TRUE;
+        /* deprecated --errors */
+        } else if(!HDstrcmp(argv[argno], "--errors")) {
+            show_errors_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--follow-symlinks")) {
+            follow_symlink_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--no-dangling-links")) {
+            no_dangling_link_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--external")) {
+            follow_elink_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--full")) {
+            fullname_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--group")) {
+            grp_literal_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--label")) {
+            label_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--recursive")) {
+            recursive_g = TRUE;
+            fullname_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--simple")) {
+            simple_output_g = TRUE;
+        } else if(!HDstrcmp(argv[argno], "--string")) {
+            string_g = TRUE;
+        } else if(!HDstrncmp(argv[argno], "--vfd=", (size_t)6)) {
+            preferred_driver = argv[argno]+6;
+        } else if(!HDstrncmp(argv[argno], "--width=", (size_t)8)) {
+            width_g = (int)HDstrtol(argv[argno]+8, &rest, 0);
+
+            if(0 == width_g)
+                no_line_wrap_g = TRUE;
+            else if(width_g < 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if(!HDstrcmp(argv[argno], "--width")) {
+            if((argno + 1) >= argc) {
+                usage();
+                leave(EXIT_FAILURE);
+            } else {
+                s = argv[++argno];
+            }
+            width_g = (int)HDstrtol(s, &rest, 0);
+            if(width_g <= 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if(!HDstrcmp(argv[argno], "--verbose")) {
+            verbose_g++;
+        } else if(!HDstrcmp(argv[argno], "--version")) {
+            print_version(h5tools_getprogname());
+            leave(EXIT_SUCCESS);
+        } else if(!HDstrcmp(argv[argno], "--hexdump")) {
+            hexdump_g = TRUE;
+        } else if(!HDstrncmp(argv[argno], "-w", (size_t)2)) {
+            if(argv[argno][2]) {
+                s = argv[argno] + 2;
+            } else if((argno + 1) >= argc) {
+                usage();
+                leave(EXIT_FAILURE);
+            } else {
+                s = argv[++argno];
+            }
+            width_g = (int)HDstrtol(s, &rest, 0);
+
+            if(0 == width_g)
+                no_line_wrap_g = TRUE;
+            else if(width_g < 0 || *rest) {
+                usage();
+                leave(EXIT_FAILURE);
+            }
+        } else if('-'!=argv[argno][1]) {
+            /* Single-letter switches */
+            for(s = argv[argno] + 1; *s; s++) {
+                switch(*s) {
+                    case '?':
+                    case 'h': /* --help */
+                        usage();
+                        leave(EXIT_SUCCESS);
+
+                    case 'a': /* --address */
+                        address_g = TRUE;
+                        break;
+
+                    case 'd': /* --data */
+                        data_g = TRUE;
+                        break;
+
+                    /* deprecated -e */
+                    case 'e': /* --errors */
+                        show_errors_g = TRUE;
+                        break;
+
+                    case 'E': /* --external */
+                        follow_elink_g = TRUE;
+                        break;
+
+                    case 'f': /* --full */
+                        fullname_g = TRUE;
+                        break;
+
+                    case 'g': /* --group */
+                        grp_literal_g = TRUE;
+                        break;
+
+                    case 'l': /* --label */
+                        label_g = TRUE;
+                        break;
+
+                    case 'r': /* --recursive */
+                        recursive_g = TRUE;
+                        fullname_g = TRUE;
+                        break;
+
+                    case 'S': /* --simple */
+                        simple_output_g = TRUE;
+                        break;
+
+                    case 's': /* --string */
+                        string_g = TRUE;
+                        break;
+
+                    case 'v': /* --verbose */
+                        verbose_g++;
+                        break;
+
+                    case 'V': /* --version */
+                        print_version(h5tools_getprogname());
+                        leave(EXIT_SUCCESS);
+
+                    case 'x': /* --hexdump */
+                        hexdump_g = TRUE;
+                        break;
+
+                    default:
+                        usage();
+                        leave(EXIT_FAILURE);
+                } /* end switch */
+            } /* end for */
+        } else {
+            usage();
+            leave(EXIT_FAILURE);
+        }
+    } /* end for */
+
+    /* If no arguments remain then print a usage message (instead of doing
+     * absolutely nothing ;-) */
+    if(argno >= argc) {
+        usage();
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Check for conflicting arguments */
+    if (!is_valid_args())
+    {
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    /* Turn off HDF5's automatic error printing unless you're debugging h5ls */
+    if(!show_errors_g)
+        H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+
+    /* Each remaining argument is an hdf5 file followed by an optional slash
+     * and object name.
+     *
+     * Example: ../dir1/foo/bar/baz
+     *          \_________/\______/
+     *             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). */
+    show_file_name_g = (argc-argno > 1); /*show file names if more than one*/
+    while(argno < argc) {
+        H5L_info_t li;
+        iter_t iter;
+        symlink_trav_t symlink_list;
+        size_t u;
+
+        fname = HDstrdup(argv[argno++]);
+        oname = NULL;
+        file = -1;
+
+        while(fname && *fname) {
+            file = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, preferred_driver, drivername, sizeof drivername);
+
+            if(file >= 0) {
+                if(verbose_g)
+                    PRINTSTREAM(rawoutstream, "Opened \"%s\" with %s driver.\n", fname, drivername);
+                break; /*success*/
+            } /* end if */
+
+            /* Shorten the file name; lengthen the object name */
+            x = oname;
+            oname = HDstrrchr(fname, '/');
+            if(x)
+                *x = '/';
+            if(!oname)
+                break;
+            *oname = '\0';
+        } /* end while */
+
+        if(file < 0) {
+            HDfprintf(rawerrorstream, "%s: unable to open file\n", argv[argno-1]);
+            HDfree(fname);
+            err_exit = 1;
+            continue;
+        } /* end if */
+        if(oname) {
+            /* Always use absolute paths to avoid confusion, keep track of where
+             * to begin path name output */
+            *oname = '/';
+            iter.base_len = HDstrlen(oname);
+            iter.base_len -= oname[iter.base_len-1] == '/';
+            x = oname;
+            if(NULL == (oname = HDstrdup(oname))) {
+                HDfprintf(rawerrorstream, "memory allocation failed\n");
+                leave(EXIT_FAILURE);
+            }
+            *x = '\0';
+            /* Delay specifying the name start point so the original object name
+             * is displayed if it is a link or non-group object */
+            iter.name_start = 1;
+        }
+        if(!oname || !*oname) {
+            oname = root_name;
+            if(recursive_g)
+                display_root_g = TRUE;
+            iter.base_len = 0;
+            iter.name_start = 0;
+            /* Use x to remember if we have allocated space in oname */
+            x = NULL;
+        } /* end if */
+
+        /* Remember the file information for later */
+        iter.fname = fname;
+        iter.fid = file;
+        iter.gid = -1;
+        iter.symlink_target = FALSE;
+        iter.symlink_list = &symlink_list;
+        iter.symlink_list->dangle_link = FALSE;
+
+        /* Initialize list of visited symbolic links */
+        symlink_list.nused = symlink_list.nalloc = 0;
+        symlink_list.objs = NULL;
+
+        /* Check for root group as object name */
+        if(HDstrcmp(oname, root_name)) {
+            /* Check the type of link given */
+            if(H5Lget_info(file, oname, &li, H5P_DEFAULT) < 0) {
+                hsize_t             curr_pos = 0;        /* total data element position   */
+                h5tools_str_t       buffer;          /* string into which to render   */
+                h5tools_context_t   ctx;             /* print context  */
+                h5tool_format_t    *info = &ls_dataformat;
+
+                HDmemset(&ctx, 0, sizeof(ctx));
+                HDmemset(&buffer, 0, sizeof(h5tools_str_t));
+
+                h5tools_str_reset(&buffer);
+                print_obj_name(&buffer, &iter, oname, "**NOT FOUND**");
+                h5tools_render_element(rawoutstream, info, &ctx, &buffer, &curr_pos, (size_t)info->line_ncols, (hsize_t)0, (hsize_t)0);
+                leave(EXIT_FAILURE);
+            } /* end if */
+        } /* end if */
+        else
+            li.type = H5L_TYPE_HARD;
+
+        /* Open the object and display it's information */
+        if(li.type == H5L_TYPE_HARD) {
+            if(visit_obj(file, oname, &iter) < 0)
+                leave(EXIT_FAILURE);
+        } /* end if(li.type == H5L_TYPE_HARD) */
+        else {
+            /* Specified name is not for object -- list that link */
+            /* Use file ID for root group ID */
+            iter.gid = file;
+            list_lnk(oname, &li, &iter);
+        }
+        H5Fclose(file);
+        HDfree(fname);
+        if(x)
+            HDfree(oname);
+
+        for(u=0; u < symlink_list.nused; u++)
+        {
+            if (symlink_list.objs[u].type == H5L_TYPE_EXTERNAL)
+                HDfree(symlink_list.objs[u].file);
+
+            HDfree(symlink_list.objs[u].path);
+        }
+        HDfree(symlink_list.objs);
+
+        /* if no-dangling-links option specified and dangling link found */
+        if (no_dangling_link_g && iter.symlink_list->dangle_link)
+            err_exit = 1;
+    } /* end while */
+
+    if (err_exit)
+        leave(EXIT_FAILURE);
+    else
+        leave(EXIT_SUCCESS);
+} /* end main() */
+
diff --git a/tools/src/h5repack/CMakeLists.txt b/tools/src/h5repack/CMakeLists.txt
new file mode 100644
index 0000000..81e6275
--- /dev/null
+++ b/tools/src/h5repack/CMakeLists.txt
@@ -0,0 +1,65 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5REPACK)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
+
+# --------------------------------------------------------------------
+# Add h5Repack executables
+# --------------------------------------------------------------------
+set (REPACK_COMMON_SOURCES
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_copy.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_filters.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_opttable.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_parse.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_refs.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_verify.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack.c
+)
+
+add_executable (h5repack ${REPACK_COMMON_SOURCES} ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_main.c)
+TARGET_NAMING (h5repack STATIC)
+TARGET_C_PROPERTIES (h5repack STATIC " " " ")
+target_link_libraries (h5repack  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5repack PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5repack")
+
+set (H5_DEP_EXECUTABLES h5repack)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5repack-shared ${REPACK_COMMON_SOURCES} ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_main.c)
+  TARGET_NAMING (h5repack-shared SHARED)
+  TARGET_C_PROPERTIES (h5repack-shared SHARED " " " ")
+  target_link_libraries (h5repack-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5repack-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5repack-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5repack-shared)
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5repack-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5repack ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5repack/Makefile.am b/tools/src/h5repack/Makefile.am
new file mode 100644
index 0000000..c71e65b
--- /dev/null
+++ b/tools/src/h5repack/Makefile.am
@@ -0,0 +1,45 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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, test, and tools/lib directories
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
+
+# A convenience library for the h5repack tool and the h5repack tests
+noinst_LTLIBRARIES=libh5repack.la
+
+libh5repack_la_SOURCES=h5repack.c h5repack_copy.c h5repack_filters.c \
+                       h5repack_opttable.c h5repack_parse.c h5repack_refs.c \
+                       h5repack_verify.c
+libh5repack_la_LDFLAGS = $(AM_LDFLAGS)
+libh5repack_la_LIBADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+
+
+# Our main target, h5repack tool
+bin_PROGRAMS=h5repack
+
+h5repack_SOURCES=h5repack_main.c
+
+# Add h5repack specific linker flags here
+h5repack_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Depend on the hdf5 library, the tools library, the h5repack library
+h5repack_LDADD=libh5repack.la $(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5repack/Makefile.in b/tools/src/h5repack/Makefile.in
new file mode 100644
index 0000000..d22abce
--- /dev/null
+++ b/tools/src/h5repack/Makefile.in
@@ -0,0 +1,1494 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5repack$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libh5repack_la_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+am_libh5repack_la_OBJECTS = h5repack.lo h5repack_copy.lo \
+	h5repack_filters.lo h5repack_opttable.lo h5repack_parse.lo \
+	h5repack_refs.lo h5repack_verify.lo
+libh5repack_la_OBJECTS = $(am_libh5repack_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 = 
+libh5repack_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libh5repack_la_LDFLAGS) $(LDFLAGS) -o \
+	$@
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_h5repack_OBJECTS = h5repack_main.$(OBJEXT)
+h5repack_OBJECTS = $(am_h5repack_OBJECTS)
+h5repack_DEPENDENCIES = libh5repack.la $(LIBH5TOOLS) $(LIBHDF5)
+h5repack_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5repack_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 = $(libh5repack_la_SOURCES) $(h5repack_SOURCES)
+DIST_SOURCES = $(libh5repack_la_SOURCES) $(h5repack_SOURCES)
+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 $(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, test, and tools/lib directories
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# A convenience library for the h5repack tool and the h5repack tests
+noinst_LTLIBRARIES = libh5repack.la
+libh5repack_la_SOURCES = h5repack.c h5repack_copy.c h5repack_filters.c \
+                       h5repack_opttable.c h5repack_parse.c h5repack_refs.c \
+                       h5repack_verify.c
+
+libh5repack_la_LDFLAGS = $(AM_LDFLAGS)
+libh5repack_la_LIBADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+h5repack_SOURCES = h5repack_main.c
+
+# Add h5repack specific linker flags here
+h5repack_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Depend on the hdf5 library, the tools library, the h5repack library
+h5repack_LDADD = libh5repack.la $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5repack/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5repack/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-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libh5repack.la: $(libh5repack_la_OBJECTS) $(libh5repack_la_DEPENDENCIES) $(EXTRA_libh5repack_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libh5repack_la_LINK)  $(libh5repack_la_OBJECTS) $(libh5repack_la_LIBADD) $(LIBS)
+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
+
+h5repack$(EXEEXT): $(h5repack_OBJECTS) $(h5repack_DEPENDENCIES) $(EXTRA_h5repack_DEPENDENCIES) 
+	@rm -f h5repack$(EXEEXT)
+	$(AM_V_CCLD)$(h5repack_LINK) $(h5repack_OBJECTS) $(h5repack_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_copy.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_filters.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_opttable.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_parse.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_refs.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repack_verify.Plo at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(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)
+
+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-noinstLTLIBRARIES 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-noinstLTLIBRARIES 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-dyn: $(DYN)
+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 dyn 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/src/h5repack/h5repack.c b/tools/src/h5repack/h5repack.c
new file mode 100644
index 0000000..d047612
--- /dev/null
+++ b/tools/src/h5repack/h5repack.c
@@ -0,0 +1,938 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 <ctype.h>
+
+#include "H5private.h"
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/*-------------------------------------------------------------------------
+ * File: h5repack.c
+ * Purpose: Public API functions
+ *-------------------------------------------------------------------------
+ */
+
+static int check_options(pack_opt_t *options);
+static int check_objects(const char* fname, pack_opt_t *options);
+static const char* get_sfilter(H5Z_filter_t filtn);
+static int have_request(pack_opt_t *options);
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack
+ *
+ * Purpose: locate all high-level HDF5 objects in the file
+ *  and compress/chunk them using options
+ *
+ * Algorithm: 2 traversals are made to the file; the 1st builds a list of
+ *  the objects, the 2nd makes a copy of them, using the options;
+ *  the reason for the 1st traversal is to check for invalid
+ *  object name requests
+ *
+ * Return: 0, ok, -1, fail
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: September, 22, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int h5repack(const char* infile, const char* outfile, pack_opt_t *options) {
+	/* check input */
+	if (check_options(options) < 0)
+		return -1;
+
+	/* check for objects in input that are in the file */
+	if (check_objects(infile, options) < 0)
+		return -1;
+
+	/* copy the objects  */
+	if (copy_objects(infile, outfile, options) < 0)
+		return -1;
+
+	return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_init
+ *
+ * Purpose: initialize options
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5repack_init(pack_opt_t *options, int verbose, hbool_t latest)
+{
+    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++) {
+        options->filter_g[n].filtn = -1;
+        options->filter_g[n].cd_nelmts = 0;
+        for (k = 0; k < CD_VALUES; k++)
+            options->filter_g[n].cd_values[k] = 0;
+    }
+
+    return (options_table_init(&(options->op_tbl)));
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_end
+ *
+ * Purpose: free options table
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int h5repack_end(pack_opt_t *options) {
+	return options_table_free(options->op_tbl);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_addfilter
+ *
+ * Purpose: add a compression -f option to table
+ *   Example: -f dset:GZIP=6
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5repack_addfilter(const char* str, pack_opt_t *options)
+{
+    obj_list_t *obj_list = NULL; /* one object list for the -f and -l option entry */
+    filter_info_t filter;       /* filter info for the current -f option entry */
+    unsigned n_objs;    /* number of objects in the current -f or -l option entry */
+    int is_glb;         /* is the filter global */
+
+    /* parse the -f option */
+    if (NULL == (obj_list = parse_filter(str, &n_objs, &filter, options, &is_glb)))
+        return -1;
+
+    /* if it applies to all objects */
+    if (is_glb) {
+        int n;
+
+        n = options->n_filter_g++; /* increase # of global filters */
+        if (options->n_filter_g > H5_REPACK_MAX_NFILTERS) {
+            error_msg("maximum number of filters exceeded for <%s>\n", str);
+            HDfree(obj_list);
+            return -1;
+        }
+
+        options->filter_g[n] = filter;
+    }
+    else
+        options_add_filter(obj_list, n_objs, filter, options->op_tbl);
+
+    HDfree(obj_list);
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_addlayout
+ *
+ * Purpose: add a layout option
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5repack_addlayout(const char* str, pack_opt_t *options)
+{
+    obj_list_t *obj_list = NULL; /*one object list for the -t and -c option entry */
+    unsigned n_objs; /*number of objects in the current -t or -c option entry */
+    pack_info_t pack; /*info about layout to extract from parse */
+    int j;
+    int ret_value = -1;
+
+    init_packobject(&pack);
+
+    if (options->all_layout == 1) {
+        error_msg( "invalid layout input: 'all' option is present with other objects <%s>\n", str);
+        return ret_value;
+    }
+
+    /* parse the layout option */
+    obj_list = parse_layout(str, &n_objs, &pack, options);
+    if (obj_list) {
+        /* set layout option */
+        options->layout_g = pack.layout;
+
+        /* no individual dataset specified */
+        if (options->all_layout == 1) {
+            if (pack.layout == H5D_CHUNKED) {
+                /* -2 means the NONE option, remove chunking
+                 and set the global layout to contiguous */
+                if (pack.chunk.rank == -2)
+                    options->layout_g = H5D_CONTIGUOUS;
+                /* otherwise set the global chunking type */
+                else {
+                    options->chunk_g.rank = pack.chunk.rank;
+                    for (j = 0; j < pack.chunk.rank; j++)
+                        options->chunk_g.chunk_lengths[j] = pack.chunk.chunk_lengths[j];
+                }
+            }
+        }
+
+        /* individual dataset specified */
+        if (options->all_layout == 0)
+            ret_value = options_add_layout(obj_list, n_objs, &pack, options->op_tbl);
+
+        HDfree(obj_list);
+        ret_value = 0;
+    }
+
+    return ret_value;
+}
+
+/* Note: The below copy_named_datatype(), named_datatype_free(), copy_attr()
+ * were located in h5repack_copy.c as static prior to bugfix1726.
+ * Made shared functions as copy_attr() was needed in h5repack_refs.c.
+ * However copy_attr() may be obsoleted when H5Acopy is available and put back
+ * others to static in h5repack_copy.c.
+ */
+/*-------------------------------------------------------------------------
+ * Function: copy_named_datatype
+ *
+ * Purpose: Copies the specified datatype anonymously, and returns an open
+ *          id for that datatype in the output file.  The first time this
+ *          is called it scans every named datatype in travt into a
+ *          private stack, afterwards it simply scans that stack.  The id
+ *          returned must be closed after it is no longer needed.
+ *          named_datatype_free must be called before the program exits
+ *          to free the stack.
+ *
+ * Programmer: Neil Fortner
+ *
+ * Date: April 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t copy_named_datatype(hid_t type_in, hid_t fidout,
+		named_dt_t **named_dt_head_p, trav_table_t *travt, pack_opt_t *options) {
+	named_dt_t *dt = *named_dt_head_p; /* Stack pointer */
+	named_dt_t *dt_ret = NULL; /* Datatype to return */
+	H5O_info_t oinfo; /* Object info of input dtype */
+	hid_t ret_value = -1; /* The identifier of the named dtype in the out file */
+
+	if (H5Oget_info(type_in, &oinfo) < 0)
+		goto done;
+
+	if (*named_dt_head_p) {
+		/* Stack already exists, search for the datatype */
+		while (dt && dt->addr_in != oinfo.addr)
+			dt = dt->next;
+
+		dt_ret = dt;
+	}
+	else {
+		/* Create the stack */
+		size_t i;
+
+		for (i = 0; i < travt->nobjs; i++) {
+			if (travt->objs[i].type == H5TRAV_TYPE_NAMED_DATATYPE) {
+				/* Push onto the stack */
+				if (NULL == (dt = (named_dt_t *) HDmalloc(sizeof(named_dt_t)))) {
+					goto done;
+				}
+				dt->next = *named_dt_head_p;
+				*named_dt_head_p = dt;
+
+				/* Update the address and id */
+				dt->addr_in = travt->objs[i].objno;
+				dt->id_out = -1;
+
+				/* Check if this type is the one requested */
+				if (oinfo.addr == dt->addr_in) {
+					HDassert(!dt_ret);
+					dt_ret = dt;
+				} /* end if */
+			} /* end if */
+		} /* end for */
+	} /* end else */
+
+	/* Handle the case that the requested datatype was not found.  This is
+	 * possible if the datatype was committed anonymously in the input file. */
+	if (!dt_ret) {
+		/* Push the new datatype onto the stack */
+		if (NULL == (dt_ret = (named_dt_t *) HDmalloc(sizeof(named_dt_t)))) {
+			goto done;
+		}
+		dt_ret->next = *named_dt_head_p;
+		*named_dt_head_p = dt_ret;
+
+		/* Update the address and id */
+		dt_ret->addr_in = oinfo.addr;
+		dt_ret->id_out = -1;
+	} /* end if */
+
+	/* If the requested datatype does not yet exist in the output file, copy it
+	 * anonymously */
+	if (dt_ret->id_out < 0) {
+		if (options->use_native == 1)
+			dt_ret->id_out = h5tools_get_native_type(type_in);
+		else
+			dt_ret->id_out = H5Tcopy(type_in);
+		if (dt_ret->id_out < 0)
+			goto done;
+		if (H5Tcommit_anon(fidout, dt_ret->id_out, H5P_DEFAULT, H5P_DEFAULT) < 0)
+			goto done;
+	} /* end if */
+
+	/* Set return value */
+	ret_value = dt_ret->id_out;
+
+	/* Increment the ref count on id_out, because the calling function will try
+	 * to close it */
+	if(H5Iinc_ref(ret_value) < 0) {
+		ret_value = -1;
+	}
+
+done:
+	return (ret_value);
+} /* end copy_named_datatype */
+
+/*-------------------------------------------------------------------------
+ * Function: named_datatype_free
+ *
+ * Purpose: Frees the stack of named datatypes.
+ *
+ * Programmer: Neil Fortner
+ *
+ * Date: April 14, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err) {
+	named_dt_t *dt = *named_dt_head_p;
+	int ret_value = -1;
+
+	while (dt) {
+		/* Pop the datatype off the stack and free it */
+		if (H5Tclose(dt->id_out) < 0 && !ignore_err)
+			goto done;
+		dt = dt->next;
+		HDfree(*named_dt_head_p);
+		*named_dt_head_p = dt;
+	} /* end while */
+
+	ret_value = 0;
+
+done:
+	return (ret_value);
+} /* end named_datatype_free */
+
+/*-------------------------------------------------------------------------
+ * Function: copy_attr
+ *
+ * Purpose: copy attributes located in LOC_IN, which is obtained either from
+ * loc_id = H5Gopen2( fid, name);
+ * loc_id = H5Dopen2( fid, name);
+ * loc_id = H5Topen2( fid, name);
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: October, 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+copy_attr(hid_t loc_in, hid_t loc_out, named_dt_t **named_dt_head_p,
+		trav_table_t *travt, pack_opt_t *options)
+{
+    int ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t attr_id = -1; /* attr ID */
+    hid_t attr_out = -1; /* attr ID */
+    hid_t space_id = -1; /* space ID */
+    hid_t ftype_id = -1; /* file type ID */
+    hid_t wtype_id = -1; /* read/write type ID */
+    size_t msize; /* size of type */
+    void *buf = NULL; /* data buffer */
+    hsize_t nelmts; /* number of elements in dataset */
+    int rank; /* rank of dataset */
+    htri_t is_named; /* Whether the datatype is named */
+    hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
+    char name[255];
+    H5O_info_t oinfo; /* object info */
+    int j;
+    unsigned u;
+    hbool_t is_ref = 0;
+    H5T_class_t type_class = -1;
+
+    if (H5Oget_info(loc_in, &oinfo) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Oget_info failed");
+
+    /*-------------------------------------------------------------------------
+     * copy all attributes
+     *-------------------------------------------------------------------------
+     */
+    for (u = 0; u < (unsigned) oinfo.num_attrs; u++) {
+        /* open attribute */
+        if ((attr_id = H5Aopen_by_idx(loc_in, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t) u, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aopen_by_idx failed");
+
+        /* get name */
+        if (H5Aget_name(attr_id, (size_t) 255, name) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+
+        /* get the file datatype  */
+        if ((ftype_id = H5Aget_type(attr_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aget_type failed");
+
+        /* Check if the datatype is committed */
+        if ((is_named = H5Tcommitted(ftype_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tcommitted failed");
+        if (is_named && travt) {
+            hid_t fidout;
+
+            /* Create out file id */
+            if ((fidout = H5Iget_file_id(loc_out)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Iget_file_id failed");
+
+            /* Copy named dt */
+            if ((wtype_id = copy_named_datatype(ftype_id, fidout, named_dt_head_p, travt, options)) < 0) {
+                H5Fclose(fidout);
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_named_datatype failed");
+            } /* end if */
+
+            if (H5Fclose(fidout) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fclose failed");
+        } /* end if */
+        else {
+            if (options->use_native == 1)
+                wtype_id = h5tools_get_native_type(ftype_id);
+            else
+                wtype_id = H5Tcopy(ftype_id);
+        } /* end else */
+
+        /* get the dataspace handle  */
+        if ((space_id = H5Aget_space(attr_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aget_space failed");
+
+        /* get dimensions  */
+        if ((rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+        nelmts = 1;
+        for (j = 0; j < rank; j++)
+            nelmts *= dims[j];
+
+        if ((msize = H5Tget_size(wtype_id)) == 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+        /*-------------------------------------------------------------------------
+         * object references are a special case. We cannot just copy the buffers,
+         * but instead we recreate the reference.
+         * This is done on a second sweep of the file that just copies the referenced
+         * objects at copy_refs_attr()
+         *-------------------------------------------------------------------------
+         */
+        type_class = H5Tget_class(wtype_id);
+        is_ref = (type_class == H5T_REFERENCE);
+        if (type_class == H5T_VLEN || type_class == H5T_ARRAY) {
+            hid_t base_type = -1;
+
+            base_type = H5Tget_super(ftype_id);
+            is_ref = (is_ref || (H5Tget_class(base_type) == H5T_REFERENCE));
+            H5Tclose(base_type);
+        }
+
+        if (type_class == H5T_COMPOUND) {
+            int nmembers = H5Tget_nmembers(wtype_id);
+
+            for (j = 0; j < nmembers; j++) {
+                hid_t mtid = H5Tget_member_type(wtype_id, (unsigned) j);
+                H5T_class_t mtclass = H5Tget_class(mtid);
+                H5Tclose(mtid);
+
+                if (mtclass == H5T_REFERENCE) {
+                    is_ref = 1;
+                    break;
+                }
+            } /* for (j=0; i<nmembers; j++) */
+        } /* if (type_class == H5T_COMPOUND) */
+
+        if (is_ref) {
+            ; /* handled by copy_refs_attr() */
+        }
+        else {
+            /*-------------------------------------------------------------------------
+             * read to memory
+             *-------------------------------------------------------------------------
+             */
+
+            buf = (void *) HDmalloc((size_t)(nelmts * msize));
+            if (buf == NULL) {
+                error_msg("h5repack", "cannot read into memory\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+            } /* end if */
+            if (H5Aread(attr_id, wtype_id, buf) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aread failed");
+
+            /*-------------------------------------------------------------------------
+             * copy
+             *-------------------------------------------------------------------------
+             */
+
+            if ((attr_out = H5Acreate2(loc_out, name, wtype_id, space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Acreate2 failed");
+            if (H5Awrite(attr_out, wtype_id, buf) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Awrite failed");
+
+            /*close*/
+            if (H5Aclose(attr_out) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aclose failed");
+
+            /* Check if we have VL data and string in the attribute's  datatype that must
+             * be reclaimed */
+            if (TRUE == h5tools_detect_vlen(wtype_id))
+                H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
+            HDfree(buf);
+            buf = NULL;
+        } /*H5T_REFERENCE*/
+
+        if (options->verbose)
+            printf(FORMAT_OBJ_ATTR, "attr", name);
+
+        /*-------------------------------------------------------------------------
+         * close
+         *-------------------------------------------------------------------------
+         */
+
+        if (H5Tclose(ftype_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+        if (H5Tclose(wtype_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+        if (H5Sclose(space_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+        if (H5Aclose(attr_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aclose failed");
+    } /* u */
+
+    return 0;
+
+done:
+    H5E_BEGIN_TRY {
+        if (buf) {
+            /* Check if we have VL data and string in the attribute's  datatype that must
+            * be reclaimed */
+            if (TRUE == h5tools_detect_vlen(wtype_id))
+                H5Dvlen_reclaim(wtype_id, space_id, H5P_DEFAULT, buf);
+
+            /* Free buf */
+            HDfree(buf);
+        } /* end if */
+
+        H5Tclose(ftype_id);
+        H5Tclose(wtype_id);
+        H5Sclose(space_id);
+        H5Aclose(attr_id);
+        H5Aclose(attr_out);
+    } H5E_END_TRY;
+
+    return ret_value;
+} /* end copy_attr() */
+
+/*-------------------------------------------------------------------------
+ * Function: check_options
+ *
+ * Purpose: print options, checks for invalid options
+ *
+ * Return: void, return -1 on error
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: September, 22, 2003
+ *
+ * Modification:
+ *   Peter Cao, July 9, 2007
+ *   Add "-L, --latest" and other options to pack a file with the latest file format
+ *
+ *-------------------------------------------------------------------------
+ */
+static int check_options(pack_opt_t *options) {
+	unsigned int i;
+	int k, j, has_cp = 0, has_ck = 0;
+	char slayout[30];
+
+	/*-------------------------------------------------------------------------
+	 * objects to layout
+	 *-------------------------------------------------------------------------
+	 */
+	if (options->verbose && have_request(options) /* only print if requested */) {
+		printf("Objects to modify layout are...\n");
+		if (options->all_layout == 1) {
+			switch (options->layout_g) {
+			case H5D_COMPACT:
+				strcpy(slayout, "compact");
+				break;
+			case H5D_CONTIGUOUS:
+				strcpy(slayout, "contiguous");
+				break;
+			case H5D_CHUNKED:
+				strcpy(slayout, "chunked");
+				break;
+			case H5D_VIRTUAL:
+				strcpy(slayout, "virtual");
+				break;
+			case H5D_LAYOUT_ERROR:
+			case H5D_NLAYOUTS:
+				error_msg("invalid layout\n");
+				return -1;
+			default:
+				strcpy(slayout, "invalid layout\n");
+				return -1;
+			}
+			printf(" Apply %s layout to all\n", slayout);
+			if (H5D_CHUNKED == options->layout_g) {
+				printf("with dimension [");
+				for (j = 0; j < options->chunk_g.rank; j++)
+					printf("%d ", (int) options->chunk_g.chunk_lengths[j]);
+				printf("]\n");
+			}
+		}
+	}/* verbose */
+
+	for (i = 0; i < options->op_tbl->nelems; i++) {
+		char* name = options->op_tbl->objs[i].path;
+
+		if (options->op_tbl->objs[i].chunk.rank > 0) {
+			if (options->verbose) {
+				printf(" <%s> with chunk size ", name);
+				for (k = 0; k < options->op_tbl->objs[i].chunk.rank; k++)
+					printf("%d ",
+							(int) options->op_tbl->objs[i].chunk.chunk_lengths[k]);
+				printf("\n");
+			}
+			has_ck = 1;
+		}
+		else if (options->op_tbl->objs[i].chunk.rank == -2) {
+			if (options->verbose)
+				printf(" <%s> %s\n", name, "NONE (contigous)");
+			has_ck = 1;
+		}
+	}
+
+	if (options->all_layout == 1 && has_ck) {
+		error_msg(
+				"invalid chunking input: 'all' option\
+                            is present with other objects\n");
+		return -1;
+	}
+
+	/*-------------------------------------------------------------------------
+	 * objects to filter
+	 *-------------------------------------------------------------------------
+	 */
+
+	if (options->verbose && have_request(options) /* only print if requested */) {
+		printf("Objects to apply filter are...\n");
+		if (options->all_filter == 1) {
+			for (k = 0; k < options->n_filter_g; k++) {
+				H5Z_filter_t filtn = options->filter_g[k].filtn;
+				switch (filtn) {
+				case H5Z_FILTER_NONE:
+					printf(" Uncompress all\n");
+					break;
+				case H5Z_FILTER_SHUFFLE:
+				case H5Z_FILTER_FLETCHER32:
+					printf(" All with %s\n", get_sfilter(filtn));
+					break;
+				case H5Z_FILTER_SZIP:
+				case H5Z_FILTER_DEFLATE:
+					printf(" All with %s, parameter %d\n", get_sfilter(filtn),
+							options->filter_g[k].cd_values[0]);
+					break;
+				default:
+					printf(" User Defined %d\n", filtn);
+					break;
+				} /* k */
+			};
+		}
+	} /* verbose */
+
+	for (i = 0; i < options->op_tbl->nelems; i++) {
+		pack_info_t pack = options->op_tbl->objs[i];
+		char* name = pack.path;
+
+		for (j = 0; j < pack.nfilters; j++) {
+			if (options->verbose) {
+				printf(" <%s> with %s filter\n", name,
+						get_sfilter(pack.filter[j].filtn));
+			}
+
+			has_cp = 1;
+
+		} /* j */
+	} /* i */
+
+	if (options->all_filter == 1 && has_cp) {
+		error_msg(
+				"invalid compression input: 'all' option\
+                            is present with other objects\n");
+		return -1;
+	}
+
+	/*-------------------------------------------------------------------------
+	 * check options for the latest format
+	 *-------------------------------------------------------------------------
+	 */
+
+	if (options->grp_compact < 0) {
+		error_msg(
+				"invalid maximum number of links to store as header messages\n");
+		return -1;
+	}
+	if (options->grp_indexed < 0) {
+		error_msg(
+				"invalid minimum number of links to store in the indexed format\n");
+		return -1;
+	}
+	if (options->grp_indexed > options->grp_compact) {
+		error_msg(
+				"minimum indexed size is greater than the maximum compact size\n");
+		return -1;
+	}
+	for (i = 0; i < 8; i++) {
+		if (options->msg_size[i] < 0) {
+			error_msg("invalid shared message size\n");
+			return -1;
+		}
+	}
+
+	/*--------------------------------------------------------------------------------
+	 * verify new user userblock options; file name must be present
+	 *---------------------------------------------------------------------------------
+	 */
+	if (options->ublock_filename != NULL && options->ublock_size == 0) {
+		if (options->verbose) {
+			printf(
+					"Warning: user block size missing for file %s. Assigning a default size of 1024...\n",
+					options->ublock_filename);
+			options->ublock_size = 1024;
+		}
+	}
+
+	if (options->ublock_filename == NULL && options->ublock_size != 0) {
+		error_msg("file name missing for user block\n",
+				options->ublock_filename);
+		return -1;
+	}
+
+	/*--------------------------------------------------------------------------------
+	 * verify alignment options; threshold is zero default but alignment not
+	 *---------------------------------------------------------------------------------
+	 */
+
+	if (options->alignment == 0 && options->threshold != 0) {
+		error_msg("alignment for H5Pset_alignment missing\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: check_objects
+ *
+ * Purpose: locate all HDF5 objects in the file and compare with user
+ *  supplied list
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: September, 23, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static int check_objects(const char* fname, pack_opt_t *options) {
+	hid_t fid;
+	unsigned int i;
+	trav_table_t *travt = NULL;
+
+	/* nothing to do */
+	if (options->op_tbl->nelems == 0)
+		return 0;
+
+	/*-------------------------------------------------------------------------
+	 * open the file
+	 *-------------------------------------------------------------------------
+	 */
+	if ((fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0))
+			< 0) {
+		printf("<%s>: %s\n", fname, H5FOPENERROR);
+		return -1;
+	}
+
+	/*-------------------------------------------------------------------------
+	 * get the list of objects in the file
+	 *-------------------------------------------------------------------------
+	 */
+
+	/* init table */
+	trav_table_init(&travt);
+
+	/* get the list of objects in the file */
+	if (h5trav_gettable(fid, travt) < 0)
+		goto out;
+
+	/*-------------------------------------------------------------------------
+	 * compare with user supplied list
+	 *-------------------------------------------------------------------------
+	 */
+
+	if (options->verbose)
+		printf("Opening file <%s>. Searching for objects to modify...\n",
+				fname);
+
+	for (i = 0; i < options->op_tbl->nelems; i++) {
+		char* name = options->op_tbl->objs[i].path;
+		if (options->verbose)
+			printf(" <%s>", name);
+
+		/* the input object names are present in the file and are valid */
+		if (h5trav_getindext(name, travt) < 0) {
+			error_msg("%s Could not find <%s> in file <%s>. Exiting...\n",
+					(options->verbose ? "\n" : ""), name, fname);
+			goto out;
+		}
+		if (options->verbose)
+			printf("...Found\n");
+
+		/* check for extra filter conditions */
+		switch (options->op_tbl->objs[i].filter->filtn) {
+		/* chunk size must be smaller than pixels per block */
+		case H5Z_FILTER_SZIP:
+			{
+				int j;
+				hsize_t csize = 1;
+				unsigned ppb = options->op_tbl->objs[i].filter->cd_values[0];
+				hsize_t dims[H5S_MAX_RANK];
+				int rank;
+				hid_t did;
+				hid_t sid;
+
+				if (options->op_tbl->objs[i].chunk.rank > 0) {
+					rank = options->op_tbl->objs[i].chunk.rank;
+					for (j = 0; j < rank; j++)
+						csize *= options->op_tbl->objs[i].chunk.chunk_lengths[j];
+				}
+				else {
+					if ((did = H5Dopen2(fid, name, H5P_DEFAULT)) < 0)
+						goto out;
+					if ((sid = H5Dget_space(did)) < 0)
+						goto out;
+					if ((rank = H5Sget_simple_extent_ndims(sid)) < 0)
+						goto out;
+					HDmemset(dims, 0, sizeof dims);
+					if (H5Sget_simple_extent_dims(sid, dims, NULL) < 0)
+						goto out;
+					for (j = 0; j < rank; j++)
+						csize *= dims[j];
+					if (H5Sclose(sid) < 0)
+						goto out;
+					if (H5Dclose(did) < 0)
+						goto out;
+				}
+
+				if (csize < ppb) {
+					printf(
+							" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
+					goto out;
+				}
+			}
+			break;
+		default:
+			break;
+		}
+	} /* i */
+
+	/*-------------------------------------------------------------------------
+	 * close
+	 *-------------------------------------------------------------------------
+	 */
+	H5Fclose(fid);
+	trav_table_free(travt);
+	return 0;
+
+out:
+	H5Fclose(fid);
+	trav_table_free(travt);
+	return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: have_request
+ *
+ * Purpose: check if a filter or layout was requested
+ *
+ * Return: 1 yes, 0 no
+ *
+ * Date: May, 24, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int have_request(pack_opt_t *options) {
+
+	if (options->all_filter || options->all_layout || options->op_tbl->nelems)
+		return 1;
+
+	return 0;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: get_sfilter
+ *
+ * Purpose: return the filter as a string name
+ *
+ * Return: name of filter, exit on error
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static const char* get_sfilter(H5Z_filter_t filtn) {
+	if (filtn == H5Z_FILTER_NONE)
+		return "NONE";
+	else if (filtn == H5Z_FILTER_DEFLATE)
+		return "GZIP";
+	else if (filtn == H5Z_FILTER_SZIP)
+		return "SZIP";
+	else if (filtn == H5Z_FILTER_SHUFFLE)
+		return "SHUFFLE";
+	else if (filtn == H5Z_FILTER_FLETCHER32)
+		return "FLETCHER32";
+	else if (filtn == H5Z_FILTER_NBIT)
+		return "NBIT";
+	else if (filtn == H5Z_FILTER_SCALEOFFSET)
+		return "SOFF";
+	else
+		return "UD";
+}
+
diff --git a/tools/src/h5repack/h5repack.h b/tools/src/h5repack/h5repack.h
new file mode 100644
index 0000000..e36f0ef
--- /dev/null
+++ b/tools/src/h5repack/h5repack.h
@@ -0,0 +1,249 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#ifndef H5REPACK_H__
+#define H5REPACK_H__
+
+#include "H5private.h"
+#include "hdf5.h"
+#include "h5trav.h"
+
+#define H5FOPENERROR "unable to open file"
+#define PFORMAT  "%-7s %-7s %-7s\n"   /* chunk info, compression info, name*/
+#define PFORMAT1 "%-7s %-7s %-7s"     /* chunk info, compression info, name*/
+#define MAX_NC_NAME 256               /* max length of a name */
+#define MAX_VAR_DIMS 32               /* max per variable dimensions */
+#define FORMAT_OBJ      " %-27s %s\n"   /* obj type, name */
+#define FORMAT_OBJ_ATTR "  %-27s %s\n"  /* obj type, name */
+#define MAX_COMPACT_DSIZE  64512  /* max data size for compact layout. -1k for header size */
+
+/* File space default information */
+#define FS_PAGESIZE_DEF		4096
+#define FS_STRATEGY_DEF        	H5F_FSPACE_STRATEGY_FSM_AGGR
+#define FS_PERSIST_DEF         	FALSE
+#define FS_THRESHOLD_DEF       	1
+
+
+/*-------------------------------------------------------------------------
+ * data structures for command line options
+ *-------------------------------------------------------------------------
+ */
+
+/* a list of names */
+typedef struct {
+ char obj[MAX_NC_NAME];
+} obj_list_t;
+
+/*
+ the type of filter and additional parameter
+ type can be one of the filters
+ H5Z_FILTER_NONE        0,  uncompress if compressed
+ H5Z_FILTER_DEFLATE     1 , deflation like gzip
+ H5Z_FILTER_SHUFFLE     2 , shuffle the data
+ H5Z_FILTER_FLETCHER32  3 , letcher32 checksum of EDC
+ H5Z_FILTER_SZIP        4 , szip compression
+ H5Z_FILTER_NBIT        5 , nbit compression
+ H5Z_FILTER_SCALEOFFSET 6 , scaleoffset compression
+*/
+
+#define CD_VALUES 20
+
+typedef struct {
+ H5Z_filter_t filtn;                           /* filter identification number */
+ unsigned     cd_values[CD_VALUES];            /* filter client data values */
+ size_t       cd_nelmts;                       /* filter client number of values */
+} filter_info_t;
+
+/* chunk lengths along each dimension and rank */
+typedef struct {
+ hsize_t chunk_lengths[MAX_VAR_DIMS];
+ int     rank;
+} chunk_info_t;
+
+/* we currently define a maximum value for the filters array,
+   that corresponds to the current library filters */
+#define H5_REPACK_MAX_NFILTERS 6
+
+/* information for one object, contains PATH, CHUNK info and FILTER info */
+typedef struct {
+ char          path[MAX_NC_NAME];               /* name of object */
+ filter_info_t filter[H5_REPACK_MAX_NFILTERS];  /* filter array */
+ int           nfilters;                        /* current number of filters */
+ H5D_layout_t  layout;                          /* layout information */
+ chunk_info_t  chunk;                           /* chunk information */
+ hid_t         refobj_id;                       /* object ID, references */
+} pack_info_t;
+
+/* store a table of all objects */
+typedef struct {
+    unsigned int size;
+    unsigned int nelems;
+    pack_info_t  *objs;
+} pack_opttbl_t;
+
+
+/*-------------------------------------------------------------------------
+ * command line options
+ *-------------------------------------------------------------------------
+ */
+
+/* all the above, ready to go to the hrepack call */
+typedef struct {
+ pack_opttbl_t   *op_tbl;     /*table with all -c and -f options */
+ int             all_layout;  /*apply the layout to all objects */
+ int             all_filter;  /*apply the filter to all objects */
+ filter_info_t   filter_g[H5_REPACK_MAX_NFILTERS];    /*global filter array for the ALL case */
+ int             n_filter_g;  /*number of global filters */
+ chunk_info_t    chunk_g;     /*global chunk INFO for the ALL case */
+ H5D_layout_t    layout_g;    /*global layout information for the ALL case */
+ int             verbose;     /*verbose mode */
+ hsize_t         min_comp;    /*minimum size to compress, in bytes */
+ int             use_native;  /*use a native type in write */
+ 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,
+                                 datatype, fill value, filter pipleline, attribute */
+ const char      *ublock_filename; /* user block file name */
+ hsize_t         ublock_size;      /* user block size */
+ 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_fspace_strategy_t fs_strategy;	/* File space handling strategy */
+ int		fs_persist; 		/* Free space section threshold */
+ long		fs_threshold; 		/* Free space section threshold */
+ long long 	fs_pagesize;   		/* File space page size */
+} pack_opt_t;
+
+
+typedef struct named_dt_t {
+    haddr_t             addr_in;    /* Address of the named dtype in the in file */
+    hid_t               id_out;     /* Open identifier for the dtype in the out file */
+    struct named_dt_t   *next;      /* Next dtype */
+} named_dt_t;
+
+/*-------------------------------------------------------------------------
+ * public functions
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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, hbool_t latest);
+int h5repack_end(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() 
+ * and struct named_dt_t were located in h5repack_copy.c as static prior to 
+ * bugfix1726. 
+ * Made shared functions as copy_attr() was needed in h5repack_refs.c. 
+ * However copy_attr() may be obsoleted when H5Acopy is available and put back
+ * others to static in h5repack_copy.c.
+ */
+hid_t copy_named_datatype(hid_t type_in, hid_t fidout, named_dt_t **named_dt_head_p, trav_table_t *travt, pack_opt_t *options);
+int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err);
+int copy_attr(hid_t loc_in, hid_t loc_out, named_dt_t **named_dt_head_p,
+              trav_table_t *travt, pack_opt_t *options);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/*-------------------------------------------------------------------------
+ * private functions
+ *-------------------------------------------------------------------------
+ */
+
+
+/*-------------------------------------------------------------------------
+ * copy module
+ *-------------------------------------------------------------------------
+ */
+
+int copy_objects   (const char* fnamein,
+                    const char* fnameout,
+                    pack_opt_t *options);
+
+int do_copy_refobjs(hid_t fidin,
+                    hid_t fidout,
+                    trav_table_t *travt,
+                    pack_opt_t *options);
+
+/*-------------------------------------------------------------------------
+ * filters and verify module
+ *-------------------------------------------------------------------------
+ */
+void init_packobject(pack_info_t *obj);
+
+
+/*-------------------------------------------------------------------------
+ * filters and copy module
+ *-------------------------------------------------------------------------
+ */
+
+int apply_filters(const char* name,    /* object name from traverse list */
+                  int rank,            /* rank of dataset */
+                  hsize_t *dims,       /* dimensions of dataset */
+                  size_t msize,        /* size of type */
+                  hid_t dcpl_id,       /* dataset creation property list */
+                  pack_opt_t *options, /* repack options */
+                  int *has_filter);    /* (OUT) object NAME has a filter */
+
+
+/*-------------------------------------------------------------------------
+ * options table
+ *-------------------------------------------------------------------------
+ */
+int          options_table_init( pack_opttbl_t **tbl );
+int          options_table_free( pack_opttbl_t *table );
+int          options_add_layout( obj_list_t *obj_list,
+                                 unsigned n_objs,
+                                 pack_info_t *pack,
+                                 pack_opttbl_t *table );
+int          options_add_filter ( obj_list_t *obj_list,
+                                 unsigned n_objs,
+                                 filter_info_t filt,
+                                 pack_opttbl_t *table );
+pack_info_t* options_get_object( const char *path,
+                                 pack_opttbl_t *table);
+
+/*-------------------------------------------------------------------------
+ * parse functions
+ *-------------------------------------------------------------------------
+ */
+
+obj_list_t* parse_filter(const char *str,
+                         unsigned *n_objs,
+                         filter_info_t *filt,
+                         pack_opt_t *options,
+                         int *is_glb);
+
+obj_list_t* parse_layout(const char *str,
+                         unsigned *n_objs,
+                         pack_info_t *pack,    /* info about object */
+                         pack_opt_t *options);
+
+
+
+
+#endif  /* H5REPACK_H__ */
+
diff --git a/tools/src/h5repack/h5repack_copy.c b/tools/src/h5repack/h5repack_copy.c
new file mode 100644
index 0000000..604e85f
--- /dev/null
+++ b/tools/src/h5repack/h5repack_copy.c
@@ -0,0 +1,1607 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/*-------------------------------------------------------------------------
+ * typedefs
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * globals
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * macros
+ *-------------------------------------------------------------------------
+ */
+
+/* size of buffer/# of bytes to xfer at a time when copying userblock */
+#define USERBLOCK_XFER_SIZE     512     
+
+/* check H5Dread()/H5Dwrite() error, e.g. memory allocation error inside the library. */
+#define CHECK_H5DRW_ERROR(_fun, _fail, _did, _mtid, _msid, _fsid, _pid, _buf)  {  \
+    H5E_BEGIN_TRY {  \
+        if(_fun(_did, _mtid, _msid, _fsid, _pid, _buf) < 0) {  \
+            hid_t _err_num = 0; \
+            char _msg[80]; \
+            H5Ewalk2(H5E_DEFAULT, H5E_WALK_DOWNWARD, walk_error_callback, &_err_num); \
+            H5Eget_msg(_err_num, NULL, _msg, (size_t)80); \
+            error_msg("%s %s -- %s\n", #_fun, "failed", _msg); \
+            HGOTO_DONE(_fail) \
+        } \
+    } H5E_END_TRY; \
+}
+
+/*-------------------------------------------------------------------------
+ * local functions
+ *-------------------------------------------------------------------------
+ */
+static int Get_hyperslab(hid_t dcpl_id, int rank_dset, hsize_t dims_dset[],
+		size_t size_datum, hsize_t dims_hslab[], hsize_t * hslab_nbytes_p);
+static void print_dataset_info(hid_t dcpl_id, char *objname, double per, int pr);
+static int do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt,
+		pack_opt_t *options);
+static int copy_user_block(const char *infile, const char *outfile,
+		hsize_t size);
+#if defined (H5REPACK_DEBUG_USER_BLOCK)
+static void print_user_block(const char *filename, hid_t fid);
+#endif
+static herr_t walk_error_callback(unsigned n, const H5E_error2_t *err_desc, void *udata);
+
+/* 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)
+		*((hid_t *) udata) = err_desc->maj_num;
+
+	return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: copy_objects
+ *
+ * Purpose: duplicate all HDF5 objects in the file
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: October, 23, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int copy_objects(const char* fnamein, const char* fnameout, pack_opt_t *options)
+{
+    int   	  ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t         fidin;
+    hid_t         fidout = -1;
+    trav_table_t  *travt = NULL;
+    hsize_t       ub_size = 0;        	/* size of user block */
+    hid_t         fcpl = H5P_DEFAULT; 	/* file creation property list ID */
+    hid_t         fapl = H5P_DEFAULT; 	/* file access property list ID */
+    H5F_fspace_strategy_t set_strategy;	/* Strategy to be set in outupt file */
+    hbool_t	  set_persist;		/* Persist free-space status to be set in output file */
+    hsize_t	  set_threshold;	/* Free-space section threshold to be set in output file */
+    hsize_t	  set_pagesize;		/* File space page size to be set in output file */
+    H5F_fspace_strategy_t in_strategy;	/* Strategy from input file */
+    hbool_t	  in_persist;		/* Persist free-space status from input file */
+    hsize_t	  in_threshold;		/* Free-space section threshold from input file */
+    hsize_t	  in_pagesize;		/* File space page size from input file */
+
+    /*-------------------------------------------------------------------------
+     * open input file
+     *-------------------------------------------------------------------------
+     */
+    if ((fidin = h5tools_fopen(fnamein, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t) 0)) < 0) {
+        error_msg("<%s>: %s\n", fnamein, H5FOPENERROR);
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    }
+
+    /* get user block size and file space strategy/persist/threshold */
+    {
+        hid_t fcpl_in; /* file creation property list ID for input file */
+
+        if ((fcpl_in = H5Fget_create_plist(fidin)) < 0) {
+            error_msg("failed to retrieve file creation property list\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+
+        if (H5Pget_userblock(fcpl_in, &ub_size) < 0) {
+            error_msg("failed to retrieve userblock size\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+
+	/* If the -S option is not set, get "strategy" from the input file */
+	if(H5Pget_file_space_strategy(fcpl_in, &in_strategy, &in_persist, &in_threshold) < 0) {
+	    error_msg("failed to retrieve file space strategy\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+
+	/* If the -G option is not set, get "pagesize" from the input file */
+	if(H5Pget_file_space_page_size(fcpl_in, &in_pagesize) < 0) {
+	    error_msg("failed to retrieve file space threshold\n");
+	    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+	}
+
+        if (H5Pclose(fcpl_in) < 0) {
+            error_msg("failed to close property list\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /* Check if we need to create a non-default file creation property list */
+    if (options->latest || ub_size > 0) {
+        /* Create file creation property list */
+        if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) {
+            error_msg("fail to create a file creation property list\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+
+        if (ub_size > 0) {
+            if (H5Pset_userblock(fcpl, ub_size) < 0) {
+                error_msg("failed to set non-default userblock size\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+        }
+
+        if (options->latest) {
+            unsigned i = 0, nindex = 0, mesg_type_flags[5], min_mesg_sizes[5];
+
+            /* Adjust group creation parameters for root group */
+            /* (So that it is created in "dense storage" form) */
+            if (H5Pset_link_phase_change(fcpl, (unsigned) options->grp_compact,
+                        (unsigned) options->grp_indexed) < 0) {
+                error_msg("fail to adjust group creation parameters for root group\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+
+            for (i = 0; i < 5; i++) {
+                if (options->msg_size[i] > 0) {
+                    switch (i) {
+                        case 0:
+                            mesg_type_flags[nindex] = H5O_SHMESG_SDSPACE_FLAG;
+                            break;
+
+                        case 1:
+                            mesg_type_flags[nindex] = H5O_SHMESG_DTYPE_FLAG;
+                            break;
+
+                        case 2:
+                            mesg_type_flags[nindex] = H5O_SHMESG_FILL_FLAG;
+                            break;
+
+                        case 3:
+                            mesg_type_flags[nindex] = H5O_SHMESG_PLINE_FLAG;
+                            break;
+
+                        case 4:
+                            mesg_type_flags[nindex] = H5O_SHMESG_ATTR_FLAG;
+                            break;
+
+                        default:
+                            break;
+                    } /* end switch */
+                    min_mesg_sizes[nindex] = (unsigned) options->msg_size[i];
+
+                    nindex++;
+                } /* end if */
+            } /* end for */
+
+            if (nindex > 0) {
+                if (H5Pset_shared_mesg_nindexes(fcpl, nindex) < 0) {
+                    error_msg("fail to set the number of shared object header message indexes\n");
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                }
+
+                /* msg_size[0]=dataspace, 1=datatype, 2=file value, 3=filter pipleline, 4=attribute */
+                for (i = 0; i < (nindex - 1); i++) {
+                    if (H5Pset_shared_mesg_index(fcpl, i, mesg_type_flags[i], min_mesg_sizes[i]) < 0) {
+                        error_msg("fail to configure the specified shared object header message index\n");
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                    } /* end if */
+                } /* end for */
+            } /* if (nindex>0) */
+
+            /* Create file access property list */
+            if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+                error_msg("Could not create file access property list\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            } /* end if */
+
+            if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) {
+                error_msg("Could not set property for using latest version of the format\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            } /* end if */
+        } /* end if */
+    } /* end if */
+#if defined (H5REPACK_DEBUG_USER_BLOCK)
+print_user_block(fnamein, fidin);
+#endif
+
+    /*-------------------------------------------------------------------------
+     * set the new user userblock options in the FCPL (before H5Fcreate )
+     *-------------------------------------------------------------------------
+     */
+    if (options->ublock_size > 0) {
+        /* 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");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+        }
+
+        /* set user block size */
+        if (H5Pset_userblock(fcpl, options->ublock_size) < 0) {
+            error_msg("failed to set userblock size\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+     * set alignment options
+     *-------------------------------------------------------------------------
+     */
+    if (options->alignment > 0) {
+        /* either use the FAPL already created or create a new one */
+        if (fapl == H5P_DEFAULT) {
+            /* create a file access property list */
+            if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+                error_msg("Could not create file access property list\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+        }
+
+        if (H5Pset_alignment(fapl, options->threshold, options->alignment) < 0) {
+            error_msg("failed to set alignment\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+     * set metadata block size option
+     *-------------------------------------------------------------------------
+     */
+    if (options->meta_block_size > 0) {
+        /* either use the FAPL already created or create a new one */
+        if (fapl == H5P_DEFAULT) {
+            /* create a file access property list */
+            if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+                error_msg("Could not create file access property list\n");
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+        }
+
+        if (H5Pset_meta_block_size(fapl, options->meta_block_size) < 0) {
+            error_msg("failed to set metadata block size\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+    * Set file space information
+    *-------------------------------------------------------------------------
+    */
+
+    /* 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");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /* Set file space info to those from input file */
+    set_strategy = in_strategy;
+    set_persist = in_persist;
+    set_threshold = in_threshold;
+    set_pagesize = in_pagesize;
+
+    if(options->fs_strategy == (H5F_fspace_strategy_t)-1) /* A default strategy is specified by user */
+        set_strategy = FS_STRATEGY_DEF;
+    else if(options->fs_strategy != (H5F_fspace_strategy_t)0) /* Set strategy as specified by user */
+        set_strategy = options->fs_strategy;
+
+    if(options->fs_persist == -1) /* A default "persist" is specified by user */
+        set_persist = FS_PERSIST_DEF;
+    else if(options->fs_persist != 0) /* Set "persist" as specified by user */
+        set_persist = (hbool_t)options->fs_persist;
+    
+    if(options->fs_threshold == -1) /* A "0" threshold is specified by user */
+        set_threshold = (hsize_t)0;
+    else if(options->fs_threshold != 0) /* Set threshold as specified by user */
+        set_threshold = (hsize_t)options->fs_threshold;
+
+    /* Set file space information as specified */
+    if(H5Pset_file_space_strategy(fcpl, set_strategy, set_persist, set_threshold) < 0) {
+	error_msg("failed to set file space strategy\n");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    }
+
+    if(options->fs_pagesize == -1) /* A "0" file space page size is specified by user */
+        set_pagesize = (hsize_t)0;
+    else if(options->fs_pagesize != 0) /* Set file space page size as specified by user */
+        set_pagesize = (hsize_t)options->fs_pagesize;
+
+    if(set_pagesize != FS_PAGESIZE_DEF) /* Set non-default file space page size as specified */
+        if(H5Pset_file_space_page_size(fcpl, set_pagesize) < 0) {
+            error_msg("failed to set file space page size\n");
+	    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+
+    /*-------------------------------------------------------------------------
+     * create the output file
+     *-------------------------------------------------------------------------
+     */
+    if (options->verbose)
+        printf("Making file <%s>...\n", fnameout);
+
+    if ((fidout = H5Fcreate(fnameout, H5F_ACC_TRUNC, fcpl, fapl)) < 0) {
+        error_msg("<%s>: Could not create file\n", fnameout);
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    }
+
+    /*-------------------------------------------------------------------------
+     * write a new user block if requested
+     *-------------------------------------------------------------------------
+     */
+    if (options->ublock_size > 0) {
+        if (copy_user_block(options->ublock_filename, fnameout, options->ublock_size) < 0) {
+            error_msg("Could not copy user block. Exiting...\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+     * get list of objects
+     *-------------------------------------------------------------------------
+     */
+
+    /* init table */
+    trav_table_init(&travt);
+
+    /* get the list of objects in the file */
+    if (h5trav_gettable(fidin, travt) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+
+    /*-------------------------------------------------------------------------
+     * do the copy
+     *-------------------------------------------------------------------------
+     */
+    if (do_copy_objects(fidin, fidout, travt, options) < 0) {
+        error_msg("<%s>: Could not copy data to: %s\n", fnamein, fnameout);
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    } /* end if */
+
+    /*-------------------------------------------------------------------------
+     * do the copy of referenced objects
+     * and create hard links
+     *-------------------------------------------------------------------------
+     */
+    if (do_copy_refobjs(fidin, fidout, travt, options) < 0) {
+        printf("h5repack: <%s>: Could not copy data to: %s\n", fnamein, fnameout);
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    }
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+    if (fapl > 0)
+        H5Pclose(fapl);
+
+    if (fcpl > 0)
+        H5Pclose(fcpl);
+
+    H5Fclose(fidin);
+    H5Fclose(fidout);
+
+    /* free table */
+    trav_table_free(travt);
+    travt = NULL;
+
+    /*-------------------------------------------------------------------------
+     * write only the input file user block if there is no user block file input
+     *-------------------------------------------------------------------------
+     */
+
+    if (ub_size > 0 && options->ublock_size == 0) {
+        if (copy_user_block(fnamein, fnameout, ub_size) < 0) {
+            error_msg("Could not copy user block. Exiting...\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    return 0;
+
+    /*-------------------------------------------------------------------------
+     * out
+     *-------------------------------------------------------------------------
+     */
+
+done:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+        H5Fclose(fidin);
+        H5Fclose(fidout);
+    } H5E_END_TRY;
+    if (travt)
+        trav_table_free(travt);
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: Get_hyperslab
+ *
+ * Purpose: Calulate a hyperslab from a dataset for higher performance.
+ *          The size of hyperslab is limitted by H5TOOLS_BUFSIZE.
+ *          Return the hyperslab dimentions and size in byte.
+ *
+ * Return: 0 - SUCCEED, -1 FAILED
+ *
+ * Parameters:
+ *   dcpl_id : [IN] dataset creation property.
+ *   rank_dset : [IN] dataset rank
+ *   dims_dset[] : [IN] dataset dimentions
+ *   size_datum : [IN] size of a data element in byte
+ *   dims_hslab[] : [OUT] calculated hyperslab dimentions
+ *   * hslab_nbytes_p : [OUT] total byte of the hyperslab
+ *
+ * Programmer: Jonathan Kim
+ * Date: Feburary, 2012
+ * Update:
+ *   The hyperslab calucation would be depend on if the dataset is chunked
+ *   or not.
+ *
+ *   There care 3 conditions to cover:
+ *   1. If chunked and a chunk fits in buffer, each chunk would be a unit of
+ *      collection and the boundary would be dataset's dims.
+ *   2. If chunked but a chunk doesn't fit in buffer, each data element would
+ *      be a unit of collection and the boundary would be the chunk itself.
+ *   3. If not chunked, each data element would be a unit of collection and
+ *      the boundary would be dataset's dims.
+ *
+ *   The calulation starts from the last dimention (h5dump dims output).
+ *
+ * Note:
+ *   Added for JIRA HDFFV-7862.
+ *-----------------------------------------*/
+
+int Get_hyperslab(hid_t dcpl_id, int rank_dset, hsize_t dims_dset[],
+        size_t size_datum, hsize_t dims_hslab[], hsize_t * hslab_nbytes_p)
+{
+    int ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    int k;
+    H5D_layout_t dset_layout;
+    int rank_chunk;
+    hsize_t dims_chunk[H5S_MAX_RANK];
+    hsize_t size_chunk = 1;
+    hsize_t nchunk_fit; /* number of chunks that fits in hyperslab buffer (H5TOOLS_BUFSIZE) */
+    hsize_t ndatum_fit; /* number of dataum that fits in hyperslab buffer (H5TOOLS_BUFSIZE) */
+    hsize_t chunk_dims_map[H5S_MAX_RANK]; /* mapped chunk dimentions */
+    hsize_t hs_dims_map[H5S_MAX_RANK]; /* mapped hyperslab dimentions */
+    hsize_t hslab_nbytes; /* size of hyperslab in byte */
+
+    /* init to set as size of a data element */
+    hslab_nbytes = size_datum;
+
+    /* get layout of dataset */
+    dset_layout = H5Pget_layout(dcpl_id);
+
+    /* if dataset is chunked */
+    if (dset_layout == H5D_CHUNKED) {
+        /* get chunk dims */
+        rank_chunk = H5Pget_chunk(dcpl_id, rank_dset, dims_chunk);
+        if (rank_chunk < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+
+        for (k = rank_dset; k > 0; --k)
+            size_chunk *= dims_chunk[k - 1];
+
+        /* figure out how many chunks can fit in the hyperslab buffer */
+        nchunk_fit = (H5TOOLS_BUFSIZE / size_datum) / size_chunk;
+
+        /* 1. if a chunk fit in hyperslab buffer */
+        if (nchunk_fit >= 1) {
+            /* Calulate a hyperslab that contains as many chunks that can fit
+             * in hyperslab buffer. Hyperslab will be increased starting from
+             * the last dimention of the dataset (see h5dump's dims output).
+             * The calculation boundary is dataset dims.
+             * In the loop, used mapping from a datum to a chunk to figure out
+             * chunk based hyperslab.
+             */
+            for (k = rank_dset; k > 0; --k) {
+                /* map dataset dimentions with a chunk dims */
+                chunk_dims_map[k - 1] = dims_dset[k - 1] / dims_chunk[k - 1];
+
+                /* if reminder exist, increse by 1 to cover partial edge chunks */
+                if (dims_dset[k - 1] % dims_chunk[k - 1] > 0)
+                    chunk_dims_map[k - 1]++;
+
+                /* get mapped hyperslab dims */
+                hs_dims_map[k - 1] = MIN (nchunk_fit, chunk_dims_map[k-1]);
+
+                /* prepare next round */
+                nchunk_fit = nchunk_fit / chunk_dims_map[k - 1];
+                /* if a chunk is bigger than the rest of buffer */
+                if (nchunk_fit == 0)
+                    nchunk_fit = 1;
+
+                /* get hyperslab dimentions as unmapping to actual size */
+                dims_hslab[k - 1] = MIN( (hs_dims_map[k-1] * dims_chunk[k-1]), dims_dset[k-1]);
+
+                /* calculate total size for the hyperslab */
+                hslab_nbytes *= dims_hslab[k - 1];
+            }
+        }
+        /* 2. if a chunk is bigger than hyperslab buffer */
+        else {
+            /* Calulate a hyperslab that contains as many data elements that
+             * can fit in hyperslab buffer. Hyperslab will be increased
+             * starting from the last dimention of the chunk (see h5dump's dims
+             * output).
+             * The calculation boundary is a chunk dims.
+             */
+            for (k = rank_dset; k > 0; --k) {
+                ndatum_fit = H5TOOLS_BUFSIZE / hslab_nbytes;
+
+                /* if a datum is bigger than rest of buffer */
+                if (ndatum_fit == 0)
+                    ndatum_fit = 1;
+                /* get hyperslab dimentions within a chunk boundary */
+                dims_hslab[k - 1] = MIN (dims_chunk[k-1], ndatum_fit);
+
+                /* calculate total size for the hyperslab */
+                hslab_nbytes *= dims_hslab[k - 1];
+
+                if (hslab_nbytes <= 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            }
+        }
+    }
+    /* 3. if dataset is not chunked */
+    else {
+        /* Calulate a hyperslab that contains as many data elements that can
+         * fit in hyperslab buffer. Hyperslab will be increased starting from
+         * the last dimention of the dataset (see h5dump's dims output).
+         * The calculation boundary is dataset dims.
+         */
+        for (k = rank_dset; k > 0; --k) {
+            ndatum_fit = H5TOOLS_BUFSIZE / hslab_nbytes;
+
+            /* if a datum is bigger than rest of buffer */
+            if (ndatum_fit == 0)
+                ndatum_fit = 1;
+            /* get hyperslab dimentions within dataset boundary */
+            dims_hslab[k - 1] = MIN(dims_dset[k - 1], ndatum_fit);
+
+            /* calculate total size for the hyperslab */
+            hslab_nbytes *= dims_hslab[k - 1];
+
+            if (hslab_nbytes <= 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        }
+    }
+
+    /* pass out the hyperslab size*/
+    *hslab_nbytes_p = hslab_nbytes;
+
+done:
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: do_copy_objects
+ *
+ * Purpose: duplicate all HDF5 objects in the file
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: October, 23, 2003
+ *
+ * Modifications:
+ *
+ *  July 2004:     Introduced the extra EC or NN option for SZIP
+ *
+ *  December 2004: Added a check for H5Dcreate; if the dataset cannot be created
+ *                  with the requested filter, use the input one
+ *
+ *  October 2006:  Read/write using the file type by default.
+ *
+ *  October 2006:  Read by hyperslabs for big datasets.
+ *
+ *  A threshold of H5TOOLS_MALLOCSIZE (128 MB) is the limit upon which I/O hyperslab is done
+ *  i.e., if the memory needed to read a dataset is greater than this limit,
+ *  then hyperslab I/O is done instead of one operation I/O
+ *  For each dataset, the memory needed is calculated according to
+ *
+ *  memory needed = number of elements * size of each element
+ *
+ *  if the memory needed is lower than H5TOOLS_MALLOCSIZE, then the following operations
+ *  are done
+ *
+ *  H5Dread( input_dataset1 )
+ *  H5Dread( input_dataset2 )
+ *
+ *  with all elements in the datasets selected. If the memory needed is greater than
+ *  H5TOOLS_MALLOCSIZE, then the following operations are done instead:
+ *
+ *  a strip mine is defined for each dimension k (a strip mine is defined as a
+ *  hyperslab whose size is memory manageable) according to the formula
+ *
+ *  (1) strip_mine_size[k ] = MIN(dimension[k ], H5TOOLS_BUFSIZE / size of memory type)
+ *
+ *  where H5TOOLS_BUFSIZE is a constant currently defined as 1MB. This formula assures
+ *  that for small datasets (small relative to the H5TOOLS_BUFSIZE constant), the strip
+ *  mine size k is simply defined as its dimension k, but for larger datasets the
+ *  hyperslab size is still memory manageable.
+ *  a cycle is done until the number of elements in the dataset is reached. In each
+ *  iteration, two parameters are defined for the function H5Sselect_hyperslab,
+ *  the start and size of each hyperslab, according to
+ *
+ *  (2) hyperslab_size [k] = MIN(dimension[k] - hyperslab_offset[k], strip_mine_size [k])
+ *
+ *  where hyperslab_offset [k] is initially set to zero, and later incremented in
+ *  hyperslab_size[k] offsets. The reason for the operation
+ *
+ *  dimension[k] - hyperslab_offset[k]
+ *
+ *  in (2) is that, when using the strip mine size, it assures that the "remaining" part
+ *  of the dataset that does not fill an entire strip mine is processed.
+ *
+ *  November 2006:  Use H5Ocopy in the copy of objects. The logic for using
+ *   H5Ocopy or not is if a change of filters or layout is requested by the user
+ *   then use read/write else use H5Ocopy.
+ *
+ * May, 1, 2008: Add a printing of the compression ratio of old size / new size
+ *
+ * Feburary 2012:  improve Read/Write by hyperslabs for big datasets.
+ * Programmer: Jonathan Kim
+ *
+ *  A threshold of H5TOOLS_MALLOCSIZE is the limit upon which I/O hyperslab is done
+ *  i.e., if the memory needed to read a dataset is greater than this limit,
+ *  then hyperslab I/O is done instead of one operation I/O
+ *  For each dataset, the memory needed is calculated according to
+ *
+ *  memory needed = number of elements * size of each element
+ *
+ *  if the memory needed is lower than H5TOOLS_MALLOCSIZE, then the following operations
+ *  are done
+ *
+ *  H5Dread( input_dataset )
+ *  H5Dwrite( output_dataset )
+ *
+ *  with all elements in the datasets selected. If the memory needed is greater than
+ *  H5TOOLS_MALLOCSIZE, then the following operations are done instead:
+ *
+ *  1. figure out a hyperslab (dimentions) and size  (refer to Get_hyperslab()).
+ *  2. Calculate the hyperslab selections as the selection is moving forward.
+ *     Selection would be same as the hyperslab except for the remaining edge portion
+ *     of the dataset. The code take care of the remaining portion if exist.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt,
+		pack_opt_t *options) /* repack options */
+{
+    int   ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t grp_in = -1; /* group ID */
+    hid_t grp_out = -1; /* group ID */
+    hid_t dset_in = -1; /* read dataset ID */
+    hid_t dset_out = -1; /* write dataset ID */
+    hid_t gcpl_in = -1; /* group creation property list */
+    hid_t gcpl_out = -1; /* group creation property list */
+    hid_t type_in = -1; /* named type ID */
+    hid_t type_out = -1; /* named type ID */
+    hid_t dcpl_in = -1; /* dataset creation property list ID */
+    hid_t dcpl_out = -1; /* dataset creation property list ID */
+    hid_t f_space_id = -1; /* file space ID */
+    hid_t ftype_id = -1; /* file type ID */
+    hid_t wtype_id = -1; /* read/write type ID */
+    named_dt_t *named_dt_head = NULL; /* Pointer to the stack of named datatypes copied */
+    size_t msize; /* size of type */
+    hsize_t nelmts; /* number of elements in dataset */
+    H5D_space_status_t space_status; /* determines whether space has been allocated for the dataset  */
+    int rank; /* rank of dataset */
+    hsize_t dims[H5S_MAX_RANK];/* dimensions of dataset */
+    hsize_t dsize_in; /* input dataset size before filter */
+    hsize_t dsize_out; /* output dataset size after filter */
+    int apply_s; /* flag for apply filter to small dataset sizes */
+    int apply_f; /* flag for apply filter to return error on H5Dcreate */
+    void *buf = NULL; /* buffer for raw data */
+    void *hslab_buf = NULL; /* hyperslab buffer for raw data */
+    int has_filter; /* current object has a filter */
+    int req_filter; /* there was a request for a filter */
+    int req_obj_layout = 0; /* request layout to current object */
+    unsigned crt_order_flags; /* group creation order flag */
+    unsigned i;
+    unsigned u;
+    int is_ref = 0;
+    htri_t is_named;
+    hbool_t limit_maxdims;
+    hsize_t size_dset;
+
+    /*-------------------------------------------------------------------------
+     * copy the suppplied object list
+     *-------------------------------------------------------------------------
+     */
+
+    if (options->verbose) {
+        printf("-----------------------------------------\n");
+        printf(" Type     Filter (Compression)     Name\n");
+        printf("-----------------------------------------\n");
+    }
+
+    for (i = 0; i < travt->nobjs; i++) {
+        /* init variables per obj */
+        buf = NULL;
+        limit_maxdims = FALSE;
+
+        switch (travt->objs[i].type) {
+            case H5TRAV_TYPE_UNKNOWN:
+                HDassert(0);
+                break;
+
+                /*-------------------------------------------------------------------------
+                 * H5TRAV_TYPE_GROUP
+                 *-------------------------------------------------------------------------
+                 */
+            case H5TRAV_TYPE_GROUP:
+                if (options->verbose)
+                    printf(FORMAT_OBJ, "group", travt->objs[i].name);
+
+                /* open input group */
+                if ((grp_in = H5Gopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+
+                /* get input group creation property list */
+                if ((gcpl_in = H5Gget_create_plist(grp_in)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gget_create_plist failed");
+
+                /* query and set the group creation properties */
+                if (H5Pget_link_creation_order(gcpl_in, &crt_order_flags) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pget_link_creation_order failed");
+
+                /* set up group creation property list */
+                if ((gcpl_out = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pcreate failed");
+
+                if (H5Pset_link_creation_order(gcpl_out, crt_order_flags) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pset_link_creation_order failed");
+
+                /*-------------------------------------------------------------------------
+                 * the root is a special case, we get an ID for the root group
+                 * and copy its attributes using that ID
+                 *-------------------------------------------------------------------------
+                 */
+                if (HDstrcmp(travt->objs[i].name, "/") == 0) {
+                    if ((grp_out = H5Gopen2(fidout, "/", H5P_DEFAULT)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+                }
+                else {
+                    if (options->grp_compact > 0 || options->grp_indexed > 0)
+                        if (H5Pset_link_phase_change(gcpl_out, (unsigned) options->grp_compact, (unsigned) options->grp_indexed) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pset_link_phase_change failed");
+
+                    if ((grp_out = H5Gcreate2(fidout, travt->objs[i].name, H5P_DEFAULT, gcpl_out, H5P_DEFAULT)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gcreate2 failed");
+                }
+
+                /*-------------------------------------------------------------------------
+                 * copy attrs
+                 *-------------------------------------------------------------------------
+                 */
+                if (copy_attr(grp_in, grp_out, &named_dt_head, travt, options) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+
+                if (H5Pclose(gcpl_out) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                if (H5Pclose(gcpl_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                if (H5Gclose(grp_out) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+                if (H5Gclose(grp_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+
+                break;
+
+                /*-------------------------------------------------------------------------
+                 * H5TRAV_TYPE_DATASET
+                 *-------------------------------------------------------------------------
+                 */
+            case H5TRAV_TYPE_DATASET:
+                has_filter = 0;
+                req_filter = 0;
+
+                /* check if global filters were requested */
+                if (options->n_filter_g)
+                    req_filter = 1;
+
+                /* check if filters were requested for individual objects */
+                for (u = 0; u < options->op_tbl->nelems; u++)
+                    if (HDstrcmp(travt->objs[i].name, options->op_tbl->objs[u].path) == 0)
+                        if (options->op_tbl->objs[u].filter->filtn > 0)
+                            req_filter = 1;
+
+                /* check if layout change requested individual object */
+                if (options->layout_g != H5D_LAYOUT_ERROR) {
+                    pack_info_t *pckinfo;
+
+                    /* any dataset is specified */
+                    if (options->op_tbl->nelems > 0) {
+                        /* check if object exist */
+                        pckinfo = options_get_object(travt->objs[i].name, options->op_tbl);
+                        if (pckinfo)
+                            req_obj_layout = 1;
+                    }
+                }
+
+                /* early detection of references */
+                if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                if ((ftype_id = H5Dget_type(dset_in)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_type failed");
+                if (H5T_REFERENCE == H5Tget_class(ftype_id))
+                    is_ref = 1;
+
+                /* Check if the datatype is committed */
+                if ((is_named = H5Tcommitted(ftype_id)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tcommitted failed");
+                if (is_named)
+                    if ((wtype_id = copy_named_datatype(ftype_id, fidout, &named_dt_head, travt, options)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_named_datatype failed");
+
+                if (H5Tclose(ftype_id) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                if (H5Dclose(dset_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+
+                /*-------------------------------------------------------------------------
+                 * check if we should use H5Ocopy or not
+                 * if there is a request for filters/layout, we read/write the object
+                 * otherwise we do a copy using H5Ocopy
+                 *-------------------------------------------------------------------------
+                 */
+                if (options->op_tbl->nelems || options->all_filter == 1
+                        || options->all_layout == 1 || is_ref || is_named) {
+
+                    int j;
+
+                    if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                    if ((f_space_id = H5Dget_space(dset_in)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+                    if ((ftype_id = H5Dget_type(dset_in)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_type failed");
+                    if ((dcpl_in = H5Dget_create_plist(dset_in)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+                    if ((dcpl_out = H5Pcopy(dcpl_in)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pcopy failed");
+                    if ((rank = H5Sget_simple_extent_ndims(f_space_id)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+                    HDmemset(dims, 0, sizeof dims);
+                    if (H5Sget_simple_extent_dims(f_space_id, dims, NULL) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+                    if (H5Dget_space_status(dset_in, &space_status) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space_status failed");
+
+                    nelmts = 1;
+                    for (j = 0; j < rank; j++)
+                        nelmts *= dims[j];
+
+                    /* wtype_id will have already been set if using a named dtype */
+                    if (!is_named) {
+                        if (options->use_native == 1)
+                            wtype_id = h5tools_get_native_type(ftype_id);
+                        else
+                            wtype_id = H5Tcopy(ftype_id);
+                    } /* end if */
+
+                    if ((msize = H5Tget_size(wtype_id)) == 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+                    /* size of current dset */
+                    size_dset = nelmts * msize;
+
+                    /*-------------------------------------------------------------------------
+                     * check if the dataset creation property list has filters that
+                     * are not registered in the current configuration
+                     * 1) the external filters GZIP and SZIP might not be available
+                     * 2) the internal filters might be turned off
+                     *-------------------------------------------------------------------------
+                     */
+                    if (h5tools_canreadf((travt->objs[i].name), dcpl_in) == 1) {
+                        apply_s = 1;
+                        apply_f = 1;
+
+                        /*-------------------------------------------------------------------------
+                         * references are a special case
+                         * we cannot just copy the buffers, but instead we recreate the reference
+                         * in a second traversal of the output file
+                         *-------------------------------------------------------------------------
+                         */
+                        if (H5T_REFERENCE != H5Tget_class(wtype_id)) {
+                            /* get the storage size of the input dataset */
+                            dsize_in = H5Dget_storage_size(dset_in);
+
+                            /* check for small size datasets (less than 1k) except
+                             * changing to COMPACT. For the reference, COMPACT is limited
+                             * by size 64K by library.
+                             */
+                            if (options->layout_g != H5D_COMPACT)
+                                if (size_dset < options->min_comp)
+                                    apply_s = 0;
+
+                            /* apply the filter */
+                            if (apply_s)
+                                if (apply_filters(travt->objs[i].name, rank, dims, msize, dcpl_out, options, &has_filter) < 0)
+                                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "apply_filters failed");
+
+                            /* only if layout change requested for entire file or
+                             * individual obj */
+                            if (options->all_layout > 0 || req_obj_layout == 1)
+                                /*-------------------------------------------------
+                                 * Unset the unlimited max dims if convert to other
+                                 * than chunk layouts, because unlimited max dims
+                                 * only can be applied to chunk layout.
+                                 * Also perform only for targeted dataset
+                                 * Also check for size limit to convert to compact
+                                 *-------------------------------------------------*/
+                                if (options->layout_g != H5D_CHUNKED) {
+                                    /* any dataset is specified */
+                                    if (options->op_tbl->nelems > 0) {
+                                        /* if current obj match specified obj */
+                                        if (options_get_object(travt->objs[i].name, options->op_tbl))
+                                            limit_maxdims = TRUE;
+                                    }
+                                    else  /* no dataset is specified */
+                                        limit_maxdims = TRUE;
+
+                                    /* if convert to COMPACT */
+                                    if (options->layout_g == H5D_COMPACT)
+                                        /* should be smaller than 64K */
+                                        if (size_dset > MAX_COMPACT_DSIZE)
+                                            limit_maxdims = FALSE;
+
+                                    /* unset unlimited max dims */
+                                    if (limit_maxdims)
+                                        H5Sset_extent_simple(f_space_id, rank, dims, NULL);
+                                }
+
+                            /*-------------------------------------------------------------------------
+                             * create the output dataset;
+                             * disable error checking in case the dataset cannot be created with the
+                             * modified dcpl; in that case use the original instead
+                             *-------------------------------------------------------------------------
+                             */
+                            dset_out = H5Dcreate2(fidout, travt->objs[i].name, wtype_id, f_space_id, H5P_DEFAULT, dcpl_out, H5P_DEFAULT);
+                            if (dset_out == FAIL) {
+                                H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, H5E_tools_min_id_g, "H5Dcreate2 failed");
+                                if (options->verbose)
+                                    printf(" warning: could not create dataset <%s>. Applying original settings\n", travt->objs[i].name);
+
+                                if ((dset_out = H5Dcreate2(fidout, travt->objs[i].name, wtype_id, f_space_id, H5P_DEFAULT, dcpl_in, H5P_DEFAULT)) < 0)
+                                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dcreate2 failed");
+                                apply_f = 0;
+                            }
+
+                            /*-------------------------------------------------------------------------
+                             * read/write
+                             *-------------------------------------------------------------------------
+                             */
+                            if (nelmts > 0 && space_status != H5D_SPACE_STATUS_NOT_ALLOCATED) {
+                                size_t need = (size_t)(nelmts * msize); /* bytes needed */
+
+                                /* have to read the whole dataset if there is only one element in the dataset */
+                                if (need < H5TOOLS_MALLOCSIZE)
+                                    buf = HDmalloc(need);
+
+                                if (buf != NULL) {
+                                    /* read/write: use the macro to check error, e.g. memory allocation error inside the library. */
+                                    CHECK_H5DRW_ERROR(H5Dread, FAIL, dset_in, wtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+                                    CHECK_H5DRW_ERROR(H5Dwrite, FAIL, dset_out, wtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+                                    /* Check if we have VL data in the dataset's
+                                     * datatype that must be reclaimed */
+                                    if (TRUE == H5Tdetect_class(wtype_id, H5T_VLEN))
+                                        if (H5Dvlen_reclaim(wtype_id, f_space_id, H5P_DEFAULT, buf) < 0)
+                                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dvlen_reclaim failed");
+                                }
+                                else { /* possibly not enough memory, read/write by hyperslabs */
+                                    size_t p_type_nbytes = msize; /*size of memory type */
+                                    hsize_t p_nelmts = nelmts; /*total elements */
+                                    hsize_t elmtno; /*counter  */
+                                    int carry; /*counter carry value */
+                                    unsigned int vl_data = 0; /*contains VL datatypes */
+
+                                    /* hyperslab info */
+                                    hsize_t hslab_dims[H5S_MAX_RANK]; /*hyperslab dims */
+                                    hsize_t hslab_nbytes; /*bytes per hyperslab */
+                                    hsize_t hslab_nelmts; /*elements per hyperslab*/
+                                    hid_t hslab_space; /*hyperslab data space */
+
+                                    /* hyperslab selection info */
+                                    hsize_t hs_sel_offset[H5S_MAX_RANK];/* selection offset */
+                                    hsize_t hs_sel_count[H5S_MAX_RANK]; /* selection count */
+                                    hsize_t hs_select_nelmts; /* selected elements */
+                                    hsize_t zero[8]; /*vector of zeros */
+                                    int k;
+                                    H5D_layout_t dset_layout;
+                                    hid_t dcpl_tmp = -1; /* dataset creation property list ID */
+
+                                    /* check if we have VL data in the dataset's datatype */
+                                    if (H5Tdetect_class(wtype_id, H5T_VLEN) == TRUE)
+                                        vl_data = TRUE;
+
+                                    /* check first if writing dataset is chunked,
+                                     * if so use its chunk layout for better performance. */
+                                    dset_layout = H5Pget_layout(dcpl_out);
+                                    if (dset_layout == H5D_CHUNKED)
+                                        dcpl_tmp = dcpl_out; /* writing dataset */
+                                    else { /* if reading dataset is chunked */
+                                        dset_layout = H5Pget_layout(dcpl_in);
+                                        if (dset_layout == H5D_CHUNKED)
+                                            dcpl_tmp = dcpl_in; /* reading dataset */
+                                    }
+
+                                    /* get hyperslab dims and size in byte */
+                                    if (Get_hyperslab(dcpl_tmp, rank, dims, p_type_nbytes, hslab_dims, &hslab_nbytes) < 0)
+                                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Get_hyperslab failed");
+
+                                    hslab_buf = HDmalloc((size_t)hslab_nbytes);
+
+                                    hslab_nelmts = hslab_nbytes / p_type_nbytes;
+                                    hslab_space = H5Screate_simple(1, &hslab_nelmts, NULL);
+
+                                    /* the hyperslab selection loop */
+                                    HDmemset(hs_sel_offset, 0, sizeof hs_sel_offset);
+                                    HDmemset(zero, 0, sizeof zero);
+
+                                    for (elmtno = 0; elmtno < p_nelmts; elmtno += hs_select_nelmts) {
+                                        if (rank > 0) {
+                                            /* calculate the hyperslab selections.
+                                             * The selection would be same as the hyperslab
+                                             * except for remaining edge portion of the dataset
+                                             * which is smaller then the hyperslab.
+                                             */
+                                            for (k = 0, hs_select_nelmts = 1; k < rank; k++) {
+                                                /* MIN() is used to get the remaining edge portion if exist.
+                                                 * "dims[k] - hs_sel_offset[k]" is remaining edge portion that is smaller then the hyperslab.*/
+                                                hs_sel_count[k] = MIN(dims[k] - hs_sel_offset[k], hslab_dims[k]);
+                                                hs_select_nelmts *= hs_sel_count[k];
+                                            }
+
+                                            if (H5Sselect_hyperslab(f_space_id, H5S_SELECT_SET, hs_sel_offset, NULL, hs_sel_count, NULL) < 0)
+                                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+                                            if (H5Sselect_hyperslab(hslab_space, H5S_SELECT_SET, zero, NULL, &hs_select_nelmts, NULL) < 0)
+                                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sselect_hyperslab failed");
+                                        }
+                                        else {
+                                            H5Sselect_all(f_space_id);
+                                            H5Sselect_all(hslab_space);
+                                            hs_select_nelmts = 1;
+                                        } /* rank */
+
+                                        /* read/write: use the macro to check error, e.g. memory allocation error inside the library. */
+                                        CHECK_H5DRW_ERROR(H5Dread, FAIL, dset_in, wtype_id, hslab_space, f_space_id, H5P_DEFAULT, hslab_buf);
+                                        CHECK_H5DRW_ERROR(H5Dwrite, FAIL, dset_out, wtype_id, hslab_space, f_space_id, H5P_DEFAULT, hslab_buf);
+
+                                        /* reclaim any VL memory, if necessary */
+                                        if (vl_data)
+                                            H5Dvlen_reclaim(wtype_id, hslab_space, H5P_DEFAULT, hslab_buf);
+
+                                        /* calculate the next hyperslab offset */
+                                        for (k = rank, carry = 1; k > 0 && carry; --k) {
+                                            hs_sel_offset[k - 1] += hs_sel_count[k - 1];
+                                            /* if reached the end of a dim */
+                                            if (hs_sel_offset[k - 1] == dims[k - 1])
+                                                hs_sel_offset[k - 1] = 0;
+                                            else
+                                                carry = 0;
+                                        } /* k */
+                                    } /* elmtno */
+
+                                    H5Sclose(hslab_space);
+                                    /* free */
+                                    if (hslab_buf != NULL) {
+                                        HDfree(hslab_buf);
+                                        hslab_buf = NULL;
+                                    }
+                                } /* hyperslab read */
+                            } /* if (nelmts>0 && space_status==H5D_SPACE_STATUS_NOT_ALLOCATED) */
+
+                            /*-------------------------------------------------------------------------
+                             * amount of compression used
+                             *-------------------------------------------------------------------------
+                             */
+                            if (options->verbose) {
+                                double ratio = 0;
+
+                                /* only print the compression ration if there was a filter request */
+                                if (apply_s && apply_f && req_filter) {
+                                    /* get the storage size of the output dataset */
+                                    dsize_out = H5Dget_storage_size(dset_out);
+
+                                    /* compression ratio = uncompressed size /  compressed size */
+                                    if (dsize_out != 0)
+                                        ratio = (double) dsize_in / (double) dsize_out;
+                                    print_dataset_info(dcpl_out, travt->objs[i].name, ratio, 1);
+                                }
+                                else
+                                    print_dataset_info(dcpl_in, travt->objs[i].name, ratio, 0);
+
+                                /* print a message that the filter was not applied
+                                 (in case there was a filter)
+                                 */
+                                if (has_filter && apply_s == 0)
+                                    printf(" <warning: filter not applied to %s. dataset smaller than %d bytes>\n", travt->objs[i].name, (int) options->min_comp);
+
+                                if (has_filter && apply_f == 0)
+                                    printf(" <warning: could not apply the filter to %s>\n", travt->objs[i].name);
+                            } /* verbose */
+
+                            /*-------------------------------------------------------------------------
+                             * copy attrs
+                             *-------------------------------------------------------------------------
+                             */
+                            if (copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+
+                            /*close */
+                            if (H5Dclose(dset_out) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                        }/*!H5T_REFERENCE*/
+                    }/*h5tools_canreadf*/
+
+                    /*-------------------------------------------------------------------------
+                     * close
+                     *-------------------------------------------------------------------------
+                     */
+                    if (H5Tclose(ftype_id) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                    if (H5Tclose(wtype_id) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                    if (H5Pclose(dcpl_in) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                    if (H5Pclose(dcpl_out) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                    if (H5Sclose(f_space_id) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+                    if (H5Dclose(dset_in) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                }
+                /*-------------------------------------------------------------------------
+                 * we do not have request for filter/chunking use H5Ocopy instead
+                 *-------------------------------------------------------------------------
+                 */
+                else {
+                    hid_t pid;
+
+                    /* create property to pass copy options */
+                    if ((pid = H5Pcreate(H5P_OBJECT_COPY)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pcreate failed");
+
+                    /* set options for object copy */
+                    if (H5Pset_copy_object(pid, H5O_COPY_WITHOUT_ATTR_FLAG) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pset_copy_object failed");
+
+                    /*-------------------------------------------------------------------------
+                     * do the copy
+                     *-------------------------------------------------------------------------
+                     */
+
+                    if (H5Ocopy(fidin, /* Source file or group identifier */
+                            travt->objs[i].name, /* Name of the source object to be copied */
+                            fidout, /* Destination file or group identifier  */
+                            travt->objs[i].name, /* Name of the destination object  */
+                            pid, /* Properties which apply to the copy   */
+                            H5P_DEFAULT) < 0) /* Properties which apply to the new hard link */
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Ocopy failed");
+
+                    /* close property */
+                    if (H5Pclose(pid) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+
+                    /*-------------------------------------------------------------------------
+                     * copy attrs manually
+                     *-------------------------------------------------------------------------
+                     */
+                    if ((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                    if ((dset_out = H5Dopen2(fidout, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                    if (copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+                    if (H5Dclose(dset_in) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                    if (H5Dclose(dset_out) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+
+                    if (options->verbose)
+                        printf(FORMAT_OBJ, "dset", travt->objs[i].name);
+
+                } /* end do we have request for filter/chunking */
+                break;
+
+            /*-------------------------------------------------------------------------
+             * H5TRAV_TYPE_NAMED_DATATYPE
+             *-------------------------------------------------------------------------
+             */
+            case H5TRAV_TYPE_NAMED_DATATYPE:
+                if (options->verbose)
+                    printf(FORMAT_OBJ, "type", travt->objs[i].name);
+
+                if ((type_in = H5Topen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Topen2 failed");
+
+                /* Copy the datatype anonymously */
+                if ((type_out = copy_named_datatype(type_in, fidout, &named_dt_head, travt, options)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_named_datatype failed");
+
+                /* Link in to group structure */
+                if (H5Lcreate_hard(type_out, ".", fidout, travt->objs[i].name, H5P_DEFAULT, H5P_DEFAULT) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Lcreate_hard failed");
+
+                /*-------------------------------------------------------------------------
+                 * copy attrs
+                 *-------------------------------------------------------------------------
+                 */
+                if (copy_attr(type_in, type_out, &named_dt_head, travt, options) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+
+                if (H5Tclose(type_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                if (H5Tclose(type_out) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+
+                break;
+
+            /*-------------------------------------------------------------------------
+             * H5TRAV_TYPE_LINK
+             * H5TRAV_TYPE_UDLINK
+             *
+             * Only handles external links; H5Lcopy will fail for other UD link types
+             * since we don't have creation or copy callbacks for them.
+             *-------------------------------------------------------------------------
+             */
+            case H5TRAV_TYPE_LINK:
+            case H5TRAV_TYPE_UDLINK:
+                if (options->verbose)
+                    printf(FORMAT_OBJ, "link", travt->objs[i].name);
+
+                if (H5Lcopy(fidin, travt->objs[i].name, fidout, travt->objs[i].name, H5P_DEFAULT, H5P_DEFAULT) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Lcopy failed");
+
+                if (options->verbose)
+                    printf(FORMAT_OBJ, "link", travt->objs[i].name);
+                break;
+
+            default:
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Object type not found");
+        } /* switch */
+
+        /* free */
+        if (buf != NULL) {
+            HDfree(buf);
+            buf = NULL;
+        }
+    } /* i */
+
+    /* Finalize (link) the stack of named datatypes (if any) */
+    named_datatype_free(&named_dt_head, 0);
+
+    return ret_value;
+
+done:
+    H5E_BEGIN_TRY
+    {
+        H5Gclose(grp_in);
+        H5Gclose(grp_out);
+        H5Pclose(dcpl_in);
+        H5Pclose(gcpl_in);
+        H5Pclose(gcpl_out);
+        H5Sclose(f_space_id);
+        H5Dclose(dset_in);
+        H5Dclose(dset_out);
+        H5Tclose(ftype_id);
+        H5Tclose(wtype_id);
+        H5Tclose(type_in);
+        H5Tclose(type_out);
+        named_datatype_free(&named_dt_head, 1);
+    }H5E_END_TRY;
+
+    /* free */
+    if (buf != NULL)
+        HDfree(buf);
+    if (hslab_buf != NULL)
+        HDfree(hslab_buf);
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_dataset_info
+ *
+ * Purpose: print name, filters, percentage compression of a dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void print_dataset_info(hid_t dcpl_id, char *objname, double ratio,
+    int pr)
+{
+    char strfilter[255];
+#if defined (PRINT_DEBUG )
+    char temp[255];
+#endif
+    int nfilters; /* number of filters */
+    unsigned filt_flags; /* filter flags */
+    H5Z_filter_t filtn; /* filter identification number */
+    unsigned cd_values[20]; /* filter client data values */
+    size_t cd_nelmts; /* filter client number of values */
+    char f_objname[256]; /* filter objname */
+    int i;
+
+    HDstrcpy(strfilter, "\0");
+
+    /* get information about input filters */
+    if ((nfilters = H5Pget_nfilters(dcpl_id)) < 0)
+        return;
+
+    for (i = 0; i < nfilters; i++) {
+        cd_nelmts = NELMTS(cd_values);
+
+        filtn = H5Pget_filter2(dcpl_id, (unsigned) i, &filt_flags, &cd_nelmts,
+                        cd_values, sizeof(f_objname), f_objname, NULL);
+
+        switch (filtn) {
+            case H5Z_FILTER_NONE:
+                HDstrcat(strfilter, "NONE ");
+                break;
+
+            case H5Z_FILTER_DEFLATE:
+                HDstrcat(strfilter, "GZIP ");
+
+#if defined (PRINT_DEBUG)
+                {
+                    unsigned level = cd_values[0];
+
+                    sprintf(temp,"(%d)", level);
+                    HDstrcat(strfilter, temp);
+                }
+#endif
+                break;
+
+            case H5Z_FILTER_SZIP:
+                HDstrcat(strfilter, "SZIP ");
+
+#if defined (PRINT_DEBUG)
+                {
+                    unsigned options_mask = cd_values[0]; /* from dcpl, not filt*/
+                    unsigned ppb = cd_values[1];
+
+                    sprintf(temp,"(%d,", ppb);
+                    HDstrcat(strfilter, temp);
+                    if (options_mask & H5_SZIP_EC_OPTION_MASK)
+                        HDstrcpy(temp, "EC) ");
+                    else if (options_mask & H5_SZIP_NN_OPTION_MASK)
+                        HDstrcpy(temp, "NN) ");
+                }
+                HDstrcat(strfilter, temp);
+#endif
+                break;
+
+            case H5Z_FILTER_SHUFFLE:
+                HDstrcat(strfilter, "SHUF ");
+                break;
+
+            case H5Z_FILTER_FLETCHER32:
+                HDstrcat(strfilter, "FLET ");
+                break;
+
+            case H5Z_FILTER_NBIT:
+                HDstrcat(strfilter, "NBIT ");
+                break;
+
+            case H5Z_FILTER_SCALEOFFSET:
+                HDstrcat(strfilter, "SCALEOFFSET ");
+                break;
+
+            default:
+                HDstrcat(strfilter, "UD ");
+                break;
+        } /* switch */
+    }/*i*/
+
+    if (!pr)
+        printf(FORMAT_OBJ, "dset", objname);
+    else {
+        char str[255], temp[28];
+
+        HDstrcpy(str, "dset     ");
+        HDstrcat(str, strfilter);
+        sprintf(temp, "  (%.3f:1)", ratio);
+        HDstrcat(str, temp);
+        printf(FORMAT_OBJ, str, objname);
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function: copy_user_block
+ *
+ * Purpose: copy user block from one file to another
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Peter Cao
+ *
+ * Date: October, 25, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int copy_user_block(const char *infile, const char *outfile,
+    hsize_t size)
+{
+    int ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    int infid = -1, outfid = -1; /* File descriptors */
+
+    /* User block must be any power of 2 equal to 512 or greater (512, 1024, 2048, etc.) */
+    HDassert(size > 0);
+
+    /* Open files */
+    if ((infid = HDopen(infile, O_RDONLY, 0)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDopen failed");
+    if ((outfid = HDopen(outfile, O_WRONLY, 0644)) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDopen failed");
+
+    /* Copy the userblock from the input file to the output file */
+    while (size > 0) {
+        ssize_t nread, nbytes; /* # of bytes transfered, etc. */
+        char rbuf[USERBLOCK_XFER_SIZE]; /* Buffer for reading */
+        const char *wbuf; /* Pointer into buffer, for writing */
+
+        /* Read buffer from source file */
+        if (size > USERBLOCK_XFER_SIZE)
+            nread = HDread(infid, rbuf, (size_t)USERBLOCK_XFER_SIZE);
+        else
+            nread = HDread(infid, rbuf, (size_t)size);
+        if (nread < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDread failed");
+
+        /* Write buffer to destination file */
+        /* (compensating for interrupted writes & checking for errors, etc.) */
+        nbytes = nread;
+        wbuf = rbuf;
+        while (nbytes > 0) {
+            ssize_t nwritten; /* # of bytes written */
+
+            do {
+                nwritten = HDwrite(outfid, wbuf, (size_t)nbytes);
+            } while (-1 == nwritten && EINTR == errno);
+            if (-1 == nwritten)  /* error */
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDwrite failed");
+            HDassert(nwritten > 0);
+            HDassert(nwritten <= nbytes);
+
+            /* Update # of bytes left & offset in buffer */
+            nbytes -= nwritten;
+            wbuf += nwritten;
+            HDassert(nbytes == 0 || wbuf < (rbuf + USERBLOCK_XFER_SIZE));
+        } /* end while */
+
+        /* Update size of userblock left to transfer */
+        size = size - (hsize_t) nread;
+    } /* end while */
+
+done:
+    if (infid > 0)
+        HDclose(infid);
+    if (outfid > 0)
+        HDclose(outfid);
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: print_user_block
+ *
+ * Purpose: print user block
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente
+ *
+ * Date: August, 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+#if defined (H5REPACK_DEBUG_USER_BLOCK)
+static
+void print_user_block(const char *filename, hid_t fid)
+{
+    int ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    int fh; /* file handle  */
+	hsize_t ub_size; /* user block size */
+	hsize_t size; /* size read */
+	hid_t fcpl; /* file creation property list ID for HDF5 file */
+	int i;
+
+	/* get user block size */
+	if(( fcpl = H5Fget_create_plist(fid)) < 0) {
+		error_msg("failed to retrieve file creation property list\n");
+        HGOTO_ERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Fget_create_plist failed");
+    }
+
+	if(H5Pget_userblock(fcpl, &ub_size) < 0) {
+		error_msg("failed to retrieve userblock size\n");
+        HGOTO_ERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Pget_userblock failed");
+    }
+
+	if(H5Pclose(fcpl) < 0) {
+		error_msg("failed to close property list\n");
+        HGOTO_ERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Pclose failed");
+    }
+
+	/* open file */
+	if((fh = HDopen(filename, O_RDONLY, 0)) < 0) {
+        HGOTO_ERROR(H5E_tools_g, H5E_tools_min_id_g, "HDopen failed");
+    }
+
+	size = ub_size;
+
+	/* read file */
+	while(size > 0) {
+		ssize_t nread; /* # of bytes read */
+		char rbuf[USERBLOCK_XFER_SIZE]; /* buffer for reading */
+
+		/* read buffer */
+		if(size > USERBLOCK_XFER_SIZE)
+			nread = HDread(fh, rbuf, (size_t)USERBLOCK_XFER_SIZE);
+		else
+			nread = HDread(fh, rbuf, (size_t)size);
+
+		for(i = 0; i < nread; i++) {
+
+			printf("%c ", rbuf[i]);
+
+		}
+		printf("\n");
+
+		if(nread < 0) {
+            HGOTO_ERROR(H5E_tools_g, H5E_tools_min_id_g, "nread < 0");
+        }
+
+		/* update size of userblock left to transfer */
+		size -= nread;
+	}
+
+done:
+	if(fh > 0)
+		HDclose(fh);
+
+	return;
+}
+#endif
+
diff --git a/tools/src/h5repack/h5repack_filters.c b/tools/src/h5repack/h5repack_filters.c
new file mode 100644
index 0000000..804727b
--- /dev/null
+++ b/tools/src/h5repack/h5repack_filters.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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* number of members in an array */
+#ifndef NELMTS
+#    define NELMTS(X)    (sizeof(X)/sizeof(X[0]))
+#endif
+
+/* minimum of two values */
+#undef MIN
+#define MIN(a,b)    (((a)<(b)) ? (a) : (b))
+
+/*-------------------------------------------------------------------------
+ * Function: aux_find_obj
+ *
+ * Purpose: find the object name NAME (got from the traverse list)
+ *  in the repack options list
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+aux_find_obj(const char* name,          /* object name from traverse list */
+                 pack_opt_t *options,       /* repack options */
+                 pack_info_t *obj /*OUT*/)  /* info about object to filter */
+{
+ char *pdest;
+ int  result;
+ unsigned int  i;
+
+ for ( i=0; i<options->op_tbl->nelems; i++)
+ {
+     if (HDstrcmp(options->op_tbl->objs[i].path,name)==0)
+     {
+         *obj =  options->op_tbl->objs[i];
+         return (int)i;
+     }
+
+     pdest  = HDstrstr(name,options->op_tbl->objs[i].path);
+     result = (int)(pdest - name);
+
+     /* found at position 1, meaning without '/' */
+     if( pdest != NULL && result==1 )
+     {
+         *obj =  options->op_tbl->objs[i];
+         return (int)i;
+     }
+ }/*i*/
+
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: aux_assign_obj
+ *
+ * Purpose: find the object name NAME (got from the traverse list)
+ *  in the repack options list; assign the filter information OBJ
+ *
+ * Return: 0 not found, 1 found
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+aux_assign_obj(const char* name,            /* object name from traverse list */
+                   pack_opt_t *options,         /* repack options */
+                   pack_info_t *obj /*OUT*/)    /* info about object to filter */
+{
+
+    int  idx, i;
+    pack_info_t tmp;
+
+    init_packobject(&tmp);
+
+    idx = aux_find_obj(name,options,&tmp);
+
+    /* name was on input */
+    if (idx>=0)
+    {
+
+
+        /* applying to all objects */
+        if (options->all_layout)
+        {
+            /* assign the global layout info to the OBJ info */
+            tmp.layout=options->layout_g;
+            switch (options->layout_g)
+            {
+            case H5D_CHUNKED:
+                tmp.chunk.rank=options->chunk_g.rank;
+                for ( i=0; i<tmp.chunk.rank; i++)
+                    tmp.chunk.chunk_lengths[i]=options->chunk_g.chunk_lengths[i];
+                break;
+            case H5D_LAYOUT_ERROR:
+            case H5D_COMPACT:
+            case H5D_CONTIGUOUS:
+            case H5D_VIRTUAL:
+            case H5D_NLAYOUTS:
+                break;
+            default:
+                break;
+            }/*switch*/
+        }
+        else
+        {
+            tmp.layout = options->op_tbl->objs[idx].layout;
+            switch (tmp.layout)
+            {
+            case H5D_CHUNKED:
+                tmp.chunk.rank = options->op_tbl->objs[idx].chunk.rank;
+                for ( i=0; i<tmp.chunk.rank; i++)
+                    tmp.chunk.chunk_lengths[i]=options->op_tbl->objs[idx].chunk.chunk_lengths[i];
+                break;
+            case H5D_LAYOUT_ERROR:
+            case H5D_COMPACT:
+            case H5D_CONTIGUOUS:
+            case H5D_VIRTUAL:
+            case H5D_NLAYOUTS:
+                break;
+            default:
+                break;
+            }/*switch*/
+
+        }
+
+        /* applying to all objects */
+        if (options->all_filter)
+        {
+            /* assign the global filter */
+            tmp.nfilters=1;
+            tmp.filter[0]=options->filter_g[0];
+        } /* if all */
+        else
+        {
+            tmp.nfilters=options->op_tbl->objs[idx].nfilters;
+            for ( i=0; i<tmp.nfilters; i++)
+            {
+                tmp.filter[i] = options->op_tbl->objs[idx].filter[i];
+            }
+        }
+
+
+    } /* if idx */
+
+
+    /* no input name */
+
+    else
+    {
+
+        if (options->all_filter)
+        {
+            int k;
+
+            /* assign the global filters */
+            tmp.nfilters=options->n_filter_g;
+            for ( k = 0; k < options->n_filter_g; k++)
+                tmp.filter[k]=options->filter_g[k];
+        }
+        if (options->all_layout)
+        {
+            /* assign the global layout info to the OBJ info */
+            tmp.layout=options->layout_g;
+            switch (options->layout_g)
+            {
+            case H5D_CHUNKED:
+                tmp.chunk.rank=options->chunk_g.rank;
+                for ( i=0; i<tmp.chunk.rank; i++)
+                    tmp.chunk.chunk_lengths[i]=options->chunk_g.chunk_lengths[i];
+                break;
+            case H5D_LAYOUT_ERROR:
+            case H5D_COMPACT:
+            case H5D_CONTIGUOUS:
+            case H5D_VIRTUAL:
+            case H5D_NLAYOUTS:
+                break;
+            default:
+                break;
+            }/*switch*/
+        }
+    }
+
+    *obj = tmp;
+    return 1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: apply_filters
+ *
+ * Purpose: apply the filters in the object to the property list;
+ *  do extra checking in the case of SZIP; delete all filters in the case
+ *  of H5Z_FILTER_NONE present in the PACK_INFO_T filter array
+ *
+ * Return: 0 success, -1 an error occured
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int apply_filters(const char* name,    /* object name from traverse list */
+                  int rank,            /* rank of dataset */
+                  hsize_t *dims,       /* dimensions of dataset */
+                  size_t msize,        /* size of type */
+                  hid_t dcpl_id,       /* dataset creation property list */
+                  pack_opt_t *options, /* repack options */
+                  int *has_filter)     /* (OUT) object NAME has a filter */
+
+
+{
+    int          nfilters;       /* number of filters in DCPL */
+    hsize_t      chsize[64];     /* chunk size in elements */
+    H5D_layout_t layout;
+    int          i;
+    pack_info_t  obj;
+
+    *has_filter = 0;
+
+    if (rank==0) /* scalar dataset, do not apply */
+        return 0;
+
+   /*-------------------------------------------------------------------------
+    * initialize the assigment object
+    *-------------------------------------------------------------------------
+    */
+    init_packobject(&obj);
+
+   /*-------------------------------------------------------------------------
+    * find options
+    *-------------------------------------------------------------------------
+    */
+    if (aux_assign_obj(name,options,&obj)==0)
+        return 0;
+
+    /* get information about input filters */
+    if ((nfilters = H5Pget_nfilters(dcpl_id))<0)
+        return -1;
+
+   /*-------------------------------------------------------------------------
+    * check if we have filters in the pipeline
+    * we want to replace them with the input filters
+    * only remove if we are inserting new ones
+    *-------------------------------------------------------------------------
+    */
+    if (nfilters && obj.nfilters )
+    {
+        *has_filter = 1;
+        if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
+            return -1;
+    }
+
+   /*-------------------------------------------------------------------------
+    * check if there is an existent chunk
+    * read it only if there is not a requested layout
+    *-------------------------------------------------------------------------
+    */
+    if (obj.layout == -1 )
+    {
+        if ((layout = H5Pget_layout(dcpl_id))<0)
+            return -1;
+
+        if (layout == H5D_CHUNKED)
+        {
+            if ((rank = H5Pget_chunk(dcpl_id,NELMTS(chsize),chsize/*out*/))<0)
+                return -1;
+            obj.layout = H5D_CHUNKED;
+            obj.chunk.rank = rank;
+            for ( i = 0; i < rank; i++)
+                obj.chunk.chunk_lengths[i] = chsize[i];
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+    * the type of filter and additional parameter
+    * type can be one of the filters
+    * H5Z_FILTER_NONE        0 , uncompress if compressed
+    * H5Z_FILTER_DEFLATE     1 , deflation like gzip
+    * H5Z_FILTER_SHUFFLE     2 , shuffle the data
+    * H5Z_FILTER_FLETCHER32  3 , fletcher32 checksum of EDC
+    * H5Z_FILTER_SZIP        4 , szip compression
+    * H5Z_FILTER_NBIT        5 , nbit compression
+    * H5Z_FILTER_SCALEOFFSET 6 , scaleoffset compression
+    *-------------------------------------------------------------------------
+    */
+
+    if (obj.nfilters)
+    {
+
+   /*-------------------------------------------------------------------------
+    * filters require CHUNK layout; if we do not have one define a default
+    *-------------------------------------------------------------------------
+    */
+        if (obj.layout==-1)
+        {
+
+            /* stripmine info */
+            hsize_t sm_size[H5S_MAX_RANK]; /*stripmine size */
+            hsize_t sm_nbytes;             /*bytes per stripmine */
+
+            obj.chunk.rank = rank;
+
+            /*
+            * determine the strip mine size. The strip mine is
+            * a hyperslab whose size is manageable.
+            */
+
+
+
+            sm_nbytes = msize;
+            for ( i = rank; i > 0; --i)
+            {
+                hsize_t size = H5TOOLS_BUFSIZE / sm_nbytes;
+                if ( size == 0) /* datum size > H5TOOLS_BUFSIZE */
+                    size = 1;
+                sm_size[i - 1] = MIN(dims[i - 1], size);
+                sm_nbytes *= sm_size[i - 1];
+                HDassert(sm_nbytes > 0);
+
+            }
+
+            for ( i = 0; i < rank; i++)
+            {
+                obj.chunk.chunk_lengths[i] = sm_size[i];
+            }
+
+        }
+
+        for ( i=0; i<obj.nfilters; i++)
+        {
+            switch (obj.filter[i].filtn)
+            {
+
+            /*-------------------------------------------------------------------------
+             * H5Z_FILTER_NONE       0 , uncompress if compressed
+             *-------------------------------------------------------------------------
+             */
+            case H5Z_FILTER_NONE:
+            	break;
+
+           /*-------------------------------------------------------------------------
+            * H5Z_FILTER_DEFLATE       1 , deflation like gzip
+            *-------------------------------------------------------------------------
+            */
+            case H5Z_FILTER_DEFLATE:
+                {
+                    unsigned     aggression;     /* the deflate level */
+
+                    aggression = obj.filter[i].cd_values[0];
+                    /* set up for deflated data */
+                    if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                        return -1;
+                    if(H5Pset_deflate(dcpl_id,aggression)<0)
+                        return -1;
+                }
+                break;
+
+           /*-------------------------------------------------------------------------
+            * H5Z_FILTER_SZIP       4 , szip compression
+            *-------------------------------------------------------------------------
+            */
+            case H5Z_FILTER_SZIP:
+                {
+                    unsigned  options_mask;
+                    unsigned  pixels_per_block;
+
+                    options_mask     = obj.filter[i].cd_values[0];
+                    pixels_per_block = obj.filter[i].cd_values[1];
+
+                    /* set up for szip data */
+                    if(H5Pset_chunk(dcpl_id,obj.chunk.rank,obj.chunk.chunk_lengths)<0)
+                        return -1;
+                    if (H5Pset_szip(dcpl_id,options_mask,pixels_per_block)<0)
+                        return -1;
+
+                }
+                break;
+
+           /*-------------------------------------------------------------------------
+            * H5Z_FILTER_SHUFFLE    2 , shuffle the data
+            *-------------------------------------------------------------------------
+            */
+            case H5Z_FILTER_SHUFFLE:
+                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                    return -1;
+                if (H5Pset_shuffle(dcpl_id)<0)
+                    return -1;
+                break;
+
+           /*-------------------------------------------------------------------------
+            * H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC
+            *-------------------------------------------------------------------------
+            */
+            case H5Z_FILTER_FLETCHER32:
+                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                    return -1;
+                if (H5Pset_fletcher32(dcpl_id)<0)
+                    return -1;
+                break;
+           /*----------- -------------------------------------------------------------
+            * H5Z_FILTER_NBIT , NBIT compression
+            *-------------------------------------------------------------------------
+            */
+            case H5Z_FILTER_NBIT:
+                if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                    return -1;
+                if (H5Pset_nbit(dcpl_id)<0)
+                    return -1;
+                break;
+            /*----------- -------------------------------------------------------------
+             * H5Z_FILTER_SCALEOFFSET , scale+offset compression
+             *-------------------------------------------------------------------------
+             */
+
+            case H5Z_FILTER_SCALEOFFSET:
+                {
+                    H5Z_SO_scale_type_t scale_type;
+                    int                 scale_factor;
+
+                    scale_type   = (H5Z_SO_scale_type_t)obj.filter[i].cd_values[0];
+                    scale_factor = (int)obj.filter[i].cd_values[1];
+
+                    if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                        return -1;
+                    if (H5Pset_scaleoffset(dcpl_id,scale_type,scale_factor)<0)
+                        return -1;
+                }
+                break;
+            default:
+            	{
+            		if (H5Pset_filter (dcpl_id, obj.filter[i].filtn, H5Z_FLAG_MANDATORY, obj.filter[i].cd_nelmts, obj.filter[i].cd_values)<0)
+                		return -1;
+            		if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+            			return -1;
+            	}
+                break;
+            } /* switch */
+        }/*i*/
+
+    }
+    /*obj.nfilters*/
+
+    /*-------------------------------------------------------------------------
+    * layout
+    *-------------------------------------------------------------------------
+    */
+
+    if (obj.layout>=0)
+    {
+        /* a layout was defined */
+        if (H5Pset_layout(dcpl_id, obj.layout)<0)
+            return -1;
+
+        if (H5D_CHUNKED == obj.layout)
+        {
+            if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
+                return -1;
+        }
+        else if (H5D_COMPACT == obj.layout)
+        {
+            if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY)<0)
+                return -1;
+        }
+        /* remove filters for the H5D_CONTIGUOUS case */
+        else if (H5D_CONTIGUOUS == obj.layout)
+        {
+            if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
+                return -1;
+        }
+
+    }
+
+ return 0;
+}
+
diff --git a/tools/src/h5repack/h5repack_main.c b/tools/src/h5repack/h5repack_main.c
new file mode 100644
index 0000000..339dc83
--- /dev/null
+++ b/tools/src/h5repack/h5repack_main.c
@@ -0,0 +1,686 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5repack.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5repack"
+
+static int parse_command_line(int argc, const char **argv, pack_opt_t* options);
+static void leave(int ret) H5_ATTR_NORETURN;
+
+
+/* module-scoped variables */
+static int has_i_o = 0;
+const char *infile = NULL;
+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:S:P:T:G:E";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "version", no_arg, 'V' },
+    { "verbose", no_arg, 'v' },
+    { "filter", require_arg, 'f' },
+    { "layout", require_arg, 'l' },
+    { "minimum", require_arg, 'm' },
+    { "file", require_arg, 'e' },
+    { "native", no_arg, 'n' },
+    { "latest", no_arg, 'L' },
+    { "compact", require_arg, 'c' },
+    { "indexed", require_arg, 'd' },
+    { "ssize", require_arg, 's' },
+    { "ublock", require_arg, 'u' },
+    { "block", require_arg, 'b' },
+    { "metadata_block_size", require_arg, 'M' },
+    { "threshold", require_arg, 't' },
+    { "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_persist", require_arg, 'P' },
+    { "fs_threshold", require_arg, 'T' },
+    { "fs_pagesize", require_arg, 'G' },
+    { "enable-error-stack", no_arg, 'E' },
+    { NULL, 0, '\0' }
+};
+
+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: print usage
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void usage(const char *prog) {
+    FLUSHSTREAM(rawoutstream);
+    PRINTSTREAM(rawoutstream, "usage: %s [OPTIONS] file1 file2\n", prog);
+    PRINTVALSTREAM(rawoutstream, "  file1                    Input HDF5 File\n");
+    PRINTVALSTREAM(rawoutstream, "  file2                    Output HDF5 File\n");
+    PRINTVALSTREAM(rawoutstream, "  OPTIONS\n");
+    PRINTVALSTREAM(rawoutstream, "   -h, --help              Print a usage message and exit\n");
+    PRINTVALSTREAM(rawoutstream, "   -v, --verbose           Verbose mode, print object information\n");
+    PRINTVALSTREAM(rawoutstream, "   -V, --version           Print version number and exit\n");
+    PRINTVALSTREAM(rawoutstream, "   -n, --native            Use a native HDF5 type when repacking\n");
+    PRINTVALSTREAM(rawoutstream, "   -L, --latest            Use latest version of file format\n");
+    PRINTVALSTREAM(rawoutstream, "   -c L1, --compact=L1     Maximum number of links in header messages\n");
+    PRINTVALSTREAM(rawoutstream, "   -d L2, --indexed=L2     Minimum number of links in the indexed format\n");
+    PRINTVALSTREAM(rawoutstream, "   -s S[:F], --ssize=S[:F] Shared object header message minimum size\n");
+    PRINTVALSTREAM(rawoutstream, "   -m M, --minimum=M       Do not apply the filter to datasets smaller than M\n");
+    PRINTVALSTREAM(rawoutstream, "   -e E, --file=E          Name of file E with the -f and -l options\n");
+    PRINTVALSTREAM(rawoutstream, "   -u U, --ublock=U        Name of file U with user block data to be added\n");
+    PRINTVALSTREAM(rawoutstream, "   -b B, --block=B         Size of user block to be added\n");
+    PRINTVALSTREAM(rawoutstream, "   -M A, --metadata_block_size=A  Metadata block size for H5Pset_meta_block_size\n");
+    PRINTVALSTREAM(rawoutstream, "   -t T, --threshold=T     Threshold value for H5Pset_alignment\n");
+    PRINTVALSTREAM(rawoutstream, "   -a A, --alignment=A     Alignment value for H5Pset_alignment\n");
+    PRINTVALSTREAM(rawoutstream, "   -f FILT, --filter=FILT  Filter type\n");
+    PRINTVALSTREAM(rawoutstream, "   -l LAYT, --layout=LAYT  Layout type\n");
+    PRINTVALSTREAM(rawoutstream, "   -S FS_STRATEGY, --fs_strategy=FS_STRATEGY  File space management strategy for H5Pset_file_space_strategy\n");
+    PRINTVALSTREAM(rawoutstream, "   -P FS_PERSIST, --fs_persist=FS_PERSIST  Persisting or not persisting free-space for H5Pset_file_space_strategy\n");
+    PRINTVALSTREAM(rawoutstream, "   -T FS_THRESHOLD, --fs_threshold=FS_THRESHOLD   Free-space section threshold for H5Pset_file_space_strategy\n");
+    PRINTVALSTREAM(rawoutstream, "   -G FS_PAGESIZE, --fs_pagesize=FS_PAGESIZE   File space page size for H5Pset_file_space_page_size\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    M - is an integer greater than 1, size of dataset in bytes (default is 0) \n");
+    PRINTVALSTREAM(rawoutstream, "    E - is a filename.\n");
+    PRINTVALSTREAM(rawoutstream, "    S - is an integer\n");
+    PRINTVALSTREAM(rawoutstream, "    U - is a filename.\n");
+    PRINTVALSTREAM(rawoutstream, "    T - is an integer\n");
+    PRINTVALSTREAM(rawoutstream, "    A - is an integer greater than zero\n");
+    PRINTVALSTREAM(rawoutstream, "    B - is the user block size, any value that is 512 or greater and is\n");
+    PRINTVALSTREAM(rawoutstream, "        a power of 2 (1024 default)\n");
+    PRINTVALSTREAM(rawoutstream, "    F - is the shared object header message type, any of <dspace|dtype|fill|\n");
+    PRINTVALSTREAM(rawoutstream, "        pline|attr>. If F is not specified, S applies to all messages\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "     --enable-error-stack Prints messages from the HDF5 error stack as they\n");
+    PRINTVALSTREAM(rawoutstream, "                          occur.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    FS_STRATEGY is a string indicating the file space strategy used:\n");
+    PRINTVALSTREAM(rawoutstream, "        FSM_AGGR:\n");
+    PRINTVALSTREAM(rawoutstream, "               The mechanisms used in managing file space are free-space managers, aggregators and virtual file driver.\n");
+    PRINTVALSTREAM(rawoutstream, "        PAGE:\n");
+    PRINTVALSTREAM(rawoutstream, "               The mechanisms used in managing file space are free-space managers with embedded paged aggregation and virtual file driver.\n");
+    PRINTVALSTREAM(rawoutstream, "        AGGR:\n");
+    PRINTVALSTREAM(rawoutstream, "               The mechanisms used in managing file space are aggregators and virtual file driver.\n");
+    PRINTVALSTREAM(rawoutstream, "        NONE:\n");
+    PRINTVALSTREAM(rawoutstream, "               The mechanisms used in managing file space are virtual file driver.\n");
+    PRINTVALSTREAM(rawoutstream, "        The default strategy when not set is FSM_AGGR without persisting free-space.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    FS_PERSIST is 1 to persisting free-space or 0 to not persisting free-space.\n");
+    PRINTVALSTREAM(rawoutstream, "      The default when not set is not persisting free-space.\n");
+    PRINTVALSTREAM(rawoutstream, "      The value is ignored for AGGR and NONE strategies.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    FS_THRESHOLD is the minimum size (in bytes) of free-space sections to be tracked by the library.\n");
+    PRINTVALSTREAM(rawoutstream, "      The default when not set is 1.\n");
+    PRINTVALSTREAM(rawoutstream, "      The value is ignored for AGGR and NONE strategies.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    FS_PAGESIZE is the size (in bytes) >=512 that is used by the library when the file space strategy PAGE is used.\n");
+    PRINTVALSTREAM(rawoutstream, "      The default when not set is 4096.\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    FILT - is a string with the format:\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      <list of objects>:<name of filter>=<filter parameters>\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      <list of objects> is a comma separated list of object names, meaning apply\n");
+    PRINTVALSTREAM(rawoutstream, "        compression only to those objects. If no names are specified, the filter\n");
+    PRINTVALSTREAM(rawoutstream, "        is applied to all objects\n");
+    PRINTVALSTREAM(rawoutstream, "      <name of filter> can be:\n");
+    PRINTVALSTREAM(rawoutstream, "        GZIP, to apply the HDF5 GZIP filter (GZIP compression)\n");
+    PRINTVALSTREAM(rawoutstream, "        SZIP, to apply the HDF5 SZIP filter (SZIP compression)\n");
+    PRINTVALSTREAM(rawoutstream, "        SHUF, to apply the HDF5 shuffle filter\n");
+    PRINTVALSTREAM(rawoutstream, "        FLET, to apply the HDF5 checksum filter\n");
+    PRINTVALSTREAM(rawoutstream, "        NBIT, to apply the HDF5 NBIT filter (NBIT compression)\n");
+    PRINTVALSTREAM(rawoutstream, "        SOFF, to apply the HDF5 Scale/Offset filter\n");
+    PRINTVALSTREAM(rawoutstream, "        UD,   to apply a user defined filter\n");
+    PRINTVALSTREAM(rawoutstream, "        NONE, to remove all filters\n");
+    PRINTVALSTREAM(rawoutstream, "      <filter parameters> is optional filter parameter information\n");
+    PRINTVALSTREAM(rawoutstream, "        GZIP=<deflation level> from 1-9\n");
+    PRINTVALSTREAM(rawoutstream, "        SZIP=<pixels per block,coding> pixels per block is a even number in\n");
+    PRINTVALSTREAM(rawoutstream, "            2-32 and coding method is either EC or NN\n");
+    PRINTVALSTREAM(rawoutstream, "        SHUF (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "        FLET (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "        NBIT (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "        SOFF=<scale_factor,scale_type> scale_factor is an integer and scale_type\n");
+    PRINTVALSTREAM(rawoutstream, "            is either IN or DS\n");
+    PRINTVALSTREAM(rawoutstream, "        UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>\n");
+    PRINTVALSTREAM(rawoutstream, "            required values for filter_number,cd_value_count,value_1\n");
+    PRINTVALSTREAM(rawoutstream, "            optional values for value_2 to value_N\n");
+    PRINTVALSTREAM(rawoutstream, "        NONE (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "    LAYT - is a string with the format:\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      <list of objects>:<layout type>=<layout parameters>\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "      <list of objects> is a comma separated list of object names, meaning that\n");
+    PRINTVALSTREAM(rawoutstream, "        layout information is supplied for those objects. If no names are\n");
+    PRINTVALSTREAM(rawoutstream, "        specified, the layout type is applied to all objects\n");
+    PRINTVALSTREAM(rawoutstream, "      <layout type> can be:\n");
+    PRINTVALSTREAM(rawoutstream, "        CHUNK, to apply chunking layout\n");
+    PRINTVALSTREAM(rawoutstream, "        COMPA, to apply compact layout\n");
+    PRINTVALSTREAM(rawoutstream, "        CONTI, to apply contiguous layout\n");
+    PRINTVALSTREAM(rawoutstream, "      <layout parameters> is optional layout information\n");
+    PRINTVALSTREAM(rawoutstream, "        CHUNK=DIM[xDIM...xDIM], the chunk size of each dimension\n");
+    PRINTVALSTREAM(rawoutstream, "        COMPA (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "        CONTI (no parameter)\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "Examples of use:\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "1) h5repack -v -f GZIP=1 file1 file2\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   GZIP compression with level 1 to all objects\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "2) h5repack -v -f dset1:SZIP=8,NN file1 file2\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   SZIP compression with 8 pixels per block and NN coding method to object dset1\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "3) h5repack -v -l dset1,dset2:CHUNK=20x10 -f dset3,dset4,dset5:NONE file1 file2\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   Chunked layout, with a layout size of 20x10, to objects dset1 and dset2\n");
+    PRINTVALSTREAM(rawoutstream, "   and remove filters to objects dset3, dset4, dset5\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "4) h5repack -L -c 10 -s 20:dtype file1 file2 \n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   Using latest file format with maximum compact group size of 10 and\n");
+    PRINTVALSTREAM(rawoutstream, "   and minimum shared datatype size of 20\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "5) h5repack -f SHUF -f GZIP=1 file1 file2 \n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   Add both filters SHUF and GZIP in this order to all datasets\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "6) h5repack -f UD=307,1,9 file1 file2 \n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+    PRINTVALSTREAM(rawoutstream, "   Add bzip2 filter to all datasets\n");
+    PRINTVALSTREAM(rawoutstream, "\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown MPI & HDF5 and call exit()
+ *
+ * Return:      Does not return
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, 31. January 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static void leave(int ret)
+{
+    h5tools_close();
+    HDexit(ret);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: read_info
+ *
+ * Purpose: read comp and chunk options from a file
+ *
+ * Return: void, exit on error
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: September, 22, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int read_info(const char *filename, pack_opt_t *options)
+{
+    char stype[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    char comp_info[1024];
+    FILE *fp = NULL;
+    char c;
+    int i, rc = 1;
+    int ret_value = EXIT_SUCCESS;
+
+    if ((fp = HDfopen(filename, "r")) == (FILE *) NULL) {
+        error_msg("cannot open options file %s\n", filename);
+        h5tools_setstatus(EXIT_FAILURE);
+        ret_value = EXIT_FAILURE;
+        goto done;
+    }
+
+    /* cycle until end of file reached */
+    while (1) {
+        rc = fscanf(fp, "%s", stype);
+        if (rc == -1)
+            break;
+
+        /*-------------------------------------------------------------------------
+         * filter
+         *-------------------------------------------------------------------------
+         */
+        if (HDstrcmp(stype,"-f") == 0) {
+            /* find begining of info */
+            i = 0;
+            c = '0';
+            while (c != ' ') {
+                if(fscanf(fp, "%c", &c) < 0 && HDferror(fp)) {
+                    error_msg("fscanf error\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = EXIT_FAILURE;
+                    goto done;
+                } /* end if */
+                if (HDfeof(fp))
+                    break;
+            }
+            c = '0';
+            /* go until end */
+            while (c != ' ') {
+                if(fscanf(fp, "%c", &c) < 0 && HDferror(fp)) {
+                    error_msg("fscanf error\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = EXIT_FAILURE;
+                    goto done;
+                } /* end if */
+                comp_info[i] = c;
+                i++;
+                if (HDfeof(fp))
+                    break;
+                if (c == 10 /*eol*/)
+                    break;
+            }
+            comp_info[i - 1] = '\0'; /*cut the last " */
+
+            if (h5repack_addfilter(comp_info, options) == -1) {
+                error_msg("could not add compression option\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret_value = EXIT_FAILURE;
+                goto done;
+            }
+        }
+        /*-------------------------------------------------------------------------
+         * layout
+         *-------------------------------------------------------------------------
+         */
+        else if (HDstrcmp(stype,"-l") == 0) {
+
+            /* find begining of info */
+            i = 0;
+            c = '0';
+            while (c != ' ') {
+                if(fscanf(fp, "%c", &c) < 0 && HDferror(fp)) {
+                    error_msg("fscanf error\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = EXIT_FAILURE;
+                    goto done;
+                } /* end if */
+                if (HDfeof(fp))
+                    break;
+            }
+            c = '0';
+            /* go until end */
+            while (c != ' ') {
+                if(fscanf(fp, "%c", &c) < 0 && HDferror(fp)) {
+                    error_msg("fscanf error\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = EXIT_FAILURE;
+                    goto done;
+                } /* end if */
+                comp_info[i] = c;
+                i++;
+                if (HDfeof(fp))
+                    break;
+                if (c == 10 /*eol*/)
+                    break;
+            }
+            comp_info[i - 1] = '\0'; /*cut the last " */
+
+            if (h5repack_addlayout(comp_info, options) == -1) {
+                error_msg("could not add chunck option\n");
+                h5tools_setstatus(EXIT_FAILURE);
+                ret_value = EXIT_FAILURE;
+                goto done;
+            }
+        }
+        /*-------------------------------------------------------------------------
+         * not valid
+         *-------------------------------------------------------------------------
+         */
+        else {
+            error_msg("bad file format for %s", filename);
+            h5tools_setstatus(EXIT_FAILURE);
+            ret_value = EXIT_FAILURE;
+            goto done;
+        }
+    }
+
+done:
+    if (fp)
+        HDfclose(fp);
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: parse command line input
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int parse_command_line(int argc, const char **argv, pack_opt_t* options)
+{
+    int opt;
+    int ret_value = 0;
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+        switch ((char) opt) {
+
+            /* -i for backward compability */
+            case 'i':
+                infile = opt_arg;
+                has_i_o = 1;
+                break;
+
+            /* -o for backward compability */
+            case 'o':
+                outfile = opt_arg;
+                has_i_o = 1;
+                break;
+
+            case 'h':
+                usage(h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                ret_value = -1;
+                goto done;
+
+            case 'V':
+                print_version(h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                ret_value = -1;
+                goto done;
+
+            case 'v':
+                options->verbose = 1;
+                break;
+
+            case 'f':
+                /* parse the -f filter option */
+                if (h5repack_addfilter(opt_arg, options) < 0) {
+                    error_msg("in parsing filter\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = -1;
+                    goto done;
+                }
+                break;
+
+            case 'l':
+                /* parse the -l layout option */
+                if (h5repack_addlayout(opt_arg, options) < 0) {
+                    error_msg("in parsing layout\n");
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = -1;
+                    goto done;
+                }
+                break;
+
+            case 'm':
+                options->min_comp = HDstrtoull(opt_arg , NULL, 0);
+                if ((int) options->min_comp <= 0) {
+                    error_msg("invalid minimum compress size <%s>\n", opt_arg);
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = -1;
+                    goto done;
+                }
+                break;
+
+            case 'e':
+                ret_value = read_info(opt_arg, options);
+                if (ret_value < 0)
+                    goto done;
+                break;
+
+            case 'n':
+                options->use_native = 1;
+                break;
+
+            case 'L':
+                options->latest = TRUE;
+                break;
+
+            case 'c':
+                options->grp_compact = HDatoi( opt_arg );
+                if (options->grp_compact > 0)
+                    options->latest = TRUE; /* must use latest format */
+                break;
+
+            case 'd':
+                options->grp_indexed = HDatoi( opt_arg );
+                if (options->grp_indexed > 0)
+                    options->latest = TRUE; /* must use latest format */
+                break;
+
+            case 's':
+                {
+                    int idx = 0;
+                    int ssize = 0;
+                    char *msgPtr = HDstrchr( opt_arg, ':');
+                    options->latest = TRUE; /* must use latest format */
+                    if (msgPtr == NULL) {
+                        ssize = HDatoi( opt_arg );
+                        for (idx = 0; idx < 5; idx++)
+                            options->msg_size[idx] = ssize;
+                    }
+                    else {
+                        char msgType[10];
+
+                        HDstrcpy(msgType, msgPtr + 1);
+                        msgPtr[0] = '\0';
+                        ssize = HDatoi( opt_arg );
+                        if (HDstrncmp(msgType, "dspace",6) == 0)
+                            options->msg_size[0] = ssize;
+                        else if (HDstrncmp(msgType, "dtype", 5) == 0)
+                            options->msg_size[1] = ssize;
+                        else if (HDstrncmp(msgType, "fill", 4) == 0)
+                            options->msg_size[2] = ssize;
+                        else if (HDstrncmp(msgType, "pline", 5) == 0)
+                            options->msg_size[3] = ssize;
+                        else if (HDstrncmp(msgType, "attr", 4) == 0)
+                            options->msg_size[4] = ssize;
+                    }
+                }
+                break;
+
+            case 'u':
+                options->ublock_filename = opt_arg;
+                break;
+
+            case 'b':
+                options->ublock_size = (hsize_t) HDatol( opt_arg );
+                break;
+
+            case 'M':
+                options->meta_block_size = (hsize_t) HDatol( opt_arg );
+                break;
+
+            case 't':
+                options->threshold = (hsize_t) HDatol( opt_arg );
+                break;
+
+            case 'a':
+                options->alignment = HDstrtoull(opt_arg , NULL, 0);
+                if (options->alignment < 1) {
+                    error_msg("invalid alignment size\n", opt_arg);
+                    h5tools_setstatus(EXIT_FAILURE);
+                    ret_value = -1;
+                    goto done;
+                }
+                break;
+
+            case 'S':
+                {
+                    char strategy[MAX_NC_NAME];
+
+                    HDstrcpy(strategy, opt_arg);
+                    if(!HDstrcmp(strategy, "FSM_AGGR"))
+                        options->fs_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
+                    else if(!HDstrcmp(strategy, "PAGE"))
+                        options->fs_strategy = H5F_FSPACE_STRATEGY_PAGE;
+                    else if(!HDstrcmp(strategy, "AGGR"))
+                        options->fs_strategy = H5F_FSPACE_STRATEGY_AGGR;
+                    else if(!HDstrcmp(strategy, "NONE"))
+                        options->fs_strategy = H5F_FSPACE_STRATEGY_NONE;
+                    else {
+                        error_msg("invalid file space management strategy\n", opt_arg);
+                        h5tools_setstatus(EXIT_FAILURE);
+                        ret_value = -1;
+                        goto done;
+                    }
+                    if(options->fs_strategy == (H5F_fspace_strategy_t)0)
+                        /* To distinguish the "specified" zero value */
+                        options->fs_strategy = (H5F_fspace_strategy_t)-1;
+                }
+                break;
+
+            case 'P':
+                options->fs_persist = HDatoi( opt_arg );
+                if(options->fs_persist == 0)
+                    /* To distinguish the "specified" zero value */
+                    options->fs_persist = -1;
+                break;
+
+            case 'T':
+                options->fs_threshold = HDatol( opt_arg );
+                if(options->fs_threshold == 0)
+                    /* To distinguish the "specified" zero value */
+                    options->fs_threshold = -1;
+                break;
+
+            case 'G':
+                options->fs_pagesize = HDstrtoll(opt_arg, NULL, 0);
+                if(options->fs_pagesize == 0)
+                    /* To distinguish the "specified" zero value */
+                   options->fs_pagesize = -1;	
+                break;
+
+	    case 'E':
+		enable_error_stack = TRUE;
+		break;
+
+            default:
+                break;
+        } /* switch */
+    } /* while */
+
+    if (has_i_o == 0) {
+        /* check for file names to be processed */
+        if (argc <= opt_ind || argv[opt_ind + 1] == NULL) {
+            error_msg("missing file names\n");
+            usage(h5tools_getprogname());
+            h5tools_setstatus(EXIT_FAILURE);
+            ret_value = -1;
+        }
+    }
+
+done:
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: h5repack main program
+ *
+ * Return: Success: EXIT_SUCCESS(0)
+ *
+ * Failure: EXIT_FAILURE(1)
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: May 9, 2003
+ *
+ * Comments:
+ *
+ *-------------------------------------------------------------------------
+ */
+int main(int argc, const char **argv)
+{
+    pack_opt_t options; /*the global options */
+    H5E_auto2_t         func;
+    H5E_auto2_t         tools_func;
+    void               *edata;
+    void               *tools_edata;
+
+    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();
+
+    /* Disable tools error reporting */
+    H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata);
+    H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL);
+
+    /* update hyperslab buffer size from H5TOOLS_BUFSIZE env if exist */
+    if (h5tools_getenv_update_hyperslab_bufsize() < 0) {
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    /* initialize options  */
+    h5repack_init(&options, 0, FALSE);
+
+    if (parse_command_line(argc, argv, &options) < 0)
+        goto done;
+
+    /* get file names if they were not yet got */
+    if (has_i_o == 0) {
+
+        if (argv[opt_ind] != NULL && argv[opt_ind + 1] != NULL) {
+            infile = argv[opt_ind];
+            outfile = argv[opt_ind + 1];
+
+            if ( HDstrcmp( infile, outfile ) == 0) {
+                error_msg("file names cannot be the same\n");
+                usage(h5tools_getprogname());
+                h5tools_setstatus(EXIT_FAILURE);
+                goto done;
+            }
+        }
+        else {
+            error_msg("file names missing\n");
+            usage(h5tools_getprogname());
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+    }
+
+    if (enable_error_stack) {
+        H5Eset_auto2(H5E_DEFAULT, func, edata);
+        H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata);
+    }
+
+    /* pack it */
+    h5tools_setstatus(h5repack(infile, outfile, &options));
+
+done:
+    /* free tables */
+    h5repack_end(&options);
+
+    leave(h5tools_getstatus());
+}
+
diff --git a/tools/src/h5repack/h5repack_opttable.c b/tools/src/h5repack/h5repack_opttable.c
new file mode 100644
index 0000000..93e34b3
--- /dev/null
+++ b/tools/src/h5repack/h5repack_opttable.c
@@ -0,0 +1,365 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/*-------------------------------------------------------------------------
+ * Function: init_packobject
+ *
+ * Purpose: initialize a pack_info_t structure
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void init_packobject(pack_info_t *obj) {
+	int j, k;
+
+	HDstrcpy(obj->path, "\0");
+	for (j = 0; j < H5_REPACK_MAX_NFILTERS; j++) {
+		obj->filter[j].filtn = -1;
+		for (k = 0; k < CD_VALUES; k++)
+			obj->filter[j].cd_values[k] = 0;
+	}
+	obj->chunk.rank = -1;
+	obj->refobj_id = -1;
+	obj->layout = H5D_LAYOUT_ERROR;
+	obj->nfilters = 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: aux_tblinsert_filter
+ *
+ * Purpose: auxiliary function, inserts the filter in object OBJS[ I ]
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void aux_tblinsert_filter(pack_opttbl_t *table, unsigned int I,
+		filter_info_t filt) {
+	if (table->objs[I].nfilters < H5_REPACK_MAX_NFILTERS) {
+		table->objs[I].filter[table->objs[I].nfilters++] = filt;
+	}
+	else {
+		error_msg(
+				"cannot insert the filter in this object.\
+        Maximum capacity exceeded\n");
+	}
+}
+
+/*-------------------------------------------------------------------------
+ * Function: aux_tblinsert_layout
+ *
+ * Purpose: auxiliary function, inserts the layout in object OBJS[ I ]
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void aux_tblinsert_layout(pack_opttbl_t *table, unsigned int I,
+		pack_info_t *pack) {
+	int k;
+
+	table->objs[I].layout = pack->layout;
+	if (H5D_CHUNKED == pack->layout) {
+		/* -2 means the NONE option, remove chunking
+		 and set the layout to contiguous */
+		if (pack->chunk.rank == -2) {
+			table->objs[I].layout = H5D_CONTIGUOUS;
+			table->objs[I].chunk.rank = -2;
+		}
+		/* otherwise set the chunking type */
+		else {
+			table->objs[I].chunk.rank = pack->chunk.rank;
+			for (k = 0; k < pack->chunk.rank; k++)
+				table->objs[I].chunk.chunk_lengths[k] =
+						pack->chunk.chunk_lengths[k];
+		}
+	}
+}
+
+/*-------------------------------------------------------------------------
+ * Function: aux_inctable
+ *
+ * Purpose: auxiliary function, increases the size of the collection by N_OBJS
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+aux_inctable(pack_opttbl_t *table, unsigned n_objs)
+{
+    unsigned u;
+
+    table->size += n_objs;
+    table->objs = (pack_info_t*) HDrealloc(table->objs, table->size * sizeof(pack_info_t));
+    if (table->objs == NULL) {
+        error_msg("not enough memory for options table\n");
+        return -1;
+    }
+
+    for (u = table->nelems; u < table->size; u++)
+        init_packobject(&table->objs[u]);
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: options_table_init
+ *
+ * Purpose: init options table
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int options_table_init(pack_opttbl_t **tbl) {
+	unsigned int i;
+	pack_opttbl_t *table;
+
+	if (NULL == (table = (pack_opttbl_t *) HDmalloc(sizeof(pack_opttbl_t)))) {
+		error_msg("not enough memory for options table\n");
+		return -1;
+	}
+
+	table->size = 30;
+	table->nelems = 0;
+	if (NULL == (table->objs =
+			(pack_info_t*) HDmalloc(table->size * sizeof(pack_info_t)))) {
+		error_msg("not enough memory for options table\n");
+		HDfree(table);
+		return -1;
+	}
+
+	for (i = 0; i < table->size; i++)
+		init_packobject(&table->objs[i]);
+
+	*tbl = table;
+	return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: options_table_free
+ *
+ * Purpose: free table memory
+ *
+ * Return: 0
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int options_table_free(pack_opttbl_t *table) {
+	HDfree(table->objs);
+	HDfree(table);
+	return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: options_add_layout
+ *
+ * Purpose: add a layout option to the option list
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+options_add_layout(obj_list_t *obj_list, unsigned  n_objs, pack_info_t *pack,
+    pack_opttbl_t *table)
+{
+    unsigned i, j, I;
+    unsigned added = 0;
+    hbool_t found = FALSE;
+
+    /* increase the size of the collection by N_OBJS if necessary */
+    if (table->nelems + n_objs >= table->size)
+        if (aux_inctable(table, n_objs) < 0)
+            return -1;
+
+    /* search if this object is already in the table; "path" is the key */
+    if (table->nelems > 0) {
+        /* go tru the supplied list of names */
+        for (j = 0; j < n_objs; j++) {
+            /* linear table search */
+            for (i = 0; i < table->nelems; i++) {
+                /*already on the table */
+                if (HDstrcmp(obj_list[j].obj,table->objs[i].path) == 0) {
+                    /* already chunk info inserted for this one; exit */
+                    if (table->objs[i].chunk.rank > 0) {
+                        error_msg("chunk information already inserted for <%s>\n", obj_list[j].obj);
+                        HDexit(EXIT_FAILURE);
+                    }
+                    /* insert the layout info */
+                    else {
+                        aux_tblinsert_layout(table, i, pack);
+                        found = TRUE;
+                        break;
+                    }
+                } /* if */
+            } /* i */
+
+            if (!found) {
+                /* keep the grow in a temp var */
+                I = table->nelems + added;
+                added++;
+                HDstrcpy(table->objs[I].path, obj_list[j].obj);
+                aux_tblinsert_layout(table, I, pack);
+            }
+            /* cases where we have an already inserted name but there is a new name also
+             example:
+             -f dset1:GZIP=1 -l dset1,dset2:CHUNK=20x20
+             dset1 is already inserted, but dset2 must also be
+             */
+            else
+                if(found && HDstrcmp(obj_list[j].obj,table->objs[i].path) != 0) {
+                    /* keep the grow in a temp var */
+                    I = table->nelems + added;
+                    added++;
+                    HDstrcpy(table->objs[I].path, obj_list[j].obj);
+                    aux_tblinsert_layout(table, I, pack);
+                }
+        } /* j */
+    }
+    /* first time insertion */
+    else {
+        /* go tru the supplied list of names */
+        for (j = 0; j < n_objs; j++) {
+            I = table->nelems + added;
+            added++;
+            HDstrcpy(table->objs[I].path, obj_list[j].obj);
+            aux_tblinsert_layout(table, I, pack);
+        }
+    }
+
+    table->nelems += added;
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: options_add_filter
+ *
+ * Purpose: add a compression -f option to the option list
+ *
+ * Return: 0, ok, -1, fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+options_add_filter(obj_list_t *obj_list, unsigned n_objs, filter_info_t filt,
+    pack_opttbl_t *table)
+{
+    unsigned int i, j, I;
+    unsigned added = 0;
+    hbool_t found = FALSE;
+
+    /* increase the size of the collection by N_OBJS if necessary */
+    if (table->nelems + n_objs >= table->size)
+        if (aux_inctable(table, n_objs) < 0)
+            return -1;
+
+    /* search if this object is already in the table; "path" is the key */
+    if (table->nelems > 0) {
+        /* go tru the supplied list of names */
+        for (j = 0; j < n_objs; j++) {
+            /* linear table search */
+            for (i = 0; i < table->nelems; i++) {
+                /*already on the table */
+                if (HDstrcmp(obj_list[j].obj, table->objs[i].path) == 0) {
+                    /* insert */
+                    aux_tblinsert_filter(table, i, filt);
+                    found = TRUE;
+                    break;
+                } /* if */
+            } /* i */
+
+            if (!found) {
+                /* keep the grow in a temp var */
+                I = table->nelems + added;
+                added++;
+                HDstrcpy(table->objs[I].path, obj_list[j].obj);
+                aux_tblinsert_filter(table, I, filt);
+            }
+            /* cases where we have an already inserted name but there is a new name also
+             example:
+             -l dset1:CHUNK=20x20 -f dset1,dset2:GZIP=1
+             dset1 is already inserted, but dset2 must also be
+             */
+            else
+                if(found && HDstrcmp(obj_list[j].obj,table->objs[i].path) != 0) {
+                    /* keep the grow in a temp var */
+                    I = table->nelems + added;
+                    added++;
+                    HDstrcpy(table->objs[I].path, obj_list[j].obj);
+                    aux_tblinsert_filter(table, I, filt);
+                }
+        } /* j */
+    }
+
+    /* first time insertion */
+    else {
+        /* go tru the supplied list of names */
+        for (j = 0; j < n_objs; j++) {
+            I = table->nelems + added;
+            added++;
+            HDstrcpy(table->objs[I].path, obj_list[j].obj);
+            aux_tblinsert_filter(table, I, filt);
+        }
+    }
+
+    table->nelems += added;
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: options_get_object
+ *
+ * Purpose: get object from table; "path" is the key
+ *
+ * Return: pack_info_t* OBJECT or NULL if not found; PATH is the key
+ *
+ *-------------------------------------------------------------------------
+ */
+
+pack_info_t* options_get_object(const char *path, pack_opttbl_t *table) {
+	unsigned int i;
+	char tbl_path[MAX_NC_NAME + 1]; /* +1 for start with "/" case */
+
+	for (i = 0; i < table->nelems; i++) {
+		/* make full path (start with "/") to compare correctly  */
+		if (HDstrncmp(table->objs[i].path, "/", 1)) {
+			HDstrcpy(tbl_path, "/");
+			HDstrcat(tbl_path, table->objs[i].path);
+		}
+		else
+			HDstrcpy(tbl_path, table->objs[i].path);
+
+		/* found it */
+		if (HDstrcmp(tbl_path, path) == 0) {
+			return (&table->objs[i]);
+		}
+	}
+
+	return NULL;
+}
+
diff --git a/tools/src/h5repack/h5repack_parse.c b/tools/src/h5repack/h5repack_parse.c
new file mode 100644
index 0000000..a9a890d
--- /dev/null
+++ b/tools/src/h5repack/h5repack_parse.c
@@ -0,0 +1,615 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/*-------------------------------------------------------------------------
+ * Function: parse_filter
+ *
+ * Purpose: read filter information
+ *
+ * Return: a list of names, the number of names and its compression type
+ *
+ * <name of filter> can be:
+ *  GZIP, to apply the HDF5 GZIP filter (GZIP compression)
+ *  SZIP, to apply the HDF5 SZIP filter (SZIP compression)
+ *  SHUF, to apply the HDF5 shuffle filter
+ *  FLET, to apply the HDF5 checksum filter
+ *  NBIT, to apply the HDF5 NBIT filter (NBIT compression)
+ *  SOFF, to apply the HDF5 scale+offset filter (compression)
+ *  UD, to apply a User Defined filter k,m,n1[,…,nm]
+ *  NONE, to remove the filter
+ *
+ * Examples:
+ * "GZIP=6"
+ * "A,B:NONE"
+ *-------------------------------------------------------------------------
+ */
+obj_list_t* parse_filter(const char *str, unsigned *n_objs, filter_info_t *filt,
+        pack_opt_t *options, int *is_glb) {
+    size_t      i, m, u;
+    char        c;
+    size_t      len = HDstrlen(str);
+    int         k, l, p, q, end_obj = -1, no_param = 0;
+    unsigned    j, n;
+    char        sobj[MAX_NC_NAME];
+    char        scomp[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    char        stype[6] = {0, 0, 0, 0, 0, 0};
+    char        smask[3] = {0, 0, 0};
+    obj_list_t* obj_list = NULL;
+    unsigned    pixels_per_block;
+
+    /* initialize compression  info */
+    HDmemset(filt, 0, sizeof(filter_info_t));
+    *is_glb = 0;
+
+    /* check for the end of object list and number of objects */
+    for (i = 0, n = 0; i < len; i++) {
+        c = str[i];
+        if (c == ':')
+            end_obj = (int) i;
+        if (c == ',')
+            n++;
+    }
+
+    /* Check for missing : */
+    if (end_obj == -1) {
+        /* apply to all objects */
+        options->all_filter = 1;
+        *is_glb = 1;
+    }
+
+    n++;
+    obj_list = (obj_list_t *) HDmalloc(n * sizeof(obj_list_t));
+    if (obj_list == NULL) {
+        error_msg("could not allocate object list\n");
+        return NULL;
+    }
+    *n_objs = n;
+
+    /* get object list */
+    if (end_obj > 0)
+        for (j = 0, k = 0, n = 0; j < (unsigned) end_obj; j++, k++) {
+            c = str[j];
+            sobj[k] = c;
+            if (c == ',' || j == (unsigned) (end_obj - 1)) {
+                if (c == ',')
+                    sobj[k] = '\0';
+                else
+                    sobj[k + 1] = '\0';
+                HDstrcpy(obj_list[n].obj, sobj);
+                HDmemset(sobj, 0, sizeof(sobj));
+                n++;
+                k = -1;
+            }
+        }
+    /* nothing after : */
+    if (end_obj + 1 == (int) len) {
+        if (obj_list)
+            HDfree(obj_list);
+        error_msg("input Error: Invalid compression type in <%s>\n", str);
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* get filter additional parameters */
+    m = 0;
+    for (i = (size_t)(end_obj + 1), k = 0, j = 0; i < len; i++, k++) {
+        c = str[i];
+        scomp[k] = c;
+        if (c == '=' || i == len - 1) {
+            if (c == '=') { /*one more parameter */
+                scomp[k] = '\0'; /*cut space */
+
+                /*-------------------------------------------------------------------------
+                * H5Z_FILTER_SZIP
+                * szip has the format SZIP=<pixels per block,coding>
+                * pixels per block is a even number in 2-32 and coding method is 'EC' or 'NN'
+                * example SZIP=8,NN
+                *-------------------------------------------------------------------------
+                */
+                if (HDstrcmp(scomp, "SZIP") == 0) {
+                    l = -1; /* mask index check */
+                    for (m = 0, u = i + 1; u < len; u++, m++) {
+                        if (str[u] == ',') {
+                            stype[m] = '\0'; /* end digit of szip */
+                            l = 0; /* start EC or NN search */
+                            u++; /* skip ',' */
+                        }
+                        c = str[u];
+                        if (!HDisdigit(c) && l == -1) {
+                            if (obj_list)
+                                HDfree(obj_list);
+                            error_msg("compression parameter not digit in <%s>\n", str);
+                            HDexit(EXIT_FAILURE);
+                        }
+                        if (l == -1)
+                            stype[m] = c;
+                        else {
+                            smask[l] = c;
+                            l++;
+                            if (l == 2) {
+                                smask[l] = '\0';
+                                i = len - 1; /* end */
+                                (*n_objs)--; /* we counted an extra ',' */
+                                if (HDstrcmp(smask,"NN") == 0)
+                                    filt->cd_values[j++] = H5_SZIP_NN_OPTION_MASK;
+                                else if (HDstrcmp(smask,"EC") == 0)
+                                    filt->cd_values[j++] = H5_SZIP_EC_OPTION_MASK;
+                                else {
+                                    error_msg("szip mask must be 'NN' or 'EC' \n");
+                                    HDexit(EXIT_FAILURE);
+                                }
+                            }
+                        }
+                    } /* u */
+                } /*if */
+
+                /*-------------------------------------------------------------------------
+                * H5Z_FILTER_SCALEOFFSET
+                * scaleoffset has the format SOFF=<scale_factor,scale_type>
+                * scale_type can be
+                *   integer datatype, H5Z_SO_INT (IN)
+                *   float datatype using D-scaling method, H5Z_SO_FLOAT_DSCALE  (DS)
+                *   float datatype using E-scaling method, H5Z_SO_FLOAT_ESCALE  (ES) , not yet implemented
+                * for integer datatypes, scale_factor denotes Minimum Bits
+                * for float datatypes, scale_factor denotes decimal scale factor
+                *  examples
+                *  SOFF=31,IN
+                *  SOFF=3,DF
+                *-------------------------------------------------------------------------
+                */
+                else if (HDstrcmp(scomp, "SOFF") == 0) {
+                    l = -1; /* mask index check */
+                    for (m = 0, u = i + 1; u < len; u++, m++) {
+                        if (str[u] == ',') {
+                            stype[m] = '\0'; /* end digit */
+                            l = 0; /* start 'IN' , 'DS', or 'ES' search */
+                            u++; /* skip ',' */
+                        }
+                        c = str[u];
+                        if (!HDisdigit(c) && l == -1) {
+                            if (obj_list)
+                                HDfree(obj_list);
+                            error_msg("compression parameter is not a digit in <%s>\n", str);
+                            HDexit(EXIT_FAILURE);
+                        }
+                        if (l == -1)
+                            stype[m] = c;
+                        else {
+                            smask[l] = c;
+                            l++;
+                            if (l == 2) {
+                                smask[l] = '\0';
+                                i = len - 1; /* end */
+                                (*n_objs)--; /* we counted an extra ',' */
+                                if (HDstrcmp(smask,"IN") == 0)
+                                    filt->cd_values[j++] = H5Z_SO_INT;
+                                else if (HDstrcmp(smask, "DS") == H5Z_SO_FLOAT_DSCALE)
+                                    filt->cd_values[j++] = H5Z_SO_FLOAT_DSCALE;
+                                else {
+                                    error_msg("scale type must be 'IN' or 'DS' \n");
+                                    HDexit(EXIT_FAILURE);
+                                }
+                            }
+                        }
+                    } /* u */
+                } /*if */
+
+                /*-------------------------------------------------------------------------
+                * User Defined
+                *   has the format UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>
+                *  BZIP2 example
+                *  UD=307,1,9
+                *-------------------------------------------------------------------------
+                */
+                else if (HDstrcmp(scomp, "UD") == 0) {
+                    l = -1; /* filter number index check */
+                    p = -1; /* CD_VAL count check */
+                    for (m = 0, q = 0, u = i + 1; u < len; u++, m++, q++) {
+                        if (str[u] == ',') {
+                            stype[q] = '\0'; /* end digit */
+                            if (l == -1) {
+                                filt->filtn = HDatoi(stype);
+                                l = 0;
+                            }
+                            else if (p == -1) {
+                                filt->cd_nelmts = HDstrtoull(stype, NULL, 0);
+                                p = 0;
+                            }
+                            else
+                                filt->cd_values[j++] = (unsigned)HDstrtoul(stype, NULL, 0);
+                            q = 0;
+                            u++; /* skip ',' */
+                        }
+                        c = str[u];
+                        if (!HDisdigit(c) && l == -1) {
+                            if (obj_list)
+                                HDfree(obj_list);
+                            error_msg("filter number parameter is not a digit in <%s>\n", str);
+                            HDexit(EXIT_FAILURE);
+                        }
+                        stype[q] = c;
+                    } /* for u */
+                    stype[q] = '\0';
+                } /*if */
+
+                /*-------------------------------------------------------------------------
+                * all other filters
+                *-------------------------------------------------------------------------
+                */
+                else {
+                    /* here we could have 1 or 2 digits  */
+                    for (m = 0, u = i + 1; u < len; u++, m++) {
+                        c = str[u];
+                        if (!HDisdigit(c)) {
+                            if (obj_list)
+                                HDfree(obj_list);
+                            error_msg("compression parameter is not a digit in <%s>\n", str);
+                            HDexit(EXIT_FAILURE);
+                        }
+                        stype[m] = c;
+                    } /* u */
+
+                    stype[m] = '\0';
+                } /*if */
+
+                filt->cd_values[j++] = (unsigned) HDstrtoul(stype, NULL, 0);
+                if(filt->cd_nelmts == 0)
+                    j = 0;
+                i += m; /* jump */
+            }
+            else if (i == len - 1) { /*no more parameters */
+                scomp[k + 1] = '\0';
+                no_param = 1;
+            }
+
+            /*-------------------------------------------------------------------------
+            * translate from string to filter symbol
+            *-------------------------------------------------------------------------
+            */
+
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_NONE
+            *-------------------------------------------------------------------------
+            */
+            if (HDstrcmp(scomp, "NONE") == 0) {
+                filt->filtn = H5Z_FILTER_NONE;
+                filt->cd_nelmts = 0;
+            }
+
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_DEFLATE
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "GZIP") == 0) {
+                filt->filtn = H5Z_FILTER_DEFLATE;
+                filt->cd_nelmts = 1;
+                if (no_param) { /*no more parameters, GZIP must have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("missing compression parameter in <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_SZIP
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "SZIP") == 0) {
+                filt->filtn = H5Z_FILTER_SZIP;
+                filt->cd_nelmts = 2;
+                if (no_param) { /*no more parameters, SZIP must have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("missing compression parameter in <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_SHUFFLE
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "SHUF") == 0) {
+                filt->filtn = H5Z_FILTER_SHUFFLE;
+                filt->cd_nelmts = 0;
+                if (m > 0) { /*shuffle does not have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("extra parameter in SHUF <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_FLETCHER32
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "FLET") == 0) {
+                filt->filtn = H5Z_FILTER_FLETCHER32;
+                filt->cd_nelmts = 0;
+                if (m > 0) { /*shuffle does not have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("extra parameter in FLET <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_NBIT
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "NBIT") == 0) {
+                filt->filtn = H5Z_FILTER_NBIT;
+                filt->cd_nelmts = 0;
+                if (m > 0) { /*nbit does not have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("extra parameter in NBIT <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+            /*-------------------------------------------------------------------------
+            * H5Z_FILTER_SCALEOFFSET
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "SOFF") == 0) {
+                filt->filtn = H5Z_FILTER_SCALEOFFSET;
+                filt->cd_nelmts = 2;
+                if (no_param) { /*no more parameters, SOFF must have parameter */
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("missing compression parameter in <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+            /*-------------------------------------------------------------------------
+            * User Defined Filter
+            *-------------------------------------------------------------------------
+            */
+            else if (HDstrcmp(scomp, "UD") == 0) {
+                /* parameters does not match count */
+                if (filt->cd_nelmts != j) {
+                    if (obj_list)
+                        HDfree(obj_list);
+                    error_msg("incorrect number of compression parameters in <%s>\n", str);
+                    HDexit(EXIT_FAILURE);
+                }
+            }
+            else {
+                if (obj_list)
+                    HDfree(obj_list);
+                error_msg("invalid filter type in <%s>\n", str);
+                HDexit(EXIT_FAILURE);
+            }
+            break;
+        }
+    } /*i*/
+
+    /*-------------------------------------------------------------------------
+    * check valid parameters
+    *-------------------------------------------------------------------------
+    */
+
+    switch (filt->filtn) {
+    /*-------------------------------------------------------------------------
+    * H5Z_FILTER_DEFLATE
+    *-------------------------------------------------------------------------
+    */
+    case H5Z_FILTER_DEFLATE:
+        if (filt->cd_values[0] > 9) {
+            if (obj_list)
+                HDfree(obj_list);
+            error_msg("invalid compression parameter in <%s>\n", str);
+            HDexit(EXIT_FAILURE);
+        }
+        break;
+        /*-------------------------------------------------------------------------
+        * H5Z_FILTER_SZIP
+        *-------------------------------------------------------------------------
+        */
+    case H5Z_FILTER_SZIP:
+        pixels_per_block = filt->cd_values[0];
+        if ((pixels_per_block % 2) == 1) {
+            if (obj_list)
+                HDfree(obj_list);
+            error_msg("pixels_per_block is not even in <%s>\n", str);
+            HDexit(EXIT_FAILURE);
+        }
+        if (pixels_per_block > H5_SZIP_MAX_PIXELS_PER_BLOCK) {
+            if (obj_list)
+                HDfree(obj_list);
+            error_msg("pixels_per_block is too large in <%s>\n", str);
+            HDexit(EXIT_FAILURE);
+        }
+        if ((HDstrcmp(smask,"NN") != 0) && (HDstrcmp(smask,"EC") != 0)) {
+            if (obj_list)
+                HDfree(obj_list);
+            error_msg("szip mask must be 'NN' or 'EC' \n");
+            HDexit(EXIT_FAILURE);
+        }
+        break;
+    default:
+        break;
+    };
+
+    return obj_list;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: parse_layout
+ *
+ * Purpose: read layout info
+ *
+ * Return: a list of names, the number of names and its chunking info for
+ *  chunked. NULL, on error
+ * the layout type can be:
+ *  CHUNK, to apply chunking layout
+ *  CONTI, to apply contiguous layout
+ *  COMPA, to apply compact layout
+ *
+ * Example:
+ * "AA,B,CDE:CHUNK=10X10"
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 30, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+obj_list_t* parse_layout(const char *str, unsigned *n_objs, pack_info_t *pack, /* info about layout needed */
+pack_opt_t *options) {
+    obj_list_t* obj_list = NULL;
+    unsigned    i, j, n;
+    char        c;
+    size_t      len = HDstrlen(str);
+    int         k, end_obj = -1, c_index;
+    char        sobj[MAX_NC_NAME];
+    char        sdim[10];
+    char        slayout[10];
+
+    HDmemset(sdim, '\0', sizeof(sdim));
+    HDmemset(sobj, '\0', sizeof(sobj));
+    HDmemset(slayout, '\0', sizeof(slayout));
+
+    /* check for the end of object list and number of objects */
+    for (i = 0, n = 0; i < len; i++) {
+        c = str[i];
+        if (c == ':')
+            end_obj = (int) i;
+        if (c == ',')
+            n++;
+    }
+
+    if (end_obj == -1) { /* missing : chunk all */
+        options->all_layout = 1;
+    }
+
+    n++;
+    obj_list = (obj_list_t*) HDmalloc(n * sizeof(obj_list_t));
+    if (obj_list == NULL) {
+        error_msg("could not allocate object list\n");
+        return NULL;
+    }
+    *n_objs = n;
+
+    /* get object list */
+    if (end_obj > 0)
+        for (j = 0, k = 0, n = 0; j < (unsigned) end_obj; j++, k++) {
+            c = str[j];
+            sobj[k] = c;
+            if (c == ',' || j == (unsigned) (end_obj - 1)) {
+                if (c == ',')
+                    sobj[k] = '\0';
+                else
+                    sobj[k + 1] = '\0';
+                HDstrcpy(obj_list[n].obj, sobj);
+                HDmemset(sobj, 0, sizeof(sobj));
+                n++;
+                k = -1;
+            }
+        }
+
+    /* nothing after : */
+    if (end_obj + 1 == (int) len) {
+        if (obj_list)
+            HDfree(obj_list);
+        error_msg("in parse layout, no characters after : in <%s>\n", str);
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* get layout info */
+    for (j = (unsigned) (end_obj + 1), n = 0; n <= 5; j++, n++) {
+        if (n == 5) {
+            slayout[n] = '\0'; /*cut string */
+            if (HDstrcmp(slayout, "COMPA") == 0)
+                pack->layout = H5D_COMPACT;
+            else if (HDstrcmp(slayout, "CONTI") == 0)
+                pack->layout = H5D_CONTIGUOUS;
+            else if (HDstrcmp(slayout, "CHUNK") == 0)
+                pack->layout = H5D_CHUNKED;
+            else {
+                error_msg("in parse layout, not a valid layout in <%s>\n", str);
+                HDexit(EXIT_FAILURE);
+            }
+        }
+        else {
+            c = str[j];
+            slayout[n] = c;
+        }
+    } /* j */
+
+    if (pack->layout == H5D_CHUNKED) {
+        /*-------------------------------------------------------------------------
+        * get chunk info
+        *-------------------------------------------------------------------------
+        */
+        k = 0;
+        if (j > len) {
+            if (obj_list)
+                HDfree(obj_list);
+            error_msg("in parse layout,  <%s> Chunk dimensions missing\n", str);
+            HDexit(EXIT_FAILURE);
+        }
+
+        for (i = j, c_index = 0; i < len; i++) {
+            c = str[i];
+            sdim[k] = c;
+            k++; /*increment sdim index */
+
+            if (!HDisdigit(c) && c != 'x' && c != 'N' && c != 'O' && c != 'N' && c != 'E') {
+                if (obj_list)
+                    HDfree(obj_list);
+                error_msg("in parse layout, <%s> Not a valid character in <%s>\n", sdim, str);
+                HDexit(EXIT_FAILURE);
+            }
+
+            if (c == 'x' || i == len - 1) {
+                if (c == 'x') {
+                    sdim[k - 1] = '\0';
+                    k = 0;
+                    pack->chunk.chunk_lengths[c_index] = HDstrtoull(sdim, NULL, 0);
+                    if (pack->chunk.chunk_lengths[c_index] == 0) {
+                        if (obj_list)
+                            HDfree(obj_list);
+                        error_msg("in parse layout, <%s> conversion to number in <%s>\n", sdim, str);
+                        HDexit(EXIT_FAILURE);
+                    }
+                    c_index++;
+                }
+                else if (i == len - 1) { /*no more parameters */
+                    sdim[k] = '\0';
+                    k = 0;
+                    if (HDstrcmp(sdim,"NONE") == 0) {
+                        pack->chunk.rank = -2;
+                    }
+                    else {
+                        pack->chunk.chunk_lengths[c_index] = HDstrtoull(sdim, NULL, 0);
+                        if (pack->chunk.chunk_lengths[c_index] == 0) {
+                            if (obj_list)
+                                HDfree(obj_list);
+                            error_msg("in parse layout, <%s> conversion to number in <%s>\n", sdim, str);
+                            HDexit(EXIT_FAILURE);
+                        }
+                        pack->chunk.rank = c_index + 1;
+                    }
+                } /*if */
+            } /*if c=='x' || i==len-1 */
+        } /*i*/
+    } /*H5D_CHUNKED*/
+
+    return obj_list;
+}
diff --git a/tools/src/h5repack/h5repack_refs.c b/tools/src/h5repack/h5repack_refs.c
new file mode 100644
index 0000000..2c38d94
--- /dev/null
+++ b/tools/src/h5repack/h5repack_refs.c
@@ -0,0 +1,875 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5diff.h"
+#include "h5tools.h"
+
+
+/*-------------------------------------------------------------------------
+ * local functions
+ *-------------------------------------------------------------------------
+ */
+
+static const char* MapIdToName(hid_t refobj_id,trav_table_t *travt);
+static int copy_refs_attr(hid_t loc_in, hid_t loc_out, pack_opt_t *options,
+                          trav_table_t *travt, hid_t fidout);
+static herr_t update_ref_value(hid_t obj_id, H5R_type_t ref_type, void *ref_in,
+		hid_t fid_out, void *ref_out, trav_table_t *travt);
+
+/*-------------------------------------------------------------------------
+ * Function: do_copy_refobjs
+ *
+ * Purpose: duplicate all referenced HDF5 objects in the file
+ *  and create hard links
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December, 10, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int do_copy_refobjs(hid_t fidin,
+                    hid_t fidout,
+                    trav_table_t *travt,
+                    pack_opt_t *options) /* repack options */
+{
+    int       ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t     grp_in = (-1);          /* read group ID */
+    hid_t     grp_out = (-1);         /* write group ID */
+    hid_t     dset_in = (-1);         /* read dataset ID */
+    hid_t     dset_out = (-1);        /* write dataset ID */
+    hid_t     type_in = (-1);         /* named type ID */
+    hid_t     dcpl_id = (-1);         /* dataset creation property list ID */
+    hid_t     space_id = (-1);        /* space ID */
+    hid_t     ftype_id = (-1);        /* file data type ID */
+    hid_t     mtype_id = (-1);        /* memory data type ID */
+    size_t    msize;                  /* memory size of memory type */
+    hsize_t   nelmts;                 /* number of elements in dataset */
+    int       rank;                   /* rank of dataset */
+    hsize_t   dims[H5S_MAX_RANK];     /* dimensions of dataset */
+    unsigned int i, j;
+    int       k;
+    named_dt_t *named_dt_head=NULL;   /* Pointer to the stack of named datatypes
+                                         copied */
+
+    /*-------------------------------------------------------------------------
+    * browse
+    *-------------------------------------------------------------------------
+    */
+    for(i = 0; i < travt->nobjs; i++) {
+        switch(travt->objs[i].type)
+        {
+            /*-------------------------------------------------------------------------
+            * H5TRAV_TYPE_GROUP
+            *-------------------------------------------------------------------------
+            */
+            case H5TRAV_TYPE_GROUP:
+                /*-------------------------------------------------------------------------
+                * copy referenced objects in attributes
+                *-------------------------------------------------------------------------
+                */
+                if((grp_out = H5Gopen2(fidout, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+
+                if((grp_in = H5Gopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+
+                if(copy_refs_attr(grp_in, grp_out, options, travt, fidout) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_refs_attr failed");
+
+                if(H5Gclose(grp_out) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+                if(H5Gclose(grp_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+
+                /*-------------------------------------------------------------------------
+                * check for hard links
+                *-------------------------------------------------------------------------
+                */
+                if(travt->objs[i].nlinks)
+                    for(j = 0; j < travt->objs[i].nlinks; j++)
+                        H5Lcreate_hard(fidout, travt->objs[i].name, H5L_SAME_LOC, travt->objs[i].links[j].new_name, H5P_DEFAULT, H5P_DEFAULT);
+                break;
+
+            /*-------------------------------------------------------------------------
+            * H5TRAV_TYPE_DATASET
+            *-------------------------------------------------------------------------
+            */
+            case H5TRAV_TYPE_DATASET:
+                if((dset_in = H5Dopen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                if((space_id = H5Dget_space(dset_in)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+                if((ftype_id = H5Dget_type(dset_in)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_type failed");
+                if((dcpl_id = H5Dget_create_plist(dset_in)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+                if((rank = H5Sget_simple_extent_ndims(space_id)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
+                if(H5Sget_simple_extent_dims(space_id, dims, NULL) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+                nelmts = 1;
+                for(k = 0; k < rank; k++)
+                    nelmts *= dims[k];
+
+                if((mtype_id = h5tools_get_native_type(ftype_id)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "h5tools_get_native_type failed");
+
+                if((msize = H5Tget_size(mtype_id)) == 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+                /*-------------------------------------------------------------------------
+                 * check if the dataset creation property list has filters that
+                 * are not registered in the current configuration
+                 * 1) the external filters GZIP and SZIP might not be available
+                 * 2) the internal filters might be turned off
+                 *-------------------------------------------------------------------------
+                 */
+                if(h5tools_canreadf(NULL, dcpl_id) == 1) {
+                    /*-------------------------------------------------------------------------
+                    * test for a valid output dataset
+                    *-------------------------------------------------------------------------
+                    */
+                    dset_out = FAIL;
+
+                    /*-------------------------------------------------------------------------
+                    * object references are a special case
+                    * we cannot just copy the buffers, but instead we recreate the reference
+                    *-------------------------------------------------------------------------
+                    */
+                    if(H5Tequal(mtype_id, H5T_STD_REF_OBJ)) {
+                        hid_t            refobj_id;
+                        hobj_ref_t       *refbuf = NULL; /* buffer for object references */
+                        hobj_ref_t       *buf = NULL;
+                        const char*      refname;
+                        unsigned         u;
+
+                        /*-------------------------------------------------------------------------
+                        * read to memory
+                        *-------------------------------------------------------------------------
+                        */
+                        if(nelmts) {
+                            buf = (hobj_ref_t *)HDmalloc((unsigned)(nelmts * msize));
+                            if(buf==NULL) {
+                                printf("cannot read into memory\n" );
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                            } /* end if */
+                            if(H5Dread(dset_in, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+
+                            refbuf = (hobj_ref_t*) HDcalloc((unsigned)nelmts, msize);
+                            if(refbuf == NULL){
+                                printf("cannot allocate memory\n" );
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDcalloc failed");
+                            } /* end if */
+                            for(u = 0; u < nelmts; u++) {
+                                H5E_BEGIN_TRY {
+                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_OBJECT, &buf[u])) < 0)
+                                        continue;
+                                } H5E_END_TRY;
+
+                                /* get the name. a valid name could only occur
+                                 * in the second traversal of the file
+                                 */
+                                if((refname = MapIdToName(refobj_id, travt)) != NULL) {
+                                    /* create the reference, -1 parameter for objects */
+                                    if(H5Rcreate(&refbuf[u], fidout, refname, H5R_OBJECT, (hid_t)-1) < 0)
+                                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rcreate failed");
+                                    if(options->verbose)
+                                    {
+                                        printf(FORMAT_OBJ,"dset",travt->objs[i].name );
+                                        printf("object <%s> object reference created to <%s>\n",
+                                            travt->objs[i].name,
+                                            refname);
+                                    }
+                                } /*refname*/
+                                H5Oclose(refobj_id);
+                            } /* u */
+                        } /*nelmts*/
+
+                        /*-------------------------------------------------------------------------
+                        * create/write dataset/close
+                        *-------------------------------------------------------------------------
+                        */
+                        if((dset_out = H5Dcreate2(fidout, travt->objs[i].name, mtype_id, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dcreate2 failed");
+                        if(nelmts)
+                            if(H5Dwrite(dset_out, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, refbuf) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dwrite failed");
+
+                        if(buf)
+                            HDfree(buf);
+                        if(refbuf)
+                            HDfree(refbuf);
+
+                       /*------------------------------------------------------
+                        * copy attrs
+                        *----------------------------------------------------*/
+                        if(copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+                    } /*H5T_STD_REF_OBJ*/
+
+                    /*-------------------------------------------------------------------------
+                    * dataset region references
+                    *-------------------------------------------------------------------------
+                    */
+                    else if(H5Tequal(mtype_id, H5T_STD_REF_DSETREG))
+                    {
+                        hid_t            refobj_id;
+                        hdset_reg_ref_t  *refbuf = NULL; /* input buffer for region references */
+                        hdset_reg_ref_t  *buf = NULL;    /* output buffer */
+                        const char*      refname;
+                        unsigned         u;
+
+                        /*-------------------------------------------------------------------------
+                        * read input to memory
+                        *-------------------------------------------------------------------------
+                        */
+                        if(nelmts) {
+                            buf = (hdset_reg_ref_t *)HDmalloc((unsigned)(nelmts * msize));
+                            if(buf == NULL) {
+                                printf("cannot read into memory\n");
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                            } /* end if */
+                            if(H5Dread(dset_in, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dread failed");
+
+                            /*-------------------------------------------------------------------------
+                            * create output
+                            *-------------------------------------------------------------------------
+                            */
+                            refbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)nelmts); /*init to zero */
+                            if(refbuf == NULL) {
+                                printf("cannot allocate memory\n");
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDcalloc failed");
+                            } /* end if */
+
+                            for(u = 0; u < nelmts; u++) {
+                                H5E_BEGIN_TRY {
+                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_DATASET_REGION, &buf[u])) < 0)
+                                        continue;
+                                } H5E_END_TRY;
+
+                                /* get the name. a valid name could only occur
+                                 * in the second traversal of the file
+                                 */
+                                if((refname = MapIdToName(refobj_id, travt)) != NULL) {
+                                    hid_t region_id;    /* region id of the referenced dataset */
+
+                                    if((region_id = H5Rget_region(dset_in, H5R_DATASET_REGION, &buf[u])) < 0)
+                                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rget_region failed");
+
+                                    /* create the reference, we need the space_id */
+                                    if(H5Rcreate(&refbuf[u], fidout, refname, H5R_DATASET_REGION, region_id) < 0)
+                                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rcreate failed");
+                                    if(H5Sclose(region_id) < 0)
+                                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+                                    if(options->verbose)
+                                    {
+                                        printf(FORMAT_OBJ,"dset",travt->objs[i].name );
+                                        printf("object <%s> region reference created to <%s>\n",
+                                            travt->objs[i].name,
+                                            refname);
+                                    }
+                                } /*refname*/
+                                H5Oclose(refobj_id);
+                            } /* u */
+                        } /*nelmts*/
+
+                        /*-------------------------------------------------------------------------
+                        * create/write dataset/close
+                        *-------------------------------------------------------------------------
+                        */
+                        if((dset_out = H5Dcreate2(fidout, travt->objs[i].name, mtype_id, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dcreate2 failed");
+                        if(nelmts)
+                            if(H5Dwrite(dset_out, mtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, refbuf) < 0)
+                                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dwrite failed");
+
+                        if(buf)
+                            HDfree(buf);
+                        if(refbuf)
+                            HDfree(refbuf);
+
+                       /*-----------------------------------------------------
+                        * copy attrs
+                        *----------------------------------------------------*/
+                        if(copy_attr(dset_in, dset_out, &named_dt_head, travt, options) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_attr failed");
+                    } /* H5T_STD_REF_DSETREG */
+                    /*-------------------------------------------------------------------------
+                    * not references, open previously created object in 1st traversal
+                    *-------------------------------------------------------------------------
+                    */
+                    else {
+                        if((dset_out = H5Dopen2(fidout, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                    } /* end else */
+
+                    HDassert(dset_out != FAIL);
+
+                    /*-------------------------------------------------------------------------
+                    * copy referenced objects in attributes
+                    *-------------------------------------------------------------------------
+                    */
+                    if(copy_refs_attr(dset_in, dset_out, options, travt, fidout) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "copy_refs_attr failed");
+
+                    /*-------------------------------------------------------------------------
+                    * check for hard links
+                    *-------------------------------------------------------------------------
+                    */
+                    if(travt->objs[i].nlinks)
+                        for(j = 0; j < travt->objs[i].nlinks; j++)
+                            H5Lcreate_hard(fidout, travt->objs[i].name, H5L_SAME_LOC, travt->objs[i].links[j].new_name, H5P_DEFAULT, H5P_DEFAULT);
+
+                    if(H5Dclose(dset_out) < 0)
+                        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                } /*can_read*/
+
+                /*-------------------------------------------------------------------------
+                * close
+                *-------------------------------------------------------------------------
+                */
+                if(H5Tclose(ftype_id) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                if(H5Tclose(mtype_id) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                if(H5Pclose(dcpl_id) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                if(H5Sclose(space_id) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+                if(H5Dclose(dset_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                break;
+
+            /*-------------------------------------------------------------------------
+            * H5TRAV_TYPE_NAMED_DATATYPE
+            *-------------------------------------------------------------------------
+            */
+            case H5TRAV_TYPE_NAMED_DATATYPE:
+                if((type_in = H5Topen2(fidin, travt->objs[i].name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Topen2 failed");
+                if(H5Tclose(type_in) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+                break;
+
+            /*-------------------------------------------------------------------------
+            * H5TRAV_TYPE_LINK
+            *-------------------------------------------------------------------------
+            */
+            case H5TRAV_TYPE_LINK:
+                /*nothing to do */
+                break;
+
+            case H5TRAV_TYPE_UNKNOWN:
+            case H5TRAV_TYPE_UDLINK:
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5TRAV invalid type");
+
+            default:
+                break;
+        } /* end switch */
+    } /* end for */
+
+    /* Finalize (link) the stack of named datatypes (if any)
+     * This function is paired with copy_named_datatype() which is called
+     * in copy_attr(), so need to free.
+     */
+    named_datatype_free(&named_dt_head, 0);
+
+    return ret_value;
+
+done:
+    H5E_BEGIN_TRY {
+        H5Gclose(grp_in);
+        H5Gclose(grp_out);
+        H5Pclose(dcpl_id);
+        H5Sclose(space_id);
+        H5Dclose(dset_in);
+        H5Dclose(dset_out);
+        H5Tclose(ftype_id);
+        H5Tclose(mtype_id);
+        H5Tclose(type_in);
+        named_datatype_free(&named_dt_head, 0);
+    } H5E_END_TRY;
+
+    return ret_value;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: copy_refs_attr
+ *
+ * Purpose: duplicate all referenced HDF5 located in attributes
+ *  relative to LOC_IN, which is obtained either from
+ * loc_id = H5Gopen2(fid, name, H5P_DEFAULT);
+ * loc_id = H5Dopen2(fid, name, H5P_DEFAULT);
+ * loc_id = H5Topen2(fid, name, H5P_DEFAULT);
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Modifier: xcao at hdfgroup.org, 9/12/2011
+ * 	         Update values of references(object and region) for the following types:
+ *               1) References,
+ *               2) ARRAY of reference,
+ *               3) VLEN of references.
+ *               4) COMPOUND of references.
+ *          This function does not handle references in other complicated structures,
+ *		    such as references in nested compound datatypes.
+ *
+ * Date: October, 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static int copy_refs_attr(hid_t loc_in,
+                          hid_t loc_out,
+                          pack_opt_t *options,
+                          trav_table_t *travt,
+                          hid_t fidout         /* for saving references */
+                          )
+{
+    int        ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t      attr_id = -1;      /* attr ID */
+    hid_t      attr_out = -1;     /* attr ID */
+    hid_t      space_id = -1;     /* space ID */
+    hid_t      ftype_id = -1;     /* file data type ID */
+    hid_t      mtype_id = -1;     /* memory data type ID */
+    size_t     msize;             /* memory size of type */
+    hsize_t    nelmts;            /* number of elements in dataset */
+    hsize_t    dims[H5S_MAX_RANK];/* dimensions of dataset */
+    char       name[255];
+    H5O_info_t oinfo;           /* Object info */
+    unsigned   u, i, j;
+    int        rank;
+    H5T_class_t type_class = -1;
+    hbool_t    is_ref=0, is_ref_vlen=0, is_ref_array=0, is_ref_comp=0;
+    void  *refbuf = NULL;
+    void  *buf = NULL;
+    const char* refname = NULL;
+    unsigned *ref_comp_index = NULL;
+    size_t *ref_comp_size = NULL;
+    int    ref_comp_field_n = 0;
+
+
+    if(H5Oget_info(loc_in, &oinfo) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Oget_info failed");
+
+    for(u = 0; u < (unsigned)oinfo.num_attrs; u++) {
+    	is_ref = is_ref_vlen = is_ref_array = is_ref_comp = 0;
+
+        /* open attribute */
+        if((attr_id = H5Aopen_by_idx(loc_in, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aopen_by_idx failed");
+
+        /* get the file datatype  */
+        if((ftype_id = H5Aget_type(attr_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aget_type failed");
+
+        type_class = H5Tget_class(ftype_id);
+
+        if((mtype_id = h5tools_get_native_type(ftype_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "h5tools_get_native_type failed");
+
+        if((msize = H5Tget_size(mtype_id)) == 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_size failed");
+
+        is_ref = (type_class == H5T_REFERENCE);
+
+        if(type_class == H5T_VLEN ) {
+            hid_t base_type;
+
+            base_type = H5Tget_super(ftype_id);
+            is_ref_vlen = (H5Tget_class(base_type)==H5T_REFERENCE);
+            msize = H5Tget_size(base_type);
+            H5Tclose(base_type);
+        }
+        else if(type_class == H5T_ARRAY ) {
+            hid_t base_type;
+
+            base_type = H5Tget_super(ftype_id);
+            is_ref_array = (H5Tget_class(base_type)==H5T_REFERENCE);
+            msize = H5Tget_size(base_type);
+            H5Tclose(base_type);
+        }
+        else if(type_class == H5T_COMPOUND) {
+            int nmembers = H5Tget_nmembers(ftype_id) ;
+
+            if (nmembers < 1)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers failed");
+
+            ref_comp_index = (unsigned *)HDmalloc((size_t)nmembers*sizeof(unsigned));
+            ref_comp_size = (size_t *)HDmalloc((size_t)nmembers*sizeof(ref_comp_size));
+            ref_comp_field_n = 0;
+
+            for (i=0; i<(unsigned)nmembers; i++) {
+                hid_t mtid = H5Tget_member_type( ftype_id, i );
+
+                if ((H5Tget_class(mtid)==H5T_REFERENCE)) {
+                    ref_comp_index[ref_comp_field_n] = i;
+                    ref_comp_size[ref_comp_field_n] = H5Tget_size(mtid);
+                    ref_comp_field_n++;
+                }
+                H5Tclose(mtid);
+            }
+            
+            /* if compound don't contain reference type member, free the above 
+             * mallocs. Otherwise there can be memory leaks by the 'continue' 
+             * statement below. */
+            if (!ref_comp_field_n) {
+                if (ref_comp_index) {
+                    HDfree(ref_comp_index);
+                    ref_comp_index = NULL;
+                }
+
+                if (ref_comp_size) {
+            	    HDfree(ref_comp_size);
+                    ref_comp_size = NULL;
+                }
+            }
+        }
+
+        is_ref_comp = (ref_comp_field_n > 0);
+
+        if (!(is_ref || is_ref_vlen || is_ref_array || is_ref_comp)) {
+            H5Tclose(mtype_id);
+            H5Tclose(ftype_id);
+            H5Aclose(attr_id);
+            continue;
+        }
+
+        /* get name */
+        if(H5Aget_name(attr_id, 255, name) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aget_name failed");
+
+        /* get the dataspace handle  */
+        if((space_id = H5Aget_space(attr_id)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aget_space failed");
+
+        /* get dimensions  */
+        if((rank = H5Sget_simple_extent_dims(space_id, dims, NULL)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
+
+
+        /*-------------------------------------------------------------------------
+        * elements
+        *-------------------------------------------------------------------------
+        */
+        nelmts = 1;
+        for(j = 0; j < (unsigned)rank; j++)
+            nelmts *= dims[j];
+
+        if (is_ref_array) {
+            unsigned  array_rank = 0;
+            hsize_t   array_size = 1;
+            hsize_t array_dims[H5S_MAX_RANK];
+            hid_t base_type;
+
+            base_type = H5Tget_super(ftype_id);
+            msize = H5Tget_size(base_type);
+            H5Tclose(base_type);
+
+            array_rank = (unsigned)H5Tget_array_ndims(mtype_id);
+            H5Tget_array_dims2(mtype_id, array_dims);
+            for(j = 0; j <array_rank; j++)
+            	array_size *= array_dims[j];
+            nelmts *= array_size;
+        }
+
+        if((attr_out = H5Acreate2(loc_out, name, ftype_id, space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Acreate2 failed");
+
+        if (nelmts>0) {
+            /* handle object references */
+            if((is_ref || is_ref_array) && (H5R_OBJ_REF_BUF_SIZE==msize)) {
+                buf = (hobj_ref_t *)HDmalloc((unsigned)(nelmts * msize));
+                if(buf == NULL) {
+                    printf("cannot read into memory\n");
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                } /* end if */
+                if(H5Aread(attr_id, mtype_id, buf) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aread failed");
+
+                refbuf = (hobj_ref_t *)HDcalloc((unsigned)nelmts, msize);
+                if(refbuf == NULL) {
+                    printf("cannot allocate memory\n");
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDcalloc failed");
+                } /* end if */
+
+                for(i = 0; i < (unsigned)nelmts; i++) {
+                    if (update_ref_value(attr_id, H5R_OBJECT, &((hobj_ref_t *)buf)[i], fidout, &((hobj_ref_t *)refbuf)[i], travt)<0)
+                        continue;
+                    if(options->verbose)
+                        printf("object <%s> reference created to <%s>\n", name, refname);
+                } /* i */
+            } /* H5T_STD_REF_OBJ */
+            /* handle region references */
+            else if((is_ref || is_ref_array) && (H5R_DSET_REG_REF_BUF_SIZE == msize)) {
+                buf = (hdset_reg_ref_t *)HDmalloc((unsigned)(nelmts * msize));
+
+                if(buf == NULL) {
+                    printf( "cannot read into memory\n" );
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                } /* end if */
+                if(H5Aread(attr_id, mtype_id, buf) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aread failed");
+
+                /*-------------------------------------------------------------------------
+                * create output
+                *-------------------------------------------------------------------------
+                */
+                refbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)nelmts); /*init to zero */
+                if(refbuf == NULL) {
+                    printf( "cannot allocate memory\n" );
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDcalloc failed");
+                } /* end if */
+
+                for(i = 0; i < (unsigned)nelmts; i++) {
+                    if (update_ref_value(attr_id, H5R_DATASET_REGION, &((hdset_reg_ref_t *)buf)[i], fidout, &((hdset_reg_ref_t *)refbuf)[i], travt)<0)
+                        continue;
+                    if(options->verbose)
+                        printf("object <%s> region reference created to <%s>\n", name, refname);
+                }
+            } /* H5T_STD_REF_DSETREG */
+            else if (is_ref_vlen) {
+            	/* handle VLEN of references */
+
+                buf = (hvl_t *)HDmalloc((unsigned)(nelmts * sizeof(hvl_t)));
+                refbuf = buf; /* reuse the read buffer for write */
+
+                if(buf == NULL) {
+                    printf( "cannot read into memory\n" );
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                } /* end if */
+
+                if(H5Aread(attr_id, mtype_id, buf) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aread failed");
+
+                if (H5R_OBJ_REF_BUF_SIZE==msize) {
+                    hobj_ref_t ref_out;
+
+                    for (i=0; i<(unsigned)nelmts; i++) {
+                        hobj_ref_t *ptr = (hobj_ref_t *)((hvl_t *)buf)[i].p;
+
+                        for (j=0; j<((hvl_t *)buf)[i].len; j++ ) {
+                            if (update_ref_value(attr_id, H5R_OBJECT, &(ptr[j]), fidout, &ref_out, travt)<0)
+                                continue;
+                            HDmemcpy(&(ptr[j]), &ref_out, msize);
+                        }
+                    }  /* for (i=0; i<nelems; i++) */
+                } else if (H5R_DSET_REG_REF_BUF_SIZE == msize) {
+                    hdset_reg_ref_t ref_out;
+
+                    for (i=0; i<(unsigned)nelmts; i++) {
+                        hdset_reg_ref_t *ptr = (hdset_reg_ref_t *)((hvl_t *)buf)[i].p;
+
+                        for (j=0; j<((hvl_t *)buf)[i].len; j++ ) {
+                            if (update_ref_value(attr_id, H5R_DATASET_REGION, &(ptr[j]), fidout, &ref_out, travt)<0)
+                                continue;
+                            HDmemcpy(&(ptr[j]), &ref_out, msize);
+                        }
+                    }  /* for (i=0; i<nelems; i++) */
+                }
+            } /* else if (is_ref_vlen) */
+            else if (is_ref_comp) {
+            	/* handle ref fields in a compound */
+
+                buf = HDmalloc((unsigned)(nelmts * msize));
+                refbuf = buf; /* reuse the read buffer for write */
+
+                if(buf == NULL)
+                {
+                    printf( "cannot read into memory\n" );
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "HDmalloc failed");
+                } /* end if */
+
+                if(H5Aread(attr_id, mtype_id, buf) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aread failed");
+
+                for (i=0; i<(unsigned)nelmts; i++) {
+                    for (j=0; j<(unsigned)ref_comp_field_n; j++) {
+                        if (ref_comp_size[j] == H5R_OBJ_REF_BUF_SIZE) {
+                            size_t idx = (i * msize) + H5Tget_member_offset(mtype_id, ref_comp_index[j]);
+                            hobj_ref_t ref_out;
+
+                            if (update_ref_value(attr_id, H5R_OBJECT, (hobj_ref_t *)(((char *)buf)+idx), fidout, &ref_out, travt)<0)
+                                continue;
+                            HDmemcpy(((char *)buf)+idx, &ref_out, ref_comp_size[j]);
+                        } /* if */
+                        else if (ref_comp_size[j] == H5R_DSET_REG_REF_BUF_SIZE) {
+                            size_t idx = i * msize + H5Tget_member_offset(mtype_id, ref_comp_index[j]);
+                            hdset_reg_ref_t ref_out;
+
+                            if (update_ref_value(attr_id, H5R_DATASET_REGION, (hdset_reg_ref_t *)(((char *)buf)+idx), fidout, &ref_out, travt)<0)
+                                continue;
+                            HDmemcpy(((char *)buf)+idx, &ref_out, ref_comp_size[j]);
+                        } /* else if */
+                    } /* j */
+                } /* i */
+            } /* else if (is_ref_comp) */
+
+            if(H5Awrite(attr_out, mtype_id, refbuf) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Awrite failed");
+
+            if (is_ref_vlen && buf)
+            	H5Dvlen_reclaim (mtype_id, space_id, H5P_DEFAULT, buf);
+        } /* if (nelmts) */
+
+        if (refbuf == buf)
+            refbuf = NULL; /* set it to NULL to avoid double free since buf and refbuf are the same. */
+
+        if(buf) {
+            HDfree(buf);
+            buf = NULL;
+        }
+
+        if(refbuf) {
+            HDfree(refbuf);
+            refbuf = NULL;
+        }
+
+        if (ref_comp_index) {
+            HDfree(ref_comp_index);
+            ref_comp_index = NULL;
+        }
+
+        if (ref_comp_size) {
+            HDfree(ref_comp_size);
+            ref_comp_size = NULL;
+        }
+
+        if(H5Aclose(attr_out) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aclose failed");
+
+        /*-------------------------------------------------------------------------
+        * close
+        *-------------------------------------------------------------------------
+        */
+        if(H5Tclose(ftype_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+        if(H5Tclose(mtype_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+        if(H5Sclose(space_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+        if(H5Aclose(attr_id) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Aclose failed");
+    } /* for(u = 0; u < (unsigned)oinfo.num_attrs; u++) */
+
+    return ret_value;
+
+done:
+    if(refbuf)
+        HDfree(refbuf);
+    if(buf)
+        HDfree(buf);
+
+    if (ref_comp_index)
+    	HDfree(ref_comp_index);
+
+    if (ref_comp_size)
+    	HDfree(ref_comp_size);
+
+    H5E_BEGIN_TRY {
+        H5Tclose(ftype_id);
+        H5Tclose(mtype_id);
+        H5Sclose(space_id);
+        H5Aclose(attr_id);
+        H5Aclose(attr_out);
+    } H5E_END_TRY;
+
+    return ret_value;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:	MapIdToName
+ *
+ * Purpose:	map a ID from a reference to a dataset name
+ *
+ *-------------------------------------------------------------------------
+ */
+static const char*
+MapIdToName(hid_t refobj_id, trav_table_t *travt)
+{
+    unsigned int u;
+    const char* ret = NULL;
+
+    /* linear search */
+    for(u = 0; u < travt->nobjs; u++) {
+        if(travt->objs[u].type == (h5trav_type_t)H5O_TYPE_DATASET ||
+                travt->objs[u].type == (h5trav_type_t)H5O_TYPE_GROUP ||
+                travt->objs[u].type == (h5trav_type_t)H5O_TYPE_NAMED_DATATYPE) {
+            H5O_info_t   ref_oinfo;     /* Stat for the refobj id */
+
+            /* obtain information to identify the referenced object uniquely */
+            if(H5Oget_info(refobj_id, &ref_oinfo) < 0)
+                goto out;
+
+            if(ref_oinfo.addr == travt->objs[u].objno) {
+                ret = travt->objs[u].name;
+                goto out;
+            } /* end if */
+        }  /* end if */
+    } /* u */
+
+out:
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:	Update_Ref_value
+ *
+ * Purpose:	Update a reference value
+ *
+ * Programmer: xcao at hdfgroup.org 9/12/2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t update_ref_value(hid_t obj_id, H5R_type_t ref_type, void *ref_in,
+		hid_t fid_out, void *ref_out, trav_table_t *travt)
+{
+    int    ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    const char* ref_obj_name;
+    hid_t space_id=-1, ref_obj_id=-1;
+
+    ref_obj_id = H5Rdereference2(obj_id, H5P_DEFAULT, ref_type, ref_in);
+    if (ref_obj_id < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rdereference2 failed");
+
+    ref_obj_name = MapIdToName(ref_obj_id, travt);
+    if (ref_obj_name == NULL)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "MapIdToName failed");
+
+    if (ref_type == H5R_DATASET_REGION) {
+        space_id = H5Rget_region(obj_id, H5R_DATASET_REGION, ref_in);
+        if (space_id < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rget_region failed");
+    }
+
+    if(H5Rcreate(ref_out, fid_out, ref_obj_name, ref_type, space_id) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Rcreate failed");
+
+done:
+    H5E_BEGIN_TRY {
+      H5Sclose(space_id);
+      H5Oclose(ref_obj_id);
+    } H5E_END_TRY;
+
+    return ret_value;
+}
+
diff --git a/tools/src/h5repack/h5repack_verify.c b/tools/src/h5repack/h5repack_verify.c
new file mode 100644
index 0000000..7e79aa7
--- /dev/null
+++ b/tools/src/h5repack/h5repack_verify.c
@@ -0,0 +1,714 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* number of members in an array */
+#ifndef NELMTS
+#    define NELMTS(X)    (sizeof(X)/sizeof(X[0]))
+#endif
+
+static int verify_layout(hid_t pid, pack_info_t *obj);
+static int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter);
+
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_verify
+ *
+ * Purpose: verify if filters and layout in the input file match the output file
+ *
+ * Return:
+ *  1 match
+ *  0 do not match
+ * -1 error
+ *
+ * Programmer: Pedro Vicente, pvn at hdfgroup.org
+ *
+ * Date: December 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+h5repack_verify(const char *in_fname, const char *out_fname, pack_opt_t *options)
+{
+    int          ret_value = 0;     /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    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_fspace_strategy_t in_strategy, out_strategy;	/* file space handling strategy for in/output file */
+    hbool_t 	in_persist, out_persist;		/* free-space persist status for in/output file */
+    hsize_t	in_threshold, out_threshold;		/* free-space section threshold for in/output file */
+    hsize_t	in_pagesize, out_pagesize;		/* file space page size for input/output file */
+
+    /* open the output file */
+    if((fidout = H5Fopen(out_fname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
+        return -1;
+
+    for(i = 0; i < options->op_tbl->nelems; i++)
+    {
+        char* name = options->op_tbl->objs[i].path;
+        pack_info_t *obj = &options->op_tbl->objs[i];
+
+       /*-------------------------------------------------------------------------
+        * open
+        *-------------------------------------------------------------------------
+        */
+        if((did = H5Dopen2(fidout, name, H5P_DEFAULT)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+        if((sid = H5Dget_space(did)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+        if((pid = H5Dget_create_plist(did)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+        if((tid = H5Dget_type(did)) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_type failed");
+
+       /*-------------------------------------------------------------------------
+        * filter check
+        *-------------------------------------------------------------------------
+        */
+        if(verify_filters(pid, tid, obj->nfilters, obj->filter) <= 0)
+            ok = 0;
+
+
+       /*-------------------------------------------------------------------------
+        * layout check
+        *-------------------------------------------------------------------------
+        */
+        if((obj->layout != -1) && (verify_layout(pid, obj) == 0))
+            ok = 0;
+
+       /*-------------------------------------------------------------------------
+        * close
+        *-------------------------------------------------------------------------
+        */
+        if(H5Pclose(pid) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+        if (H5Sclose(sid) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+        if (H5Dclose(did) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+        if (H5Tclose(tid) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+
+    }
+
+
+   /*-------------------------------------------------------------------------
+    * check for the "all" objects option
+    *-------------------------------------------------------------------------
+    */
+
+    if(options->all_filter == 1 || options->all_layout == 1)
+    {
+
+        /* init table */
+        trav_table_init(&travt);
+
+        /* get the list of objects in the file */
+        if(h5trav_gettable(fidout, travt) < 0)
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "h5trav_gettable failed");
+
+        for(i = 0; i < travt->nobjs; i++)
+        {
+            char *name = travt->objs[i].name;
+
+            if(travt->objs[i].type == H5TRAV_TYPE_DATASET)
+            {
+
+               /*-------------------------------------------------------------------------
+                * open
+                *-------------------------------------------------------------------------
+                */
+                if((did = H5Dopen2(fidout, name, H5P_DEFAULT)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+                if((sid = H5Dget_space(did)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
+                if((pid = H5Dget_create_plist(did)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+                if((tid = H5Dget_type(did)) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_type failed");
+
+               /*-------------------------------------------------------------------------
+                * filter check
+                *-------------------------------------------------------------------------
+                */
+                if(options->all_filter == 1)
+                {
+                    if(verify_filters(pid, tid, options->n_filter_g, options->filter_g) <= 0)
+                        ok = 0;
+                }
+
+               /*-------------------------------------------------------------------------
+                * layout check
+                *-------------------------------------------------------------------------
+                */
+                if(options->all_layout == 1)
+                {
+                    pack_info_t pack;
+
+                    init_packobject(&pack);
+                    pack.layout = options->layout_g;
+                    pack.chunk = options->chunk_g;
+                    if(verify_layout(pid, &pack) == 0)
+                        ok = 0;
+                }
+
+
+               /*-------------------------------------------------------------------------
+                * close
+                *-------------------------------------------------------------------------
+                */
+                if (H5Pclose(pid) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+                if (H5Sclose(sid) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
+                if (H5Dclose(did) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+                if (H5Tclose(tid) < 0)
+                    HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Tclose failed");
+            } /* if */
+
+        } /* i */
+
+        /* free table */
+        trav_table_free(travt);
+    }
+
+   /*-------------------------------------------------------------------------
+    * Verify that file space info are set as expected
+    *-------------------------------------------------------------------------
+    */
+
+    /* open the input file */
+    if((fidin = H5Fopen(in_fname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fopen failed");
+
+    /* 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");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fget_create_plist failed");
+    }
+
+    /* Get file space info for input file */
+    if(H5Pget_file_space_strategy(fcpl_in, &in_strategy, &in_persist, &in_threshold) < 0) {
+        error_msg("failed to retrieve file space strategy & threshold\n");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pget_file_space failed");
+    }
+
+    /* Get file space page size for input file */
+    if(H5Pget_file_space_page_size(fcpl_in, &in_pagesize) < 0) {
+        error_msg("failed to retrieve file space page size\n");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fget_create_plist failed");
+    }
+
+    /* 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");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fget_create_plist failed");
+    }
+
+    /* Get file space info for output file */
+    if(H5Pget_file_space_strategy(fcpl_out, &out_strategy, &out_persist, &out_threshold) < 0) {
+        error_msg("failed to retrieve file space strategy & threshold\n");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pget_file_space failed");
+    }
+
+    /* Get file space page size for output file */
+    if(H5Pget_file_space_page_size(fcpl_out, &out_pagesize) < 0) {
+        error_msg("failed to retrieve file space page size\n");
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fget_create_plist failed");
+    }
+
+    /*
+     * If -S option is set, the file space handling strategy should be set as specified.
+     * If -S option is not set, the file space handling strategy should be
+     * the same as the input file's strategy.
+     */
+    if(options->fs_strategy) {
+        if(out_strategy != (options->fs_strategy == (-1) ? 0 : options->fs_strategy)) {
+            error_msg("file space strategy not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    } else {
+        if(out_strategy != in_strategy) {
+            error_msg("file space strategy not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    }
+
+    /*
+     * If the -P option is set, the free-space persist status should be set as specified.
+     * If the -P option is not set, the free-space persist status should be
+     * the same as the input file's free-space persist status
+     */
+    if(options->fs_persist) {
+        if(out_persist != (hbool_t)(options->fs_persist == (-1) ? FALSE : options->fs_persist)) {
+            error_msg("free-space persist status is not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    } else {
+        if(out_persist != in_persist) {
+            error_msg("free-space persist status is not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    }
+
+    /*
+     * If the -T option is set, the threshold size should be set as specified.
+     * If the -T option is not set, the threshold should be the same as the
+     * input file's threshold size.
+     */
+    if(options->fs_threshold) {
+        if(out_threshold != (hsize_t)(options->fs_threshold == (-1) ? 0 : options->fs_threshold)) {
+            error_msg("threshold is not set as unexpectec\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    } else {
+        if(out_threshold != in_threshold) {
+            error_msg("threshold is not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    }
+
+    /*
+     * If the -G option is set, the file space page size should be set as specified.
+     * If the -G option is not set, the file space page size should be
+     * the same as the input file's file space page size.
+     */
+    if(options->fs_pagesize) {
+        if(out_pagesize != (hsize_t)(options->fs_pagesize == (-1) ? 0 : options->fs_pagesize)) {
+            error_msg("file space page size is not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    } else { /* "-G" is not set */
+        if(out_pagesize != in_pagesize) {
+            error_msg("file space page size is not set as unexpected\n");
+            HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "file space strategy not set as unexpected");
+        }
+    }
+
+    /* Closing */
+    if (H5Pclose(fcpl_in) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    if (H5Pclose(fcpl_out) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+    if (H5Fclose(fidin) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fclose failed");
+    if (H5Fclose(fidout) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Fclose failed");
+
+    return ok;
+
+done:
+    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);
+    } H5E_END_TRY;
+
+    return ret_value;
+} /* h5repack_verify() */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: verify_layout
+ *
+ * Purpose: verify which layout is present in the property list DCPL_ID
+ *
+ *  H5D_COMPACT      = 0
+ *  H5D_CONTIGUOUS  = 1
+ *  H5D_CHUNKED    = 2
+ *
+ * Return: 1 has, 0 does not, -1 error
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 30, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int verify_layout(hid_t pid,
+                  pack_info_t *obj)
+{
+    hsize_t      chsize[64];     /* chunk size in elements */
+    H5D_layout_t layout;         /* layout */
+    int          nfilters;       /* number of filters */
+    int          rank;           /* rank */
+    int          i;              /* index */
+
+    /* check if we have filters in the input object */
+    if ((nfilters = H5Pget_nfilters(pid)) < 0)
+        return -1;
+
+    /* a non chunked layout was requested on a filtered object */
+    if (nfilters && obj->layout!=H5D_CHUNKED)
+        return 0;
+
+    /* get layout */
+    if ((layout = H5Pget_layout(pid)) < 0)
+        return -1;
+
+    if (obj->layout != layout)
+        return 0;
+
+    if (layout==H5D_CHUNKED)
+    {
+        if ((rank = H5Pget_chunk(pid,NELMTS(chsize),chsize/*out*/)) < 0)
+            return -1;
+        if (obj->chunk.rank != rank)
+            return 0;
+        for ( i=0; i<rank; i++)
+            if (chsize[i] != obj->chunk.chunk_lengths[i])
+                return 0;
+    }
+
+    return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5repack_cmp_pl
+ *
+ * Purpose: compare 2 files for identical property lists of all objects
+ *
+ * Return: 1=identical, 0=not identical, -1=error
+ *
+ * Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+ *
+ * Date: December 31, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int h5repack_cmp_pl(const char *fname1,
+                     const char *fname2)
+{
+    int           ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */
+    hid_t         fid1=-1;         /* file ID */
+    hid_t         fid2=-1;         /* file ID */
+    hid_t         dset1=-1;        /* dataset ID */
+    hid_t         dset2=-1;        /* dataset ID */
+    hid_t         gid=-1;          /* group ID */
+    hid_t         dcpl1=-1;        /* dataset creation property list ID */
+    hid_t         dcpl2=-1;        /* dataset creation property list ID */
+    hid_t         gcplid=-1;       /* group creation property list */
+    unsigned      crt_order_flag1; /* group creation order flag */
+    unsigned      crt_order_flag2; /* group creation order flag */
+    trav_table_t  *trav=NULL;
+    int           ret=1;
+    unsigned int  i;
+
+   /*-------------------------------------------------------------------------
+    * open the files
+    *-------------------------------------------------------------------------
+    */
+
+    /* disable error reporting */
+    H5E_BEGIN_TRY
+    {
+
+        /* Open the files */
+        if ((fid1 = H5Fopen(fname1,H5F_ACC_RDONLY,H5P_DEFAULT)) < 0 )
+        {
+            error_msg("<%s>: %s\n", fname1, H5FOPENERROR );
+            return -1;
+        }
+        if ((fid2 = H5Fopen(fname2,H5F_ACC_RDONLY,H5P_DEFAULT)) < 0 )
+        {
+            error_msg("<%s>: %s\n", fname2, H5FOPENERROR );
+            H5Fclose(fid1);
+            return -1;
+        }
+        /* enable error reporting */
+    } H5E_END_TRY;
+
+   /*-------------------------------------------------------------------------
+    * get file table list of objects
+    *-------------------------------------------------------------------------
+    */
+    trav_table_init(&trav);
+    if(h5trav_gettable(fid1, trav) < 0)
+        HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "h5trav_gettable failed");
+
+   /*-------------------------------------------------------------------------
+    * traverse the suppplied object list
+    *-------------------------------------------------------------------------
+    */
+    for(i = 0; i < trav->nobjs; i++)
+    {
+
+        if(trav->objs[i].type == H5TRAV_TYPE_GROUP)
+        {
+
+            if ((gid = H5Gopen2(fid1, trav->objs[i].name, H5P_DEFAULT)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+            if ((gcplid = H5Gget_create_plist(gid)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gget_create_plist failed");
+            if (H5Pget_link_creation_order(gcplid, &crt_order_flag1) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pget_link_creation_order failed");
+            if (H5Pclose(gcplid) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            if (H5Gclose(gid) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+
+            if ((gid = H5Gopen2(fid2, trav->objs[i].name, H5P_DEFAULT)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gopen2 failed");
+            if ((gcplid = H5Gget_create_plist(gid)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gget_create_plist failed");
+            if (H5Pget_link_creation_order(gcplid, &crt_order_flag2) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pget_link_creation_order failed");
+            if (H5Pclose(gcplid) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            if (H5Gclose(gid) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Gclose failed");
+
+            if (crt_order_flag1 != crt_order_flag2) {
+                error_msg("property lists for <%s> are different\n",trav->objs[i].name);
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "property lists failed");
+            }
+
+        }
+
+
+
+        else if(trav->objs[i].type == H5TRAV_TYPE_DATASET)
+        {
+            if((dset1 = H5Dopen2(fid1, trav->objs[i].name, H5P_DEFAULT)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+            if((dset2 = H5Dopen2(fid2, trav->objs[i].name, H5P_DEFAULT)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dopen2 failed");
+            if((dcpl1 = H5Dget_create_plist(dset1)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+            if((dcpl2 = H5Dget_create_plist(dset2)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_create_plist failed");
+
+           /*-------------------------------------------------------------------------
+            * compare the property lists
+            *-------------------------------------------------------------------------
+            */
+            if((ret = H5Pequal(dcpl1, dcpl2)) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pequal failed");
+
+            if(ret == 0) {
+                error_msg("property lists for <%s> are different\n",trav->objs[i].name);
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "property lists failed");
+            }
+
+           /*-------------------------------------------------------------------------
+            * close
+            *-------------------------------------------------------------------------
+            */
+            if(H5Pclose(dcpl1) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            if(H5Pclose(dcpl2) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Pclose failed");
+            if(H5Dclose(dset1) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+            if(H5Dclose(dset2) < 0)
+                HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dclose failed");
+        } /*if*/
+    } /*i*/
+
+   /*-------------------------------------------------------------------------
+    * free
+    *-------------------------------------------------------------------------
+    */
+
+    trav_table_free(trav);
+
+   /*-------------------------------------------------------------------------
+    * close
+    *-------------------------------------------------------------------------
+    */
+
+    H5Fclose(fid1);
+    H5Fclose(fid2);
+
+    return ret;
+
+/*-------------------------------------------------------------------------
+* error
+*-------------------------------------------------------------------------
+*/
+done:
+    H5E_BEGIN_TRY
+    {
+        H5Pclose(dcpl1);
+        H5Pclose(dcpl2);
+        H5Dclose(dset1);
+        H5Dclose(dset2);
+        H5Fclose(fid1);
+        H5Fclose(fid2);
+        H5Pclose(gcplid);
+        H5Gclose(gid);
+        trav_table_free(trav);
+    } H5E_END_TRY;
+
+    return ret_value;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: verify_filters
+ *
+ * Purpose: verify if all requested filters in the array FILTER obtained
+ *  from user input are present in the property list PID obtained from
+ *  the output file
+ *
+ * Return:
+ *  1 match
+ *  0 do not match
+ * -1 error
+ *
+ * Programmer: Pedro Vicente, pvn at hdfgroup.org
+ *
+ * Date: December 21, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter)
+{
+    int           nfilters_dcpl;  /* number of filters in DCPL*/
+    unsigned      filt_flags;     /* filter flags */
+    H5Z_filter_t  filtn;          /* filter identification number */
+    unsigned      cd_values[20];  /* filter client data values */
+    size_t        cd_nelmts;      /* filter client number of values */
+    char          f_name[256];    /* filter name */
+    size_t        size;           /* type size */
+    int           i;              /* index */
+    unsigned      j;              /* index */
+
+    /* get information about filters */
+    if((nfilters_dcpl = H5Pget_nfilters(pid)) < 0)
+        return -1;
+
+    /* if we do not have filters and the requested filter is NONE, return 1 */
+    if(!nfilters_dcpl &&
+        nfilters == 1 &&
+        filter[0].filtn == H5Z_FILTER_NONE )
+        return 1;
+
+    /* else the numbers of filters must match */
+    if (nfilters_dcpl != nfilters )
+        return 0;
+
+    /*-------------------------------------------------------------------------
+     * build a list with DCPL filters
+     *-------------------------------------------------------------------------
+     */
+
+    for( i = 0; i < nfilters_dcpl; i++)
+    {
+        cd_nelmts = NELMTS(cd_values);
+        filtn = H5Pget_filter2(pid, (unsigned)i, &filt_flags, &cd_nelmts,
+            cd_values, sizeof(f_name), f_name, NULL);
+
+        /* filter ID */
+        if (filtn != filter[i].filtn)
+            return 0;
+
+        /* compare client data values. some filters do return local values */
+        switch (filtn)
+        {
+
+            case H5Z_FILTER_NONE:
+        	break;
+
+            case H5Z_FILTER_SHUFFLE:
+                /* 1 private client value is returned by DCPL */
+                if ( cd_nelmts != H5Z_SHUFFLE_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SHUFFLE_USER_NPARMS )
+                    return 0;
+
+                /* get dataset's type size */
+                if((size = H5Tget_size(tid)) <= 0)
+                    return -1;
+
+                /* the private client value holds the dataset's type size */
+                if ( size != cd_values[0] )
+                    return 0;
+
+                break;
+
+            case H5Z_FILTER_SZIP:
+                /* 4 private client values are returned by DCPL */
+                if ( cd_nelmts != H5Z_SZIP_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SZIP_USER_NPARMS )
+                    return 0;
+
+                /* "User" parameter for pixels-per-block (index 1) */
+                if ( cd_values[H5Z_SZIP_PARM_PPB] != filter[i].cd_values[H5Z_SZIP_PARM_PPB] )
+                    return 0;
+
+                break;
+
+            case H5Z_FILTER_NBIT:
+                /* only client data values number of values checked */
+                if ( H5Z_NBIT_USER_NPARMS != filter[i].cd_nelmts)
+                    return 0;
+                break;
+
+            case H5Z_FILTER_SCALEOFFSET:
+                /* only client data values checked */
+                for( j = 0; j < H5Z_SCALEOFFSET_USER_NPARMS; j++)
+                    if (cd_values[j] != filter[i].cd_values[j])
+                        return 0;
+                break;
+
+            /* for these filters values must match, no local values set in DCPL */
+            case H5Z_FILTER_FLETCHER32:
+            case H5Z_FILTER_DEFLATE:
+
+                if ( cd_nelmts != filter[i].cd_nelmts)
+                    return 0;
+
+                for( j = 0; j < cd_nelmts; j++)
+                    if (cd_values[j] != filter[i].cd_values[j])
+                        return 0;
+
+                break;
+
+            default:
+                if ( cd_nelmts != filter[i].cd_nelmts)
+                    return 0;
+
+                for( j = 0; j < cd_nelmts; j++)
+                    if (cd_values[j] != filter[i].cd_values[j])
+                        return 0;
+                break;
+
+        } /* switch */
+    }
+
+    return 1;
+}
+
diff --git a/tools/src/h5stat/CMakeLists.txt b/tools/src/h5stat/CMakeLists.txt
new file mode 100644
index 0000000..9762dbb
--- /dev/null
+++ b/tools/src/h5stat/CMakeLists.txt
@@ -0,0 +1,54 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_H5STAT)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5stat executables
+# --------------------------------------------------------------------
+add_executable (h5stat ${HDF5_TOOLS_SRC_H5STAT_SOURCE_DIR}/h5stat.c)
+TARGET_NAMING (h5stat STATIC)
+TARGET_C_PROPERTIES (h5stat STATIC " " " ")
+target_link_libraries (h5stat  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5stat PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5stat")
+
+set (H5_DEP_EXECUTABLES h5stat)
+
+if (BUILD_SHARED_LIBS)
+  add_executable (h5stat-shared ${HDF5_TOOLS_SRC_H5STAT_SOURCE_DIR}/h5stat.c)
+  TARGET_NAMING (h5stat-shared SHARED)
+  TARGET_C_PROPERTIES (h5stat-shared SHARED " " " ")
+  target_link_libraries (h5stat-shared  ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (h5stat-shared PROPERTIES FOLDER tools)
+  set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5stat-shared")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} h5stat-shared)
+endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  if (BUILD_SHARED_LIBS)
+    INSTALL_PROGRAM_PDB (h5stat-shared ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  endif ()
+  INSTALL_PROGRAM_PDB (h5stat ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          ${H5_DEP_EXECUTABLES}
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/h5stat/Makefile.am b/tools/src/h5stat/Makefile.am
new file mode 100644
index 0000000..c228b48
--- /dev/null
+++ b/tools/src/h5stat/Makefile.am
@@ -0,0 +1,37 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# These are our main targets, the tools
+bin_PROGRAMS=h5stat
+bin_SCRIPTS=
+
+# Add h5stat specific linker flags here
+h5stat_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Tell automake to clean h5redeploy script
+CLEANFILES=
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/h5stat/Makefile.in b/tools/src/h5stat/Makefile.in
new file mode 100644
index 0000000..9336928
--- /dev/null
+++ b/tools/src/h5stat/Makefile.in
@@ -0,0 +1,1494 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5stat$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5stat_SOURCES = h5stat.c
+h5stat_OBJECTS = h5stat.$(OBJEXT)
+h5stat_LDADD = $(LDADD)
+h5stat_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 = 
+h5stat_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5stat_LDFLAGS) $(LDFLAGS) -o $@
+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; }; \
+  }
+SCRIPTS = $(bin_SCRIPTS)
+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 = h5stat.c
+DIST_SOURCES = h5stat.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__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 $(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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+bin_SCRIPTS = 
+
+# Add h5stat specific linker flags here
+h5stat_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Tell automake to clean h5redeploy script
+CLEANFILES = 
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/h5stat/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/h5stat/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):
+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
+
+h5stat$(EXEEXT): $(h5stat_OBJECTS) $(h5stat_DEPENDENCIES) $(EXTRA_h5stat_DEPENDENCIES) 
+	@rm -f h5stat$(EXEEXT)
+	$(AM_V_CCLD)$(h5stat_LINK) $(h5stat_OBJECTS) $(h5stat_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_SCRIPTS)'; 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 \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | 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; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5stat.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local
+installdirs:
+	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-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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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-binPROGRAMS 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-binSCRIPTS
+
+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 uninstall-binSCRIPTS
+
+.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 \
+	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-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 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
+# 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-dyn: $(DYN)
+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 dyn 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/src/h5stat/h5stat.c b/tools/src/h5stat/h5stat.c
new file mode 100644
index 0000000..6aee7a8
--- /dev/null
+++ b/tools/src/h5stat/h5stat.c
@@ -0,0 +1,1820 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "H5private.h"    /* Generic Functions      */
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5tools_ref.h"
+#include "h5trav.h"
+#include "hdf5.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5stat"
+
+/* Parameters to control statistics gathered */
+
+/* Default threshold for small groups/datasets/attributes */
+#define DEF_SIZE_SMALL_GROUPS       	10
+#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[] = {
+    "H5F_FSPACE_STRATEGY_FSM_AGGR",
+    "H5F_FSPACE_STRATEGY_PAGE",
+    "H5F_FSPACE_STRATEGY_AGGR",
+    "H5F_FSPACE_STRATEGY_NONE",
+    "unknown",
+    NULL
+};
+
+/* Datatype statistics for datasets */
+typedef struct dtype_info_t {
+    hid_t tid;                          /* ID of datatype */
+    unsigned long count;                /* Number of types found */
+    unsigned long named;                /* Number of types that are named */
+} dtype_info_t;
+
+typedef struct ohdr_info_t {
+    hsize_t total_size;                 /* Total size of object headers */
+    hsize_t free_size;                  /* Total free space in object headers */
+} ohdr_info_t;
+
+/* Info to pass to the iteration functions */
+typedef struct iter_t {
+    hid_t fid;                          /* File ID */
+    hsize_t filesize;      /* Size of the file */
+    unsigned long uniq_groups;          /* Number of unique groups */
+    unsigned long uniq_dsets;           /* Number of unique datasets */
+    unsigned long uniq_dtypes;          /* Number of unique named datatypes */
+    unsigned long uniq_links;           /* Number of unique links */
+    unsigned long uniq_others;          /* Number of other unique objects */
+
+    unsigned long max_links;            /* Maximum # of links to an object */
+    hsize_t max_fanout;                 /* Maximum fanout from a group */
+    unsigned long *num_small_groups;    /* Size of small groups tracked */
+    unsigned group_nbins;               /* Number of bins for group counts */
+    unsigned long *group_bins;          /* Pointer to array of bins for group counts */
+    ohdr_info_t group_ohdr_info;        /* Object header information for groups */
+
+    hsize_t  max_attrs;                 /* Maximum attributes from a group */
+    unsigned long *num_small_attrs;    	/* Size of small attributes tracked */
+    unsigned attr_nbins;                /* Number of bins for attribute counts */
+    unsigned long *attr_bins;           /* Pointer to array of bins for attribute counts */
+
+    unsigned max_dset_rank;             /* Maximum rank of dataset */
+    unsigned long dset_rank_count[H5S_MAX_RANK];   /* Number of datasets of each rank */
+    hsize_t max_dset_dims;              /* Maximum dimension size of dataset */
+    unsigned long *small_dset_dims;    /* Size of dimensions of small datasets tracked */
+    unsigned long dset_layouts[H5D_NLAYOUTS];           /* Type of storage for each dataset */
+    unsigned long dset_comptype[H5_NFILTERS_IMPL]; 	/* Number of currently implemented filters */
+    unsigned long dset_ntypes;          /* Number of diff. dataset datatypes found */
+    dtype_info_t *dset_type_info;       /* Pointer to dataset datatype information found */
+    unsigned dset_dim_nbins;            /* Number of bins for dataset dimensions */
+    unsigned long *dset_dim_bins;       /* Pointer to array of bins for dataset dimensions */
+    ohdr_info_t dset_ohdr_info;         /* Object header information for datasets */
+    hsize_t dset_storage_size;          /* Size of raw data for datasets */
+    hsize_t dset_external_storage_size; /* Size of raw data for datasets with external storage */
+    ohdr_info_t dtype_ohdr_info;        /* Object header information for datatypes */
+    hsize_t groups_btree_storage_size;  /* btree size for group */
+    hsize_t groups_heap_storage_size;   /* heap size for group */
+    hsize_t attrs_btree_storage_size;   /* btree size for attributes (1.8) */
+    hsize_t attrs_heap_storage_size;    /* fractal heap size for attributes (1.8) */
+    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_fspace_strategy_t fs_strategy;  /* File space management strategy */
+    hbool_t fs_persist;               	/* Free-space persist or not */
+    hsize_t fs_threshold;               /* Free-space section threshold */
+    hsize_t fsp_size;               	/* File space page size */
+    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 */
+    int           local;                /* Flag to indicate iteration over the object*/
+} iter_t;
+
+
+static int        display_all = TRUE;
+
+/* Enable the printing of selected statistics */
+static int        display_file = FALSE;     /* display file information */
+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 */
+static int        display_group_metadata = FALSE;   /* display file space info for groups' metadata */
+static int        display_dset_metadata = FALSE;    /* display file space info for datasets' metadata */
+
+static int        display_object = FALSE;  /* not implemented yet */
+
+/* Initialize threshold for small groups/datasets/attributes */
+static int	  sgroups_threshold = DEF_SIZE_SMALL_GROUPS;
+static int	  sdsets_threshold = DEF_SIZE_SMALL_DSETS;
+static int	  sattrs_threshold = DEF_SIZE_SMALL_ATTRS;
+
+/* a structure for handling the order command-line parameters come in */
+struct handler_t {
+    size_t obj_count;
+    char **obj;
+};
+
+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'},
+    {"hel", no_arg, 'h'},
+    {"he", no_arg, 'h'},
+    {"filemetadata", no_arg, 'F'},
+    {"filemetadat", no_arg, 'F'},
+    {"filemetada", no_arg, 'F'},
+    {"filemetad", no_arg, 'F'},
+    {"filemeta", no_arg, 'F'},
+    {"filemet", no_arg, 'F'},
+    {"fileme", no_arg, 'F'},
+    {"filem", no_arg, 'F'},
+    {"file", no_arg, 'f'},
+    {"fil", no_arg, 'f'},
+    {"fi", no_arg, 'f'},
+    {"groupmetadata", no_arg, 'G'},
+    {"groupmetadat", no_arg, 'G'},
+    {"groupmetada", no_arg, 'G'},
+    {"groupmetad", no_arg, 'G'},
+    {"groupmeta", no_arg, 'G'},
+    {"groupmet", no_arg, 'G'},
+    {"groupme", no_arg, 'G'},
+    {"groupm", no_arg, 'G'},
+    {"group", no_arg, 'g'},
+    {"grou", no_arg, 'g'},
+    {"gro", no_arg, 'g'},
+    {"gr", no_arg, 'g'},
+    { "links", require_arg, 'l' },
+    { "link", require_arg, 'l' },
+    { "lin", require_arg, 'l' },
+    { "li", require_arg, 'l' },
+    {"dsetmetadata", no_arg, 'D'},
+    {"dsetmetadat", no_arg, 'D'},
+    {"dsetmetada", no_arg, 'D'},
+    {"dsetmetad", no_arg, 'D'},
+    {"dsetmeta", no_arg, 'D'},
+    {"dsetmet", no_arg, 'D'},
+    {"dsetme", no_arg, 'D'},
+    {"dsetm", no_arg, 'D'},
+    {"dset", no_arg, 'd'},
+    {"dse", no_arg, 'd'},
+    {"ds", no_arg, 'd'},
+    {"dims", require_arg, 'm'},
+    {"dim", require_arg, 'm'},
+    {"di", require_arg, 'm'},
+    {"dtypemetadata", no_arg, 'T'},
+    {"dtypemetadat", no_arg, 'T'},
+    {"dtypemetada", no_arg, 'T'},
+    {"dtypemetad", no_arg, 'T'},
+    {"dtypemeta", no_arg, 'T'},
+    {"dtypemet", no_arg, 'T'},
+    {"dtypeme", no_arg, 'T'},
+    {"dtypem", no_arg, 'T'},
+    {"dtype", no_arg, 'T'},
+    {"dtyp", no_arg, 'T'},
+    {"dty", no_arg, 'T'},
+    {"dt", no_arg, 'T'},
+    { "object", require_arg, 'O' },
+    { "objec", require_arg, 'O' },
+    { "obje", require_arg, 'O' },
+    { "obj", require_arg, 'O' },
+    { "ob", require_arg, 'O' },
+    { "version", no_arg, 'V' },
+    { "versio", no_arg, 'V' },
+    { "versi", no_arg, 'V' },
+    { "vers", no_arg, 'V' },
+    { "ver", no_arg, 'V' },
+    { "ve", no_arg, 'V' },
+    { "attribute", no_arg, 'A' },
+    { "attribut", no_arg, 'A' },
+    { "attribu", no_arg, 'A' },
+    { "attrib", no_arg, 'A' },
+    { "attri", no_arg, 'A' },
+    { "attr", no_arg, 'A' },
+    { "att", no_arg, 'A' },
+    { "at", no_arg, 'A' },
+    { "numattrs", require_arg, 'a' },
+    { "numattr", require_arg, 'a' },
+    { "numatt", require_arg, 'a' },
+    { "numat", require_arg, 'a' },
+    { "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' },
+    { "summ", no_arg, 'S' },
+    { "sum", no_arg, 'S' },
+    { "su", no_arg, 'S' },
+    { NULL, 0, '\0' }
+};
+
+static void
+leave(int ret)
+{
+   h5tools_close();
+   HDexit(ret);
+}
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Compute the ceiling of log_10(x)
+ *
+ * Return: >0 on success, 0 on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static void usage(const char *prog)
+{
+     HDfflush(stdout);
+     HDfprintf(stdout, "Usage: %s [OPTIONS] file\n", prog);
+     HDfprintf(stdout, "\n");
+     HDfprintf(stdout, "      OPTIONS\n");
+     HDfprintf(stdout, "     -h, --help            Print a usage message and exit\n");
+     HDfprintf(stdout, "     -V, --version         Print version number and exit\n");
+     HDfprintf(stdout, "     -f, --file            Print file information\n");
+     HDfprintf(stdout, "     -F, --filemetadata    Print file space information for file's metadata\n");
+     HDfprintf(stdout, "     -g, --group           Print group information\n");
+     HDfprintf(stdout, "     -l N, --links=N       Set the threshold for the # of links when printing\n");
+     HDfprintf(stdout, "                           information for small groups.  N is an integer greater\n");
+     HDfprintf(stdout, "                           than 0.  The default threshold is 10.\n");
+     HDfprintf(stdout, "     -G, --groupmetadata   Print file space information for groups' metadata\n");
+     HDfprintf(stdout, "     -d, --dset            Print dataset information\n");
+     HDfprintf(stdout, "     -m N, --dims=N        Set the threshold for the dimension sizes when printing\n");
+     HDfprintf(stdout, "                           information for small datasets.  N is an integer greater\n");
+     HDfprintf(stdout, "                           than 0.  The default threshold is 10.\n");
+     HDfprintf(stdout, "     -D, --dsetmetadata    Print file space information for datasets' metadata\n");
+     HDfprintf(stdout, "     -T, --dtypemetadata   Print datasets' datatype information\n");
+     HDfprintf(stdout, "     -A, --attribute       Print attribute information\n");
+     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");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: ceil_log10
+ *
+ * Purpose: Compute the ceiling of log_10(x)
+ *
+ * Return: >0 on success, 0 on failure
+ *
+ * Programmer: Quincey Koziol
+ *              Monday, August 22, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+H5_ATTR_CONST static unsigned
+ceil_log10(unsigned long x)
+{
+    unsigned long pow10 = 1;
+    unsigned ret = 0;
+
+    while(x >= pow10) {
+        pow10 *= 10;
+        ret++;
+    } /* end while */
+
+    return ret;
+} /* ceil_log10() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: attribute_stats
+ *
+ * Purpose: Gather statistics about attributes on an object
+ *
+ * Return:  Success: 0
+ *
+ *          Failure: -1
+ *
+ * Programmer:    Quincey Koziol
+ *                Tuesday, July 17, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+attribute_stats(iter_t *iter, const H5O_info_t *oi)
+{
+    unsigned     bin;               /* "bin" the number of objects falls in */
+
+    /* Update dataset & attribute metadata info */
+    iter->attrs_btree_storage_size += oi->meta_size.attr.index_size;
+    iter->attrs_heap_storage_size += oi->meta_size.attr.heap_size;
+
+    /* Update small # of attribute count & limits */
+    if(oi->num_attrs <= (hsize_t)sattrs_threshold)
+        (iter->num_small_attrs[(size_t)oi->num_attrs])++;
+    if(oi->num_attrs > iter->max_attrs)
+        iter->max_attrs = oi->num_attrs;
+
+    /* Add attribute count to proper bin */
+    bin = ceil_log10((unsigned long)oi->num_attrs);
+    if((bin + 1) > iter->attr_nbins) {
+  iter->attr_bins = (unsigned long *)HDrealloc(iter->attr_bins, (bin + 1) * sizeof(unsigned long));
+        HDassert(iter->attr_bins);
+
+  /* Initialize counts for intermediate bins */
+        while(iter->attr_nbins < bin)
+      iter->attr_bins[iter->attr_nbins++] = 0;
+        iter->attr_nbins++;
+
+        /* Initialize count for new bin */
+        iter->attr_bins[bin] = 1;
+     } /* end if */
+     else
+         (iter->attr_bins[bin])++;
+
+     return 0;
+} /* end attribute_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: group_stats
+ *
+ * Purpose: Gather statistics about the group
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *             Tuesday, August 16, 2005
+ *
+ * Modifications: Refactored code from the walk_function
+ *                EIP, Wednesday, August 16, 2006
+ *
+ *      Vailin Choi 12 July 2007
+ *      1. Gathered storage info for btree and heap
+ *         (groups and attributes)
+ *      2. Gathered info for attributes
+ *
+ *      Vailin Choi 14 July 2007
+ *      Cast "num_objs" and "num_attrs" to size_t
+ *      Due to the -Mbounds problem for the pgi-32 bit compiler on indexing
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+group_stats(iter_t *iter, const char *name, const H5O_info_t *oi)
+{
+    H5G_info_t     ginfo;                  /* Group information */
+    unsigned     bin;                     /* "bin" the number of objects falls in */
+    herr_t     ret;
+
+    /* Gather statistics about this type of object */
+    iter->uniq_groups++;
+
+    /* Get object header information */
+    iter->group_ohdr_info.total_size += oi->hdr.space.total;
+    iter->group_ohdr_info.free_size += oi->hdr.space.free;
+
+    /* Get group information */
+    ret = H5Gget_info_by_name(iter->fid, name, &ginfo, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* Update link stats */
+    /* Collect statistics for small groups */
+    if(ginfo.nlinks < (hsize_t)sgroups_threshold)
+        (iter->num_small_groups[(size_t)ginfo.nlinks])++;
+    /* Determine maximum link count */
+    if(ginfo.nlinks > iter->max_fanout)
+        iter->max_fanout = ginfo.nlinks;
+
+    /* Add group count to proper bin */
+    bin = ceil_log10((unsigned long)ginfo.nlinks);
+    if((bin + 1) > iter->group_nbins) {
+        /* Allocate more storage for info about dataset's datatype */
+        iter->group_bins = (unsigned long *)HDrealloc(iter->group_bins, (bin + 1) * sizeof(unsigned long));
+        HDassert(iter->group_bins);
+
+  /* Initialize counts for intermediate bins */
+        while(iter->group_nbins < bin)
+            iter->group_bins[iter->group_nbins++] = 0;
+        iter->group_nbins++;
+
+        /* Initialize count for new bin */
+        iter->group_bins[bin] = 1;
+    } /* end if */
+    else
+        (iter->group_bins[bin])++;
+
+    /* Update group metadata info */
+    iter->groups_btree_storage_size += oi->meta_size.obj.index_size;
+    iter->groups_heap_storage_size += oi->meta_size.obj.heap_size;
+
+    /* Update attribute metadata info */
+    ret = attribute_stats(iter, oi);
+    HDassert(ret >= 0);
+
+    return 0;
+} /* end group_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: dataset_stats
+ *
+ * Purpose: Gather statistics about the dataset
+ *
+ * Return:  Success: 0
+ *
+ *          Failure: -1
+ *
+ * Programmer:    Quincey Koziol
+ *                Tuesday, August 16, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+dataset_stats(iter_t *iter, const char *name, const H5O_info_t *oi)
+{
+    unsigned     bin;               /* "bin" the number of objects falls in */
+    hid_t     did;               /* Dataset ID */
+    hid_t     sid;               /* Dataspace ID */
+    hid_t     tid;               /* Datatype ID */
+    hid_t     dcpl;              /* Dataset creation property list ID */
+    hsize_t     dims[H5S_MAX_RANK];/* Dimensions of dataset */
+    H5D_layout_t   lout;              /* Layout of dataset */
+    unsigned     type_found;        /* Whether the dataset's datatype was */
+                                         /* already found */
+    int     ndims;             /* Number of dimensions of dataset */
+    hsize_t     storage;           /* Size of dataset storage */
+    unsigned     u;                 /* Local index variable */
+    int     num_ext;           /* Number of external files for a dataset */
+    int     nfltr;             /* Number of filters for a dataset */
+    H5Z_filter_t  fltr;              /* Filter identifier */
+    herr_t     ret;
+
+    /* Gather statistics about this type of object */
+    iter->uniq_dsets++;
+
+    /* Get object header information */
+    iter->dset_ohdr_info.total_size += oi->hdr.space.total;
+    iter->dset_ohdr_info.free_size += oi->hdr.space.free;
+
+    did = H5Dopen2(iter->fid, name, H5P_DEFAULT);
+    HDassert(did > 0);
+
+    /* Update dataset metadata info */
+    iter->datasets_index_storage_size += oi->meta_size.obj.index_size;
+    iter->datasets_heap_storage_size += oi->meta_size.obj.heap_size;
+
+    /* Update attribute metadata info */
+    ret = attribute_stats(iter, oi);
+    HDassert(ret >= 0);
+
+    /* Get storage info */
+    storage = H5Dget_storage_size(did);
+
+    /* Gather layout statistics */
+    dcpl = H5Dget_create_plist(did);
+    HDassert(dcpl > 0);
+
+    lout = H5Pget_layout(dcpl);
+    HDassert(lout >= 0);
+
+    /* Object header's total size for H5D_COMPACT layout includes raw data size */
+    /* "storage" also includes H5D_COMPACT raw data size */
+    if(lout == H5D_COMPACT)
+        iter->dset_ohdr_info.total_size -= storage;
+
+    /* Track the layout type for dataset */
+    (iter->dset_layouts[lout])++;
+
+    /* Get the number of external files for the dataset */
+    num_ext = H5Pget_external_count(dcpl);
+    assert (num_ext >= 0);
+
+    /* Accumulate raw data size accordingly */
+    if(num_ext) {
+        iter->nexternal += (unsigned long)num_ext;
+        iter->dset_external_storage_size += (unsigned long)storage;
+    } else
+        iter->dset_storage_size += storage;
+
+    /* Gather dataspace statistics */
+    sid = H5Dget_space(did);
+    HDassert(sid > 0);
+
+    ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
+    HDassert(ndims >= 0);
+
+    /* Check for larger rank of dataset */
+    if((unsigned)ndims > iter->max_dset_rank)
+        iter->max_dset_rank = (unsigned)ndims;
+
+    /* Track the number of datasets with each rank */
+    (iter->dset_rank_count[ndims])++;
+
+    /* Only gather dim size statistics on 1-D datasets */
+    if(ndims == 1) {
+	/* Determine maximum dimension size */
+	if(dims[0] > iter->max_dset_dims)
+	    iter->max_dset_dims = dims[0];
+	/* Collect statistics for small datasets */
+       if(dims[0] < (hsize_t)sdsets_threshold)
+           (iter->small_dset_dims[(size_t)dims[0]])++;
+
+       /* Add dim count to proper bin */
+       bin = ceil_log10((unsigned long)dims[0]);
+       if((bin + 1) > iter->dset_dim_nbins) {
+          /* Allocate more storage for info about dataset's datatype */
+          iter->dset_dim_bins = (unsigned long *)HDrealloc(iter->dset_dim_bins, (bin + 1) * sizeof(unsigned long));
+          HDassert(iter->dset_dim_bins);
+
+          /* Initialize counts for intermediate bins */
+          while(iter->dset_dim_nbins < bin)
+              iter->dset_dim_bins[iter->dset_dim_nbins++] = 0;
+          iter->dset_dim_nbins++;
+
+          /* Initialize count for this bin */
+          iter->dset_dim_bins[bin] = 1;
+        } /* end if */
+        else
+            (iter->dset_dim_bins[bin])++;
+    } /* end if */
+
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /* Gather datatype statistics */
+    tid = H5Dget_type(did);
+    HDassert(tid > 0);
+
+    type_found = FALSE;
+    for(u = 0; u < iter->dset_ntypes; u++)
+        if(H5Tequal(iter->dset_type_info[u].tid, tid) > 0) {
+            type_found = TRUE;
+            break;
+        } /* end for */
+    if(type_found)
+         (iter->dset_type_info[u].count)++;
+    else {
+        unsigned curr_ntype = (unsigned)iter->dset_ntypes;
+
+        /* Increment # of datatypes seen for datasets */
+        iter->dset_ntypes++;
+
+        /* Allocate more storage for info about dataset's datatype */
+        iter->dset_type_info = (dtype_info_t *)HDrealloc(iter->dset_type_info, iter->dset_ntypes * sizeof(dtype_info_t));
+        HDassert(iter->dset_type_info);
+
+        /* Initialize information about datatype */
+        iter->dset_type_info[curr_ntype].tid = H5Tcopy(tid);
+        HDassert(iter->dset_type_info[curr_ntype].tid > 0);
+        iter->dset_type_info[curr_ntype].count = 1;
+        iter->dset_type_info[curr_ntype].named = 0;
+
+        /* Set index for later */
+        u = curr_ntype;
+    } /* end else */
+
+    /* Check if the datatype is a named datatype */
+    if(H5Tcommitted(tid) > 0)
+        (iter->dset_type_info[u].named)++;
+
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /* Track different filters */
+    if((nfltr = H5Pget_nfilters(dcpl)) >= 0) {
+       if(nfltr == 0)
+           iter->dset_comptype[0]++;
+        for(u = 0; u < (unsigned)nfltr; u++) {
+            fltr = H5Pget_filter2(dcpl, u, 0, 0, 0, 0, 0, NULL);
+            if(fltr >= 0) {
+                if(fltr < (H5_NFILTERS_IMPL - 1))
+                    iter->dset_comptype[fltr]++;
+                else
+                    iter->dset_comptype[H5_NFILTERS_IMPL - 1]++; /*other filters*/
+            } /* end if */
+        } /* end for */
+    } /* endif nfltr */
+
+     ret = H5Pclose(dcpl);
+     HDassert(ret >= 0);
+
+     ret = H5Dclose(did);
+     HDassert(ret >= 0);
+
+     return 0;
+}  /* end dataset_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: datatype_stats
+ *
+ * Purpose: Gather statistics about the datatype
+ *
+ * Return:  Success: 0
+ *          Failure: -1
+ *
+ * Programmer:    Vailin Choi; July 7th, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+datatype_stats(iter_t *iter, const H5O_info_t *oi)
+{
+    herr_t ret;
+
+    /* Gather statistics about this type of object */
+    iter->uniq_dtypes++;
+
+    /* Get object header information */
+    iter->dtype_ohdr_info.total_size += oi->hdr.space.total;
+    iter->dtype_ohdr_info.free_size += oi->hdr.space.free;
+
+    /* Update attribute metadata info */
+    ret = attribute_stats(iter, oi);
+    HDassert(ret >= 0);
+
+     return 0;
+}  /* end datatype_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: obj_stats
+ *
+ * Purpose: Gather statistics about an object
+ *
+ * Return: Success: 0
+ *       Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *             Tuesday, November 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+obj_stats(const char *path, const H5O_info_t *oi, const char *already_visited,
+    void *_iter)
+{
+    iter_t *iter = (iter_t *)_iter;
+
+    /* If the object has already been seen then just return */
+    if(NULL == already_visited) {
+        /* Gather some general statistics about the object */
+        if(oi->rc > iter->max_links)
+            iter->max_links = oi->rc;
+
+        switch(oi->type) {
+            case H5O_TYPE_GROUP:
+                group_stats(iter, path, oi);
+                break;
+
+            case H5O_TYPE_DATASET:
+                dataset_stats(iter, path, oi);
+                break;
+
+            case H5O_TYPE_NAMED_DATATYPE:
+                datatype_stats(iter, oi);
+                break;
+
+            case H5O_TYPE_UNKNOWN:
+            case H5O_TYPE_NTYPES:
+            default:
+                /* Gather statistics about this type of object */
+                iter->uniq_others++;
+                break;
+        } /* end switch */
+    } /* end if */
+
+    return 0;
+} /* end obj_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: lnk_stats
+ *
+ * Purpose: Gather statistics about a link
+ *
+ * Return: Success: 0
+ *
+ *  Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ *             Tuesday, November 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+lnk_stats(const char H5_ATTR_UNUSED *path, const H5L_info_t *li, void *_iter)
+{
+    iter_t *iter = (iter_t *)_iter;
+
+    switch(li->type) {
+        case H5L_TYPE_SOFT:
+        case H5L_TYPE_EXTERNAL:
+            /* Gather statistics about links and UD links */
+            iter->uniq_links++;
+            break;
+
+        case H5L_TYPE_HARD:
+        case H5L_TYPE_MAX:
+        case H5L_TYPE_ERROR:
+        default:
+            /* Gather statistics about this type of object */
+            iter->uniq_others++;
+            break;
+    } /* end switch() */
+
+    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
+ *
+ * Purpose: Free handler structure
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+hand_free(struct handler_t *hand)
+{
+    if(hand) {
+        unsigned u;
+
+        for(u = 0; u < hand->obj_count; u++)
+            if(hand->obj[u]) {
+                HDfree(hand->obj[u]);
+                hand->obj[u] = NULL;
+            } /* end if */
+        hand->obj_count = 0;
+        HDfree(hand->obj);
+        HDfree(hand);
+    } /* end if */
+} /* end hand_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: Parses command line and sets up global variable to control output
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_command_line(int argc, const char *argv[], struct handler_t **hand_ret)
+{
+    int                opt;
+    unsigned           u;
+    struct handler_t   *hand = NULL;
+
+    /* 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 done;
+                break;
+
+            case 'V':
+                print_version(h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                goto done;
+                break;
+
+            case 'F':
+                display_all = FALSE;
+                display_file_metadata = TRUE;
+                break;
+
+            case 'f':
+                display_all = FALSE;
+                display_file = TRUE;
+                break;
+
+            case 'G':
+                display_all = FALSE;
+                display_group_metadata = TRUE;
+                break;
+
+            case 'g':
+                display_all = FALSE;
+                display_group = TRUE;
+                break;
+
+            case 'l':
+		if(opt_arg) {
+		    sgroups_threshold = HDatoi(opt_arg);
+		    if(sgroups_threshold < 1) {
+			error_msg("Invalid threshold for small groups\n");
+			goto error;
+		    }
+		} else
+		    error_msg("Missing threshold for small groups\n");
+
+                break;
+
+            case 'D':
+                display_all = FALSE;
+                display_dset_metadata = TRUE;
+                break;
+
+            case 'd':
+                display_all = FALSE;
+                display_dset = TRUE;
+                break;
+
+            case 'm':
+		if(opt_arg) {
+		    sdsets_threshold = HDatoi(opt_arg);
+		    if(sdsets_threshold < 1) {
+			error_msg("Invalid threshold for small datasets\n");
+			goto error;
+		    }
+		} else
+		    error_msg("Missing threshold for small datasets\n");
+
+                break;
+
+            case 'T':
+                display_all = FALSE;
+                display_dset_dtype_meta = TRUE;
+                break;
+
+            case 'A':
+                display_all = FALSE;
+                display_attr = TRUE;
+                break;
+
+            case 'a':
+		if(opt_arg) {
+		    sattrs_threshold = HDatoi(opt_arg);
+		    if(sattrs_threshold < 1) {
+			error_msg("Invalid threshold for small # of attributes\n");
+			goto error;
+		    }
+		} else
+                    error_msg("Missing threshold for small # of attributes\n");
+
+                break;
+
+            case 's':
+                display_all = FALSE;
+                display_free_sections = TRUE;
+                break;
+
+            case 'S':
+                display_all = FALSE;
+                display_summary = TRUE;
+                break;
+
+            case 'O':
+                display_all = FALSE;
+                display_object = TRUE;
+
+                /* Allocate space to hold the command line info */
+                if(NULL == (hand = (struct handler_t *)HDcalloc((size_t)1, sizeof(struct handler_t)))) {
+                    error_msg("unable to allocate memory for object struct\n");
+                    goto error;
+                } /* end if */
+
+                /* Allocate space to hold the object strings */
+                hand->obj_count = (size_t)argc;
+                if(NULL == (hand->obj = (char **)HDcalloc((size_t)argc, sizeof(char *)))) {
+                    error_msg("unable to allocate memory for object array\n");
+                    goto error;
+                } /* end if */
+
+                /* Store object names */
+                for(u = 0; u < hand->obj_count; u++)
+                    if(NULL == (hand->obj[u] = HDstrdup(opt_arg))) {
+                        error_msg("unable to allocate memory for object name\n");
+                        goto error;
+                    } /* end if */
+                break;
+
+            default:
+                usage(h5tools_getprogname());
+                goto error;
+        } /* end switch */
+    } /* end while */
+
+    /* check for file name to be processed */
+    if(argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        goto error;
+    } /* end if */
+
+    /* Set handler structure */
+    *hand_ret = hand;
+
+done:
+    return 0;
+
+error:
+    hand_free(hand);
+    h5tools_setstatus(EXIT_FAILURE);
+
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function: iter_free
+ *
+ * Purpose: Free iter structure
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+iter_free(iter_t *iter)
+{
+
+    /* Clear array of bins for group counts */
+    if(iter->group_bins) {
+        HDfree(iter->group_bins);
+        iter->group_bins = NULL;
+    } /* end if */
+
+    /* Clear array for tracking small groups */
+    if(iter->num_small_groups) {
+        HDfree(iter->num_small_groups);
+        iter->num_small_groups = NULL;
+    } /* end if */
+
+    /* Clear array of bins for attribute counts */
+    if(iter->attr_bins) {
+        HDfree(iter->attr_bins);
+        iter->attr_bins = NULL;
+    } /* end if */
+
+    /* Clear array for tracking small attributes */
+    if(iter->num_small_attrs) {
+        HDfree(iter->num_small_attrs);
+        iter->num_small_attrs= NULL;
+    } /* end if */
+
+    /* Clear dataset datatype information found */
+    if(iter->dset_type_info) {
+        HDfree(iter->dset_type_info);
+        iter->dset_type_info = NULL;
+    } /* end if */
+
+    /* Clear array of bins for dataset dimensions */
+    if(iter->dset_dim_bins) {
+        HDfree(iter->dset_dim_bins);
+        iter->dset_dim_bins = NULL;
+    } /* end if */
+
+    /* Clear array of tracking 1-D small datasets */
+    if(iter->small_dset_dims) {
+        HDfree(iter->small_dset_dims);
+        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() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_file_info
+ *
+ * Purpose: Prints information about file
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_file_info(const iter_t *iter)
+{
+    printf("File information\n");
+    printf("\t# of unique groups: %lu\n", iter->uniq_groups);
+    printf("\t# of unique datasets: %lu\n", iter->uniq_dsets);
+    printf("\t# of unique named datatypes: %lu\n", iter->uniq_dtypes);
+    printf("\t# of unique links: %lu\n", iter->uniq_links);
+    printf("\t# of unique other: %lu\n", iter->uniq_others);
+    printf("\tMax. # of links to object: %lu\n", iter->max_links);
+    HDfprintf(stdout, "\tMax. # of objects in group: %Hu\n", iter->max_fanout);
+
+    return 0;
+} /* print_file_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_file_metadata
+ *
+ * Purpose: Prints file space information for file's metadata
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+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);
+
+    HDfprintf(stdout, "\tObject headers: (total/unused)\n");
+    HDfprintf(stdout, "\t\tGroups: %Hu/%Hu\n",
+                iter->group_ohdr_info.total_size,
+    iter->group_ohdr_info.free_size);
+    HDfprintf(stdout, "\t\tDatasets(exclude compact data): %Hu/%Hu\n",
+    iter->dset_ohdr_info.total_size,
+    iter->dset_ohdr_info.free_size);
+    HDfprintf(stdout, "\t\tDatatypes: %Hu/%Hu\n",
+                iter->dtype_ohdr_info.total_size,
+    iter->dtype_ohdr_info.free_size);
+
+    HDfprintf(stdout, "\tGroups:\n");
+    HDfprintf(stdout, "\t\tB-tree/List: %Hu\n", iter->groups_btree_storage_size);
+    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->groups_heap_storage_size);
+
+    HDfprintf(stdout, "\tAttributes:\n");
+    HDfprintf(stdout, "\t\tB-tree/List: %Hu\n", iter->attrs_btree_storage_size);
+    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->attrs_heap_storage_size);
+
+    HDfprintf(stdout, "\tChunked datasets:\n");
+    HDfprintf(stdout, "\t\tIndex: %Hu\n", iter->datasets_index_storage_size);
+
+    HDfprintf(stdout, "\tDatasets:\n");
+    HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->datasets_heap_storage_size);
+
+    HDfprintf(stdout, "\tShared Messages:\n");
+    HDfprintf(stdout, "\t\tHeader: %Hu\n", iter->SM_hdr_storage_size);
+    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() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_group_info
+ *
+ * Purpose: Prints information about groups in the file
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ * Modifications:
+ *  bug #1253; Oct 6th 2008; Vailin Choi
+ *  Fixed segmentation fault: print iter->group_bins[0] when
+ *  there is iter->group_nbins
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_group_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 */
+
+    printf("Small groups (with 0 to %u links):\n", sgroups_threshold-1);
+    total = 0;
+    for(u = 0; u < (unsigned)sgroups_threshold; u++) {
+        if(iter->num_small_groups[u] > 0) {
+            printf("\t# of groups with %u link(s): %lu\n", u, iter->num_small_groups[u]);
+            total += iter->num_small_groups[u];
+        } /* end if */
+    } /* end for */
+    printf("\tTotal # of small groups: %lu\n", total);
+
+    printf("Group bins:\n");
+    total = 0;
+    if((iter->group_nbins > 0) && (iter->group_bins[0] > 0)) {
+       printf("\t# of groups with 0 link: %lu\n", iter->group_bins[0]);
+       total = iter->group_bins[0];
+    } /* end if */
+    power = 1;
+    for(u = 1; u < iter->group_nbins; u++) {
+        if(iter->group_bins[u] > 0) {
+           printf("\t# of groups with %lu - %lu links: %lu\n", power, (power * 10) - 1,
+                    iter->group_bins[u]);
+           total += iter->group_bins[u];
+        } /* end if */
+        power *= 10;
+    } /* end for */
+    printf("\tTotal # of groups: %lu\n", total);
+
+    return 0;
+} /* print_group_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_group_metadata
+ *
+ * Purpose: Prints file space information for groups' metadata
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Vailin Choi; October 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_group_metadata(const iter_t *iter)
+{
+    printf("File space information for groups' metadata (in bytes):\n");
+
+    HDfprintf(stdout, "\tObject headers (total/unused): %Hu/%Hu\n",
+            iter->group_ohdr_info.total_size, iter->group_ohdr_info.free_size);
+
+    HDfprintf(stdout, "\tB-tree/List: %Hu\n", iter->groups_btree_storage_size);
+    HDfprintf(stdout, "\tHeap: %Hu\n", iter->groups_heap_storage_size);
+
+    return 0;
+} /* print_group_metadata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_dataset_info
+ *
+ * Purpose: Prints information about datasets in the file
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_dataset_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 */
+
+    if(iter->uniq_dsets > 0) {
+        printf("Dataset dimension information:\n");
+        printf("\tMax. rank of datasets: %u\n", iter->max_dset_rank);
+        printf("\tDataset ranks:\n");
+        for(u = 0; u < H5S_MAX_RANK; u++)
+            if(iter->dset_rank_count[u] > 0)
+                printf("\t\t# of dataset with rank %u: %lu\n", u, iter->dset_rank_count[u]);
+
+        printf("1-D Dataset information:\n");
+        HDfprintf(stdout, "\tMax. dimension size of 1-D datasets: %Hu\n", iter->max_dset_dims);
+        printf("\tSmall 1-D datasets (with dimension sizes 0 to %u):\n", sdsets_threshold - 1);
+        total = 0;
+        for(u = 0; u < (unsigned)sdsets_threshold; u++) {
+            if(iter->small_dset_dims[u] > 0) {
+                printf("\t\t# of datasets with dimension sizes %u: %lu\n", u,
+                         iter->small_dset_dims[u]);
+                total += iter->small_dset_dims[u];
+            } /* end if */
+        } /* end for */
+        printf("\t\tTotal # of small datasets: %lu\n", total);
+
+        /* Protect against no datasets in file */
+        if(iter->dset_dim_nbins > 0) {
+            printf("\t1-D Dataset dimension bins:\n");
+            total = 0;
+            if(iter->dset_dim_bins[0] > 0) {
+                printf("\t\t# of datasets with dimension size 0: %lu\n", iter->dset_dim_bins[0]);
+                total = iter->dset_dim_bins[0];
+            } /* end if */
+            power = 1;
+            for(u = 1; u < iter->dset_dim_nbins; u++) {
+                if(iter->dset_dim_bins[u] > 0) {
+                    printf("\t\t# of datasets with dimension size %lu - %lu: %lu\n", power, (power * 10) - 1,
+                             iter->dset_dim_bins[u]);
+                    total += iter->dset_dim_bins[u];
+                } /* end if */
+                power *= 10;
+            } /* end for */
+            printf("\t\tTotal # of datasets: %lu\n", total);
+        } /* end if */
+
+        printf("Dataset storage information:\n");
+        HDfprintf(stdout, "\tTotal raw data size: %Hu\n", iter->dset_storage_size);
+        HDfprintf(stdout, "\tTotal external raw data size: %Hu\n", iter->dset_external_storage_size);
+
+        printf("Dataset layout information:\n");
+        for(u = 0; u < H5D_NLAYOUTS; 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");
+        printf("\tNumber of datasets with:\n");
+        printf("\t\tNO filter: %lu\n", iter->dset_comptype[H5Z_FILTER_ERROR+1]);
+        printf("\t\tGZIP filter: %lu\n", iter->dset_comptype[H5Z_FILTER_DEFLATE]);
+        printf("\t\tSHUFFLE filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SHUFFLE]);
+        printf("\t\tFLETCHER32 filter: %lu\n", iter->dset_comptype[H5Z_FILTER_FLETCHER32]);
+        printf("\t\tSZIP filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SZIP]);
+        printf("\t\tNBIT filter: %lu\n", iter->dset_comptype[H5Z_FILTER_NBIT]);
+        printf("\t\tSCALEOFFSET filter: %lu\n", iter->dset_comptype[H5Z_FILTER_SCALEOFFSET]);
+        printf("\t\tUSER-DEFINED filter: %lu\n", iter->dset_comptype[H5_NFILTERS_IMPL-1]);
+    } /* end if */
+
+    return 0;
+} /* print_dataset_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_dataset_metadata
+ *
+ * Purpose: Prints file space information for datasets' metadata
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer:  Vailin Choi; October 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_dset_metadata(const iter_t *iter)
+{
+    printf("File space information for datasets' metadata (in bytes):\n");
+
+    HDfprintf(stdout, "\tObject headers (total/unused): %Hu/%Hu\n",
+            iter->dset_ohdr_info.total_size, iter->dset_ohdr_info.free_size);
+
+    HDfprintf(stdout, "\tIndex for Chunked datasets: %Hu\n",
+            iter->datasets_index_storage_size);
+    HDfprintf(stdout, "\tHeap: %Hu\n", iter->datasets_heap_storage_size);
+
+    return 0;
+} /* print_dset_metadata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_dset_dtype_meta
+ *
+ * Purpose: Prints datasets' datatype information
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Vailin Choi; October 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_dset_dtype_meta(const iter_t *iter)
+{
+    unsigned long total;        /* Total count for various statistics */
+    size_t   dtype_size;        /* Size of encoded datatype */
+    unsigned u;                 /* Local index variable */
+
+    if(iter->dset_ntypes) {
+        printf("Dataset datatype information:\n");
+        printf("\t# of unique datatypes used by datasets: %lu\n", iter->dset_ntypes);
+        total = 0;
+        for(u = 0; u < iter->dset_ntypes; u++) {
+            H5Tencode(iter->dset_type_info[u].tid, NULL, &dtype_size);
+            printf("\tDataset datatype #%u:\n", u);
+            printf("\t\tCount (total/named) = (%lu/%lu)\n",
+                    iter->dset_type_info[u].count, iter->dset_type_info[u].named);
+            printf("\t\tSize (desc./elmt) = (%lu/%lu)\n", (unsigned long)dtype_size,
+                    (unsigned long)H5Tget_size(iter->dset_type_info[u].tid));
+            H5Tclose(iter->dset_type_info[u].tid);
+            total += iter->dset_type_info[u].count;
+        } /* end for */
+        printf("\tTotal dataset datatype count: %lu\n", total);
+    } /* end if */
+
+    return 0;
+} /* print_dset_dtype_meta() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_attr_info
+ *
+ * Purpose: Prints information about attributes in the file
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Vailin Choi
+ *             July 12, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_attr_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 */
+
+    printf("Small # of attributes (objects with 1 to %u attributes):\n", sattrs_threshold);
+    total = 0;
+    for(u = 1; u <= (unsigned)sattrs_threshold; u++) {
+        if(iter->num_small_attrs[u] > 0) {
+            printf("\t# of objects with %u attributes: %lu\n", u, iter->num_small_attrs[u]);
+            total += iter->num_small_attrs[u];
+        } /* end if */
+    } /* end for */
+    printf("\tTotal # of objects with small # of attributes: %lu\n", total);
+
+    printf("Attribute bins:\n");
+    total = 0;
+    power = 1;
+    for(u = 1; u < iter->attr_nbins; u++) {
+        if(iter->attr_bins[u] > 0) {
+           printf("\t# of objects with %lu - %lu attributes: %lu\n", power, (power * 10) - 1,
+                    iter->attr_bins[u]);
+           total += iter->attr_bins[u];
+        } /* end if */
+        power *= 10;
+    } /* end for */
+    printf("\tTotal # of objects with attributes: %lu\n", total);
+    printf("\tMax. # of attributes to objects: %lu\n", (unsigned long)iter->max_attrs);
+
+    return 0;
+} /* print_attr_info() */
+
+

+/*-------------------------------------------------------------------------
+ * 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 persist: %s\n", iter->fs_persist ? "TRUE" : "FALSE");
+    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
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Vailin Choi; August 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+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]);
+    HDfprintf(stdout, "File space page size: %Hu bytes\n", iter->fsp_size);
+    printf("Summary of file space information:\n");
+    total_meta =
+            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 +
+            iter->groups_btree_storage_size +
+            iter->groups_heap_storage_size +
+            iter->attrs_btree_storage_size +
+            iter->attrs_heap_storage_size +
+            iter->datasets_index_storage_size +
+            iter->datasets_heap_storage_size +
+            iter->SM_hdr_storage_size +
+            iter->SM_index_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);
+
+    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 + iter->free_space);
+        HDfprintf(stdout, "  Unaccounted space: %Hu bytes\n", 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);
+
+    return 0;
+} /* print_storage_summary() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_file_statistics
+ *
+ * Purpose: Prints file statistics
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Saturday, August 12, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_file_statistics(const iter_t *iter)
+{
+    if(display_all) {
+        display_file = TRUE;
+        display_group = TRUE;
+        display_dset = TRUE;
+        display_dset_dtype_meta = TRUE;
+        display_attr = TRUE;
+        display_free_sections = TRUE;
+        display_summary = TRUE;
+
+        display_file_metadata = TRUE;
+        display_group_metadata = TRUE;
+        display_dset_metadata = TRUE;
+    }
+
+    if(display_file)            print_file_info(iter);
+    if(display_file_metadata)   print_file_metadata(iter);
+
+    if(display_group)           print_group_info(iter);
+    if(!display_all && display_group_metadata)   print_group_metadata(iter);
+
+    if(display_dset)            print_dataset_info(iter);
+    if(display_dset_dtype_meta) print_dset_dtype_meta(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() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_object_statistics
+ *
+ * Purpose: Prints object statistics
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Thursday, August 17, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_object_statistics(const char *name)
+{
+    printf("Object name %s\n", name);
+} /* print_object_statistics() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: print_statistics
+ *
+ * Purpose: Prints statistics
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Elena Pourmal
+ *             Thursday, August 17, 2006
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_statistics(const char *name, const iter_t *iter)
+{
+    if(display_object)
+        print_object_statistics(name);
+    else
+        print_file_statistics(iter);
+} /* print_statistics() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Modifications:
+ *      2/2010; Vailin Choi
+ *      Get the size of user block
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    iter_t              iter;
+    const char         *fname = NULL;
+    hid_t               fid = -1;
+    struct handler_t   *hand = NULL;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Disable error reporting */
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+    
+    HDmemset(&iter, 0, sizeof(iter));
+
+    if(parse_command_line(argc, argv, &hand) < 0)
+        goto done;
+
+    fname = argv[opt_ind];
+
+    /* Check for filename given */
+    if(fname) {
+        hid_t               fcpl;
+        H5F_info2_t         finfo;
+
+        printf("Filename: %s\n", fname);
+
+        fid = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);
+        if(fid < 0) {
+            error_msg("unable to open file \"%s\"\n", fname);
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        } /* end if */
+
+        /* Initialize iter structure */
+        iter.fid = fid;
+
+        if(H5Fget_filesize(fid, &iter.filesize) < 0)
+            warn_msg("Unable to retrieve file size\n");
+        HDassert(iter.filesize != 0);
+
+        /* Get storge info for file-level structures */
+        if(H5Fget_info2(fid, &finfo) < 0)
+            warn_msg("Unable to retrieve file info\n");
+        else {
+            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));
+	iter.num_small_attrs = (unsigned long *)HDcalloc((size_t)(sattrs_threshold+1), sizeof(unsigned long));
+	iter.small_dset_dims = (unsigned long *)HDcalloc((size_t)sdsets_threshold, sizeof(unsigned long));
+
+	if(iter.num_small_groups == NULL || iter.num_small_attrs == NULL || iter.small_dset_dims == NULL) {
+	    error_msg("Unable to allocate memory for tracking small groups/datasets/attributes\n");
+            h5tools_setstatus(EXIT_FAILURE);
+	    goto done;
+	}
+
+        if((fcpl = H5Fget_create_plist(fid)) < 0)
+            warn_msg("Unable to retrieve file creation property\n");
+
+        if(H5Pget_userblock(fcpl, &iter.ublk_size) < 0)
+            warn_msg("Unable to retrieve userblock size\n");
+
+        if(H5Pget_file_space_strategy(fcpl, &iter.fs_strategy, &iter.fs_persist, &iter.fs_threshold) < 0)
+            warn_msg("Unable to retrieve file space information\n");
+        HDassert(iter.fs_strategy >= 0 && iter.fs_strategy < H5F_FSPACE_STRATEGY_NTYPES);
+
+        if(H5Pget_file_space_page_size(fcpl, &iter.fsp_size) < 0)
+            warn_msg("Unable to retrieve file space page size\n");
+
+        /* 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;
+
+            for(u = 0; u < hand->obj_count; u++) {
+                if(h5trav_visit(fid, hand->obj[u], TRUE, TRUE, obj_stats, lnk_stats, &iter) < 0)
+                    warn_msg("Unable to traverse object \"%s\"\n", hand->obj[u]);
+                else
+                    print_statistics(hand->obj[u], &iter);
+            } /* end for */
+        } /* end if */
+        else {
+            if(h5trav_visit(fid, "/", TRUE, TRUE, obj_stats, lnk_stats, &iter) < 0)
+                warn_msg("Unable to traverse objects/links in file \"%s\"\n", fname);
+            else
+                print_statistics("/", &iter);
+        } /* end else */
+    } /* end if */
+
+done:
+    hand_free(hand);
+
+    /* Free iter structure */
+    iter_free(&iter);
+
+    if(fid >= 0 && H5Fclose(fid) < 0) {
+        error_msg("unable to close file \"%s\"\n", fname);
+        h5tools_setstatus(EXIT_FAILURE);
+    } /* end if */
+
+    leave(h5tools_getstatus());
+} /* end main() */
+
diff --git a/tools/src/misc/CMakeLists.txt b/tools/src/misc/CMakeLists.txt
new file mode 100644
index 0000000..1292628
--- /dev/null
+++ b/tools/src/misc/CMakeLists.txt
@@ -0,0 +1,76 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_SRC_MISC)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the misc executables
+# --------------------------------------------------------------------
+#-- Misc Executables
+add_executable (h5debug ${HDF5_TOOLS_SRC_MISC_SOURCE_DIR}/h5debug.c)
+TARGET_NAMING (h5debug STATIC)
+TARGET_C_PROPERTIES (h5debug STATIC " " " ")
+target_link_libraries (h5debug ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (h5debug PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5debug")
+
+add_executable (h5repart ${HDF5_TOOLS_SRC_MISC_SOURCE_DIR}/h5repart.c)
+TARGET_NAMING (h5repart STATIC)
+TARGET_C_PROPERTIES (h5repart STATIC " " " ")
+target_link_libraries (h5repart ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (h5repart PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5repart")
+
+add_executable (h5mkgrp ${HDF5_TOOLS_SRC_MISC_SOURCE_DIR}/h5mkgrp.c)
+TARGET_NAMING (h5mkgrp STATIC)
+TARGET_C_PROPERTIES (h5mkgrp STATIC " " " ")
+target_link_libraries (h5mkgrp  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5mkgrp PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5mkgrp")
+
+add_executable (h5clear ${HDF5_TOOLS_SRC_MISC_SOURCE_DIR}/h5clear.c)
+TARGET_NAMING (h5clear STATIC)
+TARGET_C_PROPERTIES (h5clear STATIC " " " ")
+target_link_libraries (h5clear  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (h5clear PROPERTIES FOLDER tools)
+set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h5clear")
+
+set (H5_DEP_EXECUTABLES
+    h5debug
+    h5repart
+    h5mkgrp
+    h5clear
+)
+
+#-----------------------------------------------------------------------------
+# Generate the h5cc file containing settings needed to compile programs
+#-----------------------------------------------------------------------------
+#if (NOT WIN32)
+#  configure_file (${HDF5_TOOLS_SRC_MISC_SOURCE_DIR}/h5cc.in ${HDF5_BINARY_DIR}/h5cc @ONLY)
+#endif ()
+
+##############################################################################
+##############################################################################
+###           I N S T A L L A T I O N                                      ###
+##############################################################################
+##############################################################################
+
+#-----------------------------------------------------------------------------
+# Rules for Installation of tools using make Install target
+#-----------------------------------------------------------------------------
+if (HDF5_EXPORTED_TARGETS)
+  INSTALL_PROGRAM_PDB (h5debug ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  INSTALL_PROGRAM_PDB (h5repart ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+  INSTALL_PROGRAM_PDB (h5mkgrp ${HDF5_INSTALL_BIN_DIR} toolsapplications)
+
+  install (
+      TARGETS
+          h5debug h5repart h5mkgrp
+      EXPORT
+          ${HDF5_EXPORTED_TARGETS}
+      RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT toolsapplications
+  )
+endif ()
diff --git a/tools/src/misc/Makefile.am b/tools/src/misc/Makefile.am
new file mode 100644
index 0000000..64c5ee5
--- /dev/null
+++ b/tools/src/misc/Makefile.am
@@ -0,0 +1,60 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# These are our main targets, the tools
+bin_PROGRAMS=h5debug h5repart h5mkgrp h5clear
+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
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# h5cc needs custom install and uninstall rules, since it may be
+# named h5pcc if hdf5 is being built in parallel mode.
+if BUILD_PARALLEL_CONDITIONAL
+  H5CC_NAME=h5pcc
+else
+  H5CC_NAME=h5cc
+endif
+
+install-exec-local:
+	@$(INSTALL) h5cc $(DESTDIR)$(bindir)/$(H5CC_NAME)
+uninstall-local:
+	@$(RM) $(DESTDIR)$(bindir)/$(H5CC_NAME)
+
+# How to build h5redeploy script
+h5redeploy: h5redeploy.in
+	@cp $(srcdir)/$@.in $@
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/src/misc/Makefile.in b/tools/src/misc/Makefile.in
new file mode 100644
index 0000000..3d65266
--- /dev/null
+++ b/tools/src/misc/Makefile.in
@@ -0,0 +1,1558 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = h5debug$(EXEEXT) h5repart$(EXEEXT) h5mkgrp$(EXEEXT) \
+	h5clear$(EXEEXT)
+TESTS =
+subdir = tools/src/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5cc
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+h5clear_SOURCES = h5clear.c
+h5clear_OBJECTS = h5clear.$(OBJEXT)
+h5clear_LDADD = $(LDADD)
+h5clear_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_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5clear_LDFLAGS) $(LDFLAGS) -o $@
+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 $@
+h5mkgrp_SOURCES = h5mkgrp.c
+h5mkgrp_OBJECTS = h5mkgrp.$(OBJEXT)
+h5mkgrp_LDADD = $(LDADD)
+h5mkgrp_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5mkgrp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5mkgrp_LDFLAGS) $(LDFLAGS) -o $@
+h5repart_SOURCES = h5repart.c
+h5repart_OBJECTS = h5repart.$(OBJEXT)
+h5repart_LDADD = $(LDADD)
+h5repart_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5repart_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5repart_LDFLAGS) $(LDFLAGS) -o $@
+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; }; \
+  }
+SCRIPTS = $(bin_SCRIPTS)
+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 = h5clear.c h5debug.c h5mkgrp.c h5repart.c
+DIST_SOURCES = h5clear.c h5debug.c h5mkgrp.c h5repart.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__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)/h5cc.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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+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
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+ at BUILD_PARALLEL_CONDITIONAL_FALSE@H5CC_NAME = h5cc
+
+# h5cc needs custom install and uninstall rules, since it may be
+# named h5pcc if hdf5 is being built in parallel mode.
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@H5CC_NAME = h5pcc
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/src/misc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/src/misc/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):
+h5cc: $(top_builddir)/config.status $(srcdir)/h5cc.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
+
+h5clear$(EXEEXT): $(h5clear_OBJECTS) $(h5clear_DEPENDENCIES) $(EXTRA_h5clear_DEPENDENCIES) 
+	@rm -f h5clear$(EXEEXT)
+	$(AM_V_CCLD)$(h5clear_LINK) $(h5clear_OBJECTS) $(h5clear_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)
+
+h5mkgrp$(EXEEXT): $(h5mkgrp_OBJECTS) $(h5mkgrp_DEPENDENCIES) $(EXTRA_h5mkgrp_DEPENDENCIES) 
+	@rm -f h5mkgrp$(EXEEXT)
+	$(AM_V_CCLD)$(h5mkgrp_LINK) $(h5mkgrp_OBJECTS) $(h5mkgrp_LDADD) $(LIBS)
+
+h5repart$(EXEEXT): $(h5repart_OBJECTS) $(h5repart_DEPENDENCIES) $(EXTRA_h5repart_DEPENDENCIES) 
+	@rm -f h5repart$(EXEEXT)
+	$(AM_V_CCLD)$(h5repart_LINK) $(h5repart_OBJECTS) $(h5repart_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_SCRIPTS)'; 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 \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | 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; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5clear.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5debug.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5mkgrp.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repart.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 
+	@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-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local
+installdirs:
+	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-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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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 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-binSCRIPTS \
+	install-exec-local
+
+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 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-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 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
+# 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
+
+install-exec-local:
+	@$(INSTALL) h5cc $(DESTDIR)$(bindir)/$(H5CC_NAME)
+uninstall-local:
+	@$(RM) $(DESTDIR)$(bindir)/$(H5CC_NAME)
+
+# How to build h5redeploy script
+h5redeploy: h5redeploy.in
+	@cp $(srcdir)/$@.in $@
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-dyn: $(DYN)
+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 dyn 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/src/misc/h5cc.in b/tools/src/misc/h5cc.in
new file mode 100644
index 0000000..9c4e3ca
--- /dev/null
+++ b/tools/src/misc/h5cc.in
@@ -0,0 +1,399 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+##
+
+# This tool is adapted from the mpicc command of the MPICH Software.
+
+############################################################################
+##                                                                        ##
+## Things You May Have to Modify:                                         ##
+##                                                                        ##
+## If the following paths don't point to the place were HDF5 is installed ##
+## on your system (i.e., you received a binary distribution or moved the  ##
+## files from the originally installed directory to another directory)    ##
+## then modify them accordingly to represent the new paths.               ##
+##                                                                        ##
+############################################################################
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+libdir="@libdir@"
+includedir="@includedir@"
+HL="@HL@"
+
+############################################################################
+##                                                                        ##
+## Things You Can Modify to Override HDF5 Library Build Components:       ##
+##                                                                        ##
+## (Advanced usage - know what you're doing - you're on your own here.)   ##
+## The four variables below can be used to insert paths and flags in      ##
+## CPPFLAGS, CFLAGS, LDFLAGS, or LIBS in the h5cc compile line:           ##
+##    $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS   ##
+##    $LIBS $clibpath $link_objs $link_args $shared_link                  ##
+##                                                                        ##
+## These settings can be overriden by setting HDF5_CFLAGS,                ##
+## HDF5_CPPFLAGS, HDF5_LDFLAGS, or HDF5_LIBS in the environment.          ##
+##                                                                        ##
+############################################################################
+CFLAGSBASE=""
+CPPFLAGSBASE=""
+LDFLAGSBASE=""
+LIBSBASE=""
+
+############################################################################
+##                                                                        ##
+## You shouldn't have to modify anything below this line.                 ##
+##                                                                        ##
+############################################################################
+
+# Constants definitions
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+host_os="@host_os@"
+
+prog_name="`basename $0`"
+
+allargs=""
+compile_args=""
+libraries=""
+link_args=""
+link_objs=""
+clibpath=""
+
+do_link="yes"
+do_compile="no"
+dash_o="no"
+dash_c="no"
+get_output_file="no"
+
+SHOW="eval"
+CCBASE="@CC@"
+CLINKERBASE="@CC@"
+
+# CFLAGS, CPPFLAGS and LDFLAGS are reserved for use by the script user.
+# FLAGS brought from the hdf5 build are put in H5BLD_*FLAGS.
+
+# User's CPPFLAGS and CFLAGS come after their H5BLD counterparts.  User's 
+# LDFLAGS come just before clibpath, user's LIBS come after $link_objs and 
+# before the hdf5 libraries in $link_args, followed by any external library 
+# paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in 
+# from the hdf5 build. The order of the flags is intended to give precedence
+# to the user's flags.
+H5BLD_CFLAGS="@AM_CFLAGS@ @CFLAGS@"
+H5BLD_CPPFLAGS="@AM_CPPFLAGS@ @CPPFLAGS@"
+H5BLD_LDFLAGS="@AM_LDFLAGS@ @LDFLAGS@"
+H5BLD_LIBS="@LIBS@"
+
+CC="${HDF5_CC:-$CCBASE}"
+CLINKER="${HDF5_CLINKER:-$CLINKERBASE}"
+CFLAGS="${HDF5_CFLAGS:-$CFLAGSBASE}"
+CPPFLAGS="${HDF5_CPPFLAGS:-$CPPFLAGSBASE}"
+LDFLAGS="${HDF5_LDFLAGS:-$LDFLAGSBASE}"
+LIBS="${HDF5_LIBS:-$LIBSBASE}"
+
+# If a static library is available, the default will be to use it.  If the only
+# available library is shared, it will be used by default.  The user can 
+# override either default, although choosing an unavailable library will result
+# in link errors.  
+STATIC_AVAILABLE="@enable_static@"
+if test "${STATIC_AVAILABLE}" = "yes"; then
+  USE_SHARED_LIB="${HDF5_USE_SHLIB:-no}"
+else
+  USE_SHARED_LIB="${HDF5_USE_SHLIB:-yes}"
+fi
+
+
+usage() {
+  # A wonderfully informative "usage" message.
+  echo "usage: $prog_name [OPTIONS] <compile line>"
+  echo "  OPTIONS:"
+  echo "    -help        This help message."
+  echo "    -echo        Show all the shell commands executed"
+  echo "    -prefix=DIR  Prefix directory to find HDF5 lib/ and include/"
+  echo "                   subdirectories [default: $prefix]"
+  # A wonderfully informative "usage" message.
+  echo "usage: $prog_name [OPTIONS] <compile line>"
+  echo "  OPTIONS:"
+  echo "    -help        This help message."
+  echo "    -echo        Show all the shell commands executed"
+  echo "    -prefix=DIR  Prefix directory to find HDF5 lib/ and include/"
+  echo "                   subdirectories [default: $prefix]"
+  echo "    -show        Show the commands without executing them"
+  echo "    -showconfig  Show the HDF5 library configuration summary"
+  echo "    -shlib       Compile with shared HDF5 libraries [default for hdf5 built"
+  echo "                                                     without static libraries]"
+  echo "    -noshlib     Compile with static HDF5 libraries [default for hdf5 built"
+  echo "                                                     with static libraries]"
+  echo " "
+  echo "  <compile line>  - the normal compile line options for your compiler."
+  echo "                    $prog_name uses the same compiler you used to compile"
+  echo "                    HDF5. Check with your compiler's man pages for more"
+  echo "                    information on which options are needed."
+  echo " "
+  echo " You can override the compiler, linker, and whether or not to use static"
+  echo " or shared libraries to compile your program by setting the following"
+  echo " environment variables accordingly:"
+  echo " "
+  echo "   HDF5_CC                  -  use a different C compiler"
+  echo "   HDF5_CLINKER             -  use a different linker"
+  echo "   HDF5_USE_SHLIB=[yes|no]  -  use shared or static version of the HDF5 library"
+  echo "                                 [default: no except when built with only" 
+  echo "                                           shared libraries]"
+  echo " "
+  echo " You can also add or change paths and flags to the compile line using"
+  echo " the following environment varibles or by assigning them to their counterparts"
+  echo " in the 'Things You Can Modify to Override...'" section of $prog_name
+  echo " "
+  echo "  Variable              Current value to be replaced"
+  echo "  HDF5_CPPFLAGS         \"$CPPFLAGSBASE\""
+  echo "  HDF5_CFLAGS           \"$CFLAGSBASE\""
+  echo "  HDF5_LDFLAGS          \"$LDFLAGSBASE\""
+  echo "  HDF5_LIBS             \"$LIBSBASE\""
+  echo " "
+  echo " Note that adding library paths to HDF5_LDFLAGS where another hdf5 version"
+  echo " is located may link your program with that other hdf5 library version."
+  echo " "
+  exit $EXIT_FAILURE
+}
+
+# Show the configuration summary of the library recorded in the
+# libhdf5.settings file reside in the lib directory.
+showconfigure()
+{
+  cat ${libdir}/libhdf5.settings
+  status=$?
+}
+
+# Main
+status=$EXIT_SUCCESS
+
+if test "$#" = "0"; then
+  # No parameters specified, issue usage statement and exit.
+  usage
+fi
+
+case "$CC" in
+  gcc)
+    kind="gcc"
+    ;;
+  mpicc|mpcc|mpicc_r)
+    # Is this gcc masquarading as an MPI compiler?
+    if test "`${CC} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then
+      kind="gcc"
+    else
+      # Nope
+      kind="$host_os"
+    fi
+    ;;
+  *)
+    kind="$host_os"
+    ;;
+esac
+
+for arg in $@ ; do
+  if test "x$get_output_file" = "xyes"; then
+    link_args="$link_args $arg"
+    output_file="$arg"
+    get_output_file="no"
+    continue
+  fi
+
+  case "$arg" in
+    -c)
+      allargs="$allargs $arg"
+      compile_args="$compile_args $arg"
+
+      if test "x$do_link" = "xyes" -a -n "$output_file"; then
+        compile_args="$compile_args -o $output_file"
+      fi
+
+      do_link="no"
+      dash_c="yes"
+      ;;
+    -o)
+      allargs="$allargs $arg"
+      dash_o="yes"
+
+      if test "x$dash_c" = "xyes"; then
+        compile_args="$compile_args $arg"
+      else
+        link_args="$link_args $arg"
+        do_link="yes"
+        get_output_file="yes"
+      fi
+      ;;
+    -E|-M|-MT)
+      allargs="$allargs $arg"
+      compile_args="$compile_args $arg"
+      dash_c="yes"
+      do_link="no"
+      ;;
+    -l*)
+      libraries=" $libraries $arg "
+      allargs="$allargs $arg"
+      ;;
+    -prefix=*)
+      prefix="`expr "$arg" : '-prefix=\(.*\)'`"
+      ;;
+    -echo)
+      set -x
+      ;;
+    -show)
+      SHOW="echo"
+      ;;
+    -showconfig)
+      showconfigure
+      exit $status
+      ;;
+    -shlib)
+      USE_SHARED_LIB="yes"
+      ;;
+    -noshlib)
+      USE_SHARED_LIB="no"
+      ;;
+    -help)
+      usage
+      ;;
+    *\"*)
+      qarg="'"$arg"'"
+      allargs="$allargs $qarg"
+      ;;
+    *\'*)
+      qarg='\"'"$arg"'\"'
+      allargs="$allargs $qarg"
+      ;;
+    *)
+      allargs="$allargs $qarg"
+
+      if test -s "$arg"; then
+        ext=`expr "$arg" : '.*\(\..*\)'`
+
+        if test "x$ext" = "x.c"; then
+          do_compile="yes"
+          compile_args="$compile_args $arg"
+          fname=`basename $arg .c`
+          link_objs="$link_objs $fname.o"
+        elif test "x$ext" = "x.o"; then
+          if test "x$dash_c" = "xyes"; then
+            compile_args="$compile_args $arg"
+          else
+            do_link="yes"
+            link_objs="$link_objs $arg"
+          fi
+        elif test "x$ext" = "x.a"; then
+          # This is an archive that we're linking in
+          libraries=" $libraries $arg "
+        else
+          compile_args="$compile_args $arg"
+          link_args="$link_args $arg"
+        fi
+      else
+        compile_args="$compile_args $arg"
+        link_args="$link_args $arg"
+      fi
+      ;;
+  esac
+done
+
+if test "$dash_c" = "yes" -a "$do_compile" = no -a "$do_link" = no ; then
+    # -c was specified.  Force do_compile on.
+    do_compile=yes
+fi
+
+if test "x$do_compile" = "xyes"; then
+  if test "x$dash_c" != "xyes"; then
+    compile_args="-c $compile_args"
+  fi
+
+  $SHOW $CC -I$includedir $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $compile_args
+  status=$?
+
+  if test "$status" != "0"; then
+    exit $status
+  fi
+fi
+
+if test "x$do_link" = "xyes"; then
+  shared_link=""
+# conditionnaly link with the hl library  
+  if test "X$HL" = "Xhl"; then
+   libraries=" $libraries -lhdf5_hl -lhdf5 "
+  else
+   libraries=" $libraries  -lhdf5 "
+  fi
+  link_args="$link_args -L${libdir}"
+
+  case "$kind" in
+    gcc|linux*)
+      # MacOS X doesn't support the "-Wl,-rpath -Wl," style of linker flags.
+      # It appears to want none of them specified.
+      case "$host_os" in
+        darwin*)          flag="" ;;
+        *)                flag="-Wl,-rpath -Wl," ;;
+      esac
+      ;;
+    hpux*)                flag="-Wl,+b -Wl," ;;
+    freebsd*|solaris*)    flag="-R" ;;
+    rs6000*|aix*)         flag="-L" ;;
+    sgi)                  flag="-rpath " ;;
+    *)                    flag="" ;;
+  esac
+
+  if test -n "$flag"; then
+    shared_link="${flag}${libdir}"
+  fi
+
+  if test "x$USE_SHARED_LIB" != "xyes"; then
+    # The "-lhdf5" & "-lhdf5_hl" flags are in here already...This is a static
+    # compile though, so change it to the static version (.a) of the library.
+    new_libraries=""
+    for lib in $libraries; do
+      case "$lib" in
+        -lhdf5)
+          new_libraries="$new_libraries ${libdir}/libhdf5.a"
+          ;;
+        -lhdf5_hl)
+          new_libraries="$new_libraries ${libdir}/libhdf5_hl.a"
+          ;;
+        *)
+          new_libraries="$new_libraries $lib"
+          ;;
+      esac
+    done
+    libraries="$new_libraries"
+  fi
+
+  for lib in $libraries; do
+    if echo $link_args | grep " $lib " > /dev/null ||
+       echo $link_args | grep " $lib$" > /dev/null; then
+      :
+    else
+      link_args="$link_args $lib "
+    fi
+  done
+
+  # The LIBS are just a bunch of -l* libraries necessary for the HDF5
+  # module. It's okay if they're included twice in the compile line.
+  link_args="$link_args $H5BLD_LDFLAGS $H5BLD_LIBS"
+
+  # User's CPPFLAGS and CFLAGS come after their H5BLD counterparts.  User's 
+  # LDFLAGS come just before clibpath, user's LIBS come after $link_objs and 
+  # before the hdf5 libraries in $link_args, followed by any external library 
+  # paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in 
+  # from the hdf5 build. The order of the flags is intended to give precedence
+  # to the user's flags.
+  $SHOW $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args $shared_link
+  status=$?
+fi
+
+exit $status
diff --git a/tools/src/misc/h5clear.c b/tools/src/misc/h5clear.c
new file mode 100644
index 0000000..e3b989d
--- /dev/null
+++ b/tools/src/misc/h5clear.c
@@ -0,0 +1,270 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose: A tool to clear the status_flags field from the file's superblock via -s option.
+ *          A tool to remove cache image from the file via -m option.
+ *          
+ */
+#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"
+
+static char *fname_g = NULL;
+static hbool_t clear_status_flags = FALSE;
+static hbool_t remove_cache_image = FALSE;
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters.
+ */
+static const char *s_opts = "hVsm";
+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' },
+        { "status", no_arg, 's' },
+        { "statu", no_arg, 's' },
+        { "stat", no_arg, 's' },
+        { "sta", no_arg, 's' },
+        { "st", no_arg, 's' },
+        { "image", no_arg, 'm' },
+        { "imag", no_arg, 'm' },
+        { "ima", no_arg, 'm' },
+        { "im", no_arg, 'm' },
+        { NULL, 0, '\0' }
+};
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Prints a usage message
+ *
+ * Return:      void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void usage(const char *prog)
+{
+    HDfprintf(stdout, "usage: %s [OPTIONS] file_name\n", prog);
+    HDfprintf(stdout, "  OPTIONS\n");
+    HDfprintf(stdout, "   -h, --help                Print a usage message and exit\n");
+    HDfprintf(stdout, "   -V, --version             Print version number and exit\n");
+    HDfprintf(stdout, "   -s, --status              Clear the status_flags field in the file's superblock\n");
+    HDfprintf(stdout, "   -m, --image               Remove the metadata cache image from the file\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "Examples of use:\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "h5clear -s file_name\n");
+    HDfprintf(stdout, "  Clear the status_flags field in the superblock of the HDF5 file <file_name>.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "h5clear -m file_name\n");
+    HDfprintf(stdout, "  Remove the metadata cache image from the HDF5 file <file_name>.\n");
+} /* usage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: Parses command line and sets up global variable to control output
+ *
+ * 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 done;
+
+            case 'V':
+                print_version(h5tools_getprogname());
+                h5tools_setstatus(EXIT_SUCCESS);
+                goto done;
+
+            case 's':
+                clear_status_flags = TRUE;
+                break;
+
+            case 'm':
+                remove_cache_image = TRUE;
+                break;
+
+            default:
+                usage(h5tools_getprogname());
+                h5tools_setstatus(EXIT_FAILURE);
+                goto error;
+        } /* end switch */
+    } /* end while */
+
+    /* check for file name to be processed */
+    if(argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        h5tools_setstatus(EXIT_FAILURE);
+        goto error;
+    } /* end if */
+
+    fname_g = HDstrdup(argv[opt_ind]);
+
+done:
+    return(0);
+
+error:
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Close the tools library and exit
+ *
+ * Return:      Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+    HDexit(ret);
+} /* leave() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     To clear the status_flags field in the file's superblock (-s option).
+ *              To remove the cache image from the file (-m option).
+ *
+ * Return:      Success: 0
+ *              Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (int argc, const char *argv[])
+{
+    char *fname = NULL;    /* File name */
+    hid_t fapl = -1;       /* File access property list */
+    hid_t fid = -1;        /* File ID */
+    haddr_t image_addr;
+    hsize_t image_len;
+
+    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();
+
+    /* Parse command line options */
+    if(parse_command_line(argc, argv) < 0)
+        goto done;
+
+    if(fname_g == NULL)
+        goto done;
+
+    if(!clear_status_flags && !remove_cache_image) {
+        usage(h5tools_getprogname());
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    /* Duplicate the file name */
+    fname = HDstrdup(fname_g);
+
+    /* Get a copy of the file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        error_msg("H5Pcreate\n");
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+     }
+
+    /* -s option */
+    if(clear_status_flags) { 
+        /* 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_status_flags) < 0) {
+            error_msg("H5Pset\n");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+    }
+
+    if((fid = h5tools_fopen(fname, H5F_ACC_RDWR, fapl, NULL, NULL, (size_t)0)) < 0) {
+        error_msg("h5tools_fopen\n");
+        h5tools_setstatus(EXIT_FAILURE);
+        goto done;
+    }
+
+    /* -m option */
+    if(remove_cache_image) { 
+        if(H5Fget_mdc_image_info(fid, &image_addr, &image_len) < 0) {
+            error_msg("H5Fget_mdc_image_info\n");
+            h5tools_setstatus(EXIT_FAILURE);
+            goto done;
+        }
+        if(image_addr == HADDR_UNDEF && image_len == 0)
+            warn_msg("No cache image in the file\n");
+    } 
+
+    h5tools_setstatus(EXIT_SUCCESS);
+done:
+    if(fname)
+        HDfree(fname);
+    if(fname_g)
+        HDfree(fname_g);
+
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY
+
+    leave(h5tools_getstatus());
+} /* main() */
+
diff --git a/tools/src/misc/h5debug.c b/tools/src/misc/h5debug.c
new file mode 100644
index 0000000..72f826e
--- /dev/null
+++ b/tools/src/misc/h5debug.c
@@ -0,0 +1,721 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             debug.c
+ *                      Jul 18 1997
+ *                      Robb Matzke <matzke at llnl.gov>
+ *
+ * Purpose:             Debugs an existing HDF5 file at a low level.
+ *
+ *-------------------------------------------------------------------------
+ */
+#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               */
+#include "H5HFpkg.h"    /* Fractal heaps        */
+#include "H5HGprivate.h" /* Global Heaps        */
+#include "H5Iprivate.h" /* IDs                  */
+#include "H5Opkg.h"     /* Object headers       */
+#include "H5SMpkg.h"    /* Implicitly shared messages    */
+
+/* File drivers */
+#include "H5FDfamily.h"
+
+#define VCOL    50
+
+

+/*-------------------------------------------------------------------------
+ * Function:    get_H5B2_class
+ *
+ * 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
+ *
+ * Programmer:  Quincey Koziol
+ *    koziol at hdfgroup.org
+ *    Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static const H5B2_class_t *
+get_H5B2_class(const uint8_t *sig)
+{
+    H5B2_subid_t subtype = (H5B2_subid_t)sig[H5_SIZEOF_MAGIC + 1];
+    const H5B2_class_t *cls;
+
+    switch(subtype) {
+        case H5B2_TEST_ID:
+            cls = H5B2_TEST;
+            break;
+
+        case H5B2_FHEAP_HUGE_INDIR_ID:
+            cls = H5HF_HUGE_BT2_INDIR;
+            break;
+
+        case H5B2_FHEAP_HUGE_FILT_INDIR_ID:
+            cls = H5HF_HUGE_BT2_FILT_INDIR;
+            break;
+
+        case H5B2_FHEAP_HUGE_DIR_ID:
+            cls = H5HF_HUGE_BT2_DIR;
+            break;
+
+        case H5B2_FHEAP_HUGE_FILT_DIR_ID:
+            cls = H5HF_HUGE_BT2_FILT_DIR;
+            break;
+
+        case H5B2_GRP_DENSE_NAME_ID:
+            cls = H5G_BT2_NAME;
+            break;
+
+        case H5B2_GRP_DENSE_CORDER_ID:
+            cls = H5G_BT2_CORDER;
+            break;
+
+        case H5B2_SOHM_INDEX_ID:
+            cls = H5SM_INDEX;
+            break;
+
+        case H5B2_ATTR_DENSE_NAME_ID:
+            cls = H5A_BT2_NAME;
+            break;
+
+        case H5B2_ATTR_DENSE_CORDER_ID:
+            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_TEST2_ID:
+            cls = H5B2_TEST2;
+            break;
+
+        case H5B2_NUM_BTREE_ID:
+        default:
+            HDfprintf(stderr, "Unknown v2 B-tree subtype %u\n", (unsigned)(subtype));
+            HDexit(4);
+    } /* end switch */
+
+    return(cls);
+} /* end get_H5B2_class() */
+
+

+/*-------------------------------------------------------------------------
+ * 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]
+ *
+ * Return:      Success:        exit (0)
+ *
+ *              Failure:        exit (non-zero)
+ *
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 18 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    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];
+    size_t      u;
+    H5E_auto2_t func;
+    void 	*edata;
+    herr_t      status = SUCCEED;
+
+    if(argc == 1) {
+  	HDfprintf(stderr, "Usage: %s filename [signature-addr [extra]]\n", argv[0]);
+  	HDexit(1);
+    } /* end if */
+
+    /* Initialize the library */
+    if(H5open() < 0) {
+        HDfprintf(stderr, "cannot initialize the library\n");
+        HDexit(1);
+    } /* end if */
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /*
+     * Open the file and get the file descriptor.
+     */
+    dxpl = H5AC_ind_read_dxpl_id;
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        HDfprintf(stderr, "cannot create file access property list\n");
+        HDexit(1);
+    } /* end if */
+    if(HDstrchr(argv[1], '%'))
+        if(H5Pset_fapl_family (fapl, (hsize_t)0, H5P_DEFAULT) < 0) {
+            fprintf(stderr, "cannot set file access property list\n");
+            HDexit(1);
+        }
+    if((fid = H5Fopen(argv[1], H5F_ACC_RDONLY, fapl)) < 0) {
+        HDfprintf(stderr, "cannot open file\n");
+        HDexit(1);
+    } /* end if */
+    if(NULL == (f = (H5F_t *)H5I_object(fid))) {
+        HDfprintf(stderr, "cannot obtain H5F_t pointer\n");
+        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.
+     */
+    if(argc > 2)
+        addr = (haddr_t)HDstrtoll(argv[2], NULL, 0);
+    if(argc > 3)
+        extra = (haddr_t)HDstrtoll(argv[3], NULL, 0);
+    if(argc > 4)
+        extra2 = (haddr_t)HDstrtoll(argv[4], NULL, 0);
+    if(argc > 5)
+        extra3 = (haddr_t)HDstrtoll(argv[5], NULL, 0);
+    if(argc > 6)
+        extra4 = (haddr_t)HDstrtoll(argv[6], NULL, 0);
+
+    /*
+     * Read the signature at the specified file position.
+     */
+    HDfprintf(stdout, "Reading signature at address %a (rel)\n", addr);
+    if(H5F_block_read(f, H5FD_MEM_SUPER, addr, sizeof(sig), dxpl, sig) < 0) {
+        HDfprintf(stderr, "cannot read signature\n");
+        HDexit(3);
+    }
+    if(!HDmemcmp(sig, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN)) {
+        /*
+         * Debug the file's super block.
+         */
+        status = H5F_debug(f, stdout, 0, VCOL);
+
+    } else if(!HDmemcmp(sig, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a local heap.
+         */
+        status = H5HL_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else if(!HDmemcmp (sig, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+	/*
+	 * Debug a global heap collection.
+	 */
+	status = H5HG_debug (f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else if(!HDmemcmp(sig, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a symbol table node.
+         */
+
+        /* Check for extra parameters */
+        if(extra == 0) {
+            HDfprintf(stderr, "\nWarning: Providing the group's local heap address will give more information\n");
+            HDfprintf(stderr, "Symbol table node usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <Symbol table node address> <address of local heap>\n\n");
+        } /* end if */
+
+        status = H5G_node_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra);
+
+    } else if(!HDmemcmp(sig, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a B-tree.  B-trees are debugged through the B-tree
+         * subclass.  The subclass identifier is the byte immediately
+         * after the B-tree signature.
+         */
+        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:
+                /* Check for extra parameters */
+                if(extra == 0) {
+                    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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra);
+                break;
+
+            case H5B_CHUNK_ID:
+                /* Check for extra parameters */
+                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> <slowest chunk dim>...<fastest chunk dim>\n");
+                    HDexit(4);
+                } /* end if */
+
+                /* Build array of chunk dimensions */
+                ndims = (unsigned)extra;
+                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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, ndims, dim);
+                break;
+
+            case H5B_NUM_BTREE_ID:
+            default:
+                HDfprintf(stderr, "Unknown v1 B-tree subtype %u\n", (unsigned)(subtype));
+                HDexit(4);
+        }
+
+    } else if(!HDmemcmp(sig, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a v2 B-tree header.
+         */
+        const H5B2_class_t *cls = get_H5B2_class(sig);
+        HDassert(cls);
+
+	    if((cls == H5D_BT2 || cls == H5D_BT2_FILT) && extra == 0) {
+            HDfprintf(stderr, "ERROR: Need v2 B-tree header address and object header address containing the layout message in order to dump header\n");
+            HDfprintf(stderr, "v2 B-tree hdr usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <v2 B-tree header address> <object header address>\n");
+            HDexit(4);
+	    } /* end if */
+
+        status = H5B2__hdr_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, (haddr_t)extra);
+
+    } else if(!HDmemcmp(sig, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a v2 B-tree internal node.
+         */
+        const H5B2_class_t *cls = get_H5B2_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+	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");
+            HDfprintf(stderr, "\th5debug <filename> <internal node address> <v2 B-tree header address> <number of records> <depth>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5B2__int_debug(f, H5AC_ind_read_dxpl_id, 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)) {
+        /*
+         * Debug a v2 B-tree leaf node.
+         */
+        const H5B2_class_t *cls = get_H5B2_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+	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, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (haddr_t)extra3);
+
+    } else if(!HDmemcmp(sig, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a fractal heap header.
+         */
+        status = H5HF_hdr_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else if(!HDmemcmp(sig, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a fractal heap direct block.
+         */
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0) {
+            HDfprintf(stderr, "ERROR: Need fractal heap header address and size of direct block in order to dump direct block\n");
+            HDfprintf(stderr, "Fractal heap direct block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <direct block address> <heap header address> <size of direct block>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5HF_dblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, (size_t)extra2);
+
+    } else if(!HDmemcmp(sig, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a fractal heap indirect block.
+         */
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0) {
+            HDfprintf(stderr, "ERROR: Need fractal heap header address and number of rows in order to dump indirect block\n");
+            HDfprintf(stderr, "Fractal heap indirect block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <indirect block address> <heap header address> <number of rows>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5HF_iblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, (unsigned)extra2);
+
+    } else if(!HDmemcmp(sig, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a free space header.
+         */
+
+        status = H5FS_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else if(!HDmemcmp(sig, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug free space serialized sections.
+         */
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0) {
+            HDfprintf(stderr, "ERROR: Need free space header address and client address in order to dump serialized sections\n");
+            HDfprintf(stderr, "Free space serialized sections usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <serialized sections address> <free space header address> <client address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5FS_sects_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, extra, extra2);
+
+    } else if(!HDmemcmp(sig, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug shared message master table.
+         */
+
+        status = H5SM_table_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, (unsigned) UFAIL, (unsigned) UFAIL);
+
+    } else if(!HDmemcmp(sig, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug shared message list index.
+         */
+
+        /* Check for enough valid parameters */
+        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> <shared message header address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5SM_list_debug(f, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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, H5AC_ind_read_dxpl_id, 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 = H5FA__dblock_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL, cls, extra, extra2);
+
+    } else if(!HDmemcmp(sig, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug v2 object header (which have signatures).
+         */
+
+        status = H5O_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else if(sig[0] == H5O_VERSION_1) {
+        /*
+         * This could be a v1 object header.  Since they don't have a signature
+         * it's a somewhat "ify" detection.
+         */
+        status = H5O_debug(f, H5AC_ind_read_dxpl_id, addr, stdout, 0, VCOL);
+
+    } else {
+        /*
+         * Got some other unrecognized signature.
+         */
+        printf("%-*s ", VCOL, "Signature:");
+        for (u = 0; u < sizeof(sig); u++) {
+            if (sig[u] > ' ' && sig[u] <= '~' && '\\' != sig[u])
+                HDputchar(sig[u]);
+            else if ('\\' == sig[u]) {
+                HDputchar('\\');
+                HDputchar('\\');
+            } else
+                printf("\\%03o", sig[u]);
+        }
+        HDputchar('\n');
+
+        HDfprintf(stderr, "unknown signature\n");
+        HDexit(4);
+    } /* end else */
+
+    /* Check for an error when dumping information */
+    if(status < 0) {
+        HDfprintf(stderr, "An error occurred!\n");
+        H5Eprint2(H5E_DEFAULT, stderr);
+        HDexit(5);
+    } /* end if */
+
+    H5Pclose(fapl);
+    H5Fclose(fid);
+
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
+    return 0;
+} /* main() */
+
diff --git a/tools/src/misc/h5mkgrp.c b/tools/src/misc/h5mkgrp.c
new file mode 100644
index 0000000..597b6b3
--- /dev/null
+++ b/tools/src/misc/h5mkgrp.c
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include <string.h>
+#include <stdlib.h>
+
+/* Name of tool */
+#define PROGRAMNAME "h5mkgrp"
+
+/* Exit status for tools library routines */
+int d_status = EXIT_SUCCESS;
+
+/* command-line options: short and long-named parameters */
+static const char *s_opts = "hlpvV";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "latest", no_arg, 'l' },
+    { "parents", no_arg, 'p' },
+    { "verbose", no_arg, 'v' },
+    { "version", no_arg, 'V' },
+    { NULL, 0, '\0' }
+};
+
+/* Command line parameter settings */
+typedef struct {
+    char *fname;                /* File name to operate on */
+    hbool_t latest;             /* Whether file should use latest format versions */
+    hbool_t verbose;            /* Whether output should be verbose */
+    hbool_t parents;            /* Whether to create intermediate groups */
+    size_t ngroups;             /* Number of groups to create */
+    char **groups;              /* Pointer to array of group names */
+} param_t;
+param_t params;             /* Command line parameter settings */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Shutdown MPI and/or HDF5 and call exit()
+ *
+ * Return:      Does not return
+ *
+ * Programmer: Quincey Koziol, 2/13/2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    size_t curr_group;
+
+    if (params.fname)
+        HDfree (params.fname);
+    if (params.ngroups) {
+        for(curr_group = 0; curr_group < params.ngroups; curr_group++)
+            HDfree (params.groups[curr_group]);
+        HDfree (params.groups);
+    }
+    h5tools_close();
+    HDexit(ret);
+} /* end leave() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer: Quincey Koziol, 2/13/2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(void)
+{
+    HDfprintf(stdout, "\
+usage: h5mkgrp [OPTIONS] FILE GROUP...\n\
+   OPTIONS\n\
+      -h, --help         Print a usage message and exit\n\
+      -l, --latest       Use latest version of file format to create groups\n\
+      -p, --parents      No error if existing, make parent groups as needed\n\
+      -v, --verbose      Print information about OBJECTS and OPTIONS\n\
+      -V, --version      Print version number and exit\n");
+} /* end usage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: Parses command line and sets up global variable to control output
+ *
+ * Return:  Success: 0
+ *    Failure: -1
+ *
+ * Programmer: Quincey Koziol, 2/13/2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_command_line(int argc, const char *argv[], param_t *parms)
+{
+    int opt;            /* Option from command line */
+    size_t curr_group;  /* Current group name to copy */
+
+    /* Check for empty command line */
+    if(argc == 1) {
+        usage();
+        leave(EXIT_SUCCESS);
+    } /* end if */
+
+    /* Parse command line options */
+    while((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+        switch((char)opt) {
+            /* Display 'help' */
+            case 'h':
+                usage();
+                leave(EXIT_SUCCESS);
+
+            /* Create objects with the latest version of the format */
+            case 'l':
+                parms->latest = TRUE;
+                break;
+
+            /* Create parent groups */
+            case 'p':
+                parms->parents = TRUE;
+                break;
+
+            /* Verbose output */
+            case 'v':
+                parms->verbose = TRUE;
+                break;
+
+            /* Display version */
+            case 'V':
+                print_version(h5tools_getprogname());
+                leave(EXIT_SUCCESS);
+
+            /* Bad command line argument */
+            default:
+                usage();
+                leave(EXIT_FAILURE);
+        } /* end switch */
+    } /* end while */
+
+    /* Check for file name to be processed */
+    if(argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage();
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Retrieve file name */
+    parms->fname = HDstrdup(argv[opt_ind]);
+    opt_ind++;
+
+    /* Check for group(s) to be created */
+    if(argc <= opt_ind) {
+        error_msg("missing group name(s)\n");
+        usage();
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Allocate space for the group name pointers */
+    parms->ngroups = (size_t)(argc - opt_ind);
+    parms->groups = (char **)HDmalloc(parms->ngroups * sizeof(char *));
+
+    /* Retrieve the group names */
+    curr_group = 0;
+    while(opt_ind < argc) {
+        parms->groups[curr_group] = HDstrdup(argv[opt_ind]);
+        curr_group++;
+        opt_ind++;
+    } /* end while */
+
+#ifdef QAK
+HDfprintf(stderr, "parms->parents = %t\n", parms->parents);
+HDfprintf(stderr, "parms->verbose = %t\n", parms->verbose);
+HDfprintf(stderr, "parms->fname = '%s'\n", parms->fname);
+HDfprintf(stderr, "parms->ngroups = %Zu\n", parms->ngroups);
+for(curr_group = 0; curr_group < parms->ngroups; curr_group++)
+    HDfprintf(stderr, "parms->group[%Zu] = '%s'\n", curr_group, parms->groups[curr_group]);
+#endif /* QAK */
+
+    return(0);
+} /* parse_command_line() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Create group(s) in an HDF5 file
+ *
+ * Programmer: Quincey Koziol, 2/13/2007
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    hid_t fid;                  /* HDF5 file ID */
+    hid_t fapl_id;              /* File access property list ID */
+    hid_t lcpl_id;              /* Link creation property list ID */
+    size_t curr_group;          /* Current group to create */
+
+    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();
+
+    /* Parse command line */
+    HDmemset(&params, 0, sizeof(params));
+    if(parse_command_line(argc, argv, &params) < 0) {
+        error_msg("unable to parse command line arguments\n");
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Create file access property list */
+    if((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        error_msg("Could not create file access property list\n");
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Check for creating groups with new format version */
+    if(params.latest) {
+        /* Set the "use the latest version of the format" bounds */
+        if(H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) {
+            error_msg("Could not set property for using latest version of the format\n");
+            leave(EXIT_FAILURE);
+        } /* end if */
+
+        /* Display some output if requested */
+        if(params.verbose)
+            printf("%s: Creating groups with latest version of the format\n", h5tools_getprogname());
+    } /* end if */
+
+    /* Attempt to open an existing HDF5 file first */
+    fid = h5tools_fopen(params.fname, H5F_ACC_RDWR, fapl_id, NULL, NULL, 0);
+
+    /* If we couldn't open an existing file, try creating file */
+    /* (use "EXCL" instead of "TRUNC", so we don't blow away existing non-HDF5 file) */
+    if(fid < 0)
+        fid = H5Fcreate(params.fname, H5F_ACC_EXCL, H5P_DEFAULT, fapl_id);
+
+    /* Test for error in opening file */
+    if(fid < 0) {
+        error_msg("Could not open output file '%s'\n", params.fname);
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Create link creation property list */
+    if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) {
+        error_msg("Could not create link creation property list\n");
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Check for creating intermediate groups */
+    if(params.parents) {
+        /* Set the intermediate group creation property */
+        if(H5Pset_create_intermediate_group(lcpl_id, TRUE) < 0) {
+            error_msg("Could not set property for creating parent groups\n");
+            leave(EXIT_FAILURE);
+        } /* end if */
+
+        /* Display some output if requested */
+        if(params.verbose)
+            printf("%s: Creating parent groups\n", h5tools_getprogname());
+    } /* end if */
+
+    /* Loop over creating requested groups */
+    for(curr_group = 0; curr_group < params.ngroups; curr_group++) {
+        hid_t gid;              /* Group ID */
+
+        /* Attempt to create a group */
+        if((gid = H5Gcreate2(fid, params.groups[curr_group], lcpl_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+            error_msg("Could not create group '%s'\n", params.groups[curr_group]);
+            leave(EXIT_FAILURE);
+        } /* end if */
+
+        /* Close the group */
+        if(H5Gclose(gid) < 0) {
+            error_msg("Could not close group '%s'??\n", params.groups[curr_group]);
+            leave(EXIT_FAILURE);
+        } /* end if */
+
+        /* Display some output if requested */
+        if(params.verbose)
+            printf("%s: created group '%s'\n", h5tools_getprogname(), params.groups[curr_group]);
+    } /* end for */
+
+    /* Close link creation property list */
+    if(H5Pclose(lcpl_id) < 0) {
+        error_msg("Could not close link creation property list\n");
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Close file */
+    if(H5Fclose(fid) < 0) {
+        error_msg("Could not close output file '%s'??\n", params.fname);
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    /* Close file access property list */
+    if(H5Pclose(fapl_id) < 0) {
+        error_msg("Could not close file access property list\n");
+        leave(EXIT_FAILURE);
+    } /* end if */
+
+    leave(EXIT_SUCCESS);
+} /* end main() */
+
diff --git a/tools/src/misc/h5redeploy.in b/tools/src/misc/h5redeploy.in
new file mode 100644
index 0000000..242459a
--- /dev/null
+++ b/tools/src/misc/h5redeploy.in
@@ -0,0 +1,216 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+## Update HDF5 compiler tools after the HDF5 software has been installed  ##
+## in a new location.							  ##
+## For help page, use "h5redeploy -help"				  ##
+##									  ##
+
+# Constants definitions
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+# Function definitions
+
+# show help page
+usage() {
+  # A wonderfully informative "usage" message.
+  echo "usage: $prog_name [OPTIONS]"
+  echo "  OPTIONS:"
+  echo "    -help|help        This help message"
+  echo "    -echo             Show all the shell commands executed"
+  echo "    -force            No prompt, just do it"
+  echo "    -prefix=DIR       New directory to find HDF5 lib/ and include/"
+  echo "                        subdirectories [default: current directory]"
+  echo "    -exec-prefix=DIR  New directory to find HDF5 lib/"
+  echo "                        subdirectory [default: <prefix>]"
+  echo "    -libdir=DIR       New directory for the HDF5 lib directory"
+  echo "                        [default: <exec-prefix>/lib]"
+  echo "    -includedir=DIR   New directory for the HDF5 header files"
+  echo "                        [default: <prefix>/include]"
+  echo "    -tool=TOOL        Tool to update. TOOL must be in the current"
+  echo "                        directory and writable. [default: $h5tools]"
+  echo "    -show             Show the commands without executing them"
+  echo " "
+  exit $EXIT_FAILURE
+}
+
+# display variable values
+dump_vars(){
+    echo "====Showing all variable values====="
+    echo prefix=$prefix
+    echo h5tools=$h5tools
+    echo "====End Showing====="
+}
+
+# show actions to be taken
+show_action()
+{
+    echo "Update the following tools because they are now installed at a new directory"
+    for t in $foundtools; do
+	echo "${t}:"
+	echo "   current setting=`sed -e '/^prefix=/s/prefix=//p' -e d $t`"
+	echo "   new     setting="\""$prefix"\"
+    done
+}
+
+
+# Report Error message
+ERROR()
+{
+    echo "***ERROR***"
+    echo "$1"
+}
+
+# Main
+#
+############################################################################
+## 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>.		  ##
+## Not used here:							  ##
+## bindir	executables, <exec_prefix/bin>.				  ##
+############################################################################
+# Initialization
+h5tools="h5cc h5pcc h5fc h5pfc h5c++"	# possible hdf5 tools
+foundtools=		# tools found and will be modified
+fmode=			# force mode, default is off
+prefix=
+exec_prefix=
+libdir=
+includedir=
+
+# Parse options
+for arg in $@ ; do
+  case "$arg" in
+    -prefix=*)
+      prefix="`echo $arg | cut -f2 -d=`"
+      ;;
+    -exec-prefix=*)
+      exec_prefix="`echo $arg | cut -f2 -d=`"
+      ;;
+    -libdir=*)
+      libdir="`echo $arg | cut -f2 -d=`"
+      ;;
+    -includedir=*)
+      includedir="`echo $arg | cut -f2 -d=`"
+      ;;
+    -echo)
+      set -x
+      ;;
+    -show)
+      SHOW="echo"
+      ;;
+    -tool=*)
+      h5tools="`echo $arg | cut -f2 -d=`"
+      ;;
+    -help|help)
+      usage
+      ;;
+    -force)
+      fmode=yes
+      ;;
+    *)
+      ERROR "Unknown Option($arg)"
+      usage
+      exit $EXIT_FAILURE
+      ;;
+  esac
+done
+
+# Set to default value, one above where i am, if not given by user
+if [ -z "$prefix" ]; then
+    prefix=`(cd ..;pwd)`
+fi
+if [ -z "$exec_prefix" ]; then
+    exec_prefix='${prefix}'		# use single quotes to prevent expansion of $
+fi
+if [ -z "$libdir" ]; then
+    libdir='${exec_prefix}'/lib	# use single quotes to prevent expansion of $
+fi
+if [ -z "$includedir" ]; then
+    includedir='${prefix}'/include # use single quotes to prevent expansion of $
+fi
+
+for x in $h5tools; do
+    if [ -f $x ]; then
+	foundtools="$foundtools $x"
+	if [ ! -w $x ]; then
+	    ERROR "h5tool($x) is not writable"
+	    exit $EXIT_FAILURE
+	fi
+    fi
+done
+
+if [ -z "$foundtools" ]; then
+    ERROR "found no tools to modify"
+    exit $EXIT_FAILURE
+fi
+
+# Show actions to be taken and get consent
+show_action
+# Ask confirmation unless fmode is on
+if [ x-$fmode = x- ]; then
+    echo "Continue? (yes/no)"
+    read ansx
+    ans=`echo $ansx | tr "[A-Z]" "[a-z]"`
+    if [ x-$ans != x-yes ]; then
+	echo ABORT.  No tools changed.
+	exit $EXIT_FAILURE
+    fi
+fi
+
+
+# Create the update commands
+CMDFILE=/tmp/h5redeploy.$$
+touch $CMDFILE
+chmod 0600 $CMDFILE
+echo "/^prefix=/c"                    >> $CMDFILE
+echo prefix=\""$prefix"\"             >> $CMDFILE
+echo .                                >> $CMDFILE
+echo "/^exec_prefix=/c"               >> $CMDFILE
+echo exec_prefix=\""$exec_prefix"\"   >> $CMDFILE
+echo .                                >> $CMDFILE
+echo "/^libdir=/c"                    >> $CMDFILE
+echo libdir=\""$libdir"\"             >> $CMDFILE
+echo .                                >> $CMDFILE
+echo "/^includedir=/c"                >> $CMDFILE
+echo includedir=\""$includedir"\"     >> $CMDFILE
+echo .                                >> $CMDFILE
+(echo w; echo q)                      >> $CMDFILE
+
+
+# Update them
+if [ "$SHOW" = "echo" ]; then
+    echo "===Update commands are:===="
+    cat $CMDFILE
+    echo "===End Update commands====="
+fi
+
+for t in $foundtools; do
+    echo Update $t ...
+    COMMAND="ed - $t"
+    if [ "$SHOW" = "echo" ]; then
+	echo $COMMAND
+    else
+	$COMMAND < $CMDFILE
+    fi
+done
+
+
+# Cleanup
+rm -f $CMDFILE
+exit $EXIT_SUCCESS
diff --git a/tools/src/misc/h5repart.c b/tools/src/misc/h5repart.c
new file mode 100644
index 0000000..911e0c6
--- /dev/null
+++ b/tools/src/misc/h5repart.c
@@ -0,0 +1,508 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Wednesday, May 13, 1998
+ *
+ * Purpose:	Repartitions a file family.  This program can be used to
+ *		split a single file into a family of files, join a family of
+ *		files into a single file, or copy one family to another while
+ *		changing the size of the family members.  It can also be used
+ *		to copy a single file to a single file with holes.
+ */
+
+/* See H5private.h for how to include system headers */
+#include "hdf5.h"
+#include "H5private.h"
+#ifdef H5_STDC_HEADERS
+#   include <ctype.h>
+#   include <errno.h>
+#   include <fcntl.h>
+#   include <stdio.h>
+#   include <stdlib.h>
+#   include <string.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#   include <sys/types.h>
+#   include <unistd.h>
+#endif
+
+#ifdef H5_HAVE_SYS_STAT_H
+#   include <sys/stat.h>
+#endif
+
+#ifndef FALSE
+#   define FALSE	0
+#endif
+#ifndef TRUE
+#   define TRUE 	1
+#endif
+#   define NAMELEN	4096
+#define GB	*1024*1024*1024
+
+#ifndef MIN
+#   define MIN(X,Y)	((X)<(Y)?(X):(Y))
+#endif
+#ifndef MIN3
+#   define MIN3(X,Y,Z)	MIN(MIN(X,Y),Z)
+#endif
+
+/*Make these 2 private properties(defined in H5Fprivate.h) available to h5repart.
+ *The first one updates the member file size in the superblock.  The second one
+ *change file driver from family to sec2. */
+#define H5F_ACS_FAMILY_NEWSIZE_NAME            "family_newsize"
+#define H5F_ACS_FAMILY_TO_SEC2_NAME            "family_to_sec2"
+
+

+/*-------------------------------------------------------------------------
+ * Function:	usage
+ *
+ * Purpose:	Prints a usage message.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, May 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (const char *progname)
+{
+    fprintf(stderr, "usage: %s [-v] [-V] [-[b|m] N[g|m|k]] [-family_to_sec2] SRC DST\n",
+	    progname);
+    fprintf(stderr, "   -v     Produce verbose output\n");
+    fprintf(stderr, "   -V     Print a version number and exit\n");
+    fprintf(stderr, "   -b N   The I/O block size, defaults to 1kB\n");
+    fprintf(stderr, "   -m N   The destination member size or 1GB\n");
+    fprintf(stderr, "   -family_to_sec2   Change file driver from family to sec2\n");
+    fprintf(stderr, "   SRC    The name of the source file\n");
+    fprintf(stderr, "   DST	The name of the destination files\n");
+    fprintf(stderr, "Sizes may be suffixed with `g' for GB, `m' for MB or "
+	    "`k' for kB.\n");
+    fprintf(stderr, "File family names include an integer printf "
+	    "format such as `%%d'\n");
+    exit (EXIT_FAILURE);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	get_size
+ *
+ * Purpose:	Reads a size option of the form `-XNS' where `X' is any
+ *		letter, `N' is a multi-character positive decimal number, and
+ *		`S' is an optional suffix letter in the set [GgMmk].  The
+ *		option may also be split among two arguments as: `-X NS'.
+ *		The input value of ARGNO is the argument number for the
+ *		switch in the ARGV vector and ARGC is the number of entries
+ *		in that vector.
+ *
+ * Return:	Success:	The value N multiplied according to the
+ *				suffix S.  On return ARGNO will be the number
+ *				of the next argument to process.
+ *
+ *		Failure:	Calls usage() which exits with a non-zero
+ *				status.
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, May 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static off_t
+get_size (const char *progname, int *argno, int argc, char *argv[])
+{
+    off_t	retval=-1;
+    char	*suffix;
+
+    if (isdigit ((int)(argv[*argno][2]))) {
+	retval = strtol (argv[*argno]+2, &suffix, 10);
+	(*argno)++;
+    } else if (argv[*argno][2] || *argno+1>=argc) {
+	usage (progname);
+    } else {
+	retval = strtol (argv[*argno+1], &suffix, 0);
+	if (suffix==argv[*argno+1]) usage (progname);
+	*argno += 2;
+    }
+    if (suffix && suffix[0] && !suffix[1]) {
+	switch (*suffix) {
+	case 'G':
+	case 'g':
+	    retval *= 1024 * 1024 * 1024;
+	    break;
+	case 'M':
+	case 'm':
+	    retval *= 1024 * 1024;
+	    break;
+	case 'k':
+	    retval *= 1024;
+	    break;
+	default:
+	    usage (progname);
+	}
+    } else if (suffix && suffix[0]) {
+	usage (progname);
+    }
+    return retval;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Split an hdf5 file
+ *
+ * Return:	Success:
+ *
+ *		Failure:
+ *
+ * Programmer:	Robb Matzke
+ *              Wednesday, May 13, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (int argc, char *argv[])
+{
+    const char	*prog_name;		/*program name			*/
+    size_t	blk_size=1024;		/*size of each I/O block	*/
+    char	*buf=NULL;		/*I/O block buffer		*/
+    size_t	n, i;			/*counters			*/
+    ssize_t	nio;			/*I/O return value		*/
+    int		argno=1;		/*program argument number	*/
+    int		src, dst=-1;		/*source & destination files	*/
+    int		need_seek=FALSE;	/*destination needs to seek?	*/
+    int		need_write;		/*data needs to be written?	*/
+    h5_stat_t sb;                       /*temporary file stat buffer	*/
+
+    int		verbose=FALSE;		/*display file names?		*/
+
+    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=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_act_size;		/*source actual member size	*/
+    off_t	dst_size=1 GB;		/*destination logical memb size	*/
+    hid_t       fapl;                   /*file access property list     */
+    hid_t       file;
+    hsize_t     hdsize;                 /*destination logical memb size */
+    hbool_t     family_to_sec2=FALSE;   /*change family to sec2 driver? */
+
+    /*
+     * Get the program name from argv[0]. Use only the last component.
+     */
+    if ((prog_name=strrchr (argv[0], '/'))) prog_name++;
+    else prog_name = argv[0];
+
+    /*
+     * 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);
+        } else if (!strcmp (argv[argno], "-family_to_sec2")) {
+            family_to_sec2 = TRUE;
+            argno++;
+        } else if ('b'==argv[argno][1]) {
+            blk_size = (size_t)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 = (char *)HDcalloc((size_t)NAMELEN, sizeof(char))))
+        exit(EXIT_FAILURE);
+    if(NULL == (dst_name = (char *)HDcalloc((size_t)NAMELEN, sizeof(char))))
+        exit(EXIT_FAILURE);
+
+    /*
+     * Get the name for the source file and open the first member.  The size
+     * of the first member determines the logical size of all the members.
+     */
+    if (argno>=argc) usage (prog_name);
+    src_gen_name = argv[argno++];
+    sprintf (src_name, src_gen_name, src_membno);
+    src_is_family = strcmp (src_name, src_gen_name);
+
+    if ((src=HDopen(src_name, O_RDONLY,0))<0) {
+        perror (src_name);
+        exit (EXIT_FAILURE);
+    }
+
+    if (HDfstat(src, &sb)<0) {
+        perror ("fstat");
+        exit (EXIT_FAILURE);
+    }
+    src_size = src_act_size = sb.st_size;
+    if (verbose) fprintf (stderr, "< %s\n", src_name);
+
+    /*
+     * Get the name for the destination file and open the first member.
+     */
+    if (argno>=argc) usage (prog_name);
+    dst_gen_name = argv[argno++];
+    sprintf (dst_name, dst_gen_name, dst_membno);
+    dst_is_family = strcmp (dst_name, dst_gen_name);
+
+    if ((dst=HDopen (dst_name, O_RDWR|O_CREAT|O_TRUNC, 0666))<0) {
+	perror (dst_name);
+	exit (EXIT_FAILURE);
+    }
+    if (verbose) fprintf (stderr, "> %s\n", dst_name);
+
+    /* No more arguments */
+    if (argno<argc) usage (prog_name);
+
+    /* Now the real work, split the file */
+    buf = (char *)HDmalloc(blk_size);
+    while (src_offset<src_size) {
+
+	/* Read a block.  The amount to read is the minimum of:
+	 *    1. The I/O block size
+	 *    2. What's left to write in the destination member
+	 *    3. Left over zeros or what's left in the source member.
+	 */
+	n = blk_size;
+	if (dst_is_family) n = (size_t)MIN((off_t)n, dst_size-dst_offset);
+	if (left_overs) {
+	    n = (size_t)MIN ((off_t)n, left_overs);
+	    left_overs = left_overs - (off_t)n;
+	    need_write = FALSE;
+	} else if (src_offset<src_act_size) {
+	    n = (size_t)MIN ((off_t)n, src_act_size-src_offset);
+	    if ((nio=HDread (src, buf, n))<0) {
+		perror ("read");
+		exit (EXIT_FAILURE);
+	    } else if ((size_t)nio!=n) {
+		fprintf (stderr, "%s: short read\n", src_name);
+		exit (EXIT_FAILURE);
+	    }
+	    for (i=0; i<n; i++) {
+		if (buf[i]) break;
+	    }
+	    need_write = (i<n);
+	} else {
+	    n = 0;
+	    left_overs = src_size - src_act_size;
+	    need_write = FALSE;
+	}
+
+	/*
+	 * If the block contains non-zero data then write it to the
+	 * destination, otherwise just remember that we'll have to do a seek
+	 * later in the destination when we finally get non-zero data.
+	 */
+	if (need_write) {
+	    if (need_seek && HDlseek (dst, dst_offset, SEEK_SET)<0) {
+		perror ("HDlseek");
+		exit (EXIT_FAILURE);
+	    }
+	    if ((nio=HDwrite (dst, buf, n))<0) {
+		perror ("write");
+		exit (EXIT_FAILURE);
+	    } else if ((size_t)nio!=n) {
+		fprintf (stderr, "%s: short write\n", dst_name);
+		exit (EXIT_FAILURE);
+	    }
+	    need_seek = FALSE;
+	} else {
+	    need_seek = TRUE;
+	}
+
+	/*
+	 * Update the source offset and open the next source family member if
+	 * necessary.  The source stream ends at the first member which
+	 * cannot be opened because it doesn't exist.  At the end of the
+	 * source stream, update the destination offset and break out of the
+	 * loop.   The destination offset must be updated so we can fix
+	 * trailing holes.
+	 */
+	src_offset = src_offset + (off_t)n;
+	if (src_offset==src_act_size) {
+	    HDclose (src);
+	    if (!src_is_family) {
+                dst_offset = dst_offset + (off_t)n;
+		break;
+	    }
+	    sprintf (src_name, src_gen_name, ++src_membno);
+	    if ((src=HDopen (src_name, O_RDONLY,0))<0 && ENOENT==errno) {
+                dst_offset = dst_offset + (off_t)n;
+		break;
+	    } else if (src<0) {
+		perror (src_name);
+		exit (EXIT_FAILURE);
+	    }
+	    if (HDfstat (src, &sb)<0) {
+		perror ("fstat");
+		exit (EXIT_FAILURE);
+	    }
+	    src_act_size = sb.st_size;
+	    if (src_act_size>src_size) {
+		fprintf (stderr, "%s: member truncated to %lu bytes\n",
+			 src_name, (unsigned long)src_size);
+	    }
+	    src_offset = 0;
+	    if (verbose) fprintf (stderr, "< %s\n", src_name);
+	}
+
+	/*
+	 * Update the destination offset, opening a new member if one will be
+	 * needed. The first member is extended to the logical member size
+	 * but other members might be smaller if they end with a hole.
+	 */
+        dst_offset = dst_offset + (off_t)n;
+	if (dst_is_family && dst_offset==dst_size) {
+	    if (0==dst_membno) {
+		if (HDlseek (dst, dst_size-1, SEEK_SET)<0) {
+		    perror ("HDHDlseek");
+		    exit (EXIT_FAILURE);
+		}
+		if (HDread (dst, buf, 1)<0) {
+		    perror ("read");
+		    exit (EXIT_FAILURE);
+		}
+		if (HDlseek (dst, dst_size-1, SEEK_SET)<0) {
+		    perror ("HDlseek");
+		    exit (EXIT_FAILURE);
+		}
+		if (HDwrite (dst, buf, 1)<0) {
+		    perror ("write");
+		    exit (EXIT_FAILURE);
+		}
+	    }
+	    HDclose (dst);
+	    sprintf (dst_name, dst_gen_name, ++dst_membno);
+	    if ((dst=HDopen (dst_name, O_RDWR|O_CREAT|O_TRUNC, 0666))<0) {
+		perror (dst_name);
+		exit (EXIT_FAILURE);
+	    }
+	    dst_offset = 0;
+	    need_seek = FALSE;
+	    if (verbose) fprintf (stderr, "> %s\n", dst_name);
+	}
+    }
+
+    /*
+     * Make sure the last family member is the right size and then close it.
+     * The last member can't end with a hole or hdf5 will think that the
+     * family has been truncated.
+     */
+    if (need_seek) {
+	if (HDlseek (dst, dst_offset-1, SEEK_SET)<0) {
+	    perror ("HDlseek");
+	    exit (EXIT_FAILURE);
+	}
+	if (HDread (dst, buf, 1)<0) {
+	    perror ("read");
+	    exit (EXIT_FAILURE);
+	}
+	if (HDlseek (dst, dst_offset-1, SEEK_SET)<0) {
+	    perror ("HDlseek");
+	    exit (EXIT_FAILURE);
+	}
+	if (HDwrite (dst, buf, 1)<0) {
+	    perror ("write");
+	    exit (EXIT_FAILURE);
+	}
+    }
+    HDclose (dst);
+
+    /* Modify family driver information saved in superblock through private property.
+     * These private properties are for this tool only. */
+    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) {
+        perror ("H5Pcreate");
+        exit (EXIT_FAILURE);
+    }
+
+    if(family_to_sec2) {
+        /* The user wants to change file driver from family to sec2. Open the file
+         * with sec2 driver.  This property signals the library to ignore the family
+         * driver information saved in the superblock. */
+        if(H5Pset(fapl, H5F_ACS_FAMILY_TO_SEC2_NAME, &family_to_sec2) < 0) {
+            perror ("H5Pset");
+            exit (EXIT_FAILURE);
+        }
+    } else {
+        /* Modify family size saved in superblock through private property. It signals
+         * library to save the new member size(specified in command line) in superblock.
+         * This private property is for this tool only. */
+        if(H5Pset_fapl_family(fapl, H5F_FAMILY_DEFAULT, H5P_DEFAULT) < 0) {
+            perror ("H5Pset_fapl_family");
+            exit (EXIT_FAILURE);
+        }
+
+        /* Set the property of the new member size as hsize_t */
+        hdsize = (hsize_t)dst_size;
+        if(H5Pset(fapl, H5F_ACS_FAMILY_NEWSIZE_NAME, &hdsize) < 0) {
+            perror ("H5Pset");
+            exit (EXIT_FAILURE);
+        }
+    }
+
+    /* If the new file is a family file, try to open file for "read and write" to
+     * flush metadata. Flushing metadata will update the superblock to the new
+     * member size.  If the original file is a family file and the new file is a sec2
+     * file, the property FAMILY_TO_SEC2 will signal the library to switch to sec2
+     * driver when the new file is opened.  If the original file is a sec2 file and the
+     * new file can only be a sec2 file, reopen the new file should fail.  There's
+     * nothing to do in this case. */
+    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(src_name);
+    HDfree(dst_name);
+    HDfree(buf);
+    return EXIT_SUCCESS;
+} /* end main */
diff --git a/tools/test/CMakeLists.txt b/tools/test/CMakeLists.txt
new file mode 100644
index 0000000..a7dd11f
--- /dev/null
+++ b/tools/test/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST)
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-- Add the h5diff tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5diff)
+
+#-- Add the h5ls tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5ls)
+
+#-- Misc tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/misc)
+
+#-- Add the h5import tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5import)
+
+#-- h5Repack tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5repack)
+
+#-- Add the h5jam tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5jam)
+
+#-- Add the h5copy tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5copy)
+
+#-- Add the h5stat tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5stat)
+
+#-- Add the h5dump tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5dump)
+
+#-- Add the h5format_convert and test executables
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/h5format_convert)
+
+#-- Add the perform tests
+add_subdirectory (${HDF5_TOOLS_TEST_SOURCE_DIR}/perform)
diff --git a/tools/test/Makefile.am b/tools/test/Makefile.am
new file mode 100644
index 0000000..19bb047
--- /dev/null
+++ b/tools/test/Makefile.am
@@ -0,0 +1,28 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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.
+##
+#
+# Tools HDF5 Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+CONFIG=ordered
+
+# All subdirectories
+SUBDIRS=h5diff h5ls h5dump misc h5import h5repack h5jam h5copy \
+	h5format_convert h5stat perform
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/Makefile.in b/tools/test/Makefile.in
new file mode 100644
index 0000000..023a1d9
--- /dev/null
+++ b/tools/test/Makefile.in
@@ -0,0 +1,1433 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tools HDF5 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@
+TESTS =
+subdir = tools/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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_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 = 
+SOURCES =
+DIST_SOURCES =
+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
+# *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)
+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
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(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@
+
+# 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@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+CONFIG = ordered
+
+# All subdirectories
+SUBDIRS = h5diff h5ls h5dump misc h5import h5repack h5jam h5copy \
+	h5format_convert h5stat perform
+
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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-recursive
+
+.SUFFIXES:
+.SUFFIXES: .log .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/test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/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):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+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-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 \
+	  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-recursive
+
+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-recursive
+
+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 
+	@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
+	@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-TESTS
+check: check-recursive
+all-am: Makefile all-local
+installdirs: installdirs-recursive
+installdirs-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-recursive
+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-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.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-generic clean-libtool \
+	cscopelist-am ctags ctags-am distclean 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 installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean 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-dyn: $(DYN)
+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 dyn 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/test/h5copy/CMakeLists.txt b/tools/test/h5copy/CMakeLists.txt
new file mode 100644
index 0000000..4a519ab
--- /dev/null
+++ b/tools/test/h5copy/CMakeLists.txt
@@ -0,0 +1,23 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5COPY)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+# --------------------------------------------------------------------
+# Add the h5copy test executables
+# --------------------------------------------------------------------
+
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5copygentest ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/h5copygentest.c)
+    TARGET_NAMING (h5copygentest STATIC)
+    TARGET_C_PROPERTIES (h5copygentest STATIC " " " ")
+    target_link_libraries (h5copygentest ${HDF5_LIB_TARGET})
+    set_target_properties (h5copygentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5copygentest COMMAND $<TARGET_FILE:h5copygentest>)
+  endif ()
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5copy/CMakeTests.cmake b/tools/test/h5copy/CMakeTests.cmake
new file mode 100644
index 0000000..2536ef3
--- /dev/null
+++ b/tools/test/h5copy/CMakeTests.cmake
@@ -0,0 +1,434 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the source directory into the test directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/testfiles/h5copy_extlinks_src.h5
+      ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/testfiles/h5copy_extlinks_trg.h5
+      ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/testfiles/h5copy_ref.h5
+      ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/testfiles/h5copytst.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5COPY_SOURCE_DIR}/testfiles/h5copy_misc1.out
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+
+  foreach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+    get_filename_component(fname "${listfiles}" NAME)
+    HDFTEST_COPY_FILE("${listfiles}" "${PROJECT_BINARY_DIR}/testfiles/${fname}" "h5copy_files")
+  endforeach ()
+  add_custom_target(h5copy_files ALL COMMENT "Copying files needed by h5copy tests" DEPENDS ${h5copy_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  #
+  # Perform h5copy according to passing parmeters
+  #
+  macro (ADD_H5_F_TEST testname resultcode infile fparam vparam sparam srcname dparam dstname)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5COPY_F-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ./testfiles/${testname}.out.h5
+      )
+    endif ()
+
+    add_test (
+        NAME H5COPY_F-${testname}
+        COMMAND $<TARGET_FILE:h5copy> -f ${fparam} -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
+    )
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5COPY_F-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      set_tests_properties (H5COPY_F-${testname} PROPERTIES DEPENDS H5COPY_F-${testname}-clear-objects)
+    endif ()
+
+    # resultcode=2 will cause the test to skip the diff test
+    if (NOT ${resultcode} STREQUAL "2")
+      add_test (
+          NAME H5COPY_F-${testname}-DIFF
+          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
+      )
+      SET_TESTS_PROPERTIES(H5COPY_F-${testname}-DIFF PROPERTIES DEPENDS H5COPY_F-${testname})
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5COPY_F-${testname}-DIFF PROPERTIES WILL_FAIL "true")
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST testname resultcode infile vparam sparam srcname dparam dstname)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5COPY-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ./testfiles/${testname}.out.h5
+      )
+    endif ()
+
+    add_test (
+        NAME H5COPY-${testname}
+        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
+    )
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS H5COPY-${testname}-clear-objects)
+    endif ()
+
+    # resultcode=2 will cause the test to skip the diff test
+    if (NOT ${resultcode} STREQUAL "2")
+      add_test (
+          NAME H5COPY-${testname}-DIFF
+          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
+      )
+      SET_TESTS_PROPERTIES(H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_SKIP_H5_TEST testname skipresultfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5COPY-${testname}-${skipresultfile}-SKIPPED
+          COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${testname}-${skipresultfile} ${ARGN}"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST2 testname resultcode infile  psparam pdparam vparam sparam srcname dparam dstname)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5COPY-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ./testfiles/${testname}.out.h5
+      )
+    endif ()
+
+    add_test (
+        NAME H5COPY-${testname}-prefill
+        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 -v -s ${psparam} -d ${pdparam}
+    )
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5COPY-${testname}-prefill PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      set_tests_properties (H5COPY-${testname}-prefill PROPERTIES DEPENDS H5COPY-${testname}-clear-objects)
+    endif ()
+
+    add_test (
+        NAME H5COPY-${testname}
+        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
+    )
+    set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS H5COPY-${testname}-prefill)
+    # resultcode=2 will cause the test to skip the diff test
+    if (NOT ${resultcode} STREQUAL "2")
+      add_test (
+          NAME H5COPY-${testname}-DIFF
+          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
+      )
+      SET_TESTS_PROPERTIES(H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_SAME testname resultcode pfile psparam pdparam vparam sparam srcname dparam dstname)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5COPY_SAME-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ./testfiles/${testname}.out.h5
+      )
+    endif ()
+
+    add_test (
+        NAME H5COPY_SAME-${testname}-prefill
+        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${pfile} -o ./testfiles/${testname}.out.h5 -v -s ${psparam} -d ${pdparam}
+    )
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5COPY_SAME-${testname}-prefill PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      set_tests_properties (H5COPY_SAME-${testname}-prefill PROPERTIES DEPENDS H5COPY_SAME-${testname}-clear-objects)
+    endif ()
+
+    add_test (
+        NAME H5COPY_SAME-${testname}
+        COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${testname}.out.h5 -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN}
+    )
+    set_tests_properties (H5COPY_SAME-${testname} PROPERTIES DEPENDS H5COPY_SAME-${testname}-prefill)
+    # resultcode=2 will cause the test to skip the diff test
+    if (NOT ${resultcode} STREQUAL "2")
+      add_test (
+          NAME H5COPY_SAME-${testname}-DIFF
+          COMMAND $<TARGET_FILE:h5diff> -q ./testfiles/${testname}.out.h5 ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
+      )
+      SET_TESTS_PROPERTIES(H5COPY_SAME-${testname}-DIFF PROPERTIES DEPENDS H5COPY_SAME-${testname})
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5COPY_SAME-${testname}-DIFF PROPERTIES WILL_FAIL "true")
+      endif ()
+    endif ()
+  endmacro ()
+
+  #
+  # Similiar to ADD_H5_TEST macro. Compare to outputs from source & target
+  # files instead of checking with h5ls.
+  #
+  macro (ADD_H5_CMP_TEST testname resultcode infile vparam sparam srcname dparam dstname)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5COPY-CMP-${testname} COMMAND $<TARGET_FILE:h5copy> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN})
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5COPY-CMP-${testname} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5COPY-CMP-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5COPY-CMP-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ./testfiles/${testname}.out.h5
+      )
+      add_test (
+          NAME H5COPY-CMP-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5copy>"
+              -D "TEST_ARGS=-i;./testfiles/${infile};-o;./testfiles/${testname}.out.h5;${vparam};${sparam};${srcname};${dparam};${dstname}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=./testfiles/${testname}.out.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=./testfiles/${testname}.out"
+              -D "TEST_MASK=true"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5COPY-CMP-${testname} PROPERTIES DEPENDS H5COPY-CMP-${testname}-clear-objects)
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # test file names
+  # --------------------------------------------------------------------
+  set (HDF_FILE1 h5copytst)
+  set (HDF_FILE2 h5copy_ref)
+  set (HDF_EXT_SRC_FILE h5copy_extlinks_src)
+  set (HDF_EXT_TRG_FILE h5copy_extlinks_trg)
+
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    # Remove any output file left over from previous test run
+    add_test (
+        NAME H5COPY-clearall-objects
+        COMMAND    ${CMAKE_COMMAND}
+            -E remove
+            simple.out.h5
+            chunk.out.h5
+            compact.out.h5
+            compound.out.h5
+            compressed.out.h5
+            named_vl.out.h5
+            nested_vl.out.h5
+            simple_top.out.h5
+            dsrename.out.h5
+            grp_empty.out.h5
+            grp_dsets.out.h5
+            grp_nested.out.h5
+            simple_group.out.h5
+            grp_rename.out.h5
+            grp_dsets_rename.out.h5
+            A_B1_simple.out.h5
+            A_B2_simple2.out.h5
+            C_D_simple.out.h5
+            E_F_grp_dsets.out.h5
+            G_H_grp_nested.out.h5
+            region_ref.out.h5
+            ext_link.out.h5
+            ext_link_f.out.h5
+            ext_dangle_noobj.out.h5
+            ext_dangle_noobj_f.out.h5
+            ext_dangle_nofile.out.h5
+            ext_dangle_nofile_f.out.h5
+            ext_link_group.out.h5
+            ext_link_group_f.out.h5
+            samefile1.out.h5
+            samefile2.out.h5
+            h5copy_misc1.out.h5
+            h5copy_misc1.out.out
+            h5copy_misc1.out.out.err
+    )
+    set_tests_properties (H5COPY-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5COPY-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5COPY-clearall-objects")
+  endif ()
+
+# 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 ()
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif ()
+
+  # "Test copying various forms of datasets"
+  ADD_H5_TEST (simple 0 ${HDF_FILE1}.h5 -v -s simple -d simple)
+  ADD_H5_TEST (chunk 0 ${HDF_FILE1}.h5 -v -s chunk -d chunk)
+  ADD_H5_TEST (compact 0 ${HDF_FILE1}.h5 -v -s compact -d compact)
+  ADD_H5_TEST (compound 0 ${HDF_FILE1}.h5 -v -s compound -d compound)
+
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_TEST (compressed 0 ${HDF_FILE1}.h5 -v -s compressed -d compressed)
+  else ()
+    ADD_H5_TEST (compressed 2 ${HDF_FILE1}.h5 -v -s compressed -d compressed)
+  endif ()
+
+  ADD_H5_TEST (named_vl 0 ${HDF_FILE1}.h5 -v -s named_vl -d named_vl)
+  ADD_H5_TEST (nested_vl 0 ${HDF_FILE1}.h5 -v -s nested_vl -d nested_vl)
+  ADD_H5_TEST (dset_attr 0 ${HDF_FILE1}.h5 -v -s dset_attr -d dset_attr)
+
+  # "Test copying dataset within group in source file to root of destination"
+  ADD_H5_TEST (simple_top 0 ${HDF_FILE1}.h5 -v -s grp_dsets/simple -d simple_top)
+
+  # "Test copying & renaming dataset"
+  ADD_H5_TEST (dsrename 0 ${HDF_FILE1}.h5 -v -s compound -d rename)
+
+  # "Test copying empty, 'full' & 'nested' groups"
+  ADD_H5_TEST (grp_empty 0 ${HDF_FILE1}.h5 -v -s grp_empty -d grp_empty)
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_TEST (grp_dsets 0 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_dsets)
+    ADD_H5_TEST (grp_nested 0 ${HDF_FILE1}.h5 -v -s grp_nested -d grp_nested)
+  else ()
+    ADD_H5_TEST (grp_dsets 2 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_dsets)
+    ADD_H5_TEST (grp_nested 2 ${HDF_FILE1}.h5 -v -s grp_nested -d grp_nested)
+  endif ()
+  ADD_H5_TEST (grp_attr 0 ${HDF_FILE1}.h5 -v -s grp_attr -d grp_attr)
+
+  # "Test copying dataset within group in source file to group in destination"
+  ADD_H5_TEST2 (simple_group 0 ${HDF_FILE1}.h5 grp_dsets grp_dsets -v -s /grp_dsets/simple -d /grp_dsets/simple_group)
+
+  if (USE_FILTER_DEFLATE)
+    # "Test copying & renaming group"
+    ADD_H5_TEST (grp_rename 0 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_rename)
+    # "Test copying 'full' group hierarchy into group in destination file"
+    ADD_H5_TEST2 (grp_dsets_rename 0 ${HDF_FILE1}.h5 grp_dsets grp_rename -v -s grp_dsets -d /grp_rename/grp_dsets)
+  else ()
+    # "Test copying & renaming group"
+    ADD_H5_TEST (grp_rename 2 ${HDF_FILE1}.h5 -v -s grp_dsets -d grp_rename)
+    # "Test copying 'full' group hierarchy into group in destination file"
+    ADD_H5_TEST2 (grp_dsets_rename 2 ${HDF_FILE1}.h5 grp_dsets grp_rename -v -s grp_dsets -d /grp_rename/grp_dsets)
+  endif ()
+
+  # "Test copying objects into group hier. that doesn't exist yet in destination file"
+  ADD_H5_TEST (A_B1_simple 0 ${HDF_FILE1}.h5 -vp -s simple -d /A/B1/simple)
+  ADD_H5_TEST (A_B2_simple2 0 ${HDF_FILE1}.h5 -vp -s simple -d /A/B2/simple2)
+  ADD_H5_TEST (C_D_simple 0 ${HDF_FILE1}.h5 -vp -s /grp_dsets/simple -d /C/D/simple)
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_TEST (E_F_grp_dsets 0 ${HDF_FILE1}.h5 -vp -s /grp_dsets -d /E/F/grp_dsets)
+    ADD_H5_TEST (G_H_grp_nested 0 ${HDF_FILE1}.h5 -vp -s /grp_nested -d /G/H/grp_nested)
+  else ()
+    ADD_H5_TEST (E_F_grp_dsets 2 ${HDF_FILE1}.h5 -vp -s /grp_dsets -d /E/F/grp_dsets)
+    ADD_H5_TEST (G_H_grp_nested 2 ${HDF_FILE1}.h5 -vp -s /grp_nested -d /G/H/grp_nested)
+  endif ()
+
+############# COPY REFERENCES ##############
+
+  # "Test copying object and region references"
+  ADD_H5_F_TEST (region_ref 2 ${HDF_FILE2}.h5 ref -v -s / -d /COPY)
+
+############# COPY EXT LINKS ##############
+
+  # "Test copying external link directly without -f ext"
+  ADD_H5_TEST (ext_link 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_dset -d /copy1_dset)
+
+  # "Test copying external link directly with -f ext"
+  ADD_H5_F_TEST (ext_link_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_dset -d /copy2_dset)
+
+  # "Test copying dangling external link (no obj) directly without -f ext"
+  ADD_H5_TEST (ext_dangle_noobj 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_1)
+
+  # "Test copying dangling external link (no obj) directly with -f ext"
+  ADD_H5_F_TEST (ext_dangle_noobj_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_2)
+
+  # "Test copying dangling external link (no file) directly without -f ext"
+  ADD_H5_TEST (ext_dangle_nofile 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_1)
+
+  # "Test copying dangling external link (no file) directly with -f ext"
+  ADD_H5_F_TEST (ext_dangle_nofile_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_2)
+
+  # "Test copying a group contains external links without -f ext"
+  ADD_H5_TEST (ext_link_group 2 ${HDF_EXT_SRC_FILE}.h5 -v -s /group_ext -d /copy1_group)
+
+  # "Test copying a group contains external links with -f ext"
+  ADD_H5_F_TEST (ext_link_group_f 2 ${HDF_EXT_SRC_FILE}.h5 ext -v -s /group_ext -d /copy2_group)
+
+############# Test misc. ##############
+
+  #-----------------------------------------------------------------
+  # "Test copying object into group which doesn't exist, without -p"
+  #
+  ADD_H5_CMP_TEST (h5copy_misc1 1 ${HDF_FILE1}.h5 -v -s /simple -d /g1/g2/simple)
+
+  #-------------------------------------------
+  # "Test copying objects to the same file "
+  #
+  # - dataset
+  ADD_H5_TEST_SAME (samefile1 0 ${HDF_FILE1}.h5 /simple /simple -v -s /simple -d /simple_cp)
+  # - group with some datasets
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_TEST_SAME (samefile2 0 ${HDF_FILE1}.h5 /grp_dsets /grp_dsets -v -s /grp_dsets -d /grp_dsets_cp)
+  else ()
+    ADD_H5_TEST_SAME (samefile2 2 ${HDF_FILE1}.h5 /grp_dsets /grp_dsets -v -s /grp_dsets -d /grp_dsets_cp)
+  endif ()
diff --git a/tools/test/h5copy/Makefile.am b/tools/test/h5copy/Makefile.am
new file mode 100644
index 0000000..5fda4a0
--- /dev/null
+++ b/tools/test/h5copy/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Test programs and scripts
+TEST_PROG=h5copygentest
+TEST_SCRIPT=testh5copy.sh
+
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5copy/h5copy$(EXEEXT)
+
+# This is our main target, the h5copy tool
+check_PROGRAMS=$(TEST_PROG)
+
+# source file for the test file generator
+h5copygentest_SOURCES=h5copygentest.c
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES+=*.h5
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5copy/Makefile.in b/tools/test/h5copy/Makefile.in
new file mode 100644
index 0000000..97ea019
--- /dev/null
+++ b/tools/test/h5copy/Makefile.in
@@ -0,0 +1,1425 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5copy.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = h5copygentest$(EXEEXT)
+am_h5copygentest_OBJECTS = h5copygentest.$(OBJEXT)
+h5copygentest_OBJECTS = $(am_h5copygentest_OBJECTS)
+h5copygentest_LDADD = $(LDADD)
+h5copygentest_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 = 
+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 = $(h5copygentest_SOURCES)
+DIST_SOURCES = $(h5copygentest_SOURCES)
+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)/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@
+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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
+
+# Test programs and scripts
+TEST_PROG = h5copygentest
+TEST_SCRIPT = testh5copy.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5copy/h5copy$(EXEEXT)
+
+# source file for the test file generator
+h5copygentest_SOURCES = h5copygentest.c
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5copy/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5copy/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):
+testh5copy.sh: $(top_builddir)/config.status $(srcdir)/testh5copy.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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
+
+h5copygentest$(EXEEXT): $(h5copygentest_OBJECTS) $(h5copygentest_DEPENDENCIES) $(EXTRA_h5copygentest_DEPENDENCIES) 
+	@rm -f h5copygentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5copygentest_OBJECTS) $(h5copygentest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5copygentest.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+h5copygentest.log: h5copygentest$(EXEEXT)
+	@p='h5copygentest$(EXEEXT)'; \
+	b='h5copygentest'; \
+	$(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 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-dyn: $(DYN)
+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 dyn 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/test/h5copy/h5copygentest.c b/tools/test/h5copy/h5copygentest.c
new file mode 100644
index 0000000..ed41998
--- /dev/null
+++ b/tools/test/h5copy/h5copygentest.c
@@ -0,0 +1,1002 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Generate the binary hdf5 file for the h5copy tests
+ */
+#include <stdlib.h>
+#include "hdf5.h"
+#include "H5private.h"
+
+/* 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"
+
+/* objects in HDF_FILE1 */
+#define DATASET_SIMPLE          "simple"
+#define DATASET_CHUNK           "chunk"
+#define DATASET_COMPACT         "compact"
+#define DATASET_COMPOUND        "compound"
+#define DATASET_COMPRESSED      "compressed"
+#define DATASET_NAMED_VL        "named_vl"
+#define DATASET_NESTED_VL       "nested_vl"
+#define DATASET_ATTR		"dset_attr"
+#define ATTR			"attr"
+#define GROUP_EMPTY             "grp_empty"
+#define GROUP_DATASETS          "grp_dsets"
+#define GROUP_NESTED            "grp_nested"
+#define GROUP_ATTR		"grp_attr"
+
+/* Obj reference */
+#define OBJ_REF_DS "Dset1"
+#define OBJ_REF_GRP "Group"
+/* Region reference */
+#define REG_REF_DS1 "Dset_REGREF"
+#define REG_REF_DS2 "Dset2"
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_simple
+ *
+ * Purpose:     Generate a simple dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_simple(hid_t loc_id)
+{
+    hid_t   sid, did;
+    hsize_t dims[1] = {6};
+    int     buf[6]  = {1,2,3,4,5,6};
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_SIMPLE, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Sclose(sid);
+    H5Dclose(did);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_chunked
+ *
+ * Purpose:     Generate a chunked dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_chunked(hid_t loc_id)
+{
+    hid_t   sid, did, pid;
+    hsize_t dims[1] = {6};
+    hsize_t chunk_dims[1] = {2};
+    int     buf[6]  = {1,2,3,4,5,6};
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create property plist */
+    pid = H5Pcreate(H5P_DATASET_CREATE);
+    H5Pset_chunk(pid, 1, chunk_dims);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_CHUNK, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Pclose(pid);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_compact
+ *
+ * Purpose:     Generate a compact dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_compact(hid_t loc_id)
+{
+    hid_t   sid, did, pid;
+    hsize_t dims[1] = {6};
+    int     buf[6]  = {1,2,3,4,5,6};
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create property plist  */
+    pid = H5Pcreate(H5P_DATASET_CREATE);
+    H5Pset_layout (pid,H5D_COMPACT);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_COMPACT, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Pclose(pid);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_compound
+ *
+ * Purpose:     Generate a compound dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_compound(hid_t loc_id)
+{
+    typedef struct s_t
+    {
+        char str1[20];
+        char str2[20];
+    } s_t;
+    hid_t   sid, did, tid_c, tid_s;
+    hsize_t dims[1] = {2};
+    s_t     buf[2]  = {{"str1", "str2"}, {"str3", "str4"}};
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create a compound type */
+    tid_c = H5Tcreate(H5T_COMPOUND, sizeof(s_t));
+    tid_s = H5Tcopy(H5T_C_S1);
+    H5Tset_size(tid_s, 20);
+
+    H5Tinsert(tid_c, "str1", HOFFSET(s_t,str1), tid_s);
+    H5Tinsert(tid_c, "str2", HOFFSET(s_t,str2), tid_s);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_COMPOUND, tid_c, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, tid_c, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Tclose(tid_c);
+    H5Tclose(tid_s);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_compressed
+ *
+ * Purpose:     Generate a compressed dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_compressed(hid_t loc_id)
+{
+    hid_t   sid, did, pid;
+    hsize_t dims[1] = {6};
+    hsize_t chunk_dims[1] = {2};
+    int     buf[6]  = {1,2,3,4,5,6};
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create property plist for chunk*/
+    pid = H5Pcreate(H5P_DATASET_CREATE);
+    H5Pset_chunk(pid, 1, chunk_dims);
+
+    /* set the deflate filter */
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    H5Pset_deflate(pid, 1);
+#endif
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_COMPRESSED, H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Pclose(pid);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_named_vl
+ *
+ * Purpose:     Generate a variable lenght named datatype for a dataset in
+                LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_named_vl(hid_t loc_id)
+{
+    hid_t   sid, did, tid;
+    hsize_t dims[1] = {2};
+    hvl_t   buf[2];
+
+    /* allocate and initialize VL dataset to write */
+    buf[0].len = 1;
+    buf[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf[0].p)[0]=1;
+    buf[1].len = 2;
+    buf[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf[1].p)[0]=2;
+    ((int *)buf[1].p)[1]=3;
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create datatype */
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+
+    /* create named datatype */
+    H5Tcommit2(loc_id, "vl", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_NAMED_VL, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf);
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Tclose(tid);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_nested_vl
+ *
+ * Purpose:     Generate a nested variable length dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_nested_vl(hid_t loc_id)
+{
+    hid_t   sid, did, tid1, tid2;
+    hsize_t dims[1] = {2};
+    hvl_t   buf[2];
+    hvl_t   *tvl;
+
+    /* allocate and initialize VL dataset to write */
+    buf[0].len = 1;
+    buf[0].p = HDmalloc( 1 * sizeof(hvl_t));
+    tvl = (hvl_t *)buf[0].p;
+    tvl->p = HDmalloc( 1 * sizeof(int) );
+    tvl->len = 1;
+    ((int *)tvl->p)[0]=1;
+
+    buf[1].len = 1;
+    buf[1].p = HDmalloc( 1 * sizeof(hvl_t));
+    tvl = (hvl_t *)buf[1].p;
+    tvl->p = HDmalloc( 2 * sizeof(int) );
+    tvl->len = 2;
+    ((int *)tvl->p)[0]=2;
+    ((int *)tvl->p)[1]=3;
+
+    /* create dataspace */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create datatype */
+    tid1 = H5Tvlen_create(H5T_NATIVE_INT);
+
+    /* create nested VL datatype */
+    tid2 = H5Tvlen_create(tid1);
+
+    /* create dataset */
+    did = H5Dcreate2(loc_id, DATASET_NESTED_VL, tid2, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* close */
+    H5Dvlen_reclaim(tid2,sid,H5P_DEFAULT,buf);
+    H5Sclose(sid);
+    H5Dclose(did);
+    H5Tclose(tid1);
+    H5Tclose(tid2);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_att_compound_vlstr
+ *
+ * Purpose:     Generate a dataset and a group.
+ *		Both has an attribute with a compound datatype consisting 
+ *		of a variable length string
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_att_compound_vlstr(hid_t loc_id)
+{
+    typedef struct { /* Compound structure for the attribute */
+        int i;
+        char *v;
+    } s1;
+    hsize_t dim[1] = {1};	/* Dimension size */
+    hid_t sid = -1; 		/* Dataspace ID */
+    hid_t tid = -1; 		/* Datatype ID */
+    hid_t aid = -1; 		/* Attribute ID */
+    hid_t did = -1; 		/* Dataset ID */
+    hid_t gid = -1; 		/* Group ID */
+    hid_t vl_str_tid = -1;	/* Variable length datatype ID */
+    hid_t cmpd_tid = -1;	/* Compound datatype ID */
+    hid_t null_sid = -1;	/* Null dataspace ID */
+    s1 buf;			/* Buffer */
+
+    buf.i = 9;
+    buf.v = "ThisIsAString";
+
+    /* Create an integer datatype */
+    tid = H5Tcopy(H5T_NATIVE_INT);
+
+    /* Create a variable length string */
+    vl_str_tid = H5Tcopy(H5T_C_S1);
+    H5Tset_size(vl_str_tid, H5T_VARIABLE);
+
+    /* Create a compound datatype with a variable length string and an integer */
+    cmpd_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1));
+    H5Tinsert(cmpd_tid, "i", HOFFSET(s1, i), tid);
+    H5Tinsert(cmpd_tid, "v", HOFFSET(s1, v), vl_str_tid);
+
+    /* Create a dataset */
+    null_sid = H5Screate(H5S_NULL);
+    did = H5Dcreate2(loc_id, DATASET_ATTR, H5T_NATIVE_INT, null_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Attach an attribute with the compound datatype to the dataset */
+    sid = H5Screate_simple(1, dim, dim);
+    aid = H5Acreate2(did, ATTR, cmpd_tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write the attribute */
+    buf.i = 9;
+    buf.v = "ThisIsAString";
+    H5Awrite(aid, cmpd_tid, &buf);
+
+    /* Close the dataset and its attribute */
+    H5Dclose(did);
+    H5Aclose(aid);
+
+    /* Create a group */
+    gid = H5Gcreate2(loc_id, GROUP_ATTR, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Attach an attribute with the compound datatype to the group */
+    aid = H5Acreate2(gid, ATTR, cmpd_tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(aid, cmpd_tid, &buf);
+
+    /* Close the group and its attribute */
+    H5Aclose(aid);
+    H5Gclose(gid);
+
+    /* Close dataspaces */
+    H5Sclose(sid);
+    H5Sclose(null_sid);
+
+    /* Close datatypes */
+    H5Tclose(tid);
+    H5Tclose(vl_str_tid);
+    H5Tclose(cmpd_tid);
+
+} /* gen_att_compound_vlstr() */
+
+/*-------------------------------------------------------------------------
+ * Function: gent_datasets
+ *
+ * Purpose: Generate all datasets in a particular location
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_datasets(hid_t loc_id)
+{
+    gent_simple(loc_id);
+    gent_chunked(loc_id);
+    gent_compact(loc_id);
+    gent_compound(loc_id);
+    gent_compressed(loc_id);
+    gent_named_vl(loc_id);
+    gent_nested_vl(loc_id);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_empty_group
+ *
+ * Purpose: Generate an empty group in a location
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_empty_group(hid_t loc_id)
+{
+    hid_t   gid;
+
+    /* Create group in location */
+    gid = H5Gcreate2(loc_id, GROUP_EMPTY, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Release resources */
+    H5Gclose(gid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_nested_datasets
+ *
+ * Purpose: Generate a group in a location and populate it with the "standard"
+ *    datasets
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_nested_datasets(hid_t loc_id)
+{
+    hid_t   gid;
+
+    /* Create group in location */
+    gid = H5Gcreate2(loc_id, GROUP_DATASETS, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Add datasets to group created */
+    gent_datasets(gid);
+
+    /* Release resources */
+    H5Gclose(gid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_nested_group
+ *
+ * Purpose: Generate a group in a location and populate it with another group
+ *    containing the "standard" datasets
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_nested_group(hid_t loc_id)
+{
+    hid_t   gid;
+
+    /* Create group in location */
+    gid = H5Gcreate2(loc_id, GROUP_NESTED, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Add datasets to group created */
+    gent_nested_datasets(gid);
+
+    /* Release resources */
+    H5Gclose(gid);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gen_obj_ref
+ *
+ * Purpose: Generate object references to dataset and group
+ *
+ * Programmer: Jonathan Kim (Feb 23, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_obj_ref(hid_t loc_id)
+{
+    hid_t sid=0, oid=0;
+    hsize_t dims1[1]={3};
+    hsize_t dims2[1]={2};
+    int data[3] = {10,20,30};
+    int status;
+
+    /*---------------------
+     * create obj references to the previously created objects.
+     * Passing -1 as reference is an object.*/
+    hobj_ref_t or_data[2];  /* write buffer */
+    herr_t ret = SUCCEED;
+
+    /*--------------
+     * add dataset */
+    sid = H5Screate_simple(1, dims1, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    oid = H5Dcreate2 (loc_id, OBJ_REF_DS, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (oid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(oid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    H5Dclose(oid);
+    H5Sclose(sid);
+
+    /*--------------
+     * add group  */
+    oid = H5Gcreate2 (loc_id, OBJ_REF_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (oid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    H5Gclose(oid);
+
+    status = H5Rcreate (&or_data[0], loc_id, OBJ_REF_DS, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    status = H5Rcreate (&or_data[1], loc_id, OBJ_REF_GRP, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    sid = H5Screate_simple (1, dims2, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    oid = H5Dcreate2 (loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (oid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, or_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if(oid > 0)
+        H5Dclose(oid);
+    if(sid > 0)
+        H5Sclose(sid);
+
+    return ret;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gen_region_ref
+ *
+ * Purpose: Generate dataset region references
+ *
+ * Programmer: Jonathan Kim (Feb 23, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_region_ref(hid_t loc_id)
+{
+    hid_t sid=0, oid1=0, oid2=0;
+    int status;
+    herr_t ret = SUCCEED;
+    char  data[3][16] = {"The quick brown", "fox jumps over ", "the 5 lazy dogs"};
+    hsize_t dims2[2] = {3,16};
+    hsize_t coords[4][2] = { {0,1}, {2,11}, {1,0}, {2,4} };
+    hdset_reg_ref_t  rr_data[2];
+    hsize_t start[2] = {0,0};
+    hsize_t stride[2] = {2,11};
+    hsize_t count[2] = {2,2};
+    hsize_t block[2] = {1,3};
+    hsize_t dims1[1] = {2};
+
+    sid = H5Screate_simple (2, dims2, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create normal dataset which is refered */
+    oid2 = H5Dcreate2 (loc_id, REG_REF_DS2, H5T_STD_I8LE, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (oid2 < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* write values to dataset */
+    status = H5Dwrite (oid2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* select elements space for reference */
+    status = H5Sselect_elements (sid, H5S_SELECT_SET, 4, coords[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference from elements space */
+    status = H5Rcreate (&rr_data[0], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* select hyperslab space for reference */
+    status = H5Sselect_hyperslab (sid, H5S_SELECT_SET, start, stride, count, block);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference from hyperslab space */
+    status = H5Rcreate (&rr_data[1], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    H5Sclose (sid);
+
+    /* Create dataspace. */
+    sid = H5Screate_simple (1, dims1, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference dataset */
+    oid1 = H5Dcreate2 (loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (oid1 < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* write data as region references */
+    status = H5Dwrite (oid1, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if (oid1 > 0)
+        H5Dclose (oid1);
+    if (oid2 > 0)
+        H5Dclose (oid2);
+    if (sid > 0)
+        H5Sclose (sid);
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: Test_Obj_Copy
+ *
+ * Purpose: Testing with various objects
+ *
+ *------------------------------------------------------------------------*/
+static void Test_Obj_Copy(void)
+{
+    hid_t fid = -1;		        /* File id */
+    hid_t fapl_new = (-1);	        /* File access property id */
+    unsigned new_format;		/* New format or old format */
+
+    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_att_compound_vlstr(fid);
+
+        H5Fclose(fid);
+        fid = (-1);
+    } /* end for */
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *------------------------------------------------------------------------*/
+    if(fid > 0)
+        H5Fclose(fid);
+    if(fapl_new > 0)
+        H5Pclose(fapl_new);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: Test_Ref_Copy
+ *
+ * Purpose: Testing with various references
+ *
+ *------------------------------------------------------------------------*/
+static void Test_Ref_Copy(void)
+{
+    hid_t fid=0;
+    herr_t status;
+
+    fid = H5Fcreate (HDF_FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_FILE2);
+        goto out;
+    }
+
+    /* add object reference */
+    status = gen_obj_ref(fid);
+    if (status < 0)
+        fprintf(stderr, "Failed to generate object reference.\n");
+
+    /* add region reference */
+    status = gen_region_ref(fid);
+    if (status < 0)
+        fprintf(stderr, "Failed to generate region reference.\n");
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *------------------------------------------------------------------------*/
+    if(fid > 0)
+        H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_extlink_trg
+ *
+ * Purpose: generate target external link objs
+ *
+ * Programmer: Jonathan Kim (March 03, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_extlink_trg(hid_t loc_id)
+{
+    hid_t gid=0, tid=0;
+    int status;
+    herr_t ret = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    /*--------------
+     * target file */
+    gid = H5Gcreate2(loc_id, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*--------------
+     * add dataset */
+     gent_simple(loc_id);
+
+    /*--------------------
+     * add named datatype
+     */
+     tid = H5Tcopy(H5T_NATIVE_INT);
+     status = H5Tcommit2(loc_id, "datatype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if(gid > 0)
+        H5Gclose(gid);
+    if(tid > 0)
+        H5Tclose(tid);
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_extlink_src
+ *
+ * Purpose: generate source external link objs
+ *
+ * Programmer: Jonathan Kim (March 03, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_extlink_src(hid_t loc_id)
+{
+    hid_t gid=0;
+    int status;
+    herr_t ret = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    gid = H5Gcreate2(loc_id, "/group_ext", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * External links
+    *------------------------------------------------------------------------*/
+    /* link to dataset */
+    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/simple", gid, "extlink_dset", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* link to group */
+    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/group", gid, "extlink_grp", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* link to datatype */
+    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/datatype", gid, "extlink_datatype", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* dangling link - no obj*/
+    status = H5Lcreate_external(HDF_EXT_TRG_FILE, "notyet", gid, "extlink_notyet1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* dangling link - no file */
+    status = H5Lcreate_external("notyet_file.h5", "notyet", gid, "extlink_notyet2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if(gid > 0)
+        H5Gclose(gid);
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: Test_Extlink_Copy
+ *
+ * Purpose: gerenate external link files
+ *
+ *------------------------------------------------------------------------*/
+static void Test_Extlink_Copy(void)
+{
+    hid_t fid1=0;
+    hid_t fid2=0;
+    herr_t status;
+
+    fid1 = H5Fcreate (HDF_EXT_SRC_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_EXT_SRC_FILE);
+        goto out;
+    }
+
+    fid2 = H5Fcreate (HDF_EXT_TRG_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_EXT_TRG_FILE);
+        goto out;
+    }
+
+    /* add links to source external link file */
+    status = gen_extlink_src(fid1);
+    if (status < 0)
+        fprintf(stderr, "Error: %s> gen_extlink_src failed.\n", HDF_EXT_SRC_FILE);
+
+    /* add objs to target external link file */
+    status = gen_extlink_trg(fid2);
+    if (status < 0)
+        fprintf(stderr, "Error: %s> gen_extlink_trg failed.\n", HDF_EXT_TRG_FILE);
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *------------------------------------------------------------------------*/
+    if(fid1 > 0)
+        H5Fclose(fid1);
+    if(fid2 > 0)
+        H5Fclose(fid2);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int main(void)
+{
+    Test_Obj_Copy();
+    Test_Ref_Copy();
+    Test_Extlink_Copy();
+
+    return 0;
+}
+
diff --git a/tools/h5copy/testfiles/h5copy_extlinks_src.h5 b/tools/test/h5copy/testfiles/h5copy_extlinks_src.h5
similarity index 100%
rename from tools/h5copy/testfiles/h5copy_extlinks_src.h5
rename to tools/test/h5copy/testfiles/h5copy_extlinks_src.h5
diff --git a/tools/test/h5copy/testfiles/h5copy_extlinks_src.out.ls b/tools/test/h5copy/testfiles/h5copy_extlinks_src.out.ls
new file mode 100644
index 0000000..af499a5
--- /dev/null
+++ b/tools/test/h5copy/testfiles/h5copy_extlinks_src.out.ls
@@ -0,0 +1,43 @@
+Opened "./testfiles/h5copy_extlinks_src.out.h5" with sec2 driver.
+/                        Group
+    Location:  1:96
+    Links:     1
+/copy1_dset              Dataset {6/6}
+    Location:  1:800
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/copy1_group             Group
+    Location:  1:4600
+    Links:     1
+/copy1_group/extlink_datatype External Link {h5copy_extlinks_trg.h5//datatype}
+/copy1_group/extlink_dset External Link {h5copy_extlinks_trg.h5//simple}
+/copy1_group/extlink_grp External Link {h5copy_extlinks_trg.h5//group}
+/copy1_group/extlink_notyet1 External Link {h5copy_extlinks_trg.h5//notyet}
+/copy1_group/extlink_notyet2 External Link {notyet_file.h5//notyet}
+/copy2_dset              Dataset {6/6}
+    Location:  1:4120
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/copy2_group             Group
+    Location:  1:5032
+    Links:     1
+/copy2_group/extlink_datatype Type
+    Location:  1:6232
+    Links:     1
+    Type:      shared-1:6232 32-bit little-endian integer
+/copy2_group/extlink_dset Dataset {6/6}
+    Location:  1:5400
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/copy2_group/extlink_grp Group
+    Location:  1:6192
+    Links:     1
+/copy2_group/extlink_notyet1 External Link {h5copy_extlinks_trg.h5//notyet}
+/copy2_group/extlink_notyet2 External Link {notyet_file.h5//notyet}
+/copy_dangle1_1          External Link {h5copy_extlinks_trg.h5//notyet}
+/copy_dangle1_2          External Link {h5copy_extlinks_trg.h5//notyet}
+/copy_dangle2_1          External Link {notyet_file.h5//notyet}
+/copy_dangle2_2          External Link {notyet_file.h5//notyet}
diff --git a/tools/h5copy/testfiles/h5copy_extlinks_trg.h5 b/tools/test/h5copy/testfiles/h5copy_extlinks_trg.h5
similarity index 100%
rename from tools/h5copy/testfiles/h5copy_extlinks_trg.h5
rename to tools/test/h5copy/testfiles/h5copy_extlinks_trg.h5
diff --git a/tools/h5copy/testfiles/h5copy_misc1.out b/tools/test/h5copy/testfiles/h5copy_misc1.out
similarity index 100%
rename from tools/h5copy/testfiles/h5copy_misc1.out
rename to tools/test/h5copy/testfiles/h5copy_misc1.out
diff --git a/tools/h5copy/testfiles/h5copy_ref.h5 b/tools/test/h5copy/testfiles/h5copy_ref.h5
similarity index 100%
rename from tools/h5copy/testfiles/h5copy_ref.h5
rename to tools/test/h5copy/testfiles/h5copy_ref.h5
diff --git a/tools/test/h5copy/testfiles/h5copy_ref.out.ls b/tools/test/h5copy/testfiles/h5copy_ref.out.ls
new file mode 100644
index 0000000..f5b31a7
--- /dev/null
+++ b/tools/test/h5copy/testfiles/h5copy_ref.out.ls
@@ -0,0 +1,31 @@
+Opened "./testfiles/h5copy_ref.out.h5" with sec2 driver.
+/                        Group
+    Location:  1:96
+    Links:     1
+/COPY                    Group
+    Location:  1:1464
+    Links:     1
+/COPY/Dset1              Dataset {3/3}
+    Location:  1:1504
+    Links:     2
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/COPY/Dset2              Dataset {3/3, 16/16}
+    Location:  1:4096
+    Links:     3
+    Storage:   <details removed for portability>
+    Type:      8-bit integer
+/COPY/Dset_OBJREF        Dataset {2/2}
+    Location:  1:5224
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      object reference
+/COPY/Dset_REGREF        Dataset {2/2}
+    Location:  1:5344
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      dataset region reference
+/COPY/Group              Group
+    Location:  1:1960
+    Links:     3
+/~obj_pointed_by_1960    Group, same as /COPY/Group
diff --git a/tools/test/h5copy/testfiles/h5copytst.h5 b/tools/test/h5copy/testfiles/h5copytst.h5
new file mode 100644
index 0000000..474c3da
Binary files /dev/null and b/tools/test/h5copy/testfiles/h5copytst.h5 differ
diff --git a/tools/test/h5copy/testfiles/h5copytst.out.ls b/tools/test/h5copy/testfiles/h5copytst.out.ls
new file mode 100644
index 0000000..629915e
--- /dev/null
+++ b/tools/test/h5copy/testfiles/h5copytst.out.ls
@@ -0,0 +1,429 @@
+Opened "./testfiles/h5copytst.out.h5" with sec2 driver.
+/                        Group
+    Location:  1:96
+    Links:     1
+/A                       Group
+    Location:  1:84208
+    Links:     1
+/A/B1                    Group
+    Location:  1:84912
+    Links:     1
+/A/B1/simple             Dataset {6/6}
+    Location:  1:84080
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/A/B2                    Group
+    Location:  1:88448
+    Links:     1
+/A/B2/simple2            Dataset {6/6}
+    Location:  1:88320
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/C                       Group
+    Location:  1:91656
+    Links:     1
+/C/D                     Group
+    Location:  1:92360
+    Links:     1
+/C/D/simple              Dataset {6/6}
+    Location:  1:91528
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E                       Group
+    Location:  1:106272
+    Links:     1
+/E/F                     Group
+    Location:  1:106976
+    Links:     1
+/E/F/grp_dsets           Group
+    Location:  1:94472
+    Links:     1
+/E/F/grp_dsets/chunk     Dataset {6/6}
+    Location:  1:98656
+    Links:     1
+    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:99112
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/compound  Dataset {2/2}
+    Location:  1:99248
+    Links:     1
+    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:101560
+    Links:     1
+    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:105824
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:105952 variable length of
+                   32-bit little-endian integer
+/E/F/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:106000
+    Links:     1
+    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:106144
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/vl        Type
+    Location:  1:105952
+    Links:     2
+    Type:      shared-1:105952 variable length of
+                   32-bit little-endian integer
+/G                       Group
+    Location:  1:121920
+    Links:     1
+/G/H                     Group
+    Location:  1:122624
+    Links:     1
+/G/H/grp_nested          Group
+    Location:  1:109000
+    Links:     1
+/G/H/grp_nested/grp_dsets Group
+    Location:  1:109792
+    Links:     1
+/G/H/grp_nested/grp_dsets/chunk Dataset {6/6}
+    Location:  1:113976
+    Links:     1
+    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:114432
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/compound Dataset {2/2}
+    Location:  1:114568
+    Links:     1
+    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:116880
+    Links:     1
+    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:121144
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:121272 variable length of
+                   32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:121320
+    Links:     1
+    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:121464
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/vl Type
+    Location:  1:121272
+    Links:     2
+    Type:      shared-1:121272 variable length of
+                   32-bit little-endian integer
+/chunk                   Dataset {6/6}
+    Location:  1:6216
+    Links:     1
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/compact                 Dataset {6/6}
+    Location:  1:6344
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/compound                Dataset {2/2}
+    Location:  1:8528
+    Links:     1
+    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:12888
+    Links:     1
+    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:28032
+    Links:     1
+/grp_dsets/chunk         Dataset {6/6}
+    Location:  1:32216
+    Links:     1
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/compact       Dataset {6/6}
+    Location:  1:32672
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/compound      Dataset {2/2}
+    Location:  1:32808
+    Links:     1
+    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:35120
+    Links:     1
+    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:39384
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:39512 variable length of
+                   32-bit little-endian integer
+/grp_dsets/nested_vl     Dataset {2/2}
+    Location:  1:39560
+    Links:     1
+    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:39704
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/simple_group  Dataset {6/6}
+    Location:  1:55816
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/vl            Type
+    Location:  1:39512
+    Links:     2
+    Type:      shared-1:39512 variable length of
+                   32-bit little-endian integer
+/grp_empty               Group
+    Location:  1:27240
+    Links:     1
+/grp_nested              Group
+    Location:  1:40496
+    Links:     1
+/grp_nested/grp_dsets    Group
+    Location:  1:41288
+    Links:     1
+/grp_nested/grp_dsets/chunk Dataset {6/6}
+    Location:  1:45472
+    Links:     1
+    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:45928
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/compound Dataset {2/2}
+    Location:  1:46064
+    Links:     1
+    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:48376
+    Links:     1
+    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:52640
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:52768 variable length of
+                   32-bit little-endian integer
+/grp_nested/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:52816
+    Links:     1
+    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:52960
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/vl Type
+    Location:  1:52768
+    Links:     2
+    Type:      shared-1:52768 variable length of
+                   32-bit little-endian integer
+/grp_rename              Group
+    Location:  1:57024
+    Links:     1
+/grp_rename/chunk        Dataset {6/6}
+    Location:  1:61208
+    Links:     1
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/compact      Dataset {6/6}
+    Location:  1:61664
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/compound     Dataset {2/2}
+    Location:  1:61800
+    Links:     1
+    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:64112
+    Links:     1
+    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:69904
+    Links:     1
+/grp_rename/grp_dsets/chunk Dataset {6/6}
+    Location:  1:74088
+    Links:     1
+    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:74544
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/compound Dataset {2/2}
+    Location:  1:74680
+    Links:     1
+    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:76992
+    Links:     1
+    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:81256
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:81384 variable length of
+                   32-bit little-endian integer
+/grp_rename/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:81432
+    Links:     1
+    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:81576
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/vl Type
+    Location:  1:81384
+    Links:     2
+    Type:      shared-1:81384 variable length of
+                   32-bit little-endian integer
+/grp_rename/named_vl     Dataset {2/2}
+    Location:  1:68376
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:68504 variable length of
+                   32-bit little-endian integer
+/grp_rename/nested_vl    Dataset {2/2}
+    Location:  1:68552
+    Links:     1
+    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:68696
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/vl           Type
+    Location:  1:68504
+    Links:     2
+    Type:      shared-1:68504 variable length of
+                   32-bit little-endian integer
+/named_vl                Dataset {2/2}
+    Location:  1:17184
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      shared-1:17312 variable length of
+                   32-bit little-endian integer
+/nested_vl               Dataset {2/2}
+    Location:  1:21664
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/rename                  Dataset {2/2}
+    Location:  1:26032
+    Links:     1
+    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
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/simple_top              Dataset {6/6}
+    Location:  1:23856
+    Links:     1
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
diff --git a/tools/test/h5copy/testfiles/h5copytst_new.h5 b/tools/test/h5copy/testfiles/h5copytst_new.h5
new file mode 100644
index 0000000..fd820ca
Binary files /dev/null and b/tools/test/h5copy/testfiles/h5copytst_new.h5 differ
diff --git a/tools/h5copy/testfiles/h5copytst_new.out.ls b/tools/test/h5copy/testfiles/h5copytst_new.out.ls
similarity index 100%
rename from tools/h5copy/testfiles/h5copytst_new.out.ls
rename to tools/test/h5copy/testfiles/h5copytst_new.out.ls
diff --git a/tools/test/h5copy/testh5copy.sh.in b/tools/test/h5copy/testh5copy.sh.in
new file mode 100644
index 0000000..ace3981
--- /dev/null
+++ b/tools/test/h5copy/testh5copy.sh.in
@@ -0,0 +1,618 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5copy tool
+#
+# Pedro Vicente Nunes (pvn at hdfgroup.org), Albert Cheng (acheng at hdfgroup.org)
+# Thursday, July 20, 2006
+#
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+# 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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTNAME=h5copy
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+######################################################################
+# 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 of files that will be copied over to local test dir
+LIST_HDF5_TEST_FILES="
+$SRC_H5COPY_TESTFILES/h5copytst.h5
+$SRC_H5COPY_TESTFILES/h5copy_ref.h5
+$SRC_H5COPY_TESTFILES/h5copy_extlinks_src.h5
+$SRC_H5COPY_TESTFILES/h5copy_extlinks_trg.h5
+"
+
+# List of expect files that will be copied over to local test dir
+LIST_OTHER_TEST_FILES="
+$SRC_H5COPY_TESTFILES/h5copy_misc1.out
+"
+
+H5COPY=../../src/h5copy/h5copy               # The tool name
+H5COPY_BIN=`pwd`/$H5COPY    # The path of the tool binary
+H5DIFF=../../src/h5diff/h5diff               # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the h5diff tool binary
+H5LS=../../src/h5ls/h5ls                   # The h5ls tool name
+H5LS_ARGS=-Svr              # Arguments to the h5ls tool
+H5LS_BIN=`pwd`/$H5LS # The path of the h5ls tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes        # default is yes
+
+TESTDIR=./testfiles
+test -d $TESTDIR || mkdir $TESTDIR
+
+# 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=$SRC_H5COPY_TESTFILES
+    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 "SKIP" message
+SKIP() {
+    TESTING $H5COPY $@
+    echo  " -SKIP-"
+}
+
+# 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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY()
+{
+    SPACES="                                                               "
+    echo "Verifying h5diff output $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY_OUTPUT()
+{
+    SPACES="                                                               "
+    echo "Verifying output files $* $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 h5copy can complete
+# with exit status 0, consider it pass. If a test fails then increment
+# the `nerrors' global variable.
+# Assumed arguments:
+# $1 is -i
+# $2 is input file
+# $3 is -o
+# $4 is output file
+# $* everything else arguments for h5copy.
+
+TOOLTEST()
+{
+    actualout="$TESTDIR/tooltest.actualout"
+    actualerr="$TESTDIR/tooltest.actualerr"
+    runh5diff=yes
+    if [ "$1" = -i ]; then
+        inputfile=$2
+    else
+        if [ "$1" = -f ]; then
+            inputfile=$4
+        else
+            inputfile=$3
+        fi
+        runh5diff=no
+    fi
+    if [ "$3" = -o ]; then
+        outputfile=$4
+    else
+        if [ "$1" = -f ]; then
+            outputfile=$6
+        else
+            outputfile=$5
+        fi
+        runh5diff=no
+    fi
+
+    TESTING $H5COPY $@
+    (
+        echo "#############################"
+        echo " output for '$H5COPY $@'"
+        echo "#############################"
+        $RUNSERIAL $H5COPY_BIN $@
+    ) > $actualout 2> $actualerr
+    RET=$?
+    if [ $RET != 0 ]; then
+        echo "*FAILED*"
+        echo "failed result is:"
+        cat $actualout
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+
+        if [ $runh5diff != no ]; then
+            H5DIFFTEST $inputfile $outputfile $7 $9
+        fi
+
+        # Clean up output file
+        if test -z "$HDF5_NOCLEANUP"; then
+            rm -f $actualout $actualerr $outputfile
+        fi
+    fi
+}
+
+# TOOLTEST back-to-back
+TOOLTEST_PREFILL()
+{
+    actualout="$TESTDIR/tooltest.actualout"
+    actualerr="$TESTDIR/tooltest.actualerr"
+    runh5diff=yes
+    if [ "$1" = -i ]; then
+        inputfile=$2
+    else
+        runh5diff=no
+    fi
+    if [ "$3" = -o ]; then
+        outputfile=$4
+    else
+        runh5diff=no
+    fi
+
+    grp_name=$5
+    grp_name2=$6
+    obj_name=$7
+    obj_name2=$8
+
+    TESTING $H5COPY $@
+    (
+        echo "#############################"
+        echo " output for '$H5COPY $@'"
+        echo "#############################"
+        $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $grp_name -d $grp_name2
+    ) > $actualout 2> $actualerr
+    RET=$?
+    if [ $RET != 0 ]; then
+        echo "*FAILED*"
+        echo "failed result is:"
+        cat $actualout
+        nerrors="`expr $nerrors + 1`"
+    else
+        TESTING $H5COPY $@
+        (
+            echo "#############################"
+            echo " output for '$H5COPY $@'"
+            echo "#############################"
+            $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $obj_name -d $obj_name2
+        ) > $actualout 2> $actualerr
+        RET=$?
+        if [ $RET != 0 ]; then
+            echo "*FAILED*"
+            echo "failed result is:"
+            cat $actualout
+            nerrors="`expr $nerrors + 1`"
+        else
+            echo " PASSED"
+
+            if [ $runh5diff != no ]; then
+                H5DIFFTEST $inputfile $outputfile $obj_name $obj_name2
+            fi
+
+            # Clean up output file
+            if test -z "$HDF5_NOCLEANUP"; then
+                rm -f $actualout $actualerr $outputfile
+            fi
+        fi
+    fi
+}
+
+# TOOLTEST back-to-back
+TOOLTEST_SAME()
+{
+    actualout="$TESTDIR/tooltest.actualout"
+    actualerr="$TESTDIR/tooltest.actualerr"
+    runh5diff=yes
+    if [ "$1" = -i ]; then
+        inputfile=$2
+    else
+        runh5diff=no
+    fi
+    if [ "$3" = -o ]; then
+        outputfile=$4
+    else
+        runh5diff=no
+    fi
+
+    grp_name=$5
+    grp_name2=$6
+
+    TESTING $H5COPY $@
+    (
+        echo "#############################"
+        echo " output for '$H5COPY $@'"
+        echo "#############################"
+        $RUNSERIAL $H5COPY_BIN  -i $inputfile -o $outputfile -v -s $grp_name -d $grp_name
+    ) > $actualout 2> $actualerr
+    RET=$?
+    if [ $RET != 0 ]; then
+        echo "*FAILED*"
+        echo "failed result is:"
+        cat $actualout
+        nerrors="`expr $nerrors + 1`"
+    else
+        TESTING $H5COPY $@
+        (
+            echo "#############################"
+            echo " output for '$H5COPY $@'"
+            echo "#############################"
+            $RUNSERIAL $H5COPY_BIN  -i $outputfile -o $outputfile -v -s $grp_name -d $grp_name2
+        ) > $actualout 2> $actualerr
+        RET=$?
+        if [ $RET != 0 ]; then
+            echo "*FAILED*"
+            echo "failed result is:"
+            cat $actualout
+            nerrors="`expr $nerrors + 1`"
+        else
+            echo " PASSED"
+
+            if [ $runh5diff != no ]; then
+                H5DIFFTEST $outputfile $outputfile $grp_name $grp_name2
+            fi
+
+            # Clean up output file
+            if test -z "$HDF5_NOCLEANUP"; then
+                rm -f $actualout $actualerr $outputfile
+            fi
+        fi
+    fi
+}
+
+
+# Compare the two text files
+# PASS if same
+# FAIL if different, and show the diff
+#
+# Assumed arguments:
+# $1 is text file1 (expected output)
+# $2 is text file2 (actual output)
+CMP_OUTPUT()
+{
+    expect=$1
+    actual=$2
+
+    VERIFY_OUTPUT $@
+    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 output differs from actual output"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+}
+
+TOOLTEST_FAIL()
+{
+    expectout="$TESTDIR/$1"
+    actualout="$TESTDIR/$1.actualout"
+    actualerr="$TESTDIR/$1.actualerr"
+    actualout_sav=${actualout}-sav
+    actualerr_sav=${actualerr}-sav
+    shift
+    if [ "$1" = -i ]; then
+        inputfile=$2
+    fi
+    if [ "$3" = -o ]; then
+        outputfile=$4
+    fi
+
+    TESTING $H5COPY $@
+    (
+        #echo "#############################"
+        #echo " output for '$H5COPY $@'"
+        #echo "#############################"
+        $RUNSERIAL $H5COPY_BIN $@
+    ) > $actualout 2> $actualerr
+
+    RET=$?
+    # save actualout and actualerr in case they are needed later.
+    cp $actualout $actualout_sav
+    STDOUT_FILTER $actualout
+    cp $actualerr $actualerr_sav
+    STDERR_FILTER $actualerr
+    if [ $RET != 0 ]; then
+        echo " PASSED"
+        # Verifying output text from h5copy
+        if [ "$expectout" != "SKIP" ]; then
+            # combine stderr to stdout to compare the output at once.
+            # We may seperate stdout and stderr later.
+            cat $actualerr >> $actualout
+            CMP_OUTPUT $expectout $actualout
+        fi
+    else
+        echo "*FAILED*"
+        echo "failed result is:"
+        cat $actualout
+        nerrors="`expr $nerrors + 1`"
+    fi
+
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+        rm -f $actualout $actualerr $actualout_sav $actualerr_sav $outputfile
+    fi
+}
+
+
+# Call the h5diff tool
+#
+H5DIFFTEST()
+{
+    VERIFY  $@
+    $RUNSERIAL $H5DIFF_BIN -q "$@"
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+    fi
+}
+
+# Call the h5diff tool with a call that is expected to fail
+#
+H5DIFFTEST_FAIL()
+{
+    VERIFY  $@
+    $RUNSERIAL $H5DIFF_BIN -q "$@"
+    RET=$?
+
+    if [ $h5haveexitcode = 'yes' -a $RET != 1 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+    fi
+}
+
+# Copy single datasets of various forms from one group to another,
+#       adding object copied to the destination file each time
+#
+# Assumed arguments:
+# <none>
+COPY_OBJECTS()
+{
+    TESTFILE="$TESTDIR/h5copytst.h5"
+
+    echo "Test copying various forms of datasets"
+    TOOLTEST -i $TESTFILE -o $TESTDIR/simple.out.h5 -v -s simple     -d simple
+    TOOLTEST -i $TESTFILE -o $TESTDIR/chunk.out.h5 -v -s chunk      -d chunk
+    TOOLTEST -i $TESTFILE -o $TESTDIR/compact.out.h5 -v -s compact    -d compact
+    TOOLTEST -i $TESTFILE -o $TESTDIR/compound.out.h5 -v -s compound   -d compound
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST -i $TESTFILE -o $TESTDIR/compressed.out.h5 -v -s compressed -d compressed
+fi
+    TOOLTEST -i $TESTFILE -o $TESTDIR/named_vl.out.h5 -v -s named_vl   -d named_vl
+    TOOLTEST -i $TESTFILE -o $TESTDIR/nested_vl.out.h5 -v -s nested_vl  -d nested_vl
+    TOOLTEST -i $TESTFILE -o $TESTDIR/dset_attr.out.h5 -v -s /dset_attr  -d /dset_attr
+
+    echo "Test copying dataset within group in source file to root of destination"
+    TOOLTEST -i $TESTFILE -o $TESTDIR/simple_top.out.h5 -v -s grp_dsets/simple  -d simple_top
+
+    echo "Test copying & renaming dataset"
+    TOOLTEST -i $TESTFILE -o $TESTDIR/dsrename.out.h5 -v -s compound   -d rename
+
+    echo "Test copying empty, 'full' & 'nested' groups"
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_empty.out.h5 -v -s grp_empty  -d grp_empty
+fi
+    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_dsets.out.h5 -v -s grp_dsets  -d grp_dsets
+    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_nested.out.h5 -v -s grp_nested -d grp_nested
+    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_attr.out.h5 -v -s grp_attr -d grp_attr
+
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    echo "Test copying dataset within group in source file to group in destination"
+    TOOLTEST_PREFILL -i $TESTFILE -o $TESTDIR/simple_group.out.h5 grp_dsets grp_dsets /grp_dsets/simple /grp_dsets/simple_group
+    echo "Test copying & renaming group"
+    TOOLTEST -i $TESTFILE -o $TESTDIR/grp_rename.out.h5 -v -s grp_dsets  -d grp_rename
+fi
+
+    echo "Test copying 'full' group hierarchy into group in destination file"
+    TOOLTEST_PREFILL -i $TESTFILE -o $TESTDIR/grp_dsets_rename.out.h5 grp_dsets grp_rename grp_dsets /grp_rename/grp_dsets
+
+    echo "Test copying objects into group hier. that doesn't exist yet in destination file"
+    TOOLTEST -i $TESTFILE -o $TESTDIR/A_B1_simple.out.h5 -vp -s simple    -d /A/B1/simple
+    TOOLTEST -i $TESTFILE -o $TESTDIR/A_B2_simple2.out.h5 -vp -s simple    -d /A/B2/simple2
+    TOOLTEST -i $TESTFILE -o $TESTDIR/C_D_simple.out.h5 -vp -s /grp_dsets/simple    -d /C/D/simple
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST -i $TESTFILE -o $TESTDIR/E_F_grp_dsets.out.h5 -vp -s /grp_dsets -d /E/F/grp_dsets
+    TOOLTEST -i $TESTFILE -o $TESTDIR/G_H_grp_nested.out.h5 -vp -s /grp_nested -d /G/H/grp_nested
+fi
+}
+
+# Copy references in various way.
+#
+# Assumed arguments:
+# <none>
+COPY_REFERENCES()
+{
+    TESTFILE="$TESTDIR/h5copy_ref.h5"
+
+    echo "Test copying object and region references"
+    TOOLTEST -f ref -i $TESTFILE -o $TESTDIR/region_ref.out.h5 -v -s / -d /COPY
+}
+
+# Copy external links.
+# adding to the destination file each time compare the result
+#
+# Assumed arguments:
+# <none>
+COPY_EXT_LINKS()
+{
+    TESTFILE="$TESTDIR/h5copy_extlinks_src.h5"
+
+    echo "Test copying external link directly without -f ext"
+    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_link.out.h5 -s /group_ext/extlink_dset -d /copy1_dset
+
+    echo "Test copying external link directly with -f ext"
+    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_link_f.out.h5 -v -s /group_ext/extlink_dset -d /copy2_dset
+
+    echo "Test copying dangling external link (no obj) directly without -f ext"
+    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_dangle_noobj.out.h5 -s /group_ext/extlink_notyet1 -d /copy_dangle1_1
+
+    echo "Test copying dangling external link (no obj) directly with -f ext"
+    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_dangle_noobj_f.out.h5 -v -s /group_ext/extlink_notyet1 -d /copy_dangle1_2
+
+    echo "Test copying dangling external link (no file) directly without -f ext"
+    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_dangle_nofile.out.h5 -s /group_ext/extlink_notyet2 -d /copy_dangle2_1
+
+    echo "Test copying dangling external link (no file) directly with -f ext"
+    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_dangle_nofile_f.out.h5 -v -s /group_ext/extlink_notyet2 -d /copy_dangle2_2
+
+    echo "Test copying a group contains external links without -f ext"
+    TOOLTEST -v -i $TESTFILE -o $TESTDIR/ext_link_group.out.h5 -s /group_ext -d /copy1_group
+
+    echo "Test copying a group contains external links with -f ext"
+    TOOLTEST -f ext -i $TESTFILE -o $TESTDIR/ext_link_group_f.out.h5 -v -s /group_ext -d /copy2_group
+}
+
+# Test misc.
+#
+# Assumed arguments:
+# <none>
+TEST_MISC()
+{
+    TESTFILE="$TESTDIR/h5copytst.h5"
+
+    echo "Test copying object into group which doesn't exist, without -p"
+    TOOLTEST_FAIL h5copy_misc1.out -i $TESTFILE -o $TESTDIR/h5copy_misc1.out.h5 -v -s /simple  -d /g1/g2/simple
+
+    echo "Test copying objects to the same file "
+    TOOLTEST_SAME -i $TESTFILE -o $TESTDIR/samefile1.out.h5 /simple /simple_cp
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST_SAME -i $TESTFILE -o $TESTDIR/samefile2.out.h5 /grp_dsets /grp_dsets_cp
+fi
+}
+
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# Start tests
+COPY_OBJECTS
+COPY_REFERENCES
+COPY_EXT_LINKS
+TEST_MISC
+
+# 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/test/h5diff/CMakeLists.txt b/tools/test/h5diff/CMakeLists.txt
new file mode 100644
index 0000000..f6951a3
--- /dev/null
+++ b/tools/test/h5diff/CMakeLists.txt
@@ -0,0 +1,50 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5DIFF)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the h5diff and test executables
+  # --------------------------------------------------------------------
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5diffgentest ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/h5diffgentest.c)
+    TARGET_NAMING (h5diffgentest STATIC)
+    TARGET_C_PROPERTIES (h5diffgentest STATIC " " " ")
+    target_link_libraries (h5diffgentest ${HDF5_LIB_TARGET})
+    set_target_properties (h5diffgentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5diffgentest COMMAND $<TARGET_FILE:h5diffgentest>)
+  endif ()
+
+  #-----------------------------------------------------------------------------
+  # If plugin library tests can be tested
+  #-----------------------------------------------------------------------------
+  set (HDF5_TOOL_PLUGIN_LIB_CORENAME         "dynlibdiff")
+  set (HDF5_TOOL_PLUGIN_LIB_NAME             "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_CORENAME}")
+  set (HDF5_TOOL_PLUGIN_LIB_TARGET           ${HDF5_TOOL_PLUGIN_LIB_CORENAME})
+  add_definitions (${HDF_EXTRA_C_FLAGS})
+  INCLUDE_DIRECTORIES (${HDF5_SRC_DIR})
+
+  add_library (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_diff.c)
+  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED " " " ")
+  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})
+
+  # make plugins dir
+  file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins")
+  #-----------------------------------------------------------------------------
+  # Copy plugin library to a plugins folder
+  #-----------------------------------------------------------------------------
+  add_custom_command (
+      TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      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)
diff --git a/tools/test/h5diff/CMakeTests.cmake b/tools/test/h5diff/CMakeTests.cmake
new file mode 100644
index 0000000..f6cd2dd
--- /dev/null
+++ b/tools/test/h5diff/CMakeTests.cmake
@@ -0,0 +1,1495 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the test directory into the source directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_basic1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_basic2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_types.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dtypes.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_hyper1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_hyper2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_empty.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_links.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_softlinks.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_linked_softlink.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_extlink_src.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_extlink_trg.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_ext2softlink_src.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_ext2softlink_trg.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset_zero_dim_size1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_dset_zero_dim_size2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_danglelinks1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_danglelinks2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_grp_recurse_ext2-3.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude1-1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude1-2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude2-1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude2-2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude3-1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_exclude3-2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_comp_vl_strs.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr_v_level1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr_v_level2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_enum_invalid_values.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/compounds_array_vlen1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/compounds_array_vlen2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/non_comparables1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/non_comparables2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tmptest.he5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tmptest2.he5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tmpSingleSiteBethe.reference.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tmpSingleSiteBethe.output.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tudfilter.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/tudfilter2.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/diff_strings1.h5
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/diff_strings2.h5
+      # tools/testfiles/vds
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_d.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_e.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_f.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_d.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_e.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/3_1_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/3_2_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_0.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_vds.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_10.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_100.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_11.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_12.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_13.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_14.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_15.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_1.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_2.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_16_3.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_17.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_171.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_172.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_18_1.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_18.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_20.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_200.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_201.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_202.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_203.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_204.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_205.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_206.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_207.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_208.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_220.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_221.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_222.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_223.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_224.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_21.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_22.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_23.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_24.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_25.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_26.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_27.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_28.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_30.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_300.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_400.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_401.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_402.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_403.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_404.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_405.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_406.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_407.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_408.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_409.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_410.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_411.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_412.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_413.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_414.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_415.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_416.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_417.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_418.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_419.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_420.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_421.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_422.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_423.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_424.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_425.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_450.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_451.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_452.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_453.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_454.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_455.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_456.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_457.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_458.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_459.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_465.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_466.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_467.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_468.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_469.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_471.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_472.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_473.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_474.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_475.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_480.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_481.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_482.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_483.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_484.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_485.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_486.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_487.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_50.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_51.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_52.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_53.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_54.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_55.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_56.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_57.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_58.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_59.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_500.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_501.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_502.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_503.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_504.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_505.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_506.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_507.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_508.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_509.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_510.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_511.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_512.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_513.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_514.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_515.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_516.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_517.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_518.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_530.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_540.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_60.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_61.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_62.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_63.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_600.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_601.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_603.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_604.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_605.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_606.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_607.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_608.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_609.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_610.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_612.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_613.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_614.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_615.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_616.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_617.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_618.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_619.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_621.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_622.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_623.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_624.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_625.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_626.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_627.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_628.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_629.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_630.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_631.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_640.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_641.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_642.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_643.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_644.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_645.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_646.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_70.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_700.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_701.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_702.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_703.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_704.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_705.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_706.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_707.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_708.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_709.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_710.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_80.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_90.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_tmp1.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_tmp2.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_ud.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_udfail.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v1.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v2.txt
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v3.txt
+  )
+
+  set (LIST_WIN_TEST_FILES
+      h5diff_101
+      h5diff_102
+      h5diff_103
+      h5diff_104
+  )
+
+  # Make testfiles dir under build dir
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+  if (H5_HAVE_PARALLEL)
+    file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/PAR/testfiles")
+  endif ()
+
+  #
+  # copy test files from source to build dir
+  #
+  foreach (h5_tstfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+    get_filename_component(fname "${h5_tstfiles}" NAME)
+    HDFTEST_COPY_FILE("${h5_tstfiles}" "${PROJECT_BINARY_DIR}/testfiles/${fname}" "h5diff_files")
+    if (H5_HAVE_PARALLEL)
+      HDFTEST_COPY_FILE("${h5_tstfiles}" "${PROJECT_BINARY_DIR}/PAR/testfiles/${fname}" "h5diff_files")
+    endif ()
+  endforeach ()
+
+
+  #
+  # Overwrite system dependent files (Windows) and not VS2015
+  #
+  if (WIN32 AND MSVC_VERSION LESS 1900)
+    foreach (h5_tstfiles ${LIST_WIN_TEST_FILES})
+      get_filename_component(fname "${h5_tstfiles}" NAME)
+      HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/${h5_tstfiles}w.txt" "${PROJECT_BINARY_DIR}/testfiles/${fname}.txt" "h5diff_files")
+      if (H5_HAVE_PARALLEL)
+        HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/${h5_tstfiles}w.txt" "${PROJECT_BINARY_DIR}/PAR/testfiles/${fname}.txt" "h5diff_files")
+      endif ()
+    endforeach ()
+  else ()
+    foreach (h5_tstfiles ${LIST_WIN_TEST_FILES})
+      get_filename_component(fname "${h5_tstfiles}" NAME)
+      HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/${h5_tstfiles}.txt" "${PROJECT_BINARY_DIR}/testfiles/${fname}.txt" "h5diff_files")
+      if (H5_HAVE_PARALLEL)
+        HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/${h5_tstfiles}.txt" "${PROJECT_BINARY_DIR}/PAR/testfiles/${fname}.txt" "h5diff_files")
+      endif ()
+    endforeach ()
+  endif ()
+  add_custom_target(h5diff_files ALL COMMENT "Copying files needed by h5diff tests" DEPENDS ${h5diff_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DIFF-${resultfile} COMMAND $<TARGET_FILE:h5diff> ${ARGN})
+      set_tests_properties (H5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DIFF-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.txt"
+              -D "TEST_APPEND=EXIT CODE:"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+    if (H5_HAVE_PARALLEL)
+      ADD_PH5_TEST (${resultfile} ${resultcode} ${ARGN})
+    endif ()
+  endmacro ()
+
+  macro (ADD_PH5_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME PH5DIFF-${resultfile} COMMAND $<TARGET_FILE:ph5diff> ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} ${ARGN})
+      set_tests_properties (PH5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/PAR/testfiles")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (PH5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (PH5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME PH5DIFF-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=${MPIEXEC};${MPIEXEC_PREFLAGS};${MPIEXEC_NUMPROC_FLAG};${MPIEXEC_MAX_NUMPROCS};${MPIEXEC_POSTFLAGS};$<TARGET_FILE:ph5diff>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/PAR/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=0"
+              -D "TEST_REFERENCE=${resultfile}.txt"
+              -D "TEST_APPEND=EXIT CODE:"
+              -D "TEST_REF_APPEND=EXIT CODE: [0-9]"
+              -D "TEST_REF_FILTER=EXIT CODE: 0"
+              -D "TEST_SORT_COMPARE=TRUE"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (PH5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "PH5DIFF-${resultfile}")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_UD_TEST testname resultcode resultfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5DIFF_UD-${testname}-clearall-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              testfiles/${resultfile}.out
+              testfiles/${resultfile}.out.err
+      )
+      if (${resultcode} STREQUAL "2")
+        add_test (
+            NAME H5DIFF_UD-${testname}
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
+                -D "TEST_ARGS:STRING=${ARGN}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${resultfile}.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_REFERENCE=${resultfile}.txt"
+                -D "TEST_APPEND=EXIT CODE:"
+                -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+                -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      else ()
+        add_test (
+            NAME H5DIFF_UD-${testname}
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
+                -D "TEST_ARGS:STRING=${ARGN}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${resultfile}.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_REFERENCE=${resultfile}.txt"
+                -D "TEST_APPEND=EXIT CODE:"
+                -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+                -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
+      set_tests_properties (H5DIFF_UD-${testname} PROPERTIES DEPENDS H5DIFF_UD-${testname}-clearall-objects)
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # test file names
+  # --------------------------------------------------------------------
+  set (FILE1 h5diff_basic1.h5)
+  set (FILE2 h5diff_basic2.h5)
+  set (FILE3 h5diff_types.h5)
+  set (FILE4 h5diff_dtypes.h5)
+  set (FILE5 h5diff_attr1.h5)
+  set (FILE6 h5diff_attr2.h5)
+  set (FILE7 h5diff_dset1.h5)
+  set (FILE8 h5diff_dset2.h5)
+  set (FILE9 h5diff_hyper1.h5)
+  set (FILE10 h5diff_hyper2.h5)
+  set (FILE11 h5diff_empty.h5)
+  set (FILE12 h5diff_links.h5)
+  set (FILE13 h5diff_softlinks.h5)
+  set (FILE14 h5diff_linked_softlink.h5)
+  set (FILE15 h5diff_extlink_src.h5)
+  set (FILE16 h5diff_extlink_trg.h5)
+  set (FILE17 h5diff_ext2softlink_src.h5)
+  set (FILE18 h5diff_ext2softlink_trg.h5)
+  set (FILE19 h5diff_dset_zero_dim_size1.h5)
+  set (FILE20 h5diff_dset_zero_dim_size2.h5)
+  set (DANGLE_LINK_FILE1 h5diff_danglelinks1.h5)
+  set (DANGLE_LINK_FILE2 h5diff_danglelinks2.h5)
+  set (GRP_RECURSE_FILE1 h5diff_grp_recurse1.h5)
+  set (GRP_RECURSE_FILE2 h5diff_grp_recurse2.h5)
+  # group recursive - same structure via external links through files
+  set (GRP_RECURSE1_EXT h5diff_grp_recurse_ext1.h5)
+  set (GRP_RECURSE2_EXT1 h5diff_grp_recurse_ext2-1.h5)
+  set (GRP_RECURSE2_EXT2 h5diff_grp_recurse_ext2-2.h5)
+  set (GRP_RECURSE2_EXT3 h5diff_grp_recurse_ext2-3.h5)
+  # same structure, same obj name with different value
+  set (EXCLUDE_FILE1_1 h5diff_exclude1-1.h5)
+  set (EXCLUDE_FILE1_2 h5diff_exclude1-2.h5)
+  # different structure and obj names
+  set (EXCLUDE_FILE2_1 h5diff_exclude2-1.h5)
+  set (EXCLUDE_FILE2_2 h5diff_exclude2-2.h5)
+  # Only one file contains unique objs. Common objs are same.
+  set (EXCLUDE_FILE3_1 h5diff_exclude3-1.h5)
+  set (EXCLUDE_FILE3_2 h5diff_exclude3-2.h5)
+  # compound type with multiple vlen string types
+  set (COMP_VL_STRS_FILE h5diff_comp_vl_strs.h5)
+  # container types (array,vlen) with multiple nested compound types
+  set (COMPS_ARRAY_VLEN_FILE1 compounds_array_vlen1.h5)
+  set (COMPS_ARRAY_VLEN_FILE2 compounds_array_vlen2.h5)
+  # 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)
+  # strings
+  set (STRINGS1 diff_strings1.h5)
+  set (STRINGS2 diff_strings2.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
+    add_test (
+      NAME H5DIFF-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          h5diff_10.out
+          h5diff_10.out.err
+          h5diff_100.out
+          h5diff_100.out.err
+          h5diff_101.out
+          h5diff_101.out.err
+          h5diff_102.out
+          h5diff_102.out.err
+          h5diff_103.out
+          h5diff_103.out.err
+          h5diff_104.out
+          h5diff_104.out.err
+          h5diff_11.out
+          h5diff_11.out.err
+          h5diff_12.out
+          h5diff_12.out.err
+          h5diff_13.out
+          h5diff_13.out.err
+          h5diff_14.out
+          h5diff_14.out.err
+          h5diff_15.out
+          h5diff_15.out.err
+          h5diff_16_1.out
+          h5diff_16_1.out.err
+          h5diff_16_2.out
+          h5diff_16_2.out.err
+          h5diff_16_3.out
+          h5diff_16_3.out.err
+          h5diff_17.out
+          h5diff_17.out.err
+          h5diff_171.out
+          h5diff_171.out.err
+          h5diff_172.out
+          h5diff_172.out.err
+          h5diff_18_1.out
+          h5diff_18_1.out.err
+          h5diff_18.out
+          h5diff_18.out.err
+          h5diff_20.out
+          h5diff_20.out.err
+          h5diff_200.out
+          h5diff_200.out.err
+          h5diff_201.out
+          h5diff_201.out.err
+          h5diff_202.out
+          h5diff_202.out.err
+          h5diff_203.out
+          h5diff_203.out.err
+          h5diff_204.out
+          h5diff_204.out.err
+          h5diff_205.out
+          h5diff_205.out.err
+          h5diff_206.out
+          h5diff_206.out.err
+          h5diff_207.out
+          h5diff_207.out.err
+          h5diff_208.out
+          h5diff_208.out.err
+          h5diff_220.out
+          h5diff_220.out.err
+          h5diff_221.out
+          h5diff_221.out.err
+          h5diff_222.out
+          h5diff_222.out.err
+          h5diff_223.out
+          h5diff_223.out.err
+          h5diff_224.out
+          h5diff_224.out.err
+          h5diff_21.out
+          h5diff_21.out.err
+          h5diff_22.out
+          h5diff_22.out.err
+          h5diff_23.out
+          h5diff_23.out.err
+          h5diff_24.out
+          h5diff_24.out.err
+          h5diff_25.out
+          h5diff_25.out.err
+          h5diff_26.out
+          h5diff_26.out.err
+          h5diff_27.out
+          h5diff_27.out.err
+          h5diff_28.out
+          h5diff_28.out.err
+          h5diff_300.out
+          h5diff_300.out.err
+          h5diff_400.out
+          h5diff_400.out.err
+          h5diff_401.out
+          h5diff_401.out.err
+          h5diff_402.out
+          h5diff_402.out.err
+          h5diff_403.out
+          h5diff_403.out.err
+          h5diff_404.out
+          h5diff_404.out.err
+          h5diff_405.out
+          h5diff_405.out.err
+          h5diff_406.out
+          h5diff_406.out.err
+          h5diff_407.out
+          h5diff_407.out.err
+          h5diff_408.out
+          h5diff_408.out.err
+          h5diff_409.out
+          h5diff_409.out.err
+          h5diff_410.out
+          h5diff_410.out.err
+          h5diff_411.out
+          h5diff_411.out.err
+          h5diff_412.out
+          h5diff_412.out.err
+          h5diff_413.out
+          h5diff_413.out.err
+          h5diff_414.out
+          h5diff_414.out.err
+          h5diff_415.out
+          h5diff_415.out.err
+          h5diff_416.out
+          h5diff_416.out.err
+          h5diff_417.out
+          h5diff_417.out.err
+          h5diff_418.out
+          h5diff_418.out.err
+          h5diff_419.out
+          h5diff_419.out.err
+          h5diff_420.out
+          h5diff_420.out.err
+          h5diff_421.out
+          h5diff_421.out.err
+          h5diff_422.out
+          h5diff_422.out.err
+          h5diff_423.out
+          h5diff_423.out.err
+          h5diff_424.out
+          h5diff_424.out.err
+          h5diff_425.out
+          h5diff_425.out.err
+          h5diff_450.out
+          h5diff_450.out.err
+          h5diff_451.out
+          h5diff_451.out.err
+          h5diff_452.out
+          h5diff_452.out.err
+          h5diff_453.out
+          h5diff_453.out.err
+          h5diff_454.out
+          h5diff_454.out.err
+          h5diff_455.out
+          h5diff_455.out.err
+          h5diff_456.out
+          h5diff_456.out.err
+          h5diff_457.out
+          h5diff_457.out.err
+          h5diff_458.out
+          h5diff_458.out.err
+          h5diff_459.out
+          h5diff_459.out.err
+          h5diff_465.out
+          h5diff_465.out.err
+          h5diff_466.out
+          h5diff_466.out.err
+          h5diff_467.out
+          h5diff_467.out.err
+          h5diff_468.out
+          h5diff_468.out.err
+          h5diff_469.out
+          h5diff_469.out.err
+          h5diff_471.out
+          h5diff_471.out.err
+          h5diff_472.out
+          h5diff_472.out.err
+          h5diff_473.out
+          h5diff_473.out.err
+          h5diff_474.out
+          h5diff_474.out.err
+          h5diff_475.out
+          h5diff_475.out.err
+          h5diff_480.out
+          h5diff_480.out.err
+          h5diff_481.out
+          h5diff_481.out.err
+          h5diff_482.out
+          h5diff_482.out.err
+          h5diff_483.out
+          h5diff_483.out.err
+          h5diff_484.out
+          h5diff_484.out.err
+          h5diff_50.out
+          h5diff_50.out.err
+          h5diff_51.out
+          h5diff_51.out.err
+          h5diff_52.out
+          h5diff_52.out.err
+          h5diff_53.out
+          h5diff_53.out.err
+          h5diff_54.out
+          h5diff_54.out.err
+          h5diff_55.out
+          h5diff_55.out.err
+          h5diff_56.out
+          h5diff_56.out.err
+          h5diff_57.out
+          h5diff_57.out.err
+          h5diff_58.out
+          h5diff_58.out.err
+          h5diff_59.out
+          h5diff_59.out.err
+          h5diff_500.out
+          h5diff_500.out.err
+          h5diff_501.out
+          h5diff_501.out.err
+          h5diff_502.out
+          h5diff_502.out.err
+          h5diff_503.out
+          h5diff_503.out.err
+          h5diff_504.out
+          h5diff_504.out.err
+          h5diff_505.out
+          h5diff_505.out.err
+          h5diff_506.out
+          h5diff_506.out.err
+          h5diff_507.out
+          h5diff_507.out.err
+          h5diff_508.out
+          h5diff_508.out.err
+          h5diff_509.out
+          h5diff_509.out.err
+          h5diff_510.out
+          h5diff_510.out.err
+          h5diff_511.out
+          h5diff_511.out.err
+          h5diff_512.out
+          h5diff_512.out.err
+          h5diff_513.out
+          h5diff_513.out.err
+          h5diff_514.out
+          h5diff_514.out.err
+          h5diff_515.out
+          h5diff_515.out.err
+          h5diff_516.out
+          h5diff_516.out.err
+          h5diff_517.out
+          h5diff_517.out.err
+          h5diff_518.out
+          h5diff_518.out.err
+          h5diff_530.out
+          h5diff_530.out.err
+          h5diff_540.out
+          h5diff_540.out.err
+          h5diff_60.out
+          h5diff_60.out.err
+          h5diff_61.out
+          h5diff_61.out.err
+          h5diff_62.out
+          h5diff_62.out.err
+          h5diff_63.out
+          h5diff_63.out.err
+          h5diff_600.out
+          h5diff_600.out.err
+          h5diff_601.out
+          h5diff_601.out.err
+          h5diff_603.out
+          h5diff_603.out.err
+          h5diff_604.out
+          h5diff_604.out.err
+          h5diff_605.out
+          h5diff_605.out.err
+          h5diff_606.out
+          h5diff_606.out.err
+          h5diff_607.out
+          h5diff_607.out.err
+          h5diff_608.out
+          h5diff_608.out.err
+          h5diff_609.out
+          h5diff_609.out.err
+          h5diff_610.out
+          h5diff_610.out.err
+          h5diff_612.out
+          h5diff_612.out.err
+          h5diff_613.out
+          h5diff_613.out.err
+          h5diff_614.out
+          h5diff_614.out.err
+          h5diff_615.out
+          h5diff_615.out.err
+          h5diff_616.out
+          h5diff_616.out.err
+          h5diff_617.out
+          h5diff_617.out.err
+          h5diff_618.out
+          h5diff_618.out.err
+          h5diff_619.out
+          h5diff_619.out.err
+          h5diff_621.out
+          h5diff_621.out.err
+          h5diff_622.out
+          h5diff_622.out.err
+          h5diff_623.out
+          h5diff_623.out.err
+          h5diff_624.out
+          h5diff_624.out.err
+          h5diff_625.out
+          h5diff_625.out.err
+          h5diff_626.out
+          h5diff_626.out.err
+          h5diff_627.out
+          h5diff_627.out.err
+          h5diff_628.out
+          h5diff_628.out.err
+          h5diff_629.out
+          h5diff_629.out.err
+          h5diff_640.out
+          h5diff_640.out.err
+          h5diff_641.out
+          h5diff_641.out.err
+          h5diff_642.out
+          h5diff_642.out.err
+          h5diff_643.out
+          h5diff_643.out.err
+          h5diff_644.out
+          h5diff_644.out.err
+          h5diff_645.out
+          h5diff_645.out.err
+          h5diff_646.out
+          h5diff_646.out.err
+          h5diff_70.out
+          h5diff_70.out.err
+          h5diff_700.out
+          h5diff_700.out.err
+          h5diff_701.out
+          h5diff_701.out.err
+          h5diff_702.out
+          h5diff_702.out.err
+          h5diff_703.out
+          h5diff_703.out.err
+          h5diff_704.out
+          h5diff_704.out.err
+          h5diff_705.out
+          h5diff_705.out.err
+          h5diff_706.out
+          h5diff_706.out.err
+          h5diff_707.out
+          h5diff_707.out.err
+          h5diff_708.out
+          h5diff_708.out.err
+          h5diff_709.out
+          h5diff_709.out.err
+          h5diff_710.out
+          h5diff_710.out.err
+          h5diff_80.out
+          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 "")
+      set_tests_properties (H5DIFF-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5DIFF-clearall-objects")
+  endif ()
+
+# ############################################################################
+# # Common usage
+# ############################################################################
+
+# 1.0
+ADD_H5_TEST (h5diff_10 0 -h)
+
+# 1.1 normal mode
+ADD_H5_TEST (h5diff_11 1  ${FILE1} ${FILE2})
+
+# 1.2 normal mode with objects
+ADD_H5_TEST (h5diff_12 1  ${FILE1} ${FILE2}  g1/dset1 g1/dset2)
+
+# 1.3 report mode
+ADD_H5_TEST (h5diff_13 1 -r ${FILE1} ${FILE2})
+
+# 1.4 report  mode with objects
+ADD_H5_TEST (h5diff_14 1  -r ${FILE1} ${FILE2} g1/dset1 g1/dset2)
+
+# 1.5 with -d
+ADD_H5_TEST (h5diff_15 1 --report --delta=5 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 1.6.1 with -p (int)
+ADD_H5_TEST (h5diff_16_1 1 -v -p 0.02 ${FILE1} ${FILE1} g1/dset5 g1/dset6)
+
+# 1.6.2 with -p (unsigned long_long)
+ADD_H5_TEST (h5diff_16_2 1 --verbose --relative=0.02 ${FILE1} ${FILE1} g1/dset7 g1/dset8)
+
+# 1.6.3 with -p (double)
+ADD_H5_TEST (h5diff_16_3 1 -v -p 0.02 ${FILE1} ${FILE1} g1/dset9 g1/dset10)
+
+# 1.7 verbose mode
+ADD_H5_TEST (h5diff_17 1 -v ${FILE1} ${FILE2})
+
+# 1.7 test 32-bit INFINITY
+ADD_H5_TEST (h5diff_171 0 -v ${FILE1} ${FILE1} /g1/fp19 /g1/fp19_COPY)
+
+# 1.7 test 64-bit INFINITY
+ADD_H5_TEST (h5diff_172 0 -v ${FILE1} ${FILE1} /g1/fp20 /g1/fp20_COPY)
+
+# 1.8 quiet mode
+ADD_H5_TEST (h5diff_18 1 -q ${FILE1} ${FILE2})
+
+# 1.8 -v and -q
+ADD_H5_TEST (h5diff_18_1 2 -v -q ${FILE1} ${FILE2})
+
+# ##############################################################################
+# # not comparable types
+# ##############################################################################
+
+# 2.0
+ADD_H5_TEST (h5diff_20 0 -v ${FILE3} ${FILE3}  dset g1)
+
+# 2.1
+ADD_H5_TEST (h5diff_21 0 -v ${FILE3} ${FILE3} dset l1)
+
+# 2.2
+ADD_H5_TEST (h5diff_22 0 -v  ${FILE3} ${FILE3} dset t1)
+
+# ##############################################################################
+# # compare groups, types, links (no differences and differences)
+# ##############################################################################
+
+# 2.3
+ADD_H5_TEST (h5diff_23 0 -v ${FILE3} ${FILE3} g1 g1)
+
+# 2.4
+ADD_H5_TEST (h5diff_24 0 -v ${FILE3} ${FILE3} t1 t1)
+
+# 2.5
+ADD_H5_TEST (h5diff_25 0 -v ${FILE3} ${FILE3} l1 l1)
+
+# 2.6
+ADD_H5_TEST (h5diff_26 0 -v ${FILE3} ${FILE3} g1 g2)
+
+# 2.7
+ADD_H5_TEST (h5diff_27 1 -v ${FILE3} ${FILE3} t1 t2)
+
+# 2.8
+ADD_H5_TEST (h5diff_28 1 -v ${FILE3} ${FILE3} l1 l2)
+
+# ##############################################################################
+# # Enum value tests (may become more comprehensive in the future)
+# ##############################################################################
+
+# 3.0
+# test enum types which may have invalid values
+ADD_H5_TEST (h5diff_30 1 -v h5diff_enum_invalid_values.h5 h5diff_enum_invalid_values.h5 dset1 dset2)
+
+
+# ##############################################################################
+# # Dataset datatypes
+# ##############################################################################
+
+# 5.0
+ADD_H5_TEST (h5diff_50 1 -v ${FILE4} ${FILE4} dset0a dset0b)
+
+# 5.1
+ADD_H5_TEST (h5diff_51 1 -v ${FILE4} ${FILE4} dset1a dset1b)
+
+# 5.2
+ADD_H5_TEST (h5diff_52 1 -v ${FILE4} ${FILE4} dset2a dset2b)
+
+# 5.3
+ADD_H5_TEST (h5diff_53 1 -v ${FILE4} ${FILE4} dset3a dset4b)
+
+# 5.4
+ADD_H5_TEST (h5diff_54 1 -v ${FILE4} ${FILE4} dset4a dset4b)
+
+# 5.5
+ADD_H5_TEST (h5diff_55 1 -v ${FILE4} ${FILE4} dset5a dset5b)
+
+# 5.6
+ADD_H5_TEST (h5diff_56 1 -v ${FILE4} ${FILE4} dset6a dset6b)
+
+# 5.7
+ADD_H5_TEST (h5diff_57 0 -v ${FILE4} ${FILE4} dset7a dset7b)
+
+# 5.8 (region reference)
+ADD_H5_TEST (h5diff_58 1 -v ${FILE7} ${FILE8} refreg)
+
+# test for both dset and attr with same type but with different size
+# ( HDDFV-7942 )
+ADD_H5_TEST (h5diff_59 0 -v ${FILE4} ${FILE4} dset11a dset11b)
+
+# Strings
+# ( HDFFV-10128 )
+ADD_H5_TEST (h5diff_60 1 -v ${STRINGS1} ${STRINGS2} string1 string1)
+ADD_H5_TEST (h5diff_61 1 -v ${STRINGS1} ${STRINGS2} string2 string2)
+ADD_H5_TEST (h5diff_62 1 -v ${STRINGS1} ${STRINGS2} string3 string3)
+ADD_H5_TEST (h5diff_63 1 -v ${STRINGS1} ${STRINGS2} string4 string4)
+
+# ##############################################################################
+# # Error messages
+# ##############################################################################
+
+# 6.0: Check if the command line number of arguments is less than 3
+ADD_H5_TEST (h5diff_600 1 ${FILE1})
+
+# 6.1: Check if non-exist object name is specified
+ADD_H5_TEST (h5diff_601 2 ${FILE1} ${FILE1} nono_obj)
+
+# ##############################################################################
+# # -d
+# ##############################################################################
+
+# 6.3: negative value
+ADD_H5_TEST (h5diff_603 1 -d -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.4: zero
+ADD_H5_TEST (h5diff_604 1 -d 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.5: non number
+ADD_H5_TEST (h5diff_605 1 -d u ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.6: hexadecimal
+ADD_H5_TEST (h5diff_606 1 -d 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.7: string
+ADD_H5_TEST (h5diff_607 1 -d "1" ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.8: use system epsilon
+ADD_H5_TEST (h5diff_608 1 --use-system-epsilon ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
+
+# 6.9: number larger than biggest difference
+ADD_H5_TEST (h5diff_609 0 -d 200 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.10: number smaller than smallest difference
+ADD_H5_TEST (h5diff_610 1 -d 1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# ##############################################################################
+# # -p
+# ##############################################################################
+
+# 6.12: negative value
+ADD_H5_TEST (h5diff_612 1 -p -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.13: zero
+ADD_H5_TEST (h5diff_613 1 -p 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.14: non number
+ADD_H5_TEST (h5diff_614 1 -p u ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
+
+# 6.15: hexadecimal
+ADD_H5_TEST (h5diff_615 1 -p 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.16: string
+ADD_H5_TEST (h5diff_616 1 -p "0.21" ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.17: repeated option
+ADD_H5_TEST (h5diff_617 1 -p 0.21 -p 0.22 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.18: number larger than biggest difference
+ADD_H5_TEST (h5diff_618 0 -p 2 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.19: number smaller than smallest difference
+ADD_H5_TEST (h5diff_619 1 -p 0.005 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# ##############################################################################
+# # -n
+# ##############################################################################
+
+# 6.21: negative value
+ADD_H5_TEST (h5diff_621 1 -n -4 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.22: zero
+ADD_H5_TEST (h5diff_622 1 -n 0 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.23: non number
+ADD_H5_TEST (h5diff_623 1 -n u ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.24: hexadecimal
+ADD_H5_TEST (h5diff_624 1 -n 0x1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.25: string
+ADD_H5_TEST (h5diff_625 1 -n "2" ${FILE1} ${FILE2}  g1/dset3 g1/dset4)
+
+# 6.26: repeated option
+ADD_H5_TEST (h5diff_626 1 -n 2 -n 3 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.27: number larger than biggest difference
+ADD_H5_TEST (h5diff_627 1 --count=200 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# 6.28: number smaller than smallest difference
+ADD_H5_TEST (h5diff_628 1 -n 1 ${FILE1} ${FILE2} g1/dset3 g1/dset4)
+
+# Disabling this test as it hangs - LRK 20090618
+# 6.29  non valid files
+#ADD_H5_TEST (h5diff_629 2 file1.h6 file2.h6)
+
+# ##############################################################################
+# # NaN
+# ##############################################################################
+# 6.30: test (NaN == NaN) must be true based on our documentation -- XCAO
+ADD_H5_TEST (h5diff_630 0 -v -d "0.0001" ${FILE1} ${FILE1} g1/fp18 g1/fp18_COPY)
+ADD_H5_TEST (h5diff_631 0 -v --use-system-epsilon ${FILE1} ${FILE1} g1/fp18 g1/fp18_COPY)
+
+# ##############################################################################
+# 7.  attributes
+# ##############################################################################
+ADD_H5_TEST (h5diff_70 1 -v ${FILE5} ${FILE6})
+# temporary test to verify HDF5-8625
+ADD_H5_TEST (h5diff_tmp1 0 tmptest2.he5 tmptest.he5)
+# temporary test to verify HDF5-8639
+ADD_H5_TEST (h5diff_tmp2 1 tmpSingleSiteBethe.output.h5 tmpSingleSiteBethe.reference.h5)
+
+# ##################################################
+#  attrs with verbose option level
+# ##################################################
+ADD_H5_TEST (h5diff_700 1 -v1 ${FILE5} ${FILE6})
+ADD_H5_TEST (h5diff_701 1 -v2 ${FILE5} ${FILE6})
+ADD_H5_TEST (h5diff_702 1 --verbose=1 ${FILE5} ${FILE6})
+ADD_H5_TEST (h5diff_703 1 --verbose=2 ${FILE5} ${FILE6})
+
+# same attr number , all same attr name
+ADD_H5_TEST (h5diff_704 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g)
+
+# same attr number , some same attr name
+ADD_H5_TEST (h5diff_705 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /dset)
+
+# same attr number , all different attr name
+ADD_H5_TEST (h5diff_706 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /ntype)
+
+# different attr number , same attr name (intersected)
+ADD_H5_TEST (h5diff_707 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g2)
+
+# different attr number , all different attr name
+ADD_H5_TEST (h5diff_708 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g3)
+
+# when no attributes exist in both objects
+ADD_H5_TEST (h5diff_709 0 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2} /g4)
+
+# file vs file
+ADD_H5_TEST (h5diff_710 1 -v2 ${ATTR_VERBOSE_LEVEL_FILE1} ${ATTR_VERBOSE_LEVEL_FILE2})
+
+# ##############################################################################
+# 8.  all dataset datatypes
+# ##############################################################################
+ADD_H5_TEST (h5diff_80 1 -v ${FILE7} ${FILE8})
+
+# 9. compare a file with itself
+ADD_H5_TEST (h5diff_90 0 -v ${FILE2} ${FILE2})
+
+# 10. read by hyperslab, print indexes
+ADD_H5_TEST (h5diff_100 1 -v ${FILE9} ${FILE10})
+
+# 11. floating point comparison
+# double value
+ADD_H5_TEST (h5diff_101 1 -v ${FILE1} ${FILE1} g1/d1  g1/d2)
+
+# float value
+ADD_H5_TEST (h5diff_102 1 -v ${FILE1} ${FILE1} g1/fp1 g1/fp2)
+
+# with --use-system-epsilon for double value. expect less differences
+ADD_H5_TEST (h5diff_103 1 -v --use-system-epsilon ${FILE1} ${FILE1} g1/d1
+g1/d2)
+
+# with --use-system-epsilon for float value. expect less differences
+ADD_H5_TEST (h5diff_104 1 -v --use-system-epsilon ${FILE1} ${FILE1} g1/fp1 g1/fp2)
+
+# not comparable -c flag
+ADD_H5_TEST (h5diff_200 0 ${FILE2} ${FILE2} g2/dset1  g2/dset2)
+
+ADD_H5_TEST (h5diff_201 0 -c ${FILE2} ${FILE2} g2/dset1  g2/dset2)
+
+ADD_H5_TEST (h5diff_202 0 -c ${FILE2} ${FILE2} g2/dset2  g2/dset3)
+
+ADD_H5_TEST (h5diff_203 0 -c ${FILE2} ${FILE2} g2/dset3  g2/dset4)
+
+ADD_H5_TEST (h5diff_204 0 -c ${FILE2} ${FILE2} g2/dset4  g2/dset5)
+
+ADD_H5_TEST (h5diff_205 0 -c ${FILE2} ${FILE2} g2/dset5  g2/dset6)
+
+# not comparable in compound
+ADD_H5_TEST (h5diff_206 0 -c ${FILE2} ${FILE2} g2/dset7  g2/dset8)
+
+ADD_H5_TEST (h5diff_207 0 -c ${FILE2} ${FILE2} g2/dset8  g2/dset9)
+
+# not comparable in dataspace of zero dimension size
+ADD_H5_TEST (h5diff_208 0 -c ${FILE19} ${FILE20})
+
+# non-comparable dataset with comparable attribute, and other comparable datasets.
+# All the rest comparables should display differences.
+ADD_H5_TEST (h5diff_220 1 -c non_comparables1.h5 non_comparables2.h5 /g1)
+
+# comparable dataset with non-comparable attribute and other comparable attributes.
+# Also test non-compatible attributes with different type, dimention, rank.
+# All the rest comparables should display differences.
+ADD_H5_TEST (h5diff_221 1 -c non_comparables1.h5 non_comparables2.h5 /g2)
+
+# entire file
+# All the rest comparables should display differences
+ADD_H5_TEST (h5diff_222 1 -c non_comparables1.h5 non_comparables2.h5)
+
+# non-comparable test for common objects (same name) with different object types
+# (HDFFV-7644)
+ADD_H5_TEST (h5diff_223 0 -c non_comparables1.h5 non_comparables2.h5 /diffobjtypes)
+# swap files
+ADD_H5_TEST (h5diff_224 0 -c non_comparables2.h5 non_comparables1.h5 /diffobjtypes)
+
+# ##############################################################################
+# # Links compare without --follow-symlinks nor --no-dangling-links
+# ##############################################################################
+# test for bug1749
+ADD_H5_TEST (h5diff_300 1 -v ${FILE12} ${FILE12} /link_g1 /link_g2)
+
+# ##############################################################################
+# # Links compare with --follow-symlinks Only
+# ##############################################################################
+# soft links file to file
+ADD_H5_TEST (h5diff_400 0 --follow-symlinks -v ${FILE13} ${FILE13})
+
+# softlink vs dset"
+ADD_H5_TEST (h5diff_401 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset1_1 /target_dset2)
+
+# dset vs softlink"
+ADD_H5_TEST (h5diff_402 1 --follow-symlinks -v ${FILE13} ${FILE13} /target_dset2 /softlink_dset1_1)
+
+# softlink vs softlink"
+ADD_H5_TEST (h5diff_403 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset1_1 /softlink_dset2)
+
+# extlink vs extlink (FILE)"
+ADD_H5_TEST (h5diff_404 0 --follow-symlinks -v ${FILE15} ${FILE15})
+
+# extlink vs dset"
+ADD_H5_TEST (h5diff_405 1 --follow-symlinks -v ${FILE15} ${FILE16} /ext_link_dset1 /target_group2/x_dset)
+
+# dset vs extlink"
+ADD_H5_TEST (h5diff_406 1 --follow-symlinks -v ${FILE16} ${FILE15} /target_group2/x_dset /ext_link_dset1)
+
+# extlink vs extlink"
+ADD_H5_TEST (h5diff_407 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_dset2)
+
+# softlink vs extlink"
+ADD_H5_TEST (h5diff_408 1 --follow-symlinks -v ${FILE13} ${FILE15} /softlink_dset1_1 /ext_link_dset2)
+
+# extlink vs softlink "
+ADD_H5_TEST (h5diff_409 1 --follow-symlinks -v ${FILE15} ${FILE13} /ext_link_dset2 /softlink_dset1_1)
+
+# linked_softlink vs linked_softlink (FILE)"
+ADD_H5_TEST (h5diff_410 0 --follow-symlinks -v ${FILE14} ${FILE14})
+
+# dset2 vs linked_softlink_dset1"
+ADD_H5_TEST (h5diff_411 1 --follow-symlinks -v ${FILE14} ${FILE14} /target_dset2 /softlink1_to_slink2)
+
+# linked_softlink_dset1 vs dset2"
+ADD_H5_TEST (h5diff_412 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink1_to_slink2 /target_dset2)
+
+# linked_softlink_to_dset1 vs linked_softlink_to_dset2"
+ADD_H5_TEST (h5diff_413 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink1_to_slink2 /softlink2_to_slink2)
+
+# group vs linked_softlink_group1"
+ADD_H5_TEST (h5diff_414 1 --follow-symlinks -v ${FILE14} ${FILE14} /target_group /softlink3_to_slink2)
+
+# linked_softlink_group1 vs group"
+ADD_H5_TEST (h5diff_415 1 --follow-symlinks -v ${FILE14} ${FILE14} /softlink3_to_slink2 /target_group)
+
+# linked_softlink_to_group1 vs linked_softlink_to_group2"
+ADD_H5_TEST (h5diff_416 0 --follow-symlinks -v ${FILE14} ${FILE14} /softlink3_to_slink2 /softlink4_to_slink2)
+
+# non-exist-softlink vs softlink"
+ADD_H5_TEST (h5diff_417 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_noexist /softlink_dset2)
+
+# softlink vs non-exist-softlink"
+ADD_H5_TEST (h5diff_418 1 --follow-symlinks -v ${FILE13} ${FILE13} /softlink_dset2 /softlink_noexist)
+
+# non-exist-extlink_file vs extlink"
+ADD_H5_TEST (h5diff_419 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_noexist2 /ext_link_dset2)
+
+# exlink vs non-exist-extlink_file"
+ADD_H5_TEST (h5diff_420 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset2 /ext_link_noexist2)
+
+# extlink vs non-exist-extlink_obj"
+ADD_H5_TEST (h5diff_421 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_dset2 /ext_link_noexist1)
+
+# non-exist-extlink_obj vs extlink"
+ADD_H5_TEST (h5diff_422 1 --follow-symlinks -v ${FILE15} ${FILE15} /ext_link_noexist1 /ext_link_dset2)
+
+# extlink_to_softlink_to_dset1 vs dset2"
+ADD_H5_TEST (h5diff_423 1 --follow-symlinks -v ${FILE17} ${FILE18} /ext_link_to_slink1 /dset2)
+
+# dset2 vs extlink_to_softlink_to_dset1"
+ADD_H5_TEST (h5diff_424 1 --follow-symlinks -v ${FILE18} ${FILE17} /dset2 /ext_link_to_slink1)
+
+# extlink_to_softlink_to_dset1 vs extlink_to_softlink_to_dset2"
+ADD_H5_TEST (h5diff_425 1 --follow-symlinks -v ${FILE17} ${FILE17} /ext_link_to_slink1 /ext_link_to_slink2)
+
+# ##############################################################################
+# # Dangling links compare (--follow-symlinks and --no-dangling-links)
+# ##############################################################################
+# dangling links --follow-symlinks (FILE to FILE)
+ADD_H5_TEST (h5diff_450 1  --follow-symlinks -v ${DANGLE_LINK_FILE1} ${DANGLE_LINK_FILE2})
+
+# dangling links --follow-symlinks and --no-dangling-links (FILE to FILE)
+ADD_H5_TEST (h5diff_451 2  --follow-symlinks -v --no-dangling-links  ${DANGLE_LINK_FILE1} ${DANGLE_LINK_FILE2})
+
+# try --no-dangling-links without --follow-symlinks options
+ADD_H5_TEST (h5diff_452 2  --no-dangling-links  ${FILE13} ${FILE13})
+
+# dangling link found for soft links (FILE to FILE)
+ADD_H5_TEST (h5diff_453 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13})
+
+# dangling link found for soft links (obj to obj)
+ADD_H5_TEST (h5diff_454 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13} /softlink_dset2 /softlink_noexist)
+
+# dangling link found for soft links (obj to obj) Both dangle links
+ADD_H5_TEST (h5diff_455 2  --follow-symlinks -v --no-dangling-links  ${FILE13} ${FILE13} /softlink_noexist /softlink_noexist)
+
+# dangling link found for ext links (FILE to FILE)
+ADD_H5_TEST (h5diff_456 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15})
+
+# dangling link found for ext links (obj to obj). target file exist
+ADD_H5_TEST (h5diff_457 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_noexist1)
+
+# dangling link found for ext links (obj to obj). target file NOT exist
+ADD_H5_TEST (h5diff_458 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_dset1 /ext_link_noexist2)
+
+# dangling link found for ext links (obj to obj). Both dangle links
+ADD_H5_TEST (h5diff_459 2  --follow-symlinks -v --no-dangling-links  ${FILE15} ${FILE15} /ext_link_noexist1 /ext_link_noexist2)
+
+# dangling link --follow-symlinks (obj vs obj)
+# (HDFFV-7836)
+ADD_H5_TEST (h5diff_465 0 --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
+# (HDFFV-7835)
+# soft dangling vs. soft dangling
+ADD_H5_TEST (h5diff_466 0 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
+# soft link  vs. soft dangling
+ADD_H5_TEST (h5diff_467 1 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link2)
+# ext dangling vs. ext dangling
+ADD_H5_TEST (h5diff_468 0 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4)
+# ext link vs. ext dangling
+ADD_H5_TEST (h5diff_469 1 -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link2)
+
+#---------------------------------------------------
+# dangling links without follow symlink
+# (HDFFV-7998)
+# test - soft dangle links (same and different paths),
+#      - external dangle links (same and different paths)
+ADD_H5_TEST (h5diff_471 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5)
+ADD_H5_TEST (h5diff_472 0 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1)
+ADD_H5_TEST (h5diff_473 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link4)
+ADD_H5_TEST (h5diff_474 0 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4)
+ADD_H5_TEST (h5diff_475 1 -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link1)
+
+
+# ##############################################################################
+# # test for group diff recursivly
+# ##############################################################################
+# root
+ADD_H5_TEST (h5diff_500 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
+ADD_H5_TEST (h5diff_501 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
+
+# root vs group
+ADD_H5_TEST (h5diff_502 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /grp1/grp2/grp3)
+
+# group vs group (same name and structure)
+ADD_H5_TEST (h5diff_503 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /grp1)
+
+# group vs group (different name and structure)
+ADD_H5_TEST (h5diff_504 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /grp1/grp2/grp3)
+
+# groups vs soft-link
+ADD_H5_TEST (h5diff_505 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /slink_grp1)
+ADD_H5_TEST (h5diff_506 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /slink_grp2)
+
+# groups vs ext-link
+ADD_H5_TEST (h5diff_507 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
+ADD_H5_TEST (h5diff_508 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
+
+# soft-link vs ext-link
+ADD_H5_TEST (h5diff_509 0 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
+ADD_H5_TEST (h5diff_510 0 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
+
+# circled ext links
+ADD_H5_TEST (h5diff_511 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
+ADD_H5_TEST (h5diff_512 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
+
+# circled soft2ext-link vs soft2ext-link
+ADD_H5_TEST (h5diff_513 1 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
+ADD_H5_TEST (h5diff_514 1 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
+
+###############################################################################
+# Test for group recursive diff via multi-linked external links
+# With follow-symlinks, file $GRP_RECURSE1_EXT and $GRP_RECURSE2_EXT1 should
+# be same with the external links.
+###############################################################################
+# file vs file
+ADD_H5_TEST (h5diff_515 1 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
+ADD_H5_TEST (h5diff_516 0 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
+# group vs group
+ADD_H5_TEST (h5diff_517 1 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
+ADD_H5_TEST (h5diff_518 0 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
+
+# ##############################################################################
+# # Exclude objects (--exclude-path)
+# ##############################################################################
+#
+# Same structure, same names and different value.
+#
+# Exclude the object with different value. Expect return - same
+ADD_H5_TEST (h5diff_480 0 -v --exclude-path /group1/dset3 ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
+# Verify different by not excluding. Expect return - diff
+ADD_H5_TEST (h5diff_481 1 -v ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
+
+#
+# Different structure, different names.
+#
+# Exclude all the different objects. Expect return - same
+ADD_H5_TEST (h5diff_482 0 -v --exclude-path "/group1" --exclude-path "/dset1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
+# Exclude only some different objects. Expect return - diff
+ADD_H5_TEST (h5diff_483 1 -v --exclude-path "/group1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
+
+# Exclude from group compare
+ADD_H5_TEST (h5diff_484 0 -v --exclude-path "/dset3" ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2} /group1)
+
+#
+# Only one file contains unique objs. Common objs are same.
+# (HDFFV-7837)
+#
+ADD_H5_TEST (h5diff_485 0 -v --exclude-path "/group1" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5)
+ADD_H5_TEST (h5diff_486 0 -v --exclude-path "/group1" h5diff_exclude3-2.h5 h5diff_exclude3-1.h5)
+ADD_H5_TEST (h5diff_487 1 -v --exclude-path "/group1/dset" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5)
+
+
+
+# ##############################################################################
+# # diff various multiple vlen and fixed strings in a compound type dataset
+# ##############################################################################
+ADD_H5_TEST (h5diff_530 0 -v  ${COMP_VL_STRS_FILE} ${COMP_VL_STRS_FILE} /group /group_copy)
+
+# ##############################################################################
+# # Test container types (array,vlen) with multiple nested compound types
+# # Complex compound types in dataset and attribute
+# ##############################################################################
+ADD_H5_TEST (h5diff_540 1 -v ${COMPS_ARRAY_VLEN_FILE1} ${COMPS_ARRAY_VLEN_FILE2})
+
+# ##############################################################################
+# # Test mutually exclusive options
+# ##############################################################################
+#
+# Test with -d , -p and --use-system-epsilon.
+ADD_H5_TEST (h5diff_640 1 -v -d 5 -p 0.05 --use-system-epsilon ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
+ADD_H5_TEST (h5diff_641 1 -v -d 5 -p 0.05 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
+ADD_H5_TEST (h5diff_642 1 -v -p 0.05 -d 5 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
+ADD_H5_TEST (h5diff_643 1 -v -d 5 --use-system-epsilon ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
+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 tests
+# ##############################################################################
+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})
+
+##############################################################################
+###    P L U G I N  T E S T S
+##############################################################################
+ADD_H5_UD_TEST (h5diff_plugin_test 0 h5diff_ud -v tudfilter.h5 tudfilter2.h5)
+ADD_H5_UD_TEST (h5diff_plugin_fail 2 h5diff_udfail -v tudfilter.h5 tudfilter2.h5)
+
+# ##############################################################################
+# # END
+# ##############################################################################
diff --git a/tools/test/h5diff/Makefile.am b/tools/test/h5diff/Makefile.am
new file mode 100644
index 0000000..5721aaa
--- /dev/null
+++ b/tools/test/h5diff/Makefile.am
@@ -0,0 +1,71 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Always build and test h5diff but build and test ph5diff only if parallel
+# is enabled.
+if BUILD_PARALLEL_CONDITIONAL
+  H5PDIFF=../../src/h5diff/ph5diff
+  TEST_SCRIPT_PARA=testph5diff.sh
+endif
+
+# Test programs and scripts
+TEST_PROG=h5diffgentest
+TEST_SCRIPT=testh5diff.sh
+
+check_PROGRAMS=$(TEST_PROG)
+check_SCRIPTS=$(TEST_SCRIPT) $(TEST_SCRIPT_PARA)
+# The parallel test script testph5diff.sh actually depends on testh5diff.sh.
+SCRIPT_DEPEND=../../src/h5diff/h5diff$(EXEEXT) $(H5PDIFF) ../../src/h5diff/testh5diff.sh
+if HAVE_SHARED_CONDITIONAL
+if USE_PLUGINS_CONDITIONAL
+   TEST_SCRIPT += h5diff_plugin.sh
+endif
+endif
+
+# Source files for the program
+h5diffgentest_SOURCES=h5diffgentest.c
+
+# Programs depend on the main HDF5 library and tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+if HAVE_SHARED_CONDITIONAL
+  # Build it as shared library if configure is enabled for shared library.
+  dyn_LTLIBRARIES=libdynlibdiff.la
+  libdynlibdiff_la_SOURCES=dynlib_diff.c
+  libdynlibdiff_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+libdynlibdiff.la: $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_DEPENDENCIES) $(EXTRA_libdynlibdiff_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlibdiff_la_LINK) $(am_libdynlibdiff_la_rpath) $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_LIBADD) 
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+endif
+
+# Temporary files.  *.h5 are generated by h5diff.  They should
+# be copied to the testfiles/ directory if update is required
+CHECK_CLEANFILES+=*.h5 expect_sorted actual_sorted
+
+DISTCLEANFILES=h5diff_plugin.sh
+
+include $(top_srcdir)/config/conclude.am
+
diff --git a/tools/test/h5diff/Makefile.in b/tools/test/h5diff/Makefile.in
new file mode 100644
index 0000000..ee41e2a
--- /dev/null
+++ b/tools/test/h5diff/Makefile.in
@@ -0,0 +1,1511 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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)
+ at HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5diff_plugin.sh
+TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5diff_plugin.sh testh5diff.sh testph5diff.sh
+CONFIG_CLEAN_VPATH_FILES =
+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__installdirs = "$(DESTDIR)$(dyndir)"
+LTLIBRARIES = $(dyn_LTLIBRARIES)
+libdynlibdiff_la_LIBADD =
+am__libdynlibdiff_la_SOURCES_DIST = dynlib_diff.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibdiff_la_OBJECTS =  \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_diff.lo
+libdynlibdiff_la_OBJECTS = $(am_libdynlibdiff_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 = 
+libdynlibdiff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libdynlibdiff_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibdiff_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+am__EXEEXT_1 = h5diffgentest$(EXEEXT)
+am_h5diffgentest_OBJECTS = h5diffgentest.$(OBJEXT)
+h5diffgentest_OBJECTS = $(am_h5diffgentest_OBJECTS)
+h5diffgentest_LDADD = $(LDADD)
+h5diffgentest_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 = $(libdynlibdiff_la_SOURCES) $(h5diffgentest_SOURCES)
+DIST_SOURCES = $(am__libdynlibdiff_la_SOURCES_DIST) \
+	$(h5diffgentest_SOURCES)
+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__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)/h5diff_plugin.sh.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@
+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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+
+# Temporary files.  *.h5 are generated by h5diff.  They should
+# be copied to the testfiles/ directory if update is required
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 expect_sorted \
+	actual_sorted
+
+# Always build and test h5diff but build and test ph5diff only if parallel
+# is enabled.
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@H5PDIFF = ../../src/h5diff/ph5diff
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@TEST_SCRIPT_PARA = testph5diff.sh
+
+# Test programs and scripts
+TEST_PROG = h5diffgentest
+TEST_SCRIPT = testh5diff.sh $(am__append_1)
+check_SCRIPTS = $(TEST_SCRIPT) $(TEST_SCRIPT_PARA)
+# The parallel test script testph5diff.sh actually depends on testh5diff.sh.
+SCRIPT_DEPEND = ../../src/h5diff/h5diff$(EXEEXT) $(H5PDIFF) ../../src/h5diff/testh5diff.sh
+
+# Source files for the program
+h5diffgentest_SOURCES = h5diffgentest.c
+
+# Programs depend on the main HDF5 library and tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+ at HAVE_SHARED_CONDITIONAL_TRUE@dyn_LTLIBRARIES = libdynlibdiff.la
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdiff_la_SOURCES = dynlib_diff.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdiff_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+DISTCLEANFILES = h5diff_plugin.sh
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5diff/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5diff/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):
+h5diff_plugin.sh: $(top_builddir)/config.status $(srcdir)/h5diff_plugin.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testh5diff.sh: $(top_builddir)/config.status $(srcdir)/testh5diff.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testph5diff.sh: $(top_builddir)/config.status $(srcdir)/testph5diff.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-dynLTLIBRARIES: $(dyn_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dyndir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dyndir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dyndir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dyndir)"; \
+	}
+
+uninstall-dynLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dyndir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dyndir)/$$f"; \
+	done
+
+clean-dynLTLIBRARIES:
+	-test -z "$(dyn_LTLIBRARIES)" || rm -f $(dyn_LTLIBRARIES)
+	@list='$(dyn_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlibdiff.la: $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_DEPENDENCIES) $(EXTRA_libdynlibdiff_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlibdiff_la_LINK) $(am_libdynlibdiff_la_rpath) $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_LIBADD) $(LIBS)
+
+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
+
+h5diffgentest$(EXEEXT): $(h5diffgentest_OBJECTS) $(h5diffgentest_DEPENDENCIES) $(EXTRA_h5diffgentest_DEPENDENCIES) 
+	@rm -f h5diffgentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5diffgentest_OBJECTS) $(h5diffgentest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_diff.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5diffgentest.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+h5diffgentest.log: h5diffgentest$(EXEEXT)
+	@p='h5diffgentest$(EXEEXT)'; \
+	b='h5diffgentest'; \
+	$(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 $(LTLIBRARIES) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(dyndir)"; 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-checkPROGRAMS clean-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+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: uninstall-dynLTLIBRARIES
+
+.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-dynLTLIBRARIES \
+	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-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+.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
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdiff.la: $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_DEPENDENCIES) $(EXTRA_libdynlibdiff_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlibdiff_la_LINK) $(am_libdynlibdiff_la_rpath) $(libdynlibdiff_la_OBJECTS) $(libdynlibdiff_la_LIBADD) 
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-dyn: $(DYN)
+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 dyn 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/test/h5diff/dynlib_diff.c b/tools/test/h5diff/dynlib_diff.c
new file mode 100644
index 0000000..571452e
--- /dev/null
+++ b/tools/test/h5diff/dynlib_diff.c
@@ -0,0 +1,89 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIBUD      300
+#define MULTIPLIER              3
+
+static size_t H5Z_filter_dynlibud(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_DYNLIBUD[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIBUD,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlibud",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlibud,    /* The actual filter function    */
+}};
+
+H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+const void   *H5PLget_plugin_info(void) {return H5Z_DYNLIBUD;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlibud
+ *
+ * Purpose:    A dynlib2 filter method that multiplies the original value
+ *              during write and divide the original value during read. It
+ *              will be built as a shared library.  plugin.c test will load
+ *              and use this filter library.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    char *int_ptr = (char *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+
+    /* Check for the correct number of parameters */
+    if(cd_nelmts > 0)
+        return(0);
+
+    /* Assignment to eliminate unused parameter warning. */
+    cd_values = cd_values;
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Subtract the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp - MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp + MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlibud() */
+
diff --git a/tools/test/h5diff/h5diff_plugin.sh.in b/tools/test/h5diff/h5diff_plugin.sh.in
new file mode 100644
index 0000000..0390c40
--- /dev/null
+++ b/tools/test/h5diff/h5diff_plugin.sh.in
@@ -0,0 +1,313 @@
+#! /bin/sh
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+srcdir=@srcdir@
+TOP_BUILDDIR=@top_builddir@
+
+# Determine backward compatibility options enabled
+DEPRECATED_SYMBOLS="@DEPRECATED_SYMBOLS@"
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5DIFF=../../src/h5diff/h5diff               # The tool name
+H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the tool binary
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes        # default is yes
+
+TEST_NAME=ud_plugin
+FROM_DIR=`pwd`/.libs
+PLUGIN_LIB="$FROM_DIR/libdynlibdiff.*"
+PLUGIN_LIBDIR=testdir3
+RM='rm -rf'
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# source dirs
+SRC_TOOLS="$srcdir/../.."
+
+# testfiles source dirs for tools
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/test/h5diff/testfiles"
+
+TESTDIR=./testplug
+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_H5DIFF_TESTFILES/tudfilter.h5
+$SRC_H5DIFF_TESTFILES/tudfilter2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_ud.txt
+$SRC_H5DIFF_TESTFILES/h5diff_udfail.txt
+"
+
+# Main Body
+# Create test directories if not exists yet.
+test -d $PLUGIN_LIBDIR || mkdir -p $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to create test directory($PLUGIN_LIBDIR)"
+    exit $EXIT_FAILURE
+fi
+
+# copy plugin library for test
+$CP $PLUGIN_LIB $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to copy plugin library ($PLUGIN_LIB) for test."
+    exit $EXIT_FAILURE
+fi
+
+# setup plugin path
+ENVCMD="env HDF5_PLUGIN_PATH=../${PLUGIN_LIBDIR}"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_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=$SRC_H5DIFF_TESTFILES
+    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
+}
+
+# Parse option
+#   -p   run ph5diff tests
+#   -h   print help page
+while [ $# -gt 0 ]; do
+    case "$1" in
+    -p)    # reset the tool name and bin to run ph5diff tests
+    TESTNAME=ph5diff
+    H5DIFF=../../src/h5diff/ph5diff  # The tool name
+    H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the tool binary
+    pmode=yes
+    shift
+    ;;
+    -h) # print help page
+    echo "$0 [-p] [-h]"
+    echo "    -p   run ph5diff tests"
+    echo "    -h   print help page"
+    shift
+    exit 0
+    ;;
+    *)  # unknown option
+        echo "$0: Unknown option ($1)"
+    exit 1
+    ;;
+    esac
+done
+
+# 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
+
+
+# Print a $* message left justified in a field of 70 characters
+#
+MESSAGE() {
+   SPACES="                                                               "
+   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# 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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY() {
+    MESSAGE "Verifying $*"
+}
+
+# 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.
+#
+# Need eval before the RUNCMD command because some machines like
+# AIX, has RUNPARALLEL in the style as
+#   MP_PROCS=3 MP_TASKS_PER_NODE=3 poe ./a.out
+# that throws the shell script off.
+#
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .txt`.out"
+    actual_err="$TESTDIR/`basename $1 .txt`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+    if test -n "$pmode"; then
+        RUNCMD=$RUNPARALLEL
+    else
+        RUNCMD=$RUNSERIAL
+    fi
+
+    # Run test.
+    TESTING $H5DIFF $@
+    (
+    #echo "#############################"
+    #echo "Expected output for '$H5DIFF $@'"
+    #echo "#############################"
+    cd $TESTDIR
+    eval $ENVCMD $RUNCMD $H5DIFF_BIN "$@"
+    ) >$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
+    # 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
+    # serial mode, so the test is fullfilled.
+    if test $h5haveexitcode = 'yes' -a -z "$pmode"; then
+      echo "EXIT CODE: $EXIT_CODE" >> $actual
+    fi
+
+    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"
+    elif test $h5haveexitcode = 'yes' -a -z "$pmode"; then
+        echo "*FAILED*"
+        echo "    Expected result ($expect) differs from actual result ($actual)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    else
+        # 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
+        actual_sorted=actual_sorted
+        sort $expect -o $expect_sorted
+        sort $actual -o $actual_sorted
+        # remove "EXIT CODE:" line from expect file. test for exit code
+        # is done by serial mode.
+        grep -v "EXIT CODE:" $expect_sorted > $expect_sorted.noexit
+        mv $expect_sorted.noexit $expect_sorted
+    if $CMP $expect_sorted $actual_sorted; then
+        echo " PASSED"
+    else
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+        if test yes = "$verbose"; then
+        echo "====Expected result ($expect_sorted) differs from actual result ($actual_sorted)"
+        $DIFF $expect_sorted $actual_sorted |sed 's/^/    /'
+        echo "====The actual output ($actual_sav)"
+        sed 's/^/    /' < $actual_sav
+        echo "====The actual stderr ($actual_err_sav)"
+        sed 's/^/    /' < $actual_err_sav
+        echo "====End of actual stderr ($actual_err_sav)"
+        echo ""
+        fi
+    fi
+    fi
+
+    # 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
+    fi
+}
+
+##############################################################################
+###           T H E   T E S T S
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# Run the test
+TOOLTEST h5diff_ud.txt -v tudfilter.h5 tudfilter2.h5
+
+# print results
+if test $nerrors -ne 0 ; then
+    echo "$nerrors errors encountered"
+    exit_code=$EXIT_FAILURE
+else
+    echo "All Plugin API tests passed."
+    exit_code=$EXIT_SUCCESS
+fi
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Clean up temporary files/directories and leave
+$RM $PLUGIN_LIBDIR
+
+exit $exit_code
diff --git a/tools/test/h5diff/h5diffgentest.c b/tools/test/h5diff/h5diffgentest.c
new file mode 100644
index 0000000..cc7b057
--- /dev/null
+++ b/tools/test/h5diff/h5diffgentest.c
@@ -0,0 +1,7544 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 "hdf5.h"
+#include "H5private.h"
+
+/*
+ * The output functions need a temporary buffer to hold a piece of the
+ * dataset while it's being printed. This constant sets the limit on the
+ * size of that temporary buffer in bytes. For efficiency's sake, choose the
+ * largest value suitable for your machine (for testing use a small value).
+ */
+/* Maximum size used in a call to malloc for a dataset
+ * NOTE: this value should stay in sync with the value defined in the tools
+ *       library file: h5tools_utils.h
+ */
+size_t H5TOOLS_MALLOCSIZE = (128 * 1024 * 1024);
+
+/*-------------------------------------------------------------------------
+* Program: h5diffgentest
+*
+* Purpose: generate files for h5diff testing
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+
+#define FILE1    "h5diff_basic1.h5"
+#define FILE2    "h5diff_basic2.h5"
+#define FILE3    "h5diff_types.h5"
+#define FILE4    "h5diff_dtypes.h5"
+#define FILE5    "h5diff_attr1.h5"
+#define FILE6    "h5diff_attr2.h5"
+#define FILE7    "h5diff_dset1.h5"
+#define FILE8    "h5diff_dset2.h5"
+#define FILE9    "h5diff_hyper1.h5"
+#define FILE10   "h5diff_hyper2.h5"
+#define FILE11   "h5diff_empty.h5"
+#define FILE12   "h5diff_links.h5"
+#define FILE13   "h5diff_softlinks.h5"
+#define FILE14   "h5diff_linked_softlink.h5"
+#define FILE15   "h5diff_extlink_src.h5"
+#define FILE16   "h5diff_extlink_trg.h5"
+#define FILE17   "h5diff_ext2softlink_src.h5"
+#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"
+#define GRP_RECURSE_FILE2   "h5diff_grp_recurse2.h5"
+/* same structure via external links through files */
+#define GRP_RECURSE1_EXT    "h5diff_grp_recurse_ext1.h5"
+#define GRP_RECURSE2_EXT1   "h5diff_grp_recurse_ext2-1.h5"
+#define GRP_RECURSE2_EXT2   "h5diff_grp_recurse_ext2-2.h5"
+#define GRP_RECURSE2_EXT3   "h5diff_grp_recurse_ext2-3.h5"
+/* same structure, same obj name with different value */
+#define EXCLUDE_FILE1_1     "h5diff_exclude1-1.h5"
+#define EXCLUDE_FILE1_2     "h5diff_exclude1-2.h5"
+/* different structure and obj names */
+#define EXCLUDE_FILE2_1     "h5diff_exclude2-1.h5"
+#define EXCLUDE_FILE2_2     "h5diff_exclude2-2.h5"
+/* only one file has unique objs  */
+#define EXCLUDE_FILE3_1     "h5diff_exclude3-1.h5"
+#define EXCLUDE_FILE3_2     "h5diff_exclude3-2.h5"
+/* compound type with multiple vlen string types */
+#define COMP_VL_STRS_FILE   "h5diff_comp_vl_strs.h5"
+/* attribute compre with verbose level */
+#define ATTR_VERBOSE_LEVEL_FILE1 "h5diff_attr_v_level1.h5"
+#define ATTR_VERBOSE_LEVEL_FILE2 "h5diff_attr_v_level2.h5"
+/* file containing valid/invalid enum value mix */
+#define ENUM_INVALID_VALUES "h5diff_enum_invalid_values.h5"
+/* file with container types (array,vlen) with multiple compounds */
+#define COMPS_COMPLEX1   "compounds_array_vlen1.h5"
+#define COMPS_COMPLEX2   "compounds_array_vlen2.h5"
+/* non-comparable dataset and attribute */
+#define NON_COMPARBLES1 "non_comparables1.h5"
+#define NON_COMPARBLES2 "non_comparables2.h5"
+/* string dataset and attribute */
+#define DIFF_STRINGS1 "diff_strings1.h5"
+#define DIFF_STRINGS2 "diff_strings2.h5"
+
+#define UIMAX    4294967295u /*Maximum value for a variable of type unsigned int */
+#define STR_SIZE 3
+#define GBLL    ((unsigned long long) 1024 * 1024 *1024 )
+
+#define MY_LINKCLASS 187
+
+/* Dataspace of 0 dimension size */
+#define SPACE1_RANK 2
+#define SPACE1_DIM1 0
+#define SPACE1_DIM2 0
+
+/* A UD link traversal function.  Shouldn't actually be called. */
+static hid_t UD_traverse(H5_ATTR_UNUSED const char * link_name, H5_ATTR_UNUSED hid_t cur_group,
+                         H5_ATTR_UNUSED const void * udata, H5_ATTR_UNUSED size_t udata_size, H5_ATTR_UNUSED hid_t lapl_id)
+{
+    return -1;
+}
+const H5L_class_t UD_link_class[1] = {{
+    H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
+        (H5L_type_t)MY_LINKCLASS,             /* Link type id number            */
+        "UD link class",          /* name for debugging             */
+        NULL,                     /* Creation callback              */
+        NULL,                     /* Move/rename callback           */
+        NULL,                     /* Copy callback                  */
+        UD_traverse,              /* The actual traversal function  */
+        NULL,                     /* Deletion callback              */
+        NULL                      /* Query callback                 */
+}};
+
+
+/*-------------------------------------------------------------------------
+* prototypes
+*-------------------------------------------------------------------------
+*/
+
+/* tests called in main() */
+static int test_basic(const char *fname1, const char *fname2, const char *fname3);
+static int test_types(const char *fname);
+static int test_datatypes(const char *fname);
+static int test_attributes(const char *fname,int make_diffs);
+static int test_datasets(const char *fname,int make_diffs);
+static int test_special_datasets(const char *fname,int make_diffs);
+static int test_hyperslab(const char *fname,int make_diffs);
+static int test_link_name(const char *fname1);
+static int test_soft_links(const char *fname1);
+static int test_linked_softlinks(const char *fname1);
+static int test_external_links(const char *fname1, const char *fname2);
+static int test_ext2soft_links(const char *fname1, const char *fname2);
+static int test_dangle_links(const char *fname1, const char *fname2);
+static int test_group_recurse(const char *fname1, const char *fname2);
+static int test_group_recurse2(void);
+static int test_exclude_obj1(const char *fname1, const char *fname2);
+static int test_exclude_obj2(const char *fname1, const char *fname2);
+static int test_exclude_obj3(const char *fname1, const char *fname2);
+static int test_comp_vlen_strings(const char *fname1, const char *grp_name, int is_file_new);
+static int test_attributes_verbose_level(const char *fname1, const char *fname2);
+static int test_enums(const char *fname);
+static void test_comps_array (const char *fname, const char *dset, const char *attr,int diff, int is_file_new);
+static void test_comps_vlen (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
+static void test_comps_array_vlen (const char *fname, const char *dset, const char *attr, int diff, int is_file_new);
+static void test_comps_vlen_arry (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
+static void test_data_nocomparables (const char *fname, int diff);
+static void test_objs_nocomparables (const char *fname1, const char *fname2);
+static void test_objs_strings (const char *fname, const char *fname2);
+
+/* called by test_attributes() and test_datasets() */
+static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
+static void write_dset_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
+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);
+
+
+/*-------------------------------------------------------------------------
+* Function: main
+*
+* Purpose: main program
+*
+*-------------------------------------------------------------------------
+*/
+
+int main(void)
+{
+    test_basic(FILE1, FILE2, FILE11);
+
+    test_types (FILE3);
+    test_datatypes(FILE4);
+
+    /* generate 2 files, the second call creates a similar file with differences */
+    test_attributes(FILE5,0);
+    test_attributes(FILE6,1);
+
+    /* test attributes with verbose level */
+    test_attributes_verbose_level(ATTR_VERBOSE_LEVEL_FILE1, ATTR_VERBOSE_LEVEL_FILE2);
+
+    /* generate 2 files, the second call creates a similar file with differences */
+    test_datasets(FILE7,0);
+    test_datasets(FILE8,1);
+
+    /* generate 2 files, the second call creates a similar file with differences */
+    test_hyperslab(FILE9,0);
+    test_hyperslab(FILE10,1);
+
+    test_link_name(FILE12);
+
+    test_soft_links(FILE13);
+
+    test_linked_softlinks(FILE14);
+
+    test_external_links(FILE15, FILE16);
+
+    test_ext2soft_links(FILE17, FILE18);
+
+    /* generate 2 files, the second call creates a similar file with differences */
+    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);
+    test_group_recurse2();
+
+    test_exclude_obj1(EXCLUDE_FILE1_1, EXCLUDE_FILE1_2);
+    test_exclude_obj2(EXCLUDE_FILE2_1, EXCLUDE_FILE2_2);
+    test_exclude_obj3(EXCLUDE_FILE3_1, EXCLUDE_FILE3_2);
+
+    /* diff various multiple vlen and fixlen string types in a compound dataset */
+    test_comp_vlen_strings(COMP_VL_STRS_FILE, "group", 1);
+    test_comp_vlen_strings(COMP_VL_STRS_FILE, "group_copy", 0);
+
+    /* diff when invalid enum values are present.
+     * This will probably grow to involve more extensive testing of
+     * enums so it has been given its own test file and test (apart
+     * from the basic type testing).
+     */
+    test_enums(ENUM_INVALID_VALUES);
+
+    /* -------------------------------------------------
+     * Create test files with dataset and attribute with container types
+     * (array, vlen) with multiple nested compound types.
+     */
+    /* file1 */
+    test_comps_array(COMPS_COMPLEX1,"dset1", "attr1", 0, 1);
+    test_comps_vlen(COMPS_COMPLEX1,"dset2", "attr2", 0, 0);
+    test_comps_array_vlen(COMPS_COMPLEX1,"dset3", "attr3", 0, 0);
+    test_comps_vlen_arry(COMPS_COMPLEX1,"dset4", "attr4", 0, 0);
+    /* file2 */
+    test_comps_array(COMPS_COMPLEX2,"dset1", "attr1", 5, 1);
+    test_comps_vlen(COMPS_COMPLEX2,"dset2", "attr2",5, 0);
+    test_comps_array_vlen(COMPS_COMPLEX2,"dset3", "attr3", 5, 0);
+    test_comps_vlen_arry(COMPS_COMPLEX2,"dset4", "attr4", 5, 0);
+
+    /*-------------------------------------------------
+     * Create test files with non-comparable dataset and attributes with
+     * comparable datasets and attributes.  All the comparables should display
+     * differences.
+     */
+    test_data_nocomparables(NON_COMPARBLES1,0);
+    test_data_nocomparables(NON_COMPARBLES2,5);
+
+    /* common objects (same name) with different object types. HDFFV-7644 */
+    test_objs_nocomparables(NON_COMPARBLES1, NON_COMPARBLES2);
+
+    /* string dataset and attribute. HDFFV-10028 */
+    test_objs_strings(DIFF_STRINGS1, DIFF_STRINGS2);
+
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+* Function: test_basic
+*
+* Purpose: Create basic test files, first two contains different data, the
+* third one is just an empty file.
+*
+*-------------------------------------------------------------------------
+*/
+
+static
+int test_basic(const char *fname1, const char *fname2, const char *fname3)
+{
+    hid_t   fid1, fid2;
+    hid_t   gid1, gid2, gid3;
+    hsize_t dims1[1] = { 6 };
+    hsize_t dims2[2] = { 3,2 };
+
+    /* create the empty file */
+    if ((fid1=H5Fcreate(fname3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0){
+        fprintf(stderr, "empty file (%s) creation failed.\n", fname3);
+        goto out;
+    }
+    if (H5Fclose(fid1) < 0){
+        fprintf(stderr, "empty file (%s) close failed.\n", fname3);
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * create two files
+    *-------------------------------------------------------------------------
+    */
+
+    if (( fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 )
+        goto out;
+    if (( fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 )
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * create groups
+    *-------------------------------------------------------------------------
+    */
+
+    gid1 = H5Gcreate2(fid1, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid2 = H5Gcreate2(fid2, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid3 = H5Gcreate2(fid2, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * tests:
+    * # 1.1 normal mode
+    * # 1.2 normal mode with objects
+    * # 1.3 report mode
+    * # 1.4 report mode with objects
+    * # 1.5 with -d
+    *-------------------------------------------------------------------------
+    */
+
+    {
+        double data1[3][2] = {{  1.0F,   1.0F}, {  1.00F,   1.000F}, {  0.0F,   0.0F}};
+        double data2[3][2] = {{  0.0F,   1.1F}, {  1.01F,   1.001F}, {  0.0F,   1.0F}};
+        double data3[3][2] = {{100.0F, 100.0F}, {100.00F, 100.000F}, {100.0F, 100.0F}};
+        double data4[3][2] = {{105.0F, 120.0F}, {160.00F,  95.000F}, { 80.0F,  40.0F}};
+
+        write_dset(gid1,2,dims2,"dset1",H5T_NATIVE_DOUBLE,data1);
+        write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_DOUBLE,data2);
+        write_dset(gid1,2,dims2,"dset3",H5T_NATIVE_DOUBLE,data3);
+        write_dset(gid2,2,dims2,"dset4",H5T_NATIVE_DOUBLE,data4);
+        write_dset(gid2,2,dims2,"dset1",H5T_NATIVE_DOUBLE,data2);
+
+    }
+    /*-------------------------------------------------------------------------
+    * relative error, compare divide by zero, both zero
+    * # 1.6.1 with -p (int)
+    *-------------------------------------------------------------------------
+    */
+    {
+        int data5[3][2] = {{100,100},{100,0},{0,100}};
+        int data6[3][2] = {{120,80}, {0,100},{0,50}};
+
+        write_dset(gid1,2,dims2,"dset5",H5T_NATIVE_INT,data5);
+        write_dset(gid1,2,dims2,"dset6",H5T_NATIVE_INT,data6);
+
+    }
+
+    /*-------------------------------------------------------------------------
+    * relative error, compare divide by zero, both zero
+    * # 1.6.2 with -p (unsigned long long)
+    *-------------------------------------------------------------------------
+    */
+    {
+        unsigned long long data7[3][2] = {{100,100},{100,0},{0,100}};
+        unsigned long long data8[3][2] = {{120,80}, {0,100},{0,50}};
+
+        write_dset(gid1,2,dims2,"dset7",H5T_NATIVE_ULLONG,data7);
+        write_dset(gid1,2,dims2,"dset8",H5T_NATIVE_ULLONG,data8);
+
+    }
+
+    /*-------------------------------------------------------------------------
+    * relative error, compare divide by zero, both zero
+    * # 1.6.3 with -p (double)
+    *
+    *   A   B   1-B/A   %
+    *   100 120 0.2     20
+    *   100 80  0.2     20
+    *   100 0   1       100
+    *   0   100 #DIV/0! #DIV/0!
+    *   0   0   #DIV/0! #DIV/0!
+    *   100 50  0.5     50
+    *-------------------------------------------------------------------------
+    */
+    {
+        double data9[3][2] = {{100.0F, 100.0F}, {100.0F,   0.0F}, {0.0F, 100.0F}};
+        double data10[3][2] ={{120.0F,  80.0F}, {  0.0F, 100.0F}, {0.0F,  50.0F}};
+
+        write_dset(gid1,2,dims2,"dset9",H5T_NATIVE_DOUBLE,data9);
+        write_dset(gid1,2,dims2,"dset10",H5T_NATIVE_DOUBLE,data10);
+
+    }
+
+
+    /*-------------------------------------------------------------------------
+    * test floating point comparison
+    *-------------------------------------------------------------------------
+    */
+    {
+        /* epsilon = 0.0000001 = 1e-7
+         * system epsilon for float : FLT_EPSILON = 1.19209E-07
+         */
+        float  data11[3][2] ={{0.000000f,0.0000001f},{0.0000001f, 0.00000022f},{0.0000001f,0.0000001f}};
+        float  data12[3][2] ={{0.000000f,0.0000002f},{0.0000003f,0.0000001f},{0.000000f,0.0000001f}};
+        /* epsilon = 0.0000000000000001 = 1e-16
+         * system epsilon for double : DBL_EPSILON = 2.22045E-16
+         */
+        double data13[3][2] ={
+            {H5_DOUBLE(0.0000000000000000),  H5_DOUBLE(0.0000000000000001)},
+            {H5_DOUBLE(0.0000000000000001),  H5_DOUBLE(0.0000000000000000)},
+            {H5_DOUBLE(0.00000000000000033), H5_DOUBLE(0.0000000000000001)}};
+        double data14[3][2] ={
+            {H5_DOUBLE(0.0000000000000000), H5_DOUBLE(0.0000000000000004)},
+            {H5_DOUBLE(0.0000000000000002), H5_DOUBLE(0.0000000000000001)},
+            {H5_DOUBLE(0.0000000000000001), H5_DOUBLE(0.00000000000000000)}};
+
+        write_dset(gid1,2,dims2,"fp1",H5T_NATIVE_FLOAT,data11);
+        write_dset(gid1,2,dims2,"fp2",H5T_NATIVE_FLOAT,data12);
+        write_dset(gid1,2,dims2,"d1",H5T_NATIVE_DOUBLE,data13);
+        write_dset(gid1,2,dims2,"d2",H5T_NATIVE_DOUBLE,data14);
+
+    }
+
+
+#if H5_SIZEOF_LONG_DOUBLE !=0
+    {
+
+        /*-------------------------------------------------------------------------
+        * H5T_NATIVE_LDOUBLE
+        *-------------------------------------------------------------------------
+        */
+
+        long double data15[3][2] ={{1.0L,1.0L},{1.0L,1.0L},{1.0L,1.0L}};
+
+        write_dset(gid1,2,dims2,"ld",H5T_NATIVE_LDOUBLE,data15);
+
+    }
+#endif
+
+
+
+    /*-------------------------------------------------------------------------
+    * NaNs in H5T_NATIVE_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    {
+
+        float data15[6];
+        float data16[6];
+
+        data15[0] = (float)HDsqrt(-1.0F);
+        data15[1] = 1.0F;
+        data15[2] = (float)HDsqrt(-1.0F);
+        data15[3] = 1.0F;
+        data15[4] = 1.0F;
+        data15[5] = 1.0F;
+
+        data16[0] = (float)HDsqrt(-1.0F);
+        data16[1] = (float)HDsqrt(-1.0F);
+        data16[2] = 1.0F;
+        data16[3] = 1.0F;
+        data16[4] = 1.0F;
+        data16[5] = 1.0F;
+
+        write_dset(gid1,1,dims1,"fp15",H5T_NATIVE_FLOAT,data15);
+        write_dset(gid1,1,dims1,"fp16",H5T_NATIVE_FLOAT,data16);
+
+    }
+
+    /*-------------------------------------------------------------------------
+    * NaNs in H5T_NATIVE_DOUBLE
+    *-------------------------------------------------------------------------
+    */
+    {
+
+        double data17[6];
+        double data18[6];
+
+        data17[0] = HDsqrt(-1.0F);
+        data17[1] = 1.0F;
+        data17[2] = HDsqrt(-1.0F);
+        data17[3] = 1.0F;
+        data17[4] = 1.0F;
+        data17[5] = 1.0F;
+
+        data18[0] = HDsqrt(-1.0F);
+        data18[1] = HDsqrt(-10000.0F);
+        data18[2] = 1.0F;
+        data18[3] = 1.0F;
+        data18[4] = 1.0F;
+        data18[5] = 1.0F;
+
+        write_dset(gid1,1,dims1,"fp17",H5T_NATIVE_DOUBLE,data17);
+        write_dset(gid1,1,dims1,"fp18",H5T_NATIVE_DOUBLE,data18);
+        write_dset(gid1,1,dims1,"fp18_COPY",H5T_NATIVE_DOUBLE,data18);
+    }
+
+    /*------------------------------------------------------------------------
+     *            INFINITY values
+     *------------------------------------------------------------------------
+     */
+    {
+        float  data19[6];
+        double data20[6];
+
+        data19[0] = data19[1] = data19[2] = (float)HDlog(0.0F);
+        data19[3] = data19[4] = data19[5] = (float)-HDlog(0.0F);
+
+        data20[0] = data20[1] = data20[2] = HDlog(0.0F);
+        data20[3] = data20[4] = data20[5] = -HDlog(0.0F);
+
+        write_dset(gid1,1,dims1,"fp19",H5T_NATIVE_FLOAT,data19);
+        write_dset(gid1,1,dims1,"fp19_COPY",H5T_NATIVE_FLOAT,data19);
+        write_dset(gid1,1,dims1,"fp20",H5T_NATIVE_DOUBLE,data20);
+        write_dset(gid1,1,dims1,"fp20_COPY",H5T_NATIVE_DOUBLE,data20);
+    }
+
+    /*-------------------------------------------------------------------------
+    * NaNs in H5T_NATIVE_DOUBLE and H5T_NATIVE_FLOAT inside H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+    {
+        typedef struct cmp1_t
+        {
+            double d;
+            float  f;
+        } cmp1_t;
+
+        cmp1_t   buf1[2];
+        cmp1_t   buf2[2];
+        hsize_t  dims[1] = {2};
+        size_t   type_size;
+        hid_t    tid;
+
+        buf1[0].d = HDsqrt(-1.0F);
+        buf1[0].f = (float)HDsqrt(-1.0F);
+        buf2[0].d = HDsqrt(-1.0F);
+        buf2[0].f = (float)HDsqrt(-1.0F);
+
+        buf1[1].d = HDsqrt(-1.0F);
+        buf1[1].f = (float)HDsqrt(-1.0F);
+        buf2[1].d = 0.0F;
+        buf2[1].f = 0.0F;
+
+        type_size = sizeof( cmp1_t );
+        tid = H5Tcreate (H5T_COMPOUND, type_size );
+        H5Tinsert(tid, "d", HOFFSET( cmp1_t, d ), H5T_NATIVE_DOUBLE );
+        H5Tinsert(tid, "f", HOFFSET( cmp1_t, f ), H5T_NATIVE_FLOAT );
+        write_dset(gid1,1,dims,"dset11",tid,buf1);
+        write_dset(gid1,1,dims,"dset12",tid,buf2);
+        H5Tclose(tid);
+
+
+    }
+
+    /* not comparable objects */
+    {
+
+        typedef struct cmp1_t
+        {
+            double d;
+            int    i;
+        } cmp1_t;
+
+        typedef struct cmp2_t
+        {
+            int    i;
+            double d;
+        } cmp2_t;
+
+        typedef struct cmp3_t
+        {
+            int i;
+        } cmp3_t;
+
+        double       data2[6] = {0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F};
+        int          data3[6] = {0,0,0,0,0,0};
+        int          data4[3][2] = {{0,0},{0,0},{0,0}};
+        int          data5[2][2] = {{0,0},{0,0}};
+        unsigned int data6[3][2] = {{0,0},{0,0},{0,0}};
+        cmp1_t       data7[1] = {{1.0f, 2}};
+        cmp2_t       data8[1] = {{1, 2.0f}};
+        hsize_t      dims3[2] = {2, 2};
+        hsize_t      dims4[1] = {1};
+        size_t       type_size;
+        hid_t        tid;
+
+
+
+        write_dset(gid3,1,dims1,"dset1",H5T_NATIVE_DOUBLE,NULL);
+        write_dset(gid3,1,dims1,"dset2",H5T_NATIVE_DOUBLE,data2);
+        write_dset(gid3,1,dims1,"dset3",H5T_NATIVE_INT,data3);
+        write_dset(gid3,2,dims2,"dset4",H5T_NATIVE_INT,data4);
+        write_dset(gid3,2,dims3,"dset5",H5T_NATIVE_INT,data5);
+        write_dset(gid3,2,dims2,"dset6",H5T_NATIVE_UINT,data6);
+
+        /* case of compound with different type members */
+        type_size = sizeof( cmp1_t );
+        tid = H5Tcreate (H5T_COMPOUND, type_size );
+        H5Tinsert(tid, "d", HOFFSET( cmp1_t, d ), H5T_NATIVE_DOUBLE );
+        H5Tinsert(tid, "i", HOFFSET( cmp1_t, i ), H5T_NATIVE_INT );
+        write_dset(gid3,1,dims4,"dset7",tid,data7);
+        H5Tclose(tid);
+
+        type_size = sizeof( cmp2_t );
+        tid = H5Tcreate (H5T_COMPOUND, type_size );
+        H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT  );
+        H5Tinsert(tid, "d", HOFFSET( cmp2_t, d ), H5T_NATIVE_DOUBLE );
+        write_dset(gid3,1,dims4,"dset8",tid,data8);
+        H5Tclose(tid);
+
+        /* case of compound with different number of members */
+        type_size = sizeof( cmp3_t );
+        tid = H5Tcreate (H5T_COMPOUND, type_size );
+        H5Tinsert(tid, "i", HOFFSET( cmp2_t, i ), H5T_NATIVE_INT  );
+        write_dset(gid3,1,dims4,"dset9",tid,NULL);
+        H5Tclose(tid);
+
+    }
+
+
+    /*-------------------------------------------------------------------------
+    * close
+    *-------------------------------------------------------------------------
+    */
+    H5Gclose(gid1);
+    H5Gclose(gid2);
+    H5Gclose(gid3);
+    H5Fclose(fid1);
+    H5Fclose(fid2);
+    return SUCCEED;
+
+out:
+
+    return FAIL;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: test_types
+*
+* Purpose: Compare different HDF5 object & link types:
+* H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK
+*
+*-------------------------------------------------------------------------
+*/
+static
+int test_types(const char *fname)
+{
+    hid_t   fid1;
+    hid_t   gid1;
+    hid_t   gid2;
+    hid_t   tid1;
+    hid_t   tid2;
+    herr_t  status;
+    hsize_t dims[1]={1};
+    typedef struct s1_t
+    {
+        int    a;
+        float  b;
+    } s1_t;
+    typedef struct s2_t
+    {
+        int    a;
+    } s2_t;
+
+    /*-------------------------------------------------------------------------
+    * Create one file
+    *-------------------------------------------------------------------------
+    */
+    fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * H5G_DATASET
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0);
+
+    /*-------------------------------------------------------------------------
+    * H5G_GROUP
+    *-------------------------------------------------------------------------
+    */
+    gid1 = H5Gcreate2(fid1, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Gclose(gid1);
+    gid2 = H5Gcreate2(fid1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Gclose(gid2);
+
+    /*-------------------------------------------------------------------------
+    * H5G_TYPE
+    *-------------------------------------------------------------------------
+    */
+
+    /* create and commit datatype 1 */
+    tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+    H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT);
+    H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+    H5Tcommit2(fid1, "t1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(tid1);
+    /* create and commit datatype 2 */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
+    H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT);
+    H5Tcommit2(fid1, "t2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(tid2);
+
+    /*-------------------------------------------------------------------------
+    * H5G_LINK
+    *-------------------------------------------------------------------------
+    */
+
+    status = H5Lcreate_soft("g1", fid1, "l1", H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Lcreate_soft("g2", fid1, "l2", H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * H5G_UDLINK
+    *-------------------------------------------------------------------------
+    */
+    H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lregister(UD_link_class);
+    H5Lcreate_ud(fid1, "ud_link", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * Close
+    *-------------------------------------------------------------------------
+    */
+    status = H5Fclose(fid1);
+    return status;
+}
+
+
+/*
+
+# ##############################################################################
+# # not comparable types
+# ##############################################################################
+
+# 2.0
+TOOLTEST h5diff_20.txt file3.h5 file3.h5 -v dset g1
+
+# 2.1
+TOOLTEST h5diff_21.txt file3.h5 file3.h5 -v dset l1
+
+# 2.2
+TOOLTEST h5diff_22.txt file3.h5 file3.h5 -v dset t1
+
+# ##############################################################################
+# # compare groups, types, links (no differences and differences)
+# ##############################################################################
+
+# 2.3
+TOOLTEST h5diff_23.txt file3.h5 file3.h5 -v g1 g1
+
+# 2.4
+TOOLTEST h5diff_24.txt file3.h5 file3.h5 -v t1 t1
+
+# 2.5
+TOOLTEST h5diff_25.txt file3.h5 file3.h5 -v l1 l1
+
+# 2.6
+TOOLTEST h5diff_26.txt file3.h5 file3.h5 -v g1 g2
+
+# 2.7
+TOOLTEST h5diff_27.txt file3.h5 file3.h5 -v t1 t2
+
+# 2.8
+TOOLTEST h5diff_28.txt file3.h5 file3.h5 -v l1 l2
+*/
+
+/*-------------------------------------------------------------------------
+* Function: test_datatypes
+*
+* Purpose: test dataset datatypes
+*
+*-------------------------------------------------------------------------
+*/
+static
+int test_datatypes(const char *fname)
+{
+
+    hid_t   fid1;
+    hid_t   dset;
+    hsize_t dims[2]={3,2};
+    herr_t  status;
+    char    buf1a[3][2] = {{1,1},{1,1},{1,1}};
+    char    buf1b[3][2] = {{1,1},{3,4},{5,6}};
+    short   buf2a[3][2] = {{1,1},{1,1},{1,1}};
+    short   buf2b[3][2] = {{1,1},{3,4},{5,6}};
+    int     buf3a[3][2] = {{1,1},{1,1},{1,1}};
+    int     buf3b[3][2] = {{1,1},{3,4},{5,6}};
+    long    buf4a[3][2] = {{1,1},{1,1},{1,1}};
+    long    buf4b[3][2] = {{1,1},{3,4},{5,6}};
+    float   buf5a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
+    float   buf5b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
+    double  buf6a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
+    double  buf6b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
+
+    /*unsigned/signed test
+    signed char -128 to 127
+    unsigned char 0 to 255
+    */
+    char          buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}};
+    unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}};
+
+    /* long long test */
+    long long            buf8a[3][2] = {{1,1},{1,1},{1,1}};
+    long long            buf8b[3][2] = {{1,1},{3,4},{5,6}};
+    unsigned long long   buf9a[3][2] = {{1,1},{1,1},{1,1}};
+    unsigned long long   buf9b[3][2] = {{1,1},{3,4},{5,6}};
+
+    unsigned int    buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
+    unsigned int    buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
+
+    unsigned short     buf11a[3][2] = {{204,205},{2,3},{1,1}};
+    unsigned int     buf11b[3][2] = {{204,205},{2,3},{1,1}};
+
+
+    /*-------------------------------------------------------------------------
+    * Create a file
+    *-------------------------------------------------------------------------
+    */
+    fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * Check for different storage order. Give a warning if they are different
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
+    write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_CHAR
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
+    write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_SHORT
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
+    write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_INT
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
+    write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_LONG
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
+    write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
+    write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_DOUBLE
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
+    write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
+    write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_LLONG
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
+    write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_ULLONG
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
+    write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
+
+    /*-------------------------------------------------------------------------
+    * H5T_NATIVE_INT
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
+    write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
+
+    /*-------------------------------------------------------------------------
+    * Same type class, different size
+    *-------------------------------------------------------------------------
+    */
+    write_dset(fid1,2,dims,"dset11a",H5T_STD_U16LE,buf11a);
+    dset=H5Dopen2 (fid1, "dset11a", H5P_DEFAULT);
+    write_attr(dset,2,dims,"attr",H5T_STD_U16LE,buf11a);
+    H5Dclose (dset);
+
+    write_dset(fid1,2,dims,"dset11b",H5T_STD_U32LE,buf11b);
+    dset=H5Dopen2 (fid1, "dset11b", H5P_DEFAULT);
+    write_attr(dset,2,dims,"attr",H5T_STD_U32LE,buf11b);
+    H5Dclose (dset);
+
+    /*-------------------------------------------------------------------------
+    * Close
+    *-------------------------------------------------------------------------
+    */
+    status = H5Fclose(fid1);
+    return status;
+}
+
+/*
+# ##############################################################################
+# # Dataset datatypes
+# ##############################################################################
+
+# 5.0
+TOOLTEST h5diff_50.txt file4.h5 file4.h5 -v dset0a dset0b
+
+# 5.1
+TOOLTEST h5diff_51.txt file4.h5 file4.h5 -v dset1a dset1b
+
+# 5.2
+TOOLTEST h5diff_52.txt file4.h5 file4.h5 -v dset2a dset2b
+
+# 5.3
+TOOLTEST h5diff_53.txt file4.h5 file4.h5 -v dset3a dset4b
+
+# 5.4
+TOOLTEST h5diff_54.txt file4.h5 file4.h5 -v dset4a dset4b
+
+# 5.5
+TOOLTEST h5diff_55.txt file4.h5 file4.h5 -v dset5a dset5b
+
+# 5.6
+TOOLTEST h5diff_56.txt file4.h5 file4.h5 -v dset6a dset6b
+
+# 5.7
+TOOLTEST h5diff_57.txt file4.h5 file4.h5 -v dset7a dset7b
+
+# 5.8 (region reference)
+TOOLTEST h5diff_58.txt file7.h5 file8.h5 -v refreg
+*/
+
+/*-------------------------------------------------------------------------
+* Function: test_attributes
+*
+* Purpose: test attributes
+*
+*-------------------------------------------------------------------------
+*/
+static
+int test_attributes(const char *file,
+                    int make_diffs /* flag to modify data buffers */)
+{
+    hid_t   fid;
+    hid_t   did;
+    hid_t   gid;
+    hid_t   root_id;
+    hid_t   sid;
+    hsize_t dims[1]={2};
+    herr_t  status;
+
+    /* Create a file  */
+    if((fid  = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Create a 1D dataset */
+    sid = H5Screate_simple(1, dims, NULL);
+    did = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Sclose(sid);
+    assert(status >= 0);
+
+    /* Create groups */
+    gid  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    root_id   = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * write a series of attributes on the dataset, group, and root group
+    *-------------------------------------------------------------------------
+    */
+
+    write_attr_in(did,"dset",fid,make_diffs);
+    write_attr_in(gid,NULL,(hid_t)0,make_diffs);
+    write_attr_in(root_id,NULL,(hid_t)0,make_diffs);
+
+
+    /* Close */
+    status = H5Dclose(did);
+    assert(status >= 0);
+    status = H5Gclose(gid);
+    assert(status >= 0);
+    status = H5Gclose(root_id);
+    assert(status >= 0);
+
+    /* Close file */
+    status = H5Fclose(fid);
+    assert(status >= 0);
+    return status;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: test_attributes_verbose_level
+*
+* Purpose: Cresting test files for testing attributes along with
+* levels of verbos option
+*
+*-------------------------------------------------------------------------
+*/
+static int test_attributes_verbose_level(const char *fname1, const char *fname2)
+{
+    herr_t  status = SUCCEED;
+    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};
+
+    /* common attrs dim */
+    hsize_t attr_dims[1]={2};
+
+    /* file1 attr */
+    int    f1_attr_idata[2]= {1,2};        /* integer */
+    float  f1_attr_fdata[2]= {1.1F,2.2F};    /* float */
+    /* file2 attr */
+    int    f2_attr_idata[2]= {2,3};        /* integer */
+    float  f2_attr_fdata[2]= {2.1F,3.2F};    /* float */
+
+
+    /*----------------------------------------------------------------------
+    * Create file1
+    *-----------------------------------------------------------------------*/
+    if((fid1  = H5Fcreate(fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Groups
+    */
+    f1_gid = H5Gcreate2(fid1, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f1_gid < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    f1_gid2 = H5Gcreate2(fid1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f1_gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    f1_gid3 = H5Gcreate2(fid1, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f1_gid3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    f1_gid4 = H5Gcreate2(fid1, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f1_gid4 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Datasets
+    */
+    f1_sid = H5Screate_simple(1, dset_dims, NULL);
+    f1_did = H5Dcreate2(fid1, "dset", H5T_NATIVE_INT, f1_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f1_did == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    status = H5Dwrite(f1_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Named Datatype
+    */
+    f1_tid = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(fid1, "ntype", f1_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+
+
+
+    /*----------------------------------------------------------------------
+    * Create file2
+    *-----------------------------------------------------------------------*/
+    if((fid2  = H5Fcreate(fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Groups
+    */
+    f2_gid = H5Gcreate2(fid2, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f2_gid < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    f2_gid2 = H5Gcreate2(fid2, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f2_gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    f2_gid3 = H5Gcreate2(fid2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f2_gid3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    f2_gid4 = H5Gcreate2(fid2, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f2_gid4 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Datasets
+    */
+    f2_sid = H5Screate_simple(1, dset_dims, NULL);
+    f2_did = H5Dcreate2(fid2, "dset", H5T_NATIVE_INT, f2_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (f2_did == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+    status = H5Dwrite(f2_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * Named Datatype
+    */
+    f2_tid = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(fid2, "ntype", f2_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+   /*----------------------------------
+    * CASE1 - Same attr number, all Same attr name
+    * add attr to group
+    */
+    write_attr(f1_gid,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
+    write_attr(f1_gid,1,attr_dims,"float1",H5T_NATIVE_FLOAT,f1_attr_fdata);
+
+    write_attr(f2_gid,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
+    write_attr(f2_gid,1,attr_dims,"float1",H5T_NATIVE_FLOAT,f2_attr_fdata);
+
+   /*----------------------------------
+    * CASE2 - Same attr number, some Same attr name
+    * add attr to dset
+    */
+    write_attr(f1_did,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
+    write_attr(f1_did,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
+
+    write_attr(f2_did,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
+    write_attr(f2_did,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f2_attr_fdata);
+
+   /*----------------------------------
+    * CASE3 - Same attr number, all different attr name
+    * add attr to ntype
+    */
+    write_attr(f1_tid,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
+    write_attr(f1_tid,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
+    write_attr(f1_tid,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f1_attr_fdata);
+
+    write_attr(f2_tid,1,attr_dims,"integer4",H5T_NATIVE_INT,f2_attr_idata);
+    write_attr(f2_tid,1,attr_dims,"float5",H5T_NATIVE_FLOAT,f2_attr_fdata);
+    write_attr(f2_tid,1,attr_dims,"float6",H5T_NATIVE_FLOAT,f2_attr_fdata);
+
+   /*----------------------------------
+    * CASE4 - Different attr number, some same attr name (vs file2-g2)
+    * add attr to g2
+    */
+    write_attr(f1_gid2,1,attr_dims,"integer1",H5T_NATIVE_INT,f1_attr_idata);
+    write_attr(f1_gid2,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f1_attr_fdata);
+    write_attr(f1_gid2,1,attr_dims,"float3",H5T_NATIVE_FLOAT,f1_attr_fdata);
+
+    write_attr(f2_gid2,1,attr_dims,"integer1",H5T_NATIVE_INT,f2_attr_idata);
+    write_attr(f2_gid2,1,attr_dims,"float2",H5T_NATIVE_FLOAT,f2_attr_fdata);
+
+
+   /*----------------------------------
+    * CASE5 - Different attr number, all different attr name
+    * add attr to g3
+    */
+    write_attr(f1_gid3,1,attr_dims,"integer10",H5T_NATIVE_INT,f1_attr_idata);
+    write_attr(f1_gid3,1,attr_dims,"float11",H5T_NATIVE_FLOAT,f1_attr_fdata);
+    write_attr(f1_gid3,1,attr_dims,"float12",H5T_NATIVE_FLOAT,f1_attr_fdata);
+
+    write_attr(f2_gid3,1,attr_dims,"integer3",H5T_NATIVE_INT,f2_attr_idata);
+    write_attr(f2_gid3,1,attr_dims,"float4",H5T_NATIVE_FLOAT,f2_attr_fdata);
+
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1 > 0)
+        H5Fclose(fid1);
+    if(fid2 > 0)
+        H5Fclose(fid2);
+    if(f1_gid > 0)
+        H5Gclose(f1_gid);
+    if(f2_gid > 0)
+        H5Gclose(f2_gid);
+    if(f1_gid2 > 0)
+        H5Gclose(f1_gid2);
+    if(f2_gid2 > 0)
+        H5Gclose(f2_gid2);
+    if(f1_gid3 > 0)
+        H5Gclose(f1_gid3);
+    if(f2_gid3 > 0)
+        H5Gclose(f2_gid3);
+    if(f1_gid4 > 0)
+        H5Gclose(f1_gid4);
+    if(f2_gid4 > 0)
+        H5Gclose(f2_gid4);
+    if(f1_did > 0)
+        H5Dclose(f1_did);
+    if(f2_did > 0)
+        H5Dclose(f2_did);
+    if(f1_sid > 0)
+        H5Sclose(f1_sid);
+    if(f2_sid > 0)
+        H5Sclose(f2_sid);
+    if(f1_tid > 0)
+        H5Tclose(f1_tid);
+    if(f2_tid > 0)
+        H5Tclose(f2_tid);
+
+    return status;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: test_datasets
+*
+* Purpose: Check all HDF5 classes
+* H5T_INTEGER, H5T_FLOAT
+* H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE,
+* H5T_ENUM, H5T_VLEN, H5T_ARRAY
+*
+*-------------------------------------------------------------------------
+*/
+static
+int test_datasets(const char *file,
+                  int make_diffs /* flag to modify data buffers */)
+{
+    hid_t   fid;
+    hid_t   did;
+    hid_t   gid;
+    hid_t   sid;
+    hsize_t dims[1]={2};
+    herr_t  status;
+    int     buf[2]={1,2};
+
+    if(make_diffs)
+        memset(buf, 0, sizeof buf);
+
+    /* Create a file  */
+    if((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Create a 1D dataset */
+    sid = H5Screate_simple(1, dims, NULL);
+    did  = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    status = H5Sclose(sid);
+    assert(status >= 0);
+
+    /* Create a group */
+    gid  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+    * write a series of datasets on the group
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset_in(gid,"/dset",fid,make_diffs);
+
+    /* close */
+    status = H5Dclose(did);
+    assert(status >= 0);
+    status = H5Gclose(gid);
+    assert(status >= 0);
+
+    /* close file */
+    status = H5Fclose(fid);
+    assert(status >= 0);
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+* Function: test_special_datasets
+*
+* Purpose: Check datasets with datasapce of zero dimension size.
+*-------------------------------------------------------------------------
+*/
+static
+int test_special_datasets(const char *file,
+                  int make_diffs /* flag to modify data buffers */)
+{
+    hid_t   fid;
+    hid_t   did;
+    hid_t   sid0, sid;
+    hsize_t dims0[SPACE1_RANK]={SPACE1_DIM1, SPACE1_DIM2};
+    hsize_t dims[SPACE1_RANK]={SPACE1_DIM1, SPACE1_DIM2};
+    herr_t  status;
+
+    /* Create a file  */
+    if((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Create a dataset with zero dimension size */
+    sid0 = H5Screate_simple(SPACE1_RANK, dims0, NULL);
+    did  = H5Dcreate2(fid, "dset1", H5T_NATIVE_INT, sid0, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* close dataset */
+    status = H5Dclose(did);
+    assert(status >= 0);
+
+    /* close dataspace */
+    status = H5Sclose(sid0);
+    assert(status >= 0);
+
+    /* Create a dataset with zero dimension size in one file but the other one
+     * has a dataset with a non-zero dimension size */
+    if(make_diffs) {
+        dims[1] = SPACE1_DIM2 + 4;
+    }
+
+    sid = H5Screate_simple(SPACE1_RANK, dims, NULL);
+    did  = H5Dcreate2(fid, "dset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* close dataspace */
+    status = H5Sclose(sid);
+    assert(status >= 0);
+
+    /* close dataset */
+    status = H5Dclose(did);
+    assert(status >= 0);
+
+    /* close file */
+    status = H5Fclose(fid);
+    assert(status >= 0);
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files to compare links, one has longer name than
+*          the other and short name is subset of long name.
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_link_name(const char *fname1)
+{
+    hid_t   fid1=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fid1, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    gid2 = H5Gcreate2(fid1, "group_longname", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Soft Links
+    *------------------------------------------------------------------------*/
+    status = H5Lcreate_soft("group", fid1, "link_g1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("group_longname", fid1, "link_g2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *------------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files to compare soft links in various way
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_soft_links(const char *fname1)
+{
+    hid_t   fid1=0;
+    hid_t   gid1=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fid1, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"target_dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Soft Links
+    *------------------------------------------------------------------------*/
+    /* file 1 */
+    status = H5Lcreate_soft("/target_dset1", fid1, "softlink_dset1_1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/target_dset1", fid1, "softlink_dset1_2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/target_dset2", fid1, "softlink_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/target_group", fid1, "softlink_group1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/target_group", fid1, "softlink_group2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/no_obj", fid1, "softlink_noexist", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(gid1)
+        H5Gclose(gid1);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files to compare linked soft links in various way
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_linked_softlinks(const char *fname1)
+{
+    hid_t   fid1=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    hid_t   gid3=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fid1, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2 = H5Gcreate2(fid1, "target_group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid3 = H5Gcreate2(fid1, "target_group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"target_dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Soft Links (Linked)
+    *------------------------------------------------------------------------*/
+    /*---------
+     * file 1 */
+    status = H5Lcreate_soft("/target_dset1", fid1, "softlink1_to_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink1_to_dset1", fid1, "softlink1_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink1_to_slink1", fid1, "softlink1_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/target_dset2", fid1, "softlink2_to_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink2_to_dset2", fid1, "softlink2_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink2_to_slink1", fid1, "softlink2_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("target_group1", fid1, "softlink3_to_group1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink3_to_group1", fid1, "softlink3_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink3_to_slink1", fid1, "softlink3_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("target_group2", fid1, "softlink4_to_group2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink4_to_group2", fid1, "softlink4_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("softlink4_to_slink1", fid1, "softlink4_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+    if(gid3)
+        H5Gclose(gid3);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files to compare external links in various way
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_external_links(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    /* source file */
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* target file */
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    /*--------------
+     * target file */
+    gid1 = H5Gcreate2(fid2, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2 = H5Gcreate2(fid2, "target_group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /*--------------
+     * target file */
+    status = write_dset(fid2,2,dims2,"target_dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"x_dset",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2,2,dims2,"x_dset",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * External Links
+    *------------------------------------------------------------------------*/
+    /*--------------*/
+    /* source file */
+    status = H5Lcreate_external(fname2, "/target_group/x_dset", fid1, "ext_link_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/target_group2/x_dset", fid1, "ext_link_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/target_group", fid1, "/ext_link_grp1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/target_group2", fid1, "/ext_link_grp2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link_noexist1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external("no_file.h5", "no_obj", fid1, "ext_link_noexist2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files to compare external links which point to
+*          soft link in various way
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_ext2soft_links(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid2=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    /* source file */
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* target file */
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    /* target file */
+    gid2 = H5Gcreate2(fid2, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /*--------------
+     * target file */
+    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Soft Links (Linked)
+    *------------------------------------------------------------------------*/
+    /*---------------
+     * target file */
+    status = H5Lcreate_soft("/dset1", fid2, "softlink_to_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/dset2", fid2, "softlink_to_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * External Links
+    *------------------------------------------------------------------------*/
+    /*---------------
+     * source file */
+    status = H5Lcreate_external(fname2, "/target_group", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/softlink_to_dset1", fid1, "ext_link_to_slink1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/softlink_to_dset2", fid1, "ext_link_to_slink2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid2)
+        H5Gclose(gid2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+* 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
+*
+* Programmer: Jonathan Kim (Feb 17, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_dangle_links(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    int data2[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Soft Links
+    *------------------------------------------------------------------------*/
+    /* file 1 */
+    status = H5Lcreate_soft("no_obj", fid1, "soft_link1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/dset1", fid1, "soft_link2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("no_obj", fid1, "soft_link3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("no_obj1", fid1, "soft_link4", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file 2 */
+    status = H5Lcreate_soft("no_obj", fid2, "soft_link1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("no_obj", fid2, "soft_link2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/dset2", fid2, "soft_link3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("no_obj2", fid2, "soft_link4", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * External Links
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/dset1", fid1, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "no_obj", fid1, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external("no_file.h5", "no_obj", fid1, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = H5Lcreate_external(fname1, "no_obj", fid2, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname1, "no_obj", fid2, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname1, "/dset2", fid2, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external("no_file.h5", "no_obj", fid2, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: For testing comparing group member objects recursively
+*
+* Programmer: Jonathan Kim (Aug 19, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_group_recurse(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid1_f1=0, gid2_f1=0, gid3_f1=0, gid10_f1=0;
+    hid_t   gid1_f2=0, gid2_f2=0, gid3_f2=0, gid11_f2=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,1},{0,1},{1,0},{1,0}};
+    int data2[4][2] = {{0,2},{0,2},{2,0},{2,0}};
+    int data3[4][2] = {{0,3},{0,3},{3,0},{3,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    gid1_f1 = H5Gcreate2(fid1, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1_f1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2_f1 = H5Gcreate2(fid1, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2_f1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid3_f1 = H5Gcreate2(fid1, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid3_f1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid10_f1 = H5Gcreate2(fid1, "/grp10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid10_f1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    gid1_f2 = H5Gcreate2(fid2, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1_f2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2_f2 = H5Gcreate2(fid2, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2_f2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    gid3_f2 = H5Gcreate2(fid2, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid3_f2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    gid11_f2 = H5Gcreate2(fid2, "/grp11", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid11_f2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets under root
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets under group
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(gid1_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(gid2_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid3_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(gid3_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid3_f1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid10_f1,2,dims2,"dset4",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid10_f1,2,dims2,"dset5",H5T_NATIVE_INT,data3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = write_dset(gid1_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(gid2_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid3_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(gid3_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid3_f2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid11_f2,2,dims2,"dset4",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid11_f2,2,dims2,"dset5",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+    /*-----------------------------------------------------------------------
+    * Soft Links
+    *------------------------------------------------------------------------*/
+    /* file 1 */
+    status = H5Lcreate_soft("/grp1", fid1, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp1/grp2", fid1, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp1/grp2/grp3", fid1, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp10", fid1, "slink_grp10", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file 2 */
+    status = H5Lcreate_soft("/grp1", fid2, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp1/grp2", fid2, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp1/grp2/grp3", fid2, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_soft("/grp11", fid2, "slink_grp11", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * External Links
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = H5Lcreate_external(fname2, "/grp1", fid1, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/grp1/grp2", fid1, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname2, "/grp1/grp2/grp3", fid1, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = H5Lcreate_external(fname1, "/grp1", fid2, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname1, "/grp1/grp2", fid2, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Lcreate_external(fname1, "/grp1/grp2/grp3", fid2, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*------------------------------
+     * external circle route test
+     * file1/grp11 <-> file2/grp10  via elink_grp_circle link
+     */
+    /* file1 */
+    status = H5Lcreate_external(fname2, "/grp11", gid10_f1, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    /* file2 */
+    status = H5Lcreate_external(fname1, "/grp10", gid11_f2, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid1_f1)
+        H5Gclose(gid1_f1);
+    if(gid2_f1)
+        H5Gclose(gid2_f1);
+    if(gid3_f1)
+        H5Gclose(gid3_f1);
+    if(gid1_f2)
+        H5Gclose(gid1_f2);
+    if(gid2_f2)
+        H5Gclose(gid2_f2);
+    if(gid3_f2)
+        H5Gclose(gid3_f2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose:
+*   For testing comparing group member objects recursively via multiple
+*   linked external links
+*
+* Programmer: Jonathan Kim (Sep 16, 2010)
+*
+*-------------------------------------------------------------------------*/
+#define GRP_R_DSETNAME1 "dset1"
+#define GRP_R_DSETNAME2 "dset2"
+static int test_group_recurse2(void)
+{
+    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}};
+    int data2[4][2] = {{0,0},{0,1},{0,2},{3,3}};
+
+   /*-----------------------------------------------------------------------
+    * FILE 1
+    *------------------------------------------------------------------------*/
+    /*
+     * Create a new file using H5F_ACC_TRUNC access,
+     * default file creation properties, and default file
+     * access properties.
+     */
+    fileid1 = H5Fcreate(GRP_RECURSE1_EXT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+   /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    grp1 = H5Gcreate2(fileid1, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+    grp2 = H5Gcreate2(grp1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+    grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+    grp4 = H5Gcreate2(grp3, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp4 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+
+   /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /*
+     * Describe the size of the array and create the data space for fixed
+     * size dataset.
+     */
+    dimsf[0] = 4;
+    dimsf[1] = 2;
+    dataspace = H5Screate_simple(2, dimsf, NULL);
+
+    /*
+     * Define datatype for the data in the file.
+     * We will store little endian INT numbers.
+     */
+    datatype = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tset_order(datatype, H5T_ORDER_LE);
+
+    /*---------------
+     * dset1
+     */
+    /*
+     * Create a new dataset within the file using defined dataspace and
+     * datatype and default dataset creation properties.
+     */
+    dset1 = H5Dcreate2(fileid1, GRP_R_DSETNAME1, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+    H5Dclose(dset1);
+
+    /*---------------
+     * dset1
+     */
+    /*
+     * Create a new dataset within the file using defined dataspace and
+     * datatype and default dataset creation properties.
+     */
+    dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+    /*---------------
+     * dset2
+     */
+    /*
+     * Create a new dataset within the fileid1 using defined dataspace and
+     * datatype and default dataset creation properties.
+     */
+    dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+
+   /*-----------------------------------------------------------------------
+    * Soft links
+    *------------------------------------------------------------------------*/
+    /*
+     * under  '/' root
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+    H5Dclose(dset1);
+    H5Dclose(dset2);
+    H5Gclose(grp1);
+    H5Gclose(grp2);
+    H5Gclose(grp3);
+    H5Gclose(grp4);
+
+   /*-----------------------------------------------------------------------
+    * FILE 2-3
+    *------------------------------------------------------------------------*/
+
+    /* crate target file */
+    fileid4 = H5Fcreate(GRP_RECURSE2_EXT3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+   /*-----------------------------------------------
+    * Groups
+    */
+    grp4 = H5Gcreate2(fileid4, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp4 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT3);
+        status = FAIL;
+        goto out;
+    }
+
+    /*---------------
+     * dset2
+     */
+    /*
+     * Create a new dataset within the fileid1 using defined dataspace and
+     * datatype and default dataset creation properties.
+     */
+    dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+
+    H5Gclose(grp4);
+    H5Dclose(dset2);
+
+
+   /*-----------------------------------------------------------------------
+    * FILE 2-2
+    *------------------------------------------------------------------------*/
+
+    /* crate target file */
+    fileid3 = H5Fcreate(GRP_RECURSE2_EXT2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+   /*-----------------------------------------------
+    * Groups
+    */
+    grp2 = H5Gcreate2(fileid3, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
+        status = FAIL;
+        goto out;
+    }
+
+    grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*---------------
+     * dset1
+     */
+    /*
+     * Create a new dataset within the fileid1 using defined dataspace and
+     * datatype and default dataset creation properties.
+     */
+    dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+   /*-----------------------------------------------
+    * extlink to  $GRP_RECURSE2_EXT3/g4
+    */
+    status = H5Lcreate_external(GRP_RECURSE2_EXT3, "/g4", fileid3, "/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT2);
+        status = FAIL;
+        goto out;
+    }
+
+    H5Dclose(dset1);
+    H5Gclose(grp2);
+    H5Gclose(grp3);
+
+   /*-----------------------------------------------------------------------
+    * FILE 2-1
+    *------------------------------------------------------------------------*/
+
+    /* crate target file */
+    fileid2 = H5Fcreate(GRP_RECURSE2_EXT1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+   /*-----------------------------------------------
+    * Groups
+    */
+    grp1 = H5Gcreate2(fileid2, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (grp1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+        status = FAIL;
+        goto out;
+    }
+
+    /*---------------
+     * dset1
+     */
+    dset1 = H5Dcreate2(fileid2, GRP_R_DSETNAME1, datatype, dataspace,
+      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write the data to the dataset using default transfer properties.
+     */
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+   /*-----------------------------------------------------------------------
+    * Soft links
+    *------------------------------------------------------------------------*/
+    /*
+     * under  '/' root
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid2, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE2_EXT1);
+        status = FAIL;
+        goto out;
+    }
+
+   /*-----------------------------------------------
+    * extlink to  $GRP_RECURSE2_EXT2/g2
+    */
+    status = H5Lcreate_external(GRP_RECURSE2_EXT2, "/g2", fileid2, "/g1/g2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT1);
+        status = FAIL;
+        goto out;
+    }
+
+    H5Gclose(grp1);
+    H5Dclose(dset1);
+
+out:
+    /*
+     * Close/release resources.
+     */
+    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;
+}
+
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for excluding obj.
+*          Same structure, same obj names
+* Test : exclude obj with different value to verify the rest are same
+*
+* Programmer: Jonathan Kim (July, 21, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_exclude_obj1(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+   /*-----------------------------------------------------------------------
+    * Group
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    gid2 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"dset3",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+
+    /* file2 */
+    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2,2,dims2,"dset3",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for excluding obj.
+*          different structure and name
+* Test : exclude different objs to verify the rest are same
+*
+* Programmer: Jonathan Kim (July, 21, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_exclude_obj2(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    hid_t   gid3=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+   /*-----------------------------------------------------------------------
+    * Group
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    gid1 = H5Gcreate2(fid1, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    gid2 = H5Gcreate2(fid2, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /* subset name from group10 */
+    gid3 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    if (gid3 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"dset10",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+
+    /* file2 */
+    status = write_dset(fid2,2,dims2,"dset10",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid3,2,dims2,"dset3",H5T_NATIVE_INT,data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+    if(gid3)
+        H5Gclose(gid3);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for excluding obj.
+*          Only one file contains unique objs. Common objs are same.
+* Test : exclude unique objs to verify the rest are same
+*  - HDFFV-7837
+*
+* Programmer: Jonathan Kim (Mar, 19, 2012)
+*
+*-------------------------------------------------------------------------*/
+static int test_exclude_obj3(const char *fname1, const char *fname2)
+{
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   gid1=0;
+    hsize_t dims2[2] = {2,4};
+    int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+    herr_t  status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+
+   /*-----------------------------------------------------------------------
+    * Group
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = write_dset(gid1,2,dims2,"dset",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(gid1)
+        H5Gclose(gid1);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for multiple variable length string/string array
+*          along with fixed length string/string array types in
+*          a compound type dataset.
+*
+* Programmer: Jonathan Kim (Oct, 26, 2010)
+*
+*-------------------------------------------------------------------------*/
+#define STR_RANK 1
+#define VLEN_STR_DIM 1
+#define FIXLEN_STR_SIZE 21
+#define FIXLEN_STR_DIM 1
+#define VLEN_STR_ARRY_DIM 3
+#define FIXLEN_STR_ARRY_DIM 3
+#define FIXLEN_STR_ARRY_SIZE 30
+#define COMP_RANK 1
+#define COMP_DIM 1
+static int test_comp_vlen_strings(const char *fname1, const char *grp_name, int is_file_new)
+{
+    int i;
+
+    hid_t    fid1   = -1;      /* file id */
+    hid_t    gid    = -1;
+
+    /* compound1 datatype */
+    typedef struct comp1_t
+    {
+        char   *str_vlen;  /* vlen string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+    } comp1_t;
+
+    /* compound2 datatype */
+    typedef struct comp2_t
+    {
+        char   *str_vlen;  /* vlen string */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+    } comp2_t;
+
+    /* compound3 datatype */
+    typedef struct comp3_t
+    {
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen;  /* vlen string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+    } comp3_t;
+
+    /* compound4 datatype */
+    typedef struct comp4_t
+    {
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen;  /* vlen string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+    } comp4_t;
+
+    /* compound5 datatype */
+    typedef struct comp5_t
+    {
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen;  /* vlen string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+    } comp5_t;
+
+    /* compound6 datatype */
+    typedef struct comp6_t
+    {
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen;  /* vlen string */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen_repeat;  /* vlen string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+    } comp6_t;
+
+    /* compound7 datatype */
+    typedef struct comp7_t
+    {
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen;  /* vlen string */
+        char   *str_vlen_repeat;  /* vlen string */
+    } comp7_t;
+
+    /* compound8 datatype */
+    typedef struct comp8_t
+    {
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen;  /* vlen string */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        char   *str_vlen_repeat;  /* vlen string */
+    } comp8_t;
+
+    /* compound9 datatype */
+    typedef struct comp9_t
+    {
+        char   str_array_fixlen[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   str_fixlen_array_again[FIXLEN_STR_ARRY_DIM][FIXLEN_STR_ARRY_SIZE];  /* fixed len string array */
+        char   *str_array_vlen[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   *str_vlen_array_again[VLEN_STR_ARRY_DIM];  /* vlen string array */
+        char   str_fixlen[FIXLEN_STR_SIZE];  /* fixed len string */
+        int    int_data1;
+        hobj_ref_t objref1;                  /* reference */
+        char   str_fixlen_repeat[FIXLEN_STR_SIZE];  /* fixed len string */
+        hobj_ref_t objref2;                  /* reference */
+        char   *str_vlen;  /* vlen string */
+        int    int_data2;
+        char   *str_vlen_repeat;  /* vlen string */
+        hobj_ref_t objref3;                  /* reference */
+        int    int_data3;
+    } comp9_t;
+
+    /* vlen string */
+    hid_t    sid_vlen_str=0;      /* dataspace ID */
+    hid_t    tid_vlen_str=0;      /* datatype ID */
+    char vlen_str_buf[]= {
+        "Variable length string"
+        };
+    hsize_t dims_vlen_str[]  = {VLEN_STR_DIM};
+
+    /* fixlen string */
+    hid_t    sid_fixlen_str=0;      /* dataspace ID */
+    hid_t    tid_fixlen_str=0;      /* datatype ID */
+    const char fixlen_str_buf[FIXLEN_STR_SIZE]= {
+        "Fixed length string"
+        };
+    hsize_t dims_fixlen_str[]  = {FIXLEN_STR_DIM};
+
+    /* vlen string array */
+    hid_t    sid_vlen_str_array=0;      /* dataspace ID */
+    hid_t    tid_vlen_str_array_pre=0;      /* datatype ID */
+    hid_t    tid_vlen_str_array=0; /* datatype ID */
+    char *vlen_str_array_buf[VLEN_STR_ARRY_DIM]= {
+        "1 - Variable length string Array",
+        "2 - Testing variable length string array in compound type",
+        "3 - Four score and seven\n years ago our forefathers brought forth on this continent a new nation,"
+        };
+    hsize_t dims_vlen_str_array[]  = {VLEN_STR_ARRY_DIM};
+
+    /* fixlen string array  */
+    hid_t    sid_fixlen_str_array=0;      /* dataspace ID */
+    hid_t    tid_fixlen_str_array_pre=0;      /* datatype ID */
+    hid_t    tid_fixlen_str_array=0; /* datatype ID */
+    const char *fixlen_str_array_buf[FIXLEN_STR_ARRY_DIM]= {
+        "1 - Fixed length string Array",
+        "2 - Fixed length string Array",
+        "3 - Fixed length string Array"
+        };
+    hsize_t dims_fixlen_str_array[]  = {FIXLEN_STR_ARRY_DIM};
+
+    /*------------------------------------------
+     * compound dataset
+     *------------------------------------------*/
+    hid_t    sid_comp=0;      /* dataspace ID */
+    hid_t    tid1_comp=0;      /* datatype ID */
+    hid_t    tid2_comp=0;      /* datatype ID */
+    hid_t    tid3_comp=0;      /* datatype ID */
+    hid_t    tid4_comp=0;      /* datatype ID */
+    hid_t    tid5_comp=0;      /* datatype ID */
+    hid_t    tid6_comp=0;      /* datatype ID */
+    hid_t    tid7_comp=0;      /* datatype ID */
+    hid_t    tid8_comp=0;      /* datatype ID */
+    hid_t    tid9_comp=0;      /* datatype ID */
+    hid_t    did_comp=0;      /* dataset ID */
+    hsize_t dims_comp[]  = {COMP_DIM};
+    herr_t  status = SUCCEED;
+
+    /* make compound strings data */
+    comp1_t comp1_buf;
+    comp2_t comp2_buf;
+    comp3_t comp3_buf;
+    comp4_t comp4_buf;
+    comp5_t comp5_buf;
+    comp6_t comp6_buf;
+    comp7_t comp7_buf;
+    comp8_t comp8_buf;
+    comp9_t comp9_buf;
+
+    /* copy vlen string data to compound buffers */
+    comp1_buf.str_vlen = comp1_buf.str_vlen_repeat = vlen_str_buf;
+    comp2_buf.str_vlen = comp2_buf.str_vlen_repeat = vlen_str_buf;
+    comp3_buf.str_vlen = comp3_buf.str_vlen_repeat = vlen_str_buf;
+    comp4_buf.str_vlen = comp4_buf.str_vlen_repeat = vlen_str_buf;
+    comp5_buf.str_vlen = comp5_buf.str_vlen_repeat = vlen_str_buf;
+    comp6_buf.str_vlen = comp6_buf.str_vlen_repeat = vlen_str_buf;
+    comp7_buf.str_vlen = comp7_buf.str_vlen_repeat = vlen_str_buf;
+    comp8_buf.str_vlen = comp8_buf.str_vlen_repeat = vlen_str_buf;
+    comp9_buf.str_vlen = comp9_buf.str_vlen_repeat = vlen_str_buf;
+
+    /* copy fixlen string data to compound buffers */
+    HDstrcpy(comp1_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp1_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp2_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp2_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp3_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp3_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp3_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp3_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp4_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp4_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp5_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp5_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp6_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp6_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp7_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp7_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp8_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp8_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    HDstrcpy(comp9_buf.str_fixlen, fixlen_str_buf);
+    HDstrcpy(comp9_buf.str_fixlen_repeat, fixlen_str_buf);
+
+    /* copy vlen string array data to compound buffers */
+    for (i=0; i < VLEN_STR_ARRY_DIM; i++)
+    {
+        comp1_buf.str_array_vlen[i] = comp1_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp2_buf.str_array_vlen[i] = comp2_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp3_buf.str_array_vlen[i] = comp3_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp4_buf.str_array_vlen[i] = comp4_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp5_buf.str_array_vlen[i] = comp5_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp6_buf.str_array_vlen[i] = comp6_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp7_buf.str_array_vlen[i] = comp7_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp8_buf.str_array_vlen[i] = comp8_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+        comp9_buf.str_array_vlen[i] = comp9_buf.str_vlen_array_again[i] = vlen_str_array_buf[i];
+
+    }
+
+    /* copy fixlen string attay data to compound buffers */
+    for (i=0; i < FIXLEN_STR_ARRY_DIM; i++)
+    {
+        HDstrcpy(comp1_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp1_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp2_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp2_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp3_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp3_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp4_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp4_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp5_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp5_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp6_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp6_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp7_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp7_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp8_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp8_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+
+        HDstrcpy(comp9_buf.str_array_fixlen[i], fixlen_str_array_buf[i]);
+        HDstrcpy(comp9_buf.str_fixlen_array_again[i], fixlen_str_array_buf[i]);
+    }
+
+    /* int data */
+    comp9_buf.int_data1 = 10;
+    comp9_buf.int_data2 = 20;
+    comp9_buf.int_data3 = 30;
+
+
+    /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    if (is_file_new == 1)
+    {
+        fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        if (fid1 < 0)
+        {
+            fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+            status = FAIL;
+            goto out;
+        }
+    }
+    else
+    {
+        fid1 = H5Fopen (fname1, H5F_ACC_RDWR, H5P_DEFAULT);
+        if (fid1 < 0)
+        {
+            fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname1);
+            status = FAIL;
+            goto out;
+        }
+    }
+
+    /*-----------------------------------------------------------------------
+    * Create group
+    *------------------------------------------------------------------------*/
+    gid = H5Gcreate2(fid1, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Variable length String1 - Create space and type
+    *------------------------------------------------------------------------*/
+    sid_vlen_str = H5Screate_simple(STR_RANK, dims_vlen_str, NULL);
+    if (sid_vlen_str < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    tid_vlen_str = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(tid_vlen_str, H5T_VARIABLE);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Fixed length String2 - Create space and type
+    *------------------------------------------------------------------------*/
+    sid_fixlen_str = H5Screate_simple(STR_RANK, dims_fixlen_str, NULL);
+    if (sid_fixlen_str < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    tid_fixlen_str = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(tid_fixlen_str, FIXLEN_STR_SIZE);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Fixed length String3 array - Create space and type
+    *------------------------------------------------------------------------*/
+    sid_vlen_str_array = H5Screate_simple(STR_RANK, dims_vlen_str_array, NULL);
+    if (sid_vlen_str_array < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    tid_vlen_str_array_pre = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(tid_vlen_str_array_pre, H5T_VARIABLE);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+     /* Create the array data type for the string array                */
+    tid_vlen_str_array = H5Tarray_create2(tid_vlen_str_array_pre, COMP_RANK, dims_vlen_str_array);
+    if (tid_vlen_str_array < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tarray_create2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Variable length String4 array - Create space and type
+    *------------------------------------------------------------------------*/
+    sid_fixlen_str_array = H5Screate_simple(STR_RANK, dims_fixlen_str_array, NULL);
+    if (sid_fixlen_str_array < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    tid_fixlen_str_array_pre = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(tid_fixlen_str_array_pre, FIXLEN_STR_ARRY_SIZE);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tset_size failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+     /* Create the array data type for the string array                */
+    tid_fixlen_str_array = H5Tarray_create2(tid_fixlen_str_array_pre, COMP_RANK, dims_fixlen_str_array);
+    if (tid_fixlen_str_array < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tarray_create2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+   /*-------------------------------------------------------------------------
+    * Compound dataset
+    *------------------------------------------------------------------------*/
+    sid_comp = H5Screate_simple(COMP_RANK, dims_comp, NULL);
+    if (sid_comp < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Screate_simple failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    tid1_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp1_t));
+    tid2_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp2_t));
+    tid3_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp3_t));
+    tid4_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp4_t));
+    tid5_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp5_t));
+    tid6_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp6_t));
+    tid7_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp7_t));
+    tid8_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp8_t));
+    tid9_comp = H5Tcreate (H5T_COMPOUND, sizeof(comp9_t));
+
+    /* compound 1 */
+    H5Tinsert(tid1_comp, "VLEN_STR1", HOFFSET(comp1_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid1_comp, "VLEN_STR2", HOFFSET(comp1_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid1_comp, "FIXLEN_STR1", HOFFSET(comp1_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid1_comp, "FIXLEN_STR2", HOFFSET(comp1_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid1_comp, "VLEN_STR_ARRAY1", HOFFSET(comp1_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid1_comp, "VLEN_STR_ARRAY2", HOFFSET(comp1_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid1_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp1_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid1_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp1_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 2 */
+    H5Tinsert(tid2_comp, "VLEN_STR1", HOFFSET(comp2_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid2_comp, "VLEN_STR2", HOFFSET(comp2_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid2_comp, "FIXLEN_STR1", HOFFSET(comp2_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid2_comp, "FIXLEN_STR2", HOFFSET(comp2_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid2_comp, "VLEN_STR_ARRAY1", HOFFSET(comp2_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid2_comp, "VLEN_STR_ARRAY2", HOFFSET(comp2_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid2_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp2_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid2_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp2_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 3 */
+    H5Tinsert(tid3_comp, "VLEN_STR1", HOFFSET(comp3_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid3_comp, "VLEN_STR2", HOFFSET(comp3_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid3_comp, "FIXLEN_STR1", HOFFSET(comp3_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid3_comp, "FIXLEN_STR2", HOFFSET(comp3_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid3_comp, "VLEN_STR_ARRAY1", HOFFSET(comp3_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid3_comp, "VLEN_STR_ARRAY2", HOFFSET(comp3_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid3_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp3_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid3_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp3_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 4 */
+    H5Tinsert(tid4_comp, "VLEN_STR1", HOFFSET(comp4_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid4_comp, "VLEN_STR2", HOFFSET(comp4_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid4_comp, "FIXLEN_STR1", HOFFSET(comp4_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid4_comp, "FIXLEN_STR2", HOFFSET(comp4_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid4_comp, "VLEN_STR_ARRAY1", HOFFSET(comp4_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid4_comp, "VLEN_STR_ARRAY2", HOFFSET(comp4_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid4_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp4_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid4_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp4_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 5 */
+    H5Tinsert(tid5_comp, "VLEN_STR1", HOFFSET(comp5_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid5_comp, "VLEN_STR2", HOFFSET(comp5_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid5_comp, "FIXLEN_STR1", HOFFSET(comp5_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid5_comp, "FIXLEN_STR2", HOFFSET(comp5_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid5_comp, "VLEN_STR_ARRAY1", HOFFSET(comp5_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid5_comp, "VLEN_STR_ARRAY2", HOFFSET(comp5_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid5_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp5_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid5_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp5_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 6 */
+    H5Tinsert(tid6_comp, "VLEN_STR1", HOFFSET(comp6_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid6_comp, "VLEN_STR2", HOFFSET(comp6_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid6_comp, "FIXLEN_STR1", HOFFSET(comp6_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid6_comp, "FIXLEN_STR2", HOFFSET(comp6_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid6_comp, "VLEN_STR_ARRAY1", HOFFSET(comp6_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid6_comp, "VLEN_STR_ARRAY2", HOFFSET(comp6_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid6_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp6_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid6_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp6_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 7 */
+    H5Tinsert(tid7_comp, "VLEN_STR1", HOFFSET(comp7_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid7_comp, "VLEN_STR2", HOFFSET(comp7_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid7_comp, "FIXLEN_STR1", HOFFSET(comp7_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid7_comp, "FIXLEN_STR2", HOFFSET(comp7_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid7_comp, "VLEN_STR_ARRAY1", HOFFSET(comp7_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid7_comp, "VLEN_STR_ARRAY2", HOFFSET(comp7_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid7_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp7_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid7_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp7_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 8 */
+    H5Tinsert(tid8_comp, "VLEN_STR1", HOFFSET(comp8_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid8_comp, "VLEN_STR2", HOFFSET(comp8_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid8_comp, "FIXLEN_STR1", HOFFSET(comp8_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid8_comp, "FIXLEN_STR2", HOFFSET(comp8_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid8_comp, "VLEN_STR_ARRAY1", HOFFSET(comp8_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid8_comp, "VLEN_STR_ARRAY2", HOFFSET(comp8_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid8_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp8_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid8_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp8_t, str_fixlen_array_again), tid_fixlen_str_array);
+
+    /* compound 9 */
+    H5Tinsert(tid9_comp, "VLEN_STR1", HOFFSET(comp9_t, str_vlen), tid_vlen_str );
+    H5Tinsert(tid9_comp, "VLEN_STR2", HOFFSET(comp9_t, str_vlen_repeat), tid_vlen_str );
+    H5Tinsert(tid9_comp, "FIXLEN_STR1", HOFFSET(comp9_t, str_fixlen), tid_fixlen_str );
+    H5Tinsert(tid9_comp, "FIXLEN_STR2", HOFFSET(comp9_t, str_fixlen_repeat), tid_fixlen_str );
+    H5Tinsert(tid9_comp, "VLEN_STR_ARRAY1", HOFFSET(comp9_t, str_array_vlen), tid_vlen_str_array);
+    H5Tinsert(tid9_comp, "VLEN_STR_ARRAY2", HOFFSET(comp9_t, str_vlen_array_again), tid_vlen_str_array);
+    H5Tinsert(tid9_comp, "FIXLEN_STR_ARRAY1", HOFFSET(comp9_t, str_array_fixlen), tid_fixlen_str_array);
+    H5Tinsert(tid9_comp, "FIXLEN_STR_ARRAY2", HOFFSET(comp9_t, str_fixlen_array_again), tid_fixlen_str_array);
+    H5Tinsert(tid9_comp, "INT_DATA1", HOFFSET(comp9_t, int_data1), H5T_STD_I32LE);
+    H5Tinsert(tid9_comp, "INT_DATA2", HOFFSET(comp9_t, int_data2), H5T_STD_I32BE);
+    H5Tinsert(tid9_comp, "INT_DATA3", HOFFSET(comp9_t, int_data3), H5T_STD_I32LE);
+    H5Tinsert(tid9_comp, "OBJREF1", HOFFSET(comp9_t, objref1), H5T_STD_REF_OBJ);
+    H5Tinsert(tid9_comp, "OBJREF2", HOFFSET(comp9_t, objref2), H5T_STD_REF_OBJ);
+    H5Tinsert(tid9_comp, "OBJREF3", HOFFSET(comp9_t, objref3), H5T_STD_REF_OBJ);
+
+
+    /* Write data to compound 1 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset1", tid1_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid1_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp1_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 2 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset2", tid2_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid2_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp2_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 3 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset3", tid3_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid3_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp3_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 4 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset4", tid4_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid4_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp4_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 5 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset5", tid5_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid5_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp5_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 6 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset6", tid6_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid6_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp6_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 7 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset7", tid7_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid7_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp7_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 8 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset8", tid8_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did_comp, tid8_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp8_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+    H5Dclose(did_comp);
+
+    /* Write data to compound 9 dataset buffer */
+    did_comp = H5Dcreate2(gid, "Compound_dset9", tid9_comp, sid_comp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* obj references */
+    status=H5Rcreate(&(comp9_buf.objref1),gid,"Compound_dset2",H5R_OBJECT,(hid_t)-1);
+    status=H5Rcreate(&(comp9_buf.objref2),gid,"Compound_dset3",H5R_OBJECT,(hid_t)-1);
+    status=H5Rcreate(&(comp9_buf.objref3),gid,"Compound_dset4",H5R_OBJECT,(hid_t)-1);
+
+    status = H5Dwrite(did_comp, tid9_comp, H5S_ALL, H5S_ALL, H5P_DEFAULT, &comp9_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+
+    H5Dclose(did_comp);
+
+    did_comp=0;
+out:
+   /*-----------------------------------------------------------------------
+    * Close
+    *-----------------------------------------------------------------------*/
+    if(fid1 > 0)
+        H5Fclose(fid1);
+    if(gid > 0)
+        H5Gclose(gid);
+    /* vlen string */
+    if(tid_vlen_str > 0)
+        H5Tclose(tid_vlen_str);
+    if(sid_vlen_str > 0)
+        H5Sclose(sid_vlen_str);
+    /* fixed len string */
+    if(tid_fixlen_str > 0)
+        H5Tclose(tid_fixlen_str);
+    if(sid_fixlen_str > 0)
+        H5Sclose(sid_fixlen_str);
+    /* vlen string array */
+    if(tid_vlen_str_array_pre > 0)
+        H5Tclose(tid_vlen_str_array_pre);
+    if(tid_vlen_str_array > 0)
+        H5Tclose(tid_vlen_str_array);
+    if(sid_vlen_str_array > 0)
+        H5Sclose(sid_vlen_str_array);
+    /* fixed len string array */
+    if(tid_fixlen_str_array_pre > 0)
+        H5Tclose(tid_fixlen_str_array_pre);
+    if(tid_fixlen_str_array > 0)
+        H5Tclose(tid_fixlen_str_array);
+    if(sid_fixlen_str_array > 0)
+        H5Sclose(sid_fixlen_str_array);
+    /* compound */
+    if(tid1_comp > 0)
+        H5Tclose(tid1_comp);
+    if(tid2_comp > 0)
+        H5Tclose(tid2_comp);
+    if(tid3_comp > 0)
+        H5Tclose(tid3_comp);
+    if(tid4_comp > 0)
+        H5Tclose(tid4_comp);
+    if(tid5_comp > 0)
+        H5Tclose(tid5_comp);
+    if(tid6_comp > 0)
+        H5Tclose(tid6_comp);
+    if(tid7_comp > 0)
+        H5Tclose(tid7_comp);
+    if(tid8_comp > 0)
+        H5Tclose(tid8_comp);
+    if(tid9_comp > 0)
+        H5Tclose(tid9_comp);
+    if(did_comp > 0)
+        H5Dclose(did_comp);
+    if(sid_comp > 0)
+        H5Sclose(sid_comp);
+
+    return status;
+} /* end test_comp_vlen_strings() */
+
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Test diffs of enum values which may include invalid values.
+*
+* Programmer: Dana Robinson
+*
+*-------------------------------------------------------------------------*/
+
+static int
+test_enums(const char *fname)
+{
+    hid_t       fid  = -1;
+
+    hid_t       tid       = -1;
+    int         enum_val  = -1;
+
+    /* The data in the two arrays cover the following cases:
+     *
+     *   V = valid enum value, I = invalid enum value
+     *
+     *   0:  I-I (same value)
+     *   1:  V-I
+     *   2:  I-V
+     *   3:  V-V (same value)
+     *   4:  I-I (different values) SKIPPED FOR NOW
+     *   5:  V-V (different values)
+     */
+    /* *** NOTE ***
+     *
+     * There is a bug in H5Dread() where invalid enum values are always
+     * returned as -1 so two different invalid enum values cannot be
+     * properly compared.  Test 4 has been adjusted to pass here
+     * while we fix the issue.
+     */
+    int         data1[6] = {9, 0, 9, 0, 9, 0};
+    /*int         data1[6] = {9, 0, 9, 0, 8, 0};  */
+    int         data2[6] = {9, 9, 0, 0, 9, 1};
+
+    hsize_t     dims = 6;
+
+    herr_t      status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+     * Create the file
+     *---------------------------------------------------------------------*/
+
+    fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-----------------------------------------------------------------------
+     * Create enum types
+     *---------------------------------------------------------------------*/
+
+    tid = H5Tenum_create(H5T_NATIVE_INT);
+    enum_val = 0;
+    status = H5Tenum_insert(tid, "YIN", &enum_val);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tenum_insert failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+    enum_val = 1;
+    status = H5Tenum_insert(tid, "YANG", &enum_val);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tenum_insert failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Create datasets containing enum data.
+     *---------------------------------------------------------------------*/
+
+    status = write_dset(fid, 1, &dims, "dset1", tid, data1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+    status = write_dset(fid, 1, &dims, "dset2", tid, data2);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+     * Close
+     *---------------------------------------------------------------------*/
+    if(fid)
+        H5Fclose(fid);
+    if(tid)
+        H5Tclose(tid);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose:
+*   Create test files with dataset and attribute with container types
+*   (array, vlen) with multiple nested compound types.
+*
+* Function: test_comps_array()
+*  - type: compound->array->compound
+*
+* Function: test_comps_vlen()
+*  - type: compound->vlen->compound
+*
+* Function: test_comps_array_vlen()
+*  - type: compound->array->compound->vlen->compound
+*
+* Function: test_comps_vlen_arry()
+*  - type: compound->vlen->compound->array->compound
+*
+* Programmer: Jonathan Kim (Sep, 1, 2011)
+*
+*-------------------------------------------------------------------------*/
+#define SDIM_DSET 2
+#define SDIM_CMPD_ARRAY 2
+
+static void test_comps_array (const char *fname, const char *dset, const char *attr,int diff, int is_file_new)
+{
+    /* sub compound 2 */
+    typedef struct {
+        int i2;
+        float f2;
+    } cmpd2_t;
+
+    /* top compound 1 */
+    typedef struct {
+        int i1;
+        cmpd2_t cmpd2[SDIM_CMPD_ARRAY];
+    } cmpd1_t;
+
+    cmpd1_t wdata[SDIM_DSET];   /* dataset with compound1 */
+
+    hid_t  fid;  /* HDF5 File IDs  */
+    hid_t  did_dset; /* Dataset ID   */
+    hid_t  sid_dset;       /* Dataset space ID   */
+    hid_t  tid_cmpd1;       /* Compound1 type ID   */
+    hid_t  tid_arry1;       /* Array type ID in compound1   */
+    hid_t  tid_cmpd2;       /* Compound2 type ID   */
+    hid_t  tid_attr;
+    hsize_t  sdims_dset[] = {SDIM_DSET};
+    hsize_t  sdims_cmpd_arry[] = {SDIM_CMPD_ARRAY};
+    int     i,j;
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i < SDIM_DSET; i++)
+    {
+        wdata[i].i1 = i;
+        for(j=0; j < SDIM_CMPD_ARRAY; j++)
+        {
+            wdata[i].cmpd2[j].i2 = i * 10 + diff;
+            wdata[i].cmpd2[j].f2 = (float)i * 10.5F + (float)diff;
+        } /* end for */
+    }
+
+   /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    if (is_file_new == 1)
+        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    else
+        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
+
+
+    /* -------------------------------
+     * Create a sub compound2 datatype  */
+    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
+    assert(ret >= 0);
+
+    /* Insert float field */
+    ret = H5Tinsert(tid_cmpd2, "float2", HOFFSET(cmpd2_t, f2), H5T_NATIVE_FLOAT);
+    assert(ret >= 0);
+
+    /*-----------------------------------
+     * Create a top compound1.
+     */
+    tid_cmpd1 = H5Tcreate (H5T_COMPOUND, sizeof(cmpd1_t));
+
+    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
+    assert(ret >= 0);
+
+    /* Create an array datatype */
+    tid_arry1 = H5Tarray_create2(tid_cmpd2, 1, sdims_cmpd_arry);
+    /* insert the array */
+    ret = H5Tinsert(tid_cmpd1, "array_cmpd1", HOFFSET(cmpd1_t, cmpd2), tid_arry1);
+    assert(ret >= 0);
+
+
+    /* -------------------
+     * Create a dataset
+     */
+    /* Create dataspace for datasets */
+    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
+
+    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /*-----------------------------------
+     * Create an attribute in root group
+     */
+    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
+    assert(tid_attr > 0);
+    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
+    assert(ret >= 0);
+
+    /* ----------------
+     * Close Dataset */
+    ret = H5Aclose(tid_attr);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_arry1);
+    assert(ret >= 0);
+    ret = H5Dclose(did_dset);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2);
+    assert(ret >= 0);
+    ret = H5Sclose(sid_dset);
+    assert(ret >= 0);
+    ret = H5Fclose(fid);
+    assert(ret >= 0);
+}
+
+
+
+static void test_comps_vlen (const char * fname, const char *dset, const char *attr, int diff, int is_file_new)
+{
+    /* sub compound 2 */
+    typedef struct {
+        int i2;
+        float f2;
+    } cmpd2_t;
+
+    /* top compound 1 */
+    typedef struct {
+        int i1;
+        hvl_t vl;   /* VL information for compound2 */
+    } cmpd1_t;
+
+    cmpd1_t wdata[SDIM_DSET];   /* Dataset for compound1 */
+
+    hid_t  fid;  /* HDF5 File ID */
+    hid_t  did_dset; /* dataset ID   */
+    hid_t  sid_dset;  /* dataset space ID */
+    hid_t  tid_attr;
+    hid_t  tid_cmpd2; /* compound2 type ID */
+    hid_t  tid_cmpd1; /* compound1 type ID */
+    hid_t  tid_cmpd1_vlen;
+    hsize_t  sdims_dset[] = {SDIM_DSET};
+
+    unsigned       i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i = 0; i < SDIM_DSET; i++) {
+        wdata[i].i1 = (int)i;
+        wdata[i].vl.p = HDmalloc((i + 1) * sizeof(cmpd2_t));
+        wdata[i].vl.len = i + 1;
+        for(j = 0; j < (i + 1); j++) {
+            ((cmpd2_t *)wdata[i].vl.p)[j].i2 = (int)(i * 10 + (unsigned)diff);
+            ((cmpd2_t *)wdata[i].vl.p)[j].f2 = (float)i * 10.5F + (float)diff;
+        } /* end for */
+    } /* end for */
+
+    /*-----------------------------------------------------------------------
+     * Create file(s)
+     *------------------------------------------------------------------------*/
+    if (is_file_new == 1)
+        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    else
+        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
+
+    /* -----------------------------
+     * Create sub compound2 type */
+    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
+    assert(ret >= 0);
+    ret = H5Tinsert(tid_cmpd2, "float2", HOFFSET(cmpd2_t, f2), H5T_NATIVE_FLOAT);
+    assert(ret >= 0);
+
+    /* ---------------------------
+     * Create top compound1 type */
+    tid_cmpd1 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd1_t));
+    /* Insert fields */
+    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
+    assert(ret >= 0);
+    /* Create a VL datatype */
+    tid_cmpd1_vlen = H5Tvlen_create(tid_cmpd2);
+
+    ret = H5Tinsert(tid_cmpd1, "vlen_cmpd1", HOFFSET(cmpd1_t, vl), tid_cmpd1_vlen);
+    assert(ret >= 0);
+
+    /* -------------------------------
+     * Create dataset with compound1
+     */
+    /* Create dataspace for dataset */
+    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
+
+    /* Create a dataset */
+    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /*-----------------------------------
+     * Create an attribute in root group
+     */
+    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
+    assert(tid_attr > 0);
+    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
+    assert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /* ----------------
+     * Close IDs */
+    ret = H5Aclose(tid_attr);
+    assert(ret >= 0);
+    ret = H5Dclose(did_dset);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1);
+    assert(ret >= 0);
+    ret = H5Sclose(sid_dset);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1_vlen);
+    assert(ret >= 0);
+    ret = H5Fclose(fid);
+    assert(ret >= 0);
+}
+
+
+static void test_comps_array_vlen (const char * fname, const char *dset,const char *attr, int diff, int is_file_new)
+{
+    typedef struct {
+        int i3;
+        float f3;
+    } cmpd3_t;
+
+    typedef struct {        /* Typedef for compound datatype */
+        int i2;
+        hvl_t vl;   /* VL information to write */
+    } cmpd2_t;
+
+    typedef struct {
+        int i1;
+        cmpd2_t cmpd2[SDIM_CMPD_ARRAY];
+    } cmpd1_t;
+
+    cmpd1_t wdata[SDIM_DSET];   /* Information to write */
+    hid_t  fid;  /* HDF5 File IDs  */
+    hid_t  did_dset; /* Dataset ID   */
+    hid_t  sid_dset;       /* Dataspace ID   */
+    hid_t  tid_attr;
+    hid_t  tid_cmpd1;       /* Compound1 Datatype ID   */
+    hid_t  tid_arry1;       /* Array Datatype ID   */
+    hid_t  tid_cmpd2;       /* Compound2 Datatype ID   */
+    hid_t  tid_cmpd2_vlen;
+    hid_t  tid_cmpd3;       /* Compound3 Datatype ID   */
+    hsize_t  sdims_dset[] = {SDIM_DSET};
+    hsize_t  sdims_arry[] = {SDIM_CMPD_ARRAY};
+    unsigned i, j, k;   /* counting variables */
+    herr_t  ret;        /* Generic return value  */
+
+
+
+    /* Initialize array data to write in compound1 */
+    for(i = 0; i < SDIM_DSET; i++) {
+        wdata[i].i1 = (int)i;
+
+        /* Allocate and initialize VL data to write in compound2 */
+        for(j = 0; j < SDIM_CMPD_ARRAY; j++) {
+            wdata[i].cmpd2[j].i2 = (int)(j * 10);
+            wdata[i].cmpd2[j].vl.p = HDmalloc((j + 1) * sizeof(cmpd3_t));
+            wdata[i].cmpd2[j].vl.len = j + 1;
+            for(k = 0; k < (j + 1); k++) {
+                /* Initialize data of compound3 */
+                ((cmpd3_t *)wdata[i].cmpd2[j].vl.p)[k].i3 = (int)j * 10 + diff;
+                ((cmpd3_t *)wdata[i].cmpd2[j].vl.p)[k].f3 = (float)j * 10.5F + (float)diff;
+            } /* end for */
+        } /* end for */
+    }
+
+    /*-----------------------------------------------------------------------
+     * Create file(s)
+     *------------------------------------------------------------------------*/
+    if (is_file_new == 1)
+        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    else
+        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
+
+    /*-------------------------------------
+     * Create a sub compound3 datatype  */
+    tid_cmpd3 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd3_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert(tid_cmpd3, "int", HOFFSET(cmpd3_t, i3), H5T_NATIVE_INT);
+    assert(ret >= 0);
+
+    /* Insert float field */
+    ret = H5Tinsert(tid_cmpd3, "float", HOFFSET(cmpd3_t, f3), H5T_NATIVE_FLOAT);
+    assert(ret >= 0);
+
+
+    /*-------------------------------------
+     * Create a sub compound2 datatype  */
+    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert(tid_cmpd2, "int", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
+    assert(ret >= 0);
+    /* Create a VL datatype */
+    tid_cmpd2_vlen = H5Tvlen_create(tid_cmpd3);
+    ret = H5Tinsert(tid_cmpd2, "vlen", HOFFSET(cmpd2_t, vl), tid_cmpd2_vlen);
+    assert(ret >= 0);
+
+
+    /*-----------------------------------
+     * Create a top compound1 datatype for dataset.
+     */
+    tid_cmpd1 = H5Tcreate (H5T_COMPOUND, sizeof(cmpd1_t));
+
+    /* Create an array datatype */
+    tid_arry1 = H5Tarray_create2(tid_cmpd2, 1, sdims_arry);
+    /* insert the array */
+    H5Tinsert(tid_cmpd1, "array_comp", HOFFSET(cmpd1_t, cmpd2), tid_arry1);
+
+
+    /* ----------------------
+     * Create a dataset */
+    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /*-----------------------------------
+     * Create an attribute in root group
+     */
+    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
+    assert(tid_attr > 0);
+    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
+    assert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /*-------------------
+     * Close IDs */
+    ret = H5Aclose(tid_attr);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_arry1);
+    assert(ret >= 0);
+    ret = H5Dclose(did_dset);
+    assert(ret >= 0);
+    ret = H5Sclose(sid_dset);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd3);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2_vlen);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1);
+    assert(ret >= 0);
+    ret = H5Fclose(fid);
+    assert(ret >= 0);
+}
+
+
+static void test_comps_vlen_arry (const char * fname, const char *dset, const char *attr, int diff, int is_file_new)
+{
+    /* sub compound 3 */
+    typedef struct {
+        int i3;
+        float f3;
+    } cmpd3_t;
+
+    /* sub compound 2 */
+    typedef struct {
+        int i2;
+        cmpd3_t cmpd3[SDIM_CMPD_ARRAY];
+    } cmpd2_t;
+
+    /* top compound 1 */
+    typedef struct {
+        int i1;
+        hvl_t vl;   /* VL information for compound2 */
+    } cmpd1_t;
+
+    cmpd1_t wdata[SDIM_DSET];   /* Dataset for compound1 */
+
+    hid_t  fid;  /* HDF5 File ID */
+    hid_t  did_dset; /* dataset ID   */
+    hid_t  sid_dset;  /* dataset space ID */
+    hid_t  tid_attr;
+    hid_t  tid_cmpd3; /* compound3 type ID */
+    hid_t  tid_cmpd2; /* compound2 type ID */
+    hid_t  tid_cmpd2_arry;
+    hid_t  tid_cmpd1; /* compound1 type ID */
+    hid_t  tid_cmpd1_vlen;
+    hsize_t  sdims_dset[] = {SDIM_DSET};
+    hsize_t  sdims_cmpd_arry[] = {SDIM_CMPD_ARRAY};
+
+    unsigned       i,j,k;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i = 0; i < SDIM_DSET; i++) {
+        /* compound 1 data */
+        wdata[i].i1 = (int)i;
+        wdata[i].vl.p = HDmalloc((i + 1) * sizeof(cmpd2_t));
+        wdata[i].vl.len = i + 1;
+        for(j = 0; j < (i + 1); j++) {
+            /* compound2 data */
+            ((cmpd2_t *)wdata[i].vl.p)[j].i2 = (int)i * 10 + diff;
+            for(k = 0; k < SDIM_CMPD_ARRAY; k++) {
+                /* compound 3 data */
+                ((cmpd2_t *)(wdata[i].vl.p))[j].cmpd3[k].i3 = (int)((float)k * 10.5F) + diff;
+                ((cmpd2_t *)(wdata[i].vl.p))[j].cmpd3[k].f3 = (float)k * 10.5F + (float)diff;
+            } /* end for */
+        } /* end for */
+    } /* end for */
+
+    /*-----------------------------------------------------------------------
+     * Create file(s)
+     *------------------------------------------------------------------------*/
+    if (is_file_new == 1)
+        fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    else
+        fid = H5Fopen (fname, H5F_ACC_RDWR, H5P_DEFAULT);
+
+    /* -----------------------------
+     * Create sub compound3 type */
+    tid_cmpd3 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd3_t));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid_cmpd3, "int3", HOFFSET(cmpd3_t, i3), H5T_NATIVE_INT);
+    assert(ret >= 0);
+    ret = H5Tinsert(tid_cmpd3, "float3", HOFFSET(cmpd3_t, f3), H5T_NATIVE_FLOAT);
+    assert(ret >= 0);
+
+    /* -----------------------------
+     * Create sub compound2 type */
+    tid_cmpd2 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd2_t));
+
+    ret = H5Tinsert(tid_cmpd2, "int2", HOFFSET(cmpd2_t, i2), H5T_NATIVE_INT);
+    assert(ret >= 0);
+
+    tid_cmpd2_arry = H5Tarray_create2(tid_cmpd3, 1, sdims_cmpd_arry);
+    ret = H5Tinsert(tid_cmpd2, "array_cmpd2", HOFFSET(cmpd2_t, cmpd3), tid_cmpd2_arry);
+    assert(ret >= 0);
+
+    /* ---------------------------
+     * Create top compound1 type
+     */
+    /* Create a VL datatype */
+    tid_cmpd1 = H5Tcreate(H5T_COMPOUND, sizeof(cmpd1_t));
+    /* Insert fields */
+    ret = H5Tinsert(tid_cmpd1, "int1", HOFFSET(cmpd1_t, i1), H5T_NATIVE_INT);
+    assert(ret >= 0);
+    tid_cmpd1_vlen = H5Tvlen_create(tid_cmpd2);
+    ret = H5Tinsert(tid_cmpd1, "vlen_cmpd1", HOFFSET(cmpd1_t, vl), tid_cmpd1_vlen);
+    assert(ret >= 0);
+
+    /* -------------------------------
+     * Create dataset with compound1
+     */
+    /* Create dataspace for dataset */
+    sid_dset = H5Screate_simple(1, sdims_dset, NULL);
+
+    /* Create a dataset */
+    did_dset = H5Dcreate2(fid, dset, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(did_dset, tid_cmpd1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /*-----------------------------------
+     * Create an attribute in root group
+     */
+    tid_attr = H5Acreate2(fid, attr, tid_cmpd1, sid_dset, H5P_DEFAULT, H5P_DEFAULT);
+    assert(tid_attr > 0);
+    ret = H5Awrite(tid_attr, tid_cmpd1, wdata);
+    assert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid_cmpd1, sid_dset, H5P_DEFAULT, wdata);
+    assert(ret >= 0);
+
+    /* ----------------
+     * Close IDs */
+    ret = H5Aclose(tid_attr);
+    assert(ret >= 0);
+    ret = H5Dclose(did_dset);
+    assert(ret >= 0);
+    ret = H5Sclose(sid_dset);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd3);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2_arry);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd2);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1_vlen);
+    assert(ret >= 0);
+    ret = H5Tclose(tid_cmpd1);
+    assert(ret >= 0);
+    ret = H5Fclose(fid);
+    assert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: test_data_nocomparables
+*
+* Purpose:
+*   Create test files with non-comparable dataset and attributes with
+*   comparable datasets and attributes.  All the comparables should display
+*   differences.
+*
+*-------------------------------------------------------------------------*/
+#define DIM_ARRY 3
+static void test_data_nocomparables (const char * fname, int make_diffs)
+{
+    hid_t   fid=0;
+    hid_t   gid1=0;
+    hid_t   gid2=0;
+    hid_t   did1=0;
+    hid_t   did2=0;
+    hid_t   sid1=0;
+    hid_t   tid_dset1=0;
+    hid_t   tid_attr1=0;
+    hsize_t dims1_1[1] = {DIM_ARRY};
+    hsize_t dims1_2[1] = {DIM_ARRY+1};
+    hsize_t dims2[2] = {DIM_ARRY, 1};
+    int data1[DIM_ARRY] = {0,0,0};
+    int data2[DIM_ARRY] = {1,1,1};
+    int data3[DIM_ARRY+1] = {1,1,1,1};
+    int data1_dim2[DIM_ARRY][1] = {{0},{0},{0}};
+    int rank_attr;
+    char data1_str[DIM_ARRY][STR_SIZE]= {"ab","cd","ef"};
+    herr_t  status = SUCCEED;
+    void *dset_data_ptr1=NULL;
+    void *dset_data_ptr2=NULL;
+    void *dset_data_ptr3=NULL;
+    void *attr_data_ptr1=NULL;
+    void *attr_data_ptr2=NULL;
+    void *attr_data_ptr3=NULL;
+    void *attr_data_ptr4=NULL;
+    void *attr2_dim_ptr=NULL;
+    void *attr3_dim_ptr=NULL;
+
+    /* init */
+    tid_dset1=H5Tcopy(H5T_NATIVE_INT);
+    dset_data_ptr1=(int*)&data1;
+    dset_data_ptr2=(int*)&data1;
+    dset_data_ptr3=(int*)&data1;
+    tid_attr1=H5Tcopy(H5T_NATIVE_INT);
+    attr_data_ptr1=(int*)&data1;
+    attr_data_ptr3=(int*)&data1;
+    attr_data_ptr4=(int*)&data1;
+    attr2_dim_ptr=(hsize_t*)&dims1_1;
+    attr3_dim_ptr=(hsize_t*)&dims1_1;
+    rank_attr=1;
+
+    if (make_diffs)
+    {
+        /* ------------
+         * group1 */
+        tid_dset1=H5Tcopy(H5T_C_S1);
+        H5Tset_size(tid_dset1, (size_t)STR_SIZE);
+        dset_data_ptr1=(char*)&data1_str;
+        dset_data_ptr2=(int*)&data2;
+        attr_data_ptr1=(int*)&data2;
+
+        /* -----------
+         * group2
+         */
+        dset_data_ptr3=(int*)&data2;
+        /* dset1/attr1 */
+        tid_attr1=H5Tcopy(H5T_C_S1);
+        H5Tset_size(tid_attr1, (size_t)STR_SIZE);
+        attr_data_ptr2=(char*)&data1_str;
+
+        /* dset1/attr2 */
+        attr2_dim_ptr=(hsize_t*)&dims1_2;
+
+        /* dset1/attr3 */
+        attr_data_ptr3=(int*)&data1_dim2;
+        attr3_dim_ptr=(hsize_t*)&dims2;
+        rank_attr=2;
+
+        /* dset1/attr4 */
+        attr_data_ptr4=(int*)&data2;
+
+    }
+
+
+   /*-----------------------------------------------------------------------
+    * Create file(s)
+    *------------------------------------------------------------------------*/
+    fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fid < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Groups
+    *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2 = H5Gcreate2(fid, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets in /g1
+    *------------------------------------------------------------------------*/
+    if((sid1 = H5Screate_simple(1, dims1_1, NULL)) < 0)
+         goto out;
+
+    /*  dset1 */
+    if((did1 = H5Dcreate2(gid1, "dset1", tid_dset1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", "dset1");
+        status = FAIL;
+        goto out;
+    }
+
+    if(H5Dwrite(did1, tid_dset1, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data_ptr1) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", "dset1");
+        status = FAIL;
+        goto out;
+    }
+    write_attr(did1,1,dims1_1,"attr", H5T_NATIVE_INT, attr_data_ptr1);
+
+    /*  dset2 */
+    status = write_dset(gid1, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname);
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * Datasets in /g2
+    *------------------------------------------------------------------------*/
+    /* ---------
+     *  dset1 */
+    if((did2 = H5Dcreate2(gid2, "dset1", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", "dset1");
+        status = FAIL;
+        goto out;
+    }
+
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data_ptr3) < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Dwrite failed.\n", "dset1");
+        status = FAIL;
+        goto out;
+    }
+    /* attr1 - non-compatible : different type */
+    write_attr(did2,1,dims1_1,"attr1", tid_attr1, attr_data_ptr2);
+
+
+    /* attr2 - non-compatible : same rank, different dimention */
+    write_attr(did2,1,(hsize_t *)attr2_dim_ptr,"attr2", H5T_NATIVE_INT, data3);
+
+    /* attr3 - non-compatible : different rank */
+    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);
+
+    /*----------
+     * dset2 */
+    status = write_dset(gid2, 1, dims1_1,"dset2", H5T_NATIVE_INT, dset_data_ptr3);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname);
+        goto out;
+    }
+
+
+
+out:
+
+    /*-----------------------------------------------------------------------
+    * Close IDs
+    *-----------------------------------------------------------------------*/
+    if(fid)
+        H5Fclose(fid);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+    if(did1)
+        H5Dclose(did1);
+    if(did2)
+        H5Dclose(did2);
+    if(sid1)
+        H5Sclose(sid1);
+    if(tid_dset1)
+        H5Tclose(tid_dset1);
+    if(tid_attr1)
+        H5Tclose(tid_attr1);
+}
+
+/*-------------------------------------------------------------------------
+* Function: test_objs_nocomparables
+*
+* Purpose:
+*   Create test files with common objects (same name) but different object
+*   types.
+*   h5diff should show non-comparable output from these common objects.
+*-------------------------------------------------------------------------*/
+static void test_objs_nocomparables(const char *fname1, const char *fname2)
+{
+    herr_t  status = SUCCEED;
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   topgid1=0;
+    hid_t   topgid2=0;
+    hid_t   gid1=0;
+    hid_t   did1=0;
+    hid_t   tid1=0;
+    hid_t   gid2=0;
+    hid_t   did2=0;
+    hid_t   tid2=0;
+    hsize_t dims[1] = {DIM_ARRY};
+    int data1[DIM_ARRY] = {1,1,1};
+    int data2[DIM_ARRY] = {2,2,2};
+
+   /*-----------------------------------------------------------------------
+    * Open file(s) to add objects
+    *------------------------------------------------------------------------*/
+    /* file1 */
+    fid1 = H5Fopen (fname1, H5F_ACC_RDWR, H5P_DEFAULT);
+    if (fid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* file2 */
+    fid2 = H5Fopen (fname2, H5F_ACC_RDWR, H5P_DEFAULT);
+    if (fid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * in file1 : add member objects
+    *------------------------------------------------------------------------*/
+    /* parent group */
+    topgid1 = H5Gcreate2(fid1, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (topgid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* dataset */
+    status = write_dset(topgid1, 1, dims,"obj1", H5T_NATIVE_INT, data1);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+        goto out;
+    }
+
+    /* group */
+    gid1 = H5Gcreate2(topgid1, "obj2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* committed type */
+    tid1 = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(topgid1, "obj3", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname1);
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+    * in file2 : add member objects
+    *------------------------------------------------------------------------*/
+    /* parent group */
+    topgid2 = H5Gcreate2(fid2, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (topgid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /* group */
+    gid2 = H5Gcreate2(topgid2, "obj1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+        status = FAIL;
+        goto out;
+    }
+
+    /* committed type */
+    tid2 = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(topgid2, "obj2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname2);
+        goto out;
+    }
+
+    /* dataset */
+    status = write_dset(topgid2, 1, dims,"obj3", H5T_NATIVE_INT, data2);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+        goto out;
+    }
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close IDs
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+    if(topgid1)
+        H5Gclose(topgid1);
+    if(topgid2)
+        H5Gclose(topgid2);
+    if(did1)
+        H5Dclose(did1);
+    if(did2)
+        H5Dclose(did2);
+    if(gid1)
+        H5Gclose(gid1);
+    if(gid2)
+        H5Gclose(gid2);
+    if(tid1)
+        H5Tclose(tid1);
+    if(tid2)
+        H5Tclose(tid2);
+
+}
+
+static hid_t mkstr(int size, H5T_str_t pad) {
+    hid_t type;
+
+    if((type=H5Tcopy(H5T_C_S1)) < 0) return -1;
+    if(H5Tset_size(type, (size_t)size) < 0) return -1;
+    if(H5Tset_strpad(type, pad) < 0) return -1;
+
+    return type;
+}
+
+/*-------------------------------------------------------------------------
+* Function: test_objs_strings
+*
+* Purpose:
+*   Create test files with common objects (same name) but different string
+*   types.
+*   h5diff should show differences output from these common objects.
+*-------------------------------------------------------------------------*/
+static void test_objs_strings(const char *fname1, const char *fname2)
+{
+    herr_t  status = SUCCEED;
+    hid_t   fid1=0;
+    hid_t   fid2=0;
+    hid_t   dataset=0;
+    hid_t   space=0;
+    hid_t   f_type=0;
+    hid_t   m_type=0;
+    hsize_t dims1[] = {3, 4};
+    char string1A[12][3] = {"s1","s2","s3","s4","s5","s6","s","s","s9",
+            "s0","s1","s2"};
+    char string1B[12][3] = {"s1","s2","s3","s4","s","s","s7","s8","s9",
+            "s0","s1","s2"};
+
+    hsize_t dims2[]={20};
+    char string2A[20][10] = {"ab cd ef1", "ab cd ef2", "ab cd ef3", "ab cd ef4",
+            "ab cd ef5", "ab cd ef6", "ab cd ef7", "ab cd ef8",
+            "ab cd 9", "ab cd 0", "ab cd 1", "ab cd 2",
+            "ab cd ef3", "ab cd ef4", "ab cd ef5", "ab cd ef6",
+            "ab cd ef7", "ab cd ef8", "ab cd ef9", "ab cd ef0"};
+    char string2B[20][10] = {"ab cd ef1", "ab cd ef2", "ab cd ef3", "ab cd ef4",
+            "ab cd ef5", "ab cd ef6", "ab cd ef7", "ab cd ef8",
+            "ab cd ef9", "ab cd ef0", "ab cd ef1", "ab cd ef2",
+            "ab cd 3", "ab cd 4", "ab cd 5", "ab cd 6",
+            "ab cd ef7", "ab cd ef8", "ab cd ef9", "ab cd ef0"};
+
+    hsize_t dims3[] = {27};
+    char string3A[27][6] = {"abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6", "abcd7",
+            "abcd8", "abcd9", "abcd0", "abcd1",
+            "abd2", "abc3", "bcd4", "acd5",
+            "abcd6", "abcd7", "abcd8", "abcd9",
+            "abcd0", "abcd1", "abcd2", "abcd3",
+            "abc4", "abc5", "abc6"};
+    char string3B[27][6] = {"abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6", "abcd7",
+            "abcd8", "abcd9", "abcd0", "abcd1",
+            "abcd2", "abcd3", "abcd4", "abcd5",
+            "abd6", "abc7", "bcd8", "acd9",
+            "abcd0", "abcd1", "abcd2", "abcd3",
+            "abd4", "abd5", "abd6"};
+
+    hsize_t dims4[] = {3};
+    char string4A[3][21] = { "s1234567890123456789", "s1234567890123456789",
+            "s12345678901234567"};
+    char string4B[3][21] = { "s1234567890123456789", "s12345678901234567",
+            "s1234567890123456789"};
+
+    /*-----------------------------------------------------------------------
+     * Create file(s)
+     *------------------------------------------------------------------------*/
+     /* file1 */
+     fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+     if (fid1 < 0)
+     {
+         fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+         status = FAIL;
+         goto out;
+     }
+
+     /* file2 */
+     fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+     if (fid2 < 0)
+     {
+         fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+         status = FAIL;
+         goto out;
+     }
+
+    /* string 1 : nullterm string */
+    space = H5Screate_simple(2, dims1, NULL);
+    f_type = mkstr(5, H5T_STR_NULLTERM);
+    m_type = mkstr(3, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid1, "/string1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string1A);
+    H5Dclose(dataset);
+    dataset = H5Dcreate2(fid2, "/string1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string1B);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 2 : space pad string */
+    space = H5Screate_simple(1, dims2, NULL);
+    f_type = mkstr(11, H5T_STR_SPACEPAD);
+    m_type = mkstr(10, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid1, "/string2", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string2A);
+    H5Dclose(dataset);
+    dataset = H5Dcreate2(fid2, "/string2", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string2B);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 3 : null pad string */
+    space = H5Screate_simple(1, dims3, NULL);
+    f_type = mkstr(8, H5T_STR_NULLPAD);
+    m_type = mkstr(6, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid1, "/string3", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string3A);
+    H5Dclose(dataset);
+    dataset = H5Dcreate2(fid2, "/string3", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string3B);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 4 : space pad long string */
+    space = H5Screate_simple(1, dims4, NULL);
+    f_type = mkstr(168, H5T_STR_SPACEPAD);
+    m_type = mkstr(21, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid1, "/string4", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string4A);
+    H5Dclose(dataset);
+    dataset = H5Dcreate2(fid2, "/string4", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string4B);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+out:
+    /*-----------------------------------------------------------------------
+    * Close IDs
+    *-----------------------------------------------------------------------*/
+    if(fid1)
+        H5Fclose(fid1);
+    if(fid2)
+        H5Fclose(fid2);
+}
+
+/*-------------------------------------------------------------------------
+* Function: write_attr_in
+*
+* Purpose: write attributes in LOC_ID (dataset, group, named datatype)
+*
+*-------------------------------------------------------------------------
+*/
+static
+void write_attr_in(hid_t loc_id,
+                   const char* dset_name, /* for saving reference to dataset*/
+                   hid_t fid,
+                   int make_diffs /* flag to modify data buffers */)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+        char   a;
+        double b;
+    } s_t;
+
+    typedef enum
+    {
+        RED,
+        GREEN
+    } e_t;
+
+    hid_t   aid;
+    hid_t   sid;
+    hid_t   tid;
+    herr_t  status;
+    int     val, i, j, k, l, n;
+    float   f;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][STR_SIZE]= {"ab","de"};        /* string */
+    char       *buf1a[2];                             /* VL string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2.0F},{3,4.0F}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    e_t        buf45[2]= {RED,RED};            /* enum */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1.0F, 2.0F};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[3][2][STR_SIZE]= {{"ab","cd"},{"ef","gh"},{"ij","kl"}};            /* string */
+    char       *buf12a[3][2];                                                           /* VL string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                                        /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2.0F},{3,4.0F},{5,6.0F},{7,8.0F},{9,10.0F},{11,12.0F}};    /* compound */
+    hobj_ref_t buf42[3][2];                                                             /* reference */
+    e_t        buf452[3][2];                                                            /* enum */
+    hvl_t      buf52[3][2];                                                             /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                                        /* integer */
+    float      buf82[3][2]= {{1.0F,2.0F},{3.0F,4.0F},{5.0F,6.0F}};                      /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[4][3][2][STR_SIZE]= {{{"ab","cd"},{"ef","gh"},{"ij","kl"}},
+    {{"mn","pq"},{"rs","tu"},{"vw","xz"}},
+    {{"AB","CD"},{"EF","GH"},{"IJ","KL"}},
+    {{"MN","PQ"},{"RS","TU"},{"VW","XZ"}}};  /* string */
+    char       *buf13a[4][3][2];   /* VL string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    e_t        buf453[4][3][2];   /* enum */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+    * 1D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            for (j=0; j<2; j++)
+            {
+                buf1[i][j]='z';
+            }
+        }
+    }
+    /*
+    buf1[2][2]= {"ab","de"};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <string> and <string>
+    position      string of </g1>  string of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          a                z
+    [ 0 ]          b                z
+    [ 1 ]          d                z
+    [ 1 ]          e                z
+    */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, (size_t)STR_SIZE);
+    write_attr(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    for (i=0; i<2; i++)
+        buf1a[i]=buf1[i];
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_attr(loc_id,1,dims,"VLstring",tid,buf1a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            buf2[i]=buf2[1]=0;
+    }
+    /*
+    buf2[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <bitfield> and <bitfield>
+    position      bitfield of </g1> bitfield of </g1> difference
+    position        opaque of </g1> opaque of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    /*
+    buf2[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <opaque> and <opaque>
+    position     opaque of </g1> opaque of </g1> difference
+    position        opaque of </g1> opaque of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf3[i].a=0; buf3[i].b=0;
+        }
+    }
+
+    /*
+    buf3[2]= {{1,2},{3,4}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <compound> and <compound>
+    position        compound of </g1> compound of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               5               4
+    [ 0 ]          2               5               3
+    [ 1 ]          3               5               2
+    [ 1 ]          4               5               1
+    */
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf45[i]=GREEN;
+        }
+    }
+    /*
+    buf45[2]= {RED,RED};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <enum> and <enum>
+    position     enum of </g1>   enum of </g1>   difference
+    ------------------------------------------------------------
+    [ 0 ]          RED              GREEN
+    [ 1 ]          RED              GREEN
+    */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,1,dims,"enum",tid,buf45);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf5[1].p)[0]=2;
+    ((int *)buf5[1].p)[1]=3;
+
+    if (make_diffs)
+    {
+        ((int *)buf5[0].p)[0]=0;
+        ((int *)buf5[1].p)[0]=0;
+        ((int *)buf5[1].p)[1]=0;
+    }
+    /*
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    position        vlen of </g1>   vlen of </g1>   difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    [ 1 ]          3               0               3
+    */
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf5);
+    assert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    assert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            for (j=0; j<3; j++)
+            {
+                buf6[i][j]=0;
+            }
+    }
+    /*
+    buf6[2][3]= {{1,2,3},{4,5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <array> and <array>
+    position        array of </g1>  array of </g1>  difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 0 ]          2               0               2
+    [ 0 ]          3               0               3
+    [ 1 ]          4               0               4
+    [ 1 ]          5               0               5
+    [ 1 ]          6               0               6
+    */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf7[i]=0;
+            buf8[i]=0;
+        }
+    }
+    /*
+    buf7[2]= {1,2};
+    buf8[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    position        integer of </g1> integer of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    position        float of </g1>  float of </g1>  difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+    write_attr(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
+    write_attr(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+
+
+    /*-------------------------------------------------------------------------
+    * 2D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        for (i=0; i<3; i++)
+            for (j=0; j<2; j++)
+                for (k=0; k<2; k++)
+                    buf12[i][j][k]='z';
+    }
+
+    /*
+    buf12[6][2]= {"ab","cd","ef","gh","ij","kl"};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <string2D> and <string2D>
+    position        string2D of </g1> string2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          a                z
+    [ 0 0 ]          b                z
+    [ 0 1 ]          c                z
+    [ 0 1 ]          d                z
+    [ 1 0 ]          e                z
+    [ 1 0 ]          f                z
+    [ 1 1 ]          g                z
+    [ 1 1 ]          h                z
+    [ 2 0 ]          i                z
+    [ 2 0 ]          j                z
+    [ 2 1 ]          k                z
+    [ 2 1 ]          l                z
+    */
+
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, (size_t)STR_SIZE);
+    write_attr(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    for (i=0; i<3; i++)
+    {
+        for (j=0; j<2; j++)
+        {
+
+            buf12a[i][j]=buf12[i][j];
+        }
+    }
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_attr(loc_id,2,dims2,"VLstring2D",tid,buf12a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        memset(buf22,0,sizeof buf22);
+    }
+
+    /*
+    buf22[3][2]= {{1,2},{3,4},{5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <bitfield2D> and <bitfield2D>
+    position        bitfield2D of </g1> bitfield2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    /*
+    buf22[3][2]= {{1,2},{3,4},{5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <opaque2D> and <opaque2D>
+    position        opaque2D of </g1> opaque2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        memset(buf32,0,sizeof buf32);
+    }
+
+    /*
+    buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <opaque2D> and <opaque2D>
+    position        opaque2D of </g1> opaque2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 3; i++) {
+            for (j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    for (i=0; i<3; i++)
+    {
+        for (j=0; j<2; j++)
+        {
+            if (make_diffs) buf452[i][j]=GREEN; else buf452[i][j]=RED;
+        }
+    }
+
+    /*
+    Attribute:   <enum2D> and <enum2D>
+    position        enum2D of </g1> enum2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          RED              GREEN
+    [ 0 1 ]          RED              GREEN
+    [ 1 0 ]          RED              GREEN
+    [ 1 1 ]          RED              GREEN
+    [ 2 0 ]          RED              GREEN
+    [ 2 1 ]          RED              GREEN
+    */
+
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,2,dims2,"enum2D",tid,buf452);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                if(make_diffs)
+                    ((int *)buf52[i][j].p)[l] = 0;
+                else
+                    ((int *)buf52[i][j].p)[l] = n++;
+        }
+    }
+
+    /*
+    position        vlen2D of </g1> vlen2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 1 ]          1               0               1
+    [ 1 0 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 1 1 ]          5               0               5
+    [ 2 0 ]          6               0               6
+    [ 2 0 ]          7               0               7
+    [ 2 0 ]          8               0               8
+    [ 2 1 ]          9               0               9
+    [ 2 1 ]          10              0               10
+    [ 2 1 ]          11              0               11
+    */
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf52);
+    assert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    assert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        memset(buf62,0,sizeof buf62);
+    }
+    /*
+    buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <array2D> and <array2D>
+    position        array2D of </g1> array2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 0 ]          2               0               2
+    [ 0 0 ]          3               0               3
+    [ 0 1 ]          4               0               4
+    [ 0 1 ]          5               0               5
+    [ 0 1 ]          6               0               6
+    [ 1 0 ]          7               0               7
+    [ 1 0 ]          8               0               8
+    [ 1 0 ]          9               0               9
+    [ 1 1 ]          10              0               10
+    [ 1 1 ]          11              0               11
+    [ 1 1 ]          12              0               12
+    [ 2 0 ]          13              0               13
+    [ 2 0 ]          14              0               14
+    [ 2 0 ]          15              0               15
+    [ 2 1 ]          16              0               16
+    [ 2 1 ]          17              0               17
+    [ 2 1 ]          18              0               18
+    */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        memset(buf72,0,sizeof buf72);
+        memset(buf82,0,sizeof buf82);
+    }
+    /*
+    Attribute:   <integer2D> and <integer2D>
+    position        integer2D of </g1> integer2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    6 differences found
+    Attribute:   <float2D> and <float2D>
+    position        float2D of </g1> float2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+    write_attr(loc_id,2,dims2,"integer2D",H5T_NATIVE_INT,buf72);
+    write_attr(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
+
+
+    /*-------------------------------------------------------------------------
+    * 3D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<4; i++)
+            for (j=0; j<3; j++)
+                for (k=0; k<2; k++)
+                    for (l=0; l<2; l++)
+                        buf13[i][j][k][l]='z';
+    }
+
+    /*
+    buf13[24][2]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+    "rs","tu","vw","xz","AB","CD","EF","GH",
+    "IJ","KL","MN","PQ","RS","TU","VW","XZ"};
+
+    Attribute:   <string3D> and <string3D>
+    position        string3D of </g1> string3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          a                z
+    [ 0 0 0 ]          b                z
+    [ 0 0 1 ]          c                z
+    [ 0 0 1 ]          d                z
+    [ 0 1 0 ]          e                z
+    [ 0 1 0 ]          f                z
+    [ 0 1 1 ]          g                z
+    [ 0 1 1 ]          h                z
+    [ 0 2 0 ]          i                z
+    [ 0 2 0 ]          j                z
+    [ 0 2 1 ]          k                z
+    [ 0 2 1 ]          l                z
+    [ 1 0 0 ]          m                z
+    [ 1 0 0 ]          n                z
+    [ 1 0 1 ]          p                z
+    [ 1 0 1 ]          q                z
+    [ 1 1 0 ]          r                z
+    [ 1 1 0 ]          s                z
+    [ 1 1 1 ]          t                z
+    [ 1 1 1 ]          u                z
+    [ 1 2 0 ]          v                z
+    [ 1 2 0 ]          w                z
+    [ 1 2 1 ]          x                z
+    [ 2 0 0 ]          A                z
+    [ 2 0 0 ]          B                z
+    [ 2 0 1 ]          C                z
+    [ 2 0 1 ]          D                z
+    [ 2 1 0 ]          E                z
+    [ 2 1 0 ]          F                z
+    [ 2 1 1 ]          G                z
+    [ 2 1 1 ]          H                z
+    [ 2 2 0 ]          I                z
+    [ 2 2 0 ]          J                z
+    [ 2 2 1 ]          K                z
+    [ 2 2 1 ]          L                z
+    [ 3 0 0 ]          M                z
+    [ 3 0 0 ]          N                z
+    [ 3 0 1 ]          P                z
+    [ 3 0 1 ]          Q                z
+    [ 3 1 0 ]          R                z
+    [ 3 1 0 ]          S                z
+    [ 3 1 1 ]          T                z
+    [ 3 1 1 ]          U                z
+    [ 3 2 0 ]          V                z
+    [ 3 2 0 ]          W                z
+    [ 3 2 1 ]          X                z
+    [ 3 2 1 ]          Z                z
+    */
+
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, (size_t)STR_SIZE);
+    write_attr(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    for (i=0; i<4; i++)
+    {
+        for (j=0; j<3; j++)
+        {
+            for (k=0; k<2; k++)
+            {
+                buf13a[i][j][k]=buf13[i][j][k];
+            }
+        }
+    }
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_attr(loc_id,3,dims3,"VLstring3D",tid,buf13a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if(make_diffs)
+                    buf23[i][j][k] = 0;
+                else
+                    buf23[i][j][k] = (char)n++;
+            }
+        }
+    }
+
+    /*
+    position        bitfield3D of </g1> bitfield3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 1 ]          2               0               2
+    [ 0 1 0 ]          3               0               3
+    [ 0 1 1 ]          4               0               4
+    [ 0 2 0 ]          5               0               5
+    [ 0 2 1 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 1 0 ]          9               0               9
+    [ 1 1 1 ]          10              0               10
+    [ 1 2 0 ]          11              0               11
+    [ 1 2 1 ]          12              0               12
+    [ 2 0 0 ]          13              0               13
+    [ 2 0 1 ]          14              0               14
+    [ 2 1 0 ]          15              0               15
+    [ 2 1 1 ]          16              0               16
+    [ 2 2 0 ]          17              0               17
+    [ 2 2 1 ]          18              0               18
+    [ 3 0 0 ]          19              0               19
+    [ 3 0 1 ]          20              0               20
+    [ 3 1 0 ]          21              0               21
+    [ 3 1 1 ]          22              0               22
+    [ 3 2 0 ]          23              0               23
+    [ 3 2 1 ]          24              0               24
+    */
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) {
+                    buf33[i][j][k].a = 0;
+                    buf33[i][j][k].b = 0.0F;
+                }
+                else {
+                    buf33[i][j][k].a = (char)n++;
+                    buf33[i][j][k].b = n++;
+                }
+            }
+        }
+    }
+    /*position        compound3D of </g1> compound3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 0 ]          2               0               2
+    [ 0 0 1 ]          3               0               3
+    [ 0 0 1 ]          4               0               4
+    [ 0 1 0 ]          5               0               5
+    [ 0 1 0 ]          6               0               6
+    [ 0 1 1 ]          7               0               7
+    [ 0 1 1 ]          8               0               8
+    [ 0 2 0 ]          9               0               9
+    [ 0 2 0 ]          10              0               10
+    [ 0 2 1 ]          11              0               11
+    [ 0 2 1 ]          12              0               12
+    [ 1 0 0 ]          13              0               13
+    [ 1 0 0 ]          14              0               14
+    [ 1 0 1 ]          15              0               15
+    [ 1 0 1 ]          16              0               16
+    [ 1 1 0 ]          17              0               17
+    [ 1 1 0 ]          18              0               18
+    [ 1 1 1 ]          19              0               19
+    [ 1 1 1 ]          20              0               20
+    [ 1 2 0 ]          21              0               21
+    [ 1 2 0 ]          22              0               22
+    [ 1 2 1 ]          23              0               23
+    [ 1 2 1 ]          24              0               24
+    [ 2 0 0 ]          25              0               25
+    [ 2 0 0 ]          26              0               26
+    [ 2 0 1 ]          27              0               27
+    [ 2 0 1 ]          28              0               28
+    [ 2 1 0 ]          29              0               29
+    [ 2 1 0 ]          30              0               30
+    [ 2 1 1 ]          31              0               31
+    [ 2 1 1 ]          32              0               32
+    [ 2 2 0 ]          33              0               33
+    [ 2 2 0 ]          34              0               34
+    [ 2 2 1 ]          35              0               35
+    [ 2 2 1 ]          36              0               36
+    [ 3 0 0 ]          37              0               37
+    [ 3 0 0 ]          38              0               38
+    [ 3 0 1 ]          39              0               39
+    [ 3 0 1 ]          40              0               40
+    [ 3 1 0 ]          41              0               41
+    [ 3 1 0 ]          42              0               42
+    [ 3 1 1 ]          43              0               43
+    [ 3 1 1 ]          44              0               44
+    [ 3 2 0 ]          45              0               45
+    [ 3 2 0 ]          46              0               46
+    [ 3 2 1 ]          47              0               47
+    [ 3 2 1 ]          48              0               48
+    */
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 4; i++) {
+            for (j = 0; j < 3; j++) {
+                for (k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) buf453[i][j][k]=RED; else buf453[i][j][k]=GREEN;
+            }
+        }
+    }
+
+    /*
+    position        enum3D of </g1> enum3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          GREEN            RED
+    [ 0 0 1 ]          GREEN            RED
+    [ 0 1 0 ]          GREEN            RED
+    [ 0 1 1 ]          GREEN            RED
+    [ 0 2 0 ]          GREEN            RED
+    [ 0 2 1 ]          GREEN            RED
+    [ 1 0 0 ]          GREEN            RED
+    [ 1 0 1 ]          GREEN            RED
+    [ 1 1 0 ]          GREEN            RED
+    [ 1 1 1 ]          GREEN            RED
+    [ 1 2 0 ]          GREEN            RED
+    [ 1 2 1 ]          GREEN            RED
+    [ 2 0 0 ]          GREEN            RED
+    [ 2 0 1 ]          GREEN            RED
+    [ 2 1 0 ]          GREEN            RED
+    [ 2 1 1 ]          GREEN            RED
+    [ 2 2 0 ]          GREEN            RED
+    [ 2 2 1 ]          GREEN            RED
+    [ 3 0 0 ]          GREEN            RED
+    [ 3 0 1 ]          GREEN            RED
+    [ 3 1 0 ]          GREEN            RED
+    [ 3 1 1 ]          GREEN            RED
+    [ 3 2 0 ]          GREEN            RED
+    [ 3 2 1 ]          GREEN            RED
+    */
+
+
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,3,dims3,"enum3D",tid,buf453);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                buf53[i][j][k].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for (l = 0; l < i + 1; l++)
+                    if(make_diffs)
+                        ((int *)buf53[i][j][k].p)[l] = 0;
+                    else
+                        ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+        }
+    }
+    /*
+    position        vlen3D of </g1> vlen3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 1 ]          1               0               1
+    [ 0 1 0 ]          2               0               2
+    [ 0 1 1 ]          3               0               3
+    [ 0 2 0 ]          4               0               4
+    [ 0 2 1 ]          5               0               5
+    [ 1 0 0 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 0 1 ]          9               0               9
+    [ 1 1 0 ]          10              0               10
+    etc
+    */
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf53);
+    assert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    assert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+    n=1;
+    for (i = 0; i < 24; i++) {
+        for (j = 0; j < (int)dimarray[0]; j++) {
+            if (make_diffs) buf63[i][j]=0;
+            else buf63[i][j]=n++;
+        }
+    }
+    /*
+    position        array3D of </g1> array3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 0 ]          2               0               2
+    [ 0 0 0 ]          3               0               3
+    [ 0 0 1 ]          4               0               4
+    [ 0 0 1 ]          5               0               5
+    [ 0 0 1 ]          6               0               6
+    [ 0 1 0 ]          7               0               7
+    etc
+    */
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    n=1; f=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) {
+                    buf73[i][j][k]=0;
+                    buf83[i][j][k]=0.0F;
+                }
+                else {
+                    buf73[i][j][k]=n++;
+                    buf83[i][j][k]=f++;
+                }
+            }
+        }
+    }
+
+    /*
+    position        integer3D of </g1> integer3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 1 ]          2               0               2
+    [ 0 1 0 ]          3               0               3
+    [ 0 1 1 ]          4               0               4
+    [ 0 2 0 ]          5               0               5
+    [ 0 2 1 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 1 0 ]          9               0               9
+    [ 1 1 1 ]          10              0               10
+    etc
+    */
+    write_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+
+
+/*-------------------------------------------------------------------------
+* Function: write_dset_in
+*
+* Purpose: write datasets in LOC_ID
+*
+*-------------------------------------------------------------------------
+*/
+static
+void write_dset_in(hid_t loc_id,
+                   const char* dset_name, /* for saving reference to dataset*/
+                   hid_t fid,
+                   int make_diffs /* flag to modify data buffers */)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+        char   a;
+        double b;
+    } s_t;
+
+    typedef enum
+    {
+        RED,
+        GREEN
+    } e_t;
+
+    hid_t   did;
+    hid_t   sid;
+    hid_t   tid;
+    hid_t   dcpl;
+    herr_t  status;
+    int     val, i, j, k, l, n;
+    float   f;
+    int     fillvalue=2;
+    int     scalar_data = 2;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][STR_SIZE]= {"ab","de"}; /* string */
+    char       *buf1a[2];                      /* VL string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2.0F},{3,4.0F}};   /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    e_t        buf45[2]= {RED,GREEN};          /* enum */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1.0F,2.0F};           /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[3][2][STR_SIZE]= {{"ab","cd"},{"ef","gh"},{"ij","kl"}};     /* string */
+    char       *buf12a[3][2];                                        /* VL string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2.0F},{3,4.0F},{5,6.0F},{7,8.0F},{9,10.0F},{11,12.0F}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1.0F,2.0F},{3.0F,4.0F},{5.0F,6.0F}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[4][3][2][STR_SIZE]= {{{"ab","cd"},{"ef","gh"},{"ij","kl"}},
+    {{"mn","pq"},{"rs","tu"},{"vw","xz"}},
+    {{"AB","CD"},{"EF","GH"},{"IJ","KL"}},
+    {{"MN","PQ"},{"RS","TU"},{"VW","XZ"}}};  /* string */
+    char       *buf13a[4][3][2];  /* VL string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+    * H5S_SCALAR
+    *-------------------------------------------------------------------------
+    */
+
+
+
+    if ( make_diffs )
+    {
+
+        scalar_data = 1;
+    }
+
+    /* create a space  */
+    sid = H5Screate(H5S_SCALAR);
+
+    /* create a dataset */
+    did = H5Dcreate2(loc_id, "scalar", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* write */
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &scalar_data);
+
+    /* close */
+    H5Dclose(did);
+    H5Sclose(sid);
+
+
+    /*-------------------------------------------------------------------------
+    * 1D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            for (j=0; j<2; j++)
+                buf1[i][j]='z';
+    }
+
+
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid,(size_t)STR_SIZE);
+    write_dset(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    for (i=0; i<2; i++)
+    {
+        buf1a[i]=buf1[i];
+    }
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_dset(loc_id,1,dims,"VLstring",tid,buf1a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            buf2[i]=buf2[1]=0;
+    }
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf3[i].a=0; buf3[i].b=0;
+        }
+    }
+
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf45[i]=GREEN;
+        }
+    }
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference)
+    *-------------------------------------------------------------------------
+    */
+
+    gen_datareg(fid,make_diffs);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,1,dims,"enum",tid,buf45);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf5[1].p)[0]=2;
+    ((int *)buf5[1].p)[1]=3;
+
+    if(make_diffs) {
+        ((int *)buf5[0].p)[0] = 0;
+        ((int *)buf5[1].p)[0] = 0;
+        ((int *)buf5[1].p)[1]=0;
+    }
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            for (j=0; j<3; j++)
+            {
+                buf6[i][j]=0;
+            }
+    }
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    {
+        double  *dbuf;                           /* information to write */
+        hid_t   ldid;                            /* dataset ID   */
+        hid_t   lsid;                            /* dataspace ID   */
+        hid_t   ltid;                            /* datatype ID   */
+        size_t  size;
+        hsize_t sdims[] = {1};
+        hsize_t tdims[] = {H5TOOLS_MALLOCSIZE / sizeof(double) + 1};
+        size_t  jj;
+
+        /* allocate and initialize array data to write */
+        size = ( H5TOOLS_MALLOCSIZE / sizeof(double) + 1 ) * sizeof(double);
+        dbuf = (double *)HDmalloc(size);
+
+        for(jj = 0; jj < (H5TOOLS_MALLOCSIZE / sizeof(double) + 1); jj++)
+            dbuf[jj] = (double)jj;
+
+        if (make_diffs)
+        {
+            dbuf[5] = 0;
+            dbuf[6] = 0;
+        }
+
+        /* create a type larger than H5TOOLS_MALLOCSIZE */
+        ltid = H5Tarray_create2(H5T_NATIVE_DOUBLE, 1, tdims);
+        size = H5Tget_size(ltid);
+        lsid = H5Screate_simple(1, sdims, NULL);
+        ldid = H5Dcreate2(loc_id, "arrayd", ltid, lsid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+#if defined(WRITE_ARRAY)
+        H5Dwrite(ldid, ltid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+#endif
+
+        /* close */
+        H5Dclose(ldid);
+        H5Tclose(ltid);
+        H5Sclose(lsid);
+        HDfree(dbuf);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf7[i]=0;
+            buf8[i]=0;
+        }
+    }
+
+    write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
+    write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+
+
+    /*-------------------------------------------------------------------------
+    * 2D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<3; i++)
+            for (j=0; j<2; j++)
+                for (k=0; k<2; k++)
+                    buf12[i][j][k]='z';
+    }
+
+
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid,(size_t)STR_SIZE);
+    write_dset(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    for (i=0; i<3; i++)
+    {
+        for (j=0; j<2; j++)
+        {
+            buf12a[i][j]=buf12[i][j];
+        }
+    }
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_dset(loc_id,2,dims2,"VLstring2D",tid,buf12a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+
+    if (make_diffs)
+    {
+        memset(buf22,0,sizeof buf22);
+    }
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        memset(buf32,0,sizeof buf32);
+    }
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 3; i++) {
+            for (j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,2,dims2,"enum2D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++) {
+                if(make_diffs)
+                    ((int *)buf52[i][j].p)[l] = 0;
+                else
+                    ((int *)buf52[i][j].p)[l] = n++;
+            }
+        }
+    }
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52);
+    assert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    assert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        memset(buf62,0,sizeof buf62);
+    }
+
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER, write a fill value
+    *-------------------------------------------------------------------------
+    */
+
+
+    if (make_diffs)
+    {
+        memset(buf72, 0, sizeof buf72);
+        memset(buf82, 0, sizeof buf82);
+    }
+
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue);
+    sid = H5Screate_simple(2, dims2, NULL);
+    did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72);
+    status = H5Pclose(dcpl);
+    status = H5Dclose(did);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
+
+
+    /*-------------------------------------------------------------------------
+    * 3D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<4; i++)
+            for (j=0; j<3; j++)
+                for (k=0; k<2; k++)
+                    for (l=0; l<2; l++)
+                        buf13[i][j][k][l]='z';
+    }
+
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid,(size_t)STR_SIZE);
+    write_dset(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    for (i=0; i<4; i++)
+    {
+        for (j=0; j<3; j++)
+        {
+            for (k=0; k<2; k++)
+            {
+                buf13a[i][j][k]=buf13[i][j][k];
+            }
+        }
+    }
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, H5T_VARIABLE);
+    write_dset(loc_id,3,dims3,"VLstring3D",tid,buf13a);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+
+    n=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if(make_diffs)
+                    buf23[i][j][k] = 0;
+                else
+                    buf23[i][j][k] = (char)n++;
+            }
+        }
+    }
+
+
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    tid = H5Tcreate(H5T_OPAQUE, (size_t)1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) {
+                    buf33[i][j][k].a = 0;
+                    buf33[i][j][k].b = 0.0F;
+                }
+                else {
+                    buf33[i][j][k].a = (char)n++;
+                    buf33[i][j][k].b = n++;
+                }
+            }
+        }
+    }
+
+
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE (H5R_OBJECT object reference)
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 4; i++) {
+            for (j = 0; j < 3; j++) {
+                for (k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,3,dims3,"enum3D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf53[i][j][k].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++) {
+                    if(make_diffs)
+                        ((int *)buf53[i][j][k].p)[l] = 0;
+                    else
+                        ((int *)buf53[i][j][k].p)[l] = n++;
+                }
+            }
+        }
+    }
+
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53);
+    assert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    assert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+
+    n=1;
+    for (i = 0; i < 24; i++) {
+        for (j = 0; j < (int)dimarray[0]; j++) {
+            if (make_diffs) buf63[i][j]=0;
+            else buf63[i][j]=n++;
+        }
+    }
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    n=1; f=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) {
+                    buf73[i][j][k]=0;
+                    buf83[i][j][k]=0.0F;
+                }
+                else {
+                    buf73[i][j][k]=n++;
+                    buf83[i][j][k]=f++;
+                }
+            }
+        }
+    }
+    write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+/*-------------------------------------------------------------------------
+* Function: gen_datareg
+*
+* Purpose: generate a dataset region and its reference
+*
+* Date: April 19, 2006
+*
+*-------------------------------------------------------------------------
+*/
+
+static
+void gen_datareg(hid_t fid,
+                 int make_diffs /* flag to modify data buffers */)
+{
+    /* data dataset */
+    hid_t           did1;              /* dataset ID   */
+    hid_t           sid1;              /* dataspace ID  */
+    hsize_t         dims1[2] = {10,10};/* dimensions */
+    int             *buf;              /* dataset buffer */
+    /* reference dataset */
+    hid_t           did2;              /* dataset ID   */
+    hid_t           sid2;              /* dataspace ID  */
+    hsize_t         dims2[] = {2};     /* 2 references */
+    hdset_reg_ref_t *rbuf;             /* buffer for write the references  */
+    hsize_t         start[10];         /* starting location of hyperslab */
+    hsize_t         count[10];         /* element count of hyperslab */
+    hsize_t         coord[5][2];       /* coordinates for point selection */
+    herr_t          status;
+    int             i;
+
+    /* allocate the buffer for write the references */
+    rbuf = (hdset_reg_ref_t *)HDcalloc((size_t)2, sizeof(hdset_reg_ref_t));
+
+    /* allocate the buffer for write the data dataset */
+    buf = (int *)HDmalloc(10 * 10 * sizeof(int));
+
+    for(i = 0; i < 10 * 10; i++)
+        buf[i] = i;
+
+    /* create the data dataset */
+    sid1   = H5Screate_simple(2, dims1, NULL);
+    did1   = H5Dcreate2(fid, "dsetref", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    HDassert(status >= 0);
+
+    /* create the reference dataset */
+    sid2   = H5Screate_simple(1, dims2, NULL);
+    did2   = H5Dcreate2(fid, "refreg", H5T_STD_REF_DSETREG, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create the references */
+    /* select hyperslab for first reference */
+
+    start[0] = 2; start[1] = 2;
+    count[0] = 6; count[1] = 6;
+    if(make_diffs) {
+        start[0] = 0; start[1] = 0;
+        count[0] = 3; count[1] = 3;
+    }
+
+    status = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL);
+    HDassert(status >= 0);
+    H5Sget_select_npoints(sid1);
+
+    /* store first dataset region */
+    status = H5Rcreate(&rbuf[0], fid, "dsetref", H5R_DATASET_REGION, sid1);
+    HDassert(status >= 0);
+
+    /* select sequence of five points for second reference */
+    coord[0][0]=6; coord[0][1]=9;
+    coord[1][0]=2; coord[1][1]=2;
+    coord[2][0]=8; coord[2][1]=4;
+    coord[3][0]=1; coord[3][1]=6;
+    coord[4][0]=2; coord[4][1]=8;
+    if (make_diffs)
+    {
+        coord[1][0]=3; coord[1][1]=3;
+        coord[3][0]=2; coord[3][1]=5;
+        coord[4][0]=1; coord[4][1]=7;
+    }
+    H5Sselect_elements(sid1,H5S_SELECT_SET,(size_t)5,(const hsize_t *)coord);
+    H5Sget_select_npoints(sid1);
+
+    /* store second dataset region */
+    H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1);
+
+    /* write */
+    status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf);
+    HDassert(status >= 0);
+
+    /* close, free memory buffers */
+    status = H5Dclose(did1);
+    HDassert(status >= 0);
+    status = H5Sclose(sid1);
+    HDassert(status >= 0);
+    status = H5Dclose(did2);
+    HDassert(status >= 0);
+    status = H5Sclose(sid2);
+    HDassert(status >= 0);
+
+    HDfree(rbuf);
+    HDfree(buf);
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: test_hyperslab
+*
+* Purpose: test diff by hyperslabs. create a dataset with 1GB dimensions
+*  by iterating trough 1KB hyperslabs
+*
+*-------------------------------------------------------------------------
+*/
+static
+int test_hyperslab(const char *fname,
+                   int make_diffs /* flag to modify data buffers */)
+{
+    hid_t   did=-1;
+    hid_t   fid=-1;
+    hid_t   f_sid=-1;
+    hid_t   m_sid=-1;
+    hid_t   tid=-1;
+    hid_t   dcpl=-1;
+    hsize_t dims[1]={GBLL};                  /* dataset dimensions */
+    hsize_t hs_size[1]={GBLL/(1024*1024)};   /* hyperslab dimensions */
+    hsize_t chunk_dims[1]={GBLL/1024};       /* chunk dimensions */
+    hsize_t hs_start[1];
+    size_t  size;
+    size_t  nelmts=(size_t)GBLL/(1024*1024); /* elements in each hyperslab */
+    char    fillvalue=-1;
+    char    *buf=NULL;
+    int     i, j, s;
+    char    c;
+
+    /* create */
+    fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_CHAR, &fillvalue) < 0)
+        goto out;
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        goto out;
+    if((f_sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if((did = H5Dcreate2(fid, "big", H5T_NATIVE_CHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
+        goto out;
+    if((tid = H5Dget_type(did)) < 0)
+        goto out;
+    if((size = H5Tget_size(tid)) <= 0)
+        goto out;
+
+    /* create a evenly divided buffer from 0 to 127  */
+    buf = (char *)HDmalloc((size_t)(nelmts * size));
+    s = 1024 * 1024 / 127;
+    for(i = 0, j = 0, c = 0; i < 1024 * 1024; j++, i++) {
+        if(j == s) {
+            c++;
+            j = 0;
+        }
+
+        /* set the hyperslab values */
+        HDmemset(buf, c, nelmts);
+
+        /* make a different hyperslab at this position */
+        if(make_diffs && i == 512 * 512)
+            HDmemset(buf, 0, nelmts);
+
+        hs_start[0] = (unsigned long long)i * GBLL / (1024 * 1024);
+        if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL) < 0)
+            goto out;
+
+        /* write only one hyperslab */
+        if ( i==512*512)
+        {
+            if (H5Dwrite (did,H5T_NATIVE_CHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
+                goto out;
+        }
+
+    }
+    HDfree(buf);
+    buf=NULL;
+
+    /* close */
+    if(H5Sclose(f_sid) < 0)
+        goto out;
+    if(H5Sclose(m_sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+    H5Fclose(fid);
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(f_sid);
+        H5Sclose(m_sid);
+        H5Dclose(did);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: write_attr
+*
+* Purpose: utility function to write an attribute in LOC_ID
+*
+*-------------------------------------------------------------------------
+*/
+static
+int write_attr(hid_t loc_id,
+               int rank,
+               hsize_t *dims,
+               const char *name,
+               hid_t tid,
+               void *buf)
+{
+    hid_t   aid=-1;
+    hid_t   sid=-1;
+
+    /* create a space  */
+    if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
+        goto out;
+
+    /* create the attribute */
+    if((aid = H5Acreate2(loc_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* write */
+    if(buf)
+    {
+        if(H5Awrite(aid, tid, buf) < 0)
+            goto out;
+    }
+
+    /* close */
+    H5Aclose(aid);
+    H5Sclose(sid);
+
+    return SUCCEED;
+
+out:
+
+    H5Aclose(aid);
+    H5Sclose(sid);
+    return FAIL;
+}
+
+/*-------------------------------------------------------------------------
+* Function: write_dset
+*
+* Purpose: utility function to create and write a dataset in LOC_ID
+*
+*-------------------------------------------------------------------------
+*/
+static
+int write_dset( hid_t loc_id,
+               int rank,
+               hsize_t *dims,
+               const char *name,
+               hid_t tid,
+               void *buf )
+{
+    hid_t   did=-1;
+    hid_t   sid=-1;
+
+    /* create a space  */
+    if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
+        goto out;
+
+    /* create the dataset */
+    if((did = H5Dcreate2(loc_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* write */
+    if(buf)
+    {
+        if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+            goto out;
+    }
+
+    /* close */
+    H5Dclose(did);
+    H5Sclose(sid);
+
+    return SUCCEED;
+
+out:
+
+    H5Dclose(did);
+    H5Sclose(sid);
+    return FAIL;
+}
+
diff --git a/tools/h5diff/testfiles/compounds_array_vlen1.h5 b/tools/test/h5diff/testfiles/compounds_array_vlen1.h5
similarity index 100%
rename from tools/h5diff/testfiles/compounds_array_vlen1.h5
rename to tools/test/h5diff/testfiles/compounds_array_vlen1.h5
diff --git a/tools/h5diff/testfiles/compounds_array_vlen2.h5 b/tools/test/h5diff/testfiles/compounds_array_vlen2.h5
similarity index 100%
rename from tools/h5diff/testfiles/compounds_array_vlen2.h5
rename to tools/test/h5diff/testfiles/compounds_array_vlen2.h5
diff --git a/tools/test/h5diff/testfiles/diff_strings1.h5 b/tools/test/h5diff/testfiles/diff_strings1.h5
new file mode 100644
index 0000000..8839f5a
Binary files /dev/null and b/tools/test/h5diff/testfiles/diff_strings1.h5 differ
diff --git a/tools/test/h5diff/testfiles/diff_strings2.h5 b/tools/test/h5diff/testfiles/diff_strings2.h5
new file mode 100644
index 0000000..810278c
Binary files /dev/null and b/tools/test/h5diff/testfiles/diff_strings2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/test/h5diff/testfiles/h5diff_10.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_10.txt
rename to tools/test/h5diff/testfiles/h5diff_10.txt
diff --git a/tools/h5diff/testfiles/h5diff_100.txt b/tools/test/h5diff/testfiles/h5diff_100.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_100.txt
rename to tools/test/h5diff/testfiles/h5diff_100.txt
diff --git a/tools/h5diff/testfiles/h5diff_101.txt b/tools/test/h5diff/testfiles/h5diff_101.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_101.txt
rename to tools/test/h5diff/testfiles/h5diff_101.txt
diff --git a/tools/h5diff/testfiles/h5diff_101w.txt b/tools/test/h5diff/testfiles/h5diff_101w.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_101w.txt
rename to tools/test/h5diff/testfiles/h5diff_101w.txt
diff --git a/tools/h5diff/testfiles/h5diff_102.txt b/tools/test/h5diff/testfiles/h5diff_102.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_102.txt
rename to tools/test/h5diff/testfiles/h5diff_102.txt
diff --git a/tools/h5diff/testfiles/h5diff_102w.txt b/tools/test/h5diff/testfiles/h5diff_102w.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_102w.txt
rename to tools/test/h5diff/testfiles/h5diff_102w.txt
diff --git a/tools/h5diff/testfiles/h5diff_103.txt b/tools/test/h5diff/testfiles/h5diff_103.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_103.txt
rename to tools/test/h5diff/testfiles/h5diff_103.txt
diff --git a/tools/h5diff/testfiles/h5diff_103w.txt b/tools/test/h5diff/testfiles/h5diff_103w.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_103w.txt
rename to tools/test/h5diff/testfiles/h5diff_103w.txt
diff --git a/tools/h5diff/testfiles/h5diff_104.txt b/tools/test/h5diff/testfiles/h5diff_104.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_104.txt
rename to tools/test/h5diff/testfiles/h5diff_104.txt
diff --git a/tools/h5diff/testfiles/h5diff_104w.txt b/tools/test/h5diff/testfiles/h5diff_104w.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_104w.txt
rename to tools/test/h5diff/testfiles/h5diff_104w.txt
diff --git a/tools/h5diff/testfiles/h5diff_11.txt b/tools/test/h5diff/testfiles/h5diff_11.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_11.txt
rename to tools/test/h5diff/testfiles/h5diff_11.txt
diff --git a/tools/h5diff/testfiles/h5diff_12.txt b/tools/test/h5diff/testfiles/h5diff_12.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_12.txt
rename to tools/test/h5diff/testfiles/h5diff_12.txt
diff --git a/tools/h5diff/testfiles/h5diff_13.txt b/tools/test/h5diff/testfiles/h5diff_13.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_13.txt
rename to tools/test/h5diff/testfiles/h5diff_13.txt
diff --git a/tools/h5diff/testfiles/h5diff_14.txt b/tools/test/h5diff/testfiles/h5diff_14.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_14.txt
rename to tools/test/h5diff/testfiles/h5diff_14.txt
diff --git a/tools/h5diff/testfiles/h5diff_15.txt b/tools/test/h5diff/testfiles/h5diff_15.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_15.txt
rename to tools/test/h5diff/testfiles/h5diff_15.txt
diff --git a/tools/h5diff/testfiles/h5diff_16_1.txt b/tools/test/h5diff/testfiles/h5diff_16_1.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_16_1.txt
rename to tools/test/h5diff/testfiles/h5diff_16_1.txt
diff --git a/tools/h5diff/testfiles/h5diff_16_2.txt b/tools/test/h5diff/testfiles/h5diff_16_2.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_16_2.txt
rename to tools/test/h5diff/testfiles/h5diff_16_2.txt
diff --git a/tools/h5diff/testfiles/h5diff_16_3.txt b/tools/test/h5diff/testfiles/h5diff_16_3.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_16_3.txt
rename to tools/test/h5diff/testfiles/h5diff_16_3.txt
diff --git a/tools/h5diff/testfiles/h5diff_17.txt b/tools/test/h5diff/testfiles/h5diff_17.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_17.txt
rename to tools/test/h5diff/testfiles/h5diff_17.txt
diff --git a/tools/h5diff/testfiles/h5diff_171.txt b/tools/test/h5diff/testfiles/h5diff_171.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_171.txt
rename to tools/test/h5diff/testfiles/h5diff_171.txt
diff --git a/tools/h5diff/testfiles/h5diff_172.txt b/tools/test/h5diff/testfiles/h5diff_172.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_172.txt
rename to tools/test/h5diff/testfiles/h5diff_172.txt
diff --git a/tools/h5diff/testfiles/h5diff_18.txt b/tools/test/h5diff/testfiles/h5diff_18.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_18.txt
rename to tools/test/h5diff/testfiles/h5diff_18.txt
diff --git a/tools/h5diff/testfiles/h5diff_18_1.txt b/tools/test/h5diff/testfiles/h5diff_18_1.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_18_1.txt
rename to tools/test/h5diff/testfiles/h5diff_18_1.txt
diff --git a/tools/h5diff/testfiles/h5diff_19.txt b/tools/test/h5diff/testfiles/h5diff_19.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_19.txt
rename to tools/test/h5diff/testfiles/h5diff_19.txt
diff --git a/tools/h5diff/testfiles/h5diff_20.txt b/tools/test/h5diff/testfiles/h5diff_20.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_20.txt
rename to tools/test/h5diff/testfiles/h5diff_20.txt
diff --git a/tools/h5diff/testfiles/h5diff_200.txt b/tools/test/h5diff/testfiles/h5diff_200.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_200.txt
rename to tools/test/h5diff/testfiles/h5diff_200.txt
diff --git a/tools/h5diff/testfiles/h5diff_201.txt b/tools/test/h5diff/testfiles/h5diff_201.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_201.txt
rename to tools/test/h5diff/testfiles/h5diff_201.txt
diff --git a/tools/h5diff/testfiles/h5diff_202.txt b/tools/test/h5diff/testfiles/h5diff_202.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_202.txt
rename to tools/test/h5diff/testfiles/h5diff_202.txt
diff --git a/tools/h5diff/testfiles/h5diff_203.txt b/tools/test/h5diff/testfiles/h5diff_203.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_203.txt
rename to tools/test/h5diff/testfiles/h5diff_203.txt
diff --git a/tools/h5diff/testfiles/h5diff_204.txt b/tools/test/h5diff/testfiles/h5diff_204.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_204.txt
rename to tools/test/h5diff/testfiles/h5diff_204.txt
diff --git a/tools/h5diff/testfiles/h5diff_205.txt b/tools/test/h5diff/testfiles/h5diff_205.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_205.txt
rename to tools/test/h5diff/testfiles/h5diff_205.txt
diff --git a/tools/h5diff/testfiles/h5diff_206.txt b/tools/test/h5diff/testfiles/h5diff_206.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_206.txt
rename to tools/test/h5diff/testfiles/h5diff_206.txt
diff --git a/tools/h5diff/testfiles/h5diff_207.txt b/tools/test/h5diff/testfiles/h5diff_207.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_207.txt
rename to tools/test/h5diff/testfiles/h5diff_207.txt
diff --git a/tools/h5diff/testfiles/h5diff_208.txt b/tools/test/h5diff/testfiles/h5diff_208.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_208.txt
rename to tools/test/h5diff/testfiles/h5diff_208.txt
diff --git a/tools/h5diff/testfiles/h5diff_21.txt b/tools/test/h5diff/testfiles/h5diff_21.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_21.txt
rename to tools/test/h5diff/testfiles/h5diff_21.txt
diff --git a/tools/h5diff/testfiles/h5diff_22.txt b/tools/test/h5diff/testfiles/h5diff_22.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_22.txt
rename to tools/test/h5diff/testfiles/h5diff_22.txt
diff --git a/tools/h5diff/testfiles/h5diff_220.txt b/tools/test/h5diff/testfiles/h5diff_220.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_220.txt
rename to tools/test/h5diff/testfiles/h5diff_220.txt
diff --git a/tools/h5diff/testfiles/h5diff_221.txt b/tools/test/h5diff/testfiles/h5diff_221.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_221.txt
rename to tools/test/h5diff/testfiles/h5diff_221.txt
diff --git a/tools/h5diff/testfiles/h5diff_222.txt b/tools/test/h5diff/testfiles/h5diff_222.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_222.txt
rename to tools/test/h5diff/testfiles/h5diff_222.txt
diff --git a/tools/h5diff/testfiles/h5diff_223.txt b/tools/test/h5diff/testfiles/h5diff_223.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_223.txt
rename to tools/test/h5diff/testfiles/h5diff_223.txt
diff --git a/tools/h5diff/testfiles/h5diff_224.txt b/tools/test/h5diff/testfiles/h5diff_224.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_224.txt
rename to tools/test/h5diff/testfiles/h5diff_224.txt
diff --git a/tools/h5diff/testfiles/h5diff_23.txt b/tools/test/h5diff/testfiles/h5diff_23.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_23.txt
rename to tools/test/h5diff/testfiles/h5diff_23.txt
diff --git a/tools/h5diff/testfiles/h5diff_24.txt b/tools/test/h5diff/testfiles/h5diff_24.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_24.txt
rename to tools/test/h5diff/testfiles/h5diff_24.txt
diff --git a/tools/h5diff/testfiles/h5diff_25.txt b/tools/test/h5diff/testfiles/h5diff_25.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_25.txt
rename to tools/test/h5diff/testfiles/h5diff_25.txt
diff --git a/tools/h5diff/testfiles/h5diff_26.txt b/tools/test/h5diff/testfiles/h5diff_26.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_26.txt
rename to tools/test/h5diff/testfiles/h5diff_26.txt
diff --git a/tools/h5diff/testfiles/h5diff_27.txt b/tools/test/h5diff/testfiles/h5diff_27.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_27.txt
rename to tools/test/h5diff/testfiles/h5diff_27.txt
diff --git a/tools/h5diff/testfiles/h5diff_28.txt b/tools/test/h5diff/testfiles/h5diff_28.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_28.txt
rename to tools/test/h5diff/testfiles/h5diff_28.txt
diff --git a/tools/h5diff/testfiles/h5diff_30.txt b/tools/test/h5diff/testfiles/h5diff_30.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_30.txt
rename to tools/test/h5diff/testfiles/h5diff_30.txt
diff --git a/tools/h5diff/testfiles/h5diff_300.txt b/tools/test/h5diff/testfiles/h5diff_300.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_300.txt
rename to tools/test/h5diff/testfiles/h5diff_300.txt
diff --git a/tools/h5diff/testfiles/h5diff_400.txt b/tools/test/h5diff/testfiles/h5diff_400.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_400.txt
rename to tools/test/h5diff/testfiles/h5diff_400.txt
diff --git a/tools/h5diff/testfiles/h5diff_401.txt b/tools/test/h5diff/testfiles/h5diff_401.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_401.txt
rename to tools/test/h5diff/testfiles/h5diff_401.txt
diff --git a/tools/h5diff/testfiles/h5diff_402.txt b/tools/test/h5diff/testfiles/h5diff_402.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_402.txt
rename to tools/test/h5diff/testfiles/h5diff_402.txt
diff --git a/tools/h5diff/testfiles/h5diff_403.txt b/tools/test/h5diff/testfiles/h5diff_403.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_403.txt
rename to tools/test/h5diff/testfiles/h5diff_403.txt
diff --git a/tools/h5diff/testfiles/h5diff_404.txt b/tools/test/h5diff/testfiles/h5diff_404.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_404.txt
rename to tools/test/h5diff/testfiles/h5diff_404.txt
diff --git a/tools/h5diff/testfiles/h5diff_405.txt b/tools/test/h5diff/testfiles/h5diff_405.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_405.txt
rename to tools/test/h5diff/testfiles/h5diff_405.txt
diff --git a/tools/h5diff/testfiles/h5diff_406.txt b/tools/test/h5diff/testfiles/h5diff_406.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_406.txt
rename to tools/test/h5diff/testfiles/h5diff_406.txt
diff --git a/tools/h5diff/testfiles/h5diff_407.txt b/tools/test/h5diff/testfiles/h5diff_407.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_407.txt
rename to tools/test/h5diff/testfiles/h5diff_407.txt
diff --git a/tools/h5diff/testfiles/h5diff_408.txt b/tools/test/h5diff/testfiles/h5diff_408.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_408.txt
rename to tools/test/h5diff/testfiles/h5diff_408.txt
diff --git a/tools/h5diff/testfiles/h5diff_409.txt b/tools/test/h5diff/testfiles/h5diff_409.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_409.txt
rename to tools/test/h5diff/testfiles/h5diff_409.txt
diff --git a/tools/h5diff/testfiles/h5diff_410.txt b/tools/test/h5diff/testfiles/h5diff_410.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_410.txt
rename to tools/test/h5diff/testfiles/h5diff_410.txt
diff --git a/tools/h5diff/testfiles/h5diff_411.txt b/tools/test/h5diff/testfiles/h5diff_411.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_411.txt
rename to tools/test/h5diff/testfiles/h5diff_411.txt
diff --git a/tools/h5diff/testfiles/h5diff_412.txt b/tools/test/h5diff/testfiles/h5diff_412.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_412.txt
rename to tools/test/h5diff/testfiles/h5diff_412.txt
diff --git a/tools/h5diff/testfiles/h5diff_413.txt b/tools/test/h5diff/testfiles/h5diff_413.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_413.txt
rename to tools/test/h5diff/testfiles/h5diff_413.txt
diff --git a/tools/h5diff/testfiles/h5diff_414.txt b/tools/test/h5diff/testfiles/h5diff_414.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_414.txt
rename to tools/test/h5diff/testfiles/h5diff_414.txt
diff --git a/tools/h5diff/testfiles/h5diff_415.txt b/tools/test/h5diff/testfiles/h5diff_415.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_415.txt
rename to tools/test/h5diff/testfiles/h5diff_415.txt
diff --git a/tools/h5diff/testfiles/h5diff_416.txt b/tools/test/h5diff/testfiles/h5diff_416.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_416.txt
rename to tools/test/h5diff/testfiles/h5diff_416.txt
diff --git a/tools/h5diff/testfiles/h5diff_417.txt b/tools/test/h5diff/testfiles/h5diff_417.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_417.txt
rename to tools/test/h5diff/testfiles/h5diff_417.txt
diff --git a/tools/h5diff/testfiles/h5diff_418.txt b/tools/test/h5diff/testfiles/h5diff_418.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_418.txt
rename to tools/test/h5diff/testfiles/h5diff_418.txt
diff --git a/tools/h5diff/testfiles/h5diff_419.txt b/tools/test/h5diff/testfiles/h5diff_419.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_419.txt
rename to tools/test/h5diff/testfiles/h5diff_419.txt
diff --git a/tools/h5diff/testfiles/h5diff_420.txt b/tools/test/h5diff/testfiles/h5diff_420.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_420.txt
rename to tools/test/h5diff/testfiles/h5diff_420.txt
diff --git a/tools/h5diff/testfiles/h5diff_421.txt b/tools/test/h5diff/testfiles/h5diff_421.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_421.txt
rename to tools/test/h5diff/testfiles/h5diff_421.txt
diff --git a/tools/h5diff/testfiles/h5diff_422.txt b/tools/test/h5diff/testfiles/h5diff_422.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_422.txt
rename to tools/test/h5diff/testfiles/h5diff_422.txt
diff --git a/tools/h5diff/testfiles/h5diff_423.txt b/tools/test/h5diff/testfiles/h5diff_423.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_423.txt
rename to tools/test/h5diff/testfiles/h5diff_423.txt
diff --git a/tools/h5diff/testfiles/h5diff_424.txt b/tools/test/h5diff/testfiles/h5diff_424.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_424.txt
rename to tools/test/h5diff/testfiles/h5diff_424.txt
diff --git a/tools/h5diff/testfiles/h5diff_425.txt b/tools/test/h5diff/testfiles/h5diff_425.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_425.txt
rename to tools/test/h5diff/testfiles/h5diff_425.txt
diff --git a/tools/h5diff/testfiles/h5diff_450.txt b/tools/test/h5diff/testfiles/h5diff_450.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_450.txt
rename to tools/test/h5diff/testfiles/h5diff_450.txt
diff --git a/tools/h5diff/testfiles/h5diff_451.txt b/tools/test/h5diff/testfiles/h5diff_451.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_451.txt
rename to tools/test/h5diff/testfiles/h5diff_451.txt
diff --git a/tools/h5diff/testfiles/h5diff_452.txt b/tools/test/h5diff/testfiles/h5diff_452.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_452.txt
rename to tools/test/h5diff/testfiles/h5diff_452.txt
diff --git a/tools/h5diff/testfiles/h5diff_453.txt b/tools/test/h5diff/testfiles/h5diff_453.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_453.txt
rename to tools/test/h5diff/testfiles/h5diff_453.txt
diff --git a/tools/h5diff/testfiles/h5diff_454.txt b/tools/test/h5diff/testfiles/h5diff_454.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_454.txt
rename to tools/test/h5diff/testfiles/h5diff_454.txt
diff --git a/tools/h5diff/testfiles/h5diff_455.txt b/tools/test/h5diff/testfiles/h5diff_455.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_455.txt
rename to tools/test/h5diff/testfiles/h5diff_455.txt
diff --git a/tools/h5diff/testfiles/h5diff_456.txt b/tools/test/h5diff/testfiles/h5diff_456.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_456.txt
rename to tools/test/h5diff/testfiles/h5diff_456.txt
diff --git a/tools/h5diff/testfiles/h5diff_457.txt b/tools/test/h5diff/testfiles/h5diff_457.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_457.txt
rename to tools/test/h5diff/testfiles/h5diff_457.txt
diff --git a/tools/h5diff/testfiles/h5diff_458.txt b/tools/test/h5diff/testfiles/h5diff_458.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_458.txt
rename to tools/test/h5diff/testfiles/h5diff_458.txt
diff --git a/tools/h5diff/testfiles/h5diff_459.txt b/tools/test/h5diff/testfiles/h5diff_459.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_459.txt
rename to tools/test/h5diff/testfiles/h5diff_459.txt
diff --git a/tools/h5diff/testfiles/h5diff_465.txt b/tools/test/h5diff/testfiles/h5diff_465.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_465.txt
rename to tools/test/h5diff/testfiles/h5diff_465.txt
diff --git a/tools/h5diff/testfiles/h5diff_466.txt b/tools/test/h5diff/testfiles/h5diff_466.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_466.txt
rename to tools/test/h5diff/testfiles/h5diff_466.txt
diff --git a/tools/h5diff/testfiles/h5diff_467.txt b/tools/test/h5diff/testfiles/h5diff_467.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_467.txt
rename to tools/test/h5diff/testfiles/h5diff_467.txt
diff --git a/tools/h5diff/testfiles/h5diff_468.txt b/tools/test/h5diff/testfiles/h5diff_468.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_468.txt
rename to tools/test/h5diff/testfiles/h5diff_468.txt
diff --git a/tools/h5diff/testfiles/h5diff_469.txt b/tools/test/h5diff/testfiles/h5diff_469.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_469.txt
rename to tools/test/h5diff/testfiles/h5diff_469.txt
diff --git a/tools/h5diff/testfiles/h5diff_471.txt b/tools/test/h5diff/testfiles/h5diff_471.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_471.txt
rename to tools/test/h5diff/testfiles/h5diff_471.txt
diff --git a/tools/h5diff/testfiles/h5diff_472.txt b/tools/test/h5diff/testfiles/h5diff_472.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_472.txt
rename to tools/test/h5diff/testfiles/h5diff_472.txt
diff --git a/tools/h5diff/testfiles/h5diff_473.txt b/tools/test/h5diff/testfiles/h5diff_473.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_473.txt
rename to tools/test/h5diff/testfiles/h5diff_473.txt
diff --git a/tools/h5diff/testfiles/h5diff_474.txt b/tools/test/h5diff/testfiles/h5diff_474.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_474.txt
rename to tools/test/h5diff/testfiles/h5diff_474.txt
diff --git a/tools/h5diff/testfiles/h5diff_475.txt b/tools/test/h5diff/testfiles/h5diff_475.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_475.txt
rename to tools/test/h5diff/testfiles/h5diff_475.txt
diff --git a/tools/h5diff/testfiles/h5diff_480.txt b/tools/test/h5diff/testfiles/h5diff_480.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_480.txt
rename to tools/test/h5diff/testfiles/h5diff_480.txt
diff --git a/tools/h5diff/testfiles/h5diff_481.txt b/tools/test/h5diff/testfiles/h5diff_481.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_481.txt
rename to tools/test/h5diff/testfiles/h5diff_481.txt
diff --git a/tools/h5diff/testfiles/h5diff_482.txt b/tools/test/h5diff/testfiles/h5diff_482.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_482.txt
rename to tools/test/h5diff/testfiles/h5diff_482.txt
diff --git a/tools/h5diff/testfiles/h5diff_483.txt b/tools/test/h5diff/testfiles/h5diff_483.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_483.txt
rename to tools/test/h5diff/testfiles/h5diff_483.txt
diff --git a/tools/h5diff/testfiles/h5diff_484.txt b/tools/test/h5diff/testfiles/h5diff_484.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_484.txt
rename to tools/test/h5diff/testfiles/h5diff_484.txt
diff --git a/tools/h5diff/testfiles/h5diff_485.txt b/tools/test/h5diff/testfiles/h5diff_485.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_485.txt
rename to tools/test/h5diff/testfiles/h5diff_485.txt
diff --git a/tools/h5diff/testfiles/h5diff_486.txt b/tools/test/h5diff/testfiles/h5diff_486.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_486.txt
rename to tools/test/h5diff/testfiles/h5diff_486.txt
diff --git a/tools/h5diff/testfiles/h5diff_487.txt b/tools/test/h5diff/testfiles/h5diff_487.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_487.txt
rename to tools/test/h5diff/testfiles/h5diff_487.txt
diff --git a/tools/h5diff/testfiles/h5diff_50.txt b/tools/test/h5diff/testfiles/h5diff_50.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_50.txt
rename to tools/test/h5diff/testfiles/h5diff_50.txt
diff --git a/tools/h5diff/testfiles/h5diff_500.txt b/tools/test/h5diff/testfiles/h5diff_500.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_500.txt
rename to tools/test/h5diff/testfiles/h5diff_500.txt
diff --git a/tools/h5diff/testfiles/h5diff_501.txt b/tools/test/h5diff/testfiles/h5diff_501.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_501.txt
rename to tools/test/h5diff/testfiles/h5diff_501.txt
diff --git a/tools/h5diff/testfiles/h5diff_502.txt b/tools/test/h5diff/testfiles/h5diff_502.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_502.txt
rename to tools/test/h5diff/testfiles/h5diff_502.txt
diff --git a/tools/h5diff/testfiles/h5diff_503.txt b/tools/test/h5diff/testfiles/h5diff_503.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_503.txt
rename to tools/test/h5diff/testfiles/h5diff_503.txt
diff --git a/tools/h5diff/testfiles/h5diff_504.txt b/tools/test/h5diff/testfiles/h5diff_504.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_504.txt
rename to tools/test/h5diff/testfiles/h5diff_504.txt
diff --git a/tools/h5diff/testfiles/h5diff_505.txt b/tools/test/h5diff/testfiles/h5diff_505.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_505.txt
rename to tools/test/h5diff/testfiles/h5diff_505.txt
diff --git a/tools/h5diff/testfiles/h5diff_506.txt b/tools/test/h5diff/testfiles/h5diff_506.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_506.txt
rename to tools/test/h5diff/testfiles/h5diff_506.txt
diff --git a/tools/h5diff/testfiles/h5diff_507.txt b/tools/test/h5diff/testfiles/h5diff_507.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_507.txt
rename to tools/test/h5diff/testfiles/h5diff_507.txt
diff --git a/tools/h5diff/testfiles/h5diff_508.txt b/tools/test/h5diff/testfiles/h5diff_508.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_508.txt
rename to tools/test/h5diff/testfiles/h5diff_508.txt
diff --git a/tools/h5diff/testfiles/h5diff_509.txt b/tools/test/h5diff/testfiles/h5diff_509.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_509.txt
rename to tools/test/h5diff/testfiles/h5diff_509.txt
diff --git a/tools/h5diff/testfiles/h5diff_51.txt b/tools/test/h5diff/testfiles/h5diff_51.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_51.txt
rename to tools/test/h5diff/testfiles/h5diff_51.txt
diff --git a/tools/h5diff/testfiles/h5diff_510.txt b/tools/test/h5diff/testfiles/h5diff_510.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_510.txt
rename to tools/test/h5diff/testfiles/h5diff_510.txt
diff --git a/tools/h5diff/testfiles/h5diff_511.txt b/tools/test/h5diff/testfiles/h5diff_511.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_511.txt
rename to tools/test/h5diff/testfiles/h5diff_511.txt
diff --git a/tools/h5diff/testfiles/h5diff_512.txt b/tools/test/h5diff/testfiles/h5diff_512.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_512.txt
rename to tools/test/h5diff/testfiles/h5diff_512.txt
diff --git a/tools/h5diff/testfiles/h5diff_513.txt b/tools/test/h5diff/testfiles/h5diff_513.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_513.txt
rename to tools/test/h5diff/testfiles/h5diff_513.txt
diff --git a/tools/h5diff/testfiles/h5diff_514.txt b/tools/test/h5diff/testfiles/h5diff_514.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_514.txt
rename to tools/test/h5diff/testfiles/h5diff_514.txt
diff --git a/tools/h5diff/testfiles/h5diff_515.txt b/tools/test/h5diff/testfiles/h5diff_515.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_515.txt
rename to tools/test/h5diff/testfiles/h5diff_515.txt
diff --git a/tools/h5diff/testfiles/h5diff_516.txt b/tools/test/h5diff/testfiles/h5diff_516.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_516.txt
rename to tools/test/h5diff/testfiles/h5diff_516.txt
diff --git a/tools/h5diff/testfiles/h5diff_517.txt b/tools/test/h5diff/testfiles/h5diff_517.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_517.txt
rename to tools/test/h5diff/testfiles/h5diff_517.txt
diff --git a/tools/h5diff/testfiles/h5diff_518.txt b/tools/test/h5diff/testfiles/h5diff_518.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_518.txt
rename to tools/test/h5diff/testfiles/h5diff_518.txt
diff --git a/tools/h5diff/testfiles/h5diff_52.txt b/tools/test/h5diff/testfiles/h5diff_52.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_52.txt
rename to tools/test/h5diff/testfiles/h5diff_52.txt
diff --git a/tools/h5diff/testfiles/h5diff_53.txt b/tools/test/h5diff/testfiles/h5diff_53.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_53.txt
rename to tools/test/h5diff/testfiles/h5diff_53.txt
diff --git a/tools/h5diff/testfiles/h5diff_530.txt b/tools/test/h5diff/testfiles/h5diff_530.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_530.txt
rename to tools/test/h5diff/testfiles/h5diff_530.txt
diff --git a/tools/h5diff/testfiles/h5diff_54.txt b/tools/test/h5diff/testfiles/h5diff_54.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_54.txt
rename to tools/test/h5diff/testfiles/h5diff_54.txt
diff --git a/tools/h5diff/testfiles/h5diff_540.txt b/tools/test/h5diff/testfiles/h5diff_540.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_540.txt
rename to tools/test/h5diff/testfiles/h5diff_540.txt
diff --git a/tools/h5diff/testfiles/h5diff_55.txt b/tools/test/h5diff/testfiles/h5diff_55.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_55.txt
rename to tools/test/h5diff/testfiles/h5diff_55.txt
diff --git a/tools/h5diff/testfiles/h5diff_56.txt b/tools/test/h5diff/testfiles/h5diff_56.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_56.txt
rename to tools/test/h5diff/testfiles/h5diff_56.txt
diff --git a/tools/h5diff/testfiles/h5diff_57.txt b/tools/test/h5diff/testfiles/h5diff_57.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_57.txt
rename to tools/test/h5diff/testfiles/h5diff_57.txt
diff --git a/tools/h5diff/testfiles/h5diff_58.txt b/tools/test/h5diff/testfiles/h5diff_58.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_58.txt
rename to tools/test/h5diff/testfiles/h5diff_58.txt
diff --git a/tools/h5diff/testfiles/h5diff_59.txt b/tools/test/h5diff/testfiles/h5diff_59.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_59.txt
rename to tools/test/h5diff/testfiles/h5diff_59.txt
diff --git a/tools/test/h5diff/testfiles/h5diff_60.txt b/tools/test/h5diff/testfiles/h5diff_60.txt
new file mode 100644
index 0000000..938f279
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_60.txt
@@ -0,0 +1,10 @@
+dataset: </string1> and </string1>
+size:           [3x4]           [3x4]
+position        string1         string1         difference          
+------------------------------------------------------------
+[ 1 0 ]            5            \000
+[ 1 1 ]            6            \000
+[ 1 2 ]            \000            7
+[ 1 3 ]            \000            8
+4 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/test/h5diff/testfiles/h5diff_600.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_600.txt
rename to tools/test/h5diff/testfiles/h5diff_600.txt
diff --git a/tools/h5diff/testfiles/h5diff_601.txt b/tools/test/h5diff/testfiles/h5diff_601.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_601.txt
rename to tools/test/h5diff/testfiles/h5diff_601.txt
diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/test/h5diff/testfiles/h5diff_603.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_603.txt
rename to tools/test/h5diff/testfiles/h5diff_603.txt
diff --git a/tools/h5diff/testfiles/h5diff_604.txt b/tools/test/h5diff/testfiles/h5diff_604.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_604.txt
rename to tools/test/h5diff/testfiles/h5diff_604.txt
diff --git a/tools/h5diff/testfiles/h5diff_605.txt b/tools/test/h5diff/testfiles/h5diff_605.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_605.txt
rename to tools/test/h5diff/testfiles/h5diff_605.txt
diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/test/h5diff/testfiles/h5diff_606.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_606.txt
rename to tools/test/h5diff/testfiles/h5diff_606.txt
diff --git a/tools/h5diff/testfiles/h5diff_607.txt b/tools/test/h5diff/testfiles/h5diff_607.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_607.txt
rename to tools/test/h5diff/testfiles/h5diff_607.txt
diff --git a/tools/h5diff/testfiles/h5diff_608.txt b/tools/test/h5diff/testfiles/h5diff_608.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_608.txt
rename to tools/test/h5diff/testfiles/h5diff_608.txt
diff --git a/tools/h5diff/testfiles/h5diff_609.txt b/tools/test/h5diff/testfiles/h5diff_609.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_609.txt
rename to tools/test/h5diff/testfiles/h5diff_609.txt
diff --git a/tools/test/h5diff/testfiles/h5diff_61.txt b/tools/test/h5diff/testfiles/h5diff_61.txt
new file mode 100644
index 0000000..1f238b1
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_61.txt
@@ -0,0 +1,30 @@
+dataset: </string2> and </string2>
+size:           [20]           [20]
+position        string2         string2         difference          
+------------------------------------------------------------
+[ 8 ]            9            e
+[ 8 ]                         f
+[ 8 ]                         9
+[ 9 ]            0            e
+[ 9 ]                         f
+[ 9 ]                         0
+[ 10 ]            1            e
+[ 10 ]                         f
+[ 10 ]                         1
+[ 11 ]            2            e
+[ 11 ]                         f
+[ 11 ]                         2
+[ 12 ]            e            3
+[ 12 ]            f             
+[ 12 ]            3             
+[ 13 ]            e            4
+[ 13 ]            f             
+[ 13 ]            4             
+[ 14 ]            e            5
+[ 14 ]            f             
+[ 14 ]            5             
+[ 15 ]            e            6
+[ 15 ]            f             
+[ 15 ]            6             
+24 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_610.txt b/tools/test/h5diff/testfiles/h5diff_610.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_610.txt
rename to tools/test/h5diff/testfiles/h5diff_610.txt
diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/test/h5diff/testfiles/h5diff_612.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_612.txt
rename to tools/test/h5diff/testfiles/h5diff_612.txt
diff --git a/tools/h5diff/testfiles/h5diff_613.txt b/tools/test/h5diff/testfiles/h5diff_613.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_613.txt
rename to tools/test/h5diff/testfiles/h5diff_613.txt
diff --git a/tools/h5diff/testfiles/h5diff_614.txt b/tools/test/h5diff/testfiles/h5diff_614.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_614.txt
rename to tools/test/h5diff/testfiles/h5diff_614.txt
diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/test/h5diff/testfiles/h5diff_615.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_615.txt
rename to tools/test/h5diff/testfiles/h5diff_615.txt
diff --git a/tools/h5diff/testfiles/h5diff_616.txt b/tools/test/h5diff/testfiles/h5diff_616.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_616.txt
rename to tools/test/h5diff/testfiles/h5diff_616.txt
diff --git a/tools/h5diff/testfiles/h5diff_617.txt b/tools/test/h5diff/testfiles/h5diff_617.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_617.txt
rename to tools/test/h5diff/testfiles/h5diff_617.txt
diff --git a/tools/h5diff/testfiles/h5diff_618.txt b/tools/test/h5diff/testfiles/h5diff_618.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_618.txt
rename to tools/test/h5diff/testfiles/h5diff_618.txt
diff --git a/tools/h5diff/testfiles/h5diff_619.txt b/tools/test/h5diff/testfiles/h5diff_619.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_619.txt
rename to tools/test/h5diff/testfiles/h5diff_619.txt
diff --git a/tools/test/h5diff/testfiles/h5diff_62.txt b/tools/test/h5diff/testfiles/h5diff_62.txt
new file mode 100644
index 0000000..0cc0947
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_62.txt
@@ -0,0 +1,37 @@
+dataset: </string3> and </string3>
+size:           [27]           [27]
+position        string3         string3         difference          
+------------------------------------------------------------
+[ 12 ]            d            c
+[ 12 ]            2            d
+[ 12 ]            \000            2
+[ 13 ]            3            d
+[ 13 ]            \000            3
+[ 14 ]            b            a
+[ 14 ]            c            b
+[ 14 ]            d            c
+[ 14 ]            4            d
+[ 14 ]            \000            4
+[ 15 ]            c            b
+[ 15 ]            d            c
+[ 15 ]            5            d
+[ 15 ]            \000            5
+[ 16 ]            c            d
+[ 16 ]            d            6
+[ 16 ]            6            \000
+[ 17 ]            d            7
+[ 17 ]            7            \000
+[ 18 ]            a            b
+[ 18 ]            b            c
+[ 18 ]            c            d
+[ 18 ]            d            8
+[ 18 ]            8            \000
+[ 19 ]            b            c
+[ 19 ]            c            d
+[ 19 ]            d            9
+[ 19 ]            9            \000
+[ 24 ]            c            d
+[ 25 ]            c            d
+[ 26 ]            c            d
+31 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/test/h5diff/testfiles/h5diff_621.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_621.txt
rename to tools/test/h5diff/testfiles/h5diff_621.txt
diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/test/h5diff/testfiles/h5diff_622.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_622.txt
rename to tools/test/h5diff/testfiles/h5diff_622.txt
diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/test/h5diff/testfiles/h5diff_623.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_623.txt
rename to tools/test/h5diff/testfiles/h5diff_623.txt
diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/test/h5diff/testfiles/h5diff_624.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_624.txt
rename to tools/test/h5diff/testfiles/h5diff_624.txt
diff --git a/tools/h5diff/testfiles/h5diff_625.txt b/tools/test/h5diff/testfiles/h5diff_625.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_625.txt
rename to tools/test/h5diff/testfiles/h5diff_625.txt
diff --git a/tools/h5diff/testfiles/h5diff_626.txt b/tools/test/h5diff/testfiles/h5diff_626.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_626.txt
rename to tools/test/h5diff/testfiles/h5diff_626.txt
diff --git a/tools/h5diff/testfiles/h5diff_627.txt b/tools/test/h5diff/testfiles/h5diff_627.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_627.txt
rename to tools/test/h5diff/testfiles/h5diff_627.txt
diff --git a/tools/h5diff/testfiles/h5diff_628.txt b/tools/test/h5diff/testfiles/h5diff_628.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_628.txt
rename to tools/test/h5diff/testfiles/h5diff_628.txt
diff --git a/tools/h5diff/testfiles/h5diff_629.txt b/tools/test/h5diff/testfiles/h5diff_629.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_629.txt
rename to tools/test/h5diff/testfiles/h5diff_629.txt
diff --git a/tools/test/h5diff/testfiles/h5diff_63.txt b/tools/test/h5diff/testfiles/h5diff_63.txt
new file mode 100644
index 0000000..043da16
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_63.txt
@@ -0,0 +1,10 @@
+dataset: </string4> and </string4>
+size:           [3]           [3]
+position        string4         string4         difference          
+------------------------------------------------------------
+[ 1 ]            8             
+[ 1 ]            9             
+[ 2 ]                         8
+[ 2 ]                         9
+4 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_630.txt b/tools/test/h5diff/testfiles/h5diff_630.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_630.txt
rename to tools/test/h5diff/testfiles/h5diff_630.txt
diff --git a/tools/h5diff/testfiles/h5diff_631.txt b/tools/test/h5diff/testfiles/h5diff_631.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_631.txt
rename to tools/test/h5diff/testfiles/h5diff_631.txt
diff --git a/tools/h5diff/testfiles/h5diff_640.txt b/tools/test/h5diff/testfiles/h5diff_640.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_640.txt
rename to tools/test/h5diff/testfiles/h5diff_640.txt
diff --git a/tools/h5diff/testfiles/h5diff_641.txt b/tools/test/h5diff/testfiles/h5diff_641.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_641.txt
rename to tools/test/h5diff/testfiles/h5diff_641.txt
diff --git a/tools/h5diff/testfiles/h5diff_642.txt b/tools/test/h5diff/testfiles/h5diff_642.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_642.txt
rename to tools/test/h5diff/testfiles/h5diff_642.txt
diff --git a/tools/h5diff/testfiles/h5diff_643.txt b/tools/test/h5diff/testfiles/h5diff_643.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_643.txt
rename to tools/test/h5diff/testfiles/h5diff_643.txt
diff --git a/tools/h5diff/testfiles/h5diff_644.txt b/tools/test/h5diff/testfiles/h5diff_644.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_644.txt
rename to tools/test/h5diff/testfiles/h5diff_644.txt
diff --git a/tools/h5diff/testfiles/h5diff_645.txt b/tools/test/h5diff/testfiles/h5diff_645.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_645.txt
rename to tools/test/h5diff/testfiles/h5diff_645.txt
diff --git a/tools/h5diff/testfiles/h5diff_646.txt b/tools/test/h5diff/testfiles/h5diff_646.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_646.txt
rename to tools/test/h5diff/testfiles/h5diff_646.txt
diff --git a/tools/h5diff/testfiles/h5diff_70.txt b/tools/test/h5diff/testfiles/h5diff_70.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_70.txt
rename to tools/test/h5diff/testfiles/h5diff_70.txt
diff --git a/tools/h5diff/testfiles/h5diff_700.txt b/tools/test/h5diff/testfiles/h5diff_700.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_700.txt
rename to tools/test/h5diff/testfiles/h5diff_700.txt
diff --git a/tools/h5diff/testfiles/h5diff_701.txt b/tools/test/h5diff/testfiles/h5diff_701.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_701.txt
rename to tools/test/h5diff/testfiles/h5diff_701.txt
diff --git a/tools/h5diff/testfiles/h5diff_702.txt b/tools/test/h5diff/testfiles/h5diff_702.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_702.txt
rename to tools/test/h5diff/testfiles/h5diff_702.txt
diff --git a/tools/h5diff/testfiles/h5diff_703.txt b/tools/test/h5diff/testfiles/h5diff_703.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_703.txt
rename to tools/test/h5diff/testfiles/h5diff_703.txt
diff --git a/tools/h5diff/testfiles/h5diff_704.txt b/tools/test/h5diff/testfiles/h5diff_704.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_704.txt
rename to tools/test/h5diff/testfiles/h5diff_704.txt
diff --git a/tools/h5diff/testfiles/h5diff_705.txt b/tools/test/h5diff/testfiles/h5diff_705.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_705.txt
rename to tools/test/h5diff/testfiles/h5diff_705.txt
diff --git a/tools/h5diff/testfiles/h5diff_706.txt b/tools/test/h5diff/testfiles/h5diff_706.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_706.txt
rename to tools/test/h5diff/testfiles/h5diff_706.txt
diff --git a/tools/h5diff/testfiles/h5diff_707.txt b/tools/test/h5diff/testfiles/h5diff_707.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_707.txt
rename to tools/test/h5diff/testfiles/h5diff_707.txt
diff --git a/tools/h5diff/testfiles/h5diff_708.txt b/tools/test/h5diff/testfiles/h5diff_708.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_708.txt
rename to tools/test/h5diff/testfiles/h5diff_708.txt
diff --git a/tools/h5diff/testfiles/h5diff_709.txt b/tools/test/h5diff/testfiles/h5diff_709.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_709.txt
rename to tools/test/h5diff/testfiles/h5diff_709.txt
diff --git a/tools/h5diff/testfiles/h5diff_710.txt b/tools/test/h5diff/testfiles/h5diff_710.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_710.txt
rename to tools/test/h5diff/testfiles/h5diff_710.txt
diff --git a/tools/h5diff/testfiles/h5diff_80.txt b/tools/test/h5diff/testfiles/h5diff_80.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_80.txt
rename to tools/test/h5diff/testfiles/h5diff_80.txt
diff --git a/tools/h5diff/testfiles/h5diff_90.txt b/tools/test/h5diff/testfiles/h5diff_90.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_90.txt
rename to tools/test/h5diff/testfiles/h5diff_90.txt
diff --git a/tools/h5diff/testfiles/h5diff_attr1.h5 b/tools/test/h5diff/testfiles/h5diff_attr1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_attr1.h5
rename to tools/test/h5diff/testfiles/h5diff_attr1.h5
diff --git a/tools/h5diff/testfiles/h5diff_attr2.h5 b/tools/test/h5diff/testfiles/h5diff_attr2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_attr2.h5
rename to tools/test/h5diff/testfiles/h5diff_attr2.h5
diff --git a/tools/h5diff/testfiles/h5diff_attr_v_level1.h5 b/tools/test/h5diff/testfiles/h5diff_attr_v_level1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_attr_v_level1.h5
rename to tools/test/h5diff/testfiles/h5diff_attr_v_level1.h5
diff --git a/tools/h5diff/testfiles/h5diff_attr_v_level2.h5 b/tools/test/h5diff/testfiles/h5diff_attr_v_level2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_attr_v_level2.h5
rename to tools/test/h5diff/testfiles/h5diff_attr_v_level2.h5
diff --git a/tools/h5diff/testfiles/h5diff_basic1.h5 b/tools/test/h5diff/testfiles/h5diff_basic1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_basic1.h5
rename to tools/test/h5diff/testfiles/h5diff_basic1.h5
diff --git a/tools/h5diff/testfiles/h5diff_basic2.h5 b/tools/test/h5diff/testfiles/h5diff_basic2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_basic2.h5
rename to tools/test/h5diff/testfiles/h5diff_basic2.h5
diff --git a/tools/h5diff/testfiles/h5diff_comp_vl_strs.h5 b/tools/test/h5diff/testfiles/h5diff_comp_vl_strs.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_comp_vl_strs.h5
rename to tools/test/h5diff/testfiles/h5diff_comp_vl_strs.h5
diff --git a/tools/h5diff/testfiles/h5diff_danglelinks1.h5 b/tools/test/h5diff/testfiles/h5diff_danglelinks1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_danglelinks1.h5
rename to tools/test/h5diff/testfiles/h5diff_danglelinks1.h5
diff --git a/tools/h5diff/testfiles/h5diff_danglelinks2.h5 b/tools/test/h5diff/testfiles/h5diff_danglelinks2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_danglelinks2.h5
rename to tools/test/h5diff/testfiles/h5diff_danglelinks2.h5
diff --git a/tools/h5diff/testfiles/h5diff_dset1.h5 b/tools/test/h5diff/testfiles/h5diff_dset1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_dset1.h5
rename to tools/test/h5diff/testfiles/h5diff_dset1.h5
diff --git a/tools/h5diff/testfiles/h5diff_dset2.h5 b/tools/test/h5diff/testfiles/h5diff_dset2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_dset2.h5
rename to tools/test/h5diff/testfiles/h5diff_dset2.h5
diff --git a/tools/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5 b/tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5
rename to tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size1.h5
diff --git a/tools/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5 b/tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5
rename to tools/test/h5diff/testfiles/h5diff_dset_zero_dim_size2.h5
diff --git a/tools/h5diff/testfiles/h5diff_dtypes.h5 b/tools/test/h5diff/testfiles/h5diff_dtypes.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_dtypes.h5
rename to tools/test/h5diff/testfiles/h5diff_dtypes.h5
diff --git a/tools/h5diff/testfiles/h5diff_empty.h5 b/tools/test/h5diff/testfiles/h5diff_empty.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_empty.h5
rename to tools/test/h5diff/testfiles/h5diff_empty.h5
diff --git a/tools/h5diff/testfiles/h5diff_enum_invalid_values.h5 b/tools/test/h5diff/testfiles/h5diff_enum_invalid_values.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_enum_invalid_values.h5
rename to tools/test/h5diff/testfiles/h5diff_enum_invalid_values.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude1-1.h5 b/tools/test/h5diff/testfiles/h5diff_exclude1-1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude1-1.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude1-1.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude1-2.h5 b/tools/test/h5diff/testfiles/h5diff_exclude1-2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude1-2.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude1-2.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude2-1.h5 b/tools/test/h5diff/testfiles/h5diff_exclude2-1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude2-1.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude2-1.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude2-2.h5 b/tools/test/h5diff/testfiles/h5diff_exclude2-2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude2-2.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude2-2.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude3-1.h5 b/tools/test/h5diff/testfiles/h5diff_exclude3-1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude3-1.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude3-1.h5
diff --git a/tools/h5diff/testfiles/h5diff_exclude3-2.h5 b/tools/test/h5diff/testfiles/h5diff_exclude3-2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_exclude3-2.h5
rename to tools/test/h5diff/testfiles/h5diff_exclude3-2.h5
diff --git a/tools/h5diff/testfiles/h5diff_ext2softlink_src.h5 b/tools/test/h5diff/testfiles/h5diff_ext2softlink_src.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_ext2softlink_src.h5
rename to tools/test/h5diff/testfiles/h5diff_ext2softlink_src.h5
diff --git a/tools/h5diff/testfiles/h5diff_ext2softlink_trg.h5 b/tools/test/h5diff/testfiles/h5diff_ext2softlink_trg.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_ext2softlink_trg.h5
rename to tools/test/h5diff/testfiles/h5diff_ext2softlink_trg.h5
diff --git a/tools/h5diff/testfiles/h5diff_extlink_src.h5 b/tools/test/h5diff/testfiles/h5diff_extlink_src.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_extlink_src.h5
rename to tools/test/h5diff/testfiles/h5diff_extlink_src.h5
diff --git a/tools/h5diff/testfiles/h5diff_extlink_trg.h5 b/tools/test/h5diff/testfiles/h5diff_extlink_trg.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_extlink_trg.h5
rename to tools/test/h5diff/testfiles/h5diff_extlink_trg.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse1.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse1.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse1.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse2.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse2.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse2.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5 b/tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
rename to tools/test/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
diff --git a/tools/test/h5diff/testfiles/h5diff_hyper1.h5 b/tools/test/h5diff/testfiles/h5diff_hyper1.h5
new file mode 100644
index 0000000..ceeff80
Binary files /dev/null and b/tools/test/h5diff/testfiles/h5diff_hyper1.h5 differ
diff --git a/tools/test/h5diff/testfiles/h5diff_hyper2.h5 b/tools/test/h5diff/testfiles/h5diff_hyper2.h5
new file mode 100644
index 0000000..05a2eb1
Binary files /dev/null and b/tools/test/h5diff/testfiles/h5diff_hyper2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_linked_softlink.h5 b/tools/test/h5diff/testfiles/h5diff_linked_softlink.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_linked_softlink.h5
rename to tools/test/h5diff/testfiles/h5diff_linked_softlink.h5
diff --git a/tools/h5diff/testfiles/h5diff_links.h5 b/tools/test/h5diff/testfiles/h5diff_links.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_links.h5
rename to tools/test/h5diff/testfiles/h5diff_links.h5
diff --git a/tools/h5diff/testfiles/h5diff_softlinks.h5 b/tools/test/h5diff/testfiles/h5diff_softlinks.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_softlinks.h5
rename to tools/test/h5diff/testfiles/h5diff_softlinks.h5
diff --git a/tools/h5diff/testfiles/h5diff_tmp1.txt b/tools/test/h5diff/testfiles/h5diff_tmp1.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_tmp1.txt
rename to tools/test/h5diff/testfiles/h5diff_tmp1.txt
diff --git a/tools/h5diff/testfiles/h5diff_tmp2.txt b/tools/test/h5diff/testfiles/h5diff_tmp2.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_tmp2.txt
rename to tools/test/h5diff/testfiles/h5diff_tmp2.txt
diff --git a/tools/h5diff/testfiles/h5diff_types.h5 b/tools/test/h5diff/testfiles/h5diff_types.h5
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_types.h5
rename to tools/test/h5diff/testfiles/h5diff_types.h5
diff --git a/tools/test/h5diff/testfiles/h5diff_ud.txt b/tools/test/h5diff/testfiles/h5diff_ud.txt
new file mode 100644
index 0000000..ddda3ff
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_ud.txt
@@ -0,0 +1,11 @@
+
+file1     file2
+---------------------------------------
+    x      x    /              
+    x      x    /dynlibud      
+
+group  : </> and </>
+0 differences found
+dataset: </dynlibud> and </dynlibud>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/test/h5diff/testfiles/h5diff_udfail.txt b/tools/test/h5diff/testfiles/h5diff_udfail.txt
new file mode 100644
index 0000000..c154c6b
--- /dev/null
+++ b/tools/test/h5diff/testfiles/h5diff_udfail.txt
@@ -0,0 +1,12 @@
+
+file1     file2
+---------------------------------------
+    x      x    /              
+    x      x    /dynlibud      
+
+group  : </> and </>
+0 differences found
+dataset: </dynlibud> and </dynlibud>
+0 differences found
+warning: dataset </dynlibud> cannot be read, user defined filter is not available
+EXIT CODE: 2
diff --git a/tools/h5diff/testfiles/h5diff_v1.txt b/tools/test/h5diff/testfiles/h5diff_v1.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_v1.txt
rename to tools/test/h5diff/testfiles/h5diff_v1.txt
diff --git a/tools/h5diff/testfiles/h5diff_v2.txt b/tools/test/h5diff/testfiles/h5diff_v2.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_v2.txt
rename to tools/test/h5diff/testfiles/h5diff_v2.txt
diff --git a/tools/h5diff/testfiles/h5diff_v3.txt b/tools/test/h5diff/testfiles/h5diff_v3.txt
similarity index 100%
rename from tools/h5diff/testfiles/h5diff_v3.txt
rename to tools/test/h5diff/testfiles/h5diff_v3.txt
diff --git a/tools/h5diff/testfiles/non_comparables1.h5 b/tools/test/h5diff/testfiles/non_comparables1.h5
similarity index 100%
rename from tools/h5diff/testfiles/non_comparables1.h5
rename to tools/test/h5diff/testfiles/non_comparables1.h5
diff --git a/tools/h5diff/testfiles/non_comparables2.h5 b/tools/test/h5diff/testfiles/non_comparables2.h5
similarity index 100%
rename from tools/h5diff/testfiles/non_comparables2.h5
rename to tools/test/h5diff/testfiles/non_comparables2.h5
diff --git a/tools/h5diff/testfiles/tmpSingleSiteBethe.output.h5 b/tools/test/h5diff/testfiles/tmpSingleSiteBethe.output.h5
similarity index 100%
rename from tools/h5diff/testfiles/tmpSingleSiteBethe.output.h5
rename to tools/test/h5diff/testfiles/tmpSingleSiteBethe.output.h5
diff --git a/tools/h5diff/testfiles/tmpSingleSiteBethe.reference.h5 b/tools/test/h5diff/testfiles/tmpSingleSiteBethe.reference.h5
similarity index 100%
rename from tools/h5diff/testfiles/tmpSingleSiteBethe.reference.h5
rename to tools/test/h5diff/testfiles/tmpSingleSiteBethe.reference.h5
diff --git a/tools/test/h5diff/testfiles/tmptest.he5 b/tools/test/h5diff/testfiles/tmptest.he5
new file mode 100644
index 0000000..edcfcd2
Binary files /dev/null and b/tools/test/h5diff/testfiles/tmptest.he5 differ
diff --git a/tools/test/h5diff/testfiles/tmptest2.he5 b/tools/test/h5diff/testfiles/tmptest2.he5
new file mode 100644
index 0000000..a6ab02b
Binary files /dev/null and b/tools/test/h5diff/testfiles/tmptest2.he5 differ
diff --git a/tools/test/h5diff/testfiles/tudfilter.h5 b/tools/test/h5diff/testfiles/tudfilter.h5
new file mode 100644
index 0000000..081b000
Binary files /dev/null and b/tools/test/h5diff/testfiles/tudfilter.h5 differ
diff --git a/tools/test/h5diff/testfiles/tudfilter2.h5 b/tools/test/h5diff/testfiles/tudfilter2.h5
new file mode 100644
index 0000000..081b000
Binary files /dev/null and b/tools/test/h5diff/testfiles/tudfilter2.h5 differ
diff --git a/tools/test/h5diff/testh5diff.sh.in b/tools/test/h5diff/testh5diff.sh.in
new file mode 100644
index 0000000..86658e2
--- /dev/null
+++ b/tools/test/h5diff/testh5diff.sh.in
@@ -0,0 +1,1183 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5diff tool
+#
+# Modification:
+#   Albert Cheng, 2005/08/17
+#   Added the SKIP feature.
+#   Albert Cheng, 2005/2/3
+#   Added -p option for parallel h5diff tests.
+#   Pedro Vicente Nunes:
+#    10/25/2005: Added test #9
+#    11/27/2006: Added test #10, #11
+#   Jonathan Kim:
+#    Improved to use single line
+#    Improved to check exit code (only serial mode, not necessary for parallel)
+#    Added test 400 - 425  (links with --follow-symlinks option)
+#    Added test 450 - 459  (dangling links)
+
+srcdir=@srcdir@
+
+TESTNAME=h5diff
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5DIFF=../../src/h5diff/h5diff               # The tool name
+H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes        # default is yes
+pmode=                # default to run h5diff tests
+mydomainname=`domainname 2>/dev/null`
+
+# 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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testfiles
+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_H5DIFF_TESTFILES/h5diff_basic1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_basic2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_types.h5
+$SRC_H5DIFF_TESTFILES/h5diff_dtypes.h5
+$SRC_H5DIFF_TESTFILES/h5diff_attr1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_attr2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_dset1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_dset2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_hyper1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_hyper2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_empty.h5
+$SRC_H5DIFF_TESTFILES/h5diff_links.h5
+$SRC_H5DIFF_TESTFILES/h5diff_softlinks.h5
+$SRC_H5DIFF_TESTFILES/h5diff_linked_softlink.h5
+$SRC_H5DIFF_TESTFILES/h5diff_extlink_src.h5
+$SRC_H5DIFF_TESTFILES/h5diff_extlink_trg.h5
+$SRC_H5DIFF_TESTFILES/h5diff_ext2softlink_src.h5
+$SRC_H5DIFF_TESTFILES/h5diff_ext2softlink_trg.h5
+$SRC_H5DIFF_TESTFILES/h5diff_dset_zero_dim_size1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_dset_zero_dim_size2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_danglelinks1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_danglelinks2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_grp_recurse_ext2-3.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude1-1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude1-2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude2-1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude2-2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude3-1.h5
+$SRC_H5DIFF_TESTFILES/h5diff_exclude3-2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_comp_vl_strs.h5
+$SRC_H5DIFF_TESTFILES/compounds_array_vlen1.h5
+$SRC_H5DIFF_TESTFILES/compounds_array_vlen2.h5
+$SRC_H5DIFF_TESTFILES/h5diff_attr_v_level1.h5
+$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_H5DIFF_TESTFILES/tmptest.he5
+$SRC_H5DIFF_TESTFILES/tmptest2.he5
+$SRC_H5DIFF_TESTFILES/tmpSingleSiteBethe.reference.h5
+$SRC_H5DIFF_TESTFILES/tmpSingleSiteBethe.output.h5
+$SRC_H5DIFF_TESTFILES/diff_strings1.h5
+$SRC_H5DIFF_TESTFILES/diff_strings2.h5
+"
+
+LIST_HDF5_VDS_TEST_FILES="
+$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="
+$SRC_H5DIFF_TESTFILES/h5diff_10.txt
+$SRC_H5DIFF_TESTFILES/h5diff_100.txt
+$SRC_H5DIFF_TESTFILES/h5diff_101.txt
+$SRC_H5DIFF_TESTFILES/h5diff_102.txt
+$SRC_H5DIFF_TESTFILES/h5diff_103.txt
+$SRC_H5DIFF_TESTFILES/h5diff_104.txt
+$SRC_H5DIFF_TESTFILES/h5diff_11.txt
+$SRC_H5DIFF_TESTFILES/h5diff_12.txt
+$SRC_H5DIFF_TESTFILES/h5diff_13.txt
+$SRC_H5DIFF_TESTFILES/h5diff_14.txt
+$SRC_H5DIFF_TESTFILES/h5diff_15.txt
+$SRC_H5DIFF_TESTFILES/h5diff_16_1.txt
+$SRC_H5DIFF_TESTFILES/h5diff_16_2.txt
+$SRC_H5DIFF_TESTFILES/h5diff_16_3.txt
+$SRC_H5DIFF_TESTFILES/h5diff_17.txt
+$SRC_H5DIFF_TESTFILES/h5diff_171.txt
+$SRC_H5DIFF_TESTFILES/h5diff_172.txt
+$SRC_H5DIFF_TESTFILES/h5diff_18_1.txt
+$SRC_H5DIFF_TESTFILES/h5diff_18.txt
+$SRC_H5DIFF_TESTFILES/h5diff_20.txt
+$SRC_H5DIFF_TESTFILES/h5diff_200.txt
+$SRC_H5DIFF_TESTFILES/h5diff_201.txt
+$SRC_H5DIFF_TESTFILES/h5diff_202.txt
+$SRC_H5DIFF_TESTFILES/h5diff_203.txt
+$SRC_H5DIFF_TESTFILES/h5diff_204.txt
+$SRC_H5DIFF_TESTFILES/h5diff_205.txt
+$SRC_H5DIFF_TESTFILES/h5diff_206.txt
+$SRC_H5DIFF_TESTFILES/h5diff_207.txt
+$SRC_H5DIFF_TESTFILES/h5diff_208.txt
+$SRC_H5DIFF_TESTFILES/h5diff_220.txt
+$SRC_H5DIFF_TESTFILES/h5diff_221.txt
+$SRC_H5DIFF_TESTFILES/h5diff_222.txt
+$SRC_H5DIFF_TESTFILES/h5diff_223.txt
+$SRC_H5DIFF_TESTFILES/h5diff_224.txt
+$SRC_H5DIFF_TESTFILES/h5diff_21.txt
+$SRC_H5DIFF_TESTFILES/h5diff_22.txt
+$SRC_H5DIFF_TESTFILES/h5diff_23.txt
+$SRC_H5DIFF_TESTFILES/h5diff_24.txt
+$SRC_H5DIFF_TESTFILES/h5diff_25.txt
+$SRC_H5DIFF_TESTFILES/h5diff_26.txt
+$SRC_H5DIFF_TESTFILES/h5diff_27.txt
+$SRC_H5DIFF_TESTFILES/h5diff_28.txt
+$SRC_H5DIFF_TESTFILES/h5diff_30.txt
+$SRC_H5DIFF_TESTFILES/h5diff_300.txt
+$SRC_H5DIFF_TESTFILES/h5diff_400.txt
+$SRC_H5DIFF_TESTFILES/h5diff_401.txt
+$SRC_H5DIFF_TESTFILES/h5diff_402.txt
+$SRC_H5DIFF_TESTFILES/h5diff_403.txt
+$SRC_H5DIFF_TESTFILES/h5diff_404.txt
+$SRC_H5DIFF_TESTFILES/h5diff_405.txt
+$SRC_H5DIFF_TESTFILES/h5diff_406.txt
+$SRC_H5DIFF_TESTFILES/h5diff_407.txt
+$SRC_H5DIFF_TESTFILES/h5diff_408.txt
+$SRC_H5DIFF_TESTFILES/h5diff_409.txt
+$SRC_H5DIFF_TESTFILES/h5diff_410.txt
+$SRC_H5DIFF_TESTFILES/h5diff_411.txt
+$SRC_H5DIFF_TESTFILES/h5diff_412.txt
+$SRC_H5DIFF_TESTFILES/h5diff_413.txt
+$SRC_H5DIFF_TESTFILES/h5diff_414.txt
+$SRC_H5DIFF_TESTFILES/h5diff_415.txt
+$SRC_H5DIFF_TESTFILES/h5diff_416.txt
+$SRC_H5DIFF_TESTFILES/h5diff_417.txt
+$SRC_H5DIFF_TESTFILES/h5diff_418.txt
+$SRC_H5DIFF_TESTFILES/h5diff_419.txt
+$SRC_H5DIFF_TESTFILES/h5diff_420.txt
+$SRC_H5DIFF_TESTFILES/h5diff_421.txt
+$SRC_H5DIFF_TESTFILES/h5diff_422.txt
+$SRC_H5DIFF_TESTFILES/h5diff_423.txt
+$SRC_H5DIFF_TESTFILES/h5diff_424.txt
+$SRC_H5DIFF_TESTFILES/h5diff_425.txt
+$SRC_H5DIFF_TESTFILES/h5diff_450.txt
+$SRC_H5DIFF_TESTFILES/h5diff_451.txt
+$SRC_H5DIFF_TESTFILES/h5diff_452.txt
+$SRC_H5DIFF_TESTFILES/h5diff_453.txt
+$SRC_H5DIFF_TESTFILES/h5diff_454.txt
+$SRC_H5DIFF_TESTFILES/h5diff_455.txt
+$SRC_H5DIFF_TESTFILES/h5diff_456.txt
+$SRC_H5DIFF_TESTFILES/h5diff_457.txt
+$SRC_H5DIFF_TESTFILES/h5diff_458.txt
+$SRC_H5DIFF_TESTFILES/h5diff_459.txt
+$SRC_H5DIFF_TESTFILES/h5diff_465.txt
+$SRC_H5DIFF_TESTFILES/h5diff_466.txt
+$SRC_H5DIFF_TESTFILES/h5diff_467.txt
+$SRC_H5DIFF_TESTFILES/h5diff_468.txt
+$SRC_H5DIFF_TESTFILES/h5diff_469.txt
+$SRC_H5DIFF_TESTFILES/h5diff_471.txt
+$SRC_H5DIFF_TESTFILES/h5diff_472.txt
+$SRC_H5DIFF_TESTFILES/h5diff_473.txt
+$SRC_H5DIFF_TESTFILES/h5diff_474.txt
+$SRC_H5DIFF_TESTFILES/h5diff_475.txt
+$SRC_H5DIFF_TESTFILES/h5diff_480.txt
+$SRC_H5DIFF_TESTFILES/h5diff_481.txt
+$SRC_H5DIFF_TESTFILES/h5diff_482.txt
+$SRC_H5DIFF_TESTFILES/h5diff_483.txt
+$SRC_H5DIFF_TESTFILES/h5diff_484.txt
+$SRC_H5DIFF_TESTFILES/h5diff_485.txt
+$SRC_H5DIFF_TESTFILES/h5diff_486.txt
+$SRC_H5DIFF_TESTFILES/h5diff_487.txt
+$SRC_H5DIFF_TESTFILES/h5diff_50.txt
+$SRC_H5DIFF_TESTFILES/h5diff_51.txt
+$SRC_H5DIFF_TESTFILES/h5diff_52.txt
+$SRC_H5DIFF_TESTFILES/h5diff_53.txt
+$SRC_H5DIFF_TESTFILES/h5diff_54.txt
+$SRC_H5DIFF_TESTFILES/h5diff_55.txt
+$SRC_H5DIFF_TESTFILES/h5diff_56.txt
+$SRC_H5DIFF_TESTFILES/h5diff_57.txt
+$SRC_H5DIFF_TESTFILES/h5diff_58.txt
+$SRC_H5DIFF_TESTFILES/h5diff_59.txt
+$SRC_H5DIFF_TESTFILES/h5diff_500.txt
+$SRC_H5DIFF_TESTFILES/h5diff_501.txt
+$SRC_H5DIFF_TESTFILES/h5diff_502.txt
+$SRC_H5DIFF_TESTFILES/h5diff_503.txt
+$SRC_H5DIFF_TESTFILES/h5diff_504.txt
+$SRC_H5DIFF_TESTFILES/h5diff_505.txt
+$SRC_H5DIFF_TESTFILES/h5diff_506.txt
+$SRC_H5DIFF_TESTFILES/h5diff_507.txt
+$SRC_H5DIFF_TESTFILES/h5diff_508.txt
+$SRC_H5DIFF_TESTFILES/h5diff_509.txt
+$SRC_H5DIFF_TESTFILES/h5diff_510.txt
+$SRC_H5DIFF_TESTFILES/h5diff_511.txt
+$SRC_H5DIFF_TESTFILES/h5diff_512.txt
+$SRC_H5DIFF_TESTFILES/h5diff_513.txt
+$SRC_H5DIFF_TESTFILES/h5diff_514.txt
+$SRC_H5DIFF_TESTFILES/h5diff_515.txt
+$SRC_H5DIFF_TESTFILES/h5diff_516.txt
+$SRC_H5DIFF_TESTFILES/h5diff_517.txt
+$SRC_H5DIFF_TESTFILES/h5diff_518.txt
+$SRC_H5DIFF_TESTFILES/h5diff_530.txt
+$SRC_H5DIFF_TESTFILES/h5diff_540.txt
+$SRC_H5DIFF_TESTFILES/h5diff_60.txt
+$SRC_H5DIFF_TESTFILES/h5diff_61.txt
+$SRC_H5DIFF_TESTFILES/h5diff_62.txt
+$SRC_H5DIFF_TESTFILES/h5diff_63.txt
+$SRC_H5DIFF_TESTFILES/h5diff_600.txt
+$SRC_H5DIFF_TESTFILES/h5diff_601.txt
+$SRC_H5DIFF_TESTFILES/h5diff_603.txt
+$SRC_H5DIFF_TESTFILES/h5diff_604.txt
+$SRC_H5DIFF_TESTFILES/h5diff_605.txt
+$SRC_H5DIFF_TESTFILES/h5diff_606.txt
+$SRC_H5DIFF_TESTFILES/h5diff_607.txt
+$SRC_H5DIFF_TESTFILES/h5diff_608.txt
+$SRC_H5DIFF_TESTFILES/h5diff_609.txt
+$SRC_H5DIFF_TESTFILES/h5diff_610.txt
+$SRC_H5DIFF_TESTFILES/h5diff_612.txt
+$SRC_H5DIFF_TESTFILES/h5diff_613.txt
+$SRC_H5DIFF_TESTFILES/h5diff_614.txt
+$SRC_H5DIFF_TESTFILES/h5diff_615.txt
+$SRC_H5DIFF_TESTFILES/h5diff_616.txt
+$SRC_H5DIFF_TESTFILES/h5diff_617.txt
+$SRC_H5DIFF_TESTFILES/h5diff_618.txt
+$SRC_H5DIFF_TESTFILES/h5diff_619.txt
+$SRC_H5DIFF_TESTFILES/h5diff_621.txt
+$SRC_H5DIFF_TESTFILES/h5diff_622.txt
+$SRC_H5DIFF_TESTFILES/h5diff_623.txt
+$SRC_H5DIFF_TESTFILES/h5diff_624.txt
+$SRC_H5DIFF_TESTFILES/h5diff_625.txt
+$SRC_H5DIFF_TESTFILES/h5diff_626.txt
+$SRC_H5DIFF_TESTFILES/h5diff_627.txt
+$SRC_H5DIFF_TESTFILES/h5diff_628.txt
+$SRC_H5DIFF_TESTFILES/h5diff_629.txt
+$SRC_H5DIFF_TESTFILES/h5diff_630.txt
+$SRC_H5DIFF_TESTFILES/h5diff_631.txt
+$SRC_H5DIFF_TESTFILES/h5diff_640.txt
+$SRC_H5DIFF_TESTFILES/h5diff_641.txt
+$SRC_H5DIFF_TESTFILES/h5diff_642.txt
+$SRC_H5DIFF_TESTFILES/h5diff_643.txt
+$SRC_H5DIFF_TESTFILES/h5diff_644.txt
+$SRC_H5DIFF_TESTFILES/h5diff_645.txt
+$SRC_H5DIFF_TESTFILES/h5diff_646.txt
+$SRC_H5DIFF_TESTFILES/h5diff_70.txt
+$SRC_H5DIFF_TESTFILES/h5diff_700.txt
+$SRC_H5DIFF_TESTFILES/h5diff_701.txt
+$SRC_H5DIFF_TESTFILES/h5diff_702.txt
+$SRC_H5DIFF_TESTFILES/h5diff_703.txt
+$SRC_H5DIFF_TESTFILES/h5diff_704.txt
+$SRC_H5DIFF_TESTFILES/h5diff_705.txt
+$SRC_H5DIFF_TESTFILES/h5diff_706.txt
+$SRC_H5DIFF_TESTFILES/h5diff_707.txt
+$SRC_H5DIFF_TESTFILES/h5diff_708.txt
+$SRC_H5DIFF_TESTFILES/h5diff_709.txt
+$SRC_H5DIFF_TESTFILES/h5diff_710.txt
+$SRC_H5DIFF_TESTFILES/h5diff_80.txt
+$SRC_H5DIFF_TESTFILES/h5diff_90.txt
+$SRC_H5DIFF_TESTFILES/h5diff_tmp1.txt
+$SRC_H5DIFF_TESTFILES/h5diff_tmp2.txt
+$SRC_H5DIFF_TESTFILES/h5diff_v1.txt
+$SRC_H5DIFF_TESTFILES/h5diff_v2.txt
+$SRC_H5DIFF_TESTFILES/h5diff_v3.txt
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_HDF5_VDS_TEST_FILES $LIST_OTHER_TEST_FILES $LIST_HDF5_TEST_FILES_XML $LIST_OTHER_TEST_FILES_XML"
+
+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=$SRC_H5DIFF_TESTFILES
+    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
+        # files in $LIST_HDF5_VDS_TEST_FILES are copied in from a different
+        # directory, so when srcdir is the same as destdir and $TESTDIR is
+        # not deleted, the copy n $TESTDIR of each file from
+        # $LIST_HDF5_VDS_TEST_FILES will need to be deleted.
+        for tstfile in $LIST_HDF5_VDS_TEST_FILES
+        do
+            # ignore '#' comment
+            echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+            RET=$?
+            if [ $RET -eq 1 ]; then
+                fname=`basename $tstfile`
+                rm $TESTDIR/$fname
+            fi
+        done
+    fi
+}
+
+# Parse option
+#   -p   run ph5diff tests
+#   -h   print help page
+while [ $# -gt 0 ]; do
+    case "$1" in
+    -p)    # reset the tool name and bin to run ph5diff tests
+    TESTNAME=ph5diff
+    H5DIFF=../../src/h5diff/ph5diff  # The tool name
+    H5DIFF_BIN=`pwd`/$H5DIFF    # The path of the tool binary
+    pmode=yes
+    shift
+    ;;
+    -h) # print help page
+    echo "$0 [-p] [-h]"
+    echo "    -p   run ph5diff tests"
+    echo "    -h   print help page"
+    shift
+    exit 0
+    ;;
+    *)  # unknown option
+        echo "$0: Unknown option ($1)"
+    exit 1
+    ;;
+    esac
+done
+
+# 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
+
+# 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.
+#
+# Need eval before the RUNCMD command because some machines like
+# AIX, has RUNPARALLEL in the style as
+#   MP_PROCS=3 MP_TASKS_PER_NODE=3 poe ./a.out
+# that throws the shell script off.
+#
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .txt`.out"
+    actual_err="$TESTDIR/`basename $1 .txt`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+    if test -n "$pmode"; then
+        RUNCMD=$RUNPARALLEL
+    else
+        RUNCMD=$RUNSERIAL
+    fi
+
+    # Run test.
+    TESTING $H5DIFF $@
+    (
+    #echo "#############################"
+    #echo "Expected output for '$H5DIFF $@'"
+    #echo "#############################"
+    cd $TESTDIR
+    eval $RUNCMD $H5DIFF_BIN "$@"
+    ) >$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
+    # 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
+    # serial mode, so the test is fullfilled.
+    if test $h5haveexitcode = 'yes' -a -z "$pmode"; then
+      echo "EXIT CODE: $EXIT_CODE" >> $actual
+    fi
+
+    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"
+    elif test $h5haveexitcode = 'yes' -a -z "$pmode"; then
+        echo "*FAILED*"
+        echo "    Expected result ($expect) differs from actual result ($actual)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    else
+        # 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
+        actual_sorted=actual_sorted
+        sort $expect -o $expect_sorted
+        sort $actual -o $actual_sorted
+        # remove "EXIT CODE:" line from expect file. test for exit code
+        # is done by serial mode.
+        grep -v "EXIT CODE:" $expect_sorted > $expect_sorted.noexit
+        mv $expect_sorted.noexit $expect_sorted
+    if $CMP $expect_sorted $actual_sorted; then
+        echo " PASSED"
+    else
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+        if test yes = "$verbose"; then
+        echo "====Expected result ($expect_sorted) differs from actual result ($actual_sorted)"
+        $DIFF $expect_sorted $actual_sorted |sed 's/^/    /'
+        echo "====The actual output ($actual_sav)"
+        sed 's/^/    /' < $actual_sav
+        echo "====The actual stderr ($actual_err_sav)"
+        sed 's/^/    /' < $actual_err_sav
+        echo "====End of actual stderr ($actual_err_sav)"
+        echo ""
+        fi
+    fi
+    fi
+
+    # 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
+    fi
+}
+
+
+# Print a "SKIP" message
+SKIP() {
+   TESTING $H5DIFF $@
+    echo  " -SKIP-"
+}
+
+
+
+##############################################################################
+# 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
+# is done first in
+# TESTING with the name only of the test file $TOOL, not its full path $TESTFILE
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# ############################################################################
+# # Common usage
+# ############################################################################
+
+# 1.0
+TOOLTEST h5diff_10.txt -h
+
+# 1.1 normal mode
+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
+
+# 1.4 report  mode with objects
+TOOLTEST h5diff_14.txt  -r h5diff_basic1.h5 h5diff_basic2.h5 g1/dset1 g1/dset2
+
+# 1.5 with -d
+TOOLTEST h5diff_15.txt --report --delta=5 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 1.6.1 with -p (int)
+TOOLTEST h5diff_16_1.txt -v -p 0.02 h5diff_basic1.h5 h5diff_basic1.h5 g1/dset5 g1/dset6
+
+# 1.6.2 with -p (unsigned long_long)
+TOOLTEST h5diff_16_2.txt --verbose --relative=0.02 h5diff_basic1.h5 h5diff_basic1.h5 g1/dset7 g1/dset8
+
+# 1.6.3 with -p (double)
+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
+
+# 1.7 test 32-bit INFINITY
+TOOLTEST h5diff_171.txt -v h5diff_basic1.h5 h5diff_basic1.h5 /g1/fp19 /g1/fp19_COPY
+
+# 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 -v and -q
+TOOLTEST h5diff_18_1.txt -v -q h5diff_basic1.h5 h5diff_basic2.h5
+
+
+# ##############################################################################
+# # not comparable types
+# ##############################################################################
+
+# 2.0
+TOOLTEST h5diff_20.txt -v h5diff_types.h5 h5diff_types.h5  dset g1
+
+# 2.1
+TOOLTEST h5diff_21.txt -v h5diff_types.h5 h5diff_types.h5 dset l1
+
+# 2.2
+TOOLTEST h5diff_22.txt -v  h5diff_types.h5 h5diff_types.h5 dset t1
+
+# ##############################################################################
+# # compare groups, types, links (no differences and differences)
+# ##############################################################################
+
+# 2.3
+TOOLTEST h5diff_23.txt -v h5diff_types.h5 h5diff_types.h5 g1 g1
+
+# 2.4
+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
+
+# 2.6
+TOOLTEST h5diff_26.txt -v h5diff_types.h5 h5diff_types.h5 g1 g2
+
+# 2.7
+TOOLTEST h5diff_27.txt -v h5diff_types.h5 h5diff_types.h5 t1 t2
+
+# 2.8
+TOOLTEST h5diff_28.txt -v h5diff_types.h5 h5diff_types.h5 l1 l2
+
+
+# ##############################################################################
+# # Enum value tests (may become more comprehensive in the future)
+# ##############################################################################
+
+# 3.0
+# test enum types which may have invalid values
+TOOLTEST h5diff_30.txt -v h5diff_enum_invalid_values.h5 h5diff_enum_invalid_values.h5 dset1 dset2
+
+
+# ##############################################################################
+# # Dataset datatypes
+# ##############################################################################
+
+# 5.0
+TOOLTEST h5diff_50.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset0a dset0b
+
+# 5.1
+TOOLTEST h5diff_51.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset1a dset1b
+
+# 5.2
+TOOLTEST h5diff_52.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset2a dset2b
+
+# 5.3
+TOOLTEST h5diff_53.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset3a dset4b
+
+# 5.4
+TOOLTEST h5diff_54.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset4a dset4b
+
+# 5.5
+TOOLTEST h5diff_55.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset5a dset5b
+
+# 5.6
+TOOLTEST h5diff_56.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset6a dset6b
+
+# 5.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
+# ( HDDFV-7942 )
+TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b
+
+# Strings
+# ( HDFFV-10128 )
+TOOLTEST h5diff_60.txt -v diff_strings1.h5 diff_strings2.h5 string1 string1
+TOOLTEST h5diff_61.txt -v diff_strings1.h5 diff_strings2.h5 string2 string2
+TOOLTEST h5diff_62.txt -v diff_strings1.h5 diff_strings2.h5 string3 string3
+TOOLTEST h5diff_63.txt -v diff_strings1.h5 diff_strings2.h5 string4 string4
+
+# ##############################################################################
+# # Error messages
+# ##############################################################################
+
+
+# 6.0: Check if the command line number of arguments is less than 3
+TOOLTEST h5diff_600.txt h5diff_basic1.h5
+
+# 6.1: Check if non-exist object name is specified
+TOOLTEST h5diff_601.txt h5diff_basic1.h5 h5diff_basic1.h5 nono_obj
+
+
+# ##############################################################################
+# # -d
+# ##############################################################################
+
+
+# 6.3: negative value
+TOOLTEST h5diff_603.txt -d -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.4: zero
+TOOLTEST h5diff_604.txt -d 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.5: non number
+TOOLTEST h5diff_605.txt -d u h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.6: hexadecimal
+TOOLTEST h5diff_606.txt -d 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.7: string
+TOOLTEST h5diff_607.txt -d "1" h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 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
+TOOLTEST h5diff_609.txt -d 200 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.10: number smaller than smallest difference
+TOOLTEST h5diff_610.txt -d 1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+
+# ##############################################################################
+# # -p
+# ##############################################################################
+
+
+# 6.12: negative value
+TOOLTEST h5diff_612.txt -p -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.13: zero
+TOOLTEST h5diff_613.txt -p 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.14: non number
+TOOLTEST h5diff_614.txt -p u h5diff_basic1.h5 h5diff_basic2.h5  g1/dset3 g1/dset4
+
+# 6.15: hexadecimal
+TOOLTEST h5diff_615.txt -p 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.16: string
+TOOLTEST h5diff_616.txt -p "0.21" h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.17: repeated option
+TOOLTEST h5diff_617.txt -p 0.21 -p 0.22 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.18: number larger than biggest difference
+TOOLTEST h5diff_618.txt -p 2 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.19: number smaller than smallest difference
+TOOLTEST h5diff_619.txt -p 0.005 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# ##############################################################################
+# # -n
+# ##############################################################################
+
+# 6.21: negative value
+TOOLTEST h5diff_621.txt -n -4 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.22: zero
+TOOLTEST h5diff_622.txt -n 0 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.23: non number
+TOOLTEST h5diff_623.txt -n u h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.24: hexadecimal
+TOOLTEST h5diff_624.txt -n 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.25: string
+TOOLTEST h5diff_625.txt -n "2" h5diff_basic1.h5 h5diff_basic2.h5  g1/dset3 g1/dset4
+
+# 6.26: repeated option
+TOOLTEST h5diff_626.txt -n 2 -n 3 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.27: number larger than biggest difference
+TOOLTEST h5diff_627.txt --count=200 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# 6.28: number smaller than smallest difference
+TOOLTEST h5diff_628.txt -n 1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
+
+# Disabling this test as it hangs - LRK 20090618
+# 6.29  non valid files
+#TOOLTEST h5diff_629.txt file1.h6 file2.h6
+
+# ##############################################################################
+# # NaN
+# ##############################################################################
+# 6.30: test (NaN == NaN) must be true based on our documentation -- XCAO
+TOOLTEST h5diff_630.txt -v -d "0.0001" h5diff_basic1.h5 h5diff_basic1.h5 g1/fp18 g1/fp18_COPY
+TOOLTEST h5diff_631.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/fp18 g1/fp18_COPY
+
+
+# ##############################################################################
+# 7.  attributes
+# ##############################################################################
+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
+TOOLTEST h5diff_tmp2.txt tmpSingleSiteBethe.output.h5 tmpSingleSiteBethe.reference.h5
+
+# ##################################################
+#  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
+
+# same attr number , all same attr name
+TOOLTEST h5diff_704.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g
+
+# same attr number , some same attr name
+TOOLTEST h5diff_705.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /dset
+
+# same attr number , all different attr name
+TOOLTEST h5diff_706.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /ntype
+
+# 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
+TOOLTEST h5diff_708.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g3
+
+# when no attributes exist in both objects
+TOOLTEST h5diff_709.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g4
+
+# file vs file
+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
+
+# 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
+
+# 11. floating point comparison
+# double value
+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
+
+# 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
+
+# not comparable -c flag
+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_202.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset2  g2/dset3
+
+TOOLTEST h5diff_203.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset3  g2/dset4
+
+TOOLTEST h5diff_204.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset4  g2/dset5
+
+TOOLTEST h5diff_205.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset5  g2/dset6
+
+# not comparable in compound
+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
+
+# 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
+
+# comparable dataset with non-comparable attribute and other comparable attributes.
+# All the comparables should display differences.
+TOOLTEST h5diff_221.txt -c non_comparables1.h5 non_comparables2.h5 /g2
+
+# entire file
+# All the comparables should display differences.
+TOOLTEST h5diff_222.txt -c non_comparables1.h5 non_comparables2.h5
+
+# non-comparable test for common objects (same name) with different object types
+# (HDFFV-7644)
+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
+# ##############################################################################
+# test for bug1749
+TOOLTEST h5diff_300.txt -v h5diff_links.h5 h5diff_links.h5 /link_g1 /link_g2
+
+# ##############################################################################
+# # Links compare with --follow-symlinks Only
+# ##############################################################################
+# soft links file to file
+TOOLTEST h5diff_400.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5
+
+# softlink vs dset"
+TOOLTEST h5diff_401.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset1_1 /target_dset2
+
+# dset vs softlink"
+TOOLTEST h5diff_402.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /target_dset2 /softlink_dset1_1
+
+# softlink vs softlink"
+TOOLTEST h5diff_403.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset1_1 /softlink_dset2
+
+# extlink vs extlink (FILE)"
+TOOLTEST h5diff_404.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5
+
+# extlink vs dset"
+TOOLTEST h5diff_405.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_trg.h5 /ext_link_dset1 /target_group2/x_dset
+
+# dset vs extlink"
+TOOLTEST h5diff_406.txt --follow-symlinks -v h5diff_extlink_trg.h5 h5diff_extlink_src.h5 /target_group2/x_dset /ext_link_dset1
+
+# extlink vs extlink"
+TOOLTEST h5diff_407.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_dset2
+
+# softlink vs extlink"
+TOOLTEST h5diff_408.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_extlink_src.h5 /softlink_dset1_1 /ext_link_dset2
+
+# extlink vs softlink "
+TOOLTEST h5diff_409.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_softlinks.h5 /ext_link_dset2 /softlink_dset1_1
+
+# linked_softlink vs linked_softlink (FILE)"
+TOOLTEST h5diff_410.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5
+
+# dset2 vs linked_softlink_dset1"
+TOOLTEST h5diff_411.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /target_dset2 /softlink1_to_slink2
+
+# linked_softlink_dset1 vs dset2"
+TOOLTEST h5diff_412.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink1_to_slink2 /target_dset2
+
+# linked_softlink_to_dset1 vs linked_softlink_to_dset2"
+TOOLTEST h5diff_413.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink1_to_slink2 /softlink2_to_slink2
+
+# group vs linked_softlink_group1"
+TOOLTEST h5diff_414.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /target_group /softlink3_to_slink2
+
+# linked_softlink_group1 vs group"
+TOOLTEST h5diff_415.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink3_to_slink2 /target_group
+
+# linked_softlink_to_group1 vs linked_softlink_to_group2"
+TOOLTEST h5diff_416.txt --follow-symlinks -v h5diff_linked_softlink.h5 h5diff_linked_softlink.h5 /softlink3_to_slink2 /softlink4_to_slink2
+
+# non-exist-softlink vs softlink"
+TOOLTEST h5diff_417.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_noexist /softlink_dset2
+
+# softlink vs non-exist-softlink"
+TOOLTEST h5diff_418.txt --follow-symlinks -v h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset2 /softlink_noexist
+
+# non-exist-extlink_file vs extlink"
+TOOLTEST h5diff_419.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_noexist2 /ext_link_dset2
+
+# exlink vs non-exist-extlink_file"
+TOOLTEST h5diff_420.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset2 /ext_link_noexist2
+
+# extlink vs non-exist-extlink_obj"
+TOOLTEST h5diff_421.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset2 /ext_link_noexist1
+
+# non-exist-extlink_obj vs extlink"
+TOOLTEST h5diff_422.txt --follow-symlinks -v h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_noexist1 /ext_link_dset2
+
+# extlink_to_softlink_to_dset1 vs dset2"
+TOOLTEST h5diff_423.txt --follow-symlinks -v h5diff_ext2softlink_src.h5 h5diff_ext2softlink_trg.h5 /ext_link_to_slink1 /dset2
+
+# dset2 vs extlink_to_softlink_to_dset1"
+TOOLTEST h5diff_424.txt --follow-symlinks -v h5diff_ext2softlink_trg.h5 h5diff_ext2softlink_src.h5 /dset2 /ext_link_to_slink1
+
+# extlink_to_softlink_to_dset1 vs extlink_to_softlink_to_dset2"
+TOOLTEST h5diff_425.txt --follow-symlinks -v h5diff_ext2softlink_src.h5 h5diff_ext2softlink_src.h5 /ext_link_to_slink1 /ext_link_to_slink2
+
+# ##############################################################################
+# # Dangling links compare (--follow-symlinks and --no-dangling-links)
+# ##############################################################################
+# dangling links --follow-symlinks (FILE to FILE)
+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
+
+# 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
+
+# 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
+
+# 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
+
+# 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
+
+# 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
+
+# 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
+
+# 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
+
+# dangling link --follow-symlinks (obj vs obj)
+# (HDFFV-7836)
+TOOLTEST h5diff_465.txt --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1
+# (HDFFV-7835)
+# soft dangling vs. soft dangling
+TOOLTEST h5diff_466.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1
+# 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
+# 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
+# (HDFFV-7998)
+# 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
+TOOLTEST h5diff_473.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link4
+TOOLTEST h5diff_474.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4
+TOOLTEST h5diff_475.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link1
+
+# ##############################################################################
+# # test for group diff recursivly
+# ##############################################################################
+# 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 / /
+
+# root vs group
+TOOLTEST h5diff_502.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 / /grp1/grp2/grp3
+
+# group vs group (same name and structure)
+TOOLTEST h5diff_503.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /grp1
+
+# group vs group (different name and structure)
+TOOLTEST h5diff_504.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1/grp2 /grp1/grp2/grp3
+
+# groups vs soft-link
+TOOLTEST h5diff_505.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /slink_grp1
+TOOLTEST h5diff_506.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1/grp2 /slink_grp2
+
+# groups vs ext-link
+TOOLTEST h5diff_507.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /elink_grp1
+TOOLTEST h5diff_508.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp1 /elink_grp1
+
+# soft-link vs ext-link
+TOOLTEST h5diff_509.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp1 /elink_grp1
+TOOLTEST h5diff_510.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp1 /elink_grp1
+
+# circled ext links
+TOOLTEST h5diff_511.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp10 /grp11
+TOOLTEST h5diff_512.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /grp10 /grp11
+
+# circled soft2ext-link vs soft2ext-link
+TOOLTEST h5diff_513.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp10 /slink_grp11
+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
+# With follow-symlinks, file h5diff_grp_recurse_ext1.h5 and h5diff_grp_recurse_ext2-1.h5 should
+# be same with the external links.
+###############################################################################
+# file vs file
+TOOLTEST h5diff_515.txt -v h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5
+TOOLTEST h5diff_516.txt -v --follow-symlinks h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5
+# group vs group
+TOOLTEST h5diff_517.txt -v h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5 /g1
+TOOLTEST h5diff_518.txt -v --follow-symlinks h5diff_grp_recurse_ext1.h5 h5diff_grp_recurse_ext2-1.h5 /g1
+
+# ##############################################################################
+# # Exclude objects (--exclude-path)
+# ##############################################################################
+#
+# Same structure, same names and different value.
+#
+# Exclude the object with different value. Expect return - same
+TOOLTEST h5diff_480.txt -v --exclude-path /group1/dset3 h5diff_exclude1-1.h5 h5diff_exclude1-2.h5
+# Verify different by not excluding. Expect return - diff
+TOOLTEST h5diff_481.txt -v h5diff_exclude1-1.h5 h5diff_exclude1-2.h5
+
+#
+# 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
+# Exclude only some different objects. Expect return - diff
+TOOLTEST h5diff_483.txt -v --exclude-path "/group1" h5diff_exclude2-1.h5 h5diff_exclude2-2.h5
+
+# Exclude from group compare
+TOOLTEST h5diff_484.txt -v --exclude-path "/dset3" h5diff_exclude1-1.h5 h5diff_exclude1-2.h5 /group1
+
+#
+# Only one file contains unique objs. Common objs are same.
+# (HDFFV-7837)
+#
+TOOLTEST h5diff_485.txt -v --exclude-path "/group1" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5
+TOOLTEST h5diff_486.txt -v --exclude-path "/group1" h5diff_exclude3-2.h5 h5diff_exclude3-1.h5
+TOOLTEST h5diff_487.txt -v --exclude-path "/group1/dset" h5diff_exclude3-1.h5 h5diff_exclude3-2.h5
+
+
+# ##############################################################################
+# # diff various multiple vlen and fixed strings in a compound type dataset
+# ##############################################################################
+TOOLTEST h5diff_530.txt -v  h5diff_comp_vl_strs.h5 h5diff_comp_vl_strs.h5 /group /group_copy
+
+# ##############################################################################
+# # Test container types (array,vlen) with multiple nested compound types
+# # Complex compound types in dataset and attribute
+# ##############################################################################
+TOOLTEST h5diff_540.txt -v compounds_array_vlen1.h5 compounds_array_vlen2.h5
+
+# ##############################################################################
+# # Test mutually exclusive options
+# ##############################################################################
+#
+# 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
+TOOLTEST h5diff_643.txt -v -d 5 --use-system-epsilon h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
+TOOLTEST h5diff_644.txt -v --use-system-epsilon -d 5 h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
+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
+# ##############################################################################
+
+# 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/test/h5diff/testph5diff.sh.in b/tools/test/h5diff/testph5diff.sh.in
new file mode 100644
index 0000000..b726a80
--- /dev/null
+++ b/tools/test/h5diff/testph5diff.sh.in
@@ -0,0 +1,62 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+srcdir=@srcdir@
+
+TESTNAME=ph5diff
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+TOOL=testh5diff.sh
+
+nerrors=0
+
+# 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'
+}
+
+# Run a test.  If a test fails then increment the `nerrors' global variable.
+#
+TOOLTEST() {
+    # Run test.
+    echo $TOOL "$@"
+    /bin/sh $TOOL "$@"
+
+    # Check if the command failed and increment nerrors if so.
+    if test $? -ne 0 ; then
+        nerrors="`expr $nerrors + 1`"
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+
+# Invoke the regular h5diff testing script, with the -p parameter to indicate
+#       that it should run the parallel version of the tests
+TOOLTEST -p
+
+# no need to print any message since this is just a shell to invoke
+# testh5diff.sh which has already printed the result.  Just exit.
+if test $nerrors -eq 0 ; then
+    exit $EXIT_SUCCESS
+else
+    exit $EXIT_FAILURE
+fi
diff --git a/tools/test/h5dump/CMakeLists.txt b/tools/test/h5dump/CMakeLists.txt
new file mode 100644
index 0000000..89c7534
--- /dev/null
+++ b/tools/test/h5dump/CMakeLists.txt
@@ -0,0 +1,56 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5DUMP)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  #-----------------------------------------------------------------------------
+  # If plugin library tests can be tested
+  #-----------------------------------------------------------------------------
+  set (HDF5_TOOL_PLUGIN_LIB_CORENAME         "dynlibdump")
+  set (HDF5_TOOL_PLUGIN_LIB_NAME             "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_CORENAME}")
+  set (HDF5_TOOL_PLUGIN_LIB_TARGET           ${HDF5_TOOL_PLUGIN_LIB_CORENAME})
+  add_definitions (${HDF_EXTRA_C_FLAGS})
+  INCLUDE_DIRECTORIES (${HDF5_SRC_DIR})
+
+  add_library (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_dump.c)
+  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED " " " ")
+  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})
+
+  # make plugins dir
+  file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins")
+  #-----------------------------------------------------------------------------
+  # Copy plugin library to a plugins folder
+  #-----------------------------------------------------------------------------
+  add_custom_command (
+      TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different
+          "$<TARGET_FILE:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
+          "${CMAKE_BINARY_DIR}/plugins/$<TARGET_FILE_NAME:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
+  )
+
+  # --------------------------------------------------------------------
+  # Add the h5dump test executable
+  # --------------------------------------------------------------------
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5dumpgentest ${HDF5_TOOLS_TEST_H5DUMP_SOURCE_DIR}/h5dumpgentest.c)
+    TARGET_NAMING (h5dumpgentest STATIC)
+    TARGET_C_PROPERTIES (h5dumpgentest STATIC " " " ")
+    target_link_libraries (h5dumpgentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+    set_target_properties (h5dumpgentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5dumpgentest COMMAND $<TARGET_FILE:h5dumpgentest>)
+  endif ()
+
+  include (CMakeTests.cmake)
+
+  include (CMakeTestsPBITS.cmake)
+
+  include (CMakeTestsVDS.cmake)
+
+  include (CMakeTestsXML.cmake)
diff --git a/tools/test/h5dump/CMakeTests.cmake b/tools/test/h5dump/CMakeTests.cmake
new file mode 100644
index 0000000..f17b116
--- /dev/null
+++ b/tools/test/h5dump/CMakeTests.cmake
@@ -0,0 +1,1468 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the test directory into the source directory
+  # --------------------------------------------------------------------
+  set (HDF5_REFERENCE_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/charsets.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/file_space.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/filter_fail.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/non_existing.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/packedbits.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2A.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2A0.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2B.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-4s.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-5s.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-6.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-7.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tall-7N.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tallfilters.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1_big.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray5.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray6.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray7.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tarray8.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattr-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattr-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattr-3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattr-4_be.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattrcontents1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattrcontents2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattrintsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattrreg.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tattrregR.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbin1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbin1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbin2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbin3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbin4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbinregR.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbigdims.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tbitnopaque.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tboot1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tboot2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tboot2A.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tboot2B.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tchar1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tchunked.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdattrintsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdintarray.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdints.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdintsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound_complex2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcomp-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcomp-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcomp-3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcomp-4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcompact.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcontents.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tcontiguos.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdatareg.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdataregR.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdeflate.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdset-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdset-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tdset-3s.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/texceedsubstart.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/texceedsubcount.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/texceedsubstride.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/texceedsubblock.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/texternal.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/textlinkfar.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/textlink.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tfill.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tfletcher32.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tfpformat.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-5.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/thyperslab.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicesno.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicessub1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicessub2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicessub3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicessub4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tindicesyes.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dims.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dimsBlock2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dimsBlockEq.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dimsCount2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dimsCountEq.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dimsStride2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tintsattrs.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tlarge_objname.ddl
+      #${HDF5_TOOLS_DIR}/testfiles/tldouble.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tlonglinks.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tloop-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tmultifile.ddl
+      #${HDF5_TOOLS_DIR}/testfiles/tqmarkfile.ddl
+      #${HDF5_TOOLS_DIR}/testfiles/tstarfile.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnamed_dtype_attr.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnestcomp-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcmpddt.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnbit.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnoattrdata.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnoattrddl.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnodata.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnoddl.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnoddlfile.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tno-subset.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tnullspace.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr5.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordercontents1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tordercontents2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderlinks1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/torderlinks2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tperror.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/trawdatafile.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/trawssetfile.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/treadfilter.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/treadintfilter.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/treference.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarattrintsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarintattrsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarintsize.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarstring.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tscaleoffset.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tshuffle.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tslink-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tslink-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tslink-D.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tsplit_file.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tstr-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tstr-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tstring.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tstring2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tstringe.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tszip.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tudfilter.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink-1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink-2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tuserfilter.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes3.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes4.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes5.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvlenstr_array.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvlstr.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/tvms.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/twidedisplay.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/twithddlfile.ddl
+      ${HDF5_TOOLS_DIR}/testfiles/h5dump-help.txt
+      ${HDF5_TOOLS_DIR}/testfiles/out3.h5import
+      ${HDF5_TOOLS_DIR}/testfiles/zerodim.ddl
+  )
+  set (HDF5_N_REFERENCE_FILES
+      tall-3
+      tattr-2
+      tcomp-2
+      thlink-4
+      thlink-5
+      tslink-2
+  )
+  set (HDF5_REFERENCE_EXP_FILES
+      tall-6.exp
+      tnoddlfile.exp
+      trawdatafile.exp
+      trawssetfile.exp
+      tstr2bin2.exp
+      tstr2bin6.exp
+      twithddl.exp
+      twithddlfile.exp
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/charsets.h5
+      ${HDF5_TOOLS_DIR}/testfiles/file_space.h5
+      ${HDF5_TOOLS_DIR}/testfiles/filter_fail.h5
+      ${HDF5_TOOLS_DIR}/testfiles/packedbits.h5
+      ${HDF5_TOOLS_DIR}/testfiles/taindices.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tall.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1_big.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray3.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray4.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray5.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray6.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray7.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray8.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattr2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattr4_be.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattrintsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattrreg.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tbigdims.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tbinary.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tbitnopaque.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tchar.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdattrintsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdintarray.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdints.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcmpdintsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound_complex.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound_complex2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdatareg.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdset.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlinkfar.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlinktar.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00000.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00001.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00002.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00003.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00004.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00005.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00006.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00007.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00008.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00009.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00010.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfcontents1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfcontents2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfilters.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfpformat.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfvalues.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.h5
+      ${HDF5_TOOLS_DIR}/testfiles/thlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/thyperslab.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tints4dims.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tintsattrs.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tlarge_objname.h5
+      #${HDF5_TOOLS_DIR}/testfiles/tldouble.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tlonglinks.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tloop.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-g.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-l.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-o.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-r.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmulti-s.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnamed_dtype_attr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcmpddt.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tno-subset.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnullspace.h5
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tordergr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarattrintsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarintattrsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarintsize.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tscalarstring.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tslink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsplit_file-m.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsplit_file-r.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr3.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tudfilter.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes3.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes4.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes5.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvlenstr_array.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvlstr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvms.h5
+      ${HDF5_TOOLS_DIR}/testfiles/zerodim.h5
+  )
+  set (HDF5_ERROR_REFERENCE_TEST_FILES
+      ${PROJECT_SOURCE_DIR}/errfiles/filter_fail.err
+      ${PROJECT_SOURCE_DIR}/errfiles/non_existing.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tall-1.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tall-2A.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tall-2A0.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tall-2B.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tarray1_big.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tattrregR.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tattr-3.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tcomp-3.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tdataregR.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tdset-2.err
+      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubblock.err
+      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubcount.err
+      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubstart.err
+      ${PROJECT_SOURCE_DIR}/errfiles/texceedsubstride.err
+      ${PROJECT_SOURCE_DIR}/errfiles/textlink.err
+      ${PROJECT_SOURCE_DIR}/errfiles/textlinkfar.err
+      ${PROJECT_SOURCE_DIR}/errfiles/textlinksrc.err
+      ${PROJECT_SOURCE_DIR}/errfiles/torderlinks1.err
+      ${PROJECT_SOURCE_DIR}/errfiles/torderlinks2.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tgroup-2.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tperror.err
+      ${PROJECT_SOURCE_DIR}/errfiles/tslink-D.err
+  )
+
+  # make test dir
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+
+  #
+  # copy test files from source dir to test dir
+  #
+  foreach (tst_h5_file ${HDF5_REFERENCE_TEST_FILES})
+    get_filename_component (fname "${tst_h5_file}" NAME)
+    HDFTEST_COPY_FILE("${tst_h5_file}" "${PROJECT_BINARY_DIR}/testfiles/std/${fname}" "h5dump_std_files")
+  endforeach ()
+
+  foreach (tst_exp_file ${HDF5_REFERENCE_EXP_FILES})
+    if (WIN32)
+      file (READ ${HDF5_TOOLS_DIR}/testfiles/${tst_exp_file} TEST_STREAM)
+      file (WRITE ${PROJECT_BINARY_DIR}/testfiles/std/${tst_exp_file} "${TEST_STREAM}")
+    else ()
+      HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${tst_exp_file}" "${PROJECT_BINARY_DIR}/testfiles/std/${tst_exp_file}" "h5dump_std_files")
+    endif ()
+  endforeach ()
+
+  foreach (tst_other_file ${HDF5_REFERENCE_FILES})
+    get_filename_component (fname "${tst_other_file}" NAME)
+    HDFTEST_COPY_FILE("${tst_other_file}" "${PROJECT_BINARY_DIR}/testfiles/std/${fname}" "h5dump_std_files")
+  endforeach ()
+  foreach (tst_h5N_file ${HDF5_N_REFERENCE_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${tst_h5N_file}.ddl" "${PROJECT_BINARY_DIR}/testfiles/std/${tst_h5N_file}-N.ddl" "h5dump_std_files")
+  endforeach ()
+
+  foreach (tst_error_file ${HDF5_ERROR_REFERENCE_TEST_FILES})
+    get_filename_component (fname "${tst_error_file}" NAME)
+    HDFTEST_COPY_FILE("${tst_error_file}" "${PROJECT_BINARY_DIR}/testfiles/std/${fname}" "h5dump_std_files")
+  endforeach ()
+
+  # --------------------------------------------------------------------
+  # Special file handling
+  # --------------------------------------------------------------------
+  HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tbin1.ddl" "${PROJECT_BINARY_DIR}/testfiles/std/tbin1LE.ddl" "h5dump_std_files")
+
+  if (WIN32)
+    file (READ ${HDF5_TOOLS_DIR}/testfiles/tbinregR.exp TEST_STREAM)
+    file (WRITE ${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp "${TEST_STREAM}")
+  else ()
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tbinregR.exp" "${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp" "h5dump_std_files")
+  endif ()
+  add_custom_target(h5dump_std_files ALL COMMENT "Copying files needed by h5dump_std tests" DEPENDS ${h5dump_std_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_HELP_TEST testname resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-${testname} COMMAND $<TARGET_FILE:h5dump> ${ARGN})
+      set_tests_properties (H5DUMP-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "H5DUMP-${testname}")
+    else ()
+      add_test (
+          NAME H5DUMP-h5dump-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -D "TEST_OUTPUT=h5dump-${testname}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=h5dump-${testname}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_SKIP_H5_TEST skipresultfile skipresultcode testtype)
+    if (${testtype} STREQUAL "SKIP")
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5DUMP-${skipresultfile}-SKIPPED
+            COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${skipresultfile} ${ARGN}"
+        )
+      endif ()
+    else ()
+      ADD_H5_TEST (${skipresultfile} ${skipresultcode} ${ARGN})
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_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}/testfiles/std")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DUMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.bin
+      )
+      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      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/std"
+              -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 ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_N resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-N-${resultfile} COMMAND $<TARGET_FILE:h5dump> ${ARGN})
+      set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DUMP-N-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}-N.bin
+      )
+      set_tests_properties (H5DUMP-N-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      add_test (
+          NAME H5DUMP-N-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -D "TEST_OUTPUT=${resultfile}-N.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}-N.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5DUMP-N-${resultfile} PROPERTIES DEPENDS "H5DUMP-N-${resultfile}-clear-objects")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_EXPORT resultfile targetfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> ${ARGN} ${resultfile}.txt ${targetfile})
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DUMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.txt
+      )
+      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      add_test (
+          NAME H5DUMP-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN};${resultfile}.txt;${targetfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -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")
+      add_test (
+          NAME H5DUMP-${resultfile}-output-cmp
+          COMMAND ${CMAKE_COMMAND}
+                -E compare_files ${resultfile}.txt ${resultfile}.exp
+      )
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile})
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_EXPORT_DDL resultfile targetfile resultcode ddlfile)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> --ddl=${ddlfile}.txt ${ARGN} ${resultfile}.txt ${targetfile})
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DUMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${ddlfile}.txt ${resultfile}.txt
+      )
+      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      add_test (
+          NAME H5DUMP-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=--ddl=${ddlfile}.txt;${ARGN};${resultfile}.txt;${targetfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -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")
+      add_test (
+          NAME H5DUMP-${resultfile}-output-cmp
+          COMMAND ${CMAKE_COMMAND}
+                -E compare_files ${resultfile}.txt ${resultfile}.exp
+      )
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp PROPERTIES DEPENDS H5DUMP-${resultfile})
+      add_test (
+          NAME H5DUMP-${resultfile}-output-cmp-ddl
+          COMMAND ${CMAKE_COMMAND}
+                -E compare_files ${ddlfile}.txt ${ddlfile}.exp
+      )
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp-ddl PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-${resultfile}-output-cmp-ddl PROPERTIES DEPENDS H5DUMP-${resultfile}-output-cmp)
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_EXPORT_TEST resultfile targetfile resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5DUMP-output-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.txt
+      )
+      set_tests_properties (H5DUMP-output-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      add_test (
+          NAME H5DUMP-output-${resultfile}
+          COMMAND $<TARGET_FILE:h5dump> ${ARGN} ${resultfile}.txt ${targetfile}
+      )
+      set_tests_properties (H5DUMP-output-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-output-${resultfile} PROPERTIES DEPENDS H5DUMP-output-${resultfile}-clear-objects)
+      add_test (
+          NAME H5DUMP-output-cmp-${resultfile}
+          COMMAND ${CMAKE_COMMAND}
+                -E compare_files ${resultfile}.txt ${resultfile}.exp
+      )
+      set_tests_properties (H5DUMP-output-cmp-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-output-cmp-${resultfile} PROPERTIES DEPENDS H5DUMP-output-${resultfile})
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_MASK_TEST resultfile resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      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/std"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -D "TEST_MASK_ERROR=true"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5ERR_MASK_TEST resultfile resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      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/std"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -D "TEST_ERRREF=${resultfile}.err"
+              -D "TEST_MASK_ERROR=true"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5ERR_MASK_ENV_TEST resultfile resultcode envvar envval)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      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/std"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -D "TEST_ERRREF=${resultfile}.err"
+              -D "TEST_MASK_ERROR=true"
+              -D "TEST_ENV_VAR:STRING=${envvar}"
+              -D "TEST_ENV_VALUE:STRING=${envval}"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_IMPORT conffile resultfile testfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5DUMP-IMPORT-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.bin ${resultfile}.h5
+      )
+      set_tests_properties (H5DUMP-IMPORT-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      add_test (
+          NAME H5DUMP-IMPORT-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN};-o;${resultfile}.bin;${testfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -D "TEST_OUTPUT=${conffile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${conffile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5DUMP-IMPORT-${resultfile} PROPERTIES DEPENDS "H5DUMP-IMPORT-${resultfile}-clear-objects")
+      add_test (NAME H5DUMP-IMPORT-h5import-${resultfile} COMMAND h5import ${resultfile}.bin -c ${conffile}.out -o ${resultfile}.h5)
+      set_tests_properties (H5DUMP-IMPORT-h5import-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-IMPORT-h5import-${resultfile} PROPERTIES DEPENDS H5DUMP-IMPORT-${resultfile})
+      add_test (NAME H5DUMP-IMPORT-h5diff-${resultfile} COMMAND h5diff ${testfile} ${resultfile}.h5 /integer /integer)
+      set_tests_properties (H5DUMP-IMPORT-h5diff-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+      set_tests_properties (H5DUMP-IMPORT-h5diff-${resultfile} PROPERTIES DEPENDS H5DUMP-IMPORT-h5import-${resultfile})
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_UD_TEST testname resultcode resultfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5DUMP_UD-${testname}-clearall-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              testfiles/std/${resultfile}.out
+              testfiles/std/${resultfile}.out.err
+      )
+      add_test (
+          NAME H5DUMP_UD-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/std"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5DUMP_UD-${testname} PROPERTIES DEPENDS H5DUMP_UD-${testname}-clearall-objects)
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          h5dump-help.out
+          charsets.out
+          charsets.out.err
+          file_space.out
+          file_space.out.err
+          filter_fail.out
+          filter_fail.out.err
+          non_existing.out
+          non_existing.out.err
+          packedbits.out
+          packedbits.out.err
+          tall-1.out
+          tall-1.out.err
+          tall-2.out
+          tall-2.out.err
+          tall-2A.out
+          tall-2A.out.err
+          tall-2A0.out
+          tall-2A0.out.err
+          tall-2B.out
+          tall-2B.out.err
+          tall-3.out
+          tall-3.out.err
+          tall-4s.out
+          tall-4s.out.err
+          tall-5s.out
+          tall-5s.out.err
+          tall-6.txt
+          tall-6.out
+          tall-6.out.err
+          tall-7.out
+          tall-7.out.err
+          tall-7N.out
+          tall-7N.out.err
+          tallfilters.out
+          tallfilters.out.err
+          tarray1.out
+          tarray1.out.err
+          tarray1_big.out
+          tarray1_big.out.err
+          tarray2.out
+          tarray2.out.err
+          tarray3.out
+          tarray3.out.err
+          tarray4.out
+          tarray4.out.err
+          tarray5.out
+          tarray5.out.err
+          tarray6.out
+          tarray6.out.err
+          tarray7.out
+          tarray7.out.err
+          tarray8.out
+          tarray8.out.err
+          tattr-1.out
+          tattr-1.out.err
+          tattr-2.out
+          tattr-2.out.err
+          tattr-3.out
+          tattr-3.out.err
+          tattr-4_be.out
+          tattr-4_be.out.err
+          tattrcontents1.out
+          tattrcontents1.out.err
+          tattrcontents2.out
+          tattrcontents2.out.err
+          tattrintsize.out
+          tattrintsize.out.err
+          tattrreg.out
+          tattrreg.out.err
+          tattrregR.out
+          tattrregR.out.err
+          tbin1LE.bin
+          tbinregR.txt
+          tbinregR.out
+          tbinregR.out.err
+          tbigdims.out
+          tbigdims.out.err
+          tbitnopaque.out
+          tbitnopaque.out.err
+          tboot1.out
+          tboot1.out.err
+          tboot2.out
+          tboot2.out.err
+          tboot2A.out
+          tboot2A.out.err
+          tboot2B.out
+          tboot2B.out.err
+          tchar1.out
+          tchar1.out.err
+          tchunked.out
+          tchunked.out.err
+          tcmpdattrintsize.out
+          tcmpdattrintsize.out.err
+          tcmpdintarray.out
+          tcmpdintarray.out.err
+          tcmpdints.out
+          tcmpdints.out.err
+          tcmpdintsize.out
+          tcmpdintsize.out.err
+          tcomp-1.out
+          tcomp-1.out.err
+          tcomp-2.out
+          tcomp-2.out.err
+          tcomp-3.out
+          tcomp-3.out.err
+          tcomp-4.out
+          tcomp-4.out.err
+          tcompact.out
+          tcompact.out.err
+          tcompound_complex.out
+          tcompound_complex.out.err
+          tcontents.out
+          tcontents.out.err
+          tcontiguos.out
+          tcontiguos.out.err
+          tdatareg.out
+          tdatareg.out.err
+          tdataregR.out
+          tdataregR.out.err
+          tdeflate.out
+          tdeflate.out.err
+          tdset-1.out
+          tdset-1.out.err
+          tdset-2.out
+          tdset-2.out.err
+          tdset-3s.out
+          tdset-3s.out.err
+          tempty.out
+          tempty.out.err
+          texternal.out
+          texternal.out.err
+          textlinksrc.out
+          textlinksrc.out.err
+          textlinkfar.out
+          textlinkfar.out.err
+          textlink.out
+          textlink.out.err
+          tfamily.out
+          tfamily.out.err
+          tfill.out
+          tfill.out.err
+          tfletcher32.out
+          tfletcher32.out.err
+          tfpformat.out
+          tfpformat.out.err
+          tgroup-1.out
+          tgroup-1.out.err
+          tgroup-2.out
+          tgroup-2.out.err
+          tgrp_comments.out
+          tgrp_comments.out.err
+          thlink-1.out
+          thlink-1.out.err
+          thlink-2.out
+          thlink-2.out.err
+          thlink-3.out
+          thlink-3.out.err
+          thlink-4.out
+          thlink-4.out.err
+          thlink-5.out
+          thlink-5.out.err
+          thyperslab.out
+          thyperslab.out.err
+          tindicesno.out
+          tindicesno.out.err
+          tindicessub1.out
+          tindicessub1.out.err
+          tindicessub2.out
+          tindicessub2.out.err
+          tindicessub3.out
+          tindicessub3.out.err
+          tindicessub4.out
+          tindicessub4.out.err
+          texceedsubstart.out
+          texceedsubstart.out.err
+          texceedsubcount.out
+          texceedsubcount.out.err
+          texceedsubstride.out
+          texceedsubstride.out.err
+          texceedsubblock.out
+          texceedsubblock.out.err
+          tindicesyes.out
+          tindicesyes.out.err
+          tints4dims.out
+          tints4dims.out.err
+          tints4dimsBlock2.out
+          tints4dimsBlock2.out.err
+          tints4dimsBlockEq.out
+          tints4dimsBlockEq.out.err
+          tints4dimsCount2.out
+          tints4dimsCount2.out.err
+          tints4dimsCountEq.out
+          tints4dimsCountEq.out.err
+          tints4dimsStride2.out
+          tints4dimsStride2.out.err
+          tintsattrs.out
+          tintsattrs.out.err
+          tlarge_objname.out
+          tlarge_objname.out.err
+          tldouble.out
+          tldouble.out.err
+          tlonglinks.out
+          tlonglinks.out.err
+          tloop-1.out
+          tloop-1.out.err
+          tmulti.out
+          tmulti.out.err
+          tmultifile.out
+          tmultifile.out.err
+#          tqmarkfile.out
+#          tqmarkfile.out.err
+#          tstarfile.out
+#          tstarfile.out.err
+          tnamed_dtype_attr.out
+          tnamed_dtype_attr.out.err
+          tnbit.out
+          tnbit.out.err
+          tnestcomp-1.out
+          tnestcomp-1.out.err
+          tnestedcmpddt.out
+          tnestedcmpddt.out.err
+          tnoattrdata.out
+          tnoattrdata.out.err
+          tnoattrddl.out
+          tnoattrddl.out.err
+          tnodata.out
+          tnodata.out.err
+          tnoddl.out
+          tnoddl.out.err
+          tnoddlfile.out
+          tnoddlfile.out.err
+          tno-subset.out
+          tno-subset.out.err
+          tnullspace.out
+          tnullspace.out.err
+          tordergr1.out
+          tordergr1.out.err
+          tordergr2.out
+          tordergr2.out.err
+          tordergr3.out
+          tordergr3.out.err
+          tordergr4.out
+          tordergr4.out.err
+          tordergr5.out
+          tordergr5.out.err
+          torderattr1.out
+          torderattr1.out.err
+          torderattr2.out
+          torderattr2.out.err
+          torderattr3.out
+          torderattr3.out.err
+          torderattr4.out
+          torderattr4.out.err
+          tordercontents1.out
+          tordercontents1.out.err
+          tordercontents2.out
+          tordercontents2.out.err
+          torderlinks1.out
+          torderlinks1.out.err
+          torderlinks2.out
+          torderlinks2.out.err
+          tperror.out
+          tperror.out.err
+          trawdatafile.out
+          trawdatafile.out.err
+          trawdatafile.txt
+          trawssetfile.out
+          trawssetfile.out.err
+          trawssetfile.txt
+          treadfilter.out
+          treadfilter.out.err
+          treadintfilter.out
+          treadintfilter.out.err
+          treference.out
+          treference.out.err
+          tsaf.out
+          tsaf.out.err
+          tscalarattrintsize.out
+          tscalarattrintsize.out.err
+          tscalarintattrsize.out
+          tscalarintattrsize.out.err
+          tscalarintsize.out
+          tscalarintsize.out.err
+          tscalarstring.out
+          tscalarstring.out.err
+          tscaleoffset.out
+          tscaleoffset.out.err
+          tshuffle.out
+          tshuffle.out.err
+          tslink-1.out
+          tslink-1.out.err
+          tslink-2.out
+          tslink-2.out.err
+          tslink-D.out
+          tslink-D.out.err
+          tsplit_file.out
+          tsplit_file.out.err
+          tstr-1.out
+          tstr-1.out.err
+          tstr-2.out
+          tstr-2.out.err
+          tstr2bin2.txt
+          tstr2bin6.txt
+          tstring.out
+          tstring.out.err
+          tstring2.out
+          tstring2.out.err
+          tstringe.out
+          tstringe.out.err
+          tszip.out
+          tszip.out.err
+          tudlink-1.out
+          tudlink-1.out.err
+          tudlink-2.out
+          tudlink-2.out.err
+          tuserfilter.out
+          tuserfilter.out.err
+          tvldtypes1.out
+          tvldtypes1.out.err
+          tvldtypes2.out
+          tvldtypes2.out.err
+          tvldtypes3.out
+          tvldtypes3.out.err
+          tvldtypes4.out
+          tvldtypes4.out.err
+          tvldtypes5.out
+          tvldtypes5.out.err
+          tvlenstr_array.out
+          tvlenstr_array.out.err
+          tvlstr.out
+          tvlstr.out.err
+          tvms.out
+          tvms.out.err
+          twidedisplay.out
+          twidedisplay.out.err
+          twithddl.txt
+          twithddlfile.out
+          twithddlfile.out.err
+          twithddlfile.txt
+          zerodim.out
+          zerodim.out.err
+    )
+    set_tests_properties (H5DUMP-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/std")
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5DUMP-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5DUMP-clearall-objects")
+  endif ()
+
+  ADD_HELP_TEST(help 0 -h)
+
+  # test data output redirection
+  #ADD_H5_TEST (tnoddl 0 --enable-error-stack -O -y packedbits.h5)
+  ADD_H5_TEST (tnoddl 0 --enable-error-stack --ddl -y packedbits.h5)
+  #ADD_H5_TEST (tnodata 0 --enable-error-stack -o packedbits.h5)
+  ADD_H5_TEST (tnodata 0 --enable-error-stack --output packedbits.h5)
+  ADD_H5_TEST (tnoattrddl 0 --enable-error-stack -O -y tattr.h5)
+  ADD_H5_TEST (tnoattrdata 0 --enable-error-stack -A -o tattr.h5)
+  ADD_H5_TEST_EXPORT (trawdatafile packedbits.h5 0 --enable-error-stack -y -o)
+  ADD_H5_TEST_EXPORT (tnoddlfile packedbits.h5 0 --enable-error-stack -O -y -o)
+  ADD_H5_TEST_EXPORT (trawssetfile tdset.h5 0 --enable-error-stack -d "/dset1[1,1;;;]" -y -o)
+
+  ADD_H5_TEST_EXPORT_DDL (twithddlfile packedbits.h5 0 twithddl --enable-error-stack --ddl=twithddl.txt -y -o)
+
+  # test for maximum display datasets
+  ADD_H5_TEST (twidedisplay 0 --enable-error-stack -w0 packedbits.h5)
+
+  # test for signed/unsigned datasets
+  ADD_H5_TEST (packedbits 0 --enable-error-stack packedbits.h5)
+  # test for compound signed/unsigned datasets
+  ADD_H5_TEST (tcmpdintarray 0 --enable-error-stack tcmpdintarray.h5)
+  ADD_H5_TEST (tcmpdints 0 --enable-error-stack tcmpdints.h5)
+  ADD_H5_TEST (tcmpdintsize 0 --enable-error-stack tcmpdintsize.h5)
+  # test for signed/unsigned scalar datasets
+  ADD_H5_TEST (tscalarintsize 0 --enable-error-stack tscalarintsize.h5)
+  # test for signed/unsigned attributes
+  ADD_H5_TEST (tattrintsize 0 --enable-error-stack tattrintsize.h5)
+  # test for compound signed/unsigned attributes
+  ADD_H5_TEST (tcmpdattrintsize 0 --enable-error-stack tcmpdattrintsize.h5)
+  # test for signed/unsigned scalar attributes
+  ADD_H5_TEST (tscalarattrintsize 0 --enable-error-stack tscalarattrintsize.h5)
+  # test for string scalar dataset and attribute
+  ADD_H5_TEST (tscalarstring 0 --enable-error-stack tscalarstring.h5)
+  # test for signed/unsigned scalar datasets with attributes
+  ADD_H5_TEST (tscalarintattrsize 0 --enable-error-stack tscalarintattrsize.h5)
+  # test for signed/unsigned datasets attributes
+  ADD_H5_TEST (tintsattrs 0 --enable-error-stack tintsattrs.h5)
+  # test for displaying groups
+  ADD_H5_TEST (tgroup-1 0 --enable-error-stack tgroup.h5)
+  # test for displaying the selected groups
+  ADD_H5ERR_MASK_TEST (tgroup-2 1 --enable-error-stack --group=/g2 --group / -g /y tgroup.h5)
+
+  # test for displaying simple space datasets
+  ADD_H5_TEST (tdset-1 0 --enable-error-stack tdset.h5)
+  # test for displaying selected datasets
+  ADD_H5ERR_MASK_TEST (tdset-2 1 --enable-error-stack -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5)
+
+  # test for displaying attributes
+  ADD_H5_TEST (tattr-1 0 --enable-error-stack tattr.h5)
+  # test for displaying the selected attributes of string type and scalar space
+  ADD_H5_TEST (tattr-2 0 --enable-error-stack -a /\\\\/attr1 --attribute /attr4 --attribute=/attr5 tattr.h5)
+  ADD_H5_TEST_N (tattr-2 0 --enable-error-stack -N /\\\\/attr1 --any_path /attr4 --any_path=/attr5 tattr.h5)
+  # test for header and error messages
+  ADD_H5ERR_MASK_TEST (tattr-3 1 --enable-error-stack --header -a /attr2 --attribute=/attr tattr.h5)
+  # test for displaying at least 9 attributes on root from a be machine
+  ADD_H5_TEST (tattr-4_be 0 --enable-error-stack tattr4_be.h5)
+  # test for displaying attributes in shared datatype (also in group and dataset)
+  ADD_H5_TEST (tnamed_dtype_attr 0 --enable-error-stack tnamed_dtype_attr.h5)
+
+  # test for displaying soft links and user-defined links
+  ADD_H5_TEST (tslink-1 0 --enable-error-stack tslink.h5)
+  ADD_H5_TEST (tudlink-1 0 --enable-error-stack tudlink.h5)
+  # test for displaying the selected link
+  ADD_H5_TEST (tslink-2 0 --enable-error-stack -l slink2 tslink.h5)
+  ADD_H5_TEST_N (tslink-2 0 --enable-error-stack -N slink2 tslink.h5)
+  ADD_H5_TEST (tudlink-2 0 --enable-error-stack -l udlink2 tudlink.h5)
+  # test for displaying dangling soft links
+  ADD_H5ERR_MASK_TEST (tslink-D 0 --enable-error-stack -d /slink1 tslink.h5)
+
+  # tests for hard links
+  ADD_H5_TEST (thlink-1 0 --enable-error-stack thlink.h5)
+  ADD_H5_TEST (thlink-2 0 --enable-error-stack -d /g1/dset2 --dataset /dset1 --dataset=/g1/g1.1/dset3 thlink.h5)
+  ADD_H5_TEST (thlink-3 0 --enable-error-stack -d /g1/g1.1/dset3 --dataset /g1/dset2 --dataset=/dset1 thlink.h5)
+  ADD_H5_TEST (thlink-4 0 --enable-error-stack -g /g1 thlink.h5)
+  ADD_H5_TEST_N (thlink-4 0 --enable-error-stack -N /g1 thlink.h5)
+  ADD_H5_TEST (thlink-5 0 --enable-error-stack -d /dset1 -g /g2 -d /g1/dset2 thlink.h5)
+  ADD_H5_TEST_N (thlink-5 0 --enable-error-stack -N /dset1 -N /g2 -N /g1/dset2 thlink.h5)
+
+  # tests for compound data types
+  ADD_H5_TEST (tcomp-1 0 --enable-error-stack tcompound.h5)
+  # test for named data types
+  ADD_H5_TEST (tcomp-2 0 --enable-error-stack -t /type1 --datatype /type2 --datatype=/group1/type3 tcompound.h5)
+  ADD_H5_TEST_N (tcomp-2 0 --enable-error-stack -N /type1 --any_path /type2 --any_path=/group1/type3 tcompound.h5)
+  # test for unamed type
+  ADD_H5ERR_MASK_TEST (tcomp-3 0 "--enable-error-stack;-t;/#6632;-g;/group2;tcompound.h5")
+  # test complicated compound datatype
+  ADD_H5_TEST (tcomp-4 0 --enable-error-stack tcompound_complex.h5)
+  ADD_H5_TEST (tcompound_complex2 0 --enable-error-stack tcompound_complex2.h5)
+  # tests for bitfields and opaque data types
+  ADD_H5_TEST (tbitnopaque 0 --enable-error-stack tbitnopaque.h5)
+
+  #test for the nested compound type
+  ADD_H5_TEST (tnestcomp-1 0 --enable-error-stack tnestedcomp.h5)
+  ADD_H5_TEST (tnestedcmpddt 0 --enable-error-stack tnestedcmpddt.h5)
+
+  # test for options
+  ADD_H5ERR_MASK_TEST (tall-1 0 --enable-error-stack tall.h5)
+  ADD_H5_TEST (tall-2 0 --enable-error-stack --header -g /g1/g1.1 -a attr2 tall.h5)
+  ADD_H5_TEST (tall-3 0 --enable-error-stack -d /g2/dset2.1 -l /g1/g1.2/g1.2.1/slink tall.h5)
+  ADD_H5_TEST_N (tall-3 0 --enable-error-stack -N /g2/dset2.1 -N /g1/g1.2/g1.2.1/slink tall.h5)
+  ADD_H5_TEST (tall-7 0 --enable-error-stack -a attr1 tall.h5)
+  ADD_H5_TEST (tall-7N 0 --enable-error-stack -N attr1 tall.h5)
+
+  # test for loop detection
+  ADD_H5_TEST (tloop-1 0 --enable-error-stack tloop.h5)
+
+  # test for string
+  ADD_H5_TEST (tstr-1 0 --enable-error-stack tstr.h5)
+  ADD_H5_TEST (tstr-2 0 --enable-error-stack tstr2.h5)
+
+  # test for file created by Lib SAF team
+  ADD_H5_TEST (tsaf 0 --enable-error-stack tsaf.h5)
+
+  # test for file with variable length data
+  ADD_H5_TEST (tvldtypes1 0 --enable-error-stack tvldtypes1.h5)
+  ADD_H5_TEST (tvldtypes2 0 --enable-error-stack tvldtypes2.h5)
+  ADD_H5_TEST (tvldtypes3 0 --enable-error-stack tvldtypes3.h5)
+  ADD_H5_TEST (tvldtypes4 0 --enable-error-stack tvldtypes4.h5)
+  ADD_H5_TEST (tvldtypes5 0 --enable-error-stack tvldtypes5.h5)
+
+  #test for file with variable length string data
+  ADD_H5_TEST (tvlstr 0 --enable-error-stack tvlstr.h5)
+  ADD_H5_TEST (tvlenstr_array 0 --enable-error-stack tvlenstr_array.h5)
+
+  # test for files with array data
+  ADD_H5_TEST (tarray1 0 --enable-error-stack tarray1.h5)
+  # # added for bug# 2092 - tarray1_big.h5
+  ADD_H5ERR_MASK_TEST (tarray1_big 0 --enable-error-stack -R tarray1_big.h5)
+  ADD_H5_TEST (tarray2 0 --enable-error-stack tarray2.h5)
+  ADD_H5_TEST (tarray3 0 --enable-error-stack tarray3.h5)
+  ADD_H5_TEST (tarray4 0 --enable-error-stack tarray4.h5)
+  ADD_H5_TEST (tarray5 0 --enable-error-stack tarray5.h5)
+  ADD_H5_TEST (tarray6 0 --enable-error-stack tarray6.h5)
+  ADD_H5_TEST (tarray7 0 --enable-error-stack tarray7.h5)
+  ADD_H5_TEST (tarray8 0 --enable-error-stack tarray8.h5)
+
+  # test for wildcards in filename (does not work with cmake)
+  #ADD_H5_MASK_TEST (tstarfile 0 --enable-error-stack -H -d Dataset1 tarr*.h5)
+  #ADD_H5_MASK_TEST (tqmarkfile 0 --enable-error-stack -H -d Dataset1 tarray?.h5)
+  ADD_H5_TEST (tmultifile 0 --enable-error-stack -H -d Dataset1 tarray2.h5 tarray3.h5 tarray4.h5 tarray5.h5 tarray6.h5 tarray7.h5)
+
+  # test for files with empty data
+  ADD_H5_TEST (tempty 0 --enable-error-stack tempty.h5)
+
+  # test for files with groups that have comments
+  ADD_H5_TEST (tgrp_comments 0 --enable-error-stack tgrp_comments.h5)
+
+  # test the --filedriver flag
+  ADD_H5_TEST (tsplit_file 0 --enable-error-stack --filedriver=split tsplit_file)
+  ADD_H5_TEST (tfamily 0 --enable-error-stack --filedriver=family tfamily%05d.h5)
+  ADD_H5_TEST (tmulti 0 --enable-error-stack --filedriver=multi tmulti)
+
+  # test for files with group names which reach > 1024 bytes in size
+  ADD_H5_TEST (tlarge_objname 0 --enable-error-stack -w157 tlarge_objname.h5)
+
+  # test '-A' to suppress data but print attr's
+  ADD_H5ERR_MASK_TEST (tall-2A 0 --enable-error-stack -A tall.h5)
+
+  # test '-A' to suppress attr's but print data
+  ADD_H5ERR_MASK_TEST (tall-2A0 0 --enable-error-stack -A 0 tall.h5)
+
+  # test '-r' to print attributes in ASCII instead of decimal
+  ADD_H5ERR_MASK_TEST (tall-2B 0 --enable-error-stack -A -r tall.h5)
+
+  # test Subsetting
+  ADD_H5_TEST (tall-4s 0 --enable-error-stack --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5)
+  ADD_H5_TEST (tall-5s 0 --enable-error-stack -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5)
+  ADD_H5_TEST (tdset-3s 0 --enable-error-stack -d "/dset1[1,1;;;]" tdset.h5)
+  ADD_H5_TEST (tno-subset 0 --enable-error-stack --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0" tno-subset.h5)
+
+  ADD_H5_TEST (tints4dimsCount2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 2,2,2,2 tints4dims.h5)
+  ADD_H5_TEST (tints4dimsBlock2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 1,1,1,1 -k 2,2,2,2 tints4dims.h5)
+  ADD_H5_TEST (tints4dimsStride2 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,2,2 -c 2,2,2,2 tints4dims.h5)
+  ADD_H5_TEST (tints4dimsCountEq 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -k 1,2,1,1 -c 2,2,4,4 tints4dims.h5)
+  ADD_H5_TEST (tints4dimsBlockEq 0 --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -c 2,2,1,1 -k 1,2,4,4 tints4dims.h5)
+
+  # test printing characters in ASCII instead of decimal
+  ADD_H5_TEST (tchar1 0 --enable-error-stack -r tchar.h5)
+
+  # test datatypes in ASCII and UTF8
+  ADD_H5_TEST (charsets 0 --enable-error-stack charsets.h5)
+
+  # rev. 2004
+  # tests for super block
+  ADD_H5_TEST (tboot1 0 --enable-error-stack -H -B -d dset tfcontents1.h5)
+  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)
+
+  # test for file contents
+  ADD_H5_TEST (tcontents 0 --enable-error-stack -n tfcontents1.h5)
+  ADD_H5_TEST (tordercontents1 0 --enable-error-stack -n --sort_by=name --sort_order=ascending tfcontents1.h5)
+  ADD_H5_TEST (tordercontents2 0 --enable-error-stack -n --sort_by=name --sort_order=descending tfcontents1.h5)
+  ADD_H5_TEST (tattrcontents1 0 --enable-error-stack -n 1 --sort_order=ascending tall.h5)
+  ADD_H5_TEST (tattrcontents2 0 --enable-error-stack -n 1 --sort_order=descending tall.h5)
+
+  # tests for storage layout
+  # compact
+  ADD_H5_TEST (tcompact 0 --enable-error-stack -H -p -d compact tfilters.h5)
+  # contiguous
+  ADD_H5_TEST (tcontiguos 0 --enable-error-stack -H -p -d contiguous tfilters.h5)
+  # chunked
+  ADD_H5_TEST (tchunked 0 --enable-error-stack -H -p -d chunked tfilters.h5)
+  # external
+  ADD_H5_TEST (texternal 0 --enable-error-stack -H -p -d external tfilters.h5)
+
+  # fill values
+  ADD_H5_TEST (tfill 0 --enable-error-stack -p tfvalues.h5)
+
+  # several datatype, with references , print path
+  ADD_H5_TEST (treference 0 --enable-error-stack  tattr2.h5)
+
+  # escape/not escape non printable characters
+  ADD_H5_TEST (tstringe 0 --enable-error-stack -e tstr3.h5)
+  ADD_H5_TEST (tstring 0 --enable-error-stack tstr3.h5)
+  # char data as ASCII with non escape
+  ADD_H5_TEST (tstring2 0 --enable-error-stack -r -d str4 tstr3.h5)
+
+  # array indices print/not print
+  ADD_H5_TEST (tindicesyes 0 --enable-error-stack taindices.h5)
+  ADD_H5_TEST (tindicesno 0 --enable-error-stack -y taindices.h5)
+
+  ########## array indices with subsetting
+  # 1D case
+  ADD_H5_TEST (tindicessub1 0 --enable-error-stack -d 1d -s 1 -S 10 -c 2  -k 3 taindices.h5)
+
+  # 2D case
+  ADD_H5_TEST (tindicessub2 0 --enable-error-stack -d 2d -s 1,2  -S 3,3 -c 3,2 -k 2,2 taindices.h5)
+
+  # 3D case
+  ADD_H5_TEST (tindicessub3 0 --enable-error-stack -d 3d -s 0,1,2 -S 1,3,3 -c 2,2,2  -k 1,2,2  taindices.h5)
+
+  # 4D case
+  ADD_H5_TEST (tindicessub4 0 --enable-error-stack -d 4d -s 0,0,1,2  -c 2,2,3,2 -S 1,1,3,3 -k 1,1,2,2  taindices.h5)
+
+  # Exceed the dimensions for subsetting
+  ADD_H5_TEST (texceedsubstart 1 --enable-error-stack -d 1d -s 1,3 taindices.h5)
+  ADD_H5_TEST (texceedsubcount 1 --enable-error-stack -d 1d -c 1,3 taindices.h5)
+  ADD_H5_TEST (texceedsubstride 1 --enable-error-stack -d 1d -S 1,3 taindices.h5)
+  ADD_H5_TEST (texceedsubblock 1 --enable-error-stack -d 1d -k 1,3 taindices.h5)
+
+  # tests for filters
+  # SZIP
+  ADD_H5_TEST (tszip 0 --enable-error-stack -H -p -d szip tfilters.h5)
+
+  # deflate
+  ADD_H5_TEST (tdeflate 0 --enable-error-stack -H -p -d deflate tfilters.h5)
+
+  # shuffle
+  ADD_H5_TEST (tshuffle 0 --enable-error-stack -H -p -d shuffle tfilters.h5)
+
+  # fletcher32
+  ADD_H5_TEST (tfletcher32 0 --enable-error-stack -H -p -d fletcher32  tfilters.h5)
+
+  # nbit
+  ADD_H5_TEST (tnbit 0 --enable-error-stack -H -p -d nbit  tfilters.h5)
+
+  # scaleoffset
+  ADD_H5_TEST (tscaleoffset 0 --enable-error-stack -H -p -d scaleoffset  tfilters.h5)
+
+  # all
+  ADD_H5_TEST (tallfilters 0 --enable-error-stack -H -p -d all  tfilters.h5)
+
+  # user defined
+  ADD_H5_TEST (tuserfilter 0 --enable-error-stack -H  -p -d myfilter  tfilters.h5)
+
+
+# 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 ()
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif ()
+
+  if (USE_FILTER_DEFLATE)
+    # data read internal filters
+    ADD_H5_TEST (treadintfilter 0 --enable-error-stack -d deflate -d shuffle -d fletcher32 -d nbit -d scaleoffset tfilters.h5)
+    if (HDF5_ENABLE_SZIP_SUPPORT)
+      # data read all filters
+      ADD_H5_TEST (treadfilter 0 --enable-error-stack -d all -d szip tfilters.h5)
+    endif ()
+  endif ()
+
+  # test for displaying objects with very long names
+  ADD_H5_TEST (tlonglinks 0 --enable-error-stack tlonglinks.h5)
+
+  # dimensions over 4GB, print boundary
+  ADD_H5_TEST (tbigdims 0 --enable-error-stack -d dset4gb -s 4294967284 -c 22 tbigdims.h5)
+
+  # hyperslab read
+  ADD_H5_TEST (thyperslab 0 --enable-error-stack thyperslab.h5)
+
+  # test for displaying dataset and attribute of null space
+  ADD_H5_TEST (tnullspace 0 --enable-error-stack tnullspace.h5)
+
+  # test for displaying dataset and attribute of space with 0 dimension size
+  ADD_H5_TEST (zerodim 0 --enable-error-stack zerodim.h5)
+
+  # test for long double (some systems do not have long double)
+  #ADD_H5_TEST (tldouble 0 --enable-error-stack tldouble.h5)
+
+  # test for vms
+  ADD_H5_TEST (tvms 0 --enable-error-stack tvms.h5)
+
+  # test for binary output
+  ADD_H5_TEST (tbin1LE 0 --enable-error-stack -d integer -o tbin1LE.bin -b LE tbinary.h5)
+
+  # test for string binary output
+  ADD_H5_EXPORT_TEST (tstr2bin2 tstr2.h5 0 --enable-error-stack -d /g2/dset2 -b -o)
+  ADD_H5_EXPORT_TEST (tstr2bin6 tstr2.h5 0 --enable-error-stack -d /g6/dset6 -b -o)
+
+  # NATIVE default. the NATIVE test can be validated with h5import/h5diff
+  ADD_H5_TEST_IMPORT (tbin1 out1D tbinary.h5 0 --enable-error-stack -d integer -b)
+
+  if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+    ADD_H5_TEST (tbin2 0 --enable-error-stack -b BE -d float -o tbin2.bin tbinary.h5)
+  endif ()
+
+  # the NATIVE test can be validated with h5import/h5diff
+  ADD_H5_TEST_IMPORT (tbin3 out3D tbinary.h5 0 --enable-error-stack -d integer -b NATIVE)
+
+  if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+    ADD_H5_TEST (tbin4 0 --enable-error-stack -d double -b FILE -o tbin4.bin tbinary.h5)
+  endif ()
+
+  # test for dataset region references
+  ADD_H5_TEST (tdatareg 0 --enable-error-stack tdatareg.h5)
+  ADD_H5ERR_MASK_TEST (tdataregR 0 --enable-error-stack -R tdatareg.h5)
+  ADD_H5_TEST (tattrreg 0 --enable-error-stack tattrreg.h5)
+  ADD_H5ERR_MASK_TEST (tattrregR 0 -R --enable-error-stack tattrreg.h5)
+  ADD_H5_EXPORT_TEST (tbinregR tdatareg.h5 0 --enable-error-stack -d /Dataset1 -s 0 -R -y -o)
+
+  # tests for group creation order
+  # "1" tracked, "2" name, root tracked
+  ADD_H5_TEST (tordergr1 0 --enable-error-stack --group=1 --sort_by=creation_order --sort_order=ascending tordergr.h5)
+  ADD_H5_TEST (tordergr2 0 --enable-error-stack --group=1 --sort_by=creation_order --sort_order=descending tordergr.h5)
+  ADD_H5_TEST (tordergr3 0 --enable-error-stack -g 2 -q name -z ascending tordergr.h5)
+  ADD_H5_TEST (tordergr4 0 --enable-error-stack -g 2 -q name -z descending tordergr.h5)
+  ADD_H5_TEST (tordergr5 0 --enable-error-stack -q creation_order tordergr.h5)
+
+  # tests for attribute order
+  ADD_H5_TEST (torderattr1 0 --enable-error-stack -H --sort_by=name --sort_order=ascending torderattr.h5)
+  ADD_H5_TEST (torderattr2 0 --enable-error-stack -H --sort_by=name --sort_order=descending torderattr.h5)
+  ADD_H5_TEST (torderattr3 0 --enable-error-stack -H --sort_by=creation_order --sort_order=ascending torderattr.h5)
+  ADD_H5_TEST (torderattr4 0 --enable-error-stack -H --sort_by=creation_order --sort_order=descending torderattr.h5)
+
+  # tests for link references and order
+  ADD_H5ERR_MASK_TEST (torderlinks1 0 --enable-error-stack --sort_by=name --sort_order=ascending tfcontents1.h5)
+  ADD_H5ERR_MASK_TEST (torderlinks2 0 --enable-error-stack --sort_by=name --sort_order=descending tfcontents1.h5)
+
+  # tests for floating point user defined printf format
+  ADD_H5_TEST (tfpformat 0 --enable-error-stack -m %.7f tfpformat.h5)
+
+  # tests for traversal of external links
+  ADD_H5ERR_MASK_TEST (textlinksrc 0 --enable-error-stack textlinksrc.h5)
+  ADD_H5ERR_MASK_TEST (textlinkfar 0 --enable-error-stack textlinkfar.h5)
+
+  # test for dangling external links
+  ADD_H5ERR_MASK_TEST (textlink 0 --enable-error-stack textlink.h5)
+
+  # test for error stack display (BZ2048)
+  ADD_H5ERR_MASK_ENV_TEST (filter_fail 1 "HDF5_PLUGIN_PRELOAD" "::" --enable-error-stack filter_fail.h5)
+
+  # test for -o -y for dataset with attributes
+  ADD_H5_TEST_EXPORT (tall-6 tall.h5 0 --enable-error-stack -d /g1/g1.1/dset1.1.1 -y -o)
+
+  # test for non-existing file
+  ADD_H5_TEST (non_existing 1 --enable-error-stack tgroup.h5 non_existing.h5)
+
+##############################################################################
+###    P L U G I N  T E S T S
+##############################################################################
+ADD_H5_UD_TEST (h5dump_plugin_test 0 tudfilter --enable-error-stack tudfilter.h5)
diff --git a/tools/test/h5dump/CMakeTestsPBITS.cmake b/tools/test/h5dump/CMakeTestsPBITS.cmake
new file mode 100644
index 0000000..986f1a1
--- /dev/null
+++ b/tools/test/h5dump/CMakeTestsPBITS.cmake
@@ -0,0 +1,351 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Packed Bits
+  # --------------------------------------------------------------------
+  #-- Copy all the HDF5 files from the test directory into the source directory
+  set (HDF5_REFERENCE_PBITS
+      tnofilename-with-packed-bits.ddl
+      tpbitsArray.ddl
+      tpbitsCompound.ddl
+      tpbitsIncomplete.ddl
+      tpbitsLengthExceeded.ddl
+      tpbitsCharLengthExceeded.ddl
+      tpbitsIntLengthExceeded.ddl
+      tpbitsLongLengthExceeded.ddl
+      tpbitsLengthPositive.ddl
+      tpbitsMax.ddl
+      tpbitsMaxExceeded.ddl
+      tpbitsOffsetExceeded.ddl
+      tpbitsCharOffsetExceeded.ddl
+      tpbitsIntOffsetExceeded.ddl
+      tpbitsLongOffsetExceeded.ddl
+      tpbitsOffsetNegative.ddl
+      tpbitsOverlapped.ddl
+      tpbitsSigned.ddl
+      tpbitsUnsigned.ddl
+      tpbitsSignedInt.ddl
+      tpbitsUnsignedInt.ddl
+      tpbitsSignedLong.ddl
+      tpbitsUnsignedLong.ddl
+      tpbitsSignedLongLong.ddl
+      tpbitsUnsignedLongLong.ddl
+      tpbitsSignedWhole.ddl
+      tpbitsUnsignedWhole.ddl
+      tpbitsSignedIntWhole.ddl
+      tpbitsUnsignedIntWhole.ddl
+      tpbitsSignedLongWhole.ddl
+      tpbitsUnsignedLongWhole.ddl
+      tpbitsSignedLongLongWhole.ddl
+      tpbitsUnsignedLongLongWhole.ddl
+      tpbitsSignedLongLongWhole1.ddl
+      tpbitsUnsignedLongLongWhole1.ddl
+      tpbitsSignedLongLongWhole63.ddl
+      tpbitsUnsignedLongLongWhole63.ddl
+      tpbitsSigned4.ddl
+      tpbitsUnsigned4.ddl
+      tpbitsSignedInt8.ddl
+      tpbitsUnsignedInt8.ddl
+      tpbitsSignedLong16.ddl
+      tpbitsUnsignedLong16.ddl
+      tpbitsSignedLongLong32.ddl
+      tpbitsUnsignedLongLong32.ddl
+      tpbitsSigned2.ddl
+      tpbitsUnsigned2.ddl
+      tpbitsSignedInt4.ddl
+      tpbitsUnsignedInt4.ddl
+      tpbitsSignedLong8.ddl
+      tpbitsUnsignedLong8.ddl
+      tpbitsSignedLongLong16.ddl
+      tpbitsUnsignedLongLong16.ddl
+  )
+  set (HDF5_REFERENCE_TEST_PBITS
+      ${HDF5_TOOLS_DIR}/testfiles/packedbits.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound.h5
+  )
+  set (HDF5_ERROR_REFERENCE_PBITS
+      tnofilename-with-packed-bits.err
+      tpbitsCharLengthExceeded.err
+      tpbitsCharOffsetExceeded.err
+      tpbitsIncomplete.err
+      tpbitsIntLengthExceeded.err
+      tpbitsIntOffsetExceeded.err
+      tpbitsLengthExceeded.err
+      tpbitsLengthPositive.err
+      tpbitsLongLengthExceeded.err
+      tpbitsLongOffsetExceeded.err
+      tpbitsMaxExceeded.err
+      tpbitsOffsetExceeded.err
+      tpbitsOffsetNegative.err
+  )
+
+  foreach (pbits_h5_file ${HDF5_REFERENCE_TEST_PBITS})
+    get_filename_component(fname "${pbits_h5_file}" NAME)
+    HDFTEST_COPY_FILE("${pbits_h5_file}" "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}" "h5dump_pbits_files")
+  endforeach ()
+
+
+  foreach (ddl_pbits ${HDF5_REFERENCE_PBITS})
+    get_filename_component(fname "${ddl_pbits}" NAME)
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/pbits/${ddl_pbits}" "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}" "h5dump_pbits_files")
+  endforeach ()
+
+  foreach (ddl_pbits ${HDF5_ERROR_REFERENCE_PBITS})
+    get_filename_component(fname "${ddl_pbits}" NAME)
+    HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/errfiles/${ddl_pbits}" "${PROJECT_BINARY_DIR}/testfiles/pbits/${fname}" "h5dump_pbits_files")
+  endforeach ()
+  add_custom_target(h5dump_pbits_files ALL COMMENT "Copying files needed by h5dump_pbits tests" DEPENDS ${h5dump_pbits_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_PBITS_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}/testfiles/pbits")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_pbits_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_pbits_test})
+      endif ()
+    else ()
+      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/pbits"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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_PACKED_BITS-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          tnofilename-with-packed-bits.out
+          tnofilename-with-packed-bits.out.err
+          tpbitsArray.out
+          tpbitsArray.out.err
+          tpbitsCompound.out
+          tpbitsCompound.out.err
+          tpbitsIncomplete.out
+          tpbitsIncomplete.out.err
+          tpbitsLengthExceeded.out
+          tpbitsLengthExceeded.out.err
+          tpbitsCharLengthExceeded.out
+          tpbitsCharLengthExceeded.out.err
+          tpbitsIntLengthExceeded.out
+          tpbitsIntLengthExceeded.out.err
+          tpbitsLongLengthExceeded.out
+          tpbitsLongLengthExceeded.out.err
+          tpbitsLengthPositive.out
+          tpbitsLengthPositive.out.err
+          tpbitsMax.out
+          tpbitsMax.out.err
+          tpbitsMaxExceeded.out
+          tpbitsMaxExceeded.out.err
+          tpbitsOffsetExceeded.out
+          tpbitsOffsetExceeded.out.err
+          tpbitsCharOffsetExceeded.out
+          tpbitsCharOffsetExceeded.out.err
+          tpbitsIntOffsetExceeded.out
+          tpbitsIntOffsetExceeded.out.err
+          tpbitsLongOffsetExceeded.out
+          tpbitsLongOffsetExceeded.out.err
+          tpbitsOffsetNegative.out
+          tpbitsOffsetNegative.out.err
+          tpbitsOverlapped.out
+          tpbitsOverlapped.out.err
+          tpbitsSigned.out
+          tpbitsSigned.out.err
+          tpbitsUnsigned.out
+          tpbitsUnsigned.out.err
+          tpbitsSignedInt.out
+          tpbitsSignedInt.out.err
+          tpbitsUnsignedInt.out
+          tpbitsUnsignedInt.out.err
+          tpbitsSignedLong.out
+          tpbitsSignedLong.out.err
+          tpbitsUnsignedLong.out
+          tpbitsUnsignedLong.out.err
+          tpbitsSignedLongLong.out
+          tpbitsSignedLongLong.out.err
+          tpbitsUnsignedLongLong.out
+          tpbitsUnsignedLongLong.out.err
+          tpbitsSignedWhole.out
+          tpbitsSignedWhole.out.err
+          tpbitsUnsignedWhole.out
+          tpbitsUnsignedWhole.out.err
+          tpbitsSignedIntWhole.out
+          tpbitsSignedIntWhole.out.err
+          tpbitsUnsignedIntWhole.out
+          tpbitsUnsignedIntWhole.out.err
+          tpbitsSignedLongWhole.out
+          tpbitsSignedLongWhole.out.err
+          tpbitsUnsignedLongWhole.out
+          tpbitsUnsignedLongWhole.out.err
+          tpbitsSignedLongLongWhole.out
+          tpbitsSignedLongLongWhole.out.err
+          tpbitsUnsignedLongLongWhole.out
+          tpbitsUnsignedLongLongWhole.out.err
+          tpbitsSignedLongLongWhole1.out
+          tpbitsSignedLongLongWhole1.out.err
+          tpbitsUnsignedLongLongWhole1.out
+          tpbitsUnsignedLongLongWhole1.out.err
+          tpbitsSignedLongLongWhole63.out
+          tpbitsSignedLongLongWhole63.out.err
+          tpbitsUnsignedLongLongWhole63.out
+          tpbitsUnsignedLongLongWhole63.out.err
+          tpbitsSigned4.out
+          tpbitsSigned4.out.err
+          tpbitsUnsigned4.out
+          tpbitsUnsigned4.out.err
+          tpbitsSignedInt8.out
+          tpbitsSignedInt8.out.err
+          tpbitsUnsignedInt8.out
+          tpbitsUnsignedInt8.out.err
+          tpbitsSignedLong16.out
+          tpbitsSignedLong16.out.err
+          tpbitsUnsignedLong16.out
+          tpbitsUnsignedLong16.out.err
+          tpbitsSignedLongLong32.out
+          tpbitsSignedLongLong32.out.err
+          tpbitsUnsignedLongLong32.out
+          tpbitsUnsignedLongLong32.out.err
+          tpbitsSigned2.out
+          tpbitsSigned2.out.err
+          tpbitsUnsigned2.out
+          tpbitsUnsigned2.out.err
+          tpbitsSignedInt4.out
+          tpbitsSignedInt4.out.err
+          tpbitsUnsignedInt4.out
+          tpbitsUnsignedInt4.out.err
+          tpbitsSignedLong8.out
+          tpbitsSignedLong8.out.err
+          tpbitsUnsignedLong8.out
+          tpbitsUnsignedLong8.out.err
+          tpbitsSignedLongLong16.out
+          tpbitsSignedLongLong16.out.err
+          tpbitsUnsignedLongLong16.out
+          tpbitsUnsignedLongLong16.out.err
+    )
+    set_tests_properties (H5DUMP_PACKED_BITS-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/pbits")
+    if (NOT "${last_pbits_test}" STREQUAL "")
+      set_tests_properties (H5DUMP_PACKED_BITS-clearall-objects PROPERTIES DEPENDS ${last_pbits_test})
+    endif ()
+    set (last_pbits_test "H5DUMP_PACKED_BITS-clearall-objects")
+  endif ()
+
+  # test failure handling
+  # Missing file name
+  ADD_H5_PBITS_TEST (tnofilename-with-packed-bits 1 --enable-error-stack)
+  # Limits:
+  # Maximum number of packed bits is 8 (for now).
+  # Maximum integer size is 8*sizeof(long long).
+  # Maximun Offset is Maximum size - 1.
+  # Maximum Offset+Length is Maximum size.
+  # Tests:
+  # Normal operation on both signed and unsigned int datasets.
+  # Sanity check
+  # Their rawdata output should be the same.
+  ADD_H5_PBITS_TEST (tpbitsSignedWhole 0 --enable-error-stack -d /DS08BITS -M 0,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedWhole 0 --enable-error-stack -d /DU08BITS -M 0,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedIntWhole 0 --enable-error-stack -d /DS16BITS -M 0,16 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedIntWhole 0 --enable-error-stack -d /DU16BITS -M 0,16 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongWhole 0 --enable-error-stack -d /DS32BITS -M 0,32 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongWhole 0 --enable-error-stack -d /DU32BITS -M 0,32 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole 0 --enable-error-stack -d /DS64BITS -M 0,64 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole 0 --enable-error-stack -d /DU64BITS -M 0,64 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole63 0 --enable-error-stack -d /DS64BITS -M 0,63 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole63 0 --enable-error-stack -d /DU64BITS -M 0,63 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLongWhole1 0 --enable-error-stack -d /DS64BITS -M 1,63 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLongWhole1 0 --enable-error-stack -d /DU64BITS -M 1,63 packedbits.h5)
+  # Half sections
+  ADD_H5_PBITS_TEST (tpbitsSigned4 0 --enable-error-stack -d /DS08BITS -M 0,4,4,4 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsigned4 0 --enable-error-stack -d /DU08BITS -M 0,4,4,4 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedInt8 0 --enable-error-stack -d /DS16BITS -M 0,8,8,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedInt8 0 --enable-error-stack -d /DU16BITS -M 0,8,8,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLong16 0 --enable-error-stack -d /DS32BITS -M 0,16,16,16 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLong16 0 --enable-error-stack -d /DU32BITS -M 0,16,16,16 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLong32 0 --enable-error-stack -d /DS64BITS -M 0,32,32,32 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong32 0 --enable-error-stack -d /DU64BITS -M 0,32,32,32 packedbits.h5)
+  # Quarter sections
+  ADD_H5_PBITS_TEST (tpbitsSigned2 0 --enable-error-stack -d /DS08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsigned2 0 --enable-error-stack -d /DU08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedInt4 0 --enable-error-stack -d /DS16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedInt4 0 --enable-error-stack -d /DU16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLong8 0 --enable-error-stack -d /DS32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLong8 0 --enable-error-stack -d /DU32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLong16 0 --enable-error-stack -d /DS64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong16 0 --enable-error-stack -d /DU64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5)
+  # Begin and End
+  ADD_H5_PBITS_TEST (tpbitsSigned 0 --enable-error-stack -d /DS08BITS -M 0,2,2,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsigned 0 --enable-error-stack -d /DU08BITS -M 0,2,2,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedInt 0 --enable-error-stack -d /DS16BITS -M 0,2,10,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedInt 0 --enable-error-stack -d /DU16BITS -M 0,2,10,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLong 0 --enable-error-stack -d /DS32BITS -M 0,2,26,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLong 0 --enable-error-stack -d /DU32BITS -M 0,2,26,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsSignedLongLong 0 --enable-error-stack -d /DS64BITS -M 0,2,58,6 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsUnsignedLongLong 0 --enable-error-stack -d /DU64BITS -M 0,2,58,6 packedbits.h5)
+  # Overlapped packed bits.
+  ADD_H5_PBITS_TEST (tpbitsOverlapped 0 --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,0,3 packedbits.h5)
+  # Maximum number of packed bits.
+  ADD_H5_PBITS_TEST (tpbitsMax 0 --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5)
+  # Compound type.
+  ADD_H5_PBITS_TEST (tpbitsCompound 0 --enable-error-stack -d /dset1 -M 0,1,1,1 tcompound.h5)
+  # Array type.
+  ADD_H5_PBITS_TEST (tpbitsArray 0 --enable-error-stack -d /Dataset1 -M 0,1,1,1 tarray1.h5)
+  # Test Error handling.
+  # Too many packed bits requested. Max is 8 for now.
+  ADD_H5_PBITS_TEST (tpbitsMaxExceeded 1 --enable-error-stack -d /DS08BITS -M 0,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5)
+  # Offset too large. Max is 8*sizeof(long long.
+  ADD_H5_PBITS_TEST (tpbitsOffsetExceeded 1 --enable-error-stack -d /DS08BITS -M 64,1 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsCharOffsetExceeded 0 --enable-error-stack -d /DS08BITS -M 8,1 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsIntOffsetExceeded 0 --enable-error-stack -d /DS16BITS -M 16,1 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsLongOffsetExceeded 0 --enable-error-stack -d /DS32BITS -M 32,1 packedbits.h5)
+  # Bad offset, must not be negative.
+  ADD_H5_PBITS_TEST (tpbitsOffsetNegative 1 --enable-error-stack -d /DS08BITS -M -1,1 packedbits.h5)
+  # Bad length, must not be positive.
+  ADD_H5_PBITS_TEST (tpbitsLengthPositive 1 --enable-error-stack -d /DS08BITS -M 4,0 packedbits.h5)
+  # Offset+Length is too large. Max is 8*sizeof(long long).
+  ADD_H5_PBITS_TEST (tpbitsLengthExceeded 1 --enable-error-stack -d /DS08BITS -M 37,28 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsCharLengthExceeded 0 --enable-error-stack -d /DS08BITS -M 2,7 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsIntLengthExceeded 0 --enable-error-stack -d /DS16BITS -M 10,7 packedbits.h5)
+  ADD_H5_PBITS_TEST (tpbitsLongLengthExceeded 0 --enable-error-stack -d /DS32BITS -M 26,7 packedbits.h5)
+  # Incomplete pair of packed bits request.
+  ADD_H5_PBITS_TEST (tpbitsIncomplete 1 --enable-error-stack -d /DS08BITS -M 0,2,2,1,0,2,2, packedbits.h5)
diff --git a/tools/test/h5dump/CMakeTestsVDS.cmake b/tools/test/h5dump/CMakeTestsVDS.cmake
new file mode 100644
index 0000000..310f9ce
--- /dev/null
+++ b/tools/test/h5dump/CMakeTestsVDS.cmake
@@ -0,0 +1,244 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           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
+      vds-first.ddl
+      vds-gap1.ddl
+      vds-gap2.ddl
+      vds_layout-eiger.ddl
+      vds_layout-maxmin.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
+      a.h5
+      b.h5
+      c.h5
+      d.h5
+      vds-percival-unlim-maxmin.h5
+      f-0.h5
+      f-3.h5
+      vds-eiger.h5
+  )
+  set (HDF5_ERROR_REFERENCE_VDS
+  )
+
+  foreach (vds_h5_file ${HDF5_REFERENCE_TEST_VDS})
+    get_filename_component(fname "${vds_h5_file}" NAME)
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/vds/${vds_h5_file}" "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}" "h5dump_vds_files")
+  endforeach ()
+
+
+  foreach (ddl_vds ${HDF5_REFERENCE_VDS})
+    get_filename_component(fname "${ddl_vds}" NAME)
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/vds/${ddl_vds}" "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}" "h5dump_vds_files")
+  endforeach ()
+
+  foreach (ddl_vds ${HDF5_ERROR_REFERENCE_VDS})
+    get_filename_component(fname "${ddl_vds}" NAME)
+    HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/errfiles/${ddl_vds}" "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}" "h5dump_vds_files")
+  endforeach ()
+  add_custom_target(h5dump_vds_files ALL COMMENT "Copying files needed by h5dump_vds tests" DEPENDS ${h5dump_vds_files_list})
+
+##############################################################################
+##############################################################################
+###           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}/testfiles/vds")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_vds_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_VDS_test})
+      endif ()
+    else ()
+      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"
+      )
+    endif ()
+  endmacro ()
+
+  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}/testfiles/vds")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_vds_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_VDS_test})
+      endif ()
+    else ()
+      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 ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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
+          vds-first.out
+          vds-first.out.err
+          vds-gap1.out
+          vds-gap1.out.err
+          vds-gap2.out
+          vds-gap2.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
+          vds_layout-eiger.out
+          vds_layout-eiger.out.err
+          vds_layout-maxmin.out
+          vds_layout-maxmin.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 ()
+    set (last_VDS_test "H5DUMP_VDS-clearall-objects")
+  endif ()
+
+# 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 ()
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif ()
+
+  # 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)
+    ADD_H5_VDS_TEST (vds-first 0 --vds-view-first-missing --enable-error-stack vds-percival-unlim-maxmin.h5)
+    ADD_H5_VDS_TEST (vds-gap1 0 -d /VDS-Eiger --vds-gap-size=1 --enable-error-stack vds-eiger.h5)
+    ADD_H5_VDS_TEST (vds-gap2 0 --vds-gap-size=2 --enable-error-stack vds-eiger.h5)
+  endif ()
+
+  # 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)
+    ADD_H5_VDS_LAYOUT (vds_layout-eiger 0 --enable-error-stack vds-eiger.h5)
+    ADD_H5_VDS_LAYOUT (vds_layout-maxmin 0 --enable-error-stack vds-percival-unlim-maxmin.h5)
+  endif ()
diff --git a/tools/test/h5dump/CMakeTestsXML.cmake b/tools/test/h5dump/CMakeTestsXML.cmake
new file mode 100644
index 0000000..c353e48
--- /dev/null
+++ b/tools/test/h5dump/CMakeTestsXML.cmake
@@ -0,0 +1,425 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  #
+  # copy XML test files from source dir to test dir
+  #
+  set (HDF5_XML_REFERENCE_TEST_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/tall.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray3.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray6.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray7.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tbitfields.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound_complex.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdatareg.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdset.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdset2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tenum.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfpformat.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
+      ${HDF5_TOOLS_DIR}/testfiles/thlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tloop.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tloop2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tmany.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-amp.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-apos.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-gt.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-lt.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-quot.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tname-sp.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnamed_dtype_attr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnodata.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tobjref.h5
+      ${HDF5_TOOLS_DIR}/testfiles/topaque.h5
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tref.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tref-escapes.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tref-escapes-at.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tslink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstring.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstring-at.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes3.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes4.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes5.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvlstr.h5
+  )
+  set (HDF5_XML_REFERENCE_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/tall.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2A.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tarray2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tarray3.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tarray6.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tarray7.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tattr.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tbitfields.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound_complex.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tdatareg.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tdset.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tdset2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-dtd.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-dtd-2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-dtd-uri.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-nons.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-nons-2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-nons-uri.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-ns.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tempty-ns-2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tenum.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/textlink.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tfpformat.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/thlink.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tloop.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tloop2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tmany.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-amp.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-apos.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tnamed_dtype_attr.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-gt.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-lt.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-quot.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tname-sp.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tnodata.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tobjref.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/topaque.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr1.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr3.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/torderattr4.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tref.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tref-escapes.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tref-escapes-at.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tslink.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tstr.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tstr2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tstring.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tstring-at.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes3.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes4.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes5.h5.xml
+      ${HDF5_TOOLS_DIR}/testfiles/tvlstr.h5.xml
+  )
+
+  foreach (tst_xml_h5_file ${HDF5_XML_REFERENCE_TEST_FILES})
+    get_filename_component(fname "${tst_xml_h5_file}" NAME)
+    HDFTEST_COPY_FILE("${tst_xml_h5_file}" "${PROJECT_BINARY_DIR}/testfiles/xml/${fname}" "h5dump_xml_files")
+  endforeach ()
+
+  foreach (tst_xml_other_file ${HDF5_XML_REFERENCE_FILES})
+    get_filename_component(fname "${tst_xml_other_file}" NAME)
+    HDFTEST_COPY_FILE("${tst_xml_other_file}" "${PROJECT_BINARY_DIR}/testfiles/xml/${fname}" "h5dump_xml_files")
+  endforeach ()
+  add_custom_target(h5dump_xml_files ALL COMMENT "Copying files needed by h5dump_xml tests" DEPENDS ${h5dump_xml_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_XML_SKIP_H5_TEST skipresultfile skipresultcode testtype)
+    if (${testtype} STREQUAL "SKIP")
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5DUMP-XML-${skipresultfile}-SKIPPED
+            COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${skipresultfile}.xml --xml ${ARGN}"
+        )
+      endif ()
+    else ()
+      ADD_XML_H5_TEST (${skipresultfile} ${skipresultcode} ${ARGN})
+    endif ()
+  endmacro ()
+
+  macro (ADD_XML_H5_TEST resultfile resultcode)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-XML-${resultfile} COMMAND $<TARGET_FILE:h5dump> --xml ${ARGN})
+      set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/xml")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_xml_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-XML-${resultfile} PROPERTIES DEPENDS ${last_xml_test})
+      endif ()
+    else ()
+      add_test (
+          NAME H5DUMP-XML-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=--xml;${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/xml"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.xml"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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-XML-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          tall.h5.out
+          tall.h5.out.err
+          tall-2A.h5.out
+          tall-2A.h5.out.err
+          tarray1.h5.out
+          tarray1.h5.out.err
+          tarray2.h5.out
+          tarray2.h5.out.err
+          tarray3.h5.out
+          tarray3.h5.out.err
+          tarray6.h5.out
+          tarray6.h5.out.err
+          tarray7.h5.out
+          tarray7.h5.out.err
+          tattr.h5.out
+          tattr.h5.out.err
+          tbitfields.h5.out
+          tbitfields.h5.out.err
+          tcompound.h5.out
+          tcompound.h5.out.err
+          tcompound2.h5.out
+          tcompound2.h5.out.err
+          tcompound_complex.h5.out
+          tcompound_complex.h5.out.err
+          tdatareg.h5.out
+          tdatareg.h5.out.err
+          tdset.h5.out
+          tdset.h5.out.err
+          tdset2.h5.out
+          tdset2.h5.out.err
+          tempty-dtd-2.h5.out
+          tempty-dtd-2.h5.out.err
+          tempty-dtd-uri.h5.out
+          tempty-dtd-uri.h5.out.err
+          tempty-dtd.h5.out
+          tempty-dtd.h5.out.err
+          tempty-nons-2.h5.out
+          tempty-nons-2.h5.out.err
+          tempty-nons-uri.h5.out
+          tempty-nons-uri.h5.out.err
+          tempty-nons.h5.out
+          tempty-nons.h5.out.err
+          tempty-ns-2.h5.out
+          tempty-ns-2.h5.out.err
+          tempty-ns.h5.out
+          tempty-ns.h5.out.err
+          tempty.h5.out
+          tempty.h5.out.err
+          tenum.h5.out
+          tenum.h5.out.err
+          textlink.h5.out
+          textlink.h5.out.err
+          tfpformat.h5.out
+          tfpformat.h5.out.err
+          tgroup.h5.out
+          tgroup.h5.out.err
+          thlink.h5.out
+          thlink.h5.out.err
+          tloop.h5.out
+          tloop.h5.out.err
+          tloop2.h5.out
+          tloop2.h5.out.err
+          tmany.h5.out
+          tmany.h5.out.err
+          tname-amp.h5.out
+          tname-amp.h5.out.err
+          tname-apos.h5.out
+          tname-apos.h5.out.err
+          tname-gt.h5.out
+          tname-gt.h5.out.err
+          tname-lt.h5.out
+          tname-lt.h5.out.err
+          tname-quot.h5.out
+          tname-quot.h5.out.err
+          tname-sp.h5.out
+          tname-sp.h5.out.err
+          tnamed_dtype_attr.h5.out
+          tnamed_dtype_attr.h5.out.err
+          tnestedcomp.h5.out
+          tnestedcomp.h5.out.err
+          tnodata.h5.out
+          tnodata.h5.out.err
+          tnoname.h5.out
+          tnoname.h5.out.err
+          tobjref.h5.out
+          tobjref.h5.out.err
+          topaque.h5.out
+          topaque.h5.out.err
+          torderattr1.h5.out
+          torderattr1.h5.out.err
+          torderattr2.h5.out
+          torderattr2.h5.out.err
+          torderattr3.h5.out
+          torderattr3.h5.out.err
+          torderattr4.h5.out
+          torderattr4.h5.out.err
+          tref-escapes-at.h5.out
+          tref-escapes-at.h5.out.err
+          tref-escapes.h5.out
+          tref-escapes.h5.out.err
+          tref.h5.out
+          tref.h5.out.err
+          tsaf.h5.out
+          tsaf.h5.out.err
+          tslink.h5.out
+          tslink.h5.out.err
+          tstr.h5.out
+          tstr.h5.out.err
+          tstr2.h5.out
+          tstr2.h5.out.err
+          tstring.h5.out
+          tstring.h5.out.err
+          tstring-at.h5.out
+          tstring-at.h5.out.err
+          tudlink.h5.out
+          tudlink.h5.out.err
+          tvldtypes1.h5.out
+          tvldtypes1.h5.out.err
+          tvldtypes2.h5.out
+          tvldtypes2.h5.out.err
+          tvldtypes3.h5.out
+          tvldtypes3.h5.out.err
+          tvldtypes4.h5.out
+          tvldtypes4.h5.out.err
+          tvldtypes5.h5.out
+          tvldtypes5.h5.out.err
+          tvlstr.h5.out
+          tvlstr.h5.out.err
+    )
+    set_tests_properties (H5DUMP-XML-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/xml")
+    if (NOT "${last_xml_test}" STREQUAL "")
+      set_tests_properties (H5DUMP-XML-clearall-objects PROPERTIES DEPENDS ${last_xml_test})
+    endif ()
+    set (last_test "H5DUMP-XML-clearall-objects")
+  endif ()
+
+  ########## test XML
+  ADD_XML_H5_TEST (tall.h5 0 tall.h5)
+  ADD_XML_H5_TEST (tattr.h5 0 tattr.h5)
+  ADD_XML_H5_TEST (tbitfields.h5 0 tbitfields.h5)
+  ADD_XML_H5_TEST (tcompound.h5 0 tcompound.h5)
+  ADD_XML_H5_TEST (tcompound2.h5 0 tcompound2.h5)
+  ADD_XML_H5_TEST (tdatareg.h5 0 tdatareg.h5)
+  ADD_XML_H5_TEST (tdset.h5 0 tdset.h5)
+  ADD_XML_H5_TEST (tdset2.h5 0 tdset2.h5)
+  ADD_XML_H5_TEST (tenum.h5 0 tenum.h5)
+  ADD_XML_H5_TEST (tgroup.h5 0 tgroup.h5)
+  ADD_XML_H5_TEST (thlink.h5 0 thlink.h5)
+  ADD_XML_H5_TEST (tloop.h5 0 tloop.h5)
+  ADD_XML_H5_TEST (tloop2.h5 0 tloop2.h5)
+  ADD_XML_H5_TEST (tmany.h5 0 tmany.h5)
+  ADD_XML_H5_TEST (tnestedcomp.h5 0 tnestedcomp.h5)
+  ADD_XML_H5_TEST (tcompound_complex.h5 0 tcompound_complex.h5)
+  ADD_XML_H5_TEST (tobjref.h5 0 tobjref.h5)
+  ADD_XML_H5_TEST (topaque.h5 0 topaque.h5)
+  ADD_XML_H5_TEST (tslink.h5 0 tslink.h5)
+  ADD_XML_H5_TEST (tudlink.h5 0 tudlink.h5)
+  ADD_XML_H5_TEST (textlink.h5 0 textlink.h5)
+  ADD_XML_H5_TEST (tstr.h5 0 tstr.h5)
+  ADD_XML_H5_TEST (tstr2.h5 0 tstr2.h5)
+  ADD_XML_H5_TEST (tref.h5 0 tref.h5)
+  ADD_XML_H5_TEST (tname-amp.h5 0 tname-amp.h5)
+  ADD_XML_H5_TEST (tname-apos.h5 0 tname-apos.h5)
+  ADD_XML_H5_TEST (tname-gt.h5 0 tname-gt.h5)
+  ADD_XML_H5_TEST (tname-lt.h5 0 tname-lt.h5)
+  ADD_XML_H5_TEST (tname-quot.h5 0 tname-quot.h5)
+  ADD_XML_H5_TEST (tname-sp.h5 0 tname-sp.h5)
+  ADD_XML_H5_TEST (tstring.h5 0 tstring.h5)
+  ADD_XML_H5_TEST (tstring-at.h5 0 tstring-at.h5)
+  ADD_XML_H5_TEST (tref-escapes.h5 0 tref-escapes.h5)
+  ADD_XML_H5_TEST (tref-escapes-at.h5 0 tref-escapes-at.h5)
+  ADD_XML_H5_TEST (tnodata.h5 0 tnodata.h5)
+  ADD_XML_H5_TEST (tarray1.h5 0 tarray1.h5)
+  ADD_XML_H5_TEST (tarray2.h5 0 tarray2.h5)
+  ADD_XML_H5_TEST (tarray3.h5 0 tarray3.h5)
+  ADD_XML_H5_TEST (tarray6.h5 0 tarray6.h5)
+  ADD_XML_H5_TEST (tarray7.h5 0 tarray7.h5)
+  ADD_XML_H5_TEST (tvldtypes1.h5 0 tvldtypes1.h5)
+  ADD_XML_H5_TEST (tvldtypes2.h5 0 tvldtypes2.h5)
+  ADD_XML_H5_TEST (tvldtypes3.h5 0 tvldtypes3.h5)
+  ADD_XML_H5_TEST (tvldtypes4.h5 0 tvldtypes4.h5)
+  ADD_XML_H5_TEST (tvldtypes5.h5 0 tvldtypes5.h5)
+  ADD_XML_H5_TEST (tvlstr.h5 0 tvlstr.h5)
+  ADD_XML_H5_TEST (tsaf.h5 0 tsaf.h5)
+  ADD_XML_H5_TEST (tempty.h5 0 tempty.h5)
+  ADD_XML_H5_TEST (tnamed_dtype_attr.h5 0 tnamed_dtype_attr.h5)
+  ##Test dataset and attribute of null space.  Commented out:
+  ## wait until the XML schema is updated for null space.
+  ##  ADD_XML_H5_TEST (tnullspace.h5 0 tnulspace.h5)
+  ## So is dataspace with 0 dimension size.
+  ##  ADD_XML_H5_TEST (zerodim.h5 0 zerodim.h5)
+
+  # other options for xml
+
+  ADD_XML_H5_TEST (tempty-dtd.h5 0 --use-dtd tempty.h5)
+  ADD_XML_H5_TEST (tempty-dtd-2.h5 0 -u tempty.h5)
+
+  ADD_XML_H5_TEST (tempty-nons-2.h5 0 --xml-ns=: tempty.h5)
+
+  ## Some of these combinations are syntactically correct but
+  ##  the URLs are dummies
+  ADD_XML_H5_TEST (tempty-ns.h5 0 -X thing: tempty.h5)
+  ADD_XML_H5_TEST (tempty-ns-2.h5 0 --xml-ns=thing: tempty.h5)
+  ADD_XML_H5_TEST (tempty-nons-uri.h5 0 --xml-ns=: --xml-dtd=http://somewhere.net tempty.h5)
+  ADD_XML_H5_TEST (tempty-dtd-uri.h5 0 --use-dtd --xml-dtd=http://somewhere.net tempty.h5)
+
+  ADD_XML_H5_TEST (tall-2A.h5 0 -A tall.h5)
+
+
+  # tests for attribute order
+  ADD_XML_H5_TEST (torderattr1.h5 0 -H --sort_by=name --sort_order=ascending torderattr.h5)
+  ADD_XML_H5_TEST (torderattr2.h5 0 -H --sort_by=name --sort_order=descending torderattr.h5)
+  ADD_XML_H5_TEST (torderattr3.h5 0 -H --sort_by=creation_order --sort_order=ascending torderattr.h5)
+  ADD_XML_H5_TEST (torderattr4.h5 0 -H --sort_by=creation_order --sort_order=descending torderattr.h5)
+
+  # tests for floating point user defined printf format
+  ADD_XML_H5_TEST (tfpformat.h5 0 -u -m %.7f tfpformat.h5)
+
diff --git a/tools/test/h5dump/Makefile.am b/tools/test/h5dump/Makefile.am
new file mode 100644
index 0000000..df97396
--- /dev/null
+++ b/tools/test/h5dump/Makefile.am
@@ -0,0 +1,58 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 files in /src directory and /tools/lib directory
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
+
+# Test programs and scripts
+TEST_PROG=h5dumpgentest
+TEST_SCRIPT=testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh testh5dumpxml.sh
+
+check_PROGRAMS=$(TEST_PROG) binread
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5dump/h5dump$(EXEEXT)
+if HAVE_SHARED_CONDITIONAL
+if USE_PLUGINS_CONDITIONAL
+   TEST_SCRIPT += h5dump_plugin.sh
+endif
+endif
+
+# All the programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+if HAVE_SHARED_CONDITIONAL
+  # Build it as shared library if configure is enabled for shared library.
+  dyn_LTLIBRARIES=libdynlibdump.la
+  libdynlibdump_la_SOURCES=dynlib_dump.c
+  libdynlibdump_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+libdynlibdump.la: $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_DEPENDENCIES) $(EXTRA_libdynlibdump_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlibdump_la_LINK) $(am_libdynlibdump_la_rpath) $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_LIBADD) 
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+endif
+
+# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES+=*.h5 *.bin
+DISTCLEANFILES=testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh h5dump_plugin.sh
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5dump/Makefile.in b/tools/test/h5dump/Makefile.in
new file mode 100644
index 0000000..7db1805
--- /dev/null
+++ b/tools/test/h5dump/Makefile.in
@@ -0,0 +1,1517 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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) binread$(EXEEXT)
+ at HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5dump_plugin.sh
+TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5dump_plugin.sh testh5dump.sh testh5dumppbits.sh \
+	testh5dumpvds.sh testh5dumpxml.sh
+CONFIG_CLEAN_VPATH_FILES =
+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__installdirs = "$(DESTDIR)$(dyndir)"
+LTLIBRARIES = $(dyn_LTLIBRARIES)
+libdynlibdump_la_LIBADD =
+am__libdynlibdump_la_SOURCES_DIST = dynlib_dump.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibdump_la_OBJECTS =  \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_dump.lo
+libdynlibdump_la_OBJECTS = $(am_libdynlibdump_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 = 
+libdynlibdump_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libdynlibdump_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibdump_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+am__EXEEXT_1 = h5dumpgentest$(EXEEXT)
+binread_SOURCES = binread.c
+binread_OBJECTS = binread.$(OBJEXT)
+binread_LDADD = $(LDADD)
+binread_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5dumpgentest_SOURCES = h5dumpgentest.c
+h5dumpgentest_OBJECTS = h5dumpgentest.$(OBJEXT)
+h5dumpgentest_LDADD = $(LDADD)
+h5dumpgentest_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 = $(libdynlibdump_la_SOURCES) binread.c h5dumpgentest.c
+DIST_SOURCES = $(am__libdynlibdump_la_SOURCES_DIST) binread.c \
+	h5dumpgentest.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__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)/h5dump_plugin.sh.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@
+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 files in /src directory and /tools/lib 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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+
+# Temporary files.  *.h5 are generated by h5dumpgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.bin
+
+# Test programs and scripts
+TEST_PROG = h5dumpgentest
+TEST_SCRIPT = testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh \
+	testh5dumpxml.sh $(am__append_1)
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5dump/h5dump$(EXEEXT)
+
+# All the programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+ at HAVE_SHARED_CONDITIONAL_TRUE@dyn_LTLIBRARIES = libdynlibdump.la
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdump_la_SOURCES = dynlib_dump.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdump_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+DISTCLEANFILES = testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh h5dump_plugin.sh
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5dump/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5dump/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):
+h5dump_plugin.sh: $(top_builddir)/config.status $(srcdir)/h5dump_plugin.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+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-dynLTLIBRARIES: $(dyn_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dyndir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dyndir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dyndir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dyndir)"; \
+	}
+
+uninstall-dynLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dyndir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dyndir)/$$f"; \
+	done
+
+clean-dynLTLIBRARIES:
+	-test -z "$(dyn_LTLIBRARIES)" || rm -f $(dyn_LTLIBRARIES)
+	@list='$(dyn_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlibdump.la: $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_DEPENDENCIES) $(EXTRA_libdynlibdump_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlibdump_la_LINK) $(am_libdynlibdump_la_rpath) $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_LIBADD) $(LIBS)
+
+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
+
+binread$(EXEEXT): $(binread_OBJECTS) $(binread_DEPENDENCIES) $(EXTRA_binread_DEPENDENCIES) 
+	@rm -f binread$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(binread_OBJECTS) $(binread_LDADD) $(LIBS)
+
+h5dumpgentest$(EXEEXT): $(h5dumpgentest_OBJECTS) $(h5dumpgentest_DEPENDENCIES) $(EXTRA_h5dumpgentest_DEPENDENCIES) 
+	@rm -f h5dumpgentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5dumpgentest_OBJECTS) $(h5dumpgentest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/binread.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_dump.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5dumpgentest.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+h5dumpgentest.log: h5dumpgentest$(EXEEXT)
+	@p='h5dumpgentest$(EXEEXT)'; \
+	b='h5dumpgentest'; \
+	$(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 $(LTLIBRARIES) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(dyndir)"; 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-checkPROGRAMS clean-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+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: uninstall-dynLTLIBRARIES
+
+.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-dynLTLIBRARIES \
+	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-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+.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
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibdump.la: $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_DEPENDENCIES) $(EXTRA_libdynlibdump_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlibdump_la_LINK) $(am_libdynlibdump_la_rpath) $(libdynlibdump_la_OBJECTS) $(libdynlibdump_la_LIBADD) 
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-dyn: $(DYN)
+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 dyn 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/test/h5dump/binread.c b/tools/test/h5dump/binread.c
new file mode 100644
index 0000000..6165cd8
--- /dev/null
+++ b/tools/test/h5dump/binread.c
@@ -0,0 +1,95 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 <string.h>
+
+/*
+ This program reads binary output from h5dump (-b option).
+ To use change the following 3 symbols accordingly.
+ For example, to read 2 elements of a float type , define
+
+  #define NELMTS     2
+  #define TYPE       float
+  #define FORMAT     "%f "
+
+*/
+
+#define NELMTS     6
+#define TYPE       int
+#define FORMAT     "%d "
+
+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: Prints a usage message on stderr and then returns.
+ *
+ * Return: void
+ *
+ * Programmer:  Pedro Vicente Nunes
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (void)
+{
+    fprintf(stderr, "usage: binread FILE_NAME\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: main program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+main (int argc, const char *argv[])
+{
+    FILE  *stream;
+    size_t numread;
+    TYPE   buf[NELMTS];
+    size_t i, nelmts = NELMTS;
+    char  *fname=NULL;
+
+    if (argc != 2) {
+        usage();
+        exit(1);
+    }
+
+    fname = strdup(argv[1]);
+
+    if((stream = fopen(fname, "rb")) != NULL) {
+        numread = fread(buf, sizeof( TYPE ), nelmts, stream);
+        printf("Number of items read = %llu\n", (unsigned long long)numread);
+
+        for (i = 0; i < nelmts; i++) {
+            printf(FORMAT,buf[i]);
+        }
+        printf("\n");
+
+        fclose(stream);
+    }
+    else
+        printf("File %s could not be opened\n", fname);
+
+    free(fname);
+
+    return 0;
+}
+
diff --git a/tools/test/h5dump/dynlib_dump.c b/tools/test/h5dump/dynlib_dump.c
new file mode 100644
index 0000000..571452e
--- /dev/null
+++ b/tools/test/h5dump/dynlib_dump.c
@@ -0,0 +1,89 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIBUD      300
+#define MULTIPLIER              3
+
+static size_t H5Z_filter_dynlibud(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_DYNLIBUD[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIBUD,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlibud",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlibud,    /* The actual filter function    */
+}};
+
+H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+const void   *H5PLget_plugin_info(void) {return H5Z_DYNLIBUD;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlibud
+ *
+ * Purpose:    A dynlib2 filter method that multiplies the original value
+ *              during write and divide the original value during read. It
+ *              will be built as a shared library.  plugin.c test will load
+ *              and use this filter library.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    char *int_ptr = (char *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+
+    /* Check for the correct number of parameters */
+    if(cd_nelmts > 0)
+        return(0);
+
+    /* Assignment to eliminate unused parameter warning. */
+    cd_values = cd_values;
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Subtract the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp - MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp + MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlibud() */
+
diff --git a/tools/h5dump/errfiles/filter_fail.err b/tools/test/h5dump/errfiles/filter_fail.err
similarity index 100%
rename from tools/h5dump/errfiles/filter_fail.err
rename to tools/test/h5dump/errfiles/filter_fail.err
diff --git a/tools/h5dump/errfiles/non_existing.err b/tools/test/h5dump/errfiles/non_existing.err
similarity index 100%
rename from tools/h5dump/errfiles/non_existing.err
rename to tools/test/h5dump/errfiles/non_existing.err
diff --git a/tools/h5dump/errfiles/tall-1.err b/tools/test/h5dump/errfiles/tall-1.err
similarity index 100%
rename from tools/h5dump/errfiles/tall-1.err
rename to tools/test/h5dump/errfiles/tall-1.err
diff --git a/tools/h5dump/errfiles/tall-2A.err b/tools/test/h5dump/errfiles/tall-2A.err
similarity index 100%
rename from tools/h5dump/errfiles/tall-2A.err
rename to tools/test/h5dump/errfiles/tall-2A.err
diff --git a/tools/h5dump/errfiles/tall-2A0.err b/tools/test/h5dump/errfiles/tall-2A0.err
similarity index 100%
rename from tools/h5dump/errfiles/tall-2A0.err
rename to tools/test/h5dump/errfiles/tall-2A0.err
diff --git a/tools/h5dump/errfiles/tall-2B.err b/tools/test/h5dump/errfiles/tall-2B.err
similarity index 100%
rename from tools/h5dump/errfiles/tall-2B.err
rename to tools/test/h5dump/errfiles/tall-2B.err
diff --git a/tools/h5dump/errfiles/tarray1_big.err b/tools/test/h5dump/errfiles/tarray1_big.err
similarity index 100%
rename from tools/h5dump/errfiles/tarray1_big.err
rename to tools/test/h5dump/errfiles/tarray1_big.err
diff --git a/tools/h5dump/errfiles/tattr-3.err b/tools/test/h5dump/errfiles/tattr-3.err
similarity index 100%
rename from tools/h5dump/errfiles/tattr-3.err
rename to tools/test/h5dump/errfiles/tattr-3.err
diff --git a/tools/h5dump/errfiles/tattrregR.err b/tools/test/h5dump/errfiles/tattrregR.err
similarity index 100%
rename from tools/h5dump/errfiles/tattrregR.err
rename to tools/test/h5dump/errfiles/tattrregR.err
diff --git a/tools/h5dump/errfiles/tcomp-3.err b/tools/test/h5dump/errfiles/tcomp-3.err
similarity index 100%
rename from tools/h5dump/errfiles/tcomp-3.err
rename to tools/test/h5dump/errfiles/tcomp-3.err
diff --git a/tools/h5dump/errfiles/tdataregR.err b/tools/test/h5dump/errfiles/tdataregR.err
similarity index 100%
rename from tools/h5dump/errfiles/tdataregR.err
rename to tools/test/h5dump/errfiles/tdataregR.err
diff --git a/tools/h5dump/errfiles/tdset-2.err b/tools/test/h5dump/errfiles/tdset-2.err
similarity index 100%
rename from tools/h5dump/errfiles/tdset-2.err
rename to tools/test/h5dump/errfiles/tdset-2.err
diff --git a/tools/h5dump/errfiles/texceedsubblock.err b/tools/test/h5dump/errfiles/texceedsubblock.err
similarity index 100%
rename from tools/h5dump/errfiles/texceedsubblock.err
rename to tools/test/h5dump/errfiles/texceedsubblock.err
diff --git a/tools/h5dump/errfiles/texceedsubcount.err b/tools/test/h5dump/errfiles/texceedsubcount.err
similarity index 100%
rename from tools/h5dump/errfiles/texceedsubcount.err
rename to tools/test/h5dump/errfiles/texceedsubcount.err
diff --git a/tools/h5dump/errfiles/texceedsubstart.err b/tools/test/h5dump/errfiles/texceedsubstart.err
similarity index 100%
rename from tools/h5dump/errfiles/texceedsubstart.err
rename to tools/test/h5dump/errfiles/texceedsubstart.err
diff --git a/tools/h5dump/errfiles/texceedsubstride.err b/tools/test/h5dump/errfiles/texceedsubstride.err
similarity index 100%
rename from tools/h5dump/errfiles/texceedsubstride.err
rename to tools/test/h5dump/errfiles/texceedsubstride.err
diff --git a/tools/h5dump/errfiles/textlink.err b/tools/test/h5dump/errfiles/textlink.err
similarity index 100%
rename from tools/h5dump/errfiles/textlink.err
rename to tools/test/h5dump/errfiles/textlink.err
diff --git a/tools/h5dump/errfiles/textlinkfar.err b/tools/test/h5dump/errfiles/textlinkfar.err
similarity index 100%
rename from tools/h5dump/errfiles/textlinkfar.err
rename to tools/test/h5dump/errfiles/textlinkfar.err
diff --git a/tools/h5dump/errfiles/textlinksrc.err b/tools/test/h5dump/errfiles/textlinksrc.err
similarity index 100%
rename from tools/h5dump/errfiles/textlinksrc.err
rename to tools/test/h5dump/errfiles/textlinksrc.err
diff --git a/tools/h5dump/errfiles/tgroup-2.err b/tools/test/h5dump/errfiles/tgroup-2.err
similarity index 100%
rename from tools/h5dump/errfiles/tgroup-2.err
rename to tools/test/h5dump/errfiles/tgroup-2.err
diff --git a/tools/h5dump/errfiles/tnofilename-with-packed-bits.err b/tools/test/h5dump/errfiles/tnofilename-with-packed-bits.err
similarity index 100%
rename from tools/h5dump/errfiles/tnofilename-with-packed-bits.err
rename to tools/test/h5dump/errfiles/tnofilename-with-packed-bits.err
diff --git a/tools/h5dump/errfiles/torderlinks1.err b/tools/test/h5dump/errfiles/torderlinks1.err
similarity index 100%
rename from tools/h5dump/errfiles/torderlinks1.err
rename to tools/test/h5dump/errfiles/torderlinks1.err
diff --git a/tools/h5dump/errfiles/torderlinks2.err b/tools/test/h5dump/errfiles/torderlinks2.err
similarity index 100%
rename from tools/h5dump/errfiles/torderlinks2.err
rename to tools/test/h5dump/errfiles/torderlinks2.err
diff --git a/tools/h5dump/errfiles/tpbitsCharLengthExceeded.err b/tools/test/h5dump/errfiles/tpbitsCharLengthExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsCharLengthExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsCharLengthExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsCharOffsetExceeded.err b/tools/test/h5dump/errfiles/tpbitsCharOffsetExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsCharOffsetExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsCharOffsetExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsIncomplete.err b/tools/test/h5dump/errfiles/tpbitsIncomplete.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsIncomplete.err
rename to tools/test/h5dump/errfiles/tpbitsIncomplete.err
diff --git a/tools/h5dump/errfiles/tpbitsIntLengthExceeded.err b/tools/test/h5dump/errfiles/tpbitsIntLengthExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsIntLengthExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsIntLengthExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsIntOffsetExceeded.err b/tools/test/h5dump/errfiles/tpbitsIntOffsetExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsIntOffsetExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsIntOffsetExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsLengthExceeded.err b/tools/test/h5dump/errfiles/tpbitsLengthExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsLengthExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsLengthExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsLengthPositive.err b/tools/test/h5dump/errfiles/tpbitsLengthPositive.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsLengthPositive.err
rename to tools/test/h5dump/errfiles/tpbitsLengthPositive.err
diff --git a/tools/h5dump/errfiles/tpbitsLongLengthExceeded.err b/tools/test/h5dump/errfiles/tpbitsLongLengthExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsLongLengthExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsLongLengthExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsLongOffsetExceeded.err b/tools/test/h5dump/errfiles/tpbitsLongOffsetExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsLongOffsetExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsLongOffsetExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsMaxExceeded.err b/tools/test/h5dump/errfiles/tpbitsMaxExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsMaxExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsMaxExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsOffsetExceeded.err b/tools/test/h5dump/errfiles/tpbitsOffsetExceeded.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsOffsetExceeded.err
rename to tools/test/h5dump/errfiles/tpbitsOffsetExceeded.err
diff --git a/tools/h5dump/errfiles/tpbitsOffsetNegative.err b/tools/test/h5dump/errfiles/tpbitsOffsetNegative.err
similarity index 100%
rename from tools/h5dump/errfiles/tpbitsOffsetNegative.err
rename to tools/test/h5dump/errfiles/tpbitsOffsetNegative.err
diff --git a/tools/h5dump/errfiles/tperror.err b/tools/test/h5dump/errfiles/tperror.err
similarity index 100%
rename from tools/h5dump/errfiles/tperror.err
rename to tools/test/h5dump/errfiles/tperror.err
diff --git a/tools/h5dump/errfiles/tqmarkfile.err b/tools/test/h5dump/errfiles/tqmarkfile.err
similarity index 100%
rename from tools/h5dump/errfiles/tqmarkfile.err
rename to tools/test/h5dump/errfiles/tqmarkfile.err
diff --git a/tools/h5dump/errfiles/tslink-D.err b/tools/test/h5dump/errfiles/tslink-D.err
similarity index 100%
rename from tools/h5dump/errfiles/tslink-D.err
rename to tools/test/h5dump/errfiles/tslink-D.err
diff --git a/tools/test/h5dump/h5dump_plugin.sh.in b/tools/test/h5dump/h5dump_plugin.sh.in
new file mode 100644
index 0000000..e7ac564
--- /dev/null
+++ b/tools/test/h5dump/h5dump_plugin.sh.in
@@ -0,0 +1,239 @@
+#! /bin/sh
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+srcdir=@srcdir@
+TOP_BUILDDIR=@top_builddir@
+
+# Determine backward compatibility options enabled
+DEPRECATED_SYMBOLS="@DEPRECATED_SYMBOLS@"
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5DUMP=../../src/h5dump/h5dump         # The h5dump tool name
+H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes      # default is yes
+
+TEST_NAME=ud_plugin
+FROM_DIR=`pwd`/.libs
+PLUGIN_LIB="$FROM_DIR/libdynlibdump.*"
+PLUGIN_LIBDIR=testdir3
+RM='rm -rf'
+
+RM='rm -rf'
+GREP='grep'
+CMP='cmp'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# source dirs
+SRC_TOOLS="$srcdir/../.."
+
+# testfiles source dirs for tools
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+
+TESTDIR=./testplug
+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_H5DUMP_TESTFILES/tudfilter.h5
+$SRC_H5DUMP_TESTFILES/tudfilter.ddl
+"
+
+# RUNSERIAL is used. Check if it can return exit code from executable correctly.
+if [ -n "$RUNSERIAL_NOEXITCODE" ]; then
+    echo "***Warning*** Serial Exit Code is not passed back to shell correctly."
+    echo "***Warning*** Exit code checking is skipped."
+    h5haveexitcode=no
+fi
+
+# Main Body
+# Create test directories if not exists yet.
+test -d $PLUGIN_LIBDIR || mkdir -p $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to create test directory($PLUGIN_LIBDIR)"
+    exit $EXIT_FAILURE
+fi
+
+# copy plugin library for test
+$CP $PLUGIN_LIB $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to copy plugin library ($PLUGIN_LIB) for test."
+    exit $EXIT_FAILURE
+fi
+
+# setup plugin path
+ENVCMD="env HDF5_PLUGIN_PATH=../${PLUGIN_LIBDIR}"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_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=$SRC_H5DUMP_TESTFILES
+    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 $* message left justified in a field of 70 characters
+#
+MESSAGE() {
+   SPACES="                                                               "
+   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# 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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY() {
+    MESSAGE "Verifying $*"
+}
+
+# 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.
+# If $1 == ignorecase then do caseless CMP and DIFF.
+# ADD_H5_TEST
+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 $H5DUMP $@
+    (
+    cd $TESTDIR
+      $ENVCMD $RUNSERIAL $H5DUMP_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 > /dev/null 2>&1 ; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $caseless $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
+
+}
+
+##############################################################################
+###           T H E   T E S T S
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# Run the test
+TOOLTEST tudfilter.ddl --enable-error-stack tudfilter.h5
+
+# print results
+if test $nerrors -ne 0 ; then
+    echo "$nerrors errors encountered"
+    exit_code=$EXIT_FAILURE
+else
+    echo "All Plugin API tests passed."
+    exit_code=$EXIT_SUCCESS
+fi
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Clean up temporary files/directories and leave
+$RM $PLUGIN_LIBDIR
+
+exit $exit_code
diff --git a/tools/test/h5dump/h5dumpgentest.c b/tools/test/h5dump/h5dumpgentest.c
new file mode 100644
index 0000000..48bc27d
--- /dev/null
+++ b/tools/test/h5dump/h5dumpgentest.c
@@ -0,0 +1,10535 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 h5dump tests.
+ * Usage: just execute the program without any arguments will
+ * generate all the binary hdf5 files in the local directory.
+ *
+ * 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 <limits.h>
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+
+#define FILE1 "tgroup.h5"
+#define FILE2 "tdset.h5"
+#define FILE3 "tattr.h5"
+#define FILE4 "tslink.h5"
+#define FILE4_1 "tsoftlinks.h5"
+#define FILE5 "thlink.h5"
+#define FILE6 "tcompound.h5"
+#define FILE7 "tall.h5"
+#define FILE8 "tdset2.h5"
+#define FILE9 "tcompound2.h5"
+#define FILE10 "tloop.h5"
+#define FILE11 "tloop2.h5"
+#define FILE12 "tmany.h5"
+#define FILE13 "tstr.h5"
+#define FILE14 "tstr2.h5"
+#define FILE15 "tenum.h5"
+#define FILE16 "tobjref.h5"
+#define FILE17 "tdatareg.h5"
+#define FILE18 "tnestedcomp.h5"
+#define FILE19 "topaque.h5"
+#define FILE20 "tbitfields.h5"
+#define FILE21 "tvldtypes1.h5"
+#define FILE22 "tvldtypes2.h5"
+#define FILE23 "tvldtypes3.h5"
+#define FILE24 "tvldtypes4.h5"
+#define FILE25 "tarray1.h5"
+#define FILE25_BIG "tarray1_big.h5"
+#define FILE26 "tarray2.h5"
+#define FILE27 "tarray3.h5"
+#define FILE28 "tarray4.h5"
+#define FILE29 "tarray5.h5"
+#define FILE30 "tarray6.h5"
+#define FILE31 "tarray7.h5"
+#define FILE32 "tempty.h5"
+#define FILE33  "tgrp_comments.h5"
+#define FILE34  "tsplit_file"
+#define FILE35  "tfamily%05d.h5"
+#define FILE36  "tmulti"
+#define FILE37  "tlarge_objname.h5"
+#define FILE38  "tvlstr.h5"
+#define FILE39  "tchar.h5"
+#define FILE40  "tattr2.h5"
+#define FILE41  "tcompound_complex.h5"
+#define FILE42  "tnamed_dtype_attr.h5"
+#define FILE43  "tvldtypes5.h5"
+#define FILE44  "tfilters.h5"
+#define FILE45  "tnullspace.h5"
+#define FILE46  "tfcontents1.h5"
+#define FILE47  "tfcontents2.h5"
+#define FILE48  "tfvalues.h5"
+#define FILE49  "tstr3.h5"
+#define FILE50  "taindices.h5"
+#define FILE51  "tlonglinks.h5"
+#define FILE52  "tldouble.h5"
+#define FILE53  "textlink.h5"
+#define FILE54  "tudlink.h5"
+#define FILE55  "tbinary.h5"
+#define FILE56  "tbigdims.h5"
+#define FILE57  "thyperslab.h5"
+#define FILE58  "tordergr.h5"
+#define FILE59  "torderattr.h5"
+#define FILE60  "tfpformat.h5"
+#define FILE61  "textlinksrc.h5"
+#define FILE62  "textlinktar.h5"
+#define FILE63  "textlinkfar.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"
+#define FILE72  "tnestedcmpddt.h5"
+#define FILE73  "tscalarintsize.h5"
+#define FILE74  "tscalarattrintsize.h5"
+#define FILE75  "tscalarstring.h5"
+#define FILE76  "tcmpdintarray.h5"
+#define FILE77  "tcmpdints.h5"
+#define FILE78  "tscalarintattrsize.h5"
+#define FILE79  "tintsattrs.h5"
+#define FILE80  "tbitnopaque.h5"
+#define FILE81  "tints4dims.h5"
+#define FILE82  "tcompound_complex2.h5"
+#define FILE83  "tvlenstr_array.h5"
+#define FILE84  "tudfilter.h5"
+
+/*-------------------------------------------------------------------------
+ * prototypes
+ *-------------------------------------------------------------------------
+ */
+
+/* utility functions */
+static int
+make_dset(hid_t loc_id, const char *name, hid_t sid, hid_t tid, hid_t dcpl, void *buf);
+static int
+write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
+        hid_t tid, void *buf);
+static int
+write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
+        hid_t tid, void *buf );
+
+/* a filter operation callback function */
+static size_t
+myfilter(unsigned int H5_ATTR_UNUSED 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);
+
+/* a "set local" callback     */
+static herr_t
+set_local_myfilter(hid_t dcpl_id, hid_t tid, hid_t H5_ATTR_UNUSED sid);
+
+#define MYFILTER_ID 405
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_MYFILTER[1] = {{
+        H5Z_CLASS_T_VERS,
+        MYFILTER_ID,               /* Filter id number      */
+        1, 1,
+        "myfilter",                /* Filter name for debugging */
+        NULL,                /* The "can apply" callback     */
+        set_local_myfilter,  /* The "set local" callback     */
+        myfilter,            /* The actual filter function */
+}};
+
+#define H5Z_FILTER_DYNLIBUD      300
+#define MULTIPLIER              3
+
+static size_t H5Z_filter_dynlibud(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_DYNLIBUD[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIBUD,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlibud",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlibud,    /* The actual filter function    */
+}};
+
+
+/* A UD link traversal function.  Shouldn't actually be called. */
+static hid_t UD_traverse(H5_ATTR_UNUSED const char * link_name, H5_ATTR_UNUSED hid_t cur_group,
+        H5_ATTR_UNUSED const void * udata, H5_ATTR_UNUSED size_t udata_size, H5_ATTR_UNUSED hid_t lapl_id)
+{
+    return -1;
+}
+
+#define MY_LINKCLASS 187
+
+const H5L_class_t UD_link_class[1] = {{
+        H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
+        (H5L_type_t)MY_LINKCLASS, /* Link type id number            */
+        "UD link class",          /* name for debugging             */
+        NULL,                     /* Creation callback              */
+        NULL,                     /* Move/rename callback           */
+        NULL,                     /* Copy callback                  */
+        UD_traverse,              /* The actual traversal function  */
+        NULL,                     /* Deletion callback              */
+        NULL                      /* Query callback                 */
+}};
+
+
+#define LENSTR  50
+#define LENSTR2  11
+
+#define SPACE2_RANK 2
+#define SPACE2_DIM1 10
+#define SPACE2_DIM2 10
+
+#define SPACE1_RANK 1
+#define SPACE1_DIM1 4
+
+#define DIM1  20
+#define DIM2  10
+#define CDIM1 DIM1/2
+#define CDIM2 DIM2/2
+#define RANK  2
+
+/* Dataspace of 0 dimension size */
+#define SPACE3_RANK 2
+#define SPACE3_DIM1 0
+#define SPACE3_DIM2 0
+
+/* Element selection information */
+#define POINT1_NPOINTS 10
+
+typedef enum{
+    RED,
+    GREEN,
+    BLUE,
+    WHITE,
+    BLACK
+} enumtype;
+
+/* Compound datatype */
+typedef struct s1_t {
+        unsigned int a;
+        unsigned int b;
+        float c;
+} s1_t;
+
+
+/* 1-D array datatype */
+#define ARRAY1_RANK 1
+#define ARRAY1_DIM1 4
+
+/* 3-D array datatype */
+#define ARRAY2_RANK 3
+#define ARRAY2_DIM1 3
+#define ARRAY2_DIM2 4
+#define ARRAY2_DIM3 5
+
+/* 2-D array datatype */
+#define ARRAY3_RANK 2
+#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"
+/* Dataset dimensions                                                 */
+#define F41_LENGTH         6
+#define F41_RANK           1
+#define F41_ARRAY_RANK     1
+#define F41_ARRAY_RANKd    2
+#define F41_DIMb           4
+#define F41_ARRAY_DIMc     6
+#define F41_ARRAY_DIMd1    5
+#define F41_ARRAY_DIMd2    6
+#define F41_ARRAY_DIMf     10
+
+/* "File 42" macros */
+/* Name of dataset to create in datafile                              */
+#define F42_DSETNAME "Dataset"
+#define F42_TYPENAME "Datatype"
+#define F42_ATTRNAME "Attribute"
+#define F42_LINKNAME "Link_to_Datatype"
+
+/* "File 43" macros */
+/* Name of dataset to create in datafile                              */
+#define F43_DSETNAME "Dataset"
+
+/* "File 51" macros */
+#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_FSPACE_STRATEGY_NONE 	/* File space handling strategy */
+#define THRESHOLD10   		10   		/* Free-space section threshold */
+#define FSPACE_PAGE_SIZE     	8192 		/* File space page size */
+
+/* "FILE66" macros and for FILE69 */
+#define F66_XDIM        8
+#define F66_DATASETU08        "DU08BITS"
+#define F66_DATASETS08        "DS08BITS"
+#define F66_YDIM8        8
+#define F66_DATASETU16       "DU16BITS"
+#define F66_DATASETS16       "DS16BITS"
+#define F66_YDIM16        16
+#define F66_DATASETU32       "DU32BITS"
+#define F66_DATASETS32       "DS32BITS"
+#define F66_YDIM32        32
+#define F66_DATASETU64       "DU64BITS"
+#define F66_DATASETS64       "DS64BITS"
+#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"
+#define F70_LENGTH      4
+#define F70_RANK        1
+#define F70_ARRAY_RANK  2
+#define F70_XDIM        8
+#define F70_DATASETU08        "DU08BITS"
+#define F70_DATASETS08        "DS08BITS"
+#define F70_YDIM8       8
+#define F70_DATASETU16       "DU16BITS"
+#define F70_DATASETS16       "DS16BITS"
+#define F70_YDIM16      16
+#define F70_DATASETU32       "DU32BITS"
+#define F70_DATASETS32       "DS32BITS"
+#define F70_YDIM32      32
+#define F70_DATASETU64       "DU64BITS"
+#define F70_DATASETS64       "DS64BITS"
+#define F70_YDIM64      64
+#define F70_DUMMYDBL        "DummyDBL"
+/* Name of dataset to create in datafile   */
+#define F71_DATASETNAME   "CompoundAttrIntSize"
+
+/* "FILE73" macros and for FILE69 and FILE78 */
+#define F73_ARRAY_RANK  2
+#define F73_XDIM        8
+#define F73_DATASETU08        "DU08BITS"
+#define F73_DATASETS08        "DS08BITS"
+#define F73_YDIM8       8
+#define F73_DATASETU16       "DU16BITS"
+#define F73_DATASETS16       "DS16BITS"
+#define F73_YDIM16      16
+#define F73_DATASETU32       "DU32BITS"
+#define F73_DATASETS32       "DS32BITS"
+#define F73_YDIM32      32
+#define F73_DATASETU64       "DU64BITS"
+#define F73_DATASETS64       "DS64BITS"
+#define F73_YDIM64      64
+#define F73_DUMMYDBL        "DummyDBL"
+
+/* "FILE76 and FILE77 */
+/* Name of dataset to create in datafile   */
+#define F76_DATASETNAME   "CompoundIntArray"
+#define F76_LENGTH      4
+#define F76_RANK        1
+#define F76_ARRAY_RANK  1
+#define F76_DATASETU08        "DU08BITS"
+#define F76_DATASETS08        "DS08BITS"
+#define F76_DIM8       8
+#define F76_DATASETU16       "DU16BITS"
+#define F76_DATASETS16       "DS16BITS"
+#define F76_DIM16      16
+#define F76_DATASETU32       "DU32BITS"
+#define F76_DATASETS32       "DS32BITS"
+#define F76_DIM32      32
+#define F76_DATASETU64       "DU64BITS"
+#define F76_DATASETS64       "DS64BITS"
+#define F76_DIM64      64
+#define F76_DUMMYDBL        "DummyDBL"
+/* Name of dataset to create in datafile   */
+#define F77_DATASETNAME1   "CompoundInts"
+#define F77_DATASETNAME2   "CompoundRInts"
+#define F77_LENGTH      64
+
+#define F80_DIM32      32
+
+#define F81_DATASETNAME   "FourDimInts"
+#define F81_RANK        4
+#define F81_WDIM        10
+#define F81_XDIM        8
+#define F81_YDIM        6
+#define F81_ZDIM        4
+
+/* "File 82" macros */
+/* Name of dataset to create in datafile                              */
+#define F82_DATASETNAME    "CompoundComplex1D"
+/* Dataset dimensions                                                 */
+#define F82_DIM32          32
+#define F82_RANK           1
+/* #define F82_RANK2          2 */
+/* #define F82_RANK3          3 */
+/* #define F82_RANK4          4 */
+
+/* "File 83" macros */
+/* Name of dataset to create in datafile                              */
+#define F83_DATASETNAME    "ScalarArrayOfVlenStr"
+#define F83_DATASETNAME2   "CompoundArrayOfVlenStr"
+/* Dataset dimensions                                                 */
+#define F83_DIM            5
+#define F83_RANK           1
+#define F83_ARRAYDIM       3
+
+static void
+gent_group(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* / */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g1 */
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2 */
+    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g3 */
+    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2/g2.1 */
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+static void
+gent_dataset(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    int dset1[10][20];
+    double dset2[30][20];
+    int i, j;
+
+    fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* dset1 */
+    dims[0] = 10; dims[1] = 20;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 20; j++)
+            dset1[i][j] = j + i;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2 */
+    dims[0] = 30; dims[1] = 20;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 30; i++)
+        for(j = 0; j < 20; j++)
+            dset2[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+static void
+gent_dataset2(void)
+{
+    hid_t fid, dataset, space, create_plist;
+    hsize_t dims[2];
+    hsize_t maxdims[2];
+    int dset1[10][20];
+    double dset2[30][10];
+    int i, j;
+
+    fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+    dims[0] = 5; dims[1] = 5;
+    H5Pset_chunk(create_plist, 2, dims);
+
+    /* dset1 */
+    dims[0] = 10; dims[1] = 20;
+    maxdims[0] = H5S_UNLIMITED; maxdims[1] = 20;
+    space = H5Screate_simple(2, dims,  maxdims);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 20; j++)
+            dset1[i][j] = j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2 */
+    dims[0] = 30; dims[1] = 10;
+    maxdims[0] = 30; maxdims[1] = H5S_UNLIMITED;
+    space = H5Screate_simple(2, dims, maxdims);
+    dataset = H5Dcreate2(fid, "/dset2", H5T_IEEE_F64BE, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    for(i = 0; i < 30; i++)
+        for(j = 0; j < 10; j++)
+            dset2[i][j] = j;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Pclose(create_plist);
+    H5Fclose(fid);
+}
+
+static void
+gent_attribute(void)
+{
+    hid_t fid, root, space, attr, type;
+    hsize_t dims[2];
+    char buf[60];
+    int i, data[10];
+    double d[10];
+    char string[]= "string attribute";
+    int point = 100;
+
+    fid = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* attribute 1 */
+    dims[0] = 24;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "/attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "attribute of root group");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 2 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++) data[i] = i+1;
+
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 3 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "attr3", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++) d[i] = 0.1F * (float)i;
+
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 4 */
+    space = H5Screate(H5S_SCALAR);
+    attr = H5Acreate2(root, "attr4", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* attribute 5 */
+    space = H5Screate(H5S_SCALAR);
+    type = H5Tcopy(H5T_C_S1);
+    H5Tset_size(type, 17);
+    attr = H5Acreate2(root, "attr5", type, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, type, string);
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+static void gent_softlink(void)
+{
+    hid_t fid, root;
+
+    fid = H5Fcreate(FILE4, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+    H5Lcreate_soft("somevalue", root, "slink1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_soft("linkvalue", root, "slink2", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_softlink2
+ *
+ * Purpose: Create soft links to various objects.
+ * Return:
+ *    SUCCEED
+ *    FAIL
+ * Programmer: Jonathan Kim
+ * Date: May 26, 2010
+ *-------------------------------------------------------------------------*/
+#define NX 4
+#define NY 2
+static int gent_softlink2(void)
+{
+    hid_t       fileid1 = -1;
+    hid_t       gid1 = -1, gid2 = -1;
+    hid_t       datatype = -1;
+    hid_t       dset1 = -1, dset2 = -1;
+    hid_t       dataspace = -1;
+    hsize_t     dimsf[2];              /* dataset dimensions */
+    int data1[NX][NY] = {{0,0},{1,1},{2,2},{3,3}};
+    int data2[NX][NY] = {{0,0},{0,1},{0,2},{3,3}};
+    herr_t      status = SUCCEED;
+
+    /*-----------------------------------------------------------------------
+     * FILE
+     *------------------------------------------------------------------------*/
+    /* Create a new file */
+    fileid1 = H5Fcreate(FILE4_1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    if (fileid1 < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Fcreate failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Groups
+     *------------------------------------------------------------------------*/
+    gid1 = H5Gcreate2(fileid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid1 < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    gid2 = H5Gcreate2(fileid1, "group_empty", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid2 < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Named datatype
+     *------------------------------------------------------------------------*/
+    datatype = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(fileid1, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Datasets
+     *------------------------------------------------------------------------*/
+    /*
+     * Describe the size of the array and create the data space for fixed
+     * size dataset.
+     */
+    dimsf[0] = NX;
+    dimsf[1] = NY;
+    dataspace = H5Screate_simple(2, dimsf, NULL);
+
+    /*
+     * We will store little endian INT numbers.
+     */
+
+    /*---------------
+     * dset1
+     */
+    /* Create a new dataset as sample object */
+    dset1 = H5Dcreate2(fileid1, "/dset1", H5T_NATIVE_INT, dataspace,
+            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (dset1 < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*---------------
+     * dset2
+     */
+    /* Create a new dataset as sample object */
+    dset2 = H5Dcreate2(fileid1, "/dset2", H5T_NATIVE_INT, dataspace,
+            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (dset2 < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Dcreate2 failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Dwrite failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------------------------------------
+     * Soft links
+     *------------------------------------------------------------------------*/
+    /*
+     * create various soft links under  '/' root
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft("/dset1", fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to data type */
+    status = H5Lcreate_soft("/dtype", fileid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to group1 */
+    status = H5Lcreate_soft("/group1", fileid1, "soft_group1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to empty group */
+    status = H5Lcreate_soft("/group_empty", fileid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* dangling link */
+    status = H5Lcreate_soft("not_yet", fileid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /*-----------------------------------------
+     * create various soft links under a group
+     */
+    /* link to dset1 */
+    status = H5Lcreate_soft("/dset1", gid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to dset2 */
+    status = H5Lcreate_soft("/dset2", gid1, "soft_dset2", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to data type */
+    status = H5Lcreate_soft("/dtype", gid1, "soft_dtype", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* link to empty group */
+    status = H5Lcreate_soft("/group_empty", gid1, "soft_empty_grp", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    /* dangling link  */
+    status = H5Lcreate_soft("not_yet", gid1, "soft_dangle", H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        HDfprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", FILE4_1);
+        status = FAIL;
+        goto out;
+    }
+
+    out:
+    /*
+     * Close/release resources.
+     */
+    if(dataspace >= 0 && H5Sclose(dataspace) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Sclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(gid1 >= 0 && H5Gclose(gid1) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(gid2 >= 0 && H5Gclose(gid2) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Gclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(datatype >= 0 && H5Tclose(datatype) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Tclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(dset1 >= 0 && H5Dclose(dset1) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(dset2 >= 0 && H5Dclose(dset2) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Dclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+    if(fileid1 >= 0 && H5Fclose(fileid1) < 0) {
+        HDfprintf(stderr, "Error: %s> H5Fclose failed.\n", FILE4_1);
+        status = FAIL;
+    }
+
+    return status;
+}
+
+/*
+            /
+
+       /    |   \      the dataset is hardlinked to three names
+                       /dset1, /g1/dset2, and /g1/g1.1/dset3
+     dset1 g1    g2
+                       /g2 and /g1/g1.1 are hardlinked to the same object.
+          /  \
+       dset2 g1.1
+              |
+             dset3
+ */
+
+static void gent_hardlink(void)
+{
+    hid_t fid, group, dataset, space;
+    hsize_t dim = 5;
+    int i, dset[5];
+
+    fid = H5Fcreate(FILE5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1, &dim, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 5; i++) dset[i] = i;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/dset1", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g1", H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create a link to the root group */
+    H5Lcreate_hard(fid, "/", H5L_SAME_LOC, "g3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Fclose(fid);
+}
+
+static void gent_extlink(void)
+{
+    hid_t fid;
+
+    /* This external link will dangle, but that's okay */
+    fid = H5Fcreate(FILE53, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external("filename", "objname", fid, "extlink1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external("anotherfile", "anotherobj", fid, "extlink2", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+static void gent_udlink(void)
+{
+    hid_t fid;
+    char buf[4];
+
+    H5Lregister(UD_link_class);
+
+    /* This ud link will dangle, but that's okay */
+    fid = H5Fcreate(FILE54, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_ud(fid, "udlink1", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+    HDstrcpy(buf, "foo");
+    H5Lcreate_ud(fid, "udlink2", (H5L_type_t)MY_LINKCLASS, buf, 4, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+
+/*
+               /
+     /     |       \     \
+   dset1  group1  type1 type2
+           |
+          dset2
+
+ */
+static void gent_compound_dt(void) {       /* test compound data type */
+    hid_t fid, group, dataset, space, space3, type, type2;
+    hid_t array_dt;
+    typedef struct {
+            int a;
+            float b;
+            double c;
+    } dset1_t;
+    dset1_t dset1[5];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset2_t;
+    dset2_t dset2[5];
+
+    typedef struct {
+            int a[4];
+            float b[5][6];
+    } dset3_t;
+    dset3_t dset3[3][6];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset4_t;
+    dset4_t dset4[5];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset5_t;
+    dset5_t dset5[5];
+
+    int i, j, k, l;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim = 5;
+    hsize_t dset3_dim[2];
+
+
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+        dset1[i].c = (float)(1.0F/(float)(i+1));
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i+ (float)i*0.1F);
+
+        dset4[i].a = i;
+        dset4[i].b = (float)(i+3);
+
+        dset5[i].a = i;
+        dset5[i].b = (float)((float)i*0.1F);
+    }
+
+
+    fid = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1, &sdim, NULL);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset1[0]));
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
+    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
+    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Tclose(type2);
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+    /* shared data type 1 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+    H5Tclose(type2);
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+
+    /* shared data type 2 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 4;
+
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
+    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, ndims, dim);
+    H5Tinsert(type2, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
+    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, dim);
+    H5Tinsert(type2, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+
+    dset3_dim[0] = 3;  dset3_dim[1] = 6;
+    space3 = H5Screate_simple(2, dset3_dim, NULL);
+    dataset = H5Dcreate2(group, "dset3", type, space3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < (int)dset3_dim[0]; i++)
+        for(j = 0; j < (int)dset3_dim[1]; j++) {
+            for(k = 0; k < 4; k++)
+                dset3[i][j].a[k] = k + j + i;
+            for(k = 0; k < 5; k++)
+                for(l = 0; l < 6; l++)
+                    dset3[i][j].b[k][l] = (float)((k + 1) + l + j + i);
+        }
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+    H5Sclose(space3);
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+
+    /* shared data type 3 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
+    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    /* unamed data type */
+    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
+    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
+
+    H5Ldelete(group, "type4", H5P_DEFAULT);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Sclose(space);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+/*
+               /
+     /     |       \     \
+   dset1  group1  type1 type2
+           |
+          dset2
+
+ */
+static void gent_compound_dt2(void) {       /* test compound data type */
+    hid_t fid, group, dataset, space, type, create_plist, type2;
+    hid_t array_dt;
+
+    typedef struct {
+            int a;
+            float b;
+            double c;
+    } dset1_t;
+    dset1_t dset1[10];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset2_t;
+    dset2_t dset2[10];
+
+    typedef struct {
+            int a[4];
+            float b[5][6];
+    } dset3_t;
+
+    typedef struct {
+            int a;
+            float b;
+    } dset4_t;
+    dset4_t dset4[10];
+
+    typedef struct {
+            int a;
+            float b;
+    } dset5_t;
+    dset5_t dset5[10];
+
+    int i;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim, maxdim;
+
+    sdim = 10;
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+        dset1[i].c = (float)(1.0F / (float)(i+ 1));
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i + (float)i * 0.1F);
+
+        dset4[i].a = i;
+        dset4[i].b = (float)((float)i * 1.0F);
+
+        dset5[i].a = i;
+        dset5[i].b = (float)((float)i * 1.0F);
+    }
+
+    fid = H5Fcreate(FILE9, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32BE);
+    H5Tinsert(type, "c_name", HOFFSET(dset1_t, c), H5T_IEEE_F64BE);
+
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    H5Tinsert(type2, "a_name", HOFFSET(dset1_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset1_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset1_t, c), H5T_NATIVE_DOUBLE);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    sdim = 6;
+    maxdim = 10;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    /* shared data type 1 */
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type, "int_name", HOFFSET(dset2_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float_name", HOFFSET(dset2_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(fid, "type1", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset2", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2_t));
+    H5Tinsert(type2, "int_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+
+
+    /* shared data type 2 */
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 4;
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, ndims, dim);
+    H5Tinsert(type, "int_array", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+    array_dt = H5Tarray_create2(H5T_IEEE_F32BE, ndims, dim);
+    H5Tinsert(type, "float_array", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tcommit2(fid, "type2", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(type);
+
+    /* shared data type 3 */
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type, "int", HOFFSET(dset4_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset4_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type3", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    dataset = H5Dcreate2(group, "dset4", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset4_t));
+    H5Tinsert(type2, "int", HOFFSET(dset4_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset4_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    /* unamed data type */
+    group = H5Gcreate2(fid, "/group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type, "int", HOFFSET(dset5_t, a), H5T_STD_I32BE);
+    H5Tinsert(type, "float", HOFFSET(dset5_t, b), H5T_IEEE_F32BE);
+    H5Tcommit2(group, "type4", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset5", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    type2 = H5Tcreate(H5T_COMPOUND, sizeof(dset5_t));
+    H5Tinsert(type2, "int", HOFFSET(dset5_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "float", HOFFSET(dset5_t, b), H5T_NATIVE_FLOAT);
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset5);
+
+    H5Ldelete(group, "type4", H5P_DEFAULT);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Dclose(dataset);
+    H5Sclose(space);
+    H5Gclose(group);
+    H5Pclose(create_plist);
+
+    H5Fclose(fid);
+
+}
+
+
+/*
+
+/ : g1  g2  attr1  attr2
+g1 : g1.1  g1.2
+g1.1 : dset1.1.1(attr1, attr2)   dset1.1.2
+g1.2 : g1.2.1 extlink
+g1.2.1 : slink
+g2 : dset2.1  dset2.2 udlink
+
+ */
+
+static void gent_all(void)
+{
+    hid_t fid, group, attr, dataset, space;
+    hsize_t dims[2];
+    int data[2][2], dset1[10][10], dset2[20];
+    char buf[60];
+    int i, j;
+    float dset2_1[10], dset2_2[3][5];
+
+    fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create groups */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* root attributes */
+    group = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "abcdefghi");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    dims[0] = 2; dims[1] = 2;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
+
+    /* dset1.1.1 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset1[i][j] = j * i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+
+    /* attributes of dset1.1.1 */
+    dims[0] = 27;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "1st attribute of dset1.1.1");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    dims[0] = 27;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "2nd attribute of dset1.1.1");
+    H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Dclose(dataset);
+
+    /* dset1.1.2 */
+    dims[0] = 20;
+    space = H5Screate_simple(1, dims, NULL);
+    dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 20; i++)
+        dset2[i] = i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Gclose(group);
+
+    /* external link */
+    H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* soft link */
+    group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
+    H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
+
+    /* dset2.1 */
+    dims[0] = 10;
+    space = H5Screate_simple(1, dims, NULL);
+    dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        dset2_1[i] = (float)((float)i * 0.1F + 1);
+    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* dset2.2 */
+    dims[0] = 3; dims[1] = 5;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 5; j++)
+            dset2_2[i][j] = (float)((float)(i + 1) * (float)j * 0.1F);
+    H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Gclose(group);
+
+    /* user-defined link */
+    H5Lregister(UD_link_class);
+    H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+/*
+            o
+          /___\
+      g1 o/   \o g2
+          \___/
+
+
+o - group objects
+
+ */
+
+static void gent_loop(void) {
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE10, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(fid, "/g1", H5L_SAME_LOC, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+static void gent_loop2(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE11, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create group object g1 and implcit path from root object */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create group object g2 and implcit path from root object */
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* create path from object at /g1 to object at /g2 and name it g1.1 */
+    H5Lcreate_hard(fid, "/g2", H5L_SAME_LOC, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* create path from object at /g2 to object at /g1 and name it g2.1 */
+    H5Lcreate_soft("/g1", fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Fclose(fid);
+}
+
+/*
+                  /
+     |       |       |   \    \    \     \      \
+     g1     g2      g3   g4   g5    g6    g7     g8
+    / \      |       |    \     \    \      \      \
+ g1.1 g1.2 slink2  link3 dset2 slink4 dset3 slink5   elink
+  |    |    (g1)  (dset2)      (dset3)      (elink)  udlink
+ dset1 link1                                slink6
+      (dset1)                               (udlink)
+ */
+
+static void
+gent_many(void)
+{
+    hid_t fid, group, attr, dataset, space, space2, type, create_plist, type2;
+    hid_t array_dt;
+    hsize_t dims[2];
+    int data[2][2], dset2[10][10], dset3[10][10];
+    double d[10];
+
+    char buf[60];
+    int i, j;
+    int i0, i1, i2, i3;
+    hsize_t sdim, maxdim;
+
+    typedef struct { /* compound type has members with rank > 1 */
+            int a[2][2][2][2]; /* arrays are 2x2x2x2    */
+            double b[2][2][2][2];
+            double c[2][2][2][2];
+    } dset1_t;
+    dset1_t dset1[6];
+
+    hsize_t dim[4];
+    herr_t ret;
+
+    fid = H5Fcreate(FILE12, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    dim[0] = dim[1] = dim[2] = dim[3] = 2;
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, 4, dim);
+    H5Tinsert(type, "a_array", HOFFSET(dset1_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
+    H5Tinsert(type, "b_array", HOFFSET(dset1_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_IEEE_F64BE, 4, dim);
+    H5Tinsert(type, "c_array", HOFFSET(dset1_t, c), array_dt);
+    H5Tclose(array_dt);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 4, dim);
+    H5Tinsert(type2, "a_array", HOFFSET(dset1_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
+    H5Tinsert(type2, "b_array", HOFFSET(dset1_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_DOUBLE, 4, dim);
+    H5Tinsert(type2, "c_array", HOFFSET(dset1_t, c), array_dt);
+    H5Tclose(array_dt);
+
+
+    /* dset1 */
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+    space = H5Screate_simple(1, &sdim, &maxdim);
+    dataset = H5Dcreate2(group, "dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    /* add attributes to dset1 */
+    dims[0] = 10;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(buf, "abcdefghi");
+    H5Awrite(attr, H5T_NATIVE_CHAR, buf);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    dims[0] = 2; dims[1] = 2;
+    space2 = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(dataset, "attr2", H5T_STD_I32BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
+    H5Awrite(attr, H5T_NATIVE_INT, data);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    dims[0] = 10;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr3", H5T_IEEE_F64BE, space2, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        d[i] = 0.1F * (float)i;
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
+    H5Sclose(space2);
+    H5Aclose(attr);
+
+    for(j=0; j<(int)sdim; j++) {
+        for(i3 = 0; i3 < 2; i3++) {
+            for(i2 = 0; i2 < 2; i2++) {
+                for(i1 = 0; i1 < 2; i1++) {
+                    for(i0 = 0; i0 < 2; i0++) {
+                        dset1[j].a[i3][i2][i1][i0] = i0 + j;
+                        dset1[j].b[i3][i2][i1][i0] = (double)(i0 + j);
+                        dset1[j].c[i3][i2][i1][i0] = (double)((hsize_t)i0 + (hsize_t)j + sdim);
+                    }
+                }
+            }
+        }
+    }
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Dclose(dataset);
+    H5Sclose(space);
+
+    H5Tclose(type);
+    H5Tclose(type2);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g1/g1.1/dset1", H5L_SAME_LOC, "link1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_soft("/g1", group, "slink2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* dset2 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+
+    dataset = H5Dcreate2(group, "dset2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset2[i][j] = j;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Dclose(dataset);
+
+    H5Sclose(space);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g3", H5P_DEFAULT);
+    H5Lcreate_hard(group, "/g4/dset2", H5L_SAME_LOC, "link3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* dset3 */
+    dims[0] = 10; dims[1] = 10;
+    space = H5Screate_simple(2, dims, NULL);
+
+    dataset = H5Dcreate2(group, "dset3", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            dset3[i][j] = i;
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+
+    H5Dclose(dataset);
+
+    H5Sclose(space);
+    H5Gclose(group);
+
+    group = H5Gopen2(fid, "/g5", H5P_DEFAULT);
+    H5Lcreate_soft("/g6/dset3", group, "slink4", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    H5Pclose(create_plist);
+
+    group = H5Gcreate2(fid, "/g7", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g8", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* Create dangling external and UD links */
+    H5Lcreate_external("somefile", "somepath", fid, "/g8/elink", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lregister(UD_link_class);
+    H5Lcreate_ud(fid, "/g8/udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create links to external and UD links */
+    ret = H5Lcreate_soft("/g8/elink", fid, "/g7/slink5", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Lcreate_soft("/g8/udlink", fid, "/g7/slink6", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    H5Fclose(fid);
+}
+
+static hid_t mkstr(int size, H5T_str_t pad) {
+    hid_t type;
+
+    if((type=H5Tcopy(H5T_C_S1)) < 0) return -1;
+    if(H5Tset_size(type, (size_t)size) < 0) return -1;
+    if(H5Tset_strpad(type, pad) < 0) return -1;
+
+    return type;
+}
+
+static void gent_str(void) {
+    hid_t fid, dataset, space, f_type, m_type, str_type, f_type2;
+    hid_t array_dt;
+
+    hsize_t dims1[] = { 3, 4};
+    char string1[12][3] = {"s1","s2","s3","s4","s5","s6","s7","s8","s9",
+            "s0","s1","s2"};
+
+    hsize_t dims2[]={20};
+    char string2[20][10] = {"ab cd ef1", "ab cd ef2", "ab cd ef3", "ab cd ef4",
+            "ab cd ef5", "ab cd ef6", "ab cd ef7", "ab cd ef8",
+            "ab cd ef9", "ab cd ef0", "ab cd ef1", "ab cd ef2",
+            "ab cd ef3", "ab cd ef4", "ab cd ef5", "ab cd ef6",
+            "ab cd ef7", "ab cd ef8", "ab cd ef9", "ab cd ef0"};
+
+    hsize_t dims3[] = { 27};
+    char string3[27][6] = {"abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6", "abcd7",
+            "abcd8", "abcd9", "abcd0", "abcd1",
+            "abcd2", "abcd3", "abcd4", "abcd5",
+            "abcd6", "abcd7", "abcd8", "abcd9",
+            "abcd0", "abcd1", "abcd2", "abcd3",
+            "abcd4", "abcd5", "abcd6"};
+
+    int i, j, k, l;
+
+    hsize_t dims4[] = { 3 };
+    char string4[3][21] = { "s1234567890123456789", "s1234567890123456789",
+            "s1234567890123456789"};
+
+    hsize_t dims5[] = { 3, 6};
+    typedef struct {
+            int a[8][10];
+            char s[12][33];
+    } compound_t;
+    compound_t comp1[3][6];
+    hsize_t mdims[2];
+
+    fid = H5Fcreate(FILE13, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* string 1 : nullterm string */
+    space = H5Screate_simple(2, dims1, NULL);
+    f_type = mkstr(5, H5T_STR_NULLTERM);
+    m_type = mkstr(3, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string1);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 2 : space pad string */
+    space = H5Screate_simple(1, dims2, NULL);
+    f_type = mkstr(11, H5T_STR_SPACEPAD);
+    m_type = mkstr(10, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string2", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string2);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 3 : null pad string */
+    space = H5Screate_simple(1, dims3, NULL);
+    f_type = mkstr(8, H5T_STR_NULLPAD);
+    m_type = mkstr(6, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string3", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string3);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* string 4 : space pad long string */
+    space = H5Screate_simple(1, dims4, NULL);
+    f_type = mkstr(168, H5T_STR_SPACEPAD);
+    m_type = mkstr(21, H5T_STR_NULLTERM);
+    dataset = H5Dcreate2(fid, "/string4", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, string4);
+    H5Tclose(m_type);
+    H5Tclose(f_type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* compound data */
+    space = H5Screate_simple(2, dims5, NULL);
+    f_type = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
+    f_type2 = H5Tcreate (H5T_COMPOUND, sizeof(compound_t));
+
+    mdims[0] = 8; mdims[1] = 10;
+
+    array_dt = H5Tarray_create2(H5T_STD_I32BE, 2, mdims);
+    H5Tinsert(f_type, "int_array", HOFFSET(compound_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_INT, 2, mdims);
+    H5Tinsert(f_type2, "int_array", HOFFSET(compound_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    mdims[0] = 3; mdims[1] = 4;
+
+    str_type = mkstr(32, H5T_STR_SPACEPAD);
+    array_dt = H5Tarray_create2(str_type, 2, mdims);
+    H5Tinsert(f_type, "string", HOFFSET(compound_t, s), array_dt);
+    H5Tclose(array_dt);
+    H5Tclose(str_type);
+
+    str_type = mkstr(33, H5T_STR_NULLTERM);
+    array_dt = H5Tarray_create2(str_type, 2, mdims);
+    H5Tinsert(f_type2, "string", HOFFSET(compound_t, s), array_dt);
+    H5Tclose(array_dt);
+    H5Tclose(str_type);
+
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 6; j++) {
+            for(k = 0 ; k < 8; k++)
+                for(l = 0; l < 10; l++)
+                    comp1[i][j].a[k][l] = (l + j + k) * (l + j + k);
+            for(k = 0 ; k < 12; k++)
+                HDstrcpy(comp1[i][j].s[k], "abcdefgh12345678abcdefgh12345678");
+        }
+
+    dataset = H5Dcreate2(fid, "/comp1", f_type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, f_type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, comp1);
+
+    H5Tclose(f_type);
+    H5Tclose(f_type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Fclose(fid);
+}
+
+/*
+                      /
+       /     /     |    \    \     \
+     g1     g2    g3    g4    g5    g6
+     |       |     |     |     \     \
+  string1       string3       string5
+         string2       string4       string6
+ */
+
+static void gent_str2(void)
+{
+    hid_t fid, group, attr, dataset, space, space2, mem_space, hyper_space;
+    hid_t fxdlenstr, fxdlenstr2, memtype;
+    hsize_t dims[1], size[1], stride[1], count[1], block[1];
+    hsize_t start[1];
+
+
+    int i;
+    char buf[LENSTR+10];
+    char buf2[3*LENSTR2];
+    hsize_t sdim;
+
+    fid = H5Fcreate(FILE14, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_NULLTERM);
+
+    memtype = H5Tcopy(H5T_C_S1);
+    H5Tset_size(memtype, LENSTR);
+    H5Tset_cset(memtype, H5T_CSET_ASCII);
+    H5Tset_strpad(memtype, H5T_STR_NULLTERM);
+
+    sdim = 10;
+    size[0] = sdim;
+    space = H5Screate_simple(1, size, NULL);
+    size[0] = 1;
+    mem_space = H5Screate_simple(1,size,NULL);
+    hyper_space = H5Scopy(space);
+
+    /* dset1 */
+
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset1", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* add attributes to dset1 */
+
+    fxdlenstr2 = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr2, LENSTR2);
+    H5Tset_cset(fxdlenstr2, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr2, H5T_STR_NULLTERM);
+
+    dims[0] = 3;
+    space2 = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(dataset, "attr1", fxdlenstr2, space2, H5P_DEFAULT, H5P_DEFAULT);
+    sprintf(&(buf2[0*LENSTR2]), "0123456789");
+    sprintf(&(buf2[1*LENSTR2]), "abcdefghij");
+    sprintf(&(buf2[2*LENSTR2]), "ABCDEFGHIJ");
+    H5Awrite(attr, fxdlenstr2, buf2);
+    H5Sclose(space2);
+    H5Tclose(fxdlenstr2);
+    H5Aclose(attr);
+
+    stride[0]=1;
+    count[0]=1;
+    block[0]=1;
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset2", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLTERM of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    H5Tclose(fxdlenstr);
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_NULLPAD);
+
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset3", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0;(hsize_t) i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    group = H5Gcreate2(fid, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset4", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_NULLPAD of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf)+1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    H5Tclose(fxdlenstr);
+    fxdlenstr = H5Tcopy(H5T_C_S1);
+    H5Tset_size(fxdlenstr, LENSTR);
+    H5Tset_cset(fxdlenstr, H5T_CSET_ASCII);
+    H5Tset_strpad(fxdlenstr, H5T_STR_SPACEPAD);
+
+    group = H5Gcreate2(fid, "/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset5", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of", i);
+        H5Tset_size(memtype, HDstrlen(buf) + 1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+
+    group = H5Gcreate2(fid, "/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    dataset = H5Dcreate2(group, "dset6", fxdlenstr, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; (hsize_t)i < sdim; i++) {
+        start[0] = (hsize_t)i;
+        sprintf(buf, "This is row %1d of type H5T_STR_SPACEPAD of string array", i);
+        H5Tset_size(memtype, HDstrlen(buf) + 1);
+        H5Sselect_hyperslab(hyper_space, H5S_SELECT_SET, start, stride, count, block);
+        H5Dwrite(dataset, memtype, mem_space, hyper_space, H5P_DEFAULT, buf);
+    }
+
+    H5Dclose(dataset);
+    H5Gclose(group);
+    H5Tclose(fxdlenstr);
+    H5Tclose(memtype);
+    H5Sclose(mem_space);
+    H5Sclose(hyper_space);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+static void gent_enum(void)
+{
+    /*some code is taken from enum.c in the test dir */
+    hid_t file, type, space, dset;
+    int val;
+    enumtype data[] = {RED,   GREEN, BLUE,  GREEN, WHITE,
+            WHITE, BLACK, GREEN, BLUE,  RED,
+            RED,   BLUE,  GREEN, BLACK, WHITE,
+            RED,   WHITE, GREEN, GREEN, BLUE};
+    hsize_t size[1] = {NELMTS(data)};
+
+    file = H5Fcreate(FILE15,H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Try to test names with special characters */
+    type = H5Tcreate(H5T_ENUM, sizeof(enumtype));
+    H5Tenum_insert(type, "RED",   (val = 0, &val));
+    H5Tenum_insert(type, "GREEN\ngreen", (val = 1, &val));
+    H5Tenum_insert(type, "BLUE blue",  (val = 2, &val));
+    H5Tenum_insert(type, "WHITE \"white\"", (val = 3, &val));
+    H5Tenum_insert(type, "BLACK \'black\'", (val = 4, &val));
+    H5Tcommit2(file, "enum normal", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(1,size,NULL);
+    dset = H5Dcreate2(file,"table",type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dset, type, space, space, H5P_DEFAULT, data);
+
+    H5Dclose(dset);
+    H5Sclose(space);
+    H5Fclose(file);
+}
+
+static void gent_objref(void)
+{
+    /*some code is taken from enum.c in the test dir */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+
+    hid_t  group;      /* Group ID             */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    hobj_ref_t *wbuf,      /* buffer to write to disk */
+    *rbuf,       /* buffer read from disk */
+    *tbuf;       /* temp. buffer read from disk */
+    uint32_t   *tu32;      /* Temporary pointer to uint32 data */
+    int        i;          /* counting variables */
+    const char *write_comment = "Foo!"; /* Comments for group */
+
+    /* Allocate write & read buffers */
+    wbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+    rbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+    tbuf = (hobj_ref_t*) HDmalloc(sizeof(hobj_ref_t) * SPACE1_DIM1);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE16, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a group */
+    group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Set group's comment */
+    H5Oset_comment(group, write_comment);
+
+    /* Create a dataset (inside Group1) */
+    dataset = H5Dcreate2(group, "Dataset1", H5T_STD_U32BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu32 = (uint32_t *)((void*)wbuf), i = 0; i < SPACE1_DIM1; i++)
+        *tu32++ = (uint32_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Create another dataset (inside Group1) */
+    dataset = H5Dcreate2(group, "Dataset2", H5T_STD_U8BE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+
+    /* Insert fields */
+    H5Tinsert(tid1, "a", HOFFSET(s1_t,a), H5T_STD_I32BE);
+
+    H5Tinsert(tid1, "b", HOFFSET(s1_t,b), H5T_IEEE_F32BE);
+
+    H5Tinsert(tid1, "c", HOFFSET(s1_t,c), H5T_IEEE_F32BE);
+
+    /* Save datatype for later */
+    H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Close datatype */
+    H5Tclose(tid1);
+
+    /* Close group */
+    H5Gclose(group);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create reference to dataset */
+    H5Rcreate(&wbuf[0], fid1, "/Group1/Dataset1", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to dataset */
+    H5Rcreate(&wbuf[1], fid1, "/Group1/Dataset2", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to group */
+    H5Rcreate(&wbuf[2], fid1, "/Group1", H5R_OBJECT, (hid_t)-1);
+
+    /* Create reference to named datatype */
+    H5Rcreate(&wbuf[3], fid1, "/Group1/Datatype1", H5R_OBJECT, (hid_t)-1);
+
+    /* Write selection to disk */
+    H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+
+    /* Close disk dataspace */
+    H5Sclose(sid1);
+
+    /* Close Dataset */
+    H5Dclose(dataset);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(tbuf);
+}
+
+static void gent_datareg(void)
+{
+    /*some code is taken from enum.c in the test dir */
+
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dset1, /* Dataset ID   */
+    dset2;      /* Dereferenced dataset ID */
+    hid_t  sid1,       /* Dataspace ID #1  */
+    sid2;       /* Dataspace ID #2  */
+    hsize_t  dims1[] = {SPACE1_DIM1},
+            dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
+    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
+    hdset_reg_ref_t      *wbuf,      /* buffer to write to disk */
+    *rbuf;       /* buffer read from disk */
+    uint8_t    *dwbuf,      /* Buffer for writing numeric data to disk */
+    *drbuf;      /* Buffer for reading numeric data from disk */
+    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
+    int        i;          /* counting variables */
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
+    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
+    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE17, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
+        *tu8++ = (uint8_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
+
+    /* Close Dataset */
+    H5Dclose(dset2);
+
+    /* Create dataspace for the reference dataset */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a dataset */
+    dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create references */
+
+    /* Select 6x6 hyperslab for first reference */
+    start[0] = 2; start[1] = 2;
+    stride[0] = 1; stride[1] = 1;
+    count[0] = 6; count[1] = 6;
+    block[0] = 1; block[1] = 1;
+    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store first dataset region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
+
+    /* Select sequence of ten points for second reference */
+    coord1[0][0]=6; coord1[0][1]=9;
+    coord1[1][0]=2; coord1[1][1]=2;
+    coord1[2][0]=8; coord1[2][1]=4;
+    coord1[3][0]=1; coord1[3][1]=6;
+    coord1[4][0]=2; coord1[4][1]=8;
+    coord1[5][0]=3; coord1[5][1]=2;
+    coord1[6][0]=0; coord1[6][1]=4;
+    coord1[7][0]=9; coord1[7][1]=0;
+    coord1[8][0]=7; coord1[8][1]=1;
+    coord1[9][0]=3; coord1[9][1]=3;
+    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store second dataset region */
+    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
+
+    /* Write selection to disk */
+    H5Dwrite(dset1,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+
+    /* Close disk dataspace */
+    H5Sclose(sid1);
+
+    /* Close Dataset */
+    H5Dclose(dset1);
+
+    /* Close uint8 dataset dataspace */
+    H5Sclose(sid2);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(dwbuf);
+    HDfree(drbuf);
+}
+
+static void gent_attrreg(void)
+{
+    /*some code is taken from enum.c in the test dir */
+
+    hid_t  fid1;        /* HDF5 File IDs  */
+    hid_t  dset1;       /* Dataset ID   */
+    hid_t  dset2;       /* Dereferenced dataset ID */
+    hid_t  sid1;        /* Dataspace ID #1  */
+    hid_t  sid2;        /* Dataspace ID #2  */
+    hid_t  sid3;        /* Dataspace ID #3  */
+    hid_t  attr1;       /* Attribute ID  */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    hsize_t  dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+    hsize_t  start[SPACE2_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE2_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE2_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE2_RANK];     /* Block size of hyperslab */
+    hsize_t  coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
+    hdset_reg_ref_t      *wbuf;      /* buffer to write to disk */
+    hdset_reg_ref_t      *rbuf;      /* buffer read from disk */
+    uint8_t    *dwbuf;      /* Buffer for writing numeric data to disk */
+    uint8_t    *drbuf;      /* Buffer for reading numeric data from disk */
+    uint8_t    *tu8;        /* Temporary pointer to uint8 data */
+    int        i;           /* counting variables */
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    rbuf = (hdset_reg_ref_t*) HDmalloc(sizeof(hdset_reg_ref_t)*SPACE1_DIM1);
+    dwbuf = (uint8_t*) HDmalloc(sizeof(uint8_t)*SPACE2_DIM1*SPACE2_DIM2);
+    drbuf = (uint8_t*) HDcalloc(sizeof(uint8_t),SPACE2_DIM1*SPACE2_DIM2);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE64, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8BE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(tu8 = dwbuf, i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
+        *tu8++ = (uint8_t)(i * 3);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf);
+
+    /* Close Dataset */
+    H5Dclose(dset2);
+
+    /*
+     * Create dataset with a null dataspace to serve as the parent for
+     * the attribute.
+     */
+    sid1 = H5Screate (H5S_NULL);
+    dset1 = H5Dcreate2 (fid1, "Dataset1", H5T_STD_I32LE, sid1, H5P_DEFAULT,
+            H5P_DEFAULT, H5P_DEFAULT);
+    H5Sclose (sid1);
+
+    /* Create references */
+
+    /* Select 6x6 hyperslab for first reference */
+    start[0] = 2; start[1] = 2;
+    stride[0] = 1; stride[1] = 1;
+    count[0] = 6; count[1] = 6;
+    block[0] = 1; block[1] = 1;
+    H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store first dataset region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
+
+    /* Select sequence of ten points for second reference */
+    coord1[0][0]=6; coord1[0][1]=9;
+    coord1[1][0]=2; coord1[1][1]=2;
+    coord1[2][0]=8; coord1[2][1]=4;
+    coord1[3][0]=1; coord1[3][1]=6;
+    coord1[4][0]=2; coord1[4][1]=8;
+    coord1[5][0]=3; coord1[5][1]=2;
+    coord1[6][0]=0; coord1[6][1]=4;
+    coord1[7][0]=9; coord1[7][1]=0;
+    coord1[8][0]=7; coord1[8][1]=1;
+    coord1[9][0]=3; coord1[9][1]=3;
+    H5Sselect_elements(sid2,H5S_SELECT_SET,POINT1_NPOINTS,(hsize_t *)coord1);
+
+    H5Sget_select_npoints(sid2);
+
+    /* Store second dataset region */
+    H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_DATASET_REGION,sid2);
+
+    /* Create dataspace for the attribute */
+    sid3 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create the attribute and write the region references to it. */
+    attr1 = H5Acreate2 (dset1, "Attribute1", H5T_STD_REF_DSETREG, sid3, H5P_DEFAULT,
+            H5P_DEFAULT);
+    H5Awrite (attr1, H5T_STD_REF_DSETREG, wbuf);
+
+    /* Close attribute dataspace */
+    H5Sclose(sid3);
+
+    /* Close attribute */
+    H5Aclose (attr1);
+
+    /* Close Dataset */
+    H5Dclose(dset1);
+
+    /* Close uint8 dataset dataspace */
+    H5Sclose(sid2);
+
+    /* Close file */
+    H5Fclose(fid1);
+
+    /* Free memory buffers */
+    HDfree(wbuf);
+    HDfree(rbuf);
+    HDfree(dwbuf);
+    HDfree(drbuf);
+}
+
+/*taken from Elena's compound test file*/
+static void gent_nestcomp(void)
+{
+    /* Compound memeber of the compound datatype*/
+    typedef struct cmp_t {
+            char   a;
+            float  b[2];
+    } cmp_t;
+
+    /* First structure  and dataset*/
+    typedef struct s1_t {
+            int    a;
+            float  b;
+            double c;
+            cmp_t  d;
+    } s2_t;
+    hid_t      cmp_tid;    /* Handle for the compound datatype */
+    hid_t      char_id;    /* Handle for the string datatype */
+    hid_t      array_dt;
+    hsize_t     array_dims[] = {2};    /* Dataspace dimensions */
+    unsigned    ndims = 1;    /* Number of dimensions in the array field */
+
+    s2_t       s1[10];
+    hid_t      s2_tid;     /* File datatype identifier */
+
+    int        i;
+    hid_t      file, dataset, space; /* Handles */
+    herr_t     status;
+    hsize_t    dim[] = {10};   /* Dataspace dimensions */
+
+    char datasetname[] = "ArrayOfStructures";
+
+
+    /*
+     * Initialize the data
+     */
+    for(i = 0; i< 10; i++) {
+        s1[i].a = i;
+        s1[i].b = (float)(i*i);
+        s1[i].c = 1.0F/(float)(i + 1);
+        s1[i].d.a = (char)(65 + i);
+        s1[i].d.b[0] = -100.0F;
+        s1[i].d.b[1] =  100.0F;
+    }
+
+    /*
+     * Create the data space.
+     */
+    space = H5Screate_simple(1, dim, NULL);
+
+    /*
+     * Create the file.
+     */
+    file = H5Fcreate(FILE18, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create the memory data type.
+     */
+    /*
+     * Create a datatype for compound field first.
+     */
+    cmp_tid = H5Tcreate (H5T_COMPOUND, sizeof(cmp_t));
+
+    /* We are using C string of length one to represent "real" character */
+    char_id = H5Tcopy(H5T_C_S1);
+    H5Tset_strpad(char_id, H5T_STR_NULLTERM);
+    H5Tinsert(cmp_tid, "char_name", HOFFSET(cmp_t, a), char_id);
+
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, ndims, array_dims);
+    H5Tinsert(cmp_tid, "array_name", HOFFSET(cmp_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
+    H5Tinsert(s2_tid, "a_name", HOFFSET(s2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE);
+    H5Tinsert(s2_tid, "b_name", HOFFSET(s2_t, b), H5T_NATIVE_FLOAT);
+
+    /* Insert compound memeber created above */
+    H5Tinsert(s2_tid, "d_name", HOFFSET(s2_t, d), cmp_tid);
+
+    /*
+     * Create the dataset.
+     */
+    dataset = H5Dcreate2(file, datasetname, s2_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Wtite data to the dataset;
+     */
+    status = H5Dwrite(dataset, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1);
+    if(status < 0)
+        HDfprintf(stderr, "gent_nestcomp H5Dwrite failed\n");
+
+    /*
+     * Release resources
+     */
+    H5Tclose(s2_tid);
+    H5Tclose(cmp_tid);
+    H5Tclose(char_id);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(file);
+}
+
+static void gent_opaque(void)
+{
+    hid_t file, type, dataset, space;
+    char test[100][2];
+    int x;
+    hsize_t dim = 2;
+
+    for(x = 0; x < 100; x++){
+        test[x][0] = (char)x;
+        test[x][1] = (char)(99 - x);
+    }
+
+    /*
+     * Create the data space.
+     */
+    space = H5Screate_simple(1, &dim, NULL);
+
+    /*
+     * Create the file.
+     */
+    file = H5Fcreate(FILE19, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create the memory datatype.
+     */
+    type = H5Tcreate(H5T_OPAQUE, sizeof(char) * 100 * 2);
+    H5Tset_tag(type, "test opaque type");
+
+    /*
+     * Create the dataset.
+     */
+    dataset = H5Dcreate2(file, "opaque test", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Write data to the dataset;
+     */
+    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, test);
+
+    H5Tclose(type);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(file);
+}
+
+static void gent_bitfields(void)
+{
+    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
+    size_t  i;
+    hsize_t  nelmts;
+    unsigned char buf[32];
+
+    file = H5Fcreate(FILE20, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if((grp = H5Gcreate2(file, "typetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
+
+    /* bitfield_1 */
+    nelmts = sizeof(buf);
+    if((type = H5Tcopy(H5T_STD_B8LE)) < 0 ||
+            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
+            (dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    for(i = 0; i < sizeof buf; i++)
+        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+    if(H5Sclose(space) < 0) goto error;
+    if(H5Tclose(type) < 0) goto error;
+    if(H5Dclose(dset) < 0) goto error;
+
+    /* bitfield_2 */
+    nelmts = sizeof(buf)/2;
+    if((type = H5Tcopy(H5T_STD_B16LE)) < 0 ||
+            (space = H5Screate_simple(1, &nelmts, NULL)) < 0 ||
+            (dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+    for(i = 0; i < sizeof buf; i++)
+        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+    if(H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+    if(H5Sclose(space) < 0) goto error;
+    if(H5Tclose(type) < 0) goto error;
+    if(H5Dclose(dset) < 0) goto error;
+    if(H5Gclose(grp) < 0) goto error;
+    H5Fclose(file);
+
+    error:
+    H5E_BEGIN_TRY {
+        H5Gclose(grp);
+        H5Tclose(type);
+        H5Sclose(space);
+        H5Dclose(dset);
+    } H5E_END_TRY;
+}
+
+static void gent_vldatatypes(void)
+{
+    hvl_t adata, wdata[SPACE1_DIM1];
+    hid_t file, dset, space, type;
+    hsize_t dims[] = { SPACE1_DIM1 };
+    int i;
+    herr_t ret=0;
+
+    file = H5Fcreate(FILE21, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Allocate and initialize VL dataset to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        int j;
+
+        wdata[i].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+        wdata[i].len = (size_t)(i + 1);
+
+        for(j = 0; j < i + 1; j++)
+            ((int *)wdata[i].p)[j] = i * 10 + j;
+    }
+
+    /* write out the integers in little-endian format */
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    /* Allocate and initialize VL dataset to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        int j;
+
+        wdata[i].p = HDmalloc((size_t)(i + 1) * sizeof(float));
+        wdata[i].len = (size_t)(i + 1);
+
+        for(j = 0; j < i + 1; j++)
+            ((float *)wdata[i].p)[j] = (float)((float)(i * 10) + ((float)j) / 10.0F);
+    } /* end for */
+
+    /* write out the floats in little-endian format */
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_FLOAT);
+    dset = H5Dcreate2(file, "Dataset2.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    /* Allocate and initialize a scalar VL dataset to write */
+    adata.p = HDmalloc(37 * sizeof(int));
+    adata.len = 37;
+
+    for(i = 0; i < 37; i++)
+        ((int *)adata.p)[i] = i * 2;
+
+    /* write out scalar VL dataset in little-endian format */
+    space = H5Screate_simple(0, NULL, NULL);
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset3.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &adata);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(type, space, H5P_DEFAULT, &adata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+    ret = H5Fclose(file);
+    HDassert(ret >= 0);
+}
+
+static void
+gent_vldatatypes2(void)
+{
+    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
+    hvl_t *t1;              /* Temporary pointer to VL information */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i = 0; i < SPACE1_DIM1; i++) {
+        wdata[i].p = (hvl_t *)HDmalloc((i + 1) * sizeof(hvl_t));
+        if(wdata[i].p == NULL) {
+            printf("Cannot allocate memory for VL data! i=%u\n", i);
+            return;
+        } /* end if */
+        wdata[i].len = i + 1;
+        for(t1 = (hvl_t *)wdata[i].p, j = 0; j < (i + 1); j++, t1++) {
+            t1->p = (unsigned *)HDmalloc((j + 1) * sizeof(unsigned));
+            if(t1->p == NULL) {
+                printf("Cannot allocate memory for VL data! i=%u, j=%u\n",i,j);
+                return;
+            } /* end if */
+            t1->len=j+1;
+            for(k=0; k<(j+1); k++)
+                ((unsigned int *)t1->p)[k]=i*100+j*10+k;
+        } /* end for */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE22, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create the base VL type */
+    tid2 = H5Tvlen_create(tid1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+
+}
+
+static void gent_vldatatypes3(void)
+{
+    typedef struct {             /* Struct that the VL sequences are composed of */
+        int i;
+        float f;
+        hvl_t v;
+    } s1;
+    s1 wdata[SPACE1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        wdata[i].i = (int)(i * 10);
+        wdata[i].f = (float)((float)(i * 20)/3.0F);
+        wdata[i].v.p = HDmalloc((size_t)(i + 1) * sizeof(unsigned int));
+        wdata[i].v.len = (size_t)(i + 1);
+        for(j = 0; j < (i + 1); j++)
+            ((unsigned int *)wdata[i].v.p)[j] = i * 10 + j;
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE23, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create the base compound type */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid2, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_vldatatypes4(void)
+{
+    typedef struct {             /* Struct that the VL sequences are composed of */
+        int i;
+        float f;
+    } s1;
+    hvl_t wdata[SPACE1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1, tid2; /* Datatype IDs         */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    unsigned       i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize VL data to write */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        wdata[i].p = HDmalloc((i + 1) * sizeof(s1));
+        wdata[i].len = i + 1;
+        for(j = 0; j < (i + 1); j++) {
+            ((s1 *)wdata[i].p)[j].i = (int)(i * 10 + j);
+            ((s1 *)wdata[i].p)[j].f = (float)((float)(i * 20 + j) / 3.0F);
+        } /* end for */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE24, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create the base compound type */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1));
+
+    /* Insert fields */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+    ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tvlen_create(tid2);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+/* Generate a variable-length dataset with NULL values in it */
+static void gent_vldatatypes5(void)
+{
+    hvl_t wdata [SPACE1_DIM1];
+    hid_t  fid1;
+    hid_t  dataset;
+    hid_t  sid1;
+    hid_t  tid1;
+    hsize_t  dims1[] = {SPACE1_DIM1};
+    int                 i,j;          /* counting variable */
+    herr_t  ret;  /* Generic return value  */
+
+    /* initialize data for dataset */
+    for(i=0; i<SPACE1_DIM1; i++) {
+        if(i%2) {
+            wdata[i].len=0;
+            wdata[i].p=NULL;
+        } /* end if */
+        else {
+            wdata[i].len = (size_t)(i + 5);
+            wdata[i].p = HDmalloc(sizeof(unsigned) * (size_t)(i + 5));
+            for(j = 0; j < i + 5; j++)
+                ((unsigned *)wdata[i].p)[j] = (unsigned)(j * 2);
+        } /* end else */
+    } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE43, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid1>0);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+    HDassert(sid1>0);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tvlen_create(H5T_NATIVE_UINT);
+    HDassert(tid1>0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, F43_DSETNAME, tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(dataset>0);
+
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+
+    ret = H5Sclose (sid1);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose (fid1);
+    HDassert(ret >= 0);
+}
+
+/* This is big enough to make h5dump to use hyperslap to read
+   from file and display portion by portion. This also prints out array indices
+   via region reference for testing refion reference output.
+   Note: this was added originally prepared for bug2092. before the fix h5dump didn't
+         display array indices every 262 x N (N > 0) based on 2000x1000 dims.
+ */
+#define SPACE_ARRAY1BIG_DIM 2000
+#define ARRAY1BIG_DIM 1000
+
+static void gent_array1_big(void)
+{
+    int *wdata;   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE_ARRAY1BIG_DIM};
+    hsize_t  tdims1[] = {ARRAY1BIG_DIM};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+
+    /* for region reference dataset */
+    hid_t  dset2;
+    hid_t  sid2;
+    hsize_t  dims2[] = {SPACE1_DIM1};
+    hsize_t  start[SPACE1_RANK];     /* Starting location of hyperslab */
+    hsize_t  stride[SPACE1_RANK];    /* Stride of hyperslab */
+    hsize_t  count[SPACE1_RANK];     /* Element count of hyperslab */
+    hsize_t  block[SPACE1_RANK];     /* Block size of hyperslab */
+    hdset_reg_ref_t   *wbuf;         /* buffer to write to disk */
+
+    start[0] = 0;
+    stride[0] = 1;
+    count[0] = 999;
+    block[0] = 1;
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t*) HDcalloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1);
+    wdata = (int *)HDmalloc(sizeof(int) * (size_t)(SPACE_ARRAY1BIG_DIM * ARRAY1BIG_DIM));
+
+    /* Allocate and initialize array data to write */
+    for(i = 0; i < SPACE_ARRAY1BIG_DIM; i++)
+        for(j = 0; j < ARRAY1BIG_DIM; j++)
+            *(wdata + (i * ARRAY1BIG_DIM) + j) = i * 1;
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE25_BIG, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------
+     * Array type dataset
+     */
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /*---------------------------
+     * Region Reference dataset
+     */
+    /* Create dataspace for the reference dataset */
+    sid2 = H5Screate_simple(SPACE1_RANK, dims2, NULL);
+
+    /* Create a dataset */
+    dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_REF_DSETREG, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create references */
+    H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block);
+
+    H5Sget_select_npoints(sid1);
+
+    /* Create Dataset1 region */
+    H5Rcreate(&wbuf[0], fid1, "/Dataset1", H5R_DATASET_REGION, sid1);
+
+    /* Write selection to disk */
+    H5Dwrite(dset2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+
+    /* Release memory */
+    HDfree(wbuf);
+    HDfree(wdata);
+}
+
+static void gent_array1(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++)
+            wdata[i][j]=i*10+j;
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE25, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array2(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY2_DIM1][ARRAY2_DIM2][ARRAY2_DIM3];   /* Information to write */
+    hid_t  fid;        /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid;        /* Dataspace ID   */
+    hid_t  tid;        /* Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims2[] = {ARRAY2_DIM1,ARRAY2_DIM2,ARRAY2_DIM3};
+    int        i,j,k,l;    /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY2_DIM1; j++)
+            for(k=0; k<ARRAY2_DIM2; k++)
+                for(l=0; l<ARRAY2_DIM3; l++)
+                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
+
+    /* Create file */
+    fid = H5Fcreate(FILE26, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a datatype to refer to */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, ARRAY2_RANK, tdims2);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid, "Dataset1", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+static void gent_array3(void)
+{
+    int wdata[SPACE1_DIM1][ARRAY1_DIM1][ARRAY3_DIM1][ARRAY3_DIM2];   /* Information to write */
+    hid_t  fid;        /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid;        /* Dataspace ID   */
+    hid_t  tid1;       /* 1-D array Datatype ID */
+    hid_t  tid2;       /* 2-D array Datatype ID */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    hsize_t  tdims2[] = {ARRAY3_DIM1,ARRAY3_DIM2};
+    int        i,j,k,l;    /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Allocate and initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++)
+            for(k=0; k<ARRAY3_DIM1; k++)
+                for(l=0; l<ARRAY3_DIM2; l++)
+                    wdata[i][j][k][l]=i*1000+j*100+k*10+l;
+
+    /* Create file */
+    fid = H5Fcreate(FILE27, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a 2-D datatype to refer to */
+    tid2 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY3_RANK, tdims2);
+
+    /* Create a 1-D datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+static void gent_array4(void)
+{
+    typedef struct {        /* Typedef for compound datatype */
+            int i;
+            float f;
+    } s2_t;
+    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* Compound Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j;        /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].i = i * 10 + j;
+            wdata[i][j].f = (float)((float)i * 2.5F + (float)j);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE28, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert(tid2, "i", HOFFSET(s2_t, i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+
+    /* Insert float field */
+    ret = H5Tinsert(tid2, "f", HOFFSET(s2_t, f), H5T_NATIVE_FLOAT);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close compound datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array5(void)
+{
+    typedef struct {        /* Typedef for compound datatype */
+            int i;
+            float f[ARRAY1_DIM1];
+    } s2_t;
+    s2_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID */
+    hid_t  tid2;       /* Compound Datatype ID */
+    hid_t  tid3;       /* Nested Array Datatype ID */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].i = i * 10 + j;
+            for(k=0; k<ARRAY1_DIM1; k++)
+                wdata[i][j].f[k] = (float)((float)i * 10 + (float)j * 2.5F + (float)k);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE29, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t));
+
+    /* Insert integer field */
+    ret = H5Tinsert (tid2, "i", HOFFSET(s2_t,i), H5T_NATIVE_INT);
+    HDassert(ret >= 0);
+
+    /* Create an array of floats datatype */
+    tid3 = H5Tarray_create2(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1);
+
+    /* Insert float array field */
+    ret = H5Tinsert (tid2, "f", HOFFSET(s2_t,f), tid3);
+    HDassert(ret >= 0);
+
+    /* Close array of floats field datatype */
+    ret = H5Tclose(tid3);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close compound datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array6(void)
+{
+    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* VL Datatype ID       */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k;      /* counting variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].p = HDmalloc((size_t)(i + j + 1) * sizeof(unsigned int));
+            wdata[i][j].len = (size_t)(i + j + 1);
+            for(k = 0; k < (i + j + 1); k++)
+                ((unsigned int *)wdata[i][j].p)[k] = (unsigned)(i * 100 + j * 10 + k);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE30, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create a compound datatype to refer to */
+    tid2 = H5Tvlen_create(H5T_NATIVE_UINT);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close VL datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+static void gent_array7(void)
+{
+    hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1];   /* Information to write */
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset; /* Dataset ID   */
+    hid_t  sid1;       /* Dataspace ID   */
+    hid_t  tid1;       /* Array Datatype ID   */
+    hid_t  tid2;       /* VL Datatype ID       */
+    hid_t  tid3;       /* Nested Array Datatype ID   */
+    hsize_t  sdims1[] = {SPACE1_DIM1};
+    hsize_t  tdims1[] = {ARRAY1_DIM1};
+    int        i,j,k,l;    /* Index variables */
+    herr_t  ret;  /* Generic return value  */
+
+    /* Initialize array data to write */
+    for(i=0; i<SPACE1_DIM1; i++)
+        for(j=0; j<ARRAY1_DIM1; j++) {
+            wdata[i][j].p = HDmalloc((size_t)(i + j + 1) * (sizeof(unsigned int) * ARRAY1_DIM1));
+            wdata[i][j].len = (size_t)(i + j + 1);
+            for(k = 0; k < (i + j + 1); k++)
+                for(l = 0; l<ARRAY1_DIM1; l++)
+                    ((unsigned int *)wdata[i][j].p)[k * ARRAY1_DIM1 + l] = (unsigned)(i * 1000+j * 100+k * 10 + l);
+        } /* end for */
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE31, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create dataspace for datasets */
+    sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL);
+
+    /* Create the nested array datatype to refer to */
+    tid3 = H5Tarray_create2(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1);
+
+    /* Create a VL datatype of 1-D arrays to refer to */
+    tid2 = H5Tvlen_create(tid3);
+
+    /* Close nested array datatype */
+    ret = H5Tclose(tid3);
+    HDassert(ret >= 0);
+
+    /* Create an array datatype to refer to */
+    tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1);
+
+    /* Close VL datatype */
+    ret = H5Tclose(tid2);
+    HDassert(ret >= 0);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write dataset to disk */
+    ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Reclaim the write VL data */
+    ret = H5Dvlen_reclaim(tid1, sid1, H5P_DEFAULT, wdata);
+    HDassert(ret >= 0);
+
+    /* Close Dataset */
+    ret = H5Dclose(dataset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid1);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid1);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid1);
+    HDassert(ret >= 0);
+}
+
+/* Test the boundary of the display output buffer at the reallocation event */
+static void gent_array8(void)
+{
+    hid_t       file = -1; /* Handles */
+    hid_t       filetype = -1; /* Handles */
+    hid_t       space = -1; /* Handles */
+    hid_t       dset = -1; /* Handles */
+    herr_t      status = -1;
+    hsize_t sdims[] = {F64_DIM0};
+    hsize_t tdims[] = {F64_DIM1};
+    int         *wdata;      /* Write buffer */
+    unsigned int i;
+
+    /* Allocate data buffer */
+    wdata = HDmalloc(F64_DIM1 * sizeof(int));
+    HDassert(wdata);
+
+    /*
+     * Initialize data.  i is the element in the dataspace, j and k the
+     * elements within the array datatype.
+     */
+    for (i = 0; i < F64_DIM1; i++)
+        wdata[i] = (int)i;
+
+    /*
+     * Create a new file using the default properties.
+     */
+    file = H5Fcreate (F64_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /*
+     * Create array datatypes for file and memory.
+     */
+    filetype = H5Tarray_create2 (H5T_NATIVE_INT, 1, tdims);
+
+    /*
+     * Create dataspace.  Setting maximum size to NULL sets the maximum
+     * size to be the current size.
+     */
+    space = H5Screate_simple (1, sdims, NULL);
+
+    /*
+     * Create the dataset and write the array data to it.
+     */
+    if(file>=0 && filetype>=0 && space>=0) {
+        dset = H5Dcreate2 (file, F64_DATASET, filetype, space, H5P_DEFAULT, H5P_DEFAULT,
+                H5P_DEFAULT);
+        if(dset>=0)
+            status = H5Dwrite (dset, filetype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+            HDassert(status >= 0);
+    }
+
+    /*
+     * Close and release resources.
+     */
+    status = H5Dclose (dset);
+    HDassert(status >= 0);
+    status = H5Sclose (space);
+    HDassert(status >= 0);
+    status = H5Tclose (filetype);
+    HDassert(status >= 0);
+    status = H5Fclose (file);
+    HDassert(status >= 0);
+    HDfree(wdata);
+}
+
+static void gent_empty(void)
+{
+    typedef struct {
+            int a;
+            float b;
+            char c;
+    } empty_struct;
+    hid_t file, dset, space, type;
+    hsize_t dims[] = { SPACE1_DIM1 };
+    herr_t ret=0;
+
+    file = H5Fcreate(FILE32, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    space = H5Screate_simple(SPACE1_RANK, dims, NULL);
+
+    /* write out an empty vlen dataset */
+    type = H5Tvlen_create(H5T_NATIVE_INT);
+    dset = H5Dcreate2(file, "Dataset1.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    /* write out an empty native integer dataset dataset */
+    dset = H5Dcreate2(file, "Dataset2.0", H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+
+    /* write out an empty native floating-point dataset dataset */
+    dset = H5Dcreate2(file, "Dataset3.0", H5T_NATIVE_FLOAT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+
+    /* write out an empty array dataset */
+    type = H5Tarray_create2(H5T_NATIVE_INT, SPACE1_RANK, dims);
+    dset = H5Dcreate2(file, "Dataset4.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    /* write out an empty compound dataset */
+    type = H5Tcreate(H5T_COMPOUND,sizeof(empty_struct));
+    H5Tinsert(type, "a", HOFFSET(empty_struct, a),H5T_NATIVE_INT);
+    H5Tinsert(type, "b", HOFFSET(empty_struct, b),H5T_NATIVE_FLOAT);
+    H5Tinsert(type, "c", HOFFSET(empty_struct, c),H5T_NATIVE_CHAR);
+    dset = H5Dcreate2(file, "Dataset5.0", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* Don't write any data */
+    ret = H5Dclose(dset);
+    HDassert(ret >= 0);
+    ret = H5Tclose(type);
+    HDassert(ret >= 0);
+
+    ret = H5Sclose(space);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose(file);
+    HDassert(ret >= 0);
+}
+
+static void
+gent_group_comments(void)
+{
+    hid_t fid, group;
+
+    fid = H5Fcreate(FILE33, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* / */
+    group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1", "Comment for group /g1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2", "Comment for group /g2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3", "Comment for group /g3", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g1 */
+    group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1/g1.1", "Comment for group /g1/g1.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g1/g1.2", "Comment for group /g1/g1.2", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2 */
+    group = H5Gcreate2(fid, "/g2/g2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1", "Comment for group /g2/g2.1", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g3 */
+    group = H5Gcreate2(fid, "/g3/g3.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.1", "Comment for group /g3/g3.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.2", "Comment for group /g3/g3.2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.3", "Comment for group /g3/g3.3", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g3/g3.4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g3/g3.4", "Comment for group /g3/g3.4", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /g2/g2.1 */
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.1", "Comment for group /g2/g2.1/g2.1.1", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.2", "Comment for group /g2/g2.1/g2.1.2", H5P_DEFAULT);
+    H5Gclose(group);
+    group = H5Gcreate2(fid, "/g2/g2.1/g2.1.3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/g2/g2.1/g2.1.3", "Comment for group /g2/g2.1/g2.1.3", H5P_DEFAULT);
+    H5Gclose(group);
+
+    /* /glongcomment */
+    group = H5Gcreate2(fid, "/glongcomment", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Oset_comment_by_name(group, "/glongcomment", "Comment for group /glongcomment with a really, really, really long, long, long comment", H5P_DEFAULT);
+    H5Gclose(group);
+
+    H5Fclose(fid);
+}
+
+static
+void gent_split_file(void)
+{
+    hid_t fapl, fid, root, attr, space, dataset, atype;
+    char meta[] = "this is some metadata on this file";
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
+    fid = H5Fcreate(FILE34, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    atype = H5Tcopy(H5T_C_S1);
+    H5Tset_size(atype, HDstrlen(meta) + 1);
+    H5Tset_strpad(atype, H5T_STR_NULLTERM);
+
+    dims[0] = 1;
+    space = H5Screate_simple(1, dims, NULL);
+    attr = H5Acreate2(root, "Metadata", atype, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, atype, meta);
+    H5Tclose(atype);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Gclose(root);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static
+void gent_family(void)
+{
+    hid_t fapl, fid, space, dataset;
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+#define FAMILY_SIZE     256
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT);
+
+    fid = H5Fcreate(FILE35, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static const char *multi_letters = "msbrglo";
+
+static
+void gent_multi(void)
+{
+    hid_t fapl, fid, space, dataset;
+    hsize_t dims[2];
+    int i, j, dset[10][15];
+
+    /* Multi-file driver, general case of the split driver */
+    H5FD_mem_t mt, memb_map[H5FD_MEM_NTYPES];
+    hid_t memb_fapl[H5FD_MEM_NTYPES];
+    const char *memb_name[H5FD_MEM_NTYPES];
+    char sv[H5FD_MEM_NTYPES][1024];
+    haddr_t memb_addr[H5FD_MEM_NTYPES];
+
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+
+    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);
+
+    HDassert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
+
+    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+        memb_fapl[mt] = H5P_DEFAULT;
+        memb_map[mt] = mt;
+        sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+        memb_name[mt] = sv[mt];
+        /*printf("memb_name[%d]=%s, memb_map[%d]=%d; ", mt, memb_name[mt], mt, memb_map[mt]);*/
+        memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
+    }
+    memb_map[H5FD_MEM_DEFAULT] = H5FD_MEM_SUPER;
+
+    H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
+            memb_addr, FALSE);
+
+    fid = H5Fcreate(FILE36, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+
+    /* create dataset */
+    dims[0] = 10;
+    dims[1] = 15;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, "/dset1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 15; j++)
+            dset[i][j] = i + j;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+    H5Pclose(fapl);
+}
+
+static void gent_large_objname(void)
+{
+    hid_t fid, group, group2;
+    char grp_name[128];
+    register int i;
+
+    fid = H5Fcreate(FILE37, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "this_is_a_large_group_name", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < 50; ++i) {
+        sprintf(grp_name, "this_is_a_large_group_name%d", i);
+        group2 = H5Gcreate2(group, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Gclose(group2);
+    }
+
+    H5Gclose(group);
+    H5Fclose(fid);
+}
+
+static void gent_vlstr(void)
+{
+    const char *wdata[SPACE1_DIM1]= {
+            "Four score and seven years ago our forefathers brought forth on this continent a new nation,",
+            "conceived in liberty and dedicated to the proposition that all men are created equal.",
+            "",
+            NULL
+    };   /* Information to write */
+    const char *string_att= "This is the string for the attribute";
+    hid_t  fid1;  /* HDF5 File IDs  */
+    hid_t  dataset, root; /* Dataset ID   */
+    hid_t  sid1, dataspace;/* Dataspace ID   */
+    hid_t  tid1, att;      /* Datatype ID   */
+    hsize_t  dims1[] = {SPACE1_DIM1};
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE38, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+
+    /* Create a VL string datatype to refer to */
+    tid1 = H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid1, H5T_VARIABLE);
+
+    /* Create a dataset and write VL string to it. */
+    dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+    H5Dclose(dataset);
+
+    /* Create a named VL string type.  Change padding of datatype */
+    H5Tset_strpad(tid1, H5T_STR_NULLPAD);
+    H5Tcommit2(fid1, "vl_string_type", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create an group attribute of VL string type */
+    root = H5Gopen2(fid1, "/", H5P_DEFAULT);
+    dataspace = H5Screate(H5S_SCALAR);
+
+    att = H5Acreate2(root, "test_scalar", tid1, dataspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(att, tid1, &string_att);
+
+    /* Close */
+    H5Tclose(tid1);
+    H5Sclose(sid1);
+    H5Sclose(dataspace);
+    H5Aclose(att);
+    H5Gclose(root);
+    H5Fclose(fid1);
+}
+
+static void gent_char(void)
+{
+    const char *wdata =
+            "Four score and seven years ago our forefathers brought "
+            "forth on this continent a new nation, conceived in "
+            "liberty and dedicated to the proposition that all "
+            "men are created equal. Now we are engaged in a great "
+            "civil war, testing whether that nation or any nation "
+            "so conceived and so dedicated can long endure.";
+    hid_t       fid1;               /* HDF5 File IDs    */
+    hid_t       dataset;            /* Dataset ID       */
+    hid_t       sid1;               /* Dataspace ID     */
+    hsize_t     dims1[1];
+
+    dims1[0] = HDstrlen(wdata);
+
+    /* Create file */
+    fid1 = H5Fcreate(FILE39, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid1 = H5Screate_simple(1, dims1, NULL);
+
+    /* Create a dataset */
+    dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_CHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write some characters to it. */
+    H5Dwrite(dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+
+    /* Close */
+    H5Dclose(dataset);
+    H5Sclose(sid1);
+    H5Fclose(fid1);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_attr_in
+ *
+ * Purpose: write attributes in LOC_ID (dataset, group, named datatype)
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void write_attr_in(hid_t loc_id,
+        const char* dset_name, /* for saving reference to dataset*/
+        hid_t fid)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+            char   a;
+            double b;
+    } s_t;
+
+    typedef enum
+    {
+        E_RED,
+        E_GREEN
+    } e_t;
+
+    hid_t   aid;
+    hid_t   sid;
+    hid_t   tid;
+    herr_t  status;
+    int     val, i, j, k, n;
+    float   f;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+            "rs","tu","vw","xz","AB","CD","EF","GH",
+            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+     * 1D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,1,dims,"enum",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc(1 * sizeof(int));
+    ((int *)buf5[0].p)[0] = 1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc(2 * sizeof(int));
+    ((int *)buf5[1].p)[0] = 2;
+    ((int *)buf5[1].p)[1] = 3;
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf5);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_attr(loc_id, 1, dims, "integer", H5T_NATIVE_INT, buf7);
+    write_attr(loc_id, 1, dims, "float", H5T_NATIVE_FLOAT, buf8);
+
+
+    /*-------------------------------------------------------------------------
+     * 2D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 3; i++) {
+            for(j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,2,dims2,"enum2D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            int l;
+
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                ((int *)buf52[i][j].p)[l] = n++;
+        }
+    }
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf52);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_attr(loc_id, 2, dims2, "integer2D", H5T_NATIVE_INT, buf72);
+    write_attr(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
+
+
+    /*-------------------------------------------------------------------------
+     * 3D attributes
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_attr(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf23[i][j][k] = (char)n++;
+            }
+        }
+    }
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_attr(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_attr(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf33[i][j][k].a = (char)n++;
+                buf33[i][j][k].b=n++;
+            }
+        }
+    }
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_attr(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 4; i++) {
+            for(j = 0; j < 3; j++) {
+                for(k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_attr(loc_id,3,dims3,"enum3D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                int l;
+
+                buf53[i][j][k].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++)
+                    ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+        }
+    }
+
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(aid, tid, buf53);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Aclose(aid);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    n = 1;
+    for(i = 0; i < 24; i++)
+        for(j = 0; j < (int)dimarray[0]; j++)
+            buf63[i][j] = n++;
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_attr(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    n=1; f=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf73[i][j][k]=n++;
+                buf83[i][j][k]=f++;
+            }
+        }
+    }
+    write_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset_in
+ *
+ * Purpose: write datasets in LOC_ID
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 28, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void write_dset_in(hid_t loc_id,
+        const char* dset_name, /* for saving reference to dataset*/
+        hid_t fid)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+            char   a;
+            double b;
+    } s_t;
+
+    typedef enum
+    {
+        E_RED,
+        E_GREEN
+    } e_t;
+
+    hid_t   did;
+    hid_t   sid;
+    hid_t   tid;
+    hid_t   plist_id;
+    herr_t  status;
+    int     val, i, j, k, n;
+    float   f;
+    int     fillvalue=2;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+            "rs","tu","vw","xz","AB","CD","EF","GH",
+            "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+     * 1D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,1,dims,"string",tid,buf1);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,1,dims,"bitfield",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,1,dims,"opaque",tid,buf2);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,1,dims,"compound",tid,buf3);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+        write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,1,dims,"enum",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf5[1].p)[0]=2;
+    ((int *)buf5[1].p)[1]=3;
+
+    sid = H5Screate_simple(1, dims, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 1, dims, "array", tid, buf6);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
+    write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+
+
+    /*-------------------------------------------------------------------------
+     * 2D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,2,dims2,"string2D",tid,buf12);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 3; i++) {
+            for(j = 0; j < 2; j++) {
+                status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,2,dims2,"enum2D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 2; j++) {
+            int l;
+
+            buf52[i][j].p = HDmalloc((size_t)(i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                ((int *)buf52[i][j].p)[l] = n++;
+        }
+
+    sid = H5Screate_simple(2, dims2, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 2, dims2, "array2D", tid, buf62);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER, write a fill value
+     *-------------------------------------------------------------------------
+     */
+    plist_id = H5Pcreate(H5P_DATASET_CREATE);
+    status = H5Pset_fill_value(plist_id, H5T_NATIVE_INT, &fillvalue);
+    sid = H5Screate_simple(2, dims2, NULL);
+    did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, plist_id, H5P_DEFAULT);
+    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72);
+    status = H5Pclose(plist_id);
+    status = H5Dclose(did);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+
+    write_dset(loc_id, 2, dims2, "float2D", H5T_NATIVE_FLOAT, buf82);
+
+
+    /*-------------------------------------------------------------------------
+     * 3D
+     *-------------------------------------------------------------------------
+     */
+
+    /*-------------------------------------------------------------------------
+     * H5T_STRING
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_C_S1);
+    status  = H5Tset_size(tid, 2);
+    write_dset(loc_id,3,dims3,"string3D",tid,buf13);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_BITFIELD
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++)
+                buf23[i][j][k] = (char)n++;
+    tid = H5Tcopy(H5T_STD_B8LE);
+    write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_OPAQUE
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_OPAQUE, 1);
+    status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+    write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_COMPOUND
+     *-------------------------------------------------------------------------
+     */
+
+    n=1;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++) {
+                buf33[i][j][k].a = (char)n++;
+                buf33[i][j][k].b = n++;
+            }
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+    H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+    write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_REFERENCE
+     *-------------------------------------------------------------------------
+     */
+    /* Create references to dataset */
+    if(dset_name)
+    {
+        for(i = 0; i < 4; i++) {
+            for(j = 0; j < 3; j++) {
+                for(k = 0; k < 2; k++)
+                    status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1);
+            }
+        }
+        write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+    }
+
+    /*-------------------------------------------------------------------------
+     * H5T_ENUM
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+    H5Tenum_insert(tid, "RED",   (val = 0, &val));
+    H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+    write_dset(loc_id,3,dims3,"enum3D",tid,0);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_VLEN
+     *-------------------------------------------------------------------------
+     */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            for(k = 0; k < 2; k++) {
+                int l;
+
+                buf53[i][j][k].p = HDmalloc(((size_t)i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++)
+                    ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+
+    sid = H5Screate_simple(3, dims3, NULL);
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53);
+    HDassert(status >= 0);
+    status = H5Dclose(did);
+    status = H5Tclose(tid);
+    status = H5Sclose(sid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_ARRAY
+     *-------------------------------------------------------------------------
+     */
+    n=1;
+    for(i = 0; i < 24; i++) {
+        for(j = 0; j < (int)dimarray[0]; j++) {
+            buf63[i][j]=n++;
+        }
+    }
+
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(loc_id, 3, dims3, "array3D", tid, buf63);
+    status = H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * H5T_INTEGER and H5T_FLOAT
+     *-------------------------------------------------------------------------
+     */
+    n=1; f=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                buf73[i][j][k]=n++;
+                buf83[i][j][k]=f++;
+            }
+        }
+    }
+    write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+    write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_attr_all
+ *
+ * Purpose: generate all datatype attributes
+ *
+ * Return: void
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void gent_attr_all(void)
+{
+    hid_t   fid;
+    hid_t   did;
+    hid_t   group_id;
+    hid_t   group2_id;
+    hid_t   root_id;
+    hid_t   sid;
+    hsize_t dims[1] = {2};
+    herr_t  status;
+
+    /* Create a file and a dataset */
+    fid = H5Fcreate(FILE40, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create a 1D dataset */
+    sid = H5Screate_simple(1,dims,NULL);
+    did = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Sclose(sid);
+    HDassert(status >= 0);
+
+    /* Create groups */
+    group_id  = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    group2_id = H5Gcreate2(fid, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    root_id   = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+     * write a series of attributes on the dataset, group
+     *-------------------------------------------------------------------------
+     */
+
+    write_attr_in(did,"dset",fid);
+    write_attr_in(group_id,NULL,(hid_t)0);
+    write_attr_in(root_id,NULL,(hid_t)0);
+
+    /*-------------------------------------------------------------------------
+     * write a series of datasets on group 2
+     *-------------------------------------------------------------------------
+     */
+
+    write_dset_in(group2_id,"/dset",fid);
+
+    /* Close */
+    status = H5Dclose(did);
+    HDassert(status >= 0);
+    status = H5Gclose(group_id);
+    HDassert(status >= 0);
+    status = H5Gclose(group2_id);
+    HDassert(status >= 0);
+    status = H5Gclose(root_id);
+    HDassert(status >= 0);
+
+    /* Close file */
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_attr
+ *
+ * Purpose: utility function to write an attribute
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 19, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int write_attr(hid_t loc_id, int rank, hsize_t *dims, const char *attr_name,
+        hid_t tid, void *buf)
+{
+    hid_t   aid;
+    hid_t   sid;
+    herr_t  status;
+
+    /* Create a buf space  */
+    sid = H5Screate_simple(rank, dims, NULL);
+
+    /* Create the attribute */
+    aid = H5Acreate2(loc_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write the buf */
+    if(buf)
+        status = H5Awrite(aid, tid, buf);
+
+    /* Close */
+    status = H5Aclose(aid);
+    status = H5Sclose(sid);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ * Return:
+ *
+ * Programmer: pvn at ncsa.uiuc.edu
+ *
+ * Date: May 27, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static
+int write_dset( hid_t loc_id, int rank, hsize_t *dims, const char *dset_name,
+        hid_t tid, void *buf )
+{
+    hid_t   did;
+    hid_t   sid;
+    herr_t  status;
+
+    /* Create a buf space  */
+    sid = H5Screate_simple(rank, dims, NULL);
+
+    /* Create a dataset */
+    did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write the buf */
+    if(buf)
+        status = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+
+    /* Close */
+    status = H5Dclose(did);
+    status = H5Sclose(sid);
+
+    return status;
+}
+
+
+static void gent_compound_complex(void)
+{
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            int                a;
+            const char         *b[F41_DIMb];
+            char               c[F41_ARRAY_DIMc];
+            short              d[F41_ARRAY_DIMd1][F41_ARRAY_DIMd2];
+            float              e;
+            double             f[F41_ARRAY_DIMf];
+            char               g;
+    } Array1Struct;
+    Array1Struct       Array1[F41_LENGTH];
+
+    /* Define the value of the string array                           */
+    const char *quote [F41_DIMb] = {
+            "A fight is a contract that takes two people to honor.",
+            "A combative stance means that you've accepted the contract.",
+            "In which case, you deserve what you get.",
+            "  --  Professor Cheng Man-ch'ing"
+    };
+
+    /* Define the value of the character array                        */
+    char chararray [F41_ARRAY_DIMc] = {'H', 'e', 'l', 'l', 'o', '!'};
+
+
+    hid_t      Array1Structid;            /* File datatype identifier */
+    hid_t      array_tid;                 /* Array datatype handle    */
+    hid_t      array1_tid;                /* Array datatype handle    */
+    hid_t      array2_tid;                /* Array datatype handle    */
+    hid_t      array4_tid;                /* Array datatype handle    */
+    hid_t      datafile, dataset;         /* Datafile/dataset handles */
+    hid_t      dataspace;                 /* Dataspace handle         */
+    herr_t     status;                    /* Error checking variable */
+    hsize_t    dim[] = {F41_LENGTH};          /* Dataspace dimensions     */
+    hsize_t    array_dimb[] = {F41_DIMb};     /* Array dimensions         */
+    hsize_t    array_dimd[]={F41_ARRAY_DIMd1,F41_ARRAY_DIMd2}; /* Array dimensions         */
+    hsize_t    array_dimf[]={F41_ARRAY_DIMf}; /* Array dimensions         */
+    hid_t      str_array_id;
+
+    int        m, n, o;                   /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for(m = 0; m< F41_LENGTH; m++) {
+        Array1[m].a = m;
+
+        for(n = 0; n < F41_DIMb; n++)
+            Array1[m].b[n] = quote[n];
+
+        for(n = 0; n < F41_ARRAY_DIMc; n++)
+            Array1[m].c[n] = chararray[n];
+
+        for(n = 0; n < F41_ARRAY_DIMd1; n++)
+            for(o = 0; o < F41_ARRAY_DIMd2; o++)
+                Array1[m].d[n][o] = (short)(m + n + o);
+
+        Array1[m].e = (float)((float)m * 0.96F );
+
+        for(n = 0; n < F41_ARRAY_DIMf; n++)
+            Array1[m].f[n] = ((float)m * 1024.9637F );
+
+        Array1[m].g = 'm';
+    }
+
+    /* Create the dataspace                                           */
+    dataspace = H5Screate_simple(F41_RANK, dim, NULL);
+    HDassert(dataspace >= 0);
+
+    /* Create the file                                                */
+    datafile = H5Fcreate(FILE41, H5F_ACC_TRUNC, H5P_DEFAULT,
+            H5P_DEFAULT);
+    HDassert(datafile >= 0);
+
+    /* Copy the array data type for the string array                  */
+    array_tid = H5Tcopy (H5T_C_S1);
+    HDassert(array_tid >= 0);
+
+    /* Set the string array size to Variable                          */
+    status = H5Tset_size (array_tid,H5T_VARIABLE);
+    HDassert(status >= 0);
+
+    /* Create the array data type for the string array                */
+    str_array_id = H5Tarray_create2(array_tid, F41_ARRAY_RANK, array_dimb);
+    HDassert(str_array_id >= 0);
+
+    /* Copy the array data type for the character array               */
+    array1_tid = H5Tcopy (H5T_C_S1);
+    HDassert(array1_tid >= 0);
+
+    /* Set the character array size                                   */
+    status = H5Tset_size (array1_tid, F41_ARRAY_DIMc);
+    HDassert(status >= 0);
+
+    /* Create the array data type for the character array             */
+    array2_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F41_ARRAY_RANKd, array_dimd);
+    HDassert(array2_tid >= 0);
+
+    /* Create the array data type for the character array             */
+    array4_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F41_ARRAY_RANK, array_dimf);
+    HDassert(array4_tid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate (H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, "a_name",
+            HOFFSET(Array1Struct, a), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "b_name",
+            HOFFSET(Array1Struct, b), str_array_id);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "c_name",
+            HOFFSET(Array1Struct, c), array1_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "d_name",
+            HOFFSET(Array1Struct, d), array2_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "e_name",
+            HOFFSET(Array1Struct, e), H5T_NATIVE_FLOAT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "f_name",
+            HOFFSET(Array1Struct, f), array4_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, "g_name",
+            HOFFSET(Array1Struct, g), H5T_NATIVE_CHAR);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(datafile, F41_DATASETNAME, Array1Structid,
+            dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL,
+            H5P_DEFAULT, Array1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array1_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array2_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array4_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(str_array_id);
+    HDassert(status >= 0);
+
+    status = H5Sclose(dataspace);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(datafile);
+    HDassert(status >= 0);
+}
+
+
+static void gent_named_dtype_attr(void)
+{
+    hid_t fid;
+    hid_t did;
+    hid_t sid;
+    hid_t tid;
+    hid_t aid;
+    hid_t gid;
+    int data=8;
+    herr_t ret;
+
+    /* Create a file */
+    fid=H5Fcreate(FILE42, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>0);
+
+    /*-------------------------------------------------------------------------
+     * datatype
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create a datatype to commit and use */
+    tid=H5Tcopy(H5T_NATIVE_INT);
+    HDassert(tid>0);
+
+    /* Commit datatype to file */
+    ret = H5Tcommit2(fid, F42_TYPENAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* Create a hard link to the datatype */
+    ret = H5Lcreate_hard(fid, F42_TYPENAME, fid, F42_LINKNAME, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* Create a scalar dataspace used for all objects */
+    sid = H5Screate(H5S_SCALAR);
+    HDassert(sid > 0);
+
+    /* Create attribute on commited datatype */
+    aid = H5Acreate2(tid, F42_ATTRNAME, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create dataset */
+    did = H5Dcreate2(fid, F42_DSETNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(did > 0);
+
+    /* Create attribute on dataset */
+    aid = H5Acreate2(did, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * group
+     *-------------------------------------------------------------------------
+     */
+
+    /* Create a group */
+    gid = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid > 0);
+
+    /* Create attribute on group */
+    aid = H5Acreate2(gid, F42_ATTRNAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(aid > 0);
+
+    /* Write data into the attribute */
+    ret = H5Awrite(aid, H5T_NATIVE_INT, &data);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+    /* Close attribute */
+    ret = H5Aclose(aid);
+    HDassert(ret >= 0);
+
+    /* Close dataset */
+    ret = H5Dclose(did);
+    HDassert(ret >= 0);
+
+    /* Close dataspace */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /* Close datatype */
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /* Close file */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_null_space
+ *
+ * Purpose: generates dataset and attribute of null dataspace
+ *-------------------------------------------------------------------------
+ */
+static void gent_null_space(void)
+{
+    hid_t fid, root, dataset, space, attr;
+    int dset_buf = 10;
+    int point = 4;
+
+    fid = H5Fcreate(FILE45, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* null space */
+    space = H5Screate(H5S_NULL);
+
+    /* dataset */
+    dataset = H5Dcreate2(fid, "dset", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    /* nothing should be written */
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
+
+    /* attribute */
+    attr = H5Acreate2(root, "attr", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
+
+    H5Dclose(dataset);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_zero_dim_size
+ *
+ * Purpose: generates dataset and attribute with dataspace of 0 dimension size
+ *-------------------------------------------------------------------------
+ */
+static void gent_zero_dim_size(void)
+{
+    hid_t fid, root, dataset, space, attr;
+    hsize_t  dims1[] = {SPACE3_DIM1, SPACE3_DIM2};
+    int dset_buf = 10;
+    int point = 4;
+
+    fid = H5Fcreate(FILE67, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* dataspace of 0 dimension size */
+    space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
+
+    /* dataset */
+    dataset = H5Dcreate2(fid, "dset of 0 dimension size", H5T_STD_I32BE, space, H5P_DEFAULT,
+            H5P_DEFAULT, H5P_DEFAULT);
+    /* nothing should be written */
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_buf);
+
+    /* attribute */
+    attr = H5Acreate2(root, "attr of 0 dimension size", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT, &point); /* Nothing can be written */
+
+    H5Dclose(dataset);
+    H5Aclose(attr);
+    H5Gclose(root);
+    H5Sclose(space);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: make_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int make_dset(hid_t loc_id,
+        const char *name,
+        hid_t sid,
+        hid_t tid,
+        hid_t dcpl,
+        void *buf)
+{
+    hid_t   dsid;
+
+    /* create the dataset */
+    if((dsid = H5Dcreate2(loc_id, name, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* write */
+    if(H5Dwrite(dsid, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+
+    /* close */
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    return 0;
+
+    out:
+    H5E_BEGIN_TRY {
+        H5Dclose(dsid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: make_external
+ *
+ * Purpose: make a dataset with external storage
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+make_external(hid_t fid)
+{
+    hid_t   dcpl;         /*dataset creation property list */
+    hid_t   sid;          /*dataspace ID */
+    hid_t   dsid;         /*dataset ID   */
+    hsize_t cur_size[1];  /*data space current size */
+    hsize_t max_size[1];  /*data space maximum size */
+    hsize_t size;         /*bytes reserved for data in the external file*/
+    int     ret;
+
+    cur_size[0] = max_size[0] = 100;
+    size = (max_size[0]*sizeof(int)/2);
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    ret = H5Pset_external(dcpl, "ext1.bin", (off_t)0, size);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_external(dcpl, "ext2.bin", (off_t)0, size);
+    HDassert(ret >= 0);
+
+    sid = H5Screate_simple(1, cur_size, max_size);
+    HDassert(ret >= 0);
+
+    dsid = H5Dcreate2(fid, "external", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    H5Dclose(dsid);
+    HDassert(ret >= 0);
+
+    H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    H5Pclose(dcpl);
+    HDassert(ret >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_filters
+ *
+ * Purpose: make several datasets with filters, external dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_filters(void)
+{
+    hid_t    fid;  /* file id */
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    tid;  /* datatype ID */
+#ifdef H5_HAVE_FILTER_SZIP
+    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
+    unsigned szip_pixels_per_block=4;
+#endif /* H5_HAVE_FILTER_SZIP */
+    hsize_t  dims1[RANK]      = {DIM1,DIM2};
+    hsize_t  chunk_dims[RANK] = {CDIM1,CDIM2};
+    int      buf1[DIM1][DIM2];
+    int      i, j, n, ret;
+
+    for(i=n=0; i<DIM1; i++){
+        for(j=0; j<DIM2; j++){
+            buf1[i][j]=n++;
+        }
+    }
+
+    /* create a file */
+    fid  = H5Fcreate(FILE44, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /* create a space */
+    sid = H5Screate_simple(SPACE2_RANK, dims1, NULL);
+
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    /*-------------------------------------------------------------------------
+     * create a compact and contiguous storage layout dataset
+     * add a comment to the datasets
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_layout(dcpl, H5D_COMPACT);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"compact",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "compact", "This is a dataset with compact storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_layout(dcpl, H5D_CONTIGUOUS);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"contiguous",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "contiguous", "This is a dataset with contiguous storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_layout(dcpl, H5D_CHUNKED);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"chunked",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "chunked", "This is a dataset with chunked storage", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * make several dataset with filters
+     *-------------------------------------------------------------------------
+     */
+
+    /* set up chunk */
+    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * SZIP
+     *-------------------------------------------------------------------------
+     */
+#ifdef H5_HAVE_FILTER_SZIP
+    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
+        /* remove the filters from the dcpl */
+        ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+        HDassert(ret >= 0);
+
+        /* set szip data */
+        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
+        HDassert(ret >= 0);
+
+        ret=make_dset(fid,"szip",sid,H5T_NATIVE_INT,dcpl,buf1);
+        HDassert(ret >= 0);
+    }
+#endif /* H5_HAVE_FILTER_SZIP */
+
+    /*-------------------------------------------------------------------------
+     * GZIP
+     *-------------------------------------------------------------------------
+     */
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set deflate data */
+    ret = H5Pset_deflate(dcpl, 9);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"deflate",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+#endif
+
+
+    /*-------------------------------------------------------------------------
+     * shuffle
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the shuffle filter */
+    ret = H5Pset_shuffle(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"shuffle",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * checksum
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the checksum filter */
+    ret = H5Pset_fletcher32(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fletcher32",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * nbit
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the checksum filter */
+    ret = H5Pset_nbit(dcpl);
+    HDassert(ret >= 0);
+
+    tid=H5Tcopy(H5T_NATIVE_INT);
+    H5Tset_precision(tid,H5Tget_size(tid)-1);
+    ret=make_dset(fid,"nbit",sid,tid,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * scaleoffset
+     *-------------------------------------------------------------------------
+     */
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the scaleoffset filter */
+    ret = H5Pset_scaleoffset(dcpl,H5Z_SO_INT,(int)H5Tget_size(H5T_NATIVE_INT));
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"scaleoffset",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * all filters
+     *-------------------------------------------------------------------------
+     */
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /* set the shuffle filter */
+    ret = H5Pset_shuffle(dcpl);
+    HDassert(ret >= 0);
+
+#ifdef H5_HAVE_FILTER_SZIP
+    if(h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
+        szip_options_mask=H5_SZIP_CHIP_OPTION_MASK | H5_SZIP_EC_OPTION_MASK;
+        /* set szip data */
+        ret = H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block);
+        HDassert(ret >= 0);
+    }
+#endif /* H5_HAVE_FILTER_SZIP */
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    ret = H5Pset_deflate(dcpl, 5);
+    HDassert(ret >= 0);
+#endif
+
+    /* set the checksum filter */
+    ret = H5Pset_fletcher32(dcpl);
+    HDassert(ret >= 0);
+
+    /* set the nbit filter */
+    ret = H5Pset_nbit(dcpl);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"all",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * user defined filter
+     *-------------------------------------------------------------------------
+     */
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    ret = H5Zregister (H5Z_MYFILTER);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_filter (dcpl, MYFILTER_ID, 0, 0, NULL);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"myfilter",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl,H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * make an external dataset
+     *-------------------------------------------------------------------------
+     */
+    make_external(fid);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_EARLY
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_early",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_INCR
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_incr",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_ALLOC_TIME_LATE
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"alloc_time_late",sid,H5T_NATIVE_INT,dcpl,buf1);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * commit a H5G_TYPE type with a comment
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_STD_B8LE);
+    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Oset_comment_by_name(fid, "mytype", "This is a commited datatype", H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: myfilter
+ *
+ * Purpose: filter operation callback function; the filter does nothing
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+myfilter(unsigned int H5_ATTR_UNUSED 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)
+{
+    return nbytes;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: set_local_myfilter
+ *
+ * Purpose: filter operation "set local" callback
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+set_local_myfilter(hid_t dcpl_id, hid_t H5_ATTR_UNUSED tid, hid_t H5_ATTR_UNUSED sid)
+{
+    unsigned flags;                        /* Filter flags */
+    size_t   cd_nelmts = 0;                /* Number of filter parameters */
+    unsigned cd_values[2] = {5, 6};        /* Filter parameters */
+
+    /* Get the filter's current parameters */
+    if(H5Pget_filter_by_id2(dcpl_id, MYFILTER_ID, &flags, &cd_nelmts, cd_values, 0, NULL, NULL) < 0)
+        return(FAIL);
+
+    cd_nelmts = 2;
+
+    /* Modify the filter's parameters for this dataset */
+    if(H5Pmodify_filter(dcpl_id, MYFILTER_ID, flags, cd_nelmts, cd_values) < 0)
+        return(FAIL);
+
+    return(SUCCEED);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_fcontents
+ *
+ * Purpose: generate several files to list its contents
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_fcontents(void)
+{
+    hid_t    fid;   /* file id */
+    hid_t    gid1;  /* group ID */
+    hid_t    tid;   /* datatype ID */
+    hsize_t  dims[1]={4};
+    int      buf[4]={1,2,3,4};
+    int      ret;
+
+
+    /* create a file */
+    fid  = H5Fcreate(FILE46, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+
+    write_dset(fid,1,dims,"dset",H5T_NATIVE_INT,buf);
+
+
+    /*-------------------------------------------------------------------------
+     * links
+     *-------------------------------------------------------------------------
+     */
+
+
+    /* hard link to "dset" */
+    gid1 = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "dset" */
+    gid1 = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/dset", H5L_SAME_LOC, "dset2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "g2" */
+    gid1 = H5Gopen2(fid, "/g1", H5P_DEFAULT);
+    H5Lcreate_hard(gid1, "/g2", H5L_SAME_LOC, "g1.1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(gid1);
+
+
+    /* hard link to "dset" */
+    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset3", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* hard link to "dset" */
+    ret = H5Lcreate_hard(fid, "/dset", H5L_SAME_LOC, "dset4", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* soft link to itself */
+    ret = H5Lcreate_soft("mylink", fid, "mylink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+
+    /* soft link to "dset" */
+    ret = H5Lcreate_soft("/dset", fid, "softlink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* dangling external link */
+    ret = H5Lcreate_external("fname", "oname", fid, "extlink", H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /* dangling udlink */
+    ret = H5Lcreate_ud(fid, "udlink", (H5L_type_t)MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * datatypes
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    ret = H5Tcommit2(fid, "mytype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+
+    /* no name datatype */
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    ret = H5Tcommit2(fid, "mytype2", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(ret >= 0);
+    write_dset(fid, 1, dims, "dsetmytype2", tid, buf);
+    ret = H5Ldelete(fid, "mytype2", H5P_DEFAULT);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+
+    /* create a file for the bootblock test */
+    fid  = H5Fcreate(FILE47, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_fvalues
+ *
+ * Purpose: generate a file for the fill values test
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_fvalues(void)
+{
+    /* compound datatype */
+    typedef struct c_t
+    {
+            char   a;
+            double b;
+    } c_t;
+
+
+    hid_t      fid;  /* file id */
+    hid_t      dcpl; /* dataset creation property list */
+    hid_t      sid;  /* dataspace ID */
+    hid_t      tid;  /* datatype ID */
+    hid_t      did;  /* datasetID */
+    hsize_t    dims[1]={2};
+    int        buf[2]={1,2};                   /* integer */
+    int        fillval1=-99;                   /* integer fill value */
+    c_t        buf2[2]={{1,2},{3,4}};          /* compound */
+    c_t        fillval2[1]={{1,2}};            /* compound fill value */
+    hvl_t      buf3[2];                        /* vlen */
+    hvl_t      fillval3;                       /* vlen fill value */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf4[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        ret;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE48, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /* create a space */
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /* create a dataset creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    /*-------------------------------------------------------------------------
+     * make datasets with fill value combinations
+     * H5D_FILL_TIME_IFSET
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_IFSET);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_ifset",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_FILL_TIME_NEVER
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_never",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * H5D_FILL_TIME_ALLOC
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval1);
+    HDassert(ret >= 0);
+
+    ret=make_dset(fid,"fill_time_alloc",sid,H5T_NATIVE_INT,dcpl,buf);
+    HDassert(ret >= 0);
+
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with no fill value
+     *-------------------------------------------------------------------------
+     */
+    write_dset(fid,1,dims,"no_fill",H5T_NATIVE_INT,buf);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_COMPOUND fill value
+     *-------------------------------------------------------------------------
+     */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
+    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_CHAR);
+    H5Tinsert(tid, "b", HOFFSET(c_t, b), H5T_NATIVE_DOUBLE);
+    ret = H5Pset_fill_value(dcpl, tid, &fillval2);
+    HDassert(ret >= 0);
+    ret=make_dset(fid,"fill_compound",sid,tid,dcpl,buf2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_VLEN fill value
+     *-------------------------------------------------------------------------
+     */
+    buf3[0].len = 1;
+    buf3[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf3[0].p)[0]=1;
+    buf3[1].len = 2;
+    buf3[1].p = HDmalloc(2 * sizeof(int));
+    ((int *)buf3[1].p)[0] = 2;
+    ((int *)buf3[1].p)[1] = 3;
+
+    tid = H5Tvlen_create(H5T_NATIVE_INT);
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    fillval3.p=NULL; fillval3.len=0;
+    ret = H5Pset_fill_value(dcpl, tid, &fillval3);
+    HDassert(ret >= 0);
+
+    did = H5Dcreate2(fid, "fill_vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
+    HDassert(ret >= 0);
+    ret = H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf3);
+    HDassert(ret >= 0);
+    ret = H5Dclose(did);
+    ret = H5Tclose(tid);
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * dataset with a H5T_ARRAY fill value
+     *-------------------------------------------------------------------------
+     */
+    tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray);
+    write_dset(fid, 1, dims, "fill_array", tid, buf4);
+    ret = H5Tclose(tid);
+
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_string
+ *
+ * Purpose: make several datasets for the string with escape/not escape test
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_string(void)
+{
+    /* compound datatype */
+    typedef struct c_t
+    {
+            int    a;
+            char   str[255];
+    } c_t;
+
+    hid_t    fid;      /* file id */
+    hid_t    sid;      /* dataspace ID */
+    hid_t    tid;      /* datatype ID */
+    hid_t    str_tid;  /* datatype ID */
+    hid_t    did;      /* dataset ID */
+    char     buf1[]={"quote \"  backspace\b form feed\f new line\n tab\t new line\n carriage return\r"};
+    const char *buf2[SPACE1_DIM1]= {
+            "Four score and seven\n years ago our forefathers brought forth on this continent a new nation,",
+            "conceived in liberty\n and dedicated to the proposition that all men are created equal.",
+            "Now we are engaged\n in a great civil war,",
+            "testing whether that\n nation or any nation so conceived and so dedicated can long endure."
+    };
+    c_t      buf3 = {24, "Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
+    char     buf4[] = {"Four score and seven\n years ago our forefathers brought forth on this continent a new nation"};
+    hsize_t  dims1[]  = {1};
+    hsize_t        dims2[]  = {SPACE1_DIM1};
+    hsize_t        dims4[1];
+    int      ret;
+
+    dims4[0] = sizeof(buf4);
+
+    /* create a file */
+    fid  = H5Fcreate(FILE49, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /*-------------------------------------------------------------------------
+     * str1
+     *-------------------------------------------------------------------------
+     */
+
+    tid=H5Tcopy(H5T_C_S1);
+    ret = H5Tset_size(tid, sizeof(buf1));
+    HDassert(ret >= 0);
+    write_dset(fid,1,dims1,"str1",tid,buf1);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str2
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims2, NULL);
+    tid = H5Tcopy(H5T_C_S1);
+    ret = H5Tset_size(tid, H5T_VARIABLE);
+    HDassert(ret >= 0);
+    did = H5Dcreate2(fid, "str2", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    ret = H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Dclose(did);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str3
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+    tid = H5Tcreate (H5T_COMPOUND, sizeof(c_t));
+    str_tid = H5Tcopy( H5T_C_S1 );
+    H5Tset_size( str_tid, 255 );
+    H5Tinsert(tid, "a", HOFFSET(c_t, a), H5T_NATIVE_INT);
+    H5Tinsert(tid, "str", HOFFSET(c_t, str), str_tid );
+    ret=make_dset(fid,"str3",sid,tid,H5P_DEFAULT,&buf3);
+    HDassert(ret >= 0);
+    ret = H5Tclose(tid);
+    HDassert(ret >= 0);
+    ret = H5Tclose(str_tid);
+    HDassert(ret >= 0);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * str4
+     *-------------------------------------------------------------------------
+     */
+    sid = H5Screate_simple(SPACE1_RANK, dims4, NULL);
+    ret=make_dset(fid,"str4",sid,H5T_NATIVE_CHAR,H5P_DEFAULT,buf4);
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_aindices
+ *
+ * Purpose: make several datasets for the array indices and subsetting tests
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_aindices(void)
+{
+    hid_t    fid;     /* file id */
+    hid_t    gid[6];  /* group ids */
+    hsize_t  dims1[1]  = {100};
+    hsize_t  dims2[2]  = {10,10};
+    hsize_t  dims3[3]  = {2,10,10};
+    hsize_t  dims4[4]  = {2,2,10,10};
+    int      buf1[100];
+    int      buf2[10][10];
+    int      buf3[2][10][10];
+    int      buf4[2][2][10][10];
+    int      i, j, k, l, n, ret;
+
+    for(i = n = 0; i < 100; i++)
+        buf1[i] = n++;
+
+    for(i = n = 0; i < 10; i++)
+        for(j = 0; j < 10; j++)
+            buf2[i][j] = n++;
+    for(i = n = 0; i < 2; i++)
+        for(j = 0; j < 10; j++)
+            for(k = 0; k < 10; k++)
+                buf3[i][j][k] = n++;
+    for(i = n = 0; i < 2; i++)
+        for(j = 0; j < 2; j++)
+            for(k = 0; k < 10; k++)
+                for(l = 0; l < 10; l++)
+                    buf4[i][j][k][l] = n++;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE50, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /*-------------------------------------------------------------------------
+     * root datasets
+     *-------------------------------------------------------------------------
+     */
+    write_dset(fid,1,dims1,"1d",H5T_NATIVE_INT,buf1);
+    write_dset(fid,2,dims2,"2d",H5T_NATIVE_INT,buf2);
+    write_dset(fid,3,dims3,"3d",H5T_NATIVE_INT,buf3);
+    write_dset(fid,4,dims4,"4d",H5T_NATIVE_INT,buf4);
+
+    /*-------------------------------------------------------------------------
+     * test with group indentation
+     *-------------------------------------------------------------------------
+     */
+    gid[0] = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[1] = H5Gcreate2(fid, "g1/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[2] = H5Gcreate2(fid, "g1/g2/g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[3] = H5Gcreate2(fid, "g1/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[4] = H5Gcreate2(fid, "g1/g2/g3/g4/g5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    gid[5] = H5Gcreate2(fid, "g1/g2/g3/g4/g5/g6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    write_dset(gid[5],1,dims1,"1d",H5T_NATIVE_INT,buf1);
+    write_dset(gid[5],2,dims2,"2d",H5T_NATIVE_INT,buf2);
+    write_dset(gid[5],3,dims3,"3d",H5T_NATIVE_INT,buf3);
+    write_dset(gid[5],4,dims4,"4d",H5T_NATIVE_INT,buf4);
+    for(i = 0; i < 6; i++)
+        H5Gclose(gid[i]);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_longlinks
+ *
+ * Purpose: make file with very long names for objects
+ *
+ *-------------------------------------------------------------------------
+ */
+static void gent_longlinks(void)
+{
+    hid_t       fid = (-1);     /* File ID */
+    hid_t       gid = (-1);     /* Group ID */
+    hid_t       gid2 = (-1);    /* Datatype ID */
+    char               *objname = NULL; /* Name of object [Long] */
+    size_t              u;              /* Local index variable */
+
+    /* Create files */
+    fid = H5Fcreate(FILE51, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create group with short name in file (used as target for hard links) */
+    gid = H5Gcreate2(fid, "grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid >= 0);
+
+    /* Construct very long file name */
+    objname = (char*) HDmalloc((size_t)(F51_MAX_NAME_LEN + 1));
+    HDassert(objname);
+    for(u = 0; u < F51_MAX_NAME_LEN; u++)
+        objname[u] = 'a';
+    objname[F51_MAX_NAME_LEN] = '\0';
+
+    /* Create hard link to existing object */
+    HDassert(H5Lcreate_hard(fid, "grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
+
+    /* Create soft link to existing object */
+    objname[0] = 'b';
+    HDassert(H5Lcreate_soft("grp1", fid, objname, H5P_DEFAULT, H5P_DEFAULT) >= 0);
+
+    /* Create group with long name in existing group */
+    gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(gid2 >= 0);
+
+    /* Close objects */
+    HDassert(H5Gclose(gid2) >= 0);
+    HDassert(H5Gclose(gid) >= 0);
+    HDassert(H5Fclose(fid) >= 0);
+
+    /* Release memory */
+    HDfree(objname);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_ldouble
+ *
+ * Purpose: make file with a long double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static int gent_ldouble(void)
+{
+    hid_t       fid;
+    hid_t       did;
+    hid_t       tid;
+    hid_t       sid;
+    hsize_t     dims[1] = {3};
+    long double buf[3] = {1,2,3};
+
+    if((fid = H5Fcreate(FILE52, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto error;
+
+    if((tid = H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0)
+        goto error;
+
+    if(H5Tget_size(tid) == 0)
+        goto error;
+
+    if((did = H5Dcreate2(fid, "dset", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto error;
+
+    if(H5Sclose(sid) < 0)
+        goto error;
+    if(H5Tclose(tid) < 0)
+        goto error;
+    if(H5Dclose(did) < 0)
+        goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+
+    return 0;
+
+    error:
+    printf("error !\n");
+    return -1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_binary
+ *
+ * Purpose:     Generate a file to be used in the binary output test
+ *              Contains:
+ *              1) an integer dataset
+ *              2) a float dataset
+ *              3) a double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_binary(void)
+{
+    hid_t    fid, sid, did, aid;
+    hsize_t  dims[1]  = {6};
+    int      ibuf[6]  = {1,2,3,4,5,6};
+    float    fbuf[6]  = {1,2,3,4,5,6};
+    double   dbuf[6]  = {1,2,3,4,5,6};
+
+    fid = H5Fcreate(FILE55, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid = H5Screate_simple(1, dims, NULL);
+
+
+    /*-------------------------------------------------------------------------
+     * integer
+     *-------------------------------------------------------------------------
+     */
+
+    did = H5Dcreate2(fid, "integer", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf);
+    H5Dclose(did);
+
+    /*-------------------------------------------------------------------------
+     * float
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
+    H5Dclose(did);
+
+    /*-------------------------------------------------------------------------
+     * double
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+    /* create an attribute */
+    aid = H5Acreate2(did, "attr", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT);
+    H5Aclose(aid);
+    H5Dclose(did);
+
+
+    /* close */
+    H5Sclose(sid);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_bigdims
+ *
+ * Purpose: generate a dataset with dimensions greater than 4GB
+ *          and write one hyperslab on the boundary
+ *
+ *-------------------------------------------------------------------------
+ */
+#define GB4LL    ((unsigned long long) 4*1024*1024*1024)
+#define DIM_4GB  (GB4LL + 10)
+
+static void
+gent_bigdims(void)
+{
+    hid_t   fid = -1;
+    hid_t   did = -1;
+    hid_t   f_sid = -1;
+    hid_t   m_sid = -1;
+    hid_t   tid = -1;
+    hid_t   dcpl = -1;
+    hsize_t dims[1]={DIM_4GB};                 /* dataset dimensions */
+    hsize_t chunk_dims[1]={1024};              /* chunk dimensions */
+    hsize_t hs_start[1];
+    hsize_t hs_size[1];                        /* hyperslab dimensions */
+    size_t  size;
+    char    fillvalue=0;
+    char    *buf=NULL;
+    hsize_t i;
+    char    c;
+    size_t  nelmts;
+    int     ret;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE56, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* create dataset */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_SCHAR, &fillvalue) < 0)
+        goto out;
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        goto out;
+    if((f_sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if((did = H5Dcreate2(fid, "dset4gb", H5T_NATIVE_SCHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if((tid = H5Dget_type(did)) < 0)
+        goto out;
+    if((size = H5Tget_size(tid)) <= 0)
+        goto out;
+
+    /* select an hyperslab */
+    nelmts = 20;
+    hs_start[0] = GB4LL - 10;
+    hs_size[0]  = nelmts;
+
+    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
+        goto out;
+
+    buf=(char *) HDmalloc((unsigned)(nelmts*size));
+
+    for(i=0, c=0; i<nelmts; i++, c++)
+    {
+        buf[i] = c;
+    }
+
+    if(H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size,NULL) < 0)
+        goto out;
+    if(H5Dwrite (did,H5T_NATIVE_SCHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
+        goto out;
+
+
+    HDfree(buf);
+    buf=NULL;
+
+    /* close */
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+    if(H5Sclose(f_sid) < 0)
+        goto out;
+    f_sid = -1;
+    if(H5Sclose(m_sid) < 0)
+        goto out;
+    m_sid = -1;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    dcpl = -1;
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(f_sid);
+        H5Sclose(m_sid);
+        H5Tclose(tid);
+        H5Dclose(did);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: gent_hyperslab
+ *
+ * Purpose: make a dataset for hyperslab read
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_hyperslab(void)
+{
+    hid_t    fid;     /* file id */
+    hsize_t  dims[2]  = {32,4097}; /* big enough data size to force a second stripmine read */
+    double   *buf;
+    int      i, ret;
+
+    buf = (double*) HDmalloc(32 * 4097 * sizeof(double) );
+    for(i = 0; i < 32 * 4097; i++)
+        buf[i] = 1;
+
+    /* create a file */
+    fid  = H5Fcreate(FILE57, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    write_dset(fid,2,dims,"stripmine",H5T_NATIVE_DOUBLE,buf);
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+
+    HDfree(buf);
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_group_creation_order
+ *
+ * Purpose: generate a file with several groups with creation order set and not
+ *  set tru its hierarchy
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_group_creation_order(void)
+{
+    hid_t    fid = -1;      /* file ID */
+    hid_t    gid = -1;      /* group ID */
+    hid_t    gcpl_id = -1;  /* group creation property list ID */
+    hid_t    fcpl_id = -1;  /* file creation property list ID (to set root group order) */
+
+    if((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto out;
+
+    if(H5Pset_link_creation_order(fcpl_id, H5P_CRT_ORDER_TRACKED ) < 0)
+        goto out;
+
+    if((fid = H5Fcreate(FILE58, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+
+    /* create group creation property list */
+    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+     * create a group "2"
+     *-------------------------------------------------------------------------
+     */
+
+
+    if((gid = H5Gcreate2(fid, "2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "2/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "2/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+
+    /*-------------------------------------------------------------------------
+     * create a group "1" with H5P_CRT_ORDER_TRACKED set
+     *-------------------------------------------------------------------------
+     */
+    if(H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+
+    if((gid = H5Gcreate2(fid, "1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/c", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/a/a2", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a/a1", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    if((gid = H5Gcreate2(fid, "1/a/a2/a22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+    if((gid = H5Gcreate2(fid, "1/a/a2/a21", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+
+    if(H5Pclose(gcpl_id) < 0)
+        goto out;
+    gcpl_id = -1;
+    if(H5Pclose(fcpl_id) < 0)
+        goto out;
+    fcpl_id = -1;
+    if(H5Fclose(fid) < 0)
+        goto out;
+    fid = -1;
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Gclose(gid);
+        H5Pclose(gcpl_id);
+        H5Pclose(fcpl_id);
+        H5Fclose(fid);
+
+    } H5E_END_TRY;
+    return;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gent_attr_creation_order
+ *
+ * Purpose: generate a file with several objects with attributes with creation
+ *  order set and not set
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_creation_order(void)
+{
+    hid_t    fid = -1;      /* file id */
+    hid_t    gid = -1;      /* group id */
+    hid_t    did = -1;      /* dataset id */
+    hid_t    sid = -1;      /* space id */
+    hid_t    aid = -1;      /* attribute id */
+    hid_t    tid = -1;      /* datatype id */
+    hid_t    gcpl_id = -1;  /* group creation property list ID */
+    hid_t    dcpl_id = -1;  /* dataset creation property list ID */
+    hid_t    tcpl_id = -1;  /* datatype creation property list ID */
+    int      i;
+    const char *attr_name[3] = {"c", "b", "a" };
+
+    if((fid = H5Fcreate(FILE59, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* create group creation property list */
+    if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        goto out;
+
+    /* create dataset creation property list */
+    if((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+
+    /* create dataset creation property list */
+    if((tcpl_id = H5Pcreate(H5P_DATATYPE_CREATE)) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on dataset property list */
+    if(H5Pset_attr_creation_order(dcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on group property list */
+    if(H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* enable attribute creation order tracking on datatype property list */
+    if(H5Pset_attr_creation_order(tcpl_id, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+
+    /* create a dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+     * create a dataset with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    /* create a dataset */
+    if((did = H5Dcreate2(fid, "dt", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+
+    /*-------------------------------------------------------------------------
+     * create a dataset without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    /* create a dataset */
+    if((did = H5Dcreate2(fid, "d", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(did, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Dclose(did) < 0)
+        goto out;
+    did = -1;
+
+
+
+    /*-------------------------------------------------------------------------
+     * create a group with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((gid = H5Gcreate2(fid, "gt", H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a group without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((gid = H5Gcreate2(fid, "g", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a named datatype with creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto out;
+
+    if((H5Tcommit2(fid, "tt", tid, H5P_DEFAULT, tcpl_id, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+     * create a named datatype without creation order tracked for attributes and atributes in it
+     *-------------------------------------------------------------------------
+     */
+
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto out;
+
+    if((H5Tcommit2(fid, "t", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(tid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+     * add some attributes to the root group
+     *-------------------------------------------------------------------------
+     */
+    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* add attributes */
+    for(i = 0; i < 3; i++)
+    {
+        if((aid = H5Acreate2(gid, attr_name[i], H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+
+        /* close attribute */
+        if(H5Aclose(aid) < 0)
+            goto out;
+        aid = -1;
+    } /* end for */
+
+    if(H5Gclose(gid) < 0)
+        goto out;
+    gid = -1;
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    sid = -1;
+    if(H5Pclose(dcpl_id) < 0)
+        goto out;
+    dcpl_id = -1;
+    if(H5Pclose(gcpl_id) < 0)
+        goto out;
+    gcpl_id = -1;
+    if(H5Pclose(tcpl_id) < 0)
+        goto out;
+    tcpl_id = -1;
+    if(H5Fclose(fid) < 0)
+        goto out;
+    fid = -1;
+
+
+
+    return;
+
+    out:
+    printf("Error.....\n");
+    H5E_BEGIN_TRY {
+        H5Gclose(gid);
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Pclose(gcpl_id);
+        H5Pclose(dcpl_id);
+        H5Pclose(tcpl_id);
+        H5Fclose(fid);
+
+    } H5E_END_TRY;
+    return;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_fpformat
+ *
+ * Purpose:     Generate a file to be used in the floating point format test
+ *              Contains:
+ *              1) a float dataset
+ *              2) a double dataset
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_fpformat(void)
+{
+    hid_t    fid, sid, did;
+    hsize_t  dims[1]  = {6};
+    double   dbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
+    float    fbuf[6]  = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
+
+    fid = H5Fcreate(FILE60, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    sid = H5Screate_simple(1, dims, NULL);
+
+    /*-------------------------------------------------------------------------
+     * double
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "double", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+    H5Dclose(did);
+
+
+    /*-------------------------------------------------------------------------
+     * float
+     *-------------------------------------------------------------------------
+     */
+    did = H5Dcreate2(fid, "float", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, fbuf);
+    H5Dclose(did);
+
+
+    /* close */
+    H5Sclose(sid);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_extlinks
+ *
+ * Purpose:     Generate 3 files to be used in the external links test
+ *   External links point from one HDF5 file to an object (Group, Dataset,
+ *    or committed Datatype) in another file.  Try to create cycles.
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_extlinks(void)
+{
+    hid_t    source_fid, target_fid, far_fid, sid, did, gid, gid2, tid;
+    hsize_t  dims[1]  = {6};
+    int      buf[6]  = {1, 2, 3, 4, 5, 6};
+
+    /* create two files, a source and a target */
+    source_fid = H5Fcreate(FILE61, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    target_fid = H5Fcreate(FILE62, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    far_fid = H5Fcreate(FILE63, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+
+    /*-------------------------------------------------------------------------
+     * create Groups, a Dataset, a committed Datatype, external links, and a
+     * cycle in the target
+     *-------------------------------------------------------------------------
+     */
+
+    gid = H5Gcreate2(target_fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Gclose(H5Gcreate2(target_fid, "empty_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT));
+    sid = H5Screate_simple(1, dims, NULL);
+    did = H5Dcreate2(gid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    H5Lcreate_external(FILE61, "/", gid, "elink_t1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE61, "/ext_link4", gid, "elink_t2", H5P_DEFAULT, H5P_DEFAULT);
+
+    gid2 = H5Gcreate2(gid, "subgroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_hard(target_fid, "/group", gid2, "link_to_group", H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Dclose(did);
+    H5Sclose(sid);
+    H5Gclose(gid2);
+    H5Gclose(gid);
+
+
+    sid = H5Screate_simple(1, dims, NULL);
+    did = H5Dcreate2(target_fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    H5Dclose(did);
+    H5Sclose(sid);
+
+    tid = H5Tcopy(H5T_NATIVE_INT);
+    H5Tcommit2(target_fid, "type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    H5Tclose(tid);
+
+    /*-------------------------------------------------------------------------
+     * create external links in the source file pointing to the target objects
+     *-------------------------------------------------------------------------
+     */
+
+    H5Lcreate_external(FILE62, "group", source_fid, "ext_link1", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "dset", source_fid, "ext_link2", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "type", source_fid, "ext_link3", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "group/elink_t2", source_fid, "ext_link4", H5P_DEFAULT, H5P_DEFAULT);
+    H5Lcreate_external(FILE62, "empty_group", source_fid, "ext_link5", H5P_DEFAULT, H5P_DEFAULT);
+    /* external link to soft link which linked to a dataset */
+    H5Lcreate_external(FILE4_1, "/soft_dset1", source_fid, "ext2soft_link1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* external link to dangle soft link  */
+    H5Lcreate_external(FILE4_1, "/soft_dangle", source_fid, "ext2softdangle_link1", H5P_DEFAULT, H5P_DEFAULT);
+
+    /*-------------------------------------------------------------------------
+     * create external link in the "far" file pointing to the source file
+     *-------------------------------------------------------------------------
+     */
+    H5Lcreate_external(FILE61, "/", far_fid, "src_file", H5P_DEFAULT, H5P_DEFAULT);
+
+    /* close */
+    H5Fclose(source_fid);
+    H5Fclose(target_fid);
+    H5Fclose(far_fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_fs_strategy_threshold
+ *
+ * Purpose:     Generate a file with non-default file space strategy,
+ *    		non-default free-space section threshold,
+ *		non-default file space page size.
+ *-------------------------------------------------------------------------
+ */
+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_strategy(fcpl, STRATEGY, TRUE, (hsize_t)THRESHOLD10);
+    H5Pset_file_space_page_size(fcpl, (hsize_t)FSPACE_PAGE_SIZE);
+
+    /* 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.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ * Created:  Albert Cheng, 2010/5/10.
+ * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_packedbits(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE66, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j - 1] << 1);
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++)
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++)
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++)
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++)
+            dset32[i][j] = dset32[i][j-1] << 1;
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++)
+            dset64[i][j] = dset64[i][j-1] << 1;
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_attr_packedbits
+ *
+ * Purpose:     Generate a file to be used in the h5dump packed bits tests.
+ *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_intsize(void)
+{
+    hid_t fid, attr, space, root;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE69, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Attribute of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT8, dsetu8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT16, dsetu16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT32, dsetu32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_UINT64, dsetu64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT8, dset8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT16, dset16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT32, dset32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Awrite(attr, H5T_NATIVE_INT64, dset64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    attr = H5Acreate2(root, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, dsetdbl);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_charsets
+ *
+ * Purpose:     Generate a file to be used in the character set test
+ *              Contains:
+ *              1) a ascii datatype
+ *              2) a utf8 datatype
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_charsets(void)
+{
+    hid_t fid, did, sid;
+    herr_t status;
+    hsize_t dim[] = {1}; /* Dataspace dimensions */
+    typedef struct CharSetInfo {
+            const char *ascii_p_;
+            const char *utf8_p_;
+    } CharSetInfo;
+
+    hid_t charset_dtid = H5Tcreate( H5T_COMPOUND, sizeof( CharSetInfo ) );
+    hid_t ascii_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
+    hid_t utf8_dtid = H5Tcreate( H5T_STRING, H5T_VARIABLE );
+    const char * writeData[] = { "ascii", "utf8", };
+
+    sid = H5Screate_simple( 1, dim, NULL );
+    fid = H5Fcreate( FILE68, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
+    status = H5Tset_cset( ascii_dtid, H5T_CSET_ASCII );
+    HDassert(status >= 0);
+    H5Tinsert( charset_dtid, "ascii", HOFFSET(CharSetInfo, ascii_p_ ), ascii_dtid );
+
+    status = H5Tset_cset( utf8_dtid, H5T_CSET_UTF8 );
+    HDassert(status >= 0);
+    H5Tinsert( charset_dtid, "utf8", HOFFSET( CharSetInfo, utf8_p_ ), utf8_dtid );
+
+    did = H5Dcreate2( fid, "CharSets", charset_dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
+
+    status = H5Dwrite( did, charset_dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, writeData );
+    HDassert(status >= 0);
+
+    H5Tclose( charset_dtid );
+    H5Tclose( ascii_dtid );
+    H5Tclose( utf8_dtid );
+    H5Sclose( sid );
+    H5Dclose( did );
+    H5Fclose( fid );
+}
+
+static void gent_compound_intsizes(void) {
+    hid_t fid, dataset, space;
+    hsize_t dims[2];
+    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
+            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
+            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
+            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
+            int8_t  dset8[F70_XDIM][F70_YDIM8];
+            int16_t dset16[F70_XDIM][F70_YDIM16];
+            int32_t dset32[F70_XDIM][F70_YDIM32];
+            int64_t dset64[F70_XDIM][F70_YDIM64];
+            double  dsetdbl[F70_XDIM][F70_YDIM8];
+    } Array1Struct;
+    Array1Struct *Array1;
+
+    hid_t Array1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n, o; /* Array init loop vars     */
+
+    /* Allocate buffer */
+    Array1 = (Array1Struct *)HDmalloc(sizeof(Array1Struct) * F70_LENGTH);
+    HDassert(Array1);
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F70_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu8[n][0] = valu8bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dsetu8[n][o] = (uint8_t)(Array1[m].dsetu8[n][o-1] << 1);
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu16[n][0] = valu16bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dsetu16[n][o] = (uint16_t)(Array1[m].dsetu16[n][o-1] << 1);
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu32[n][0] = valu32bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu64[n][0] = valu64bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset8[n][0] = val8bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dset8[n][o] = (int8_t)(Array1[m].dset8[n][o-1] << 1);
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset16[n][0] = val16bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dset16[n][o] = (int16_t)(Array1[m].dset16[n][o-1] << 1);
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset32[n][0] = val32bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset64[n][0] = val64bits;
+            for(o = 1; o < (int)dims[1]; o++)
+                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            for(o = 0; o < (int)dims[1]; o++)
+                Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F70_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE70, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F70_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Array1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Array1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+
+    HDfree(Array1);
+}
+
+static void gent_compound_attr_intsizes(void) {
+    hid_t fid, attr, space, root;
+    hsize_t dims[2];
+    hsize_t    array_dim8[]={F70_XDIM,F70_YDIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F70_XDIM,F70_YDIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F70_XDIM,F70_YDIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F70_XDIM,F70_YDIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    /* Structure and array for compound types                             */
+    typedef struct Array1Struct {
+            uint8_t  dsetu8[F70_XDIM][F70_YDIM8];
+            uint16_t dsetu16[F70_XDIM][F70_YDIM16];
+            uint32_t dsetu32[F70_XDIM][F70_YDIM32];
+            uint64_t dsetu64[F70_XDIM][F70_YDIM64];
+            int8_t  dset8[F70_XDIM][F70_YDIM8];
+            int16_t dset16[F70_XDIM][F70_YDIM16];
+            int32_t dset32[F70_XDIM][F70_YDIM32];
+            int64_t dset64[F70_XDIM][F70_YDIM64];
+            double  dsetdbl[F70_XDIM][F70_YDIM8];
+    } Array1Struct;
+    Array1Struct Array1[F70_LENGTH];
+
+    hid_t Array1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F70_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n, o; /* Array init loop vars     */
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F70_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu8[n][0] = valu8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu8[n][o] = (uint8_t)(Array1[m].dsetu8[n][o-1] << 1);
+            }
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu16[n][0] = valu16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu16[n][o] = (uint16_t)(Array1[m].dsetu16[n][o-1] << 1);
+            }
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu32[n][0] = valu32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu32[n][o] = Array1[m].dsetu32[n][o-1] << 1;
+            }
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dsetu64[n][0] = valu64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dsetu64[n][o] = Array1[m].dsetu64[n][o-1] << 1;
+            }
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset8[n][0] = val8bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset8[n][o] = (int8_t)(Array1[m].dset8[n][o-1] << 1);
+            }
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset16[n][0] = val16bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset16[n][o] = (int16_t)(Array1[m].dset16[n][o-1] << 1);
+            }
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset32[n][0] = val32bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset32[n][o] = Array1[m].dset32[n][o-1] << 1;
+            }
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Array1[m].dset64[n][0] = val64bits;
+            for(o = 1; o < (int)dims[1]; o++) {
+                Array1[m].dset64[n][o] = Array1[m].dset64[n][o-1] << 1;
+            }
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F70_XDIM; dims[1] = F70_YDIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            for(o = 0; o < (int)dims[1]; o++)
+                Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F70_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F70_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F70_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F70_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F70_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F70_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F70_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE71, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Array1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Array1Struct));
+    HDassert(Array1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Array1Structid, F70_DATASETU08, HOFFSET(Array1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU16, HOFFSET(Array1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU32, HOFFSET(Array1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETU64, HOFFSET(Array1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS08, HOFFSET(Array1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS16, HOFFSET(Array1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS32, HOFFSET(Array1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DATASETS64, HOFFSET(Array1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Array1Structid, F70_DUMMYDBL, HOFFSET(Array1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Create the Attribute  */
+    attr = H5Acreate2(root, F71_DATASETNAME, Array1Structid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the attribute                                      */
+    status = H5Awrite(attr, Array1Structid, Array1);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Array1Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Aclose(attr);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+}
+
+static void gent_nested_compound_dt(void) {       /* test nested data type */
+    hid_t fid, group, dataset, space, type, create_plist, type1, type2;
+    hid_t array_dt, enum_dt;
+    enumtype val;
+
+    typedef struct {
+            int a;
+            float b;
+    } dset1_t;
+    dset1_t dset1[10];
+
+    typedef struct {
+            int a;
+            float b;
+            enumtype c;
+    } dset2_t;
+    dset2_t dset2[10];
+
+    typedef struct {
+            int a[5];
+            float b[5][6];
+            dset1_t c;
+    } dset3_t;
+    dset3_t dset3[10];
+
+    enumtype dset4[] = {RED, GREEN, BLUE, GREEN, WHITE, BLUE};
+
+    int i, j, k;
+    unsigned ndims;
+    hsize_t dim[2];
+
+    hsize_t sdim, maxdim;
+
+    sdim = 10;
+    for(i = 0; i < (int)sdim; i++) {
+        dset1[i].a = i;
+        dset1[i].b = (float)(i*i);
+
+        dset2[i].a = i;
+        dset2[i].b = (float)((float)i + (float)i * 0.1F);
+        dset2[i].c = GREEN;
+
+        for(j = 0; j < 5; j++) {
+            dset3[i].a[j] = i * j;
+            for(k = 0; k < 6; k++) {
+                dset3[i].b[j][k] = (float)((float)i * (float)j * (float)k * 1.0F);
+            }
+        }
+        dset3[i].c.a = i;
+        dset3[i].c.b = (float)((float)i * 1.0F);
+    }
+
+    fid = H5Fcreate(FILE72, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    create_plist = H5Pcreate(H5P_DATASET_CREATE);
+
+    sdim = 2;
+    H5Pset_chunk(create_plist, 1, &sdim);
+
+
+    sdim = 6;
+    maxdim = H5S_UNLIMITED;
+
+    space = H5Screate_simple(1, &sdim, &maxdim);
+
+    type = H5Tcreate (H5T_COMPOUND, sizeof(dset1[0]));
+    H5Tinsert(type, "a_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
+    H5Tinsert(type, "b_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
+
+    dataset = H5Dcreate2(fid, "/dset1", type, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type);
+    H5Dclose(dataset);
+
+    /* Create the shared enumerated datatype. */
+    enum_dt = H5Tenum_create (H5T_NATIVE_INT);
+    val = (enumtype) RED;
+    H5Tenum_insert (enum_dt, "Red", &val);
+    val = (enumtype) GREEN;
+    H5Tenum_insert (enum_dt, "Green", &val);
+    val = (enumtype) BLUE;
+    H5Tenum_insert (enum_dt, "Blue", &val);
+    val = (enumtype) WHITE;
+    H5Tenum_insert (enum_dt, "White", &val);
+    val = (enumtype) BLACK;
+    H5Tenum_insert (enum_dt, "Black", &val);
+    H5Tcommit2(fid, "enumtype", enum_dt,  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset2[0]));
+
+    H5Tinsert(type2, "a_name", HOFFSET(dset2_t, a), H5T_NATIVE_INT);
+    H5Tinsert(type2, "b_name", HOFFSET(dset2_t, b), H5T_NATIVE_FLOAT);
+    H5Tinsert(type2, "c_name", HOFFSET(dset2_t, c), enum_dt);
+
+    dataset = H5Dcreate2(fid, "/dset2", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+
+    H5Tclose(type2);
+
+    dataset = H5Dcreate2(fid, "/dset4", enum_dt, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    H5Dwrite(dataset, enum_dt, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset4);
+
+    H5Tclose(enum_dt);
+    H5Dclose(dataset);
+
+    /* shared data type 1 */
+    type1 = H5Tcreate(H5T_COMPOUND, sizeof(dset1_t));
+    H5Tinsert(type1, "int_name", HOFFSET(dset1_t, a), H5T_STD_I32LE);
+    H5Tinsert(type1, "float_name", HOFFSET(dset1_t, b), H5T_IEEE_F32LE);
+    H5Tcommit2(fid, "type1", type1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    group = H5Gcreate2(fid, "/group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    type2 = H5Tcreate (H5T_COMPOUND, sizeof(dset3_t));
+
+    ndims = 1; dim[0] = 5;
+    array_dt = H5Tarray_create2(H5T_STD_I32LE, ndims, dim);
+    H5Tinsert(type2, "int_name", HOFFSET(dset3_t, a), array_dt);
+    H5Tclose(array_dt);
+
+    ndims = 2; dim[0] = 5; dim[1] = 6;
+    array_dt = H5Tarray_create2(H5T_IEEE_F32LE, ndims, dim);
+    H5Tinsert(type2, "float_name", HOFFSET(dset3_t, b), array_dt);
+    H5Tclose(array_dt);
+
+    H5Tinsert (type2, "cmpd_name", HOFFSET (dset3_t, c), type1);
+
+    dataset = H5Dcreate2(group, "dset3", type2, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+
+    H5Dwrite(dataset, type2, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset3);
+
+    dataset = H5Dcreate2(fid, "/dset5", type1, space, H5P_DEFAULT, create_plist, H5P_DEFAULT);
+    H5Dwrite(dataset, type1, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+
+    H5Tclose(type1);
+    H5Tclose(type2);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Gclose(group);
+
+    H5Pclose(create_plist);
+
+    H5Fclose(fid);
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump scalar tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intscalars(void)
+{
+    hid_t fid, dataset, space, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE73, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_attr_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump attribute scalar tests.
+ *   Four attributes of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *   Use file to test Signed/Unsigned datatypes and keep in sync with gent_packedbits()
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_attr_intscalars(void)
+{
+    hid_t fid, attr, space, root, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE74, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* Attribute of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Awrite(attr, tid, dsetu8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Awrite(attr, tid, dsetu16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dsetu32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dsetu64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Awrite(attr, tid, dset8);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Awrite(attr, tid, dset16);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dset32);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Attribute of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Awrite(attr, tid, dset64);
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    attr = H5Acreate2(root, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Awrite(attr, tid, dsetdbl);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_string_scalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump string scalar tests.
+ *   A dataset of string types are created.
+ *   An attribute of string types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_string_scalars(void)
+{
+    hid_t fid, attr, dataset, space, tid, root;
+    hsize_t dims[2];
+    char  string[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE75, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    root = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+    /* string scalar */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tcopy(H5T_C_S1);
+    H5Tset_size(tid, F73_XDIM * F73_YDIM8);
+
+    memset(string, ' ', F73_XDIM * F73_YDIM8);
+    for(i = 0; i < dims[0]; i++) {
+        string[i][0] = (char)('A' + i);
+        for(j = 1; j < dims[1]; j++) {
+            string[i][j] = (char)(string[i][j-1] + 1);
+        }
+    }
+    string[dims[0]-1][dims[1]-1] = 0;
+
+    /* Dataset of string scalar */
+    dataset = H5Dcreate2(fid, "the_str", tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, string);
+    H5Dclose(dataset);
+
+    /* attribute of string scalar */
+    attr = H5Acreate2(root, "attr_str", tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, string);
+
+    H5Sclose(space);
+    H5Aclose(attr);
+
+    H5Gclose(root);
+    H5Fclose(fid);
+}
+
+static void gent_compound_int_array(void) {
+    hid_t fid, dataset, space;
+    hsize_t dims[1];
+    uint8_t  valu8bits;
+    uint16_t valu16bits;
+    uint32_t valu32bits;
+    uint64_t valu64bits;
+    int8_t  val8bits;
+    int16_t val16bits;
+    int32_t val32bits;
+    int64_t val64bits;
+    hsize_t    array_dim8[]={F76_DIM8}; /* Array dimensions         */
+    hsize_t    array_dim16[]={F76_DIM16}; /* Array dimensions         */
+    hsize_t    array_dim32[]={F76_DIM32}; /* Array dimensions         */
+    hsize_t    array_dim64[]={F76_DIM64}; /* Array dimensions         */
+    hid_t      arrayu8_tid;                 /* Array datatype handle    */
+    hid_t      arrayu16_tid;                /* Array datatype handle    */
+    hid_t      arrayu32_tid;                /* Array datatype handle    */
+    hid_t      arrayu64_tid;                /* Array datatype handle    */
+    hid_t      array8_tid;                 /* Array datatype handle    */
+    hid_t      array16_tid;                /* Array datatype handle    */
+    hid_t      array32_tid;                /* Array datatype handle    */
+    hid_t      array64_tid;                /* Array datatype handle    */
+    hid_t      arraydbl_tid;                /* Array datatype handle    */
+    /* Structure and array for compound types                             */
+    typedef struct Cmpd1Struct {
+            uint8_t  dsetu8[F76_DIM8];
+            uint16_t dsetu16[F76_DIM16];
+            uint32_t dsetu32[F76_DIM32];
+            uint64_t dsetu64[F76_DIM64];
+            int8_t  dset8[F76_DIM8];
+            int16_t dset16[F76_DIM16];
+            int32_t dset32[F76_DIM32];
+            int64_t dset64[F76_DIM64];
+            double  dsetdbl[F76_DIM8];
+    } Cmpd1Struct;
+    Cmpd1Struct *Cmpd1;
+
+    hid_t Cmpd1Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F76_LENGTH }; /* Dataspace dimensions     */
+
+    int m, n; /* Array init loop vars     */
+
+    /* Allocate buffer */
+    Cmpd1 = (Cmpd1Struct *)HDmalloc(sizeof(Cmpd1Struct) * F76_LENGTH);
+    HDassert(Cmpd1);
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F76_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        dims[0] = F76_DIM8;
+
+        valu8bits = (uint8_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu8[n] = valu8bits;
+            valu8bits = (uint8_t)(valu8bits << 1);
+        }
+
+        /* Array of 16 bits unsigned int */
+        dims[0] = F76_DIM16;
+
+        valu16bits = (uint16_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu16[n] = valu16bits;
+            valu16bits = (uint16_t)(valu16bits << 1);
+        }
+
+        /* Array of 32 bits unsigned int */
+        dims[0] = F76_DIM32;
+
+        valu32bits = (uint32_t) ~0u;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu32[n] = valu32bits;
+            valu32bits <<= 1;
+        }
+
+        /* Array of 64 bits unsigned int */
+        dims[0] = F76_DIM64;
+
+        valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dsetu64[n] = valu64bits;
+            valu64bits <<= 1;
+        }
+
+        /* Array of 8 bits signed int */
+        dims[0] = F76_DIM8;
+
+        val8bits = (int8_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset8[n] = val8bits;
+            val8bits = (int8_t)(val8bits << 1);
+        }
+
+        /* Array of 16 bits signed int */
+        dims[0] = F76_DIM16;
+
+        val16bits = (int16_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset16[n] = val16bits;
+            val16bits = (int16_t)(val16bits << 1);
+        }
+
+        /* Array of 32 bits signed int */
+        dims[0] = F76_DIM32;
+
+        val32bits = (int32_t) ~0;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset32[n] = val32bits;
+            val32bits <<= 1;
+        }
+
+        /* Array of 64 bits signed int */
+        dims[0] = F76_DIM64;
+
+        val64bits = (int64_t) ~0L;  /* all 1s */
+        for(n = 0; n < (int)dims[0]; n++){
+            Cmpd1[m].dset64[n] = val64bits;
+            val64bits <<= 1;
+        }
+
+        /* Double Dummy set for failure tests */
+        dims[0] = F76_DIM8;
+
+        for(n = 0; n < (int)dims[0]; n++)
+            Cmpd1[m].dsetdbl[n] = 0.0001F + (float)n;
+    }
+
+    /* Create the array data type for the 8 bits signed int array             */
+    array8_tid = H5Tarray_create2(H5T_NATIVE_SCHAR, F76_ARRAY_RANK, array_dim8);
+    HDassert(array8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    array16_tid = H5Tarray_create2(H5T_NATIVE_SHORT, F76_ARRAY_RANK, array_dim16);
+    HDassert(array16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    array32_tid = H5Tarray_create2(H5T_NATIVE_INT, F76_ARRAY_RANK, array_dim32);
+    HDassert(array32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    array64_tid = H5Tarray_create2(H5T_NATIVE_LONG, F76_ARRAY_RANK, array_dim64);
+    HDassert(array64_tid >= 0);
+
+    /* Create the array data type for the 8 bits signed int array             */
+    arrayu8_tid = H5Tarray_create2(H5T_NATIVE_UCHAR, F76_ARRAY_RANK, array_dim8);
+    HDassert(arrayu8_tid >= 0);
+
+    /* Create the array data type for the 16 bits signed int array             */
+    arrayu16_tid = H5Tarray_create2(H5T_NATIVE_USHORT, F76_ARRAY_RANK, array_dim16);
+    HDassert(arrayu16_tid >= 0);
+
+    /* Create the array data type for the 32 bits signed int array             */
+    arrayu32_tid = H5Tarray_create2(H5T_NATIVE_UINT, F76_ARRAY_RANK, array_dim32);
+    HDassert(arrayu32_tid >= 0);
+
+    /* Create the array data type for the 64 bits signed int array             */
+    arrayu64_tid = H5Tarray_create2(H5T_NATIVE_ULONG, F76_ARRAY_RANK, array_dim64);
+    HDassert(arrayu64_tid >= 0);
+
+    /* Create the array data type for the 32 bits double array             */
+    arraydbl_tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F76_ARRAY_RANK, array_dim8);
+    HDassert(arraydbl_tid >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE76, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
+    HDassert(Cmpd1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), arraydbl_tid);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F76_DATASETNAME, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd1Structid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arrayu64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array8_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array16_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array32_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(array64_tid);
+    HDassert(status >= 0);
+
+    status = H5Tclose(arraydbl_tid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+
+    HDfree(Cmpd1);
+}
+
+static void gent_compound_ints(void) {
+    hid_t fid, dataset, space;
+    uint8_t  valu8bits = (uint8_t) ~0u;  /* all 1s */
+    uint16_t valu16bits = (uint16_t) ~0u;  /* all 1s */
+    uint32_t valu32bits = (uint32_t) ~0u;  /* all 1s */
+    uint64_t valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+    int8_t  val8bits = (int8_t) ~0;  /* all 1s */
+    int16_t val16bits = (int16_t) ~0;  /* all 1s */
+    int32_t val32bits = (int32_t) ~0;  /* all 1s */
+    int64_t val64bits = (int64_t) ~0L;  /* all 1s */
+    /* Structure and array for compound types                             */
+    typedef struct Cmpd1Struct {
+            uint8_t  dsetu8;
+            uint16_t dsetu16;
+            uint32_t dsetu32;
+            uint64_t dsetu64;
+            int8_t  dset8;
+            int16_t dset16;
+            int32_t dset32;
+            int64_t dset64;
+            double  dsetdbl;
+    } Cmpd1Struct;
+    Cmpd1Struct *Cmpd1;
+
+    typedef struct Cmpd2Struct {
+            uint64_t dsetu64;
+            uint32_t dsetu32;
+            uint16_t dsetu16;
+            uint8_t  dsetu8;
+            int64_t dset64;
+            int32_t dset32;
+            int16_t dset16;
+            int8_t  dset8;
+            double  dsetdbl;
+    } Cmpd2Struct;
+    Cmpd2Struct *Cmpd2;
+
+    hid_t Cmpd1Structid; /* File datatype identifier */
+    hid_t Cmpd2Structid; /* File datatype identifier */
+    herr_t status; /* Error checking variable */
+    hsize_t dim[] = { F77_LENGTH }; /* Dataspace dimensions     */
+
+    int m; /* Array init loop vars     */
+
+    /* Allocate buffers */
+    Cmpd1 = (Cmpd1Struct *)HDmalloc(sizeof(Cmpd1Struct) * F77_LENGTH);
+    HDassert(Cmpd1);
+    Cmpd2 = (Cmpd2Struct *)HDmalloc(sizeof(Cmpd2Struct) * F77_LENGTH);
+    HDassert(Cmpd2);
+
+    /* Initialize the data in the arrays/datastructure                */
+    for (m = 0; m < F77_LENGTH; m++) {
+
+        /* Array of 8 bits unsigned int */
+        if((m % F76_DIM8) == 0)
+            valu8bits = (uint8_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu8 = valu8bits;
+        Cmpd2[m].dsetu8 = valu8bits;
+        valu8bits = (uint8_t)(valu8bits << 1);
+
+        /* Array of 16 bits unsigned int */
+        if((m % F76_DIM16) == 0)
+            valu16bits = (uint16_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu16 = valu16bits;
+        Cmpd2[m].dsetu16 = valu16bits;
+        valu16bits = (uint16_t)(valu16bits << 1);
+
+        /* Array of 32 bits unsigned int */
+        if((m % F76_DIM32) == 0)
+            valu32bits = (uint32_t) ~0u;  /* all 1s */
+        Cmpd1[m].dsetu32 = valu32bits;
+        Cmpd2[m].dsetu32 = valu32bits;
+        valu32bits <<= 1;
+
+        /* Array of 64 bits unsigned int */
+        if((m % F76_DIM64) == 0)
+            valu64bits = (uint64_t) ~0Lu;  /* all 1s */
+        Cmpd1[m].dsetu64 = valu64bits;
+        Cmpd2[m].dsetu64 = valu64bits;
+        valu64bits <<= 1;
+
+        /* Array of 8 bits signed int */
+        if((m % F76_DIM8) == 0)
+            val8bits = (int8_t) ~0;  /* all 1s */
+        Cmpd1[m].dset8 = val8bits;
+        Cmpd2[m].dset8 = val8bits;
+        val8bits = (int8_t)(val8bits << 1);
+
+        /* Array of 16 bits signed int */
+        if((m % F76_DIM16) == 0)
+            val16bits = (int16_t) ~0;  /* all 1s */
+        Cmpd1[m].dset16 = val16bits;
+        Cmpd2[m].dset16 = val16bits;
+        val16bits = (int16_t)(val16bits << 1);
+
+        /* Array of 32 bits signed int */
+        if((m % F76_DIM32) == 0)
+            val32bits = (int32_t) ~0;  /* all 1s */
+        Cmpd1[m].dset32 = val32bits;
+        Cmpd2[m].dset32 = val32bits;
+        val32bits <<= 1;
+
+        /* Array of 64 bits signed int */
+        if((m % F76_DIM64) == 0)
+            val64bits = (int64_t) ~0L;  /* all 1s */
+        Cmpd1[m].dset64 = val64bits;
+        Cmpd2[m].dset64 = val64bits;
+        val64bits <<= 1;
+
+        /* Double Dummy set for failure tests */
+        Cmpd1[m].dsetdbl = 0.0001F + (float)m;
+        Cmpd2[m].dsetdbl = 0.0001F + (float)m;
+    }
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the file                                                */
+    fid = H5Fcreate(FILE77, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd1Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd1Struct));
+    HDassert(Cmpd1Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU08, HOFFSET(Cmpd1Struct, dsetu8), H5T_NATIVE_UCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU16, HOFFSET(Cmpd1Struct, dsetu16), H5T_NATIVE_USHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU32, HOFFSET(Cmpd1Struct, dsetu32), H5T_NATIVE_UINT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETU64, HOFFSET(Cmpd1Struct, dsetu64), H5T_NATIVE_ULONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS08, HOFFSET(Cmpd1Struct, dset8), H5T_NATIVE_SCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS16, HOFFSET(Cmpd1Struct, dset16), H5T_NATIVE_SHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS32, HOFFSET(Cmpd1Struct, dset32), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DATASETS64, HOFFSET(Cmpd1Struct, dset64), H5T_NATIVE_LONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd1Structid, F76_DUMMYDBL, HOFFSET(Cmpd1Struct, dsetdbl), H5T_NATIVE_DOUBLE);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F77_DATASETNAME1, Cmpd1Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd1Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd1);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd1Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    /* Create the dataspace                                           */
+    space = H5Screate_simple(F76_RANK, dim, NULL);
+    HDassert(space >= 0);
+
+    /* Create the memory data type                                    */
+    Cmpd2Structid = H5Tcreate(H5T_COMPOUND, sizeof(Cmpd2Struct));
+    HDassert(Cmpd2Structid >= 0);
+
+    /* Insert the arrays and variables into the structure             */
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU64, HOFFSET(Cmpd2Struct, dsetu64), H5T_NATIVE_ULONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU32, HOFFSET(Cmpd2Struct, dsetu32), H5T_NATIVE_UINT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU16, HOFFSET(Cmpd2Struct, dsetu16), H5T_NATIVE_USHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETU08, HOFFSET(Cmpd2Struct, dsetu8), H5T_NATIVE_UCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS64, HOFFSET(Cmpd2Struct, dset64), H5T_NATIVE_LONG);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS32, HOFFSET(Cmpd2Struct, dset32), H5T_NATIVE_INT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS16, HOFFSET(Cmpd2Struct, dset16), H5T_NATIVE_SHORT);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DATASETS08, HOFFSET(Cmpd2Struct, dset8), H5T_NATIVE_SCHAR);
+    HDassert(status >= 0);
+
+    status = H5Tinsert(Cmpd2Structid, F76_DUMMYDBL, HOFFSET(Cmpd2Struct, dsetdbl), H5T_NATIVE_DOUBLE);
+    HDassert(status >= 0);
+
+    /* Create the dataset                                             */
+    dataset = H5Dcreate2(fid, F77_DATASETNAME2, Cmpd2Structid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Write data to the dataset                                      */
+    status = H5Dwrite(dataset, Cmpd2Structid, H5S_ALL, H5S_ALL, H5P_DEFAULT, Cmpd2);
+    HDassert(status >= 0);
+
+    /* Release resources                                              */
+    status = H5Tclose(Cmpd2Structid);
+    HDassert(status >= 0);
+
+    status = H5Sclose(space);
+    HDassert(status >= 0);
+
+    status = H5Dclose(dataset);
+    HDassert(status >= 0);
+
+    status = H5Fclose(fid);
+    HDassert(status >= 0);
+
+    HDfree(Cmpd1);
+    HDfree(Cmpd2);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intscalars
+ *
+ * Purpose:     Generate a file to be used in the h5dump scalar with attribute tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intattrscalars(void)
+{
+    hid_t fid, attr, dataset, space, tid;
+    hsize_t dims[2];
+    uint8_t  dsetu8[F73_XDIM][F73_YDIM8],   valu8bits;
+    uint16_t dsetu16[F73_XDIM][F73_YDIM16], valu16bits;
+    uint32_t dsetu32[F73_XDIM][F73_YDIM32], valu32bits;
+    uint64_t dsetu64[F73_XDIM][F73_YDIM64], valu64bits;
+    int8_t  dset8[F73_XDIM][F73_YDIM8],   val8bits;
+    int16_t dset16[F73_XDIM][F73_YDIM16], val16bits;
+    int32_t dset32[F73_XDIM][F73_YDIM32], val32bits;
+    int64_t dset64[F73_XDIM][F73_YDIM64], val64bits;
+    double  dsetdbl[F73_XDIM][F73_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE78, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    /* Attribute of 8 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu8);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    /* Attribute of 16 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu16);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    /* Attribute of 32 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu32);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_U64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    /* Attribute of 64 bits unsigned int */
+    attr = H5Acreate2(dataset, F73_DATASETU64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetu64);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I8LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0; /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    /* Attribute of 8 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS08, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset8);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM16;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I16LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    /* Attribute of 16 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS16, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset16);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM32;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I32LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    /* Attribute of 32 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS32, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset32);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM64;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_STD_I64LE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    /* Attribute of 64 bits signed int */
+    attr = H5Acreate2(dataset, F73_DATASETS64, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dset64);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F73_XDIM; dims[1] = F73_YDIM8;
+    space = H5Screate(H5S_SCALAR);
+    tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, F73_ARRAY_RANK, dims);
+    dataset = H5Dcreate2(fid, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++)
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+
+    H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+    /* Attribute of double */
+    attr = H5Acreate2(dataset, F73_DUMMYDBL, tid, space, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, tid, dsetdbl);
+    H5Aclose(attr);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_packedbits
+ *
+ * Purpose:     Generate a file to be used in the h5dump packed bits tests.
+ *   Four datasets of 1, 2, 4 and 8 bytes of unsigned int types are created.
+ *   Four more datasets of 1, 2, 4 and 8 bytes of signed int types are created.
+ *   Fill them with raw data such that no bit will be all zero in a dataset.
+ *   A dummy dataset of double type is created for failure test.
+ * Created:  Albert Cheng, 2010/5/10.
+ * Modified: Allen Byrne, 2011/1/5 Use file to test Signed/Unsigned datatypes
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intsattrs(void)
+{
+    hid_t fid, attr, dataset, space, aspace;
+    hsize_t dims[2], adims[1];
+    uint8_t  dsetu8[F66_XDIM][F66_YDIM8],   asetu8[F66_XDIM*F66_YDIM8],   valu8bits;
+    uint16_t dsetu16[F66_XDIM][F66_YDIM16], asetu16[F66_XDIM*F66_YDIM16], valu16bits;
+    uint32_t dsetu32[F66_XDIM][F66_YDIM32], asetu32[F66_XDIM*F66_YDIM32], valu32bits;
+    uint64_t dsetu64[F66_XDIM][F66_YDIM64], asetu64[F66_XDIM*F66_YDIM64], valu64bits;
+    int8_t  dset8[F66_XDIM][F66_YDIM8],   aset8[F66_XDIM*F66_YDIM8],   val8bits;
+    int16_t dset16[F66_XDIM][F66_YDIM16], aset16[F66_XDIM*F66_YDIM16], val16bits;
+    int32_t dset32[F66_XDIM][F66_YDIM32], aset32[F66_XDIM*F66_YDIM32], val32bits;
+    int64_t dset64[F66_XDIM][F66_YDIM64], aset64[F66_XDIM*F66_YDIM64], val64bits;
+    double  dsetdbl[F66_XDIM][F66_YDIM8], asetdbl[F66_XDIM*F66_YDIM8];
+    unsigned int i, j;
+
+    fid = H5Fcreate(FILE79, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 8 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU08, H5T_STD_U8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu8bits = (uint8_t) ~0u;  /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu8[i][0] = valu8bits;
+        asetu8[i*dims[1]] = dsetu8[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu8[i][j] = (uint8_t)(dsetu8[i][j-1] << 1);
+            asetu8[i*dims[1]+j] = dsetu8[i][j];
+        }
+        valu8bits = (uint8_t)(valu8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu8);
+    /* Attribute of 8 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU08, H5T_STD_U8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT8, asetu8);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU16, H5T_STD_U16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu16bits = (uint16_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu16[i][0] = valu16bits;
+        asetu16[i*dims[1]] = dsetu16[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu16[i][j] = (uint16_t)(dsetu16[i][j-1] << 1);
+            asetu16[i*dims[1]+j] = dsetu16[i][j];
+        }
+        valu16bits = (uint16_t)(valu16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu16);
+    /* Attribute of 16 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM16;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU16, H5T_STD_U16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT16, asetu16);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU32, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu32bits = (uint32_t) ~0u;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu32[i][0] = valu32bits;
+        asetu32[i*dims[1]] = dsetu32[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu32[i][j] = dsetu32[i][j-1] << 1;
+            asetu32[i*dims[1]+j] = dsetu32[i][j];
+        }
+        valu32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu32);
+    /* Attribute of 32 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM32;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU32, H5T_STD_U32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT32, asetu32);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits unsigned int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETU64, H5T_STD_U64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    valu64bits = (uint64_t) ~0Lu;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dsetu64[i][0] = valu64bits;
+        asetu64[i*dims[1]] = dsetu64[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dsetu64[i][j] = dsetu64[i][j-1] << 1;
+            asetu64[i*dims[1]+j] = dsetu64[i][j];
+        }
+        valu64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetu64);
+    /* Attribute of 64 bits unsigned int */
+    adims[0] = F66_XDIM * F66_YDIM64;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETU64, H5T_STD_U64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_UINT64, asetu64);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 8 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS08, H5T_STD_I8LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val8bits = (int8_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset8[i][0] = val8bits;
+        aset8[i*dims[1]] = dset8[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset8[i][j] = (int8_t)(dset8[i][j-1] << 1);
+            aset8[i*dims[1]+j] = dset8[i][j];
+        }
+        val8bits = (int8_t)(val8bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset8);
+    /* Attribute of 8 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS08, H5T_STD_I8LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT8, aset8);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 16 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM16;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS16, H5T_STD_I16LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val16bits = (int16_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset16[i][0] = val16bits;
+        aset16[i*dims[1]] = dset16[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset16[i][j] = (int16_t)(dset16[i][j-1] << 1);
+            aset16[i*dims[1]+j] = dset16[i][j];
+        }
+        val16bits = (int16_t)(val16bits << 1);
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset16);
+    /* Attribute of 16 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM16;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS16, H5T_STD_I16LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT16, aset16);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 32 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM32;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS32, H5T_STD_I32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val32bits = (int32_t) ~0;    /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset32[i][0] = val32bits;
+        aset32[i*dims[1]] = dset32[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset32[i][j] = dset32[i][j-1] << 1;
+            aset32[i*dims[1]+j] = dset32[i][j];
+        }
+        val32bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32);
+    /* Attribute of 32 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM32;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS32, H5T_STD_I32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT32, aset32);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Dataset of 64 bits signed int */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM64;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DATASETS64, H5T_STD_I64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    val64bits = (int64_t) ~0L;   /* all 1s */
+    for(i = 0; i < dims[0]; i++){
+        dset64[i][0] = val64bits;
+        aset64[i*dims[1]] = dset64[i][0];
+        for(j = 1; j < dims[1]; j++) {
+            dset64[i][j] = dset64[i][j-1] << 1;
+            aset64[i*dims[1]+j] = dset64[i][j];
+        }
+        val64bits <<= 1;
+    }
+
+    H5Dwrite(dataset, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64);
+    /* Attribute of 64 bits signed int */
+    adims[0] = F66_XDIM * F66_YDIM64;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DATASETS64, H5T_STD_I64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_INT64, aset64);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    /* Double Dummy set for failure tests */
+    dims[0] = F66_XDIM; dims[1] = F66_YDIM8;
+    space = H5Screate_simple(2, dims, NULL);
+    dataset = H5Dcreate2(fid, F66_DUMMYDBL, H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < dims[0]; i++)
+        for(j = 0; j < dims[1]; j++) {
+            dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+            asetdbl[i*dims[1]+j] = dsetdbl[i][j];
+        }
+
+    H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
+    /* Attribute of double */
+    adims[0] = F66_XDIM * F66_YDIM8;
+    aspace = H5Screate_simple(1, adims, NULL);
+    attr = H5Acreate2(dataset, F66_DUMMYDBL, H5T_IEEE_F64BE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+    H5Awrite(attr, H5T_NATIVE_DOUBLE, asetdbl);
+    H5Aclose(attr);
+    H5Sclose(aspace);
+    H5Sclose(space);
+    H5Dclose(dataset);
+    H5Fclose(fid);
+}
+
+static void gent_bitnopaquefields(void)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+        unsigned char   a;
+        unsigned int    b;
+        unsigned long    c;
+        unsigned long long    d;
+    } s_t;
+    hid_t  file, grp=-1, type=-1, space=-1, dset=-1;
+    size_t  i;
+    hsize_t  nelmts = F80_DIM32;
+    unsigned char buf[F80_DIM32];    /* bitfield, opaque */
+    unsigned int buf2[F80_DIM32];    /* bitfield, opaque */
+    unsigned long buf3[F80_DIM32];    /* bitfield, opaque */
+    unsigned long long buf4[F80_DIM32];    /* bitfield, opaque */
+    s_t      buf5[F80_DIM32];        /* compound */
+
+    file = H5Fcreate(FILE80, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((grp = H5Gcreate2(file, "bittypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* bitfield_1 */
+        if ((type = H5Tcopy(H5T_STD_B8LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_2 */
+        if ((type = H5Tcopy(H5T_STD_B16LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_3 */
+        if ((type = H5Tcopy(H5T_STD_B32LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_3", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf3[i] = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf3);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        /* bitfield_4 */
+        if ((type = H5Tcopy(H5T_STD_B64LE)) >= 0) {
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "bitfield_4", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for (i = 0; i < nelmts; i++) {
+                        buf4[i] = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                    }
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf4);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+
+        H5Gclose(grp);
+    }
+
+    if ((grp = H5Gcreate2(file, "opaquetypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* opaque_1 */
+        if ((type = H5Tcreate(H5T_OPAQUE, 1)) >= 0) {
+            if ((H5Tset_tag(type, "1-byte opaque type")) >= 0) {
+                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                    if ((dset = H5Dcreate2(grp, "opaque_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                        for(i = 0; i < nelmts; i++)
+                            buf[i] = (unsigned char)0xff ^ (unsigned char)i;
+                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+                        H5Dclose(dset);
+                    }
+                    H5Sclose(space);
+                }
+            }
+            H5Tclose(type);
+        }
+
+        /* opaque_2 */
+        if ((type = H5Tcreate(H5T_OPAQUE, 2)) >= 0) {
+            if ((H5Tset_tag(type, "2-byte opaque type")) >= 0) {
+                if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                    if ((dset = H5Dcreate2(grp, "opaque_2", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                        for(i = 0; i < nelmts; i++)
+                            buf2[i] = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+
+                        H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2);
+                        H5Dclose(dset);
+                    }
+                    H5Sclose(space);
+                }
+            }
+            H5Tclose(type);
+        }
+        H5Gclose(grp);
+    }
+
+    if ((grp = H5Gcreate2(file, "cmpdtypetests", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+        /* compound_1 */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+            H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+            H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+            H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+            H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+            if ((space = H5Screate_simple(1, &nelmts, NULL)) >= 0) {
+                if ((dset = H5Dcreate2(grp, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                    for(i = 0; i < nelmts; i++) {
+                        buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+                        buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                        buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                        buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                    }
+
+                    H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+                    H5Dclose(dset);
+                }
+                H5Sclose(space);
+            }
+            H5Tclose(type);
+        }
+        H5Gclose(grp);
+    }
+
+    H5Fclose(file);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_intsfourdims
+ *
+ * Purpose:     Generate a file to be used in the h5dump subsetting tests.
+ *   One datasets of unsigned int types are created in four dimensions 2,4,6,10.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_intsfourdims(void)
+{
+    hid_t fid, dataset, space;
+    hsize_t dims[F81_RANK];
+    uint32_t dset1[F81_ZDIM][F81_YDIM][F81_XDIM][F81_WDIM];
+    unsigned int i, j, k, l;
+
+    fid = H5Fcreate(FILE81, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Dataset of 32 bits unsigned int */
+    dims[0] = F81_ZDIM; dims[1] = F81_YDIM; dims[2] = F81_XDIM; dims[3] = F81_WDIM;
+    space = H5Screate_simple(F81_RANK, dims, NULL);
+    dataset = H5Dcreate2(fid, F81_DATASETNAME, H5T_STD_U32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    for(i = 0; i < F81_ZDIM; i++)
+        for(j = 0; j < F81_YDIM; j++)
+            for(k = 0; k < F81_XDIM; k++)
+                for(l = 0; l < F81_WDIM; l++)
+            dset1[i][j][k][l] = i*F81_YDIM*F81_XDIM*F81_WDIM + j*F81_XDIM*F81_WDIM + k*F81_WDIM + l;
+
+    H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+    H5Sclose(space);
+    H5Dclose(dataset);
+
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_compound_complex2
+ *
+ * Purpose:     Generate a file to be used in testing compound datatypes of
+ *   various sizes, dimensions, member types and nesting.
+ *-------------------------------------------------------------------------
+ */
+static void gent_compound_complex2(void)
+{
+    /* Third-level nested compound */
+    typedef struct {
+        short  deep_nested_short[10];
+        int    deep_nested_int[10];
+        long   deep_nested_long[10];
+        double deep_nested_double[10];
+        float  deep_nested_float[10];
+    } third_level_compound;
+
+    /* Second-level multiply-nested compounds */
+    typedef struct {
+        unsigned int  multiple_nested_a[5];
+        int           multiple_nested_b[5];
+        unsigned long multiple_nested_c[5];
+        long          multiple_nested_d[5];
+    } further_nested;
+
+    typedef struct {
+        char further_nested_string[11];
+        char further_nested_string_array[4][13];
+        third_level_compound deep_nest;
+    } further_nested2;
+
+    /* First First-level nested compound */
+    typedef struct
+    {
+        double nested_a;
+        char   nested_string[23];
+        char   nested_string_array[4][12];
+    } nested_compound;
+
+    /* Second First-level nested compound */
+    typedef struct
+    {
+        float           a;
+        further_nested  b;
+        further_nested2 c;
+    } multiple_nested_compound;
+
+    /* Compound datatype with different member types */
+    typedef struct
+    {
+        /* Arrays nested inside compound */
+        unsigned int             a[4];
+        int                      b[6];
+        float                    c[2][4];
+        nested_compound          d;   /* Compound inside compound */
+        multiple_nested_compound e;   /* Compound inside compound with further nested compound */
+    } compound;
+
+    compound        *buf;        /* compound */
+
+    hid_t file, type=-1, space=-1, dset=-1;
+    hid_t dset_array_a, dset_array_b, dset_array_c;
+    hid_t cmpd_tid1 = -1, cmpd_tid2 = -1, cmpd_tid3 = -1;
+    size_t  i;
+    size_t j, k;
+    unsigned dset_array_ndims;
+    hsize_t  dset_array_a_dims[1], dset_array_b_dims[1], dset_array_c_dims[2];
+    hsize_t  nelmts = F82_DIM32;
+
+    /* Allocate buffer */
+    buf = (compound *)HDmalloc(sizeof(compound) * F82_DIM32);
+    HDassert(buf);
+
+    file = H5Fcreate(FILE82, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((space = H5Screate_simple(F82_RANK, &nelmts, NULL)) >= 0) {
+        /* CompoundComplex1D */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(compound))) >= 0) {
+            hid_t str_type, array;
+            hsize_t dims[1];
+            hid_t nest1, nest2;
+
+            /* Insert top-level array members */
+            dset_array_ndims = 1; dset_array_a_dims[0] = 4;
+            dset_array_a = H5Tarray_create2(H5T_STD_U32LE, dset_array_ndims, dset_array_a_dims);
+            H5Tinsert(type, "a", HOFFSET(compound, a), dset_array_a);
+            H5Tclose(dset_array_a);
+
+            dset_array_ndims = 1; dset_array_b_dims[0] = 6;
+            dset_array_b = H5Tarray_create2(H5T_STD_I32LE, dset_array_ndims, dset_array_b_dims);
+            H5Tinsert(type, "b", HOFFSET(compound, b), dset_array_b);
+            H5Tclose(dset_array_b);
+
+            dset_array_ndims = 2; dset_array_c_dims[0] = 2; dset_array_c_dims[1] = 4;
+            dset_array_c = H5Tarray_create2(H5T_IEEE_F32LE, dset_array_ndims, dset_array_c_dims);
+            H5Tinsert(type, "c", HOFFSET(compound, c), dset_array_c);
+            H5Tclose(dset_array_c);
+
+            /* Insert first nested compound */
+            cmpd_tid1 = H5Tcreate(H5T_COMPOUND, sizeof(nested_compound));
+
+            H5Tinsert(cmpd_tid1, "nested_double", HOFFSET(nested_compound, nested_a), H5T_IEEE_F64LE);
+
+            dims[0] = 1;
+            str_type = mkstr(23, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(cmpd_tid1, "nested_string", HOFFSET(nested_compound, nested_string), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            dims[0] = 4;
+            str_type = mkstr(12, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(cmpd_tid1, "nested_string_array", HOFFSET(nested_compound, nested_string_array), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            H5Tinsert(type, "nested_compound", HOFFSET(compound, d), cmpd_tid1);
+
+            /* Insert second nested compound */
+            cmpd_tid2 = H5Tcreate(H5T_COMPOUND, sizeof(multiple_nested_compound));
+
+            H5Tinsert(cmpd_tid2, "nested_float", HOFFSET(multiple_nested_compound, a), H5T_IEEE_F32LE);
+
+            /* Add first further nested compound */
+            nest1 = H5Tcreate(H5T_COMPOUND, sizeof(further_nested));
+
+            dims[0] = 5;
+            array = H5Tarray_create2(H5T_STD_U32LE, 1, dims);
+            H5Tinsert(nest1, "nested_unsigned_int", HOFFSET(further_nested, multiple_nested_a), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I32LE, 1, dims);
+            H5Tinsert(nest1, "nested_int", HOFFSET(further_nested, multiple_nested_b), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_U64LE, 1, dims);
+            H5Tinsert(nest1, "nested_unsigned_long", HOFFSET(further_nested, multiple_nested_c), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I64LE, 1, dims);
+            H5Tinsert(nest1, "nested_long", HOFFSET(further_nested, multiple_nested_d), array);
+            H5Tclose(array);
+
+            H5Tinsert(cmpd_tid2, "further_nested_compoundA", HOFFSET(multiple_nested_compound, b), nest1);
+            H5Tclose(nest1);
+
+            /* Add second further nested compound */
+            nest2 = H5Tcreate(H5T_COMPOUND, sizeof(further_nested2));
+
+            dims[0] = 1;
+            str_type = mkstr(11, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(nest2, "nested_string", HOFFSET(further_nested2, further_nested_string), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            dims[0] = 4;
+            str_type = mkstr(13, H5T_STR_NULLTERM);
+            array = H5Tarray_create2(str_type, 1, dims);
+            H5Tinsert(nest2, "nested_string_array", HOFFSET(further_nested2, further_nested_string_array), array);
+            H5Tclose(array);
+            H5Tclose(str_type);
+
+            /* Add a final third-level nested compound to this second-level compound */
+            cmpd_tid3 = H5Tcreate(H5T_COMPOUND, sizeof(third_level_compound));
+
+            dims[0] = 10;
+            array = H5Tarray_create2(H5T_STD_I16LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_short", HOFFSET(third_level_compound, deep_nested_short), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I32LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_int", HOFFSET(third_level_compound, deep_nested_int), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_STD_I64LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_long", HOFFSET(third_level_compound, deep_nested_long), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_IEEE_F64LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_double", HOFFSET(third_level_compound, deep_nested_double), array);
+            H5Tclose(array);
+
+            array = H5Tarray_create2(H5T_IEEE_F32LE, 1, dims);
+            H5Tinsert(cmpd_tid3, "deep_nested_float", HOFFSET(third_level_compound, deep_nested_float), array);
+            H5Tclose(array);
+
+            H5Tinsert(nest2, "deep_nested_compound", HOFFSET(further_nested2, deep_nest), cmpd_tid3);
+
+            H5Tinsert(cmpd_tid2, "further_nested_compoundB", HOFFSET(multiple_nested_compound, c), nest2);
+            H5Tclose(nest2);
+
+            H5Tinsert(type, "multiple_nested_compound", HOFFSET(compound, e), cmpd_tid2);
+
+
+            if ((dset = H5Dcreate2(file, F82_DATASETNAME, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                for(i = 0; i < nelmts; i++) {
+                    for (j = 0; j < dset_array_a_dims[0]; j++)
+                        buf[i].a[j] = (unsigned int)(j + i*10);
+                    for (j = 0; j < dset_array_b_dims[0]; j++)
+                        buf[i].b[j] = (int)(j - i*10);
+                    for (j = 0; j < dset_array_c_dims[0]; j++)
+                        for (k = 0; k < dset_array_c_dims[1]; k++)
+                            buf[i].c[j][k] = (float)(j + k + i*10) + (float)(j) * 0.1F;
+
+                    /* Set up first nested compound */
+                    buf[i].d.nested_a = (double) i;
+
+                    HDstrcpy(buf[i].d.nested_string, "This is a test string.");
+
+                    for (j = 0; j < 4; j++)
+                        HDstrcpy(buf[i].d.nested_string_array[j], "String test");
+
+                    /* Set up multiple nested compound */
+                    buf[i].e.a = (float) i;
+
+                    for (j = 0; j < 5; j++) {
+                        buf[i].e.b.multiple_nested_a[j] = (unsigned int)(j + i*10);
+                        buf[i].e.b.multiple_nested_b[j] = (int)(j - i*10);
+                        buf[i].e.b.multiple_nested_c[j] = (unsigned long)(j + i*10);
+                        buf[i].e.b.multiple_nested_d[j] = (long)(j - i*10);
+                    }
+
+                    HDstrcpy(buf[i].e.c.further_nested_string, "1234567890");
+                    for (j = 0; j < 4; j++)
+                        HDstrcpy(buf[i].e.c.further_nested_string_array[j], "STRING ARRAY");
+
+                    for (j = 0; j < 10; j++) {
+                        buf[i].e.c.deep_nest.deep_nested_short[j] = (short)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_int[j] = (int)(j - i*10);
+                        buf[i].e.c.deep_nest.deep_nested_long[j] = (long)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_double[j] = (double)(j + i*10);
+                        buf[i].e.c.deep_nest.deep_nested_float[j] = (float)(j + i*10);
+                    }
+                }
+
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                    HDfprintf(stderr, "gent_tcompound_complex2 H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(type);
+        }
+        H5Tclose(cmpd_tid1);
+        H5Tclose(cmpd_tid2);
+        H5Tclose(cmpd_tid3);
+        H5Sclose(space);
+    }
+
+    /* CompoundComplex2D */
+/*   if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+        if ((space = H5Screate_simple(F82_RANK2, &nelmts, NULL)) >= 0) {
+            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                for(i = 0; i < nelmts; i++) {
+                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                }
+
+                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+                H5Dclose(dset);
+            }
+            H5Sclose(space);
+        }
+        H5Tclose(type);
+    }
+*/
+    /* CompoundComplex3D */
+/*    if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+        if ((space = H5Screate_simple(F82_RANK3, &nelmts, NULL)) >= 0) {
+            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                for(i = 0; i < nelmts; i++) {
+                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                }
+
+                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+                H5Dclose(dset);
+            }
+            H5Sclose(space);
+        }
+        H5Tclose(type);
+    }
+*/
+    /* CompoundComplex4D */
+/*    if ((type = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) >= 0) {
+        H5Tinsert(type, "a", HOFFSET(s_t, a), H5T_STD_B8LE);
+        H5Tinsert(type, "b", HOFFSET(s_t, b), H5T_STD_B16LE);
+        H5Tinsert(type, "c", HOFFSET(s_t, c), H5T_STD_B32LE);
+        H5Tinsert(type, "d", HOFFSET(s_t, d), H5T_STD_B64LE);
+        if ((space = H5Screate_simple(F82_RANK4, &nelmts, NULL)) >= 0) {
+            if ((dset = H5Dcreate2(file, "compound_1", type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                for(i = 0; i < nelmts; i++) {
+                    buf5[i].a = (unsigned char)0xff ^ (unsigned char)i;
+                    buf5[i].b = (unsigned int)0xffff ^ (unsigned int)(i * 16);
+                    buf5[i].c = (unsigned long)0xffffffff ^ (unsigned long)(i * 32);
+                    buf5[i].d = (unsigned long long)0xffffffffffffffff ^ (unsigned long long)(i * 64);
+                }
+
+                H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5);
+                H5Dclose(dset);
+            }
+            H5Sclose(space);
+        }
+        H5Tclose(type);
+    }
+*/
+    H5Fclose(file);
+
+    HDfree(buf);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_vlenstr_array
+ *
+ * Purpose:     Generate a file to be used in testing Arrays of variable
+ *              length strings.
+ *-------------------------------------------------------------------------
+ */
+static void gent_vlenstr_array(void)
+{
+    /* Compound datatype with different member types */
+    typedef struct compound
+    {
+        /* Array of variable-length strings*/
+        const char *vlen_array[F83_ARRAYDIM];
+    } compound;
+    compound        buf[F83_DIM];
+
+    const char *test[F83_ARRAYDIM] = {
+            "This is a variable-length test string.",
+            "This test string is also variable-length.",
+            "A final test of variable-length strings. This string is longer than the others."
+    };
+    const char    *buffer[F83_DIM*F83_ARRAYDIM];
+
+    hid_t  file, type=-1, space=-1, dset=-1;
+    hid_t cmpd_tid1, array_tid;
+    int i, j;
+
+    hsize_t dims[] = {F83_DIM}, arraydim[] = {F83_ARRAYDIM};
+    /* Initialize scalar data */
+    for (i = 0; i < F83_DIM; i++)
+        for (j = 0; j < 3; j++)
+            buffer[j + 3*i] = test[j];
+
+    /* Initialize compound data */
+    for (i = 0; i < F83_DIM; i++)
+        for (j = 0; j < 3; j++)
+            buf[i].vlen_array[j] = test[j];
+
+    file = H5Fcreate(FILE83, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if ((space = H5Screate_simple(F83_RANK, dims, NULL)) >= 0) {
+        array_tid = H5Tcopy(H5T_C_S1);
+        H5Tset_size(array_tid, H5T_VARIABLE);
+
+        /* ScalarArrayOfVlenStr */
+        if ((type = H5Tarray_create2(array_tid, F83_RANK, arraydim)) >= 0) {
+            if ((dset = H5Dcreate2(file, F83_DATASETNAME, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer) < 0)
+                    HDfprintf(stderr, "gent_vlenstr_array H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(type);
+        }
+        H5Tclose(array_tid);
+        H5Sclose(space);
+    }
+
+    if ((space = H5Screate_simple(F83_RANK, dims, NULL)) >= 0) {
+        /* CompoundArrayOfVlenStr */
+        if ((type = H5Tcreate(H5T_COMPOUND, sizeof(compound))) >= 0) {
+            cmpd_tid1 = H5Tcopy(H5T_C_S1);
+            H5Tset_size(cmpd_tid1, H5T_VARIABLE);
+
+            array_tid = H5Tarray_create2(cmpd_tid1, F83_RANK, arraydim);
+            H5Tinsert(type, "vlen_str_array", HOFFSET(compound, vlen_array), array_tid);
+
+            if ((dset = H5Dcreate2(file, F83_DATASETNAME2, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) >= 0) {
+                if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+                    HDfprintf(stderr, "gent_vlenstr_array H5Dwrite failed\n");
+
+                H5Dclose(dset);
+            }
+            H5Tclose(cmpd_tid1);
+            H5Tclose(type);
+        }
+        H5Sclose(space);
+    }
+
+    H5Fclose(file);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    gent_udfilter
+ *
+ * Purpose:     Generate a file to be used in testing user defined filter plugin3.
+ *-------------------------------------------------------------------------
+ */
+static void gent_udfilter(void)
+{
+    hid_t    fid;  /* file id */
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    dsid;  /* dataset ID */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    tid;  /* datatype ID */
+
+    hsize_t  dims1[RANK]      = {DIM1,DIM2};
+    hsize_t  chunk_dims[RANK] = {CDIM1,CDIM2};
+    int      buf1[DIM1][DIM2];
+    int      i, j, n, ret;
+
+    for(i=n=0; i<DIM1; i++){
+        for(j=0; j<DIM2; j++){
+            buf1[i][j]=n++;
+        }
+    }
+
+    /* create a file */
+    fid  = H5Fcreate(FILE84, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    HDassert(fid>=0);
+
+    /* create a space */
+    sid = H5Screate_simple(SPACE2_RANK, dims1, NULL);
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    HDassert(dcpl>=0);
+
+    ret = H5Pset_layout(dcpl, H5D_CHUNKED);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_chunk(dcpl, SPACE2_RANK, chunk_dims);
+    HDassert(ret >= 0);
+
+    ret = H5Zregister (H5Z_DYNLIBUD);
+    HDassert(ret >= 0);
+
+    ret = H5Pset_filter (dcpl, H5Z_FILTER_DYNLIBUD, H5Z_FLAG_MANDATORY, 0, NULL);
+    HDassert(ret >= 0);
+
+    /* create the dataset */
+    dsid = H5Dcreate2(fid, "dynlibud", H5T_STD_I32LE, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    HDassert(dsid >= 0);
+
+    /* write */
+    ret = H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1);
+    HDassert(ret >= 0);
+
+    /* close */
+    ret = H5Dclose(dsid);
+    HDassert(ret >= 0);
+
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl, H5Z_FILTER_ALL);
+    HDassert(ret >= 0);
+
+    /*-------------------------------------------------------------------------
+     * close
+     *-------------------------------------------------------------------------
+     */
+    ret = H5Sclose(sid);
+    HDassert(ret >= 0);
+
+    ret = H5Pclose(dcpl);
+    HDassert(ret >= 0);
+
+    ret = H5Fclose(fid);
+    HDassert(ret >= 0);
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlibud
+ *
+ * Purpose:    A dynlibud filter method that multiplies the original value
+ *              during write and divide the original value during read. It
+ *              will be built as a shared library.  tools tests will load
+ *              and use this filter as a plugin library.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    char *int_ptr = (char *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+
+    /* Check for the correct number of parameters */
+    if(cd_nelmts > 0)
+        return(0);
+
+    /* Assignment to eliminate unused parameter warning. */
+    cd_values = cd_values;
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Subtract the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp - MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp + MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlibud() */
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int main(void)
+{
+    gent_group();
+    gent_attribute();
+    gent_softlink();
+    gent_softlink2();
+    gent_dataset();
+    gent_hardlink();
+    gent_extlink();
+    gent_udlink();
+    gent_compound_dt();
+    gent_all();
+    gent_loop();
+    gent_dataset2();
+    gent_compound_dt2();
+    gent_loop2();
+    gent_many();
+    gent_str();
+    gent_str2();
+    gent_enum();
+    gent_objref();
+    gent_datareg();
+    gent_attrreg();
+    gent_nestcomp();
+    gent_opaque();
+    gent_bitfields();
+    gent_vldatatypes();
+    gent_vldatatypes2();
+    gent_vldatatypes3();
+    gent_vldatatypes4();
+    gent_vldatatypes5();
+    gent_array1_big();
+    gent_array1();
+    gent_array2();
+    gent_array3();
+    gent_array4();
+    gent_array5();
+    gent_array6();
+    gent_array7();
+    gent_array8();
+    gent_empty();
+    gent_group_comments();
+    gent_split_file();
+    gent_family();
+    gent_multi();
+    gent_large_objname();
+    gent_vlstr();
+    gent_vlenstr_array();
+    gent_char();
+    gent_attr_all();
+    gent_compound_complex();
+    gent_compound_complex2();
+    gent_named_dtype_attr();
+    gent_null_space();
+    gent_zero_dim_size();
+
+    gent_filters();
+    gent_fvalues();
+    gent_fcontents();
+    gent_string();
+    gent_aindices();
+    gent_longlinks();
+    gent_ldouble();
+    gent_binary();
+    gent_bigdims();
+    gent_hyperslab();
+    gent_group_creation_order();
+    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();
+    gent_compound_attr_intsizes();
+
+    gent_nested_compound_dt();
+    gent_intscalars();
+    gent_attr_intscalars();
+    gent_string_scalars();
+    gent_compound_int_array();
+    gent_compound_ints();
+    gent_intattrscalars();
+    gent_intsattrs();
+    gent_bitnopaquefields();
+
+    gent_intsfourdims();
+
+    gent_udfilter();
+
+    return 0;
+}
+
diff --git a/tools/test/h5dump/testh5dump.sh.in b/tools/test/h5dump/testh5dump.sh.in
new file mode 100644
index 0000000..cf5f246
--- /dev/null
+++ b/tools/test/h5dump/testh5dump.sh.in
@@ -0,0 +1,1343 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5dump tool
+
+srcdir=@srcdir@
+
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5dump
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=../../src/h5dump/h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../../src/h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../../src/h5import/h5import     # The h5import tool name
+H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
+
+RM='rm -rf'
+CMP='cmp'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# Skip plugin module to test missing filter
+ENVCMD="env HDF5_PLUGIN_PRELOAD=::"
+
+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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/std
+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/charsets.h5
+$SRC_H5DUMP_TESTFILES/file_space.h5
+$SRC_H5DUMP_TESTFILES/filter_fail.h5
+$SRC_H5DUMP_TESTFILES/packedbits.h5
+$SRC_H5DUMP_TESTFILES/taindices.h5
+$SRC_H5DUMP_TESTFILES/tall.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tarray1_big.h5
+$SRC_H5DUMP_TESTFILES/tarray2.h5
+$SRC_H5DUMP_TESTFILES/tarray3.h5
+$SRC_H5DUMP_TESTFILES/tarray4.h5
+$SRC_H5DUMP_TESTFILES/tarray5.h5
+$SRC_H5DUMP_TESTFILES/tarray6.h5
+$SRC_H5DUMP_TESTFILES/tarray7.h5
+$SRC_H5DUMP_TESTFILES/tarray8.h5
+$SRC_H5DUMP_TESTFILES/tattr.h5
+$SRC_H5DUMP_TESTFILES/tattr2.h5
+$SRC_H5DUMP_TESTFILES/tattr4_be.h5
+$SRC_H5DUMP_TESTFILES/tattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tattrreg.h5
+$SRC_H5DUMP_TESTFILES/tbigdims.h5
+$SRC_H5DUMP_TESTFILES/tbinary.h5
+$SRC_H5DUMP_TESTFILES/tchar.h5
+$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tcmpdintsize.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex2.h5
+$SRC_H5DUMP_TESTFILES/tdatareg.h5
+$SRC_H5DUMP_TESTFILES/tdset.h5
+$SRC_H5DUMP_TESTFILES/tempty.h5
+$SRC_H5DUMP_TESTFILES/tsoftlinks.h5
+$SRC_H5DUMP_TESTFILES/textlinkfar.h5
+$SRC_H5DUMP_TESTFILES/textlinksrc.h5
+$SRC_H5DUMP_TESTFILES/textlinktar.h5
+$SRC_H5DUMP_TESTFILES/textlink.h5
+$SRC_H5DUMP_TESTFILES/tfamily00000.h5
+$SRC_H5DUMP_TESTFILES/tfamily00001.h5
+$SRC_H5DUMP_TESTFILES/tfamily00002.h5
+$SRC_H5DUMP_TESTFILES/tfamily00003.h5
+$SRC_H5DUMP_TESTFILES/tfamily00004.h5
+$SRC_H5DUMP_TESTFILES/tfamily00005.h5
+$SRC_H5DUMP_TESTFILES/tfamily00006.h5
+$SRC_H5DUMP_TESTFILES/tfamily00007.h5
+$SRC_H5DUMP_TESTFILES/tfamily00008.h5
+$SRC_H5DUMP_TESTFILES/tfamily00009.h5
+$SRC_H5DUMP_TESTFILES/tfamily00010.h5
+$SRC_H5DUMP_TESTFILES/tfcontents1.h5
+$SRC_H5DUMP_TESTFILES/tfcontents2.h5
+$SRC_H5DUMP_TESTFILES/tfilters.h5
+$SRC_H5DUMP_TESTFILES/tfpformat.h5
+$SRC_H5DUMP_TESTFILES/tfvalues.h5
+$SRC_H5DUMP_TESTFILES/tgroup.h5
+$SRC_H5DUMP_TESTFILES/tgrp_comments.h5
+$SRC_H5DUMP_TESTFILES/thlink.h5
+$SRC_H5DUMP_TESTFILES/thyperslab.h5
+$SRC_H5DUMP_TESTFILES/tintsattrs.h5
+$SRC_H5DUMP_TESTFILES/tints4dims.h5
+$SRC_H5DUMP_TESTFILES/tlarge_objname.h5
+#$SRC_H5DUMP_TESTFILES/tldouble.h5
+$SRC_H5DUMP_TESTFILES/tlonglinks.h5
+$SRC_H5DUMP_TESTFILES/tloop.h5
+$SRC_H5DUMP_TESTFILES/tmulti-b.h5
+$SRC_H5DUMP_TESTFILES/tmulti-g.h5
+$SRC_H5DUMP_TESTFILES/tmulti-l.h5
+$SRC_H5DUMP_TESTFILES/tmulti-o.h5
+$SRC_H5DUMP_TESTFILES/tmulti-r.h5
+$SRC_H5DUMP_TESTFILES/tmulti-s.h5
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
+$SRC_H5DUMP_TESTFILES/tnestedcmpddt.h5
+$SRC_H5DUMP_TESTFILES/tno-subset.h5
+$SRC_H5DUMP_TESTFILES/tnullspace.h5
+$SRC_H5DUMP_TESTFILES/zerodim.h5
+$SRC_H5DUMP_TESTFILES/torderattr.h5
+$SRC_H5DUMP_TESTFILES/tordergr.h5
+$SRC_H5DUMP_TESTFILES/tsaf.h5
+$SRC_H5DUMP_TESTFILES/tscalarattrintsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarintattrsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarintsize.h5
+$SRC_H5DUMP_TESTFILES/tscalarstring.h5
+$SRC_H5DUMP_TESTFILES/tslink.h5
+$SRC_H5DUMP_TESTFILES/tsplit_file-m.h5
+$SRC_H5DUMP_TESTFILES/tsplit_file-r.h5
+$SRC_H5DUMP_TESTFILES/tstr.h5
+$SRC_H5DUMP_TESTFILES/tstr2.h5
+$SRC_H5DUMP_TESTFILES/tstr3.h5
+$SRC_H5DUMP_TESTFILES/tudlink.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
+$SRC_H5DUMP_TESTFILES/tvlenstr_array.h5
+$SRC_H5DUMP_TESTFILES/tvlstr.h5
+$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/non_existing.ddl
+$SRC_H5DUMP_TESTFILES/packedbits.ddl
+$SRC_H5DUMP_TESTFILES/tall-1.ddl
+$SRC_H5DUMP_TESTFILES/tall-2.ddl
+$SRC_H5DUMP_TESTFILES/tall-2A.ddl
+$SRC_H5DUMP_TESTFILES/tall-2A0.ddl
+$SRC_H5DUMP_TESTFILES/tall-2B.ddl
+$SRC_H5DUMP_TESTFILES/tall-3.ddl
+$SRC_H5DUMP_TESTFILES/tall-4s.ddl
+$SRC_H5DUMP_TESTFILES/tall-5s.ddl
+$SRC_H5DUMP_TESTFILES/tall-6.ddl
+$SRC_H5DUMP_TESTFILES/tall-6.exp
+$SRC_H5DUMP_TESTFILES/tall-7.ddl
+$SRC_H5DUMP_TESTFILES/tall-7N.ddl
+$SRC_H5DUMP_TESTFILES/tallfilters.ddl
+$SRC_H5DUMP_TESTFILES/tarray1.ddl
+$SRC_H5DUMP_TESTFILES/tarray1_big.ddl
+$SRC_H5DUMP_TESTFILES/tarray2.ddl
+$SRC_H5DUMP_TESTFILES/tarray3.ddl
+$SRC_H5DUMP_TESTFILES/tarray4.ddl
+$SRC_H5DUMP_TESTFILES/tarray5.ddl
+$SRC_H5DUMP_TESTFILES/tarray6.ddl
+$SRC_H5DUMP_TESTFILES/tarray7.ddl
+$SRC_H5DUMP_TESTFILES/tarray8.ddl
+$SRC_H5DUMP_TESTFILES/tattr-1.ddl
+$SRC_H5DUMP_TESTFILES/tattr-2.ddl
+$SRC_H5DUMP_TESTFILES/tattr-3.ddl
+$SRC_H5DUMP_TESTFILES/tattr-4_be.ddl
+$SRC_H5DUMP_TESTFILES/tattrcontents1.ddl
+$SRC_H5DUMP_TESTFILES/tattrcontents2.ddl
+$SRC_H5DUMP_TESTFILES/tattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tattrreg.ddl
+$SRC_H5DUMP_TESTFILES/tattrregR.ddl
+$SRC_H5DUMP_TESTFILES/tbin1.ddl
+$SRC_H5DUMP_TESTFILES/tbin1.ddl
+$SRC_H5DUMP_TESTFILES/tbin2.ddl
+$SRC_H5DUMP_TESTFILES/tbin3.ddl
+$SRC_H5DUMP_TESTFILES/tbin4.ddl
+$SRC_H5DUMP_TESTFILES/tbinregR.ddl
+$SRC_H5DUMP_TESTFILES/tbigdims.ddl
+$SRC_H5DUMP_TESTFILES/tboot1.ddl
+$SRC_H5DUMP_TESTFILES/tboot2.ddl
+$SRC_H5DUMP_TESTFILES/tboot2A.ddl
+$SRC_H5DUMP_TESTFILES/tboot2B.ddl
+$SRC_H5DUMP_TESTFILES/tchar1.ddl
+$SRC_H5DUMP_TESTFILES/tchunked.ddl
+$SRC_H5DUMP_TESTFILES/tcmpdattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tcmpdintsize.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-1.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-2.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-3.ddl
+$SRC_H5DUMP_TESTFILES/tcomp-4.ddl
+$SRC_H5DUMP_TESTFILES/tcompound_complex2.ddl
+$SRC_H5DUMP_TESTFILES/tcompact.ddl
+$SRC_H5DUMP_TESTFILES/tcontents.ddl
+$SRC_H5DUMP_TESTFILES/tcontiguos.ddl
+$SRC_H5DUMP_TESTFILES/tdatareg.ddl
+$SRC_H5DUMP_TESTFILES/tdataregR.ddl
+$SRC_H5DUMP_TESTFILES/tdeflate.ddl
+$SRC_H5DUMP_TESTFILES/tdset-1.ddl
+$SRC_H5DUMP_TESTFILES/tdset-2.ddl
+$SRC_H5DUMP_TESTFILES/tdset-3s.ddl
+$SRC_H5DUMP_TESTFILES/tempty.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubstart.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubcount.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubstride.ddl
+$SRC_H5DUMP_TESTFILES/texceedsubblock.ddl
+$SRC_H5DUMP_TESTFILES/texternal.ddl
+$SRC_H5DUMP_TESTFILES/textlinksrc.ddl
+$SRC_H5DUMP_TESTFILES/textlinkfar.ddl
+$SRC_H5DUMP_TESTFILES/textlink.ddl
+$SRC_H5DUMP_TESTFILES/tfamily.ddl
+$SRC_H5DUMP_TESTFILES/tfill.ddl
+$SRC_H5DUMP_TESTFILES/tfletcher32.ddl
+$SRC_H5DUMP_TESTFILES/tfpformat.ddl
+$SRC_H5DUMP_TESTFILES/tgroup-1.ddl
+$SRC_H5DUMP_TESTFILES/tgroup-2.ddl
+$SRC_H5DUMP_TESTFILES/tgrp_comments.ddl
+$SRC_H5DUMP_TESTFILES/thlink-1.ddl
+$SRC_H5DUMP_TESTFILES/thlink-2.ddl
+$SRC_H5DUMP_TESTFILES/thlink-3.ddl
+$SRC_H5DUMP_TESTFILES/thlink-4.ddl
+$SRC_H5DUMP_TESTFILES/thlink-5.ddl
+$SRC_H5DUMP_TESTFILES/thyperslab.ddl
+$SRC_H5DUMP_TESTFILES/tindicesno.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub1.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub2.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub3.ddl
+$SRC_H5DUMP_TESTFILES/tindicessub4.ddl
+$SRC_H5DUMP_TESTFILES/tindicesyes.ddl
+$SRC_H5DUMP_TESTFILES/tints4dims.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsBlock2.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsBlockEq.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsCount2.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsCountEq.ddl
+$SRC_H5DUMP_TESTFILES/tints4dimsStride2.ddl
+$SRC_H5DUMP_TESTFILES/tintsattrs.ddl
+$SRC_H5DUMP_TESTFILES/tlarge_objname.ddl
+#$SRC_H5DUMP_TESTFILES/tldouble.ddl
+$SRC_H5DUMP_TESTFILES/tlonglinks.ddl
+$SRC_H5DUMP_TESTFILES/tloop-1.ddl
+$SRC_H5DUMP_TESTFILES/tmulti.ddl
+$SRC_H5DUMP_TESTFILES/tmultifile.ddl
+$SRC_H5DUMP_TESTFILES/tqmarkfile.ddl
+$SRC_H5DUMP_TESTFILES/tstarfile.ddl
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.ddl
+$SRC_H5DUMP_TESTFILES/tnestcomp-1.ddl
+$SRC_H5DUMP_TESTFILES/tnestedcmpddt.ddl
+$SRC_H5DUMP_TESTFILES/tnbit.ddl
+$SRC_H5DUMP_TESTFILES/tnoattrdata.ddl
+$SRC_H5DUMP_TESTFILES/tnoattrddl.ddl
+$SRC_H5DUMP_TESTFILES/tnodata.ddl
+$SRC_H5DUMP_TESTFILES/tnoddl.ddl
+$SRC_H5DUMP_TESTFILES/tnoddlfile.ddl
+$SRC_H5DUMP_TESTFILES/tnoddlfile.exp
+$SRC_H5DUMP_TESTFILES/tno-subset.ddl
+$SRC_H5DUMP_TESTFILES/tnullspace.ddl
+$SRC_H5DUMP_TESTFILES/trawdatafile.ddl
+$SRC_H5DUMP_TESTFILES/trawdatafile.exp
+$SRC_H5DUMP_TESTFILES/trawssetfile.ddl
+$SRC_H5DUMP_TESTFILES/trawssetfile.exp
+$SRC_H5DUMP_TESTFILES/zerodim.ddl
+$SRC_H5DUMP_TESTFILES/tordergr1.ddl
+$SRC_H5DUMP_TESTFILES/tordergr2.ddl
+$SRC_H5DUMP_TESTFILES/tordergr3.ddl
+$SRC_H5DUMP_TESTFILES/tordergr4.ddl
+$SRC_H5DUMP_TESTFILES/tordergr5.ddl
+$SRC_H5DUMP_TESTFILES/torderattr1.ddl
+$SRC_H5DUMP_TESTFILES/torderattr2.ddl
+$SRC_H5DUMP_TESTFILES/torderattr3.ddl
+$SRC_H5DUMP_TESTFILES/torderattr4.ddl
+$SRC_H5DUMP_TESTFILES/tordercontents1.ddl
+$SRC_H5DUMP_TESTFILES/tordercontents2.ddl
+$SRC_H5DUMP_TESTFILES/torderlinks1.ddl
+$SRC_H5DUMP_TESTFILES/torderlinks2.ddl
+$SRC_H5DUMP_TESTFILES/tperror.ddl
+$SRC_H5DUMP_TESTFILES/treadfilter.ddl
+$SRC_H5DUMP_TESTFILES/treadintfilter.ddl
+$SRC_H5DUMP_TESTFILES/treference.ddl
+$SRC_H5DUMP_TESTFILES/tsaf.ddl
+$SRC_H5DUMP_TESTFILES/tscalarattrintsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarintattrsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarintsize.ddl
+$SRC_H5DUMP_TESTFILES/tscalarstring.ddl
+$SRC_H5DUMP_TESTFILES/tscaleoffset.ddl
+$SRC_H5DUMP_TESTFILES/tshuffle.ddl
+$SRC_H5DUMP_TESTFILES/tslink-1.ddl
+$SRC_H5DUMP_TESTFILES/tslink-2.ddl
+$SRC_H5DUMP_TESTFILES/tslink-D.ddl
+$SRC_H5DUMP_TESTFILES/tsplit_file.ddl
+$SRC_H5DUMP_TESTFILES/tstr-1.ddl
+$SRC_H5DUMP_TESTFILES/tstr-2.ddl
+$SRC_H5DUMP_TESTFILES/tstr2bin2.exp
+$SRC_H5DUMP_TESTFILES/tstr2bin6.exp
+$SRC_H5DUMP_TESTFILES/tstring.ddl
+$SRC_H5DUMP_TESTFILES/tstring2.ddl
+$SRC_H5DUMP_TESTFILES/tstringe.ddl
+$SRC_H5DUMP_TESTFILES/tszip.ddl
+$SRC_H5DUMP_TESTFILES/tudlink-1.ddl
+$SRC_H5DUMP_TESTFILES/tudlink-2.ddl
+$SRC_H5DUMP_TESTFILES/tuserfilter.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes1.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes2.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes3.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes4.ddl
+$SRC_H5DUMP_TESTFILES/tvldtypes5.ddl
+$SRC_H5DUMP_TESTFILES/tvlenstr_array.ddl
+$SRC_H5DUMP_TESTFILES/tvlstr.ddl
+$SRC_H5DUMP_TESTFILES/tvms.ddl
+$SRC_H5DUMP_TESTFILES/twidedisplay.ddl
+$SRC_H5DUMP_TESTFILES/twithddl.exp
+$SRC_H5DUMP_TESTFILES/twithddlfile.ddl
+$SRC_H5DUMP_TESTFILES/twithddlfile.exp
+$SRC_H5DUMP_TESTFILES/h5dump-help.txt
+$SRC_H5DUMP_TESTFILES/out3.h5import
+$SRC_H5DUMP_TESTFILES/tbinregR.exp
+"
+
+LIST_ERROR_TEST_FILES="
+${SRC_H5DUMP_ERRORFILES}/filter_fail.err
+${SRC_H5DUMP_ERRORFILES}/non_existing.err
+${SRC_H5DUMP_ERRORFILES}/tall-1.err
+${SRC_H5DUMP_ERRORFILES}/tall-2A.err
+${SRC_H5DUMP_ERRORFILES}/tall-2A0.err
+${SRC_H5DUMP_ERRORFILES}/tall-2B.err
+${SRC_H5DUMP_ERRORFILES}/tarray1_big.err
+${SRC_H5DUMP_ERRORFILES}/tattr-3.err
+${SRC_H5DUMP_ERRORFILES}/tattrregR.err
+${SRC_H5DUMP_ERRORFILES}/tcomp-3.err
+${SRC_H5DUMP_ERRORFILES}/tdataregR.err
+${SRC_H5DUMP_ERRORFILES}/tdset-2.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubblock.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubcount.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubstart.err
+${SRC_H5DUMP_ERRORFILES}/texceedsubstride.err
+${SRC_H5DUMP_ERRORFILES}/textlink.err
+${SRC_H5DUMP_ERRORFILES}/textlinkfar.err
+${SRC_H5DUMP_ERRORFILES}/textlinksrc.err
+${SRC_H5DUMP_ERRORFILES}/tgroup-2.err
+${SRC_H5DUMP_ERRORFILES}/torderlinks1.err
+${SRC_H5DUMP_ERRORFILES}/torderlinks2.err
+${SRC_H5DUMP_ERRORFILES}/tperror.err
+${SRC_H5DUMP_ERRORFILES}/tqmarkfile.err
+${SRC_H5DUMP_ERRORFILES}/tslink-D.err
+"
+
+#
+# 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=$SRC_H5DUMP_TESTFILES
+    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.
+# If $1 == ignorecase then do caseless CMP and DIFF.
+# ADD_H5_TEST
+TOOLTEST() {
+    # check if caseless compare and diff requested
+    if [ "$1" = ignorecase ]; then
+    caseless="-i"
+    # replace cmp with diff which runs much longer.
+    xCMP="$DIFF -i"
+    shift
+    else
+    caseless=""
+    # stick with faster cmp if ignorecase is not requested.
+    xCMP="$CMP"
+    fi
+
+    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 $xCMP $expect $actual > /dev/null 2>&1 ; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $caseless $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
+# ADD_H5_EXPORT_TEST
+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 TOOLTEST2 but compares generated file to expected ddl file
+#                   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
+# ADD_H5_TEST_EXPORT
+TOOLTEST2A() {
+
+    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
+    expectmeta="$TESTDIR/$1"
+    actualmeta="$TESTDIR/`basename $1 .exp`.txt"
+    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 $DIFF $expectdata $actualdata; then
+        if [ ! -f $expectmeta ]; then
+        # Create the expect meta file if it doesn't yet exist.
+          echo " CREATED"
+          cp $actualmeta $expectmeta
+        elif $CMP $expectmeta $actualmeta; then
+          echo " PASSED"
+        else
+          echo "*FAILED*"
+          echo "    Expected metafile (*.ddl) differs from actual metafile (*.txt)"
+          nerrors="`expr $nerrors + 1`"
+          test yes = "$verbose" && $DIFF $expectmeta $actualmeta |sed 's/^/    /'
+        fi
+      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 $actualmeta
+    fi
+
+}
+
+# same as TOOLTEST2 but only compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o with -b
+# ADD_H5_EXPORT_TEST
+TOOLTEST2B() {
+
+    expectdata="$TESTDIR/$1"
+    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 $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
+
+    # 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
+# ADD_H5ERR_MASK_TEST
+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
+
+}
+
+# same as TOOLTEST4 but disables plugin filter loading
+# silences extra error output on some platforms
+# ADD_H5ERR_MASK_TEST
+TOOLTEST5() {
+
+    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
+      $ENVCMD $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
+
+}
+# ADD_HELP_TEST
+TOOLTEST_HELP() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .txt`.out"
+    actual_err="$TESTDIR/`basename $1 .txt`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expectdata ]; then
+    # Create the expect data file if it doesn't yet exist.
+      echo " CREATED"
+      cp $actual $expect-CREATED
+    elif $CMP $expect $actual; then
+      echo " PASSED"
+    else
+      echo "*FAILED*"
+      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
+    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
+
+TOOLTEST_HELP h5dump-help.txt -h
+
+# test data output redirection
+TOOLTEST tnoddl.ddl --enable-error-stack --ddl -y packedbits.h5
+TOOLTEST tnodata.ddl --enable-error-stack --output packedbits.h5
+TOOLTEST tnoattrddl.ddl --enable-error-stack -O -y tattr.h5
+TOOLTEST tnoattrdata.ddl --enable-error-stack -A -o tattr.h5
+TOOLTEST2 trawdatafile.exp --enable-error-stack -y -o trawdatafile.txt packedbits.h5
+TOOLTEST2 tnoddlfile.exp --enable-error-stack -O -y -o tnoddlfile.txt packedbits.h5
+TOOLTEST2A twithddlfile.exp twithddl.exp --enable-error-stack --ddl=twithddl.txt -y -o twithddlfile.txt packedbits.h5
+TOOLTEST2 trawssetfile.exp --enable-error-stack -d "/dset1[1,1;;;]" -y -o trawssetfile.txt tdset.h5
+
+# test for maximum display datasets
+TOOLTEST twidedisplay.ddl --enable-error-stack -w0 packedbits.h5
+
+# test for signed/unsigned datasets
+TOOLTEST packedbits.ddl --enable-error-stack packedbits.h5
+# test for compound signed/unsigned datasets
+TOOLTEST tcmpdintsize.ddl --enable-error-stack tcmpdintsize.h5
+# test for signed/unsigned scalar datasets
+TOOLTEST tscalarintsize.ddl --enable-error-stack tscalarintsize.h5
+# test for signed/unsigned attributes
+TOOLTEST tattrintsize.ddl --enable-error-stack tattrintsize.h5
+# test for compound signed/unsigned attributes
+TOOLTEST tcmpdattrintsize.ddl --enable-error-stack tcmpdattrintsize.h5
+# test for signed/unsigned scalar attributes
+TOOLTEST tscalarattrintsize.ddl --enable-error-stack tscalarattrintsize.h5
+# test for signed/unsigned scalar datasets with attributes
+TOOLTEST tscalarintattrsize.ddl --enable-error-stack tscalarintattrsize.h5
+# test for signed/unsigned datasets attributes
+TOOLTEST tintsattrs.ddl --enable-error-stack tintsattrs.h5
+# test for string scalar dataset attribute
+TOOLTEST tscalarstring.ddl --enable-error-stack tscalarstring.h5
+# test for displaying groups
+TOOLTEST tgroup-1.ddl --enable-error-stack tgroup.h5
+# test for displaying the selected groups
+TOOLTEST4 tgroup-2.ddl --enable-error-stack --group=/g2 --group / -g /y tgroup.h5
+
+# test for displaying simple space datasets
+TOOLTEST tdset-1.ddl --enable-error-stack tdset.h5
+# test for displaying selected datasets
+TOOLTEST4 tdset-2.ddl --enable-error-stack -H -d dset1 -d /dset2 --dataset=dset3 tdset.h5
+
+# test for displaying attributes
+TOOLTEST tattr-1.ddl --enable-error-stack tattr.h5
+# test for displaying the selected attributes of string type and scalar space
+TOOLTEST tattr-2.ddl --enable-error-stack -a "/\/attr1" --attribute /attr4 --attribute=/attr5 tattr.h5
+TOOLTEST tattr-2.ddl --enable-error-stack -N "/\/attr1" --any_path /attr4 --any_path=/attr5 tattr.h5
+# test for header and error messages
+TOOLTEST4 tattr-3.ddl --enable-error-stack --header -a /attr2 --attribute=/attr tattr.h5
+# test for displaying at least 9 attributes on root from a BE machine
+TOOLTEST tattr-4_be.ddl --enable-error-stack tattr4_be.h5
+# test for displaying attributes in shared datatype (also in group and dataset)
+TOOLTEST tnamed_dtype_attr.ddl --enable-error-stack tnamed_dtype_attr.h5
+
+# test for displaying soft links and user-defined links
+TOOLTEST tslink-1.ddl --enable-error-stack tslink.h5
+TOOLTEST tudlink-1.ddl --enable-error-stack tudlink.h5
+# test for displaying the selected link
+TOOLTEST tslink-2.ddl --enable-error-stack -l slink2 tslink.h5
+TOOLTEST tslink-2.ddl --enable-error-stack -N slink2 tslink.h5
+TOOLTEST tudlink-2.ddl --enable-error-stack -l udlink2 tudlink.h5
+# test for displaying dangling soft links
+TOOLTEST4 tslink-D.ddl --enable-error-stack -d /slink1 tslink.h5
+
+# tests for hard links
+TOOLTEST thlink-1.ddl --enable-error-stack thlink.h5
+TOOLTEST thlink-2.ddl --enable-error-stack -d /g1/dset2 --dataset /dset1 --dataset=/g1/g1.1/dset3 thlink.h5
+TOOLTEST thlink-3.ddl --enable-error-stack -d /g1/g1.1/dset3 --dataset /g1/dset2 --dataset=/dset1 thlink.h5
+TOOLTEST thlink-4.ddl --enable-error-stack -g /g1 thlink.h5
+TOOLTEST thlink-4.ddl --enable-error-stack -N /g1 thlink.h5
+TOOLTEST thlink-5.ddl --enable-error-stack -d /dset1 -g /g2 -d /g1/dset2 thlink.h5
+TOOLTEST thlink-5.ddl --enable-error-stack -N /dset1 -N /g2 -N /g1/dset2 thlink.h5
+
+# tests for compound data types
+TOOLTEST tcomp-1.ddl --enable-error-stack tcompound.h5
+# test for named data types
+TOOLTEST tcomp-2.ddl --enable-error-stack -t /type1 --datatype /type2 --datatype=/group1/type3 tcompound.h5
+TOOLTEST tcomp-2.ddl --enable-error-stack -N /type1 --any_path /type2 --any_path=/group1/type3 tcompound.h5
+# test for unamed type
+TOOLTEST4 tcomp-3.ddl --enable-error-stack -t /#6632 -g /group2 tcompound.h5
+# test complicated compound datatype
+TOOLTEST tcomp-4.ddl --enable-error-stack tcompound_complex.h5
+TOOLTEST tcompound_complex.ddl --enable-error-stack tcompound_complex2.h5
+# tests for bitfields and opaque data types
+TOOLTEST tbitnopaque.ddl --enable-error-stack tbitnopaque.h5
+
+#test for the nested compound type
+TOOLTEST tnestcomp-1.ddl --enable-error-stack tnestedcomp.h5
+TOOLTEST tnestedcmpddt.ddl --enable-error-stack tnestedcmpddt.h5
+
+# test for options
+TOOLTEST4 tall-1.ddl --enable-error-stack tall.h5
+TOOLTEST tall-2.ddl --enable-error-stack --header -g /g1/g1.1 -a attr2 tall.h5
+TOOLTEST tall-3.ddl --enable-error-stack -d /g2/dset2.1 -l /g1/g1.2/g1.2.1/slink tall.h5
+TOOLTEST tall-3.ddl --enable-error-stack -N /g2/dset2.1 -N /g1/g1.2/g1.2.1/slink tall.h5
+TOOLTEST tall-7.ddl --enable-error-stack -a attr1 tall.h5
+TOOLTEST tall-7N.ddl --enable-error-stack -N attr1 tall.h5
+
+# test for loop detection
+TOOLTEST tloop-1.ddl --enable-error-stack tloop.h5
+
+# test for string
+TOOLTEST tstr-1.ddl --enable-error-stack tstr.h5
+TOOLTEST tstr-2.ddl --enable-error-stack tstr2.h5
+
+# test for file created by Lib SAF team
+TOOLTEST tsaf.ddl --enable-error-stack tsaf.h5
+
+# test for file with variable length data
+TOOLTEST tvldtypes1.ddl --enable-error-stack tvldtypes1.h5
+TOOLTEST tvldtypes2.ddl --enable-error-stack tvldtypes2.h5
+TOOLTEST tvldtypes3.ddl --enable-error-stack tvldtypes3.h5
+TOOLTEST tvldtypes4.ddl --enable-error-stack tvldtypes4.h5
+TOOLTEST tvldtypes5.ddl --enable-error-stack tvldtypes5.h5
+
+#test for file with variable length string data
+TOOLTEST tvlstr.ddl --enable-error-stack tvlstr.h5
+TOOLTEST tvlenstr_array.ddl --enable-error-stack tvlenstr_array.h5
+
+# test for files with array data
+TOOLTEST tarray1.ddl --enable-error-stack tarray1.h5
+# # added for bug# 2092 - tarray1_big.h
+TOOLTEST4 tarray1_big.ddl --enable-error-stack -R tarray1_big.h5
+TOOLTEST tarray2.ddl --enable-error-stack tarray2.h5
+TOOLTEST tarray3.ddl --enable-error-stack tarray3.h5
+TOOLTEST tarray4.ddl --enable-error-stack tarray4.h5
+TOOLTEST tarray5.ddl --enable-error-stack tarray5.h5
+TOOLTEST tarray6.ddl --enable-error-stack tarray6.h5
+TOOLTEST tarray7.ddl --enable-error-stack tarray7.h5
+TOOLTEST tarray8.ddl --enable-error-stack tarray8.h5
+
+# test for wildcards in filename (does not work with cmake)
+# inconsistent across platforms TOOLTEST3 tstarfile.ddl --enable-error-stack -H -d Dataset1 tarr*.h5
+#TOOLTEST4 tqmarkfile.ddl --enable-error-stack -H -d Dataset1 tarray?.h5
+TOOLTEST tmultifile.ddl --enable-error-stack -H -d Dataset1 tarray2.h5 tarray3.h5 tarray4.h5 tarray5.h5 tarray6.h5 tarray7.h5
+
+# test for files with empty data
+TOOLTEST tempty.ddl --enable-error-stack tempty.h5
+
+# test for files with groups that have comments
+TOOLTEST tgrp_comments.ddl --enable-error-stack tgrp_comments.h5
+
+# test the --filedriver flag
+TOOLTEST tsplit_file.ddl --enable-error-stack --filedriver=split tsplit_file
+TOOLTEST tfamily.ddl --enable-error-stack --filedriver=family tfamily%05d.h5
+TOOLTEST tmulti.ddl --enable-error-stack --filedriver=multi tmulti
+
+# test for files with group names which reach > 1024 bytes in size
+TOOLTEST tlarge_objname.ddl --enable-error-stack -w157 tlarge_objname.h5
+
+# test '-A' to suppress data but print attr's
+TOOLTEST4 tall-2A.ddl --enable-error-stack -A tall.h5
+
+# test '-A' to suppress attr's but print data
+TOOLTEST4 tall-2A0.ddl --enable-error-stack -A 0 tall.h5
+
+# test '-r' to print attributes in ASCII instead of decimal
+TOOLTEST4 tall-2B.ddl --enable-error-stack -A -r tall.h5
+
+# test Subsetting
+TOOLTEST tall-4s.ddl --enable-error-stack --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5
+TOOLTEST tall-5s.ddl --enable-error-stack -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5
+TOOLTEST tdset-3s.ddl --enable-error-stack -d "/dset1[1,1;;;]" tdset.h5
+TOOLTEST tno-subset.ddl --enable-error-stack --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0" tno-subset.h5
+
+TOOLTEST tints4dimsCount2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsBlock2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -c 1,1,1,1 -k 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsStride2.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,2,2 -c 2,2,2,2 tints4dims.h5
+TOOLTEST tints4dimsCountEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -k 1,2,1,1 -c 2,2,4,4 tints4dims.h5
+TOOLTEST tints4dimsBlockEq.ddl --enable-error-stack -d FourDimInts -s 0,0,0,0 -S 2,2,1,1 -c 2,2,1,1 -k 1,2,4,4 tints4dims.h5
+
+# test printing characters in ASCII instead of decimal
+TOOLTEST tchar1.ddl --enable-error-stack -r tchar.h5
+
+# test datatypes in ASCII and UTF8
+TOOLTEST charsets.ddl --enable-error-stack charsets.h5
+
+# rev. 2004
+
+# tests for super block
+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
+
+# test for file contents
+TOOLTEST tcontents.ddl --enable-error-stack -n tfcontents1.h5
+TOOLTEST tordercontents1.ddl --enable-error-stack -n --sort_by=name --sort_order=ascending tfcontents1.h5
+TOOLTEST tordercontents2.ddl --enable-error-stack -n --sort_by=name --sort_order=descending tfcontents1.h5
+TOOLTEST tattrcontents1.ddl --enable-error-stack -n 1 --sort_order=ascending tall.h5
+TOOLTEST tattrcontents2.ddl --enable-error-stack -n 1 --sort_order=descending tall.h5
+
+# tests for storage layout
+# compact
+TOOLTEST tcompact.ddl --enable-error-stack -H -p -d compact tfilters.h5
+# contiguous
+TOOLTEST tcontiguos.ddl --enable-error-stack -H -p -d contiguous tfilters.h5
+# chunked
+TOOLTEST tchunked.ddl --enable-error-stack -H -p -d chunked tfilters.h5
+# external
+TOOLTEST texternal.ddl --enable-error-stack -H -p -d external tfilters.h5
+
+# fill values
+TOOLTEST tfill.ddl --enable-error-stack -p tfvalues.h5
+
+# several datatype, with references , print path
+TOOLTEST treference.ddl --enable-error-stack tattr2.h5
+
+# escape/not escape non printable characters
+TOOLTEST tstringe.ddl --enable-error-stack -e tstr3.h5
+TOOLTEST tstring.ddl --enable-error-stack tstr3.h5
+# char data as ASCII with non escape
+TOOLTEST tstring2.ddl --enable-error-stack -r -d str4 tstr3.h5
+
+# array indices print/not print
+TOOLTEST tindicesyes.ddl --enable-error-stack taindices.h5
+TOOLTEST tindicesno.ddl --enable-error-stack -y taindices.h5
+
+########## array indices with subsetting
+# 1D case
+TOOLTEST tindicessub1.ddl --enable-error-stack -d 1d -s 1 -S 10 -c 2  -k 3 taindices.h5
+
+# 2D case
+TOOLTEST tindicessub2.ddl --enable-error-stack -d 2d -s 1,2  -S 3,3 -c 3,2 -k 2,2 taindices.h5
+
+# 3D case
+TOOLTEST tindicessub3.ddl --enable-error-stack -d 3d -s 0,1,2 -S 1,3,3 -c 2,2,2  -k 1,2,2  taindices.h5
+
+# 4D case
+TOOLTEST tindicessub4.ddl --enable-error-stack -d 4d -s 0,0,1,2  -c 2,2,3,2 -S 1,1,3,3 -k 1,1,2,2  taindices.h5
+
+#Exceed the dimensions for subsetting
+TOOLTEST texceedsubstart.ddl --enable-error-stack -d 1d -s 1,3 taindices.h5
+TOOLTEST texceedsubcount.ddl --enable-error-stack -d 1d -c 1,3 taindices.h5
+TOOLTEST texceedsubstride.ddl --enable-error-stack -d 1d -S 1,3 taindices.h5
+TOOLTEST texceedsubblock.ddl --enable-error-stack -d 1d -k 1,3 taindices.h5
+
+
+# tests for filters
+# SZIP
+TOOLTEST tszip.ddl --enable-error-stack -H -p -d szip tfilters.h5
+# deflate
+TOOLTEST tdeflate.ddl --enable-error-stack -H -p -d deflate tfilters.h5
+# shuffle
+TOOLTEST tshuffle.ddl --enable-error-stack -H -p -d shuffle tfilters.h5
+# fletcher32
+TOOLTEST tfletcher32.ddl --enable-error-stack -H -p -d fletcher32  tfilters.h5
+# nbit
+TOOLTEST tnbit.ddl --enable-error-stack -H -p -d nbit  tfilters.h5
+# scaleoffset
+TOOLTEST tscaleoffset.ddl --enable-error-stack -H -p -d scaleoffset  tfilters.h5
+# all
+TOOLTEST tallfilters.ddl --enable-error-stack -H -p -d all  tfilters.h5
+# user defined
+TOOLTEST tuserfilter.ddl --enable-error-stack -H  -p -d myfilter  tfilters.h5
+
+if test $USE_FILTER_DEFLATE = "yes" ; then
+  # data read internal filters
+  TOOLTEST treadintfilter.ddl --enable-error-stack -d deflate -d shuffle -d fletcher32 -d nbit -d scaleoffset tfilters.h5
+  if test $USE_FILTER_SZIP = "yes"; then
+    # data read
+    TOOLTEST treadfilter.ddl --enable-error-stack -d all -d szip tfilters.h5
+  fi
+fi
+
+# test for displaying objects with very long names
+TOOLTEST tlonglinks.ddl --enable-error-stack tlonglinks.h5
+
+# dimensions over 4GB, print boundary
+TOOLTEST tbigdims.ddl --enable-error-stack -d dset4gb -s 4294967284 -c 22 tbigdims.h5
+
+# hyperslab read
+TOOLTEST thyperslab.ddl --enable-error-stack thyperslab.h5
+
+
+#
+
+# test for displaying dataset and attribute of null space
+TOOLTEST tnullspace.ddl --enable-error-stack tnullspace.h5
+
+# test for displaying dataset and attribute of space with 0 dimension size
+TOOLTEST zerodim.ddl --enable-error-stack zerodim.h5
+
+# test for long double (some systems do not have long double)
+#TOOLTEST tldouble.ddl --enable-error-stack tldouble.h5
+
+# test for vms
+TOOLTEST tvms.ddl --enable-error-stack tvms.h5
+
+# test for binary output
+TOOLTEST tbin1.ddl --enable-error-stack -d integer -o out1.bin -b LE tbinary.h5
+
+# test for string binary output
+TOOLTEST2B tstr2bin2.exp --enable-error-stack -d /g2/dset2 -b -o tstr2bin2.txt tstr2.h5
+TOOLTEST2B tstr2bin6.exp --enable-error-stack -d /g6/dset6 -b -o tstr2bin6.txt tstr2.h5
+
+# NATIVE default. the NATIVE test can be validated with h5import/h5diff
+TOOLTEST   tbin1.ddl --enable-error-stack -d integer -o out1.bin  -b  tbinary.h5
+IMPORTTEST out1.bin -c out3.h5import -o out1.h5
+DIFFTEST   tbinary.h5 out1.h5 /integer /integer
+# Same but use h5dump as input to h5import
+IMPORTTEST out1.bin -c tbin1.ddl -o out1D.h5
+DIFFTEST   tbinary.h5 out1D.h5 /integer /integer
+
+TOOLTEST   tbin2.ddl --enable-error-stack -b BE -d float  -o out2.bin  tbinary.h5
+
+# the NATIVE test can be validated with h5import/h5diff
+TOOLTEST   tbin3.ddl --enable-error-stack -d integer -o out3.bin -b NATIVE tbinary.h5
+IMPORTTEST out3.bin -c out3.h5import -o out3.h5
+DIFFTEST   tbinary.h5 out3.h5 /integer /integer
+# Same but use h5dump as input to h5import
+IMPORTTEST out3.bin -c tbin3.ddl -o out3D.h5
+DIFFTEST   tbinary.h5 out3D.h5 /integer /integer
+
+TOOLTEST   tbin4.ddl --enable-error-stack -d double  -b FILE -o out4.bin    tbinary.h5
+
+# Clean up binary output files
+if test -z "$HDF5_NOCLEANUP"; then
+ rm -f out[1-4].bin
+ rm -f out1.h5
+ rm -f out3.h5
+fi
+
+# test for dataset region references
+TOOLTEST  tdatareg.ddl --enable-error-stack tdatareg.h5
+TOOLTEST4 tdataregR.ddl --enable-error-stack -R tdatareg.h5
+TOOLTEST  tattrreg.ddl --enable-error-stack tattrreg.h5
+TOOLTEST4 tattrregR.ddl --enable-error-stack -R tattrreg.h5
+TOOLTEST2 tbinregR.exp --enable-error-stack -d /Dataset1 -s 0 -R -y -o tbinregR.txt    tdatareg.h5
+
+# Clean up text output files
+if test -z "$HDF5_NOCLEANUP"; then
+ rm -f tbinregR.txt
+fi
+
+# tests for group creation order
+# "1" tracked, "2" name, root tracked
+TOOLTEST tordergr1.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=ascending tordergr.h5
+TOOLTEST tordergr2.ddl --enable-error-stack --group=1 --sort_by=creation_order --sort_order=descending tordergr.h5
+TOOLTEST tordergr3.ddl --enable-error-stack -g 2 -q name -z ascending tordergr.h5
+TOOLTEST tordergr4.ddl --enable-error-stack -g 2 -q name -z descending tordergr.h5
+TOOLTEST tordergr5.ddl --enable-error-stack -q creation_order tordergr.h5
+
+# tests for attribute order
+TOOLTEST torderattr1.ddl --enable-error-stack -H --sort_by=name --sort_order=ascending torderattr.h5
+TOOLTEST torderattr2.ddl --enable-error-stack -H --sort_by=name --sort_order=descending torderattr.h5
+TOOLTEST torderattr3.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=ascending torderattr.h5
+TOOLTEST torderattr4.ddl --enable-error-stack -H --sort_by=creation_order --sort_order=descending torderattr.h5
+
+# tests for link references and order
+TOOLTEST4 torderlinks1.ddl --enable-error-stack --sort_by=name --sort_order=ascending tfcontents1.h5
+TOOLTEST4 torderlinks2.ddl --enable-error-stack --sort_by=name --sort_order=descending tfcontents1.h5
+
+# tests for floating point user defined printf format
+TOOLTEST tfpformat.ddl --enable-error-stack -m %.7f tfpformat.h5
+
+# tests for traversal of external links
+TOOLTEST4 textlinksrc.ddl --enable-error-stack textlinksrc.h5
+TOOLTEST4 textlinkfar.ddl --enable-error-stack textlinkfar.h5
+
+# test for dangling external links
+TOOLTEST4 textlink.ddl --enable-error-stack textlink.h5
+
+# test for error stack display (BZ2048)
+TOOLTEST5 filter_fail.ddl --enable-error-stack filter_fail.h5
+
+# test for -o -y for dataset with attributes
+TOOLTEST2 tall-6.exp --enable-error-stack -y -o tall-6.txt -d /g1/g1.1/dset1.1.1 tall.h5
+
+# test for non-existing file
+TOOLTEST3 non_existing.ddl --enable-error-stack tgroup.h5 non_existing.h5
+
+# 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/test/h5dump/testh5dumppbits.sh.in b/tools/test/h5dump/testh5dumppbits.sh.in
new file mode 100644
index 0000000..3b9b078
--- /dev/null
+++ b/tools/test/h5dump/testh5dumppbits.sh.in
@@ -0,0 +1,596 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 packed bits 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=../../src/h5dump/h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../../src/h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../../src/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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/pbits
+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/packedbits.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/pbits/tnofilename-with-packed-bits.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsArray.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCompound.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIncomplete.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongLengthExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLengthPositive.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsMax.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsMaxExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsCharOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsIntOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsLongOffsetExceeded.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOffsetNegative.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsOverlapped.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedIntWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedIntWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole1.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole1.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLongWhole63.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLongWhole63.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong32.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong32.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSigned2.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsigned2.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedInt4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedInt4.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLong8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLong8.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsSignedLongLong16.ddl
+$SRC_H5DUMP_TESTFILES/pbits/tpbitsUnsignedLongLong16.ddl
+"
+
+LIST_ERROR_TEST_FILES="
+${SRC_H5DUMP_ERRORFILES}/tnofilename-with-packed-bits.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsCharLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsCharOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIncomplete.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIntLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsIntOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLengthPositive.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLongLengthExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsLongOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsMaxExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetExceeded.err
+${SRC_H5DUMP_ERRORFILES}/tpbitsOffsetNegative.err
+"
+
+#
+# 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=$SRC_H5DUMP_TESTFILES/pbits
+    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 packed bits ######
+
+# test failure handling
+# Missing file name
+TOOLTEST tnofilename-with-packed-bits.ddl --enable-error-stack
+# Limits:
+# Maximum number of packed bits is 8 (for now).
+# Maximum integer size is 64 (for now).
+# Maximun Offset is 63 (Maximum size - 1).
+# Maximum Offset+Length is 64 (Maximum size).
+# Tests:
+# Normal operation on both signed and unsigned int datasets.
+# Sanity check
+# Their rawdata output should be the same.
+TOOLTEST tpbitsSignedWhole.ddl --enable-error-stack -d /DS08BITS -M 0,8 packedbits.h5
+TOOLTEST tpbitsUnsignedWhole.ddl --enable-error-stack -d /DU08BITS -M 0,8 packedbits.h5
+TOOLTEST tpbitsSignedIntWhole.ddl --enable-error-stack -d /DS16BITS -M 0,16 packedbits.h5
+TOOLTEST tpbitsUnsignedIntWhole.ddl --enable-error-stack -d /DU16BITS -M 0,16 packedbits.h5
+TOOLTEST tpbitsSignedLongWhole.ddl --enable-error-stack -d /DS32BITS -M 0,32 packedbits.h5
+TOOLTEST tpbitsUnsignedLongWhole.ddl --enable-error-stack -d /DU32BITS -M 0,32 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole.ddl --enable-error-stack -d /DS64BITS -M 0,64 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole.ddl --enable-error-stack -d /DU64BITS -M 0,64 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole63.ddl --enable-error-stack -d /DS64BITS -M 0,63 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole63.ddl --enable-error-stack -d /DU64BITS -M 0,63 packedbits.h5
+TOOLTEST tpbitsSignedLongLongWhole1.ddl --enable-error-stack -d /DS64BITS -M 1,63 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLongWhole1.ddl --enable-error-stack -d /DU64BITS -M 1,63 packedbits.h5
+# Half sections
+TOOLTEST tpbitsSigned4.ddl --enable-error-stack -d /DS08BITS -M 0,4,4,4 packedbits.h5
+TOOLTEST tpbitsUnsigned4.ddl --enable-error-stack -d /DU08BITS -M 0,4,4,4 packedbits.h5
+TOOLTEST tpbitsSignedInt8.ddl --enable-error-stack -d /DS16BITS -M 0,8,8,8 packedbits.h5
+TOOLTEST tpbitsUnsignedInt8.ddl --enable-error-stack -d /DU16BITS -M 0,8,8,8 packedbits.h5
+TOOLTEST tpbitsSignedLong16.ddl --enable-error-stack -d /DS32BITS -M 0,16,16,16 packedbits.h5
+TOOLTEST tpbitsUnsignedLong16.ddl --enable-error-stack -d /DU32BITS -M 0,16,16,16 packedbits.h5
+TOOLTEST tpbitsSignedLongLong32.ddl --enable-error-stack -d /DS64BITS -M 0,32,32,32 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong32.ddl --enable-error-stack -d /DU64BITS -M 0,32,32,32 packedbits.h5
+# Quarter sections
+TOOLTEST tpbitsSigned2.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
+TOOLTEST tpbitsUnsigned2.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,2,4,2,6,2 packedbits.h5
+TOOLTEST tpbitsSignedInt4.ddl --enable-error-stack -d /DS16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
+TOOLTEST tpbitsUnsignedInt4.ddl --enable-error-stack -d /DU16BITS -M 0,4,4,4,8,4,12,4 packedbits.h5
+TOOLTEST tpbitsSignedLong8.ddl --enable-error-stack -d /DS32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
+TOOLTEST tpbitsUnsignedLong8.ddl --enable-error-stack -d /DU32BITS -M 0,8,8,8,16,8,24,8 packedbits.h5
+TOOLTEST tpbitsSignedLongLong16.ddl --enable-error-stack -d /DS64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong16.ddl --enable-error-stack -d /DU64BITS -M 0,16,16,16,32,16,48,16 packedbits.h5
+# Begin and End
+TOOLTEST tpbitsSigned.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,6 packedbits.h5
+TOOLTEST tpbitsUnsigned.ddl --enable-error-stack -d /DU08BITS -M 0,2,2,6 packedbits.h5
+TOOLTEST tpbitsSignedInt.ddl --enable-error-stack -d /DS16BITS -M 0,2,10,6 packedbits.h5
+TOOLTEST tpbitsUnsignedInt.ddl --enable-error-stack -d /DU16BITS -M 0,2,10,6 packedbits.h5
+TOOLTEST tpbitsSignedLong.ddl --enable-error-stack -d /DS32BITS -M 0,2,26,6 packedbits.h5
+TOOLTEST tpbitsUnsignedLong.ddl --enable-error-stack -d /DU32BITS -M 0,2,26,6 packedbits.h5
+TOOLTEST tpbitsSignedLongLong.ddl --enable-error-stack -d /DS64BITS -M 0,2,58,6 packedbits.h5
+TOOLTEST tpbitsUnsignedLongLong.ddl --enable-error-stack -d /DU64BITS -M 0,2,58,6 packedbits.h5
+# Overlapped packed bits.
+TOOLTEST tpbitsOverlapped.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,0,3 packedbits.h5
+# Maximum number of packed bits.
+TOOLTEST tpbitsMax.ddl --enable-error-stack -d /DS08BITS -M 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
+# Compound type.
+TOOLTEST tpbitsCompound.ddl --enable-error-stack -d /dset1 -M 0,1,1,1 tcompound.h5
+# Array type.
+TOOLTEST tpbitsArray.ddl --enable-error-stack -d /Dataset1 -M 0,1,1,1 tarray1.h5
+# Test Error handling.
+# Too many packed bits requested. Max is 8 for now.
+TOOLTEST tpbitsMaxExceeded.ddl --enable-error-stack -d /DS08BITS -M 0,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1 packedbits.h5
+# Offset too large. Max is 7 (8-1) for now.
+TOOLTEST tpbitsOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 64,1 packedbits.h5
+TOOLTEST tpbitsCharOffsetExceeded.ddl --enable-error-stack -d /DS08BITS -M 8,1 packedbits.h5
+TOOLTEST tpbitsIntOffsetExceeded.ddl --enable-error-stack -d /DS16BITS -M 16,1 packedbits.h5
+TOOLTEST tpbitsLongOffsetExceeded.ddl --enable-error-stack -d /DS32BITS -M 32,1 packedbits.h5
+# Bad offset, must not be negative.
+TOOLTEST tpbitsOffsetNegative.ddl --enable-error-stack -d /DS08BITS -M -1,1 packedbits.h5
+# Bad length, must not be positive.
+TOOLTEST tpbitsLengthPositive.ddl --enable-error-stack -d /DS08BITS -M 4,0 packedbits.h5
+# Offset+Length is too large. Max is 8 for now.
+TOOLTEST tpbitsLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 37,28 packedbits.h5
+TOOLTEST tpbitsCharLengthExceeded.ddl --enable-error-stack -d /DS08BITS -M 2,7 packedbits.h5
+TOOLTEST tpbitsIntLengthExceeded.ddl --enable-error-stack -d /DS16BITS -M 10,7 packedbits.h5
+TOOLTEST tpbitsLongLengthExceeded.ddl --enable-error-stack -d /DS32BITS -M 26,7 packedbits.h5
+# Incomplete pair of packed bits request.
+TOOLTEST tpbitsIncomplete.ddl --enable-error-stack -d /DS08BITS -M 0,2,2,1,0,2,2, packedbits.h5
+
+# 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/test/h5dump/testh5dumpvds.sh.in b/tools/test/h5dump/testh5dumpvds.sh.in
new file mode 100644
index 0000000..63c0d85
--- /dev/null
+++ b/tools/test/h5dump/testh5dumpvds.sh.in
@@ -0,0 +1,521 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=../../src/h5dump/h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../../src/h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../../src/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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/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
+$SRC_H5DUMP_TESTFILES/vds/a.h5
+$SRC_H5DUMP_TESTFILES/vds/b.h5
+$SRC_H5DUMP_TESTFILES/vds/c.h5
+$SRC_H5DUMP_TESTFILES/vds/d.h5
+$SRC_H5DUMP_TESTFILES/vds/vds-percival-unlim-maxmin.h5
+$SRC_H5DUMP_TESTFILES/vds/f-0.h5
+$SRC_H5DUMP_TESTFILES/vds/f-3.h5
+$SRC_H5DUMP_TESTFILES/vds/vds-eiger.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
+$SRC_H5DUMP_TESTFILES/vds/vds-first.ddl
+$SRC_H5DUMP_TESTFILES/vds/vds-gap1.ddl
+$SRC_H5DUMP_TESTFILES/vds/vds-gap2.ddl
+$SRC_H5DUMP_TESTFILES/vds/vds_layout-eiger.ddl
+$SRC_H5DUMP_TESTFILES/vds/vds_layout-maxmin.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=$SRC_H5DUMP_TESTFILES/vds
+    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
+    TOOLTEST vds-first.ddl --vds-view-first-missing --enable-error-stack vds-percival-unlim-maxmin.h5
+    TOOLTEST vds-gap1.ddl -d /VDS-Eiger --vds-gap-size=1 --enable-error-stack vds-eiger.h5
+    TOOLTEST vds-gap2.ddl --vds-gap-size=2 --enable-error-stack vds-eiger.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
+    TOOLTEST vds_layout-eiger.ddl -p --enable-error-stack vds-eiger.h5
+    TOOLTEST vds_layout-maxmin.ddl -p --enable-error-stack vds-percival-unlim-maxmin.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/test/h5dump/testh5dumpxml.sh.in b/tools/test/h5dump/testh5dumpxml.sh.in
new file mode 100644
index 0000000..5a69845
--- /dev/null
+++ b/tools/test/h5dump/testh5dumpxml.sh.in
@@ -0,0 +1,386 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5dump tool
+
+srcdir=@srcdir@
+
+TESTNAME=h5dumpxml
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=../../src/h5dump/h5dump               # The tool name
+DUMPER_BIN=`pwd`/$DUMPER    # The path of the 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_H5DIFF_TESTFILES="$SRC_TOOLS/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/xml
+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_XML="
+$SRC_H5DUMP_TESTFILES/tall.h5
+$SRC_H5DUMP_TESTFILES/tarray1.h5
+$SRC_H5DUMP_TESTFILES/tarray2.h5
+$SRC_H5DUMP_TESTFILES/tarray3.h5
+$SRC_H5DUMP_TESTFILES/tarray6.h5
+$SRC_H5DUMP_TESTFILES/tarray7.h5
+$SRC_H5DUMP_TESTFILES/tattr.h5
+$SRC_H5DUMP_TESTFILES/tbitfields.h5
+$SRC_H5DUMP_TESTFILES/tcompound.h5
+$SRC_H5DUMP_TESTFILES/tcompound2.h5
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5
+$SRC_H5DUMP_TESTFILES/tdatareg.h5
+$SRC_H5DUMP_TESTFILES/tdset.h5
+$SRC_H5DUMP_TESTFILES/tdset2.h5
+$SRC_H5DUMP_TESTFILES/tempty.h5
+$SRC_H5DUMP_TESTFILES/tenum.h5
+$SRC_H5DUMP_TESTFILES/textlink.h5
+$SRC_H5DUMP_TESTFILES/tfpformat.h5
+$SRC_H5DUMP_TESTFILES/tgroup.h5
+$SRC_H5DUMP_TESTFILES/thlink.h5
+$SRC_H5DUMP_TESTFILES/tloop.h5
+$SRC_H5DUMP_TESTFILES/tloop2.h5
+$SRC_H5DUMP_TESTFILES/tmany.h5
+$SRC_H5DUMP_TESTFILES/tname-amp.h5
+$SRC_H5DUMP_TESTFILES/tname-apos.h5
+$SRC_H5DUMP_TESTFILES/tname-gt.h5
+$SRC_H5DUMP_TESTFILES/tname-lt.h5
+$SRC_H5DUMP_TESTFILES/tname-quot.h5
+$SRC_H5DUMP_TESTFILES/tname-sp.h5
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5
+$SRC_H5DUMP_TESTFILES/tnodata.h5
+$SRC_H5DUMP_TESTFILES/tobjref.h5
+$SRC_H5DUMP_TESTFILES/topaque.h5
+$SRC_H5DUMP_TESTFILES/torderattr.h5
+$SRC_H5DUMP_TESTFILES/tref.h5
+$SRC_H5DUMP_TESTFILES/tref-escapes.h5
+$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5
+$SRC_H5DUMP_TESTFILES/tsaf.h5
+$SRC_H5DUMP_TESTFILES/tslink.h5
+$SRC_H5DUMP_TESTFILES/tstring.h5
+$SRC_H5DUMP_TESTFILES/tstring-at.h5
+$SRC_H5DUMP_TESTFILES/tstr.h5
+$SRC_H5DUMP_TESTFILES/tstr2.h5
+$SRC_H5DUMP_TESTFILES/tudlink.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5
+$SRC_H5DUMP_TESTFILES/tvlstr.h5
+"
+
+LIST_OTHER_TEST_FILES_XML="
+$SRC_H5DUMP_TESTFILES/tall.h5.xml
+$SRC_H5DUMP_TESTFILES/tall-2A.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray1.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray2.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray3.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray6.h5.xml
+$SRC_H5DUMP_TESTFILES/tarray7.h5.xml
+$SRC_H5DUMP_TESTFILES/tattr.h5.xml
+$SRC_H5DUMP_TESTFILES/tbitfields.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound_complex.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound.h5.xml
+$SRC_H5DUMP_TESTFILES/tcompound2.h5.xml
+$SRC_H5DUMP_TESTFILES/tdatareg.h5.xml
+$SRC_H5DUMP_TESTFILES/tdset.h5.xml
+$SRC_H5DUMP_TESTFILES/tdset2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-dtd-uri.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-nons-uri.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-ns.h5.xml
+$SRC_H5DUMP_TESTFILES/tempty-ns-2.h5.xml
+$SRC_H5DUMP_TESTFILES/tenum.h5.xml
+$SRC_H5DUMP_TESTFILES/textlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tfpformat.h5.xml
+$SRC_H5DUMP_TESTFILES/tgroup.h5.xml
+$SRC_H5DUMP_TESTFILES/thlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tloop.h5.xml
+$SRC_H5DUMP_TESTFILES/tloop2.h5.xml
+$SRC_H5DUMP_TESTFILES/tmany.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-amp.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-apos.h5.xml
+$SRC_H5DUMP_TESTFILES/tnamed_dtype_attr.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-gt.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-lt.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-quot.h5.xml
+$SRC_H5DUMP_TESTFILES/tname-sp.h5.xml
+$SRC_H5DUMP_TESTFILES/tnestedcomp.h5.xml
+$SRC_H5DUMP_TESTFILES/tnodata.h5.xml
+$SRC_H5DUMP_TESTFILES/tobjref.h5.xml
+$SRC_H5DUMP_TESTFILES/topaque.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr1.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr2.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr3.h5.xml
+$SRC_H5DUMP_TESTFILES/torderattr4.h5.xml
+$SRC_H5DUMP_TESTFILES/tref.h5.xml
+$SRC_H5DUMP_TESTFILES/tref-escapes.h5.xml
+$SRC_H5DUMP_TESTFILES/tref-escapes-at.h5.xml
+$SRC_H5DUMP_TESTFILES/tsaf.h5.xml
+$SRC_H5DUMP_TESTFILES/tslink.h5.xml
+$SRC_H5DUMP_TESTFILES/tstr.h5.xml
+$SRC_H5DUMP_TESTFILES/tstr2.h5.xml
+$SRC_H5DUMP_TESTFILES/tstring.h5.xml
+$SRC_H5DUMP_TESTFILES/tstring-at.h5.xml
+$SRC_H5DUMP_TESTFILES/tudlink.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes1.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes2.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes3.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes4.h5.xml
+$SRC_H5DUMP_TESTFILES/tvldtypes5.h5.xml
+$SRC_H5DUMP_TESTFILES/tvlstr.h5.xml
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES_XML $LIST_OTHER_TEST_FILES_XML"
+
+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=$SRC_H5DUMP_TESTFILES
+    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 .xml`.out"
+   actual_err="$TESTDIR/`basename $1 .xml`.err"
+   shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+    cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+
+   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 (*.xml) 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
+   fi
+}
+
+# Print a "SKIP" message    
+SKIP() {
+         TESTING $DUMPER $@
+          echo  " -SKIP-"
+}
+
+
+##############################################################################
+##############################################################################
+###        T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# test XML
+TOOLTEST tall.h5.xml --xml tall.h5
+TOOLTEST tattr.h5.xml --xml tattr.h5
+TOOLTEST tbitfields.h5.xml --xml tbitfields.h5
+TOOLTEST tcompound.h5.xml --xml tcompound.h5
+TOOLTEST tcompound2.h5.xml --xml tcompound2.h5
+TOOLTEST tdatareg.h5.xml --xml tdatareg.h5
+TOOLTEST tdset.h5.xml --xml tdset.h5
+TOOLTEST tdset2.h5.xml --xml tdset2.h5
+TOOLTEST tenum.h5.xml --xml tenum.h5
+TOOLTEST tgroup.h5.xml --xml tgroup.h5
+TOOLTEST thlink.h5.xml --xml thlink.h5
+TOOLTEST tloop.h5.xml --xml tloop.h5
+TOOLTEST tloop2.h5.xml --xml tloop2.h5
+TOOLTEST tmany.h5.xml --xml tmany.h5
+TOOLTEST tnestedcomp.h5.xml --xml tnestedcomp.h5
+TOOLTEST tcompound_complex.h5.xml --xml tcompound_complex.h5
+TOOLTEST tobjref.h5.xml --xml tobjref.h5
+TOOLTEST topaque.h5.xml --xml topaque.h5
+TOOLTEST tslink.h5.xml --xml tslink.h5
+TOOLTEST tudlink.h5.xml --xml tudlink.h5
+TOOLTEST textlink.h5.xml --xml textlink.h5
+TOOLTEST tstr.h5.xml --xml tstr.h5
+TOOLTEST tstr2.h5.xml --xml tstr2.h5
+TOOLTEST tref.h5.xml --xml tref.h5
+TOOLTEST tname-amp.h5.xml --xml tname-amp.h5
+TOOLTEST tname-apos.h5.xml --xml tname-apos.h5
+TOOLTEST tname-gt.h5.xml --xml tname-gt.h5
+TOOLTEST tname-lt.h5.xml --xml tname-lt.h5
+TOOLTEST tname-quot.h5.xml --xml tname-quot.h5
+TOOLTEST tname-sp.h5.xml --xml tname-sp.h5
+TOOLTEST tstring.h5.xml --xml tstring.h5
+TOOLTEST tstring-at.h5.xml --xml tstring-at.h5
+TOOLTEST tref-escapes.h5.xml --xml tref-escapes.h5
+TOOLTEST tref-escapes-at.h5.xml --xml tref-escapes-at.h5
+TOOLTEST tnodata.h5.xml --xml tnodata.h5
+TOOLTEST tarray1.h5.xml --xml tarray1.h5
+TOOLTEST tarray2.h5.xml --xml tarray2.h5
+TOOLTEST tarray3.h5.xml --xml tarray3.h5
+TOOLTEST tarray6.h5.xml --xml tarray6.h5
+TOOLTEST tarray7.h5.xml --xml tarray7.h5
+TOOLTEST tvldtypes1.h5.xml --xml tvldtypes1.h5
+TOOLTEST tvldtypes2.h5.xml --xml tvldtypes2.h5
+TOOLTEST tvldtypes3.h5.xml --xml tvldtypes3.h5
+TOOLTEST tvldtypes4.h5.xml --xml tvldtypes4.h5
+TOOLTEST tvldtypes5.h5.xml --xml tvldtypes5.h5
+TOOLTEST tvlstr.h5.xml --xml tvlstr.h5
+TOOLTEST tsaf.h5.xml --xml tsaf.h5
+TOOLTEST tempty.h5.xml --xml tempty.h5
+TOOLTEST tnamed_dtype_attr.h5.xml --xml tnamed_dtype_attr.h5
+##Test dataset and attribute of null space.  Commented out:
+## wait until the XML schema is updated for null space. 
+##TOOLTEST tnullspace.h5.xml --xml tnulspace.h5
+
+# other options for xml
+
+TOOLTEST tempty-dtd.h5.xml --xml --use-dtd tempty.h5
+TOOLTEST tempty-dtd-2.h5.xml --xml -u tempty.h5
+TOOLTEST tempty-nons.h5.xml --xml -X ":" tempty.h5
+TOOLTEST tempty-nons-2.h5.xml --xml --xml-ns=":" tempty.h5
+
+## Some of these combinations are syntactically correct but
+##  the URLs are dummies 
+TOOLTEST tempty-ns.h5.xml --xml -X "thing:" tempty.h5
+TOOLTEST tempty-ns-2.h5.xml --xml --xml-ns="thing:" tempty.h5
+TOOLTEST tempty-nons-uri.h5.xml --xml --xml-ns=":" --xml-dtd="http://somewhere.net" tempty.h5
+TOOLTEST tempty-dtd-uri.h5.xml --xml --use-dtd --xml-dtd="http://somewhere.net" tempty.h5
+
+TOOLTEST tall-2A.h5.xml --xml -A tall.h5
+
+
+# tests for attribute order
+TOOLTEST torderattr1.h5.xml --xml -H --sort_by=name --sort_order=ascending torderattr.h5
+TOOLTEST torderattr2.h5.xml --xml -H --sort_by=name --sort_order=descending torderattr.h5
+TOOLTEST torderattr3.h5.xml --xml -H --sort_by=creation_order --sort_order=ascending torderattr.h5
+TOOLTEST torderattr4.h5.xml --xml -H --sort_by=creation_order --sort_order=descending torderattr.h5
+
+# tests for floating point user defined printf format
+TOOLTEST tfpformat.h5.xml -u -m %.7f tfpformat.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/test/h5format_convert/CMakeLists.txt b/tools/test/h5format_convert/CMakeLists.txt
new file mode 100644
index 0000000..7e47b13
--- /dev/null
+++ b/tools/test/h5format_convert/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5FC)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the h5format_convert test executables
+  # --------------------------------------------------------------------
+  add_executable (h5fc_chk_idx ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/h5fc_chk_idx.c)
+  TARGET_NAMING (h5fc_chk_idx STATIC)
+  TARGET_C_PROPERTIES (h5fc_chk_idx STATIC " " " ")
+  target_link_libraries (h5fc_chk_idx ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (h5fc_chk_idx PROPERTIES FOLDER tools)
+
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5fc_gentest ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/h5fc_gentest.c)
+    TARGET_NAMING (h5fc_gentest STATIC)
+    TARGET_C_PROPERTIES (h5fc_gentest STATIC " " " ")
+    target_link_libraries (h5fc_gentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+    set_target_properties (h5fc_gentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5fc_gentest COMMAND $<TARGET_FILE:h5fc_gentest>)
+  endif ()
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5format_convert/CMakeTests.cmake b/tools/test/h5format_convert/CMakeTests.cmake
new file mode 100644
index 0000000..3e423da
--- /dev/null
+++ b/tools/test/h5format_convert/CMakeTests.cmake
@@ -0,0 +1,471 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the test directory into the source directory
+  # --------------------------------------------------------------------
+  set (HDF5_REFERENCE_FILES
+      h5fc_help.ddl
+      h5fc_nooption.ddl
+      h5fc_nonexistfile.ddl
+      h5fc_d_file.ddl
+      h5fc_dname.ddl
+      h5fc_nonexistdset_file.ddl
+      h5fc_v_non_chunked.ddl
+      h5fc_v_bt1.ddl
+      h5fc_v_ndata_bt1.ddl
+      h5fc_v_all.ddl
+      h5fc_v_n_1d.ddl
+      h5fc_v_n_all.ddl
+      h5fc_ext1_i.ddl
+      h5fc_ext1_s.ddl
+      h5fc_ext1_f.ddl
+      h5fc_ext2_if.ddl
+      h5fc_ext2_is.ddl
+      h5fc_ext2_sf.ddl
+      h5fc_ext3_isf.ddl
+      old_h5fc_ext1_i.ddl
+      old_h5fc_ext1_s.ddl
+      old_h5fc_ext1_f.ddl
+      old_h5fc_ext2_if.ddl
+      old_h5fc_ext2_is.ddl
+      old_h5fc_ext2_sf.ddl
+      old_h5fc_ext3_isf.ddl
+      h5fc_v_err.ddl
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      h5fc_non_v3.h5
+      h5fc_edge_v3.h5
+      h5fc_ext_none.h5
+      old_h5fc_ext_none.h5
+      h5fc_ext1_i.h5
+      h5fc_ext1_s.h5
+      h5fc_ext1_f.h5
+      h5fc_ext2_if.h5
+      h5fc_ext2_is.h5
+      h5fc_ext2_sf.h5
+      h5fc_ext3_isf.h5
+      old_h5fc_ext1_i.h5
+      old_h5fc_ext1_s.h5
+      old_h5fc_ext1_f.h5
+      old_h5fc_ext2_if.h5
+      old_h5fc_ext2_is.h5
+      old_h5fc_ext2_sf.h5
+      old_h5fc_ext3_isf.h5
+      h5fc_err_level.h5
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+  add_custom_target(h5fc-files ALL COMMENT "Copying files needed by h5fc tests")
+
+  foreach (ddl_file ${HDF5_REFERENCE_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${ddl_file}" "${PROJECT_BINARY_DIR}/testfiles/${ddl_file}" "h5fc_files")
+  endforeach ()
+
+  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_file}" "h5fc_files")
+  endforeach ()
+  add_custom_target(h5fc_files ALL COMMENT "Copying files needed by h5fc tests" DEPENDS ${h5fc_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_OUTPUT testname resultfile resultcode testfile)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5FC-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/outtmp.h5
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
+      endif ()
+      if (NOT "${testfile}" STREQUAL "")
+          add_test (
+              NAME H5FC-${testname}-${testfile}-tmpfile
+              COMMAND    ${CMAKE_COMMAND}
+                  -E copy_if_different ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${testfile} ./testfiles/outtmp.h5
+          )
+          set_tests_properties (H5FC-${testname}-${testfile}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
+          add_test (
+              NAME H5FC-${testname}-${testfile}
+              COMMAND "${CMAKE_COMMAND}"
+                  -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
+                  -D "TEST_ARGS=${ARGN};outtmp.h5"
+                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                  -D "TEST_OUTPUT=${testname}.out"
+                  -D "TEST_EXPECT=${resultcode}"
+                  -D "TEST_REFERENCE=${resultfile}"
+                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+          )
+          set_tests_properties (H5FC-${testname}-${testfile} PROPERTIES DEPENDS "H5FC-${testname}-${testfile}-tmpfile")
+          set (last_test "H5FC-${testname}-${testfile}")
+      else ()
+          add_test (
+              NAME H5FC-${testname}-NA
+              COMMAND "${CMAKE_COMMAND}"
+                  -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
+                  -D "TEST_ARGS=${ARGN}"
+                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                  -D "TEST_OUTPUT=${testname}.out"
+                  -D "TEST_EXPECT=${resultcode}"
+                  -D "TEST_REFERENCE=${resultfile}"
+                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+          )
+          set_tests_properties (H5FC-${testname}-NA PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
+          set (last_test "H5FC-${testname}-NA")
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST testname resultcode testfile)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5FC-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/tmp.h5
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5FC-${testname}-tmpfile
+          COMMAND    ${CMAKE_COMMAND}
+              -E copy_if_different ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${testfile} testfiles/tmp.h5
+      )
+      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
+      add_test (
+          NAME H5FC-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
+              -D "TEST_ARGS=${ARGN};./testfiles/tmp.h5"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=testfiles/${testname}.out"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -D "TEST_EXPECT=${resultcode}"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
+      set (last_test "H5FC-${testname}")
+     endif ()
+  endmacro ()
+
+  macro (ADD_H5_CHECK_IDX dependtest testname)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5FC_CHECK_IDX-${testname}
+          COMMAND "$<TARGET_FILE:h5fc_chk_idx>" "./testfiles/tmp.h5" "${ARGN}"
+      )
+      set_tests_properties (H5FC_CHECK_IDX-${testname} PROPERTIES DEPENDS "H5FC-${dependtest}")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_CHECK_IDX testname resultcode testfile)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5FC-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/chktmp.h5
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5FC-${testname}-tmpfile
+          COMMAND    ${CMAKE_COMMAND}
+              -E copy_if_different ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${testfile} testfiles/chktmp.h5
+      )
+      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
+      add_test (
+          NAME H5FC-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
+              -D "TEST_ARGS=-d;${ARGN};./testfiles/chktmp.h5"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=testfiles/${testname}.out"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -D "TEST_EXPECT=${resultcode}"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
+      add_test (
+          NAME H5FC_CHECK_IDX-${testname}
+          COMMAND "$<TARGET_FILE:h5fc_chk_idx>" "./testfiles/chktmp.h5" "${ARGN}"
+      )
+      set_tests_properties (H5FC_CHECK_IDX-${testname} PROPERTIES DEPENDS "H5FC-${testname}")
+      set (last_test "H5FC_CHECK_IDX-${testname}")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_H5DUMP_CHECK testname)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5FC-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/dmptmp.h5
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5FC-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5FC-${testname}-tmpfile
+          COMMAND    ${CMAKE_COMMAND}
+              -E copy_if_different ${HDF5_TOOLS_TEST_H5FC_SOURCE_DIR}/testfiles/${testname}.h5 testfiles/dmptmp.h5
+      )
+      set_tests_properties (H5FC-${testname}-tmpfile PROPERTIES DEPENDS "H5FC-${testname}-clear-objects")
+      add_test (
+          NAME H5FC-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5format_convert>"
+              -D "TEST_ARGS=${ARGN};./testfiles/dmptmp.h5"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=testfiles/${testname}.out"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -D "TEST_EXPECT=0"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5FC-${testname} PROPERTIES DEPENDS "H5FC-${testname}-tmpfile")
+      add_test (
+          NAME H5FC_CHECK_DUMP-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=-BH;./testfiles/dmptmp.h5"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=testfiles/${testname}.out"
+              -D "TEST_EXPECT=0"
+              -D "TEST_REFERENCE=testfiles/${testname}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5FC_CHECK_DUMP-${testname} PROPERTIES DEPENDS "H5FC-${testname}")
+      set (last_test "H5FC_CHECK_DUMP-${testname}")
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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 H5FC-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          h5fc_help.out
+          h5fc_help.out.err
+          h5fc_nooption.out
+          h5fc_nooption.out.err
+          h5fc_nonexistfile.out
+          h5fc_nonexistfile.out.err
+          h5fc_d_file.out
+          h5fc_d_file.out.err
+          h5fc_d_file-d.out
+          h5fc_d_file-d.out.err
+          h5fc_dname.out
+          h5fc_dname.out.err
+          h5fc_nonexistdset_file.out
+          h5fc_nonexistdset_file.out.err
+          h5fc_v_non_chunked.out
+          h5fc_v_non_chunked.out.err
+          h5fc_v_bt1.out
+          h5fc_v_bt1.out.err
+          h5fc_v_ndata_bt1.out
+          h5fc_v_ndata_bt1.out.err
+          h5fc_v_all.out
+          h5fc_v_all.out.err
+          h5fc_v_n_1d.out
+          h5fc_v_n_1d.out.err
+          h5fc_v_n_all.out
+          h5fc_v_n_all.out.err
+          h5fc_ext1_i.out
+          h5fc_ext1_i.out.err
+          h5fc_ext1_s.out
+          h5fc_ext1_s.out.err
+          h5fc_ext1_f.out
+          h5fc_ext1_f.out.err
+          h5fc_ext2_if.out
+          h5fc_ext2_if.out.err
+          h5fc_ext2_is.out
+          h5fc_ext2_is.out.err
+          h5fc_ext2_sf.out
+          h5fc_ext2_sf.out.err
+          h5fc_ext3_isf.out
+          h5fc_ext3_isf.out.err
+          old_h5fc_ext1_i.out
+          old_h5fc_ext1_i.out.err
+          old_h5fc_ext1_s.out
+          old_h5fc_ext1_s.out.err
+          old_h5fc_ext1_f.out
+          old_h5fc_ext1_f.out.err
+          old_h5fc_ext2_if.out
+          old_h5fc_ext2_is.out.err
+          old_h5fc_ext2_is.out
+          old_h5fc_ext2_sf.out.err
+          old_h5fc_ext3_isf.out
+          old_h5fc_ext3_isf.out.err
+          outtmp.h5
+          tmp.h5
+          chktmp.h5
+          dmptmp.h5
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5FC-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5FC-clearall-objects")
+  endif ()
+
+# h5format_convert --help
+# h5format_convert (no options)
+# h5format_convert nonexist.h5  (no options, file does not exist)
+  ADD_H5_OUTPUT (h5fc_help h5fc_help.ddl 0 "" --help)
+  ADD_H5_OUTPUT (h5fc_nooption h5fc_nooption.ddl 1 "")
+  ADD_H5_OUTPUT (h5fc_nonexistfile h5fc_nonexistfile.ddl 1 "" nonexist.h5)
+#
+#
+# h5format_convert -d old_h5fc_ext_none.h5 (just -d option, file exists)
+# h5format_convert --dname old_h5fc_ext_none.h5 (just --dname option, file exists)
+# h5format_convert --dname (just --dname option)
+# h5format_convert --dname=nonexist old_h5fc_ext_none.h5 (dataset does not exist, file exists)
+  ADD_H5_OUTPUT (h5fc_d_file-d h5fc_d_file.ddl 1 old_h5fc_ext_none.h5 -d)
+  ADD_H5_OUTPUT (h5fc_d_file h5fc_d_file.ddl 1 old_h5fc_ext_none.h5 --dname)
+  ADD_H5_OUTPUT (h5fc_dname h5fc_dname.ddl 1 "" --dname)
+  ADD_H5_OUTPUT (h5fc_nonexistdset_file h5fc_nonexistdset_file.ddl 1 old_h5fc_ext_none.h5 --dname=nonexist)
+#
+#
+#
+# h5format_convert -d /DSET_CONTIGUOUS -v old_h5fc_ext_none.h5 (verbose, contiguous dataset)
+# h5format_convert -d /GROUP/DSET_BT2 --verbose old_h5fc_ext_none.h5 (verbose, bt1 dataset)
+# h5format_convert -d /DSET_NDATA_BT2 -v -n old_h5fc_ext_none.h5 (verbose, noop, bt1+nodata dataset)
+# h5format_convert -v old_h5fc_ext_none.h5 (verbose, all datasets)
+  ADD_H5_OUTPUT (h5fc_v_non_chunked h5fc_v_non_chunked.ddl 0 old_h5fc_ext_none.h5 -d /DSET_CONTIGUOUS -v)
+  ADD_H5_OUTPUT (h5fc_v_bt1 h5fc_v_bt1.ddl 0 old_h5fc_ext_none.h5 -d /GROUP/DSET_BT2 --verbose)
+  ADD_H5_OUTPUT (h5fc_v_ndata_bt1 h5fc_v_ndata_bt1.ddl 0 old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2 -v -n)
+  ADD_H5_OUTPUT (h5fc_v_all h5fc_v_all.ddl 0 old_h5fc_ext_none.h5 -v)
+#
+#
+#
+# h5format_convert -d /DSET_EA -v -n h5fc_ext_none.h5 (verbose, noop, one ea dataset)
+# h5format_convert -v -n h5fc_non_v3.h5 (verbose, noop, all datasets)
+  ADD_H5_OUTPUT (h5fc_v_n_1d h5fc_v_n_1d.ddl 0 h5fc_ext_none.h5 -d /DSET_EA -v -n)
+  ADD_H5_OUTPUT (h5fc_v_n_all h5fc_v_n_all.ddl 0 h5fc_non_v3.h5 -v -n)
+#
+#
+#
+# h5format_convert -v h5fc_err_level.h5 (error encountered in converting the dataset)
+  ADD_H5_OUTPUT (h5fc_v_err h5fc_v_err.ddl 1 h5fc_err_level.h5 -v)
+#
+#
+#
+# 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_ext_none.h5
+# h5format_convert -d /GROUP/DSET_NDATA_EA h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_BT2 h5fc_ext_none.h5
+# h5format_convert -d /DSET_NDATA_BT2 h5fc_ext_none.h5
+# h5format_convert -d /DSET_FA h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_FA h5fc_ext_none.h5
+# h5format_convert -d /DSET_NONE h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_NDATA_NONE h5fc_ext_none.h5
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_EA 0 h5fc_ext_none.h5 /DSET_EA)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_EA 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_EA)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_BT 0 h5fc_ext_none.h5 /GROUP/DSET_BT2)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_BT 0 h5fc_ext_none.h5 /DSET_NDATA_BT2)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_FA 0 h5fc_ext_none.h5 /DSET_FA)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_FA 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_FA)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_NONE 0 h5fc_ext_none.h5 /DSET_NONE)
+#
+  ADD_H5_TEST_CHECK_IDX (h5fc_ext_none_ND_NONE 0 h5fc_ext_none.h5 /GROUP/DSET_NDATA_NONE)
+#
+#
+#
+# No output from tests: just check exit code
+# h5format_convert -d /DSET_NDATA_BT2 old_h5fc_ext_none.h5 (v1-btree dataset)
+# h5format_convert -d /DSET_CONTIGUOUS h5fc_non_v3.h5 (non-chunked dataset)
+  ADD_H5_TEST (old_h5fc_ext_none 0 old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2)
+  ADD_H5_TEST (old_h5fc_ext_none_CONT 0 h5fc_non_v3.h5 -d /DSET_CONTIGUOUS)
+#
+#
+#
+# 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)
+  ADD_H5_TEST (h5fc_non_v3_BT 0 h5fc_non_v3.h5 -d /GROUP/DSET_BT2 -n)
+  ADD_H5_TEST (h5fc_non_v3-n 0 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
+  ADD_H5_TEST (h5fc_non_v3 0 h5fc_non_v3.h5)
+  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-NEA /DSET_NDATA_EA)
+  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-NBT /DSET_NDATA_BT2)
+  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-BT /GROUP/DSET_BT2)
+  ADD_H5_CHECK_IDX (h5fc_non_v3 h5fc_non_v3-EA /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
+  ADD_H5_TEST_CHECK_IDX (h5fc_edge_v3 0 h5fc_edge_v3.h5 /DSET_EDGE)
+#
+#
+
+# The following test files have messages in the superblock extension.
+# Verify h5dump output for correctness after conversion
+  ADD_H5_H5DUMP_CHECK (h5fc_ext1_i)
+  ADD_H5_H5DUMP_CHECK (h5fc_ext1_s)
+  ADD_H5_H5DUMP_CHECK (h5fc_ext1_f)
+#
+  ADD_H5_H5DUMP_CHECK (h5fc_ext2_if)
+  ADD_H5_H5DUMP_CHECK (h5fc_ext2_is)
+  ADD_H5_H5DUMP_CHECK (h5fc_ext2_sf)
+#
+  ADD_H5_H5DUMP_CHECK (h5fc_ext3_isf)
+#
+#
+#
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_i)
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_s)
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext1_f)
+#
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_if)
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_is)
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext2_sf)
+#
+  ADD_H5_H5DUMP_CHECK (old_h5fc_ext3_isf)
diff --git a/tools/test/h5format_convert/Makefile.am b/tools/test/h5format_convert/Makefile.am
new file mode 100644
index 0000000..eb2d5af
--- /dev/null
+++ b/tools/test/h5format_convert/Makefile.am
@@ -0,0 +1,43 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=../../src/h5format_convert/h5format_convert$(EXEEXT)
+
+CLEANFILES=
+
+# 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/test/h5format_convert/Makefile.in b/tools/test/h5format_convert/Makefile.in
new file mode 100644
index 0000000..5921205
--- /dev/null
+++ b/tools/test/h5format_convert/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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)
+TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
+subdir = tools/test/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/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__EXEEXT_1 = h5fc_gentest$(EXEEXT)
+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)
+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
+DIST_SOURCES = h5fc_chk_idx.c h5fc_gentest.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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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 = ../../src/h5format_convert/h5format_convert$(EXEEXT)
+CLEANFILES = 
+
+# 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, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5format_convert/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/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)/$@
+
+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)
+
+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@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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-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-dyn: $(DYN)
+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 dyn 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/test/h5format_convert/h5fc_chk_idx.c b/tools/test/h5format_convert/h5fc_chk_idx.c
new file mode 100644
index 0000000..8369668
--- /dev/null
+++ b/tools/test/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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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();
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* Duplicate the file name  & dataset name */
+    fname = HDstrdup(argv[1]);
+    dname = HDstrdup(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");
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to open the dataset\n");
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* 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");
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to close the dataset\n");
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx_type: cannot close the file\n");
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* Return success when the chunk indexing type is version 1 B-tree */
+    if(idx_type == H5D_CHUNK_IDX_BTREE) 
+	HDexit(EXIT_SUCCESS);
+    else {
+	HDfprintf(stderr, "Error: chunk indexing type is %d\n", idx_type);
+	HDexit(EXIT_FAILURE);
+    } /* end if */
+
+} /* main() */
+
diff --git a/tools/test/h5format_convert/h5fc_gentest.c b/tools/test/h5format_convert/h5fc_gentest.c
new file mode 100644
index 0000000..8c873be
--- /dev/null
+++ b/tools/test/h5format_convert/h5fc_gentest.c
@@ -0,0 +1,805 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
+#include "H5private.h"
+
+#define NON_V3_FILE		"h5fc_non_v3.h5"
+#define EDGE_V3_FILE		"h5fc_edge_v3.h5"
+#define ERR_LEVEL_FILE		"h5fc_err_level.h5"
+
+const char *FILENAME[] = {
+    "h5fc_ext1_i.h5",	/* 0 */
+    "h5fc_ext1_s.h5",	/* 1 */
+    "h5fc_ext1_f.h5",	/* 2 */
+    "h5fc_ext2_is.h5", 	/* 3 */
+    "h5fc_ext2_if.h5",	/* 4 */
+    "h5fc_ext2_sf.h5", 	/* 5 */
+    "h5fc_ext3_isf.h5",	/* 6 */ 
+    "h5fc_ext_none.h5",	/* 7 */ 
+    NULL
+};
+
+#define GROUP			"GROUP"
+
+#define DSET_COMPACT		"DSET_COMPACT"
+#define DSET_CONTIGUOUS		"DSET_CONTIGUOUS"
+
+#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 DSET_EDGE		"DSET_EDGE"
+#define DSET_ERR		"DSET_ERR"
+
+#define ISTORE_IK  64
+#define ISTORE_ERR 1 
+
+#define NUM 500
+
+
+/*
+ * 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 compact and 1 contiguous datasets
+ */
+static void
+gen_non(const char *fname)
+{
+    hid_t	fid = -1;		/* file id */
+    hid_t	fcpl = -1;		/* file creation 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 	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 */
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto error;
+    if(H5Pset_shared_mesg_nindexes(fcpl, 4) < 0)
+        goto error;
+    if(H5Pset_istore_k(fcpl, 64) < 0)
+        goto error;
+
+    /* Create an empty file with latest-format */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, fcpl, 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 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(H5Pclose(dcpl) < 0)
+        goto error;
+    if(H5Dclose(did1) < 0)
+        goto error;
+    if(H5Dclose(did2) < 0)
+        goto error;
+
+    /* 
+     * Create a compact dataset in the group
+     */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
+        goto error;
+
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto error;
+    if(H5Pset_layout(dcpl, H5D_COMPACT) < 0)
+        goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(gid, DSET_COMPACT, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto error;
+
+    /* Closing */
+    if(H5Dclose(did1) < 0)
+        goto error;
+    if(H5Pclose(dcpl) < 0)
+        goto error;
+    if(H5Sclose(sid) < 0)
+        goto error;
+
+    /* 
+     * Create a contiguous dataset with (2d with data) in the file
+     */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto error;
+    if(H5Pset_layout(dcpl, H5D_CONTIGUOUS) < 0)
+        goto error;
+
+    if((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+        goto error;
+
+    /* Create the dataset */
+    if((did2  = H5Dcreate2(fid, DSET_CONTIGUOUS, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, 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(H5Dclose(did2) < 0)
+        goto error;
+    if(H5Pclose(dcpl) < 0)
+        goto error;
+    if(H5Sclose(sid) < 0)
+        goto error;
+
+    if(H5Gclose(gid) < 0)
+	goto error;
+    if(H5Pclose(fcpl) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Gclose(gid);
+        H5Fclose(fcpl);
+        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() */
+
+
+/*
+ * Function: gen_err_level() 
+ *
+ * Generate a file to test the situtation described in HDFFV-9434:
+ *	Exceed the limit of v1-btree level
+ *
+ *	Create a file with H5Pset_istore_k(fcpl, 1).
+ *	Create a chunked dataset with extensible array chunk index and 
+ *	appends many chunks to the dataset.
+ *
+ *	When h5format_convert tries to convert the dataset with
+ *	extensive array index in the file to v1-btree chunk index, 
+ *	it will insert the dataset chunks to the v1-btree chunk index.
+ *	The tree will split quickly due to the 'K' value of 1 and the 
+ *	tree level will eventually hit the maximum: 2^8(256).
+ */
+static void
+gen_err_level(const char *fname)
+{
+    hid_t fid = -1;	    	/* file ID */
+    hid_t fapl = -1;	       	/* file access property list */
+    hid_t fcpl = -1;	       	/* file creation property list */
+    hid_t sid = -1;       	/* dataspace id */
+    hid_t dcpl = -1;		/* dataset creation property list */
+    hid_t did = -1;		/* dataset ID */
+    hid_t fsid = -1;		/* file dataspace ID */
+    hid_t msid = -1;		/* memory dataspace ID */
+    unsigned char *buf = NULL;	/* buffer for data */
+    hsize_t dims[2] = {0, 1};			/* dataset dimension sizes */
+    hsize_t max_dims[2] = {1, H5S_UNLIMITED};	/* dataset maximum dimension sizes */
+    hsize_t chunk_dims[2] = {1, 1};		/* chunk dimension sizes */
+    int	n = 0;			/* 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;
+
+    /* Set 'K' value to 1 in file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto error;
+    if(H5Pset_istore_k(fcpl, ISTORE_ERR) < 0)
+        goto error;
+
+    /* Initialize data buffer */
+    buf = (unsigned char *)HDmalloc(NUM * sizeof(unsigned char *));
+    HDmemset(buf, 42, NUM * sizeof(unsigned char));
+
+    /* Create the test file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        goto error;
+
+    /* Create a chunked dataset with extensible array chunk index */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0)
+        goto error;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto error;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        goto error;
+    if((did = H5Dcreate2(fid, DSET_ERR, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto error;
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0)
+        goto error;
+    if(H5Sclose(sid) < 0)
+        goto error;
+    if(H5Dclose(did) < 0)
+        goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+
+    /* Re-open the file */
+    if((fid = H5Fopen(fname, H5F_ACC_RDWR, fapl)) < 0)
+        goto error;
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, DSET_ERR, H5P_DEFAULT)) < 0)
+        goto error;
+
+    /* Loop through appending 1 element at a time */
+    for(n = 0; n < NUM; n++) {
+	hsize_t start[2] = {0, 0};
+	hsize_t count[2] = {1, 1};
+	hsize_t extent[2] = {0, 0};
+
+	start[0] = 0;
+	start[1] = (hsize_t)n;
+	extent[0] = 1;
+	extent[1] = (hsize_t)(n + 1);
+
+	/* Set current dimension sizes for the dataset */
+	if(H5Dset_extent(did, extent) < 0)
+	    goto error;
+
+	/* Set up memory dataspace */
+	if((msid = H5Screate_simple(2, count, NULL)) < 0)
+	    goto error;
+
+	/* Get file dataspace */
+	if((fsid = H5Dget_space(did)) < 0)
+	    goto error;
+
+	if((H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, count, NULL)) < 0)
+	    goto error;
+
+	/* Write to the dataset */
+	if(H5Dwrite(did, H5T_NATIVE_UCHAR, msid, fsid, H5P_DEFAULT, buf) < 0)
+	    goto error;
+
+	if(H5Sclose(fsid) < 0)
+	    goto error;
+	if(H5Sclose(msid) < 0)
+	    goto error;
+    }
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+    if(H5Pclose(fapl) < 0)
+	goto error;
+    if(buf) free(buf);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Sclose(msid);
+        H5Sclose(fsid);
+        H5Fclose(fid);
+        H5Pclose(fapl);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+
+} /* gen_err_level() */
+
+/*
+ * Function: gen_ext() 
+ *
+ * Create a file with/without latest format with:
+ *	1) 1 contiguous dataset (without data)
+ *	2) 2 chunked datasets with extensible array chunk indexing type (with/without data)
+ *	3) 2 chunked datasets with version 2 B-tree chunk indexing type (with/without data)
+ *	4) 2 chunked datasets with fixed array chunk indexing type (with/without data)
+ *	5) 2 chunked datasets with implicit array chunk indexing type (with/without data)
+ * It will create the file with/without messages in the superblock extension depending
+ * on the parameter "what".
+ */
+static void
+gen_ext(const char *fname, unsigned new_format, unsigned what)
+{
+    hid_t	fid = -1;	 	/* file id */
+    hid_t	fapl = -1;	       	/* file access property list */
+    hid_t	fcpl = -1;	       	/* file creation 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 	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 */
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        goto error;
+
+    if(new_format) {
+        /* Create a new format file */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            goto error;
+    } /* end if */
+
+    /* Create a file creation property list */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+
+    /* Generate messages that might be placed in superblock extension */
+    switch(what) {
+	case 0:
+	    H5Pset_istore_k(fcpl, ISTORE_IK);
+	    break;
+	case 1:
+	    H5Pset_shared_mesg_nindexes(fcpl, 4);
+	    break;
+	case 2:
+	    H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1);
+	    break;
+	case 3:
+	    H5Pset_istore_k(fcpl, ISTORE_IK);
+	    H5Pset_shared_mesg_nindexes(fcpl, 4);
+	    break;
+	case 4:
+	    H5Pset_istore_k(fcpl, ISTORE_IK);
+	    H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1);
+	    break;
+	case 5:
+	    H5Pset_shared_mesg_nindexes(fcpl, 4);
+	    H5Pset_file_space_page_size(fcpl, (hsize_t)512);
+	    break;
+	case 6:
+	    H5Pset_istore_k(fcpl, ISTORE_IK);
+	    H5Pset_shared_mesg_nindexes(fcpl, 4);
+	    H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, FALSE, (hsize_t)1);
+	    break;
+	default:
+	    break;
+    }
+
+    /* Create the file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, 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 a contiguous dataset 
+     */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
+        goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(fid, DSET_CONTIGUOUS, 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 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);
+        H5Pclose(fcpl);
+    } H5E_END_TRY;
+
+} /* end gen_ext() */
+
+int
+main(void)
+{
+    unsigned i, new_format;
+
+    /* 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 */
+    gen_edge(EDGE_V3_FILE);
+
+    /* Generate a new format file with 'K' value of 1 in H5Pset_istore_k() */
+    gen_err_level(ERR_LEVEL_FILE);
+
+    /* Generate old/new format file with/without messages in the superblock extension */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+        for(i = 0; i < 8; i++) {
+            char filename[50];
+
+            HDmemset(filename, 0, sizeof(filename));
+            if(!new_format)
+                HDstrcat(filename, "old_");
+            HDstrcat(filename, FILENAME[i]);
+
+            gen_ext(filename, new_format, i);
+        } /* end for */
+    } /* end for */
+
+    return 0;
+} /* end main */
+
diff --git a/tools/h5format_convert/testfiles/h5fc_d_file.ddl b/tools/test/h5format_convert/testfiles/h5fc_d_file.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_d_file.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_d_file.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_dname.ddl b/tools/test/h5format_convert/testfiles/h5fc_dname.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_dname.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_dname.ddl
diff --git a/tools/test/h5format_convert/testfiles/h5fc_edge_v3.h5 b/tools/test/h5format_convert/testfiles/h5fc_edge_v3.h5
new file mode 100644
index 0000000..6f92057
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_edge_v3.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_err_level.h5 b/tools/test/h5format_convert/testfiles/h5fc_err_level.h5
new file mode 100644
index 0000000..d1aecc2
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_err_level.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_f.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext1_f.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext1_f.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_f.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext1_f.h5
new file mode 100644
index 0000000..5f2a01a
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext1_f.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_i.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext1_i.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext1_i.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_i.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext1_i.h5
new file mode 100644
index 0000000..df86faf
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext1_i.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_s.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext1_s.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext1_s.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext1_s.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext1_s.h5
new file mode 100644
index 0000000..e41f51a
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext1_s.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_if.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext2_if.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext2_if.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_if.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext2_if.h5
new file mode 100644
index 0000000..af2cb15
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext2_if.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_is.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext2_is.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext2_is.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_is.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext2_is.h5
new file mode 100644
index 0000000..5e99ddf
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext2_is.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.h5
new file mode 100644
index 0000000..8996bf0
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext2_sf.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.ddl b/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.h5
new file mode 100644
index 0000000..df1db97
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext3_isf.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/h5fc_ext_none.h5 b/tools/test/h5format_convert/testfiles/h5fc_ext_none.h5
new file mode 100644
index 0000000..c498ead
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_ext_none.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_help.ddl b/tools/test/h5format_convert/testfiles/h5fc_help.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_help.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_help.ddl
diff --git a/tools/test/h5format_convert/testfiles/h5fc_non_v3.h5 b/tools/test/h5format_convert/testfiles/h5fc_non_v3.h5
new file mode 100644
index 0000000..2f0f063
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/h5fc_non_v3.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl b/tools/test/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl b/tools/test/h5format_convert/testfiles/h5fc_nonexistfile.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_nonexistfile.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_nooption.ddl b/tools/test/h5format_convert/testfiles/h5fc_nooption.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_nooption.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_nooption.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_v_all.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_all.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_all.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_all.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_v_bt1.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_bt1.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_bt1.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_bt1.ddl
diff --git a/tools/test/h5format_convert/testfiles/h5fc_v_err.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_err.ddl
new file mode 100644
index 0000000..b671db0
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/h5fc_v_err.ddl
@@ -0,0 +1,13 @@
+Process command line options
+Open the file outtmp.h5
+Processing all datasets in the file...
+Going to process dataset:/DSET_ERR...
+Open the dataset
+Retrieve the dataset's layout
+Dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Dataset's chunk indexing type is not version 1 B-tree
+Converting the dataset...
+Error encountered
+Close the file
+h5format_convert error: unable to downgrade dataset "/DSET_ERR"
diff --git a/tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_n_1d.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_n_1d.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_v_n_all.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_n_all.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_n_all.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_n_all.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
diff --git a/tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl b/tools/test/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
similarity index 100%
rename from tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
rename to tools/test/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.h5
new file mode 100644
index 0000000..b71b31e
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_f.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
new file mode 100644
index 0000000..d9cc0b7
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.h5" {
+SUPER_BLOCK {
+   SUPERBLOCK_VERSION 1
+   FREELIST_VERSION 0
+   SYMBOLTABLE_VERSION 0
+   OBJECTHEADER_VERSION 0
+   OFFSET_SIZE 8
+   LENGTH_SIZE 8
+   BTREE_RANK 16
+   BTREE_LEAF 4
+   ISTORE_K 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.h5
new file mode 100644
index 0000000..6a8e5eb
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_i.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.h5
new file mode 100644
index 0000000..ebc6919
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext1_s.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.h5
new file mode 100644
index 0000000..a4178b3
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_if.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.h5
new file mode 100644
index 0000000..b5cd60a
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_is.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
new file mode 100644
index 0000000..db00a99
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.h5
new file mode 100644
index 0000000..8e63726
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext2_sf.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl b/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
new file mode 100644
index 0000000..4be6d90
--- /dev/null
+++ b/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.ddl
@@ -0,0 +1,60 @@
+HDF5 "./testfiles/dmptmp.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 64
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+   DATASET "DSET_CONTIGUOUS" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
+   }
+   DATASET "DSET_EA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_FA" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+   }
+   DATASET "DSET_NDATA_BT2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+   }
+   DATASET "DSET_NONE" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+   }
+   GROUP "GROUP" {
+      DATASET "DSET_BT2" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_EA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 10, H5S_UNLIMITED ) }
+      }
+      DATASET "DSET_NDATA_FA" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 20, 10 ) }
+      }
+      DATASET "DSET_NDATA_NONE" {
+         DATATYPE  H5T_STD_I32LE
+         DATASPACE  SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+      }
+   }
+}
+}
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.h5
new file mode 100644
index 0000000..d581e3c
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext3_isf.h5 differ
diff --git a/tools/test/h5format_convert/testfiles/old_h5fc_ext_none.h5 b/tools/test/h5format_convert/testfiles/old_h5fc_ext_none.h5
new file mode 100644
index 0000000..0e02ca1
Binary files /dev/null and b/tools/test/h5format_convert/testfiles/old_h5fc_ext_none.h5 differ
diff --git a/tools/test/h5format_convert/testh5fc.sh.in b/tools/test/h5format_convert/testh5fc.sh.in
new file mode 100644
index 0000000..c3056e8
--- /dev/null
+++ b/tools/test/h5format_convert/testh5fc.sh.in
@@ -0,0 +1,506 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=../../src/h5format_convert/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'
+H5DUMP=../../src/h5dump/h5dump         # The h5dump tool name
+H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
+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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+SRC_H5FORMCONV_TESTFILES="$SRC_TOOLS/test/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
+TMPOUTFILE=outtmp.h5
+TMPFILE=tmp.h5
+TMPCHKFILE=chktmp.h5
+TMPDMPFILE=dmptmp.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_non_v3.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_edge_v3.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext_none.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext_none.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_i.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_s.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_f.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_if.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_is.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_sf.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext3_isf.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_i.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_s.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_f.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_if.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_is.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_sf.h5
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext3_isf.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_err_level.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
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_i.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_s.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext1_f.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_if.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_is.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext2_sf.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_ext3_isf.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_i.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_s.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext1_f.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_if.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_is.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext2_sf.ddl
+$SRC_H5FORMCONV_TESTFILES/old_h5fc_ext3_isf.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_err.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=$SRC_H5FORMCONV_TESTFILES
+    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
+        $RM $TESTDIR/$TMPOUTFILE
+        $RM $TESTDIR/$TMPCHKFILE
+        $RM $TESTDIR/$TMPDMPFILE
+    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/$TMPOUTFILE
+    TFILE=$2
+    if [ ! -z "$2" ] && [ -e $TESTDIR/$2 ] ; then
+	$CP $TESTDIR/$2 $TESTDIR/$TMPOUTFILE
+	TFILE=$TMPOUTFILE
+    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
+    COMPARE_OUT $expect $actual
+
+    # 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 is the temporary file name 
+# $3 to at most $5--options to the tool such as:
+# 	-d dname
+# 	-n
+TOOLTEST() {
+    TESTING $FORMCONV $3 $4 $5 $1
+    $RM $TESTDIR/$2
+    $CP $TESTDIR/$1 $TESTDIR/$2
+    $RUNSERIAL $FORMCONV_BIN $3 $4 $5 $TESTDIR/$2
+    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'
+}
+
+# Assume $TESTDIR/$TMPFILE is the converted test file
+# $1 dataset name
+IDX_CHECK() {
+    CHECKING $1
+    $RUNSERIAL $CHK_IDX_BIN $TESTDIR/$TMPCHKFILE $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
+}
+
+# $1 is the expected output
+# $2 is the output from testing
+COMPARE_OUT() {
+    if $CMP $1 $2; 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
+}
+
+# Assume $TESTDIR/$TMPFILE is the converted test file
+# $1 is the test file for verifying h5dump output
+# $2 is the expected output from h5dump
+H5DUMP_CHECK() {
+    CHECKING h5dump output for $1
+    expect="$TESTDIR/$2"
+    actual="$TESTDIR/`basename $2 .ddl`.out"
+    actual_err="$TESTDIR/`basename $2 .ddl`.err"
+    $RUNSERIAL $H5DUMP_BIN -BH $TESTDIR/$TMPDMPFILE > $actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    # Compare output
+    COMPARE_OUT $expect $actual
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	$RM $actual $actual_err
+    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 old_h5fc_ext_none.h5 (just -d option, file exists)
+# h5format_convert --dname old_h5fc_ext_none.h5 (just --dname option, file exists)
+# h5format_convert --dname (just --dname option)
+# h5format_convert --dname=nonexist old_h5fc_ext_none.h5 (dataset does not exist, file exists)
+TOOLTEST_OUT h5fc_d_file.ddl old_h5fc_ext_none.h5 -d
+TOOLTEST_OUT h5fc_d_file.ddl old_h5fc_ext_none.h5 --dname
+TOOLTEST_OUT h5fc_dname.ddl '' --dname
+TOOLTEST_OUT h5fc_nonexistdset_file.ddl old_h5fc_ext_none.h5 --dname=nonexist
+#
+#
+#
+# h5format_convert -d /DSET_CONTIGUOUS -v old_h5fc_ext_none.h5 (verbose, contiguous dataset)
+# h5format_convert -d /GROUP/DSET_BT2 --verbose old_h5fc_ext_none.h5 (verbose, bt1 dataset)
+# h5format_convert -d /DSET_NDATA_BT2 -v -n old_h5fc_ext_none.h5 (verbose, noop, bt1+nodata dataset)
+# h5format_convert -v old_h5fc_ext_none.h5 (verbose, all datasets)
+TOOLTEST_OUT h5fc_v_non_chunked.ddl old_h5fc_ext_none.h5 -d /DSET_CONTIGUOUS -v
+TOOLTEST_OUT h5fc_v_bt1.ddl old_h5fc_ext_none.h5 -d /GROUP/DSET_BT2 --verbose
+TOOLTEST_OUT h5fc_v_ndata_bt1.ddl old_h5fc_ext_none.h5 -d /DSET_NDATA_BT2 -v -n
+TOOLTEST_OUT h5fc_v_all.ddl old_h5fc_ext_none.h5 -v
+#
+#
+#
+# h5format_convert -d /DSET_EA -v -n h5fc_ext_none.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_ext_none.h5 -d /DSET_EA -v -n
+TOOLTEST_OUT h5fc_v_n_all.ddl h5fc_non_v3.h5 -v -n
+#
+#
+#
+# h5format_convert -v h5fc_err_level.h5 (error encountered in converting the dataset)
+TOOLTEST_OUT h5fc_v_err.ddl h5fc_err_level.h5 -v
+#
+#
+#
+# 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_ext_none.h5
+# h5format_convert -d /GROUP/DSET_NDATA_EA h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_BT2 h5fc_ext_none.h5
+# h5format_convert -d /DSET_NDATA_BT2 h5fc_ext_none.h5
+# h5format_convert -d /DSET_FA h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_FA h5fc_ext_none.h5
+# h5format_convert -d /DSET_NONE h5fc_ext_none.h5
+# h5format_convert -d /GROUP/DSET_NDATA_NONE h5fc_ext_none.h5
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /DSET_EA
+IDX_CHECK /DSET_EA
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /GROUP/DSET_NDATA_EA
+IDX_CHECK /GROUP/DSET_NDATA_EA
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /GROUP/DSET_BT2
+IDX_CHECK /GROUP/DSET_BT2
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /DSET_NDATA_BT2
+IDX_CHECK /DSET_NDATA_BT2
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /DSET_FA
+IDX_CHECK /DSET_FA
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /GROUP/DSET_NDATA_FA
+IDX_CHECK /GROUP/DSET_NDATA_FA
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /DSET_NONE
+IDX_CHECK /DSET_NONE
+#
+TOOLTEST h5fc_ext_none.h5 $TMPCHKFILE -d /GROUP/DSET_NDATA_NONE
+IDX_CHECK /GROUP/DSET_NDATA_NONE
+#
+#
+#
+# No output from tests: just check exit code
+# h5format_convert -d /DSET_NDATA_BT2 old_h5fc_ext_none.h5 (v1-btree dataset)
+# h5format_convert -d /DSET_CONTIGUOUS h5fc_non_v3.h5 (non-chunked dataset)
+TOOLTEST old_h5fc_ext_none.h5 $TMPFILE -d /DSET_NDATA_BT2
+TOOLTEST h5fc_non_v3.h5 $TMPFILE -d /DSET_CONTIGUOUS
+#
+#
+#
+# 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 $TMPFILE -d /GROUP/DSET_BT2 -n
+TOOLTEST h5fc_non_v3.h5 $TMPFILE -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 $TMPCHKFILE
+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 $TMPCHKFILE
+IDX_CHECK /DSET_EDGE
+#
+#
+
+# The following test files have messages in the superblock extension.
+# Verify h5dump output for correctness after conversion
+TOOLTEST h5fc_ext1_i.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext1_i.h5 h5fc_ext1_i.ddl
+TOOLTEST h5fc_ext1_s.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext1_s.h5 h5fc_ext1_s.ddl
+TOOLTEST h5fc_ext1_f.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext1_f.h5 h5fc_ext1_f.ddl
+#
+TOOLTEST h5fc_ext2_if.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext2_if.h5 h5fc_ext2_if.ddl
+TOOLTEST h5fc_ext2_is.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext2_is.h5 h5fc_ext2_is.ddl
+TOOLTEST h5fc_ext2_sf.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext2_sf.h5 h5fc_ext2_sf.ddl
+#
+TOOLTEST h5fc_ext3_isf.h5 $TMPDMPFILE
+H5DUMP_CHECK h5fc_ext3_isf.h5 h5fc_ext3_isf.ddl
+#
+#
+#
+TOOLTEST old_h5fc_ext1_i.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext1_i.h5 old_h5fc_ext1_i.ddl
+TOOLTEST old_h5fc_ext1_s.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext1_s.h5 old_h5fc_ext1_s.ddl
+TOOLTEST old_h5fc_ext1_f.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext1_f.h5 old_h5fc_ext1_f.ddl
+#
+TOOLTEST old_h5fc_ext2_if.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext2_if.h5 old_h5fc_ext2_if.ddl
+TOOLTEST old_h5fc_ext2_is.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext2_is.h5 old_h5fc_ext2_is.ddl
+TOOLTEST old_h5fc_ext2_sf.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext2_sf.h5 old_h5fc_ext2_sf.ddl
+#
+TOOLTEST old_h5fc_ext3_isf.h5 $TMPDMPFILE
+H5DUMP_CHECK old_h5fc_ext3_isf.h5 old_h5fc_ext3_isf.ddl
+#
+# 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/test/h5import/CMakeLists.txt b/tools/test/h5import/CMakeLists.txt
new file mode 100644
index 0000000..0d23e5d
--- /dev/null
+++ b/tools/test/h5import/CMakeLists.txt
@@ -0,0 +1,18 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5IMPORT)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the h5import executables
+  # --------------------------------------------------------------------
+  add_executable (h5importtest ${HDF5_TOOLS_TEST_H5IMPORT_SOURCE_DIR}/h5importtest.c)
+  TARGET_NAMING (h5importtest STATIC)
+  TARGET_C_PROPERTIES (h5importtest STATIC " " " ")
+  target_link_libraries (h5importtest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (h5importtest PROPERTIES FOLDER tools)
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5import/CMakeTests.cmake b/tools/test/h5import/CMakeTests.cmake
new file mode 100644
index 0000000..27c736a
--- /dev/null
+++ b/tools/test/h5import/CMakeTests.cmake
@@ -0,0 +1,476 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  set (HDF5_REFERENCE_CONF_FILES
+      binfp64.conf
+      binin8.conf
+      binin8w.conf
+      binin16.conf
+      binin32.conf
+      binuin16.conf
+      binuin32.conf
+      txtfp32.conf
+      txtfp64.conf
+      txtin8.conf
+      txtin16.conf
+      txtin32.conf
+      txtuin16.conf
+      txtuin32.conf
+      textpfe.conf
+      txtstr.conf
+  )
+  set (HDF5_REFERENCE_TXT_FILES
+      txtfp32.txt
+      txtfp64.txt
+      txtuin16.txt
+      txtuin32.txt
+      txtin8.txt
+      txtin16.txt
+      txtin32.txt
+      textpfe64.txt
+      txtstr.txt
+      dbinfp64.h5.txt
+      dbinin8.h5.txt
+      dbinin8w.h5.txt
+      dbinin16.h5.txt
+      dbinin32.h5.txt
+      dbinuin16.h5.txt
+      dbinuin32.h5.txt
+      dtxtstr.h5.txt
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      binfp64.h5
+      binin8.h5
+      binin8w.h5
+      binin16.h5
+      binin32.h5
+      binuin16.h5
+      binuin32.h5
+      txtfp32.h5
+      txtfp64.h5
+      txtin8.h5
+      txtin16.h5
+      txtin32.h5
+      txtuin16.h5
+      txtuin32.h5
+      txtstr.h5
+      textpfe.h5
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+  foreach (conf_file ${HDF5_REFERENCE_CONF_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5IMPORT_SOURCE_DIR}/testfiles/${conf_file}" "${PROJECT_BINARY_DIR}/testfiles/${conf_file}" "h5import_files")
+  endforeach ()
+
+  foreach (txt_file ${HDF5_REFERENCE_TXT_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5IMPORT_SOURCE_DIR}/testfiles/${txt_file}" "${PROJECT_BINARY_DIR}/testfiles/${txt_file}" "h5import_files")
+  endforeach ()
+
+  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5IMPORT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_file}" "h5import_files")
+  endforeach ()
+  add_custom_target(h5import_files ALL COMMENT "Copying files needed by h5import tests" DEPENDS ${h5import_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+  macro (ADD_H5_TEST testname importfile conffile testfile)
+    # If using memchecker skip macro based tests
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5IMPORT-${testname} COMMAND $<TARGET_FILE:h5import> ${importfile} -c ${conffile} -o ${testfile})
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5IMPORT-${testname} PROPERTIES DEPENDS H5IMPORT-h5importtest)
+      endif ()
+    else ()
+      add_test (
+          NAME H5IMPORT-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ${testfile}
+      )
+      set_tests_properties (H5IMPORT-${testname}-clear-objects PROPERTIES DEPENDS H5IMPORT-h5importtest)
+
+      add_test (NAME H5IMPORT-${testname} COMMAND $<TARGET_FILE:h5import> ${importfile} -c ${conffile} -o ${testfile})
+      set_tests_properties (H5IMPORT-${testname} PROPERTIES DEPENDS H5IMPORT-${testname}-clear-objects)
+
+      add_test (
+          NAME H5IMPORT-${testname}-H5DMP
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${testfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${testfile}.new"
+              -D "TEST_EXPECT=0"
+              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5IMPORT-${testname}-H5DMP PROPERTIES DEPENDS H5IMPORT-${testname})
+      add_test (
+          NAME H5IMPORT-${testname}-H5DMP_CMP
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=testfiles/${testfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${testfile}.out"
+              -D "TEST_EXPECT=0"
+              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
+              -D "TEST_REFERENCE=${testfile}.new"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5IMPORT-${testname}-H5DMP_CMP PROPERTIES DEPENDS H5IMPORT-${testname}-H5DMP)
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_DUMPTEST testname datasetname testfile)
+    # If using memchecker skip tests
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5IMPORT-DUMP-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              d${testfile}
+              d${testfile}.bin
+      )
+      set_tests_properties (H5IMPORT-DUMP-${testname}-clear-objects PROPERTIES DEPENDS H5IMPORT-h5importtest)
+
+      if ("${ARGN}" STREQUAL "BINARY")
+        add_test (
+            NAME H5IMPORT-DUMP-${testname}-H5DMP
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                -D "TEST_ARGS:STRING=-p;-d;${datasetname};-o;d${testfile}.bin;-b;testfiles/${testfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+                -D "TEST_OUTPUT=d${testfile}.dmp"
+                -D "TEST_EXPECT=0"
+                -D "TEST_SKIP_COMPARE=TRUE"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      else ()
+        add_test (
+            NAME H5IMPORT-DUMP-${testname}-H5DMP
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                -D "TEST_ARGS:STRING=-p;-d;${datasetname};-o;d${testfile}.bin;-y;--width=1;testfiles/${testfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+                -D "TEST_OUTPUT=d${testfile}.dmp"
+                -D "TEST_EXPECT=0"
+                -D "TEST_SKIP_COMPARE=TRUE"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
+      set_tests_properties (H5IMPORT-DUMP-${testname}-H5DMP PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}-clear-objects")
+
+      add_test (
+          NAME H5IMPORT-DUMP-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5import>"
+              -D "TEST_ARGS:STRING=d${testfile}.bin;-c;d${testfile}.dmp;-o;d${testfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=d${testfile}.imp"
+              -D "TEST_EXPECT=0"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5IMPORT-DUMP-${testname} PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}-H5DMP")
+
+      add_test (
+          NAME H5IMPORT-DUMP-${testname}-H5DFF
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5diff>"
+              -D "TEST_ARGS:STRING=-r;d${testfile};testfiles/${testfile};${datasetname};${datasetname}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=d${testfile}.dff"
+              -D "TEST_EXPECT=0"
+              -D "TEST_FILTER=(^(Warning)[^\n]*)"
+              -D "TEST_REFERENCE=testfiles/d${testfile}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5IMPORT-DUMP-${testname}-H5DFF PROPERTIES DEPENDS "H5IMPORT-DUMP-${testname}")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_SKIP_DUMPTEST testname datasetname testfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5IMPORT-DUMP-${testname}-SKIPPED
+          COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${testname} ${datasetname} ${testfile} --- DEFLATE filter not available"
+      )
+    endif ()
+  endmacro ()
+
+  # --------------------------------------------------------------------
+  # Determine if filter is available for h5diff
+  # --------------------------------------------------------------------
+  if (H5_HAVE_FILTER_DEFLATE)
+    set (USE_FILTER_DEFLATE "true")
+  endif ()
+
+##############################################################################
+##############################################################################
+###           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 H5IMPORT-clear-objects
+        COMMAND    ${CMAKE_COMMAND}
+            -E remove
+            binfp64.bin
+            binin8.bin
+            binin8w.bin
+            binin16.bin
+            binin32.bin
+            binuin16.bin
+            binuin32.bin
+            txtin32.h5
+            txtin32.h5.new
+            txtin32.h5.new.err
+            txtin32.h5.out
+            txtin32.h5.out.err
+            txtin16.h5
+            txtin16.h5.new
+            txtin16.h5.new.err
+            txtin16.h5.out
+            txtin16.h5.out.err
+            txtin8.h5
+            txtin8.h5.new
+            txtin8.h5.new.err
+            txtin8.h5.out
+            txtin8.h5.out.err
+            txtuin16.h5
+            txtuin16.h5.new
+            txtuin16.h5.new.err
+            txtuin16.h5.out
+            txtuin16.h5.out.err
+            txtuin32.h5
+            txtuin32.h5.new
+            txtuin32.h5.new.err
+            txtuin32.h5.out
+            txtuin32.h5.out.err
+            txtfp32.h5
+            txtfp32.h5.new
+            txtfp32.h5.new.err
+            txtfp32.h5.out
+            txtfp32.h5.out.err
+            txtfp64.h5
+            txtfp64.h5.new
+            txtfp64.h5.new.err
+            txtfp64.h5.out
+            txtfp64.h5.out.err
+            binfp64.h5
+            binfp64.h5.new
+            binfp64.h5.new.err
+            binfp64.h5.out
+            binfp64.h5.out.err
+            binin8.h5
+            binin8.h5.new
+            binin8.h5.new.err
+            binin8.h5.out
+            binin8.h5.out.err
+            binin8w.h5
+            binin8w.h5.new
+            binin8w.h5.new.err
+            binin8w.h5.out
+            binin8w.h5.out.err
+            binin16.h5
+            binin16.h5.new
+            binin16.h5.new.err
+            binin16.h5.out
+            binin16.h5.out.err
+            binin32.h5
+            binin32.h5.new
+            binin32.h5.new.err
+            binin32.h5.out
+            binin32.h5.out.err
+            binuin16.h5
+            binuin16.h5.new
+            binuin16.h5.new.err
+            binuin16.h5.out
+            binuin16.h5.out.err
+            binuin32.h5
+            binuin32.h5.new
+            binuin32.h5.new.err
+            binuin32.h5.out
+            binuin32.h5.out.err
+            txtstr.h5
+            txtstr.h5.new
+            txtstr.h5.new.err
+            txtstr.h5.out
+            txtstr.h5.out.err
+            textpfe.h5
+            textpfe.h5.new
+            textpfe.h5.new.err
+            textpfe.h5.out
+            textpfe.h5.out.err
+            dbinfp64.h5
+            dbinfp64.h5.bin
+            dbinfp64.h5.imp
+            dbinfp64.h5.imp.err
+            dbinfp64.h5.dmp
+            dbinfp64.h5.dmp.err
+            dbinfp64.h5.dff
+            dbinfp64.h5.dff.err
+            dbinin8.h5
+            dbinin8.h5.bin
+            dbinin8.h5.imp
+            dbinin8.h5.imp.err
+            dbinin8.h5.dmp
+            dbinin8.h5.dmp.err
+            dbinin8.h5.dff
+            dbinin8.h5.dff.err
+            dbinin8w.h5
+            dbinin8w.h5.bin
+            dbinin8w.h5.imp
+            dbinin8w.h5.imp.err
+            dbinin8w.h5.dmp
+            dbinin8w.h5.dmp.err
+            dbinin8w.h5.dff
+            dbinin8w.h5.dff.err
+            dbinin16.h5
+            dbinin16.h5.bin
+            dbinin16.h5.imp
+            dbinin16.h5.imp.err
+            dbinin16.h5.dmp
+            dbinin16.h5.dmp.err
+            dbinin16.h5.dff
+            dbinin16.h5.dff.err
+            dbinin32.h5
+            dbinin32.h5.bin
+            dbinin32.h5.imp
+            dbinin32.h5.imp.err
+            dbinin32.h5.dmp
+            dbinin32.h5.dmp.err
+            dbinin32.h5.dff
+            dbinin32.h5.dff.err
+            dbinuin16.h5
+            dbinuin16.h5.bin
+            dbinuin16.h5.imp
+            dbinuin16.h5.imp.err
+            dbinuin16.h5.dmp
+            dbinuin16.h5.dmp.err
+            dbinuin16.h5.dff
+            dbinuin16.h5.dff.err
+            dbinuin32.h5
+            dbinuin32.h5.bin
+            dbinuin32.h5.imp
+            dbinuin32.h5.imp.err
+            dbinuin32.h5.dmp
+            dbinuin32.h5.dmp.err
+            dbinuin32.h5.dff
+            dbinuin32.h5.dff.err
+            dtxtstr.h5
+            dtxtstr.h5.bin
+            dtxtstr.h5.imp
+            dtxtstr.h5.imp.err
+            dtxtstr.h5.dmp
+            dtxtstr.h5.dmp.err
+            dtxtstr.h5.dff
+            dtxtstr.h5.dff.err
+    )
+    set (last_test "H5IMPORT-clear-objects")
+  endif ()
+
+  add_test (
+      NAME H5IMPORT-h5importtest-clear-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          binfp64.bin
+          binin8.bin
+          binin8w.bin
+          binin16.bin
+          binin32.bin
+          binuin16.bin
+          binuin32.bin
+  )
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (H5IMPORT-h5importtest-clear-objects PROPERTIES DEPENDS ${last_test})
+  endif ()
+  set (last_test "H5IMPORT-clear-objects")
+
+  add_test (NAME H5IMPORT-h5importtest COMMAND $<TARGET_FILE:h5importtest>)
+  set_tests_properties (H5IMPORT-h5importtest PROPERTIES DEPENDS H5IMPORT-h5importtest-clear-objects)
+
+  # ----- TESTING "ASCII I32 rank 3 - Output BE " ;
+  ADD_H5_TEST (ASCII_I32 testfiles/txtin32.txt testfiles/txtin32.conf txtin32.h5)
+
+  # ----- TESTING "ASCII I16 rank 3 - Output LE - CHUNKED - extended"
+  ADD_H5_TEST (ASCII_I16 testfiles/txtin16.txt testfiles/txtin16.conf txtin16.h5)
+
+  # ----- TESTING "ASCII I8 - rank 3 - Output I8 LE-Chunked+Extended+Compressed "
+  ADD_H5_TEST (ASCII_I8 testfiles/txtin8.txt testfiles/txtin8.conf txtin8.h5)
+
+  # ----- TESTING "ASCII UI16 - rank 2 - Output LE+Chunked+Compressed "
+  ADD_H5_TEST (ASCII_UI16 testfiles/txtuin16.txt testfiles/txtuin16.conf txtuin16.h5)
+
+  # ----- TESTING "ASCII UI32 - rank 3 - Output BE"
+  ADD_H5_TEST (ASCII_UI32 testfiles/txtuin32.txt testfiles/txtuin32.conf txtuin32.h5)
+
+  # ----- TESTING "ASCII F32 - rank 3 - Output LE "
+  ADD_H5_TEST (ASCII_F32 testfiles/txtfp32.txt testfiles/txtfp32.conf txtfp32.h5)
+
+  # ----- TESTING "ASCII F64 - rank 3 - Output BE + CHUNKED+Extended+Compressed "
+  ADD_H5_TEST (ASCII_F64 testfiles/txtfp64.txt testfiles/txtfp64.conf txtfp64.h5)
+
+  # ----- TESTING "BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed "
+  ADD_H5_TEST (BINARY_F64 binfp64.bin testfiles/binfp64.conf binfp64.h5)
+  if (NOT USE_FILTER_DEFLATE)
+    ADD_H5_SKIP_DUMPTEST (BINARY_F64 "/fp/bin/64-bit" binfp64.h5 BINARY)
+  else ()
+    ADD_H5_DUMPTEST (BINARY_F64 "/fp/bin/64-bit" binfp64.h5 BINARY)
+  endif ()
+
+  # ----- TESTING "BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed "
+  ADD_H5_TEST (BINARY_I8 binin8.bin testfiles/binin8.conf binin8.h5)
+  if (NOT USE_FILTER_DEFLATE)
+    ADD_H5_SKIP_DUMPTEST (BINARY_I8 "/int/bin/8-bit" binin8.h5 BINARY)
+  else ()
+    ADD_H5_DUMPTEST (BINARY_I8 "/int/bin/8-bit" binin8.h5 BINARY)
+  endif ()
+
+  # ----- TESTING "BINARY I16 - rank 3 - Output order LE + CHUNKED + extended "
+  ADD_H5_TEST (BINARY_I16 binin16.bin testfiles/binin16.conf binin16.h5)
+  ADD_H5_DUMPTEST (BINARY_I16 "/int/bin/16-bit" binin16.h5 BINARY)
+
+  # ----- TESTING "BINARY I32 - rank 3 - Output BE + CHUNKED "
+  ADD_H5_TEST (BINARY_I32 binin32.bin testfiles/binin32.conf binin32.h5)
+  ADD_H5_DUMPTEST (BINARY_I32 "/int/bin/32-bit" binin32.h5 BINARY)
+
+  # ----- TESTING "BINARY UI16 - rank 3 - Output byte BE + CHUNKED "
+  ADD_H5_TEST (BINARY_UI16 binuin16.bin testfiles/binuin16.conf binuin16.h5)
+  ADD_H5_DUMPTEST (BINARY_UI16 "/int/buin/16-bit" binuin16.h5 BINARY)
+
+  # ----- TESTING "BINARY UI32 - rank 3 - Output LE "
+  ADD_H5_TEST (BINARY_UI32 binuin32.bin testfiles/binuin32.conf binuin32.h5)
+  ADD_H5_DUMPTEST (BINARY_UI32 "/int/buin/32-bit" binuin32.h5 BINARY)
+
+  # ----- TESTING "STR"
+  ADD_H5_TEST (STR testfiles/txtstr.txt testfiles/txtstr.conf txtstr.h5)
+  ADD_H5_DUMPTEST (STR "/mytext/data" txtstr.h5)
+
+  # ----- TESTING "BINARY I8 CR LF EOF"
+  ADD_H5_TEST (BINARY_I8_EOF binin8w.bin testfiles/binin8w.conf binin8w.h5)
+  ADD_H5_DUMPTEST (BINARY_I8_EOF "/dataset0" binin8w.h5 BINARY)
+
+  # ----- TESTING "ASCII F64 - rank 1 - INPUT-CLASS TEXTFPE "
+  ADD_H5_TEST (ASCII_F64_R1 testfiles/textpfe64.txt testfiles/textpfe.conf textpfe.h5)
+
diff --git a/tools/test/h5import/Makefile.am b/tools/test/h5import/Makefile.am
new file mode 100644
index 0000000..7c5371c
--- /dev/null
+++ b/tools/test/h5import/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Test programs and scripts
+TEST_PROG=h5importtest
+TEST_SCRIPT=h5importtestutil.sh
+
+check_PROGRAMS=$(TEST_PROG)
+check_SCRIPT=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5import/h5import$(EXEEXT)
+
+# All programs depend on the main hdf5 library and the tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# Temporary files from h5importtest
+CHECK_CLEANFILES+=*.bin
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5import/Makefile.in b/tools/test/h5import/Makefile.in
new file mode 100644
index 0000000..a937aed
--- /dev/null
+++ b/tools/test/h5import/Makefile.in
@@ -0,0 +1,1421 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5importtestutil.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = h5importtest$(EXEEXT)
+h5importtest_SOURCES = h5importtest.c
+h5importtest_OBJECTS = h5importtest.$(OBJEXT)
+h5importtest_LDADD = $(LDADD)
+h5importtest_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 = 
+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 = h5importtest.c
+DIST_SOURCES = h5importtest.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)/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@
+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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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 from h5importtest
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.bin
+
+# Test programs and scripts
+TEST_PROG = h5importtest
+TEST_SCRIPT = h5importtestutil.sh
+check_SCRIPT = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5import/h5import$(EXEEXT)
+
+# All programs depend on the main hdf5 library and the tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5import/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5import/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):
+h5importtestutil.sh: $(top_builddir)/config.status $(srcdir)/h5importtestutil.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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
+
+h5importtest$(EXEEXT): $(h5importtest_OBJECTS) $(h5importtest_DEPENDENCIES) $(EXTRA_h5importtest_DEPENDENCIES) 
+	@rm -f h5importtest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5importtest_OBJECTS) $(h5importtest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5importtest.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+h5importtest.log: h5importtest$(EXEEXT)
+	@p='h5importtest$(EXEEXT)'; \
+	b='h5importtest'; \
+	$(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-dyn: $(DYN)
+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 dyn 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/test/h5import/h5importtest.c b/tools/test/h5import/h5importtest.c
new file mode 100644
index 0000000..135b8e4
--- /dev/null
+++ b/tools/test/h5import/h5importtest.c
@@ -0,0 +1,369 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include "H5private.h"
+
+#ifdef H5_HAVE_WIN32_API
+#define OPEN_FLAGS "wb"
+#else
+#define OPEN_FLAGS "w"
+#endif
+
+/*
+ * Name:
+ *      h5importtest
+ *
+ * Description:
+ *      This program creates that can be
+ *      used to test the h5import program.
+ *
+ */
+
+int
+main(void)
+{
+    int       nrow = 3, ncol = 4, npln = 5;
+    int       i, j, k;
+    FILE      *sp;
+
+    float     row4[3], col4[4], pln4[5];
+    float     rowo4 = 11.0F, colo4 = 21.0F, plno4 = 51.0F;
+    float     rowi4 = 1.0F, coli4 = 2.0F, plni4 = 5.0F;
+
+    int       b32i3[5][3][4];
+    int       row4i[3], col4i[4], pln4i[5];
+    int       rowo4i = 11 , colo4i = 21 , plno4i = 51 ;
+    int       rowi4i = 1 , coli4i = 2 , plni4i = 5 ;
+
+#ifdef H5_SIZEOF_LONG_LONG
+    long long row4i64[3], col4i64[4], pln4i64[5];
+    long long rowo4i64 = (long long)11 , colo4i64 = (long long)21 , plno4i64 = (long long)51 ;
+    long long rowi4i64 = (long long)1 , coli4i64 = (long long)2 , plni4i64 = (long long)5 ;
+#endif
+
+    short     b16i3[5][3][4];
+    short     row4i16[3], col4i16[4], pln4i16[5];
+    short     rowo4i16 = (short)11 , colo4i16 = (short)21 , plno4i16 = (short)51 ;
+    short     rowi4i16 = (short)1 , coli4i16 = (short)2 , plni4i16 = (short)5 ;
+
+    char      b8i3[5][3][4];
+    char      row4i8[3], col4i8[4], pln4i8[5];
+    char      rowo4i8 = (char)11 , colo4i8 = (char)21 , plno4i8 = (char)51 ;
+    char      rowi4i8 = (char)1 , coli4i8 = (char)2 , plni4i8 = (char)5 ;
+
+    double    b64r3[5][3][4];
+    double    row8[3], col8[4], pln8[5];
+    double    rowo8 = 11.0F, colo8 = 21.0F, plno8 = 51.0F;
+    double    rowi8 = 1.0F, coli8 = 2.0F, plni8 = 5.0F;
+
+
+    /*
+    * initialize the row, column, and plane vectors
+    *
+    * row values start at 11 and increment by 1 => 11, 12, 13
+    * column values start at 21 and increment by 2 => 21, 23, 25, 27
+    * plane values start at 51 and increment by 5 => 51, 56, 61, 66, 71
+    */
+
+
+    /*
+    * build array elements - rank 2
+    *
+    * element value = sum of row value and col values
+    */
+
+    row4[0] = rowo4;
+    col4[0] = colo4;
+    pln4[0] = plno4;
+
+    row8[0] = rowo8;
+    col8[0] = colo8;
+    pln8[0] = plno8;
+
+    row4i[0] = rowo4i;
+    col4i[0] = colo4i;
+    pln4i[0] = plno4i;
+
+#ifdef H5_SIZEOF_LONG_LONG
+    row4i64[0] = rowo4i64;
+    col4i64[0] = colo4i64;
+    pln4i64[0] = plno4i64;
+#endif
+
+    row4i16[0] = rowo4i16;
+    col4i16[0] = colo4i16;
+    pln4i16[0] = plno4i16;
+
+    row4i8[0] = rowo4i8;
+    col4i8[0] = colo4i8;
+    pln4i8[0] = plno4i8;
+
+    for (i = 1; i < nrow; i++)
+    {
+        row4[i] = row4[i - 1] + rowi4;
+        row8[i] = row8[i - 1] + rowi8;
+        row4i[i] = row4i[i - 1] + rowi4i;
+#ifdef H5_SIZEOF_LONG_LONG
+        row4i64[i] = row4i64[i - 1] + rowi4i64;
+#endif
+        row4i16[i] = (short)(row4i16[i - 1] + rowi4i16);
+        row4i8[i] = (char)(row4i8[i - 1] + rowi4i8);
+    }
+
+    for (j = 1; j < ncol; j++)
+    {
+        col4[j] = col4[j - 1] + coli4;
+        col8[j] = col8[j - 1] + coli8;
+        col4i[j] = col4i[j - 1] + coli4i;
+#ifdef H5_SIZEOF_LONG_LONG
+        col4i64[j] = col4i64[j - 1] + coli4i64;
+#endif
+        col4i16[j] = (short)(col4i16[j - 1] + coli4i16);
+        col4i8[j] = (char)(col4i8[j - 1] + coli4i8);
+    }
+    for (k = 1; k < npln; k++)
+    {
+        pln4[k] = pln4[k - 1] + plni4;
+        pln8[k] = pln8[k - 1] + plni8;
+        pln4i[k] = pln4i[k - 1] + plni4i;
+#ifdef H5_SIZEOF_LONG_LONG
+        pln4i64[k] = pln4i64[k - 1] + plni4i64;
+#endif
+        pln4i16[k] = (short)(pln4i16[k - 1] + plni4i16);
+        pln4i8[k] = (char)(pln4i8[k - 1] + plni4i8);
+    }
+
+    /*
+    * build array elements - rank 3
+    *
+    * element value = sum of row value, col, and plane values
+    */
+
+    for (i = 0; i < nrow; i++)
+        for (j = 0; j < ncol; j++)
+            for (k = 0; k < npln; k++) {
+                b64r3[k][i][j] = row8[i] + col8[j] + pln8[k];
+                b32i3[k][i][j] = row4i[i] + col4i[j] + pln4i[k];
+                b16i3[k][i][j] = (short)(row4i16[i] + col4i16[j] + pln4i16[k]);
+                b8i3[k][i][j] = (char)(row4i8[i] + col4i8[j] + pln4i8[k]);
+            }
+
+
+
+#ifndef UNICOS
+
+#ifdef REBUILDTEXTFILES
+ /*-------------------------------------------------------------------------
+  * TOOLTEST txtin8.txt -c $srcdir/testfiles/txtin8.conf -o txtin8.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("txtin8.txt", "w");
+    for (k = 0; k < npln; k++)
+    {
+       for (i = 0; i < nrow; i++)
+       {
+           for (j = 0; j < ncol; j++)
+               (void) fprintf(sp, "%10u", b8i3[k][i][j]);
+           (void) fprintf(sp, "\n");
+       }
+    }
+    (void) HDfclose(sp);
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST txtin16.txt -c $srcdir/testfiles/txtin16.conf -o txtin16.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("txtin16.txt", "w");
+    for (k = 0; k < npln; k++)
+    {
+      for (i = 0; i < nrow; i++)
+      {
+          for (j = 0; j < ncol; j++)
+              (void) fprintf(sp, "%10u", b16i3[k][i][j]);
+          (void) fprintf(sp, "\n");
+      }
+    }
+    (void) HDfclose(sp);
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST txtin32.txt -c $srcdir/testfiles/textin32.conf -o textin32.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("txtin32.txt", "w");
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+                (void) fprintf(sp, "%10d", b32i3[k][i][j]);
+            (void) fprintf(sp, "\n");
+        }
+    }
+    (void) HDfclose(sp);
+#endif
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binin32.bin -c $srcdir/testfiles/binin32.conf -o binin32.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("binin32.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b32i3[k][i][j], sizeof(int), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binuin32.bin -c $srcdir/testfiles/binuin32.conf -o binuin32.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("binuin32.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b32i3[k][i][j], sizeof(unsigned int), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+
+
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binin16.bin -c $srcdir/testfiles/binin16.conf -o binin16.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("binin16.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b16i3[k][i][j], sizeof(short), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binuin16.bin -c $srcdir/testfiles/binuin16.conf -o binuin16.h5
+  *-------------------------------------------------------------------------
+  */
+    sp = HDfopen("binuin16.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b16i3[k][i][j], sizeof(unsigned short), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binin8.bin -c $srcdir/testfiles/binin8.conf  -o binin8.h5
+  *-------------------------------------------------------------------------
+  */
+
+    sp = HDfopen("binin8.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b8i3[k][i][j], sizeof(char), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+#endif /* UNICOS */
+
+
+
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binfp64.bin -c $srcdir/testfiles/binfp64.conf -o binfp64.h5
+  *-------------------------------------------------------------------------
+  */
+
+ /*
+  * binary 64-bit file - rank 2 & 3
+  */
+
+    sp = HDfopen("binfp64.bin", OPEN_FLAGS);
+    for (k = 0; k < npln; k++)
+    {
+        for (i = 0; i < nrow; i++)
+        {
+            for (j = 0; j < ncol; j++)
+            {
+                (void) HDfwrite((char *) &b64r3[k][i][j], sizeof(double), 1, sp);
+            }
+        }
+    }
+    (void) HDfclose(sp);
+
+
+
+ /*-------------------------------------------------------------------------
+  * TOOLTEST binin8w.bin -c $srcdir/testfiles/binin8w.conf -o binin8w.h5
+  *-------------------------------------------------------------------------
+  */
+
+    {
+        /* test CR+LF (13,10) and EOF (26) in windows */
+        char bin8w[4] = {13,10,26,0};
+
+        sp = HDfopen("binin8w.bin", OPEN_FLAGS);
+        for (i = 0; i < 4; i++)
+        {
+            char c = bin8w[i];
+            if ( HDfwrite( &c, sizeof(char), 1, sp) != 1 )
+                printf("error writing file\n");
+        }
+        HDfclose(sp);
+
+
+    }
+
+
+
+
+
+    return (EXIT_SUCCESS);
+}
+
diff --git a/tools/test/h5import/h5importtestutil.sh.in b/tools/test/h5import/h5importtestutil.sh.in
new file mode 100644
index 0000000..3bbe37b
--- /dev/null
+++ b/tools/test/h5import/h5importtestutil.sh.in
@@ -0,0 +1,382 @@
+#!/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the  h5import tool
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5import
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=../../src/h5dump/h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../../src/h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../../src/h5import/h5import     # The h5import tool name
+H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
+
+RM='rm -rf'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# initialize errors variable
+nerrors=0
+
+# 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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testfiles
+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_H5IMPORT_TESTFILES/binfp64.h5
+$SRC_H5IMPORT_TESTFILES/binin8.h5
+$SRC_H5IMPORT_TESTFILES/binin8w.h5
+$SRC_H5IMPORT_TESTFILES/binin16.h5
+$SRC_H5IMPORT_TESTFILES/binin32.h5
+$SRC_H5IMPORT_TESTFILES/binuin16.h5
+$SRC_H5IMPORT_TESTFILES/binuin32.h5
+$SRC_H5IMPORT_TESTFILES/txtfp32.h5
+$SRC_H5IMPORT_TESTFILES/txtfp64.h5
+$SRC_H5IMPORT_TESTFILES/txtin8.h5
+$SRC_H5IMPORT_TESTFILES/txtin16.h5
+$SRC_H5IMPORT_TESTFILES/txtin32.h5
+$SRC_H5IMPORT_TESTFILES/txtuin16.h5
+$SRC_H5IMPORT_TESTFILES/txtuin32.h5
+$SRC_H5IMPORT_TESTFILES/txtstr.h5
+$SRC_H5IMPORT_TESTFILES/textpfe.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5IMPORT_TESTFILES/binfp64.conf
+$SRC_H5IMPORT_TESTFILES/binin8.conf
+$SRC_H5IMPORT_TESTFILES/binin8w.conf
+$SRC_H5IMPORT_TESTFILES/binin16.conf
+$SRC_H5IMPORT_TESTFILES/binin32.conf
+$SRC_H5IMPORT_TESTFILES/binuin16.conf
+$SRC_H5IMPORT_TESTFILES/binuin32.conf
+$SRC_H5IMPORT_TESTFILES/txtfp32.conf
+$SRC_H5IMPORT_TESTFILES/txtfp64.conf
+$SRC_H5IMPORT_TESTFILES/txtin8.conf
+$SRC_H5IMPORT_TESTFILES/txtin16.conf
+$SRC_H5IMPORT_TESTFILES/txtin32.conf
+$SRC_H5IMPORT_TESTFILES/txtuin16.conf
+$SRC_H5IMPORT_TESTFILES/txtuin32.conf
+$SRC_H5IMPORT_TESTFILES/textpfe.conf
+$SRC_H5IMPORT_TESTFILES/txtstr.conf
+$SRC_H5IMPORT_TESTFILES/txtfp32.txt
+$SRC_H5IMPORT_TESTFILES/txtfp64.txt
+$SRC_H5IMPORT_TESTFILES/txtuin16.txt
+$SRC_H5IMPORT_TESTFILES/txtuin32.txt
+$SRC_H5IMPORT_TESTFILES/txtin8.txt
+$SRC_H5IMPORT_TESTFILES/txtin16.txt
+$SRC_H5IMPORT_TESTFILES/txtin32.txt
+$SRC_H5IMPORT_TESTFILES/textpfe64.txt
+$SRC_H5IMPORT_TESTFILES/txtstr.txt
+$SRC_H5IMPORT_TESTFILES/dbinfp64.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinin8.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinin8w.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinin16.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinin32.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinuin16.h5.txt
+$SRC_H5IMPORT_TESTFILES/dbinuin32.h5.txt
+$SRC_H5IMPORT_TESTFILES/dtxtstr.h5.txt
+"
+
+#
+# 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=$SRC_H5IMPORT_TESTFILES
+    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'
+}
+
+# Print a "SKIP" message
+SKIP() {
+   TESTING $TESTNAME $@
+    echo  " -SKIP-"
+}
+
+TOOLTEST()
+{
+err=0
+$RUNSERIAL $H5IMPORT_BIN $*
+$RUNSERIAL $DUMPER_BIN $5 >log2
+
+cd tmp_testfiles
+$RUNSERIAL $DUMPER_BIN $5 >log1
+cd ..
+
+cmp -s tmp_testfiles/log1 log2 || err=1
+rm -f log2 tmp_testfiles/log1
+if [ $err -eq 1 ]; then
+nerrors="` expr $nerrors + 1 `";
+  echo "*FAILED*"
+else
+  echo " PASSED"
+fi
+}
+
+# Use h5dump output as input to h5import for binary numbers
+# Use h5diff to verify results
+TOOLTEST2()
+{
+err=0
+$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -b tmp_testfiles/$2 > d$2.dmp
+$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
+$RUNSERIAL $H5DIFF_BIN -v d$2 tmp_testfiles/$2 $1 $1 > log2
+$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
+
+cmp -s log1 log2 || err=1
+rm -f log1 log2
+if [ $err -eq 1 ]; then
+nerrors="` expr $nerrors + 1 `";
+  echo "*FAILED*"
+else
+  echo " PASSED"
+fi
+}
+
+# Same as TOOLTEST2 except for strings
+# Use h5dump output as input to h5import for strings
+# Use h5diff to verify results
+TOOLTEST3()
+{
+err=0
+$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -y --width=1 tmp_testfiles/$2 > d$2.dmp
+$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
+$RUNSERIAL $H5DIFF_BIN -v d$2 tmp_testfiles/$2 $1 $1 > log2
+$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
+
+cmp -s log1 log2 || err=1
+rm -f log1 log2
+if [ $err -eq 1 ]; then
+nerrors="` expr $nerrors + 1 `";
+  echo "*FAILED*"
+else
+  echo " PASSED"
+fi
+}
+
+# Same as TOOLTEST3 except for h5diff uses report mode without warnings
+# Use h5dump output as input to h5import for strings
+# Use h5diff to verify results
+TOOLTEST4()
+{
+err=0
+$RUNSERIAL $DUMPER_BIN -p -d $1 -o d$2.bin -y --width=1 tmp_testfiles/$2 > d$2.dmp
+$RUNSERIAL $H5IMPORT_BIN d$2.bin -c d$2.dmp -o d$2 > d$2.imp
+$RUNSERIAL $H5DIFF_BIN -r d$2 tmp_testfiles/$2 $1 $1 > log2
+$CP -f $SRC_H5IMPORT_TESTFILES/d$2.txt log1
+
+
+cmp -s log1 log2 || err=1
+rm -f log1 log2
+if [ $err -eq 1 ]; then
+nerrors="` expr $nerrors + 1 `";
+  echo "*FAILED*"
+else
+  echo " PASSED"
+fi
+}
+
+echo "" 
+echo "=============================="
+echo "H5IMPORT tests started"
+echo "=============================="
+
+#echo "** Testing h5import  ***"
+
+rm -f  output.h5 log1 tx* b* *.dat
+
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+mkdir tmp_testfiles
+$CP $TESTDIR/*.h5 ./tmp_testfiles/
+
+$RUNSERIAL ./h5importtest
+
+################################################
+###        T H E   T E S T S
+################################################
+
+TESTING "ASCII I32 rank 3 - Output BE " ;
+TOOLTEST $TESTDIR/txtin32.txt -c $TESTDIR/txtin32.conf -o txtin32.h5
+
+TESTING "ASCII I16 rank 3 - Output LE - CHUNKED - extended" 
+TOOLTEST $TESTDIR/txtin16.txt -c $TESTDIR/txtin16.conf -o txtin16.h5
+
+TESTING "ASCII I8 - rank 3 - Output I8 LE-Chunked+Extended+Compressed " 
+TOOLTEST $TESTDIR/txtin8.txt -c $TESTDIR/txtin8.conf  -o txtin8.h5
+
+
+TESTING "ASCII UI16 - rank 2 - Output LE+Chunked+Compressed " 
+TOOLTEST $TESTDIR/txtuin16.txt -c $TESTDIR/txtuin16.conf -o txtuin16.h5
+
+TESTING "ASCII UI32 - rank 3 - Output BE" 
+TOOLTEST $TESTDIR/txtuin32.txt -c $TESTDIR/txtuin32.conf -o txtuin32.h5
+
+
+TESTING "ASCII F32 - rank 3 - Output LE " 
+TOOLTEST $TESTDIR/txtfp32.txt -c $TESTDIR/txtfp32.conf -o txtfp32.h5
+
+TESTING "ASCII F64 - rank 3 - Output BE + CHUNKED+Extended+Compressed " 
+TOOLTEST $TESTDIR/txtfp64.txt -c $TESTDIR/txtfp64.conf -o txtfp64.h5
+
+
+TESTING "BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed " 
+TOOLTEST binfp64.bin -c $TESTDIR/binfp64.conf -o binfp64.h5
+TESTING "H5DUMP-BINARY F64 - rank 3 - Output LE+CHUNKED+Extended+Compressed " 
+if test $USE_FILTER_DEFLATE != "yes"; then
+ SKIP "/fp/bin/64-bit" binfp64.h5
+else
+ TOOLTEST2 "/fp/bin/64-bit" binfp64.h5
+fi
+
+
+TESTING "BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed " 
+TOOLTEST binin8.bin -c $TESTDIR/binin8.conf -o binin8.h5
+TESTING "H5DUMP-BINARY I8 - rank 3 - Output I16LE + Chunked+Extended+Compressed " 
+if test $USE_FILTER_DEFLATE != "yes"; then
+ SKIP "/int/bin/8-bit" binin8.h5
+else
+ TOOLTEST2 "/int/bin/8-bit" binin8.h5
+fi
+
+TESTING "BINARY I16 - rank 3 - Output order LE + CHUNKED + extended " 
+TOOLTEST binin16.bin -c $TESTDIR/binin16.conf -o binin16.h5
+TESTING "H5DUMP-BINARY I16 - rank 3 - Output order LE + CHUNKED + extended " 
+TOOLTEST2 "/int/bin/16-bit" binin16.h5
+
+TESTING "BINARY I32 - rank 3 - Output BE + CHUNKED " 
+TOOLTEST binin32.bin -c $TESTDIR/binin32.conf -o binin32.h5
+TESTING "H5DUMP-BINARY I32 - rank 3 - Output BE + CHUNKED " 
+TOOLTEST2 "/int/bin/32-bit" binin32.h5
+
+
+TESTING "BINARY UI16 - rank 3 - Output byte BE + CHUNKED " 
+TOOLTEST binuin16.bin -c $TESTDIR/binuin16.conf -o binuin16.h5
+TESTING "H5DUMP-BINARY UI16 - rank 3 - Output byte BE + CHUNKED " 
+TOOLTEST2 "/int/buin/16-bit" binuin16.h5
+
+TESTING "BINARY UI32 - rank 3 - Output LE + CHUNKED " 
+TOOLTEST binuin32.bin -c $TESTDIR/binuin32.conf -o binuin32.h5
+TESTING "H5DUMP-BINARY UI32 - rank 3 - Output LE + CHUNKED " 
+TOOLTEST2 "/int/buin/32-bit" binuin32.h5
+
+
+TESTING "STR" 
+TOOLTEST $TESTDIR/txtstr.txt -c $TESTDIR/txtstr.conf -o txtstr.h5
+TESTING "H5DUMP-STR" 
+TOOLTEST4 "/mytext/data" txtstr.h5
+
+
+TESTING "BINARY I8 CR LF EOF" 
+TOOLTEST binin8w.bin -c $TESTDIR/binin8w.conf -o binin8w.h5
+TESTING "H5DUMP-BINARY I8 CR LF EOF" 
+TOOLTEST2 "/dataset0" binin8w.h5
+
+TESTING "ASCII F64 - rank 1 - INPUT-CLASS TEXTFPE " 
+TOOLTEST $TESTDIR/textpfe64.txt -c $TESTDIR/textpfe.conf -o textpfe.h5
+
+
+rm -f  txtin32.txt txtin16.txt txtin8.txt txtuin32.txt txtuin16.txt *.bin *.dmp *.imp *.h5
+rm -rf tmp_testfiles
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+#
+# Check errors result
+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/testfiles/binfp64.conf b/tools/test/h5import/testfiles/binfp64.conf
similarity index 100%
rename from tools/h5import/testfiles/binfp64.conf
rename to tools/test/h5import/testfiles/binfp64.conf
diff --git a/tools/test/h5import/testfiles/binfp64.h5 b/tools/test/h5import/testfiles/binfp64.h5
new file mode 100644
index 0000000..80e3a8a
Binary files /dev/null and b/tools/test/h5import/testfiles/binfp64.h5 differ
diff --git a/tools/h5import/testfiles/binin16.conf b/tools/test/h5import/testfiles/binin16.conf
similarity index 100%
rename from tools/h5import/testfiles/binin16.conf
rename to tools/test/h5import/testfiles/binin16.conf
diff --git a/tools/test/h5import/testfiles/binin16.h5 b/tools/test/h5import/testfiles/binin16.h5
new file mode 100644
index 0000000..0825bbc
Binary files /dev/null and b/tools/test/h5import/testfiles/binin16.h5 differ
diff --git a/tools/h5import/testfiles/binin32.conf b/tools/test/h5import/testfiles/binin32.conf
similarity index 100%
rename from tools/h5import/testfiles/binin32.conf
rename to tools/test/h5import/testfiles/binin32.conf
diff --git a/tools/test/h5import/testfiles/binin32.h5 b/tools/test/h5import/testfiles/binin32.h5
new file mode 100644
index 0000000..fd8faa9
Binary files /dev/null and b/tools/test/h5import/testfiles/binin32.h5 differ
diff --git a/tools/h5import/testfiles/binin8.conf b/tools/test/h5import/testfiles/binin8.conf
similarity index 100%
rename from tools/h5import/testfiles/binin8.conf
rename to tools/test/h5import/testfiles/binin8.conf
diff --git a/tools/test/h5import/testfiles/binin8.h5 b/tools/test/h5import/testfiles/binin8.h5
new file mode 100644
index 0000000..a1d1a37
Binary files /dev/null and b/tools/test/h5import/testfiles/binin8.h5 differ
diff --git a/tools/h5import/testfiles/binin8w.conf b/tools/test/h5import/testfiles/binin8w.conf
similarity index 100%
rename from tools/h5import/testfiles/binin8w.conf
rename to tools/test/h5import/testfiles/binin8w.conf
diff --git a/tools/h5import/testfiles/binin8w.h5 b/tools/test/h5import/testfiles/binin8w.h5
similarity index 100%
rename from tools/h5import/testfiles/binin8w.h5
rename to tools/test/h5import/testfiles/binin8w.h5
diff --git a/tools/h5import/testfiles/binuin16.conf b/tools/test/h5import/testfiles/binuin16.conf
similarity index 100%
rename from tools/h5import/testfiles/binuin16.conf
rename to tools/test/h5import/testfiles/binuin16.conf
diff --git a/tools/test/h5import/testfiles/binuin16.h5 b/tools/test/h5import/testfiles/binuin16.h5
new file mode 100644
index 0000000..c486c89
Binary files /dev/null and b/tools/test/h5import/testfiles/binuin16.h5 differ
diff --git a/tools/h5import/testfiles/binuin32.conf b/tools/test/h5import/testfiles/binuin32.conf
similarity index 100%
rename from tools/h5import/testfiles/binuin32.conf
rename to tools/test/h5import/testfiles/binuin32.conf
diff --git a/tools/test/h5import/testfiles/binuin32.h5 b/tools/test/h5import/testfiles/binuin32.h5
new file mode 100644
index 0000000..41699d7
Binary files /dev/null and b/tools/test/h5import/testfiles/binuin32.h5 differ
diff --git a/tools/h5import/testfiles/dbinfp64.h5.txt b/tools/test/h5import/testfiles/dbinfp64.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinfp64.h5.txt
rename to tools/test/h5import/testfiles/dbinfp64.h5.txt
diff --git a/tools/h5import/testfiles/dbinin16.h5.txt b/tools/test/h5import/testfiles/dbinin16.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinin16.h5.txt
rename to tools/test/h5import/testfiles/dbinin16.h5.txt
diff --git a/tools/h5import/testfiles/dbinin32.h5.txt b/tools/test/h5import/testfiles/dbinin32.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinin32.h5.txt
rename to tools/test/h5import/testfiles/dbinin32.h5.txt
diff --git a/tools/h5import/testfiles/dbinin8.h5.txt b/tools/test/h5import/testfiles/dbinin8.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinin8.h5.txt
rename to tools/test/h5import/testfiles/dbinin8.h5.txt
diff --git a/tools/h5import/testfiles/dbinin8w.h5.txt b/tools/test/h5import/testfiles/dbinin8w.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinin8w.h5.txt
rename to tools/test/h5import/testfiles/dbinin8w.h5.txt
diff --git a/tools/h5import/testfiles/dbinuin16.h5.txt b/tools/test/h5import/testfiles/dbinuin16.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinuin16.h5.txt
rename to tools/test/h5import/testfiles/dbinuin16.h5.txt
diff --git a/tools/h5import/testfiles/dbinuin32.h5.txt b/tools/test/h5import/testfiles/dbinuin32.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dbinuin32.h5.txt
rename to tools/test/h5import/testfiles/dbinuin32.h5.txt
diff --git a/tools/h5import/testfiles/dtxtstr.h5.txt b/tools/test/h5import/testfiles/dtxtstr.h5.txt
similarity index 100%
rename from tools/h5import/testfiles/dtxtstr.h5.txt
rename to tools/test/h5import/testfiles/dtxtstr.h5.txt
diff --git a/tools/h5import/testfiles/textpfe.conf b/tools/test/h5import/testfiles/textpfe.conf
similarity index 100%
rename from tools/h5import/testfiles/textpfe.conf
rename to tools/test/h5import/testfiles/textpfe.conf
diff --git a/tools/h5import/testfiles/textpfe.h5 b/tools/test/h5import/testfiles/textpfe.h5
similarity index 100%
rename from tools/h5import/testfiles/textpfe.h5
rename to tools/test/h5import/testfiles/textpfe.h5
diff --git a/tools/h5import/testfiles/textpfe64.txt b/tools/test/h5import/testfiles/textpfe64.txt
similarity index 100%
rename from tools/h5import/testfiles/textpfe64.txt
rename to tools/test/h5import/testfiles/textpfe64.txt
diff --git a/tools/h5import/testfiles/txtfp32.conf b/tools/test/h5import/testfiles/txtfp32.conf
similarity index 100%
rename from tools/h5import/testfiles/txtfp32.conf
rename to tools/test/h5import/testfiles/txtfp32.conf
diff --git a/tools/test/h5import/testfiles/txtfp32.h5 b/tools/test/h5import/testfiles/txtfp32.h5
new file mode 100644
index 0000000..f74e003
Binary files /dev/null and b/tools/test/h5import/testfiles/txtfp32.h5 differ
diff --git a/tools/h5import/testfiles/txtfp32.txt b/tools/test/h5import/testfiles/txtfp32.txt
similarity index 100%
rename from tools/h5import/testfiles/txtfp32.txt
rename to tools/test/h5import/testfiles/txtfp32.txt
diff --git a/tools/h5import/testfiles/txtfp64.conf b/tools/test/h5import/testfiles/txtfp64.conf
similarity index 100%
rename from tools/h5import/testfiles/txtfp64.conf
rename to tools/test/h5import/testfiles/txtfp64.conf
diff --git a/tools/test/h5import/testfiles/txtfp64.h5 b/tools/test/h5import/testfiles/txtfp64.h5
new file mode 100644
index 0000000..b6ba4f5
Binary files /dev/null and b/tools/test/h5import/testfiles/txtfp64.h5 differ
diff --git a/tools/h5import/testfiles/txtfp64.txt b/tools/test/h5import/testfiles/txtfp64.txt
similarity index 100%
rename from tools/h5import/testfiles/txtfp64.txt
rename to tools/test/h5import/testfiles/txtfp64.txt
diff --git a/tools/h5import/testfiles/txtin16.conf b/tools/test/h5import/testfiles/txtin16.conf
similarity index 100%
rename from tools/h5import/testfiles/txtin16.conf
rename to tools/test/h5import/testfiles/txtin16.conf
diff --git a/tools/test/h5import/testfiles/txtin16.h5 b/tools/test/h5import/testfiles/txtin16.h5
new file mode 100644
index 0000000..dc6c1ea
Binary files /dev/null and b/tools/test/h5import/testfiles/txtin16.h5 differ
diff --git a/tools/h5import/testfiles/txtin16.txt b/tools/test/h5import/testfiles/txtin16.txt
similarity index 100%
rename from tools/h5import/testfiles/txtin16.txt
rename to tools/test/h5import/testfiles/txtin16.txt
diff --git a/tools/h5import/testfiles/txtin32.conf b/tools/test/h5import/testfiles/txtin32.conf
similarity index 100%
rename from tools/h5import/testfiles/txtin32.conf
rename to tools/test/h5import/testfiles/txtin32.conf
diff --git a/tools/test/h5import/testfiles/txtin32.h5 b/tools/test/h5import/testfiles/txtin32.h5
new file mode 100644
index 0000000..350333c
Binary files /dev/null and b/tools/test/h5import/testfiles/txtin32.h5 differ
diff --git a/tools/h5import/testfiles/txtin32.txt b/tools/test/h5import/testfiles/txtin32.txt
similarity index 100%
rename from tools/h5import/testfiles/txtin32.txt
rename to tools/test/h5import/testfiles/txtin32.txt
diff --git a/tools/h5import/testfiles/txtin8.conf b/tools/test/h5import/testfiles/txtin8.conf
similarity index 100%
rename from tools/h5import/testfiles/txtin8.conf
rename to tools/test/h5import/testfiles/txtin8.conf
diff --git a/tools/test/h5import/testfiles/txtin8.h5 b/tools/test/h5import/testfiles/txtin8.h5
new file mode 100644
index 0000000..42e7727
Binary files /dev/null and b/tools/test/h5import/testfiles/txtin8.h5 differ
diff --git a/tools/h5import/testfiles/txtin8.txt b/tools/test/h5import/testfiles/txtin8.txt
similarity index 100%
rename from tools/h5import/testfiles/txtin8.txt
rename to tools/test/h5import/testfiles/txtin8.txt
diff --git a/tools/h5import/testfiles/txtstr.conf b/tools/test/h5import/testfiles/txtstr.conf
similarity index 100%
rename from tools/h5import/testfiles/txtstr.conf
rename to tools/test/h5import/testfiles/txtstr.conf
diff --git a/tools/h5import/testfiles/txtstr.h5 b/tools/test/h5import/testfiles/txtstr.h5
similarity index 100%
rename from tools/h5import/testfiles/txtstr.h5
rename to tools/test/h5import/testfiles/txtstr.h5
diff --git a/tools/h5import/testfiles/txtstr.txt b/tools/test/h5import/testfiles/txtstr.txt
similarity index 100%
rename from tools/h5import/testfiles/txtstr.txt
rename to tools/test/h5import/testfiles/txtstr.txt
diff --git a/tools/h5import/testfiles/txtuin16.conf b/tools/test/h5import/testfiles/txtuin16.conf
similarity index 100%
rename from tools/h5import/testfiles/txtuin16.conf
rename to tools/test/h5import/testfiles/txtuin16.conf
diff --git a/tools/test/h5import/testfiles/txtuin16.h5 b/tools/test/h5import/testfiles/txtuin16.h5
new file mode 100644
index 0000000..9ee166a
Binary files /dev/null and b/tools/test/h5import/testfiles/txtuin16.h5 differ
diff --git a/tools/h5import/testfiles/txtuin16.txt b/tools/test/h5import/testfiles/txtuin16.txt
similarity index 100%
rename from tools/h5import/testfiles/txtuin16.txt
rename to tools/test/h5import/testfiles/txtuin16.txt
diff --git a/tools/h5import/testfiles/txtuin32.conf b/tools/test/h5import/testfiles/txtuin32.conf
similarity index 100%
rename from tools/h5import/testfiles/txtuin32.conf
rename to tools/test/h5import/testfiles/txtuin32.conf
diff --git a/tools/test/h5import/testfiles/txtuin32.h5 b/tools/test/h5import/testfiles/txtuin32.h5
new file mode 100644
index 0000000..1a4dda5
Binary files /dev/null and b/tools/test/h5import/testfiles/txtuin32.h5 differ
diff --git a/tools/h5import/testfiles/txtuin32.txt b/tools/test/h5import/testfiles/txtuin32.txt
similarity index 100%
rename from tools/h5import/testfiles/txtuin32.txt
rename to tools/test/h5import/testfiles/txtuin32.txt
diff --git a/tools/test/h5jam/CMakeLists.txt b/tools/test/h5jam/CMakeLists.txt
new file mode 100644
index 0000000..562b4f3
--- /dev/null
+++ b/tools/test/h5jam/CMakeLists.txt
@@ -0,0 +1,34 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5JAM)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the h5jam test executables
+  # --------------------------------------------------------------------
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5jamgentest ${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/h5jamgentest.c)
+    TARGET_NAMING (h5jamgentest STATIC)
+    TARGET_C_PROPERTIES (testhdf5 STATIC " " " ")
+    target_link_libraries (h5jamgentest ${HDF5_LIB_TARGET})
+    set_target_properties (h5jamgentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5jamgentest COMMAND $<TARGET_FILE:h5jamgentest>)
+  endif ()
+
+add_executable (getub ${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/getub.c)
+TARGET_NAMING (getub STATIC)
+TARGET_C_PROPERTIES (getub STATIC " " " ")
+target_link_libraries (getub  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (getub PROPERTIES FOLDER tools)
+
+add_executable (tellub ${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/tellub.c)
+TARGET_NAMING (tellub STATIC)
+TARGET_C_PROPERTIES (tellub STATIC " " " ")
+target_link_libraries (tellub  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (tellub PROPERTIES FOLDER tools)
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5jam/CMakeTests.cmake b/tools/test/h5jam/CMakeTests.cmake
new file mode 100644
index 0000000..ae6d440
--- /dev/null
+++ b/tools/test/h5jam/CMakeTests.cmake
@@ -0,0 +1,395 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  set (HDF5_REFERENCE_TXT_FILES
+      u10.txt
+      u511.txt
+      u512.txt
+      u513.txt
+      h5jam-help.txt
+      h5unjam-help.txt
+      h5jam-ub-nohdf5.txt
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      tall.h5
+      twithub.h5
+      twithub513.h5
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_file}" "h5jam_files")
+  endforeach ()
+
+  foreach (txt_file ${HDF5_REFERENCE_TXT_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/testfiles/${txt_file}" "${PROJECT_BINARY_DIR}/testfiles/${txt_file}" "h5jam_files")
+  endforeach ()
+  add_custom_target(h5jam_files ALL COMMENT "Copying files needed by h5jam tests" DEPENDS ${h5jam_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  # ============================================================
+  # TEST_H5JAM_OUTPUT
+  # For the purpose to verify only output & exitcode from h5jam
+  #
+  macro (TEST_H5JAM_OUTPUT expectfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5JAM-${expectfile} COMMAND $<TARGET_FILE:h5jam> ${ARGN})
+      if (NOT "${resultcode}" STREQUAL "0")
+        set_tests_properties (H5JAM-${expectfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+    else ()
+      add_test (
+          NAME H5JAM-${expectfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5jam>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${expectfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=testfiles/${expectfile}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  # ============================================================
+  # TEST_H5UNJAM_OUTPUT
+  # For the purpose to verify only output & exitcode from h5unjam
+  #
+  macro (TEST_H5UNJAM_OUTPUT expectfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5JAM-UNJAM-${expectfile} COMMAND $<TARGET_FILE:h5unjam> ${ARGN})
+      if (NOT "${resultcode}" STREQUAL "0")
+        set_tests_properties (H5JAM-UNJAM-${expectfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+    else ()
+      add_test (
+          NAME H5JAM-UNJAM-${expectfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5unjam>"
+              -D "TEST_ARGS=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${expectfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=testfiles/${expectfile}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (CHECKFILE testname testdepends expected actual)
+    # If using memchecker add tests without using scripts
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5JAM-${testname}-CHECKFILE-H5DMP
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=testfiles/${expected}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${actual}.new"
+              -D "TEST_EXPECT=0"
+              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
+              -D "TEST_SKIP_COMPARE=TRUE"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5JAM-${testname}-CHECKFILE-H5DMP PROPERTIES DEPENDS ${testdepends})
+      add_test (
+          NAME H5JAM-${testname}-CHECKFILE-H5DMP_CMP
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${actual}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${actual}.out"
+              -D "TEST_EXPECT=0"
+              -D "TEST_FILTER=(^(HDF5)[^\n]*)"
+              -D "TEST_REFERENCE=${actual}.new"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5JAM-${testname}-CHECKFILE-H5DMP_CMP PROPERTIES DEPENDS H5JAM-${testname}-CHECKFILE-H5DMP)
+    endif ()
+  endmacro()
+
+  macro (UNJAMTEST testname setfile infile ufile chkfile outfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5JAM-${testname}-UNJAM-SETUP-clear-objects
+          COMMAND ${CMAKE_COMMAND} -E remove ${infile}
+      )
+      add_test (
+          NAME H5JAM-${testname}-UNJAM-SETUP
+          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${HDF5_TOOLS_TEST_H5JAM_SOURCE_DIR}/testfiles/${setfile} ${PROJECT_BINARY_DIR}/${infile}
+      )
+      set_tests_properties (H5JAM-${testname}-UNJAM-SETUP PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-SETUP-clear-objects)
+      add_test (
+          NAME H5JAM-${testname}-UNJAM-clear-objects
+          COMMAND ${CMAKE_COMMAND} -E remove ${outfile}
+      )
+      set_tests_properties (H5JAM-${testname}-UNJAM-clear-objects PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-SETUP)
+      if (NOT "${ufile}" STREQUAL "NONE")
+        add_test (
+            NAME H5JAM-${testname}-UNJAM_D-clear-objects
+            COMMAND ${CMAKE_COMMAND} -E remove ${ufile}
+        )
+        set_tests_properties (H5JAM-${testname}-UNJAM_D-clear-objects PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
+        add_test (NAME H5JAM-${testname}-UNJAM COMMAND $<TARGET_FILE:h5unjam> -i ${infile} -u ${ufile} -o ${outfile})
+        set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM_D-clear-objects)
+        set (compare_test ${ufile})
+      else ()
+        if (NOT "${ARGN}" STREQUAL "--delete")
+          add_test (
+              NAME H5JAM-${testname}-UNJAM
+              COMMAND "${CMAKE_COMMAND}"
+                  -D "TEST_PROGRAM=$<TARGET_FILE:h5unjam>"
+                  -D "TEST_ARGS:STRING=-i;${infile};-o;${outfile}"
+                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+                  -D "TEST_OUTPUT=${outfile}.ufile.txt"
+                  -D "TEST_EXPECT=0"
+                  -D "TEST_SKIP_COMPARE=TRUE"
+                  -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+          )
+          set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
+          set (compare_test "${outfile}.ufile.txt")
+        else ()
+          add_test (NAME H5JAM-${testname}-UNJAM COMMAND $<TARGET_FILE:h5unjam> -i ${infile} -o ${outfile})
+          set_tests_properties (H5JAM-${testname}-UNJAM PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-clear-objects)
+          set (compare_test "")
+        endif ()
+      endif ()
+      if (NOT "${compare_test}" STREQUAL "")
+        add_test (
+            NAME H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects
+            COMMAND    ${CMAKE_COMMAND}
+                -E remove
+                ${infile}.len.txt
+                ${infile}.cmp
+                ${infile}-ub.cmp
+        )
+        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}-UNJAM")
+        add_test (
+            NAME H5JAM-${testname}-UNJAM-CHECK_UB_1
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
+                -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
+                -D "TEST_CHECKUB=YES"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+                -D "TEST_HFILE=${infile}"
+                -D "TEST_UFILE=${compare_test}"
+                -D "TEST_EXPECT=0"
+                -D "TEST_OFILE="
+                -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
+        )
+        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-CHECK_UB_1-clear-objects)
+      endif ()
+
+      add_test (
+          NAME H5JAM-${testname}-UNJAM-CHECK_NOUB
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
+              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
+              -D "TEST_CHECKUB=NO"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_HFILE=${outfile}"
+              -D "TEST_EXPECT=0"
+              -D "TEST_UFILE=NULL"
+              -D "TEST_OFILE=NULL"
+              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
+      )
+      if (NOT "${compare_test}" STREQUAL "")
+        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_NOUB PROPERTIES DEPENDS H5JAM-${testname}-UNJAM-CHECK_UB_1)
+      else ()
+        set_tests_properties (H5JAM-${testname}-UNJAM-CHECK_NOUB PROPERTIES DEPENDS H5JAM-${testname}-UNJAM)
+      endif ()
+
+      CHECKFILE (${testname} "H5JAM-${testname}-UNJAM-CHECK_NOUB" ${chkfile} ${outfile})
+    endif ()
+  endmacro()
+
+  macro (JAMTEST testname jamfile infile chkfile outfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5JAM-${testname}-clear-objects
+          COMMAND ${CMAKE_COMMAND} -E remove ${outfile} ${infile}.cpy.h5
+      )
+    endif ()
+    add_test (NAME H5JAM-${testname} COMMAND $<TARGET_FILE:h5jam> -u testfiles/${jamfile} -i testfiles/${infile} -o ${outfile} ${ARGN})
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      set_tests_properties (H5JAM-${testname} PROPERTIES DEPENDS H5JAM-${testname}-clear-objects)
+      set (compare_test ${outfile})
+      set (compare_orig testfiles/${infile})
+      if ("${ARGN}" STREQUAL "--clobber")
+        set (compare_orig "")
+      endif ()
+
+      add_test (
+          NAME H5JAM-${testname}-CHECK_UB_1-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ${compare_test}.len.txt
+              ${compare_test}.cmp
+              ${compare_test}-ub.cmp
+      )
+      set_tests_properties (H5JAM-${testname}-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}")
+      add_test (
+          NAME H5JAM-${testname}-CHECK_UB_1
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
+              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
+              -D "TEST_CHECKUB=YES"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_HFILE=${compare_test}"
+              -D "TEST_UFILE=testfiles/${jamfile}"
+              -D "TEST_EXPECT=0"
+              -D "TEST_OFILE=${compare_orig}"
+              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
+      )
+      set_tests_properties (H5JAM-${testname}-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}-CHECK_UB_1-clear-objects)
+      CHECKFILE (${testname} "H5JAM-${testname}-CHECK_UB_1" ${chkfile} ${outfile})
+    endif ()
+  endmacro ()
+
+  macro (JAMTEST_NONE testname jamfile infile setfile chkfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5JAM-${testname}_NONE-clear-objects
+          COMMAND ${CMAKE_COMMAND} -E remove
+              ${chkfile} ${chkfile}.cpy.h5
+      )
+      add_test (
+          NAME H5JAM-${testname}_NONE-SETUP
+          COMMAND ${CMAKE_COMMAND} -E copy_if_different testfiles/${setfile} ${chkfile}
+      )
+      set_tests_properties (H5JAM-${testname}_NONE-SETUP PROPERTIES DEPENDS H5JAM-${testname}_NONE-clear-objects)
+
+      add_test (
+          NAME H5JAM-${testname}_NONE_COPY
+          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${chkfile} ${chkfile}.cpy.h5
+      )
+      set_tests_properties (H5JAM-${testname}_NONE_COPY PROPERTIES DEPENDS H5JAM-${testname}_NONE-SETUP)
+
+      add_test (NAME H5JAM-${testname}_NONE COMMAND $<TARGET_FILE:h5jam> -u testfiles/${jamfile} -i ${chkfile} ${ARGN})
+      set_tests_properties (H5JAM-${testname}_NONE PROPERTIES DEPENDS H5JAM-${testname}_NONE_COPY)
+
+      set (compare_test ${chkfile})
+      set (compare_orig ${chkfile}.cpy.h5)
+      if ("${ARGN}" STREQUAL "--clobber")
+        set (compare_orig "")
+      endif ()
+
+      add_test (
+          NAME H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              ${compare_test}.len.txt
+              ${compare_test}.cmp
+              ${compare_test}-ub.cmp
+      )
+      set_tests_properties (H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects PROPERTIES DEPENDS "H5JAM-${testname}_NONE")
+      add_test (
+          NAME H5JAM-${testname}_NONE-CHECK_UB_1
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:tellub>"
+              -D "TEST_GET_PROGRAM=$<TARGET_FILE:getub>"
+              -D "TEST_CHECKUB=YES"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_HFILE=${compare_test}"
+              -D "TEST_UFILE=testfiles/${jamfile}"
+              -D "TEST_EXPECT=0"
+              -D "TEST_OFILE=${compare_orig}"
+              -P "${HDF_RESOURCES_DIR}/userblockTest.cmake"
+      )
+      set_tests_properties (H5JAM-${testname}_NONE-CHECK_UB_1 PROPERTIES DEPENDS H5JAM-${testname}_NONE-CHECK_UB_1-clear-objects)
+      CHECKFILE (${testname} "H5JAM-${testname}_NONE-CHECK_UB_1" ${infile} ${chkfile})
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+#-------------------------------
+# Testing h5jam
+#-------------------------------
+  # help page
+  TEST_H5JAM_OUTPUT(h5jam-help 0 -h)
+
+  # don't allow HDF5 format file as an user block file
+  TEST_H5JAM_OUTPUT(h5jam-ub-nohdf5 1 -i testfiles/tall.h5 -u testfiles/tall.h5 -o tall-tmp.h5)
+
+  JAMTEST (tall_u10 u10.txt tall.h5 tall.h5 ta2.h5)
+  JAMTEST (tall_u511 u511.txt tall.h5 tall.h5 ta3.h5)
+  JAMTEST (tall_u512 u512.txt tall.h5 tall.h5 ta4.h5)
+  JAMTEST (tall_u513 u513.txt tall.h5 tall.h5 ta5.h5)
+
+  JAMTEST_NONE (N_ta_u10 u10.txt tall.h5 tall.h5 ta6.h5)
+  JAMTEST_NONE (N_ta_u511 u511.txt tall.h5 tall.h5 ta7.h5)
+  JAMTEST_NONE (N_ta_u512 u512.txt tall.h5 tall.h5 ta8.h5)
+  JAMTEST_NONE (N_ta_u513 u513.txt tall.h5 tall.h5 ta9.h5)
+
+  JAMTEST (twithub_u10 u10.txt twithub.h5 tall.h5 tax2.h5)
+  JAMTEST (twithub_u511 u511.txt twithub.h5 tall.h5 tax3.h5)
+  JAMTEST (twithub_u512 u512.txt twithub.h5 tall.h5 tax4.h5)
+  JAMTEST (twithub_u513 u513.txt twithub.h5 tall.h5 tax5.h5)
+
+  JAMTEST (twithub513_u10 u10.txt twithub513.h5 tall.h5 tax6.h5)
+  JAMTEST (twithub513_u511 u511.txt twithub513.h5 tall.h5 tax7.h5)
+  JAMTEST (twithub513_u512 u512.txt twithub513.h5 tall.h5 tax8.h5)
+  JAMTEST (twithub513_u513 u513.txt twithub513.h5 tall.h5 tax9.h5)
+
+  JAMTEST (twithub_u10_c u10.txt twithub.h5 tall.h5 taz2.h5 --clobber)
+  JAMTEST (twithub_u511_c u511.txt twithub.h5 tall.h5 taz3.h5 --clobber)
+  JAMTEST (twithub_u512_c u512.txt twithub.h5 tall.h5 taz4.h5 --clobber)
+  JAMTEST (twithub_u513_c u513.txt twithub.h5 tall.h5 taz5.h5 --clobber)
+
+  JAMTEST (twithub513_u10_c u10.txt twithub513.h5 tall.h5 taz6.h5 --clobber)
+  JAMTEST (twithub513_u511_c u511.txt twithub513.h5 tall.h5 taz7.h5 --clobber)
+  JAMTEST (twithub513_u512_c u512.txt twithub513.h5 tall.h5 taz8.h5 --clobber)
+  JAMTEST (twithub513_u513_c u513.txt twithub513.h5 tall.h5 taz9.h5 --clobber)
+
+  JAMTEST_NONE (N_twithub_u10_c u10.txt tall.h5 twithub.h5 tay2.h5 --clobber)
+  JAMTEST_NONE (N_twithub_u511_c u511.txt tall.h5 twithub.h5 tay3.h5 --clobber)
+  JAMTEST_NONE (N_twithub_u512_c u512.txt tall.h5 twithub.h5 tay4.h5 --clobber)
+  JAMTEST_NONE (N_twithub_u513_c u513.txt tall.h5 twithub.h5 tay5.h5 --clobber)
+
+  JAMTEST_NONE (N_twithub513_u10_c u10.txt tall.h5 twithub513.h5 tay6.h5 --clobber)
+  JAMTEST_NONE (N_twithub513_u511_c u511.txt tall.h5 twithub513.h5 tay7.h5 --clobber)
+  JAMTEST_NONE (N_twithub513_u512_c u512.txt tall.h5 twithub513.h5 tay8.h5 --clobber)
+  JAMTEST_NONE (N_twithub513_u513_c u513.txt tall.h5 twithub513.h5 tay9.h5 --clobber)
+
+#-------------------------------
+# Testing h5unjam
+#-------------------------------
+  # help page
+  TEST_H5UNJAM_OUTPUT(h5unjam-help 0 -h)
+
+  UNJAMTEST (twithub_tall twithub.h5 tai1.h5 o10.txt tall.h5 taa1.h5)
+  UNJAMTEST (twithub513_tall twithub513.h5 tai2.h5 o512.txt tall.h5 taa2.h5)
+
+  UNJAMTEST (N_twithub_tall twithub.h5 tai3.h5 NONE tall.h5 taa3.h5)
+  UNJAMTEST (N_twithub513_tall twithub513.h5 tai4.h5 NONE tall.h5 taa4.h5)
+
+  UNJAMTEST (D_twithub_tall twithub.h5 taj2.h5 NONE tall.h5 tac2.h5 --delete)
+  UNJAMTEST (D_twithub513_tall twithub513.h5 taj3.h5 NONE tall.h5 tac3.h5 --delete)
diff --git a/tools/test/h5jam/Makefile.am b/tools/test/h5jam/Makefile.am
new file mode 100644
index 0000000..c07aeb2
--- /dev/null
+++ b/tools/test/h5jam/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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+check_PROGRAMS=tellub h5jamgentest getub
+TEST_SCRIPT=testh5jam.sh
+
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5jam/h5jam$(EXEEXT) ../../src/h5jam/h5unjam$(EXEEXT)
+
+# Link against the main HDF5 library and tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+# Temporary files.  *.h5 are generated by jamgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES+=*.h5 testfiles/h5jam-*-sav testfiles/h5unjam-*-sav
+DISTCLEANFILES=testh5jam.sh
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5jam/Makefile.in b/tools/test/h5jam/Makefile.in
new file mode 100644
index 0000000..c49d716
--- /dev/null
+++ b/tools/test/h5jam/Makefile.in
@@ -0,0 +1,1430 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 = tellub$(EXEEXT) h5jamgentest$(EXEEXT) getub$(EXEEXT)
+TESTS = $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5jam.sh
+CONFIG_CLEAN_VPATH_FILES =
+getub_SOURCES = getub.c
+getub_OBJECTS = getub.$(OBJEXT)
+getub_LDADD = $(LDADD)
+getub_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 = 
+h5jamgentest_SOURCES = h5jamgentest.c
+h5jamgentest_OBJECTS = h5jamgentest.$(OBJEXT)
+h5jamgentest_LDADD = $(LDADD)
+h5jamgentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+tellub_SOURCES = tellub.c
+tellub_OBJECTS = tellub.$(OBJEXT)
+tellub_LDADD = $(LDADD)
+tellub_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 = getub.c h5jamgentest.c tellub.c
+DIST_SOURCES = getub.c h5jamgentest.c tellub.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)/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@
+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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by jamgentest.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 \
+	testfiles/h5jam-*-sav testfiles/h5unjam-*-sav
+TEST_SCRIPT = testh5jam.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5jam/h5jam$(EXEEXT) ../../src/h5jam/h5unjam$(EXEEXT)
+
+# Link against the main HDF5 library and tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+DISTCLEANFILES = testh5jam.sh
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5jam/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5jam/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):
+testh5jam.sh: $(top_builddir)/config.status $(srcdir)/testh5jam.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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
+
+getub$(EXEEXT): $(getub_OBJECTS) $(getub_DEPENDENCIES) $(EXTRA_getub_DEPENDENCIES) 
+	@rm -f getub$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(getub_OBJECTS) $(getub_LDADD) $(LIBS)
+
+h5jamgentest$(EXEEXT): $(h5jamgentest_OBJECTS) $(h5jamgentest_DEPENDENCIES) $(EXTRA_h5jamgentest_DEPENDENCIES) 
+	@rm -f h5jamgentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5jamgentest_OBJECTS) $(h5jamgentest_LDADD) $(LIBS)
+
+tellub$(EXEEXT): $(tellub_OBJECTS) $(tellub_DEPENDENCIES) $(EXTRA_tellub_DEPENDENCIES) 
+	@rm -f tellub$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tellub_OBJECTS) $(tellub_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/getub.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5jamgentest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tellub.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+.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 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)
+	-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-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-dyn: $(DYN)
+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 dyn 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/test/h5jam/getub.c b/tools/test/h5jam/getub.c
new file mode 100644
index 0000000..7cfde36
--- /dev/null
+++ b/tools/test/h5jam/getub.c
@@ -0,0 +1,155 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+void parse_command_line(int argc, const char *argv[]);
+
+/* Name of tool */
+#define PROGRAM_NAME "getub"
+char *nbytes = NULL;
+
+static const char *s_opts = "c:";  /* add more later ? */
+static struct long_options l_opts[] = {
+  {"c", require_arg, 'c'},  /* input file */
+  {NULL, 0, '\0'}
+};
+
+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (const char *prog)
+{
+    HDfflush(stdout);
+    HDfprintf(stdout, "usage: %s -c nb file] \n", prog);
+    HDfprintf(stdout, "           print first 'nb' byts of file to stdoug.\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:
+ *
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *-------------------------------------------------------------------------
+ */
+void
+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());
+            HDexit(EXIT_FAILURE);
+        } /* end switch */
+    } /* end while */
+
+    if(argc <= opt_ind) {
+      error_msg("missing file name\n");
+      usage(h5tools_getprogname());
+      HDexit(EXIT_FAILURE);
+    } /* end if */
+} /* end parse_command_line() */
+
+int
+main(int argc, const char *argv[])
+{
+    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());
+      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/test/h5jam/h5jamgentest.c b/tools/test/h5jam/h5jamgentest.c
new file mode 100644
index 0000000..8648f07
--- /dev/null
+++ b/tools/test/h5jam/h5jamgentest.c
@@ -0,0 +1,387 @@
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Generate the binary hdf5 files and user block data for the jam/unjam tests.
+ * Usage: just execute the program without any arguments will
+ * generate all the files in the local directory.
+ *
+ * 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 <assert.h>
+#include <limits.h>
+
+#include "hdf5.h"
+#include "H5private.h"
+
+/* not used yet
+#define UBTXT1 "u0.txt"
+*/
+#define UBTXT2 "u10.txt"
+#define UBTXT3 "u511.txt"
+#define UBTXT4 "u512.txt"
+#define UBTXT5 "u513.txt"
+/* not used yet
+#define UBTXT6 "u1023.txt"
+#define UBTXT7 "u1024.txt"
+#define UBTXT8 "u1025.txt"
+#define UBTXT9 "u2047.txt"
+#define UBTXT10 "u2048.txt"
+#define UBTXT11 "u2049.txt"
+#define UBBIN1 "u0.dat"
+#define UBBIN2 "u10.dat"
+#define UBBIN3 "u511.dat"
+#define UBBIN4 "u512.dat"
+#define UBBIN5 "u513.dat"
+*/
+
+/* not used yet
+#define FILE1 "tnull.h5"
+#define FILE2 "tnullwithub.h5"
+*/
+/* tall is same as dumper test */
+#define FILE7 "tall.h5"
+#define FILE8 "twithub.h5"
+#define FILE9 "twithub513.h5"
+
+/*
+ * This pattern is used to fill text files
+ */
+char pattern[11] = "abcdefghij";
+
+/*-------------------------------------------------------------------------
+ * prototypes
+ *-------------------------------------------------------------------------
+ */
+
+
+#define BUF_SIZE 1024
+
+/* Element selection information */
+
+typedef enum{
+     RED,
+     GREEN,
+     BLUE,
+     WHITE,
+     BLACK
+} enumtype;
+
+/* Compound datatype */
+typedef struct s1_t {
+    unsigned int a;
+    unsigned int b;
+    float c;
+} s1_t;
+
+
+/* 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)
+{
+    return -1;
+}
+
+#define MY_LINKCLASS 187
+const H5L_class_t UD_link_class[1] = {{
+    H5L_LINK_CLASS_T_VERS,    /* H5L_class_t version       */
+    (H5L_type_t)MY_LINKCLASS, /* Link type id number            */
+    "UD link class",          /* name for debugging             */
+    NULL,                     /* Creation callback              */
+    NULL,                     /* Move/rename callback           */
+    NULL,                     /* Copy callback                  */
+    UD_traverse,              /* The actual traversal function  */
+    NULL,                     /* Deletion callback              */
+    NULL                      /* Query callback                 */
+}};
+
+
+
+/* gent_ub
+    with no ub, identical to gent_all from h5dumpgentest.c
+
+    FILENAME is the name of the file to create
+    UB_SIZE is the size the buffer should be
+    UB_FILL characters will be set to the PATTERN array,
+        the rest of the user block will be NULL.
+
+/ : g1  g2  attr1  attr2
+g1 : g1.1  g1.2
+g1.1 : dset1.1.1(attr1, attr2)   dset1.1.2
+g1.2 : g1.2.1 extlink
+g1.2.1 : slink
+g2 : dset2.1  dset2.2 udlink
+
+*/
+
+static void
+gent_ub(const char * filename, size_t ub_size, size_t ub_fill)
+{
+    hid_t fid, group, attr, dataset, space;
+    hid_t create_plist;
+    hsize_t dims[2];
+    int data[2][2], dset1[10][10], dset2[20];
+    char buf[BUF_SIZE];
+    int i, j;
+    size_t u;
+    float dset2_1[10], dset2_2[3][5];
+    int fd;
+    char *bp;
+
+  if(ub_size > 0)
+  {
+      create_plist = H5Pcreate(H5P_FILE_CREATE);
+      H5Pset_userblock(create_plist, (hsize_t)ub_size);
+      fid = H5Fcreate(filename, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT);
+  }
+  else
+  {
+      fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+  }
+
+  /* create groups */
+  group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  /* root attributes */
+  group = H5Gopen2(fid, "/", H5P_DEFAULT);
+
+  dims[0] = 10;
+  space = H5Screate_simple(1, dims, NULL);
+  attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+  sprintf(buf, "abcdefghi");
+  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+  H5Sclose(space);
+  H5Aclose(attr);
+
+  dims[0] = 2; dims[1] = 2;
+  space = H5Screate_simple(2, dims, NULL);
+  attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+  data[0][0] = 0; data[0][1] = 1; data[1][0] = 2; data[1][1] = 3;
+  H5Awrite(attr, H5T_NATIVE_INT, data);
+  H5Sclose(space);
+  H5Aclose(attr);
+
+  H5Gclose(group);
+
+  group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
+
+  /* dset1.1.1 */
+  dims[0] = 10; dims[1] = 10;
+  space = H5Screate_simple(2, dims, NULL);
+  dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  for (i = 0; i < 10; i++)
+       for (j = 0; j < 10; j++)
+            dset1[i][j] = j*i;
+  H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
+  H5Sclose(space);
+
+  /* attributes of dset1.1.1 */
+  dims[0] = 27;
+  space = H5Screate_simple(1, dims, NULL);
+  attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+  sprintf(buf, "1st attribute of dset1.1.1");
+  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+  H5Sclose(space);
+  H5Aclose(attr);
+
+  dims[0] = 27;
+  space = H5Screate_simple(1, dims, NULL);
+  attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
+  sprintf(buf, "2nd attribute of dset1.1.1");
+  H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
+  H5Sclose(space);
+  H5Aclose(attr);
+
+  H5Dclose(dataset);
+
+  /* dset1.1.2 */
+  dims[0] = 20;
+  space = H5Screate_simple(1, dims, NULL);
+  dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  for (i = 0; i < 20; i++)
+       dset2[i] = i;
+  H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
+  H5Sclose(space);
+  H5Dclose(dataset);
+
+  H5Gclose(group);
+
+  /* external link */
+  H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
+
+  /* soft link */
+  group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
+  H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
+  H5Gclose(group);
+
+  group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
+
+  /* dset2.1 */
+  dims[0] = 10;
+  space = H5Screate_simple(1, dims, NULL);
+  dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  for (i = 0; i < 10; i++)
+       dset2_1[i] = (float)((float)i * 0.1F + 1.0F);
+  H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
+  H5Sclose(space);
+  H5Dclose(dataset);
+
+  /* dset2.2 */
+  dims[0] = 3; dims[1] = 5;
+  space = H5Screate_simple(2, dims, NULL);
+  dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  for (i = 0; i < 3; i++)
+       for (j = 0; j < 5; j++)
+            dset2_2[i][j] = (float)(((float)i + 1.0F) * (float)j * 0.1F);
+  H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
+  H5Sclose(space);
+  H5Dclose(dataset);
+
+  H5Gclose(group);
+
+  /* user-defined link */
+  H5Lregister(UD_link_class);
+  H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT);
+
+  H5Fclose(fid);
+
+  /* If a user block is being used, write to it here */
+  if(ub_size > 0)
+  {
+    ssize_t nbytes;
+
+    HDassert(ub_size <= BUF_SIZE);
+
+    fd = HDopen(filename, O_RDWR, 0);
+    HDassert(fd >= 0);
+
+    /* fill buf with pattern */
+    HDmemset(buf, '\0', ub_size);
+    bp = buf;
+    for (u = 0; u < ub_fill; u++)
+      *bp++ = pattern[u % 10];
+
+    nbytes = HDwrite(fd, buf, ub_size);
+    HDassert(nbytes >= 0);
+
+    HDclose(fd);
+  }
+}
+
+static void
+create_textfile(const char *name, size_t size)
+{
+    char *buf;
+    int fd;
+    size_t i;
+    char *bp;
+    ssize_t nbytes;
+
+    fd = HDcreat(name,0777);
+    HDassert(fd >= 0);
+    buf = (char *)HDcalloc(size, (size_t)1);
+    HDassert(buf);
+
+    /* fill buf with pattern */
+    bp = buf;
+    for(i = 0; i < size; i++)
+        *bp++ = pattern[i % 10];
+
+    nbytes = HDwrite(fd, buf, size);
+    HDassert(nbytes >= 0);
+
+    HDfree(buf);
+
+    HDclose(fd);
+}
+
+#ifdef notdef
+/* not used yet */
+void
+create_binfile(char *name, off_t size)
+{
+    char *buf;
+    int fd;
+    int i;
+    char *bp;
+
+    fd = creat(name,0777);
+    HDassert(fd >= 0);
+
+    buf = HDcalloc(size,1);
+    HDassert(buf);
+
+    /* fill buf with pattern */
+    bp = buf;
+    for (i = 0; i < size; i++)
+        *bp++ = (char) i & 0xff;
+
+    HDwrite(fd,buf,size);
+
+    HDclose(fd);
+}
+#endif
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+int main(void)
+{
+
+/*
+create_textfile(UBTXT1, (size_t)0);
+*/
+create_textfile(UBTXT2, (size_t)10);
+create_textfile(UBTXT3, (size_t)511);
+create_textfile(UBTXT4, (size_t)512);
+create_textfile(UBTXT5, (size_t)513);
+/*
+create_textfile(UBTXT6, (size_t)1023);
+create_textfile(UBTXT7, (size_t)1024);
+create_textfile(UBTXT8, (size_t)1025);
+create_textfile(UBTXT9, (size_t)2047);
+create_textfile(UBTXT10, (size_t)2048);
+create_textfile(UBTXT11, (size_t)2049);
+
+create_binfile(UBBIN1, (off_t)0);
+create_binfile(UBBIN2, (off_t)10);
+create_binfile(UBBIN3, (off_t)511);
+create_binfile(UBBIN4, (off_t)512);
+create_binfile(UBBIN5, (off_t)513);
+
+*/
+    gent_ub(FILE7, (size_t)0, (size_t)0);
+    gent_ub(FILE8, (size_t)512, HDstrlen(pattern));
+    gent_ub(FILE9, (size_t)1024, (size_t)513);
+
+    return 0;
+}
diff --git a/tools/test/h5jam/tellub.c b/tools/test/h5jam/tellub.c
new file mode 100644
index 0000000..fad14b7
--- /dev/null
+++ b/tools/test/h5jam/tellub.c
@@ -0,0 +1,194 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+
+#ifdef H5_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME "tellub"
+
+/*
+ * Command-line options: The user can specify short or 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 = "h";
+static struct long_options l_opts[] = {
+  {"help", no_arg, 'h'},
+  {"hel", no_arg, 'h'},
+  {NULL, 0, '\0'}
+};
+
+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message
+ *
+ * Return:      void
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage (const char *prog)
+{
+  fflush (stdout);
+  fprintf (stdout, "usage: %s h5_file\n", prog);
+  fprintf (stdout,
+     "           Check that h5_fil is HDF5 file and print size of user block \n");
+  fprintf (stdout, "       %s -h\n", prog);
+  fprintf (stdout, "           Print a usage message and exit\n");
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for the h5dumper.
+ *
+ * Return:      Success:
+ *
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+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 'h':
+        usage (h5tools_getprogname());
+        exit (EXIT_SUCCESS);
+      case '?':
+      default:
+        usage (h5tools_getprogname());
+        exit (EXIT_FAILURE);
+      }
+    }
+
+  /* check for file name to be processed */
+  if (argc <= opt_ind)
+    {
+      error_msg("missing file name\n");
+      usage (h5tools_getprogname());
+      exit (EXIT_FAILURE);
+    }
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     HDF5 user block unjammer
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (int argc, const char *argv[])
+{
+  char *ifname;
+  void *edata;
+  H5E_auto2_t func;
+  hid_t ifile;
+  hsize_t usize;
+  htri_t testval;
+  herr_t status;
+  hid_t plist;
+
+  h5tools_setprogname(PROGRAMNAME);
+  h5tools_setstatus(EXIT_SUCCESS);
+
+  /* Initialize h5tools lib */
+  h5tools_init();
+
+  /* Disable error reporting */
+  H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+  H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+  parse_command_line (argc, argv);
+
+  if (argc <= (opt_ind))
+    {
+      error_msg("missing file name\n");
+      usage (h5tools_getprogname());
+      return (EXIT_FAILURE);
+    }
+
+  ifname = HDstrdup (argv[opt_ind]);
+
+  testval = H5Fis_hdf5 (ifname);
+
+  if (testval <= 0)
+    {
+      error_msg("Input HDF5 file is not HDF \"%s\"\n", ifname);
+      return (EXIT_FAILURE);
+    }
+
+  ifile = H5Fopen (ifname, H5F_ACC_RDONLY, H5P_DEFAULT);
+
+  if (ifile < 0)
+    {
+      error_msg("Can't open input HDF5 file \"%s\"\n", ifname);
+      return (EXIT_FAILURE);
+    }
+
+  plist = H5Fget_create_plist (ifile);
+  if (plist < 0)
+    {
+      error_msg("Can't get file creation plist for file \"%s\"\n",
+     ifname);
+      return (EXIT_FAILURE);
+    }
+
+  status = H5Pget_userblock (plist, &usize);
+  if (status < 0)
+    {
+      error_msg("Can't get user block for file \"%s\"\n", ifname);
+      return (EXIT_FAILURE);
+    }
+
+  printf ("%ld\n", (long) usize);
+
+  H5Pclose (plist);
+  H5Fclose (ifile);
+
+  return (EXIT_SUCCESS);
+}
+
diff --git a/tools/h5jam/testfiles/h5jam-help.txt b/tools/test/h5jam/testfiles/h5jam-help.txt
similarity index 100%
rename from tools/h5jam/testfiles/h5jam-help.txt
rename to tools/test/h5jam/testfiles/h5jam-help.txt
diff --git a/tools/h5jam/testfiles/h5jam-ub-nohdf5.txt b/tools/test/h5jam/testfiles/h5jam-ub-nohdf5.txt
similarity index 100%
rename from tools/h5jam/testfiles/h5jam-ub-nohdf5.txt
rename to tools/test/h5jam/testfiles/h5jam-ub-nohdf5.txt
diff --git a/tools/h5jam/testfiles/h5unjam-help.txt b/tools/test/h5jam/testfiles/h5unjam-help.txt
similarity index 100%
rename from tools/h5jam/testfiles/h5unjam-help.txt
rename to tools/test/h5jam/testfiles/h5unjam-help.txt
diff --git a/tools/h5jam/testfiles/tall.h5 b/tools/test/h5jam/testfiles/tall.h5
similarity index 100%
rename from tools/h5jam/testfiles/tall.h5
rename to tools/test/h5jam/testfiles/tall.h5
diff --git a/tools/h5jam/testfiles/twithub.h5 b/tools/test/h5jam/testfiles/twithub.h5
similarity index 100%
rename from tools/h5jam/testfiles/twithub.h5
rename to tools/test/h5jam/testfiles/twithub.h5
diff --git a/tools/h5jam/testfiles/twithub513.h5 b/tools/test/h5jam/testfiles/twithub513.h5
similarity index 100%
rename from tools/h5jam/testfiles/twithub513.h5
rename to tools/test/h5jam/testfiles/twithub513.h5
diff --git a/tools/h5jam/testfiles/u10.txt b/tools/test/h5jam/testfiles/u10.txt
similarity index 100%
rename from tools/h5jam/testfiles/u10.txt
rename to tools/test/h5jam/testfiles/u10.txt
diff --git a/tools/h5jam/testfiles/u511.txt b/tools/test/h5jam/testfiles/u511.txt
similarity index 100%
rename from tools/h5jam/testfiles/u511.txt
rename to tools/test/h5jam/testfiles/u511.txt
diff --git a/tools/h5jam/testfiles/u512.txt b/tools/test/h5jam/testfiles/u512.txt
similarity index 100%
rename from tools/h5jam/testfiles/u512.txt
rename to tools/test/h5jam/testfiles/u512.txt
diff --git a/tools/h5jam/testfiles/u513.txt b/tools/test/h5jam/testfiles/u513.txt
similarity index 100%
rename from tools/h5jam/testfiles/u513.txt
rename to tools/test/h5jam/testfiles/u513.txt
diff --git a/tools/test/h5jam/testh5jam.sh.in b/tools/test/h5jam/testh5jam.sh.in
new file mode 100644
index 0000000..d3d7a9a
--- /dev/null
+++ b/tools/test/h5jam/testh5jam.sh.in
@@ -0,0 +1,697 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5jam/h5unjam tools
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=../../src/h5jam/h5unjam
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=../../src/h5dump/h5dump               # The dumper to use
+DUMPER_BIN=`pwd`/../$DUMPER    # The path of the dumper binary
+JAM=../../src/h5jam/h5jam                     # Tool to test
+UNJAM=../../src/h5jam/h5unjam                     # Tool to test
+JAM_BIN="$RUNSERIAL "`pwd`    # The path of the jam binary
+UNJAM_BIN=`pwd`    # The path of the jam binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+AWK='awk'
+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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testfiles
+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_H5JAM_TESTFILES/tall.h5
+$SRC_H5JAM_TESTFILES/twithub.h5
+$SRC_H5JAM_TESTFILES/twithub513.h5
+"
+LIST_OTHER_TEST_FILES="
+$SRC_H5JAM_TESTFILES/u10.txt
+$SRC_H5JAM_TESTFILES/u511.txt
+$SRC_H5JAM_TESTFILES/u512.txt
+$SRC_H5JAM_TESTFILES/u513.txt
+$SRC_H5JAM_TESTFILES/h5jam-help.txt
+$SRC_H5JAM_TESTFILES/h5unjam-help.txt
+$SRC_H5JAM_TESTFILES/h5jam-ub-nohdf5.txt
+"
+
+# Source in the output filter function definitions.
+. $srcdir/../../../bin/output_filter.sh
+
+#
+# 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=$SRC_H5JAM_TESTFILES
+    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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Compare".
+#
+COMPARE() {
+   SPACES="                                                               "
+   echo "Compare $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Print a "SKIP" message
+SKIP() {
+ TESTING $JAM $@
+ echo  " -SKIP-"
+}
+
+# 
+#  COMPARE_FILES a.h5 b.h5
+#    Compare two files, skipping the first line.  This is used to 
+#    compare the output of the dumper, skipping the file name which
+#    is different.
+#    The result is stored in 'compval'.
+#
+cmpval=0;
+COMPARE_FILES() {
+	$AWK 'NR > 1' $1 > $1.cmp
+	$AWK 'NR > 1' $2 > $2.cmp
+ 	$CMP $1.cmp $2.cmp 
+ 	cmpval=$?
+        rm -f $1.cmp $2.cmp
+}
+
+#  CLEANUP files
+#     Clean up named files.
+CLEANUP() {
+   if test -z "$HDF5_NOCLEANUP"; then
+	for i in $*
+	do
+		rm -f $i
+	done
+   fi
+}
+
+#  SETUP file tocopy
+#    Clone a standard input file in the test directory
+#  Modification:
+#    Was using "cp" command which means file $2 will inherit the permission
+#    setting of file $1.  If $1 is read-only, so will $2.  That will cause
+#    failure when the test attempts to write it later on.  Changed to use
+#    the "cat" command.
+#
+SETUP() {
+	cat < $1 > $2
+}
+
+#
+#  CHECKFILE orig.h5 compar.h5
+#     Check that the test file is the same as an original.
+#     The two files are dumped with the dumper, and the output
+#     compared with COMPARE_FILES.
+#     If the files are the same, the test reports " PASSED",
+#     otherwise, it reports "*FAILED*"
+CHECKFILE() {
+   expected="`dirname $2`/`basename $2 .h5`.out"
+   expected_err="`dirname $2`/`basename $2 .h5`.err"
+   actual="`basename $1 .h5`.out"
+   actual_err="`basename $1 .h5`.err"
+
+   $RUNSERIAL $DUMPER_BIN/$DUMPER $1 >$expected 2>$expected_err
+   cat $expected_err >> $expected
+
+   # dump the test file
+   COMPARE $2 to $1
+   $RUNSERIAL $DUMPER_BIN/$DUMPER $2 >$actual 2>$actual_err
+   cat $actual_err >> $actual
+
+   # compare the two files (ignore line 1)
+   COMPARE_FILES $actual $expected
+   if [ "$cmpval" = 0 ] ; then
+      echo " PASSED"
+   else
+      echo "*FAILED*"
+      echo "    Expected result (*.ddl) differs from actual result (*.out)"
+      nerrors="`expr $nerrors + 1`"
+      test yes = "$verbose" && $DIFF $expected $actual |sed 's/^/    /'
+   fi
+
+   # Clean up output files
+   if test -z "$HDF5_NOCLEANUP"; then
+      rm -f $actual $actual_err
+      rm -f $expected $expected_err
+   fi
+}
+
+#
+# CHECK_UB file.h5 user_block_file origfile.h5 
+#
+#   Check the user block in 'file.h5' is the same as
+#   'user_block' (allowing for padding).
+#
+#   If the original file had a user block before the test
+#   then 'compare.h5' is passed.  The user block must be extracted
+#   and the test file compared to:
+#      cat compare_ub user_block_file.
+#
+#   This test uses './getub' to extract the user block from 
+#   'file.h5', which is compared to the file described above.
+#
+#   The result is set in variable 'result1'.
+#
+result1=0;
+CHECK_UB_1() {
+	hfile="$1"
+	ufile="$2"
+
+	# check for third argument (the original file)
+	origfile="";
+	if [ -n "$3" ];
+	then
+		origfile="$3"
+	fi
+
+	# find the length of the user block to check
+	s1=`cat $ufile | wc -c | sed -e 's/ //g'`
+	if [ "$s1" = "0" ];
+	then
+		echo "File "$ufile" is empty"
+		result1=1;
+	fi
+
+	# Get the size of the original user block, if any.
+	if [ -n "$origfile" ];
+	then
+		# 'tellub' calls H5Fget_user_block to get the size
+		#  of the user block
+		s2=`$JAM_BIN/tellub $origfile`
+		if [ "$s2" = "0" ];
+		then
+			size=$s1;
+			cmpfile=$ufile
+		else
+			cmpfile="tt2"
+			size=`expr $s2 + $s1`
+			$JAM_BIN/getub -c $s2 $origfile > $cmpfile
+			cat $ufile >> $cmpfile
+		fi
+	else
+		# assume no user block
+		s2="0"
+		size=$s1;
+		cmpfile=$ufile
+	fi
+
+	# Extract 'size' bytes from the front of 'hfile'
+	# Compare to 'cmpfile', result is set in result1
+	tfile="tt1"
+	$JAM_BIN/getub -c $size $hfile > $tfile
+	res=`cmp $cmpfile $tfile`
+	if [ "$?" != "0" ];
+	then
+		echo $res
+		result1=1;
+	else
+		result1=0;
+	fi
+
+	# clean up
+	rm -f  $tfile
+	if [ "$s2" != "0" ] ;
+	then
+		rm -f $cmpfile
+	fi
+}
+
+
+#  CHECK_NOUB file.h5
+#
+#  Check that 'file.h5' has no user block.
+#  Setst result2 to 1 if there is a user block (fail), 0 if none (pass)
+
+result2=0;
+
+CHECK_NOUB() {
+	hfile="$1"
+
+	# call 'ubsize' to get the size of the user block
+	ubsize=`$JAM_BIN/tellub $hfile`
+
+	if [ "$?" != "0" ];
+	then
+		# error
+		result2=1;
+	else
+	if [ "$ubsize" = "0" ];
+	then
+		# pass
+		result2=0;
+	else
+		# fail
+		result2=1;
+	fi
+	fi
+}
+
+#  JAMTEST user_block file.h5 [--clobber] [ofile.h5]
+#
+#    Test the 'jam' tool:
+#      1. figure out the input and output, and the comparision
+#         that will be done.
+#      2. call 'jam' with the appropriate arguments
+#      3. check the user block is correct in the output (Check_UB)
+#    If the user block is correct, print "PASSED", else "*FAILED*"
+JAMTEST() {
+	ufile="$1"
+	ifile="$2"
+	compare_test=""   # the file to test
+	compare_orig=""   # the comparison to test against
+	cleanup=""
+
+	# sort out the arguments for the test and the check
+	do_clobber="no"
+	if [ "$3" = "--clobber" ];
+	then
+		#  clobber overwrites any existing user block
+		do_clobber="yes"
+		clobber="--clobber"
+		compare_orig=""
+		if [ -z "$4" ];
+		then
+			# output goes to infile, compare ubfile to infile
+			ofile=""
+			compare_test="$ifile"
+		else
+			# output goes to $4,  compare ofile to ubfile
+			ofile="$4"
+			compare_test="$ofile"
+		fi
+	else
+		clobber=""
+		# add user block to existing ub, if any 
+		if [ -z "$3" ];
+		then
+			# output goes to infile, compare ubfile to infile
+			ofile=""
+			compare_test="$ifile"
+			cp $ifile xxofile.h5
+			compare_orig="xxofile.h5"
+			cleanup="$cleanup $compare_orig"
+		else
+			# output goes to $3,  compare ofile to ubfile
+			ofile="$3"
+			compare_test="$ofile"
+			compare_orig="$ifile"
+		fi
+	fi
+
+	# call 'jam' with the appropriate arguments
+	if [ -n "$ofile" ];
+	then
+		TESTING h5jam -u `basename $ufile` -i `basename $ifile` -o `basename $ofile` $clobber
+		$JAM_BIN/$JAM -u $ufile -i $ifile -o $ofile $clobber
+	else
+		TESTING jam -u `basename $ufile` -i `basename $ifile` $clobber
+		$JAM_BIN/$JAM -u $ufile -i $ifile $clobber
+	fi
+
+	#echo "CHECK_UB_1 $compare_test $ufile $compare_orig"
+	CHECK_UB_1 $compare_test $ufile $compare_orig
+
+	if [ "$result1" = "0" ] ;
+	then
+		echo " PASSED"
+	else
+		echo " *FAILED*"
+      		nerrors="`expr $nerrors + 1`"
+	fi
+ 	CLEANUP $cleanup
+}
+	
+# UNJAMTEST  file.h5 [- | --delete] ofile
+#
+#  Test the 'unjam' tool
+#
+###fix the working directory here and in jamtest
+UNJAMTEST () {
+	infile="$1"
+	ofile="$3"
+	if [ "$2" = "-" ];
+	then
+		uofile="uofile"
+		TESTING h5unjam -i `basename $infile` -o `basename $ofile` "> "`basename $uofile`
+		$JAM_BIN/$UNJAM -i $infile -o $ofile > $uofile
+	else
+	if [ "$2" = "--delete" ];
+	then
+		uofile="none"
+		TESTING h5unjam -i `basename $infile` -o `basename $ofile` --delete
+		$JAM_BIN/$UNJAM  -i $infile -o $ofile --delete 
+
+	else
+		uofile="$2"
+		TESTING h5unjam -i `basename $infile` -u `basename $uofile` -o `basename $ofile`
+		$JAM_BIN/$UNJAM  -i $infile -u $uofile -o $ofile
+	fi
+	fi
+
+	result1=0
+	result2=0
+	cleanup=""
+	if [ "$uofile" != "none" ];
+	then
+		# sets result1
+		CHECK_UB_1 $infile $uofile
+		CLEANUP $uofile
+	fi
+
+	# sets result2
+	CHECK_NOUB $ofile
+
+	if [ "$result1" = "0" -a "$result2" = "0" ];
+	then
+		echo " PASSED"
+	else
+		echo " *FAILED*"
+	      nerrors="`expr $nerrors + 1`"
+	fi
+}
+
+
+#
+# TOOLTEST_OUTPUT < JAM | UNJAM > expect-output.txt exit-code options
+#
+# Only verify stdout/stderr output from h5jam and j5unjam
+#
+
+TOOLTEST_OUTPUT() {
+    if [ "$1" == "JAM" ]; then
+        TOOLCMD=$JAM_BIN/$JAM
+    elif [ "$1" == "UNJAM" ]; then
+        TOOLCMD=$JAM_BIN/$UNJAM
+    fi
+    shift
+    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
+
+    TESTING h5jam $@
+    (
+        cd $TESTDIR
+        $TOOLCMD "$@"
+    ) >$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
+    # combine stderr to stdout for output compare 
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+	    # Create the expect file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actual $expect
+	    rm -f $actual $actual_sav $actual_err $actual_err_sav
+    elif $CMP $expect $actual; then
+        echo " PASSED"
+	    rm -f $actual $actual_sav $actual_err $actual_err_sav
+    else
+        echo "*FAILED*"
+	    echo "    Expected result differs from actual result"
+	    nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+#-------------------------------
+# Testing h5jam
+#-------------------------------
+# help page
+TOOLTEST_OUTPUT JAM h5jam-help.txt 0 -h
+
+# don't allow HDF5 format file as an user block file
+TOOLTEST_OUTPUT JAM h5jam-ub-nohdf5.txt 1 -i tall.h5 -u tall.h5 -o tall-tmp.h5
+
+JAMTEST $TESTDIR/u10.txt $TESTDIR/tall.h5 ta2.h5
+CHECKFILE $TESTDIR/tall.h5 ta2.h5
+CLEANUP ta2.h5
+JAMTEST $TESTDIR/u511.txt $TESTDIR/tall.h5 ta3.h5
+CHECKFILE $TESTDIR/tall.h5 ta3.h5
+CLEANUP ta3.h5
+JAMTEST $TESTDIR/u512.txt $TESTDIR/tall.h5 ta4.h5
+CHECKFILE $TESTDIR/tall.h5 ta4.h5
+CLEANUP ta4.h5
+JAMTEST $TESTDIR/u513.txt $TESTDIR/tall.h5 ta5.h5
+CHECKFILE $TESTDIR/tall.h5 ta5.h5
+CLEANUP ta5.h5
+
+SETUP $TESTDIR/tall.h5 ta6.h5
+JAMTEST $TESTDIR/u10.txt ta6.h5 
+CHECKFILE $TESTDIR/tall.h5 ta6.h5
+CLEANUP ta6.h5
+SETUP $TESTDIR/tall.h5 ta7.h5
+JAMTEST $TESTDIR/u511.txt ta7.h5 
+CHECKFILE $TESTDIR/tall.h5 ta7.h5
+CLEANUP ta7.h5
+SETUP $TESTDIR/tall.h5 ta8.h5
+JAMTEST $TESTDIR/u512.txt ta8.h5 
+CHECKFILE $TESTDIR/tall.h5 ta8.h5
+CLEANUP ta8.h5
+SETUP $TESTDIR/tall.h5 ta9.h5
+JAMTEST $TESTDIR/u513.txt ta9.h5 
+CHECKFILE $TESTDIR/tall.h5 ta9.h5
+CLEANUP ta9.h5
+
+JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub.h5 tax2.h5
+CHECKFILE $TESTDIR/tall.h5 tax2.h5
+CLEANUP tax2.h5
+JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub.h5 tax3.h5
+CHECKFILE $TESTDIR/tall.h5 tax3.h5
+CLEANUP tax3.h5
+JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub.h5 tax4.h5
+CHECKFILE $TESTDIR/tall.h5 tax4.h5
+CLEANUP tax4.h5
+JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub.h5 tax5.h5
+CHECKFILE $TESTDIR/tall.h5 tax5.h5
+CLEANUP tax5.h5
+
+JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub513.h5 tax6.h5
+CHECKFILE $TESTDIR/tall.h5 tax6.h5
+CLEANUP tax6.h5
+JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub513.h5 tax7.h5
+CHECKFILE $TESTDIR/tall.h5 tax7.h5
+CLEANUP tax7.h5
+JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub513.h5 tax8.h5
+CHECKFILE $TESTDIR/tall.h5 tax8.h5
+CLEANUP tax8.h5
+JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub513.h5 tax9.h5
+CHECKFILE $TESTDIR/tall.h5 tax9.h5
+CLEANUP tax9.h5
+
+JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub.h5 --clobber taz2.h5 
+CHECKFILE $TESTDIR/tall.h5 taz2.h5
+CLEANUP taz2.h5
+JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub.h5 --clobber taz3.h5
+CHECKFILE $TESTDIR/tall.h5 taz3.h5
+CLEANUP taz3.h5
+JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub.h5 --clobber taz4.h5 
+CHECKFILE $TESTDIR/tall.h5 taz4.h5
+CLEANUP taz4.h5
+JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub.h5 --clobber taz5.h5 
+CHECKFILE $TESTDIR/tall.h5 taz5.h5
+CLEANUP taz5.h5
+
+JAMTEST $TESTDIR/u10.txt $TESTDIR/twithub513.h5 --clobber taz6.h5 
+CHECKFILE $TESTDIR/tall.h5 taz6.h5
+CLEANUP taz6.h5
+JAMTEST $TESTDIR/u511.txt $TESTDIR/twithub513.h5 --clobber taz7.h5
+CHECKFILE $TESTDIR/tall.h5 taz7.h5
+CLEANUP taz7.h5
+JAMTEST $TESTDIR/u512.txt $TESTDIR/twithub513.h5 --clobber taz8.h5 
+CHECKFILE $TESTDIR/tall.h5 taz8.h5
+CLEANUP taz8.h5
+JAMTEST $TESTDIR/u513.txt $TESTDIR/twithub513.h5 --clobber taz9.h5 
+CHECKFILE $TESTDIR/tall.h5 taz9.h5
+CLEANUP taz9.h5
+
+SETUP $TESTDIR/twithub.h5 tay2.h5
+JAMTEST $TESTDIR/u10.txt tay2.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay2.h5
+CLEANUP tay2.h5
+SETUP $TESTDIR/twithub.h5 tay3.h5
+JAMTEST $TESTDIR/u511.txt tay3.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay3.h5
+CLEANUP tay3.h5
+SETUP $TESTDIR/twithub.h5 tay4.h5
+JAMTEST $TESTDIR/u512.txt tay4.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay4.h5
+CLEANUP tay4.h5
+SETUP $TESTDIR/twithub.h5 tay5.h5
+JAMTEST $TESTDIR/u513.txt tay5.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay5.h5
+CLEANUP tay5.h5
+
+SETUP $TESTDIR/twithub513.h5 tay6.h5
+JAMTEST $TESTDIR/u10.txt tay6.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay6.h5
+CLEANUP tay6.h5
+SETUP $TESTDIR/twithub513.h5 tay7.h5
+JAMTEST $TESTDIR/u511.txt tay7.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay7.h5
+CLEANUP tay7.h5
+SETUP $TESTDIR/twithub513.h5 tay8.h5
+JAMTEST $TESTDIR/u512.txt tay8.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay8.h5
+CLEANUP tay8.h5
+SETUP $TESTDIR/twithub513.h5 tay9.h5
+JAMTEST $TESTDIR/u513.txt tay9.h5 --clobber
+CHECKFILE $TESTDIR/tall.h5 tay9.h5
+CLEANUP tay9.h5
+
+#---------------------------------
+# Testing h5unjam 
+#---------------------------------
+# help page
+TOOLTEST_OUTPUT UNJAM h5unjam-help.txt 0 -h
+
+SETUP $TESTDIR/twithub.h5 tai1.h5
+UNJAMTEST tai1.h5 o10.txt taa1.h5
+CHECKFILE $TESTDIR/tall.h5 taa1.h5
+CLEANUP taa1.h5 tai1.h5 o10.txt
+SETUP $TESTDIR/twithub513.h5 tai2.h5
+UNJAMTEST tai2.h5 o512.txt taa2.h5
+CHECKFILE $TESTDIR/tall.h5 taa2.h5
+CLEANUP taa2.h5 tai2.h5 o512.txt
+
+SETUP $TESTDIR/twithub.h5 tai3.h5
+UNJAMTEST tai3.h5 - taa3.h5
+CHECKFILE $TESTDIR/tall.h5 taa3.h5
+CLEANUP taa3.h5 tai3.h5
+SETUP $TESTDIR/twithub513.h5 tai4.h5
+UNJAMTEST tai4.h5 - taa4.h5
+CHECKFILE $TESTDIR/tall.h5 taa4.h5
+CLEANUP taa4.h5 tai4.h5
+
+SETUP $TESTDIR/twithub.h5 taj2.h5
+UNJAMTEST taj2.h5 --delete tac2.h5
+CHECKFILE $TESTDIR/tall.h5 tac2.h5
+CLEANUP tac2.h5 taj2.h5
+SETUP $TESTDIR/twithub513.h5 taj3.h5
+UNJAMTEST taj3.h5 --delete tac3.h5
+CHECKFILE $TESTDIR/tall.h5 tac3.h5
+CLEANUP tac3.h5 taj3.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/test/h5ls/CMakeLists.txt b/tools/test/h5ls/CMakeLists.txt
new file mode 100644
index 0000000..c21ca92
--- /dev/null
+++ b/tools/test/h5ls/CMakeLists.txt
@@ -0,0 +1,39 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5LS)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  #-----------------------------------------------------------------------------
+  # If plugin library tests can be tested
+  #-----------------------------------------------------------------------------
+  set (HDF5_TOOL_PLUGIN_LIB_CORENAME         "dynlibls")
+  set (HDF5_TOOL_PLUGIN_LIB_NAME             "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_CORENAME}")
+  set (HDF5_TOOL_PLUGIN_LIB_TARGET           ${HDF5_TOOL_PLUGIN_LIB_CORENAME})
+  add_definitions (${HDF_EXTRA_C_FLAGS})
+  INCLUDE_DIRECTORIES (${HDF5_SRC_DIR})
+
+  add_library (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_ls.c)
+  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED " " " ")
+  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})
+
+  # make plugins dir
+  file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins")
+  #-----------------------------------------------------------------------------
+  # Copy plugin library to a plugins folder
+  #-----------------------------------------------------------------------------
+  add_custom_command (
+      TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      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)
+
+  include (CMakeTestsVDS.cmake)
diff --git a/tools/test/h5ls/CMakeTests.cmake b/tools/test/h5ls/CMakeTests.cmake
new file mode 100644
index 0000000..5f61eab
--- /dev/null
+++ b/tools/test/h5ls/CMakeTests.cmake
@@ -0,0 +1,457 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the test files from source directory to test directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/tall.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattr2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tattrreg.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tcompound.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdatareg.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdset.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc.h5
+      ${HDF5_TOOLS_DIR}/testfiles/textlinktar.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.h5
+      ${HDF5_TOOLS_DIR}/testfiles/thlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tloop.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tnestedcomp.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tslink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tstr.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tudfilter.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tdset_idx.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      ${HDF5_TOOLS_DIR}/testfiles/help-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/help-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/help-3.ls
+      ${HDF5_TOOLS_DIR}/testfiles/nosuchfile.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tall-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tall-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tarray1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tattr2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tattrreg_le.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tattrreg_be.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tcomp-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tdataregbe.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tdataregle.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tdset-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tempty.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlink-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-3.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-4.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-5.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-6.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-7.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-1-old.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-2-old.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-3-old.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-6-old.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-7-old.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-3.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-4.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-5.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-nodangle-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/textlinksrc-nodangle-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tgrp_comments.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsoftlinks-nodangle-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/thlinks-nodangle-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tgroup-3.ls
+      ${HDF5_TOOLS_DIR}/testfiles/thlink-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tloop-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tmultifile.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tnestcomp-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tnestcomp-2.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tnestcomp-3.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tnestcomp-4.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tsaf.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tslink-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tstr-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tudfilter.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tudlink-1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes1.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2le.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tvldtypes2be.ls
+      ${HDF5_TOOLS_DIR}/testfiles/tdset_idx.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)
+    HDFTEST_COPY_FILE("${listfiles}" "${PROJECT_BINARY_DIR}/testfiles/${fname}" "h5ls_files")
+  endforeach ()
+  add_custom_target(h5ls_files ALL COMMENT "Copying files needed by h5ls tests" DEPENDS ${h5ls_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_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")
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      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"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ls"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_UD_TEST testname resultcode resultfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5LS_UD-${testname}-clearall-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              testfiles/${resultfile}.out
+              testfiles/${resultfile}.out.err
+      )
+      add_test (
+          NAME H5LS_UD-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5ls>"
+              -D "TEST_ARGS=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ls"
+              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5LS_UD-${testname} PROPERTIES DEPENDS H5LS_UD-${testname}-clearall-objects)
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          help-1.out
+          help-1.out.err
+          help-2.out
+          help-2.out.err
+          help-3.out
+          help-3.out.err
+          nosuchfile.out
+          nosuchfile.out.err
+          tall-1.out
+          tall-1.out.err
+          tall-2.out
+          tall-2.out.err
+          tarray1.out
+          tarray1.out.err
+          tattr2.out
+          tattr2.out.err
+          tcomp-1.out
+          tcomp-1.out.err
+          tdataregbe.out
+          tdataregbe.out.err
+          tdataregle.out
+          tdataregle.out.err
+          tdset-1.out
+          tdset-1.out.err
+          tempty.out
+          tempty.out.err
+          textlink-1.out
+          textlink-1.out.err
+          textlinksrc-1.out
+          textlinksrc-1.out.err
+          textlinksrc-2.out
+          textlinksrc-2.out.err
+          textlinksrc-3.out
+          textlinksrc-3.out.err
+          textlinksrc-4.out
+          textlinksrc-4.out.err
+          textlinksrc-5.out
+          textlinksrc-5.out.err
+          textlinksrc-6.out
+          textlinksrc-6.out.err
+          textlinksrc-7.out
+          textlinksrc-7.out.err
+          textlinksrc-1-old.out
+          textlinksrc-1-old.out.err
+          textlinksrc-2-old.out
+          textlinksrc-2-old.out.err
+          textlinksrc-3-old.out
+          textlinksrc-3-old.out.err
+          textlinksrc-6-old.out
+          textlinksrc-6-old.out.err
+          textlinksrc-7-old.out
+          textlinksrc-7-old.out.err
+          tgrp_comments.out
+          tgrp_comments.out.err
+          tsoftlinks-1.out
+          tsoftlinks-1.out.err
+          tsoftlinks-2.out
+          tsoftlinks-2.out.err
+          tsoftlinks-3.out
+          tsoftlinks-3.out.err
+          tsoftlinks-4.out
+          tsoftlinks-4.out.err
+          tsoftlinks-5.out
+          tsoftlinks-5.out.err
+          textlinksrc-nodangle-1.out
+          textlinksrc-nodangle-1.out.err
+          textlinksrc-nodangle-2.out
+          textlinksrc-nodangle-2.out.err
+          tsoftlinks-nodangle-1.out
+          tsoftlinks-nodangle-1.out.err
+          thlinks-nodangle-1.out
+          thlinks-nodangle-1.out.err
+          tgroup.out
+          tgroup.out.err
+          tgroup-1.out
+          tgroup-1.out.err
+          tgroup-2.out
+          tgroup-2.out.err
+          tgroup-3.out
+          tgroup-3.out.err
+          thlink-1.out
+          thlink-1.out.err
+          tloop-1.out
+          tloop-1.out.err
+          tnestcomp-1.out
+          tnestcomp-1.out.err
+          tnestcomp-2.out
+          tnestcomp-2.out.err
+          tnestcomp-3.out
+          tnestcomp-3.out.err
+          tnestcomp-4.out
+          tnestcomp-4.out.err
+          tsaf.out
+          tsaf.out.err
+          tslink-1.out
+          tslink-1.out.err
+          tstr-1.out
+          tstr-1.out.err
+          tudlink-1.out
+          tudlink-1.out.err
+          tvldtypes1.out
+          tvldtypes1.out.err
+          tvldtypes2le.out
+          tvldtypes2le.out.err
+          tvldtypes2be.out
+          tvldtypes2be.out.err
+    )
+    set_tests_properties (H5LS-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5LS-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5LS-clearall-objects")
+  endif ()
+
+# 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 ()
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif ()
+
+  # test the help syntax
+  ADD_H5_TEST (help-1 0 -w80 -h)
+  ADD_H5_TEST (help-2 0 -w80 --help)
+  ADD_H5_TEST (help-3 0 -w80 -?)
+
+  # test simple command
+  ADD_H5_TEST (tall-1 0 -w80 tall.h5)
+  ADD_H5_TEST (tall-2 0 -w80 -r -d tall.h5)
+  ADD_H5_TEST (tgroup 0 -w80 tgroup.h5)
+  ADD_H5_TEST (tgroup-3 0 -w80 tgroup.h5/g1)
+
+  # test for displaying groups
+  # The following combination of arguments is expected to return an error message
+  # and return value 1
+  ADD_H5_TEST (tgroup-1 1 -w80 -r -g tgroup.h5)
+  ADD_H5_TEST (tgroup-2 0 -w80 -g tgroup.h5/g1)
+
+  # test for files with groups that have long comments
+  ADD_H5_TEST (tgrp_comments 0 -w80 -v -g tgrp_comments.h5/glongcomment)
+
+  # test for displaying simple space datasets
+  ADD_H5_TEST (tdset-1 0 -w80 -r -d tdset.h5)
+
+  # test for displaying soft links (dangle)
+  ADD_H5_TEST (tslink-1 0 -w80 -r tslink.h5)
+
+  # test for displaying more soft links with --follow-symlinks
+  ADD_H5_TEST (tsoftlinks-1 0 --follow-symlinks tsoftlinks.h5)
+  ADD_H5_TEST (tsoftlinks-2 0 --follow-symlinks -r tsoftlinks.h5)
+  ADD_H5_TEST (tsoftlinks-3 0 --follow-symlinks tsoftlinks.h5/group1)
+  ADD_H5_TEST (tsoftlinks-4 0 --follow-symlinks -r tsoftlinks.h5/group1)
+  ADD_H5_TEST (tsoftlinks-5 0 --follow-symlinks tsoftlinks.h5/soft_dset1)
+
+  # test for displaying external and user-defined links with --follow-symlinks
+  ADD_H5_TEST (textlink-1 0 -w80 -r textlink.h5)
+  ADD_H5_TEST (textlinksrc-1 0 -w80 --follow-symlinks -r textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-2 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5)
+  ADD_H5_TEST (textlinksrc-3 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-4 0 -w80 -r textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-5 0 -w80 -r textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-6 0 -w80 --follow-symlinks textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-7 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (tudlink-1 0 -w80 -r tudlink.h5)
+
+  # test for displaying external links with -E
+  # the option -E will be depriciated but keep it for backward compatibility
+  ADD_H5_TEST (textlinksrc-1-old 0 -w80 -Er textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-2-old 0 -w80 -Erv textlinksrc.h5/ext_link5)
+  ADD_H5_TEST (textlinksrc-3-old 0 -w80 -Er textlinksrc.h5/ext_link1)
+  ADD_H5_TEST (textlinksrc-6-old 0 -w80 -E textlinksrc.h5)
+  ADD_H5_TEST (textlinksrc-7-old 0 -w80 -E textlinksrc.h5/ext_link1)
+
+  # tests for no-dangling-links
+  # if this option is given on dangling link, h5ls should return exit code 1
+  # when used alone , expect to print out help and return exit code 1
+  ADD_H5_TEST (textlinksrc-nodangle-1 1 -w80 --no-dangling-links textlinksrc.h5)
+  # external dangling link - expected exit code 1
+  ADD_H5_TEST (textlinksrc-nodangle-2 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5)
+  # soft dangling link - expected exit code 1
+  ADD_H5_TEST (tsoftlinks-nodangle-1 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5)
+  # when used file with no dangling links - expected exit code 0
+  ADD_H5_TEST (thlinks-nodangle-1 0 -w80 --follow-symlinks --no-dangling-links thlink.h5)
+
+# test for wildcards in filename (does not work with cmake)
+#  ADD_H5_TEST (tstarfile 0 -w80 t*link.h5)
+#  ADD_H5_TEST (tqmarkfile 0 -w80 t?link.h5)
+  ADD_H5_TEST (tmultifile 0 -w80 thlink.h5 tslink.h5)
+
+  # tests for hard links
+  ADD_H5_TEST (thlink-1 0 -w80 thlink.h5)
+
+  # tests for compound data types
+  ADD_H5_TEST (tcomp-1 0 -w80 -r -d tcompound.h5)
+
+  #test for the nested compound type
+  ADD_H5_TEST (tnestcomp-1 0 -w80 -r -d tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-2 0 -w80 -r -d -S tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-3 0 -w80 -r -d -l tnestedcomp.h5)
+
+  ADD_H5_TEST (tnestcomp-4 0 -w80 -r -d -l -S tnestedcomp.h5)
+
+  # test for loop detection
+  ADD_H5_TEST (tloop-1 0 -w80 -r -d tloop.h5)
+
+  # test for string
+  ADD_H5_TEST (tstr-1 0 -w80 -r -d tstr.h5)
+
+  # test test file created from lib SAF team
+  ADD_H5_TEST (tsaf 0 -w80 -r -d tsaf.h5)
+
+  # test for variable length data types
+  ADD_H5_TEST (tvldtypes1 0 -w80 -r -d tvldtypes1.h5)
+
+  # test for array data types
+  ADD_H5_TEST (tarray1 0 -w80 -r -d tarray1.h5)
+
+  # test for empty data
+  ADD_H5_TEST (tempty 0 -w80 -d tempty.h5)
+
+  # test for all dataset types written to attributes
+  # enable -S for avoiding printing NATIVE types
+  ADD_H5_TEST (tattr2 0 -w80 -v -S tattr2.h5)
+
+  # test for attribute with region references wo verbose mode
+  # ( HDFFV-7838, )
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tattrreg_be 0 -w80 -v -d tattrreg.h5)
+  else ()
+    ADD_H5_TEST (tattrreg_le 0 -w80 -v -d tattrreg.h5)
+  endif ()
+
+  # test for non-existing file
+  ADD_H5_TEST (nosuchfile 1 nosuchfile.h5)
+
+  # test for variable length data types in verbose mode
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tvldtypes2be 0 -v tvldtypes1.h5)
+  else ()
+    ADD_H5_TEST (tvldtypes2le 0 -v tvldtypes1.h5)
+  endif ()
+
+  # test for dataset region references data types in verbose mode
+  if (H5_WORDS_BIGENDIAN)
+    ADD_H5_TEST (tdataregbe 0 -v tdatareg.h5)
+  else ()
+    ADD_H5_TEST (tdataregle 0 -v tdatareg.h5)
+  endif ()
+
+# test for file with datasets that use Fixed Array chunk indices
+  if (USE_FILTER_DEFLATE)
+    # data read internal filters
+    ADD_H5_TEST (tdset_idx 0 -w80 -d tdset_idx.h5)
+  endif ()
+
+
+##############################################################################
+###    P L U G I N  T E S T S
+##############################################################################
+ADD_H5_UD_TEST (h5ls_plugin_test 0 tudfilter -w80 -d tudfilter.h5)
diff --git a/tools/test/h5ls/CMakeTestsVDS.cmake b/tools/test/h5ls/CMakeTestsVDS.cmake
new file mode 100644
index 0000000..4a665a5
--- /dev/null
+++ b/tools/test/h5ls/CMakeTestsVDS.cmake
@@ -0,0 +1,148 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           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)
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/vds/${listfiles}" "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}" "h5ls_vds_files")
+  endforeach ()
+  add_custom_target(h5ls_vds_files ALL COMMENT "Copying files needed by h5ls_vds tests" DEPENDS ${h5ls_vds_files_list})
+
+##############################################################################
+##############################################################################
+###           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 ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else ()
+      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"
+      )
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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
+    )
+    set_tests_properties (H5LS_VDS-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5LS_VDS-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5LS_VDS-clearall-objects")
+  endif ()
+
+  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/test/h5ls/Makefile.am b/tools/test/h5ls/Makefile.am
new file mode 100644
index 0000000..2494e18
--- /dev/null
+++ b/tools/test/h5ls/Makefile.am
@@ -0,0 +1,52 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+# Test programs and scripts
+TEST_SCRIPT=testh5ls.sh testh5lsvds.sh
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5ls/h5ls$(EXEEXT)
+if HAVE_SHARED_CONDITIONAL
+if USE_PLUGINS_CONDITIONAL
+   TEST_SCRIPT += h5ls_plugin.sh
+endif
+endif
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+if HAVE_SHARED_CONDITIONAL
+  # Build it as shared library if configure is enabled for shared library.
+  dyn_LTLIBRARIES=libdynlibls.la
+  libdynlibls_la_SOURCES=dynlib_ls.c
+  libdynlibls_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+libdynlibls.la: $(libdynlibls_la_OBJECTS) $(libdynlibls_la_DEPENDENCIES) $(EXTRA_libdynlibls_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlibls_la_LINK) $(am_libdynlibls_la_rpath) $(libdynlibls_la_OBJECTS) $(libdynlibls_la_LIBADD)
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+endif
+
+DISTCLEANFILES=h5ls_plugin.sh
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5ls/Makefile.in b/tools/test/h5ls/Makefile.in
new file mode 100644
index 0000000..9bd37b2
--- /dev/null
+++ b/tools/test/h5ls/Makefile.in
@@ -0,0 +1,1466 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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@
+ at HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5ls_plugin.sh
+TESTS = $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5ls_plugin.sh testh5ls.sh testh5lsvds.sh
+CONFIG_CLEAN_VPATH_FILES =
+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__installdirs = "$(DESTDIR)$(dyndir)"
+LTLIBRARIES = $(dyn_LTLIBRARIES)
+libdynlibls_la_LIBADD =
+am__libdynlibls_la_SOURCES_DIST = dynlib_ls.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibls_la_OBJECTS =  \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_ls.lo
+libdynlibls_la_OBJECTS = $(am_libdynlibls_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 = 
+libdynlibls_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libdynlibls_la_LDFLAGS) $(LDFLAGS) -o \
+	$@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibls_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+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 = $(libdynlibls_la_SOURCES)
+DIST_SOURCES = $(am__libdynlibls_la_SOURCES_DIST)
+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__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)/h5ls_plugin.sh.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@
+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
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Test programs and scripts
+TEST_SCRIPT = testh5ls.sh testh5lsvds.sh $(am__append_1)
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5ls/h5ls$(EXEEXT)
+
+# All programs depend on the hdf5 and h5tools libraries
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+ at HAVE_SHARED_CONDITIONAL_TRUE@dyn_LTLIBRARIES = libdynlibls.la
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibls_la_SOURCES = dynlib_ls.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibls_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+DISTCLEANFILES = h5ls_plugin.sh
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5ls/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5ls/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):
+h5ls_plugin.sh: $(top_builddir)/config.status $(srcdir)/h5ls_plugin.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+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-dynLTLIBRARIES: $(dyn_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dyndir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dyndir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dyndir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dyndir)"; \
+	}
+
+uninstall-dynLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dyndir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dyndir)/$$f"; \
+	done
+
+clean-dynLTLIBRARIES:
+	-test -z "$(dyn_LTLIBRARIES)" || rm -f $(dyn_LTLIBRARIES)
+	@list='$(dyn_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlibls.la: $(libdynlibls_la_OBJECTS) $(libdynlibls_la_DEPENDENCIES) $(EXTRA_libdynlibls_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlibls_la_LINK) $(am_libdynlibls_la_rpath) $(libdynlibls_la_OBJECTS) $(libdynlibls_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_ls.Plo at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $(LTLIBRARIES) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(dyndir)"; 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-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+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: uninstall-dynLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
+	check-am clean clean-dynLTLIBRARIES 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-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+.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
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibls.la: $(libdynlibls_la_OBJECTS) $(libdynlibls_la_DEPENDENCIES) $(EXTRA_libdynlibls_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlibls_la_LINK) $(am_libdynlibls_la_rpath) $(libdynlibls_la_OBJECTS) $(libdynlibls_la_LIBADD)
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-dyn: $(DYN)
+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 dyn 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/test/h5ls/dynlib_ls.c b/tools/test/h5ls/dynlib_ls.c
new file mode 100644
index 0000000..571452e
--- /dev/null
+++ b/tools/test/h5ls/dynlib_ls.c
@@ -0,0 +1,89 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIBUD      300
+#define MULTIPLIER              3
+
+static size_t H5Z_filter_dynlibud(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_DYNLIBUD[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIBUD,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlibud",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlibud,    /* The actual filter function    */
+}};
+
+H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+const void   *H5PLget_plugin_info(void) {return H5Z_DYNLIBUD;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlibud
+ *
+ * Purpose:    A dynlib2 filter method that multiplies the original value
+ *              during write and divide the original value during read. It
+ *              will be built as a shared library.  plugin.c test will load
+ *              and use this filter library.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    char *int_ptr = (char *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+
+    /* Check for the correct number of parameters */
+    if(cd_nelmts > 0)
+        return(0);
+
+    /* Assignment to eliminate unused parameter warning. */
+    cd_values = cd_values;
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Subtract the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp - MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the original value with MULTIPLIER */
+        while(buf_left > 0) {
+            char temp = *int_ptr;
+            *int_ptr = temp + MULTIPLIER;
+            int_ptr++;
+            buf_left -= sizeof(*int_ptr);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlibud() */
+
diff --git a/tools/test/h5ls/h5ls_plugin.sh.in b/tools/test/h5ls/h5ls_plugin.sh.in
new file mode 100644
index 0000000..34114d8
--- /dev/null
+++ b/tools/test/h5ls/h5ls_plugin.sh.in
@@ -0,0 +1,251 @@
+#! /bin/sh
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+srcdir=@srcdir@
+TOP_BUILDDIR=@top_builddir@
+
+# Determine backward compatibility options enabled
+DEPRECATED_SYMBOLS="@DEPRECATED_SYMBOLS@"
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5LS=../../src/h5ls/h5ls               # The tool name
+H5LS_BIN=`pwd`/$H5LS    # The path of the tool binary
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes      # default is yes
+
+TEST_NAME=ud_plugin
+FROM_DIR=`pwd`/.libs
+PLUGIN_LIB="$FROM_DIR/libdynlibls.*"
+PLUGIN_LIBDIR=testdir3
+RM='rm -rf'
+
+RM='rm -rf'
+GREP='grep'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# source dirs
+SRC_TOOLS="$srcdir/../.."
+
+# testfiles source dirs for tools
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+
+TESTDIR=./testplug
+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_TOOLS_TESTFILES/tudfilter.h5
+$SRC_TOOLS_TESTFILES/tudfilter.ls
+"
+
+# RUNSERIAL is used. Check if it can return exit code from executable correctly.
+if [ -n "$RUNSERIAL_NOEXITCODE" ]; then
+    echo "***Warning*** Serial Exit Code is not passed back to shell correctly."
+    echo "***Warning*** Exit code checking is skipped."
+    h5haveexitcode=no
+fi
+
+# Main Body
+# Create test directories if not exists yet.
+test -d $PLUGIN_LIBDIR || mkdir -p $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to create test directory($PLUGIN_LIBDIR)"
+    exit $EXIT_FAILURE
+fi
+
+# copy plugin library for test
+$CP $PLUGIN_LIB $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to copy plugin library ($PLUGIN_LIB) for test."
+    exit $EXIT_FAILURE
+fi
+
+# setup plugin path
+ENVCMD="env HDF5_PLUGIN_PATH=../${PLUGIN_LIBDIR}"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_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=$SRC_H5LS_TESTFILES
+    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 $* message left justified in a field of 70 characters
+#
+MESSAGE() {
+   SPACES="                                                               "
+   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# 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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY() {
+    MESSAGE "Verifying $*"
+}
+
+# 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
+        $ENVCMD $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
+
+# Run the test
+TOOLTEST tudfilter.ls 0 -w80 -d tudfilter.h5
+
+# print results
+if test $nerrors -ne 0 ; then
+    echo "$nerrors errors encountered"
+    exit_code=$EXIT_FAILURE
+else
+    echo "All Plugin API tests passed."
+    exit_code=$EXIT_SUCCESS
+fi
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Clean up temporary files/directories and leave
+$RM $PLUGIN_LIBDIR
+
+exit $exit_code
diff --git a/tools/test/h5ls/testh5ls.sh.in b/tools/test/h5ls/testh5ls.sh.in
new file mode 100644
index 0000000..31877d9
--- /dev/null
+++ b/tools/test/h5ls/testh5ls.sh.in
@@ -0,0 +1,441 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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@
+
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5ls
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5LS=../../src/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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testfiles
+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/tall.h5
+$SRC_H5LS_TESTFILES/tarray1.h5
+$SRC_H5LS_TESTFILES/tattr2.h5
+$SRC_H5LS_TESTFILES/tattrreg.h5
+$SRC_H5LS_TESTFILES/tcompound.h5
+$SRC_H5LS_TESTFILES/tdatareg.h5
+$SRC_H5LS_TESTFILES/tdset.h5
+$SRC_H5LS_TESTFILES/tempty.h5
+$SRC_H5LS_TESTFILES/textlink.h5
+$SRC_H5LS_TESTFILES/textlinksrc.h5
+$SRC_H5LS_TESTFILES/textlinktar.h5
+$SRC_H5LS_TESTFILES/tgroup.h5
+$SRC_H5LS_TESTFILES/tgrp_comments.h5
+$SRC_H5LS_TESTFILES/thlink.h5
+$SRC_H5LS_TESTFILES/tloop.h5
+$SRC_H5LS_TESTFILES/tnestedcomp.h5
+$SRC_H5LS_TESTFILES/tsaf.h5
+$SRC_H5LS_TESTFILES/tslink.h5
+$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="
+$SRC_H5LS_TESTFILES/help-1.ls
+$SRC_H5LS_TESTFILES/help-2.ls
+$SRC_H5LS_TESTFILES/help-3.ls
+$SRC_H5LS_TESTFILES/nosuchfile.ls
+$SRC_H5LS_TESTFILES/tall-1.ls
+$SRC_H5LS_TESTFILES/tall-2.ls
+$SRC_H5LS_TESTFILES/tarray1.ls
+$SRC_H5LS_TESTFILES/tattr2.ls
+$SRC_H5LS_TESTFILES/tattrreg_le.ls
+$SRC_H5LS_TESTFILES/tattrreg_be.ls
+$SRC_H5LS_TESTFILES/tcomp-1.ls
+$SRC_H5LS_TESTFILES/tdataregbe.ls
+$SRC_H5LS_TESTFILES/tdataregle.ls
+$SRC_H5LS_TESTFILES/tdset-1.ls
+$SRC_H5LS_TESTFILES/tempty.ls
+$SRC_H5LS_TESTFILES/textlink-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-2.ls
+$SRC_H5LS_TESTFILES/textlinksrc-3.ls
+$SRC_H5LS_TESTFILES/textlinksrc-4.ls
+$SRC_H5LS_TESTFILES/textlinksrc-5.ls
+$SRC_H5LS_TESTFILES/textlinksrc-6.ls
+$SRC_H5LS_TESTFILES/textlinksrc-7.ls
+$SRC_H5LS_TESTFILES/textlinksrc-1-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-2-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-3-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-6-old.ls
+$SRC_H5LS_TESTFILES/textlinksrc-7-old.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-1.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-2.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-3.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-4.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-5.ls
+$SRC_H5LS_TESTFILES/textlinksrc-nodangle-1.ls
+$SRC_H5LS_TESTFILES/textlinksrc-nodangle-2.ls
+$SRC_H5LS_TESTFILES/tgrp_comments.ls
+$SRC_H5LS_TESTFILES/tsoftlinks-nodangle-1.ls
+$SRC_H5LS_TESTFILES/thlinks-nodangle-1.ls
+$SRC_H5LS_TESTFILES/tgroup.ls
+$SRC_H5LS_TESTFILES/tgroup-1.ls
+$SRC_H5LS_TESTFILES/tgroup-2.ls
+$SRC_H5LS_TESTFILES/tgroup-3.ls
+$SRC_H5LS_TESTFILES/thlink-1.ls
+$SRC_H5LS_TESTFILES/tloop-1.ls
+$SRC_H5LS_TESTFILES/tmultifile.ls
+$SRC_H5LS_TESTFILES/tnestcomp-1.ls
+$SRC_H5LS_TESTFILES/tnestcomp-2.ls
+$SRC_H5LS_TESTFILES/tnestcomp-3.ls
+$SRC_H5LS_TESTFILES/tnestcomp-4.ls
+$SRC_H5LS_TESTFILES/tsaf.ls
+$SRC_H5LS_TESTFILES/tslink-1.ls
+$SRC_H5LS_TESTFILES/tstr-1.ls
+$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
+"
+
+
+# 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=$SRC_H5LS_TESTFILES
+    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
+
+# Toss in a bunch of tests.  Not sure if they are the right kinds.
+# test the help syntax
+TOOLTEST help-1.ls 0 -w80 -h
+TOOLTEST help-2.ls 0 -w80 -help
+TOOLTEST help-3.ls 0 -w80 -?
+
+# test simple command
+TOOLTEST tall-1.ls 0 -w80 tall.h5
+TOOLTEST tall-2.ls 0 -w80 -r -d tall.h5
+TOOLTEST tgroup.ls 0 -w80 tgroup.h5
+TOOLTEST tgroup-3.ls 0 -w80 tgroup.h5/g1
+
+# test for displaying groups
+# 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
+TOOLTEST tgroup-2.ls 0 -w80 -g tgroup.h5/g1
+
+# test for files with groups that have long comments
+TOOLTEST tgrp_comments.ls 0 -w80 -v -g tgrp_comments.h5/glongcomment
+
+# test for displaying simple space datasets
+TOOLTEST tdset-1.ls 0 -w80 -r -d tdset.h5
+
+# test for displaying soft links
+TOOLTEST tslink-1.ls 0 -w80 -r tslink.h5
+
+# test for displaying more soft links with --follow-symlinks
+TOOLTEST tsoftlinks-1.ls 0 --follow-symlinks tsoftlinks.h5
+TOOLTEST tsoftlinks-2.ls 0 --follow-symlinks -r tsoftlinks.h5
+TOOLTEST tsoftlinks-3.ls 0 --follow-symlinks tsoftlinks.h5/group1
+TOOLTEST tsoftlinks-4.ls 0 --follow-symlinks -r tsoftlinks.h5/group1
+TOOLTEST tsoftlinks-5.ls 0 --follow-symlinks tsoftlinks.h5/soft_dset1
+
+# test for displaying external and user-defined links with --follow-symlinks
+TOOLTEST textlink-1.ls 0 -w80 -r textlink.h5
+TOOLTEST textlinksrc-1.ls 0 -w80 --follow-symlinks -r textlinksrc.h5
+TOOLTEST textlinksrc-2.ls 0 -w80 --follow-symlinks -rv textlinksrc.h5/ext_link5
+TOOLTEST textlinksrc-3.ls 0 -w80 --follow-symlinks -r textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-4.ls 0 -w80 -r textlinksrc.h5
+TOOLTEST textlinksrc-5.ls 0 -w80 -r textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-6.ls 0 -w80 --follow-symlinks textlinksrc.h5
+TOOLTEST textlinksrc-7.ls 0 -w80 --follow-symlinks textlinksrc.h5/ext_link1
+TOOLTEST tudlink-1.ls 0 -w80 -r tudlink.h5
+
+# test for displaying external links with -E
+# the option -E will be depriciated but keep it for backward compatibility
+TOOLTEST textlinksrc-1-old.ls 0 -w80 -Er textlinksrc.h5
+TOOLTEST textlinksrc-2-old.ls 0 -w80 -Erv textlinksrc.h5/ext_link5
+TOOLTEST textlinksrc-3-old.ls 0 -w80 -Er textlinksrc.h5/ext_link1
+TOOLTEST textlinksrc-6-old.ls 0 -w80 -E textlinksrc.h5
+TOOLTEST textlinksrc-7-old.ls 0 -w80 -E textlinksrc.h5/ext_link1
+
+# tests for no-dangling-links
+# if this option is given on dangling link, h5ls should return exit code 1
+# when used alone , expect to print out help and return exit code 1
+TOOLTEST textlinksrc-nodangle-1.ls 1 -w80 --no-dangling-links textlinksrc.h5
+# external dangling link - expected exit code 1
+TOOLTEST textlinksrc-nodangle-2.ls 1 -w80 --follow-symlinks --no-dangling-links textlinksrc.h5
+# soft dangling link - expected exit code 1
+TOOLTEST tsoftlinks-nodangle-1.ls 1 -w80 --follow-symlinks --no-dangling-links tsoftlinks.h5
+# when used file with no dangling links - expected exit code 0
+TOOLTEST thlinks-nodangle-1.ls 0 -w80 --follow-symlinks --no-dangling-links thlink.h5
+
+# test for wildcards in filename (does not work with cmake)
+# this h5ls test script does not pass the filename properly like the h5dump test script???
+#TOOLTEST tstarfile.ls 0 -w80 t*link.h5
+#TOOLTEST tqmarkfile.ls 0 -w80 t?link.h5
+TOOLTEST tmultifile.ls 0 -w80 thlink.h5 tslink.h5
+
+# tests for hard links
+TOOLTEST thlink-1.ls 0 -w80 thlink.h5
+
+# tests for compound data types
+TOOLTEST tcomp-1.ls 0 -w80 -r -d tcompound.h5
+
+#test for the nested compound type
+TOOLTEST tnestcomp-1.ls 0 -w80 -r -d tnestedcomp.h5
+
+TOOLTEST tnestcomp-2.ls 0 -w80 -r -d -S tnestedcomp.h5
+
+TOOLTEST tnestcomp-3.ls 0 -w80 -r -d -l tnestedcomp.h5
+
+TOOLTEST tnestcomp-4.ls 0 -w80 -r -d -l -S tnestedcomp.h5
+
+# test for loop detection
+TOOLTEST tloop-1.ls 0 -w80 -r -d tloop.h5
+
+# test for string
+TOOLTEST tstr-1.ls 0 -w80 -r -d tstr.h5
+
+# test test file created from lib SAF team
+TOOLTEST tsaf.ls 0 -w80 -r -d tsaf.h5
+
+# test for variable length data types
+TOOLTEST tvldtypes1.ls 0 -w80 -r -d tvldtypes1.h5
+
+# test for array data types
+TOOLTEST tarray1.ls 0 -w80 -r -d tarray1.h5
+
+# test for empty data
+TOOLTEST tempty.ls 0 -w80 -d tempty.h5
+
+# test for all dataset types written to attributes
+# enable -S for avoiding printing NATIVE types
+TOOLTEST tattr2.ls 0 -w80 -v -S tattr2.h5
+
+# test for attribute with region references without verbose mode
+# ( HDFFV-7838, )
+if test $WORDS_BIGENDIAN != "yes"; then
+TOOLTEST tattrreg_le.ls 0 -w80 -v -d tattrreg.h5
+else
+TOOLTEST tattrreg_be.ls 0 -w80 -v -d tattrreg.h5
+fi
+
+# tests for error handling.
+# test for non-existing file
+TOOLTEST nosuchfile.ls 1 nosuchfile.h5
+
+# test for variable length data types in verbose mode
+if test $WORDS_BIGENDIAN != "yes"; then
+ TOOLTEST tvldtypes2le.ls 0 -v tvldtypes1.h5
+else
+ TOOLTEST tvldtypes2be.ls 0 -v tvldtypes1.h5
+fi
+
+
+# test for dataset region references data types in verbose mode
+if test $WORDS_BIGENDIAN != "yes"; then
+ TOOLTEST tdataregle.ls 0 -v tdatareg.h5
+else
+ TOOLTEST tdataregbe.ls 0 -v tdatareg.h5
+fi
+
+# test for file with datasets that use Fixed Array chunk indices
+if test $USE_FILTER_DEFLATE = "yes" ; then
+  # data read internal filters
+  TOOLTEST tdset_idx.ls 0 -w80 -d tdset_idx.h5
+else
+  echo "***skip testing tdset_idx.h5"
+fi
+
+# 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/test/h5ls/testh5lsvds.sh.in b/tools/test/h5ls/testh5lsvds.sh.in
new file mode 100644
index 0000000..ddb1632
--- /dev/null
+++ b/tools/test/h5ls/testh5lsvds.sh.in
@@ -0,0 +1,256 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=../../src/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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/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=$SRC_H5LS_TESTFILES/vds
+    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/test/h5repack/CMakeLists.txt b/tools/test/h5repack/CMakeLists.txt
new file mode 100644
index 0000000..9d67ec3
--- /dev/null
+++ b/tools/test/h5repack/CMakeLists.txt
@@ -0,0 +1,79 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5REPACK)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/src/h5repack)
+INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
+
+# --------------------------------------------------------------------
+# Add h5Repack test executables
+# --------------------------------------------------------------------
+add_executable (testh5repack_detect_szip ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testh5repack_detect_szip.c)
+TARGET_NAMING (testh5repack_detect_szip STATIC)
+TARGET_C_PROPERTIES (testh5repack_detect_szip STATIC " " " ")
+target_link_libraries (testh5repack_detect_szip ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+set_target_properties (testh5repack_detect_szip PROPERTIES FOLDER tools)
+
+set (REPACK_COMMON_SOURCES
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_copy.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_filters.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_opttable.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_parse.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_refs.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack_verify.c
+    ${HDF5_TOOLS_SRC_H5REPACK_SOURCE_DIR}/h5repack.c
+)
+add_executable (h5repacktest ${REPACK_COMMON_SOURCES} ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/h5repacktst.c)
+TARGET_NAMING (h5repacktest STATIC)
+TARGET_C_PROPERTIES (h5repacktest STATIC " " " ")
+target_link_libraries (h5repacktest  ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+set_target_properties (h5repacktest PROPERTIES FOLDER tools)
+
+  #-----------------------------------------------------------------------------
+  # If plugin library tests can be tested
+  #-----------------------------------------------------------------------------
+  set (HDF5_TOOL_PLUGIN_LIB_CORENAME         "dynlibadd")
+  set (HDF5_TOOL_PLUGIN_LIB_NAME             "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_CORENAME}")
+  set (HDF5_TOOL_PLUGIN_LIB_TARGET           ${HDF5_TOOL_PLUGIN_LIB_CORENAME})
+  set (HDF5_TOOL_PLUGIN_LIB_VCORENAME        "dynlibvers")
+  set (HDF5_TOOL_PLUGIN_LIB_VNAME            "${HDF5_EXTERNAL_LIB_PREFIX}${HDF5_TOOL_PLUGIN_LIB_VCORENAME}")
+  set (HDF5_TOOL_PLUGIN_LIB_VTARGET          ${HDF5_TOOL_PLUGIN_LIB_VCORENAME})
+  add_definitions (${HDF_EXTRA_C_FLAGS})
+  INCLUDE_DIRECTORIES (${HDF5_SRC_DIR})
+
+  add_library (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_rpk.c)
+  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_TARGET} SHARED " " " ")
+  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})
+
+  add_library (${HDF5_TOOL_PLUGIN_LIB_VTARGET} SHARED dynlib_vrpk.c)
+  TARGET_C_PROPERTIES (${HDF5_TOOL_PLUGIN_LIB_VTARGET} SHARED " " " ")
+  target_link_libraries (${HDF5_TOOL_PLUGIN_LIB_VTARGET} ${HDF5_TEST_LIB_TARGET})
+  H5_SET_LIB_OPTIONS (${HDF5_TOOL_PLUGIN_LIB_VTARGET} ${HDF5_TOOL_PLUGIN_LIB_VNAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+
+  # make plugins dir
+  file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins")
+  #-----------------------------------------------------------------------------
+  # Copy plugin library to a plugins folder
+  #-----------------------------------------------------------------------------
+  add_custom_command (
+      TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different
+          "$<TARGET_FILE:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
+          "${CMAKE_BINARY_DIR}/plugins/$<TARGET_FILE_NAME:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
+  )
+  add_custom_command (
+      TARGET     ${HDF5_TOOL_PLUGIN_LIB_VTARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different
+          "$<TARGET_FILE:${HDF5_TOOL_PLUGIN_LIB_VTARGET}>"
+          "${CMAKE_BINARY_DIR}/plugins/$<TARGET_FILE_NAME:${HDF5_TOOL_PLUGIN_LIB_VTARGET}>"
+  )
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5repack/CMakeTests.cmake b/tools/test/h5repack/CMakeTests.cmake
new file mode 100644
index 0000000..04e405f
--- /dev/null
+++ b/tools/test/h5repack/CMakeTests.cmake
@@ -0,0 +1,1176 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  if (HDF5_TEST_VFD)
+    set (VFD_LIST
+        sec2
+        stdio
+        core
+        split
+        multi
+        family
+    )
+
+    if (DIRECT_VFD)
+      set (VFD_LIST ${VFD_LIST} direct)
+    endif ()
+
+    macro (ADD_VFD_TEST vfdname resultcode)
+      add_test (
+        NAME H5REPACK-VFD-${vfdname}-h5repacktest
+        COMMAND "${CMAKE_COMMAND}"
+            -D "TEST_PROGRAM=$<TARGET_FILE:h5repacktest>"
+            -D "TEST_ARGS:STRING="
+            -D "TEST_VFD:STRING=${vfdname}"
+            -D "TEST_EXPECT=${resultcode}"
+            -D "TEST_OUTPUT=h5repacktest"
+            -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+            -P "${HDF_RESOURCES_DIR}/vfdTest.cmake"
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK-VFD-${vfdname}-h5repacktest PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "H5REPACK-VFD-${vfdname}-h5repacktest")
+    endmacro ()
+  endif ()
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the source directory into the test directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr_refs.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_deflate.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_early.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_ext.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_fill.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_filters.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_fletcher.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_hlink.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layouto.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout2.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout3.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.UD.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_named_dtypes.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum_deflated.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nbit.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_objs.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_refs.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_shuffle.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_soffset.h5
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_szip.h5
+      # h5diff/testfile
+      ${HDF5_TOOLS_TEST_H5DIFF_SOURCE_DIR}/testfiles/h5diff_attr1.h5
+      # tools/testfiles
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00000.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00001.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00002.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00003.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00004.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00005.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00006.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00007.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00008.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00009.h5
+      ${HDF5_TOOLS_DIR}/testfiles/tfamily00010.h5
+      # tools/testfiles/vds
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_d.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_e.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_f.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/1_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_d.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_e.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/2_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/3_1_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/3_2_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_0.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_1.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_2.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/4_vds.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_a.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_b.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_c.h5
+      ${HDF5_TOOLS_DIR}/testfiles/vds/5_vds.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack-help.txt
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_ext.bin
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/ublock.bin
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack.info
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/deflate_limit.h5repack_layout.h5.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_filters.h5-gzip_verbose_filters.tst
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5-plugin_test.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/plugin_test.h5repack_layout.h5.tst
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/plugin_none.h5repack_layout.UD.h5.tst
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5-plugin_version_test.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/plugin_version_test.h5repack_layout.h5.tst
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/4_vds.h5-vds_compa-v.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/4_vds.h5-vds_conti-v.ddl
+      ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_layout.h5-plugin_zero.tst
+  )
+
+  foreach (h5_file ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+    get_filename_component(fname "${h5_file}" NAME)
+    HDFTEST_COPY_FILE("${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${fname}" "h5repack_files")
+  endforeach ()
+  add_custom_target(h5repack_files ALL COMMENT "Copying files needed by h5repack tests" DEPENDS ${h5repack_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_HELP_TEST testname resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5REPACK-${testname} COMMAND $<TARGET_FILE:h5repack> ${ARGN})
+      set_tests_properties (H5REPACK-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "H5REPACK-${testname}")
+    else ()
+      add_test (
+          NAME H5REPACK-h5repack-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=h5repack-${testname}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=h5repack-${testname}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_OLD testname testtype testfile)
+    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 ()
+    else ()
+      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}
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK_OLD-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5REPACK_OLD-${testname}_DFF
+          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 ()
+  endmacro ()
+
+  macro (ADD_H5_TEST testname testtype testfile)
+    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 ()
+    else ()
+      add_test (
+          NAME H5REPACK-${testname}
+          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5REPACK-${testname}_DFF
+          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 ()
+  endmacro ()
+
+  macro (ADD_H5_CMP_TEST testname testfilter testtype resultcode resultfile)
+    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 ()
+    else ()
+      # If using memchecker add tests without using scripts
+      if (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_CMP-${testname}
+            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile})
+      else ()
+        add_test (
+            NAME H5REPACK_CMP-${testname}
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
+                -D "TEST_ARGS:STRING=${ARGN};${resultfile};out-${testname}.${resultfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${resultfile}-${testname}.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_FILTER:STRING=${testfilter}"
+                -D "TEST_REFERENCE=${resultfile}-${testname}.tst"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK_CMP-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_MASK_TEST testname testtype resultcode resultfile)
+    if ("${testtype}" STREQUAL "SKIP")
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_MASK-${testname}-SKIPPED
+            COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile}"
+        )
+      endif ()
+    else ()
+      # If using memchecker add tests without using scripts
+      if (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_MASK-${testname}
+            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile})
+      else (HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_MASK-${testname}
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
+                -D "TEST_ARGS:STRING=${ARGN};${resultfile};out-${testname}.${resultfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${resultfile}-${testname}.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_MASK_ERROR=true"
+                -D "TEST_REFERENCE=${resultfile}-${testname}.tst"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK_MASK-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_DMP_TEST testname testtype resultcode resultfile)
+    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 ()
+    else ()
+      # If using memchecker add tests without using scripts
+      add_test (
+          NAME H5REPACK_DMP-${testname}
+          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile})
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK_DMP-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_DMP-h5dump-${testname}
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                -D "TEST_ARGS:STRING=-pH;out-${testname}.${resultfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${resultfile}-${testname}.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_REFERENCE=${testname}.${resultfile}.ddl"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+        set_tests_properties (H5REPACK_DMP-h5dump-${testname} PROPERTIES DEPENDS "H5REPACK_DMP-${testname}")
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_VERIFY_TEST testname testtype resultcode testfile testdset testfilter)
+    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 ()
+    else ()
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_VERIFY_LAYOUT-${testname}
+            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
+        )
+        if (NOT "${last_test}" STREQUAL "")
+          set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname} PROPERTIES DEPENDS ${last_test})
+        endif ()
+        add_test (
+            NAME H5REPACK_VERIFY_LAYOUT-${testname}_DFF
+            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")
+          add_test (
+              NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
+              COMMAND "${CMAKE_COMMAND}"
+                  -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                  -D "TEST_ARGS:STRING=-d;${testdset};-pH;out-${testname}.${testfile}"
+                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                  -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
+                  -D "TEST_EXPECT=${resultcode}"
+                  -D "TEST_FILTER:STRING=${testfilter}"
+                  -D "TEST_REFERENCE=${testfilter}"
+                  -P "${HDF_RESOURCES_EXT_DIR}/grepTest.cmake"
+          )
+          set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT-${testname}_DFF)
+        else ()
+          if ("${testfilter}" STREQUAL "CHUNKED")
+            set (nottestfilter "(CONTIGUOUS|COMPACT)")
+          endif ()
+          if ("${testfilter}" STREQUAL "CONTIGUOUS")
+            set (nottestfilter "(CHUNK|COMPACT)")
+          endif ()
+          if ("${testfilter}" STREQUAL "COMPACT")
+            set (nottestfilter "(CONTIGUOUS|CHUNK)")
+          endif ()
+          add_test (
+              NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
+              COMMAND "${CMAKE_COMMAND}"
+                  -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                  -D "TEST_ARGS:STRING=-pH;out-${testname}.${testfile}"
+                  -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                  -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
+                  -D "TEST_EXPECT=${resultcode}"
+                  -D "TEST_FILTER:STRING=${nottestfilter}"
+                  -D "TEST_REFERENCE=${testfilter}"
+                  -P "${HDF_RESOURCES_EXT_DIR}/grepTest.cmake"
+          )
+          set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT-${testname}_DFF)
+        endif ()
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_VERIFY_VDS testname testtype resultcode testfile testdset testfilter)
+    if ("${testtype}" STREQUAL "SKIP")
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_VERIFY_LAYOUT_VDS-${testname}-SKIPPED
+            COMMAND ${CMAKE_COMMAND} -E echo "SKIP -d ${testdset} -pH ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile}"
+        )
+      endif ()
+    else ()
+      if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+        add_test (
+            NAME H5REPACK_VERIFY_LAYOUT_VDS-${testname}
+            COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
+        )
+        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+        if (NOT "${last_test}" STREQUAL "")
+          set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname} PROPERTIES DEPENDS ${last_test})
+        endif ()
+        add_test (
+            NAME H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP
+            COMMAND "${CMAKE_COMMAND}"
+                -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+                -D "TEST_ARGS:STRING=-d;${testdset};-p;out-${testname}.${testfile}"
+                -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+                -D "TEST_OUTPUT=${testfile}-${testname}-v.out"
+                -D "TEST_EXPECT=${resultcode}"
+                -D "TEST_REFERENCE=${testfile}-${testname}-v.ddl"
+                -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+        )
+        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+        set_tests_properties (H5REPACK_VERIFY_LAYOUT_VDS-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT_VDS-${testname})
+      endif ()
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST_META testname testfile)
+      add_test (
+          NAME H5REPACK_META-${testname}_N
+          COMMAND $<TARGET_FILE:h5repack> ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_N.${testname}.h5
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5REPACK_META-${testname}_N PROPERTIES DEPENDS ${last_test})
+      endif ()
+      add_test (
+          NAME H5REPACK_META-${testname}_M
+          COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_M.${testname}.h5
+      )
+      set_tests_properties (H5REPACK_META-${testname}_M PROPERTIES DEPENDS H5REPACK_META-${testname}_N)
+
+      add_test (NAME H5REPACK_META-${testname} COMMAND ${CMAKE_COMMAND} -E compare_files ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_N.${testname}.h5 ${PROJECT_BINARY_DIR}/testfiles/out-${testname}_M.${testname}.h5)
+      set_tests_properties (H5REPACK_META-${testname} PROPERTIES WILL_FAIL "true")
+      set_tests_properties (H5REPACK_META-${testname} PROPERTIES DEPENDS H5REPACK_META-${testname}_M)
+  endmacro ()
+
+  macro (ADD_H5_UD_TEST testname resultcode resultfile)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      # Remove any output file left over from previous test run
+      add_test (
+          NAME H5REPACK_UD-${testname}-clearall-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+              testfiles/out-${testname}.${resultfile}
+      )
+      add_test (
+          NAME H5REPACK_UD-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5repack>"
+              -D "TEST_ARGS:STRING=${ARGN};${resultfile};out-${testname}.${resultfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_FILTER:STRING=O?...ing file[^\n]+\n"
+              -D "TEST_OUTPUT=${testname}.${resultfile}.out"
+              -D "TEST_REFERENCE=${testname}.${resultfile}.tst"
+              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5REPACK_UD-${testname} PROPERTIES DEPENDS H5REPACK_UD-${testname}-clearall-objects)
+      add_test (
+          NAME H5REPACK_UD-h5dump-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=-pH;out-${testname}.${resultfile}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}-${testname}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}-${testname}.ddl"
+              -D "TEST_ENV_VAR=HDF5_PLUGIN_PATH"
+              -D "TEST_ENV_VALUE=${CMAKE_BINARY_DIR}/plugins"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5REPACK_UD-h5dump-${testname} PROPERTIES DEPENDS "H5REPACK_UD-${testname}")
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # test file names
+  # --------------------------------------------------------------------
+  set (INFO_FILE testfiles/h5repack.info)
+
+  set (FILE0 h5repack_fill.h5)
+  set (FILE1 h5repack_objs.h5)
+  set (FILE2 h5repack_attr.h5)
+  set (FILE3 h5repack_hlink.h5)
+  set (FILE4 h5repack_layout.h5)
+  set (FILE5 h5repack_early.h5)
+  set (FILE7 h5repack_szip.h5)
+  set (FILE8 h5repack_deflate.h5)
+  set (FILE9 h5repack_shuffle.h5)
+  set (FILE10 h5repack_fletcher.h5)
+  set (FILE11 h5repack_filters.h5)
+  set (FILE12 h5repack_nbit.h5)
+  set (FILE13 h5repack_soffset.h5)
+  set (FILE14 h5repack_layouto.h5 )     # A file with an older version of the layout message (copy of test/tlayouto.h5)
+  set (FILE15 h5repack_named_dtypes.h5)
+  set (FILE16 tfamily%05d.h5)           # located in common testfiles folder
+  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
+         ./testfiles/h5dump-help.out
+         ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out
+         ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out.err
+         ./testfiles/h5repack_layout.h5-chunk_18x13-v.out
+         ./testfiles/h5repack_layout.h5-chunk_18x13-v.out.err
+         ./testfiles/h5repack_layout.h5-chunk_20x10-v.out
+         ./testfiles/h5repack_layout.h5-chunk_20x10-v.out.err
+         ./testfiles/h5repack_layout.h5-chunk_compa-v.out
+         ./testfiles/h5repack_layout.h5-chunk_compa-v.out.err
+         ./testfiles/h5repack_layout.h5-chunk_conti-v.out
+         ./testfiles/h5repack_layout.h5-chunk_conti-v.out.err
+         ./testfiles/h5repack_layout.h5-compa-v.out
+         ./testfiles/h5repack_layout.h5-compa-v.out.err
+         ./testfiles/h5repack_layout.h5-conti-v.out
+         ./testfiles/h5repack_layout.h5-conti-v.out.err
+         ./testfiles/h5repack_layout.h5-deflate_limit.out
+         ./testfiles/h5repack_layout.h5-deflate_limit.out.err
+         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-v.out
+         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-v.out.err
+         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.out
+         ./testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.out.err
+         ./testfiles/h5repack_layout.h5-dset2_compa-v.out
+         ./testfiles/h5repack_layout.h5-dset2_compa-v.out.err
+         ./testfiles/h5repack_layout.h5-dset2_conti-v.out
+         ./testfiles/h5repack_layout.h5-dset2_conti-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_compa_chunk-v.out
+         ./testfiles/h5repack_layout.h5-dset_compa_chunk-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_compa_compa-v.out
+         ./testfiles/h5repack_layout.h5-dset_compa_compa-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_compa_conti-v.out
+         ./testfiles/h5repack_layout.h5-dset_compa_conti-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_conti_chunk-v.out
+         ./testfiles/h5repack_layout.h5-dset_conti_chunk-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_conti_compa-v.out
+         ./testfiles/h5repack_layout.h5-dset_conti_compa-v.out.err
+         ./testfiles/h5repack_layout.h5-dset_conti_conti-v.out
+         ./testfiles/h5repack_layout.h5-dset_conti_conti-v.out.err
+         ./testfiles/h5repack_layout.h5-layout_long_switches-v.out
+         ./testfiles/h5repack_layout.h5-layout_long_switches-v.out.err
+         ./testfiles/h5repack_layout.h5-layout_short_switches-v.out
+         ./testfiles/h5repack_layout.h5-layout_short_switches-v.out.err
+         ./testfiles/h5repack_layout.h5-plugin_test.out
+         ./testfiles/h5repack_layout.h5-plugin_test.out.err
+         ./testfiles/h5repack_layout2.h5-contig_small_compa-v.out
+         ./testfiles/h5repack_layout2.h5-contig_small_compa-v.out.err
+         ./testfiles/h5repack_layout2.h5-contig_small_fixed_compa-v.out
+         ./testfiles/h5repack_layout2.h5-contig_small_fixed_compa-v.out.err
+         ./testfiles/h5repack_layout3.h5-ckdim_biger-v.out
+         ./testfiles/h5repack_layout3.h5-ckdim_biger-v.out.err
+         ./testfiles/h5repack_layout3.h5-ckdim_smaller-v.out
+         ./testfiles/h5repack_layout3.h5-ckdim_smaller-v.out.err
+         ./testfiles/h5repack_layout3.h5-chunk2chunk-v.out
+         ./testfiles/h5repack_layout3.h5-chunk2chunk-v.out.err
+         ./testfiles/h5repack_layout3.h5-chunk2compa-v.out
+         ./testfiles/h5repack_layout3.h5-chunk2compa-v.out.err
+         ./testfiles/h5repack_layout3.h5-chunk2conti-v.out
+         ./testfiles/h5repack_layout3.h5-chunk2conti-v.out.err
+         ./testfiles/h5repack_layout3.h5-error1-v.out
+         ./testfiles/h5repack_layout3.h5-error1-v.out.err
+         ./testfiles/h5repack_layout3.h5-error2-v.out
+         ./testfiles/h5repack_layout3.h5-error2-v.out.err
+         ./testfiles/h5repack_layout3.h5-error3-v.out
+         ./testfiles/h5repack_layout3.h5-error3-v.out.err
+         ./testfiles/out-family.tfamily%05d.h5
+         ./testfiles/out-HDFFV-7840.h5diff_attr1.h5
+         ./testfiles/out-attr.h5repack_attr.h5
+         ./testfiles/out-native_attr.h5repack_attr.h5
+         ./testfiles/out-HDFFV-5932.h5repack_attr_refs.h5
+         ./testfiles/out-deflate_copy.h5repack_deflate.h5
+         ./testfiles/out-deflate_remove.h5repack_deflate.h5
+         ./testfiles/out-early.h5repack_early.h5
+         ./testfiles/out-fill.h5repack_fill.h5
+         ./testfiles/out-native_fill.h5repack_fill.h5
+         ./testfiles/out-gzip_verbose_filters.h5repack_filters.h5
+         ./testfiles/out-fletcher_copy.h5repack_fletcher.h5
+         ./testfiles/out-fletcher_remove.h5repack_fletcher.h5
+         ./testfiles/out-hlink.h5repack_hlink.h5
+         ./testfiles/out-chunk_18x13.h5repack_layout.h5
+         ./testfiles/out-chunk_20x10.h5repack_layout.h5
+         ./testfiles/out-chunk_compa.h5repack_layout.h5
+         ./testfiles/out-chunk_conti.h5repack_layout.h5
+         ./testfiles/out-compa.h5repack_layout.h5
+         ./testfiles/out-conti.h5repack_layout.h5
+         ./testfiles/out-deflate_file.h5repack_layout.h5
+         ./testfiles/out-deflate_limit.h5repack_layout.h5
+         ./testfiles/out-dset2_chunk_20x10.h5repack_layout.h5
+         ./testfiles/out-dset2_compa.h5repack_layout.h5
+         ./testfiles/out-dset2_conti.h5repack_layout.h5
+         ./testfiles/out-dset_compa_chunk.h5repack_layout.h5
+         ./testfiles/out-dset_compa_compa.h5repack_layout.h5
+         ./testfiles/out-dset_compa_conti.h5repack_layout.h5
+         ./testfiles/out-dset_conti_chunk.h5repack_layout.h5
+         ./testfiles/out-dset_conti_compa.h5repack_layout.h5
+         ./testfiles/out-dset_conti_conti.h5repack_layout.h5
+         ./testfiles/out-fletcher_all.h5repack_layout.h5
+         ./testfiles/out-fletcher_individual.h5repack_layout.h5
+         ./testfiles/out-global_filters.h5repack_layout.h5
+         ./testfiles/out-gzip_all.h5repack_layout.h5
+         ./testfiles/out-gzip_individual.h5repack_layout.h5
+         ./testfiles/out-layout.h5repack_layout.h5
+         ./testfiles/out-layout_long_switches.h5repack_layout.h5
+         ./testfiles/out-layout_short_switches.h5repack_layout.h5
+         ./testfiles/out-old_style_layout_short_switches.h5repack_layout.h5
+         ./testfiles/out-plugin_test.h5repack_layout.h5
+         ./testfiles/out-shuffle_all.h5repack_layout.h5
+         ./testfiles/out-shuffle_individual.h5repack_layout.h5
+         ./testfiles/out-upgrade_layout.h5repack_layouto.h5
+         ./testfiles/out-contig_small_compa.h5repack_layout2.h5
+         ./testfiles/out-contig_small_fixed_compa.h5repack_layout2.h5
+         ./testfiles/out-ckdim_biger.h5repack_layout3.h5
+         ./testfiles/out-ckdim_smaller.h5repack_layout3.h5
+         ./testfiles/out-chunk2chunk.h5repack_layout3.h5
+         ./testfiles/out-chunk2compa.h5repack_layout3.h5
+         ./testfiles/out-chunk2conti.h5repack_layout3.h5
+         ./testfiles/out-error1.h5repack_layout3.h5
+         ./testfiles/out-error2.h5repack_layout3.h5
+         ./testfiles/out-error3.h5repack_layout3.h5
+         ./testfiles/out-error4.h5repack_layout3.h5
+         ./testfiles/out-committed_dt.h5repack_named_dtypes.h5
+         ./testfiles/out-nbit_add.h5repack_nbit.h5
+         ./testfiles/out-nbit_copy.h5repack_nbit.h5
+         ./testfiles/out-nbit_remove.h5repack_nbit.h5
+         ./testfiles/out-add_alignment.h5repack_objs.h5
+         ./testfiles/out-add_userblock.h5repack_objs.h5
+         ./testfiles/out-objs.h5repack_objs.h5
+         ./testfiles/out-gt_mallocsize.h5repack_objs.h5
+         ./testfiles/out-bug1814.h5repack_refs.h5
+         ./testfiles/out-shuffle_copy.h5repack_shuffle.h5
+         ./testfiles/out-shuffle_remove.h5repack_shuffle.h5
+         ./testfiles/out-scale_add.h5repack_soffset.h5
+         ./testfiles/out-scale_copy.h5repack_soffset.h5
+         ./testfiles/out-scale_remove.h5repack_soffset.h5
+         ./testfiles/out-meta_short_M.meta_short.h5
+         ./testfiles/out-meta_short_N.meta_short.h5
+         ./testfiles/out-meta_long_M.meta_long.h5
+         ./testfiles/out-meta_long_N.meta_long.h5
+         ./testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.out
+         ./testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.out.err
+         ./testfiles/2_vds.h5-vds_chunk3x6x9-v.out
+         ./testfiles/2_vds.h5-vds_chunk3x6x9-v.out.err
+         ./testfiles/3_1_vds.h5-vds_chunk2x5x8-v.out
+         ./testfiles/3_1_vds.h5-vds_chunk2x5x8-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_conti-v.out
+         ./testfiles/4_vds.h5-vds_conti-v.out.err
+         ./testfiles/out-vds_compa.4_vds.h5
+         ./testfiles/out-vds_conti.4_vds.h5
+         ./testfiles/out-vds_chunk2x5x8.3_1_vds.h5
+         ./testfiles/out-vds_chunk3x6x9.2_vds.h5
+         ./testfiles/out-vds_dset_chunk20x10x5.1_vds.h5
+         h5repack_attr.h5
+         h5repack_attr_out.h5
+         h5repack_attr_refs.h5
+         h5repack_big.h5
+         h5repack_deflate.h5
+         h5repack_deflate_out.h5
+         h5repack_early2.h5
+         h5repack_early.h5
+         h5repack_early_out.h5
+         h5repack_ext.h5
+         h5repack_ext_out.h5
+         h5repack_fill.h5
+         h5repack_fill_out.h5
+         h5repack_filters.h5
+         h5repack_filters_out.h5
+         h5repack_fletcher.h5
+         h5repack_fletcher_out.h5
+         h5repack_hlink.h5
+         h5repack_hlink_out.h5
+         h5repack_layout.h5
+         h5repack_layout_out.h5
+         h5repack_layout2.h5
+         h5repack_layout3.h5
+         h5repack_named_dtypes.h5
+         h5repack_named_dtypes_out.h5
+         h5repack_nbit.h5
+         h5repack_nbit_out.h5
+         h5repack_objs.h5
+         h5repack_objs_out.h5
+         h5repack_refs.h5
+         h5repack_shuffle.h5
+         h5repack_shuffle_out.h5
+         h5repack_soffset.h5
+         h5repack_soffset_out.h5
+         h5repack_szip.h5
+         h5repack_szip_out.h5
+         h5repack_ub.h5
+         h5repack_ub_out.h5
+         h5repack_ext.bin
+         ublock.bin
+  )
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (H5REPACK-clearall-objects PROPERTIES DEPENDS ${last_test})
+  endif ()
+
+  ADD_HELP_TEST(help 0 -h)
+
+  add_test (NAME H5REPACK-testh5repack_detect_szip COMMAND $<TARGET_FILE:testh5repack_detect_szip>)
+  if (HDF5_ENABLE_SZIP_SUPPORT)
+    if (HDF5_ENABLE_SZIP_ENCODING)
+      set (passRegex "yes")
+      set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "yes")
+    else ()
+      set (passRegex "no")
+      set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "no")
+    endif ()
+  else ()
+    set (passRegex "no")
+    set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES PASS_REGULAR_EXPRESSION "no")
+  endif ()
+  set_tests_properties (H5REPACK-testh5repack_detect_szip PROPERTIES DEPENDS H5REPACK-clearall-objects)
+
+  add_test (NAME H5REPACK-h5repacktest COMMAND $<TARGET_FILE:h5repacktest>)
+  set_tests_properties (H5REPACK-h5repacktest PROPERTIES DEPENDS H5REPACK-testh5repack_detect_szip)
+  set (last_test "H5REPACK-h5repacktest")
+
+#
+# The tests
+# We use the files generated by h5repacktst
+# 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
+#
+
+# 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.
+  set (USE_FILTER_SZIP_ENCODER "no")
+  if (HDF5_ENABLE_SZIP_ENCODING)
+    set (USE_FILTER_SZIP_ENCODER ${testh5repack_detect_szip})
+  endif ()
+
+  if (H5_HAVE_FILTER_DEFLATE)
+    set (USE_FILTER_DEFLATE "true")
+  endif ()
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif ()
+
+# 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})
+  ADD_H5_TEST (hlink "TEST" ${FILE3})
+  ADD_H5_TEST (layout "TEST" ${FILE4})
+  ADD_H5_TEST (early "TEST" ${FILE5})
+
+# nested 8bit enum in both deflated and non-deflated datafiles
+  if (NOT USE_FILTER_DEFLATE)
+    ADD_H5_TEST (nested_8bit_enum "TEST" h5repack_nested_8bit_enum.h5)
+  else ()
+    ADD_H5_TEST (nested_8bit_enum "TEST" h5repack_nested_8bit_enum_deflated.h5)
+  endif ()
+
+# use $FILE4 to write some filters  (this file has  no filters)
+
+# gzip with individual object
+  set (arg ${FILE4} -f dset1:GZIP=1  -l dset1:CHUNK=20x10)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (gzip_individual ${TESTTYPE} ${arg})
+
+# gzip for all
+  set (arg ${FILE4} -f GZIP=1)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (gzip_all ${TESTTYPE} ${arg})
+
+# szip with individual object
+  set (arg ${FILE4} -f dset2:SZIP=8,EC  -l dset2:CHUNK=20x10)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (szip_individual ${TESTTYPE} ${arg})
+
+# szip for all
+  set (arg ${FILE4} -f SZIP=8,NN)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
+    set (TESTTYPE "SKIP")
+  endif ()
+  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})
+
+# 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})
+
+# fletcher32 for all
+  set (arg ${FILE4} -f FLET)
+  ADD_H5_TEST (fletcher_all "TEST" ${arg})
+
+# all filters
+  set (arg ${FILE4} -f dset2:SHUF -f dset2:FLET -f dset2:SZIP=8,NN -f dset2:GZIP=1 -l dset2:CHUNK=20x10)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (all_filters ${TESTTYPE} ${arg})
+
+# verbose gzip with individual object
+  set (arg ${FILE11} -v -f /dset_deflate:GZIP=9)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_CMP_TEST (gzip_verbose_filters "O?...ing file[^\n]+\n" ${TESTTYPE} 0 ${arg})
+
+###########################################################
+# the following tests assume the input files have filters
+###########################################################
+
+# szip copy
+  set (arg ${FILE7})
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (szip_copy ${TESTTYPE} ${arg})
+
+# szip remove
+  set (arg ${FILE7} --filter=dset_szip:NONE)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (szip_remove ${TESTTYPE} ${arg})
+
+# deflate copy
+  set (arg ${FILE8})
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (deflate_copy ${TESTTYPE} ${arg})
+
+# deflate remove
+  set (arg ${FILE8} -f dset_deflate:NONE)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (deflate_remove ${TESTTYPE} ${arg})
+
+# shuffle copy
+  set (arg ${FILE9})
+  ADD_H5_TEST (shuffle_copy "TEST" ${arg})
+
+# shuffle remove
+  set (arg ${FILE9} -f dset_shuffle:NONE)
+  ADD_H5_TEST (shuffle_remove "TEST" ${arg})
+
+# fletcher32 copy
+  set (arg ${FILE10})
+  ADD_H5_TEST (fletcher_copy "TEST" ${arg})
+
+# fletcher32 remove
+  set (arg ${FILE10} -f dset_fletcher32:NONE)
+  ADD_H5_TEST (fletcher_remove "TEST" ${arg})
+
+# nbit copy
+  set (arg ${FILE12})
+  ADD_H5_TEST (nbit_copy "TEST" ${arg})
+
+# nbit remove
+  set (arg ${FILE12} -f dset_nbit:NONE)
+  ADD_H5_TEST (nbit_remove "TEST" ${arg})
+
+# nbit add
+  set (arg ${FILE12} -f dset_int31:NBIT)
+  ADD_H5_TEST (nbit_add "TEST" ${arg})
+
+# scaleoffset copy
+  set (arg ${FILE13})
+  ADD_H5_TEST (scale_copy "TEST" ${arg})
+
+# scaleoffset add
+  set (arg ${FILE13} -f dset_none:SOFF=31,IN)
+  ADD_H5_TEST (scale_add "TEST" ${arg})
+
+# scaleoffset remove
+  set (arg ${FILE13} -f dset_scaleoffset:NONE)
+  ADD_H5_TEST (scale_remove "TEST" ${arg})
+
+# remove all  filters
+  set (arg ${FILE11} -f NONE)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_SZIP_ENCODER)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (remove_all ${TESTTYPE} ${arg})
+
+#filter conversions
+  set (arg ${FILE8} -f dset_deflate:SZIP=8,NN)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  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 ()
+  ADD_H5_TEST (szip_convert ${TESTTYPE} ${arg})
+
+#limit
+  set (arg ${FILE4} -f GZIP=1 -m 1024)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_DMP_TEST (deflate_limit ${TESTTYPE} 0 ${arg})
+
+#file
+  set (arg ${FILE4} -e ${INFO_FILE})
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (deflate_file ${TESTTYPE} ${arg})
+
+#########################################################
+# layout options (these files have no filters)
+#########################################################
+  ADD_H5_VERIFY_TEST (dset2_chunk_20x10 "TEST" 0 ${FILE4} dset2 CHUNKED --layout=dset2:CHUNK=20x10)
+  ADD_H5_VERIFY_TEST (chunk_20x10 "TEST" 1 ${FILE4} null CHUNKED -l CHUNK=20x10)
+  ADD_H5_VERIFY_TEST (dset2_conti "TEST" 0 ${FILE4} dset2 CONTIGUOUS -l dset2:CONTI)
+  ADD_H5_VERIFY_TEST (conti "TEST" 1 ${FILE4} null CONTIGUOUS -l CONTI)
+  ADD_H5_VERIFY_TEST (dset2_compa "TEST" 0 ${FILE4} dset2 COMPACT -l dset2:COMPA)
+  ADD_H5_VERIFY_TEST (compa "TEST" 1 ${FILE4} null COMPACT -l COMPA)
+  ADD_H5_MASK_TEST (dset2_chunk_20x10-errstk "TEST" 0 ${FILE4} --layout=dset2:CHUNK=20x10x5 --enable-error-stack)
+
+################################################################
+# layout conversions (file has no filters)
+###############################################################
+  ADD_H5_VERIFY_TEST (dset_compa_conti "TEST" 0 ${FILE4} dset_compact CONTIGUOUS -l dset_compact:CONTI)
+  ADD_H5_VERIFY_TEST (dset_compa_chunk "TEST" 0 ${FILE4} dset_compact CHUNKED -l dset_compact:CHUNK=2x5)
+  ADD_H5_VERIFY_TEST (dset_compa_compa "TEST" 0 ${FILE4} dset_compact COMPACT -l dset_compact:COMPA)
+  ADD_H5_VERIFY_TEST (dset_conti_compa "TEST" 0 ${FILE4} dset_contiguous COMPACT -l dset_contiguous:COMPA)
+  ADD_H5_VERIFY_TEST (dset_conti_chunk "TEST" 0 ${FILE4} dset_contiguous CHUNKED -l dset_contiguous:CHUNK=3x6)
+  ADD_H5_VERIFY_TEST (dset_conti_conti "TEST" 0 ${FILE4} dset_contiguous CONTIGUOUS -l dset_contiguous:CONTI)
+  ADD_H5_VERIFY_TEST (chunk_compa "TEST" 0 ${FILE4} dset_chunk COMPACT -l dset_chunk:COMPA)
+  ADD_H5_VERIFY_TEST (chunk_conti "TEST" 0 ${FILE4} dset_chunk CONTIGUOUS -l dset_chunk:CONTI)
+  ADD_H5_VERIFY_TEST (chunk_18x13 "TEST" 0 ${FILE4} dset_chunk CHUNKED -l dset_chunk:CHUNK=18x13)
+
+# test convert small size dataset ( < 1k) to compact layout without -m
+  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
+# 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
+  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,
+# should remain as original layout (chunk)
+  ADD_H5_VERIFY_TEST (chunk2compa "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA)
+
+#--------------------------------------------------------------------------
+# Test -f for some specific cases. Chunked dataset with unlimited max dims.
+# (HDFFV-8012)
+#--------------------------------------------------------------------------
+# - should not fail
+# - should not change max dims from unlimit
+
+# chunk dim is bigger than dataset dim. ( dset size < 64k )
+  ADD_H5_VERIFY_TEST (error1 "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 H5S_UNLIMITED -f chunk_unlimit1:NONE)
+
+# chunk dim is bigger than dataset dim. ( dset size > 64k )
+  ADD_H5_VERIFY_TEST (error2 "TEST" 0 h5repack_layout3.h5 chunk_unlimit2 H5S_UNLIMITED -f chunk_unlimit2:NONE)
+
+# chunk dims are smaller than dataset dims. ( dset size < 64k )
+  ADD_H5_VERIFY_TEST (error3 "TEST" 0 h5repack_layout3.h5 chunk_unlimit3 H5S_UNLIMITED -f chunk_unlimit3:NONE)
+
+# file input - should not fail
+  ADD_H5_TEST (error4 "TEST" h5repack_layout3.h5 -f NONE)
+
+#--------------------------------------------------------------------------
+# 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.
+  ADD_H5_VERIFY_TEST (ckdim_smaller "TEST" 0 h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI)
+
+
+
+# Native option
+# Do not use FILE1, as the named dtype will be converted to native, and h5diff will
+# report a difference.
+  ADD_H5_TEST (native_fill "TEST" ${FILE0} -n)
+  ADD_H5_TEST (native_attr "TEST" ${FILE2} -n)
+
+# latest file format with long switches. use FILE4=h5repack_layout.h5 (no filters)
+  set (arg --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype])
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_TEST (layout_long_switches ${TESTTYPE} 1 ${FILE4} null CHUNKED ${arg})
+
+# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
+  set (arg -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype])
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_TEST (layout_short_switches ${TESTTYPE} 1 ${FILE4} null CHUNKED ${arg})
+
+# several global filters
+  set (arg ${FILE4} --filter GZIP=1 --filter SHUF)
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (global_filters ${TESTTYPE} ${arg})
+
+# syntax of -i infile -o outfile
+# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
+  set (arg ${FILE4} -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype])
+  set (TESTTYPE "LEGACY")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST_OLD (old_style_layout_short_switches ${TESTTYPE} ${arg})
+
+# add a userblock to file
+  set (arg ${FILE1} -u ${PROJECT_BINARY_DIR}/testfiles/ublock.bin -b 2048)
+  ADD_H5_TEST (add_userblock "TEST" ${arg})
+
+# add alignment
+  set (arg ${FILE1} -t 1 -a 1)
+  ADD_H5_TEST (add_alignment "TEST" ${arg})
+
+# Check repacking file with old version of layout message (should get upgraded
+# to new version and be readable, etc.)
+  ADD_H5_TEST (upgrade_layout "TEST" ${FILE14})
+
+# test for datum size > H5TOOLS_MALLOCSIZE
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_TEST (gt_mallocsize ${TESTTYPE} ${FILE1} -f GZIP=1)
+
+# Check repacking file with committed datatypes in odd configurations
+  ADD_H5_TEST (committed_dt "TEST" ${FILE15})
+
+# tests family driver (file is located in common testfiles folder, uses TOOLTEST1
+  ADD_H5_TEST (family "TEST" ${FILE16})
+
+# test various references (bug 1814 and 1726)
+  ADD_H5_TEST (bug1814 "TEST" ${FILE_REF})
+
+# test attribute with various references (bug1797 / HDFFV-5932)
+# 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
+# 2. leak from compound type without reference member
+# (HDFFV-7840, )
+# Note: this test is experimental for sharing test file among tools
+  ADD_H5_TEST (HDFFV-7840 "TEST" h5diff_attr1.h5)
+
+# tests for metadata block size option ('-M')
+  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 conversions
+###############################################################
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_VDS (vds_dset_chunk20x10x5 ${TESTTYPE} 0 ${FILEV1} vds_dset CHUNKED -l vds_dset:CHUNK=20x10x5)
+
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_VDS (vds_chunk2x5x8 ${TESTTYPE} 0 ${FILEV3_1} vds_dset CHUNKED -l vds_dset:CHUNK=2x5x8)
+
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_VDS (vds_chunk3x6x9 ${TESTTYPE} 0 ${FILEV2} vds_dset CHUNKED -l vds_dset:CHUNK=3x6x9)
+
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_VDS (vds_compa ${TESTTYPE} 0 ${FILEV4} vds_dset COMPACT -l vds_dset:COMPA)
+
+  set (TESTTYPE "TEST")
+  if (NOT USE_FILTER_DEFLATE)
+    set (TESTTYPE "SKIP")
+  endif ()
+  ADD_H5_VERIFY_VDS (vds_conti ${TESTTYPE} 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
+
+##############################################################################
+###    P L U G I N  T E S T S
+##############################################################################
+  ADD_H5_UD_TEST (plugin_version_test 0 h5repack_layout.h5 -v -f UD=260,4,9,${H5_VERS_MAJOR},${H5_VERS_MINOR},${H5_VERS_RELEASE})
+  ADD_H5_UD_TEST (plugin_test 0 h5repack_layout.h5 -v -f UD=257,1,9)
+  ADD_H5_UD_TEST (plugin_none 0 h5repack_layout.UD.h5 -v -f NONE)
+  # check for no parameters
+  set (TESTRETVAL 255)
+  if (WIN32)
+    set (TESTRETVAL -1)
+  endif ()
+  ADD_H5_CMP_TEST (plugin_zero "" "TEST" ${TESTRETVAL} h5repack_layout.h5 -v -f UD=250,0)
+
+  if (HDF5_TEST_VFD)
+    # Run test with different Virtual File Driver
+    foreach (vfd ${VFD_LIST})
+      ADD_VFD_TEST (${vfd} 0)
+    endforeach ()
+  endif ()
diff --git a/tools/test/h5repack/Makefile.am b/tools/test/h5repack/Makefile.am
new file mode 100644
index 0000000..a15d6bb
--- /dev/null
+++ b/tools/test/h5repack/Makefile.am
@@ -0,0 +1,68 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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, test, and tools/lib directories
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib -I$(top_srcdir)/tools/src/h5repack
+
+# Test programs and scripts
+TEST_SCRIPT=h5repack.sh
+
+noinst_PROGRAMS=h5repacktst testh5repack_detect_szip
+
+SCRIPT_DEPEND=../../src/h5repack/h5repack$(EXEEXT) h5repacktst$(EXEEXT)
+if HAVE_SHARED_CONDITIONAL
+if USE_PLUGINS_CONDITIONAL
+   TEST_SCRIPT += h5repack_plugin.sh
+endif
+endif
+
+check_SCRIPTS=$(TEST_SCRIPT)
+
+# Depend on the h5repack library, the hdf5 library, the tools library, the test library
+LDADD=../../src/h5repack/libh5repack.la $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+
+testh5repack_detect_szip_SOURCES=testh5repack_detect_szip.c
+
+h5repacktst_SOURCES=h5repacktst.c 
+
+
+if HAVE_SHARED_CONDITIONAL
+  # Build it as shared library if configure is enabled for shared library.
+  dyn_LTLIBRARIES=libdynlibadd.la libdynlibvers.la
+  libdynlibadd_la_SOURCES=dynlib_rpk.c
+  libdynlibvers_la_SOURCES=dynlib_vrpk.c
+  libdynlibadd_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+  libdynlibvers_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+
+libdynlibadd.la: $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_DEPENDENCIES) $(EXTRA_libdynlibadd_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlibadd_la_LINK) $(am_libdynlibadd_la_rpath) $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_LIBADD) 
+libdynlibvers.la: $(libdynlibvers_la_OBJECTS) $(libdynlibvers_la_DEPENDENCIES) $(EXTRA_libdynlibvers_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(libdynlibvers_la_LINK) $(am_libdynlibvers_la_rpath) $(libdynlibvers_la_OBJECTS) $(libdynlibvers_la_LIBADD) 
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+endif
+
+# Temporary files.  *.h5 are generated by h5repack.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES+=*.h5 *.bin testfiles/h5diff_attr1.h5 testfiles/tfamily*.h5
+DISTCLEANFILES=h5repack.sh h5repack_plugin.sh
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5repack/Makefile.in b/tools/test/h5repack/Makefile.in
new file mode 100644
index 0000000..a964a71
--- /dev/null
+++ b/tools/test/h5repack/Makefile.in
@@ -0,0 +1,1529 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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@
+noinst_PROGRAMS = h5repacktst$(EXEEXT) \
+	testh5repack_detect_szip$(EXEEXT)
+ at HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5repack_plugin.sh
+TESTS = $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = h5repack.sh h5repack_plugin.sh
+CONFIG_CLEAN_VPATH_FILES =
+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__installdirs = "$(DESTDIR)$(dyndir)"
+LTLIBRARIES = $(dyn_LTLIBRARIES)
+libdynlibadd_la_LIBADD =
+am__libdynlibadd_la_SOURCES_DIST = dynlib_rpk.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibadd_la_OBJECTS =  \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_rpk.lo
+libdynlibadd_la_OBJECTS = $(am_libdynlibadd_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 = 
+libdynlibadd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libdynlibadd_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibadd_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+libdynlibvers_la_LIBADD =
+am__libdynlibvers_la_SOURCES_DIST = dynlib_vrpk.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibvers_la_OBJECTS =  \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	dynlib_vrpk.lo
+libdynlibvers_la_OBJECTS = $(am_libdynlibvers_la_OBJECTS)
+libdynlibvers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(libdynlibvers_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+ at HAVE_SHARED_CONDITIONAL_TRUE@am_libdynlibvers_la_rpath = -rpath \
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(dyndir)
+PROGRAMS = $(noinst_PROGRAMS)
+am_h5repacktst_OBJECTS = h5repacktst.$(OBJEXT)
+h5repacktst_OBJECTS = $(am_h5repacktst_OBJECTS)
+h5repacktst_LDADD = $(LDADD)
+h5repacktst_DEPENDENCIES = ../../src/h5repack/libh5repack.la \
+	$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+am_testh5repack_detect_szip_OBJECTS =  \
+	testh5repack_detect_szip.$(OBJEXT)
+testh5repack_detect_szip_OBJECTS =  \
+	$(am_testh5repack_detect_szip_OBJECTS)
+testh5repack_detect_szip_LDADD = $(LDADD)
+testh5repack_detect_szip_DEPENDENCIES =  \
+	../../src/h5repack/libh5repack.la $(LIBH5TOOLS) $(LIBH5TEST) \
+	$(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 = $(libdynlibadd_la_SOURCES) $(libdynlibvers_la_SOURCES) \
+	$(h5repacktst_SOURCES) $(testh5repack_detect_szip_SOURCES)
+DIST_SOURCES = $(am__libdynlibadd_la_SOURCES_DIST) \
+	$(am__libdynlibvers_la_SOURCES_DIST) $(h5repacktst_SOURCES) \
+	$(testh5repack_detect_szip_SOURCES)
+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__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)/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@
+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, test, and tools/lib directories
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/test -I$(top_srcdir)/tools/lib \
+	-I$(top_srcdir)/tools/src/h5repack
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.
+
+#install-exec-hook:
+#	$(RM) $(DESTDIR)$(dyndir)/*dynlib*
+
+# Temporary files.  *.h5 are generated by h5repack.  They should
+# copied to the testfiles/ directory if update is required.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.bin \
+	testfiles/h5diff_attr1.h5 testfiles/tfamily*.h5
+
+# Test programs and scripts
+TEST_SCRIPT = h5repack.sh $(am__append_1)
+SCRIPT_DEPEND = ../../src/h5repack/h5repack$(EXEEXT) h5repacktst$(EXEEXT)
+check_SCRIPTS = $(TEST_SCRIPT)
+
+# Depend on the h5repack library, the hdf5 library, the tools library, the test library
+LDADD = ../../src/h5repack/libh5repack.la $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+testh5repack_detect_szip_SOURCES = testh5repack_detect_szip.c
+h5repacktst_SOURCES = h5repacktst.c 
+ at HAVE_SHARED_CONDITIONAL_TRUE@dyn_LTLIBRARIES = libdynlibadd.la libdynlibvers.la
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibadd_la_SOURCES = dynlib_rpk.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibvers_la_SOURCES = dynlib_vrpk.c
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibadd_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibvers_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
+DISTCLEANFILES = h5repack.sh h5repack_plugin.sh
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5repack/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5repack/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):
+h5repack.sh: $(top_builddir)/config.status $(srcdir)/h5repack.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+h5repack_plugin.sh: $(top_builddir)/config.status $(srcdir)/h5repack_plugin.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-dynLTLIBRARIES: $(dyn_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dyndir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dyndir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dyndir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dyndir)"; \
+	}
+
+uninstall-dynLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dyn_LTLIBRARIES)'; test -n "$(dyndir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dyndir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dyndir)/$$f"; \
+	done
+
+clean-dynLTLIBRARIES:
+	-test -z "$(dyn_LTLIBRARIES)" || rm -f $(dyn_LTLIBRARIES)
+	@list='$(dyn_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlibadd.la: $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_DEPENDENCIES) $(EXTRA_libdynlibadd_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlibadd_la_LINK) $(am_libdynlibadd_la_rpath) $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_LIBADD) $(LIBS)
+
+ at HAVE_SHARED_CONDITIONAL_FALSE@libdynlibvers.la: $(libdynlibvers_la_OBJECTS) $(libdynlibvers_la_DEPENDENCIES) $(EXTRA_libdynlibvers_la_DEPENDENCIES) 
+ at HAVE_SHARED_CONDITIONAL_FALSE@	$(AM_V_CCLD)$(libdynlibvers_la_LINK) $(am_libdynlibvers_la_rpath) $(libdynlibvers_la_OBJECTS) $(libdynlibvers_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
+
+h5repacktst$(EXEEXT): $(h5repacktst_OBJECTS) $(h5repacktst_DEPENDENCIES) $(EXTRA_h5repacktst_DEPENDENCIES) 
+	@rm -f h5repacktst$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5repacktst_OBJECTS) $(h5repacktst_LDADD) $(LIBS)
+
+testh5repack_detect_szip$(EXEEXT): $(testh5repack_detect_szip_OBJECTS) $(testh5repack_detect_szip_DEPENDENCIES) $(EXTRA_testh5repack_detect_szip_DEPENDENCIES) 
+	@rm -f testh5repack_detect_szip$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(testh5repack_detect_szip_OBJECTS) $(testh5repack_detect_szip_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_rpk.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib_vrpk.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repacktst.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/testh5repack_detect_szip.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $(LTLIBRARIES) $(PROGRAMS) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(dyndir)"; 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-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+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: uninstall-dynLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
+	check-am clean clean-dynLTLIBRARIES 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-data \
+	install-data-am install-dvi install-dvi-am \
+	install-dynLTLIBRARIES 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-dynLTLIBRARIES
+
+.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
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
+
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibadd.la: $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_DEPENDENCIES) $(EXTRA_libdynlibadd_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlibadd_la_LINK) $(am_libdynlibadd_la_rpath) $(libdynlibadd_la_OBJECTS) $(libdynlibadd_la_LIBADD) 
+ at HAVE_SHARED_CONDITIONAL_TRUE@libdynlibvers.la: $(libdynlibvers_la_OBJECTS) $(libdynlibvers_la_DEPENDENCIES) $(EXTRA_libdynlibvers_la_DEPENDENCIES)
+ at HAVE_SHARED_CONDITIONAL_TRUE@	$(AM_V_CCLD)$(libdynlibvers_la_LINK) $(am_libdynlibvers_la_rpath) $(libdynlibvers_la_OBJECTS) $(libdynlibvers_la_LIBADD) 
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-dyn: $(DYN)
+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 dyn 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/test/h5repack/dynlib_rpk.c b/tools/test/h5repack/dynlib_rpk.c
new file mode 100644
index 0000000..29c3eae
--- /dev/null
+++ b/tools/test/h5repack/dynlib_rpk.c
@@ -0,0 +1,95 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Programmer:    Raymond Lu
+ *        13 February 2013
+ *
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIB1      257
+
+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);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_DYNLIB1[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIB1,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlib1",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (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;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlib1
+ *
+ * Purpose:    A dynlib1 filter method that adds on and subtract from
+ *              the original value with another value.  It will be built
+ *              as a shared library.  plugin.c test will load and use
+ *              this filter library.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *
+ * Programmer:    Raymond Lu
+ *              29 March 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+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)
+{
+    int *int_ptr = (int *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+    int add_on = 0;
+
+    /* Check for the correct number of parameters */
+    if(cd_nelmts == 0)
+        return 0;
+
+    /* Check that permanent parameters are set correctly */
+    if(cd_values[0] > 9)
+        return 0;
+
+    add_on = (int)cd_values[0];
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Substract the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ -= add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ += add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlib1() */
+
diff --git a/tools/test/h5repack/dynlib_vrpk.c b/tools/test/h5repack/dynlib_vrpk.c
new file mode 100644
index 0000000..06d90ff
--- /dev/null
+++ b/tools/test/h5repack/dynlib_vrpk.c
@@ -0,0 +1,102 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*
+ * Purpose:    Tests the plugin module (H5PL)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "H5PLextern.h"
+
+#define H5Z_FILTER_DYNLIB4      260
+
+#define PUSH_ERR(func, minor, str) H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, H5E_ERR_CLS, H5E_PLUGIN, minor, str)
+
+static size_t H5Z_filter_dynlib4(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_DYNLIB4[1] = {{
+    H5Z_CLASS_T_VERS,                /* H5Z_class_t version             */
+    H5Z_FILTER_DYNLIB4,             /* Filter id number        */
+    1, 1,                            /* Encoding and decoding enabled   */
+    "dynlib4",                 /* Filter name for debugging    */
+    NULL,                            /* The "can apply" callback        */
+    NULL,                            /* The "set local" callback        */
+    (H5Z_func_t)H5Z_filter_dynlib4,    /* The actual filter function    */
+}};
+
+H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+const void    *H5PLget_plugin_info(void) {return H5Z_DYNLIB4;}
+
+/*-------------------------------------------------------------------------
+ * Function:    H5Z_filter_dynlib4
+ *
+ * Purpose:    A dynlib4 filter method that adds on and subtract from
+ *              the original value with another value.  It will be built
+ *              as a shared library.  plugin.c test will load and use
+ *              this filter library. Designed to call a HDF function.
+ *
+ * Return:    Success:    Data chunk size
+ *
+ *        Failure:    0
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5Z_filter_dynlib4(unsigned int flags, size_t cd_nelmts,
+      const unsigned int *cd_values, size_t nbytes,
+      size_t *buf_size, void **buf)
+{
+    int *int_ptr = (int *)*buf;          /* Pointer to the data values */
+    size_t buf_left = *buf_size;  /* Amount of data buffer left to process */
+    int add_on = 0;
+    unsigned ver_info[3];
+
+    /* Check for the library version */
+    if(H5get_libversion(&ver_info[0], &ver_info[1], &ver_info[2]) < 0) {
+        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion");
+        return(0);
+    }
+    /* Check for the correct number of parameters */
+    if(cd_nelmts == 0)
+        return(0);
+
+    /* Check that permanent parameters are set correctly */
+    if(cd_values[0] > 9)
+        return(0);
+
+    if(ver_info[0] != cd_values[1] || ver_info[1] != cd_values[2]) {
+        PUSH_ERR("dynlib4", H5E_CALLBACK, "H5get_libversion does not match");
+        return(0);
+    }
+
+    add_on = (int)cd_values[0];
+
+    if(flags & H5Z_FLAG_REVERSE) { /*read*/
+        /* Substract the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ -= add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end if */
+    else { /*write*/
+        /* Add the "add on" value to all the data values */
+        while(buf_left > 0) {
+            *int_ptr++ += add_on;
+            buf_left -= sizeof(int);
+        } /* end while */
+    } /* end else */
+
+    return nbytes;
+} /* end H5Z_filter_dynlib4() */
+
diff --git a/tools/test/h5repack/h5repack.sh.in b/tools/test/h5repack/h5repack.sh.in
new file mode 100644
index 0000000..c943b22
--- /dev/null
+++ b/tools/test/h5repack/h5repack.sh.in
@@ -0,0 +1,1263 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5repack tool
+#
+# Modification:
+#  Pedro Vicente Nunes, 11/15/2006
+#  Added $FILEN variables for file names
+#
+
+srcdir=@srcdir@
+
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5repack
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5REPACK=../../src/h5repack/h5repack    # The tool name
+H5REPACK_BIN=`pwd`/$H5REPACK            # The path of the tool binary
+
+H5DIFF=../../src/h5diff/h5diff          # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF                # The path of the h5diff tool binary
+
+H5DUMP=../../src/h5dump/h5dump          # The h5dump tool name
+H5DUMP_BIN=`pwd`/$H5DUMP                # The path of the h5dump tool binary
+
+RM='rm -rf'
+CMP='cmp'
+DIFF='diff -c'
+GREP='grep'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+H5DETECTSZIP=testh5repack_detect_szip
+H5DETECTSZIP_BIN=`pwd`/$H5DETECTSZIP
+
+
+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/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testpack
+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_H5REPACK_TESTFILES/h5repack_attr.h5
+$SRC_H5REPACK_TESTFILES/h5repack_attr_refs.h5
+$SRC_H5REPACK_TESTFILES/h5repack_deflate.h5
+$SRC_H5REPACK_TESTFILES/h5repack_early.h5
+$SRC_H5REPACK_TESTFILES/h5repack_ext.h5
+$SRC_H5REPACK_TESTFILES/h5repack_fill.h5
+$SRC_H5REPACK_TESTFILES/h5repack_filters.h5
+$SRC_H5REPACK_TESTFILES/h5repack_fletcher.h5
+$SRC_H5REPACK_TESTFILES/h5repack_hlink.h5
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5
+$SRC_H5REPACK_TESTFILES/h5repack_layouto.h5
+$SRC_H5REPACK_TESTFILES/h5repack_layout2.h5
+$SRC_H5REPACK_TESTFILES/h5repack_layout3.h5
+$SRC_H5REPACK_TESTFILES/h5repack_named_dtypes.h5
+$SRC_H5REPACK_TESTFILES/h5repack_nested_8bit_enum.h5
+$SRC_H5REPACK_TESTFILES/h5repack_nested_8bit_enum_deflated.h5
+$SRC_H5REPACK_TESTFILES/h5repack_nbit.h5
+$SRC_H5REPACK_TESTFILES/h5repack_objs.h5
+$SRC_H5REPACK_TESTFILES/h5repack_refs.h5
+$SRC_H5REPACK_TESTFILES/h5repack_shuffle.h5
+$SRC_H5REPACK_TESTFILES/h5repack_soffset.h5
+$SRC_H5REPACK_TESTFILES/h5repack_szip.h5
+$SRC_H5DIFF_TESTFILES/h5diff_attr1.h5
+$SRC_TOOLS_TESTFILES/tfamily00000.h5
+$SRC_TOOLS_TESTFILES/tfamily00001.h5
+$SRC_TOOLS_TESTFILES/tfamily00002.h5
+$SRC_TOOLS_TESTFILES/tfamily00003.h5
+$SRC_TOOLS_TESTFILES/tfamily00004.h5
+$SRC_TOOLS_TESTFILES/tfamily00005.h5
+$SRC_TOOLS_TESTFILES/tfamily00006.h5
+$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="
+$SRC_H5REPACK_TESTFILES/h5repack-help.txt
+$SRC_H5REPACK_TESTFILES/h5repack_ext.bin
+$SRC_H5REPACK_TESTFILES/ublock.bin
+$SRC_H5REPACK_TESTFILES/h5repack.info
+$SRC_H5REPACK_TESTFILES/deflate_limit.h5repack_layout.h5.ddl
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5.ddl
+$SRC_H5REPACK_TESTFILES/h5repack_filters.h5-gzip_verbose_filters.tst
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-plugin_test.ddl
+$SRC_H5REPACK_TESTFILES/plugin_test.h5repack_layout.h5.tst
+$SRC_H5REPACK_TESTFILES/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
+$SRC_H5REPACK_TESTFILES/2_vds.h5-vds_chunk3x6x9-v.ddl
+$SRC_H5REPACK_TESTFILES/3_1_vds.h5-vds_chunk2x5x8-v.ddl
+$SRC_H5REPACK_TESTFILES/4_vds.h5-vds_compa-v.ddl
+$SRC_H5REPACK_TESTFILES/4_vds.h5-vds_conti-v.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=$SRC_H5REPACK_TESTFILES
+    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 $* message left justified in a field of 70 characters
+#
+MESSAGE() {
+   SPACES="                                                               "
+   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+    MESSAGE "Testing $*"
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY() {
+    MESSAGE "Verifying $*"
+}
+
+# Print a message that a test has been skipped (because a required filter
+# was unavailable)
+SKIP() {
+    TESTING $H5REPACK $@
+    echo " -SKIP-"
+}
+
+# Call the h5diff tool
+#
+DIFFTEST()
+{
+    VERIFY h5diff output $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5DIFF_BIN -q  "$@"
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+
+}
+
+# Call h5repack
+#
+
+
+# call TOOLTEST_MAIN and delete $output file
+TOOLTEST()
+{
+    echo $@
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+    rm -f $outfile
+}
+
+#------------------------------------------
+# Verifying layouts of a dataset
+VERIFY_LAYOUT_DSET()
+{
+    layoutfile=layout-$1.$2
+    dset=$3
+    expectlayout=$4
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+    shift
+    shift
+
+    TESTING  $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+
+    #---------------------------------
+    # check the layout from a dataset
+    VERIFY  "a dataset layout"
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5DUMP_BIN -d $dset -pH $outfile > $layoutfile
+    )
+    $GREP $expectlayout $TESTDIR/$layoutfile > /dev/null
+    if [ $? -eq 0 ]; then
+        echo " PASSED"
+    else
+        echo " FAILED"
+        nerrors="`expr $nerrors + 1`"
+    fi
+
+    # clean up tmp files
+    rm -f $outfile
+    rm -f $layoutfile
+}
+
+#------------------------------------------
+# Verifying layouts of a dataset
+VERIFY_LAYOUT_VDS()
+{
+    layoutfile=layout-$1.$2
+    dset=$3
+    expectlayout=$4
+    infile=$2
+    outfile=out-$1.$2
+
+    expect="$TESTDIR/$2-$1-v.ddl"
+    actual="$TESTDIR/$2-$1-v.out"
+    actual_err="$TESTDIR/$2-$1-v.err"
+
+    shift
+    shift
+    shift
+    shift
+
+    TESTING  $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+    fi
+
+    #---------------------------------
+    # check the layout from a dataset
+    VERIFY  "a dataset layout"
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5DUMP_BIN -d $dset -p $outfile
+    ) >$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 > /dev/null 2>&1 ; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $caseless $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	rm -f $actual $actual_err
+    fi
+
+    # clean up tmp files
+    rm -f $outfile
+}
+
+#----------------------------------------
+# Verifying layouts from entire file
+VERIFY_LAYOUT_ALL()
+{
+    infile=$2
+    outfile=out-$1.$2
+    layoutfile=layout-$1.$2
+    expectlayout=$3
+    shift
+    shift
+    shift
+
+    TESTING  $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+
+
+    #---------------------------------
+    # check the layout from a dataset
+    # check if the other layouts still exsit
+    VERIFY  "layouts"
+    (
+        cd $TESTDIR
+        echo
+        # if CONTIGUOUS
+        if [ $expectlayout = "CONTIGUOUS" ]; then
+            TESTING $H5DUMP_BIN -pH $outfile
+            (
+                $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
+            )
+            $GREP "COMPACT" $layoutfile  > /dev/null
+            if [ $? -eq 0 ]; then
+                echo " FAILED"
+                nerrors="`expr $nerrors + 1`"
+            else
+                $GREP "CHUNKED" $layoutfile  > /dev/null
+                if [ $? -eq 0 ]; then
+                    echo " FAILED"
+                    nerrors="`expr $nerrors + 1`"
+                else
+                    echo " PASSED"
+                fi
+            fi
+        else
+            # if COMPACT
+            if [ $expectlayout = "COMPACT" ]; then
+                TESTING $H5DUMP_BIN -pH $outfile
+                (
+                    $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
+                )
+                $GREP "CHUNKED" $layoutfile  > /dev/null
+                if [ $? -eq 0 ]; then
+                    echo " FAILED"
+                    nerrors="`expr $nerrors + 1`"
+                else
+                    $GREP "CONTIGUOUS" $layoutfile  > /dev/null
+                    if [ $? -eq 0 ]; then
+                        echo " FAILED"
+                        nerrors="`expr $nerrors + 1`"
+                    else
+                        echo " PASSED"
+                    fi
+                fi
+            else
+                # if CHUNKED
+                if [ $expectlayout = "CHUNKED" ]; then
+                    TESTING $H5DUMP_BIN -pH $outfile
+                    (
+                        $RUNSERIAL $H5DUMP_BIN -pH $outfile > $layoutfile
+                    )
+                    $GREP "CONTIGUOUS" $layoutfile  > /dev/null
+                    if [ $? -eq 0 ]; then
+                        echo " FAILED"
+                        nerrors="`expr $nerrors + 1`"
+                    else
+                        $GREP "COMPACT" $layoutfile  > /dev/null
+                        if [ $? -eq 0 ]; then
+                            echo " FAILED"
+                            nerrors="`expr $nerrors + 1`"
+                        else
+                            echo " PASSED"
+                        fi
+                    fi
+                fi
+           fi
+        fi
+    )
+
+    # clean up tmp files
+    rm -f $outfile
+    rm -f $layoutfile
+}
+
+# same as TOOLTEST, but it uses the old syntax -i input_file -o output_file
+#
+TOOLTEST0()
+{
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN -i $infile -o $outfile "$@"
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+    rm -f $outfile
+}
+
+
+# same as TOOLTEST, but it uses without -i -o options
+# used to test the family driver, where these files reside
+#
+TOOLTEST1()
+{
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+	echo "*FAILED*"
+	nerrors="`expr $nerrors + 1`"
+    else
+	echo " PASSED"
+	DIFFTEST $infile $outfile
+    fi
+    rm -f $outfile
+}
+
+# This is same as TOOLTEST() with comparing display output
+# from -v option
+#
+TOOLTESTV()
+{
+    expect="$TESTDIR/$2-$1.tst"
+    actual="$TESTDIR/`basename $2 .ddl`.out"
+    actual_err="$TESTDIR/`basename $2 .ddl`.err"
+
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    ) >$actual 2>$actual_err
+    RET=$?
+    if [ $RET != 0 ] ; then
+	echo "*FAILED*"
+	nerrors="`expr $nerrors + 1`"
+    else
+	echo " PASSED"
+	DIFFTEST $infile $outfile
+    fi
+
+    # display output compare
+    STDOUT_FILTER $actual
+    cat $actual_err >> $actual
+
+    VERIFY output from $H5REPACK $@
+    if cmp -s $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.tst) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && diff -c $expect $actual |sed 's/^/    /'
+    fi
+
+   rm -f $actual $actual_err
+   rm -f $outfile
+}
+
+# same as TOOLTESTV 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
+# ADD_H5ERR_MASK_TEST
+TOOLTESTM() {
+
+    expect="$TESTDIR/$2-$1.tst"
+    actual="$TESTDIR/`basename $2 .tst`.out"
+    actual_err="$TESTDIR/`basename $2 .tst`.oerr"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    cp $actual_err $actual_err_sav
+
+    # 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
+
+    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 (*.tst) 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
+
+}
+
+# This is same as TOOLTESTV() with comparing h5dump output
+# from -pH option
+#
+TOOLTEST_DUMP()
+{
+    infile=$2
+    outfile=out-$1.$2
+    expect="$TESTDIR/$1.$2.ddl"
+    actual="$TESTDIR/out-$1.$2.out"
+    actual_err="$TESTDIR/out-$1.$2.err"
+
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    ) >$actual 2>$actual_err
+    RET=$?
+    if [ $RET != 0 ] ; then
+    echo "*FAILED*"
+    nerrors="`expr $nerrors + 1`"
+    else
+     echo " PASSED"
+     VERIFY h5dump output $@
+     (
+        cd $TESTDIR
+        $RUNSERIAL $H5DUMP_BIN -pH $outfile
+     ) >$actual 2>$actual_err
+     cat $actual_err >> $actual
+
+     RET=$?
+
+    fi
+
+    if cmp -s $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 -c $expect $actual |sed 's/^/    /'
+    fi
+
+   rm -f $actual $actual_err
+   rm -f $outfile
+}
+
+# TOOLTEST_META:
+# Test metadata block size option.
+# Reason to create a function here is to localize all special steps related to
+# metadata block size option in one place.  This is a quick solution.  More
+# thought out solution needed when there is more time.
+#
+# $1: test input file
+# $2:$: metadata options (either "-M size" or "--metadata_block_size=size")
+#
+# Algorithm:
+# Run it once without the metadata option ($2-$);
+# Save the result output file;
+# Run it second time with the metadata option;
+# Verify the output file of second run is larger than the one of 1st run.
+TOOLTEST_META()
+{
+    infile=$2
+    outfile=out-$1.$2
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+    # get the size of the first output file
+    size1=`wc -c $TESTDIR/$outfile | cut -d' ' -f1`
+
+    # 2nd run with metadata option
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+        echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+        DIFFTEST $infile $outfile
+    fi
+    # get the size of the second output file
+    size2=`wc -c $TESTDIR/$outfile | cut -d' ' -f1`
+
+    # verify sizes.
+    MESSAGE "Verify the sizes of both output files ($size1 vs $size2)"
+    if [ $size1 -lt $size2 ]; then
+    	# pass
+	echo " PASSED"
+    else
+	#fail
+	echo "*FAILED*"
+        nerrors="`expr $nerrors + 1`"
+    fi
+
+    rm -f $outfile
+}
+
+# ADD_HELP_TEST
+TOOLTEST_HELP() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .txt`.out"
+    actual_err="$TESTDIR/`basename $1 .txt`.err"
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $H5REPACK_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect data file if it doesn't yet exist.
+      echo " CREATED"
+      cp $actual $expect-CREATED
+    elif cmp -s $expect $actual; then
+      echo " PASSED"
+    else
+      echo "*FAILED*"
+      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
+    fi
+
+}
+
+# This is different from $srcdir/../../../bin/output_filter.sh
+STDOUT_FILTER() {
+    result_file=$1
+    tmp_file=/tmp/h5test_tmp_$$
+    # Filter name of files.
+    cp $result_file $tmp_file
+    sed -e '/^Opening file/d' -e '/^Making file/d' \
+    < $tmp_file > $result_file
+    # cleanup
+    rm -f $tmp_file
+}
+
+#
+# The tests
+# We use the files generated by h5repacktst
+# 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
+#
+
+# 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.
+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
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+TOOLTEST_HELP h5repack-help.txt -h
+
+# copy files (these files have no filters)
+TOOLTEST fill h5repack_fill.h5
+TOOLTEST objs h5repack_objs.h5
+TOOLTEST attr h5repack_attr.h5
+TOOLTEST hlink h5repack_hlink.h5
+TOOLTEST layout h5repack_layout.h5
+TOOLTEST early h5repack_early.h5
+
+# nested 8bit enum in both deflated and non-deflated datafiles
+if [ $USE_FILTER_DEFLATE != "yes" ]; then
+TOOLTEST nested_8bit_enum h5repack_nested_8bit_enum.h5
+else
+TOOLTEST nested_8bit_enum h5repack_nested_8bit_enum_deflated.h5
+fi
+
+# use h5repack_layout.h5 to write some filters  (this file has  no filters)
+
+# gzip with individual object
+arg="h5repack_layout.h5 -f dset1:GZIP=1  -l dset1:CHUNK=20x10"
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST gzip_individual $arg
+fi
+
+# gzip for all
+arg="h5repack_layout.h5 -f GZIP=1"
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST gzip_all $arg
+fi
+
+# szip with individual object
+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
+fi
+
+# szip for all
+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
+fi
+
+# shuffle with individual object
+arg="h5repack_layout.h5 -f dset2:SHUF  -l dset2:CHUNK=20x10"
+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
+
+# fletcher32 for all
+arg="h5repack_layout.h5 -f FLET"
+TOOLTEST fletcher_all $arg
+
+# all filters
+arg="h5repack_layout.h5 -f dset2:SHUF -f dset2:FLET -f dset2:SZIP=8,NN -f dset2:GZIP=1 -l dset2:CHUNK=20x10"
+if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST all_filters $arg
+fi
+
+# verbose gzip with individual object
+arg="h5repack_filters.h5 -v -f /dset_deflate:GZIP=9"
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ # compare output
+ TOOLTESTV gzip_verbose_filters $arg
+fi
+
+###########################################################
+# the following tests assume the input files have filters
+###########################################################
+
+# szip copy
+arg="h5repack_szip.h5"
+if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
+ SKIP $arg
+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
+ SKIP $arg
+else
+ TOOLTEST szip_remove $arg
+fi
+
+# deflate copy
+arg="h5repack_deflate.h5"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST deflate_copy $arg
+fi
+
+# deflate remove
+arg="h5repack_deflate.h5 -f dset_deflate:NONE"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST deflate_remove $arg
+fi
+
+# shuffle copy
+arg="h5repack_shuffle.h5"
+TOOLTEST shuffle_copy $arg
+
+# shuffle remove
+arg="h5repack_shuffle.h5 -f dset_shuffle:NONE"
+TOOLTEST shuffle_remove $arg
+
+# fletcher32 copy
+arg="h5repack_fletcher.h5"
+TOOLTEST fletcher_copy $arg
+
+# fletcher32 remove
+arg="h5repack_fletcher.h5 -f dset_fletcher32:NONE"
+TOOLTEST fletcher_remove $arg
+
+# nbit copy
+arg="h5repack_nbit.h5"
+TOOLTEST nbit_copy $arg
+
+# nbit remove
+arg="h5repack_nbit.h5 -f dset_nbit:NONE"
+TOOLTEST nbit_remove $arg
+
+# nbit add
+arg="h5repack_nbit.h5 -f dset_int31:NBIT"
+TOOLTEST nbit_add $arg
+
+# scaleoffset copy
+arg="h5repack_soffset.h5"
+TOOLTEST scale_copy $arg
+
+# scaleoffset add
+arg="h5repack_soffset.h5 -f dset_none:SOFF=31,IN"
+TOOLTEST scale_add $arg
+
+# scaleoffset remove
+arg="h5repack_soffset.h5 -f dset_scaleoffset:NONE"
+TOOLTEST scale_remove $arg
+
+# remove all  filters
+arg="h5repack_filters.h5 -f NONE"
+if test $USE_FILTER_DEFLATE != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SZIP_ENCODER != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST remove_all $arg
+fi
+
+#filter conversions
+
+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
+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
+fi
+
+
+#limit
+arg="h5repack_layout.h5 -f GZIP=1 -m 1024"
+if test $USE_FILTER_DEFLATE != "yes"  ; then
+ SKIP $arg
+else
+ TOOLTEST_DUMP deflate_limit $arg
+fi
+
+#file
+arg="h5repack_layout.h5 -e h5repack.info"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST deflate_file $arg
+fi
+
+#########################################################
+# layout options (these files have no filters)
+#########################################################
+VERIFY_LAYOUT_DSET dset2_chunk_20x10 h5repack_layout.h5 dset2 CHUNKED --layout dset2:CHUNK=20x10
+
+VERIFY_LAYOUT_ALL chunk_20x10 h5repack_layout.h5 CHUNKED -l CHUNK=20x10
+
+VERIFY_LAYOUT_DSET dset2_conti h5repack_layout.h5 dset2 CONTIGUOUS -l dset2:CONTI
+
+VERIFY_LAYOUT_ALL conti h5repack_layout.h5 CONTIGUOUS -l CONTI
+
+VERIFY_LAYOUT_DSET dset2_compa h5repack_layout.h5 dset2 COMPACT -l dset2:COMPA
+
+VERIFY_LAYOUT_ALL compa h5repack_layout.h5 COMPACT -l COMPA
+
+TOOLTESTM dset2_chunk_20x10-errstk h5repack_layout.h5 --layout=dset2:CHUNK=20x10x5 --enable-error-stack
+
+################################################################
+# layout conversions (file has no filters)
+###############################################################
+
+VERIFY_LAYOUT_DSET dset_compa_conti h5repack_layout.h5 dset_compact CONTIGUOUS -l dset_compact:CONTI
+
+VERIFY_LAYOUT_DSET dset_compa_chunk h5repack_layout.h5 dset_compact CHUNKED -l dset_compact:CHUNK=2x5
+
+VERIFY_LAYOUT_DSET dset_compa_compa h5repack_layout.h5 dset_compact COMPACT -l dset_compact:COMPA
+
+VERIFY_LAYOUT_DSET dset_conti_compa h5repack_layout.h5 dset_contiguous COMPACT -l dset_contiguous:COMPA
+
+VERIFY_LAYOUT_DSET dset_conti_chunk h5repack_layout.h5 dset_contiguous CHUNKED -l dset_contiguous:CHUNK=3x6
+
+VERIFY_LAYOUT_DSET dset_conti_conti h5repack_layout.h5 dset_contiguous CONTIGUOUS -l dset_contiguous:CONTI
+
+VERIFY_LAYOUT_DSET chunk_compa h5repack_layout.h5 dset_chunk COMPACT -l dset_chunk:COMPA
+
+VERIFY_LAYOUT_DSET chunk_conti h5repack_layout.h5 dset_chunk CONTIGUOUS -l dset_chunk:CONTI
+
+VERIFY_LAYOUT_DSET chunk_18x13 h5repack_layout.h5 dset_chunk CHUNKED -l dset_chunk:CHUNK=18x13
+
+# test convert small size dataset ( < 1k) to compact layout without -m
+VERIFY_LAYOUT_DSET contig_small_compa h5repack_layout2.h5 contig_small COMPACT -l contig_small:COMPA
+
+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
+# 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
+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,
+# should remain as original layout (chunk)
+VERIFY_LAYOUT_DSET chunk2compa h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA
+
+#--------------------------------------------------------------------------
+# Test -f for some specific cases. Chunked dataset with unlimited max dims.
+# (HDFFV-8012)
+#--------------------------------------------------------------------------
+# - should not fail
+# - should not change max dims from unlimit
+
+# chunk dim is bigger than dataset dim. ( dset size < 64k )
+VERIFY_LAYOUT_DSET error1 h5repack_layout3.h5 chunk_unlimit1 H5S_UNLIMITED -f chunk_unlimit1:NONE
+# chunk dim is bigger than dataset dim. ( dset size > 64k )
+VERIFY_LAYOUT_DSET error2 h5repack_layout3.h5 chunk_unlimit2 H5S_UNLIMITED -f chunk_unlimit2:NONE
+
+# chunk dims are smaller than dataset dims. ( dset size < 64k )
+#TOOLTEST_MAIN h5repack_layout3.h5  -f chunk_unlimit3:NONE
+VERIFY_LAYOUT_DSET error3 h5repack_layout3.h5 chunk_unlimit3 H5S_UNLIMITED -f chunk_unlimit3:NONE
+
+# file input - should not fail
+TOOLTEST error4 h5repack_layout3.h5 -f NONE
+
+#--------------------------------------------------------------------------
+# 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.
+VERIFY_LAYOUT_DSET ckdim_smaller h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI
+
+
+# Native option
+# Do not use FILE1, as the named dtype will be converted to native, and h5diff will
+# report a difference.
+TOOLTEST native_fill h5repack_fill.h5 -n
+TOOLTEST native_attr h5repack_attr.h5 -n
+
+
+# latest file format with long switches. use FILE4=h5repack_layout.h5 (no filters)
+arg="h5repack_layout.h5 --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype]"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ VERIFY_LAYOUT_ALL layout_long_switches h5repack_layout.h5 CHUNKED --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype]
+fi
+
+# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
+arg="h5repack_layout.h5 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ VERIFY_LAYOUT_ALL layout_short_switches h5repack_layout.h5 CHUNKED -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]
+fi
+
+# several global filters
+
+arg="h5repack_layout.h5 --filter GZIP=1 --filter SHUF"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST global_filters $arg
+fi
+
+# syntax of -i infile -o outfile
+# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
+arg="h5repack_layout.h5 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
+if test $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP $arg
+else
+ TOOLTEST0 old_style_layout_short_switches $arg
+fi
+
+# add a userblock to file
+arg="h5repack_objs.h5 -u ublock.bin -b 2048"
+TOOLTEST add_userblock $arg
+
+# add alignment
+arg="h5repack_objs.h5 -t 1 -a 1 "
+TOOLTEST add_alignment $arg
+
+# Check repacking file with old version of layout message (should get upgraded
+#       to new version and be readable, etc.)
+TOOLTEST upgrade_layout h5repack_layouto.h5
+
+# test for datum size > H5TOOLS_MALLOCSIZE
+TOOLTEST gt_mallocsize h5repack_objs.h5 -f GZIP=1
+
+# Check repacking file with committed datatypes in odd configurations
+TOOLTEST committed_dt h5repack_named_dtypes.h5
+
+# tests family driver (file is located in common testfiles folder, uses TOOLTEST1
+TOOLTEST1 family tfamily%05d.h5
+
+# test various references (bug 1814 and 1726)
+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
+
+# 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
+TOOLTEST_META meta_short h5repack_layout.h5 -M 8192
+TOOLTEST_META meta_long h5repack_layout.h5 --metadata_block_size=8192
+
+# VDS tests
+
+################################################################
+# layout conversions
+###############################################################
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+    SKIP vds_dset_chunk_20x10x5
+else
+    VERIFY_LAYOUT_VDS vds_dset_chunk_20x10x5 1_vds.h5 vds_dset CHUNKED --layout vds_dset:CHUNK=20x10x5
+fi
+
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+    SKIP vds_chunk2x5x8
+else
+    VERIFY_LAYOUT_VDS vds_chunk2x5x8 3_1_vds.h5 vds_dset CHUNKED -l vds_dset:CHUNK=2x5x8
+fi
+
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+    SKIP vds_chunk3x6x9
+else
+    VERIFY_LAYOUT_VDS vds_chunk3x6x9 2_vds.h5 vds_dset CHUNKED -l vds_dset:CHUNK=3x6x9
+fi
+
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+    SKIP vds_compa 4_vds.h5
+else
+    VERIFY_LAYOUT_VDS vds_compa 4_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
+fi
+
+if test  $USE_FILTER_DEFLATE != "yes" ; then
+ SKIP vds_conti 4_vds.h5
+else
+ VERIFY_LAYOUT_VDS vds_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
+fi
+
+# 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/test/h5repack/h5repack_plugin.sh.in b/tools/test/h5repack/h5repack_plugin.sh.in
new file mode 100644
index 0000000..c9fe53c
--- /dev/null
+++ b/tools/test/h5repack/h5repack_plugin.sh.in
@@ -0,0 +1,274 @@
+#! /bin/sh
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+srcdir=@srcdir@
+TOP_BUILDDIR=@top_builddir@
+
+# Determine backward compatibility options enabled
+DEPRECATED_SYMBOLS="@DEPRECATED_SYMBOLS@"
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5REPACK=../../src/h5repack/h5repack               # The tool name
+H5REPACK_BIN=`pwd`/$H5REPACK    # The path of the tool binary
+
+H5DUMP=../../src/h5dump/h5dump         # The h5dump tool name
+H5DUMP_BIN=`pwd`/$H5DUMP        # The path of the h5dump tool binary
+
+nerrors=0
+verbose=yes
+exit_code=$EXIT_SUCCESS
+
+TEST_NAME=ud_plugin
+FROM_DIR=`pwd`/.libs
+PLUGIN_LIB="$FROM_DIR/libdynlibadd.*"
+PLUGIN_LIB2="$FROM_DIR/libdynlibvers.*"
+PLUGIN_LIBDIR=testdir3
+RM='rm -rf'
+
+GREP='grep'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+# source dirs
+SRC_TOOLS="$srcdir/../.."
+
+# testfiles source dirs for tools
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+
+TESTDIR=testplug
+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_H5REPACK_TESTFILES/h5repack_layout.h5
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-plugin_test.ddl
+$SRC_H5REPACK_TESTFILES/plugin_test.h5repack_layout.h5.tst
+$SRC_H5REPACK_TESTFILES/h5repack_layout.h5-plugin_version_test.ddl
+$SRC_H5REPACK_TESTFILES/plugin_version_test.h5repack_layout.h5.tst
+"
+#$SRC_H5REPACK_TESTFILES/h5repack_layout.UD.h5
+#$SRC_H5REPACK_TESTFILES/h5repack_layout.UD.h5-plugin_none.ddl
+#$SRC_H5REPACK_TESTFILES/plugin_none.h5repack_layout.UD.h5.tst
+#"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES"
+
+# Main Body
+# Create test directories if not exists yet.
+test -d $PLUGIN_LIBDIR || mkdir -p $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to create test directory($PLUGIN_LIBDIR)"
+    exit $EXIT_FAILURE
+fi
+
+# copy plugin library for test
+$CP $PLUGIN_LIB $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to copy plugin library ($PLUGIN_LIB) for test."
+    exit $EXIT_FAILURE
+fi
+$CP $PLUGIN_LIB2 $PLUGIN_LIBDIR
+if [ $? != 0 ]; then
+    echo "Failed to copy plugin library ($PLUGIN_LIB2) for test."
+    exit $EXIT_FAILURE
+fi
+
+# setup plugin path
+ENVCMD="env HDF5_PLUGIN_PATH=../${PLUGIN_LIBDIR}"
+
+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=$SRC_H5REPACK_TESTFILES
+    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 $* message left justified in a field of 70 characters
+#
+MESSAGE() {
+   SPACES="                                                               "
+   echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# 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'
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY() {
+    MESSAGE "Verifying $*"
+}
+
+# This is different from $srcdir/../../../bin/output_filter.sh
+STDOUT_FILTER() {
+    result_file=$1
+    tmp_file=/tmp/h5test_tmp_$$
+    # Filter name of files.
+    cp $result_file $tmp_file
+    sed -e '/^Opening file/d' -e '/^Making file/d' \
+    < $tmp_file > $result_file
+    # cleanup
+    rm -f $tmp_file
+}
+
+# This runs h5repack comparing output with h5dump output
+# from -pH option
+#
+TOOLTEST_DUMP()
+{
+    echo $@
+    infile=$2
+    outfile=out-$1.$2
+    expect1="$TESTDIR/$1.$2.tst"
+    actual1="$TESTDIR/$1.$2.out"
+    actual1_err="$TESTDIR/$1.$2.err"
+    expect2="$TESTDIR/$2-$1.ddl"
+    actual2="$TESTDIR/$2-$1.out"
+    actual2_err="$TESTDIR/$2-$1.err"
+
+    shift
+    shift
+
+    # Run test.
+    TESTING $H5REPACK $@
+    (
+      cd $TESTDIR
+      $ENVCMD $H5REPACK_BIN "$@" $infile $outfile
+    ) >$actual1 2>$actual1_err
+    RET=$?
+    STDOUT_FILTER $actual1
+    cat $actual1_err >> $actual1
+    if [ $RET != 0 ] ; then
+      echo "*FAILED*"
+      nerrors="`expr $nerrors + 1`"
+    else
+      echo " PASSED"
+      if cmp -s $expect1 $actual1; then
+        echo " PASSED"
+      else
+        echo "*FAILED*"
+        echo "    Expected result (*.tst) differs from actual result (*.out)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && diff -c $expect1 $actual1 |sed 's/^/    /'
+      fi
+      VERIFY h5dump output -pH $outfile
+      (
+        cd $TESTDIR
+        $ENVCMD $H5DUMP_BIN -pH $outfile
+      ) >$actual2 2>$actual2_err
+      RET=$?
+      cat $actual2_err >> $actual2
+
+      if cmp -s $expect2 $actual2; then
+        echo " PASSED"
+      else
+        echo "*FAILED*"
+      echo "    Expected result (*.ddl) differs from actual result (*.out)"
+      nerrors="`expr $nerrors + 1`"
+      test yes = "$verbose" && diff -c $expect2 $actual2 |sed 's/^/    /'
+     fi
+
+    fi
+
+
+   rm -f $actual1 $actual1_err $actual2 $actual2_err
+   rm -f $outfile
+}
+
+##############################################################################
+###           T H E   T E S T S
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+version_str=`echo @H5_VERSION@ | awk -F"-" '{print $1}' | sed 's/\./,/g'`
+
+# Run the test
+arg="h5repack_layout.h5 -v -f UD=260,4,9,$version_str"
+TOOLTEST_DUMP plugin_version_test $arg
+
+arg="h5repack_layout.h5 -v -f UD=257,1,9"
+TOOLTEST_DUMP plugin_test $arg
+
+#arg="h5repack_layout.UD.h5 -v -f NONE"
+#TOOLTEST_DUMP plugin_none $arg
+
+# print results
+if test $nerrors -ne 0 ; then
+    echo "$nerrors errors encountered"
+    exit_code=$EXIT_FAILURE
+else
+    echo "All Plugin API tests passed."
+    exit_code=$EXIT_SUCCESS
+fi
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Clean up temporary files/directories and leave
+$RM $PLUGIN_LIBDIR
+
+exit $exit_code
diff --git a/tools/test/h5repack/h5repacktst.c b/tools/test/h5repack/h5repacktst.c
new file mode 100644
index 0000000..3b82383
--- /dev/null
+++ b/tools/test/h5repack/h5repacktst.c
@@ -0,0 +1,7187 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5repack.h"
+#include "h5test.h"
+#include "h5diff.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+#define GOERROR  {H5_FAILED(); goto error;}
+
+
+/* fill value test */
+#define FNAME0     "h5repack_fill.h5"
+#define FNAME0OUT  "h5repack_fill_out.h5"
+/* HDF5 objects and all dataset datatypes */
+#define FNAME1     "h5repack_objs.h5"
+#define FNAME1OUT  "h5repack_objs_out.h5"
+/* attributes, all datatypes  */
+#define FNAME2     "h5repack_attr.h5"
+#define FNAME2OUT  "h5repack_attr_out.h5"
+/* hard links  */
+#define FNAME3     "h5repack_hlink.h5"
+#define FNAME3OUT  "h5repack_hlink_out.h5"
+/* layout  */
+#define FNAME4     "h5repack_layout.h5"
+#define FNAME4OUT  "h5repack_layout_out.h5"
+/* H5D_ALLOC_TIME_EARLY  */
+#define FNAME5     "h5repack_early.h5"
+#define FNAME5OUT  "h5repack_early_out.h5"
+#define FNAME6     "h5repack_early2.h5"
+#ifdef H5_HAVE_FILTER_SZIP
+/* SZIP filter  */
+#define FNAME7     "h5repack_szip.h5"
+#define FNAME7OUT  "h5repack_szip_out.h5"
+#endif
+/* GZIP filter  */
+#define FNAME8     "h5repack_deflate.h5"
+#define FNAME8OUT  "h5repack_deflate_out.h5"
+/* GZIP filter  */
+#define FNAME9     "h5repack_shuffle.h5"
+#define FNAME9OUT  "h5repack_shuffle_out.h5"
+/* Fletcher filter  */
+#define FNAME10    "h5repack_fletcher.h5"
+#define FNAME10OUT "h5repack_fletcher_out.h5"
+/* All filters  */
+#define FNAME11    "h5repack_filters.h5"
+#define FNAME11OUT "h5repack_filters_out.h5"
+/* NBit filter  */
+#define FNAME12    "h5repack_nbit.h5"
+#define FNAME12OUT "h5repack_nbit_out.h5"
+/* Scale Offset filter  */
+#define FNAME13    "h5repack_soffset.h5"
+#define FNAME13OUT "h5repack_soffset_out.h5"
+/* Big file to test read by hyperslabs  */
+#define FNAME14    "h5repack_big.h5"
+#define FNAME14OUT "h5repack_big_out.h5"
+/* external file  */
+#define FNAME15    "h5repack_ext.h5"
+#define FNAME15OUT "h5repack_ext_out.h5"
+/* File w/userblock */
+#define FNAME16    "h5repack_ub.h5"
+#define FNAME16OUT "h5repack_ub_out.h5"
+/* Named datatypes */
+#define FNAME17     "h5repack_named_dtypes.h5"
+#define FNAME17OUT  "h5repack_named_dtypes_out.h5"
+
+#define FNAME18     "h5repack_layout2.h5"
+
+/* Files for testing file space paging */
+#define FSPACE_OUT	"h5repack_fspace_OUT.h5"	/* The output file */
+#define NELMTS(X)       (sizeof(X)/sizeof(X[0]))        /* # of elements */
+const char *H5REPACK_FSPACE_FNAMES[] = {
+    "h5repack_latest.h5",               /* 0 */
+    "h5repack_default.h5",              /* 1 */
+    "h5repack_page_persist.h5",   	    /* 2 */
+    "h5repack_fsm_aggr_persist.h5",   	/* 3 */
+    "h5repack_page_threshold.h5",       /* 4 */
+    "h5repack_fsm_aggr_threshold.h5",   /* 5 */ 
+    "h5repack_aggr.h5",                 /* 6 */
+    "h5repack_none.h5"                  /* 7 */
+};
+
+#define FNAME_UB   "ublock.bin"
+
+/* obj and region references */
+#define FNAME_REF   "h5repack_refs.h5"
+
+/* obj and region references in attr of compound and vlen type */
+#define FNAME_ATTR_REF   "h5repack_attr_refs.h5"
+
+const char *H5REPACK_FILENAMES[] = {
+    "h5repack_big_out",
+    NULL
+};
+
+#define H5REPACK_EXTFILE "h5repack_ext.bin"
+
+/* Name of tool */
+#define PROGRAMNAME "h5repacktst"
+
+#define DIM1    40
+#define DIM2    20
+#define CDIM1   DIM1/2
+#define CDIM2   DIM2/2
+#define RANK    2
+
+/* Size of userblock (for userblock test) */
+#define USERBLOCK_SIZE  2048
+
+/* obj and region references */
+#define NAME_OBJ_DS1 "Dset1"
+#define NAME_OBJ_GRP "Group"
+#define NAME_OBJ_NDTYPE "NamedDatatype"
+#define NAME_OBJ_DS2 "Dset2"
+#define REG_REF_DS1 "Dset_REGREF"
+
+/*-------------------------------------------------------------------------
+* prototypes
+*-------------------------------------------------------------------------
+*/
+static int make_all_objects(hid_t loc_id);
+static int make_attributes(hid_t loc_id);
+static int make_hlinks(hid_t loc_id);
+static int make_early(void);
+static int make_layout(hid_t loc_id);
+static int make_layout2(hid_t loc_id);
+static int make_layout3(hid_t loc_id);
+#ifdef H5_HAVE_FILTER_SZIP
+static int make_szip(hid_t loc_id);
+#endif /* H5_HAVE_FILTER_SZIP */
+static int make_deflate(hid_t loc_id);
+static int make_shuffle(hid_t loc_id);
+static int make_fletcher32(hid_t loc_id);
+static int make_nbit(hid_t loc_id);
+static int make_scaleoffset(hid_t loc_id);
+static int make_all_filters(hid_t loc_id);
+static int make_fill(hid_t loc_id);
+static int make_big(hid_t loc_id);
+static int make_testfiles(void);
+static int write_dset_in(hid_t loc_id,const char* dset_name,hid_t file_id,int make_diffs );
+static int write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs );
+static int write_dset(hid_t loc_id,int rank,hsize_t *dims,const char *dset_name,hid_t tid,void *buf );
+static int make_dset(hid_t loc_id,const char *name,hid_t sid,hid_t dcpl,void *buf);
+static int make_attr(hid_t loc_id,int rank,hsize_t *dims,const char *attr_name,hid_t tid,void *buf);
+static int make_dset_reg_ref(hid_t loc_id);
+static int make_external(hid_t loc_id);
+static int make_userblock(void);
+static int verify_userblock( const char* filename);
+static int make_userblock_file(void);
+static int make_named_dtype(hid_t loc_id);
+static int make_references(hid_t loc_id);
+static int make_complex_attr_references(hid_t loc_id);
+
+
+/*-------------------------------------------------------------------------
+* Function: main
+*
+* Purpose: Executes h5repack tests
+*
+* Return: Success: zero
+*  Failure: 1
+*
+* Programmer:  Pedro Vicente <pvn at ncsa.uiuc.edu>
+*             January, 6, 2004
+*
+*-------------------------------------------------------------------------
+*/
+
+int main (void)
+{
+    pack_opt_t  pack_options;
+    diff_opt_t  diff_options;
+
+    unsigned j;				/* Local index variable for testing file space */
+    const char *fname;			/* File name for testing file space */
+
+    h5_stat_t		file_stat;
+    h5_stat_size_t	fsize1, fsize2;	/* file sizes */
+#if defined (H5_HAVE_FILTER_SZIP)
+    int szip_can_encode = 0;
+#endif
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* initialize */
+    HDmemset(&diff_options, 0, sizeof (diff_opt_t));
+    HDmemset(&pack_options, 0, sizeof (pack_opt_t));
+
+    /* run tests  */
+    puts("Testing h5repack:");
+
+    /* make the test files */
+    TESTING("    generating files for testing");
+    if (make_testfiles() < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * Format of the tests:
+    *
+    * 1) make a copy of the file with h5repack
+    * 2) use the h5diff function to compare the input and output file
+    *-------------------------------------------------------------------------
+    */
+    /*-------------------------------------------------------------------------
+    * Testing file space info setting
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    files with file space info setting--no options (-S, -P, -T, -G) are set");
+    j = 0;	/* #0 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    TESTING("    files with file space info setting--all options -S, -P, -T, -G are set");
+    ++j; 	/* #1 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];	
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = H5F_FSPACE_STRATEGY_NONE;
+    pack_options.fs_persist = -1;        /* "FALSE" is set via -P 0 */
+    pack_options.fs_threshold = 1; 
+    pack_options.fs_pagesize = 8192;
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    TESTING("    files with file space info setting--options -S and -T are set");
+    ++j;	/* #2 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = -1; 	    /* "FSM_AGGR" specified via -S FSM_AGGR */
+    pack_options.fs_threshold = -1; 	/* "0" specified via -T 0 */
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    TESTING("    files with file space info setting-- options -S and -P are set & -L");
+    ++j;	/* #3 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, TRUE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE; /* "PAGE" specified via -S */
+    pack_options.fs_persist = TRUE;
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    TESTING("    files with file space info setting-- options -P and -T are set & -L");
+    ++j;	/* #4 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, TRUE) < 0)
+        GOERROR;
+    pack_options.fs_persist = -1; 	/* "FALSE" is set via -P 0 */
+    pack_options.fs_threshold = 2; 
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    TESTING("    files with file space info setting-- options -S and -G are set & -L");
+    ++j;	/* #5 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, TRUE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE;
+    pack_options.fs_pagesize = 8192;
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    TESTING("    files with file space info setting-- options -S, -P, -T, -G are set");
+    ++j;	/* #6 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = H5F_FSPACE_STRATEGY_NONE;
+    pack_options.fs_persist = -1; 	/* "FALSE" is set via -P 0 */
+    pack_options.fs_threshold = 1; 	
+    pack_options.fs_pagesize = 8192;
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    TESTING("    files with file space info setting-- options -S, -T, -G are set & -L");
+    ++j;	/* #7 */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    fname = H5REPACK_FSPACE_FNAMES[j];
+    if(h5repack_init(&pack_options, 0, TRUE) < 0)
+        GOERROR;
+    pack_options.fs_strategy = H5F_FSPACE_STRATEGY_AGGR;
+    pack_options.fs_threshold = 1; 
+    pack_options.fs_pagesize = 4096;
+    if(h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(fname, FSPACE_OUT, &pack_options)<=0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * file with fill values
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    copy of datasets (fill values)");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME0,FNAME0OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME0,FNAME0OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME0, FNAME0OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_cmp_pl(FNAME0,FNAME0OUT)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * file with all kinds of dataset datatypes
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    copy of datasets (all datatypes)");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME1,FNAME1OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME1, FNAME1OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_cmp_pl(FNAME1,FNAME1OUT)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * file with attributes
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    copy of datasets (attributes)");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME2,FNAME2OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME2,FNAME2OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME2, FNAME2OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_cmp_pl(FNAME2,FNAME2OUT)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * file with hardlinks
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    copy of datasets (hardlinks)");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME3,FNAME3OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME3,FNAME3OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME3, FNAME3OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_cmp_pl(FNAME3,FNAME3OUT)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * alloc early test
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    copy of allocation early file");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME5,FNAME5OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME5,FNAME5OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME5, FNAME5OUT, &pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * the remaining files differ in the dcpl's
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * deflate
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    adding deflate filter (old_format)");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 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;
+    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) < 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;
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    adding deflate filter to all");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addlayout("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;
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+    /*-------------------------------------------------------------------------
+    * SZIP
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    adding szip filter");
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (h5tools_can_encode(H5Z_FILTER_SZIP) >0) {
+        szip_can_encode = 1;
+    }
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack_addfilter("dset2:SZIP=8,EC",&pack_options) < 0)
+            GOERROR;
+        if (h5repack_addlayout("dset2: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;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    adding szip filter to all");
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack_addfilter("SZIP=8,NN",&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;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+
+    TESTING("    addding shuffle filter");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset1:SHUF",&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;
+
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    addding shuffle filter to all");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("SHUF",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addlayout("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;
+
+    PASSED();
+
+
+    TESTING("    adding checksum filter");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset1:FLET",&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;
+
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+
+
+    TESTING("    adding checksum filter to all");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("FLET",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addlayout("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;
+
+    PASSED();
+
+
+    TESTING("    filter queue fletcher, shuffle, deflate, szip");
+
+    /*-------------------------------------------------------------------------
+    * add some filters
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset1:CHUNK 20x10",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset1:FLET",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset1:SHUF",&pack_options) < 0)
+        GOERROR;
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (szip_can_encode) {
+        if (h5repack_addfilter("dset1:SZIP=8,NN",&pack_options) < 0)
+            GOERROR;
+    }
+#endif
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+    if (h5repack_addfilter("dset1:GZIP=1",&pack_options) < 0)
+        GOERROR;
+#endif
+
+    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;
+
+    PASSED();
+
+
+    TESTING("    adding layout chunked (old format)");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 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;
+    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) < 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;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    adding layout chunked to all");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("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;
+
+    PASSED();
+
+    TESTING("    adding layout contiguous");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset1:CONTI",&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;
+
+    PASSED();
+
+    TESTING("    adding layout contiguous to all");
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("CONTI",&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;
+
+    /*-------------------------------------------------------------------------
+    * do the same test for a file with filters (chunked)
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("CONTI",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+    TESTING("    adding layout compact");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset1:COMPA",&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;
+    PASSED();
+
+    TESTING("    adding layout compact to all");
+
+    /*-------------------------------------------------------------------------
+    * test all objects option
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("COMPA",&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;
+
+    PASSED();
+
+
+    TESTING("    layout compact to contiguous conversion");
+
+    /*-------------------------------------------------------------------------
+    * layout compact to contiguous conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_compact:CONTI",&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;
+    PASSED();
+
+    TESTING("    layout compact to chunk conversion");
+
+    /*-------------------------------------------------------------------------
+    * layout compact to chunk conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_compact:CHUNK=2x5",&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;
+    PASSED();
+
+    TESTING("    layout compact to compact conversion");
+
+    /*-------------------------------------------------------------------------
+    * layout compact to compact conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_compact:COMPA",&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;
+    PASSED();
+
+    TESTING("    layout contiguous to compact conversion");
+    /*-------------------------------------------------------------------------
+    * layout contiguous to compact conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_contiguous:COMPA",&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;
+    PASSED();
+
+    TESTING("    layout contiguous to chunk conversion");
+    /*-------------------------------------------------------------------------
+    * layout contiguous to chunk conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_contiguous:CHUNK=3x6",&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;
+    PASSED();
+
+    TESTING("    layout contiguous to contiguous conversion");
+
+    /*-------------------------------------------------------------------------
+    * layout contiguous to contiguous conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_contiguous:CONTI",&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;
+    PASSED();
+
+    TESTING("    layout chunked to compact conversion");
+    /*-------------------------------------------------------------------------
+    * layout chunked to compact conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_chunk:COMPA",&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;
+    PASSED();
+
+    TESTING("    layout chunked to contiguous conversion");
+
+    /*-------------------------------------------------------------------------
+    * layout chunked to contiguous conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_chunk:CONTI",&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;
+    PASSED();
+
+    TESTING("    layout chunked to chunk conversion");
+    /*-------------------------------------------------------------------------
+    * layout chunked to chunked conversion
+    *-------------------------------------------------------------------------
+    */
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset_chunk:CHUNK=18x13",&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;
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * the following tests assume the input files have filters
+    * FNAME7
+    * FNAME8
+    * FNAME9
+    * FNAME10
+    * FNAME11
+    *-------------------------------------------------------------------------
+    */
+
+
+    TESTING("    copy of szip filter");
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack(FNAME7,FNAME7OUT,&pack_options) < 0)
+            GOERROR;
+        if (h5diff(FNAME7,FNAME7OUT,NULL,NULL,&diff_options) >0)
+            GOERROR;
+        if (h5repack_verify(FNAME7, FNAME7OUT,&pack_options)<=0)
+            GOERROR;
+        if (h5repack_cmp_pl(FNAME7,FNAME7OUT)<=0)
+            GOERROR;
+        if (h5repack_end (&pack_options) < 0)
+            GOERROR;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+    TESTING("    removing szip filter");
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack_addfilter("dset_szip:NONE",&pack_options) < 0)
+            GOERROR;
+        if (h5repack(FNAME7,FNAME7OUT,&pack_options) < 0)
+            GOERROR;
+        if (h5diff(FNAME7,FNAME7OUT,NULL,NULL,&diff_options) >0)
+            GOERROR;
+        if (h5repack_verify(FNAME7, FNAME7OUT,&pack_options)<=0)
+            GOERROR;
+        if (h5repack_end (&pack_options) < 0)
+            GOERROR;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+
+    TESTING("    copy of deflate filter");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+
+    TESTING("    removing deflate filter");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_deflate:NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+
+
+    TESTING("    copy of shuffle filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME9,FNAME9OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME9,FNAME9OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME9, FNAME9OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    removing shuffle filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_shuffle:NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME9,FNAME9OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME9,FNAME9OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME9, FNAME9OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    copy of fletcher filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME10,FNAME10OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME10,FNAME10OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME10, FNAME10OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    removing fletcher filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_fletcher32:NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME10,FNAME10OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME10,FNAME10OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME10, FNAME10OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    copy of nbit filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    removing nbit filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_nbit:NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    adding nbit filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_int31:NBIT",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    copy of scaleoffset filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    removing scaleoffset filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_scaleoffset:NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    TESTING("    adding scaleoffset filter");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset_none:SOFF=31,IN",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * file with all filters
+    *  dset_all
+    *  dset_deflate
+    *  dset_szip
+    *  dset_shuffle
+    *  dset_fletcher32
+    *-------------------------------------------------------------------------
+    */
+
+
+    TESTING("    filter conversion from deflate to szip");
+
+#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
+
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack_addfilter("dset_deflate:SZIP=8,NN",&pack_options) < 0)
+            GOERROR;
+        if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
+            GOERROR;
+        if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
+            GOERROR;
+        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
+            GOERROR;
+        if (h5repack_end (&pack_options) < 0)
+            GOERROR;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+    TESTING("    filter conversion from szip to deflate");
+
+#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
+
+    if (szip_can_encode) {
+        if (h5repack_init (&pack_options, 0, FALSE) < 0)
+            GOERROR;
+        if (h5repack_addfilter("dset_szip:GZIP=1",&pack_options) < 0)
+            GOERROR;
+        if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
+            GOERROR;
+        if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
+            GOERROR;
+        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
+            GOERROR;
+        if (h5repack_end (&pack_options) < 0)
+            GOERROR;
+
+        PASSED();
+    } else {
+        SKIPPED();
+    }
+#else
+    SKIPPED();
+#endif
+
+
+    /*-------------------------------------------------------------------------
+    * test the NONE global option
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    removing all filters");
+
+#if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("NONE",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+    /*-------------------------------------------------------------------------
+    * test a big file
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    big file");
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME14,FNAME14OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME14,FNAME14OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME14, FNAME14OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test external dataset
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    external datasets");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack(FNAME15,FNAME15OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME15,FNAME15OUT,NULL,NULL,&diff_options) > 0)
+        GOERROR;
+    if (h5repack_verify(FNAME15, FNAME15OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test file with userblock
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    file with userblock");
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if(h5repack(FNAME16, FNAME16OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(FNAME16, FNAME16OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(FNAME16, FNAME16OUT, &pack_options) <= 0)
+        GOERROR;
+    if(verify_userblock(FNAME16OUT) < 0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * test --latest options
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    latest file format options");
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    pack_options.latest=1;
+    pack_options.grp_compact=10;
+    pack_options.grp_indexed=5;
+    pack_options.msg_size[0] = 10;
+    pack_options.msg_size[1] = 20;
+    pack_options.msg_size[2] = 30;
+    pack_options.msg_size[3] = 40;
+    pack_options.msg_size[4] = 50;
+    if (h5repack(FNAME1,FNAME1OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) > 0)
+        GOERROR;
+    if (h5repack_verify(FNAME1, FNAME1OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * test several global filters
+    *-------------------------------------------------------------------------
+    */
+
+    TESTING("    several global filters");
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+
+    if (h5repack_init (&pack_options, 0, FALSE) < 0)
+        GOERROR;
+    if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addfilter("SHUF",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME11,FNAME11OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+
+    /*-------------------------------------------------------------------------
+    * test file with userblock
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    file with added userblock");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+
+    /* add the options for a user block size and user block filename */
+    pack_options.ublock_size = USERBLOCK_SIZE;
+    pack_options.ublock_filename = FNAME_UB;
+
+    if(h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
+        GOERROR;
+    if(verify_userblock(FNAME8OUT) < 0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+
+    /*-------------------------------------------------------------------------
+    * test file with aligment
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    file with aligment");
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+
+    /* add the options for aligment */
+    pack_options.alignment = 1;
+    pack_options.threshold = 1;
+
+    if(h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
+        GOERROR;
+
+    /* verify aligment */
+    {
+        hsize_t threshold;
+        hsize_t alignment;
+        hid_t fapl;
+        hid_t fid;
+
+        if (( fid = H5Fopen(FNAME8OUT, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
+            GOERROR;
+        if ((fapl = H5Fget_access_plist(fid)) < 0)
+            GOERROR;
+        if ( H5Pget_alignment(fapl, &threshold, &alignment  )  < 0)
+            GOERROR;
+        if ( threshold != 1 )
+            GOERROR;
+        if ( alignment != 1 )
+            GOERROR;
+        if ( H5Pclose(fapl) < 0)
+            GOERROR;
+        if (H5Fclose(fid) < 0)
+            GOERROR;
+
+    }
+
+
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+
+
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+    /*-------------------------------------------------------------------------
+    * test file with userblock
+    *-------------------------------------------------------------------------
+    */
+    TESTING("    file with committed datatypes");
+
+    if(h5repack_init(&pack_options, 0, FALSE) < 0)
+        GOERROR;
+
+    if(h5repack(FNAME17, FNAME17OUT, &pack_options) < 0)
+        GOERROR;
+    if(h5diff(FNAME17, FNAME17OUT, NULL, NULL, &diff_options) > 0)
+        GOERROR;
+    if(h5repack_verify(FNAME17, FNAME17OUT, &pack_options) <= 0)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+
+
+    PASSED();
+
+    /*-------------------------------------------------------------------------
+    * 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, FALSE) < 0)
+        GOERROR;
+    if(h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
+        GOERROR;
+    if(HDstat(FNAME4OUT, &file_stat) < 0)
+        GOERROR;
+    fsize1 = file_stat.st_size;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+
+    /* run it again with metadata option */
+    if(h5repack_init(&pack_options, 0, FALSE) < 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(FNAME4, FNAME4OUT, &pack_options) <= 0)
+        GOERROR;
+    /* record the file size of the output file */
+    if(HDstat(FNAME4OUT, &file_stat) < 0)
+        GOERROR;
+    fsize2 = file_stat.st_size;
+    /* verify second file size is larger than the first one */
+    if(fsize2 <= fsize1)
+        GOERROR;
+    if(h5repack_end(&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+
+    /*-------------------------------------------------------------------------
+    * clean temporary test files
+    *-------------------------------------------------------------------------
+    */
+    {
+        hid_t       fapl;
+
+        fapl = h5_fileaccess();
+        h5_clean_files(H5REPACK_FILENAMES, fapl);
+
+    }
+
+    puts("All h5repack tests passed.");
+
+    h5tools_close();
+
+    return 0;
+
+error:
+    puts("***** H5REPACK TESTS FAILED *****");
+    return 1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_testfiles
+*
+* Purpose: make a test file with all types of HDF5 objects,
+*   datatypes and filters
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_testfiles(void)
+{
+    hid_t  fid;
+    hid_t  fcpl;	/* File creation property list */
+    hid_t  fapl;	/* File access property list */
+    unsigned j;		/* Local index variable */
+
+    /*-------------------------------------------------------------------------
+    * create a file for general copy test
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME0,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_fill(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create another file for general copy test (all datatypes)
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_all_objects(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file for attributes copy test
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME2,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_attributes(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file for hard links test
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_hlinks(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file for layouts test
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME4,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_layout(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file for layout conversion test
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME18, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    if(make_layout2(fid) < 0)
+        goto out;
+
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * for test layout conversions form chunk with unlimited max dims
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate("h5repack_layout3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    if(make_layout3(fid) < 0)
+        goto out;
+
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file for the H5D_ALLOC_TIME_EARLY test
+    *-------------------------------------------------------------------------
+    */
+    if (make_early() < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * create a file with the SZIP filter
+    *-------------------------------------------------------------------------
+    */
+#ifdef H5_HAVE_FILTER_SZIP
+    if((fid = H5Fcreate(FNAME7,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_szip(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+#endif /* H5_HAVE_FILTER_SZIP */
+
+
+    /*-------------------------------------------------------------------------
+    * create a file with the deflate filter
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME8,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_deflate(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with the shuffle filter
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME9,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_shuffle(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with the fletcher32 filter
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME10,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_fletcher32(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with all the filters
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME11,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_all_filters(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with the nbit filter
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME12,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_nbit(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with the scaleoffset filter
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME13,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_scaleoffset(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a big dataset
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME14,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_big(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with external dataset
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME15,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_external(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with userblock
+    *-------------------------------------------------------------------------
+    */
+    if(make_userblock() < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * create a userblock file
+    *-------------------------------------------------------------------------
+    */
+    if(make_userblock_file() < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * create a file with named datatypes
+    *-------------------------------------------------------------------------
+    */
+    if((fid = H5Fcreate(FNAME17,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_named_dtype(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create obj and region reference type datasets (bug1814)
+    * add attribute with int type (bug1726)
+    * add attribute with obj and region reference type (bug1726)
+    *-------------------------------------------------------------------------*/
+    if((fid = H5Fcreate(FNAME_REF,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    /* create reference type datasets */
+    if (make_references(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a file with obj and region references in attribute of compound and 
+    * vlen datatype
+    *-------------------------------------------------------------------------*/
+    if((fid = H5Fcreate(FNAME_ATTR_REF,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+        return -1;
+    if (make_complex_attr_references(fid) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+     * create 8 files with combinations ???
+     *------------------------------------------------------------------------- */
+
+    /* Create file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* 
+     * #0 -- h5repack_latest.h5 
+     * default: strategy=FSM_AGGR, persist=FALSE, threshold=1 
+     * default: inpage=4096
+     */
+    j = 0;
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[j], H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /* 
+     * #1 -- h5repack_default.h5 
+     * default: strategy=FSM_AGGR, persist=FALSE, threshold=1 
+     * default: inpage=4096
+     */
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /* 
+     * #2 -- h5repack_page_persist.h5
+     * Setting: 
+     *	strategy=PAGE, persist=TRUE, threshold=1
+     *	inpage=512
+     *  latest format
+     */
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_page_size(fcpl, (hsize_t)512) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+
+    /* 
+     * #3 -- h5repack_fsm_aggr_persist.h5
+     * Setting:
+     *	strategy=FSM_AGGR, persist=TRUE, threshold=1 
+     *  default: inpage=4096
+     */
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+
+    /* 
+     * #4 -- h5repack_page_threshold.h5
+     * Setting:
+     *	strategy=PAGE, persist=FALSE, threshold=3 
+     *  inpage=8192
+     *  latest format
+     */
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)3) < 0)
+        return -1;
+    if(H5Pset_file_space_page_size(fcpl, (hsize_t)8192) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    /*
+     * #5 -- h5repack_fsm_aggr_threshold.h5
+     * Setting:
+     *	strategy=FSM_AGGR, persist=FALSE, threshold=3 
+     *	inpage=4096
+     */
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)3) < 0)
+        return -1;
+    if(H5Pset_file_space_page_size(fcpl, (hsize_t)FS_PAGESIZE_DEF) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    /* 
+     * #6 -- h5repack_aggr.h5 
+     * Setting:
+     * 	strategy=AGGR, persist=FALSE, threshold=1 
+     *  latest format
+     */
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_AGGR, FALSE, (hsize_t)1) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    /* 
+     * #7 -- h5repack_none.h5
+     * Setting:
+     *	strategy=NONE, persist=FALSE, threshold=1 
+     * 	inpage=8192
+     */
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+    if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, FALSE, (hsize_t)1) < 0)
+        return -1;
+    if(H5Pset_file_space_page_size(fcpl, (hsize_t)8192) < 0)
+        return -1;
+    HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+    if((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    return 0;
+
+out:
+    H5Fclose(fid);
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_all_objects
+*
+* Purpose: make a test file with all types of HDF5 objects
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_all_objects(hid_t loc_id)
+{
+    hid_t   did=-1;
+    hid_t   gid=-1;
+    hid_t   tid=-1;
+    hid_t   rid=-1;
+    hid_t   sid=-1;
+    hid_t   gcplid=-1;
+    hsize_t dims[1]={2};
+    /* compound datatype */
+    typedef struct s_t
+    {
+        int    a;
+        float  b;
+    } s_t;
+
+    /*-------------------------------------------------------------------------
+    * H5G_DATASET
+    *-------------------------------------------------------------------------
+    */
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "dset_referenced", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * H5G_GROUP
+    *-------------------------------------------------------------------------
+    */
+    if ((gid  = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Gclose(gid) < 0)
+        goto out;
+
+    /* create a group "g2" with H5P_CRT_ORDER_TRACKED set */
+    if ((gcplid = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        goto out;
+    if (H5Pset_link_creation_order(gcplid, H5P_CRT_ORDER_TRACKED) < 0)
+        goto out;
+    if ((gid = H5Gcreate2(loc_id, "g2", H5P_DEFAULT, gcplid, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Gclose(gid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5G_TYPE
+    *-------------------------------------------------------------------------
+    */
+
+    /* create a compound datatype */
+    if ((tid = H5Tcreate(H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_INT) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_FLOAT) < 0)
+        goto out;
+    if (H5Tcommit2(loc_id, "type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5G_LINK
+    *-------------------------------------------------------------------------
+    */
+
+    if (H5Lcreate_soft("dset", loc_id, "link", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5G_UDLINK
+    *-------------------------------------------------------------------------
+    */
+    /* Create an external link. Other UD links are not supported by h5repack */
+    if (H5Lcreate_external("file", "path", loc_id, "ext_link", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * write a series of datasetes at root
+    *-------------------------------------------------------------------------
+    */
+
+    if ((rid  = H5Gopen2(loc_id, "/", H5P_DEFAULT)) < 0)
+        goto out;
+    if (write_dset_in(rid,"dset_referenced",loc_id,0) < 0)
+        goto out;
+    if (H5Gclose(rid) < 0)
+        goto out;
+
+    /* close */
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    if (H5Pclose(gcplid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Dclose(did);
+        H5Gclose(gid);
+        H5Gclose(rid);
+        H5Sclose(sid);
+        H5Tclose(tid);
+        H5Pclose(gcplid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_attributes
+*
+* Purpose: make a test file with all types of attributes
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_attributes(hid_t loc_id)
+{
+    hid_t   did=-1;
+    hid_t   gid=-1;
+    hid_t   rid=-1;
+    hid_t   sid=-1;
+    hsize_t dims[1]={2};
+
+    /*-------------------------------------------------------------------------
+    * H5G_DATASET
+    *-------------------------------------------------------------------------
+    */
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if ((did  = H5Dcreate2(loc_id, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5G_GROUP
+    *-------------------------------------------------------------------------
+    */
+    if ((gid  = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if ((rid   = H5Gopen2(loc_id, "/", H5P_DEFAULT)) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * write a series of attributes on the dataset, group, and root group
+    *-------------------------------------------------------------------------
+    */
+
+    if ( write_attr_in(did,"dset",loc_id,0) < 0)
+        goto out;
+    if (write_attr_in(gid,"dset",loc_id,0) < 0)
+        goto out;
+    if (write_attr_in(rid,"dset",loc_id,0) < 0)
+        goto out;
+
+   /* close */
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Gclose(gid) < 0)
+        goto out;
+    if (H5Gclose(rid) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Dclose(did);
+        H5Gclose(gid);
+        H5Gclose(rid);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_hlinks
+*
+* Purpose: make a test file with hard links
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_hlinks(hid_t loc_id)
+{
+    hid_t   g1id=-1;
+    hid_t   g2id=-1;
+    hid_t   g3id=-1;
+    hsize_t dims[2]={3,2};
+    int     buf[3][2]= {{1,1},{1,2},{2,2}};
+
+    /*-------------------------------------------------------------------------
+    * create a dataset and some hard links to it
+    *-------------------------------------------------------------------------
+    */
+
+    if(write_dset(loc_id, 2, dims, "dset", H5T_NATIVE_INT, buf) < 0)
+        return -1;
+    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link1 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        return -1;
+    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link2 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        return -1;
+    if(H5Lcreate_hard(loc_id, "dset", H5L_SAME_LOC, "link3 to dset", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        return -1;
+
+    /*-------------------------------------------------------------------------
+    * create a group and some hard links to it
+    *-------------------------------------------------------------------------
+    */
+
+    if((g1id = H5Gcreate2(loc_id, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if((g2id = H5Gcreate2(g1id, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if((g3id = H5Gcreate2(g2id, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    if(H5Lcreate_hard(loc_id, "g1", g2id, "link1 to g1", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+    if(H5Lcreate_hard(g1id, "g2", g3id, "link1 to g2", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+
+
+    /* close */
+    if (H5Gclose(g1id) < 0)
+        goto out;
+    if (H5Gclose(g2id) < 0)
+        goto out;
+    if (H5Gclose(g3id) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Gclose(g1id);
+        H5Gclose(g2id);
+        H5Gclose(g3id);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_szip
+*
+* Purpose: make a dataset with the SZIP filter
+*
+*-------------------------------------------------------------------------
+*/
+#ifdef H5_HAVE_FILTER_SZIP
+static
+int make_szip(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
+    unsigned szip_pixels_per_block=8;
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+    int      szip_can_encode = 0;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dcpl */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * SZIP
+    *-------------------------------------------------------------------------
+    */
+    /* Make sure encoding is enabled */
+    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1)
+    {
+        szip_can_encode = 1;
+    }
+    if (szip_can_encode)
+    {
+        /* set szip data */
+        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
+            goto out;
+        if (make_dset(loc_id,"dset_szip",sid,dcpl,buf) < 0)
+            goto out;
+    }
+    else
+    {
+        /* WARNING? SZIP is decoder only, can't generate test files */
+    }
+
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+#endif /* H5_HAVE_FILTER_SZIP */
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_deflate
+*
+* Purpose: make a dataset with the deflate filter
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_deflate(hid_t loc_id)
+{
+    hid_t      dcpl; /* dataset creation property list */
+    hid_t      sid;  /* dataspace ID */
+    hsize_t    dims[RANK]={DIM1,DIM2};
+    hsize_t    chunk_dims[RANK]={CDIM1,CDIM2};
+    int        buf[DIM1][DIM2];
+    hobj_ref_t bufref[1]; /* reference */
+    hsize_t    dims1r[1]={1};
+    int        i, j, n;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dcpl */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * GZIP
+    *-------------------------------------------------------------------------
+    */
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    if(H5Pset_deflate(dcpl, 9) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_deflate",sid,dcpl,buf) < 0)
+        goto out;
+
+    /* create a reference to the dataset, test second seeep of file for references */
+
+    if (H5Rcreate(&bufref[0],loc_id,"dset_deflate",H5R_OBJECT,(hid_t)-1) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims1r,"ref",H5T_STD_REF_OBJ,bufref) < 0)
+        goto out;
+#endif
+
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_shuffle
+*
+* Purpose: make a dataset with the shuffle filter
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_shuffle(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dcpl */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * shuffle
+    *-------------------------------------------------------------------------
+    */
+
+    /* set the shuffle filter */
+    if (H5Pset_shuffle(dcpl) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_shuffle",sid,dcpl,buf) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_fletcher32
+*
+* Purpose: make a dataset with the fletcher32 filter
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_fletcher32(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * fletcher32
+    *-------------------------------------------------------------------------
+    */
+
+    /* remove the filters from the dcpl */
+    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
+        goto out;
+    /* set the checksum filter */
+    if (H5Pset_fletcher32(dcpl) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_fletcher32",sid,dcpl,buf) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_nbit
+*
+* Purpose: make a dataset with the nbit filter
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_nbit(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    dtid;
+    hid_t    dsid;
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    dtid = H5Tcopy(H5T_NATIVE_INT);
+    if (H5Tset_precision(dtid,(H5Tget_precision(dtid) - 1)) < 0)
+    {
+        H5Tclose(dtid);
+        goto out;
+    }
+
+    /* remove the filters from the dcpl */
+    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0)
+    {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Pset_nbit(dcpl) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    H5Dclose(dsid);
+
+    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if((dsid = H5Dcreate2(loc_id, "dset_int31", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    H5Dclose(dsid);
+
+    /*-------------------------------------------------------------------------
+    * close
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    if (H5Tclose(dtid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_scaleoffset
+*
+* Purpose: make a dataset with the scaleoffset filter
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_scaleoffset(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    dtid;
+    hid_t    dsid;
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    dtid = H5Tcopy(H5T_NATIVE_INT);
+
+    /* remove the filters from the dcpl */
+    if(H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Pset_scaleoffset(dcpl, H5Z_SO_INT, 31) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if((dsid = H5Dcreate2(loc_id, "dset_scaleoffset", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    H5Dclose(dsid);
+    if((dsid = H5Dcreate2(loc_id, "dset_none", dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
+        H5Tclose(dtid);
+        goto out;
+    }
+    H5Tclose(dtid);
+    H5Dclose(dsid);
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_all_filters
+*
+* Purpose: make a file with all filters
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_all_filters(hid_t loc_id)
+{
+    hid_t    dcpl; /* dataset creation property list */
+    hid_t    sid;  /* dataspace ID */
+    hid_t    dtid;
+    hid_t    dsid;
+#if defined (H5_HAVE_FILTER_SZIP)
+    unsigned szip_options_mask=H5_SZIP_ALLOW_K13_OPTION_MASK|H5_SZIP_NN_OPTION_MASK;
+    unsigned szip_pixels_per_block=8;
+#endif /* H5_HAVE_FILTER_SZIP */
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+#if defined (H5_HAVE_FILTER_SZIP)
+    int szip_can_encode = 0;
+#endif
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    /* set up chunk */
+    if (H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+
+    /* set the shuffle filter */
+    if (H5Pset_shuffle(dcpl) < 0)
+        goto out;
+
+    /* set the checksum filter */
+    if (H5Pset_fletcher32(dcpl) < 0)
+        goto out;
+
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1)
+    {
+        szip_can_encode = 1;
+    }
+    if (szip_can_encode)
+    {
+        /* set szip data */
+        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
+            goto out;
+    } else {
+        /* WARNING? SZIP is decoder only, can't generate test data using szip */
+    }
+#endif
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    if(H5Pset_deflate(dcpl, 9) < 0)
+        goto out;
+#endif
+
+    if (make_dset(loc_id,"dset_all",sid,dcpl,buf) < 0)
+        goto out;
+
+    /* remove the filters from the dcpl */
+    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
+        goto out;
+    /* set the checksum filter */
+    if (H5Pset_fletcher32(dcpl) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_fletcher32",sid,dcpl,buf) < 0)
+        goto out;
+
+
+    /* Make sure encoding is enabled */
+#if defined (H5_HAVE_FILTER_SZIP)
+    if (szip_can_encode)
+    {
+        /* remove the filters from the dcpl */
+        if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
+            goto out;
+        /* set szip data */
+        if(H5Pset_szip (dcpl,szip_options_mask,szip_pixels_per_block) < 0)
+            goto out;
+        if (make_dset(loc_id,"dset_szip",sid,dcpl,buf) < 0)
+            goto out;
+    } else
+    {
+        /* WARNING? SZIP is decoder only, can't generate test dataset */
+    }
+#endif
+
+
+    /* remove the filters from the dcpl */
+    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
+        goto out;
+    /* set the shuffle filter */
+    if (H5Pset_shuffle(dcpl) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_shuffle",sid,dcpl,buf) < 0)
+        goto out;
+
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* remove the filters from the dcpl */
+    if (H5Premove_filter(dcpl,H5Z_FILTER_ALL) < 0)
+        goto out;
+    /* set deflate data */
+    if(H5Pset_deflate(dcpl, 1) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_deflate",sid,dcpl,buf) < 0)
+        goto out;
+#endif
+
+
+
+    /* remove the filters from the dcpl */
+    if (H5Premove_filter(dcpl, H5Z_FILTER_ALL) < 0)
+        goto out;
+    /* set the shuffle filter */
+    if (H5Pset_nbit(dcpl) < 0)
+        goto out;
+    if ((dtid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if (H5Tset_precision(dtid, (H5Tget_precision(dtid) - 1)) < 0)
+        goto out;
+    if((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+
+    /* close */
+    if(H5Tclose(dtid) < 0)
+        return -1;
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_early
+*
+* Purpose: create a file for the H5D_ALLOC_TIME_EARLY test
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_early(void)
+{
+    hsize_t dims[1] ={3000};
+    hsize_t cdims[1]={30};
+    hid_t   fid=-1;
+    hid_t   did=-1;
+    hid_t   sid=-1;
+    hid_t   tid=-1;
+    hid_t   dcpl=-1;
+    int     i;
+    char    name[10];
+    int     iter=100;
+
+    if ((fid = H5Fcreate(FNAME5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+    if (H5Fclose(fid) < 0)
+        goto out;
+
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if (H5Pset_chunk(dcpl, 1, cdims) < 0)
+        goto out;
+    if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+        goto out;
+
+    for(i = 0; i < iter; i++)
+    {
+        if ((fid = H5Fopen(FNAME5, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+            goto out;
+        if ((did = H5Dcreate2(fid, "early", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            goto out;
+        if ((tid = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0)
+            goto out;
+        sprintf(name, "%d", i);
+        if ((H5Tcommit2(fid, name, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+        if (H5Tclose(tid) < 0)
+            goto out;
+        if (H5Dclose(did) < 0)
+            goto out;
+        if (H5Ldelete(fid, "early", H5P_DEFAULT) < 0)
+            goto out;
+        if (H5Fclose(fid) < 0)
+            goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * do the same without close/opening the file and creating the dataset
+    *-------------------------------------------------------------------------
+    */
+
+    if ((fid = H5Fcreate(FNAME6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+
+    for(i = 0; i < iter; i++)
+    {
+        if ((tid = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0)
+            goto out;
+        sprintf(name, "%d", i);
+        if ((H5Tcommit2(fid, name, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+        if (H5Tclose(tid) < 0)
+            goto out;
+    }
+
+    if (H5Sclose(sid) < 0)
+        goto out;
+    if (H5Pclose(dcpl) < 0)
+        goto out;
+    if (H5Fclose(fid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Tclose(tid);
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_layout
+*
+* Purpose: make several datasets with several layouts in location LOC_ID
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_layout(hid_t loc_id)
+{
+    hid_t    dcpl=-1; /* dataset creation property list */
+    hid_t    sid=-1;  /* dataspace ID */
+    hsize_t  dims[RANK]={DIM1,DIM2};
+    hsize_t  chunk_dims[RANK]={CDIM1,CDIM2};
+    int      buf[DIM1][DIM2];
+    int      i, j, n;
+    char     name[6];
+
+
+    for (i=n=0; i<DIM1; i++)
+    {
+        for (j=0; j<DIM2; j++)
+        {
+            buf[i][j]=n++;
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+    * make several dataset with no filters
+    *-------------------------------------------------------------------------
+    */
+    for (i=0; i<4; i++)
+    {
+        sprintf(name,"dset%d",i+1);
+        if (write_dset(loc_id,RANK,dims,name,H5T_NATIVE_INT,buf) < 0)
+            return -1;
+    }
+
+
+    /*-------------------------------------------------------------------------
+    * make several dataset with several layout options
+    *-------------------------------------------------------------------------
+    */
+    /* create a space */
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+    {
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5D_COMPACT
+    *-------------------------------------------------------------------------
+    */
+    if(H5Pset_layout (dcpl,H5D_COMPACT) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_compact",sid,dcpl,buf) < 0)
+    {
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5D_CONTIGUOUS
+    *-------------------------------------------------------------------------
+    */
+    if(H5Pset_layout (dcpl,H5D_CONTIGUOUS) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_contiguous",sid,dcpl,buf) < 0)
+    {
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5D_CHUNKED
+    *-------------------------------------------------------------------------
+    */
+    if(H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
+        goto out;
+    if (make_dset(loc_id,"dset_chunk",sid,dcpl,buf) < 0)
+    {
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: make_layout2
+ *
+ * Purpose: create datasets with contiguous and chunked layouts:
+ *
+ *  contig_small: < 1k, fixed dims datspace
+ *  chunked_small_fixed: < 1k, fixed dims dataspace
+ *
+ *-------------------------------------------------------------------------
+ */
+#define S_DIM1  4
+#define S_DIM2  10
+#define CONTIG_S  "contig_small"
+#define CHUNKED_S_FIX  "chunked_small_fixed"
+
+static
+int make_layout2(hid_t loc_id)
+{
+
+    hid_t    contig_dcpl = -1;   /* dataset creation property list */
+    hid_t    chunked_dcpl = -1; /* dataset creation property list */
+
+    int      i, j, n;    /* Local index variables */
+    int       ret_value = -1;  /* Return value */
+    hid_t    s_sid = -1;  /* dataspace ID */
+
+    hsize_t  s_dims[RANK] = {S_DIM1,S_DIM2};  /* Dataspace (< 1 k) */
+    hsize_t  chunk_dims[RANK] = {S_DIM1/2, S_DIM2/2};  /* Dimension sizes for chunks */
+
+    int      s_buf[S_DIM1][S_DIM2];  /* Temporary buffer */
+
+    for(i = n = 0; i < S_DIM1; i++) {
+        for (j = 0; j < S_DIM2; j++) {
+            s_buf[i][j] = n++;
+        }
+    }
+
+    /* Create dataspaces */
+    if((s_sid = H5Screate_simple(RANK, s_dims, NULL)) < 0)
+        goto out;
+
+    /* Create contiguous datasets */
+    if((contig_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_layout(contig_dcpl, H5D_CONTIGUOUS) < 0)
+        goto out;
+    if(make_dset(loc_id, CONTIG_S, s_sid, contig_dcpl, s_buf) < 0)
+        goto out;
+
+    /* Create chunked datasets */
+    if((chunked_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_chunk(chunked_dcpl, RANK, chunk_dims) < 0)
+        goto out;
+    if(make_dset(loc_id, CHUNKED_S_FIX, s_sid, chunked_dcpl, s_buf) < 0)
+        goto out;
+
+    ret_value = 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(contig_dcpl);
+        H5Pclose(chunked_dcpl);
+    
+        H5Sclose(s_sid);
+
+    } H5E_END_TRY;
+
+    return(ret_value);
+
+} /* make_layout2() */
+
+/*-------------------------------------------------------------------------
+* Function: make_layout3
+*
+* Purpose: make chunked datasets with unlimited max dim and chunk dim is
+*          bigger than current dim. (HDFFV-7933)
+*          Test for converting chunk to chunk , chunk to conti and chunk
+*          to compact.  
+*          - The chunk to chunk changes layout bigger than any current dim 
+*            again. 
+*          - The chunk to compact test dataset bigger than 64K, should
+*            remain original layout.*
+*
+*-------------------------------------------------------------------------
+*/
+#define DIM1_L3 300
+#define DIM2_L3 200
+/* small size */
+#define SDIM1_L3 4
+#define SDIM2_L3 50
+static
+int make_layout3(hid_t loc_id)
+{
+    hid_t    dcpl1=-1; /* dataset creation property list */
+    hid_t    dcpl2=-1; /* dataset creation property list */
+    hid_t    dcpl3=-1; /* dataset creation property list */
+    hid_t    sid1=-1;  /* dataspace ID */
+    hid_t    sid2=-1;  /* dataspace ID */
+    hsize_t  dims1[RANK]={DIM1_L3,DIM2_L3};
+    hsize_t  dims2[RANK]={SDIM1_L3,SDIM2_L3};
+    hsize_t  maxdims[RANK]={H5S_UNLIMITED, H5S_UNLIMITED};
+    hsize_t  chunk_dims1[RANK]={DIM1_L3*2,5};
+    hsize_t  chunk_dims2[RANK]={SDIM1_L3 + 2, SDIM2_L3/2};
+    hsize_t  chunk_dims3[RANK]={SDIM1_L3 - 2, SDIM2_L3/2};
+    int      buf1[DIM1_L3][DIM2_L3];
+    int      buf2[SDIM1_L3][SDIM2_L3];
+    int      i, j, n;
+
+    /* init buf1 */
+    for (i=n=0; i<DIM1_L3; i++)
+    {
+        for (j=0; j<DIM2_L3; j++)
+        {
+            buf1[i][j]=n++;
+        }
+    }
+
+    /* init buf2 */
+    for (i=n=0; i<SDIM1_L3; i++)
+    {
+        for (j=0; j<SDIM2_L3; j++)
+        {
+            buf2[i][j]=n++;
+        }
+    }
+
+    /*-------------------------------------------------------------------------
+    * make chunked dataset with
+    *  - dset maxdims are UNLIMIT
+    *  - a chunk dim is bigger than dset dim
+    *  - dset size bigger than compact max (64K)
+    *-------------------------------------------------------------------------
+    */
+    /* create a space */
+    if((sid1 = H5Screate_simple(RANK, dims1, maxdims)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl1 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+    {
+        goto out;
+    }
+
+    if(H5Pset_chunk(dcpl1, RANK, chunk_dims1) < 0)
+        goto out;
+    if (make_dset(loc_id,"chunk_unlimit1",sid1,dcpl1,buf1) < 0)
+    {
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * make chunked dataset with
+    *  - dset maxdims are UNLIMIT
+    *  - a chunk dim is bigger than dset dim
+    *  - dset size smaller than compact (64K)
+    *-------------------------------------------------------------------------
+    */
+
+    /* create a space */
+    if((sid2 = H5Screate_simple(RANK, dims2, maxdims)) < 0)
+        return -1;
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+
+    if(H5Pset_chunk(dcpl2, RANK, chunk_dims2) < 0)
+        goto out;
+
+    if (make_dset(loc_id,"chunk_unlimit2",sid2,dcpl2,buf2) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * make chunked dataset with
+    *  - dset maxdims are UNLIMIT
+    *  - a chunk dims are smaller than dset dims
+    *  - dset size smaller than compact (64K)
+    *-------------------------------------------------------------------------
+    */
+    /* create a dataset creation property list; the same DCPL is used for all dsets */
+    if ((dcpl3 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+
+    if(H5Pset_chunk(dcpl3, RANK, chunk_dims3) < 0)
+        goto out;
+
+    if (make_dset(loc_id,"chunk_unlimit3",sid2,dcpl3,buf2) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * close space and dcpl
+    *-------------------------------------------------------------------------
+    */
+    if(H5Sclose(sid1) < 0)
+        goto out;
+    if(H5Sclose(sid2) < 0)
+        goto out;
+    if(H5Pclose(dcpl1) < 0)
+        goto out;
+    if(H5Pclose(dcpl2) < 0)
+        goto out;
+    if(H5Pclose(dcpl3) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Pclose(dcpl1);
+        H5Pclose(dcpl2);
+        H5Pclose(dcpl3);
+    } H5E_END_TRY;
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+* Function: make a file with an integer dataset with a fill value
+*
+* Purpose: test copy of fill values
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_fill(hid_t loc_id)
+{
+    hid_t   did=-1;
+    hid_t   sid=-1;
+    hid_t   dcpl;
+    hsize_t dims[2]={3,2};
+    int     buf[3][2]= {{1,1},{1,2},{2,2}};
+    int     fillvalue = 2;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER, write a fill value
+    *-------------------------------------------------------------------------
+    */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue) < 0)
+        goto out;
+    if((sid = H5Screate_simple(2,dims,NULL)) < 0)
+        goto out;
+    if((did = H5Dcreate2(loc_id, "dset_fill", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+
+    /* close */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_big
+*
+* Purpose: used in test read by hyperslabs. Creates a 128MB dataset.
+*  Only 1 1024Kb hyperslab is written.
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_big(hid_t loc_id)
+{
+    hid_t   did=-1;
+    hid_t   f_sid=-1;
+    hid_t   m_sid=-1;
+    hid_t   tid;
+    hid_t   dcpl;
+    hsize_t dims[1]={ H5TOOLS_MALLOCSIZE + 1}; /* dataset dimensions */
+    hsize_t hs_size[1];                     /* hyperslab dimensions */
+    hsize_t hs_start[1];                    /* hyperslab start */
+    hsize_t chunk_dims[1]={1024};           /* chunk dimensions */
+    size_t  size;
+    size_t  nelmts=(size_t)1024;
+    signed  char fillvalue=-1;
+    signed  char *buf=NULL;
+
+    /* write one 1024 byte hyperslab */
+    hs_start[0] = 0;
+    hs_size[0]  = 1024;
+
+    /* create */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_SCHAR, &fillvalue) < 0)
+        goto out;
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        goto out;
+    if((f_sid = H5Screate_simple(1,dims,NULL)) < 0)
+        goto out;
+    if((did = H5Dcreate2(loc_id, "dset", H5T_NATIVE_SCHAR, f_sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if((m_sid = H5Screate_simple(1, hs_size, hs_size)) < 0)
+        goto out;
+    if((tid = H5Dget_type(did)) < 0)
+        goto out;
+    if((size = H5Tget_size(tid))<=0)
+        goto out;
+
+    /* initialize buffer to 0  */
+    buf=(signed  char *) HDcalloc( nelmts, size);
+
+    if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL) < 0)
+        goto out;
+    if (H5Dwrite (did,H5T_NATIVE_SCHAR,m_sid,f_sid,H5P_DEFAULT,buf) < 0)
+        goto out;
+
+    HDfree(buf);
+    buf=NULL;
+
+    /* close */
+    if(H5Sclose(f_sid) < 0)
+        goto out;
+    if(H5Sclose(m_sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(f_sid);
+        H5Sclose(m_sid);
+        H5Dclose(did);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_external
+*
+* Purpose: create a external dataset
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_external(hid_t loc_id)
+{
+    hid_t   did=-1;
+    hid_t   sid=-1;
+    hid_t   dcpl;
+    int     buf[2]={1,2};
+    hsize_t cur_size[1];    /* data space current size  */
+    hsize_t max_size[1];    /* data space maximum size  */
+    hsize_t size;
+
+    cur_size[0] = max_size[0] = 2;
+    size = max_size[0] * sizeof(int);
+
+    /* create */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if(H5Pset_external(dcpl, H5REPACK_EXTFILE, (off_t)0, size) < 0)
+        goto out;
+    if((sid = H5Screate_simple(1,cur_size, max_size)) < 0)
+        goto out;
+    if((did = H5Dcreate2(loc_id, "external", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+
+    /* close */
+    if(H5Sclose(sid) < 0)
+        goto out;
+    if(H5Pclose(dcpl) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+    } H5E_END_TRY;
+    return -1;
+
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_userblock
+*
+* Purpose: create a file for the userblock copying test
+*
+*-------------------------------------------------------------------------
+*/
+static int
+make_userblock(void)
+{
+    hid_t   fid = -1;
+    hid_t   fcpl = -1;
+    int     fd = -1;            /* File descriptor for writing userblock */
+    char    ub[USERBLOCK_SIZE]; /* User block data */
+    ssize_t nwritten;           /* # of bytes written */
+    size_t  u;                  /* Local index variable */
+
+    /* Create file creation property list with userblock set */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto out;
+    if(H5Pset_userblock(fcpl, (hsize_t)USERBLOCK_SIZE) < 0)
+        goto out;
+
+    /* Create file with userblock */
+    if((fid = H5Fcreate(FNAME16, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Fclose(fid) < 0)
+        goto out;
+
+    /* Close file creation property list */
+    if(H5Pclose(fcpl) < 0)
+        goto out;
+
+
+    /* Initialize userblock data */
+    for(u = 0; u < USERBLOCK_SIZE; u++)
+        ub[u] = (char)('a' + (char)(u % 26));
+
+    /* Re-open HDF5 file, as "plain" file */
+    if((fd = HDopen(FNAME16, O_WRONLY, 0644)) < 0)
+        goto out;
+
+    /* Write userblock data */
+    nwritten = HDwrite(fd, ub, (size_t)USERBLOCK_SIZE);
+    HDassert(nwritten == USERBLOCK_SIZE);
+
+    /* Close file */
+    HDclose(fd);
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    if(fd > 0)
+        HDclose(fd);
+
+    return -1;
+} /* end make_userblock() */
+
+/*-------------------------------------------------------------------------
+* Function: verify_userblock
+*
+* Purpose: Verify that the userblock was copied correctly
+*
+*-------------------------------------------------------------------------
+*/
+static int
+verify_userblock( const char* filename)
+{
+    hid_t   fid = -1;
+    hid_t   fcpl = -1;
+    int     fd = -1;            /* File descriptor for writing userblock */
+    char    ub[USERBLOCK_SIZE]; /* User block data */
+    hsize_t ub_size = 0;        /* User block size */
+    ssize_t nread;              /* # of bytes read */
+    size_t  u;                  /* Local index variable */
+
+    /* Open file with userblock */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* Retrieve file creation property list & userblock size */
+    if((fcpl = H5Fget_create_plist(fid)) < 0)
+        goto out;
+    if(H5Pget_userblock(fcpl, &ub_size) < 0)
+        goto out;
+
+    /* Verify userblock size is correct */
+    if(ub_size != USERBLOCK_SIZE)
+        goto out;
+
+    /* Close file creation property list */
+    if(H5Pclose(fcpl) < 0)
+        goto out;
+
+    if(H5Fclose(fid) < 0)
+        goto out;
+
+
+    /* Re-open HDF5 file, as "plain" file */
+    if((fd = HDopen(filename, O_RDONLY, 0)) < 0)
+        goto out;
+
+    /* Read userblock data */
+    nread = HDread(fd, ub, (size_t)USERBLOCK_SIZE);
+    HDassert(nread == USERBLOCK_SIZE);
+
+    /* Verify userblock data */
+    for(u = 0; u < USERBLOCK_SIZE; u++)
+        if(ub[u] != (char)('a' + (u % 26)))
+            goto out;
+
+    /* Close file */
+    HDclose(fd);
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    if(fd > 0)
+        HDclose(fd);
+
+    return -1;
+} /* end verify_userblock() */
+
+
+/*-------------------------------------------------------------------------
+* Function: make_userblock_file
+*
+* Purpose: create a file for the userblock add test
+*
+*-------------------------------------------------------------------------
+*/
+static int
+make_userblock_file(void)
+{
+    int     fd = -1;            /* File descriptor for writing userblock */
+    char    ub[USERBLOCK_SIZE]; /* User block data */
+    ssize_t nwritten;           /* # of bytes written */
+    size_t  u;                  /* Local index variable */
+
+    /* initialize userblock data */
+    for(u = 0; u < USERBLOCK_SIZE; u++)
+        ub[u] = (char)('a' + (char)(u % 26));
+
+    /* open file */
+    if((fd = HDopen(FNAME_UB,O_WRONLY|O_CREAT|O_TRUNC, 0644 )) < 0)
+        goto out;
+
+    /* write userblock data */
+    nwritten = HDwrite(fd, ub, (size_t)USERBLOCK_SIZE);
+    HDassert(nwritten == USERBLOCK_SIZE);
+
+    /* close file */
+    HDclose(fd);
+
+    return 0;
+
+out:
+
+    if(fd > 0)
+        HDclose(fd);
+
+    return -1;
+}
+
+/*-------------------------------------------------------------------------
+* Function: write_dset_in
+*
+* Purpose: write datasets in LOC_ID
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+static
+int write_dset_in(hid_t loc_id,
+                   const char* dset_name, /* for saving reference to dataset*/
+                   hid_t file_id,
+                   int make_diffs /* flag to modify data buffers */)
+{
+    /* compound datatype */
+    typedef struct s_t
+    {
+        char   a;
+        double b;
+    } s_t;
+
+    typedef enum
+    {
+        RED,
+        GREEN
+    } e_t;
+
+    hid_t   did=-1;
+    hid_t   sid=-1;
+    hid_t   tid=-1;
+    hid_t   pid=-1;
+    unsigned i, j;
+    int     val, k, n;
+    float   f;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    hsize_t    dims1r[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    e_t        buf45[2]= {RED,GREEN};          /* enum */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    hsize_t    dims2r[2]={1,1};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[1][1];                                          /* reference */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    hsize_t    dims3r[3]={1,1,1};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+        "rs","tu","vw","xz","AB","CD","EF","GH",
+        "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[1][1][1];    /* reference */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+    * 1D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++)
+            for(j = 0; j < 2; j++)
+                buf1[i][j] = 'z';
+    }
+
+
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"string",tid,buf1) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+
+    /* create hard link */
+    if (H5Lcreate_hard(loc_id, "string", H5L_SAME_LOC, "string_link", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++)
+            buf2[i] = buf2[1] = 0;
+    }
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"bitfield",tid,buf2) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++) {
+            buf3[i].a = 0;
+            buf3[i].b = 0;
+        }
+    }
+
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"opaque",tid,buf2) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++)
+            buf45[i] = GREEN;
+    }
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"compound",tid,buf3) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* object references ( H5R_OBJECT ) */
+    buf4[0]=0;
+    buf4[1]=0;
+    if (dset_name)
+    {
+        if (H5Rcreate(&buf4[0],file_id,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
+            goto out;
+        if (write_dset(loc_id,1,dims1r,"refobj",H5T_STD_REF_OBJ,buf4) < 0)
+            goto out;
+    }
+
+    /* Dataset region reference ( H5R_DATASET_REGION  )  */
+    if (make_dset_reg_ref(loc_id) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"enum",tid,buf45) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc( 2 * sizeof(int));
+    ((int *)buf5[1].p)[0] = 2;
+    ((int *)buf5[1].p)[1] = 3;
+
+    if(make_diffs) {
+        ((int *)buf5[0].p)[0] = 0;
+        ((int *)buf5[1].p)[0] = 0;
+        ((int *)buf5[1].p)[1] = 0;
+    }
+
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf5) < 0)
+        goto out;
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5) < 0)
+        goto out;
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++)
+            for(j = 0; j < 3; j++)
+                buf6[i][j] = 0;
+    }
+
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (write_dset(loc_id, 1, dims, "array", tid, buf6) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    {
+
+        hsize_t TEST_BUFSIZE = (128 * 1024 * 1024);  /* 128MB */
+        double   *dbuf;                           /* information to write */
+        size_t   size;
+        hsize_t  sdims[] = {1};
+        hsize_t  tdims[] = {TEST_BUFSIZE / sizeof(double) + 1};
+        unsigned u;
+
+        /* allocate and initialize array data to write */
+        size = ( TEST_BUFSIZE / sizeof(double) + 1 ) * sizeof(double);
+        dbuf = (double*)HDmalloc( size );
+        if (NULL == dbuf)
+        {
+            printf ("\nError: Cannot allocate memory for \"arrayd\" data buffer size %dMB.\n", (int) size / 1000000 );
+            goto out;
+        }
+
+        for( u = 0; u < TEST_BUFSIZE / sizeof(double) + 1; u++)
+            dbuf[u] = u;
+
+        if (make_diffs)
+        {
+            dbuf[5] = 0;
+            dbuf[6] = 0;
+        }
+
+        /* create a type larger than TEST_BUFSIZE */
+        if ((tid = H5Tarray_create2(H5T_NATIVE_DOUBLE, 1, tdims)) < 0)
+            goto out;
+        size = H5Tget_size(tid);
+        if ((sid = H5Screate_simple(1, sdims, NULL)) < 0)
+            goto out;
+        if ((did = H5Dcreate2(loc_id, "arrayd", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto out;
+#if defined(WRITE_ARRAY)
+        H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dbuf);
+#endif
+
+        /* close */
+        H5Dclose(did);
+        H5Tclose(tid);
+        H5Sclose(sid);
+        HDfree( dbuf );
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs) {
+        for(i = 0; i < 2; i++) {
+            buf7[i] = 0;
+            buf8[i] = 0;
+        }
+    }
+
+    if (write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7) < 0)
+        goto out;
+    if (write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * 2D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf12, 'z', sizeof buf12);
+    }
+
+
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (write_dset(loc_id,2,dims2,"string2D",tid,buf12) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+
+    if (make_diffs)
+    {
+        HDmemset(buf22,0,sizeof buf22);
+    }
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (write_dset(loc_id,2,dims2,"opaque2D",tid,buf22) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf32,0,sizeof buf32);
+    }
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (write_dset(loc_id,2,dims2,"compound2D",tid,buf32) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        if (H5Rcreate(&buf42[0][0], file_id, dset_name, H5R_OBJECT, (hid_t)-1) < 0)
+            goto out;
+        if (write_dset(loc_id, 2, dims2r, "refobj2D", H5T_STD_REF_OBJ, buf42) < 0)
+            goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (write_dset(loc_id,2,dims2,"enum2D",tid,0) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            unsigned l;
+
+            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++) {
+                if(make_diffs)
+                    ((int *)buf52[i][j].p)[l] = 0;
+                else
+                    ((int *)buf52[i][j].p)[l] = n++;
+            }
+        }
+    }
+
+    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf52) < 0)
+        goto out;
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52) < 0)
+        goto out;
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf62,0,sizeof buf62);
+    }
+
+
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (write_dset(loc_id, 2, dims2, "array2D", tid, buf62) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER, write a fill value
+    *-------------------------------------------------------------------------
+    */
+
+
+    if(make_diffs) {
+        HDmemset(buf72, 0, sizeof buf72);
+        HDmemset(buf82, 0, sizeof buf82);
+    }
+
+
+    if ((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto out;
+    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "integer2D", H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf72) < 0)
+        goto out;
+    if (H5Pclose(pid) < 0)
+        goto out;
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if (write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * 3D
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf13,'z',sizeof buf13);
+    }
+
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"string3D",tid,buf13) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                if(make_diffs)
+                    buf23[i][j][k] = 0;
+                else 
+                    buf23[i][j][k] = (char)(n++);
+            }
+        }
+    }
+
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"opaque3D",tid,buf23) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                if(make_diffs) {
+                    buf33[i][j][k].a = 0;
+                    buf33[i][j][k].b = 0;
+                }
+                else {
+                    buf33[i][j][k].a = (char)(n++);
+                    buf33[i][j][k].b = n++;
+                }
+            }
+        }
+    }
+
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"compound3D",tid,buf33) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        if (H5Rcreate(&buf43[0][0][0], file_id, dset_name, H5R_OBJECT, (hid_t)-1) < 0)
+            goto out;
+        if (write_dset(loc_id, 3, dims3r, "refobj3D", H5T_STD_REF_OBJ, buf43) < 0)
+            goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"enum3D",tid,0) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n = 0;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                unsigned l;
+
+                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)(i + 1);
+                for(l = 0; l < i + 1; l++) {
+                    if(make_diffs)
+                        ((int *)buf53[i][j][k].p)[l] = 0;
+                    else
+                        ((int *)buf53[i][j][k].p)[l] = n++;
+                }
+            }
+        }
+    }
+
+    if ((sid = H5Screate_simple(3, dims3, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf53) < 0)
+        goto out;
+
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53) < 0)
+        goto out;
+
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+
+    n = 1;
+    for(i = 0; i < 24; i++) {
+        for(j = 0; j < dimarray[0]; j++) {
+            if(make_diffs)
+                buf63[i][j] = 0;
+            else
+                buf63[i][j] = n++;
+        }
+    }
+
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (write_dset(loc_id, 3, dims3, "array3D", tid, buf63) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    n=1; f=1;
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            for (k = 0; k < 2; k++) {
+                if (make_diffs) {
+                    buf73[i][j][k]=0;
+                    buf83[i][j][k]=0;
+                }
+                else {
+                    buf73[i][j][k]=n++;
+                    buf83[i][j][k]=f++;
+                }
+            }
+        }
+    }
+    if (write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73) < 0)
+        goto out;
+    if (write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Pclose(pid);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Tclose(tid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_dset_reg_ref
+*
+* Purpose: write dataset region references
+*
+*-------------------------------------------------------------------------
+*/
+
+#define SPACE1_RANK 1
+#define SPACE1_DIM1 1
+#define SPACE2_RANK 2
+#define SPACE2_DIM1 10
+#define SPACE2_DIM2 10
+static
+int make_dset_reg_ref(hid_t loc_id)
+{
+    hid_t           did1=-1; /* Dataset ID   */
+    hid_t           did2=-1; /* Dereferenced dataset ID */
+    hid_t           sid1=-1;  /* Dataspace ID #1  */
+    hid_t           sid2=-1;  /* Dataspace ID #2  */
+    hsize_t         dims1[] = {SPACE1_DIM1};
+    hsize_t         dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+    hsize_t         start[SPACE2_RANK];     /* Starting location of hyperslab */
+    hsize_t         stride[SPACE2_RANK];    /* Stride of hyperslab */
+    hsize_t         count[SPACE2_RANK];     /* Element count of hyperslab */
+    hsize_t         block[SPACE2_RANK];     /* Block size of hyperslab */
+    hdset_reg_ref_t *wbuf=NULL;  /* buffer to write to disk */
+    int             *dwbuf=NULL; /* Buffer for writing numeric data to disk */
+    int             i;      /* counting variables */
+    int             retval = -1;  /* return value */
+
+    /* Allocate write & read buffers */
+    wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
+    dwbuf = (int *)HDmalloc(sizeof(int) * SPACE2_DIM1 * SPACE2_DIM2);
+
+    /* Create dataspace for datasets */
+    if ((sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL)) < 0)
+        goto out;
+
+    /* Create a dataset */
+    if ((did2 = H5Dcreate2(loc_id, "dsetreg", H5T_NATIVE_UCHAR, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    for (i = 0; i < SPACE2_DIM1 * SPACE2_DIM2; i++)
+        dwbuf[i] = i * 3;
+
+    /* Write selection to disk */
+    if (H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf) < 0)
+        goto out;
+
+    /* Create dataspace for the reference dataset */
+    if ((sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL)) < 0)
+        goto out;
+
+    /* Create a dataset */
+    if ((did1 = H5Dcreate2(loc_id, "refreg", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+
+    /* Select 6x6 hyperslab for first reference */
+    start[0] = 2; start[1] = 2;
+    stride[0] = 1; stride[1] = 1;
+    count[0] = 6; count[1] = 6;
+    block[0] = 1; block[1] = 1;
+    if (H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block) < 0)
+        goto out;
+
+
+    /* Store dataset region */
+    if (H5Rcreate(&wbuf[0], loc_id, "dsetreg", H5R_DATASET_REGION, sid2) < 0)
+        goto out;
+
+    /* Write selection to disk */
+    if (H5Dwrite(did1,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf) < 0)
+        goto out;
+
+    /* Close all objects */
+    if (H5Sclose(sid1) < 0)
+        goto out;
+    if (H5Dclose(did1) < 0)
+        goto out;
+    if (H5Sclose(sid2) < 0)
+        goto out;
+    if (H5Dclose(did2) < 0)
+        goto out;
+
+    retval = 0;
+
+out:
+    if(wbuf)
+        HDfree(wbuf);
+    if(dwbuf)
+        HDfree(dwbuf);
+
+    H5E_BEGIN_TRY
+    {
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Dclose(did1);
+        H5Dclose(did2);
+    } H5E_END_TRY;
+
+    return retval;
+}
+
+/*-------------------------------------------------------------------------
+* Function: write_attr_in
+*
+* Purpose: write attributes in LOC_ID (dataset, group, named datatype)
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+
+static
+int write_attr_in(hid_t loc_id,
+                   const char* dset_name, /* for saving reference to dataset*/
+                   hid_t fid, /* for reference create */
+                   int make_diffs /* flag to modify data buffers */)
+{
+    /* Compound datatype */
+    typedef struct s_t
+    {
+        char   a;
+        double b;
+    } s_t;
+
+    typedef enum
+    {
+        RED,
+        GREEN
+    } e_t;
+
+    hid_t   aid = -1;
+    hid_t   sid = -1;
+    hid_t   tid = -1;
+    int     val, j, k, n;
+    unsigned i;
+    float   f;
+
+    /* create 1D attributes with dimension [2], 2 elements */
+    hsize_t    dims[1]={2};
+    char       buf1[2][3]= {"ab","de"};        /* string */
+    char       buf2[2]= {1,2};                 /* bitfield, opaque */
+    s_t        buf3[2]= {{1,2},{3,4}};         /* compound */
+    hobj_ref_t buf4[2];                        /* reference */
+    e_t        buf45[2]= {RED,RED};            /* enum */
+    hvl_t      buf5[2];                        /* vlen */
+    hsize_t    dimarray[1]={3};                /* array dimension */
+    int        buf6[2][3]= {{1,2,3},{4,5,6}};  /* array */
+    int        buf7[2]= {1,2};                 /* integer */
+    float      buf8[2]= {1,2};                 /* float */
+
+    /* create 2D attributes with dimension [3][2], 6 elements */
+    hsize_t    dims2[2]={3,2};
+    char       buf12[6][3]= {"ab","cd","ef","gh","ij","kl"};         /* string */
+    char       buf22[3][2]= {{1,2},{3,4},{5,6}};                     /* bitfield, opaque */
+    s_t        buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};   /* compound */
+    hobj_ref_t buf42[3][2];                                          /* reference */
+    e_t        buf452[3][2];                                         /* enum */
+    hvl_t      buf52[3][2];                                          /* vlen */
+    int        buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};  /* array */
+    int        buf72[3][2]= {{1,2},{3,4},{5,6}};                     /* integer */
+    float      buf82[3][2]= {{1,2},{3,4},{5,6}};                     /* float */
+
+    /* create 3D attributes with dimension [4][3][2], 24 elements */
+    hsize_t    dims3[3]={4,3,2};
+    char       buf13[24][3]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+        "rs","tu","vw","xz","AB","CD","EF","GH",
+        "IJ","KL","MN","PQ","RS","TU","VW","XZ"};  /* string */
+    char       buf23[4][3][2];    /* bitfield, opaque */
+    s_t        buf33[4][3][2];    /* compound */
+    hobj_ref_t buf43[4][3][2];    /* reference */
+    e_t        buf453[4][3][2];   /* enum */
+    hvl_t      buf53[4][3][2];    /* vlen */
+    int        buf63[24][3];      /* array */
+    int        buf73[4][3][2];    /* integer */
+    float      buf83[4][3][2];    /* float */
+
+
+    /*-------------------------------------------------------------------------
+    * 1D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            for (j=0; j<2; j++)
+            {
+                buf1[i][j]='z';
+            }
+    }
+    /*
+    buf1[2][2]= {"ab","de"};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <string> and <string>
+    position      string of </g1>  string of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          a                z
+    [ 0 ]          b                z
+    [ 1 ]          d                z
+    [ 1 ]          e                z
+    */
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"string",tid,buf1) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            buf2[i]=buf2[1]=0;
+    }
+    /*
+    buf2[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <bitfield> and <bitfield>
+    position      bitfield of </g1> bitfield of </g1> difference
+    position        opaque of </g1> opaque of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"bitfield",tid,buf2) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    /*
+    buf2[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <opaque> and <opaque>
+    position     opaque of </g1> opaque of </g1> difference
+    position        opaque of </g1> opaque of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"opaque",tid,buf2) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf3[i].a=0; buf3[i].b=0;
+        }
+    }
+
+    /*
+    buf3[2]= {{1,2},{3,4}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <compound> and <compound>
+    position        compound of </g1> compound of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               5               4
+    [ 0 ]          2               5               3
+    [ 1 ]          3               5               2
+    [ 1 ]          4               5               1
+    */
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"compound",tid,buf3) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* object references ( H5R_OBJECT  */
+    if (dset_name)
+    {
+        if (H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
+            goto out;
+        if (H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
+            goto out;
+        if (make_attr(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4) < 0)
+            goto out;
+    }
+
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+        {
+            buf45[i]=GREEN;
+        }
+    }
+    /*
+    buf45[2]= {RED,RED};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <enum> and <enum>
+    position     enum of </g1>   enum of </g1>   difference
+    ------------------------------------------------------------
+    [ 0 ]          RED              GREEN
+    [ 1 ]          RED              GREEN
+    */
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"enum",tid,buf45) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+
+    buf5[0].len = 1;
+    buf5[0].p = HDmalloc( 1 * sizeof(int));
+    ((int *)buf5[0].p)[0]=1;
+    buf5[1].len = 2;
+    buf5[1].p = HDmalloc(2 * sizeof(int));
+    ((int *)buf5[1].p)[0] = 2;
+    ((int *)buf5[1].p)[1] = 3;
+
+    if(make_diffs)
+    {
+        ((int *)buf5[0].p)[0] = 0;
+        ((int *)buf5[1].p)[0] = 0;
+        ((int *)buf5[1].p)[1] = 0;
+    }
+    /*
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    position        vlen of </g1>   vlen of </g1>   difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    [ 1 ]          3               0               3
+    */
+
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((aid = H5Acreate2(loc_id, "vlen", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Awrite(aid, tid, buf5) < 0)
+        goto out;
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf5) < 0)
+        goto out;
+    if (H5Aclose(aid) < 0)
+        goto out;
+    aid = -1;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+    if (H5Sclose(sid) < 0)
+        goto out;
+    sid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        for (i=0; i<2; i++)
+            for (j=0; j<3; j++)
+            {
+                buf6[i][j]=0;
+            }
+    }
+    /*
+    buf6[2][3]= {{1,2,3},{4,5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <array> and <array>
+    position        array of </g1>  array of </g1>  difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 0 ]          2               0               2
+    [ 0 ]          3               0               3
+    [ 1 ]          4               0               4
+    [ 1 ]          5               0               5
+    [ 1 ]          6               0               6
+    */
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (make_attr(loc_id, 1, dims, "array", tid, buf6) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs)
+    {
+        for(i = 0; i < 2; i++)
+        {
+            buf7[i]=0;
+            buf8[i]=0;
+        }
+    }
+
+    /*
+    buf7[2]= {1,2};
+    buf8[2]= {1,2};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    position        integer of </g1> integer of </g1> difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    position        float of </g1>  float of </g1>  difference
+    ------------------------------------------------------------
+    [ 0 ]          1               0               1
+    [ 1 ]          2               0               2
+    */
+    if (make_attr(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7) < 0)
+        goto out;
+    if (make_attr(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * 2D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        HDmemset(buf12, 'z', sizeof buf12);
+    }
+
+    /*
+    buf12[6][2]= {"ab","cd","ef","gh","ij","kl"};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <string2D> and <string2D>
+    position        string2D of </g1> string2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          a                z
+    [ 0 0 ]          b                z
+    [ 0 1 ]          c                z
+    [ 0 1 ]          d                z
+    [ 1 0 ]          e                z
+    [ 1 0 ]          f                z
+    [ 1 1 ]          g                z
+    [ 1 1 ]          h                z
+    [ 2 0 ]          i                z
+    [ 2 0 ]          j                z
+    [ 2 1 ]          k                z
+    [ 2 1 ]          l                z
+    */
+
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"string2D",tid,buf12) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf22,0,sizeof buf22);
+    }
+
+    /*
+    buf22[3][2]= {{1,2},{3,4},{5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <bitfield2D> and <bitfield2D>
+    position        bitfield2D of </g1> bitfield2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"bitfield2D",tid,buf22) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+
+    /*
+    buf22[3][2]= {{1,2},{3,4},{5,6}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <opaque2D> and <opaque2D>
+    position        opaque2D of </g1> opaque2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"opaque2D",tid,buf22) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+    if (make_diffs)
+    {
+        HDmemset(buf32,0,sizeof buf32);
+    }
+
+    /*
+    buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Attribute:   <opaque2D> and <opaque2D>
+    position        opaque2D of </g1> opaque2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"compound2D",tid,buf32) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 3; i++)
+        {
+            for (j = 0; j < 2; j++)
+            {
+                if (H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
+                    goto out;
+            }
+        }
+        if (make_attr(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42) < 0)
+            goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+    for (i=0; i<3; i++)
+    {
+        for (j=0; j<2; j++)
+        {
+            if (make_diffs) buf452[i][j]=GREEN; else buf452[i][j]=RED;
+        }
+    }
+
+    /*
+    Attribute:   <enum2D> and <enum2D>
+    position        enum2D of </g1> enum2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          RED              GREEN
+    [ 0 1 ]          RED              GREEN
+    [ 1 0 ]          RED              GREEN
+    [ 1 1 ]          RED              GREEN
+    [ 2 0 ]          RED              GREEN
+    [ 2 1 ]          RED              GREEN
+    */
+
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"enum2D",tid,buf452) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for(i = 0; i < 3; i++) {
+        for(j = 0; j < 2; j++) {
+            unsigned l;
+
+            buf52[i][j].p = HDmalloc((i + 1) * sizeof(int));
+            buf52[i][j].len = (size_t)(i + 1);
+            for(l = 0; l < i + 1; l++)
+                if(make_diffs)
+                    ((int *)buf52[i][j].p)[l] = 0;
+                else
+                    ((int *)buf52[i][j].p)[l] = n++;
+        }
+    }
+
+    /*
+    position        vlen2D of </g1> vlen2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 1 ]          1               0               1
+    [ 1 0 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 1 1 ]          5               0               5
+    [ 2 0 ]          6               0               6
+    [ 2 0 ]          7               0               7
+    [ 2 0 ]          8               0               8
+    [ 2 1 ]          9               0               9
+    [ 2 1 ]          10              0               10
+    [ 2 1 ]          11              0               11
+    */
+
+    if ((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((aid = H5Acreate2(loc_id, "vlen2D", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Awrite(aid, tid, buf52) < 0)
+        goto out;
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf52) < 0)
+        goto out;
+    if (H5Aclose(aid) < 0)
+        goto out;
+    aid = -1;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+    if (H5Sclose(sid) < 0)
+        goto out;
+    sid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf62,0,sizeof buf62);
+    }
+    /*
+    buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}};
+    $h5diff file7.h5 file6.h5 g1 g1 -v
+    Group:       </g1> and </g1>
+    Attribute:   <array2D> and <array2D>
+    position        array2D of </g1> array2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 0 ]          2               0               2
+    [ 0 0 ]          3               0               3
+    [ 0 1 ]          4               0               4
+    [ 0 1 ]          5               0               5
+    [ 0 1 ]          6               0               6
+    [ 1 0 ]          7               0               7
+    [ 1 0 ]          8               0               8
+    [ 1 0 ]          9               0               9
+    [ 1 1 ]          10              0               10
+    [ 1 1 ]          11              0               11
+    [ 1 1 ]          12              0               12
+    [ 2 0 ]          13              0               13
+    [ 2 0 ]          14              0               14
+    [ 2 0 ]          15              0               15
+    [ 2 1 ]          16              0               16
+    [ 2 1 ]          17              0               17
+    [ 2 1 ]          18              0               18
+    */
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (make_attr(loc_id, 2, dims2, "array2D", tid, buf62) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+
+    if(make_diffs)
+    {
+        HDmemset(buf72, 0, sizeof buf72);
+        HDmemset(buf82, 0, sizeof buf82);
+    }
+    /*
+    Attribute:   <integer2D> and <integer2D>
+    position        integer2D of </g1> integer2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    6 differences found
+    Attribute:   <float2D> and <float2D>
+    position        float2D of </g1> float2D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 ]          1               0               1
+    [ 0 1 ]          2               0               2
+    [ 1 0 ]          3               0               3
+    [ 1 1 ]          4               0               4
+    [ 2 0 ]          5               0               5
+    [ 2 1 ]          6               0               6
+    */
+
+    if (make_attr(loc_id,2,dims2,"integer2D",H5T_NATIVE_INT,buf72) < 0)
+        goto out;
+    if (make_attr(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82) < 0)
+        goto out;
+
+
+    /*-------------------------------------------------------------------------
+    * 3D attributes
+    *-------------------------------------------------------------------------
+    */
+
+    /*-------------------------------------------------------------------------
+    * H5T_STRING
+    *-------------------------------------------------------------------------
+    */
+
+    if (make_diffs)
+    {
+        HDmemset(buf13,'z',sizeof buf13);
+    }
+
+    /*
+    buf13[24][2]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+    "rs","tu","vw","xz","AB","CD","EF","GH",
+    "IJ","KL","MN","PQ","RS","TU","VW","XZ"};
+
+    Attribute:   <string3D> and <string3D>
+    position        string3D of </g1> string3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          a                z
+    [ 0 0 0 ]          b                z
+    [ 0 0 1 ]          c                z
+    [ 0 0 1 ]          d                z
+    [ 0 1 0 ]          e                z
+    [ 0 1 0 ]          f                z
+    [ 0 1 1 ]          g                z
+    [ 0 1 1 ]          h                z
+    [ 0 2 0 ]          i                z
+    [ 0 2 0 ]          j                z
+    [ 0 2 1 ]          k                z
+    [ 0 2 1 ]          l                z
+    [ 1 0 0 ]          m                z
+    [ 1 0 0 ]          n                z
+    [ 1 0 1 ]          p                z
+    [ 1 0 1 ]          q                z
+    [ 1 1 0 ]          r                z
+    [ 1 1 0 ]          s                z
+    [ 1 1 1 ]          t                z
+    [ 1 1 1 ]          u                z
+    [ 1 2 0 ]          v                z
+    [ 1 2 0 ]          w                z
+    [ 1 2 1 ]          x                z
+    [ 2 0 0 ]          A                z
+    [ 2 0 0 ]          B                z
+    [ 2 0 1 ]          C                z
+    [ 2 0 1 ]          D                z
+    [ 2 1 0 ]          E                z
+    [ 2 1 0 ]          F                z
+    [ 2 1 1 ]          G                z
+    [ 2 1 1 ]          H                z
+    [ 2 2 0 ]          I                z
+    [ 2 2 0 ]          J                z
+    [ 2 2 1 ]          K                z
+    [ 2 2 1 ]          L                z
+    [ 3 0 0 ]          M                z
+    [ 3 0 0 ]          N                z
+    [ 3 0 1 ]          P                z
+    [ 3 0 1 ]          Q                z
+    [ 3 1 0 ]          R                z
+    [ 3 1 0 ]          S                z
+    [ 3 1 1 ]          T                z
+    [ 3 1 1 ]          U                z
+    [ 3 2 0 ]          V                z
+    [ 3 2 0 ]          W                z
+    [ 3 2 1 ]          X                z
+    [ 3 2 1 ]          Z                z
+    */
+
+    if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+        goto out;
+    if (H5Tset_size(tid, (size_t)2) < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"string3D",tid,buf13) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_BITFIELD
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                if(make_diffs)
+                    buf23[i][j][k] = 0;
+                else
+                    buf23[i][j][k] = (char)(n++);
+            }
+        }
+    }
+
+    /*
+    position        bitfield3D of </g1> bitfield3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 1 ]          2               0               2
+    [ 0 1 0 ]          3               0               3
+    [ 0 1 1 ]          4               0               4
+    [ 0 2 0 ]          5               0               5
+    [ 0 2 1 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 1 0 ]          9               0               9
+    [ 1 1 1 ]          10              0               10
+    [ 1 2 0 ]          11              0               11
+    [ 1 2 1 ]          12              0               12
+    [ 2 0 0 ]          13              0               13
+    [ 2 0 1 ]          14              0               14
+    [ 2 1 0 ]          15              0               15
+    [ 2 1 1 ]          16              0               16
+    [ 2 2 0 ]          17              0               17
+    [ 2 2 1 ]          18              0               18
+    [ 3 0 0 ]          19              0               19
+    [ 3 0 1 ]          20              0               20
+    [ 3 1 0 ]          21              0               21
+    [ 3 1 1 ]          22              0               22
+    [ 3 2 0 ]          23              0               23
+    [ 3 2 1 ]          24              0               24
+    */
+
+    if ((tid = H5Tcopy(H5T_STD_B8LE)) < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"bitfield3D",tid,buf23) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_OPAQUE
+    *-------------------------------------------------------------------------
+    */
+    if ((tid = H5Tcreate(H5T_OPAQUE, (size_t)1)) < 0)
+        goto out;
+    if (H5Tset_tag(tid, "1-byte opaque type") < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"opaque3D",tid,buf23) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_COMPOUND
+    *-------------------------------------------------------------------------
+    */
+
+    n=1;
+    for(i = 0; i < 4; i++) {
+        for(j = 0; j < 3; j++) {
+            for(k = 0; k < 2; k++) {
+                if(make_diffs) {
+                    buf33[i][j][k].a = 0;
+                    buf33[i][j][k].b = 0;
+                }
+                else {
+                    buf33[i][j][k].a = (char)(n++);
+                    buf33[i][j][k].b = n++;
+                }
+            }
+        }
+    }
+    /*position        compound3D of </g1> compound3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 0 ]          2               0               2
+    [ 0 0 1 ]          3               0               3
+    [ 0 0 1 ]          4               0               4
+    [ 0 1 0 ]          5               0               5
+    [ 0 1 0 ]          6               0               6
+    [ 0 1 1 ]          7               0               7
+    [ 0 1 1 ]          8               0               8
+    [ 0 2 0 ]          9               0               9
+    [ 0 2 0 ]          10              0               10
+    [ 0 2 1 ]          11              0               11
+    [ 0 2 1 ]          12              0               12
+    [ 1 0 0 ]          13              0               13
+    [ 1 0 0 ]          14              0               14
+    [ 1 0 1 ]          15              0               15
+    [ 1 0 1 ]          16              0               16
+    [ 1 1 0 ]          17              0               17
+    [ 1 1 0 ]          18              0               18
+    [ 1 1 1 ]          19              0               19
+    [ 1 1 1 ]          20              0               20
+    [ 1 2 0 ]          21              0               21
+    [ 1 2 0 ]          22              0               22
+    [ 1 2 1 ]          23              0               23
+    [ 1 2 1 ]          24              0               24
+    [ 2 0 0 ]          25              0               25
+    [ 2 0 0 ]          26              0               26
+    [ 2 0 1 ]          27              0               27
+    [ 2 0 1 ]          28              0               28
+    [ 2 1 0 ]          29              0               29
+    [ 2 1 0 ]          30              0               30
+    [ 2 1 1 ]          31              0               31
+    [ 2 1 1 ]          32              0               32
+    [ 2 2 0 ]          33              0               33
+    [ 2 2 0 ]          34              0               34
+    [ 2 2 1 ]          35              0               35
+    [ 2 2 1 ]          36              0               36
+    [ 3 0 0 ]          37              0               37
+    [ 3 0 0 ]          38              0               38
+    [ 3 0 1 ]          39              0               39
+    [ 3 0 1 ]          40              0               40
+    [ 3 1 0 ]          41              0               41
+    [ 3 1 0 ]          42              0               42
+    [ 3 1 1 ]          43              0               43
+    [ 3 1 1 ]          44              0               44
+    [ 3 2 0 ]          45              0               45
+    [ 3 2 0 ]          46              0               46
+    [ 3 2 1 ]          47              0               47
+    [ 3 2 1 ]          48              0               48
+    */
+
+
+
+    if ((tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t))) < 0)
+        goto out;
+    if (H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR) < 0)
+        goto out;
+    if (H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE) < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"compound3D",tid,buf33) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_REFERENCE
+    *-------------------------------------------------------------------------
+    */
+    /* Create references to dataset */
+    if (dset_name)
+    {
+        for (i = 0; i < 4; i++)
+        {
+            for (j = 0; j < 3; j++)
+            {
+                for (k = 0; k < 2; k++)
+                    if (H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,(hid_t)-1) < 0)
+                        goto out;
+            }
+        }
+        if (make_attr(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43) < 0)
+            goto out;
+    }
+
+    /*-------------------------------------------------------------------------
+    * H5T_ENUM
+    *-------------------------------------------------------------------------
+    */
+
+    for (i = 0; i < 4; i++)
+    {
+        for (j = 0; j < 3; j++)
+        {
+            for (k = 0; k < 2; k++)
+            {
+                if (make_diffs)
+                {
+                    buf453[i][j][k]=RED;
+                }
+                else
+                {
+                    buf453[i][j][k]=GREEN;
+                }
+            }
+        }
+    }
+
+    /*
+    position        enum3D of </g1> enum3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          GREEN            RED
+    [ 0 0 1 ]          GREEN            RED
+    [ 0 1 0 ]          GREEN            RED
+    [ 0 1 1 ]          GREEN            RED
+    [ 0 2 0 ]          GREEN            RED
+    [ 0 2 1 ]          GREEN            RED
+    [ 1 0 0 ]          GREEN            RED
+    [ 1 0 1 ]          GREEN            RED
+    [ 1 1 0 ]          GREEN            RED
+    [ 1 1 1 ]          GREEN            RED
+    [ 1 2 0 ]          GREEN            RED
+    [ 1 2 1 ]          GREEN            RED
+    [ 2 0 0 ]          GREEN            RED
+    [ 2 0 1 ]          GREEN            RED
+    [ 2 1 0 ]          GREEN            RED
+    [ 2 1 1 ]          GREEN            RED
+    [ 2 2 0 ]          GREEN            RED
+    [ 2 2 1 ]          GREEN            RED
+    [ 3 0 0 ]          GREEN            RED
+    [ 3 0 1 ]          GREEN            RED
+    [ 3 1 0 ]          GREEN            RED
+    [ 3 1 1 ]          GREEN            RED
+    [ 3 2 0 ]          GREEN            RED
+    [ 3 2 1 ]          GREEN            RED
+    */
+
+
+    if ((tid = H5Tcreate(H5T_ENUM, sizeof(e_t))) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "RED",   (val = 0, &val)) < 0)
+        goto out;
+    if (H5Tenum_insert(tid, "GREEN", (val = 1, &val)) < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"enum3D",tid,buf453) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_VLEN
+    *-------------------------------------------------------------------------
+    */
+
+    /* Allocate and initialize VL dataset to write */
+    n=0;
+    for (i = 0; i < 4; i++)
+    {
+        for (j = 0; j < 3; j++)
+        {
+            for (k = 0; k < 2; k++)
+            {
+                unsigned l;
+
+                buf53[i][j][k].p = HDmalloc((i + 1) * sizeof(int));
+                buf53[i][j][k].len = (size_t)i + 1;
+                for (l = 0; l < i + 1; l++)
+                    if (make_diffs)
+                        ((int *)buf53[i][j][k].p)[l] = 0;
+                    else
+                        ((int *)buf53[i][j][k].p)[l] = n++;
+            }
+        }
+    }
+    /*
+    position        vlen3D of </g1> vlen3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 1 ]          1               0               1
+    [ 0 1 0 ]          2               0               2
+    [ 0 1 1 ]          3               0               3
+    [ 0 2 0 ]          4               0               4
+    [ 0 2 1 ]          5               0               5
+    [ 1 0 0 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 0 1 ]          9               0               9
+    [ 1 1 0 ]          10              0               10
+    etc
+    */
+    if ((sid = H5Screate_simple(3, dims3, NULL)) < 0)
+        goto out;
+    if ((tid = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        goto out;
+    if ((aid = H5Acreate2(loc_id, "vlen3D", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (H5Awrite(aid, tid, buf53) < 0)
+        goto out;
+    if (H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, buf53) < 0)
+        goto out;
+    if (H5Aclose(aid) < 0)
+        goto out;
+    aid = -1;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+    if (H5Sclose(sid) < 0)
+        goto out;
+    sid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_ARRAY
+    *-------------------------------------------------------------------------
+    */
+    n=1;
+    for (i = 0; i < 24; i++)
+    {
+        for (j = 0; j < (int)dimarray[0]; j++)
+        {
+            if (make_diffs) buf63[i][j]=0;
+            else buf63[i][j]=n++;
+        }
+    }
+    /*
+    position        array3D of </g1> array3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 0 ]          2               0               2
+    [ 0 0 0 ]          3               0               3
+    [ 0 0 1 ]          4               0               4
+    [ 0 0 1 ]          5               0               5
+    [ 0 0 1 ]          6               0               6
+    [ 0 1 0 ]          7               0               7
+    etc
+    */
+
+    if ((tid = H5Tarray_create2(H5T_NATIVE_INT, 1, dimarray)) < 0)
+        goto out;
+    if (make_attr(loc_id, 3, dims3, "array3D", tid, buf63) < 0)
+        goto out;
+    if (H5Tclose(tid) < 0)
+        goto out;
+    tid = -1;
+
+    /*-------------------------------------------------------------------------
+    * H5T_INTEGER and H5T_FLOAT
+    *-------------------------------------------------------------------------
+    */
+    n = 1; f = 1;
+    for(i = 0; i < 4; i++)
+    {
+        for(j = 0; j < 3; j++)
+        {
+            for(k = 0; k < 2; k++)
+            {
+                if(make_diffs)
+                {
+                    buf73[i][j][k] = 0;
+                    buf83[i][j][k] = 0;
+                }
+                else
+                {
+                    buf73[i][j][k] = n++;
+                    buf83[i][j][k] = f++;
+                }
+            }
+        }
+    }
+
+    /*
+    position        integer3D of </g1> integer3D of </g1> difference
+    ------------------------------------------------------------
+    [ 0 0 0 ]          1               0               1
+    [ 0 0 1 ]          2               0               2
+    [ 0 1 0 ]          3               0               3
+    [ 0 1 1 ]          4               0               4
+    [ 0 2 0 ]          5               0               5
+    [ 0 2 1 ]          6               0               6
+    [ 1 0 0 ]          7               0               7
+    [ 1 0 1 ]          8               0               8
+    [ 1 1 0 ]          9               0               9
+    [ 1 1 1 ]          10              0               10
+    etc
+    */
+    if (make_attr(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73) < 0)
+        goto out;
+    if (make_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83) < 0)
+        goto out;
+
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Aclose(aid);
+        H5Sclose(sid);
+        H5Tclose(tid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_dset
+*
+* Purpose: utility function to create and write a dataset in LOC_ID
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_dset(hid_t loc_id,
+              const char *name,
+              hid_t sid,
+              hid_t dcpl,
+              void *buf)
+{
+    hid_t   did=-1;
+
+    if ((did = H5Dcreate2(loc_id, name, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        return -1;
+    if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        goto out;
+    if (H5Dclose(did) < 0)
+        return -1;
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: write_dset
+*
+* Purpose: utility function to create and write a dataset in LOC_ID
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+static
+int write_dset( hid_t loc_id,
+               int rank,
+               hsize_t *dims,
+               const char *dset_name,
+               hid_t tid,
+               void *buf )
+{
+    hid_t   did=-1;
+    hid_t   sid=-1;
+
+    if ((sid = H5Screate_simple(rank, dims, NULL)) < 0)
+        return -1;
+    if ((did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if (buf)
+    {
+        if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+            goto out;
+    }
+    if (H5Dclose(did) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+* Function: make_attr
+*
+* Purpose: utility function to write an attribute in LOC_ID
+*
+* Programmer: Pedro Vicente, pvn at ncsa.uiuc.edu
+*
+* Date: November 12, 2003
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_attr(hid_t loc_id,
+              int rank,
+              hsize_t *dims,
+              const char *attr_name,
+              hid_t tid,
+              void *buf)
+{
+    hid_t   aid;
+    hid_t   sid;
+
+    if ((sid = H5Screate_simple(rank, dims, NULL)) < 0)
+        return -1;
+    if ((aid = H5Acreate2(loc_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(buf)
+    {
+        if(H5Awrite(aid, tid, buf) < 0)
+            goto out;
+    }
+    if (H5Aclose(aid) < 0)
+        goto out;
+    if (H5Sclose(sid) < 0)
+        goto out;
+    return 0;
+
+out:
+    H5E_BEGIN_TRY {
+        H5Aclose(aid);
+        H5Sclose(sid);
+    } H5E_END_TRY;
+    return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+* Function: make_named_dtype
+*
+* Purpose: create a file with named datatypes in various configurations
+*
+*-------------------------------------------------------------------------
+*/
+static
+int make_named_dtype(hid_t loc_id)
+{
+    hsize_t dims[1] ={3};
+    hid_t   did=-1;
+    hid_t   aid=-1;
+    hid_t   sid=-1;
+    hid_t   tid=-1;
+    hid_t   gid=-1;
+
+    if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+        goto out;
+
+    /* Create a dataset with an anonymous committed datatype as the first thing
+     * h5repack sees */
+    if((tid = H5Tcopy(H5T_STD_I16LE)) < 0)
+        goto out;
+    if(H5Tcommit_anon(loc_id, tid, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+    if ((did = H5Dcreate2(loc_id, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Tclose(tid) < 0)
+        goto out;
+
+    /* Create an attribute on that dataset that uses a committed datatype in
+     * a remote group */
+    if((gid = H5Gcreate2(loc_id, "M", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    if((gid = H5Gcreate2(loc_id, "M/M", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Gclose(gid) < 0)
+        goto out;
+    if((tid = H5Tcopy(H5T_STD_I16BE)) < 0)
+        goto out;
+    if(H5Tcommit2(loc_id, "/M/M/A", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+    if((aid = H5Acreate2(did, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Aclose(aid) < 0)
+        goto out;
+    if(H5Tclose(tid) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    /* Create a dataset in the remote group that uses a committed datatype in
+     * the root group */
+    if((tid = H5Tcopy(H5T_STD_I32LE)) < 0)
+        goto out;
+    if(H5Tcommit2(loc_id, "N", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+    if((did = H5Dcreate2(loc_id, "M/M/B", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Tclose(tid) < 0)
+        goto out;
+
+    /* Create an attribute on the remote dataset that uses an anonymous
+     * committed datatype */
+    if((tid = H5Tcopy(H5T_STD_I32BE)) < 0)
+        goto out;
+    if(H5Tcommit_anon(loc_id, tid, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        goto out;
+    if((aid = H5Acreate2(did, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Aclose(aid) < 0)
+        goto out;
+
+    /* Create another attribute that uses the same anonymous datatype */
+    if((aid = H5Acreate2(did, "B", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Aclose(aid) < 0)
+        goto out;
+    if(H5Tclose(tid) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    /* Create a dataset in the root group that uses the committed datatype in
+     * the root group */
+    if((tid = H5Topen2(loc_id, "N", H5P_DEFAULT)) < 0)
+        goto out;
+    if((did = H5Dcreate2(loc_id, "O", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Dclose(did) < 0)
+        goto out;
+
+    /* Create 2 attributes on the committed datatype that use that datatype */
+    if((aid =  H5Acreate2(tid, "A", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Aclose(aid) < 0)
+        goto out;
+    if((aid =  H5Acreate2(tid, "B", tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        goto out;
+    if(H5Aclose(aid) < 0)
+        goto out;
+    if(H5Tclose(tid) < 0)
+        goto out;
+
+    /* Close */
+    if (H5Sclose(sid) < 0)
+        goto out;
+
+    return 0;
+
+out:
+    H5E_BEGIN_TRY
+    {
+        H5Tclose(tid);
+        H5Aclose(aid);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Gclose(gid);
+    } H5E_END_TRY;
+    return -1;
+} /* end make_named_dtype() */
+
+/*-------------------------------------------------------------------------
+ * Function: add_attr_with_objref
+ *
+ * Purpose: 
+ *  Create attributes with object reference to objects (dset,
+ *  group, datatype). 
+ *
+ * Note:
+ *  this function depends on locally created objects, however can be modified
+ *  to be independent as necessary
+ *
+ * Programmer: Jonathan Kim (March 23, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t add_attr_with_objref(hid_t file_id, hid_t obj_id)
+{
+    int ret = SUCCEED;
+    int status;
+    /* attr obj ref */
+    hsize_t dim_attr_objref[1]={3};
+    hobj_ref_t data_attr_objref[3];
+
+    /* --------------------------------
+     * add attribute with obj ref type
+     */    
+    /* ref to dset */
+    status = H5Rcreate(&data_attr_objref[0],file_id,NAME_OBJ_DS1,H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* ref to group */
+    status = H5Rcreate(&data_attr_objref[1],file_id,NAME_OBJ_GRP,H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* ref to datatype */
+    status = H5Rcreate(&data_attr_objref[2],file_id,NAME_OBJ_NDTYPE,H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create attr with obj ref type */
+    status = make_attr(obj_id,1,dim_attr_objref,"Attr_OBJREF",H5T_STD_REF_OBJ,data_attr_objref);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+
+    return ret;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: add_attr_with_regref
+ *
+ * Purpose: 
+ *  Create attributes with region reference to dset
+ *
+ * Note:
+ *  this function depends on locally created objects, however can be modified
+ *  to be independent as necessary
+ *
+ * Programmer: Jonathan Kim (March 23, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t add_attr_with_regref(hid_t file_id, hid_t obj_id)
+{
+    int ret = SUCCEED;
+    int status;
+
+    /* attr region ref */
+    hid_t sid_regrefed_dset=0;
+    hsize_t dim_regrefed_dset[2]={3,6};
+    hsize_t coords_regrefed_dset[3][2] = {{0,1},{1,2},{2,3}};
+    hsize_t dim_attr_regref[1]= {1}; /* dim of  */
+    hdset_reg_ref_t data_attr_regref[1];
+
+
+    /* -----------------------------------
+     * add attribute with region ref type
+     */
+    sid_regrefed_dset = H5Screate_simple (2, dim_regrefed_dset, NULL);
+    if (sid_regrefed_dset < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* select elements space for reference */
+    status = H5Sselect_elements (sid_regrefed_dset, H5S_SELECT_SET, (size_t)3, coords_regrefed_dset[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference from elements space */
+    status = H5Rcreate (&data_attr_regref[0], file_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_regrefed_dset);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create attr with region ref type */
+    status = make_attr(obj_id,1,dim_attr_regref,"Attr_REGREF",H5T_STD_REF_DSETREG,data_attr_regref);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if (sid_regrefed_dset > 0)
+        H5Sclose (sid_regrefed_dset);
+
+    return ret;
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_refered_objs
+ *
+ * Purpose: 
+ *  Create objects (dataset, group, datatype) to be referenced
+ *
+ * Note:
+ *  This function is to use along with gen_obj_ref() gen_region_ref() 
+ *
+ * Programmer: Jonathan Kim (March 23, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_refered_objs(hid_t loc_id)
+{
+    int status;
+    herr_t ret = SUCCEED;
+
+    /* objects (dset, group, datatype) */
+    hid_t sid=0, did1=0, gid=0, tid=0;
+    hsize_t dims1[1]={3};
+    int data[3] = {10,20,30};
+
+    /* Dset2 */
+    hid_t sid2=0, did2=0; 
+    hsize_t dims2[2] = {3,16};
+    char  data2[3][16] = {"The quick brown", "fox jumps over ", "the 5 lazy dogs"};
+
+    /*-----------------------
+     * add short dataset 
+     * (define NAME_OBJ_DS1)
+     */
+    sid = H5Screate_simple(1, dims1, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    did1 = H5Dcreate2 (loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (did1 < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*--------------
+     * add group  
+     * (define NAME_OBJ_GRP)
+     */
+    gid = H5Gcreate2 (loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (gid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*----------------------
+     * add named datatype
+     * (define NAME_OBJ_NDTYPE)
+     */
+     tid = H5Tcopy(H5T_NATIVE_INT);
+     status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+     if (status < 0)
+     {
+        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+     }
+
+
+   /*--------------------------
+    * create long dataset
+    * (define NAME_OBJ_DS2)
+    */
+    sid2 = H5Screate_simple (2, dims2, NULL);
+    if (sid2 < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create normal dataset which is refered */
+    did2 = H5Dcreate2 (loc_id, NAME_OBJ_DS2, H5T_STD_I8LE, sid2, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (did2 < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* write values to dataset */
+    status = H5Dwrite (did2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if(did1 > 0)
+        H5Dclose(did1);
+    if(gid > 0)
+        H5Gclose(gid);
+    if(tid > 0)
+        H5Tclose(tid);
+    if(sid > 0)
+        H5Sclose(sid);
+
+    if(did2 > 0)
+        H5Dclose(did2);
+    if(sid2 > 0)
+        H5Sclose(sid2);
+    return ret;
+    
+}
+
+/*-------------------------------------------------------------------------
+ * Function: gen_obj_ref
+ *
+ * Purpose: 
+ *  Generate object references to objects (dataset,group and named datatype)
+ *
+ * Note:
+ *  copied from h5copygentest.c and upate to create named datatype  
+ *
+ * Programmer: Jonathan Kim (March 18, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_obj_ref(hid_t loc_id)
+{
+    int status;
+    herr_t ret = SUCCEED;
+
+    hid_t sid=0, oid=0;
+    hsize_t dims_dset_objref[1]={3};
+
+    /* attr with int type */
+    hsize_t dim_attr_int[1]={2};
+    int data_attr_int[2] = {10,20}; 
+
+    /* write buffer for obj reference */
+    hobj_ref_t objref_buf[3];
+
+    /*---------------------------------------------------------
+     * create obj references to the previously created objects.
+     * Passing -1 as reference is an object.*/
+
+    /* obj ref to dataset */
+    status = H5Rcreate (&objref_buf[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* obj ref to group */
+    status = H5Rcreate (&objref_buf[1], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* obj ref to named-datatype */
+    status = H5Rcreate (&objref_buf[2], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*---------------------------------------------------------
+     * create dataset contain references 
+     */
+    sid = H5Screate_simple (1, dims_dset_objref, NULL);
+    if (sid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    oid = H5Dcreate2 (loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (oid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, objref_buf);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* add attribute with int type */
+    if (make_attr(oid,1,dim_attr_int,"integer",H5T_NATIVE_INT,data_attr_int) < 0)
+        goto out;
+
+    /* add attribute with obj ref */
+    status = add_attr_with_objref(loc_id, oid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* add attribute with region ref */
+    status = add_attr_with_regref(loc_id, oid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if(oid > 0)
+        H5Dclose(oid);
+    if(sid > 0)
+        H5Sclose(sid);
+
+    return ret;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: gen_region_ref
+ *
+ * Purpose: Generate dataset region references
+ *
+ * Note:
+ *  copied from h5copygentest.c 
+ *
+ * Programmer: Jonathan Kim (March 18, 2010)
+ *------------------------------------------------------------------------*/
+static herr_t gen_region_ref(hid_t loc_id)
+{
+    int status;
+    herr_t ret = SUCCEED;
+
+    /* target dataset */
+    hid_t sid_trg=0; 
+    hsize_t dims_trg[2] = {3,16};
+
+    /* dset with region ref type */
+    hid_t sid_ref=0, oid_ref=0; 
+
+    /* region ref to target dataset */
+    hsize_t coords[4][2] = { {0,1}, {2,11}, {1,0}, {2,4} };
+    hdset_reg_ref_t  rr_data[2];
+    hsize_t start[2] = {0,0};
+    hsize_t stride[2] = {2,11};
+    hsize_t count[2] = {2,2};
+    hsize_t block[2] = {1,3};
+    hsize_t dims1[1] = {2};
+
+    /* attr with int type */
+    hsize_t dim_attr_int[1]={2};
+    int data_attr_int[2] = {10,20}; 
+
+    sid_trg = H5Screate_simple (2, dims_trg, NULL);
+    if (sid_trg < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* select elements space for reference */
+    status = H5Sselect_elements (sid_trg, H5S_SELECT_SET, (size_t)4, coords[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference from elements space */
+    status = H5Rcreate (&rr_data[0], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* select hyperslab space for reference */
+    status = H5Sselect_hyperslab (sid_trg, H5S_SELECT_SET, start, stride, count, block);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference from hyperslab space */
+    status = H5Rcreate (&rr_data[1], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* Create dataspace. */
+    sid_ref = H5Screate_simple (1, dims1, NULL);
+    if (sid_ref < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* create region reference dataset */
+    oid_ref = H5Dcreate2 (loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid_ref, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
+    if (oid_ref < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* write data as region references */
+    status = H5Dwrite (oid_ref, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* add attribute with int type */
+    if (make_attr(oid_ref,1,dim_attr_int,"integer",H5T_NATIVE_INT,data_attr_int) < 0)
+        goto out;
+
+    /* add attribute with obj ref */
+    status = add_attr_with_objref(loc_id, oid_ref);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* add attribute with region ref */
+    status = add_attr_with_regref(loc_id, oid_ref);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    if (oid_ref > 0)
+        H5Dclose (oid_ref);
+    if (sid_ref > 0)
+        H5Sclose (sid_ref);
+    if (sid_trg > 0)
+        H5Sclose (sid_trg); 
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_references
+*
+* Purpose: create a file with obj and region references 
+*
+* Programmer: Jonathan Kim (March 18, 2010)
+*-------------------------------------------------------------------------
+*/
+static herr_t make_references(hid_t loc_id)
+{
+    herr_t ret = SUCCEED;
+    herr_t status;
+
+    /* add target objects */
+    status = gen_refered_objs(loc_id);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Failed to generate referenced object.\n");
+        ret = FAIL;
+    } 
+
+    /* add object reference */
+    status = gen_obj_ref(loc_id);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Failed to generate object reference.\n");
+        ret = FAIL;
+    }
+
+    /* add region reference */
+    status = gen_region_ref(loc_id);
+    if (status == FAIL)
+    {
+        fprintf(stderr, "Failed to generate region reference.\n");
+        ret = FAIL;
+    }
+
+    return ret;
+}
+
+/*-------------------------------------------------------------------------
+* Function: make_complex_attr_references
+*
+* Purpose: 
+*   create a file with :
+*   1. obj ref in attribute of compound type
+*   2. region ref in attribute of compound type
+*   3. obj ref in attribute of vlen type
+*   4. region ref in attribute of vlen type
+*
+* Programmer: Jonathan (March 25, 2010)
+*-------------------------------------------------------------------------
+*/
+/* obj dset */
+#define RANK_OBJ 2
+#define DIM0_OBJ 6
+#define DIM1_OBJ 10
+/* container dset */
+#define RANK_DSET 1
+#define DIM_DSET 4
+/* 1. obj references in compound attr */
+#define RANK_COMP_OBJREF 1
+#define DIM_COMP_OBJREF 3   /* for dataset, group, datatype */
+/* 2. region references in compound attr */
+#define RANK_COMP_REGREF 1
+#define DIM_COMP_REGREF 1   /* for element region */
+/* 3. obj references in vlen attr */
+#define RANK_VLEN_OBJREF 1
+#define DIM_VLEN_OBJREF 3   /* for dataset, group, datatype */
+#define LEN0_VLEN_OBJREF 1  /* dataset */
+#define LEN1_VLEN_OBJREF 1  /* group */
+#define LEN2_VLEN_OBJREF 1  /* datatype */
+/* 4. region references in vlen attr */
+#define RANK_VLEN_REGREF 1
+#define DIM_VLEN_REGREF 1   /*  for element region */
+#define LEN0_VLEN_REGREF 1  /* element region  */ 
+
+static herr_t make_complex_attr_references(hid_t loc_id)
+{
+    herr_t ret = SUCCEED;
+    herr_t status; 
+    /* 
+     * for objects 
+     */
+    hid_t objgid=0, objdid=0, objtid=0, objsid=0;
+    hsize_t obj_dims[RANK_OBJ] = {DIM0_OBJ, DIM1_OBJ};
+    int obj_data[DIM0_OBJ][DIM1_OBJ]=
+        {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
+         {10,11,12,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,47,48,49},
+         {50,51,52,53,54,55,56,57,58,59}};
+
+    /*
+     * group main
+     */
+    hid_t main_gid=0;
+    /*
+     * dataset which the attribute will be attached to
+     */
+    hsize_t main_dset_dims[RANK_DSET] = {DIM_DSET};
+    hid_t main_sid=0, main_did=0;
+    /* 
+     * 1. obj references in compound attr 
+     */
+    hid_t comp_objref_tid=0, comp_objref_aid=0;
+    typedef struct comp_objref_t {
+        hobj_ref_t val_objref;
+        int val_int;
+    } comp_objref_t;
+    comp_objref_t comp_objref_data[DIM_COMP_OBJREF];
+    hid_t comp_objref_attr_sid=0;
+    hsize_t comp_objref_dim[RANK_COMP_OBJREF] = {DIM_COMP_OBJREF};
+
+    /* 
+     * 2. region references in compound attr 
+     */
+    hid_t comp_regref_tid=0, comp_regref_aid=0;
+    typedef struct comp_regref_t {
+        hdset_reg_ref_t val_regref;
+        int val_int;
+    } comp_regref_t;
+    comp_regref_t comp_regref_data[DIM_COMP_REGREF];
+    hid_t comp_regref_attr_sid=0;
+    hsize_t comp_regref_dim[RANK_COMP_REGREF] = {DIM_COMP_REGREF};
+    hsize_t coords[4][2] = { {0,1}, {2,3}, {3,4}, {4,5} };
+    
+    /* 
+     * 3. obj references in vlen attr 
+     */
+    hid_t vlen_objref_attr_tid=0, vlen_objref_attr_sid=0;
+    hid_t vlen_objref_attr_id=0;
+    hvl_t vlen_objref_data[DIM_VLEN_OBJREF];
+    hsize_t vlen_objref_dims[RANK_VLEN_OBJREF] = {DIM_VLEN_OBJREF};
+
+    /* 
+     * 4. region references in vlen attr
+     */
+    hid_t vlen_regref_attr_tid=0, vlen_regref_attr_sid=0;
+    hid_t vlen_regref_attr_id=0;
+    hvl_t vlen_regref_data[DIM_VLEN_REGREF];
+    hsize_t vlen_regref_dim[RANK_VLEN_REGREF] = {DIM_VLEN_REGREF};
+
+
+    /* ---------------------------------------
+     * create objects which to be referenced 
+     */
+    /* object1 group */
+    objgid = H5Gcreate2(loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* object2 dataset */
+    objsid = H5Screate_simple(RANK_OBJ, obj_dims, NULL);
+    objdid = H5Dcreate2(loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, objsid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Dwrite(objdid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* object3 named datatype */
+    objtid = H5Tcopy(H5T_NATIVE_INT);
+    status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, objtid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+
+    /* ---------------------------------------------
+     *  Put testing objs in this group 
+     * create group contain dataset with attribute and the attribute has
+     * compound type which contain obj and region reference */
+    main_gid = H5Gcreate2(loc_id, "group_main", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    if (main_gid < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*----------------------------------------------------------
+     * create dataset which the attribute will be attached to
+     */
+    main_sid = H5Screate_simple(RANK_DSET, main_dset_dims, NULL);
+
+    main_did = H5Dcreate2(main_gid, "dset_main", H5T_NATIVE_INT, main_sid, H5P_DEFAULT,H5P_DEFAULT, H5P_DEFAULT);
+    
+    status = H5Dwrite(main_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------
+     * 1. create obj references in a attribute of compound type
+     */
+
+    /* 
+     * create compound type for attribute 
+     */
+    comp_objref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_objref_t));
+
+    H5Tinsert(comp_objref_tid, "value_objref", HOFFSET(comp_objref_t, val_objref), H5T_STD_REF_OBJ);
+    H5Tinsert(comp_objref_tid, "value_int", HOFFSET(comp_objref_t, val_int), H5T_NATIVE_INT);
+
+    /*
+     * Create the object references into compound type
+     */
+     /* references to dataset */
+    status = H5Rcreate (&(comp_objref_data[0].val_objref), loc_id, NAME_OBJ_DS1, H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    comp_objref_data[0].val_int = 0;
+
+     /* references to group */
+    status = H5Rcreate (&(comp_objref_data[1].val_objref), loc_id, NAME_OBJ_GRP, H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    comp_objref_data[1].val_int = 10;
+
+     /* references to datatype */
+    status = H5Rcreate (&(comp_objref_data[2].val_objref), loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT,(hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    comp_objref_data[2].val_int = 20;
+    
+    /* 
+     * create attribute and write the object ref
+     */
+    comp_objref_attr_sid = H5Screate_simple (RANK_COMP_OBJREF, comp_objref_dim, NULL);
+    comp_objref_aid = H5Acreate2 (main_did, "Comp_OBJREF", comp_objref_tid, comp_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite (comp_objref_aid, comp_objref_tid, comp_objref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------
+     * 2. create region references in attribute of compound type
+     */
+    /*
+     * create compound type for attribute
+     */
+    comp_regref_tid = H5Tcreate (H5T_COMPOUND, sizeof(comp_regref_t));
+
+    H5Tinsert(comp_regref_tid, "value_regref", HOFFSET(comp_regref_t, val_regref), H5T_STD_REF_DSETREG);
+    H5Tinsert(comp_regref_tid, "value_int", HOFFSET(comp_regref_t, val_int), H5T_NATIVE_INT);
+
+    /*
+     * create the region reference 
+     */
+    status = H5Sselect_elements (objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    status = H5Rcreate (&(comp_regref_data[0].val_regref), loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    comp_regref_data[0].val_int = 10;
+
+    /*
+     * create attribute and write the region ref
+     */
+    comp_regref_attr_sid = H5Screate_simple (RANK_COMP_REGREF, comp_regref_dim, NULL);
+    comp_regref_aid = H5Acreate2 (main_did, "Comp_REGREF", comp_regref_tid, comp_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite (comp_regref_aid, comp_regref_tid, comp_regref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+
+    /*-------------------------------------------------------------------
+     * 3. create obj references in attribute of vlen type
+     */
+    /*
+     * prepare vlen data
+     */
+     vlen_objref_data[0].len = LEN0_VLEN_OBJREF;
+     vlen_objref_data[0].p = HDmalloc (vlen_objref_data[0].len * sizeof(hobj_ref_t));
+     vlen_objref_data[1].len = LEN1_VLEN_OBJREF;
+     vlen_objref_data[1].p = HDmalloc (vlen_objref_data[1].len * sizeof(hobj_ref_t));
+     vlen_objref_data[2].len = LEN2_VLEN_OBJREF;
+     vlen_objref_data[2].p = HDmalloc (vlen_objref_data[2].len * sizeof(hobj_ref_t));
+
+     /* 
+      * create obj references 
+      */
+     /* reference to dataset */
+     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+     /* reference to group */
+     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[1].p)[0], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1); 
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+     /* reference to datatype */
+     status = H5Rcreate (&((hobj_ref_t*)vlen_objref_data[2].p)[0], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+     
+     /* 
+      * create vlen type with obj reference
+      */
+     vlen_objref_attr_tid = H5Tvlen_create (H5T_STD_REF_OBJ);
+     vlen_objref_attr_sid = H5Screate_simple (RANK_VLEN_OBJREF, vlen_objref_dims, NULL);
+
+     /*
+     * create attribute and write the object reference 
+     */
+     vlen_objref_attr_id = H5Acreate2(main_did, "Vlen_OBJREF", vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
+     status = H5Awrite (vlen_objref_attr_id, vlen_objref_attr_tid, vlen_objref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /* close resource for vlen data */
+    status = H5Dvlen_reclaim (vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, vlen_objref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+    /*-------------------------------------------------------------------
+     * 4. create region references in a attribute of vlen type
+     */
+     
+    /*
+     * prepare vlen data
+     */
+    vlen_regref_data[0].len = LEN0_VLEN_REGREF;
+    vlen_regref_data[0].p = HDmalloc (vlen_regref_data[0].len * sizeof(hdset_reg_ref_t));
+
+    /*
+     * create region reference 
+     */
+    status = H5Sselect_elements(objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    status = H5Rcreate (&((hdset_reg_ref_t*)vlen_regref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    
+    /* 
+     * create vlen type with region reference
+     */
+    vlen_regref_attr_tid = H5Tvlen_create(H5T_STD_REF_DSETREG);
+    vlen_regref_attr_sid = H5Screate_simple(RANK_VLEN_REGREF, vlen_regref_dim, NULL);
+    
+    /*
+     * create attribute and write the region reference 
+     */
+    vlen_regref_attr_id = H5Acreate2(main_did, "Vlen_REGREF", vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
+    status = H5Awrite(vlen_regref_attr_id, vlen_regref_attr_tid, vlen_regref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+    
+    /* close resource for vlen data */
+    status = H5Dvlen_reclaim (vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, vlen_regref_data);
+    if (status < 0)
+    {
+        fprintf(stderr, "Error: %s %d> H5Dvlen_reclaim failed.\n", FUNC, __LINE__);
+        ret = FAIL;
+        goto out;
+    }
+
+out:
+    /* release resources */
+    if (objgid > 0)
+        H5Gclose(objgid);
+    if (objsid > 0)
+        H5Sclose(objsid);
+    if (objdid > 0)
+        H5Dclose(objdid);
+    if (objtid > 0)
+        H5Tclose(objtid);
+
+    if (main_gid > 0)
+        H5Gclose(main_gid);
+    if (main_sid > 0)
+        H5Sclose(main_sid);
+    if (main_did > 0)
+        H5Dclose(main_did);
+    /* comp obj ref */
+    if (comp_objref_tid > 0)
+        H5Tclose(comp_objref_tid);
+    if (comp_objref_aid > 0)
+        H5Aclose(comp_objref_aid);
+    if (comp_objref_attr_sid > 0)
+        H5Sclose(comp_objref_attr_sid);
+    /* comp region ref */
+    if (comp_regref_tid > 0)
+        H5Tclose(comp_regref_tid);
+    if (comp_regref_aid > 0)
+        H5Aclose(comp_regref_aid);
+    if (comp_regref_attr_sid > 0)
+        H5Sclose(comp_regref_attr_sid);
+    /* vlen obj ref */
+    if (vlen_objref_attr_id > 0)
+        H5Aclose(vlen_objref_attr_id);
+    if (vlen_objref_attr_sid > 0)
+        H5Sclose(vlen_objref_attr_sid);
+    if (vlen_objref_attr_tid > 0)
+        H5Tclose(vlen_objref_attr_tid);
+    /* vlen region ref */
+    if (vlen_regref_attr_id > 0)
+        H5Aclose(vlen_regref_attr_id);
+    if (vlen_regref_attr_sid > 0)
+        H5Sclose(vlen_regref_attr_sid);
+    if (vlen_regref_attr_tid > 0)
+        H5Tclose(vlen_regref_attr_tid);
+
+    return ret;
+}
diff --git a/tools/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl b/tools/test/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
similarity index 100%
rename from tools/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
rename to tools/test/h5repack/testfiles/1_vds.h5-vds_dset_chunk20x10x5-v.ddl
diff --git a/tools/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl b/tools/test/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
similarity index 100%
rename from tools/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
rename to tools/test/h5repack/testfiles/2_vds.h5-vds_chunk3x6x9-v.ddl
diff --git a/tools/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl b/tools/test/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
similarity index 100%
rename from tools/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
rename to tools/test/h5repack/testfiles/3_1_vds.h5-vds_chunk2x5x8-v.ddl
diff --git a/tools/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl b/tools/test/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl
similarity index 100%
rename from tools/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl
rename to tools/test/h5repack/testfiles/4_vds.h5-vds_compa-v.ddl
diff --git a/tools/test/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl b/tools/test/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
new file mode 100644
index 0000000..54bf26c
--- /dev/null
+++ b/tools/test/h5repack/testfiles/4_vds.h5-vds_conti-v.ddl
@@ -0,0 +1,59 @@
+HDF5 "out-vds_conti.4_vds.h5" {
+DATASET "vds_dset" {
+   DATATYPE  H5T_STD_I32LE
+   DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( 9, 4, 4 ) }
+   STORAGE_LAYOUT {
+      CONTIGUOUS
+      SIZE 576
+      OFFSET 2048
+   }
+   FILTERS {
+      NONE
+   }
+   FILLVALUE {
+      FILL_TIME H5D_FILL_TIME_IFSET
+      VALUE  -9
+   }
+   ALLOCATION_TIME {
+      H5D_ALLOC_TIME_LATE
+   }
+   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/h5repack/testfiles/README b/tools/test/h5repack/testfiles/README
similarity index 100%
rename from tools/h5repack/testfiles/README
rename to tools/test/h5repack/testfiles/README
diff --git a/tools/test/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl b/tools/test/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
new file mode 100644
index 0000000..75f54fa
--- /dev/null
+++ b/tools/test/h5repack/testfiles/deflate_limit.h5repack_layout.h5.ddl
@@ -0,0 +1,130 @@
+HDF5 "out-deflate_limit.h5repack_layout.h5" {
+GROUP "/" {
+   DATASET "dset1" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset3" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset4" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_chunk" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 20, 10 )
+         SIZE 1283 (2.494:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_compact" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_contiguous" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 1150 (2.783:1 COMPRESSION)
+      }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 1 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+}
+}
diff --git a/tools/test/h5repack/testfiles/h5repack-help.txt b/tools/test/h5repack/testfiles/h5repack-help.txt
new file mode 100644
index 0000000..69b1644
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack-help.txt
@@ -0,0 +1,136 @@
+usage: h5repack [OPTIONS] file1 file2
+  file1                    Input HDF5 File
+  file2                    Output HDF5 File
+  OPTIONS
+   -h, --help              Print a usage message and exit
+   -v, --verbose           Verbose mode, print object information
+   -V, --version           Print version number and exit
+   -n, --native            Use a native HDF5 type when repacking
+   -L, --latest            Use latest version of file format
+   -c L1, --compact=L1     Maximum number of links in header messages
+   -d L2, --indexed=L2     Minimum number of links in the indexed format
+   -s S[:F], --ssize=S[:F] Shared object header message minimum size
+   -m M, --minimum=M       Do not apply the filter to datasets smaller than M
+   -e E, --file=E          Name of file E with the -f and -l options
+   -u U, --ublock=U        Name of file U with user block data to be added
+   -b B, --block=B         Size of user block to be added
+   -M A, --metadata_block_size=A  Metadata block size for H5Pset_meta_block_size
+   -t T, --threshold=T     Threshold value for H5Pset_alignment
+   -a A, --alignment=A     Alignment value for H5Pset_alignment
+   -f FILT, --filter=FILT  Filter type
+   -l LAYT, --layout=LAYT  Layout type
+   -S FS_STRATEGY, --fs_strategy=FS_STRATEGY  File space management strategy for H5Pset_file_space_strategy
+   -P FS_PERSIST, --fs_persist=FS_PERSIST  Persisting or not persisting free-space for H5Pset_file_space_strategy
+   -T FS_THRESHOLD, --fs_threshold=FS_THRESHOLD   Free-space section threshold for H5Pset_file_space_strategy
+   -G FS_PAGESIZE, --fs_pagesize=FS_PAGESIZE   File space page size for H5Pset_file_space_page_size
+
+    M - is an integer greater than 1, size of dataset in bytes (default is 0) 
+    E - is a filename.
+    S - is an integer
+    U - is a filename.
+    T - is an integer
+    A - is an integer greater than zero
+    B - is the user block size, any value that is 512 or greater and is
+        a power of 2 (1024 default)
+    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
+
+     --enable-error-stack Prints messages from the HDF5 error stack as they
+                          occur.
+
+    FS_STRATEGY is a string indicating the file space strategy used:
+        FSM_AGGR:
+               The mechanisms used in managing file space are free-space managers, aggregators and virtual file driver.
+        PAGE:
+               The mechanisms used in managing file space are free-space managers with embedded paged aggregation and virtual file driver.
+        AGGR:
+               The mechanisms used in managing file space are aggregators and virtual file driver.
+        NONE:
+               The mechanisms used in managing file space are virtual file driver.
+        The default strategy when not set is FSM_AGGR without persisting free-space.
+
+    FS_PERSIST is 1 to persisting free-space or 0 to not persisting free-space.
+      The default when not set is not persisting free-space.
+      The value is ignored for AGGR and NONE strategies.
+
+    FS_THRESHOLD is the minimum size (in bytes) of free-space sections to be tracked by the library.
+      The default when not set is 1.
+      The value is ignored for AGGR and NONE strategies.
+
+    FS_PAGESIZE is the size (in bytes) >=512 that is used by the library when the file space strategy PAGE is used.
+      The default when not set is 4096.
+
+    FILT - is a string with the format:
+
+      <list of objects>:<name of filter>=<filter parameters>
+
+      <list of objects> is a comma separated list of object names, meaning apply
+        compression only to those objects. If no names are specified, the filter
+        is applied to all objects
+      <name of filter> can be:
+        GZIP, to apply the HDF5 GZIP filter (GZIP compression)
+        SZIP, to apply the HDF5 SZIP filter (SZIP compression)
+        SHUF, to apply the HDF5 shuffle filter
+        FLET, to apply the HDF5 checksum filter
+        NBIT, to apply the HDF5 NBIT filter (NBIT compression)
+        SOFF, to apply the HDF5 Scale/Offset filter
+        UD,   to apply a user defined filter
+        NONE, to remove all filters
+      <filter parameters> is optional filter parameter information
+        GZIP=<deflation level> from 1-9
+        SZIP=<pixels per block,coding> pixels per block is a even number in
+            2-32 and coding method is either EC or NN
+        SHUF (no parameter)
+        FLET (no parameter)
+        NBIT (no parameter)
+        SOFF=<scale_factor,scale_type> scale_factor is an integer and scale_type
+            is either IN or DS
+        UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>
+            required values for filter_number,cd_value_count,value_1
+            optional values for value_2 to value_N
+        NONE (no parameter)
+
+    LAYT - is a string with the format:
+
+      <list of objects>:<layout type>=<layout parameters>
+
+      <list of objects> is a comma separated list of object names, meaning that
+        layout information is supplied for those objects. If no names are
+        specified, the layout type is applied to all objects
+      <layout type> can be:
+        CHUNK, to apply chunking layout
+        COMPA, to apply compact layout
+        CONTI, to apply contiguous layout
+      <layout parameters> is optional layout information
+        CHUNK=DIM[xDIM...xDIM], the chunk size of each dimension
+        COMPA (no parameter)
+        CONTI (no parameter)
+
+Examples of use:
+
+1) h5repack -v -f GZIP=1 file1 file2
+
+   GZIP compression with level 1 to all objects
+
+2) h5repack -v -f dset1:SZIP=8,NN file1 file2
+
+   SZIP compression with 8 pixels per block and NN coding method to object dset1
+
+3) h5repack -v -l dset1,dset2:CHUNK=20x10 -f dset3,dset4,dset5:NONE file1 file2
+
+   Chunked layout, with a layout size of 20x10, to objects dset1 and dset2
+   and remove filters to objects dset3, dset4, dset5
+
+4) h5repack -L -c 10 -s 20:dtype file1 file2 
+
+   Using latest file format with maximum compact group size of 10 and
+   and minimum shared datatype size of 20
+
+5) h5repack -f SHUF -f GZIP=1 file1 file2 
+
+   Add both filters SHUF and GZIP in this order to all datasets
+
+6) h5repack -f UD=307,1,9 file1 file2 
+
+   Add bzip2 filter to all datasets
+
diff --git a/tools/h5repack/testfiles/h5repack.info b/tools/test/h5repack/testfiles/h5repack.info
similarity index 100%
rename from tools/h5repack/testfiles/h5repack.info
rename to tools/test/h5repack/testfiles/h5repack.info
diff --git a/tools/test/h5repack/testfiles/h5repack_attr.h5 b/tools/test/h5repack/testfiles/h5repack_attr.h5
new file mode 100644
index 0000000..80df0be
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_attr.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_attr_refs.h5 b/tools/test/h5repack/testfiles/h5repack_attr_refs.h5
new file mode 100644
index 0000000..1b0ca34
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_attr_refs.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_deflate.h5 b/tools/test/h5repack/testfiles/h5repack_deflate.h5
new file mode 100644
index 0000000..4988491
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_deflate.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_early.h5 b/tools/test/h5repack/testfiles/h5repack_early.h5
new file mode 100644
index 0000000..d9a7ece
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_early.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_ext.bin b/tools/test/h5repack/testfiles/h5repack_ext.bin
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_ext.bin
rename to tools/test/h5repack/testfiles/h5repack_ext.bin
diff --git a/tools/test/h5repack/testfiles/h5repack_ext.h5 b/tools/test/h5repack/testfiles/h5repack_ext.h5
new file mode 100644
index 0000000..8518b5b
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_ext.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_fill.h5 b/tools/test/h5repack/testfiles/h5repack_fill.h5
new file mode 100644
index 0000000..ac40089
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_fill.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_filters.h5 b/tools/test/h5repack/testfiles/h5repack_filters.h5
new file mode 100644
index 0000000..eabade8
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_filters.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_filters.h5.tst b/tools/test/h5repack/testfiles/h5repack_filters.h5-gzip_verbose_filters.tst
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_filters.h5.tst
rename to tools/test/h5repack/testfiles/h5repack_filters.h5-gzip_verbose_filters.tst
diff --git a/tools/test/h5repack/testfiles/h5repack_fletcher.h5 b/tools/test/h5repack/testfiles/h5repack_fletcher.h5
new file mode 100644
index 0000000..16ca4ef
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_fletcher.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_hlink.h5 b/tools/test/h5repack/testfiles/h5repack_hlink.h5
new file mode 100644
index 0000000..80c0fcc
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_hlink.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_layout.UD.h5 b/tools/test/h5repack/testfiles/h5repack_layout.UD.h5
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_layout.UD.h5
rename to tools/test/h5repack/testfiles/h5repack_layout.UD.h5
diff --git a/tools/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl b/tools/test/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
rename to tools/test/h5repack/testfiles/h5repack_layout.UD.h5-plugin_none.ddl
diff --git a/tools/test/h5repack/testfiles/h5repack_layout.h5 b/tools/test/h5repack/testfiles/h5repack_layout.h5
new file mode 100644
index 0000000..4e53766
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_layout.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst b/tools/test/h5repack/testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst
new file mode 100644
index 0000000..95cc4c6
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack_layout.h5-dset2_chunk_20x10-errstk.tst
@@ -0,0 +1,38 @@
+HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
+  #000: (file name) line (number) in H5Dcreate2(): unable to create dataset
+    major: Dataset
+    minor: Unable to initialize object
+  #001: (file name) line (number) in H5D__create_named(): unable to create and link to dataset
+    major: Dataset
+    minor: Unable to initialize object
+  #002: (file name) line (number) in H5L_link_object(): unable to create new link to object
+    major: Links
+    minor: Unable to initialize object
+  #003: (file name) line (number) in H5L_create_real(): can't insert link
+    major: Symbol table
+    minor: Unable to insert object
+  #004: (file name) line (number) in H5G_traverse(): internal path traversal failed
+    major: Symbol table
+    minor: Object not found
+  #005: (file name) line (number) in H5G_traverse_real(): traversal operator failed
+    major: Symbol table
+    minor: Callback failed
+  #006: (file name) line (number) in H5L_link_cb(): unable to create object
+    major: Object header
+    minor: Unable to initialize object
+  #007: (file name) line (number) in H5O_obj_create(): unable to open object
+    major: Object header
+    minor: Can't open object
+  #008: (file name) line (number) in H5O__dset_create(): unable to create dataset
+    major: Dataset
+    minor: Unable to initialize object
+  #009: (file name) line (number) in H5D__create(): unable to construct layout information
+    major: Dataset
+    minor: Unable to initialize object
+  #010: (file name) line (number) in H5D__chunk_construct(): dimensionality of chunks doesn't match the dataspace
+    major: Dataset
+    minor: Bad value
+H5tools-DIAG: Error detected in HDF5:tools (version (number)) thread (IDs):
+  #000: (file name) line (number) in do_copy_objects(): H5Dcreate2 failed
+    major: Failure in tools library
+    minor: error in function
diff --git a/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
new file mode 100644
index 0000000..a8b4562
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_test.ddl
@@ -0,0 +1,158 @@
+HDF5 "out-plugin_test.h5repack_layout.h5" {
+GROUP "/" {
+   DATASET "dset1" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset3" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset4" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_chunk" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 20, 10 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_compact" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_contiguous" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 257
+            COMMENT dynlib1
+            PARAMS { 9 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+}
+}
diff --git a/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_version_test.ddl b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_version_test.ddl
new file mode 100644
index 0000000..7bac9c4
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_version_test.ddl
@@ -0,0 +1,158 @@
+HDF5 "out-plugin_version_test.h5repack_layout.h5" {
+GROUP "/" {
+   DATASET "dset1" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset2" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset3" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset4" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_chunk" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 20, 10 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_compact" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_contiguous" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 40, 20 ) / ( 40, 20 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 40, 20 )
+         SIZE 3200 (1.000:1 COMPRESSION)
+      }
+      FILTERS {
+         USER_DEFINED_FILTER {
+            FILTER_ID 260
+            COMMENT dynlib4
+            PARAMS { 9 1 10 1 }
+         }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  H5D_FILL_VALUE_DEFAULT
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+}
+}
diff --git a/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_zero.tst b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_zero.tst
new file mode 100644
index 0000000..0993d5b
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack_layout.h5-plugin_zero.tst
@@ -0,0 +1,9 @@
+Objects to modify layout are...
+Objects to apply filter are...
+ User Defined 250
+Making file <out-plugin_zero.h5repack_layout.h5>...
+-----------------------------------------
+ Type     Filter (Compression)     Name
+-----------------------------------------
+ group                       /
+h5repack error: <h5repack_layout.h5>: Could not copy data to: out-plugin_zero.h5repack_layout.h5
diff --git a/tools/h5repack/testfiles/h5repack_layout.h5.ddl b/tools/test/h5repack/testfiles/h5repack_layout.h5.ddl
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_layout.h5.ddl
rename to tools/test/h5repack/testfiles/h5repack_layout.h5.ddl
diff --git a/tools/test/h5repack/testfiles/h5repack_layout2.h5 b/tools/test/h5repack/testfiles/h5repack_layout2.h5
new file mode 100644
index 0000000..f6821e5
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_layout2.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_layout3.h5 b/tools/test/h5repack/testfiles/h5repack_layout3.h5
new file mode 100644
index 0000000..6d2de41
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_layout3.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_layouto.h5 b/tools/test/h5repack/testfiles/h5repack_layouto.h5
new file mode 100644
index 0000000..a038e68
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_layouto.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_named_dtypes.h5 b/tools/test/h5repack/testfiles/h5repack_named_dtypes.h5
new file mode 100644
index 0000000..85c1352
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_named_dtypes.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_nbit.h5 b/tools/test/h5repack/testfiles/h5repack_nbit.h5
new file mode 100644
index 0000000..ac71bee
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_nbit.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_nested_8bit_enum.h5 b/tools/test/h5repack/testfiles/h5repack_nested_8bit_enum.h5
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_nested_8bit_enum.h5
rename to tools/test/h5repack/testfiles/h5repack_nested_8bit_enum.h5
diff --git a/tools/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5 b/tools/test/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5
similarity index 100%
rename from tools/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5
rename to tools/test/h5repack/testfiles/h5repack_nested_8bit_enum_deflated.h5
diff --git a/tools/test/h5repack/testfiles/h5repack_objs.h5 b/tools/test/h5repack/testfiles/h5repack_objs.h5
new file mode 100644
index 0000000..284b0ac
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_objs.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_refs.h5 b/tools/test/h5repack/testfiles/h5repack_refs.h5
new file mode 100644
index 0000000..2a1ec9b
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_refs.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_shuffle.h5 b/tools/test/h5repack/testfiles/h5repack_shuffle.h5
new file mode 100644
index 0000000..c14e2cb
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_shuffle.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_soffset.h5 b/tools/test/h5repack/testfiles/h5repack_soffset.h5
new file mode 100644
index 0000000..2acd867
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_soffset.h5 differ
diff --git a/tools/test/h5repack/testfiles/h5repack_szip.h5 b/tools/test/h5repack/testfiles/h5repack_szip.h5
new file mode 100644
index 0000000..b16d169
Binary files /dev/null and b/tools/test/h5repack/testfiles/h5repack_szip.h5 differ
diff --git a/tools/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst b/tools/test/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst
similarity index 100%
rename from tools/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst
rename to tools/test/h5repack/testfiles/plugin_none.h5repack_layout.UD.h5.tst
diff --git a/tools/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst b/tools/test/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst
similarity index 100%
rename from tools/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst
rename to tools/test/h5repack/testfiles/plugin_test.h5repack_layout.h5.tst
diff --git a/tools/test/h5repack/testfiles/plugin_version_test.h5repack_layout.h5.tst b/tools/test/h5repack/testfiles/plugin_version_test.h5repack_layout.h5.tst
new file mode 100644
index 0000000..1a496c6
--- /dev/null
+++ b/tools/test/h5repack/testfiles/plugin_version_test.h5repack_layout.h5.tst
@@ -0,0 +1,14 @@
+Objects to modify layout are...
+Objects to apply filter are...
+ User Defined 260
+-----------------------------------------
+ Type     Filter (Compression)     Name
+-----------------------------------------
+ group                       /
+ dset     UD   (1.000:1)     /dset1
+ dset     UD   (1.000:1)     /dset2
+ dset     UD   (1.000:1)     /dset3
+ dset     UD   (1.000:1)     /dset4
+ dset     UD   (1.000:1)     /dset_chunk
+ dset     UD   (1.000:1)     /dset_compact
+ dset     UD   (1.000:1)     /dset_contiguous
diff --git a/tools/h5repack/testfiles/ublock.bin b/tools/test/h5repack/testfiles/ublock.bin
similarity index 100%
rename from tools/h5repack/testfiles/ublock.bin
rename to tools/test/h5repack/testfiles/ublock.bin
diff --git a/tools/test/h5repack/testh5repack_detect_szip.c b/tools/test/h5repack/testh5repack_detect_szip.c
new file mode 100644
index 0000000..e08d5ab
--- /dev/null
+++ b/tools/test/h5repack/testh5repack_detect_szip.c
@@ -0,0 +1,60 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include "h5repack.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5test.h"
+
+
+/* Name of tool */
+#define PROGRAMNAME "h5repack_detect_szip"
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: detects szip encoder, prints "yes" or "no" to stdout.
+ *          Intended to be used in test scripts.
+ *
+ * Return:
+ *
+ * Programmer:
+ *
+ * Date:
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+int main(void)
+{
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+#ifdef H5_HAVE_FILTER_SZIP
+    if (h5tools_can_encode(H5Z_FILTER_SZIP) == 1) {
+        printf("yes\n");
+        return(1);
+    }
+#endif /* H5_HAVE_FILTER_SZIP */
+    printf("no\n");
+    return(0);
+}
diff --git a/tools/test/h5stat/CMakeLists.txt b/tools/test/h5stat/CMakeLists.txt
new file mode 100644
index 0000000..10ac5e0
--- /dev/null
+++ b/tools/test/h5stat/CMakeLists.txt
@@ -0,0 +1,22 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_H5STAT)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the h5stat test executables
+  # --------------------------------------------------------------------
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5stat_gentest ${HDF5_TOOLS_TEST_H5STAT_SOURCE_DIR}/h5stat_gentest.c)
+    TARGET_NAMING (h5stat_gentest STATIC)
+    TARGET_C_PROPERTIES (h5stat_gentest STATIC " " " ")
+    target_link_libraries (h5stat_gentest ${HDF5_LIB_TARGET})
+    set_target_properties (h5stat_gentest PROPERTIES FOLDER generator/tools)
+
+    #add_test (NAME h5stat_gentest COMMAND $<TARGET_FILE:h5stat_gentest>)
+  endif ()
+
+  include (CMakeTests.cmake)
diff --git a/tools/test/h5stat/CMakeTests.cmake b/tools/test/h5stat/CMakeTests.cmake
new file mode 100644
index 0000000..cd52886
--- /dev/null
+++ b/tools/test/h5stat/CMakeTests.cmake
@@ -0,0 +1,248 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the test directory into the source directory
+  # --------------------------------------------------------------------
+  set (HDF5_REFERENCE_FILES
+      h5stat_help1.ddl
+      h5stat_help2.ddl
+      h5stat_notexist.ddl
+      h5stat_nofile.ddl
+      h5stat_filters.ddl
+      h5stat_filters-file.ddl
+      h5stat_filters-F.ddl
+      h5stat_filters-d.ddl
+      h5stat_filters-g.ddl
+      h5stat_filters-dT.ddl
+      h5stat_filters-UD.ddl
+      h5stat_filters-UT.ddl
+      h5stat_tsohm.ddl
+      h5stat_newgrat.ddl
+      h5stat_newgrat-UG.ddl
+      h5stat_newgrat-UA.ddl
+      h5stat_err1_links.ddl
+      h5stat_links1.ddl
+      h5stat_links2.ddl
+      h5stat_links3.ddl
+      h5stat_links4.ddl
+      h5stat_links5.ddl
+      h5stat_err1_dims.ddl
+      h5stat_dims1.ddl
+      h5stat_dims2.ddl
+      h5stat_err1_numattrs.ddl
+      h5stat_err2_numattrs.ddl
+      h5stat_numattrs1.ddl
+      h5stat_numattrs2.ddl
+      h5stat_numattrs3.ddl
+      h5stat_numattrs4.ddl
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      h5stat_filters.h5
+      h5stat_tsohm.h5
+      h5stat_newgrat.h5
+      h5stat_threshold.h5
+  )
+
+  foreach (ddl_file ${HDF5_REFERENCE_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5STAT_SOURCE_DIR}/testfiles/${ddl_file}" "${PROJECT_BINARY_DIR}/${ddl_file}" "h5stat_files")
+  endforeach ()
+
+  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_H5STAT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "h5stat_files")
+  endforeach ()
+  add_custom_target(h5stat_files ALL COMMENT "Copying files needed by h5stat tests" DEPENDS ${h5stat_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5STAT-${resultfile} COMMAND $<TARGET_FILE:h5stat> ${ARGN})
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5STAT-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif ()
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5STAT-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5STAT-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5stat>"
+              -D "TEST_ARGS=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           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 H5STAT-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          h5stat_help1.out
+          h5stat_help1.out.err
+          h5stat_help2.out
+          h5stat_help2.out.err
+          h5stat_notexist.out
+          h5stat_notexist.out.err
+          h5stat_nofile.out
+          h5stat_nofile.out.err
+          h5stat_filters.out
+          h5stat_filters.out.err
+          h5stat_filters-file.out
+          h5stat_filters-file.out.err
+          h5stat_filters-F.out
+          h5stat_filters-F.out.err
+          h5stat_filters-d.out
+          h5stat_filters-d.out.err
+          h5stat_filters-g.out
+          h5stat_filters-g.out.err
+          h5stat_filters-dT.out
+          h5stat_filters-dT.out.err
+          h5stat_filters-UD.out
+          h5stat_filters-UD.out.err
+          h5stat_filters-UT.out
+          h5stat_filters-UT.out.err
+          h5stat_tsohm.out
+          h5stat_tsohm.out.err
+          h5stat_newgrat.out
+          h5stat_newgrat.out.err
+          h5stat_newgrat-UG.out
+          h5stat_newgrat-UG.out.err
+          h5stat_newgrat-UA.out
+          h5stat_newgrat-UA.out.err
+          h5stat_err1_links.out
+          h5stat_err1_links.out.err
+          h5stat_links1.out
+          h5stat_links1.out.err
+          h5stat_links2.out
+          h5stat_links2.out.err
+          h5stat_links3.out
+          h5stat_links3.out.err
+          h5stat_links4.out
+          h5stat_links4.out.err
+          h5stat_links5.out
+          h5stat_links5.out.err
+          h5stat_err1_dims.out
+          h5stat_err1_dims.out.err
+          h5stat_dims1.out
+          h5stat_dims1.out.err
+          h5stat_dims2.out
+          h5stat_dims2.out.err
+          h5stat_err1_numattrs.out
+          h5stat_err1_numattrs.out.err
+          h5stat_err2_numattrs.out
+          h5stat_err2_numattrs.out.err
+          h5stat_numattrs1.out
+          h5stat_numattrs1.out.err
+          h5stat_numattrs2.out
+          h5stat_numattrs2.out.err
+          h5stat_numattrs3.out
+          h5stat_numattrs3.out.err
+          h5stat_numattrs4.out
+          h5stat_numattrs4.out.err
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5STAT-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5STAT-clearall-objects")
+  endif ()
+
+# Test for help flag
+  ADD_H5_TEST (h5stat_help1 0 -h)
+  ADD_H5_TEST (h5stat_help2 0 --help)
+
+# Test when h5stat a file that does not exist
+  ADD_H5_TEST (h5stat_notexist 1 notexist.h5)
+  ADD_H5_TEST (h5stat_nofile 1 '')
+
+# Test file with groups, compressed datasets, user-applied fileters, etc.
+# h5stat_filters.h5 is a copy of ../../testfiles/tfilters.h5 as of release 1.8.0-alpha4
+  ADD_H5_TEST (h5stat_filters 0 h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-file 0 -f h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-F 0 -F h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-d 0 -d h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-g 0 -g h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-dT 0 -dT h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-UD 0 -D h5stat_filters.h5)
+  ADD_H5_TEST (h5stat_filters-UT 0 -T h5stat_filters.h5)
+# h5stat_tsohm.h5 is a copy of ../../../test/tsohm.h5 generated by tsohm.c
+# as of release 1.8.7-snap0 (on a 64-bit machine)
+  ADD_H5_TEST (h5stat_tsohm 0 h5stat_tsohm.h5)
+# h5stat_newgrat.h5 is generated by h5stat_gentest.c
+  ADD_H5_TEST (h5stat_newgrat 0 h5stat_newgrat.h5)
+  ADD_H5_TEST (h5stat_newgrat-UG 0 -G h5stat_newgrat.h5)
+  ADD_H5_TEST (h5stat_newgrat-UA 0 -A h5stat_newgrat.h5)
+#
+# Tests for -l (--links) option on h5stat_threshold.h5:
+#   -l 0 (incorrect threshold value)
+#   -g -l 8
+#   --links=8
+#   --links=20 -g
+  ADD_H5_TEST (h5stat_err1_links 1 -l 0 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_links1 0 -g -l 8 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_links2 0 --links=8 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_links3 0 --links=20 -g h5stat_threshold.h5)
+#
+# Tests for -l (--links) option on h5stat_newgrat.h5:
+#   -g
+#   -g -l 40000
+  ADD_H5_TEST (h5stat_links4 0 -g h5stat_newgrat.h5)
+  ADD_H5_TEST (h5stat_links5 0 -g -l 40000 h5stat_newgrat.h5)
+#
+# Tests for -m (--dims) option on h5stat_threshold.h5
+#   -d --dims=-1 (incorrect threshold value)
+#   -gd -m 5
+#   -d --di=15
+  ADD_H5_TEST (h5stat_err1_dims 1 -d --dims=-1 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_dims1 0 -gd -m 5 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_dims2 0 -d --di=15 h5stat_threshold.h5)
+#
+# Tests for -a option on h5stat_threshold.h5
+#   -a -2 (incorrect threshold value)
+#   --numattrs (without threshold value)
+#   -AS -a 10
+#   -a 1
+#   -A --numattrs=25
+  ADD_H5_TEST (h5stat_err1_numattrs 1 -a -2 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_err2_numattrs 1 --numattrs h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_numattrs1 0 -AS -a 10 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_numattrs2 0 -a 1 h5stat_threshold.h5)
+  ADD_H5_TEST (h5stat_numattrs3 0 -A --numattrs=25 h5stat_threshold.h5)
+#
+# Tests for -a option on h5stat_newgrat.h5
+#   -A -a 100
+  ADD_H5_TEST (h5stat_numattrs4 0 -A -a 100 h5stat_newgrat.h5)
+#
diff --git a/tools/test/h5stat/Makefile.am b/tools/test/h5stat/Makefile.am
new file mode 100644
index 0000000..dd251f8
--- /dev/null
+++ b/tools/test/h5stat/Makefile.am
@@ -0,0 +1,46 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=h5stat_gentest
+TEST_SCRIPT=testh5stat.sh
+
+check_PROGRAMS=$(TEST_PROG)
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/h5stat/h5stat$(EXEEXT)
+
+# Tell automake to clean h5redeploy script
+CLEANFILES=
+
+# Temporary files.  *.h5 are generated by h5repart_gentest.  They should
+# copied to the testfiles/ directory if update is required. fst_family*.h5
+# and scd_family*.h5 were created by setting the HDF5_NOCLEANUP variable.
+CHECK_CLEANFILES+=*.h5 ../testfiles/fst_family*.h5 ../testfiles/scd_family*.h5
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES=testh5stat.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/h5stat/Makefile.in b/tools/test/h5stat/Makefile.in
new file mode 100644
index 0000000..1e96047
--- /dev/null
+++ b/tools/test/h5stat/Makefile.in
@@ -0,0 +1,1432 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5stat.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = h5stat_gentest$(EXEEXT)
+h5stat_gentest_SOURCES = h5stat_gentest.c
+h5stat_gentest_OBJECTS = h5stat_gentest.$(OBJEXT)
+h5stat_gentest_LDADD = $(LDADD)
+h5stat_gentest_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 = 
+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 = h5stat_gentest.c
+DIST_SOURCES = h5stat_gentest.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)/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@
+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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5repart_gentest.  They should
+# copied to the testfiles/ directory if update is required. fst_family*.h5
+# 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
+
+#test script and program
+TEST_PROG = h5stat_gentest
+TEST_SCRIPT = testh5stat.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/h5stat/h5stat$(EXEEXT)
+
+# Tell automake to clean h5redeploy script
+CLEANFILES = 
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES = testh5stat.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/h5stat/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/h5stat/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):
+testh5stat.sh: $(top_builddir)/config.status $(srcdir)/testh5stat.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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
+
+h5stat_gentest$(EXEEXT): $(h5stat_gentest_OBJECTS) $(h5stat_gentest_DEPENDENCIES) $(EXTRA_h5stat_gentest_DEPENDENCIES) 
+	@rm -f h5stat_gentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5stat_gentest_OBJECTS) $(h5stat_gentest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5stat_gentest.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+h5stat_gentest.log: h5stat_gentest$(EXEEXT)
+	@p='h5stat_gentest$(EXEEXT)'; \
+	b='h5stat_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 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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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-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-dyn: $(DYN)
+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 dyn 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/test/h5stat/h5stat_gentest.c b/tools/test/h5stat/h5stat_gentest.c
new file mode 100644
index 0000000..0f696d0
--- /dev/null
+++ b/tools/test/h5stat/h5stat_gentest.c
@@ -0,0 +1,447 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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 h5stat 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"
+
+/* For gen_newgrat_file() */
+#define NEWGRAT_FILE 	"h5stat_newgrat.h5"
+#define DATASET_NAME	"DATASET_NAME"
+#define GROUP_NAME	"GROUP"
+#define ATTR_NAME	"ATTR"
+#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"
+#define THRES_ATTR_GRP_NAME	"grp_attr"
+#define THRES_DSET_NAME 	"dset"
+#define THRES_NUM		10
+#define THRES_NUM_25		25
+
+/*
+ * 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 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 */
+
+    /* Get a copy file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	goto error;
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	goto error;
+
+    /* 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_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, 1, (hsize_t)1) < 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 */
+    for(i = 1; i <= NUM_GRPS; i++) {
+        sprintf(name, "%s%d", GROUP_NAME,i);
+        if((gid = H5Gcreate2(fid, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+        if(H5Gclose(gid) < 0)
+	    goto error;
+    } /* end for */
+
+    /* Create a datatype to commit and use */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+	goto error;
+
+    /* Create dataspace for dataset */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+	goto error;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DATASET_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create NUM_ATTRS for the dataset */
+    for(i = 1; i <= NUM_ATTRS; i++) {
+        sprintf(attrname, "%s%d", ATTR_NAME,i);
+        if((attr_id = H5Acreate2(did, attrname, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+        if(H5Aclose(attr_id) < 0)
+	    goto error;
+    } /* end for */
+
+    /* Close dataset, dataspace, datatype, file */
+    if(H5Pclose(fapl) < 0)
+	goto error;
+    if(H5Pclose(fcpl) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
+	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Tclose(tid) < 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);
+        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.
+ *	-m N (--dims=N): Set the threshold for the # of dimension sizes when printing information for small datasets.
+ *	-a N (--numattrs=N): Set the threshold for the # of attributes when printing information for small # of attributes.
+ */
+static void
+gen_threshold_file(const char *fname)
+{
+    hid_t fid;				/* File ID */
+    hid_t sid0, sid1, sid2, sid3, sid4;	/* Dataspace IDs */
+    hid_t did;				/* Dataset ID */
+    hid_t attr_id;			/* Attribute ID */
+    hid_t gid;				/* Group ID */
+    hsize_t two_dims[] = {2, 5};	/* Dimension array */
+    hsize_t one_dims[] = {6};		/* Dimension array */
+    hsize_t zero_dims[] = {0};		/* Dimension array */
+    char name[30];			/* Name */
+    unsigned i;				/* Local index variable */
+
+    /* Create file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create 1-D dataspace with zero dimension size */
+    if((sid0 = H5Screate_simple(1, zero_dims, NULL)) < 0)
+	goto error;
+
+    /* Create 1-D dataspace with non-zero dimension size*/
+    if((sid1 = H5Screate_simple(1, one_dims, NULL)) < 0)
+	goto error;
+
+    /* Create 2-D dataspace */
+    if((sid2 = H5Screate_simple(2, two_dims, NULL)) < 0)
+	goto error;
+
+    /* Create scalar dataspace */
+    if((sid3 = H5Screate(H5S_SCALAR)) < 0)
+	goto error;
+
+    /* Create null dataspace */
+    if((sid4 = H5Screate(H5S_NULL)) < 0)
+	goto error;
+
+    /* Create an attribute for the root group */
+    if((attr_id = H5Acreate2(fid, "attr", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+    if(H5Aclose(attr_id) < 0)
+	goto error;
+
+    /* Create 1-D dataset with zero dimension size for the root group */
+    if((did = H5Dcreate2(fid, "zero_dset", H5T_NATIVE_UCHAR, sid0, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create 11 attributes for the dataset */
+    for(i = 1; i <= (THRES_NUM+1); i++) {
+        sprintf(name, "%s%d", THRES_ATTR_NAME,i);
+        if((attr_id = H5Acreate2(did, name, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+        if(H5Aclose(attr_id) < 0)
+	    goto error;
+    }
+    if(H5Dclose(did) < 0)
+	goto error;
+
+    /* Create dataset with scalar dataspace for the root group */
+    if((did = H5Dcreate2(fid, "scalar_dset", H5T_NATIVE_UCHAR, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
+	goto error;
+
+    /* Create dataset with null dataspace for the root group */
+    if((did = H5Dcreate2(fid, "null_dset", H5T_NATIVE_UCHAR, sid4, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
+	goto error;
+
+    /* Create 2-D dataset for the root group */
+    if((did = H5Dcreate2(fid, "dset", H5T_NATIVE_UCHAR, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create 10 attributes for the 2-D dataset */
+    for(i = 1; i <= THRES_NUM; i++) {
+        sprintf(name, "%s%d", THRES_ATTR_NAME,i);
+        if((attr_id = H5Acreate2(did, name, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+        if(H5Aclose(attr_id) < 0)
+	    goto error;
+    }
+    if(H5Dclose(did) < 0)
+	goto error;
+
+    /* Create first group */
+    if((gid = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create an attribute for the group */
+    if((attr_id = H5Acreate2(gid, "ATTR", H5T_NATIVE_INT, sid3, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Close attribute */
+    if(H5Aclose(attr_id) < 0)
+	goto error;
+
+    /* Create 10 1-D datasets with non-zero dimension size for the group */
+    for(i = 1; i <= THRES_NUM; i++) {
+	/* set up dataset name */
+        sprintf(name, "%s%d", THRES_DSET_NAME,i);
+
+	/* Create the dataset */
+	if((did = H5Dcreate2(gid, name, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+
+	/* Close the dataset */
+        if(H5Dclose(did) < 0)
+	    goto error;
+    }
+
+    /* Close the group */
+    if(H5Gclose(gid) < 0)
+	goto error;
+
+
+    /* Create second group */
+    if((gid = H5Gcreate2(fid, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create 25 attributes for the group */
+    for(i = 1; i <= THRES_NUM_25; i++) {
+	/* Set up attribute name */
+        sprintf(name, "%s%d", THRES_ATTR_GRP_NAME,i);
+
+	/* Create the attribute */
+        if((attr_id = H5Acreate2(gid, name, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+
+	/* Close the attribute */
+        if(H5Aclose(attr_id) < 0)
+	    goto error;
+    }
+
+    /* Close the group */
+    if(H5Gclose(gid) < 0)
+	goto error;
+
+    /* Create third group */
+    if((gid = H5Gcreate2(fid, "group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create 9 1-D datasets with non-zero dimension size for the group */
+    for(i = 1; i < THRES_NUM; i++) {
+	/* set up dataset name */
+        sprintf(name, "%s%d", THRES_DSET_NAME,i);
+
+	/* Create the dataset */
+	if((did = H5Dcreate2(gid, name, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	    goto error;
+
+	/* Close the dataset */
+        if(H5Dclose(did) < 0)
+	    goto error;
+    }
+
+    /* Close the group */
+    if(H5Gclose(gid) < 0)
+	goto error;
+
+
+    /* Close dataspaces */
+    if(H5Sclose(sid0) < 0)
+	goto error;
+    if(H5Sclose(sid1) < 0)
+	goto error;
+    if(H5Sclose(sid2) < 0)
+	goto error;
+    if(H5Sclose(sid3) < 0)
+	goto error;
+    if(H5Sclose(sid4) < 0)
+	goto error;
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Gclose(gid);
+	H5Aclose(attr_id);
+        H5Dclose(did);
+        H5Sclose(sid0);
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Sclose(sid3);
+        H5Sclose(sid4);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+} /* 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/test/h5stat/testfiles/h5stat_dims1.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_dims1.ddl
rename to tools/test/h5stat/testfiles/h5stat_dims1.ddl
diff --git a/tools/h5stat/testfiles/h5stat_dims2.ddl b/tools/test/h5stat/testfiles/h5stat_dims2.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_dims2.ddl
rename to tools/test/h5stat/testfiles/h5stat_dims2.ddl
diff --git a/tools/h5stat/testfiles/h5stat_err1_dims.ddl b/tools/test/h5stat/testfiles/h5stat_err1_dims.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_err1_dims.ddl
rename to tools/test/h5stat/testfiles/h5stat_err1_dims.ddl
diff --git a/tools/h5stat/testfiles/h5stat_err1_links.ddl b/tools/test/h5stat/testfiles/h5stat_err1_links.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_err1_links.ddl
rename to tools/test/h5stat/testfiles/h5stat_err1_links.ddl
diff --git a/tools/h5stat/testfiles/h5stat_err1_numattrs.ddl b/tools/test/h5stat/testfiles/h5stat_err1_numattrs.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_err1_numattrs.ddl
rename to tools/test/h5stat/testfiles/h5stat_err1_numattrs.ddl
diff --git a/tools/h5stat/testfiles/h5stat_err2_numattrs.ddl b/tools/test/h5stat/testfiles/h5stat_err2_numattrs.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_err2_numattrs.ddl
rename to tools/test/h5stat/testfiles/h5stat_err2_numattrs.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-F.ddl b/tools/test/h5stat/testfiles/h5stat_filters-F.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-F.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-F.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-UD.ddl b/tools/test/h5stat/testfiles/h5stat_filters-UD.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-UD.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-UD.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-UT.ddl b/tools/test/h5stat/testfiles/h5stat_filters-UT.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-UT.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-UT.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-d.ddl b/tools/test/h5stat/testfiles/h5stat_filters-d.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-d.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-d.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-dT.ddl b/tools/test/h5stat/testfiles/h5stat_filters-dT.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-dT.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-dT.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-file.ddl b/tools/test/h5stat/testfiles/h5stat_filters-file.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-file.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-file.ddl
diff --git a/tools/h5stat/testfiles/h5stat_filters-g.ddl b/tools/test/h5stat/testfiles/h5stat_filters-g.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_filters-g.ddl
rename to tools/test/h5stat/testfiles/h5stat_filters-g.ddl
diff --git a/tools/test/h5stat/testfiles/h5stat_filters.ddl b/tools/test/h5stat/testfiles/h5stat_filters.ddl
new file mode 100644
index 0000000..9f9e146
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_filters.ddl
@@ -0,0 +1,99 @@
+Filename: h5stat_filters.h5
+File information
+	# of unique groups: 1
+	# of unique datasets: 15
+	# of unique named datatypes: 1
+	# of unique links: 0
+	# of unique other: 0
+	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)
+		Groups: 48/8
+		Datasets(exclude compact data): 4136/1344
+		Datatypes: 80/0
+	Groups:
+		B-tree/List: 1200
+		Heap: 288
+	Attributes:
+		B-tree/List: 0
+		Heap: 0
+	Chunked datasets:
+		Index: 31392
+	Datasets:
+		Heap: 72
+	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):
+	Total # of small groups: 0
+Group bins:
+	# of groups with 10 - 99 links: 1
+	Total # of groups: 1
+Dataset dimension information:
+	Max. rank of datasets: 2
+	Dataset ranks:
+		# of dataset with rank 1: 1
+		# of dataset with rank 2: 14
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 100
+	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 100 - 999: 1
+		Total # of datasets: 1
+Dataset storage information:
+	Total raw data size: 8659
+	Total external raw data size: 400
+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:
+		NO filter: 7
+		GZIP filter: 2
+		SHUFFLE filter: 2
+		FLETCHER32 filter: 2
+		SZIP filter: 2
+		NBIT filter: 2
+		SCALEOFFSET filter: 1
+		USER-DEFINED filter: 1
+Dataset datatype information:
+	# of unique datatypes used by datasets: 2
+	Dataset datatype #0:
+		Count (total/named) = (14/0)
+		Size (desc./elmt) = (14/4)
+	Dataset datatype #1:
+		Count (total/named) = (1/0)
+		Size (desc./elmt) = (14/4)
+	Total dataset datatype count: 15
+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 persist: FALSE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 37312 bytes
+  Raw data: 8659 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/test/h5stat/testfiles/h5stat_filters.h5 b/tools/test/h5stat/testfiles/h5stat_filters.h5
new file mode 100644
index 0000000..5b5f4bb
Binary files /dev/null and b/tools/test/h5stat/testfiles/h5stat_filters.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_help1.ddl b/tools/test/h5stat/testfiles/h5stat_help1.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_help1.ddl
rename to tools/test/h5stat/testfiles/h5stat_help1.ddl
diff --git a/tools/h5stat/testfiles/h5stat_help2.ddl b/tools/test/h5stat/testfiles/h5stat_help2.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_help2.ddl
rename to tools/test/h5stat/testfiles/h5stat_help2.ddl
diff --git a/tools/test/h5stat/testfiles/h5stat_idx.ddl b/tools/test/h5stat/testfiles/h5stat_idx.ddl
new file mode 100644
index 0000000..1b6ae0c
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_idx.ddl
@@ -0,0 +1,95 @@
+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 persist: FALSE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+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: 1083 bytes
+Total space: 2158 bytes
diff --git a/tools/test/h5stat/testfiles/h5stat_idx.h5 b/tools/test/h5stat/testfiles/h5stat_idx.h5
new file mode 100644
index 0000000..83ebcdb
Binary files /dev/null and b/tools/test/h5stat/testfiles/h5stat_idx.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_links1.ddl b/tools/test/h5stat/testfiles/h5stat_links1.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_links1.ddl
rename to tools/test/h5stat/testfiles/h5stat_links1.ddl
diff --git a/tools/test/h5stat/testfiles/h5stat_links2.ddl b/tools/test/h5stat/testfiles/h5stat_links2.ddl
new file mode 100644
index 0000000..9fc82cd
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_links2.ddl
@@ -0,0 +1,107 @@
+Filename: h5stat_threshold.h5
+File information
+	# of unique groups: 4
+	# of unique datasets: 23
+	# of unique named datatypes: 0
+	# of unique links: 0
+	# of unique other: 0
+	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)
+		Groups: 3576/0
+		Datasets(exclude compact data): 7896/2912
+		Datatypes: 0/0
+	Groups:
+		B-tree/List: 3816
+		Heap: 744
+	Attributes:
+		B-tree/List: 0
+		Heap: 0
+	Chunked datasets:
+		Index: 0
+	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 7 links):
+	# of groups with 0 link(s): 1
+	# of groups with 7 link(s): 1
+	Total # of small groups: 2
+Group bins:
+	# of groups with 0 link: 1
+	# of groups with 1 - 9 links: 2
+	# of groups with 10 - 99 links: 1
+	Total # of groups: 4
+Dataset dimension information:
+	Max. rank of datasets: 2
+	Dataset ranks:
+		# of dataset with rank 0: 2
+		# of dataset with rank 1: 20
+		# of dataset with rank 2: 1
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 6
+	Small 1-D datasets (with dimension sizes 0 to 9):
+		# of datasets with dimension sizes 0: 1
+		# of datasets with dimension sizes 6: 19
+		Total # of small datasets: 20
+	1-D Dataset dimension bins:
+		# of datasets with dimension size 0: 1
+		# of datasets with dimension size 1 - 9: 19
+		Total # of datasets: 20
+Dataset storage information:
+	Total raw data size: 0
+	Total external raw data size: 0
+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:
+		NO filter: 23
+		GZIP filter: 0
+		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) = (23/0)
+		Size (desc./elmt) = (14/1)
+	Total dataset datatype count: 23
+Small # of attributes (objects with 1 to 10 attributes):
+	# of objects with 1 attributes: 2
+	# of objects with 10 attributes: 1
+	Total # of objects with small # of attributes: 3
+Attribute bins:
+	# of objects with 1 - 9 attributes: 2
+	# of objects with 10 - 99 attributes: 3
+	Total # of objects with attributes: 5
+	Max. # of attributes to objects: 25
+Free-space persist: FALSE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 16128 bytes
+  Raw data: 0 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_links3.ddl b/tools/test/h5stat/testfiles/h5stat_links3.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_links3.ddl
rename to tools/test/h5stat/testfiles/h5stat_links3.ddl
diff --git a/tools/h5stat/testfiles/h5stat_links4.ddl b/tools/test/h5stat/testfiles/h5stat_links4.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_links4.ddl
rename to tools/test/h5stat/testfiles/h5stat_links4.ddl
diff --git a/tools/h5stat/testfiles/h5stat_links5.ddl b/tools/test/h5stat/testfiles/h5stat_links5.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_links5.ddl
rename to tools/test/h5stat/testfiles/h5stat_links5.ddl
diff --git a/tools/h5stat/testfiles/h5stat_newgrat-UA.ddl b/tools/test/h5stat/testfiles/h5stat_newgrat-UA.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_newgrat-UA.ddl
rename to tools/test/h5stat/testfiles/h5stat_newgrat-UA.ddl
diff --git a/tools/h5stat/testfiles/h5stat_newgrat-UG.ddl b/tools/test/h5stat/testfiles/h5stat_newgrat-UG.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_newgrat-UG.ddl
rename to tools/test/h5stat/testfiles/h5stat_newgrat-UG.ddl
diff --git a/tools/test/h5stat/testfiles/h5stat_newgrat.ddl b/tools/test/h5stat/testfiles/h5stat_newgrat.ddl
new file mode 100644
index 0000000..130fe2f
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_newgrat.ddl
@@ -0,0 +1,97 @@
+Filename: h5stat_newgrat.h5
+File information
+	# of unique groups: 35001
+	# of unique datasets: 1
+	# of unique named datatypes: 0
+	# of unique links: 0
+	# of unique other: 0
+	Max. # of links to object: 1
+	Max. # of objects in group: 35001
+File space information for file metadata (in bytes):
+	Superblock: 48
+	Superblock extension: 186
+	User block: 0
+	Object headers: (total/unused)
+		Groups: 5145147/3220092
+		Datasets(exclude compact data): 414/312
+		Datatypes: 0/0
+	Groups:
+		B-tree/List: 470054
+		Heap: 739045
+	Attributes:
+		B-tree/List: 2598
+		Heap: 4431
+	Chunked datasets:
+		Index: 0
+	Datasets:
+		Heap: 0
+	Shared Messages:
+		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
+Group bins:
+	# of groups with 0 link: 35000
+	# of groups with 10000 - 99999 links: 1
+	Total # of groups: 35001
+Dataset dimension information:
+	Max. rank of datasets: 0
+	Dataset ranks:
+		# of dataset with rank 0: 1
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 0
+	Small 1-D datasets (with dimension sizes 0 to 9):
+		Total # of small datasets: 0
+Dataset storage information:
+	Total raw data size: 0
+	Total external raw data size: 0
+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:
+		NO filter: 1
+		GZIP filter: 0
+		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) = (1/0)
+		Size (desc./elmt) = (14/4)
+	Total dataset datatype count: 1
+Small # of attributes (objects with 1 to 10 attributes):
+	Total # of objects with small # of attributes: 0
+Attribute bins:
+	# of objects with 100 - 999 attributes: 1
+	Total # of objects with attributes: 1
+	Max. # of attributes to objects: 100
+Free-space persist: TRUE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 6362103 bytes
+  Raw data: 0 bytes
+  Amount/Percent of tracked free space: 132 bytes/0.0%
+  Unaccounted space: 0 bytes
+Total space: 6362235 bytes
diff --git a/tools/test/h5stat/testfiles/h5stat_newgrat.h5 b/tools/test/h5stat/testfiles/h5stat_newgrat.h5
new file mode 100644
index 0000000..0d68e79
Binary files /dev/null and b/tools/test/h5stat/testfiles/h5stat_newgrat.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_nofile.ddl b/tools/test/h5stat/testfiles/h5stat_nofile.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_nofile.ddl
rename to tools/test/h5stat/testfiles/h5stat_nofile.ddl
diff --git a/tools/h5stat/testfiles/h5stat_notexist.ddl b/tools/test/h5stat/testfiles/h5stat_notexist.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_notexist.ddl
rename to tools/test/h5stat/testfiles/h5stat_notexist.ddl
diff --git a/tools/test/h5stat/testfiles/h5stat_numattrs1.ddl b/tools/test/h5stat/testfiles/h5stat_numattrs1.ddl
new file mode 100644
index 0000000..af53776
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_numattrs1.ddl
@@ -0,0 +1,18 @@
+Filename: h5stat_threshold.h5
+Small # of attributes (objects with 1 to 10 attributes):
+	# of objects with 1 attributes: 2
+	# of objects with 10 attributes: 1
+	Total # of objects with small # of attributes: 3
+Attribute bins:
+	# of objects with 1 - 9 attributes: 2
+	# of objects with 10 - 99 attributes: 3
+	Total # of objects with attributes: 5
+	Max. # of attributes to objects: 25
+File space management strategy: H5F_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 16128 bytes
+  Raw data: 0 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 184 bytes
+Total space: 16312 bytes
diff --git a/tools/test/h5stat/testfiles/h5stat_numattrs2.ddl b/tools/test/h5stat/testfiles/h5stat_numattrs2.ddl
new file mode 100644
index 0000000..638781b
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_numattrs2.ddl
@@ -0,0 +1,107 @@
+Filename: h5stat_threshold.h5
+File information
+	# of unique groups: 4
+	# of unique datasets: 23
+	# of unique named datatypes: 0
+	# of unique links: 0
+	# of unique other: 0
+	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)
+		Groups: 3576/0
+		Datasets(exclude compact data): 7896/2912
+		Datatypes: 0/0
+	Groups:
+		B-tree/List: 3816
+		Heap: 744
+	Attributes:
+		B-tree/List: 0
+		Heap: 0
+	Chunked datasets:
+		Index: 0
+	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 0 link(s): 1
+	# of groups with 7 link(s): 1
+	# of groups with 9 link(s): 1
+	Total # of small groups: 3
+Group bins:
+	# of groups with 0 link: 1
+	# of groups with 1 - 9 links: 2
+	# of groups with 10 - 99 links: 1
+	Total # of groups: 4
+Dataset dimension information:
+	Max. rank of datasets: 2
+	Dataset ranks:
+		# of dataset with rank 0: 2
+		# of dataset with rank 1: 20
+		# of dataset with rank 2: 1
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 6
+	Small 1-D datasets (with dimension sizes 0 to 9):
+		# of datasets with dimension sizes 0: 1
+		# of datasets with dimension sizes 6: 19
+		Total # of small datasets: 20
+	1-D Dataset dimension bins:
+		# of datasets with dimension size 0: 1
+		# of datasets with dimension size 1 - 9: 19
+		Total # of datasets: 20
+Dataset storage information:
+	Total raw data size: 0
+	Total external raw data size: 0
+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:
+		NO filter: 23
+		GZIP filter: 0
+		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) = (23/0)
+		Size (desc./elmt) = (14/1)
+	Total dataset datatype count: 23
+Small # of attributes (objects with 1 to 1 attributes):
+	# of objects with 1 attributes: 2
+	Total # of objects with small # of attributes: 2
+Attribute bins:
+	# of objects with 1 - 9 attributes: 2
+	# of objects with 10 - 99 attributes: 3
+	Total # of objects with attributes: 5
+	Max. # of attributes to objects: 25
+Free-space persist: FALSE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 16128 bytes
+  Raw data: 0 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_numattrs3.ddl b/tools/test/h5stat/testfiles/h5stat_numattrs3.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_numattrs3.ddl
rename to tools/test/h5stat/testfiles/h5stat_numattrs3.ddl
diff --git a/tools/h5stat/testfiles/h5stat_numattrs4.ddl b/tools/test/h5stat/testfiles/h5stat_numattrs4.ddl
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_numattrs4.ddl
rename to tools/test/h5stat/testfiles/h5stat_numattrs4.ddl
diff --git a/tools/h5stat/testfiles/h5stat_threshold.h5 b/tools/test/h5stat/testfiles/h5stat_threshold.h5
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_threshold.h5
rename to tools/test/h5stat/testfiles/h5stat_threshold.h5
diff --git a/tools/test/h5stat/testfiles/h5stat_tsohm.ddl b/tools/test/h5stat/testfiles/h5stat_tsohm.ddl
new file mode 100644
index 0000000..9369950
--- /dev/null
+++ b/tools/test/h5stat/testfiles/h5stat_tsohm.ddl
@@ -0,0 +1,92 @@
+Filename: h5stat_tsohm.h5
+File information
+	# of unique groups: 1
+	# of unique datasets: 3
+	# of unique named datatypes: 0
+	# of unique links: 0
+	# of unique other: 0
+	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)
+		Groups: 51/2
+		Datasets(exclude compact data): 852/447
+		Datatypes: 0/0
+	Groups:
+		B-tree/List: 872
+		Heap: 120
+	Attributes:
+		B-tree/List: 0
+		Heap: 0
+	Chunked datasets:
+		Index: 0
+	Datasets:
+		Heap: 0
+	Shared Messages:
+		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
+Group bins:
+	# of groups with 1 - 9 links: 1
+	Total # of groups: 1
+Dataset dimension information:
+	Max. rank of datasets: 2
+	Dataset ranks:
+		# of dataset with rank 2: 3
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 0
+	Small 1-D datasets (with dimension sizes 0 to 9):
+		Total # of small datasets: 0
+Dataset storage information:
+	Total raw data size: 0
+	Total external raw data size: 0
+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:
+		NO filter: 3
+		GZIP filter: 0
+		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) = (3/0)
+		Size (desc./elmt) = (14/8)
+	Total dataset datatype count: 3
+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 persist: FALSE
+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_FSPACE_STRATEGY_FSM_AGGR
+File space page size: 4096 bytes
+Summary of file space information:
+  File metadata: 3850 bytes
+  Raw data: 0 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 0 bytes
+Total space: 3850 bytes
diff --git a/tools/h5stat/testfiles/h5stat_tsohm.h5 b/tools/test/h5stat/testfiles/h5stat_tsohm.h5
similarity index 100%
rename from tools/h5stat/testfiles/h5stat_tsohm.h5
rename to tools/test/h5stat/testfiles/h5stat_tsohm.h5
diff --git a/tools/test/h5stat/testh5stat.sh.in b/tools/test/h5stat/testh5stat.sh.in
new file mode 100644
index 0000000..c4a52c3
--- /dev/null
+++ b/tools/test/h5stat/testh5stat.sh.in
@@ -0,0 +1,316 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5stat tool
+#
+# Modifcations:
+# 	Vailin Choi; July 2013
+# 	Add tests for -l, -m, -a options
+#
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5stat
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+STAT=../../src/h5stat/h5stat               # The tool name
+STAT_BIN=`pwd`/$STAT    # The path of the 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_H5DIFF_TESTFILES="$SRC_TOOLS/test/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/test/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/test/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/test/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/test/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/test/h5import/testfiles"
+
+TESTDIR=./testfiles
+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_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
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5STAT_TESTFILES/h5stat_help1.ddl
+$SRC_H5STAT_TESTFILES/h5stat_help2.ddl
+$SRC_H5STAT_TESTFILES/h5stat_notexist.ddl
+$SRC_H5STAT_TESTFILES/h5stat_nofile.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-file.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-F.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-d.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-g.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-dT.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-UD.ddl
+$SRC_H5STAT_TESTFILES/h5stat_filters-UT.ddl
+$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
+$SRC_H5STAT_TESTFILES/h5stat_links3.ddl
+$SRC_H5STAT_TESTFILES/h5stat_links4.ddl
+$SRC_H5STAT_TESTFILES/h5stat_links5.ddl
+$SRC_H5STAT_TESTFILES/h5stat_err1_dims.ddl
+$SRC_H5STAT_TESTFILES/h5stat_dims1.ddl
+$SRC_H5STAT_TESTFILES/h5stat_dims2.ddl
+$SRC_H5STAT_TESTFILES/h5stat_err1_numattrs.ddl
+$SRC_H5STAT_TESTFILES/h5stat_err2_numattrs.ddl
+$SRC_H5STAT_TESTFILES/h5stat_numattrs1.ddl
+$SRC_H5STAT_TESTFILES/h5stat_numattrs2.ddl
+$SRC_H5STAT_TESTFILES/h5stat_numattrs3.ddl
+$SRC_H5STAT_TESTFILES/h5stat_numattrs4.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=$SRC_H5STAT_TESTFILES
+    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 $STAT $@
+   (
+      cd $TESTDIR
+      $RUNSERIAL $STAT_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
+   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
+
+# Test for help flag
+TOOLTEST h5stat_help1.ddl -h
+TOOLTEST h5stat_help2.ddl --help
+# Test when h5stat a file that does not exist
+TOOLTEST h5stat_notexist.ddl notexist.h5
+TOOLTEST h5stat_nofile.ddl ''
+
+# Test file with groups, compressed datasets, user-applied fileters, etc.
+# h5stat_filters.h5 is a copy of ../../testfiles/tfilters.h5 as of release 1.8.0-alpha4
+TOOLTEST h5stat_filters.ddl h5stat_filters.h5
+TOOLTEST h5stat_filters-file.ddl  -f   h5stat_filters.h5
+TOOLTEST h5stat_filters-F.ddl  -F   h5stat_filters.h5
+TOOLTEST h5stat_filters-d.ddl  -d   h5stat_filters.h5
+TOOLTEST h5stat_filters-g.ddl  -g   h5stat_filters.h5
+TOOLTEST h5stat_filters-dT.ddl -dT  h5stat_filters.h5
+TOOLTEST h5stat_filters-UD.ddl -D h5stat_filters.h5
+TOOLTEST h5stat_filters-UT.ddl -T h5stat_filters.h5
+#
+# h5stat_tsohm.h5 is a copy of ../../../test/tsohm.h5 generated by tsohm.c 
+# as of release 1.8.7-snap0 (on a 64-bit machine)
+TOOLTEST h5stat_tsohm.ddl h5stat_tsohm.h5
+# h5stat_newgrat.h5 is generated by h5stat_gentest.c
+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)
+# 	-g -l 8
+# 	--links=8
+# 	--links=20 -g
+TOOLTEST h5stat_err1_links.ddl -l 0 h5stat_threshold.h5
+TOOLTEST h5stat_links1.ddl -g -l 8 h5stat_threshold.h5
+TOOLTEST h5stat_links2.ddl --links=8 h5stat_threshold.h5
+TOOLTEST h5stat_links3.ddl --links=20 -g h5stat_threshold.h5
+#
+# Tests for -l (--links) option on h5stat_newgrat.h5: 
+# 	-g
+# 	-g -l 40000
+TOOLTEST h5stat_links4.ddl -g h5stat_newgrat.h5
+TOOLTEST h5stat_links5.ddl -g -l 40000 h5stat_newgrat.h5
+#
+# Tests for -m (--dims) option on h5stat_threshold.h5
+# 	-d --dims=-1 (incorrect threshold value)
+# 	-gd -m 5
+# 	-d --di=15
+TOOLTEST h5stat_err1_dims.ddl -d --dims=-1 h5stat_threshold.h5
+TOOLTEST h5stat_dims1.ddl -gd -m 5 h5stat_threshold.h5
+TOOLTEST h5stat_dims2.ddl -d --di=15 h5stat_threshold.h5
+#
+# Tests for -a option on h5stat_threshold.h5
+# 	-a -2 (incorrect threshold value)
+#	--numattrs (without threshold value)
+#	-AS -a 10
+#	-a 1
+#	-A --numattrs=25
+TOOLTEST h5stat_err1_numattrs.ddl -a -2 h5stat_threshold.h5
+TOOLTEST h5stat_err2_numattrs.ddl --numattrs h5stat_threshold.h5
+TOOLTEST h5stat_numattrs1.ddl -AS -a 10 h5stat_threshold.h5
+TOOLTEST h5stat_numattrs2.ddl -a 1 h5stat_threshold.h5
+TOOLTEST h5stat_numattrs3.ddl -A --numattrs=25 h5stat_threshold.h5
+#
+# Tests for -a option on h5stat_newgrat.h5
+#	-A -a 100
+TOOLTEST h5stat_numattrs4.ddl -A -a 100 h5stat_newgrat.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/test/misc/CMakeLists.txt b/tools/test/misc/CMakeLists.txt
new file mode 100644
index 0000000..5e3c0a2
--- /dev/null
+++ b/tools/test/misc/CMakeLists.txt
@@ -0,0 +1,45 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_MISC)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+  # --------------------------------------------------------------------
+  # Add the misc test executables
+  # --------------------------------------------------------------------
+  if (HDF5_BUILD_GENERATORS)
+    add_executable (h5repart_gentest ${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/h5repart_gentest.c)
+    TARGET_NAMING (h5repart_gentest STATIC)
+    TARGET_C_PROPERTIES (h5repart_gentest STATIC " " " ")
+    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_executable (h5clear_gentest ${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/h5clear_gentest.c)
+    TARGET_NAMING (h5clear_gentest STATIC)
+    TARGET_C_PROPERTIES (h5clear_gentest STATIC " " " ")
+    target_link_libraries (h5clear_gentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+    set_target_properties (h5clear_gentest PROPERTIES FOLDER tools)
+    #add_test (NAME H5CLEAR-h5clear_gentest COMMAND $<TARGET_FILE:h5clear_gentest>)
+
+    add_subdirectory (${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/vds)
+
+  endif ()
+
+  add_executable (h5repart_test ${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/repart_test.c)
+  TARGET_NAMING (h5repart_test STATIC)
+  TARGET_C_PROPERTIES (h5repart_test STATIC " " " ")
+  target_link_libraries (h5repart_test ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (h5repart_test PROPERTIES FOLDER tools)
+
+  add_executable (clear_open_chk ${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/clear_open_chk.c)
+  TARGET_NAMING (clear_open_chk STATIC)
+  TARGET_C_PROPERTIES (clear_open_chk STATIC " " " ")
+  target_link_libraries (clear_open_chk ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (clear_open_chk PROPERTIES FOLDER tools)
+
+  include (CMakeTestsRepart.cmake)
+  include (CMakeTestsClear.cmake)
+  include (CMakeTestsMkgrp.cmake)
diff --git a/tools/test/misc/CMakeTestsClear.cmake b/tools/test/misc/CMakeTestsClear.cmake
new file mode 100644
index 0000000..7eba4a1
--- /dev/null
+++ b/tools/test/misc/CMakeTestsClear.cmake
@@ -0,0 +1,264 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the source directory into the test directory
+  # --------------------------------------------------------------------
+  set (HDF5_TEST_FILES
+      h5clear_log_v3.h5
+      h5clear_mdc_image.h5
+      mod_h5clear_mdc_image.h5
+      latest_h5clear_log_v3.h5
+      latest_h5clear_sec2_v3.h5
+  )
+  set (HDF5_SEC2_TEST_FILES
+      h5clear_sec2_v0.h5
+      h5clear_sec2_v2.h5
+      h5clear_sec2_v3.h5
+  )
+  set (HDF5_REFERENCE_TEST_FILES
+      h5clear_usage.ddl
+      h5clear_open_fail.ddl
+      h5clear_missing_file.ddl
+      h5clear_no_mdc_image.ddl
+  )
+
+  foreach (h5_file ${HDF5_TEST_FILES} ${HDF5_SEC2_TEST_FILES} ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_file}" "h5clear_files")
+  endforeach ()
+  # make second copy of h5clear_sec2.h5
+  foreach (h5_file ${HDF5_SEC2_TEST_FILES})
+    HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/orig_${h5_file}" "h5clear_files")
+  endforeach ()
+  # make second copy of mod_h5clear_mdc_image.h5
+  HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/mod_h5clear_mdc_image.h5" "${PROJECT_BINARY_DIR}/testfiles/mod_h5clear_mdc_image2.h5" "h5clear_files")
+  add_custom_target(h5clear_files ALL COMMENT "Copying files needed by h5clear tests" DEPENDS ${h5clear_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_CMP testname resultfile resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5CLEAR_CMP-${testname}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+                  ${testname}.out
+                  ${testname}.out.err
+      )
+      add_test (
+          NAME H5CLEAR_CMP-${testname}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5clear>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${testname}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5CLEAR_CMP-${testname} PROPERTIES DEPENDS H5CLEAR_CMP-${testname}-clear-objects)
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_RETTEST testname resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5CLEAR_RET-${testname}
+          COMMAND $<TARGET_FILE:h5clear> ${ARGN}
+      )
+      set_tests_properties (H5CLEAR_RET-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      set_tests_properties (H5CLEAR_RET-${testname} PROPERTIES WILL_FAIL "${resultcode}")
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5CLEAR_RET-${testname} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "H5CLEAR_RET-${testname}")
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_TEST testname resultcode)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5CLEAR-clear_open_chk-copy_${testname}.h5
+          COMMAND    ${CMAKE_COMMAND}
+              -E copy_if_different
+              "${PROJECT_SOURCE_DIR}/testfiles/${testname}.h5" "${PROJECT_BINARY_DIR}/testfiles/${testname}.h5"
+      )
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5CLEAR-clear_open_chk-copy_${testname}.h5 PROPERTIES DEPENDS ${last_test})
+      endif ()
+      set (last_test "H5CLEAR-clear_open_chk-copy_${testname}.h5")
+      # Initial file open fails OR
+      # File open succeeds because the library does not check status_flags for file with < v3 superblock
+      add_test (NAME H5CLEAR-clear_open_chk-${testname}_${resultcode} COMMAND $<TARGET_FILE:clear_open_chk> ${testname}.h5)
+      set_tests_properties (H5CLEAR-clear_open_chk-${testname}_${resultcode} PROPERTIES WILL_FAIL "${resultcode}")
+      set_tests_properties (H5CLEAR-clear_open_chk-${testname}_${resultcode} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5CLEAR-clear_open_chk-${testname}_${resultcode} PROPERTIES DEPENDS ${last_test})
+      endif ()
+      # After "h5clear" the file, the subsequent file open succeeds
+      add_test (NAME H5CLEAR-h5clear-${testname} COMMAND $<TARGET_FILE:h5clear> -s ${testname}.h5)
+      set_tests_properties (H5CLEAR-h5clear-${testname} PROPERTIES DEPENDS H5CLEAR-clear_open_chk-${testname}_${resultcode})
+      set_tests_properties (H5CLEAR-h5clear-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      add_test (NAME H5CLEAR-clear_open_chk-${testname} COMMAND $<TARGET_FILE:clear_open_chk> ${testname}.h5)
+      set_tests_properties (H5CLEAR-clear_open_chk-${testname} PROPERTIES DEPENDS H5CLEAR-h5clear-${testname})
+      set_tests_properties (H5CLEAR-clear_open_chk-${testname} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      set (last_test "H5CLEAR-clear_open_chk-${testname}")
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+#
+#
+#
+# The following are tests to verify the status_flags field is cleared properly:
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  # Remove any output file left over from previous test run
+  add_test (
+    NAME H5CLEAR-clearall-objects
+    COMMAND    ${CMAKE_COMMAND}
+        -E remove
+        h5clear_log_v3.h5
+        h5clear_mdc_image.h5
+        h5clear_sec2_v0.h5
+        h5clear_sec2_v2.h5
+        h5clear_sec2_v3.h5
+        orig_h5clear_sec2_v0.h5
+        orig_h5clear_sec2_v2.h5
+        orig_h5clear_sec2_v3.h5
+        latest_h5clear_log_v3.h5
+        latest_h5clear_sec2_v3.h5
+        mod_h5clear_mdc_image.h5
+        mod_h5clear_mdc_image2.h5
+  )
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (H5CLEAR-clearall-objects PROPERTIES DEPENDS ${last_test})
+  endif ()
+  set (last_test "H5CLEAR-clearall-objects")
+
+  foreach (h5_file ${HDF5_TEST_FILES} ${HDF5_SEC2_TEST_FILES})
+    add_test (
+      NAME H5CLEAR-copy_${h5_file}
+      COMMAND    ${CMAKE_COMMAND}
+          -E copy_if_different
+          "${PROJECT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_file}"
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5CLEAR-copy_${h5_file} PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5CLEAR-copy_${h5_file}")
+  endforeach ()
+  # make second copy of h5clear_sec2.h5
+  foreach (h5_file ${HDF5_SEC2_TEST_FILES})
+    add_test (
+      NAME H5CLEAR-copy_orig_${h5_file}
+      COMMAND    ${CMAKE_COMMAND}
+          -E copy_if_different
+          "${PROJECT_SOURCE_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/testfiles/orig_${h5_file}"
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5CLEAR-copy_orig_${h5_file} PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5CLEAR-copy_orig_${h5_file}")
+  endforeach ()
+  # make second copy of mod_h5clear_mdc_image.h5
+  add_test (
+      NAME H5CLEAR-copy_mod_h5clear_mdc_image2.h5
+      COMMAND    ${CMAKE_COMMAND}
+          -E copy_if_different
+          "${PROJECT_SOURCE_DIR}/testfiles/mod_h5clear_mdc_image.h5" "${PROJECT_BINARY_DIR}/testfiles/mod_h5clear_mdc_image2.h5"
+  )
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (H5CLEAR-copy_mod_h5clear_mdc_image2.h5 PROPERTIES DEPENDS ${last_test})
+  endif ()
+  set (last_test "H5CLEAR-copy_mod_h5clear_mdc_image2.h5")
+endif()
+
+#
+#
+#
+# The following are tests to verify the expected output from h5clear
+# "h5clear -h"
+# "h5clear"                                 (no options, no file)
+# "h5clear junk.h5"                         (no options, nonexisting file)
+# "h5clear orig_h5clear_sec2_v3.h5"         (no options, existing file)
+# "h5clear -m"                              (valid 1 option, no file)
+# "h5clear -s junk.h5"                      (valid 1 option, nonexisting file)
+# "h5clear -m -s"                           (valid 2 options, no file)
+# "h5clear -m -s junk.h5"                   (valid 2 options, nonexisting file)
+# "h5clear -m orig_h5clear_sec2_v2.h5"      (valid 1 option, existing file, no cache image)
+# "h5clear -s -m orig_h5clear_sec2_v0.h5"   (valid 2 options, existing file, no cache image)
+  ADD_H5_CMP (h5clear_usage_h h5clear_usage 0 "-h")
+  ADD_H5_CMP (h5clear_usage h5clear_usage 1 "")
+  ADD_H5_CMP (h5clear_usage_junk h5clear_usage 1 "" junk.h5)
+  ADD_H5_CMP (h5clear_usage_none h5clear_usage 1 "" orig_h5clear_sec2_v3.h5)
+  ADD_H5_CMP (h5clear_missing_file_m h5clear_missing_file 1 "-m")
+  ADD_H5_CMP (h5clear_open_fail_s h5clear_open_fail 1 "-s" junk.h5)
+  ADD_H5_CMP (h5clear_missing_file_ms h5clear_missing_file 1 "-m" "-s")
+  ADD_H5_CMP (h5clear_open_fail_ms h5clear_open_fail 1 "-m" "-s"  junk.h5)
+  ADD_H5_CMP (h5clear_no_mdc_image_m h5clear_no_mdc_image 0 "-m" orig_h5clear_sec2_v2.h5)
+  ADD_H5_CMP (h5clear_no_mdc_image_ms h5clear_no_mdc_image 0 "-s" "-m" orig_h5clear_sec2_v0.h5)
+#
+#
+#
+# The following are tests to verify the expected exit code from h5clear:
+# "h5clear -m h5clear_mdc_image.h5"     (valid option, existing file, succeed exit code)
+# "h5clear --vers"                      (valid option, version #, succeed exit code)
+# "h5clear -k"                          (invalid 1 option, no file, fail exit code)
+# "h5clear -k junk.h5"                  (invalid 1 option, nonexisting file, fail exit code)
+# "h5clear -l h5clear_sec2_v2.h5"       (invalid 1 option, existing file, fail exit code)
+# "h5clear -m -k"                       (valid/invalid 2 options, nofile, fail exit code)
+# "h5clear -l -m"                       (invalid/valid 2 options, nofile, fail exit code)
+# "h5clear -m -l junk.h5"               (valid/invalid 2 options, nonexisting file, fail exit code)
+# "h5clear -l -m junk.h5"               (invalid/valid 2 options, nonexisting file, fail exit code)
+# "h5clear -m -l h5clear_sec2_v0.h5"    (valid/invalid 2 options, existing file, fail exit code)
+# "h5clear -l -m h5clear_sec2_v0.h5"    (invalid/valid 2 options, existing file, fail exit code)
+  ADD_H5_RETTEST (h5clear_mdc_image "false" "-m" h5clear_mdc_image.h5)
+  ADD_H5_RETTEST (h5clear_vers "false" "--vers")
+  ADD_H5_RETTEST (h5clear_k "true" "-k")
+  ADD_H5_RETTEST (h5clear_k_junk "true" "-k" junk.h5)
+  ADD_H5_RETTEST (h5clear_l_sec2 "true" "-l" h5clear_sec2_v2.h5)
+  ADD_H5_RETTEST (h5clear_mk "true" "-m" "-k")
+  ADD_H5_RETTEST (h5clear_lm "true" "-l" "-m")
+  ADD_H5_RETTEST (h5clear_ml_junk "true" "-m" "-l" junk.h5)
+  ADD_H5_RETTEST (h5clear_lm_junk "true" "-l" "-m" junk.h5)
+  ADD_H5_RETTEST (h5clear_ml_sec2 "true" "-m" "-l" h5clear_sec2_v0.h5)
+  ADD_H5_RETTEST (h5clear_lm_sec2 "true" "-l" "-m" h5clear_sec2_v0.h5)
+#
+#
+#
+# h5clear_mdc_image.h5 already has cache image removed earlier, verify the expected warning from h5clear:
+  ADD_H5_CMP (h5clear_mdc_image_m h5clear_no_mdc_image 0 "-m" mod_h5clear_mdc_image.h5)
+  ADD_H5_CMP (h5clear_mdc_image_sm h5clear_no_mdc_image 0 "-s" "-m" mod_h5clear_mdc_image2.h5)
+#
+#
+#
+# The following are tests to verify the status_flags field is cleared properly:
+  ADD_H5_TEST (h5clear_sec2_v3 "true")
+  ADD_H5_TEST (h5clear_log_v3 "true")
+  ADD_H5_TEST (latest_h5clear_sec2_v3 "true")
+  ADD_H5_TEST (latest_h5clear_log_v3 "true")
+  ADD_H5_TEST (h5clear_sec2_v0 "false")
+  ADD_H5_TEST (h5clear_sec2_v2 "false")
diff --git a/tools/test/misc/CMakeTestsMkgrp.cmake b/tools/test/misc/CMakeTestsMkgrp.cmake
new file mode 100644
index 0000000..7011b19
--- /dev/null
+++ b/tools/test/misc/CMakeTestsMkgrp.cmake
@@ -0,0 +1,199 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the source directory into the test directory
+  # --------------------------------------------------------------------
+  set (HDF5_MKGRP_TEST_FILES
+      #h5mkgrp_help.txt
+      #h5mkgrp_version
+      h5mkgrp_single.ls
+      h5mkgrp_single_v.ls
+      h5mkgrp_single_p.ls
+      h5mkgrp_single_l.ls
+      h5mkgrp_several.ls
+      h5mkgrp_several_v.ls
+      h5mkgrp_several_p.ls
+      h5mkgrp_several_l.ls
+      h5mkgrp_nested_p.ls
+      h5mkgrp_nested_lp.ls
+      h5mkgrp_nested_mult_p.ls
+      h5mkgrp_nested_mult_lp.ls
+  )
+
+  # make test dir
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+
+  foreach (h5_mkgrp_file ${HDF5_MKGRP_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_mkgrp_file}" "${PROJECT_BINARY_DIR}/testfiles/${h5_mkgrp_file}" "h5mkgrp_files")
+  endforeach ()
+
+  HDFTEST_COPY_FILE("${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/testfiles/h5mkgrp_help.txt" "${PROJECT_BINARY_DIR}/testfiles/h5mkgrp_help.txt" "h5mkgrp_files")
+  add_custom_target(h5mkgrp_files ALL COMMENT "Copying files needed by h5mkgrp tests" DEPENDS ${h5mkgrp_files_list})
+
+  configure_file (${HDF5_TOOLS_TEST_MISC_SOURCE_DIR}/testfiles/h5mkgrp_version.txt.in ${PROJECT_BINARY_DIR}/testfiles/h5mkgrp_version.txt @ONLY)
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  macro (ADD_H5_TEST resultfile resultcode resultoption)
+    if (NOT HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5MKGRP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+                  ${resultfile}.h5
+      )
+      set_tests_properties (H5MKGRP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+    endif ()
+
+    add_test (
+        NAME H5MKGRP-${resultfile}
+        COMMAND $<TARGET_FILE:h5mkgrp> ${resultoption} ${resultfile}.h5 ${ARGN}
+    )
+    set_tests_properties (H5MKGRP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5MKGRP-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif ()
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      set_tests_properties (H5MKGRP-${resultfile} PROPERTIES DEPENDS H5MKGRP-${resultfile}-clear-objects)
+      add_test (
+          NAME H5MKGRP-${resultfile}-h5ls
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5ls>"
+              -D "TEST_ARGS:STRING=-v;-r;${resultfile}.h5"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_MASK_MOD=true"
+              -D "TEST_REFERENCE=${resultfile}.ls"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5MKGRP-${resultfile}-h5ls PROPERTIES DEPENDS H5MKGRP-${resultfile})
+    endif ()
+  endmacro ()
+
+  macro (ADD_H5_CMP resultfile resultcode)
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5MKGRP_CMP-${resultfile} COMMAND $<TARGET_FILE:h5mkgrp> ${ARGN})
+    else ()
+      add_test (
+          NAME H5MKGRP_CMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove
+                  ${resultfile}.h5
+      )
+      set_tests_properties (H5MKGRP_CMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+      add_test (
+          NAME H5MKGRP_CMP-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5mkgrp>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.txt"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5MKGRP_CMP-${resultfile} PROPERTIES DEPENDS H5MKGRP_CMP-${resultfile}-clear-objects)
+    endif ()
+  endmacro ()
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    add_test (
+        NAME H5MKGRP-clearall-objects
+        COMMAND    ${CMAKE_COMMAND}
+            -E remove
+                h5mkgrp_help.out
+                h5mkgrp_help.out.err
+                h5mkgrp_version.out
+                h5mkgrp_version.out.err
+                h5mkgrp_single.h5
+                h5mkgrp_single.out
+                h5mkgrp_single.out.err
+                h5mkgrp_single_v.h5
+                h5mkgrp_single_v.out
+                h5mkgrp_single_v.out.err
+                h5mkgrp_single_p.h5
+                h5mkgrp_single_p.out
+                h5mkgrp_single_p.out.err
+                h5mkgrp_single_l.h5
+                h5mkgrp_single_l.out
+                h5mkgrp_single_l.out.err
+                h5mkgrp_several.h5
+                h5mkgrp_several.out
+                h5mkgrp_several.out.err
+                h5mkgrp_several_v.h5
+                h5mkgrp_several_v.out
+                h5mkgrp_several_v.out.err
+                h5mkgrp_several_p.h5
+                h5mkgrp_several_p.out
+                h5mkgrp_several_p.out.err
+                h5mkgrp_several_l.h5
+                h5mkgrp_several_l.out
+                h5mkgrp_several_l.out.err
+                h5mkgrp_nested_p.h5
+                h5mkgrp_nested_p.out
+                h5mkgrp_nested_p.out.err
+                h5mkgrp_nested_lp.h5
+                h5mkgrp_nested_lp.out
+                h5mkgrp_nested_lp.out.err
+                h5mkgrp_nested_mult_p.h5
+                h5mkgrp_nested_mult_p.out
+                h5mkgrp_nested_mult_p.out.err
+                h5mkgrp_nested_mult_lp.h5
+                h5mkgrp_nested_mult_lp.out
+                h5mkgrp_nested_mult_lp.out.err
+    )
+    set_tests_properties (H5MKGRP-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5MKGRP-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif ()
+    set (last_test "H5MKGRP-clearall-objects")
+  endif ()
+
+  # Check that help & version is displayed properly
+  ADD_H5_CMP (h5mkgrp_help 0 "-h")
+  ADD_H5_CMP (h5mkgrp_version 0 "-V")
+
+  # Create single group at root level
+  ADD_H5_TEST (h5mkgrp_single 0 "" single)
+  ADD_H5_TEST (h5mkgrp_single_v 0 "-v" single)
+  ADD_H5_TEST (h5mkgrp_single_p 0 "-p" single)
+  ADD_H5_TEST (h5mkgrp_single_l 0 "-l" latest)
+
+  # Create several groups at root level
+  ADD_H5_TEST (h5mkgrp_several 0 "" one two)
+  ADD_H5_TEST (h5mkgrp_several_v 0 "-v" one two)
+  ADD_H5_TEST (h5mkgrp_several_p 0 "-p" one two)
+  ADD_H5_TEST (h5mkgrp_several_l 0 "-l" one two)
+
+  # Create various nested groups
+  ADD_H5_TEST (h5mkgrp_nested_p 0 "-p" /one/two)
+  ADD_H5_TEST (h5mkgrp_nested_lp 0 "-lp" /one/two)
+  ADD_H5_TEST (h5mkgrp_nested_mult_p 0 "-p" /one/two /three/four)
+  ADD_H5_TEST (h5mkgrp_nested_mult_lp 0 "-lp" /one/two /three/four)
diff --git a/tools/test/misc/CMakeTestsRepart.cmake b/tools/test/misc/CMakeTestsRepart.cmake
new file mode 100644
index 0000000..37da903
--- /dev/null
+++ b/tools/test/misc/CMakeTestsRepart.cmake
@@ -0,0 +1,96 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the HDF5 files from the source directory into the test directory
+  # --------------------------------------------------------------------
+  set (HDF5_REFERENCE_TEST_FILES
+      family_file00000.h5
+      family_file00001.h5
+      family_file00002.h5
+      family_file00003.h5
+      family_file00004.h5
+      family_file00005.h5
+      family_file00006.h5
+      family_file00007.h5
+      family_file00008.h5
+      family_file00009.h5
+      family_file00010.h5
+      family_file00011.h5
+      family_file00012.h5
+      family_file00013.h5
+      family_file00014.h5
+      family_file00015.h5
+      family_file00016.h5
+      family_file00017.h5
+  )
+
+  foreach (h5_file ${HDF5_REFERENCE_TEST_FILES})
+    HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "h5repart_files")
+  endforeach ()
+  add_custom_target(h5repart_files ALL COMMENT "Copying files needed by h5repart tests" DEPENDS ${h5repart_files_list})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  # Remove any output file left over from previous test run
+  add_test (
+    NAME H5REPART-clearall-objects
+    COMMAND    ${CMAKE_COMMAND}
+        -E remove
+        fst_family00000.h5
+        scd_family00000.h5
+        scd_family00001.h5
+        scd_family00002.h5
+        scd_family00003.h5
+        family_to_sec2.h5
+  )
+  if (NOT "${last_test}" STREQUAL "")
+    set_tests_properties (H5REPART-clearall-objects PROPERTIES DEPENDS ${last_test})
+  endif ()
+  set (last_test "H5REPART-clearall-objects")
+
+  # repartition family member size to 20,000 bytes.
+  add_test (NAME H5REPART-h5repart_20K COMMAND $<TARGET_FILE:h5repart> -m 20000 family_file%05d.h5 fst_family%05d.h5)
+  set_tests_properties (H5REPART-h5repart_20K PROPERTIES DEPENDS H5REPART-clearall-objects)
+
+  # repartition family member size to 5 KB.
+  add_test (NAME H5REPART-h5repart_5K COMMAND $<TARGET_FILE:h5repart> -m 5k family_file%05d.h5 scd_family%05d.h5)
+  set_tests_properties (H5REPART-h5repart_5K PROPERTIES DEPENDS H5REPART-clearall-objects)
+
+  # convert family file to sec2 file of 20,000 bytes
+  add_test (NAME H5REPART-h5repart_sec2 COMMAND $<TARGET_FILE:h5repart> -m 20000 -family_to_sec2 family_file%05d.h5 family_to_sec2.h5)
+  set_tests_properties (H5REPART-h5repart_sec2 PROPERTIES DEPENDS H5REPART-clearall-objects)
+
+  # test the output files repartitioned above.
+  add_test (NAME H5REPART-h5repart_test COMMAND $<TARGET_FILE:h5repart_test>)
+  set_tests_properties (H5REPART-h5repart_test PROPERTIES DEPENDS "H5REPART-clearall-objects;H5REPART-h5repart_20K;H5REPART-h5repart_5K;H5REPART-h5repart_sec2")
+
+  set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES}
+        h5repart_test
+  )
diff --git a/tools/test/misc/Makefile.am b/tools/test/misc/Makefile.am
new file mode 100644
index 0000000..f2d2489
--- /dev/null
+++ b/tools/test/misc/Makefile.am
@@ -0,0 +1,45 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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
+
+SUBDIRS=vds
+
+# Include src directory
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
+
+#test scripts and programs
+TEST_PROG=h5repart_gentest h5clear_gentest talign
+TEST_SCRIPT=testh5repart.sh testh5mkgrp.sh testh5clear.sh
+
+check_PROGRAMS=$(TEST_PROG) repart_test clear_open_chk
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=../../src/misc/h5repart$(EXEEXT) ../../src/misc/h5mkgrp$(EXEEXT) ../../src/misc/h5clear$(EXEEXT)
+
+# Temporary files.  *.h5 are generated by h5repart_gentest.  They should
+# copied to the testfiles/ directory if update is required. fst_family*.h5
+# and scd_family*.h5 were created by setting the HDF5_NOCLEANUP variable.
+CHECK_CLEANFILES+=*.h5 ../testfiles/fst_family*.h5 ../testfiles/scd_family*.h5 append.log
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES=testh5repart.sh testh5clear.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/misc/Makefile.in b/tools/test/misc/Makefile.in
new file mode 100644
index 0000000..10ce8d8
--- /dev/null
+++ b/tools/test/misc/Makefile.in
@@ -0,0 +1,1604 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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) repart_test$(EXEEXT) \
+	clear_open_chk$(EXEEXT)
+TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 = testh5clear.sh testh5mkgrp.sh testh5repart.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = h5repart_gentest$(EXEEXT) h5clear_gentest$(EXEEXT) \
+	talign$(EXEEXT)
+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_gentest_SOURCES = h5clear_gentest.c
+h5clear_gentest_OBJECTS = h5clear_gentest.$(OBJEXT)
+h5clear_gentest_LDADD = $(LDADD)
+h5clear_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5repart_gentest_SOURCES = h5repart_gentest.c
+h5repart_gentest_OBJECTS = h5repart_gentest.$(OBJEXT)
+h5repart_gentest_LDADD = $(LDADD)
+h5repart_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+repart_test_SOURCES = repart_test.c
+repart_test_OBJECTS = repart_test.$(OBJEXT)
+repart_test_LDADD = $(LDADD)
+repart_test_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+talign_SOURCES = talign.c
+talign_OBJECTS = talign.$(OBJEXT)
+talign_LDADD = $(LDADD)
+talign_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 = clear_open_chk.c h5clear_gentest.c h5repart_gentest.c \
+	repart_test.c talign.c
+DIST_SOURCES = clear_open_chk.c h5clear_gentest.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
+# *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)
+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)
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.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@
+
+# 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_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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.  *.h5 are generated by h5repart_gentest.  They should
+# copied to the testfiles/ directory if update is required. fst_family*.h5
+# 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 \
+	append.log
+SUBDIRS = vds
+
+#test scripts and programs
+TEST_PROG = h5repart_gentest h5clear_gentest talign
+TEST_SCRIPT = testh5repart.sh testh5mkgrp.sh testh5clear.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = ../../src/misc/h5repart$(EXEEXT) ../../src/misc/h5mkgrp$(EXEEXT) ../../src/misc/h5clear$(EXEEXT)
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES = testh5repart.sh testh5clear.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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-recursive
+
+.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/test/misc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/misc/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):
+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
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+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
+
+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_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)
+
+h5repart_gentest$(EXEEXT): $(h5repart_gentest_OBJECTS) $(h5repart_gentest_DEPENDENCIES) $(EXTRA_h5repart_gentest_DEPENDENCIES) 
+	@rm -f h5repart_gentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5repart_gentest_OBJECTS) $(h5repart_gentest_LDADD) $(LIBS)
+
+repart_test$(EXEEXT): $(repart_test_OBJECTS) $(repart_test_DEPENDENCIES) $(EXTRA_repart_test_DEPENDENCIES) 
+	@rm -f repart_test$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(repart_test_OBJECTS) $(repart_test_LDADD) $(LIBS)
+
+talign$(EXEEXT): $(talign_OBJECTS) $(talign_DEPENDENCIES) $(EXTRA_talign_DEPENDENCIES) 
+	@rm -f talign$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(talign_OBJECTS) $(talign_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+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_gentest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repart_gentest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/repart_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/talign.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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
+
+# 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-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 \
+	  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-recursive
+
+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-recursive
+
+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 $$?
+h5repart_gentest.log: h5repart_gentest$(EXEEXT)
+	@p='h5repart_gentest$(EXEEXT)'; \
+	b='h5repart_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)
+h5clear_gentest.log: h5clear_gentest$(EXEEXT)
+	@p='h5clear_gentest$(EXEEXT)'; \
+	b='h5clear_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)
+talign.log: talign$(EXEEXT)
+	@p='talign$(EXEEXT)'; \
+	b='talign'; \
+	$(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
+	@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-recursive
+all-am: Makefile all-local
+installdirs: installdirs-recursive
+installdirs-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-recursive
+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-recursive
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.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-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 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
+
+.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-dyn: $(DYN)
+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 dyn 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/test/misc/clear_open_chk.c b/tools/test/misc/clear_open_chk.c
new file mode 100644
index 0000000..3a61385
--- /dev/null
+++ b/tools/test/misc/clear_open_chk.c
@@ -0,0 +1,71 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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();
+        HDexit(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");
+        HDfree(fname);
+        HDexit(EXIT_FAILURE);
+    }
+    HDfree(fname);
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+        HDfprintf(stderr, "clear_open_chk: cannot close the file\n");
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* Return success */
+    HDexit(EXIT_SUCCESS);
+} /* main() */
diff --git a/tools/test/misc/h5clear_gentest.c b/tools/test/misc/h5clear_gentest.c
new file mode 100644
index 0000000..326109c
--- /dev/null
+++ b/tools/test/misc/h5clear_gentest.c
@@ -0,0 +1,277 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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
+
+#define CACHE_IMAGE_FILE    "h5clear_mdc_image.h5"
+#define DSET                "DSET"
+
+/*-------------------------------------------------------------------------
+ * Function:	gen_cache_image_file
+ *
+ * Purpose:	    To create a file with cache image feature enabled.
+ *
+ * Return:      Success:	0
+ *              Failure:	1
+ *
+ * Programmer:	Vailin Choi; March 2017
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+gen_cache_image_file(const char *fname)
+{
+    hid_t fid = -1;                 /* File ID */
+    hid_t did = -1, sid = -1;       /* Dataset ID, dataspace ID */
+    hid_t fapl = -1;                /* File access property list */
+    hid_t dcpl = -1;                /* Dataset creation property list */
+    hsize_t dims[2];                /* Dimension sizes */
+    hsize_t chunks[2];              /* Chunked dimension sizes */
+    int buf[50][100];               /* Buffer for data to write */
+    int i, j;                       /* Local index variables */
+    H5AC_cache_image_config_t cache_image_config =  /* Cache image input configuration */
+                            { H5AC__CURR_CACHE_IMAGE_CONFIG_VERSION,
+                              TRUE, FALSE,
+                              H5AC__CACHE_IMAGE__ENTRY_AGEOUT__NONE};
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        goto error;
+
+    /* Enable latest format in fapl */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        goto error;
+
+    /* Enable metadata cache image in fapl */
+    if(H5Pset_mdc_image_config(fapl, &cache_image_config) < 0)
+        goto error;
+
+    /* Create the file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        goto error;
+
+    /* Create dataspace */
+    dims[0] = 50;
+    dims[1] = 100;
+    if((sid = H5Screate_simple(2, dims, NULL)) < 0)
+        goto error;
+
+    /* Initialize buffer for writing to dataset */
+    for(i = 0; i < 50; i++)
+        for(j = 0; j < 100; j++)
+            buf[i][j] = i * j;
+
+    /* Set up to create a chunked dataset */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        goto error;
+    chunks[0] = 5;
+    chunks[1] = 10;
+    if(H5Pset_chunk(dcpl, 2, chunks) < 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;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+        goto error;
+    if(H5Pclose(dcpl) < 0)
+        goto error;
+    if(H5Pclose(fapl) < 0)
+        goto error;
+    if(H5Sclose(sid) < 0)
+        goto error;
+    if(H5Fclose(fid) < 0)
+        goto error;
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Fclose(fid);
+        H5Pclose(fapl);
+        H5Pclose(dcpl);
+    } H5E_END_TRY;
+    return 1;
+}
+
+/*-------------------------------------------------------------------------
+ * 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 */
+
+    /* Generate a file with cache image feature enabled */
+    if(gen_cache_image_file(CACHE_IMAGE_FILE) < 0)
+        goto error;
+
+    /* 
+     * Generate files with invalid status_flags 
+     */
+
+    /* 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/test/misc/h5perf_gentest.c b/tools/test/misc/h5perf_gentest.c
new file mode 100644
index 0000000..3784278
--- /dev/null
+++ b/tools/test/misc/h5perf_gentest.c
@@ -0,0 +1,609 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*****************************************************************************
+  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/test/misc/h5repart_gentest.c b/tools/test/misc/h5repart_gentest.c
new file mode 100644
index 0000000..5c1ff87
--- /dev/null
+++ b/tools/test/misc/h5repart_gentest.c
@@ -0,0 +1,99 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu<slu at ncsa.uiuc.edu>
+ *              June 1, 2005
+ *
+ * Purpose:     Generate a family file of 1024 bytes for each member
+ *              for h5repart test.
+ */
+#include "hdf5.h"
+#include "H5private.h"
+
+#define FAMILY_NUMBER   4
+#define FAMILY_SIZE     1024
+#define FILENAME        "family_file%05d.h5"
+
+static int buf[FAMILY_NUMBER][FAMILY_SIZE];
+
+int main(void)
+{
+    hid_t       file=(-1), fapl, space=(-1), dset=(-1);
+    char        dname[]="dataset";
+    int         i, j;
+    hsize_t     dims[2]={FAMILY_NUMBER, FAMILY_SIZE};
+
+    /* Set property list and file name for FAMILY driver */
+    if ((fapl=H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        perror ("H5Pcreate");
+        exit (EXIT_FAILURE);
+    }
+
+    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_SIZE, H5P_DEFAULT) < 0) {
+        perror ("H5Pset_fapl_family");
+        exit (EXIT_FAILURE);
+    }
+
+    if((file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) {
+        perror("H5Fcreate");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Create and write dataset */
+    if((space = H5Screate_simple(2, dims, NULL)) < 0) {
+        perror("H5Screate_simple");
+        exit(EXIT_FAILURE);
+    }
+
+
+    if((dset = H5Dcreate2(file, dname, H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+        perror("H5Dcreate2");
+        exit(EXIT_FAILURE);
+    }
+
+
+    for(i = 0; i<FAMILY_NUMBER; i++)
+        for(j = 0; j<FAMILY_SIZE; j++)
+            buf[i][j] = i * 10000 + j;
+
+    if(H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) {
+        perror("H5Dwrite");
+        exit(EXIT_FAILURE);
+    }
+
+
+    if(H5Sclose(space) < 0) {
+        perror ("H5Sclose");
+        exit (EXIT_FAILURE);
+    }
+
+    if(H5Dclose(dset) < 0) {
+        perror ("H5Dclose");
+        exit (EXIT_FAILURE);
+    }
+
+    if(H5Pclose(fapl) < 0) {
+        perror ("H5Pclose");
+        exit (EXIT_FAILURE);
+    }
+
+    if(H5Fclose(file) < 0) {
+        perror ("H5Fclose");
+        exit (EXIT_FAILURE);
+    }
+
+    puts(" PASSED"); fflush(stdout);
+
+    return 0;
+}
diff --git a/tools/test/misc/repart_test.c b/tools/test/misc/repart_test.c
new file mode 100644
index 0000000..372f46a
--- /dev/null
+++ b/tools/test/misc/repart_test.c
@@ -0,0 +1,163 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Raymond Lu <slu at ncsa.uiuc.edu>
+ *              June 1, 2005
+ *
+ * Purpose:	This program tests family files after being repartitioned
+ *              by h5repart.  It simply tries to reopen the files with
+ *              correct family driver and member size.
+ */
+#include "hdf5.h"
+
+#define KB                      1024
+#define FAMILY_H5REPART_SIZE1   20000
+#define FAMILY_H5REPART_SIZE2   (5*KB)
+#define MAX(a,b) (a>b ? a:b)
+
+const char *FILENAME[] = {
+    "fst_family%05d.h5",
+    "scd_family%05d.h5",
+    "family_to_sec2.h5",
+    NULL
+};
+
+herr_t test_family_h5repart_opens(void);
+herr_t test_sec2_h5repart_opens(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_family_h5repart_opens
+ *
+ * Purpose:     Tries to reopen family files.
+ *
+ * Return:      Success:        exit(0)
+ *
+ *              Failure:        exit(1)
+ *
+ * Programmer:  Raymond Lu
+ *              June 1, 2005
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+herr_t
+test_family_h5repart_opens(void)
+{
+    hid_t       file=(-1), fapl=(-1);
+
+    /* open 1st file(single member file) with correct family size(20000 byte) */
+    if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0)
+        goto error;
+
+    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_H5REPART_SIZE1, H5P_DEFAULT)<0)
+        goto error;
+
+    if((file=H5Fopen(FILENAME[0], H5F_ACC_RDWR, fapl))<0)
+        goto error;
+
+    if(H5Fclose(file)<0)
+        goto error;
+
+    /* open 2nd file(multiple member files) with correct family size(5KB) */
+    if(H5Pset_fapl_family(fapl, (hsize_t)FAMILY_H5REPART_SIZE2, H5P_DEFAULT)<0)
+        goto error;
+
+    if((file=H5Fopen(FILENAME[1], H5F_ACC_RDWR, fapl))<0)
+        goto error;
+
+    if(H5Fclose(file)<0)
+        goto error;
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(file);
+    } H5E_END_TRY;
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_sec2_h5repart_opens
+ *
+ * Purpose:     Tries to reopen a sec2 file.
+ *
+ * Return:      Success:        exit(0)
+ *
+ *              Failure:        exit(1)
+ *
+ * Programmer:  Raymond Lu
+ *              June 21, 2005
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+herr_t
+test_sec2_h5repart_opens(void)
+{
+    hid_t       file=(-1);
+
+    /* open the sec2 file */
+    if((file=H5Fopen(FILENAME[2], H5F_ACC_RDWR, H5P_DEFAULT))<0)
+        goto error;
+
+    if(H5Fclose(file)<0)
+        goto error;
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(file);
+    } H5E_END_TRY;
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Tests h5repart-ed family files
+ *
+ * Return:      Success:        exit(0)
+ *
+ *              Failure:        exit(1)
+ *
+ * Programmer:  Raymond Lu
+ *              June 1, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    int                 nerrors=0;
+
+    nerrors += test_family_h5repart_opens()<0   ?1:0;
+    nerrors += test_sec2_h5repart_opens()<0     ?1:0;
+
+    if (nerrors) goto error;
+
+    return 0;
+
+error:
+    nerrors = MAX(1, nerrors);
+    printf("***** %d FAMILY FILE TEST%s FAILED! *****\n",
+            nerrors, 1 == nerrors ? "" : "S");
+    return 1;
+}
diff --git a/tools/test/misc/talign.c b/tools/test/misc/talign.c
new file mode 100644
index 0000000..7ca1f92
--- /dev/null
+++ b/tools/test/misc/talign.c
@@ -0,0 +1,242 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Small program to illustrate the "misalignment" of members within a compound
+ * datatype, in a datatype fixed by H5Tget_native_type().
+ */
+#include <string.h>
+#include <stdlib.h>
+/*#include <unistd.h>	*//* Required for unlink() */
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+
+const char *fname = "talign.h5";
+const char *setname = "align";
+
+/*
+ * This program assumes that there is no extra space between the members 'Ok'
+ * and 'Not Ok', (there shouldn't be because they are of the same atomic type
+ * H5T_NATIVE_FLOAT, and they are placed within the compound next to one
+ * another per construction)
+ */
+
+int main(void)
+{
+    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];
+
+    char string5[5];
+    float fok[2] = {1234.0f, 2341.0f};
+    float fnok[2] = {5678.0f, 6785.0f};
+    float *fptr = NULL;
+
+    char *data = NULL;
+
+    int result = 0;
+    herr_t error = 1;
+
+    printf("%-70s", "Testing alignment in compound datatypes");
+
+    strcpy(string5, "Hi!");
+    HDunlink(fname);
+    fil = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    if (fil < 0) {
+        puts("*FAILED*");
+        return 1;
+    }
+
+    H5E_BEGIN_TRY {
+        (void)H5Ldelete(fil, setname, H5P_DEFAULT);
+    } H5E_END_TRY;
+
+    cs6 = H5Tcopy(H5T_C_S1);
+    H5Tset_size(cs6, sizeof(string5));
+    H5Tset_strpad(cs6, H5T_STR_NULLPAD);
+
+    cmp = H5Tcreate(H5T_COMPOUND, sizeof(fok) + sizeof(string5) + sizeof(fnok));
+    H5Tinsert(cmp, "Awkward length", 0, cs6);
+
+    cdim[0] = sizeof(fok) / sizeof(float);
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
+    H5Tinsert(cmp, "Ok", sizeof(string5), array_dt);
+    H5Tclose(array_dt);
+
+    cdim[0] = sizeof(fnok) / sizeof(float);
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
+    H5Tinsert(cmp, "Not Ok", sizeof(fok) + sizeof(string5), array_dt);
+    H5Tclose(array_dt);
+
+    fix = h5tools_get_native_type(cmp);
+
+    cmp1 = H5Tcreate(H5T_COMPOUND, sizeof(fok));
+
+    cdim[0] = sizeof(fok) / sizeof(float);
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
+    H5Tinsert(cmp1, "Ok", 0, array_dt);
+    H5Tclose(array_dt);
+
+    cmp2 = H5Tcreate(H5T_COMPOUND, sizeof(string5));
+    H5Tinsert(cmp2, "Awkward length", 0, cs6);
+
+    cmp3 = H5Tcreate(H5T_COMPOUND, sizeof(fnok));
+
+    cdim[0] = sizeof(fnok) / sizeof(float);
+    array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, cdim);
+    H5Tinsert(cmp3, "Not Ok", 0, array_dt);
+    H5Tclose(array_dt);
+
+    plist = H5Pcreate(H5P_DATASET_XFER);
+    if((error = H5Pset_preserve(plist, 1)) < 0) 
+        goto out;
+
+    /*
+     * Create a small dataset, and write data into it we write each field
+     * in turn so that we are avoid alignment issues at this point
+     */
+    dim[0] = 1;
+    spc = H5Screate_simple(1, dim, NULL);
+    set = H5Dcreate2(fil, setname, cmp, spc, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+    H5Dwrite(set, cmp1, spc, H5S_ALL, plist, fok);
+    H5Dwrite(set, cmp2, spc, H5S_ALL, plist, string5);
+    H5Dwrite(set, cmp3, spc, H5S_ALL, plist, fnok);
+
+    H5Dclose(set);
+
+    /* Now open the set, and read it back in */
+    data = (char *)HDmalloc(H5Tget_size(fix));
+
+    if(!data) {
+        perror("malloc() failed");
+        abort();
+    }
+
+    set = H5Dopen2(fil, setname, H5P_DEFAULT);
+
+    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(!(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;
+        mname = H5Tget_member_name(fix, 0);
+        printf("%14s (%2d) %6s = %s\n",
+            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,0),
+            string5, (char *)(data + H5Tget_member_offset(fix, 0)));
+        if(mname)
+            H5free_memory(mname);
+
+        fptr = (float *)(data + H5Tget_member_offset(fix, 1));
+        mname = H5Tget_member_name(fix, 1);
+        printf("Data comparison:\n"
+            "%14s (%2d) %6f = %f\n"
+            "                    %6f = %f\n",
+            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,1),
+            (double)fok[0], (double)fptr[0],
+            (double)fok[1], (double)fptr[1]);
+        if(mname)
+            H5free_memory(mname);
+
+        fptr = (float *)(data + H5Tget_member_offset(fix, 2));
+        mname = H5Tget_member_name(fix, 2);
+        printf("%14s (%2d) %6f = %f\n"
+            "                    %6f = %6f\n",
+            mname ? mname : "(null)", (int)H5Tget_member_offset(fix,2),
+            (double)fnok[0], (double)fptr[0],
+            (double)fnok[1], (double)fptr[1]);
+        if(mname)
+            H5free_memory(mname);
+
+        fptr = (float *)(data + H5Tget_member_offset(fix, 1));
+        printf("\n"
+            "Short circuit\n"
+            "                    %6f = %f\n"
+            "                    %6f = %f\n"
+            "                    %6f = %f\n"
+            "                    %6f = %f\n",
+            (double)fok[0], (double)fptr[0],
+            (double)fok[1], (double)fptr[1],
+            (double)fnok[0], (double)fptr[2],
+            (double)fnok[1], (double)fptr[3]);
+        puts("*FAILED - compound type alignmnent problem*");
+    } else {
+        puts(" PASSED");
+    }
+
+    if(data)
+        HDfree(data);
+    H5Sclose(spc);
+    H5Tclose(cs6);
+    H5Tclose(cmp);
+    H5Tclose(fix);
+    H5Tclose(cmp1);
+    H5Tclose(cmp2);
+    H5Tclose(cmp3);
+    H5Pclose(plist);
+    H5Fclose(fil);
+    HDunlink(fname);
+    fflush(stdout);
+    return result;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: h5tools_get_native_type
+ *
+ * Purpose: Wrapper around H5Tget_native_type() to work around
+ *  Problems with bitfields.
+ *
+ * Return: Success:    datatype ID
+ *
+ *  Failure:    FAIL
+ *
+ * Programmer: Quincey Koziol
+ *              Tuesday, October  5, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+h5tools_get_native_type(hid_t type)
+{
+    hid_t p_type;
+    H5T_class_t type_class;
+
+    type_class = H5Tget_class(type);
+    if(type_class==H5T_BITFIELD)
+        p_type=H5Tcopy(type);
+    else
+        p_type = H5Tget_native_type(type,H5T_DIR_DEFAULT);
+
+    return(p_type);
+}
+
diff --git a/tools/test/misc/testfiles/h5clear_log_v3.h5 b/tools/test/misc/testfiles/h5clear_log_v3.h5
new file mode 100644
index 0000000..aed33a4
Binary files /dev/null and b/tools/test/misc/testfiles/h5clear_log_v3.h5 differ
diff --git a/tools/test/misc/testfiles/h5clear_mdc_image.h5 b/tools/test/misc/testfiles/h5clear_mdc_image.h5
new file mode 100644
index 0000000..6ed8b70
Binary files /dev/null and b/tools/test/misc/testfiles/h5clear_mdc_image.h5 differ
diff --git a/tools/test/misc/testfiles/h5clear_missing_file.ddl b/tools/test/misc/testfiles/h5clear_missing_file.ddl
new file mode 100644
index 0000000..1e5150c
--- /dev/null
+++ b/tools/test/misc/testfiles/h5clear_missing_file.ddl
@@ -0,0 +1,15 @@
+usage: h5clear [OPTIONS] file_name
+  OPTIONS
+   -h, --help                Print a usage message and exit
+   -V, --version             Print version number and exit
+   -s, --status              Clear the status_flags field in the file's superblock
+   -m, --image               Remove the metadata cache image from the file
+
+Examples of use:
+
+h5clear -s file_name
+  Clear the status_flags field in the superblock of the HDF5 file <file_name>.
+
+h5clear -m file_name
+  Remove the metadata cache image from the HDF5 file <file_name>.
+h5clear error: missing file name
diff --git a/tools/test/misc/testfiles/h5clear_no_mdc_image.ddl b/tools/test/misc/testfiles/h5clear_no_mdc_image.ddl
new file mode 100644
index 0000000..f5acd71
--- /dev/null
+++ b/tools/test/misc/testfiles/h5clear_no_mdc_image.ddl
@@ -0,0 +1 @@
+h5clear warning: No cache image in the file
diff --git a/tools/test/misc/testfiles/h5clear_open_fail.ddl b/tools/test/misc/testfiles/h5clear_open_fail.ddl
new file mode 100644
index 0000000..895ecd4
--- /dev/null
+++ b/tools/test/misc/testfiles/h5clear_open_fail.ddl
@@ -0,0 +1 @@
+h5clear error: h5tools_fopen
diff --git a/tools/test/misc/testfiles/h5clear_sec2_v0.h5 b/tools/test/misc/testfiles/h5clear_sec2_v0.h5
new file mode 100644
index 0000000..571fd46
Binary files /dev/null and b/tools/test/misc/testfiles/h5clear_sec2_v0.h5 differ
diff --git a/tools/test/misc/testfiles/h5clear_sec2_v2.h5 b/tools/test/misc/testfiles/h5clear_sec2_v2.h5
new file mode 100644
index 0000000..92833e6
Binary files /dev/null and b/tools/test/misc/testfiles/h5clear_sec2_v2.h5 differ
diff --git a/tools/test/misc/testfiles/h5clear_sec2_v3.h5 b/tools/test/misc/testfiles/h5clear_sec2_v3.h5
new file mode 100644
index 0000000..9f1e6ce
Binary files /dev/null and b/tools/test/misc/testfiles/h5clear_sec2_v3.h5 differ
diff --git a/tools/test/misc/testfiles/h5clear_usage.ddl b/tools/test/misc/testfiles/h5clear_usage.ddl
new file mode 100644
index 0000000..a399ae7
--- /dev/null
+++ b/tools/test/misc/testfiles/h5clear_usage.ddl
@@ -0,0 +1,14 @@
+usage: h5clear [OPTIONS] file_name
+  OPTIONS
+   -h, --help                Print a usage message and exit
+   -V, --version             Print version number and exit
+   -s, --status              Clear the status_flags field in the file's superblock
+   -m, --image               Remove the metadata cache image from the file
+
+Examples of use:
+
+h5clear -s file_name
+  Clear the status_flags field in the superblock of the HDF5 file <file_name>.
+
+h5clear -m file_name
+  Remove the metadata cache image from the HDF5 file <file_name>.
diff --git a/tools/misc/testfiles/h5mkgrp_help.txt b/tools/test/misc/testfiles/h5mkgrp_help.txt
similarity index 100%
rename from tools/misc/testfiles/h5mkgrp_help.txt
rename to tools/test/misc/testfiles/h5mkgrp_help.txt
diff --git a/tools/misc/testfiles/h5mkgrp_version.txt.in b/tools/test/misc/testfiles/h5mkgrp_version.txt.in
similarity index 100%
rename from tools/misc/testfiles/h5mkgrp_version.txt.in
rename to tools/test/misc/testfiles/h5mkgrp_version.txt.in
diff --git a/tools/test/misc/testfiles/latest_h5clear_log_v3.h5 b/tools/test/misc/testfiles/latest_h5clear_log_v3.h5
new file mode 100644
index 0000000..da5c426
Binary files /dev/null and b/tools/test/misc/testfiles/latest_h5clear_log_v3.h5 differ
diff --git a/tools/test/misc/testfiles/latest_h5clear_sec2_v3.h5 b/tools/test/misc/testfiles/latest_h5clear_sec2_v3.h5
new file mode 100644
index 0000000..e511248
Binary files /dev/null and b/tools/test/misc/testfiles/latest_h5clear_sec2_v3.h5 differ
diff --git a/tools/test/misc/testfiles/mod_h5clear_mdc_image.h5 b/tools/test/misc/testfiles/mod_h5clear_mdc_image.h5
new file mode 100644
index 0000000..310134b
Binary files /dev/null and b/tools/test/misc/testfiles/mod_h5clear_mdc_image.h5 differ
diff --git a/tools/test/misc/testh5clear.sh.in b/tools/test/misc/testh5clear.sh.in
new file mode 100644
index 0000000..2966b2c
--- /dev/null
+++ b/tools/test/misc/testh5clear.sh.in
@@ -0,0 +1,338 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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=../../src/misc/h5clear      # The tool name
+H5CLEAR_BIN=`pwd`/$H5CLEAR          # The path of the tool binary
+
+OPENCHK=clear_open_chk              # Program to check whether the file can be opened
+OPENCHK_BIN=`pwd`/$OPENCHK          # The path to the binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+SUCCEED=0
+FAIL=1
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/../.."
+
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+# testfiles source dirs for tools
+SRC_H5CLEAR_TESTFILES="$SRC_TOOLS/test/misc/testfiles"
+
+TESTDIR=./testh5clear
+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.
+# --------------------------------------------------------------------
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="
+$SRC_H5CLEAR_TESTFILES/h5clear_usage.ddl
+$SRC_H5CLEAR_TESTFILES/h5clear_open_fail.ddl
+$SRC_H5CLEAR_TESTFILES/h5clear_missing_file.ddl
+$SRC_H5CLEAR_TESTFILES/h5clear_no_mdc_image.ddl
+$SRC_H5CLEAR_TESTFILES/h5clear_sec2_v0.h5
+$SRC_H5CLEAR_TESTFILES/h5clear_sec2_v2.h5
+$SRC_H5CLEAR_TESTFILES/h5clear_sec2_v3.h5
+$SRC_H5CLEAR_TESTFILES/h5clear_log_v3.h5
+$SRC_H5CLEAR_TESTFILES/latest_h5clear_log_v3.h5
+$SRC_H5CLEAR_TESTFILES/latest_h5clear_sec2_v3.h5
+$SRC_H5CLEAR_TESTFILES/h5clear_mdc_image.h5
+$SRC_H5CLEAR_TESTFILES/mod_h5clear_mdc_image.h5
+"
+
+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=$SRC_H5CLEAR_TESTFILES
+    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'
+}
+
+# $1 is the expected output
+# $2 is the output from testing
+COMPARE_OUT() {
+    if $CMP $1 $2; 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
+}
+
+#
+#
+#
+# Run h5clear and verify the expected output
+# $1: the test file name
+# $2: option 1 passed to the tool
+# $3: option 2 passed to the tool
+# $4: the expected output
+TOOLTEST_OUT() {
+    fname=$1
+    option1=$2
+    option2=$3
+    expected=$4
+    # Prepare expected and actual output
+    expect="$TESTDIR/$expected"
+    actual="$TESTDIR/`basename $expected .ddl`.out"
+    actual_err="$TESTDIR/`basename $expected .ddl`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+
+    # Run test.
+    TESTING $H5CLEAR $option1 $option2 $fname
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5CLEAR_BIN $option1 $option2 $fname
+    ) >$actual 2>$actual_err
+    cp $actual $actual_sav
+    cp $actual_err $actual_err_sav
+    cat $actual_err >> $actual
+
+    # Compare output
+    COMPARE_OUT $expect $actual
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+        $RM $actual $actual_err $actual_sav $actual_err_sav
+    fi
+}
+
+# $1 is the filename to open
+# $2 is the expected return from the open/check program
+OPEN_CHK() {
+    fname=$1
+    expected=$2
+    (
+        cd $TESTDIR
+        $OPENCHK_BIN $fname 2>/dev/null
+    )
+    actual=$?
+    if test $actual -ne $expected; then
+        echo "Unexpected return from $OPENCHK"
+        nerrors=`expr $nerrors + 1`
+    fi
+}
+
+# Run h5clear and verify the expected exit code
+# $1 is the filename to open
+# $2 is option 1
+# $3 is option 2
+# $4 is the expected exit code from the tool
+TOOLTEST() {
+    fname=$1
+    option1=$2
+    option2=$3
+    ret_expected=$4
+    #
+    TESTING $H5CLEAR $option1 $option2 $fname
+    # h5clear $option1 $option2 $fname
+    (
+        cd $TESTDIR
+        $RUNSERIAL $H5CLEAR_BIN $option1 $option2 $fname 2>/dev/null 1>/dev/null
+    )
+    if test $? -ne $ret_expected; then
+        echo "*FAILED*"
+        nerrors=`expr $nerrors + 1`
+    else
+        echo "PASSED"
+    fi
+}
+
+##############################################################################
+##############################################################################
+###              T H E   T E S T S                                         ###
+##############################################################################
+##############################################################################
+# prepare for testing
+COPY_TESTFILES_TO_TESTDIR
+# For Cmake
+$CP -f $TESTDIR/h5clear_sec2_v0.h5 $TESTDIR/orig_h5clear_sec2_v0.h5
+$CP -f $TESTDIR/h5clear_sec2_v2.h5 $TESTDIR/orig_h5clear_sec2_v2.h5
+$CP -f $TESTDIR/h5clear_sec2_v3.h5 $TESTDIR/orig_h5clear_sec2_v3.h5
+#
+#
+#
+# The following are tests to verify the expected output from h5clear
+# "h5clear -h"
+# "h5clear"                                 (no options, no file)
+# "h5clear junk.h5"                         (no options, nonexisting file)
+# "h5clear orig_h5clear_sec2_v3.h5"         (no options, existing file)
+# "h5clear -m"                              (valid 1 option, no file)
+# "h5clear -s junk.h5"                      (valid 1 option, nonexisting file)
+# "h5clear -m -s"                           (valid 2 options, no file)
+# "h5clear -m -s junk.h5"                   (valid 2 options, nonexisting file)
+# "h5clear -m orig_h5clear_sec2_v2.h5"      (valid 1 option, existing file, no cache image)
+# "h5clear -s -m orig_h5clear_sec2_v0.h5"   (valid 2 options, existing file, no cache image)
+TOOLTEST_OUT "" -h "" h5clear_usage.ddl
+TOOLTEST_OUT "" "" "" h5clear_usage.ddl
+TOOLTEST_OUT junk.h5 "" "" h5clear_usage.ddl
+TOOLTEST_OUT orig_h5clear_sec2_v3.h5 "" "" h5clear_usage.ddl
+TOOLTEST_OUT "" -m "" h5clear_missing_file.ddl
+TOOLTEST_OUT junk.h5 -s "" h5clear_open_fail.ddl
+TOOLTEST_OUT "" -m -s h5clear_missing_file.ddl
+TOOLTEST_OUT junk.h5 -m -s h5clear_open_fail.ddl
+TOOLTEST_OUT orig_h5clear_sec2_v2.h5 -m "" h5clear_no_mdc_image.ddl
+TOOLTEST_OUT orig_h5clear_sec2_v0.h5 -s -m h5clear_no_mdc_image.ddl
+#
+#
+#
+# The following are tests to verify the expected exit code from h5clear:
+# "h5clear -m h5clear_mdc_image.h5"     (valid option, existing file, succeed exit code)
+# "h5clear --vers"                      (valid option, version #, succeed exit code)
+# "h5clear -k"                          (invalid 1 option, no file, fail exit code)
+# "h5clear -k junk.h5"                  (invalid 1 option, nonexisting file, fail exit code)
+# "h5clear -l h5clear_sec2_v2.h5"       (invalid 1 option, existing file, fail exit code)
+# "h5clear -m -k"                       (valid/invalid 2 options, nofile, fail exit code)
+# "h5clear -l -m"                       (invalid/valid 2 options, nofile, fail exit code)
+# "h5clear -m -l junk.h5"               (valid/invalid 2 options, nonexisting file, fail exit code)
+# "h5clear -l -m junk.h5"               (invalid/valid 2 options, nonexisting file, fail exit code)
+# "h5clear -m -l h5clear_sec2_v0.h5"    (valid/invalid 2 options, existing file, fail exit code)
+# "h5clear -l -m h5clear_sec2_v0.h5"    (invalid/valid 2 options, existing file, fail exit code)
+TOOLTEST h5clear_mdc_image.h5 -m "" $SUCCEED
+TOOLTEST "" --vers "" $SUCCEED
+TOOLTEST "" -k "" $FAIL
+TOOLTEST junk.h5 -k "" $FAIL
+TOOLTEST h5clear_sec2_v2.h5 -l "" $FAIL
+TOOLTEST "" -m -k $FAIL
+TOOLTEST "" -l -m $FAIL
+TOOLTEST junk.h5 -m -l $FAIL
+TOOLTEST junk.h5 -l -m $FAIL
+TOOLTEST h5clear_sec2_v0.h5 -m -l $FAIL
+TOOLTEST h5clear_sec2_v0.h5 -l -m $FAIL
+#
+#
+#
+# h5clear_mdc_image.h5 already has cache image removed earlier, verify the expected warning from h5clear:
+TOOLTEST_OUT mod_h5clear_mdc_image.h5 -m "" h5clear_no_mdc_image.ddl
+TOOLTEST_OUT mod_h5clear_mdc_image.h5 -s -m h5clear_no_mdc_image.ddl
+#
+#
+#
+# The following are tests to verify the status_flags field is cleared properly:
+OPEN_CHK h5clear_sec2_v3.h5 $FAIL
+TOOLTEST h5clear_sec2_v3.h5 -s "" $SUCCEED
+OPEN_CHK h5clear_sec2_v3.h5 $SUCCEED
+#
+OPEN_CHK h5clear_log_v3.h5 $FAIL
+TOOLTEST h5clear_log_v3.h5 -s "" $SUCCEED
+OPEN_CHK h5clear_log_v3.h5 $SUCCEED
+#
+OPEN_CHK latest_h5clear_sec2_v3.h5 $FAIL
+TOOLTEST latest_h5clear_sec2_v3.h5 -s "" $SUCCEED
+OPEN_CHK latest_h5clear_sec2_v3.h5 $SUCCEED
+#
+OPEN_CHK latest_h5clear_log_v3.h5 $FAIL
+TOOLTEST latest_h5clear_log_v3.h5 -s "" $SUCCEED
+OPEN_CHK latest_h5clear_log_v3.h5 $SUCCEED
+#
+# File open succeeds for the following 2 test files because the
+# library does not check status_flags for files with < v3 superblock:
+OPEN_CHK h5clear_sec2_v0.h5 $SUCCEED
+TOOLTEST h5clear_sec2_v0.h5 -s "" $SUCCEED
+OPEN_CHK h5clear_sec2_v0.h5 $SUCCEED
+#
+OPEN_CHK h5clear_sec2_v2.h5 $SUCCEED
+TOOLTEST h5clear_sec2_v2.h5 -s "" $SUCCEED
+OPEN_CHK h5clear_sec2_v2.h5 $SUCCEED
+#
+#
+#
+# Clean up test files
+if test -z "$HDF5_NOCLEANUP"; then
+   rm -f h5clear_*.h5 latest_h5clear*.h5
+fi
+#
+#
+#
+# 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 error(s)."
+    exit $EXIT_FAILURE
+fi
diff --git a/tools/test/misc/testh5mkgrp.sh.in b/tools/test/misc/testh5mkgrp.sh.in
new file mode 100644
index 0000000..3990bd2
--- /dev/null
+++ b/tools/test/misc/testh5mkgrp.sh.in
@@ -0,0 +1,320 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5mkgrp tool
+#
+# Quincey Koziol (koziol at hdfgroup.org)
+# Tuesday, February 13, 2007
+#
+
+srcdir=@srcdir@
+
+TESTNAME=h5mkgrp
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5MKGRP=../../src/misc/h5mkgrp             # The tool name
+H5MKGRP_BIN=`pwd`/$H5MKGRP  # The path of the tool binary
+H5LS=../../src/h5ls/h5ls                   # The h5ls tool name
+H5LS_ARGS=-vr               # Arguments to the h5ls tool
+H5LS_BIN=`pwd`/$H5LS # The path of the h5ls 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_H5MKGRP_TESTFILES="$SRC_TOOLS/test/misc/testfiles"
+
+TESTDIR=./testgrp
+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.
+# --------------------------------------------------------------------
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="
+$SRC_H5MKGRP_TESTFILES/h5mkgrp_help.txt
+$SRC_TOOLS_TESTFILES/h5mkgrp_single.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_single_v.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_single_p.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_single_l.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_several.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_several_v.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_several_p.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_several_l.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_nested_p.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_nested_lp.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_nested_mult_p.ls
+$SRC_TOOLS_TESTFILES/h5mkgrp_nested_mult_lp.ls
+"
+
+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=$SRC_H5MKGRP_TESTFILES
+    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
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+VERIFY_H5LS() 
+{
+    SPACES="                                                               "
+    echo "Verifying h5ls file structure $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Run a test and print PASS or *FAIL*. If h5mkgrp can complete
+# with exit status 0, consider it pass. If a test fails then increment
+# the `nerrors' global variable.
+# Assumed arguments:
+# $* arguments for h5mkgrp.
+
+TOOLTEST() 
+{
+    TESTING $H5MKGRP $@
+    (
+    cd $TESTDIR
+    $RUNSERIAL $H5MKGRP_BIN $@
+    ) > output.out
+    RET=$?
+    if [ $RET != 0 ]; then
+        echo "*FAILED*"
+        echo "failed result is:"
+        cat output.out
+        nerrors="`expr $nerrors + 1`"
+    else
+        echo " PASSED"
+
+        # Clean up output file
+        if test -z "$HDF5_NOCLEANUP"; then
+           rm -f output.out
+        fi
+    fi
+}
+
+# Call the h5ls tool to verify the correct output data in the destination file
+#
+H5LSTEST() 
+{
+    expect="$TESTDIR/`basename $1 .h5`.ls"
+    actual="$TESTDIR/`basename $1 .h5`.out"
+    actual_sav=${actual}-sav
+
+    # Stderr is included in stdout so that the diff can detect
+    # any unexpected output from that stream too.
+    VERIFY_H5LS  $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $H5LS_BIN $H5LS_ARGS $@
+    ) 2>&1 |sed 's/Modified:.*/Modified:  XXXX-XX-XX XX:XX:XX XXX/' >$actual
+
+    # save actual in case it is needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    STDERR_FILTER $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 (*.ls) 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_sav
+   fi
+}
+
+# Single run of tool
+#
+# Assumed arguments:
+# $1 is test file name
+# $2 is h5mkgrp options
+# $* are groups to create
+RUNTEST() 
+{
+    FILEOUT=$1
+    shift
+    H5MKGRP_ARGS=$1
+    shift
+
+    # Remove any output file left over from previous test run
+    rm -f $FILEOUT
+
+    # Run test
+    TOOLTEST $H5MKGRP_ARGS $FILEOUT $@
+
+    # Verify that the file created above is correct
+    H5LSTEST $FILEOUT
+
+    # Remove output file created, if the "no cleanup" environment variable is
+    #   not defined
+    if test -z "$HDF5_NOCLEANUP"; then
+        rm -f $TESTDIR/$FILEOUT
+    fi
+}
+
+# Single run of tool
+#
+# Assumed arguments:
+# $1 is test expected output file
+# $2 is h5mkgrp options
+# $* are groups to create
+CMPTEST() 
+{
+    FILEOUT=$1
+    expect="$TESTDIR/`basename $1 .h5`.txt"
+    actual="$TESTDIR/`basename $1 .h5`.out"
+    actual_err="$TESTDIR/`basename $1 .h5`.err"
+    shift
+
+    # Stderr is included in stdout so that the diff can detect
+    # any unexpected output from that stream too.
+    TESTING $H5MKGRP $@
+    (
+    cd $TESTDIR
+    $RUNSERIAL $H5MKGRP_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
+      echo " PASSED"
+   else
+      echo "*FAILED*"
+      echo "    Expected result (*.txt) 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
+   fi
+}
+
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# Check that help & version is displayed properly
+CMPTEST h5mkgrp_help.h5 "-h"
+#CMPTEST h5mkgrp_version.h5 "-V"
+
+# Create single group at root level
+RUNTEST h5mkgrp_single.h5 " " single
+RUNTEST h5mkgrp_single_v.h5 "-v" single
+RUNTEST h5mkgrp_single_p.h5 "-p" single
+RUNTEST h5mkgrp_single_l.h5 "-l" latest
+
+# Create several groups at root level
+RUNTEST h5mkgrp_several.h5 " " one two
+RUNTEST h5mkgrp_several_v.h5 "-v" one two
+RUNTEST h5mkgrp_several_p.h5 "-p" one two
+RUNTEST h5mkgrp_several_l.h5 "-l" one two
+
+# Create various nested groups 
+RUNTEST h5mkgrp_nested_p.h5 "-p" /one/two
+RUNTEST h5mkgrp_nested_lp.h5 "-lp" /one/two
+RUNTEST h5mkgrp_nested_mult_p.h5 "-p" /one/two /three/four
+RUNTEST h5mkgrp_nested_mult_lp.h5 "-lp" /one/two /three/four
+
+# 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/test/misc/testh5repart.sh.in b/tools/test/misc/testh5repart.sh.in
new file mode 100644
index 0000000..594d37e
--- /dev/null
+++ b/tools/test/misc/testh5repart.sh.in
@@ -0,0 +1,195 @@
+#! /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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Tests for the h5repart tool
+
+srcdir=@srcdir@
+
+TESTNAME=h5repart
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+REPART=../../src/misc/h5repart             # The tool name
+REPART_BIN=`pwd`/$REPART    # The path of the tool binary
+
+REPARTED_FAM=repart_test                # The test name
+REPARTED_FAM_BIN=`pwd`/$REPARTED_FAM    # The path of the test 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"
+
+TESTDIR=./testrepart
+test -d $TESTDIR || mkdir -p $TESTDIR
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="
+$SRC_TOOLS_TESTFILES/family_file00000.h5
+$SRC_TOOLS_TESTFILES/family_file00001.h5
+$SRC_TOOLS_TESTFILES/family_file00002.h5
+$SRC_TOOLS_TESTFILES/family_file00003.h5
+$SRC_TOOLS_TESTFILES/family_file00004.h5
+$SRC_TOOLS_TESTFILES/family_file00005.h5
+$SRC_TOOLS_TESTFILES/family_file00006.h5
+$SRC_TOOLS_TESTFILES/family_file00007.h5
+$SRC_TOOLS_TESTFILES/family_file00008.h5
+$SRC_TOOLS_TESTFILES/family_file00009.h5
+$SRC_TOOLS_TESTFILES/family_file00010.h5
+$SRC_TOOLS_TESTFILES/family_file00011.h5
+$SRC_TOOLS_TESTFILES/family_file00012.h5
+$SRC_TOOLS_TESTFILES/family_file00013.h5
+$SRC_TOOLS_TESTFILES/family_file00014.h5
+$SRC_TOOLS_TESTFILES/family_file00015.h5
+$SRC_TOOLS_TESTFILES/family_file00016.h5
+$SRC_TOOLS_TESTFILES/family_file00017.h5
+"
+
+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=$SRC_TOOLS_TESTFILES
+    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'
+}
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable.
+#
+TOOLTEST() {
+   # Run tool test.
+   TESTING $REPART $@
+   (
+#      echo
+      cd $TESTDIR
+      $RUNSERIAL $REPART_BIN $@
+   )
+
+   if test $? -eq 0; then
+       echo " PASSED"
+   else
+       echo " FAILED"
+       nerrors=`expr $nerrors + 1`
+   fi
+}
+
+OUTPUTTEST() {
+   # Run test program.
+   TESTING $REPARTED_FAM $@
+   (
+      cd $TESTDIR
+      $RUNSERIAL $REPARTED_FAM_BIN $@
+   )
+
+   if test $? -eq 0; then
+       echo " PASSED"
+   else
+       echo " FAILED"
+       nerrors=`expr $nerrors + 1`
+   fi
+}
+
+# Print a "SKIP" message
+SKIP() {
+    TESTING $REPART $@
+    echo  " -SKIP-"
+}
+
+##############################################################################
+##############################################################################
+###              T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+# repartition family member size to 20,000 bytes.
+TOOLTEST -m 20000 family_file%05d.h5 fst_family%05d.h5
+# repartition family member size to 5 KB.
+TOOLTEST -m 5k family_file%05d.h5 scd_family%05d.h5
+# convert family file to sec2 file of 20,000 bytes
+TOOLTEST -m 20000 -family_to_sec2 family_file%05d.h5 family_to_sec2.h5
+
+# test the output files repartitioned above.
+OUTPUTTEST
+echo
+
+# Clean up output file
+CLEAN_TESTFILES_AND_TESTDIR
+
+if test -z "$HDF5_NOCLEANUP"; then
+    cd $actual_dir
+    rm -f fst_family*.h5 scd_family*.h5 family_to_sec2.h5
+fi
+
+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/test/misc/vds/CMakeLists.txt b/tools/test/misc/vds/CMakeLists.txt
new file mode 100644
index 0000000..ec672e5
--- /dev/null
+++ b/tools/test/misc/vds/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_MISC_VDS)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib)
+
+MACRO (ADD_H5_GENERATOR genfile)
+  add_executable (${genfile} ${HDF5_TOOLS_TEST_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 ()
+
+# 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 ()
diff --git a/tools/test/misc/vds/Makefile.am b/tools/test/misc/vds/Makefile.am
new file mode 100644
index 0000000..73c335f
--- /dev/null
+++ b/tools/test/misc/vds/Makefile.am
@@ -0,0 +1,36 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 -I$(top_srcdir)/tools/test/misc/vds
+
+#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/test/misc/vds/Makefile.in b/tools/test/misc/vds/Makefile.in
new file mode 100644
index 0000000..1de8bf8
--- /dev/null
+++ b/tools/test/misc/vds/Makefile.in
@@ -0,0 +1,1485 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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/test/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/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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 -I$(top_srcdir)/tools/test/misc/vds
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/misc/vds/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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-dyn: $(DYN)
+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 dyn 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/test/misc/vds/UC_1.h b/tools/test/misc/vds/UC_1.h
new file mode 100644
index 0000000..9d1f758
--- /dev/null
+++ b/tools/test/misc/vds/UC_1.h
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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}
+};
+
+/* 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}
+};
+
+/* 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"}
+};
+
+/* Dataset names */
+static char UC_1_SOURCE_DSET_PATH[NAME_LEN] = "/source_dset";
+
+#endif /* UC_1_H */
+
diff --git a/tools/test/misc/vds/UC_1_one_dim_gen.c b/tools/test/misc/vds/UC_1_one_dim_gen.c
new file mode 100644
index 0000000..b997280
--- /dev/null
+++ b/tools/test/misc/vds/UC_1_one_dim_gen.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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
+
+static hsize_t UC_1_VDS_DIMS[RANK] = {0, UC_1_FULL_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}
+};
+
+/* 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_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;
+
+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             */
+    hsize_t map_start   = 0;    /* 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                                 */
+    hsize_t 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] = (hsize_t)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/test/misc/vds/UC_2.h b/tools/test/misc/vds/UC_2.h
new file mode 100644
index 0000000..a3ee0f7
--- /dev/null
+++ b/tools/test/misc/vds/UC_2.h
@@ -0,0 +1,108 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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}
+};
+
+/* 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}
+};
+
+/* 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"
+
+#endif /* UC_2_H */
+
diff --git a/tools/test/misc/vds/UC_2_two_dims_gen.c b/tools/test/misc/vds/UC_2_two_dims_gen.c
new file mode 100644
index 0000000..bd70fda
--- /dev/null
+++ b/tools/test/misc/vds/UC_2_two_dims_gen.c
@@ -0,0 +1,268 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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"
+
+static hsize_t UC_2_VDS_DIMS[RANK]  = {0, UC_2_FULL_HEIGHT, UC_2_FULL_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}
+};
+
+/* 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}
+};
+
+/* 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;
+
+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                                 */
+    hsize_t 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] = (hsize_t)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/test/misc/vds/UC_3.h b/tools/test/misc/vds/UC_3.h
new file mode 100644
index 0000000..0c26dfb
--- /dev/null
+++ b/tools/test/misc/vds/UC_3.h
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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}
+};
+
+/* 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/test/misc/vds/UC_3_gaps_gen.c b/tools/test/misc/vds/UC_3_gaps_gen.c
new file mode 100644
index 0000000..e6e7226
--- /dev/null
+++ b/tools/test/misc/vds/UC_3_gaps_gen.c
@@ -0,0 +1,253 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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/test/misc/vds/UC_4.h b/tools/test/misc/vds/UC_4.h
new file mode 100644
index 0000000..5dba4fb
--- /dev/null
+++ b/tools/test/misc/vds/UC_4.h
@@ -0,0 +1,84 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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/test/misc/vds/UC_4_printf_gen.c b/tools/test/misc/vds/UC_4_printf_gen.c
new file mode 100644
index 0000000..b328046
--- /dev/null
+++ b/tools/test/misc/vds/UC_4_printf_gen.c
@@ -0,0 +1,217 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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                                 */
+    hsize_t 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] = (hsize_t)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/test/misc/vds/UC_5.h b/tools/test/misc/vds/UC_5.h
new file mode 100644
index 0000000..3f8fe41
--- /dev/null
+++ b/tools/test/misc/vds/UC_5.h
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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/test/misc/vds/UC_5_stride_gen.c b/tools/test/misc/vds/UC_5_stride_gen.c
new file mode 100644
index 0000000..a105bbd
--- /dev/null
+++ b/tools/test/misc/vds/UC_5_stride_gen.c
@@ -0,0 +1,241 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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                         */
+    hsize_t map_start   = 0;    /* 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                                 */
+    hsize_t 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] = (hsize_t)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/test/misc/vds/UC_common.h b/tools/test/misc/vds/UC_common.h
new file mode 100644
index 0000000..962a091
--- /dev/null
+++ b/tools/test/misc/vds/UC_common.h
@@ -0,0 +1,39 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * 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/test/perform/CMakeLists.txt b/tools/test/perform/CMakeLists.txt
new file mode 100644
index 0000000..20250c6
--- /dev/null
+++ b/tools/test/perform/CMakeLists.txt
@@ -0,0 +1,124 @@
+cmake_minimum_required (VERSION 3.2.2)
+PROJECT (HDF5_TOOLS_TEST_PERFORM )
+
+#-----------------------------------------------------------------------------
+# Apply Definitions to compiler in this directory and below
+#-----------------------------------------------------------------------------
+add_definitions (${HDF_EXTRA_C_FLAGS})
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TEST_SRC_DIR})
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_DIR}/lib )
+
+# --------------------------------------------------------------------
+# Add the executables
+# --------------------------------------------------------------------
+#-- Adding test for h5perf_serial
+set (h5perf_serial_SOURCES
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_perf.c
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_engine.c
+)
+add_executable (h5perf_serial ${h5perf_serial_SOURCES})
+TARGET_NAMING (h5perf_serial STATIC)
+TARGET_C_PROPERTIES (h5perf_serial STATIC " " " ")
+target_link_libraries (h5perf_serial ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (h5perf_serial PROPERTIES FOLDER perform)
+
+if (HDF5_BUILD_PERFORM_STANDALONE)
+  #-- Adding test for h5perf_serial_alone
+  set (h5perf_serial_alone_SOURCES
+      ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_perf.c
+      ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_engine.c
+  )
+  add_executable (h5perf_serial_alone ${h5perf_serial_alone_SOURCES})
+  TARGET_NAMING (h5perf_serial_alone STATIC)
+  TARGET_C_PROPERTIES (h5perf_serial_alone STATIC " " " ")
+  target_link_libraries (h5perf_serial_alone ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (h5perf_serial_alone PROPERTIES FOLDER perform)
+  set_property (TARGET h5perf_serial_alone
+      APPEND PROPERTY COMPILE_DEFINITIONS STANDALONE
+  )
+endif ()
+
+#-- Adding test for chunk
+set (chunk_SOURCES
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/chunk.c
+)
+ADD_EXECUTABLE(chunk ${chunk_SOURCES})
+TARGET_NAMING (chunk STATIC)
+TARGET_C_PROPERTIES (chunk STATIC " " " ")
+TARGET_LINK_LIBRARIES(chunk ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (chunk PROPERTIES FOLDER perform)
+
+#-- Adding test for iopipe
+set (iopipe_SOURCES
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/iopipe.c
+)
+add_executable (iopipe ${iopipe_SOURCES})
+TARGET_NAMING (iopipe STATIC)
+TARGET_C_PROPERTIES (iopipe STATIC " " " ")
+target_link_libraries (iopipe ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (iopipe PROPERTIES FOLDER perform)
+
+#-- Adding test for overhead
+set (overhead_SOURCES
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/overhead.c
+)
+add_executable (overhead ${overhead_SOURCES})
+TARGET_NAMING (overhead STATIC)
+TARGET_C_PROPERTIES (overhead STATIC " " " ")
+target_link_libraries (overhead ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+set_target_properties (overhead PROPERTIES FOLDER perform)
+
+#-- Adding test for perf_meta
+  set (perf_meta_SOURCES
+      ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/perf_meta.c
+  )
+  add_executable (perf_meta ${perf_meta_SOURCES})
+  TARGET_NAMING (perf_meta STATIC)
+  TARGET_C_PROPERTIES (perf_meta STATIC " " " ")
+  target_link_libraries (perf_meta ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+  set_target_properties (perf_meta PROPERTIES FOLDER perform)
+
+#-- Adding test for zip_perf
+set (zip_perf_SOURCES
+    ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/zip_perf.c
+)
+add_executable (zip_perf ${zip_perf_SOURCES})
+TARGET_NAMING (zip_perf STATIC)
+TARGET_C_PROPERTIES (zip_perf STATIC " " " ")
+target_link_libraries (zip_perf ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
+set_target_properties (zip_perf PROPERTIES FOLDER perform)
+
+if (H5_HAVE_PARALLEL AND BUILD_TESTING)
+  #-- Adding test for h5perf
+  set (h5perf_SOURCES
+      ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_perf.c
+      ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_engine.c
+  )
+  add_executable (h5perf ${h5perf_SOURCES})
+  TARGET_NAMING (h5perf STATIC)
+  TARGET_C_PROPERTIES (h5perf STATIC " " " ")
+  target_link_libraries (h5perf ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+  set_target_properties (h5perf PROPERTIES FOLDER perform)
+
+  if (HDF5_BUILD_PERFORM_STANDALONE)
+    #-- Adding test for h5perf
+    set (h5perf_alone_SOURCES
+        ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_perf.c
+        ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_engine.c
+    )
+    add_executable (h5perf_alone ${h5perf_alone_SOURCES})
+    TARGET_NAMING (h5perf_alone STATIC)
+    TARGET_C_PROPERTIES (h5perf_alone STATIC " " " ")
+    target_link_libraries (h5perf_alone ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+    set_target_properties (h5perf_alone PROPERTIES FOLDER perform)
+    set_property (TARGET h5perf_alone
+        APPEND PROPERTY COMPILE_DEFINITIONS STANDALONE
+    )
+  endif ()
+endif ()
+
+include (CMakeTests.cmake)
diff --git a/tools/test/perform/CMakeTests.cmake b/tools/test/perform/CMakeTests.cmake
new file mode 100644
index 0000000..2933563
--- /dev/null
+++ b/tools/test/perform/CMakeTests.cmake
@@ -0,0 +1,156 @@
+#
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tfilters.h5" "${PROJECT_BINARY_DIR}/tfilters.h5" "zip_perf_files")
+add_custom_target(zip_perf_files ALL COMMENT "Copying files needed by zip_perf tests" DEPENDS ${zip_perf_list})
+
+#-----------------------------------------------------------------------------
+# Add Tests
+#-----------------------------------------------------------------------------
+
+# Remove any output file left over from previous test run
+add_test (
+    NAME PERFORM_h5perform-clear-objects
+    COMMAND    ${CMAKE_COMMAND}
+        -E remove
+        chunk.h5
+        iopipe.h5
+        iopipe.raw
+        x-diag-rd.dat
+        x-diag-wr.dat
+        x-rowmaj-rd.dat
+        x-rowmaj-wr.dat
+        x-gnuplot
+)
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_h5perf_serial COMMAND $<TARGET_FILE:h5perf_serial>)
+else ()
+  add_test (NAME PERFORM_h5perf_serial COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:h5perf_serial>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=h5perf_serial.txt"
+      #-D "TEST_REFERENCE=h5perf_serial.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+set_tests_properties (PERFORM_h5perf_serial PROPERTIES TIMEOUT 1800)
+
+if (HDF5_BUILD_PERFORM_STANDALONE)
+  add_test (NAME PERFORM_h5perf_serial_alone COMMAND $<TARGET_FILE:h5perf_serial_alone>)
+endif ()
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_chunk COMMAND $<TARGET_FILE:chunk>)
+else ()
+  add_test (NAME PERFORM_chunk COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:chunk>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=chunk.txt"
+      #-D "TEST_REFERENCE=chunk.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_iopipe COMMAND $<TARGET_FILE:iopipe>)
+else ()
+  add_test (NAME PERFORM_iopipe COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:iopipe>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=iopipe.txt"
+      #-D "TEST_REFERENCE=iopipe.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_overhead COMMAND $<TARGET_FILE:overhead>)
+else ()
+  add_test (NAME PERFORM_overhead COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:overhead>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=overhead.txt"
+      #-D "TEST_REFERENCE=overhead.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_perf_meta COMMAND $<TARGET_FILE:perf_meta>)
+else ()
+  add_test (NAME PERFORM_perf_meta COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:perf_meta>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=perf_meta.txt"
+      #-D "TEST_REFERENCE=perf_meta.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_zip_perf_help COMMAND $<TARGET_FILE:zip_perf> "-h")
+else ()
+  add_test (NAME PERFORM_zip_perf_help COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:zip_perf>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=zip_perf-h.txt"
+      #-D "TEST_REFERENCE=zip_perf-h.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+if (HDF5_ENABLE_USING_MEMCHECKER)
+  add_test (NAME PERFORM_zip_perf COMMAND $<TARGET_FILE:zip_perf> tfilters.h5)
+else ()
+  add_test (NAME PERFORM_zip_perf COMMAND "${CMAKE_COMMAND}"
+      -D "TEST_PROGRAM=$<TARGET_FILE:zip_perf>"
+      -D "TEST_ARGS:STRING="
+      -D "TEST_EXPECT=0"
+      -D "TEST_SKIP_COMPARE=TRUE"
+      -D "TEST_OUTPUT=zip_perf.txt"
+      #-D "TEST_REFERENCE=zip_perf.out"
+      -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+      -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+  )
+endif ()
+
+if (H5_HAVE_PARALLEL)
+  add_test (NAME PERFORM_h5perf COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:h5perf>)
+
+  if (HDF5_BUILD_PERFORM_STANDALONE)
+    add_test (NAME PERFORM_h5perf_alone COMMAND ${MPIEXEC} ${MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_POSTFLAGS} $<TARGET_FILE:h5perf_alone>)
+  endif ()
+endif ()
diff --git a/tools/test/perform/COPYING b/tools/test/perform/COPYING
new file mode 100644
index 0000000..6497ace
--- /dev/null
+++ b/tools/test/perform/COPYING
@@ -0,0 +1,13 @@
+
+  Copyright by  The HDF Group and 
+                The Board of Trustees of the University of Illinois. 
+  All rights reserved. 
+
+  The files and subdirectories in this directory are part of HDF5.  
+  The full HDF5 copyright notice, including terms governing use, 
+  modification, and redistribution, is contained in the COPYING file
+  which can be found at the root of the source code distribution tree
+  or in https://support.hdfgroup.org/ftp/HDF5/releases.  If you do
+  not have access to either file, you may request a copy from 
+  help at hdfgroup.org. 
+
diff --git a/tools/test/perform/Makefile.am b/tools/test/perform/Makefile.am
new file mode 100644
index 0000000..5a89a66
--- /dev/null
+++ b/tools/test/perform/Makefile.am
@@ -0,0 +1,77 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# 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 Performance Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
+
+# bin_PROGRAMS will be installed.
+if BUILD_PARALLEL_CONDITIONAL
+    bin_PROGRAMS=h5perf_serial h5perf
+else
+    bin_PROGRAMS=h5perf_serial
+endif
+
+# Add h5perf and h5perf_serial specific linker flags here
+h5perf_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Some programs are not built or run by default, but can be built by hand or by
+# specifying --enable-build-all at configure time.
+# Also, some of these programs should only be built in parallel.
+# Currently there is no such program.
+if BUILD_PARALLEL_CONDITIONAL
+    PARA_BUILD_ALL=
+endif
+if BUILD_ALL_CONDITIONAL
+    BUILD_ALL_PROGS=$(PARA_BUILD_ALL)
+endif
+
+# Define programs that will be run in 'make check'
+# List them in the order they should be run.
+# Parallel test programs.
+if BUILD_PARALLEL_CONDITIONAL
+    TEST_PROG_PARA=h5perf perf
+endif
+# Serial test programs.
+TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS)
+
+# check_PROGRAMS will be built but not installed.  Do not any executable
+# that is in bin_PROGRAMS already. Otherwise, it will be removed twice in
+# "make clean" and some systems, e.g., AIX, do not like it.
+check_PROGRAMS= iopipe chunk overhead zip_perf perf_meta $(BUILD_ALL_PROGS) perf
+
+h5perf_SOURCES=pio_perf.c pio_engine.c
+h5perf_serial_SOURCES=sio_perf.c sio_engine.c
+
+# These are the files that `make clean' (and derivatives) will remove from
+# this directory.
+CLEANFILES=*.h5 *.raw *.dat x-gnuplot perftest.out
+
+# All of the programs depend on the main hdf5 library, and some of them
+# depend on test or tools library.
+LDADD=$(LIBHDF5)
+h5perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+h5perf_serial_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+perf_LDADD=$(LIBH5TEST) $(LIBHDF5)
+iopipe_LDADD=$(LIBH5TEST) $(LIBHDF5)
+zip_perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+perf_meta_LDADD=$(LIBH5TEST) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/test/perform/Makefile.in b/tools/test/perform/Makefile.in
new file mode 100644
index 0000000..d04a9b7
--- /dev/null
+++ b/tools/test/perform/Makefile.in
@@ -0,0 +1,1610 @@
+# 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 COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# HDF5 Library Performance 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@
+ at BUILD_PARALLEL_CONDITIONAL_FALSE@bin_PROGRAMS =  \
+ at BUILD_PARALLEL_CONDITIONAL_FALSE@	h5perf_serial$(EXEEXT)
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@bin_PROGRAMS =  \
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@	h5perf_serial$(EXEEXT) \
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@	h5perf$(EXEEXT)
+check_PROGRAMS = iopipe$(EXEEXT) chunk$(EXEEXT) overhead$(EXEEXT) \
+	zip_perf$(EXEEXT) perf_meta$(EXEEXT) $(am__EXEEXT_2) \
+	perf$(EXEEXT)
+TESTS = $(am__EXEEXT_3)
+subdir = tools/test/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)/m4/ax_check_class.m4 \
+	$(top_srcdir)/m4/ax_check_classpath.m4 \
+	$(top_srcdir)/m4/ax_check_java_home.m4 \
+	$(top_srcdir)/m4/ax_check_junit.m4 \
+	$(top_srcdir)/m4/ax_java_options.m4 \
+	$(top_srcdir)/m4/ax_jni_include_dir.m4 \
+	$(top_srcdir)/m4/ax_prog_jar.m4 \
+	$(top_srcdir)/m4/ax_prog_java.m4 \
+	$(top_srcdir)/m4/ax_prog_java_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javac.m4 \
+	$(top_srcdir)/m4/ax_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ax_prog_javadoc.m4 \
+	$(top_srcdir)/m4/ax_try_compile_java.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__installdirs = "$(DESTDIR)$(bindir)"
+am__EXEEXT_1 =
+ at BUILD_ALL_CONDITIONAL_TRUE@am__EXEEXT_2 = $(am__EXEEXT_1)
+PROGRAMS = $(bin_PROGRAMS)
+chunk_SOURCES = chunk.c
+chunk_OBJECTS = chunk.$(OBJEXT)
+chunk_LDADD = $(LDADD)
+chunk_DEPENDENCIES = $(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 = 
+am_h5perf_OBJECTS = pio_perf.$(OBJEXT) pio_engine.$(OBJEXT)
+h5perf_OBJECTS = $(am_h5perf_OBJECTS)
+h5perf_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+h5perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5perf_LDFLAGS) $(LDFLAGS) -o $@
+am_h5perf_serial_OBJECTS = sio_perf.$(OBJEXT) sio_engine.$(OBJEXT)
+h5perf_serial_OBJECTS = $(am_h5perf_serial_OBJECTS)
+h5perf_serial_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+h5perf_serial_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5perf_serial_LDFLAGS) $(LDFLAGS) -o $@
+iopipe_SOURCES = iopipe.c
+iopipe_OBJECTS = iopipe.$(OBJEXT)
+iopipe_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
+overhead_SOURCES = overhead.c
+overhead_OBJECTS = overhead.$(OBJEXT)
+overhead_LDADD = $(LDADD)
+overhead_DEPENDENCIES = $(LIBHDF5)
+perf_SOURCES = perf.c
+perf_OBJECTS = perf.$(OBJEXT)
+perf_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
+perf_meta_SOURCES = perf_meta.c
+perf_meta_OBJECTS = perf_meta.$(OBJEXT)
+perf_meta_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
+zip_perf_SOURCES = zip_perf.c
+zip_perf_OBJECTS = zip_perf.$(OBJEXT)
+zip_perf_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(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 = chunk.c $(h5perf_SOURCES) $(h5perf_serial_SOURCES) iopipe.c \
+	overhead.c perf.c perf_meta.c zip_perf.c
+DIST_SOURCES = chunk.c $(h5perf_SOURCES) $(h5perf_serial_SOURCES) \
+	iopipe.c overhead.c perf.c perf_meta.c zip_perf.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
+am__EXEEXT_3 = iopipe$(EXEEXT) chunk$(EXEEXT) overhead$(EXEEXT) \
+	zip_perf$(EXEEXT) perf_meta$(EXEEXT) h5perf_serial$(EXEEXT) \
+	$(am__EXEEXT_2)
+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 COPYING
+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@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_JAVACFLAGS = @AM_JAVACFLAGS@
+AM_JAVAFLAGS = @AM_JAVAFLAGS@
+AM_JNIFLAGS = @AM_JNIFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+ASSERTS = @ASSERTS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_MODE = @BUILD_MODE@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+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@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DEV_WARNINGS = @DEV_WARNINGS@
+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_CLASSPATH = @H5_CLASSPATH@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_JAVACFLAGS = @H5_JAVACFLAGS@
+H5_JAVAFLAGS = @H5_JAVAFLAGS@
+H5_JNIFLAGS = @H5_JNIFLAGS@
+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@
+HDF_JAVA = @HDF_JAVA@
+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_LIBRARY = @INSTRUMENT_LIBRARY@
+INTERNAL_DEBUG_OUTPUT = @INTERNAL_DEBUG_OUTPUT@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAVADOC = @JAVADOC@
+JAVAFLAGS = @JAVAFLAGS@
+JAVAPREFIX = @JAVAPREFIX@
+JAVA_JUNIT = @JAVA_JUNIT@
+JAVA_PATH_NAME = @JAVA_PATH_NAME@
+JAVA_VERSION = @JAVA_VERSION@
+JNIFLAGS = @JNIFLAGS@
+JUNIT = @JUNIT@
+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@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MEMORYALLOCSANITYCHECK = @MEMORYALLOCSANITYCHECK@
+METADATATRACEFILE = @METADATATRACEFILE@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OPTIMIZATION = @OPTIMIZATION@
+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@
+PAC_FORTRAN_NUM_INTEGER_KINDS = @PAC_FORTRAN_NUM_INTEGER_KINDS@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PROFILING = @PROFILING@
+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@
+SYMBOLS = @SYMBOLS@
+TESTPARALLEL = @TESTPARALLEL@
+TESTS_JUNIT = @TESTS_JUNIT@
+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@
+UUDECODE = @UUDECODE@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+_ACJNI_JAVAC = @_ACJNI_JAVAC@
+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
+LIBH5JNI = $(top_builddir)/java/src/jni/libhdf5_java.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
+
+# Add h5perf and h5perf_serial specific linker flags here
+h5perf_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Some programs are not built or run by default, but can be built by hand or by
+# specifying --enable-build-all at configure time.
+# Also, some of these programs should only be built in parallel.
+# Currently there is no such program.
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@PARA_BUILD_ALL = 
+ at BUILD_ALL_CONDITIONAL_TRUE@BUILD_ALL_PROGS = $(PARA_BUILD_ALL)
+
+# Define programs that will be run in 'make check'
+# List them in the order they should be run.
+# Parallel test programs.
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@TEST_PROG_PARA = h5perf perf
+# Serial test programs.
+TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS)
+h5perf_SOURCES = pio_perf.c pio_engine.c
+h5perf_serial_SOURCES = sio_perf.c sio_engine.c
+
+# These are the files that `make clean' (and derivatives) will remove from
+# this directory.
+CLEANFILES = *.h5 *.raw *.dat x-gnuplot perftest.out
+
+# All of the programs depend on the main hdf5 library, and some of them
+# depend on test or tools library.
+LDADD = $(LIBHDF5)
+h5perf_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+h5perf_serial_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+perf_LDADD = $(LIBH5TEST) $(LIBHDF5)
+iopipe_LDADD = $(LIBH5TEST) $(LIBHDF5)
+zip_perf_LDADD = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
+perf_meta_LDADD = $(LIBH5TEST) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, dyn, 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)
+
+DYN = $(dyn_LTLIBRARIES)
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+dyndir = $(libdir)
+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/test/perform/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/test/perform/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):
+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
+
+chunk$(EXEEXT): $(chunk_OBJECTS) $(chunk_DEPENDENCIES) $(EXTRA_chunk_DEPENDENCIES) 
+	@rm -f chunk$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(chunk_OBJECTS) $(chunk_LDADD) $(LIBS)
+
+h5perf$(EXEEXT): $(h5perf_OBJECTS) $(h5perf_DEPENDENCIES) $(EXTRA_h5perf_DEPENDENCIES) 
+	@rm -f h5perf$(EXEEXT)
+	$(AM_V_CCLD)$(h5perf_LINK) $(h5perf_OBJECTS) $(h5perf_LDADD) $(LIBS)
+
+h5perf_serial$(EXEEXT): $(h5perf_serial_OBJECTS) $(h5perf_serial_DEPENDENCIES) $(EXTRA_h5perf_serial_DEPENDENCIES) 
+	@rm -f h5perf_serial$(EXEEXT)
+	$(AM_V_CCLD)$(h5perf_serial_LINK) $(h5perf_serial_OBJECTS) $(h5perf_serial_LDADD) $(LIBS)
+
+iopipe$(EXEEXT): $(iopipe_OBJECTS) $(iopipe_DEPENDENCIES) $(EXTRA_iopipe_DEPENDENCIES) 
+	@rm -f iopipe$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(iopipe_OBJECTS) $(iopipe_LDADD) $(LIBS)
+
+overhead$(EXEEXT): $(overhead_OBJECTS) $(overhead_DEPENDENCIES) $(EXTRA_overhead_DEPENDENCIES) 
+	@rm -f overhead$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(overhead_OBJECTS) $(overhead_LDADD) $(LIBS)
+
+perf$(EXEEXT): $(perf_OBJECTS) $(perf_DEPENDENCIES) $(EXTRA_perf_DEPENDENCIES) 
+	@rm -f perf$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(perf_OBJECTS) $(perf_LDADD) $(LIBS)
+
+perf_meta$(EXEEXT): $(perf_meta_OBJECTS) $(perf_meta_DEPENDENCIES) $(EXTRA_perf_meta_DEPENDENCIES) 
+	@rm -f perf_meta$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(perf_meta_OBJECTS) $(perf_meta_LDADD) $(LIBS)
+
+zip_perf$(EXEEXT): $(zip_perf_OBJECTS) $(zip_perf_DEPENDENCIES) $(EXTRA_zip_perf_DEPENDENCIES) 
+	@rm -f zip_perf$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(zip_perf_OBJECTS) $(zip_perf_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/chunk.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/iopipe.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/overhead.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/perf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/perf_meta.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pio_engine.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pio_perf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sio_engine.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sio_perf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/zip_perf.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.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 $$?
+iopipe.log: iopipe$(EXEEXT)
+	@p='iopipe$(EXEEXT)'; \
+	b='iopipe'; \
+	$(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)
+chunk.log: chunk$(EXEEXT)
+	@p='chunk$(EXEEXT)'; \
+	b='chunk'; \
+	$(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)
+overhead.log: overhead$(EXEEXT)
+	@p='overhead$(EXEEXT)'; \
+	b='overhead'; \
+	$(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)
+zip_perf.log: zip_perf$(EXEEXT)
+	@p='zip_perf$(EXEEXT)'; \
+	b='zip_perf'; \
+	$(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)
+perf_meta.log: perf_meta$(EXEEXT)
+	@p='perf_meta$(EXEEXT)'; \
+	b='perf_meta'; \
+	$(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)
+h5perf_serial.log: h5perf_serial$(EXEEXT)
+	@p='h5perf_serial$(EXEEXT)'; \
+	b='h5perf_serial'; \
+	$(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 $(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:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+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-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-dyn: $(DYN)
+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 dyn 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/test/perform/build_h5perf_alone.sh b/tools/test/perform/build_h5perf_alone.sh
new file mode 100644
index 0000000..30d272f
--- /dev/null
+++ b/tools/test/perform/build_h5perf_alone.sh
@@ -0,0 +1,26 @@
+#! /bin/sh -x
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Name: build_h5perf_alone.sh
+#
+# Puporse: Build the h5perf tool by standalone mode.
+#
+# Created: Albert Cheng, 2005/09/18
+#
+# Modification:
+#
+
+# Default to use h5pcc to build h5perf unless $H5CC is defined.
+# 
+h5pcc=${H5CC:-h5pcc}
+$h5pcc -DSTANDALONE pio_perf.c pio_engine.c pio_timer.c -o h5perf
diff --git a/tools/test/perform/build_h5perf_serial_alone.sh b/tools/test/perform/build_h5perf_serial_alone.sh
new file mode 100644
index 0000000..099e7f9
--- /dev/null
+++ b/tools/test/perform/build_h5perf_serial_alone.sh
@@ -0,0 +1,26 @@
+#! /bin/sh -x
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+# Name: build_h5perf_serial_alone.sh
+#
+# Puporse: Build the h5perf_serial tool by standalone mode.
+#
+# Created: Christian Chilan, 2008/09/02 
+#
+# Modification:
+#
+
+# Default to use h5cc to build h5perf_serial unless $H5CC is defined.
+# 
+h5cc=${H5CC:-h5cc}
+$h5cc -DSTANDALONE sio_perf.c sio_engine.c sio_timer.c -o h5perf_serial
diff --git a/tools/test/perform/chunk.c b/tools/test/perform/chunk.c
new file mode 100644
index 0000000..804f88e
--- /dev/null
+++ b/tools/test/perform/chunk.c
@@ -0,0 +1,548 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <robb at arborea.spizella.com>
+ *              Thursday, May 14, 1998
+ *
+ * Purpose:	Checks the effect of various I/O request sizes and raw data
+ *		cache sizes.  Performance depends on the amount of data read
+ *		from disk and we use a filter to get that number.
+ */
+
+/* See H5private.h for how to include headers */
+#undef NDEBUG
+#include "hdf5.h"
+
+#ifdef H5_STDC_HEADERS
+#   include <assert.h>
+#   include <stdio.h>
+#   include <stdlib.h>
+#   include <string.h>
+#endif
+
+/* Solaris Studio defines attribute, but for the attributes we need */
+#if !defined(H5_HAVE_ATTRIBUTE) || defined __cplusplus || defined(__SUNPRO_C)
+#   undef __attribute__
+#   define __attribute__(X) /*void*/
+#   define H5_ATTR_UNUSED /*void*/
+#else
+#   define H5_ATTR_UNUSED __attribute__((unused))
+#endif
+
+#define FILE_NAME	"chunk.h5"
+#define LINESPOINTS	"lines"
+#define CH_SIZE		100		/*squared in terms of bytes    	*/
+#define DS_SIZE		20		/*squared in terms of chunks	*/
+#define FILTER_COUNTER	305
+#define READ		0
+#define WRITE		1
+#define MIN(X,Y)	((X)<(Y)?(X):(Y))
+#define MAX(X,Y)	((X)>(Y)?(X):(Y))
+#define SQUARE(X)	((X)*(X))
+
+/* The row-major test */
+#define RM_CACHE_STRT	25
+#define RM_CACHE_END	25
+#define RM_CACHE_DELT	5
+#define RM_START	(double)0.50F
+#define RM_END	        (double)5.00F
+#define RM_DELTA	(double)0.50F
+#define RM_W0		0.0F
+#define RM_NRDCC	521
+
+/* Diagonal test */
+#define DIAG_CACHE_STRT	25
+#define DIAG_CACHE_END	25
+#define DIAG_CACHE_DELT	5
+#define DIAG_START	(double)0.50F
+#define DIAG_END	(double)5.00F
+#define DIAG_DELTA	(double)0.50F
+/* #define DIAG_W0		0.65F */
+/* #define DIAG_NRDCC		521 */
+
+static size_t	nio_g;
+static hid_t	fapl_g = -1;
+
+/* Local function prototypes */
+static size_t
+counter (unsigned H5_ATTR_UNUSED flags, size_t cd_nelmts,
+	 const unsigned *cd_values, size_t nbytes,
+	 size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_COUNTER[1] = {{
+    H5Z_CLASS_T_VERS,		/* H5Z_class_t version		*/
+    FILTER_COUNTER,		/* Filter id number		*/
+    1, 1,			/* Encoding and decoding enabled */
+    "counter",			/* Filter name for debugging	*/
+    NULL,                       /* The "can apply" callback     */
+    NULL,                       /* The "set local" callback     */
+    counter,			/* The actual filter function	*/
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	counter
+ *
+ * Purpose:	Count number of bytes but don't do anything.
+ *
+ * Return:	Success:	src_nbytes-1
+ *
+ *		Failure:	never fails
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 14, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+counter (unsigned H5_ATTR_UNUSED flags, size_t H5_ATTR_UNUSED cd_nelmts,
+	 const unsigned H5_ATTR_UNUSED *cd_values, size_t nbytes,
+	 size_t H5_ATTR_UNUSED *buf_size, void H5_ATTR_UNUSED **buf)
+{
+    nio_g += nbytes;
+    return nbytes;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_dataset
+ *
+ * Purpose:	Creates a square dataset with square chunks, registers a
+ *		stupid compress/uncompress pair for counting I/O, and
+ *		initializes the dataset.  The chunk size is in bytes, the
+ *		dataset size is in terms of chunks.
+ *
+ * Return:	void
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 14, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+create_dataset (void)
+{
+    hid_t	file, space, dcpl, dset;
+    hsize_t	size[2];
+    signed char	*buf;
+
+    /* The file */
+    file = H5Fcreate (FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_g);
+
+    /* The data space */
+    size[0] = size[1] = DS_SIZE * CH_SIZE;
+    space = H5Screate_simple(2, size, size);
+
+    /* The storage layout and compression */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    size[0] = size[1] = CH_SIZE;
+    H5Pset_chunk(dcpl, 2, size);
+    H5Zregister(H5Z_COUNTER);
+    H5Pset_filter(dcpl, FILTER_COUNTER, 0, 0, NULL);
+
+    /* The dataset */
+    dset = H5Dcreate2(file, "dset", H5T_NATIVE_SCHAR, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    assert(dset>=0);
+
+    /* The data */
+    buf = (signed char *)calloc(1, SQUARE (DS_SIZE*CH_SIZE));
+    H5Dwrite(dset, H5T_NATIVE_SCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    free(buf);
+
+    /* Close */
+    H5Dclose(dset);
+    H5Sclose(space);
+    H5Pclose(dcpl);
+    H5Fclose(file);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_rowmaj
+ *
+ * Purpose:	Reads the entire dataset using the specified size-squared
+ *		I/O requests in row major order.
+ *
+ * Return:	Efficiency: data requested divided by data actually read.
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 14, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+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 = (signed char *)calloc (1, (size_t)(SQUARE(io_size)));
+    hsize_t	i, j, hs_size[2];
+    hsize_t	hs_offset[2];
+    int		mdc_nelmts;
+    size_t	rdcc_nelmts;
+    double	w0;
+
+    H5Pget_cache (fapl_g, &mdc_nelmts, &rdcc_nelmts, NULL, &w0);
+#ifdef RM_W0
+    w0 = RM_W0;
+#endif
+#ifdef RM_NRDCC
+    rdcc_nelmts = RM_NRDCC;
+#endif
+    H5Pset_cache (fapl_g, mdc_nelmts, rdcc_nelmts,
+		  cache_size*SQUARE (CH_SIZE), w0);
+    file = H5Fopen(FILE_NAME, H5F_ACC_RDWR, fapl_g);
+    dset = H5Dopen2(file, "dset", H5P_DEFAULT);
+    file_space = H5Dget_space(dset);
+    nio_g = 0;
+
+    for (i=0; i<CH_SIZE*DS_SIZE; i+=io_size) {
+#if 0
+	fprintf (stderr, "%5d\b\b\b\b\b", (int)i);
+	fflush (stderr);
+#endif
+	for (j=0; j<CH_SIZE*DS_SIZE; j+=io_size) {
+	    hs_offset[0] = i;
+	    hs_size[0] = MIN (io_size, CH_SIZE*DS_SIZE-i);
+	    hs_offset[1] = j;
+	    hs_size[1] = MIN (io_size, CH_SIZE*DS_SIZE-j);
+	    mem_space = H5Screate_simple (2, hs_size, hs_size);
+	    H5Sselect_hyperslab (file_space, H5S_SELECT_SET, hs_offset,
+				 NULL, hs_size, NULL);
+
+	    if (READ==op) {
+		H5Dread (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
+			 H5P_DEFAULT, buf);
+	    } else {
+		H5Dwrite (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
+			  H5P_DEFAULT, buf);
+	    }
+	    H5Sclose (mem_space);
+	}
+    }
+
+    free (buf);
+    H5Sclose (file_space);
+    H5Dclose (dset);
+    H5Fclose (file);
+
+    return (double)SQUARE(CH_SIZE*DS_SIZE)/(double)nio_g;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_diag
+ *
+ * Purpose:	Reads windows diagonally across the dataset.  Each window is
+ *		offset from the previous window by OFFSET in the x and y
+ *		directions.  The reading ends after the (k,k) value is read
+ *		where k is the maximum index in the dataset.
+ *
+ * Return:	Efficiency.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, May 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static double
+test_diag (int op, size_t cache_size, size_t io_size, size_t offset)
+{
+    hid_t	file, dset, mem_space, file_space;
+    hsize_t	i, hs_size[2];
+    hsize_t	nio = 0;
+    hsize_t	hs_offset[2];
+    signed char	*buf = (signed char *)calloc(1, (size_t)(SQUARE (io_size)));
+    int		mdc_nelmts;
+    size_t	rdcc_nelmts;
+    double	w0;
+
+    H5Pget_cache (fapl_g, &mdc_nelmts, &rdcc_nelmts, NULL, &w0);
+#ifdef DIAG_W0
+    w0 = DIAG_W0;
+#endif
+#ifdef DIAG_NRDCC
+    rdcc_nelmts = DIAG_NRDCC;
+#endif
+    H5Pset_cache (fapl_g, mdc_nelmts, rdcc_nelmts,
+		  cache_size*SQUARE (CH_SIZE), w0);
+    file = H5Fopen(FILE_NAME, H5F_ACC_RDWR, fapl_g);
+    dset = H5Dopen2(file, "dset", H5P_DEFAULT);
+    file_space = H5Dget_space(dset);
+    nio_g = 0;
+
+    for (i=0, hs_size[0]=io_size; hs_size[0]==io_size; i+=offset) {
+	hs_offset[0] = hs_offset[1] = i;
+	hs_size[0] = hs_size[1] = MIN (io_size, CH_SIZE*DS_SIZE-i);
+	mem_space = H5Screate_simple (2, hs_size, hs_size);
+	H5Sselect_hyperslab (file_space, H5S_SELECT_SET, hs_offset, NULL,
+			     hs_size, NULL);
+	if (READ==op) {
+	    H5Dread (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
+		     H5P_DEFAULT, buf);
+	} else {
+	    H5Dwrite (dset, H5T_NATIVE_SCHAR, mem_space, file_space,
+		      H5P_DEFAULT, buf);
+	}
+	H5Sclose (mem_space);
+	nio += hs_size[0]*hs_size[1];
+	if (i>0) nio -= SQUARE (io_size-offset);
+    }
+
+    free (buf);
+    H5Sclose (file_space);
+    H5Dclose (dset);
+    H5Fclose (file);
+
+    /*
+     * The extra cast in the following statement is a bug workaround for the
+     * Win32 version 5.0 compiler.
+     * 1998-11-06 ptl
+     */
+    return (double)nio/(double)nio_g;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	See file prologue.
+ *
+ * Return:	Success:
+ *
+ *		Failure:
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 14, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (void)
+{
+    size_t	io_size;
+    double	effic, io_percent;
+    FILE	*f, *d;
+    size_t	cache_size;
+    double	w0;
+
+    /*
+     * Create a global file access property list.
+     */
+    fapl_g = H5Pcreate (H5P_FILE_ACCESS);
+    H5Pget_cache (fapl_g, NULL, NULL, NULL, &w0);
+
+    /* Create the file */
+    create_dataset ();
+    f = fopen ("x-gnuplot", "w");
+
+    printf("Test      %8s %8s %8s\n", "CacheSz", "ChunkSz",  "Effic");
+    printf("--------- -------- -------- --------\n");
+
+#if 1
+    /*
+     * Test row-major reading of the dataset with various sizes of request
+     * windows.
+     */
+    if (RM_CACHE_STRT==RM_CACHE_END) {
+	fprintf (f, "set yrange [0:1.2]\n");
+	fprintf (f, "set ytics 0, 0.1, 1\n");
+	fprintf (f, "set xlabel \"%s\"\n",
+		 "Request size as a fraction of chunk size");
+	fprintf (f, "set ylabel \"Efficiency\"\n");
+	fprintf (f, "set title \"Cache %d chunks, w0=%g, "
+		 "Size=(total=%d, chunk=%d)\"\n",
+		 RM_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
+    } else {
+	fprintf (f, "set autoscale\n");
+	fprintf (f, "set hidden3d\n");
+    }
+
+    fprintf (f, "set terminal postscript\nset output \"x-rowmaj-rd.ps\"\n");
+    fprintf (f, "%s \"x-rowmaj-rd.dat\" title \"RowMaj-Read\" with %s\n",
+	     RM_CACHE_STRT==RM_CACHE_END?"plot":"splot",
+	     LINESPOINTS);
+    fprintf (f, "set terminal x11\nreplot\n");
+    d = fopen ("x-rowmaj-rd.dat", "w");
+    for (cache_size=RM_CACHE_STRT;
+	 cache_size<=RM_CACHE_END;
+	 cache_size+=RM_CACHE_DELT) {
+	for (io_percent=RM_START; io_percent<=RM_END; io_percent+=RM_DELTA) {
+	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
+	    printf ("Rowmaj-rd %8d %8.2f", (int)cache_size, io_percent);
+	    fflush (stdout);
+	    effic = test_rowmaj (READ, cache_size, io_size);
+	    printf (" %8.2f\n", effic);
+	    if (RM_CACHE_STRT==RM_CACHE_END) {
+		fprintf (d, "%g %g\n", io_percent, effic);
+	    } else {
+		fprintf (d, "%g\n", effic);
+	    }
+	}
+	fprintf (d, "\n");
+    }
+    fclose (d);
+    fprintf (f, "pause -1\n");
+#endif
+
+#if 1
+    /*
+     * Test row-major writing of the dataset with various sizes of request
+     * windows.
+     */
+    if (RM_CACHE_STRT==RM_CACHE_END) {
+	fprintf (f, "set yrange [0:1.2]\n");
+	fprintf (f, "set ytics 0, 0.1, 1\n");
+	fprintf (f, "set xlabel \"%s\"\n",
+		 "Request size as a fraction of chunk size");
+	fprintf (f, "set ylabel \"Efficiency\"\n");
+	fprintf (f, "set title \"Cache %d chunks,w0=%g, "
+		 "Size=(total=%d, chunk=%d)\"\n",
+		 RM_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
+    } else {
+	fprintf (f, "set autoscale\n");
+	fprintf (f, "set hidden3d\n");
+    }
+
+    fprintf (f, "set terminal postscript\nset output \"x-rowmaj-wr.ps\"\n");
+    fprintf (f, "%s \"x-rowmaj-wr.dat\" title \"RowMaj-Write\" with %s\n",
+	     RM_CACHE_STRT==RM_CACHE_END?"plot":"splot",
+	     LINESPOINTS);
+    fprintf (f, "set terminal x11\nreplot\n");
+    d = fopen ("x-rowmaj-wr.dat", "w");
+    for (cache_size=RM_CACHE_STRT;
+	 cache_size<=RM_CACHE_END;
+	 cache_size+=RM_CACHE_DELT) {
+	for (io_percent=RM_START; io_percent<=RM_END; io_percent+=RM_DELTA) {
+	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
+	    printf ("Rowmaj-wr %8d %8.2f", (int)cache_size, io_percent);
+	    fflush (stdout);
+	    effic = test_rowmaj (WRITE, cache_size, io_size);
+	    printf (" %8.2f\n", effic);
+	    if (RM_CACHE_STRT==RM_CACHE_END) {
+		fprintf (d, "%g %g\n", io_percent, effic);
+	    } else {
+		fprintf (d, "%g\n", effic);
+	    }
+	}
+	fprintf (d, "\n");
+    }
+    fclose (d);
+    fprintf (f, "pause -1\n");
+#endif
+
+#if 1
+    /*
+     * Test diagonal read
+     */
+    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
+	fprintf (f, "set yrange [0:1.2]\n");
+	fprintf (f, "set ytics 0, 0.1, 1\n");
+	fprintf (f, "set xlabel \"%s\"\n",
+		 "Request size as a fraction of chunk size");
+	fprintf (f, "set ylabel \"Efficiency\"\n");
+	fprintf (f, "set title \"Cache %d chunks,w0=%g, "
+		 "Size=(total=%d, chunk=%d)\"\n",
+		 DIAG_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
+    } else {
+	fprintf (f, "set autoscale\n");
+	fprintf (f, "set hidden3d\n");
+    }
+    fprintf (f, "set terminal postscript\nset output \"x-diag-rd.ps\"\n");
+    fprintf (f, "%s \"x-diag-rd.dat\" title \"Diag-Read\" with %s\n",
+	     DIAG_CACHE_STRT==DIAG_CACHE_END?"plot":"splot", LINESPOINTS);
+    fprintf (f, "set terminal x11\nreplot\n");
+    d = fopen ("x-diag-rd.dat", "w");
+    for (cache_size=DIAG_CACHE_STRT;
+	 cache_size<=DIAG_CACHE_END;
+	 cache_size+=DIAG_CACHE_DELT) {
+	for (io_percent=DIAG_START; io_percent<=DIAG_END; io_percent+=DIAG_DELTA) {
+	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
+	    printf ("Diag-rd   %8d %8.2f", (int)cache_size, io_percent);
+	    fflush (stdout);
+	    effic = test_diag (READ, cache_size, io_size, MAX (1, io_size/2));
+	    printf (" %8.2f\n", effic);
+	    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
+		fprintf (d, "%g %g\n", io_percent, effic);
+	    } else {
+		fprintf (d, "%g\n", effic);
+	    }
+	}
+	fprintf (d, "\n");
+    }
+    fclose (d);
+    fprintf (f, "pause -1\n");
+#endif
+
+#if 1
+    /*
+     * Test diagonal write
+     */
+    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
+	fprintf (f, "set yrange [0:1.2]\n");
+	fprintf (f, "set ytics 0, 0.1, 1\n");
+	fprintf (f, "set xlabel \"%s\"\n",
+		 "Request size as a fraction of chunk size");
+	fprintf (f, "set ylabel \"Efficiency\"\n");
+	fprintf (f, "set title \"Cache %d chunks, w0=%g, "
+		 "Size=(total=%d, chunk=%d)\"\n",
+		 DIAG_CACHE_STRT, w0, DS_SIZE*CH_SIZE, CH_SIZE);
+    } else {
+	fprintf (f, "set autoscale\n");
+	fprintf (f, "set hidden3d\n");
+    }
+    fprintf (f, "set terminal postscript\nset output \"x-diag-wr.ps\"\n");
+    fprintf (f, "%s \"x-diag-wr.dat\" title \"Diag-Write\" with %s\n",
+	     DIAG_CACHE_STRT==DIAG_CACHE_END?"plot":"splot", LINESPOINTS);
+    fprintf (f, "set terminal x11\nreplot\n");
+    d = fopen ("x-diag-wr.dat", "w");
+    for (cache_size=DIAG_CACHE_STRT;
+	 cache_size<=DIAG_CACHE_END;
+	 cache_size+=DIAG_CACHE_DELT) {
+	for (io_percent=DIAG_START;
+	     io_percent<=DIAG_END;
+	     io_percent+=DIAG_DELTA) {
+	    io_size = MAX (1, (size_t)(CH_SIZE*io_percent));
+	    printf ("Diag-wr   %8d %8.2f", (int)cache_size, io_percent);
+	    fflush (stdout);
+	    effic = test_diag (WRITE, cache_size, io_size, MAX (1, io_size/2));
+	    printf (" %8.2f\n", effic);
+	    if (DIAG_CACHE_STRT==DIAG_CACHE_END) {
+		fprintf (d, "%g %g\n", io_percent, effic);
+	    } else {
+		fprintf (d, "%g\n", effic);
+	    }
+	}
+	fprintf (d, "\n");
+    }
+    fclose (d);
+    fprintf (f, "pause -1\n");
+#endif
+
+
+    H5Pclose (fapl_g);
+    fclose (f);
+    return 0;
+}
+
diff --git a/tools/test/perform/gen_report.pl b/tools/test/perform/gen_report.pl
new file mode 100644
index 0000000..34b3a83
--- /dev/null
+++ b/tools/test/perform/gen_report.pl
@@ -0,0 +1,525 @@
+#!/usr/bin/perl 
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the COPYING file, which can be found at the root of the source code
+# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
+# If you do not have access to either file, you may request a copy from
+# help at hdfgroup.org.
+#
+
+#
+#    Generates an ASCII and Excel-importable file of tables representing
+#    the output of running the "pio_perf" command. The name of the input
+#    file is important. The name should reflect the command-line options
+#    used in the performance test. It needs to be of the form:
+#
+#        f#[GMK].i#.d#.X#[GMK].x#[GMK]..*
+#
+#    For example:
+#
+#        PIO_output_f1G.i2.d1.X2M.x128K.frost
+#
+#    for a 1GB sized file ran for 2 iterations with 1 dataset from xfer
+#    buffer size of 128KB to 2MB on the frost machine.
+#
+#    The output file will have the same name as the input, but will append
+#    ".ascii" for the ASCII file and ".excel" for the Excel-importable
+#    file.
+#
+#    The data structure used in this program looks like:
+#
+#        %results = {
+#            num_proc => (
+#                %xfer_size => (
+#                    %posix = {
+#                        'write-only' => ##,
+#                        'write-close' => ##,
+#                        'read-only' => ##,
+#                        'read-close' => ##
+#                    },
+#                    %mpio = {
+#                        'write-only' => ##,
+#                        'write-close' => ##,
+#                        'read-only' => ##,
+#                        'read-close' => ##
+#                    },
+#                    %phdf = {
+#                        'write-only' => ##,
+#                        'write-close' => ##,
+#                        'read-only' => ##,
+#                        'read-close' => ##
+#                    }
+#                )
+#            )
+#        }
+
+use IO::Handle;
+use Getopt::Long;
+use List::Util qw[max];
+
+if ($#ARGV == -1) {
+	usage();
+}
+
+my ($ascii_output, $excel_output);
+
+GetOptions("data_type=s"=>\$data_type, 
+            "buffer_size=i"=>\$transfer_buffer_size,
+            "procs=i"=>\$num_procs_graph,
+	    "help!"=>\$help,
+	    "throughput=s"=>\$throughput_type,
+	    "io_type=i"=>\$io_type,
+            "3d!"=>\$plot_3d);
+
+usage() if $help or !@ARGV;
+
+$throughput_type = "average" if !$throughput_type;
+$io_type = 7 if !$io_type;
+
+foreach my $arg (@ARGV) {
+
+	if ($arg !~ /^-/) {
+		$arg =~ /f([0-9]+.)\.i([0-9]+)\.d([0-9]+)\.X([0-9]+.)\.x([0-9]+.)\.(.*)/;
+
+		my $output = $arg . $1 . ".X" . $4 . ".x" . $5 . "." . $6;
+
+		$ascii_output = $output . ".ascii";
+		$excel_output = $output . ".excel";
+
+		open(INPUT, "<$arg") or die "error: cannot open file $arg: $!\n";
+		open(ASCII_OUTPUT, ">$ascii_output") or
+		    die "error: cannot open file $ascii_output: $!\n";
+		open(EXCEL_OUTPUT, ">$excel_output") or
+		    die "error: cannot open file $excel_output: $!\n";
+	} 
+	else
+	{
+		die "error: unrecognized option: $arg\n";
+	}
+}
+
+my %results;
+my $num_procs = 0;
+my ($xfer_size, $avg_type, $type);
+
+my $posix = 0, $mpio = 1, $phdf5 = 2;
+
+##"==== End of Parameters ===="
+
+while (<INPUT>) {
+	if (/Number of processors = ([0-9]+)/) {
+		$num_procs = $1;
+	}
+
+	if (/Transfer Buffer Size: ([0-9]+)/) {
+		$xfer_size = $1;
+	}
+
+	$type = $posix if /POSIX/;
+	$type = $mpio if /MPIO/;
+	$type = $phdf5 if /PHDF5/;
+
+	if (/Write Open/) {
+		$avg_type = "write-close";
+	} elsif (/Write/) {
+		$avg_type = "write-only";
+	} elsif (/Read Open/) {
+		$avg_type = "read-close";
+	} elsif (/Read/) {
+	    $avg_type = "read-only";
+	}
+
+	if($throughput_type eq "max")
+	{
+	    if (/Maximum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+	    }
+	}
+	elsif($throughput_type eq "min")
+	{
+	    if (/Minimum Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+	    }
+	}
+	elsif($throughput_type eq "average")
+	{
+	    if (/Average Throughput: ( {0,2}[0-9]+\.[0-9]{2}) MB\/s/) {
+		$results{$num_procs}{$xfer_size}[$type]{$avg_type} = $1;
+	    }
+	}
+}
+
+sub usage {
+	print "Usage: gen_reporl.pl [options] FILE
+	options are:\n
+	-data_type \"data_type\" plots the results for \"write-only\",\"read-only\", \"write-close\", or \"read-close\" (default is write-only)\n
+	-buffer_size \"buffer_size\" plots data from this buffer size (in kilobytes, default is 128)\n
+	-procs \"num_procs\" plots data from the run with num_procs processors (default is the highest number of processors for which there is data).\n
+	-throughput \"throughput_type\" plots either the \"max\", \"min\", or \"average\" throughput (default is average)\n
+	-io_type  \"io_type\" where \"io_type\" is the bitwise or of the io_type for which plotting is desired (1 for POSIX, 2 for MPIO, 4 for PHDF5 (default is 7 (all))\n
+	-3d	if present, does a 3d plot in addition to the normal ones\n";
+			
+	exit 1;
+}
+
+sub create_excel_output_header {
+	my $output_header;
+	my $kb = 1024;
+	my $mb = $kb * $kb;
+
+	foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
+		if ($key < $mb) {
+			$key /= $kb;
+			$output_header .= "\t". $key . "K";
+		} else {
+			$key /= $mb;
+			$output_header .= "\t". $key . "M";
+		}
+	}
+
+	$output_header;
+}
+
+sub create_excel_output_string {
+	my ($t) = @_;
+	my $output_content = "";
+
+	foreach my $procs (sort { $b <=> $a } keys(%results)) {
+		$output_content .= "\n$procs Procs";
+		$output_content .= "\n" . create_excel_output_header;
+		$output_content .= "\n  POSIX";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content .= "\t$results{$procs}{$xfer}[0]{$t}";
+		}
+
+		$output_content .= "\n  MPIO";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content .= "\t$results{$procs}{$xfer}[1]{$t}";
+		}
+
+		$output_content .= "\n  PHDF5";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content .= "\t$results{$procs}{$xfer}[2]{$t}";
+		}
+
+		$output_content .= "\n";
+	}
+
+	$output_content;
+}
+
+sub is_defined {
+	my ($t) = @_;
+	my $def = 1;
+
+	foreach my $procs (sort { $b <=> $a } keys(%results)) {
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			if (!defined($results{$procs}{$xfer}[0]{$t})) {
+				$def = 0;
+			}
+		}
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			if (!defined($results{$procs}{$xfer}[0]{$t})) {
+				$def = 0;
+			}
+		}
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			if (!defined($results{$procs}{$xfer}[0]{$t})) {
+				$def = 0;
+			}
+		}
+	}
+
+	$def;
+}
+
+sub write_excel_file {
+	print EXCEL_OUTPUT "\nWrite-Only\n";
+	print EXCEL_OUTPUT create_excel_output_string("write-only");
+	print EXCEL_OUTPUT "\nWrite-Close\n";
+	print EXCEL_OUTPUT create_excel_output_string("write-close");
+
+	if (is_defined("read-only")) {
+		print EXCEL_OUTPUT "\nRead-Only\n";
+		print EXCEL_OUTPUT create_excel_output_string("read-only");
+		print EXCEL_OUTPUT "\nRead-Close\n";
+		print EXCEL_OUTPUT create_excel_output_string("read-close");
+	}
+}
+
+sub create_ascii_output_header {
+	my $output_header = " " x 12 . "|";
+	my $kb = 1024;
+	my $mb = $kb * $kb;
+
+	foreach my $key (sort { $a <=> $b } keys(%{$results{$num_procs}})) {
+		if ($key < $mb) {
+			$key /= $kb;
+			$output_header = sprintf("$output_header   %-4s   |", $key .  "K");
+		} else {
+			$key /= $mb;
+			$output_header = sprintf("$output_header   %-4s   |", $key .  "M");
+		}
+	}
+
+	$output_header;
+}
+
+sub create_ascii_output_string {
+	my ($t) = @_;
+	my $output_content = "";
+	my $output_header = create_ascii_output_header;
+
+	foreach my $procs (sort { $b <=> $a } keys(%results)) {
+		$output_content .= "\n$procs Procs";
+		$output_content .= "\n$output_header\n";
+		$output_content .= "-" x length($output_header);
+		$output_content .= "\n     POSIX  |";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content = sprintf("$output_content   %-6s |",
+									   $results{$procs}{$xfer}[0]{$t});
+		}
+
+		$output_content .= "\n    ";
+		$output_content .= "-" x (length($output_header) - 4);
+		$output_content .= "\n     MPI/IO |";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content = sprintf("$output_content   %-6s |",
+									   $results{$procs}{$xfer}[1]{$t});
+		}
+
+		$output_content .= "\n    ";
+		$output_content .= "-" x (length($output_header) - 4);
+		$output_content .= "\n     PHDF5  |";
+
+		foreach my $xfer (sort { $a <=> $b } keys(%{$results{$procs}})) {
+			$output_content = sprintf("$output_content   %-6s |",
+									   $results{$procs}{$xfer}[2]{$t});
+		}
+
+		$output_content .= "\n";
+		$output_content .= "=" x length($output_header);
+		$output_content .= "\n";
+	}
+
+	$output_content;
+}
+
+sub write_ascii_file {
+	print ASCII_OUTPUT "\nWrite-Only";
+	print ASCII_OUTPUT "\n----------\n";
+	print ASCII_OUTPUT create_ascii_output_string("write-only");
+	print ASCII_OUTPUT "\n\nWrite-Close";
+	print ASCII_OUTPUT "\n-----------\n";
+	print ASCII_OUTPUT create_ascii_output_string("write-close");
+
+	if (is_defined("read-only")) {
+		print ASCII_OUTPUT "\n\nRead-Only";
+		print ASCII_OUTPUT "\n---------\n";
+		print ASCII_OUTPUT create_ascii_output_string("read-only");
+		print ASCII_OUTPUT "\n\nRead-Close";
+		print ASCII_OUTPUT "\n----------\n";
+		print ASCII_OUTPUT create_ascii_output_string("read-close");
+	}
+}
+
+sub draw_plot
+{
+    my($p_3d) = @_;
+    
+    if($p_3d)
+    {
+	$counter = 3;
+	print GNUPLOT_PIPE "splot ";
+    }
+    else
+    {
+	$counter = 2;
+	print GNUPLOT_PIPE "plot ";
+    }
+
+    if($io_type & 1) {
+	print GNUPLOT_PIPE " \"gnuplot.data\" using 1:";
+	
+	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
+	
+	print GNUPLOT_PIPE $counter . " title 'POSIX' with linespoints";
+	$counter = $counter + 1;
+    }
+    if($io_type & 2) {
+	if($io_type & 1) { print GNUPLOT_PIPE ", "; }
+	print GNUPLOT_PIPE  "\"gnuplot.data\" using 1:";
+	
+	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
+	
+	print GNUPLOT_PIPE  $counter . " title 'MPIO' with linespoints";
+	$counter = $counter + 1;
+	if($io_type & 4) { print GNUPLOT_PIPE ", ";}
+    }
+    if($io_type & 4) {
+	print GNUPLOT_PIPE "  \"gnuplot.data\" using 1:";
+	
+	if($p_3d) { print GNUPLOT_PIPE "2:"; }       
+	
+	print GNUPLOT_PIPE  $counter . " title 'PHDF5' with linespoints";
+
+    }
+    print GNUPLOT_PIPE "\n";
+}
+
+
+sub plot_default_graph1 {
+	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+		die "error: cannot open file gnuplot.data: $!\n";
+	
+	$transfer_buffer_size = 128 if !$transfer_buffer_size;
+	$data_type = "write-only" if !$data_type;
+
+	#set up the plot
+	print GNUPLOT_PIPE  "set term x11 1\n";
+	print GNUPLOT_PIPE  "set xlabel \"Number of Processors\"\n";
+	print GNUPLOT_PIPE  "set title \"" . $data_type . " Performance (Speed vs. Num. Procs)\"\n";
+	print GNUPLOT_PIPE  "set ylabel \"Bandwdith (MB/s)\"\n";
+	print GNUPLOT_PIPE  "set label 1 \"Transfer buffer size: " . $transfer_buffer_size . "K\" at graph 0.7, graph 0.7 left \n";
+
+#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+	print GNUPLOT_PIPE  "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
+
+
+	foreach $proc (sort { $a <=> $b }( keys %results )) 
+	{
+	    print GNUPLOT_DATA_OUTPUT $proc . "\t";
+	    if($io_type & 1) {
+		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[0]{$data_type} . "\t";
+	    }
+	    if($io_type & 2) {
+		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[1]{$data_type}. "\t";
+	    }
+	    if($io_type & 4) {
+		print GNUPLOT_DATA_OUTPUT $results{$proc}{$transfer_buffer_size*1024}[2]{$data_type};
+	    }
+	    print GNUPLOT_DATA_OUTPUT "\n";
+
+	}
+
+	close(GNUPLOT_DATA_OUTPUT); 
+
+	draw_plot(0);
+	
+	unlink(GNUPLOT_DATA_OUTPUT);
+
+}
+
+
+sub plot_default_graph2 {
+	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+		die "error: cannot open file gnuplot.data: $!\n";
+	
+	$num_procs_graph = max(sort { $a <=> $b }( keys %results )) if !$num_procs_graph;
+	print "min-rpocs: " . $num_procs_graph;
+	$data_type = "write-only" if !$data_type;
+
+	#set up the plot
+	print GNUPLOT_PIPE  "set term x11 2\n";
+	print GNUPLOT_PIPE  "set xlabel \"Transfer Buffer Size (in bytes)\"\n";
+	print GNUPLOT_PIPE  "set title \"" . $data_type . " Performance (Speed vs. Transfer Buffer Size)\"\n";
+	print GNUPLOT_PIPE  "set ylabel \"Bandwdith (MB/s)\"\n";
+	print GNUPLOT_PIPE  "set label 1 \"Procs: " . $num_procs_graph . "\" at graph 0.7, graph 0.7 left \n";
+
+#the next line attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+	print GNUPLOT_PIPE  "set xtics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
+
+	foreach $xfer (sort {$a <=> $b} ( keys %{$results{$num_procs_graph}} )) 
+	{
+	    print GNUPLOT_DATA_OUTPUT $xfer . "\t";
+	    if($io_type & 1) {
+		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[0]{$data_type} . "\t";
+	    }
+	    if($io_type & 2) {
+		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[1]{$data_type}. "\t";		
+	    }
+	    if($io_type & 4) {
+		print GNUPLOT_DATA_OUTPUT $results{$num_procs_graph}{$xfer}[2]{$data_type};
+	    }
+	    print GNUPLOT_DATA_OUTPUT "\n";
+
+     	}
+	
+	close(GNUPLOT_DATA_OUTPUT); 
+
+	draw_plot(0);
+	
+	unlink(GNUPLOT_DATA_OUTPUT);
+}
+
+sub plot_3d_graph3 {
+	open(GNUPLOT_DATA_OUTPUT, ">gnuplot.data") or
+		die "error: cannot open file gnuplot.data: $!\n";
+
+	#set up the plot
+	print GNUPLOT_PIPE  "set term x11 3\n";
+	print GNUPLOT_PIPE  "set xlabel \"Num. Processors\"\n";
+	print GNUPLOT_PIPE  "set title \"Write Speed v. No. Procs v. Buffer Size\"\n";
+	print GNUPLOT_PIPE  "set ylabel \"Buffer Size (bytes)\"\n";
+	print GNUPLOT_PIPE  "set zlabel \"Bandwidth (in MB/s)\"\n";
+	print GNUPLOT_PIPE  "set nolabel\n";
+	print GNUPLOT_PIPE  "set dgrid3d 30,30\n";
+	print GNUPLOT_PIPE  "set hidden3d\n";
+
+#the next lines attempts to hack gnuplot to get around it's inability to linearly scale, but logarithmically label an axis
+	print GNUPLOT_PIPE  "set xtics (\"1\" 1, \"2\" 2, \"4\" 4, \"8\" 8, \"16\" 16, \"32\" 32, \"64\" 64, \"128\" 128, \"256\" 256, \"512\" 512, \"1024\" 1024)\n";
+	print GNUPLOT_PIPE  "set ytics (\"4K\" 4*1024, \"8K\" 8*1024, \"16K\" 16*1024, \"32K\" 32*1024, \"64K\" 64*1024, \"128K\" 128*1024, \"256K\" 256*1024, \"512K\" 512*1024, \"1M\" 1024*1024, \"2M\" 2048*1024, \"4M\" 4096*1024, \"8M\" 8192*1024, \"16M\" 16384*1024)\n";
+
+
+#Read speed on z-axis, processors on x, buffer size on y.
+
+	foreach $proc (sort { $a <=> $b }( keys %results )) 
+	{
+	    foreach $xfer (sort {$a <=> $b} ( keys %{$results{$proc}} )) 
+	    {
+		print GNUPLOT_DATA_OUTPUT $proc . "\t" . $xfer . "\t";
+		if($io_type & 1) {
+		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[0]{"write-only"} . "\t";		
+		}
+		if($io_type & 2) {
+		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[1]{"write-only"}. "\t";		
+		}
+		if($io_type & 4) {
+		    print GNUPLOT_DATA_OUTPUT $results{$proc}{$xfer}[2]{"write-only"};
+		}
+	    print GNUPLOT_DATA_OUTPUT "\n";
+
+	    }
+	}
+	
+	close(GNUPLOT_DATA_OUTPUT); 
+	
+	draw_plot(1);
+	
+	unlink(GNUPLOT_DATA_OUTPUT);
+}
+
+open(GNUPLOT_PIPE, "| tee gnuplot.script | gnuplot -persist") || die "Couldn't run gnuplot: $!\n";
+GNUPLOT_PIPE->autoflush(1);
+
+write_excel_file;
+write_ascii_file;
+plot_default_graph1;
+sleep 1;
+plot_default_graph2;
+sleep 1;
+
+plot_3d_graph3 if $plot_3d;
+close(GNUPLOT_PIPE);
diff --git a/tools/test/perform/iopipe.c b/tools/test/perform/iopipe.c
new file mode 100644
index 0000000..eac099b
--- /dev/null
+++ b/tools/test/perform/iopipe.c
@@ -0,0 +1,506 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Thursday, March 12, 1998
+ */
+
+/* See H5private.h for how to include headers */
+#include "hdf5.h"
+
+#include "H5private.h"
+
+#ifdef H5_HAVE_SYS_TIMEB
+#include <sys/timeb.h>
+#endif
+
+
+#define RAW_FILE_NAME  "iopipe.raw"
+#define HDF5_FILE_NAME  "iopipe.h5"
+#define HEADING    "%-16s"
+#define PROGRESS  '='
+
+#if 0
+/* Normal testing */
+#define REQUEST_SIZE_X  4579
+#define REQUEST_SIZE_Y  4579
+#define NREAD_REQUESTS  45
+#define NWRITE_REQUESTS  45
+#else
+/* Speedy testing */
+#define REQUEST_SIZE_X  1000
+#define REQUEST_SIZE_Y  1000
+#define NREAD_REQUESTS  45
+#define NWRITE_REQUESTS  45
+#endif
+
+

+/*-------------------------------------------------------------------------
+ * Function:  print_stats
+ *
+ * Purpose:  Prints statistics
+ *
+ * Return:  void
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_GETRUSAGE
+static void
+print_stats (const char *prefix,
+       struct rusage *r_start, struct rusage *r_stop,
+       struct timeval *t_start, struct timeval *t_stop,
+       size_t nbytes)
+#else /* H5_HAVE_GETRUSAGE */
+static void
+print_stats (const char *prefix,
+       struct timeval *r_start, struct timeval *r_stop,
+       struct timeval *t_start, struct timeval *t_stop,
+       size_t nbytes)
+#endif /* H5_HAVE_GETRUSAGE */
+{
+    double  e_time, bw;
+#ifdef H5_HAVE_GETRUSAGE
+    double  u_time, s_time;
+
+    u_time = ((double)(r_stop->ru_utime.tv_sec)+
+        (double)(r_stop->ru_utime.tv_usec)/(double)1000000.0F) -
+       ((double)(r_start->ru_utime.tv_sec)+
+        (double)(r_start->ru_utime.tv_usec)/(double)1000000.0F);
+
+    s_time = ((double)(r_stop->ru_stime.tv_sec)+
+        (double)(r_stop->ru_stime.tv_usec)/(double)1000000.0F) -
+       ((double)(r_start->ru_stime.tv_sec)+
+        (double)(r_start->ru_stime.tv_usec)/(double)1000000.0F);
+#endif
+#ifndef H5_HAVE_SYS_TIMEB
+    e_time = ((double)(t_stop->tv_sec)+
+        (double)(t_stop->tv_usec)/(double)1000000.0F) -
+       ((double)(t_start->tv_sec)+
+        (double)(t_start->tv_usec)/(double)1000000.0F);
+#else
+    e_time = ((double)(t_stop->tv_sec)+
+        (double)(t_stop->tv_usec)/(double)1000.0F) -
+       ((double)(t_start->tv_sec)+
+        (double)(t_start->tv_usec)/(double)1000.0F);
+#endif
+    bw = (double)nbytes / e_time;
+
+#ifdef H5_HAVE_GETRUSAGE
+    printf (HEADING "%1.2fuser %1.2fsystem %1.2felapsed %1.2fMB/s\n",
+      prefix, u_time, s_time, e_time, bw/(1024*1024));
+#else
+    printf (HEADING "%1.2felapsed %1.2fMB/s\n",
+      prefix, e_time, bw/(1024*1024));
+#endif
+
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  synchronize
+ *
+ * Purpose:
+ *
+ * Return:  void
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+synchronize (void)
+{
+#ifdef H5_HAVE_SYSTEM
+#if defined(H5_HAVE_WIN32_API) && ! defined(__CYGWIN__)
+    _flushall();
+#else
+    int status;
+
+    status = HDsystem("sync");
+    HDassert(status >= 0);
+
+    status = HDsystem("df >/dev/null");
+    HDassert(status >= 0);
+#endif
+#endif
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  main
+ *
+ * Purpose:
+ *
+ * Return:  Success:
+ *
+ *    Failure:
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (void)
+{
+    static hsize_t  size[2] = {REQUEST_SIZE_X, REQUEST_SIZE_Y};
+    static unsigned  nread = NREAD_REQUESTS, nwrite = NWRITE_REQUESTS;
+
+    unsigned char  *the_data = NULL;
+    hid_t    file, dset, file_space = -1;
+    herr_t    status;
+#ifdef H5_HAVE_GETRUSAGE
+    struct rusage  r_start, r_stop;
+#else
+    struct timeval r_start, r_stop;
+#endif
+    struct timeval  t_start, t_stop;
+    int      fd;
+    unsigned    u;
+    hssize_t    n;
+    off_t    offset;
+    hsize_t    start[2];
+    hsize_t    count[2];
+
+
+#ifdef H5_HAVE_SYS_TIMEB
+  struct _timeb *tbstart = malloc(sizeof(struct _timeb));
+  struct _timeb *tbstop = malloc(sizeof(struct _timeb));
+#endif
+    /*
+     * The extra cast in the following statement is a bug workaround for the
+     * Win32 version 5.0 compiler.
+     * 1998-11-06 ptl
+     */
+    printf ("I/O request size is %1.1fMB\n",
+      (double)(hssize_t)(size[0]*size[1])/(double)1024.0F*(double)1024);
+
+    /* Open the files */
+    file = H5Fcreate (HDF5_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    assert (file>=0);
+    fd = HDopen (RAW_FILE_NAME, O_RDWR|O_CREAT|O_TRUNC, 0666);
+    assert (fd>=0);
+
+    /* Create the dataset */
+    file_space = H5Screate_simple (2, size, size);
+    assert(file_space >= 0);
+    dset = H5Dcreate2(file, "dset", H5T_NATIVE_UCHAR, file_space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    assert(dset >= 0);
+    the_data = (unsigned char *)malloc((size_t)(size[0] * size[1]));
+
+    /* initial fill for lazy malloc */
+    HDmemset(the_data, 0xAA, (size_t)(size[0] * size[1]));
+
+    /* Fill raw */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "fill raw");
+    for(u = 0; u < nwrite; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  HDmemset(the_data, 0xAA, (size_t)(size[0]*size[1]));
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("fill raw",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+
+    /* Fill hdf5 */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "fill hdf5");
+    for(u = 0; u < nread; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+        H5P_DEFAULT, the_data);
+  assert (status>=0);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("fill hdf5",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+    /* Write the raw dataset */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "out raw");
+    for(u = 0; u < nwrite; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  offset = HDlseek (fd, (off_t)0, SEEK_SET);
+  assert (0==offset);
+  n = HDwrite (fd, the_data, (size_t)(size[0]*size[1]));
+  assert (n>=0 && (size_t)n==size[0]*size[1]);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("out raw",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+    /* Write the hdf5 dataset */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "out hdf5");
+    for(u = 0; u < nwrite; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  status = H5Dwrite (dset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL,
+         H5P_DEFAULT, the_data);
+  assert (status>=0);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("out hdf5",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+    /* Read the raw dataset */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "in raw");
+    for(u = 0; u < nread; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  offset = HDlseek (fd, (off_t)0, SEEK_SET);
+  assert (0==offset);
+  n = HDread (fd, the_data, (size_t)(size[0]*size[1]));
+  assert (n>=0 && (size_t)n==size[0]*size[1]);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("in raw",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+
+    /* Read the hdf5 dataset */
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "in hdf5");
+    for(u = 0; u < nread; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+        H5P_DEFAULT, the_data);
+  assert (status>=0);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc ('\n', stderr);
+    print_stats ("in hdf5",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*size[0]*size[1]));
+
+    /* Read hyperslab */
+    assert (size[0]>20 && size[1]>20);
+    start[0] = start[1] = 10;
+    count[0] = count[1] = size[0]-20;
+    status = H5Sselect_hyperslab (file_space, H5S_SELECT_SET, start, NULL, count, NULL);
+    assert (status>=0);
+    synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstart);
+#endif
+#endif
+    fprintf (stderr, HEADING, "in hdf5 partial");
+    for(u = 0; u < nread; u++) {
+  putc (PROGRESS, stderr);
+  HDfflush(stderr);
+  status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+        H5P_DEFAULT, the_data);
+  assert (status>=0);
+    }
+#ifdef H5_HAVE_GETRUSAGE
+    HDgetrusage(RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+    HDgettimeofday(&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+  _ftime(tbstop);
+  t_start.tv_sec = tbstart->time;
+  t_start.tv_usec = tbstart->millitm;
+  t_stop.tv_sec = tbstop->time;
+  t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+    putc('\n', stderr);
+    print_stats("in hdf5 partial",
+     &r_start, &r_stop, &t_start, &t_stop,
+     (size_t)(nread*count[0]*count[1]));
+
+
+
+    /* Close everything */
+    HDclose(fd);
+    H5Dclose(dset);
+    H5Sclose(file_space);
+    H5Fclose(file);
+    free(the_data);
+
+    return 0;
+}
+
diff --git a/tools/test/perform/overhead.c b/tools/test/perform/overhead.c
new file mode 100644
index 0000000..81f9de6
--- /dev/null
+++ b/tools/test/perform/overhead.c
@@ -0,0 +1,406 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Robb Matzke <matzke at llnl.gov>
+ *              Monday, September 28, 1998
+ *
+ * Purpose:  Creates a chunked dataset and measures the storage overhead.
+ */
+
+/* See H5private.h for how to include headers */
+#undef NDEBUG
+#include "hdf5.h"
+#include "H5private.h"
+
+#ifdef H5_STDC_HEADERS
+#   include <ctype.h>
+#   include <fcntl.h>
+#   include <stdlib.h>
+#   include <sys/stat.h>
+#   include <string.h>
+#endif
+
+#ifdef H5_HAVE_IO_H
+#   include <io.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#   include <sys/types.h>
+#   include <unistd.h>
+#endif
+
+/* Solaris Studio defines attribute, but for the attributes we need */
+#if !defined(H5_HAVE_ATTRIBUTE) || defined __cplusplus || defined(__SUNPRO_C)
+#   undef __attribute__
+#   define __attribute__(X) /*void*/
+#   define H5_ATTR_UNUSED /*void*/
+#else
+#   define H5_ATTR_UNUSED __attribute__((unused))
+#endif
+
+#define FILE_NAME_1  "overhead.h5"
+#ifndef FALSE
+#define FALSE    0
+#endif /* FALSE */
+#ifndef TRUE
+#define TRUE    1
+#endif /* TRUE */
+
+typedef enum fill_t {
+    FILL_ALL,
+    FILL_FORWARD,
+    FILL_REVERSE,
+    FILL_INWARD,
+    FILL_OUTWARD,
+    FILL_RANDOM
+} fill_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:  usage
+ *
+ * Purpose:  Prints a usage message and exits.
+ *
+ * Return:  never returns
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, September 30, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(const char *prog)
+{
+    fprintf(stderr, "usage: %s [STYLE|cache] [LEFT [MIDDLE [RIGHT]]]\n",
+      prog);
+    fprintf(stderr, "\
+    STYLE is the order that the dataset is filled and should be one of:\n\
+        forward   --  Fill the dataset from lowest address to highest\n\
+                      address. This style tests the right split ratio.\n\
+        reverse   --  Fill the dataset from highest address to lowest\n\
+                      address.  This is the reverse order of `forward' and\n\
+                      tests the left split ratio.\n\
+        inward    --  Fill beginning at both the lowest and highest\n\
+                      addresses and work in toward the center of the\n\
+                      dataset.  This tests the middle split ratio.\n\
+        outward   --  Start at the center of the dataset and work outward\n\
+                      toward the lowest and highest addresses.  This tests\n\
+                      both left and right split ratios.\n\
+        random    --  Write the chunks of the dataset in random order.  This\n\
+                      tests all split ratios.\n\
+    If no fill style is specified then all fill styles are tried and a\n\
+    single value is printed for each one.\n\
+\n\
+    If the word `cache' is used instead of a fill style then the raw data\n\
+    cache is enabled.  It is not possible to enable the raw data cache when\n\
+    a specific fill style is used because H5Fflush() is called after each\n\
+    chunk is written in order to calculate overhead during the test.  If\n\
+    the cache is enabled then chunks are written to disk in different orders\n\
+    than the actual H5Dwrite() calls in the test due to collisions and the\n\
+    resulting B-tree will be split differently.\n\
+\n\
+    LEFT, MIDDLE, and RIGHT are the ratios to use for splitting and should\n\
+    be values between zero and one, inclusive.\n");
+    exit(1);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  cleanup
+ *
+ * Purpose:  Removes test files
+ *
+ * Return:  void
+ *
+ * Programmer:  Robb Matzke
+ *              Thursday, June  4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+cleanup (void)
+{
+    if (!getenv ("HDF5_NOCLEANUP")) {
+  remove (FILE_NAME_1);
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  display_error_cb
+ *
+ * Purpose:  Displays the error stack after printing "*FAILED*".
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  -1
+ *
+ * Programmer:  Robb Matzke
+ *    Wednesday, March  4, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+display_error_cb (hid_t estack, void H5_ATTR_UNUSED *client_data)
+{
+    puts ("*FAILED*");
+    H5Eprint2(estack, stdout);
+
+    return 0;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  test
+ *
+ * Purpose:  The guts of the test
+ *
+ * Return:  Success:  0
+ *
+ *    Failure:  number of errors
+ *
+ * Programmer:  Robb Matzke
+ *              Wednesday, September 30, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test(fill_t fill_style, const double splits[],
+     hbool_t verbose, hbool_t use_rdcc)
+{
+    hid_t  file = (-1), fapl = (-1), dcpl = (-1), xfer = (-1), mspace = (-1), fspace = (-1), dset = (-1);
+    hsize_t  ch_size[1] = {1};    /*chunk size    */
+    hsize_t  cur_size[1] = {1000};    /*current dataset size  */
+    hsize_t  max_size[1] = {H5S_UNLIMITED};  /*maximum dataset size  */
+    hsize_t  hs_start[1];      /*hyperslab start offset*/
+    hsize_t  hs_count[1] = {1};    /*hyperslab nelmts  */
+    int    fd = (-1);      /*h5 file direct  */
+    int  *had = NULL;      /*for random filling  */
+    const char  *sname=NULL;      /*fill style nam  */
+    int    mdc_nelmts;      /*num meta objs to cache*/
+    hsize_t  i, k;
+    int    j;
+    h5_stat_t  sb;
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) goto error;
+    if(!use_rdcc) {
+        if(H5Pget_cache(fapl, &mdc_nelmts, NULL, NULL, NULL) < 0) goto error;
+        if(H5Pset_cache(fapl, mdc_nelmts, 0, 0, 0.0F) < 0) goto error;
+    }
+    if((file = H5Fcreate(FILE_NAME_1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) goto error;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) goto error;
+    if(H5Pset_chunk(dcpl, 1, ch_size) < 0) goto error;
+    if((xfer = H5Pcreate(H5P_DATASET_XFER)) < 0) goto error;
+    if(H5Pset_btree_ratios(xfer, splits[0], splits[1], splits[2]) < 0) goto error;
+    if((fspace = H5Screate_simple(1, cur_size, max_size)) < 0) goto error;
+    if((mspace = H5Screate_simple(1, ch_size, ch_size)) < 0) goto error;
+    if((dset = H5Dcreate2(file, "chunked", H5T_NATIVE_INT,
+        fspace, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
+    if ((fd=HDopen(FILE_NAME_1, O_RDONLY, 0666)) < 0) goto error;
+
+    if(FILL_RANDOM==fill_style) 
+        had = (int *)calloc((size_t)cur_size[0], sizeof(int));
+    
+    for (i=1; i<=cur_size[0]; i++) {
+
+        /* Decide which chunk to write to */
+        switch (fill_style) {
+        case FILL_FORWARD:
+            hs_start[0] = i-1;
+            break;
+        case FILL_REVERSE:
+            hs_start[0] = cur_size[0]-i;
+            break;
+        case FILL_INWARD:
+            hs_start[0] = i%2 ? i/2 : cur_size[0]-i/2;
+            break;
+        case FILL_OUTWARD:
+            k = (cur_size[0] - i) + 1;
+            hs_start[0] = k % 2 ? (k / 2) : (hsize_t)((hssize_t)cur_size[0] - (hssize_t)(k / 2));
+            break;
+        case FILL_RANDOM:
+            for (j=HDrand()%(int)cur_size[0]; had[j]; j=(j+1)%(int)cur_size[0])
+                /*void*/;
+            hs_start[0] = (hsize_t)j;
+            had[j] = 1;
+            break;
+        case FILL_ALL:
+            abort();
+        default:
+            /* unknown request */
+            HDfprintf(stderr, "Unknown fill style\n");
+            goto error;
+            break;
+        }
+
+        /* Write the chunk */
+        if (H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_start, NULL,
+                hs_count, NULL) < 0) goto error;
+        if (H5Dwrite(dset, H5T_NATIVE_INT, mspace, fspace, xfer, &i) < 0) {
+            goto error;
+        }
+
+        /* Determine overhead */
+        if (verbose) {
+            if (H5Fflush(file, H5F_SCOPE_LOCAL) < 0) goto error;
+            if (HDfstat(fd, &sb) < 0) goto error;
+            printf("%4lu %8.3f ***\n",
+                    (unsigned long)i,
+                    (double)(sb.st_size - (HDoff_t)(i * sizeof(int))) / (double)i);
+        }
+    }
+
+    if(had) {
+        free(had);
+        had = NULL;
+    } /* end if */
+
+    H5Dclose(dset);
+    H5Sclose(mspace);
+    H5Sclose(fspace);
+    H5Pclose(dcpl);
+    H5Pclose(xfer);
+    H5Fclose(file);
+
+    if (!verbose) {
+        switch (fill_style) {
+        case FILL_FORWARD:
+            sname = "forward";
+            break;
+        case FILL_REVERSE:
+            sname = "reverse";
+            break;
+        case FILL_INWARD:
+            sname = "inward";
+            break;
+        case FILL_OUTWARD:
+            sname = "outward";
+            break;
+        case FILL_RANDOM:
+            sname = "random";
+            break;
+        case FILL_ALL:
+            abort();
+        default:
+            /* unknown request */
+            HDfprintf(stderr, "Unknown fill style\n");
+            goto error;
+            break;
+        }
+
+        if (HDfstat(fd, &sb) < 0) goto error;
+        printf("%-7s %8.3f\n", sname,
+                (double)(sb.st_size - (HDoff_t)(cur_size[0] * sizeof(int))) /
+                (double)cur_size[0]);
+    }
+    HDclose(fd);
+
+    return 0;
+
+ error:
+    H5Dclose(dset);
+    H5Sclose(mspace);
+    H5Sclose(fspace);
+    H5Pclose(dcpl);
+    H5Pclose(xfer);
+    H5Fclose(file);
+    if(had)
+        free(had);
+    HDclose(fd);
+    return 1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  main
+ *
+ * Purpose:
+ *
+ * Return:  Success:        zero
+ *
+ *    Failure:  non-zero
+ *
+ * Programmer:  Robb Matzke
+ *              Monday, September 28, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    hid_t  xfer;
+    fill_t  fill_style = FILL_ALL;
+    hbool_t  use_cache = FALSE;
+    double  splits[3];
+    int    i, j, nerrors=0;
+
+    /* Default split ratios */
+    H5Eset_auto2(H5E_DEFAULT, display_error_cb, NULL);
+
+    if((xfer = H5Pcreate(H5P_DATASET_XFER)) < 0) goto error;
+    if(H5Pget_btree_ratios(xfer, splits+0, splits+1, splits+2) < 0) goto error;
+    if(H5Pclose(xfer) < 0) goto error;
+
+    /* Parse command-line options */
+    for(i = 1, j = 0; i < argc; i++) {
+        if (!strcmp(argv[i], "forward")) {
+            fill_style = FILL_FORWARD;
+        } else if (!strcmp(argv[i], "reverse")) {
+            fill_style = FILL_REVERSE;
+        } else if (!strcmp(argv[i], "inward")) {
+            fill_style = FILL_INWARD;
+        } else if (!strcmp(argv[i], "outward")) {
+            fill_style = FILL_OUTWARD;
+        } else if (!strcmp(argv[i], "random")) {
+            fill_style = FILL_RANDOM;
+        } else if (!strcmp(argv[i], "cache")) {
+            use_cache = TRUE;
+        } else if (j<3 && (isdigit(argv[i][0]) || '.'==argv[i][0])) {
+            splits[j++] = strtod(argv[i], NULL);
+        } else {
+            usage(argv[0]);
+        }
+    }
+
+    if (FILL_ALL==fill_style) {
+        printf("%-7s %8s\n", "Style", "Bytes/Chunk");
+        printf("%-7s %8s\n", "-----", "-----------");
+        nerrors += test(FILL_FORWARD, splits, FALSE, use_cache);
+        nerrors += test(FILL_REVERSE, splits, FALSE, use_cache);
+        nerrors += test(FILL_INWARD,  splits, FALSE, use_cache);
+        nerrors += test(FILL_OUTWARD, splits, FALSE, use_cache);
+        nerrors += test(FILL_RANDOM,  splits, FALSE, use_cache);
+    } 
+    else {
+        if (use_cache) usage(argv[0]);
+        nerrors += test(fill_style,   splits, TRUE, FALSE);
+    }
+    if (nerrors>0) goto error;
+    cleanup();
+    return 0;
+
+ error:
+    fprintf(stderr, "*** ERRORS DETECTED ***\n");
+    return 1;
+}
diff --git a/tools/test/perform/perf.c b/tools/test/perform/perf.c
new file mode 100644
index 0000000..b421328
--- /dev/null
+++ b/tools/test/perform/perf.c
@@ -0,0 +1,492 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Author: Albert Cheng of NCSA, May 1, 2001.
+ * This is derived from code given to me by Robert Ross.
+ *
+ * NOTE: This code assumes that all command line arguments make it out to all
+ * the processes that make up the parallel job, which isn't always the case.
+ * So if it doesn't work on some platform, that might be why.
+ */
+
+#include "hdf5.h"
+#include "H5private.h"
+
+#ifdef H5_HAVE_PARALLEL
+
+#ifdef H5_STDC_HEADERS
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#ifdef H5_HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#if defined(H5_TIME_WITH_SYS_TIME)
+#   include <sys/time.h>
+#   include <time.h>
+#elif defined(H5_HAVE_SYS_TIME_H)
+#   include <sys/time.h>
+#else
+#   include <time.h>
+#endif
+
+#include <mpi.h>
+#ifndef MPI_FILE_NULL           /*MPIO may be defined in mpi.h already       */
+#   include <mpio.h>
+#endif
+
+/* Macro definitions */
+/* Verify:
+ * if val is false (0), print mesg and if fatal is true (non-zero), die.
+ */
+#define H5FATAL 1
+#define VRFY(val, mesg, fatal) do {                                            \
+    if (!val) {                                                                \
+  	printf("Proc %d: ", mynod);                 \
+        printf("*** Assertion failed (%s) at line %4d in %s\n",                \
+      mesg, (int)__LINE__, __FILE__);                  \
+  	if (fatal){                     \
+      fflush(stdout);                   \
+      goto die_jar_jar_die;                 \
+  	}                       \
+    }                                                                          \
+} while(0)
+#define RANK 1
+#define MAX_PATH 1024
+
+hsize_t dims[RANK];     /* dataset dim sizes */
+hsize_t block[RANK], stride[RANK], count[RANK];
+hssize_t start[RANK];
+hid_t fid;                  /* HDF5 file ID */
+hid_t acc_tpl;    /* File access templates */
+hid_t sid;       /* Dataspace ID */
+hid_t file_dataspace;  /* File dataspace ID */
+hid_t mem_dataspace;  /* memory dataspace ID */
+hid_t dataset;    /* Dataset ID */
+hsize_t opt_alignment  = 1;
+hsize_t opt_threshold  = 1;
+int  opt_split_vfd  = 0;
+char  *meta_ext, *raw_ext;  /* holds the meta and raw file extension if */
+        /* opt_split_vfd is set */
+
+
+/* DEFAULT VALUES FOR OPTIONS */
+int64_t opt_block     = 1048576*16;
+int     opt_iter      = 1;
+int     opt_stripe    = -1;
+int     opt_correct   = 0;
+int     amode         = O_RDWR | O_CREAT;
+char    opt_file[256] = "perftest.out";
+char    opt_pvfstab[256] = "notset";
+int     opt_pvfstab_set = 0;
+
+const char *FILENAME[] = {
+   opt_file,
+   NULL
+};
+
+/* function prototypes */
+static int parse_args(int argc, char **argv);
+
+extern int errno;
+
+/* globals needed for getopt */
+extern char *optarg;
+
+int main(int argc, char **argv)
+{
+    char *buf, *tmp, *buf2, *tmp2, *check;
+    int i, j, mynod=0, nprocs=1, err, my_correct = 1, correct, myerrno;
+    double stim, etim;
+    double write_tim = 0;
+    double read_tim = 0;
+    double read_bw, write_bw;
+    double max_read_tim, max_write_tim;
+    double min_read_tim, min_write_tim;
+    double ave_read_tim, ave_write_tim;
+    int64_t iter_jump = 0;
+    int64_t seek_position = 0;
+    MPI_File fh;
+    MPI_Status status;
+    int nchars;
+    char filename[MAX_PATH];
+    herr_t ret;           /* Generic return value */
+
+    /* startup MPI and determine the rank of this process */
+    MPI_Init(&argc,&argv);
+    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+    MPI_Comm_rank(MPI_COMM_WORLD, &mynod);
+
+    /* parse the command line arguments */
+    parse_args(argc, argv);
+
+    if (mynod == 0) printf("# Using hdf5-io calls.\n");
+
+    /* kindof a weird hack- if the location of the pvfstab file was
+     * specified on the command line, then spit out this location into
+     * the appropriate environment variable: */
+
+#if H5_HAVE_SETENV
+/* no setenv or unsetenv */
+    if (opt_pvfstab_set) {
+            if((setenv("PVFSTAB_FILE", opt_pvfstab, 1)) < 0){
+                    perror("setenv");
+                    goto die_jar_jar_die;
+            }
+    }
+#endif
+
+    /* this is how much of the file data is covered on each iteration of
+     * the test.  used to help determine the seek offset on each
+     * iteration */
+    iter_jump = nprocs * opt_block;
+
+    /* setup a buffer of data to write */
+    if (!(tmp = (char *) malloc(opt_block + 256))) {
+            perror("malloc");
+            goto die_jar_jar_die;
+    }
+    buf = tmp + 128 - (((long)tmp) % 128);  /* align buffer */
+
+    if (opt_correct) {
+            /* do the same buffer setup for verifiable data */
+            if (!(tmp2 = (char *) malloc(opt_block + 256))) {
+                    perror("malloc2");
+                    goto die_jar_jar_die;
+             }
+            buf2 = tmp + 128 - (((long)tmp) % 128);
+    }
+
+    /* setup file access template with parallel IO access. */
+    if (opt_split_vfd){
+  	hid_t mpio_pl;
+
+  	mpio_pl = H5Pcreate (H5P_FILE_ACCESS);
+  	VRFY((acc_tpl >= 0), "", H5FATAL);
+  	ret = H5Pset_fapl_mpio(mpio_pl, MPI_COMM_WORLD, MPI_INFO_NULL);
+  	VRFY((ret >= 0), "", H5FATAL);
+
+  	/* set optional allocation alignment */
+  	if (opt_alignment*opt_threshold != 1){
+      	ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
+      	VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
+  	}
+
+  	/* setup file access template */
+  	acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
+  	VRFY((acc_tpl >= 0), "", H5FATAL);
+  	ret = H5Pset_fapl_split(acc_tpl, meta_ext, mpio_pl, raw_ext, mpio_pl);
+  	VRFY((ret >= 0), "H5Pset_fapl_split succeeded", H5FATAL);
+  	ret = H5Pclose(mpio_pl);
+  	VRFY((ret >= 0), "H5Pclose mpio_pl succeeded", H5FATAL);
+    }else{
+  	/* setup file access template */
+  	acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
+  	VRFY((acc_tpl >= 0), "", H5FATAL);
+  	ret = H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
+  	VRFY((ret >= 0), "", H5FATAL);
+
+  	/* set optional allocation alignment */
+  	if (opt_alignment*opt_threshold != 1){
+  	    ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
+      	VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
+  	}
+    }
+
+    h5_fixname_no_suffix(FILENAME[0], acc_tpl, filename, sizeof filename);
+
+    /* create the parallel file */
+    fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
+    VRFY((fid >= 0), "H5Fcreate succeeded", H5FATAL);
+
+    /* define a contiquous dataset of opt_iter*nprocs*opt_block chars */
+    dims[0] = opt_iter * nprocs * opt_block;
+    sid = H5Screate_simple(RANK, dims, NULL);
+    VRFY((sid >= 0), "H5Screate_simple succeeded", H5FATAL);
+    dataset = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_CHAR, sid,
+      		H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    VRFY((dataset >= 0), "H5Dcreate2 succeeded", H5FATAL);
+
+    /* create the memory dataspace and the file dataspace */
+    dims[0] = opt_block;
+    mem_dataspace = H5Screate_simple(RANK, dims, NULL);
+    VRFY((mem_dataspace >= 0), "", H5FATAL);
+    file_dataspace = H5Dget_space(dataset);
+    VRFY((file_dataspace >= 0), "H5Dget_space succeeded", H5FATAL);
+
+    /* now each process writes a block of opt_block chars in round robbin
+     * fashion until the whole dataset is covered.
+     */
+    for(j=0; j < opt_iter; j++) {
+        /* setup a file dataspace selection */
+        start[0] = (j*iter_jump)+(mynod*opt_block);
+        stride[0] = block[0] = opt_block;
+        count[0]= 1;
+        ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
+        VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
+
+            if (opt_correct) /* fill in buffer for iteration */ {
+                    for (i=mynod+j, check=buf; i<opt_block; i++,check++) *check=(char)i;
+            }
+
+            /* discover the starting time of the operation */
+       MPI_Barrier(MPI_COMM_WORLD);
+       stim = MPI_Wtime();
+
+        /* write data */
+        ret = H5Dwrite(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace,
+                H5P_DEFAULT, buf);
+        VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
+
+            /* discover the ending time of the operation */
+       etim = MPI_Wtime();
+
+       write_tim += (etim - stim);
+
+            /* we are done with this "write" iteration */
+    }
+
+    /* close dataset and file */
+    ret=H5Dclose(dataset);
+    VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
+    ret=H5Fclose(fid);
+    VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
+
+
+
+    /* wait for everyone to synchronize at this point */
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    /* reopen the file for reading */
+    fid=H5Fopen(filename,H5F_ACC_RDONLY,acc_tpl);
+    VRFY((fid >= 0), "", H5FATAL);
+
+    /* open the dataset */
+    dataset = H5Dopen2(fid, "Dataset1", H5P_DEFAULT);
+    VRFY((dataset >= 0), "H5Dopen succeeded", H5FATAL);
+
+    /* we can re-use the same mem_dataspace and file_dataspace
+     * the H5Dwrite used since the dimension size is the same.
+     */
+
+    /* we are going to repeat the read the same pattern the write used */
+    for (j=0; j < opt_iter; j++) {
+        /* setup a file dataspace selection */
+        start[0] = (j*iter_jump)+(mynod*opt_block);
+        stride[0] = block[0] = opt_block;
+        count[0]= 1;
+        ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
+        VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
+            /* seek to the appropriate spot give the current iteration and
+             * rank within the MPI processes */
+
+            /* discover the start time */
+       MPI_Barrier(MPI_COMM_WORLD);
+       stim = MPI_Wtime();
+
+        /* read in the file data */
+        if (!opt_correct){
+            ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf);
+        }
+        else{
+            ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf2);
+        }
+        myerrno = errno;
+
+        /* discover the end time */
+       etim = MPI_Wtime();
+       read_tim += (etim - stim);
+        VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
+
+
+       if (ret < 0) fprintf(stderr, "node %d, read error, loc = %Ld: %s\n",
+                    mynod, mynod*opt_block, strerror(myerrno));
+
+        /* if the user wanted to check correctness, compare the write
+         * buffer to the read buffer */
+        if (opt_correct && memcmp(buf, buf2, opt_block)) {
+                fprintf(stderr, "node %d, correctness test failed\n", mynod);
+                my_correct = 0;
+                MPI_Allreduce(&my_correct, &correct, 1, MPI_INT, MPI_MIN,
+                        MPI_COMM_WORLD);
+        }
+
+        /* we are done with this read iteration */
+    }
+
+    /* close dataset and file */
+    ret=H5Dclose(dataset);
+    VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
+    ret=H5Fclose(fid);
+    VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
+    ret=H5Pclose(acc_tpl);
+    VRFY((ret >= 0), "H5Pclose succeeded", H5FATAL);
+
+    /* compute the read and write times */
+    MPI_Allreduce(&read_tim, &max_read_tim, 1, MPI_DOUBLE, MPI_MAX,
+            MPI_COMM_WORLD);
+    MPI_Allreduce(&read_tim, &min_read_tim, 1, MPI_DOUBLE, MPI_MIN,
+            MPI_COMM_WORLD);
+    MPI_Allreduce(&read_tim, &ave_read_tim, 1, MPI_DOUBLE, MPI_SUM,
+            MPI_COMM_WORLD);
+
+    /* calculate the average from the sum */
+    ave_read_tim = ave_read_tim / nprocs;
+
+    MPI_Allreduce(&write_tim, &max_write_tim, 1, MPI_DOUBLE, MPI_MAX,
+            MPI_COMM_WORLD);
+    MPI_Allreduce(&write_tim, &min_write_tim, 1, MPI_DOUBLE, MPI_MIN,
+            MPI_COMM_WORLD);
+    MPI_Allreduce(&write_tim, &ave_write_tim, 1, MPI_DOUBLE, MPI_SUM,
+            MPI_COMM_WORLD);
+
+    /* calculate the average from the sum */
+    ave_write_tim = ave_write_tim / nprocs;
+
+    /* print out the results on one node */
+    if (mynod == 0) {
+       read_bw = ((int64_t)(opt_block*nprocs*opt_iter))/(max_read_tim*1000000.0);
+       write_bw = ((int64_t)(opt_block*nprocs*opt_iter))/(max_write_tim*1000000.0);
+
+                    printf("nr_procs = %d, nr_iter = %d, blk_sz = %ld\n", nprocs,
+            opt_iter, (long)opt_block);
+
+                    printf("# total_size = %ld\n", (long)(opt_block*nprocs*opt_iter));
+
+                    printf("# Write:  min_time = %f, max_time = %f, mean_time = %f\n",
+                            min_write_tim, max_write_tim, ave_write_tim);
+                    printf("# Read:  min_time = %f, max_time = %f, mean_time = %f\n",
+                            min_read_tim, max_read_tim, ave_read_tim);
+
+       printf("Write bandwidth = %f Mbytes/sec\n", write_bw);
+       printf("Read bandwidth = %f Mbytes/sec\n", read_bw);
+
+            if (opt_correct) {
+                    printf("Correctness test %s.\n", correct ? "passed" : "failed");
+            }
+    }
+
+
+die_jar_jar_die:
+
+#if H5_HAVE_SETENV
+/* no setenv or unsetenv */
+    /* clear the environment variable if it was set earlier */
+    if  (opt_pvfstab_set){
+            unsetenv("PVFSTAB_FILE");
+    }
+#endif
+
+    free(tmp);
+    if (opt_correct) free(tmp2);
+
+    MPI_Finalize();
+
+    return(0);
+}
+
+static int
+parse_args(int argc, char **argv)
+{
+    int c;
+
+    while ((c = getopt(argc, argv, "s:b:i:f:p:a:2:c")) != EOF) {
+        switch (c) {
+            case 's': /* stripe */
+                opt_stripe = atoi(optarg);
+                break;
+            case 'b': /* block size */
+                opt_block = atoi(optarg);
+                break;
+            case 'i': /* iterations */
+                opt_iter = atoi(optarg);
+                break;
+            case 'f': /* filename */
+                strncpy(opt_file, optarg, 255);
+                FILENAME[0] = opt_file;
+                break;
+            case 'p': /* pvfstab file */
+                strncpy(opt_pvfstab, optarg, 255);
+                opt_pvfstab_set = 1;
+                break;
+            case 'a': /* aligned allocation.
+                       * syntax: -a<alignment>/<threshold>
+                       * e.g., -a4096/512  allocate at 4096 bytes
+                       * boundary if request size >= 512.
+                       */
+                {char *p;
+                opt_alignment = atoi(optarg);
+                if (p=(char*)strchr(optarg, '/'))
+                    opt_threshold = atoi(p+1);
+                }
+                HDfprintf(stdout,
+                    "alignment/threshold=%Hu/%Hu\n",
+                     opt_alignment, opt_threshold);
+                break;
+            case '2': /* use 2-files, i.e., split file driver */
+                opt_split_vfd=1;
+                /* get meta and raw file extension. */
+                /* syntax is <raw_ext>,<meta_ext> */
+                meta_ext = raw_ext = optarg;
+                while (*raw_ext != '\0'){
+                    if (*raw_ext == ','){
+                        *raw_ext = '\0';
+                        raw_ext++;
+                        break;
+                    }
+                    raw_ext++;
+                }
+                printf("split-file-vfd used: %s,%s\n",
+                    meta_ext, raw_ext);
+                break;
+            case 'c': /* correctness */
+                opt_correct = 1;
+                break;
+            case '?': /* unknown */
+            default:
+                break;
+        }
+    }
+
+    return(0);
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 3
+ *  c-basic-offset: 3
+ *  tab-width: 3
+ * End:
+ */
+
+#else /* H5_HAVE_PARALLEL */
+/* dummy program since H5_HAVE_PARALLEL is not configured in */
+int
+main(int H5_ATTR_UNUSED argc, char H5_ATTR_UNUSED **argv)
+{
+    printf("No parallel performance because parallel is not configured in\n");
+    return(0);
+}
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/tools/test/perform/perf_meta.c b/tools/test/perform/perf_meta.c
new file mode 100644
index 0000000..c24e598
--- /dev/null
+++ b/tools/test/perform/perf_meta.c
@@ -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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Raymond Lu <slu at ncsa.uiuc.edu>
+ *		Friday, Oct 3, 2004
+ *
+ * Purpose:	Tests performance of metadata
+ */
+
+#include "h5test.h"
+
+#ifdef H5_HAVE_PARALLEL
+#define MAINPROCESS	(!mpi_rank)	/* define process 0 as main process */
+#endif /*H5_HAVE_PARALLEL*/
+
+/* File_Access_type bits */
+#define FACC_DEFAULT	0x0	/* serial as default */
+#define FACC_MPIO	0x1	/* MPIO */
+
+/* Which test to run */
+int RUN_TEST = 0x0;     /* all tests as default */
+int TEST_1   = 0x1;     /* Test 1 */
+int TEST_2   = 0x2;     /* Test 2 */
+int TEST_3   = 0x4;     /* Test 3 */
+
+
+const char *FILENAME[] = {
+    "meta_perf_1",
+    "meta_perf_2",
+    "meta_perf_3",
+    NULL
+};
+
+/* Default values for performance. Can be changed through command line options */
+int 	NUM_DSETS = 16;
+int 	NUM_ATTRS = 8;
+int 	BATCH_ATTRS = 2;
+hbool_t flush_dset = FALSE;
+hbool_t flush_attr = FALSE;
+int 	nerrors = 0;			/* errors count */
+hid_t	fapl;
+
+/* Data space IDs */
+hid_t	space;
+hid_t	small_space;
+
+/* Performance data */
+typedef struct p_time {
+    double total;
+    double avg;
+    double max;
+    double min;
+    double start;
+    char   func[32];
+} p_time;
+
+/*Test file access type for parallel.  MPIO as default */
+int facc_type = FACC_DEFAULT;
+
+double  retrieve_time(void);
+void    perf(p_time *perf_t, double start_t, double end_t);
+void    print_perf(p_time, p_time, p_time);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	parse_options
+ *
+  Purpose:	Parse command line options
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_options(int argc, char **argv)
+{
+    int t;
+
+    /* Use default values */
+    if(argc==1)
+	return(0);
+
+    while (--argc){
+	if (**(++argv) != '-'){
+	    break;
+	}else{
+	    switch(*(*argv+1)){
+                case 'h':   /* Help page */
+                            return(1);
+
+		case 'd':   /* Number of datasets */
+                            NUM_DSETS = atoi((*argv+1)+1);
+			    if (NUM_DSETS < 0){
+				nerrors++;
+				return(1);
+			    }
+			    break;
+
+		case 'a':   /* Number of attributes per dataset */
+                            NUM_ATTRS = atoi((*argv+1)+1);
+			    if (NUM_ATTRS < 0){
+				nerrors++;
+				return(1);
+			    }
+			    break;
+
+		case 'n':   /* Number of attributes to be created in batch */
+                            BATCH_ATTRS = atoi((*argv+1)+1);
+			    if (BATCH_ATTRS < 0){
+				nerrors++;
+				return(1);
+			    }
+			    break;
+
+		case 'm':   /* Use the MPI-IO driver */
+			    facc_type = FACC_MPIO;
+			    break;
+
+                case 'f':   /* Call H5Fflush for each dataset or attribute */
+                            if(!strcmp("a", (*argv+2)))
+                                flush_attr = TRUE;
+                            else if(!strcmp("d", (*argv+2)))
+                                flush_dset = TRUE;
+                            else {
+                                nerrors++;
+                                return(1);
+                            }
+                            break;
+
+		case 't':   /* Which test to run */
+                            t = atoi((*argv+1)+1);
+			    if (t < 1 || t > 3){
+				nerrors++;
+				return(1);
+			    }
+                            if(t == 1)
+                                RUN_TEST |= TEST_1;
+                            else if(t == 2)
+                                RUN_TEST |= TEST_2;
+                            else
+                                RUN_TEST |= TEST_3;
+
+			    break;
+
+ 		default:    nerrors++;
+			    return(1);
+	    }
+	}
+    } /*while*/
+
+    /* Check valid values */
+#ifndef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO)
+    {
+        nerrors++;
+        return(1);
+    }
+#endif /*H5_HAVE_PARALLEL*/
+
+    if(NUM_ATTRS && !BATCH_ATTRS)
+        NUM_ATTRS = 0;
+
+    if(!NUM_ATTRS && BATCH_ATTRS)
+        BATCH_ATTRS = 0;
+
+    if(!NUM_DSETS) {
+        nerrors++;
+        return(1);
+    }
+
+    if(NUM_ATTRS && BATCH_ATTRS) {
+        if(BATCH_ATTRS > NUM_ATTRS || NUM_ATTRS % BATCH_ATTRS) {
+	    nerrors++;
+            return(1);
+        }
+    }
+
+    return(0);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	usage
+ *
+  Purpose:	Prints help page
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(void)
+{
+    printf("Usage: perf_meta [-h] [-m] [-d<num_datasets>]"
+           "[-a<num_attributes>]\n"
+           "\t[-n<batch_attributes>] [-f<option>] [-t<test>]\n");
+    printf("\t-h"
+	"\t\t\thelp page.\n");
+    printf("\t-m"
+	"\t\t\tset MPIO as the file driver when parallel HDF5\n"
+        "\t\t\t\tis enabled.  -m must be specified\n"
+        "\t\t\t\twhen running parallel program.\n");
+    printf("\t-d<num_datasets>"
+	"\tset number of datasets for meta data \n"
+        "\t\t\t\tperformance test\n");
+    printf("\t-a<num_attributes>"
+        "\tset number of attributes per dataset for meta \n"
+        "\t\t\t\tdata performance test.\n");
+    printf("\t-n<batch_attributes>"
+	"\tset batch number of attributes for dataset \n"
+        "\t\t\t\tfor meta data performance test.\n");
+    printf("\t-f<option>"
+	"\t\tflush data to disk after closing a dataset \n"
+        "\t\t\t\tor attribute.  Valid options are \"d\" for \n"
+        "\t\t\t\tdataset, \"a\" for attribute.  Disabled is \n"
+        "\t\t\t\tthe default.\n");
+    printf("\t-t<tests>"
+	"\t\trun specific test.  Give only one number each \n"
+        "\t\t\t\ttime. i.e. \"-t1 -t3\" will run test 1 and 3. \n"
+        "\t\t\t\tDefault is all three tests.  The 3 tests are: \n\n"
+        "\t\t\t\t1. Create <num_attributes> attributes for each \n"
+        "\t\t\t\t   of <num_datasets> existing datasets.\n"
+        "\t\t\t\t2. Create <num_attributes> attributes for each \n"
+        "\t\t\t\t   of <num_datasets> new datasets.\n"
+        "\t\t\t\t3. Create <batch_attributes> attributes for \n"
+        "\t\t\t\t   each of <num_dataset> new datasets for \n"
+        "\t\t\t\t   <num_attributes>/<batch_attributes> times.\n");
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_dspace
+ *
+ * Purpose:	Attempts to create data space.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+create_dspace(void)
+{
+    hsize_t	dims[2];
+    hsize_t	small_dims[2];
+
+    /* Create the data space */
+    dims[0] = 256;
+    dims[1] = 512;
+    if((space = H5Screate_simple(2, dims, NULL)) < 0)
+	    goto error;
+
+    /* Create a small data space for attributes */
+    small_dims[0] = 16;
+    small_dims[1] = 8;
+    if((small_space = H5Screate_simple(2, small_dims, NULL)) < 0)
+	    goto error;
+
+    return 0;
+
+error:
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_dsets
+ *
+ * Purpose:	Attempts to create some datasets.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+create_dsets(hid_t file)
+{
+    hid_t	dataset;
+    char	dset_name[32];
+    int		i;
+
+    /*
+     * Create a dataset using the default dataset creation properties.
+     */
+    for(i = 0; i < NUM_DSETS; i++) {
+	sprintf(dset_name, "dataset %d", i);
+    	if((dataset = H5Dcreate2(file, dset_name, H5T_NATIVE_DOUBLE, space,
+                H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+
+    	if(H5Dclose(dataset) < 0)
+            goto error;
+    } /* end for */
+
+    return 0;
+
+error:
+    return -1;
+
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_attrs_1
+ *
+ * Purpose:	Attempts to create all attributes for each existing dataset.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+create_attrs_1(void)
+{
+    hid_t	file, dataset, attr;
+    char	filename[128];
+    char	dset_name[64];
+    char	attr_name[128];
+    int		i, j;
+    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
+    p_time      open_t  = {0, 0, 0, 1000000, 0, "H5Dopen2"};
+    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
+
+#ifdef H5_HAVE_PARALLEL
+    /* need the rank for printing data */
+    int         mpi_rank;
+    if(facc_type == FACC_MPIO)
+        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+#endif /*H5_HAVE_PARALLEL*/
+
+    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
+	fapl)) < 0)
+	goto error;
+
+    if(create_dsets(file) < 0)
+	goto error;
+
+    /*
+     * Create all(user specifies the number) attributes for each dataset
+     */
+    for(i = 0; i < NUM_DSETS; i++) {
+	sprintf(dset_name, "dataset %d", i);
+        open_t.start = retrieve_time();
+	if((dataset = H5Dopen2(file, dset_name, H5P_DEFAULT)) < 0)
+		goto error;
+	perf(&open_t, open_t.start, retrieve_time());
+
+	for(j = 0; j < NUM_ATTRS; j++) {
+            sprintf(attr_name, "all attrs for each dset %d", j);
+            attr_t.start = retrieve_time();
+            if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
+                    small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                goto error;
+            if(H5Aclose(attr) < 0)
+                goto error;
+            perf(&attr_t, attr_t.start, retrieve_time());
+            if(flush_attr && H5Fflush(file, H5F_SCOPE_LOCAL) < 0)
+                goto error;
+    	} /* end for */
+
+	close_t.start = retrieve_time();
+    	if(H5Dclose(dataset) < 0)
+            goto error;
+	perf(&close_t, close_t.start, retrieve_time());
+        if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
+            goto error;
+    } /* end for */
+
+    if(facc_type == FACC_MPIO) {
+#ifdef H5_HAVE_PARALLEL
+        MPI_Barrier(MPI_COMM_WORLD);
+#endif /*H5_HAVE_PARALLEL*/
+    }
+
+#ifdef H5_HAVE_PARALLEL
+    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS)) /* only process 0 reports */
+#endif /*H5_HAVE_PARALLEL*/
+    {
+        /* Calculate the average time */
+        open_t.avg  = open_t.total / NUM_DSETS;
+        close_t.avg = close_t.total / NUM_DSETS;
+        if(NUM_ATTRS)
+            attr_t.avg  = attr_t.total / (NUM_ATTRS*NUM_DSETS);
+
+        /* Print out the performance result */
+        fprintf(stderr, "1.  Create %d attributes for each of %d existing datasets\n",
+            NUM_ATTRS, NUM_DSETS);
+        print_perf(open_t, close_t, attr_t);
+    }
+
+    if (H5Fclose(file) < 0) goto error;
+
+    return 0;
+
+error:
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_attrs_2
+ *
+ * Purpose:	Attempts to create all attributes for each new dataset.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+create_attrs_2(void)
+{
+    hid_t	file, dataset, attr;
+    char	filename[128];
+    char	dset_name[64];
+    char	attr_name[128];
+    int		i, j;
+    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
+    p_time      create_t  = {0, 0, 0, 1000000, 0, "H5Dcreate2"};
+    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
+
+#ifdef H5_HAVE_PARALLEL
+    /* need the rank for printing data */
+    int         mpi_rank;
+    if(facc_type == FACC_MPIO)
+        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+#endif /*H5_HAVE_PARALLEL*/
+
+    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
+
+    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto error;
+
+    /*
+     * Create all(user specifies the number) attributes for each new dataset
+     */
+    for(i = 0; i < NUM_DSETS; i++) {
+	sprintf(dset_name, "dataset %d", i);
+        create_t.start = retrieve_time();
+   	if((dataset = H5Dcreate2(file, dset_name, H5T_NATIVE_DOUBLE,
+                space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            goto error;
+	perf(&create_t, create_t.start, retrieve_time());
+
+	for(j = 0; j < NUM_ATTRS; j++) {
+            sprintf(attr_name, "all attrs for each dset %d", j);
+            attr_t.start = retrieve_time();
+            if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
+                    small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                goto error;
+            if(H5Aclose(attr) < 0)
+                goto error;
+            perf(&attr_t, attr_t.start, retrieve_time());
+            if(flush_attr && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
+                goto error;
+	} /* end for */
+
+	close_t.start = retrieve_time();
+    	if(H5Dclose(dataset) < 0)
+            goto error;
+	perf(&close_t, close_t.start, retrieve_time());
+        if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
+            goto error;
+    } /* end for */
+
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO)
+        MPI_Barrier(MPI_COMM_WORLD);
+#endif /*H5_HAVE_PARALLEL*/
+
+#ifdef H5_HAVE_PARALLEL
+    /* only process 0 reports if parallel */
+    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
+#endif /*H5_HAVE_PARALLEL*/
+    {
+        /* Calculate the average time */
+        create_t.avg = create_t.total / NUM_DSETS;
+        close_t.avg  = close_t.total / NUM_DSETS;
+        if(NUM_ATTRS)
+            attr_t.avg = attr_t.total / (NUM_ATTRS*NUM_DSETS);
+
+        /* Print out the performance result */
+        fprintf(stderr, "2.  Create %d attributes for each of %d new datasets\n",
+            NUM_ATTRS, NUM_DSETS);
+        print_perf(create_t, close_t, attr_t);
+    }
+
+    if (H5Fclose(file) < 0) goto error;
+
+    return 0;
+
+error:
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_attrs_3
+ *
+ * Purpose:	Attempts to create some attributes for each dataset in a
+ * 		loop.
+ *
+ * Return:	Success:	0
+ *
+ *		Failure:	-1
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+create_attrs_3(void)
+{
+    hid_t	file, dataset, attr;
+    char	filename[128];
+    char	dset_name[64];
+    char	attr_name[128];
+    int		loop_num;
+    int		i, j, k;
+    p_time      attr_t  = {0, 0, 0, 1000000, 0, ""};
+    p_time      open_t  = {0, 0, 0, 1000000, 0, "H5Dopen2"};
+    p_time      close_t = {0, 0, 0, 1000000, 0, ""};
+
+#ifdef H5_HAVE_PARALLEL
+    /* need the rank for printing data */
+    int         mpi_rank;
+    if(facc_type == FACC_MPIO)
+        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+#endif /*H5_HAVE_PARALLEL*/
+
+    h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
+
+    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
+	fapl)) < 0)
+	goto error;
+
+    if(create_dsets(file) < 0)
+	goto error;
+
+    /*
+     * Create some(user specifies the number) attributes for each dataset
+     * in a loop
+     */
+    loop_num = NUM_ATTRS/BATCH_ATTRS;
+
+    for(i = 0; i < loop_num; i++) {
+    	for(j = 0; j < NUM_DSETS; j++) {
+            sprintf(dset_name, "dataset %d", j);
+            open_t.start = retrieve_time();
+            if((dataset = H5Dopen2(file, dset_name, H5P_DEFAULT)) < 0)
+                goto error;
+            perf(&open_t, open_t.start, retrieve_time());
+
+            for(k = 0; k < BATCH_ATTRS; k++) {
+                sprintf(attr_name, "some attrs for each dset %d %d", i, k);
+                attr_t.start = retrieve_time();
+                if((attr = H5Acreate2(dataset, attr_name, H5T_NATIVE_DOUBLE,
+                        small_space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                    goto error;
+                if(H5Aclose(attr) < 0)
+                    goto error;
+                perf(&attr_t, attr_t.start, retrieve_time());
+                if(flush_attr && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
+                    goto error;
+            } /* end for */
+
+            close_t.start = retrieve_time();
+            if(H5Dclose(dataset) < 0)
+                goto error;
+            perf(&close_t, close_t.start, retrieve_time());
+            if(flush_dset && H5Fflush(file,  H5F_SCOPE_LOCAL) < 0)
+                goto error;
+    	} /* end for */
+    } /* end for */
+
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO)
+        MPI_Barrier(MPI_COMM_WORLD);
+#endif /*H5_HAVE_PARALLEL*/
+
+#ifdef H5_HAVE_PARALLEL
+    /* only process 0 reports if parallel */
+    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
+#endif /*H5_HAVE_PARALLEL*/
+    {
+        /* Calculate the average time */
+        open_t.avg = open_t.total / (loop_num*NUM_DSETS);
+        close_t.avg = close_t.total / (loop_num*NUM_DSETS);
+        attr_t.avg = attr_t.total / (NUM_ATTRS*NUM_DSETS);
+
+        /* Print out the performance result */
+        fprintf(stderr, "3.  Create %d attributes for each of %d existing datasets for %d times\n",
+            BATCH_ATTRS, NUM_DSETS, loop_num);
+        print_perf(open_t, close_t, attr_t);
+    }
+
+    if (H5Fclose(file) < 0) goto error;
+
+    return 0;
+
+error:
+    return -1;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	retrieve_time
+ *
+ * Purpose:     Returns time in seconds, in a double number.
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+double retrieve_time(void)
+{
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_DEFAULT) {
+#endif /*H5_HAVE_PARALLEL*/
+        struct timeval t;
+        HDgettimeofday(&t, NULL);
+        return ((double)t.tv_sec + (double)t.tv_usec / 1000000);
+#ifdef H5_HAVE_PARALLEL
+    } else {
+        return MPI_Wtime();
+    }
+#endif /*H5_HAVE_PARALLEL*/
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	perf
+ *
+ * Purpose:	Calculate total time, maximal and minimal time of
+ *              performance.
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void perf(p_time *perf_t, double start_t, double end_t)
+{
+	double t = end_t - start_t;
+
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO) {
+        double reduced_t;
+        double t_max, t_min;
+        int    mpi_size, mpi_rank;
+
+        MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
+        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+        MPI_Barrier(MPI_COMM_WORLD);
+
+        MPI_Reduce(&t, &reduced_t, 1, MPI_DOUBLE, MPI_SUM, 0,
+                MPI_COMM_WORLD);
+        reduced_t /= mpi_size;
+
+        MPI_Reduce(&t, &t_max, 1, MPI_DOUBLE, MPI_MAX, 0,
+                MPI_COMM_WORLD);
+        MPI_Reduce(&t, &t_min, 1, MPI_DOUBLE, MPI_MIN, 0,
+                MPI_COMM_WORLD);
+
+        if (MAINPROCESS) {
+            perf_t->total += reduced_t;
+
+	    if(t_max > perf_t->max)
+		perf_t->max = t_max;
+	    if(t_min < perf_t->min)
+		perf_t->min = t_min;
+        }
+    } else
+#endif /*H5_HAVE_PARALLEL*/
+    {
+	perf_t->total += t;
+
+	if(t > perf_t->max)
+		perf_t->max = t;
+	if(t < perf_t->min)
+		perf_t->min = t;
+    }
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	print_perf
+ *
+ * Purpose:	Print out performance data.
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void print_perf(p_time open_t, p_time close_t, p_time attr_t)
+{
+    fprintf(stderr, "\t%s:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
+		open_t.func, open_t.avg, open_t.max, open_t.min);
+    fprintf(stderr, "\tH5Dclose:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
+		close_t.avg, close_t.max, close_t.min);
+    if(NUM_ATTRS)
+        fprintf(stderr, "\tH5A(create & close):\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n",
+		attr_t.avg, attr_t.max, attr_t.min);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Tests
+ *
+ * Return:	Success:	exit(0)
+ *
+ *		Failure:	exit(1)
+ *
+ * Programmer:	Raymond Lu
+ *		Friday, Oct 3, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char **argv)
+{
+#ifdef H5_HAVE_PARALLEL
+    int mpi_size, mpi_rank;				/* mpi variables */
+#endif /*H5_HAVE_PARALLEL*/
+
+    if(parse_options(argc, argv) != 0) {
+       usage();
+       return 0;
+    }
+
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO) {
+        MPI_Init(&argc, &argv);
+        MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
+        MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+    }
+#endif /*H5_HAVE_PARALLEL*/
+
+#ifdef H5_HAVE_PARALLEL
+    if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS))
+#endif /*H5_HAVE_PARALLEL*/
+        fprintf(stderr, "\t\tPerformance result of metadata for datasets and attributes\n\n");
+
+    fapl = H5Pcreate (H5P_FILE_ACCESS);
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO)
+        H5Pset_fapl_mpio(fapl, MPI_COMM_WORLD, MPI_INFO_NULL);
+#endif /*H5_HAVE_PARALLEL*/
+
+    nerrors += create_dspace() < 0 	?1:0;
+
+    if((RUN_TEST & TEST_1) || !RUN_TEST)
+        nerrors += create_attrs_1() < 0 	?1:0;
+    if((RUN_TEST & TEST_2) || !RUN_TEST)
+        nerrors += create_attrs_2() < 0 	?1:0;
+    if(((RUN_TEST & TEST_3) || !RUN_TEST) && BATCH_ATTRS && NUM_ATTRS)
+        nerrors += create_attrs_3() < 0 	?1:0;
+
+    if (H5Sclose(space) < 0) goto error;
+    if (H5Sclose(small_space) < 0) goto error;
+
+    h5_clean_files(FILENAME, fapl);
+
+#ifdef H5_HAVE_PARALLEL
+    if(facc_type == FACC_MPIO)
+        /* MPI_Finalize must be called AFTER H5close which may use MPI calls */
+        MPI_Finalize();
+#endif /*H5_HAVE_PARALLEL*/
+
+    if (nerrors) goto error;
+#ifdef H5_HAVE_PARALLEL
+    if (facc_type != FACC_DEFAULT && MAINPROCESS)
+#endif /*H5_HAVE_PARALLEL*/
+        printf("All metadata performance tests passed.\n");
+
+    return 0;
+
+ error:
+    nerrors = MAX(1, nerrors);
+#ifdef H5_HAVE_PARALLEL
+    if (facc_type != FACC_DEFAULT && MAINPROCESS)
+#endif /*H5_HAVE_PARALLEL*/
+        printf("***** %d PERFORMANCE TEST%s FAILED! *****\n",
+	   nerrors, 1 == nerrors ? "" : "S");
+
+    return 1;
+}
+
diff --git a/tools/test/perform/pio_engine.c b/tools/test/perform/pio_engine.c
new file mode 100644
index 0000000..1c0d621
--- /dev/null
+++ b/tools/test/perform/pio_engine.c
@@ -0,0 +1,2680 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Author: Albert Cheng of NCSA, Oct 24, 2001.
+ */
+
+#include "hdf5.h"
+
+#ifdef H5_STDC_HEADERS
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#ifdef H5_HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef H5_HAVE_PARALLEL
+
+#include <mpi.h>
+
+#ifndef MPI_FILE_NULL           /*MPIO may be defined in mpi.h already       */
+#   include <mpio.h>
+#endif  /* !MPI_FILE_NULL */
+
+#include "pio_perf.h"
+
+/* Macro definitions */
+
+#if H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 6
+#    define H5DCREATE(fd, name, type, space, dcpl)    H5Dcreate(fd, name, type, space, dcpl)
+#    define H5DOPEN(fd, name)                         H5Dopen(fd, name)
+#else
+#    define H5DCREATE(fd, name, type, space, dcpl)    H5Dcreate2(fd, name, type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)
+#    define H5DOPEN(fd, name)                         H5Dopen2(fd, name, H5P_DEFAULT)
+#endif
+
+/* sizes of various items. these sizes won't change during program execution */
+/* The following three must have the same type */
+#define ELMT_SIZE           (sizeof(unsigned char))     /* we're doing bytes */
+#define ELMT_MPI_TYPE       MPI_BYTE
+#define ELMT_H5_TYPE        H5T_NATIVE_UCHAR
+
+#define GOTOERROR(errcode)  { ret_code = errcode; goto done; }
+#define GOTODONE        { goto done; }
+#define ERRMSG(mesg) {                                                  \
+    fprintf(stderr, "Proc %d: ", pio_mpi_rank_g);                       \
+    fprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n",    \
+        mesg, (int)__LINE__, __FILE__);                             \
+}
+
+#define MSG(mesg) {                                     \
+    fprintf(stderr, "Proc %d: ", pio_mpi_rank_g);       \
+    fprintf(stderr, "(%s) at line %4d in %s\n",         \
+        mesg, (int)__LINE__, __FILE__);             \
+}
+
+/* verify: if val is false (0), print mesg. */
+#define VRFY(val, mesg) do {                            \
+    if (!val) {                                         \
+    ERRMSG(mesg);                                   \
+    GOTOERROR(FAIL);                                \
+    }                                                   \
+} while(0)
+
+
+/* POSIX I/O macros */
+#define POSIXCREATE(fn)           HDopen(fn, O_CREAT|O_TRUNC|O_RDWR, 0600)
+#define POSIXOPEN(fn, F)          HDopen(fn, F, 0600)
+#define POSIXCLOSE(F)             HDclose(F)
+#define POSIXSEEK(F,L)            HDlseek(F, L, SEEK_SET)
+#define POSIXWRITE(F,B,S)         HDwrite(F,B,S)
+#define POSIXREAD(F,B,S)          HDread(F,B,S)
+
+enum {
+    PIO_CREATE = 1,
+    PIO_WRITE = 2,
+    PIO_READ = 4
+};
+
+/* Global variables */
+static int  clean_file_g = -1;  /*whether to cleanup temporary test     */
+/*files. -1 is not defined;             */
+/*0 is no cleanup; 1 is do cleanup      */
+
+/*
+ * In a parallel machine, the filesystem suitable for compiling is
+ * unlikely a parallel file system that is suitable for parallel I/O.
+ * There is no standard pathname for the parallel file system.  /tmp
+ * is about the best guess.
+ */
+#ifndef HDF5_PARAPREFIX
+#    define HDF5_PARAPREFIX     ""
+#endif  /* !HDF5_PARAPREFIX */
+
+#ifndef MIN
+#   define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif  /* !MIN */
+
+/* the different types of file descriptors we can expect */
+typedef union _file_descr {
+    int         posixfd;    /* POSIX file handle*/
+    MPI_File    mpifd;      /* MPI file         */
+    hid_t       h5fd;       /* HDF5 file        */
+} file_descr;
+
+/* local functions */
+static char  *pio_create_filename(iotype iot, const char *base_name,
+    char *fullname, size_t size);
+static herr_t do_write(results *res, file_descr *fd, parameters *parms,
+    long ndsets, off_t nelmts, size_t buf_size, void *buffer);
+static herr_t do_read(results *res, file_descr *fd, parameters *parms,
+    long ndsets, off_t nelmts, size_t buf_size, void *buffer /*out*/);
+static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/,
+    int flags);
+static herr_t do_fclose(iotype iot, file_descr *fd);
+static void do_cleanupfile(iotype iot, char *fname);
+
+/*
+ * Function:        do_pio
+ * Purpose:         PIO Engine where Parallel IO are executed.
+ * Return:          results
+ * Programmer:      Albert Cheng, Bill Wendling 2001/12/12
+ * Modifications:
+ *  Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+    results
+do_pio(parameters param)
+{
+    /* return codes */
+    herr_t      ret_code = 0;   /*return code                           */
+    results     res;
+
+    file_descr  fd;
+    iotype      iot;
+
+    char        fname[FILENAME_MAX];
+    long    nf;
+    long        ndsets;
+    off_t       nbytes;         /*number of bytes per dataset  */
+    off_t   snbytes;    /*general dataset size          */
+                                /*for 1D, it is the actual dataset size */
+                                /*for 2D, it is the size of a side of the dataset square */
+    char        *buffer = NULL; /*data buffer pointer           */
+    size_t      buf_size;       /*general buffer size in bytes     */
+                                /*for 1D, it is the actual buffer size */
+                                /*for 2D, it is the length of the buffer rectangle */
+    size_t      blk_size;       /*data block size in bytes      */
+    size_t  bsize;      /*actual buffer size            */
+
+    /* HDF5 variables */
+    herr_t          hrc;        /*HDF5 return code              */
+
+    /* Sanity check parameters */
+
+    /* IO type */
+    iot = param.io_type;
+
+    switch (iot) {
+        case MPIO:
+            fd.mpifd = MPI_FILE_NULL;
+            res.timers = io_time_new(MPI_CLOCK);
+            break;
+        case POSIXIO:
+            fd.posixfd = -1;
+            res.timers = io_time_new(MPI_CLOCK);
+            break;
+        case PHDF5:
+            fd.h5fd = -1;
+            res.timers = io_time_new(MPI_CLOCK);
+            break;
+        default:
+            /* unknown request */
+            fprintf(stderr, "Unknown IO type request (%d)\n", iot);
+            GOTOERROR(FAIL);
+    }
+
+    ndsets = param.num_dsets;       /* number of datasets per file          */
+    nbytes = param.num_bytes;       /* number of bytes per dataset          */
+    buf_size = param.buf_size;
+    blk_size = param.blk_size;
+
+    if (!param.dim2d){
+        snbytes = nbytes;   /* General dataset size     */
+        bsize = buf_size;   /* Actual buffer size       */
+    }
+    else {
+        snbytes = (off_t)sqrt(nbytes);  /* General dataset size     */
+        bsize = buf_size * blk_size;    /* Actual buffer size       */
+    }
+
+    if (param.num_files < 0 ) {
+    fprintf(stderr,
+        "number of files must be >= 0 (%ld)\n",
+        param.num_files);
+    GOTOERROR(FAIL);
+    }
+
+    if (ndsets < 0 ) {
+    fprintf(stderr,
+        "number of datasets per file must be >= 0 (%ld)\n",
+        ndsets);
+    GOTOERROR(FAIL);
+    }
+
+    if (param.num_procs <= 0 ) {
+    fprintf(stderr,
+        "maximum number of process to use must be > 0 (%d)\n",
+        param.num_procs);
+    GOTOERROR(FAIL);
+    }
+
+    /* Validate transfer buffer size & block size*/
+    if(blk_size<=0) {
+    HDfprintf(stderr,
+        "Transfer block size (%zu) must be > 0\n", blk_size);
+    GOTOERROR(FAIL);
+    }
+    if(buf_size<=0) {
+    HDfprintf(stderr,
+        "Transfer buffer size (%zu) must be > 0\n", buf_size);
+    GOTOERROR(FAIL);
+    }
+    if ((buf_size % blk_size) != 0){
+    HDfprintf(stderr,
+        "Transfer buffer size (%zu) must be a multiple of the "
+        "interleaved I/O block size (%zu)\n",
+        buf_size, blk_size);
+    GOTOERROR(FAIL);
+    }
+    if((snbytes%pio_mpi_nprocs_g)!=0) {
+    HDfprintf(stderr,
+              "Dataset size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
+              "number of processes (%d)\n",
+              (long long)snbytes, pio_mpi_nprocs_g);
+    GOTOERROR(FAIL);
+    }
+
+    if (!param.dim2d){
+        if(((snbytes/pio_mpi_nprocs_g)%buf_size)!=0) {
+        HDfprintf(stderr,
+            "Dataset size/process (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
+            "trasfer buffer size (%zu)\n",
+            (long long)(snbytes/pio_mpi_nprocs_g), buf_size);
+        GOTOERROR(FAIL);
+        }
+    }
+    else {
+        if((snbytes%buf_size)!=0) {
+        HDfprintf(stderr,
+            "Dataset side size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
+            "trasfer buffer size (%zu)\n",
+            (long long)snbytes, buf_size);
+        GOTOERROR(FAIL);
+        }
+    }
+
+    /* Allocate transfer buffer */
+    if ((buffer = malloc(bsize)) == NULL){
+    HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n",
+        bsize);
+    GOTOERROR(FAIL);
+    }
+
+    if (pio_debug_level >= 4) {
+    int myrank;
+
+    MPI_Comm_rank(pio_comm_g, &myrank);
+
+    /* output all of the times for all iterations */
+    if (myrank == 0)
+        fprintf(output, "Timer details:\n");
+    }
+
+    for (nf = 1; nf <= param.num_files; nf++) {
+    /*
+     * Write performance measurement
+     */
+    /* Open file for write */
+    char base_name[256];
+
+    sprintf(base_name, "#pio_tmp_%lu", nf);
+    pio_create_filename(iot, base_name, fname, sizeof(fname));
+    if (pio_debug_level > 0)
+        HDfprintf(output, "rank %d: data filename=%s\n",
+            pio_mpi_rank_g, fname);
+
+    /* Need barrier to make sure everyone starts at the same time */
+    MPI_Barrier(pio_comm_g);
+
+    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
+    hrc = do_fopen(&param, fname, &fd, PIO_CREATE | PIO_WRITE);
+
+    VRFY((hrc == SUCCESS), "do_fopen failed");
+
+    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
+    hrc = do_write(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
+    hrc == SUCCESS;
+    set_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
+
+    VRFY((hrc == SUCCESS), "do_write failed");
+
+    /* Close file for write */
+    hrc = do_fclose(iot, &fd);
+
+    set_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
+    VRFY((hrc == SUCCESS), "do_fclose failed");
+
+    if (!param.h5_write_only) {
+        /*
+         * Read performance measurement
+         */
+        /* Need barrier to make sure everyone is done writing and has
+         * closed the file.  Also to make sure everyone starts reading
+         * at the same time.
+         */
+        MPI_Barrier(pio_comm_g);
+
+        /* Open file for read */
+        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
+        hrc = do_fopen(&param, fname, &fd, PIO_READ);
+
+        VRFY((hrc == SUCCESS), "do_fopen failed");
+
+        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
+        hrc = do_read(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
+        set_time(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
+        VRFY((hrc == SUCCESS), "do_read failed");
+
+        /* Close file for read */
+        hrc = do_fclose(iot, &fd);
+
+        set_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
+        VRFY((hrc == SUCCESS), "do_fclose failed");
+    }
+
+    /* Need barrier to make sure everyone is done with the file */
+    /* before it may be removed by do_cleanupfile */
+    MPI_Barrier(pio_comm_g);
+    do_cleanupfile(iot, fname);
+    }
+
+done:
+    /* clean up */
+    /* release HDF5 objects */
+
+    /* close any opened files */
+    /* no remove(fname) because that should have happened normally. */
+    switch (iot) {
+        case POSIXIO:
+            if (fd.posixfd != -1)
+            hrc = do_fclose(iot, &fd);
+            break;
+        case MPIO:
+            if (fd.mpifd != MPI_FILE_NULL)
+            hrc = do_fclose(iot, &fd);
+            break;
+        case PHDF5:
+            if (fd.h5fd != -1)
+            hrc = do_fclose(iot, &fd);
+            break;
+    }
+
+    /* release generic resources */
+    if(buffer)
+    free(buffer);
+    res.ret_code = ret_code;
+    return res;
+}
+
+/*
+ * Function:    pio_create_filename
+ * Purpose:     Create a new filename to write to. Determine the correct
+ *              suffix to append to the filename by the type of I/O we're
+ *              doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
+ *              USER or LOGIN are specified in the environment.
+ * Return:      Pointer to filename or NULL
+ * Programmer:  Bill Wendling, 21. November 2001
+ * Modifications:
+ */
+    static char *
+pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size)
+{
+    const char *prefix, *suffix = "";
+    char *ptr, last = '\0';
+    size_t i, j;
+
+    if (!base_name || !fullname || size < 1)
+        return NULL;
+
+    HDmemset(fullname, 0, size);
+
+    switch (iot) {
+        case POSIXIO:
+            suffix = ".posix";
+            break;
+        case MPIO:
+            suffix = ".mpio";
+            break;
+        case PHDF5:
+            suffix = ".h5";
+            break;
+    }
+
+    /* First use the environment variable and then try the constant */
+    prefix = HDgetenv("HDF5_PARAPREFIX");
+
+#ifdef HDF5_PARAPREFIX
+    if (!prefix)
+        prefix = HDF5_PARAPREFIX;
+#endif  /* HDF5_PARAPREFIX */
+
+    /* Prepend the prefix value to the base name */
+    if (prefix && *prefix) {
+        /* If the prefix specifies the HDF5_PARAPREFIX directory, then
+         * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
+         * directory instead. */
+        register char *user, *login, *subdir;
+
+        user = HDgetenv("USER");
+        login = HDgetenv("LOGIN");
+        subdir = (user ? user : login);
+
+        if (subdir) {
+            for (i = 0; i < size-1 && prefix[i]; i++)
+                fullname[i] = prefix[i];
+
+            fullname[i++] = '/';
+
+            for (j = 0; i < size && subdir[j]; i++, j++)
+                fullname[i] = subdir[j];
+        }
+        else {
+            /* We didn't append the prefix yet */
+            HDstrncpy(fullname, prefix, size);
+            fullname[size - 1] = '\0';
+        }
+
+        if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
+            /* Append the base_name with a slash first. Multiple slashes are
+             * handled below. */
+            h5_stat_t buf;
+
+            if (HDstat(fullname, &buf) < 0)
+                /* The directory doesn't exist just yet */
+                if (HDmkdir(fullname, (mode_t) 0755) < 0 && errno != EEXIST) {
+                    /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
+                     * Default to PREFIX's original prefix value. */
+                    HDstrcpy(fullname, prefix);
+                }
+
+            HDstrcat(fullname, "/");
+            HDstrcat(fullname, base_name);
+        }
+        else {
+            /* Buffer is too small */
+            return NULL;
+        }
+    }
+    else if (HDstrlen(base_name) >= size) {
+        /* Buffer is too small */
+        return NULL;
+    }
+    else {
+        HDstrcpy(fullname, base_name);
+    }
+
+    /* Append a suffix */
+    if (suffix) {
+        if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
+            return NULL;
+
+        HDstrcat(fullname, suffix);
+    }
+
+    /* Remove any double slashes in the filename */
+    for (ptr = fullname, i = j = 0; ptr && i < size; i++, ptr++) {
+        if (*ptr != '/' || last != '/')
+            fullname[j++] = *ptr;
+
+        last = *ptr;
+    }
+
+    return fullname;
+}
+
+/*
+ * Function:        do_write
+ * Purpose:         Write the required amount of data to the file.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Albert Cheng, Bill Wendling, 2001/12/13
+ * Modifications:
+ *  Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+    static herr_t
+do_write(results *res, file_descr *fd, parameters *parms, long ndsets,
+    off_t nbytes, size_t buf_size, void *buffer)
+{
+    int         ret_code = SUCCESS;
+    int         rc;             /*routine return code                   */
+    long        ndset;
+    size_t      blk_size;       /* The block size to subdivide the xfer buffer into */
+    off_t       nbytes_xfer;    /* Total number of bytes transferred so far */
+    size_t      nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
+    size_t      nbytes_toxfer;  /* Number of bytes to transfer a particular time */
+    char        dname[64];
+    off_t       dset_offset=0;  /*dataset offset in a file              */
+    off_t       bytes_begin[2];    /*first elmt this process transfer      */
+    off_t       bytes_count;    /*number of elmts this process transfer */
+    off_t       snbytes=0;  /*size of a side of the dataset square  */
+    unsigned char *buf_p;       /* Current buffer pointer               */
+
+    /* POSIX variables */
+    off_t       file_offset;    /* File offset of the next transfer     */
+    off_t       file_offset_advance;    /* File offset advance after each I/O operation */
+    off_t       posix_file_offset;    /* Base file offset of the next transfer      */
+
+    /* MPI variables */
+    MPI_Offset  mpi_file_offset;    /* Base file offset of the next transfer*/
+    MPI_Offset  mpi_offset;         /* Offset in MPI file                   */
+    MPI_Offset  mpi_offset_advance; /* Offset advance after each I/O operation */
+    MPI_Datatype mpi_file_type;     /* MPI derived type for 1D file            */
+    MPI_Datatype mpi_blk_type;      /* MPI derived type for 1D buffer          */
+    MPI_Datatype mpi_cont_type;     /* MPI derived type for 2D contiguous file */
+    MPI_Datatype mpi_partial_buffer_cont;       /* MPI derived type for partial 2D contiguous buffer */
+    MPI_Datatype mpi_inter_type;    /* MPI derived type for 2D interleaved file  */
+    MPI_Datatype mpi_partial_buffer_inter;      /* MPI derived type for partial 2D interleaved buffer */
+    MPI_Datatype mpi_full_buffer;       /* MPI derived type for 2D full buffer */
+    MPI_Datatype mpi_full_chunk;        /* MPI derived type for 2D full chunk */
+    MPI_Datatype mpi_chunk_inter_type;  /* MPI derived type for 2D chunk interleaved file */
+    MPI_Datatype mpi_collective_type;   /* Generic MPI derived type for 2D collective access */
+    MPI_Status  mpi_status;
+    int         mrc;                /* MPI return code                      */
+
+    /* HDF5 variables */
+    herr_t      hrc;                    /*HDF5 return code              */
+    hsize_t     h5dims[2];              /*dataset dim sizes             */
+    hid_t       h5dset_space_id = -1;   /*dataset space ID              */
+    hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
+    hid_t       h5ds_id = -1;           /*dataset handle                */
+    hsize_t     h5block[2];     /*dataspace selection           */
+    hsize_t     h5stride[2];
+    hsize_t     h5count[2];
+    hsize_t     h5start[2];
+    hssize_t    h5offset[2];            /* Selection offset within dataspace */
+    hid_t       h5dcpl = -1;            /* Dataset creation property list */
+    hid_t       h5dxpl = -1;            /* Dataset transfer property list */
+
+    /* Get the parameters from the parameter block */
+    blk_size=parms->blk_size;
+
+    /* There are two kinds of transfer patterns, contiguous and interleaved.
+     * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
+     *     where n is rank of the last process.
+     * In contiguous pattern, data are accessed as
+     *    000...111...222...nnn...
+     * In interleaved pattern, data are accessed as
+     *    012...n012...n...
+     * These are all in the scope of one dataset.
+     */
+
+    /* 1D dataspace */
+    if (!parms->dim2d){
+        /* Contiguous Pattern: */
+        if (!parms->interleaved) {
+            bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g);
+        } /* end if */
+        /* Interleaved Pattern: */
+        else {
+            bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g);
+        } /* end else */
+
+        /* Prepare buffer for verifying data */
+        if (parms->verify)
+            memset(buffer,pio_mpi_rank_g+1,buf_size);
+    }/* end if */
+    /* 2D dataspace */
+    else {
+        /* nbytes is always the number of bytes per dataset (1D or 2D). If the
+           dataspace is 2D, snbytes is the size of a side of the dataset square.
+         */
+        snbytes = (off_t)sqrt(nbytes);
+
+        /* Contiguous Pattern: */
+        if (!parms->interleaved) {
+            bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g);
+            bytes_begin[1] = 0;
+        } /* end if */
+        /* Interleaved Pattern: */
+        else {
+            bytes_begin[0] = 0;
+
+            if(!parms->h5_use_chunks || parms->io_type==PHDF5)
+                bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g);
+            else
+                bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g);
+        } /* end else */
+
+        /* Prepare buffer for verifying data */
+        if (parms->verify)
+            memset(buffer,pio_mpi_rank_g+1,buf_size*blk_size);
+    } /* end else */
+
+
+    /* Calculate the total number of bytes (bytes_count) to be
+     * transferred by this process. It may be different for different
+     * transfer pattern due to rounding to integral values.
+     */
+    /*
+     * Calculate the beginning bytes of this process and the next.
+     * bytes_count is the difference between these two beginnings.
+     * This way, it eliminates any rounding errors.
+     * (This is tricky, don't mess with the formula, rounding errors
+     * can easily get introduced) */
+    bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g)
+    - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g);
+
+    /* debug */
+    if (pio_debug_level >= 4) {
+        HDprint_rank(output);
+        if (!parms->dim2d) {
+        HDfprintf(output, "Debug(do_write): "
+            "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
+            buf_size, (long long)bytes_begin[0],
+            (long long)bytes_count);
+        } else {
+        HDfprintf(output, "Debug(do_write): "
+            "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
+            buf_size*blk_size, (long long)bytes_begin[0],
+            (long long)bytes_begin[1], (long long)bytes_count);
+        }
+    }
+
+    /* I/O Access specific setup */
+    switch (parms->io_type) {
+    case POSIXIO:
+        /* No extra setup */
+        break;
+
+    case MPIO: /* MPI-I/O setup */
+        /* 1D dataspace */
+        if (!parms->dim2d){
+            /* Build block's derived type */
+            mrc = MPI_Type_contiguous((int)blk_size,
+                MPI_BYTE, &mpi_blk_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Build file's derived type */
+            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1,
+                (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit file type */
+            mrc = MPI_Type_commit( &mpi_file_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Commit buffer type */
+            mrc = MPI_Type_commit( &mpi_blk_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+        } /* end if */
+        /* 2D dataspace */
+        else {
+            /* Build partial buffer derived type for contiguous access */
+
+            mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE,
+                &mpi_partial_buffer_cont);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit partial buffer derived type */
+            mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build contiguous file's derived type */
+            mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size),
+                mpi_partial_buffer_cont, &mpi_cont_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit contiguous file type */
+            mrc = MPI_Type_commit(&mpi_cont_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build partial buffer derived type for interleaved access */
+            mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE,
+                &mpi_partial_buffer_inter);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit partial buffer derived type */
+            mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build interleaved file's derived type */
+            mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size),
+                mpi_partial_buffer_inter, &mpi_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit interleaved file type */
+            mrc = MPI_Type_commit(&mpi_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build full buffer derived type */
+            mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE,
+                &mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit full buffer derived type */
+            mrc = MPI_Type_commit(&mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build full chunk derived type */
+            mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE,
+                &mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit full chunk derived type */
+            mrc = MPI_Type_commit(&mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build chunk interleaved file's derived type */
+            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size),
+                mpi_full_chunk, &mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit chunk interleaved file type */
+            mrc = MPI_Type_commit(&mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+        } /* end else */
+        break;
+
+    case PHDF5: /* HDF5 setup */
+        /* 1D dataspace */
+        if (!parms->dim2d){
+            if(nbytes>0) {
+                /* define a contiguous dataset of nbytes native bytes */
+                h5dims[0] = nbytes;
+                h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
+                VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+
+                /* Set up the file dset space id to select the pattern to access */
+                if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5start[0] = bytes_begin[0];
+                h5stride[0] = h5block[0] = blk_size;
+                h5count[0] = buf_size/blk_size;
+                } /* end if */
+                else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5start[0] = bytes_begin[0];
+                h5stride[0] = blk_size*pio_mpi_nprocs_g;
+                h5block[0] = blk_size;
+                h5count[0] = buf_size/blk_size;
+                } /* end else */
+                hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                    h5start, h5stride, h5count, h5block);
+                VRFY((hrc >= 0), "H5Sselect_hyperslab");
+            } /* end if */
+            else {
+                h5dset_space_id = H5Screate(H5S_SCALAR);
+                VRFY((h5dset_space_id >= 0), "H5Screate");
+            } /* end else */
+
+            /* Create the memory dataspace that corresponds to the xfer buffer */
+            if(buf_size>0) {
+                h5dims[0] = buf_size;
+                h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
+                VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+            } /* end if */
+            else {
+                h5mem_space_id = H5Screate(H5S_SCALAR);
+                VRFY((h5mem_space_id >= 0), "H5Screate");
+            } /* end else */
+        } /* end if */
+        /* 2D dataspace */
+        else {
+            if(nbytes>0) {
+                /* define a contiguous dataset of nbytes native bytes */
+                h5dims[0] = snbytes;
+                h5dims[1] = snbytes;
+                h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
+                VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+
+                /* Set up the file dset space id to select the pattern to access */
+                if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5start[0] = bytes_begin[0];
+                h5start[1] = bytes_begin[1];
+                h5stride[0] = 1;
+                h5stride[1] = h5block[0] = h5block[1] = blk_size;
+                h5count[0] = 1;
+                h5count[1] = buf_size/blk_size;
+                } /* end if */
+                else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5start[0] = bytes_begin[0];
+                h5start[1] = bytes_begin[1];
+                h5stride[0] = blk_size;
+                h5stride[1] = blk_size*pio_mpi_nprocs_g;
+                h5block[0] = h5block[1] = blk_size;
+                h5count[0] = buf_size/blk_size;
+                h5count[1] = 1;
+                } /* end else */
+                hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                    h5start, h5stride, h5count, h5block);
+                VRFY((hrc >= 0), "H5Sselect_hyperslab");
+            } /* end if */
+            else {
+                h5dset_space_id = H5Screate(H5S_SCALAR);
+                VRFY((h5dset_space_id >= 0), "H5Screate");
+            } /* end else */
+
+            /* Create the memory dataspace that corresponds to the xfer buffer */
+            if(buf_size>0) {
+                if (!parms->interleaved){
+                h5dims[0] = blk_size;
+                h5dims[1] = buf_size;
+                }else{
+                h5dims[0] = buf_size;
+                h5dims[1] = blk_size;
+                }
+                h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
+                VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+            } /* end if */
+            else {
+                h5mem_space_id = H5Screate(H5S_SCALAR);
+                VRFY((h5mem_space_id >= 0), "H5Screate");
+            } /* end else */
+        } /* end else */
+
+        /* Create the dataset transfer property list */
+        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
+        if (h5dxpl < 0) {
+        fprintf(stderr, "HDF5 Property List Create failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        /* Change to collective I/O, if asked */
+        if(parms->collective) {
+            hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
+            if (hrc < 0) {
+                fprintf(stderr, "HDF5 Property List Set failed\n");
+                GOTOERROR(FAIL);
+            } /* end if */
+        } /* end if */
+        break;
+    } /* end switch */
+
+    for (ndset = 1; ndset <= ndsets; ++ndset) {
+
+    /* Calculate dataset offset within a file */
+
+    /* create dataset */
+    switch (parms->io_type) {
+        case POSIXIO:
+        case MPIO:
+            /* both posix and mpi io just need dataset offset in file*/
+            dset_offset = (ndset - 1) * nbytes;
+            break;
+
+        case PHDF5:
+            h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
+            if (h5dcpl < 0) {
+                fprintf(stderr, "HDF5 Property List Create failed\n");
+                GOTOERROR(FAIL);
+            }
+            /* 1D dataspace */
+            if (!parms->dim2d){
+                /* Make the dataset chunked if asked */
+                if(parms->h5_use_chunks) {
+                /* Set the chunk size to be the same as the buffer size */
+                h5dims[0] = blk_size;
+                hrc = H5Pset_chunk(h5dcpl, 1, h5dims);
+                if (hrc < 0) {
+                    fprintf(stderr, "HDF5 Property List Set failed\n");
+                    GOTOERROR(FAIL);
+                } /* end if */
+                } /* end if */
+            }/* end if */
+            else{
+                /* 2D dataspace */
+                if(parms->h5_use_chunks) {
+                /* Set the chunk size to be the same as the block size */
+                h5dims[0] = blk_size;
+                h5dims[1] = blk_size;
+                hrc = H5Pset_chunk(h5dcpl, 2, h5dims);
+                if (hrc < 0) {
+                    fprintf(stderr, "HDF5 Property List Set failed\n");
+                    GOTOERROR(FAIL);
+                } /* end if */
+                } /* end if */
+            }/* end else */
+
+            sprintf(dname, "Dataset_%ld", ndset);
+            h5ds_id = H5DCREATE(fd->h5fd, dname, ELMT_H5_TYPE,
+                h5dset_space_id, h5dcpl);
+
+            if (h5ds_id < 0) {
+                fprintf(stderr, "HDF5 Dataset Create failed\n");
+                GOTOERROR(FAIL);
+            }
+
+            hrc = H5Pclose(h5dcpl);
+            /* verifying the close of the dcpl */
+            if (hrc < 0) {
+                fprintf(stderr, "HDF5 Property List Close failed\n");
+                GOTOERROR(FAIL);
+            }
+            break;
+    }
+
+    /* The task is to transfer bytes_count bytes, starting at
+     * bytes_begin position, using transfer buffer of buf_size bytes.
+     * If interleaved, select buf_size at a time, in round robin
+     * fashion, according to number of process. Otherwise, select
+     * all bytes_count in contiguous.
+     */
+    nbytes_xfer = 0 ;
+
+    /* 1D dataspace */
+    if (!parms->dim2d){
+        /* Set base file offset for all I/O patterns and POSIX access */
+        posix_file_offset = dset_offset + bytes_begin[0];
+
+        /* Set base file offset for all I/O patterns and MPI access */
+        mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
+    } /* end if */
+    else {
+        /* Set base file offset for all I/O patterns and POSIX access */
+        posix_file_offset=dset_offset + bytes_begin[0]*snbytes+
+        bytes_begin[1];
+
+        /* Set base file offset for all I/O patterns and MPI access */
+        mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+
+            bytes_begin[1]);
+    } /* end else */
+
+    /* Start "raw data" write timer */
+    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
+
+    while (nbytes_xfer < bytes_count){
+        /* Write */
+        /* Calculate offset of write within a dataset/file */
+        switch (parms->io_type) {
+        case POSIXIO:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+                /* Contiguous pattern */
+                if (!parms->interleaved) {
+                    /* Compute file offset */
+                    file_offset = posix_file_offset + (off_t)nbytes_xfer;
+
+                    /* only care if seek returns error */
+                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                    VRFY((rc==0), "POSIXSEEK");
+
+                    /* check if all bytes are written */
+                    rc = ((ssize_t)buf_size ==
+                        POSIXWRITE(fd->posixfd, buffer, buf_size));
+                    VRFY((rc != 0), "POSIXWRITE");
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=buf_size;
+                } /* end if */
+                /* Interleaved access pattern */
+                else {
+                    /* Set the base of user's buffer */
+                    buf_p=(unsigned char *)buffer;
+
+                    /* Set the number of bytes to transfer this time */
+                    nbytes_toxfer = buf_size;
+
+                    /* Loop over the buffers to write */
+                    while(nbytes_toxfer>0) {
+                        /* Skip offset over blocks of other processes */
+                        file_offset = posix_file_offset +
+                            (off_t)(nbytes_xfer*pio_mpi_nprocs_g);
+
+                        /* only care if seek returns error */
+                        rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                        VRFY((rc==0), "POSIXSEEK");
+
+                        /* check if all bytes are written */
+                        rc = ((ssize_t)blk_size ==
+                            POSIXWRITE(fd->posixfd, buf_p, blk_size));
+                        VRFY((rc != 0), "POSIXWRITE");
+
+                        /* Advance location in buffer */
+                        buf_p+=blk_size;
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=blk_size;
+
+                        /* Decrement number of bytes left this time */
+                        nbytes_toxfer-=blk_size;
+                    } /* end while */
+                } /* end else */
+            } /* end if */
+            /* 2D dataspace */
+            else {
+                /* Contiguous storage */
+                if (!parms->h5_use_chunks) {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)
+                            /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes));
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = (off_t)snbytes;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size)
+                            *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes)
+                            +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = (off_t)snbytes;
+                    } /* end else */
+                } /* end if */
+                /* Chunked storage */
+                else {
+                    /*Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)nbytes_xfer;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = 0;
+                    } /* end if */
+                    /*Interleaved access pattern */
+                    else {
+                        /* Compute file offset */
+                        /* Before simplification */
+                        /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
+                        *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
+                        *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
+                        *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
+
+                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size)
+                        *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size))
+                        *pio_mpi_nprocs_g)%(snbytes*blk_size));
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
+                        file_offset_advance = (off_t)(snbytes*blk_size);
+                    } /* end else */
+                } /* end else */
+
+                /* Common code for file access */
+
+                /* Set the base of user's buffer */
+                buf_p = (unsigned char *)buffer;
+
+                /* Set the number of bytes to transfer this time */
+                nbytes_toxfer = buf_size*blk_size;
+
+                /* Loop over portions of the buffer to write */
+                while(nbytes_toxfer>0){
+                    /* only care if seek returns error */
+                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                    VRFY((rc==0), "POSIXSEEK");
+
+                    /* check if all bytes are written */
+                    rc = ((ssize_t)nbytes_xfer_advance ==
+                        POSIXWRITE(fd->posixfd, buf_p, nbytes_xfer_advance));
+                    VRFY((rc != 0), "POSIXWRITE");
+
+                    /* Advance location in buffer */
+                    buf_p+=nbytes_xfer_advance;
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=nbytes_xfer_advance;
+
+                    /* Decrement number of bytes left this time */
+                    nbytes_toxfer-=nbytes_xfer_advance;
+
+                    /* Partially advance file offset */
+                    file_offset+=file_offset_advance;
+                } /* end while */
+
+            } /* end else */
+
+            break;
+
+        case MPIO:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+                /* Independent file access */
+                if(!parms->collective) {
+                    /* Contiguous pattern */
+                    if (!parms->interleaved){
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            nbytes_xfer;
+
+                        /* Perform independent write */
+                        mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type,
+                            &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Set the base of user's buffer */
+                        buf_p=(unsigned char *)buffer;
+
+                        /* Set the number of bytes to transfer this time */
+                        nbytes_toxfer = buf_size;
+
+                        /* Loop over the buffers to write */
+                        while(nbytes_toxfer>0) {
+                            /* Skip offset over blocks of other processes */
+                            mpi_offset = mpi_file_offset +
+                            (nbytes_xfer*pio_mpi_nprocs_g);
+
+                            /* Perform independent write */
+                            mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p,
+                                (int)1, mpi_blk_type, &mpi_status);
+                            VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                            /* Advance location in buffer */
+                            buf_p+=blk_size;
+
+                            /* Advance global offset in dataset */
+                            nbytes_xfer+=blk_size;
+
+                            /* Decrement number of bytes left this time */
+                            nbytes_toxfer-=blk_size;
+                        } /* end while */
+                    } /* end else */
+                } /* end if */
+                /* Collective file access */
+                else {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved){
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            nbytes_xfer;
+
+                        /* Perform independent write */
+                        mrc = MPI_File_write_at_all(fd->mpifd, mpi_offset, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            (nbytes_xfer*pio_mpi_nprocs_g);
+
+                        /* Set the file view */
+                        mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type,
+                            mpi_file_type, (char*)"native",  h5_io_info_g);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
+
+                        /* Perform write */
+                        mrc = MPI_File_write_at_all(fd->mpifd, 0, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end else */
+                } /* end else */
+            } /* end if */
+            /* 2D dataspace */
+            else {
+                /* Contiguous storage */
+                if (!parms->h5_use_chunks) {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)*
+                            (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = snbytes;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_cont_type;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)*
+                            (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = snbytes;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_inter_type;
+                    } /* end else */
+                } /* end if */
+                /* Chunked storage */
+                else {
+                    /*Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+nbytes_xfer;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = 0;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_full_buffer;
+                    } /* end if */
+                    /*Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        /* Before simplification */
+                        /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
+                            *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
+                            (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
+                            ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
+                            /blk_size*(blk_size*blk_size)); */
+                        mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size)
+                            *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)
+                            +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
+                        mpi_offset_advance = (MPI_Offset)(snbytes*blk_size);
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_chunk_inter_type;
+                    } /* end else */
+                } /* end else */
+
+                /* Common code for independent file access */
+                if (!parms->collective) {
+                    /* Set the base of user's buffer */
+                    buf_p = (unsigned char *)buffer;
+
+                    /* Set the number of bytes to transfer this time */
+                    nbytes_toxfer = buf_size * blk_size;
+
+                    /* Loop over portions of the buffer to write */
+                    while(nbytes_toxfer>0){
+                        /* Perform independent write */
+                        mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p,
+                            (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                        /* Advance location in buffer */
+                        buf_p+=nbytes_xfer_advance;
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=nbytes_xfer_advance;
+
+                        /* Decrement number of bytes left this time */
+                        nbytes_toxfer-=nbytes_xfer_advance;
+
+                        /* Partially advance global offset in dataset */
+                        mpi_offset+=mpi_offset_advance;
+                    } /* end while */
+                } /* end if */
+
+                /* Common code for collective file access */
+                else {
+                    /* Set the file view */
+                    mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE,
+                        mpi_collective_type, (char *)"native", h5_io_info_g);
+                    VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
+
+                    /* Perform write */
+                    MPI_File_write_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),
+                        MPI_BYTE, &mpi_status);
+                    VRFY((mrc==MPI_SUCCESS), "MPIO_WRITE");
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=buf_size*blk_size;
+                } /* end else */
+
+            } /* end else */
+
+            break;
+
+        case PHDF5:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+            /* Set up the file dset space id to move the selection to process */
+            if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5offset[0] = nbytes_xfer;
+            } /* end if */
+            else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g);
+            } /* end else */
+            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+            VRFY((hrc >= 0), "H5Soffset_simple");
+
+            /* Write the buffer out */
+            hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                h5dset_space_id, h5dxpl, buffer);
+            VRFY((hrc >= 0), "H5Dwrite");
+
+            /* Increment number of bytes transferred */
+            nbytes_xfer += buf_size;
+            } /* end if */
+            /* 2D dataspace */
+            else {
+            /* Set up the file dset space id to move the selection to process */
+            if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size;
+                h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size;
+
+            } /* end if */
+            else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size;
+                h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size;
+
+            } /* end else */
+            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+            VRFY((hrc >= 0), "H5Soffset_simple");
+
+            /* Write the buffer out */
+            hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                h5dset_space_id, h5dxpl, buffer);
+            VRFY((hrc >= 0), "H5Dwrite");
+
+            /* Increment number of bytes transferred */
+            nbytes_xfer += buf_size*blk_size;
+
+            } /* end else */
+
+            break;
+        } /* switch (parms->io_type) */
+    } /* end while */
+
+    /* Stop "raw data" write timer */
+    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
+
+    /* Calculate write time */
+
+    /* Close dataset. Only HDF5 needs to do an explicit close. */
+    if (parms->io_type == PHDF5) {
+        hrc = H5Dclose(h5ds_id);
+
+        if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        h5ds_id = -1;
+    } /* end if */
+    } /* end for */
+
+done:
+    /* release MPI-I/O objects */
+    if (parms->io_type == MPIO) {
+        /* 1D dataspace */
+        if (!parms->dim2d){
+            /* Free file type */
+            mrc = MPI_Type_free( &mpi_file_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free buffer type */
+            mrc = MPI_Type_free( &mpi_blk_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+        } /* end if */
+        /* 2D dataspace */
+        else {
+            /* Free partial buffer type for contiguous access */
+            mrc = MPI_Type_free( &mpi_partial_buffer_cont );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free contiguous file type */
+            mrc = MPI_Type_free( &mpi_cont_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free partial buffer type for interleaved access */
+            mrc = MPI_Type_free( &mpi_partial_buffer_inter );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free interleaved file type */
+            mrc = MPI_Type_free( &mpi_inter_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free full buffer type */
+            mrc = MPI_Type_free(&mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free full chunk type */
+            mrc = MPI_Type_free(&mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free chunk interleaved file type */
+            mrc = MPI_Type_free(&mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+        } /* end else */
+    } /* end if */
+
+    /* release HDF5 objects */
+    if (h5dset_space_id != -1) {
+    hrc = H5Sclose(h5dset_space_id);
+    if (hrc < 0){
+        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dset_space_id = -1;
+    }
+    }
+
+    if (h5mem_space_id != -1) {
+    hrc = H5Sclose(h5mem_space_id);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Memory Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5mem_space_id = -1;
+    }
+    }
+
+    if (h5dxpl != -1) {
+    hrc = H5Pclose(h5dxpl);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dxpl = -1;
+    }
+    }
+
+    return ret_code;
+}
+
+/*
+ * Function:        do_read
+ * Purpose:         read the required amount of data from the file.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Albert Cheng 2001/12/13
+ * Modifications:
+ *  Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+    static herr_t
+do_read(results *res, file_descr *fd, parameters *parms, long ndsets,
+    off_t nbytes, size_t buf_size, void *buffer /*out*/)
+{
+    int         ret_code = SUCCESS;
+    int         rc;             /*routine return code                   */
+    long        ndset;
+    size_t      blk_size;       /* The block size to subdivide the xfer buffer into */
+    size_t      bsize;          /* Size of the actual buffer */
+    off_t       nbytes_xfer;    /* Total number of bytes transferred so far */
+    size_t      nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
+    size_t      nbytes_toxfer;  /* Number of bytes to transfer a particular time */
+    char        dname[64];
+    off_t       dset_offset=0;  /*dataset offset in a file              */
+    off_t       bytes_begin[2];    /*first elmt this process transfer      */
+    off_t       bytes_count;    /*number of elmts this process transfer */
+    off_t       snbytes=0;      /*size of a side of the dataset square */
+    unsigned char *buf_p;       /* Current buffer pointer               */
+
+    /* POSIX variables */
+    off_t       file_offset;    /* File offset of the next transfer    */
+    off_t       file_offset_advance; /* File offset advance after each I/O operation */
+    off_t       posix_file_offset;    /* Base file offset of the next transfer      */
+
+    /* MPI variables */
+    MPI_Offset  mpi_file_offset;/* Base file offset of the next transfer*/
+    MPI_Offset  mpi_offset;     /* Offset in MPI file                   */
+    MPI_Offset  mpi_offset_advance; /* Offset advance after each I/O operation */
+    MPI_Datatype mpi_file_type; /* MPI derived type for 1D file            */
+    MPI_Datatype mpi_blk_type;  /* MPI derived type for 1D buffer          */
+    MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */
+    MPI_Datatype mpi_partial_buffer_cont;       /* MPI derived type for partial 2D contiguous buffer */
+    MPI_Datatype mpi_inter_type;    /* MPI derived type for 2D interleaved file  */
+    MPI_Datatype mpi_partial_buffer_inter;      /* MPI derived type for partial 2D interleaved buffer */
+    MPI_Datatype mpi_full_buffer;       /* MPI derived type for 2D full buffer */
+    MPI_Datatype mpi_full_chunk;        /* MPI derived type for 2D full chunk */
+    MPI_Datatype mpi_chunk_inter_type;  /* MPI derived type for 2D chunk interleaved file */
+    MPI_Datatype mpi_collective_type;   /* Generic MPI derived type for 2D collective access */
+    MPI_Status  mpi_status;
+    int         mrc;            /* MPI return code                      */
+
+    /* HDF5 variables */
+    herr_t      hrc;                    /*HDF5 return code              */
+    hsize_t     h5dims[2];              /*dataset dim sizes             */
+    hid_t       h5dset_space_id = -1;   /*dataset space ID              */
+    hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
+    hid_t       h5ds_id = -1;           /*dataset handle                */
+    hsize_t h5block[2];     /*dataspace selection           */
+    hsize_t h5stride[2];
+    hsize_t h5count[2];
+    hsize_t h5start[2];
+    hssize_t    h5offset[2];            /* Selection offset within dataspace */
+    hid_t       h5dxpl = -1;            /* Dataset transfer property list */
+
+    /* Get the parameters from the parameter block */
+    blk_size=parms->blk_size;
+
+    /* There are two kinds of transfer patterns, contiguous and interleaved.
+     * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
+     *     where n is rank of the last process.
+     * In contiguous pattern, data are accessed as
+     *    000...111...222...nnn...
+     * In interleaved pattern, data are accessed as
+     *    012...n012...n...
+     * These are all in the scope of one dataset.
+     */
+
+    /* 1D dataspace */
+    if (!parms->dim2d){
+        bsize = buf_size;
+        /* Contiguous Pattern: */
+        if (!parms->interleaved) {
+             bytes_begin[0] = (off_t)(((double)nbytes*pio_mpi_rank_g)/pio_mpi_nprocs_g);
+        } /* end if */
+        /* Interleaved Pattern: */
+        else {
+            bytes_begin[0] = (off_t)(blk_size*pio_mpi_rank_g);
+        } /* end else */
+    }/* end if */
+    /* 2D dataspace */
+    else {
+        /* nbytes is always the number of bytes per dataset (1D or 2D). If the
+           dataspace is 2D, snbytes is the size of a side of the 'dataset square'.
+         */
+        snbytes = (off_t)sqrt(nbytes);
+
+        bsize = buf_size * blk_size;
+
+        /* Contiguous Pattern: */
+        if (!parms->interleaved) {
+            bytes_begin[0] = (off_t)((double)snbytes*pio_mpi_rank_g / pio_mpi_nprocs_g);
+            bytes_begin[1] = 0;
+        } /* end if */
+        /* Interleaved Pattern: */
+        else {
+            bytes_begin[0] = 0;
+
+            if (!parms->h5_use_chunks || parms->io_type==PHDF5)
+                bytes_begin[1] = (off_t)(blk_size*pio_mpi_rank_g);
+            else
+                bytes_begin[1] = (off_t)(blk_size*blk_size*pio_mpi_rank_g);
+        } /* end else */
+    } /* end else */
+
+    /* Calculate the total number of bytes (bytes_count) to be
+     * transferred by this process. It may be different for different
+     * transfer pattern due to rounding to integral values.
+     */
+    /*
+     * Calculate the beginning bytes of this process and the next.
+     * bytes_count is the difference between these two beginnings.
+     * This way, it eliminates any rounding errors.
+     * (This is tricky, don't mess with the formula, rounding errors
+     * can easily get introduced) */
+    bytes_count = (off_t)(((double)nbytes*(pio_mpi_rank_g+1)) / pio_mpi_nprocs_g)
+    - (off_t)(((double)nbytes*pio_mpi_rank_g) / pio_mpi_nprocs_g);
+
+    /* debug */
+    if (pio_debug_level >= 4) {
+        HDprint_rank(output);
+        if (!parms->dim2d) {
+        HDfprintf(output, "Debug(do_write): "
+            "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
+            buf_size, (long long)bytes_begin[0],
+            (long long)bytes_count);
+        } else {
+        HDfprintf(output, "Debug(do_write): "
+            "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
+            buf_size*blk_size, (long long)bytes_begin[0],
+            (long long)bytes_begin[1], (long long)bytes_count);
+        }
+    }
+
+    /* I/O Access specific setup */
+    switch (parms->io_type) {
+    case POSIXIO:
+        /* No extra setup */
+        break;
+
+    case MPIO: /* MPI-I/O setup */
+        /* 1D dataspace */
+        if (!parms->dim2d){
+            /* Build block's derived type */
+            mrc = MPI_Type_contiguous((int)blk_size,
+                MPI_BYTE, &mpi_blk_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Build file's derived type */
+            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1,
+                (int)pio_mpi_nprocs_g, mpi_blk_type, &mpi_file_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit file type */
+            mrc = MPI_Type_commit( &mpi_file_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Commit buffer type */
+            mrc = MPI_Type_commit( &mpi_blk_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+        } /* end if */
+        /* 2D dataspace */
+        else {
+            /* Build partial buffer derived type for contiguous access */
+            mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE,
+                &mpi_partial_buffer_cont);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit partial buffer derived type */
+            mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build contiguous file's derived type */
+            mrc = MPI_Type_vector((int)blk_size, (int)1, (int)(snbytes/buf_size),
+                mpi_partial_buffer_cont, &mpi_cont_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit contiguous file type */
+            mrc = MPI_Type_commit(&mpi_cont_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build partial buffer derived type for interleaved access */
+            mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE,
+                &mpi_partial_buffer_inter);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit partial buffer derived type */
+            mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build interleaved file's derived type */
+            mrc = MPI_Type_vector((int)buf_size, (int)1, (int)(snbytes/blk_size),
+                mpi_partial_buffer_inter, &mpi_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit interleaved file type */
+            mrc = MPI_Type_commit(&mpi_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build full buffer derived type */
+            mrc = MPI_Type_contiguous((int)(blk_size*buf_size), MPI_BYTE,
+                &mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit full buffer derived type */
+            mrc = MPI_Type_commit(&mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build full chunk derived type */
+            mrc = MPI_Type_contiguous((int)(blk_size*blk_size), MPI_BYTE,
+                &mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit full chunk derived type */
+            mrc = MPI_Type_commit(&mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+
+            /* Build chunk interleaved file's derived type */
+            mrc = MPI_Type_vector((int)(buf_size/blk_size), (int)1, (int)(snbytes/blk_size),
+                mpi_full_chunk, &mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_CREATE");
+
+            /* Commit chunk interleaved file type */
+            mrc = MPI_Type_commit(&mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_COMMIT");
+        } /* end else */
+        break;
+
+    case PHDF5: /* HDF5 setup */
+        /* 1D dataspace */
+        if (!parms->dim2d){
+        if(nbytes>0) {
+            /* define a contiguous dataset of nbytes native bytes */
+            h5dims[0] = nbytes;
+            h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
+            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+
+            /* Set up the file dset space id to select the pattern to access */
+            if (!parms->interleaved){
+            /* Contiguous pattern */
+            h5start[0] = bytes_begin[0];
+            h5stride[0] = h5block[0] = blk_size;
+            h5count[0] = buf_size/blk_size;
+            } /* end if */
+            else {
+            /* Interleaved access pattern */
+            /* Skip offset over blocks of other processes */
+            h5start[0] = bytes_begin[0];
+            h5stride[0] = blk_size*pio_mpi_nprocs_g;
+            h5block[0] = blk_size;
+            h5count[0] = buf_size/blk_size;
+            } /* end else */
+            hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                h5start, h5stride, h5count, h5block);
+            VRFY((hrc >= 0), "H5Sselect_hyperslab");
+        } /* end if */
+        else {
+            h5dset_space_id = H5Screate(H5S_SCALAR);
+            VRFY((h5dset_space_id >= 0), "H5Screate");
+        } /* end else */
+
+        /* Create the memory dataspace that corresponds to the xfer buffer */
+        if(buf_size>0) {
+            h5dims[0] = buf_size;
+            h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
+            VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+        } /* end if */
+        else {
+            h5mem_space_id = H5Screate(H5S_SCALAR);
+            VRFY((h5mem_space_id >= 0), "H5Screate");
+        } /* end else */
+        } /* end if */
+        /* 2D dataspace */
+        else {
+        if(nbytes>0) {
+            /* define a contiguous dataset of nbytes native bytes */
+            h5dims[0] = snbytes;
+            h5dims[1] = snbytes;
+            h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
+            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+
+            /* Set up the file dset space id to select the pattern to access */
+            if (!parms->interleaved){
+            /* Contiguous pattern */
+            h5start[0] = bytes_begin[0];
+            h5start[1] = bytes_begin[1];
+            h5stride[0] = 1;
+            h5stride[1] = h5block[0] = h5block[1] = blk_size;
+            h5count[0] = 1;
+            h5count[1] = buf_size/blk_size;
+            } /* end if */
+            else {
+            /* Interleaved access pattern */
+            /* Skip offset over blocks of other processes */
+            h5start[0] = bytes_begin[0];
+            h5start[1] = bytes_begin[1];
+            h5stride[0] = blk_size;
+            h5stride[1] = blk_size*pio_mpi_nprocs_g;
+            h5block[0] = h5block[1] = blk_size;
+            h5count[0] = buf_size/blk_size;
+            h5count[1] = 1;
+            } /* end else */
+            hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                h5start, h5stride, h5count, h5block);
+            VRFY((hrc >= 0), "H5Sselect_hyperslab");
+        } /* end if */
+        else {
+            h5dset_space_id = H5Screate(H5S_SCALAR);
+            VRFY((h5dset_space_id >= 0), "H5Screate");
+        } /* end else */
+
+        /* Create the memory dataspace that corresponds to the xfer buffer */
+        if(buf_size>0) {
+            if (!parms->interleaved){
+            h5dims[0] = blk_size;
+            h5dims[1] = buf_size;
+            }else{
+            h5dims[0] = buf_size;
+            h5dims[1] = blk_size;
+            }
+            h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
+            VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+        } /* end if */
+        else {
+            h5mem_space_id = H5Screate(H5S_SCALAR);
+            VRFY((h5mem_space_id >= 0), "H5Screate");
+        } /* end else */
+        } /* end else */
+
+        /* Create the dataset transfer property list */
+        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
+        if (h5dxpl < 0) {
+        fprintf(stderr, "HDF5 Property List Create failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        /* Change to collective I/O, if asked */
+        if(parms->collective) {
+        hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
+        if (hrc < 0) {
+            fprintf(stderr, "HDF5 Property List Set failed\n");
+            GOTOERROR(FAIL);
+        } /* end if */
+        } /* end if */
+        break;
+    } /* end switch */
+
+    for (ndset = 1; ndset <= ndsets; ++ndset) {
+
+    /* Calculate dataset offset within a file */
+
+    /* create dataset */
+    switch (parms->io_type) {
+        case POSIXIO:
+        case MPIO:
+        /* both posix and mpi io just need dataset offset in file*/
+        dset_offset = (ndset - 1) * nbytes;
+        break;
+
+        case PHDF5:
+        sprintf(dname, "Dataset_%ld", ndset);
+        h5ds_id = H5DOPEN(fd->h5fd, dname);
+        if (h5ds_id < 0) {
+            fprintf(stderr, "HDF5 Dataset open failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        break;
+    }
+
+    /* The task is to transfer bytes_count bytes, starting at
+     * bytes_begin position, using transfer buffer of buf_size bytes.
+     * If interleaved, select buf_size at a time, in round robin
+     * fashion, according to number of process. Otherwise, select
+     * all bytes_count in contiguous.
+     */
+    nbytes_xfer = 0 ;
+
+    /* 1D dataspace */
+    if (!parms->dim2d){
+        /* Set base file offset for all I/O patterns and POSIX access */
+        posix_file_offset = dset_offset + bytes_begin[0];
+
+        /* Set base file offset for all I/O patterns and MPI access */
+        mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
+    } /* end if */
+    else {
+        /* Set base file offset for all I/O patterns and POSIX access */
+        posix_file_offset=dset_offset + bytes_begin[0]*snbytes+
+        bytes_begin[1];
+
+        /* Set base file offset for all I/O patterns and MPI access */
+        mpi_file_offset=(MPI_Offset)(dset_offset + bytes_begin[0]*snbytes+
+            bytes_begin[1]);
+    } /* end else */
+
+    /* Start "raw data" read timer */
+    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
+
+    while (nbytes_xfer < bytes_count){
+        /* Read */
+        /* Calculate offset of read within a dataset/file */
+        switch (parms->io_type) {
+        case POSIXIO:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+                /* Contiguous pattern */
+                if (!parms->interleaved) {
+                    /* Compute file offset */
+                    file_offset = posix_file_offset + (off_t)nbytes_xfer;
+
+                    /* only care if seek returns error */
+                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                    VRFY((rc==0), "POSIXSEEK");
+
+                    /* check if all bytes are read */
+                    rc = ((ssize_t)buf_size ==
+                        POSIXREAD(fd->posixfd, buffer, buf_size));
+                    VRFY((rc != 0), "POSIXREAD");
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=buf_size;
+                } /* end if */
+                /* Interleaved access pattern */
+                else {
+                    /* Set the base of user's buffer */
+                    buf_p=(unsigned char *)buffer;
+
+                    /* Set the number of bytes to transfer this time */
+                    nbytes_toxfer = buf_size;
+
+                    /* Loop over the buffers to read */
+                    while(nbytes_toxfer>0) {
+                    /* Skip offset over blocks of other processes */
+                    file_offset = posix_file_offset +
+                        (off_t)(nbytes_xfer*pio_mpi_nprocs_g);
+
+                    /* only care if seek returns error */
+                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                    VRFY((rc==0), "POSIXSEEK");
+
+                    /* check if all bytes are read */
+                    rc = ((ssize_t)blk_size ==
+                        POSIXREAD(fd->posixfd, buf_p, blk_size));
+                    VRFY((rc != 0), "POSIXREAD");
+
+                    /* Advance location in buffer */
+                    buf_p+=blk_size;
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=blk_size;
+
+                    /* Decrement number of bytes left this time */
+                    nbytes_toxfer-=blk_size;
+                    } /* end while */
+                } /* end else */
+            } /* end if */
+            /* 2D dataspace */
+            else {
+                /* Contiguous storage */
+                if (!parms->h5_use_chunks) {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/blk_size)
+                            /snbytes)*(blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes));
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = (off_t)snbytes;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)((((nbytes_xfer/buf_size)
+                            *pio_mpi_nprocs_g)/snbytes)*(buf_size*snbytes)
+                            +((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = (off_t)snbytes;
+                    } /* end else */
+                } /* end if */
+                /* Chunked storage */
+                else {
+                    /*Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute file offset */
+                        file_offset=posix_file_offset+(off_t)nbytes_xfer;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        file_offset_advance = 0;
+                    } /* end if */
+                    /*Interleaved access pattern */
+                    else {
+                        /* Compute file offset */
+                        /* Before simplification */
+                        /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
+                        *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
+                        *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
+                        *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
+
+                        file_offset=posix_file_offset+(off_t)(((nbytes_xfer/(buf_size/blk_size)
+                        *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)+((nbytes_xfer/(buf_size/blk_size))
+                        *pio_mpi_nprocs_g)%(snbytes*blk_size));
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
+                        file_offset_advance = (off_t)(snbytes*blk_size);
+                    } /* end else */
+                } /* end else */
+
+                /* Common code for file access */
+
+                /* Set the base of user's buffer */
+                buf_p = (unsigned char *)buffer;
+
+                /* Set the number of bytes to transfer this time */
+                nbytes_toxfer = buf_size*blk_size;
+
+                /* Loop over portions of the buffer to read */
+                while(nbytes_toxfer>0){
+                    /* only care if seek returns error */
+                    rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
+                    VRFY((rc==0), "POSIXSEEK");
+
+                    /* check if all bytes are read */
+                    rc = ((ssize_t)nbytes_xfer_advance ==
+                        POSIXREAD(fd->posixfd, buf_p, nbytes_xfer_advance));
+                    VRFY((rc != 0), "POSIXREAD");
+
+                    /* Advance location in buffer */
+                    buf_p+=nbytes_xfer_advance;
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=nbytes_xfer_advance;
+
+                    /* Decrement number of bytes left this time */
+                    nbytes_toxfer-=nbytes_xfer_advance;
+
+                    /* Partially advance file offset */
+                    file_offset+=file_offset_advance;
+                } /* end while */
+
+            } /* end else */
+            break;
+
+        case MPIO:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+                /* Independent file access */
+                if(!parms->collective) {
+                    /* Contiguous pattern */
+                    if (!parms->interleaved){
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            nbytes_xfer;
+
+                        /* Perform independent read */
+                        mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type,
+                            &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Set the base of user's buffer */
+                        buf_p=(unsigned char *)buffer;
+
+                        /* Set the number of bytes to transfer this time */
+                        nbytes_toxfer = buf_size;
+
+                        /* Loop over the buffers to read */
+                        while(nbytes_toxfer>0) {
+                            /* Skip offset over blocks of other processes */
+                            mpi_offset = mpi_file_offset +
+                            (nbytes_xfer*pio_mpi_nprocs_g);
+
+                            /* Perform independent read */
+                            mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p,
+                                (int)1, mpi_blk_type, &mpi_status);
+                            VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                            /* Advance location in buffer */
+                            buf_p+=blk_size;
+
+                            /* Advance global offset in dataset */
+                            nbytes_xfer+=blk_size;
+
+                            /* Decrement number of bytes left this time */
+                            nbytes_toxfer-=blk_size;
+                        } /* end while */
+                    } /* end else */
+                } /* end if */
+                /* Collective file access */
+                else {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved){
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            nbytes_xfer;
+
+                        /* Perform collective read */
+                        mrc = MPI_File_read_at_all(fd->mpifd, mpi_offset, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        mpi_offset = mpi_file_offset +
+                            (nbytes_xfer*pio_mpi_nprocs_g);
+
+                        /* Set the file view */
+                        mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type,
+                            mpi_file_type, (char*)"native",  h5_io_info_g);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
+
+                        /* Perform collective read */
+                        mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer,
+                            (int)(buf_size/blk_size), mpi_blk_type, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=buf_size;
+                    } /* end else */
+                } /* end else */
+            } /* end if */
+            /* 2D dataspace */
+            else {
+                /* Contiguous storage */
+                if (!parms->h5_use_chunks) {
+                    /* Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+((nbytes_xfer/blk_size)/snbytes)*
+                            (blk_size*snbytes)+((nbytes_xfer/blk_size)%snbytes);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = snbytes;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_cont_type;
+                    } /* end if */
+                    /* Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+(((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)/snbytes)*
+                            (buf_size*snbytes)+((nbytes_xfer/buf_size)*pio_mpi_nprocs_g)%snbytes;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = snbytes;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_inter_type;
+                    } /* end else */
+                } /* end if */
+                /* Chunked storage */
+                else {
+                    /*Contiguous access pattern */
+                    if (!parms->interleaved) {
+                        /* Compute offset in file */
+                        mpi_offset=mpi_file_offset+nbytes_xfer;
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * buf_size;
+
+                        /* Global offset advance after each I/O operation */
+                        mpi_offset_advance = 0;
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_full_buffer;
+                    } /* end if */
+                    /*Interleaved access pattern */
+                    else {
+                        /* Compute offset in file */
+                        /* Before simplification */
+                        /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
+                            *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
+                            (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
+                            ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
+                            /blk_size*(blk_size*blk_size)); */
+                        mpi_offset=mpi_file_offset+((nbytes_xfer/(buf_size/blk_size)
+                            *pio_mpi_nprocs_g)/(snbytes*blk_size))*(buf_size*snbytes)
+                            +((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes*blk_size);
+
+                        /* Number of bytes to be transferred per I/O operation */
+                        nbytes_xfer_advance = blk_size * blk_size;
+
+                        /* Global offset advance after each I/O operation */
+                        /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
+                        mpi_offset_advance = (MPI_Offset)(snbytes*blk_size);
+
+                        /* MPI type to be used for collective access */
+                        mpi_collective_type = mpi_chunk_inter_type;
+                    } /* end else */
+                } /* end else */
+
+                /* Common code for independent file access */
+                if (!parms->collective) {
+                    /* Set the base of user's buffer */
+                    buf_p = (unsigned char *)buffer;
+
+                    /* Set the number of bytes to transfer this time */
+                    nbytes_toxfer = buf_size * blk_size;
+
+                    /* Loop over portions of the buffer to read */
+                    while(nbytes_toxfer>0){
+                        /* Perform independent read */
+                        mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p,
+                            (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status);
+                        VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                        /* Advance location in buffer */
+                        buf_p+=nbytes_xfer_advance;
+
+                        /* Advance global offset in dataset */
+                        nbytes_xfer+=nbytes_xfer_advance;
+
+                        /* Decrement number of bytes left this time */
+                        nbytes_toxfer-=nbytes_xfer_advance;
+
+                        /* Partially advance global offset in dataset */
+                        mpi_offset+=mpi_offset_advance;
+                    } /* end while */
+                } /* end if */
+
+                /* Common code for collective file access */
+                else {
+                    /* Set the file view */
+                    mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE,
+                        mpi_collective_type, (char *)"native", h5_io_info_g);
+                    VRFY((mrc==MPI_SUCCESS), "MPIO_VIEW");
+
+                    /* Perform read */
+                    MPI_File_read_at_all(fd->mpifd, 0, buffer,(int)(buf_size*blk_size),
+                        MPI_BYTE, &mpi_status);
+                    VRFY((mrc==MPI_SUCCESS), "MPIO_READ");
+
+                    /* Advance global offset in dataset */
+                    nbytes_xfer+=buf_size*blk_size;
+                } /* end else */
+
+            } /* end else */
+            break;
+
+        case PHDF5:
+            /* 1D dataspace */
+            if (!parms->dim2d){
+            /* Set up the file dset space id to move the selection to process */
+            if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5offset[0] = nbytes_xfer;
+            } /* end if */
+            else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5offset[0] = (nbytes_xfer*pio_mpi_nprocs_g);
+            } /* end else */
+            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+            VRFY((hrc >= 0), "H5Soffset_simple");
+
+            /* Read the buffer in */
+            hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                h5dset_space_id, h5dxpl, buffer);
+            VRFY((hrc >= 0), "H5Dread");
+
+            /* Increment number of bytes transferred */
+            nbytes_xfer += buf_size;
+            } /* end if */
+            /* 2D dataspace */
+            else {
+            /* Set up the file dset space id to move the selection to process */
+            if (!parms->interleaved){
+                /* Contiguous pattern */
+                h5offset[0] = (nbytes_xfer/(snbytes*blk_size))*blk_size;
+                h5offset[1] = (nbytes_xfer%(snbytes*blk_size))/blk_size;
+            } /* end if */
+            else {
+                /* Interleaved access pattern */
+                /* Skip offset over blocks of other processes */
+                h5offset[0] = ((nbytes_xfer*pio_mpi_nprocs_g)/(snbytes*buf_size))*buf_size;
+                h5offset[1] = ((nbytes_xfer*pio_mpi_nprocs_g)%(snbytes*buf_size))/buf_size;
+
+            } /* end else */
+            hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+            VRFY((hrc >= 0), "H5Soffset_simple");
+
+            /* Write the buffer out */
+            hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                h5dset_space_id, h5dxpl, buffer);
+            VRFY((hrc >= 0), "H5Dread");
+
+            /* Increment number of bytes transferred */
+            nbytes_xfer += buf_size*blk_size;
+
+            } /* end else */
+            break;
+        } /* switch (parms->io_type) */
+
+        /* Verify raw data, if asked */
+        if (parms->verify) {
+        /* Verify data read */
+        unsigned char *ucharptr = (unsigned char *)buffer;
+        size_t i;
+        int nerror=0;
+
+        for (i = 0; i < bsize; ++i){
+            if (*ucharptr++ != pio_mpi_rank_g+1) {
+            if (++nerror < 20){
+                /* report at most 20 errors */
+                HDprint_rank(output);
+                HDfprintf(output, "read data error, expected (%d), "
+                    "got (%d)\n",
+                    pio_mpi_rank_g+1,
+                    (int)*(ucharptr-1));
+            } /* end if */
+            } /* end if */
+        } /* end for */
+        if (nerror >= 20) {
+            HDprint_rank(output);
+            HDfprintf(output, "...");
+            HDfprintf(output, "total read data errors=%d\n",
+                nerror);
+        } /* end if */
+        }   /* if (parms->verify) */
+
+    } /* end while */
+
+    /* Stop "raw data" read timer */
+    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
+
+    /* Calculate read time */
+
+    /* Close dataset. Only HDF5 needs to do an explicit close. */
+    if (parms->io_type == PHDF5) {
+        hrc = H5Dclose(h5ds_id);
+
+        if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        h5ds_id = -1;
+    } /* end if */
+    } /* end for */
+
+done:
+    /* release MPI-I/O objects */
+    if (parms->io_type == MPIO) {
+        /* 1D dataspace */
+        if (!parms->dim2d){
+            /* Free file type */
+            mrc = MPI_Type_free( &mpi_file_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free buffer type */
+            mrc = MPI_Type_free( &mpi_blk_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+        } /* end if */
+        /* 2D dataspace */
+        else {
+            /* Free partial buffer type for contiguous access */
+            mrc = MPI_Type_free( &mpi_partial_buffer_cont );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free contiguous file type */
+            mrc = MPI_Type_free( &mpi_cont_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free partial buffer type for interleaved access */
+            mrc = MPI_Type_free( &mpi_partial_buffer_inter );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free interleaved file type */
+            mrc = MPI_Type_free( &mpi_inter_type );
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free full buffer type */
+            mrc = MPI_Type_free(&mpi_full_buffer);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free full chunk type */
+            mrc = MPI_Type_free(&mpi_full_chunk);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+
+            /* Free chunk interleaved file type */
+            mrc = MPI_Type_free(&mpi_chunk_inter_type);
+            VRFY((mrc==MPI_SUCCESS), "MPIO_TYPE_FREE");
+        } /* end else */
+    } /* end if */
+
+    /* release HDF5 objects */
+    if (h5dset_space_id != -1) {
+    hrc = H5Sclose(h5dset_space_id);
+    if (hrc < 0){
+        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dset_space_id = -1;
+    }
+    }
+
+    if (h5mem_space_id != -1) {
+    hrc = H5Sclose(h5mem_space_id);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Memory Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5mem_space_id = -1;
+    }
+    }
+
+    if (h5dxpl != -1) {
+    hrc = H5Pclose(h5dxpl);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dxpl = -1;
+    }
+    }
+
+    return ret_code;
+}
+
+/*
+ * Function:    do_fopen
+ * Purpose:     Open the specified file.
+ * Return:      SUCCESS or FAIL
+ * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
+ * Modifications:
+ */
+    static herr_t
+do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
+{
+    int ret_code = SUCCESS, mrc;
+    hid_t acc_tpl = -1;         /* file access templates */
+
+    switch (param->io_type) {
+        case POSIXIO:
+            if (flags & (PIO_CREATE | PIO_WRITE))
+                fd->posixfd = POSIXCREATE(fname);
+            else
+                fd->posixfd = POSIXOPEN(fname, O_RDONLY);
+
+            if (fd->posixfd < 0 ) {
+                fprintf(stderr, "POSIX File Open failed(%s)\n", fname);
+                GOTOERROR(FAIL);
+            }
+
+
+            /* The perils of POSIX I/O in a parallel environment. The problem is:
+             *
+             *      - Process n opens a file with truncation and then starts
+             *        writing to the file.
+             *      - Process m also opens the file with truncation, but after
+             *        process n has already started to write to the file. Thus,
+             *        all of the stuff process n wrote is now lost.
+             */
+            MPI_Barrier(pio_comm_g);
+
+            break;
+
+        case MPIO:
+            if (flags & (PIO_CREATE | PIO_WRITE)) {
+                MPI_File_delete(fname, h5_io_info_g);
+                mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_CREATE | MPI_MODE_RDWR,
+                    h5_io_info_g, &fd->mpifd);
+
+                if (mrc != MPI_SUCCESS) {
+                    fprintf(stderr, "MPI File Open failed(%s)\n", fname);
+                    GOTOERROR(FAIL);
+                }
+
+                /*since MPI_File_open with MPI_MODE_CREATE does not truncate  */
+                /*filesize , set size to 0 explicitedly.    */
+                mrc = MPI_File_set_size(fd->mpifd, (MPI_Offset)0);
+                if (mrc != MPI_SUCCESS) {
+                    fprintf(stderr, "MPI_File_set_size failed\n");
+                    GOTOERROR(FAIL);
+                }
+            } else {
+                mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_RDONLY, h5_io_info_g, &fd->mpifd);
+                if (mrc != MPI_SUCCESS) {
+                    fprintf(stderr, "MPI File Open failed(%s)\n", fname);
+                    GOTOERROR(FAIL);
+                }
+            }
+
+            break;
+
+        case PHDF5:
+            if ((acc_tpl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+                fprintf(stderr, "HDF5 Property List Create failed\n");
+                GOTOERROR(FAIL);
+            }
+
+            /* Set the file driver to the MPI-IO driver */
+            if (H5Pset_fapl_mpio(acc_tpl, pio_comm_g, h5_io_info_g) < 0) {
+                fprintf(stderr, "HDF5 Property List Set failed\n");
+                GOTOERROR(FAIL);
+            }
+
+            /* Set the alignment of objects in HDF5 file */
+            if (H5Pset_alignment(acc_tpl, param->h5_thresh, param->h5_align) < 0) {
+                fprintf(stderr, "HDF5 Property List Set failed\n");
+                GOTOERROR(FAIL);
+            }
+
+            /* create the parallel file */
+            if (flags & (PIO_CREATE | PIO_WRITE))
+                fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
+            else
+                fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, acc_tpl);
+            if (fd->h5fd < 0) {
+                fprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
+                GOTOERROR(FAIL);
+            }
+
+            /* verifying the close of the acc_tpl */
+            if (H5Pclose(acc_tpl) < 0) {
+                fprintf(stderr, "HDF5 Property List Close failed\n");
+                GOTOERROR(FAIL);
+            }
+
+            break;
+    }
+
+done:
+    return ret_code;
+}
+
+/*
+ * Function:    do_fclose
+ * Purpose:     Close the specified file descriptor.
+ * Return:      SUCCESS or FAIL
+ * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
+ * Modifications:
+ */
+    static herr_t
+do_fclose(iotype iot, file_descr *fd /*out*/)
+{
+    herr_t ret_code = SUCCESS, hrc;
+    int mrc = 0, rc = 0;
+
+    switch (iot) {
+    case POSIXIO:
+        rc = POSIXCLOSE(fd->posixfd);
+
+        if (rc != 0){
+        fprintf(stderr, "POSIX File Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        fd->posixfd = -1;
+        break;
+
+    case MPIO:
+        mrc = MPI_File_close(&fd->mpifd);
+
+        if (mrc != MPI_SUCCESS){
+        fprintf(stderr, "MPI File close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        fd->mpifd = MPI_FILE_NULL;
+        break;
+
+    case PHDF5:
+        hrc = H5Fclose(fd->h5fd);
+
+        if (hrc < 0) {
+        fprintf(stderr, "HDF5 File Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        fd->h5fd = -1;
+        break;
+    }
+
+done:
+    return ret_code;
+}
+
+
+/*
+ * Function:    do_fclose
+ * Purpose:     Cleanup temporary file unless HDF5_NOCLEANUP is set.
+ *      Only Proc 0 of the PIO communicator will do the cleanup.
+ *      Other processes just return.
+ * Return:      void
+ * Programmer:  Albert Cheng 2001/12/12
+ * Modifications:
+ */
+    static void
+do_cleanupfile(iotype iot, char *fname)
+{
+    if (pio_mpi_rank_g != 0)
+    return;
+
+    if (clean_file_g == -1)
+    clean_file_g = (getenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0;
+
+    if (clean_file_g){
+    switch (iot){
+        case POSIXIO:
+        remove(fname);
+        break;
+        case MPIO:
+        case PHDF5:
+        MPI_File_delete(fname, h5_io_info_g);
+        break;
+    }
+    }
+}
+
+#ifdef TIME_MPI
+/* instrument the MPI_File_wrirte_xxx and read_xxx calls to measure
+ * pure time spent in MPI_File code.
+ */
+int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf,
+    int count, MPI_Datatype datatype, MPI_Status *status)
+{
+    int err;
+    set_time(timer_g, HDF5_MPI_READ, TSTART);
+    err=PMPI_File_read_at(fh, offset, buf, count, datatype, status);
+    set_time(timer_g, HDF5_MPI_READ, TSTOP);
+    return err;
+}
+
+
+int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf,
+    int count, MPI_Datatype datatype, MPI_Status *status)
+{
+    int err;
+    set_time(timer_g, HDF5_MPI_READ, TSTART);
+    err=PMPI_File_read_at_all(fh, offset, buf, count, datatype, status);
+    set_time(timer_g, HDF5_MPI_READ, TSTOP);
+    return err;
+}
+
+int MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf,
+    int count, MPI_Datatype datatype, MPI_Status *status)
+{
+    int err;
+    set_time(timer_g, HDF5_MPI_WRITE, TSTART);
+    err=PMPI_File_write_at(fh, offset, buf, count, datatype, status);
+    set_time(timer_g, HDF5_MPI_WRITE, TSTOP);
+    return err;
+}
+
+int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf,
+    int count, MPI_Datatype datatype, MPI_Status *status)
+{
+    int err;
+    set_time(timer_g, HDF5_MPI_WRITE, TSTART);
+    err=PMPI_File_write_at_all(fh, offset, buf, count, datatype, status);
+    set_time(timer_g, HDF5_MPI_WRITE, TSTOP);
+    return err;
+}
+
+#endif  /* TIME_MPI */
+#endif /* H5_HAVE_PARALLEL */
+
+
+
+
+
diff --git a/tools/test/perform/pio_perf.c b/tools/test/perform/pio_perf.c
new file mode 100644
index 0000000..597629e
--- /dev/null
+++ b/tools/test/perform/pio_perf.c
@@ -0,0 +1,1692 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Parallel HDF5 Performance Testing Code
+ * --------------------------------------
+ *
+ * Portable code to test performance on the different platforms we support.
+ * This is what the report should look like:
+ *
+ *  nprocs = Max#Procs
+ *      IO API = POSIXIO
+ *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *
+ *          . . .
+ *
+ *      IO API = MPIO
+ *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *
+ *          . . .
+ *
+ *      IO API = PHDF5
+ *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *
+ *          . . .
+ *
+ *  nprocs = Max#Procs / 2
+ *
+ *      . . .
+ *
+ */
+
+/* system header files */
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "hdf5.h"
+
+#ifdef H5_HAVE_PARALLEL
+
+/* library header files */
+#include <mpi.h>
+
+/* our header files */
+#include "pio_perf.h"
+
+/* useful macros */
+#define TAB_SPACE           4
+
+#define ONE_KB              1024
+#define ONE_MB              (ONE_KB * ONE_KB)
+#define ONE_GB              (ONE_MB * ONE_KB)
+
+#define PIO_POSIX           0x1
+#define PIO_MPI             0x2
+#define PIO_HDF5            0x4
+
+/* report 0.0 in case t is zero too */
+#define MB_PER_SEC(bytes,t) (((t)==0.0) ? 0.0 : ((((double)bytes) / ONE_MB) / (t)))
+
+#ifndef TRUE
+#define TRUE    1
+#endif  /* TRUE */
+#ifndef FALSE
+#define FALSE   (!TRUE)
+#endif  /* FALSE */
+
+/* global variables */
+FILE       *output;             /* output file                          */
+int         comm_world_rank_g;  /* my rank in MPI_COMM_RANK             */
+int         comm_world_nprocs_g;/* num. of processes of MPI_COMM_WORLD  */
+MPI_Comm    pio_comm_g;         /* Communicator to run the PIO          */
+int         pio_mpi_rank_g;     /* MPI rank of pio_comm_g               */
+int         pio_mpi_nprocs_g;   /* Number of processes of pio_comm_g    */
+int         pio_debug_level = 0;/* The debug level:
+                                 *   0 - Off
+                                 *   1 - Minimal
+                                 *   2 - Some more
+                                 *   3 - Maximal
+                                 *   4 - Maximal & then some
+                                 */
+
+/* local variables */
+static const char  *progname = "h5perf";
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters. The long-named ones can be partially spelled. When
+ * adding more, make sure that they don't clash with each other.
+ */
+#if 1
+static const char *s_opts = "a:A:B:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
+#else
+static const char *s_opts = "a:A:bB:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
+#endif  /* 1 */
+static struct long_options l_opts[] = {
+    { "align", require_arg, 'a' },
+    { "alig", require_arg, 'a' },
+    { "ali", require_arg, 'a' },
+    { "al", require_arg, 'a' },
+    { "api", require_arg, 'A' },
+    { "ap", require_arg, 'A' },
+#if 0
+    /* a sighting of the elusive binary option */
+    { "binary", no_arg, 'b' },
+    { "binar", no_arg, 'b' },
+    { "bina", no_arg, 'b' },
+    { "bin", no_arg, 'b' },
+    { "bi", no_arg, 'b' },
+#endif  /* 0 */
+    { "block-size", require_arg, 'B' },
+    { "block-siz", require_arg, 'B' },
+    { "block-si", require_arg, 'B' },
+    { "block-s", require_arg, 'B' },
+    { "block-", require_arg, 'B' },
+    { "block", require_arg, 'B' },
+    { "bloc", require_arg, 'B' },
+    { "blo", require_arg, 'B' },
+    { "bl", require_arg, 'B' },
+    { "chunk", no_arg, 'c' },
+    { "chun", no_arg, 'c' },
+    { "chu", no_arg, 'c' },
+    { "ch", no_arg, 'c' },
+    { "collective", no_arg, 'C' },
+    { "collectiv", no_arg, 'C' },
+    { "collecti", no_arg, 'C' },
+    { "collect", no_arg, 'C' },
+    { "collec", no_arg, 'C' },
+    { "colle", no_arg, 'C' },
+    { "coll", no_arg, 'C' },
+    { "col", no_arg, 'C' },
+    { "co", no_arg, 'C' },
+    { "debug", require_arg, 'D' },
+    { "debu", require_arg, 'D' },
+    { "deb", require_arg, 'D' },
+    { "de", require_arg, 'D' },
+    { "geometry", no_arg, 'g' },
+    { "geometr", no_arg, 'g' },
+    { "geomet", no_arg, 'g' },
+    { "geome", no_arg, 'g' },
+    { "geom", no_arg, 'g' },
+    { "geo", no_arg, 'g' },
+    { "ge", no_arg, 'g' },
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    { "he", no_arg, 'h' },
+    { "interleaved", require_arg, 'I' },
+    { "interleave", require_arg, 'I' },
+    { "interleav", require_arg, 'I' },
+    { "interlea", require_arg, 'I' },
+    { "interle", require_arg, 'I' },
+    { "interl", require_arg, 'I' },
+    { "inter", require_arg, 'I' },
+    { "inte", require_arg, 'I' },
+    { "int", require_arg, 'I' },
+    { "in", require_arg, 'I' },
+    { "max-num-processes", require_arg, 'P' },
+    { "max-num-processe", require_arg, 'P' },
+    { "max-num-process", require_arg, 'P' },
+    { "max-num-proces", require_arg, 'P' },
+    { "max-num-proce", require_arg, 'P' },
+    { "max-num-proc", require_arg, 'P' },
+    { "max-num-pro", require_arg, 'P' },
+    { "max-num-pr", require_arg, 'P' },
+    { "max-num-p", require_arg, 'P' },
+    { "min-num-processes", require_arg, 'p' },
+    { "min-num-processe", require_arg, 'p' },
+    { "min-num-process", require_arg, 'p' },
+    { "min-num-proces", require_arg, 'p' },
+    { "min-num-proce", require_arg, 'p' },
+    { "min-num-proc", require_arg, 'p' },
+    { "min-num-pro", require_arg, 'p' },
+    { "min-num-pr", require_arg, 'p' },
+    { "min-num-p", require_arg, 'p' },
+    { "max-xfer-size", require_arg, 'X' },
+    { "max-xfer-siz", require_arg, 'X' },
+    { "max-xfer-si", require_arg, 'X' },
+    { "max-xfer-s", require_arg, 'X' },
+    { "max-xfer", require_arg, 'X' },
+    { "max-xfe", require_arg, 'X' },
+    { "max-xf", require_arg, 'X' },
+    { "max-x", require_arg, 'X' },
+    { "min-xfer-size", require_arg, 'x' },
+    { "min-xfer-siz", require_arg, 'x' },
+    { "min-xfer-si", require_arg, 'x' },
+    { "min-xfer-s", require_arg, 'x' },
+    { "min-xfer", require_arg, 'x' },
+    { "min-xfe", require_arg, 'x' },
+    { "min-xf", require_arg, 'x' },
+    { "min-x", require_arg, 'x' },
+    { "num-bytes", require_arg, 'e' },
+    { "num-byte", require_arg, 'e' },
+    { "num-byt", require_arg, 'e' },
+    { "num-by", require_arg, 'e' },
+    { "num-b", require_arg, 'e' },
+    { "num-dsets", require_arg, 'd' },
+    { "num-dset", require_arg, 'd' },
+    { "num-dse", require_arg, 'd' },
+    { "num-ds", require_arg, 'd' },
+    { "num-d", require_arg, 'd' },
+    { "num-files", require_arg, 'F' },
+    { "num-file", require_arg, 'F' },
+    { "num-fil", require_arg, 'F' },
+    { "num-fi", require_arg, 'F' },
+    { "num-f", require_arg, 'F' },
+    { "num-iterations", require_arg, 'i' },
+    { "num-iteration", require_arg, 'i' },
+    { "num-iteratio", require_arg, 'i' },
+    { "num-iterati", require_arg, 'i' },
+    { "num-iterat", require_arg, 'i' },
+    { "num-itera", require_arg, 'i' },
+    { "num-iter", require_arg, 'i' },
+    { "num-ite", require_arg, 'i' },
+    { "num-it", require_arg, 'i' },
+    { "num-i", require_arg, 'i' },
+    { "output", require_arg, 'o' },
+    { "outpu", require_arg, 'o' },
+    { "outp", require_arg, 'o' },
+    { "out", require_arg, 'o' },
+    { "ou", require_arg, 'o' },
+    { "threshold", require_arg, 'T' },
+    { "threshol", require_arg, 'T' },
+    { "thresho", require_arg, 'T' },
+    { "thresh", require_arg, 'T' },
+    { "thres", require_arg, 'T' },
+    { "thre", require_arg, 'T' },
+    { "thr", require_arg, 'T' },
+    { "th", require_arg, 'T' },
+    { "write-only", require_arg, 'w' },
+    { "write-onl", require_arg, 'w' },
+    { "write-on", require_arg, 'w' },
+    { "write-o", require_arg, 'w' },
+    { "write", require_arg, 'w' },
+    { "writ", require_arg, 'w' },
+    { "wri", require_arg, 'w' },
+    { "wr", require_arg, 'w' },
+    { NULL, 0, '\0' }
+};
+
+struct options {
+    long io_types;              /* bitmask of which I/O types to test   */
+    const char *output_file;    /* file to print report to              */
+    long num_dsets;             /* number of datasets                   */
+    long num_files;             /* number of files                      */
+    off_t num_bpp;              /* number of bytes per proc per dset    */
+    int num_iters;              /* number of iterations                 */
+    int max_num_procs;          /* maximum number of processes to use   */
+    int min_num_procs;          /* minimum number of processes to use   */
+    size_t max_xfer_size;       /* maximum transfer buffer size         */
+    size_t min_xfer_size;       /* minimum transfer buffer size         */
+    size_t blk_size;            /* Block size                           */
+    unsigned interleaved;       /* Interleaved vs. contiguous blocks    */
+    unsigned collective;        /* Collective vs. independent I/O       */
+    unsigned dim2d;             /* 1D vs. 2D geometry                   */
+    int print_times;       	/* print times as well as throughputs   */
+    int print_raw;         	/* print raw data throughput info       */
+    off_t h5_alignment;         /* alignment in HDF5 file               */
+    off_t h5_threshold;         /* threshold for alignment in HDF5 file */
+    int h5_use_chunks;     	/* Make HDF5 dataset chunked            */
+    int h5_write_only;        	/* Perform the write tests only         */
+    int verify;        		/* Verify data correctness              */
+};
+
+typedef struct _minmax {
+    double min;
+    double max;
+    double sum;
+    int num;
+} minmax;
+
+/* local functions */
+static off_t parse_size_directive(const char *size);
+static struct options *parse_command_line(int argc, char *argv[]);
+static void run_test_loop(struct options *options);
+static int run_test(iotype iot, parameters parms, struct options *opts);
+static void output_all_info(minmax *mm, int count, int indent_level);
+static void get_minmax(minmax *mm, double val);
+static minmax accumulate_minmax_stuff(minmax *mm, int count);
+static int create_comm_world(int num_procs, int *doing_pio);
+static int destroy_comm_world(void);
+static void output_results(const struct options *options, const char *name,
+                           minmax *table, int table_size, off_t data_size);
+static void output_times(const struct options *options, const char *name,
+                           minmax *table, int table_size);
+static void output_report(const char *fmt, ...);
+static void print_indent(register int indent);
+static void usage(const char *prog);
+static void report_parameters(struct options *opts);
+
+/*
+ * Function:    main
+ * Purpose:     Start things up. Initialize MPI and then call the test looping
+ *              function.
+ * Return:      EXIT_SUCCESS or EXIT_FAILURE
+ * Programmer:  Bill Wendling, 30. October 2001
+ * Modifications:
+ */
+int
+main(int argc, char **argv)
+{
+    int ret;
+    int exit_value = EXIT_SUCCESS;
+    struct options *opts = NULL;
+
+#ifndef STANDALONE
+    /* Initialize h5tools lib */
+    h5tools_init();
+#endif
+
+    output = stdout;
+
+    /* initialize MPI and get the maximum num of processors we started with */
+    MPI_Init(&argc, &argv);
+    ret = MPI_Comm_size(MPI_COMM_WORLD, &comm_world_nprocs_g);
+
+    if (ret != MPI_SUCCESS) {
+        fprintf(stderr, "%s: MPI_Comm_size call failed\n", progname);
+
+        if (ret == MPI_ERR_COMM)
+            fprintf(stderr, "invalid MPI communicator\n");
+        else
+            fprintf(stderr, "invalid argument\n");
+
+        exit_value = EXIT_FAILURE;
+        goto finish;
+    }
+
+    ret = MPI_Comm_rank(MPI_COMM_WORLD, &comm_world_rank_g);
+
+    if (ret != MPI_SUCCESS) {
+        fprintf(stderr, "%s: MPI_Comm_rank call failed\n", progname);
+
+        if (ret == MPI_ERR_COMM)
+            fprintf(stderr, "invalid MPI communicator\n");
+        else
+            fprintf(stderr, "invalid argument\n");
+
+        exit_value = EXIT_FAILURE;
+        goto finish;
+    }
+
+    pio_comm_g = MPI_COMM_WORLD;
+
+    h5_set_info_object();
+    opts = parse_command_line(argc, argv);
+
+    if (!opts) {
+        exit_value = EXIT_FAILURE;
+        goto finish;
+    }
+
+    if (opts->output_file) {
+        if ((output = HDfopen(opts->output_file, "w")) == NULL) {
+            fprintf(stderr, "%s: cannot open output file\n", progname);
+            perror(opts->output_file);
+            goto finish;
+        }
+    }
+
+    if ((pio_debug_level == 0 && comm_world_rank_g == 0) || pio_debug_level > 0)
+        report_parameters(opts);
+
+    run_test_loop(opts);
+
+finish:
+    MPI_Finalize();
+    free(opts);
+    return exit_value;
+}
+
+/*
+ * Function:    run_test_loop
+ * Purpose:     Run the I/O tests. Write the results to OUTPUT.
+ *
+ *            - The slowest changing part of the test is the number of
+ *              processors to use. For each loop iteration, we divide that
+ *              number by 2 and rerun the test.
+ *
+ *            - The second slowest is what type of IO API to perform. We have
+ *              three choices: POSIXIO, MPI-IO, and PHDF5.
+ *
+ *            - Then we change the size of the buffer. This information is
+ *              inferred from the number of datasets to create and the number
+ *              of integers to put into each dataset. The backend code figures
+ *              this out.
+ *
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 30. October 2001
+ * Modifications:
+ *    Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+static void
+run_test_loop(struct options *opts)
+{
+    parameters parms;
+    int num_procs;
+    int doing_pio;      /* if this process is doing PIO */
+
+    parms.num_files = opts->num_files;
+    parms.num_dsets = opts->num_dsets;
+    parms.num_iters = opts->num_iters;
+    parms.blk_size = opts->blk_size;
+    parms.interleaved = opts->interleaved;
+    parms.collective = opts->collective;
+    parms.dim2d = opts->dim2d;
+    parms.h5_align = opts->h5_alignment;
+    parms.h5_thresh = opts->h5_threshold;
+    parms.h5_use_chunks = opts->h5_use_chunks;
+    parms.h5_write_only = opts->h5_write_only;
+    parms.verify = opts->verify;
+
+    /* start with max_num_procs and decrement it by half for each loop. */
+    /* if performance needs restart, fewer processes may be needed. */
+    for (num_procs = opts->max_num_procs;
+            num_procs >= opts->min_num_procs; num_procs >>= 1) {
+        register size_t buf_size;
+
+        parms.num_procs = num_procs;
+
+        if (create_comm_world(parms.num_procs, &doing_pio) != SUCCESS) {
+            /* do something harsh */
+        }
+
+    /* only processes doing PIO will run the tests */
+    if (doing_pio){
+            output_report("Number of processors = %ld\n", parms.num_procs);
+
+            /* multiply the xfer buffer size by 2 for each loop iteration */
+            for (buf_size = opts->min_xfer_size;
+                    buf_size <= opts->max_xfer_size; buf_size <<= 1) {
+                parms.buf_size = buf_size;
+
+        if (parms.dim2d){
+            parms.num_bytes = (off_t)pow((double)(opts->num_bpp*parms.num_procs),2);
+            if (parms.interleaved)
+            output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MB\n",
+                buf_size, opts->blk_size,
+                ((double)parms.num_dsets * (double)parms.num_bytes)
+                / ONE_MB);
+            else
+            output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MB\n",
+                opts->blk_size, buf_size,
+                ((double)parms.num_dsets * (double)parms.num_bytes)
+                / ONE_MB);
+
+            print_indent(1);
+            output_report("  # of files: %ld, # of datasets: %ld, dataset size: %.2fx%.2f KB\n",
+                parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_KB,
+                (double)(opts->num_bpp*parms.num_procs)/ONE_KB);
+        }
+        else{
+            parms.num_bytes = (off_t)opts->num_bpp*parms.num_procs;
+            output_report("Transfer Buffer Size: %ld bytes, File size: %.2f MB\n",
+                buf_size,((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB);
+
+            print_indent(1);
+            output_report("  # of files: %ld, # of datasets: %ld, dataset size: %.2f MB\n",
+                parms.num_files, parms.num_dsets, (double)(opts->num_bpp*parms.num_procs)/ONE_MB);
+        }
+
+                if (opts->io_types & PIO_POSIX)
+                    run_test(POSIXIO, parms, opts);
+
+                if (opts->io_types & PIO_MPI)
+                    run_test(MPIO, parms, opts);
+
+                if (opts->io_types & PIO_HDF5)
+                    run_test(PHDF5, parms, opts);
+
+                /* Run the tests once if buf_size==0, but then break out */
+                if(buf_size==0)
+                    break;
+            }
+
+            if (destroy_comm_world() != SUCCESS) {
+                /* do something harsh */
+            }
+    }
+    }
+}
+
+/*
+ * Function:    run_test
+ * Purpose:     Inner loop call to actually run the I/O test.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 18. December 2001
+ * Modifications:
+ */
+static int
+run_test(iotype iot, parameters parms, struct options *opts)
+{
+    results         res;
+    register int    i, ret_value = SUCCESS;
+    int             comm_size;
+    off_t           raw_size;
+    minmax         *write_mpi_mm_table=NULL;
+    minmax         *write_mm_table=NULL;
+    minmax         *write_gross_mm_table=NULL;
+    minmax         *write_raw_mm_table=NULL;
+    minmax         *read_mpi_mm_table=NULL;
+    minmax         *read_mm_table=NULL;
+    minmax         *read_gross_mm_table=NULL;
+    minmax         *read_raw_mm_table=NULL;
+    minmax         *read_open_mm_table=NULL;
+    minmax         *read_close_mm_table=NULL;
+    minmax         *write_open_mm_table=NULL;
+    minmax         *write_close_mm_table=NULL;
+    minmax          write_mpi_mm = {0.0, 0.0, 0.0, 0};
+    minmax          write_mm = {0.0, 0.0, 0.0, 0};
+    minmax          write_gross_mm = {0.0, 0.0, 0.0, 0};
+    minmax          write_raw_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_mpi_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_gross_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_raw_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_open_mm = {0.0, 0.0, 0.0, 0};
+    minmax          read_close_mm = {0.0, 0.0, 0.0, 0};
+    minmax          write_open_mm = {0.0, 0.0, 0.0, 0};
+    minmax          write_close_mm = {0.0, 0.0, 0.0, 0};
+
+    raw_size = parms.num_files * (off_t)parms.num_dsets * (off_t)parms.num_bytes;
+    parms.io_type = iot;
+    print_indent(2);
+    output_report("IO API = ");
+
+    switch (iot) {
+        case POSIXIO:
+            output_report("POSIX\n");
+            break;
+        case MPIO:
+            output_report("MPIO\n");
+            break;
+        case PHDF5:
+            output_report("PHDF5 (w/MPI-IO driver)\n");
+            break;
+    }
+
+    MPI_Comm_size(pio_comm_g, &comm_size);
+
+    /* allocate space for tables minmax and that it is sufficient */
+    /* to initialize all elements to zeros by calloc.             */
+    write_mpi_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_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+    write_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+    if (!parms.h5_write_only) {
+        read_mpi_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_open_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+        read_close_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+    }
+
+    /* Do IO iteration times, collecting statistics each time */
+    for (i = 0; i < parms.num_iters; ++i) {
+        double t;
+
+        MPI_Barrier(pio_comm_g);
+        res = do_pio(parms);
+
+        /* gather all of the "mpi write" times */
+        t = get_time(res.timers, HDF5_MPI_WRITE);
+        get_minmax(&write_mpi_mm, t);
+
+        write_mpi_mm_table[i] = write_mpi_mm;
+
+        /* gather all of the "write" times */
+        t = get_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
+        get_minmax(&write_mm, t);
+
+        write_mm_table[i] = write_mm;
+
+        /* gather all of the "write" times from open to close */
+        t = get_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
+        get_minmax(&write_gross_mm, t);
+
+        write_gross_mm_table[i] = write_gross_mm;
+
+        /* gather all of the raw "write" times */
+        t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
+        get_minmax(&write_raw_mm, t);
+
+        write_raw_mm_table[i] = write_raw_mm;
+
+        /* gather all of the file open times (time from open to first write) */
+        t = get_time(res.timers, HDF5_FILE_WRITE_OPEN);
+        get_minmax(&write_open_mm, t);
+
+        write_open_mm_table[i] = write_open_mm;
+
+        /* gather all of the file close times (time from last write to close) */
+        t = get_time(res.timers, HDF5_FILE_WRITE_CLOSE);
+        get_minmax(&write_close_mm, t);
+
+        write_close_mm_table[i] = write_close_mm;
+
+        if (!parms.h5_write_only) {
+            /* gather all of the "mpi read" times */
+            t = get_time(res.timers, HDF5_MPI_READ);
+            get_minmax(&read_mpi_mm, t);
+
+            read_mpi_mm_table[i] = read_mpi_mm;
+
+            /* gather all of the "read" times */
+            t = get_time(res.timers, HDF5_FINE_READ_FIXED_DIMS);
+            get_minmax(&read_mm, t);
+
+            read_mm_table[i] = read_mm;
+
+            /* gather all of the "read" times from open to close */
+            t = get_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
+            get_minmax(&read_gross_mm, t);
+
+            read_gross_mm_table[i] = read_gross_mm;
+
+            /* gather all of the raw "read" times */
+            t = get_time(res.timers, HDF5_RAW_READ_FIXED_DIMS);
+            get_minmax(&read_raw_mm, t);
+
+            read_raw_mm_table[i] = read_raw_mm;
+
+            /* gather all of the file open times (time from open to first read) */
+            t = get_time(res.timers, HDF5_FILE_READ_OPEN);
+            get_minmax(&read_open_mm, t);
+
+            read_open_mm_table[i] = read_open_mm;
+
+            /* gather all of the file close times (time from last read to close) */
+            t = get_time(res.timers, HDF5_FILE_READ_CLOSE);
+            get_minmax(&read_close_mm, t);
+
+            read_close_mm_table[i] = read_close_mm;
+
+         }
+
+         io_time_destroy(res.timers);
+    }
+
+    /*
+     * Show various statistics
+     */
+    /* Write statistics	*/
+    /* Print the raw data throughput if desired */
+    if (opts->print_raw) {
+        /* accumulate and output the max, min, and average "raw write" times */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Raw Data Write details:\n");
+            output_all_info(write_raw_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts,"Raw Data Write",write_raw_mm_table,parms.num_iters,raw_size);
+    } /* end if */
+
+    /* show mpi write statics */
+    if (pio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("MPI Write details:\n");
+        output_all_info(write_mpi_mm_table, parms.num_iters, 4);
+    }
+
+    /* We don't currently output the MPI write results */
+
+    /* accumulate and output the max, min, and average "write" times */
+    if (pio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("Write details:\n");
+        output_all_info(write_mm_table, parms.num_iters, 4);
+    }
+
+    output_results(opts,"Write",write_mm_table,parms.num_iters,raw_size);
+
+    /* accumulate and output the max, min, and average "gross write" times */
+    if (pio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("Write Open-Close details:\n");
+        output_all_info(write_gross_mm_table, parms.num_iters, 4);
+    }
+
+    output_results(opts,"Write Open-Close",write_gross_mm_table,parms.num_iters,raw_size);
+
+    if (opts->print_times) {
+        output_times(opts,"Write File Open",write_open_mm_table,parms.num_iters);
+        output_times(opts,"Write File Close",write_close_mm_table,parms.num_iters);
+    }
+
+    /* Print out time from open to first write */
+    if (pio_debug_level >= 3) {
+       /* output all of the times for all iterations */
+       print_indent(3);
+       output_report("Write file open details:\n");
+       output_all_info(write_open_mm_table, parms.num_iters, 4);
+    }
+
+    /* Print out time from last write to close */
+    if (pio_debug_level >= 3) {
+       /* output all of the times for all iterations */
+       print_indent(3);
+       output_report("Write file close details:\n");
+       output_all_info(write_close_mm_table, parms.num_iters, 4);
+    }
+
+    if (!parms.h5_write_only) {
+        /* Read statistics	*/
+        /* Print the raw data throughput if desired */
+        if (opts->print_raw) {
+            /* accumulate and output the max, min, and average "raw read" times */
+            if (pio_debug_level >= 3) {
+                /* output all of the times for all iterations */
+                print_indent(3);
+                output_report("Raw Data Read details:\n");
+                output_all_info(read_raw_mm_table, parms.num_iters, 4);
+            }
+
+            output_results(opts, "Raw Data Read", read_raw_mm_table,
+                           parms.num_iters, raw_size);
+        } /* end if */
+
+        /* show mpi read statics */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("MPI Read details:\n");
+            output_all_info(read_mpi_mm_table, parms.num_iters, 4);
+        }
+
+        /* We don't currently output the MPI read results */
+
+        /* accumulate and output the max, min, and average "read" times */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read details:\n");
+            output_all_info(read_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
+
+        /* accumulate and output the max, min, and average "gross read" times */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read Open-Close details:\n");
+            output_all_info(read_gross_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts, "Read Open-Close", read_gross_mm_table,parms.num_iters, raw_size);
+
+        if (opts->print_times) {
+            output_times(opts,"Read File Open",read_open_mm_table,parms.num_iters);
+            output_times(opts,"Read File Close",read_close_mm_table,parms.num_iters);
+        }
+
+        /* Print out time from open to first read */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read file open details:\n");
+            output_all_info(read_open_mm_table, parms.num_iters, 4);
+        }
+
+        /* Print out time from last read to close */
+        if (pio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read file close details:\n");
+            output_all_info(read_close_mm_table, parms.num_iters, 4);
+        }
+
+    }
+
+    /* clean up our mess */
+    free(write_mpi_mm_table);
+    free(write_mm_table);
+    free(write_gross_mm_table);
+    free(write_raw_mm_table);
+    free(write_open_mm_table);
+    free(write_close_mm_table);
+
+    if (!parms.h5_write_only) {
+        free(read_mpi_mm_table);
+        free(read_mm_table);
+        free(read_gross_mm_table);
+        free(read_raw_mm_table);
+        free(read_open_mm_table);
+        free(read_close_mm_table);
+    }
+
+    return ret_value;
+}
+
+/*
+ * Function:    output_all_info
+ * Purpose:
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 29. January 2002
+ * Modifications:
+ */
+static void
+output_all_info(minmax *mm, int count, int indent_level)
+{
+    int i;
+
+    for (i = 0; i < count; ++i) {
+        print_indent(indent_level);
+        output_report("Iteration %d:\n", i + 1);
+        print_indent(indent_level + 1);
+        output_report("Minimum Time: %.2fs\n", mm[i].min);
+        print_indent(indent_level + 1);
+        output_report("Maximum Time: %.2fs\n", mm[i].max);
+    }
+}
+
+/*
+ * Function:    get_minmax
+ * Purpose:     Gather all the min, max and total of val.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 21. December 2001
+ * Modifications:
+ *    Use MPI_Allreduce to do it. -akc, 2002/01/11
+ */
+static void
+get_minmax(minmax *mm, double val)
+{
+    int myrank;
+
+    MPI_Comm_rank(pio_comm_g, &myrank);
+    MPI_Comm_size(pio_comm_g, &mm->num);
+
+    MPI_Allreduce(&val, &mm->max, 1, MPI_DOUBLE, MPI_MAX, pio_comm_g);
+    MPI_Allreduce(&val, &mm->min, 1, MPI_DOUBLE, MPI_MIN, pio_comm_g);
+    MPI_Allreduce(&val, &mm->sum, 1, MPI_DOUBLE, MPI_SUM, pio_comm_g);
+}
+
+/*
+ * Function:    accumulate_minmax_stuff
+ * Purpose:     Accumulate the minimum, maximum, and average of the times
+ *              across all processes.
+ * Return:      TOTAL_MM - the total of all of these.
+ * Programmer:  Bill Wendling, 21. December 2001
+ * Modifications:
+ *              Changed to use seconds instead of MB/s - QAK, 5/9/02
+ */
+static minmax
+accumulate_minmax_stuff(minmax *mm, int count)
+{
+    int i;
+    minmax total_mm;
+
+    total_mm.sum = 0.0;
+    total_mm.max = -DBL_MAX;
+    total_mm.min = DBL_MAX;
+    total_mm.num = count;
+
+    for (i = 0; i < count; ++i) {
+        double m = mm[i].max;
+
+        total_mm.sum += m;
+
+        if (m < total_mm.min)
+            total_mm.min = m;
+
+        if (m > total_mm.max)
+            total_mm.max = m;
+    }
+
+    return total_mm;
+}
+
+/*
+ * Function:    create_comm_world
+ * Purpose:     Create an MPI Comm world and store it in pio_comm_g, which
+ *              is a global variable.
+ * Return:      SUCCESS on success.
+ *              FAIL otherwise.
+ * Programmer:  Bill Wendling, 19. December 2001
+ * Modifications:
+ */
+static int
+create_comm_world(int num_procs, int *doing_pio)
+{
+    /* MPI variables */
+    int     mrc;     /* return values                */
+    int     color;              /* for communicator creation    */
+    int     myrank, nprocs;
+
+    pio_comm_g = MPI_COMM_NULL;
+
+    /*
+     * Create a sub communicator for this PIO run. Easier to use the first N
+     * processes.
+     */
+    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+
+    if (num_procs > nprocs) {
+        fprintf(stderr,
+                "number of process(%d) must be <= number of processes in MPI_COMM_WORLD(%d)\n",
+                num_procs, nprocs);
+        goto error_done;
+    }
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+    color = (myrank < num_procs);
+    mrc = MPI_Comm_split(MPI_COMM_WORLD, color, myrank, &pio_comm_g);
+
+    if (mrc != MPI_SUCCESS) {
+        fprintf(stderr, "MPI_Comm_split failed\n");
+        goto error_done;
+    }
+
+    if (!color) {
+        /* not involved in this run */
+        mrc = destroy_comm_world();
+        goto done;
+    }
+
+    /* determine the MPI rank in the PIO communicator */
+    MPI_Comm_size(pio_comm_g, &pio_mpi_nprocs_g);
+    MPI_Comm_rank(pio_comm_g, &pio_mpi_rank_g);
+
+done:
+    *doing_pio = color;
+    return SUCCESS;
+
+error_done:
+    destroy_comm_world();
+    return FAIL;
+}
+
+/*
+ * Function:    destroy_comm_world
+ * Purpose:     Destroy the created MPI Comm world which is stored in the
+ *              pio_comm_g global variable.
+ * Return:      SUCCESS on success.
+ *              FAIL otherwise.
+ * Programmer:  Bill Wendling, 19. December 2001
+ * Modifications:
+ */
+static int
+destroy_comm_world(void)
+{
+    int     mrc = SUCCESS;      /* return code      */
+
+    /* release MPI resources */
+    if (pio_comm_g != MPI_COMM_NULL)
+        mrc = (MPI_Comm_free(&pio_comm_g) == MPI_SUCCESS ? SUCCESS : FAIL);
+
+    return mrc;
+}
+
+/*
+ * Function:    output_results
+ * Purpose:     Print information about the time & bandwidth for a given
+ *                  minmax & # of iterations.
+ * Return:      Nothing
+ * Programmer:  Quincey Koziol, 9. May 2002
+ * Modifications:
+ */
+static void
+output_results(const struct options *opts, const char *name, minmax *table,
+    int table_size,off_t data_size)
+{
+    minmax          total_mm;
+
+    total_mm = accumulate_minmax_stuff(table, table_size);
+
+    print_indent(3);
+    output_report("%s (%d iteration(s)):\n", name,table_size);
+
+    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
+
+    print_indent(4);
+    output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.min));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", total_mm.min);
+    else
+        output_report("\n");
+
+    print_indent(4);
+    output_report("Average Throughput: %6.2f MB/s",
+                  MB_PER_SEC(data_size,total_mm.sum / total_mm.num));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
+    else
+        output_report("\n");
+
+    print_indent(4);
+    output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.max));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", total_mm.max);
+    else
+        output_report("\n");
+
+}
+
+static void
+output_times(const struct options *opts, const char *name, minmax *table,
+    int table_size)
+{
+    minmax          total_mm;
+
+    total_mm = accumulate_minmax_stuff(table, table_size);
+
+    print_indent(3);
+    output_report("%s (%d iteration(s)):\n", name,table_size);
+
+    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
+
+    print_indent(4);
+        output_report("Minimum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.min));
+
+    print_indent(4);
+        output_report("Average Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.sum / total_mm.num));
+
+    print_indent(4);
+        output_report("Maximum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,(total_mm.max));
+}
+
+/*
+ * Function:    output_report
+ * Purpose:     Print a line of the report. Only do so if I'm the 0 process.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 19. December 2001
+ * Modifications:
+ */
+static void
+output_report(const char *fmt, ...)
+{
+    int myrank;
+
+    MPI_Comm_rank(pio_comm_g, &myrank);
+
+    if (myrank == 0) {
+        va_list ap;
+
+        va_start(ap, fmt);
+        vfprintf(output, fmt, ap);
+        va_end(ap);
+    }
+}
+
+/*
+ * Function:    print_indent
+ * Purpose:     Print spaces to indent a new line of text for pretty printing
+ *              things.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 29. October 2001
+ * Modifications:
+ */
+static void
+print_indent(register int indent)
+{
+    int myrank;
+
+    MPI_Comm_rank(pio_comm_g, &myrank);
+
+    if (myrank == 0) {
+	indent *= TAB_SPACE;
+
+	for (; indent > 0; --indent)
+	    fputc(' ', output);
+    }
+}
+
+static void
+recover_size_and_print(long long val, const char *end)
+{
+    if (val >= ONE_KB && (val % ONE_KB) == 0) {
+        if (val >= ONE_MB && (val % ONE_MB) == 0) {
+            if (val >= ONE_GB && (val % ONE_GB) == 0)
+                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""GB%s", val / ONE_GB, end);
+            else
+                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""MB%s", val / ONE_MB, end);
+        } else {
+            HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""KB%s", val / ONE_KB, end);
+        }
+    } else {
+        HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""%s", val, end);
+    }
+}
+
+static void
+print_io_api(long io_types)
+{
+    if (io_types & PIO_POSIX)
+	HDfprintf(output, "posix ");
+    if (io_types & PIO_MPI)
+	HDfprintf(output, "mpiio ");
+    if (io_types & PIO_HDF5)
+	HDfprintf(output, "phdf5 ");
+    HDfprintf(output, "\n");
+}
+
+static void
+report_parameters(struct options *opts)
+{
+    int rank = comm_world_rank_g;
+
+    print_version("HDF5 Library");	/* print library version */
+    HDfprintf(output, "rank %d: ==== Parameters ====\n", rank);
+
+    HDfprintf(output, "rank %d: IO API=", rank);
+    print_io_api(opts->io_types);
+
+    HDfprintf(output, "rank %d: Number of files=%ld\n", rank,
+              opts->num_files);
+    HDfprintf(output, "rank %d: Number of datasets=%ld\n", rank,
+              opts->num_dsets);
+    HDfprintf(output, "rank %d: Number of iterations=%d\n", rank,
+              opts->num_iters);
+    HDfprintf(output, "rank %d: Number of processes=%d:%d\n", rank,
+              opts->min_num_procs, opts->max_num_procs);
+
+    if (opts->dim2d){
+    HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
+    recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->min_num_procs), ":");
+    recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->max_num_procs), "\n");
+
+    HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
+    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), "x");
+    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
+    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "x");
+    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
+
+    HDfprintf(output, "rank %d: File size=", rank);
+    recover_size_and_print((long long)(pow(opts->num_bpp * opts->min_num_procs,2)
+            * opts->num_dsets), ":");
+    recover_size_and_print((long long)(pow(opts->num_bpp * opts->max_num_procs,2)
+            * opts->num_dsets), "\n");
+
+    HDfprintf(output, "rank %d: Transfer buffer size=", rank);
+    if(opts->interleaved){
+        recover_size_and_print((long long)opts->min_xfer_size, "x");
+        recover_size_and_print((long long)opts->blk_size, ":");
+        recover_size_and_print((long long)opts->max_xfer_size, "x");
+        recover_size_and_print((long long)opts->blk_size, "\n");
+    }
+    else{
+        recover_size_and_print((long long)opts->blk_size, "x");
+        recover_size_and_print((long long)opts->min_xfer_size, ":");
+        recover_size_and_print((long long)opts->blk_size, "x");
+        recover_size_and_print((long long)opts->max_xfer_size, "\n");
+    }
+    HDfprintf(output, "rank %d: Block size=", rank);
+    recover_size_and_print((long long)opts->blk_size, "x");
+    recover_size_and_print((long long)opts->blk_size, "\n");
+    }
+    else{
+    HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
+    recover_size_and_print((long long)opts->num_bpp, "\n");
+
+    HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
+    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
+    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
+
+    HDfprintf(output, "rank %d: File size=", rank);
+    recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs
+            * opts->num_dsets), ":");
+    recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs
+            * opts->num_dsets), "\n");
+
+    HDfprintf(output, "rank %d: Transfer buffer size=", rank);
+    recover_size_and_print((long long)opts->min_xfer_size, ":");
+    recover_size_and_print((long long)opts->max_xfer_size, "\n");
+    HDfprintf(output, "rank %d: Block size=", rank);
+    recover_size_and_print((long long)opts->blk_size, "\n");
+    }
+
+    HDfprintf(output, "rank %d: Block Pattern in Dataset=", rank);
+    if(opts->interleaved)
+        HDfprintf(output, "Interleaved\n");
+    else
+        HDfprintf(output, "Contiguous\n");
+
+    HDfprintf(output, "rank %d: I/O Method for MPI and HDF5=", rank);
+    if(opts->collective)
+        HDfprintf(output, "Collective\n");
+    else
+        HDfprintf(output, "Independent\n");
+
+    HDfprintf(output, "rank %d: Geometry=", rank);
+    if(opts->dim2d)
+        HDfprintf(output, "2D\n");
+    else
+        HDfprintf(output, "1D\n");
+
+    HDfprintf(output, "rank %d: VFL used for HDF5 I/O=%s\n", rank, "MPI-IO driver");
+
+    HDfprintf(output, "rank %d: Data storage method in HDF5=", rank);
+    if(opts->h5_use_chunks)
+        HDfprintf(output, "Chunked\n");
+    else
+        HDfprintf(output, "Contiguous\n");
+
+    {
+        char *prefix = HDgetenv("HDF5_PARAPREFIX");
+
+        HDfprintf(output, "rank %d: Env HDF5_PARAPREFIX=%s\n", rank,
+                  (prefix ? prefix : "not set"));
+    }
+
+    HDfprintf(output, "rank %d: ", rank);
+    h5_dump_info_object(h5_io_info_g);
+
+    HDfprintf(output, "rank %d: ==== End of Parameters ====\n", rank);
+    HDfprintf(output, "\n");
+}
+
+/*
+ * Function:    parse_command_line
+ * Purpose:     Parse the command line options and return a STRUCT OPTIONS
+ *              structure which will need to be freed by the calling function.
+ * Return:      Pointer to an OPTIONS structure
+ * Programmer:  Bill Wendling, 31. October 2001
+ * Modifications:
+ *    Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+static struct options *
+parse_command_line(int argc, char *argv[])
+{
+    register int opt;
+    struct options *cl_opts;
+
+    cl_opts = (struct options *)malloc(sizeof(struct options));
+
+    cl_opts->output_file = NULL;
+    cl_opts->io_types =  0;    /* will set default after parsing options */
+    cl_opts->num_dsets = 1;
+    cl_opts->num_files = 1;
+    cl_opts->num_bpp = 0;
+    cl_opts->num_iters = 1;
+    cl_opts->max_num_procs = comm_world_nprocs_g;
+    cl_opts->min_num_procs = 1;
+    cl_opts->max_xfer_size = 0;
+    cl_opts->min_xfer_size = 0;
+    cl_opts->blk_size = 0;
+    cl_opts->interleaved = 0;       /* Default to contiguous blocks in dataset */
+    cl_opts->collective = 0;        /* Default to independent I/O access */
+    cl_opts->dim2d = 0;             /* Default to 1D */
+    cl_opts->print_times = FALSE;   /* Printing times is off by default */
+    cl_opts->print_raw = FALSE;     /* Printing raw data throughput is off by default */
+    cl_opts->h5_alignment = 1;      /* No alignment for HDF5 objects by default */
+    cl_opts->h5_threshold = 1;      /* No threshold for aligning HDF5 objects by default */
+    cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
+    cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
+    cl_opts->verify = FALSE;        /* No Verify data correctness by default */
+
+    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) != EOF) {
+        switch ((char)opt) {
+        case 'a':
+            cl_opts->h5_alignment = parse_size_directive(opt_arg);
+            break;
+        case 'A':
+            {
+                const char *end = opt_arg;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+                    int i;
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    if (!HDstrcasecmp(buf, "phdf5")) {
+                        cl_opts->io_types |= PIO_HDF5;
+                    } else if (!HDstrcasecmp(buf, "mpiio")) {
+                        cl_opts->io_types |= PIO_MPI;
+                    } else if (!HDstrcasecmp(buf, "posix")) {
+                        cl_opts->io_types |= PIO_POSIX;
+                    } else {
+                        fprintf(stderr, "pio_perf: invalid --api option %s\n",
+                                buf);
+                        exit(EXIT_FAILURE);
+                    }
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+            }
+
+            break;
+#if 0
+        case 'b':
+            /* the future "binary" option */
+            break;
+#endif  /* 0 */
+        case 'B':
+            cl_opts->blk_size = parse_size_directive(opt_arg);
+            break;
+        case 'c':
+            /* Turn on chunked HDF5 dataset creation */
+            cl_opts->h5_use_chunks = TRUE;
+            break;
+        case 'C':
+            cl_opts->collective = 1;
+            break;
+        case 'd':
+            cl_opts->num_dsets = atoi(opt_arg);
+            break;
+        case 'D':
+            {
+                const char *end = opt_arg;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+                    int i;
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    if (strlen(buf) > 1 || isdigit(buf[0])) {
+                        size_t j;
+
+                        for (j = 0; j < 10 && buf[j] != '\0'; ++j)
+                            if (!isdigit(buf[j])) {
+                                fprintf(stderr, "pio_perf: invalid --debug option %s\n",
+                                        buf);
+                                exit(EXIT_FAILURE);
+                            }
+
+                        pio_debug_level = atoi(buf);
+
+                        if (pio_debug_level > 4)
+                            pio_debug_level = 4;
+                        else if (pio_debug_level < 0)
+                            pio_debug_level = 0;
+                    } else {
+                        switch (*buf) {
+                        case 'r':
+                            /* Turn on raw data throughput info */
+                            cl_opts->print_raw = TRUE;
+                            break;
+                        case 't':
+                            /* Turn on time printing */
+                            cl_opts->print_times = TRUE;
+                            break;
+            case 'v':
+                            /* Turn on verify data correctness*/
+                cl_opts->verify = TRUE;
+                break;
+                        default:
+                            fprintf(stderr, "pio_perf: invalid --debug option %s\n", buf);
+                            exit(EXIT_FAILURE);
+                        }
+                    }
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+            }
+
+            break;
+        case 'e':
+            cl_opts->num_bpp = parse_size_directive(opt_arg);
+            break;
+        case 'F':
+            cl_opts->num_files = atoi(opt_arg);
+            break;
+        case 'g':
+            cl_opts->dim2d = 1;
+            break;
+        case 'i':
+            cl_opts->num_iters = atoi(opt_arg);
+            break;
+        case 'I':
+            cl_opts->interleaved = 1;
+            break;
+        case 'o':
+            cl_opts->output_file = opt_arg;
+            break;
+        case 'p':
+            cl_opts->min_num_procs = atoi(opt_arg);
+            break;
+        case 'P':
+            cl_opts->max_num_procs = atoi(opt_arg);
+            break;
+        case 'T':
+            cl_opts->h5_threshold = parse_size_directive(opt_arg);
+            break;
+        case 'w':
+            cl_opts->h5_write_only = TRUE;
+            break;
+        case 'x':
+            cl_opts->min_xfer_size = parse_size_directive(opt_arg);
+            break;
+        case 'X':
+            cl_opts->max_xfer_size = parse_size_directive(opt_arg);
+            break;
+        case 'h':
+        case '?':
+        default:
+            usage(progname);
+            free(cl_opts);
+            return NULL;
+        }
+    }
+
+
+    if (cl_opts->num_bpp == 0){
+        if (cl_opts->dim2d == 0)
+            cl_opts->num_bpp = 256 * ONE_KB;
+        else
+            cl_opts->num_bpp = 8 * ONE_KB;
+    }
+
+    if (cl_opts->max_xfer_size == 0)
+        cl_opts->max_xfer_size = cl_opts->num_bpp;
+
+    if (cl_opts->min_xfer_size == 0)
+        cl_opts->min_xfer_size = (cl_opts->num_bpp)/2;
+
+    if (cl_opts->blk_size == 0)
+        cl_opts->blk_size = (cl_opts->num_bpp)/2;
+
+
+    /* set default if none specified yet */
+    if (!cl_opts->io_types)
+    cl_opts->io_types = PIO_HDF5 | PIO_MPI | PIO_POSIX; /* run all API */
+
+    /* verify parameters sanity.  Adjust if needed. */
+    /* cap xfer_size with bytes per process */
+    if (!cl_opts->dim2d) {
+        if (cl_opts->min_xfer_size > cl_opts->num_bpp)
+        cl_opts->min_xfer_size = cl_opts->num_bpp;
+        if (cl_opts->max_xfer_size > cl_opts->num_bpp)
+        cl_opts->max_xfer_size = cl_opts->num_bpp;
+    }
+    if (cl_opts->min_xfer_size > cl_opts->max_xfer_size)
+    cl_opts->min_xfer_size = cl_opts->max_xfer_size;
+    if (cl_opts->blk_size > cl_opts->num_bpp )
+        cl_opts->blk_size = cl_opts->num_bpp;
+    /* check range of number of processes */
+    if (cl_opts->min_num_procs <= 0)
+    cl_opts->min_num_procs = 1;
+    if (cl_opts->max_num_procs <= 0)
+    cl_opts->max_num_procs = 1;
+    if (cl_opts->min_num_procs > cl_opts->max_num_procs)
+    cl_opts->min_num_procs = cl_opts->max_num_procs;
+    /* check iteration */
+    if (cl_opts->num_iters <= 0)
+    cl_opts->num_iters = 1;
+
+    return cl_opts;
+}
+
+/*
+ * Function:    parse_size_directive
+ * Purpose:     Parse the size directive passed on the commandline. The size
+ *              directive is an integer followed by a size indicator:
+ *
+ *                  K, k - Kilobyte
+ *                  M, m - Megabyte
+ *                  G, g - Gigabyte
+ *
+ * Return:      The size as a off_t because this is related to file size.
+ *              If an unknown size indicator is used, then the program will
+ *              exit with EXIT_FAILURE as the return value.
+ * Programmer:  Bill Wendling, 18. December 2001
+ * Modifications:
+ */
+static off_t
+parse_size_directive(const char *size)
+{
+    off_t s;
+    char *endptr;
+
+    s = HDstrtol(size, &endptr, 10);
+
+    if (endptr && *endptr) {
+        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
+            ++endptr;
+
+        switch (*endptr) {
+            case 'K':
+            case 'k':
+                s *= ONE_KB;
+                break;
+            case 'M':
+            case 'm':
+                s *= ONE_MB;
+                break;
+            case 'G':
+            case 'g':
+                s *= ONE_GB;
+                break;
+            default:
+                fprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
+                exit(EXIT_FAILURE);
+        }
+    }
+
+    return s;
+}
+
+/*
+ * Function:    usage
+ * Purpose:     Print a usage message and then exit.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 31. October 2001
+ * Modifications:
+ * 	Added 2D testing (Christian Chilan, 10. August 2005)
+ */
+static void
+usage(const char *prog)
+{
+    int myrank;
+
+    MPI_Comm_rank(pio_comm_g, &myrank);
+
+    if (myrank == 0) {
+	print_version(prog);
+        printf("usage: %s [OPTIONS]\n", prog);
+        printf("  OPTIONS\n");
+        printf("     -h, --help                  Print a usage message and exit\n");
+        printf("     -a S, --align=S             Alignment of objects in HDF5 file [default: 1]\n");
+        printf("     -A AL, --api=AL             Which APIs to test [default: all of them]\n");
+#if 0
+        printf("     -b, --binary                The elusive binary option\n");
+#endif  /* 0 */
+        printf("     -B S, --block-size=S        Block size within transfer buffer\n");
+        printf("                                 (see below for description)\n");
+        printf("                                 [default: half the number of bytes per process\n");
+        printf("                                           per dataset]\n");
+        printf("     -c, --chunk                 Create HDF5 datasets using chunked storage\n");
+        printf("                                 [default: contiguous storage]\n");
+        printf("     -C, --collective            Use collective I/O for MPI and HDF5 APIs\n");
+        printf("                                 [default: independent I/O)\n");
+        printf("     -d N, --num-dsets=N         Number of datasets per file [default: 1]\n");
+        printf("     -D DL, --debug=DL           Indicate the debugging level\n");
+        printf("                                 [default: no debugging]\n");
+        printf("     -e S, --num-bytes=S         Number of bytes per process per dataset\n");
+        printf("                                 (see below for description)\n");
+        printf("                                 [default: 256K for 1D, 8K for 2D]\n");
+        printf("     -F N, --num-files=N         Number of files [default: 1]\n");
+        printf("     -g, --geometry              Use 2D geometry [default: 1D geometry]\n");
+        printf("     -i N, --num-iterations=N    Number of iterations to perform [default: 1]\n");
+        printf("     -I, --interleaved           Interleaved access pattern\n");
+        printf("                                 (see below for example)\n");
+        printf("                                 [default: Contiguous access pattern]\n");
+        printf("     -o F, --output=F            Output raw data into file F [default: none]\n");
+        printf("     -p N, --min-num-processes=N Minimum number of processes to use [default: 1]\n");
+        printf("     -P N, --max-num-processes=N Maximum number of processes to use\n");
+        printf("                                 [default: all MPI_COMM_WORLD processes ]\n");
+        printf("     -T S, --threshold=S         Threshold for alignment of objects in HDF5 file\n");
+        printf("                                 [default: 1]\n");
+        printf("     -w, --write-only            Perform write tests not the read tests\n");
+        printf("     -x S, --min-xfer-size=S     Minimum transfer buffer size\n");
+        printf("                                 (see below for description)\n");
+        printf("                                 [default: half the number of bytes per process\n");
+        printf("                                           per dataset]\n");
+        printf("     -X S, --max-xfer-size=S     Maximum transfer buffer size\n");
+        printf("                                 [default: the number of bytes per process per\n");
+        printf("                                           dataset]\n");
+        printf("\n");
+        printf("  F  - is a filename.\n");
+        printf("  N  - is an integer >=0.\n");
+        printf("  S  - is a size specifier, an integer >=0 followed by a size indicator:\n");
+        printf("          K - Kilobyte (%d)\n", ONE_KB);
+        printf("          M - Megabyte (%d)\n", ONE_MB);
+        printf("          G - Gigabyte (%d)\n", ONE_GB);
+        printf("\n");
+        printf("      Example: '37M' is 37 megabytes or %d bytes\n", 37*ONE_MB);
+        printf("\n");
+        printf("  AL - is an API list. Valid values are:\n");
+        printf("          phdf5 - Parallel HDF5\n");
+        printf("          mpiio - MPI-I/O\n");
+        printf("          posix - POSIX\n");
+        printf("\n");
+        printf("      Example: --api=mpiio,phdf5\n");
+        printf("\n");
+        printf("  Dataset size:\n");
+        printf("      Depending on the selected geometry, each test dataset is either a linear\n");
+        printf("      array of size bytes-per-process * num-processes, or a square array of size\n");
+        printf("      (bytes-per-process * num-processes) x (bytes-per-process * num-processes).\n");
+        printf("\n");
+        printf("  Block size vs. Transfer buffer size:\n");
+        printf("      buffer-size controls the size of the memory buffer, which is broken into\n");
+        printf("      blocks and written to the file. Depending on the selected geometry, each\n");
+        printf("      block can be a linear array of size block-size or a square array of size\n");
+        printf("      block-size x block-size. The arrangement in which blocks are written is\n");
+        printf("      determined by the access pattern.\n");
+        printf("\n");
+        printf("      In 1D geometry, the transfer buffer is a linear array of size buffer-size.\n");
+        printf("      In 2D geometry, it is a rectangular array of size block-size x buffer-size\n");
+        printf("      or buffer-size x block-size if interleaved pattern is selected.\n");
+        printf("\n");
+        printf("  Interleaved and Contiguous patterns in 1D geometry:\n");
+        printf("      When contiguous access pattern is chosen, the dataset is evenly divided\n");
+        printf("      into num-processes regions and each process writes data to its own region.\n");
+        printf("      When interleaved blocks are written to a dataset, space for the first\n");
+        printf("      block of the first process is allocated in the dataset, then space is\n");
+        printf("      allocated for the first block of the second process, etc. until space is\n");
+        printf("      allocated for the first block of each process, then space is allocated for\n");
+        printf("      the second block of the first process, the second block of the second\n");
+        printf("      process, etc.\n");
+        printf("\n");
+        printf("      For example, with a 3 process run, 512KB bytes-per-process, 256KB transfer\n");
+        printf("        buffer size, and 64KB block size, each process must issue 2 transfer\n");
+        printf("        requests to complete access to the dataset.\n");
+        printf("          Contiguous blocks of the first transfer request are written like so:\n");
+        printf("              1111----2222----3333----\n");
+        printf("          Interleaved blocks of the first transfer request are written like so:\n");
+        printf("              123123123123------------\n");
+        printf("        The actual number of I/O operations involved in a transfer request\n");
+        printf("        depends on the access pattern and communication mode.\n");
+        printf("        When using independent I/O with interleaved pattern, each process\n");
+        printf("        performs 4 small non-contiguous I/O operations per transfer request.\n");
+        printf("        If collective I/O is turned on, the combined content of the buffers of\n");
+        printf("        the 3 processes will be written using one collective I/O operation\n");
+        printf("        per transfer request.\n");
+        printf("\n");
+        printf("      For information about access patterns in 2D geometry, please refer to the\n");
+        printf("      HDF5 Reference Manual.\n");
+        printf("\n");
+        printf("  DL - is a list of debugging flags. Valid values are:\n");
+        printf("          1 - Minimal\n");
+        printf("          2 - Not quite everything\n");
+        printf("          3 - Everything\n");
+        printf("          4 - The kitchen sink\n");
+        printf("          r - Raw data I/O throughput information\n");
+        printf("          t - Times as well as throughputs\n");
+        printf("          v - Verify data correctness\n");
+        printf("\n");
+        printf("      Example: --debug=2,r,t\n");
+        printf("\n");
+        printf("  Environment variables:\n");
+        printf("  HDF5_NOCLEANUP   Do not remove data files if set [default remove]\n");
+        printf("  HDF5_MPI_INFO    MPI INFO object key=value separated by ;\n");
+        printf("  HDF5_PARAPREFIX  Paralllel data files prefix\n");
+        fflush(stdout);
+    } /* end if */
+} /* end usage() */
+
+#else /* H5_HAVE_PARALLEL */
+
+/*
+ * Function:    main
+ * Purpose:     Dummy main() function for if HDF5 was configured without
+ *              parallel stuff.
+ * Return:      EXIT_SUCCESS
+ * Programmer:  Bill Wendling, 14. November 2001
+ */
+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/test/perform/pio_perf.h b/tools/test/perform/pio_perf.h
new file mode 100644
index 0000000..b595c90
--- /dev/null
+++ b/tools/test/perform/pio_perf.h
@@ -0,0 +1,102 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef PIO_PERF_H__
+#define PIO_PERF_H__
+
+#include "io_timer.h"
+#ifndef STANDALONE
+#include "H5private.h"
+#include "h5test.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#else
+#include "pio_standalone.h"
+#endif
+
+/* setup the dataset no fill option if this is v1.5 or more */
+#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
+#define H5_HAVE_NOFILL 1
+#endif
+
+typedef enum iotype_ {
+    POSIXIO,
+    MPIO,
+    PHDF5
+    /*NUM_TYPES*/
+} iotype;
+
+typedef struct parameters_ {
+    iotype	io_type;        /* The type of IO test to perform       */
+    int		num_procs;      /* Maximum number of processes to use   */
+    long	num_files;      /* Number of files to create            */
+    long	num_dsets;      /* Number of datasets to create         */
+    off_t	num_bytes;      /* Number of bytes in each dset         */
+    int         num_iters;      /* Number of times to loop doing the IO */
+    size_t 	buf_size;       /* Buffer size                          */
+    size_t 	blk_size;       /* Block size                           */
+    unsigned    interleaved;    /* Interleaved vs. contiguous blocks    */
+    unsigned    collective;     /* Collective vs. independent I/O       */
+    unsigned    dim2d;          /* 1D vs. 2D                            */
+    hsize_t 	h5_align;       /* HDF5 object alignment                */
+    hsize_t 	h5_thresh;      /* HDF5 object alignment threshold      */
+    int 	h5_use_chunks;  /* Make HDF5 dataset chunked            */
+    int    	h5_write_only;  /* Perform the write tests only         */
+    int 	verify;    	/* Verify data correctness              */
+} parameters;
+
+typedef struct results_ {
+    herr_t      ret_code;
+    io_time_t   *timers;
+} results;
+
+#ifndef SUCCESS
+#define SUCCESS     0
+#endif  /* !SUCCESS */
+
+#ifndef FAIL
+#define FAIL        -1
+#endif  /* !FAIL */
+
+extern FILE     *output;            /* output file                          */
+extern io_time_t *timer_g;           /* timer: global for stub functions     */
+extern int      comm_world_rank_g;  /* my rank in MPI_COMM_RANK             */
+extern int      comm_world_nprocs_g;/* num. of processes of MPI_COMM_WORLD  */
+extern MPI_Comm pio_comm_g;         /* Communicator to run the PIO          */
+extern int      pio_mpi_rank_g;     /* MPI rank of pio_comm_g               */
+extern int      pio_mpi_nprocs_g;   /* number of processes of pio_comm_g    */
+extern int      pio_debug_level;    /* The debug level:
+                                     *   0 - Off
+                                     *   1 - Minimal
+                                     *   2 - Some more
+                                     *   3 - Maximal
+                                     *   4 - Even More Debugging (timer stuff)
+                                     */
+
+#define HDprint_rank(f)              /* print rank in MPI_COMM_WORLD */    \
+    HDfprintf(f, "%d: ", comm_world_rank_g);
+#define HDprint_size(f)              /* print size of MPI_COMM_WORLD */    \
+    HDfprintf(f, "%d", comm_world_nprocs_g);
+#define HDprint_rank_size(f)         /* print rank/size of MPI_COMM_WORLD */  \
+    HDfprintf(f, "%d/%d: ", comm_world_rank_g, comm_world_nprocs_g);
+
+#ifdef __cplusplus
+extern "C" {
+#endif  /* __cplusplus */
+
+extern results do_pio(parameters param);
+
+#ifdef __cplusplus
+}
+#endif  /* __cplusplus */
+
+#endif  /* PIO_PERF_H__ */
diff --git a/tools/test/perform/pio_standalone.c b/tools/test/perform/pio_standalone.c
new file mode 100644
index 0000000..bd5fb6f
--- /dev/null
+++ b/tools/test/perform/pio_standalone.c
@@ -0,0 +1,279 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* This file contains the definition of functions required to build h5perf in
+ * STANDALONE mode.
+ * Created: Christian Chilan, 2005/5/18.
+ */
+
+#include "pio_perf.h"
+
+
+/** From h5tools_utils.c **/
+
+/* global variables */
+int   nCols = 80;
+
+/* ``get_option'' variables */
+int         opt_err = 1;    /*get_option prints errors if this is on */
+int         opt_ind = 1;    /*token pointer                          */
+const char *opt_arg;        /*flag argument (or value)               */
+
+
+int
+get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
+{
+    static int sp = 1;    /* character index in current token */
+    int opt_opt = '?';    /* option character passed back to user */
+
+    if (sp == 1) {
+        /* check for more flag-like tokens */
+        if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
+            return EOF;
+        } else if (HDstrcmp(argv[opt_ind], "--") == 0) {
+            opt_ind++;
+            return EOF;
+        }
+    }
+
+    if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
+        /* long command line option */
+        const char *arg = &argv[opt_ind][2];
+        int i;
+
+        for (i = 0; l_opts && l_opts[i].name; i++) {
+            size_t len = HDstrlen(l_opts[i].name);
+
+            if (HDstrncmp(arg, l_opts[i].name, len) == 0) {
+                /* we've found a matching long command line flag */
+                opt_opt = l_opts[i].shortval;
+
+                if (l_opts[i].has_arg != no_arg) {
+                    if (arg[len] == '=') {
+                        opt_arg = &arg[len + 1];
+                    } else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
+                        opt_arg = argv[++opt_ind];
+                    } else if (l_opts[i].has_arg == require_arg) {
+                        if (opt_err)
+                            HDfprintf(stderr,
+                                    "%s: option required for \"--%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+                } else {
+                    if (arg[len] == '=') {
+                        if (opt_err)
+                            HDfprintf(stderr,
+                                    "%s: no option required for \"%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+
+                    opt_arg = NULL;
+                }
+
+                break;
+            }
+        }
+
+        if (l_opts[i].name == NULL) {
+            /* exhausted all of the l_opts we have and still didn't match */
+            if (opt_err)
+                HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
+
+            opt_opt = '?';
+        }
+
+        opt_ind++;
+        sp = 1;
+    } else {
+        register char *cp;    /* pointer into current token */
+
+        /* short command line option */
+        opt_opt = argv[opt_ind][sp];
+
+        if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
+
+            if (opt_err)
+                HDfprintf(stderr, "%s: unknown option \"%c\"\n",
+                        argv[0], opt_opt);
+
+            /* if no chars left in this token, move to next token */
+            if (argv[opt_ind][++sp] == '\0') {
+                opt_ind++;
+                sp = 1;
+            }
+
+            return '?';
+        }
+
+        if (*++cp == ':') {
+            /* if a value is expected, get it */
+            if (argv[opt_ind][sp + 1] != '\0') {
+                /* flag value is rest of current token */
+                opt_arg = &argv[opt_ind++][sp + 1];
+            } else if (++opt_ind >= argc) {
+                if (opt_err)
+                    HDfprintf(stderr,
+                            "%s: value expected for option \"%c\"\n",
+                            argv[0], opt_opt);
+
+                opt_opt = '?';
+            } else {
+                /* flag value is next token */
+                opt_arg = argv[opt_ind++];
+            }
+
+            sp = 1;
+        } else {
+            /* set up to look at next char in token, next time */
+            if (argv[opt_ind][++sp] == '\0') {
+                /* no more in current token, so setup next token */
+                opt_ind++;
+                sp = 1;
+            }
+
+            opt_arg = NULL;
+        }
+    }
+
+    /* return the current flag character found */
+    return opt_opt;
+}
+
+
+void
+print_version(const char *progname)
+{
+    printf("%s: Version %u.%u.%u%s%s\n",
+           progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
+           H5_VERS_SUBRELEASE[0] ? "-" : "", H5_VERS_SUBRELEASE);
+}
+
+
+
+/** From h5test.c **/
+
+#ifdef H5_HAVE_PARALLEL
+MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
+#endif
+
+int
+h5_set_info_object(void)
+{
+    char	*envp;			/* environment pointer */
+    int		ret_value=0;
+
+    /* handle any MPI INFO hints via $HDF5_MPI_INFO */
+    if ((envp = getenv("HDF5_MPI_INFO")) != NULL){
+        char *next, *valp;
+
+
+        valp = envp = next = HDstrdup(envp);
+
+        /* create an INFO object if not created yet */
+        if (h5_io_info_g == MPI_INFO_NULL)
+            MPI_Info_create(&h5_io_info_g);
+
+        do {
+            size_t len;
+            char *key_val, *endp, *namep;
+
+            if (*valp == ';')
+                valp++;
+
+            /* copy key/value pair into temporary buffer */
+            len = strcspn(valp, ";");
+            next = &valp[len];
+            key_val = calloc(1, len + 1);
+
+            /* increment the next pointer past the terminating semicolon */
+            if (*next == ';')
+                ++next;
+
+            namep = HDstrncpy(key_val, valp, len);
+
+            /* pass up any beginning whitespaces */
+            while (*namep && (*namep == ' ' || *namep == '\t'))
+                namep++;
+
+            /* eat up any ending white spaces */
+            endp = &namep[strlen(namep) - 1];
+
+            while (endp && (*endp == ' ' || *endp == '\t'))
+                *endp-- = '\0';
+
+            /* find the '=' */
+
+            valp = HDstrchr(namep, '=');
+
+            if (valp != NULL) {     /* it's a valid key/value pairing */
+                char *tmp_val = valp + 1;
+
+                /* change '=' to \0, move valp down one */
+                *valp-- = '\0';
+
+                /* eat up ending whitespace on the "key" part */
+                while (*valp == ' ' || *valp == '\t')
+                    *valp-- = '\0';
+
+                valp = tmp_val;
+
+                /* eat up beginning whitespace on the "value" part */
+                while (*valp == ' ' || *valp == '\t')
+                    *valp++ = '\0';
+
+                /* actually set the darned thing */
+                if (MPI_SUCCESS != MPI_Info_set(h5_io_info_g, namep, valp)) {
+                    printf("MPI_Info_set failed\n");
+                    ret_value = -1;
+                }
+            }
+
+            valp = next;
+            HDfree(key_val);
+        } while (next && *next);
+
+        HDfree(envp);
+    }
+
+    return ret_value;
+}
+
+
+void
+h5_dump_info_object(MPI_Info info)
+{
+    char	key[MPI_MAX_INFO_KEY+1];
+    char	value[MPI_MAX_INFO_VAL+1];
+    int  	flag;
+    int		i, nkeys;
+
+    printf("Dumping MPI Info Object(%d) (up to %d bytes per item):\n", (int)info,
+	MPI_MAX_INFO_VAL);
+    if (info==MPI_INFO_NULL){
+	printf("object is MPI_INFO_NULL\n");
+    }
+    else {
+	MPI_Info_get_nkeys(info, &nkeys);
+	printf("object has %d items\n", nkeys);
+	for (i=0; i<nkeys; i++){
+	    MPI_Info_get_nthkey(info, i, key);
+	    MPI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
+	    printf("%s=%s\n", key, value);
+	}
+
+    }
+}
diff --git a/tools/test/perform/pio_standalone.h b/tools/test/perform/pio_standalone.h
new file mode 100644
index 0000000..66ca05a
--- /dev/null
+++ b/tools/test/perform/pio_standalone.h
@@ -0,0 +1,528 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef PIO_STANDALONE_H__
+#define PIO_PERF_H__
+
+/* Header file for building h5perf by standalone mode.
+ * Created: Christian Chilan, 2005/5/18.
+ */
+
+/** From H5private.h **/
+
+#include "H5public.h"    /* Include Public Definitions    */
+
+
+/*
+ * Include ANSI-C header files.
+ */
+#ifdef H5_STDC_HEADERS
+#   include <assert.h>
+#   include <ctype.h>
+#   include <errno.h>
+#   include <fcntl.h>
+#   include <float.h>
+#   include <limits.h>
+#   include <math.h>
+#   include <signal.h>
+#   include <stdarg.h>
+#   include <stdio.h>
+#   include <stdlib.h>
+#   include <string.h>
+#endif
+
+/*
+ * Redefine all the POSIX functions.  We should never see a POSIX
+ * function (or any other non-HDF5 function) in the source!
+ */
+#define HDabort()               abort()
+#define HDabs(X)                abs(X)
+#ifdef H5_HAVE_WIN32_API
+#define HDaccess(F,M)           _access(F, M)
+#define R_OK    4       /* Test for read permission.  */
+#define W_OK    2       /* Test for write permission.  */
+#define X_OK    1       /* Test for execute permission.  */
+#define F_OK    0       /* Test for existence.  */
+#else /* H5_HAVE_WIN32_API */
+#define HDaccess(F,M)           access(F, M)
+#ifndef F_OK
+#define F_OK  00
+#define W_OK 02
+#define R_OK 04
+#endif
+#endif /* H5_HAVE_WIN32_API */
+#define HDacos(X)               acos(X)
+#ifdef H5_HAVE_ALARM
+#define HDalarm(N)              alarm(N)
+#else /* H5_HAVE_ALARM */
+#define HDalarm(N)              (0)
+#endif /* H5_HAVE_ALARM */
+#define HDasctime(T)            asctime(T)
+#define HDasin(X)               asin(X)
+#define HDasprintf              asprintf /*varargs*/
+#define HDassert(X)             assert(X)
+#define HDatan(X)               atan(X)
+#define HDatan2(X,Y)            atan2(X,Y)
+#define HDatexit(F)             atexit(F)
+#define HDatof(S)               atof(S)
+#define HDatoi(S)               atoi(S)
+#define HDatol(S)               atol(S)
+#define HDbsearch(K,B,N,Z,F)    bsearch(K,B,N,Z,F)
+#define HDcalloc(N,Z)           calloc(N,Z)
+#define HDceil(X)               ceil(X)
+#define HDcfgetispeed(T)        cfgetispeed(T)
+#define HDcfgetospeed(T)        cfgetospeed(T)
+#define HDcfsetispeed(T,S)      cfsetispeed(T,S)
+#define HDcfsetospeed(T,S)      cfsetospeed(T,S)
+#define HDchdir(S)              chdir(S)
+#define HDchmod(S,M)            chmod(S,M)
+#define HDchown(S,O,G)          chown(S,O,G)
+#define HDclearerr(F)           clearerr(F)
+#define HDclock()               clock()
+#define HDclose(F)              close(F)
+#define HDclosedir(D)           closedir(D)
+#define HDcos(X)                cos(X)
+#define HDcosh(X)               cosh(X)
+#define HDcreat(S,M)            creat(S,M)
+#define HDctermid(S)            ctermid(S)
+#define HDctime(T)              ctime(T)
+#define HDcuserid(S)            cuserid(S)
+#ifdef H5_HAVE_DIFFTIME
+#define HDdifftime(X,Y)         difftime(X,Y)
+#else
+#define HDdifftime(X,Y)         ((double)(X)-(double)(Y))
+#endif
+#define HDdiv(X,Y)              div(X,Y)
+#define HDdup(F)                dup(F)
+#define HDdup2(F,I)             dup2(F,I)
+/* execl() variable arguments */
+/* execle() variable arguments */
+/* execlp() variable arguments */
+#define HDexecv(S,AV)           execv(S,AV)
+#define HDexecve(S,AV,E)        execve(S,AV,E)
+#define HDexecvp(S,AV)          execvp(S,AV)
+#define HDexit(N)               exit(N)
+#define HD_exit(N)              _exit(N)
+#define HDexp(X)                exp(X)
+#define HDfabs(X)               fabs(X)
+/* use ABS() because fabsf() fabsl() are not common yet. */
+#define HDfabsf(X)              ABS(X)
+#define HDfabsl(X)              ABS(X)
+#define HDfclose(F)             fclose(F)
+/* fcntl() variable arguments */
+#define HDfdopen(N,S)           fdopen(N,S)
+#define HDfeof(F)               feof(F)
+#define HDferror(F)             ferror(F)
+#define HDfflush(F)             fflush(F)
+#define HDfgetc(F)              fgetc(F)
+#define HDfgetpos(F,P)          fgetpos(F,P)
+#define HDfgets(S,N,F)          fgets(S,N,F)
+#ifdef H5_HAVE_WIN32_API
+#define HDfileno(F)             _fileno(F)
+#else /* H5_HAVE_WIN32_API */
+#define HDfileno(F)             fileno(F)
+#endif /* H5_HAVE_WIN32_API */
+#define HDfloor(X)              floor(X)
+#define HDfmod(X,Y)             fmod(X,Y)
+#define HDfopen(S,M)            fopen(S,M)
+#define HDfork()                fork()
+#define HDfpathconf(F,N)        fpathconf(F,N)
+H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
+#define HDfputc(C,F)            fputc(C,F)
+#define HDfputs(S,F)            fputs(S,F)
+#define HDfread(M,Z,N,F)        fread(M,Z,N,F)
+#define HDfree(M)               free(M)
+#define HDfreopen(S,M,F)        freopen(S,M,F)
+#define HDfrexp(X,N)            frexp(X,N)
+/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
+#ifdef H5_HAVE_FREXPF
+#define HDfrexpf(X,N)           frexpf(X,N)
+#else /* H5_HAVE_FREXPF */
+#define HDfrexpf(X,N)           frexp(X,N)
+#endif /* H5_HAVE_FREXPF */
+#ifdef H5_HAVE_FREXPL
+#define HDfrexpl(X,N)           frexpl(X,N)
+#else /* H5_HAVE_FREXPL */
+#define HDfrexpl(X,N)           frexp(X,N)
+#endif /* H5_HAVE_FREXPL */
+/* fscanf() variable arguments */
+#ifdef H5_HAVE_FSEEKO
+     #define HDfseek(F,O,W)     fseeko(F,O,W)
+#else
+     #define HDfseek(F,O,W)     fseek(F,O,W)
+#endif
+#define HDfsetpos(F,P)          fsetpos(F,P)
+/* definitions related to the file stat utilities.
+ * Windows have its own function names.
+ * For Unix, if off_t is not 64bit big, try use the pseudo-standard
+ * xxx64 versions if available.
+ */
+#ifdef H5_HAVE_WIN32_API
+    #define HDfstat(F,B)        _fstati64(F,B)
+    #define HDlstat(S,B)        _lstati64(S,B)
+    #define HDstat(S,B)         _stati64(S,B)
+    typedef struct _stati64     h5_stat_t;
+    typedef __int64             h5_stat_size_t;
+    #define HDoff_t             __int64
+#elif H5_SIZEOF_OFF_T!=8 && H5_SIZEOF_OFF64_T==8 && defined(H5_HAVE_STAT64)
+    #define HDfstat(F,B)        fstat64(F,B)
+    #define HDlstat(S,B)        lstat64(S,B)
+    #define HDstat(S,B)         stat64(S,B)
+    typedef struct stat64       h5_stat_t;
+    typedef off64_t             h5_stat_size_t;
+    #define HDoff_t             off64_t
+#else
+    #define HDfstat(F,B)        fstat(F,B)
+    #define HDlstat(S,B)        lstat(S,B)
+    #define HDstat(S,B)         stat(S,B)
+    typedef struct stat         h5_stat_t;
+    typedef off_t               h5_stat_size_t;
+    #define HDoff_t             off_t
+#endif
+
+#ifndef H5_HAVE_WIN32_API
+/* These definitions differ in Windows and are defined in
+ * H5win32defs for that platform.
+ */
+typedef struct stat         h5_stat_t;
+typedef off_t               h5_stat_size_t;
+#define HDoff_t             off_t
+#endif /* H5_HAVE_WIN32_API */
+
+#define HDftell(F)              ftell(F)
+#define HDftruncate(F,L)        ftruncate(F,L)
+#define HDfwrite(M,Z,N,F)       fwrite(M,Z,N,F)
+#define HDgetc(F)               getc(F)
+#define HDgetchar()             getchar()
+#define HDgetcwd(S,Z)           getcwd(S,Z)
+#define HDgetegid()             getegid()
+#define HDgetenv(S)             getenv(S)
+#define HDgeteuid()             geteuid()
+#define HDgetgid()              getgid()
+#define HDgetgrgid(G)           getgrgid(G)
+#define HDgetgrnam(S)           getgrnam(S)
+#define HDgetgroups(Z,G)        getgroups(Z,G)
+#ifdef H5_HAVE_WIN32_API
+#define HDgetlogin()            Wgetlogin()
+#else /* H5_HAVE_WIN32_API */
+#define HDgetlogin()            getlogin()
+#endif /* H5_HAVE_WIN32_API */
+#define HDgetpgrp()             getpgrp()
+#define HDgetpid()              getpid()
+#define HDgetppid()             getppid()
+#define HDgetpwnam(S)           getpwnam(S)
+#define HDgetpwuid(U)           getpwuid(U)
+#define HDgetrusage(X,S)        getrusage(X,S)
+#define HDgets(S)               gets(S)
+#ifdef H5_HAVE_WIN32_API
+    H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
+#define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
+#else /* H5_HAVE_WIN32_API */
+#define HDgettimeofday(S,P)     gettimeofday(S,P)
+#endif /* H5_HAVE_WIN32_API */
+#define HDgetuid()              getuid()
+#define HDgmtime(T)             gmtime(T)
+#define HDisalnum(C)            isalnum((int)(C)) /*cast for solaris warning*/
+#define HDisalpha(C)            isalpha((int)(C)) /*cast for solaris warning*/
+#define HDisatty(F)             isatty(F)
+#define HDiscntrl(C)            iscntrl((int)(C)) /*cast for solaris warning*/
+#define HDisdigit(C)            isdigit((int)(C)) /*cast for solaris warning*/
+#define HDisgraph(C)            isgraph((int)(C)) /*cast for solaris warning*/
+#define HDislower(C)            islower((int)(C)) /*cast for solaris warning*/
+#define HDisprint(C)            isprint((int)(C)) /*cast for solaris warning*/
+#define HDispunct(C)            ispunct((int)(C)) /*cast for solaris warning*/
+#define HDisspace(C)            isspace((int)(C)) /*cast for solaris warning*/
+#define HDisupper(C)            isupper((int)(C)) /*cast for solaris warning*/
+#define HDisxdigit(C)           isxdigit((int)(C)) /*cast for solaris warning*/
+#define HDkill(P,S)             kill(P,S)
+#define HDlabs(X)               labs(X)
+#define HDldexp(X,N)            ldexp(X,N)
+#define HDldiv(X,Y)             ldiv(X,Y)
+#define HDlink(OLD,NEW)         link(OLD,NEW)
+#define HDlocaleconv()          localeconv()
+#define HDlocaltime(T)          localtime(T)
+#define HDlog(X)                log(X)
+#define HDlog10(X)              log10(X)
+#define HDlongjmp(J,N)          longjmp(J,N)
+#ifdef H5_HAVE_WIN32_API
+    #define HDlseek(F,O,W)  _lseeki64(F,O,W)
+#else
+    #ifdef H5_HAVE_LSEEK64
+        #define HDlseek(F,O,W)  lseek64(F,O,W)
+    #else
+        #define HDlseek(F,O,W)  lseek(F,O,W)
+    #endif
+#endif
+#define HDmalloc(Z)             malloc(Z)
+#define HDposix_memalign(P,A,Z) posix_memalign(P,A,Z)
+#define HDmblen(S,N)            mblen(S,N)
+#define HDmbstowcs(P,S,Z)       mbstowcs(P,S,Z)
+#define HDmbtowc(P,S,Z)         mbtowc(P,S,Z)
+#define HDmemchr(S,C,Z)         memchr(S,C,Z)
+#define HDmemcmp(X,Y,Z)         memcmp(X,Y,Z)
+/*
+ * The (char*) casts are required for the DEC when optimizations are turned
+ * on and the source and/or destination are not aligned.
+ */
+#define HDmemcpy(X,Y,Z)         memcpy((char*)(X),(const char*)(Y),Z)
+#define HDmemmove(X,Y,Z)        memmove((char*)(X),(const char*)(Y),Z)
+/*
+ * The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
+ */
+#ifdef H5_HAVE_VISUAL_STUDIO
+#define HDmemset(X,C,Z)         memset((void*)(X),C,Z)
+#else /* H5_HAVE_VISUAL_STUDIO */
+#define HDmemset(X,C,Z)         memset(X,C,Z)
+#endif /* H5_HAVE_VISUAL_STUDIO */
+#ifdef H5_HAVE_WIN32_API
+#define HDmkdir(S,M)            _mkdir(S)
+#else /* H5_HAVE_WIN32_API */
+#define HDmkdir(S,M)            mkdir(S,M)
+#endif /* H5_HAVE_WIN32_API */
+#define HDmkfifo(S,M)           mkfifo(S,M)
+#define HDmktime(T)             mktime(T)
+#define HDmodf(X,Y)             modf(X,Y)
+#ifdef _O_BINARY
+#define HDopen(S,F,M)           open(S,F|_O_BINARY,M)
+#else
+#define HDopen(S,F,M)           open(S,F,M)
+#endif
+#define HDopendir(S)            opendir(S)
+#define HDpathconf(S,N)         pathconf(S,N)
+#define HDpause()               pause()
+#define HDperror(S)             perror(S)
+#define HDpipe(F)               pipe(F)
+#define HDpow(X,Y)              pow(X,Y)
+/* printf() variable arguments */
+#define HDputc(C,F)             putc(C,F)
+#define HDputchar(C)            putchar(C)
+#define HDputs(S)               puts(S)
+#define HDqsort(M,N,Z,F)        qsort(M,N,Z,F)
+#define HDraise(N)              raise(N)
+
+#ifdef H5_HAVE_RAND_R
+#define HDrandom()              HDrand()
+H5_DLL int HDrand(void);
+#elif H5_HAVE_RANDOM
+#define HDrand()                random()
+#define HDrandom()              random()
+#else
+#define HDrand()                rand()
+#define HDrandom()              rand()
+#endif
+
+#define HDread(F,M,Z)           read(F,M,Z)
+#define HDreaddir(D)            readdir(D)
+#define HDrealloc(M,Z)          realloc(M,Z)
+#define HDremove(S)             remove(S)
+#define HDrename(OLD,NEW)       rename(OLD,NEW)
+#define HDrewind(F)             rewind(F)
+#define HDrewinddir(D)          rewinddir(D)
+#define HDrmdir(S)              rmdir(S)
+/* scanf() variable arguments */
+#define HDsetbuf(F,S)           setbuf(F,S)
+#define HDsetgid(G)             setgid(G)
+#define HDsetjmp(J)             setjmp(J)
+#define HDsetlocale(N,S)        setlocale(N,S)
+#define HDsetpgid(P,PG)         setpgid(P,PG)
+#define HDsetsid()              setsid()
+#define HDsetuid(U)             setuid(U)
+/* Windows does not permit setting the buffer size to values
+   less than 2.  */
+#ifndef H5_HAVE_WIN32_API
+#define HDsetvbuf(F,S,M,Z)      setvbuf(F,S,M,Z)
+#else
+#define HDsetvbuf(F,S,M,Z)  setvbuf(F,S,M,(Z>1?Z:2))
+#endif
+#define HDsigaddset(S,N)        sigaddset(S,N)
+#define HDsigdelset(S,N)        sigdelset(S,N)
+#define HDsigemptyset(S)        sigemptyset(S)
+#define HDsigfillset(S)         sigfillset(S)
+#define HDsigismember(S,N)      sigismember(S,N)
+#define HDsiglongjmp(J,N)       siglongjmp(J,N)
+#define HDsignal(N,F)           signal(N,F)
+#define HDsigpending(S)         sigpending(S)
+#define HDsigprocmask(H,S,O)    sigprocmask(H,S,O)
+#define HDsigsetjmp(J,N)        sigsetjmp(J,N)
+#define HDsigsuspend(S)         sigsuspend(S)
+#define HDsin(X)                sin(X)
+#define HDsinh(X)               sinh(X)
+#define HDsleep(N)              sleep(N)
+#ifdef H5_HAVE_WIN32_API
+H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...);
+#define HDsnprintf          c99_snprintf /*varargs*/
+#else
+#define HDsnprintf              snprintf /*varargs*/
+#endif
+/* sprintf() variable arguments */
+#define HDsqrt(X)               sqrt(X)
+#ifdef H5_HAVE_RAND_R
+H5_DLL void HDsrand(unsigned int seed);
+#define HDsrandom(S)            HDsrand(S)
+#elif H5_HAVE_RANDOM
+#define HDsrand(S)              srandom(S)
+#define HDsrandom(S)            srandom(S)
+#else
+#define HDsrand(S)              srand(S)
+#define HDsrandom(S)            srand(S)
+#endif
+/* sscanf() variable arguments */
+
+#ifdef H5_HAVE_WIN32_API
+#define HDstrcasecmp(A,B)   _stricmp(A,B)
+#else
+#define HDstrcasecmp(X,Y)      strcasecmp(X,Y)
+#endif
+#define HDstrcat(X,Y)           strcat(X,Y)
+#define HDstrchr(S,C)           strchr(S,C)
+#define HDstrcmp(X,Y)           strcmp(X,Y)
+#define HDstrcoll(X,Y)          strcoll(X,Y)
+#define HDstrcpy(X,Y)           strcpy(X,Y)
+#define HDstrcspn(X,Y)          strcspn(X,Y)
+#define HDstrerror(N)           strerror(N)
+#define HDstrftime(S,Z,F,T)     strftime(S,Z,F,T)
+#define HDstrlen(S)             strlen(S)
+#define HDstrncat(X,Y,Z)        strncat(X,Y,Z)
+#define HDstrncmp(X,Y,Z)        strncmp(X,Y,Z)
+#define HDstrncpy(X,Y,Z)        strncpy(X,Y,Z)
+#define HDstrpbrk(X,Y)          strpbrk(X,Y)
+#define HDstrrchr(S,C)          strrchr(S,C)
+#define HDstrspn(X,Y)           strspn(X,Y)
+#define HDstrstr(X,Y)           strstr(X,Y)
+#define HDstrtod(S,R)           strtod(S,R)
+#define HDstrtok(X,Y)           strtok(X,Y)
+#define HDstrtol(S,R,N)         strtol(S,R,N)
+H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
+#define HDstrtoul(S,R,N)        strtoul(S,R,N)
+#ifdef H5_HAVE_WIN32_API
+#define HDstrtoull(S,R,N)       _strtoui64(S,R,N)
+#else
+#define HDstrtoull(S,R,N)       strtoull(S,R,N)
+#endif
+#define HDstrxfrm(X,Y,Z)        strxfrm(X,Y,Z)
+#define HDsysconf(N)            sysconf(N)
+#define HDsystem(S)             system(S)
+#define HDtan(X)                tan(X)
+#define HDtanh(X)               tanh(X)
+#define HDtcdrain(F)            tcdrain(F)
+#define HDtcflow(F,A)           tcflow(F,A)
+#define HDtcflush(F,N)          tcflush(F,N)
+#define HDtcgetattr(F,T)        tcgetattr(F,T)
+#define HDtcgetpgrp(F)          tcgetpgrp(F)
+#define HDtcsendbreak(F,N)      tcsendbreak(F,N)
+#define HDtcsetattr(F,O,T)      tcsetattr(F,O,T)
+#define HDtcsetpgrp(F,N)        tcsetpgrp(F,N)
+#define HDtime(T)               time(T)
+#define HDtimes(T)              times(T)
+#define HDtmpfile()             tmpfile()
+#define HDtmpnam(S)             tmpnam(S)
+#define HDtolower(C)            tolower(C)
+#define HDtoupper(C)            toupper(C)
+#define HDttyname(F)            ttyname(F)
+#define HDtzset()               tzset()
+#define HDumask(N)              umask(N)
+#define HDuname(S)              uname(S)
+#define HDungetc(C,F)           ungetc(C,F)
+#ifdef H5_HAVE_WIN32_API
+#define HDunlink(S)             _unlink(S)
+#else
+#define HDunlink(S)             unlink(S)
+#endif
+#define HDutime(S,T)            utime(S,T)
+#define HDva_arg(A,T)           va_arg(A,T)
+#define HDva_end(A)             va_end(A)
+#define HDva_start(A,P)         va_start(A,P)
+#define HDvasprintf(RET,FMT,A)  vasprintf(RET,FMT,A)
+#define HDvfprintf(F,FMT,A)     vfprintf(F,FMT,A)
+#define HDvprintf(FMT,A)        vprintf(FMT,A)
+#define HDvsprintf(S,FMT,A)     vsprintf(S,FMT,A)
+#ifdef H5_HAVE_WIN32_API
+H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap);
+#define HDvsnprintf         c99_vsnprintf
+#else
+#   define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A)
+#endif
+#define HDwait(W)               wait(W)
+#define HDwaitpid(P,W,O)        waitpid(P,W,O)
+#define HDwcstombs(S,P,Z)       wcstombs(S,P,Z)
+#define HDwctomb(S,C)           wctomb(S,C)
+#define HDwrite(F,M,Z)          write(F,M,Z)
+
+/*
+ * And now for a couple non-Posix functions...  Watch out for systems that
+ * define these in terms of macros.
+ */
+#ifdef H5_HAVE_WIN32_API
+#define HDstrdup(S)    _strdup(S)
+#else /* H5_HAVE_WIN32_API */
+
+#if !defined strdup && !defined H5_HAVE_STRDUP
+extern char *strdup(const char *s);
+#endif
+
+#define HDstrdup(S)     strdup(S)
+
+#endif /* H5_HAVE_WIN32_API */
+
+/*
+ * HDF Boolean type.
+ */
+#ifndef FALSE
+#   define FALSE false
+#endif
+#ifndef TRUE
+#   define TRUE true
+#endif
+
+/** From h5test.h **/
+
+#ifdef H5_HAVE_PARALLEL
+extern MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
+#endif
+
+#ifdef H5_HAVE_PARALLEL
+H5TEST_DLL int h5_set_info_object(void);
+H5TEST_DLL void h5_dump_info_object(MPI_Info info);
+#endif
+
+
+
+/** From h5tools_utils.h **/
+
+extern int         opt_err;     /* getoption prints errors if this is on    */
+extern int         opt_ind;     /* token pointer                            */
+extern const char *opt_arg;     /* flag argument (or value)                 */
+
+
+enum {
+    no_arg = 0,         /* doesn't take an argument     */
+    require_arg,        /* requires an argument          */
+    optional_arg        /* argument is optional         */
+};
+
+
+typedef struct long_options {
+    const char  *name;          /* name of the long option              */
+    int          has_arg;       /* whether we should look for an arg    */
+    char         shortval;      /* the shortname equivalent of long arg
+                                 * this gets returned from get_option   */
+} long_options;
+
+extern int    get_option(int argc, const char **argv, const char *opt,
+                         const struct long_options *l_opt);
+
+extern int     nCols;               /*max number of columns for outputting  */
+
+/* Definitions of useful routines */
+extern void     print_version(const char *progname);
+
+#endif
diff --git a/tools/test/perform/sio_engine.c b/tools/test/perform/sio_engine.c
new file mode 100644
index 0000000..4fead3f
--- /dev/null
+++ b/tools/test/perform/sio_engine.c
@@ -0,0 +1,1320 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Author: Christian Chilan, April 2008
+ */
+
+#include "hdf5.h"
+
+#ifdef H5_STDC_HEADERS
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#ifdef H5_HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#include "sio_perf.h"
+
+/* Macro definitions */
+
+/* sizes of various items. these sizes won't change during program execution */
+#define ELMT_H5_TYPE        H5T_NATIVE_UCHAR
+
+#define GOTOERROR(errcode)  { ret_code = errcode; goto done; }
+#define ERRMSG(mesg) {                                                  \
+    fprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n",    \
+        mesg, (int)__LINE__, __FILE__);                             \
+}
+
+/* verify: if val is false (0), print mesg. */
+#define VRFY(val, mesg) do {                            \
+    if (!val) {                                         \
+    ERRMSG(mesg);                                   \
+    GOTOERROR(FAIL);                                \
+    }                                                   \
+} while(0)
+
+/* POSIX I/O macros */
+#define POSIXCREATE(fn)           HDopen(fn, O_CREAT|O_TRUNC|O_RDWR, 0600)
+#define POSIXOPEN(fn, F)          HDopen(fn, F, 0600)
+#define POSIXCLOSE(F)             HDclose(F)
+#define POSIXSEEK(F,L)            HDlseek(F, L, SEEK_SET)
+#define POSIXWRITE(F,B,S)         HDwrite(F,B,S)
+#define POSIXREAD(F,B,S)          HDread(F,B,S)
+
+enum {
+    SIO_CREATE = 1,
+    SIO_WRITE = 2,
+    SIO_READ = 4
+};
+
+/* Global variables */
+static int  clean_file_g = -1;  /*whether to cleanup temporary test     */
+/*files. -1 is not defined;             */
+/*0 is no cleanup; 1 is do cleanup      */
+
+/* the different types of file descriptors we can expect */
+typedef union _file_descr {
+    int         posixfd;    /* POSIX file handle*/
+    hid_t       h5fd;       /* HDF5 file        */
+} file_descr;
+
+/* local functions */
+static char  *sio_create_filename(iotype iot, const char *base_name,
+    char *fullname, size_t size, parameters *param);
+static herr_t do_write(results *res, file_descr *fd, parameters *parms, void *buffer);
+static herr_t do_read(results *res, file_descr *fd, parameters *parms, void *buffer);
+static herr_t dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
+static herr_t posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
+static herr_t dset_read(int localrank, file_descr *fd, parameters *parms, void *buffer, const char *buffer2);
+static herr_t posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer);
+static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/,
+    int flags);
+hid_t set_vfd(parameters *param);
+static herr_t do_fclose(iotype iot, file_descr *fd);
+static void do_cleanupfile(iotype iot, char *fname);
+
+/* global variables */
+static HDoff_t offset[MAX_DIMS];       /* dataset size in bytes     */
+static size_t buf_offset[MAX_DIMS];   /* dataset size in bytes     */
+static int order[MAX_DIMS];        /* dimension access order */
+static size_t      linear_buf_size;        /* linear buffer size     */
+static int         cont_dim;       /* lowest dimension for contiguous POSIX
+                                      access */
+static size_t      cont_size;      /* size of contiguous POSIX access */
+static hid_t       fapl;           /* file access list */
+static unsigned char *buf_p;       /* buffer pointer */
+static const char *multi_letters = "msbrglo"; /* string for multi driver */
+
+/* HDF5 global variables */
+static hsize_t     h5count[MAX_DIMS];      /*selection count               */
+static hssize_t    h5offset[MAX_DIMS];     /* Selection offset within dataspace */
+static hid_t       h5dset_space_id = -1;   /*dataset space ID              */
+static hid_t       h5mem_space_id = -1;    /*memory dataspace ID           */
+static hid_t       h5ds_id = -1;           /*dataset handle                */
+static hid_t       h5dcpl = -1;            /* Dataset creation property list */
+static hid_t       h5dxpl = -1;            /* Dataset transfer property list */
+
+/*
+ * Function:        do_sio
+ * Purpose:         SIO Engine where IO are executed.
+ * Return:          results
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+void
+do_sio(parameters param, results *res)
+{
+    char       *buffer = NULL; /*data buffer pointer           */
+    size_t      buf_size[MAX_DIMS];     /* general buffer size in bytes     */
+    file_descr  fd;                     /* file handles */
+    iotype      iot;                    /* API type */
+    char base_name[256];                /* test file base name */
+    /* return codes */
+    herr_t      ret_code = 0;   /*return code                           */
+
+    char        fname[FILENAME_MAX];    /* test file name */
+    int     i;
+    /* HDF5 variables */
+    herr_t          hrc;        /*HDF5 return code              */
+
+    /* Sanity check parameters */
+
+    /* IO type */
+    iot = param.io_type;
+
+    switch (iot) {
+    case POSIXIO:
+        fd.posixfd = -1;
+        res->timers = io_time_new(SYS_CLOCK);
+        break;
+    case HDF5:
+        fd.h5fd = -1;
+        res->timers = io_time_new(SYS_CLOCK);
+        break;
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
+        GOTOERROR(FAIL);
+    }
+
+    linear_buf_size = 1;
+
+    for (i=0; i<param.rank; i++){
+        buf_size[i] = param.buf_size[i];
+        order[i] = param.order[i];
+        linear_buf_size *= buf_size[i];
+        buf_offset[i] = 0;
+        offset[i] = 0;
+
+        /* Validate transfer buffer size */
+        if (param.buf_size[i]<=0) {
+            HDfprintf(stderr,
+            "Transfer buffer size[%d] (%zu) must be > 0\n", i,buf_size[i]);
+            GOTOERROR(FAIL);
+        }
+
+        if ((param.dset_size[i]%param.buf_size[i])!=0) {
+            HDfprintf(stderr,
+            "Dataset size[%d] (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
+            "trasfer buffer size[%d] (%zu)\n",param.rank,
+            (long long)param.dset_size[i], param.rank, param.buf_size[i]);
+            GOTOERROR(FAIL);
+        }
+
+    }
+
+    /* Allocate transfer buffer */
+    if ((buffer = (char *)malloc(linear_buf_size)) == NULL){
+        HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n", linear_buf_size);
+        GOTOERROR(FAIL);
+    }
+
+    if (sio_debug_level >= 4)
+
+    /* output all of the times for all iterations */
+        fprintf(output, "Timer details:\n");
+
+    /*
+     * Write performance measurement
+     */
+    /* Open file for write */
+
+    HDstrcpy(base_name, "#sio_tmp");
+    sio_create_filename(iot, base_name, fname, sizeof(fname), &param);
+
+    if (sio_debug_level > 0)
+        HDfprintf(output, "data filename=%s\n",
+             fname);
+
+    set_time(res->timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
+    hrc = do_fopen(&param, fname, &fd, SIO_CREATE | SIO_WRITE);
+    VRFY((hrc == SUCCESS), "do_fopen failed");
+
+    set_time(res->timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
+    hrc = do_write(res, &fd, &param, buffer);
+    set_time(res->timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
+    VRFY((hrc == SUCCESS), "do_write failed");
+
+    /* Close file for write */
+    hrc = do_fclose(iot, &fd);
+    set_time(res->timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
+    VRFY((hrc == SUCCESS), "do_fclose failed");
+
+    if (!param.h5_write_only) {
+        /*
+         * Read performance measurement
+         */
+
+        /* Open file for read */
+        set_time(res->timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
+        hrc = do_fopen(&param, fname, &fd, SIO_READ);
+        VRFY((hrc == SUCCESS), "do_fopen failed");
+
+        set_time(res->timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
+        hrc = do_read(res, &fd, &param, buffer);
+        set_time(res->timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
+        VRFY((hrc == SUCCESS), "do_read failed");
+
+        /* Close file for read */
+        hrc = do_fclose(iot, &fd);
+
+        set_time(res->timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
+        VRFY((hrc == SUCCESS), "do_fclose failed");
+    }
+
+    do_cleanupfile(iot, fname);
+
+done:
+    /* clean up */
+    /* release HDF5 objects */
+
+    /* close any opened files */
+    /* no remove(fname) because that should have happened normally. */
+    switch (iot) {
+        case POSIXIO:
+            if (fd.posixfd != -1)
+                hrc = do_fclose(iot, &fd);
+            break;
+        case HDF5:
+            if (fd.h5fd != -1)
+                hrc = do_fclose(iot, &fd);
+			break;
+        default:
+            /* unknown request */
+            HDassert(0 && "Unknown IO type");
+            break;
+    }
+
+    /* release generic resources */
+    if (buffer)
+        free(buffer);
+
+    res->ret_code = ret_code;
+}
+
+/*
+ * Function:    sio_create_filename
+ * Purpose:     Create a new filename to write to. Determine the correct
+ *              suffix to append to the filename by the type of I/O we're
+ *              doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
+ *              USER or LOGIN are specified in the environment.
+ * Return:      Pointer to filename or NULL
+ * Programmer:  Bill Wendling, 21. November 2001
+ * Modifications: Support for file drivers. Christian Chilan, April, 2008
+ */
+    static char *
+sio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size, parameters *param)
+{
+    const char *prefix, *suffix="";
+    char *ptr, last = '\0';
+    size_t i, j;
+    vfdtype vfd;
+    vfd = param->vfd;
+
+    if (!base_name || !fullname || size < 1)
+    return NULL;
+
+    memset(fullname, 0, size);
+
+    switch (iot) {
+    case POSIXIO:
+        suffix = ".posix";
+        break;
+    case HDF5:
+        suffix = ".h5";
+        if (vfd == family)
+            suffix = "%05d.h5";
+        else if (vfd == multi)
+            suffix = NULL;
+        break;
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
+        HDassert(0 && "Unknown IO type");
+        break;
+    }
+
+    /* First use the environment variable and then try the constant */
+    prefix = HDgetenv("HDF5_PREFIX");
+
+#ifdef HDF5_PREFIX
+    if (!prefix)
+    prefix = HDF5_PREFIX;
+#endif  /* HDF5_PREFIX */
+
+    /* Prepend the prefix value to the base name */
+    if (prefix && *prefix) {
+    /* If the prefix specifies the HDF5_PREFIX directory, then
+     * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
+     * directory instead. */
+    register char *user, *login, *subdir;
+
+    user = HDgetenv("USER");
+    login = HDgetenv("LOGIN");
+    subdir = (user ? user : login);
+
+    if (subdir) {
+        for (i = 0; i < size-1 && prefix[i]; i++)
+        fullname[i] = prefix[i];
+
+        fullname[i++] = '/';
+
+        for (j = 0; i < size && subdir[j]; i++, j++)
+        fullname[i] = subdir[j];
+    } else {
+        /* We didn't append the prefix yet */
+        HDstrncpy(fullname, prefix, size);
+        fullname[size - 1] = '\0';
+    }
+
+    if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
+        /* Append the base_name with a slash first. Multiple slashes are
+         * handled below. */
+        h5_stat_t buf;
+
+        if (HDstat(fullname, &buf) < 0)
+        /* The directory doesn't exist just yet */
+        if (HDmkdir(fullname, 0755) < 0 && errno != EEXIST) {
+            /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
+             * Default to PREFIX's original prefix value. */
+            HDstrcpy(fullname, prefix);
+        }
+
+        HDstrcat(fullname, "/");
+        HDstrcat(fullname, base_name);
+    } else {
+        /* Buffer is too small */
+        return NULL;
+    }
+    } else if (strlen(base_name) >= size) {
+    /* Buffer is too small */
+        return NULL;
+    } else {
+        HDstrcpy(fullname, base_name);
+    }
+
+    /* Append a suffix */
+    if (suffix) {
+        if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
+            return NULL;
+
+        HDstrcat(fullname, suffix);
+    }
+
+    /* Remove any double slashes in the filename */
+    for (ptr = fullname, i = j = 0; ptr && (i < size); i++, ptr++) {
+        if (*ptr != '/' || last != '/')
+            fullname[j++] = *ptr;
+
+        last = *ptr;
+    }
+
+    return fullname;
+}
+
+/*
+ * Function:        do_write
+ * Purpose:         Write the required amount of data to the file.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+static herr_t
+do_write(results *res, file_descr *fd, parameters *parms, void *buffer)
+{
+    int         ret_code = SUCCESS;
+    char        dname[64];
+    int        i;
+    size_t     u;
+    /* HDF5 variables */
+    herr_t      hrc;                    /*HDF5 return code              */
+    hsize_t     h5dims[MAX_DIMS];       /*dataset dim sizes             */
+    hsize_t     h5chunk[MAX_DIMS];      /*dataset dim sizes             */
+    hsize_t     h5block[MAX_DIMS];      /*dataspace selection           */
+    hsize_t     h5stride[MAX_DIMS];     /*selection stride              */
+    hsize_t     h5start[MAX_DIMS];      /*selection start               */
+    hsize_t     h5maxdims[MAX_DIMS];
+    int         rank;                   /*rank of dataset */
+
+    /* Prepare buffer for verifying data */
+/*    if (parms->verify)
+            memset(buffer,1,linear_buf_size); */
+
+    buf_p=(unsigned char *)buffer;
+
+    for(u = 0; u < linear_buf_size; u++)
+        buf_p[u] = u % 128;
+
+    rank = parms->rank;
+
+    for(i = 0; i < rank; i++)
+        h5offset[i] = offset[i] = 0;
+
+    /* I/O Access specific setup */
+    switch (parms->io_type) {
+    case POSIXIO:
+
+            /* determine lowest dimension for contiguous POSIX access */
+            cont_dim = rank;
+
+            for (i=rank-1; i>=0; i--) {
+                if (parms->buf_size[i]==parms->dset_size[i])
+                    cont_dim = i;
+                else
+                    break;
+            }
+
+            /* determine size of the contiguous POSIX access */
+            cont_size = (!cont_dim)? 1 : parms->buf_size[cont_dim-1];
+            for (i=cont_dim; i<rank; i++)
+                cont_size *= parms->buf_size[i];
+
+        break;
+
+    case HDF5: /* HDF5 setup */
+
+        for (i=0; i < rank; i++){
+            h5dims[i] = parms->dset_size[i];
+            h5start[i] = 0;
+            h5stride[i] = 1;
+            h5block[i] = 1;
+            h5count[i] = parms->buf_size[i];
+            h5chunk[i] = parms->chk_size[i];
+            h5maxdims[i] = H5S_UNLIMITED;
+
+        }
+
+        if (parms->h5_use_chunks && parms->h5_extendable) {
+            h5dset_space_id = H5Screate_simple(rank, h5count, h5maxdims);
+            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+        }
+        else {
+            h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
+            VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+        }
+
+        hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                    h5start, h5stride, h5count, h5block);
+        VRFY((hrc >= 0), "H5Sselect_hyperslab");
+
+        /* Create the memory dataspace that corresponds to the xfer buffer */
+        h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
+        VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+
+        /* Create the dataset transfer property list */
+        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
+        if (h5dxpl < 0) {
+            fprintf(stderr, "HDF5 Property List Create failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        break;
+
+    default:
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+        GOTOERROR(FAIL);
+        break;
+    } /* end switch */
+
+
+    /* create dataset */
+    switch (parms->io_type) {
+        case POSIXIO:
+        break;
+
+        case HDF5:
+            h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+        if (h5dcpl < 0) {
+            fprintf(stderr, "HDF5 Property List Create failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        if(parms->h5_use_chunks) {
+        /* Set the chunk size to be the same as the buffer size */
+            hrc = H5Pset_chunk(h5dcpl, rank, h5chunk);
+            if (hrc < 0) {
+                fprintf(stderr, "HDF5 Property List Set failed\n");
+                GOTOERROR(FAIL);
+            } /* end if */
+        } /* end if */
+
+        sprintf(dname, "Dataset_%ld", (unsigned long)parms->num_bytes);
+        h5ds_id = H5Dcreate2(fd->h5fd, dname, ELMT_H5_TYPE,
+            h5dset_space_id, H5P_DEFAULT, h5dcpl, H5P_DEFAULT);
+
+        if (h5ds_id < 0) {
+            HDfprintf(stderr, "HDF5 Dataset Create failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        hrc = H5Pclose(h5dcpl);
+        /* verifying the close of the dcpl */
+        if (hrc < 0) {
+            HDfprintf(stderr, "HDF5 Property List Close failed\n");
+            GOTOERROR(FAIL);
+        }
+        break;
+
+        default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+        GOTOERROR(FAIL);
+        break;
+    }
+
+    /* Start "raw data" write timer */
+    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
+
+    /* Perform write */
+    hrc = dset_write(rank-1, fd, parms, buffer);
+
+    if (hrc < 0) {
+        fprintf(stderr, "Error in dataset write\n");
+        GOTOERROR(FAIL);
+    }
+
+
+    /* Stop "raw data" write timer */
+    set_time(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
+
+    /* Calculate write time */
+
+    /* Close dataset. Only HDF5 needs to do an explicit close. */
+    if (parms->io_type == HDF5) {
+        hrc = H5Dclose(h5ds_id);
+
+        if (hrc < 0) {
+            fprintf(stderr, "HDF5 Dataset Close failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        h5ds_id = -1;
+    } /* end if */
+
+done:
+
+    /* release HDF5 objects */
+    if (h5dset_space_id != -1) {
+        hrc = H5Sclose(h5dset_space_id);
+        if (hrc < 0){
+            fprintf(stderr, "HDF5 Dataset Space Close failed\n");
+            ret_code = FAIL;
+        } else {
+            h5dset_space_id = -1;
+        }
+    }
+
+    if (h5mem_space_id != -1) {
+        hrc = H5Sclose(h5mem_space_id);
+        if (hrc < 0) {
+            fprintf(stderr, "HDF5 Memory Space Close failed\n");
+            ret_code = FAIL;
+        } else {
+            h5mem_space_id = -1;
+        }
+    }
+
+    if (h5dxpl != -1) {
+        hrc = H5Pclose(h5dxpl);
+        if (hrc < 0) {
+            fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
+            ret_code = FAIL;
+        } else {
+            h5dxpl = -1;
+        }
+    }
+
+    return ret_code;
+}
+
+/*
+ * Function:        dset_write
+ * Purpose:         Write buffer into the dataset.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+static herr_t
+dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
+{
+    int cur_dim = order[local_dim]-1;
+    int         ret_code = SUCCESS;
+    int         k;
+    hsize_t  dims[MAX_DIMS], maxdims[MAX_DIMS];
+    hsize_t i;
+    int j;
+    herr_t hrc;
+
+    /* iterates according to the dimensions in order array */
+    for (i=0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]){
+
+        h5offset[cur_dim] = (hssize_t)i;
+        offset[cur_dim] = (HDoff_t)i;
+
+        if (local_dim > 0){
+
+            dset_write(local_dim-1, fd, parms, buffer);
+
+        }else{
+
+            switch (parms->io_type) {
+
+            case POSIXIO:
+                /* initialize POSIX offset in the buffer */
+                for(j = 0; j < parms->rank; j++)
+                    buf_offset[j] = 0;
+                buf_p = (unsigned char *)buffer;
+                /* write POSIX buffer */
+                posix_buffer_write(0, fd, parms, buffer);
+                break;
+
+            case HDF5:
+                /* if dimensions are extendable, extend them as needed during access */
+                if (parms->h5_use_chunks && parms->h5_extendable) {
+
+                    hrc=H5Sget_simple_extent_dims(h5dset_space_id,dims,maxdims);
+                    VRFY((hrc >= 0), "H5Sget_simple_extent_dims");
+
+                    for (k=0; k < parms->rank; k++){
+
+                        HDassert(h5offset[k] >= 0);
+                        if (dims[k] <= (hsize_t)h5offset[k]) {
+                            dims[k] = dims[k]+h5count[k];
+                            hrc=H5Sset_extent_simple(h5dset_space_id,parms->rank,dims,maxdims);
+                            VRFY((hrc >= 0), "H5Sset_extent_simple");
+                            hrc=H5Dset_extent(h5ds_id,dims);
+                            VRFY((hrc >= 0), "H5Dextend");
+                        }
+                    }
+                }
+                /* applies offset */
+                hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+                VRFY((hrc >= 0), "H5Soffset_simple");
+
+                /* Write the buffer out */
+                hrc=H5Sget_simple_extent_dims(h5dset_space_id,dims,maxdims);
+                hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                    h5dset_space_id, h5dxpl, buffer);
+                VRFY((hrc >= 0), "H5Dwrite");
+
+                break;
+				
+            default:
+                /* unknown request */
+                HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+                HDassert(0 && "Unknown IO type");
+                break;
+            } /* switch (parms->io_type) */
+        }
+    }
+done:
+    return ret_code;
+}
+
+/*
+ * Function:        posix_buffer_write
+ * Purpose:         Write buffer into the POSIX file considering contiguity.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+
+static herr_t
+posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
+{
+    int         ret_code = SUCCESS;
+
+    /* if dimension is not contiguous, call recursively */
+    if (local_dim < parms->rank-1 && local_dim != cont_dim) {
+        size_t u;
+
+        for(u = 0; u < parms->buf_size[local_dim]; u ++) {
+            buf_offset[local_dim] = u;
+            posix_buffer_write(local_dim+1, fd, parms, buffer);
+
+            /* if next dimension is cont_dim, it will fill out the buffer
+               traversing the entire dimension local_dim without the need
+               of performing iteration */
+            if (local_dim+1==cont_dim)
+                break;
+        }
+    /* otherwise, perform contiguous POSIX access */
+    } else {
+        HDoff_t d_offset;
+        HDoff_t linear_dset_offset = 0;
+        int i, j, rc;
+
+        buf_offset[local_dim] = 0;
+
+        /* determine offset in the buffer */
+        for(i = 0; i < parms->rank; i++) {
+            d_offset = 1;
+
+            for(j = i + 1; j < parms->rank; j++)
+                d_offset *= (HDoff_t)parms->dset_size[j];
+
+            linear_dset_offset += (offset[i] + (HDoff_t)buf_offset[i]) * d_offset;
+        }
+
+        /* only care if seek returns error */
+        rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
+        VRFY((rc==0), "POSIXSEEK");
+        /* check if all bytes are written */
+        rc = ((ssize_t)cont_size ==
+             POSIXWRITE(fd->posixfd, buf_p, cont_size));
+        VRFY((rc != 0), "POSIXWRITE");
+
+        /* Advance location in buffer */
+        buf_p += cont_size;
+
+    }
+
+done:
+    return ret_code;
+}
+
+/*
+ * Function:        do_read
+ * Purpose:         Read the required amount of data to the file.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+static herr_t
+do_read(results *res, file_descr *fd, parameters *parms, void *buffer)
+{
+    char        *buffer2 = NULL;       /* Buffer for data verification */
+    int         ret_code = SUCCESS;
+    char        dname[64];
+    int         i;
+    size_t      u;
+    /* HDF5 variables */
+    herr_t      hrc;                    /*HDF5 return code              */
+    hsize_t     h5dims[MAX_DIMS];       /*dataset dim sizes             */
+    hsize_t     h5block[MAX_DIMS];      /*dataspace selection           */
+    hsize_t     h5stride[MAX_DIMS];     /*selection stride              */
+    hsize_t     h5start[MAX_DIMS];      /*selection start               */
+    int         rank;
+
+    /* Allocate data verification buffer */
+    if(NULL == (buffer2 = (char *)malloc(linear_buf_size))) {
+        HDfprintf(stderr, "malloc for data verification buffer size (%Zu) failed\n", linear_buf_size);
+        GOTOERROR(FAIL);
+    } /* end if */
+
+    /* Prepare buffer for verifying data */
+    for(u = 0; u < linear_buf_size; u++)
+        buffer2[u] = (char)(u % 128);
+
+    rank = parms->rank;
+    for(i = 0; i < rank; i++)
+        h5offset[i] = offset[i] = 0;
+
+    /* I/O Access specific setup */
+    switch (parms->io_type) {
+    case POSIXIO:
+            cont_dim = rank;
+
+            for (i=rank-1; i>=0; i--) {
+                if (parms->buf_size[i]==parms->dset_size[i])
+                    cont_dim = i;
+                else
+                    break;
+            }
+            cont_size = (!cont_dim)? 1 : parms->buf_size[cont_dim-1];
+            for (i=cont_dim; i<rank; i++)
+                cont_size *= parms->buf_size[i];
+
+        break;
+
+    case HDF5: /* HDF5 setup */
+        for (i=0; i < rank; i++){
+            h5dims[i] = parms->dset_size[i];
+            h5start[i] = 0;
+            h5stride[i] = 1;
+            h5block[i] = 1;
+            h5count[i] = parms->buf_size[i];
+        }
+
+        h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
+        VRFY((h5dset_space_id >= 0), "H5Screate_simple");
+
+        hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET,
+                    h5start, h5stride, h5count, h5block);
+        VRFY((hrc >= 0), "H5Sselect_hyperslab");
+
+        /* Create the memory dataspace that corresponds to the xfer buffer */
+        h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
+        VRFY((h5mem_space_id >= 0), "H5Screate_simple");
+
+        /* Create the dataset transfer property list */
+        h5dxpl = H5Pcreate(H5P_DATASET_XFER);
+        if (h5dxpl < 0) {
+            fprintf(stderr, "HDF5 Property List Create failed\n");
+            GOTOERROR(FAIL);
+        }
+        break;
+
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+        GOTOERROR(FAIL);
+        break;
+    } /* end switch */
+
+
+    /* create dataset */
+    switch (parms->io_type) {
+        case POSIXIO:
+        break;
+
+        case HDF5:
+        sprintf(dname, "Dataset_%ld", (long)parms->num_bytes);
+        h5ds_id = H5Dopen2(fd->h5fd, dname, H5P_DEFAULT);
+        if (h5ds_id < 0) {
+            HDfprintf(stderr, "HDF5 Dataset open failed\n");
+            GOTOERROR(FAIL);
+        }
+        break;
+		
+        default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+        GOTOERROR(FAIL);
+        break;
+    } /* end switch */
+
+    /* Start "raw data" read timer */
+    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
+    hrc = dset_read(rank-1, fd, parms, buffer, buffer2);
+
+    if (hrc < 0) {
+        fprintf(stderr, "Error in dataset read\n");
+        GOTOERROR(FAIL);
+    }
+
+    /* Stop "raw data" read timer */
+    set_time(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
+
+    /* Calculate read time */
+
+    /* Close dataset. Only HDF5 needs to do an explicit close. */
+    if (parms->io_type == HDF5) {
+        hrc = H5Dclose(h5ds_id);
+
+        if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        h5ds_id = -1;
+    } /* end if */
+
+done:
+
+    /* release HDF5 objects */
+    if (h5dset_space_id != -1) {
+    hrc = H5Sclose(h5dset_space_id);
+    if (hrc < 0){
+        fprintf(stderr, "HDF5 Dataset Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dset_space_id = -1;
+    }
+    }
+
+    if (h5mem_space_id != -1) {
+    hrc = H5Sclose(h5mem_space_id);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Memory Space Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5mem_space_id = -1;
+    }
+    }
+
+    if (h5dxpl != -1) {
+    hrc = H5Pclose(h5dxpl);
+    if (hrc < 0) {
+        fprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
+        ret_code = FAIL;
+    } else {
+        h5dxpl = -1;
+    }
+    }
+
+    /* release generic resources */
+    if(buffer2)
+        free(buffer2);
+
+    return ret_code;
+}
+
+/*
+ * Function:        dset_read
+ * Purpose:         Read buffer into the dataset.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+
+static herr_t
+dset_read(int local_dim, file_descr *fd, parameters *parms, void *buffer,
+    const char *buffer2)
+{
+    int cur_dim = order[local_dim]-1;
+    hsize_t i;
+    int j;
+    herr_t hrc;
+    int         ret_code = SUCCESS;
+
+    /* iterate on the current dimension */
+    for (i=0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]){
+
+        h5offset[cur_dim] = (hssize_t)i;
+        offset[cur_dim] = (HDoff_t)i;
+
+        /* if traverse in order array is incomplete, recurse */
+        if (local_dim > 0){
+
+            ret_code = dset_read(local_dim-1, fd, parms, buffer, buffer2);
+
+        /* otherwise, write buffer into dataset */
+        }else{
+
+            switch (parms->io_type) {
+
+            case POSIXIO:
+                for (j=0; j<parms->rank; j++) {
+                   buf_offset[j] = 0;
+                }
+                buf_p = (unsigned char*)buffer;
+                posix_buffer_read(0, fd, parms, buffer);
+                break;
+
+            case HDF5:
+                hrc = H5Soffset_simple(h5dset_space_id, h5offset);
+                VRFY((hrc >= 0), "H5Soffset_simple");
+                /* Read the buffer out */
+                hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id,
+                    h5dset_space_id, h5dxpl, buffer);
+                VRFY((hrc >= 0), "H5Dread");
+                break;
+				
+            default:
+                /* unknown request */
+                HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
+                HDassert(0 && "Unknown IO type");
+                break;
+            } /* switch (parms->io_type) */
+        }
+    }
+done:
+    return ret_code;
+}
+
+/*
+ * Function:        posix_buffer_read
+ * Purpose:         Read buffer into the POSIX file considering contiguity.
+ * Return:          SUCCESS or FAIL
+ * Programmer:      Christian Chilan, April, 2008
+ * Modifications:
+ */
+
+static herr_t
+posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer)
+{
+    int         ret_code = SUCCESS;
+
+    /* if local dimension is not contiguous, recurse */
+    if (local_dim < parms->rank-1 && local_dim != cont_dim) {
+        size_t u;
+
+        for(u = 0; u < parms->buf_size[local_dim]; u++) {
+            buf_offset[local_dim] = u;
+            ret_code = posix_buffer_read(local_dim+1, fd, parms, buffer);
+            if (local_dim+1==cont_dim)
+                break;
+        }
+    /* otherwise, perform contiguous POSIX access */
+    } else {
+        HDoff_t d_offset;
+        HDoff_t linear_dset_offset = 0;
+        int i, j, rc;
+
+        buf_offset[local_dim] = 0;
+        /* determine offset in buffer */
+        for (i=0; i<parms->rank; i++){
+            d_offset=1;
+
+            for (j=i+1; j<parms->rank; j++)
+                d_offset *= (HDoff_t)parms->dset_size[j];
+
+            linear_dset_offset += (offset[i] + (HDoff_t)buf_offset[i]) * d_offset;
+        }
+
+        /* only care if seek returns error */
+        rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
+        VRFY((rc==0), "POSIXSEEK");
+        /* check if all bytes are read */
+        rc = ((ssize_t)cont_size ==
+             POSIXREAD(fd->posixfd, buf_p, cont_size));
+        VRFY((rc != 0), "POSIXREAD");
+
+        /* Advance location in buffer */
+        buf_p += cont_size;
+
+    }
+done:
+    return ret_code;
+}
+
+
+/*
+ * Function:    do_fopen
+ * Purpose:     Open the specified file.
+ * Return:      SUCCESS or FAIL
+ * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
+ * Modifications: Support for file drivers, Christian Chilan, April, 2008
+ */
+    static herr_t
+do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
+{
+    int ret_code = SUCCESS;
+    hid_t fcpl;
+
+    switch (param->io_type) {
+    case POSIXIO:
+        if (flags & (SIO_CREATE | SIO_WRITE))
+            fd->posixfd = POSIXCREATE(fname);
+        else
+            fd->posixfd = POSIXOPEN(fname, O_RDONLY);
+
+        if (fd->posixfd < 0 ) {
+            HDfprintf(stderr, "POSIX File Open failed(%s)\n", fname);
+            GOTOERROR(FAIL);
+        }
+
+        break;
+
+    case HDF5:
+
+        fapl = set_vfd(param);
+
+        if (fapl < 0) {
+            fprintf(stderr, "HDF5 Property List Create failed\n");
+            GOTOERROR(FAIL);
+        }
+
+        fcpl = H5Pcreate(H5P_FILE_CREATE);
+        if(param->page_size) {
+            H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1);
+            H5Pset_file_space_page_size(fcpl, param->page_size);
+            if(param->page_buffer_size)
+                H5Pset_page_buffer_size(fapl, param->page_buffer_size, 0, 0);
+        }
+
+        /* create the parallel file */
+        if (flags & (SIO_CREATE | SIO_WRITE)) {
+            fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, fapl);
+        } else {
+            fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
+        }
+
+
+        if (fd->h5fd < 0) {
+            fprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
+            GOTOERROR(FAIL);
+        }
+        break;
+		
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)param->io_type);
+        GOTOERROR(FAIL);
+        break;
+    }
+
+done:
+    return ret_code;
+}
+
+/*
+ * Function:    set_vfd
+ * Purpose:     Sets file driver.
+ * Return:      SUCCESS or FAIL
+ * Programmer:  Christian Chilan, April, 2008
+ * Modifications:
+ */
+
+hid_t
+set_vfd(parameters *param)
+{
+    hid_t my_fapl = -1;
+    vfdtype  vfd;
+
+    vfd = param->vfd;
+
+    if ((my_fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1;
+
+    if (vfd == sec2) {
+        /* Unix read() and write() system calls */
+        if (H5Pset_fapl_sec2(my_fapl)<0) return -1;
+    } else if (vfd == stdio) {
+        /* Standard C fread() and fwrite() system calls */
+        if (H5Pset_fapl_stdio(my_fapl)<0) return -1;
+    } else if (vfd == core) {
+        /* In-core temporary file with 1MB increment */
+        if (H5Pset_fapl_core(my_fapl, (size_t)1024*1024, TRUE)<0) return -1;
+    } else if (vfd == split) {
+        /* Split meta data and raw data each using default driver */
+        if (H5Pset_fapl_split(my_fapl,
+                              "-m.h5", H5P_DEFAULT,
+                              "-r.h5", H5P_DEFAULT)<0)
+            return -1;
+    } else if (vfd == multi) {
+        /* Multi-file driver, general case of the split driver */
+        H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
+        hid_t memb_fapl[H5FD_MEM_NTYPES];
+        const char *memb_name[H5FD_MEM_NTYPES];
+        char sv[H5FD_MEM_NTYPES][1024];
+        haddr_t memb_addr[H5FD_MEM_NTYPES];
+        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);
+
+        HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
+        for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+            memb_fapl[mt] = H5P_DEFAULT;
+            sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
+            memb_name[mt] = sv[mt];
+            memb_addr[mt] = (haddr_t)MAX(mt - 1,0) * (HADDR_MAX / 10);
+        }
+
+        if (H5Pset_fapl_multi(my_fapl, memb_map, memb_fapl, memb_name,
+                              memb_addr, FALSE)<0) {
+            return -1;
+        }
+    } else if (vfd == family) {
+        hsize_t fam_size = 1*1024*1024; /*100 MB*/
+
+        /* Family of files, each 1MB and using the default driver */
+        /* if ((val=HDstrtok(NULL, " \t\n\r")))
+            fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024); */
+        if (H5Pset_fapl_family(my_fapl, fam_size, H5P_DEFAULT)<0)
+            return -1;
+    } else if (vfd == direct) {
+#ifdef H5_HAVE_DIRECT
+        /* Linux direct read() and write() system calls.  Set memory boundary, file block size,
+         * and copy buffer size to the default values. */
+        if (H5Pset_fapl_direct(my_fapl, 1024, 4096, 8*4096)<0) return -1;
+#endif
+    } else {
+        /* Unknown driver */
+        return -1;
+    }
+
+    return my_fapl;
+}
+
+/*
+ * Function:    do_fclose
+ * Purpose:     Close the specified file descriptor.
+ * Return:      SUCCESS or FAIL
+ * Programmer:  Albert Cheng, Bill Wendling, 2001/12/13
+ * Modifications:
+ */
+    static herr_t
+do_fclose(iotype iot, file_descr *fd /*out*/)
+{
+    herr_t ret_code = SUCCESS, hrc;
+    int  rc = 0;
+
+    switch (iot) {
+    case POSIXIO:
+        rc = POSIXCLOSE(fd->posixfd);
+
+        if (rc != 0){
+        fprintf(stderr, "POSIX File Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        fd->posixfd = -1;
+        break;
+
+    case HDF5:
+        hrc = H5Fclose(fd->h5fd);
+
+        if (hrc < 0) {
+        fprintf(stderr, "HDF5 File Close failed\n");
+        GOTOERROR(FAIL);
+        }
+
+        fd->h5fd = -1;
+        break;
+		
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
+        GOTOERROR(FAIL);
+        break;
+    }
+
+done:
+    return ret_code;
+}
+
+
+/*
+ * Function:    do_cleanupfile
+ * Purpose:     Cleanup temporary file unless HDF5_NOCLEANUP is set.
+ * Return:      void
+ * Programmer:  Albert Cheng 2001/12/12
+ * Modifications: Support for file drivers. Christian Chilan, April, 2008
+ */
+    static void
+do_cleanupfile(iotype iot, char *filename)
+{
+    char        temp[2048];
+    int         j;
+    hid_t       driver;
+
+    if (clean_file_g == -1)
+    clean_file_g = (HDgetenv("HDF5_NOCLEANUP")==NULL) ? 1 : 0;
+
+    if (clean_file_g){
+
+    switch (iot) {
+    case POSIXIO:
+          HDremove(filename);
+        break;
+
+    case HDF5:
+           driver = H5Pget_driver(fapl);
+
+            if (driver == H5FD_FAMILY) {
+                for (j = 0; /*void*/; j++) {
+                    HDsnprintf(temp, sizeof temp, filename, j);
+
+                    if (HDaccess(temp, F_OK) < 0)
+                        break;
+
+                    HDremove(temp);
+                }
+            } else if (driver == H5FD_CORE) {
+                hbool_t backing;        /* Whether the core file has backing store */
+
+                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;
+                assert(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*/
+                }
+            } else {
+                HDremove(filename);
+            }
+            H5Pclose(fapl);
+        break;
+			
+    default:
+        /* unknown request */
+        HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
+        HDassert(0 && "Unknown IO type");
+        break;
+    }
+    }
+}
+
diff --git a/tools/test/perform/sio_perf.c b/tools/test/perform/sio_perf.c
new file mode 100644
index 0000000..e77b99e
--- /dev/null
+++ b/tools/test/perform/sio_perf.c
@@ -0,0 +1,1428 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Serial HDF5 Performance Testing Code
+ * --------------------------------------
+ *
+ * Portable code to test performance on the different platforms we support.
+ * This is what the report should look like:
+ *
+ *  nprocs = Max#Procs
+ *      IO API = POSIXIO
+ *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *
+ *          . . .
+ *
+ *
+ *      IO API = HDF5
+ *          # Files = 1, # of dsets = 1000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *          # Files = 1, # of dsets = 3000, Elements per dset = 37000
+ *              Write Results = x MB/s
+ *              Read Results = x MB/s
+ *
+ *          . . .
+ *
+ *
+ *      . . .
+ *
+ */
+
+/* system header files */
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "hdf5.h"
+
+
+/* our header files */
+#include "sio_perf.h"
+
+/* useful macros */
+#define TAB_SPACE           4
+
+#define ONE_KB              1024
+#define ONE_MB              (ONE_KB * ONE_KB)
+#define ONE_GB              (ONE_MB * ONE_KB)
+
+#define SIO_POSIX           0x1
+#define SIO_HDF5            0x4
+
+/* report 0.0 in case t is zero too */
+#define MB_PER_SEC(bytes,t) (H5_DBL_ABS_EQUAL(t, (double)0.0F) ? (double)0.0F : ((((double)bytes) / (double)ONE_MB) / (t)))
+
+#ifndef TRUE
+#define TRUE    1
+#endif  /* TRUE */
+#ifndef FALSE
+#define FALSE   (!TRUE)
+#endif  /* FALSE */
+
+/* global variables */
+FILE       *output;             /* output file                          */
+int         sio_debug_level = 0;/* The debug level:
+                                 *   0 - Off
+                                 *   1 - Minimal
+                                 *   2 - Some more
+                                 *   3 - Maximal
+                                 *   4 - Maximal & then some
+                                 */
+
+/* local variables */
+static const char  *progname = "h5perf_serial";
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters. The long-named ones can be partially spelled. When
+ * adding more, make sure that they don't clash with each other.
+ */
+
+/*
+ * It seems that only the options that accept additional information
+ * such as dataset size (-e) require the colon next to it.
+ */
+static const char *s_opts = "a:A:B:b:c:Cd:D:e:F:G:ghi:Imno:p:P:r:stT:v:wx:X:";
+static struct long_options l_opts[] = {
+    { "align", require_arg, 'a' },
+    { "alig", require_arg, 'a' },
+    { "ali", require_arg, 'a' },
+    { "al", require_arg, 'a' },
+    { "api", require_arg, 'A' },
+    { "ap", require_arg, 'A' },
+#if 0
+    /* a sighting of the elusive binary option */
+    { "binary", no_arg, 'b' },
+    { "binar", no_arg, 'b' },
+    { "bina", no_arg, 'b' },
+    { "bin", no_arg, 'b' },
+    { "bi", no_arg, 'b' },
+#endif  /* 0 */
+    { "block-size", require_arg, 'B' },
+    { "block-siz", require_arg, 'B' },
+    { "block-si", require_arg, 'B' },
+    { "block-s", require_arg, 'B' },
+    { "block-", require_arg, 'B' },
+    { "block", require_arg, 'B' },
+    { "bloc", require_arg, 'B' },
+    { "blo", require_arg, 'B' },
+    { "bl", require_arg, 'B' },
+    { "chunk", no_arg, 'c' },
+    { "chun", no_arg, 'c' },
+    { "chu", no_arg, 'c' },
+    { "ch", no_arg, 'c' },
+    { "collective", no_arg, 'C' },
+    { "collectiv", no_arg, 'C' },
+    { "collecti", no_arg, 'C' },
+    { "collect", no_arg, 'C' },
+    { "collec", no_arg, 'C' },
+    { "colle", no_arg, 'C' },
+    { "coll", no_arg, 'C' },
+    { "col", no_arg, 'C' },
+    { "co", no_arg, 'C' },
+    { "debug", require_arg, 'D' },
+    { "debu", require_arg, 'D' },
+    { "deb", require_arg, 'D' },
+    { "de", require_arg, 'D' },
+    { "file-driver", require_arg, 'v' },
+    { "file-drive", require_arg, 'v' },
+    { "file-driv", require_arg, 'v' },
+    { "file-dri", require_arg, 'v' },
+    { "file-dr", require_arg, 'v' },
+    { "file-d", require_arg, 'v' },
+    { "file-", require_arg, 'v' },
+    { "file", require_arg, 'v' },
+    { "fil", require_arg, 'v' },
+    { "fi", require_arg, 'v' },
+    { "geometry", no_arg, 'g' },
+    { "geometr", no_arg, 'g' },
+    { "geomet", no_arg, 'g' },
+    { "geome", no_arg, 'g' },
+    { "geom", no_arg, 'g' },
+    { "geo", no_arg, 'g' },
+    { "ge", no_arg, 'g' },
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    { "he", no_arg, 'h' },
+    { "interleaved", require_arg, 'I' },
+    { "interleave", require_arg, 'I' },
+    { "interleav", require_arg, 'I' },
+    { "interlea", require_arg, 'I' },
+    { "interle", require_arg, 'I' },
+    { "interl", require_arg, 'I' },
+    { "inter", require_arg, 'I' },
+    { "inte", require_arg, 'I' },
+    { "int", require_arg, 'I' },
+    { "in", require_arg, 'I' },
+    { "max-num-processes", require_arg, 'P' },
+    { "max-num-processe", require_arg, 'P' },
+    { "max-num-process", require_arg, 'P' },
+    { "max-num-proces", require_arg, 'P' },
+    { "max-num-proce", require_arg, 'P' },
+    { "max-num-proc", require_arg, 'P' },
+    { "max-num-pro", require_arg, 'P' },
+    { "max-num-pr", require_arg, 'P' },
+    { "max-num-p", require_arg, 'P' },
+    { "min-num-processes", require_arg, 'p' },
+    { "min-num-processe", require_arg, 'p' },
+    { "min-num-process", require_arg, 'p' },
+    { "min-num-proces", require_arg, 'p' },
+    { "min-num-proce", require_arg, 'p' },
+    { "min-num-proc", require_arg, 'p' },
+    { "min-num-pro", require_arg, 'p' },
+    { "min-num-pr", require_arg, 'p' },
+    { "min-num-p", require_arg, 'p' },
+    { "max-xfer-size", require_arg, 'X' },
+    { "max-xfer-siz", require_arg, 'X' },
+    { "max-xfer-si", require_arg, 'X' },
+    { "max-xfer-s", require_arg, 'X' },
+    { "max-xfer", require_arg, 'X' },
+    { "max-xfe", require_arg, 'X' },
+    { "max-xf", require_arg, 'X' },
+    { "max-x", require_arg, 'X' },
+    { "min-xfer-size", require_arg, 'x' },
+    { "min-xfer-siz", require_arg, 'x' },
+    { "min-xfer-si", require_arg, 'x' },
+    { "min-xfer-s", require_arg, 'x' },
+    { "min-xfer", require_arg, 'x' },
+    { "min-xfe", require_arg, 'x' },
+    { "min-xf", require_arg, 'x' },
+    { "min-x", require_arg, 'x' },
+    { "num-bytes", require_arg, 'e' },
+    { "num-byte", require_arg, 'e' },
+    { "num-byt", require_arg, 'e' },
+    { "num-by", require_arg, 'e' },
+    { "num-b", require_arg, 'e' },
+    { "num-dsets", require_arg, 'd' },
+    { "num-dset", require_arg, 'd' },
+    { "num-dse", require_arg, 'd' },
+    { "num-ds", require_arg, 'd' },
+    { "num-d", require_arg, 'd' },
+    { "num-files", require_arg, 'F' },
+    { "num-file", require_arg, 'F' },
+    { "num-fil", require_arg, 'F' },
+    { "num-fi", require_arg, 'F' },
+    { "num-f", require_arg, 'F' },
+    { "num-iterations", require_arg, 'i' },
+    { "num-iteration", require_arg, 'i' },
+    { "num-iteratio", require_arg, 'i' },
+    { "num-iterati", require_arg, 'i' },
+    { "num-iterat", require_arg, 'i' },
+    { "num-itera", require_arg, 'i' },
+    { "num-iter", require_arg, 'i' },
+    { "num-ite", require_arg, 'i' },
+    { "num-it", require_arg, 'i' },
+    { "num-i", require_arg, 'i' },
+    { "order", require_arg, 'r' },
+    { "orde", require_arg, 'r' },
+    { "ord", require_arg, 'r' },
+    { "or", require_arg, 'r' },
+    { "output", require_arg, 'o' },
+    { "outpu", require_arg, 'o' },
+    { "outp", require_arg, 'o' },
+    { "out", require_arg, 'o' },
+    { "ou", require_arg, 'o' },
+    { "extendable", no_arg, 't' },
+    { "extendabl", no_arg, 't' },
+    { "extendab", no_arg, 't' },
+    { "extenda", no_arg, 't' },
+    { "extend", no_arg, 't' },
+    { "exten", no_arg, 't' },
+    { "exte", no_arg, 't' },
+    { "ext", no_arg, 't' },
+    { "ex", no_arg, 't' },
+    { "threshold", require_arg, 'T' },
+    { "threshol", require_arg, 'T' },
+    { "thresho", require_arg, 'T' },
+    { "thresh", require_arg, 'T' },
+    { "thres", require_arg, 'T' },
+    { "thre", require_arg, 'T' },
+    { "thr", require_arg, 'T' },
+    { "th", require_arg, 'T' },
+    { "write-only", require_arg, 'w' },
+    { "write-onl", require_arg, 'w' },
+    { "write-on", require_arg, 'w' },
+    { "write-o", require_arg, 'w' },
+    { "write", require_arg, 'w' },
+    { "writ", require_arg, 'w' },
+    { "wri", require_arg, 'w' },
+    { "wr", require_arg, 'w' },
+    { NULL, 0, '\0' }
+};
+
+struct options {
+    long io_types;              /* bitmask of which I/O types to test   */
+    const char *output_file;    /* file to print report to              */
+    long num_dsets;             /* number of datasets                   */
+    long num_files;             /* number of files                      */
+    off_t num_bpp;              /* number of bytes per proc per dset    */
+    int num_iters;              /* number of iterations                 */
+    hsize_t dset_size[MAX_DIMS];  /* Dataset size                           */
+    size_t buf_size[MAX_DIMS];  /* Buffer size                           */
+    size_t chk_size[MAX_DIMS];  /* Chunk size                           */
+    int order[MAX_DIMS];        /* Dimension access order                           */
+    int dset_rank;              /* Rank                   */
+    int buf_rank;               /* Rank                   */
+    int order_rank;             /* Rank                   */
+    int chk_rank;               /* Rank                   */
+    int print_times;       	/* print times as well as throughputs   */
+    int print_raw;         	/* print raw data throughput info       */
+    hsize_t h5_alignment;       /* alignment in HDF5 file               */
+    hsize_t h5_threshold;       /* threshold for alignment in HDF5 file */
+    int h5_use_chunks;     	/* Make HDF5 dataset chunked            */
+    int h5_write_only;        	/* Perform the write tests only         */
+    int h5_extendable;        	/* Perform the write tests only         */
+    int verify;        		/* Verify data correctness              */
+    vfdtype     vfd;            /* File driver */
+    size_t page_buffer_size;
+    size_t page_size;
+};
+
+typedef struct _minmax {
+    double min;
+    double max;
+    double sum;
+    int num;
+} minmax;
+
+/* local functions */
+static hsize_t parse_size_directive(const char *size);
+static struct options *parse_command_line(int argc, char *argv[]);
+static void run_test_loop(struct options *options);
+static int run_test(iotype iot, parameters parms, struct options *opts);
+static void output_all_info(minmax *mm, int count, int indent_level);
+static void get_minmax(minmax *mm, double val);
+static void accumulate_minmax_stuff(const minmax *mm, int count, minmax *total_mm);
+static void output_results(const struct options *options, const char *name,
+                           minmax *table, int table_size, off_t data_size);
+static void output_report(const char *fmt, ...);
+static void print_indent(register int indent);
+static void usage(const char *prog);
+static void report_parameters(struct options *opts);
+
+/*
+ * Function:    main
+ * Purpose:     Start things up.
+ * Return:      EXIT_SUCCESS or EXIT_FAILURE
+ * Programmer:  Bill Wendling, 30. October 2001
+ * Modifications:
+ */
+int
+main(int argc, char **argv)
+{
+    int exit_value = EXIT_SUCCESS;
+    struct options *opts = NULL;
+
+#ifndef STANDALONE
+    /* Initialize h5tools lib */
+    h5tools_init();
+#endif
+    
+    output = stdout;
+
+    opts = parse_command_line(argc, argv);
+
+    if (!opts) {
+        exit_value = EXIT_FAILURE;
+        goto finish;
+    }
+
+    if (opts->output_file) {
+        if ((output = HDfopen(opts->output_file, "w")) == NULL) {
+            fprintf(stderr, "%s: cannot open output file\n", progname);
+            perror(opts->output_file);
+            goto finish;
+        }
+    }
+
+    report_parameters(opts);
+
+    run_test_loop(opts);
+
+finish:
+    free(opts);
+    return exit_value;
+}
+
+/*
+ * Function:    run_test_loop
+ * Purpose:     Run the I/O tests. Write the results to OUTPUT.
+ *
+ *            - The slowest changing part of the test is the number of
+ *              processors to use. For each loop iteration, we divide that
+ *              number by 2 and rerun the test.
+ *
+ *            - The second slowest is what type of IO API to perform. We have
+ *              three choices: POSIXIO, and HDF5.
+ *
+ *            - Then we change the size of the buffer. This information is
+ *              inferred from the number of datasets to create and the number
+ *              of integers to put into each dataset. The backend code figures
+ *              this out.
+ *
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 30. October 2001
+ * Modifications:
+ *    Added multidimensional testing (Christian Chilan, April, 2008)
+ */
+static void
+run_test_loop(struct options *opts)
+{
+    parameters parms;
+    int i;
+    size_t      buf_bytes;
+
+    /* load options into parameter structure */
+    parms.num_files = opts->num_files;
+    parms.num_dsets = opts->num_dsets;
+    parms.num_iters = opts->num_iters;
+    parms.rank = opts->dset_rank;
+    parms.h5_align = opts->h5_alignment;
+    parms.h5_thresh = opts->h5_threshold;
+    parms.h5_use_chunks = opts->h5_use_chunks;
+    parms.h5_extendable = opts->h5_extendable;
+    parms.h5_write_only = opts->h5_write_only;
+    parms.verify = opts->verify;
+    parms.vfd = opts->vfd;
+    parms.page_buffer_size = opts->page_buffer_size;
+    parms.page_size = opts->page_size;
+
+    /* load multidimensional options */
+    parms.num_bytes = 1;
+    buf_bytes = 1;
+    for (i=0; i<parms.rank; i++){
+        parms.buf_size[i] = opts->buf_size[i];
+        parms.dset_size[i] = opts->dset_size[i];
+        parms.chk_size[i] = opts->chk_size[i];
+        parms.order[i] = opts->order[i];
+        parms.num_bytes *= opts->dset_size[i];
+        buf_bytes *= opts->buf_size[i];
+    }
+
+    /* print size information */
+    output_report("Transfer Buffer Size (bytes): %d\n", buf_bytes);
+    output_report("File Size(MB): %.2f\n",((double)parms.num_bytes) / ONE_MB);
+
+    print_indent(0);
+    if (opts->io_types & SIO_POSIX)
+        run_test(POSIXIO, parms, opts);
+
+    print_indent(0);
+    if (opts->io_types & SIO_HDF5)
+        run_test(HDF5, parms, opts);
+}
+
+/*
+ * Function:    run_test
+ * Purpose:     Inner loop call to actually run the I/O test.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 18. December 2001
+ * Modifications:
+ */
+static int
+run_test(iotype iot, parameters parms, struct options *opts)
+{
+    results         res;
+    register int    i, ret_value = SUCCESS;
+    off_t           raw_size;
+    minmax         *write_sys_mm_table=NULL;
+    minmax         *write_mm_table=NULL;
+    minmax         *write_gross_mm_table=NULL;
+    minmax         *write_raw_mm_table=NULL;
+    minmax         *read_sys_mm_table=NULL;
+    minmax         *read_mm_table=NULL;
+    minmax         *read_gross_mm_table=NULL;
+    minmax         *read_raw_mm_table=NULL;
+    minmax          write_sys_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          write_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          write_gross_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          write_raw_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          read_sys_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          read_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          read_gross_mm = {0.0F, 0.0F, 0.0F, 0};
+    minmax          read_raw_mm = {0.0F, 0.0F, 0.0F, 0};
+
+    raw_size = (off_t)parms.num_bytes;
+    parms.io_type = iot;
+    print_indent(2);
+    output_report("IO API = ");
+
+    switch (iot) {
+        case POSIXIO:
+            output_report("POSIX\n");
+            break;
+        case HDF5:
+            output_report("HDF5\n");
+            break;
+        default:
+            /* unknown request */
+            HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
+            HDassert(0 && "Unknown IO tpe");
+            break;
+    }
+
+    /* allocate space for tables minmax and that it is sufficient */
+    /* to initialize all elements to zeros by calloc.             */
+    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 = (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 */
+    for (i = 0; i < parms.num_iters; ++i) {
+        double t;
+
+        do_sio(parms, &res);
+
+        /* gather all of the "sys write" times */
+        t = get_time(res.timers, HDF5_MPI_WRITE);
+        get_minmax(&write_sys_mm, t);
+
+        write_sys_mm_table[i] = write_sys_mm;
+
+        /* gather all of the "write" times */
+        t = get_time(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
+        get_minmax(&write_mm, t);
+
+        write_mm_table[i] = write_mm;
+
+        /* gather all of the "write" times from open to close */
+        t = get_time(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
+        get_minmax(&write_gross_mm, t);
+
+        write_gross_mm_table[i] = write_gross_mm;
+
+        /* gather all of the raw "write" times */
+        t = get_time(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
+        get_minmax(&write_raw_mm, t);
+
+        write_raw_mm_table[i] = write_raw_mm;
+
+        if (!parms.h5_write_only) {
+            /* gather all of the "mpi read" times */
+            t = get_time(res.timers, HDF5_MPI_READ);
+            get_minmax(&read_sys_mm, t);
+
+            read_sys_mm_table[i] = read_sys_mm;
+
+            /* gather all of the "read" times */
+            t = get_time(res.timers, HDF5_FINE_READ_FIXED_DIMS);
+            get_minmax(&read_mm, t);
+
+            read_mm_table[i] = read_mm;
+
+            /* gather all of the "read" times from open to close */
+            t = get_time(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
+            get_minmax(&read_gross_mm, t);
+
+            read_gross_mm_table[i] = read_gross_mm;
+
+            /* gather all of the raw "read" times */
+            t = get_time(res.timers, HDF5_RAW_READ_FIXED_DIMS);
+            get_minmax(&read_raw_mm, t);
+
+            read_raw_mm_table[i] = read_gross_mm;
+        }
+        io_time_destroy(res.timers);
+    }
+
+    /*
+     * Show various statistics
+     */
+    /* Write statistics	*/
+    /* Print the raw data throughput if desired */
+    if (opts->print_raw) {
+        /* accumulate and output the max, min, and average "raw write" times */
+        if (sio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Raw Data Write details:\n");
+            output_all_info(write_raw_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts,"Raw Data Write",write_raw_mm_table,parms.num_iters,raw_size);
+    } /* end if */
+
+    /* show sys write statics */
+#if 0
+    if (sio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("MPI Write details:\n");
+        output_all_info(write_sys_mm_table, parms.num_iters, 4);
+    }
+#endif
+    /* We don't currently output the MPI write results */
+
+    /* accumulate and output the max, min, and average "write" times */
+    if (sio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("Write details:\n");
+        output_all_info(write_mm_table, parms.num_iters, 4);
+    }
+
+    output_results(opts,"Write",write_mm_table,parms.num_iters,raw_size);
+
+    /* accumulate and output the max, min, and average "gross write" times */
+    if (sio_debug_level >= 3) {
+        /* output all of the times for all iterations */
+        print_indent(3);
+        output_report("Write Open-Close details:\n");
+        output_all_info(write_gross_mm_table, parms.num_iters, 4);
+    }
+
+    output_results(opts,"Write Open-Close",write_gross_mm_table,parms.num_iters,raw_size);
+
+    if (!parms.h5_write_only) {
+        /* Read statistics	*/
+        /* Print the raw data throughput if desired */
+        if (opts->print_raw) {
+            /* accumulate and output the max, min, and average "raw read" times */
+            if (sio_debug_level >= 3) {
+                /* output all of the times for all iterations */
+                print_indent(3);
+                output_report("Raw Data Read details:\n");
+                output_all_info(read_raw_mm_table, parms.num_iters, 4);
+            }
+
+            output_results(opts, "Raw Data Read", read_raw_mm_table,
+                           parms.num_iters, raw_size);
+        } /* end if */
+
+        /* show mpi read statics */
+#if 0
+        if (sio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("MPI Read details:\n");
+            output_all_info(read_sys_mm_table, parms.num_iters, 4);
+        }
+#endif
+        /* We don't currently output the MPI read results */
+
+        /* accumulate and output the max, min, and average "read" times */
+        if (sio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read details:\n");
+            output_all_info(read_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
+
+        /* accumulate and output the max, min, and average "gross read" times */
+        if (sio_debug_level >= 3) {
+            /* output all of the times for all iterations */
+            print_indent(3);
+            output_report("Read Open-Close details:\n");
+            output_all_info(read_gross_mm_table, parms.num_iters, 4);
+        }
+
+        output_results(opts, "Read Open-Close", read_gross_mm_table,
+                       parms.num_iters, raw_size);
+    }
+
+    /* clean up our mess */
+    free(write_sys_mm_table);
+    free(write_mm_table);
+    free(write_gross_mm_table);
+    free(write_raw_mm_table);
+
+    if (!parms.h5_write_only) {
+        free(read_sys_mm_table);
+        free(read_mm_table);
+        free(read_gross_mm_table);
+        free(read_raw_mm_table);
+    }
+
+    return ret_value;
+}
+
+/*
+ * Function:    output_all_info
+ * Purpose:
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 29. January 2002
+ * Modifications:
+ */
+static void
+output_all_info(minmax *mm, int count, int indent_level)
+{
+    int i;
+
+    for (i = 0; i < count; ++i) {
+        print_indent(indent_level);
+        output_report("Iteration %d:\n", i + 1);
+        print_indent(indent_level + 1);
+        output_report("Minimum Time: %.2fs\n", mm[i].min);
+        print_indent(indent_level + 1);
+        output_report("Maximum Time: %.2fs\n", mm[i].max);
+    }
+}
+
+/*
+ * Function:    get_minmax
+ * Purpose:     Gather all the min, max and total of val.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 21. December 2001
+ * Modifications:
+ *    Use MPI_Allreduce to do it. -akc, 2002/01/11
+ */
+
+static void
+get_minmax(minmax *mm, double val)
+{
+    mm->max = val;
+    mm->min = val;
+    mm->sum = val;
+}
+
+/*
+ * Function:    accumulate_minmax_stuff
+ * Purpose:     Accumulate the minimum, maximum, and average of the times
+ *              across all processes.
+ * Return:      TOTAL_MM - the total of all of these.
+ * Programmer:  Bill Wendling, 21. December 2001
+ * Modifications:
+ *              Changed to use seconds instead of MB/s - QAK, 5/9/02
+ */
+static void
+accumulate_minmax_stuff(const minmax *mm, int count, minmax *total_mm)
+{
+    int i;
+
+    total_mm->sum = 0.0F;
+    total_mm->max = -DBL_MAX;
+    total_mm->min = DBL_MAX;
+    total_mm->num = count;
+
+    for (i = 0; i < count; ++i) {
+        double m = mm[i].max;
+
+        total_mm->sum += m;
+
+        if (m < total_mm->min)
+            total_mm->min = m;
+
+        if (m > total_mm->max)
+            total_mm->max = m;
+    }
+}
+
+
+/*
+ * Function:    output_results
+ * Purpose:     Print information about the time & bandwidth for a given
+ *                  minmax & # of iterations.
+ * Return:      Nothing
+ * Programmer:  Quincey Koziol, 9. May 2002
+ * Modifications:
+ */
+static void
+output_results(const struct options *opts, const char *name, minmax *table,
+    int table_size,off_t data_size)
+{
+    minmax          total_mm;
+
+    accumulate_minmax_stuff(table, table_size, &total_mm);
+
+    print_indent(3);
+    output_report("%s (%d iteration(s)):\n", name,table_size);
+
+    /* Note: The maximum throughput uses the minimum amount of time & vice versa */
+
+    print_indent(4);
+    output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.min));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", total_mm.min);
+    else
+        output_report("\n");
+
+    print_indent(4);
+    output_report("Average Throughput: %6.2f MB/s",
+                  MB_PER_SEC(data_size,total_mm.sum / total_mm.num));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
+    else
+        output_report("\n");
+
+    print_indent(4);
+    output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size,total_mm.max));
+    if(opts->print_times)
+        output_report(" (%7.3f s)\n", total_mm.max);
+    else
+        output_report("\n");
+}
+
+/*
+ * Function:    output_report
+ * Purpose:     Print a line of the report. Only do so if I'm the 0 process.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 19. December 2001
+ * Modifications:
+ */
+static void
+output_report(const char *fmt, ...)
+{
+        va_list ap;
+
+        va_start(ap, fmt);
+        vfprintf(output, fmt, ap);
+        va_end(ap);
+}
+
+/*
+ * Function:    print_indent
+ * Purpose:     Print spaces to indent a new line of text for pretty printing
+ *              things.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 29. October 2001
+ * Modifications:
+ */
+static void
+print_indent(register int indent)
+{
+	indent *= TAB_SPACE;
+
+	for (; indent > 0; --indent)
+	    fputc(' ', output);
+}
+
+static void
+recover_size_and_print(long long val, const char *end)
+{
+    if (val >= ONE_KB && (val % ONE_KB) == 0) {
+        if (val >= ONE_MB && (val % ONE_MB) == 0) {
+            if (val >= ONE_GB && (val % ONE_GB) == 0)
+                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""GB%s", val / ONE_GB, end);
+            else
+                HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""MB%s", val / ONE_MB, end);
+        } else {
+            HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""KB%s", val / ONE_KB, end);
+        }
+    } else {
+        HDfprintf(output, "%" H5_PRINTF_LL_WIDTH "d""%s", val, end);
+    }
+}
+
+static void
+print_io_api(long io_types)
+{
+    if (io_types & SIO_POSIX)
+	HDfprintf(output, "posix ");
+    if (io_types & SIO_HDF5)
+	HDfprintf(output, "hdf5 ");
+    HDfprintf(output, "\n");
+}
+
+static void
+report_parameters(struct options *opts)
+{
+    int i, rank;
+    rank = opts->dset_rank;
+
+    print_version("HDF5 Library");	/* print library version */
+    HDfprintf(output, "==== Parameters ====\n");
+
+    HDfprintf(output, "IO API=");
+    print_io_api(opts->io_types);
+
+    HDfprintf(output, "Number of iterations=%d\n",
+              opts->num_iters);
+
+    HDfprintf(output, "Dataset size=");
+
+    for (i=0; i<rank; i++)
+        recover_size_and_print((long long)opts->dset_size[i], " ");
+    HDfprintf(output, "\n");
+
+
+    HDfprintf(output, "Transfer buffer size=");
+    for (i=0; i<rank; i++)
+        recover_size_and_print((long long)opts->buf_size[i], " ");
+    HDfprintf(output, "\n");
+
+    if(opts->page_size) {
+        HDfprintf(output, "Page Aggregation Enabled. Page size = %ld\n", opts->page_size);
+        if(opts->page_buffer_size)
+            HDfprintf(output, "Page Buffering Enabled. Page Buffer size = %ld\n", opts->page_buffer_size);
+        else
+            HDfprintf(output, "Page Buffering Disabled\n");
+    }
+    else
+        HDfprintf(output, "Page Aggregation Disabled\n");
+
+    HDfprintf(output, "Dimension access order=");
+    for (i=0; i<rank; i++)
+        recover_size_and_print((long long)opts->order[i], " ");
+    HDfprintf(output, "\n");
+
+    if (opts->io_types & SIO_HDF5) {
+
+        HDfprintf(output, "HDF5 data storage method=");
+
+        if (opts->h5_use_chunks){
+
+            HDfprintf(output, "Chunked\n");
+            HDfprintf(output, "HDF5 chunk size=");
+            for (i=0; i<rank; i++)
+                recover_size_and_print((long long)opts->chk_size[i], " ");
+            HDfprintf(output, "\n");
+
+            HDfprintf(output, "HDF5 dataset dimensions=");
+            if (opts->h5_extendable) {
+                HDfprintf(output, "Extendable\n");
+            }
+            else {
+                HDfprintf(output, "Fixed\n");
+            }
+        }
+        else {
+            HDfprintf(output, "Contiguous\n");
+        }
+
+        HDfprintf(output, "HDF5 file driver=");
+        if (opts->vfd==sec2) {
+            HDfprintf(output, "sec2\n");
+        } else if (opts->vfd==stdio) {
+            HDfprintf(output, "stdio\n");
+        } else if (opts->vfd==core) {
+            HDfprintf(output, "core\n");
+        } else if (opts->vfd==split) {
+            HDfprintf(output, "split\n");
+        } else if (opts->vfd==multi) {
+            HDfprintf(output, "multi\n");
+        } else if (opts->vfd==family) {
+            HDfprintf(output, "family\n");
+        } else if (opts->vfd==direct) {
+            HDfprintf(output, "direct\n");
+        }
+    }
+
+    {
+        char *prefix = HDgetenv("HDF5_PREFIX");
+
+        HDfprintf(output, "Env HDF5_PREFIX=%s\n",
+                  (prefix ? prefix : "not set"));
+    }
+
+    HDfprintf(output, "==== End of Parameters ====\n");
+    HDfprintf(output, "\n");
+}
+
+/*
+ * Function:    parse_command_line
+ * Purpose:     Parse the command line options and return a STRUCT OPTIONS
+ *              structure which will need to be freed by the calling function.
+ * Return:      Pointer to an OPTIONS structure
+ * Programmer:  Bill Wendling, 31. October 2001
+ * Modifications:
+ *    Added multidimensional testing (Christian Chilan, April, 2008)
+ */
+static struct options *
+parse_command_line(int argc, char *argv[])
+{
+    int opt;
+    struct options *cl_opts;
+    int i, default_rank, actual_rank, ranks[4];
+
+    cl_opts = (struct options *)HDmalloc(sizeof(struct options));
+
+    cl_opts->page_buffer_size = 0;
+    cl_opts->page_size = 0;
+
+    cl_opts->output_file = NULL;
+    cl_opts->io_types =  0;    /* will set default after parsing options */
+    cl_opts->num_iters = 1;
+
+    default_rank = 2;
+
+    cl_opts->dset_rank = 0;
+    cl_opts->buf_rank = 0;
+    cl_opts->chk_rank = 0;
+    cl_opts->order_rank = 0;
+
+    for(i = 0; i < MAX_DIMS; i++) {
+        cl_opts->buf_size[i] = (size_t)((i + 1) * 10);
+        cl_opts->dset_size[i] = (hsize_t)((i + 1) * 100);
+        cl_opts->chk_size[i] = (size_t)((i + 1) * 10);
+        cl_opts->order[i] = i + 1;
+    }
+
+    cl_opts->vfd = sec2;
+
+    cl_opts->print_times = FALSE;   /* Printing times is off by default */
+    cl_opts->print_raw = FALSE;     /* Printing raw data throughput is off by default */
+    cl_opts->h5_alignment = 1;      /* No alignment for HDF5 objects by default */
+    cl_opts->h5_threshold = 1;      /* No threshold for aligning HDF5 objects by default */
+    cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
+    cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
+    cl_opts->h5_extendable = FALSE; /* Use extendable dataset */
+    cl_opts->verify = FALSE;        /* No Verify data correctness by default */
+
+    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) != EOF) {
+        switch ((char)opt) {
+        case 'a':
+            cl_opts->h5_alignment = parse_size_directive(opt_arg);
+            break;
+        case 'G':
+            cl_opts->page_size = parse_size_directive(opt_arg);
+            break;
+        case 'b':
+            cl_opts->page_buffer_size = parse_size_directive(opt_arg);
+            break;
+        case 'A':
+            {
+                const char *end = opt_arg;
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    if (!HDstrcasecmp(buf, "hdf5")) {
+                        cl_opts->io_types |= SIO_HDF5;
+                    } else if (!HDstrcasecmp(buf, "posix")) {
+                        cl_opts->io_types |= SIO_POSIX;
+                    } else {
+                        fprintf(stderr, "sio_perf: invalid --api option %s\n",
+                                buf);
+                        exit(EXIT_FAILURE);
+                    }
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+            }
+
+            break;
+#if 0
+        case 'b':
+            /* the future "binary" option */
+            break;
+#endif  /* 0 */
+        case 'c':
+            /* Turn on chunked HDF5 dataset creation */
+            cl_opts->h5_use_chunks = 1;
+            {
+                const char *end = opt_arg;
+                int j = 0;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    cl_opts->chk_size[j] = parse_size_directive(buf);
+
+                    j++;
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+                cl_opts->chk_rank = j;
+            }
+
+            break;
+
+
+        case 'D':
+            {
+                const char *end = opt_arg;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    if (strlen(buf) > 1 || isdigit(buf[0])) {
+                        size_t j;
+
+                        for (j = 0; j < 10 && buf[j] != '\0'; ++j)
+                            if (!isdigit(buf[j])) {
+                                fprintf(stderr, "sio_perf: invalid --debug option %s\n",
+                                        buf);
+                                exit(EXIT_FAILURE);
+                            }
+
+                        sio_debug_level = atoi(buf);
+
+                        if (sio_debug_level > 4)
+                            sio_debug_level = 4;
+                        else if (sio_debug_level < 0)
+                            sio_debug_level = 0;
+                    } else {
+                        switch (*buf) {
+                        case 'r':
+                            /* Turn on raw data throughput info */
+                            cl_opts->print_raw = TRUE;
+                            break;
+                        case 't':
+                            /* Turn on time printing */
+                            cl_opts->print_times = TRUE;
+                            break;
+            case 'v':
+                            /* Turn on verify data correctness*/
+                cl_opts->verify = TRUE;
+                break;
+                        default:
+                            fprintf(stderr, "sio_perf: invalid --debug option %s\n", buf);
+                            exit(EXIT_FAILURE);
+                        }
+                    }
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+            }
+
+            break;
+        case 'e':
+            {
+                const char *end = opt_arg;
+                int j = 0;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    cl_opts->dset_size[j] = parse_size_directive(buf);
+
+                    j++;
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+                cl_opts->dset_rank = j;
+            }
+
+            break;
+
+        case 'i':
+            cl_opts->num_iters = atoi(opt_arg);
+            break;
+        case 'o':
+            cl_opts->output_file = opt_arg;
+            break;
+        case 'T':
+            cl_opts->h5_threshold = parse_size_directive(opt_arg);
+            break;
+        case 'v':
+            if (!HDstrcasecmp(opt_arg, "sec2")) {
+                cl_opts->vfd=sec2;
+            } else if (!HDstrcasecmp(opt_arg, "stdio")) {
+                cl_opts->vfd=stdio;
+            } else if (!HDstrcasecmp(opt_arg, "core")) {
+                cl_opts->vfd=core;
+            } else if (!HDstrcasecmp(opt_arg, "split")) {
+                cl_opts->vfd=split;
+            } else if (!HDstrcasecmp(opt_arg, "multi")) {
+                cl_opts->vfd=multi;
+            } else if (!HDstrcasecmp(opt_arg, "family")) {
+                cl_opts->vfd=family;
+            } else if (!HDstrcasecmp(opt_arg, "direct")) {
+                cl_opts->vfd=direct;
+            } else {
+                fprintf(stderr, "sio_perf: invalid --api option %s\n",
+                                opt_arg);
+                exit(EXIT_FAILURE);
+            }
+            break;
+        case 'w':
+            cl_opts->h5_write_only = TRUE;
+            break;
+        case 't':
+            cl_opts->h5_extendable = TRUE;
+            break;
+        case 'x':
+            {
+                const char *end = opt_arg;
+                int j = 0;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    cl_opts->buf_size[j] = parse_size_directive(buf);
+
+                    j++;
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+                cl_opts->buf_rank = j;
+            }
+
+            break;
+
+        case 'r':
+            {
+                const char *end = opt_arg;
+                int j = 0;
+
+                while (end && *end != '\0') {
+                    char buf[10];
+
+                    HDmemset(buf, '\0', sizeof(buf));
+
+                    for (i = 0; *end != '\0' && *end != ','; ++end)
+                        if (isalnum(*end) && i < 10)
+                            buf[i++] = *end;
+
+                    cl_opts->order[j] = (int)parse_size_directive(buf);
+
+                    j++;
+
+                    if (*end == '\0')
+                        break;
+
+                    end++;
+                }
+
+                cl_opts->order_rank = j;
+            }
+
+            break;
+
+        case 'h':
+        case '?':
+        default:
+            usage(progname);
+            free(cl_opts);
+            return NULL;
+        }
+    }
+
+    /* perform rank consistency analysis */
+    actual_rank = 0;
+
+    ranks[0] = cl_opts->dset_rank;
+    ranks[1] = cl_opts->buf_rank;
+    ranks[2] = cl_opts->order_rank;
+    ranks[3] = cl_opts->chk_rank;
+
+    for (i=0; i<4; i++) {
+        if (ranks[i]>0) {
+            if (!actual_rank) {
+                actual_rank = ranks[i];
+            }
+            else {
+                if (actual_rank != ranks[i])
+                    exit(EXIT_FAILURE);
+            }
+        }
+    }
+
+    if (!actual_rank)
+        actual_rank = default_rank;
+
+    cl_opts->dset_rank = actual_rank;
+    cl_opts->buf_rank = actual_rank;
+    cl_opts->order_rank = actual_rank;
+    cl_opts->chk_rank = actual_rank;
+
+    for (i=0; i<actual_rank; i++) {
+        if (cl_opts->order[i] > actual_rank) {
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    /* set default if none specified yet */
+    if (!cl_opts->io_types)
+        cl_opts->io_types = SIO_HDF5 | SIO_POSIX; /* run all API */
+
+    /* verify parameters sanity.  Adjust if needed. */
+    /* cap xfer_size with bytes per process */
+    if (cl_opts->num_iters <= 0)
+        cl_opts->num_iters = 1;
+
+    return cl_opts;
+}
+
+/*
+ * Function:    parse_size_directive
+ * Purpose:     Parse the size directive passed on the commandline. The size
+ *              directive is an integer followed by a size indicator:
+ *
+ *                  K, k - Kilobyte
+ *                  M, m - Megabyte
+ *                  G, g - Gigabyte
+ *
+ * Return:      The size as a off_t because this is related to file size.
+ *              If an unknown size indicator is used, then the program will
+ *              exit with EXIT_FAILURE as the return value.
+ * Programmer:  Bill Wendling, 18. December 2001
+ * Modifications:
+ */
+
+static hsize_t
+parse_size_directive(const char *size)
+{
+    hsize_t s;
+    char *endptr;
+
+    s = HDstrtoull(size, &endptr, 10);
+
+    if (endptr && *endptr) {
+        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
+            ++endptr;
+
+        switch (*endptr) {
+            case 'K':
+            case 'k':
+                s *= ONE_KB;
+                break;
+
+            case 'M':
+            case 'm':
+                s *= ONE_MB;
+                break;
+
+            case 'G':
+            case 'g':
+                s *= ONE_GB;
+                break;
+
+            default:
+                fprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
+                exit(EXIT_FAILURE);
+        }
+    }
+
+    return s;
+}
+
+/*
+ * Function:    usage
+ * Purpose:     Print a usage message and then exit.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 31. October 2001
+ * Modifications:
+ */
+static void
+usage(const char *prog)
+{
+	print_version(prog);
+        printf("usage: %s [OPTIONS]\n", prog);
+        printf("  OPTIONS\n");
+        printf("     -h                Print an usage message and exit\n");
+        printf("     -A AL             Which APIs to test\n");
+        printf("                       [default: all of them]\n");
+        printf("     -c SL             Selects chunked storage and defines chunks dimensions\n");
+        printf("                       and sizes\n");
+        printf("                       [default: Off]\n");
+        printf("     -e SL             Dimensions and sizes of dataset\n");
+        printf("                       [default: 100,200]\n");
+        printf("     -i N              Number of iterations to perform\n");
+        printf("                       [default: 1]\n");
+        printf("     -r NL             Dimension access order (see below for description)\n");
+        printf("                       [default: 1,2]\n");
+        printf("     -t                Selects extendable dimensions for HDF5 dataset\n");
+        printf("                       [default: Off]\n");
+        printf("     -v VFD            Selects file driver for HDF5 access\n");
+        printf("                       [default: sec2]\n");
+        printf("     -w                Perform write tests, not the read tests\n");
+        printf("                       [default: Off]\n");
+        printf("     -x SL             Dimensions and sizes of the transfer buffer\n");
+        printf("                       [default: 10,20]\n");
+        printf("\n");
+        printf("  N  - is an integer > 0.\n");
+        printf("\n");
+        printf("  S  - is a size specifier, an integer > 0 followed by a size indicator:\n");
+        printf("          K - Kilobyte (%d)\n", ONE_KB);
+        printf("          M - Megabyte (%d)\n", ONE_MB);
+        printf("          G - Gigabyte (%d)\n", ONE_GB);
+        printf("\n");
+        printf("      Example: '37M' is 37 megabytes or %d bytes\n", 37*ONE_MB);
+        printf("\n");
+        printf("  AL - is an API list. Valid values are:\n");
+        printf("          hdf5 - HDF5\n");
+        printf("          posix - POSIX\n");
+        printf("\n");
+        printf("      Example: -A posix,hdf5\n");
+        printf("\n");
+        printf("  NL - is list of integers (N) separated by commas.\n");
+        printf("\n");
+        printf("      Example: 1,2,3\n");
+        printf("\n");
+        printf("  SL - is list of size specifiers (S) separated by commas.\n");
+        printf("\n");
+        printf("      Example: 2K,2K,3K\n");
+        printf("\n");
+        printf("      The example defines an object (dataset, tranfer buffer) with three\n");
+        printf("      dimensions. Be aware that as the number of dimensions increases, the\n");
+        printf("      the total size of the object increases exponentially.\n");
+        printf("\n");
+        printf("  VFD  - is an HDF5 file driver specifier. Valid values are:\n");
+        printf("          sec2, stdio, core, split, multi, family, direct\n");
+        printf("\n");
+        printf("  Dimension access order:\n");
+        printf("      Data access starts at the cardinal origin of the dataset using the\n");
+        printf("      transfer buffer. The next access occurs on a dataset region next to\n");
+        printf("      the previous one. For a multidimensional dataset, there are several\n");
+        printf("      directions as to where to proceed. This can be specified in the dimension\n");
+        printf("      access order. For example, -r 1,2 states that the tool should traverse\n");
+        printf("      dimension 1 first, and then dimension 2.\n");
+        printf("\n");
+        printf("  Environment variables:\n");
+        printf("      HDF5_NOCLEANUP   Do not remove data files if set [default remove]\n");
+        printf("      HDF5_PREFIX      Data file prefix\n");
+        printf("\n");
+        fflush(stdout);
+} /* end usage() */
+
diff --git a/tools/test/perform/sio_perf.h b/tools/test/perform/sio_perf.h
new file mode 100644
index 0000000..366b791
--- /dev/null
+++ b/tools/test/perform/sio_perf.h
@@ -0,0 +1,104 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef SIO_PERF_H__
+#define SIO_PERF_H__
+
+#include "io_timer.h"
+#ifndef STANDALONE
+#include "H5private.h"
+#include "h5test.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#else
+#include "sio_standalone.h"
+#endif
+
+/* setup the dataset no fill option if this is v1.5 or more */
+#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
+#define H5_HAVE_NOFILL 1
+#endif
+
+#define MAX_DIMS 32
+
+typedef enum iotype_ {
+    POSIXIO,
+    HDF5
+    /*NUM_TYPES*/
+} iotype;
+
+typedef enum vfdtype_ {
+    sec2,
+    stdio,
+    core,
+    split,
+    multi,
+    family,
+    direct
+    /*NUM_TYPES*/
+} vfdtype;
+
+typedef struct parameters_ {
+    iotype  io_type;        /* The type of IO test to perform       */
+    vfdtype     vfd;
+    long        num_files;  /* Number of files to create            */
+    long        num_dsets;  /* Number of datasets to create         */
+    hsize_t     num_bytes;  /* Number of bytes in each dset         */
+    int         num_iters;  /* Number of times to loop doing the IO */
+    int         rank;       /* Rank of dataset */
+    hsize_t     dset_size[MAX_DIMS]; /* Dataset size             */
+    size_t      buf_size[MAX_DIMS]; /* Buffer size               */
+    size_t      chk_size[MAX_DIMS]; /* Chunk size               */
+    int         order[MAX_DIMS]; /* Buffer size               */
+    hsize_t     h5_align;     /* HDF5 object alignment                */
+    hsize_t     h5_thresh;    /* HDF5 object alignment threshold      */
+    int         h5_use_chunks; /* Make HDF5 dataset chunked            */
+    int         h5_extendable; /* Make HDF5 dataset chunked            */
+    int         h5_write_only; /* Perform the write tests only         */
+    int         verify;       /* Verify data correctness              */
+    size_t      page_size;
+    size_t      page_buffer_size;
+} parameters;
+
+typedef struct results_ {
+    herr_t      ret_code;
+    io_time_t   *timers;
+} results;
+
+#ifndef SUCCESS
+#define SUCCESS     0
+#endif  /* !SUCCESS */
+
+#ifndef FAIL
+#define FAIL        -1
+#endif  /* !FAIL */
+
+extern FILE     *output;            /* output file                          */
+extern io_time_t *timer_g;           /* timer: global for stub functions     */
+extern int      sio_debug_level;    /* The debug level:
+                                     *   0 - Off
+                                     *   1 - Minimal
+                                     *   2 - Some more
+                                     *   3 - Maximal
+                                     *   4 - Even More Debugging (timer stuff)
+                                     */
+#ifdef __cplusplus
+extern "C" {
+#endif  /* __cplusplus */
+
+extern void do_sio(parameters param, results *res);
+
+#ifdef __cplusplus
+}
+#endif  /* __cplusplus */
+
+#endif  /* PIO_PERF_H__ */
diff --git a/tools/test/perform/sio_standalone.c b/tools/test/perform/sio_standalone.c
new file mode 100644
index 0000000..dfdbc55
--- /dev/null
+++ b/tools/test/perform/sio_standalone.c
@@ -0,0 +1,283 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* This file contains the definition of functions required to build h5perf in
+ * STANDALONE mode.
+ * Created: Christian Chilan, 2005/5/18.
+ */
+
+#include "sio_perf.h"
+
+
+/** From h5tools_utils.c **/
+
+/* global variables */
+int   nCols = 80;
+
+/* ``get_option'' variables */
+int         opt_err = 1;    /*get_option prints errors if this is on */
+int         opt_ind = 1;    /*token pointer                          */
+const char *opt_arg;        /*flag argument (or value)               */
+
+
+int
+get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
+{
+    static int sp = 1;    /* character index in current token */
+    int opt_opt = '?';    /* option character passed back to user */
+
+    if (sp == 1) {
+        /* check for more flag-like tokens */
+        if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
+            return EOF;
+        } else if (HDstrcmp(argv[opt_ind], "--") == 0) {
+            opt_ind++;
+            return EOF;
+        }
+    }
+
+    if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
+        /* long command line option */
+        const char *arg = &argv[opt_ind][2];
+        int i;
+
+        for (i = 0; l_opts && l_opts[i].name; i++) {
+            size_t len = HDstrlen(l_opts[i].name);
+
+            if (HDstrncmp(arg, l_opts[i].name, len) == 0) {
+                /* we've found a matching long command line flag */
+                opt_opt = l_opts[i].shortval;
+
+                if (l_opts[i].has_arg != no_arg) {
+                    if (arg[len] == '=') {
+                        opt_arg = &arg[len + 1];
+                    } else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
+                        opt_arg = argv[++opt_ind];
+                    } else if (l_opts[i].has_arg == require_arg) {
+                        if (opt_err)
+                            HDfprintf(stderr,
+                                    "%s: option required for \"--%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+                } else {
+                    if (arg[len] == '=') {
+                        if (opt_err)
+                            HDfprintf(stderr,
+                                    "%s: no option required for \"%s\" flag\n",
+                                    argv[0], arg);
+
+                        opt_opt = '?';
+                    }
+
+                    opt_arg = NULL;
+                }
+
+                break;
+            }
+        }
+
+        if (l_opts[i].name == NULL) {
+            /* exhausted all of the l_opts we have and still didn't match */
+            if (opt_err)
+                HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
+
+            opt_opt = '?';
+        }
+
+        opt_ind++;
+        sp = 1;
+    } else {
+        register char *cp;    /* pointer into current token */
+
+        /* short command line option */
+        opt_opt = argv[opt_ind][sp];
+
+        if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
+
+            if (opt_err)
+                HDfprintf(stderr, "%s: unknown option \"%c\"\n",
+                        argv[0], opt_opt);
+
+            /* if no chars left in this token, move to next token */
+            if (argv[opt_ind][++sp] == '\0') {
+                opt_ind++;
+                sp = 1;
+            }
+
+            return '?';
+        }
+
+        if (*++cp == ':') {
+            /* if a value is expected, get it */
+            if (argv[opt_ind][sp + 1] != '\0') {
+                /* flag value is rest of current token */
+                opt_arg = &argv[opt_ind++][sp + 1];
+            } else if (++opt_ind >= argc) {
+                if (opt_err)
+                    HDfprintf(stderr,
+                            "%s: value expected for option \"%c\"\n",
+                            argv[0], opt_opt);
+
+                opt_opt = '?';
+            } else {
+                /* flag value is next token */
+                opt_arg = argv[opt_ind++];
+            }
+
+            sp = 1;
+        } else {
+            /* set up to look at next char in token, next time */
+            if (argv[opt_ind][++sp] == '\0') {
+                /* no more in current token, so setup next token */
+                opt_ind++;
+                sp = 1;
+            }
+
+            opt_arg = NULL;
+        }
+    }
+
+    /* return the current flag character found */
+    return opt_opt;
+}
+
+
+void
+print_version(const char *progname)
+{
+    printf("%s: Version %u.%u.%u%s%s\n",
+           progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
+           H5_VERS_SUBRELEASE[0] ? "-" : "", H5_VERS_SUBRELEASE);
+}
+
+
+
+/** From h5test.c **/
+
+#ifdef H5_HAVE_PARALLEL
+MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
+#endif
+
+#if 0
+int
+h5_set_info_object(void)
+{
+    char	*envp;			/* environment pointer */
+    int		ret_value=0;
+
+    /* handle any MPI INFO hints via $HDF5_MPI_INFO */
+    if ((envp = getenv("HDF5_MPI_INFO")) != NULL){
+        char *next, *valp;
+
+
+        valp = envp = next = HDstrdup(envp);
+
+        /* create an INFO object if not created yet */
+        if (h5_io_info_g == MPI_INFO_NULL)
+            MPI_Info_create(&h5_io_info_g);
+
+        do {
+            size_t len;
+            char *key_val, *endp, *namep;
+
+            if (*valp == ';')
+                valp++;
+
+            /* copy key/value pair into temporary buffer */
+            len = strcspn(valp, ";");
+            next = &valp[len];
+            key_val = calloc(1, len + 1);
+
+            /* increment the next pointer past the terminating semicolon */
+            if (*next == ';')
+                ++next;
+
+            namep = HDstrncpy(key_val, valp, len);
+
+            /* pass up any beginning whitespaces */
+            while (*namep && (*namep == ' ' || *namep == '\t'))
+                namep++;
+
+            /* eat up any ending white spaces */
+            endp = &namep[strlen(namep) - 1];
+
+            while (endp && (*endp == ' ' || *endp == '\t'))
+                *endp-- = '\0';
+
+            /* find the '=' */
+
+            valp = HDstrchr(namep, '=');
+
+            if (valp != NULL) {     /* it's a valid key/value pairing */
+                char *tmp_val = valp + 1;
+
+                /* change '=' to \0, move valp down one */
+                *valp-- = '\0';
+
+                /* eat up ending whitespace on the "key" part */
+                while (*valp == ' ' || *valp == '\t')
+                    *valp-- = '\0';
+
+                valp = tmp_val;
+
+                /* eat up beginning whitespace on the "value" part */
+                while (*valp == ' ' || *valp == '\t')
+                    *valp++ = '\0';
+
+                /* actually set the darned thing */
+                if (MPI_SUCCESS != MPI_Info_set(h5_io_info_g, namep, valp)) {
+                    printf("MPI_Info_set failed\n");
+                    ret_value = -1;
+                }
+            }
+
+            valp = next;
+            HDfree(key_val);
+        } while (next && *next);
+
+        HDfree(envp);
+    }
+
+    return ret_value;
+}
+
+
+void
+h5_dump_info_object(MPI_Info info)
+{
+    char	key[MPI_MAX_INFO_KEY+1];
+    char	value[MPI_MAX_INFO_VAL+1];
+    int  	flag;
+    int		i, nkeys;
+
+    printf("Dumping MPI Info Object(%d) (up to %d bytes per item):\n", (int)info,
+	MPI_MAX_INFO_VAL);
+    if (info==MPI_INFO_NULL){
+	printf("object is MPI_INFO_NULL\n");
+    }
+    else {
+	MPI_Info_get_nkeys(info, &nkeys);
+	printf("object has %d items\n", nkeys);
+	for (i=0; i<nkeys; i++){
+	    MPI_Info_get_nthkey(info, i, key);
+	    MPI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
+	    printf("%s=%s\n", key, value);
+	}
+
+    }
+}
+
+#endif
+
diff --git a/tools/test/perform/sio_standalone.h b/tools/test/perform/sio_standalone.h
new file mode 100644
index 0000000..8d6d110
--- /dev/null
+++ b/tools/test/perform/sio_standalone.h
@@ -0,0 +1,544 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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 COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef SIO_STANDALONE_H__
+#define SIO_PERF_H__
+
+/* Header file for building h5perf by standalone mode.
+ * Created: Christian Chilan, 2005/5/18.
+ */
+
+/** From H5private.h **/
+
+#include "H5public.h"     /* Include Public Definitions    */
+
+
+/*
+ * Include ANSI-C header files.
+ */
+#ifdef H5_STDC_HEADERS
+#   include <assert.h>
+#   include <ctype.h>
+#   include <errno.h>
+#   include <fcntl.h>
+#   include <float.h>
+#   include <limits.h>
+#   include <math.h>
+#   include <signal.h>
+#   include <stdarg.h>
+#   include <stdio.h>
+#   include <stdlib.h>
+#   include <string.h>
+#endif
+
+/* maximum of two, three, or four values */
+#undef MAX
+#define MAX(a,b)                (((a)>(b)) ? (a) : (b))
+#define MAX2(a,b)               MAX(a,b)
+#define MAX3(a,b,c)             MAX(a,MAX(b,c))
+#define MAX4(a,b,c,d)           MAX(MAX(a,b),MAX(c,d))
+
+/*
+ * A macro to portably increment enumerated types.
+ */
+#ifndef H5_INC_ENUM
+#  define H5_INC_ENUM(TYPE,VAR) (VAR)=((TYPE)((VAR)+1))
+#endif
+
+#define H5_FLT_ABS_EQUAL(X,Y)       (HDfabsf((X)-(Y)) < FLT_EPSILON)
+#define H5_DBL_ABS_EQUAL(X,Y)       (HDfabs ((X)-(Y)) < DBL_EPSILON)
+#define H5_LDBL_ABS_EQUAL(X,Y)      (HDfabsl((X)-(Y)) < LDBL_EPSILON)
+
+#define H5_FLT_REL_EQUAL(X,Y,M)     (HDfabsf(((Y)-(X)) / (X)) < (M))
+#define H5_DBL_REL_EQUAL(X,Y,M)     (HDfabs (((Y)-(X)) / (X)) < (M))
+#define H5_LDBL_REL_EQUAL(X,Y,M)    (HDfabsl(((Y)-(X)) / (X)) < (M))
+
+/*
+ * Redefine all the POSIX functions.  We should never see a POSIX
+ * function (or any other non-HDF5 function) in the source!
+ */
+#define HDabort()               abort()
+#define HDabs(X)                abs(X)
+#ifdef H5_HAVE_WIN32_API
+#define HDaccess(F,M)           _access(F, M)
+#define R_OK    4       /* Test for read permission.  */
+#define W_OK    2       /* Test for write permission.  */
+#define X_OK    1       /* Test for execute permission.  */
+#define F_OK    0       /* Test for existence.  */
+#else /* H5_HAVE_WIN32_API */
+#define HDaccess(F,M)           access(F, M)
+#ifndef F_OK
+#define F_OK  00
+#define W_OK 02
+#define R_OK 04
+#endif
+#endif /* H5_HAVE_WIN32_API */
+#define HDacos(X)               acos(X)
+#ifdef H5_HAVE_ALARM
+#define HDalarm(N)              alarm(N)
+#else /* H5_HAVE_ALARM */
+#define HDalarm(N)              (0)
+#endif /* H5_HAVE_ALARM */
+#define HDasctime(T)            asctime(T)
+#define HDasin(X)               asin(X)
+#define HDasprintf              asprintf /*varargs*/
+#define HDassert(X)             assert(X)
+#define HDatan(X)               atan(X)
+#define HDatan2(X,Y)            atan2(X,Y)
+#define HDatexit(F)             atexit(F)
+#define HDatof(S)               atof(S)
+#define HDatoi(S)               atoi(S)
+#define HDatol(S)               atol(S)
+#define HDbsearch(K,B,N,Z,F)    bsearch(K,B,N,Z,F)
+#define HDcalloc(N,Z)           calloc(N,Z)
+#define HDceil(X)               ceil(X)
+#define HDcfgetispeed(T)        cfgetispeed(T)
+#define HDcfgetospeed(T)        cfgetospeed(T)
+#define HDcfsetispeed(T,S)      cfsetispeed(T,S)
+#define HDcfsetospeed(T,S)      cfsetospeed(T,S)
+#define HDchdir(S)              chdir(S)
+#define HDchmod(S,M)            chmod(S,M)
+#define HDchown(S,O,G)          chown(S,O,G)
+#define HDclearerr(F)           clearerr(F)
+#define HDclock()               clock()
+#define HDclose(F)              close(F)
+#define HDclosedir(D)           closedir(D)
+#define HDcos(X)                cos(X)
+#define HDcosh(X)               cosh(X)
+#define HDcreat(S,M)            creat(S,M)
+#define HDctermid(S)            ctermid(S)
+#define HDctime(T)              ctime(T)
+#define HDcuserid(S)            cuserid(S)
+#ifdef H5_HAVE_DIFFTIME
+#define HDdifftime(X,Y)         difftime(X,Y)
+#else
+#define HDdifftime(X,Y)         ((double)(X)-(double)(Y))
+#endif
+#define HDdiv(X,Y)              div(X,Y)
+#define HDdup(F)                dup(F)
+#define HDdup2(F,I)             dup2(F,I)
+/* execl() variable arguments */
+/* execle() variable arguments */
+/* execlp() variable arguments */
+#define HDexecv(S,AV)           execv(S,AV)
+#define HDexecve(S,AV,E)        execve(S,AV,E)
+#define HDexecvp(S,AV)          execvp(S,AV)
+#define HDexit(N)               exit(N)
+#define HD_exit(N)              _exit(N)
+#define HDexp(X)                exp(X)
+#define HDfabs(X)               fabs(X)
+/* use ABS() because fabsf() fabsl() are not common yet. */
+#define HDfabsf(X)              ABS(X)
+#define HDfabsl(X)              ABS(X)
+#define HDfclose(F)             fclose(F)
+/* fcntl() variable arguments */
+#define HDfdopen(N,S)           fdopen(N,S)
+#define HDfeof(F)               feof(F)
+#define HDferror(F)             ferror(F)
+#define HDfflush(F)             fflush(F)
+#define HDfgetc(F)              fgetc(F)
+#define HDfgetpos(F,P)          fgetpos(F,P)
+#define HDfgets(S,N,F)          fgets(S,N,F)
+#ifdef H5_HAVE_WIN32_API
+#define HDfileno(F)             _fileno(F)
+#else /* H5_HAVE_WIN32_API */
+#define HDfileno(F)             fileno(F)
+#endif /* H5_HAVE_WIN32_API */
+#define HDfloor(X)              floor(X)
+#define HDfmod(X,Y)             fmod(X,Y)
+#define HDfopen(S,M)            fopen(S,M)
+#define HDfork()                fork()
+#define HDfpathconf(F,N)        fpathconf(F,N)
+H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
+#define HDfputc(C,F)            fputc(C,F)
+#define HDfputs(S,F)            fputs(S,F)
+#define HDfread(M,Z,N,F)        fread(M,Z,N,F)
+#define HDfree(M)               free(M)
+#define HDfreopen(S,M,F)        freopen(S,M,F)
+#define HDfrexp(X,N)            frexp(X,N)
+/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
+#ifdef H5_HAVE_FREXPF
+#define HDfrexpf(X,N)           frexpf(X,N)
+#else /* H5_HAVE_FREXPF */
+#define HDfrexpf(X,N)           frexp(X,N)
+#endif /* H5_HAVE_FREXPF */
+#ifdef H5_HAVE_FREXPL
+#define HDfrexpl(X,N)           frexpl(X,N)
+#else /* H5_HAVE_FREXPL */
+#define HDfrexpl(X,N)           frexp(X,N)
+#endif /* H5_HAVE_FREXPL */
+/* fscanf() variable arguments */
+#ifdef H5_HAVE_FSEEKO
+     #define HDfseek(F,O,W)     fseeko(F,O,W)
+#else
+     #define HDfseek(F,O,W)     fseek(F,O,W)
+#endif
+#define HDfsetpos(F,P)          fsetpos(F,P)
+/* definitions related to the file stat utilities.
+ * Windows have its own function names.
+ * For Unix, if off_t is not 64bit big, try use the pseudo-standard
+ * xxx64 versions if available.
+ */
+#ifdef H5_HAVE_WIN32_API
+    #define HDfstat(F,B)        _fstati64(F,B)
+    #define HDlstat(S,B)        _lstati64(S,B)
+    #define HDstat(S,B)         _stati64(S,B)
+    typedef struct _stati64     h5_stat_t;
+    typedef __int64             h5_stat_size_t;
+    #define HDoff_t             __int64
+#elif H5_SIZEOF_OFF_T!=8 && H5_SIZEOF_OFF64_T==8 && defined(H5_HAVE_STAT64)
+    #define HDfstat(F,B)        fstat64(F,B)
+    #define HDlstat(S,B)        lstat64(S,B)
+    #define HDstat(S,B)         stat64(S,B)
+    typedef struct stat64       h5_stat_t;
+    typedef off64_t             h5_stat_size_t;
+    #define HDoff_t             off64_t
+#else
+    #define HDfstat(F,B)        fstat(F,B)
+    #define HDlstat(S,B)        lstat(S,B)
+    #define HDstat(S,B)         stat(S,B)
+    typedef struct stat         h5_stat_t;
+    typedef off_t               h5_stat_size_t;
+    #define HDoff_t             off_t
+#endif
+
+#ifndef H5_HAVE_WIN32_API
+/* These definitions differ in Windows and are defined in
+ * H5win32defs for that platform.
+ */
+typedef struct stat         h5_stat_t;
+typedef off_t               h5_stat_size_t;
+#define HDoff_t             off_t
+#endif /* H5_HAVE_WIN32_API */
+
+#define HDftell(F)              ftell(F)
+#define HDftruncate(F,L)        ftruncate(F,L)
+#define HDfwrite(M,Z,N,F)       fwrite(M,Z,N,F)
+#define HDgetc(F)               getc(F)
+#define HDgetchar()             getchar()
+#define HDgetcwd(S,Z)           getcwd(S,Z)
+#define HDgetegid()             getegid()
+#define HDgetenv(S)             getenv(S)
+#define HDgeteuid()             geteuid()
+#define HDgetgid()              getgid()
+#define HDgetgrgid(G)           getgrgid(G)
+#define HDgetgrnam(S)           getgrnam(S)
+#define HDgetgroups(Z,G)        getgroups(Z,G)
+#ifdef H5_HAVE_WIN32_API
+#define HDgetlogin()            Wgetlogin()
+#else /* H5_HAVE_WIN32_API */
+#define HDgetlogin()            getlogin()
+#endif /* H5_HAVE_WIN32_API */
+#define HDgetpgrp()             getpgrp()
+#define HDgetpid()              getpid()
+#define HDgetppid()             getppid()
+#define HDgetpwnam(S)           getpwnam(S)
+#define HDgetpwuid(U)           getpwuid(U)
+#define HDgetrusage(X,S)        getrusage(X,S)
+#define HDgets(S)               gets(S)
+#ifdef H5_HAVE_WIN32_API
+    H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
+#define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
+#else /* H5_HAVE_WIN32_API */
+#define HDgettimeofday(S,P)     gettimeofday(S,P)
+#endif /* H5_HAVE_WIN32_API */
+#define HDgetuid()              getuid()
+#define HDgmtime(T)             gmtime(T)
+#define HDisalnum(C)            isalnum((int)(C)) /*cast for solaris warning*/
+#define HDisalpha(C)            isalpha((int)(C)) /*cast for solaris warning*/
+#define HDisatty(F)             isatty(F)
+#define HDiscntrl(C)            iscntrl((int)(C)) /*cast for solaris warning*/
+#define HDisdigit(C)            isdigit((int)(C)) /*cast for solaris warning*/
+#define HDisgraph(C)            isgraph((int)(C)) /*cast for solaris warning*/
+#define HDislower(C)            islower((int)(C)) /*cast for solaris warning*/
+#define HDisprint(C)            isprint((int)(C)) /*cast for solaris warning*/
+#define HDispunct(C)            ispunct((int)(C)) /*cast for solaris warning*/
+#define HDisspace(C)            isspace((int)(C)) /*cast for solaris warning*/
+#define HDisupper(C)            isupper((int)(C)) /*cast for solaris warning*/
+#define HDisxdigit(C)           isxdigit((int)(C)) /*cast for solaris warning*/
+#define HDkill(P,S)             kill(P,S)
+#define HDlabs(X)               labs(X)
+#define HDldexp(X,N)            ldexp(X,N)
+#define HDldiv(X,Y)             ldiv(X,Y)
+#define HDlink(OLD,NEW)         link(OLD,NEW)
+#define HDlocaleconv()          localeconv()
+#define HDlocaltime(T)          localtime(T)
+#define HDlog(X)                log(X)
+#define HDlog10(X)              log10(X)
+#define HDlongjmp(J,N)          longjmp(J,N)
+#ifdef H5_HAVE_WIN32_API
+    #define HDlseek(F,O,W)  _lseeki64(F,O,W)
+#else
+    #ifdef H5_HAVE_LSEEK64
+        #define HDlseek(F,O,W)  lseek64(F,O,W)
+    #else
+        #define HDlseek(F,O,W)  lseek(F,O,W)
+    #endif
+#endif
+#define HDmalloc(Z)             malloc(Z)
+#define HDposix_memalign(P,A,Z) posix_memalign(P,A,Z)
+#define HDmblen(S,N)            mblen(S,N)
+#define HDmbstowcs(P,S,Z)       mbstowcs(P,S,Z)
+#define HDmbtowc(P,S,Z)         mbtowc(P,S,Z)
+#define HDmemchr(S,C,Z)         memchr(S,C,Z)
+#define HDmemcmp(X,Y,Z)         memcmp(X,Y,Z)
+/*
+ * The (char*) casts are required for the DEC when optimizations are turned
+ * on and the source and/or destination are not aligned.
+ */
+#define HDmemcpy(X,Y,Z)         memcpy((char*)(X),(const char*)(Y),Z)
+#define HDmemmove(X,Y,Z)        memmove((char*)(X),(const char*)(Y),Z)
+/*
+ * The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
+ */
+#ifdef H5_HAVE_VISUAL_STUDIO
+#define HDmemset(X,C,Z)         memset((void*)(X),C,Z)
+#else /* H5_HAVE_VISUAL_STUDIO */
+#define HDmemset(X,C,Z)         memset(X,C,Z)
+#endif /* H5_HAVE_VISUAL_STUDIO */
+#ifdef H5_HAVE_WIN32_API
+#define HDmkdir(S,M)            _mkdir(S)
+#else /* H5_HAVE_WIN32_API */
+#define HDmkdir(S,M)            mkdir(S,M)
+#endif /* H5_HAVE_WIN32_API */
+#define HDmkfifo(S,M)           mkfifo(S,M)
+#define HDmktime(T)             mktime(T)
+#define HDmodf(X,Y)             modf(X,Y)
+#ifdef _O_BINARY
+#define HDopen(S,F,M)           open(S,F|_O_BINARY,M)
+#else
+#define HDopen(S,F,M)           open(S,F,M)
+#endif
+#define HDopendir(S)            opendir(S)
+#define HDpathconf(S,N)         pathconf(S,N)
+#define HDpause()               pause()
+#define HDperror(S)             perror(S)
+#define HDpipe(F)               pipe(F)
+#define HDpow(X,Y)              pow(X,Y)
+/* printf() variable arguments */
+#define HDputc(C,F)             putc(C,F)
+#define HDputchar(C)            putchar(C)
+#define HDputs(S)               puts(S)
+#define HDqsort(M,N,Z,F)        qsort(M,N,Z,F)
+#define HDraise(N)              raise(N)
+
+#ifdef H5_HAVE_RAND_R
+#define HDrandom()              HDrand()
+H5_DLL int HDrand(void);
+#elif H5_HAVE_RANDOM
+#define HDrand()                random()
+#define HDrandom()              random()
+#else
+#define HDrand()                rand()
+#define HDrandom()              rand()
+#endif
+
+#define HDread(F,M,Z)           read(F,M,Z)
+#define HDreaddir(D)            readdir(D)
+#define HDrealloc(M,Z)          realloc(M,Z)
+#define HDremove(S)             remove(S)
+#define HDrename(OLD,NEW)       rename(OLD,NEW)
+#define HDrewind(F)             rewind(F)
+#define HDrewinddir(D)          rewinddir(D)
+#define HDrmdir(S)              rmdir(S)
+/* scanf() variable arguments */
+#define HDsetbuf(F,S)           setbuf(F,S)
+#define HDsetgid(G)             setgid(G)
+#define HDsetjmp(J)             setjmp(J)
+#define HDsetlocale(N,S)        setlocale(N,S)
+#define HDsetpgid(P,PG)         setpgid(P,PG)
+#define HDsetsid()              setsid()
+#define HDsetuid(U)             setuid(U)
+/* Windows does not permit setting the buffer size to values
+   less than 2.  */
+#ifndef H5_HAVE_WIN32_API
+#define HDsetvbuf(F,S,M,Z)      setvbuf(F,S,M,Z)
+#else
+#define HDsetvbuf(F,S,M,Z)  setvbuf(F,S,M,(Z>1?Z:2))
+#endif
+#define HDsigaddset(S,N)        sigaddset(S,N)
+#define HDsigdelset(S,N)        sigdelset(S,N)
+#define HDsigemptyset(S)        sigemptyset(S)
+#define HDsigfillset(S)         sigfillset(S)
+#define HDsigismember(S,N)      sigismember(S,N)
+#define HDsiglongjmp(J,N)       siglongjmp(J,N)
+#define HDsignal(N,F)           signal(N,F)
+#define HDsigpending(S)         sigpending(S)
+#define HDsigprocmask(H,S,O)    sigprocmask(H,S,O)
+#define HDsigsetjmp(J,N)        sigsetjmp(J,N)
+#define HDsigsuspend(S)         sigsuspend(S)
+#define HDsin(X)                sin(X)
+#define HDsinh(X)               sinh(X)
+#define HDsleep(N)              sleep(N)
+#ifdef H5_HAVE_WIN32_API
+H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...);
+#define HDsnprintf          c99_snprintf /*varargs*/
+#else
+#define HDsnprintf              snprintf /*varargs*/
+#endif
+/* sprintf() variable arguments */
+#define HDsqrt(X)               sqrt(X)
+#ifdef H5_HAVE_RAND_R
+H5_DLL void HDsrand(unsigned int seed);
+#define HDsrandom(S)            HDsrand(S)
+#elif H5_HAVE_RANDOM
+#define HDsrand(S)              srandom(S)
+#define HDsrandom(S)            srandom(S)
+#else
+#define HDsrand(S)              srand(S)
+#define HDsrandom(S)            srand(S)
+#endif
+/* sscanf() variable arguments */
+
+#ifdef H5_HAVE_WIN32_API
+#define HDstrcasecmp(A,B)   _stricmp(A,B)
+#else
+#define HDstrcasecmp(X,Y)      strcasecmp(X,Y)
+#endif
+#define HDstrcat(X,Y)           strcat(X,Y)
+#define HDstrchr(S,C)           strchr(S,C)
+#define HDstrcmp(X,Y)           strcmp(X,Y)
+#define HDstrcoll(X,Y)          strcoll(X,Y)
+#define HDstrcpy(X,Y)           strcpy(X,Y)
+#define HDstrcspn(X,Y)          strcspn(X,Y)
+#define HDstrerror(N)           strerror(N)
+#define HDstrftime(S,Z,F,T)     strftime(S,Z,F,T)
+#define HDstrlen(S)             strlen(S)
+#define HDstrncat(X,Y,Z)        strncat(X,Y,Z)
+#define HDstrncmp(X,Y,Z)        strncmp(X,Y,Z)
+#define HDstrncpy(X,Y,Z)        strncpy(X,Y,Z)
+#define HDstrpbrk(X,Y)          strpbrk(X,Y)
+#define HDstrrchr(S,C)          strrchr(S,C)
+#define HDstrspn(X,Y)           strspn(X,Y)
+#define HDstrstr(X,Y)           strstr(X,Y)
+#define HDstrtod(S,R)           strtod(S,R)
+#define HDstrtok(X,Y)           strtok(X,Y)
+#define HDstrtol(S,R,N)         strtol(S,R,N)
+H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
+#define HDstrtoul(S,R,N)        strtoul(S,R,N)
+#ifdef H5_HAVE_WIN32_API
+#define HDstrtoull(S,R,N)       _strtoui64(S,R,N)
+#else
+#define HDstrtoull(S,R,N)       strtoull(S,R,N)
+#endif
+#define HDstrxfrm(X,Y,Z)        strxfrm(X,Y,Z)
+#define HDsysconf(N)            sysconf(N)
+#define HDsystem(S)             system(S)
+#define HDtan(X)                tan(X)
+#define HDtanh(X)               tanh(X)
+#define HDtcdrain(F)            tcdrain(F)
+#define HDtcflow(F,A)           tcflow(F,A)
+#define HDtcflush(F,N)          tcflush(F,N)
+#define HDtcgetattr(F,T)        tcgetattr(F,T)
+#define HDtcgetpgrp(F)          tcgetpgrp(F)
+#define HDtcsendbreak(F,N)      tcsendbreak(F,N)
+#define HDtcsetattr(F,O,T)      tcsetattr(F,O,T)
+#define HDtcsetpgrp(F,N)        tcsetpgrp(F,N)
+#define HDtime(T)               time(T)
+#define HDtimes(T)              times(T)
+#define HDtmpfile()             tmpfile()
+#define HDtmpnam(S)             tmpnam(S)
+#define HDtolower(C)            tolower(C)
+#define HDtoupper(C)            toupper(C)
+#define HDttyname(F)            ttyname(F)
+#define HDtzset()               tzset()
+#define HDumask(N)              umask(N)
+#define HDuname(S)              uname(S)
+#define HDungetc(C,F)           ungetc(C,F)
+#ifdef H5_HAVE_WIN32_API
+#define HDunlink(S)             _unlink(S)
+#else
+#define HDunlink(S)             unlink(S)
+#endif
+#define HDutime(S,T)            utime(S,T)
+#define HDva_arg(A,T)           va_arg(A,T)
+#define HDva_end(A)             va_end(A)
+#define HDva_start(A,P)         va_start(A,P)
+#define HDvasprintf(RET,FMT,A)  vasprintf(RET,FMT,A)
+#define HDvfprintf(F,FMT,A)     vfprintf(F,FMT,A)
+#define HDvprintf(FMT,A)        vprintf(FMT,A)
+#define HDvsprintf(S,FMT,A)     vsprintf(S,FMT,A)
+#ifdef H5_HAVE_WIN32_API
+H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap);
+#define HDvsnprintf         c99_vsnprintf
+#else
+#   define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A)
+#endif
+#define HDwait(W)               wait(W)
+#define HDwaitpid(P,W,O)        waitpid(P,W,O)
+#define HDwcstombs(S,P,Z)       wcstombs(S,P,Z)
+#define HDwctomb(S,C)           wctomb(S,C)
+#define HDwrite(F,M,Z)          write(F,M,Z)
+
+/*
+ * And now for a couple non-Posix functions...  Watch out for systems that
+ * define these in terms of macros.
+ */
+#ifdef H5_HAVE_WIN32_API
+#define HDstrdup(S)    _strdup(S)
+#else /* H5_HAVE_WIN32_API */
+
+#if !defined strdup && !defined H5_HAVE_STRDUP
+extern char *strdup(const char *s);
+#endif
+
+#define HDstrdup(S)     strdup(S)
+
+#endif /* H5_HAVE_WIN32_API */
+
+/*
+ * HDF Boolean type.
+ */
+#ifndef FALSE
+#   define FALSE false
+#endif
+#ifndef TRUE
+#   define TRUE true
+#endif
+
+/** From h5test.h **/
+
+#ifdef H5_HAVE_PARALLEL
+extern MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
+#endif
+
+#ifdef H5_HAVE_PARALLEL
+H5TEST_DLL int h5_set_info_object(void);
+H5TEST_DLL void h5_dump_info_object(MPI_Info info);
+#endif
+
+
+
+/** From h5tools_utils.h **/
+
+extern int         opt_err;     /* getoption prints errors if this is on    */
+extern int         opt_ind;     /* token pointer                            */
+extern const char *opt_arg;     /* flag argument (or value)                 */
+
+
+enum {
+    no_arg = 0,         /* doesn't take an argument     */
+    require_arg,        /* requires an argument          */
+    optional_arg        /* argument is optional         */
+};
+
+
+typedef struct long_options {
+    const char  *name;          /* name of the long option              */
+    int          has_arg;       /* whether we should look for an arg    */
+    char         shortval;      /* the shortname equivalent of long arg
+                                 * this gets returned from get_option   */
+} long_options;
+
+extern int    get_option(int argc, const char **argv, const char *opt,
+                         const struct long_options *l_opt);
+#endif
diff --git a/tools/test/perform/zip_perf.c b/tools/test/perform/zip_perf.c
new file mode 100644
index 0000000..0636d3b
--- /dev/null
+++ b/tools/test/perform/zip_perf.c
@@ -0,0 +1,642 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the COPYING file, which can be found at the root of the source code       *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
+ * If you do not have access to either file, you may request a copy from     *
+ * help at hdfgroup.org.                                                        *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* ===========================================================================
+ * Usage:  zip_perf [-d] [-f] [-h] [-1 to -9] [files...]
+ *   -d : decompress
+ *   -f : compress with Z_FILTERED
+ *   -h : compress with Z_HUFFMAN_ONLY
+ *   -1 to -9 : compression level
+ */
+
+/* our header files */
+#include "h5test.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+
+#include <zlib.h>
+
+#define ONE_KB              1024
+#define ONE_MB              (ONE_KB * ONE_KB)
+#define ONE_GB              (ONE_MB * ONE_KB)
+
+#define MICROSECOND         1000000.0F
+
+/* report 0.0 in case t is zero too */
+#define MB_PER_SEC(bytes,t) ((fabs(t) < (double)0.0000000001F) ? (double)0.0F : ((((double)bytes) / (double)ONE_MB) / (t)))
+
+#ifndef TRUE
+#define TRUE    1
+#endif  /* TRUE */
+
+#ifndef FALSE
+#define FALSE   (!TRUE)
+#endif  /* FALSE */
+
+#ifndef S_IRWXU
+#define S_IRWXU (_S_IREAD|_S_IWRITE)
+#endif
+
+/* internal variables */
+static const char *prog=NULL;
+static const char *option_prefix=NULL;
+static char *filename=NULL;
+static int compress_percent = 0;
+static int compress_level = Z_DEFAULT_COMPRESSION;
+static int output, random_test = FALSE;
+static int report_once_flag;
+static double compression_time;
+
+/* internal functions */
+static void error(const char *fmt, ...);
+static void compress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
+                            uLong sourceLen);
+
+/* commandline options : long and short form */
+static const char *s_opts = "hB:b:c:p:rs:0123456789";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "compressability", require_arg, 'c' },
+    { "compressabilit", require_arg, 'c' },
+    { "compressabili", require_arg, 'c' },
+    { "compressabil", require_arg, 'c' },
+    { "compressabi", require_arg, 'c' },
+    { "compressab", require_arg, 'c' },
+    { "compressa", require_arg, 'c' },
+    { "compress", require_arg, 'c' },
+    { "compres", require_arg, 'c' },
+    { "compre", require_arg, 'c' },
+    { "compr", require_arg, 'c' },
+    { "comp", require_arg, 'c' },
+    { "com", require_arg, 'c' },
+    { "co", require_arg, 'c' },
+    { "file-size", require_arg, 's' },
+    { "file-siz", require_arg, 's' },
+    { "file-si", require_arg, 's' },
+    { "file-s", require_arg, 's' },
+    { "file", require_arg, 's' },
+    { "fil", require_arg, 's' },
+    { "fi", require_arg, 's' },
+    { "max-buffer-size", require_arg, 'B' },
+    { "max-buffer-siz", require_arg, 'B' },
+    { "max-buffer-si", require_arg, 'B' },
+    { "max-buffer-s", require_arg, 'B' },
+    { "max-buffer", require_arg, 'B' },
+    { "max-buffe", require_arg, 'B' },
+    { "max-buff", require_arg, 'B' },
+    { "max-buf", require_arg, 'B' },
+    { "max-bu", require_arg, 'B' },
+    { "max-b", require_arg, 'B' },
+    { "max", require_arg, 'B' },
+    { "min-buffer-size", require_arg, 'b' },
+    { "min-buffer-siz", require_arg, 'b' },
+    { "min-buffer-si", require_arg, 'b' },
+    { "min-buffer-s", require_arg, 'b' },
+    { "min-buffer", require_arg, 'b' },
+    { "min-buffe", require_arg, 'b' },
+    { "min-buff", require_arg, 'b' },
+    { "min-buf", require_arg, 'b' },
+    { "min-bu", require_arg, 'b' },
+    { "min-b", require_arg, 'b' },
+    { "min", require_arg, 'b' },
+    { "prefix", require_arg, 'p' },
+    { "prefi", require_arg, 'p' },
+    { "pref", require_arg, 'p' },
+    { "pre", require_arg, 'p' },
+    { "pr", require_arg, 'p' },
+    { "random-test", no_arg, 'r' },
+    { "random-tes", no_arg, 'r' },
+    { "random-te", no_arg, 'r' },
+    { "random-t", no_arg, 'r' },
+    { "random", no_arg, 'r' },
+    { "rando", no_arg, 'r' },
+    { "rand", no_arg, 'r' },
+    { "ran", no_arg, 'r' },
+    { "ra", no_arg, 'r' },
+    { NULL, 0, '\0' }
+};
+
+/*
+ * Function:    error
+ * Purpose:     Display error message and exit.
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+static void
+error(const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    HDfprintf(stderr, "%s: error: ", prog);
+    HDvfprintf(stderr, fmt, ap);
+    HDfprintf(stderr, "\n");
+    va_end(ap);
+    HDexit(EXIT_FAILURE);
+}
+
+/*
+ * Function:    cleanup
+ * Purpose:     Cleanup the output file.
+ * Returns:     Nothing
+ * Programmer:  Bill Wendling, 06. June 2002
+ * Modifications:
+ */
+static void
+cleanup(void)
+{
+    if (!HDgetenv("HDF5_NOCLEANUP"))
+        HDunlink(filename);
+    HDfree(filename);
+}
+
+static void
+write_file(Bytef *source, uLongf sourceLen)
+{
+    Bytef *d_ptr, *dest;
+    uLongf d_len, destLen;
+    struct timeval timer_start, timer_stop;
+
+    /* destination buffer needs to be at least 0.1% larger than sourceLen
+     * plus 12 bytes */
+    destLen = (uLongf)((double)sourceLen + ((double)sourceLen * (double)0.1F)) + 12;
+    dest = (Bytef *)HDmalloc(destLen);
+
+    if (!dest)
+        error("out of memory");
+
+    HDgettimeofday(&timer_start, NULL);
+    compress_buffer(dest, &destLen, source, sourceLen);
+    HDgettimeofday(&timer_stop, NULL);
+
+    compression_time += ((double)timer_stop.tv_sec +
+                            ((double)timer_stop.tv_usec) / (double)MICROSECOND) -
+                        ((double)timer_start.tv_sec +
+                            ((double)timer_start.tv_usec) / (double)MICROSECOND);
+
+    if (report_once_flag) {
+        HDfprintf(stdout, "\tCompression Ratio: %g\n", ((double)destLen) / (double)sourceLen);
+        report_once_flag = 0;
+    }
+
+    d_ptr = dest;
+    d_len = destLen;
+
+    /* loop to make sure we write everything out that we want to write */
+    for (;;) {
+        int rc = (int)HDwrite(output, d_ptr, (size_t)d_len);
+
+        if (rc == -1)
+            error(HDstrerror(errno));
+
+        if (rc == (int)d_len)
+            break;
+
+        d_len -= (size_t)rc;
+        d_ptr += rc;
+    }
+
+    HDfree(dest);
+}
+
+/*
+ * Function:    compress_buffer
+ * Purpose:     Compress the buffer.
+ * Returns:     Z_OK            - success
+ *              Z_MEM_ERROR     - not enough memory
+ *              Z_BUF_ERROR     - not enough room in the output buffer
+ *              Z_STREAM_ERROR  - level parameter is invalid
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+static void
+compress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
+                uLong sourceLen)
+{
+    int rc = compress2(dest, destLen, source, sourceLen, compress_level);
+
+    if (rc != Z_OK) {
+        /* compress2 failed - cleanup and tell why */
+        cleanup();
+
+        switch (rc) {
+        case Z_MEM_ERROR:
+            error("not enough memory");
+            break;
+        case Z_BUF_ERROR:
+            error("not enough room in the output buffer");
+            break;
+        case Z_STREAM_ERROR:
+            error("level parameter (%d) is invalid", compress_level);
+            break;
+        default:
+            error("unknown compression error");
+            break;
+        }
+    }
+}
+
+#ifdef LATER
+/*
+ * Function:    uncompress_buffer
+ * Purpose:     Uncompress the buffer.
+ * Returns:     Z_OK            - success
+ *              Z_MEM_ERROR     - not enough memory
+ *              Z_BUF_ERROR     - not enough room in the output buffer
+ *              Z_DATA_ERROR    - the input data was corrupted
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+static int
+uncompress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source,
+                  uLong sourceLen)
+{
+    int rc = uncompress(dest, destLen, source, sourceLen);
+
+    return rc;
+}
+#endif /* LATER */
+
+/*
+ * Function:    get_unique_name
+ * Purpose:     Create a new file who's name doesn't conflict with
+ *              pre-existing files.
+ * Returns:     Nothing
+ * Programmer:  Bill Wendling, 06. June 2002
+ * Modifications:
+ */
+#define ZIP_PERF_FILE "zip_perf.data"
+static void
+get_unique_name(void)
+{
+    const char *prefix = NULL;
+    const char *env = HDgetenv("HDF5_PREFIX");
+
+    if (env)
+        prefix = env;
+
+    if (option_prefix)
+        prefix = option_prefix;
+
+    if (prefix)
+        /* 2 = 1 for '/' + 1 for null terminator */
+        filename = (char *) HDmalloc(HDstrlen(prefix) + HDstrlen(ZIP_PERF_FILE) + 2);
+    else
+        filename = (char *) HDmalloc(HDstrlen(ZIP_PERF_FILE) + 1);
+
+    if (!filename)
+        error("out of memory");
+
+    filename[0] = 0;
+    if (prefix){
+        HDstrcpy(filename, prefix);
+        HDstrcat(filename, "/");
+    }
+    HDstrcat(filename, ZIP_PERF_FILE);
+}
+
+/*
+ * Function:    usage
+ * Purpose:     Print a usage message and then exit.
+ * Return:      Nothing
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+static void
+usage(void)
+{
+    HDfprintf(stdout, "usage: %s [OPTIONS]\n", prog);
+    HDfprintf(stdout, "  OPTIONS\n");
+    HDfprintf(stdout, "     -h, --help                 Print this usage message and exit\n");
+    HDfprintf(stdout, "     -1...-9                    Level of compression, from 1 to 9\n");
+    HDfprintf(stdout, "     -c P, --compressability=P  Percentage of compressability of the random\n");
+    HDfprintf(stdout, "                                data you want [default: 0]");
+    HDfprintf(stdout, "     -s S, --file-size=S        Maximum size of uncompressed file [default: 64M]\n");
+    HDfprintf(stdout, "     -B S, --max-buffer_size=S  Maximum size of buffer [default: 1M]\n");
+    HDfprintf(stdout, "     -b S, --min-buffer_size=S  Minumum size of buffer [default: 128K]\n");
+    HDfprintf(stdout, "     -p D, --prefix=D           The directory prefix to place the file\n");
+    HDfprintf(stdout, "     -r, --random-test          Use random data to write to the file\n");
+    HDfprintf(stdout, "                                [default: no]\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "  D  - a directory which exists\n");
+    HDfprintf(stdout, "  P  - a number between 0 and 100\n");
+    HDfprintf(stdout, "  S  - is a size specifier, an integer >=0 followed by a size indicator:\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "          K - Kilobyte (%d)\n", ONE_KB);
+    HDfprintf(stdout, "          M - Megabyte (%d)\n", ONE_MB);
+    HDfprintf(stdout, "          G - Gigabyte (%d)\n", ONE_GB);
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "      Example: 37M = 37 Megabytes = %d bytes\n", 37 * ONE_MB);
+    HDfprintf(stdout, "\n");
+    HDfflush(stdout);
+}
+
+/*
+ * Function:    parse_size_directive
+ * Purpose:     Parse the size directive passed on the commandline. The size
+ *              directive is an integer followed by a size indicator:
+ *
+ *                  K, k - Kilobyte
+ *                  M, m - Megabyte
+ *
+ * Return:      The size as a size_t because this is related to buffer size.
+ *              If an unknown size indicator is used, then the program will
+ *              exit with EXIT_FAILURE as the return value.
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+static unsigned long
+parse_size_directive(const char *size)
+{
+    unsigned long s;
+    char *endptr;
+
+    s = HDstrtoul(size, &endptr, 10);
+
+    if (endptr && *endptr) {
+        while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
+            ++endptr;
+
+        switch (*endptr) {
+            case 'K':
+            case 'k':
+                s *= ONE_KB;
+                break;
+            case 'M':
+            case 'm':
+                s *= ONE_MB;
+                break;
+            case 'G':
+            case 'g':
+                s *= ONE_GB;
+                break;
+            default:
+                error("illegal size specifier '%c'", *endptr);
+                break;
+        }
+    }
+
+    return s;
+}
+
+static void
+fill_with_random_data(Bytef *src, uLongf src_len)
+{
+    register unsigned u;
+    h5_stat_t stat_buf;
+
+    if (HDstat("/dev/urandom", &stat_buf) == 0) {
+        uLongf len = src_len;
+        Bytef *buf = src;
+        int fd = HDopen("/dev/urandom", O_RDONLY, 0);
+
+        HDfprintf(stdout, "Using /dev/urandom for random data\n");
+
+        if (fd < 0)
+            error(HDstrerror(errno));
+
+        for (;;) {
+            ssize_t rc = HDread(fd, buf, src_len);
+
+            if (rc == -1)
+                error(HDstrerror(errno));
+
+            if (rc == (ssize_t)len)
+                break;
+
+            buf += rc;
+            len -= (size_t)rc;
+        }
+    } else {
+        HDfprintf(stdout, "Using random() for random data\n");
+
+        for (u = 0; u < src_len; ++u)
+            src[u] = (Bytef)(0xff & HDrandom());
+    }
+
+    if (compress_percent) {
+        size_t s = (size_t)((src_len * (uLongf)compress_percent) / 100);
+
+        HDmemset(src, '\0', s);
+    }
+}
+
+static void
+do_write_test(unsigned long file_size, unsigned long min_buf_size,
+              unsigned long max_buf_size)
+{
+    uLongf src_len, total_len;
+    struct timeval timer_start, timer_stop;
+    double total_time;
+    Bytef *src;
+
+    for (src_len = min_buf_size; src_len <= max_buf_size; src_len <<= 1) {
+        register unsigned long i, iters;
+
+        iters = file_size / src_len;
+        src = (Bytef *)HDcalloc(1, sizeof(Bytef) * src_len);
+
+        if (!src) {
+            cleanup();
+            error("out of memory");
+        }
+
+        compression_time = 0.0F;
+
+        if (random_test)
+            fill_with_random_data(src, src_len);
+
+        HDfprintf(stdout, "Buffer size == ");
+
+        if (src_len >= ONE_KB && (src_len % ONE_KB) == 0) {
+            if (src_len >= ONE_MB && (src_len % ONE_MB) == 0) {
+                HDfprintf(stdout, "%ldMB", src_len / ONE_MB);
+            } else {
+                HDfprintf(stdout, "%ldKB", src_len / ONE_KB);
+            }
+        } else {
+            HDfprintf(stdout, "%ld", src_len);
+        }
+
+        HDfprintf(stdout, "\n");
+
+        /* do uncompressed data write */
+        HDgettimeofday(&timer_start, NULL);
+        output = HDopen(filename, O_RDWR | O_CREAT, S_IRWXU);
+
+        if (output == -1)
+            error(HDstrerror(errno));
+
+        for (i = 0; i <= iters; ++i) {
+            Bytef *s_ptr = src;
+            uLong s_len = src_len;
+
+            /* loop to make sure we write everything out that we want to write */
+            for (;;) {
+                ssize_t rc = HDwrite(output, s_ptr, s_len);
+
+                if (rc == -1)
+                    error(HDstrerror(errno));
+
+                if (rc == (ssize_t)s_len)
+                    break;
+
+                s_len -= (size_t)rc;
+                s_ptr += rc;
+            }
+        }
+
+        HDclose(output);
+        HDgettimeofday(&timer_stop, NULL);
+
+        total_time = ((double)timer_stop.tv_sec +
+                            ((double)timer_stop.tv_usec) / (double)MICROSECOND) -
+                     ((double)timer_start.tv_sec +
+                            ((double)timer_start.tv_usec) / (double)MICROSECOND);
+
+        HDfprintf(stdout, "\tUncompressed Write Time: %.2fs\n", total_time);
+        HDfprintf(stdout, "\tUncompressed Write Throughput: %.2fMB/s\n",
+               MB_PER_SEC(file_size, total_time));
+
+        HDunlink(filename);
+
+        /* do compressed data write */
+        output = HDopen(filename, O_RDWR | O_CREAT, S_IRWXU);
+
+        if (output == -1)
+            error(HDstrerror(errno));
+
+        report_once_flag = 1;
+        HDgettimeofday(&timer_start, NULL);
+
+        for (total_len = 0; total_len < file_size; total_len += src_len)
+            write_file(src, src_len);
+
+        HDclose(output);
+        HDgettimeofday(&timer_stop, NULL);
+
+        total_time = ((double)timer_stop.tv_sec +
+                            ((double)timer_stop.tv_usec) / (double)MICROSECOND) -
+                     ((double)timer_start.tv_sec +
+                            ((double)timer_start.tv_usec) / (double)MICROSECOND);
+
+        HDfprintf(stdout, "\tCompressed Write Time: %.2fs\n", total_time);
+        HDfprintf(stdout, "\tCompressed Write Throughput: %.2fMB/s\n",
+               MB_PER_SEC(file_size, total_time));
+        HDfprintf(stdout, "\tCompression Time: %gs\n", compression_time);
+
+        HDunlink(filename);
+        HDfree(src);
+    }
+}
+
+/*
+ * Function:    main
+ * Purpose:     Run the program
+ * Return:      EXIT_SUCCESS or EXIT_FAILURE
+ * Programmer:  Bill Wendling, 05. June 2002
+ * Modifications:
+ */
+int
+main(int argc, char **argv)
+{
+    unsigned long min_buf_size = 128 * ONE_KB, max_buf_size = ONE_MB;
+    unsigned long file_size = 64 * ONE_MB;
+    int opt;
+
+    prog = argv[0];
+    
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) > 0) {
+        switch ((char)opt) {
+        case '0': case '1': case '2':
+        case '3': case '4': case '5':
+        case '6': case '7': case '8':
+        case '9':
+            compress_level = opt - '0';
+            break;
+        case 'B':
+            max_buf_size = parse_size_directive(opt_arg);
+            break;
+        case 'b':
+            min_buf_size = parse_size_directive(opt_arg);
+            break;
+        case 'c':
+            compress_percent = (int)HDstrtol(opt_arg, NULL, 10);
+
+            if (compress_percent < 0)
+                compress_percent = 0;
+            else if (compress_percent > 100)
+                compress_percent = 100;
+
+            break;
+        case 'p':
+            option_prefix = opt_arg;
+            break;
+        case 'r':
+            random_test = TRUE;
+            break;
+        case 's':
+            file_size = parse_size_directive(opt_arg);
+            break;
+        case '?':
+            usage();
+            exit(EXIT_FAILURE);
+            break;
+        case 'h':
+        default:
+            usage();
+            exit(EXIT_SUCCESS);
+            break;
+        }
+    }
+
+    if (min_buf_size > max_buf_size)
+        error("minmum buffer size (%d) exceeds maximum buffer size (%d)",
+              min_buf_size, max_buf_size);
+
+    HDfprintf(stdout, "Filesize: %ld\n", file_size);
+
+    if (compress_level == Z_DEFAULT_COMPRESSION)
+        HDfprintf(stdout, "Compression Level: 6\n");
+    else
+        HDfprintf(stdout, "Compression Level: %d\n", compress_level);
+
+    get_unique_name();
+    do_write_test(file_size, min_buf_size, max_buf_size);
+    cleanup();
+    return EXIT_SUCCESS;
+}
+
+#else
+
+/*
+ * Function:    main
+ * Purpose:     Dummy main() function for if HDF5 was configured without
+ *              zlib stuff.
+ * Return:      EXIT_SUCCESS
+ * Programmer:  Bill Wendling, 10. June 2002
+ * Modifications:
+ */
+int
+main(void)
+{
+    HDfprintf(stdout, "No compression IO performance because zlib was not configured\n");
+    return EXIT_SUCCESS;
+}
+
+#endif  /* !H5_HAVE_FILTER_DEFLATE */
diff --git a/tools/testfiles/family_file00000.h5 b/tools/testfiles/family_file00000.h5
index d86fb96..88f75ca 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
index bed5349..6b8aa47 100644
--- a/tools/testfiles/file_space.ddl
+++ b/tools/testfiles/file_space.ddl
@@ -9,8 +9,10 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_AGGR_VFD
-   FREE_SPACE_THRESHOLD 10
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_NONE
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 8192
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/file_space.h5 b/tools/testfiles/file_space.h5
index 425d0c2..d9e2890 100644
Binary files a/tools/testfiles/file_space.h5 and b/tools/testfiles/file_space.h5 differ
diff --git a/tools/testfiles/taindices.h5 b/tools/testfiles/taindices.h5
index c0e5a68..b482a21 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 b39d966..90371f2 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 4c0b105..e2e53e8 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 dbc6031..580d846 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 142822b..b34efb8 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 e597e3b..55ebf46 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 d5ad021..7eb078c 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 a744ed5..74089ea 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 bceb228..d61def5 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 f062399..c40f3f7 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 50bf2fd..c54c2c3 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 b1b7751..11087f0 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 4758948..73ae4e5 100644
--- a/tools/testfiles/tboot1.ddl
+++ b/tools/testfiles/tboot1.ddl
@@ -9,8 +9,10 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2.ddl b/tools/testfiles/tboot2.ddl
index d83b92b..504a634 100644
--- a/tools/testfiles/tboot2.ddl
+++ b/tools/testfiles/tboot2.ddl
@@ -9,8 +9,10 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2A.ddl b/tools/testfiles/tboot2A.ddl
index d83b92b..504a634 100644
--- a/tools/testfiles/tboot2A.ddl
+++ b/tools/testfiles/tboot2A.ddl
@@ -9,8 +9,10 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2B.ddl b/tools/testfiles/tboot2B.ddl
index d83b92b..504a634 100644
--- a/tools/testfiles/tboot2B.ddl
+++ b/tools/testfiles/tboot2B.ddl
@@ -9,8 +9,10 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
-   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
-   FREE_SPACE_THRESHOLD 1
+   FILE_SPACE_STRATEGY H5F_FSPACE_STRATEGY_FSM_AGGR
+   FREE_SPACE_PERSIST FALSE
+   FREE_SPACE_SECTION_THRESHOLD 1
+   FILE_SPACE_PAGE_SIZE 4096
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tchar.h5 b/tools/testfiles/tchar.h5
index 0391772..4d23ea9 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 edef9d3..d1ec650 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 482f9fd..98e80bd 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 a0c90eb..5c6274f 100644
Binary files a/tools/testfiles/tcompound_complex.h5 and b/tools/testfiles/tcompound_complex.h5 differ
diff --git a/tools/testfiles/tcompound_complex2.ddl b/tools/testfiles/tcompound_complex2.ddl
new file mode 100644
index 0000000..562235d
--- /dev/null
+++ b/tools/testfiles/tcompound_complex2.ddl
@@ -0,0 +1,1051 @@
+HDF5 "tcompound_complex2.h5" {
+GROUP "/" {
+   DATASET "CompoundComplex1D" {
+      DATATYPE  H5T_COMPOUND {
+         H5T_ARRAY { [4] H5T_STD_U32LE } "a";
+         H5T_ARRAY { [6] H5T_STD_I32LE } "b";
+         H5T_ARRAY { [2][4] H5T_IEEE_F32LE } "c";
+         H5T_COMPOUND {
+            H5T_IEEE_F64LE "nested_double";
+            H5T_ARRAY { [1] H5T_STRING {
+               STRSIZE 23;
+               STRPAD H5T_STR_NULLTERM;
+               CSET H5T_CSET_ASCII;
+               CTYPE H5T_C_S1;
+            } } "nested_string";
+            H5T_ARRAY { [4] H5T_STRING {
+               STRSIZE 12;
+               STRPAD H5T_STR_NULLTERM;
+               CSET H5T_CSET_ASCII;
+               CTYPE H5T_C_S1;
+            } } "nested_string_array";
+         } "nested_compound";
+         H5T_COMPOUND {
+            H5T_IEEE_F32LE "nested_float";
+            H5T_COMPOUND {
+               H5T_ARRAY { [5] H5T_STD_U32LE } "nested_unsigned_int";
+               H5T_ARRAY { [5] H5T_STD_I32LE } "nested_int";
+               H5T_ARRAY { [5] H5T_STD_U64LE } "nested_unsigned_long";
+               H5T_ARRAY { [5] H5T_STD_I64LE } "nested_long";
+            } "further_nested_compoundA";
+            H5T_COMPOUND {
+               H5T_ARRAY { [1] H5T_STRING {
+                  STRSIZE 11;
+                  STRPAD H5T_STR_NULLTERM;
+                  CSET H5T_CSET_ASCII;
+                  CTYPE H5T_C_S1;
+               } } "nested_string";
+               H5T_ARRAY { [4] H5T_STRING {
+                  STRSIZE 13;
+                  STRPAD H5T_STR_NULLTERM;
+                  CSET H5T_CSET_ASCII;
+                  CTYPE H5T_C_S1;
+               } } "nested_string_array";
+               H5T_COMPOUND {
+                  H5T_ARRAY { [10] H5T_STD_I16LE } "deep_nested_short";
+                  H5T_ARRAY { [10] H5T_STD_I32LE } "deep_nested_int";
+                  H5T_ARRAY { [10] H5T_STD_I64LE } "deep_nested_long";
+                  H5T_ARRAY { [10] H5T_IEEE_F64LE } "deep_nested_double";
+                  H5T_ARRAY { [10] H5T_IEEE_F32LE } "deep_nested_float";
+               } "deep_nested_compound";
+            } "further_nested_compoundB";
+         } "multiple_nested_compound";
+      }
+      DATASPACE  SIMPLE { ( 32 ) / ( 32 ) }
+      DATA {
+      (0): {
+            [ 0, 1, 2, 3 ],
+            [ 0, 1, 2, 3, 4, 5 ],
+            [ 0, 1, 2, 3,
+               1.1, 2.1, 3.1, 4.1 ],
+            {
+               0,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               0,
+               {
+                  [ 0, 1, 2, 3, 4 ],
+                  [ 0, 1, 2, 3, 4 ],
+                  [ 0, 1, 2, 3, 4 ],
+                  [ 0, 1, 2, 3, 4 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
+                     [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
+                     [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
+                     [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
+                     [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
+                  }
+               }
+            }
+         },
+      (1): {
+            [ 10, 11, 12, 13 ],
+            [ -10, -9, -8, -7, -6, -5 ],
+            [ 10, 11, 12, 13,
+               11.1, 12.1, 13.1, 14.1 ],
+            {
+               1,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               1,
+               {
+                  [ 10, 11, 12, 13, 14 ],
+                  [ -10, -9, -8, -7, -6 ],
+                  [ 10, 11, 12, 13, 14 ],
+                  [ -10, -9, -8, -7, -6 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ],
+                     [ -10, -9, -8, -7, -6, -5, -4, -3, -2, -1 ],
+                     [ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ],
+                     [ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ],
+                     [ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ]
+                  }
+               }
+            }
+         },
+      (2): {
+            [ 20, 21, 22, 23 ],
+            [ -20, -19, -18, -17, -16, -15 ],
+            [ 20, 21, 22, 23,
+               21.1, 22.1, 23.1, 24.1 ],
+            {
+               2,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               2,
+               {
+                  [ 20, 21, 22, 23, 24 ],
+                  [ -20, -19, -18, -17, -16 ],
+                  [ 20, 21, 22, 23, 24 ],
+                  [ -20, -19, -18, -17, -16 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ],
+                     [ -20, -19, -18, -17, -16, -15, -14, -13, -12, -11 ],
+                     [ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ],
+                     [ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ],
+                     [ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]
+                  }
+               }
+            }
+         },
+      (3): {
+            [ 30, 31, 32, 33 ],
+            [ -30, -29, -28, -27, -26, -25 ],
+            [ 30, 31, 32, 33,
+               31.1, 32.1, 33.1, 34.1 ],
+            {
+               3,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               3,
+               {
+                  [ 30, 31, 32, 33, 34 ],
+                  [ -30, -29, -28, -27, -26 ],
+                  [ 30, 31, 32, 33, 34 ],
+                  [ -30, -29, -28, -27, -26 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ],
+                     [ -30, -29, -28, -27, -26, -25, -24, -23, -22, -21 ],
+                     [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ],
+                     [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ],
+                     [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 ]
+                  }
+               }
+            }
+         },
+      (4): {
+            [ 40, 41, 42, 43 ],
+            [ -40, -39, -38, -37, -36, -35 ],
+            [ 40, 41, 42, 43,
+               41.1, 42.1, 43.1, 44.1 ],
+            {
+               4,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               4,
+               {
+                  [ 40, 41, 42, 43, 44 ],
+                  [ -40, -39, -38, -37, -36 ],
+                  [ 40, 41, 42, 43, 44 ],
+                  [ -40, -39, -38, -37, -36 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 ],
+                     [ -40, -39, -38, -37, -36, -35, -34, -33, -32, -31 ],
+                     [ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 ],
+                     [ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 ],
+                     [ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 ]
+                  }
+               }
+            }
+         },
+      (5): {
+            [ 50, 51, 52, 53 ],
+            [ -50, -49, -48, -47, -46, -45 ],
+            [ 50, 51, 52, 53,
+               51.1, 52.1, 53.1, 54.1 ],
+            {
+               5,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               5,
+               {
+                  [ 50, 51, 52, 53, 54 ],
+                  [ -50, -49, -48, -47, -46 ],
+                  [ 50, 51, 52, 53, 54 ],
+                  [ -50, -49, -48, -47, -46 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 ],
+                     [ -50, -49, -48, -47, -46, -45, -44, -43, -42, -41 ],
+                     [ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 ],
+                     [ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 ],
+                     [ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 ]
+                  }
+               }
+            }
+         },
+      (6): {
+            [ 60, 61, 62, 63 ],
+            [ -60, -59, -58, -57, -56, -55 ],
+            [ 60, 61, 62, 63,
+               61.1, 62.1, 63.1, 64.1 ],
+            {
+               6,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               6,
+               {
+                  [ 60, 61, 62, 63, 64 ],
+                  [ -60, -59, -58, -57, -56 ],
+                  [ 60, 61, 62, 63, 64 ],
+                  [ -60, -59, -58, -57, -56 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 ],
+                     [ -60, -59, -58, -57, -56, -55, -54, -53, -52, -51 ],
+                     [ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 ],
+                     [ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 ],
+                     [ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 ]
+                  }
+               }
+            }
+         },
+      (7): {
+            [ 70, 71, 72, 73 ],
+            [ -70, -69, -68, -67, -66, -65 ],
+            [ 70, 71, 72, 73,
+               71.1, 72.1, 73.1, 74.1 ],
+            {
+               7,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               7,
+               {
+                  [ 70, 71, 72, 73, 74 ],
+                  [ -70, -69, -68, -67, -66 ],
+                  [ 70, 71, 72, 73, 74 ],
+                  [ -70, -69, -68, -67, -66 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 ],
+                     [ -70, -69, -68, -67, -66, -65, -64, -63, -62, -61 ],
+                     [ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 ],
+                     [ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 ],
+                     [ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 ]
+                  }
+               }
+            }
+         },
+      (8): {
+            [ 80, 81, 82, 83 ],
+            [ -80, -79, -78, -77, -76, -75 ],
+            [ 80, 81, 82, 83,
+               81.1, 82.1, 83.1, 84.1 ],
+            {
+               8,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               8,
+               {
+                  [ 80, 81, 82, 83, 84 ],
+                  [ -80, -79, -78, -77, -76 ],
+                  [ 80, 81, 82, 83, 84 ],
+                  [ -80, -79, -78, -77, -76 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 ],
+                     [ -80, -79, -78, -77, -76, -75, -74, -73, -72, -71 ],
+                     [ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 ],
+                     [ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 ],
+                     [ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 ]
+                  }
+               }
+            }
+         },
+      (9): {
+            [ 90, 91, 92, 93 ],
+            [ -90, -89, -88, -87, -86, -85 ],
+            [ 90, 91, 92, 93,
+               91.1, 92.1, 93.1, 94.1 ],
+            {
+               9,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               9,
+               {
+                  [ 90, 91, 92, 93, 94 ],
+                  [ -90, -89, -88, -87, -86 ],
+                  [ 90, 91, 92, 93, 94 ],
+                  [ -90, -89, -88, -87, -86 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ],
+                     [ -90, -89, -88, -87, -86, -85, -84, -83, -82, -81 ],
+                     [ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ],
+                     [ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ],
+                     [ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ]
+                  }
+               }
+            }
+         },
+      (10): {
+            [ 100, 101, 102, 103 ],
+            [ -100, -99, -98, -97, -96, -95 ],
+            [ 100, 101, 102, 103,
+               101.1, 102.1, 103.1, 104.1 ],
+            {
+               10,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               10,
+               {
+                  [ 100, 101, 102, 103, 104 ],
+                  [ -100, -99, -98, -97, -96 ],
+                  [ 100, 101, 102, 103, 104 ],
+                  [ -100, -99, -98, -97, -96 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ],
+                     [ -100, -99, -98, -97, -96, -95, -94, -93, -92, -91 ],
+                     [ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ],
+                     [ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ],
+                     [ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ]
+                  }
+               }
+            }
+         },
+      (11): {
+            [ 110, 111, 112, 113 ],
+            [ -110, -109, -108, -107, -106, -105 ],
+            [ 110, 111, 112, 113,
+               111.1, 112.1, 113.1, 114.1 ],
+            {
+               11,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               11,
+               {
+                  [ 110, 111, 112, 113, 114 ],
+                  [ -110, -109, -108, -107, -106 ],
+                  [ 110, 111, 112, 113, 114 ],
+                  [ -110, -109, -108, -107, -106 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ],
+                     [ -110, -109, -108, -107, -106, -105, -104, -103, -102, -101 ],
+                     [ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ],
+                     [ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ],
+                     [ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 ]
+                  }
+               }
+            }
+         },
+      (12): {
+            [ 120, 121, 122, 123 ],
+            [ -120, -119, -118, -117, -116, -115 ],
+            [ 120, 121, 122, 123,
+               121.1, 122.1, 123.1, 124.1 ],
+            {
+               12,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               12,
+               {
+                  [ 120, 121, 122, 123, 124 ],
+                  [ -120, -119, -118, -117, -116 ],
+                  [ 120, 121, 122, 123, 124 ],
+                  [ -120, -119, -118, -117, -116 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129 ],
+                     [ -120, -119, -118, -117, -116, -115, -114, -113, -112, -111 ],
+                     [ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129 ],
+                     [ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129 ],
+                     [ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129 ]
+                  }
+               }
+            }
+         },
+      (13): {
+            [ 130, 131, 132, 133 ],
+            [ -130, -129, -128, -127, -126, -125 ],
+            [ 130, 131, 132, 133,
+               131.1, 132.1, 133.1, 134.1 ],
+            {
+               13,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               13,
+               {
+                  [ 130, 131, 132, 133, 134 ],
+                  [ -130, -129, -128, -127, -126 ],
+                  [ 130, 131, 132, 133, 134 ],
+                  [ -130, -129, -128, -127, -126 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 ],
+                     [ -130, -129, -128, -127, -126, -125, -124, -123, -122, -121 ],
+                     [ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 ],
+                     [ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 ],
+                     [ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 ]
+                  }
+               }
+            }
+         },
+      (14): {
+            [ 140, 141, 142, 143 ],
+            [ -140, -139, -138, -137, -136, -135 ],
+            [ 140, 141, 142, 143,
+               141.1, 142.1, 143.1, 144.1 ],
+            {
+               14,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               14,
+               {
+                  [ 140, 141, 142, 143, 144 ],
+                  [ -140, -139, -138, -137, -136 ],
+                  [ 140, 141, 142, 143, 144 ],
+                  [ -140, -139, -138, -137, -136 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 ],
+                     [ -140, -139, -138, -137, -136, -135, -134, -133, -132, -131 ],
+                     [ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 ],
+                     [ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 ],
+                     [ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 ]
+                  }
+               }
+            }
+         },
+      (15): {
+            [ 150, 151, 152, 153 ],
+            [ -150, -149, -148, -147, -146, -145 ],
+            [ 150, 151, 152, 153,
+               151.1, 152.1, 153.1, 154.1 ],
+            {
+               15,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               15,
+               {
+                  [ 150, 151, 152, 153, 154 ],
+                  [ -150, -149, -148, -147, -146 ],
+                  [ 150, 151, 152, 153, 154 ],
+                  [ -150, -149, -148, -147, -146 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 ],
+                     [ -150, -149, -148, -147, -146, -145, -144, -143, -142, -141 ],
+                     [ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 ],
+                     [ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 ],
+                     [ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 ]
+                  }
+               }
+            }
+         },
+      (16): {
+            [ 160, 161, 162, 163 ],
+            [ -160, -159, -158, -157, -156, -155 ],
+            [ 160, 161, 162, 163,
+               161.1, 162.1, 163.1, 164.1 ],
+            {
+               16,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               16,
+               {
+                  [ 160, 161, 162, 163, 164 ],
+                  [ -160, -159, -158, -157, -156 ],
+                  [ 160, 161, 162, 163, 164 ],
+                  [ -160, -159, -158, -157, -156 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169 ],
+                     [ -160, -159, -158, -157, -156, -155, -154, -153, -152, -151 ],
+                     [ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169 ],
+                     [ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169 ],
+                     [ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169 ]
+                  }
+               }
+            }
+         },
+      (17): {
+            [ 170, 171, 172, 173 ],
+            [ -170, -169, -168, -167, -166, -165 ],
+            [ 170, 171, 172, 173,
+               171.1, 172.1, 173.1, 174.1 ],
+            {
+               17,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               17,
+               {
+                  [ 170, 171, 172, 173, 174 ],
+                  [ -170, -169, -168, -167, -166 ],
+                  [ 170, 171, 172, 173, 174 ],
+                  [ -170, -169, -168, -167, -166 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179 ],
+                     [ -170, -169, -168, -167, -166, -165, -164, -163, -162, -161 ],
+                     [ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179 ],
+                     [ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179 ],
+                     [ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179 ]
+                  }
+               }
+            }
+         },
+      (18): {
+            [ 180, 181, 182, 183 ],
+            [ -180, -179, -178, -177, -176, -175 ],
+            [ 180, 181, 182, 183,
+               181.1, 182.1, 183.1, 184.1 ],
+            {
+               18,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               18,
+               {
+                  [ 180, 181, 182, 183, 184 ],
+                  [ -180, -179, -178, -177, -176 ],
+                  [ 180, 181, 182, 183, 184 ],
+                  [ -180, -179, -178, -177, -176 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189 ],
+                     [ -180, -179, -178, -177, -176, -175, -174, -173, -172, -171 ],
+                     [ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189 ],
+                     [ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189 ],
+                     [ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189 ]
+                  }
+               }
+            }
+         },
+      (19): {
+            [ 190, 191, 192, 193 ],
+            [ -190, -189, -188, -187, -186, -185 ],
+            [ 190, 191, 192, 193,
+               191.1, 192.1, 193.1, 194.1 ],
+            {
+               19,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               19,
+               {
+                  [ 190, 191, 192, 193, 194 ],
+                  [ -190, -189, -188, -187, -186 ],
+                  [ 190, 191, 192, 193, 194 ],
+                  [ -190, -189, -188, -187, -186 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 ],
+                     [ -190, -189, -188, -187, -186, -185, -184, -183, -182, -181 ],
+                     [ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 ],
+                     [ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 ],
+                     [ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 ]
+                  }
+               }
+            }
+         },
+      (20): {
+            [ 200, 201, 202, 203 ],
+            [ -200, -199, -198, -197, -196, -195 ],
+            [ 200, 201, 202, 203,
+               201.1, 202.1, 203.1, 204.1 ],
+            {
+               20,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               20,
+               {
+                  [ 200, 201, 202, 203, 204 ],
+                  [ -200, -199, -198, -197, -196 ],
+                  [ 200, 201, 202, 203, 204 ],
+                  [ -200, -199, -198, -197, -196 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209 ],
+                     [ -200, -199, -198, -197, -196, -195, -194, -193, -192, -191 ],
+                     [ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209 ],
+                     [ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209 ],
+                     [ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209 ]
+                  }
+               }
+            }
+         },
+      (21): {
+            [ 210, 211, 212, 213 ],
+            [ -210, -209, -208, -207, -206, -205 ],
+            [ 210, 211, 212, 213,
+               211.1, 212.1, 213.1, 214.1 ],
+            {
+               21,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               21,
+               {
+                  [ 210, 211, 212, 213, 214 ],
+                  [ -210, -209, -208, -207, -206 ],
+                  [ 210, 211, 212, 213, 214 ],
+                  [ -210, -209, -208, -207, -206 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 ],
+                     [ -210, -209, -208, -207, -206, -205, -204, -203, -202, -201 ],
+                     [ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 ],
+                     [ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 ],
+                     [ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 ]
+                  }
+               }
+            }
+         },
+      (22): {
+            [ 220, 221, 222, 223 ],
+            [ -220, -219, -218, -217, -216, -215 ],
+            [ 220, 221, 222, 223,
+               221.1, 222.1, 223.1, 224.1 ],
+            {
+               22,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               22,
+               {
+                  [ 220, 221, 222, 223, 224 ],
+                  [ -220, -219, -218, -217, -216 ],
+                  [ 220, 221, 222, 223, 224 ],
+                  [ -220, -219, -218, -217, -216 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 ],
+                     [ -220, -219, -218, -217, -216, -215, -214, -213, -212, -211 ],
+                     [ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 ],
+                     [ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 ],
+                     [ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 ]
+                  }
+               }
+            }
+         },
+      (23): {
+            [ 230, 231, 232, 233 ],
+            [ -230, -229, -228, -227, -226, -225 ],
+            [ 230, 231, 232, 233,
+               231.1, 232.1, 233.1, 234.1 ],
+            {
+               23,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               23,
+               {
+                  [ 230, 231, 232, 233, 234 ],
+                  [ -230, -229, -228, -227, -226 ],
+                  [ 230, 231, 232, 233, 234 ],
+                  [ -230, -229, -228, -227, -226 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 ],
+                     [ -230, -229, -228, -227, -226, -225, -224, -223, -222, -221 ],
+                     [ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 ],
+                     [ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 ],
+                     [ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 ]
+                  }
+               }
+            }
+         },
+      (24): {
+            [ 240, 241, 242, 243 ],
+            [ -240, -239, -238, -237, -236, -235 ],
+            [ 240, 241, 242, 243,
+               241.1, 242.1, 243.1, 244.1 ],
+            {
+               24,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               24,
+               {
+                  [ 240, 241, 242, 243, 244 ],
+                  [ -240, -239, -238, -237, -236 ],
+                  [ 240, 241, 242, 243, 244 ],
+                  [ -240, -239, -238, -237, -236 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249 ],
+                     [ -240, -239, -238, -237, -236, -235, -234, -233, -232, -231 ],
+                     [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249 ],
+                     [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249 ],
+                     [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249 ]
+                  }
+               }
+            }
+         },
+      (25): {
+            [ 250, 251, 252, 253 ],
+            [ -250, -249, -248, -247, -246, -245 ],
+            [ 250, 251, 252, 253,
+               251.1, 252.1, 253.1, 254.1 ],
+            {
+               25,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               25,
+               {
+                  [ 250, 251, 252, 253, 254 ],
+                  [ -250, -249, -248, -247, -246 ],
+                  [ 250, 251, 252, 253, 254 ],
+                  [ -250, -249, -248, -247, -246 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259 ],
+                     [ -250, -249, -248, -247, -246, -245, -244, -243, -242, -241 ],
+                     [ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259 ],
+                     [ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259 ],
+                     [ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259 ]
+                  }
+               }
+            }
+         },
+      (26): {
+            [ 260, 261, 262, 263 ],
+            [ -260, -259, -258, -257, -256, -255 ],
+            [ 260, 261, 262, 263,
+               261.1, 262.1, 263.1, 264.1 ],
+            {
+               26,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               26,
+               {
+                  [ 260, 261, 262, 263, 264 ],
+                  [ -260, -259, -258, -257, -256 ],
+                  [ 260, 261, 262, 263, 264 ],
+                  [ -260, -259, -258, -257, -256 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 ],
+                     [ -260, -259, -258, -257, -256, -255, -254, -253, -252, -251 ],
+                     [ 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 ],
+                     [ 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 ],
+                     [ 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 ]
+                  }
+               }
+            }
+         },
+      (27): {
+            [ 270, 271, 272, 273 ],
+            [ -270, -269, -268, -267, -266, -265 ],
+            [ 270, 271, 272, 273,
+               271.1, 272.1, 273.1, 274.1 ],
+            {
+               27,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               27,
+               {
+                  [ 270, 271, 272, 273, 274 ],
+                  [ -270, -269, -268, -267, -266 ],
+                  [ 270, 271, 272, 273, 274 ],
+                  [ -270, -269, -268, -267, -266 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 ],
+                     [ -270, -269, -268, -267, -266, -265, -264, -263, -262, -261 ],
+                     [ 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 ],
+                     [ 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 ],
+                     [ 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 ]
+                  }
+               }
+            }
+         },
+      (28): {
+            [ 280, 281, 282, 283 ],
+            [ -280, -279, -278, -277, -276, -275 ],
+            [ 280, 281, 282, 283,
+               281.1, 282.1, 283.1, 284.1 ],
+            {
+               28,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               28,
+               {
+                  [ 280, 281, 282, 283, 284 ],
+                  [ -280, -279, -278, -277, -276 ],
+                  [ 280, 281, 282, 283, 284 ],
+                  [ -280, -279, -278, -277, -276 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289 ],
+                     [ -280, -279, -278, -277, -276, -275, -274, -273, -272, -271 ],
+                     [ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289 ],
+                     [ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289 ],
+                     [ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289 ]
+                  }
+               }
+            }
+         },
+      (29): {
+            [ 290, 291, 292, 293 ],
+            [ -290, -289, -288, -287, -286, -285 ],
+            [ 290, 291, 292, 293,
+               291.1, 292.1, 293.1, 294.1 ],
+            {
+               29,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               29,
+               {
+                  [ 290, 291, 292, 293, 294 ],
+                  [ -290, -289, -288, -287, -286 ],
+                  [ 290, 291, 292, 293, 294 ],
+                  [ -290, -289, -288, -287, -286 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299 ],
+                     [ -290, -289, -288, -287, -286, -285, -284, -283, -282, -281 ],
+                     [ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299 ],
+                     [ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299 ],
+                     [ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299 ]
+                  }
+               }
+            }
+         },
+      (30): {
+            [ 300, 301, 302, 303 ],
+            [ -300, -299, -298, -297, -296, -295 ],
+            [ 300, 301, 302, 303,
+               301.1, 302.1, 303.1, 304.1 ],
+            {
+               30,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               30,
+               {
+                  [ 300, 301, 302, 303, 304 ],
+                  [ -300, -299, -298, -297, -296 ],
+                  [ 300, 301, 302, 303, 304 ],
+                  [ -300, -299, -298, -297, -296 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309 ],
+                     [ -300, -299, -298, -297, -296, -295, -294, -293, -292, -291 ],
+                     [ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309 ],
+                     [ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309 ],
+                     [ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309 ]
+                  }
+               }
+            }
+         },
+      (31): {
+            [ 310, 311, 312, 313 ],
+            [ -310, -309, -308, -307, -306, -305 ],
+            [ 310, 311, 312, 313,
+               311.1, 312.1, 313.1, 314.1 ],
+            {
+               31,
+               [ "This is a test string." ],
+               [ "String test", "String test", "String test", "String test" ]
+            },
+            {
+               31,
+               {
+                  [ 310, 311, 312, 313, 314 ],
+                  [ -310, -309, -308, -307, -306 ],
+                  [ 310, 311, 312, 313, 314 ],
+                  [ -310, -309, -308, -307, -306 ]
+               },
+               {
+                  [ "1234567890" ],
+                  [ "STRING ARRAY", "STRING ARRAY", "STRING ARRAY", "STRING ARRAY" ],
+                  {
+                     [ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 ],
+                     [ -310, -309, -308, -307, -306, -305, -304, -303, -302, -301 ],
+                     [ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 ],
+                     [ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 ],
+                     [ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 ]
+                  }
+               }
+            }
+         }
+      }
+   }
+}
+}
diff --git a/tools/testfiles/tcompound_complex2.h5 b/tools/testfiles/tcompound_complex2.h5
new file mode 100644
index 0000000..eee6073
Binary files /dev/null and b/tools/testfiles/tcompound_complex2.h5 differ
diff --git a/tools/testfiles/tdatareg.h5 b/tools/testfiles/tdatareg.h5
index 631d6b0..62a889f 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 ae19cf4..71dcb91 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 f3e555b..5e17cfd 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
deleted file mode 100644
index 65d9f44..0000000
--- a/tools/testfiles/tdset_idx.ddl
+++ /dev/null
@@ -1,61 +0,0 @@
-#############################
-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
index 314de9b..b31d5c3 100644
Binary files a/tools/testfiles/tdset_idx.h5 and b/tools/testfiles/tdset_idx.h5 differ
diff --git a/tools/testfiles/tempty.h5 b/tools/testfiles/tempty.h5
index f6d6b7a..d7d903f 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 5521fc4..b1300d8 100644
Binary files a/tools/testfiles/tenum.h5 and b/tools/testfiles/tenum.h5 differ
diff --git a/tools/testfiles/textlinksrc-nodangle-1.ls b/tools/testfiles/textlinksrc-nodangle-1.ls
index 9c19957..6d1da9e 100644
--- a/tools/testfiles/textlinksrc-nodangle-1.ls
+++ b/tools/testfiles/textlinksrc-nodangle-1.ls
@@ -1,5 +1,3 @@
-Error: --no-dangling-links must be used along with --follow-symlinks option!
-
 usage: h5ls [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]
   OPTIONS
    -h, -?, --help  Print a usage message and exit
@@ -58,3 +56,5 @@ usage: h5ls [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]
                       Replaced by --follow-symlinks.
    -e, --errors       Show all HDF5 error reporting
                       Replaced by --enable-error-stack.
+Error: --no-dangling-links must be used along with --follow-symlinks option!
+
diff --git a/tools/testfiles/tfamily00000.h5 b/tools/testfiles/tfamily00000.h5
index 70f6dcf..a130bfd 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 1514e28..1df0779 100644
Binary files a/tools/testfiles/tfcontents2.h5 and b/tools/testfiles/tfcontents2.h5 differ
diff --git a/tools/testfiles/tfvalues.h5 b/tools/testfiles/tfvalues.h5
index c238f44..a6af958 100644
Binary files a/tools/testfiles/tfvalues.h5 and b/tools/testfiles/tfvalues.h5 differ
diff --git a/tools/testfiles/tgroup-1.ls b/tools/testfiles/tgroup-1.ls
index 893c9ce..069d43e 100644
--- a/tools/testfiles/tgroup-1.ls
+++ b/tools/testfiles/tgroup-1.ls
@@ -1,5 +1,3 @@
-Error: 'recursive' option not compatible with 'group info' option!
-
 usage: h5ls [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]
   OPTIONS
    -h, -?, --help  Print a usage message and exit
@@ -58,3 +56,5 @@ usage: h5ls [OPTIONS] file[/OBJECT] [file[/[OBJECT]...]
                       Replaced by --follow-symlinks.
    -e, --errors       Show all HDF5 error reporting
                       Replaced by --enable-error-stack.
+Error: 'recursive' option not compatible with 'group info' option!
+
diff --git a/tools/testfiles/tgroup.h5 b/tools/testfiles/tgroup.h5
index 7c5cd63..565fb67 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 0ad92d1..6e0e7e1 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 dc2c0db..a730aa3 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 9e26283..707d7b6 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 6c2cab4..f54e5f5 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 e54f91c..d7a2f47 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 60d7ed2..995bfab 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 bc2fafb..3feae49 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 82f6316..27ab521 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 9b49159..42d0fc3 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 1d2795e..fabd154 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 e3dafe0..6b13375 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 fd9e862..eb8d6cc 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 514eb8d..0201efd 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 2912310..b777ee3 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 1e537f1..8e0a89d 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 d405061..b5dac5d 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 ecf3827..ef42ff3 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 669f4b7..d56b594 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 e3f0d6b..641513c 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 766a840..6c7638b 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 3a9899a..73b4be5 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 75237ba..c84c5b6 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 ab80d8f..753b62d 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 d431c70..a6eef73 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 ae6a012..af5384f 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 b7d4802..d3b1588 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 727dec5..9f9112f 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 a477ee5..aa17960 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 914a464..667fe78 100644
Binary files a/tools/testfiles/tstring.h5 and b/tools/testfiles/tstring.h5 differ
diff --git a/tools/testfiles/tudfilter.ddl b/tools/testfiles/tudfilter.ddl
new file mode 100644
index 0000000..b2aa7e6
--- /dev/null
+++ b/tools/testfiles/tudfilter.ddl
@@ -0,0 +1,30 @@
+HDF5 "tudfilter.h5" {
+GROUP "/" {
+   DATASET "dynlibud" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 20, 10 ) / ( 20, 10 ) }
+      DATA {
+      (0,0): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+      (1,0): 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+      (2,0): 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+      (3,0): 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+      (4,0): 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+      (5,0): 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+      (6,0): 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+      (7,0): 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+      (8,0): 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+      (9,0): 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+      (10,0): 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+      (11,0): 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+      (12,0): 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+      (13,0): 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+      (14,0): 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+      (15,0): 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+      (16,0): 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+      (17,0): 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+      (18,0): 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+      (19,0): 190, 191, 192, 193, 194, 195, 196, 197, 198, 199
+      }
+   }
+}
+}
diff --git a/tools/testfiles/tudfilter.h5 b/tools/testfiles/tudfilter.h5
new file mode 100644
index 0000000..081b000
Binary files /dev/null and b/tools/testfiles/tudfilter.h5 differ
diff --git a/tools/testfiles/tudfilter.ls b/tools/testfiles/tudfilter.ls
new file mode 100644
index 0000000..1882888
--- /dev/null
+++ b/tools/testfiles/tudfilter.ls
@@ -0,0 +1,16 @@
+dynlibud                 Dataset {20, 10}
+    Data:
+        (0,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+        (1,9) 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+        (3,5) 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+        (5,1) 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+        (6,7) 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+        (8,3) 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
+        (9,9) 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+        (11,2) 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+        (12,5) 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,
+        (13,8) 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
+        (15,1) 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
+        (16,4) 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
+        (17,7) 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+        (19,0) 190, 191, 192, 193, 194, 195, 196, 197, 198, 199
diff --git a/tools/testfiles/tvldtypes1.h5 b/tools/testfiles/tvldtypes1.h5
index 423dae8..b5b2bd7 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 86ba20d..65bf63f 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 66fd1d2..dd4aca7 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 016ad55..70dc73e 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 71b924f..776c020 100644
Binary files a/tools/testfiles/tvldtypes5.h5 and b/tools/testfiles/tvldtypes5.h5 differ
diff --git a/tools/testfiles/tvlenstr_array.ddl b/tools/testfiles/tvlenstr_array.ddl
new file mode 100644
index 0000000..87efbb6
--- /dev/null
+++ b/tools/testfiles/tvlenstr_array.ddl
@@ -0,0 +1,48 @@
+HDF5 "tvlenstr_array.h5" {
+GROUP "/" {
+   DATASET "CompoundArrayOfVlenStr" {
+      DATATYPE  H5T_COMPOUND {
+         H5T_ARRAY { [3] H5T_STRING {
+            STRSIZE H5T_VARIABLE;
+            STRPAD H5T_STR_NULLTERM;
+            CSET H5T_CSET_ASCII;
+            CTYPE H5T_C_S1;
+         } } "vlen_str_array";
+      }
+      DATASPACE  SIMPLE { ( 5 ) / ( 5 ) }
+      DATA {
+      (0): {
+            [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+         },
+      (1): {
+            [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+         },
+      (2): {
+            [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+         },
+      (3): {
+            [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+         },
+      (4): {
+            [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+         }
+      }
+   }
+   DATASET "ScalarArrayOfVlenStr" {
+      DATATYPE  H5T_ARRAY { [3] H5T_STRING {
+         STRSIZE H5T_VARIABLE;
+         STRPAD H5T_STR_NULLTERM;
+         CSET H5T_CSET_ASCII;
+         CTYPE H5T_C_S1;
+      } }
+      DATASPACE  SIMPLE { ( 5 ) / ( 5 ) }
+      DATA {
+      (0): [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ],
+      (1): [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ],
+      (2): [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ],
+      (3): [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ],
+      (4): [ "This is a variable-length test string.", "This test string is also variable-length.", "A final test of variable-length strings. This string is longer than the others." ]
+      }
+   }
+}
+}
diff --git a/tools/testfiles/tvlenstr_array.h5 b/tools/testfiles/tvlenstr_array.h5
new file mode 100644
index 0000000..4277f20
Binary files /dev/null and b/tools/testfiles/tvlenstr_array.h5 differ
diff --git a/tools/testfiles/tvms.h5 b/tools/testfiles/tvms.h5
index d3b0b7c..9c243ff 100644
Binary files a/tools/testfiles/tvms.h5 and b/tools/testfiles/tvms.h5 differ

-- 
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